From 9d6a11e17ddd127e9c10ddcad0f5704369ae97c6 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Thu, 23 Feb 2017 14:41:24 -0600 Subject: [PATCH 01/18] Readds HI prosthetics, corrects naming --- code/datums/supplypacks/robotics.dm | 9 ++++- .../loadout/loadout_uniform.dm | 6 +-- code/modules/clothing/under/miscellaneous.dm | 6 +-- code/modules/organs/robolimbs.dm | 32 ++++++++-------- .../Anewbe - Hephaistos Industries.yml | 37 +++++++++++++++++++ 5 files changed, 67 insertions(+), 23 deletions(-) create mode 100644 html/changelogs/Anewbe - Hephaistos Industries.yml diff --git a/code/datums/supplypacks/robotics.dm b/code/datums/supplypacks/robotics.dm index 11dc34c404..a1ded3c528 100644 --- a/code/datums/supplypacks/robotics.dm +++ b/code/datums/supplypacks/robotics.dm @@ -39,7 +39,7 @@ name = "All robolimb blueprints" contains = list( /obj/item/weapon/disk/limb/bishop, - /obj/item/weapon/disk/limb/hesphiastos, + /obj/item/weapon/disk/limb/hephaistos, /obj/item/weapon/disk/limb/morpheus, /obj/item/weapon/disk/limb/veymed, /obj/item/weapon/disk/limb/wardtakahashi, @@ -68,6 +68,13 @@ containername = "Robolimb blueprints (Xion)" access = access_robotics +/datum/supply_packs/robotics/robolimbs/ + name = "Hephaistos robolimb blueprints" + contains = list(/obj/item/weapon/disk/limb/hephaistos) + containertype = /obj/structure/closet/crate/secure/gear + containername = "Robolimb blueprints (Hephaistos)" + access = access_robotics + /datum/supply_packs/robotics/robolimbs/wardtakahashi name = "Ward-Takahashi robolimb blueprints" contains = list(/obj/item/weapon/disk/limb/wardtakahashi) diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index 518b11a521..a07f8bb45a 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -442,6 +442,6 @@ display_name = "outfit, frontier" path = /obj/item/clothing/under/frontier -/datum/gear/uniform/brandsuit/hephaestus - display_name = "jumpsuit, hephaestus" - path = /obj/item/clothing/under/hephaestus \ No newline at end of file +/datum/gear/uniform/brandsuit/hephaistos + display_name = "jumpsuit, hephaistos" + path = /obj/item/clothing/under/hephaistos \ No newline at end of file diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 96c47d054a..fbc29fa5ec 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -681,9 +681,9 @@ icon_state = "focal" worn_state = "focal" -/obj/item/clothing/under/hephaestus - name = "\improper Hephaestus jumpsuit" - desc = "A jumpsuit belonging to Hephaestus Industries, a Trans-Stellar best known for its arms production." +/obj/item/clothing/under/hephaistos + name = "\improper Hephaistos jumpsuit" + desc = "A jumpsuit belonging to Hephaistos Industries, a Trans-Stellar best known for its arms production." icon_state = "heph" worn_state = "heph" diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index f46326a53e..760af1a5b4 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -70,29 +70,29 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ parts = list(BP_HEAD) monitor_styles = standard_monitor_styles -/datum/robolimb/hesphiastos - company = "Hesphiastos" +/datum/robolimb/hephaistos + company = "Hephaistos" desc = "This limb has a militaristic black and green casing with gold stripes." icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_main.dmi' unavailable_to_build = 1 -/datum/robolimb/hesphiastos_alt1 - company = "Hesphiastos - Frontier" +/datum/robolimb/hephaistos_alt1 + company = "Hephaistos - Frontier" desc = "A rugged prosthetic head featuring the standard Hesphiastos theme, a visor and an external display." icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_alt1.dmi' unavailable_to_build = 1 parts = list(BP_HEAD) - monitor_styles = "blank=hesphiastos_alt_off;\ - pink=hesphiastos_alt_pink;\ - orange=hesphiastos_alt_orange;\ - goggles=hesphiastos_alt_goggles;\ - scroll=hesphiastos_alt_scroll;\ - rgb=hesphiastos_alt_rgb;\ - rainbow=hesphiastos_alt_rainbow" + monitor_styles = "blank=hephaistos_alt_off;\ + pink=hephaistos_alt_pink;\ + orange=hephaistos_alt_orange;\ + goggles=hephaistos_alt_goggles;\ + scroll=hephaistos_alt_scroll;\ + rgb=hephaistos_alt_rgb;\ + rainbow=hephaistos_alt_rainbow" -/datum/robolimb/hesphiastos_monitor - company = "Hesphiastos Monitor" - desc = "Hesphiastos' unique spin on a popular prosthetic head model. It looks rugged and sturdy." +/datum/robolimb/hephaistos_monitor + company = "Hephaistos Monitor" + desc = "Hephaistos' unique spin on a popular prosthetic head model. It looks rugged and sturdy." icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_monitor.dmi' unavailable_to_build = 1 parts = list(BP_HEAD) @@ -183,8 +183,8 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ /obj/item/weapon/disk/limb/bishop company = "Bishop" -/obj/item/weapon/disk/limb/hesphiastos - company = "Hesphiastos" +/obj/item/weapon/disk/limb/hephaistos + company = "Hephaistos" /obj/item/weapon/disk/limb/morpheus company = "Morpheus" diff --git a/html/changelogs/Anewbe - Hephaistos Industries.yml b/html/changelogs/Anewbe - Hephaistos Industries.yml new file mode 100644 index 0000000000..fc489b5be0 --- /dev/null +++ b/html/changelogs/Anewbe - Hephaistos Industries.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Anewbe + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Hephaistos Industries prosthetic disks can now be ordered again." + - wip: "Hephaistos Industries is the correct spelling for that company, per the wiki. Please submit a bug report if you find any references that don't match." From 889e9403f0ef70caac7e08443ed7fa32092b173e Mon Sep 17 00:00:00 2001 From: Leshana Date: Thu, 9 Mar 2017 18:44:11 -0500 Subject: [PATCH 02/18] New Event: Atmos Leak In this event some sort of gas leak occours! A random area on the station is chosen to experience a leak of a randomly chosen gas! * By default, areas with any people in them are protected, so it won't just kill someone. * A warning announcement is given shortly before, so there is some warning. * Dorms, Shuttles, Holodeck and Supermatter are protected. * At higher severity, adds worse gasses and possibility of high/low temperature. --- code/modules/events/atmos_leak.dm | 90 +++++++++++++++++++++++++++++++ polaris.dme | 1 + 2 files changed, 91 insertions(+) create mode 100644 code/modules/events/atmos_leak.dm diff --git a/code/modules/events/atmos_leak.dm b/code/modules/events/atmos_leak.dm new file mode 100644 index 0000000000..46c28b7adf --- /dev/null +++ b/code/modules/events/atmos_leak.dm @@ -0,0 +1,90 @@ +// +// This event causes a gas leak of phoron, sleeping_agent, or carbon_dioxide in a random unoccupied area. +// One wonders, where did the gas come from? Who knows! Its SPACE! But if you want something a touch +// more "explainable" then check out the canister_leak event instead. +// + +/datum/event/atmos_leak + startWhen = 5 // Nobody will actually be in the room, but still give a bit of warning. + var/area/target_area // Chosen target area + var/area/target_turf // Chosen target turf in target_area + var/gas_type // Chosen gas to release + // Exclude these types and sub-types from targeting eligibilty + var/list/area/excluded = list( + /area/shuttle, + /area/crew_quarters, + /area/holodeck, + /area/engineering/engine_room + ) + +// Decide which area will be targeted! +/datum/event/atmos_leak/setup() + var/gas_choices = list("carbon_dioxide", "sleeping_agent") // Annoying + if(severity >= EVENT_LEVEL_MODERATE) + gas_choices += "phoron" // Dangerous + if(severity >= EVENT_LEVEL_MAJOR) + gas_choices += "volatile_fuel" // Dangerous and no default atmos setup! + gas_type = pick(gas_choices) + + // Assemble areas that all exists (See DM reference if you are confused about loop labels) + var/list/area/grand_list_of_areas = list() + looping_station_areas: + for(var/parentpath in global.the_station_areas) + // Check its not excluded + for(var/excluded_path in excluded) + if(ispath(parentpath, excluded_path)) + continue looping_station_areas + // Otherwise add it and all subtypes that exist on the map to our grand list + for(var/areapath in typesof(parentpath)) + var/area/A = locate(areapath) // Check if it actually exists + if(istype(A) && A.z in using_map.player_levels) + grand_list_of_areas += A + + // Okay, now lets try and pick a target! Lets try 10 times, otherwise give up + for(var/i in 1 to 10) + var/area/A = pick(grand_list_of_areas) + if(is_area_occupied(A)) + log_debug("atmos_leak event: Rejected [A] because it is occupied.") + continue + // A good area, great! Lets try and pick a turf + var/list/turfs = list() + for(var/turf/simulated/floor/F in A) + if(turf_clear(F)) + turfs += F + if(turfs.len == 0) + log_debug("atmos_leak event: Rejected [A] because it has no clear turfs.") + continue + target_area = A + target_turf = pick(turfs) + + // If we can't find a good target, give up + if(!target_area) + log_debug("atmos_leak event: Giving up after too many failures to pick target area") + kill() + return + +/** Checks if any living humans are in a given area! */ +/datum/event/atmos_leak/proc/is_area_occupied(var/area/myarea) + // Testing suggests looping over human_mob_list is quicker than looping over area contents + for(var/mob/living/carbon/human/H in human_mob_list) + if(H.stat >= DEAD) //Conditions for exclusion here, like if disconnected people start blocking it. + continue + var/area/A = get_area(H) + if(A == myarea) //The loc of a turf is the area it is in. + return 1 + return 0 + +/datum/event/atmos_leak/announce() + command_announcement.Announce("Warning, hazardous [gas_data.name[gas_type]] gas leak detected in \the [target_area], evacuate the area and contain the damage!", "Hazard Alert") + +/datum/event/atmos_leak/start() + // Okay, time to actually put the gas in the room! + // TODO - Would be nice to break a waste pipe perhaps? + // TODO - Maybe having it released from a single point and thus causing airflow to blow stuff around + + // Fow now just add a bunch of it to the air + var/datum/gas_mixture/air_contents = new + air_contents.temperature = T20C + ((severity - 1) * rand(-50, 50)) + air_contents.gas[gas_type] = 10 * MOLES_CELLSTANDARD + target_turf.assume_air(air_contents) + playsound(target_turf, 'sound/effects/smoke.ogg', 50, 1) diff --git a/polaris.dme b/polaris.dme index f7bfd240ce..89c1c1f490 100644 --- a/polaris.dme +++ b/polaris.dme @@ -1306,6 +1306,7 @@ #include "code\modules\error_handler\error_viewer.dm" #include "code\modules\error_handler\~defines.dm" #include "code\modules\events\apc_damage.dm" +#include "code\modules\events\atmos_leak.dm" #include "code\modules\events\blob.dm" #include "code\modules\events\brand_intelligence.dm" #include "code\modules\events\camera_damage.dm" From eb65ff2ed200840a7764077ff2d8f3d330d464b8 Mon Sep 17 00:00:00 2001 From: Leshana Date: Fri, 10 Mar 2017 20:26:33 -0500 Subject: [PATCH 03/18] Ports the new parts of https://github.com/Baystation12/Baystation12/pull/15298 back to Polaris * Changes navbeacons to no longer use radios (Doing so was slower and didn't really help anything) Note: var/freq remains for mapping compatibility until all maps are updated. * Fixes navbeacons to actually hide under flooring if you put plating over them. * Changed how navbeacons are mapped in. Don't use the picky "code_txt" variable, instead use appropriate subtype. * Made useful reusable subtypes so you don't have to code in a type for every. single. one. * Updated mulebot to use new navbeacon codes. * Re-activate patrolling! With the new navbeacons, bots with will_patrol can follow the patrol navbeacons. * Note: various "should_patrol" variables on each bot type unified under /mob/living/bot/var/will_patrol * Securitrons (beepsky) got an overhaul to the new patrol routing. * Note: BayStation replaced the snowflake handcuffs code with acutal handcuffs. Polaris handcuffs requiere a grab to work, so are more complicated. Kept our existing attack code. * Behavior procs reorganized to use better movement detection and just be more flexible. * Floorbot fixes & removal of bridgemode * Floorbot will now remove & replace broken floor tiles. * Floorbot will no longer decide its okay to pave over all of SPACE. * For the moment patching hull breaches is disabled, it is too laggy. * Sundry bugfixes to all bots * Use forceMove() instead of setting loc * Use "\The [X]" message strings. * Pass target to do_after() when doing something to a target. * Fixed events that were supposed to emag bots to now do so again. --- code/game/gamemodes/events.dm | 5 + code/game/machinery/navbeacon.dm | 130 +++++++++++------------- code/modules/events/ion_storm.dm | 6 ++ code/modules/mob/living/bot/bot.dm | 45 ++++++-- code/modules/mob/living/bot/cleanbot.dm | 11 +- code/modules/mob/living/bot/farmbot.dm | 6 +- code/modules/mob/living/bot/floorbot.dm | 83 +++++++++------ code/modules/mob/living/bot/mulebot.dm | 27 ++--- code/modules/mob/living/bot/secbot.dm | 109 +++++++++++++------- 9 files changed, 253 insertions(+), 169 deletions(-) diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index 397651dce7..0169cd3f00 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -350,6 +350,11 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is M << "
" M.add_ion_law("THE STATION IS [who2pref] [who2]") + if(botEmagChance) + for(var/mob/living/bot/bot in machines) + if(prob(botEmagChance)) + bot.emag_act(1) + /* var/apcnum = 0 diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index fe5cac9c44..8700caf785 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -1,52 +1,45 @@ // Navigation beacon for AI robots // Functions as a transponder: looks for incoming signal matching -var/global/list/navbeacons // no I don't like putting this in, but it will do for now +var/global/list/navbeacons = list() // no I don't like putting this in, but it will do for now /obj/machinery/navbeacon icon = 'icons/obj/objects.dmi' icon_state = "navbeacon0-f" name = "navigation beacon" - desc = "A radio beacon used for bot navigation." + desc = "A beacon used for bot navigation." level = 1 // underfloor layer = 2.5 anchored = 1 var/open = 0 // true if cover is open var/locked = 1 // true if controls are locked - var/freq = 1445 // radio frequency + var/freq = null // DEPRECATED we don't use radios anymore! var/location = "" // location response text - var/list/codes // assoc. list of transponder codes - var/codes_txt = "" // codes as set on map: "tag1;tag2" or "tag1=value;tag2=value" + var/codes_txt // DEPRECATED codes as set on map: "tag1;tag2" or "tag1=value;tag2=value" + var/list/codes = list() // assoc. list of transponder codes req_access = list(access_engine) /obj/machinery/navbeacon/New() ..() - - set_codes() + set_codes_from_txt(codes_txt) + if(freq) + warning("[src] at [x],[y],[z] has deprecated var freq=[freq]. Replace it with proper type.") var/turf/T = loc hide(!T.is_plating()) - - // add beacon to MULE bot beacon list - if(freq == 1400) - if(!navbeacons) - navbeacons = new() - navbeacons += src - - - spawn(5) // must wait for map loading to finish - if(radio_controller) - radio_controller.add_object(src, freq, RADIO_NAVBEACONS) + navbeacons += src // set the transponder codes assoc list from codes_txt -/obj/machinery/navbeacon/proc/set_codes() +// DEPRECATED - This is kept only for compatibilty with old map files! Do not use this! +// Instead, you should replace the map instance with one of the appropriate navbeacon subtypes. +// See the bottom of this file for a list of subtypes, make your own examples if your map needs more +/obj/machinery/navbeacon/proc/set_codes_from_txt() if(!codes_txt) return + warning("[src] at [x],[y],[z] in [get_area(src)] is using the deprecated 'codes_txt' mapping method. Replace it with proper type.") - codes = new() - + codes = list() var/list/entries = splittext(codes_txt, ";") // entries are separated by semicolons - for(var/e in entries) var/index = findtext(e, "=") // format is "key=value" if(index) @@ -56,6 +49,8 @@ var/global/list/navbeacons // no I don't like putting this in, but it will do else codes[e] = "1" +/obj/machinery/navbeacon/hides_under_flooring() + return 1 // called when turf state changes // hide the object if turf is intact @@ -73,38 +68,6 @@ var/global/list/navbeacons // no I don't like putting this in, but it will do else icon_state = "[state]" - -// look for a signal of the form "findbeacon=X" -// where X is any -// or the location -// or one of the set transponder keys -// if found, return a signal -/obj/machinery/navbeacon/receive_signal(datum/signal/signal) - - var/request = signal.data["findbeacon"] - if(request && ((request in codes) || request == "any" || request == location)) - spawn(1) - post_signal() - -// return a signal giving location and transponder codes - -/obj/machinery/navbeacon/proc/post_signal() - - var/datum/radio_frequency/frequency = radio_controller.return_frequency(freq) - - if(!frequency) return - - var/datum/signal/signal = new() - signal.source = src - signal.transmission_method = 1 - signal.data["beacon"] = location - - for(var/key in codes) - signal.data[key] = codes[key] - - frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS) - - /obj/machinery/navbeacon/attackby(var/obj/item/I, var/mob/user) var/turf/T = loc if(!T.is_plating()) @@ -117,7 +80,7 @@ var/global/list/navbeacons // no I don't like putting this in, but it will do updateicon() - else if(istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda)) + else if(I.GetID()) if(open) if(allowed(user)) locked = !locked @@ -153,8 +116,7 @@ var/global/list/navbeacons // no I don't like putting this in, but it will do if(locked && !ai) t = {"Navigation Beacon

-(swipe card to unlock controls)
-Frequency: [format_frequency(freq)]

+(swipe card to unlock controls)

Location: [location ? location : "(none)"]
Transponder Codes:
    "} @@ -165,14 +127,7 @@ Transponder Codes:
      "} else t = {"Navigation Beacon

      -(swipe card to lock controls)
      -Frequency: -- -- -[format_frequency(freq)] -+ -+
      -
      +(swipe card to lock controls)

      Location: [location ? location : "(none)"]
      Transponder Codes:
        "} @@ -195,11 +150,7 @@ Transponder Codes:
          "} if(open && !locked) usr.set_machine(src) - if(href_list["freq"]) - freq = sanitize_frequency(freq + text2num(href_list["freq"])) - updateDialog() - - else if(href_list["locedit"]) + if(href_list["locedit"]) var/newloc = sanitize(input("Enter New Location", "Navigation Beacon", location) as text|null) if(newloc) location = newloc @@ -248,6 +199,41 @@ Transponder Codes:
            "} /obj/machinery/navbeacon/Destroy() navbeacons.Remove(src) - if(radio_controller) - radio_controller.remove_object(src, freq) + ..() + + +// +// Nav Beacon Mapping +// These subtypes are what you should actually put into maps! they will make your life much easier. +// +// Developer Note: navbeacons do not HAVE to use these subtypes. They are purely for mapping convenience. +// You can feel free to construct them in-game as just /obj/machinery/navbeacon and they will work just +// fine, and you can define your own specific types for every instance on map if you want (BayStation does) +// This design is a compromise that means you can do mapping without every single one being its own type +// but with it still being easy to map ~ Leshana +// + +// Mulebot delivery destinations + +/obj/machinery/navbeacon/delivery/north + codes = list("delivery" = 1, "dir" = NORTH) + +/obj/machinery/navbeacon/delivery/south + codes = list("delivery" = 1, "dir" = SOUTH) + +/obj/machinery/navbeacon/delivery/east + codes = list("delivery" = 1, "dir" = EAST) + +/obj/machinery/navbeacon/delivery/west + codes = list("delivery" = 1, "dir" = WEST) + + +// For part of the patrol route +// You MUST set "location" +// You MUST set "next_patrol" +/obj/machinery/navbeacon/patrol + var/next_patrol + +/obj/machinery/navbeacon/patrol/New() + codes = list("patrol" = 1, "next_patrol" = next_patrol) ..() diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index 1e22826d0b..4c702038a9 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -86,6 +86,12 @@ "admin","ponies","heresy","meow","Pun Pun","monkey","Ian","moron","pizza","message","spam",\ "director", "Hello", "Hi!"," ","nuke","crate","dwarf","xeno") +/datum/event/ionstorm/tick() + if(botEmagChance) + for(var/mob/living/bot/bot in world) + if(prob(botEmagChance)) + bot.emag_act(1) + /datum/event/ionstorm/end() spawn(rand(5000,8000)) if(prob(50)) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index 0ad82ae384..cb73171c7e 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -27,7 +27,7 @@ var/turf/obstacle = null var/wait_if_pulled = 0 // Only applies to moving to the target - var/will_patrol = 0 // Not a setting - whether or no this type of bots patrols at all + var/will_patrol = 0 // If set to 1, will patrol, duh var/patrol_speed = 1 // How many times per tick we move when patrolling var/target_speed = 2 // Ditto for chasing the target var/min_target_dist = 1 // How close we try to get to the target @@ -49,7 +49,11 @@ access_scanner.req_access = req_access.Copy() access_scanner.req_one_access = req_one_access.Copy() - turn_on() +// Make sure mapped in units start turned on. +/mob/living/bot/initialize() + ..() + if(on) + turn_on() // Update lights and other stuff /mob/living/bot/Life() ..() @@ -61,7 +65,8 @@ paralysis = 0 if(on && !client && !busy) - handleAI() + spawn(0) + handleAI() /mob/living/bot/updatehealth() if(status_flags & GODMODE) @@ -145,20 +150,18 @@ handleRangedTarget() if(!wait_if_pulled || !pulledby) for(var/i = 1 to target_speed) + sleep(20 / (target_speed + 1)) stepToTarget() - if(i < target_speed) - sleep(20 / target_speed) if(max_frustration && frustration > max_frustration * target_speed) handleFrustrated(1) else resetTarget() lookForTargets() if(will_patrol && !pulledby && !target) - if(patrol_path.len) + if(patrol_path && patrol_path.len) for(var/i = 1 to patrol_speed) + sleep(20 / (patrol_speed + 1)) handlePatrol() - if(i < patrol_speed) - sleep(20 / patrol_speed) if(max_frustration && frustration > max_frustration * patrol_speed) handleFrustrated(0) else @@ -219,6 +222,25 @@ return /mob/living/bot/proc/getPatrolTurf() + var/minDist = INFINITY + var/obj/machinery/navbeacon/targ = locate() in get_turf(src) + + if(!targ) + for(var/obj/machinery/navbeacon/N in navbeacons) + if(!N.codes["patrol"]) + continue + if(get_dist(src, N) < minDist) + minDist = get_dist(src, N) + targ = N + + if(targ && targ.codes["next_patrol"]) + for(var/obj/machinery/navbeacon/N in navbeacons) + if(N.location == targ.codes["next_patrol"]) + targ = N + break + + if(targ) + return get_turf(targ) return null /mob/living/bot/proc/handleIdle() @@ -255,15 +277,16 @@ on = 1 set_light(light_strength) update_icons() + resetTarget() + patrol_path = list() + ignore_list = list() return 1 /mob/living/bot/proc/turn_off() on = 0 + busy = 0 // If ever stuck... reboot! set_light(0) update_icons() - resetTarget() - patrol_path = list() - ignore_list = list() /mob/living/bot/proc/explode() qdel(src) diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index 779d912cf3..d4cb723861 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -12,7 +12,6 @@ var/cleaning = 0 var/screwloose = 0 var/oddbutton = 0 - var/should_patrol = 0 var/blood = 1 var/list/target_types = list() @@ -32,9 +31,11 @@ if(oddbutton && prob(5)) // Make a big mess visible_message("Something flies out of [src]. He seems to be acting oddly.") var/obj/effect/decal/cleanable/blood/gibs/gib = new /obj/effect/decal/cleanable/blood/gibs(loc) - ignore_list += gib + // TODO - I have a feeling weakrefs will not work in ignore_list, verify this ~Leshana + var/weakref/g = weakref(gib) + ignore_list += g spawn(600) - ignore_list -= gib + ignore_list -= g /mob/living/bot/cleanbot/lookForTargets() for(var/obj/effect/decal/cleanable/D in view(world.view, src)) // There was some odd code to make it start with nearest decals, it's unnecessary, this works @@ -110,7 +111,7 @@ dat += "Maintenance panel is [open ? "opened" : "closed"]" if(!locked || issilicon(user)) dat += "
            Cleans Blood: [blood ? "Yes" : "No"]
            " - dat += "
            Patrol station: [should_patrol ? "Yes" : "No"]
            " + dat += "
            Patrol station: [will_patrol ? "Yes" : "No"]
            " if(open && !locked) dat += "Odd looking screw twiddled: [screwloose ? "Yes" : "No"]
            " dat += "Weird button pressed: [oddbutton ? "Yes" : "No"]" @@ -134,7 +135,7 @@ blood = !blood get_targets() if("patrol") - should_patrol = !should_patrol + will_patrol = !will_patrol patrol_path = null if("screw") screwloose = !screwloose diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 09320fd323..1e23af341c 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -170,7 +170,7 @@ visible_message("[src] starts [T.dead? "removing the plant from" : "harvesting"] \the [A].") busy = 1 - if(do_after(src, 30)) + if(do_after(src, 30, A)) visible_message("[src] [T.dead? "removes the plant from" : "harvests"] \the [A].") T.attack_hand(src) if(FARMBOT_WATER) @@ -179,7 +179,7 @@ visible_message("[src] starts watering \the [A].") busy = 1 - if(do_after(src, 30)) + if(do_after(src, 30, A)) playsound(loc, 'sound/effects/slosh.ogg', 25, 1) visible_message("[src] waters \the [A].") tank.reagents.trans_to(T, 100 - T.waterlevel) @@ -198,7 +198,7 @@ visible_message("[src] starts fertilizing \the [A].") busy = 1 - if(do_after(src, 30)) + if(do_after(src, 30, A)) visible_message("[src] fertilizes \the [A].") T.reagents.add_reagent("ammonia", 10) diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index 2259515941..323d2909fb 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -1,3 +1,9 @@ +// Configure whether or not floorbot will fix hull breaches. +// This can be a problem if it tries to pave over space or shuttles. That should be fixed but... +// If it can see space outside windows, it can be laggy since it keeps wondering if it should fix them. +// Therefore that functionality is disabled for now. But it can be turned on by uncommenting this. +// #define FLOORBOT_PATCHES_HOLES 1 + /mob/living/bot/floorbot name = "Floorbot" desc = "A little floor repairing robot, he looks so excited!" @@ -25,7 +31,7 @@ /mob/living/bot/floorbot/attack_hand(var/mob/user) user.set_machine(src) - var/dat + var/list/dat = list() dat += "Automatic Station Floor Repairer v1.0

            " dat += "Status: [src.on ? "On" : "Off"]
            " dat += "Maintenance panel is [open ? "opened" : "closed"]
            " @@ -41,9 +47,9 @@ else bmode = "Disabled" dat += "

            Bridge Mode : [bmode]
            " - - user << browse("Repairbot v1.0 controls[dat]", "window=autorepair") - onclose(user, "autorepair") + var/datum/browser/popup = new(user, "autorepair", "Repairbot v1.1 controls") + popup.set_content(jointext(dat,null)) + popup.open() return /mob/living/bot/floorbot/emag_act(var/remaining_charges, var/mob/user) @@ -115,23 +121,24 @@ target = T return T = get_step(T, targetdirection) + return // In bridge mode we don't want to step off that line even to eat plates! - else // Fixing floors - for(var/turf/space/T in view(src)) // Breaches are of higher priority - if(confirmTarget(T)) - target = T - return +#ifdef FLOORBOT_PATCHES_HOLES + for(var/turf/space/T in view(src)) // Breaches are of higher priority + if(confirmTarget(T)) + target = T + return - for(var/turf/simulated/mineral/floor/T in view(src)) // Asteroids are of smaller priority - if(confirmTarget(T)) - target = T - return - - if(improvefloors) - for(var/turf/simulated/floor/T in view(src)) - if(confirmTarget(T)) - target = T - return + for(var/turf/simulated/mineral/floor/T in view(src)) // Asteroids are of smaller priority + if(confirmTarget(T)) + target = T + return +#endif + // Look for broken floors even if we aren't improvefloors + for(var/turf/simulated/floor/T in view(src)) + if(confirmTarget(T)) + target = T + return if(amount < maxAmount && (eattiles || maketiles)) for(var/obj/item/stack/S in view(src)) @@ -148,7 +155,11 @@ if(istype(A, /obj/item/stack/material/steel)) return (amount < maxAmount && maketiles) - if(A.loc.name == "Space") + // Don't pave over all of space, build there only if in bridge mode + if(!targetdirection && istype(A.loc, /area/space)) // Note name == "Space" does not work! + return 0 + + if(istype(A.loc, /area/shuttle)) // Do NOT mess with shuttle drop zones return 0 if(emagged) @@ -157,14 +168,16 @@ if(!amount) return 0 +#ifdef FLOORBOT_PATCHES_HOLES if(istype(A, /turf/space)) return 1 if(istype(A, /turf/simulated/mineral/floor)) return 1 +#endif var/turf/simulated/floor/T = A - return (istype(T) && improvefloors && !T.flooring && (get_turf(T) == loc || prob(40))) + return (istype(T) && (T.broken || T.burnt || (improvefloors && !T.flooring)) && (get_turf(T) == loc || prob(40))) /mob/living/bot/floorbot/UnarmedAttack(var/atom/A, var/proximity) if(!..()) @@ -181,12 +194,12 @@ busy = 1 update_icons() if(F.flooring) - visible_message("[src] begins to tear the floor tile from the floor!") + visible_message("\The [src] begins to tear the floor tile from the floor!") if(do_after(src, 50)) F.break_tile_to_plating() addTiles(1) else - visible_message("[src] begins to tear through the floor!") + visible_message("\The [src] begins to tear through the floor!") if(do_after(src, 150)) // Extra time because this can and will kill. F.ReplaceWithLattice() addTiles(1) @@ -201,7 +214,7 @@ return busy = 1 update_icons() - visible_message("[src] begins to repair the hole.") + visible_message("\The [src] begins to repair the hole.") if(do_after(src, 50)) if(A && (locate(/obj/structure/lattice, A) && building == 1 || !locate(/obj/structure/lattice, A) && building == 2)) // Make sure that it still needs repairs var/obj/item/I @@ -215,10 +228,20 @@ update_icons() else if(istype(A, /turf/simulated/floor)) var/turf/simulated/floor/F = A - if(!F.flooring && amount) + if(F.broken || F.burnt) busy = 1 update_icons() - visible_message("[src] begins to improve the floor.") + visible_message("\The [src] begins to remove the broken floor.") + if(do_after(src, 50, F)) + if(F.broken || F.burnt) + F.make_plating() + target = null + busy = 0 + update_icons() + else if(!F.flooring && amount) + busy = 1 + update_icons() + visible_message("\The [src] begins to improve the floor.") if(do_after(src, 50)) if(!F.flooring) F.set_flooring(get_flooring_data(floor_build_type)) @@ -228,7 +251,7 @@ update_icons() else if(istype(A, /obj/item/stack/tile/floor) && amount < maxAmount) var/obj/item/stack/tile/floor/T = A - visible_message("[src] begins to collect tiles.") + visible_message("\The [src] begins to collect tiles.") busy = 1 update_icons() if(do_after(src, 20)) @@ -242,7 +265,7 @@ else if(istype(A, /obj/item/stack/material) && amount + 4 <= maxAmount) var/obj/item/stack/material/M = A if(M.get_material_name() == DEFAULT_WALL_MATERIAL) - visible_message("[src] begins to make tiles.") + visible_message("\The [src] begins to make tiles.") busy = 1 update_icons() if(do_after(50)) @@ -252,7 +275,7 @@ /mob/living/bot/floorbot/explode() turn_off() - visible_message("[src] blows apart!") + visible_message("\The [src] blows apart!") var/turf/Tsec = get_turf(src) var/obj/item/weapon/storage/toolbox/mechanical/N = new /obj/item/weapon/storage/toolbox/mechanical(Tsec) @@ -353,4 +376,4 @@ return if(!in_range(src, user) && loc != user) return - created_name = t \ No newline at end of file + created_name = t diff --git a/code/modules/mob/living/bot/mulebot.dm b/code/modules/mob/living/bot/mulebot.dm index c330e0efc0..2079f77a35 100644 --- a/code/modules/mob/living/bot/mulebot.dm +++ b/code/modules/mob/living/bot/mulebot.dm @@ -130,10 +130,7 @@ if("sethome") var/new_dest - var/list/beaconlist = new() - for(var/obj/machinery/navbeacon/N in navbeacons) - beaconlist.Add(N.location) - beaconlist[N.location] = N + var/list/beaconlist = GetBeaconList() if(beaconlist.len) new_dest = input("Select new home tag", "Mulebot [suffix ? "([suffix])" : ""]", null) in null|beaconlist else @@ -168,10 +165,7 @@ targetName = "Home" if("SetD") var/new_dest - var/list/beaconlist = new() - for(var/obj/machinery/navbeacon/N in navbeacons) - beaconlist.Add(N.location) - beaconlist[N.location] = N + var/list/beaconlist = GetBeaconList() if(beaconlist.len) new_dest = input("Select new destination tag", "Mulebot [suffix ? "([suffix])" : ""]") in null|beaconlist else @@ -285,6 +279,15 @@ new /obj/effect/decal/cleanable/blood/oil(Tsec) ..() +/mob/living/bot/mulebot/proc/GetBeaconList() + var/list/beaconlist = list() + for(var/obj/machinery/navbeacon/N in navbeacons) + if(!N.codes["delivery"]) + continue + beaconlist.Add(N.location) + beaconlist[N.location] = N + return beaconlist + /mob/living/bot/mulebot/proc/load(var/atom/movable/C) if(busy || load || get_dist(C, src) > 1 || !isturf(C.loc)) return @@ -304,11 +307,11 @@ busy = 1 - C.loc = loc + C.forceMove(loc) sleep(2) if(C.loc != loc) //To prevent you from going onto more than one bot. return - C.loc = src + C.forceMove(src) load = C C.pixel_y += 9 @@ -325,7 +328,7 @@ busy = 1 overlays.Cut() - load.loc = loc + load.forceMove(loc) load.pixel_y -= 9 load.layer = initial(load.layer) @@ -338,7 +341,7 @@ if(AM == botcard || AM == access_scanner) continue - AM.loc = loc + AM.forceMove(loc) AM.layer = initial(AM.layer) AM.pixel_y = initial(AM.pixel_y) busy = 0 diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index f7556e0ece..d6a014c450 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -1,10 +1,14 @@ +#define SECBOT_WAIT_TIME 5 //number of in-game seconds to wait for someone to surrender +#define SECBOT_THREAT_ARREST 4 //threat level at which we decide to arrest someone +#define SECBOT_THREAT_ATTACK 8 //threat level at which was assume immediate danger and attack right away + /mob/living/bot/secbot name = "Securitron" desc = "A little security robot. He looks less than thrilled." icon_state = "secbot0" maxHealth = 100 health = 100 - req_one_access = list(access_robotics, access_security, access_forensics_lockers) + req_one_access = list(access_security, access_forensics_lockers) botcard_access = list(access_security, access_sec_doors, access_forensics_lockers, access_morgue, access_maint_tunnels) patrol_speed = 2 target_speed = 3 @@ -14,18 +18,17 @@ var/check_arrest = 1 // If true, arrests people who are set to arrest. var/arrest_type = 0 // If true, doesn't handcuff. You monster. var/declare_arrests = 0 // If true, announces arrests over sechuds. - var/auto_patrol = 0 // If true, patrols on its own var/is_ranged = 0 var/awaiting_surrender = 0 - var/list/threat_found_sounds = new('sound/voice/bcriminal.ogg', 'sound/voice/bjustice.ogg', 'sound/voice/bfreeze.ogg') - var/list/preparing_arrest_sounds = new('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/binsult.ogg', 'sound/voice/bcreep.ogg') + var/list/threat_found_sounds = list('sound/voice/bcriminal.ogg', 'sound/voice/bjustice.ogg', 'sound/voice/bfreeze.ogg') + var/list/preparing_arrest_sounds = list('sound/voice/bgod.ogg', 'sound/voice/biamthelaw.ogg', 'sound/voice/bsecureday.ogg', 'sound/voice/bradio.ogg', 'sound/voice/bcreep.ogg') /mob/living/bot/secbot/beepsky name = "Officer Beepsky" desc = "It's Officer Beep O'sky! Powered by a potato and a shot of whiskey." - auto_patrol = 1 + will_patrol = 1 /mob/living/bot/secbot/update_icons() if(on && busy) @@ -40,7 +43,7 @@ /mob/living/bot/secbot/attack_hand(var/mob/user) user.set_machine(src) - var/dat + var/list/dat = list() dat += "Automatic Security Unit

            " dat += "Status: [on ? "On" : "Off"]
            " dat += "Behaviour controls are [locked ? "locked" : "unlocked"]
            " @@ -51,10 +54,10 @@ dat += "Check Arrest Status: [check_arrest ? "Yes" : "No"]
            " dat += "Operating Mode: [arrest_type ? "Detain" : "Arrest"]
            " dat += "Report Arrests: [declare_arrests ? "Yes" : "No"]
            " - dat += "Auto Patrol: [auto_patrol ? "On" : "Off"]" - user << browse("Securitron controls[dat]", "window=autosec") - onclose(user, "autosec") - return + dat += "Auto Patrol: [will_patrol ? "On" : "Off"]" + var/datum/browser/popup = new(user, "autosec", "Securitron controls") + popup.set_content(jointext(dat,null)) + popup.open() /mob/living/bot/secbot/Topic(href, href_list) if(..()) @@ -80,7 +83,7 @@ if("switchmode") arrest_type = !arrest_type if("patrol") - auto_patrol = !auto_patrol + will_patrol = !will_patrol if("declarearrests") declare_arrests = !declare_arrests attack_hand(usr) @@ -99,10 +102,46 @@ /mob/living/bot/secbot/attackby(var/obj/item/O, var/mob/user) var/curhealth = health - ..() + . = ..() if(health < curhealth) - target = user - awaiting_surrender = 5 + react_to_attack(user) + +/mob/living/bot/secbot/bullet_act(var/obj/item/projectile/P) + var/curhealth = health + var/mob/shooter = P.firer + . = ..() + //if we already have a target just ignore to avoid lots of checking + if(!target && health < curhealth && shooter && (shooter in view(world.view, src))) + react_to_attack(shooter) + +/mob/living/bot/secbot/proc/react_to_attack(mob/attacker) + if(!target) + playsound(src.loc, pick(threat_found_sounds), 50) + broadcast_security_hud_message("[src] was attacked by a hostile [target_name(attacker)] in [get_area(src)].", src) + target = attacker + awaiting_surrender = INFINITY // Don't try and wait for surrender + +// Say "freeze!" and demand surrender +/mob/living/bot/secbot/proc/demand_surrender(mob/target, var/threat) + var/suspect_name = target_name(target) + if(declare_arrests) + broadcast_security_hud_message("[src] is [arrest_type ? "detaining" : "arresting"] a level [threat] suspect [suspect_name] in [get_area(src)].", src) + say("Down on the floor, [suspect_name]! You have [SECBOT_WAIT_TIME] seconds to comply.") + playsound(src.loc, pick(preparing_arrest_sounds), 50) + // Register to be told when the target moves + moved_event.register(target, src, /mob/living/bot/secbot/proc/target_moved) + +// Callback invoked if the registered target moves +/mob/living/bot/secbot/proc/target_moved(atom/movable/moving_instance, atom/old_loc, atom/new_loc) + if(get_dist(get_turf(src), get_turf(target)) >= 1) + awaiting_surrender = INFINITY // Done waiting! + moved_event.unregister(moving_instance, src) + +/mob/living/bot/secbot/resetTarget() + ..() + moved_event.unregister(target, src) + awaiting_surrender = -1 + walk_to(src, 0) /mob/living/bot/secbot/startPatrol() if(!locked) // Stop running away when we set you up @@ -112,8 +151,7 @@ /mob/living/bot/secbot/confirmTarget(var/atom/A) if(!..()) return 0 - - return (check_threat(A) > 3) + return (check_threat(A) >= SECBOT_THREAT_ARREST) /mob/living/bot/secbot/lookForTargets() for(var/mob/living/M in view(src)) @@ -127,23 +165,17 @@ custom_emote(1, "points at [M.name]!") return -/mob/living/bot/secbot/calcTargetPath() - ..() - if(awaiting_surrender != -1) - awaiting_surrender = 5 // This implies that a) we have already approached the target and b) it has moved after the warning - /mob/living/bot/secbot/handleAdjacentTarget() - if(awaiting_surrender < 5 && ishuman(target) && !target:lying) - if(awaiting_surrender == -1) - say("Down on the floor, [target]! You have five seconds to comply.") + var/mob/living/carbon/human/H = target + var/threat = check_threat(target) + if(awaiting_surrender < SECBOT_WAIT_TIME && istype(H) && !H.lying && threat < SECBOT_THREAT_ATTACK) + if(awaiting_surrender == -1) // On first tick of awaiting... + demand_surrender(target, threat) ++awaiting_surrender else + if(declare_arrests) + broadcast_security_hud_message("[src] is [arrest_type ? "detaining" : "arresting"] a level [threat] suspect [target_name(target)] in [get_area(src)].", src) UnarmedAttack(target) - if(ishuman(target) && declare_arrests) - var/area/location = get_area(src) - broadcast_security_hud_message("[src] is [arrest_type ? "detaining" : "arresting"] a level [check_threat(target)] suspect [target] in [location].", src) - - // say("Engaging patrol mode.") /mob/living/bot/secbot/UnarmedAttack(var/mob/M, var/proximity) if(!..()) @@ -170,17 +202,15 @@ spawn(2) busy = 0 update_icons() - visible_message("[C] was prodded by [src] with a stun baton!") + visible_message("\The [C] was prodded by \the [src] with a stun baton!") else playsound(loc, 'sound/weapons/handcuffs.ogg', 30, 1, -2) - visible_message("[src] is trying to put handcuffs on [C]!") + visible_message("\The [src] is trying to put handcuffs on \the [C]!") busy = 1 if(do_mob(src, C, 60)) if(!C.handcuffed) C.handcuffed = new /obj/item/weapon/handcuffs(C) C.update_inv_handcuffed() - if(preparing_arrest_sounds.len) - playsound(loc, pick(preparing_arrest_sounds), 50, 0) busy = 0 else if(istype(M, /mob/living/simple_animal)) var/mob/living/simple_animal/S = M @@ -193,7 +223,8 @@ spawn(2) busy = 0 update_icons() - visible_message("[M] was beaten by [src] with a stun baton!") + visible_message("\The [M] was beaten by \the [src] with a stun baton!") + /mob/living/bot/secbot/explode() visible_message("[src] blows apart!") @@ -215,11 +246,17 @@ new /obj/effect/decal/cleanable/blood/oil(Tsec) qdel(src) +/mob/living/bot/secbot/proc/target_name(mob/living/T) + if(ishuman(T)) + var/mob/living/carbon/human/H = T + return H.get_id_name("unidentified person") + return "unidentified lifeform" + /mob/living/bot/secbot/proc/check_threat(var/mob/living/M) if(!M || !istype(M) || M.stat == DEAD || src == M) return 0 - if(emagged) + if(emagged && !M.incapacitated()) //check incapacitated so emagged secbots don't keep attacking the same target forever return 10 return M.assess_perp(access_scanner, 0, idcheck, check_records, check_arrest) @@ -297,4 +334,4 @@ return if(!in_range(src, usr) && loc != usr) return - created_name = t \ No newline at end of file + created_name = t From 2863239241cda356e60b41a8fcd4fe0e9a05da61 Mon Sep 17 00:00:00 2001 From: Leshana Date: Tue, 14 Mar 2017 16:29:42 -0400 Subject: [PATCH 04/18] Map Update - Changes navbeacons to use the new simpler types that are harder to screw up. --- maps/northern_star/polaris-1.dmm | 50 ++++++++++++++++---------------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/maps/northern_star/polaris-1.dmm b/maps/northern_star/polaris-1.dmm index 97821a32cc..b1ce814e1d 100644 --- a/maps/northern_star/polaris-1.dmm +++ b/maps/northern_star/polaris-1.dmm @@ -891,7 +891,7 @@ "arg" = (/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/item/weapon/coin/gold,/obj/structure/closet/crate/secure{name = "Gold Crate"; req_access = list(19)},/turf/simulated/floor/tiled/dark,/area/security/nuke_storage) "arh" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/storage/primary) "ari" = (/obj/structure/table/standard,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/light_switch{pixel_x = 12; pixel_y = -24},/turf/simulated/floor/tiled,/area/storage/primary) -"arj" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Tool Storage"},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/storage/primary) +"arj" = (/obj/machinery/navbeacon/delivery/west{location = "Tool Storage"},/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/storage/primary) "ark" = (/obj/effect/floor_decal/industrial/hatch/yellow,/turf/simulated/floor/tiled,/area/storage/primary) "arl" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/storage/primary) "arm" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/storage/primary) @@ -1167,7 +1167,7 @@ "aww" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/research_shuttle) "awx" = (/obj/machinery/conveyor{dir = 4; id = "garbage"},/obj/machinery/light/small{dir = 1},/obj/structure/plasticflaps/mining,/turf/simulated/floor,/area/maintenance/disposal) "awy" = (/obj/machinery/conveyor{dir = 2; id = "garbage"},/obj/machinery/alarm{dir = 8; pixel_x = 25; pixel_y = 0},/turf/simulated/floor,/area/maintenance/disposal) -"awz" = (/obj/effect/floor_decal/industrial/loading,/obj/machinery/door/firedoor/border_only,/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Command"},/turf/simulated/floor/tiled,/area/bridge_hallway) +"awz" = (/obj/effect/floor_decal/industrial/loading,/obj/machinery/door/firedoor/border_only,/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon/delivery/south{location = "Command"},/turf/simulated/floor/tiled,/area/bridge_hallway) "awA" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/machinery/camera/network/interrogation{c_tag = "INT - Interrogation"},/turf/simulated/floor/tiled/dark,/area/security/interrogation) "awB" = (/obj/structure/bed/chair,/turf/simulated/floor/tiled/dark,/area/security/interrogation) "awC" = (/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/security/interrogation) @@ -1515,7 +1515,7 @@ "aDg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/effect/floor_decal/corner/red{dir = 4},/turf/simulated/floor/tiled,/area/security/security_cell_hallway) "aDh" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/security/security_cell_hallway) "aDi" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/window/westright{name = "Security Delivery"; req_access = list(1)},/obj/structure/window/reinforced,/turf/simulated/floor/tiled,/area/security/security_cell_hallway) -"aDj" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; dir = 1; freq = 1400; location = "Security"},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/plating,/area/security/security_cell_hallway) +"aDj" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon/delivery/west{location = "Security"},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/plating,/area/security/security_cell_hallway) "aDk" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/security_starboard) "aDl" = (/obj/effect/decal/cleanable/blood/oil,/obj/item/trash/tastybread,/turf/simulated/floor/plating,/area/maintenance/security_starboard) "aDm" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/maintenance/holodeck) @@ -1789,7 +1789,7 @@ "aIu" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/effect/floor_decal/corner/red,/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled,/area/security/brig) "aIv" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/red{dir = 10},/obj/machinery/light,/turf/simulated/floor/tiled,/area/security/brig) "aIw" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/effect/floor_decal/corner/red{dir = 8},/obj/machinery/camera/network/security{c_tag = "SEC - Brig Port"; dir = 1},/turf/simulated/floor/tiled,/area/security/brig) -"aIx" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH2"; location = "CH1"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aIx" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/navbeacon/patrol{next_patrol = "CH2"; location = "CH1"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aIy" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/glass,/obj/effect/floor_decal/corner/red,/turf/simulated/floor/tiled,/area/security/brig) "aIz" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/effect/floor_decal/corner/red{dir = 10},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/security/brig) "aIA" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/effect/floor_decal/corner/red{dir = 8},/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/turf/simulated/floor/tiled,/area/security/brig) @@ -1882,7 +1882,7 @@ "aKj" = (/obj/structure/table/standard,/obj/structure/bedsheetbin,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/security/prison) "aKk" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/security/prison) "aKl" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor,/area/maintenance/security_starboard) -"aKm" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Janitor"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/janitor) +"aKm" = (/obj/machinery/navbeacon/delivery/east{location = "Janitor"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/janitor) "aKn" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/brown,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_10) "aKo" = (/obj/structure/janitorialcart,/turf/simulated/floor/tiled,/area/janitor) "aKp" = (/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_10) @@ -2494,7 +2494,7 @@ "aVX" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aVY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aVZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/central_one) -"aWa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH3"; location = "CH2"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aWa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/navbeacon/patrol{next_patrol = "CH3"; location = "CH2"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aWb" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aWc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aWd" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) @@ -2510,7 +2510,7 @@ "aWn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aWo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "aWp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) -"aWq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH4"; location = "CH3"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aWq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/navbeacon/patrol{next_patrol = "CH4"; location = "CH3"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aWr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "aWs" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "aWt" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) @@ -3068,7 +3068,7 @@ "bgZ" = (/turf/simulated/wall,/area/medical/cryo) "bha" = (/obj/structure/bookcase/manuals/medical,/obj/item/weapon/book/manual/stasis,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) "bhb" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/lime{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hydroponics) -"bhc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH5"; location = "CH4"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bhc" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/machinery/navbeacon/patrol{next_patrol = "CH5"; location = "CH4"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bhd" = (/obj/machinery/vending/cola,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) "bhe" = (/obj/machinery/vending/coffee,/obj/effect/floor_decal/corner/paleblue/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/medbreak) "bhf" = (/turf/simulated/wall,/area/crew_quarters/medical_restroom) @@ -4343,7 +4343,7 @@ "bFA" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/maintenance/central) "bFB" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor,/area/maintenance/central) "bFC" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/security/tactical) -"bFD" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Kitchen"},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading,/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) +"bFD" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon/delivery/south{location = "Kitchen"},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading,/turf/simulated/floor/tiled,/area/crew_quarters/kitchen) "bFE" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/table/marble,/obj/item/weapon/book/manual/chef_recipes,/obj/item/weapon/reagent_containers/food/condiment/small/saltshaker{pixel_x = -3; pixel_y = 0},/obj/item/weapon/reagent_containers/food/condiment/small/peppermill{pixel_x = 3},/obj/machinery/camera/network/civilian{c_tag = "CIV - Kitchen Port"; dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bFF" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 28},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bFG" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/cooker/grill,/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) @@ -4356,7 +4356,7 @@ "bFN" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/closet/secure_closet/freezer/fridge,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bFO" = (/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for shutters."; id = "hop_office_desk"; name = "Desk Privacy Shutter"; pixel_x = 16; pixel_y = 28},/obj/machinery/button/windowtint{id = "hop_office"; pixel_x = 26; pixel_y = 29},/obj/structure/bed/chair/office/dark{dir = 8},/obj/effect/floor_decal/corner/blue{dir = 9},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "bFP" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/structure/sink/kitchen{pixel_y = 28},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) -"bFQ" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Hydroponics"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading,/turf/simulated/floor/tiled,/area/hydroponics) +"bFQ" = (/obj/machinery/navbeacon/delivery/south{location = "Hydroponics"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading,/turf/simulated/floor/tiled,/area/hydroponics) "bFR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/kitchen) "bFS" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/sign/directions/medical{dir = 4; pixel_x = 32; pixel_y = 0},/obj/structure/sign/directions/cargo{dir = 2; pixel_x = 32; pixel_z = 8},/obj/structure/sign/directions/engineering{dir = 2; pixel_x = 32; pixel_z = -8},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_two) "bFT" = (/obj/structure/bed/chair{dir = 4},/obj/effect/landmark/start{name = "Medical Doctor"},/obj/effect/floor_decal/corner/paleblue{dir = 8},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/reception) @@ -4718,7 +4718,7 @@ "bML" = (/obj/machinery/vending/medical,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/patient_wing) "bMM" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/effect/floor_decal/corner/paleblue{dir = 5},/turf/simulated/floor/tiled/white,/area/medical/patient_wing) "bMN" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/rnd/research) -"bMO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH1"; location = "CH12"},/turf/simulated/floor/tiled,/area/hallway/primary/central_four) +"bMO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon/patrol{next_patrol = "CH1"; location = "CH12"},/turf/simulated/floor/tiled,/area/hallway/primary/central_four) "bMP" = (/obj/structure/sign/biohazard,/turf/simulated/wall,/area/medical/patient_wing) "bMQ" = (/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/machinery/door/blast/shutters{density = 0; dir = 4; icon_state = "shutter0"; id = "medbayquar"; name = "Medbay Emergency Lockdown Shutters"; opacity = 0},/turf/simulated/floor/tiled/dark,/area/medical/virologyaccess) "bMR" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/medical/virologyaccess) @@ -4831,7 +4831,7 @@ "bOU" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 28},/obj/effect/floor_decal/corner/purple{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/glass_research{name = "Research Dock Hallway"; req_access = list(47)},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled/white,/area/rnd/docking) "bOV" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor,/area/maintenance/research) "bOW" = (/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor,/area/maintenance/research) -"bOX" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "Research Division"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/rnd/research) +"bOX" = (/obj/machinery/navbeacon/delivery/east{location = "Research Division"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/rnd/research) "bOY" = (/obj/effect/floor_decal/industrial/hatch/yellow,/obj/structure/window/reinforced,/obj/machinery/door/window/eastright{base_state = "left"; dir = 4; icon_state = "left"; name = "Research Division Delivery"; req_access = list(47)},/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/rnd/research) "bOZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow{dir = 10},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/research) "bPa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/white,/area/rnd/research) @@ -4975,14 +4975,14 @@ "bRI" = (/obj/machinery/vending/boozeomat,/obj/machinery/status_display{pixel_x = -32; pixel_y = 0},/turf/simulated/floor/lino,/area/crew_quarters/bar) "bRJ" = (/obj/machinery/vending/dinnerware,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bRK" = (/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/obj/structure/plasticflaps/mining,/turf/simulated/floor/plating,/area/quartermaster/delivery) -"bRL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH6"; location = "CH5"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bRL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon/patrol{next_patrol = "CH6"; location = "CH5"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bRM" = (/obj/structure/table/reinforced,/obj/machinery/door/window/southright{name = "Robotics Desk"; req_access = list(29)},/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/folder/white,/obj/item/weapon/pen,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/assembly/robotics) "bRN" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/lino,/area/crew_quarters/bar) "bRO" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/lino,/area/crew_quarters/bar) "bRP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/neutral,/area/crew_quarters/cafeteria) -"bRQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH12"; location = "CH11"},/turf/simulated/floor/tiled,/area/hallway/primary/central_four) +"bRQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon/patrol{next_patrol = "CH12"; location = "CH11"},/turf/simulated/floor/tiled,/area/hallway/primary/central_four) "bRR" = (/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = -32},/obj/machinery/camera/network/northern_star{c_tag = "Hall - Port Primary 3"; dir = 4},/turf/simulated/floor/tiled/dark,/area/hallway/primary/port) -"bRS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH7"; location = "CH6"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bRS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon/patrol{next_patrol = "CH7"; location = "CH6"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bRT" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) "bRU" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bRV" = (/obj/machinery/power/apc/super/critical{dir = 4; is_critical = 1; name = "east bump"; pixel_x = 24; pixel_y = 0},/obj/structure/cable/cyan,/turf/simulated/floor/bluegrid,/area/ai) @@ -5138,7 +5138,7 @@ "bUP" = (/turf/simulated/wall/r_wall,/area/bridge_hallway) "bUQ" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/folder/blue,/obj/item/device/megaphone,/obj/machinery/requests_console{announcementConsole = 1; department = "Colony Director's Desk"; departmentType = 5; name = "Station Administrator RC"; pixel_x = 30; pixel_y = 0},/obj/structure/window/reinforced,/obj/item/weapon/pen/multi,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bUR" = (/turf/simulated/wall,/area/crew_quarters/cafeteria) -"bUS" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; dir = 1; freq = 1400; location = "Medbay"},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/plating,/area/medical/patient_wing) +"bUS" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon/delivery/west{location = "Medbay"},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/plating,/area/medical/patient_wing) "bUT" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/lino,/area/crew_quarters/bar) "bUU" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) "bUV" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/item/clothing/head/cakehat,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria) @@ -6388,13 +6388,13 @@ "csR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/port) "csS" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/docking_hallway) "csT" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/flora/pottedplant,/turf/simulated/floor/tiled,/area/quartermaster/foyer) -"csU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH11"; location = "CH10"},/turf/simulated/floor/tiled,/area/hallway/primary/central_four) -"csV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH10"; location = "CH9"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"csU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon/patrol{next_patrol = "CH11"; location = "CH10"},/turf/simulated/floor/tiled,/area/hallway/primary/central_four) +"csV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/navbeacon/patrol{next_patrol = "CH10"; location = "CH9"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "csW" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway2) "csX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/locker) "csY" = (/turf/simulated/floor/wood,/area/crew_quarters/bar) -"csZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH9"; location = "CH8"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) -"cta" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH8"; location = "CH7"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"csZ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/navbeacon/patrol{next_patrol = "CH9"; location = "CH8"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"cta" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/navbeacon/patrol{next_patrol = "CH8"; location = "CH7"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "ctb" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/bar) "ctc" = (/obj/structure/flora/pottedplant{icon_state = "plant-22"},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/docking_hallway2) "ctd" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled/dark,/area/crew_quarters/locker) @@ -6544,7 +6544,7 @@ "cvR" = (/obj/machinery/light,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "cvS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/quartermaster/storage) "cvT" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/storage) -"cvU" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #3"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"cvU" = (/obj/machinery/navbeacon/delivery/south{location = "QM #3"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/storage) "cvV" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/camera/network/medbay{c_tag = "MED - FA Station Port"; dir = 1},/obj/machinery/light_switch{pixel_x = -36; pixel_y = 0},/obj/effect/floor_decal/corner/paleblue{dir = 9},/turf/simulated/floor/tiled/white,/area/medical/first_aid_station) "cvW" = (/obj/structure/table/standard,/obj/item/weapon/hand_labeler,/obj/effect/floor_decal/corner/brown{dir = 10},/obj/machinery/recharger,/turf/simulated/floor/tiled,/area/quartermaster/office) "cvX" = (/obj/machinery/status_display/supply_display,/turf/simulated/wall,/area/quartermaster/qm) @@ -7532,7 +7532,7 @@ "cOR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge) "cOS" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_11) "cOT" = (/obj/effect/decal/cleanable/blood/oil,/obj/effect/decal/remains/robot,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/bar) -"cOU" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Bar"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/bar) +"cOU" = (/obj/machinery/navbeacon/delivery/east{location = "Bar"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/bar) "cOV" = (/obj/structure/bed/chair/wood{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop) "cOW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/coffee_shop) "cOX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(24)},/turf/simulated/floor,/area/maintenance/atmos_control) @@ -8903,7 +8903,7 @@ "dpk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dpl" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dpm" = (/obj/machinery/door/window/westleft{name = "Engineering Reception Desk"; req_access = list(10); req_one_access = newlist()},/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "englockdown"; name = "Engineering Lockdown"; opacity = 0},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) -"dpn" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=4"; freq = 1400; location = "Engineering"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{dir = 4},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) +"dpn" = (/obj/machinery/navbeacon/delivery/west{location = "Engineering"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{dir = 4},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dpo" = (/obj/structure/closet/emcloset,/turf/simulated/floor,/area/maintenance/engineering) "dpp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/maintenance/engineering) "dpq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/maintenance/engineering) @@ -9705,8 +9705,8 @@ "dEG" = (/obj/structure/bed/chair/comfy/black{dir = 4},/turf/simulated/floor/carpet,/area/crew_quarters/longue_area) "dEH" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/wood,/area/crew_quarters/longue_area) "dEI" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway2) -"dEJ" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #1"},/obj/effect/floor_decal/industrial/outline/yellow,/mob/living/bot/mulebot,/turf/simulated/floor/tiled,/area/quartermaster/storage) -"dEK" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #2"},/obj/effect/floor_decal/industrial/outline/yellow,/mob/living/bot/mulebot,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"dEJ" = (/obj/machinery/navbeacon/delivery/south{location = "QM #1"},/obj/effect/floor_decal/industrial/outline/yellow,/mob/living/bot/mulebot,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"dEK" = (/obj/machinery/navbeacon/delivery/south{location = "QM #2"},/obj/effect/floor_decal/industrial/outline/yellow,/mob/living/bot/mulebot,/turf/simulated/floor/tiled,/area/quartermaster/storage) "dEL" = (/turf/simulated/mineral,/area/mine/explored/upper_level) "dEM" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/longue_area) "dEN" = (/obj/structure/table/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_6) From 4c82d41bd74675e9b0daa576be709bc4edce185f Mon Sep 17 00:00:00 2001 From: Anewbe Date: Wed, 15 Mar 2017 16:11:38 -0500 Subject: [PATCH 05/18] Might fix Vox blindness --- code/ZAS/Phoron.dm | 16 +++------------- 1 file changed, 3 insertions(+), 13 deletions(-) diff --git a/code/ZAS/Phoron.dm b/code/ZAS/Phoron.dm index fd79d83dc5..92dd6f5d51 100644 --- a/code/ZAS/Phoron.dm +++ b/code/ZAS/Phoron.dm @@ -95,14 +95,14 @@ obj/var/phoronproof = 0 return //Burn skin if exposed. - if(vsc.plc.SKIN_BURNS) + if(vsc.plc.SKIN_BURNS && (species.breath_type != "phoron")) if(!pl_head_protected() || !pl_suit_protected()) burn_skin(0.75) if(prob(20)) src << "Your skin burns!" updatehealth() //Burn eyes if exposed. - if(vsc.plc.EYE_BURNS) + if(vsc.plc.EYE_BURNS && (species.breath_type != "phoron")) if(!head) if(!wear_mask) burn_eyes() @@ -118,22 +118,12 @@ obj/var/phoronproof = 0 burn_eyes() //Genetic Corruption - if(vsc.plc.GENETIC_CORRUPTION) + if(vsc.plc.GENETIC_CORRUPTION && (species.breath_type != "phoron")) if(rand(1,10000) < vsc.plc.GENETIC_CORRUPTION) randmutb(src) src << "High levels of toxins cause you to spontaneously mutate!" domutcheck(src,null) -/mob/living/carbon/human/vox/pl_effects() - //Handles all the bad things phoron can do to Vox. - - //Contamination - if(vsc.plc.CLOTH_CONTAMINATION) contaminate() - - //Anything else requires them to not be dead. - if(stat >= 2) - return - /mob/living/carbon/human/proc/burn_eyes() var/obj/item/organ/internal/eyes/E = internal_organs_by_name[O_EYES] if(E) From 78563a608eb5f59e94c948b77e93574267576a62 Mon Sep 17 00:00:00 2001 From: Leshana Date: Fri, 17 Mar 2017 00:33:25 -0400 Subject: [PATCH 06/18] Fix runtime in mob controller loop. * Any nulls present in the mob_list would cause a runtime when checked if they are gcDestroyed. Add a null check. * Noticed that the object controller has the same bug, might as well fix now too. --- code/controllers/Processes/mob.dm | 2 +- code/controllers/Processes/obj.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/code/controllers/Processes/mob.dm b/code/controllers/Processes/mob.dm index b44842036d..8681803ac4 100644 --- a/code/controllers/Processes/mob.dm +++ b/code/controllers/Processes/mob.dm @@ -14,7 +14,7 @@ /datum/controller/process/mob/doWork() for(last_object in mob_list) var/mob/M = last_object - if(isnull(M.gcDestroyed)) + if(M && isnull(M.gcDestroyed)) try M.Life() catch(var/exception/e) diff --git a/code/controllers/Processes/obj.dm b/code/controllers/Processes/obj.dm index bd50edd111..1010c8cc97 100644 --- a/code/controllers/Processes/obj.dm +++ b/code/controllers/Processes/obj.dm @@ -11,7 +11,7 @@ /datum/controller/process/obj/doWork() for(last_object in processing_objects) var/datum/O = last_object - if(isnull(O.gcDestroyed)) + if(O && isnull(O.gcDestroyed)) try O:process() catch(var/exception/e) From 801dc5e0a6c31677c5deba4866bb0a91c2170b2c Mon Sep 17 00:00:00 2001 From: Leshana Date: Fri, 17 Mar 2017 00:49:19 -0400 Subject: [PATCH 07/18] Fix another runtime when trying to respawn before roundstart. * If you observe, then want to respawn before the round starts, it runtimes. Lets prevent this. --- code/modules/mob/mob.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 7d969569d4..95a96f03c8 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -341,7 +341,7 @@ if ((stat != 2 || !( ticker ))) usr << "You must be dead to use this!" return - if (ticker.mode.deny_respawn) //BS12 EDIT + if (ticker.mode && ticker.mode.deny_respawn) //BS12 EDIT usr << "Respawn is disabled for this roundtype." return else From 5425a06bc8171490c7283a018a5225541b275736 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Sat, 18 Mar 2017 19:29:27 -0400 Subject: [PATCH 08/18] Fixes ventcrawl Fixes #1202 --- code/modules/ventcrawl/ventcrawl_atmospherics.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/ventcrawl/ventcrawl_atmospherics.dm b/code/modules/ventcrawl/ventcrawl_atmospherics.dm index f2cbb8018d..1fd9dd077c 100644 --- a/code/modules/ventcrawl/ventcrawl_atmospherics.dm +++ b/code/modules/ventcrawl/ventcrawl_atmospherics.dm @@ -59,7 +59,7 @@ if(welded) return 0 - ..() + . = ..() /obj/machinery/atmospherics/proc/findConnecting(var/direction) for(var/obj/machinery/atmospherics/target in get_step(src,direction)) From ef52ccbe4dcfeba7a6d21d6e5ef72251becc53ee Mon Sep 17 00:00:00 2001 From: Leshana Date: Sun, 19 Mar 2017 16:52:08 -0400 Subject: [PATCH 09/18] Fix thrown objects hitting windows not in their path * Fixes windows counting as blocking the entire tile for thrown objects when they don't. * Same thing for windoors, which have the same problem. --- code/game/atoms_movable.dm | 13 +++++++++++-- 1 file changed, 11 insertions(+), 2 deletions(-) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 4c48b84532..b76620fa95 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -125,8 +125,17 @@ if(A:lying) continue src.throw_impact(A,speed) if(isobj(A)) - if(A.density && !A.throwpass) // **TODO: Better behaviour for windows which are dense, but shouldn't always stop movement - src.throw_impact(A,speed) + if(!A.density || A.throwpass) + continue + // Special handling of windows, which are dense but block only from some directions + if(istype(A, /obj/structure/window)) + var/obj/structure/window/W = A + if (!W.is_full_window() && !(turn(src.last_move, 180) & A.dir)) + continue + // Same thing for (closed) windoors, which have the same problem + else if(istype(A, /obj/machinery/door/window) && !(turn(src.last_move, 180) & A.dir)) + continue + src.throw_impact(A,speed) /atom/movable/proc/throw_at(atom/target, range, speed, thrower) if(!target || !src) return 0 From 530593508a51eee95cac4ae14a71f7f342648cfa Mon Sep 17 00:00:00 2001 From: Atermonera Date: Sun, 19 Mar 2017 16:58:04 -0700 Subject: [PATCH 10/18] Gives surgeonborgs the full medical hud, because why don't they already have it? --- .../mob/living/silicon/robot/robot_modules.dm | 1 + html/changelogs/Atermonera - Surgeonborg.yml | 37 +++++++++++++++++++ 2 files changed, 38 insertions(+) create mode 100644 html/changelogs/Atermonera - Surgeonborg.yml diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index 45af995df8..312c01839c 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -190,6 +190,7 @@ var/global/list/robot_modules = list( /obj/item/weapon/robot_module/robot/medical/surgeon/New() ..() + src.modules += new /obj/item/borg/sight/hud/med(src) src.modules += new /obj/item/device/healthanalyzer(src) src.modules += new /obj/item/weapon/reagent_containers/borghypo(src) src.modules += new /obj/item/weapon/scalpel(src) diff --git a/html/changelogs/Atermonera - Surgeonborg.yml b/html/changelogs/Atermonera - Surgeonborg.yml new file mode 100644 index 0000000000..c4be42fbbe --- /dev/null +++ b/html/changelogs/Atermonera - Surgeonborg.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Atermonera + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Surgeon Borgs now have a proper medical hud module" + From c8e26b365ae49ee0a027cf7e6f18fc7927ebeac8 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Mon, 20 Mar 2017 00:32:04 -0400 Subject: [PATCH 11/18] Flooring decals should work more places Such as shuttles. A good example is the trader ship which has hazard stripes mapped in, which don't appear in the game because it doesn't work there. --- code/game/turfs/flooring/flooring_decals.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm index fc4dcd1d25..56b503c7c7 100644 --- a/code/game/turfs/flooring/flooring_decals.dm +++ b/code/game/turfs/flooring/flooring_decals.dm @@ -17,7 +17,7 @@ var/list/floor_decals = list() /obj/effect/floor_decal/initialize() if(supplied_dir) set_dir(supplied_dir) var/turf/T = get_turf(src) - if(istype(T, /turf/simulated/floor) || istype(T, /turf/unsimulated/floor)) + if(istype(T, /turf/simulated/floor) || istype(T, /turf/unsimulated/floor) || istype(T, /turf/simulated/shuttle/floor)) var/cache_key = "[alpha]-[color]-[dir]-[icon_state]-[layer]" if(!floor_decals[cache_key]) var/image/I = image(icon = src.icon, icon_state = src.icon_state, dir = src.dir) From 5c3172389ea5a1743dc6faab789170c1cb8244d9 Mon Sep 17 00:00:00 2001 From: Leshana Date: Sun, 19 Mar 2017 23:28:45 -0400 Subject: [PATCH 12/18] Make jukebox controllable by its wires Added four extra hacking wires to the jukebox for Play, Stop, Next, and Prev. The main purpose is to allow attaching of singallers for remote controlling the jukebox. --- code/datums/wires/jukebox.dm | 14 +++++++++++++- code/game/machinery/jukebox.dm | 22 +++++++++++++++++++++- 2 files changed, 34 insertions(+), 2 deletions(-) diff --git a/code/datums/wires/jukebox.dm b/code/datums/wires/jukebox.dm index f482133e62..900c778189 100644 --- a/code/datums/wires/jukebox.dm +++ b/code/datums/wires/jukebox.dm @@ -1,7 +1,7 @@ /datum/wires/jukebox random = 1 holder_type = /obj/machinery/media/jukebox - wire_count = 7 + wire_count = 11 var/const/WIRE_POWER = 1 var/const/WIRE_HACK = 2 @@ -10,6 +10,10 @@ var/const/WIRE_SPEEDDOWN = 8 var/const/WIRE_REVERSE = 16 var/const/WIRE_NOTHING1 = 32 var/const/WIRE_NOTHING2 = 64 +var/const/WIRE_START = 128 +var/const/WIRE_STOP = 256 +var/const/WIRE_PREV = 512 +var/const/WIRE_NEXT = 1024 /datum/wires/jukebox/CanUse(var/mob/living/L) var/obj/machinery/media/jukebox/A = holder @@ -40,6 +44,14 @@ var/const/WIRE_NOTHING2 = 64 holder.visible_message("\icon[holder] The speakers squeaks.") if(WIRE_SPEEDDOWN) holder.visible_message("\icon[holder] The speakers rumble.") + if(WIRE_START) + A.StartPlaying() + if(WIRE_STOP) + A.StopPlaying() + if(WIRE_PREV) + A.PrevTrack() + if(WIRE_NEXT) + A.NextTrack() else A.shock(usr, 10) // The nothing wires give a chance to shock just for fun diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 71482abb33..4eb0e7d408 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -269,4 +269,24 @@ datum/track/New(var/title_name, var/audio) playing = 1 update_use_power(2) - update_icon() \ No newline at end of file + update_icon() + +// Advance to the next track - Don't start playing it unless we were already playing +/obj/machinery/media/jukebox/proc/NextTrack() + if(!tracks.len) return + var/curTrackIndex = max(1, tracks.Find(current_track)) + var/newTrackIndex = (curTrackIndex % tracks.len) + 1 // Loop back around if past end + current_track = tracks[newTrackIndex] + if(playing) + StartPlaying() + updateDialog() + +// Advance to the next track - Don't start playing it unless we were already playing +/obj/machinery/media/jukebox/proc/PrevTrack() + if(!tracks.len) return + var/curTrackIndex = max(1, tracks.Find(current_track)) + var/newTrackIndex = curTrackIndex == 1 ? tracks.len : curTrackIndex - 1 + current_track = tracks[newTrackIndex] + if(playing) + StartPlaying() + updateDialog() From 83cc01956275414cb23d660f66e7dcf159028764 Mon Sep 17 00:00:00 2001 From: nachomeep Date: Mon, 20 Mar 2017 20:31:42 -0400 Subject: [PATCH 13/18] Fixes phoron sprites. (#3100) * Fixes phoron sprites. * Re-adds the phoron-tank changes for the vox??? * touches up tank sprites --- code/game/machinery/atmoalter/canister.dm | 2 +- .../objects/items/weapons/tanks/tank_types.dm | 3 +-- icons/mob/back.dmi | Bin 84867 -> 85423 bytes icons/obj/assemblies.dmi | Bin 24492 -> 24491 bytes icons/obj/atmos.dmi | Bin 20108 -> 20617 bytes 5 files changed, 2 insertions(+), 3 deletions(-) diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 5cf1c188d8..dcce5fb938 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -348,7 +348,7 @@ update_flag "\[N2O\]" = "redws", \ "\[N2\]" = "red", \ "\[O2\]" = "blue", \ - "\[Phoron\]" = "purple", \ + "\[Phoron\]" = "orangeps", \ "\[CO2\]" = "black", \ "\[Air\]" = "grey", \ "\[CAUTION\]" = "yellow", \ diff --git a/code/game/objects/items/weapons/tanks/tank_types.dm b/code/game/objects/items/weapons/tanks/tank_types.dm index d9d19ca4d5..0ff657e9cc 100644 --- a/code/game/objects/items/weapons/tanks/tank_types.dm +++ b/code/game/objects/items/weapons/tanks/tank_types.dm @@ -104,7 +104,6 @@ name = "phoron tank" desc = "Contains dangerous phoron. Do not inhale. Warning: extremely flammable." icon_state = "phoron_vox" - item_state = "oxygen_fr" gauge_icon = null flags = CONDUCT distribute_pressure = ONE_ATMOSPHERE*O2STANDARD @@ -210,4 +209,4 @@ /obj/item/weapon/tank/nitrogen/examine(mob/user) if(..(user, 0) && air_contents.gas["nitrogen"] < 10) user << text("The meter on \the [src] indicates you are almost out of nitrogen!") - //playsound(user, 'sound/effects/alert.ogg', 50, 1) \ No newline at end of file + //playsound(user, 'sound/effects/alert.ogg', 50, 1) diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index c9acba40a49b32db47479227bc7cc243f78ec9e3..13614d0ed7aacf611537f0e16d3414590eb63b75 100644 GIT binary patch delta 20523 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 diff --git a/icons/obj/assemblies.dmi b/icons/obj/assemblies.dmi index 89ab898f563763cf654df9f1e0fb861ed5367007..8767b661271ae6c27f6c1fe311b71130f5fce418 100644 GIT binary patch delta 569 zcmV-90>=HUzX7Yi0gxnr9(q(*bVOxyV{&P5bZKvH004NLrIpWan?Ml8&*mvs$<s2Zm&#G)L-Gn}%#LBo{z1z^?LK`EuBnYpc1Xnqq~EvmX}+1|QG9>>v3(btw{6m+ zZ^>DaiKj2CWbunss6-~du9HQDR94~i(FO=8GV#z>uBh{x!b7ruP~=;Yi8NX4Js3Q_ z4GAoh%e;IEqZ9%L(Z^Dt*3@nob7_&S|F0f&YxpLHrq~%9WGbiJY>lwGgNHF1dS}@`7M!;PE3z%!=qn*Ei<4dif z4OB=xG}^V)BjX+zOJ>G>qo0|!F_gQGa|akh`OX7b7D?8BGSA$1I(|DCL%BjwED%i- zj#07)-D4gfksfr9QA%M?MI37?=Uu#m?rVmNWxbuG{H&3O_M4P{jXXe>vGZicj7d-f7O!jcbXwO#>-iQFIOAgq8K` zYQ;Ivy&^3uf-fqv<%F?s>?-4_mrdszMmi@t@7-YveH5?n8?kxYCVv3F(%YOKg5jF8 HOafqCGb|NH delta 570 zcmV-A0>%BSzX7bj0gxnrA9_?+bVOxyV{&P5bZKvH004NLrIpKW+b|GC*Vb1M$<{1v zHz|;XH-&@3i{uxCu{f5d;zOV))$Z4K;aauz2uCTjk$`hK7jtK*NAdmj$NpXH-u6k0 zz9whIRy=)KC5vCALLs)|>n2$gNO=)1A9a9$Vk;i%!ewPzQg}#z7K(f=wql(ujvfqN z-a8V!ab8kxDWI2NL7#u4kIKj%JzQn0fA|vvU(ds309(#1Ap_WwS;wQ29uzrdjgF6> zUwL;LY0^YbZ|U_oy-5}dHJrs(td|qgO;q|kkeWsZ3eIV!%Z~qy&rbXqr~RZpa@kLb z?a+fF7k9T_K95I#&>vYw;Qfi6o4O2O%b5-JpvYYhh`PO_WdK_;C0*W3-h(0+Wdj-X z{N=jC<9&WvPH8z~F{NeB#ZdDTc64InP*;8o_4;*?hv-H+Gf5@K=qm80lQ-DeO_azVF2DZJ+!BUM1X#qN_LO Ivr7VCU6RNX(EtDd diff --git a/icons/obj/atmos.dmi b/icons/obj/atmos.dmi index d3b7507edce9013c39175c3150f2b1ff3b2c80c8..b00173777f37d6648cfb65449ce598b6adbf42b7 100644 GIT binary patch literal 20617 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 From 4779baf8725fa7643cc16c425768867e0f2bcd00 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Mon, 20 Mar 2017 20:14:48 -0500 Subject: [PATCH 14/18] Spelling --- code/datums/supplypacks/robotics.dm | 8 ++-- .../loadout/loadout_uniform.dm | 6 +-- code/modules/clothing/under/miscellaneous.dm | 6 +-- code/modules/organs/robolimbs.dm | 36 +++++++++--------- ...yml => Anewbe - Hephaestus Industries.yml} | 0 .../hephaestus_alt1.dmi} | Bin .../hephaestus_main.dmi} | Bin .../hephaestus_monitor.dmi} | Bin 8 files changed, 28 insertions(+), 28 deletions(-) rename html/changelogs/{Anewbe - Hephaistos Industries.yml => Anewbe - Hephaestus Industries.yml} (100%) rename icons/mob/human_races/cyberlimbs/{hesphiastos/hesphiastos_alt1.dmi => hephaestus/hephaestus_alt1.dmi} (100%) rename icons/mob/human_races/cyberlimbs/{hesphiastos/hesphiastos_main.dmi => hephaestus/hephaestus_main.dmi} (100%) rename icons/mob/human_races/cyberlimbs/{hesphiastos/hesphiastos_monitor.dmi => hephaestus/hephaestus_monitor.dmi} (100%) diff --git a/code/datums/supplypacks/robotics.dm b/code/datums/supplypacks/robotics.dm index a1ded3c528..90d05fbbdc 100644 --- a/code/datums/supplypacks/robotics.dm +++ b/code/datums/supplypacks/robotics.dm @@ -39,7 +39,7 @@ name = "All robolimb blueprints" contains = list( /obj/item/weapon/disk/limb/bishop, - /obj/item/weapon/disk/limb/hephaistos, + /obj/item/weapon/disk/limb/hephaestus, /obj/item/weapon/disk/limb/morpheus, /obj/item/weapon/disk/limb/veymed, /obj/item/weapon/disk/limb/wardtakahashi, @@ -68,11 +68,11 @@ containername = "Robolimb blueprints (Xion)" access = access_robotics -/datum/supply_packs/robotics/robolimbs/ +/datum/supply_packs/robotics/robolimbs/hephaestus name = "Hephaistos robolimb blueprints" - contains = list(/obj/item/weapon/disk/limb/hephaistos) + contains = list(/obj/item/weapon/disk/limb/hephaestus) containertype = /obj/structure/closet/crate/secure/gear - containername = "Robolimb blueprints (Hephaistos)" + containername = "Robolimb blueprints (Hephaestus)" access = access_robotics /datum/supply_packs/robotics/robolimbs/wardtakahashi diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index a07f8bb45a..518b11a521 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -442,6 +442,6 @@ display_name = "outfit, frontier" path = /obj/item/clothing/under/frontier -/datum/gear/uniform/brandsuit/hephaistos - display_name = "jumpsuit, hephaistos" - path = /obj/item/clothing/under/hephaistos \ No newline at end of file +/datum/gear/uniform/brandsuit/hephaestus + display_name = "jumpsuit, hephaestus" + path = /obj/item/clothing/under/hephaestus \ No newline at end of file diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index fbc29fa5ec..96c47d054a 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -681,9 +681,9 @@ icon_state = "focal" worn_state = "focal" -/obj/item/clothing/under/hephaistos - name = "\improper Hephaistos jumpsuit" - desc = "A jumpsuit belonging to Hephaistos Industries, a Trans-Stellar best known for its arms production." +/obj/item/clothing/under/hephaestus + name = "\improper Hephaestus jumpsuit" + desc = "A jumpsuit belonging to Hephaestus Industries, a Trans-Stellar best known for its arms production." icon_state = "heph" worn_state = "heph" diff --git a/code/modules/organs/robolimbs.dm b/code/modules/organs/robolimbs.dm index 760af1a5b4..05e4eaa54d 100644 --- a/code/modules/organs/robolimbs.dm +++ b/code/modules/organs/robolimbs.dm @@ -70,30 +70,30 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ parts = list(BP_HEAD) monitor_styles = standard_monitor_styles -/datum/robolimb/hephaistos - company = "Hephaistos" +/datum/robolimb/hephaestus + company = "Hephaestus" desc = "This limb has a militaristic black and green casing with gold stripes." - icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_main.dmi' + icon = 'icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_main.dmi' unavailable_to_build = 1 -/datum/robolimb/hephaistos_alt1 +/datum/robolimb/hephaestus_alt1 company = "Hephaistos - Frontier" - desc = "A rugged prosthetic head featuring the standard Hesphiastos theme, a visor and an external display." - icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_alt1.dmi' + desc = "A rugged prosthetic head featuring the standard Hephaestus theme, a visor and an external display." + icon = 'icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_alt1.dmi' unavailable_to_build = 1 parts = list(BP_HEAD) - monitor_styles = "blank=hephaistos_alt_off;\ - pink=hephaistos_alt_pink;\ - orange=hephaistos_alt_orange;\ - goggles=hephaistos_alt_goggles;\ - scroll=hephaistos_alt_scroll;\ - rgb=hephaistos_alt_rgb;\ - rainbow=hephaistos_alt_rainbow" + monitor_styles = "blank=hephaestus_alt_off;\ + pink=hephaestus_alt_pink;\ + orange=hephaestus_alt_orange;\ + goggles=hephaestus_alt_goggles;\ + scroll=hephaestus_alt_scroll;\ + rgb=hephaestus_alt_rgb;\ + rainbow=hephaestus_alt_rainbow" /datum/robolimb/hephaistos_monitor - company = "Hephaistos Monitor" - desc = "Hephaistos' unique spin on a popular prosthetic head model. It looks rugged and sturdy." - icon = 'icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_monitor.dmi' + company = "Hephaestus Monitor" + desc = "Hephaestus' unique spin on a popular prosthetic head model. It looks rugged and sturdy." + icon = 'icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_monitor.dmi' unavailable_to_build = 1 parts = list(BP_HEAD) monitor_styles = standard_monitor_styles @@ -183,8 +183,8 @@ var/const/standard_monitor_styles = "blank=ipc_blank;\ /obj/item/weapon/disk/limb/bishop company = "Bishop" -/obj/item/weapon/disk/limb/hephaistos - company = "Hephaistos" +/obj/item/weapon/disk/limb/hephaestus + company = "Hephaestus" /obj/item/weapon/disk/limb/morpheus company = "Morpheus" diff --git a/html/changelogs/Anewbe - Hephaistos Industries.yml b/html/changelogs/Anewbe - Hephaestus Industries.yml similarity index 100% rename from html/changelogs/Anewbe - Hephaistos Industries.yml rename to html/changelogs/Anewbe - Hephaestus Industries.yml diff --git a/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_alt1.dmi b/icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_alt1.dmi similarity index 100% rename from icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_alt1.dmi rename to icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_alt1.dmi diff --git a/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_main.dmi b/icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_main.dmi similarity index 100% rename from icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_main.dmi rename to icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_main.dmi diff --git a/icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_monitor.dmi b/icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_monitor.dmi similarity index 100% rename from icons/mob/human_races/cyberlimbs/hesphiastos/hesphiastos_monitor.dmi rename to icons/mob/human_races/cyberlimbs/hephaestus/hephaestus_monitor.dmi From 3a4bc3d897b6cb344c2b22f4ece61401ca396cbb Mon Sep 17 00:00:00 2001 From: Leshana Date: Mon, 20 Mar 2017 21:28:35 -0400 Subject: [PATCH 15/18] Fix signularity_pull leaving ghost item in your inventory slot * It called u_equip() Nothing should call u_equip(), bad! * Also replaced magic numbers with defined constants while I was checking singularity code. --- code/modules/power/singularity/act.dm | 2 +- code/modules/power/singularity/singularity.dm | 32 +++++++++---------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/code/modules/power/singularity/act.dm b/code/modules/power/singularity/act.dm index d244c4eeaa..6683b48377 100644 --- a/code/modules/power/singularity/act.dm +++ b/code/modules/power/singularity/act.dm @@ -29,7 +29,7 @@ if(current_size >= STAGE_THREE) var/list/handlist = list(l_hand, r_hand) for(var/obj/item/hand in handlist) - if(prob(current_size*5) && hand.w_class >= ((11-current_size)/2) && u_equip(hand)) + if(prob(current_size*5) && hand.w_class >= ((11-current_size)/2) && unEquip(hand)) step_towards(hand, src) src << "The [S] pulls \the [hand] from your grip!" apply_effect(current_size * 3, IRRADIATE) diff --git a/code/modules/power/singularity/singularity.dm b/code/modules/power/singularity/singularity.dm index 7e0941ce75..39090ceac5 100644 --- a/code/modules/power/singularity/singularity.dm +++ b/code/modules/power/singularity/singularity.dm @@ -298,7 +298,7 @@ if(target && prob(60)) movement_dir = get_dir(src,target) //moves to a singulo beacon, if there is one - if(current_size >= 9)//The superlarge one does not care about things in its way + if(current_size >= STAGE_FIVE)//The superlarge one does not care about things in its way spawn(0) step(src, movement_dir) spawn(1) @@ -319,17 +319,17 @@ var/steps = 0 if(!step) switch(current_size) - if(1) + if(STAGE_ONE) steps = 1 - if(3) + if(STAGE_TWO) steps = 3//Yes this is right - if(5) + if(STAGE_THREE) steps = 3 - if(7) + if(STAGE_FOUR) steps = 4 - if(9) + if(STAGE_FIVE) steps = 5 - if(11) + if(STAGE_SUPER) steps = 6 else steps = step @@ -397,7 +397,7 @@ mezzer() else return 0 - if(current_size == 11) + if(current_size == STAGE_SUPER) smwave() return 1 @@ -429,18 +429,18 @@ if(M.stat == CONSCIOUS) if (istype(M,/mob/living/carbon/human)) var/mob/living/carbon/human/H = M - if(istype(H.glasses,/obj/item/clothing/glasses/meson) && current_size != 11) + if(istype(H.glasses,/obj/item/clothing/glasses/meson) && current_size != STAGE_SUPER) H << "You look directly into The [src.name], good thing you had your protective eyewear on!" return else H << "You look directly into The [src.name], but your eyewear does absolutely nothing to protect you from it!" - M << "You look directly into The [src.name] and feel [current_size == 11 ? "helpless" : "weak"]." + M << "You look directly into The [src.name] and feel [current_size == STAGE_SUPER ? "helpless" : "weak"]." M.apply_effect(3, STUN) for(var/mob/O in viewers(M, null)) O.show_message(text("[] stares blankly at The []!", M, src), 1) /obj/singularity/proc/emp_area() - if(current_size != 11) + if(current_size != STAGE_SUPER) empulse(src, 4, 6, 8, 10) else empulse(src, 12, 14, 16, 18) @@ -467,15 +467,15 @@ overlays = 0 move_self = 0 switch (current_size) - if(1) + if(STAGE_ONE) overlays += image('icons/obj/singularity.dmi',"chain_s1") - if(3) + if(STAGE_TWO) overlays += image('icons/effects/96x96.dmi',"chain_s3") - if(5) + if(STAGE_THREE) overlays += image('icons/effects/160x160.dmi',"chain_s5") - if(7) + if(STAGE_FOUR) overlays += image('icons/effects/224x224.dmi',"chain_s7") - if(9) + if(STAGE_FIVE) overlays += image('icons/effects/288x288.dmi',"chain_s9") /obj/singularity/proc/on_release() From f796914849640d22299549bd1428fc84bd39b10a Mon Sep 17 00:00:00 2001 From: Anewbe Date: Tue, 21 Mar 2017 00:27:31 -0500 Subject: [PATCH 16/18] Fixes a thing with jetpacks --- code/game/objects/effects/effect_system.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 610746339b..485ea6987b 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -333,7 +333,7 @@ steam.start() -- spawns the effect spawn(0) var/turf/T = get_turf(src.holder) if(T != src.oldposition) - if(istype(T, /turf/simulated)) + if(isturf(T)) var/obj/effect/effect/ion_trails/I = PoolOrNew(/obj/effect/effect/ion_trails, src.oldposition) src.oldposition = T I.set_dir(src.holder.dir) From c65588b099a0cf9c9c887f4ffc74e0b6e1c81d9a Mon Sep 17 00:00:00 2001 From: Anewbe Date: Tue, 21 Mar 2017 00:51:26 -0500 Subject: [PATCH 17/18] Communicator QoL --- .../devices/communicator/communicator.dm | 11 ++++++ .../changelogs/Anewbe - Communicator Drag.yml | 36 +++++++++++++++++++ 2 files changed, 47 insertions(+) create mode 100644 html/changelogs/Anewbe - Communicator Drag.yml diff --git a/code/game/objects/items/devices/communicator/communicator.dm b/code/game/objects/items/devices/communicator/communicator.dm index 2f0d7f1c3c..8bfe2dffca 100644 --- a/code/game/objects/items/devices/communicator/communicator.dm +++ b/code/game/objects/items/devices/communicator/communicator.dm @@ -213,6 +213,17 @@ var/global/list/obj/item/device/communicator/all_communicators = list() update_icon() ui_interact(user) +// Proc: MouseDrop() +//Same thing PDAs do +/obj/item/device/communicator/MouseDrop(obj/over_object as obj) + var/mob/M = usr + if (!(src.loc == usr) || (src.loc && src.loc.loc == usr)) + return + if(!istype(over_object, /obj/screen)) + return attack_self(M) + return + + // Proc: attack_ghost() // Parameters: 1 (user - the ghost clicking on the device) // Description: Recreates the known_devices list, so that the ghost looking at the device can see themselves, then calls ..() so that NanoUI appears. diff --git a/html/changelogs/Anewbe - Communicator Drag.yml b/html/changelogs/Anewbe - Communicator Drag.yml new file mode 100644 index 0000000000..3d232d7bb9 --- /dev/null +++ b/html/changelogs/Anewbe - Communicator Drag.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Anewbe + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "You can now click+drag communicators to access them." From 185f920f705b4674f8d912c2492180995163df0d Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Tue, 21 Mar 2017 11:32:36 -0400 Subject: [PATCH 18/18] Update name spelling of heph --- code/datums/supplypacks/science_vr.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/datums/supplypacks/science_vr.dm b/code/datums/supplypacks/science_vr.dm index 9983d30501..ef79a5712b 100644 --- a/code/datums/supplypacks/science_vr.dm +++ b/code/datums/supplypacks/science_vr.dm @@ -14,7 +14,7 @@ name = "Advanced Robolimb Blueprints" contains = list( /obj/item/weapon/disk/limb/bishop, - /obj/item/weapon/disk/limb/hesphiastos, + /obj/item/weapon/disk/limb/hephaestus, /obj/item/weapon/disk/limb/morpheus, /obj/item/weapon/disk/limb/veymed, /obj/item/weapon/disk/limb/wardtakahashi,