"
- t += "O" //up-left
- t += "^" //up
- t += "O " //up-right
- t += "<"//left
- t += "R"//reset to 0
- t += "> "//right
- t += "O"//down-left
- t += "v"//down
- t += "O "//down-right
- t += " "
- t += "
Current regime: [regime_set] "
- data += "Current target: [(!target) ? "None" : "[get_area(target)] [(regime_set != "Gate") ? "" : "Teleporter"]"] "
- if(calibrating)
- data += "Calibration: In Progress"
- else if(power_station.teleporter_hub.calibrated || power_station.efficiency >= 3)
- data += "Calibration: Optimal"
- else
- data += "Calibration: Sub-Optimal"
- data += "
"
+ data["calibrated"] = FALSE
- data += "Change regime "
- data += "Set target "
+ return data
- data += " Calibrate Hub"
- var/datum/browser/popup = new(user, "teleporter", name, 400, 400)
- popup.set_content(data)
- popup.open()
-
-/obj/machinery/computer/teleporter/Topic(href, href_list)
+/obj/machinery/computer/teleporter/ui_act(action, params)
if(..())
return
@@ -70,38 +68,39 @@
say("Error: Calibration in progress. Stand by.")
return
- if(href_list["regimeset"])
- power_station.engaged = 0
- power_station.teleporter_hub.update_icon()
- power_station.teleporter_hub.calibrated = 0
- reset_regime()
- if(href_list["settarget"])
- power_station.engaged = 0
- power_station.teleporter_hub.update_icon()
- power_station.teleporter_hub.calibrated = 0
- set_target(usr)
- if(href_list["calibrate"])
- if(!target)
- say("Error: No target set to calibrate to.")
- return
- if(power_station.teleporter_hub.calibrated || power_station.efficiency >= 3)
- say("Hub is already calibrated!")
- return
- say("Processing hub calibration to target...")
+ switch(action)
+ if("regimeset")
+ power_station.engaged = FALSE
+ power_station.teleporter_hub.update_icon()
+ power_station.teleporter_hub.calibrated = FALSE
+ reset_regime()
+ . = TRUE
+ if("settarget")
+ power_station.engaged = FALSE
+ power_station.teleporter_hub.update_icon()
+ power_station.teleporter_hub.calibrated = FALSE
+ set_target(usr)
+ . = TRUE
+ if("calibrate")
+ if(!target)
+ say("Error: No target set to calibrate to.")
+ return
+ if(power_station.teleporter_hub.calibrated || power_station.teleporter_hub.accuracy >= 3)
+ say("Hub is already calibrated!")
+ return
- calibrating = 1
- power_station.update_icon()
- spawn(50 * (3 - power_station.efficiency)) //Better parts mean faster calibration
- calibrating = 0
- if(check_hub_connection())
- power_station.teleporter_hub.calibrated = 1
- say("Calibration complete.")
- else
- say("Error: Unable to detect hub.")
+ say("Processing hub calibration to target...")
+ calibrating = TRUE
power_station.update_icon()
- updateDialog()
-
- updateDialog()
+ spawn(50 * (3 - power_station.teleporter_hub.accuracy)) //Better parts mean faster calibration
+ calibrating = FALSE
+ if(check_hub_connection())
+ power_station.teleporter_hub.calibrated = TRUE
+ say("Calibration complete.")
+ else
+ say("Error: Unable to detect hub.")
+ power_station.update_icon()
+ . = TRUE
/obj/machinery/computer/teleporter/proc/check_hub_connection()
if(!power_station)
diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm
index 3e88223037..f28d520114 100644
--- a/code/game/machinery/doors/airlock.dm
+++ b/code/game/machinery/doors/airlock.dm
@@ -1434,7 +1434,7 @@
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "ai_airlock", name, 550, 456, master_ui, state)
+ ui = new(user, src, ui_key, "ai_airlock", name, 500, 390, master_ui, state)
ui.open()
return TRUE
@@ -1503,83 +1503,24 @@
if("shock-perm")
shock_perm(usr)
. = TRUE
- if("idscan-on")
- if(wires.is_cut(WIRE_IDSCAN))
- to_chat(usr, "You can't enable IdScan - The IdScan wire has been cut.")
- else if(src.aiDisabledIdScanner)
- aiDisabledIdScanner = FALSE
- else
- to_chat(usr, "The IdScan feature is not disabled.")
+ if("idscan-toggle")
+ aiDisabledIdScanner = !aiDisabledIdScanner
. = TRUE
- if("idscan-off")
- if(wires.is_cut(WIRE_IDSCAN))
- to_chat(usr, "The IdScan wire has been cut - So, you can't disable it, but it is already disabled anyways.")
- else if(aiDisabledIdScanner)
- to_chat(usr, "You've already disabled the IdScan feature.")
- else
- aiDisabledIdScanner = TRUE
+ if("emergency-toggle")
+ toggle_emergency(usr)
. = TRUE
- if("emergency-on")
- emergency_on(usr)
+ if("bolt-toggle")
+ toggle_bolt(usr)
. = TRUE
- if("emergency-off")
- emergency_off(usr)
+ if("light-toggle")
+ lights = !lights
+ update_icon()
. = TRUE
- if("bolt-raise")
- bolt_raise(usr)
+ if("safe-toggle")
+ safe = !safe
. = TRUE
- if("bolt-drop")
- bolt_drop(usr)
- . = TRUE
- if("light-on")
- if(wires.is_cut(WIRE_LIGHT))
- to_chat(usr, "Control to door bolt lights has been severed.")
- else if (!src.lights)
- lights = TRUE
- update_icon()
- else
- to_chat(usr, text("Door bolt lights are already enabled!"))
- . = TRUE
- if("light-off")
- if(wires.is_cut(WIRE_LIGHT))
- to_chat(usr, "Control to door bolt lights has been severed.")
- else if (lights)
- lights = FALSE
- update_icon()
- else
- to_chat(usr, "Door bolt lights are already disabled!")
- . = TRUE
- if("safe-on")
- if(wires.is_cut(WIRE_SAFETY))
- to_chat(usr, "Control to door sensors is disabled.")
- else if (!src.safe)
- safe = TRUE
- else
- to_chat(usr, "Firmware reports safeties already in place.")
- . = TRUE
- if("safe-off")
- if(wires.is_cut(WIRE_SAFETY))
- to_chat(usr, "Control to door sensors is disabled.")
- else if (safe)
- safe = FALSE
- else
- to_chat(usr, "Firmware reports safeties already overridden.")
- . = TRUE
- if("speed-on")
- if(wires.is_cut(WIRE_TIMING))
- to_chat(usr, "Control to door timing circuitry has been severed.")
- else if (!src.normalspeed)
- normalspeed = 1
- else
- to_chat(usr,"Door timing circuitry currently operating normally.")
- . = TRUE
- if("speed-off")
- if(wires.is_cut(WIRE_TIMING))
- to_chat(usr, "Control to door timing circuitry has been severed.")
- else if (normalspeed)
- normalspeed = 0
- else
- to_chat(usr, "Door timing circuitry already accelerated.")
+ if("speed-toggle")
+ normalspeed = !normalspeed
. = TRUE
if("open-close")
@@ -1617,45 +1558,26 @@
log_combat(user, src, "electrified")
set_electrified(ELECTRIFIED_PERMANENT)
-/obj/machinery/door/airlock/proc/emergency_on(mob/user)
- if(!user_allowed(user))
- return
- if (!emergency)
- emergency = TRUE
- update_icon()
- else
- to_chat(user, "Emergency access is already enabled!")
-
-/obj/machinery/door/airlock/proc/emergency_off(mob/user)
- if(!user_allowed(user))
- return
- if (emergency)
- emergency = FALSE
- update_icon()
- else
- to_chat(user, "Emergency access is already disabled!")
-
-/obj/machinery/door/airlock/proc/bolt_raise(mob/user)
+/obj/machinery/door/airlock/proc/toggle_bolt(mob/user)
if(!user_allowed(user))
return
if(wires.is_cut(WIRE_BOLTS))
- to_chat(user, "The door bolt drop wire is cut - you can't raise the door bolts")
- else if(!src.locked)
- to_chat(user, "The door bolts are already up")
- else
- if(src.hasPower())
- unbolt()
+ to_chat(user, "The door bolt drop wire is cut - you can't toggle the door bolts.")
+ return
+ if(locked)
+ if(!hasPower())
+ to_chat(user, "The door has no power - you can't raise the door bolts.")
else
- to_chat(user, "Cannot raise door bolts due to power failure")
-
-/obj/machinery/door/airlock/proc/bolt_drop(mob/user)
- if(!user_allowed(user))
- return
- if(wires.is_cut(WIRE_BOLTS))
- to_chat(user, "You can't drop the door bolts - The door bolt dropping wire has been cut.")
+ unbolt()
else
bolt()
+/obj/machinery/door/airlock/proc/toggle_emergency(mob/user)
+ if(!user_allowed(user))
+ return
+ emergency = !emergency
+ update_icon()
+
/obj/machinery/door/airlock/proc/user_toggle_open(mob/user)
if(!user_allowed(user))
return
diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm
index 54774a8f99..7b90715f2b 100644
--- a/code/game/machinery/doors/airlock_electronics.dm
+++ b/code/game/machinery/doors/airlock_electronics.dm
@@ -14,7 +14,7 @@
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state)
SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "airlock_electronics", name, 975, 420, master_ui, state)
+ ui = new(user, src, ui_key, "airlock_electronics", name, 420, 485, master_ui, state)
ui.open()
/obj/item/electronics/airlock/ui_data()
@@ -43,13 +43,16 @@
if(..())
return
switch(action)
- if("clear")
+ if("clear_all")
accesses = list()
one_access = 0
. = TRUE
if("one_access")
one_access = !one_access
. = TRUE
+ if("grant_all")
+ accesses = get_all_accesses()
+ . = TRUE
if("set")
var/access = text2num(params["access"])
if (!(access in accesses))
diff --git a/code/game/machinery/doors/brigdoors.dm b/code/game/machinery/doors/brigdoors.dm
index a513d7feed..3bfcececda 100644
--- a/code/game/machinery/doors/brigdoors.dm
+++ b/code/game/machinery/doors/brigdoors.dm
@@ -149,7 +149,7 @@
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "brig_timer", name, 300, 200, master_ui, state)
+ ui = new(user, src, ui_key, "brig_timer", name, 300, 138, master_ui, state)
ui.open()
//icon update function
diff --git a/code/game/machinery/gulag_item_reclaimer.dm b/code/game/machinery/gulag_item_reclaimer.dm
index f51c145635..55b1e34022 100644
--- a/code/game/machinery/gulag_item_reclaimer.dm
+++ b/code/game/machinery/gulag_item_reclaimer.dm
@@ -31,7 +31,7 @@
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "gulag_item_reclaimer", name, 455, 440, master_ui, state)
+ ui = new(user, src, ui_key, "gulag_item_reclaimer", name, 300, 400, master_ui, state)
ui.open()
/obj/machinery/gulag_item_reclaimer/ui_data(mob/user)
diff --git a/code/game/machinery/launch_pad.dm b/code/game/machinery/launch_pad.dm
index b4a9584368..0f5e51215d 100644
--- a/code/game/machinery/launch_pad.dm
+++ b/code/game/machinery/launch_pad.dm
@@ -16,6 +16,7 @@
var/power_efficiency = 1
var/x_offset = 0
var/y_offset = 0
+ var/indicator_icon = "launchpad_target"
/obj/machinery/launchpad/RefreshParts()
var/E = 0
@@ -34,17 +35,28 @@
return
if(panel_open)
- if(istype(I, /obj/item/multitool))
+ if(I.tool_behaviour == TOOL_MULTITOOL)
+ if(!multitool_check_buffer(user, I))
+ return
var/obj/item/multitool/M = I
M.buffer = src
to_chat(user, "You save the data in the [I.name]'s buffer.")
- return 1
+ return TRUE
if(default_deconstruction_crowbar(I))
return
return ..()
+/obj/machinery/launchpad/attack_ghost(mob/dead/observer/ghost)
+ . = ..()
+ if(.)
+ return
+ var/target_x = x + x_offset
+ var/target_y = y + y_offset
+ var/turf/target = locate(target_x, target_y, z)
+ ghost.forceMove(target)
+
/obj/machinery/launchpad/proc/isAvailable()
if(stat & NOPOWER)
return FALSE
@@ -52,6 +64,14 @@
return FALSE
return TRUE
+/obj/machinery/launchpad/proc/set_offset(x, y)
+ if(teleporting)
+ return
+ if(!isnull(x))
+ x_offset = CLAMP(x, -range, range)
+ if(!isnull(y))
+ y_offset = CLAMP(y, -range, range)
+
/obj/machinery/launchpad/proc/doteleport(mob/user, sending)
if(teleporting)
to_chat(user, "ERROR: Launchpad busy.")
@@ -69,12 +89,22 @@
var/area/A = get_area(target)
flick(icon_teleport, src)
- playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, 1)
+
+ //Change the indicator's icon to show that we're teleporting
+ if(sending)
+ indicator_icon = "launchpad_launch"
+ else
+ indicator_icon = "launchpad_pull"
+
+ playsound(get_turf(src), 'sound/weapons/flash.ogg', 25, TRUE)
teleporting = TRUE
sleep(teleport_speed)
+ //Set the indicator icon back to normal
+ indicator_icon = "launchpad_target"
+
if(QDELETED(src) || !isAvailable())
return
@@ -91,25 +121,25 @@
source = dest
dest = target
- playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, 1)
+ playsound(get_turf(src), 'sound/weapons/emitter2.ogg', 25, TRUE)
var/first = TRUE
for(var/atom/movable/ROI in source)
if(ROI == src)
continue
- // if it's anchored, don't teleport
+ if(!istype(ROI) || isdead(ROI) || iscameramob(ROI) || istype(ROI, /obj/effect/dummy/phased_mob))
+ continue//don't teleport these
var/on_chair = ""
- if(ROI.anchored)
+ if(ROI.anchored)// if it's anchored, don't teleport
if(isliving(ROI))
var/mob/living/L = ROI
if(L.buckled)
// TP people on office chairs
if(L.buckled.anchored)
continue
-
on_chair = " (on a chair)"
else
continue
- else if(!isobserver(ROI))
+ else
continue
if(!first)
log_msg += ", "
@@ -158,11 +188,11 @@
var/obj/item/storage/briefcase/launchpad/briefcase
/obj/machinery/launchpad/briefcase/Initialize(mapload, briefcase)
- . = ..()
- if(!briefcase)
- log_game("[src] has been spawned without a briefcase.")
- return INITIALIZE_HINT_QDEL
- src.briefcase = briefcase
+ . = ..()
+ if(!briefcase)
+ log_game("[src] has been spawned without a briefcase.")
+ return INITIALIZE_HINT_QDEL
+ src.briefcase = briefcase
/obj/machinery/launchpad/briefcase/Destroy()
QDEL_NULL(briefcase)
@@ -255,7 +285,7 @@
/obj/item/launchpad_remote/ui_interact(mob/user, ui_key = "launchpad_remote", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "launchpad_remote", "Briefcase Launchpad Remote", 550, 400, master_ui, state) //width, height
+ ui = new(user, src, ui_key, "launchpad_remote", "Briefcase Launchpad Remote", 300, 240, master_ui, state) //width, height
ui.set_style("syndicate")
ui.open()
@@ -270,10 +300,9 @@
return data
data["pad_name"] = pad.display_name
- data["abs_x"] = abs(pad.x_offset)
- data["abs_y"] = abs(pad.y_offset)
- data["north_south"] = pad.y_offset > 0 ? "N":"S"
- data["east_west"] = pad.x_offset > 0 ? "E":"W"
+ data["range"] = pad.range
+ data["x"] = pad.x_offset
+ data["y"] = pad.y_offset
return data
/obj/item/launchpad_remote/proc/teleport(mob/user, obj/machinery/launchpad/pad)
@@ -289,76 +318,33 @@
if(..())
return
switch(action)
- if("right")
- if(pad.x_offset < pad.range)
- pad.x_offset++
+ if("set_pos")
+ var/new_x = text2num(params["x"])
+ var/new_y = text2num(params["y"])
+ pad.set_offset(new_x, new_y)
. = TRUE
-
- if("left")
- if(pad.x_offset > (pad.range * -1))
- pad.x_offset--
+ if("move_pos")
+ var/plus_x = text2num(params["x"])
+ var/plus_y = text2num(params["y"])
+ pad.set_offset(
+ x = pad.x_offset + plus_x,
+ y = pad.y_offset + plus_y
+ )
. = TRUE
-
- if("up")
- if(pad.y_offset < pad.range)
- pad.y_offset++
- . = TRUE
-
- if("down")
- if(pad.y_offset > (pad.range * -1))
- pad.y_offset--
- . = TRUE
-
- if("up-right")
- if(pad.y_offset < pad.range)
- pad.y_offset++
- if(pad.x_offset < pad.range)
- pad.x_offset++
- . = TRUE
-
- if("up-left")
- if(pad.y_offset < pad.range)
- pad.y_offset++
- if(pad.x_offset > (pad.range * -1))
- pad.x_offset--
- . = TRUE
-
- if("down-right")
- if(pad.y_offset > (pad.range * -1))
- pad.y_offset--
- if(pad.x_offset < pad.range)
- pad.x_offset++
- . = TRUE
-
- if("down-left")
- if(pad.y_offset > (pad.range * -1))
- pad.y_offset--
- if(pad.x_offset > (pad.range * -1))
- pad.x_offset--
- . = TRUE
-
- if("reset")
- pad.y_offset = 0
- pad.x_offset = 0
- . = TRUE
-
if("rename")
. = TRUE
- var/new_name = stripped_input(usr, "How do you want to rename the launchpad?", "Launchpad", pad.display_name, 15)
+ var/new_name = params["name"]
if(!new_name)
return
pad.display_name = new_name
-
if("remove")
. = TRUE
if(usr && alert(usr, "Are you sure?", "Unlink Launchpad", "I'm Sure", "Abort") != "Abort")
pad = null
-
if("launch")
sending = TRUE
teleport(usr, pad)
. = TRUE
-
if("pull")
sending = FALSE
teleport(usr, pad)
diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm
index 670ce91674..89f70efc38 100644
--- a/code/game/machinery/suit_storage_unit.dm
+++ b/code/game/machinery/suit_storage_unit.dm
@@ -390,14 +390,24 @@
data["uv_super"] = uv_super
if(helmet)
data["helmet"] = helmet.name
+ else
+ data["helmet"] = null
if(suit)
data["suit"] = suit.name
+ else
+ data["suit"] = null
if(mask)
data["mask"] = mask.name
+ else
+ data["mask"] = null
if(storage)
data["storage"] = storage.name
+ else
+ data["storage"] = null
if(occupant)
- data["occupied"] = 1
+ data["occupied"] = TRUE
+ else
+ data["occupied"] = FALSE
return data
/obj/machinery/suit_storage_unit/ui_act(action, params)
diff --git a/code/game/mecha/mech_bay.dm b/code/game/mecha/mech_bay.dm
index 90f037c279..facf687cc4 100644
--- a/code/game/mecha/mech_bay.dm
+++ b/code/game/mecha/mech_bay.dm
@@ -84,7 +84,7 @@
/obj/machinery/computer/mech_bay_power_console/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "mech_bay_power_console", "Mech Bay Power Control Console", 400, 170, master_ui, state)
+ ui = new(user, src, ui_key, "mech_bay_power_console", "Mech Bay Power Control Console", 400, 200, master_ui, state)
ui.open()
/obj/machinery/computer/mech_bay_power_console/ui_act(action, params)
@@ -101,7 +101,7 @@
if(recharge_port && !QDELETED(recharge_port))
data["recharge_port"] = list("mech" = null)
if(recharge_port.recharging_mech && !QDELETED(recharge_port.recharging_mech))
- data["recharge_port"]["mech"] = list("health" = recharge_port.recharging_mech.obj_integrity, "maxhealth" = recharge_port.recharging_mech.max_integrity, "cell" = null)
+ data["recharge_port"]["mech"] = list("health" = recharge_port.recharging_mech.obj_integrity, "maxhealth" = recharge_port.recharging_mech.max_integrity, "cell" = null, "name" = recharge_port.recharging_mech.name,)
if(recharge_port.recharging_mech.cell && !QDELETED(recharge_port.recharging_mech.cell))
data["recharge_port"]["mech"]["cell"] = list(
"critfail" = recharge_port.recharging_mech.cell.crit_fail,
diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm
index 12793df842..237aca02a9 100644
--- a/code/game/objects/items/RPD.dm
+++ b/code/game/objects/items/RPD.dm
@@ -249,7 +249,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
var/datum/asset/assets = get_asset_datum(/datum/asset/spritesheet/pipes)
assets.send(user)
- ui = new(user, src, ui_key, "rpd", name, 425, 515, master_ui, state)
+ ui = new(user, src, ui_key, "rpd", name, 425, 472, master_ui, state)
ui.open()
/obj/item/pipe_dispenser/ui_data(mob/user)
@@ -316,9 +316,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
playeffect = FALSE
if("mode")
var/n = text2num(params["mode"])
- if(n == 2 && !(mode&1) && !(mode&2))
- mode |= 3
- else if(mode&n)
+ if(mode & n)
mode &= ~n
else
mode |= n
@@ -327,6 +325,7 @@ GLOBAL_LIST_INIT(transit_tube_recipes, list(
spark_system.start()
effectcooldown = world.time + 100
playsound(get_turf(src), 'sound/effects/pop.ogg', 50, 0)
+ return TRUE
/obj/item/pipe_dispenser/pre_attack(atom/A, mob/user)
var/turf/T = get_turf(A)
diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm
index eff8f1b7dc..9a09be093d 100644
--- a/code/game/objects/items/devices/gps.dm
+++ b/code/game/objects/items/devices/gps.dm
@@ -73,8 +73,10 @@ GLOBAL_LIST_EMPTY(GPS_list)
return
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- var/gps_window_height = 300 + GLOB.GPS_list.len * 20 // Variable window height, depending on how many GPS units there are to show
- ui = new(user, src, ui_key, "gps", "Global Positioning System", 600, gps_window_height, master_ui, state) //width, height
+ // Variable window height, depending on how many GPS units there are
+ // to show, clamped to relatively safe range.
+ var/gps_window_height = CLAMP(325 + GLOB.GPS_list.len * 14, 325, 700)
+ ui = new(user, src, ui_key, "gps", "Global Positioning System", 470, gps_window_height, master_ui, state) //width, height
ui.open()
ui.set_autoupdate(state = updating)
@@ -91,6 +93,8 @@ GLOBAL_LIST_EMPTY(GPS_list)
var/turf/curr = get_turf(src)
data["current"] = "[get_area_name(curr, TRUE)] ([curr.x], [curr.y], [curr.z])"
+ data["currentArea"] = "[get_area_name(curr, TRUE)]"
+ data["currentCoords"] = "[curr.x], [curr.y], [curr.z]"
var/list/signals = list()
data["signals"] = list()
@@ -104,16 +108,10 @@ GLOBAL_LIST_EMPTY(GPS_list)
continue
var/list/signal = list()
signal["entrytag"] = G.gpstag //Name or 'tag' of the GPS
- signal["area"] = get_area_name(G, TRUE)
- signal["coord"] = "[pos.x], [pos.y], [pos.z]"
+ signal["coords"] = "[pos.x], [pos.y], [pos.z]"
if(pos.z == curr.z) //Distance/Direction calculations for same z-level only
signal["dist"] = max(get_dist(curr, pos), 0) //Distance between the src and remote GPS turfs
signal["degrees"] = round(Get_Angle(curr, pos)) //0-360 degree directional bearing, for more precision.
- var/direction = uppertext(dir2text(get_dir(curr, pos))) //Direction text (East, etc). Not as precise, but still helpful.
- if(!direction)
- direction = "CENTER"
- signal["degrees"] = "N/A"
- signal["direction"] = direction
signals += list(signal) //Add this signal to the list of signals
data["signals"] = signals
diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm
index 8ccd15e397..b87b7b11bd 100644
--- a/code/game/objects/items/devices/radio/radio.dm
+++ b/code/game/objects/items/devices/radio/radio.dm
@@ -112,7 +112,14 @@
. = ..()
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "radio", name, 370, 220 + channels.len * 22, master_ui, state)
+ var/ui_width = 360
+ var/ui_height = 106
+ if(subspace_transmission)
+ if(channels.len > 0)
+ ui_height += 6 + channels.len * 21
+ else
+ ui_height += 24
+ ui = new(user, src, ui_key, "radio", name, ui_width, ui_height, master_ui, state)
ui.open()
/obj/item/radio/ui_data(mob/user)
diff --git a/code/game/objects/items/eightball.dm b/code/game/objects/items/eightball.dm
index b37c147357..c4a15a1871 100644
--- a/code/game/objects/items/eightball.dm
+++ b/code/game/objects/items/eightball.dm
@@ -54,7 +54,7 @@
to_chat(user, "[src] was shaken recently, it needs time to settle.")
return
- user.visible_message("[user] starts shaking [src].", "You start shaking [src].", "You hear shaking and sloshing.")
+ user.visible_message("[user] starts shaking [src].", "You start shaking [src].", "You hear shaking and sloshing.")
shaking = TRUE
@@ -95,16 +95,47 @@
// except it actually ASKS THE DEAD (wooooo)
/obj/item/toy/eightball/haunted
- shake_time = 150
- cooldown_time = 1800
+ shake_time = 30 SECONDS
+ cooldown_time = 3 MINUTES
flags_1 = HEAR_1
var/last_message
var/selected_message
- var/list/votes
+ //these kind of store the same thing but one is easier to work with.
+ var/list/votes = list()
+ var/list/voted = list()
+ var/static/list/haunted_answers = list(
+ "yes" = list(
+ "It is certain",
+ "It is decidedly so",
+ "Without a doubt",
+ "Yes definitely",
+ "You may rely on it",
+ "As I see it, yes",
+ "Most likely",
+ "Outlook good",
+ "Yes",
+ "Signs point to yes"
+ ),
+ "maybe" = list(
+ "Reply hazy try again",
+ "Ask again later",
+ "Better not tell you now",
+ "Cannot predict now",
+ "Concentrate and ask again"
+ ),
+ "no" = list(
+ "Don't count on it",
+ "My reply is no",
+ "My sources say no",
+ "Outlook not so good",
+ "Very doubtful"
+ )
+ )
/obj/item/toy/eightball/haunted/Initialize(mapload)
. = ..()
- votes = list()
+ for (var/answer in haunted_answers)
+ votes[answer] = 0
GLOB.poi_list |= src
/obj/item/toy/eightball/haunted/Destroy()
@@ -122,7 +153,7 @@
interact(user)
return ..()
-/obj/item/toy/eightball/haunted/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode, atom/movable/source)
+/obj/item/toy/eightball/haunted/Hear(message, atom/movable/speaker, message_langs, raw_message, radio_freq, spans, message_mode)
. = ..()
last_message = raw_message
@@ -137,38 +168,31 @@
if(isobserver(usr))
interact(usr)
-/obj/item/toy/eightball/haunted/proc/get_vote_tallies()
- var/list/answers = list()
- for(var/ckey in votes)
- var/selected = votes[ckey]
- if(selected in answers)
- answers[selected]++
- else
- answers[selected] = 1
-
- return answers
-
-
/obj/item/toy/eightball/haunted/get_answer()
- if(!votes.len)
- return pick(possible_answers)
+ var/top_amount = 0
+ var/top_vote
- var/list/tallied_votes = get_vote_tallies()
+ for(var/vote in votes)
+ var/amount_of_votes = length(votes[vote])
+ if(amount_of_votes > top_amount)
+ top_vote = vote
+ top_amount = amount_of_votes
+ //If one option actually has votes and there's a tie, pick between them 50/50
+ else if(top_amount && amount_of_votes == top_amount && prob(50))
+ top_vote = vote
+ top_amount = amount_of_votes
- // I miss python sorting, then I wouldn't have to muck about with
- // all this
- var/most_popular_answer
- var/most_amount = 0
- // yes, if there is a tie, there is an arbitary decision
- // but we never said the spirit world was fair
- for(var/A in tallied_votes)
- var/amount = tallied_votes[A]
- if(amount > most_amount)
- most_popular_answer = A
+ if(isnull(top_vote))
+ top_vote = pick(votes)
- return most_popular_answer
+ for(var/vote in votes)
+ votes[vote] = 0
-/obj/item/toy/eightball/haunted/ui_interact(mob/user, ui_key="main", datum/tgui/ui=null, force_open=0, datum/tgui/master_ui=null, datum/ui_state/state = GLOB.observer_state)
+ voted.Cut()
+
+ return top_vote
+
+/obj/item/toy/eightball/haunted/ui_interact(mob/user, ui_key="main", datum/tgui/ui=null, force_open=0, datum/tgui/master_ui=null, datum/ui_state/state = GLOB.always_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
@@ -179,21 +203,13 @@
var/list/data = list()
data["shaking"] = shaking
data["question"] = selected_message
- var/list/tallied_votes = get_vote_tallies()
data["answers"] = list()
-
- for(var/pa in possible_answers)
+ for(var/pa in haunted_answers)
var/list/L = list()
L["answer"] = pa
- var/amount = 0
- if(pa in tallied_votes)
- amount = tallied_votes[pa]
- L["amount"] = amount
- var/selected = FALSE
- if(votes[user.ckey] == pa)
- selected = TRUE
- L["selected"] = selected
+ L["amount"] = votes[pa]
+ L["selected"] = voted[user.ckey]
data["answers"] += list(L)
return data
@@ -206,8 +222,11 @@
switch(action)
if("vote")
var/selected_answer = params["answer"]
- if(!(selected_answer in possible_answers))
+ if(!(selected_answer in haunted_answers))
+ return
+ if(user.ckey in voted)
return
else
- votes[user.ckey] = selected_answer
- . = TRUE
+ votes[selected_answer] += 1
+ voted[user.ckey] = selected_answer
+ . = TRUE
\ No newline at end of file
diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm
index f763fe87fc..55d8c8256b 100644
--- a/code/game/objects/items/tanks/tanks.dm
+++ b/code/game/objects/items/tanks/tanks.dm
@@ -156,7 +156,7 @@
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.hands_state)
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "tanks", name, 420, 200, master_ui, state)
+ ui = new(user, src, ui_key, "tanks", name, 400, 120, master_ui, state)
ui.open()
/obj/item/tank/ui_data(mob/user)
diff --git a/code/game/objects/structures/ghost_role_spawners.dm b/code/game/objects/structures/ghost_role_spawners.dm
index 3ba9fea006..e9d9e4ce77 100644
--- a/code/game/objects/structures/ghost_role_spawners.dm
+++ b/code/game/objects/structures/ghost_role_spawners.dm
@@ -12,9 +12,11 @@
roundstart = FALSE
death = FALSE
mob_species = /datum/species/pod
- flavour_text = "You are a sentient ecosystem, an example of the mastery over life that your creators possessed. Your masters, benevolent as they were, created uncounted \
- seed vaults and spread them across the universe to every planet they could chart. You are in one such seed vault. Your goal is to cultivate and spread life wherever it will go while waiting \
- for contact from your creators. Estimated time of last contact: Deployment, 5x10^3 millennia ago."
+ short_desc = "You are a sentient ecosystem, an example of the mastery over life that your creators possessed."
+ flavour_text = "Your masters, benevolent as they were, created uncounted seed vaults and spread them across \
+ the universe to every planet they could chart. You are in one such seed vault. \
+ Your goal is to cultivate and spread life wherever it will go while waiting for contact from your creators. \
+ Estimated time of last contact: Deployment, 5000 millennia ago."
assignedrole = "Lifebringer"
/obj/effect/mob_spawn/human/seed_vault/special(mob/living/new_spawn)
@@ -48,8 +50,10 @@
anchored = FALSE
move_resist = MOVE_FORCE_NORMAL
density = FALSE
- flavour_text = "You are an ash walker. Your tribe worships the Necropolis. The wastes are sacred ground, its monsters a blessed bounty. You would never leave its beautiful expanse. \
- You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. Fresh sacrifices for your nest."
+ short_desc = "You are an ash walker. Your tribe worships the Necropolis."
+ flavour_text = "The wastes are sacred ground, its monsters a blessed bounty. You would never leave its sacred ground. \
+ You have seen lights in the distance... they foreshadow the arrival of outsiders that seek to tear apart the Necropolis and its domain. \
+ Fresh sacrifices for your nest."
assignedrole = "Ash Walker"
/obj/effect/mob_spawn/human/ash_walker/special(mob/living/new_spawn)
@@ -88,8 +92,9 @@
roundstart = FALSE
death = FALSE
mob_species = /datum/species/shadow
- flavour_text = "You are cursed. Years ago, you sacrificed the lives of your trusted friends and the humanity of yourself to reach the Wish Granter. Though you \
- did so, it has come at a cost: your very body rejects the light, dooming you to wander endlessly in this horrible wasteland."
+ short_desc = "You are cursed."
+ flavour_text = "Years ago, you sacrificed the lives of your trusted friends and the humanity of yourself to reach the Wish Granter. Though you \
+ did so, it has come at a cost: your very body rejects the light, dooming you to wander endlessly in this horrible wasteland."
assignedrole = "Exile"
/obj/effect/mob_spawn/human/exile/Destroy()
@@ -126,9 +131,10 @@
var/has_owner = FALSE
var/can_transfer = TRUE //if golems can switch bodies to this new shell
var/mob/living/owner = null //golem's owner if it has one
- flavour_text = "You are a Free Golem. Your family worships The Liberator. In his infinite and divine wisdom, he set your clan free to \
+ short_desc = "You are a Free Golem. Your family worships The Liberator."
+ flavour_text = "In his infinite and divine wisdom, he set your clan free to \
travel the stars with a single declaration: \"Yeah go do whatever.\" Though you are bound to the one who created you, it is customary in your society to repeat those same words to newborn \
- golems, so that no golem may ever be forced to serve again."
+ golems, so that no golem may ever be forced to serve again."
/obj/effect/mob_spawn/human/golem/Initialize(mapload, datum/species/golem/species = null, mob/creator = null)
if(species) //spawners list uses object name to register so this goes before ..()
@@ -139,8 +145,9 @@
if(!mapload && A)
notify_ghosts("\A [initial(species.prefix)] golem shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_key = POLL_IGNORE_GOLEM, ignore_dnr_observers = TRUE)
if(has_owner && creator)
- flavour_text = "You are a Golem. You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools. \
- Serve [creator], and assist [creator.p_them()] in completing [creator.p_their()] goals at any cost."
+ short_desc = "You are a golem."
+ flavour_text = "You move slowly, but are highly resistant to heat and cold as well as blunt trauma. You are unable to wear clothes, but can still use most tools."
+ important_info = "Serve [creator], and assist [creator.p_them()] in completing [creator.p_their()] goals at any cost."
owner = creator
/obj/effect/mob_spawn/human/golem/special(mob/living/new_spawn, name)
@@ -213,8 +220,9 @@
death = FALSE
random = TRUE
mob_species = /datum/species/human
- flavour_text = "You've been stranded in this godless prison of a planet for longer than you can remember. Each day you barely scrape by, and between the terrible \
- conditions of your makeshift shelter, the hostile creatures, and the ash drakes swooping down from the cloudless skies, all you can wish for is the feel of soft grass between your toes and \
+ short_desc = "You've been stranded in this godless prison of a planet for longer than you can remember."
+ flavour_text = "Each day you barely scrape by, and between the terrible conditions of your makeshift shelter, \
+ the hostile creatures, and the ash drakes swooping down from the cloudless skies, all you can wish for is the feel of soft grass between your toes and \
the fresh air of Earth. These thoughts are dispelled by yet another recollection of how you got here... "
assignedrole = "Hermit"
@@ -225,20 +233,20 @@
if(1)
flavour_text += "you were a [pick("arms dealer", "shipwright", "docking manager")]'s assistant on a small trading station several sectors from here. Raiders attacked, and there was \
only one pod left when you got to the escape bay. You took it and launched it alone, and the crowd of terrified faces crowding at the airlock door as your pod's engines burst to \
- life and sent you to this hell are forever branded into your memory."
+ life and sent you to this hell are forever branded into your memory."
outfit.uniform = /obj/item/clothing/under/assistantformal
outfit.shoes = /obj/item/clothing/shoes/sneakers/black
outfit.back = /obj/item/storage/backpack
if(2)
flavour_text += "you're an exile from the Tiger Cooperative. Their technological fanaticism drove you to question the power and beliefs of the Exolitics, and they saw you as a \
heretic and subjected you to hours of horrible torture. You were hours away from execution when a high-ranking friend of yours in the Cooperative managed to secure you a pod, \
- scrambled its destination's coordinates, and launched it. You awoke from stasis when you landed and have been surviving - barely - ever since."
+ scrambled its destination's coordinates, and launched it. You awoke from stasis when you landed and have been surviving - barely - ever since."
outfit.uniform = /obj/item/clothing/under/rank/prisoner
outfit.shoes = /obj/item/clothing/shoes/sneakers/orange
outfit.back = /obj/item/storage/backpack
if(3)
flavour_text += "you were a doctor on one of Nanotrasen's space stations, but you left behind that damn corporation's tyranny and everything it stood for. From a metaphorical hell \
- to a literal one, you find yourself nonetheless missing the recycled air and warm floors of what you left behind... but you'd still rather be here than there."
+ to a literal one, you find yourself nonetheless missing the recycled air and warm floors of what you left behind... but you'd still rather be here than there."
outfit.uniform = /obj/item/clothing/under/rank/medical
outfit.suit = /obj/item/clothing/suit/toggle/labcoat
outfit.back = /obj/item/storage/backpack/medic
@@ -246,7 +254,7 @@
if(4)
flavour_text += "you were always joked about by your friends for \"not playing with a full deck\", as they so kindly put it. It seems that they were right when you, on a tour \
at one of Nanotrasen's state-of-the-art research facilities, were in one of the escape pods alone and saw the red button. It was big and shiny, and it caught your eye. You pressed \
- it, and after a terrifying and fast ride for days, you landed here. You've had time to wisen up since then, and you think that your old friends wouldn't be laughing now."
+ it, and after a terrifying and fast ride for days, you landed here. You've had time to wisen up since then, and you think that your old friends wouldn't be laughing now."
outfit.uniform = /obj/item/clothing/under/color/grey/glorf
outfit.shoes = /obj/item/clothing/shoes/sneakers/black
outfit.back = /obj/item/storage/backpack
@@ -264,9 +272,10 @@
desc = "A small sleeper typically used to instantly restore minor wounds. This one seems broken, and its occupant is comatose."
job_description = "Lavaland Veterinarian"
mob_name = "a translocated vet"
- flavour_text = "What...? Where are you? Where are the others? This is still the animal hospital - you should know, you've been an intern here for weeks - but \
- everyone's gone. One of the cats scratched you just a few minutes ago. That's why you were in the pod - to heal the scratch. The scabs are still fresh; you see them right now. So where is \
- everyone? Where did they go? What happened to the hospital? And is that smoke you smell? You need to find someone else. Maybe they can tell you what happened."
+ short_desc = "You are a animal doctor who just woke up in lavaland"
+ flavour_text = "What...? Where are you? Where are the others? This is still the animal hospital - you should know, you've been an intern here for weeks - but \
+ you see them right now. So where is \
+ everyone? Where did they go? What happened to the hospital? And is that smoke you smell? You need to find someone else. Maybe they c everyone's gone. One of the cats scratched you just a few minutes ago. That's why you were in the pod - to heal the scratch. The scabs are still fresh; an tell you what happened."
assignedrole = "Translocated Vet"
/obj/effect/mob_spawn/human/doctor/alive/lavaland/Destroy()
@@ -285,8 +294,9 @@
outfit = /datum/outfit/lavalandprisoner
roundstart = FALSE
death = FALSE
- flavour_text = "Good. It seems as though your ship crashed. You're a prisoner, sentenced to hard work in one of Nanotrasen's labor camps, but it seems as \
- though fate has other plans for you. You remember that you were convicted of "
+ short_desc = "You're a prisoner, sentenced to hard work in one of Nanotrasen's labor camps, but it seems as \
+ though fate has other plans for you."
+ flavour_text = "Good. It seems as though your ship crashed. You remember that you were convicted of "
assignedrole = "Escaped Prisoner"
/obj/effect/mob_spawn/human/prisoner_transport/special(mob/living/L)
@@ -298,7 +308,7 @@
var/list/crimes = list("murder", "larceny", "embezzlement", "unionization", "dereliction of duty", "kidnapping", "gross incompetence", "grand theft", "collaboration with the Syndicate", \
"worship of a forbidden deity", "interspecies relations", "mutiny")
flavour_text += "[pick(crimes)]. but regardless of that, it seems like your crime doesn't matter now. You don't know where you are, but you know that it's out to kill you, and you're not going \
- to lose this opportunity. Find a way to get out of this mess and back to where you rightfully belong - your [pick("house", "apartment", "spaceship", "station")]."
+ to lose this opportunity. Find a way to get out of this mess and back to where you rightfully belong - your [pick("house", "apartment", "spaceship", "station")]."
/datum/outfit/lavalandprisoner
name = "Lavaland Prisoner"
@@ -325,8 +335,9 @@
roundstart = FALSE
random = TRUE
outfit = /datum/outfit/hotelstaff
- flavour_text = "You are a staff member of a top-of-the-line space hotel! Cater to guests and DON'T leave the hotel, lest the manager fire you for\
- dereliction of duty!"
+ short_desc = "You are a staff member of a top-of-the-line space hotel!"
+ flavour_text = "You are a staff member of a top-of-the-line space hotel! Cater to guests and make sure the manager doesn't fire you."
+ important_info = "DON'T leave the hotel"
assignedrole = "Hotel Staff"
/datum/outfit/hotelstaff
@@ -343,8 +354,10 @@
mob_name = "hotel security member"
job_description = "Hotel Security"
outfit = /datum/outfit/hotelstaff/security
- flavour_text = "You are a peacekeeper assigned to this hotel to protect the interests of the company while keeping the peace between \
- guests and the staff. Do NOT leave the hotel, as that is grounds for contract termination."
+ short_desc = "You are a peacekeeper."
+ flavour_text = "You have been assigned to this hotel to protect the interests of the company while keeping the peace between \
+ guests and the staff."
+ important_info = "Do NOT leave the hotel, as that is grounds for contract termination."
objectives = "Do not leave your assigned hotel. Try and keep the peace between staff and guests, non-lethal force heavily advised if possible."
/datum/outfit/hotelstaff/security
@@ -383,7 +396,8 @@
/obj/effect/mob_spawn/human/demonic_friend/Initialize(mapload, datum/mind/owner_mind, obj/effect/proc_holder/spell/targeted/summon_friend/summoning_spell)
. = ..()
owner = owner_mind
- flavour_text = "You have been given a reprieve from your eternity of torment, to be [owner.name]'s friend for [owner.p_their()] short mortal coil. Be aware that if you do not live up to [owner.name]'s expectations, they can send you back to hell with a single thought. [owner.name]'s death will also return you to hell."
+ flavour_text = "You have been given a reprieve from your eternity of torment, to be [owner.name]'s friend for [owner.p_their()] short mortal coil."
+ important_info = "Be aware that if you do not live up to [owner.name]'s expectations, they can send you back to hell with a single thought. [owner.name]'s death will also return you to hell."
var/area/A = get_area(src)
if(!mapload && A)
notify_ghosts("\A friendship shell has been completed in \the [A.name].", source = src, action=NOTIFY_ATTACK, flashwindow = FALSE, ignore_dnr_observers = TRUE)
@@ -441,9 +455,9 @@
/obj/effect/mob_spawn/human/syndicate/battlecruiser
name = "Syndicate Battlecruiser Ship Operative"
- flavour_text = "You are a crewmember aboard the syndicate flagship: the SBC Starfury.Your job is to follow your captain's orders, maintain the ship, and keep the engine running. If you are not familiar with how the supermatter engine functions: do not attempt to start it. \
- \
- The armory is not a candy store, and your role is not to assault the station directly, leave that work to the assault operatives."
+ short_desc = "You are a crewmember aboard the syndicate flagship: the SBC Starfury."
+ flavour_text = "Your job is to follow your captain's orders, maintain the ship, and keep the engine running. If you are not familiar with how the supermatter engine functions: do not attempt to start it."
+ important_info = "The armory is not a candy store, and your role is not to assault the station directly, leave that work to the assault operatives."
outfit = /datum/outfit/syndicate_empty/SBC
/datum/outfit/syndicate_empty/SBC
@@ -453,10 +467,9 @@
belt = /obj/item/storage/belt/military/assault
/obj/effect/mob_spawn/human/syndicate/battlecruiser/assault
- name = "Syndicate Battlecruiser Assault Operative"
- flavour_text = "You are an assault operative aboard the syndicate flagship: the SBC Starfury.Your job is to follow your captain's orders, keep intruders out of the ship, and assault Space Station 13. There is an armory, multiple assault ships, and beam cannons to attack the station with. \
- \
- Work as a team with your fellow operatives and work out a plan of attack. If you are overwhelmed, escape back to your ship!"
+ short_desc = "You are an assault operative aboard the syndicate flagship: the SBC Starfury."
+ flavour_text = "Your job is to follow your captain's orders, keep intruders out of the ship, and assault Space Station 13. There is an armory, multiple assault ships, and beam cannons to attack the station with."
+ important_info = "Work as a team with your fellow operatives and work out a plan of attack. If you are overwhelmed, escape back to your ship!"
outfit = /datum/outfit/syndicate_empty/SBC/assault
/datum/outfit/syndicate_empty/SBC/assault
@@ -472,9 +485,9 @@
/obj/effect/mob_spawn/human/syndicate/battlecruiser/captain
name = "Syndicate Battlecruiser Captain"
- flavour_text = "You are the captain aboard the syndicate flagship: the SBC Starfury.Your job is to oversee your crew, defend the ship, and destroy Space Station 13. The ship has an armory, multiple ships, beam cannons, and multiple crewmembers to accomplish this goal. \
- \
- As the captain, this whole operation falls on your shoulders. You do not need to nuke the station, causing sufficient damage and preventing your ship from being destroyed will be enough."
+ short_desc = "You are the captain aboard the syndicate flagship: the SBC Starfury."
+ flavour_text = "Your job is to oversee your crew, defend the ship, and destroy Space Station 13. The ship has an armory, multiple ships, beam cannons, and multiple crewmembers to accomplish this goal."
+ important_info = "As the captain, this whole operation falls on your shoulders. You do not need to nuke the station, causing sufficient damage and preventing your ship from being destroyed will be enough."
outfit = /datum/outfit/syndicate_empty/SBC/assault/captain
id_access_list = list(150,151)
@@ -500,10 +513,11 @@
death = FALSE
random = TRUE
mob_species = /datum/species/human
- flavour_text = "You are a security officer working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \
- cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
- your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \
- Work as a team with your fellow survivors and do not abandon them."
+ short_desc = "You are a security officer working for Nanotrasen, stationed onboard a state of the art research station."
+ flavour_text = "You vaguely recall rushing into a cryogenics pod due to an oncoming radiation storm. \
+ The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
+ your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod."
+ important_info = "Work as a team with your fellow survivors and do not abandon them."
uniform = /obj/item/clothing/under/rank/security
shoes = /obj/item/clothing/shoes/jackboots
id = /obj/item/card/id/away/old/sec
@@ -527,10 +541,11 @@
death = FALSE
random = TRUE
mob_species = /datum/species/human
- flavour_text = "You are an engineer working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \
- cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
- your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \
- Work as a team with your fellow survivors and do not abandon them."
+ short_desc = "You are an engineer working for Nanotrasen, stationed onboard a state of the art research station."
+ flavour_text = "You vaguely recall rushing into a cryogenics pod due to an oncoming radiation storm. The last thing \
+ you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
+ your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod."
+ important_info = "Work as a team with your fellow survivors and do not abandon them."
uniform = /obj/item/clothing/under/rank/engineer
shoes = /obj/item/clothing/shoes/workboots
id = /obj/item/card/id/away/old/eng
@@ -552,10 +567,11 @@
death = FALSE
random = TRUE
mob_species = /datum/species/human
- flavour_text = "You are a scientist working for Nanotrasen, stationed onboard a state of the art research station. You vaguely recall rushing into a \
- cryogenics pod due to an oncoming radiation storm. The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
- your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod. \
- Work as a team with your fellow survivors and do not abandon them."
+ short_desc = "You are a scientist working for Nanotrasen, stationed onboard a state of the art research station."
+ flavour_text = "You vaguely recall rushing into a cryogenics pod due to an oncoming radiation storm. \
+ The last thing you remember is the station's Artificial Program telling you that you would only be asleep for eight hours. As you open \
+ your eyes, everything seems rusted and broken, a dark feeling swells in your gut as you climb out of your pod."
+ important_info = "Work as a team with your fellow survivors and do not abandon them."
uniform = /obj/item/clothing/under/rank/scientist
shoes = /obj/item/clothing/shoes/laceup
id = /obj/item/card/id/away/old/sci
@@ -582,7 +598,8 @@
anchored = TRUE
density = FALSE
show_flavour = FALSE //Flavour only exists for spawners menu
- flavour_text = "You are a space pirate. The station refused to pay for your protection, protect the ship, siphon the credits from the station and raid it for even more loot."
+ short_desc = "You are a space pirate."
+ flavour_text = "The station refused to pay for your protection, protect the ship, siphon the credits from the station and raid it for even more loot."
assignedrole = "Space Pirate"
var/rank = "Mate"
@@ -617,7 +634,8 @@
density = FALSE
death = FALSE
assignedrole = "Ghost Cafe Visitor"
- flavour_text = "Is this what life after death is like?"
+ short_desc = "You are a Ghost Cafe Visitor!"
+ flavour_text = "You know one thing for sure. You arent actually alive. Are you in a simulation?"
skip_reentry_check = TRUE
banType = ROLE_GHOSTCAFE
diff --git a/code/game/objects/structures/tank_dispenser.dm b/code/game/objects/structures/tank_dispenser.dm
index f156287d43..5fabcafd75 100644
--- a/code/game/objects/structures/tank_dispenser.dm
+++ b/code/game/objects/structures/tank_dispenser.dm
@@ -71,7 +71,7 @@
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, "tank_dispenser", name, 275, 100, master_ui, state)
+ ui = new(user, src, ui_key, "tank_dispenser", name, 275, 103, master_ui, state)
ui.open()
/obj/structure/tank_dispenser/ui_data(mob/user)
diff --git a/code/game/world.dm b/code/game/world.dm
index 8c3e848106..8e18f2ea51 100644
--- a/code/game/world.dm
+++ b/code/game/world.dm
@@ -115,10 +115,12 @@ GLOBAL_LIST(topic_status_cache)
GLOB.world_runtime_log = "[GLOB.log_directory]/runtime.log"
GLOB.query_debug_log = "[GLOB.log_directory]/query_debug.log"
GLOB.world_job_debug_log = "[GLOB.log_directory]/job_debug.log"
+ GLOB.tgui_log = "[GLOB.log_directory]/tgui.log"
GLOB.subsystem_log = "[GLOB.log_directory]/subsystem.log"
GLOB.reagent_log = "[GLOB.log_directory]/reagents.log"
GLOB.world_crafting_log = "[GLOB.log_directory]/crafting.log"
+
#ifdef UNIT_TESTS
GLOB.test_log = file("[GLOB.log_directory]/tests.log")
start_log(GLOB.test_log)
@@ -132,6 +134,7 @@ GLOBAL_LIST(topic_status_cache)
start_log(GLOB.world_qdel_log)
start_log(GLOB.world_runtime_log)
start_log(GLOB.world_job_debug_log)
+ start_log(GLOB.tgui_log)
start_log(GLOB.subsystem_log)
start_log(GLOB.reagent_log)
start_log(GLOB.world_crafting_log)
diff --git a/code/modules/NTNet/network.dm b/code/modules/NTNet/network.dm
index 645f05ac90..a7607fb746 100644
--- a/code/modules/NTNet/network.dm
+++ b/code/modules/NTNet/network.dm
@@ -202,6 +202,11 @@
if(filename == P.filename)
return P
+/datum/ntnet/proc/get_chat_channel_by_id(id)
+ for(var/datum/ntnet_conversation/chan in chat_channels)
+ if(chan.id == id)
+ return chan
+
// Resets the IDS alarm
/datum/ntnet/proc/resetIDS()
intrusion_detection_alarm = FALSE
diff --git a/code/modules/NTNet/relays.dm b/code/modules/NTNet/relays.dm
index eaf2aa466b..373f6451b9 100644
--- a/code/modules/NTNet/relays.dm
+++ b/code/modules/NTNet/relays.dm
@@ -9,6 +9,9 @@
icon_state = "bus"
density = TRUE
circuit = /obj/item/circuitboard/machine/ntnet_relay
+ ui_x = 400
+ ui_y = 300
+
var/datum/ntnet/NTNet = null // This is mostly for backwards reference and to allow varedit modifications from ingame.
var/enabled = 1 // Set to 0 if the relay was turned off
var/dos_failure = 0 // Set to 1 if the relay failed due to (D)DoS attack
@@ -66,7 +69,7 @@
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
if(!ui)
- ui = new(user, src, ui_key, "ntnet_relay", "NTNet Quantum Relay", 500, 300, master_ui, state)
+ ui = new(user, src, ui_key, "ntnet_relay", "NTNet Quantum Relay", ui_x, ui_y, master_ui, state)
ui.open()
@@ -88,10 +91,12 @@
dos_failure = 0
update_icon()
SSnetworks.station_network.add_log("Quantum relay manually restarted from overload recovery mode to normal operation mode.")
+ return TRUE
if("toggle")
enabled = !enabled
SSnetworks.station_network.add_log("Quantum relay manually [enabled ? "enabled" : "disabled"].")
update_icon()
+ return TRUE
/obj/machinery/ntnet_relay/Initialize()
uid = gl_uid++
@@ -113,4 +118,4 @@
D.target = null
D.error = "Connection to quantum relay severed"
- return ..()
+ return ..()
\ No newline at end of file
diff --git a/code/modules/antagonists/disease/disease_abilities.dm b/code/modules/antagonists/disease/disease_abilities.dm
index dc2249006c..7b30d10c5d 100644
--- a/code/modules/antagonists/disease/disease_abilities.dm
+++ b/code/modules/antagonists/disease/disease_abilities.dm
@@ -57,7 +57,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
var/short_desc = ""
var/long_desc = ""
var/stat_block = ""
- var/threshold_block = ""
+ var/threshold_block = list()
var/category = ""
var/list/symptoms
@@ -76,7 +76,7 @@ GLOBAL_LIST_INIT(disease_ability_singletons, list(
resistance += initial(S.resistance)
stage_speed += initial(S.stage_speed)
transmittable += initial(S.transmittable)
- threshold_block += "
"
if(symptoms.len == 1) //lazy boy's dream
name = initial(S.name)
diff --git a/code/modules/antagonists/disease/disease_mob.dm b/code/modules/antagonists/disease/disease_mob.dm
index 516f30d896..a20a9cef85 100644
--- a/code/modules/antagonists/disease/disease_mob.dm
+++ b/code/modules/antagonists/disease/disease_mob.dm
@@ -318,7 +318,11 @@ the new instance inside the host to be updated to the template's stats.
var/list/dat = list()
if(examining_ability)
- dat += "Back
[examining_ability.name]
[examining_ability.stat_block][examining_ability.long_desc][examining_ability.threshold_block]"
+ dat += "Back "
+ dat += "
[examining_ability.name]
"
+ dat += "[examining_ability.stat_block][examining_ability.long_desc][examining_ability.threshold_block]"
+ for(var/entry in examining_ability.threshold_block)
+ dat += "[entry]: [examining_ability.threshold_block[entry]] "
else
dat += "