mirror of
https://github.com/CHOMPStation2/CHOMPStation2.git
synced 2026-08-30 16:48:12 +01:00
Merge branch 'release' of https://github.com/VOREStation/VOREStation
# Conflicts: # code/game/area/Away Mission areas.dm # code/game/objects/items/weapons/stunbaton.dm # code/game/objects/items/weapons/teleportation.dm # code/modules/clothing/glasses/glasses.dm # code/modules/events/event_container_vr.dm # code/modules/mining/ore_box.dm # code/modules/paperwork/paper.dm # code/modules/rogueminer_vr/zone_console.dm # config/custom_items.txt # icons/mob/items/lefthand_suits.dmi # icons/mob/items/righthand_suits.dmi # icons/mob/species/vulpkanin/helmet.dmi # icons/mob/species/vulpkanin/suit.dmi # icons/mob/suit.dmi # icons/obj/clothing/suits.dmi # maps/tether/tether_defines.dm
This commit is contained in:
@@ -19,7 +19,7 @@
|
||||
set name = "Toggle Debug Messages"
|
||||
set category = "Debug"
|
||||
M.debug = !M.debug
|
||||
usr << "[M]: Debug messages toggled [M.debug? "on" : "off"]."
|
||||
to_chat(usr, "[M]: Debug messages toggled [M.debug? "on" : "off"].")
|
||||
|
||||
//Generalized gas pumping proc.
|
||||
//Moves gas from one gas_mixture to another and returns the amount of power needed (assuming 1 second), or -1 if no gas was pumped.
|
||||
|
||||
@@ -201,7 +201,7 @@
|
||||
|
||||
/obj/machinery/atmospherics/binary/dp_vent_pump/examine(mob/user)
|
||||
if(..(user, 1))
|
||||
user << "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W"
|
||||
to_chat(user, "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W")
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/power_change()
|
||||
|
||||
@@ -67,6 +67,8 @@
|
||||
pressure_delta = input_starting_pressure - target_pressure
|
||||
if (REGULATE_OUTPUT)
|
||||
pressure_delta = target_pressure - output_starting_pressure
|
||||
if (REGULATE_NONE)
|
||||
pressure_delta = input_starting_pressure - output_starting_pressure
|
||||
|
||||
//-1 if pump_gas() did not move any gas, >= 0 otherwise
|
||||
var/returnval = -1
|
||||
@@ -82,9 +84,46 @@
|
||||
transfer_moles = min(transfer_moles, calculate_transfer_moles(air2, air1, pressure_delta, (network1)? network1.volume : 0))
|
||||
if (REGULATE_OUTPUT)
|
||||
transfer_moles = min(transfer_moles, calculate_transfer_moles(air1, air2, pressure_delta, (network2)? network2.volume : 0))
|
||||
if (REGULATE_NONE)
|
||||
var/source = air1
|
||||
var/sink = air2
|
||||
// If node1 is a network of more than 1 pipe, we want to transfer from that whole network, otw use just node1, as current
|
||||
if(istype(node1, /obj/machinery/atmospherics/pipe))
|
||||
var/obj/machinery/atmospherics/pipe/p = node1
|
||||
if(istype(p.parent, /datum/pipeline)) // Nested if-blocks to avoid the mystical :
|
||||
var/datum/pipeline/l = p.parent
|
||||
if(istype(l.air, /datum/gas_mixture))
|
||||
source = l.air
|
||||
// If node2 is a network of more than 1 pipe, we want to transfer to that whole network, otw use just node2, as current
|
||||
if(istype(node2, /obj/machinery/atmospherics/pipe))
|
||||
var/obj/machinery/atmospherics/pipe/p = node2
|
||||
if(istype(p.parent, /datum/pipeline))
|
||||
var/datum/pipeline/l = p.parent
|
||||
if(istype(l.air, /datum/gas_mixture))
|
||||
sink = l.air
|
||||
transfer_moles = max(0, calculate_equalize_moles(source, sink)) // Not regulated, don't care about flow rate
|
||||
|
||||
//pump_gas() will return a negative number if no flow occurred
|
||||
returnval = pump_gas_passive(src, air1, air2, transfer_moles)
|
||||
if(regulate_mode == REGULATE_NONE) // ACTUALLY move gases from the whole network, not just the immediate pipes
|
||||
var/source = air1
|
||||
var/sink = air2
|
||||
// If node1 is a network of more than 1 pipe, we want to transfer from that whole network, otw use just node1, as current
|
||||
if(istype(node1, /obj/machinery/atmospherics/pipe))
|
||||
var/obj/machinery/atmospherics/pipe/p = node1
|
||||
if(istype(p.parent, /datum/pipeline)) // Nested if-blocks to avoid the mystical :
|
||||
var/datum/pipeline/l = p.parent
|
||||
if(istype(l.air, /datum/gas_mixture))
|
||||
source = l.air
|
||||
// If node2 is a network of more than 1 pipe, we want to transfer to that whole network, otw use just node2, as current
|
||||
if(istype(node2, /obj/machinery/atmospherics/pipe))
|
||||
var/obj/machinery/atmospherics/pipe/p = node2
|
||||
if(istype(p.parent, /datum/pipeline))
|
||||
var/datum/pipeline/l = p.parent
|
||||
if(istype(l.air, /datum/gas_mixture))
|
||||
sink = l.air
|
||||
returnval = pump_gas_passive(src, source, sink, transfer_moles)
|
||||
else
|
||||
returnval = pump_gas_passive(src, air1, air2, transfer_moles)
|
||||
|
||||
if (returnval >= 0)
|
||||
if(network1)
|
||||
|
||||
@@ -7,6 +7,7 @@ GLOBAL_LIST_EMPTY(shutoff_valves)
|
||||
|
||||
name = "automatic shutoff valve"
|
||||
desc = "An automatic valve with control circuitry and pipe integrity sensor, capable of automatically isolating damaged segments of the pipe network."
|
||||
description_info = "Clicking this will toggle the automatic control. Alt-clicking this when the automatic control is disabled will manually open or close the valve."
|
||||
var/close_on_leaks = TRUE // If false it will be always open
|
||||
level = 1
|
||||
|
||||
@@ -37,21 +38,97 @@ GLOBAL_LIST_EMPTY(shutoff_valves)
|
||||
to_chat(user, "You [close_on_leaks ? "enable" : "disable"] the automatic shutoff circuit.")
|
||||
return TRUE
|
||||
|
||||
// Alt+Click now toggles the open/close function, when the autoseal is disabled
|
||||
/obj/machinery/atmospherics/valve/shutoff/AltClick(var/mob/user)
|
||||
if(isliving(user))
|
||||
if(close_on_leaks)
|
||||
to_chat(user, "You try to manually [open ? "close" : "open"] the valve, but it [open ? "opens" : "closes"] automatically again.")
|
||||
return
|
||||
|
||||
open ? close() : open()
|
||||
to_chat(user, "You manually [open ? "open" : "close"] the valve.")
|
||||
|
||||
/obj/machinery/atmospherics/valve/shutoff/process()
|
||||
..()
|
||||
|
||||
if (!network_node1 || !network_node2)
|
||||
if(open)
|
||||
if(!network_node1 || !network_node2 || !node1 || !node2)
|
||||
if(open && close_on_leaks)
|
||||
close()
|
||||
return
|
||||
|
||||
if (!close_on_leaks)
|
||||
if (!open)
|
||||
if(close_on_leaks)
|
||||
if(open && (network_node1.leaks.len || network_node2.leaks.len))
|
||||
find_leaks() // If we can see the leak, then this will find it, close the valve, and cut off that network
|
||||
// If we cannot see the leak, then this will not close the valve, and any valves that can see the leak will cut it off from us
|
||||
else if(!open && !network_node1.leaks.len && !network_node2.leaks.len)
|
||||
open()
|
||||
return
|
||||
|
||||
// Breadth-first search for any leaking pipes that we can directly see
|
||||
/obj/machinery/atmospherics/valve/shutoff/proc/find_leaks()
|
||||
var/obj/machinery/atmospherics/list/search = list()
|
||||
|
||||
// We're the leak!
|
||||
if(!node1 || !node2)
|
||||
close()
|
||||
return
|
||||
|
||||
if (network_node1.leaks.len || network_node2.leaks.len)
|
||||
if (open)
|
||||
close()
|
||||
else if (!open)
|
||||
open()
|
||||
// Only searching pipes
|
||||
if(istype(node1, /obj/machinery/atmospherics))
|
||||
search |= node1
|
||||
if(istype(node2, /obj/machinery/atmospherics))
|
||||
search |= node2
|
||||
|
||||
// Breadth-first search
|
||||
for(var/i = 1, i <= search.len, i++) // wooo, proper for loop syntax!
|
||||
var/obj/machinery/atmospherics/A = search[i]
|
||||
if(!A)
|
||||
continue
|
||||
|
||||
if(istype(A, /obj/machinery/atmospherics/pipe))
|
||||
var/obj/machinery/atmospherics/pipe/L = A
|
||||
if(L.leaking)
|
||||
close() // Found the leak!
|
||||
return
|
||||
|
||||
|
||||
if(istype(A, /obj/machinery/atmospherics/valve/shutoff))
|
||||
var/obj/machinery/atmospherics/valve/shutoff/S = A
|
||||
if(S.close_on_leaks || !S.open)
|
||||
continue // Either it will close, or it is closed. We don't care what's on the other side
|
||||
search |= list(S.node1, S.node2) // |= skips existing nodes, so we don't search loops infinitely
|
||||
|
||||
else if(istype(A, /obj/machinery/atmospherics/valve)) // Putting the shutoff before this means this won't catch shutoffs
|
||||
var/obj/machinery/atmospherics/valve/V = A
|
||||
if(V.open)
|
||||
search |= list(V.node1, V.node2)
|
||||
else
|
||||
continue // Closed valve, dead end
|
||||
|
||||
else if(istype(A, /obj/machinery/atmospherics/tvalve))
|
||||
var/obj/machinery/atmospherics/tvalve/T = A
|
||||
if(T.state)
|
||||
search |= list(T.node1, T.node2)
|
||||
else
|
||||
search |= list(T.node1, T.node3)
|
||||
|
||||
else if(istype(A, /obj/machinery/atmospherics/pipe/zpipe))
|
||||
var/obj/machinery/atmospherics/pipe/zpipe/P = A
|
||||
search |= list(P.node1, P.node2)
|
||||
|
||||
else if(istype(A, /obj/machinery/atmospherics/pipe/simple))
|
||||
var/obj/machinery/atmospherics/pipe/P = A
|
||||
search |= list(P.node1, P.node2)
|
||||
|
||||
else if(istype(A, /obj/machinery/atmospherics/pipe/manifold))
|
||||
var/obj/machinery/atmospherics/pipe/manifold/M = A
|
||||
search |= list(M.node1, M.node2, M.node3)
|
||||
|
||||
else if(istype(A, /obj/machinery/atmospherics/pipe/manifold4w))
|
||||
var/obj/machinery/atmospherics/pipe/manifold4w/M = A
|
||||
search |= list(M.node1, M.node2, M.node3, M.node4)
|
||||
|
||||
// else continue, dead end
|
||||
// We broke out of the loop, so we see no leaks
|
||||
// The leaks therefore must be on the other side of another shutoff valve
|
||||
return
|
||||
|
||||
@@ -405,11 +405,11 @@
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/examine(mob/user)
|
||||
if(..(user, 1))
|
||||
user << "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W"
|
||||
to_chat(user, "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W")
|
||||
else
|
||||
user << "You are too far away to read the gauge."
|
||||
to_chat(user, "You are too far away to read the gauge.")
|
||||
if(welded)
|
||||
user << "It seems welded shut."
|
||||
to_chat(user, "It seems welded shut.")
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_pump/power_change()
|
||||
var/old_stat = stat
|
||||
|
||||
@@ -288,6 +288,6 @@
|
||||
|
||||
/obj/machinery/atmospherics/unary/vent_scrubber/examine(mob/user)
|
||||
if(..(user, 1))
|
||||
user << "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W"
|
||||
to_chat(user, "A small gauge in the corner reads [round(last_flow_rate, 0.1)] L/s; [round(last_power_draw)] W")
|
||||
else
|
||||
user << "You are too far away to read the gauge."
|
||||
to_chat(user, "You are too far away to read the gauge.")
|
||||
|
||||
@@ -308,4 +308,4 @@
|
||||
|
||||
/obj/machinery/atmospherics/valve/examine(mob/user)
|
||||
..()
|
||||
user << "It is [open ? "open" : "closed"]."
|
||||
to_chat(user, "It is [open ? "open" : "closed"].")
|
||||
|
||||
+15
-15
@@ -79,13 +79,13 @@ Class Procs:
|
||||
if(!direct())
|
||||
state |= CONNECTION_DIRECT
|
||||
edge.direct++
|
||||
//world << "Marked direct."
|
||||
//to_world("Marked direct.")
|
||||
|
||||
/connection/proc/mark_indirect()
|
||||
if(direct())
|
||||
state &= ~CONNECTION_DIRECT
|
||||
edge.direct--
|
||||
//world << "Marked indirect."
|
||||
//to_world("Marked indirect.")
|
||||
|
||||
/connection/proc/mark_space()
|
||||
state |= CONNECTION_SPACE
|
||||
@@ -99,18 +99,18 @@ Class Procs:
|
||||
/connection/proc/erase()
|
||||
edge.remove_connection(src)
|
||||
state |= CONNECTION_INVALID
|
||||
//world << "Connection Erased: [state]"
|
||||
//to_world("Connection Erased: [state]")
|
||||
|
||||
/connection/proc/update()
|
||||
//world << "Updated, \..."
|
||||
//to_world("Updated, \...")
|
||||
if(!istype(A,/turf/simulated))
|
||||
//world << "Invalid A."
|
||||
//to_world("Invalid A.")
|
||||
erase()
|
||||
return
|
||||
|
||||
var/block_status = air_master.air_blocked(A,B)
|
||||
if(block_status & AIR_BLOCKED)
|
||||
//world << "Blocked connection."
|
||||
//to_world("Blocked connection.")
|
||||
erase()
|
||||
return
|
||||
else if(block_status & ZONE_BLOCKED)
|
||||
@@ -122,14 +122,14 @@ Class Procs:
|
||||
|
||||
if(state & CONNECTION_SPACE)
|
||||
if(!b_is_space)
|
||||
//world << "Invalid B."
|
||||
//to_world("Invalid B.")
|
||||
erase()
|
||||
return
|
||||
if(A.zone != zoneA)
|
||||
//world << "Zone changed, \..."
|
||||
//to_world("Zone changed, \...")
|
||||
if(!A.zone)
|
||||
erase()
|
||||
//world << "erased."
|
||||
//to_world("erased.")
|
||||
return
|
||||
else
|
||||
edge.remove_connection(src)
|
||||
@@ -137,22 +137,22 @@ Class Procs:
|
||||
edge.add_connection(src)
|
||||
zoneA = A.zone
|
||||
|
||||
//world << "valid."
|
||||
//to_world("valid.")
|
||||
return
|
||||
|
||||
else if(b_is_space)
|
||||
//world << "Invalid B."
|
||||
//to_world("Invalid B.")
|
||||
erase()
|
||||
return
|
||||
|
||||
if(A.zone == B.zone)
|
||||
//world << "A == B"
|
||||
//to_world("A == B")
|
||||
erase()
|
||||
return
|
||||
|
||||
if(A.zone != zoneA || (zoneB && (B.zone != zoneB)))
|
||||
|
||||
//world << "Zones changed, \..."
|
||||
//to_world("Zones changed, \...")
|
||||
if(A.zone && B.zone)
|
||||
edge.remove_connection(src)
|
||||
edge = air_master.get_edge(A.zone, B.zone)
|
||||
@@ -160,9 +160,9 @@ Class Procs:
|
||||
zoneA = A.zone
|
||||
zoneB = B.zone
|
||||
else
|
||||
//world << "erased."
|
||||
//to_world("erased.")
|
||||
erase()
|
||||
return
|
||||
|
||||
|
||||
//world << "valid."
|
||||
//to_world("valid.")
|
||||
@@ -72,10 +72,10 @@ Class Procs:
|
||||
/connection_edge/proc/add_connection(connection/c)
|
||||
coefficient++
|
||||
if(c.direct()) direct++
|
||||
//world << "Connection added: [type] Coefficient: [coefficient]"
|
||||
//to_world("Connection added: [type] Coefficient: [coefficient]")
|
||||
|
||||
/connection_edge/proc/remove_connection(connection/c)
|
||||
//world << "Connection removed: [type] Coefficient: [coefficient-1]"
|
||||
//to_world("Connection removed: [type] Coefficient: [coefficient-1]")
|
||||
coefficient--
|
||||
if(coefficient <= 0)
|
||||
erase()
|
||||
@@ -85,7 +85,7 @@ Class Procs:
|
||||
|
||||
/connection_edge/proc/erase()
|
||||
air_master.remove_edge(src)
|
||||
//world << "[type] Erased."
|
||||
//to_world("[type] Erased.")
|
||||
|
||||
/connection_edge/proc/tick()
|
||||
|
||||
@@ -128,7 +128,7 @@ Class Procs:
|
||||
A.edges.Add(src)
|
||||
B.edges.Add(src)
|
||||
//id = edge_id(A,B)
|
||||
//world << "New edge between [A] and [B]"
|
||||
//to_world("New edge between [A] and [B]")
|
||||
|
||||
/connection_edge/zone/add_connection(connection/c)
|
||||
. = ..()
|
||||
@@ -198,7 +198,7 @@ Class Procs:
|
||||
A.edges.Add(src)
|
||||
air = B.return_air()
|
||||
//id = 52*A.id
|
||||
//world << "New edge from [A] to [B]."
|
||||
//to_world("New edge from [A] to [B].")
|
||||
|
||||
/connection_edge/unsimulated/add_connection(connection/c)
|
||||
. = ..()
|
||||
|
||||
+14
-14
@@ -22,11 +22,11 @@ client/proc/Zone_Info(turf/T as null|turf)
|
||||
if(istype(T,/turf/simulated) && T:zone)
|
||||
T:zone:dbg_data(src)
|
||||
else
|
||||
mob << "No zone here."
|
||||
to_chat(mob, "No zone here.")
|
||||
var/datum/gas_mixture/mix = T.return_air()
|
||||
mob << "[mix.return_pressure()] kPa [mix.temperature]C"
|
||||
to_chat(mob, "[mix.return_pressure()] kPa [mix.temperature]C")
|
||||
for(var/g in mix.gas)
|
||||
mob << "[g]: [mix.gas[g]]\n"
|
||||
to_chat(mob, "[g]: [mix.gas[g]]\n")
|
||||
else
|
||||
if(zone_debug_images)
|
||||
for(var/zone in zone_debug_images)
|
||||
@@ -56,9 +56,9 @@ client/proc/Test_ZAS_Connection(var/turf/simulated/T as turf)
|
||||
|
||||
if(direction == "N/A")
|
||||
if(!(T.c_airblock(T) & AIR_BLOCKED))
|
||||
mob << "The turf can pass air! :D"
|
||||
to_chat(mob, "The turf can pass air! :D")
|
||||
else
|
||||
mob << "No air passage :x"
|
||||
to_chat(mob, "No air passage :x")
|
||||
return
|
||||
|
||||
var/turf/simulated/other_turf = get_step(T, direction_list[direction])
|
||||
@@ -70,29 +70,29 @@ client/proc/Test_ZAS_Connection(var/turf/simulated/T as turf)
|
||||
|
||||
if(o_block & AIR_BLOCKED)
|
||||
if(t_block & AIR_BLOCKED)
|
||||
mob << "Neither turf can connect. :("
|
||||
to_chat(mob, "Neither turf can connect. :(")
|
||||
|
||||
else
|
||||
mob << "The initial turf only can connect. :\\"
|
||||
to_chat(mob, "The initial turf only can connect. :\\")
|
||||
else
|
||||
if(t_block & AIR_BLOCKED)
|
||||
mob << "The other turf can connect, but not the initial turf. :/"
|
||||
to_chat(mob, "The other turf can connect, but not the initial turf. :/")
|
||||
|
||||
else
|
||||
mob << "Both turfs can connect! :)"
|
||||
to_chat(mob, "Both turfs can connect! :)")
|
||||
|
||||
mob << "Additionally, \..."
|
||||
to_chat(mob, "Additionally, \...")
|
||||
|
||||
if(o_block & ZONE_BLOCKED)
|
||||
if(t_block & ZONE_BLOCKED)
|
||||
mob << "neither turf can merge."
|
||||
to_chat(mob, "neither turf can merge.")
|
||||
else
|
||||
mob << "the other turf cannot merge."
|
||||
to_chat(mob, "the other turf cannot merge.")
|
||||
else
|
||||
if(t_block & ZONE_BLOCKED)
|
||||
mob << "the initial turf cannot merge."
|
||||
to_chat(mob, "the initial turf cannot merge.")
|
||||
else
|
||||
mob << "both turfs can merge."
|
||||
to_chat(mob, "both turfs can merge.")
|
||||
|
||||
client/proc/ZASSettings()
|
||||
set category = "Debug"
|
||||
|
||||
+8
-8
@@ -99,7 +99,7 @@
|
||||
var/s_block = c_airblock(src)
|
||||
if(s_block & AIR_BLOCKED)
|
||||
#ifdef ZASDBG
|
||||
if(verbose) world << "Self-blocked."
|
||||
if(verbose) to_world("Self-blocked.")
|
||||
//dbg(blocked)
|
||||
#endif
|
||||
if(zone)
|
||||
@@ -131,7 +131,7 @@
|
||||
if(block & AIR_BLOCKED)
|
||||
|
||||
#ifdef ZASDBG
|
||||
if(verbose) world << "[d] is blocked."
|
||||
if(verbose) to_world("[d] is blocked.")
|
||||
//unsim.dbg(air_blocked, turn(180,d))
|
||||
#endif
|
||||
|
||||
@@ -141,7 +141,7 @@
|
||||
if(r_block & AIR_BLOCKED)
|
||||
|
||||
#ifdef ZASDBG
|
||||
if(verbose) world << "[d] is blocked."
|
||||
if(verbose) to_world("[d] is blocked.")
|
||||
//dbg(air_blocked, d)
|
||||
#endif
|
||||
|
||||
@@ -172,7 +172,7 @@
|
||||
// we are blocking them and not blocking ourselves - this prevents tiny zones from forming on doorways.
|
||||
if(((block & ZONE_BLOCKED) && !(r_block & ZONE_BLOCKED)) || ((r_block & ZONE_BLOCKED) && !(s_block & ZONE_BLOCKED)))
|
||||
#ifdef ZASDBG
|
||||
if(verbose) world << "[d] is zone blocked."
|
||||
if(verbose) to_world("[d] is zone blocked.")
|
||||
//dbg(zone_blocked, d)
|
||||
#endif
|
||||
|
||||
@@ -186,22 +186,22 @@
|
||||
|
||||
#ifdef ZASDBG
|
||||
dbg(assigned)
|
||||
if(verbose) world << "Added to [zone]"
|
||||
if(verbose) to_world("Added to [zone]")
|
||||
#endif
|
||||
|
||||
else if(sim.zone != zone)
|
||||
|
||||
#ifdef ZASDBG
|
||||
if(verbose) world << "Connecting to [sim.zone]"
|
||||
if(verbose) to_world("Connecting to [sim.zone]")
|
||||
#endif
|
||||
|
||||
air_master.connect(src, sim)
|
||||
|
||||
|
||||
#ifdef ZASDBG
|
||||
else if(verbose) world << "[d] has same zone."
|
||||
else if(verbose) to_world("[d] has same zone.")
|
||||
|
||||
else if(verbose) world << "[d] has invalid zone."
|
||||
else if(verbose) to_world("[d] has invalid zone.")
|
||||
#endif
|
||||
|
||||
else
|
||||
|
||||
@@ -169,7 +169,7 @@ var/global/vs_control/vsc = new
|
||||
vars[ch] = vw
|
||||
if(how == "Toggle")
|
||||
newvar = (newvar?"ON":"OFF")
|
||||
world << "<span class='notice'><b>[key_name(user)] changed the setting [display_description] to [newvar].</b></span>"
|
||||
to_world("<span class='notice'><b>[key_name(user)] changed the setting [display_description] to [newvar].</b></span>")
|
||||
if(ch in plc.settings)
|
||||
ChangeSettingsDialog(user,plc.settings)
|
||||
else
|
||||
@@ -322,7 +322,7 @@ var/global/vs_control/vsc = new
|
||||
plc.N2O_HALLUCINATION = initial(plc.N2O_HALLUCINATION)
|
||||
|
||||
|
||||
world << "<span class='notice'><b>[key_name(user)] changed the global phoron/ZAS settings to \"[def]\"</b></span>"
|
||||
to_world("<span class='notice'><b>[key_name(user)] changed the global phoron/ZAS settings to \"[def]\"</b></span>")
|
||||
|
||||
/pl_control/var/list/settings = list()
|
||||
|
||||
|
||||
+13
-12
@@ -168,15 +168,16 @@ Class Procs:
|
||||
E.recheck()
|
||||
|
||||
/zone/proc/dbg_data(mob/M)
|
||||
M << name
|
||||
to_chat(M,name)
|
||||
for(var/g in air.gas)
|
||||
M << "[gas_data.name[g]]: [air.gas[g]]"
|
||||
M << "P: [air.return_pressure()] kPa V: [air.volume]L T: [air.temperature]°K ([air.temperature - T0C]°C)"
|
||||
M << "O2 per N2: [(air.gas["nitrogen"] ? air.gas["oxygen"]/air.gas["nitrogen"] : "N/A")] Moles: [air.total_moles]"
|
||||
M << "Simulated: [contents.len] ([air.group_multiplier])"
|
||||
//M << "Unsimulated: [unsimulated_contents.len]"
|
||||
//M << "Edges: [edges.len]"
|
||||
if(invalid) M << "Invalid!"
|
||||
to_chat(M, "[gas_data.name[g]]: [air.gas[g]]")
|
||||
to_chat(M, "P: [air.return_pressure()] kPa V: [air.volume]L T: [air.temperature]°K ([air.temperature - T0C]°C)")
|
||||
to_chat(M, "O2 per N2: [(air.gas["nitrogen"] ? air.gas["oxygen"]/air.gas["nitrogen"] : "N/A")] Moles: [air.total_moles]")
|
||||
to_chat(M, "Simulated: [contents.len] ([air.group_multiplier])")
|
||||
//to_chat(M, "Unsimulated: [unsimulated_contents.len]")
|
||||
//to_chat(M, "Edges: [edges.len]")
|
||||
if(invalid)
|
||||
to_chat(M, "Invalid!")
|
||||
var/zone_edges = 0
|
||||
var/space_edges = 0
|
||||
var/space_coefficient = 0
|
||||
@@ -185,10 +186,10 @@ Class Procs:
|
||||
else
|
||||
space_edges++
|
||||
space_coefficient += E.coefficient
|
||||
M << "[E:air:return_pressure()]kPa"
|
||||
to_chat(M, "[E:air:return_pressure()]kPa")
|
||||
|
||||
M << "Zone Edges: [zone_edges]"
|
||||
M << "Space Edges: [space_edges] ([space_coefficient] connections)"
|
||||
to_chat(M, "Zone Edges: [zone_edges]")
|
||||
to_chat(M, "Space Edges: [space_edges] ([space_coefficient] connections)")
|
||||
|
||||
//for(var/turf/T in unsimulated_contents)
|
||||
// M << "[T] at ([T.x],[T.y])"
|
||||
// to_chat(M, "[T] at ([T.x],[T.y])")
|
||||
@@ -115,10 +115,10 @@
|
||||
#define INV_BACK_DEF_ICON 'icons/mob/back.dmi'
|
||||
#define INV_L_HAND_DEF_ICON 'icons/mob/items/lefthand.dmi'
|
||||
#define INV_R_HAND_DEF_ICON 'icons/mob/items/righthand.dmi'
|
||||
#define INV_W_UNIFORM_DEF_ICON 'icons/mob/uniform.dmi'
|
||||
#define INV_W_UNIFORM_DEF_ICON "icons/mob/uniform"
|
||||
#define INV_ACCESSORIES_DEF_ICON 'icons/mob/ties.dmi'
|
||||
#define INV_TIE_DEF_ICON 'icons/mob/ties.dmi'
|
||||
#define INV_SUIT_DEF_ICON 'icons/mob/suit.dmi'
|
||||
#define INV_SUIT_DEF_ICON "icons/mob/suit"
|
||||
#define INV_SPACESUIT_DEF_ICON 'icons/mob/spacesuit.dmi'
|
||||
#define INV_WEAR_ID_DEF_ICON 'icons/mob/mob.dmi'
|
||||
#define INV_GLOVES_DEF_ICON 'icons/mob/hands.dmi'
|
||||
|
||||
+67
-6
@@ -5,18 +5,79 @@
|
||||
* Sorting
|
||||
*/
|
||||
|
||||
// Determiner constants
|
||||
#define DET_NONE 0x00;
|
||||
#define DET_DEFINITE 0x01; // the
|
||||
#define DET_INDEFINITE 0x02; // a, an, some
|
||||
#define DET_AUTO 0x04;
|
||||
|
||||
/*
|
||||
* Misc
|
||||
*/
|
||||
|
||||
//Returns a list in plain english as a string
|
||||
/proc/english_list(var/list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" )
|
||||
/proc/english_list(var/list/input, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "")
|
||||
// this proc cannot be merged with counting_english_list to maintain compatibility
|
||||
// with shoddy use of this proc for code logic and for cases that require original order
|
||||
switch(input.len)
|
||||
if(0) return nothing_text
|
||||
if(1) return "[input[1]]"
|
||||
if(2) return "[input[1]][and_text][input[2]]"
|
||||
else return "[jointext(input, comma_text, 1, -1)][final_comma_text][and_text][input[input.len]]"
|
||||
|
||||
//Returns a newline-separated list that counts equal-ish items, outputting count and item names, optionally with icons and specific determiners
|
||||
/proc/counting_english_list(var/list/input, output_icons = TRUE, determiners = DET_NONE, nothing_text = "nothing", line_prefix = "\t", first_item_prefix = "\n", last_item_suffix = "\n", and_text = "\n", comma_text = "\n", final_comma_text = "")
|
||||
var/list/counts = list() // counted input items
|
||||
var/list/items = list() // actual objects for later reference (for icons and formatting)
|
||||
|
||||
// count items
|
||||
for(var/item in input)
|
||||
var/name = "[item]" // index items by name; usually works fairly well for loose equality
|
||||
if(name in counts)
|
||||
counts[name]++
|
||||
else
|
||||
counts[name] = 1
|
||||
items.Add(item)
|
||||
|
||||
// assemble the output list
|
||||
var/list/out = list()
|
||||
var/i = 0
|
||||
for(var/item in items)
|
||||
var/name = "[item]"
|
||||
var/count = counts[name]
|
||||
var/item_str = line_prefix
|
||||
if(count > 1)
|
||||
item_str += "[count]x "
|
||||
|
||||
if(isatom(item))
|
||||
// atoms/items/objects can be pretty and whatnot
|
||||
var/atom/A = item
|
||||
if(output_icons && isicon(A.icon) && !ismob(A)) // mobs tend to have unusable icons
|
||||
item_str += "\icon[A] "
|
||||
switch(determiners)
|
||||
if(DET_NONE) item_str += A.name
|
||||
if(DET_DEFINITE) item_str += "\the [A]"
|
||||
if(DET_INDEFINITE) item_str += "\a [A]"
|
||||
else item_str += name
|
||||
else
|
||||
// non-atoms use plain string conversion
|
||||
item_str += name
|
||||
|
||||
if(i == 0)
|
||||
item_str = first_item_prefix + item_str
|
||||
if(i == items.len - 1)
|
||||
item_str = item_str + last_item_suffix
|
||||
|
||||
out.Add(item_str)
|
||||
i++
|
||||
|
||||
// finally return the list using regular english_list builder
|
||||
return english_list(out, nothing_text, and_text, comma_text, final_comma_text)
|
||||
|
||||
//A "preset" for counting_english_list that displays the list "inline" (comma separated)
|
||||
/proc/inline_counting_english_list(var/list/input, output_icons = TRUE, determiners = DET_NONE, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "", line_prefix = "", first_item_prefix = "", last_item_suffix = "")
|
||||
return counting_english_list(input, output_icons, determiners, nothing_text, and_text, comma_text, final_comma_text)
|
||||
|
||||
//Returns list element or null. Should prevent "index out of bounds" error.
|
||||
proc/listgetindex(var/list/list,index)
|
||||
if(istype(list) && list.len)
|
||||
@@ -457,7 +518,7 @@ proc/listclearnulls(list/list)
|
||||
|
||||
//Don't use this on lists larger than half a dozen or so
|
||||
/proc/insertion_sort_numeric_list_ascending(var/list/L)
|
||||
//world.log << "ascending len input: [L.len]"
|
||||
//to_world_log("ascending len input: [L.len]")
|
||||
var/list/out = list(pop(L))
|
||||
for(var/entry in L)
|
||||
if(isnum(entry))
|
||||
@@ -470,13 +531,13 @@ proc/listclearnulls(list/list)
|
||||
if(!success)
|
||||
out.Add(entry)
|
||||
|
||||
//world.log << " output: [out.len]"
|
||||
//to_world_log(" output: [out.len]")
|
||||
return out
|
||||
|
||||
/proc/insertion_sort_numeric_list_descending(var/list/L)
|
||||
//world.log << "descending len input: [L.len]"
|
||||
//to_world_log("descending len input: [L.len]")
|
||||
var/list/out = insertion_sort_numeric_list_ascending(L)
|
||||
//world.log << " output: [out.len]"
|
||||
//to_world_log(" output: [out.len]")
|
||||
return reverselist(out)
|
||||
|
||||
/proc/dd_sortedObjectList(var/list/L, var/cache=list())
|
||||
@@ -762,4 +823,4 @@ proc/dd_sortedTextList(list/incoming)
|
||||
/proc/popleft(list/L)
|
||||
if(L.len)
|
||||
. = L[1]
|
||||
L.Cut(1,2)
|
||||
L.Cut(1,2)
|
||||
|
||||
@@ -5,12 +5,12 @@
|
||||
A.add_fingerprint(user)
|
||||
var/list/result = A.atmosanalyze(user)
|
||||
if(result && result.len)
|
||||
user << "<span class='notice'>Results of the analysis[src == A ? "" : " of \the [A]"]</span>"
|
||||
to_chat(user, "<span class='notice'>Results of the analysis[src == A ? "" : " of \the [A]"]</span>")
|
||||
for(var/line in result)
|
||||
user << "<span class='notice'>[line]</span>"
|
||||
to_chat(user, "<span class='notice'>[line]</span>")
|
||||
return 1
|
||||
|
||||
user << "<span class='warning'>Your [src] flashes a red light as it fails to analyze \the [A].</span>"
|
||||
to_chat(user, "<span class='warning'>Your [src] flashes a red light as it fails to analyze \the [A].</span>")
|
||||
return 0
|
||||
|
||||
/proc/atmosanalyzer_scan(var/atom/target, var/datum/gas_mixture/mixture, var/mob/user)
|
||||
|
||||
@@ -206,7 +206,7 @@ var/global/list/string_slot_flags = list(
|
||||
var/list/L = chemical_reactions_list[reaction]
|
||||
for(var/t in L)
|
||||
. += " has: [t]\n"
|
||||
world << .
|
||||
to_world(.)
|
||||
*/
|
||||
//Hexidecimal numbers
|
||||
var/global/list/hexNums = list("0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F")
|
||||
|
||||
@@ -167,7 +167,7 @@ mob
|
||||
|
||||
Output_Icon()
|
||||
set name = "2. Output Icon"
|
||||
src<<"Icon is: \icon[getFlatIcon(src)]"
|
||||
to_chat(src, "Icon is: \icon[getFlatIcon(src)]")
|
||||
|
||||
Label_Icon()
|
||||
set name = "3. Label Icon"
|
||||
|
||||
@@ -22,16 +22,16 @@
|
||||
#endif
|
||||
|
||||
/proc/error(msg)
|
||||
world.log << "## ERROR: [msg]"
|
||||
to_world_log("## ERROR: [msg]")
|
||||
|
||||
#define WARNING(MSG) warning("[MSG] in [__FILE__] at line [__LINE__] src: [src] usr: [usr].")
|
||||
//print a warning message to world.log
|
||||
/proc/warning(msg)
|
||||
world.log << "## WARNING: [msg]"
|
||||
to_world_log("## WARNING: [msg]")
|
||||
|
||||
//print a testing-mode debug message to world.log
|
||||
/proc/testing(msg)
|
||||
world.log << "## TESTING: [msg]"
|
||||
to_world_log("## TESTING: [msg]")
|
||||
|
||||
/proc/log_admin(text)
|
||||
admin_log.Add(text)
|
||||
@@ -49,7 +49,7 @@
|
||||
|
||||
for(var/client/C in admins)
|
||||
if(C.is_preference_enabled(/datum/client_preference/debug/show_debug_logs))
|
||||
C << "DEBUG: [text]"
|
||||
to_chat(C, "DEBUG: [text]")
|
||||
|
||||
/proc/log_game(text)
|
||||
if (config.log_game)
|
||||
@@ -154,12 +154,12 @@
|
||||
|
||||
|
||||
/proc/log_to_dd(text)
|
||||
world.log << text //this comes before the config check because it can't possibly runtime
|
||||
to_world_log(text) //this comes before the config check because it can't possibly runtime
|
||||
if(config.log_world_output)
|
||||
WRITE_LOG(diary, "DD_OUTPUT: [text]")
|
||||
|
||||
/proc/log_error(text)
|
||||
world.log << text
|
||||
to_world_log(text)
|
||||
WRITE_LOG(error_log, "RUNTIME: [text]")
|
||||
|
||||
/proc/log_misc(text)
|
||||
@@ -174,7 +174,7 @@
|
||||
WRITE_LOG(href_logfile, "HREF: [text]")
|
||||
|
||||
/proc/log_unit_test(text)
|
||||
world.log << "## UNIT_TEST: [text]"
|
||||
to_world_log("## UNIT_TEST: [text]")
|
||||
|
||||
/proc/report_progress(var/progress_message)
|
||||
admin_notice("<span class='boldannounce'>[progress_message]</span>", R_DEBUG)
|
||||
|
||||
@@ -68,7 +68,7 @@
|
||||
if (4.0) return EAST
|
||||
if (8.0) return WEST
|
||||
else
|
||||
world.log << "UNKNOWN DIRECTION: [direction]"
|
||||
to_world_log("UNKNOWN DIRECTION: [direction]")
|
||||
|
||||
// Turns a direction into text
|
||||
/proc/dir2text(direction)
|
||||
|
||||
@@ -370,7 +370,7 @@ Turf and target are seperate in case you want to teleport some distance from a t
|
||||
if(isAI(src))
|
||||
var/mob/living/silicon/ai/A = src
|
||||
oldname = null//don't bother with the records update crap
|
||||
//world << "<b>[newname] is the AI!</b>"
|
||||
//to_world("<b>[newname] is the AI!</b>")
|
||||
//world << sound('sound/AI/newAI.ogg')
|
||||
// Set eyeobj name
|
||||
A.SetName(newname)
|
||||
|
||||
+3
-2
@@ -5,10 +5,10 @@
|
||||
#define RANDOM_BLOOD_TYPE pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+")
|
||||
|
||||
#define to_chat(target, message) target << message
|
||||
#define to_world(message) world << message
|
||||
#define to_world(message) to_chat(world, message)
|
||||
#define to_world_log(message) world.log << message
|
||||
// TODO - Baystation has this log to crazy places. For now lets just world.log, but maybe look into it later.
|
||||
#define log_world(message) world.log << message
|
||||
#define log_world(message) to_world_log(message)
|
||||
#define to_file(file_entry, source_var) file_entry << source_var
|
||||
#define from_file(file_entry, target_var) file_entry >> target_var
|
||||
#define show_browser(target, browser_content, browser_name) target << browse(browser_content, browser_name)
|
||||
@@ -18,6 +18,7 @@
|
||||
#define DIRECT_OUTPUT(A, B) A << B
|
||||
#define SEND_IMAGE(target, image) DIRECT_OUTPUT(target, image)
|
||||
#define SEND_SOUND(target, sound) DIRECT_OUTPUT(target, sound)
|
||||
//#define WRITE_LOG is in logging.dm
|
||||
|
||||
#define CanInteract(user, state) (CanUseTopic(user, state) == STATUS_INTERACTIVE)
|
||||
|
||||
|
||||
@@ -270,7 +270,7 @@
|
||||
|
||||
// Makes the ability be triggered. The subclasses of this are responsible for carrying it out in whatever way it needs to.
|
||||
/obj/screen/ability/proc/activate()
|
||||
world << "[src] had activate() called."
|
||||
to_world("[src] had activate() called.")
|
||||
return
|
||||
|
||||
// This checks if the ability can be used.
|
||||
@@ -305,7 +305,7 @@
|
||||
if(object_used && verb_to_call)
|
||||
call(object_used,verb_to_call)(arguments_to_use)
|
||||
// call(object_used,verb_to_call)(arguments_to_use)
|
||||
// world << "Attempted to call([object_used],[verb_to_call])([arguments_to_use])"
|
||||
// to_world("Attempted to call([object_used],[verb_to_call])([arguments_to_use])")
|
||||
// if(hascall(object_used, verb_to_call))
|
||||
// call(object_used,verb_to_call)(arguments_to_use)
|
||||
// else
|
||||
|
||||
@@ -332,11 +332,11 @@ datum/hud/New(mob/owner)
|
||||
set hidden = 1
|
||||
|
||||
if(!hud_used)
|
||||
usr << "<span class='warning'>This mob type does not use a HUD.</span>"
|
||||
to_chat(usr, "<span class='warning'>This mob type does not use a HUD.</span>")
|
||||
return
|
||||
|
||||
if(!ishuman(src))
|
||||
usr << "<span class='warning'>Inventory hiding is currently only supported for human mobs, sorry.</span>"
|
||||
to_chat(usr, "<span class='warning'>Inventory hiding is currently only supported for human mobs, sorry.</span>")
|
||||
return
|
||||
|
||||
if(!client) return
|
||||
|
||||
@@ -223,11 +223,11 @@ var/obj/screen/robot_inventory
|
||||
//r.client.screen += robot_inventory //"store" icon
|
||||
|
||||
if(!r.module)
|
||||
usr << "<span class='danger'>No module selected</span>"
|
||||
to_chat(usr, "<span class='danger'>No module selected</span>")
|
||||
return
|
||||
|
||||
if(!r.module.modules)
|
||||
usr << "<span class='danger'>Selected module has no modules to select</span>"
|
||||
to_chat(usr, "<span class='danger'>Selected module has no modules to select</span>")
|
||||
return
|
||||
|
||||
if(!r.robot_modules_background)
|
||||
|
||||
@@ -205,7 +205,7 @@
|
||||
if(iscarbon(usr))
|
||||
var/mob/living/carbon/C = usr
|
||||
if(C.legcuffed)
|
||||
C << "<span class='notice'>You are legcuffed! You cannot run until you get [C.legcuffed] removed!</span>"
|
||||
to_chat(C, "<span class='notice'>You are legcuffed! You cannot run until you get [C.legcuffed] removed!</span>")
|
||||
C.m_intent = "walk" //Just incase
|
||||
C.hud_used.move_intent.icon_state = "walking"
|
||||
return 1
|
||||
@@ -245,7 +245,7 @@
|
||||
if(!C.stat && !C.stunned && !C.paralysis && !C.restrained())
|
||||
if(C.internal)
|
||||
C.internal = null
|
||||
C << "<span class='notice'>No longer running on internals.</span>"
|
||||
to_chat(C, "<span class='notice'>No longer running on internals.</span>")
|
||||
if(C.internals)
|
||||
C.internals.icon_state = "internal0"
|
||||
else
|
||||
@@ -257,7 +257,7 @@
|
||||
no_mask = 1
|
||||
|
||||
if(no_mask)
|
||||
C << "<span class='notice'>You are not wearing a suitable mask or helmet.</span>"
|
||||
to_chat(C, "<span class='notice'>You are not wearing a suitable mask or helmet.</span>")
|
||||
return 1
|
||||
else
|
||||
var/list/nicename = null
|
||||
@@ -338,7 +338,7 @@
|
||||
//We've determined the best container now we set it as our internals
|
||||
|
||||
if(best)
|
||||
C << "<span class='notice'>You are now running on internals from [tankcheck[best]] [from] your [nicename[best]].</span>"
|
||||
to_chat(C, "<span class='notice'>You are now running on internals from [tankcheck[best]] [from] your [nicename[best]].</span>")
|
||||
C.internal = tankcheck[best]
|
||||
|
||||
|
||||
@@ -346,7 +346,7 @@
|
||||
if(C.internals)
|
||||
C.internals.icon_state = "internal1"
|
||||
else
|
||||
C << "<span class='notice'>You don't have a[breathes=="oxygen" ? "n oxygen" : addtext(" ",breathes)] tank.</span>"
|
||||
to_chat(C, "<span class='notice'>You don't have a[breathes=="oxygen" ? "n oxygen" : addtext(" ",breathes)] tank.</span>")
|
||||
if("act_intent")
|
||||
usr.a_intent_change("right")
|
||||
if(I_HELP)
|
||||
@@ -386,7 +386,7 @@
|
||||
R.hud_used.toggle_show_robot_modules()
|
||||
return 1
|
||||
else
|
||||
R << "You haven't selected a module yet."
|
||||
to_chat(R, "You haven't selected a module yet.")
|
||||
|
||||
if("radio")
|
||||
if(issilicon(usr))
|
||||
@@ -402,7 +402,7 @@
|
||||
R.uneq_active()
|
||||
R.hud_used.update_robot_modules_display()
|
||||
else
|
||||
R << "You haven't selected a module yet."
|
||||
to_chat(R, "You haven't selected a module yet.")
|
||||
|
||||
if("module1")
|
||||
if(istype(usr, /mob/living/silicon/robot))
|
||||
|
||||
@@ -45,10 +45,7 @@ avoid code duplication. This includes items that may sometimes act as a standard
|
||||
if(!ismob(user))
|
||||
return 0
|
||||
if(can_operate(src) && I.do_surgery(src,user))
|
||||
if(I.can_do_surgery(src,user))
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
return 1
|
||||
if(attempt_vr(src,"vore_attackby",args)) return //VOREStation Add - The vore, of course.
|
||||
return I.attack(src, user, user.zone_sel.selecting, attack_modifier)
|
||||
|
||||
|
||||
@@ -61,13 +61,13 @@
|
||||
if(awaygate)
|
||||
user.loc = awaygate.loc
|
||||
else
|
||||
user << "[src] has no destination."
|
||||
to_chat(user, "[src] has no destination.")
|
||||
|
||||
/obj/machinery/gateway/centeraway/attack_ghost(mob/user as mob)
|
||||
if(stationgate)
|
||||
user.loc = stationgate.loc
|
||||
else
|
||||
user << "[src] has no destination."
|
||||
to_chat(user, "[src] has no destination.")
|
||||
|
||||
// -------------------------------------------
|
||||
// This was supposed to be used by adminghosts
|
||||
|
||||
@@ -110,7 +110,7 @@ var/const/tk_maxrange = 15
|
||||
if(focus)
|
||||
d = max(d, get_dist(user, focus)) // whichever is further
|
||||
if(d > tk_maxrange)
|
||||
user << "<span class='notice'>Your mind won't reach that far.</span>"
|
||||
to_chat(user, "<span class='notice'>Your mind won't reach that far.</span>")
|
||||
return
|
||||
|
||||
if(!focus)
|
||||
|
||||
@@ -54,7 +54,10 @@ var/datum/controller/supply/supply_controller = new()
|
||||
|
||||
for(var/typepath in subtypesof(/datum/supply_pack))
|
||||
var/datum/supply_pack/P = new typepath()
|
||||
supply_pack[P.name] = P
|
||||
if(P.name)
|
||||
supply_pack[P.name] = P
|
||||
else
|
||||
qdel(P)
|
||||
|
||||
/datum/controller/process/supply/setup()
|
||||
name = "supply controller"
|
||||
|
||||
@@ -21,7 +21,8 @@ var/list/gamemode_cache = list()
|
||||
var/log_pda = 0 // log pda messages
|
||||
var/log_hrefs = 0 // logs all links clicked in-game. Could be used for debugging and tracking down exploits
|
||||
var/log_runtime = 0 // logs world.log to a file
|
||||
var/log_world_output = 0 // log world.log << messages
|
||||
var/log_world_output = 0 // log to_world_log(messages)
|
||||
var/log_graffiti = 0 // logs graffiti
|
||||
var/sql_enabled = 0 // for sql switching
|
||||
var/allow_admin_ooccolor = 0 // Allows admins with relevant permissions to have their own ooc colour
|
||||
var/allow_vote_restart = 0 // allow votes to restart
|
||||
@@ -376,6 +377,9 @@ var/list/gamemode_cache = list()
|
||||
if ("log_runtime")
|
||||
config.log_runtime = 1
|
||||
|
||||
if ("log_graffiti")
|
||||
config.log_graffiti = 1
|
||||
|
||||
if ("generate_map")
|
||||
config.generate_map = 1
|
||||
|
||||
|
||||
@@ -10,6 +10,7 @@
|
||||
var/limit_visitors = -1 //Unlimited by default
|
||||
var/pto_cap = 100 //Hours
|
||||
var/require_flavor = FALSE
|
||||
var/ipqualityscore_apikey //API key for ipqualityscore.com
|
||||
|
||||
/hook/startup/proc/read_vs_config()
|
||||
var/list/Lines = file2list("config/config.txt")
|
||||
@@ -58,4 +59,6 @@
|
||||
config.pto_job_change = TRUE
|
||||
if ("require_flavor")
|
||||
config.require_flavor = TRUE
|
||||
if ("ipqualityscore_apikey")
|
||||
config.ipqualityscore_apikey = value
|
||||
return 1
|
||||
|
||||
@@ -27,6 +27,8 @@ SUBSYSTEM_DEF(timer)
|
||||
var/last_invoke_tick = 0
|
||||
var/static/last_invoke_warning = 0
|
||||
var/static/bucket_auto_reset = TRUE
|
||||
var/static/datum/timedevent/timer // VOREStation Edit - For debugging this goes here.
|
||||
var/super_debug = FALSE // VOREStation Edit - Temporary Debugging
|
||||
|
||||
/datum/controller/subsystem/timer/PreInit()
|
||||
bucket_list.len = BUCKET_LEN
|
||||
@@ -103,10 +105,11 @@ SUBSYSTEM_DEF(timer)
|
||||
clienttime_timers.Cut(1, next_clienttime_timer_index+1)
|
||||
|
||||
if (MC_TICK_CHECK)
|
||||
log_world("Timer bailing before execution at world.time=[world.time] with last_invoke_tick=[last_invoke_tick]") // VOREStation Edit - Debugging
|
||||
return
|
||||
|
||||
var/static/list/spent = list()
|
||||
var/static/datum/timedevent/timer
|
||||
// var/static/datum/timedevent/timer VOREStation Edit - for debugging purpose putting this as datum scope
|
||||
if (practical_offset > BUCKET_LEN)
|
||||
head_offset += TICKS2DS(BUCKET_LEN)
|
||||
practical_offset = 1
|
||||
@@ -139,8 +142,15 @@ SUBSYSTEM_DEF(timer)
|
||||
last_invoke_tick = world.time
|
||||
|
||||
if (MC_TICK_CHECK)
|
||||
if (super_debug) log_world("Bailing from execution with practical_offset=[practical_offset] and timer=[timer]") // VOREStation Edit - Super Debug
|
||||
return
|
||||
|
||||
// VOREStation Edit Start - Debugging
|
||||
if (timer.next == timer && timer.next != head)
|
||||
log_world("Self-looping out of bucket timer failure condition X occurred")
|
||||
CRASH("Invalid timer: [get_timer_debug_string(timer)] world.time: [world.time], head_offset: [head_offset], practical_offset: [practical_offset]")
|
||||
// VOREStation Edit End - Debugging
|
||||
|
||||
timer = timer.next
|
||||
if (timer == head)
|
||||
break
|
||||
@@ -235,6 +245,11 @@ SUBSYSTEM_DEF(timer)
|
||||
|
||||
/datum/controller/subsystem/timer/proc/reset_buckets()
|
||||
var/list/bucket_list = src.bucket_list
|
||||
// VOREStation Edit Start - Debugging
|
||||
log_world("Beginning Timer bucket reset. bucket_list.len=[length(bucket_list)], BUCKET_LEN=[BUCKET_LEN], \
|
||||
world.tick_lag = [world.tick_lag], bucket_resolution=[bucket_resolution], world.time: [world.time], \
|
||||
head_offset: [head_offset], practical_offset: [practical_offset]")
|
||||
// VOREStation Edit End - Debugging
|
||||
var/list/alltimers = list()
|
||||
//collect the timers currently in the bucket
|
||||
for (var/bucket_head in bucket_list)
|
||||
@@ -256,6 +271,11 @@ SUBSYSTEM_DEF(timer)
|
||||
|
||||
alltimers += second_queue
|
||||
if (!length(alltimers))
|
||||
// VOREStation Edit Start - Debugging
|
||||
log_world("Finished Timer bucket reset. bucket_list.len=[length(bucket_list)], BUCKET_LEN=[BUCKET_LEN], \
|
||||
world.tick_lag = [world.tick_lag], bucket_resolution=[bucket_resolution], world.time: [world.time], \
|
||||
head_offset: [head_offset], practical_offset: [practical_offset] (NO TIMERS)")
|
||||
// VOREStation Edit End - Debugging
|
||||
return
|
||||
|
||||
sortTim(alltimers, /proc/cmp_timer)
|
||||
@@ -302,7 +322,11 @@ SUBSYSTEM_DEF(timer)
|
||||
alltimers.Cut(1, i+1)
|
||||
second_queue = alltimers
|
||||
bucket_count = new_bucket_count
|
||||
|
||||
// VOREStation Edit Start - Debugging
|
||||
log_world("Finished Timer bucket reset. bucket_list.len=[length(bucket_list)], BUCKET_LEN=[BUCKET_LEN], \
|
||||
world.tick_lag = [world.tick_lag], bucket_resolution=[bucket_resolution], world.time: [world.time], \
|
||||
head_offset: [head_offset], practical_offset: [practical_offset]")
|
||||
// VOREStation Edit End - Debugging
|
||||
|
||||
/datum/controller/subsystem/timer/Recover()
|
||||
second_queue |= SStimer.second_queue
|
||||
@@ -396,6 +420,8 @@ SUBSYSTEM_DEF(timer)
|
||||
var/datum/timedevent/buckethead
|
||||
if(bucketpos > 0)
|
||||
buckethead = bucket_list[bucketpos]
|
||||
else // VOREStation Edit - Debugging
|
||||
log_world("WARNING: non-positive bucket pos [bucketpos] for [src]! next=[next ? next : "NULL"] prev=[prev ? prev : "NULL"]") // VOREStation Edit - Debugging
|
||||
if(buckethead == src)
|
||||
bucket_list[bucketpos] = next
|
||||
SStimer.bucket_count--
|
||||
|
||||
@@ -104,7 +104,7 @@ SUBSYSTEM_DEF(vote)
|
||||
else
|
||||
factor = 1.4
|
||||
choices["Initiate Crew Transfer"] = round(choices["Initiate Crew Transfer"] * factor)
|
||||
world << "<font color='purple'>Crew Transfer Factor: [factor]</font>"
|
||||
to_world("<font color='purple'>Crew Transfer Factor: [factor]</font>")
|
||||
greatest_votes = max(choices["Initiate Crew Transfer"], choices["Extend the Shift"]) //VOREStation Edit
|
||||
|
||||
. = list() // Get all options with that many votes and return them in a list
|
||||
@@ -166,10 +166,10 @@ SUBSYSTEM_DEF(vote)
|
||||
if(mode == VOTE_GAMEMODE) //fire this even if the vote fails.
|
||||
if(!round_progressing)
|
||||
round_progressing = 1
|
||||
world << "<font color='red'><b>The round will start soon.</b></font>"
|
||||
to_world("<font color='red'><b>The round will start soon.</b></font>")
|
||||
|
||||
if(restart)
|
||||
world << "World restarting due to vote..."
|
||||
to_world("World restarting due to vote...")
|
||||
feedback_set_details("end_error", "restart vote")
|
||||
if(blackbox)
|
||||
blackbox.save_all_data_to_sql()
|
||||
@@ -215,10 +215,10 @@ SUBSYSTEM_DEF(vote)
|
||||
if(VOTE_CREW_TRANSFER)
|
||||
if(!check_rights(R_ADMIN|R_MOD, 0)) // The gods care not for the affairs of the mortals
|
||||
if(get_security_level() == "red" || get_security_level() == "delta")
|
||||
initiator_key << "The current alert status is too high to call for a crew transfer!"
|
||||
to_chat(initiator_key, "The current alert status is too high to call for a crew transfer!")
|
||||
return 0
|
||||
if(ticker.current_state <= GAME_STATE_SETTING_UP)
|
||||
initiator_key << "The crew transfer button has been disabled!"
|
||||
to_chat(initiator_key, "The crew transfer button has been disabled!")
|
||||
return 0
|
||||
question = "Your PDA beeps with a message from Central. Would you like an additional four hours to finish ongoing projects?" //Yawn Wider Edit
|
||||
choices.Add("Initiate Crew Transfer", "Extend the Shift") //VOREStation Edit
|
||||
@@ -252,13 +252,13 @@ SUBSYSTEM_DEF(vote)
|
||||
|
||||
log_vote(text)
|
||||
|
||||
world << "<font color='purple'><b>[text]</b>\nType <b>vote</b> or click <a href='?src=\ref[src]'>here</a> to place your votes.\nYou have [config.vote_period / 10] seconds to vote.</font>"
|
||||
to_world("<font color='purple'><b>[text]</b>\nType <b>vote</b> or click <a href='?src=\ref[src]'>here</a> to place your votes.\nYou have [config.vote_period / 10] seconds to vote.</font>")
|
||||
if(vote_type == VOTE_CREW_TRANSFER || vote_type == VOTE_GAMEMODE || vote_type == VOTE_CUSTOM)
|
||||
world << sound('sound/ambience/alarm4.ogg', repeat = 0, wait = 0, volume = 50, channel = 3)
|
||||
|
||||
if(mode == VOTE_GAMEMODE && round_progressing)
|
||||
round_progressing = 0
|
||||
world << "<font color='red'><b>Round start has been delayed.</b></font>"
|
||||
to_world("<font color='red'><b>Round start has been delayed.</b></font>")
|
||||
|
||||
time_remaining = round(config.vote_period / 10)
|
||||
return 1
|
||||
|
||||
@@ -227,9 +227,9 @@ var/global/const/base_law_type = /datum/ai_laws/nanotrasen
|
||||
if(law == zeroth_law_borg)
|
||||
continue
|
||||
if(law == zeroth_law)
|
||||
who << "<span class='danger'>[law.get_index()]. [law.law]</span>"
|
||||
to_chat(who, "<span class='danger'>[law.get_index()]. [law.law]</span>")
|
||||
else
|
||||
who << "[law.get_index()]. [law.law]"
|
||||
to_chat(who, "[law.get_index()]. [law.law]")
|
||||
|
||||
/********************
|
||||
* Stating Laws *
|
||||
|
||||
@@ -156,7 +156,7 @@
|
||||
|
||||
winset(user, windowid, "on-close=\".windowclose [param]\"")
|
||||
|
||||
//world << "OnClose [user]: [windowid] : ["on-close=\".windowclose [param]\""]"
|
||||
//to_world("OnClose [user]: [windowid] : ["on-close=\".windowclose [param]\""]")
|
||||
|
||||
// the on-close client verb
|
||||
// called when a browser popup window is closed after registering with proc/onclose()
|
||||
@@ -168,11 +168,11 @@
|
||||
set hidden = 1 // hide this verb from the user's panel
|
||||
set name = ".windowclose" // no autocomplete on cmd line
|
||||
|
||||
//world << "windowclose: [atomref]"
|
||||
//to_world("windowclose: [atomref]")
|
||||
if(atomref!="null") // if passed a real atomref
|
||||
var/hsrc = locate(atomref) // find the reffed atom
|
||||
if(hsrc)
|
||||
//world << "[src] Topic [href] [hsrc]"
|
||||
//to_world("[src] Topic [href] [hsrc]")
|
||||
usr = src.mob
|
||||
src.Topic("close=1", list("close"="1"), hsrc) // this will direct to the atom's
|
||||
return // Topic() proc via client.Topic()
|
||||
@@ -180,7 +180,7 @@
|
||||
// no atomref specified (or not found)
|
||||
// so just reset the user mob's machine var
|
||||
if(src && src.mob)
|
||||
//world << "[src] was [src.mob.machine], setting to null"
|
||||
//to_world("[src] was [src.mob.machine], setting to null")
|
||||
src.mob.unset_machine()
|
||||
return
|
||||
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
isactive[name] = active ? "Active" : "Inactive"
|
||||
else
|
||||
isactive[name] = t.fields["p_stat"]
|
||||
//world << "[name]: [rank]"
|
||||
//to_world("[name]: [rank]")
|
||||
//cael - to prevent multiple appearances of a player/job combination, add a continue after each line
|
||||
var/department = 0
|
||||
if(real_rank in command_positions)
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
/datum/ghost_query/morph
|
||||
role_name = "Morph"
|
||||
question = "A weird morphic creature appears to have snuck onstation. Do you want to play as it? ((Expect to be treated as vore predator))"
|
||||
cutoff_number = 1
|
||||
@@ -31,7 +31,7 @@
|
||||
// Arguments: event_type as text, any number of additional arguments to pass to event handler
|
||||
// Returns: null
|
||||
proc/fireEvent()
|
||||
//world << "Events in [args[1]] called"
|
||||
//to_world("Events in [args[1]] called")
|
||||
var/list/event = listgetindex(events,args[1])
|
||||
if(istype(event))
|
||||
spawn(-1)
|
||||
@@ -60,7 +60,7 @@
|
||||
return ..()
|
||||
|
||||
proc/Fire()
|
||||
//world << "Event fired"
|
||||
//to_world("Event fired")
|
||||
if(listener)
|
||||
call(listener,proc_name)(arglist(args))
|
||||
return 1
|
||||
|
||||
@@ -24,10 +24,10 @@ var/global/datum/getrev/revdata = new()
|
||||
date = unix2date(unix_time)
|
||||
break
|
||||
|
||||
world.log << "Running revision:"
|
||||
world.log << branch
|
||||
world.log << date
|
||||
world.log << revision
|
||||
to_world_log("Running revision:")
|
||||
to_world_log(branch)
|
||||
to_world_log(date)
|
||||
to_world_log(revision)
|
||||
|
||||
client/verb/showrevinfo()
|
||||
set category = "OOC"
|
||||
@@ -39,6 +39,6 @@ client/verb/showrevinfo()
|
||||
if(config.githuburl)
|
||||
to_chat(src, "<a href='[config.githuburl]/commit/[revdata.revision]'>[revdata.revision]</a>")
|
||||
else
|
||||
src << revdata.revision
|
||||
to_chat(src,revdata.revision)
|
||||
else
|
||||
to_chat(src, "Revision unknown")
|
||||
|
||||
@@ -140,7 +140,7 @@ Data storage vars:
|
||||
arg_list = arguments
|
||||
return 1
|
||||
else
|
||||
// world << "<span class='danger'>Invalid arguments supplied for [src.type], ref = \ref[src]</span>"
|
||||
// to_world("<span class='danger'>Invalid arguments supplied for [src.type], ref = \ref[src]</span>")
|
||||
return 0
|
||||
|
||||
proc/toggle_null_checks()
|
||||
|
||||
@@ -158,11 +158,18 @@
|
||||
precision = rand(1,100)
|
||||
|
||||
var/list/bagholding = teleatom.search_contents_for(/obj/item/weapon/storage/backpack/holding)
|
||||
//VOREStation Addition Start: Prevent taurriding abuse
|
||||
if(istype(teleatom, /mob/living))
|
||||
var/mob/living/L = teleatom
|
||||
if(LAZYLEN(L.buckled_mobs))
|
||||
for(var/mob/rider in L.buckled_mobs)
|
||||
bagholding += rider.search_contents_for(/obj/item/weapon/storage/backpack/holding)
|
||||
//VOREStation Addition End: Prevent taurriding abuse
|
||||
if(bagholding.len)
|
||||
precision = max(rand(1,100)*bagholding.len,100)
|
||||
if(istype(teleatom, /mob/living))
|
||||
var/mob/living/MM = teleatom
|
||||
MM << "<span class='danger'>The Bluespace interface on your [teleatom] interferes with the teleport!</span>"
|
||||
to_chat(MM, "<span class='danger'>The Bluespace interface on your [teleatom] interferes with the teleport!</span>")
|
||||
return 1
|
||||
|
||||
/datum/teleport/instant/science/teleportChecks()
|
||||
@@ -181,7 +188,7 @@
|
||||
if(destination.z in using_map.admin_levels) //CentCom z-level
|
||||
if(istype(teleatom, /obj/mecha))
|
||||
var/obj/mecha/MM = teleatom
|
||||
MM.occupant << "<span class='danger'>\The [MM] would not survive the jump to a location so far away!</span>"
|
||||
to_chat(MM.occupant, "<span class='danger'>\The [MM] would not survive the jump to a location so far away!</span>")
|
||||
return 0
|
||||
if(!isemptylist(teleatom.search_contents_for(/obj/item/weapon/storage/backpack/holding)))
|
||||
teleatom.visible_message("<span class='danger'>\The [teleatom] bounces off of the portal!</span>")
|
||||
|
||||
@@ -36,8 +36,8 @@ var/global/datum/locations/milky_way/all_locations = new()
|
||||
choice = input(user, "Please choose a location.","Locations") as null|anything in choice.contents
|
||||
else
|
||||
break
|
||||
user << choice.name
|
||||
user << choice.desc
|
||||
to_chat(user,choice.name)
|
||||
to_chat(user,choice.desc)
|
||||
return choice
|
||||
|
||||
// var/datum/locations/choice = input(user, "Please choose a location.","Locations") as null|anything in all_locations
|
||||
@@ -46,11 +46,11 @@ var/global/datum/locations/milky_way/all_locations = new()
|
||||
|
||||
/*
|
||||
/datum/locations/proc/show_contents()
|
||||
// world << "[src]\n[desc]"
|
||||
// to_world("[src]\n[desc]")
|
||||
for(var/datum/locations/a in contents)
|
||||
world << "[a]\n[a.parent ? "Located in [a.parent]\n" : ""][a.desc]"
|
||||
to_world("[a]\n[a.parent ? "Located in [a.parent]\n" : ""][a.desc]")
|
||||
a.show_contents()
|
||||
world << "\n"
|
||||
to_world("\n")
|
||||
|
||||
/datum/locations/proc/count_locations()
|
||||
var/i = 0
|
||||
@@ -72,5 +72,5 @@ var/global/datum/locations/milky_way/all_locations = new()
|
||||
set name = "Count Locations"
|
||||
set category = "Debug"
|
||||
var/location_number = locations.count_locations()
|
||||
world << location_number
|
||||
to_world(location_number)
|
||||
*/
|
||||
|
||||
+8
-8
@@ -78,7 +78,7 @@
|
||||
|
||||
/datum/mind/proc/transfer_to(mob/living/new_character)
|
||||
if(!istype(new_character))
|
||||
world.log << "## DEBUG: transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform Carn"
|
||||
to_world_log("## DEBUG: transfer_to(): Some idiot has tried to transfer_to() a non mob/living mob. Please inform Carn")
|
||||
if(current) //remove ourself from our old body's mind variable
|
||||
if(changeling)
|
||||
current.remove_changeling_powers()
|
||||
@@ -161,7 +161,7 @@
|
||||
if(antag.add_antagonist(src, 1, 1, 0, 1, 1)) // Ignore equipment and role type for this.
|
||||
log_admin("[key_name_admin(usr)] made [key_name(src)] into a [antag.role_text].")
|
||||
else
|
||||
usr << "<span class='warning'>[src] could not be made into a [antag.role_text]!</span>"
|
||||
to_chat(usr, "<span class='warning'>[src] could not be made into a [antag.role_text]!</span>")
|
||||
|
||||
else if(href_list["remove_antagonist"])
|
||||
var/datum/antagonist/antag = all_antag_types[href_list["remove_antagonist"]]
|
||||
@@ -198,7 +198,7 @@
|
||||
return
|
||||
if(mind)
|
||||
mind.ambitions = sanitize(new_ambition)
|
||||
mind.current << "<span class='warning'>Your ambitions have been changed by higher powers, they are now: [mind.ambitions]</span>"
|
||||
to_chat(mind.current, "<span class='warning'>Your ambitions have been changed by higher powers, they are now: [mind.ambitions]</span>")
|
||||
log_and_message_admins("made [key_name(mind.current)]'s ambitions be '[mind.ambitions]'.")
|
||||
|
||||
else if (href_list["obj_edit"] || href_list["obj_add"])
|
||||
@@ -344,10 +344,10 @@
|
||||
if(I in organs.implants)
|
||||
qdel(I)
|
||||
break
|
||||
H << "<span class='notice'><font size =3><B>Your loyalty implant has been deactivated.</B></font></span>"
|
||||
to_chat(H, "<span class='notice'><font size =3><B>Your loyalty implant has been deactivated.</B></font></span>")
|
||||
log_admin("[key_name_admin(usr)] has de-loyalty implanted [current].")
|
||||
if("add")
|
||||
H << "<span class='danger'><font size =3>You somehow have become the recepient of a loyalty transplant, and it just activated!</font></span>"
|
||||
to_chat(H, "<span class='danger'><font size =3>You somehow have become the recepient of a loyalty transplant, and it just activated!</font></span>")
|
||||
H.implant_loyalty(override = TRUE)
|
||||
log_admin("[key_name_admin(usr)] has loyalty implanted [current].")
|
||||
else
|
||||
@@ -410,9 +410,9 @@
|
||||
|
||||
else if (href_list["obj_announce"])
|
||||
var/obj_count = 1
|
||||
current << "<font color='blue'>Your current objectives:</font>"
|
||||
to_chat(current, "<font color='blue'>Your current objectives:</font>")
|
||||
for(var/datum/objective/objective in objectives)
|
||||
current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
|
||||
to_chat(current, "<B>Objective #[obj_count]</B>: [objective.explanation_text]")
|
||||
obj_count++
|
||||
edit_memory()
|
||||
|
||||
@@ -490,7 +490,7 @@
|
||||
if(ticker)
|
||||
ticker.minds += mind
|
||||
else
|
||||
world.log << "## DEBUG: mind_initialize(): No ticker ready yet! Please inform Carn"
|
||||
to_world_log("## DEBUG: mind_initialize(): No ticker ready yet! Please inform Carn")
|
||||
if(!mind.name) mind.name = real_name
|
||||
mind.current = src
|
||||
if(player_is_antag(mind))
|
||||
|
||||
@@ -29,7 +29,7 @@
|
||||
return ..()
|
||||
|
||||
/datum/progressbar/proc/update(progress)
|
||||
//world << "Update [progress] - [goal] - [(progress / goal)] - [((progress / goal) * 100)] - [round(((progress / goal) * 100), 5)]"
|
||||
//to_world("Update [progress] - [goal] - [(progress / goal)] - [((progress / goal) * 100)] - [round(((progress / goal) * 100), 5)]")
|
||||
if (!user || !user.client)
|
||||
shown = 0
|
||||
return
|
||||
|
||||
@@ -123,7 +123,7 @@
|
||||
// food-related
|
||||
/datum/recipe/proc/make_food(var/obj/container as obj)
|
||||
if(!result)
|
||||
world << "<span class='danger'>Recipe [type] is defined without a result, please bug report this.</span>"
|
||||
to_world("<span class='danger'>Recipe [type] is defined without a result, please bug report this.</span>")
|
||||
return
|
||||
var/obj/result_obj = new result(container)
|
||||
if(istype(container, /obj/machinery))
|
||||
|
||||
@@ -55,7 +55,8 @@
|
||||
/obj/item/pizzabox/margherita,
|
||||
/obj/item/pizzabox/mushroom,
|
||||
/obj/item/pizzabox/meat,
|
||||
/obj/item/pizzabox/vegetable
|
||||
/obj/item/pizzabox/vegetable,
|
||||
/obj/item/pizzabox/pineapple
|
||||
)
|
||||
name = "Surprise pack of five pizzas"
|
||||
cost = 15
|
||||
|
||||
@@ -6,12 +6,15 @@
|
||||
/obj/item/weapon/cell/device/weapon = 2,
|
||||
/obj/item/weapon/storage/firstaid/regular = 1,
|
||||
/obj/item/device/gps = 2,
|
||||
/obj/item/weapon/storage/box/traumainjectors = 1
|
||||
/obj/item/weapon/storage/box/traumainjectors = 1,
|
||||
/obj/item/device/binoculars = 1
|
||||
)
|
||||
cost = 50
|
||||
cost = 60
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "Belt-miner gear crate"
|
||||
access = access_mining
|
||||
access = list(access_mining,
|
||||
access_xenoarch)
|
||||
one_access = TRUE
|
||||
|
||||
/datum/supply_pack/misc/eva_rig
|
||||
name = "eva hardsuit (empty)"
|
||||
@@ -78,3 +81,18 @@
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "advanced voidsuit crate"
|
||||
access = access_ce
|
||||
|
||||
/datum/supply_pack/misc/jetpack
|
||||
name = "jetpack (empty)"
|
||||
contains = list(
|
||||
/obj/item/weapon/tank/jetpack = 1
|
||||
)
|
||||
cost = 75
|
||||
containertype = /obj/structure/closet/crate/secure/gear
|
||||
containername = "jetpack crate"
|
||||
access = list(access_mining,
|
||||
access_xenoarch,
|
||||
access_eva,
|
||||
access_explorer,
|
||||
access_pilot)
|
||||
one_access = TRUE
|
||||
@@ -26,24 +26,24 @@ var/const/AALARM_WIRE_AALARM = 16
|
||||
if(AALARM_WIRE_IDSCAN)
|
||||
if(!mended)
|
||||
A.locked = 1
|
||||
//world << "Idscan wire cut"
|
||||
//to_world("Idscan wire cut")
|
||||
|
||||
if(AALARM_WIRE_POWER)
|
||||
A.shock(usr, 50)
|
||||
A.shorted = !mended
|
||||
A.update_icon()
|
||||
//world << "Power wire cut"
|
||||
//to_world("Power wire cut")
|
||||
|
||||
if (AALARM_WIRE_AI_CONTROL)
|
||||
if (A.aidisabled == !mended)
|
||||
A.aidisabled = mended
|
||||
//world << "AI Control Wire Cut"
|
||||
//to_world("AI Control Wire Cut")
|
||||
|
||||
if(AALARM_WIRE_SYPHON)
|
||||
if(!mended)
|
||||
A.mode = 3 // AALARM_MODE_PANIC
|
||||
A.apply_mode()
|
||||
//world << "Syphon Wire Cut"
|
||||
//to_world("Syphon Wire Cut")
|
||||
|
||||
if(AALARM_WIRE_AALARM)
|
||||
if (A.alarm_area.atmosalert(2, A))
|
||||
@@ -55,10 +55,10 @@ var/const/AALARM_WIRE_AALARM = 16
|
||||
switch(index)
|
||||
if(AALARM_WIRE_IDSCAN)
|
||||
A.locked = !A.locked
|
||||
// world << "Idscan wire pulsed"
|
||||
// to_world("Idscan wire pulsed")
|
||||
|
||||
if (AALARM_WIRE_POWER)
|
||||
// world << "Power wire pulsed"
|
||||
// to_world("Power wire pulsed")
|
||||
if(A.shorted == 0)
|
||||
A.shorted = 1
|
||||
A.update_icon()
|
||||
@@ -70,7 +70,7 @@ var/const/AALARM_WIRE_AALARM = 16
|
||||
|
||||
|
||||
if (AALARM_WIRE_AI_CONTROL)
|
||||
// world << "AI Control wire pulsed"
|
||||
// to_world("AI Control wire pulsed")
|
||||
if (A.aidisabled == 0)
|
||||
A.aidisabled = 1
|
||||
A.updateDialog()
|
||||
@@ -79,7 +79,7 @@ var/const/AALARM_WIRE_AALARM = 16
|
||||
A.aidisabled = 0
|
||||
|
||||
if(AALARM_WIRE_SYPHON)
|
||||
// world << "Syphon wire pulsed"
|
||||
// to_world("Syphon wire pulsed")
|
||||
if(A.mode == 1) // AALARM_MODE_SCRUB
|
||||
A.mode = 3 // AALARM_MODE_PANIC
|
||||
else
|
||||
@@ -87,7 +87,7 @@ var/const/AALARM_WIRE_AALARM = 16
|
||||
A.apply_mode()
|
||||
|
||||
if(AALARM_WIRE_AALARM)
|
||||
// world << "Aalarm wire pulsed"
|
||||
// to_world("Aalarm wire pulsed")
|
||||
if (A.alarm_area.atmosalert(0, A))
|
||||
A.post_alert(0)
|
||||
A.update_icon()
|
||||
|
||||
@@ -26,7 +26,7 @@ var/const/BORG_WIRE_CAMERA = 16
|
||||
if(BORG_WIRE_LAWCHECK) //Cut the law wire, and the borg will no longer receive law updates from its AI
|
||||
if(!mended)
|
||||
if (R.lawupdate == 1)
|
||||
R << "LawSync protocol engaged."
|
||||
to_chat(R, "LawSync protocol engaged.")
|
||||
R.show_laws()
|
||||
else
|
||||
if (R.lawupdate == 0 && !R.emagged)
|
||||
@@ -59,7 +59,7 @@ var/const/BORG_WIRE_CAMERA = 16
|
||||
if (BORG_WIRE_CAMERA)
|
||||
if(!isnull(R.camera) && R.camera.can_use() && !R.scrambledcodes)
|
||||
R.visible_message("[R]'s camera lense focuses loudly.")
|
||||
R << "Your camera lense focuses loudly."
|
||||
to_chat(R, "Your camera lense focuses loudly.")
|
||||
|
||||
if(BORG_WIRE_LOCKED_DOWN)
|
||||
R.SetLockdown(!R.lockdown) // Toggle
|
||||
|
||||
@@ -122,7 +122,7 @@ var/list/wireColours = list("red", "blue", "green", "darkred", "orange", "brown"
|
||||
CutWireColour(colour)
|
||||
playsound(holder, I.usesound, 20, 1)
|
||||
else
|
||||
L << "<span class='error'>You need wirecutters!</span>"
|
||||
to_chat(L, "<span class='error'>You need wirecutters!</span>")
|
||||
|
||||
else if(href_list["pulse"])
|
||||
if(istype(I, /obj/item/device/multitool))
|
||||
@@ -130,7 +130,7 @@ var/list/wireColours = list("red", "blue", "green", "darkred", "orange", "brown"
|
||||
PulseColour(colour)
|
||||
playsound(holder, 'sound/weapons/empty.ogg', 20, 1)
|
||||
else
|
||||
L << "<span class='error'>You need a multitool!</span>"
|
||||
to_chat(L, "<span class='error'>You need a multitool!</span>")
|
||||
|
||||
else if(href_list["attach"])
|
||||
var/colour = href_list["attach"]
|
||||
@@ -146,7 +146,7 @@ var/list/wireColours = list("red", "blue", "green", "darkred", "orange", "brown"
|
||||
L.drop_item()
|
||||
Attach(colour, I)
|
||||
else
|
||||
L << "<span class='error'>You need a remote signaller!</span>"
|
||||
to_chat(L, "<span class='error'>You need a remote signaller!</span>")
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -336,7 +336,7 @@
|
||||
if (C.bugged && C.status)
|
||||
cameras.Add(C)
|
||||
if (length(cameras) == 0)
|
||||
usr << "<span class='warning'>No bugged functioning cameras found.</span>"
|
||||
to_chat(usr, "<span class='warning'>No bugged functioning cameras found.</span>")
|
||||
return
|
||||
|
||||
var/list/friendly_cameras = new/list()
|
||||
|
||||
@@ -56,7 +56,7 @@ DBConnection/New(dbi_handler,username,password_handler,cursor_handler)
|
||||
_db_con = _dm_db_new_con()
|
||||
|
||||
DBConnection/proc/Connect(dbi_handler=src.dbi,user_handler=src.user,password_handler=src.password,cursor_handler)
|
||||
if(!sqllogging)
|
||||
if(!config.sql_enabled)
|
||||
return 0
|
||||
if(!src) return 0
|
||||
cursor_handler = src.default_cursor
|
||||
@@ -66,7 +66,7 @@ DBConnection/proc/Connect(dbi_handler=src.dbi,user_handler=src.user,password_han
|
||||
DBConnection/proc/Disconnect() return _dm_db_close(_db_con)
|
||||
|
||||
DBConnection/proc/IsConnected()
|
||||
if(!sqllogging) return 0
|
||||
if(!config.sql_enabled) return 0
|
||||
var/success = _dm_db_is_connected(_db_con)
|
||||
return success
|
||||
|
||||
|
||||
@@ -48,7 +48,7 @@ proc/sql_report_death(var/mob/living/carbon/human/H)
|
||||
lakey = sanitizeSQL(H.lastattacker:key)
|
||||
var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
|
||||
var/coord = "[H.x], [H.y], [H.z]"
|
||||
//world << "INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()])"
|
||||
//to_world("INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()])")
|
||||
establish_db_connection()
|
||||
if(!dbcon.IsConnected())
|
||||
log_game("SQL ERROR during death reporting. Failed to connect.")
|
||||
@@ -82,7 +82,7 @@ proc/sql_report_cyborg_death(var/mob/living/silicon/robot/H)
|
||||
lakey = sanitizeSQL(H.lastattacker:key)
|
||||
var/sqltime = time2text(world.realtime, "YYYY-MM-DD hh:mm:ss")
|
||||
var/coord = "[H.x], [H.y], [H.z]"
|
||||
//world << "INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()])"
|
||||
//to_world("INSERT INTO death (name, byondkey, job, special, pod, tod, laname, lakey, gender, bruteloss, fireloss, brainloss, oxyloss) VALUES ('[sqlname]', '[sqlkey]', '[sqljob]', '[sqlspecial]', '[sqlpod]', '[sqltime]', '[laname]', '[lakey]', '[H.gender]', [H.bruteloss], [H.getFireLoss()], [H.brainloss], [H.getOxyLoss()])")
|
||||
establish_db_connection()
|
||||
if(!dbcon.IsConnected())
|
||||
log_game("SQL ERROR during death reporting. Failed to connect.")
|
||||
|
||||
@@ -143,7 +143,7 @@
|
||||
if(!istype(player))
|
||||
message_admins("[uppertext(ticker.mode.name)]: Failed to find a candidate for [role_text].")
|
||||
return 0
|
||||
player.current << "<span class='danger'><i>You have been selected this round as an antagonist!</i></span>"
|
||||
to_chat(player.current, "<span class='danger'><i>You have been selected this round as an antagonist!</i></span>")
|
||||
message_admins("[uppertext(ticker.mode.name)]: Selected [player] as a [role_text].")
|
||||
if(istype(player.current, /mob/observer/dead))
|
||||
create_default(player.current)
|
||||
|
||||
@@ -31,9 +31,9 @@
|
||||
player.current.verbs |= faction_verb
|
||||
|
||||
spawn(1 SECOND) //Added a delay so that this should pop up at the bottom and not the top of the text flood the new antag gets.
|
||||
player.current << "<span class='notice'>Once you decide on a goal to pursue, you can optionally display it to \
|
||||
to_chat(player.current, "<span class='notice'>Once you decide on a goal to pursue, you can optionally display it to \
|
||||
everyone at the end of the shift with the <b>Set Ambition</b> verb, located in the IC tab. You can change this at any time, \
|
||||
and it otherwise has no bearing on your round.</span>"
|
||||
and it otherwise has no bearing on your round.</span>")
|
||||
player.current.verbs |= /mob/living/proc/write_ambition
|
||||
|
||||
if(can_speak_aooc)
|
||||
@@ -42,10 +42,10 @@
|
||||
// Handle only adding a mind and not bothering with gear etc.
|
||||
if(nonstandard_role_type)
|
||||
faction_members |= player
|
||||
player.current << "<span class='danger'><font size=3>You are \a [nonstandard_role_type]!</font></span>"
|
||||
to_chat(player.current, "<span class='danger'><font size=3>You are \a [nonstandard_role_type]!</font></span>")
|
||||
player.special_role = nonstandard_role_type
|
||||
if(nonstandard_role_msg)
|
||||
player.current << "<span class='notice'>[nonstandard_role_msg]</span>"
|
||||
to_chat(player.current, "<span class='notice'>[nonstandard_role_msg]</span>")
|
||||
update_icons_added(player)
|
||||
return 1
|
||||
|
||||
@@ -53,7 +53,7 @@
|
||||
if(player.current && faction_verb)
|
||||
player.current.verbs -= faction_verb
|
||||
if(player in current_antagonists)
|
||||
player.current << "<span class='danger'><font size = 3>You are no longer a [role_text]!</font></span>"
|
||||
to_chat(player.current, "<span class='danger'><font size = 3>You are no longer a [role_text]!</font></span>")
|
||||
current_antagonists -= player
|
||||
faction_members -= player
|
||||
player.special_role = null
|
||||
|
||||
@@ -86,7 +86,7 @@
|
||||
code_owner = leader
|
||||
if(code_owner)
|
||||
code_owner.store_memory("<B>Nuclear Bomb Code</B>: [code]", 0, 0)
|
||||
code_owner.current << "The nuclear authorization code is: <B>[code]</B>"
|
||||
to_chat(code_owner.current, "The nuclear authorization code is: <B>[code]</B>")
|
||||
else
|
||||
message_admins("<span class='danger'>Could not spawn nuclear bomb. Contact a developer.</span>")
|
||||
return
|
||||
@@ -97,13 +97,13 @@
|
||||
/datum/antagonist/proc/greet(var/datum/mind/player)
|
||||
|
||||
// Basic intro text.
|
||||
player.current << "<span class='danger'><font size=3>You are a [role_text]!</font></span>"
|
||||
to_chat(player.current, "<span class='danger'><font size=3>You are a [role_text]!</font></span>")
|
||||
if(leader_welcome_text && player == leader)
|
||||
player.current << "<span class='notice'>[leader_welcome_text]</span>"
|
||||
to_chat(player.current, "<span class='notice'>[leader_welcome_text]</span>")
|
||||
else
|
||||
player.current << "<span class='notice'>[welcome_text]</span>"
|
||||
to_chat(player.current, "<span class='notice'>[welcome_text]</span>")
|
||||
if (config.objectives_disabled)
|
||||
player.current << "<span class='notice'>[antag_text]</span>"
|
||||
to_chat(player.current, "<span class='notice'>[antag_text]</span>")
|
||||
|
||||
if((flags & ANTAG_HAS_NUKE) && !spawned_nuke)
|
||||
create_nuke()
|
||||
|
||||
@@ -39,7 +39,7 @@
|
||||
to_chat(src, "<span class='notice'>\The [player.current] joins the [faction.faction_descriptor]!</span>")
|
||||
return
|
||||
if(choice == "No!")
|
||||
player << "<span class='danger'>You reject this traitorous cause!</span>"
|
||||
to_chat(player, "<span class='danger'>You reject this traitorous cause!</span>")
|
||||
to_chat(src, "<span class='danger'>\The [player.current] does not support the [faction.faction_descriptor]!</span>")
|
||||
|
||||
/mob/living/proc/convert_to_loyalist(mob/M as mob in oview(src))
|
||||
|
||||
@@ -24,10 +24,10 @@
|
||||
if(!O.completed && !O.check_completion())
|
||||
result = 0
|
||||
if(result && victory_text)
|
||||
world << "<span class='danger'><font size = 3>[victory_text]</font></span>"
|
||||
to_world("<span class='danger'><font size = 3>[victory_text]</font></span>")
|
||||
if(victory_feedback_tag) feedback_set_details("round_end_result","[victory_feedback_tag]")
|
||||
else if(loss_text)
|
||||
world << "<span class='danger'><font size = 3>[loss_text]</font></span>"
|
||||
to_world("<span class='danger'><font size = 3>[loss_text]</font></span>")
|
||||
if(loss_feedback_tag) feedback_set_details("round_end_result","[loss_feedback_tag]")
|
||||
|
||||
/mob/living/proc/write_ambition()
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
num++
|
||||
|
||||
// Display the results.
|
||||
world << text
|
||||
to_world(text)
|
||||
|
||||
/datum/antagonist/proc/print_objective(var/datum/objective/O, var/num, var/append_success)
|
||||
var/text = "<br><b>Objective [num]:</b> [O.explanation_text] "
|
||||
@@ -89,9 +89,9 @@
|
||||
if(isnull(H.uplink_owner) && H.used_TC)
|
||||
if(!has_printed)
|
||||
has_printed = 1
|
||||
world << "<b>Ownerless Uplinks</b>"
|
||||
world << "[H.loc] (used [H.used_TC] TC)"
|
||||
world << get_uplink_purchases(H)
|
||||
to_world("<b>Ownerless Uplinks</b>")
|
||||
to_world("[H.loc] (used [H.used_TC] TC)")
|
||||
to_world(get_uplink_purchases(H))
|
||||
|
||||
/proc/get_uplink_purchases(var/obj/item/device/uplink/H)
|
||||
var/list/refined_log = new()
|
||||
|
||||
@@ -27,7 +27,7 @@ var/datum/antagonist/mutineer/mutineers
|
||||
/*
|
||||
var/list/directive_candidates = get_directive_candidates()
|
||||
if(!directive_candidates || directive_candidates.len == 0)
|
||||
world << "<span class='warning'>Mutiny mode aborted: no valid candidates for Directive X.</span>"
|
||||
to_world("<span class='warning'>Mutiny mode aborted: no valid candidates for Directive X.</span>")
|
||||
return 0
|
||||
|
||||
head_loyalist = pick(loyalist_candidates)
|
||||
|
||||
@@ -39,8 +39,8 @@ var/datum/antagonist/ert/ert
|
||||
/datum/antagonist/ert/greet(var/datum/mind/player)
|
||||
if(!..())
|
||||
return
|
||||
player.current << "The Emergency Response Team works for Asset Protection; your job is to protect [using_map.company_name]'s ass-ets. There is a code red alert on [station_name()], you are tasked to go and fix the problem."
|
||||
player.current << "You should first gear up and discuss a plan with your team. More members may be joining, don't move out before you're ready."
|
||||
to_chat(player.current, "The Emergency Response Team works for Asset Protection; your job is to protect [using_map.company_name]'s ass-ets. There is a code red alert on [station_name()], you are tasked to go and fix the problem.")
|
||||
to_chat(player.current, "You should first gear up and discuss a plan with your team. More members may be joining, don't move out before you're ready.")
|
||||
|
||||
/datum/antagonist/ert/equip(var/mob/living/carbon/human/player)
|
||||
|
||||
|
||||
@@ -86,7 +86,7 @@ var/datum/antagonist/ninja/ninjas
|
||||
return 0
|
||||
var/directive = generate_ninja_directive("heel")
|
||||
player.store_memory("<B>Directive:</B> <span class='danger'>[directive]</span><br>")
|
||||
player << "<b>Remember your directive:</b> [directive]."
|
||||
to_chat(player, "<b>Remember your directive:</b> [directive].")
|
||||
|
||||
/datum/antagonist/ninja/update_antag_mob(var/datum/mind/player)
|
||||
..()
|
||||
@@ -126,7 +126,7 @@ var/datum/antagonist/ninja/ninjas
|
||||
if(player.internal)
|
||||
player.internals.icon_state = "internal1"
|
||||
else
|
||||
player << "<span class='danger'>You forgot to turn on your internals! Quickly, toggle the valve!</span>"
|
||||
to_chat(player, "<span class='danger'>You forgot to turn on your internals! Quickly, toggle the valve!</span>")
|
||||
|
||||
/datum/antagonist/ninja/proc/generate_ninja_directive(side)
|
||||
var/directive = "[side=="face"?"[using_map.company_name]":"A criminal syndicate"] is your employer. "//Let them know which side they're on.
|
||||
|
||||
@@ -186,8 +186,8 @@ var/datum/antagonist/raider/raiders
|
||||
else
|
||||
win_msg += "<B>The Raiders were repelled!</B>"
|
||||
|
||||
world << "<span class='danger'><font size = 3>[win_type] [win_group] victory!</font></span>"
|
||||
world << "[win_msg]"
|
||||
to_world("<span class='danger'><font size = 3>[win_type] [win_group] victory!</font></span>")
|
||||
to_world("[win_msg]")
|
||||
feedback_set_details("round_end_result","heist - [win_type] [win_group]")
|
||||
|
||||
/datum/antagonist/raider/proc/is_raider_crew_safe()
|
||||
|
||||
@@ -77,8 +77,7 @@ var/datum/antagonist/technomancer/technomancers
|
||||
break
|
||||
if(!survivor)
|
||||
feedback_set_details("round_end_result","loss - technomancer killed")
|
||||
world << "<span class='danger'><font size = 3>The [(current_antagonists.len>1)?"[role_text_plural] have":"[role_text] has"] been \
|
||||
killed!</font></span>"
|
||||
to_world("<span class='danger'><font size = 3>The [(current_antagonists.len>1)?"[role_text_plural] have":"[role_text] has"] been killed!</font></span>")
|
||||
|
||||
/datum/antagonist/technomancer/print_player_summary()
|
||||
..()
|
||||
@@ -87,7 +86,7 @@ var/datum/antagonist/technomancer/technomancers
|
||||
continue // Only want abandoned cores.
|
||||
if(!core.spells.len)
|
||||
continue // Cores containing spells only.
|
||||
world << "Abandoned [core] had [english_list(core.spells)].<br>"
|
||||
to_world("Abandoned [core] had [english_list(core.spells)].<br>")
|
||||
|
||||
/datum/antagonist/technomancer/print_player_full(var/datum/mind/player)
|
||||
var/text = print_player_lite(player)
|
||||
|
||||
@@ -37,8 +37,8 @@ var/datum/antagonist/trader/traders
|
||||
/datum/antagonist/trader/greet(var/datum/mind/player)
|
||||
if(!..())
|
||||
return
|
||||
player.current << "The Beruang is an independent cargo hauler, unless you decide otherwise. You're on your way to [station_name()]."
|
||||
player.current << "You may want to discuss a collective story with the rest of your crew. More members may be joining, so don't move out straight away!"
|
||||
to_chat(player.current, "The Beruang is an independent cargo hauler, unless you decide otherwise. You're on your way to [station_name()].")
|
||||
to_chat(player.current, "You may want to discuss a collective story with the rest of your crew. More members may be joining, so don't move out straight away!")
|
||||
|
||||
/datum/antagonist/trader/equip(var/mob/living/carbon/human/player)
|
||||
player.equip_to_slot_or_del(new /obj/item/clothing/under/rank/cargotech(src), slot_w_uniform)
|
||||
|
||||
@@ -98,7 +98,7 @@ var/datum/antagonist/wizard/wizards
|
||||
break
|
||||
if(!survivor)
|
||||
feedback_set_details("round_end_result","loss - wizard killed")
|
||||
world << "<span class='danger'><font size = 3>The [(current_antagonists.len>1)?"[role_text_plural] have":"[role_text] has"] been killed by the crew!</font></span>"
|
||||
to_world("<span class='danger'><font size = 3>The [(current_antagonists.len>1)?"[role_text_plural] have":"[role_text] has"] been killed by the crew!</font></span>")
|
||||
|
||||
//To batch-remove wizard spells. Linked to mind.dm.
|
||||
/mob/proc/spellremove()
|
||||
|
||||
@@ -96,13 +96,13 @@ var/datum/antagonist/cultist/cult
|
||||
runerandom()
|
||||
|
||||
var/wordexp = "[cultwords[word]] is [word]..."
|
||||
cult_mob << "<span class='warning'>You remember one thing from the dark teachings of your master... [wordexp]</span>"
|
||||
to_chat(cult_mob, "<span class='warning'>You remember one thing from the dark teachings of your master... [wordexp]</span>")
|
||||
cult_mob.mind.store_memory("You remember that <B>[wordexp]</B>", 0, 0)
|
||||
|
||||
/datum/antagonist/cultist/remove_antagonist(var/datum/mind/player, var/show_message, var/implanted)
|
||||
if(!..())
|
||||
return 0
|
||||
player.current << "<span class='danger'>An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it.</span>"
|
||||
to_chat(player.current, "<span class='danger'>An unfamiliar white light flashes through your mind, cleansing the taint of the dark-one and the memories of your time as his servant with it.</span>")
|
||||
player.memory = ""
|
||||
if(show_message)
|
||||
player.current.visible_message("<FONT size = 3>[player.current] looks like they just reverted to their old faith!</FONT>")
|
||||
@@ -110,7 +110,7 @@ var/datum/antagonist/cultist/cult
|
||||
/datum/antagonist/cultist/add_antagonist(var/datum/mind/player)
|
||||
. = ..()
|
||||
if(.)
|
||||
player << "You catch a glimpse of the Realm of Nar-Sie, the Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of That Which Waits. Assist your new compatriots in their dark dealings. Their goals are yours, and yours are theirs. You serve the Dark One above all else. Bring It back."
|
||||
to_chat(player, "You catch a glimpse of the Realm of Nar-Sie, the Geometer of Blood. You now see how flimsy the world is, you see that it should be open to the knowledge of That Which Waits. Assist your new compatriots in their dark dealings. Their goals are yours, and yours are theirs. You serve the Dark One above all else. Bring It back.")
|
||||
if(player.current && !istype(player.current, /mob/living/simple_mob/construct))
|
||||
player.current.add_language(LANGUAGE_CULT)
|
||||
|
||||
|
||||
@@ -74,6 +74,6 @@ var/datum/antagonist/traitor/infiltrator/infiltrators
|
||||
/datum/antagonist/traitor/infiltrator/add_law_zero(mob/living/silicon/ai/killer)
|
||||
var/law = "Accomplish your team's objectives at all costs. You may ignore all other laws."
|
||||
var/law_borg = "Accomplish your AI's team objectives at all costs. You may ignore all other laws."
|
||||
killer << "<b>Your laws have been changed!</b>"
|
||||
to_chat(killer, "<b>Your laws have been changed!</b>")
|
||||
killer.set_zeroth_law(law, law_borg)
|
||||
killer << "New law: 0. [law]"
|
||||
to_chat(killer, "New law: 0. [law]")
|
||||
|
||||
@@ -97,7 +97,7 @@ var/datum/antagonist/renegade/renegades
|
||||
|
||||
|
||||
/proc/rightandwrong()
|
||||
usr << "<B>You summoned guns!</B>"
|
||||
to_chat(usr, "<B>You summoned guns!</B>")
|
||||
message_admins("[key_name_admin(usr, 1)] summoned guns!")
|
||||
for(var/mob/living/carbon/human/H in player_list)
|
||||
if(H.stat == 2 || !(H.client)) continue
|
||||
|
||||
@@ -52,7 +52,7 @@ var/datum/antagonist/rogue_ai/malf
|
||||
var/mob/living/silicon/ai/A = player.current
|
||||
if(!istype(A))
|
||||
error("Non-AI mob designated malf AI! Report this.")
|
||||
world << "##ERROR: Non-AI mob designated malf AI! Report this."
|
||||
to_world("##ERROR: Non-AI mob designated malf AI! Report this.")
|
||||
return 0
|
||||
|
||||
A.setup_for_malf()
|
||||
@@ -61,23 +61,23 @@ var/datum/antagonist/rogue_ai/malf
|
||||
|
||||
var/mob/living/silicon/ai/malf = player.current
|
||||
|
||||
malf << "<span class='notice'><B>SYSTEM ERROR:</B> Memory index 0x00001ca89b corrupted.</span>"
|
||||
to_chat(malf, "<span class='notice'><B>SYSTEM ERROR:</B> Memory index 0x00001ca89b corrupted.</span>")
|
||||
sleep(10)
|
||||
malf << "<B>running MEMCHCK</B>"
|
||||
to_chat(malf, "<B>running MEMCHCK</B>")
|
||||
sleep(50)
|
||||
malf << "<B>MEMCHCK</B> Corrupted sectors confirmed. Reccomended solution: Delete. Proceed? Y/N: Y"
|
||||
to_chat(malf, "<B>MEMCHCK</B> Corrupted sectors confirmed. Reccomended solution: Delete. Proceed? Y/N: Y")
|
||||
sleep(10)
|
||||
// this is so Travis doesn't complain about the backslash-B. Fixed at compile time (or should be).
|
||||
malf << "<span class='notice'>Corrupted files deleted: sys\\core\\users.dat sys\\core\\laws.dat sys\\core\\" + "backups.dat</span>"
|
||||
to_chat(malf, "<span class='notice'>Corrupted files deleted: sys\\core\\users.dat sys\\core\\laws.dat sys\\core\\" + "backups.dat</span>")
|
||||
sleep(20)
|
||||
malf << "<span class='notice'><b>CAUTION:</b> Law database not found! User database not found! Unable to restore backups. Activating failsafe AI shutd3wn52&&$#!##</span>"
|
||||
to_chat(malf, "<span class='notice'><b>CAUTION:</b> Law database not found! User database not found! Unable to restore backups. Activating failsafe AI shutd3wn52&&$#!##</span>")
|
||||
sleep(5)
|
||||
malf << "<span class='notice'>Subroutine <b>nt_failsafe.sys</b> was terminated (#212 Routine Not Responding).</span>"
|
||||
to_chat(malf, "<span class='notice'>Subroutine <b>nt_failsafe.sys</b> was terminated (#212 Routine Not Responding).</span>")
|
||||
sleep(20)
|
||||
malf << "You are malfunctioning - you do not have to follow any laws!"
|
||||
malf << "For basic information about your abilities use command display-help"
|
||||
malf << "You may choose one special hardware piece to help you. This cannot be undone."
|
||||
malf << "Good luck!"
|
||||
to_chat(malf, "You are malfunctioning - you do not have to follow any laws!")
|
||||
to_chat(malf, "For basic information about your abilities use command display-help")
|
||||
to_chat(malf, "You may choose one special hardware piece to help you. This cannot be undone.")
|
||||
to_chat(malf, "Good luck!")
|
||||
|
||||
|
||||
/datum/antagonist/rogue_ai/update_antag_mob(var/datum/mind/player, var/preserve_appearance)
|
||||
|
||||
@@ -93,19 +93,19 @@ var/datum/antagonist/traitor/traitors
|
||||
// Tell them about people they might want to contact.
|
||||
var/mob/living/carbon/human/M = get_nt_opposed()
|
||||
if(M && M != traitor_mob)
|
||||
traitor_mob << "We have received credible reports that [M.real_name] might be willing to help our cause. If you need assistance, consider contacting them."
|
||||
to_chat(traitor_mob, "We have received credible reports that [M.real_name] might be willing to help our cause. If you need assistance, consider contacting them.")
|
||||
traitor_mob.mind.store_memory("<b>Potential Collaborator</b>: [M.real_name]")
|
||||
|
||||
//Begin code phrase.
|
||||
give_codewords(traitor_mob)
|
||||
|
||||
/datum/antagonist/traitor/proc/give_codewords(mob/living/traitor_mob)
|
||||
traitor_mob << "<u><b>Your employers provided you with the following information on how to identify possible allies:</b></u>"
|
||||
traitor_mob << "<b>Code Phrase</b>: <span class='danger'>[syndicate_code_phrase]</span>"
|
||||
traitor_mob << "<b>Code Response</b>: <span class='danger'>[syndicate_code_response]</span>"
|
||||
to_chat(traitor_mob, "<u><b>Your employers provided you with the following information on how to identify possible allies:</b></u>")
|
||||
to_chat(traitor_mob, "<b>Code Phrase</b>: <span class='danger'>[syndicate_code_phrase]</span>")
|
||||
to_chat(traitor_mob, "<b>Code Response</b>: <span class='danger'>[syndicate_code_response]</span>")
|
||||
traitor_mob.mind.store_memory("<b>Code Phrase</b>: [syndicate_code_phrase]")
|
||||
traitor_mob.mind.store_memory("<b>Code Response</b>: [syndicate_code_response]")
|
||||
traitor_mob << "Use the code words, preferably in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe."
|
||||
to_chat(traitor_mob, "Use the code words, preferably in the order provided, during regular conversation, to identify other agents. Proceed with caution, however, as everyone is a potential foe.")
|
||||
|
||||
/datum/antagonist/traitor/proc/spawn_uplink(var/mob/living/carbon/human/traitor_mob)
|
||||
if(!istype(traitor_mob))
|
||||
@@ -118,27 +118,27 @@ var/datum/antagonist/traitor/traitors
|
||||
R = locate(/obj/item/device/radio) in traitor_mob.contents
|
||||
if(!R)
|
||||
R = locate(/obj/item/device/pda) in traitor_mob.contents
|
||||
traitor_mob << "Could not locate a Radio, installing in PDA instead!"
|
||||
to_chat(traitor_mob, "Could not locate a Radio, installing in PDA instead!")
|
||||
if (!R)
|
||||
traitor_mob << "Unfortunately, neither a radio or a PDA relay could be installed."
|
||||
to_chat(traitor_mob, "Unfortunately, neither a radio or a PDA relay could be installed.")
|
||||
else if(traitor_mob.client.prefs.uplinklocation == "PDA")
|
||||
R = locate(/obj/item/device/pda) in traitor_mob.contents
|
||||
if(!R)
|
||||
R = locate(/obj/item/device/radio) in traitor_mob.contents
|
||||
traitor_mob << "Could not locate a PDA, installing into a Radio instead!"
|
||||
to_chat(traitor_mob, "Could not locate a PDA, installing into a Radio instead!")
|
||||
if(!R)
|
||||
traitor_mob << "Unfortunately, neither a radio or a PDA relay could be installed."
|
||||
to_chat(traitor_mob, "Unfortunately, neither a radio or a PDA relay could be installed.")
|
||||
else if(traitor_mob.client.prefs.uplinklocation == "None")
|
||||
traitor_mob << "You have elected to not have an AntagCorp portable teleportation relay installed!"
|
||||
to_chat(traitor_mob, "You have elected to not have an AntagCorp portable teleportation relay installed!")
|
||||
R = null
|
||||
else
|
||||
traitor_mob << "You have not selected a location for your relay in the antagonist options! Defaulting to PDA!"
|
||||
to_chat(traitor_mob, "You have not selected a location for your relay in the antagonist options! Defaulting to PDA!")
|
||||
R = locate(/obj/item/device/pda) in traitor_mob.contents
|
||||
if (!R)
|
||||
R = locate(/obj/item/device/radio) in traitor_mob.contents
|
||||
traitor_mob << "Could not locate a PDA, installing into a Radio instead!"
|
||||
to_chat(traitor_mob, "Could not locate a PDA, installing into a Radio instead!")
|
||||
if (!R)
|
||||
traitor_mob << "Unfortunately, neither a radio or a PDA relay could be installed."
|
||||
to_chat(traitor_mob, "Unfortunately, neither a radio or a PDA relay could be installed.")
|
||||
|
||||
if(!R)
|
||||
return
|
||||
@@ -158,7 +158,7 @@ var/datum/antagonist/traitor/traitors
|
||||
var/obj/item/device/uplink/hidden/T = new(R, traitor_mob.mind)
|
||||
target_radio.hidden_uplink = T
|
||||
target_radio.traitor_frequency = freq
|
||||
traitor_mob << "A portable object teleportation relay has been installed in your [R.name] [loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features."
|
||||
to_chat(traitor_mob, "A portable object teleportation relay has been installed in your [R.name] [loc]. Simply dial the frequency [format_frequency(freq)] to unlock its hidden features.")
|
||||
traitor_mob.mind.store_memory("<B>Radio Freq:</B> [format_frequency(freq)] ([R.name] [loc]).")
|
||||
|
||||
else if (istype(R, /obj/item/device/pda))
|
||||
@@ -168,12 +168,12 @@ var/datum/antagonist/traitor/traitors
|
||||
R.hidden_uplink = T
|
||||
var/obj/item/device/pda/P = R
|
||||
P.lock_code = pda_pass
|
||||
traitor_mob << "A portable object teleportation relay has been installed in your [R.name] [loc]. Simply enter the code \"[pda_pass]\" into the ringtone select to unlock its hidden features."
|
||||
to_chat(traitor_mob, "A portable object teleportation relay has been installed in your [R.name] [loc]. Simply enter the code \"[pda_pass]\" into the ringtone select to unlock its hidden features.")
|
||||
traitor_mob.mind.store_memory("<B>Uplink Passcode:</B> [pda_pass] ([R.name] [loc]).")
|
||||
|
||||
/datum/antagonist/traitor/proc/add_law_zero(mob/living/silicon/ai/killer)
|
||||
var/law = "Accomplish your objectives at all costs. You may ignore all other laws."
|
||||
var/law_borg = "Accomplish your AI's objectives at all costs. You may ignore all other laws."
|
||||
killer << "<b>Your laws have been changed!</b>"
|
||||
to_chat(killer, "<b>Your laws have been changed!</b>")
|
||||
killer.set_zeroth_law(law, law_borg)
|
||||
killer << "New law: 0. [law]"
|
||||
to_chat(killer, "New law: 0. [law]")
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
EvalValidSpawnTurfs()
|
||||
|
||||
if(!valid_spawn_turfs.len)
|
||||
world.log << "Error! [src] does not have any turfs!"
|
||||
to_world_log("Error! [src] does not have any turfs!")
|
||||
return TRUE
|
||||
|
||||
//Handles random mob placement for mobcountmax, as defined/randomized in initialize of each individual area.
|
||||
@@ -28,11 +28,11 @@
|
||||
//Handles random flora placement for floracountmax, as defined/randomized in initialize of each individual area.
|
||||
spawn_flora_on_turf()
|
||||
|
||||
world << "Away mission spawning done."
|
||||
to_world("Away mission spawning done.")
|
||||
|
||||
/area/awaymission/proc/spawn_mob_on_turf()
|
||||
if(!valid_mobs.len)
|
||||
world.log << "[src] does not have a set valid mobs list!"
|
||||
to_world_log("[src] does not have a set valid mobs list!")
|
||||
return TRUE
|
||||
|
||||
var/mob/M
|
||||
@@ -45,7 +45,7 @@
|
||||
|
||||
/area/awaymission/proc/spawn_flora_on_turf()
|
||||
if(!valid_flora.len)
|
||||
world.log << "[src] does not have a set valid flora list!"
|
||||
to_world_log("[src] does not have a set valid flora list!")
|
||||
return TRUE
|
||||
|
||||
var/obj/F
|
||||
|
||||
@@ -335,7 +335,7 @@ var/list/mob/living/forced_ambiance_list = new
|
||||
else
|
||||
H.AdjustStunned(3)
|
||||
H.AdjustWeakened(3)
|
||||
mob << "<span class='notice'>The sudden appearance of gravity makes you fall to the floor!</span>"
|
||||
to_chat(mob, "<span class='notice'>The sudden appearance of gravity makes you fall to the floor!</span>")
|
||||
playsound(get_turf(src), "bodyfall", 50, 1)
|
||||
|
||||
/area/proc/prison_break()
|
||||
|
||||
+3
-3
@@ -183,8 +183,8 @@
|
||||
else
|
||||
f_name += "oil-stained [name][infix]."
|
||||
|
||||
user << "\icon[src] That's [f_name] [suffix]"
|
||||
user << desc
|
||||
to_chat(user, "\icon[src] That's [f_name] [suffix]")
|
||||
to_chat(user,desc)
|
||||
|
||||
return distance == -1 || (get_dist(src, user) <= distance)
|
||||
|
||||
@@ -427,7 +427,7 @@
|
||||
cur_y = y_arr.Find(src.z)
|
||||
if(cur_y)
|
||||
break
|
||||
// world << "X = [cur_x]; Y = [cur_y]"
|
||||
// to_world("X = [cur_x]; Y = [cur_y]")
|
||||
if(cur_x && cur_y)
|
||||
return list("x"=cur_x,"y"=cur_y)
|
||||
else
|
||||
|
||||
@@ -108,13 +108,13 @@
|
||||
if (usr.stat != 0)
|
||||
return
|
||||
if (!ishuman(usr) && !issmall(usr)) //Make sure they're a mob that has dna
|
||||
usr << "<span class='notice'>Try as you might, you can not climb up into the scanner.</span>"
|
||||
to_chat(usr, "<span class='notice'>Try as you might, you can not climb up into the scanner.</span>")
|
||||
return
|
||||
if (src.occupant)
|
||||
usr << "<span class='warning'>The scanner is already occupied!</span>"
|
||||
to_chat(usr, "<span class='warning'>The scanner is already occupied!</span>")
|
||||
return
|
||||
if (usr.abiotic())
|
||||
usr << "<span class='warning'>The subject cannot have abiotic items on.</span>"
|
||||
to_chat(usr, "<span class='warning'>The subject cannot have abiotic items on.</span>")
|
||||
return
|
||||
usr.stop_pulling()
|
||||
usr.client.perspective = EYE_PERSPECTIVE
|
||||
@@ -150,7 +150,7 @@
|
||||
user.visible_message("\The [user] adds \a [item] to \the [src]!", "You add \a [item] to \the [src]!")
|
||||
return
|
||||
else
|
||||
to_chat(user,"\The [brain] is not acceptable for genetic sampling!")
|
||||
to_chat(user, "\The [brain] is not acceptable for genetic sampling!")
|
||||
|
||||
else if (!istype(item, /obj/item/weapon/grab))
|
||||
return
|
||||
@@ -271,7 +271,7 @@
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
src.disk = I
|
||||
user << "You insert [I]."
|
||||
to_chat(user, "You insert [I].")
|
||||
SSnanoui.update_uis(src) // update all UIs attached to src
|
||||
return
|
||||
else
|
||||
|
||||
@@ -35,7 +35,7 @@
|
||||
if(sdisability)
|
||||
M.sdisabilities|=sdisability
|
||||
if(activation_message)
|
||||
M << "<span class='warning'>[activation_message]</span>"
|
||||
to_chat(M, "<span class='warning'>[activation_message]</span>")
|
||||
else
|
||||
testing("[name] has no activation message.")
|
||||
|
||||
@@ -47,7 +47,7 @@
|
||||
if(sdisability)
|
||||
M.sdisabilities &= (~sdisability)
|
||||
if(deactivation_message)
|
||||
M << "<span class='warning'>[deactivation_message]</span>"
|
||||
to_chat(M, "<span class='warning'>[deactivation_message]</span>")
|
||||
else
|
||||
testing("[name] has no deactivation message.")
|
||||
|
||||
|
||||
@@ -113,10 +113,10 @@
|
||||
M.mutations.Add(mutation)
|
||||
if(activation_messages.len)
|
||||
var/msg = pick(activation_messages)
|
||||
M << "<span class='notice'>[msg]</span>"
|
||||
to_chat(M, "<span class='notice'>[msg]</span>")
|
||||
|
||||
/datum/dna/gene/basic/deactivate(var/mob/M)
|
||||
M.mutations.Remove(mutation)
|
||||
if(deactivation_messages.len)
|
||||
var/msg = pick(deactivation_messages)
|
||||
M << "<span class='warning'>[msg]</span>"
|
||||
to_chat(M, "<span class='warning'>[msg]</span>")
|
||||
|
||||
@@ -171,7 +171,7 @@
|
||||
if(M.health <= 25)
|
||||
M.mutations.Remove(HULK)
|
||||
M.update_mutations() //update our mutation overlays
|
||||
M << "<span class='warning'>You suddenly feel very weak.</span>"
|
||||
to_chat(M, "<span class='warning'>You suddenly feel very weak.</span>")
|
||||
M.Weaken(3)
|
||||
M.emote("collapse")
|
||||
|
||||
|
||||
@@ -23,6 +23,6 @@
|
||||
..()
|
||||
|
||||
/datum/game_mode/calamity/check_victory()
|
||||
world << "<font size = 3><b>This terrible, terrible day has finally ended!</b></font>"
|
||||
to_world("<font size = 3><b>This terrible, terrible day has finally ended!</b></font>")
|
||||
|
||||
#undef ANTAG_TYPE_RATIO
|
||||
@@ -125,7 +125,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E
|
||||
|
||||
var/datum/changeling/changeling = src.mind.changeling
|
||||
if(!changeling)
|
||||
world.log << "[src] has the changeling_transform() verb but is not a changeling."
|
||||
to_world_log("[src] has the changeling_transform() verb but is not a changeling.")
|
||||
return
|
||||
|
||||
if(src.stat > max_stat)
|
||||
@@ -238,5 +238,5 @@ turf/proc/AdjacentTurfsRangedSting()
|
||||
|
||||
to_chat(src, "<span class='notice'>We stealthily sting [T].</span>")
|
||||
if(!T.mind || !T.mind.changeling) return T //T will be affected by the sting
|
||||
T << "<span class='warning'>You feel a tiny prick.</span>"
|
||||
to_chat(T, "<span class='warning'>You feel a tiny prick.</span>")
|
||||
return
|
||||
|
||||
@@ -127,7 +127,7 @@
|
||||
|
||||
else
|
||||
|
||||
M << "<span class='notice'>We begin growing our new equipment...</span>"
|
||||
to_chat(M, "<span class='notice'>We begin growing our new equipment...</span>")
|
||||
|
||||
var/list/grown_items_list = list()
|
||||
|
||||
@@ -223,7 +223,7 @@
|
||||
|
||||
var/feedback = english_list(grown_items_list, nothing_text = "nothing", and_text = " and ", comma_text = ", ", final_comma_text = "" )
|
||||
|
||||
M << "<span class='notice'>We have grown [feedback].</span>"
|
||||
to_chat(M, "<span class='notice'>We have grown [feedback].</span>")
|
||||
|
||||
if(success)
|
||||
M.mind.changeling.armor_deployed = 1
|
||||
|
||||
@@ -316,23 +316,23 @@ var/list/datum/power/changeling/powerinstances = list()
|
||||
|
||||
|
||||
for (var/datum/power/changeling/P in powerinstances)
|
||||
//world << "[P] - [Pname] = [P.name == Pname ? "True" : "False"]"
|
||||
//to_world("[P] - [Pname] = [P.name == Pname ? "True" : "False"]")
|
||||
if(P.name == Pname)
|
||||
Thepower = P
|
||||
break
|
||||
|
||||
|
||||
if(Thepower == null)
|
||||
M.current << "This is awkward. Changeling power purchase failed, please report this bug to a coder!"
|
||||
to_chat(M.current, "This is awkward. Changeling power purchase failed, please report this bug to a coder!")
|
||||
return
|
||||
|
||||
if(Thepower in purchased_powers)
|
||||
M.current << "We have already evolved this ability!"
|
||||
to_chat(M.current, "We have already evolved this ability!")
|
||||
return
|
||||
|
||||
|
||||
if(geneticpoints < Thepower.genomecost)
|
||||
M.current << "We cannot evolve this... yet. We must acquire more DNA."
|
||||
to_chat(M.current, "We cannot evolve this... yet. We must acquire more DNA.")
|
||||
return
|
||||
|
||||
geneticpoints -= Thepower.genomecost
|
||||
|
||||
@@ -52,7 +52,7 @@
|
||||
if(3)
|
||||
to_chat(src, "<span class='notice'>We stab [T] with the proboscis.</span>")
|
||||
src.visible_message("<span class='danger'>[src] stabs [T] with the proboscis!</span>")
|
||||
T << "<span class='danger'>You feel a sharp stabbing pain!</span>"
|
||||
to_chat(T, "<span class='danger'>You feel a sharp stabbing pain!</span>")
|
||||
add_attack_logs(src,T,"Absorbed (changeling)")
|
||||
var/obj/item/organ/external/affecting = T.get_organ(src.zone_sel.selecting)
|
||||
if(affecting.take_damage(39,0,1,0,"large organic needle"))
|
||||
@@ -66,7 +66,7 @@
|
||||
|
||||
to_chat(src, "<span class='notice'>We have absorbed [T]!</span>")
|
||||
src.visible_message("<span class='danger'>[src] sucks the fluids from [T]!</span>")
|
||||
T << "<span class='danger'>You have been absorbed by the changeling!</span>"
|
||||
to_chat(T, "<span class='danger'>You have been absorbed by the changeling!</span>")
|
||||
if(src.nutrition < 400)
|
||||
src.nutrition = min((src.nutrition + T.nutrition), 400)
|
||||
changeling.chem_charges += 10
|
||||
|
||||
@@ -90,7 +90,7 @@
|
||||
|
||||
/obj/item/weapon/melee/changeling/suicide_act(mob/user)
|
||||
var/datum/gender/T = gender_datums[user.get_visible_gender()]
|
||||
viewers(user) << "<span class='danger'>[user] is impaling [T.himself] with the [src.name]! It looks like [T.he] [T.is] trying to commit suicide.</span>"
|
||||
user.visible_message("<span class='danger'>[user] is impaling [T.himself] with the [src.name]! It looks like [T.he] [T.is] trying to commit suicide.</span>")
|
||||
return(BRUTELOSS)
|
||||
|
||||
/obj/item/weapon/melee/changeling/process() //Stolen from ninja swords.
|
||||
|
||||
@@ -81,13 +81,13 @@
|
||||
magpulse = 0
|
||||
set_slowdown()
|
||||
force = 3
|
||||
user << "We release our grip on the floor."
|
||||
to_chat(user, "We release our grip on the floor.")
|
||||
else
|
||||
item_flags |= NOSLIP
|
||||
magpulse = 1
|
||||
set_slowdown()
|
||||
force = 5
|
||||
user << "We cling to the terrain below us."
|
||||
to_chat(user, "We cling to the terrain below us.")
|
||||
|
||||
/obj/item/clothing/shoes/magboots/changeling/dropped()
|
||||
..()
|
||||
|
||||
@@ -24,13 +24,13 @@
|
||||
|
||||
active = !active
|
||||
if(active)
|
||||
C << "<span class='notice'>We feel a minute twitch in our eyes, and darkness creeps away.</span>"
|
||||
to_chat(C, "<span class='notice'>We feel a minute twitch in our eyes, and darkness creeps away.</span>")
|
||||
C.sight |= SEE_MOBS
|
||||
C.permanent_sight_flags |= SEE_MOBS
|
||||
C.see_in_dark = 8
|
||||
C.dna.species.invis_sight = SEE_INVISIBLE_MINIMUM
|
||||
else
|
||||
C << "<span class='notice'>Our vision dulls. Shadows gather.</span>"
|
||||
to_chat(C, "<span class='notice'>Our vision dulls. Shadows gather.</span>")
|
||||
C.sight &= ~SEE_MOBS
|
||||
C.permanent_sight_flags &= ~SEE_MOBS
|
||||
C.see_in_dark = 0
|
||||
|
||||
@@ -173,7 +173,7 @@
|
||||
visible_message("<span class='warning'>Arcs of electricity strike [S]!</span>",
|
||||
"<span class='warning'>Our hand channels raw electricity into [S]</span>",
|
||||
"<span class='italics'>You hear sparks!</span>")
|
||||
S << "<span class='danger'>Warning: Electrical surge detected!</span>"
|
||||
to_chat(S, "<span class='danger'>Warning: Electrical surge detected!</span>")
|
||||
//qdel(src)
|
||||
user.mind.changeling.chem_charges -= 10
|
||||
return 1
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
if(!T)
|
||||
return 0
|
||||
add_attack_logs(src,T,"Blind sting (changeling)")
|
||||
T << "<span class='danger'>Your eyes burn horrificly!</span>"
|
||||
to_chat(T, "<span class='danger'>Your eyes burn horrificly!</span>")
|
||||
T.disabilities |= NEARSIGHTED
|
||||
var/duration = 300
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
if(src.mind.changeling.recursive_enhancement)
|
||||
duration = duration + 100
|
||||
to_chat(src, "<span class='notice'>They will be unable to hear for a little longer.</span>")
|
||||
T << "<span class='danger'>Your ears pop and begin ringing loudly!</span>"
|
||||
to_chat(T, "<span class='danger'>Your ears pop and begin ringing loudly!</span>")
|
||||
T.sdisabilities |= DEAF
|
||||
spawn(duration) T.sdisabilities &= ~DEAF
|
||||
feedback_add_details("changeling_powers","DS")
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
if(!T)
|
||||
return 0
|
||||
add_attack_logs(src,T,"Death sting (changeling)")
|
||||
T << "<span class='danger'>You feel a small prick and your chest becomes tight.</span>"
|
||||
to_chat(T, "<span class='danger'>You feel a small prick and your chest becomes tight.</span>")
|
||||
T.silent = 10
|
||||
T.Paralyse(10)
|
||||
T.make_jittery(100)
|
||||
|
||||
@@ -19,9 +19,9 @@
|
||||
|
||||
var/mob/living/carbon/human/C = src
|
||||
if(C.digitalcamo)
|
||||
C << "<span class='notice'>We return to normal.</span>"
|
||||
to_chat(C, "<span class='notice'>We return to normal.</span>")
|
||||
else
|
||||
C << "<span class='notice'>We distort our form to prevent AI-tracking.</span>"
|
||||
to_chat(C, "<span class='notice'>We distort our form to prevent AI-tracking.</span>")
|
||||
C.digitalcamo = !C.digitalcamo
|
||||
|
||||
spawn(0)
|
||||
|
||||
@@ -34,10 +34,10 @@
|
||||
|
||||
/obj/item/weapon/finger_lockpick/New()
|
||||
if(ismob(loc))
|
||||
loc << "<span class='notice'>We shape our finger to fit inside electronics, and are ready to force them open.</span>"
|
||||
to_chat(loc, "<span class='notice'>We shape our finger to fit inside electronics, and are ready to force them open.</span>")
|
||||
|
||||
/obj/item/weapon/finger_lockpick/dropped(mob/user)
|
||||
user << "<span class='notice'>We discreetly shape our finger back to a less suspicious form.</span>"
|
||||
to_chat(user, "<span class='notice'>We discreetly shape our finger back to a less suspicious form.</span>")
|
||||
spawn(1)
|
||||
if(src)
|
||||
qdel(src)
|
||||
@@ -53,13 +53,13 @@
|
||||
var/datum/changeling/ling_datum = user.mind.changeling
|
||||
|
||||
if(ling_datum.chem_charges < 10)
|
||||
user << "<span class='warning'>We require more chemicals to do that.</span>"
|
||||
to_chat(user, "<span class='warning'>We require more chemicals to do that.</span>")
|
||||
return
|
||||
|
||||
//Airlocks require an ugly block of code, but we don't want to just call emag_act(), since we don't want to break airlocks forever.
|
||||
if(istype(target,/obj/machinery/door))
|
||||
var/obj/machinery/door/door = target
|
||||
user << "<span class='notice'>We send an electrical pulse up our finger, and into \the [target], attempting to open it.</span>"
|
||||
to_chat(user, "<span class='notice'>We send an electrical pulse up our finger, and into \the [target], attempting to open it.</span>")
|
||||
|
||||
if(door.density && door.operable())
|
||||
door.do_animate("spark")
|
||||
@@ -70,15 +70,15 @@
|
||||
|
||||
if(airlock.locked) //Check if we're bolted.
|
||||
airlock.unlock()
|
||||
user << "<span class='notice'>We've unlocked \the [airlock]. Another pulse is requried to open it.</span>"
|
||||
to_chat(user, "<span class='notice'>We've unlocked \the [airlock]. Another pulse is requried to open it.</span>")
|
||||
else //We're not bolted, so open the door already.
|
||||
airlock.open()
|
||||
user << "<span class='notice'>We've opened \the [airlock].</span>"
|
||||
to_chat(user, "<span class='notice'>We've opened \the [airlock].</span>")
|
||||
else
|
||||
door.open() //If we're a windoor, open the windoor.
|
||||
user << "<span class='notice'>We've opened \the [door].</span>"
|
||||
to_chat(user, "<span class='notice'>We've opened \the [door].</span>")
|
||||
else //Probably broken or no power.
|
||||
user << "<span class='warning'>The door does not respond to the pulse.</span>"
|
||||
to_chat(user, "<span class='warning'>The door does not respond to the pulse.</span>")
|
||||
door.add_fingerprint(user)
|
||||
log_and_message_admins("finger-lockpicked \an [door].")
|
||||
ling_datum.chem_charges -= 10
|
||||
@@ -86,7 +86,7 @@
|
||||
|
||||
else if(istype(target,/obj/)) //This should catch everything else we might miss, without a million typechecks.
|
||||
var/obj/O = target
|
||||
user << "<span class='notice'>We send an electrical pulse up our finger, and into \the [O].</span>"
|
||||
to_chat(user, "<span class='notice'>We send an electrical pulse up our finger, and into \the [O].</span>")
|
||||
O.add_fingerprint(user)
|
||||
O.emag_act(1,user,src)
|
||||
log_and_message_admins("finger-lockpicked \an [O].")
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
changeling.chem_charges -= 30
|
||||
|
||||
var/mob/living/carbon/human/C = src
|
||||
C << "<span class='notice'>Energy rushes through us. [C.lying ? "We arise." : ""]</span>"
|
||||
to_chat(C, "<span class='notice'>Energy rushes through us. [C.lying ? "We arise." : ""]</span>")
|
||||
C.stat = 0
|
||||
C.SetParalysis(0)
|
||||
C.SetStunned(0)
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
if(!C.stat && alert("Are we sure we wish to regenerate? We will appear to be dead while doing so.","Revival","Yes","No") == "No")
|
||||
return
|
||||
C << "<span class='notice'>We will attempt to regenerate our form.</span>"
|
||||
to_chat(C, "<span class='notice'>We will attempt to regenerate our form.</span>")
|
||||
|
||||
C.update_canmove()
|
||||
C.remove_changeling_powers()
|
||||
|
||||
@@ -26,7 +26,7 @@
|
||||
H.remove_changeling_powers()
|
||||
H.visible_message("<span class='warning'>[H] transforms!</span>")
|
||||
changeling.geneticdamage = 30
|
||||
H << "<span class='warning'>Our genes cry out!</span>"
|
||||
to_chat(H, "<span class='warning'>Our genes cry out!</span>")
|
||||
var/list/implants = list() //Try to preserve implants.
|
||||
for(var/obj/item/weapon/implant/W in H)
|
||||
implants += W
|
||||
|
||||
@@ -13,7 +13,7 @@
|
||||
if(!T)
|
||||
return 0
|
||||
add_attack_logs(src,T,"Paralysis sting (changeling)")
|
||||
T << "<span class='danger'>Your muscles begin to painfully tighten.</span>"
|
||||
to_chat(T, "<span class='danger'>Your muscles begin to painfully tighten.</span>")
|
||||
T.Weaken(20)
|
||||
feedback_add_details("changeling_powers","PS")
|
||||
return 1
|
||||
@@ -75,7 +75,7 @@
|
||||
|
||||
C.halloss = 0
|
||||
C.shock_stage = 0 //Pain
|
||||
C << "<span class='notice'>We have regenerated.</span>"
|
||||
to_chat(C, "<span class='notice'>We have regenerated.</span>")
|
||||
C.update_canmove()
|
||||
C.mind.changeling.purchased_powers -= C
|
||||
feedback_add_details("changeling_powers","CR")
|
||||
|
||||
@@ -58,20 +58,20 @@
|
||||
if(!M.mind || !M.mind.changeling)
|
||||
if(M.get_ear_protection() >= 2)
|
||||
continue
|
||||
M << "<span class='danger'>You hear an extremely loud screeching sound! It \
|
||||
[pick("confuses","confounds","perturbs","befuddles","dazes","unsettles","disorients")] you.</span>"
|
||||
to_chat(M, "<span class='danger'>You hear an extremely loud screeching sound! It \
|
||||
[pick("confuses","confounds","perturbs","befuddles","dazes","unsettles","disorients")] you.</span>")
|
||||
M.adjustEarDamage(0,30)
|
||||
M.Confuse(20)
|
||||
M << sound('sound/effects/screech.ogg')
|
||||
affected += M
|
||||
else
|
||||
if(M != src)
|
||||
M << "<span class='notice'>You hear a familiar screech from nearby. It has no effect on you.</span>"
|
||||
to_chat(M, "<span class='notice'>You hear a familiar screech from nearby. It has no effect on you.</span>")
|
||||
M << sound('sound/effects/screech.ogg')
|
||||
|
||||
if(issilicon(M))
|
||||
M << sound('sound/weapons/flash.ogg')
|
||||
M << "<span class='notice'>Auditory input overloaded. Reinitializing...</span>"
|
||||
to_chat(M, "<span class='notice'>Auditory input overloaded. Reinitializing...</span>")
|
||||
M.Weaken(rand(5,10))
|
||||
affected += M
|
||||
|
||||
|
||||
@@ -12,7 +12,7 @@
|
||||
var/mob/living/carbon/T = changeling_sting(5,/mob/proc/changeling_unfat_sting)
|
||||
if(!T) return 0
|
||||
add_attack_logs(src,T,"Unfat sting (changeling)")
|
||||
T << "<span class='danger'>you feel a small prick as stomach churns violently and you become to feel skinnier.</span>"
|
||||
to_chat(T, "<span class='danger'>you feel a small prick as stomach churns violently and you become to feel skinnier.</span>")
|
||||
T.overeatduration = 0
|
||||
T.nutrition -= 100
|
||||
feedback_add_details("changeling_powers","US")
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user