Name: [active1.fields["name"]] \
ID: [active1.fields["id"]] \n \
- Sex: [active1.fields["sex"]] \n \
- Age: [active1.fields["age"]] \n \
+ Sex: [active1.fields["sex"]] \n"
+ if ((istype(src.active2, /datum/data/record) && data_core.medical.Find(src.active2)))
+ dat += "Gender identity: [active2.fields["id_gender"]] "
+ else
+ dat += "Gender identity: Unknown "
+ dat += "Age: [active1.fields["age"]] \n \
Fingerprint: [active1.fields["fingerprint"]] \n \
Physical Status: [active1.fields["p_stat"]] \n \
Mental Status: [active1.fields["m_stat"]]
| \
@@ -135,6 +139,7 @@
else
else
dat += text("{Log In}", src)
+ dat = jointext(dat,null)
user << browse(text("Medical Records[]", dat), "window=med_rec")
onclose(user, "med_rec")
return
@@ -249,10 +254,10 @@
src.active1.fields["fingerprint"] = t1
if("sex")
if (istype(src.active1, /datum/data/record))
- if (src.active1.fields["sex"] == "Male")
- src.active1.fields["sex"] = "Female"
- else
- src.active1.fields["sex"] = "Male"
+ src.active1.fields["sex"] = next_in_list(src.active1.fields["sex"], all_genders_text_list)
+ if("id_gender")
+ if (istype(src.active2, /datum/data/record))
+ src.active2.fields["id_gender"] = next_in_list(src.active2.fields["id_gender"], all_genders_text_list)
if("age")
if (istype(src.active1, /datum/data/record))
var/t1 = input("Please input age:", "Med. records", src.active1.fields["age"], null) as num
diff --git a/code/game/machinery/exonet_node.dm b/code/game/machinery/exonet_node.dm
index f826bbafff4..23206a73e71 100644
--- a/code/game/machinery/exonet_node.dm
+++ b/code/game/machinery/exonet_node.dm
@@ -18,7 +18,7 @@
// Proc: New()
// Parameters: None
// Description: Adds components to the machine for deconstruction.
-/obj/machinery/exonet_node/New()
+/obj/machinery/exonet_node/map/New()
..()
component_parts = list()
diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm
index 35f0cf6af0c..a264df51f29 100644
--- a/code/game/machinery/frame.dm
+++ b/code/game/machinery/frame.dm
@@ -13,10 +13,13 @@
var/list/req_component_names = null
var/list/alarms = list("firealarm", "airalarm", "intercom", "keycard")
- var/list/machines = list("machine", "photocopier", "fax", "microwave", "conveyor", "vending", "recharger", "wrecharger", "washing", "grinder")
- var/list/computers = list("computer", "holopad")
- var/list/displays = list("display", "guestpass", "newscaster", "atm")
- var/list/no_circuit = list("wrecharger", "recharger", "grinder","conveyor")
+ var/list/machines = list(
+ "machine", "photocopier", "fax", "microwave", "conveyor", "recharger", "wrecharger",
+ "washing", "grinder", "teleporter_hub", "teleporter_station", "medpod", "dna_analyzer",
+ "massdriver")
+ var/list/computers = list("computer", "holopad", "console")
+ var/list/displays = list("display", "guestpass", "newscaster", "atm", "request")
+ var/list/no_circuit = list("wrecharger", "recharger", "grinder", "conveyor", "massdriver")
/obj/structure/frame/proc/update_desc()
var/D
@@ -35,15 +38,16 @@
req_components[A] = circuit.req_components[A]
req_component_names = circuit.req_components.Copy()
for(var/A in req_components)
- var/cp = text2path(A)
- var/obj/ct = new cp() // have to quickly instantiate it get name
- req_component_names[A] = ct.name
+ var/obj/ct = A
+ req_component_names[A] = initial(ct.name)
/obj/structure/frame/New(var/loc, var/dir, var/building = 0, var/obj/item/frame/frame_type, mob/user as mob)
..()
if(building)
src.frame_type = frame_type
icon_state = "[frame_type]_0"
+ if(dir)
+ src.set_dir(dir)
if(frame_type in alarms)
if(loc)
@@ -69,7 +73,7 @@
if(loc)
src.loc = loc
- if(frame_type == "display" || frame_type == "atm")
+ if(frame_type == "display" || frame_type == "atm" || frame_type == "request")
pixel_x = (dir & 3)? 0 : (dir == 4 ? -32 : 32)
pixel_y = (dir & 3)? (dir == 1 ? -32 : 32) : 0
@@ -104,8 +108,8 @@
circuit = new /obj/item/weapon/circuitboard/grinder(src)
if(frame_type == "conveyor")
circuit = new /obj/item/weapon/circuitboard/conveyor(src)
- if(dir)
- src.set_dir(dir)
+ if(frame_type == "massdriver")
+ circuit = new /obj/item/weapon/circuitboard/mass_driver(src)
if(frame_type == "computer")
density = 1
@@ -214,12 +218,25 @@
if(component_check)
playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1)
var/obj/machinery/new_machine = new src.circuit.build_path(src.loc, src.dir)
- if(!new_machine.component_parts)
- for(var/obj/O in src.components)
- O.forceMove(null)
- new_machine.RefreshParts()
+ if(new_machine.component_parts)
+ new_machine.component_parts.Cut()
+ else
+ new_machine.component_parts = list()
src.circuit.construct(new_machine)
+
+ for(var/obj/O in src.components)
+ if(circuit.contain_parts)
+ O.loc = new_machine
+ else
+ O.loc = null
+ new_machine.component_parts += O
+
+ circuit.loc = null
+ new_machine.circuit = circuit
+
+ new_machine.RefreshParts()
+
new_machine.pixel_x = src.pixel_x
new_machine.pixel_y = src.pixel_y
qdel(src)
@@ -243,6 +260,7 @@
var/obj/machinery/B = new src.circuit.build_path ( src.loc )
B.pixel_x = src.pixel_x
B.pixel_y = src.pixel_y
+ B.set_dir(dir)
src.circuit.construct(B)
qdel(src)
return
@@ -253,6 +271,7 @@
var/obj/machinery/B = new src.circuit.build_path ( src.loc )
B.pixel_x = src.pixel_x
B.pixel_y = src.pixel_y
+ B.set_dir(dir)
src.circuit.construct(B)
qdel(src)
return
@@ -386,13 +405,13 @@
if(state == 3)
if(frame_type in machines)
for(var/I in req_components)
- if(istype(P, text2path(I)) && (req_components[I] > 0))
+ if(istype(P, I) && (req_components[I] > 0))
playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1)
- if(istype(P, /obj/item/stack))
- var/obj/item/stack/CP = P
+ if(istype(P, /obj/item/stack/cable_coil))
+ var/obj/item/stack/cable_coil/CP = P
if(CP.get_amount() > 1)
var/camt = min(CP.amount, req_components[I]) // amount of cable to take, idealy amount required, but limited by amount provided
- var/obj/item/stack/CC = new /obj/item/stack(src)
+ var/obj/item/stack/cable_coil/CC = new /obj/item/stack/cable_coil(src)
CC.amount = camt
CC.update_icon()
CP.use(camt)
@@ -400,6 +419,20 @@
req_components[I] -= camt
update_desc()
break
+
+ if(istype(P, /obj/item/stack/material/glass/reinforced))
+ var/obj/item/stack/material/glass/reinforced/CP = P
+ if(CP.get_amount() > 1)
+ var/camt = min(CP.amount, req_components[I]) // amount of cable to take, idealy amount required, but limited by amount provided
+ var/obj/item/stack/material/glass/reinforced/CC = new /obj/item/stack/material/glass/reinforced(src)
+ CC.amount = camt
+ CC.update_icon()
+ CP.use(camt)
+ components += CC
+ req_components[I] -= camt
+ update_desc()
+ break
+
user.drop_item()
P.forceMove(src)
components += P
diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm
index 1df586b809e..4ae639c039e 100644
--- a/code/game/machinery/iv_drip.dm
+++ b/code/game/machinery/iv_drip.dm
@@ -37,6 +37,8 @@
/obj/machinery/iv_drip/MouseDrop(over_object, src_location, over_location)
..()
+ if(!isliving(usr))
+ return
if(attached)
visible_message("[src.attached] is detached from \the [src]")
diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm
index e4b36b94027..7f82a34f1c1 100644
--- a/code/game/machinery/kitchen/microwave.dm
+++ b/code/game/machinery/kitchen/microwave.dm
@@ -1,4 +1,3 @@
-
/obj/machinery/microwave
name = "Microwave"
icon = 'icons/obj/kitchen.dmi'
@@ -31,6 +30,9 @@
reagents = new/datum/reagents(100)
reagents.my_atom = src
+/obj/machinery/microwave/map/New()
+ ..()
+ circuit = new circuit(src)
component_parts = list()
component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
component_parts += new /obj/item/weapon/stock_parts/motor(src)
@@ -114,7 +116,7 @@
user << "It's dirty!"
return 1
else if(is_type_in_list(O,acceptable_items))
- if (contents.len>=(max_n_of_items + component_parts.len)) //Adds component_parts to the maximum number of items.
+ if (contents.len>=(max_n_of_items + component_parts.len + 1)) //Adds component_parts to the maximum number of items. The 1 is from the circuit
user << "This [src] is full of ingredients, you cannot put more."
return 1
if(istype(O, /obj/item/stack) && O:get_amount() > 1) // This is bad, but I can't think of how to change it
@@ -177,7 +179,7 @@
var/list/items_counts = new
var/list/items_measures = new
var/list/items_measures_p = new
- for (var/obj/O in (contents-component_parts))
+ for (var/obj/O in ((contents - component_parts) - circuit))
var/display_name = O.name
if (istype(O,/obj/item/weapon/reagent_containers/food/snacks/egg))
items_measures[display_name] = "egg"
@@ -237,7 +239,7 @@
if(stat & (NOPOWER|BROKEN))
return
start()
- if (reagents.total_volume==0 && !(locate(/obj) in (contents-component_parts))) //dry run
+ if (reagents.total_volume==0 && !(locate(/obj) in ((contents - component_parts) - circuit))) //dry run
if (!wzhzhzh(10))
abort()
return
@@ -299,7 +301,7 @@
return 1
/obj/machinery/microwave/proc/has_extra_item()
- for (var/obj/O in (contents-component_parts))
+ for (var/obj/O in ((contents - component_parts) - circuit))
if ( \
!istype(O,/obj/item/weapon/reagent_containers/food) && \
!istype(O, /obj/item/weapon/grown) \
@@ -360,7 +362,7 @@
/obj/machinery/microwave/proc/fail()
var/obj/item/weapon/reagent_containers/food/snacks/badrecipe/ffuu = new(src)
var/amount = 0
- for (var/obj/O in (contents-ffuu)-component_parts)
+ for (var/obj/O in (((contents - ffuu) - component_parts) - circuit))
amount++
if (O.reagents)
var/id = O.reagents.get_master_reagent_id()
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 9ad2fd73eb1..3681d1e7980 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -286,8 +286,7 @@ Class Procs:
var/obj/item/weapon/circuitboard/CB = circuit
var/P
for(var/obj/item/weapon/stock_parts/A in component_parts)
- for(var/D in CB.req_components)
- var/T = text2path(D)
+ for(var/T in CB.req_components)
if(ispath(A.type, T))
P = T
break
@@ -328,14 +327,14 @@ Class Procs:
/obj/machinery/proc/dismantle()
playsound(loc, 'sound/items/Crowbar.ogg', 50, 1)
var/obj/structure/frame/A = new /obj/structure/frame( src.loc )
- var/obj/item/weapon/circuitboard/M = new circuit( A )
+ var/obj/item/weapon/circuitboard/M = circuit
A.circuit = M
A.anchored = 1
A.density = 1
A.frame_type = M.board_type
if(A.frame_type in A.no_circuit)
A.need_circuit = 0
- for (var/obj/D in src)
+ for (var/obj/D in src.component_parts)
D.forceMove(loc)
if(A.components)
A.components.Cut()
@@ -344,10 +343,12 @@ Class Procs:
component_parts = list()
A.icon_state = "[A.frame_type]_3"
A.state = 3
+ A.dir = dir
A.pixel_x = pixel_x
A.pixel_y = pixel_y
A.check_components()
A.update_desc()
+ M.loc = null
M.deconstruct(src)
qdel(src)
return 1
diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm
index abd98091760..f94427bf3aa 100644
--- a/code/game/machinery/mass_driver.dm
+++ b/code/game/machinery/mass_driver.dm
@@ -9,12 +9,41 @@
use_power = 1
idle_power_usage = 2
active_power_usage = 50
+ circuit = /obj/item/weapon/circuitboard/mass_driver
var/power = 1.0
var/code = 1.0
var/id = 1.0
var/drive_range = 50 //this is mostly irrelevant since current mass drivers throw into space, but you could make a lower-range mass driver for interstation transport or something I guess.
+/obj/machinery/mass_driver/map/New()
+ ..()
+ circuit = new circuit(src)
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/motor(src)
+ component_parts += new /obj/item/weapon/stock_parts/motor(src)
+ component_parts += new /obj/item/weapon/stock_parts/gear(src)
+ component_parts += new /obj/item/weapon/stock_parts/gear(src)
+ component_parts += new /obj/item/weapon/stock_parts/spring(src)
+ component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
+ component_parts += new /obj/item/stack/cable_coil(src, 5)
+ RefreshParts()
+
+/obj/machinery/mass_driver/attackby(var/obj/item/I, mob/user)
+ if(default_deconstruction_screwdriver(user, I))
+ return
+ if(default_deconstruction_crowbar(user, I))
+ return
+
+ if(istype(I, /obj/item/device/multitool))
+ if(panel_open)
+ var/input = sanitize(input(usr, "What id would you like to give this conveyor?", "Multitool-Conveyor interface", id))
+ if(!input)
+ usr << "No input found please hang up and try your call again."
+ return
+ id = input
+ return
+ return
/obj/machinery/mass_driver/proc/drive(amount)
if(stat & (BROKEN|NOPOWER))
diff --git a/code/game/machinery/recharger.dm b/code/game/machinery/recharger.dm
index 95c62a8ccdb..77aed2300fa 100644
--- a/code/game/machinery/recharger.dm
+++ b/code/game/machinery/recharger.dm
@@ -15,9 +15,9 @@ obj/machinery/recharger
var/icon_state_idle = "recharger0" //also when unpowered
var/portable = 1
circuit = /obj/item/weapon/circuitboard/recharger
- frame_type = "recharger"
-obj/machinery/recharger/New()
+obj/machinery/recharger/map/New()
+ circuit = new circuit(src)
component_parts = list()
component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
component_parts += new /obj/item/stack/cable_coil(src, 5)
@@ -171,4 +171,13 @@ obj/machinery/recharger/wallcharger
icon_state_idle = "wrecharger0"
portable = 0
circuit = /obj/item/weapon/circuitboard/recharger/wrecharger
- frame_type = "wrecharger"
\ No newline at end of file
+ frame_type = "wrecharger"
+
+obj/machinery/recharger/wallcharger/map/New()
+ circuit = new circuit(src)
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
+ component_parts += new /obj/item/stack/cable_coil(src, 5)
+ RefreshParts()
+ ..()
+ return
\ No newline at end of file
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index c3759100fb3..204f48e0d68 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -22,9 +22,9 @@
var/weld_power_use = 2300 // power used per point of brute damage repaired. 2.3 kW ~ about the same power usage of a handheld arc welder
var/wire_power_use = 500 // power used per point of burn damage repaired.
-/obj/machinery/recharge_station/New()
+/obj/machinery/recharge_station/map/New()
..()
-
+ circuit = new circuit(src)
component_parts = list()
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
component_parts += new /obj/item/weapon/stock_parts/manipulator(src)
diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm
index 7e2d5216985..fc39af88f7a 100644
--- a/code/game/machinery/requests_console.dm
+++ b/code/game/machinery/requests_console.dm
@@ -28,6 +28,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
anchored = 1
icon = 'icons/obj/terminals.dmi'
icon_state = "req_comp0"
+ circuit = /obj/item/weapon/circuitboard/request
var/department = "Unknown" //The list of all departments on the station (Determined from this variable on each unit) Set this to the same thing if you want several consoles in one department
var/list/message_log = list() //List of all messages
var/departmentType = 0 //Bitflag. Zero is reply-only. Map currently uses raw numbers instead of defines.
@@ -79,7 +80,7 @@ var/list/obj/machinery/requests_console/allConsoles = list()
req_console_supplies |= department
if (departmentType & RC_INFO)
req_console_information |= department
-
+
set_light(1)
/obj/machinery/requests_console/Destroy()
@@ -199,27 +200,29 @@ var/list/obj/machinery/requests_console/allConsoles = list()
//err... hacking code, which has no reason for existing... but anyway... it was once supposed to unlock priority 3 messanging on that console (EXTREME priority...), but the code for that was removed.
/obj/machinery/requests_console/attackby(var/obj/item/weapon/O as obj, var/mob/user as mob)
- /*
- if (istype(O, /obj/item/weapon/crowbar))
- if(open)
- open = 0
- icon_state="req_comp0"
- else
- open = 1
- if(hackState == 0)
- icon_state="req_comp_open"
- else if(hackState == 1)
- icon_state="req_comp_rewired"
- if (istype(O, /obj/item/weapon/screwdriver))
- if(open)
- if(hackState == 0)
- hackState = 1
- icon_state="req_comp_rewired"
- else if(hackState == 1)
- hackState = 0
- icon_state="req_comp_open"
- else
- user << "You can't do much with that."*/
+ if(default_deconstruction_screwdriver(user, O))
+ return
+ if(default_deconstruction_crowbar(user, O))
+ return
+ if(istype(O, /obj/item/device/multitool))
+ if(panel_open)
+ var/input = sanitize(input(usr, "What Department id would you like to give this Request Console?", "Multitool-Request Console interface", department))
+ if(!input)
+ usr << "No input found please hang up and try your call again."
+ return
+ department = input
+ announcement.title = "[department] announcement"
+ announcement.newscast = 1
+
+ name = "[department] Requests Console"
+ allConsoles += src
+ if (departmentType & RC_ASSIST)
+ req_console_assistance |= department
+ if (departmentType & RC_SUPPLY)
+ req_console_supplies |= department
+ if (departmentType & RC_INFO)
+ req_console_information |= department
+ return
if (istype(O, /obj/item/weapon/card/id))
if(inoperable(MAINT)) return
diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm
index b107dcc42d9..13ff75e0713 100644
--- a/code/game/machinery/teleporter.dm
+++ b/code/game/machinery/teleporter.dm
@@ -170,6 +170,7 @@
use_power = 1
idle_power_usage = 10
active_power_usage = 2000
+ circuit = /obj/item/weapon/circuitboard/teleporter_hub
var/obj/machinery/computer/teleporter/com
@@ -178,6 +179,21 @@
underlays.Cut()
underlays += image('icons/obj/stationobjs.dmi', icon_state = "tele-wires")
+/obj/machinery/teleport/hub/map/New()
+ ..()
+ circuit = new circuit(src)
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
+ component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
+ component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
+ component_parts += new /obj/item/weapon/stock_parts/scanning_module(src)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
+ component_parts += new /obj/item/weapon/stock_parts/micro_laser(src)
+ component_parts += new /obj/item/stack/cable_coil(src, 10)
+ RefreshParts()
+
/obj/machinery/teleport/hub/Bumped(M as mob|obj)
spawn()
if (src.icon_state == "tele1")
@@ -307,6 +323,7 @@
use_power = 1
idle_power_usage = 10
active_power_usage = 2000
+ circuit = /obj/item/weapon/circuitboard/teleporter_station
var/obj/machinery/teleport/hub/com
/obj/machinery/teleport/station/New()
@@ -314,6 +331,16 @@
overlays.Cut()
overlays += image('icons/obj/stationobjs.dmi', icon_state = "controller-wires")
+/obj/machinery/teleport/station/map/New()
+ ..()
+ circuit = new circuit(src)
+ component_parts = list()
+ component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
+ component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
+ component_parts += new /obj/item/weapon/stock_parts/capacitor(src)
+ component_parts += new /obj/item/stack/cable_coil(src, 10)
+ RefreshParts()
+
/obj/machinery/teleport/station/attackby(var/obj/item/weapon/W)
src.attack_hand()
diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm
index fdc5786a499..fd0996e2bc9 100644
--- a/code/game/machinery/vending.dm
+++ b/code/game/machinery/vending.dm
@@ -4,12 +4,14 @@
/datum/data/vending_product
var/product_name = "generic" // Display name for the product
var/product_path = null
- var/amount = 0 // Amount held in the vending machine
- var/price = 0 // Price to buy one
- var/display_color = null // Display color for vending machine listing
+ var/amount = 0 // The original amount held in the vending machine
+ var/list/instances
+ var/price = 0 // Price to buy one
+ var/display_color = null // Display color for vending machine listing
var/category = CAT_NORMAL // CAT_HIDDEN for contraband, CAT_COIN for premium
+ var/vending_machine // The vending machine we belong to
-/datum/data/vending_product/New(var/path, var/name = null, var/amount = 1, var/price = 0, var/color = null, var/category = CAT_NORMAL)
+/datum/data/vending_product/New(var/vending_machine, var/path, var/name = null, var/amount = 1, var/price = 0, var/color = null, var/category = CAT_NORMAL)
..()
src.product_path = path
@@ -24,6 +26,43 @@
src.price = price
src.display_color = color
src.category = category
+ src.vending_machine = vending_machine
+
+/datum/data/vending_product/Destroy()
+ vending_machine = null
+ if(instances)
+ for(var/product in instances)
+ qdel(product)
+ instances.Cut()
+ . = ..()
+
+/datum/data/vending_product/proc/get_amount()
+ return instances ? instances.len : amount
+
+/datum/data/vending_product/proc/add_product(var/atom/movable/product)
+ if(product.type != product_path)
+ return 0
+ init_products()
+ product.forceMove(vending_machine)
+ instances += product
+
+/datum/data/vending_product/proc/get_product(var/product_location)
+ if(!get_amount() || !product_location)
+ return
+ init_products()
+
+ var/atom/movable/product = instances[instances.len] // Remove the last added product
+ instances -= product
+ product.forceMove(product_location)
+ return product
+
+/datum/data/vending_product/proc/init_products()
+ if(instances)
+ return
+ instances = list()
+ for(var/i = 1 to amount)
+ var/new_product = new product_path(vending_machine)
+ instances += new_product
/**
* A vending machine
@@ -36,8 +75,6 @@
layer = 2.9
anchored = 1
density = 1
- circuit = /obj/item/weapon/circuitboard/vending
- frame_type = "vending"
var/icon_vend //Icon_state when vending
var/icon_deny //Icon_state when denying access
@@ -96,14 +133,6 @@
/obj/machinery/vending/New()
..()
wires = new(src)
- component_parts = list()
- component_parts += new /obj/item/weapon/stock_parts/spring(src)
- component_parts += new /obj/item/weapon/stock_parts/spring(src)
- component_parts += new /obj/item/weapon/stock_parts/motor(src)
- component_parts += new /obj/item/weapon/stock_parts/motor(src)
- component_parts += new /obj/item/weapon/stock_parts/console_screen(src)
- component_parts += new /obj/item/stack/material/glass/reinforced(src, 2)
- RefreshParts()
spawn(4)
if(src.product_slogans)
src.slogan_list += splittext(src.product_slogans, ";")
@@ -140,7 +169,7 @@
var/category = current_list[2]
for(var/entry in current_list[1])
- var/datum/data/vending_product/product = new/datum/data/vending_product(entry)
+ var/datum/data/vending_product/product = new/datum/data/vending_product(src, entry)
product.price = (entry in src.prices) ? src.prices[entry] : 0
product.amount = (current_list[1][entry]) ? current_list[1][entry] : 1
@@ -153,6 +182,9 @@
wires = null
qdel(coin)
coin = null
+ for(var/datum/data/vending_product/R in product_records)
+ qdel(R)
+ product_records = null
return ..()
/obj/machinery/vending/ex_act(severity)
@@ -224,7 +256,7 @@
return
else if(istype(W, /obj/item/weapon/coin) && premium.len > 0)
user.drop_item()
- W.loc = src
+ W.forceMove(src)
coin = W
categories |= CAT_COIN
user << "You insert \the [W] into \the [src]."
@@ -242,9 +274,6 @@
user << "You [anchored? "un" : ""]secured \the [src]!"
anchored = !anchored
return
- else if(default_deconstruction_crowbar(user, W))
- return
-
else
for(var/datum/data/vending_product/R in product_records)
@@ -423,7 +452,7 @@
"name" = I.product_name,
"price" = I.price,
"color" = I.display_color,
- "amount" = I.amount)))
+ "amount" = I.get_amount())))
data["products"] = listed_products
@@ -453,10 +482,10 @@
usr << "There is no coin in this machine."
return
- coin.loc = src.loc
+ coin.forceMove(src.loc)
if(!usr.get_active_hand())
usr.put_in_hands(coin)
- usr << "You remove the [coin] from the [src]"
+ usr << "You remove \the [coin] from \the [src]"
coin = null
categories &= ~CAT_COIN
@@ -517,13 +546,13 @@
else
user << "You weren't able to pull the coin out fast enough, the machine ate it, string and all."
qdel(coin)
+ coin = null
categories &= ~CAT_COIN
else
qdel(coin)
+ coin = null
categories &= ~CAT_COIN
- R.amount--
-
if(((src.last_reply + (src.vend_delay + 200)) <= world.time) && src.vend_reply)
spawn(0)
src.speak(src.vend_reply)
@@ -533,16 +562,31 @@
if (src.icon_vend) //Show the vending animation if needed
flick(src.icon_vend,src)
spawn(src.vend_delay)
- new R.product_path(get_turf(src))
+ R.get_product(get_turf(src))
+ if(prob(1))
+ sleep(3)
+ if(R.get_product(get_turf(src)))
+ src.visible_message("\The [src] clunks as it vends an additional item.")
+
src.status_message = ""
src.status_error = 0
src.vend_ready = 1
currently_vending = null
nanomanager.update_uis(src)
-/obj/machinery/vending/proc/stock(var/datum/data/vending_product/R, var/mob/user)
- user << "You insert \the [src] in the product receptor."
- R.amount++
+
+/**
+ * Add item to the machine
+ *
+ * Checks if item is vendable in this machine should be performed before
+ * calling. W is the item being inserted, R is the associated vending_product entry.
+ */
+/obj/machinery/vending/proc/stock(obj/item/weapon/W, var/datum/data/vending_product/R, var/mob/user)
+ if(!user.unEquip(W))
+ return
+
+ user << "You insert \the [W] in the product receptor."
+ R.add_product(W)
nanomanager.update_uis(src)
@@ -592,15 +636,8 @@
//Oh no we're malfunctioning! Dump out some product and break.
/obj/machinery/vending/proc/malfunction()
for(var/datum/data/vending_product/R in src.product_records)
- if (R.amount <= 0) //Try to use a record that actually has something to dump.
- continue
- var/dump_path = R.product_path
- if (!dump_path)
- continue
-
- while(R.amount>0)
- new dump_path(src.loc)
- R.amount--
+ while(R.get_amount()>0)
+ R.get_product(loc)
break
stat |= BROKEN
@@ -615,20 +652,15 @@
return 0
for(var/datum/data/vending_product/R in src.product_records)
- if (R.amount <= 0) //Try to use a record that actually has something to dump.
+ throw_item = R.get_product(loc)
+ if (!throw_item)
continue
- var/dump_path = R.product_path
- if (!dump_path)
- continue
-
- R.amount--
- throw_item = new dump_path(src.loc)
break
if (!throw_item)
return 0
spawn(0)
throw_item.throw_at(target, 16, 3, src)
- src.visible_message("[src] launches [throw_item.name] at [target.name]!")
+ src.visible_message("\The [src] launches \a [throw_item] at \the [target]!")
return 1
/*
@@ -656,7 +688,7 @@
icon = 'icons/obj/objects.dmi'
icon_state = "dispenser"
product_paths = "/obj/item/weapon/tank/oxygen;/obj/item/weapon/tank/phoron;/obj/item/weapon/tank/emergency_oxygen;/obj/item/weapon/tank/emergency_oxygen/engi;/obj/item/clothing/mask/breath"
- product_amounts = "10;10;10;5;25"
+ productamounts = "10;10;10;5;25"
vend_delay = 0
*/
@@ -882,7 +914,7 @@
for(var/entry in current_list[1])
var/obj/item/seeds/S = new entry(src)
var/name = S.name
- var/datum/data/vending_product/product = new/datum/data/vending_product(entry, name)
+ var/datum/data/vending_product/product = new/datum/data/vending_product(src, entry, name)
product.price = (entry in src.prices) ? src.prices[entry] : 0
product.amount = (current_list[1][entry]) ? current_list[1][entry] : 1
@@ -905,8 +937,26 @@
desc = "A kitchen and restaurant equipment vendor."
product_ads = "Mm, food stuffs!;Food and food accessories.;Get your plates!;You like forks?;I like forks.;Woo, utensils.;You don't really need these..."
icon_state = "dinnerware"
- products = list(/obj/item/weapon/tray = 8,/obj/item/weapon/material/kitchen/utensil/fork = 6, /obj/item/weapon/material/kitchen/utensil/knife = 6, /obj/item/weapon/material/kitchen/utensil/spoon = 6, /obj/item/weapon/material/knife = 3,/obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,/obj/item/clothing/suit/chef/classic = 2)
- contraband = list(/obj/item/weapon/material/kitchen/rollingpin = 2, /obj/item/weapon/material/knife/butch = 2)
+ products = list(
+ /obj/item/weapon/tray = 8,
+ /obj/item/weapon/material/kitchen/utensil/fork = 6,
+ /obj/item/weapon/material/kitchen/utensil/knife = 6,
+ /obj/item/weapon/material/kitchen/utensil/spoon = 6,
+ /obj/item/weapon/material/knife = 3,
+ /obj/item/weapon/reagent_containers/food/drinks/drinkingglass = 8,
+ /obj/item/clothing/suit/chef/classic = 2,
+ /obj/item/weapon/storage/toolbox/lunchbox = 3,
+ /obj/item/weapon/storage/toolbox/lunchbox/heart = 3,
+ /obj/item/weapon/storage/toolbox/lunchbox/cat = 3,
+ /obj/item/weapon/storage/toolbox/lunchbox/nt = 3,
+ /obj/item/weapon/storage/toolbox/lunchbox/mars = 3,
+ /obj/item/weapon/storage/toolbox/lunchbox/cti = 3,
+ /obj/item/weapon/storage/toolbox/lunchbox/nymph = 3,
+ /obj/item/weapon/storage/toolbox/lunchbox/syndicate = 3)
+
+
+ contraband = list(/obj/item/weapon/material/kitchen/rollingpin = 2,
+ /obj/item/weapon/material/knife/butch = 2)
/obj/machinery/vending/sovietsoda
name = "BODA"
@@ -924,8 +974,10 @@
icon_deny = "tool-deny"
//req_access = list(access_maint_tunnels) //Maintenance access
products = list(/obj/item/stack/cable_coil/random = 10,/obj/item/weapon/crowbar = 5,/obj/item/weapon/weldingtool = 3,/obj/item/weapon/wirecutters = 5,
- /obj/item/weapon/wrench = 5,/obj/item/device/analyzer = 5,/obj/item/device/t_scanner = 5,/obj/item/weapon/screwdriver = 5)
- contraband = list(/obj/item/weapon/weldingtool/hugetank = 2,/obj/item/clothing/gloves/fyellow = 2)
+ /obj/item/weapon/wrench = 5,/obj/item/device/analyzer = 5,/obj/item/device/t_scanner = 5,/obj/item/weapon/screwdriver = 5,
+ /obj/item/device/flashlight/glowstick = 3, /obj/item/device/flashlight/glowstick/red = 3, /obj/item/device/flashlight/glowstick/blue = 3,
+ /obj/item/device/flashlight/glowstick/orange =3, /obj/item/device/flashlight/glowstick/yellow = 3)
+ contraband = list(/obj/item/weapon/weldingtool/hugetank = 2,/obj/item/clothing/gloves/fyellow = 2, )
premium = list(/obj/item/clothing/gloves/yellow = 1)
/obj/machinery/vending/engivend
@@ -939,12 +991,15 @@
/obj/item/weapon/circuitboard/airalarm = 10,/obj/item/weapon/circuitboard/firealarm = 10,/obj/item/weapon/circuitboard/status_display = 2,
/obj/item/weapon/circuitboard/ai_status_display = 2,/obj/item/weapon/circuitboard/newscaster = 2,/obj/item/weapon/circuitboard/holopad = 2,
/obj/item/weapon/circuitboard/intercom = 4,/obj/item/weapon/circuitboard/security/telescreen/entertainment = 4,
- /obj/item/weapon/circuitboard/atm = 0,/obj/item/weapon/circuitboard/guestpass = 0,/obj/item/weapon/circuitboard/keycard_auth = 0,
- /obj/item/weapon/circuitboard/photocopier = 0,/obj/item/weapon/circuitboard/fax = 0,/obj/item/weapon/circuitboard/conveyor = 0,
- /obj/item/weapon/circuitboard/microwave = 0,/obj/item/weapon/circuitboard/vending = 0,/obj/item/weapon/circuitboard/washing = 0,
- /obj/item/weapon/stock_parts/motor = 0,/obj/item/weapon/stock_parts/spring = 0,/obj/item/weapon/stock_parts/gear = 0)
+ /obj/item/weapon/stock_parts/motor = 2,/obj/item/weapon/stock_parts/spring = 2,/obj/item/weapon/stock_parts/gear = 2,
+ /obj/item/weapon/circuitboard/atm,/obj/item/weapon/circuitboard/guestpass,/obj/item/weapon/circuitboard/keycard_auth,
+ /obj/item/weapon/circuitboard/photocopier,/obj/item/weapon/circuitboard/fax,/obj/item/weapon/circuitboard/request,
+ /obj/item/weapon/circuitboard/microwave,/obj/item/weapon/circuitboard/washing,/obj/item/weapon/circuitboard/scanner_console,
+ /obj/item/weapon/circuitboard/sleeper_console,/obj/item/weapon/circuitboard/body_scanner,/obj/item/weapon/circuitboard/sleeper,
+ /obj/item/weapon/circuitboard/dna_analyzer)
contraband = list(/obj/item/weapon/cell/potato = 3)
premium = list(/obj/item/weapon/storage/belt/utility = 3)
+ product_records = list()
//This one's from bay12
/obj/machinery/vending/engineering
diff --git a/code/game/machinery/wall_frames.dm b/code/game/machinery/wall_frames.dm
index fd0fd3ce7c2..701d4ebab23 100644
--- a/code/game/machinery/wall_frames.dm
+++ b/code/game/machinery/wall_frames.dm
@@ -22,11 +22,12 @@
if(!build_machine_type)
return
- var/ndir
if(!frame_type)
var/response = input(usr, "What kind of frame would you like to make?", "Frame type request", null) in list("Computer", "Machine", "Holopad", "Conveyor",
- "Photocopier", "Fax", "Microwave", "Vending Machine",
+ "Photocopier", "Fax", "Microwave",
"Recharger", "Washing Machine", "Grinder",
+ "Medical Console", "Medical Pod", "DNA Analyzer",
+ "Mass Driver",
"Cancel")
if(response == "Cancel")
@@ -37,22 +38,29 @@
switch(response)
if("Holopad")
new /obj/item/stack/material/steel( usr.loc, 1 ) //holopads are smaller, they only need 4 sheets
- if("Conveyor")
- ndir = get_dir(src,usr)
- if (!(ndir in cardinal))
- return
if("Fax")
new /obj/item/stack/material/steel( usr.loc, 2 ) //faxes are smaller, they only need 3 sheets
if("Microwave")
new /obj/item/stack/material/steel( usr.loc, 1 ) //microwaves are smaller, they only need 4 sheets
- if("Vending Machine")
- frame_type = "vending"
if("Recharger")
new /obj/item/stack/material/steel( usr.loc, 2 ) //rechargers are smaller, they only need 3 sheets
if("Washing Machine")
frame_type = "washing"
if("Grinder")
new /obj/item/stack/material/steel( usr.loc, 2 ) //grinders are smaller, they only need 3 sheets
+ if("Medical Console")
+ frame_type = "console"
+ if("Medical Pod")
+ frame_type = "medpod"
+ if("DNA Analyzer")
+ frame_type = "dna_analyzer"
+ if("Mass Driver")
+ frame_type = "massdriver"
+
+ var/ndir
+ ndir = usr.dir
+ if (!(ndir in cardinal))
+ return
var/obj/machinery/M = new build_machine_type(get_turf(src.loc), ndir, 1, frame_type)
M.fingerprints = src.fingerprints
@@ -64,7 +72,7 @@
if(!frame_type)
var/response = input(usr, "What kind of frame would you like to make?", "Frame type request", null) in list("Fire Alarm", "Air Alarm", "Display", "Newscaster",
"ATM", "Guest Pass Console", "Intercom", "Keycard Authenticator",
- "Wall Charger",
+ "Wall Charger", "Supply Request Console",
"Cancel")
if(response == "Cancel")
@@ -92,6 +100,8 @@
if("Wall Charger")
frame_type = "wrecharger"
new /obj/item/stack/material/steel( usr.loc, 2 ) //wall rechargers are smaller, they only need 3 sheets
+ if("Supply Request Console")
+ frame_type = "request"
if(!build_machine_type)
return
diff --git a/code/game/machinery/washing_machine.dm b/code/game/machinery/washing_machine.dm
index 830a848bfe7..4babe5cd1b7 100644
--- a/code/game/machinery/washing_machine.dm
+++ b/code/game/machinery/washing_machine.dm
@@ -21,7 +21,8 @@
var/obj/crayon
var/list/washing = list()
-/obj/machinery/washing_machine/New()
+/obj/machinery/washing_machine/map/New()
+ circuit = new circuit(src)
component_parts = list()
component_parts += new /obj/item/weapon/stock_parts/motor(src)
component_parts += new /obj/item/weapon/stock_parts/gear(src)
diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm
index 586ba9b721e..fcb52986a49 100644
--- a/code/game/objects/effects/effect_system.dm
+++ b/code/game/objects/effects/effect_system.dm
@@ -193,16 +193,14 @@ steam.start() -- spawns the effect
affect(M)
/obj/effect/effect/smoke/proc/affect(var/mob/living/carbon/M)
- if (istype(M))
+ if (!istype(M))
return 0
- if (M.internal != null)
- if(M.wear_mask && (M.wear_mask.item_flags & AIRTIGHT))
+ if(M.wear_mask && (M.wear_mask.item_flags & AIRTIGHT))
+ return 0
+ if(istype(M,/mob/living/carbon/human))
+ var/mob/living/carbon/human/H = M
+ if(H.head && (H.head.item_flags & AIRTIGHT))
return 0
- if(istype(M,/mob/living/carbon/human))
- var/mob/living/carbon/human/H = M
- if(H.head && (H.head.item_flags & AIRTIGHT))
- return 0
- return 0
return 1
/////////////////////////////////////////////
@@ -225,7 +223,8 @@ steam.start() -- spawns the effect
/////////////////////////////////////////////
/obj/effect/effect/smoke/bad
- time_to_live = 200
+ time_to_live = 600
+ //var/list/projectiles
/obj/effect/effect/smoke/bad/Move()
..()
@@ -235,70 +234,25 @@ steam.start() -- spawns the effect
/obj/effect/effect/smoke/bad/affect(var/mob/living/carbon/M)
if (!..())
return 0
- M.drop_item()
M.adjustOxyLoss(1)
- if (M.coughedtime != 1)
- M.coughedtime = 1
+ if(prob(25))
M.emote("cough")
- spawn ( 20 )
- M.coughedtime = 0
-/obj/effect/effect/smoke/bad/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)
- if(air_group || (height==0)) return 1
- if(istype(mover, /obj/item/projectile/beam))
- var/obj/item/projectile/beam/B = mover
- B.damage = (B.damage/2)
+/* Not feasile until a later date
+/obj/effect/effect/smoke/bad/Crossed(atom/movable/M as mob|obj)
+ ..()
+ if(istype(M, /obj/item/projectile/beam))
+ var/obj/item/projectile/beam/B = M
+ if(!(B in projectiles))
+ B.damage = (B.damage/2)
+ projectiles += B
+ destroyed_event.register(B, src, /obj/effect/effect/smoke/bad/proc/on_projectile_delete)
+ world << "Damage is: [B.damage]"
return 1
-/////////////////////////////////////////////
-// Sleep smoke
-/////////////////////////////////////////////
-/obj/effect/effect/smoke/sleepy
-
-/obj/effect/effect/smoke/sleepy/Move()
- ..()
- for(var/mob/living/carbon/M in get_turf(src))
- affect(M)
-
-/obj/effect/effect/smoke/sleepy/affect(mob/living/carbon/M as mob )
- if (!..())
- return 0
-
- M.drop_item()
- M:sleeping += 1
- if (M.coughedtime != 1)
- M.coughedtime = 1
- M.emote("cough")
- spawn ( 20 )
- M.coughedtime = 0
-/////////////////////////////////////////////
-// Mustard Gas
-/////////////////////////////////////////////
-
-
-/obj/effect/effect/smoke/mustard
- name = "mustard gas"
- icon_state = "mustard"
-
-/obj/effect/effect/smoke/mustard/Move()
- ..()
- for(var/mob/living/carbon/human/R in get_turf(src))
- affect(R)
-
-/obj/effect/effect/smoke/mustard/affect(var/mob/living/carbon/human/R)
- if (!..())
- return 0
- if (R.wear_suit != null)
- return 0
-
- R.burn_skin(0.75)
- if (R.coughedtime != 1)
- R.coughedtime = 1
- R.emote("gasp")
- spawn (20)
- R.coughedtime = 0
- R.updatehealth()
- return
+/obj/effect/effect/smoke/bad/proc/on_projectile_delete(obj/item/projectile/beam/proj)
+ projectiles -= proj
+*/
/////////////////////////////////////////////
// Smoke spread
@@ -321,7 +275,7 @@ steam.start() -- spawns the effect
if(direct)
direction = direct
-/datum/effect/effect/system/smoke_spread/start()
+/datum/effect/effect/system/smoke_spread/start(var/I)
var/i = 0
for(i=0, i 20)
@@ -331,6 +285,7 @@ steam.start() -- spawns the effect
src.location = get_turf(holder)
var/obj/effect/effect/smoke/smoke = PoolOrNew(smoke_type, src.location)
src.total_smoke++
+ smoke.color = I
var/direction = src.direction
if(!direction)
if(src.cardinals)
@@ -348,14 +303,6 @@ steam.start() -- spawns the effect
/datum/effect/effect/system/smoke_spread/bad
smoke_type = /obj/effect/effect/smoke/bad
-/datum/effect/effect/system/smoke_spread/sleepy
- smoke_type = /obj/effect/effect/smoke/sleepy
-
-
-/datum/effect/effect/system/smoke_spread/mustard
- smoke_type = /obj/effect/effect/smoke/mustard
-
-
/////////////////////////////////////////////
//////// Attach an Ion trail to any object, that spawns when it moves (like for the jetpack)
/// just pass in the object to attach it to in set_up
@@ -507,9 +454,9 @@ steam.start() -- spawns the effect
M << "The solution violently explodes."
explosion(
- location,
- round(min(devst, BOMBCAP_DVSTN_RADIUS)),
- round(min(heavy, BOMBCAP_HEAVY_RADIUS)),
- round(min(light, BOMBCAP_LIGHT_RADIUS)),
+ location,
+ round(min(devst, BOMBCAP_DVSTN_RADIUS)),
+ round(min(heavy, BOMBCAP_HEAVY_RADIUS)),
+ round(min(light, BOMBCAP_LIGHT_RADIUS)),
round(min(flash, BOMBCAP_FLASH_RADIUS))
)
diff --git a/code/game/objects/items/bodybag.dm b/code/game/objects/items/bodybag.dm
index 3a6d55ca7d0..88b513e06e7 100644
--- a/code/game/objects/items/bodybag.dm
+++ b/code/game/objects/items/bodybag.dm
@@ -86,6 +86,17 @@
qdel(src)
return
+/obj/structure/closet/body_bag/proc/get_occupants()
+ var/list/occupants = list()
+ for(var/mob/living/carbon/human/H in contents)
+ occupants += H
+ return occupants
+
+/obj/structure/closet/body_bag/proc/update(var/broadcast=0)
+ if(istype(loc, /obj/structure/morgue))
+ var/obj/structure/morgue/M = loc
+ M.update(broadcast)
+
/obj/structure/closet/body_bag/update_icon()
if(opened)
icon_state = icon_opened
diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm
index c7f90e97468..83ac8851ddf 100644
--- a/code/game/objects/items/devices/flashlight.dm
+++ b/code/game/objects/items/devices/flashlight.dm
@@ -199,7 +199,7 @@
src.force = on_damage
src.damtype = "fire"
processing_objects += src
-
+
/obj/item/device/flashlight/flare/proc/ignite() //Used for flare launchers.
on = !on
update_icon()
@@ -208,6 +208,76 @@
processing_objects += src
return 1
+//Glowsticks
+
+/obj/item/device/flashlight/glowstick
+ name = "green glowstick"
+ desc = "A green military-grade glowstick."
+ w_class = 2.0
+ brightness_on = 4
+ light_power = 2
+ light_color = "#49F37C"
+ icon_state = "glowstick"
+ item_state = "glowstick"
+ var/fuel = 0
+
+/obj/item/device/flashlight/glowstick/New()
+ fuel = rand(1600, 2000)
+ ..()
+
+/obj/item/device/flashlight/glowstick/process()
+ fuel = max(fuel - 1, 0)
+ if(!fuel || !on)
+ turn_off()
+ if(!fuel)
+ src.icon_state = "[initial(icon_state)]-empty"
+ processing_objects -= src
+
+/obj/item/device/flashlight/glowstick/proc/turn_off()
+ on = 0
+ update_icon()
+
+/obj/item/device/flashlight/glowstick/attack_self(mob/user)
+
+ if(!fuel)
+ user << "The glowstick has already been turned on."
+ return
+ if(on)
+ return
+
+ . = ..()
+ if(.)
+ user.visible_message("[user] cracks and shakes the glowstick.", "You crack and shake the glowstick, turning it on!")
+ processing_objects += src
+
+/obj/item/device/flashlight/glowstick/red
+ name = "red glowstick"
+ desc = "A red military-grade glowstick."
+ light_color = "#FC0F29"
+ icon_state = "glowstick_red"
+ item_state = "glowstick_red"
+
+/obj/item/device/flashlight/glowstick/blue
+ name = "blue glowstick"
+ desc = "A blue military-grade glowstick."
+ light_color = "#599DFF"
+ icon_state = "glowstick_blue"
+ item_state = "glowstick_blue"
+
+/obj/item/device/flashlight/glowstick/orange
+ name = "orange glowstick"
+ desc = "A orange military-grade glowstick."
+ light_color = "#FA7C0B"
+ icon_state = "glowstick_orange"
+ item_state = "glowstick_orange"
+
+/obj/item/device/flashlight/glowstick/yellow
+ name = "yellow glowstick"
+ desc = "A yellow military-grade glowstick."
+ light_color = "#FEF923"
+ icon_state = "glowstick_yellow"
+ item_state = "glowstick_yellow"
+
/obj/item/device/flashlight/slime
gender = PLURAL
name = "glowing slime extract"
diff --git a/code/game/objects/items/devices/locker_painter.dm b/code/game/objects/items/devices/locker_painter.dm
new file mode 100644
index 00000000000..567e2963482
--- /dev/null
+++ b/code/game/objects/items/devices/locker_painter.dm
@@ -0,0 +1,140 @@
+/obj/item/device/closet_painter
+ name = "closet painter"
+ icon = 'icons/obj/bureaucracy.dmi'
+ icon_state = "labeler1"
+ item_state = "flight"
+
+ var/colour = "plain"
+ var/colour_secure = "plain"
+
+ var/list/colours = list(
+ "plain" = list("open" = "open", "closed" = "closed"),
+ "blue" = list("open" = "open", "closed" = "blue"),
+ "mixed" = list("open" = "open", "closed" = "mixed"),
+ "grey" = list("open" = "open", "closed" = "grey"),
+ "green" = list("open" = "open", "closed" = "green"),
+ "orange" = list("open" = "open", "closed" = "orange"),
+ "pink" = list("open" = "open", "closed" = "pink"),
+ "red" = list("open" = "open", "closed" = "red"),
+ "white" = list("open" = "open", "closed" = "white"),
+ "yellow" = list("open" = "open", "closed" = "yellow"),
+ "black" = list("open" = "open", "closed" = "black"),
+ "bio" = list("open" = "bioopen", "closed" = "bio"),
+ "bio-virology" = list("open" = "bio_virologyopen", "closed" = "bio_virology"),
+ "bio-security" = list("open" = "bio_securityopen", "closed" = "bio_security"),
+ "bio-janitor" = list("open" = "bio_janitoropen", "closed" = "bio_janitor"),
+ "bio-scientist" = list("open" = "bio_scientistopen", "closed" = "bio_scientist"),
+ "bombsuit" = list("open" = "bombsuitopen", "closed" = "bombsuit"),
+ "bombsuit-security" = list("open" = "bombsuitsecopen", "closed" = "bombsuitsec"),
+ "full-red" = list("open" = "syndicateopen", "closed" = "syndicate"),
+ "full-green" = list("open" = "syndicate1open", "closed" = "syndicate1"),
+ "full-purple" = list("open" = "aclosetopen", "closed" = "acloset"),
+ "mining" = list("open" = "miningopen", "closed" = "mining"),
+ "emergency" = list("open" = "emergencyopen", "closed" = "emergency"),
+ "fire" = list("open" = "fireclosetopen", "closed" = "firecloset"),
+ "tool" = list("open" = "toolclosetopen", "closed" = "toolcloset"),
+ "radiation" = list("open" = "toolclosetopen", "closed" = "radsuitcloset")
+ )
+
+ var/list/colours_secure = list(
+ "plain" = list("open" = "open", "closed" = "secure", "locked" = "secure1", "broken" = "securebroken", "off" = "secureoff"),
+ "medical-red" = list("open" = "medicalopen", "closed" = "medical", "locked" = "medical1", "broken" = "medicalbroken", "off" = "medicaloff"),
+ "medical-green" = list("open" = "securemedopen", "closed" = "securemed", "locked" = "securemed1", "broken" = "securemedbroken", "off" = "securemedoff"),
+ "CMO" = list("open" = "cmosecureopen", "closed" = "cmosecure", "locked" = "cmosecure1", "broken" = "cmosecurebroken", "off" = "cmosecureoff"),
+ "cargo" = list("open" = "securecargoopen", "closed" = "securecargo", "locked" = "securecargo1", "broken" = "securecargobroken", "off" = "securecargooff"),
+ "mining" = list("open" = "miningsecopen", "closed" = "miningsec", "locked" = "miningsec1", "broken" = "miningsecbroken", "off" = "miningsecoff"),
+ "QM" = list("open" = "secureqmopen", "closed" = "secureqm", "locked" = "secureqm1", "broken" = "secureqmbroken", "off" = "secureqmoff"),
+ "hydroponics" = list("open" = "hydrosecureopen", "closed" = "hydrosecure", "locked" = "hydrosecure1", "broken" = "hydrosecurebroken", "off" = "hydrosecureoff"),
+ "atmospherics" = list("open" = "secureatmopen", "closed" = "secureatm", "locked" = "secureatm1", "broken" = "secureatmbroken", "off" = "secureatmoff"),
+ "engineer" = list("open" = "secureengopen", "closed" = "secureeng", "locked" = "secureeng1", "broken" = "secureengbroken", "off" = "secureengoff"),
+ "CE" = list("open" = "secureceopen", "closed" = "securece", "locked" = "securece1", "broken" = "securecebroken", "off" = "secureceoff"),
+ "electrical" = list("open" = "toolclosetopen", "closed" = "secureengelec", "locked" = "secureengelec1", "broken" = "secureengelecbroken", "off" = "secureengelecoff"),
+ "welding" = list("open" = "toolclosetopen", "closed" = "secureengweld", "locked" = "secureengweld1", "broken" = "secureengweldbroken", "off" = "secureengweldoff"),
+ "research" = list("open" = "secureresopen", "closed" = "secureres", "locked" = "secureres1", "broken" = "secureresbroken", "off" = "secureresoff"),
+ "RD" = list("open" = "rdsecureopen", "closed" = "rdsecure", "locked" = "rdsecure1", "broken" = "rdsecurebroken", "off" = "rdsecureoff"),
+ "security" = list("open" = "secopen", "closed" = "sec", "locked" = "sec1", "broken" = "secbroken", "off" = "secoff"),
+ "warden" = list("open" = "wardensecureopen", "closed" = "wardensecure", "locked" = "wardensecure1", "broken" = "wardensecurebroken", "off" = "wardensecureoff"),
+ "HoS" = list("open" = "hossecureopen", "closed" = "hossecure", "locked" = "hossecure1", "broken" = "hossecurebroken", "off" = "hossecureoff"),
+ "HoP" = list("open" = "hopsecureopen", "closed" = "hopsecure", "locked" = "hopsecure1", "broken" = "hopsecurebroken", "off" = "hopsecureoff"),
+ "Captain" = list("open" = "capsecureopen", "closed" = "capsecure", "locked" = "capsecure1", "broken" = "capsecurebroken", "off" = "capsecureoff")
+ )
+
+/obj/item/device/closet_painter/afterattack(atom/A, var/mob/user, proximity)
+ if(!proximity)
+ return
+
+ if(!istype(A,/obj/structure/closet))
+ user << "\The [src] can only be used on closets."
+ return
+
+ var/config_error
+
+ if(istype(A,/obj/structure/closet/secure_closet))
+ var/obj/structure/closet/secure_closet/F = A
+ if(F.broken)
+ user << "\The [src] cannot paint broken closets."
+ return
+
+ var/list/colour_data = colours_secure[colour_secure]
+ if(!islist(colour_data))
+ config_error = 1
+ if(!config_error)
+ F.icon_opened = colour_data["open"]
+ F.icon_closed = colour_data["closed"]
+ F.icon_locked = colour_data["locked"]
+ F.icon_broken = colour_data["broken"]
+ F.icon_off = colour_data["off"]
+ F.update_icon()
+
+ else
+ var/obj/structure/closet/F = A
+ var/list/colour_data = colours[colour]
+ if(!islist(colour_data))
+ config_error = 1
+ if(!config_error)
+ F.icon_opened = colour_data["open"]
+ F.icon_closed = colour_data["closed"]
+ F.update_icon()
+
+ if(config_error)
+ user << "\The [src] flashes an error light. You might need to reconfigure it."
+ return
+
+/obj/item/device/closet_painter/attack_self(var/mob/user)
+ var/choice = input("Do you wish to change the regular closet colour or the secure closet colour?") as null|anything in list("Regular Closet Colour","Secure Closet Colour")
+ if(choice == "Regular Closet Colour")
+ choose_colour()
+ else if(choice == "Secure Closet Colour")
+ choose_colour_secure()
+
+/obj/item/device/closet_painter/examine(mob/user)
+ ..(user)
+ user << "It is configured to produce the '[colour]' paint scheme or the '[colour_secure]' secure closet paint scheme."
+
+/obj/item/device/closet_painter/verb/choose_colour()
+ set name = "Choose Colour"
+ set desc = "Choose a regular closet painter colour."
+ set category = "Object"
+ set src in usr
+
+ if(usr.incapacitated())
+ return
+
+ var/new_colour = input("Select a colour.") as null|anything in colours
+ if(new_colour && !isnull(colours[new_colour]))
+ colour = new_colour
+ usr << "You set \the [src] regular closet colour to '[colour]'."
+
+/obj/item/device/closet_painter/verb/choose_colour_secure()
+ set name = "Choose Secure Colour"
+ set desc = "Choose a secure closet painter colour."
+ set category = "Object"
+ set src in usr
+
+ if(usr.incapacitated())
+ return
+
+ var/new_colour_secure = input("Select a colour.") as null|anything in colours_secure
+ if(new_colour_secure && !isnull(colours_secure[new_colour_secure]))
+ colour_secure = new_colour_secure
+ usr << "You set \the [src] secure closet colour to '[colour_secure]'."
\ No newline at end of file
diff --git a/code/game/objects/items/devices/suit_cooling.dm b/code/game/objects/items/devices/suit_cooling.dm
index 37ceba94459..c8b66fe38f3 100644
--- a/code/game/objects/items/devices/suit_cooling.dm
+++ b/code/game/objects/items/devices/suit_cooling.dm
@@ -31,7 +31,7 @@
/obj/item/device/suit_cooling_unit/New()
processing_objects |= src
- cell = new/obj/item/weapon/cell() //comes with the crappy default power cell - high-capacity ones shouldn't be hard to find
+ cell = new/obj/item/weapon/cell/high() //comes not with the crappy default power cell - because this is dedicated EVA equipment
cell.loc = src
/obj/item/device/suit_cooling_unit/process()
diff --git a/code/game/objects/items/devices/uplink_items.dm b/code/game/objects/items/devices/uplink_items.dm
index 3c4ecc3e19d..bc9666990b5 100644
--- a/code/game/objects/items/devices/uplink_items.dm
+++ b/code/game/objects/items/devices/uplink_items.dm
@@ -155,6 +155,10 @@ datum/uplink_item/dd_SortValue()
name = "9mm"
path = /obj/item/ammo_magazine/mc9mm
+/datum/uplink_item/item/ammo/c45m
+ name = ".45"
+ path = /obj/item/ammo_magazine/c45m
+
/datum/uplink_item/item/ammo/darts
name = "Darts"
path = /obj/item/ammo_magazine/chemdart
@@ -163,6 +167,14 @@ datum/uplink_item/dd_SortValue()
name = "14.5mm"
path = /obj/item/weapon/storage/box/sniperammo
+/datum/uplink_item/item/ammo/a556
+ name = "5.56mm"
+ path = /obj/item/ammo_magazine/a556
+
+/datum/uplink_item/item/ammo/a556/ap
+ name = "5.56mm AP"
+ path = /obj/item/ammo_magazine/a556/ap
+
/datum/uplink_item/item/ammo/a10mm
name = "10mm"
path = /obj/item/ammo_magazine/a10mm
@@ -171,6 +183,23 @@ datum/uplink_item/dd_SortValue()
name = "7.62mm"
path = /obj/item/ammo_magazine/a762
+/datum/uplink_item/item/ammo/a762/ap
+ name = "7.62mm AP"
+ path = /obj/item/ammo_magazine/a762/ap
+
+/datum/uplink_item/item/ammo/g12
+ name = "12 gauge"
+ path = /obj/item/ammo_magazine/g12
+
+/datum/uplink_item/item/ammo/g12/beanbag
+ name = "12 gauge beanbag"
+ path = /obj/item/ammo_magazine/g12/beanbag
+ item_cost = 1 // Discount due to it being LTL.
+
+/datum/uplink_item/item/ammo/g12/pellet
+ name = "12 gauge pellet"
+ path = /obj/item/ammo_magazine/g12/pellet
+
/***************************************
* Highly Visible and Dangerous Weapons *
***************************************/
@@ -192,10 +221,10 @@ datum/uplink_item/dd_SortValue()
item_cost = 5
path = /obj/item/weapon/gun/energy/crossbow
-/datum/uplink_item/item/visible_weapons/g9mm
- name = "Silenced 9mm"
+/datum/uplink_item/item/visible_weapons/silenced_45
+ name = "Silenced .45"
item_cost = 5
- path = /obj/item/weapon/storage/box/syndie_kit/g9mm
+ path = /obj/item/weapon/gun/projectile/silenced
/datum/uplink_item/item/visible_weapons/riggedlaser
name = "Exosuit Rigged Laser"
@@ -223,6 +252,36 @@ datum/uplink_item/dd_SortValue()
item_cost = 7
path = /obj/item/weapon/gun/projectile/automatic/sts35
+/datum/uplink_item/item/visible_weapons/combatshotgun
+ name = "Combat Shotgun"
+ item_cost = 7
+ path = /obj/item/weapon/gun/projectile/shotgun/pump/combat
+
+/datum/uplink_item/item/visible_weapons/egun
+ name = "Energy Gun"
+ item_cost = 5
+ path = /obj/item/weapon/gun/energy/gun
+
+/datum/uplink_item/item/visible_weapons/lasercannon
+ name = "Laser Cannon"
+ item_cost = 6
+ path = /obj/item/weapon/gun/energy/lasercannon
+
+/datum/uplink_item/item/visible_weapons/lasercarbine
+ name = "Laser Carbine"
+ item_cost = 7
+ path = /obj/item/weapon/gun/energy/laser
+
+/datum/uplink_item/item/visible_weapons/ionrifle
+ name = "Ion Rifle"
+ item_cost = 5
+ path = /obj/item/weapon/gun/energy/ionrifle
+
+/datum/uplink_item/item/visible_weapons/xray
+ name = "Xray Gun"
+ item_cost = 7
+ path = /obj/item/weapon/gun/energy/xray
+
/*************************************
* Stealthy and Inconspicuous Weapons *
*************************************/
@@ -387,10 +446,6 @@ datum/uplink_item/dd_SortValue()
item_cost = 20
path = /obj/item/weapon/circuitboard/teleporter
-/datum/uplink_item/item/tools/teleporter/New()
- ..()
- antag_roles = list(MODE_MERCENARY)
-
/datum/uplink_item/item/tools/money
name = "Operations Funding"
item_cost = 3
@@ -573,7 +628,6 @@ datum/uplink_item/dd_SortValue()
/datum/uplink_item/item/badassery/surplus/New()
..()
- antag_roles = list(MODE_MERCENARY)
desc = "A crate containing [item_worth] telecrystal\s worth of surplus leftovers."
/datum/uplink_item/item/badassery/surplus/get_goods(var/obj/item/device/uplink/U, var/loc)
@@ -622,7 +676,6 @@ var/image/default_abstract_uplink_icon
..()
name = "[command_name()] Update Announcement"
desc = "Causes a falsified [command_name()] Update. Triggers immediately after supplying additional data."
- antag_roles = list(MODE_MERCENARY)
/datum/uplink_item/abstract/announcements/fake_centcom/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user, var/list/args)
command_announcement.Announce(args.["message"], args.["title"])
@@ -633,10 +686,6 @@ var/image/default_abstract_uplink_icon
desc = "Creates a fake crew arrival announcement as well as fake crew records, using your current appearance (including held items!) and worn id card. Trigger with care!"
item_cost = 4
-/datum/uplink_item/abstract/announcements/fake_crew_arrival/New()
- ..()
- antag_roles = list(MODE_MERCENARY)
-
/datum/uplink_item/abstract/announcements/fake_crew_arrival/get_goods(var/obj/item/device/uplink/U, var/loc, var/mob/user, var/list/args)
if(!user)
return 0
diff --git a/code/game/objects/items/devices/uplink_random_lists.dm b/code/game/objects/items/devices/uplink_random_lists.dm
index 4359918ceea..70cca951051 100644
--- a/code/game/objects/items/devices/uplink_random_lists.dm
+++ b/code/game/objects/items/devices/uplink_random_lists.dm
@@ -38,7 +38,7 @@ var/datum/uplink_random_selection/default_uplink_selection = new/datum/uplink_ra
/datum/uplink_random_selection/default/New()
..()
- items += new/datum/uplink_random_item(/datum/uplink_item/item/visible_weapons/g9mm)
+ items += new/datum/uplink_random_item(/datum/uplink_item/item/visible_weapons/silenced_45)
items += new/datum/uplink_random_item(/datum/uplink_item/item/ammo/mc9mm)
items += new/datum/uplink_random_item(/datum/uplink_item/item/visible_weapons/revolver)
items += new/datum/uplink_random_item(/datum/uplink_item/item/ammo/a357)
diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm
index 451b2c41af1..c55fd587c0b 100644
--- a/code/game/objects/items/stacks/medical.dm
+++ b/code/game/objects/items/stacks/medical.dm
@@ -2,8 +2,8 @@
name = "medical pack"
singular_name = "medical pack"
icon = 'icons/obj/items.dmi'
- amount = 5
- max_amount = 5
+ amount = 10
+ max_amount = 10
w_class = 2
throw_speed = 4
throw_range = 20
@@ -65,24 +65,43 @@
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open == 0)
- if(!affecting.bandage())
+ if(affecting.is_bandaged())
user << "The wounds on [M]'s [affecting.name] have already been bandaged."
return 1
else
+ user.visible_message("\The [user] starts treating [M]'s [affecting.name].", \
+ "You start treating [M]'s [affecting.name]." )
+ var/used = 0
for (var/datum/wound/W in affecting.wounds)
if (W.internal)
continue
+ if(W.bandaged)
+ continue
+ if(used == amount)
+ break
+ if(!do_mob(user, M, W.damage/5))
+ user << "You must stand still to bandage wounds."
+ break
+
if (W.current_stage <= W.max_bleeding_stage)
- user.visible_message("\The [user] bandages [W.desc] on [M]'s [affecting.name].", \
- "You bandage [W.desc] on [M]'s [affecting.name]." )
+ user.visible_message("\The [user] bandages \a [W.desc] on [M]'s [affecting.name].", \
+ "You bandage \a [W.desc] on [M]'s [affecting.name]." )
//H.add_side_effect("Itch")
- else if (istype(W,/datum/wound/bruise))
- user.visible_message("\The [user] places a bruise patch over [W.desc] on [M]'s [affecting.name].", \
- "You place a bruise patch over [W.desc] on [M]'s [affecting.name]." )
+ else if (W.damage_type == BRUISE)
+ user.visible_message("\The [user] places a bruise patch over \a [W.desc] on [M]'s [affecting.name].", \
+ "You place a bruise patch over \a [W.desc] on [M]'s [affecting.name]." )
else
- user.visible_message("\The [user] places a bandaid over [W.desc] on [M]'s [affecting.name].", \
- "You place a bandaid over [W.desc] on [M]'s [affecting.name]." )
- use(1)
+ user.visible_message("\The [user] places a bandaid over \a [W.desc] on [M]'s [affecting.name].", \
+ "You place a bandaid over \a [W.desc] on [M]'s [affecting.name]." )
+ W.bandage()
+ used++
+ affecting.update_damages()
+ if(used == amount)
+ if(affecting.is_bandaged())
+ user << "\The [src] is used up."
+ else
+ user << "\The [src] is used up, but there are more wounds to treat on \the [affecting.name]."
+ use(used)
else
if (can_operate(H)) //Checks if mob is lying down on table for surgery
if (do_surgery(H,user,src))
@@ -108,13 +127,19 @@
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open == 0)
- if(!affecting.salve())
+ if(affecting.is_salved())
user << "The wounds on [M]'s [affecting.name] have already been salved."
return 1
else
- user.visible_message("[user] salves wounds on [M]'s [affecting.name].", \
- "You salve wounds on [M]'s [affecting.name]." )
+ user.visible_message("\The [user] starts salving wounds on [M]'s [affecting.name].", \
+ "You start salving the wounds on [M]'s [affecting.name]." )
+ if(!do_mob(user, M, 10))
+ user << "You must stand still to salve wounds."
+ return 1
+ user.visible_message("[user] salved wounds on [M]'s [affecting.name].", \
+ "You salved wounds on [M]'s [affecting.name]." )
use(1)
+ affecting.salve()
else
if (can_operate(H)) //Checks if mob is lying down on table for surgery
if (do_surgery(H,user,src))
@@ -127,7 +152,7 @@
singular_name = "advanced trauma kit"
desc = "An advanced trauma kit for severe injuries."
icon_state = "traumakit"
- heal_brute = 12
+ heal_brute = 0
origin_tech = list(TECH_BIO = 1)
/obj/item/stack/medical/advanced/bruise_pack/attack(mob/living/carbon/M as mob, mob/user as mob)
@@ -139,29 +164,43 @@
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open == 0)
- var/bandaged = affecting.bandage()
- var/disinfected = affecting.disinfect()
-
- if(!(bandaged || disinfected))
+ if(affecting.is_bandaged() && affecting.is_disinfected())
user << "The wounds on [M]'s [affecting.name] have already been treated."
return 1
else
+ user.visible_message("\The [user] starts treating [M]'s [affecting.name].", \
+ "You start treating [M]'s [affecting.name]." )
+ var/used = 0
for (var/datum/wound/W in affecting.wounds)
if (W.internal)
continue
+ if (W.bandaged && W.disinfected)
+ continue
+ if(used == amount)
+ break
+ if(!do_mob(user, M, W.damage/5))
+ user << "You must stand still to bandage wounds."
+ break
if (W.current_stage <= W.max_bleeding_stage)
- user.visible_message("\The [user] cleans [W.desc] on [M]'s [affecting.name] and seals the edges with bioglue.", \
- "You clean and seal [W.desc] on [M]'s [affecting.name]." )
- //H.add_side_effect("Itch")
- else if (istype(W,/datum/wound/bruise))
- user.visible_message("\The [user] places a medical patch over [W.desc] on [M]'s [affecting.name].", \
- "You place a medical patch over [W.desc] on [M]'s [affecting.name]." )
+ user.visible_message("\The [user] cleans \a [W.desc] on [M]'s [affecting.name] and seals the edges with bioglue.", \
+ "You clean and seal \a [W.desc] on [M]'s [affecting.name]." )
+ else if (W.damage_type == BRUISE)
+ user.visible_message("\The [user] places a medical patch over \a [W.desc] on [M]'s [affecting.name].", \
+ "You place a medical patch over \a [W.desc] on [M]'s [affecting.name]." )
else
- user.visible_message("\The [user] smears some bioglue over [W.desc] on [M]'s [affecting.name].", \
- "You smear some bioglue over [W.desc] on [M]'s [affecting.name]." )
- if (bandaged)
- affecting.heal_damage(heal_brute,0)
- use(1)
+ user.visible_message("\The [user] smears some bioglue over \a [W.desc] on [M]'s [affecting.name].", \
+ "You smear some bioglue over \a [W.desc] on [M]'s [affecting.name]." )
+ W.bandage()
+ W.disinfect()
+ W.heal_damage(heal_brute)
+ used++
+ affecting.update_damages()
+ if(used == amount)
+ if(affecting.is_bandaged())
+ user << "\The [src] is used up."
+ else
+ user << "\The [src] is used up, but there are more wounds to treat on \the [affecting.name]."
+ use(used)
else
if (can_operate(H)) //Checks if mob is lying down on table for surgery
if (do_surgery(H,user,src))
@@ -174,7 +213,7 @@
singular_name = "advanced burn kit"
desc = "An advanced treatment kit for severe burns."
icon_state = "burnkit"
- heal_burn = 12
+ heal_burn = 0
origin_tech = list(TECH_BIO = 1)
@@ -187,14 +226,20 @@
var/obj/item/organ/external/affecting = H.get_organ(user.zone_sel.selecting)
if(affecting.open == 0)
- if(!affecting.salve())
+ if(affecting.is_salved())
user << "The wounds on [M]'s [affecting.name] have already been salved."
return 1
else
+ user.visible_message("\The [user] starts salving wounds on [M]'s [affecting.name].", \
+ "You start salving the wounds on [M]'s [affecting.name]." )
+ if(!do_mob(user, M, 10))
+ user << "You must stand still to salve wounds."
+ return 1
user.visible_message( "[user] covers wounds on [M]'s [affecting.name] with regenerative membrane.", \
"You cover wounds on [M]'s [affecting.name] with regenerative membrane." )
affecting.heal_damage(0,heal_burn)
use(1)
+ affecting.salve()
else
if (can_operate(H)) //Checks if mob is lying down on table for surgery
if (do_surgery(H,user,src))
diff --git a/code/game/objects/items/weapons/cards_ids.dm b/code/game/objects/items/weapons/cards_ids.dm
index 17e9d35ab95..6d1a2eaa3dc 100644
--- a/code/game/objects/items/weapons/cards_ids.dm
+++ b/code/game/objects/items/weapons/cards_ids.dm
@@ -68,6 +68,7 @@
icon_state = "emag"
item_state = "card-id"
origin_tech = list(TECH_MAGNET = 2, TECH_ILLEGAL = 2)
+ var/default_uses = 10
var/uses = 10
/obj/item/weapon/card/emag/resolve_attackby(atom/A, mob/user)
@@ -87,6 +88,12 @@
qdel(src)
return 1
+/obj/item/weapon/card/emag/attackby(obj/item/O as obj, mob/user as mob)
+ if(istype(O, /obj/item/device/telecrystal))
+ src.uses += default_uses/2 //Adds half the default amount of uses which is more than you get per TC when buying, as to balance the utility of having multiple emags vs one heavily usable one
+ usr << "You add \the [O] to \the [src]. Increasing the uses of \the [src] to [uses]."
+ qdel(O)
+
/obj/item/weapon/card/id
name = "identification card"
diff --git a/code/game/objects/items/weapons/circuitboards/frame.dm b/code/game/objects/items/weapons/circuitboards/frame.dm
index 30be1d52f7b..3acb2de7558 100644
--- a/code/game/objects/items/weapons/circuitboards/frame.dm
+++ b/code/game/objects/items/weapons/circuitboards/frame.dm
@@ -36,6 +36,12 @@
board_type = "atm"
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+/obj/item/weapon/circuitboard/request
+ name = T_BOARD("reques console")
+ build_path = /obj/machinery/requests_console
+ board_type = "request"
+ matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+
//Alarm
/obj/item/weapon/circuitboard/firealarm
@@ -70,6 +76,18 @@
board_type = "holopad"
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
+/obj/item/weapon/circuitboard/scanner_console
+ name = T_BOARD("body scanner console")
+ build_path = /obj/machinery/body_scanconsole
+ board_type = "console"
+ origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2)
+
+/obj/item/weapon/circuitboard/sleeper_console
+ name = T_BOARD("sleeper console")
+ build_path = /obj/machinery/sleep_console
+ board_type = "console"
+ origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2)
+
//Machine
/obj/item/weapon/circuitboard/photocopier
@@ -78,10 +96,10 @@
board_type = "photocopier"
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
req_components = list(
- "/obj/item/weapon/stock_parts/scanning_module" = 1,
- "/obj/item/weapon/stock_parts/motor" = 1,
- "/obj/item/weapon/stock_parts/micro_laser" = 1,
- "/obj/item/weapon/stock_parts/matter_bin" = 1)
+ /obj/item/weapon/stock_parts/scanning_module = 1,
+ /obj/item/weapon/stock_parts/motor = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/matter_bin = 1)
/obj/item/weapon/circuitboard/fax
name = T_BOARD("fax")
@@ -89,19 +107,19 @@
board_type = "fax"
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
req_components = list(
- "/obj/item/weapon/stock_parts/scanning_module" = 1,
- "/obj/item/weapon/stock_parts/motor" = 1,
- "/obj/item/weapon/stock_parts/micro_laser" = 1,
- "/obj/item/weapon/stock_parts/matter_bin" = 1)
+ /obj/item/weapon/stock_parts/scanning_module = 1,
+ /obj/item/weapon/stock_parts/motor = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/matter_bin = 1)
/obj/item/weapon/circuitboard/conveyor
name = T_BOARD("conveyor")
build_path = /obj/machinery/conveyor
board_type = "conveyor"
req_components = list(
- "/obj/item/weapon/stock_parts/gear" = 2,
- "/obj/item/weapon/stock_parts/motor" = 2,
- "/obj/item/stack/cable_coil" = 5)
+ /obj/item/weapon/stock_parts/gear = 2,
+ /obj/item/weapon/stock_parts/motor = 2,
+ /obj/item/stack/cable_coil = 5)
/obj/item/weapon/circuitboard/microwave
name = T_BOARD("microwave")
@@ -109,29 +127,17 @@
board_type = "microwave"
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
req_components = list(
- "/obj/item/weapon/stock_parts/console_screen" = 1,
- "/obj/item/weapon/stock_parts/motor" = 1,
- "/obj/item/weapon/stock_parts/capacitor" = 1)
-
-/obj/item/weapon/circuitboard/vending
- name = T_BOARD("vending")
- build_path = /obj/machinery/vending
- board_type = "vending"
- matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
- req_components = list(
- "/obj/item/weapon/stock_parts/console_screen" = 1,
- "/obj/item/weapon/stock_parts/motor" = 2,
- "/obj/item/weapon/stock_parts/spring" = 2,
- "/obj/item/stack/material/glass/reinforced" = 2)
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/weapon/stock_parts/motor = 1,
+ /obj/item/weapon/stock_parts/capacitor = 1)
/obj/item/weapon/circuitboard/recharger
name = T_BOARD("recharger")
build_path = /obj/machinery/recharger
board_type = "recharger"
- matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
req_components = list(
- "/obj/item/weapon/stock_parts/capacitor" = 1,
- "/obj/item/stack/cable_coil" = 5)
+ /obj/item/weapon/stock_parts/capacitor = 1,
+ /obj/item/stack/cable_coil = 5)
/obj/item/weapon/circuitboard/recharger/wrecharger
name = T_BOARD("wall recharger")
@@ -144,18 +150,78 @@
board_type = "washing"
matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
req_components = list(
- "/obj/item/weapon/stock_parts/motor" = 1,
- "/obj/item/weapon/stock_parts/gear" = 2)
+ /obj/item/weapon/stock_parts/motor = 1,
+ /obj/item/weapon/stock_parts/gear = 2)
/obj/item/weapon/circuitboard/grinder
name = T_BOARD("reagent grinder")
build_path = /obj/machinery/reagentgrinder
board_type = "grinder"
- matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50)
req_components = list(
- "/obj/item/weapon/stock_parts/motor" = 1,
- "/obj/item/weapon/stock_parts/gear" = 1,
- "/obj/item/weapon/reagent_containers/glass/beaker/large" = 1)
+ /obj/item/weapon/stock_parts/motor = 1,
+ /obj/item/weapon/stock_parts/gear = 1,
+ /obj/item/weapon/reagent_containers/glass/beaker/large = 1)
+
+/obj/item/weapon/circuitboard/teleporter_hub
+ name = T_BOARD("teleporter hub")
+ build_path = /obj/machinery/teleport/hub
+ board_type = "teleporter_hub"
+// origin_tech = list(TECH_DATA = 2, TECH_BLUESPACE = 4)
+ req_components = list(
+ /obj/item/weapon/stock_parts/scanning_module = 4,
+ /obj/item/weapon/stock_parts/micro_laser = 4,
+ /obj/item/stack/cable_coil = 10)
+
+/obj/item/weapon/circuitboard/teleporter_station
+ name = T_BOARD("teleporter station")
+ build_path = /obj/machinery/teleport/station
+ board_type = "teleporter_station"
+// origin_tech = list(TECH_DATA = 2, TECH_BLUESPACE = 3)
+ req_components = list(
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/weapon/stock_parts/capacitor = 2,
+ /obj/item/stack/cable_coil = 10)
+
+/obj/item/weapon/circuitboard/body_scanner
+ name = T_BOARD("body scanner")
+ build_path = /obj/machinery/bodyscanner
+ board_type = "medpod"
+ origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2)
+ req_components = list(
+ /obj/item/weapon/stock_parts/scanning_module = 3,
+ /obj/item/stack/material/glass/reinforced = 2)
+
+/obj/item/weapon/circuitboard/sleeper
+ name = T_BOARD("sleeper")
+ build_path = /obj/machinery/sleeper
+ board_type = "medpod"
+ origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 2)
+ req_components = list(
+ /obj/item/weapon/stock_parts/scanning_module = 1,
+ /obj/item/weapon/reagent_containers/glass/beaker = 3,
+ /obj/item/weapon/reagent_containers/syringe = 3,
+ /obj/item/stack/material/glass/reinforced = 2)
+
+/obj/item/weapon/circuitboard/dna_analyzer
+ name = T_BOARD("dna analyzer")
+ build_path = /obj/machinery/dnaforensics
+ board_type = "dna_analyzer"
+ origin_tech = list(TECH_MAGNET = 4, TECH_BIO = 2, TECH_DATA = 2)
+ req_components = list(
+ /obj/item/weapon/stock_parts/scanning_module = 2,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
+
+/obj/item/weapon/circuitboard/mass_driver
+ name = T_BOARD("mass driver")
+ build_path = /obj/machinery/mass_driver
+ board_type = "massdriver"
+ req_components = list(
+ /obj/item/weapon/stock_parts/gear = 2,
+ /obj/item/weapon/stock_parts/motor = 2,
+ /obj/item/weapon/stock_parts/capacitor = 1,
+ /obj/item/weapon/stock_parts/spring = 1,
+ /obj/item/stack/cable_coil = 5)
//for testing - If this is still in when I commit, someone shoot me. --leaving in for now, shouldn't be able to get these on station anyways.
/obj/item/weapon/storage/box/frame_parts
@@ -175,7 +241,6 @@
new /obj/item/weapon/circuitboard/photocopier( src )
new /obj/item/weapon/circuitboard/fax( src )
new /obj/item/weapon/circuitboard/microwave( src )
- new /obj/item/weapon/circuitboard/vending( src )
new /obj/item/weapon/circuitboard/washing( src )
new /obj/item/weapon/stock_parts/scanning_module( src )
new /obj/item/weapon/stock_parts/motor( src )
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm b/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm
index 65949ae338b..716e763515c 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/biogenerator.dm
@@ -1,5 +1,5 @@
#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
+#error T_BOARD macro is not defined but we need it!
#endif
/obj/item/weapon/circuitboard/biogenerator
@@ -8,5 +8,5 @@
board_type = "machine"
origin_tech = list(TECH_DATA = 2)
req_components = list(
- "/obj/item/weapon/stock_parts/matter_bin" = 1,
- "/obj/item/weapon/stock_parts/manipulator" = 1)
\ No newline at end of file
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm b/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm
index b80a3abd34a..a1edb3f4646 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/cloning.dm
@@ -1,5 +1,5 @@
#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
+#error T_BOARD macro is not defined but we need it!
#endif
/obj/item/weapon/circuitboard/clonepod
@@ -8,10 +8,10 @@
board_type = "machine"
origin_tech = list(TECH_DATA = 3, TECH_BIO = 3)
req_components = list(
- "/obj/item/stack/cable_coil" = 2,
- "/obj/item/weapon/stock_parts/scanning_module" = 2,
- "/obj/item/weapon/stock_parts/manipulator" = 2,
- "/obj/item/weapon/stock_parts/console_screen" = 1)
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/scanning_module = 2,
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/weapon/stock_parts/console_screen = 1)
/obj/item/weapon/circuitboard/clonescanner
name = T_BOARD("cloning scanner")
@@ -19,8 +19,8 @@
board_type = "machine"
origin_tech = list(TECH_DATA = 2, TECH_BIO = 2)
req_components = list(
- "/obj/item/weapon/stock_parts/scanning_module" = 1,
- "/obj/item/weapon/stock_parts/manipulator" = 1,
- "/obj/item/weapon/stock_parts/micro_laser" = 1,
- "/obj/item/weapon/stock_parts/console_screen" = 1,
- "/obj/item/stack/cable_coil" = 2)
+ /obj/item/weapon/stock_parts/scanning_module = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/stack/cable_coil = 2)
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm b/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm
index 6b8eb5d5e5c..4515bfd74bc 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/mech_recharger.dm
@@ -1,5 +1,5 @@
#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
+#error T_BOARD macro is not defined but we need it!
#endif
/obj/item/weapon/circuitboard/mech_recharger
@@ -8,6 +8,6 @@
board_type = "machine"
origin_tech = list(TECH_DATA = 2, TECH_POWER = 2, TECH_ENGINEERING = 2)
req_components = list(
- "/obj/item/weapon/stock_parts/capacitor" = 2,
- "/obj/item/weapon/stock_parts/scanning_module" = 1,
- "/obj/item/weapon/stock_parts/manipulator" = 2)
\ No newline at end of file
+ /obj/item/weapon/stock_parts/capacitor = 2,
+ /obj/item/weapon/stock_parts/scanning_module = 1,
+ /obj/item/weapon/stock_parts/manipulator = 2)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm b/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm
index a31a73684a4..653d20d6669 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/mining_drill.dm
@@ -1,5 +1,5 @@
#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
+#error T_BOARD macro is not defined but we need it!
#endif
/obj/item/weapon/circuitboard/miningdrill
@@ -8,10 +8,10 @@
board_type = "machine"
origin_tech = list(TECH_DATA = 1, TECH_ENGINEERING = 1)
req_components = list(
- "/obj/item/weapon/stock_parts/capacitor" = 1,
- "/obj/item/weapon/cell" = 1,
- "/obj/item/weapon/stock_parts/matter_bin" = 1,
- "/obj/item/weapon/stock_parts/micro_laser" = 1)
+ /obj/item/weapon/stock_parts/capacitor = 1,
+ /obj/item/weapon/cell = 1,
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1)
/obj/item/weapon/circuitboard/miningdrillbrace
name = T_BOARD("mining drill brace")
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm b/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm
index 02bf65fb0a8..a5cd69b0f4a 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/pacman.dm
@@ -1,5 +1,5 @@
#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
+#error T_BOARD macro is not defined but we need it!
#endif
/obj/item/weapon/circuitboard/pacman
@@ -8,10 +8,10 @@
board_type = "machine"
origin_tech = list(TECH_DATA = 3, TECH_POWER = 3, TECH_PHORON = 3, TECH_ENGINEERING = 3)
req_components = list(
- "/obj/item/weapon/stock_parts/matter_bin" = 1,
- "/obj/item/weapon/stock_parts/micro_laser" = 1,
- "/obj/item/stack/cable_coil" = 2,
- "/obj/item/weapon/stock_parts/capacitor" = 1)
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/capacitor = 1)
/obj/item/weapon/circuitboard/pacman/super
name = T_BOARD("SUPERPACMAN-type generator")
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/power.dm b/code/game/objects/items/weapons/circuitboards/machinery/power.dm
index a8d2e1ea372..5c8975a207f 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/power.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/power.dm
@@ -1,5 +1,5 @@
#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
+#error T_BOARD macro is not defined but we need it!
#endif
/obj/item/weapon/circuitboard/smes
@@ -7,18 +7,18 @@
build_path = "/obj/machinery/power/smes/buildable"
board_type = "machine"
origin_tech = list(TECH_POWER = 6, TECH_ENGINEERING = 4)
- req_components = list("/obj/item/weapon/smes_coil" = 1, "/obj/item/stack/cable_coil" = 30)
+ req_components = list(/obj/item/weapon/smes_coil = 1, /obj/item/stack/cable_coil = 30)
/obj/item/weapon/circuitboard/batteryrack
name = T_BOARD("battery rack PSU")
build_path = "/obj/machinery/power/smes/batteryrack"
board_type = "machine"
origin_tech = list(TECH_POWER = 3, TECH_ENGINEERING = 2)
- req_components = list("/obj/item/weapon/cell" = 3)
+ req_components = list(/obj/item/weapon/cell = 3)
/obj/item/weapon/circuitboard/ghettosmes
name = T_BOARD("makeshift PSU")
desc = "An APC circuit repurposed into some power storage device controller"
build_path = "/obj/machinery/power/smes/batteryrack/makeshift"
board_type = "machine"
- req_components = list("/obj/item/weapon/cell" = 3)
+ req_components = list(/obj/item/weapon/cell = 3)
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm b/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm
index 27e4c652c6f..a3684cd894c 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/recharge_station.dm
@@ -1,5 +1,5 @@
#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
+#error T_BOARD macro is not defined but we need it!
#endif
/obj/item/weapon/circuitboard/recharge_station
@@ -8,7 +8,7 @@
board_type = "machine"
origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3)
req_components = list(
- "/obj/item/stack/cable_coil" = 5,
- "/obj/item/weapon/stock_parts/capacitor" = 2,
- "/obj/item/weapon/stock_parts/manipulator" = 2,
- "/obj/item/weapon/cell" = 1)
\ No newline at end of file
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/weapon/stock_parts/capacitor = 2,
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/weapon/cell = 1)
\ No newline at end of file
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/research.dm b/code/game/objects/items/weapons/circuitboards/machinery/research.dm
index ee2a2b054c8..bf0eb357f43 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/research.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/research.dm
@@ -1,5 +1,5 @@
#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
+#error T_BOARD macro is not defined but we need it!
#endif
obj/item/weapon/circuitboard/rdserver
@@ -8,8 +8,8 @@ obj/item/weapon/circuitboard/rdserver
board_type = "machine"
origin_tech = list(TECH_DATA = 3)
req_components = list(
- "/obj/item/stack/cable_coil" = 2,
- "/obj/item/weapon/stock_parts/scanning_module" = 1)
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/scanning_module = 1)
/obj/item/weapon/circuitboard/destructive_analyzer
name = T_BOARD("destructive analyzer")
@@ -17,9 +17,9 @@ obj/item/weapon/circuitboard/rdserver
board_type = "machine"
origin_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2, TECH_DATA = 2)
req_components = list(
- "/obj/item/weapon/stock_parts/scanning_module" = 1,
- "/obj/item/weapon/stock_parts/manipulator" = 1,
- "/obj/item/weapon/stock_parts/micro_laser" = 1)
+ /obj/item/weapon/stock_parts/scanning_module = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1)
/obj/item/weapon/circuitboard/autolathe
name = T_BOARD("autolathe")
@@ -27,9 +27,9 @@ obj/item/weapon/circuitboard/rdserver
board_type = "machine"
origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2)
req_components = list(
- "/obj/item/weapon/stock_parts/matter_bin" = 3,
- "/obj/item/weapon/stock_parts/manipulator" = 1,
- "/obj/item/weapon/stock_parts/console_screen" = 1)
+ /obj/item/weapon/stock_parts/matter_bin = 3,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
/obj/item/weapon/circuitboard/protolathe
name = T_BOARD("protolathe")
@@ -37,10 +37,9 @@ obj/item/weapon/circuitboard/rdserver
board_type = "machine"
origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2)
req_components = list(
- "/obj/item/weapon/stock_parts/matter_bin" = 2,
- "/obj/item/weapon/stock_parts/manipulator" = 2,
- "/obj/item/weapon/reagent_containers/glass/beaker" = 2)
-
+ /obj/item/weapon/stock_parts/matter_bin = 2,
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/weapon/reagent_containers/glass/beaker = 2)
/obj/item/weapon/circuitboard/circuit_imprinter
name = T_BOARD("circuit imprinter")
@@ -48,9 +47,9 @@ obj/item/weapon/circuitboard/rdserver
board_type = "machine"
origin_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2)
req_components = list(
- "/obj/item/weapon/stock_parts/matter_bin" = 1,
- "/obj/item/weapon/stock_parts/manipulator" = 1,
- "/obj/item/weapon/reagent_containers/glass/beaker" = 2)
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/reagent_containers/glass/beaker = 2)
/obj/item/weapon/circuitboard/mechfab
name = "Circuit board (Exosuit Fabricator)"
@@ -58,7 +57,7 @@ obj/item/weapon/circuitboard/rdserver
board_type = "machine"
origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 3)
req_components = list(
- "/obj/item/weapon/stock_parts/matter_bin" = 2,
- "/obj/item/weapon/stock_parts/manipulator" = 1,
- "/obj/item/weapon/stock_parts/micro_laser" = 1,
- "/obj/item/weapon/stock_parts/console_screen" = 1)
+ /obj/item/weapon/stock_parts/matter_bin = 2,
+ /obj/item/weapon/stock_parts/manipulator = 1,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1)
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm b/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm
index 6dc0a3f7ab8..7218b7f094d 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/shieldgen.dm
@@ -1,5 +1,5 @@
#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
+#error T_BOARD macro is not defined but we need it!
#endif
/obj/item/weapon/circuitboard/shield_gen_ex
@@ -8,12 +8,12 @@
build_path = "/obj/machinery/shield_gen/external"
origin_tech = list(TECH_BLUESPACE = 4, TECH_PHORON = 3)
req_components = list(
- "/obj/item/weapon/stock_parts/manipulator/pico" = 2,
- "/obj/item/weapon/stock_parts/subspace/transmitter" = 1,
- "/obj/item/weapon/stock_parts/subspace/crystal" = 1,
- "/obj/item/weapon/stock_parts/subspace/amplifier" = 1,
- "/obj/item/weapon/stock_parts/console_screen" = 1,
- "/obj/item/stack/cable_coil" = 5)
+ /obj/item/weapon/stock_parts/manipulator/pico = 2,
+ /obj/item/weapon/stock_parts/subspace/transmitter = 1,
+ /obj/item/weapon/stock_parts/subspace/crystal = 1,
+ /obj/item/weapon/stock_parts/subspace/amplifier = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/stack/cable_coil = 5)
/obj/item/weapon/circuitboard/shield_gen
name = T_BOARD("bubble shield generator")
@@ -21,12 +21,12 @@
build_path = "/obj/machinery/shield_gen"
origin_tech = list(TECH_BLUESPACE = 4, TECH_PHORON = 3)
req_components = list(
- "/obj/item/weapon/stock_parts/manipulator/pico" = 2,
- "/obj/item/weapon/stock_parts/subspace/transmitter" = 1,
- "/obj/item/weapon/stock_parts/subspace/crystal" = 1,
- "/obj/item/weapon/stock_parts/subspace/amplifier" = 1,
- "/obj/item/weapon/stock_parts/console_screen" = 1,
- "/obj/item/stack/cable_coil" = 5)
+ /obj/item/weapon/stock_parts/manipulator/pico = 2,
+ /obj/item/weapon/stock_parts/subspace/transmitter = 1,
+ /obj/item/weapon/stock_parts/subspace/crystal = 1,
+ /obj/item/weapon/stock_parts/subspace/amplifier = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/stack/cable_coil = 5)
/obj/item/weapon/circuitboard/shield_cap
name = T_BOARD("shield capacitor")
@@ -34,9 +34,9 @@
build_path = "/obj/machinery/shield_capacitor"
origin_tech = list(TECH_MAGNET = 3, TECH_POWER = 4)
req_components = list(
- "/obj/item/weapon/stock_parts/manipulator/pico" = 2,
- "/obj/item/weapon/stock_parts/subspace/filter" = 1,
- "/obj/item/weapon/stock_parts/subspace/treatment" = 1,
- "/obj/item/weapon/stock_parts/subspace/analyzer" = 1,
- "/obj/item/weapon/stock_parts/console_screen" = 1,
- "/obj/item/stack/cable_coil" = 5)
+ /obj/item/weapon/stock_parts/manipulator/pico = 2,
+ /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/subspace/treatment = 1,
+ /obj/item/weapon/stock_parts/subspace/analyzer = 1,
+ /obj/item/weapon/stock_parts/console_screen = 1,
+ /obj/item/stack/cable_coil = 5)
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm b/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm
index 9ee761a7305..43b654d58de 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/telecomms.dm
@@ -10,69 +10,69 @@
build_path = "/obj/machinery/telecomms/receiver"
origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 3, TECH_BLUESPACE = 2)
req_components = list(
- "/obj/item/weapon/stock_parts/subspace/ansible" = 1,
- "/obj/item/weapon/stock_parts/subspace/filter" = 1,
- "/obj/item/weapon/stock_parts/manipulator" = 2,
- "/obj/item/weapon/stock_parts/micro_laser" = 1)
+ /obj/item/weapon/stock_parts/subspace/ansible = 1,
+ /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/weapon/stock_parts/micro_laser = 1)
/obj/item/weapon/circuitboard/telecomms/hub
name = T_BOARD("hub mainframe")
build_path = "/obj/machinery/telecomms/hub"
origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4)
req_components = list(
- "/obj/item/weapon/stock_parts/manipulator" = 2,
- "/obj/item/stack/cable_coil" = 2,
- "/obj/item/weapon/stock_parts/subspace/filter" = 2)
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/subspace/filter = 2)
/obj/item/weapon/circuitboard/telecomms/relay
name = T_BOARD("relay mainframe")
build_path = "/obj/machinery/telecomms/relay"
origin_tech = list(TECH_DATA = 3, TECH_ENGINEERING = 4, TECH_BLUESPACE = 3)
req_components = list(
- "/obj/item/weapon/stock_parts/manipulator" = 2,
- "/obj/item/stack/cable_coil" = 2,
- "/obj/item/weapon/stock_parts/subspace/filter" = 2)
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/subspace/filter = 2)
/obj/item/weapon/circuitboard/telecomms/bus
name = T_BOARD("bus mainframe")
build_path = "/obj/machinery/telecomms/bus"
origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4)
req_components = list(
- "/obj/item/weapon/stock_parts/manipulator" = 2,
- "/obj/item/stack/cable_coil" = 1,
- "/obj/item/weapon/stock_parts/subspace/filter" = 1)
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/weapon/stock_parts/subspace/filter = 1)
/obj/item/weapon/circuitboard/telecomms/processor
name = T_BOARD("processor unit")
build_path = "/obj/machinery/telecomms/processor"
origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4)
req_components = list(
- "/obj/item/weapon/stock_parts/manipulator" = 3,
- "/obj/item/weapon/stock_parts/subspace/filter" = 1,
- "/obj/item/weapon/stock_parts/subspace/treatment" = 2,
- "/obj/item/weapon/stock_parts/subspace/analyzer" = 1,
- "/obj/item/stack/cable_coil" = 2,
- "/obj/item/weapon/stock_parts/subspace/amplifier" = 1)
+ /obj/item/weapon/stock_parts/manipulator = 3,
+ /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/subspace/treatment = 2,
+ /obj/item/weapon/stock_parts/subspace/analyzer = 1,
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/subspace/amplifier = 1)
/obj/item/weapon/circuitboard/telecomms/server
name = T_BOARD("telecommunication server")
build_path = "/obj/machinery/telecomms/server"
origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4)
req_components = list(
- "/obj/item/weapon/stock_parts/manipulator" = 2,
- "/obj/item/stack/cable_coil" = 1,
- "/obj/item/weapon/stock_parts/subspace/filter" = 1)
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/weapon/stock_parts/subspace/filter = 1)
/obj/item/weapon/circuitboard/telecomms/broadcaster
name = T_BOARD("subspace broadcaster")
build_path = "/obj/machinery/telecomms/broadcaster"
origin_tech = list(TECH_DATA = 4, TECH_ENGINEERING = 4, TECH_BLUESPACE = 2)
req_components = list(
- "/obj/item/weapon/stock_parts/manipulator" = 2,
- "/obj/item/stack/cable_coil" = 1,
- "/obj/item/weapon/stock_parts/subspace/filter" = 1,
- "/obj/item/weapon/stock_parts/subspace/crystal" = 1,
- "/obj/item/weapon/stock_parts/micro_laser/high" = 2)
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/stack/cable_coil = 1,
+ /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/subspace/crystal = 1,
+ /obj/item/weapon/stock_parts/micro_laser/high = 2)
//This isn't a real telecomms board but I don't want to make a whole file to hold only one circuitboard.
/obj/item/weapon/circuitboard/telecomms/exonet_node
@@ -80,10 +80,10 @@
build_path = "/obj/machinery/exonet_node"
origin_tech = list(TECH_DATA = 5, TECH_ENGINEERING = 5, TECH_BLUESPACE = 4)
req_components = list(
- "/obj/item/weapon/stock_parts/subspace/ansible" = 1,
- "/obj/item/weapon/stock_parts/subspace/filter" = 1,
- "/obj/item/weapon/stock_parts/manipulator" = 2,
- "/obj/item/weapon/stock_parts/micro_laser" = 1,
- "/obj/item/weapon/stock_parts/subspace/crystal" = 1,
- "/obj/item/weapon/stock_parts/subspace/treatment" = 2,
- "/obj/item/stack/cable_coil" = 2)
+ /obj/item/weapon/stock_parts/subspace/ansible = 1,
+ /obj/item/weapon/stock_parts/subspace/filter = 1,
+ /obj/item/weapon/stock_parts/manipulator = 2,
+ /obj/item/weapon/stock_parts/micro_laser = 1,
+ /obj/item/weapon/stock_parts/subspace/crystal = 1,
+ /obj/item/weapon/stock_parts/subspace/treatment = 2,
+ /obj/item/stack/cable_coil = 2)
diff --git a/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm b/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm
index 045f29592ae..38438d6327a 100644
--- a/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm
+++ b/code/game/objects/items/weapons/circuitboards/machinery/unary_atmos.dm
@@ -1,5 +1,5 @@
#ifndef T_BOARD
-#error T_BOARD macro is not defined but we need it!
+#error T_BOARD macro is not defined but we need it!
#endif
/obj/item/weapon/circuitboard/unary_atmos
@@ -18,16 +18,16 @@
build_path = "/obj/machinery/atmospherics/unary/heater"
origin_tech = list(TECH_POWER = 2, TECH_ENGINEERING = 1)
req_components = list(
- "/obj/item/stack/cable_coil" = 5,
- "/obj/item/weapon/stock_parts/matter_bin" = 1,
- "/obj/item/weapon/stock_parts/capacitor" = 2)
+ /obj/item/stack/cable_coil = 5,
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/capacitor = 2)
/obj/item/weapon/circuitboard/unary_atmos/cooler
name = T_BOARD("gas cooling system")
build_path = "/obj/machinery/atmospherics/unary/freezer"
origin_tech = list(TECH_MAGNET = 2, TECH_ENGINEERING = 2)
req_components = list(
- "/obj/item/stack/cable_coil" = 2,
- "/obj/item/weapon/stock_parts/matter_bin" = 1,
- "/obj/item/weapon/stock_parts/capacitor" = 2,
- "/obj/item/weapon/stock_parts/manipulator" = 1)
+ /obj/item/stack/cable_coil = 2,
+ /obj/item/weapon/stock_parts/matter_bin = 1,
+ /obj/item/weapon/stock_parts/capacitor = 2,
+ /obj/item/weapon/stock_parts/manipulator = 1)
diff --git a/code/game/objects/items/weapons/grenades/smokebomb.dm b/code/game/objects/items/weapons/grenades/smokebomb.dm
index 704df83db8a..d64627fcf38 100644
--- a/code/game/objects/items/weapons/grenades/smokebomb.dm
+++ b/code/game/objects/items/weapons/grenades/smokebomb.dm
@@ -1,5 +1,5 @@
/obj/item/weapon/grenade/smokebomb
- desc = "It is set to detonate in 2 seconds."
+ desc = "It is set to detonate in 2 seconds. These high-tech grenades can have their color adapted on the fly with a multitool!"
name = "smoke bomb"
icon = 'icons/obj/grenade.dmi'
icon_state = "flashbang"
@@ -7,6 +7,8 @@
item_state = "flashbang"
slot_flags = SLOT_BELT
var/datum/effect/effect/system/smoke_spread/bad/smoke
+ var/smoke_color
+ var/smoke_strength = 8
/obj/item/weapon/grenade/smokebomb/New()
..()
@@ -22,18 +24,15 @@
playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3)
src.smoke.set_up(10, 0, usr.loc)
spawn(0)
- src.smoke.start()
- sleep(10)
- src.smoke.start()
- sleep(10)
- src.smoke.start()
- sleep(10)
- src.smoke.start()
+ for(var/i = 1 to smoke_strength)
+ src.smoke.start(smoke_color)
+ sleep(10)
+ qdel(src)
- for(var/obj/effect/blob/B in view(8,src))
- var/damage = round(30/(get_dist(B,src)+1))
- B.health -= damage
- B.update_icon()
- sleep(80)
- qdel(src)
return
+
+/obj/item/weapon/grenade/smokebomb/attackby(obj/item/I as obj, mob/user as mob)
+ if(istype(I,/obj/item/device/multitool))
+ var/new_smoke_color = input(user, "Choose a color for the smoke:", "Smoke Color", smoke_color) as color|null
+ if(new_smoke_color)
+ smoke_color = new_smoke_color
diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm
index 85091725811..9eebc7b3f02 100644
--- a/code/game/objects/items/weapons/storage/backpack.dm
+++ b/code/game/objects/items/weapons/storage/backpack.dm
@@ -203,6 +203,15 @@
slot_r_hand_str = "duffle_med",
)
+/obj/item/weapon/storage/backpack/dufflebag/emt
+ name = "EMT dufflebag"
+ desc = "A large dufflebag for holding extra medical supplies. This one has reflective stripes!"
+ icon_state = "duffle_emt"
+ item_state_slots = list(
+ slot_l_hand_str = "duffle_emt",
+ slot_r_hand_str = "duffle_emt",
+ )
+
/obj/item/weapon/storage/backpack/dufflebag/sec
name = "security dufflebag"
desc = "A large dufflebag for holding extra security supplies and ammunition."
@@ -235,12 +244,12 @@
..()
new /obj/item/weapon/storage/wallet/random( src )
-/obj/item/weapon/storage/backpack/satchel_norm
+/obj/item/weapon/storage/backpack/satchel/norm
name = "satchel"
desc = "A trendy looking satchel."
icon_state = "satchel-norm"
-/obj/item/weapon/storage/backpack/satchel_eng
+/obj/item/weapon/storage/backpack/satchel/eng
name = "industrial satchel"
desc = "A tough satchel with extra pockets."
icon_state = "satchel-eng"
@@ -249,7 +258,7 @@
slot_r_hand_str = "engiepack",
)
-/obj/item/weapon/storage/backpack/satchel_med
+/obj/item/weapon/storage/backpack/satchel/med
name = "medical satchel"
desc = "A sterile satchel used in medical departments."
icon_state = "satchel-med"
@@ -258,27 +267,27 @@
slot_r_hand_str = "medicalpack",
)
-/obj/item/weapon/storage/backpack/satchel_vir
+/obj/item/weapon/storage/backpack/satchel/vir
name = "virologist satchel"
desc = "A sterile satchel with virologist colours."
icon_state = "satchel-vir"
-/obj/item/weapon/storage/backpack/satchel_chem
+/obj/item/weapon/storage/backpack/satchel/chem
name = "chemist satchel"
desc = "A sterile satchel with chemist colours."
icon_state = "satchel-chem"
-/obj/item/weapon/storage/backpack/satchel_gen
+/obj/item/weapon/storage/backpack/satchel/gen
name = "geneticist satchel"
desc = "A sterile satchel with geneticist colours."
icon_state = "satchel-gen"
-/obj/item/weapon/storage/backpack/satchel_tox
+/obj/item/weapon/storage/backpack/satchel/tox
name = "scientist satchel"
desc = "Useful for holding research materials."
icon_state = "satchel-tox"
-/obj/item/weapon/storage/backpack/satchel_sec
+/obj/item/weapon/storage/backpack/satchel/sec
name = "security satchel"
desc = "A robust satchel for security related needs."
icon_state = "satchel-sec"
@@ -287,12 +296,12 @@
slot_r_hand_str = "securitypack",
)
-/obj/item/weapon/storage/backpack/satchel_hyd
+/obj/item/weapon/storage/backpack/satchel/hyd
name = "hydroponics satchel"
desc = "A green satchel for plant related work."
icon_state = "satchel_hyd"
-/obj/item/weapon/storage/backpack/satchel_cap
+/obj/item/weapon/storage/backpack/satchel/cap
name = "captain's satchel"
desc = "An exclusive satchel for officers."
icon_state = "satchel-cap"
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 657d2f4f5a4..47a2f00b213 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -333,6 +333,8 @@
new /obj/item/weapon/grenade/smokebomb(src)
new /obj/item/weapon/grenade/smokebomb(src)
new /obj/item/weapon/grenade/smokebomb(src)
+ new /obj/item/weapon/grenade/smokebomb(src)
+ new /obj/item/weapon/grenade/smokebomb(src)
/obj/item/weapon/storage/box/anti_photons
name = "box of anti-photon grenades"
diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm
index 9b9918d92fc..4bd5592704f 100644
--- a/code/game/objects/items/weapons/storage/firstaid.dm
+++ b/code/game/objects/items/weapons/storage/firstaid.dm
@@ -14,6 +14,7 @@
throw_speed = 2
throw_range = 8
var/empty = 0
+ max_storage_space = 14
/obj/item/weapon/storage/firstaid/fire
@@ -131,8 +132,8 @@
/obj/item/weapon/storage/firstaid/surgery
name = "surgery kit"
desc = "Contains tools for surgery."
- storage_slots = 10
- max_storage_space = 23
+ max_storage_space = 21
+ max_w_class = 3
/obj/item/weapon/storage/firstaid/surgery/New()
..()
@@ -163,6 +164,8 @@
allow_quick_gather = 1
use_to_pickup = 1
use_sound = null
+ max_storage_space = 14
+ max_w_class = 1
/obj/item/weapon/storage/pill_bottle/antitox
name = "bottle of Dylovene pills"
diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm
index 8c6365d6fd4..13cbc06dc7a 100644
--- a/code/game/objects/items/weapons/storage/toolbox.dm
+++ b/code/game/objects/items/weapons/storage/toolbox.dm
@@ -136,10 +136,10 @@
filled = TRUE
/obj/item/weapon/storage/toolbox/lunchbox/mars
- name = "\improper Mars university lunchbox"
+ name = "\improper Mojave university lunchbox"
icon_state = "lunchbox_marsuniversity"
item_state = "toolbox_red"
- desc = "A little lunchbox. This one is branded with the Mars university logo!"
+ desc = "A little lunchbox. This one is branded with the Mojave university logo!"
/obj/item/weapon/storage/toolbox/lunchbox/mars/filled
filled = TRUE
diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm
index 5029e166d21..d88e8c5372f 100644
--- a/code/game/objects/structures/crates_lockers/closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets.dm
@@ -247,6 +247,16 @@
src.update_icon()
for(var/mob/M in viewers(src))
M.show_message("[src] has been [welded?"welded shut":"unwelded"] by [user.name].", 3, "You hear welding.", 2)
+ else if(istype(W, /obj/item/weapon/wrench))
+ if(welded)
+ if(anchored)
+ user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.")
+ else
+ user.visible_message("\The [user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.")
+ if(do_after(user, 20))
+ if(!src) return
+ user << "You [anchored? "un" : ""]secured \the [src]!"
+ anchored = !anchored
else
src.attack_hand(user)
return
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
index cc186812945..c7095514cc1 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/cargo.dm
@@ -13,7 +13,7 @@
if(prob(75))
new /obj/item/weapon/storage/backpack(src)
else
- new /obj/item/weapon/storage/backpack/satchel_norm(src)
+ new /obj/item/weapon/storage/backpack/satchel/norm(src)
if(prob(25))
new /obj/item/weapon/storage/backpack/dufflebag(src)
new /obj/item/clothing/under/rank/cargotech(src)
@@ -44,7 +44,7 @@
if(prob(75))
new /obj/item/weapon/storage/backpack(src)
else
- new /obj/item/weapon/storage/backpack/satchel_norm(src)
+ new /obj/item/weapon/storage/backpack/satchel/norm(src)
if(prob(25))
new /obj/item/weapon/storage/backpack/dufflebag(src)
new /obj/item/clothing/under/rank/cargo(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
index cec9b898550..787e0adb3bd 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/engineering.dm
@@ -14,7 +14,7 @@
if(prob(50))
new /obj/item/weapon/storage/backpack/industrial(src)
else
- new /obj/item/weapon/storage/backpack/satchel_eng(src)
+ new /obj/item/weapon/storage/backpack/satchel/eng(src)
if(prob(50))
new /obj/item/weapon/storage/backpack/dufflebag/eng(src)
new /obj/item/clothing/accessory/storage/brown_vest(src)
@@ -113,7 +113,7 @@
if(prob(50))
new /obj/item/weapon/storage/backpack/industrial(src)
else
- new /obj/item/weapon/storage/backpack/satchel_eng(src)
+ new /obj/item/weapon/storage/backpack/satchel/eng(src)
if(prob(50))
new /obj/item/weapon/storage/backpack/dufflebag/eng(src)
new /obj/item/clothing/accessory/storage/brown_vest(src)
@@ -147,7 +147,7 @@
if(prob(50))
new /obj/item/weapon/storage/backpack/industrial(src)
else
- new /obj/item/weapon/storage/backpack/satchel_eng(src)
+ new /obj/item/weapon/storage/backpack/satchel/eng(src)
if(prob(50))
new /obj/item/weapon/storage/backpack/dufflebag/eng(src)
new /obj/item/clothing/accessory/storage/brown_vest(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
index 0722b5b0771..62401902b64 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm
@@ -18,11 +18,10 @@
New()
..()
- for(var/i = 0, i < 6, i++)
+ for(var/i = 1 to 7)
new /obj/item/weapon/reagent_containers/food/condiment/flour(src)
- new /obj/item/weapon/reagent_containers/food/condiment/sugar(src)
- for(var/i = 0, i < 3, i++)
- new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey(src)
+ for(var/i = 1 to 2)
+ new /obj/item/weapon/reagent_containers/food/condiment/sugar(src)
return
@@ -43,7 +42,7 @@
New()
..()
- for(var/i = 0, i < 4, i++)
+ for(var/i = 1 to 10)
new /obj/item/weapon/reagent_containers/food/snacks/meat/monkey(src)
return
@@ -61,11 +60,11 @@
New()
..()
- for(var/i = 0, i < 5, i++)
+ for(var/i = 1 to 6)
new /obj/item/weapon/reagent_containers/food/drinks/milk(src)
- for(var/i = 0, i < 3, i++)
+ for(var/i = 1 to 4)
new /obj/item/weapon/reagent_containers/food/drinks/soymilk(src)
- for(var/i = 0, i < 2, i++)
+ for(var/i = 1 to 4)
new /obj/item/weapon/storage/fancy/egg_box(src)
return
@@ -84,10 +83,10 @@
New()
..()
- for(var/i = 0, i < 3, i++)
+ for(var/i = 1 to 3)
new /obj/item/weapon/spacecash/c1000(src)
- for(var/i = 0, i < 5, i++)
+ for(var/i = 1 to 4)
new /obj/item/weapon/spacecash/c500(src)
- for(var/i = 0, i < 6, i++)
+ for(var/i = 1 to 5)
new /obj/item/weapon/spacecash/c200(src)
return
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
index b424c65be5a..fdd1ed5c807 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm
@@ -65,7 +65,7 @@
if(prob(50))
new /obj/item/weapon/storage/backpack/medic(src)
else
- new /obj/item/weapon/storage/backpack/satchel_med(src)
+ new /obj/item/weapon/storage/backpack/satchel/med(src)
if(prob(50))
new /obj/item/weapon/storage/backpack/dufflebag/med(src)
new /obj/item/clothing/under/rank/nursesuit (src)
@@ -131,6 +131,7 @@
New()
..()
+ new /obj/item/weapon/storage/backpack/dufflebag/emt(src)
new /obj/item/weapon/storage/box/autoinjectors(src)
new /obj/item/weapon/storage/box/syringes(src)
new /obj/item/weapon/reagent_containers/glass/bottle/inaprovaline(src)
@@ -168,7 +169,7 @@
if(prob(50))
new /obj/item/weapon/storage/backpack/medic(src)
else
- new /obj/item/weapon/storage/backpack/satchel_med(src)
+ new /obj/item/weapon/storage/backpack/satchel/med(src)
if(prob(50))
new /obj/item/weapon/storage/backpack/dufflebag/med(src)
new /obj/item/clothing/suit/bio_suit/cmo(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
index d91b22fe74d..2930b8c0a02 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/personal.dm
@@ -10,7 +10,7 @@
if(prob(50))
new /obj/item/weapon/storage/backpack(src)
else
- new /obj/item/weapon/storage/backpack/satchel_norm(src)
+ new /obj/item/weapon/storage/backpack/satchel/norm(src)
new /obj/item/device/radio/headset( src )
return
@@ -94,7 +94,7 @@
else
user << "Access Denied"
return
-
+
/obj/structure/closet/secure_closet/personal/emag_act(var/remaining_charges, var/mob/user, var/visual_feedback, var/audible_feedback)
if(!broken)
broken = 1
@@ -102,7 +102,7 @@
desc = "It appears to be broken."
icon_state = src.icon_broken
if(visual_feedback)
- visible_message("[visual_feedback]", "[audible_feedback]")
+ visible_message("[visual_feedback]", "[audible_feedback]")
return 1
/obj/structure/closet/secure_closet/personal/verb/reset()
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
index 1ce97a64a79..49fe7bbdd3a 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm
@@ -87,6 +87,17 @@
spark_system.start()
playsound(src.loc, 'sound/weapons/blade1.ogg', 50, 1)
playsound(src.loc, "sparks", 50, 1)
+ else if(istype(W, /obj/item/weapon/wrench))
+ if(welded)
+ if(anchored)
+ user.visible_message("\The [user] begins unsecuring \the [src] from the floor.", "You start unsecuring \the [src] from the floor.")
+ else
+ user.visible_message("\The [user] begins securing \the [src] to the floor.", "You start securing \the [src] to the floor.")
+ if(do_after(user, 20))
+ if(!src) return
+ user << "You [anchored? "un" : ""]secured \the [src]!"
+ anchored = !anchored
+ return
else if(istype(W,/obj/item/weapon/packageWrap) || istype(W,/obj/item/weapon/weldingtool))
return ..(W,user)
else
diff --git a/code/game/objects/structures/crates_lockers/closets/secure/security.dm b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
index 5a692dc1c4a..6aa1ee66f64 100644
--- a/code/game/objects/structures/crates_lockers/closets/secure/security.dm
+++ b/code/game/objects/structures/crates_lockers/closets/secure/security.dm
@@ -88,13 +88,14 @@
icon_opened = "hossecureopen"
icon_broken = "hossecurebroken"
icon_off = "hossecureoff"
+ storage_capacity = 2.5 * MOB_MEDIUM
New()
..()
if(prob(50))
new /obj/item/weapon/storage/backpack/security(src)
else
- new /obj/item/weapon/storage/backpack/satchel_sec(src)
+ new /obj/item/weapon/storage/backpack/satchel/sec(src)
if(prob(50))
new /obj/item/weapon/storage/backpack/dufflebag/sec(src)
new /obj/item/clothing/head/helmet/HoS(src)
@@ -143,7 +144,7 @@
if(prob(50))
new /obj/item/weapon/storage/backpack/security(src)
else
- new /obj/item/weapon/storage/backpack/satchel_sec(src)
+ new /obj/item/weapon/storage/backpack/satchel/sec(src)
if(prob(50))
new /obj/item/weapon/storage/backpack/dufflebag/sec(src)
new /obj/item/clothing/suit/storage/vest/warden(src)
@@ -187,7 +188,7 @@
if(prob(50))
new /obj/item/weapon/storage/backpack/security(src)
else
- new /obj/item/weapon/storage/backpack/satchel_sec(src)
+ new /obj/item/weapon/storage/backpack/satchel/sec(src)
if(prob(50))
new /obj/item/weapon/storage/backpack/dufflebag/sec(src)
new /obj/item/clothing/suit/storage/vest/officer(src)
diff --git a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
index 0c49681489c..0736a13f13c 100644
--- a/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
+++ b/code/game/objects/structures/crates_lockers/closets/wardrobe.dm
@@ -14,15 +14,15 @@
if(prob(50))
new /obj/item/weapon/storage/backpack/security(src)
else
- new /obj/item/weapon/storage/backpack/satchel_sec(src)
+ new /obj/item/weapon/storage/backpack/satchel/sec(src)
if(prob(50))
new /obj/item/weapon/storage/backpack/security(src)
else
- new /obj/item/weapon/storage/backpack/satchel_sec(src)
+ new /obj/item/weapon/storage/backpack/satchel/sec(src)
if(prob(50))
new /obj/item/weapon/storage/backpack/security(src)
else
- new /obj/item/weapon/storage/backpack/satchel_sec(src)
+ new /obj/item/weapon/storage/backpack/satchel/sec(src)
new /obj/item/clothing/under/rank/security(src)
new /obj/item/clothing/under/rank/security(src)
new /obj/item/clothing/under/rank/security(src)
@@ -361,8 +361,8 @@
new /obj/item/clothing/suit/storage/hooded/wintercoat/science(src)
new /obj/item/weapon/storage/backpack/toxins(src)
new /obj/item/weapon/storage/backpack/toxins(src)
- new /obj/item/weapon/storage/backpack/satchel_tox(src)
- new /obj/item/weapon/storage/backpack/satchel_tox(src)
+ new /obj/item/weapon/storage/backpack/satchel/tox(src)
+ new /obj/item/weapon/storage/backpack/satchel/tox(src)
return
/obj/structure/closet/wardrobe/robotics_black
@@ -382,8 +382,8 @@
new /obj/item/clothing/gloves/black(src)
new /obj/item/weapon/storage/backpack/toxins(src)
new /obj/item/weapon/storage/backpack/toxins(src)
- new /obj/item/weapon/storage/backpack/satchel_tox(src)
- new /obj/item/weapon/storage/backpack/satchel_tox(src)
+ new /obj/item/weapon/storage/backpack/satchel/tox(src)
+ new /obj/item/weapon/storage/backpack/satchel/tox(src)
return
@@ -404,8 +404,8 @@
new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(src)
new /obj/item/weapon/storage/backpack/chemistry(src)
new /obj/item/weapon/storage/backpack/chemistry(src)
- new /obj/item/weapon/storage/backpack/satchel_chem(src)
- new /obj/item/weapon/storage/backpack/satchel_chem(src)
+ new /obj/item/weapon/storage/backpack/satchel/chem(src)
+ new /obj/item/weapon/storage/backpack/satchel/chem(src)
return
@@ -426,8 +426,8 @@
new /obj/item/clothing/suit/storage/toggle/labcoat/genetics(src)
new /obj/item/weapon/storage/backpack/genetics(src)
new /obj/item/weapon/storage/backpack/genetics(src)
- new /obj/item/weapon/storage/backpack/satchel_gen(src)
- new /obj/item/weapon/storage/backpack/satchel_gen(src)
+ new /obj/item/weapon/storage/backpack/satchel/gen(src)
+ new /obj/item/weapon/storage/backpack/satchel/gen(src)
return
@@ -450,8 +450,8 @@
new /obj/item/clothing/mask/surgical(src)
new /obj/item/weapon/storage/backpack/virology(src)
new /obj/item/weapon/storage/backpack/virology(src)
- new /obj/item/weapon/storage/backpack/satchel_vir(src)
- new /obj/item/weapon/storage/backpack/satchel_vir(src)
+ new /obj/item/weapon/storage/backpack/satchel/vir(src)
+ new /obj/item/weapon/storage/backpack/satchel/vir(src)
return
@@ -626,7 +626,7 @@
new /obj/item/clothing/shoes/brown(src)
new /obj/item/clothing/gloves/captain(src)
new /obj/item/clothing/under/dress/dress_cap(src)
- new /obj/item/weapon/storage/backpack/satchel_cap(src)
+ new /obj/item/weapon/storage/backpack/satchel/cap(src)
new /obj/item/clothing/head/caphat/formal(src)
new /obj/item/clothing/under/captainformal(src)
new /obj/item/clothing/suit/storage/hooded/wintercoat/captain(src)
diff --git a/code/game/objects/structures/girders.dm b/code/game/objects/structures/girders.dm
index 867dada6d91..9c103a8ed28 100644
--- a/code/game/objects/structures/girders.dm
+++ b/code/game/objects/structures/girders.dm
@@ -143,7 +143,8 @@
user << "You begin adding the plating..."
- if(!do_after(user,40) || !S.use(2))
+ var/amount_to_use = reinf_material ? 1 : 2
+ if(!do_after(user,40) || !S.use(amount_to_use))
return 1 //once we've gotten this far don't call parent attackby()
if(anchored)
@@ -167,7 +168,7 @@
user << "\The [src] is already reinforced."
return 0
- if(S.get_amount() < 2)
+ if(S.get_amount() < 1)
user << "There isn't enough material here to reinforce the girder."
return 0
@@ -177,7 +178,7 @@
return 0
user << "Now reinforcing..."
- if (!do_after(user,40) || !S.use(2))
+ if (!do_after(user,40) || !S.use(1))
return 1 //don't call parent attackby() past this point
user << "You added reinforcement!"
diff --git a/code/game/objects/structures/morgue.dm b/code/game/objects/structures/morgue.dm
index 949cbc1ff67..bd280787827 100644
--- a/code/game/objects/structures/morgue.dm
+++ b/code/game/objects/structures/morgue.dm
@@ -18,6 +18,7 @@
dir = EAST
density = 1
var/obj/structure/m_tray/connected = null
+ var/list/occupants = list()
anchored = 1.0
/obj/structure/morgue/Destroy()
@@ -26,12 +27,28 @@
connected = null
return ..()
-/obj/structure/morgue/proc/update()
+/obj/structure/morgue/proc/get_occupants()
+ occupants.Cut()
+ for(var/mob/living/carbon/human/H in contents)
+ occupants += H
+ for(var/obj/structure/closet/body_bag/B in contents)
+ occupants += B.get_occupants()
+
+/obj/structure/morgue/proc/update(var/broadcast=0)
if (src.connected)
src.icon_state = "morgue0"
else
if (src.contents.len)
src.icon_state = "morgue2"
+ get_occupants()
+ for (var/mob/living/carbon/human/H in occupants)
+ if(H.isSynthetic() || H.suiciding || !H.ckey || !H.client || (NOCLONE in H.mutations) || (H.species && H.species.flags & NO_SCAN))
+ src.icon_state = "morgue2"
+ break
+ else
+ src.icon_state = "morgue3"
+ if(broadcast)
+ broadcast_medical_hud_message("[src] was able to establish a mental interface with occupant.", src)
else
src.icon_state = "morgue1"
return
diff --git a/code/game/supplyshuttle.dm b/code/game/supplyshuttle.dm
index 47a3c5a63e9..9496413be73 100644
--- a/code/game/supplyshuttle.dm
+++ b/code/game/supplyshuttle.dm
@@ -288,9 +288,11 @@ var/list/mechtoys = list(
for(var/typepath in contains)
if(!typepath) continue
- var/atom/B2 = new typepath(A)
- if(SP.amount && B2:amount) B2:amount = SP.amount
- if(slip) slip.info += "[B2.name]" //add the item to the manifest
+ var/number_of_items = max(1, contains[typepath])
+ for(var/j = 1 to number_of_items)
+ var/atom/B2 = new typepath(A)
+ if(SP.amount && B2:amount) B2:amount = SP.amount
+ if(slip) slip.info += "[B2.name]" //add the item to the manifest
//manifest finalisation
if(slip)
diff --git a/code/game/turfs/flooring/flooring.dm b/code/game/turfs/flooring/flooring.dm
index bd95b7f594d..369f42fc385 100644
--- a/code/game/turfs/flooring/flooring.dm
+++ b/code/game/turfs/flooring/flooring.dm
@@ -69,7 +69,7 @@ var/list/flooring_types
name = "carpet"
icon_base = "bcarpet"
build_type = null
- flags = TURF_HAS_EDGES
+ flags = TURF_HAS_EDGES | TURF_HAS_CORNERS | TURF_REMOVE_CROWBAR | TURF_CAN_BURN
/decl/flooring/tiling
name = "floor"
@@ -186,7 +186,7 @@ var/list/flooring_types
icon = 'icons/turf/flooring/circuit.dmi'
icon_base = "bcircuit"
build_type = null
- flags = TURF_ACID_IMMUNE | TURF_CAN_BREAK
+ flags = TURF_ACID_IMMUNE | TURF_CAN_BREAK | TURF_REMOVE_CROWBAR
can_paint = 1
/decl/flooring/reinforced/circuit/green
diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm
index 23ffac6465d..ffc2297d02d 100644
--- a/code/game/turfs/simulated/wall_attacks.dm
+++ b/code/game/turfs/simulated/wall_attacks.dm
@@ -217,8 +217,7 @@
if (istype(W, /obj/item/weapon/wirecutters))
playsound(src, 'sound/items/Wirecutter.ogg', 100, 1)
construction_stage = 5
- new /obj/item/stack/rods( src )
- user << "You cut the outer grille."
+ user << "You cut through the outer grille."
update_icon()
return
if(5)
@@ -229,16 +228,13 @@
return
construction_stage = 4
update_icon()
- user << "You remove the support lines."
+ user << "You unscrew the support lines."
+ return
+ else if (istype(W, /obj/item/weapon/wirecutters))
+ construction_stage = 6
+ user << "You mend the outer grille."
+ update_icon()
return
- else if( istype(W, /obj/item/stack/rods) )
- var/obj/item/stack/O = W
- if(O.get_amount()>0)
- O.use(1)
- construction_stage = 6
- update_icon()
- user << "You replace the outer grille."
- return
if(4)
var/cut_cover
if(istype(W,/obj/item/weapon/weldingtool))
@@ -261,6 +257,15 @@
update_icon()
user << "You press firmly on the cover, dislodging it."
return
+ else if (istype(W, /obj/item/weapon/screwdriver))
+ user << "You begin screwing down the support lines."
+ playsound(src, 'sound/items/Screwdriver.ogg', 100, 1)
+ if(!do_after(user,40) || !istype(src, /turf/simulated/wall) || construction_stage != 4)
+ return
+ construction_stage = 5
+ update_icon()
+ user << "You screw down the support lines."
+ return
if(3)
if (istype(W, /obj/item/weapon/crowbar))
user << "You struggle to pry off the cover."
@@ -299,8 +304,7 @@
return
construction_stage = 0
update_icon()
- new /obj/item/stack/rods(src)
- user << "The support rods drop out as you cut them loose from the frame."
+ user << "The slice through the support rods."
return
if(0)
if(istype(W, /obj/item/weapon/crowbar))
diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm
index 16235a72fc3..db48305926e 100644
--- a/code/game/turfs/simulated/walls.dm
+++ b/code/game/turfs/simulated/walls.dm
@@ -162,7 +162,8 @@
reinf_material.place_dismantled_girder(src, reinf_material)
else
material.place_dismantled_girder(src)
- material.place_dismantled_product(src,devastated)
+ if(!devastated)
+ material.place_dismantled_product(src)
for(var/obj/O in src.contents) //Eject contents!
if(istype(O,/obj/structure/sign/poster))
diff --git a/code/game/verbs/ignore.dm b/code/game/verbs/ignore.dm
new file mode 100644
index 00000000000..b772bd4e813
--- /dev/null
+++ b/code/game/verbs/ignore.dm
@@ -0,0 +1,44 @@
+/client/verb/ignore(key_to_ignore as text)
+ set name = "Ignore"
+ set category = "OOC"
+ set desc = "Makes OOC and Deadchat messages from a specific player not appear to you."
+
+ if(!key_to_ignore)
+ return
+ key_to_ignore = ckey(sanitize(key_to_ignore))
+ if(prefs && prefs.ignored_players)
+ if(key_to_ignore in prefs.ignored_players)
+ usr << "[key_to_ignore] is already being ignored."
+ return
+ prefs.ignored_players |= key_to_ignore
+ prefs.save_preferences()
+ usr << "Now ignoring [key_to_ignore]."
+
+/client/verb/unignore(key_to_unignore as text)
+ set name = "Unignore"
+ set category = "OOC"
+ set desc = "Reverts your ignoring of a specific player."
+
+ if(!key_to_unignore)
+ return
+ key_to_unignore = ckey(sanitize(key_to_unignore))
+ if(prefs && prefs.ignored_players)
+ if(!(key_to_unignore in prefs.ignored_players))
+ usr << "[key_to_unignore] isn't being ignored."
+ return
+ prefs.ignored_players -= key_to_unignore
+ prefs.save_preferences()
+ usr << "Reverted ignore on [key_to_unignore]."
+
+/mob/proc/is_key_ignored(var/key_to_check)
+ if(client)
+ return client.is_key_ignored(key_to_check)
+ return 0
+
+/client/proc/is_key_ignored(var/key_to_check)
+ key_to_check = ckey(key_to_check)
+ if(key_to_check in prefs.ignored_players)
+ if(directory[key_to_check] in admins) // This is here so this is only evaluated if someone is actually being blocked.
+ return 0
+ return 1
+ return 0
\ No newline at end of file
diff --git a/code/game/verbs/ooc.dm b/code/game/verbs/ooc.dm
index 1e976a2afcd..fd9a37935eb 100644
--- a/code/game/verbs/ooc.dm
+++ b/code/game/verbs/ooc.dm
@@ -51,6 +51,8 @@
for(var/client/target in clients)
if(target.is_preference_enabled(/datum/client_preference/show_ooc))
+ if(target.is_key_ignored(key)) // If we're ignored by this person, then do nothing.
+ continue
var/display_name = src.key
if(holder)
if(holder.fakekey)
diff --git a/code/modules/client/preference_setup/general/01_basic.dm b/code/modules/client/preference_setup/general/01_basic.dm
index efd55d37ec3..2588836df56 100644
--- a/code/modules/client/preference_setup/general/01_basic.dm
+++ b/code/modules/client/preference_setup/general/01_basic.dm
@@ -1,12 +1,20 @@
+datum/preferences
+ var/biological_gender = MALE
+ var/identifying_gender = MALE
+
+datum/preferences/proc/set_biological_gender(var/gender)
+ biological_gender = gender
+ identifying_gender = gender
+
/datum/category_item/player_setup_item/general/basic
name = "Basic"
sort_order = 1
- var/list/valid_player_genders = list(MALE, FEMALE, NEUTER, PLURAL)
/datum/category_item/player_setup_item/general/basic/load_character(var/savefile/S)
S["real_name"] >> pref.real_name
S["name_is_always_random"] >> pref.be_random_name
- S["gender"] >> pref.gender
+ S["gender"] >> pref.biological_gender
+ S["id_gender"] >> pref.identifying_gender
S["age"] >> pref.age
S["spawnpoint"] >> pref.spawnpoint
S["OOC_Notes"] >> pref.metadata
@@ -14,7 +22,8 @@
/datum/category_item/player_setup_item/general/basic/save_character(var/savefile/S)
S["real_name"] << pref.real_name
S["name_is_always_random"] << pref.be_random_name
- S["gender"] << pref.gender
+ S["gender"] << pref.biological_gender
+ S["id_gender"] << pref.identifying_gender
S["age"] << pref.age
S["spawnpoint"] << pref.spawnpoint
S["OOC_Notes"] << pref.metadata
@@ -22,27 +31,32 @@
/datum/category_item/player_setup_item/general/basic/sanitize_character()
if(!pref.species) pref.species = "Human"
var/datum/species/S = all_species[pref.species ? pref.species : "Human"]
- pref.age = sanitize_integer(pref.age, S.min_age, S.max_age, initial(pref.age))
- pref.gender = sanitize_inlist(pref.gender, valid_player_genders, pick(valid_player_genders))
- pref.real_name = sanitize_name(pref.real_name, pref.species)
+ pref.age = sanitize_integer(pref.age, S.min_age, S.max_age, initial(pref.age))
+ pref.biological_gender = sanitize_inlist(pref.biological_gender, get_genders(), pick(get_genders()))
+ pref.identifying_gender = (pref.identifying_gender in all_genders_define_list) ? pref.identifying_gender : pref.biological_gender
+ pref.real_name = sanitize_name(pref.real_name, pref.species)
if(!pref.real_name)
- pref.real_name = random_name(pref.gender, pref.species)
- pref.spawnpoint = sanitize_inlist(pref.spawnpoint, spawntypes, initial(pref.spawnpoint))
- pref.be_random_name = sanitize_integer(pref.be_random_name, 0, 1, initial(pref.be_random_name))
+ pref.real_name = random_name(pref.identifying_gender, pref.species)
+ pref.spawnpoint = sanitize_inlist(pref.spawnpoint, spawntypes, initial(pref.spawnpoint))
+ pref.be_random_name = sanitize_integer(pref.be_random_name, 0, 1, initial(pref.be_random_name))
/datum/category_item/player_setup_item/general/basic/content()
- . = "Name: "
+ . = list()
+ . += "Name: "
. += "[pref.real_name] "
- . += "(Random Name) "
- . += "(Always Random Name: [pref.be_random_name ? "Yes" : "No"])"
+ . += "Randomize Name "
+ . += "Always Random Name: [pref.be_random_name ? "Yes" : "No"]"
. += " "
- . += "Gender: [capitalize(lowertext(pref.gender))] "
+ . += "Biological Gender: [gender2text(pref.biological_gender)] "
+ . += "Gender Identity: [gender2text(pref.identifying_gender)] "
. += "Age: [pref.age] "
. += "Spawn Point: [pref.spawnpoint] "
if(config.allow_Metadata)
. += "OOC Notes: Edit "
+ . = jointext(.,null)
/datum/category_item/player_setup_item/general/basic/OnTopic(var/href,var/list/href_list, var/mob/user)
+ var/datum/species/S = all_species[pref.species]
if(href_list["rename"])
var/raw_name = input(user, "Choose your character's name:", "Character Name") as text|null
if (!isnull(raw_name) && CanUseTopic(user))
@@ -55,20 +69,27 @@
return TOPIC_NOACTION
else if(href_list["random_name"])
- pref.real_name = random_name(pref.gender, pref.species)
+ pref.real_name = random_name(pref.identifying_gender, pref.species)
return TOPIC_REFRESH
else if(href_list["always_random_name"])
pref.be_random_name = !pref.be_random_name
return TOPIC_REFRESH
- else if(href_list["gender"])
- pref.gender = next_in_list(pref.gender, valid_player_genders)
+ else if(href_list["bio_gender"])
+ var/new_gender = input(user, "Choose your character's biological gender:", "Character Preference", pref.biological_gender) as null|anything in get_genders()
+ if(new_gender && CanUseTopic(user))
+ pref.set_biological_gender(new_gender)
+ return TOPIC_REFRESH
+
+ else if(href_list["id_gender"])
+ var/new_gender = input(user, "Choose your character's identifying gender:", "Character Preference", pref.identifying_gender) as null|anything in all_genders_define_list
+ if(new_gender && CanUseTopic(user))
+ pref.identifying_gender = new_gender
return TOPIC_REFRESH
else if(href_list["age"])
if(!pref.species) pref.species = "Human"
- var/datum/species/S = all_species[pref.species]
var/new_age = input(user, "Choose your character's age:\n([S.min_age]-[S.max_age])", "Character Preference", pref.age) as num|null
if(new_age && CanUseTopic(user))
pref.age = max(min(round(text2num(new_age)), S.max_age), S.min_age)
@@ -76,8 +97,8 @@
else if(href_list["spawnpoint"])
var/list/spawnkeys = list()
- for(var/S in spawntypes)
- spawnkeys += S
+ for(var/spawntype in spawntypes)
+ spawnkeys += spawntype
var/choice = input(user, "Where would you like to spawn when late-joining?") as null|anything in spawnkeys
if(!choice || !spawntypes[choice] || !CanUseTopic(user)) return TOPIC_NOACTION
pref.spawnpoint = choice
@@ -90,3 +111,12 @@
return TOPIC_REFRESH
return ..()
+
+/datum/category_item/player_setup_item/general/basic/proc/get_genders()
+ var/datum/species/S = all_species[pref.species]
+ var/list/possible_genders = S.genders
+ if(!pref.organ_data || pref.organ_data[BP_TORSO] != "cyborg")
+ return possible_genders
+ possible_genders = possible_genders.Copy()
+ possible_genders |= NEUTER
+ return possible_genders
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/general/03_body.dm b/code/modules/client/preference_setup/general/03_body.dm
index db9fa5227d5..0f26f2d55b6 100644
--- a/code/modules/client/preference_setup/general/03_body.dm
+++ b/code/modules/client/preference_setup/general/03_body.dm
@@ -73,6 +73,7 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
if(!pref.rlimb_data) pref.rlimb_data = list()
/datum/category_item/player_setup_item/general/body/content(var/mob/user)
+ . = list()
pref.update_preview_icon()
if(pref.preview_icon_front && pref.preview_icon_side)
user << browse_rsc(pref.preview_icon_front, "preview_icon.png")
@@ -186,12 +187,13 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
if(has_flag(mob_species, HAS_SKIN_COLOR))
. += " Body Color "
. += "Change Color "
+ . = jointext(.,null)
/datum/category_item/player_setup_item/general/body/proc/has_flag(var/datum/species/mob_species, var/flag)
return mob_species && (mob_species.appearance_flags & flag)
/datum/category_item/player_setup_item/general/body/OnTopic(var/href,var/list/href_list, var/mob/user)
- var/mob_species = all_species[pref.species]
+ var/datum/species/mob_species = all_species[pref.species]
if(href_list["random"])
pref.randomize_appearance_for()
@@ -220,13 +222,17 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/prev_species = pref.species
pref.species = href_list["set_species"]
if(prev_species != pref.species)
+ if(!(pref.biological_gender in mob_species.genders))
+ pref.set_biological_gender(mob_species.genders[1])
+
+
//grab one of the valid hair styles for the newly chosen species
var/list/valid_hairstyles = list()
for(var/hairstyle in hair_styles_list)
var/datum/sprite_accessory/S = hair_styles_list[hairstyle]
- if(pref.gender == MALE && S.gender == FEMALE)
+ if(pref.biological_gender == MALE && S.gender == FEMALE)
continue
- if(pref.gender == FEMALE && S.gender == MALE)
+ if(pref.biological_gender == FEMALE && S.gender == MALE)
continue
if(!(pref.species in S.species_allowed))
continue
@@ -242,9 +248,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/list/valid_facialhairstyles = list()
for(var/facialhairstyle in facial_hair_styles_list)
var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
- if(pref.gender == MALE && S.gender == FEMALE)
+ if(pref.biological_gender == MALE && S.gender == FEMALE)
continue
- if(pref.gender == FEMALE && S.gender == MALE)
+ if(pref.biological_gender == FEMALE && S.gender == MALE)
continue
if(!(pref.species in S.species_allowed))
continue
@@ -336,9 +342,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/list/valid_facialhairstyles = list()
for(var/facialhairstyle in facial_hair_styles_list)
var/datum/sprite_accessory/S = facial_hair_styles_list[facialhairstyle]
- if(pref.gender == MALE && S.gender == FEMALE)
+ if(pref.biological_gender == MALE && S.gender == FEMALE)
continue
- if(pref.gender == FEMALE && S.gender == MALE)
+ if(pref.biological_gender == FEMALE && S.gender == MALE)
continue
if(!(pref.species in S.species_allowed))
continue
@@ -536,9 +542,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
dat += "
"
dat += "Language: [current_species.language] "
dat += ""
- if(current_species.spawn_flags & CAN_JOIN)
+ if(current_species.spawn_flags & SPECIES_CAN_JOIN)
dat += "Often present on human stations."
- if(current_species.spawn_flags & IS_WHITELISTED)
+ if(current_species.spawn_flags & SPECIES_IS_WHITELISTED)
dat += "Whitelist restricted."
if(!current_species.has_organ[O_HEART])
dat += "Does not have a circulatory system."
@@ -566,9 +572,9 @@ var/global/list/valid_bloodtypes = list("A+", "A-", "B+", "B-", "AB+", "AB-", "O
var/restricted = 0
if(config.usealienwhitelist) //If we're using the whitelist, make sure to check it!
- if(!(current_species.spawn_flags & CAN_JOIN))
+ if(!(current_species.spawn_flags & SPECIES_CAN_JOIN))
restricted = 2
- else if((current_species.spawn_flags & IS_WHITELISTED) && !is_alien_whitelisted(preference_mob(),current_species))
+ else if((current_species.spawn_flags & SPECIES_IS_WHITELISTED) && !is_alien_whitelisted(preference_mob(),current_species))
restricted = 1
if(restricted)
diff --git a/code/modules/client/preference_setup/global/02_settings.dm b/code/modules/client/preference_setup/global/02_settings.dm
index 60eeeb144e7..c7635cbb91a 100644
--- a/code/modules/client/preference_setup/global/02_settings.dm
+++ b/code/modules/client/preference_setup/global/02_settings.dm
@@ -61,9 +61,9 @@
. += "| [client_pref.description]: | "
if(pref_mob.is_preference_enabled(client_pref.key))
- . += "[client_pref.enabled_description] | [client_pref.disabled_description] | "
+ . += "[client_pref.enabled_description] | [client_pref.disabled_description] | "
else
- . += "[client_pref.enabled_description] | [client_pref.disabled_description] | "
+ . += "[client_pref.enabled_description] | [client_pref.disabled_description] | "
. += " "
. += " |