diff --git a/_maps/map_files/cyberiad/cyberiad.dmm b/_maps/map_files/cyberiad/cyberiad.dmm
index 71f59dd570f..cbe85bf2755 100644
--- a/_maps/map_files/cyberiad/cyberiad.dmm
+++ b/_maps/map_files/cyberiad/cyberiad.dmm
@@ -2853,7 +2853,7 @@
"bcS" = (/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bcT" = (/obj/structure/noticeboard{pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bcU" = (/obj/machinery/camera{c_tag = "Bar East"; network = list("SS13")},/obj/structure/flora/kirbyplants,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"bcV" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "kitchenbar"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/light{dir = 1},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/kitchen)
+"bcV" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "kitchenbar"; name = "Kitchen Shutters"; opacity = 0},/obj/machinery/light{dir = 1},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bcW" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/obj/machinery/light_switch{pixel_x = 0; pixel_y = 25},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bcX" = (/obj/structure/sink/kitchen{pixel_y = 28},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bcY" = (/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
@@ -2947,7 +2947,7 @@
"beI" = (/obj/structure/piano,/obj/machinery/light{dir = 8},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"beJ" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"beK" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar)
-"beL" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "kitchenbar"; name = "Kitchen Shutters"; opacity = 0},/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/kitchen)
+"beL" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 8; icon_state = "shutter0"; id_tag = "kitchenbar"; name = "Kitchen Shutters"; opacity = 0},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"beM" = (/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"beN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; tag = ""},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"beO" = (/obj/machinery/camera{c_tag = "Kitchen"; network = list("SS13")},/obj/item/device/radio/intercom{broadcasting = 0; name = "station intercom (General)"; pixel_y = 25},/obj/machinery/kitchen_machine/candy_maker,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
@@ -3414,7 +3414,7 @@
"bnH" = (/obj/machinery/camera{c_tag = "Bar South"; dir = 1; network = list("SS13")},/obj/machinery/atmospherics/unary/vent_scrubber{dir = 1; on = 1; scrub_N2O = 1; scrub_Toxins = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bnI" = (/obj/item/device/radio/intercom{pixel_y = -30},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light/small,/turf/simulated/floor/wood,/area/crew_quarters/bar)
"bnJ" = (/obj/machinery/atm{pixel_x = 32; pixel_y = 0},/obj/structure/flora/kirbyplants,/turf/simulated/floor{icon_state = "wood"},/area/crew_quarters/bar)
-"bnK" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/machinery/vending/dinnerware,/turf/simulated/floor{icon_state = "grimy"},/area/crew_quarters/kitchen)
+"bnK" = (/obj/structure/extinguisher_cabinet{pixel_x = 0; pixel_y = -30},/obj/machinery/vending/dinnerware,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bnL" = (/obj/machinery/icemachine,/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bnM" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/fancy/donut_box,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "kitchenhall"; name = "Kitchen Shutters"; opacity = 0},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
"bnN" = (/obj/structure/table/reinforced,/obj/machinery/door/firedoor,/obj/machinery/door/poddoor/shutters{density = 0; dir = 2; icon_state = "shutter0"; id_tag = "kitchenhall"; name = "Kitchen Shutters"; opacity = 0},/turf/simulated/floor{dir = 2; icon_state = "cafeteria"; tag = "icon-cafeteria (NORTHEAST)"},/area/crew_quarters/kitchen)
diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index a7fe9ddd537..3f287964e02 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -214,6 +214,7 @@ Pipelines + Other Objects -> Pipe network
initialize_directions = P
var/turf/T = loc
level = T.intact ? 2 : 1
+ add_fingerprint(usr)
initialize()
var/list/nodes = pipeline_expansion()
for(var/obj/machinery/atmospherics/A in nodes)
diff --git a/code/ATMOSPHERICS/pipes/pipe.dm b/code/ATMOSPHERICS/pipes/pipe.dm
index 7041d13993d..b02d990b432 100644
--- a/code/ATMOSPHERICS/pipes/pipe.dm
+++ b/code/ATMOSPHERICS/pipes/pipe.dm
@@ -13,7 +13,6 @@
buckle_requires_restraints = 1
buckle_lying = -1
-
/obj/machinery/atmospherics/pipe/New()
..()
//so pipes under walls are hidden
diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm
index 12865047f0a..6de010d5f60 100644
--- a/code/__DEFINES/misc.dm
+++ b/code/__DEFINES/misc.dm
@@ -162,4 +162,9 @@
#define MAT_BANANIUM "$bananium"
#define MAX_STACK_SIZE 50
-//The maximum size of a stack object.
\ No newline at end of file
+
+//unmagic-strings for types of polls
+#define POLLTYPE_OPTION "OPTION"
+#define POLLTYPE_TEXT "TEXT"
+#define POLLTYPE_RATING "NUMVAL"
+#define POLLTYPE_MULTI "MULTICHOICE"
\ No newline at end of file
diff --git a/code/_globalvars/lists/misc.dm b/code/_globalvars/lists/misc.dm
index f6e02c32602..d6fc14b4f3f 100644
--- a/code/_globalvars/lists/misc.dm
+++ b/code/_globalvars/lists/misc.dm
@@ -21,4 +21,4 @@ var/list/restricted_camera_networks = list( //Those networks can only be accesse
"UO45",
"UO45R",
"Xeno"
- )
\ No newline at end of file
+ )
diff --git a/code/_globalvars/lists/reagents.dm b/code/_globalvars/lists/reagents.dm
new file mode 100644
index 00000000000..8088219e149
--- /dev/null
+++ b/code/_globalvars/lists/reagents.dm
@@ -0,0 +1,12 @@
+// Base chemicals
+var/list/base_chemicals = list("water","oxygen","nitrogen","hydrogen","potassium","mercury","carbon","chlorine","fluorine","phosphorus","lithium","sulfur","sacid","radium","iron","aluminum","silicon","sugar","ethanol")
+// Standard chemicals
+var/list/standard_chemicals = list("slimejelly","blood","water","lube","charcoal","toxin","cyanide","morphine","epinephrine","space_drugs","serotrotium","oxygen","copper","nitrogen","hydrogen","potassium","mercury","sulfur","carbon","chlorine","fluorine","sodium","phosphorus","lithium","sugar","sacid","facid","glycerol","radium","mutadone","thermite","mutagen","virusfood","iron","gold","silver","uranium","aluminum","silicon","fuel","cleaner","atrazine","plasma","teporone","lexorin","silver_sulfadiazine","salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol","potass_iodide","pen_acid","mannitol","oculine","styptic_powder","methamphetamine","cryoxadone","spaceacillin","carpotoxin","lsd","fluorosurfactant","fluorosurfactant","ethanol","ammonia","diethylamine","antihol","pancuronium","lipolicide","condensedcapsaicin","frostoil","amanitin","psilocybin","enzyme","nothing","salglu_solution","antifreeze","neurotoxin")
+// Rare chemicals
+var/list/rare_chemicals = list("minttoxin","nanites","xenomicrobes","adminordrazine")
+// Standard medicines
+var/list/standard_medicines = list("charcoal","toxin","cyanide","morphine","epinephrine","space_drugs","serotrotium","mutadone","mutagen","teporone","lexorin","silver_sulfadiazine","salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol","potass_iodide","pen_acid","mannitol","oculine","styptic_powder","methamphetamine","spaceacillin","carpotoxin","lsd","ethanol","ammonia","diethylamine","antihol","pancuronium","lipolicide","condensedcapsaicin","frostoil","amanitin","psilocybin","nothing","salglu_solution","neurotoxin")
+// Rare medicines
+var/list/rare_medicines = list("nanites","xenomicrobes","minttoxin","adminordrazine","blood")
+// Drinks
+var/list/drinks = list("beer2","hot_coco","orangejuice","tomatojuice","limejuice","carrotjuice","berryjuice","poisonberryjuice","watermelonjuice","lemonjuice","banana","nothing","potato","milk","soymilk","cream","coffee","tea","icecoffee","icetea","cola","nuka_cola","spacemountainwind","thirteenloko","dr_gibb","space_up","lemon_lime","beer","whiskey","gin","rum","vodka","holywater","tequilla","vermouth","wine","tonic","kahlua","cognac","ale","sodawater","ice","bilk","atomicbomb","threemileisland","goldschlager","patron","gintonic","cubalibre","whiskeycola","martini","vodkamartini","whiterussian","screwdrivercocktail","booger","bloodymary","gargleblaster","bravebull","tequillasunrise","toxinsspecial","beepskysmash","salglu_solution","irishcream","manlydorf","longislandicedtea","moonshine","b52","irishcoffee","margarita","blackrussian","manhattan","manhattan_proj","whiskeysoda","antifreeze","barefoot","snowwhite","demonsblood","vodkatonic","ginfizz","bahama_mama","singulo","sbiten","devilskiss","red_mead","mead","iced_beer","grog","aloe","andalusia","alliescocktail","soy_latte","cafe_latte","acidspit","amasec","neurotoxin","hippiesdelight","bananahonk","silencer","changelingsting","irishcarbomb","syndicatebomb","erikasurprise","driestmartini")
\ No newline at end of file
diff --git a/code/datums/uplink_item.dm b/code/datums/uplink_item.dm
index 1eabdb002af..c287c00975d 100644
--- a/code/datums/uplink_item.dm
+++ b/code/datums/uplink_item.dm
@@ -767,11 +767,11 @@ var/list/uplink_items = list()
cost = 3
gamemodes = list("nuclear emergency")
-/datum/uplink_item/device_tools/pdapinpointer
- name = "PDA Pinpointer"
- desc = "A pinpointer that tracks any PDA on the station. Useful for locating assassination targets or other high-value targets that you can't find. WARNING: Can only set once."
- reference = "PDAP"
- item = /obj/item/weapon/pinpointer/pdapinpointer
+/datum/uplink_item/device_tools/advpinpointer
+ name = "Advanced Pinpointer"
+ desc = "A pinpointer that tracks any specified coordinates, DNA string, high value item or the nuclear authentication disk."
+ reference = "ADVP"
+ item = /obj/item/weapon/pinpointer/advpinpointer
cost = 4
/datum/uplink_item/device_tools/ai_detector
diff --git a/code/game/dna/genes/goon_disabilities.dm b/code/game/dna/genes/goon_disabilities.dm
index 450973dc6a7..14e25c4ef69 100644
--- a/code/game/dna/genes/goon_disabilities.dm
+++ b/code/game/dna/genes/goon_disabilities.dm
@@ -36,11 +36,12 @@
..()
block=RADBLOCK
- OnMobLife(var/mob/owner)
- owner.radiation = max(owner.radiation, 20)
+ OnMobLife(var/mob/living/owner)
+ owner.apply_effect(max(owner.radiation, 20), IRRADIATE)
for(var/mob/living/L in range(1, owner))
- if(L == owner) continue
- L << "\red You are enveloped by a soft green glow emanating from [owner]."
+ if(L == owner)
+ continue
+ L << "You are enveloped by a soft green glow emanating from [owner]."
L.apply_effect(5, IRRADIATE)
return
diff --git a/code/game/gamemodes/mutiny/key_pinpointer.dm b/code/game/gamemodes/mutiny/key_pinpointer.dm
index 7e8d628d85b..9bee2b92c92 100644
--- a/code/game/gamemodes/mutiny/key_pinpointer.dm
+++ b/code/game/gamemodes/mutiny/key_pinpointer.dm
@@ -13,7 +13,7 @@
mode = 1
active = 1
target = mutiny.captains_key
- workobj()
+ point_at(target)
usr << "\blue You calibrate \the [src] to locate the Captain's Authentication Key."
if (1)
mode = 2
diff --git a/code/game/gamemodes/nations/flag_pinpointer.dm b/code/game/gamemodes/nations/flag_pinpointer.dm
index 028f3cbb357..776932bbb7b 100644
--- a/code/game/gamemodes/nations/flag_pinpointer.dm
+++ b/code/game/gamemodes/nations/flag_pinpointer.dm
@@ -8,7 +8,7 @@
mode = 1
active = 1
target = locate(/obj/item/flag/nation/atmos)
- workobj()
+ point_at(target)
usr << "\blue You calibrate \the [src] to locate the [target.name]"
if (1)
mode = 2
diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm
index 572d87e149e..29a0a3cc61c 100644
--- a/code/game/gamemodes/nuclear/pinpointer.dm
+++ b/code/game/gamemodes/nuclear/pinpointer.dm
@@ -12,396 +12,26 @@
var/obj/item/weapon/disk/nuclear/the_disk = null
var/active = 0
- Destroy()
- active = 0
- the_disk = null
- return ..()
-
- attack_self()
- if(!active)
- active = 1
- workdisk()
- usr << "\blue You activate the pinpointer"
- else
- active = 0
- icon_state = "pinoff"
- usr << "\blue You deactivate the pinpointer"
-
- proc/workdisk()
- if(!active) return
- if(!the_disk)
- the_disk = locate()
- if(!the_disk)
- icon_state = "pinonnull"
- return
- dir = get_dir(src,the_disk)
- switch(get_dist(src,the_disk))
- if(0)
- icon_state = "pinondirect"
- if(1 to 8)
- icon_state = "pinonclose"
- if(9 to 16)
- icon_state = "pinonmedium"
- if(16 to INFINITY)
- icon_state = "pinonfar"
- spawn(5) .()
-
- examine(mob/user)
- ..(user)
- for(var/obj/machinery/nuclearbomb/bomb in world)
- if(bomb.timing)
- user << "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]"
-
-
-/obj/item/weapon/pinpointer/advpinpointer
- name = "Advanced Pinpointer"
- icon = 'icons/obj/device.dmi'
- desc = "A larger version of the normal pinpointer, this unit features a helpful quantum entanglement detection system to locate various objects that do not broadcast a locator signal."
- var/mode = 0 // Mode 0 locates disk, mode 1 locates coordinates.
- var/turf/location = null
- var/obj/target = null
-
- attack_self()
- if(!active)
- active = 1
- if(mode == 0)
- workdisk()
- if(mode == 1)
- worklocation()
- if(mode == 2)
- workobj()
- usr << "\blue You activate the pinpointer"
- else
- active = 0
- icon_state = "pinoff"
- usr << "\blue You deactivate the pinpointer"
-
-
- proc/worklocation()
- if(!active)
- return
- if(!location)
- icon_state = "pinonnull"
- return
- dir = get_dir(src,location)
- switch(get_dist(src,location))
- if(0)
- icon_state = "pinondirect"
- if(1 to 8)
- icon_state = "pinonclose"
- if(9 to 16)
- icon_state = "pinonmedium"
- if(16 to INFINITY)
- icon_state = "pinonfar"
- spawn(5) .()
-
-
- proc/workobj()
- if(!active)
- return
- if(!target)
- icon_state = "pinonnull"
- return
- dir = get_dir(src,target)
- switch(get_dist(src,target))
- if(0)
- icon_state = "pinondirect"
- if(1 to 8)
- icon_state = "pinonclose"
- if(9 to 16)
- icon_state = "pinonmedium"
- if(16 to INFINITY)
- icon_state = "pinonfar"
- spawn(5) .()
-
-/obj/item/weapon/pinpointer/advpinpointer/verb/toggle_mode()
- set category = "Object"
- set name = "Toggle Pinpointer Mode"
- set src in view(1)
-
+/obj/item/weapon/pinpointer/Destroy()
active = 0
- icon_state = "pinoff"
- target=null
- location = null
+ the_disk = null
+ return ..()
- switch(alert("Please select the mode you want to put the pinpointer in.", "Pinpointer Mode Select", "Location", "Disk Recovery", "Other Signature"))
- if("Location")
- mode = 1
-
- var/locationx = input(usr, "Please input the x coordinate to search for.", "Location?" , "") as num
- if(!locationx || !(usr in view(1,src)))
- return
- var/locationy = input(usr, "Please input the y coordinate to search for.", "Location?" , "") as num
- if(!locationy || !(usr in view(1,src)))
- return
-
- var/turf/Z = get_turf(src)
-
- location = locate(locationx,locationy,Z.z)
-
- usr << "You set the pinpointer to locate [locationx],[locationy]"
-
-
- return attack_self()
-
- if("Disk Recovery")
- mode = 0
- return attack_self()
-
- if("Other Signature")
- mode = 2
- switch(alert("Search for item signature or DNA fragment?" , "Signature Mode Select" , "" , "Item" , "DNA"))
- if("Item")
- var/list/item_names[0]
- var/list/item_paths[0]
- for(var/typepath in potential_theft_objectives)
- var/obj/item/tmp_object=new typepath
- var/n="[tmp_object]"
- item_names+=n
- item_paths[n]=typepath
- qdel(tmp_object)
- var/targetitem = input("Select item to search for.", "Item Mode Select","") as null|anything in potential_theft_objectives
- if(!targetitem)
- return
- target=locate(item_paths[targetitem])
- if(!target)
- usr << "Failed to locate [targetitem]!"
- return
- usr << "You set the pinpointer to locate [targetitem]"
- if("DNA")
- var/DNAstring = input("Input DNA string to search for." , "Please Enter String." , "")
- if(!DNAstring)
- return
- for(var/mob/living/carbon/M in mob_list)
- if(!M.dna)
- continue
- if(M.dna.unique_enzymes == DNAstring)
- target = M
- break
-
- return attack_self()
-
-
-///////////////////////
-//nuke op pinpointers//
-///////////////////////
-
-
-/obj/item/weapon/pinpointer/nukeop
- var/mode = 0 //Mode 0 locates disk, mode 1 locates the shuttle
- var/obj/machinery/computer/shuttle_control/multi/syndicate/home = null
- slot_flags = SLOT_PDA | SLOT_BELT
-
-/obj/item/weapon/pinpointer/nukeop/attack_self(mob/user as mob)
+/obj/item/weapon/pinpointer/attack_self()
if(!active)
active = 1
- if(!mode)
- workdisk()
- user << "Authentication Disk Locator active."
- else
- worklocation()
- user << "Shuttle Locator active."
- else
- active = 0
- icon_state = "pinoff"
- user << "You deactivate the pinpointer."
-
-
-/obj/item/weapon/pinpointer/nukeop/workdisk()
- if(!active) return
- if(mode) //Check in case the mode changes while operating
- worklocation()
- return
- if(bomb_set) //If the bomb is set, lead to the shuttle
- mode = 1 //Ensures worklocation() continues to work
- worklocation()
- playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) //Plays a beep
- visible_message("Shuttle Locator active.") //Lets the mob holding it know that the mode has changed
- return //Get outta here
- if(!the_disk)
- the_disk = locate()
- if(!the_disk)
- icon_state = "pinonnull"
- return
-// if(loc.z != the_disk.z) //If you are on a different z-level from the disk
-// icon_state = "pinonnull"
-// else
- dir = get_dir(src, the_disk)
- switch(get_dist(src, the_disk))
- if(0)
- icon_state = "pinondirect"
- if(1 to 8)
- icon_state = "pinonclose"
- if(9 to 16)
- icon_state = "pinonmedium"
- if(16 to INFINITY)
- icon_state = "pinonfar"
-
- spawn(5) .()
-
-
-/obj/item/weapon/pinpointer/nukeop/proc/worklocation()
- if(!active) return
- if(!mode)
workdisk()
- return
- if(!bomb_set)
- mode = 0
- workdisk()
- playsound(loc, 'sound/machines/twobeep.ogg', 50, 1)
- visible_message("Authentication Disk Locator active.")
- return
- if(!home)
- home = locate()
- if(!home)
- icon_state = "pinonnull"
- return
- if(loc.z != home.z) //If you are on a different z-level from the shuttle
- icon_state = "pinonnull"
- else
- dir = get_dir(src, home)
- switch(get_dist(src, home))
- if(0)
- icon_state = "pinondirect"
- if(1 to 8)
- icon_state = "pinonclose"
- if(9 to 16)
- icon_state = "pinonmedium"
- if(16 to INFINITY)
- icon_state = "pinonfar"
-
- spawn(5) .()
-
-/obj/item/weapon/pinpointer/pdapinpointer
- name = "pda pinpointer"
- desc = "A pinpointer that has been illegally modified to track the PDA of a crewmember for malicious reasons."
- var/obj/target = null
- var/used = 0
-
- attack_self()
- if(!active)
- active = 1
- point_at(target)
- usr << "\blue You activate the pinpointer"
- else
- active = 0
- icon_state = "pinoff"
- usr << "\blue You deactivate the pinpointer"
-
- verb/select_pda()
- set category = "Object"
- set name = "Select pinpointer target"
- set src in view(1)
-
- if(used)
- usr << "Target has already been set!"
- return
-
- var/list/L = list()
- L["Cancel"] = "Cancel"
- var/length = 1
- for (var/obj/item/device/pda/P in world)
- if(P.name != "\improper PDA")
- L[text("([length]) [P.name]")] = P
- length++
-
- var/t = input("Select pinpointer target. WARNING: Can only set once.") as null|anything in L
- if(t == "Cancel")
- return
- target = L[t]
- if(!target)
- usr << "Failed to locate [target]!"
- return
- active = 1
- point_at(target)
- usr << "You set the pinpointer to locate [target]"
- used = 1
-
-
- examine(mob/user)
- ..(user)
- if (target)
- user << "\blue Tracking [target]"
-
- proc/point_at(atom/target)
- if(!active)
- return
- if(!target)
- icon_state = "pinonnull"
- return
-
- var/turf/T = get_turf(target)
- var/turf/L = get_turf(src)
-
- if((!T) || (!L)) // Someone is no longer in the world...
- icon_state = "pinonnull"
- return
-
- if(T.z != L.z)
- icon_state = "pinonnull"
- else
- dir = get_dir(L, T)
- switch(get_dist(L, T))
- if(-1)
- icon_state = "pinondirect"
- if(1 to 8)
- icon_state = "pinonclose"
- if(9 to 16)
- icon_state = "pinonmedium"
- if(16 to INFINITY)
- icon_state = "pinonfar"
- spawn(5)
- .()
-
-/obj/item/weapon/pinpointer/operative
- name = "operative pinpointer"
- icon = 'icons/obj/device.dmi'
- desc = "A pinpointer that leads to the first Syndicate operative detected."
- var/mob/living/carbon/nearest_op = null
-
-/obj/item/weapon/pinpointer/operative/attack_self()
- if(!usr.mind || !(usr.mind in ticker.mode.syndicates))
- usr << "AUTHENTICATION FAILURE. ACCESS DENIED."
- return 0
- if(!active)
- active = 1
- workop()
usr << "You activate the pinpointer."
else
active = 0
icon_state = "pinoff"
usr << "You deactivate the pinpointer."
+
+/obj/item/weapon/pinpointer/proc/scandisk()
+ if(!the_disk)
+ the_disk = locate()
-/obj/item/weapon/pinpointer/operative/proc/scan_for_ops()
- if(active)
- nearest_op = null //Resets nearest_op every time it scans
- var/closest_distance = 1000
- for(var/mob/living/carbon/M in mob_list)
- if(M.mind && (M.mind in ticker.mode.syndicates))
- if(get_dist(M, get_turf(src)) < closest_distance) //Actually points toward the nearest op, instead of a random one like it used to
- nearest_op = M
- if(!nearest_op) // There are simply no operatives left to point to
- active = 0
- icon_state = "pinoff"
-
-/obj/item/weapon/pinpointer/operative/proc/workop()
- if(active)
- scan_for_ops()
- point_at(nearest_op, 0)
- spawn(5)
- .()
- else
- return 0
-
-/obj/item/weapon/pinpointer/operative/examine(mob/user)
- ..()
- if(active)
- if(nearest_op)
- user << "Nearest operative detected is [nearest_op.real_name]."
- else
- user << "No operatives detected within scanning range."
-
-/obj/item/weapon/pinpointer/operative/proc/point_at(atom/target, spawnself = 1)
+/obj/item/weapon/pinpointer/proc/point_at(atom/target, spawnself = 1)
if(!active)
return
if(!target)
@@ -426,4 +56,242 @@
icon_state = "pinonfar"
if(spawnself)
spawn(5)
- .()
\ No newline at end of file
+ .()
+
+/obj/item/weapon/pinpointer/proc/workdisk()
+ scandisk()
+ point_at(the_disk, 0)
+ spawn(5)
+ .()
+
+/obj/item/weapon/pinpointer/examine(mob/user)
+ ..(user)
+ for(var/obj/machinery/nuclearbomb/bomb in machines)
+ if(bomb.timing)
+ user << "Extreme danger. Arming signal detected. Time remaining: [bomb.timeleft]"
+
+/obj/item/weapon/pinpointer/advpinpointer
+ name = "advanced pinpointer"
+ desc = "A larger version of the normal pinpointer, this unit features a helpful quantum entanglement detection system to locate various objects that do not broadcast a locator signal."
+ var/mode = 0 // Mode 0 locates disk, mode 1 locates coordinates.
+ var/turf/location = null
+ var/obj/target = null
+
+/obj/item/weapon/pinpointer/advpinpointer/attack_self()
+ if(!active)
+ active = 1
+ if(mode == 0)
+ workdisk()
+ if(mode == 1)
+ point_at(location)
+ if(mode == 2)
+ point_at(target)
+ usr << "You activate the pinpointer."
+ else
+ active = 0
+ icon_state = "pinoff"
+ usr << "You deactivate the pinpointer."
+
+/obj/item/weapon/pinpointer/advpinpointer/workdisk()
+ if(mode == 0)
+ scandisk()
+ point_at(the_disk, 0)
+ spawn(5)
+ .()
+
+/obj/item/weapon/pinpointer/advpinpointer/verb/toggle_mode()
+ set category = "Object"
+ set name = "Toggle Pinpointer Mode"
+ set src in usr
+
+ if(usr.stat || usr.restrained())
+ return
+
+ active = 0
+ icon_state = "pinoff"
+ target = null
+ location = null
+
+ switch(alert("Please select the mode you want to put the pinpointer in.", "Pinpointer Mode Select", "Location", "Disk Recovery", "Other Signature"))
+ if("Location")
+ mode = 1
+
+ var/locationx = input(usr, "Please input the x coordinate to search for.", "Location?" , "") as num
+ if(!locationx || !(usr in view(1,src)))
+ return
+ var/locationy = input(usr, "Please input the y coordinate to search for.", "Location?" , "") as num
+ if(!locationy || !(usr in view(1,src)))
+ return
+
+ var/turf/Z = get_turf(src)
+
+ location = locate(locationx,locationy,Z.z)
+
+ usr << "You set the pinpointer to locate [locationx],[locationy]"
+
+
+ return attack_self()
+
+ if("Disk Recovery")
+ mode = 0
+ return attack_self()
+
+ if("Other Signature")
+ mode = 2
+ switch(alert("Search for item signature or DNA fragment?" , "Signature Mode Select" , "Item" , "DNA"))
+ if("Item")
+ var/list/item_names[0]
+ var/list/item_paths[0]
+ for(var/objective in potential_theft_objectives)
+ var/datum/theft_objective/T = objective
+ var/name = initial(T.name)
+ item_names += name
+ item_paths[name] = initial(T.typepath)
+ var/targetitem = input("Select item to search for.", "Item Mode Select","") as null|anything in item_names
+ if(!targetitem)
+ return
+ target = locate(item_paths[targetitem])
+ if(!target)
+ usr << "Failed to locate [targetitem]!"
+ return
+ usr << "You set the pinpointer to locate [targetitem]."
+ if("DNA")
+ var/DNAstring = input("Input DNA string to search for." , "Please Enter String." , "")
+ if(!DNAstring)
+ return
+ for(var/mob/living/carbon/C in mob_list)
+ if(!C.dna)
+ continue
+ if(C.dna.unique_enzymes == DNAstring)
+ target = C
+ break
+
+ return attack_self()
+
+///////////////////////
+//nuke op pinpointers//
+///////////////////////
+/obj/item/weapon/pinpointer/nukeop
+ var/mode = 0 //Mode 0 locates disk, mode 1 locates the shuttle
+ var/obj/machinery/computer/shuttle_control/multi/syndicate/home = null
+ slot_flags = SLOT_PDA | SLOT_BELT
+
+/obj/item/weapon/pinpointer/nukeop/attack_self(mob/user as mob)
+ if(!active)
+ active = 1
+ if(!mode)
+ workdisk()
+ user << "Authentication Disk Locator active."
+ else
+ worklocation()
+ user << "Shuttle Locator active."
+ else
+ active = 0
+ icon_state = "pinoff"
+ user << "You deactivate the pinpointer."
+
+/obj/item/weapon/pinpointer/nukeop/workdisk()
+ if(!active) return
+ if(mode) //Check in case the mode changes while operating
+ worklocation()
+ return
+ if(bomb_set) //If the bomb is set, lead to the shuttle
+ mode = 1 //Ensures worklocation() continues to work
+ worklocation()
+ playsound(loc, 'sound/machines/twobeep.ogg', 50, 1) //Plays a beep
+ visible_message("Shuttle Locator mode actived.") //Lets the mob holding it know that the mode has changed
+ return //Get outta here
+ scandisk()
+ if(!the_disk)
+ icon_state = "pinonnull"
+ return
+ dir = get_dir(src, the_disk)
+ switch(get_dist(src, the_disk))
+ if(0)
+ icon_state = "pinondirect"
+ if(1 to 8)
+ icon_state = "pinonclose"
+ if(9 to 16)
+ icon_state = "pinonmedium"
+ if(16 to INFINITY)
+ icon_state = "pinonfar"
+
+ spawn(5) .()
+
+/obj/item/weapon/pinpointer/nukeop/proc/worklocation()
+ if(!active)
+ return
+ if(!mode)
+ workdisk()
+ return
+ if(!bomb_set)
+ mode = 0
+ workdisk()
+ playsound(loc, 'sound/machines/twobeep.ogg', 50, 1)
+ visible_message("Authentication Disk Locator mode actived.")
+ return
+ if(!home)
+ home = locate()
+ if(!home)
+ icon_state = "pinonnull"
+ return
+ if(loc.z != home.z) //If you are on a different z-level from the shuttle
+ icon_state = "pinonnull"
+ else
+ dir = get_dir(src, home)
+ switch(get_dist(src, home))
+ if(0)
+ icon_state = "pinondirect"
+ if(1 to 8)
+ icon_state = "pinonclose"
+ if(9 to 16)
+ icon_state = "pinonmedium"
+ if(16 to INFINITY)
+ icon_state = "pinonfar"
+
+ spawn(5)
+ .()
+
+/obj/item/weapon/pinpointer/operative
+ name = "operative pinpointer"
+ desc = "A pinpointer that leads to the first Syndicate operative detected."
+ var/mob/living/carbon/nearest_op = null
+
+/obj/item/weapon/pinpointer/operative/attack_self()
+ if(!usr.mind || !(usr.mind in ticker.mode.syndicates))
+ usr << "AUTHENTICATION FAILURE. ACCESS DENIED."
+ return 0
+ if(!active)
+ active = 1
+ workop()
+ usr << "You activate the pinpointer."
+ else
+ active = 0
+ icon_state = "pinoff"
+ usr << "You deactivate the pinpointer."
+
+/obj/item/weapon/pinpointer/operative/proc/scan_for_ops()
+ if(active)
+ nearest_op = null //Resets nearest_op every time it scans
+ var/closest_distance = 1000
+ for(var/mob/living/carbon/M in mob_list)
+ if(M.mind && (M.mind in ticker.mode.syndicates))
+ if(get_dist(M, get_turf(src)) < closest_distance) //Actually points toward the nearest op, instead of a random one like it used to
+ nearest_op = M
+
+/obj/item/weapon/pinpointer/operative/proc/workop()
+ if(active)
+ scan_for_ops()
+ point_at(nearest_op, 0)
+ spawn(5)
+ .()
+ else
+ return 0
+
+/obj/item/weapon/pinpointer/operative/examine(mob/user)
+ ..()
+ if(active)
+ if(nearest_op)
+ user << "Nearest operative detected is [nearest_op.real_name]."
+ else
+ user << "No operatives detected within scanning range."
diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm
index 86d7b5ac00d..8cbe56b2d3b 100644
--- a/code/game/machinery/alarm.dm
+++ b/code/game/machinery/alarm.dm
@@ -607,9 +607,6 @@
src.add_hiddenprint(user)
return ui_interact(user)
-/obj/machinery/alarm/attack_robot(mob/user)
- return attack_ai(user)
-
/obj/machinery/alarm/attack_ghost(user as mob)
if(stat & (BROKEN|MAINT))
return
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index ab437a4a1e9..bed10ccf131 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -337,8 +337,6 @@ Class Procs:
return src.attack_hand(user)
/obj/machinery/attack_hand(mob/user as mob)
- if(!interact_offline && stat & (NOPOWER|BROKEN|MAINT))
- return 1
if(user.lying || user.stat)
return 1
@@ -346,11 +344,6 @@ Class Procs:
user << "You don't have the dexterity to do this!"
return 1
-/*
- //distance checks are made by atom/proc/DblClick
- if ((get_dist(src, user) > 1 || !istype(src.loc, /turf)) && !istype(user, /mob/living/silicon))
- return 1
-*/
if (ishuman(user))
var/mob/living/carbon/human/H = user
if(H.getBrainLoss() >= 60)
@@ -359,10 +352,17 @@ Class Procs:
else if(prob(H.getBrainLoss()))
user << "You momentarily forget how to use [src]."
return 1
+
+ if(panel_open)
+ src.add_fingerprint(user)
+ return 0
+
+ if(!interact_offline && stat & (NOPOWER|BROKEN|MAINT))
+ return 1
src.add_fingerprint(user)
- return 0
+ return ..()
/obj/machinery/CheckParts()
RefreshParts()
diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm
index 7ff7cc466d8..2d568cf1f30 100644
--- a/code/game/machinery/rechargestation.dm
+++ b/code/game/machinery/rechargestation.dm
@@ -145,20 +145,23 @@
for(var/obj/O in um)
// Engineering
if(istype(O,/obj/item/stack/sheet/metal) || istype(O,/obj/item/stack/sheet/rglass) || istype(O,/obj/item/stack/cable_coil))
- if(O:amount < 50)
- O:amount += 1 * coeff
+ var/obj/item/stack/sheet/S = O
+ if(S.amount < 50)
+ S.amount += 1 * coeff
// Security
if(istype(O,/obj/item/device/flash))
- if(O:broken)
- O:broken = 0
- O:times_used = 0
- O:icon_state = "flash"
+ var/obj/item/device/flash/F = O
+ if(F.broken)
+ F.broken = 0
+ F.times_used = 0
+ F.icon_state = "flash"
if(istype(O,/obj/item/weapon/gun/energy/disabler/cyborg))
- if(O:power_supply.charge < O:power_supply.maxcharge)
- O:power_supply.give(O:charge_cost)
- O:update_icon()
+ var/obj/item/weapon/gun/energy/disabler/cyborg/D = O
+ if(D.power_supply.charge < D.power_supply.maxcharge)
+ D.power_supply.give(D.charge_cost)
+ D.update_icon()
else
- O:charge_tick = 0
+ D.charge_tick = 0
if(istype(O,/obj/item/weapon/melee/baton))
var/obj/item/weapon/melee/baton/B = O
if(B.bcell)
@@ -178,15 +181,6 @@
var/i = 1
for(1, i <= coeff, i++)
LR.Charge(occupant)
- //Alien
- if(istype(O,/obj/item/weapon/reagent_containers/spray/alien/smoke))
- if(O.reagents.get_reagent_amount("water") < 50)
- O.reagents.add_reagent("water", 2 * coeff)
- if(istype(O,/obj/item/weapon/reagent_containers/spray/alien/stun))
- if(O.reagents.get_reagent_amount("ether") < 250)
- O.reagents.add_reagent("ether", 2 * coeff)
-
-
if(R)
if(R.module)
R.module.respawn_consumable(R)
diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm
index 14f9f42ec06..a4e9739868d 100644
--- a/code/game/objects/buckling.dm
+++ b/code/game/objects/buckling.dm
@@ -12,6 +12,11 @@
. = ..()
if(can_buckle && buckled_mob)
return user_unbuckle_mob(user)
+
+/atom/movable/attack_robot(mob/living/user)
+ . = ..()
+ if(can_buckle && buckled_mob && Adjacent(user)) // attack_robot is called on all ranges, so the Adjacent check is needed
+ return user_unbuckle_mob(user)
/atom/movable/MouseDrop_T(mob/living/M, mob/living/user)
. = ..()
diff --git a/code/game/objects/items/random_items.dm b/code/game/objects/items/random_items.dm
index 81d9a7769e5..b08245b010f 100644
--- a/code/game/objects/items/random_items.dm
+++ b/code/game/objects/items/random_items.dm
@@ -47,8 +47,7 @@
New()
..()
var/datum/reagent/R = pick(chemical_reagents_list)
- var/global/list/rare_chems = list("minttoxin","nanites","xenomicrobes","adminordrazine")
- if(rare_chems.Find(R))
+ if(rare_chemicals.Find(R))
reagents.add_reagent(R,10)
else
reagents.add_reagent(R,rand(2,3)*10)
@@ -61,11 +60,9 @@
// identify_probability = 0
New()
..()
- var/global/list/chems_only = list("slimejelly","blood","water","lube","charcoal","toxin","cyanide","morphine","epinephrine","space_drugs","serotrotium","oxygen","copper","nitrogen","hydrogen","potassium","mercury","sulfur","carbon","chlorine","fluorine","sodium","phosphorus","lithium","sugar","sacid","facid","glycerol","radium","mutadone","thermite","mutagen","virusfood","iron","gold","silver","uranium","aluminum","silicon","fuel","cleaner","atrazine","plasma","teporone","lexorin","silver_sulfadiazine","salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol","potass_iodide","pen_acid","mannitol","oculine","styptic_powder","methamphetamine","cryoxadone","spaceacillin","carpotoxin","lsd","fluorosurfactant","fluorosurfactant","ethanol","ammonia","diethylamine","antihol","pancuronium","lipolicide","condensedcapsaicin","frostoil","amanitin","psilocybin","enzyme","nothing","salglu_solution","antifreeze","neurotoxin")
- var/global/list/rare_chems = list("minttoxin","nanites","xenomicrobes","adminordrazine")
- var/datum/reagent/R = pick(chems_only + rare_chems)
- if(rare_chems.Find(R))
+ var/datum/reagent/R = pick(standard_chemicals + rare_chemicals)
+ if(rare_chemicals.Find(R))
reagents.add_reagent(R,10)
else
reagents.add_reagent(R,rand(2,3)*10)
@@ -78,35 +75,35 @@
// identify_probability = 0
New()
..()
- var/global/list/base_chems = list("water","oxygen","nitrogen","hydrogen","potassium","mercury","carbon","chlorine","fluorine","phosphorus","lithium","sulfur","sacid","radium","iron","aluminum","silicon","sugar","ethanol")
- var/datum/reagent/R = pick(base_chems)
+ var/datum/reagent/R = pick(base_chemicals)
reagents.add_reagent(R,rand(2,6)*5)
name = "unlabelled bottle"
pixel_x = rand(-10,10)
pixel_y = rand(-10,10)
+
/obj/item/weapon/reagent_containers/food/drinks/bottle/random_drink
name = "unlabelled drink"
icon = 'icons/obj/drinks.dmi'
New()
..()
- var/list/drinks_only = list("beer2","hot_coco","orangejuice","tomatojuice","limejuice","carrotjuice","berryjuice","poisonberryjuice","watermelonjuice","lemonjuice","banana","nothing","potato","milk","soymilk","cream","coffee","tea","icecoffee","icetea","cola","nuka_cola","spacemountainwind","thirteenloko","dr_gibb","space_up","lemon_lime","beer","whiskey","gin","rum","vodka","holywater","tequilla","vermouth","wine","tonic","kahlua","cognac","ale","sodawater","ice","bilk","atomicbomb","threemileisland","goldschlager","patron","gintonic","cubalibre","whiskeycola","martini","vodkamartini","whiterussian","screwdrivercocktail","booger","bloodymary","gargleblaster","bravebull","tequillasunrise","toxinsspecial","beepskysmash","salglu_solution","irishcream","manlydorf","longislandicedtea","moonshine","b52","irishcoffee","margarita","blackrussian","manhattan","manhattan_proj","whiskeysoda","antifreeze","barefoot","snowwhite","demonsblood","vodkatonic","ginfizz","bahama_mama","singulo","sbiten","devilskiss","red_mead","mead","iced_beer","grog","aloe","andalusia","alliescocktail","soy_latte","cafe_latte","acidspit","amasec","neurotoxin","hippiesdelight","bananahonk","silencer","changelingsting","irishcarbomb","syndicatebomb","erikasurprise","driestmartini")
+ var/list/additional_drinks = list()
if(prob(50))
- drinks_only += list("pancuronium","adminordrazine","lsd","omnizine","blood")
+ additional_drinks += list("pancuronium","adminordrazine","lsd","omnizine","blood")
- var/datum/reagent/R = pick(drinks_only)
+ var/datum/reagent/R = pick(drinks + additional_drinks)
reagents.add_reagent(R,volume)
name = "unlabelled bottle"
icon_state = pick("alco-white","alco-green","alco-blue","alco-clear","alco-red")
pixel_x = rand(-5,5)
pixel_y = rand(-5,5)
+
/obj/item/weapon/reagent_containers/food/drinks/bottle/random_reagent // Same as the chembottle code except the container
name = "unlabelled drink?"
icon = 'icons/obj/drinks.dmi'
New()
..()
var/datum/reagent/R = pick(chemical_reagents_list)
- var/global/list/rare_chems = list("minttoxin","nanites","xenomicrobes","adminordrazine")
- if(rare_chems.Find(R))
+ if(rare_chemicals.Find(R))
reagents.add_reagent(R,10)
else
reagents.add_reagent(R,rand(3,10)*10)
@@ -123,20 +120,17 @@
New()
..()
- var/global/list/meds_only = list("charcoal","toxin","cyanide","morphine","epinephrine","space_drugs","serotrotium","mutadone","mutagen","teporone","lexorin","silver_sulfadiazine","salbutamol","perfluorodecalin","omnizine","synaptizine","haloperidol","potass_iodide","pen_acid","mannitol","oculine","styptic_powder","methamphetamine","spaceacillin","carpotoxin","lsd","ethanol","ammonia","diethylamine","antihol","pancuronium","lipolicide","condensedcapsaicin","frostoil","amanitin","psilocybin","nothing","salglu_solution","neurotoxin")
- var/global/list/rare_meds = list("nanites","xenomicrobes","minttoxin","adminordrazine","blood")
-
var/i = 1
while(i < storage_slots)
var/datum/reagent/R
if(prob(50))
- R = pick(meds_only + rare_meds)
+ R = pick(standard_medicines + rare_medicines)
else
- R = pick(meds_only)
+ R = pick(standard_medicines)
var/obj/item/weapon/reagent_containers/pill/P = new(src)
- if(rare_meds.Find(R))
+ if(rare_medicines.Find(R))
P.reagents.add_reagent(R,10)
else
P.reagents.add_reagent(R,rand(2,5)*10)
@@ -185,8 +179,7 @@
New()
..()
sleep(2)
- var/global/list/base_chems = list("water","oxygen","nitrogen","hydrogen","potassium","mercury","carbon","chlorine","fluorine","phosphorus","lithium","sulfur","sacid","radium","iron","aluminum","silicon","sugar","ethanol")
- for(var/chem in base_chems)
+ for(var/chem in standard_chemicals)
var/obj/item/weapon/reagent_containers/glass/bottle/B = new(src)
B.reagents.add_reagent(chem,B.volume)
if(prob(85))
diff --git a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
index 51424aeb26e..167e3cd0fa8 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/wheelchair.dm
@@ -30,6 +30,11 @@
if(buckled_mob)
if(buckled_mob.incapacitated())
return 0
+
+ var/mob/living/thedriver = user
+ var/mob_delay = thedriver.movement_delay()
+ if(mob_delay > 0)
+ move_delay += mob_delay
if(ishuman(buckled_mob))
var/mob/living/carbon/human/driver = user
diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm
index 721fd897214..b6cc60c82ed 100644
--- a/code/modules/admin/admin.dm
+++ b/code/modules/admin/admin.dm
@@ -56,10 +56,11 @@ var/global/nologevent = 0
body += "[admin_jump_link(M, src)]\]
"
body += "Mob type: [M.type]
"
- if(M.client.related_accounts_cid.len)
- body += "Related accounts by CID: [list2text(M.client.related_accounts_cid, " - ")]
"
- if(M.client.related_accounts_ip.len)
- body += "Related accounts by IP: [list2text(M.client.related_accounts_ip, " - ")]
"
+ if(M.client)
+ if(M.client.related_accounts_cid.len)
+ body += "Related accounts by CID: [list2text(M.client.related_accounts_cid, " - ")]
"
+ if(M.client.related_accounts_ip.len)
+ body += "Related accounts by IP: [list2text(M.client.related_accounts_ip, " - ")]
"
body += "Kick | "
body += "Warn | "
diff --git a/code/modules/admin/create_poll.dm b/code/modules/admin/create_poll.dm
index 78caa924b35..6e690b469ac 100644
--- a/code/modules/admin/create_poll.dm
+++ b/code/modules/admin/create_poll.dm
@@ -40,13 +40,13 @@
var/choice_amount = 0
switch(polltype)
if("Single Option")
- polltype = "OPTION"
+ polltype = POLLTYPE_OPTION
if("Text Reply")
- polltype = "TEXT"
+ polltype = POLLTYPE_TEXT
if("Rating")
- polltype = "NUMVAL"
+ polltype = POLLTYPE_RATING
if("Multiple Choice")
- polltype = "MULTICHOICE"
+ polltype = POLLTYPE_MULTI
choice_amount = input("How many choices should be allowed?","Select choice amount") as num|null
if(!choice_amount)
return
@@ -93,7 +93,7 @@
var/err = query_polladd_question.ErrorMsg()
log_game("SQL ERROR adding new poll question to table. Error : \[[err]\]\n")
return
- if(polltype == "TEXT")
+ if(polltype == POLLTYPE_TEXT)
log_admin("[key_name(usr)] has created a new server poll. Poll type: [polltype] - Admin Only: [adminonly ? "Yes" : "No"] - Question: [question]")
message_admins("[key_name_admin(usr)] has created a new server poll. Poll type: [polltype] - Admin Only: [adminonly ? "Yes" : "No"]
Question: [question]")
return
@@ -107,7 +107,7 @@
pollid = query_get_id.item[1]
var/add_option = 1
while(add_option)
- var/option = input("Write your option","Option") as message|null
+ var/option = input("Write your option",POLLTYPE_OPTION) as message|null
if(!option)
return pollid
option = sanitizeSQL(option)
@@ -124,7 +124,7 @@
var/descmin = ""
var/descmid = ""
var/descmax = ""
- if(polltype == "NUMVAL")
+ if(polltype == POLLTYPE_RATING)
minval = input("Set minimum rating value.","Minimum rating") as num|null
if(!minval)
return pollid
diff --git a/code/modules/economy/POS.dm b/code/modules/economy/POS.dm
index 7b1c885ff10..5a107e8f11a 100644
--- a/code/modules/economy/POS.dm
+++ b/code/modules/economy/POS.dm
@@ -361,11 +361,6 @@ var/const/POS_HEADER = {"
else
overlays += "pos-standby"
-/obj/machinery/pos/attack_robot(var/mob/user)
-// if(isMoMMI(user))
-// return attack_hand(user)
- return ..()
-
/obj/machinery/pos/attack_hand(var/mob/user)
user.set_machine(src)
var/logindata=""
diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm
index 7157ff6f7ba..1f584b97c35 100644
--- a/code/modules/mob/living/carbon/brain/posibrain.dm
+++ b/code/modules/mob/living/carbon/brain/posibrain.dm
@@ -25,16 +25,15 @@
spawn(600)
if(ghost_volunteers.len)
var/mob/dead/observer/O = pick(ghost_volunteers)
- if(istype(O) && O.client && O.key)
+ if(check_observer(O))
transfer_personality(O)
reset_search()
/obj/item/device/mmi/posibrain/proc/request_player()
for(var/mob/dead/observer/O in player_list)
- if(O.client && O.client.prefs.be_special & BE_PAI && !jobban_isbanned(O, "Cyborg") && !jobban_isbanned(O,"nonhumandept"))
- if(check_observer(O))
- O << "\blue \A [src] has been activated. (Teleport | Sign Up)"
- //question(O.client)
+ if(check_observer(O))
+ O << "\blue \A [src] has been activated. (Teleport | Sign Up)"
+ //question(O.client)
/obj/item/device/mmi/posibrain/proc/check_observer(var/mob/dead/observer/O)
if(O.has_enabled_antagHUD == 1 && config.antag_hud_restricted)
diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm
index ba419f16b5c..cbc449410fc 100644
--- a/code/modules/mob/living/silicon/robot/drone/drone.dm
+++ b/code/modules/mob/living/silicon/robot/drone/drone.dm
@@ -284,9 +284,9 @@
src << "
You are a maintenance drone, a tiny-brained robotic repair machine."
src << "You have no individual will, no personality, and no drives or urges other than your laws."
src << "Use ; to talk to other drones, and say to speak silently to your nearby fellows."
- src << "Remember, you are lawed against interference with the crew. Also remember, you DO NOT take orders from the AI."
+ src << "Remember, you are lawed against interference with the crew. Also remember, you DO NOT take orders from the AI."
src << "Don't invade their worksites, don't steal their resources, don't tell them about the changeling in the toilets."
- src << "If a crewmember has noticed you, you are probably breaking your first law."
+ src << "Make sure crew members do not notice you.."
/*
sprite["Default"] = "repairbot"
diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm
index f5bcb2112c4..4e45d6bc2ba 100644
--- a/code/modules/mob/living/silicon/robot/robot_modules.dm
+++ b/code/modules/mob/living/silicon/robot/robot_modules.dm
@@ -279,6 +279,7 @@
if(src.emag)
var/obj/item/weapon/reagent_containers/food/drinks/cans/beer/B = src.emag
B.reagents.add_reagent("beer2", 2)
+ ..()
/obj/item/weapon/robot_module/butler/add_languages(var/mob/living/silicon/robot/R)
//full set of languages
diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm
index c7daecafce9..41a7a5ce048 100644
--- a/code/modules/mob/mob.dm
+++ b/code/modules/mob/mob.dm
@@ -1270,8 +1270,6 @@ mob/proc/yank_out_object()
NPC.key = key
spawn(5)
respawnable_list += usr
- else
-// message_admins("Failed to check type")
else
usr << "You are not dead or you have given up your right to be respawned!"
return
diff --git a/code/modules/mob/new_player/poll.dm b/code/modules/mob/new_player/poll.dm
index 7be517eb2d9..d9e240936d7 100644
--- a/code/modules/mob/new_player/poll.dm
+++ b/code/modules/mob/new_player/poll.dm
@@ -64,7 +64,7 @@
switch(polltype)
//Polls that have enumerated options
- if("OPTION")
+ if(POLLTYPE_OPTION)
var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
voted_query.Execute()
@@ -117,7 +117,7 @@
src << browse(output,"window=playerpoll;size=500x250")
//Polls with a text input
- if("TEXT")
+ if(POLLTYPE_TEXT)
var/DBQuery/voted_query = dbcon.NewQuery("SELECT replytext FROM [format_table_name("poll_textreply")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
voted_query.Execute()
@@ -159,7 +159,7 @@
src << browse(output,"window=playerpoll;size=500x500")
//Polls with a text input
- if("NUMVAL")
+ if(POLLTYPE_RATING)
var/DBQuery/voted_query = dbcon.NewQuery("SELECT o.text, v.rating FROM [format_table_name("poll_option")] o, erro_poll_vote v WHERE o.pollid = [pollid] AND v.ckey = '[usr.ckey]' AND o.id = v.optionid")
voted_query.Execute()
@@ -228,7 +228,7 @@
output += ""
src << browse(output,"window=playerpoll;size=500x500")
- if("MULTICHOICE")
+ if(POLLTYPE_MULTI)
var/DBQuery/voted_query = dbcon.NewQuery("SELECT optionid FROM [format_table_name("poll_vote")] WHERE pollid = [pollid] AND ckey = '[usr.ckey]'")
voted_query.Execute()
@@ -308,7 +308,7 @@
var/multiplechoiceoptions = 0
while(select_query.NextRow())
- if(select_query.item[4] != "OPTION" && select_query.item[4] != "MULTICHOICE")
+ if(select_query.item[4] != POLLTYPE_OPTION && select_query.item[4] != POLLTYPE_MULTI)
return
validpoll = 1
if(select_query.item[5])
@@ -377,7 +377,7 @@
var/validpoll = 0
while(select_query.NextRow())
- if(select_query.item[4] != "TEXT")
+ if(select_query.item[4] != POLLTYPE_TEXT)
return
validpoll = 1
break
@@ -435,7 +435,7 @@
var/validpoll = 0
while(select_query.NextRow())
- if(select_query.item[4] != "NUMVAL")
+ if(select_query.item[4] != POLLTYPE_RATING)
return
validpoll = 1
break
diff --git a/code/modules/mob/transform_procs.dm b/code/modules/mob/transform_procs.dm
index 4fabdc6510e..eb59f6b9aca 100644
--- a/code/modules/mob/transform_procs.dm
+++ b/code/modules/mob/transform_procs.dm
@@ -278,10 +278,6 @@
var/list/mobtypes = typesof(/mob/living/simple_animal)
var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") in mobtypes
- if(!safe_animal(mobpath))
- usr << "\red Sorry but this mob type is currently unavailable."
- return
-
if(notransform)
return
for(var/obj/item/W in src)
@@ -313,10 +309,6 @@
var/list/mobtypes = typesof(/mob/living/simple_animal)
var/mobpath = input("Which type of mob should [src] turn into?", "Choose a type") in mobtypes
- if(!safe_animal(mobpath))
- usr << "\red Sorry but this mob type is currently unavailable."
- return
-
var/mob/new_mob = new mobpath(src.loc)
new_mob.key = key
@@ -326,72 +318,10 @@
qdel(src)
-/* Certain mob types have problems and should not be allowed to be controlled by players.
- *
- * This proc is here to force coders to manually place their mob in this list, hopefully tested.
- * This also gives a place to explain -why- players shouldnt be turn into certain mobs and hopefully someone can fix them.
- */
-/mob/proc/safe_animal(var/MP)
-
-//Bad mobs! - Remember to add a comment explaining what's wrong with the mob
- if(!MP)
- return 0 //Sanity, this should never happen.
-
- if(ispath(MP, /mob/living/simple_animal/hostile/spaceWorm))
- return 0 //Unfinished. Very buggy, they seem to just spawn additional space worms everywhere and eating your own tail results in new worms spawning.
-
- if(ispath(MP, /mob/living/simple_animal/construct/behemoth))
- return 0 //I think this may have been an unfinished WiP or something. These constructs should really have their own class simple_animal/construct/subtype
-
- if(ispath(MP, /mob/living/simple_animal/construct/armoured))
- return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype
-
- if(ispath(MP, /mob/living/simple_animal/construct/wraith))
- return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype
-
- if(ispath(MP, /mob/living/simple_animal/construct/builder))
- return 0 //Verbs do not appear for players. These constructs should really have their own class simple_animal/construct/subtype
-
-//Good mobs!
- if(ispath(MP, /mob/living/simple_animal/pet/cat))
- return 1
- if(ispath(MP, /mob/living/simple_animal/pet/corgi))
- return 1
- if(ispath(MP, /mob/living/simple_animal/crab))
- return 1
- if(ispath(MP, /mob/living/simple_animal/hostile/carp))
- return 1
- if(ispath(MP, /mob/living/simple_animal/hostile/mushroom))
- return 1
- if(ispath(MP, /mob/living/simple_animal/shade))
- return 1
- if(ispath(MP, /mob/living/simple_animal/tomato))
- return 1
- if(ispath(MP, /mob/living/simple_animal/mouse))
- return 1 //It is impossible to pull up the player panel for mice (Fixed! - Nodrak)
- if(ispath(MP, /mob/living/simple_animal/hostile/bear))
- return 1 //Bears will auto-attack mobs, even if they're player controlled (Fixed! - Nodrak)
- if(ispath(MP, /mob/living/simple_animal/parrot))
- return 1 //Parrots are no longer unfinished! -Nodrak
- if(ispath(MP, /mob/living/simple_animal/pony))
- return 1 // ZOMG PONIES WHEEE
- if(ispath(MP, /mob/living/simple_animal/pet/fox))
- return 1
- if(ispath(MP, /mob/living/simple_animal/chick))
- return 1
- if(ispath(MP, /mob/living/simple_animal/pet/pug))
- return 1
- if(ispath(MP, /mob/living/simple_animal/butterfly))
- return 1
- //Not in here? Must be untested!
- return 0
-
-
/mob/proc/safe_respawn(var/MP)
if(!MP)
- return 0 //Sanity, this should never happen.
+ return 0
-//Animals!
if(ispath(MP, /mob/living/simple_animal/pet/cat))
return 1
if(ispath(MP, /mob/living/simple_animal/pet/corgi))
@@ -415,15 +345,10 @@
if(ispath(MP, /mob/living/simple_animal/butterfly))
return 1
-//Antag Creatures!
if(ispath(MP, /mob/living/simple_animal/borer) && !jobban_isbanned(src, "alien") && !jobban_isbanned(src, "Syndicate"))
return 1
- if(ispath(MP, /mob/living/simple_animal/hostile/statue) && !jobban_isbanned(src, "Syndicate"))
- return 1
-
-//Friendly Creatures!
+
if(ispath(MP, /mob/living/simple_animal/diona) && !jobban_isbanned(src, "Dionaea"))
return 1
- //Not in here? Must be untested!
return 0
diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm
index 4e4eee07c0e..9e2bca5edcb 100644
--- a/code/modules/reagents/reagent_containers/food/drinks.dm
+++ b/code/modules/reagents/reagent_containers/food/drinks.dm
@@ -69,11 +69,12 @@
reagents.trans_to(M, gulp_size)
if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell
- var/mob/living/silicon/robot/bro = user
- bro.cell.use(30)
+ var/mob/living/silicon/robot/borg = user
+ borg.cell.use(30)
var/refill = R.get_master_reagent_id()
- spawn(600)
- R.add_reagent(refill, fillevel)
+ if(refill in drinks) // Only synthesize drinks
+ spawn(600)
+ R.add_reagent(refill, fillevel)
playsound(M.loc,'sound/items/drink.ogg', rand(10,50), 1)
return 1
@@ -125,15 +126,16 @@
user << "\blue You transfer [trans] units of the solution to [target]."
if(isrobot(user)) //Cyborg modules that include drinks automatically refill themselves, but drain the borg's cell
- var/mob/living/silicon/robot/bro = user
- var/chargeAmount = max(30,4*trans)
- bro.cell.use(chargeAmount)
- user << "Now synthesizing [trans] units of [refillName]..."
+ if(refill in drinks) // Only synthesize drinks
+ var/mob/living/silicon/robot/bro = user
+ var/chargeAmount = max(30,4*trans)
+ bro.cell.use(chargeAmount)
+ user << "Now synthesizing [trans] units of [refillName]..."
- spawn(300)
- reagents.add_reagent(refill, trans)
- user << "Cyborg [src] refilled."
+ spawn(300)
+ reagents.add_reagent(refill, trans)
+ user << "Cyborg [src] refilled."
return
diff --git a/code/modules/reagents/reagent_containers/glass/bottle/robot.dm b/code/modules/reagents/reagent_containers/glass/bottle/robot.dm
index cb6a7cb0a8a..6a8eb261bb4 100644
--- a/code/modules/reagents/reagent_containers/glass/bottle/robot.dm
+++ b/code/modules/reagents/reagent_containers/glass/bottle/robot.dm
@@ -14,11 +14,10 @@
icon_state = "bottle16"
reagent = "epinephrine"
- New()
- ..()
- reagents.add_reagent("epinephrine", 60)
- return
-
+/obj/item/weapon/reagent_containers/glass/bottle/robot/epinephrine/New()
+ ..()
+ reagents.add_reagent("epinephrine", 60)
+ return
/obj/item/weapon/reagent_containers/glass/bottle/robot/charcoal
name = "internal charcoal bottle"
@@ -27,7 +26,7 @@
icon_state = "bottle17"
reagent = "charcoal"
- New()
- ..()
- reagents.add_reagent("charcoal", 60)
- return
\ No newline at end of file
+/obj/item/weapon/reagent_containers/glass/bottle/robot/charcoal/New()
+ ..()
+ reagents.add_reagent("charcoal", 60)
+ return
\ No newline at end of file
diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi
index b844e40addc..7aec18d1dcd 100644
Binary files a/icons/obj/device.dmi and b/icons/obj/device.dmi differ
diff --git a/paradise.dme b/paradise.dme
index 05481159da0..62e81bd0151 100644
--- a/paradise.dme
+++ b/paradise.dme
@@ -75,6 +75,7 @@
#include "code\_globalvars\lists\mobs.dm"
#include "code\_globalvars\lists\names.dm"
#include "code\_globalvars\lists\objects.dm"
+#include "code\_globalvars\lists\reagents.dm"
#include "code\_hooks\area.dm"
#include "code\_hooks\hooks.dm"
#include "code\_hooks\mob.dm"