mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-20 03:25:49 +01:00
Unused/WorkInProgress folder cleanup
This commit is contained in:
@@ -0,0 +1,267 @@
|
||||
/obj/item/weapon/circuitboard/atmoscontrol
|
||||
name = "\improper Central Atmospherics Computer Circuitboard"
|
||||
build_path = /obj/machinery/computer/atmoscontrol
|
||||
|
||||
/obj/machinery/computer/atmoscontrol
|
||||
name = "\improper Central Atmospherics Computer"
|
||||
icon = 'icons/obj/computer.dmi'
|
||||
icon_state = "tank"
|
||||
density = 1
|
||||
anchored = 1.0
|
||||
circuit = "/obj/item/weapon/circuitboard/atmoscontrol"
|
||||
var/obj/machinery/alarm/current
|
||||
var/list/filter=null
|
||||
var/overridden = 0 //not set yet, can't think of a good way to do it
|
||||
req_one_access = list(access_ce)
|
||||
|
||||
|
||||
/obj/machinery/computer/atmoscontrol/attack_ai(var/mob/user as mob)
|
||||
src.add_hiddenprint(user)
|
||||
return interact(user)
|
||||
|
||||
/obj/machinery/computer/atmoscontrol/attack_paw(var/mob/user as mob)
|
||||
return interact(user)
|
||||
|
||||
/obj/machinery/computer/atmoscontrol/attack_hand(mob/user)
|
||||
if(..())
|
||||
return
|
||||
return interact(user)
|
||||
|
||||
/obj/machinery/computer/atmoscontrol/interact(mob/user)
|
||||
user.set_machine(src)
|
||||
if(allowed(user))
|
||||
overridden = 1
|
||||
else if(!emagged)
|
||||
overridden = 0
|
||||
|
||||
return ui_interact(user)
|
||||
|
||||
|
||||
/obj/machinery/computer/atmoscontrol/attackby(var/obj/item/I as obj, var/mob/user as mob)
|
||||
if(istype(I, /obj/item/weapon/card/emag) && !emagged)
|
||||
user.visible_message("\red \The [user] swipes \a [I] through \the [src], causing the screen to flash!",\
|
||||
"\red You swipe your [I] through \the [src], the screen flashing as you gain full control.",\
|
||||
"You hear the swipe of a card through a reader, and an electronic warble.")
|
||||
emagged = 1
|
||||
overridden = 1
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/computer/atmoscontrol/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null)
|
||||
if(user.stat && !isobserver(user))
|
||||
return
|
||||
|
||||
var/list/data[0]
|
||||
data["alarm"]=null
|
||||
if(current)
|
||||
data += current.get_nano_data(user,1,emagged)
|
||||
data["alarm"] = "\ref[current]"
|
||||
|
||||
var/list/alarms=list()
|
||||
var/list/alarm_list=list()
|
||||
for(var/obj/machinery/alarm/alarm in machines)
|
||||
alarm_list+=alarm
|
||||
for(var/obj/machinery/alarm/alarm in sortAtom(alarm_list))
|
||||
if(!is_in_filter(alarm.alarm_area.type))
|
||||
continue
|
||||
if(!alarm.remote_control)
|
||||
continue
|
||||
if(alarm.hidden)
|
||||
continue
|
||||
if(alarm.z != z)
|
||||
continue
|
||||
var/turf/pos = get_turf(alarm)
|
||||
var/list/alarm_data=list()
|
||||
alarm_data["ID"]="\ref[alarm]"
|
||||
alarm_data["danger"] = max(alarm.local_danger_level, alarm.alarm_area.atmosalm-1)
|
||||
alarm_data["name"] = "[alarm]"
|
||||
alarm_data["area"] = get_area(alarm)
|
||||
alarm_data["x"] = pos.x
|
||||
alarm_data["y"] = pos.y
|
||||
alarm_data["z"] = pos.z
|
||||
alarms+=list(alarm_data)
|
||||
data["alarms"]=alarms
|
||||
|
||||
if (!ui) // no ui has been passed, so we'll search for one
|
||||
ui = nanomanager.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, "atmos_control.tmpl", name, 900, 800)
|
||||
// adding a template with the key "mapContent" enables the map ui functionality
|
||||
ui.add_template("mapContent", "atmos_control_map_content.tmpl")
|
||||
// adding a template with the key "mapHeader" replaces the map header content
|
||||
ui.add_template("mapHeader", "atmos_control_map_header.tmpl")
|
||||
// When the UI is first opened this is the data it will use
|
||||
// we want to show the map by default
|
||||
ui.set_show_map(1)
|
||||
|
||||
ui.set_initial_data(data)
|
||||
|
||||
ui.open()
|
||||
// Auto update every Master Controller tick
|
||||
if(current)
|
||||
ui.set_auto_update(1)
|
||||
else
|
||||
// The UI is already open so push the new data to it
|
||||
ui.push_data(data)
|
||||
return
|
||||
|
||||
|
||||
/obj/machinery/computer/atmoscontrol/proc/is_in_filter(var/typepath)
|
||||
if(!filter) return 1 // YEP. TOTALLY.
|
||||
return typepath in filter
|
||||
|
||||
//a bunch of this is copied from atmos alarms
|
||||
/obj/machinery/computer/atmoscontrol/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
if(href_list["reset"])
|
||||
current = null
|
||||
|
||||
if(href_list["alarm"])
|
||||
current = locate(href_list["alarm"])
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
if(current)
|
||||
if(href_list["command"])
|
||||
var/device_id = href_list["id_tag"]
|
||||
switch(href_list["command"])
|
||||
if(
|
||||
"power",
|
||||
"adjust_external_pressure",
|
||||
"checks",
|
||||
"co2_scrub",
|
||||
"tox_scrub",
|
||||
"n2o_scrub",
|
||||
"o2_scrub",
|
||||
"panic_siphon",
|
||||
"scrubbing"
|
||||
)
|
||||
var/val
|
||||
if(href_list["val"])
|
||||
val=text2num(href_list["val"])
|
||||
else
|
||||
var/newval = input("Enter new value") as num|null
|
||||
if(isnull(newval))
|
||||
return
|
||||
val = newval
|
||||
current.send_signal(device_id, list (href_list["command"] = val))
|
||||
spawn(3)
|
||||
src.updateUsrDialog()
|
||||
//if("adjust_threshold") //was a good idea but required very wide window
|
||||
if("set_threshold")
|
||||
var/env = href_list["env"]
|
||||
var/threshold = text2num(href_list["var"])
|
||||
var/list/selected = current.TLV[env]
|
||||
var/list/thresholds = list("lower bound", "low warning", "high warning", "upper bound")
|
||||
var/newval = input("Enter [thresholds[threshold]] for [env]", "Alarm triggers", selected[threshold]) as num|null
|
||||
if (isnull(newval) || ..() || (current.locked && issilicon(usr)))
|
||||
return
|
||||
if (newval<0)
|
||||
selected[threshold] = -1.0
|
||||
else if (env=="temperature" && newval>5000)
|
||||
selected[threshold] = 5000
|
||||
else if (env=="pressure" && newval>50*ONE_ATMOSPHERE)
|
||||
selected[threshold] = 50*ONE_ATMOSPHERE
|
||||
else if (env!="temperature" && env!="pressure" && newval>200)
|
||||
selected[threshold] = 200
|
||||
else
|
||||
newval = round(newval,0.01)
|
||||
selected[threshold] = newval
|
||||
if(threshold == 1)
|
||||
if(selected[1] > selected[2])
|
||||
selected[2] = selected[1]
|
||||
if(selected[1] > selected[3])
|
||||
selected[3] = selected[1]
|
||||
if(selected[1] > selected[4])
|
||||
selected[4] = selected[1]
|
||||
if(threshold == 2)
|
||||
if(selected[1] > selected[2])
|
||||
selected[1] = selected[2]
|
||||
if(selected[2] > selected[3])
|
||||
selected[3] = selected[2]
|
||||
if(selected[2] > selected[4])
|
||||
selected[4] = selected[2]
|
||||
if(threshold == 3)
|
||||
if(selected[1] > selected[3])
|
||||
selected[1] = selected[3]
|
||||
if(selected[2] > selected[3])
|
||||
selected[2] = selected[3]
|
||||
if(selected[3] > selected[4])
|
||||
selected[4] = selected[3]
|
||||
if(threshold == 4)
|
||||
if(selected[1] > selected[4])
|
||||
selected[1] = selected[4]
|
||||
if(selected[2] > selected[4])
|
||||
selected[2] = selected[4]
|
||||
if(selected[3] > selected[4])
|
||||
selected[3] = selected[4]
|
||||
|
||||
//Sets the temperature the built-in heater/cooler tries to maintain.
|
||||
if(env == "temperature")
|
||||
if(current.target_temperature < selected[2])
|
||||
current.target_temperature = selected[2]
|
||||
if(current.target_temperature > selected[3])
|
||||
current.target_temperature = selected[3]
|
||||
|
||||
spawn(1)
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
if(href_list["screen"])
|
||||
current.screen = text2num(href_list["screen"])
|
||||
spawn(1)
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
if(href_list["atmos_unlock"])
|
||||
switch(href_list["atmos_unlock"])
|
||||
if("0")
|
||||
current.air_doors_close(1)
|
||||
if("1")
|
||||
current.air_doors_open(1)
|
||||
|
||||
if(href_list["atmos_alarm"])
|
||||
current.alarmActivated=1
|
||||
current.alarm_area.updateDangerLevel()
|
||||
spawn(1)
|
||||
src.updateUsrDialog()
|
||||
current.update_icon()
|
||||
return
|
||||
if(href_list["atmos_reset"])
|
||||
current.alarmActivated=0
|
||||
current.alarm_area.updateDangerLevel()
|
||||
spawn(1)
|
||||
src.updateUsrDialog()
|
||||
current.update_icon()
|
||||
return
|
||||
|
||||
if(href_list["mode"])
|
||||
current.mode = text2num(href_list["mode"])
|
||||
current.apply_mode()
|
||||
spawn(5)
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
if(href_list["preset"])
|
||||
current.preset = text2num(href_list["preset"])
|
||||
current.apply_preset()
|
||||
spawn(5)
|
||||
src.updateUsrDialog()
|
||||
return
|
||||
|
||||
if(href_list["temperature"])
|
||||
var/list/selected = current.TLV["temperature"]
|
||||
var/max_temperature = min(selected[3] - T0C, MAX_TEMPERATURE)
|
||||
var/min_temperature = max(selected[2] - T0C, MIN_TEMPERATURE)
|
||||
var/input_temperature = input("What temperature would you like the system to maintain? (Capped between [min_temperature]C and [max_temperature]C)", "Thermostat Controls") as num|null
|
||||
if(input_temperature==null)
|
||||
return
|
||||
if(input_temperature > max_temperature || input_temperature < min_temperature)
|
||||
usr << "Temperature must be between [min_temperature]C and [max_temperature]C"
|
||||
else
|
||||
current.target_temperature = input_temperature + T0C
|
||||
return
|
||||
updateUsrDialog()
|
||||
@@ -0,0 +1,188 @@
|
||||
/////////////////////////////////////////////
|
||||
//Guest pass ////////////////////////////////
|
||||
/////////////////////////////////////////////
|
||||
/obj/item/weapon/card/id/guest
|
||||
name = "guest pass"
|
||||
desc = "Allows temporary access to station areas."
|
||||
icon_state = "guest"
|
||||
|
||||
var/temp_access = list() //to prevent agent cards stealing access as permanent
|
||||
var/expiration_time = 0
|
||||
var/reason = "NOT SPECIFIED"
|
||||
|
||||
/obj/item/weapon/card/id/guest/GetAccess()
|
||||
if (world.time > expiration_time)
|
||||
return access
|
||||
else
|
||||
return temp_access
|
||||
|
||||
/obj/item/weapon/card/id/guest/examine()
|
||||
..()
|
||||
if (world.time < expiration_time)
|
||||
usr << "<span class='notice'>This pass expires at [worldtime2text(expiration_time)].</span>"
|
||||
else
|
||||
usr << "<span class='warning'>It expired at [worldtime2text(expiration_time)].</span>"
|
||||
|
||||
/obj/item/weapon/card/id/guest/read()
|
||||
if (world.time > expiration_time)
|
||||
usr << "<span class='notice'>This pass expired at [worldtime2text(expiration_time)].</span>"
|
||||
else
|
||||
usr << "<span class='notice'>This pass expires at [worldtime2text(expiration_time)].</span>"
|
||||
|
||||
usr << "<span class='notice'>It grants access to following areas:</span>"
|
||||
for (var/A in temp_access)
|
||||
usr << "<span class='notice'>[get_access_desc(A)].</span>"
|
||||
usr << "<span class='notice'>Issuing reason: [reason].</span>"
|
||||
return
|
||||
|
||||
/////////////////////////////////////////////
|
||||
//Guest pass terminal////////////////////////
|
||||
/////////////////////////////////////////////
|
||||
|
||||
/obj/machinery/computer/guestpass
|
||||
name = "guest pass terminal"
|
||||
icon_state = "guest"
|
||||
density = 0
|
||||
|
||||
|
||||
var/obj/item/weapon/card/id/giver
|
||||
var/list/accesses = list()
|
||||
var/giv_name = "NOT SPECIFIED"
|
||||
var/reason = "NOT SPECIFIED"
|
||||
var/duration = 5
|
||||
|
||||
var/list/internal_log = list()
|
||||
var/mode = 0 // 0 - making pass, 1 - viewing logs
|
||||
|
||||
/obj/machinery/computer/guestpass/attackby(obj/O, mob/user)
|
||||
if(istype(O, /obj/item/weapon/card/id))
|
||||
if(!giver)
|
||||
user.drop_item()
|
||||
O.loc = src
|
||||
giver = O
|
||||
updateUsrDialog()
|
||||
else
|
||||
user << "<span class='warning'>There is already ID card inside.</span>"
|
||||
|
||||
/obj/machinery/computer/guestpass/attack_ai(var/mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/guestpass/attack_paw(var/mob/user as mob)
|
||||
return attack_hand(user)
|
||||
|
||||
/obj/machinery/computer/guestpass/attack_hand(var/mob/user as mob)
|
||||
if(..())
|
||||
return
|
||||
|
||||
user.set_machine(src)
|
||||
var/dat
|
||||
|
||||
if (mode == 1) //Logs
|
||||
dat += "<h3>Activity log</h3><br>"
|
||||
for (var/entry in internal_log)
|
||||
dat += "[entry]<br><hr>"
|
||||
dat += "<a href='?src=\ref[src];action=print'>Print</a><br>"
|
||||
dat += "<a href='?src=\ref[src];mode=0'>Back</a><br>"
|
||||
else
|
||||
dat += "<h3>Guest pass terminal #[uid]</h3><br>"
|
||||
dat += "<a href='?src=\ref[src];mode=1'>View activity log</a><br><br>"
|
||||
dat += "Issuing ID: <a href='?src=\ref[src];action=id'>[giver]</a><br>"
|
||||
dat += "Issued to: <a href='?src=\ref[src];choice=giv_name'>[giv_name]</a><br>"
|
||||
dat += "Reason: <a href='?src=\ref[src];choice=reason'>[reason]</a><br>"
|
||||
dat += "Duration (minutes): <a href='?src=\ref[src];choice=duration'>[duration] m</a><br>"
|
||||
dat += "Access to areas:<br>"
|
||||
if (giver && giver.access)
|
||||
for (var/A in giver.access)
|
||||
var/area = get_access_desc(A)
|
||||
if (A in accesses)
|
||||
area = "<b>[area]</b>"
|
||||
dat += "<a href='?src=\ref[src];choice=access;access=[A]'>[area]</a><br>"
|
||||
dat += "<br><a href='?src=\ref[src];action=issue'>Issue pass</a><br>"
|
||||
|
||||
user << browse(dat, "window=guestpass;size=400x520")
|
||||
onclose(user, "guestpass")
|
||||
|
||||
|
||||
/obj/machinery/computer/guestpass/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
usr.set_machine(src)
|
||||
if (href_list["mode"])
|
||||
mode = text2num(href_list["mode"])
|
||||
|
||||
if (href_list["choice"])
|
||||
switch(href_list["choice"])
|
||||
if ("giv_name")
|
||||
var/nam = strip_html_simple(input("Person pass is issued to", "Name", giv_name) as text|null)
|
||||
if (nam)
|
||||
giv_name = nam
|
||||
if ("reason")
|
||||
var/reas = strip_html_simple(input("Reason why pass is issued", "Reason", reason) as text|null)
|
||||
if(reas)
|
||||
reason = reas
|
||||
if ("duration")
|
||||
var/dur = input("Duration (in minutes) during which pass is valid (up to 30 minutes).", "Duration") as num|null
|
||||
if (dur)
|
||||
if (dur > 0 && dur <= 30)
|
||||
duration = dur
|
||||
else
|
||||
usr << "<span class='warning'>Invalid duration.</span>"
|
||||
if ("access")
|
||||
var/A = text2num(href_list["access"])
|
||||
if (A in accesses)
|
||||
accesses.Remove(A)
|
||||
else
|
||||
accesses.Add(A)
|
||||
if (href_list["action"])
|
||||
switch(href_list["action"])
|
||||
if ("id")
|
||||
if (giver)
|
||||
if(ishuman(usr))
|
||||
giver.loc = usr.loc
|
||||
if(!usr.get_active_hand())
|
||||
usr.put_in_hands(giver)
|
||||
giver = null
|
||||
else
|
||||
giver.loc = src.loc
|
||||
giver = null
|
||||
accesses.Cut()
|
||||
else
|
||||
var/obj/item/I = usr.get_active_hand()
|
||||
if (istype(I, /obj/item/weapon/card/id))
|
||||
usr.drop_item()
|
||||
I.loc = src
|
||||
giver = I
|
||||
updateUsrDialog()
|
||||
|
||||
if ("print")
|
||||
var/dat = "<h3>Activity log of guest pass terminal #[uid]</h3><br>"
|
||||
for (var/entry in internal_log)
|
||||
dat += "[entry]<br><hr>"
|
||||
//usr << "Printing the log, standby..."
|
||||
//sleep(50)
|
||||
var/obj/item/weapon/paper/P = new/obj/item/weapon/paper( loc )
|
||||
P.name = "activity log"
|
||||
P.info = dat
|
||||
|
||||
if ("issue")
|
||||
if (giver)
|
||||
var/number = add_zero("[rand(0,9999)]", 4)
|
||||
var/entry = "\[[worldtime2text()]\] Pass #[number] issued by [giver.registered_name] ([giver.assignment]) to [giv_name]. Reason: [reason]. Grants access to following areas: "
|
||||
for (var/i=1 to accesses.len)
|
||||
var/A = accesses[i]
|
||||
if (A)
|
||||
var/area = get_access_desc(A)
|
||||
entry += "[i > 1 ? ", [area]" : "[area]"]"
|
||||
entry += ". Expires at [worldtime2text(world.time + duration*10*60)]."
|
||||
internal_log.Add(entry)
|
||||
|
||||
var/obj/item/weapon/card/id/guest/pass = new(src.loc)
|
||||
pass.temp_access = accesses.Copy()
|
||||
pass.registered_name = giv_name
|
||||
pass.expiration_time = world.time + duration*10*60
|
||||
pass.reason = reason
|
||||
pass.name = "guest pass #[number]"
|
||||
else
|
||||
usr << "\red Cannot issue pass without issuing ID."
|
||||
updateUsrDialog()
|
||||
return
|
||||
@@ -0,0 +1,735 @@
|
||||
|
||||
// TODO: Check access
|
||||
// TODO: Renameable circuit boards
|
||||
// TODO: Disks? Disassembly?
|
||||
|
||||
/obj/machinery/programmable
|
||||
name = "Programmable Unloader"
|
||||
icon = 'icons/obj/machines/mining_machines.dmi'
|
||||
icon_state = "unloader"
|
||||
density = 1
|
||||
anchored = 1.0
|
||||
|
||||
var/debug = 0 // When set, this WILL spam people around the machine.
|
||||
// Identifies profile used and on which item.
|
||||
|
||||
var/on = 1
|
||||
var/indir = 8
|
||||
var/outdir = 4
|
||||
var/turf/input = null
|
||||
var/turf/output = null
|
||||
var/typename = "Unloader"
|
||||
var/ident = "#1"
|
||||
|
||||
var/const/workmax = 20
|
||||
var/datum/cargoprofile/default = new()
|
||||
var/list/profiles = list(new/datum/cargoprofile/cargo(),new/datum/cargoprofile/boxes(),new/datum/cargoprofile/supplies(),
|
||||
new/datum/cargoprofile/exotics(),new/datum/cargoprofile/tools(),new/datum/cargoprofile/weapons(),
|
||||
new/datum/cargoprofile/pressure(),new/datum/cargoprofile/chemical(),
|
||||
new/datum/cargoprofile/food(),new/datum/cargoprofile/clothing(),new/datum/cargoprofile/trash())
|
||||
var/list/overrides = list(new/datum/cargoprofile/cargo/unload(),new/datum/cargoprofile/in_stacker())
|
||||
var/list/emag_overrides = list(new/datum/cargoprofile/people(),new/datum/cargoprofile/unary/shredder(),new/datum/cargoprofile/unary/trainer())
|
||||
var/list/types = list()
|
||||
|
||||
anchored = 1
|
||||
var/unwrenched = 0
|
||||
use_power = 1
|
||||
var/sleep = 0 // When set, the machine will skip the next however-many updates (to avoid spam)
|
||||
var/open = 0
|
||||
var/circuit_removed = 0
|
||||
|
||||
|
||||
|
||||
/obj/machinery/programmable/New()
|
||||
..()
|
||||
if(default)
|
||||
default.master = src
|
||||
if(!default.enabled)
|
||||
default.enabled = 1
|
||||
for(var/datum/cargoprofile/p in emag_overrides + overrides + profiles)
|
||||
p.master = src
|
||||
input = get_step(src.loc,indir)
|
||||
output = get_step(src.loc,outdir)
|
||||
var/count = 0
|
||||
for(var/obj/machinery/programmable/other in world)
|
||||
if(other.typename == typename)
|
||||
count++
|
||||
ident = "#[count]"
|
||||
name = "[typename] [ident]"
|
||||
|
||||
/obj/machinery/programmable/RefreshParts()
|
||||
//This is called when the machine was constructed.
|
||||
//Unfortunately, it puts machine parts in our contents list, which we're using.
|
||||
//Fortunately, we aren't likely to ever need the components list, circuitboard excepted.
|
||||
|
||||
for(var/obj/O in contents)
|
||||
if(istype(O,/obj/item/weapon/circuitboard/programmable))//retrieve settings here
|
||||
|
||||
var/obj/item/weapon/circuitboard/programmable/C = O
|
||||
|
||||
default = C.default
|
||||
emagged = C.emagged
|
||||
profiles = C.profiles
|
||||
overrides = C.overrides
|
||||
emag_overrides = C.emag_overrides
|
||||
|
||||
//unary and binary methods (one vs two locales) don't mix
|
||||
|
||||
if(istype(src,/obj/machinery/programmable/unary))
|
||||
for(var/datum/cargoprofile/P in profiles)
|
||||
if(!istype(P,/datum/cargoprofile/unary) && !P.universal)
|
||||
profiles -= P
|
||||
for(var/datum/cargoprofile/P in overrides)
|
||||
if(!istype(P,/datum/cargoprofile/unary) && !P.universal)
|
||||
overrides -= P
|
||||
for(var/datum/cargoprofile/P in emag_overrides)
|
||||
if(!istype(P,/datum/cargoprofile/unary) && !P.universal)
|
||||
emag_overrides -= P
|
||||
else
|
||||
for(var/datum/cargoprofile/P in profiles)
|
||||
if(istype(P,/datum/cargoprofile/unary) && !P.universal)
|
||||
profiles -= P
|
||||
for(var/datum/cargoprofile/P in overrides)
|
||||
if(istype(P,/datum/cargoprofile/unary) && !P.universal)
|
||||
overrides -= P
|
||||
for(var/datum/cargoprofile/P in emag_overrides)
|
||||
if(istype(P,/datum/cargoprofile/unary) && !P.universal)
|
||||
emag_overrides -= P
|
||||
if(default)
|
||||
default.master = src
|
||||
for(var/datum/cargoprofile/p in emag_overrides + overrides + profiles)
|
||||
p.master = src
|
||||
|
||||
del C
|
||||
else
|
||||
del O
|
||||
|
||||
/obj/machinery/programmable/attack_hand(mob/user as mob)
|
||||
if(stat) // moved, or something else
|
||||
return
|
||||
usr.set_machine(src)
|
||||
interact(user)
|
||||
|
||||
/obj/machinery/programmable/proc/printlist(var/list/L)
|
||||
var/dat
|
||||
for(var/datum/cargoprofile/p in L)
|
||||
dat += "[p.name]: <A href='?src=\ref[src];operation=[p.id]'>[p.enabled?"<B>YES</B>":"NO"]</A><BR>"
|
||||
return dat
|
||||
|
||||
/obj/machinery/programmable/proc/buildMenu()
|
||||
var/dat
|
||||
dat += "<B>PROGRAMMABLE UNLOADER</B><BR><TT>"
|
||||
dat += "POWER: <A href='?src=\ref[src];operation=start'>[on ? "ON" : "OFF"]</A><BR>"
|
||||
dat += "INLET: <A href='?src=\ref[src];operation=inlet'>[capitalize(dir2text(indir))]</A> "
|
||||
dat += "OUTLET: <A href='?src=\ref[src];operation=outlet'>[capitalize(dir2text(outdir))]</A>"
|
||||
dat += " (<A href='?src=\ref[src];operation=swapdir'>SWAP</A>)</TT><HR>"
|
||||
if(default)
|
||||
dat += "MAIN PROGRAM: "
|
||||
dat += "<TT>[default.name]: <A href='?src=\ref[src];operation=default'>[default.enabled ? "<B>YES</B>" : "NO"]</A><BR>"
|
||||
if(profiles.len)
|
||||
if(!default || !default.enabled)
|
||||
dat += printlist(profiles)
|
||||
dat += "</TT>"
|
||||
if(overrides.len)
|
||||
dat += "<HR>OVERRIDES:<BR><TT>"
|
||||
dat += printlist(overrides)
|
||||
dat += "</TT>"
|
||||
return dat
|
||||
|
||||
/obj/machinery/programmable/interact(mob/user as mob)
|
||||
var/dat = buildMenu()
|
||||
user << browse("<HEAD><TITLE>Unloader</TITLE></HEAD>[dat]", "window=progreload")
|
||||
onclose(user, "progreload")
|
||||
return
|
||||
|
||||
/obj/machinery/programmable/Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
usr.set_machine(src)
|
||||
add_fingerprint(usr)
|
||||
switch(href_list["operation"])
|
||||
if("start")
|
||||
on = (on ? 0 : 1)
|
||||
if(on) use_power = 1
|
||||
else use_power = 0
|
||||
updateUsrDialog()
|
||||
return
|
||||
if("inlet")
|
||||
indir *= 2 // N S E W
|
||||
if(indir > 8)
|
||||
indir = 1 // W N
|
||||
if(indir == src.outdir)
|
||||
indir *= 2
|
||||
if(indir > 8)
|
||||
indir = 1
|
||||
input = get_step(src,indir) // todo: check for glasswalls / no path to target?
|
||||
updateUsrDialog()
|
||||
return
|
||||
if("outlet")
|
||||
outdir *= 2
|
||||
if(outdir > 8)
|
||||
outdir = 1
|
||||
if(outdir == indir)
|
||||
outdir *= 2
|
||||
if(outdir > 8)
|
||||
outdir = 1
|
||||
output = get_step(src,outdir) // todo: check for walls / glasswalls / invalid output locations
|
||||
updateUsrDialog()
|
||||
return
|
||||
if("swapdir")
|
||||
var/temp = outdir
|
||||
outdir = indir
|
||||
indir = temp
|
||||
input = get_step(src,indir)
|
||||
output = get_step(src,outdir)
|
||||
updateUsrDialog()
|
||||
return
|
||||
if("default")
|
||||
default.enabled = (default.enabled ? 0 : 1)
|
||||
updateUsrDialog()
|
||||
return
|
||||
var/which = href_list["operation"]
|
||||
for(var/datum/cargoprofile/p in overrides + profiles)
|
||||
if(which == p.id)
|
||||
p.enabled = (p.enabled? 0 : 1)
|
||||
updateUsrDialog()
|
||||
return
|
||||
|
||||
/obj/machinery/programmable/attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(istype(I,/obj/item/weapon/card/emag))
|
||||
if(emagged)
|
||||
return
|
||||
user << "You swipe the unloader with your card. After a moment's grinding, it beeps in a sinister fashion."
|
||||
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
|
||||
emagged = 1
|
||||
overrides += emag_overrides
|
||||
|
||||
var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread
|
||||
s.set_up(2, 1, src)
|
||||
s.start()
|
||||
|
||||
return
|
||||
if(istype(I,/obj/item/weapon/wrench)) // code borrowed from pipe dispenser
|
||||
if (unwrenched==0)
|
||||
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
|
||||
user << "\blue You begin to unfasten \the [src] from the floor..."
|
||||
if (do_after(user, 40))
|
||||
user.visible_message( \
|
||||
"[user] unfastens \the [src].", \
|
||||
"\blue You have unfastened \the [src]. Now it can be pulled somewhere else.", \
|
||||
"You hear ratchet.")
|
||||
src.anchored = 0
|
||||
src.stat |= MAINT
|
||||
src.unwrenched = 1
|
||||
if (usr.machine==src)
|
||||
usr << browse(null, "window=pipedispenser")
|
||||
else /* unwrenched */
|
||||
playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1)
|
||||
user << "\blue You begin to fasten \the [src] to the floor..."
|
||||
if (do_after(user, 20))
|
||||
user.visible_message( \
|
||||
"[user] fastens \the [src].", \
|
||||
"\blue You fastened \the [src] into place.", \
|
||||
"You hear ratchet.")
|
||||
src.anchored = 1
|
||||
src.input = get_step(src.loc,src.indir)
|
||||
src.output = get_step(src.loc,src.outdir)
|
||||
if(!open && !circuit_removed)
|
||||
src.stat &= ~MAINT
|
||||
src.unwrenched = 0
|
||||
power_change()
|
||||
if(istype(I,/obj/item/weapon/screwdriver))
|
||||
if(open)
|
||||
open = 0
|
||||
if(!unwrenched && !circuit_removed)
|
||||
src.stat &= ~MAINT
|
||||
user << "You open the [src]'s maintenance panel."
|
||||
else
|
||||
open = 1
|
||||
src.stat |= MAINT
|
||||
user << "You close the [src]'s maintenance panel."
|
||||
if(istype(I,/obj/item/weapon/crowbar))
|
||||
if(open)
|
||||
user << "\blue You begin to pry out the [src]'s circuits."
|
||||
if(do_after(user,40))
|
||||
user << "\blue You remove the circuitboard."
|
||||
circuit_removed = 1
|
||||
use_power = 0
|
||||
on = 0
|
||||
|
||||
var/obj/item/weapon/circuitboard/programmable/P = new(src.loc)
|
||||
P.emagged = src.emagged
|
||||
P.default = src.default
|
||||
src.default = null
|
||||
P.profiles = src.profiles
|
||||
src.profiles = null
|
||||
P.overrides = src.overrides
|
||||
src.overrides = null
|
||||
P.emag_overrides = src.emag_overrides
|
||||
src.emag_overrides = null
|
||||
return
|
||||
else
|
||||
..(I,user)
|
||||
if(istype(I,/obj/item/weapon/circuitboard/programmable))
|
||||
if(!open)
|
||||
user << "You have to open the machine first!"
|
||||
return
|
||||
if(!circuit_removed)
|
||||
user << "There is already a circuitboard present!"
|
||||
return
|
||||
circuit_removed = 0
|
||||
I.loc = src
|
||||
RefreshParts()
|
||||
|
||||
|
||||
|
||||
/obj/machinery/programmable/process()
|
||||
if (!output || !input)
|
||||
return
|
||||
|
||||
if(!on || stat || sleep)
|
||||
if(sleep > 0) // prevent input or output errors from happening every tick
|
||||
sleep--
|
||||
use_power = 0
|
||||
|
||||
//Do not let things get stuck inside. That's broken behavior.
|
||||
for(var/obj/O in contents)
|
||||
O.loc = loc
|
||||
for(var/mob/M in contents)
|
||||
M.loc = loc
|
||||
if(M.client)
|
||||
M.client.eye = M.client.mob
|
||||
M.client.perspective = MOB_PERSPECTIVE
|
||||
M << "\blue The machine turns off, and you fall out."
|
||||
|
||||
return
|
||||
|
||||
//Normal output reaction
|
||||
if(contents.len)
|
||||
for(var/atom/movable/A in contents)
|
||||
var/datum/cargoprofile/p = types[A.type]
|
||||
if(p)
|
||||
p.outlet_reaction(A,output)
|
||||
else
|
||||
A.loc = output // may have been dropped by a mob, etc
|
||||
|
||||
if(types.len > 50)
|
||||
types = list() // good luck mr. garbage collector
|
||||
|
||||
|
||||
var/work = 0
|
||||
for(var/mob/M in input.contents)
|
||||
for(var/datum/cargoprofile/p in overrides + default)
|
||||
if(p.enabled && p.mobcheck && p.contains(M))
|
||||
var/done = p.inlet_reaction(M,input,workmax - work)
|
||||
if(done)
|
||||
work += done
|
||||
if(src.debug)
|
||||
visible_message("[p.name]:[M.name] ([done])")
|
||||
break
|
||||
|
||||
if(sleep)
|
||||
return // something stopped the machine
|
||||
|
||||
for (var/obj/A in input.contents)// I fully expect this to cause unreasonable lag
|
||||
if(!A)
|
||||
break
|
||||
if(work > workmax)
|
||||
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0) // Beep if the machine is full - testing only probably
|
||||
break
|
||||
|
||||
var/done = 0 // work done - testing only
|
||||
var/aname // target item name - testing only
|
||||
|
||||
for(var/datum/cargoprofile/p in overrides)
|
||||
if(p.enabled && p.contains(A))
|
||||
aname = A.name // in case of deletion
|
||||
done = p.inlet_reaction(A,input,workmax - work)
|
||||
if(done)
|
||||
work += done
|
||||
if(src.debug)
|
||||
visible_message("[p.name]:[aname] ([done])")
|
||||
|
||||
else
|
||||
break
|
||||
if(sleep)
|
||||
break // Something stopped the machine
|
||||
if(!A || A.loc != input || done)
|
||||
continue // next item
|
||||
|
||||
if(default && default.enabled)
|
||||
if(default.contains(A))
|
||||
aname = A.name
|
||||
done = default.inlet_reaction(A,input,workmax - work)
|
||||
if(done)
|
||||
work += done
|
||||
if(src.debug)
|
||||
visible_message("[default.name]: [aname] ([done])")
|
||||
continue
|
||||
for(var/datum/cargoprofile/p in profiles)
|
||||
if(p.enabled && p.contains(A))
|
||||
aname = A.name
|
||||
done = p.inlet_reaction(A,input,workmax - work)
|
||||
if(done)
|
||||
work += done
|
||||
if(src.debug)
|
||||
visible_message("[p.name]:[aname] ([done])")
|
||||
else
|
||||
break
|
||||
if(work)
|
||||
use_power = 2
|
||||
else
|
||||
use_power = 1
|
||||
//----------------------------------------------------------------------------
|
||||
// Specialty machines
|
||||
//----------------------------------------------------------------------------
|
||||
|
||||
//Uses the inlet stacking profile. Ejects only full stacks.
|
||||
/obj/machinery/programmable/stacker
|
||||
name = "Stacking & Spooling Machine"
|
||||
default = new/datum/cargoprofile/in_stacker()
|
||||
profiles = list()
|
||||
overrides = list()
|
||||
emag_overrides = list()
|
||||
typename = "Stacking and Spooling Machine"
|
||||
|
||||
|
||||
/obj/machinery/programmable/unloader
|
||||
name = "Cargo Unloader"
|
||||
default = new/datum/cargoprofile/cargo/unload()
|
||||
profiles = list()
|
||||
overrides = list()
|
||||
emag_overrides = list()
|
||||
typename = "Cargo Unloader"
|
||||
|
||||
/obj/machinery/programmable/delivery
|
||||
name = "Finished robot delivery"
|
||||
default = new/datum/cargoprofile/finished()
|
||||
profiles = list()
|
||||
overrides = list()
|
||||
emag_overrides = list()
|
||||
typename = "Robot Delivery"
|
||||
|
||||
/obj/machinery/programmable/crate_handler
|
||||
name = "Crate Handler"
|
||||
default = null
|
||||
profiles = list(new/datum/cargoprofile/cargo/unload(),new/datum/cargoprofile/cargo(),new/datum/cargoprofile/cargo/empty(),new/datum/cargoprofile/cargo/full())
|
||||
overrides = list()
|
||||
emag_overrides = list()
|
||||
typename = "Crate Handler"
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// Unary machine: Input and output in the same location
|
||||
// Be careful with this, it could easily be running the same
|
||||
// computations every round needlessly
|
||||
//----------------------------------------------------------------------------
|
||||
/obj/machinery/programmable/unary
|
||||
name = "Programmable Processor"
|
||||
default = null
|
||||
profiles = list()
|
||||
overrides = list(new/datum/cargoprofile/unary/stacker(),new/datum/cargoprofile/unary/trainer())
|
||||
emag_overrides = list(new/datum/cargoprofile/unary/shredder())
|
||||
indir = 1
|
||||
outdir = 1
|
||||
typename = "Processor"
|
||||
|
||||
New()
|
||||
..()
|
||||
outdir = indir
|
||||
output = input
|
||||
buildMenu()
|
||||
var/dat
|
||||
dat += "<B>PROGRAMMABLE PROCESSOR</B><BR><TT>"
|
||||
dat += "POWER: <A href='?src=\ref[src];operation=start'>[on ? "ON" : "OFF"]</A><BR>"
|
||||
dat += "INLET: <A href='?src=\ref[src];operation=inlet'>[capitalize(dir2text(indir))]</A><BR>"
|
||||
if(default)
|
||||
dat += "MAIN PROGRAM: "
|
||||
dat += "<TT>[default.name]: <A href='?src=\ref[src];operation=default'>[default.enabled ? "<B>YES</B>" : "NO"]</A><BR>"
|
||||
if(profiles.len)
|
||||
if(!default || !default.enabled)
|
||||
dat += printlist(profiles)
|
||||
dat += "</TT>"
|
||||
if(overrides.len)
|
||||
dat += "<HR>OVERRIDES:<BR><TT>"
|
||||
dat += printlist(overrides)
|
||||
dat += "</TT>"
|
||||
return dat
|
||||
Topic(href, href_list)
|
||||
switch(href_list["operation"])
|
||||
if("inlet")
|
||||
indir *= 2 // N S E W
|
||||
if(indir > 8)
|
||||
indir = 1 // W N
|
||||
outdir = indir
|
||||
input = get_step(src,indir) // todo: check for glasswalls / no path to target?
|
||||
output = input
|
||||
updateUsrDialog()
|
||||
return
|
||||
return ..()
|
||||
|
||||
/obj/machinery/programmable/unary/stacker
|
||||
name = "Stacking Machine"
|
||||
default = new/datum/cargoprofile/unary/stacker()
|
||||
profiles = list()
|
||||
overrides = list()
|
||||
emag_overrides = list()
|
||||
typename = "Stacking Machine"
|
||||
|
||||
/obj/machinery/programmable/unary/shredder
|
||||
name = "Paper Shredder"
|
||||
default = new/datum/cargoprofile/unary/shredder()
|
||||
profiles = list()
|
||||
overrides = list()
|
||||
emag_overrides = list(new/datum/cargoprofile/unary/gibber())
|
||||
typename = "Paper Shredder"
|
||||
|
||||
/obj/machinery/programmable/unary/trainer
|
||||
name = "\improper Boxing Trainer"
|
||||
default = new/datum/cargoprofile/unary/trainer()
|
||||
profiles = list()
|
||||
overrides = list()
|
||||
emag_overrides = list()
|
||||
typename = "Boxing Trainer"
|
||||
|
||||
attack_hand(mob/user as mob) //How did I type this with boxing gloves on?
|
||||
if(!istype(user,/mob/living/carbon/human))
|
||||
return ..()
|
||||
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(H.gloves && istype(H.gloves, /obj/item/clothing/gloves/boxing))
|
||||
var/newsleep = 0
|
||||
if(H.loc != input)
|
||||
H << "The boxing machine refuses to acknowledge you unless you face it head on!"
|
||||
return
|
||||
var/damage = 0
|
||||
if(H.a_intent != "harm")
|
||||
damage += rand(0,5)
|
||||
else
|
||||
damage += rand(0,10)
|
||||
if(!damage)
|
||||
playsound(H.loc, 'sound/weapons/punchmiss.ogg', 25, 1, -1)
|
||||
visible_message("[H] tries to punch \the [src], but whiffs")
|
||||
return
|
||||
|
||||
playsound(loc, "punch", 25, 1, -1)
|
||||
if(M_HULK in H.mutations) damage += 5
|
||||
|
||||
if(damage < 5)
|
||||
visible_message("[H] gives \the [src] a weak punch.")
|
||||
if(prob(10))
|
||||
visible_message("\blue \The [src] feints at [H], as though mocking \him.")
|
||||
else if(damage < 10)
|
||||
visible_message("[H] hits \the [src] with a solid [pick("punch","jab","smack")].")
|
||||
else if(damage < 15)
|
||||
visible_message("[pick("Whoa!","Nice!","Gasp!")] [H] hits [src] with a powerful [pick("punch","jab","uppercut","left hook", "right hook")].")
|
||||
else if(damage < 20)
|
||||
visible_message("[pick("WHOA!","ACK!","Jeez!")] [H] hits [src] so hard, the whole machine rocks band and forth for a moment.")
|
||||
else
|
||||
visible_message("Holy moly! [H] hits \the [src] so hard it stops working.")
|
||||
stat |= BROKEN
|
||||
return
|
||||
while(damage >= 5)
|
||||
if(prob(50))
|
||||
newsleep++
|
||||
damage -= 5
|
||||
if(newsleep)
|
||||
if(emagged)
|
||||
visible_message("\red \The [src]'s lights glow a bloodthirsty red. It refuses to stop!")
|
||||
sleep = 0
|
||||
else
|
||||
sleep += newsleep
|
||||
visible_message("\blue \The [src]'s lights dim for a moment and it beeps, signifying a valid hit.")
|
||||
playsound(src.loc, 'sound/machines/twobeep.ogg', 50, 0)
|
||||
return
|
||||
|
||||
else
|
||||
return ..()
|
||||
|
||||
//----------------------------------------------------------------------------
|
||||
// For construction
|
||||
//----------------------------------------------------------------------------
|
||||
/obj/item/weapon/circuitboard/programmable
|
||||
name = "Circuit board (Programmable Unloader)"
|
||||
build_path = "/obj/machinery/programmable"
|
||||
board_type = "machine"
|
||||
origin_tech = "engineering=3;programming=6"
|
||||
frame_desc = "Requires 2 Manipulators, 1 Scanning Module, 1 Cable."
|
||||
req_components = list(
|
||||
"/obj/item/weapon/stock_parts/scanning_module" = 1,
|
||||
"/obj/item/weapon/stock_parts/manipulator" = 2,
|
||||
"/obj/item/stack/cable_coil" = 1)
|
||||
|
||||
//Customization of the machine
|
||||
var/datum/cargoprofile/default = new/datum/cargoprofile()
|
||||
var/list/profiles = list()
|
||||
var/list/overrides = list()
|
||||
var/list/emag_overrides = list()
|
||||
|
||||
var/emagged = 0
|
||||
var/hacking = 0
|
||||
|
||||
proc/resetlists()
|
||||
profiles = list(new/datum/cargoprofile/cargo(),new/datum/cargoprofile/boxes(),new/datum/cargoprofile/supplies(),
|
||||
new/datum/cargoprofile/exotics(),new/datum/cargoprofile/tools(),new/datum/cargoprofile/weapons(),new/datum/cargoprofile/finished(),
|
||||
new/datum/cargoprofile/pressure(),new/datum/cargoprofile/pressure/full(),new/datum/cargoprofile/pressure/empty(),
|
||||
new/datum/cargoprofile/chemical(),new/datum/cargoprofile/organics(),new/datum/cargoprofile/food(),
|
||||
new/datum/cargoprofile/clothing(),new/datum/cargoprofile/trash())
|
||||
overrides = list(new/datum/cargoprofile/cargo/unload(),new/datum/cargoprofile/in_stacker(),
|
||||
new/datum/cargoprofile/unary/stacker(),new/datum/cargoprofile/unary/trainer())
|
||||
emag_overrides = list(new/datum/cargoprofile/people(),new/datum/cargoprofile/unary/shredder())
|
||||
|
||||
New()
|
||||
..()
|
||||
resetlists()
|
||||
|
||||
attackby(obj/item/I as obj, mob/user as mob)
|
||||
if(istype(I,/obj/item/device/multitool))
|
||||
hacking = (hacking?0:1)
|
||||
if(hacking)
|
||||
user << "You unlock the data port on the board. You can now use a PDA to alter its data."
|
||||
else
|
||||
user << "You relock the data port."
|
||||
if(istype(I,/obj/item/device/pda))
|
||||
if(!hacking)
|
||||
user << "It looks like you can't access the board's data port. You'll have to open it with a multitool."
|
||||
else
|
||||
user.set_machine(src)
|
||||
interact(user)
|
||||
if(istype(I,/obj/item/weapon/card/emag) && !emagged)
|
||||
if(!hacking)
|
||||
user << "There seems to be a data port on the card, but it's locked. A multitool could open it."
|
||||
else
|
||||
emagged = 1
|
||||
overrides += emag_overrides
|
||||
user << "You swipe the card in the card's data port. The lights flicker, then flash once."
|
||||
|
||||
proc/format(var/datum/cargoprofile/P,var/level)
|
||||
// PROFILE=0 OVERRIDE=1 MAIN=2
|
||||
if(P == null)
|
||||
return "NONE<BR>"
|
||||
var/dat = "[P.name]"
|
||||
if(level == 0 || (level == 1 && !default))
|
||||
dat += " <A href='?src=\ref[src];operation=promote;id=[P.id];level=[level]'>PROMOTE</A>"
|
||||
if(level > 0)
|
||||
dat += " <A href='?src=\ref[src];operation=demote;id=[P.id];level=[level]'>DEMOTE</A>"
|
||||
dat += " <A href='?src=\ref[src];operation=delete;id=[P.id];level=[level]'>REMOVE</A>"
|
||||
dat += "<BR>"
|
||||
return dat
|
||||
|
||||
interact(mob/user as mob)
|
||||
var/dat
|
||||
dat = "MAIN FUNCTION<BR><TT>"
|
||||
dat += format(default,2)
|
||||
dat += "</TT>- CAUTION -<BR>\[<A href='?src=\ref[src];operation=deleteall'>DELETE NON-MAIN ALGORITHMS</A>\]<BR>"
|
||||
dat += "\[<A href='?src=\ref[src];operation=reset'>MASTER RESET</A>\]<HR>"
|
||||
|
||||
dat += "OVERRIDES:<BR><TT>"
|
||||
for(var/datum/cargoprofile/P in overrides)
|
||||
dat += format(P,1)
|
||||
dat += "</TT><BR>"
|
||||
dat += "- CAUTION -<BR>\[<A href='?src=\ref[src];operation=deleteoverrides'>DELETE ALL OVERRIDES</A>\]<HR>"
|
||||
|
||||
dat += "</TT> TERTIARY PROFILES:<BR><TT>"
|
||||
for(var/datum/cargoprofile/P in profiles)
|
||||
dat += format(P,0)
|
||||
dat += "</TT><BR>"
|
||||
dat += "- CAUTION -<BR>\[<A href='?src=\ref[src];operation=deleteprofiles'>DELETE TERTIARY PROFILES</A>\]"
|
||||
|
||||
user << browse("<HEAD><TITLE>Circuit Reprogramming</TITLE></HEAD>[dat]", "window=progcircuit")
|
||||
onclose(user, "progcircuit")
|
||||
|
||||
Topic(href, href_list)
|
||||
if(..())
|
||||
return
|
||||
usr.set_machine(src)
|
||||
var/id = href_list["id"]
|
||||
var/level = text2num(href_list["level"])
|
||||
switch(href_list["operation"])
|
||||
if("promote")
|
||||
if(level == 0)
|
||||
for(var/datum/cargoprofile/T in profiles)
|
||||
if(T.id == id)
|
||||
overrides += T
|
||||
profiles -= T
|
||||
//updateUsrDialog()
|
||||
interact(usr)
|
||||
return
|
||||
|
||||
if(level == 1)
|
||||
if(default) return
|
||||
for(var/datum/cargoprofile/T in overrides)
|
||||
if(T.id == id)
|
||||
default = T
|
||||
overrides -= T
|
||||
|
||||
if(default.dedicated_path)
|
||||
build_path = "[default.dedicated_path]"
|
||||
else
|
||||
if(istype(default,/datum/cargoprofile/unary))
|
||||
build_path = "/obj/machinery/programmable/unary"
|
||||
else
|
||||
build_path = "/obj/machinery/programmable"
|
||||
|
||||
//updateUsrDialog()
|
||||
interact(usr)
|
||||
return
|
||||
|
||||
if("demote")
|
||||
if(level == 2)
|
||||
overrides += default
|
||||
default = null
|
||||
//updateUsrDialog()
|
||||
interact(usr)
|
||||
return
|
||||
if(level == 1)
|
||||
for(var/datum/cargoprofile/T in overrides)
|
||||
if(T.id == id)
|
||||
profiles += T
|
||||
overrides -= T
|
||||
//updateUsrDialog()
|
||||
interact(usr)
|
||||
return
|
||||
if("delete")
|
||||
if(level == 2)
|
||||
default = null
|
||||
//updateUsrDialog()
|
||||
interact(usr)
|
||||
return
|
||||
if(level == 1)
|
||||
for(var/datum/cargoprofile/T in overrides)
|
||||
if(T.id == id)
|
||||
overrides -= T
|
||||
//updateUsrDialog()
|
||||
interact(usr)
|
||||
return
|
||||
if(level == 0)
|
||||
for(var/datum/cargoprofile/T in profiles)
|
||||
if(T.id == id)
|
||||
profiles -= T
|
||||
//updateUsrDialog()
|
||||
interact(usr)
|
||||
return
|
||||
if("deleteall")
|
||||
for(var/datum/cargoprofile/T in profiles)
|
||||
profiles -= T
|
||||
for(var/datum/cargoprofile/T in overrides)
|
||||
overrides -= T
|
||||
//updateUsrDialog()
|
||||
interact(usr)
|
||||
return
|
||||
if("deleteoverrides")
|
||||
for(var/datum/cargoprofile/T in overrides)
|
||||
overrides -= T
|
||||
interact(usr)
|
||||
return
|
||||
if("deleteprofiles")
|
||||
for(var/datum/cargoprofile/T in profiles)
|
||||
profiles -= T
|
||||
interact(usr)
|
||||
return
|
||||
if("reset")
|
||||
resetlists()
|
||||
interact(usr)
|
||||
return
|
||||
|
||||
//End switch
|
||||
@@ -0,0 +1,283 @@
|
||||
/sound/turntable/test
|
||||
file = 'sound/turntable/TestLoop1.ogg'
|
||||
falloff = 2
|
||||
repeat = 1
|
||||
|
||||
/mob/var/music = 0
|
||||
|
||||
/obj/machinery/party/turntable
|
||||
name = "turntable"
|
||||
desc = "A turntable used for parties and shit."
|
||||
icon = 'icons/effects/lasers2.dmi'
|
||||
icon_state = "turntable"
|
||||
var/playing = 0
|
||||
anchored = 1
|
||||
|
||||
/obj/machinery/party/mixer
|
||||
name = "mixer"
|
||||
desc = "A mixing board for mixing music"
|
||||
icon = 'icons/effects/lasers2.dmi'
|
||||
icon_state = "mixer"
|
||||
anchored = 1
|
||||
|
||||
|
||||
/obj/machinery/party/turntable/New()
|
||||
..()
|
||||
sleep(2)
|
||||
new /sound/turntable/test(src)
|
||||
return
|
||||
|
||||
/obj/machinery/party/turntable/attack_hand(mob/user as mob)
|
||||
|
||||
var/t = "<B>Turntable Interface</B><br><br>"
|
||||
//t += "<A href='?src=\ref[src];on=1'>On</A><br>"
|
||||
t += "<A href='?src=\ref[src];off=1'>Off</A><br><br>"
|
||||
t += "<A href='?src=\ref[src];on1=Testloop1'>One</A><br>"
|
||||
t += "<A href='?src=\ref[src];on2=Testloop2'>TestLoop2</A><br>"
|
||||
t += "<A href='?src=\ref[src];on3=Testloop3'>TestLoop3</A><br>"
|
||||
|
||||
user << browse(t, "window=turntable;size=420x700")
|
||||
|
||||
|
||||
/obj/machinery/party/turntable/Topic(href, href_list)
|
||||
..()
|
||||
if( href_list["on1"] )
|
||||
if(src.playing == 0)
|
||||
//world << "Should be working..."
|
||||
var/sound/S = sound('sound/turntable/TestLoop1.ogg')
|
||||
S.repeat = 1
|
||||
S.channel = 10
|
||||
S.falloff = 2
|
||||
S.wait = 1
|
||||
S.environment = 0
|
||||
//for(var/mob/M in world)
|
||||
// if(M.loc.loc == src.loc.loc && M.music == 0)
|
||||
// world << "Found the song..."
|
||||
// M << S
|
||||
// M.music = 1
|
||||
var/area/A = src.loc.loc
|
||||
|
||||
for(var/area/RA in A.related)
|
||||
for(var/obj/machinery/party/lasermachine/L in RA)
|
||||
L.turnon()
|
||||
playing = 1
|
||||
while(playing == 1)
|
||||
for(var/mob/M in world)
|
||||
if((M.loc.loc in A.related) && M.music == 0)
|
||||
//world << "Found the song..."
|
||||
M << S
|
||||
M.music = 1
|
||||
else if(!(M.loc.loc in A.related) && M.music == 1)
|
||||
var/sound/Soff = sound(null)
|
||||
Soff.channel = 10
|
||||
M << Soff
|
||||
M.music = 0
|
||||
sleep(10)
|
||||
return
|
||||
if( href_list["on2"] )
|
||||
if(src.playing == 0)
|
||||
//world << "Should be working..."
|
||||
var/sound/S = sound('sound/turntable/TestLoop2.ogg')
|
||||
S.repeat = 1
|
||||
S.channel = 10
|
||||
S.falloff = 2
|
||||
S.wait = 1
|
||||
S.environment = 0
|
||||
//for(var/mob/M in world)
|
||||
// if(M.loc.loc == src.loc.loc && M.music == 0)
|
||||
// world << "Found the song..."
|
||||
// M << S
|
||||
// M.music = 1
|
||||
var/area/A = src.loc.loc
|
||||
for(var/obj/machinery/party/lasermachine/L in A)
|
||||
L.turnon()
|
||||
playing = 1
|
||||
while(playing == 1)
|
||||
for(var/mob/M in world)
|
||||
if(M.loc.loc == src.loc.loc && M.music == 0)
|
||||
//world << "Found the song..."
|
||||
M << S
|
||||
M.music = 1
|
||||
else if(M.loc.loc != src.loc.loc && M.music == 1)
|
||||
var/sound/Soff = sound(null)
|
||||
Soff.channel = 10
|
||||
M << Soff
|
||||
M.music = 0
|
||||
sleep(10)
|
||||
return
|
||||
if( href_list["on3"] )
|
||||
if(src.playing == 0)
|
||||
//world << "Should be working..."
|
||||
var/sound/S = sound('sound/turntable/TestLoop3.ogg')
|
||||
S.repeat = 1
|
||||
S.channel = 10
|
||||
S.falloff = 2
|
||||
S.wait = 1
|
||||
S.environment = 0
|
||||
//for(var/mob/M in world)
|
||||
// if(M.loc.loc == src.loc.loc && M.music == 0)
|
||||
// world << "Found the song..."
|
||||
// M << S
|
||||
// M.music = 1
|
||||
var/area/A = src.loc.loc
|
||||
for(var/obj/machinery/party/lasermachine/L in A)
|
||||
L.turnon()
|
||||
playing = 1
|
||||
while(playing == 1)
|
||||
for(var/mob/M in world)
|
||||
if(M.loc.loc == src.loc.loc && M.music == 0)
|
||||
//world << "Found the song..."
|
||||
M << S
|
||||
M.music = 1
|
||||
else if(M.loc.loc != src.loc.loc && M.music == 1)
|
||||
var/sound/Soff = sound(null)
|
||||
Soff.channel = 10
|
||||
M << Soff
|
||||
M.music = 0
|
||||
sleep(10)
|
||||
return
|
||||
|
||||
|
||||
if( href_list["off"] )
|
||||
if(src.playing == 1)
|
||||
var/sound/S = sound(null)
|
||||
S.channel = 10
|
||||
S.wait = 1
|
||||
for(var/mob/M in world)
|
||||
M << S
|
||||
M.music = 0
|
||||
playing = 0
|
||||
var/area/A = src.loc.loc
|
||||
for(var/area/RA in A.related)
|
||||
for(var/obj/machinery/party/lasermachine/L in RA)
|
||||
L.turnoff()
|
||||
|
||||
|
||||
|
||||
/obj/machinery/party/lasermachine
|
||||
name = "laser machine"
|
||||
desc = "A laser machine that shoots lasers."
|
||||
icon = 'icons/effects/lasers2.dmi'
|
||||
icon_state = "lasermachine"
|
||||
anchored = 1
|
||||
var/mirrored = 0
|
||||
|
||||
/obj/effects/laser
|
||||
name = "laser"
|
||||
desc = "A laser..."
|
||||
icon = 'icons/effects/lasers2.dmi'
|
||||
icon_state = "laserred1"
|
||||
anchored = 1
|
||||
layer = 4
|
||||
|
||||
/obj/item/lasermachine/New()
|
||||
..()
|
||||
|
||||
/obj/machinery/party/lasermachine/proc/turnon()
|
||||
var/wall = 0
|
||||
var/cycle = 1
|
||||
var/area/A = get_area(src)
|
||||
var/X = 1
|
||||
var/Y = 0
|
||||
if(mirrored == 0)
|
||||
while(wall == 0)
|
||||
if(cycle == 1)
|
||||
var/obj/effects/laser/F = new/obj/effects/laser(src)
|
||||
F.x = src.x+X
|
||||
F.y = src.y+Y
|
||||
F.z = src.z
|
||||
F.icon_state = "laserred1"
|
||||
var/area/AA = get_area(F)
|
||||
var/turf/T = get_turf(F)
|
||||
if(T.density == 1 || AA.name != A.name)
|
||||
del(F)
|
||||
return
|
||||
cycle++
|
||||
if(cycle > 3)
|
||||
cycle = 1
|
||||
X++
|
||||
if(cycle == 2)
|
||||
var/obj/effects/laser/F = new/obj/effects/laser(src)
|
||||
F.x = src.x+X
|
||||
F.y = src.y+Y
|
||||
F.z = src.z
|
||||
F.icon_state = "laserred2"
|
||||
var/area/AA = get_area(F)
|
||||
var/turf/T = get_turf(F)
|
||||
if(T.density == 1 || AA.name != A.name)
|
||||
del(F)
|
||||
return
|
||||
cycle++
|
||||
if(cycle > 3)
|
||||
cycle = 1
|
||||
Y++
|
||||
if(cycle == 3)
|
||||
var/obj/effects/laser/F = new/obj/effects/laser(src)
|
||||
F.x = src.x+X
|
||||
F.y = src.y+Y
|
||||
F.z = src.z
|
||||
F.icon_state = "laserred3"
|
||||
var/area/AA = get_area(F)
|
||||
var/turf/T = get_turf(F)
|
||||
if(T.density == 1 || AA.name != A.name)
|
||||
del(F)
|
||||
return
|
||||
cycle++
|
||||
if(cycle > 3)
|
||||
cycle = 1
|
||||
X++
|
||||
if(mirrored == 1)
|
||||
while(wall == 0)
|
||||
if(cycle == 1)
|
||||
var/obj/effects/laser/F = new/obj/effects/laser(src)
|
||||
F.x = src.x+X
|
||||
F.y = src.y-Y
|
||||
F.z = src.z
|
||||
F.icon_state = "laserred1m"
|
||||
var/area/AA = get_area(F)
|
||||
var/turf/T = get_turf(F)
|
||||
if(T.density == 1 || AA.name != A.name)
|
||||
del(F)
|
||||
return
|
||||
cycle++
|
||||
if(cycle > 3)
|
||||
cycle = 1
|
||||
Y++
|
||||
if(cycle == 2)
|
||||
var/obj/effects/laser/F = new/obj/effects/laser(src)
|
||||
F.x = src.x+X
|
||||
F.y = src.y-Y
|
||||
F.z = src.z
|
||||
F.icon_state = "laserred2m"
|
||||
var/area/AA = get_area(F)
|
||||
var/turf/T = get_turf(F)
|
||||
if(T.density == 1 || AA.name != A.name)
|
||||
del(F)
|
||||
return
|
||||
cycle++
|
||||
if(cycle > 3)
|
||||
cycle = 1
|
||||
X++
|
||||
if(cycle == 3)
|
||||
var/obj/effects/laser/F = new/obj/effects/laser(src)
|
||||
F.x = src.x+X
|
||||
F.y = src.y-Y
|
||||
F.z = src.z
|
||||
F.icon_state = "laserred3m"
|
||||
var/area/AA = get_area(F)
|
||||
var/turf/T = get_turf(F)
|
||||
if(T.density == 1 || AA.name != A.name)
|
||||
del(F)
|
||||
return
|
||||
cycle++
|
||||
if(cycle > 3)
|
||||
cycle = 1
|
||||
X++
|
||||
|
||||
|
||||
|
||||
/obj/machinery/party/lasermachine/proc/turnoff()
|
||||
var/area/A = src.loc.loc
|
||||
for(var/area/RA in A.related)
|
||||
for(var/obj/effects/laser/F in RA)
|
||||
del(F)
|
||||
@@ -0,0 +1,71 @@
|
||||
/obj/effect/expl_particles
|
||||
name = "explosive particles"
|
||||
icon = 'icons/effects/effects.dmi'
|
||||
icon_state = "explosion_particle"
|
||||
opacity = 1
|
||||
anchored = 1
|
||||
mouse_opacity = 0
|
||||
|
||||
/obj/effect/expl_particles/New()
|
||||
..()
|
||||
spawn (15)
|
||||
src.loc = null
|
||||
return
|
||||
|
||||
/obj/effect/expl_particles/Move()
|
||||
..()
|
||||
return
|
||||
|
||||
/datum/effect/system/expl_particles
|
||||
var/number = 10
|
||||
var/turf/location
|
||||
var/total_particles = 0
|
||||
|
||||
/datum/effect/system/expl_particles/proc/set_up(n = 10, loca)
|
||||
number = n
|
||||
if(istype(loca, /turf/)) location = loca
|
||||
else location = get_turf(loca)
|
||||
|
||||
/datum/effect/system/expl_particles/proc/start()
|
||||
var/i = 0
|
||||
for(i=0, i<src.number, i++)
|
||||
spawn(0)
|
||||
var/obj/effect/expl_particles/expl = new /obj/effect/expl_particles(src.location)
|
||||
var/direct = pick(alldirs)
|
||||
var/a = 0
|
||||
for(a=0, a<pick(1;25,2;50,3,4;200), a++)
|
||||
sleep(1)
|
||||
step(expl,direct)
|
||||
|
||||
/obj/effect/explosion
|
||||
name = "explosive particles"
|
||||
icon = 'icons/effects/96x96.dmi'
|
||||
icon_state = "explosion"
|
||||
opacity = 1
|
||||
anchored = 1
|
||||
mouse_opacity = 0
|
||||
pixel_x = -32
|
||||
pixel_y = -32
|
||||
|
||||
/obj/effect/explosion/New()
|
||||
..()
|
||||
spawn (10)
|
||||
src.loc = null
|
||||
return
|
||||
|
||||
/datum/effect/system/explosion
|
||||
var/turf/location
|
||||
|
||||
/datum/effect/system/explosion/proc/set_up(loca)
|
||||
if(istype(loca, /turf/)) location = loca
|
||||
else location = get_turf(loca)
|
||||
|
||||
/datum/effect/system/explosion/proc/start()
|
||||
new/obj/effect/explosion( location )
|
||||
var/datum/effect/system/expl_particles/P = new/datum/effect/system/expl_particles()
|
||||
P.set_up(10,location)
|
||||
P.start()
|
||||
spawn(5)
|
||||
var/datum/effect/effect/system/harmless_smoke_spread/S = new/datum/effect/effect/system/harmless_smoke_spread()
|
||||
S.set_up(5,0,location,null)
|
||||
S.start()
|
||||
@@ -0,0 +1,135 @@
|
||||
/obj/item/ashtray
|
||||
icon = 'icons/ashtray.dmi'
|
||||
var/
|
||||
max_butts = 0
|
||||
empty_desc = ""
|
||||
icon_empty = ""
|
||||
icon_half = ""
|
||||
icon_full = ""
|
||||
icon_broken = ""
|
||||
|
||||
/obj/item/ashtray/New()
|
||||
..()
|
||||
src.pixel_y = rand(-5, 5)
|
||||
src.pixel_x = rand(-6, 6)
|
||||
return
|
||||
|
||||
/obj/item/ashtray/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if (health < 1)
|
||||
return
|
||||
if (istype(W,/obj/item/weapon/cigbutt) || istype(W,/obj/item/clothing/mask/cigarette) || istype(W, /obj/item/weapon/match))
|
||||
if (contents.len >= max_butts)
|
||||
user << "This ashtray is full."
|
||||
return
|
||||
user.u_equip(W)
|
||||
W.loc = src
|
||||
|
||||
if (istype(W,/obj/item/clothing/mask/cigarette))
|
||||
var/obj/item/clothing/mask/cigarette/cig = W
|
||||
if (cig.lit == 1)
|
||||
src.visible_message("[user] crushes [cig] in [src], putting it out.")
|
||||
processing_objects.Remove(cig)
|
||||
var/obj/item/butt = new cig.type_butt(src)
|
||||
cig.transfer_fingerprints_to(butt)
|
||||
del(cig)
|
||||
else if (cig.lit == 0)
|
||||
user << "You place [cig] in [src] without even smoking it. Why would you do that?"
|
||||
|
||||
src.visible_message("[user] places [W] in [src].")
|
||||
user.update_inv_l_hand()
|
||||
user.update_inv_r_hand()
|
||||
add_fingerprint(user)
|
||||
if (contents.len == max_butts)
|
||||
icon_state = icon_full
|
||||
desc = empty_desc + " It's stuffed full."
|
||||
else if (contents.len > max_butts/2)
|
||||
icon_state = icon_half
|
||||
desc = empty_desc + " It's half-filled."
|
||||
else
|
||||
health = max(0,health - W.force)
|
||||
user << "You hit [src] with [W]."
|
||||
if (health < 1)
|
||||
die()
|
||||
return
|
||||
|
||||
/obj/item/ashtray/throw_impact(atom/hit_atom)
|
||||
if (health > 0)
|
||||
health = max(0,health - 3)
|
||||
if (health < 1)
|
||||
die()
|
||||
return
|
||||
if (contents.len)
|
||||
src.visible_message("\red [src] slams into [hit_atom] spilling its contents!")
|
||||
for (var/obj/item/clothing/mask/cigarette/O in contents)
|
||||
O.loc = src.loc
|
||||
icon_state = icon_empty
|
||||
return ..()
|
||||
|
||||
/obj/item/ashtray/proc/die()
|
||||
src.visible_message("\red [src] shatters spilling its contents!")
|
||||
for (var/obj/item/clothing/mask/cigarette/O in contents)
|
||||
O.loc = src.loc
|
||||
icon_state = icon_broken
|
||||
|
||||
/obj/item/ashtray/plastic
|
||||
name = "plastic ashtray"
|
||||
desc = "Cheap plastic ashtray."
|
||||
icon_state = "ashtray_bl"
|
||||
icon_empty = "ashtray_bl"
|
||||
icon_half = "ashtray_half_bl"
|
||||
icon_full = "ashtray_full_bl"
|
||||
icon_broken = "ashtray_bork_bl"
|
||||
max_butts = 14
|
||||
health = 24.0
|
||||
g_amt = 30
|
||||
m_amt = 30
|
||||
empty_desc = "Cheap plastic ashtray."
|
||||
throwforce = 3.0
|
||||
die()
|
||||
..()
|
||||
name = "pieces of plastic"
|
||||
desc = "Pieces of plastic with ash on them."
|
||||
return
|
||||
|
||||
|
||||
/obj/item/ashtray/bronze
|
||||
name = "bronze ashtray"
|
||||
desc = "Massive bronze ashtray."
|
||||
icon_state = "ashtray_br"
|
||||
icon_empty = "ashtray_br"
|
||||
icon_half = "ashtray_half_br"
|
||||
icon_full = "ashtray_full_br"
|
||||
icon_broken = "ashtray_bork_br"
|
||||
max_butts = 10
|
||||
health = 72.0
|
||||
m_amt = 80
|
||||
empty_desc = "Massive bronze ashtray."
|
||||
throwforce = 10.0
|
||||
|
||||
die()
|
||||
..()
|
||||
name = "pieces of bronze"
|
||||
desc = "Pieces of bronze with ash on them."
|
||||
return
|
||||
|
||||
|
||||
/obj/item/ashtray/glass
|
||||
name = "glass ashtray"
|
||||
desc = "Glass ashtray. Looks fragile."
|
||||
icon_state = "ashtray_gl"
|
||||
icon_empty = "ashtray_gl"
|
||||
icon_half = "ashtray_half_gl"
|
||||
icon_full = "ashtray_full_gl"
|
||||
icon_broken = "ashtray_bork_gl"
|
||||
max_butts = 12
|
||||
health = 12.0
|
||||
g_amt = 60
|
||||
empty_desc = "Glass ashtray. Looks fragile."
|
||||
throwforce = 6.0
|
||||
|
||||
die()
|
||||
..()
|
||||
name = "shards of glass"
|
||||
desc = "Shards of glass with ash on them."
|
||||
playsound(src, "shatter", 30, 1)
|
||||
return
|
||||
@@ -0,0 +1,23 @@
|
||||
/obj/item/changestone
|
||||
name = "An uncut ruby"
|
||||
desc = "The ruby shines and catches the light, despite being uncut"
|
||||
icon = 'icons/obj/artifacts.dmi'
|
||||
icon_state = "changerock"
|
||||
|
||||
obj/item/changestone/attack_hand(var/mob/user as mob)
|
||||
if(istype(user,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = user
|
||||
if(!H.gloves)
|
||||
if (H.gender == FEMALE)
|
||||
H.gender = MALE
|
||||
else
|
||||
H.gender = FEMALE
|
||||
H.dna.ready_dna(H)
|
||||
H.update_body()
|
||||
..()
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,204 @@
|
||||
|
||||
//moved these here from code/defines/obj/weapon.dm
|
||||
//please preference put stuff where it's easy to find - C
|
||||
|
||||
/obj/item/weapon/autopsy_scanner
|
||||
name = "autopsy scanner"
|
||||
desc = "Extracts information on wounds."
|
||||
icon = 'icons/obj/autopsy_scanner.dmi'
|
||||
icon_state = ""
|
||||
flags = FPRINT | TABLEPASS | CONDUCT
|
||||
w_class = 1.0
|
||||
origin_tech = "materials=1;biotech=1"
|
||||
var/list/datum/autopsy_data_scanner/wdata = list()
|
||||
var/list/datum/autopsy_data_scanner/chemtraces = list()
|
||||
var/target_name = null
|
||||
var/timeofdeath = null
|
||||
|
||||
/datum/autopsy_data_scanner
|
||||
var/weapon = null // this is the DEFINITE weapon type that was used
|
||||
var/list/organs_scanned = list() // this maps a number of scanned organs to
|
||||
// the wounds to those organs with this data's weapon type
|
||||
var/organ_names = ""
|
||||
|
||||
/datum/autopsy_data
|
||||
var/weapon = null
|
||||
var/pretend_weapon = null
|
||||
var/damage = 0
|
||||
var/hits = 0
|
||||
var/time_inflicted = 0
|
||||
|
||||
proc/copy()
|
||||
var/datum/autopsy_data/W = new()
|
||||
W.weapon = weapon
|
||||
W.pretend_weapon = pretend_weapon
|
||||
W.damage = damage
|
||||
W.hits = hits
|
||||
W.time_inflicted = time_inflicted
|
||||
return W
|
||||
|
||||
/obj/item/weapon/autopsy_scanner/proc/add_data(var/datum/organ/external/O)
|
||||
if(!O.autopsy_data.len && !O.trace_chemicals.len) return
|
||||
|
||||
for(var/V in O.autopsy_data)
|
||||
var/datum/autopsy_data/W = O.autopsy_data[V]
|
||||
|
||||
if(!W.pretend_weapon)
|
||||
/*
|
||||
// the more hits, the more likely it is that we get the right weapon type
|
||||
if(prob(50 + W.hits * 10 + W.damage))
|
||||
*/
|
||||
|
||||
// Buffing this stuff up for now!
|
||||
if(1)
|
||||
W.pretend_weapon = W.weapon
|
||||
else
|
||||
W.pretend_weapon = pick("mechanical toolbox", "wirecutters", "revolver", "crowbar", "fire extinguisher", "tomato soup", "oxygen tank", "emergency oxygen tank", "laser", "bullet")
|
||||
|
||||
|
||||
var/datum/autopsy_data_scanner/D = wdata[V]
|
||||
if(!D)
|
||||
D = new()
|
||||
D.weapon = W.weapon
|
||||
wdata[V] = D
|
||||
|
||||
if(!D.organs_scanned[O.name])
|
||||
if(D.organ_names == "")
|
||||
D.organ_names = O.display_name
|
||||
else
|
||||
D.organ_names += ", [O.display_name]"
|
||||
|
||||
del D.organs_scanned[O.name]
|
||||
D.organs_scanned[O.name] = W.copy()
|
||||
|
||||
for(var/V in O.trace_chemicals)
|
||||
if(O.trace_chemicals[V] > 0 && !chemtraces.Find(V))
|
||||
chemtraces += V
|
||||
|
||||
/obj/item/weapon/autopsy_scanner/verb/print_data()
|
||||
set src in view(usr, 1)
|
||||
set name = "Print Data"
|
||||
if(usr.stat || !(istype(usr,/mob/living/carbon/human)))
|
||||
usr << "No."
|
||||
return
|
||||
|
||||
var/scan_data = ""
|
||||
|
||||
if(timeofdeath)
|
||||
scan_data += "<b>Time of death:</b> [worldtime2text(timeofdeath)]<br><br>"
|
||||
|
||||
var/n = 1
|
||||
for(var/wdata_idx in wdata)
|
||||
var/datum/autopsy_data_scanner/D = wdata[wdata_idx]
|
||||
var/total_hits = 0
|
||||
var/total_score = 0
|
||||
var/list/weapon_chances = list() // maps weapon names to a score
|
||||
var/age = 0
|
||||
|
||||
for(var/wound_idx in D.organs_scanned)
|
||||
var/datum/autopsy_data/W = D.organs_scanned[wound_idx]
|
||||
total_hits += W.hits
|
||||
|
||||
var/wname = W.pretend_weapon
|
||||
|
||||
if(wname in weapon_chances) weapon_chances[wname] += W.damage
|
||||
else weapon_chances[wname] = max(W.damage, 1)
|
||||
total_score+=W.damage
|
||||
|
||||
|
||||
var/wound_age = W.time_inflicted
|
||||
age = max(age, wound_age)
|
||||
|
||||
var/damage_desc
|
||||
|
||||
var/damaging_weapon = (total_score != 0)
|
||||
|
||||
// total score happens to be the total damage
|
||||
switch(total_score)
|
||||
if(0)
|
||||
damage_desc = "Unknown"
|
||||
if(1 to 5)
|
||||
damage_desc = "<font color='green'>negligible</font>"
|
||||
if(5 to 15)
|
||||
damage_desc = "<font color='green'>light</font>"
|
||||
if(15 to 30)
|
||||
damage_desc = "<font color='orange'>moderate</font>"
|
||||
if(30 to 1000)
|
||||
damage_desc = "<font color='red'>severe</font>"
|
||||
|
||||
if(!total_score) total_score = D.organs_scanned.len
|
||||
|
||||
scan_data += "<b>Weapon #[n]</b><br>"
|
||||
if(damaging_weapon)
|
||||
scan_data += "Severity: [damage_desc]<br>"
|
||||
scan_data += "Hits by weapon: [total_hits]<br>"
|
||||
scan_data += "Approximate time of wound infliction: [worldtime2text(age)]<br>"
|
||||
scan_data += "Affected limbs: [D.organ_names]<br>"
|
||||
scan_data += "Possible weapons:<br>"
|
||||
for(var/weapon_name in weapon_chances)
|
||||
scan_data += "\t[100*weapon_chances[weapon_name]/total_score]% [weapon_name]<br>"
|
||||
|
||||
scan_data += "<br>"
|
||||
|
||||
n++
|
||||
|
||||
if(chemtraces.len)
|
||||
scan_data += "<b>Trace Chemicals: </b><br>"
|
||||
for(var/chemID in chemtraces)
|
||||
scan_data += chemID
|
||||
scan_data += "<br>"
|
||||
|
||||
for(var/mob/O in viewers(usr))
|
||||
O.show_message("\red \the [src] rattles and prints out a sheet of paper.", 1)
|
||||
|
||||
sleep(10)
|
||||
|
||||
var/obj/item/weapon/paper/P = new(usr.loc)
|
||||
P.name = "Autopsy Data ([target_name])"
|
||||
P.info = "<tt>[scan_data]</tt>"
|
||||
P.overlays += "paper_words"
|
||||
|
||||
if(istype(usr,/mob/living/carbon))
|
||||
// place the item in the usr's hand if possible
|
||||
if(!usr.r_hand)
|
||||
P.loc = usr
|
||||
usr.r_hand = P
|
||||
P.layer = 20
|
||||
else if(!usr.l_hand)
|
||||
P.loc = usr
|
||||
usr.l_hand = P
|
||||
P.layer = 20
|
||||
|
||||
if(istype(usr,/mob/living/carbon/human))
|
||||
usr:update_inv_l_hand()
|
||||
usr:update_inv_r_hand()
|
||||
|
||||
/obj/item/weapon/autopsy_scanner/attack(mob/living/carbon/human/M as mob, mob/living/carbon/user as mob)
|
||||
if(!istype(M))
|
||||
return
|
||||
|
||||
if(!can_operate(M))
|
||||
return
|
||||
|
||||
if(target_name != M.name)
|
||||
target_name = M.name
|
||||
src.wdata = list()
|
||||
src.chemtraces = list()
|
||||
src.timeofdeath = null
|
||||
user << "\red A new patient has been registered.. Purging data for previous patient."
|
||||
|
||||
src.timeofdeath = M.timeofdeath
|
||||
|
||||
var/datum/organ/external/S = M.get_organ(user.zone_sel.selecting)
|
||||
if(!S)
|
||||
usr << "<b>You can't scan this body part.</b>"
|
||||
return
|
||||
if(!S.open)
|
||||
usr << "<b>You have to cut the limb open first!</b>"
|
||||
return
|
||||
for(var/mob/O in viewers(M))
|
||||
O.show_message("\red [user.name] scans the wounds on [M.name]'s [S.display_name] with \the [src.name]", 1)
|
||||
|
||||
src.add_data(S)
|
||||
|
||||
return 1
|
||||
@@ -0,0 +1,170 @@
|
||||
//Define all tape types in policetape.dm
|
||||
/obj/item/taperoll
|
||||
name = "tape roll"
|
||||
icon = 'icons/policetape.dmi'
|
||||
icon_state = "rollstart"
|
||||
flags = FPRINT
|
||||
w_class = 1.0
|
||||
var/turf/start
|
||||
var/turf/end
|
||||
var/tape_type = /obj/item/tape
|
||||
var/icon_base
|
||||
|
||||
/obj/item/tape
|
||||
name = "tape"
|
||||
icon = 'icons/policetape.dmi'
|
||||
anchored = 1
|
||||
density = 1
|
||||
var/icon_base
|
||||
|
||||
/obj/item/taperoll/police
|
||||
name = "police tape"
|
||||
desc = "A roll of police tape used to block off crime scenes from the public."
|
||||
icon_state = "police_start"
|
||||
tape_type = /obj/item/tape/police
|
||||
icon_base = "police"
|
||||
|
||||
/obj/item/tape/police
|
||||
name = "police tape"
|
||||
desc = "A length of police tape. Do not cross."
|
||||
req_access = list(access_security)
|
||||
icon_base = "police"
|
||||
|
||||
/obj/item/taperoll/engineering
|
||||
name = "engineering tape"
|
||||
desc = "A roll of engineering tape used to block off working areas from the public."
|
||||
icon_state = "engineering_start"
|
||||
tape_type = /obj/item/tape/engineering
|
||||
icon_base = "engineering"
|
||||
|
||||
/obj/item/tape/engineering
|
||||
name = "engineering tape"
|
||||
desc = "A length of engineering tape. Better not cross it."
|
||||
req_one_access = list(access_engine,access_atmospherics)
|
||||
icon_base = "engineering"
|
||||
|
||||
/obj/item/taperoll/attack_self(mob/user as mob)
|
||||
if(icon_state == "[icon_base]_start")
|
||||
start = get_turf(src)
|
||||
usr << "\blue You place the first end of the [src]."
|
||||
icon_state = "[icon_base]_stop"
|
||||
else
|
||||
icon_state = "[icon_base]_start"
|
||||
end = get_turf(src)
|
||||
if(start.y != end.y && start.x != end.x || start.z != end.z)
|
||||
usr << "\blue [src] can only be laid horizontally or vertically."
|
||||
return
|
||||
|
||||
var/turf/cur = start
|
||||
var/dir
|
||||
if (start.x == end.x)
|
||||
var/d = end.y-start.y
|
||||
if(d) d = d/abs(d)
|
||||
end = get_turf(locate(end.x,end.y+d,end.z))
|
||||
dir = "v"
|
||||
else
|
||||
var/d = end.x-start.x
|
||||
if(d) d = d/abs(d)
|
||||
end = get_turf(locate(end.x+d,end.y,end.z))
|
||||
dir = "h"
|
||||
|
||||
var/can_place = 1
|
||||
while (cur!=end && can_place)
|
||||
if(cur.density == 1)
|
||||
can_place = 0
|
||||
else if (istype(cur, /turf/space))
|
||||
can_place = 0
|
||||
else
|
||||
for(var/obj/O in cur)
|
||||
if(!istype(O, /obj/item/tape) && O.density)
|
||||
can_place = 0
|
||||
break
|
||||
cur = get_step_towards(cur,end)
|
||||
if (!can_place)
|
||||
usr << "\blue You can't run \the [src] through that!"
|
||||
return
|
||||
|
||||
cur = start
|
||||
var/tapetest = 0
|
||||
while (cur!=end)
|
||||
for(var/obj/item/tape/Ptest in cur)
|
||||
if(Ptest.icon_state == "[Ptest.icon_base]_[dir]")
|
||||
tapetest = 1
|
||||
if(tapetest != 1)
|
||||
var/obj/item/tape/P = new tape_type(cur)
|
||||
P.icon_state = "[P.icon_base]_[dir]"
|
||||
cur = get_step_towards(cur,end)
|
||||
//is_blocked_turf(var/turf/T)
|
||||
usr << "\blue You finish placing the [src]." //Git Test
|
||||
|
||||
/obj/item/taperoll/afterattack(var/atom/A, mob/user as mob, proximity)
|
||||
if (proximity && istype(A, /obj/machinery/door/airlock))
|
||||
var/turf/T = get_turf(A)
|
||||
var/obj/item/tape/P = new tape_type(T.x,T.y,T.z)
|
||||
P.loc = locate(T.x,T.y,T.z)
|
||||
P.icon_state = "[src.icon_base]_door"
|
||||
P.layer = 3.2
|
||||
user << "\blue You finish placing the [src]."
|
||||
|
||||
/obj/item/tape/Bumped(M as mob)
|
||||
if(src.allowed(M))
|
||||
var/turf/T = get_turf(src)
|
||||
M:loc = T
|
||||
|
||||
/obj/item/tape/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
|
||||
if(!density) return 1
|
||||
if(air_group || (height==0)) return 1
|
||||
|
||||
if ((mover.flags & 2 || istype(mover, /obj/effect/meteor) || mover.throwing == 1) )
|
||||
return 1
|
||||
else
|
||||
return 0
|
||||
|
||||
/obj/item/tape/attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
breaktape(W, user)
|
||||
|
||||
/obj/item/tape/attack_hand(mob/user as mob)
|
||||
if (user.a_intent == "help" && src.allowed(user))
|
||||
user.show_viewers("\blue [user] lifts [src], allowing passage.")
|
||||
src.density = 0
|
||||
spawn(200)
|
||||
src.density = 1
|
||||
else
|
||||
breaktape(/obj/item/weapon/soap, user)//cant be null, and can't be sharp.
|
||||
|
||||
/obj/item/tape/attack_paw(mob/user as mob)
|
||||
breaktape(/obj/item/weapon/wirecutters,user)
|
||||
|
||||
/obj/item/tape/attack_alien(mob/user as mob)
|
||||
breaktape(/obj/item/weapon/wirecutters,user)
|
||||
|
||||
/obj/item/tape/proc/breaktape(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(user.a_intent == "help" && ((!can_puncture(W) && src.allowed(user))))
|
||||
user << "You can't break the [src] with that!"
|
||||
return
|
||||
user.show_viewers("\blue [user] breaks the [src]!")
|
||||
|
||||
var/dir[2]
|
||||
var/icon_dir = src.icon_state
|
||||
if(icon_dir == "[src.icon_base]_h")
|
||||
dir[1] = EAST
|
||||
dir[2] = WEST
|
||||
if(icon_dir == "[src.icon_base]_v")
|
||||
dir[1] = NORTH
|
||||
dir[2] = SOUTH
|
||||
|
||||
for(var/i=1;i<3;i++)
|
||||
var/N = 0
|
||||
var/turf/cur = get_step(src,dir[i])
|
||||
while(N != 1)
|
||||
N = 1
|
||||
for (var/obj/item/tape/P in cur)
|
||||
if(P.icon_state == icon_dir)
|
||||
N = 0
|
||||
del(P)
|
||||
cur = get_step(cur,dir[i])
|
||||
|
||||
del(src)
|
||||
return
|
||||
|
||||
|
||||
@@ -0,0 +1,346 @@
|
||||
// -------------------------------------
|
||||
// Generates an innocuous toy
|
||||
// -------------------------------------
|
||||
/obj/item/toy/random
|
||||
name = "Random Toy"
|
||||
New()
|
||||
..()
|
||||
var/list/types = list(/obj/item/toy/crossbow,/obj/item/toy/balloon,/obj/item/toy/spinningtoy,/obj/item/weapon/reagent_containers/spray/waterflower) + typesof(/obj/item/toy/prize) - /obj/item/toy/prize
|
||||
var/T = pick(types)
|
||||
new T(loc)
|
||||
spawn(1)
|
||||
del src
|
||||
|
||||
// -------------------------------------
|
||||
// Random cleanables, clearly this makes sense
|
||||
// -------------------------------------
|
||||
|
||||
/obj/effect/decal/cleanable/random
|
||||
name = "Random Mess"
|
||||
New()
|
||||
..()
|
||||
var/list/list = typesof(/obj/effect/decal/cleanable) - list(/obj/effect/decal/cleanable,/obj/effect/decal/cleanable/random,/obj/effect/decal/cleanable/cobweb,/obj/effect/decal/cleanable/cobweb2)
|
||||
var/T = pick(list)
|
||||
new T(loc)
|
||||
spawn(0)
|
||||
del src
|
||||
|
||||
|
||||
/obj/item/stack/sheet/animalhide/random
|
||||
name = "Random animal hide"
|
||||
New()
|
||||
..()
|
||||
spawn(1)
|
||||
var/htype = pick(/obj/item/stack/sheet/animalhide/cat,/obj/item/stack/sheet/animalhide/corgi,/obj/item/stack/sheet/animalhide/human,/obj/item/stack/sheet/animalhide/lizard,/obj/item/stack/sheet/animalhide/monkey)
|
||||
var/obj/item/stack/S = new htype(loc)
|
||||
S.amount = amount
|
||||
del src
|
||||
|
||||
// -------------------------------------
|
||||
// Not yet identified chemical.
|
||||
// Could be anything!
|
||||
// -------------------------------------
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/random_reagent
|
||||
name = "unlabelled bottle"
|
||||
// identify_probability = 0
|
||||
New()
|
||||
..()
|
||||
var/datum/reagent/R = pick(chemical_reagents_list)
|
||||
var/global/list/rare_chems = list("minttoxin","nanites","xenomicrobes","adminordrazine")
|
||||
if(rare_chems.Find(R))
|
||||
reagents.add_reagent(R,10)
|
||||
else
|
||||
reagents.add_reagent(R,rand(2,3)*10)
|
||||
pixel_x = rand(-10,10)
|
||||
pixel_y = rand(-10,10)
|
||||
|
||||
//Cuts out the food and drink reagents
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/random_chem
|
||||
name = "unlabelled chemical bottle"
|
||||
// identify_probability = 0
|
||||
New()
|
||||
..()
|
||||
var/global/list/chems_only = list("slimejelly","blood","water","lube","anti_toxin","toxin","cyanide","stoxin","inaprovaline","space_drugs","serotrotium","oxygen","copper","nitrogen","hydrogen","potassium","mercury","sulfur","carbon","chlorine","fluorine","sodium","phosphorus","lithium","sugar","sacid","pacid","glycerol","radium","ryetalyn","thermite","mutagen","virusfood","iron","gold","silver","uranium","aluminum","silicon","fuel","cleaner","plantbgone","plasma","leporazine","cryptobiolin","lexorin","kelotane","dermaline","dexalin","dexalinp","tricordrazine","synaptizine","impedrezene","hyronalin","arithrazine","alkysine","imidazoline","bicaridine","hyperzine","cryoxadone","clonexadone","spaceacillin","carpotoxin","zombiepowder","mindbreaker","fluorosurfactant","foaming_agent","ethanol","ammonia","diethylamine","ethylredoxrazine","chloralhydrate","lipozine","condensedcapsaicin","frostoil","amatoxin","psilocybin","enzyme","nothing","doctorsdelight","antifreeze","neurotoxin")
|
||||
var/global/list/rare_chems = list("minttoxin","nanites","xenomicrobes","adminordrazine")
|
||||
|
||||
var/datum/reagent/R = pick(chems_only + rare_chems)
|
||||
if(rare_chems.Find(R))
|
||||
reagents.add_reagent(R,10)
|
||||
else
|
||||
reagents.add_reagent(R,rand(2,3)*10)
|
||||
name = "unlabelled bottle"
|
||||
pixel_x = rand(-10,10)
|
||||
pixel_y = rand(-10,10)
|
||||
|
||||
/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem
|
||||
name = "unlabelled chemical bottle"
|
||||
// identify_probability = 0
|
||||
New()
|
||||
..()
|
||||
var/global/list/base_chems = list("water","oxygen","nitrogen","hydrogen","potassium","mercury","carbon","chlorine","fluorine","phosphorus","lithium","sulfur","sacid","radium","iron","aluminum","silicon","sugar","ethanol")
|
||||
var/datum/reagent/R = pick(base_chems)
|
||||
reagents.add_reagent(R,rand(2,6)*5)
|
||||
name = "unlabelled bottle"
|
||||
pixel_x = rand(-10,10)
|
||||
pixel_y = rand(-10,10)
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink
|
||||
name = "unlabelled drink"
|
||||
icon = 'icons/obj/drinks.dmi'
|
||||
New()
|
||||
..()
|
||||
var/list/drinks_only = list("beer2","hot_coco","orangejuice","tomatojuice","limejuice","carrotjuice","berryjuice","poisonberryjuice","watermelonjuice","lemonjuice","banana","nothing","potato","milk","soymilk","cream","coffee","tea","icecoffee","icetea","cola","nuka_cola","spacemountainwind","thirteenloko","dr_gibb","space_up","lemon_lime","beer","whiskey","gin","rum","vodka","holywater","tequilla","vermouth","wine","tonic","kahlua","cognac","hooch","ale","sodawater","ice","bilk","atomicbomb","threemileisland","goldschlager","patron","gintonic","cubalibre","whiskeycola","martini","vodkamartini","whiterussian","screwdrivercocktail","booger","bloodymary","gargleblaster","bravebull","tequillasunrise","toxinsspecial","beepskysmash","doctorsdelight","irishcream","manlydorf","longislandicedtea","moonshine","b52","irishcoffee","margarita","blackrussian","manhattan","manhattan_proj","whiskeysoda","antifreeze","barefoot","snowwhite","demonsblood","vodkatonic","ginfizz","bahama_mama","singulo","sbiten","devilskiss","red_mead","mead","iced_beer","grog","aloe","andalusia","alliescocktail","soy_latte","cafe_latte","acidspit","amasec","neurotoxin","hippiesdelight","bananahonk","silencer","changelingsting","irishcarbomb","syndicatebomb","erikasurprise","driestmartini")
|
||||
if(prob(50))
|
||||
drinks_only += list("chloralhydrate","adminordrazine","mindbreaker","tricordrazine","blood")
|
||||
|
||||
var/datum/reagent/R = pick(drinks_only)
|
||||
reagents.add_reagent(R,volume)
|
||||
name = "unlabelled bottle"
|
||||
icon_state = pick("alco-white","alco-green","alco-blue","alco-clear","alco-red")
|
||||
pixel_x = rand(-5,5)
|
||||
pixel_y = rand(-5,5)
|
||||
/obj/item/weapon/reagent_containers/food/drinks/bottle/random_reagent // Same as the chembottle code except the container
|
||||
name = "unlabelled drink?"
|
||||
icon = 'icons/obj/drinks.dmi'
|
||||
New()
|
||||
..()
|
||||
var/datum/reagent/R = pick(chemical_reagents_list)
|
||||
var/global/list/rare_chems = list("minttoxin","nanites","xenomicrobes","adminordrazine")
|
||||
if(rare_chems.Find(R))
|
||||
reagents.add_reagent(R,10)
|
||||
else
|
||||
reagents.add_reagent(R,rand(3,10)*10)
|
||||
name = "unlabelled bottle"
|
||||
icon_state = pick("alco-white","alco-green","alco-blue","alco-clear","alco-red")
|
||||
pixel_x = rand(-5,5)
|
||||
pixel_y = rand(-5,5)
|
||||
spawn(0)
|
||||
del src
|
||||
|
||||
/obj/item/weapon/storage/pill_bottle/random_meds
|
||||
name = "unlabelled pillbottle"
|
||||
desc = "The sheer recklessness of this bottle's existence astounds you."
|
||||
|
||||
New()
|
||||
..()
|
||||
var/global/list/meds_only = list("anti_toxin","toxin","cyanide","stoxin","inaprovaline","space_drugs","serotrotium","ryetalyn","mutagen","leporazine","cryptobiolin","lexorin","kelotane","dermaline","dexalin","dexalinp","tricordrazine","synaptizine","impedrezene","hyronalin","arithrazine","alkysine","imidazoline","bicaridine","hyperzine","spaceacillin","carpotoxin","zombiepowder","mindbreaker","ethanol","ammonia","diethylamine","ethylredoxrazine","chloralhydrate","lipozine","condensedcapsaicin","frostoil","amatoxin","psilocybin","nothing","doctorsdelight","neurotoxin")
|
||||
var/global/list/rare_meds = list("nanites","xenomicrobes","minttoxin","adminordrazine","blood")
|
||||
|
||||
var/i = 1
|
||||
while(i < storage_slots)
|
||||
|
||||
var/datum/reagent/R
|
||||
if(prob(50))
|
||||
R = pick(meds_only + rare_meds)
|
||||
else
|
||||
R = pick(meds_only)
|
||||
var/obj/item/weapon/reagent_containers/pill/P = new(src)
|
||||
|
||||
if(rare_meds.Find(R))
|
||||
P.reagents.add_reagent(R,10)
|
||||
else
|
||||
P.reagents.add_reagent(R,rand(2,5)*10)
|
||||
P.name = "Unlabelled Pill"
|
||||
P.desc = "Something about this pill entices you to try it, against your better judgement."
|
||||
i++
|
||||
pixel_x = rand(-10,10)
|
||||
pixel_y = rand(-10,10)
|
||||
return
|
||||
|
||||
// -------------------------------------
|
||||
// Containers full of unknown crap
|
||||
// -------------------------------------
|
||||
|
||||
/obj/structure/closet/crate/secure/unknownchemicals
|
||||
name = "Grey-market Chemicals Grab Pack"
|
||||
desc = "Crate full of chemicals of unknown type and value from a 'trusted' source."
|
||||
req_one_access = list(access_chemistry,access_research,access_qm) // the qm knows a guy, you see.
|
||||
|
||||
New()
|
||||
..()
|
||||
sleep(2)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/random_base_chem(src)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/random_chem(src)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/random_chem(src)
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/random_chem(src)
|
||||
while(prob(50))
|
||||
new/obj/item/weapon/reagent_containers/glass/bottle/random_reagent(src)
|
||||
|
||||
new/obj/item/weapon/storage/pill_bottle/random_meds(src)
|
||||
while(prob(25))
|
||||
new/obj/item/weapon/storage/pill_bottle/random_meds(src)
|
||||
return
|
||||
|
||||
/obj/structure/closet/crate/secure/chemicals
|
||||
name = "Chemical Supply Kit"
|
||||
desc = "Full of basic chemistry supplies."
|
||||
req_one_access = list(access_chemistry,access_research)
|
||||
|
||||
New()
|
||||
..()
|
||||
sleep(2)
|
||||
var/global/list/base_chems = list("water","oxygen","nitrogen","hydrogen","potassium","mercury","carbon","chlorine","fluorine","phosphorus","lithium","sulfur","sacid","radium","iron","aluminum","silicon","sugar","ethanol")
|
||||
for(var/chem in base_chems)
|
||||
var/obj/item/weapon/reagent_containers/glass/bottle/B = new(src)
|
||||
B.reagents.add_reagent(chem,B.volume)
|
||||
if(prob(85))
|
||||
var/datum/reagent/r = chemical_reagents_list[chem]
|
||||
B.name = "[r.name] bottle"
|
||||
// B.identify_probability = 100
|
||||
else
|
||||
B.name = "unlabelled bottle"
|
||||
B.desc = "Looks like the label fell off."
|
||||
// B.identify_probability = 0
|
||||
|
||||
|
||||
/obj/structure/closet/crate/bin/flowers
|
||||
name = "flower barrel"
|
||||
desc = "A bin full of fresh flowers for the bereaved."
|
||||
anchored = 0
|
||||
New()
|
||||
while(contents.len < 10)
|
||||
var/flowertype = pick(/obj/item/weapon/grown/sunflower,/obj/item/weapon/grown/novaflower,/obj/item/weapon/reagent_containers/food/snacks/grown/poppy,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/harebell,/obj/item/weapon/reagent_containers/food/snacks/grown/moonflower)
|
||||
var/atom/movable/AM = new flowertype(src)
|
||||
AM.pixel_x = rand(-10,10)
|
||||
AM.pixel_y = rand(-5,5)
|
||||
|
||||
|
||||
/obj/structure/closet/crate/bin/plants
|
||||
name = "plant barrel"
|
||||
desc = "Caution: Contents may contain vitamins and minerals. It is recommended that you deep fry them before eating."
|
||||
anchored = 0
|
||||
New()
|
||||
while(contents.len < 10)
|
||||
var/ptype = pick(/obj/item/weapon/reagent_containers/food/snacks/grown/apple,/obj/item/weapon/reagent_containers/food/snacks/grown/banana,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/berries, /obj/item/weapon/reagent_containers/food/snacks/grown/cabbage,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/carrot, /obj/item/weapon/reagent_containers/food/snacks/grown/cherries,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/chili, /obj/item/weapon/reagent_containers/food/snacks/grown/cocoapod,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/corn, /obj/item/weapon/reagent_containers/food/snacks/grown/eggplant,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/grapes, /obj/item/weapon/reagent_containers/food/snacks/grown/greengrapes,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/icepepper, /obj/item/weapon/reagent_containers/food/snacks/grown/lemon,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/lime, /obj/item/weapon/reagent_containers/food/snacks/grown/orange,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/potato, /obj/item/weapon/reagent_containers/food/snacks/grown/pumpkin,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/soybeans, /obj/item/weapon/reagent_containers/food/snacks/grown/sugarcane,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/tomato, /obj/item/weapon/reagent_containers/food/snacks/grown/watermelon,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/wheat, /obj/item/weapon/reagent_containers/food/snacks/grown/whitebeet,
|
||||
/obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/chanterelle, /obj/item/weapon/reagent_containers/food/snacks/grown/mushroom/plumphelmet)
|
||||
var/obj/O = new ptype(src)
|
||||
O.pixel_x = rand(-10,10)
|
||||
O.pixel_y = rand(-5,5)
|
||||
|
||||
/obj/structure/closet/secure_closet/random_drinks
|
||||
name = "Unlabelled Booze"
|
||||
req_access = list(access_bar)
|
||||
icon_state = "cabinetdetective_locked"
|
||||
icon_closed = "cabinetdetective"
|
||||
icon_locked = "cabinetdetective_locked"
|
||||
icon_opened = "cabinetdetective_open"
|
||||
icon_broken = "cabinetdetective_broken"
|
||||
icon_off = "cabinetdetective_broken"
|
||||
|
||||
New()
|
||||
..()
|
||||
sleep(2)
|
||||
new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink(src)
|
||||
new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink(src)
|
||||
new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink(src)
|
||||
new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink(src)
|
||||
new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink(src)
|
||||
while(prob(25))
|
||||
new/obj/item/weapon/reagent_containers/food/drinks/bottle/random_reagent(src)
|
||||
return
|
||||
|
||||
|
||||
// -------------------------------------
|
||||
// Do not order this.
|
||||
// If you order this, do not open it.
|
||||
// If you open this, run.
|
||||
// If you didn't run, pray.
|
||||
// -------------------------------------
|
||||
|
||||
/obj/structure/largecrate/evil
|
||||
name = "\improper Mysterious Crate"
|
||||
desc = "What could it be?"
|
||||
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/crowbar))
|
||||
var/list/menace = pick( /mob/living/simple_animal/hostile/carp,/mob/living/simple_animal/hostile/faithless,/mob/living/simple_animal/hostile/pirate,
|
||||
/mob/living/simple_animal/hostile/creature,/mob/living/simple_animal/hostile/pirate/ranged,
|
||||
/mob/living/simple_animal/hostile/hivebot,/mob/living/simple_animal/hostile/viscerator,/mob/living/simple_animal/hostile/pirate)
|
||||
|
||||
visible_message("\red Something falls out of the [src]!")
|
||||
var/obj/item/weapon/grenade/flashbang/clusterbang/C = new(src.loc)
|
||||
C.prime()
|
||||
spawn(10)
|
||||
new menace(src.loc)
|
||||
while(prob(15))
|
||||
new menace(get_step_rand(src.loc))
|
||||
..()
|
||||
else
|
||||
..()
|
||||
|
||||
|
||||
//
|
||||
//
|
||||
//
|
||||
// ???
|
||||
//
|
||||
//
|
||||
//
|
||||
|
||||
/obj/structure/largecrate/schrodinger
|
||||
name = "Schrodinger's Crate"
|
||||
desc = "What happens if you open it?"
|
||||
|
||||
attackby(obj/item/weapon/W as obj, mob/user as mob)
|
||||
if(istype(W, /obj/item/weapon/crowbar))
|
||||
var/mob/living/simple_animal/cat/Cat1 = new(loc)
|
||||
Cat1.apply_damage(250)//,TOX)
|
||||
Cat1.name = "Schrodinger's Cat"
|
||||
Cat1.desc = "It seems it's been dead for a while."
|
||||
|
||||
var/mob/living/simple_animal/cat/Cat2 = new(loc)
|
||||
Cat2.name = "Schrodinger's Cat"
|
||||
Cat2.desc = "It's was alive the whole time!"
|
||||
sleep(2)
|
||||
if(prob(50))
|
||||
del Cat1
|
||||
else
|
||||
del Cat2
|
||||
..()
|
||||
|
||||
// --------------------------------------
|
||||
// Collen's box of wonder and mystery
|
||||
// --------------------------------------
|
||||
/obj/item/weapon/storage/box/grenades
|
||||
name = "tactical grenades"
|
||||
desc = "A box with 6 tactical grenades."
|
||||
icon_state = "flashbang"
|
||||
var/list/grenadelist = list(/obj/item/weapon/grenade/chem_grenade/metalfoam, /obj/item/weapon/grenade/chem_grenade/incendiary,
|
||||
/obj/item/weapon/grenade/chem_grenade/antiweed, /obj/item/weapon/grenade/chem_grenade/cleaner, /obj/item/weapon/grenade/chem_grenade/teargas,
|
||||
/obj/item/weapon/grenade/chem_grenade/holywater, /obj/item/weapon/grenade/chem_grenade/soap, /obj/item/weapon/grenade/chem_grenade/meat,
|
||||
/obj/item/weapon/grenade/chem_grenade/dirt, /obj/item/weapon/grenade/chem_grenade/lube, /obj/item/weapon/grenade/smokebomb,
|
||||
/obj/item/weapon/grenade/chem_grenade/drugs, /obj/item/weapon/grenade/chem_grenade/ethanol) // holy list batman
|
||||
|
||||
New()
|
||||
..()
|
||||
var/nade1 = pick(grenadelist)
|
||||
var/nade2 = pick(grenadelist)
|
||||
var/nade3 = pick(grenadelist)
|
||||
var/nade4 = pick(grenadelist)
|
||||
var/nade5 = pick(grenadelist)
|
||||
var/nade6 = pick(grenadelist)
|
||||
|
||||
new nade1(src)
|
||||
new nade2(src)
|
||||
new nade3(src)
|
||||
new nade4(src)
|
||||
new nade5(src)
|
||||
new nade6(src)
|
||||
@@ -0,0 +1,66 @@
|
||||
obj/item/weapon/firework
|
||||
name = "fireworks"
|
||||
icon = 'icons/obj/fireworks.dmi'
|
||||
icon_state = "rocket_0"
|
||||
var/litzor = 0
|
||||
var/datum/effects/system/sparkel_spread/S
|
||||
obj/item/weapon/firework/attackby(obj/item/weapon/W,mob/user)
|
||||
if(litzor)
|
||||
return
|
||||
if (istype(W, /obj/item/weapon/weldingtool) && W:welding || istype(W,/obj/item/weapon/lighter) && W:lit)
|
||||
for(var/mob/M in viewers(user))
|
||||
M << "[user] lits \the [src]"
|
||||
litzor = 1
|
||||
icon_state = "rocket_1"
|
||||
S = new()
|
||||
S.set_up(5,0,src.loc)
|
||||
sleep(30)
|
||||
if(ismob(src.loc) || isobj(src.loc))
|
||||
S.attach(src.loc)
|
||||
S.start()
|
||||
del(src)
|
||||
|
||||
obj/item/weapon/sparkler
|
||||
name = "sparkler"
|
||||
icon = 'icons/obj/fireworks.dmi'
|
||||
icon_state = "sparkler_0"
|
||||
var/litzor = 0
|
||||
var/datum/effect/effect/system/spark_spread/S
|
||||
obj/item/weapon/sparkler/attackby(obj/item/weapon/W,mob/user)
|
||||
if(litzor)
|
||||
return
|
||||
if (istype(W, /obj/item/weapon/weldingtool) && W:welding || istype(W,/obj/item/weapon/lighter) && W:lit)
|
||||
for(var/mob/M in viewers(user))
|
||||
M << "[user] lits \the [src]"
|
||||
litzor = 1
|
||||
icon_state = "sparkler_1"
|
||||
var/b = rand(5,9)
|
||||
for(var/xy, xy<=b, xy++)
|
||||
S = new()
|
||||
S.set_up(1,0,src.loc)
|
||||
if(ismob(src.loc) || isobj(src.loc))
|
||||
S.attach(src.loc)
|
||||
S.start()
|
||||
sleep(10)
|
||||
del(src)
|
||||
/obj/crate/fireworks
|
||||
name = "Fireworks!"
|
||||
/obj/crate/fireworks/New()
|
||||
new /obj/item/weapon/sparkler(src)
|
||||
new /obj/item/weapon/sparkler(src)
|
||||
new /obj/item/weapon/sparkler(src)
|
||||
new /obj/item/weapon/sparkler(src)
|
||||
new /obj/item/weapon/sparkler(src)
|
||||
new /obj/item/weapon/sparkler(src)
|
||||
new /obj/item/weapon/sparkler(src)
|
||||
new /obj/item/weapon/sparkler(src)
|
||||
new /obj/item/weapon/firework(src)
|
||||
new /obj/item/weapon/firework(src)
|
||||
new /obj/item/weapon/firework(src)
|
||||
new /obj/item/weapon/firework(src)
|
||||
new /obj/item/weapon/firework(src)
|
||||
new /obj/item/weapon/firework(src)
|
||||
new /obj/item/weapon/firework(src)
|
||||
new /obj/item/weapon/firework(src)
|
||||
new /obj/item/weapon/firework(src)
|
||||
new /obj/item/weapon/firework(src)
|
||||
@@ -0,0 +1,481 @@
|
||||
/obj/item/weapon/grenade/chem_grenade/dirt
|
||||
payload_name = "dirt"
|
||||
desc = "From the makers of BLAM! brand foaming space cleaner, this bomb guarantees steady work for any janitor."
|
||||
stage = 2
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/list/muck = list("blood","carbon","flour","radium")
|
||||
var/filth = pick(muck - "radium") // not usually radioactive
|
||||
|
||||
B1.reagents.add_reagent(filth,25)
|
||||
if(prob(25))
|
||||
B1.reagents.add_reagent(pick(muck - filth,25)) // but sometimes...
|
||||
|
||||
beakers += B1
|
||||
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/meat
|
||||
payload_name = "meat"
|
||||
desc = "Not always as messy as the name implies."
|
||||
stage = 2
|
||||
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/large/B1 = new(src)
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src)
|
||||
|
||||
B1.reagents.add_reagent("blood",60)
|
||||
if(prob(5))
|
||||
B1.reagents.add_reagent("blood",1) // Quality control problems, causes a mess
|
||||
B2.reagents.add_reagent("clonexadone",30)
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/holywater
|
||||
payload_name = "holy water"
|
||||
desc = "Then shalt thou count to three, no more, no less."
|
||||
stage = 2
|
||||
det_time = 30
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/large/B = new(src)
|
||||
B.reagents.add_reagent("holywater",100)
|
||||
beakers += B
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/soap
|
||||
payload_name = "soap"
|
||||
desc = "Not necessarily as clean as the name implies."
|
||||
stage = 2
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
|
||||
|
||||
B1.reagents.add_reagent("cornoil",60)
|
||||
B2.reagents.add_reagent("enzyme",5)
|
||||
B2.reagents.add_reagent("ammonia",30)
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/drugs
|
||||
payload_name = "miracle"
|
||||
desc = "How does it work?"
|
||||
stage = 2
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/large/B1 = new(src)
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src)
|
||||
|
||||
B1.reagents.add_reagent("space_drugs", 25)
|
||||
B1.reagents.add_reagent("mindbreaker", 25)
|
||||
B1.reagents.add_reagent("potassium", 25)
|
||||
B2.reagents.add_reagent("phosphorus", 25)
|
||||
B2.reagents.add_reagent("sugar", 25)
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
update_icon()
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/ethanol
|
||||
payload_name = "ethanol"
|
||||
desc = "Ach, that hits the spot."
|
||||
stage = 2
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/large/B1 = new(src)
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/large/B2 = new(src)
|
||||
|
||||
B1.reagents.add_reagent("ethanol", 75)
|
||||
B1.reagents.add_reagent("potassium", 25)
|
||||
B2.reagents.add_reagent("phosphorus", 25)
|
||||
B2.reagents.add_reagent("sugar", 25)
|
||||
B2.reagents.add_reagent("ethanol", 25)
|
||||
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
update_icon()
|
||||
|
||||
// -------------------------------------
|
||||
// Grenades using new grenade assemblies
|
||||
// -------------------------------------
|
||||
/obj/item/weapon/grenade/chem_grenade/lube
|
||||
payload_name = "lubricant"
|
||||
stage = 2
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
|
||||
B1.reagents.add_reagent("lube",50)
|
||||
beakers += B1
|
||||
/obj/item/weapon/grenade/chem_grenade/lube/remote
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/signaler)
|
||||
/obj/item/weapon/grenade/chem_grenade/lube/prox
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor)
|
||||
/obj/item/weapon/grenade/chem_grenade/lube/tripwire
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/infra)
|
||||
|
||||
|
||||
// Basic explosion grenade
|
||||
/obj/item/weapon/grenade/chem_grenade/explosion
|
||||
payload_name = "conventional"
|
||||
stage = 2
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
|
||||
B1.reagents.add_reagent("glycerol",30) // todo: someone says NG is overpowered, test.
|
||||
B1.reagents.add_reagent("sacid",15)
|
||||
B2.reagents.add_reagent("sacid",15)
|
||||
B2.reagents.add_reagent("pacid",30)
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
|
||||
// Assembly Variants
|
||||
/obj/item/weapon/grenade/chem_grenade/explosion/remote
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/signaler)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/explosion/prox
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/explosion/mine
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/mousetrap)
|
||||
|
||||
// Basic EMP grenade
|
||||
/obj/item/weapon/grenade/chem_grenade/emp
|
||||
payload_name = "EMP"
|
||||
stage = 2
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/B1 = new(src)
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
|
||||
B1.reagents.add_reagent("uranium",50)
|
||||
B2.reagents.add_reagent("iron",50)
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
|
||||
// Assembly Variants
|
||||
/obj/item/weapon/grenade/chem_grenade/emp/remote
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/signaler)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/emp/prox
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/emp/mine
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/mousetrap)
|
||||
|
||||
// --------------------------------------
|
||||
// Dangerous slime core grenades
|
||||
// --------------------------------------
|
||||
/*
|
||||
/obj/item/weapon/grenade/chem_grenade/large/bluespace
|
||||
payload_name = "bluespace slime"
|
||||
desc = "A standard grenade casing containing weaponized slime extract."
|
||||
stage = 2
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/slime_extract/bluespace/B1 = new(src)
|
||||
B1.Uses = rand(1,3)
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
|
||||
B2.reagents.add_reagent("plasma",5 * B1.Uses)
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/large/bluespace/prox
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/large/bluespace/mine
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/mousetrap)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/large/bluespace/remote
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/signaler)
|
||||
*/
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/large/monster
|
||||
payload_name = "gold slime"
|
||||
desc = "A standard grenade containing weaponized slime extract."
|
||||
stage = 2
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/slime_extract/gold/B1 = new(src)
|
||||
B1.Uses = rand(1,3)
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
|
||||
B2.reagents.add_reagent("plasma",5 * B1.Uses)
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/large/monster/prox
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/prox_sensor)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/large/monster/mine
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/mousetrap)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/large/monster/remote
|
||||
New()
|
||||
..()
|
||||
CreateDefaultTrigger(/obj/item/device/assembly/signaler)
|
||||
|
||||
/obj/item/weapon/grenade/chem_grenade/large/feast
|
||||
payload_name = "silver slime"
|
||||
desc = "A standard grenade containing weaponized slime extract."
|
||||
stage = 2
|
||||
|
||||
New()
|
||||
..()
|
||||
var/obj/item/slime_extract/silver/B1 = new(src)
|
||||
B1.Uses = rand(1,3)
|
||||
var/obj/item/weapon/reagent_containers/glass/beaker/B2 = new(src)
|
||||
B2.reagents.add_reagent("plasma",5 * B1.Uses)
|
||||
beakers += B1
|
||||
beakers += B2
|
||||
|
||||
// Slime Clusterbusters
|
||||
/*/obj/item/weapon/grenade/clusterbuster/bluespace
|
||||
name = "Bluespace Megabomb"
|
||||
desc = "Widely regarded as proof that while there is a God, He is Insane."
|
||||
payload = /obj/item/weapon/grenade/chem_grenade/large/bluespace*/
|
||||
|
||||
/obj/item/weapon/grenade/clusterbuster/monster
|
||||
name = "Monster Megabomb"
|
||||
desc = "Widely regarded as proof that there is no God."
|
||||
payload = /obj/item/weapon/grenade/chem_grenade/large/monster
|
||||
|
||||
// --------------------------------------
|
||||
// Syndie Kits
|
||||
// --------------------------------------
|
||||
|
||||
/obj/item/weapon/storage/box/syndie_kit/remotegrenade
|
||||
name = "Remote Grenade Kit"
|
||||
New()
|
||||
..()
|
||||
new /obj/item/weapon/grenade/chem_grenade/explosion/remote(src)
|
||||
new /obj/item/device/multitool(src) // used to adjust the chemgrenade's signaller
|
||||
new /obj/item/device/assembly/signaler(src)
|
||||
return
|
||||
/obj/item/weapon/storage/box/syndie_kit/remoteemp
|
||||
name = "Remote EMP Kit"
|
||||
New()
|
||||
..()
|
||||
new /obj/item/weapon/grenade/chem_grenade/emp/remote(src)
|
||||
new /obj/item/device/multitool(src) // used to adjust the chemgrenade's signaller
|
||||
new /obj/item/device/assembly/signaler(src)
|
||||
return
|
||||
/obj/item/weapon/storage/box/syndie_kit/remotelube
|
||||
name = "Remote Lube Kit"
|
||||
New()
|
||||
..()
|
||||
new /obj/item/weapon/grenade/chem_grenade/lube(src)
|
||||
new /obj/item/device/multitool(src) // used to adjust the chemgrenade's signaller
|
||||
new /obj/item/device/assembly/signaler(src)
|
||||
return
|
||||
// --------------------------------------
|
||||
// Clusterbuster Variable Payload Grenade
|
||||
// Adapted from flashbang/clusterbang
|
||||
// --------------------------------------
|
||||
|
||||
/obj/item/weapon/grenade/clusterbuster
|
||||
desc = "This highly intimidating bunch of hardware seems eager to be let loose."
|
||||
name = "Clusterbang"
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
icon_state = "clusterbang"
|
||||
var/payload = /obj/item/weapon/grenade/flashbang
|
||||
|
||||
|
||||
// Subtypes
|
||||
|
||||
// Serious grenades
|
||||
/obj/item/weapon/grenade/clusterbuster/explosion
|
||||
name = "Cluster Grenade"
|
||||
payload = /obj/item/weapon/grenade/chem_grenade/explosion
|
||||
/obj/item/weapon/grenade/clusterbuster/emp
|
||||
name = "Electromagnetic Storm"
|
||||
payload = /obj/item/weapon/grenade/chem_grenade/emp
|
||||
/obj/item/weapon/grenade/clusterbuster/smoke
|
||||
name = "Ninja Vanish"
|
||||
payload = /obj/item/weapon/grenade/smokebomb
|
||||
|
||||
// Not serious grenades
|
||||
/obj/item/weapon/grenade/clusterbuster/meat
|
||||
name = "Mega Meat Grenade"
|
||||
payload = /obj/item/weapon/grenade/chem_grenade/meat
|
||||
/obj/item/weapon/grenade/clusterbuster/booze
|
||||
name = "Booze Grenade"
|
||||
payload = /obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink
|
||||
/obj/item/weapon/grenade/clusterbuster/honk
|
||||
name = "Mega Honk Grenade"
|
||||
payload = /obj/item/weapon/bananapeel
|
||||
/obj/item/weapon/grenade/clusterbuster/xmas
|
||||
name = "Christmas Miracle"
|
||||
payload = /obj/item/weapon/a_gift
|
||||
/obj/item/weapon/grenade/clusterbuster/soap
|
||||
name = "Megamaid's Passive-Aggressive Soap-creation Grenade"
|
||||
payload = /obj/item/weapon/grenade/chem_grenade/soap
|
||||
/obj/item/weapon/grenade/clusterbuster/dirt
|
||||
name = "Megamaid's Job Security Grenade"
|
||||
payload = /obj/effect/decal/cleanable/random
|
||||
/obj/item/weapon/grenade/clusterbuster/megadirt
|
||||
name = "Megamaid's Revenge Grenade"
|
||||
payload = /obj/item/weapon/grenade/chem_grenade/dirt
|
||||
/obj/item/weapon/grenade/clusterbuster/inferno
|
||||
name = "Little Boy"
|
||||
payload = /obj/item/weapon/grenade/chem_grenade/incendiary
|
||||
/obj/item/weapon/grenade/clusterbuster/apocalypsefake
|
||||
name = "Fun Bomb"
|
||||
desc = "Not like the other bomb."
|
||||
payload = /obj/item/toy/spinningtoy
|
||||
|
||||
// Grenades that should never see the light of day
|
||||
/obj/item/weapon/grenade/clusterbuster/apocalypse
|
||||
name = "Apocalypse Bomb"
|
||||
desc = "No matter what, do not EVER use this."
|
||||
payload = /obj/machinery/singularity
|
||||
|
||||
/obj/item/weapon/grenade/clusterbuster/ultima
|
||||
name = "Earth Shattering Kaboom"
|
||||
desc = "Contains one Aludium Q-36 explosive space modulator."
|
||||
payload = /obj/item/weapon/grenade/chem_grenade/explosion
|
||||
|
||||
/obj/item/weapon/grenade/clusterbuster/lube
|
||||
name = "Newton's First Law"
|
||||
desc = "An object in motion remains in motion."
|
||||
payload = /obj/item/weapon/grenade/chem_grenade/lube
|
||||
|
||||
|
||||
/*/obj/item/weapon/grenade/clusterbuster/bluespace
|
||||
name = "Maximum Warp"
|
||||
desc = "Spacetime: Nice job breaking it, hero."
|
||||
payload = /obj/item/weapon/grenade/chem_grenade/large/bluespace*/
|
||||
/obj/item/weapon/grenade/clusterbuster/monster
|
||||
name = "The Monster Mash"
|
||||
desc = "It's a graveyeard smash."
|
||||
payload = /obj/item/weapon/grenade/chem_grenade/large/monster
|
||||
/obj/item/weapon/grenade/clusterbuster/banquet
|
||||
name = "Bork Bork Bonanza"
|
||||
desc = "Bork bork bork."
|
||||
payload = /obj/item/weapon/grenade/clusterbuster/banquet/child
|
||||
child
|
||||
payload = /obj/item/weapon/grenade/chem_grenade/large/feast
|
||||
|
||||
// Mob spawning grenades
|
||||
/obj/item/weapon/grenade/clusterbuster/aviary
|
||||
name = "Poly-Poly Grenade"
|
||||
desc = "That's an uncomfortable number of birds."
|
||||
payload = /mob/living/simple_animal/parrot
|
||||
/obj/item/weapon/grenade/clusterbuster/monkey
|
||||
name = "Barrel of Monkeys"
|
||||
desc = "Not really that much fun."
|
||||
payload = /mob/living/carbon/monkey
|
||||
/obj/item/weapon/grenade/clusterbuster/fluffy
|
||||
name = "Fluffy Love Bomb"
|
||||
desc = "Exactly as snuggly as it sounds."
|
||||
payload = /mob/living/simple_animal/corgi/puppy
|
||||
|
||||
/obj/item/weapon/grenade/clusterbuster/prime()
|
||||
var/numspawned = rand(4,8)
|
||||
var/again = 0
|
||||
for(var/more = numspawned,more > 0,more--)
|
||||
if(prob(35))
|
||||
again++
|
||||
numspawned --
|
||||
|
||||
for(,numspawned > 0, numspawned--)
|
||||
spawn(0)
|
||||
new /obj/item/weapon/grenade/clusterbuster/node(src.loc,payload,name)//Launches payload
|
||||
playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
|
||||
|
||||
for(,again > 0, again--)
|
||||
spawn(0)
|
||||
new /obj/item/weapon/grenade/clusterbuster/segment(src.loc,payload,name)//Creates a 'segment' that launches more payloads
|
||||
playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
|
||||
spawn(0)
|
||||
del(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/grenade/clusterbuster/segment
|
||||
desc = "What's happening? Aaah!"
|
||||
name = "clusterbuster segment"
|
||||
icon = 'icons/obj/grenade.dmi'
|
||||
icon_state = "clusterbang_segment"
|
||||
|
||||
/obj/item/weapon/grenade/clusterbuster/segment/New(var/turf/newloc,var/T,var/N)//Segments should never exist except part of the clusterbang, since these immediately 'do their thing' and asplode
|
||||
icon_state = "clusterbang_segment_active"
|
||||
active = 1
|
||||
payload = T
|
||||
name = N
|
||||
var/stepdist = rand(1,5) //How far to step
|
||||
var/temploc = src.loc //Saves the current location to know where to step away from
|
||||
walk_away(src,temploc,stepdist) //I must go, my people need me
|
||||
var/dettime = rand(15,60)
|
||||
spawn(dettime)
|
||||
prime()
|
||||
|
||||
/obj/item/weapon/grenade/clusterbuster/segment/prime()
|
||||
var/numspawned = rand(4,8)
|
||||
for(var/more = numspawned,more > 0,more--)
|
||||
if(prob(35))
|
||||
numspawned --
|
||||
|
||||
for(,numspawned > 0, numspawned--)
|
||||
new /obj/item/weapon/grenade/clusterbuster/node(src.loc,payload)
|
||||
spawn(0)
|
||||
playsound(src.loc, 'sound/weapons/armbomb.ogg', 75, 1, -3)
|
||||
del(src)
|
||||
return
|
||||
|
||||
/obj/item/weapon/grenade/clusterbuster/node/New(var/turf/newloc,var/T,var/N)
|
||||
icon_state = "flashbang_active"
|
||||
active = 1
|
||||
payload = T
|
||||
name = N
|
||||
var/stepdist = rand(1,4)
|
||||
var/temploc = src.loc
|
||||
walk_away(src,temploc,stepdist)
|
||||
var/dettime = rand(15,60)
|
||||
spawn(dettime)
|
||||
var/atom/A = new payload(loc)
|
||||
if(istype(A,/obj/item/weapon/grenade))
|
||||
A:prime()
|
||||
if(istype(A,/obj/machinery/singularity)) // I can't emphasize enough how much you should never use this grenade
|
||||
A:energy = 200
|
||||
del src
|
||||
@@ -290,4 +290,158 @@
|
||||
/obj/item/weapon/storage/belt/fannypack/yellow
|
||||
name = "yellow fannypack"
|
||||
icon_state = "fannypack_yellow"
|
||||
item_state = "fannypack_yellow"
|
||||
item_state = "fannypack_yellow"
|
||||
|
||||
// -------------------------------------
|
||||
// Bluespace Belt
|
||||
// -------------------------------------
|
||||
|
||||
|
||||
/obj/item/weapon/storage/belt/bluespace
|
||||
name = "Belt of Holding"
|
||||
desc = "The greatest in pants-supporting technology."
|
||||
icon_state = "medicalbelt"
|
||||
item_state = "medical"
|
||||
storage_slots = 14
|
||||
w_class = 4
|
||||
max_w_class = 2
|
||||
max_combined_w_class = 21 // = 14 * 1.5, not 14 * 2. This is deliberate
|
||||
origin_tech = "bluespace=4"
|
||||
can_hold = list()
|
||||
New()
|
||||
if(prob(5))
|
||||
//Sometimes people choose justice.
|
||||
//Sometimes justice chooses you.
|
||||
visible_message("That doesn't look like a normal Toolbelt of Holding...")
|
||||
new /obj/item/weapon/storage/belt/bluespace/owlman(loc)
|
||||
spawn(1)
|
||||
del src
|
||||
return
|
||||
..()
|
||||
|
||||
proc/failcheck(mob/user as mob)
|
||||
if (prob(src.reliability)) return 1 //No failure
|
||||
if (prob(src.reliability))
|
||||
user << "\red The Bluespace portal resists your attempt to add another item." //light failure
|
||||
else
|
||||
user << "\red The Bluespace generator malfunctions!"
|
||||
for (var/obj/O in src.contents) //it broke, delete what was in it
|
||||
del(O)
|
||||
crit_fail = 1
|
||||
return 0
|
||||
|
||||
/obj/item/weapon/storage/belt/bluespace/owlman
|
||||
name = "Owlman's utility belt"
|
||||
desc = "Sometimes people choose justice. Sometimes, justice chooses you..."
|
||||
icon_state = "securitybelt"
|
||||
item_state = "security"
|
||||
storage_slots = 14
|
||||
max_w_class = 3
|
||||
max_combined_w_class = 28 // = 14 * 2
|
||||
origin_tech = "bluespace=4;syndicate=2"
|
||||
allow_quick_empty = 1
|
||||
can_hold = list()
|
||||
New()
|
||||
..()
|
||||
new /obj/item/clothing/mask/gas/owl_mask(src)
|
||||
new /obj/item/clothing/under/owl(src)
|
||||
new /obj/item/weapon/grenade/smokebomb(src)
|
||||
new /obj/item/weapon/grenade/smokebomb(src)
|
||||
new /obj/item/device/detective_scanner(src)
|
||||
|
||||
|
||||
|
||||
// As a last resort, the belt can be used as a plastic explosive with a fixed timer (15 seconds). Naturally, you'll lose all your gear...
|
||||
// Of course, it could be worse. It could spawn a singularity!
|
||||
/obj/item/weapon/storage/belt/bluespace/owlman/afterattack(atom/target as obj|turf, mob/user as mob, flag)
|
||||
if (!flag)
|
||||
return
|
||||
if (istype(target, /turf/unsimulated) || istype(target, /turf/simulated/shuttle) || istype(target, /obj/item/weapon/storage) || istype(target, /obj/structure/table) || istype(target, /obj/structure/closet))
|
||||
return
|
||||
user << "Planting explosives..."
|
||||
user.visible_message("[user.name] is fiddling with their toolbelt.")
|
||||
if(ismob(target))
|
||||
user.attack_log += "\[[time_stamp()]\] <font color='red'> [user.real_name] tried planting [name] on [target:real_name] ([target:ckey])</font>"
|
||||
log_attack("<font color='red'> [user.real_name] ([user.ckey]) tried planting [name] on [target:real_name] ([target:ckey])</font>")
|
||||
user.visible_message("\red [user.name] is trying to strap a belt to [target.name]!")
|
||||
|
||||
|
||||
if(do_after(user, 50) && in_range(user, target))
|
||||
user.drop_item()
|
||||
target = target
|
||||
loc = null
|
||||
var/location
|
||||
if (isturf(target)) location = target
|
||||
if (ismob(target))
|
||||
target:attack_log += "\[[time_stamp()]\]<font color='orange'> Had the [name] planted on them by [user.real_name] ([user.ckey])</font>"
|
||||
user.visible_message("\red [user.name] finished planting an explosive on [target.name]!")
|
||||
target.overlays += image('icons/obj/assemblies.dmi', "plastic-explosive2")
|
||||
user << "You sacrifice your belt for the sake of justice. Timer counting down from 15."
|
||||
spawn(150)
|
||||
if(target)
|
||||
if(ismob(target) || isobj(target))
|
||||
location = target.loc // These things can move
|
||||
explosion(location, -1, -1, 2, 3)
|
||||
if (istype(target, /turf/simulated/wall)) target:dismantle_wall(1)
|
||||
else target.ex_act(1)
|
||||
if (isobj(target))
|
||||
if (target)
|
||||
del(target)
|
||||
if (src)
|
||||
del(src)
|
||||
/obj/item/weapon/storage/belt/bluespace/attack(mob/M as mob, mob/user as mob, def_zone)
|
||||
return
|
||||
|
||||
/obj/item/weapon/storage/belt/bluespace/admin
|
||||
name = "Admin's Tool-belt"
|
||||
desc = "Holds everything for those that run everything."
|
||||
icon_state = "soulstonebelt"
|
||||
item_state = "soulstonebelt"
|
||||
w_class = 10 // permit holding other storage items
|
||||
storage_slots = 28
|
||||
max_w_class = 10
|
||||
max_combined_w_class = 280
|
||||
can_hold = list()
|
||||
|
||||
New()
|
||||
..()
|
||||
new /obj/item/weapon/crowbar(src)
|
||||
new /obj/item/weapon/screwdriver(src)
|
||||
new /obj/item/weapon/weldingtool/hugetank(src)
|
||||
new /obj/item/weapon/wirecutters(src)
|
||||
new /obj/item/weapon/wrench(src)
|
||||
new /obj/item/device/multitool(src)
|
||||
new /obj/item/stack/cable_coil(src)
|
||||
|
||||
new /obj/item/weapon/handcuffs(src)
|
||||
new /obj/item/weapon/dnainjector/xraymut(src)
|
||||
new /obj/item/weapon/dnainjector/firemut(src)
|
||||
new /obj/item/weapon/dnainjector/telemut(src)
|
||||
new /obj/item/weapon/dnainjector/hulkmut(src)
|
||||
// new /obj/item/weapon/spellbook(src) // for smoke effects, door openings, etc
|
||||
// new /obj/item/weapon/magic/spellbook(src)
|
||||
|
||||
// new/obj/item/weapon/reagent_containers/hypospray/admin(src)
|
||||
|
||||
/obj/item/weapon/storage/belt/bluespace/sandbox
|
||||
name = "Sandbox Mode Toolbelt"
|
||||
desc = "Holds whatever, you can spawn your own damn stuff."
|
||||
w_class = 10 // permit holding other storage items
|
||||
storage_slots = 28
|
||||
max_w_class = 10
|
||||
max_combined_w_class = 280
|
||||
can_hold = list()
|
||||
|
||||
New()
|
||||
..()
|
||||
new /obj/item/weapon/crowbar(src)
|
||||
new /obj/item/weapon/screwdriver(src)
|
||||
new /obj/item/weapon/weldingtool/hugetank(src)
|
||||
new /obj/item/weapon/wirecutters(src)
|
||||
new /obj/item/weapon/wrench(src)
|
||||
new /obj/item/device/multitool(src)
|
||||
new /obj/item/stack/cable_coil(src)
|
||||
|
||||
new /obj/item/device/analyzer(src)
|
||||
new /obj/item/device/healthanalyzer(src)
|
||||
|
||||
Reference in New Issue
Block a user