From b24f5ff97931b3a606b35b56781cee04467d677d Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 5 Oct 2015 00:26:43 +0200 Subject: [PATCH 1/6] Fixes and pinpointer update --- _maps/map_files/cyberiad/cyberiad.dmm | 6 +- code/ATMOSPHERICS/pipes/pipe.dm | 1 - code/_globalvars/lists/misc.dm | 2 +- code/_globalvars/lists/reagents.dm | 12 + code/datums/uplink_item.dm | 10 +- code/game/gamemodes/mutiny/key_pinpointer.dm | 2 +- .../game/gamemodes/nations/flag_pinpointer.dm | 2 +- code/game/gamemodes/nuclear/pinpointer.dm | 628 +++++++----------- code/game/machinery/machinery.dm | 16 +- code/game/machinery/rechargestation.dm | 32 +- code/game/objects/items/random_items.dm | 35 +- .../stool_bed_chair_nest/wheelchair.dm | 5 + .../mob/living/carbon/brain/posibrain.dm | 9 +- .../mob/living/silicon/robot/robot_modules.dm | 1 + code/modules/mob/mob.dm | 2 - code/modules/mob/transform_procs.dm | 79 +-- .../reagent_containers/food/drinks.dm | 24 +- .../reagent_containers/glass/bottle/robot.dm | 17 +- icons/obj/device.dmi | Bin 30044 -> 32027 bytes paradise.dme | 1 + 20 files changed, 340 insertions(+), 544 deletions(-) create mode 100644 code/_globalvars/lists/reagents.dm 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/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/_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 05a8971bc50..f01e712e2c8 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/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/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/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/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/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 2c1c695bdcb..68c3f58c1d4 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1272,8 +1272,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/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 b844e40addc260273899e8da0017c982fb7802e5..7aec18d1dcd0e0b166f3e1d4eb645e94022aeb2c 100644 GIT binary patch literal 32027 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

}TtzBiKoQJXC;tGF)8ITddTopS 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 X+<$j^?64mM{$09Ys$Zz<9Q8i{i#z09 literal 30044 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 diff --git a/paradise.dme b/paradise.dme index 641a34617f1..5686226b3c6 100644 --- a/paradise.dme +++ b/paradise.dme @@ -71,6 +71,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" From de930c24ba2cc59f96d5fe65af4535a5783b31eb Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 5 Oct 2015 01:10:39 +0200 Subject: [PATCH 2/6] Admin panel client fix, goon DNA fix --- code/game/dna/genes/goon_disabilities.dm | 9 +++++---- code/modules/admin/admin.dm | 4 ++-- 2 files changed, 7 insertions(+), 6 deletions(-) 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/modules/admin/admin.dm b/code/modules/admin/admin.dm index 721fd897214..d9654140cdf 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -56,9 +56,9 @@ var/global/nologevent = 0 body += "[admin_jump_link(M, src)]\]
" body += "Mob type: [M.type]
" - if(M.client.related_accounts_cid.len) + if(M.client && M.client.related_accounts_cid.len) body += "Related accounts by CID: [list2text(M.client.related_accounts_cid, " - ")]
" - if(M.client.related_accounts_ip.len) + if(M.client && M.client.related_accounts_ip.len) body += "Related accounts by IP: [list2text(M.client.related_accounts_ip, " - ")]

" body += "
Kick | " From 76db6db28a49e02bbf7f38b0263bc346c333660d Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 5 Oct 2015 01:12:01 +0200 Subject: [PATCH 3/6] Better handling --- code/modules/admin/admin.dm | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index d9654140cdf..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 && M.client.related_accounts_cid.len) - body += "Related accounts by CID: [list2text(M.client.related_accounts_cid, " - ")]
" - if(M.client && 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 | " From ad0329a1fda82ebf6a6ec9d3dfed2c214e5bfa39 Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 5 Oct 2015 03:37:06 +0200 Subject: [PATCH 4/6] Add fingerprint to pipe construction --- code/ATMOSPHERICS/atmospherics.dm | 1 + 1 file changed, 1 insertion(+) 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) From fdc35785827279ac55d60ef6da0bc29f6228a694 Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 5 Oct 2015 19:25:05 +0200 Subject: [PATCH 5/6] Turn poll magic strings into defines --- code/__DEFINES/misc.dm | 7 ++++++- code/modules/admin/create_poll.dm | 14 +++++++------- code/modules/mob/new_player/poll.dm | 14 +++++++------- 3 files changed, 20 insertions(+), 15 deletions(-) diff --git a/code/__DEFINES/misc.dm b/code/__DEFINES/misc.dm index ced91ac0287..1a63456c728 100644 --- a/code/__DEFINES/misc.dm +++ b/code/__DEFINES/misc.dm @@ -163,4 +163,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/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/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 From f9adb09c72faee2ea054bf5a95129523c28f9594 Mon Sep 17 00:00:00 2001 From: Markolie Date: Mon, 5 Oct 2015 19:37:35 +0200 Subject: [PATCH 6/6] Drone message fix, let robots unbuckle --- code/game/machinery/alarm.dm | 3 --- code/game/objects/buckling.dm | 5 +++++ code/modules/economy/POS.dm | 5 ----- code/modules/mob/living/silicon/robot/drone/drone.dm | 4 ++-- 4 files changed, 7 insertions(+), 10 deletions(-) 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/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/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/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"