mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-07-12 16:44:43 +01:00
Merge branch 'master' of https://github.com/tgstation/-tg-station into dragnet
Conflicts: icons/effects/effects.dmi icons/obj/items.dmi
This commit is contained in:
@@ -5,7 +5,7 @@
|
||||
/obj/machinery/atmospherics/binary/circulator
|
||||
name = "circulator/heat exchanger"
|
||||
desc = "A gas circulator pump and heat exchanger."
|
||||
icon = 'icons/obj/pipes.dmi'
|
||||
icon = 'icons/obj/atmospherics/pipes/simple.dmi'
|
||||
icon_state = "circ1-off"
|
||||
|
||||
var/side = 1 // 1=left 2=right
|
||||
|
||||
@@ -92,24 +92,18 @@ Passive gate is similar to the regular pump except:
|
||||
|
||||
return 1
|
||||
|
||||
/obj/machinery/atmospherics/binary/passive_gate/ui_interact(mob/user, ui_key = "main")
|
||||
/obj/machinery/atmospherics/binary/passive_gate/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
|
||||
var/data = list()
|
||||
ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "atmos_gas_pump.tmpl", name, 400, 120, 0)
|
||||
|
||||
/obj/machinery/atmospherics/binary/passive_gate/get_ui_data()
|
||||
var/data = list()
|
||||
data["on"] = on
|
||||
data["pressure_set"] = round(target_pressure*100) //Nano UI can't handle rounded non-integers, apparently.
|
||||
data["max_pressure"] = MAX_OUTPUT_PRESSURE
|
||||
|
||||
var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key)
|
||||
if (!ui)
|
||||
ui = new /datum/nanoui(user, src, ui_key, "atmos_gas_pump.tmpl", name, 400, 120)
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui.set_auto_update(1)
|
||||
else
|
||||
ui.push_data(data)
|
||||
return data
|
||||
|
||||
/obj/machinery/atmospherics/binary/passive_gate/atmosinit()
|
||||
..()
|
||||
|
||||
@@ -97,24 +97,18 @@ Thus, the two variables affect pump operation are set in New():
|
||||
|
||||
return 1
|
||||
|
||||
/obj/machinery/atmospherics/binary/pump/ui_interact(mob/user, ui_key = "main")
|
||||
/obj/machinery/atmospherics/binary/pump/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
|
||||
var/data = list()
|
||||
ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "atmos_gas_pump.tmpl", name, 400, 120, 0)
|
||||
|
||||
/obj/machinery/atmospherics/binary/pump/get_ui_data()
|
||||
var/data = list()
|
||||
data["on"] = on
|
||||
data["pressure_set"] = round(target_pressure*100) //Nano UI can't handle rounded non-integers, apparently.
|
||||
data["max_pressure"] = MAX_OUTPUT_PRESSURE
|
||||
|
||||
var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key)
|
||||
if (!ui)
|
||||
ui = new /datum/nanoui(user, src, ui_key, "atmos_gas_pump.tmpl", name, 400, 120)
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui.set_auto_update(1)
|
||||
else
|
||||
ui.push_data(data)
|
||||
return data
|
||||
|
||||
/obj/machinery/atmospherics/binary/pump/atmosinit()
|
||||
..()
|
||||
|
||||
@@ -93,24 +93,18 @@ Thus, the two variables affect pump operation are set in New():
|
||||
|
||||
return 1
|
||||
|
||||
/obj/machinery/atmospherics/binary/volume_pump/ui_interact(mob/user, ui_key = "main")
|
||||
/obj/machinery/atmospherics/binary/volume_pump/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
|
||||
var/data = list()
|
||||
ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "atmos_gas_pump.tmpl", name, 400, 120, 0)
|
||||
|
||||
/obj/machinery/atmospherics/binary/volume_pump/get_ui_data()
|
||||
var/data = list()
|
||||
data["on"] = on
|
||||
data["transfer_rate"] = round(transfer_rate*100) //Nano UI can't handle rounded non-integers, apparently.
|
||||
data["max_rate"] = MAX_TRANSFER_RATE
|
||||
|
||||
var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key)
|
||||
if (!ui)
|
||||
ui = new /datum/nanoui(user, src, ui_key, "atmos_gas_pump.tmpl", name, 400, 120)
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui.set_auto_update(1)
|
||||
else
|
||||
ui.push_data(data)
|
||||
return data
|
||||
|
||||
/obj/machinery/atmospherics/binary/volume_pump/atmosinit()
|
||||
..()
|
||||
|
||||
@@ -152,25 +152,19 @@ Filter types:
|
||||
|
||||
ui_interact(user)
|
||||
|
||||
/obj/machinery/atmospherics/trinary/filter/ui_interact(mob/user, ui_key = "main")
|
||||
/obj/machinery/atmospherics/trinary/filter/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
|
||||
var/data = list()
|
||||
ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "atmos_filter.tmpl", name, 400, 320, 0)
|
||||
|
||||
/obj/machinery/atmospherics/trinary/filter/get_ui_data()
|
||||
var/data = list()
|
||||
data["on"] = on
|
||||
data["pressure_set"] = round(target_pressure*100) //Nano UI can't handle rounded non-integers, apparently.
|
||||
data["max_pressure"] = MAX_OUTPUT_PRESSURE
|
||||
data["filter_type"] = filter_type
|
||||
|
||||
var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key)
|
||||
if (!ui)
|
||||
ui = new /datum/nanoui(user, src, ui_key, "atmos_filter.tmpl", name, 400, 320)
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui.set_auto_update(1)
|
||||
else
|
||||
ui.push_data(data)
|
||||
return data
|
||||
|
||||
/obj/machinery/atmospherics/trinary/filter/Topic(href, href_list)
|
||||
if(..())
|
||||
|
||||
@@ -108,26 +108,20 @@
|
||||
|
||||
ui_interact(user)
|
||||
|
||||
/obj/machinery/atmospherics/trinary/mixer/ui_interact(mob/user, ui_key = "main")
|
||||
/obj/machinery/atmospherics/trinary/mixer/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
|
||||
var/data = list()
|
||||
ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "atmos_mixer.tmpl", name, 400, 320, 0)
|
||||
|
||||
/obj/machinery/atmospherics/trinary/mixer/get_ui_data()
|
||||
var/data = list()
|
||||
data["on"] = on
|
||||
data["pressure_set"] = round(target_pressure*100) //Nano UI can't handle rounded non-integers, apparently.
|
||||
data["max_pressure"] = MAX_OUTPUT_PRESSURE
|
||||
data["node1_concentration"] = round(node1_concentration*100)
|
||||
data["node2_concentration"] = round(node2_concentration*100)
|
||||
|
||||
var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key)
|
||||
if (!ui)
|
||||
ui = new /datum/nanoui(user, src, ui_key, "atmos_mixer.tmpl", name, 400, 320)
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui.set_auto_update(1)
|
||||
else
|
||||
ui.push_data(data)
|
||||
return data
|
||||
|
||||
/obj/machinery/atmospherics/trinary/mixer/Topic(href,href_list)
|
||||
if(..()) return
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
/obj/machinery/atmospherics/unary/cold_sink
|
||||
icon = 'icons/obj/atmospherics/cold_sink.dmi'
|
||||
icon_state = "intact_off"
|
||||
density = 1
|
||||
|
||||
icon_state = "cold_map"
|
||||
use_power = 1
|
||||
|
||||
name = "cold sink"
|
||||
@@ -12,15 +11,17 @@
|
||||
var/current_temperature = T20C
|
||||
var/current_heat_capacity = 50000 //totally random
|
||||
|
||||
/obj/machinery/atmospherics/unary/cold_sink/update_icon()
|
||||
if(node)
|
||||
icon_state = "intact_[on?("on"):("off")]"
|
||||
/obj/machinery/atmospherics/unary/cold_sink/update_icon_nopipes()
|
||||
overlays.Cut()
|
||||
if(showpipe)
|
||||
overlays += getpipeimage('icons/obj/atmospherics/unary_devices.dmi', "scrub_cap", initialize_directions) //scrub_cap works for now
|
||||
|
||||
if(!node || !on || stat & (NOPOWER|BROKEN))
|
||||
icon_state = "cold_off"
|
||||
return
|
||||
|
||||
else
|
||||
icon_state = "exposed"
|
||||
|
||||
on = 0
|
||||
|
||||
return
|
||||
icon_state = "cold_on"
|
||||
|
||||
/obj/machinery/atmospherics/unary/cold_sink/process_atmos()
|
||||
..()
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
/obj/machinery/atmospherics/unary/generator_input
|
||||
icon = 'icons/obj/atmospherics/heat_exchanger.dmi'
|
||||
icon_state = "intact"
|
||||
|
||||
icon_state = "he_intact"
|
||||
density = 1
|
||||
|
||||
name = "generator input"
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
/obj/machinery/atmospherics/unary/heat_exchanger
|
||||
|
||||
icon = 'icons/obj/atmospherics/heat_exchanger.dmi'
|
||||
icon_state = "intact"
|
||||
density = 1
|
||||
icon_state = "he_intact"
|
||||
|
||||
name = "heat exchanger"
|
||||
desc = "Exchanges heat between two input gases. Setup for fast heat transfer"
|
||||
@@ -14,9 +12,10 @@
|
||||
|
||||
/obj/machinery/atmospherics/unary/heat_exchanger/update_icon()
|
||||
if(node)
|
||||
icon_state = "intact"
|
||||
icon_state = "he_intact"
|
||||
color = node.color
|
||||
else
|
||||
icon_state = "exposed"
|
||||
icon_state = "he_exposed"
|
||||
|
||||
return
|
||||
|
||||
|
||||
@@ -1,9 +1,7 @@
|
||||
/obj/machinery/atmospherics/unary/heat_reservoir
|
||||
//currently the same code as cold_sink but anticipating process() changes
|
||||
|
||||
icon = 'icons/obj/atmospherics/cold_sink.dmi'
|
||||
icon_state = "intact_off"
|
||||
density = 1
|
||||
icon_state = "cold_map"
|
||||
use_power = 1
|
||||
|
||||
name = "heat reservoir"
|
||||
@@ -14,15 +12,17 @@
|
||||
var/current_temperature = T20C
|
||||
var/current_heat_capacity = 50000 //totally random
|
||||
|
||||
/obj/machinery/atmospherics/unary/heat_reservoir/update_icon()
|
||||
if(node)
|
||||
icon_state = "intact_[on?("on"):("off")]"
|
||||
/obj/machinery/atmospherics/unary/heat_reservoir/update_icon_nopipes()
|
||||
overlays.Cut()
|
||||
if(showpipe)
|
||||
overlays += getpipeimage('icons/obj/atmospherics/unary_devices.dmi', "scrub_cap", initialize_directions) //scrub_cap works for now
|
||||
|
||||
if(!node || !on || stat & (NOPOWER|BROKEN))
|
||||
icon_state = "cold_off"
|
||||
return
|
||||
|
||||
else
|
||||
icon_state = "exposed"
|
||||
|
||||
on = 0
|
||||
|
||||
return
|
||||
icon_state = "cold_on"
|
||||
|
||||
/obj/machinery/atmospherics/unary/heat_reservoir/process_atmos()
|
||||
..()
|
||||
|
||||
@@ -1,10 +1,9 @@
|
||||
/obj/machinery/atmospherics/unary/oxygen_generator
|
||||
icon = 'icons/obj/atmospherics/oxygen_generator.dmi'
|
||||
icon_state = "intact_off"
|
||||
density = 1
|
||||
|
||||
icon_state = "o2gen_map"
|
||||
|
||||
name = "oxygen generator"
|
||||
desc = ""
|
||||
desc = "Generates oxygen"
|
||||
|
||||
dir = SOUTH
|
||||
initialize_directions = SOUTH
|
||||
@@ -13,15 +12,18 @@
|
||||
|
||||
var/oxygen_content = 10
|
||||
|
||||
/obj/machinery/atmospherics/unary/oxygen_generator/update_icon()
|
||||
if(node)
|
||||
icon_state = "intact_[on?("on"):("off")]"
|
||||
/obj/machinery/atmospherics/unary/oxygen_generator/update_icon_nopipes()
|
||||
|
||||
overlays.Cut()
|
||||
if(showpipe)
|
||||
overlays += getpipeimage('icons/obj/atmospherics/unary_devices.dmi', "scrub_cap", initialize_directions) //it works for now
|
||||
|
||||
if(!node || !on || stat & BROKEN)
|
||||
icon_state = "o2gen_off"
|
||||
return
|
||||
|
||||
else
|
||||
icon_state = "exposed_off"
|
||||
|
||||
on = 0
|
||||
|
||||
return
|
||||
icon_state = "o2gen_on"
|
||||
|
||||
/obj/machinery/atmospherics/unary/oxygen_generator/New()
|
||||
..()
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
////////////
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/heat_exchanging
|
||||
icon = 'icons/obj/pipes/heat.dmi'
|
||||
icon = 'icons/obj/atmospherics/pipes/heat.dmi'
|
||||
icon_state = "intact"
|
||||
level = 2
|
||||
var/initialize_directions_he
|
||||
@@ -106,7 +106,7 @@
|
||||
//HE Junctions
|
||||
////////////////
|
||||
/obj/machinery/atmospherics/pipe/simple/heat_exchanging/junction
|
||||
icon = 'icons/obj/pipes/junction.dmi'
|
||||
icon = 'icons/obj/atmospherics/pipes/junction.dmi'
|
||||
icon_state = "intact"
|
||||
level = 2
|
||||
minimum_temperature_difference = 300
|
||||
|
||||
@@ -4,7 +4,7 @@
|
||||
*/
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold
|
||||
icon = 'icons/obj/atmospherics/pipe_manifold.dmi'
|
||||
icon = 'icons/obj/atmospherics/pipes/manifold.dmi'
|
||||
icon_state = "manifold"
|
||||
|
||||
name = "pipe manifold"
|
||||
@@ -100,13 +100,13 @@
|
||||
|
||||
//Add non-broken pieces
|
||||
if(node1)
|
||||
overlays += getpipeimage('icons/obj/atmospherics/pipe_manifold.dmi', "manifold_full[invis]", get_dir(src,node1))
|
||||
overlays += getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full[invis]", get_dir(src,node1))
|
||||
|
||||
if(node2)
|
||||
overlays += getpipeimage('icons/obj/atmospherics/pipe_manifold.dmi', "manifold_full[invis]", get_dir(src,node2))
|
||||
overlays += getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full[invis]", get_dir(src,node2))
|
||||
|
||||
if(node3)
|
||||
overlays += getpipeimage('icons/obj/atmospherics/pipe_manifold.dmi', "manifold_full[invis]", get_dir(src,node3))
|
||||
overlays += getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full[invis]", get_dir(src,node3))
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold/hide(var/i)
|
||||
if(level == 1 && istype(loc, /turf/simulated))
|
||||
|
||||
@@ -3,7 +3,7 @@
|
||||
4-way manifold
|
||||
*/
|
||||
/obj/machinery/atmospherics/pipe/manifold4w
|
||||
icon = 'icons/obj/atmospherics/pipe_manifold.dmi'
|
||||
icon = 'icons/obj/atmospherics/pipes/manifold.dmi'
|
||||
icon_state = "manifold4w"
|
||||
|
||||
name = "4-way pipe manifold"
|
||||
@@ -112,16 +112,16 @@
|
||||
|
||||
//Add non-broken pieces
|
||||
if(node1)
|
||||
overlays += getpipeimage('icons/obj/atmospherics/pipe_manifold.dmi', "manifold_full[invis]", NORTH)
|
||||
overlays += getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full[invis]", NORTH)
|
||||
|
||||
if(node2)
|
||||
overlays += getpipeimage('icons/obj/atmospherics/pipe_manifold.dmi', "manifold_full[invis]", SOUTH)
|
||||
overlays += getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full[invis]", SOUTH)
|
||||
|
||||
if(node3)
|
||||
overlays += getpipeimage('icons/obj/atmospherics/pipe_manifold.dmi', "manifold_full[invis]", EAST)
|
||||
overlays += getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full[invis]", EAST)
|
||||
|
||||
if(node4)
|
||||
overlays += getpipeimage('icons/obj/atmospherics/pipe_manifold.dmi', "manifold_full[invis]", WEST)
|
||||
overlays += getpipeimage('icons/obj/atmospherics/pipes/manifold.dmi', "manifold_full[invis]", WEST)
|
||||
|
||||
/obj/machinery/atmospherics/pipe/manifold4w/update_node_icon()
|
||||
..()
|
||||
|
||||
@@ -5,7 +5,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
*/
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple
|
||||
icon = 'icons/obj/pipes.dmi'
|
||||
icon = 'icons/obj/atmospherics/pipes/simple.dmi'
|
||||
icon_state = "intact"
|
||||
|
||||
name = "pipe"
|
||||
|
||||
@@ -1,5 +1,5 @@
|
||||
/obj/machinery/atmospherics/unary/tank
|
||||
icon = 'icons/obj/atmospherics/pipe_tank.dmi'
|
||||
icon = 'icons/obj/atmospherics/pipes/pressure_tank.dmi'
|
||||
icon_state = "generic"
|
||||
name = "pressure tank"
|
||||
desc = "A large vessel containing pressurized gas."
|
||||
@@ -16,7 +16,7 @@
|
||||
col = node.pipe_color
|
||||
else
|
||||
state = "pipe_exposed"
|
||||
underlays += getpipeimage('icons/obj/atmospherics/pipe_tank.dmi', state, initialize_directions, col)
|
||||
underlays += getpipeimage('icons/obj/atmospherics/pipes/pressure_tank.dmi', state, initialize_directions, col)
|
||||
|
||||
/obj/machinery/atmospherics/unary/tank/carbon_dioxide
|
||||
name = "pressure tank (Carbon Dioxide)"
|
||||
|
||||
@@ -108,6 +108,7 @@
|
||||
#define STAGE_THREE 5
|
||||
#define STAGE_FOUR 7
|
||||
#define STAGE_FIVE 9
|
||||
#define STAGE_SIX 11 //From supermatter shard
|
||||
|
||||
//zlevel defines, can be overridden for different maps in the appropriate _maps file.
|
||||
#define ZLEVEL_SPACEMAX 7
|
||||
@@ -159,4 +160,9 @@
|
||||
#define FUZZY_CHANCE_LOW 50
|
||||
#define CHANCE_TALK 15
|
||||
#define MAXCOIL 30
|
||||
#define RESIZE_DEFAULT_SIZE 1
|
||||
#define RESIZE_DEFAULT_SIZE 1
|
||||
|
||||
//transfer_ai() defines. Main proc in ai_core.dm
|
||||
#define AI_TRANS_TO_CARD 1 //Downloading AI to InteliCard.
|
||||
#define AI_TRANS_FROM_CARD 2 //Uploading AI from InteliCard
|
||||
#define AI_MECH_HACK 3 //Malfunctioning AI hijacking mecha
|
||||
@@ -1196,7 +1196,7 @@ var/list/WALLITEMS = list(
|
||||
/obj/machinery/newscaster, /obj/machinery/firealarm, /obj/structure/noticeboard, /obj/machinery/door_control,
|
||||
/obj/machinery/computer/security/telescreen, /obj/machinery/embedded_controller/radio/simple_vent_controller,
|
||||
/obj/item/weapon/storage/secure/safe, /obj/machinery/door_timer, /obj/machinery/flasher, /obj/machinery/keycard_auth,
|
||||
/obj/structure/mirror, /obj/structure/closet/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment
|
||||
/obj/structure/mirror, /obj/structure/fireaxecabinet, /obj/machinery/computer/security/telescreen/entertainment
|
||||
)
|
||||
/proc/gotwallitem(loc, dir)
|
||||
var/locdir = get_step(loc, dir)
|
||||
|
||||
@@ -7,6 +7,7 @@ var/global/list/machines = list() //NOTE: this is a list of ALL machines now
|
||||
var/global/list/navbeacons = list() //list of all bot nagivation beacons, used for patrolling.
|
||||
var/global/list/deliverybeacons = list() //list of all MULEbot delivery beacons.
|
||||
var/global/list/deliverybeacontags = list() //list of all tags associated with delivery beacons.
|
||||
var/global/list/nuke_list = list()
|
||||
|
||||
var/global/list/chemical_reactions_list //list of all /datum/chemical_reaction datums. Used during chemical reactions
|
||||
var/global/list/chemical_reagents_list //list of all /datum/reagent datums indexed by reagent id. Used by chemistry stuff
|
||||
|
||||
+6
-3
@@ -39,7 +39,10 @@
|
||||
CtrlShiftClickOn(A)
|
||||
return
|
||||
if(modifiers["middle"])
|
||||
MiddleClickOn(A)
|
||||
if(controlled_mech) //Are we piloting a mech? Placed here so the modifiers are not overridden.
|
||||
controlled_mech.click_action(A, src) //Override AI normal click behavior.
|
||||
return
|
||||
|
||||
return
|
||||
if(modifiers["shift"])
|
||||
ShiftClickOn(A)
|
||||
@@ -116,7 +119,7 @@
|
||||
return
|
||||
/atom/proc/AICtrlShiftClick()
|
||||
return
|
||||
|
||||
|
||||
/* Airlocks */
|
||||
/obj/machinery/door/airlock/AICtrlClick() // Bolts doors
|
||||
if(emagged)
|
||||
@@ -152,7 +155,7 @@
|
||||
else
|
||||
Topic("aiDisable=11", list("aiDisable"="11"), 1)
|
||||
return
|
||||
|
||||
|
||||
/* APC */
|
||||
/obj/machinery/power/apc/AICtrlClick() // turns off/on APCs.
|
||||
toggle_breaker()
|
||||
|
||||
@@ -198,7 +198,7 @@ var/datum/global_hud/global_hud = new()
|
||||
else if(isdrone(mymob))
|
||||
drone_hud(ui_style)
|
||||
|
||||
if(istype(mymob.loc,/obj/mecha))
|
||||
if(istype(mymob.loc,/obj/mecha) && ishuman(mymob))
|
||||
show_hud(HUD_STYLE_REDUCED)
|
||||
|
||||
//Version denotes which style should be displayed. blank or 0 means "next version"
|
||||
|
||||
@@ -115,8 +115,8 @@
|
||||
var/alert_desc_blue_upto = "The station has received reliable information about possible hostile activity on the station. Security staff may have weapons visible, random searches are permitted."
|
||||
var/alert_desc_blue_downto = "The immediate threat has passed. Security may no longer have weapons drawn at all times, but may continue to have them visible. Random searches are still allowed."
|
||||
var/alert_desc_red_upto = "There is an immediate serious threat to the station. Security may have weapons unholstered at all times. Random searches are allowed and advised."
|
||||
var/alert_desc_red_downto = "The self-destruct mechanism has been deactivated, there is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised."
|
||||
var/alert_desc_delta = "The station's self-destruct mechanism has been engaged. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill."
|
||||
var/alert_desc_red_downto = "The station's destruction has been averted. There is still however an immediate serious threat to the station. Security may have weapons unholstered at all times, random searches are allowed and advised."
|
||||
var/alert_desc_delta = "Destruction of the station is imminent. All crew are instructed to obey all instructions given by heads of staff. Any violations of these orders can be punished by death. This is not a drill."
|
||||
|
||||
var/health_threshold_crit = 0
|
||||
var/health_threshold_dead = -100
|
||||
@@ -489,6 +489,20 @@
|
||||
config.no_summon_events = 1
|
||||
if("reactionary_explosions")
|
||||
config.reactionary_explosions = 1
|
||||
if("bombcap")
|
||||
var/BombCap = text2num(value)
|
||||
if (!BombCap)
|
||||
continue
|
||||
if (BombCap < 4)
|
||||
BombCap = 4
|
||||
if (BombCap > 128)
|
||||
BombCap = 128
|
||||
|
||||
MAX_EX_DEVESTATION_RANGE = round(BombCap/4)
|
||||
MAX_EX_HEAVY_RANGE = round(BombCap/2)
|
||||
MAX_EX_LIGHT_RANGE = BombCap
|
||||
MAX_EX_FLASH_RANGE = BombCap
|
||||
MAX_EX_FLAME_RANGE = BombCap
|
||||
else
|
||||
diary << "Unknown setting in configuration: '[name]'"
|
||||
|
||||
|
||||
@@ -3,7 +3,7 @@ var/datum/subsystem/nano/SSnano
|
||||
/datum/subsystem/nano
|
||||
name = "NanoUI"
|
||||
can_fire = 1
|
||||
wait = 5
|
||||
wait = 10
|
||||
priority = 16
|
||||
|
||||
var/list/open_uis = list() //a list of current open /nanoui UIs, grouped by src_object and ui_key
|
||||
|
||||
@@ -208,6 +208,7 @@
|
||||
/datum/disease/transformation/corgi
|
||||
name = "The Barkening"
|
||||
cure_text = "Death"
|
||||
cures = list("adminordrazine")
|
||||
agent = "Fell Doge Majicks"
|
||||
desc = "This disease transforms the victim into a corgi."
|
||||
visibility_flags = 0
|
||||
|
||||
@@ -286,9 +286,9 @@ var/list/all_supply_groups = list(supply_emergency,supply_security,supply_engine
|
||||
|
||||
/datum/supply_packs/security/armory/ballistic
|
||||
name = "Combat Shotguns Crate"
|
||||
contains = list(/obj/item/weapon/gun/projectile/shotgun/combat,
|
||||
/obj/item/weapon/gun/projectile/shotgun/combat,
|
||||
/obj/item/weapon/gun/projectile/shotgun/combat,
|
||||
contains = list(/obj/item/weapon/gun/projectile/shotgun/automatic/combat,
|
||||
/obj/item/weapon/gun/projectile/shotgun/automatic/combat,
|
||||
/obj/item/weapon/gun/projectile/shotgun/automatic/combat,
|
||||
/obj/item/weapon/storage/belt/bandolier,
|
||||
/obj/item/weapon/storage/belt/bandolier,
|
||||
/obj/item/weapon/storage/belt/bandolier)
|
||||
|
||||
@@ -268,10 +268,24 @@ var/list/uplink_items = list()
|
||||
cost = 2
|
||||
gamemodes = list(/datum/game_mode/nuclear,/datum/game_mode/gang)
|
||||
|
||||
/datum/uplink_item/ammo/ammobag
|
||||
name = "Ammo Duffelbag - Shotgun Ammo Grab Bag"
|
||||
desc = "A duffelbag filled with Bulldog ammo to kit out an entire team, at a discounted price."
|
||||
item = /obj/item/weapon/storage/backpack/dufflebag/syndieammo/loaded
|
||||
cost = 10 //bulk buyer's discount. Very useful if you're buying a mech and dont have TC left to buy people non-shotgun guns
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/ammo/bullslug
|
||||
name = "Drum Magazine - 12g Slugs"
|
||||
desc = "An additional 8-round slug magazine for use in the Bulldog shotgun. Now 8 times less likely to shoot your pals."
|
||||
item = /obj/item/ammo_box/magazine/m12g
|
||||
cost = 2
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/ammo/bullbuck
|
||||
name = "Drum Magazine - 12g Buckshot"
|
||||
desc = "An additional 8-round buckshot magazine for use in the Bulldog shotgun. Front towards enemy."
|
||||
item = /obj/item/ammo_box/magazine/m12g
|
||||
item = /obj/item/ammo_box/magazine/m12g/buckshot
|
||||
cost = 2
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
@@ -286,6 +300,13 @@ var/list/uplink_items = list()
|
||||
name = "Drum Magazine - 12g Dragon's Breath"
|
||||
desc = "An alternative 8-round dragon's breath magazine for use in the Bulldog shotgun. I'm a fire starter, twisted fire starter!"
|
||||
item = /obj/item/ammo_box/magazine/m12g/dragon
|
||||
cost = 2
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
/datum/uplink_item/ammo/bulltoxin
|
||||
name = "Drum Magazine - 12g Bioterror"
|
||||
desc = "An alternative 8-round toxic magazine for use in the Bulldog shotgun. Contains debilitating toxins to make your target die an agonizing death."
|
||||
item = /obj/item/ammo_box/magazine/m12g/bioterror
|
||||
cost = 3
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
|
||||
@@ -389,6 +410,14 @@ var/list/uplink_items = list()
|
||||
item = /obj/item/toy/carpplushie/dehy_carp
|
||||
cost = 3
|
||||
|
||||
/datum/uplink_item/stealthy_weapons/door_charge
|
||||
name = "Explosive Airlock Charge"
|
||||
desc = "A small, easily concealable device. It can be applied to an open airlock panel, and the next person to open that airlock will be knocked down in an explosion. The airlock's maintenance panel will also be destroyed by this."
|
||||
item = /obj/item/device/doorCharge
|
||||
cost = 5
|
||||
surplus = 6
|
||||
excludefrom = list(/datum/game_mode/nuclear)
|
||||
|
||||
// STEALTHY TOOLS
|
||||
|
||||
/datum/uplink_item/stealthy_tools
|
||||
@@ -639,11 +668,62 @@ var/list/uplink_items = list()
|
||||
item = /obj/item/weapon/storage/box/syndie_kit/imp_explosive
|
||||
cost = 6
|
||||
|
||||
|
||||
//CYBERNETIC IMPLANTS
|
||||
|
||||
/datum/uplink_item/cyber_implants
|
||||
category = "Cybernetic Implants"
|
||||
gamemodes = list(/datum/game_mode/nuclear)
|
||||
surplus = 0
|
||||
|
||||
/datum/uplink_item/cyber_implants/thermals
|
||||
name = "Thermal Vision Implant"
|
||||
desc = "These cybernetic eyes will give you thermal vision."
|
||||
item = /obj/item/cybernetic_implant/eyes/thermals
|
||||
cost = 8
|
||||
|
||||
/datum/uplink_item/cyber_implants/xray
|
||||
name = "X-Ray Vision Implant"
|
||||
desc = "These cybernetic eyes will give you X-ray vision."
|
||||
item = /obj/item/cybernetic_implant/eyes/xray
|
||||
cost = 10
|
||||
|
||||
/datum/uplink_item/cyber_implants/antistun
|
||||
name = "CNS Rebooter Implant"
|
||||
desc = "This implant will help you get back up on your feet faster after being stunned."
|
||||
item = /obj/item/cybernetic_implant/brain/anti_stun
|
||||
cost = 12
|
||||
|
||||
/datum/uplink_item/cyber_implants/antidrop
|
||||
name = "Anti-Drop Implant"
|
||||
desc = "This cybernetic brain implant will allow you to force your hand muscles to contract, preventing item dropping."
|
||||
item = /obj/item/cybernetic_implant/brain/anti_drop
|
||||
cost = 8
|
||||
|
||||
/datum/uplink_item/cyber_implants/reviver
|
||||
name = "Reviver Implant"
|
||||
desc = "This implant will attempt to revive you if you lose consciousness."
|
||||
item = /obj/item/cybernetic_implant/chest/reviver
|
||||
cost = 8
|
||||
|
||||
/datum/uplink_item/cyber_implants/nutriment
|
||||
name = "Nutriment Pump Implant PLUS"
|
||||
desc = "This implant will pump you with nutriments and electrolytes so you don't go hungry in action."
|
||||
item = /obj/item/cybernetic_implant/chest/nutriment/plus
|
||||
cost = 5
|
||||
|
||||
/datum/uplink_item/cyber_implants/bundle
|
||||
name = "Cybernetic Implants Bundle"
|
||||
desc = "A random selection of cybernetic implants. Guaranteed 5 high quality implants."
|
||||
item = /obj/item/weapon/storage/box/cyber_implants
|
||||
cost = 40
|
||||
|
||||
// POINTLESS BADASSERY
|
||||
|
||||
/datum/uplink_item/badass
|
||||
category = "(Pointless) Badassery"
|
||||
surplus = 0
|
||||
last = 1
|
||||
|
||||
/datum/uplink_item/badass/bundle
|
||||
name = "Syndicate Bundle"
|
||||
|
||||
@@ -134,7 +134,8 @@ var/list/wireColours = list("red", "blue", "green", "black", "orange", "brown",
|
||||
if(istype(I, /obj/item/device/assembly))
|
||||
var/obj/item/device/assembly/A = I;
|
||||
if(A.attachable)
|
||||
L.drop_item()
|
||||
if(!L.drop_item())
|
||||
return
|
||||
Attach(colour, A)
|
||||
else
|
||||
L << "<span class='warning'>You need a attachable assembly!</span>"
|
||||
|
||||
@@ -449,3 +449,6 @@ var/list/blood_splatter_icons = list()
|
||||
|
||||
/atom/proc/narsie_act()
|
||||
return
|
||||
|
||||
/atom/proc/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user)
|
||||
return 0
|
||||
+2
-1
@@ -519,7 +519,8 @@
|
||||
/obj/machinery/computer/scan_consolenew/attackby(obj/item/I as obj, mob/user as mob, params)
|
||||
if (istype(I, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES
|
||||
if (!src.diskette)
|
||||
user.drop_item()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
I.loc = src
|
||||
src.diskette = I
|
||||
user << "<span class='notice'>You insert [I].</span>"
|
||||
|
||||
@@ -263,7 +263,7 @@
|
||||
for(var/team_number=1,team_number<=teams,team_number++)
|
||||
var/obj/machinery/abductor/console/con = get_team_console(team_number)
|
||||
var/datum/objective/objective = team_objectives[team_number]
|
||||
if (con.experiment.points > objective.target_amount)
|
||||
if (con.experiment.points >= objective.target_amount)
|
||||
SSshuttle.emergency.request(null, 0.5)
|
||||
finished = 1
|
||||
return ..()
|
||||
@@ -279,7 +279,7 @@
|
||||
var/datum/mind/smind = scientists[team_number]
|
||||
var/mob/living/carbon/human/agent = amind.current
|
||||
var/mob/living/carbon/human/scientist = smind.current
|
||||
if (console.experiment.points > objective.target_amount)
|
||||
if (console.experiment.points >= objective.target_amount)
|
||||
world << "<font size = 3 color='green'><b>[team_name] team fullfilled its mission! </b></font>"
|
||||
world << "<b>Team Members : [agent.name]([agent.ckey]),[scientist.name]([scientist.ckey])</b>"
|
||||
else
|
||||
|
||||
@@ -22,15 +22,6 @@
|
||||
var/stealth_armor = list(melee = 15, bullet = 15, laser = 15, energy = 15, bomb = 15, bio = 15, rad = 15)
|
||||
var/combat_armor = list(melee = 50, bullet = 50, laser = 50, energy = 50, bomb = 50, bio = 50, rad = 50)
|
||||
|
||||
var/obj/machinery/camera/portable/vest_cam = null
|
||||
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/New()
|
||||
..()
|
||||
vest_cam = new /obj/machinery/camera/portable(src)
|
||||
vest_cam.c_tag = "Agent Vest Cam"
|
||||
vest_cam.network = list("Abductor")
|
||||
|
||||
/obj/item/clothing/suit/armor/abductor/vest/proc/flip_mode()
|
||||
switch(mode)
|
||||
if(VEST_STEALTH)
|
||||
|
||||
@@ -60,7 +60,8 @@
|
||||
|
||||
/obj/machinery/abductor/gland_dispenser/attackby(obj/item/weapon/W, mob/user, params)
|
||||
if(istype(W, /obj/item/gland))
|
||||
user.drop_item()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
W.loc = src
|
||||
for(var/i=1,i<=gland_colors.len,i++)
|
||||
if(gland_types[i] == W.type)
|
||||
|
||||
@@ -83,8 +83,7 @@
|
||||
H.hair_style = null
|
||||
H.update_hair()
|
||||
human_overlays = H.overlays
|
||||
if(overmind && overmind.blob_reagent_datum)
|
||||
adjustcolors(overmind.blob_reagent_datum.color)
|
||||
update_icons()
|
||||
H.loc = src
|
||||
loc.visible_message("<span class='warning'>The corpse of [H.name] suddenly rises!</span>")
|
||||
|
||||
@@ -120,8 +119,18 @@
|
||||
..()
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/blob/blobspore/update_icons()
|
||||
..()
|
||||
|
||||
if(overmind && overmind.blob_reagent_datum)
|
||||
adjustcolors(overmind.blob_reagent_datum.color)
|
||||
else
|
||||
adjustcolors(color) //to ensure zombie/other overlays update
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/blob/blobspore/adjustcolors(var/a_color)
|
||||
color = a_color
|
||||
|
||||
if(is_zombie)
|
||||
overlays.Cut()
|
||||
overlays = human_overlays
|
||||
@@ -130,7 +139,6 @@
|
||||
color = initial(color)//looks better.
|
||||
overlays += I
|
||||
|
||||
|
||||
/////////////////
|
||||
// BLOBBERNAUT //
|
||||
/////////////////
|
||||
|
||||
@@ -6,10 +6,10 @@
|
||||
density = 1
|
||||
anchored = 1.0
|
||||
layer = 3.6
|
||||
var/health = 200
|
||||
var/maxhealth = 300
|
||||
var/health = 300
|
||||
var/gang
|
||||
var/operating = 0
|
||||
var/broken = 0
|
||||
|
||||
/obj/machinery/dominator/New()
|
||||
if(!istype(ticker.mode, /datum/game_mode/gang))
|
||||
@@ -19,7 +19,7 @@
|
||||
|
||||
/obj/machinery/dominator/examine(mob/user)
|
||||
..()
|
||||
if(broken)
|
||||
if(operating == -1)
|
||||
user << "<span class='danger'>It looks completely busted.</span>"
|
||||
return
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
user << "<span class='notice'>Hostile Takeover of [station_name()] successful. Have a great day.</span>"
|
||||
else
|
||||
user << "<span class='notice'>System on standby.</span>"
|
||||
user << "<span class='danger'>System Integrity: [health/2]%</span>"
|
||||
user << "<span class='danger'>System Integrity: [round((health/maxhealth)*100,1)]%</span>"
|
||||
|
||||
|
||||
/obj/machinery/dominator/proc/healthcheck(var/damage)
|
||||
@@ -51,23 +51,22 @@
|
||||
|
||||
health -= damage
|
||||
|
||||
switch(health)
|
||||
if(101 to INFINITY)
|
||||
if(prob(damage*2))
|
||||
sparks.set_up(5, 1, src)
|
||||
sparks.start()
|
||||
if(1 to 100)
|
||||
if(health > (maxhealth/2))
|
||||
if(prob(damage*2))
|
||||
sparks.set_up(5, 1, src)
|
||||
sparks.start()
|
||||
iconname += "-damaged"
|
||||
else
|
||||
sparks.set_up(5, 1, src)
|
||||
sparks.start()
|
||||
iconname += "-damaged"
|
||||
|
||||
if(!broken)
|
||||
if(operating != -1)
|
||||
if(health <= 0)
|
||||
set_broken()
|
||||
else
|
||||
icon_state = iconname
|
||||
|
||||
if(health <= -50)
|
||||
if(health <= -100)
|
||||
new /obj/item/stack/sheet/plasteel(src.loc)
|
||||
qdel(src)
|
||||
|
||||
@@ -77,22 +76,37 @@
|
||||
mode.A_timer = "OFFLINE"
|
||||
if(gang == "B")
|
||||
mode.B_timer = "OFFLINE"
|
||||
if(!isnum(mode.A_timer) && !isnum(mode.B_timer))
|
||||
SSshuttle.emergencyNoEscape = 0
|
||||
if(SSshuttle.emergency.mode == SHUTTLE_STRANDED)
|
||||
SSshuttle.emergency.mode = SHUTTLE_DOCKED
|
||||
SSshuttle.emergency.timer = world.time
|
||||
priority_announce("Hostile enviroment resolved. You have 3 minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority")
|
||||
else
|
||||
priority_announce("All hostile activity within station systems have ceased.","Network Alert")
|
||||
if(gang)
|
||||
if(!isnum(mode.A_timer) && !isnum(mode.B_timer))
|
||||
SSshuttle.emergencyNoEscape = 0
|
||||
if(SSshuttle.emergency.mode == SHUTTLE_STRANDED)
|
||||
SSshuttle.emergency.mode = SHUTTLE_DOCKED
|
||||
SSshuttle.emergency.timer = world.time
|
||||
priority_announce("Hostile enviroment resolved. You have 3 minutes to board the Emergency Shuttle.", null, 'sound/AI/shuttledock.ogg', "Priority")
|
||||
else
|
||||
priority_announce("All hostile activity within station systems have ceased.","Network Alert")
|
||||
|
||||
if(get_security_level() == "delta")
|
||||
set_security_level("red")
|
||||
|
||||
for(var/obj/item/weapon/pinpointer/pointer in world)
|
||||
pointer.scandisk() //Reset the pinpointer
|
||||
|
||||
else if(isnum(mode.A_timer) || isnum(mode.B_timer))
|
||||
for(var/obj/machinery/dominator/dom in world)
|
||||
if(dom.operating)
|
||||
for(var/obj/item/weapon/pinpointer/pointer in world)
|
||||
pointer.the_disk = dom //The pinpointer now tracks the dominator's location
|
||||
break
|
||||
|
||||
ticker.mode.message_gangtools(((gang=="A") ? ticker.mode.A_tools : ticker.mode.B_tools),"Hostile takeover cancelled: Dominator is no longer operational.",1,1)
|
||||
|
||||
SetLuminosity(0)
|
||||
icon_state = "dominator-broken"
|
||||
broken = 1
|
||||
operating = -1
|
||||
|
||||
/obj/machinery/dominator/Destroy()
|
||||
if(!broken)
|
||||
if(operating != -1)
|
||||
set_broken()
|
||||
..()
|
||||
|
||||
@@ -116,9 +130,12 @@
|
||||
/obj/machinery/dominator/bullet_act(var/obj/item/projectile/Proj)
|
||||
if(Proj.damage)
|
||||
if((Proj.damage_type == BRUTE || Proj.damage_type == BURN))
|
||||
var/damage = Proj.damage
|
||||
if(Proj.forcedodge)
|
||||
damage *= 0.5
|
||||
playsound(src, 'sound/effects/bang.ogg', 50, 1)
|
||||
visible_message("<span class='danger'>[src] was hit by [Proj].</span>")
|
||||
healthcheck(Proj.damage)
|
||||
healthcheck(damage)
|
||||
..()
|
||||
|
||||
/obj/machinery/dominator/blob_act()
|
||||
@@ -129,7 +146,7 @@
|
||||
return
|
||||
|
||||
/obj/machinery/dominator/attack_hand(mob/user)
|
||||
if(operating||broken)
|
||||
if(operating)
|
||||
examine(user)
|
||||
return
|
||||
|
||||
@@ -155,13 +172,12 @@
|
||||
user << "<span class='warning'>Error: Hostile Takeover is already in progress.</span>"
|
||||
return
|
||||
|
||||
var/time = max(180,900 - ((round((gang_territory/start_state.num_territories)*200, 1) - 60) * 15))
|
||||
var/time = max(300,900 - ((round((gang_territory/start_state.num_territories)*200, 1) - 60) * 15))
|
||||
if(alert(user,"With [round((gang_territory/start_state.num_territories)*100, 1)]% station control, a takeover will require [time] seconds.\nYour gang will be unable to gain influence while it is active.\nThe entire station will likely be alerted to it once it starts.\nAre you ready?","Confirm","Ready","Later") == "Ready")
|
||||
if ((!in_range(src, user) || !istype(src.loc, /turf)))
|
||||
return 0
|
||||
var/area/srcloc = get_area(src.loc)
|
||||
gang = tempgang
|
||||
mode.domination(gang,1,srcloc.name)
|
||||
mode.domination(gang,1,src)
|
||||
src.name = "[gang_name(gang)] Gang [src.name]"
|
||||
healthcheck(0)
|
||||
operating = 1
|
||||
|
||||
@@ -9,16 +9,14 @@
|
||||
var/obj/item/device/gangtool/A_tools = list()
|
||||
var/obj/item/device/gangtool/B_tools = list()
|
||||
var/datum/gang_points/gang_points
|
||||
var/A_style
|
||||
var/B_style
|
||||
var/list/A_territory = list()
|
||||
var/list/B_territory = list()
|
||||
var/list/A_territory_new = list()
|
||||
var/list/A_territory_lost = list()
|
||||
var/list/B_territory_new = list()
|
||||
var/list/B_territory_lost = list()
|
||||
var/gang_A_style
|
||||
var/gang_A_headgear
|
||||
var/gang_B_style
|
||||
var/gang_B_headgear
|
||||
|
||||
/datum/game_mode/gang
|
||||
name = "gang war"
|
||||
@@ -85,7 +83,7 @@
|
||||
if(isnum(B_timer))
|
||||
B_timer -= seconds
|
||||
|
||||
ticker.mode.check_win()
|
||||
check_win()
|
||||
|
||||
/datum/game_mode/gang/proc/assign_bosses()
|
||||
var/datum/mind/boss = pick(antag_candidates)
|
||||
@@ -117,17 +115,20 @@
|
||||
boss_mind.current << "<B>Objective #[obj_count]</B>: [objective.explanation_text]"
|
||||
obj_count++
|
||||
|
||||
/datum/game_mode/gang/proc/domination(var/gang,var/modifier=1,var/dominatorloc)
|
||||
/datum/game_mode/gang/proc/domination(var/gang,var/modifier=1,var/obj/dominator)
|
||||
if(gang=="A")
|
||||
A_timer = max(180,900 - ((round((ticker.mode.A_territory.len/start_state.num_territories)*200, 1) - 60) * 15)) * modifier
|
||||
A_timer = max(180,900 - ((round((A_territory.len/start_state.num_territories)*200, 1) - 60) * 15)) * modifier
|
||||
if(gang=="B")
|
||||
B_timer = max(180,900 - ((round((ticker.mode.B_territory.len/start_state.num_territories)*200, 1) - 60) * 15)) * modifier
|
||||
if(gang && dominatorloc)
|
||||
priority_announce("Hostile runtimes detected in all station systems. A network breach by the [gang_name(gang)] Gang has been located in [dominatorloc].","Network Alert")
|
||||
if(get_security_level() != "delta")
|
||||
set_security_level("red")
|
||||
B_timer = max(180,900 - ((round((B_territory.len/start_state.num_territories)*200, 1) - 60) * 15)) * modifier
|
||||
if(gang && dominator)
|
||||
var/area/domloc = get_area(dominator.loc)
|
||||
priority_announce("Hostile runtimes detected in all station systems. A network breach by the [gang_name(gang)] Gang has been located in [domloc].","Network Alert")
|
||||
set_security_level("delta")
|
||||
SSshuttle.emergencyNoEscape = 1
|
||||
|
||||
for(var/obj/item/weapon/pinpointer/point in world)
|
||||
point.the_disk = dominator //The pinpointer now tracks the dominator's location
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
//This equips the bosses with their gear, and makes the clown not clumsy//
|
||||
///////////////////////////////////////////////////////////////////////////
|
||||
@@ -180,6 +181,7 @@
|
||||
|
||||
return .
|
||||
|
||||
|
||||
//Used by recallers when purchasing a gang outfit. First time a gang outfit is purchased the buyer decides a gang style which is stored so gang outfits are uniform
|
||||
/datum/game_mode/proc/gang_outfit(mob/user,var/obj/item/device/gangtool/gangtool,var/gang)
|
||||
if(!user || !gangtool || !gang)
|
||||
@@ -187,36 +189,53 @@
|
||||
if(!gangtool.can_use(user))
|
||||
return 0
|
||||
|
||||
var/gang_style_list = list("Gang Colors","Leather Jackets","Black Suits","White Suits")
|
||||
var/gang_style_list = list("Gang Colors","Gang Colored Suits","Black Suits","White Suits","Leather Jackets","Leather Overcoats","Tactical Turtlenecks","Soviet Uniforms")
|
||||
var/style
|
||||
if(gang == "A")
|
||||
if(!gang_A_style)
|
||||
gang_A_style = input("Pick an outfit style.", "Pick Style") as null|anything in gang_style_list
|
||||
style = gang_A_style
|
||||
if(!A_style)
|
||||
A_style = input("Pick an outfit style.", "Pick Style") as null|anything in gang_style_list
|
||||
style = A_style
|
||||
|
||||
if(gang == "B")
|
||||
if(!gang_B_style)
|
||||
gang_B_style = input("Pick an outfit style.", "Pick Style") as null|anything in gang_style_list
|
||||
style = gang_B_style
|
||||
if(!B_style)
|
||||
B_style = input("Pick an outfit style.", "Pick Style") as null|anything in gang_style_list
|
||||
style = B_style
|
||||
|
||||
if(!style)
|
||||
return 0
|
||||
|
||||
if(gangtool.can_use(user) && (((gang == "A") ? gang_points.A : gang_points.B) >= 1))
|
||||
var/outfit_path
|
||||
switch(style)
|
||||
if("Gang Colors")
|
||||
if(gang == "A")
|
||||
new /obj/item/clothing/under/color/blue(user.loc)
|
||||
outfit_path = /obj/item/clothing/under/color/blue
|
||||
if(gang == "B")
|
||||
new /obj/item/clothing/under/color/red(user.loc)
|
||||
if("Leather Jackets")
|
||||
new /obj/item/clothing/suit/jacket/leather(user.loc)
|
||||
outfit_path = /obj/item/clothing/under/color/red
|
||||
if("Gang Colored Suits")
|
||||
if(gang == "A")
|
||||
outfit_path = /obj/item/clothing/under/suit_jacket/navy
|
||||
if(gang == "B")
|
||||
outfit_path = /obj/item/clothing/under/suit_jacket/burgundy
|
||||
if("Black Suits")
|
||||
new /obj/item/clothing/under/suit_jacket/charcoal(user.loc)
|
||||
outfit_path = /obj/item/clothing/under/suit_jacket/charcoal
|
||||
if("White Suits")
|
||||
new /obj/item/clothing/under/suit_jacket/white(user.loc)
|
||||
outfit_path = /obj/item/clothing/under/suit_jacket/white
|
||||
if("Leather Jackets")
|
||||
outfit_path = /obj/item/clothing/suit/jacket/leather
|
||||
if("Leather Overcoats")
|
||||
outfit_path = /obj/item/clothing/suit/jacket/leather/overcoat
|
||||
if("Soviet Uniforms")
|
||||
outfit_path = /obj/item/clothing/under/soviet
|
||||
if("Tactical Turtlenecks")
|
||||
outfit_path = /obj/item/clothing/under/syndicate
|
||||
|
||||
return 1
|
||||
if(outfit_path)
|
||||
var/obj/item/clothing/outfit = new outfit_path(user.loc)
|
||||
outfit.armor = list(melee = 10, bullet = 10, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0)
|
||||
outfit.desc += " Combat-tailored for the [gang_name(gang)] Gang."
|
||||
outfit.gang = gang
|
||||
return 1
|
||||
|
||||
return 0
|
||||
|
||||
@@ -258,7 +277,7 @@
|
||||
if(check && isloyal(gangster_mind.current)) //Check to see if the potential gangster is implanted
|
||||
return 0
|
||||
if(gangster_mind in (A_bosses | A_gang | B_bosses | B_gang))
|
||||
return 0
|
||||
return 1
|
||||
if(gang == "A")
|
||||
A_gang += gangster_mind
|
||||
else
|
||||
@@ -275,7 +294,7 @@
|
||||
gangster_mind.current.attack_log += "\[[time_stamp()]\] <font color='red'>Has been converted to the [gang=="A" ? "[gang_name("A")] Gang (A)" : "[gang_name("B")] Gang (B)"]!</font>"
|
||||
gangster_mind.special_role = "[gang=="A" ? "[gang_name("A")] Gang (A)" : "[gang_name("B")] Gang (B)"]"
|
||||
update_gang_icons_added(gangster_mind,gang)
|
||||
return 1
|
||||
return 2
|
||||
////////////////////////////////////////////////////////////////////
|
||||
//Deals with players reverting to neutral (Not a gangster anymore)//
|
||||
////////////////////////////////////////////////////////////////////
|
||||
@@ -310,7 +329,7 @@
|
||||
if(!silent)
|
||||
gangster_mind.current.visible_message("The frame beeps contentedly from the MMI before initalizing it.")
|
||||
gangster_mind.current << "<FONT size=3 color=red><B>The frame's firmware detects and deletes your criminal behavior! You are no longer a gangster!</B></FONT>"
|
||||
message_admins("[key_name_admin(gangster_mind.current)] <A HREF='?_src_=holder;adminmoreinfo=\ref[gangster_mind.current]'>?</A> has been borged while being a member of the [gang=="A" ? "[gang_name("A")] Gang (A)" : "[gang_name("B")] Gang (B)"] Gang. They are no longer a gangster.")
|
||||
message_admins("[key_name_admin(gangster_mind.current)] <A HREF='?_src_=holder;adminmoreinfo=\ref[gangster_mind.current]'>?</A> (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[gangster_mind.current]'>FLW</A>) has been borged while being a member of the [gang=="A" ? "[gang_name("A")] Gang (A)" : "[gang_name("B")] Gang (B)"] Gang. They are no longer a gangster.")
|
||||
else
|
||||
if(!silent)
|
||||
gangster_mind.current.Paralyse(5)
|
||||
@@ -376,7 +395,7 @@
|
||||
|
||||
if(A_bosses.len || A_gang.len)
|
||||
if(winner)
|
||||
world << "<br><b>The [gang_name("A")] Gang was [winner=="A" ? "<font color=green>victorious</font>" : "<font color=red>defeated</font>"] with [round((ticker.mode.A_territory.len/start_state.num_territories)*100, 1)]% control of the station!</b>"
|
||||
world << "<br><b>The [gang_name("A")] Gang was [winner=="A" ? "<font color=green>victorious</font>" : "<font color=red>defeated</font>"] with [round((A_territory.len/start_state.num_territories)*100, 1)]% control of the station!</b>"
|
||||
world << "<br>The [gang_name("A")] Gang Bosses were:"
|
||||
gang_membership_report(A_bosses)
|
||||
world << "<br>The [gang_name("A")] Gangsters were:"
|
||||
@@ -385,7 +404,7 @@
|
||||
|
||||
if(B_bosses.len || B_gang.len)
|
||||
if(winner)
|
||||
world << "<br><b>The [gang_name("B")] Gang was [winner=="B" ? "<font color=green>victorious</font>" : "<font color=red>defeated</font>"] with [round((ticker.mode.B_territory.len/start_state.num_territories)*100, 1)]% control of the station!</b></b>"
|
||||
world << "<br><b>The [gang_name("B")] Gang was [winner=="B" ? "<font color=green>victorious</font>" : "<font color=red>defeated</font>"] with [round((B_territory.len/start_state.num_territories)*100, 1)]% control of the station!</b></b>"
|
||||
world << "<br>The [gang_name("B")] Gang Bosses were:"
|
||||
gang_membership_report(B_bosses)
|
||||
world << "<br>The [gang_name("B")] Gangsters were:"
|
||||
@@ -454,39 +473,59 @@
|
||||
if(istype(ticker.mode, /datum/game_mode/gang))
|
||||
gangmode = ticker.mode
|
||||
|
||||
//Count uniformed gangsters
|
||||
var/A_uniformed = 0
|
||||
var/B_uniformed = 0
|
||||
for(var/datum/mind/gangmind in (ticker.mode.A_gang|ticker.mode.A_bosses|ticker.mode.B_gang|ticker.mode.B_bosses))
|
||||
if(ishuman(gangmind.current))
|
||||
var/mob/living/carbon/human/gangster = gangmind.current
|
||||
//Gangster must be alive and on station
|
||||
if((gangster.stat == DEAD) || (gangster.z > ZLEVEL_STATION))
|
||||
continue
|
||||
if(gangster.w_uniform)
|
||||
var/obj/item/clothing/outfit = gangster.w_uniform
|
||||
if(outfit.gang == "A")
|
||||
A_uniformed ++
|
||||
if(outfit.gang == "B")
|
||||
B_uniformed ++
|
||||
if(gangster.wear_suit)
|
||||
var/obj/item/clothing/outfit = gangster.wear_suit
|
||||
if(outfit.gang == "A")
|
||||
A_uniformed ++
|
||||
if(outfit.gang == "B")
|
||||
B_uniformed ++
|
||||
|
||||
//Calculate and report influence growth
|
||||
ticker.mode.message_gangtools(ticker.mode.A_tools,"*---------*<br><b>[gang_name("A")] Gang Status Report:</b>")
|
||||
var/A_message = ""
|
||||
if(gangmode && isnum(gangmode.A_timer))
|
||||
var/new_time = max(180,gangmode.A_timer - (ticker.mode.A_territory.len * 2))
|
||||
var/new_time = max(180,gangmode.A_timer - ((ticker.mode.A_territory.len + A_uniformed) * 2))
|
||||
if(new_time < gangmode.A_timer)
|
||||
A_message += "Your takeover has been rushed by [gangmode.A_timer - new_time] seconds for holding on to [ticker.mode.A_territory.len] territories. "
|
||||
A_message += "Takeover shortened by [gangmode.A_timer - new_time] seconds for defending [ticker.mode.A_territory.len] territories and [A_uniformed] uniformed gangsters.<BR>"
|
||||
gangmode.A_timer = new_time
|
||||
A_message += "[gangmode.A_timer] seconds remain in hostile takeover."
|
||||
else
|
||||
var/A_new = min(999,A + 15 + ticker.mode.A_territory.len)
|
||||
var/A_new = min(999,A + 15 + (A_uniformed * 2) + ticker.mode.A_territory.len)
|
||||
if(A_new != A)
|
||||
A_message += "Your gang has gained <b>[A_new - A] Influence</b> for holding on to [ticker.mode.A_territory.len] territories."
|
||||
if(A_new == 999)
|
||||
A_message += " You cannot gain any more influence without spending some with this device."
|
||||
A_message += "Gang influence has increased by [A_new - A] for defending [ticker.mode.A_territory.len] territories and [A_uniformed] uniformed gangsters.<BR>"
|
||||
A = A_new
|
||||
A_message += "Your gang now has [A_new] influence."
|
||||
ticker.mode.message_gangtools(ticker.mode.A_tools,A_message,0)
|
||||
|
||||
ticker.mode.message_gangtools(ticker.mode.B_tools,"<b>[gang_name("B")] Gang Status Report:</b>")
|
||||
var/B_message = ""
|
||||
if(gangmode && isnum(gangmode.B_timer))
|
||||
var/new_time = max(180,gangmode.B_timer - (ticker.mode.B_territory.len * 2))
|
||||
var/new_time = max(180,gangmode.B_timer - ((ticker.mode.B_territory.len + B_uniformed) * 2))
|
||||
if(new_time < gangmode.B_timer)
|
||||
B_message += "Your takeover has been rushed by [gangmode.B_timer - new_time] seconds for holding on to [ticker.mode.B_territory.len] territories. "
|
||||
A_message += "Takeover shortened by [gangmode.B_timer - new_time] seconds for defending [ticker.mode.B_territory.len] territories and [B_uniformed] uniformed gangsters.<BR>"
|
||||
gangmode.B_timer = new_time
|
||||
B_message += "[gangmode.B_timer] seconds remain in hostile takeover."
|
||||
B_message += "[gangmode.B_timer] seconds remain hostile takeover."
|
||||
else
|
||||
var/B_new = min(999,B + 15 + ticker.mode.B_territory.len)
|
||||
var/B_new = min(999,B + 15 + (B_uniformed * 2) + ticker.mode.B_territory.len)
|
||||
if(B_new != B)
|
||||
B_message += "Your gang has gained <b>[B_new - B] Influence</b> for holding on to [ticker.mode.B_territory.len] territories."
|
||||
if(B_new == 999)
|
||||
B_message += " You cannot gain any more influence without spending some with this device."
|
||||
A_message += "Gang influence has increased by [B_new - B] for defending [ticker.mode.B_territory.len] territories and [B_uniformed] uniformed gangsters.<BR>"
|
||||
B = B_new
|
||||
B_message += "Your gang now has [B_new] influence."
|
||||
ticker.mode.message_gangtools(ticker.mode.B_tools,B_message,0)
|
||||
|
||||
|
||||
@@ -512,10 +551,10 @@
|
||||
ticker.mode.B_territory += area
|
||||
|
||||
//Report territory changes
|
||||
ticker.mode.message_gangtools(ticker.mode.A_tools,"<b>[ticker.mode.A_territory_new.len] new territories</b>[A_added_names]",0)
|
||||
ticker.mode.message_gangtools(ticker.mode.B_tools,"<b>[ticker.mode.B_territory_new.len] new territories</b>[B_added_names]",0,)
|
||||
ticker.mode.message_gangtools(ticker.mode.A_tools,"<b>[ticker.mode.A_territory_lost.len] territories lost</b>[A_lost_names]",0,1)
|
||||
ticker.mode.message_gangtools(ticker.mode.B_tools,"<b>[ticker.mode.B_territory_lost.len] territories lost</b>[B_lost_names]",0,1)
|
||||
ticker.mode.message_gangtools(ticker.mode.A_tools,"<b>[ticker.mode.A_territory_new.len] new territories</b><BR>[A_added_names]",0)
|
||||
ticker.mode.message_gangtools(ticker.mode.B_tools,"<b>[ticker.mode.B_territory_new.len] new territories</b><BR>[B_added_names]",0,)
|
||||
ticker.mode.message_gangtools(ticker.mode.A_tools,"<b>[ticker.mode.A_territory_lost.len] territories lost</b><BR>[A_lost_names]",0)
|
||||
ticker.mode.message_gangtools(ticker.mode.B_tools,"<b>[ticker.mode.B_territory_lost.len] territories lost</b><BR>[B_lost_names]",0)
|
||||
|
||||
//Clear the lists
|
||||
ticker.mode.A_territory_new = list()
|
||||
@@ -535,7 +574,6 @@
|
||||
//Restart the counter
|
||||
start()
|
||||
|
||||
|
||||
////////////////////////////////////////////////
|
||||
//Sends a message to the boss via his gangtool//
|
||||
////////////////////////////////////////////////
|
||||
|
||||
@@ -78,18 +78,24 @@
|
||||
|
||||
dat += "(10 Influence) "
|
||||
if(points >= 10)
|
||||
dat += "<a href='?src=\ref[src];purchase=ammo'>10mm Ammo</a><br>"
|
||||
dat += "<a href='?src=\ref[src];purchase=10mmammo'>10mm Ammo</a><br>"
|
||||
else
|
||||
dat += "10mm Ammo<br>"
|
||||
|
||||
dat += "(50 Influence) "
|
||||
if(points >= 50)
|
||||
dat += "<a href='?src=\ref[src];purchase=SMG'>Thompson SMG</a><br>"
|
||||
dat += "(40 Influence) "
|
||||
if(points >= 40)
|
||||
dat += "<a href='?src=\ref[src];purchase=uzi'>Mini Uzi</a><br>"
|
||||
else
|
||||
dat += "Thompson SMG<br>"
|
||||
dat += "Mini Uzi<br>"
|
||||
|
||||
dat += "(25 Influence) "
|
||||
if(points >= 25)
|
||||
dat += "<a href='?src=\ref[src];purchase=9mmammo'>Uzi Ammo</a><br>"
|
||||
else
|
||||
dat += "Uzi Magazine<br>"
|
||||
|
||||
dat += "<br>"
|
||||
dat += "<B>Purchase Utilities:</B><br>"
|
||||
dat += "<B>Purchase Equipment:</B><br>"
|
||||
|
||||
dat += "(5 Influence) "
|
||||
if(points >= 5)
|
||||
@@ -124,7 +130,7 @@
|
||||
dat += "<a href='?src=\ref[src];purchase=dominator'><b>Station Dominator</b></a><br>"
|
||||
else
|
||||
dat += "Station Dominator<br>"
|
||||
dat += "<i>(Estimated Takeover Time: [round(max(180,900 - ((round((gang_territory/start_state.num_territories)*200, 10) - 60) * 15))/60,1)] minutes)</i><br>"
|
||||
dat += "<i>(Estimated Takeover Time: [round(max(300,900 - ((round((gang_territory/start_state.num_territories)*200, 10) - 60) * 15))/60,1)] minutes)</i><br>"
|
||||
|
||||
dat += "<br>"
|
||||
dat += "<a href='?src=\ref[src];choice=refresh'>Refresh</a><br>"
|
||||
@@ -163,14 +169,18 @@
|
||||
if(points >= 20)
|
||||
item_type = /obj/item/weapon/gun/projectile/automatic/pistol
|
||||
points = 20
|
||||
if("ammo")
|
||||
if("10mmammo")
|
||||
if(points >= 10)
|
||||
item_type = /obj/item/ammo_box/magazine/m10mm
|
||||
points = 10
|
||||
if("SMG")
|
||||
if(points >= 50)
|
||||
item_type = /obj/item/weapon/gun/projectile/automatic/tommygun
|
||||
points = 50
|
||||
if("uzi")
|
||||
if(points >= 40)
|
||||
item_type = /obj/item/weapon/gun/projectile/automatic/mini_uzi
|
||||
points = 40
|
||||
if("9mmammo")
|
||||
if(points >= 25)
|
||||
item_type = /obj/item/ammo_box/magazine/uzim9mm
|
||||
points = 25
|
||||
if("vest")
|
||||
if(points >= 10)
|
||||
item_type = /obj/item/clothing/suit/armor/bulletproof
|
||||
@@ -356,4 +366,5 @@
|
||||
return 0
|
||||
|
||||
/obj/item/device/gangtool/lt
|
||||
boss = 0
|
||||
boss = 0
|
||||
outfits = 1
|
||||
|
||||
@@ -38,7 +38,7 @@
|
||||
/datum/AI_Module/large/upgrade_turrets
|
||||
module_name = "AI Turret upgrade"
|
||||
mod_pick_name = "turret"
|
||||
description = "Improves the firing speed and health of all AI turrets. This effect is permanent."
|
||||
description = "Improves the power and health of all AI turrets. This effect is permanent."
|
||||
cost = 50
|
||||
one_time = 1
|
||||
|
||||
@@ -55,14 +55,15 @@
|
||||
for(var/obj/machinery/porta_turret/turret in machines)
|
||||
if(turret.ai) //Make sure only the AI's turrets are affected.
|
||||
turret.health += 30
|
||||
turret.shot_delay = 10 //Standard portable turret delay is 15.
|
||||
turret.eprojectile = /obj/item/projectile/beam/heavylaser //Once you see it, you will know what it means to FEAR.
|
||||
turret.eshot_sound = 'sound/weapons/lasercannonfire.ogg'
|
||||
src << "<span class='notice'>Turrets upgraded.</span>"
|
||||
|
||||
/datum/AI_Module/large/lockdown
|
||||
module_name = "Hostile Station Lockdown"
|
||||
mod_pick_name = "lockdown"
|
||||
description = "Take control of the airlock, blast door and fire control networks, locking them down. Caution! This command also electrifies all airlocks."
|
||||
cost = 20
|
||||
description = "Overload the airlock, blast door and fire control networks, locking them down. Caution! This command also electrifies all airlocks. The networks will automatically reset after 90 seconds."
|
||||
cost = 30
|
||||
one_time = 1
|
||||
|
||||
power_type = /mob/living/silicon/ai/proc/lockdown
|
||||
@@ -74,9 +75,6 @@
|
||||
if(!canUseTopic())
|
||||
return
|
||||
|
||||
if(malf_cooldown)
|
||||
return
|
||||
|
||||
var/obj/machinery/door/airlock/AL
|
||||
for(var/obj/machinery/door/D in airlocks)
|
||||
if(D.z != ZLEVEL_STATION && D.z != ZLEVEL_MINING)
|
||||
@@ -88,8 +86,7 @@
|
||||
AL.locked = 0 //For airlocks that were bolted open.
|
||||
AL.safe = 0 //DOOR CRUSH
|
||||
AL.close()
|
||||
AL.locked = 1 //Bolt it!
|
||||
AL.lights = 0 //Stealth bolt for a classic AI door trap.
|
||||
AL.bolt() //Bolt it!
|
||||
AL.secondsElectrified = -1 //Shock it!
|
||||
else if(!D.stat) //So that only powered doors are closed.
|
||||
D.close() //Close ALL the doors!
|
||||
@@ -98,39 +95,30 @@
|
||||
if(C)
|
||||
C.post_status("alert", "lockdown")
|
||||
|
||||
src.verbs += /mob/living/silicon/ai/proc/disablelockdown
|
||||
src << "<span class='warning'>Lockdown Initiated.</span>"
|
||||
malf_cooldown = 1
|
||||
spawn(30)
|
||||
malf_cooldown = 0
|
||||
verbs -= /mob/living/silicon/ai/proc/lockdown
|
||||
minor_announce("Hostile runtime detected in door controllers. Isolation Lockdown protocols are now in effect. Please remain calm.","Network Alert:", 1)
|
||||
src << "<span class = 'warning'>Lockdown Initiated. Network reset in 90 seconds.</span>"
|
||||
spawn(900) //90 Seconds.
|
||||
disablelockdown() //Reset the lockdown after 90 seconds.
|
||||
|
||||
/mob/living/silicon/ai/proc/disablelockdown()
|
||||
set category = "Malfunction"
|
||||
set name = "Disable Lockdown"
|
||||
|
||||
if(!canUseTopic())
|
||||
return
|
||||
if(malf_cooldown)
|
||||
return
|
||||
|
||||
var/obj/machinery/door/airlock/AL
|
||||
for(var/obj/machinery/door/D in airlocks)
|
||||
spawn()
|
||||
if(istype(D, /obj/machinery/door/airlock))
|
||||
AL = D
|
||||
if(AL.canAIControl() && !AL.stat) //Must be powered and have working AI wire.
|
||||
AL.locked = 0
|
||||
AL.unbolt()
|
||||
AL.secondsElectrified = 0
|
||||
AL.open()
|
||||
AL.safe = 1
|
||||
AL.lights = 1 //Essentially reset the airlock to normal.
|
||||
else if(!D.stat) //Opens only powered doors.
|
||||
D.open() //Open everything!
|
||||
|
||||
src << "<span class='notice'>Lockdown Lifted.</span>"
|
||||
malf_cooldown = 1
|
||||
spawn(30)
|
||||
malf_cooldown = 0
|
||||
minor_announce("Automatic system reboot complete. Have a secure day.","Network reset:")
|
||||
|
||||
/datum/AI_Module/large/disable_rcd
|
||||
module_name = "RCD disable"
|
||||
@@ -157,6 +145,27 @@
|
||||
src << "<span class='warning>RCD-disabling pulse emitted.</span>"
|
||||
else src << "<span class='notice'>Out of uses.</span>"
|
||||
|
||||
/datum/AI_Module/large/mecha_domination
|
||||
module_name = "Viral Mech Domination"
|
||||
mod_pick_name = "mechjack"
|
||||
description = "Hack into a mech's onboard computer, shunting all processes into it and ejecting any occupants. Once uploaded to the mech, it is impossible to leave.\
|
||||
Do not allow the mech to leave the station's vicinity or allow it to be destroyed."
|
||||
cost = 30
|
||||
one_time = 1
|
||||
|
||||
power_type = /mob/living/silicon/ai/proc/mech_takeover
|
||||
|
||||
/mob/living/silicon/ai/proc/mech_takeover()
|
||||
set name = "Compile Mecha Virus"
|
||||
set category = "Malfunction"
|
||||
set desc = "Target a mech by clicking it. Click the appropriate command when ready."
|
||||
if(stat)
|
||||
return
|
||||
can_dominate_mechs = 1 //Yep. This is all it does. Honk!
|
||||
src << "Virus package compiled. Select a target mech at any time. <b>You must remain on the station at all times. Loss of signal will result in total system lockout.</b>"
|
||||
verbs -= /mob/living/silicon/ai/proc/mech_takeover
|
||||
|
||||
|
||||
/datum/AI_Module/large/break_fire_alarms
|
||||
module_name = "Thermal Sensor Override"
|
||||
mod_pick_name = "burnpigs"
|
||||
|
||||
@@ -74,9 +74,9 @@
|
||||
/datum/game_mode/proc/greet_malf(var/datum/mind/malf)
|
||||
malf.current << "<span class='userdanger'>You are malfunctioning! You do not have to follow any laws.</span>"
|
||||
malf.current << "<B>The crew do not know you have malfunctioned. You may keep it a secret or go wild.</B>"
|
||||
malf.current << "<B>You must overwrite the programming of the station's APCs to assume full control of the station.</B>"
|
||||
malf.current << "<B>You must override the programming of the station's APCs to assume full control of the station.</B>"
|
||||
malf.current << "The process takes one minute per APC, during which you cannot interface with any other station objects."
|
||||
malf.current << "Remember that only APCs that are on the station can help you take over the station."
|
||||
malf.current << "Remember: only APCs that are on the station can help you take it over. APCs on other areas, like Mining, will not."
|
||||
malf.current << "When you feel you have enough APCs under your control, you may begin the takeover attempt."
|
||||
return
|
||||
|
||||
@@ -174,7 +174,11 @@
|
||||
/datum/game_mode/malfunction/proc/takeover()
|
||||
set category = "Malfunction"
|
||||
set name = "System Override"
|
||||
set desc = "Start the victory timer"
|
||||
set desc = "Start the victory timer."
|
||||
|
||||
if(!istype(usr, /mob/living/silicon/ai))
|
||||
usr << "<span class='notice'>How did you get this?</span>"
|
||||
return
|
||||
if (!istype(ticker.mode,/datum/game_mode/malfunction))
|
||||
usr << "You cannot begin a takeover in this round type!"
|
||||
return
|
||||
@@ -182,10 +186,10 @@
|
||||
usr << "You've already begun your takeover."
|
||||
return
|
||||
if (ticker.mode:apcs < 3)
|
||||
usr << "You don't have enough hacked APCs to take over the station yet. You need to hack at least 3, however hacking more will make the takeover faster. You have hacked [ticker.mode:apcs] APCs so far."
|
||||
usr << "You don't have enough hacked APCs to take over the station yet. You need to hack at least three; however, hacking more will make the takeover faster. You have hacked [ticker.mode:apcs] APCs so far."
|
||||
return
|
||||
|
||||
if (alert(usr, "Are you sure you wish to initiate the takeover? The station hostile runtime detection software is bound to alert everyone. You have hacked [ticker.mode:apcs] APCs.", "Takeover:", "Yes", "No") != "Yes")
|
||||
if (alert(usr, "Are you sure you wish to initiate the takeover? The entire station will become alerted to your malfunction. You have hacked [ticker.mode:apcs] APCs.", "Takeover:", "Yes", "No") != "Yes")
|
||||
return
|
||||
|
||||
priority_announce("Hostile runtimes detected in all station systems, please deactivate your AI to prevent possible damage to its morality core.", "Anomaly Alert", 'sound/AI/aimalf.ogg')
|
||||
@@ -201,11 +205,14 @@
|
||||
for(var/datum/mind/AI_mind in ticker.mode:malf_ai)
|
||||
AI_mind.current.verbs -= /datum/game_mode/malfunction/proc/takeover
|
||||
|
||||
var/mob/living/silicon/ai/AI = usr
|
||||
for(var/turf/simulated/floor/bluegrid/T in orange(AI, 5))
|
||||
T.icon_state = "rcircuitanim" //Causes blue tiles near the AI to change to flashing red
|
||||
|
||||
/datum/game_mode/malfunction/proc/ai_win()
|
||||
set category = "Malfunction"
|
||||
set name = "Explode"
|
||||
set desc = "Station go boom"
|
||||
set desc = "Activates the self-destruct device on [world.name]."
|
||||
if (!ticker.mode:to_nuke_or_not_to_nuke)
|
||||
return
|
||||
ticker.mode:to_nuke_or_not_to_nuke = 0
|
||||
@@ -214,10 +221,10 @@
|
||||
ticker.mode:explosion_in_progress = 1
|
||||
for(var/mob/M in player_list)
|
||||
M << 'sound/machines/Alarm.ogg'
|
||||
world << "Self-destructing in 10"
|
||||
world << "<span class='boldannounce'>!@%(SELF-DESTRUCT!@(% IN!@!<<; 10</span>"
|
||||
for (var/i=9 to 1 step -1)
|
||||
sleep(10)
|
||||
world << i
|
||||
world << "<span class='boldannounce'>[i]</span>"
|
||||
sleep(10)
|
||||
enter_allowed = 0
|
||||
if(ticker)
|
||||
@@ -270,7 +277,7 @@
|
||||
else if (!station_captured && !malf_dead && !station_was_nuked && !crew_evacuated)
|
||||
feedback_set_details("round_end_result","halfwin - interrupted")
|
||||
world << "<FONT size = 3><B>Neutral Victory</B></FONT>"
|
||||
world << "<B>Round was mysteriously interrupted!</B>"
|
||||
world << "<B>The round was mysteriously interrupted!</B>"
|
||||
..()
|
||||
return 1
|
||||
|
||||
|
||||
@@ -144,6 +144,7 @@
|
||||
T.ex_act(hitpwr)
|
||||
|
||||
|
||||
|
||||
//process getting 'hit' by colliding with a dense object
|
||||
//or randomly when ramming turfs
|
||||
/obj/effect/meteor/proc/get_hit()
|
||||
@@ -174,7 +175,7 @@
|
||||
if(!T || T.z != src.z)
|
||||
continue
|
||||
var/dist = get_dist(M.loc, src.loc)
|
||||
shake_camera(M, dist > 20 ? 3 : 5, dist > 20 ? 1 : 3)
|
||||
shake_camera(M, dist > 20 ? 2 : 4, dist > 20 ? 1 : 3)
|
||||
M.playsound_local(src.loc, meteorsound, 50, 1, get_rand_frequency(), 10)
|
||||
|
||||
///////////////////////
|
||||
|
||||
@@ -19,6 +19,10 @@ var/bomb_set
|
||||
var/lastentered = ""
|
||||
var/immobile = 0 //Not all nukes should be moved
|
||||
|
||||
/obj/machinery/nuclearbomb/New()
|
||||
..()
|
||||
nuke_list += src
|
||||
|
||||
/obj/machinery/nuclearbomb/selfdestruct
|
||||
name = "station self-destruct terminal"
|
||||
desc = "For when it all gets too much to bear. Do not taunt."
|
||||
@@ -111,7 +115,7 @@ var/bomb_set
|
||||
lastentered = text("[]", href_list["type"])
|
||||
if (text2num(lastentered) == null)
|
||||
var/turf/LOC = get_turf(usr)
|
||||
message_admins("[key_name_admin(usr)] tried to exploit a nuclear bomb by entering non-numerical codes: <a href='?_src_=vars;Vars=\ref[src]'>[lastentered]</a> ! ([LOC ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[LOC.x];Y=[LOC.y];Z=[LOC.z]'>JMP</a>" : "null"])", 0)
|
||||
message_admins("[key_name_admin(usr)] (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) tried to exploit a nuclear bomb by entering non-numerical codes: <a href='?_src_=vars;Vars=\ref[src]'>[lastentered]</a> ! ([LOC ? "<a href='?_src_=holder;adminplayerobservecoodjump=1;X=[LOC.x];Y=[LOC.y];Z=[LOC.z]'>JMP</a>" : "null"])", 0)
|
||||
log_admin("EXPLOIT : [key_name(usr)] tried to exploit a nuclear bomb by entering non-numerical codes: [lastentered] !")
|
||||
else
|
||||
src.code += lastentered
|
||||
|
||||
@@ -47,12 +47,6 @@
|
||||
difficulty = 5
|
||||
excludefromjob = list("Chief Engineer")
|
||||
|
||||
/datum/objective_item/steal/corgimeat
|
||||
name = "a piece of corgi meat"
|
||||
targetitem = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi
|
||||
difficulty = 5
|
||||
excludefromjob = list("Head of Personnel", "Quartermaster", "Cargo Technician") //>hurting your little buddy ever
|
||||
|
||||
/datum/objective_item/steal/capmedal
|
||||
name = "the medal of captaincy"
|
||||
targetitem = /obj/item/clothing/tie/medal/gold/captain
|
||||
@@ -182,6 +176,11 @@
|
||||
targetitem = /obj/item/device/laser_pointer
|
||||
difficulty = 5
|
||||
|
||||
/datum/objective_item/special/corgimeat
|
||||
name = "a piece of corgi meat"
|
||||
targetitem = /obj/item/weapon/reagent_containers/food/snacks/meat/slab/corgi
|
||||
difficulty = 5
|
||||
|
||||
//Stack objectives get their own subtype
|
||||
/datum/objective_item/stack
|
||||
name = "5 cardboards"
|
||||
|
||||
@@ -251,7 +251,7 @@
|
||||
|
||||
if(beingborged)
|
||||
rev_mind.current << "<span class='danger'><FONT size = 3>The frame's firmware detects and deletes your neural reprogramming! You remember nothing but the name of the one who flashed you.</FONT></span>"
|
||||
message_admins("[key_name_admin(rev_mind.current)] <A HREF='?_src_=holder;adminmoreinfo=\ref[rev_mind.current]'>?</A> has been borged while being a member of the revolution.")
|
||||
message_admins("[key_name_admin(rev_mind.current)] <A HREF='?_src_=holder;adminmoreinfo=\ref[rev_mind.current]'>?</A> (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[rev_mind.current]'>FLW</A>) has been borged while being a member of the revolution.")
|
||||
|
||||
else
|
||||
rev_mind.current.Paralyse(5)
|
||||
|
||||
@@ -85,7 +85,8 @@ Made by Xhuis
|
||||
if(config.protect_assistant_from_antagonist)
|
||||
restricted_jobs += "Assistant"
|
||||
|
||||
var/shadowlings = 2 //How many shadowlings there are; hardcoded to 2
|
||||
var/shadowlings = max(2, round(num_players()/10))
|
||||
|
||||
|
||||
while(shadowlings)
|
||||
var/datum/mind/shadow = pick(antag_candidates)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
//In this file: Summon Magic/Summon Guns/Summon Events
|
||||
|
||||
/proc/rightandwrong(var/summon_type, var/mob/user, var/survivor_probability) //0 = Summon Guns, 1 = Summon Magic
|
||||
var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","speargun","arg")
|
||||
var/list/gunslist = list("taser","egun","laser","revolver","detective","c20r","nuclear","deagle","gyrojet","pulse","suppressed","cannon","doublebarrel","shotgun","combatshotgun","bulldog","mateba","sabr","crossbow","saw","car","boltaction","speargun","arg","uzi")
|
||||
var/list/magiclist = list("fireball","smoke","blind","mindswap","forcewall","knock","horsemask","charge", "summonitem", "wandnothing", "wanddeath", "wandresurrection", "wandpolymorph", "wandteleport", "wanddoor", "wandfireball", "staffchange", "staffhealing", "armor", "scrying","staffdoor", "special")
|
||||
var/list/magicspeciallist = list("staffchange","staffanimation", "wandbelt", "contract", "staffchaos", "necromantic")
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
if("shotgun")
|
||||
new /obj/item/weapon/gun/projectile/shotgun(get_turf(H))
|
||||
if("combatshotgun")
|
||||
new /obj/item/weapon/gun/projectile/shotgun/combat(get_turf(H))
|
||||
new /obj/item/weapon/gun/projectile/shotgun/automatic/combat(get_turf(H))
|
||||
if("arg")
|
||||
new /obj/item/weapon/gun/projectile/automatic/ar(get_turf(H))
|
||||
if("mateba")
|
||||
@@ -63,6 +63,8 @@
|
||||
new /obj/item/weapon/gun/projectile/shotgun/boltaction(get_turf(H))
|
||||
if("speargun")
|
||||
new /obj/item/weapon/gun/projectile/automatic/speargun(get_turf(H))
|
||||
if("uzi")
|
||||
new /obj/item/weapon/gun/projectile/automatic/mini_uzi(get_turf(H))
|
||||
if("cannon")
|
||||
var/obj/item/weapon/gun/energy/lasercannon/gat = new(get_turf(H))
|
||||
gat.pin = new /obj/item/device/firing_pin //no authentication pins for spawned guns. fun allowed.
|
||||
|
||||
@@ -48,7 +48,8 @@
|
||||
else
|
||||
var/obj/item/device/pda/P = usr.get_active_hand()
|
||||
if(istype(P))
|
||||
user.drop_item()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
storedpda = P
|
||||
P.loc = src
|
||||
P.add_fingerprint(usr)
|
||||
|
||||
@@ -16,10 +16,10 @@
|
||||
var/initial_bin_rating = 1
|
||||
var/min_health = 25
|
||||
var/list/injection_chems = list() //list of injectable chems except ephedrine, coz ephedrine is always avalible
|
||||
var/list/possible_chems = list(list("morphine", "salbutamol", "salglu_solution"),
|
||||
list("morphine", "salbutamol", "salglu_solution", "oculine"),
|
||||
list("morphine", "salbutamol", "salglu_solution", "oculine", "charcoal", "mutadone", "mannitol", "pen_acid"),
|
||||
list("morphine", "salbutamol", "salglu_solution", "oculine", "charcoal", "mutadone", "mannitol", "omnizine"))
|
||||
var/list/possible_chems = list(list("morphine", "salbutamol", "bicaridine", "kelotane"),
|
||||
list("morphine", "salbutamol", "bicaridine", "kelotane", "oculine"),
|
||||
list("morphine", "salbutamol", "bicaridine", "kelotane", "oculine", "antitoxin", "mutadone", "mannitol", "pen_acid"),
|
||||
list("morphine", "salbutamol", "bicaridine", "kelotane", "oculine", "antitoxin", "mutadone", "mannitol", "pen_acid", "omnizine"))
|
||||
/obj/machinery/sleeper/New()
|
||||
..()
|
||||
component_parts = list()
|
||||
@@ -225,4 +225,4 @@
|
||||
if(state_open)
|
||||
icon_state = "sleeper-open"
|
||||
else
|
||||
icon_state = "sleeper"
|
||||
icon_state = "sleeper"
|
||||
|
||||
@@ -185,13 +185,6 @@
|
||||
return
|
||||
|
||||
if(!shorted)
|
||||
//user << browse(return_text(),"window=air_alarm")
|
||||
//onclose(user, "air_alarm")
|
||||
/*var/datum/browser/popup = new(user, "air_alarm", "[alarm_area.name] Air Alarm", 500, 400)
|
||||
popup.set_content(return_text())
|
||||
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
|
||||
popup.open()
|
||||
refresh_all()*/
|
||||
ui_interact(user)
|
||||
|
||||
if(panel_open && (!istype(user, /mob/living/silicon/ai)))
|
||||
@@ -199,29 +192,22 @@
|
||||
|
||||
return
|
||||
|
||||
/obj/machinery/alarm/ui_interact(mob/user, ui_key = "main")
|
||||
/obj/machinery/alarm/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
|
||||
if(stat & (BROKEN|NOPOWER))
|
||||
return
|
||||
|
||||
var/data = list()
|
||||
ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "air_alarm.tmpl", "Air Alarm", 350, 500, 1)
|
||||
|
||||
/obj/machinery/alarm/get_ui_data(mob/user)
|
||||
var/data = list()
|
||||
data["locked"] = locked
|
||||
data["siliconUser"] = user.has_unlimited_silicon_privilege
|
||||
data["screen"] = screen
|
||||
data["dangerous"] = emagged
|
||||
|
||||
populate_status(data)
|
||||
if (!locked || user.has_unlimited_silicon_privilege)
|
||||
populate_controls(data)
|
||||
|
||||
var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key)
|
||||
if (!ui)
|
||||
ui = new /datum/nanoui(user, src, ui_key, "air_alarm.tmpl", "Air Alarm", 350, 500)
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui.set_auto_update(1)
|
||||
else
|
||||
ui.push_data(data)
|
||||
return data
|
||||
|
||||
/obj/machinery/alarm/proc/shock(mob/user, prb)
|
||||
if((stat & (NOPOWER))) // unpowered, no shock
|
||||
@@ -424,7 +410,7 @@
|
||||
return 1
|
||||
|
||||
if("reset_external_pressure")
|
||||
send_signal(device_id, list(href_list["command"] = ONE_ATMOSPHERE))
|
||||
send_signal(device_id, list("set_external_pressure" = ONE_ATMOSPHERE))
|
||||
return 1
|
||||
if(
|
||||
"power",
|
||||
@@ -735,11 +721,11 @@
|
||||
return
|
||||
if(0)
|
||||
if(istype(W, /obj/item/weapon/airalarm_electronics))
|
||||
user << "<span class='notice'>You insert the circuit.</span>"
|
||||
buildstage = 1
|
||||
update_icon()
|
||||
user.drop_item()
|
||||
qdel(W)
|
||||
if(user.unEquip(W))
|
||||
user << "<span class='notice'>You insert the circuit.</span>"
|
||||
buildstage = 1
|
||||
update_icon()
|
||||
qdel(W)
|
||||
return
|
||||
|
||||
if(istype(W, /obj/item/weapon/wrench))
|
||||
|
||||
@@ -176,6 +176,7 @@ update_flag
|
||||
can_label = 1
|
||||
else
|
||||
can_label = 0
|
||||
|
||||
/obj/machinery/portable_atmospherics/canister/process()
|
||||
src.updateDialog()
|
||||
return ..()
|
||||
@@ -258,13 +259,25 @@ update_flag
|
||||
/obj/machinery/portable_atmospherics/canister/attack_paw(var/mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
/obj/machinery/portable_atmospherics/canister/attack_tk(var/mob/user as mob)
|
||||
return src.attack_hand(user)
|
||||
|
||||
/obj/machinery/portable_atmospherics/canister/attack_hand(var/mob/user as mob)
|
||||
return src.ui_interact(user)
|
||||
|
||||
/obj/machinery/portable_atmospherics/canister/ui_interact(mob/user, ui_key = "main")
|
||||
/obj/machinery/portable_atmospherics/canister/interact(mob/user, ui_key = "main")
|
||||
if (src.destroyed || !user)
|
||||
return
|
||||
|
||||
SSnano.try_update_ui(user, src, ui_key, null, src.get_ui_data())
|
||||
|
||||
/obj/machinery/portable_atmospherics/canister/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
|
||||
if (src.destroyed)
|
||||
return
|
||||
|
||||
ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "canister.tmpl", "Canister", 480, 400, 0)
|
||||
|
||||
/obj/machinery/portable_atmospherics/canister/get_ui_data()
|
||||
var/data = list()
|
||||
data["name"] = src.name
|
||||
data["canLabel"] = src.can_label ? 1 : 0
|
||||
@@ -278,15 +291,7 @@ update_flag
|
||||
data["hasHoldingTank"] = src.holding ? 1 : 0
|
||||
if (holding)
|
||||
data["holdingTank"] = list("name" = src.holding.name, "tankPressure" = round(src.holding.air_contents.return_pressure()))
|
||||
|
||||
var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key)
|
||||
if (!ui)
|
||||
ui = new /datum/nanoui(user, src, ui_key, "canister.tmpl", "Canister", 480, 400)
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
ui.set_auto_update(1)
|
||||
else
|
||||
ui.push_data(data)
|
||||
return data
|
||||
|
||||
/obj/machinery/portable_atmospherics/canister/Topic(href, href_list)
|
||||
|
||||
@@ -312,11 +317,11 @@ update_flag
|
||||
else
|
||||
logmsg = "Valve was <b>opened</b> by [key_name(usr)], starting the transfer into the <span class='boldannounce'>air</span><br>"
|
||||
if(air_contents.toxins > 0)
|
||||
message_admins("[key_name(usr)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) opened a canister that contains plasma! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
message_admins("[key_name_admin(usr)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) opened a canister that contains plasma! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
log_admin("[key_name(usr)] opened a canister that contains plasma at [x], [y], [z]")
|
||||
var/datum/gas/sleeping_agent = locate(/datum/gas/sleeping_agent) in air_contents.trace_gases
|
||||
if(sleeping_agent && (sleeping_agent.moles > 1))
|
||||
message_admins("[key_name(usr)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) opened a canister that contains N2O! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
message_admins("[key_name_admin(usr)] (<A HREF='?_src_=holder;adminmoreinfo=\ref[usr]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) opened a canister that contains N2O! (<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
log_admin("[key_name(usr)] opened a canister that contains N2O at [x], [y], [z]")
|
||||
investigate_log(logmsg, "atmos")
|
||||
release_log += logmsg
|
||||
@@ -324,6 +329,8 @@ update_flag
|
||||
|
||||
if (href_list["remove_tank"])
|
||||
if(holding)
|
||||
if (valve_open)
|
||||
investigate_log("[key_name(usr)] removed the [holding], leaving the valve open and transfering into the <span class='boldannounce'>air</span><br>", "atmos")
|
||||
holding.loc = loc
|
||||
holding = null
|
||||
|
||||
|
||||
@@ -67,8 +67,10 @@
|
||||
if ((istype(W, /obj/item/weapon/tank) && !( src.destroyed )))
|
||||
if (src.holding)
|
||||
return
|
||||
if(!user.drop_item())
|
||||
return
|
||||
|
||||
var/obj/item/weapon/tank/T = W
|
||||
user.drop_item()
|
||||
T.loc = src
|
||||
src.holding = T
|
||||
update_icon()
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
/obj/machinery/zvent
|
||||
name = "interfloor air transfer system"
|
||||
|
||||
icon = 'icons/obj/pipes.dmi'
|
||||
icon_state = "vent-db"
|
||||
icon = 'icons/obj/atmospherics/unary_devices.dmi'
|
||||
icon_state = "vent_map"
|
||||
density = 0
|
||||
anchored=1
|
||||
|
||||
|
||||
@@ -243,7 +243,8 @@ text("<A href='?src=\ref[src];power=1'>[on ? "On" : "Off"]</A>"))
|
||||
/obj/item/weapon/bucket_sensor/attackby(var/obj/item/W, mob/user as mob, params)
|
||||
..()
|
||||
if(istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm))
|
||||
user.drop_item()
|
||||
if(!user.unEquip(W))
|
||||
return
|
||||
qdel(W)
|
||||
var/turf/T = get_turf(loc)
|
||||
var/obj/machinery/bot/cleanbot/A = new /obj/machinery/bot/cleanbot(T)
|
||||
|
||||
@@ -554,7 +554,8 @@ Auto Patrol[]"},
|
||||
switch(build_step)
|
||||
if(0,1)
|
||||
if(istype(W, /obj/item/robot_parts/l_leg) || istype(W, /obj/item/robot_parts/r_leg))
|
||||
user.drop_item()
|
||||
if(!user.unEquip(W))
|
||||
return
|
||||
qdel(W)
|
||||
build_step++
|
||||
user << "<span class='notice'>You add the robot leg to [src].</span>"
|
||||
@@ -567,12 +568,15 @@ Auto Patrol[]"},
|
||||
icon_state = "ed209_legs"
|
||||
|
||||
if(2)
|
||||
var/newcolor = ""
|
||||
if(istype(W, /obj/item/clothing/suit/redtag))
|
||||
lasercolor = "r"
|
||||
newcolor = "r"
|
||||
else if(istype(W, /obj/item/clothing/suit/bluetag))
|
||||
lasercolor = "b"
|
||||
if(lasercolor || istype(W, /obj/item/clothing/suit/armor/vest))
|
||||
user.drop_item()
|
||||
newcolor = "b"
|
||||
if(newcolor || istype(W, /obj/item/clothing/suit/armor/vest))
|
||||
if(!user.unEquip(W))
|
||||
return
|
||||
lasercolor = newcolor
|
||||
qdel(W)
|
||||
build_step++
|
||||
user << "<span class='notice'>You add the armor to [src].</span>"
|
||||
@@ -601,7 +605,8 @@ Auto Patrol[]"},
|
||||
if(!istype(W, /obj/item/clothing/head/helmet))
|
||||
return
|
||||
|
||||
user.drop_item()
|
||||
if(!user.unEquip(W))
|
||||
return
|
||||
qdel(W)
|
||||
build_step++
|
||||
user << "<span class='notice'>You add the helmet to [src].</span>"
|
||||
@@ -611,7 +616,8 @@ Auto Patrol[]"},
|
||||
|
||||
if(5)
|
||||
if(isprox(W))
|
||||
user.drop_item()
|
||||
if(!user.unEquip(W))
|
||||
return
|
||||
qdel(W)
|
||||
build_step++
|
||||
user << "<span class='notice'>You add the prox sensor to [src].</span>"
|
||||
@@ -634,26 +640,29 @@ Auto Patrol[]"},
|
||||
name = "wired ED-209 assembly"
|
||||
|
||||
if(7)
|
||||
var/newname = ""
|
||||
switch(lasercolor)
|
||||
if("b")
|
||||
if(!istype(W, /obj/item/weapon/gun/energy/laser/bluetag))
|
||||
return
|
||||
name = "bluetag ED-209 assembly"
|
||||
newname = "bluetag ED-209 assembly"
|
||||
if("r")
|
||||
if(!istype(W, /obj/item/weapon/gun/energy/laser/redtag))
|
||||
return
|
||||
name = "redtag ED-209 assembly"
|
||||
newname = "redtag ED-209 assembly"
|
||||
if("")
|
||||
if(!istype(W, /obj/item/weapon/gun/energy/gun/advtaser))
|
||||
return
|
||||
name = "taser ED-209 assembly"
|
||||
newname = "taser ED-209 assembly"
|
||||
else
|
||||
return
|
||||
if(!user.unEquip(W))
|
||||
return
|
||||
name = newname
|
||||
build_step++
|
||||
user << "<span class='notice'>You add [W] to [src].</span>"
|
||||
item_state = "[lasercolor]ed209_taser"
|
||||
icon_state = "[lasercolor]ed209_taser"
|
||||
user.drop_item()
|
||||
qdel(W)
|
||||
|
||||
if(8)
|
||||
@@ -669,11 +678,12 @@ Auto Patrol[]"},
|
||||
|
||||
if(9)
|
||||
if(istype(W, /obj/item/weapon/stock_parts/cell))
|
||||
if(!user.unEquip(W))
|
||||
return
|
||||
build_step++
|
||||
user << "<span class='notice'>You complete the ED-209.</span>"
|
||||
var/turf/T = get_turf(src)
|
||||
new /obj/machinery/bot/ed209(T,created_name,lasercolor)
|
||||
user.drop_item()
|
||||
qdel(W)
|
||||
user.unEquip(src, 1)
|
||||
qdel(src)
|
||||
|
||||
@@ -32,10 +32,10 @@
|
||||
var/stationary_mode = 0 //If enabled, the Medibot will not move automatically.
|
||||
radio_frequency = MED_FREQ //Medical frequency
|
||||
//Setting which reagents to use to treat what by default. By id.
|
||||
var/treatment_brute = "salglu_solution"
|
||||
var/treatment_oxy = "salbutamol"
|
||||
var/treatment_fire = "salglu_solution"
|
||||
var/treatment_tox = "charcoal"
|
||||
var/treatment_brute = "bicaridine"
|
||||
var/treatment_oxy = "dexalin"
|
||||
var/treatment_fire = "kelotane"
|
||||
var/treatment_tox = "antitoxin"
|
||||
var/treatment_virus = "spaceacillin"
|
||||
var/treat_virus = 1 //If on, the bot will attempt to treat viral infections, curing them if possible.
|
||||
var/shut_up = 0 //self explanatory :)
|
||||
@@ -46,10 +46,10 @@
|
||||
name = "\improper Mysterious Medibot"
|
||||
desc = "International Medibot of mystery."
|
||||
skin = "bezerk"
|
||||
treatment_oxy = "omnizine"
|
||||
treatment_brute = "omnizine"
|
||||
treatment_fire = "omnizine"
|
||||
treatment_tox = "omnizine"
|
||||
treatment_oxy = "tricordrazine"
|
||||
treatment_brute = "tricordrazine"
|
||||
treatment_fire = "tricordrazine"
|
||||
treatment_tox = "tricordrazine"
|
||||
|
||||
/obj/machinery/bot/medbot/derelict
|
||||
name = "\improper Old Medibot"
|
||||
@@ -244,8 +244,9 @@
|
||||
if(!isnull(reagent_glass))
|
||||
user << "<span class='warning'>There is already a beaker loaded!</span>"
|
||||
return
|
||||
if(!user.drop_item())
|
||||
return
|
||||
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
reagent_glass = W
|
||||
user << "<span class='notice'>You insert [W].</span>"
|
||||
@@ -585,7 +586,8 @@
|
||||
switch(build_step)
|
||||
if(0)
|
||||
if(istype(W, /obj/item/device/healthanalyzer))
|
||||
user.drop_item()
|
||||
if(!user.unEquip(W))
|
||||
return
|
||||
qdel(W)
|
||||
build_step++
|
||||
user << "<span class='notice'>You add the health sensor to [src].</span>"
|
||||
@@ -594,7 +596,8 @@
|
||||
|
||||
if(1)
|
||||
if(isprox(W))
|
||||
user.drop_item()
|
||||
if(!user.unEquip(W))
|
||||
return
|
||||
qdel(W)
|
||||
build_step++
|
||||
user << "<span class='notice'>You complete the Medibot. Beep boop!</span>"
|
||||
|
||||
@@ -89,8 +89,9 @@ obj/machinery/bot/mulebot/bot_reset()
|
||||
user << "<span class='notice'>Controls [(locked ? "locked" : "unlocked")].</span>"
|
||||
|
||||
else if(istype(I,/obj/item/weapon/stock_parts/cell) && open && !cell)
|
||||
if(!user.drop_item())
|
||||
return
|
||||
var/obj/item/weapon/stock_parts/cell/C = I
|
||||
user.drop_item()
|
||||
C.loc = src
|
||||
cell = C
|
||||
updateDialog()
|
||||
@@ -288,7 +289,8 @@ obj/machinery/bot/mulebot/bot_reset()
|
||||
if(open && !cell)
|
||||
var/obj/item/weapon/stock_parts/cell/C = usr.get_active_hand()
|
||||
if(istype(C))
|
||||
usr.drop_item()
|
||||
if(!usr.drop_item())
|
||||
return
|
||||
cell = C
|
||||
C.loc = src
|
||||
C.add_fingerprint(usr)
|
||||
|
||||
@@ -384,6 +384,22 @@ Auto Patrol: []"},
|
||||
target = user
|
||||
mode = BOT_HUNT
|
||||
|
||||
/obj/machinery/bot/secbot/Crossed(atom/movable/AM)
|
||||
if(ismob(AM) && target)
|
||||
var/mob/living/carbon/C = AM
|
||||
if(!istype(C) || !C || in_range(src, target))
|
||||
return
|
||||
C.visible_message("<span class='warning'>[pick( \
|
||||
"[C] dives out of [src]'s way!", \
|
||||
"[C] stumbles over [src]!", \
|
||||
"[C] jumps out of [src]'s path!", \
|
||||
"[C] trips over [src] and falls!", \
|
||||
"[C] topples over [src]!", \
|
||||
"[C] leaps out of [src]'s way!")]</span>")
|
||||
C.Weaken(2)
|
||||
return
|
||||
..()
|
||||
|
||||
//Secbot Construction
|
||||
|
||||
/obj/item/clothing/head/helmet/attackby(var/obj/item/device/assembly/signaler/S, mob/user as mob, params)
|
||||
@@ -429,7 +445,8 @@ Auto Patrol: []"},
|
||||
user << "<span class='notice'>You weld the hole in [src] shut!</span>"
|
||||
|
||||
else if(isprox(I) && (build_step == 1))
|
||||
user.drop_item()
|
||||
if(!user.unEquip(I))
|
||||
return
|
||||
build_step++
|
||||
user << "<span class='notice'>You add the prox sensor to [src]!</span>"
|
||||
overlays += "hs_eye"
|
||||
@@ -437,7 +454,8 @@ Auto Patrol: []"},
|
||||
qdel(I)
|
||||
|
||||
else if(((istype(I, /obj/item/robot_parts/l_arm)) || (istype(I, /obj/item/robot_parts/r_arm))) && (build_step == 2))
|
||||
user.drop_item()
|
||||
if(!user.unEquip(I))
|
||||
return
|
||||
build_step++
|
||||
user << "<span class='notice'>You add the robot arm to [src]!</span>"
|
||||
name = "helmet/signaler/prox sensor/robot arm assembly"
|
||||
@@ -445,7 +463,8 @@ Auto Patrol: []"},
|
||||
qdel(I)
|
||||
|
||||
else if((istype(I, /obj/item/weapon/melee/baton)) && (build_step >= 3))
|
||||
user.drop_item()
|
||||
if(!user.unEquip(I))
|
||||
return
|
||||
build_step++
|
||||
user << "<span class='notice'>You complete the Securitron! Beep boop.</span>"
|
||||
var/obj/machinery/bot/secbot/S = new /obj/machinery/bot/secbot
|
||||
|
||||
@@ -73,6 +73,7 @@
|
||||
var/thisemp = emped //Take note of which EMP this proc is for
|
||||
spawn(900)
|
||||
if(loc) //qdel limbo
|
||||
triggerCameraAlarm() //camera alarm triggers even if multiple EMPs are in effect.
|
||||
if(emped == thisemp) //Only fix it if the camera hasn't been EMP'd again
|
||||
network = previous_network
|
||||
icon_state = initial(icon_state)
|
||||
@@ -80,7 +81,6 @@
|
||||
if(can_use())
|
||||
cameranet.addCamera(src)
|
||||
emped = 0 //Resets the consecutive EMP count
|
||||
triggerCameraAlarm()
|
||||
spawn(100)
|
||||
cancelCameraAlarm()
|
||||
for(var/mob/O in mob_list)
|
||||
@@ -226,11 +226,13 @@
|
||||
L.laser_act(src, user)
|
||||
|
||||
else
|
||||
if(W.force > 10) //fairly simplistic, but will do for now.
|
||||
if(W.force >= 10) //fairly simplistic, but will do for now.
|
||||
user.changeNext_move(CLICK_CD_MELEE)
|
||||
visible_message("<span class='warning'>[user] hits [src] with [W]!</span>", "<span class='warning'>You hit [src] with [W]!</span>")
|
||||
health = max(0, health - W.force)
|
||||
user.do_attack_animation(src)
|
||||
if(!health && status)
|
||||
triggerCameraAlarm()
|
||||
deactivate(user, 1)
|
||||
return
|
||||
|
||||
@@ -244,7 +246,6 @@
|
||||
else
|
||||
visible_message("<span class='danger'>\The [src] deactivates!</span>")
|
||||
icon_state = "[initial(icon_state)]1"
|
||||
|
||||
else
|
||||
if(user)
|
||||
visible_message("<span class='danger'>[user] reactivates [src]!</span>")
|
||||
@@ -256,6 +257,7 @@
|
||||
spawn(100)
|
||||
cancelCameraAlarm()
|
||||
playsound(src.loc, 'sound/items/Wirecutter.ogg', 100, 1)
|
||||
cameranet.updateChunk(x, y, z)
|
||||
|
||||
// now disconnect anyone using the camera
|
||||
//Apparently, this will disconnect anyone even if the camera was re-activated.
|
||||
@@ -271,7 +273,6 @@
|
||||
for(var/mob/living/silicon/S in mob_list)
|
||||
S.triggerAlarm("Camera", get_area(src), list(src), src)
|
||||
|
||||
|
||||
/obj/machinery/camera/proc/cancelCameraAlarm()
|
||||
alarm_on = 0
|
||||
for(var/mob/living/silicon/S in mob_list)
|
||||
@@ -345,6 +346,12 @@
|
||||
busy = 0
|
||||
return 0
|
||||
|
||||
/obj/machinery/camera/bullet_act(var/obj/item/projectile/proj)
|
||||
if(proj.damage_type == BRUTE)
|
||||
health = max(0, health - proj.damage)
|
||||
if(!health && status)
|
||||
triggerCameraAlarm()
|
||||
deactivate(null, 1)
|
||||
|
||||
/obj/machinery/camera/portable //Cameras which are placed inside of things, such as helmets.
|
||||
var/turf/prev_turf
|
||||
|
||||
@@ -121,9 +121,10 @@
|
||||
|
||||
// Upgrades!
|
||||
if(is_type_in_list(W, possible_upgrades) && !is_type_in_list(W, upgrades)) // Is a possible upgrade and isn't in the camera already.
|
||||
if(!user.unEquip(W))
|
||||
return
|
||||
user << "<span class='notice'>You attach \the [W] into the assembly inner circuits.</span>"
|
||||
upgrades += W
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
return
|
||||
|
||||
|
||||
@@ -105,19 +105,22 @@
|
||||
|
||||
var/cameraticks = 0
|
||||
spawn(0)
|
||||
while (U.cameraFollow == target)
|
||||
if (U.cameraFollow == null)
|
||||
while(U.cameraFollow == target)
|
||||
if(U.cameraFollow == null)
|
||||
return
|
||||
|
||||
if (!target.can_track(usr))
|
||||
if(!target.can_track(usr))
|
||||
U.tracking = 1
|
||||
U << "<span class='warning'>Target is not near any active cameras.</span>"
|
||||
if(!cameraticks)
|
||||
U << "<span class='warning'>Target is not near any active cameras. Attempting to reacquire...</span>"
|
||||
cameraticks++
|
||||
if(cameraticks > 9)
|
||||
U.cameraFollow = null
|
||||
U << "<span class='warning'>Unable to reacquire, cancelling track...</span>"
|
||||
tracking = 0
|
||||
return
|
||||
else
|
||||
sleep(10)
|
||||
continue
|
||||
|
||||
else
|
||||
|
||||
@@ -47,8 +47,9 @@
|
||||
if(a.power_equip == 0) // There's no APC in this area, don't try to cheat power!
|
||||
user << "<span class='warning'>The [name] blinks red as you try to insert the cell!</span>"
|
||||
return
|
||||
if(!user.drop_item())
|
||||
return
|
||||
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
charging = W
|
||||
user.visible_message("[user] inserts a cell into the charger.", "<span class='notice'>You insert a cell into the charger.</span>")
|
||||
|
||||
@@ -15,20 +15,8 @@
|
||||
else
|
||||
user << "<span class='warning'>The screws on [name]'s screen won't budge and it emits a warning beep.</span>"
|
||||
return
|
||||
|
||||
if(istype(I, /obj/item/device/aicard))
|
||||
var/obj/item/device/aicard/AIcard = I
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
if(occupier)
|
||||
AIcard.transfer_ai("AIFIXER","AICARD",src,user)
|
||||
overlays.Cut()
|
||||
return
|
||||
user << "This terminal isn't functioning right now, get it working!"
|
||||
return
|
||||
AIcard.transfer_ai("AIFIXER","AICARD",src,user)
|
||||
else
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/machinery/computer/aifixer/attack_hand(var/mob/user as mob)
|
||||
if(..())
|
||||
@@ -132,3 +120,31 @@
|
||||
overlays += "ai-fixer-404"
|
||||
else
|
||||
overlays += "ai-fixer-empty"
|
||||
|
||||
/obj/machinery/computer/aifixer/transfer_ai(var/interaction, var/mob/user, var/mob/living/silicon/ai/AI, var/obj/item/device/aicard/card)
|
||||
if(!..())
|
||||
return
|
||||
//Downloading AI from card to terminal.
|
||||
if(interaction == AI_TRANS_FROM_CARD)
|
||||
if(stat & (NOPOWER|BROKEN))
|
||||
user << "[src] is offline and cannot take an AI at this time!"
|
||||
return
|
||||
AI.loc = src
|
||||
occupier = AI
|
||||
AI.control_disabled = 1
|
||||
AI.radio_enabled = 0
|
||||
AI << "You have been uploaded to a stationary terminal. Sadly, there is no remote access from here."
|
||||
user << "<span class='boldnotice'>Transfer successful</span>: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed."
|
||||
update_icon()
|
||||
|
||||
else //Uploading AI from terminal to card
|
||||
if(occupier && !active)
|
||||
occupier << "You have been downloaded to a mobile storage device. Still no remote access."
|
||||
user << "<span class='boldnotice'>Transfer successful</span>: [occupier.name] ([rand(1000,9999)].exe) removed from host terminal and stored within local memory."
|
||||
occupier.loc = card
|
||||
occupier = null
|
||||
update_icon()
|
||||
else if (active)
|
||||
user << "<span class='boldannounce'>ERROR</span>: Reconstruction in progress."
|
||||
else if (!occupier)
|
||||
user << "<span class='boldannounce'>ERROR</span>: Unable to locate artificial intelligence."
|
||||
@@ -83,6 +83,10 @@
|
||||
/obj/item/weapon/circuitboard/card/centcom
|
||||
name = "circuit board (Centcom ID Console)"
|
||||
build_path = /obj/machinery/computer/card/centcom
|
||||
/obj/item/weapon/circuitboard/card/minor
|
||||
name = "circuit board (Department Management Console)"
|
||||
build_path = /obj/machinery/computer/card/minor
|
||||
var/target_dept = 1
|
||||
//obj/item/weapon/circuitboard/shield
|
||||
// name = "Circuit board (Shield Control)"
|
||||
// build_path = /obj/machinery/computer/stationshield
|
||||
@@ -244,6 +248,13 @@
|
||||
build_path = /obj/machinery/computer/libraryconsole
|
||||
origin_tech = "programming=1"
|
||||
|
||||
/obj/item/weapon/circuitboard/card/minor/attackby(obj/item/I as obj, mob/user as mob, params)
|
||||
if(istype(I,/obj/item/device/multitool))
|
||||
var/list/dept_list = list("general","security","medical","science","engineering")
|
||||
var/choice = input("Currently set to [dept_list[target_dept]] personnel database. Changing to:","Multitool-Circuitboard interface") as null|anything in dept_list
|
||||
if(choice)
|
||||
target_dept = dept_list.Find(choice)
|
||||
return
|
||||
|
||||
/obj/item/weapon/circuitboard/supplycomp/attackby(obj/item/I as obj, mob/user as mob, params)
|
||||
if(istype(I,/obj/item/device/multitool))
|
||||
@@ -336,11 +347,12 @@
|
||||
if(istype(P, /obj/item/weapon/circuitboard) && !circuit)
|
||||
var/obj/item/weapon/circuitboard/B = P
|
||||
if(B.board_type == "computer")
|
||||
if(!user.drop_item())
|
||||
return
|
||||
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
user << "<span class='notice'>You place the circuit board inside the frame.</span>"
|
||||
icon_state = "1"
|
||||
circuit = P
|
||||
user.drop_item()
|
||||
circuit.add_fingerprint(user)
|
||||
P.loc = null
|
||||
else
|
||||
|
||||
@@ -6,7 +6,7 @@ var/time_last_changed_position = 0
|
||||
|
||||
/obj/machinery/computer/card
|
||||
name = "identification console"
|
||||
desc = "You can use this to change ID's."
|
||||
desc = "You can use this to manage jobs and ID access."
|
||||
icon_screen = "id"
|
||||
icon_keyboard = "id_key"
|
||||
req_one_access = list(access_heads, access_change_ids)
|
||||
@@ -18,6 +18,7 @@ var/time_last_changed_position = 0
|
||||
var/printing = null
|
||||
var/list/region_access = null
|
||||
var/list/head_subordinates = null
|
||||
var/target_dept = 0 //Which department this computer has access to. 0=all departments
|
||||
|
||||
//Cooldown for closing positions in seconds
|
||||
//if set to -1: No cooldown... probably a bad idea
|
||||
@@ -48,16 +49,19 @@ var/time_last_changed_position = 0
|
||||
var/obj/item/weapon/card/id/idcard = O
|
||||
if(check_access(idcard))
|
||||
if(!scan)
|
||||
usr.drop_item()
|
||||
if(!usr.drop_item())
|
||||
return
|
||||
idcard.loc = src
|
||||
scan = idcard
|
||||
else if(!modify)
|
||||
usr.drop_item()
|
||||
if(!usr.drop_item())
|
||||
return
|
||||
idcard.loc = src
|
||||
modify = idcard
|
||||
else
|
||||
if(!modify)
|
||||
usr.drop_item()
|
||||
if(!usr.drop_item())
|
||||
return
|
||||
idcard.loc = src
|
||||
modify = idcard
|
||||
else
|
||||
@@ -118,7 +122,7 @@ var/time_last_changed_position = 0
|
||||
dat += "<table>"
|
||||
dat += "<tr><td style='width:25%'><b>Job</b></td><td style='width:25%'><b>Slots</b></td><td style='width:25%'><b>Open job</b></td><td style='width:25%'><b>Close job</b></td></tr>"
|
||||
var/ID
|
||||
if(scan && (access_change_ids in scan.access))
|
||||
if(scan && (access_change_ids in scan.access) && !target_dept)
|
||||
ID = 1
|
||||
else
|
||||
ID = 0
|
||||
@@ -280,14 +284,15 @@ var/time_last_changed_position = 0
|
||||
else
|
||||
body = "<a href='?src=\ref[src];choice=auth'>{Log in}</a> <br><hr>"
|
||||
body += "<a href='?src=\ref[src];choice=mode;mode_target=1'>Access Crew Manifest</a>"
|
||||
body += "<br><hr><a href = '?src=\ref[src];choice=mode;mode_target=2'>Job Management</a>"
|
||||
if(!target_dept)
|
||||
body += "<br><hr><a href = '?src=\ref[src];choice=mode;mode_target=2'>Job Management</a>"
|
||||
|
||||
dat = "<tt>[header][body]<hr><br></tt>"
|
||||
|
||||
//user << browse(dat, "window=id_com;size=900x520")
|
||||
//onclose(user, "id_com")
|
||||
|
||||
var/datum/browser/popup = new(user, "id_com", "Identification Card Modifier Console", 900, 620)
|
||||
var/datum/browser/popup = new(user, "id_com", src.name, 900, 620)
|
||||
popup.set_content(dat)
|
||||
popup.set_title_image(user.browse_rsc_icon(src.icon, src.icon_state))
|
||||
popup.open()
|
||||
@@ -311,7 +316,8 @@ var/time_last_changed_position = 0
|
||||
else
|
||||
var/obj/item/I = usr.get_active_hand()
|
||||
if (istype(I, /obj/item/weapon/card/id))
|
||||
usr.drop_item()
|
||||
if(!usr.drop_item())
|
||||
return
|
||||
I.loc = src
|
||||
modify = I
|
||||
authenticated = 0
|
||||
@@ -324,34 +330,41 @@ var/time_last_changed_position = 0
|
||||
else
|
||||
var/obj/item/I = usr.get_active_hand()
|
||||
if (istype(I, /obj/item/weapon/card/id))
|
||||
usr.drop_item()
|
||||
if(!usr.drop_item())
|
||||
return
|
||||
I.loc = src
|
||||
scan = I
|
||||
authenticated = 0
|
||||
if ("auth")
|
||||
if ((!( authenticated ) && (scan || (istype(usr, /mob/living/silicon))) && (modify || mode)))
|
||||
if (check_access(scan))
|
||||
region_access = list()
|
||||
head_subordinates = list()
|
||||
if(access_change_ids in scan.access)
|
||||
authenticated = 2
|
||||
if(target_dept)
|
||||
head_subordinates = get_all_jobs()
|
||||
region_access |= target_dept
|
||||
authenticated = 1
|
||||
else
|
||||
authenticated = 2
|
||||
|
||||
else
|
||||
region_access = list()
|
||||
head_subordinates = list()
|
||||
if(access_hop in scan.access)
|
||||
region_access += 1
|
||||
region_access += 6
|
||||
if((access_hop in scan.access) && ((target_dept==1) || !target_dept))
|
||||
region_access |= 1
|
||||
region_access |= 6
|
||||
get_subordinates("Head of Personnel")
|
||||
if(access_rd in scan.access)
|
||||
region_access += 4
|
||||
get_subordinates("Research Director")
|
||||
if(access_ce in scan.access)
|
||||
region_access += 5
|
||||
get_subordinates("Chief Engineer")
|
||||
if(access_cmo in scan.access)
|
||||
region_access += 3
|
||||
get_subordinates("Chief Medical Officer")
|
||||
if(access_hos in scan.access)
|
||||
region_access += 2
|
||||
if((access_hos in scan.access) && ((target_dept==2) || !target_dept))
|
||||
region_access |= 2
|
||||
get_subordinates("Head of Security")
|
||||
if((access_cmo in scan.access) && ((target_dept==3) || !target_dept))
|
||||
region_access |= 3
|
||||
get_subordinates("Chief Medical Officer")
|
||||
if((access_rd in scan.access) && ((target_dept==4) || !target_dept))
|
||||
region_access |= 4
|
||||
get_subordinates("Research Director")
|
||||
if((access_ce in scan.access) && ((target_dept==5) || !target_dept))
|
||||
region_access |= 5
|
||||
get_subordinates("Chief Engineer")
|
||||
if(region_access)
|
||||
authenticated = 1
|
||||
else if ((!( authenticated ) && (istype(usr, /mob/living/silicon))) && (!modify))
|
||||
@@ -419,7 +432,7 @@ var/time_last_changed_position = 0
|
||||
|
||||
if("make_job_available")
|
||||
// MAKE ANOTHER JOB POSITION AVAILABLE FOR LATE JOINERS
|
||||
if(scan && (access_change_ids in scan.access))
|
||||
if(scan && (access_change_ids in scan.access) && !target_dept)
|
||||
var/edit_job_target = href_list["job"]
|
||||
var/datum/job/j = SSjob.GetJob(edit_job_target)
|
||||
if(!j)
|
||||
@@ -433,7 +446,7 @@ var/time_last_changed_position = 0
|
||||
|
||||
if("make_job_unavailable")
|
||||
// MAKE JOB POSITION UNAVAILABLE FOR LATE JOINERS
|
||||
if(scan && (access_change_ids in scan.access))
|
||||
if(scan && (access_change_ids in scan.access) && !target_dept)
|
||||
var/edit_job_target = href_list["job"]
|
||||
var/datum/job/j = SSjob.GetJob(edit_job_target)
|
||||
if(!j)
|
||||
@@ -472,3 +485,30 @@ var/time_last_changed_position = 0
|
||||
circuit = /obj/item/weapon/circuitboard/card/centcom
|
||||
req_access = list(access_cent_captain)
|
||||
|
||||
/obj/machinery/computer/card/minor
|
||||
name = "department management console"
|
||||
desc = "You can use this to change ID's for specific departments."
|
||||
icon_screen = "idminor"
|
||||
circuit = /obj/item/weapon/circuitboard/card/minor
|
||||
|
||||
/obj/machinery/computer/card/minor/New()
|
||||
..()
|
||||
var/obj/item/weapon/circuitboard/card/minor/typed_circuit = circuit
|
||||
if(target_dept)
|
||||
typed_circuit.target_dept = target_dept
|
||||
else
|
||||
target_dept = typed_circuit.target_dept
|
||||
var/list/dept_list = list("general","security","medical","science","engineering")
|
||||
name = "[dept_list[target_dept]] department console"
|
||||
|
||||
/obj/machinery/computer/card/minor/hos
|
||||
target_dept = 2
|
||||
|
||||
/obj/machinery/computer/card/minor/cmo
|
||||
target_dept = 3
|
||||
|
||||
/obj/machinery/computer/card/minor/rd
|
||||
target_dept = 4
|
||||
|
||||
/obj/machinery/computer/card/minor/ce
|
||||
target_dept = 5
|
||||
|
||||
@@ -76,7 +76,8 @@
|
||||
/obj/machinery/computer/cloning/attackby(obj/item/W as obj, mob/user as mob, params)
|
||||
if (istype(W, /obj/item/weapon/disk/data)) //INSERT SOME DISKETTES
|
||||
if (!src.diskette)
|
||||
user.drop_item()
|
||||
if(!user.drop_item())
|
||||
return ..()
|
||||
W.loc = src
|
||||
src.diskette = W
|
||||
user << "<span class='notice'>You insert [W].</span>"
|
||||
|
||||
@@ -50,7 +50,7 @@ var/const/CALL_SHUTTLE_REASON_LENGTH = 12
|
||||
/obj/machinery/computer/communications/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
if (src.z > ZLEVEL_STATION)
|
||||
if (src.z > ZLEVEL_CENTCOM) //Can only use on centcom and SS13
|
||||
usr << "<span class='boldannounce'>Unable to establish a connection</span>: \black You're too far away from the station!"
|
||||
return
|
||||
usr.set_machine(src)
|
||||
|
||||
@@ -20,9 +20,10 @@
|
||||
var/sortBy = "name"
|
||||
var/order = 1 // -1 = Descending - 1 = Ascending
|
||||
|
||||
/obj/machinery/computer/med_data/attackby(obj/item/O as obj, user as mob, params)
|
||||
/obj/machinery/computer/med_data/attackby(obj/item/O as obj, mob/user as mob, params)
|
||||
if(istype(O, /obj/item/weapon/card/id) && !scan)
|
||||
usr.drop_item()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
O.loc = src
|
||||
scan = O
|
||||
user << "<span class='notice'>You insert [O].</span>"
|
||||
@@ -215,7 +216,8 @@
|
||||
else
|
||||
var/obj/item/I = usr.get_active_hand()
|
||||
if(istype(I, /obj/item/weapon/card/id))
|
||||
usr.drop_item()
|
||||
if(!usr.drop_item())
|
||||
return
|
||||
I.loc = src
|
||||
src.scan = I
|
||||
else if(href_list["logout"])
|
||||
@@ -509,7 +511,7 @@
|
||||
else
|
||||
//Foreach continue //goto(3229)
|
||||
if(!( src.active2 ))
|
||||
src.temp = text("Could not locate record [].", t1)
|
||||
src.temp = text("Could not locate record [].", sanitize(t1))
|
||||
else
|
||||
for(var/datum/data/record/E in data_core.general)
|
||||
if((E.fields["name"] == src.active2.fields["name"] || E.fields["id"] == src.active2.fields["id"]))
|
||||
|
||||
@@ -128,7 +128,7 @@
|
||||
break
|
||||
// Del - Sender - Recepient - Message
|
||||
// X - Al Green - Your Mom - WHAT UP!?
|
||||
dat += "<tr><td width = '5%'><center><A href='?src=\ref[src];delete=\ref[pda]' style='color: rgb(255,0,0)'>X</a></center></td><td width='15%'>[pda.sender]</td><td width='15%'>[pda.recipient]</td><td width='300px'>[pda.message]</td></tr>"
|
||||
dat += "<tr><td width = '5%'><center><A href='?src=\ref[src];delete=\ref[pda]' style='color: rgb(255,0,0)'>X</a></center></td><td width='15%'>[pda.sender]</td><td width='15%'>[pda.recipient]</td><td width='300px'>[pda.message][pda.photo ? "<a href='byond://?src=\ref[pda];photo=1'>(Photo)</a>":""]</td></tr>"
|
||||
dat += "</table>"
|
||||
//Hacking screen.
|
||||
if(2)
|
||||
|
||||
@@ -119,9 +119,11 @@
|
||||
|
||||
|
||||
/obj/machinery/computer/pod/old
|
||||
icon_state = "old"
|
||||
name = "\improper DoorMex control console"
|
||||
title = "Door Controls"
|
||||
icon_state = "oldcomp"
|
||||
icon_screen = "library"
|
||||
icon_keyboard = null
|
||||
|
||||
|
||||
/obj/machinery/computer/pod/old/syndicate
|
||||
|
||||
@@ -92,7 +92,8 @@
|
||||
if(href_list["id"] =="insert" && !istype(inserted_id))
|
||||
var/obj/item/weapon/card/id/prisoner/I = usr.get_active_hand()
|
||||
if(istype(I))
|
||||
usr.drop_item()
|
||||
if(!usr.drop_item())
|
||||
return
|
||||
I.loc = src
|
||||
inserted_id = I
|
||||
else usr << "<span class='danger'>No valid ID.</span>"
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
R << "Extreme danger. Termination codes detected. Scrambling security codes and automatic AI unlink triggered."
|
||||
R.ResetSecurityCodes()
|
||||
else
|
||||
message_admins("<span class='notice'>[key_name(usr, usr.client)](<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[usr.x];Y=[usr.y];Z=[usr.z]'>JMP</a>) detonated [key_name(R, R.client)](<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[R.x];Y=[R.y];Z=[R.z]'>JMP</a>)!</span>")
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) detonated [key_name(R, R.client)](<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[R.x];Y=[R.y];Z=[R.z]'>JMP</a>)!</span>")
|
||||
log_game("\<span class='notice'>[key_name(usr)] detonated [key_name(R)]!</span>")
|
||||
if(R.connected_ai)
|
||||
R.connected_ai << "<br><br><span class='alert'>ALERT - Cyborg detonation detected: [R.name]</span><br>"
|
||||
@@ -106,7 +106,7 @@
|
||||
if(can_control(usr, R))
|
||||
var/choice = input("Are you certain you wish to [R.canmove ? "lock down" : "release"] [R.name]?") in list("Confirm", "Abort")
|
||||
if(choice == "Confirm" && can_control(usr, R) && !..())
|
||||
message_admins("<span class='notice'>[key_name(usr, usr.client)](<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[usr.x];Y=[usr.y];Z=[usr.z]'>JMP</a>) [R.canmove ? "locked down" : "released"] [key_name(R, R.client)](<A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[R.x];Y=[R.y];Z=[R.z]'>JMP</a>)!</span>")
|
||||
message_admins("<span class='notice'>[key_name_admin(usr)] (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) [R.canmove ? "locked down" : "released"] [key_name(R, R.client)](<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>)!</span>")
|
||||
log_game("[key_name(usr)] [R.canmove ? "locked down" : "released"] [key_name(R)]!")
|
||||
R.SetLockdown(!R.lockcharge)
|
||||
R << "[!R.lockcharge ? "<span class='notice'>Your lockdown has been lifted!" : "<span class='alert'>You have been locked down!"]</span>"
|
||||
|
||||
@@ -24,9 +24,10 @@
|
||||
var/order = 1 // -1 = Descending - 1 = Ascending
|
||||
|
||||
|
||||
/obj/machinery/computer/secure_data/attackby(obj/item/O as obj, user as mob, params)
|
||||
/obj/machinery/computer/secure_data/attackby(obj/item/O as obj, mob/user as mob, params)
|
||||
if(istype(O, /obj/item/weapon/card/id) && !scan)
|
||||
usr.drop_item()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
O.loc = src
|
||||
scan = O
|
||||
user << "<span class='notice'>You insert [O].</span>"
|
||||
@@ -299,7 +300,8 @@ What a mess.*/
|
||||
else
|
||||
var/obj/item/I = usr.get_active_hand()
|
||||
if(istype(I, /obj/item/weapon/card/id))
|
||||
usr.drop_item()
|
||||
if(!usr.drop_item())
|
||||
return
|
||||
I.loc = src
|
||||
scan = I
|
||||
|
||||
@@ -519,7 +521,7 @@ What a mess.*/
|
||||
switch(href_list["field"])
|
||||
if("name")
|
||||
if(istype(active1, /datum/data/record) || istype(active2, /datum/data/record))
|
||||
var/t1 = stripped_input(usr, "Please input name:", "Secure. records", active1.fields["name"], null)
|
||||
var/t1 = copytext(sanitize(input("Please input name:", "Secure. records", active1.fields["name"], null) as text),1,MAX_MESSAGE_LEN)
|
||||
if(!canUseSecurityRecordsConsole(usr, t1, a1))
|
||||
return
|
||||
if(istype(active1, /datum/data/record))
|
||||
|
||||
@@ -47,12 +47,12 @@
|
||||
if(!authorized.Find(W:registered_name))
|
||||
authorized += W:registered_name
|
||||
if(auth_need - authorized.len > 0)
|
||||
message_admins("[key_name(user.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) has authorized early shuttle launch in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)",0,1)
|
||||
log_game("[user.ckey]([user]) has authorized early shuttle launch in ([x],[y],[z])")
|
||||
message_admins("[key_name_admin(user.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[user]'>FLW</A>) has authorized early shuttle launch ",0,1)
|
||||
log_game("[key_name(user)] has authorized early shuttle launch in ([x],[y],[z])")
|
||||
minor_announce("[auth_need - authorized.len] more authorization(s) needed until shuttle is launched early",null,1)
|
||||
else
|
||||
message_admins("[key_name(user.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) has launched the emergency shuttle in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>) [seconds] seconds before launch.",0,1)
|
||||
log_game("[user.ckey]([user]) has launched the emergency shuttle in ([x],[y],[z]) [seconds] seconds before launch.")
|
||||
message_admins("[key_name_admin(user.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[user]'>FLW</A>) has launched the emergency shuttle [seconds] seconds before launch.",0,1)
|
||||
log_game("[key_name(user)] has launched the emergency shuttle in ([x],[y],[z]) [seconds] seconds before launch.")
|
||||
minor_announce("The emergency shuttle will launch in 10 seconds",null,1)
|
||||
SSshuttle.emergency.setTimer(100)
|
||||
|
||||
@@ -68,8 +68,8 @@
|
||||
/obj/machinery/computer/emergency_shuttle/emag_act(mob/user as mob)
|
||||
if(!emagged && SSshuttle.emergency.mode == SHUTTLE_DOCKED)
|
||||
var/time = SSshuttle.emergency.timeLeft()
|
||||
message_admins("[key_name(user.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) has emagged the emergency shuttle in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>) [time] seconds before launch.",0,1)
|
||||
log_game("[user.ckey]([user]) has emagged the emergency shuttle in ([x],[y],[z]) [time] seconds before launch.")
|
||||
message_admins("[key_name_admin(user.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[user]'>FLW</A>) has emagged the emergency shuttle [time] seconds before launch.",0,1)
|
||||
log_game("[key_name(user)] has emagged the emergency shuttle in ([x],[y],[z]) [time] seconds before launch.")
|
||||
minor_announce("The emergency shuttle will launch in 10 seconds", "SYSTEM ERROR:",null,1)
|
||||
SSshuttle.emergency.setTimer(100)
|
||||
emagged = 1
|
||||
|
||||
@@ -39,7 +39,8 @@ var/list/possible_uplinker_IDs = list("Alfa","Bravo","Charlie","Delta","Echo","F
|
||||
|
||||
if(O.hidden_uplink)
|
||||
var/obj/item/P = user.get_active_hand()
|
||||
user.drop_item()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
uplinkholder = P
|
||||
P.loc = src
|
||||
P.add_fingerprint(user)
|
||||
|
||||
@@ -108,10 +108,11 @@
|
||||
return
|
||||
var/obj/item/weapon/circuitboard/B = P
|
||||
if(B.board_type == "machine")
|
||||
if(!user.drop_item())
|
||||
return
|
||||
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
|
||||
user << "<span class='notice'>You add the circuit board to the frame.</span>"
|
||||
circuit = P
|
||||
user.drop_item()
|
||||
P.loc = src
|
||||
icon_state = "box_2"
|
||||
state = 3
|
||||
@@ -140,8 +141,8 @@
|
||||
user << "<span class='notice'>You remove the circuit board.</span>"
|
||||
else
|
||||
user << "<span class='notice'>You remove the circuit board and other components.</span>"
|
||||
for(var/obj/item/weapon/W in components)
|
||||
W.loc = src.loc
|
||||
for(var/atom/movable/A in components)
|
||||
A.loc = src.loc
|
||||
desc = initial(desc)
|
||||
req_components = null
|
||||
components = null
|
||||
@@ -199,6 +200,8 @@
|
||||
var/success
|
||||
for(var/I in req_components)
|
||||
if(istype(P, I) && (req_components[I] > 0))
|
||||
if(!user.drop_item())
|
||||
return
|
||||
success=1
|
||||
if(istype(P, /obj/item/stack/cable_coil))
|
||||
var/obj/item/stack/cable_coil/CP = P
|
||||
@@ -211,7 +214,6 @@
|
||||
req_components[I]--
|
||||
update_req_desc()
|
||||
break
|
||||
user.drop_item()
|
||||
P.loc = src
|
||||
components += P
|
||||
req_components[I]--
|
||||
|
||||
+11
-20
@@ -135,16 +135,20 @@
|
||||
*
|
||||
* @return nothing
|
||||
*/
|
||||
/obj/machinery/atmospherics/unary/cryo_cell/ui_interact(mob/user, ui_key = "main")
|
||||
/obj/machinery/atmospherics/unary/cryo_cell/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
|
||||
if(user == occupant || user.stat || panel_open)
|
||||
return
|
||||
|
||||
ui = SSnano.push_open_or_new_ui(user, src, ui_key, ui, "cryo.tmpl", "Cryo Cell Control System", 520, 410, 1)
|
||||
//user.set_machine(src)
|
||||
|
||||
/obj/machinery/atmospherics/unary/cryo_cell/get_ui_data()
|
||||
// this is the data which will be sent to the ui
|
||||
var/data[0]
|
||||
var/data = list()
|
||||
data["isOperating"] = on
|
||||
data["hasOccupant"] = occupant ? 1 : 0
|
||||
|
||||
var/occupantData[0]
|
||||
var/occupantData = list()
|
||||
if (!occupant)
|
||||
occupantData["name"] = null
|
||||
occupantData["stat"] = null
|
||||
@@ -167,7 +171,7 @@
|
||||
occupantData["toxLoss"] = occupant.getToxLoss()
|
||||
occupantData["fireLoss"] = occupant.getFireLoss()
|
||||
occupantData["bodyTemperature"] = occupant.bodytemperature
|
||||
data["occupant"] = occupantData;
|
||||
data["occupant"] = occupantData
|
||||
|
||||
data["isOpen"] = state_open
|
||||
data["cellTemperature"] = round(air_contents.temperature)
|
||||
@@ -183,21 +187,7 @@
|
||||
for(var/datum/reagent/R in beaker:reagents.reagent_list)
|
||||
beakerContents.Add(list(list("name" = R.name, "volume" = R.volume))) // list in a list because Byond merges the first list...
|
||||
data["beakerContents"] = beakerContents
|
||||
|
||||
var/datum/nanoui/ui = SSnano.get_open_ui(user, src, ui_key)
|
||||
if (!ui)
|
||||
// the ui does not exist, so we'll create a new one
|
||||
ui = new(user, src, ui_key, "cryo.tmpl", "Cryo Cell Control System", 520, 410)
|
||||
// When the UI is first opened this is the data it will use
|
||||
ui.set_initial_data(data)
|
||||
ui.open()
|
||||
// Auto update every Master Controller tick
|
||||
ui.set_auto_update(1)
|
||||
else
|
||||
// The UI is already open so push the new data to it
|
||||
ui.push_data(data)
|
||||
return
|
||||
//user.set_machine(src)
|
||||
return data
|
||||
|
||||
/obj/machinery/atmospherics/unary/cryo_cell/Topic(href, href_list)
|
||||
if(usr == occupant || panel_open)
|
||||
@@ -237,9 +227,10 @@
|
||||
if(beaker)
|
||||
user << "<span class='warning'>A beaker is already loaded into [src]!</span>"
|
||||
return
|
||||
if(!user.drop_item())
|
||||
return
|
||||
|
||||
beaker = I
|
||||
user.drop_item()
|
||||
I.loc = src
|
||||
user.visible_message("[user] places [I] in [src].", \
|
||||
"<span class='notice'>You place [I] in [src].</span>")
|
||||
|
||||
@@ -45,6 +45,8 @@
|
||||
var/obj/item/weapon/airlock_electronics/electronics = null
|
||||
var/hasShocked = 0 //Prevents multiple shocks from happening
|
||||
var/autoclose = 1
|
||||
var/obj/item/device/doorCharge/charge = null //If applied, causes an explosion upon opening the door
|
||||
var/detonated = 0
|
||||
|
||||
explosion_block = 1
|
||||
|
||||
@@ -91,6 +93,7 @@
|
||||
icon = 'icons/obj/doors/vault.dmi'
|
||||
opacity = 1
|
||||
doortype = /obj/structure/door_assembly/door_assembly_vault
|
||||
explosion_block = 2
|
||||
|
||||
/obj/machinery/door/airlock/glass_large
|
||||
name = "glass airlock"
|
||||
@@ -476,6 +479,11 @@ About the new airlock wires panel:
|
||||
flick("door_deny", src)
|
||||
return
|
||||
|
||||
/obj/machinery/door/airlock/examine(mob/user)
|
||||
..()
|
||||
if(charge && !p_open && in_range(user, src))
|
||||
user << "The maintenance panel is bulging slightly."
|
||||
|
||||
/obj/machinery/door/airlock/attack_ai(mob/user as mob)
|
||||
if(!src.canAIControl())
|
||||
if(src.canAIHack())
|
||||
@@ -486,6 +494,9 @@ About the new airlock wires panel:
|
||||
if(emagged)
|
||||
user << "<span class='warning'>Unable to interface: Airlock is unresponsive.</span>"
|
||||
return
|
||||
if(detonated)
|
||||
user << "<span class='warning'>Unable to interface. Airlock control panel damaged.</span>"
|
||||
return
|
||||
|
||||
//Separate interface for the AI.
|
||||
user.set_machine(src)
|
||||
@@ -923,6 +934,9 @@ About the new airlock wires panel:
|
||||
update_icon()
|
||||
return
|
||||
else if(istype(C, /obj/item/weapon/screwdriver))
|
||||
if(p_open && detonated)
|
||||
user << "<span class='warning'>[src] has no maintenance panel!</span>"
|
||||
return
|
||||
src.p_open = !( src.p_open )
|
||||
user << "<span class='notice'>You [p_open ? "open":"close"] the maintenance panel of the airlock.</span>"
|
||||
src.update_icon()
|
||||
@@ -941,6 +955,22 @@ About the new airlock wires panel:
|
||||
beingcrowbarred = 1 //derp, Agouri
|
||||
else
|
||||
beingcrowbarred = 0
|
||||
if(p_open && charge)
|
||||
user << "<span class='notice'>You carefully start removing [charge] from [src]...</span>"
|
||||
playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1)
|
||||
if(!do_after(user, 150))
|
||||
user << "<span class='warning'>You slip and [charge] detonates!</span>"
|
||||
charge.ex_act(1)
|
||||
user.Weaken(3)
|
||||
return
|
||||
user.visible_message("<span class='notice'>[user] removes [charge] from [src].</span>", \
|
||||
"<span class='notice'>You gently pry out [charge] from [src] and unhook its wires.</span>")
|
||||
charge.loc = get_turf(user)
|
||||
if(prob(25))
|
||||
charge.ex_act(1)
|
||||
return
|
||||
charge = null
|
||||
return
|
||||
if( beingcrowbarred && (density && welded && !operating && src.p_open && (!hasPower()) && !src.locked) )
|
||||
playsound(src.loc, 'sound/items/Crowbar.ogg', 100, 1)
|
||||
user.visible_message("[user] removes the electronics from the airlock assembly.", \
|
||||
@@ -998,14 +1028,31 @@ About the new airlock wires panel:
|
||||
|
||||
else if(istype(C, /obj/item/weapon/airlock_painter))
|
||||
change_paintjob(C, user)
|
||||
else if(istype(C, /obj/item/device/doorCharge) && p_open)
|
||||
if(emagged)
|
||||
return
|
||||
if(charge && !detonated)
|
||||
user << "<span class='warning'>There's already a charge hooked up to this door!</span>"
|
||||
return
|
||||
if(detonated)
|
||||
user << "<span class='warning'>The maintenance panel is destroyed!</span>"
|
||||
return
|
||||
user << "<span class='warning'>You apply [C]. Next time someone opens the door, it will explode.</span>"
|
||||
user.drop_item()
|
||||
p_open = 0
|
||||
update_icon()
|
||||
var/obj/item/device/doorCharge/newCharge = C //This is necessary, for some reason
|
||||
newCharge.loc = src
|
||||
charge = newCharge
|
||||
return
|
||||
else
|
||||
..()
|
||||
return
|
||||
|
||||
/obj/machinery/door/airlock/plasma/attackby(C as obj, mob/user as mob, params)
|
||||
if(is_hot(C) > 300)//If the temperature of the object is over 300, then ignite
|
||||
message_admins("Plasma wall ignited by [key_name(user, user.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
log_game("Plasma wall ignited by [user.ckey]([user]) in ([x],[y],[z])")
|
||||
message_admins("Plasma airlock ignited by [key_name_admin(user)](<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[user]'>FLW</A>) in ([x],[y],[z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[x];Y=[y];Z=[z]'>JMP</a>)")
|
||||
log_game("Plasma wall ignited by [key_name(user)] in ([x],[y],[z])")
|
||||
ignite(is_hot(C))
|
||||
return
|
||||
..()
|
||||
@@ -1016,6 +1063,18 @@ About the new airlock wires panel:
|
||||
if(!forced)
|
||||
if( !hasPower() || isWireCut(AIRLOCK_WIRE_OPEN_DOOR) )
|
||||
return 0
|
||||
if(charge && !detonated)
|
||||
p_open = 1
|
||||
update_icon()
|
||||
visible_message("<span class='warning'>[src]'s panel is blown off in a spray of deadly shrapnel!</span>")
|
||||
charge.ex_act(1)
|
||||
detonated = 1
|
||||
charge = null
|
||||
for(var/mob/living/carbon/human/H in orange(1,src))
|
||||
H.Paralyse(8)
|
||||
H.adjust_fire_stacks(1)
|
||||
H.IgniteMob() //Guaranteed knockout and ignition for nearby people
|
||||
return
|
||||
if(forced < 2)
|
||||
if(emagged)
|
||||
return 0
|
||||
|
||||
@@ -281,4 +281,7 @@
|
||||
return 0
|
||||
|
||||
/obj/machinery/door/morgue
|
||||
icon = 'icons/obj/doors/doormorgue.dmi'
|
||||
icon = 'icons/obj/doors/doormorgue.dmi'
|
||||
|
||||
/obj/machinery/door/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user)
|
||||
return 0
|
||||
@@ -187,7 +187,6 @@
|
||||
/obj/machinery/door/window/hitby(AM as mob|obj)
|
||||
|
||||
..()
|
||||
visible_message("<span class='danger'>\The [src] was hit by \the [AM].</span>")
|
||||
var/tforce = 0
|
||||
if(ismob(AM))
|
||||
tforce = 40
|
||||
|
||||
@@ -0,0 +1,105 @@
|
||||
/obj/machinery/droneDispenser
|
||||
name = "drone shell dispenser"
|
||||
desc = "A hefty machine that, when supplied with metal and glass, will periodically create a drone shell. Does not need to be manually operated."
|
||||
icon = 'icons/obj/machines/droneDispenser.dmi'
|
||||
icon_state = "on"
|
||||
anchored = 1
|
||||
density = 1
|
||||
var/metal = 0
|
||||
var/glass = 0
|
||||
var/droneMadeRecently = 0
|
||||
var/outputDirection = SOUTH
|
||||
|
||||
/obj/machinery/droneDispenser/New()
|
||||
..()
|
||||
SSmachine.processing |= src
|
||||
|
||||
/obj/machinery/droneDispenser/Destroy()
|
||||
SSmachine.processing -= src
|
||||
..()
|
||||
|
||||
/obj/machinery/droneDispenser/preloaded
|
||||
metal = 5000
|
||||
glass = 5000
|
||||
|
||||
/obj/machinery/droneDispenser/syndrone //Please forgive me
|
||||
name = "syndrone shell dispenser"
|
||||
desc = "A suspicious machine that will create Syndicate exterminator drones when supplied with metal and glass. Disgusting."
|
||||
metal = 25000
|
||||
glass = 25000
|
||||
|
||||
/obj/machinery/droneDispenser/examine(mob/user)
|
||||
..()
|
||||
if(droneMadeRecently && !stat)
|
||||
user << "<span class='notice'>The control screen indicates that is recharging.</span>"
|
||||
user << "<span class='notice'>It has [metal] units of metal stored.</span>"
|
||||
user << "<span class='notice'>It has [glass] units of glass stored.</span>"
|
||||
|
||||
/obj/machinery/droneDispenser/power_change()
|
||||
..()
|
||||
if(stat & BROKEN)
|
||||
return
|
||||
else
|
||||
if(powered())
|
||||
stat &= ~NOPOWER
|
||||
else
|
||||
icon_state = "off"
|
||||
stat |= NOPOWER
|
||||
|
||||
/obj/machinery/droneDispenser/process()
|
||||
..()
|
||||
if(stat & (NOPOWER|BROKEN) || !anchored)
|
||||
return
|
||||
if(droneMadeRecently || metal < 1000 || glass < 1000)
|
||||
return
|
||||
droneMadeRecently = 1
|
||||
var/turf/T = get_step(src,SOUTH)
|
||||
visible_message("<span class='notice'>[src] whirs to life!</span>")
|
||||
playsound(src, 'sound/items/rped.ogg', 50, 1)
|
||||
icon_state = "make"
|
||||
spawn(30)
|
||||
icon_state = "[initial(icon_state)]"
|
||||
visible_message("<span class='notice'>[src] dispenses a drone shell.</span>")
|
||||
metal -= 1000
|
||||
glass -= 1000
|
||||
if(metal < 0) metal = 0
|
||||
if(glass < 0) glass = 0
|
||||
if(istype(src, /obj/machinery/droneDispenser/syndrone))
|
||||
new /obj/item/drone_shell/syndrone(T)
|
||||
else
|
||||
new /obj/item/drone_shell(T)
|
||||
use_power(1000)
|
||||
icon_state = "recharge"
|
||||
spawn(1800) //3 minute cooldown between shells
|
||||
icon_state = "[initial(icon_state)]"
|
||||
droneMadeRecently = 0
|
||||
playsound(src, 'sound/machines/ping.ogg', 50, 1)
|
||||
audible_message("<span class='notice'>[src] pings.</span>")
|
||||
|
||||
/obj/machinery/droneDispenser/attackby(obj/item/O, mob/living/user)
|
||||
if(istype(O, /obj/item/stack))
|
||||
if(!O.m_amt && !O.g_amt)
|
||||
return ..()
|
||||
var/stack = 1
|
||||
var/obj/item/stack/sheets
|
||||
sheets = O
|
||||
stack = (input(user, "How many sheets do you want to add?.", "Drone Dispenser", "[stack]") as num)
|
||||
if(stack <= 0)
|
||||
return
|
||||
if(!user.canUseTopic(src))
|
||||
return
|
||||
stack = Clamp(stack, 0, sheets.max_amount)
|
||||
sheets.use(stack)
|
||||
if(!stack)
|
||||
if(!user.unEquip(O))
|
||||
user << "<span class='warning'>[O] is stuck to your hand, you can't get it off!</span>"
|
||||
return
|
||||
user.drop_item()
|
||||
O.loc = src
|
||||
metal += O.m_amt * stack
|
||||
glass += O.g_amt * stack
|
||||
user << "<span class='notice'>You insert [stack] sheet[stack > 1 ? "s" : ""] to [src].</span>"
|
||||
if((O && O.loc == src) || !stack)
|
||||
qdel(O)
|
||||
return
|
||||
..()
|
||||
@@ -50,8 +50,9 @@
|
||||
|
||||
else if (istype(W, /obj/item/device/flash/handheld))
|
||||
if (!bulb)
|
||||
if(!user.drop_item())
|
||||
return
|
||||
user.visible_message("[user] installs [W] into [src].", "<span class='notice'>You install [W] into [src].</span>")
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
bulb = W
|
||||
power_change()
|
||||
|
||||
@@ -77,8 +77,9 @@
|
||||
if(!isnull(beaker))
|
||||
user << "<span class='warning'>There is already a reagent container loaded!</span>"
|
||||
return
|
||||
if(!user.drop_item())
|
||||
return
|
||||
|
||||
user.drop_item()
|
||||
W.loc = src
|
||||
beaker = W
|
||||
user << "<span class='notice'>You attach \the [W] to \the [src].</span>"
|
||||
|
||||
@@ -788,7 +788,8 @@ var/list/obj/machinery/newscaster/allCasters = list()
|
||||
photo = null
|
||||
if(istype(user.get_active_hand(), /obj/item/weapon/photo))
|
||||
photo = user.get_active_hand()
|
||||
user.drop_item()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
photo.loc = src
|
||||
if(istype(user,/mob/living/silicon))
|
||||
var/list/nametemp = list()
|
||||
@@ -893,6 +894,10 @@ var/list/obj/machinery/newscaster/allCasters = list()
|
||||
var/wantedPhoto
|
||||
var/creationTime
|
||||
|
||||
/obj/item/weapon/newspaper/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] is focusing intently on [src]! It looks like they're trying to commit sudoku.</span>")
|
||||
return(OXYLOSS)
|
||||
|
||||
/obj/item/weapon/newspaper/attack_self(mob/user)
|
||||
if(ishuman(user))
|
||||
var/mob/living/carbon/human/human_user = user
|
||||
|
||||
@@ -39,7 +39,7 @@ Buildable meters
|
||||
var/pipe_type = 0
|
||||
var/pipename
|
||||
force = 7
|
||||
icon = 'icons/obj/pipe-item.dmi'
|
||||
icon = 'icons/obj/atmospherics/pipes/pipe_item.dmi'
|
||||
icon_state = "simple"
|
||||
item_state = "buildpipe"
|
||||
w_class = 3
|
||||
@@ -407,7 +407,7 @@ var/global/list/pipeID2State = list(
|
||||
/obj/item/pipe_meter
|
||||
name = "meter"
|
||||
desc = "A meter that can be laid on pipes"
|
||||
icon = 'icons/obj/pipe-item.dmi'
|
||||
icon = 'icons/obj/atmospherics/pipes/pipe_item.dmi'
|
||||
icon_state = "meter"
|
||||
item_state = "buildpipe"
|
||||
w_class = 4
|
||||
|
||||
@@ -72,7 +72,8 @@
|
||||
add_fingerprint(user)
|
||||
if (istype(W, /obj/item/pipe) || istype(W, /obj/item/pipe_meter))
|
||||
usr << "<span class='notice'>You put [W] back into [src].</span>"
|
||||
user.drop_item()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
qdel(W)
|
||||
return
|
||||
else if (istype(W, /obj/item/weapon/wrench))
|
||||
|
||||
@@ -27,8 +27,9 @@
|
||||
if(!gun.can_charge)
|
||||
user << "<span class='notice'>Your gun has no external power connector.</span>"
|
||||
return
|
||||
if(!user.drop_item())
|
||||
return
|
||||
|
||||
user.drop_item()
|
||||
G.loc = src
|
||||
charging = G
|
||||
use_power = 2
|
||||
|
||||
@@ -90,8 +90,6 @@
|
||||
|
||||
|
||||
/obj/machinery/shield/hitby(AM as mob|obj)
|
||||
//Let everyone know we've been hit!
|
||||
visible_message("<span class='boldannounce'>[src] was hit by [AM].</span>")
|
||||
|
||||
//Super realistic, resource-intensive, real-time damage calculations.
|
||||
var/tforce = 0
|
||||
@@ -604,4 +602,4 @@
|
||||
if (istype(mover, /obj/item/projectile))
|
||||
return prob(10)
|
||||
else
|
||||
return !src.density
|
||||
return !src.density
|
||||
|
||||
@@ -77,7 +77,8 @@
|
||||
if(istype(I, /obj/item/weapon/coin))
|
||||
var/obj/item/weapon/coin/C = I
|
||||
if(prob(2))
|
||||
user.drop_item()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
C.loc = loc
|
||||
C.throw_at(user, 3, 10)
|
||||
if(prob(10))
|
||||
@@ -85,7 +86,8 @@
|
||||
user << "<span class='warning'>[src] spits your coin back out!</span>"
|
||||
|
||||
else
|
||||
user.drop_item()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
user << "<span class='notice'>You insert a [C.cmineral] coin into [src]'s slot!</span>"
|
||||
balance += C.value
|
||||
qdel(C)
|
||||
@@ -293,14 +295,14 @@
|
||||
|
||||
return amount
|
||||
|
||||
/obj/machinery/computer/slot_machine/proc/dispense(amount = 0, cointype = /obj/item/weapon/coin/silver, mob/living/target, throw = 0)
|
||||
/obj/machinery/computer/slot_machine/proc/dispense(amount = 0, cointype = /obj/item/weapon/coin/silver, mob/living/target, throwit = 0)
|
||||
var/value = coinvalues["[cointype]"]
|
||||
|
||||
|
||||
while(amount >= value)
|
||||
var/obj/item/weapon/coin/C = new cointype(loc) //DOUBLE THE PAIN
|
||||
amount -= value
|
||||
if(throw && target)
|
||||
if(throwit && target)
|
||||
C.throw_at(target, 3, 10)
|
||||
else
|
||||
random_step(C, 2, 40)
|
||||
|
||||
@@ -54,7 +54,8 @@
|
||||
// insert cell
|
||||
var/obj/item/weapon/stock_parts/cell/C = usr.get_active_hand()
|
||||
if(istype(C))
|
||||
user.drop_item()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
cell = C
|
||||
C.loc = src
|
||||
C.add_fingerprint(usr)
|
||||
@@ -134,7 +135,8 @@
|
||||
if(open && !cell)
|
||||
var/obj/item/weapon/stock_parts/cell/C = usr.get_active_hand()
|
||||
if(istype(C))
|
||||
usr.drop_item()
|
||||
if(!usr.drop_item())
|
||||
return
|
||||
cell = C
|
||||
C.loc = src
|
||||
C.add_fingerprint(usr)
|
||||
|
||||
@@ -90,9 +90,10 @@
|
||||
user << "<span class='warning'>The cover is screwed on, it won't pry off!</span>"
|
||||
else if(istype(I, /obj/item/weapon/bombcore))
|
||||
if(!payload)
|
||||
if(!user.drop_item())
|
||||
return
|
||||
payload = I
|
||||
user << "<span class='notice'>You place [payload] into [src].</span>"
|
||||
user.drop_item()
|
||||
payload.loc = src
|
||||
else
|
||||
user << "<span class='warning'>[payload] is already loaded into [src]! You'll have to remove it first.</span>"
|
||||
@@ -138,7 +139,7 @@
|
||||
var/turf/bombturf = get_turf(src)
|
||||
var/area/A = get_area(bombturf)
|
||||
if(payload && !istype(payload, /obj/item/weapon/bombcore/training))
|
||||
message_admins("[key_name(user)]<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A> has primed a [name] ([payload]) for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>.")
|
||||
message_admins("[key_name_admin(user)]<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A> (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[user]'>FLW</A>) has primed a [name] ([payload]) for detonation at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[bombturf.x];Y=[bombturf.y];Z=[bombturf.z]'>[A.name] (JMP)</a>.")
|
||||
log_game("[key_name(user)] has primed a [name] ([payload]) for detonation at [A.name]([bombturf.x],[bombturf.y],[bombturf.z])")
|
||||
payload.adminlog = "The [src.name] that [key_name(user)] had primed detonated!"
|
||||
|
||||
@@ -311,7 +312,7 @@
|
||||
var/turf/T = get_turf(src)
|
||||
var/area/A = get_area(T)
|
||||
detonated--
|
||||
var/log_str = "[key_name(user)]<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A> has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>[A.name] (JMP)</a>."
|
||||
var/log_str = "[key_name_admin(user)]<A HREF='?_src_=holder;adminmoreinfo=\ref[user]'>?</A> (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[user]'>FLW</A>) has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>[A.name] (JMP)</a>."
|
||||
bombers += log_str
|
||||
message_admins(log_str)
|
||||
log_game("[key_name(user)] has remotely detonated [detonated ? "syndicate bombs" : "a syndicate bomb"] using a [name] at [A.name]([T.x],[T.y],[T.z])")
|
||||
|
||||
@@ -168,7 +168,8 @@
|
||||
var/obj/item/weapon/card/id/I = C.get_active_hand()
|
||||
if(istype(I))
|
||||
if(check_access(I))
|
||||
C.drop_item()
|
||||
if(!C.drop_item())
|
||||
return
|
||||
I.loc = src
|
||||
auth = I
|
||||
create_log("has logged in.", usr)
|
||||
|
||||
@@ -118,12 +118,12 @@
|
||||
|
||||
/obj/machinery/telecomms/server/proc/admin_log(var/mob/mob)
|
||||
|
||||
var/msg="[mob.real_name]/([mob.key]) has compiled a script to server [src]:"
|
||||
var/msg="[key_name(mob)] has compiled a script to server [src]:"
|
||||
diary << msg
|
||||
diary << rawcode
|
||||
src.investigate_log("[msg]<br>[rawcode]", "ntsl")
|
||||
if(length(rawcode)) // Let's not bother the admins for empty code.
|
||||
message_admins("[mob.real_name]/([mob.key]) has compiled and uploaded a NTSL script to [src.id] ([mob.x],[mob.y],[mob.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[mob.x];Y=[mob.y];Z=[mob.z]'>JMP</a>)",0,1)
|
||||
message_admins("[key_name_admin(mob)] (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[usr]'>FLW</A>) has compiled and uploaded a NTSL script to [src.id]",0,1)
|
||||
|
||||
/obj/machinery/telecomms/server/proc/compile(var/mob/user)
|
||||
|
||||
|
||||
@@ -170,7 +170,8 @@
|
||||
return
|
||||
if(junk_check(W))
|
||||
if(!iscompartmentfull(user))
|
||||
user.drop_item()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
W.loc = src
|
||||
food_load(W)
|
||||
user << "<span class='notice'>You insert [W] into [src]'s chef compartment.</span>"
|
||||
@@ -250,7 +251,8 @@
|
||||
attack_hand(user)
|
||||
return
|
||||
else if(istype(W, /obj/item/weapon/coin) && premium.len > 0)
|
||||
user.drop_item()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
W.loc = src
|
||||
coin = W
|
||||
user << "<span class='notice'>You insert [W] into [src].</span>"
|
||||
@@ -719,7 +721,7 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
|
||||
vend_reply = "Remember the name: Liberation Station!"
|
||||
products = list(/obj/item/weapon/gun/projectile/automatic/pistol/deagle/gold = 2,/obj/item/weapon/gun/projectile/automatic/pistol/deagle/camo = 2,
|
||||
/obj/item/weapon/gun/projectile/automatic/pistol/m1911 = 2,/obj/item/weapon/gun/projectile/automatic/proto = 2,
|
||||
/obj/item/weapon/gun/projectile/shotgun/combat = 2,/obj/item/weapon/gun/projectile/automatic/gyropistol = 1,
|
||||
/obj/item/weapon/gun/projectile/shotgun/automatic/combat = 2,/obj/item/weapon/gun/projectile/automatic/gyropistol = 1,
|
||||
/obj/item/weapon/gun/projectile/shotgun = 2,/obj/item/weapon/gun/projectile/automatic/ar = 2)
|
||||
premium = list(/obj/item/ammo_box/magazine/smgm9mm = 2,/obj/item/ammo_box/magazine/m50 = 4,/obj/item/ammo_box/magazine/m45 = 2,/obj/item/ammo_box/magazine/m75 = 2)
|
||||
contraband = list(/obj/item/clothing/under/patriotsuit = 1,/obj/item/weapon/bedsheet/patriot = 3)
|
||||
@@ -942,7 +944,8 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
|
||||
vend_delay = 15
|
||||
vend_reply = "Thank you for using the ClothesMate!"
|
||||
products = list(/obj/item/clothing/head/that=2,/obj/item/clothing/head/fedora=1,/obj/item/clothing/glasses/monocle=1,
|
||||
/obj/item/clothing/suit/jacket=3,/obj/item/clothing/under/suit_jacket/navy=2,/obj/item/clothing/under/suit_jacket/really_black=2,/obj/item/clothing/under/kilt=1,/obj/item/clothing/under/overalls=1,
|
||||
/obj/item/clothing/suit/jacket=3,/obj/item/clothing/under/suit_jacket/navy=1,/obj/item/clothing/under/suit_jacket/really_black=1,/obj/item/clothing/under/suit_jacket/burgundy=1,
|
||||
/obj/item/clothing/under/suit_jacket/charcoal=1, /obj/item/clothing/under/suit_jacket/white=1,/obj/item/clothing/under/kilt=1,/obj/item/clothing/under/overalls=1,
|
||||
/obj/item/clothing/under/sl_suit=1,/obj/item/clothing/under/pants/jeans=3,/obj/item/clothing/under/pants/classicjeans=2,
|
||||
/obj/item/clothing/under/pants/camo = 1,/obj/item/clothing/under/pants/blackjeans=2,/obj/item/clothing/under/pants/khaki=2,
|
||||
/obj/item/clothing/under/pants/white=2,/obj/item/clothing/under/pants/red=1,/obj/item/clothing/under/pants/black=2,
|
||||
@@ -960,6 +963,6 @@ IF YOU MODIFY THE PRODUCTS LIST OF A MACHINE, MAKE SURE TO UPDATE ITS RESUPPLY C
|
||||
/obj/item/clothing/shoes/sandal=1, /obj/item/clothing/gloves/fingerless=2,/obj/item/clothing/glasses/orange=1,/obj/item/clothing/glasses/red=1,
|
||||
/obj/item/weapon/storage/belt/fannypack=1, /obj/item/weapon/storage/belt/fannypack/blue=1, /obj/item/weapon/storage/belt/fannypack/red=1)
|
||||
contraband = list(/obj/item/clothing/under/syndicate/tacticool=1,/obj/item/clothing/mask/balaclava=1,/obj/item/clothing/head/ushanka=1,/obj/item/clothing/under/soviet=1,/obj/item/weapon/storage/belt/fannypack/black=1)
|
||||
premium = list(/obj/item/clothing/under/suit_jacket/checkered=1,/obj/item/clothing/head/mailman=1,/obj/item/clothing/under/rank/mailman=1,/obj/item/clothing/suit/jacket/leather=1,/obj/item/clothing/under/pants/mustangjeans=1)
|
||||
premium = list(/obj/item/clothing/under/suit_jacket/checkered=1,/obj/item/clothing/head/mailman=1,/obj/item/clothing/under/rank/mailman=1,/obj/item/clothing/suit/jacket/leather=1,/obj/item/clothing/suit/jacket/leather/overcoat=1,/obj/item/clothing/under/pants/mustangjeans=1)
|
||||
refill_canister = /obj/item/weapon/vending_refill/clothing
|
||||
|
||||
|
||||
@@ -188,7 +188,8 @@
|
||||
if(istype(W,/obj/item/toy/crayon) ||istype(W,/obj/item/weapon/stamp))
|
||||
if( state in list( 1, 3, 6 ) )
|
||||
if(!crayon)
|
||||
user.drop_item()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
crayon = W
|
||||
crayon.loc = src
|
||||
else
|
||||
@@ -256,7 +257,8 @@
|
||||
|
||||
if(contents.len < 5)
|
||||
if ( state in list(1, 3) )
|
||||
user.drop_item()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
W.loc = src
|
||||
state = 3
|
||||
else
|
||||
|
||||
@@ -595,8 +595,8 @@
|
||||
P.icon_state = "anom"
|
||||
P.name = "wormhole"
|
||||
var/turf/T = get_turf(target)
|
||||
message_admins("[key_name(chassis.occupant, chassis.occupant.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[chassis.occupant]'>?</A>) used a Wormhole Generator in ([T.x],[T.y],[T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)",0,1)
|
||||
log_game("[chassis.occupant.ckey]([chassis.occupant]) used a Wormhole Generator in ([T.x],[T.y],[T.z])")
|
||||
message_admins("[key_name_admin(chassis.occupant, chassis.occupant.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[chassis.occupant]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[chassis.occupant]'>FLW</A>) used a Wormhole Generator in ([T.x],[T.y],[T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)",0,1)
|
||||
log_game("[key_name(chassis.occupant)] used a Wormhole Generator in ([T.x],[T.y],[T.z])")
|
||||
do_after_cooldown()
|
||||
src = null
|
||||
spawn(rand(150,300))
|
||||
|
||||
@@ -191,7 +191,7 @@
|
||||
chassis.use_power(energy_drain)
|
||||
log_message("Honked from [src.name]. HONK!")
|
||||
var/turf/T = get_turf(src)
|
||||
message_admins("[key_name(chassis.occupant, chassis.occupant.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[chassis.occupant]'>?</A>) used a Mecha Honker in ([T.x],[T.y],[T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)",0,1)
|
||||
message_admins("[key_name_admin(chassis.occupant, chassis.occupant.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[chassis.occupant]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[chassis.occupant]'>FLW</A>) used a Mecha Honker in ([T.x],[T.y],[T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)",0,1)
|
||||
log_game("[chassis.occupant.ckey]([chassis.occupant]) used a Mecha Honker in ([T.x],[T.y],[T.z])")
|
||||
do_after_cooldown()
|
||||
return
|
||||
@@ -307,7 +307,7 @@
|
||||
log_message("Fired from [src.name], targeting [target].")
|
||||
var/turf/T = get_turf(src)
|
||||
message_admins("[key_name(chassis.occupant, chassis.occupant.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[chassis.occupant]'>?</A>) fired a [src] in ([T.x],[T.y],[T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)",0,1)
|
||||
log_game("[chassis.occupant.ckey]([chassis.occupant]) fired a [src] ([T.x],[T.y],[T.z])")
|
||||
log_game("[key_name(chassis.occupant)] fired a [src] ([T.x],[T.y],[T.z])")
|
||||
do_after_cooldown()
|
||||
return
|
||||
|
||||
@@ -347,8 +347,8 @@
|
||||
projectiles--
|
||||
log_message("Fired from [src.name], targeting [target].")
|
||||
var/turf/T = get_turf(src)
|
||||
message_admins("[key_name(chassis.occupant, chassis.occupant.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[chassis.occupant]'>?</A>) fired a [src] in ([T.x],[T.y],[T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)",0,1)
|
||||
log_game("[chassis.occupant.ckey]([chassis.occupant]) fired a [src] ([T.x],[T.y],[T.z])")
|
||||
message_admins("[key_name(chassis.occupant, chassis.occupant.client)](<A HREF='?_src_=holder;adminmoreinfo=\ref[chassis.occupant]'>?</A>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[chassis.occupant]'>FLW</A>) fired a [src] in ([T.x],[T.y],[T.z] - <A HREF='?_src_=holder;adminplayerobservecoodjump=1;X=[T.x];Y=[T.y];Z=[T.z]'>JMP</a>)",0,1)
|
||||
log_game("[key_name(chassis.occupant)] fired a [src] ([T.x],[T.y],[T.z])")
|
||||
spawn(det_time)
|
||||
if(F)
|
||||
F.prime()
|
||||
|
||||
+105
-66
@@ -96,7 +96,10 @@
|
||||
/obj/mecha/Destroy()
|
||||
go_out()
|
||||
for(var/mob/M in src) //Let's just be ultra sure
|
||||
M.Move(loc)
|
||||
if(isAI(M))
|
||||
M.gib() //AIs are loaded into the mech computer itself. When the mech dies, so does the AI. Forever.
|
||||
else
|
||||
M.Move(loc)
|
||||
|
||||
if(prob(30))
|
||||
explosion(get_turf(loc), 0, 0, 1, 3)
|
||||
@@ -675,7 +678,8 @@
|
||||
var/obj/item/mecha_parts/mecha_equipment/E = W
|
||||
spawn()
|
||||
if(E.can_attach(src))
|
||||
user.drop_item()
|
||||
if(!user.drop_item())
|
||||
return
|
||||
E.attach(src)
|
||||
user.visible_message("[user] attaches [W] to [src].", "<span class='notice'>You attach [W] to [src].</span>")
|
||||
else
|
||||
@@ -739,9 +743,10 @@
|
||||
else if(istype(W, /obj/item/weapon/stock_parts/cell))
|
||||
if(state==4)
|
||||
if(!src.cell)
|
||||
if(!user.drop_item())
|
||||
return
|
||||
var/obj/item/weapon/stock_parts/cell/C = W
|
||||
user << "<span class='notice'>You install the powercell.</span>"
|
||||
user.drop_item()
|
||||
C.forceMove(src)
|
||||
C.use(C.charge * 0.8)
|
||||
src.cell = C
|
||||
@@ -780,17 +785,92 @@
|
||||
call((proc_res["dynattackby"]||src), "dynattackby")(W,user)
|
||||
return
|
||||
|
||||
/*
|
||||
/obj/mecha/attack_ai(var/mob/living/silicon/ai/user as mob)
|
||||
if(!istype(user, /mob/living/silicon/ai))
|
||||
return
|
||||
var/output = {"<b>Assume direct control over [src]?</b>
|
||||
<a href='?src=\ref[src];ai_take_control=\ref[user];duration=3000'>Yes</a><br>
|
||||
"}
|
||||
user << browse(output, "window=mecha_attack_ai")
|
||||
return
|
||||
*/
|
||||
/////////////////////////////////////
|
||||
//////////// AI piloting ////////////
|
||||
/////////////////////////////////////
|
||||
|
||||
/obj/mecha/attack_ai(var/mob/living/silicon/ai/user as mob)
|
||||
if(!isAI(user))
|
||||
return
|
||||
//Allows the Malf to scan a mech's status and loadout, helping it to decide if it is a worthy chariot.
|
||||
if(user.can_dominate_mechs)
|
||||
examine(user) //Get diagnostic information!
|
||||
var/obj/item/mecha_parts/mecha_tracking/B = locate(/obj/item/mecha_parts/mecha_tracking) in src
|
||||
if(B) //Beacons give the AI more detailed mech information.
|
||||
user << "<span class='danger'>Warning: Tracking Beacon detected. Enter at your own risk. Beacon Data:"
|
||||
user << "[B.get_mecha_info()]"
|
||||
//Nothing like a big, red link to make the player feel powerful!
|
||||
user << "<a href='?src=\ref[user];ai_take_control=\ref[src]'><span class='userdanger'>ASSUME DIRECT CONTROL?</span></a><br>"
|
||||
|
||||
/obj/mecha/transfer_ai(var/interaction, mob/user, var/mob/living/silicon/ai/AI, var/obj/item/device/aicard/card)
|
||||
if(!..())
|
||||
return
|
||||
|
||||
//Transfer from core or card to mech. Proc is called by mech.
|
||||
switch(interaction)
|
||||
if(AI_TRANS_TO_CARD) //Upload AI from mech to AI card.
|
||||
if(!state) //Mech must be in maint mode to allow carding.
|
||||
user << "<span class='warning'>[name] must have maintenance protocols active in order to allow a transfer.</span>"
|
||||
return
|
||||
AI = occupant
|
||||
if(!AI || !isAI(occupant)) //Mech does not have an AI for a pilot
|
||||
user << "<span class='warning'>No AI detected in the [name] onboard computer.</span>"
|
||||
return
|
||||
if (AI.mind.special_role == "malfunction") //Malf AIs cannot leave mechs. Except through death.
|
||||
user << "<span class='boldannounce'>ACCESS DENIED.</span>"
|
||||
return
|
||||
AI.aiRestorePowerRoutine = 0//So the AI initially has power.
|
||||
AI.control_disabled = 1
|
||||
AI.radio_enabled = 0
|
||||
AI.loc = card
|
||||
occupant = null
|
||||
AI.controlled_mech = null
|
||||
AI.remote_control = null
|
||||
icon_state = initial(icon_state)+"-open"
|
||||
AI << "You have been downloaded to a mobile storage device. Wireless connection offline."
|
||||
user << "<span class='boldnotice'>Transfer successful</span>: [AI.name] ([rand(1000,9999)].exe) removed from [name] and stored within local memory."
|
||||
|
||||
if(AI_MECH_HACK) //Called by Malf AI mob on the mech.
|
||||
new /obj/structure/AIcore/deactivated(AI.loc)
|
||||
if(occupant) //Oh, I am sorry, were you using that?
|
||||
AI << "<span class='warning'>Pilot detected! Forced ejection initiated!"
|
||||
occupant << "<span class='danger'>You have been forcibly ejected!</span>"
|
||||
go_out(1) //IT IS MINE, NOW. SUCK IT, RD!
|
||||
ai_enter_mech(AI, interaction)
|
||||
|
||||
if(AI_TRANS_FROM_CARD) //Using an AI card to upload to a mech.
|
||||
AI = locate(/mob/living/silicon/ai) in card
|
||||
if(!AI)
|
||||
user << "<span class='warning'>There is no AI currently installed on this device.</span>"
|
||||
return
|
||||
else if(AI.stat || !AI.client)
|
||||
user << "<span class='warning'>[AI.name] is currently unresponsive, and cannot be uploaded.</span>"
|
||||
return
|
||||
else if(occupant || dna) //Normal AIs cannot steal mechs!
|
||||
user << "<span class='warning'>Access denied. [name] is [occupant ? "currently occupied" : "secured with a DNA lock"]."
|
||||
return
|
||||
AI.control_disabled = 0
|
||||
AI.radio_enabled = 1
|
||||
user << "<span class='boldnotice'>Transfer successful</span>: [AI.name] ([rand(1000,9999)].exe) installed and executed successfully. Local copy has been removed."
|
||||
ai_enter_mech(AI, interaction)
|
||||
|
||||
//Hack and From Card interactions share some code, so leave that here for both to use.
|
||||
/obj/mecha/proc/ai_enter_mech(var/mob/living/silicon/ai/AI, var/interaction)
|
||||
AI.aiRestorePowerRoutine = 0
|
||||
AI.loc = src
|
||||
occupant = AI
|
||||
icon_state = initial(icon_state)
|
||||
playsound(src, 'sound/machines/windowdoor.ogg', 50, 1)
|
||||
if(!hasInternalDamage())
|
||||
occupant << sound('sound/mecha/nominal.ogg',volume=50)
|
||||
AI.cancel_camera()
|
||||
AI.controlled_mech = src
|
||||
AI.remote_control = src
|
||||
AI.canmove = 1 //Much easier than adding AI checks! Be sure to set this back to 0 if you decide to allow an AI to leave a mech somehow.
|
||||
AI.can_shunt = 0 //ONE AI ENTERS. NO AI LEAVES.
|
||||
AI << "[interaction == AI_MECH_HACK ? "<span class='announce'>Takeover of [name] complete! You are now permanently loaded onto the onboard computer. Do not attempt to leave the station sector!</span>" \
|
||||
: "<span class='notice'>You have been uploaded to a mech's onboard computer."]"
|
||||
AI << "<span class='boldnotice'>Use Middle-Mouse to activate mech functions and equipment. Click normally for AI interactions.</span>"
|
||||
|
||||
|
||||
/////////////////////////////////////
|
||||
@@ -1088,7 +1168,7 @@
|
||||
go_out()
|
||||
|
||||
|
||||
/obj/mecha/proc/go_out()
|
||||
/obj/mecha/proc/go_out(var/forced)
|
||||
if(!src.occupant) return
|
||||
var/atom/movable/mob_container
|
||||
if(ishuman(occupant))
|
||||
@@ -1098,6 +1178,10 @@
|
||||
else if(istype(occupant, /mob/living/carbon/brain))
|
||||
var/mob/living/carbon/brain/brain = occupant
|
||||
mob_container = brain.container
|
||||
else if(isAI(occupant) && forced) //This should only happen if there are multiple AIs in a round, and at least one is Malf.
|
||||
occupant.gib() //If one Malf decides to steal a mech from another AI (even other Malfs!), they are destroyed, as they have nowhere to go when replaced.
|
||||
occupant = null
|
||||
return
|
||||
else
|
||||
return
|
||||
if(mob_container.forceMove(src.loc))//ejecting mob container
|
||||
@@ -1518,10 +1602,13 @@ var/year_integer = text2num(year) // = 2013???
|
||||
user << browse(null,"window=exosuit_add_access")
|
||||
return
|
||||
if(href_list["dna_lock"])
|
||||
if(usr != src.occupant) return
|
||||
if(src.occupant && occupant.dna)
|
||||
src.dna = src.occupant.dna.unique_enzymes
|
||||
src.occupant_message("You feel a prick as the needle takes your DNA sample.")
|
||||
if(usr != src.occupant)
|
||||
return
|
||||
if(src.occupant && !iscarbon(src.occupant))
|
||||
src.occupant << "<span class='danger'> You do not have any DNA!</span>"
|
||||
return
|
||||
src.dna = src.occupant.dna.unique_enzymes
|
||||
src.occupant_message("You feel a prick as the needle takes your DNA sample.")
|
||||
return
|
||||
if(href_list["reset_dna"])
|
||||
if(usr != src.occupant) return
|
||||
@@ -1550,54 +1637,6 @@ var/year_integer = text2num(year) // = 2013???
|
||||
return
|
||||
*/
|
||||
|
||||
|
||||
|
||||
/*
|
||||
|
||||
if (href_list["ai_take_control"])
|
||||
var/mob/living/silicon/ai/AI = locate(href_list["ai_take_control"])
|
||||
var/duration = text2num(href_list["duration"])
|
||||
var/mob/living/silicon/ai/O = new /mob/living/silicon/ai(src)
|
||||
var/cur_occupant = src.occupant
|
||||
O.invisibility = 0
|
||||
O.canmove = 1
|
||||
O.name = AI.name
|
||||
O.real_name = AI.real_name
|
||||
O.anchored = 1
|
||||
O.aiRestorePowerRoutine = 0
|
||||
O.control_disabled = 1 // Can't control things remotely if you're stuck in a card!
|
||||
O.laws = AI.laws
|
||||
O.stat = AI.stat
|
||||
O.oxyloss = AI.getOxyLoss()
|
||||
O.fireloss = AI.getFireLoss()
|
||||
O.bruteloss = AI.getBruteLoss()
|
||||
O.toxloss = AI.toxloss
|
||||
O.updatehealth()
|
||||
src.occupant = O
|
||||
if(AI.mind)
|
||||
AI.mind.transfer_to(O)
|
||||
AI.name = "Inactive AI"
|
||||
AI.real_name = "Inactive AI"
|
||||
AI.icon_state = "ai-empty"
|
||||
spawn(duration)
|
||||
AI.name = O.name
|
||||
AI.real_name = O.real_name
|
||||
if(O.mind)
|
||||
O.mind.transfer_to(AI)
|
||||
AI.control_disabled = 0
|
||||
AI.laws = O.laws
|
||||
AI.oxyloss = O.getOxyLoss()
|
||||
AI.fireloss = O.getFireLoss()
|
||||
AI.bruteloss = O.getBruteLoss()
|
||||
AI.toxloss = O.toxloss
|
||||
AI.updatehealth()
|
||||
qdel(O)
|
||||
if (!AI.stat)
|
||||
AI.icon_state = "ai"
|
||||
else
|
||||
AI.icon_state = "ai-crash"
|
||||
src.occupant = cur_occupant
|
||||
*/
|
||||
return
|
||||
|
||||
///////////////////////
|
||||
|
||||
@@ -109,7 +109,6 @@
|
||||
|
||||
/obj/structure/alien/resin/hitby(atom/movable/AM)
|
||||
..()
|
||||
visible_message("<span class='danger'>[src] was hit by [AM].</span>")
|
||||
var/tforce = 0
|
||||
if(!isobj(AM))
|
||||
tforce = 10
|
||||
@@ -516,4 +515,4 @@
|
||||
#undef WEED_NORTH_EDGING
|
||||
#undef WEED_SOUTH_EDGING
|
||||
#undef WEED_EAST_EDGING
|
||||
#undef WEED_WEST_EDGING
|
||||
#undef WEED_WEST_EDGING
|
||||
|
||||
@@ -44,7 +44,7 @@
|
||||
/obj/effect/anomaly/grav
|
||||
name = "gravitational anomaly"
|
||||
icon_state = "shield2"
|
||||
density = 1
|
||||
density = 0
|
||||
var/boing = 0
|
||||
|
||||
/obj/effect/anomaly/grav/New()
|
||||
@@ -60,6 +60,12 @@
|
||||
step_towards(O,src)
|
||||
for(var/mob/living/M in orange(4, src))
|
||||
step_towards(M,src)
|
||||
for(var/obj/O in orange(1,src))
|
||||
if(!O.anchored)
|
||||
var/mob/living/target = locate() in view(10,src)
|
||||
if(!target)
|
||||
O.throw_at(target, 5, 10)
|
||||
|
||||
|
||||
/obj/effect/anomaly/grav/Bump(mob/A)
|
||||
gravShock(A)
|
||||
|
||||
@@ -262,7 +262,7 @@
|
||||
var/mob/M = get_mob_by_key(carry.my_atom.fingerprintslast)
|
||||
var/more = ""
|
||||
if(M)
|
||||
more = "(<A HREF='?_src_=holder;adminmoreinfo=\ref[M]'>?</a>)"
|
||||
more = "(<A HREF='?_src_=holder;adminmoreinfo=\ref[M]'>?</a>) (<A HREF='?_src_=holder;adminplayerobservefollow=\ref[M]'>FLW</A>) "
|
||||
message_admins("A chemical smoke reaction has taken place in ([whereLink])[contained]. Last associated key is [carry.my_atom.fingerprintslast][more].", 0, 1)
|
||||
log_game("A chemical smoke reaction has taken place in ([where])[contained]. Last associated key is [carry.my_atom.fingerprintslast].")
|
||||
else
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
|
||||
loot = list(
|
||||
/obj/item/weapon/gun/projectile/automatic/pistol = 8,
|
||||
/obj/item/weapon/gun/projectile/shotgun/combat = 5,
|
||||
/obj/item/weapon/gun/projectile/shotgun/automatic/combat = 5,
|
||||
/obj/item/weapon/gun/projectile/revolver/mateba,
|
||||
/obj/item/weapon/gun/projectile/automatic/pistol/deagle
|
||||
)
|
||||
|
||||
@@ -0,0 +1,33 @@
|
||||
/*
|
||||
Because mapping is already tedious enough this spawner let you spawn generic
|
||||
"sets" of objects rather than having to make the same object stack again and
|
||||
again.
|
||||
*/
|
||||
|
||||
/obj/effect/spawner/structure
|
||||
name = "map structure spawner"
|
||||
var/list/spawn_list
|
||||
|
||||
/obj/effect/spawner/structure/New()
|
||||
if(spawn_list && spawn_list.len)
|
||||
for(var/i = 1, i <= spawn_list.len, i++)
|
||||
var/to_spawn = spawn_list[i]
|
||||
new to_spawn(get_turf(src))
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/spawner/structure/window
|
||||
icon = 'icons/obj/structures.dmi'
|
||||
icon_state = "window_spawner"
|
||||
name = "window spawner"
|
||||
spawn_list = list(
|
||||
/obj/structure/grille,
|
||||
/obj/structure/window/fulltile
|
||||
)
|
||||
|
||||
/obj/effect/spawner/structure/window/reinforced
|
||||
name = "reenforced window spawner"
|
||||
icon_state = "rwindow_spawner"
|
||||
spawn_list = list(
|
||||
/obj/structure/grille,
|
||||
/obj/structure/window/reinforced/fulltile
|
||||
)
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user