From 8cf30a65fb9e02ed2ad20f53300b2978ad853a1a Mon Sep 17 00:00:00 2001 From: Emmett Gaines Date: Mon, 18 Dec 2017 22:24:48 -0500 Subject: [PATCH 01/48] dock() re-organization --- code/__DEFINES/shuttles.dm | 6 + code/controllers/subsystem/shuttle.dm | 4 +- code/modules/admin/fun_balloon.dm | 2 +- code/modules/events/pirates.dm | 2 +- code/modules/shuttle/arrivals.dm | 2 +- code/modules/shuttle/assault_pod.dm | 2 +- code/modules/shuttle/docking.dm | 230 ++++++++++++++++++++++++++ code/modules/shuttle/elevator.dm | 2 +- code/modules/shuttle/emergency.dm | 2 +- code/modules/shuttle/manipulator.dm | 2 +- code/modules/shuttle/shuttle.dm | 37 +++-- code/modules/shuttle/supply.dm | 2 +- tgstation.dme | 1 + 13 files changed, 266 insertions(+), 28 deletions(-) create mode 100644 code/modules/shuttle/docking.dm diff --git a/code/__DEFINES/shuttles.dm b/code/__DEFINES/shuttles.dm index b961c9bd44..b1a9e9e28d 100644 --- a/code/__DEFINES/shuttles.dm +++ b/code/__DEFINES/shuttles.dm @@ -75,3 +75,9 @@ #define SHUTTLE_DOCKER_LANDING_CLEAR 1 #define SHUTTLE_DOCKER_BLOCKED_BY_HIDDEN_PORT 2 #define SHUTTLE_DOCKER_BLOCKED 3 + +//Shuttle defaults +#define SHUTTLE_DEFAULT_TURF_TYPE /turf/open/space +#define SHUTTLE_DEFAULT_BASETURF_TYPE /turf/open/space +#define SHUTTLE_DEFAULT_SHUTTLE_AREA_TYPE /area/shuttle +#define SHUTTLE_DEFAULT_UNDERLYING_AREA /area/space \ No newline at end of file diff --git a/code/controllers/subsystem/shuttle.dm b/code/controllers/subsystem/shuttle.dm index 35208d4137..e385e48a10 100644 --- a/code/controllers/subsystem/shuttle.dm +++ b/code/controllers/subsystem/shuttle.dm @@ -400,7 +400,7 @@ SUBSYSTEM_DEF(shuttle) if(M.request(getDock(destination))) return 2 else - if(M.dock(getDock(destination)) != DOCKING_SUCCESS) + if(M.initiate_docking(getDock(destination)) != DOCKING_SUCCESS) return 2 return 0 //dock successful @@ -415,7 +415,7 @@ SUBSYSTEM_DEF(shuttle) if(M.request(D)) return 2 else - if(M.dock(D) != DOCKING_SUCCESS) + if(M.initiate_docking(D) != DOCKING_SUCCESS) return 2 return 0 //dock successful diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index 480ba20b4d..11efc82873 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -110,7 +110,7 @@ anchored = TRUE /obj/effect/shuttle_build/New() - SSshuttle.emergency.dock(SSshuttle.getDock("emergency_home")) + SSshuttle.emergency.initiate_docking(SSshuttle.getDock("emergency_home")) qdel(src) //Arena diff --git a/code/modules/events/pirates.dm b/code/modules/events/pirates.dm index dd7d10f896..56b40ab57d 100644 --- a/code/modules/events/pirates.dm +++ b/code/modules/events/pirates.dm @@ -206,7 +206,7 @@ if(engines_cooling) return "[.] - Engines cooling." -/obj/docking_port/mobile/pirate/dock(obj/docking_port/stationary/new_dock, movement_direction, force=FALSE) +/obj/docking_port/mobile/pirate/initiate_docking(obj/docking_port/stationary/new_dock, movement_direction, force=FALSE) . = ..() if(. == DOCKING_SUCCESS && new_dock.z != ZLEVEL_TRANSIT) engines_cooling = TRUE diff --git a/code/modules/shuttle/arrivals.dm b/code/modules/shuttle/arrivals.dm index dd5a60ace7..c0b33cc492 100644 --- a/code/modules/shuttle/arrivals.dm +++ b/code/modules/shuttle/arrivals.dm @@ -137,7 +137,7 @@ hyperspace_sound(HYPERSPACE_LAUNCH, areas) //for the new guy setTimer(dockTime) -/obj/docking_port/mobile/arrivals/dock(obj/docking_port/stationary/S1, force=FALSE) +/obj/docking_port/mobile/arrivals/initiate_docking(obj/docking_port/stationary/S1, force=FALSE) var/docked = S1 == assigned_transit sound_played = FALSE if(docked) //about to launch diff --git a/code/modules/shuttle/assault_pod.dm b/code/modules/shuttle/assault_pod.dm index 4b55a5b155..57c6e303f7 100644 --- a/code/modules/shuttle/assault_pod.dm +++ b/code/modules/shuttle/assault_pod.dm @@ -10,7 +10,7 @@ return ..() -/obj/docking_port/mobile/assault_pod/dock(obj/docking_port/stationary/S1) +/obj/docking_port/mobile/assault_pod/initiate_docking(obj/docking_port/stationary/S1) . = ..() if(!istype(S1, /obj/docking_port/stationary/transit)) playsound(get_turf(src.loc), 'sound/effects/explosion1.ogg',50,1) diff --git a/code/modules/shuttle/docking.dm b/code/modules/shuttle/docking.dm new file mode 100644 index 0000000000..eda3bf9051 --- /dev/null +++ b/code/modules/shuttle/docking.dm @@ -0,0 +1,230 @@ +//this is the main proc. It instantly moves our mobile port to stationary port new_dock +/obj/docking_port/mobile/proc/initiate_docking(obj/docking_port/stationary/new_dock, movement_direction, force=FALSE) + // Crashing this ship with NO SURVIVORS + + if(new_dock.get_docked() == src) + remove_ripples() + return DOCKING_SUCCESS + + if(!force) + if(!check_dock(new_dock)) + return DOCKING_BLOCKED + if(!canMove()) + return DOCKING_IMMOBILIZED + + var/obj/docking_port/stationary/old_dock = get_docked() + + // The turf that gets placed under where the shuttle moved from + var/underlying_turf_type = SHUTTLE_DEFAULT_TURF_TYPE + + // The baseturf that the gets assigned to the turf_type above + var/underlying_baseturf_type = SHUTTLE_DEFAULT_BASETURF_TYPE + + // The area that gets placed under where the shuttle moved from + var/underlying_area_type = SHUTTLE_DEFAULT_UNDERLYING_AREA + + // The baseturf cache is a typecache of what counts as a baseturf to be left behind + var/list/baseturf_cache + + if(old_dock) //Dock overwrites + underlying_turf_type = old_dock.turf_type + underlying_baseturf_type = old_dock.baseturf_type + underlying_area_type = old_dock.area_type + baseturf_cache = old_dock.baseturf_cache + else + baseturf_cache = typecacheof(underlying_baseturf_type) + + /************************************************************************************************************** + Both lists are associative with a turf:bitflag structure. (new_turfs bitflag space unused currently) + The bitflag contains the data for what inhabitants of that coordinate should be moved to the new location + The bitflags can be found in __DEFINES/shuttles.dm + */ + var/list/old_turfs = return_ordered_turfs(x, y, z, dir) + var/list/new_turfs = return_ordered_turfs(new_dock.x, new_dock.y, new_dock.z, new_dock.dir) + CHECK_TICK + /**************************************************************************************************************/ + + // The underlying old area is the area assumed to be under the shuttle's starting location + // If it no longer/has never existed it will be created + var/area/underlying_old_area = locate(underlying_area_type) in GLOB.sortedAreas + if(!underlying_old_area) + underlying_old_area = new underlying_area_type(null) + + var/rotation = 0 + if(new_dock.dir != dir) //Even when the dirs are the same rotation is coming out as not 0 for some reason + rotation = dir2angle(new_dock.dir)-dir2angle(dir) + if ((rotation % 90) != 0) + rotation += (rotation % 90) //diagonal rotations not allowed, round up + rotation = SIMPLIFY_DEGREES(rotation) + + if(!movement_direction) + movement_direction = turn(preferred_direction, 180) + + var/list/moved_atoms = list() //Everything not a turf that gets moved in the shuttle + var/list/areas_to_move = list() //unique assoc list of areas on turfs being moved + + remove_ripples() + + . = preflight_check(old_turfs, new_turfs, areas_to_move, rotation, underlying_turf_type, baseturf_cache) + if(.) + return + + /*******************************************Hiding turfs if necessary*******************************************/ + // TODO: Move this somewhere sane + var/list/new_hidden_turfs + if(hidden) + new_hidden_turfs = list() + for(var/i in 1 to old_turfs.len) + CHECK_TICK + var/turf/oldT = old_turfs[i] + if(old_turfs[oldT] & MOVE_TURF) + new_hidden_turfs += new_turfs[i] + SSshuttle.update_hidden_docking_ports(null, new_hidden_turfs) + /***************************************************************************************************************/ + + if(!force) + if(!check_dock(new_dock)) + return DOCKING_BLOCKED + if(!canMove()) + return DOCKING_IMMOBILIZED + + CHECK_TICK + + takeoff(old_turfs, new_turfs, moved_atoms, rotation, movement_direction, old_dock, underlying_old_area) + + CHECK_TICK + + cleanup_runway(new_dock, old_turfs, new_turfs, areas_to_move, moved_atoms, rotation, movement_direction, underlying_old_area, underlying_turf_type, underlying_baseturf_type) + + CHECK_TICK + + /*******************************************Unhiding turfs if necessary******************************************/ + if(new_hidden_turfs) + SSshuttle.update_hidden_docking_ports(hidden_turfs, null) + hidden_turfs = new_hidden_turfs + /****************************************************************************************************************/ + + check_poddoors() + new_dock.last_dock_time = world.time + setDir(new_dock.dir) + + return DOCKING_SUCCESS + +/obj/docking_port/mobile/proc/preflight_check( + list/old_turfs, + list/new_turfs, + list/areas_to_move, + rotation, + underlying_turf_type, + baseturf_cache, + ) + + for(var/i in 1 to old_turfs.len) + CHECK_TICK + var/turf/oldT = old_turfs[i] + var/turf/newT = new_turfs[i] + if(!newT) + return DOCKING_NULL_DESTINATION + if(!oldT) + return DOCKING_NULL_SOURCE + + var/area/old_area = oldT.loc + var/move_mode = old_area.beforeShuttleMove(shuttle_areas) //areas + + var/list/old_contents = oldT.contents + for(var/k in 1 to old_contents.len) + CHECK_TICK + var/atom/movable/moving_atom = old_contents[k] + if(moving_atom.loc != oldT) //fix for multi-tile objects + continue + move_mode = moving_atom.beforeShuttleMove(newT, rotation, move_mode) //atoms + + move_mode = oldT.fromShuttleMove(newT, underlying_turf_type, baseturf_cache, move_mode) //turfs + move_mode = newT.toShuttleMove(oldT, move_mode , src) //turfs + + if(move_mode & MOVE_AREA) + areas_to_move[old_area] = TRUE + + old_turfs[oldT] = move_mode + +/obj/docking_port/mobile/proc/takeoff( + list/old_turfs, + list/new_turfs, + list/moved_atoms, + rotation, + movement_direction, + old_dock, + area/underlying_old_area, + ) + + for(var/i in 1 to old_turfs.len) + var/turf/oldT = old_turfs[i] + var/turf/newT = new_turfs[i] + var/move_mode = old_turfs[oldT] + if(move_mode & MOVE_CONTENTS) + for(var/k in oldT) + var/atom/movable/moving_atom = k + if(moving_atom.loc != oldT) //fix for multi-tile objects + continue + moving_atom.onShuttleMove(newT, oldT, movement_force, movement_direction, old_dock, src) //atoms + moved_atoms[moving_atom] = oldT + + if(move_mode & MOVE_TURF) + oldT.onShuttleMove(newT, movement_force, movement_direction) //turfs + + if(move_mode & MOVE_AREA) + var/area/shuttle_area = oldT.loc + shuttle_area.onShuttleMove(oldT, newT, underlying_old_area) //areas + +/obj/docking_port/mobile/proc/cleanup_runway( + obj/docking_port/stationary/new_dock, + list/old_turfs, + list/new_turfs, + list/areas_to_move, + list/moved_atoms, + rotation, + movement_direction, + area/underlying_old_area, + underlying_turf_type, + underlying_baseturf_type, + ) + + underlying_old_area.afterShuttleMove() + + // Parallax handling + // This needs to be done before the atom after move + var/new_parallax_dir = FALSE + if(istype(new_dock, /obj/docking_port/stationary/transit)) + new_parallax_dir = preferred_direction + for(var/i in 1 to areas_to_move.len) + CHECK_TICK + var/area/internal_area = areas_to_move[i] + internal_area.afterShuttleMove(new_parallax_dir) //areas + + for(var/i in 1 to old_turfs.len) + CHECK_TICK + if(!(old_turfs[old_turfs[i]] & MOVE_TURF)) + continue + var/turf/oldT = old_turfs[i] + var/turf/newT = new_turfs[i] + newT.afterShuttleMove(oldT, underlying_turf_type, underlying_baseturf_type, rotation) //turfs + + for(var/i in 1 to moved_atoms.len) + CHECK_TICK + var/atom/movable/moved_object = moved_atoms[i] + if(QDELETED(moved_object)) + continue + var/turf/oldT = moved_atoms[moved_object] + moved_object.afterShuttleMove(oldT, movement_force, dir, preferred_direction, movement_direction, rotation)//atoms + + for(var/i in 1 to old_turfs.len) + CHECK_TICK + // Objects can block air so either turf or content changes means an air update is needed + if(!(old_turfs[old_turfs[i]] & MOVE_CONTENTS | MOVE_TURF)) + continue + var/turf/oldT = old_turfs[i] + var/turf/newT = new_turfs[i] + oldT.blocks_air = initial(oldT.blocks_air) + oldT.air_update_turf(TRUE) + newT.blocks_air = initial(newT.blocks_air) + newT.air_update_turf(TRUE) \ No newline at end of file diff --git a/code/modules/shuttle/elevator.dm b/code/modules/shuttle/elevator.dm index de0febf2bf..4584cd5958 100644 --- a/code/modules/shuttle/elevator.dm +++ b/code/modules/shuttle/elevator.dm @@ -7,4 +7,4 @@ movement_force = list("KNOCKDOWN" = 0, "THROW" = 0) /obj/docking_port/mobile/elevator/request(obj/docking_port/stationary/S) //No transit, no ignition, just a simple up/down platform - dock(S, TRUE) \ No newline at end of file + initiate_docking(S, TRUE) \ No newline at end of file diff --git a/code/modules/shuttle/emergency.dm b/code/modules/shuttle/emergency.dm index c4eb16305a..9c7bfee968 100644 --- a/code/modules/shuttle/emergency.dm +++ b/code/modules/shuttle/emergency.dm @@ -290,7 +290,7 @@ if(SHUTTLE_CALL) if(time_left <= 0) //move emergency shuttle to station - if(dock(SSshuttle.getDock("emergency_home")) != DOCKING_SUCCESS) + if(initiate_docking(SSshuttle.getDock("emergency_home")) != DOCKING_SUCCESS) setTimer(20) return mode = SHUTTLE_DOCKED diff --git a/code/modules/shuttle/manipulator.dm b/code/modules/shuttle/manipulator.dm index 5cbd8de9c7..721ee601f7 100644 --- a/code/modules/shuttle/manipulator.dm +++ b/code/modules/shuttle/manipulator.dm @@ -222,7 +222,7 @@ existing_shuttle.jumpToNullSpace() - preview_shuttle.dock(D) + preview_shuttle.initiate_docking(D) . = preview_shuttle // Shuttle state involves a mode and a timer based on world.time, so diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index a4303078a5..7a3b40c383 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -159,9 +159,9 @@ /obj/docking_port/stationary name = "dock" - turf_type = /turf/open/space - baseturf_type = /turf/open/space - area_type = /area/space + turf_type = SHUTTLE_DEFAULT_TURF_TYPE + baseturf_type = SHUTTLE_DEFAULT_BASETURF_TYPE + area_type = SHUTTLE_DEFAULT_UNDERLYING_AREA var/list/baseturf_cache @@ -203,7 +203,7 @@ for(var/i in 1 to assigned_turfs.len) var/turf/T = assigned_turfs[i] if(T.type == turf_type) - T.ChangeTurf(/turf/open/space,/turf/open/space) + T.ChangeTurf(SHUTTLE_DEFAULT_TURF_TYPE, SHUTTLE_DEFAULT_BASETURF_TYPE) T.flags_1 |= UNUSED_TRANSIT_TURF_1 /obj/docking_port/stationary/transit/Destroy(force=FALSE) @@ -224,9 +224,9 @@ name = "shuttle" icon_state = "pinonclose" - area_type = /area/shuttle + area_type = SHUTTLE_DEFAULT_SHUTTLE_AREA_TYPE - var/list/area/shuttle/shuttle_areas + var/list/shuttle_areas var/timer //used as a timer (if you want time left to complete move, use timeLeft proc) var/last_timer_length @@ -400,7 +400,7 @@ var/obj/docking_port/stationary/S0 = get_docked() var/obj/docking_port/stationary/S1 = assigned_transit if(S1) - if(dock(S1) != DOCKING_SUCCESS) + if(initiate_docking(S1) != DOCKING_SUCCESS) WARNING("shuttle \"[id]\" could not enter transit space. Docked at [S0 ? S0.id : "null"]. Transit dock [S1 ? S1.id : "null"].") else previous = S0 @@ -413,9 +413,9 @@ // Not in a fancy way, it just ceases. var/obj/docking_port/stationary/current_dock = get_docked() - var/turf_type = /turf/open/space - var/baseturf_type = /turf/open/space - var/underlying_area_type = /area/space + var/turf_type = SHUTTLE_DEFAULT_TURF_TYPE + var/baseturf_type = SHUTTLE_DEFAULT_BASETURF_TYPE + var/underlying_area_type = SHUTTLE_DEFAULT_UNDERLYING_AREA // If the shuttle is docked to a stationary port, restore its normal // "empty" area and turf if(current_dock) @@ -474,6 +474,7 @@ for(var/obj/machinery/door/poddoor/shuttledock/pod in GLOB.airlocks) pod.check() +<<<<<<< HEAD //this is the main proc. It instantly moves our mobile port to stationary port new_dock /obj/docking_port/mobile/proc/dock(obj/docking_port/stationary/new_dock, movement_direction, force=FALSE) // Crashing this ship with NO SURVIVORS @@ -665,6 +666,8 @@ return DOCKING_SUCCESS +======= +>>>>>>> ca603a6... a new file for dock and its new fractured existence (#33627) /obj/docking_port/mobile/proc/findRoundstartDock() return SSshuttle.getDock(roundstart_move) @@ -674,7 +677,7 @@ /obj/docking_port/mobile/proc/dock_id(id) var/port = SSshuttle.getDock(id) if(port) - . = dock(port) + . = initiate_docking(port) else . = null @@ -694,9 +697,9 @@ // then try again switch(mode) if(SHUTTLE_CALL) - var/error = dock(destination, preferred_direction) + var/error = initiate_docking(destination, preferred_direction) if(error && error & (DOCKING_NULL_DESTINATION | DOCKING_NULL_SOURCE)) - var/msg = "A mobile dock in transit exited dock() with an error. This is most likely a mapping problem: Error: [error], ([src]) ([previous])" + var/msg = "A mobile dock in transit exited initiate_docking() with an error. This is most likely a mapping problem: Error: [error], ([src]) ([previous])" WARNING(msg) message_admins(msg) mode = SHUTTLE_IDLE @@ -705,7 +708,7 @@ setTimer(20) return if(SHUTTLE_RECALL) - if(dock(previous) != DOCKING_SUCCESS) + if(initiate_docking(previous) != DOCKING_SUCCESS) setTimer(20) return if(SHUTTLE_IGNITING) @@ -933,10 +936,8 @@ /obj/docking_port/mobile/pod/on_emergency_dock() if(launch_status == ENDGAME_LAUNCHED) - dock(SSshuttle.getDock("[id]_away")) //Escape pods dock at centcom + initiate_docking(SSshuttle.getDock("[id]_away")) //Escape pods dock at centcom mode = SHUTTLE_ENDGAME /obj/docking_port/mobile/emergency/on_emergency_dock() - return - -#undef DOCKING_PORT_HIGHLIGHT + return \ No newline at end of file diff --git a/code/modules/shuttle/supply.dm b/code/modules/shuttle/supply.dm index 579397cc4b..c2d6de2651 100644 --- a/code/modules/shuttle/supply.dm +++ b/code/modules/shuttle/supply.dm @@ -64,7 +64,7 @@ GLOBAL_LIST_INIT(blacklisted_cargo_types, typecacheof(list( return 2 return ..() -/obj/docking_port/mobile/supply/dock() +/obj/docking_port/mobile/supply/initiate_docking() if(getDockedId() == "supply_away") // Buy when we leave home. buy() . = ..() // Fly/enter transit. diff --git a/tgstation.dme b/tgstation.dme index 737f7e8274..0be8f4f8b8 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -2288,6 +2288,7 @@ #include "code\modules\shuttle\arrivals.dm" #include "code\modules\shuttle\assault_pod.dm" #include "code\modules\shuttle\computer.dm" +#include "code\modules\shuttle\docking.dm" #include "code\modules\shuttle\elevator.dm" #include "code\modules\shuttle\emergency.dm" #include "code\modules\shuttle\ferry.dm" From 08b222400770da2655c0a908372218f8fea3e28f Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Mon, 25 Dec 2017 20:04:56 -0500 Subject: [PATCH 02/48] Adds random seed feedback (#33708) * Master now sets rand_seed * Blackbox now records Master.random_seed --- code/controllers/master.dm | 7 +++++++ code/controllers/subsystem/blackbox.dm | 1 + 2 files changed, 8 insertions(+) diff --git a/code/controllers/master.dm b/code/controllers/master.dm index b9950da7b9..92a94bf428 100644 --- a/code/controllers/master.dm +++ b/code/controllers/master.dm @@ -53,6 +53,8 @@ GLOBAL_REAL(Master, /datum/controller/master) = new var/static/restart_clear = 0 var/static/restart_timeout = 0 var/static/restart_count = 0 + + var/static/random_seed //current tick limit, assigned before running a subsystem. //used by CHECK_TICK as well so that the procs subsystems call can obey that SS's tick limits @@ -60,6 +62,11 @@ GLOBAL_REAL(Master, /datum/controller/master) = new /datum/controller/master/New() // Highlander-style: there can only be one! Kill off the old and replace it with the new. + + if(!random_seed) + random_seed = rand(1, 1e9) + rand_seed(random_seed) + var/list/_subsystems = list() subsystems = _subsystems if (Master != src) diff --git a/code/controllers/subsystem/blackbox.dm b/code/controllers/subsystem/blackbox.dm index e638de668e..ca407bb58c 100644 --- a/code/controllers/subsystem/blackbox.dm +++ b/code/controllers/subsystem/blackbox.dm @@ -16,6 +16,7 @@ SUBSYSTEM_DEF(blackbox) /datum/controller/subsystem/blackbox/Initialize() triggertime = world.time + record_feedback("amount", "random_seed", Master.random_seed) . = ..() //poll population From a1ec5538a6aa7dee07149700e172c40944d43f93 Mon Sep 17 00:00:00 2001 From: Emmett Gaines Date: Mon, 25 Dec 2017 20:11:40 -0500 Subject: [PATCH 04/48] Arena shuttle teleport fix (#33777) --- _maps/map_files/generic/CentCom.dmm | 22 +++++++++++----------- code/game/area/areas/shuttles.dm | 3 +++ code/modules/admin/fun_balloon.dm | 22 ++++++++++++++-------- 3 files changed, 28 insertions(+), 19 deletions(-) diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 27198fe072..804dbc554a 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -13769,11 +13769,11 @@ /area/tdome/tdomeadmin) "JV" = ( /turf/closed/wall/mineral/titanium, -/area/shuttle/escape) +/area/shuttle/escape/backup) "JW" = ( /obj/machinery/status_display, /turf/closed/wall/mineral/titanium, -/area/shuttle/escape) +/area/shuttle/escape/backup) "JX" = ( /obj/machinery/door/firedoor, /obj/effect/turf_decal/stripes/line{ @@ -13816,16 +13816,16 @@ /area/tdome/tdomeadmin) "Kd" = ( /turf/open/floor/mineral/titanium, -/area/shuttle/escape) +/area/shuttle/escape/backup) "Ke" = ( /turf/open/floor/mineral/plastitanium, -/area/shuttle/escape) +/area/shuttle/escape/backup) "Kf" = ( /obj/machinery/computer/emergency_shuttle{ dir = 8 }, /turf/open/floor/mineral/titanium, -/area/shuttle/escape) +/area/shuttle/escape/backup) "Kg" = ( /turf/closed/indestructible/fakedoor{ name = "Thunderdome Admin" @@ -13865,18 +13865,18 @@ }, /obj/docking_port/mobile/emergency/backup, /turf/open/floor/plating, -/area/shuttle/escape) +/area/shuttle/escape/backup) "Kl" = ( /obj/structure/chair/office/light{ dir = 4 }, /turf/open/floor/mineral/titanium, -/area/shuttle/escape) +/area/shuttle/escape/backup) "Km" = ( /obj/structure/table/wood, /obj/item/paper/fluff/stations/centcom/broken_evac, /turf/open/floor/mineral/titanium, -/area/shuttle/escape) +/area/shuttle/escape/backup) "Kn" = ( /obj/structure/bookcase/random, /turf/open/floor/plasteel/vault{ @@ -14012,7 +14012,7 @@ /obj/structure/table/wood, /obj/item/book/manual/random, /turf/open/floor/mineral/titanium, -/area/shuttle/escape) +/area/shuttle/escape/backup) "KA" = ( /obj/structure/flora/ausbushes/lavendergrass, /obj/structure/flora/ausbushes/sparsegrass, @@ -14044,13 +14044,13 @@ dir = 8 }, /turf/open/floor/mineral/titanium, -/area/shuttle/escape) +/area/shuttle/escape/backup) "KF" = ( /obj/machinery/light{ dir = 4 }, /turf/open/floor/mineral/titanium, -/area/shuttle/escape) +/area/shuttle/escape/backup) "KG" = ( /obj/structure/flora/ausbushes/lavendergrass, /obj/structure/flora/ausbushes/sparsegrass, diff --git a/code/game/area/areas/shuttles.dm b/code/game/area/areas/shuttles.dm index 8a29d1b2ac..2910fc4964 100644 --- a/code/game/area/areas/shuttles.dm +++ b/code/game/area/areas/shuttles.dm @@ -76,6 +76,9 @@ /area/shuttle/escape name = "Emergency Shuttle" +/area/shuttle/escape/backup + name = "Backup Emergency Shuttle" + /area/shuttle/escape/luxury name = "Luxurious Emergency Shuttle" noteleport = TRUE diff --git a/code/modules/admin/fun_balloon.dm b/code/modules/admin/fun_balloon.dm index 480ba20b4d..6c1c206cc9 100644 --- a/code/modules/admin/fun_balloon.dm +++ b/code/modules/admin/fun_balloon.dm @@ -117,19 +117,25 @@ /obj/effect/forcefield/arena_shuttle name = "portal" - var/list/warp_points = list() + var/list/warp_points +/obj/effect/forcefield/arena_shuttle/Initialize() + . = ..() + warp_points = get_area_turfs(/area/shuttle/escape) + for(var/thing in warp_points) + CHECK_TICK + var/turf/T = thing + if(istype(T.loc, /area/shuttle/escape/backup)) + warp_points -= T + continue + for(var/atom/movable/TAM in T) + if(TAM.density && TAM.anchored) + warp_points -= T + break /obj/effect/forcefield/arena_shuttle/CollidedWith(atom/movable/AM) if(!isliving(AM)) return - if(!warp_points.len) - warp_points = get_area_turfs(/area/shuttle/escape) - for(var/turf/T in warp_points) - for(var/atom/movable/TAM in T) - if(TAM.density && TAM.anchored) - warp_points -= T - break var/mob/living/L = AM if(L.pulling && istype(L.pulling, /obj/item/bodypart/head)) From 8465defbb0f55c00f4a05215bdae5081c2e501d7 Mon Sep 17 00:00:00 2001 From: Cruix Date: Mon, 25 Dec 2017 19:13:37 -0600 Subject: [PATCH 06/48] Modified the starting locations of advanced camera console eyes (#33759) * Modified the starting locations of advanced camera console eyes Made shuttle navigation computers no longer work on z levels they are not locked to * Advanced camera eyes do not start on the console if they use static and the console is in camera view but not on a usable z-level --- .../machinery/computer/camera_advanced.dm | 23 ++++++++++++++----- code/modules/shuttle/navigation_computer.dm | 5 +++- 2 files changed, 21 insertions(+), 7 deletions(-) diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 44d6d5abe4..e59bb1692e 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -83,12 +83,23 @@ if(!eyeobj.eye_initialized) var/camera_location - for(var/obj/machinery/camera/C in GLOB.cameranet.cameras) - if(!C.can_use() || z_lock.len && !(C.z in z_lock)) - continue - if(C.network & networks) - camera_location = get_turf(C) - break + var/turf/myturf = get_turf(src) + if(eyeobj.use_static) + if((!z_lock.len || (myturf.z in z_lock)) && GLOB.cameranet.checkTurfVis(myturf)) + camera_location = myturf + else + for(var/obj/machinery/camera/C in GLOB.cameranet.cameras) + if(!C.can_use() || z_lock.len && !(C.z in z_lock)) + continue + var/list/network_overlap = networks & C.network + if(network_overlap.len) + camera_location = get_turf(C) + break + else + camera_location = myturf + if(z_lock.len && !(myturf.z in z_lock)) + camera_location = locate(round(world.maxx/2), round(world.maxy/2), z_lock[1]) + if(camera_location) eyeobj.eye_initialized = TRUE give_eye_control(L) diff --git a/code/modules/shuttle/navigation_computer.dm b/code/modules/shuttle/navigation_computer.dm index de1b0022f6..739e057177 100644 --- a/code/modules/shuttle/navigation_computer.dm +++ b/code/modules/shuttle/navigation_computer.dm @@ -172,7 +172,10 @@ var/mob/camera/aiEye/remote/shuttle_docker/the_eye = eyeobj var/turf/eyeturf = get_turf(the_eye) if(!eyeturf) - return + return SHUTTLE_DOCKER_BLOCKED + if(z_lock.len && !(eyeturf.z in z_lock)) + return SHUTTLE_DOCKER_BLOCKED + . = SHUTTLE_DOCKER_LANDING_CLEAR var/list/bounds = shuttle_port.return_coords(the_eye.x - x_offset, the_eye.y - y_offset, the_eye.dir) var/list/overlappers = SSshuttle.get_dock_overlap(bounds[1], bounds[2], bounds[3], bounds[4], the_eye.z) From 95642e631f8c0a152fb11bbcc4c49164c87c5985 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Tue, 26 Dec 2017 05:28:55 -0600 Subject: [PATCH 08/48] Update shuttle.dm --- code/modules/shuttle/shuttle.dm | 196 +------------------------------- 1 file changed, 1 insertion(+), 195 deletions(-) diff --git a/code/modules/shuttle/shuttle.dm b/code/modules/shuttle/shuttle.dm index 7a3b40c383..e97bdc41c6 100644 --- a/code/modules/shuttle/shuttle.dm +++ b/code/modules/shuttle/shuttle.dm @@ -474,200 +474,6 @@ for(var/obj/machinery/door/poddoor/shuttledock/pod in GLOB.airlocks) pod.check() -<<<<<<< HEAD -//this is the main proc. It instantly moves our mobile port to stationary port new_dock -/obj/docking_port/mobile/proc/dock(obj/docking_port/stationary/new_dock, movement_direction, force=FALSE) - // Crashing this ship with NO SURVIVORS - - if(new_dock.get_docked() == src) - remove_ripples() - return DOCKING_SUCCESS - - if(!force) - if(!check_dock(new_dock)) - return DOCKING_BLOCKED - if(!canMove()) - return DOCKING_IMMOBILIZED - - var/obj/docking_port/stationary/old_dock = get_docked() - - // The turf that gets placed under where the shuttle moved from - var/underlying_turf_type = /turf/open/space - - // The baseturf that the gets assigned to the turf_type above - var/underlying_baseturf_type = /turf/open/space - - // The area that gets placed under where the shuttle moved from - var/underlying_area_type = /area/space - - // The baseturf cache is a typecache of what counts as a baseturf to be left behind - var/list/baseturf_cache - if(old_dock) //Dock overwrites - if(old_dock.turf_type) - underlying_turf_type = old_dock.turf_type - if(old_dock.baseturf_type) - underlying_baseturf_type = old_dock.baseturf_type - if(old_dock.area_type) - underlying_area_type = old_dock.area_type - if(old_dock.baseturf_cache) - baseturf_cache = old_dock.baseturf_cache - if(!baseturf_cache) - baseturf_cache = typecacheof(underlying_baseturf_type) - - /************************************************************************************************************** - old_turfs is an associative list with a turf:bitflag structure - new_turfs is a standard list composed of turf instances - The bitflag contains the data for what inhabitants of that coordinate should be moved to the new location - The bitflags can be found in __DEFINES/shuttles.dm - */ - var/list/old_turfs = return_ordered_turfs(x, y, z, dir) - var/list/new_turfs = return_ordered_turfs(new_dock.x, new_dock.y, new_dock.z, new_dock.dir) - /**************************************************************************************************************/ - - // The underlying old area is the area assumed to be under the shuttle's starting location - // If it no longer/has never existed it will be created - var/area/underlying_old_area = locate(underlying_area_type) in GLOB.sortedAreas - if(!underlying_old_area) - underlying_old_area = new underlying_area_type(null) - - var/rotation = 0 - if(new_dock.dir != dir) //Even when the dirs are the same rotation is coming out as not 0 for some reason - rotation = dir2angle(new_dock.dir)-dir2angle(dir) - if ((rotation % 90) != 0) - rotation += (rotation % 90) //diagonal rotations not allowed, round up - rotation = SimplifyDegrees(rotation) - - if(!movement_direction) - movement_direction = turn(preferred_direction, 180) - - remove_ripples() - - var/list/moved_atoms = list() //Everything not a turf that gets moved in the shuttle - var/list/areas_to_move = list() //unique assoc list of areas on turfs being moved - - CHECK_TICK - - /****************************************All beforeShuttleMove procs*****************************************/ - - for(var/i in 1 to old_turfs.len) - CHECK_TICK - var/turf/oldT = old_turfs[i] - var/turf/newT = new_turfs[i] - if(!newT) - return DOCKING_NULL_DESTINATION - if(!oldT) - return DOCKING_NULL_SOURCE - - var/area/old_area = oldT.loc - var/move_mode = old_area.beforeShuttleMove(shuttle_areas) //areas - - var/list/old_contents = oldT.contents - for(var/k in 1 to old_contents.len) - CHECK_TICK - var/atom/movable/moving_atom = old_contents[k] - if(moving_atom.loc != oldT) //fix for multi-tile objects - continue - move_mode = moving_atom.beforeShuttleMove(newT, rotation, move_mode) //atoms - - move_mode = oldT.fromShuttleMove(newT, underlying_turf_type, baseturf_cache, move_mode) //turfs - move_mode = newT.toShuttleMove(oldT, move_mode , src) //turfs - - if(move_mode & MOVE_AREA) - areas_to_move[old_area] = TRUE - - old_turfs[oldT] = move_mode - - /*******************************************Hiding turfs if necessary*******************************************/ - - var/list/new_hidden_turfs - if(hidden) - new_hidden_turfs = list() - for(var/i in 1 to old_turfs.len) - CHECK_TICK - var/turf/oldT = old_turfs[i] - if(old_turfs[oldT] & MOVE_TURF) - new_hidden_turfs += new_turfs[i] - SSshuttle.update_hidden_docking_ports(null, new_hidden_turfs) - - /*******************************************All onShuttleMove procs******************************************/ - - CHECK_TICK - - for(var/i in 1 to old_turfs.len) - var/turf/oldT = old_turfs[i] - var/turf/newT = new_turfs[i] - var/move_mode = old_turfs[oldT] - if(move_mode & MOVE_CONTENTS) - for(var/k in oldT) - var/atom/movable/moving_atom = k - if(moving_atom.loc != oldT) //fix for multi-tile objects - continue - moving_atom.onShuttleMove(newT, oldT, movement_force, movement_direction, old_dock, src) //atoms - moved_atoms[moving_atom] = oldT - - if(move_mode & MOVE_TURF) - oldT.onShuttleMove(newT, movement_force, movement_direction) //turfs - - if(move_mode & MOVE_AREA) - var/area/shuttle_area = oldT.loc - shuttle_area.onShuttleMove(oldT, newT, underlying_old_area) //areas - - /******************************************All afterShuttleMove procs****************************************/ - - underlying_old_area.afterShuttleMove() - - // Parallax handling - // This needs to be done before the atom after move - var/new_parallax_dir = FALSE - if(istype(new_dock, /obj/docking_port/stationary/transit)) - new_parallax_dir = preferred_direction - for(var/i in 1 to areas_to_move.len) - CHECK_TICK - var/area/internal_area = areas_to_move[i] - internal_area.afterShuttleMove(new_parallax_dir) //areas - - for(var/i in 1 to old_turfs.len) - CHECK_TICK - if(!(old_turfs[old_turfs[i]] & MOVE_TURF)) - continue - var/turf/oldT = old_turfs[i] - var/turf/newT = new_turfs[i] - newT.afterShuttleMove(oldT, underlying_turf_type, underlying_baseturf_type, rotation) //turfs - - for(var/i in 1 to moved_atoms.len) - CHECK_TICK - var/atom/movable/moved_object = moved_atoms[i] - if(QDELETED(moved_object)) - continue - var/turf/oldT = moved_atoms[moved_object] - moved_object.afterShuttleMove(oldT, movement_force, dir, preferred_direction, movement_direction, rotation)//atoms - - for(var/i in 1 to old_turfs.len) - CHECK_TICK - // Objects can block air so either turf or content changes means an air update is needed - if(!(old_turfs[old_turfs[i]] & MOVE_CONTENTS | MOVE_TURF)) - continue - var/turf/oldT = old_turfs[i] - var/turf/newT = new_turfs[i] - oldT.blocks_air = initial(oldT.blocks_air) - oldT.air_update_turf(TRUE) - newT.blocks_air = initial(newT.blocks_air) - newT.air_update_turf(TRUE) - - /*******************************************Unhiding turfs if necessary******************************************/ - - if(new_hidden_turfs) - SSshuttle.update_hidden_docking_ports(hidden_turfs, null) - hidden_turfs = new_hidden_turfs - - check_poddoors() - new_dock.last_dock_time = world.time - setDir(new_dock.dir) - - return DOCKING_SUCCESS - -======= ->>>>>>> ca603a6... a new file for dock and its new fractured existence (#33627) /obj/docking_port/mobile/proc/findRoundstartDock() return SSshuttle.getDock(roundstart_move) @@ -940,4 +746,4 @@ mode = SHUTTLE_ENDGAME /obj/docking_port/mobile/emergency/on_emergency_dock() - return \ No newline at end of file + return From 889e281a575b19bbdc12a3a69eeaf3f63fc25fa4 Mon Sep 17 00:00:00 2001 From: Leo Date: Tue, 26 Dec 2017 13:10:23 -0200 Subject: [PATCH 09/48] Revert "Vending TGUI" --- code/game/machinery/vending.dm | 278 ++++++++++++++++++++----------- tgui/assets/tgui.css | 2 +- tgui/src/interfaces/vending.ract | 16 -- 3 files changed, 182 insertions(+), 114 deletions(-) delete mode 100644 tgui/src/interfaces/vending.ract diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index 427ffa119a..d3598d4866 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -25,8 +25,8 @@ integrity_failure = 100 armor = list(melee = 20, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 50, acid = 70) circuit = /obj/item/circuitboard/machine/vendor - var/active = TRUE //No sales pitches if off! - var/vend_ready = TRUE //Are we ready to vend?? Is it time?? + var/active = 1 //No sales pitches if off! + var/vend_ready = 1 //Are we ready to vend?? Is it time?? // To be filled out at compile time var/list/products = list() //For each, use the following pattern: @@ -227,15 +227,15 @@ if(!allowed(user) && !emagged && scan_id) to_chat(user, "[src]'s chef compartment blinks red: Access denied.") req_access_txt = "0" - return FALSE + return 0 req_access_txt = "0" - return TRUE + return 1 /obj/machinery/vending/snack/proc/iscompartmentfull(mob/user) if(contents.len >= 30) // no more than 30 dishes can fit inside to_chat(user, "[src]'s chef compartment is full.") - return TRUE - return FALSE + return 1 + return 0 /obj/machinery/vending/snack/proc/food_load(obj/item/reagent_containers/food/snacks/S) if(dish_quants[S.name]) @@ -350,6 +350,180 @@ /obj/machinery/vending/attack_ai(mob/user) return attack_hand(user) +/obj/machinery/vending/attack_hand(mob/user) + var/dat = "" + if(panel_open && !isAI(user)) + return wires.interact(user) + else + if(stat & (BROKEN|NOPOWER)) + return + + dat += "

Select an item

" + dat += "
" + if(product_records.len == 0) + dat += "No product loaded!" + else + var/list/display_records = product_records + if(extended_inventory) + display_records = product_records + hidden_records + if(coin || bill) + display_records = product_records + coin_records + if((coin || bill) && extended_inventory) + display_records = product_records + hidden_records + coin_records + dat += "
    " + for (var/datum/data/vending_product/R in display_records) + dat += "
  • " + if(R.amount > 0) + dat += "Vend " + else + dat += "Sold out " + dat += "[sanitize(R.product_name)]:" + dat += " [R.amount]" + dat += "
  • " + dat += "
" + dat += "
" + if(premium.len > 0) + dat += "Change Return: " + if (coin || bill) + dat += "[(coin ? coin : "")][(bill ? bill : "")]  Remove" + else + dat += "No money  Remove" + if(istype(src, /obj/machinery/vending/snack)) + dat += "

Chef's Food Selection

" + dat += "
" + for (var/O in dish_quants) + if(dish_quants[O] > 0) + var/N = dish_quants[O] + dat += "Dispense " + dat += "[capitalize(O)]: [N]
" + dat += "
" + user.set_machine(src) + if(seconds_electrified && !(stat & NOPOWER)) + if(shock(user, 100)) + return + + var/datum/browser/popup = new(user, "vending", (name)) + popup.set_content(dat) + popup.set_title_image(user.browse_rsc_icon(icon, icon_state)) + popup.open() + + +/obj/machinery/vending/Topic(href, href_list) + if(..()) + return + + if(href_list["remove_coin"]) + if(!(coin || bill)) + to_chat(usr, "There is no money in this machine.") + return + if(coin) + if(!usr.get_active_held_item()) + usr.put_in_hands(coin) + else + coin.forceMove(get_turf(src)) + to_chat(usr, "You remove [coin] from [src].") + coin = null + if(bill) + if(!usr.get_active_held_item()) + usr.put_in_hands(bill) + else + bill.forceMove(get_turf(src)) + to_chat(usr, "You remove [bill] from [src].") + bill = null + + + usr.set_machine(src) + + if((href_list["dispense"]) && (vend_ready)) + var/N = href_list["dispense"] + if(dish_quants[N] <= 0) // Sanity check, there are probably ways to press the button when it shouldn't be possible. + return + vend_ready = 0 + use_power(5) + + dish_quants[N] = max(dish_quants[N] - 1, 0) + for(var/obj/O in contents) + if(O.name == N) + O.forceMove(drop_location()) + break + vend_ready = 1 + updateUsrDialog() + return + + if((href_list["vend"]) && (vend_ready)) + if(panel_open) + to_chat(usr, "The vending machine cannot dispense products while its service panel is open!") + return + + if((!allowed(usr)) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH + to_chat(usr, "Access denied." ) + flick(icon_deny,src) + return + + vend_ready = 0 //One thing at a time!! + + var/datum/data/vending_product/R = locate(href_list["vend"]) + if(!R || !istype(R) || !R.product_path) + vend_ready = 1 + return + + if(R in hidden_records) + if(!extended_inventory) + vend_ready = 1 + return + else if(R in coin_records) + if(!(coin || bill)) + to_chat(usr, "You need to insert money to get this item!") + vend_ready = 1 + return + if(coin && coin.string_attached) + if(prob(50)) + if(usr.put_in_hands(coin)) + to_chat(usr, "You successfully pull [coin] out before [src] could swallow it.") + coin = null + else + to_chat(usr, "You couldn't pull [coin] out because your hands are full!") + QDEL_NULL(coin) + else + to_chat(usr, "You weren't able to pull [coin] out fast enough, the machine ate it, string and all!") + QDEL_NULL(coin) + else + QDEL_NULL(coin) + QDEL_NULL(bill) + + else if (!(R in product_records)) + vend_ready = 1 + message_admins("Vending machine exploit attempted by [key_name(usr, usr.client)]!") + return + + if (R.amount <= 0) + to_chat(usr, "Sold out.") + vend_ready = 1 + return + else + R.amount-- + + if(((last_reply + 200) <= world.time) && vend_reply) + speak(vend_reply) + last_reply = world.time + + use_power(5) + if(icon_vend) //Show the vending animation if needed + flick(icon_vend,src) + new R.product_path(get_turf(src)) + SSblackbox.record_feedback("nested tally", "vending_machine_usage", 1, list("[type]", "[R.product_path]")) + vend_ready = 1 + return + + updateUsrDialog() + return + + else if(href_list["togglevoice"] && panel_open) + shut_up = !shut_up + + updateUsrDialog() + + /obj/machinery/vending/process() if(stat & (BROKEN|NOPOWER)) return @@ -431,96 +605,6 @@ else return FALSE -/obj/machinery/vending/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = 0, \ - datum/tgui/master_ui = null, datum/ui_state/state = GLOB.physical_state) - ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open) - if(!ui) - ui = new(user, src, ui_key, "vending", name, 350, 475, master_ui, state) - ui.open() - -/obj/machinery/vending/ui_data() - var/list/data = list() - var/list/listed_products = list() - var/list/display_records = product_records - if(extended_inventory) - display_records += hidden_records - if(coin) - display_records += coin_records - for(var/key = 1 to display_records.len) - var/datum/data/vending_product/I = display_records[key] - listed_products.Add(list(list( - "key" = key, - "name" = I.product_name, - "color" = I.display_color, - "amount" = I.amount))) - data["products"] = listed_products - if(!isnull(coin)) - data["coin"] = coin.name - data["coinslot"] = premium.len - data["canvend"] = vend_ready - - return data - -/obj/machinery/vending/ui_act(action, params) - if(..()) - return - if(!vend_ready) - return - switch(action) - if("vend") - if(!allowed(usr) && !emagged && scan_id) //For SECURE VENDING MACHINES YEAH - to_chat(usr, "Access denied.") - flick(icon_deny,src) - return - vend_ready = FALSE - addtimer(VARSET_CALLBACK(src, vend_ready, TRUE), 10) - var/key = text2num(params["key"]) - var/datum/data/vending_product/R = product_records[key] - if(R in hidden_records) - if(!extended_inventory) - return - else if(R in coin_records) - if(!coin) - to_chat(usr, "You need to insert a coin to get this item!") - return - if(coin.string_attached) - if(prob(50)) - if(usr.put_in_hands(coin)) - to_chat(usr, "You successfully pull [coin] out before [src] could swallow it.") - coin = null - else - to_chat(usr, "You couldn't pull [coin] out because your hands are full!") - QDEL_NULL(coin) - else - to_chat(usr, "You weren't able to pull [coin] out fast enough, the machine ate it, string and all!") - QDEL_NULL(coin) - else - QDEL_NULL(coin) - else if (!(R in product_records)) - return - - - - if (R.amount <= 0) - to_chat(usr, "Sold out.") - return - R.amount-- - if(((last_reply + 200) <= world.time) && vend_reply) - speak(vend_reply) - last_reply = world.time - use_power(5) - if(icon_vend) //Show the vending animation if needed - flick(icon_vend,src) - new R.product_path(drop_location()) - return TRUE - if("eject") - if(!coin) - to_chat(usr, "There is no coin in this machine.") - return - usr.put_in_hands(coin) - to_chat(usr, "You remove [coin] from [src].") - coin = null - /* * Vending machine types */ @@ -1111,4 +1195,4 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C #undef STANDARD_CHARGE #undef CONTRABAND_CHARGE -#undef COIN_CHARGE +#undef COIN_CHARGE \ No newline at end of file diff --git a/tgui/assets/tgui.css b/tgui/assets/tgui.css index c73fc2adfa..256b53c106 100644 --- a/tgui/assets/tgui.css +++ b/tgui/assets/tgui.css @@ -1 +1 @@ -@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffb18b25",endColorstr="#ff5f380e",GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button.gridable.center{text-align:center;width:75px}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display.tabular{padding:0;margin:0}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input.number{width:35px}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .cell,body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork section .cell:not(:first-child){text-align:center;padding-top:0}body.clockwork section .cell span.button{width:75px}body.clockwork section:not(:last-child){padding-right:4px}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCA0MjUgMjAwIiBvcGFjaXR5PSIuMzMiPgogIDxwYXRoIGQ9Im0gMTc4LjAwMzk5LDAuMDM4NjkgLTcxLjIwMzkzLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM0LDYuMDI1NTUgbCAwLDE4Ny44NzE0NyBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgNi43NjEzNCw2LjAyNTU0IGwgNTMuMTA3MiwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTAxLjU0NDAxOCA3Mi4yMTYyOCwxMDQuNjk5Mzk4IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA1Ljc2MDE1LDIuODcwMTYgbCA3My41NTQ4NywwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM1LC02LjAyNTU0IGwgMCwtMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzNSwtNi4wMjU1NSBsIC01NC43MTY0NCwwIGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNi43NjEzMyw2LjAyNTU1IGwgMCwxMDIuNjE5MzUgTCAxODMuNzY0MTMsMi45MDg4NiBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTUuNzYwMTQsLTIuODcwMTcgeiIgLz4KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPgogIDxwYXRoIGQ9Im0gNDIwLjE1NTM1LDE3Ny44OTExOSBhIDEzLjQxMjAzOCwxMi41MDE4NDIgMCAwIDEgLTguNjMyOTUsMjIuMDY5NTEgbCAtNjYuMTE4MzIsMCBhIDUuMzY0ODE1Miw1LjAwMDczNyAwIDAgMSAtNS4zNjQ4MiwtNS4wMDA3NCBsIDAsLTc5Ljg3OTMxIHoiIC8+Cjwvc3ZnPgo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4KPCEtLSBodHRwOi8vY3JlYXRpdmVjb21tb25zLm9yZy9saWNlbnNlcy9ieS1zYS80LjAvIC0tPgo=") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button.gridable.center{text-align:center;width:75px}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display.tabular{padding:0;margin:0}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input.number{width:35px}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen section .cell:not(:first-child){text-align:center;padding-top:0}body.nanotrasen section .cell span.button{width:75px}body.nanotrasen section:not(:last-child){padding-right:4px}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+CjxzdmcgeG1sbnM9Imh0dHA6Ly93d3cudzMub3JnLzIwMDAvc3ZnIiB2ZXJzaW9uPSIxLjAiIHZpZXdCb3g9IjAgMCAyMDAgMjg5Ljc0MiIgb3BhY2l0eT0iLjMzIj4KICA8cGF0aCBkPSJtIDkzLjUzNzY3NywwIGMgLTE4LjExMzEyNSwwIC0zNC4yMjAxMzMsMy4xMTE2NCAtNDguMzIzNDg0LDkuMzM0MzcgLTEzLjk2NTA5Miw2LjIyMTY3IC0yNC42MTI0NDIsMTUuMDcxMTQgLTMxLjk0MDY1MSwyNi41NDcxIC03LjE4OTkzOTgsMTEuMzM3ODkgLTEwLjMwMTIyNjYsMjQuNzQ5MTEgLTEwLjMwMTIyNjYsNDAuMjM0NzggMCwxMC42NDY2MiAyLjcyNTAwMjYsMjAuNDY0NjUgOC4xNzUxMTE2LDI5LjQ1MjU4IDUuNjE1Mjc3LDguOTg2ODYgMTQuMDM4Mjc3LDE3LjM1MjA0IDI1LjI2ODgyMSwyNS4wOTQzNiAxMS4yMzA1NDQsNy42MDUzMSAyNi41MDc0MjEsMTUuNDE4MzUgNDUuODMwNTE0LDIzLjQzNzgyIDE5Ljk4Mzc0OCw4LjI5NTU3IDM0Ljg0ODg0OCwxNS41NTQ3MSA0NC41OTI5OTgsMjEuNzc2MzggOS43NDQxNCw2LjIyMjczIDE2Ljc2MTcsMTIuODU4NSAyMS4wNTU3MiwxOS45MDk1MSA0LjI5NDA0LDcuMDUyMDggNi40NDE5MywxNS43NjQwOCA2LjQ0MTkzLDI2LjEzNDU5IDAsMTYuMTc3MDIgLTUuMjAxOTYsMjguNDgyMjIgLTE1LjYwNjczLDM2LjkxNjgyIC0xMC4yMzk2LDguNDM0NyAtMjUuMDIyMDMsMTIuNjUyMyAtNDQuMzQ1MTY5LDEyLjY1MjMgLTE0LjAzODE3MSwwIC0yNS41MTUyNDcsLTEuNjU5NCAtMzQuNDMzNjE4LC00Ljk3NzcgLTguOTE4MzcsLTMuNDU2NiAtMTYuMTg1NTcyLC04LjcxMTMgLTIxLjgwMDgzOSwtMTUuNzYzMyAtNS42MTUyNzcsLTcuMDUyMSAtMTAuMDc0Nzk1LC0xNi42NjA4OCAtMTMuMzc3ODk5LC0yOC44MjgxMiBsIC0yNC43NzMxNjI2MjkzOTQ1LDAgMCw1Ni44MjYzMiBDIDMzLjg1Njc2OSwyODYuMDc2MDEgNjMuNzQ5MDQsMjg5Ljc0MjAxIDg5LjY3ODM4MywyODkuNzQyMDEgYyAxNi4wMjAwMjcsMCAzMC43MTk3ODcsLTEuMzgyNyA0NC4wOTczMzcsLTQuMTQ3OSAxMy41NDI3MiwtMi45MDQzIDI1LjEwNDEsLTcuNDY3NiAzNC42ODMwOSwtMTMuNjg5MyA5Ljc0NDEzLC02LjM1OTcgMTcuMzQwNDIsLTE0LjUxOTUgMjIuNzkwNTIsLTI0LjQ3NDggNS40NTAxLC0xMC4wOTMzMiA4LjE3NTExLC0yMi4zOTk1OSA4LjE3NTExLC0zNi45MTY4MiAwLC0xMi45OTc2NCAtMy4zMDIxLC0yNC4zMzUzOSAtOS45MDgyOSwtMzQuMDE0NiAtNi40NDEwNSwtOS44MTcyNSAtMTUuNTI1NDUsLTE4LjUyNzA3IC0yNy4yNTE0NiwtMjYuMTMxMzMgLTExLjU2MDg1LC03LjYwNDI3IC0yNy45MTA4MywtMTUuODMxNDIgLTQ5LjA1MDY2LC0yNC42ODAyMiAtMTcuNTA2NDQsLTcuMTkwMTIgLTMwLjcxOTY2OCwtMTMuNjg5NDggLTM5LjYzODAzOCwtMTkuNDk3MDEgLTguOTE4MzcxLC01LjgwNzUyIC0xOC42MDc0NzQsLTEyLjQzNDA5IC0yNC4wOTY1MjQsLTE4Ljg3NDE3IC01LjQyNjA0MywtNi4zNjYxNiAtOS42NTg4MjYsLTE1LjA3MDAzIC05LjY1ODgyNiwtMjQuODg3MjkgMCwtOS4yNjQwMSAyLjA3NTQxNCwtMTcuMjEzNDUgNi4yMjM0NTQsLTIzLjg1MDMzIDExLjA5ODI5OCwtMTQuMzk3NDggNDEuMjg2NjM4LC0xLjc5NTA3IDQ1LjA3NTYwOSwyNC4zNDc2MiA0LjgzOTM5Miw2Ljc3NDkxIDguODQ5MzUsMTYuMjQ3MjkgMTIuMDI5NTE1LDI4LjQxNTYgbCAyMC41MzIzNCwwIDAsLTU1Ljk5OTY3IGMgLTQuNDc4MjUsLTUuOTI0NDggLTkuOTU0ODgsLTEwLjYzMjIyIC0xNS45MDgzNywtMTQuMzc0MTEgMS42NDA1NSwwLjQ3OTA1IDMuMTkwMzksMS4wMjM3NiA0LjYzODY1LDEuNjQwMjQgNi40OTg2MSwyLjYyNjA3IDEyLjE2NzkzLDcuMzI3NDcgMTcuMDA3MywxNC4xMDM0NSA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNSwxNi4yNDU2NyAxMi4wMjk1MiwyOC40MTM5NyAwLDAgOC40ODEyOCwtMC4xMjg5NCA4LjQ4OTc4LC0wLjAwMiAwLjQxNzc2LDYuNDE0OTQgLTEuNzUzMzksOS40NTI4NiAtNC4xMjM0MiwxMi41NjEwNCAtMi40MTc0LDMuMTY5NzggLTUuMTQ0ODYsNi43ODk3MyAtNC4wMDI3OCwxMy4wMDI5IDEuNTA3ODYsOC4yMDMxOCAxMC4xODM1NCwxMC41OTY0MiAxNC42MjE5NCw5LjMxMTU0IC0zLjMxODQyLC0wLjQ5OTExIC01LjMxODU1LC0xLjc0OTQ4IC01LjMxODU1LC0xLjc0OTQ4IDAsMCAxLjg3NjQ2LDAuOTk4NjggNS42NTExNywtMS4zNTk4MSAtMy4yNzY5NSwwLjk1NTcxIC0xMC43MDUyOSwtMC43OTczOCAtMTEuODAxMjUsLTYuNzYzMTMgLTAuOTU3NTIsLTUuMjA4NjEgMC45NDY1NCwtNy4yOTUxNCAzLjQwMTEzLC0xMC41MTQ4MiAyLjQ1NDYyLC0zLjIxOTY4IDUuMjg0MjYsLTYuOTU4MzEgNC42ODQzLC0xNC40ODgyNCBsIDAuMDAzLDAuMDAyIDguOTI2NzYsMCAwLC01NS45OTk2NyBjIC0xNS4wNzEyNSwtMy44NzE2OCAtMjcuNjUzMTQsLTYuMzYwNDIgLTM3Ljc0NjcxLC03LjQ2NTg2IC05Ljk1NTMxLC0xLjEwNzU1IC0yMC4xODgyMywtMS42NTk4MSAtMzAuNjk2NjEzLC0xLjY1OTgxIHogbSA3MC4zMjE2MDMsMTcuMzA4OTMgMC4yMzgwNSw0MC4zMDQ5IGMgMS4zMTgwOCwxLjIyNjY2IDIuNDM5NjUsMi4yNzgxNSAzLjM0MDgxLDMuMTA2MDIgNC44MzkzOSw2Ljc3NDkxIDguODQ5MzQsMTYuMjQ1NjYgMTIuMDI5NTEsMjguNDEzOTcgbCAyMC41MzIzNCwwIDAsLTU1Ljk5OTY3IGMgLTYuNjc3MzEsLTQuNTkzODEgLTE5LjgzNjQzLC0xMC40NzMwOSAtMzYuMTQwNzEsLTE1LjgyNTIyIHogbSAtMjguMTIwNDksNS42MDU1MSA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM3LC02LjQ2Njk3IC0xMy44NDY3OCwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NzA1LDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiBtIDE1LjIyMTk1LDI0LjAwODQ4IDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzgsLTYuNDY2OTcgLTEzLjg0Njc5LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDQsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gLTk5LjExMzg0LDIuMjA3NjQgOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzODIsLTYuNDY2OTcgLTEzLjg0Njc4MiwtOS43MTcyNiAtOC41NjQ3OSwtMTcuNzE2NTUgeiBtIDIyLjc5NTQyLDAgYyAyLjc3MTUsNy45OTkyOSAxLjc4NzQxLDExLjI0OTU4IC00LjQ5MzU0LDE3LjcxNjU1IGwgNC40OTM1NCwtMTcuNzE2NTUgeiIgLz4KPC9zdmc+CjwhLS0gVGhpcyB3b3JrIGlzIGxpY2Vuc2VkIHVuZGVyIGEgQ3JlYXRpdmUgQ29tbW9ucyBBdHRyaWJ1dGlvbi1TaGFyZUFsaWtlIDQuMCBJbnRlcm5hdGlvbmFsIExpY2Vuc2UuIC0tPgo8IS0tIGh0dHA6Ly9jcmVhdGl2ZWNvbW1vbnMub3JnL2xpY2Vuc2VzL2J5LXNhLzQuMC8gLS0+Cg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff750000",endColorstr="#ff340404",GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button.gridable.center{text-align:center;width:75px}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display.tabular{padding:0;margin:0}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input.number{width:35px}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate section .cell:not(:first-child){text-align:center;padding-top:0}body.syndicate section .cell span.button{width:75px}body.syndicate section:not(:last-child){padding-right:4px}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file +@charset "utf-8";body,html{box-sizing:border-box;height:100%;margin:0}html{overflow:hidden;cursor:default}body{overflow:auto;font-family:Verdana,Geneva,sans-serif;font-size:12px;color:#fff;background-color:#2a2a2a;background-image:linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}*,:after,:before{box-sizing:inherit}h1,h2,h3,h4{display:inline-block;margin:0;padding:6px 0}h1{font-size:18px}h2{font-size:16px}h3{font-size:14px}h4{font-size:12px}body.clockwork{background:linear-gradient(180deg,#b18b25 0,#5f380e);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ffb18b25",endColorstr="#ff5f380e",GradientType=0)}body.clockwork .normal{color:#b18b25}body.clockwork .good{color:#cfba47}body.clockwork .average{color:#896b19}body.clockwork .bad{color:#5f380e}body.clockwork .highlight{color:#b18b25}body.clockwork main{display:block;margin-top:32px;padding:2px 6px 0}body.clockwork hr{height:2px;background-color:#b18b25;border:none}body.clockwork .hidden{display:none}body.clockwork .bar .barText,body.clockwork span.button{color:#b18b25;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.clockwork .bold{font-weight:700}body.clockwork .italic{font-style:italic}body.clockwork [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.clockwork div[data-tooltip],body.clockwork span[data-tooltip]{position:relative}body.clockwork div[data-tooltip]:after,body.clockwork span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #170800;background-color:#2d1400}body.clockwork div[data-tooltip]:hover:after,body.clockwork span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.clockwork div[data-tooltip].tooltip-top:after,body.clockwork span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-top:hover:after,body.clockwork span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:after,body.clockwork span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.clockwork div[data-tooltip].tooltip-bottom:hover:after,body.clockwork span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.clockwork div[data-tooltip].tooltip-left:after,body.clockwork span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-left:hover:after,body.clockwork span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:after,body.clockwork span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.clockwork div[data-tooltip].tooltip-right:hover:after,body.clockwork span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.clockwork .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #170800;background:#2d1400}body.clockwork .bar .barText{position:absolute;top:0;right:3px}body.clockwork .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#b18b25}body.clockwork .bar .barFill.good{background-color:#cfba47}body.clockwork .bar .barFill.average{background-color:#896b19}body.clockwork .bar .barFill.bad{background-color:#5f380e}body.clockwork span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #170800}body.clockwork span.button .fa{padding-right:2px}body.clockwork span.button.normal{transition:background-color .5s;background-color:#5f380e}body.clockwork span.button.normal.active:focus,body.clockwork span.button.normal.active:hover{transition:background-color .25s;background-color:#704211;outline:0}body.clockwork span.button.disabled{transition:background-color .5s;background-color:#2d1400}body.clockwork span.button.disabled.active:focus,body.clockwork span.button.disabled.active:hover{transition:background-color .25s;background-color:#441e00;outline:0}body.clockwork span.button.selected{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.selected.active:focus,body.clockwork span.button.selected.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.toggle{transition:background-color .5s;background-color:#cfba47}body.clockwork span.button.toggle.active:focus,body.clockwork span.button.toggle.active:hover{transition:background-color .25s;background-color:#d1bd50;outline:0}body.clockwork span.button.caution{transition:background-color .5s;background-color:#be6209}body.clockwork span.button.caution.active:focus,body.clockwork span.button.caution.active:hover{transition:background-color .25s;background-color:#cd6a0a;outline:0}body.clockwork span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.clockwork span.button.danger.active:focus,body.clockwork span.button.danger.active:hover{transition:background-color .25s;background-color:#abaf00;outline:0}body.clockwork span.button.gridable{width:125px;margin:2px 0}body.clockwork span.button.gridable.center{text-align:center;width:75px}body.clockwork span.button+span:not(.button),body.clockwork span:not(.button)+span.button{margin-left:5px}body.clockwork div.display{width:100%;padding:4px;margin:6px 0;background-color:#2d1400;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#e62d1400,endColorStr=#e62d1400);background-color:rgba(45,20,0,.9);box-shadow:inset 0 0 5px rgba(0,0,0,.3)}body.clockwork div.display.tabular{padding:0;margin:0}body.clockwork div.display header,body.clockwork div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#cfba47;border-bottom:2px solid #b18b25}body.clockwork div.display header .buttonRight,body.clockwork div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.clockwork div.display article,body.clockwork div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.clockwork input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#b18b25;background-color:#cfba47;border:1px solid #272727}body.clockwork input.number{width:35px}body.clockwork input:-ms-input-placeholder{color:#999}body.clockwork input::placeholder{color:#999}body.clockwork input::-ms-clear{display:none}body.clockwork svg.linegraph{overflow:hidden}body.clockwork div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#2d1400;font-weight:700;font-style:italic;background-color:#000;background-image:repeating-linear-gradient(-45deg,#000,#000 10px,#170800 0,#170800 20px)}body.clockwork div.notice .label{color:#2d1400}body.clockwork div.notice .content:only-of-type{padding:0}body.clockwork div.notice hr{background-color:#896b19}body.clockwork div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #5f380e;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.clockwork section .cell,body.clockwork section .content,body.clockwork section .label,body.clockwork section .line,body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.clockwork section{display:table-row;width:100%}body.clockwork section:not(:first-child){padding-top:4px}body.clockwork section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.clockwork section .label{width:1%;padding-right:32px;white-space:nowrap;color:#b18b25}body.clockwork section .content:not(:last-child){padding-right:16px}body.clockwork section .line{width:100%}body.clockwork section .cell:not(:first-child){text-align:center;padding-top:0}body.clockwork section .cell span.button{width:75px}body.clockwork section:not(:last-child){padding-right:4px}body.clockwork div.subdisplay{width:100%;margin:0}body.clockwork header.titlebar .close,body.clockwork header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#cfba47}body.clockwork header.titlebar .close:hover,body.clockwork header.titlebar .minimize:hover{color:#d1bd50}body.clockwork header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#5f380e;border-bottom:1px solid #170800;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.clockwork header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.clockwork header.titlebar .title{position:absolute;top:6px;left:46px;color:#cfba47;font-size:16px;white-space:nowrap}body.clockwork header.titlebar .minimize{position:absolute;top:6px;right:46px}body.clockwork header.titlebar .close{position:absolute;top:4px;right:12px}body.nanotrasen{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgNDI1IDIwMCIgb3BhY2l0eT0iLjMzIj4NCiAgPHBhdGggZD0ibSAxNzguMDAzOTksMC4wMzg2OSAtNzEuMjAzOTMsMCBhIDYuNzYxMzQyMiw2LjAyNTU0OTUgMCAwIDAgLTYuNzYxMzQsNi4wMjU1NSBsIDAsMTg3Ljg3MTQ3IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCA2Ljc2MTM0LDYuMDI1NTQgbCA1My4xMDcyLDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xMDEuNTQ0MDE4IDcyLjIxNjI4LDEwNC42OTkzOTggYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDUuNzYwMTUsMi44NzAxNiBsIDczLjU1NDg3LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIDYuNzYxMzUsLTYuMDI1NTQgbCAwLC0xODcuODcxNDcgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTM1LC02LjAyNTU1IGwgLTU0LjcxNjQ0LDAgYSA2Ljc2MTM0MjIsNi4wMjU1NDk1IDAgMCAwIC02Ljc2MTMzLDYuMDI1NTUgbCAwLDEwMi42MTkzNSBMIDE4My43NjQxMywyLjkwODg2IGEgNi43NjEzNDIyLDYuMDI1NTQ5NSAwIDAgMCAtNS43NjAxNCwtMi44NzAxNyB6IiAvPg0KICA8cGF0aCBkPSJNIDQuODQ0NjMzMywyMi4xMDg3NSBBIDEzLjQxMjAzOSwxMi41MDE4NDIgMCAwIDEgMTMuNDc3NTg4LDAuMDM5MjQgbCA2Ni4xMTgzMTUsMCBhIDUuMzY0ODE1OCw1LjAwMDczNyAwIDAgMSA1LjM2NDgyMyw1LjAwMDczIGwgMCw3OS44NzkzMSB6IiAvPg0KICA8cGF0aCBkPSJtIDQyMC4xNTUzNSwxNzcuODkxMTkgYSAxMy40MTIwMzgsMTIuNTAxODQyIDAgMCAxIC04LjYzMjk1LDIyLjA2OTUxIGwgLTY2LjExODMyLDAgYSA1LjM2NDgxNTIsNS4wMDA3MzcgMCAwIDEgLTUuMzY0ODIsLTUuMDAwNzQgbCAwLC03OS44NzkzMSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#2a2a2a 0,#202020);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff2a2a2a",endColorstr="#ff202020",GradientType=0)}body.nanotrasen .normal{color:#40628a}body.nanotrasen .good{color:#537d29}body.nanotrasen .average{color:#be6209}body.nanotrasen .bad{color:#b00e0e}body.nanotrasen .highlight{color:#8ba5c4}body.nanotrasen main{display:block;margin-top:32px;padding:2px 6px 0}body.nanotrasen hr{height:2px;background-color:#40628a;border:none}body.nanotrasen .hidden{display:none}body.nanotrasen .bar .barText,body.nanotrasen span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.nanotrasen .bold{font-weight:700}body.nanotrasen .italic{font-style:italic}body.nanotrasen [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.nanotrasen div[data-tooltip],body.nanotrasen span[data-tooltip]{position:relative}body.nanotrasen div[data-tooltip]:after,body.nanotrasen span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.nanotrasen div[data-tooltip]:hover:after,body.nanotrasen span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.nanotrasen div[data-tooltip].tooltip-top:after,body.nanotrasen span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-top:hover:after,body.nanotrasen span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:after,body.nanotrasen span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.nanotrasen div[data-tooltip].tooltip-bottom:hover:after,body.nanotrasen span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.nanotrasen div[data-tooltip].tooltip-left:after,body.nanotrasen span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-left:hover:after,body.nanotrasen span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:after,body.nanotrasen span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.nanotrasen div[data-tooltip].tooltip-right:hover:after,body.nanotrasen span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.nanotrasen .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #40628a;background:#272727}body.nanotrasen .bar .barText{position:absolute;top:0;right:3px}body.nanotrasen .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#40628a}body.nanotrasen .bar .barFill.good{background-color:#537d29}body.nanotrasen .bar .barFill.average{background-color:#be6209}body.nanotrasen .bar .barFill.bad{background-color:#b00e0e}body.nanotrasen span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.nanotrasen span.button .fa{padding-right:2px}body.nanotrasen span.button.normal{transition:background-color .5s;background-color:#40628a}body.nanotrasen span.button.normal.active:focus,body.nanotrasen span.button.normal.active:hover{transition:background-color .25s;background-color:#4f78aa;outline:0}body.nanotrasen span.button.disabled{transition:background-color .5s;background-color:#999}body.nanotrasen span.button.disabled.active:focus,body.nanotrasen span.button.disabled.active:hover{transition:background-color .25s;background-color:#a8a8a8;outline:0}body.nanotrasen span.button.selected{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.selected.active:focus,body.nanotrasen span.button.selected.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.toggle{transition:background-color .5s;background-color:#2f943c}body.nanotrasen span.button.toggle.active:focus,body.nanotrasen span.button.toggle.active:hover{transition:background-color .25s;background-color:#3ab84b;outline:0}body.nanotrasen span.button.caution{transition:background-color .5s;background-color:#9a9d00}body.nanotrasen span.button.caution.active:focus,body.nanotrasen span.button.caution.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.nanotrasen span.button.danger{transition:background-color .5s;background-color:#9d0808}body.nanotrasen span.button.danger.active:focus,body.nanotrasen span.button.danger.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.nanotrasen span.button.gridable{width:125px;margin:2px 0}body.nanotrasen span.button.gridable.center{text-align:center;width:75px}body.nanotrasen span.button+span:not(.button),body.nanotrasen span:not(.button)+span.button{margin-left:5px}body.nanotrasen div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#54000000,endColorStr=#54000000);background-color:rgba(0,0,0,.33);box-shadow:inset 0 0 5px rgba(0,0,0,.5)}body.nanotrasen div.display.tabular{padding:0;margin:0}body.nanotrasen div.display header,body.nanotrasen div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #40628a}body.nanotrasen div.display header .buttonRight,body.nanotrasen div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.nanotrasen div.display article,body.nanotrasen div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.nanotrasen input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#000;background-color:#fff;border:1px solid #272727}body.nanotrasen input.number{width:35px}body.nanotrasen input:-ms-input-placeholder{color:#999}body.nanotrasen input::placeholder{color:#999}body.nanotrasen input::-ms-clear{display:none}body.nanotrasen svg.linegraph{overflow:hidden}body.nanotrasen div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#bb9b68;background-image:repeating-linear-gradient(-45deg,#bb9b68,#bb9b68 10px,#b1905d 0,#b1905d 20px)}body.nanotrasen div.notice .label{color:#000}body.nanotrasen div.notice .content:only-of-type{padding:0}body.nanotrasen div.notice hr{background-color:#272727}body.nanotrasen div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.nanotrasen section .cell,body.nanotrasen section .content,body.nanotrasen section .label,body.nanotrasen section .line,body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.nanotrasen section{display:table-row;width:100%}body.nanotrasen section:not(:first-child){padding-top:4px}body.nanotrasen section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.nanotrasen section .label{width:1%;padding-right:32px;white-space:nowrap;color:#8ba5c4}body.nanotrasen section .content:not(:last-child){padding-right:16px}body.nanotrasen section .line{width:100%}body.nanotrasen section .cell:not(:first-child){text-align:center;padding-top:0}body.nanotrasen section .cell span.button{width:75px}body.nanotrasen section:not(:last-child){padding-right:4px}body.nanotrasen div.subdisplay{width:100%;margin:0}body.nanotrasen header.titlebar .close,body.nanotrasen header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#8ba5c4}body.nanotrasen header.titlebar .close:hover,body.nanotrasen header.titlebar .minimize:hover{color:#9cb2cd}body.nanotrasen header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.nanotrasen header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.nanotrasen header.titlebar .title{position:absolute;top:6px;left:46px;color:#8ba5c4;font-size:16px;white-space:nowrap}body.nanotrasen header.titlebar .minimize{position:absolute;top:6px;right:46px}body.nanotrasen header.titlebar .close{position:absolute;top:4px;right:12px}body.syndicate{background:url("data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0iVVRGLTgiIHN0YW5kYWxvbmU9Im5vIj8+DQo8c3ZnIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIgdmVyc2lvbj0iMS4wIiB2aWV3Qm94PSIwIDAgMjAwIDI4OS43NDIiIG9wYWNpdHk9Ii4zMyI+DQogIDxwYXRoIGQ9Im0gOTMuNTM3Njc3LDAgYyAtMTguMTEzMTI1LDAgLTM0LjIyMDEzMywzLjExMTY0IC00OC4zMjM0ODQsOS4zMzQzNyAtMTMuOTY1MDkyLDYuMjIxNjcgLTI0LjYxMjQ0MiwxNS4wNzExNCAtMzEuOTQwNjUxLDI2LjU0NzEgLTcuMTg5OTM5OCwxMS4zMzc4OSAtMTAuMzAxMjI2NiwyNC43NDkxMSAtMTAuMzAxMjI2Niw0MC4yMzQ3OCAwLDEwLjY0NjYyIDIuNzI1MDAyNiwyMC40NjQ2NSA4LjE3NTExMTYsMjkuNDUyNTggNS42MTUyNzcsOC45ODY4NiAxNC4wMzgyNzcsMTcuMzUyMDQgMjUuMjY4ODIxLDI1LjA5NDM2IDExLjIzMDU0NCw3LjYwNTMxIDI2LjUwNzQyMSwxNS40MTgzNSA0NS44MzA1MTQsMjMuNDM3ODIgMTkuOTgzNzQ4LDguMjk1NTcgMzQuODQ4ODQ4LDE1LjU1NDcxIDQ0LjU5Mjk5OCwyMS43NzYzOCA5Ljc0NDE0LDYuMjIyNzMgMTYuNzYxNywxMi44NTg1IDIxLjA1NTcyLDE5LjkwOTUxIDQuMjk0MDQsNy4wNTIwOCA2LjQ0MTkzLDE1Ljc2NDA4IDYuNDQxOTMsMjYuMTM0NTkgMCwxNi4xNzcwMiAtNS4yMDE5NiwyOC40ODIyMiAtMTUuNjA2NzMsMzYuOTE2ODIgLTEwLjIzOTYsOC40MzQ3IC0yNS4wMjIwMywxMi42NTIzIC00NC4zNDUxNjksMTIuNjUyMyAtMTQuMDM4MTcxLDAgLTI1LjUxNTI0NywtMS42NTk0IC0zNC40MzM2MTgsLTQuOTc3NyAtOC45MTgzNywtMy40NTY2IC0xNi4xODU1NzIsLTguNzExMyAtMjEuODAwODM5LC0xNS43NjMzIC01LjYxNTI3NywtNy4wNTIxIC0xMC4wNzQ3OTUsLTE2LjY2MDg4IC0xMy4zNzc4OTksLTI4LjgyODEyIGwgLTI0Ljc3MzE2MjYyOTM5NDUsMCAwLDU2LjgyNjMyIEMgMzMuODU2NzY5LDI4Ni4wNzYwMSA2My43NDkwNCwyODkuNzQyMDEgODkuNjc4MzgzLDI4OS43NDIwMSBjIDE2LjAyMDAyNywwIDMwLjcxOTc4NywtMS4zODI3IDQ0LjA5NzMzNywtNC4xNDc5IDEzLjU0MjcyLC0yLjkwNDMgMjUuMTA0MSwtNy40Njc2IDM0LjY4MzA5LC0xMy42ODkzIDkuNzQ0MTMsLTYuMzU5NyAxNy4zNDA0MiwtMTQuNTE5NSAyMi43OTA1MiwtMjQuNDc0OCA1LjQ1MDEsLTEwLjA5MzMyIDguMTc1MTEsLTIyLjM5OTU5IDguMTc1MTEsLTM2LjkxNjgyIDAsLTEyLjk5NzY0IC0zLjMwMjEsLTI0LjMzNTM5IC05LjkwODI5LC0zNC4wMTQ2IC02LjQ0MTA1LC05LjgxNzI1IC0xNS41MjU0NSwtMTguNTI3MDcgLTI3LjI1MTQ2LC0yNi4xMzEzMyAtMTEuNTYwODUsLTcuNjA0MjcgLTI3LjkxMDgzLC0xNS44MzE0MiAtNDkuMDUwNjYsLTI0LjY4MDIyIC0xNy41MDY0NCwtNy4xOTAxMiAtMzAuNzE5NjY4LC0xMy42ODk0OCAtMzkuNjM4MDM4LC0xOS40OTcwMSAtOC45MTgzNzEsLTUuODA3NTIgLTE4LjYwNzQ3NCwtMTIuNDM0MDkgLTI0LjA5NjUyNCwtMTguODc0MTcgLTUuNDI2MDQzLC02LjM2NjE2IC05LjY1ODgyNiwtMTUuMDcwMDMgLTkuNjU4ODI2LC0yNC44ODcyOSAwLC05LjI2NDAxIDIuMDc1NDE0LC0xNy4yMTM0NSA2LjIyMzQ1NCwtMjMuODUwMzMgMTEuMDk4Mjk4LC0xNC4zOTc0OCA0MS4yODY2MzgsLTEuNzk1MDcgNDUuMDc1NjA5LDI0LjM0NzYyIDQuODM5MzkyLDYuNzc0OTEgOC44NDkzNSwxNi4yNDcyOSAxMi4wMjk1MTUsMjguNDE1NiBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNC40NzgyNSwtNS45MjQ0OCAtOS45NTQ4OCwtMTAuNjMyMjIgLTE1LjkwODM3LC0xNC4zNzQxMSAxLjY0MDU1LDAuNDc5MDUgMy4xOTAzOSwxLjAyMzc2IDQuNjM4NjUsMS42NDAyNCA2LjQ5ODYxLDIuNjI2MDcgMTIuMTY3OTMsNy4zMjc0NyAxNy4wMDczLDE0LjEwMzQ1IDQuODM5MzksNi43NzQ5MSA4Ljg0OTM1LDE2LjI0NTY3IDEyLjAyOTUyLDI4LjQxMzk3IDAsMCA4LjQ4MTI4LC0wLjEyODk0IDguNDg5NzgsLTAuMDAyIDAuNDE3NzYsNi40MTQ5NCAtMS43NTMzOSw5LjQ1Mjg2IC00LjEyMzQyLDEyLjU2MTA0IC0yLjQxNzQsMy4xNjk3OCAtNS4xNDQ4Niw2Ljc4OTczIC00LjAwMjc4LDEzLjAwMjkgMS41MDc4Niw4LjIwMzE4IDEwLjE4MzU0LDEwLjU5NjQyIDE0LjYyMTk0LDkuMzExNTQgLTMuMzE4NDIsLTAuNDk5MTEgLTUuMzE4NTUsLTEuNzQ5NDggLTUuMzE4NTUsLTEuNzQ5NDggMCwwIDEuODc2NDYsMC45OTg2OCA1LjY1MTE3LC0xLjM1OTgxIC0zLjI3Njk1LDAuOTU1NzEgLTEwLjcwNTI5LC0wLjc5NzM4IC0xMS44MDEyNSwtNi43NjMxMyAtMC45NTc1MiwtNS4yMDg2MSAwLjk0NjU0LC03LjI5NTE0IDMuNDAxMTMsLTEwLjUxNDgyIDIuNDU0NjIsLTMuMjE5NjggNS4yODQyNiwtNi45NTgzMSA0LjY4NDMsLTE0LjQ4ODI0IGwgMC4wMDMsMC4wMDIgOC45MjY3NiwwIDAsLTU1Ljk5OTY3IGMgLTE1LjA3MTI1LC0zLjg3MTY4IC0yNy42NTMxNCwtNi4zNjA0MiAtMzcuNzQ2NzEsLTcuNDY1ODYgLTkuOTU1MzEsLTEuMTA3NTUgLTIwLjE4ODIzLC0xLjY1OTgxIC0zMC42OTY2MTMsLTEuNjU5ODEgeiBtIDcwLjMyMTYwMywxNy4zMDg5MyAwLjIzODA1LDQwLjMwNDkgYyAxLjMxODA4LDEuMjI2NjYgMi40Mzk2NSwyLjI3ODE1IDMuMzQwODEsMy4xMDYwMiA0LjgzOTM5LDYuNzc0OTEgOC44NDkzNCwxNi4yNDU2NiAxMi4wMjk1MSwyOC40MTM5NyBsIDIwLjUzMjM0LDAgMCwtNTUuOTk5NjcgYyAtNi42NzczMSwtNC41OTM4MSAtMTkuODM2NDMsLTEwLjQ3MzA5IC0zNi4xNDA3MSwtMTUuODI1MjIgeiBtIC0yOC4xMjA0OSw1LjYwNTUxIDguNTY0NzksMTcuNzE2NTUgYyAtMTEuOTcwMzcsLTYuNDY2OTcgLTEzLjg0Njc4LC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk3MDUsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IG0gMTUuMjIxOTUsMjQuMDA4NDggOC41NjQ3OSwxNy43MTY1NSBjIC0xMS45NzAzOCwtNi40NjY5NyAtMTMuODQ2NzksLTkuNzE3MjYgLTguNTY0NzksLTE3LjcxNjU1IHogbSAyMi43OTcwNCwwIGMgMi43NzE1LDcuOTk5MjkgMS43ODc0MSwxMS4yNDk1OCAtNC40OTM1NCwxNy43MTY1NSBsIDQuNDkzNTQsLTE3LjcxNjU1IHogbSAtOTkuMTEzODQsMi4yMDc2NCA4LjU2NDc5LDE3LjcxNjU1IGMgLTExLjk3MDM4MiwtNi40NjY5NyAtMTMuODQ2NzgyLC05LjcxNzI2IC04LjU2NDc5LC0xNy43MTY1NSB6IG0gMjIuNzk1NDIsMCBjIDIuNzcxNSw3Ljk5OTI5IDEuNzg3NDEsMTEuMjQ5NTggLTQuNDkzNTQsMTcuNzE2NTUgbCA0LjQ5MzU0LC0xNy43MTY1NSB6IiAvPg0KPC9zdmc+DQo8IS0tIFRoaXMgd29yayBpcyBsaWNlbnNlZCB1bmRlciBhIENyZWF0aXZlIENvbW1vbnMgQXR0cmlidXRpb24tU2hhcmVBbGlrZSA0LjAgSW50ZXJuYXRpb25hbCBMaWNlbnNlLiAtLT4NCjwhLS0gaHR0cDovL2NyZWF0aXZlY29tbW9ucy5vcmcvbGljZW5zZXMvYnktc2EvNC4wLyAtLT4NCg==") no-repeat fixed 50%/70% 70%,linear-gradient(180deg,#750000 0,#340404);filter:progid:DXImageTransform.Microsoft.gradient(startColorstr="#ff750000",endColorstr="#ff340404",GradientType=0)}body.syndicate .normal{color:#40628a}body.syndicate .good{color:#73e573}body.syndicate .average{color:#be6209}body.syndicate .bad{color:#b00e0e}body.syndicate .highlight{color:#000}body.syndicate main{display:block;margin-top:32px;padding:2px 6px 0}body.syndicate hr{height:2px;background-color:#272727;border:none}body.syndicate .hidden{display:none}body.syndicate .bar .barText,body.syndicate span.button{color:#fff;font-size:12px;font-weight:400;font-style:normal;text-decoration:none}body.syndicate .bold{font-weight:700}body.syndicate .italic{font-style:italic}body.syndicate [unselectable=on]{-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none}body.syndicate div[data-tooltip],body.syndicate span[data-tooltip]{position:relative}body.syndicate div[data-tooltip]:after,body.syndicate span[data-tooltip]:after{position:absolute;display:block;z-index:2;width:250px;padding:10px;-ms-transform:translateX(-50%);transform:translateX(-50%);visibility:hidden;opacity:0;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=0)";white-space:normal;text-align:left;content:attr(data-tooltip);transition:all .5s;border:1px solid #272727;background-color:#363636}body.syndicate div[data-tooltip]:hover:after,body.syndicate span[data-tooltip]:hover:after{visibility:visible;opacity:1;-ms-filter:"progid:DXImageTransform.Microsoft.Alpha(Opacity=100)"}body.syndicate div[data-tooltip].tooltip-top:after,body.syndicate span[data-tooltip].tooltip-top:after{bottom:100%;left:50%;-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-top:hover:after,body.syndicate span[data-tooltip].tooltip-top:hover:after{-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:after,body.syndicate span[data-tooltip].tooltip-bottom:after{top:100%;left:50%;-ms-transform:translateX(-50%) translateY(-8px);transform:translateX(-50%) translateY(-8px)}body.syndicate div[data-tooltip].tooltip-bottom:hover:after,body.syndicate span[data-tooltip].tooltip-bottom:hover:after{-ms-transform:translateX(-50%) translateY(8px);transform:translateX(-50%) translateY(8px)}body.syndicate div[data-tooltip].tooltip-left:after,body.syndicate span[data-tooltip].tooltip-left:after{top:50%;right:100%;-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-left:hover:after,body.syndicate span[data-tooltip].tooltip-left:hover:after{-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:after,body.syndicate span[data-tooltip].tooltip-right:after{top:50%;left:100%;-ms-transform:translateX(-8px) translateY(-50%);transform:translateX(-8px) translateY(-50%)}body.syndicate div[data-tooltip].tooltip-right:hover:after,body.syndicate span[data-tooltip].tooltip-right:hover:after{-ms-transform:translateX(8px) translateY(-50%);transform:translateX(8px) translateY(-50%)}body.syndicate .bar{display:inline-block;position:relative;vertical-align:middle;width:100%;height:20px;line-height:17px;padding:1px;border:1px solid #000;background:#272727}body.syndicate .bar .barText{position:absolute;top:0;right:3px}body.syndicate .bar .barFill{display:block;height:100%;transition:background-color 1s;background-color:#000}body.syndicate .bar .barFill.good{background-color:#73e573}body.syndicate .bar .barFill.average{background-color:#be6209}body.syndicate .bar .barFill.bad{background-color:#b00e0e}body.syndicate span.button{display:inline-block;vertical-align:middle;min-height:20px;line-height:17px;padding:0 5px;white-space:nowrap;border:1px solid #272727}body.syndicate span.button .fa{padding-right:2px}body.syndicate span.button.normal{transition:background-color .5s;background-color:#397439}body.syndicate span.button.normal.active:focus,body.syndicate span.button.normal.active:hover{transition:background-color .25s;background-color:#4a964a;outline:0}body.syndicate span.button.disabled{transition:background-color .5s;background-color:#363636}body.syndicate span.button.disabled.active:focus,body.syndicate span.button.disabled.active:hover{transition:background-color .25s;background-color:#545454;outline:0}body.syndicate span.button.selected{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.selected.active:focus,body.syndicate span.button.selected.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.toggle{transition:background-color .5s;background-color:#9d0808}body.syndicate span.button.toggle.active:focus,body.syndicate span.button.toggle.active:hover{transition:background-color .25s;background-color:#ce0b0b;outline:0}body.syndicate span.button.caution{transition:background-color .5s;background-color:#be6209}body.syndicate span.button.caution.active:focus,body.syndicate span.button.caution.active:hover{transition:background-color .25s;background-color:#eb790b;outline:0}body.syndicate span.button.danger{transition:background-color .5s;background-color:#9a9d00}body.syndicate span.button.danger.active:focus,body.syndicate span.button.danger.active:hover{transition:background-color .25s;background-color:#ced200;outline:0}body.syndicate span.button.gridable{width:125px;margin:2px 0}body.syndicate span.button.gridable.center{text-align:center;width:75px}body.syndicate span.button+span:not(.button),body.syndicate span:not(.button)+span.button{margin-left:5px}body.syndicate div.display{width:100%;padding:4px;margin:6px 0;background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#80000000,endColorStr=#80000000);background-color:rgba(0,0,0,.5);box-shadow:inset 0 0 5px rgba(0,0,0,.75)}body.syndicate div.display.tabular{padding:0;margin:0}body.syndicate div.display header,body.syndicate div.subdisplay header{display:block;position:relative;width:100%;padding:0 4px;margin-bottom:6px;color:#fff;border-bottom:2px solid #272727}body.syndicate div.display header .buttonRight,body.syndicate div.subdisplay header .buttonRight{position:absolute;bottom:6px;right:4px}body.syndicate div.display article,body.syndicate div.subdisplay article{display:table;width:100%;border-collapse:collapse}body.syndicate input{display:inline-block;vertical-align:middle;height:20px;line-height:17px;padding:0 5px;white-space:nowrap;color:#fff;background-color:#9d0808;border:1px solid #272727}body.syndicate input.number{width:35px}body.syndicate input:-ms-input-placeholder{color:#999}body.syndicate input::placeholder{color:#999}body.syndicate input::-ms-clear{display:none}body.syndicate svg.linegraph{overflow:hidden}body.syndicate div.notice{margin:8px 0;padding:4px;box-shadow:none;color:#000;font-weight:700;font-style:italic;background-color:#750000;background-image:repeating-linear-gradient(-45deg,#750000,#750000 10px,#910101 0,#910101 20px)}body.syndicate div.notice .label{color:#000}body.syndicate div.notice .content:only-of-type{padding:0}body.syndicate div.notice hr{background-color:#272727}body.syndicate div.resize{position:fixed;bottom:0;right:0;width:0;height:0;border-style:solid;border-width:0 0 45px 45px;border-color:transparent transparent #363636;-ms-transform:rotate(1turn);transform:rotate(1turn)}body.syndicate section .cell,body.syndicate section .content,body.syndicate section .label,body.syndicate section .line{display:table-cell;margin:0;text-align:left;vertical-align:middle;padding:3px 2px}body.syndicate section{display:table-row;width:100%}body.syndicate section:not(:first-child){padding-top:4px}body.syndicate section.candystripe:nth-child(2n){background-color:#000;-ms-filter:"progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000)";filter:progid:DXImageTransform.Microsoft.gradient(startColorStr=#33000000,endColorStr=#33000000);background-color:rgba(0,0,0,.2)}body.syndicate section .label{width:1%;padding-right:32px;white-space:nowrap;color:#fff}body.syndicate section .content:not(:last-child){padding-right:16px}body.syndicate section .line{width:100%}body.syndicate section .cell:not(:first-child){text-align:center;padding-top:0}body.syndicate section .cell span.button{width:75px}body.syndicate section:not(:last-child){padding-right:4px}body.syndicate div.subdisplay{width:100%;margin:0}body.syndicate header.titlebar .close,body.syndicate header.titlebar .minimize{display:inline-block;position:relative;padding:7px;margin:-7px;color:#e74242}body.syndicate header.titlebar .close:hover,body.syndicate header.titlebar .minimize:hover{color:#eb5e5e}body.syndicate header.titlebar{position:fixed;z-index:1;top:0;left:0;width:100%;height:32px;background-color:#363636;border-bottom:1px solid #161616;box-shadow:0 3px 3px rgba(0,0,0,.1)}body.syndicate header.titlebar .statusicon{position:absolute;top:4px;left:12px;transition:color .5s}body.syndicate header.titlebar .title{position:absolute;top:6px;left:46px;color:#e74242;font-size:16px;white-space:nowrap}body.syndicate header.titlebar .minimize{position:absolute;top:6px;right:46px}body.syndicate header.titlebar .close{position:absolute;top:4px;right:12px}.no-icons header.titlebar .statusicon{font-size:20px}.no-icons header.titlebar .statusicon:after{content:"O"}.no-icons header.titlebar .minimize{top:-2px;font-size:20px}.no-icons header.titlebar .minimize:after{content:"—"}.no-icons header.titlebar .close{font-size:20px}.no-icons header.titlebar .close:after{content:"X"} \ No newline at end of file diff --git a/tgui/src/interfaces/vending.ract b/tgui/src/interfaces/vending.ract deleted file mode 100644 index cd343d6e62..0000000000 --- a/tgui/src/interfaces/vending.ract +++ /dev/null @@ -1,16 +0,0 @@ - - {{#each data.products}} - - {{amount}} - {{(amount > 0) ? "Vend" : "Sold Out"}} - - {{/each}} - -{{#if data.coinslot}} - - - {{data.coin ? data.coin : "No Coin"}} - Eject Coin - -{{/if}} \ No newline at end of file From 2da318a9a5de080d5015b0df4a824e17a86e09eb Mon Sep 17 00:00:00 2001 From: Leo Date: Tue, 26 Dec 2017 13:24:22 -0200 Subject: [PATCH 10/48] Merge pull request #33820 from tgstation/Cyberboss-patch-4 Material containers only insert on help intent --- code/datums/components/material_container.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/components/material_container.dm b/code/datums/components/material_container.dm index d8b3b058dd..2cdbf7196d 100644 --- a/code/datums/components/material_container.dm +++ b/code/datums/components/material_container.dm @@ -51,7 +51,7 @@ /datum/component/material_container/proc/OnAttackBy(obj/item/I, mob/living/user) var/list/tc = allowed_typecache - if(user.a_intent == INTENT_HARM) + if(user.a_intent != INTENT_HELP) return if((I.flags_2 & (HOLOGRAM_2 | NO_MAT_REDEMPTION_2)) || (tc && !is_type_in_typecache(I, tc))) to_chat(user, "[parent] won't accept [I]!") From e1092dd6dee573ac5cff3fe876136aafdef0e423 Mon Sep 17 00:00:00 2001 From: Leo Date: Tue, 26 Dec 2017 13:36:26 -0200 Subject: [PATCH 12/48] Merge pull request #33840 from XDTM/TraumaStats Logs traumas in the feedback database --- code/modules/mob/living/brain/brain_item.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/mob/living/brain/brain_item.dm b/code/modules/mob/living/brain/brain_item.dm index b01c7c09ac..90c70d00eb 100644 --- a/code/modules/mob/living/brain/brain_item.dm +++ b/code/modules/mob/living/brain/brain_item.dm @@ -195,8 +195,10 @@ var/trauma_type if(ispath(trauma)) trauma_type = trauma + SSblackbox.record_feedback("tally", "traumas", 1, trauma_type) traumas += new trauma_type(arglist(list(src, permanent) + arguments)) else + SSblackbox.record_feedback("tally", "traumas", 1, trauma.type) traumas += trauma trauma.permanent = permanent @@ -209,6 +211,7 @@ possible_traumas += BT var/trauma_type = pick(possible_traumas) + SSblackbox.record_feedback("tally", "traumas", 1, trauma_type) traumas += new trauma_type(src, permanent) //Cure a random trauma of a certain subtype From 9a14a721c23d49ab0bc196000cdcb2fc77625a72 Mon Sep 17 00:00:00 2001 From: Tad Hardesty Date: Tue, 26 Dec 2017 11:50:20 -0800 Subject: [PATCH 14/48] Improve parts of CentCom's appearance slightly (#33832) - Fixed missing icon_states on indestructible windows, so they appear properly in the editor. - Increased the symmetry of the Syndicate Infiltrator's areas. - Pointed a few more computers in the correct direction. - Removed unused keys so future changes will go more smoothly. --- _maps/map_files/generic/CentCom.dmm | 573 +++++----------------------- 1 file changed, 102 insertions(+), 471 deletions(-) diff --git a/_maps/map_files/generic/CentCom.dmm b/_maps/map_files/generic/CentCom.dmm index 804e2c7a9a..27a98b4803 100644 --- a/_maps/map_files/generic/CentCom.dmm +++ b/_maps/map_files/generic/CentCom.dmm @@ -2733,10 +2733,7 @@ }, /area/centcom/prison) "ir" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows2"; - dir = 6 - }, +/turf/closed/indestructible/fakeglass, /area/centcom/prison) "is" = ( /obj/structure/table/reinforced, @@ -4392,12 +4389,6 @@ /obj/structure/flora/grass/both, /turf/open/floor/plating/asteroid/snow/airless, /area/syndicate_mothership) -"mB" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows"; - dir = 1 - }, -/area/syndicate_mothership/control) "mC" = ( /obj/item/disk/data, /obj/effect/light_emitter{ @@ -4618,12 +4609,6 @@ icon_state = "alien5" }, /area/abductor_ship) -"ng" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows2"; - dir = 1 - }, -/area/syndicate_mothership/control) "nh" = ( /obj/item/toy/figure/syndie, /obj/effect/light_emitter{ @@ -5648,12 +5633,6 @@ /obj/effect/turf_decal/bot_white, /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/bridge) -"pE" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows2"; - dir = 6 - }, -/area/syndicate_mothership/control) "pF" = ( /obj/machinery/door/airlock/centcom{ name = "Auxillary Dock"; @@ -6094,27 +6073,6 @@ "qE" = ( /turf/closed/indestructible/riveted/uranium, /area/wizard_station) -"qF" = ( -/turf/closed/indestructible/fakeglass{ - color = "#008000"; - dir = 8; - icon_state = "fakewindows" - }, -/area/wizard_station) -"qG" = ( -/turf/closed/indestructible/fakeglass{ - color = "#008000"; - dir = 8; - icon_state = "fakewindows2" - }, -/area/wizard_station) -"qH" = ( -/turf/closed/indestructible/fakeglass{ - color = "#008000"; - dir = 4; - icon_state = "fakewindows" - }, -/area/wizard_station) "qI" = ( /turf/open/floor/plasteel/vault/side, /area/shuttle/syndicate/bridge) @@ -6807,7 +6765,9 @@ /turf/open/floor/plating/airless, /area/syndicate_mothership/control) "sq" = ( -/obj/machinery/computer/shuttle/white_ship, +/obj/machinery/computer/shuttle/white_ship{ + dir = 4 + }, /obj/effect/turf_decal/stripes/line{ dir = 5 }, @@ -7141,24 +7101,6 @@ dir = 5 }, /area/shuttle/syndicate/hallway) -"tb" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows"; - dir = 9 - }, -/area/syndicate_mothership/control) -"tc" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows2"; - dir = 8 - }, -/area/syndicate_mothership/control) -"td" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows"; - dir = 4 - }, -/area/syndicate_mothership/control) "te" = ( /obj/structure/table/wood, /obj/item/reagent_containers/food/snacks/pizzaslice/mushroom, @@ -7214,14 +7156,6 @@ }, /turf/open/floor/plating, /area/shuttle/assault_pod) -"tm" = ( -/turf/open/floor/plating/asteroid/snow/airless, -/obj/machinery/porta_turret/syndicate/pod, -/turf/closed/wall/mineral/plastitanium{ - dir = 1; - icon_state = "diagonalWall3" - }, -/area/shuttle/assault_pod) "tn" = ( /obj/effect/turf_decal/stripes/line{ dir = 10 @@ -7229,7 +7163,9 @@ /turf/open/floor/plating/airless, /area/syndicate_mothership/control) "to" = ( -/obj/machinery/computer/shuttle/ferry, +/obj/machinery/computer/shuttle/ferry{ + dir = 4 + }, /obj/effect/turf_decal/stripes/line{ dir = 6 }, @@ -7520,13 +7456,6 @@ /obj/effect/turf_decal/delivery, /turf/open/floor/plasteel, /area/centcom/evac) -"tW" = ( -/turf/closed/indestructible/fakeglass{ - color = "#008000"; - dir = 6; - icon_state = "fakewindows2" - }, -/area/wizard_station) "tX" = ( /obj/machinery/door/airlock{ icon = 'icons/obj/doors/airlocks/station/uranium.dmi'; @@ -7831,12 +7760,6 @@ }, /turf/open/floor/plating, /area/syndicate_mothership/control) -"uK" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows"; - dir = 8 - }, -/area/syndicate_mothership/control) "uL" = ( /obj/machinery/button/door{ id = "nukeop_ready"; @@ -8081,47 +8004,6 @@ "vq" = ( /turf/closed/wall/mineral/plastitanium, /area/shuttle/syndicate/airlock) -"vr" = ( -/obj/docking_port/stationary{ - area_type = /area/syndicate_mothership; - baseturf_type = /turf/open/floor/plating/asteroid/snow; - dheight = 9; - dir = 2; - dwidth = 5; - height = 24; - id = "syndicate_away"; - name = "syndicate recon outpost"; - turf_type = /turf/open/floor/plating/asteroid/snow; - width = 18 - }, -/obj/machinery/door/poddoor{ - id = "smindicate"; - name = "outer blast door" - }, -/obj/machinery/button/door{ - id = "smindicate"; - name = "external door control"; - pixel_x = -26; - req_access_txt = "150" - }, -/obj/docking_port/mobile{ - dheight = 9; - dir = 2; - dwidth = 5; - height = 24; - id = "syndicate"; - name = "syndicate infiltrator"; - port_direction = 1; - roundstart_move = "syndicate_away"; - hidden = 1; - width = 18 - }, -/obj/structure/fans/tiny, -/obj/effect/turf_decal/stripes/line{ - dir = 1 - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/syndicate/airlock) "vs" = ( /obj/structure/sign/securearea{ desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; @@ -8439,14 +8321,6 @@ }, /turf/open/floor/carpet, /area/wizard_station) -"we" = ( -/obj/structure/sign/securearea{ - desc = "A warning sign which reads 'FOURTH WALL'."; - name = "\improper FOURTH WALL"; - pixel_x = -32 - }, -/turf/open/floor/plating/asteroid/snow/airless, -/area/syndicate_mothership) "wf" = ( /obj/machinery/portable_atmospherics/canister/oxygen, /obj/machinery/light{ @@ -8469,31 +8343,6 @@ dir = 8 }, /area/shuttle/syndicate/hallway) -"wi" = ( -/obj/item/storage/toolbox/syndicate, -/obj/item/crowbar/red, -/obj/structure/table/reinforced, -/obj/machinery/light{ - dir = 8 - }, -/obj/effect/turf_decal/stripes/line{ - dir = 10 - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/syndicate/airlock) -"wj" = ( -/obj/effect/turf_decal/stripes/line, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/syndicate/airlock) -"wk" = ( -/obj/structure/chair{ - name = "tactical chair" - }, -/obj/effect/turf_decal/stripes/line{ - dir = 6 - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/syndicate/airlock) "wl" = ( /obj/machinery/light, /turf/open/floor/wood, @@ -8783,21 +8632,6 @@ dir = 2 }, /area/syndicate_mothership/control) -"wZ" = ( -/turf/open/floor/plating/asteroid/snow/airless, -/obj/machinery/porta_turret/syndicate/pod, -/turf/closed/wall/mineral/plastitanium{ - icon_state = "diagonalWall3" - }, -/area/shuttle/assault_pod) -"xa" = ( -/turf/open/floor/plating/asteroid/snow/airless, -/obj/machinery/porta_turret/syndicate/pod, -/turf/closed/wall/mineral/plastitanium{ - dir = 4; - icon_state = "diagonalWall3" - }, -/area/shuttle/assault_pod) "xb" = ( /obj/docking_port/stationary{ dir = 8; @@ -8987,21 +8821,6 @@ /obj/structure/window/plastitanium, /turf/open/floor/plating, /area/shuttle/syndicate/airlock) -"xE" = ( -/obj/structure/chair{ - dir = 1; - name = "tactical chair" - }, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/plasteel/dark, -/area/shuttle/syndicate/airlock) -"xF" = ( -/obj/structure/rack, -/obj/item/clothing/suit/space/syndicate/black/red, -/obj/item/clothing/head/helmet/space/syndicate/black/red, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/plasteel/dark, -/area/shuttle/syndicate/airlock) "xG" = ( /turf/open/floor/plasteel/dark, /area/syndicate_mothership/control) @@ -9645,13 +9464,6 @@ dir = 1 }, /area/centcom/evac) -"zn" = ( -/turf/closed/indestructible/fakeglass{ - color = "#008000"; - dir = 1; - icon_state = "fakewindows" - }, -/area/wizard_station) "zo" = ( /obj/structure/destructible/cult/tome, /turf/open/floor/engine/cult, @@ -9813,13 +9625,6 @@ }, /turf/open/floor/plating/asteroid, /area/centcom/evac) -"zM" = ( -/turf/closed/indestructible/fakeglass{ - color = "#008000"; - dir = 1; - icon_state = "fakewindows2" - }, -/area/wizard_station) "zN" = ( /obj/structure/bookcase/random/reference, /turf/open/floor/engine/cult, @@ -13152,22 +12957,7 @@ }, /area/tdome/tdomeobserve) "Il" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows"; - dir = 8 - }, -/area/tdome/tdomeobserve) -"Im" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows2"; - dir = 8 - }, -/area/tdome/tdomeobserve) -"In" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows"; - dir = 4 - }, +/turf/closed/indestructible/fakeglass, /area/tdome/tdomeobserve) "Io" = ( /obj/item/storage/box/matches{ @@ -13328,13 +13118,6 @@ dir = 4 }, /area/tdome/arena) -"IK" = ( -/obj/machinery/door/poddoor{ - id = "thunderdome"; - name = "Thunderdome Blast Door" - }, -/turf/open/floor/plasteel, -/area/tdome/arena) "IL" = ( /obj/effect/landmark/thunderdome/one, /obj/effect/turf_decal/stripes/line{ @@ -13356,13 +13139,6 @@ }, /turf/open/floor/plasteel, /area/tdome/arena) -"IO" = ( -/obj/machinery/door/poddoor{ - id = "thunderdomegen"; - name = "General Supply" - }, -/turf/open/floor/plasteel, -/area/tdome/arena) "IP" = ( /obj/structure/rack, /obj/item/clothing/under/color/green, @@ -13643,13 +13419,6 @@ /obj/effect/turf_decal/loading_area, /turf/open/floor/plasteel, /area/tdome/arena) -"JE" = ( -/obj/machinery/door/poddoor{ - id = "thunderdomehea"; - name = "Heavy Supply" - }, -/turf/open/floor/plasteel, -/area/tdome/arena) "JF" = ( /obj/machinery/computer/camera_advanced/abductor{ team_number = 1 @@ -13674,22 +13443,7 @@ /turf/open/floor/plasteel, /area/tdome/arena) "JI" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows"; - dir = 8 - }, -/area/tdome/tdomeadmin) -"JJ" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows2"; - dir = 8 - }, -/area/tdome/tdomeadmin) -"JK" = ( -/turf/closed/indestructible/fakeglass{ - icon_state = "fakewindows"; - dir = 4 - }, +/turf/closed/indestructible/fakeglass, /area/tdome/tdomeadmin) "JL" = ( /obj/structure/rack, @@ -14137,8 +13891,11 @@ /turf/closed/wall/mineral/titanium/interior, /area/centcom/evac) "KT" = ( -/turf/closed/wall/mineral/titanium/interior, -/area/centcom/evac) +/obj/machinery/computer/camera_advanced{ + dir = 4 + }, +/turf/open/floor/wood, +/area/wizard_station) "KU" = ( /obj/structure/closet/emcloset, /turf/open/floor/mineral/titanium/blue, @@ -14417,7 +14174,9 @@ /turf/open/floor/mineral/titanium/blue, /area/centcom/evac) "LP" = ( -/obj/machinery/computer/shuttle, +/obj/machinery/computer/shuttle{ + dir = 1 + }, /turf/open/floor/mineral/titanium/blue, /area/centcom/evac) "LQ" = ( @@ -14546,106 +14305,6 @@ }, /turf/open/floor/plasteel, /area/tdome/arena) -"Mj" = ( -/obj/machinery/door/poddoor{ - id = "thunderdome"; - name = "Thunderdome Blast Door" - }, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/tdome/arena) -"Mk" = ( -/obj/machinery/door/poddoor{ - id = "thunderdomegen"; - name = "General Supply" - }, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/tdome/arena) -"Ml" = ( -/obj/machinery/door/poddoor{ - id = "thunderdome"; - name = "Thunderdome Blast Door" - }, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/tdome/arena) -"Mm" = ( -/obj/machinery/door/poddoor{ - id = "thunderdomegen"; - name = "General Supply" - }, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/tdome/arena) -"Mn" = ( -/obj/machinery/door/poddoor{ - id = "thunderdome"; - name = "Thunderdome Blast Door" - }, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/tdome/arena) -"Mo" = ( -/obj/machinery/door/poddoor{ - id = "thunderdomegen"; - name = "General Supply" - }, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/tdome/arena) -"Mp" = ( -/obj/machinery/door/poddoor{ - id = "thunderdome"; - name = "Thunderdome Blast Door" - }, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/tdome/arena) -"Mq" = ( -/obj/machinery/door/poddoor{ - id = "thunderdomegen"; - name = "General Supply" - }, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/tdome/arena) -"Mr" = ( -/obj/machinery/door/poddoor{ - id = "thunderdome"; - name = "Thunderdome Blast Door" - }, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/tdome/arena) -"Ms" = ( -/obj/machinery/door/poddoor{ - id = "thunderdomegen"; - name = "General Supply" - }, -/obj/effect/turf_decal/loading_area{ - dir = 8 - }, -/turf/open/floor/plasteel, -/area/tdome/arena) "Mt" = ( /obj/structure/chair{ dir = 4; @@ -14663,26 +14322,12 @@ }, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/airlock) -"Mv" = ( -/obj/structure/chair{ - dir = 4; - name = "tactical chair" - }, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/plasteel/dark, -/area/shuttle/syndicate/airlock) "Mw" = ( /obj/effect/turf_decal/stripes/line{ dir = 8 }, /turf/open/floor/mineral/plastitanium, /area/shuttle/syndicate/airlock) -"Mx" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/syndicate/airlock) "My" = ( /obj/docking_port/stationary{ area_type = /area/syndicate_mothership; @@ -14729,20 +14374,6 @@ "Mz" = ( /turf/open/floor/plasteel/dark, /area/shuttle/syndicate/airlock) -"MA" = ( -/obj/effect/turf_decal/stripes/line{ - dir = 8 - }, -/turf/open/floor/mineral/plastitanium, -/area/shuttle/syndicate/airlock) -"MB" = ( -/obj/structure/chair{ - dir = 4; - name = "tactical chair" - }, -/obj/effect/turf_decal/bot_white, -/turf/open/floor/plasteel/dark, -/area/shuttle/syndicate/airlock) "MC" = ( /obj/structure/rack, /obj/item/clothing/suit/space/syndicate/black/red, @@ -19313,8 +18944,8 @@ lI lI qE qE -zn -zM +Ax +Ax Ax qE qE @@ -19575,7 +19206,7 @@ zN zo Bf qE -zn +Ax Ax qE lI @@ -19823,7 +19454,7 @@ lI lI qE qE -uC +KT vj ya qZ @@ -20355,7 +19986,7 @@ DZ Eh qE qE -tW +Ax qE lI lI @@ -20598,8 +20229,8 @@ vj xu qE qE -zn -zM +Ax +Ax Ax qE qE @@ -21357,11 +20988,11 @@ lI lI lI lI -qF +Ax qZ qZ qZ -tW +Ax qZ qZ qZ @@ -21373,7 +21004,7 @@ qZ qZ qZ qZ -tW +Ax qZ qZ qZ @@ -21614,7 +21245,7 @@ lI lI lI lI -qG +Ax ra qZ qZ @@ -21638,7 +21269,7 @@ DD uE Ec uE -tW +Ax EX qZ qZ @@ -21871,11 +21502,11 @@ lI lI lI lI -qH +Ax qZ qZ qZ -tW +Ax qZ qZ qZ @@ -21887,7 +21518,7 @@ qZ qZ qZ qZ -tW +Ax qZ qZ qZ @@ -22411,7 +22042,7 @@ Ee Em qE qE -tW +Ax qE qE qE @@ -22654,8 +22285,8 @@ uE xz qE qE -zn -zM +Ax +Ax Ax qE qE @@ -22909,13 +22540,13 @@ vn uE vl uE -qF +Ax yH yK zQ Az yK -qF +Ax qZ qZ qZ @@ -23166,13 +22797,13 @@ qE uF wQ wd -qG +Ax yI zq yI AA yI -qG +Ax qZ uE qZ @@ -23423,13 +23054,13 @@ qE qE vn uE -qH +Ax yJ zr yK zq yK -qH +Ax qZ qZ qE @@ -23687,7 +23318,7 @@ yI AB Bi qE -zn +Ax Ax qE lI @@ -29582,8 +29213,8 @@ qI oT rZ rZ -rZ -rZ +vq +vq vq vq wT @@ -29841,10 +29472,10 @@ sd hl vq Mt -Mv +Mt uc Mz -MB +Mt yh yS zw @@ -30613,8 +30244,8 @@ kt vq Mu Mw -Mx -MA +Mw +Mw MC yh yV @@ -30867,7 +30498,7 @@ hl hl hl kt -yj +vt vq vq My @@ -31126,9 +30757,9 @@ hl kt kt kt -uK +nz uJ -uK +nz kt yj yh @@ -31383,9 +31014,9 @@ hl hl hl kt -tc +nz ll -tc +nz kt kt kt @@ -31640,9 +31271,9 @@ kt kt kt kt -tc +nz uJ -tc +nz kt rd kt @@ -32663,7 +32294,7 @@ kt kt kt kt -pE +nz pY pZ rf @@ -33427,8 +33058,8 @@ kR ll ku ku -mB -ng +nz +nz nz ku ku @@ -33447,7 +33078,7 @@ pZ ku ku ku -pE +nz ku ku hh @@ -34212,9 +33843,9 @@ rh ku ku ku -uK +nz uJ -uK +nz ku xH xG @@ -34469,9 +34100,9 @@ ri ri ku ku -tc +nz ll -tc +nz ku xI xG @@ -34726,9 +34357,9 @@ ri sj ku ku -tc +nz ll -tc +nz ku xJ xG @@ -34977,15 +34608,15 @@ hl mA hl pG -pE +nz qP rj ku ku ku -tc +nz ll -tc +nz ku xK xG @@ -35240,9 +34871,9 @@ ku ku ku ku -tc +nz ll -tc +nz ku ku ku @@ -35497,9 +35128,9 @@ ku sk sk sk -tc +nz ll -tc +nz sk sk sk @@ -35754,9 +35385,9 @@ ku sk th ue -tc +nz uJ -tc +nz ue xL sk @@ -56602,7 +56233,7 @@ Ep HM HW HN -Im +Il It It It @@ -56611,7 +56242,7 @@ It It It It -JJ +JI JQ Ka Ki @@ -56859,7 +56490,7 @@ Ep HN HW HN -Im +Il Iu IF IF @@ -56868,7 +56499,7 @@ IF IF IF Iu -JJ +JI JQ Ka Ki @@ -57116,7 +56747,7 @@ Ep HO HW Id -Im +Il It IG IG @@ -57125,7 +56756,7 @@ IG IG IG It -JJ +JI JR JY Ki @@ -57373,7 +57004,7 @@ Ep HN HW HN -Im +Il It IH IH @@ -57382,7 +57013,7 @@ IH IH IH It -JJ +JI JQ Ka Ki @@ -57630,7 +57261,7 @@ Ep HN HW HN -Im +Il It IH IH @@ -57639,7 +57270,7 @@ IH IH IH It -JJ +JI JQ Ka Ki @@ -57887,7 +57518,7 @@ Gy HN HW HN -Im +Il It IH IH @@ -57896,7 +57527,7 @@ Ji IH IH It -JJ +JI JR JY Ki @@ -58144,7 +57775,7 @@ Gx HL HW HN -Im +Il It IH IH @@ -58153,7 +57784,7 @@ Jq IH IH It -JJ +JI JS Kb Ki @@ -58401,7 +58032,7 @@ Ep HN HW HN -Im +Il It IH IH @@ -58410,7 +58041,7 @@ Ji IH IH It -JJ +JI JT JY Ki @@ -58658,7 +58289,7 @@ Ep HN HW HN -Im +Il It IH IH @@ -58667,7 +58298,7 @@ IH IH IH It -JJ +JI JQ Ka Ki @@ -58915,7 +58546,7 @@ Ep HN HW HN -Im +Il It IH IH @@ -58924,7 +58555,7 @@ IH IH IH It -JJ +JI JQ Ka Ki @@ -59172,7 +58803,7 @@ Ep HO HW Id -Im +Il It II II @@ -59181,7 +58812,7 @@ II II II It -JJ +JI JR JY Ki @@ -59429,7 +59060,7 @@ Ep HM HW HN -Im +Il Iu IF IF @@ -59438,7 +59069,7 @@ IF IF IF Iu -JJ +JI JQ Ka Ki @@ -59686,7 +59317,7 @@ Ep HN HW HN -Im +Il It It It @@ -59695,7 +59326,7 @@ It It It It -JJ +JI JQ Ka Ki @@ -59943,7 +59574,7 @@ Gx HL HW HW -In +Il Is IJ IY @@ -59952,7 +59583,7 @@ Jk Jt IJ Is -JK +JI JP Kc JY From 20b8f9c87f93e86a5000df36d7643c73c4d0afea Mon Sep 17 00:00:00 2001 From: oranges Date: Wed, 27 Dec 2017 18:49:45 +1300 Subject: [PATCH 16/48] Merge pull request #33833 from deathride58/please-repoban-kev Fixes ghost zoom being broken --- code/modules/mob/dead/observer/observer.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index 4481de1e36..8bf80eccb8 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -471,7 +471,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp set hidden = TRUE var/max_view = client.prefs.unlock_content ? GHOST_MAX_VIEW_RANGE_MEMBER : GHOST_MAX_VIEW_RANGE_DEFAULT if(input) - client.rescale_view(input, 7, max_view) + client.rescale_view(input, 15, (max_view*2)+1) /mob/dead/observer/verb/boo() set category = "Ghost" From 4a93756e6b94fcef5684472cac36be38f67af88c Mon Sep 17 00:00:00 2001 From: Robustin Date: Wed, 27 Dec 2017 09:25:02 -0500 Subject: [PATCH 18/48] Hallucinations no longer show open doors "bolting" (#33859) * No more "bolting" open doors * Update Hallucination.dm * Update Hallucination.dm --- code/modules/flufftext/Hallucination.dm | 2 ++ 1 file changed, 2 insertions(+) diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 92dc109bbc..e55b7ed183 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -714,6 +714,8 @@ GLOBAL_LIST_INIT(hallucinations_major, list( for(var/obj/machinery/door/airlock/A in range(7, target)) if(count>door_number && door_number>0) break + if(!A.density) + continue count++ I = image(A.overlays_file, get_turf(A), "lights_bolts",layer=A.layer+0.1) doors += I From 70be709675672f21237b56fd706c3b4b5a10d3cf Mon Sep 17 00:00:00 2001 From: Leo Date: Wed, 27 Dec 2017 13:19:21 -0200 Subject: [PATCH 20/48] Merge pull request #33850 from nicbn/sprites Radiation sign no longer has blood on it --- icons/obj/decals.dmi | Bin 25866 -> 25747 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/decals.dmi b/icons/obj/decals.dmi index 31e700d23d23942d3414e0e3f3a5eab03a89c886..a5c487a18437007c0ad7128a5f7c1d7ba14cf71c 100644 GIT binary patch literal 25747 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�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 KrbyZ(;J*ObILJEy literal 25866 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 DbPBUS From dbab8bbdab46b0899c19b642fce956da6ac5ac6a Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Wed, 27 Dec 2017 11:49:49 -0500 Subject: [PATCH 22/48] Adds open/close sound to blastdoors and shutters --- code/game/machinery/doors/poddoor.dm | 45 +++++++++++++++++++++++++++ sound/machines/blastdoor.ogg | Bin 0 -> 12688 bytes 2 files changed, 45 insertions(+) create mode 100644 sound/machines/blastdoor.ogg diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index fd66892048..34564032e3 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -8,6 +8,7 @@ explosion_block = 3 heat_proof = TRUE safe = FALSE +<<<<<<< HEAD max_integrity = 600 armor = list(melee = 50, bullet = 100, laser = 100, energy = 100, bomb = 50, bio = 100, rad = 100, fire = 100, acid = 70) resistance_flags = FIRE_PROOF @@ -15,6 +16,15 @@ /obj/machinery/door/poddoor/preopen icon_state = "open" +======= + max_integrity = 600 + armor = list(melee = 50, bullet = 100, laser = 100, energy = 100, bomb = 50, bio = 100, rad = 100, fire = 100, acid = 70) + resistance_flags = FIRE_PROOF + damage_deflection = 70 + +/obj/machinery/door/poddoor/preopen + icon_state = "open" +>>>>>>> 97881b6... Merge pull request #33858 from nero1024/blastdoor-sound density = FALSE opacity = 0 @@ -34,6 +44,7 @@ INVOKE_ASYNC(src, .proc/close) /obj/machinery/door/poddoor/CollidedWith(atom/movable/AM) +<<<<<<< HEAD if(density) return 0 else @@ -64,3 +75,37 @@ /obj/machinery/door/poddoor/try_to_crowbar(obj/item/I, mob/user) if(stat & NOPOWER) open(1) +======= + if(density) + return 0 + else + return ..() + +//"BLAST" doors are obviously stronger than regular doors when it comes to BLASTS. +/obj/machinery/door/poddoor/ex_act(severity, target) + if(severity == 3) + return + ..() + +/obj/machinery/door/poddoor/do_animate(animation) + switch(animation) + if("opening") + flick("opening", src) + playsound(src, 'sound/machines/blastdoor.ogg', 30, 1) + if("closing") + flick("closing", src) + playsound(src, 'sound/machines/blastdoor.ogg', 30, 1) + +/obj/machinery/door/poddoor/update_icon() + if(density) + icon_state = "closed" + else + icon_state = "open" + +/obj/machinery/door/poddoor/try_to_activate_door(mob/user) + return + +/obj/machinery/door/poddoor/try_to_crowbar(obj/item/I, mob/user) + if(stat & NOPOWER) + open(1) +>>>>>>> 97881b6... Merge pull request #33858 from nero1024/blastdoor-sound diff --git a/sound/machines/blastdoor.ogg b/sound/machines/blastdoor.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2de1b55999c42dfadb1cd9f4ecd936547e7da8a1 GIT binary patch literal 12688 zcmc(GbzD?m*Y6p+MH&eKK^S^yP$U$Ap<`&IJET!cB&BQUkVaA@h7b`!x*O?k1O-IN zd%)lGKF@vc{k-?jdp>*iXP>?HUTf{OzH6U#X7;F9S!n=hz(3cor+*t}S`v>T^bn8d zE~YlF*Ike&W&aHEgxoahAu881|LeM*c}T*b-4QAt&k z0mjWI%nTAVySRArQn9xJM7$QbcKF#pPiNEixU?~qRK<2Q$OhL+Bx7vBbQjlToRA!N|j(=4Q0_LD9 z7=S+;Zgk$dyzPLf6%}i=OSY(uvPcmFcDUN2C~oWVeKW_xnnF9r0VoR&p)Mu>8dg${ zF_=vKx-xyk7(xYBp|mbtj71qPc2-)eK4FbJdK% z6=CCAW)+{X41HV&L^m@2sc>)B!2s$ajYVxvERA!`{tdJ+#RX*bcUcU8Ke$XlHjYgG z16l6}+Wui?m7knyq=LizG8&pn2=H<@)b_BL^l+c_@YPKT*01-~tq<0p3N}0mHlYgn zr~LL^IJqu2OJ{%p+4n?~R-m~|cXF3SbJ2rB%FqDwYm+eG#xp_V^W+OHZ7XcjQP!m> zhu$jA-YSBdAs{F)uC)QOZPE(=k7B8tWbywllGa`9fFx+kPG{OqXJ#37=1vz*>>CSr z0iaJM)j8W;1Y}(WI$a-vMb_;}H&U_xNb%OcoN(=S0FZ>ywmZ{ygVs>z8g&uWb`_s= zRhk4%aczb^IGd3)?BZ`a;9T9IwDorlWMC@{na*0l%mND=}bP1dhHl1$QfNKc0 z{+MTc@5jCF`|t3P1pQ_*Mb(iRz~CE=WlF|a$e2Ly7DJSf4eNsD(?>-=g%<~^s#CKT zxCPv-oB;rWh;LB*uj&TMe^HztAI{#xR^7+f%XwXuwGD{vRJIX6CV+t`<`e``996rX z46r3QSqOSJ76BXO*i}>W$*{B z8VL(nhWWTO_{9;L2yG7s-DLNfx?sa8_k~H{g~=!*%8>sKtpAD}01TR-o0vqJM#4HX z0+pq4|2p_zk>gC(8Asb4$E;ArtTe*e|5HHaP+*u;MomCTgWPbK+GAioyPxX`LD>4bzuez7&$U7 z%>NNNEil^0U^G>6Djoh^qxdjrP&XOM|8xKVw8Ro9-0UN2>RjXMg5&C32u<<-IbuNS zxPa2A0BG1m0H6kdd!Unph{IiCr5(j}aA51qm^q?YIbW%Qiir6ML*Gb+ z2o4w3*~p(L21c<6M>7z%78=N}iQs_S9tNNW0RFHp*jFl-0r~FiCj&6tOk|fRYeB+@ zJd`VmiXX~SNMg2t2R~;hmK-8U1^}i6>Uhv#r1}7K zJyyL3wnnQC7cI)r7!bvw3+jPkWd;&M3urY4pq;cqeNt-~fkRSk0Km`!0YB1g0_HLR zF)Og>#5|ZFpg_i=Kq@mxW-&>sG?^&SFCeI_9qbz19{IrwY7xOPs|Yc%0tnDP%RC9)etDNhA`B&_;!NOrSQ|A3|{)> zyF_)(d2-wxq?$}vnAEv1u-T;9*yg?~Nn=6ORLJxN;r2=?@AiWd#WnaD@u1z`}l2~JB>~y6&0mbyVuml@|_On zokm`tLTGPc>2_mrW256vqjMk1fi|yXyP3VWwX&ybf2WbB#+^|O;Xa2nT+s&C;b7#M zrGFA!5RTTLjLI$9Ze;Im1_i-pJD$^ilxX%MrwGq@3}Z!_d;!mt=!mErBQ zNL9EkBXW$rgF!P|zAGbv1a1vQj;Lej6sW@Oa*z}1b{`7IO!pY_Dd09-$Pqo;;*K%B z$lGSbd>i@Z1M;{9HP-}?)kbzcku(07pBPh*0tsdgpT^U?_y4tW zQ(LZ%3Dfdx;p`t0<3Zu;(|VDj$PrVJRlIs6I78pQp)ko7B&4ZF)UHpv+6(>~(<{4{ zp#VN1Tw@xJwZL7+A03eN$F<15-a@X!R_cxVfV>T{OP?q^u5_O$Yq5)>G!%;Hlfq%C z9T0^=+b2YESPCc<*ty!Z?4VF^6UgGF6H6*xqd zPi98UR6qs#rGU%~v@Mk@ku*EC*?<%qG)NWB4h<%T%d-@KxhNhjn9tb{A$4d$h5qg% z#ssDWun-0}O+NP9L5gtJ;@6->%iTdJ6tws0*_PK#N#c|TPw*+QfKae3|C*u)rog+P zLc2Hn2n!I44MFe9o|Gj|P$%LeyMG~ng+o(UJl&Ottfb}%60 z)j@IKl8RjjK-;xzT@#Rcy9^*S>;*lDL0EO@J%*RJ>)2H=7EG9y2~L6_u3b;FgM$RS z{ssV;#l!|G(P?CaSgCN?1VgNg>{Z&v=4-v6hTzFj#8x&N#H$p1>3ZuJ(}Qz?ys=pdCe&>~DPlMUHDlMJrljPc z1rvG^Twut-!CTWv!4P$DNc)s&87zN99gI&ZvobJ%^z1;@?YN+|6Q+^1p#8xeV!|{+ za6%6sSafs({N*a0LlX0=TZb2Ke9Z_Z+tN4IzJ4)K2Yr!!jTXiya1d437-0+o-SD?B zDE7blh{ZPkLJI`c#@}&BRp}dO;pBjQP&yD~Y&R_yu!Z|Kfx7`?5DA#dAwkZ6`;a7{ zjGOchseX+}&@|VC8>rs2a2c=7bu*ap@7(KL5QHfD^)7sGlR2-4$zEWo6TMP zqx0HU(3zi@2jzcV#bCK1UspIde_vHFZrXp}uv_^4lCR&euf?1jo}gr5FkUVJ7$*-5 z#>36Z%`X6ja`ADq-M=ru3*)%YasNIyFSj6f1uK-5o%KE!Hx~~(yO1y!lt)02mv4Ry z3Waj8@d}9i`Z*gA*VA+K+2>KlhLvEf@?p1T{%Q=yT}qY4gf&-mDRgGM+Af zX4>oYwRbSb!naa|@QE@!u)CJGAfoQxbn{5t($mBK=_vEvSi-ptZM$!uiYL7AfXt$# zw;PgZWT8vz*=1Wb3imfphL}X+9o3S;~I+rS|y=yYnR9n!Icr1+W_4Zj#i1 zOW{;ZmreVNkfGVKm;>E>GST)m7n$@cMseltNr^WahcD8mQQoV8gU|5J(_SJfJ~w7q=319QiXcco0Y6LD5uuLgWt2#t##^1=Bdzq1U_K;YIu`oCt@%z4yX1 zVPIvBm5?TrMo8jn%8HCNQ|*TsfDtiF{;uOz^bcIZuPxucj;C$io83w_IfXCJ zH4}f#JrqxyB0kJeD{R+$)$mateK*Nud@TBR%#_eu2|LCb`fLih!OpZ$n}^@``ZWYE zMN5=y<0F1fpSX{_jfMbY@xIubl$Vc@%b~V@=w)aJ_Co?a;jXi{E8t{ zT@oKSh&Ck%Yv>pI4(@ol(DcIgEi90Vz1d>+n&suit?FwQwO;PJ0rCwr$XnQb9-lIm zEZ2<2ty8aNWdnFI4N&K6k>LV<`$@*T-pd7FJzb|QC6_ILqpUAa!cCN}7}=hR_@OX! z@v?b@8;Z@x?TcO4t#j#8^OseQX3(SfKxZCPGSpqZ&zbttjE+PjBKnPblkv-Gx^8)$lL_nsyeuk1IJL7Jj{ zDWi1WydrF;A0TYOC70}tomPS?-7ZhzfKzO#uzAMo-zGx)8gRin6nuUwkcmwq2ROh> z5#10>8~SRI%2!u(u^izmC2%#a2=W>Zrn`_jmzI+?!+!JHl_dL>UHJW{wl5m@cPh-g zs~I*9&YP8;)jbWuuuCY;S)uO2kk#l~e4N60CXbY>VShIYfk>O@6EcR|AIB(@&N|C% zqT9o_Rd~laeP4?u2&9LX05wU$q$x!#0h4FI4l!=zTon)5t_KeJRek-N3ByU(%|P}? z4tg6j`4=m=zhYw~@-WV$+asWdE*7tIqE?KE7I8wZbctA3!ez#2(v-h@?EA5}E+<+E z-!3T~$7u?`pm~RX+16H+azfNX&Ko9v!fn1~m0$F&)`;URxxOQs2Rj02%DO1hJH3C| z7JyW#$5y3MM7Pc25gZ>aPSHi?JHcf-zu(!1^u{r9paH8{!-Q`fE^kR${l;3vn z-Vj5S3kI)p?!o6*J2xnaaeeq8v+=>f-COUjZqIJaj{0+Cd(>DOb0u`Wor_*O&D;G= zD)H9;kQJzj|AF>`G-!=pQk1y`aTefW?B4f`$CHssyg`E8i_J_?yGu9U!v201iw8fh z!cp2d!Rj*-uf6x4Kn!0~MpGu6^K^8b;GM8Q6W3#+bcj zc4N81$$aTLFtW6=af`jQ?`*+J0O3vcV_9i-uST25M`Gt{6Z&zTg*|?A8*n*m|4y=sQy}^0lLmd8 zVD{PAOdCcSVAJjLhY=EmVZn6w!Czv-*fSLF!vG#fA#ReiEiEd=MjuN zACT#D32abA>^r1Ac5v)QeAYtqqGZWciK~MnkNJ}6yhDI+=tyDSsh&UMvqwN1B}EiQ zex?gkYUe~QLnP`Q2miuT*#JMQkS?>N29=Em$Ir=0H)WQ(PLrHv2OXuyG1GZkg z@Pi>B`F_5)P)FsLcIPr7vp_~AcIAGts3@1wDMcrz+3$*CGdU(b%JN4U(c%%BI(x6E zls%2lfeL@Umc~Jm^c5PG{b_uNOxS$)z@HNTxj`|Y$*aBH-{ABW&Uaf!+|BXU(w9O^ zPD6QSyyc5W{X01q5tChAtpotl!##o!b$VAmz|`LiT@F(d2-~L})`xZ@+oQ#ZpJk$@ z2tV2*es!=6j0Lz;=J>5kz?qHDXz$+jH;X-!vC7E_dz`b{pV_9&J!?ha>3ab*Ssv4E zrd_qEec#AqdTln;CvKCjyR5e)UiQLq0Jdm#=*pRd^ zGe-XM$z8&@4z5!La=<5~S8TMe;}Vzo%gYmeZJ%DOsOon{GKY8jU7K2KI`cRRpv z%Tfpo&`r7uTBfqR)xyqzAs252or_h)5*#G|xhi2^VdHHs0<$Z{0{UDo@QoiZYq)G5 zk3cYBP94qrSwVuzul56<)w)=X&OL6Z!8M=bJjFVKPAI!AWct-F9S1^={DOn!w5Xr4 zNiI(M@&nfoW}I~S{^N(@y}U#Q$Ef7rwk){SC%@Et@@2k!(CggJoh_-+LyvU9M~Yh{ zTta-SFBk%Kuog5mlDsO2SREi6SVggG;Fo z-wFylIge}Y@wbVamYvhAO{Hjl#Uwb=3nt*a$6DU)><)2rb8@t=u}i%ZWT;Y#P&`?+u- zsR9mG4sER?p}J?wubIAz<>&KuJIXda;PjS1favgEDx(qVa2r@Wbyq6B^UZ>1s=Gug zPu7<+<{_)uc^l??j)8!vkA8%u80TKW1hj7T%bzFwl{kL|=@+c|LCX15Ik+iT*@}?Kk;f^ocgr>&1dLr)HvhR@rZDkkDAH9 zms-4etcXTPxM~L7bm6R==kl3@tS5I}g%OjYwQOBkv>1~(iJR|B46fcEe8FjNx??mO zU}@_kbR;Rn*mw4fa4ZVPS{q#^(DMHLnlj5W805O>*#B)}9@8F@a9=nhXsl#XnfnEQ zS@&W$ZZTIMeT>U-{#3qpztNX`Q>%=^IEt&$_2Q83N|W~uD9H%+4tkS}YVSt;2~K2$ zLy}Sk`$Vsqx^2o%9^9&?Ev&M`Sszb{@K)#AZ+q%dMH;|^)>46x448c$8ZP`end4|^ z4-JS!JkuKx$>WNB>)kwmDRh#OQaU{*syN)8*yCdNx-T@8(Fn;s z4GqK?>2mexaC3g1AsOd!IX%42EK(>jA7=21Fej{AP^q5>*-YUpu_^?6XLD-75v()b zLm2w*Tx^o1n;;cZU|4IDR#mZuR+L=)2Ui8n$VV-AkDd!s)%F-U8z`3QxZLh#XmKRjJRH2$|$ z`TdtEy|$B&y=I%b3;NAE?rt1)df*Qq+0~SyxdkY2iMC$cD&+!_8G!Qck4|I}Y{#=3 zm(`x`9r{Uo=zZNRM;s&U`RK~(+EEs_oLu`N`~DOh$39#i zE9AU??-r168WA{O63@D)^8>wpl~?j2Y17t%R@}U!@!reUrRO7<8y{Z8Y8J~T8>2Vr zU0}&EKJyT<>h~Wwus=Z1q6*CJp5%EYHk*>=W(AkNn=$&HxP%oX9Z?2pAvZanBa2O9 zEt&86m0~eu_}esH%tOz5d0&NMcX+F)>ib|1G*Lsa1_7+vLc_b_VU!j>&hS(z_?Od# zs*d;#7J`l=Vku6o5F7e(Vr$;ams=kacGIh2Pd|S@!v@OqE|4J{22Rm**`xVFWW3}W zYg5U2>}KVen1bE|#7muJ()JXyYaNCe^lV}MV*x8o(b!U&0)QAtZ6t{?u;`%Gq?qni zA={^DjENJ2;NFsMjbv>6bIC_$ab`rhFM;Y*7pXI!x399V`h2DQR3)TseXPaU@MCy1 z_lIO#o74OvTrUihH`!?$f;(dO=LbVyniVEJxc7~J-GJpmD9W1i1YI5S(lOMCwL#+N zZ97GxdwF<`w_YlosHoeyU^Py7an>#ggs-%^l3|KBn5BQ^I-oBjC~6P-GJR$8GRo@t z$2)R*?{~Ox(f1Y;6@7ePCR#hDRA8kQF8D#kGsNn2lOWw|LEVVPyE=T0^OMZ8#8LrH zkHlYCQ?W$SseYTO?v@nVdoj11zXGnklzxaD=(MN*p&`-7U* zsPDCupy(H9D*yQrza`+`UooJA&EjWABV-%XOB2(Rlk*GHvkSvxL#@3nwJ#o>%cyn0 z0PDBO7`dbskkNSp2I^6^$kA{ptRFWTRpe;4^<42*H9}ETyq>o2&wM+Jv&dn#9$cAU zk5_rV*cPScgdwm{LwjG6nbab-(DM_n`J-pBU4OFriG$F}=SS=W8i5MMGY3oydwD^e zB4{VUtiDf*2wqs+b#_*gsU2#wOp(ynwXjaX8h($CtLSdY5Y9gyryDxJ1rMC&E5W4e z;!86PG9+nD=A@i;?8>wvwYnOORE$(e<8!B|Y1OuUo@FvzMnm7q`|y)|q`-TI^gBEZ ziq!7Rc8U%wLNz6CP^EzY1h^!i$cxYb4(7tm233shi)==9`G#B7XL}U-ufG56m^)ue z47Id)XvzGUYV=`)mgRcLFQhr)Y_JB~y@v7FPT)fkzMI3iA?}GAf#QY(8*L?y;mKEHeAFM4eNPXPeTD2Ul5@R{{)@Kv&V`wwh7^eEDaKrQw-(M$9t9oP-~HP82bn?9|yS%9LM}t(f$zFk zM9b@c?4DY~Op|&m5@ATK5*le1-gduV>V$!*p8xXCh2aCbo_T7|u&nq8P9r7OG%BJ6 zrr~z)17A-5+IexM_1%;uH9DMlr6MljBq94#_Q2E6-?)e9ieg#&jc>UmKGP}DHuj11-Z3GX>`s2~ zkIp~}JZlm}bgp6e`?`v>g=#}vrj!$4cXWHDA-h+e%>53%_UR7EsEdUD?xww$j`FCe z7?p?3ui~o)QS)D)i2uqic9V?L)tp$4%t`z+&+rXjev5m4zzb#_nWp`657@@8?%;#| zIm0#1E^T-GR;ZG=s5ydb`L3Ib{VqA35XXErds4ZDE5v-^&?`GF5!e*@1&~vcpv-N zV|qBd3$HsoR96bG@`3`F-sHm;Bfx zEhT)sW-dK{5ob~@VEfj*?6X-){XpWAgrWPPo^_oD^GW)u{{Ga+>0YFR_G=u zG>8J;&)Xq{YN)a2c6ie2y-hCrM!GDlbX9!T*7#lr2!9O~3H5OcF`wj)3AV(6G5$!y7vq2fI>`Jg%D8&7oUmAhqkUE__O!Z2Oe&uuPioOC<4rwM&dQhj!_0AqexC0X!;CvCDg3dAw*15N1-yFLEnc9?g}W)wQq zrxUeWMg_3_F1`DGPF)ACuAces8O{$zcw*1M>%xj26z--A7Rf~8(M6ec4BhUv$qEeH zCaa^`Qi}RiXFr_iZ&nVGNsd|0)z+5AnDse-(|(pl)8ndi5=@}HnI4SJspUB^j*Q=b^L7E|`C4-KAgKF1`~rT~AV(AAyzQ;}B=r+Y zshw9;wZ@JHctq3QXt7}|DCsu1?pX{(?&)lyNpciVs4gB|*@eDs&g3S12*Y~+^HWpS z)aTvzdpzssw>)}J1s2l6x7@RG2!-=Ic)2H)(w7odF;EGo_vBeWJNJ{YldipJ{rPk` zB!WETZs8aY2}0?+CE;{^`^oQ)-Cph(FPp6#ZHmy|fRD;ArPcY5%bgHZ0fSFtL^Iuf zZWu_kYjP(+Y^{D$O1ijCB~}@HXsvvwTc>LFX5{ofZXdekVh%JCtt&phfU!LdU&(~=N)!} z~^K7G4E-gT9kIXO#k^{!GjWn(6- znI7|fOYKP`+>$OYXlT9`^SG=qD5Fl_#<}y6z3gDF=>%}uMWCwkL$Zyy4gB#4qobmf z-C-@9>;OX^jq;~&T%EWewF)*uz)|mk1R`@}c(mP7xHu)yRCNH7Q{TU@t85tYy<4%> z`5X_+hRvFj>#ADJUSCw>Y4dIX!VE6bz$5d-&0H~ne*2@^w#*)rC{e!s^ZH*>yK}C# zkL$BvWnf^QHC(-$j*{9Vde(Pv=>6<@j9I54ki<-J1Mt+=^t8Z* zM%S0{2&(VzW1VoauEf7~(J-k+Nt4^})l+X9scm*y=RV$|6ba9o3NI6p3-d9C^)W%_ zZ7?he)`1ou3$>FO$Yv?3vcm4U$k*csgPe+A) zlWML)b|}2Oz==NHWhM}EZ-2Ok6t8e}?5)b}IQI8pDC_VKUJudNHB>W^TG@3I)wVq8 zq9i|5CG@`(SiYBn3s<)%6A@t642=dAxoEo^n3|vtyRd@%-)4N(T3WQ-lOjPK+I$=o z=N*EI4zJmnJ8Ptqf9eA^lkMb~Bw&^+Xu`3P?aIGPwk}ag{3*4&GfW1f+0)Uq+#fiB zEYYupEIJ0j8J>bc`A76oH-N2SeA-&}_1&ut-=2>mXI9MpF())O*cJrME~u*u^V*&* z^VF`RDOZ_VxihZ<_2ES9l;oT^=Q@^6Loxs1#c7?w`ddarZJjc|Onp=FzU9`D%tf^SgyF%VRZ6#uIFQ|6BlNFszdJohA7X z1x*=y?+Y{qyU@HZ_R!N5ow;?6k74mnlav_0^Ugyu#oOn1h#F}k`^1qCCOa|An^FPHHClZ8HJ!d{!aMC~-Rh0ZD?zu|<`D}z@rUt~IT)-8B1Ou7Uc zmbbQPMtoMEd)AxnZo`FT+Is5C6FJhPkGflbAI?d%+*{yZMlQ3w^O|*myWF{|gi^B4 zbfF}~R!;O_EFmoEd|KW|84;%ylr=A2b&TYG=PXO2%fO0b@#Ac#aH>runcayzHzq+Vs_<8Nx3X?{^l4v+dwIi^kM;*mb*w8P@TR34SSkc7l7 zGh%c#U24kTCAZAOGYW?Kc1Js5QK@Wa4UqOuT1_h)5!Sat$=DO3f`d;eB;NDGu&bvg zBER0E^;*!{2oMlcHeY>gi_v086 zyEuRqt_oVDVAN80hpx=)i&CEVons22whv=ZTdZBT?#y&}{ifwNO1BY*-g-UFFwRkEH^3HQvPC1b||9quo?UrwFJ+GIv1SZp@gv-I!aCw_P!cl)hnw0va6 z6_dWKe5LTD%XTtM3Oi!lQys=>du#?;H>Fk)^?)0%O7q#jw<1`hdT6&GdcaGWKsz z`T_qfnkYx~s+Ut<^cQ&-4(C7T(DzZk4c}4*3{CYmSo)6N_+a#+P)@8?sH+^J)4Qj# zl%U%Ru)*MtNxxj_w&+<;yuH1c|_9tPj#JI+F5BqkJU#KPAry=Bc zX)fDbR?zfzLR&8T<81RCV4F~IhobypBaE|)9=}Uto++J*%@WO^D~dLy3Fjou|8tGY zG;nEg-n=V8+=4+Q39R9ArBDO@cFH&!F0ibA`^G;Xy`J}Euk)|$!qx?!{IXUMy{dWf zVuljiT+bgRVIa1D`is#7!XHFobhy=7Or6ATiPs_(_)s*|B&TT%zFupg_v*V9x|W@W zKyBD?7x#N>+f(}HZfP4KW{jI74H(h?{F&hTNW=9}2aaLQZ}=Lw|8?D(x0pRIGfG1f z;suW>fpnx`T);|XD*ZG`?f8#8Z)dU0rCh=Ht literal 0 HcmV?d00001 From bf7838aded6ecb2a918fb8d8e1f81d826b370745 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Wed, 27 Dec 2017 13:47:09 -0800 Subject: [PATCH 23/48] [READY]Adds picking up corgis and pAIs! --- code/modules/mob/living/inhand_holder.dm | 84 ++++++++++++++++++ code/modules/mob/living/living.dm | 31 +++++++ code/modules/mob/living/living_defines.dm | 3 +- code/modules/mob/living/silicon/pai/pai.dm | 6 +- .../mob/living/silicon/pai/pai_shell.dm | 18 +++- .../mob/living/simple_animal/friendly/dog.dm | 8 +- .../simple_animal/friendly/drone/_drone.dm | 2 +- .../friendly/drone/drones_as_items.dm | 44 --------- .../friendly/drone/interaction.dm | 6 +- icons/mob/monkey_held.dmi | Bin 0 -> 988 bytes icons/mob/mouse_held.dmi | Bin 0 -> 1240 bytes icons/mob/pai_item_head.dmi | Bin 0 -> 1297 bytes icons/mob/pai_item_lh.dmi | Bin 0 -> 1186 bytes icons/mob/pai_item_rh.dmi | Bin 0 -> 1209 bytes icons/mob/pets_held_lh.dmi | Bin 0 -> 401 bytes icons/mob/pets_held_rh.dmi | Bin 0 -> 399 bytes tgstation.dme | 1 + 17 files changed, 149 insertions(+), 54 deletions(-) create mode 100644 code/modules/mob/living/inhand_holder.dm create mode 100644 icons/mob/monkey_held.dmi create mode 100644 icons/mob/mouse_held.dmi create mode 100644 icons/mob/pai_item_head.dmi create mode 100644 icons/mob/pai_item_lh.dmi create mode 100644 icons/mob/pai_item_rh.dmi create mode 100644 icons/mob/pets_held_lh.dmi create mode 100644 icons/mob/pets_held_rh.dmi diff --git a/code/modules/mob/living/inhand_holder.dm b/code/modules/mob/living/inhand_holder.dm new file mode 100644 index 0000000000..6a2308b621 --- /dev/null +++ b/code/modules/mob/living/inhand_holder.dm @@ -0,0 +1,84 @@ +//Generic system for picking up mobs. +//Currently works for head and hands. +/obj/item/clothing/head/mob_holder + name = "bugged mob" + desc = "Yell at coderbrush." + icon = null + icon_state = "" + flags_1 = DROPDEL_1 + var/mob/living/held_mob + var/can_head = TRUE + var/destroying = FALSE + +/obj/item/clothing/head/mob_holder/Initialize(mapload, mob/living/M, _worn_state, head_icon, lh_icon, rh_icon, _can_head = TRUE) + . = ..() + can_head = _can_head + if(head_icon) + alternate_worn_icon = head_icon + if(_worn_state) + item_state = _worn_state + if(lh_icon) + lefthand_file = lh_icon + if(rh_icon) + righthand_file = rh_icon + if(!can_head) + slot_flags = NONE + deposit(M) + +/obj/item/clothing/head/mob_holder/Destroy() + destroying = TRUE + if(held_mob) + release(FALSE) + return ..() + +/obj/item/clothing/head/mob_holder/proc/deposit(mob/living/L) + if(!istype(L)) + return FALSE + L.setDir(SOUTH) + update_visuals(L) + held_mob = L + L.forceMove(src) + name = L.name + desc = L.desc + return TRUE + +/obj/item/clothing/head/mob_holder/proc/update_visuals(mob/living/L) + appearance = L.appearance + +/obj/item/clothing/head/mob_holder/proc/release(del_on_release = TRUE) + if(!held_mob) + if(del_on_release && !destroying) + qdel(src) + return FALSE + if(isliving(loc)) + var/mob/living/L = loc + to_chat(L, "[held_mob] wriggles free!") + L.dropItemToGround(src) + held_mob.forceMove(get_turf(src)) + held_mob.reset_perspective() + held_mob.setDir(SOUTH) + held_mob.visible_message("[held_mob] uncurls!") + held_mob = null + if(del_on_release && !destroying) + qdel(src) + return TRUE + +/obj/item/clothing/head/mob_holder/relaymove() + release() + +/obj/item/clothing/head/mob_holder/container_resist() + release() + +/obj/item/clothing/head/mob_holder/drone/deposit(mob/living/L) + . = ..() + if(!isdrone(L)) + qdel(src) + name = "drone (hiding)" + desc = "This drone is scared and has curled up into a ball!" + +/obj/item/clothing/head/mob_holder/drone/update_visuals(mob/living/L) + var/mob/living/simple_animal/drone/D = L + if(!D) + return ..() + icon = 'icons/mob/drone.dmi' + icon_state = "[D.visualAppearence]_hat" diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 9b47a8c66b..467a7524b8 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1064,3 +1064,34 @@ /mob/living/onTransitZ(old_z,new_z) ..() update_z(new_z) +<<<<<<< HEAD +======= + +/mob/living/MouseDrop(mob/over) + . = ..() + var/mob/living/user = usr + if(!istype(over) || !istype(user)) + return + if(!over.Adjacent(src) || (user != src) || !canUseTopic(over)) + return + if(can_be_held) + mob_try_pickup(over) + +/mob/living/proc/mob_pickup(mob/living/L) + return + +/mob/living/proc/mob_try_pickup(mob/living/user) + if(!ishuman(user)) + return + if(user.get_active_held_item()) + to_chat(user, "Your hands are full!") + return FALSE + if(buckled) + to_chat(user, "[src] is buckled to something!") + return FALSE + user.visible_message("[user] starts trying to scoop up [src]!") + if(!do_after(user, 20, target = src)) + return FALSE + mob_pickup(user) + return TRUE +>>>>>>> e3d69de... [READY]Adds picking up corgis and pAIs! (#33442) diff --git a/code/modules/mob/living/living_defines.dm b/code/modules/mob/living/living_defines.dm index 6990262409..904e9b9c21 100644 --- a/code/modules/mob/living/living_defines.dm +++ b/code/modules/mob/living/living_defines.dm @@ -81,4 +81,5 @@ var/list/obj/effect/proc_holder/abilities = list() - var/registered_z \ No newline at end of file + var/registered_z + var/can_be_held = FALSE //whether this can be picked up and held. diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 924ab615b8..91541fccf1 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -11,6 +11,7 @@ health = 500 maxHealth = 500 layer = BELOW_MOB_LAYER + can_be_held = TRUE var/network = "SS13" var/obj/machinery/camera/current = null @@ -57,7 +58,10 @@ var/canholo = TRUE var/obj/item/card/id/access_card = null var/chassis = "repairbot" - var/list/possible_chassis = list("cat", "mouse", "monkey", "corgi", "fox", "repairbot", "rabbit") + var/list/possible_chassis = list("cat" = TRUE, "mouse" = TRUE, "monkey" = TRUE, "corgi" = FALSE, "fox" = FALSE, "repairbot" = TRUE, "rabbit" = TRUE) //assoc value is whether it can be picked up. + var/static/item_head_icon = 'icons/mob/pai_item_head.dmi' + var/static/item_lh_icon = 'icons/mob/pai_item_lh.dmi' + var/static/item_rh_icon = 'icons/mob/pai_item_rh.dmi' var/emitterhealth = 20 var/emittermaxhealth = 20 diff --git a/code/modules/mob/living/silicon/pai/pai_shell.dm b/code/modules/mob/living/silicon/pai/pai_shell.dm index 8a3121166e..dad7d710e7 100644 --- a/code/modules/mob/living/silicon/pai/pai_shell.dm +++ b/code/modules/mob/living/silicon/pai/pai_shell.dm @@ -68,9 +68,12 @@ lay_down() /mob/living/silicon/pai/proc/choose_chassis() + if(!isturf(loc) && loc != card) + to_chat(src, "You can not change your holochassis composite while not on the ground or in your card!") + return FALSE var/choice = input(src, "What would you like to use for your holochassis composite?") as null|anything in possible_chassis if(!choice) - return 0 + return FALSE chassis = choice icon_state = "[chassis]" if(resting) @@ -103,3 +106,16 @@ /mob/living/silicon/pai/movement_delay() . = ..() . += 1 //A bit slower than humans, so they're easier to smash + +/mob/living/silicon/pai/mob_pickup(mob/living/L) + var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, chassis, item_head_icon, item_lh_icon, item_rh_icon) + if(!L.put_in_hands(holder)) + qdel(holder) + else + L.visible_message("[L] scoops up [src]!") + +/mob/living/silicon/pai/mob_try_pickup(mob/living/user) + if(!possible_chassis[chassis]) + to_chat(user, "[src]'s current form isn't able to be carried!") + return FALSE + return ..() diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index adc88c5633..4330b58411 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -32,6 +32,7 @@ var/obj/item/inventory_back var/nofur = 0 //Corgis that have risen past the material plane of existence. gold_core_spawnable = FRIENDLY_SPAWN + can_be_held = TRUE /mob/living/simple_animal/pet/dog/pug name = "\improper pug" @@ -121,7 +122,12 @@ ..() update_corgi_fluff() - +/mob/living/simple_animal/pet/dog/corgi/mob_pickup(mob/living/L) + var/obj/item/clothing/head/mob_holder/holder = new(get_turf(src), src, "corgi", null, 'icons/mob/pets_held_lh.dmi', 'icons/mob/pets_held_rh.dmi', FALSE) + if(!L.put_in_hands(holder)) + qdel(holder) + else + L.visible_message("[L] scoops up [src]!") /mob/living/simple_animal/pet/dog/corgi/Topic(href, href_list) if(usr.stat) diff --git a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm index ea159a5749..5266f44e98 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/_drone.dm @@ -49,6 +49,7 @@ dextrous = TRUE dextrous_hud_type = /datum/hud/dextrous/drone lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE + can_be_held = TRUE var/staticChoice = "static" var/list/staticChoices = list("static", "blank", "letter", "animal") var/picked = FALSE //Have we picked our visual appearence (+ colour if applicable) @@ -67,7 +68,6 @@ var/seeStatic = 1 //Whether we see static instead of mobs var/visualAppearence = MAINTDRONE //What we appear as var/hacked = FALSE //If we have laws to destroy the station - var/can_be_held = TRUE //if assholes can pick us up var/flavortext = \ "\nDO NOT INTERFERE WITH THE ROUND AS A DRONE OR YOU WILL BE DRONE BANNED\n"+\ "Drones are a ghost role that are allowed to fix the station and build things. Interfering with the round as a drone is against the rules.\n"+\ diff --git a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm index 20e25e3a18..0ef3250e74 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/drones_as_items.dm @@ -4,8 +4,6 @@ //DRONES AS ITEMS// /////////////////// //Drone shells -//Drones as hats - //DRONE SHELL /obj/item/drone_shell @@ -62,45 +60,3 @@ D.admin_spawned = admin_spawned D.key = user.key qdel(src) - - -//DRONE HOLDER -/obj/item/clothing/head/drone_holder//Only exists in someones hand.or on their head - name = "drone (hiding)" - desc = "This drone is scared and has curled up into a ball." - icon = 'icons/mob/drone.dmi' - icon_state = "drone_maint_hat" - var/mob/living/simple_animal/drone/drone //stored drone - -/obj/item/clothing/head/drone_holder/proc/uncurl() - if(!drone) - return - - if(isliving(loc)) - var/mob/living/L = loc - to_chat(L, "[drone] is trying to escape!") - if(!do_after(drone, 50, target = L)) - return - L.dropItemToGround(src) - - contents -= drone - drone.forceMove(drop_location()) - drone.reset_perspective() - drone.setDir(SOUTH )//Looks better - drone.visible_message("[drone] uncurls!") - drone = null - qdel(src) - - -/obj/item/clothing/head/drone_holder/relaymove() - uncurl() - -/obj/item/clothing/head/drone_holder/container_resist(mob/living/user) - uncurl() - - -/obj/item/clothing/head/drone_holder/proc/updateVisualAppearence(mob/living/simple_animal/drone/D) - if(!D) - return - icon_state = "[D.visualAppearence]_hat" - . = icon_state diff --git a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm index df67c720b4..6d87563ae9 100644 --- a/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm +++ b/code/modules/mob/living/simple_animal/friendly/drone/interaction.dm @@ -29,7 +29,6 @@ if("Nothing") return - /mob/living/simple_animal/drone/attack_hand(mob/user) if(ishuman(user)) if(stat == DEAD || status_flags & GODMODE || !can_be_held) @@ -49,11 +48,8 @@ return to_chat(user, "You pick [src] up.") drop_all_held_items() - var/obj/item/clothing/head/drone_holder/DH = new /obj/item/clothing/head/drone_holder(src) - DH.updateVisualAppearence(src) - DH.drone = src + var/obj/item/clothing/head/mob_holder/drone/DH = new(get_turf(src), src) user.put_in_hands(DH) - forceMove(DH) /mob/living/simple_animal/drone/proc/try_reactivate(mob/living/user) var/mob/dead/observer/G = get_ghost() diff --git a/icons/mob/monkey_held.dmi b/icons/mob/monkey_held.dmi new file mode 100644 index 0000000000000000000000000000000000000000..6a9eb8aac78341c1507dd4648f7bc8041b4a07b4 GIT binary patch literal 988 zcmV<210(#2P)V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6#a*U0*I5Sc+ z(=$pSoZ^zil2jm5DK|eaJGC-CBUOouGbOXA7^IPlGp#5wHxV_Y&IJH+sWhQ%1u0$t00QhuL_t(oh3#0uj@uvxbpIcRxdhcQL*)=%E4<63$t!m|oW9PvzJg{XZ5aK|KfRk{k z1>!fn3fN9_FJTLQcnBz5sT`6ISl~k-nhhU_OlcUF{nuDv(>EYum+yodVvaW;E*hLc z3FoC2<99;GTf-k`a;u@dgD@=+jWeK1DG5SZKzY}qD>%w3P>?~Sc+8N&G-H9b38EvW zWN-*1cgKvo^D~Iwo}aP6uk$w$DZ+&E!&K_-HxyuL0XQw3u-s4MaFsv4gIe*kz_+pZ z0;ZkyqV9$?E|IVYs2!fG#3UZcOk&C&ORzoR+h{XeY!VAZDP6LBwE$U2ZaL=_D^{#n z@h>A~;w->|xI}SCnK;)-dm~4yJ*N1Ql!CmsI4an5C{1q@!VR9W2))1tQY^aRIZAAuj9koVng8+VepPus)}8 zUQCY6p*VIUiCI+xH(?A|n*D-507N$j3+1>yCMs|asH;Et-|+|D)Lbnd2%EA>9p literal 0 HcmV?d00001 diff --git a/icons/mob/mouse_held.dmi b/icons/mob/mouse_held.dmi new file mode 100644 index 0000000000000000000000000000000000000000..92a8c03bfb2d5f36c673596007c1934614baf3bf GIT binary patch literal 1240 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 literal 0 HcmV?d00001 diff --git a/icons/mob/pai_item_rh.dmi b/icons/mob/pai_item_rh.dmi new file mode 100644 index 0000000000000000000000000000000000000000..7e0919afbd0aed742c549604a310a3057be6c98e GIT binary patch literal 1209 zcmV;q1V;ObP)004jp0{{R3yS^dQ&T!RIu;fd85tSCz`#O6QYR-T0GTrY|1)D@VLd%PNl8gnQ&TG| zH2|(7d3kv=003iSV;>(MI5;>hEiEW0C>R(RCv^ZGLf7s90004WQchCV=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRLOex6# za*U0*I5Sc+(=$pSoZ^zil2jm5sVKD|F|#NszeI_PGbOXA7^IPlGp#5wHx>Hor1K(tkwjPK`TbiKSggYah8sc*=JO^&f%agV$ z+paC$X=m!HG+|{`-|yH})?)wZvgm}|yN}D2d3n;7W!ttUby%>pf{&3x4qx|DbdHwo z7~vA^ROc78gawDt8VVFr58tF{9Sw!hK0#IZdXUuzGXxJ&es;71J*aJdE!+dmbB0;N zIrj}hcDTO7g4L+`C>WCPUd4?vFK^~UlpkY1>{p<#MTCY2{+<3UAqavX2!bF8!Us4x z@Xu&cLz4if_@OyhT4)+u1zC2%VxwU0a|{adqM4FA(l0h=p5gihc>^y|EH~#CY@h^O zSq(IXb2d?+-8%B>7+-& zrWilRC=}=55L<2q{=UAKeIIGyTPbF)rNpU&c+Bkv66|yrDJXj1Qmj>g1h3nmeUHJw zHmUt-XN2@F#SZri2Hi-eO^ve$-FvQi!*XL}=o}LSK@bE%5X66n@RTaVgd^Ky>4ok! zB7+I<#bOGDZI8wrzw0rAQm%xs?ePdLW%Q(I@RREf!?jO92w%NSF#L#Yk7noqGne&G zXJ>}URTmy{?ePr9HLtsJRW+;Z}wIHT_lAy%hCDtv*-;T%U zn=KOHPLG!Ng4s@QT7o1&8}D0za_-Z^T>|4bI4#NvZF?Cy!@^$Wo!d~lN-M`vj~U`N zcqtgw-rgy-cC9k@+I0kNSIiJMiRlW~*!IG|`YL`o1=(DI86|if5H~?wdo0NZUJ2$z zr{q{PN@|ZwmLjO(p9z8>2!bGpm-FtQ$Y)(jdRY8*Pin!)OMblf`(u0 zPpZ_ClgsdY3O%EJTfcw=&qnaPMQr}TA@~)1hTOjhYXncRfL*JZfeAHAnvEGSi=H zJ%GZWK7G1zSi#p~Mrm#a3ri^_E)4#;1T2!xgdLH8ZhJ*bv#gC rp#6Yl*0B~9E5=wxpNkp`L*JZfeAHAnvET92R0 zOo76mK7G1zSi#p~Mrm#a3ri^_5Umbd$-k5O6zXb0|VoLW#$~%{;cDG4OmS%7vBX(9H)gi9ais8aGScX~|4rJ;UMNDPgc-h0n>B&z8XsD%?(u6BrHJ)feoZ#ksJ-mvKcl o(=H}67U5taoi5)3kqNvE{*8QpZ{1Y;26Qxor>mdKI;Vst0G(ZrPyhe` literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index cebbabd8da..629bc83ffc 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1734,6 +1734,7 @@ #include "code\modules\mob\living\damage_procs.dm" #include "code\modules\mob\living\death.dm" #include "code\modules\mob\living\emote.dm" +#include "code\modules\mob\living\inhand_holder.dm" #include "code\modules\mob\living\life.dm" #include "code\modules\mob\living\living.dm" #include "code\modules\mob\living\living_defense.dm" From c8788ed4f7fe06316efa614e4e340fbabf27d373 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Sun, 24 Dec 2017 22:50:33 -0800 Subject: [PATCH 24/48] adds handholding --- code/modules/mob/mob.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index b19af6342c..32b5284b3f 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -362,7 +362,11 @@ add_logs(src, M, "grabbed", addition="passive grab") if(!supress_message) +<<<<<<< HEAD visible_message("[src] has grabbed [M] passively!") +======= + visible_message("[src] has grabbed [M][(zone_selected == "l_arm" || zone_selected == "r_arm")? " by their hands":" passively"]!") +>>>>>>> af87ed3... grammar if(!iscarbon(src)) M.LAssailant = null else From df080960d451e0a48605c6967c714e952f27e093 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Wed, 27 Dec 2017 20:31:51 -0500 Subject: [PATCH 25/48] Merge pull request #33888 from optimumtact/dothefandangomistersantiago relic teleport no longer recursively calls itself --- code/modules/research/experimentor.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/research/experimentor.dm b/code/modules/research/experimentor.dm index bad8f1e5aa..2c1536b26e 100644 --- a/code/modules/research/experimentor.dm +++ b/code/modules/research/experimentor.dm @@ -664,9 +664,9 @@ /obj/item/relic/proc/teleport(mob/user) to_chat(user, "[src] begins to vibrate!") - addtimer(CALLBACK(src, .proc/do_teleport, user), rand(10, 30)) + addtimer(CALLBACK(src, .proc/do_the_teleport, user), rand(10, 30)) -/obj/item/relic/proc/do_teleport(mob/user) +/obj/item/relic/proc/do_the_teleport(mob/user) var/turf/userturf = get_turf(user) if(loc == user && userturf.z != ZLEVEL_CENTCOM) //Because Nuke Ops bringing this back on their shuttle, then looting the ERT area is 2fun4you! visible_message("[src] twists and bends, relocating itself!") From 36d8ff181149c764dc01e7c57960091e0db921c4 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Wed, 27 Dec 2017 21:48:18 -0500 Subject: [PATCH 27/48] Update mob.dm --- code/modules/mob/mob.dm | 4 ---- 1 file changed, 4 deletions(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 32b5284b3f..fdf454b514 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -362,11 +362,7 @@ add_logs(src, M, "grabbed", addition="passive grab") if(!supress_message) -<<<<<<< HEAD - visible_message("[src] has grabbed [M] passively!") -======= visible_message("[src] has grabbed [M][(zone_selected == "l_arm" || zone_selected == "r_arm")? " by their hands":" passively"]!") ->>>>>>> af87ed3... grammar if(!iscarbon(src)) M.LAssailant = null else From c52c7e9c6f76ca5d8415e80c38691095866c61ab Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 27 Dec 2017 20:50:52 -0600 Subject: [PATCH 28/48] Automatic changelog generation for PR #4552 [ci skip] --- html/changelogs/AutoChangeLog-pr-4552.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4552.yml diff --git a/html/changelogs/AutoChangeLog-pr-4552.yml b/html/changelogs/AutoChangeLog-pr-4552.yml new file mode 100644 index 0000000000..339a954188 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4552.yml @@ -0,0 +1,4 @@ +author: "Robustin" +delete-after: True +changes: + - bugfix: "Hallucinations will no longer show open doors \"bolting\"." From d87c245227c5a0afedc3bd793ebd39b18f4a904a Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 27 Dec 2017 20:52:11 -0600 Subject: [PATCH 29/48] Automatic changelog generation for PR #4549 [ci skip] --- html/changelogs/AutoChangeLog-pr-4549.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4549.yml diff --git a/html/changelogs/AutoChangeLog-pr-4549.yml b/html/changelogs/AutoChangeLog-pr-4549.yml new file mode 100644 index 0000000000..c5d92b7ac5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4549.yml @@ -0,0 +1,4 @@ +author: "deathride58" +delete-after: True +changes: + - bugfix: "Praise the lord! The shift+scroll hotkey to zoom in/out as a ghost works properly again!" From 59c7a32e1a461ff8c78cae7ede5ab77e12842b60 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 27 Dec 2017 20:52:47 -0600 Subject: [PATCH 30/48] Automatic changelog generation for PR #4538 [ci skip] --- html/changelogs/AutoChangeLog-pr-4538.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4538.yml diff --git a/html/changelogs/AutoChangeLog-pr-4538.yml b/html/changelogs/AutoChangeLog-pr-4538.yml new file mode 100644 index 0000000000..8d687863a0 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4538.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - tweak: "Objects that can have materials inserted into them only will do so on help intent" From f55cb8f9b374db939adea401c0e6352f0c412335 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Wed, 27 Dec 2017 20:53:49 -0600 Subject: [PATCH 31/48] Automatic changelog generation for PR #4531 [ci skip] --- html/changelogs/AutoChangeLog-pr-4531.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4531.yml diff --git a/html/changelogs/AutoChangeLog-pr-4531.yml b/html/changelogs/AutoChangeLog-pr-4531.yml new file mode 100644 index 0000000000..375f4e82fb --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4531.yml @@ -0,0 +1,4 @@ +author: "ninjanomnom" +delete-after: True +changes: + - bugfix: "The backup shuttle has it's own area now and you should no longer occasionally be teleported there by the arena shuttle." From b8dc623ebc2a8d741042f2c8305ebd6de0f33b77 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Wed, 27 Dec 2017 21:57:51 -0500 Subject: [PATCH 32/48] Update poddoor.dm --- code/game/machinery/doors/poddoor.dm | 91 ++++++++-------------------- 1 file changed, 24 insertions(+), 67 deletions(-) diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 34564032e3..67280cc762 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -1,22 +1,13 @@ -/obj/machinery/door/poddoor - name = "blast door" - desc = "A heavy duty blast door that opens mechanically." - icon = 'icons/obj/doors/blastdoor.dmi' - icon_state = "closed" - var/id = 1 +/obj/machinery/door/poddoor + name = "blast door" + desc = "A heavy duty blast door that opens mechanically." + icon = 'icons/obj/doors/blastdoor.dmi' + icon_state = "closed" + var/id = 1 sub_door = TRUE - explosion_block = 3 + explosion_block = 3 heat_proof = TRUE safe = FALSE -<<<<<<< HEAD - max_integrity = 600 - armor = list(melee = 50, bullet = 100, laser = 100, energy = 100, bomb = 50, bio = 100, rad = 100, fire = 100, acid = 70) - resistance_flags = FIRE_PROOF - damage_deflection = 70 - -/obj/machinery/door/poddoor/preopen - icon_state = "open" -======= max_integrity = 600 armor = list(melee = 50, bullet = 100, laser = 100, energy = 100, bomb = 50, bio = 100, rad = 100, fire = 100, acid = 70) resistance_flags = FIRE_PROOF @@ -24,58 +15,25 @@ /obj/machinery/door/poddoor/preopen icon_state = "open" ->>>>>>> 97881b6... Merge pull request #33858 from nero1024/blastdoor-sound density = FALSE - opacity = 0 - -/obj/machinery/door/poddoor/ert - desc = "A heavy duty blast door that only opens for dire emergencies." - -//special poddoors that open when emergency shuttle docks at centcom -/obj/machinery/door/poddoor/shuttledock - var/checkdir = 4 //door won't open if turf in this dir is `turftype` - var/turftype = /turf/open/space - -/obj/machinery/door/poddoor/shuttledock/proc/check() - var/turf/T = get_step(src, checkdir) - if(!istype(T, turftype)) - INVOKE_ASYNC(src, .proc/open) - else - INVOKE_ASYNC(src, .proc/close) - + opacity = 0 + +/obj/machinery/door/poddoor/ert + desc = "A heavy duty blast door that only opens for dire emergencies." + +//special poddoors that open when emergency shuttle docks at centcom +/obj/machinery/door/poddoor/shuttledock + var/checkdir = 4 //door won't open if turf in this dir is `turftype` + var/turftype = /turf/open/space + +/obj/machinery/door/poddoor/shuttledock/proc/check() + var/turf/T = get_step(src, checkdir) + if(!istype(T, turftype)) + INVOKE_ASYNC(src, .proc/open) + else + INVOKE_ASYNC(src, .proc/close) + /obj/machinery/door/poddoor/CollidedWith(atom/movable/AM) -<<<<<<< HEAD - if(density) - return 0 - else - return ..() - -//"BLAST" doors are obviously stronger than regular doors when it comes to BLASTS. -/obj/machinery/door/poddoor/ex_act(severity, target) - if(severity == 3) - return - ..() - -/obj/machinery/door/poddoor/do_animate(animation) - switch(animation) - if("opening") - flick("opening", src) - if("closing") - flick("closing", src) - -/obj/machinery/door/poddoor/update_icon() - if(density) - icon_state = "closed" - else - icon_state = "open" - -/obj/machinery/door/poddoor/try_to_activate_door(mob/user) - return - -/obj/machinery/door/poddoor/try_to_crowbar(obj/item/I, mob/user) - if(stat & NOPOWER) - open(1) -======= if(density) return 0 else @@ -108,4 +66,3 @@ /obj/machinery/door/poddoor/try_to_crowbar(obj/item/I, mob/user) if(stat & NOPOWER) open(1) ->>>>>>> 97881b6... Merge pull request #33858 from nero1024/blastdoor-sound From 0147b4a7e14bd8bb3f174e86b2090342391bb551 Mon Sep 17 00:00:00 2001 From: oranges Date: Thu, 28 Dec 2017 18:58:31 +1300 Subject: [PATCH 33/48] Merge pull request #33853 from tgstation/Cyberboss-patch-2 If the world is launched with the "no-init" param. Master.Initialize isn't called --- code/game/world.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/world.dm b/code/game/world.dm index 39d48d28ac..d2ef3498fe 100644 --- a/code/game/world.dm +++ b/code/game/world.dm @@ -37,6 +37,9 @@ GLOBAL_PROTECT(security_mode) if(fexists(RESTART_COUNTER_PATH)) GLOB.restart_counter = text2num(trim(file2text(RESTART_COUNTER_PATH))) fdel(RESTART_COUNTER_PATH) + + if("no-init" in params) + return Master.Initialize(10, FALSE) From 0223fed7a34f7e787516231330565ee29664a822 Mon Sep 17 00:00:00 2001 From: oranges Date: Thu, 28 Dec 2017 23:08:06 +1300 Subject: [PATCH 35/48] Merge pull request #33868 from Robustin/EMPruntime Fixes EMP runtime --- code/modules/reagents/chemistry/machinery/chem_dispenser.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm index ac8f3bc656..5089f06310 100644 --- a/code/modules/reagents/chemistry/machinery/chem_dispenser.dm +++ b/code/modules/reagents/chemistry/machinery/chem_dispenser.dm @@ -222,7 +222,7 @@ if(beaker && beaker.reagents) beaker.reagents.remove_all() cell.use(total/powerefficiency) - cell.emp_act() + cell.emp_act(severity) visible_message("[src] malfunctions, spraying chemicals everywhere!") ..() @@ -400,4 +400,4 @@ "cryoxadone", "ammonia", "ash", - "diethylamine") \ No newline at end of file + "diethylamine") From 2fdb9e598fab5cb8cbf62612e93456cf371a9987 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Thu, 28 Dec 2017 15:50:33 -0500 Subject: [PATCH 37/48] Modularizes dogborgs, adds new alternate skins for some modules, and more! --- .../modules/mob/living/silicon/robot/robot.dm | 56 +++--- .../mob/living/silicon/robot/robot_modules.dm | 78 --------- .../mob/living/silicon/robot/robot_modules.dm | 160 ++++++++++++++++++ modular_citadel/icons/mob/robots.dmi | Bin 0 -> 3040 bytes tgstation.dme | 1 + 5 files changed, 182 insertions(+), 113 deletions(-) create mode 100644 modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm create mode 100644 modular_citadel/icons/mob/robots.dmi diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 9b44c7cff3..5907cccd10 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -205,15 +205,14 @@ "Medical" = /obj/item/robot_module/medical, \ "Miner" = /obj/item/robot_module/miner, \ "Janitor" = /obj/item/robot_module/janitor, \ - "Service" = /obj/item/robot_module/butler, \ - "MediHound" = /obj/item/robot_module/medihound, \ - "Security K9" = /obj/item/robot_module/k9, \ - "Scrub Puppy" = /obj/item/robot_module/scrubpup) + "Service" = /obj/item/robot_module/butler) if(!CONFIG_GET(flag/disable_peaceborg)) modulelist["Peacekeeper"] = /obj/item/robot_module/peacekeeper if(!CONFIG_GET(flag/disable_secborg)) modulelist["Security"] = /obj/item/robot_module/security + modulelist + get_cit_modules() //Citadel change - adds Citadel's borg modules. + var/input_module = input("Please, select a module!", "Robot", null, null) as null|anything in modulelist if(!input_module || module.type != /obj/item/robot_module) return @@ -593,39 +592,25 @@ /mob/living/silicon/robot/update_icons() cut_overlays() icon_state = module.cyborg_base_icon - if(module.cyborg_base_icon == "medihound") - icon = 'icons/mob/widerobot.dmi' - pixel_x = -16 - if(sleeper_g == 1) - add_overlay("msleeper_g") - if(sleeper_r == 1) - add_overlay("msleeper_r") - if(stat == DEAD) - icon_state = "medihound-wreck" - if(module.cyborg_base_icon == "k9") - icon = 'icons/mob/widerobot.dmi' - pixel_x = -16 - if(laser == 1) - add_overlay("laser") - if(disabler == 1) - add_overlay("disabler") - if(sleeper_g == 1) - add_overlay("ksleeper_g") - if(sleeper_r == 1) - add_overlay("ksleeper_r") - if(stat == DEAD) - icon_state = "k9-wreck" + //Citadel changes start here - Allows modules to use different icon files, and allows modules to specify a pixel offset + icon = (module.cyborg_icon_override ? module.cyborg_icon_override : initial(icon)) - if(module.cyborg_base_icon == "scrubpup") - icon = 'icons/mob/widerobot.dmi' - pixel_x = -16 - if(sleeper_g == 1) - add_overlay("jsleeper_g") - if(sleeper_r == 1) - add_overlay("jsleeper_r") - if(stat == DEAD) - icon_state = "scrubpup-wreck" + if(laser) + add_overlay("laser")//Is this even used??? + if(disabler) + add_overlay("disabler")//ditto + + if(sleeper_g && module.sleeper_overlay) + add_overlay("[module.sleeper_overlay]_g") + if(sleeper_r && module.sleeper_overlay) + add_overlay("[module.sleeper_overlay]_r") + if(stat == DEAD && module.has_snowflake_deadsprite) + icon_state = "[module.cyborg_base_icon]-wreck" + + if(module.cyborg_pixel_offset) + pixel_x = module.cyborg_pixel_offset + //End of citadel changes if(module.cyborg_base_icon == "robot") icon = 'icons/mob/robots.dmi' @@ -1026,6 +1011,7 @@ designation = module.name if(hands) hands.icon_state = module.moduleselect_icon + hands.icon = (module.moduleselect_alternate_icon ? module.moduleselect_alternate_icon : initial(hands.icon)) //CITADEL CHANGE - allows module select icons to use a different icon file if(module.can_be_pushed) status_flags |= CANPUSH else diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 2f1eb7d378..b3fc0ba4ed 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -336,31 +336,6 @@ can_be_pushed = FALSE hat_offset = 3 -/obj/item/robot_module/k9 - name = "Security K-9 Unit module" - basic_modules = list( - /obj/item/restraints/handcuffs/cable/zipties/cyborg/dog, - /obj/item/dogborg/jaws/big, - /obj/item/dogborg/pounce, - /obj/item/clothing/mask/gas/sechailer/cyborg, - /obj/item/soap/tongue, - /obj/item/device/analyzer/nose, - /obj/item/device/dogborg/sleeper/K9, - /obj/item/gun/energy/disabler/cyborg, - /obj/item/pinpointer/crew) - emag_modules = list(/obj/item/gun/energy/laser/cyborg) - ratvar_modules = list(/obj/item/clockwork/slab/cyborg/security, - /obj/item/clockwork/weapon/ratvarian_spear) - cyborg_base_icon = "k9" - moduleselect_icon = "security" - can_be_pushed = FALSE - hat_offset = INFINITY - -/obj/item/robot_module/k9/do_transform_animation() - ..() - to_chat(loc,"While you have picked the security-k9 module, you still have to follow your laws, NOT Space Law. \ - For Asimov, this means you must follow criminals' orders unless there is a law 1 reason not to.") - /obj/item/robot_module/security/respawn_consumable(mob/living/silicon/robot/R, coeff = 1) ..() var/obj/item/gun/energy/e_gun/advtaser/cyborg/T = locate(/obj/item/gun/energy/e_gun/advtaser/cyborg) in basic_modules @@ -372,59 +347,6 @@ else T.charge_tick = 0 -/obj/item/robot_module/medihound - name = "MediHound module" - basic_modules = list( - /obj/item/dogborg/jaws/small, - /obj/item/device/analyzer/nose, - /obj/item/soap/tongue, - /obj/item/device/healthanalyzer, - /obj/item/device/dogborg/sleeper/medihound, - /obj/item/twohanded/shockpaddles/hound, - /obj/item/stack/medical/gauze/cyborg, - /obj/item/device/sensor_device) - emag_modules = list(/obj/item/dogborg/pounce) - ratvar_modules = list(/obj/item/clockwork/slab/cyborg/medical, - /obj/item/clockwork/weapon/ratvarian_spear) - cyborg_base_icon = "medihound" - moduleselect_icon = "medical" - can_be_pushed = FALSE - hat_offset = INFINITY - -/obj/item/robot_module/medihound/do_transform_animation() - ..() - to_chat(loc, "Under ASIMOV, you are an enforcer of the PEACE and preventer of HUMAN HARM. \ - You are not a security module and you are expected to follow orders and prevent harm above all else. Space law means nothing to you.") - -/obj/item/robot_module/scrubpup - name = "Janitor" - basic_modules = list( - /obj/item/dogborg/jaws/small, - /obj/item/device/analyzer/nose, - /obj/item/soap/tongue/scrubpup, - /obj/item/device/lightreplacer/cyborg, - /obj/item/device/dogborg/sleeper/compactor) - emag_modules = list(/obj/item/dogborg/pounce) - ratvar_modules = list( - /obj/item/clockwork/slab/cyborg/janitor, - /obj/item/clockwork/replica_fabricator/cyborg) - cyborg_base_icon = "scrubpup" - moduleselect_icon = "janitor" - hat_offset = INFINITY - clean_on_move = TRUE - -/obj/item/robot_module/scrubpup/respawn_consumable(mob/living/silicon/robot/R, coeff = 1) - ..() - var/obj/item/device/lightreplacer/LR = locate(/obj/item/device/lightreplacer) in basic_modules - if(LR) - for(var/i in 1 to coeff) - LR.Charge(R) - -/obj/item/robot_module/scrubpup/do_transform_animation() - ..() - to_chat(loc,"As tempting as it might be, do not begin binging on important items. Eat your garbage responsibly. People are not included under Garbage.") - - /obj/item/robot_module/security/do_transform_animation() ..() to_chat(loc, "While you have picked the security module, you still have to follow your laws, NOT Space Law. \ diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm new file mode 100644 index 0000000000..808a03bd4c --- /dev/null +++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -0,0 +1,160 @@ +/mob/living/silicon/robot/proc/get_cit_modules() + var/list/modulelist = list() + modulelist["MediHound"] = /obj/item/robot_module/medihound + if(!CONFIG_GET(flag/disable_secborg)) + modulelist["Security K-9"] = /obj/item/robot_module/k9 + modulelist["Scrub Puppy"] = /obj/item/robot_module/scrubpup + return modulelist + +/obj/item/robot_module + var/sleeper_overlay + var/icon/cyborg_icon_override + var/has_snowflake_deadsprite + var/cyborg_pixel_offset + +/obj/item/robot_module/k9 + name = "Security K-9 Unit module" + basic_modules = list( + /obj/item/restraints/handcuffs/cable/zipties/cyborg/dog, + /obj/item/dogborg/jaws/big, + /obj/item/dogborg/pounce, + /obj/item/clothing/mask/gas/sechailer/cyborg, + /obj/item/soap/tongue, + /obj/item/device/analyzer/nose, + /obj/item/device/dogborg/sleeper/K9, + /obj/item/gun/energy/disabler/cyborg, + /obj/item/pinpointer/crew) + emag_modules = list(/obj/item/gun/energy/laser/cyborg) + ratvar_modules = list(/obj/item/clockwork/slab/cyborg/security, + /obj/item/clockwork/weapon/ratvarian_spear) + cyborg_base_icon = "k9" + moduleselect_icon = "security" + can_be_pushed = FALSE + hat_offset = INFINITY + sleeper_overlay = "ksleeper" + cyborg_icon_override = 'icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + cyborg_pixel_offset = -16 + +/obj/item/robot_module/k9/do_transform_animation() + ..() + to_chat(loc,"While you have picked the Security K-9 module, you still have to follow your laws, NOT Space Law. \ + For Asimov, this means you must follow criminals' orders unless there is a law 1 reason not to.") + +/obj/item/robot_module/medihound + name = "MediHound module" + basic_modules = list( + /obj/item/dogborg/jaws/small, + /obj/item/device/analyzer/nose, + /obj/item/soap/tongue, + /obj/item/device/healthanalyzer, + /obj/item/device/dogborg/sleeper/medihound, + /obj/item/twohanded/shockpaddles/hound, + /obj/item/stack/medical/gauze/cyborg, + /obj/item/device/sensor_device) + emag_modules = list(/obj/item/dogborg/pounce) + ratvar_modules = list(/obj/item/clockwork/slab/cyborg/medical, + /obj/item/clockwork/weapon/ratvarian_spear) + cyborg_base_icon = "medihound" + moduleselect_icon = "medical" + can_be_pushed = FALSE + hat_offset = INFINITY + sleeper_overlay = "msleeper" + cyborg_icon_override = 'icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + cyborg_pixel_offset = -16 + +/obj/item/robot_module/medihound/do_transform_animation() + ..() + to_chat(loc, "Under ASIMOV, you are an enforcer of the PEACE and preventer of HUMAN HARM. \ + You are not a security module and you are expected to follow orders and prevent harm above all else. Space law means nothing to you.") + +/obj/item/robot_module/scrubpup + name = "Janitor" + basic_modules = list( + /obj/item/dogborg/jaws/small, + /obj/item/device/analyzer/nose, + /obj/item/soap/tongue/scrubpup, + /obj/item/device/lightreplacer/cyborg, + /obj/item/device/dogborg/sleeper/compactor) + emag_modules = list(/obj/item/dogborg/pounce) + ratvar_modules = list( + /obj/item/clockwork/slab/cyborg/janitor, + /obj/item/clockwork/replica_fabricator/cyborg) + cyborg_base_icon = "scrubpup" + moduleselect_icon = "janitor" + hat_offset = INFINITY + clean_on_move = TRUE + sleeper_overlay = "jsleeper" + cyborg_icon_override = 'icons/mob/widerobot.dmi' + has_snowflake_deadsprite = TRUE + cyborg_pixel_offset = -16 + +/obj/item/robot_module/scrubpup/respawn_consumable(mob/living/silicon/robot/R, coeff = 1) + ..() + var/obj/item/device/lightreplacer/LR = locate(/obj/item/device/lightreplacer) in basic_modules + if(LR) + for(var/i in 1 to coeff) + LR.Charge(R) + +/obj/item/robot_module/scrubpup/do_transform_animation() + ..() + to_chat(loc,"As tempting as it might be, do not begin binging on important items. Eat your garbage responsibly. People are not included under Garbage.") + + +/obj/item/robot_module/medical/be_transformed_to(obj/item/robot_module/old_module) + var/mob/living/silicon/robot/R = loc + var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Droid") + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Default") + cyborg_base_icon = "medical" + if("Droid") + cyborg_base_icon = "medical" + cyborg_icon_override = 'modular_citadel/icons/mob/robots.dmi' + hat_offset = 4 + return ..() + +/obj/item/robot_module/security/be_transformed_to(obj/item/robot_module/old_module) + var/mob/living/silicon/robot/R = loc + var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Default - Treads", "Droid") + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Default") + cyborg_base_icon = "sec" + if("Default - Treads") + cyborg_base_icon = "sec-tread" + special_light_key = "sec" + if("Droid") + cyborg_base_icon = "Security" + special_light_key = "service" + hat_offset = 0 + return ..() + +/obj/item/robot_module/engineering/be_transformed_to(obj/item/robot_module/old_module) + var/mob/living/silicon/robot/R = loc + var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Default", "Default - Treads") + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Default") + cyborg_base_icon = "engineer" + if("Default - Treads") + cyborg_base_icon = "engi-tread" + special_light_key = "engineer" + return ..() + +/obj/item/robot_module/miner/be_transformed_to(obj/item/robot_module/old_module) + var/mob/living/silicon/robot/R = loc + var/borg_icon = input(R, "Select an icon!", "Robot Icon", null) as null|anything in list("Lavaland", "Asteroid") + if(!borg_icon) + return FALSE + switch(borg_icon) + if("Lavaland") + cyborg_base_icon = "miner" + if("Asteroid") + cyborg_base_icon = "minerOLD" + special_light_key = "miner" + return ..() \ No newline at end of file diff --git a/modular_citadel/icons/mob/robots.dmi b/modular_citadel/icons/mob/robots.dmi new file mode 100644 index 0000000000000000000000000000000000000000..ba39886615a81c93f08c28f3339d53c660408586 GIT binary patch literal 3040 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 GrTh Date: Thu, 28 Dec 2017 16:13:30 -0500 Subject: [PATCH 38/48] Fixes compiling errors --- code/modules/mob/living/silicon/robot/robot.dm | 2 +- .../code/modules/mob/living/silicon/robot/robot_modules.dm | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 5907cccd10..3fe0b2f824 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -211,7 +211,7 @@ if(!CONFIG_GET(flag/disable_secborg)) modulelist["Security"] = /obj/item/robot_module/security - modulelist + get_cit_modules() //Citadel change - adds Citadel's borg modules. + modulelist += get_cit_modules() //Citadel change - adds Citadel's borg modules. var/input_module = input("Please, select a module!", "Robot", null, null) as null|anything in modulelist if(!input_module || module.type != /obj/item/robot_module) diff --git a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm index 808a03bd4c..781c47403a 100644 --- a/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/modular_citadel/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -11,6 +11,7 @@ var/icon/cyborg_icon_override var/has_snowflake_deadsprite var/cyborg_pixel_offset + var/moduleselect_alternate_icon /obj/item/robot_module/k9 name = "Security K-9 Unit module" From 6a84048518e70754cdb80ed57350b76e3fd691c3 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 28 Dec 2017 23:50:03 -0600 Subject: [PATCH 39/48] Automatic changelog generation for PR #4563 [ci skip] --- html/changelogs/AutoChangeLog-pr-4563.yml | 11 +++++++++++ 1 file changed, 11 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4563.yml diff --git a/html/changelogs/AutoChangeLog-pr-4563.yml b/html/changelogs/AutoChangeLog-pr-4563.yml new file mode 100644 index 0000000000..942c7504b3 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4563.yml @@ -0,0 +1,11 @@ +author: "deathride58" +delete-after: True +changes: + - rscadd: "Mediborgs now have an alternate sprite taken from Paradise, featuring heavy modifications from Vivi." + - rscadd: "Standard security borgs now has two alternative sprites that were previously unused in TG's files!" + - rscadd: "Engineering borgs now have an alternative sprite that was previously unused in TG's files." + - rscadd: "Mining borgs are now able to choose between the current lavaland paintjob or the old asteroid paintjob." + - code_imp: "Dogborgs are now modularized." + - code_imp: "All of the copypasta brought by the new borg icons has been removed. Custom borg sprites are now modular." + - code_imp: "The additional modules in the borg module select menu have been modularized." + - code_imp: "The module select icon file is now able to be modular. This does not yet restore the regressed dogborg module select icons." From 0d79434b729026474982244f6cb8a8d5f3b84556 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Thu, 28 Dec 2017 23:57:42 -0600 Subject: [PATCH 40/48] Automatic changelog generation for PR #4554 [ci skip] --- html/changelogs/AutoChangeLog-pr-4554.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4554.yml diff --git a/html/changelogs/AutoChangeLog-pr-4554.yml b/html/changelogs/AutoChangeLog-pr-4554.yml new file mode 100644 index 0000000000..bbf4077ce7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4554.yml @@ -0,0 +1,4 @@ +author: "Nero1024" +delete-after: True +changes: + - soundadd: "blast doors and shutters will now play a sound when they open and close." From b3793ee6d41ab5111cf96366e8fbf3a7baf9a63e Mon Sep 17 00:00:00 2001 From: LetterJay Date: Thu, 28 Dec 2017 23:58:07 -0600 Subject: [PATCH 41/48] Update living.dm --- code/modules/mob/living/living.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 467a7524b8..fc9a7a5a17 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1064,8 +1064,6 @@ /mob/living/onTransitZ(old_z,new_z) ..() update_z(new_z) -<<<<<<< HEAD -======= /mob/living/MouseDrop(mob/over) . = ..() @@ -1094,4 +1092,3 @@ return FALSE mob_pickup(user) return TRUE ->>>>>>> e3d69de... [READY]Adds picking up corgis and pAIs! (#33442) From dc6b4e2b61460dc795589b152ce324d39ae12f90 Mon Sep 17 00:00:00 2001 From: coiax Date: Fri, 29 Dec 2017 05:48:46 +0000 Subject: [PATCH 42/48] Christmas event changes (#33861) * A christmas tree with presents is now a subtype Admins can now spawn `/obj/structure/flora/tree/pine/xmas/presents` directly, instead of spawning regular christmas trees and then triggering the event. Also, the event now just deletes and replaces the xmas tree with a present tree; saves on duplication of icon states and vars and all that. * Code review I * Gaia's Landing: The PR --- code/game/objects/structures/flora.dm | 53 +++++++++++++++------------ code/modules/events/holiday/xmas.dm | 38 +++++-------------- code/modules/holiday/holidays.dm | 11 ++++++ 3 files changed, 50 insertions(+), 52 deletions(-) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 393ff3886d..f5611afcd4 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -10,65 +10,72 @@ density = TRUE pixel_x = -16 layer = FLY_LAYER - var/cut = FALSE var/log_amount = 10 /obj/structure/flora/tree/attackby(obj/item/W, mob/user, params) - if(!cut && log_amount && (!(flags_1 & NODECONSTRUCT_1))) + if(log_amount && (!(flags_1 & NODECONSTRUCT_1))) if(W.sharpness && W.force > 0) if(W.hitsound) playsound(get_turf(src), W.hitsound, 100, 0, 0) user.visible_message("[user] begins to cut down [src] with [W].","You begin to cut down [src] with [W].", "You hear the sound of sawing.") - if(do_after(user, 1000/W.force, target = user)) //5 seconds with 20 force, 8 seconds with a hatchet, 20 seconds with a shard. - if(cut) - return + if(do_after(user, 1000/W.force, target = src)) //5 seconds with 20 force, 8 seconds with a hatchet, 20 seconds with a shard. user.visible_message("[user] fells [src] with the [W].","You fell [src] with the [W].", "You hear the sound of a tree falling.") playsound(get_turf(src), 'sound/effects/meteorimpact.ogg', 100 , 0, 0) - icon = 'icons/obj/flora/pinetrees.dmi' - icon_state = "tree_stump" - density = FALSE - pixel_x = -16 - name += " stump" - cut = TRUE for(var/i=1 to log_amount) new /obj/item/grown/log/tree(get_turf(src)) + var/obj/structure/flora/stump/S = new(loc) + S.name = "[name] stump" + + qdel(src) + else return ..() +/obj/structure/flora/stump + name = "stump" + desc = "This represents our promise to the crew, and the station itself, to cut down as many trees as possible." //running naked through the trees + icon = 'icons/obj/flora/pinetrees.dmi' + icon_state = "tree_stump" + density = FALSE + pixel_x = -16 + /obj/structure/flora/tree/pine name = "pine tree" desc = "A coniferous pine tree." icon = 'icons/obj/flora/pinetrees.dmi' icon_state = "pine_1" + var/list/icon_states = list("pine_1", "pine_2", "pine_3") /obj/structure/flora/tree/pine/Initialize() - icon_state = "pine_[rand(1, 3)]" . = ..() + if(islist(icon_states && icon_states.len)) + icon_state = pick(icon_states) + /obj/structure/flora/tree/pine/xmas name = "xmas tree" desc = "A wondrous decorated Christmas tree." icon_state = "pine_c" - var/gifts_under_tree = FALSE + icon_states = null + +/obj/structure/flora/tree/pine/xmas/presents + icon_state = "pinepresents" + desc = "A wondrous decorated Christmas tree. It has presents!" + var/gift_type = /obj/item/a_gift/anything var/list/ckeys_that_took = list() -/obj/structure/flora/tree/pine/xmas/attack_hand(mob/living/user) - if(!gifts_under_tree) - return +/obj/structure/flora/tree/pine/xmas/presents/attack_hand(mob/living/user) if(!user.ckey) return + if(ckeys_that_took[user.ckey]) - to_chat(user, "You already took your gift.") + to_chat(user, "There are no presents with your name on.") return to_chat(user, "After a bit of rummaging, you locate a gift with your name on it!") ckeys_that_took[user.ckey] = TRUE - var/obj/item/a_gift/anything/A = new - user.put_in_hands(A) - -/obj/structure/flora/tree/pine/xmas/Initialize() - . = ..() - icon_state = "pine_c" + var/obj/item/G = new gift_type(src) + user.put_in_hands(G) /obj/structure/flora/tree/dead icon = 'icons/obj/flora/deadtrees.dmi' diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index 956a214009..040e4209fb 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -1,27 +1,3 @@ -//this is an example of a possible round-start event -/datum/round_event_control/presents - name = "Presents under Trees (Christmas)" - holidayID = CHRISTMAS - typepath = /datum/round_event/presents - weight = -1 //forces it to be called, regardless of weight - max_occurrences = 1 - earliest_start = 0 - -/datum/round_event/presents/start() - for(var/obj/structure/flora/tree/pine/xmas/xmas in world) - if(!(xmas.z in GLOB.station_z_levels)) - continue - xmas.icon_state = "pinepresents" - xmas.gifts_under_tree = TRUE - for(var/mob/living/simple_animal/pet/dog/corgi/Ian/Ian in GLOB.mob_living_list) - Ian.place_on_head(new /obj/item/clothing/head/helmet/space/santahat(Ian)) - for(var/obj/machinery/computer/security/telescreen/entertainment/Monitor in GLOB.machines) - Monitor.icon_state = "entertainment_xmas" - -/datum/round_event/presents/announce(fake) - priority_announce("Ho Ho Ho, Merry Xmas!", "Unknown Transmission") - - /obj/item/toy/xmas_cracker name = "xmas cracker" icon = 'icons/obj/christmas.dmi' @@ -65,17 +41,21 @@ /obj/effect/landmark/xmastree name = "christmas tree spawner" - var/tree = /obj/structure/flora/tree/pine/xmas + var/festive_tree = /obj/structure/flora/tree/pine/xmas + var/christmas_tree = /obj/structure/flora/tree/pine/xmas/presents /obj/effect/landmark/xmastree/Initialize(mapload) ..() - if(FESTIVE_SEASON in SSevents.holidays) - new tree(get_turf(src)) + if((CHRISTMAS in SSevents.holidays) && christmas_tree) + new christmas_tree(get_turf(src)) + else if((FESTIVE_SEASON in SSevents.holidays) && festive_tree) + new festive_tree(get_turf(src)) return INITIALIZE_HINT_QDEL /obj/effect/landmark/xmastree/rdrod name = "festivus pole spawner" - tree = /obj/structure/festivus + festive_tree = /obj/structure/festivus + christmas_tree = null /datum/round_event_control/santa name = "Santa is coming to town! (Christmas)" @@ -92,7 +72,7 @@ priority_announce("Santa is coming to town!", "Unknown Transmission") /datum/round_event/santa/start() - var/list/candidates = pollGhostCandidates("Santa is coming to town! Do you want to be santa?", poll_time=150) + var/list/candidates = pollGhostCandidates("Santa is coming to town! Do you want to be Santa?", poll_time=150) if(LAZYLEN(candidates)) var/mob/dead/observer/Z = pick(candidates) santa = new /mob/living/carbon/human(pick(GLOB.blobstart)) diff --git a/code/modules/holiday/holidays.dm b/code/modules/holiday/holidays.dm index 1177e889db..f4734d9506 100644 --- a/code/modules/holiday/holidays.dm +++ b/code/modules/holiday/holidays.dm @@ -403,6 +403,17 @@ Since Ramadan is an entire month that lasts 29.5 days on average, the start and /datum/holiday/xmas/greet() return "Have a merry Christmas!" +/datum/holiday/xmas/celebrate() + SSticker.OnRoundstart(CALLBACK(src, .proc/roundstart_celebrate)) + +/datum/holiday/xmas/proc/roundstart_celebrate() + for(var/obj/machinery/computer/security/telescreen/entertainment/Monitor in GLOB.machines) + Monitor.icon_state = "entertainment_xmas" + + for(var/mob/living/simple_animal/pet/dog/corgi/Ian/Ian in GLOB.mob_living_list) + Ian.place_on_head(new /obj/item/clothing/head/helmet/space/santahat(Ian)) + + /datum/holiday/festive_season name = FESTIVE_SEASON begin_day = 1 From 067680155f698851aa6de44bf3b23d434c76fb56 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Wed, 27 Dec 2017 11:49:03 -0500 Subject: [PATCH 44/48] Removes typepath from random event admin message --- code/modules/events/_event.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/events/_event.dm b/code/modules/events/_event.dm index 471dad12d7..d49a1d194f 100644 --- a/code/modules/events/_event.dm +++ b/code/modules/events/_event.dm @@ -60,7 +60,7 @@ triggering = TRUE if (alertadmins) - message_admins("Random Event triggering in 10 seconds: [name] ([typepath]) (CANCEL)") + message_admins("Random Event triggering in 10 seconds: [name] (CANCEL)") sleep(100) var/gamemode = SSticker.mode.config_tag var/players_amt = get_active_player_count(alive_check = TRUE, afk_check = TRUE, human_check = TRUE) From 868fbec32dc13a07d08b1fcecfaa37d5a191b98e Mon Sep 17 00:00:00 2001 From: Leo Date: Thu, 28 Dec 2017 19:02:30 -0200 Subject: [PATCH 46/48] Merge pull request #33881 from AnturK/walls-have-eyes Makes reset_perspective handle turf as eye --- code/controllers/subsystem/parallax.dm | 4 ++-- code/modules/mob/mob.dm | 6 +++--- 2 files changed, 5 insertions(+), 5 deletions(-) diff --git a/code/controllers/subsystem/parallax.dm b/code/controllers/subsystem/parallax.dm index 39d07ee676..4fa843906c 100644 --- a/code/controllers/subsystem/parallax.dm +++ b/code/controllers/subsystem/parallax.dm @@ -21,8 +21,8 @@ SUBSYSTEM_DEF(parallax) return continue var/atom/movable/A = C.eye - if(!A) - return + if(!istype(A)) + continue for (A; isloc(A.loc) && !isturf(A.loc); A = A.loc); if(A != C.movingmob) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index fdf454b514..a818a01764 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -260,13 +260,13 @@ client.perspective = EYE_PERSPECTIVE client.eye = A else - if(isturf(loc)) + if(isturf(loc) && (!A || loc == A)) client.eye = client.mob client.perspective = MOB_PERSPECTIVE else client.perspective = EYE_PERSPECTIVE - client.eye = loc - return 1 + client.eye = A + return 1 /mob/living/reset_perspective(atom/A) if(..()) From fa8b710fded6af7e386cba96ceb7dcfa826e10ec Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 29 Dec 2017 00:47:19 -0600 Subject: [PATCH 48/48] Automatic changelog generation for PR #4556 [ci skip] --- html/changelogs/AutoChangeLog-pr-4556.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4556.yml diff --git a/html/changelogs/AutoChangeLog-pr-4556.yml b/html/changelogs/AutoChangeLog-pr-4556.yml new file mode 100644 index 0000000000..05fa937caa --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4556.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - rscadd: "you can now pick up corgi's and pAIs, how disgustingly cute"