# 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:
Repede
2020-02-22 12:38:04 -05:00
905 changed files with 89234 additions and 7194 deletions
+1 -1
View File
@@ -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)
+86 -9
View File
@@ -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.")
+1 -1
View File
@@ -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
View File
@@ -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.")
+5 -5
View File
@@ -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
View File
@@ -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
View File
@@ -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
+2 -2
View File
@@ -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
View File
@@ -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])")
+2 -2
View File
@@ -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
View File
@@ -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&nbsp;"
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]&nbsp;"
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)
+3 -3
View File
@@ -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)
+1 -1
View File
@@ -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")
+1 -1
View File
@@ -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"
+7 -7
View File
@@ -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)
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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
View File
@@ -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)
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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)
+7 -7
View File
@@ -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))
+1 -4
View File
@@ -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)
+2 -2
View File
@@ -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
+1 -1
View File
@@ -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)
+4 -1
View File
@@ -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"
+5 -1
View File
@@ -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
+3
View File
@@ -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
+28 -2
View File
@@ -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--
+7 -7
View File
@@ -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
+2 -2
View File
@@ -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 *
+4 -4
View File
@@ -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
+1 -1
View File
@@ -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)
+4
View File
@@ -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
+2 -2
View File
@@ -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
+5 -5
View File
@@ -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")
+1 -1
View File
@@ -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()
+9 -2
View File
@@ -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>")
+6 -6
View File
@@ -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
View File
@@ -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))
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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))
+2 -1
View File
@@ -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
+21 -3
View File
@@ -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
+9 -9
View File
@@ -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()
+2 -2
View File
@@ -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
+3 -3
View File
@@ -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>")
+1 -1
View File
@@ -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()
+2 -2
View File
@@ -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
+2 -2
View File
@@ -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.")
+1 -1
View File
@@ -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)
+5 -5
View File
@@ -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
+5 -5
View File
@@ -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()
+1 -1
View File
@@ -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()
+4 -4
View File
@@ -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()
+1 -1
View File
@@ -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)
+2 -2
View File
@@ -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)
+2 -2
View File
@@ -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.
+2 -2
View File
@@ -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)
+2 -2
View File
@@ -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)
+1 -1
View File
@@ -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()
+3 -3
View File
@@ -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)
+2 -2
View File
@@ -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]")
+1 -1
View File
@@ -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
+11 -11
View File
@@ -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)
+17 -17
View File
@@ -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]")
+4 -4
View File
@@ -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
+1 -1
View File
@@ -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
View File
@@ -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
+5 -5
View File
@@ -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
+2 -2
View File
@@ -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.")
+2 -2
View File
@@ -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>")
+1 -1
View File
@@ -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")
+1 -1
View File
@@ -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