diff --git a/.drone.yml b/.drone.yml index eadc533b0b7..35cd0b7072b 100644 --- a/.drone.yml +++ b/.drone.yml @@ -4,7 +4,7 @@ type: docker name: code check clone: - depth: 10 + depth: 50 environment: MACRO_COUNT: 0 @@ -16,7 +16,7 @@ trigger: - master #avoid double builds on PRs steps: - - name: "Runtime - Compile and Run Unit Tests" + - name: "Runtime - Compile and Run Unit Tests" image: python:3.6-slim-buster commands: - pip install --user -r ./tools/requirements.txt @@ -28,14 +28,25 @@ steps: - python3 tools/GenerateChangelog/ss13_genchangelog.py html/changelog.html html/changelogs --dry-run - python3 tools/mapmerge2/travis_mapcheck.py - echo "6a5ae087fe5bfa66e52e508655e57120 *html/changelogs/example.yml" | md5sum -c - - - echo "Complated Code Checks" + - echo "Completed Code Checks" + - name: "Run DreamChecker" + image: aurorastation/dm-buildimage:latest + commands: + - /opt/dreamchecker + - name: "Vue - Lint and Compile" + image: node:10-buster + commands: + - cd vueui + - npm install # TODO: Cache that shit + - (npm run lint | tee lint.log) + - npm run build --- kind: pipeline type: docker name: dm-runtime clone: - depth: 10 + depth: 50 environment: USE_MAP: runtime @@ -61,7 +72,7 @@ steps: - for f in SQL/migrate/*.sql; do mysql -h mariadb -uroot -proot game < $f && echo "Migrated $f"; done - mysql -h mariadb -uroot -proot game -e "SHOW TABLES;" - - name: "Runtime - Compile and Run Unit Tests" + - name: "Runtime - Compile and Run Unit Tests" image: aurorastation/dm-buildimage:latest commands: - export LD_LIBRARY_PATH=./:$PWD:$HOME/.byond/bin:/usr/local/lib:$LD_LIBRARY_PATH @@ -78,7 +89,7 @@ type: docker name: dm-aurora clone: - depth: 10 + depth: 50 environment: USE_MAP: aurora @@ -88,7 +99,7 @@ trigger: - master #avoid double builds on PRs steps: - - name: "Aurora - Compile and Run Unit Tests" + - name: "Aurora - Compile and Run Unit Tests" image: aurorastation/dm-buildimage:latest commands: - export LD_LIBRARY_PATH=./:$PWD:$HOME/.byond/bin:/usr/local/lib:$LD_LIBRARY_PATH @@ -105,7 +116,7 @@ type: docker name: dm-exodus clone: - depth: 10 + depth: 50 environment: USE_MAP: exodus @@ -115,7 +126,7 @@ trigger: - master #avoid double builds on PRs steps: - - name: "Exodus - Compile and Run Unit Tests" + - name: "Exodus - Compile and Run Unit Tests" image: aurorastation/dm-buildimage:latest commands: - export LD_LIBRARY_PATH=./:$PWD:$HOME/.byond/bin:/usr/local/lib:$LD_LIBRARY_PATH @@ -128,6 +139,6 @@ steps: - echo "Unit Tests Completed" --- kind: signature -hmac: d23e577d98b4aaa3cf1e3b1f58ace007a86dfeb63d15ff29f9e8424ba4d76c96 +hmac: 21286f11eaa90a42d926886ecc2df9312ad174051f5f42b51d4394cc578ae0ee ... diff --git a/.gitattributes b/.gitattributes index c3b24c12791..102e246d99e 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,10 +1,6 @@ -# dmm map merger hook -# needs additional setup, see tools/mapmerge/install.txt -*.dmm merge=merge-dmm eol=crlf - -# dmi icon merger hook -# needs additional setup, see tools/dmitool/merging.txt -*.dmi merge=merge-dmi +# merger hooks, run tools/hooks/install.bat or install.sh to set up +*.dmm text merge=dmm eol=crlf +*.dmi binary merge=dmi # force changelog merging to use union html/changelog.html merge=union @@ -13,7 +9,6 @@ html/changelog.html merge=union * text=auto *.ai binary -*.dmi binary *.exe binary *.fla binary *.gif binary @@ -40,7 +35,6 @@ html/changelog.html merge=union *.css text *.dm text *.dmf text -*.dmm text *.gitkeep text *.hook text *.html text @@ -57,4 +51,4 @@ html/changelog.html merge=union *.sql text *.tmpl text *.txt text -*.vue text \ No newline at end of file +*.vue text diff --git a/aurorastation.dme b/aurorastation.dme index 6489c467cc4..46af44f8d75 100644 --- a/aurorastation.dme +++ b/aurorastation.dme @@ -1809,6 +1809,7 @@ #include "code\modules\maps\map_template.dm" #include "code\modules\maps\reader.dm" #include "code\modules\maps\swapmaps.dm" +#include "code\modules\martial_arts\gunkata.dm" #include "code\modules\martial_arts\martial.dm" #include "code\modules\martial_arts\plasma_fist.dm" #include "code\modules\martial_arts\skrell.dm" @@ -2147,6 +2148,7 @@ #include "code\modules\mob\living\simple_animal\hostile\spider_queen.dm" #include "code\modules\mob\living\simple_animal\hostile\syndicate.dm" #include "code\modules\mob\living\simple_animal\hostile\tree.dm" +#include "code\modules\mob\living\simple_animal\hostile\viscerator.dm" #include "code\modules\mob\living\simple_animal\hostile\commanded\_command_defines.dm" #include "code\modules\mob\living\simple_animal\hostile\commanded\bear_companion.dm" #include "code\modules\mob\living\simple_animal\hostile\commanded\commanded.dm" diff --git a/code/_helpers/unsorted.dm b/code/_helpers/unsorted.dm index 382b37b35db..99c5819cf76 100644 --- a/code/_helpers/unsorted.dm +++ b/code/_helpers/unsorted.dm @@ -575,15 +575,18 @@ Turf and target are seperate in case you want to teleport some distance from a t if(!user || isnull(user)) return 0 - if (!act_target) - act_target = user - var/Location + var/act_location if(use_user_turf) //When this is true, do_after() will check whether the user's turf has changed, rather than the user's loc. Location = get_turf(user) else Location = user.loc + if (!act_target) + act_target = user + else + act_location = get_turf(act_target) + var/holding = user.get_active_hand() var/datum/progressbar/progbar @@ -606,7 +609,11 @@ Turf and target are seperate in case you want to teleport some distance from a t else user_loc_to_check = user.loc - if (!user || user.stat || user.weakened || user.stunned || (use_user_turf >= 0 && user_loc_to_check != Location)) + if (!user || user.stat || user.weakened || user.stunned) + . = 0 + break + + if ((use_user_turf >= 0 && user_loc_to_check != Location) || (act_location && (get_turf(act_target) != act_location))) . = 0 break diff --git a/code/controllers/subsystems/explosives.dm b/code/controllers/subsystems/explosives.dm index 62f6d0eaf42..25c206fe89a 100644 --- a/code/controllers/subsystems/explosives.dm +++ b/code/controllers/subsystems/explosives.dm @@ -33,7 +33,7 @@ var/datum/controller/subsystem/explosives/SSexplosives powernet_update_pending = SSexplosives.powernet_update_pending /datum/controller/subsystem/explosives/fire(resumed = FALSE) - if (!(work_queue.len)) + if(!length(work_queue)) ticks_without_work++ if (powernet_update_pending && ticks_without_work > 5) SSmachinery.powernet_update_queued = TRUE @@ -81,7 +81,8 @@ var/datum/controller/subsystem/explosives/SSexplosives var/start = world.timeofday epicenter = get_turf(epicenter) - if(!epicenter) return + if(!epicenter) + return // Handles recursive propagation of explosions. if(devastation_range > 2 || heavy_impact_range > 2) @@ -112,23 +113,25 @@ var/datum/controller/subsystem/explosives/SSexplosives //Whether or not this explosion causes enough vibration to send sound or shockwaves through the station var/vibration = 1 - if (istype(epicenter,/turf/space)) + if(istype(epicenter, /turf/space)) vibration = 0 - for (var/turf/T in range(src, max_range)) - if (!istype(T,/turf/space)) + for(var/thing in RANGE_TURFS(max_range, epicenter)) + var/turf/T = thing + if (!istype(T, /turf/space)) //If there is a nonspace tile within the explosion radius //Then we can reverberate shockwaves through that, and allow it to be felt in a vacuum vibration = 1 if (vibration) - for(var/mob/M in player_list) + for(var/thing in player_list) + var/mob/M = thing CHECK_TICK // Double check for client var/reception = 2//Whether the person can be shaken or hear sound //2 = BOTH //1 = shockwaves only //0 = no effect - if(M && M.client) + if(M?.client) var/turf/M_turf = get_turf(M) if(M_turf && M_turf.z == epicenter.z) @@ -136,8 +139,9 @@ var/datum/controller/subsystem/explosives/SSexplosives //If the person is standing in space, they wont hear //But they may still feel the shaking reception = 0 - for (var/turf/T in range(M, 1)) - if (!istype(T,/turf/space)) + for(var/t_thing in RANGE_TURFS(1, M)) + var/turf/T = t_thing + if(!istype(T, /turf/space)) //If theyre touching the hull or on some extruding part of the station reception = 1//They will get screenshake break @@ -200,14 +204,14 @@ var/datum/controller/subsystem/explosives/SSexplosives if(T) for(var/atom_movable in T.contents) //bypass type checking since only atom/movable can be contained by turfs anyway var/atom/movable/AM = atom_movable - if(AM && AM.simulated) + if(!QDELETED(AM) && AM.simulated) AM.ex_act(dist) CHECK_TICK var/took = (world.timeofday-start)/10 //You need to press the DebugGame verb to see these now....they were getting annoying and we've collected a fair bit of data. Just -test- changes to explosion code using this please so we can compare - if(Debug2) world.log << "## DEBUG: Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]: Took [took] seconds." + if(Debug2) world.log << "## DEBUG: Explosion([x0],[y0],[z0])(d[devastation_range],h[heavy_impact_range],l[light_impact_range]): Took [took] seconds." // All the vars used on the turf should be on unsimulated turfs too, we just don't care about those generally. #define SEARCH_DIR(dir) \ diff --git a/code/controllers/subsystems/job.dm b/code/controllers/subsystems/job.dm index 436a951d627..0e00ee6cc90 100644 --- a/code/controllers/subsystems/job.dm +++ b/code/controllers/subsystems/job.dm @@ -695,7 +695,9 @@ // Delete them from datacore. - SSrecords.remove_record_by_field("name", H.real_name) + if(!SSrecords.remove_record_by_field("fingerprint", H.get_full_print())) + // didn't find a record by fingerprint, fallback to deleting by name + SSrecords.remove_record_by_field("name", H.real_name) SSrecords.reset_manifest() log_and_message_admins("([H.mind.role_alt_title]) entered cryostorage.", user = H) diff --git a/code/datums/ai_laws.dm b/code/datums/ai_laws.dm index be64b35287a..a3c324e54cf 100644 --- a/code/datums/ai_laws.dm +++ b/code/datums/ai_laws.dm @@ -176,6 +176,7 @@ var/global/const/base_law_type = /datum/ai_laws/nanotrasen /datum/ai_laws/proc/delete_law(var/datum/ai_law/law) if(istype(law)) law.delete_law(src) + sorted_laws.Cut() /datum/ai_law/proc/delete_law(var/datum/ai_laws/laws) diff --git a/code/datums/outfits/ert/med_eridani.dm b/code/datums/outfits/ert/med_eridani.dm index c3e4bd5a374..57fa1368d28 100644 --- a/code/datums/outfits/ert/med_eridani.dm +++ b/code/datums/outfits/ert/med_eridani.dm @@ -85,7 +85,7 @@ /datum/outfit/admin/ert/med_eridani/paramedic name = "Eridani Contractor Paramedic" - head = /obj/item/clothing/head/hardhat/emt + head = /obj/item/clothing/head/hardhat/first_responder mask = /obj/item/clothing/mask/balaclava back = /obj/item/storage/backpack/messenger/med glasses = /obj/item/clothing/glasses/hud/health diff --git a/code/datums/uplink/grenades.dm b/code/datums/uplink/grenades.dm index 6f34f412d0c..33ff1c7bcf7 100644 --- a/code/datums/uplink/grenades.dm +++ b/code/datums/uplink/grenades.dm @@ -10,6 +10,12 @@ path = /obj/item/grenade/spawnergrenade/manhacks desc = "A grenade that deploys five viscerator combat drones. Deadly in numbers, will not attack you or your allies." +/datum/uplink_item/item/grenades/lubed_manhack + name = "Lubed Viscerator Delivery Grenade" + item_cost = 8 + path = /obj/item/grenade/spawnergrenade/manhacks/lubed + desc = "A grenade that deploys five lubed viscerator combat drones. Deadly in numbers, will not attack you or your allies. Works best when killed." + /datum/uplink_item/item/grenades/anti_photon name = "5xPhoton Disruption Grenades" item_cost = 2 diff --git a/code/datums/uplink/martial_arts.dm b/code/datums/uplink/martial_arts.dm index 808a6fe2fde..ea995a9d182 100644 --- a/code/datums/uplink/martial_arts.dm +++ b/code/datums/uplink/martial_arts.dm @@ -11,13 +11,13 @@ item_cost = 6 path = /obj/item/martial_manual/wrestling -/datum/uplink_item/item/martial_arts/sleeping_carp - name = "Sleeping Carp" - item_cost = 12 - path = /obj/item/martial_manual/sleeping_carp - /datum/uplink_item/item/martial_arts/swordsmanship name = "Swordsmanship" item_cost = 5 path = /obj/item/martial_manual/swordsmanship +/datum/uplink_item/item/martial_arts/gun_kata + name = "Gun-Kata" + desc = "A manual containing basic Gun-Kata instruction and techniques. This is for projectile weapons, allowing you to reload by using a gun on a magazine, and automatically ejecting the magazine when it's empty." + item_cost = 4 + path = /obj/item/martial_manual/gun_kata \ No newline at end of file diff --git a/code/game/jobs/access_datum.dm b/code/game/jobs/access_datum.dm index 959b13042cd..02e11cd44e3 100644 --- a/code/game/jobs/access_datum.dm +++ b/code/game/jobs/access_datum.dm @@ -389,10 +389,10 @@ desc = "Medical Equipment" region = ACCESS_REGION_MEDBAY -/var/const/access_emt = 67 -/datum/access/access_emt - id = access_emt - desc = "EMT Equipment" +/var/const/access_first_responder = 67 +/datum/access/access_first_responder + id = access_first_responder + desc = "First Responder Equipment" region = ACCESS_REGION_MEDBAY /var/const/access_detective = 68 diff --git a/code/game/jobs/faction/eridani.dm b/code/game/jobs/faction/eridani.dm index ed134b2b6a3..36788deae9f 100644 --- a/code/game/jobs/faction/eridani.dm +++ b/code/game/jobs/faction/eridani.dm @@ -46,7 +46,7 @@ "Forensic Technician" = /datum/outfit/job/forensics/eridani, "Crime Scene Investigator" = /datum/outfit/job/forensics/eridani, "Paramedic" = /datum/outfit/job/med_tech/paramed/eridani, - "Emergency Medical Technician" = /datum/outfit/job/med_tech/paramed/eridani, + "First Responder" = /datum/outfit/job/med_tech/paramed/eridani, "Corporate Liaison" = /datum/outfit/job/representative/eridani ) diff --git a/code/game/jobs/faction/hephaestus.dm b/code/game/jobs/faction/hephaestus.dm index 56702ee117d..5ac89269f42 100644 --- a/code/game/jobs/faction/hephaestus.dm +++ b/code/game/jobs/faction/hephaestus.dm @@ -114,5 +114,7 @@ id = /obj/item/card/id/hephaestus backpack_contents = list( + /obj/item/device/camera = 1, + /obj/item/gun/energy/pistol = 1, /obj/item/stamp/hephaestus = 1 - ) \ No newline at end of file + ) diff --git a/code/game/jobs/faction/idris.dm b/code/game/jobs/faction/idris.dm index 74be215b60a..66662045ae6 100644 --- a/code/game/jobs/faction/idris.dm +++ b/code/game/jobs/faction/idris.dm @@ -113,5 +113,7 @@ id = /obj/item/card/id/idris backpack_contents = list( + /obj/item/device/camera = 1, + /obj/item/gun/energy/pistol = 1, /obj/item/stamp/idris = 1 - ) \ No newline at end of file + ) diff --git a/code/game/jobs/faction/zavodskoi.dm b/code/game/jobs/faction/zavodskoi.dm index 288fc0d4a6c..61266dd33e0 100644 --- a/code/game/jobs/faction/zavodskoi.dm +++ b/code/game/jobs/faction/zavodskoi.dm @@ -113,5 +113,7 @@ id = /obj/item/card/id/zavodskoi backpack_contents = list( + /obj/item/device/camera = 1, + /obj/item/gun/energy/pistol = 1, /obj/item/stamp/zavodskoi = 1 - ) \ No newline at end of file + ) diff --git a/code/game/jobs/faction/zeng_hu.dm b/code/game/jobs/faction/zeng_hu.dm index 670395bed87..c989732caef 100644 --- a/code/game/jobs/faction/zeng_hu.dm +++ b/code/game/jobs/faction/zeng_hu.dm @@ -59,7 +59,7 @@ "Psychiatrist" = /datum/outfit/job/psychiatrist/zeng_hu, "Psychologist" = /datum/outfit/job/psychiatrist/zeng_hu, "Paramedic" = /datum/outfit/job/med_tech/paramed/zeng_hu, - "Emergency Medical Technician" = /datum/outfit/job/med_tech/paramed/zeng_hu, + "First Responder" = /datum/outfit/job/med_tech/paramed/zeng_hu, "Roboticist" = /datum/outfit/job/roboticist/zeng_hu, "Biomechanical Engineer" = /datum/outfit/job/roboticist/zeng_hu, "Mechatronic Engineer" = /datum/outfit/job/roboticist/zeng_hu, @@ -123,5 +123,7 @@ id = /obj/item/card/id/zeng_hu backpack_contents = list( + /obj/item/device/camera = 1, + /obj/item/gun/energy/pistol = 1, /obj/item/stamp/zeng_hu = 1 - ) \ No newline at end of file + ) diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index e317fc84bb1..7e2c9f1cd85 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -16,11 +16,11 @@ access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads, access_pharmacy, access_virology, access_cmo, access_surgery, access_RC_announce, access_engine, access_construction, access_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks, access_research, - access_emt, access_maint_tunnels) + access_first_responder, access_maint_tunnels) minimal_access = list(access_medical, access_medical_equip, access_morgue, access_genetics, access_heads, access_pharmacy, access_virology, access_cmo, access_surgery, access_RC_announce, access_engine, access_construction, access_keycard_auth, access_sec_doors, access_psychiatrist, access_eva, access_external_airlocks, access_research, - access_emt, access_maint_tunnels) + access_first_responder, access_maint_tunnels) minimal_player_age = 10 ideal_character_age = 50 @@ -202,7 +202,7 @@ jobtype = /datum/job/psychiatrist /datum/job/med_tech - title = "Emergency Medical Technician" + title = "First Responder" flag = MED_TECH departments = SIMPLEDEPT(DEPARTMENT_MEDICAL) department_flag = MEDSCI @@ -215,29 +215,29 @@ minimum_character_age = 20 - access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_pharmacy, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist, access_emt) - minimal_access = list(access_medical, access_medical_equip, access_morgue, access_eva, access_maint_tunnels, access_external_airlocks, access_emt) + access = list(access_medical, access_medical_equip, access_morgue, access_surgery, access_pharmacy, access_virology, access_eva, access_maint_tunnels, access_external_airlocks, access_psychiatrist, access_first_responder) + minimal_access = list(access_medical, access_medical_equip, access_morgue, access_eva, access_maint_tunnels, access_external_airlocks, access_first_responder) outfit = /datum/outfit/job/med_tech blacklisted_species = list(SPECIES_DIONA, SPECIES_IPC_G2) /datum/outfit/job/med_tech - name = "Emergency Medical Technician" - base_name = "Emergency Medical Technician" + name = "First Responder" + base_name = "First Responder" jobtype = /datum/job/med_tech - uniform = /obj/item/clothing/under/rank/medical/emt - suit = /obj/item/clothing/suit/storage/toggle/emt_jacket + uniform = /obj/item/clothing/under/rank/medical/first_responder + suit = /obj/item/clothing/suit/storage/toggle/first_responder_jacket shoes = /obj/item/clothing/shoes/jackboots headset = /obj/item/device/radio/headset/headset_med bowman = /obj/item/device/radio/headset/headset_med/alt l_hand = /obj/item/storage/firstaid/adv r_hand = /obj/item/reagent_containers/hypospray - belt = /obj/item/storage/belt/medical/emt + belt = /obj/item/storage/belt/medical/first_responder tab_pda = /obj/item/modular_computer/handheld/pda/medical wristbound = /obj/item/modular_computer/handheld/wristbound/preset/pda/medical tablet = /obj/item/modular_computer/handheld/preset/medical id = /obj/item/card/id/white - head = /obj/item/clothing/head/hardhat/emt + head = /obj/item/clothing/head/hardhat/first_responder backpack = /obj/item/storage/backpack/medic satchel = /obj/item/storage/backpack/satchel_med diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index 0c4eee30f97..a504d40706e 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -77,7 +77,7 @@ var/list/medical_positions = list( "Surgeon", "Psychiatrist", "Pharmacist", - "Emergency Medical Technician", + "First Responder", "Medical Intern" ) diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index b5ee91f5fe9..4df09075238 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -39,6 +39,8 @@ if(stat & (NOPOWER|BROKEN)) return if(user.stat) return + user.set_machine(src) + var/data[0] var/list/all_networks[0] for(var/nw in network) @@ -124,7 +126,11 @@ if (!C.can_use() || user.stat || (get_dist(user, src) > 1 || user.machine != src || user.blinded || !( user.canmove ) && !istype(user, /mob/living/silicon))) return 0 set_current(C) - user.reset_view(current_camera) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + H.reset_view(current_camera) + else + user.reset_view(current_camera) check_eye(user) return 1 diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index cd8354fdf4a..e28e5bd4b2c 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -11,7 +11,7 @@ desc = "Emergency air-tight shutter, capable of sealing off breached areas." icon = 'icons/obj/doors/DoorHazard.dmi' icon_state = "door_open" - req_one_access = list(access_atmospherics, access_engine_equip, access_emt) + req_one_access = list(access_atmospherics, access_engine_equip, access_first_responder) opacity = 0 density = 0 layer = DOOR_OPEN_LAYER - 0.01 diff --git a/code/game/machinery/mecha_fabricator.dm b/code/game/machinery/mecha_fabricator.dm index f5bf0d56163..fbfb91b7322 100644 --- a/code/game/machinery/mecha_fabricator.dm +++ b/code/game/machinery/mecha_fabricator.dm @@ -99,10 +99,10 @@ data["buildable"] = get_build_options() data["category"] = category data["categories"] = categories - if(fabricator_robolimbs ) + if(fabricator_robolimbs) var/list/T = list() - for(var/A in fabricator_robolimbs ) - var/datum/robolimb/R = fabricator_robolimbs [A] + for(var/A in fabricator_robolimbs) + var/datum/robolimb/R = fabricator_robolimbs[A] T += list(list("id" = A, "company" = R.company)) data["manufacturers"] = T data["manufacturer"] = manufacturer @@ -135,7 +135,7 @@ category = href_list["category"] if(href_list["manufacturer"]) - if(href_list["manufacturer"] in fabricator_robolimbs ) + if(href_list["manufacturer"] in fabricator_robolimbs) manufacturer = href_list["manufacturer"] if(href_list["eject"]) @@ -392,4 +392,4 @@ files.AddTech2Known(T) files.RefreshResearch() sync_message = "Sync complete." - update_categories() \ No newline at end of file + update_categories() diff --git a/code/game/machinery/newscaster.dm b/code/game/machinery/newscaster.dm index a345cf94aee..b0b9c5d2483 100644 --- a/code/game/machinery/newscaster.dm +++ b/code/game/machinery/newscaster.dm @@ -809,10 +809,14 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co /obj/item/newspaper name = "newspaper" desc = "An issue of The Griffon, the newspaper circulating aboard most stations." + desc_info = "You can alt-click this to roll it up." icon = 'icons/obj/bureaucracy.dmi' icon_state = "newspaper" + item_state = "newspaper" w_class = ITEMSIZE_SMALL //Let's make it fit in trashbags! - attack_verb = list("bapped") + attack_verb = list("bapped", "thwacked", "educated") + drop_sound = 'sound/items/drop/wrapper.ogg' + pickup_sound = 'sound/items/pickup/wrapper.ogg' var/screen = 0 var/pages = 0 var/curr_page = 0 @@ -820,10 +824,19 @@ var/list/obj/machinery/newscaster/allCasters = list() //Global list that will co var/datum/feed_message/important_message = null var/scribble="" var/scribble_page = null - drop_sound = 'sound/items/drop/wrapper.ogg' - pickup_sound = 'sound/items/pickup/wrapper.ogg' + var/rolled = FALSE // Whether the newspaper is rolled or not, making it a deadly weapon. -obj/item/newspaper/attack_self(mob/user as mob) +/obj/item/newspaper/attack_self(mob/user as mob) + if(user.a_intent == I_GRAB) + if(!rolled) + user.visible_message(SPAN_NOTICE("\The [user] rolls up \the [src]."),\ + SPAN_NOTICE("You roll up \the [src].")) + rolled(user) + return + if(rolled) + user.visible_message(SPAN_NOTICE("\The [user] unrolls \the [src] to read it."),\ + SPAN_NOTICE("You unroll \the [src] to read it.")) + rolled(user) if(ishuman(user)) var/mob/living/carbon/human/human_user = user var/dat @@ -904,7 +917,7 @@ obj/item/newspaper/attack_self(mob/user as mob) to_chat(user, "The paper is full of intelligible symbols!") -obj/item/newspaper/Topic(href, href_list) +/obj/item/newspaper/Topic(href, href_list) var/mob/living/U = usr ..() if ((src in U.contents) || ( istype(loc, /turf) && in_range(src, U) )) @@ -936,8 +949,12 @@ obj/item/newspaper/Topic(href, href_list) src.attack_self(src.loc) -obj/item/newspaper/attackby(obj/item/W as obj, mob/user as mob) +/obj/item/newspaper/attackby(obj/item/W as obj, mob/user as mob) if(W.ispen()) + if(rolled) + user.visible_message(SPAN_NOTICE("\The [user] unrolls \the [src] to write on it."),\ + SPAN_NOTICE("You unroll \the [src] to write on it.")) + rolled() if(src.scribble_page == src.curr_page) to_chat(user, "There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?") else @@ -952,6 +969,16 @@ obj/item/newspaper/attackby(obj/item/W as obj, mob/user as mob) src.attack_self(user) return +/obj/item/newspaper/proc/rolled(mob/user) + if(ishuman(user) && Adjacent(user) && !user.incapacitated()) + if(rolled) + playsound(src, pickup_sound, PICKUP_SOUND_VOLUME) + else + playsound(src, drop_sound, DROP_SOUND_VOLUME) + rolled = !rolled + icon_state = "newspaper[rolled ? "_rolled" : ""]" + item_state = icon_state + update_icon() ////////////////////////////////////helper procs diff --git a/code/game/machinery/vending.dm b/code/game/machinery/vending.dm index a04759fae47..b9c42aefb61 100644 --- a/code/game/machinery/vending.dm +++ b/code/game/machinery/vending.dm @@ -318,6 +318,7 @@ if(!src) return to_chat(user, "You [anchored? "un" : ""]secured \the [src]!") anchored = !anchored + power_change() return else if(istype(W,/obj/item/vending_refill)) @@ -779,6 +780,8 @@ /obj/machinery/vending/power_change() ..() + if(!anchored) + stat |= NOPOWER if(stat & BROKEN) icon_state = "[initial(icon_state)]-broken" cut_overlays() @@ -833,4 +836,4 @@ spawn(0) throw_item.throw_at(target, 16, 3, src) src.visible_message("[src] launches [throw_item.name] at [target.name]!") - return 1 \ No newline at end of file + return 1 diff --git a/code/game/objects/effects/spiders.dm b/code/game/objects/effects/spiders.dm index 64111640863..bce5331e928 100644 --- a/code/game/objects/effects/spiders.dm +++ b/code/game/objects/effects/spiders.dm @@ -22,13 +22,15 @@ /obj/effect/spider/attackby(var/obj/item/W, var/mob/user) visible_message(SPAN_WARNING("\The [src] has been [LAZYPICK(W.attack_verb, "attacked")] with [W][(user ? " by [user]." : ".")]")) - var/damage = W.force / 4.0 if(W.iswelder()) var/obj/item/weldingtool/WT = W if(WT.remove_fuel(0, user)) damage = 15 playsound(loc, 'sound/items/welder.ogg', 100, 1) + else + user.do_attack_animation(src) + playsound(loc, W.hitsound, 50, 1, -1) health -= damage healthcheck() @@ -262,6 +264,13 @@ visible_message(SPAN_WARNING("\The [user] stomps \the [src] dead!")) die() +/obj/effect/spider/spiderling/attackby(var/obj/item/W, var/mob/user) + ..() + if(istype(W, /obj/item/newspaper)) + var/obj/item/newspaper/N = W + if(N.rolled) + die() + /** * Makes the organ spew out all of the spiderlings it has. It's triggered at the point * of the first spiderling reaching 80% of more amount grown. This stops them from growing diff --git a/code/game/objects/items/devices/floor_painter.dm b/code/game/objects/items/devices/floor_painter.dm index 679ddcdfe45..be945223bb2 100644 --- a/code/game/objects/items/devices/floor_painter.dm +++ b/code/game/objects/items/devices/floor_painter.dm @@ -1,9 +1,9 @@ /obj/item/device/floor_painter name = "paint gun" - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "labeler1" - item_state = "flight" - + icon = 'icons/obj/contained_items/tools/floor_painter.dmi' + icon_state = "floor_painter" + item_state = "floor_painter" + contained_sprite = TRUE var/decal = "remove all decals" var/paint_dir = "precise" var/paint_colour = COLOR_WHITE diff --git a/code/game/objects/items/devices/pipe_painter.dm b/code/game/objects/items/devices/pipe_painter.dm index 68f50f41f70..c003d018920 100644 --- a/code/game/objects/items/devices/pipe_painter.dm +++ b/code/game/objects/items/devices/pipe_painter.dm @@ -1,8 +1,9 @@ /obj/item/device/pipe_painter name = "pipe painter" - icon = 'icons/obj/bureaucracy.dmi' - icon_state = "labeler1" - item_state = "flight" + icon = 'icons/obj/contained_items/tools/pipe_painter.dmi' + icon_state = "pipe_painter" + item_state = "pipe_painter" + contained_sprite = TRUE var/list/modes var/mode diff --git a/code/game/objects/items/devices/t_scanner.dm b/code/game/objects/items/devices/t_scanner.dm index faae6901159..64a12a2e188 100644 --- a/code/game/objects/items/devices/t_scanner.dm +++ b/code/game/objects/items/devices/t_scanner.dm @@ -37,7 +37,7 @@ /obj/item/device/t_scanner/afterattack(atom/target, mob/user, proximity_flag, click_parameters) var/obj/structure/disposalpipe/D = target - if(D && istype(D)) + if(istype(D)) to_chat(user, SPAN_INFO("Pipe segment integrity: [(D.health / 10) * 100]%")) /obj/item/device/t_scanner/proc/set_active(var/active) @@ -51,17 +51,19 @@ //If reset is set, then assume the client has none of our overlays, otherwise we only send new overlays. /obj/item/device/t_scanner/process() - if(!on) return + if(!on) + return //handle clients changing var/client/loc_client = null - if(ismob(src.loc)) - var/mob/M = src.loc + if(ismob(loc)) + var/mob/M = loc loc_client = M.client set_user_client(loc_client) //no sense processing if no-one is going to see it. - if(!user_client) return + if(!user_client) + return //get all objects in scan range var/list/scanned = get_scanned_objects(scan_range) @@ -69,13 +71,15 @@ var/list/update_remove = active_scanned - scanned //Add new overlays - for(var/obj/O in update_add) + for(var/thing in update_add) + var/obj/O = thing var/image/overlay = get_overlay(O) active_scanned[O] = overlay user_client.images += overlay //Remove stale overlays - for(var/obj/O in update_remove) + for(var/thing in update_remove) + var/obj/O = thing user_client.images -= active_scanned[O] active_scanned -= O @@ -86,7 +90,7 @@ if(scanned in overlay_cache) . = overlay_cache[scanned] else - var/image/I = image(loc = scanned, icon = scanned.icon, icon_state = scanned.icon_state, layer = HUD_LAYER) + var/image/I = image(scanned.icon, scanned.loc, scanned.icon_state, HUD_LAYER, scanned.dir) //Pipes are special if(istype(scanned, /obj/machinery/atmospherics/pipe)) @@ -95,19 +99,11 @@ I.overlays += P.overlays I.underlays += P.underlays - if(ismob(scanned)) - if(ishuman(scanned)) - var/mob/living/carbon/human/H = scanned - if(H.species.appearance_flags & HAS_SKIN_COLOR) - I.color = rgb(H.r_skin, H.g_skin, H.b_skin) - I.icon = 'icons/mob/mob.dmi' - I.icon_state = "phaseout" - var/mob/M = scanned - I.color = M.color - I.overlays += M.overlays - I.underlays += M.underlays + else if(istype(scanned, /obj/structure/cable)) + var/obj/structure/cable/C = scanned + I.color = C.color - I.alpha = 128 + I.alpha = 100 I.mouse_opacity = 0 . = I @@ -120,15 +116,11 @@ . = list() var/turf/center = get_turf(src.loc) - if(!center) return - - for(var/turf/T in range(scan_range, center)) - for(var/mob/M in T.contents) - if(M.alpha < 255) - . += M - else if(round_is_spooky() && isobserver(M)) - . += M + if(!center) + return + for(var/thing in RANGE_TURFS(scan_range, center)) + var/turf/T = thing if(!!T.is_plating()) continue @@ -140,7 +132,6 @@ . += O - /obj/item/device/t_scanner/proc/set_user_client(var/client/new_client) if(new_client == user_client) return @@ -159,4 +150,4 @@ set_user_client(null) ..() -#undef OVERLAY_CACHE_LEN +#undef OVERLAY_CACHE_LEN \ No newline at end of file diff --git a/code/game/objects/items/glassjar.dm b/code/game/objects/items/glassjar.dm index 4b573720438..40edff07361 100644 --- a/code/game/objects/items/glassjar.dm +++ b/code/game/objects/items/glassjar.dm @@ -46,7 +46,7 @@ return if(ismob(A)) var/mob/L = A - if(L.mob_size <= MOB_SMALL) + if(L.mob_size <= MOB_TINY) user.visible_message(SPAN_NOTICE("\The [user] scoops \the [L] into \the [src]."), SPAN_NOTICE("You scoop \the [L] into \the [src].")) L.forceMove(src) contains = JAR_ANIMAL @@ -97,7 +97,7 @@ user.visible_message(SPAN_NOTICE("\The [user] puts [S.worth] [S.worth > 1 ? "credits" : "credit"] into \the [src].")) user.drop_from_inventory(S,src) update_icon() - + if(istype(A, /obj/item/clothing/mask/chewable/candy/gum/gumball)) handle_gumball_addition(user, A) diff --git a/code/game/objects/items/tajara.dm b/code/game/objects/items/tajara.dm index eb5421b6292..74c4a800681 100644 --- a/code/game/objects/items/tajara.dm +++ b/code/game/objects/items/tajara.dm @@ -135,6 +135,7 @@ icon_state = "adhomai_clock" item_state = "adhomai_clock" contained_sprite = TRUE + var/static/months = list("Menshe-aysaif", "Sil'nryy-aysaif", "Menshe-rhazzimy", "Sil'nryy-rhazzimy") /obj/item/pocketwatch/adhomai/checktime(mob/user) set category = "Object" @@ -146,47 +147,23 @@ else var/adhomian_year = game_year + 1158 - - var/current_month = time2text(world.realtime, "Month") + var/current_month = text2num(time2text(world.realtime, "MM")) var/current_day = text2num(time2text(world.realtime, "DD")) var/adhomian_day - var/adhomian_month + var/adhomian_month = src.months[Ceiling(current_month/3)] switch(current_month) - if("January", "February", "March") - adhomian_month = "Menshe-aysaif" - if (current_month == "February") - adhomian_day = current_day + 15 - if (current_month == "March") - adhomian_day = current_day + 30 - - if("April", "May", "June") - adhomian_month = "Sil'nryy-aysaif" - if (current_month == "May") - adhomian_day = current_day + 15 - if (current_month == "June") - adhomian_day = current_day + 30 - - if("July", "August", "September") - adhomian_month = "Menshe-rhazzimy" - if (current_month == "August") - adhomian_day = current_day + 15 - if (current_month == "September") - adhomian_day = current_day + 30 - - if("October", "November", "December") - adhomian_month = "Sil'nryy-rhazzimy" - if (current_month == "November") - adhomian_day = current_day + 15 - if (current_month == "December") - adhomian_day = current_day + 30 - + if(2, 5, 8, 11) + current_day += 31 + if(6, 9, 12) + current_day += 61 + if(3) + current_day += 59 + isLeap(text2num(time2text(world.realtime, "YYYY"))) // we can conveniently use the result of `isLeap` to add 1 when we are in a leap year var/real_time = text2num(time2text(world.time + (roundstart_hour HOURS), "hh")) var/adhomian_time = real_time - if(IsOdd(current_day)) + if(IsEven(current_day)) adhomian_time = real_time + 24 - adhomian_day -= 1 - - to_chat(usr, "You check your \the [src], glancing over at the watch face, reading the time to be '[adhomian_time]'. Today's date is '[adhomian_day]th day of [adhomian_month] [adhomian_year]'.") + adhomian_day = Floor(current_day / 2) + to_chat(usr, "You check your [src.name], glancing over at the watch face, reading the time to be '[adhomian_time]'. Today's date is the '[adhomian_day]th day of [adhomian_month], [adhomian_year]'.") /obj/item/flame/lighter/adhomai diff --git a/code/game/objects/items/weapons/grenades/spawnergrenade.dm b/code/game/objects/items/weapons/grenades/spawnergrenade.dm index 02b6d5fe95c..4e78073bcd3 100644 --- a/code/game/objects/items/weapons/grenades/spawnergrenade.dm +++ b/code/game/objects/items/weapons/grenades/spawnergrenade.dm @@ -47,6 +47,9 @@ origin_tech = list(TECH_MATERIAL = 3, TECH_MAGNET = 4, TECH_ILLEGAL = 4) flash = FALSE +/obj/item/grenade/spawnergrenade/manhacks/lubed + spawner_type = /mob/living/simple_animal/hostile/viscerator/lube + /obj/item/grenade/spawnergrenade/spesscarp name = "carp delivery grenade" spawner_type = /mob/living/simple_animal/hostile/carp diff --git a/code/game/objects/items/weapons/storage/belt.dm b/code/game/objects/items/weapons/storage/belt.dm index 8e6466e6c6c..677262337da 100644 --- a/code/game/objects/items/weapons/storage/belt.dm +++ b/code/game/objects/items/weapons/storage/belt.dm @@ -133,8 +133,8 @@ /obj/item/device/radio ) -/obj/item/storage/belt/medical/emt - name = "EMT utility belt" +/obj/item/storage/belt/medical/first_responder + name = "first responder utility belt" desc = "A sturdy black webbing belt with attached pouches." icon_state = "emsbelt" item_state = "emsbelt" diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index dfe4e647d88..5d678364c5e 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -358,7 +358,7 @@ problist = list( /obj/item/storage/belt/utility = 1, /obj/item/storage/belt/medical = 0.4, - /obj/item/storage/belt/medical/emt = 0.4, + /obj/item/storage/belt/medical/first_responder = 0.4, /obj/item/storage/belt/security/tactical = 0.1, /obj/item/storage/belt/military = 0.1, /obj/item/storage/belt/janitor = 0.4 diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 3d42d37aa4b..fbfeadb660c 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -24,6 +24,7 @@ var/store_misc = 1 var/store_items = 1 var/store_mobs = 1 + var/maximum_mob_size = 15 var/const/default_mob_size = 15 var/obj/item/closet_teleporter/linked_teleporter @@ -190,6 +191,8 @@ for(var/mob/living/M in loc) if(M.buckled || M.pinned.len) continue + if(M.mob_size >= maximum_mob_size) + continue if(stored_units + added_units + M.mob_size > storage_capacity) break if(M.client) @@ -314,6 +317,8 @@ user.drop_item() else if(istype(W, /obj/item/stack/packageWrap)) return + else if(istype(W, /obj/item/ducttape)) + return else if(W.iswelder()) var/obj/item/weldingtool/WT = W if(WT.isOn()) diff --git a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm index d4f0870e945..c5263f700b7 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/medical.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/medical.dm @@ -86,7 +86,7 @@ new /obj/item/clothing/glasses/hud/health/aviator(src) new /obj/item/clothing/glasses/eyepatch/hud/medical(src) new /obj/item/clothing/suit/storage/medical_chest_rig(src) - new /obj/item/clothing/suit/storage/medical_chest_rig/emt(src) + new /obj/item/clothing/suit/storage/medical_chest_rig/first_responder(src) /obj/structure/closet/secure_closet/CMO @@ -191,6 +191,7 @@ icon_opened = "medical_wall_open" icon_broken = "medical_wall_spark" icon_off = "medical_wall_off" + store_mobs = FALSE anchored = 1 density = 0 wall_mounted = 1 diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index d44317fac55..5cc7921d8c5 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -199,6 +199,8 @@ ) else togglelock(user) + else if(istype(W, /obj/item/ducttape)) + return else togglelock(user)//Attempt to lock locker if closed @@ -280,4 +282,3 @@ var/obj/structure/bigDelivery/BD = loc BD.unwrap() open() - diff --git a/code/game/objects/structures/crates_lockers/closets/walllocker.dm b/code/game/objects/structures/crates_lockers/closets/walllocker.dm index 8b3c42b6580..033b14a0b57 100644 --- a/code/game/objects/structures/crates_lockers/closets/walllocker.dm +++ b/code/game/objects/structures/crates_lockers/closets/walllocker.dm @@ -8,6 +8,7 @@ icon_state = "wall-locker" density = 0 anchored = 1 + store_mobs = FALSE icon_closed = "wall-locker" icon_opened = "wall-lockeropen" diff --git a/code/game/objects/structures/crates_lockers/crates.dm b/code/game/objects/structures/crates_lockers/crates.dm index aa5d71782ab..e6d91d75045 100644 --- a/code/game/objects/structures/crates_lockers/crates.dm +++ b/code/game/objects/structures/crates_lockers/crates.dm @@ -1,5 +1,7 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32 +#define ABOVE_TABLE 1 +#define UNDER_TABLE -1 /obj/structure/closet/crate name = "crate" desc = "A rectangular steel crate." @@ -11,13 +13,10 @@ build_amt = 10 var/rigged = 0 var/tablestatus = 0 - pass_flags = PASSTABLE - slowdown = 0 - /obj/structure/closet/crate/can_open() - if (tablestatus != -1)//Can't be opened while under a table + if (tablestatus != UNDER_TABLE)//Can't be opened while under a table return 1 return 0 @@ -84,7 +83,6 @@ icon_state = icon_closed opened = 0 - pass_flags = PASSTABLE//Crates can only slide under tables when closed return 1 @@ -141,10 +139,6 @@ A.ex_act(severity) qdel(src) - - - - /* ========================== Table interactions @@ -153,35 +147,31 @@ /obj/structure/closet/crate/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) if (istype(mover, /obj/structure/closet/crate))//Handle interaction with other crates var/obj/structure/closet/crate/C = mover - if (tablestatus == 1 && C.tablestatus != 1 && !C.opened)//Allow the crate to slide under us if we're ontop of a table - return 1 - else if (tablestatus == -1 && C.tablestatus == 1)//Allow it to slide over us if we're underneath a table - return 1 - else//Otherwise, block it. Don't allow two crates on the same level of a tile - return 0 - if(istype(mover,/obj/item/projectile)) - if (tablestatus == 1)//They always block shots on a table - return 0 - else if (!tablestatus && prob(15))//Usually will not block shots when lying on the floor - return 0 - else return 1 - else if(istype(mover) && mover.checkpass(PASSTABLE)) - return 1 + if (tablestatus && tablestatus != C.tablestatus) // Crates can go under tables with crates on top of them, and vice versa + return TRUE + else + return FALSE + if (istype(mover,/obj/item/projectile)) + // Crates on a table always block shots, otherwise they only occasionally do so. + return tablestatus == ABOVE_TABLE ? FALSE : (prob(15) ? FALSE : TRUE) + else if(istype(mover) && mover.checkpass(PASSTABLE) && tablestatus == ABOVE_TABLE) + return TRUE return ..() /obj/structure/closet/crate/Move(var/turf/destination, dir) if(..()) if (locate(/obj/structure/table) in destination) - if (tablestatus != 1) - set_tablestatus(-1)//Slide under the table + if(locate(/obj/structure/table/rack) in destination) + set_tablestatus(ABOVE_TABLE) + else if(tablestatus != ABOVE_TABLE) + set_tablestatus(UNDER_TABLE)//Slide under the table else - set_tablestatus(0) - + set_tablestatus(FALSE) /obj/structure/closet/crate/toggle(var/mob/user) - if (!opened && tablestatus == -1) - to_chat(user, SPAN_WARNING("You can't open that while it's under the table")) - return 0 + if (!opened && tablestatus == UNDER_TABLE) + to_chat(user, SPAN_WARNING("You can't open that while the lid is obstructed!")) + return FALSE else return ..() @@ -191,29 +181,26 @@ spawn(3)//Short spawn prevents things popping up where they shouldnt switch (target) - if (1) + if (ABOVE_TABLE) layer = LAYER_ABOVE_TABLE pixel_y = 8 - if (0) + if (FALSE) layer = initial(layer) pixel_y = 0 - if (-1) + if (UNDER_TABLE) layer = LAYER_UNDER_TABLE pixel_y = -4 - //For putting on tables /obj/structure/closet/crate/MouseDrop(atom/over_object) if (istype(over_object, /obj/structure/table)) put_on_table(over_object, usr) - return 1 + return TRUE else return ..() - - /obj/structure/closet/crate/proc/put_on_table(var/obj/structure/table/table, var/mob/user) - if (!table || !user || (tablestatus == -1)) + if (!table || !user || (tablestatus == UNDER_TABLE)) return //User must be in reach of the crate @@ -226,24 +213,20 @@ to_chat(user, SPAN_WARNING("Take the crate closer to the table!")) return - for (var/obj/structure/closet/crate/C in get_turf(table)) - if (C.tablestatus != -1) + if (C.tablestatus != UNDER_TABLE) to_chat(user, SPAN_WARNING("There's already a crate on this table!")) return //Crates are heavy, hauling them onto tables is hard. //The more stuff thats in it, the longer it takes //Good place to factor in Strength in future - var/timeneeded = 20 - var/success = 0 + var/timeneeded = 2 SECONDS - - - if (tablestatus == 1 && Adjacent(table)) + if (tablestatus == ABOVE_TABLE && Adjacent(table)) //Sliding along a tabletop we're already on. Instant and silent timeneeded = 0 - success = 1 + return TRUE else //Add time based on mass of contents for (var/obj/O in contents) @@ -252,16 +235,14 @@ timeneeded += 3* M.mob_size if (timeneeded > 0) - user.visible_message("[user] starts hoisting [src] onto the [table]", "You start hoisting [src] onto the [table]. This will take about [timeneeded*0.1] seconds") + user.visible_message("[user] starts hoisting \the [src] onto \the [table].", "You start hoisting \the [src] onto \the [table]. This will take about [timeneeded * 0.1] seconds.") user.face_atom(src) - if (do_after(user, timeneeded, needhand = 1)) - success = 1 - - - if (success == 1) - forceMove(get_turf(table)) - set_tablestatus(1) - + if (!do_after(user, timeneeded, needhand = TRUE, act_target = src)) + return FALSE + else + forceMove(get_turf(table)) + set_tablestatus(ABOVE_TABLE) + return TRUE /* ===================== diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm index 554040f7f2e..2c27b649634 100644 --- a/code/game/turfs/flooring/flooring_decals.dm +++ b/code/game/turfs/flooring/flooring_decals.dm @@ -605,7 +605,7 @@ /obj/effect/floor_decal/sign/gtr icon_state = "white_gtr" -/obj/effect/floor_decal/sign/emt +/obj/effect/floor_decal/sign/first_responder icon_state = "white_emt" /obj/effect/floor_decal/sign/w diff --git a/code/game/turfs/simulated/shuttle_turfs.dm b/code/game/turfs/simulated/shuttle_turfs.dm index 1e05d84df7b..94fbe327f6a 100644 --- a/code/game/turfs/simulated/shuttle_turfs.dm +++ b/code/game/turfs/simulated/shuttle_turfs.dm @@ -292,6 +292,8 @@ icon_state = "5,4" /obj/structure/shuttle_part/raider + name = "Skipjack" + desc = "A quick, agile and sturdy shuttle. Perfect for smugglers and pirates, but recently proliferated in civilian hands." icon = 'icons/turf/shuttles_unique/raider_shuttle.dmi' icon_state = "4,1" diff --git a/code/game/turfs/simulated/wall_attacks.dm b/code/game/turfs/simulated/wall_attacks.dm index 8c10c019f55..63d622c3593 100644 --- a/code/game/turfs/simulated/wall_attacks.dm +++ b/code/game/turfs/simulated/wall_attacks.dm @@ -377,9 +377,8 @@ return else if(!istype(W,/obj/item/rfd/construction) && !istype(W, /obj/item/reagent_containers)) - //At this point we know that they probably wanna hit it. if(user.a_intent != I_HURT || !W.force) - return attack_hand(user) + return var/damage_to_deal = W.force var/weaken = 0 diff --git a/code/modules/admin/verbs/warning.dm b/code/modules/admin/verbs/warning.dm index 5343d704415..2774e382dad 100644 --- a/code/modules/admin/verbs/warning.dm +++ b/code/modules/admin/verbs/warning.dm @@ -311,8 +311,7 @@ var/dcolor = "#ffdddd" //dark colour, severity = 1 var/ecolor = "#e3e3e3" //gray colour, expired = 1 - establish_db_connection(dbcon) - if (!dbcon.IsConnected()) + if (!establish_db_connection(dbcon)) alert("Connection to the SQL database lost. Aborting. Please alert the database admin!") return diff --git a/code/modules/client/client procs.dm b/code/modules/client/client procs.dm index f25c0be5d30..bfaf8cff39c 100644 --- a/code/modules/client/client procs.dm +++ b/code/modules/client/client procs.dm @@ -29,6 +29,14 @@ ..() return + if(href_list["vueuiclose"]) + var/datum/vueui/ui = locate(href_list["src"]) + if(istype(ui)) + ui.close() + else // UI is an orphan, close it directly. + src << browse(null, "window=vueui[href_list["src"]]") + return + // asset_cache if(href_list["asset_cache_confirm_arrival"]) //to_chat(src, "ASSET JOB [href_list["asset_cache_confirm_arrival"]] ARRIVED.") @@ -749,5 +757,3 @@ M.set_dir(get_dir(M, over_object)) gun.Fire(get_turf(over_object), mob, params, (get_dist(over_object, mob) <= 1), FALSE) CHECK_TICK - - diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm index 8ec690723a1..3474b992ab3 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm @@ -40,7 +40,7 @@ armbands["red armband"] = /obj/item/clothing/accessory/armband armbands["security armband"] = /obj/item/clothing/accessory/armband/sec armbands["cargo armband"] = /obj/item/clothing/accessory/armband/cargo - armbands["EMT armband"] = /obj/item/clothing/accessory/armband/medgreen + armbands["first responder armband"] = /obj/item/clothing/accessory/armband/medgreen armbands["medical armband"] = /obj/item/clothing/accessory/armband/med armbands["engineering armband"] = /obj/item/clothing/accessory/armband/engine armbands["hydroponics armband"] = /obj/item/clothing/accessory/armband/hydro @@ -112,7 +112,7 @@ /datum/gear/accessory/white_vest display_name = "webbing, medical" path = /obj/item/clothing/accessory/storage/white_vest - allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Psychiatrist", "Emergency Medical Technician", "Medical Intern") + allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Psychiatrist", "First Responder", "Medical Intern") /datum/gear/accessory/webbing display_name = "webbing, simple" @@ -132,7 +132,7 @@ /datum/gear/accessory/white_pouches display_name = "drop pouches, medical" path = /obj/item/clothing/accessory/storage/pouches/white - allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Psychiatrist", "Emergency Medical Technician", "Medical Intern") + allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Psychiatrist", "First Responder", "Medical Intern") /datum/gear/accessory/pouches display_name = "drop pouches, simple" diff --git a/code/modules/client/preference_setup/loadout/loadout_computer.dm b/code/modules/client/preference_setup/loadout/loadout_computer.dm index 9833220e1ca..3b9c43f5bf0 100644 --- a/code/modules/client/preference_setup/loadout/loadout_computer.dm +++ b/code/modules/client/preference_setup/loadout/loadout_computer.dm @@ -26,7 +26,7 @@ /datum/gear/computer/handheld/wristbound/medical display_name = "wristbound computer (Medical)" path = /obj/item/modular_computer/handheld/wristbound/preset/advanced/medical - allowed_roles = list("Physician", "Surgeon", "Medical Intern", "Pharmacist", "Psychiatrist", "Emergency Medical Technician") + allowed_roles = list("Physician", "Surgeon", "Medical Intern", "Pharmacist", "Psychiatrist", "First Responder") /datum/gear/computer/handheld/wristbound/security display_name = "wristbound computer (Security)" diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes.dm b/code/modules/client/preference_setup/loadout/loadout_eyes.dm index a87fd4fa81f..04f7b5a252e 100644 --- a/code/modules/client/preference_setup/loadout/loadout_eyes.dm +++ b/code/modules/client/preference_setup/loadout/loadout_eyes.dm @@ -73,7 +73,7 @@ display_name = "medical HUD selection" description = "A selection of medical HUDs." path = /obj/item/clothing/glasses/hud/health/aviator - allowed_roles = list("Physician", "Surgeon", "Chief Medical Officer", "Pharmacist", "Emergency Medical Technician", "Psychiatrist", "Medical Intern") + allowed_roles = list("Physician", "Surgeon", "Chief Medical Officer", "Pharmacist", "First Responder", "Psychiatrist", "Medical Intern") /datum/gear/eyes/medhuds/New() ..() diff --git a/code/modules/client/preference_setup/loadout/loadout_head.dm b/code/modules/client/preference_setup/loadout/loadout_head.dm index aac83864803..f31ec72ddcf 100644 --- a/code/modules/client/preference_setup/loadout/loadout_head.dm +++ b/code/modules/client/preference_setup/loadout/loadout_head.dm @@ -32,7 +32,7 @@ gear_tweaks += new/datum/gear_tweak/path(bandanas) -/datum/gear/head/bandana/colorable +/datum/gear/head/bandana_color display_name = "bandana (colorable)" path = /obj/item/clothing/head/bandana/colorable flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION @@ -62,7 +62,7 @@ gear_tweaks += new/datum/gear_tweak/path(softcaps) -/datum/gear/head/softcap/colorable +/datum/gear/head/softcap_color display_name = "softcap (colorable)" path = /obj/item/clothing/head/softcap/colorable flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION @@ -91,7 +91,7 @@ gear_tweaks += new/datum/gear_tweak/path(berets) -/datum/gear/head/beret/color +/datum/gear/head/beret_color display_name = "beret (colorable)" path = /obj/item/clothing/head/beret/colorable flags = GEAR_HAS_NAME_SELECTION | GEAR_HAS_DESC_SELECTION | GEAR_HAS_COLOR_SELECTION @@ -245,7 +245,7 @@ /datum/gear/head/surgical display_name = "surgical cap selection" path = /obj/item/clothing/head/surgery/blue - allowed_roles = list("Scientist", "Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Emergency Medical Technician", "Medical Intern", "Xenobiologist", "Roboticist", "Research Director", "Forensic Technician") + allowed_roles = list("Scientist", "Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "First Responder", "Medical Intern", "Xenobiologist", "Roboticist", "Research Director", "Forensic Technician") /datum/gear/head/surgical/New() ..() @@ -273,7 +273,7 @@ /datum/gear/head/iacberet display_name = "IAC Beret" path = /obj/item/clothing/head/softcap/iac - allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Emergency Medical Technician", "Medical Intern") + allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "First Responder", "Medical Intern") flags = GEAR_HAS_DESC_SELECTION /datum/gear/head/circuitry diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index 225ff3e9485..7f70aea25e1 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -99,13 +99,13 @@ display_name = "surgical apron" path = /obj/item/clothing/suit/apron/surgery cost = 1 - allowed_roles = list("Scientist", "Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Emergency Medical Technician", "Medical Intern", "Xenobiologist", "Roboticist", "Research Director", "Forensic Technician") + allowed_roles = list("Scientist", "Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "First Responder", "Medical Intern", "Xenobiologist", "Roboticist", "Research Director", "Forensic Technician") /datum/gear/suit/iacvest display_name = "IAC vest" description = "It's a lightweight vest. Made of a dark, navy mesh with highly-reflective white material, designed to be worn by the Interstellar Aid Corps." path = /obj/item/clothing/suit/storage/iacvest - allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Emergency Medical Technician", "Medical Intern") + allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "First Responder", "Medical Intern") flags = GEAR_HAS_DESC_SELECTION /datum/gear/suit/poncho diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index 2f1cd11ef2c..fa9b198c984 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -8,7 +8,7 @@ /datum/gear/uniform/iacjumpsuit display_name = "IAC Jumpsuit" path = /obj/item/clothing/under/rank/iacjumpsuit - allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Emergency Medical Technician", "Medical Intern") + allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "First Responder", "Medical Intern") /datum/gear/uniform/jumpsuit display_name = "generic jumpsuits" @@ -96,7 +96,7 @@ /datum/gear/uniform/scrubs display_name = "scrubs selection" path = /obj/item/clothing/under/rank/medical/black - allowed_roles = list("Scientist","Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "Emergency Medical Technician", "Medical Intern", "Xenobiologist", "Roboticist", "Research Director", "Forensic Technician") + allowed_roles = list("Scientist","Chief Medical Officer", "Physician", "Surgeon", "Pharmacist", "First Responder", "Medical Intern", "Xenobiologist", "Roboticist", "Research Director", "Forensic Technician") /datum/gear/uniform/scrubs/New() ..() diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm index 99856f93f7a..8ab7cc9796b 100644 --- a/code/modules/client/preference_setup/loadout/loadout_utility.dm +++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm @@ -100,10 +100,17 @@ /datum/gear/utility/fannypack/New() ..() var/list/fannys = list() - for(var/fanny in typesof(/obj/item/storage/belt/fannypack)) - var/obj/item/storage/belt/fannypack/fanny_type = fanny - fannys[initial(fanny_type.name)] = fanny_type - gear_tweaks += new/datum/gear_tweak/path(sortAssoc(fannys)) + fannys["leather fannypack"] = /obj/item/storage/belt/fannypack + fannys["black fannypack"] = /obj/item/storage/belt/fannypack/black + fannys["blue fannypack"] = /obj/item/storage/belt/fannypack/blue + fannys["cyan fannypack"] = /obj/item/storage/belt/fannypack/cyan + fannys["green fannypack"] = /obj/item/storage/belt/fannypack/green + fannys["orange fannypack"] = /obj/item/storage/belt/fannypack/orange + fannys["purple fannypack"] = /obj/item/storage/belt/fannypack/purple + fannys["red fannypack"] = /obj/item/storage/belt/fannypack/red + fannys["white fannypack"] = /obj/item/storage/belt/fannypack/white + fannys["yellow fannypack"] = /obj/item/storage/belt/fannypack/yellow + gear_tweaks += new/datum/gear_tweak/path(fannys) /datum/gear/utility/toolbelt_alt display_name = "tool-belt, alt" diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm b/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm index 37d408ef52d..8f67b3c21f0 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno/tajara.dm @@ -57,7 +57,7 @@ display_name = "PRA medical coat" path = /obj/item/clothing/suit/storage/toggle/labcoat/tajaran whitelisted = list(SPECIES_TAJARA, SPECIES_TAJARA_ZHAN, SPECIES_TAJARA_MSAI) - allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Chemist", "Geneticist", "Emergency Medical Technician", "Medical Intern") + allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Chemist", "Geneticist", "First Responder", "Medical Intern") sort_category = "Xenowear - Tajara" /datum/gear/suit/tajaran_surgeon diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno/unathi.dm b/code/modules/client/preference_setup/loadout/loadout_xeno/unathi.dm index 89ebbadd4c5..f32a298b053 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno/unathi.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno/unathi.dm @@ -98,7 +98,7 @@ whitelisted = list(SPECIES_UNATHI) sort_category = "Xenowear - Unathi" cost = 3 - allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "Emergency Medical Technician", "Medical Intern", "Psychiatrist", "Chemist") + allowed_roles = list("Chief Medical Officer", "Physician", "Surgeon", "First Responder", "Medical Intern", "Psychiatrist", "Chemist") flags = GEAR_NO_SELECTION /datum/gear/augment/autakh_security diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index 1cd82cbafc0..3de0eb754ac 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -39,9 +39,9 @@ icon_state = "atmos_fire" item_state = "atmos_fire" -/obj/item/clothing/head/hardhat/emt +/obj/item/clothing/head/hardhat/first_responder name = "medical helmet" - desc = "A polymer helmet worn by EMTs and Paramedics throughout human space to protect their heads. This one comes with an attached flashlight and has green crosses on the sides." + desc = "A polymer helmet worn by first responders throughout human space to protect their heads. This one comes with an attached flashlight and has green crosses on the sides." icon_state = "helmet_paramed" item_state = "helmet_paramed" light_overlay = "EMS_light" diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm index f5a1878de04..77e8968d771 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station.dm @@ -228,7 +228,7 @@ /obj/item/rig/medical/equipped - req_access = list(access_emt) + req_access = list(access_first_responder) initial_modules = list( /obj/item/rig_module/chem_dispenser/injector/paramedic, diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index f3b7a375f9b..7305e3b1b8f 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -290,13 +290,13 @@ obj/item/clothing/suit/apron/overalls/blue /obj/item/device/healthanalyzer, /obj/item/device/flashlight, /obj/item/device/radio, /obj/item/tank/emergency_oxygen, /obj/item/device/breath_analyzer, /obj/item/reagent_containers/blood) body_parts_covered = UPPER_TORSO -/obj/item/clothing/suit/storage/medical_chest_rig/emt +/obj/item/clothing/suit/storage/medical_chest_rig/first_responder name = "first responder vest" desc = "A dark green vest adorned with high-visibility stripes. Has pouches to carry equipment with." - icon = 'icons/clothing/kit/emt.dmi' + icon = 'icons/clothing/kit/first_responder.dmi' contained_sprite = TRUE - icon_state = "emtvest" - item_state = "emtvest" + icon_state = "firstrespondervest" + item_state = "firstrespondervest" //Mime /obj/item/clothing/suit/suspenders @@ -307,10 +307,10 @@ obj/item/clothing/suit/apron/overalls/blue blood_overlay_type = "armor" //it's the less thing that I can put here body_parts_covered = 0 -/obj/item/clothing/suit/storage/toggle/emt_jacket +/obj/item/clothing/suit/storage/toggle/first_responder_jacket name = "first responder jacket" desc = "A dark green first responder jacket." - icon = 'icons/clothing/kit/emt.dmi' + icon = 'icons/clothing/kit/first_responder.dmi' contained_sprite = TRUE - icon_state = "emtjacket" - item_state = "emtjacket" + icon_state = "firstresponderjacket" + item_state = "firstresponderjacket" diff --git a/code/modules/clothing/under/accessories/armband.dm b/code/modules/clothing/under/accessories/armband.dm index de2e2240b69..abc23cd9e22 100644 --- a/code/modules/clothing/under/accessories/armband.dm +++ b/code/modules/clothing/under/accessories/armband.dm @@ -36,7 +36,7 @@ icon_state = "med" /obj/item/clothing/accessory/armband/medgreen - name = "EMT armband" + name = "first responder armband" desc = "An armband, worn by the crew to display which department they're assigned to. This one is white and green." icon_state = "medgreen" diff --git a/code/modules/clothing/under/jobs/medsci.dm b/code/modules/clothing/under/jobs/medsci.dm index ccae115cd40..3c48dee42aa 100644 --- a/code/modules/clothing/under/jobs/medsci.dm +++ b/code/modules/clothing/under/jobs/medsci.dm @@ -164,13 +164,13 @@ item_state = "bl_suit" worn_state = "scrubsblack" -/obj/item/clothing/under/rank/medical/emt +/obj/item/clothing/under/rank/medical/first_responder name = "first responder jumpsuit" desc = "A jumpsuit that denotes the wearer as a Nanotrasen First Responder." - icon = 'icons/clothing/kit/emt.dmi' + icon = 'icons/clothing/kit/first_responder.dmi' contained_sprite = TRUE - icon_state = "emtjumpsuit" - item_state = "emtjumpsuit" + icon_state = "firstresponderjumpsuit" + item_state = "firstresponderjumpsuit" /obj/item/clothing/under/rank/psych desc = "A basic white jumpsuit. It has turqouise markings that denote the wearer as a psychiatrist." diff --git a/code/modules/detectivework/forensics.dm b/code/modules/detectivework/forensics.dm index d7c5272d4f2..8b49cd3a92d 100644 --- a/code/modules/detectivework/forensics.dm +++ b/code/modules/detectivework/forensics.dm @@ -13,11 +13,11 @@ atom/var/list/suit_fibers atom/proc/add_fibers(mob/living/carbon/human/M) if(M.gloves && istype(M.gloves,/obj/item/clothing/gloves)) var/obj/item/clothing/gloves/G = M.gloves - if(G.transfer_blood) //bloodied gloves transfer blood to touched objects - if(add_blood(G.bloody_hands_mob)) //only reduces the bloodiness of our gloves if the item wasn't already bloody + if(G.transfer_blood && G.bloody_hands_mob?.resolve()) //bloodied gloves transfer blood to touched objects + if(add_blood(G.bloody_hands_mob.resolve())) //only reduces the bloodiness of our gloves if the item wasn't already bloody G.transfer_blood-- - else if(M.bloody_hands) - if(add_blood(M.bloody_hands_mob)) + else if(M.bloody_hands && M.bloody_hands_mob?.resolve()) + if(add_blood(M.bloody_hands_mob.resolve())) M.bloody_hands-- if(!suit_fibers) suit_fibers = list() diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index d030a818095..dc45e2a1f8c 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -1,6 +1,6 @@ /mob var/bloody_hands = null - var/mob/living/carbon/human/bloody_hands_mob + var/datum/weakref/bloody_hands_mob var/track_footprint = 0 var/list/feet_blood_DNA var/track_footprint_type @@ -8,7 +8,7 @@ /obj/item/clothing/gloves var/transfer_blood = 0 - var/mob/living/carbon/human/bloody_hands_mob + var/datum/weakref/bloody_hands_mob /obj/item/clothing/shoes/ var/track_footprint = 0 diff --git a/code/modules/effects/map_effects/airlock_spawner.dm b/code/modules/effects/map_effects/airlock_spawner.dm index 63649ae1e18..5c5dde98a01 100644 --- a/code/modules/effects/map_effects/airlock_spawner.dm +++ b/code/modules/effects/map_effects/airlock_spawner.dm @@ -76,7 +76,7 @@ This spawner places pipe leading up to the interior door, you will need to finis if(one_door_only != DOOR_FLIPPED_PLACEMENT) A = new door_type(T) handle_door_stuff(A, is_this_an_interior_airlock) - var/obj/machinery/access_button/the_button = spawn_button(T, is_this_an_interior_airlock ? interior_direction : exterior_direction) + var/obj/machinery/access_button/the_button = spawn_button(T, is_this_an_interior_airlock ? interior_direction : exterior_direction, is_this_an_interior_airlock) //Creates a button, with position and specific cycle command depending on door direction/if it's interior or exterior if(one_door_only == DOOR_NORMAL_PLACEMENT) //We only need one door, we are done return if(!(tiles_in_x_direction % 2) && (is_this_an_interior_airlock && north_or_south_interior || !is_this_an_interior_airlock && north_or_south_exterior)) //Handle extra airlock for aesthetics @@ -97,7 +97,7 @@ This spawner places pipe leading up to the interior door, you will need to finis A.name = door_name A.lock() -/obj/effect/map_effect/airlock/proc/spawn_button(turf/T, some_direction) +/obj/effect/map_effect/airlock/proc/spawn_button(turf/T, some_direction, is_this_an_interior_airlock) var/obj/machinery/access_button/the_button = new(T) the_button.master_tag = id_to_link the_button.set_frequency(radio_frequency) @@ -115,6 +115,12 @@ This spawner places pipe leading up to the interior door, you will need to finis the_button.pixel_x -= 7 the_button.pixel_y -= 25 the_button.req_access = required_access + + if(is_this_an_interior_airlock) + the_button.command = "cycle_interior" + else + the_button.command = "cycle_exterior" + return the_button /obj/effect/map_effect/airlock/proc/handle_control_placement() //Stick the sensor and controller on the same bit of wall, this will ONLY be unsuitable if airlocks are on both the south and west turfs diff --git a/code/modules/martial_arts/gunkata.dm b/code/modules/martial_arts/gunkata.dm new file mode 100644 index 00000000000..deb8783237c --- /dev/null +++ b/code/modules/martial_arts/gunkata.dm @@ -0,0 +1,10 @@ +/datum/martial_art/gun_kata + name = "Gun-Kata" + weapon_affinity = list(/obj/item/gun) + +/obj/item/martial_manual/gun_kata + name = "Gun-Kata manual" + desc = "A manual containing basic Gun-Kata instruction and techniques." + icon_state = "rulebook" + item_state = "rulebook" + martial_art = /datum/martial_art/gun_kata \ No newline at end of file diff --git a/code/modules/martial_arts/martial.dm b/code/modules/martial_arts/martial.dm index d2c6cbfe4d8..353c03a60ea 100644 --- a/code/modules/martial_arts/martial.dm +++ b/code/modules/martial_arts/martial.dm @@ -8,7 +8,7 @@ var/no_guns = FALSE //set to TRUE to prevent users of this style from using guns var/no_guns_message = "" //message to tell the style user if they try and use a gun while no_guns = TRUE (DISHONORABRU!) var/temporary = 0 - var/weapon_affinity //if this martial art has any interaction with a weapon, also spawns said weapon when the manual is used + var/list/weapon_affinity //if this martial art has any interaction with a weapon var/parry_multiplier = 1 //if this martial art increases the chance of parrying with the weapon var/list/possible_weapons //if any weapon is spawned when you use the martial art manual diff --git a/code/modules/martial_arts/swordsmanship.dm b/code/modules/martial_arts/swordsmanship.dm index 0c27e79143c..1dd42f7c342 100644 --- a/code/modules/martial_arts/swordsmanship.dm +++ b/code/modules/martial_arts/swordsmanship.dm @@ -1,6 +1,6 @@ /datum/martial_art/swordsmanship name = "Swordsmanship" - weapon_affinity = /obj/item/material/sword + weapon_affinity = list(/obj/item/material/sword) parry_multiplier = 2 possible_weapons = list(/obj/item/material/sword, /obj/item/material/sword/katana, /obj/item/material/sword/rapier) diff --git a/code/modules/mob/abstract/new_player/menu.dm b/code/modules/mob/abstract/new_player/menu.dm index ed71a3ecf48..53628e96e33 100644 --- a/code/modules/mob/abstract/new_player/menu.dm +++ b/code/modules/mob/abstract/new_player/menu.dm @@ -199,7 +199,7 @@ /obj/screen/new_player/selection/polls/Initialize() . = ..() - if(dbcon.IsConnected()) + if(establish_db_connection(dbcon)) var/mob/M = hud.mymob var/isadmin = M && M.client && M.client.holder var/DBQuery/query = dbcon.NewQuery("SELECT id FROM ss13_poll_question WHERE [(isadmin ? "" : "adminonly = false AND")] Now() BETWEEN starttime AND endtime AND id NOT IN (SELECT pollid FROM ss13_poll_vote WHERE ckey = \"[M.ckey]\") AND id NOT IN (SELECT pollid FROM ss13_poll_textreply WHERE ckey = \"[M.ckey]\")") diff --git a/code/modules/mob/animations.dm b/code/modules/mob/animations.dm index c34174f8a20..9b35a75301a 100644 --- a/code/modules/mob/animations.dm +++ b/code/modules/mob/animations.dm @@ -136,11 +136,11 @@ note dizziness decrements automatically in the mob's Life() proc. animate(pixel_y = old_y, time = quarter_period, easing = SINE_EASING | EASE_IN, loop = -1) //back /mob/proc/stop_floating() - animate(src, pixel_y = 0, time = 5, easing = SINE_EASING | EASE_IN) //halt animation - //reset the pixel offsets to zero + animate(src, pixel_y = get_standard_pixel_y(), time = 5, easing = SINE_EASING | EASE_IN) //halt animation + //reset the pixel offsets to defaults is_floating = 0 -/atom/movable/proc/do_attack_animation(atom/A, atom/movable/weapon) +/atom/movable/proc/do_attack_animation(atom/A, atom/movable/weapon, var/image/attack_image, var/initial_pixel_x = 0, var/initial_pixel_y = 0) var/pixel_x_diff = 0 var/pixel_y_diff = 0 var/turn_dir = 1 @@ -180,20 +180,24 @@ note dizziness decrements automatically in the mob's Life() proc. pixel_x_diff = -8 turn_dir = -1 - var/default_pixel_x = initial(pixel_x) - var/default_pixel_y = initial(pixel_y) + if(!initial_pixel_x) + initial_pixel_x = initial(pixel_x) + if(!initial_pixel_y) + initial_pixel_y = initial(pixel_y) animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, time = 2) - animate(pixel_x = default_pixel_x, pixel_y = default_pixel_y, time = 2) + animate(pixel_x = initial_pixel_x, pixel_y = initial_pixel_y, time = 2) var/matrix/initial_transform = matrix(transform) var/matrix/rotated_transform = transform.Turn(15 * turn_dir) animate(src, pixel_x = pixel_x + pixel_x_diff, pixel_y = pixel_y + pixel_y_diff, transform = rotated_transform, time = 2, easing = BACK_EASING | EASE_IN) - animate(pixel_x = default_pixel_x, pixel_y = default_pixel_y, transform = initial_transform, time = 2, easing = SINE_EASING) + animate(pixel_x = initial_pixel_x, pixel_y = initial_pixel_y, transform = initial_transform, time = 2, easing = SINE_EASING) // either attack_item OR attack_image should be used. if both are used, attack_image will be the one chosen /mob/do_attack_animation(atom/A, var/atom/attack_item, var/image/attack_image) - ..() + var/initial_pixel_x = get_standard_pixel_x() + var/initial_pixel_y = get_standard_pixel_y() + ..(A, attack_item, attack_image, initial_pixel_x, initial_pixel_y) is_floating = 0 // If we were without gravity, the bouncing animation got stopped, so we make sure we restart the bouncing after the next movement. if(attack_item == FIST_ATTACK_ANIMATION) // only play the physical movement @@ -239,7 +243,7 @@ note dizziness decrements automatically in the mob's Life() proc. var/matrix/M = new M.Turn(pick(-20, 20)) // And animate the attack! - animate(I, alpha = 175, pixel_x = 0, pixel_y = 0, pixel_z = 0, time = 2, easing = CUBIC_EASING) + animate(I, alpha = 175, pixel_x = initial_pixel_x, pixel_y = initial_pixel_y, pixel_z = 0, time = 2, easing = CUBIC_EASING) sleep(2) animate(I, transform = M, time = 1) // apply the fancy matrix sleep(1) diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm index 46c94e3c122..56d04598d2a 100644 --- a/code/modules/mob/living/bot/medbot.dm +++ b/code/modules/mob/living/bot/medbot.dm @@ -323,6 +323,9 @@ else if(istype(src, /obj/item/storage/firstaid/o2)) A.skin = "o2" + if(A.skin) + A.add_overlay("kit_skin_[A.skin]") + qdel(S) user.put_in_hands(A) to_chat(user, "You add the robot arm to the first aid kit.") @@ -338,11 +341,6 @@ var/skin = null //Same as medbot, set to tox or ointment for the respective kits. w_class = ITEMSIZE_NORMAL -/obj/item/firstaid_arm_assembly/Initialize() - . = ..() - if(skin) - add_overlay("kit_skin_[skin]") - /obj/item/firstaid_arm_assembly/attackby(obj/item/W as obj, mob/user as mob) ..() if(W.ispen()) @@ -373,5 +371,6 @@ var/mob/living/bot/medbot/S = new /mob/living/bot/medbot(T) S.skin = skin S.name = created_name + S.update_icon() qdel(src) return 1 diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index e188fda1760..f991d0aeaef 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -3,7 +3,7 @@ for(var/obj/item/organ/I in internal_organs) I.removed() - if(istype(loc,/turf)) + if(isturf(loc)) I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30) for(var/obj/item/organ/external/E in src.organs) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index ae9c5722149..05392881a6a 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -461,11 +461,11 @@ emp_act var/obj/item/clothing/gloves/G = gloves G.add_blood(source) G.transfer_blood = amount - G.bloody_hands_mob = source + G.bloody_hands_mob = WEAKREF(source) else add_blood(source) bloody_hands = amount - bloody_hands_mob = source + bloody_hands_mob = WEAKREF(source) update_inv_gloves() //updates on-mob overlays for bloody hands and/or bloody gloves /mob/living/carbon/human/proc/bloody_body(var/mob/living/source) diff --git a/code/modules/mob/living/carbon/human/human_helpers.dm b/code/modules/mob/living/carbon/human/human_helpers.dm index edfe48d5655..2fbc6571cd9 100644 --- a/code/modules/mob/living/carbon/human/human_helpers.dm +++ b/code/modules/mob/living/carbon/human/human_helpers.dm @@ -233,11 +233,12 @@ var/parry_bonus = 0 for(var/art in known_martial_arts) var/datum/martial_art/M = art - if(istype(O, M.weapon_affinity)) - if(parry_chance) - parry_bonus = max(parry_bonus, M.parry_multiplier) - continue - return TRUE + for(var/type in M.weapon_affinity) + if(istype(O, type)) + if(parry_chance) + parry_bonus = max(parry_bonus, M.parry_multiplier) + continue + return TRUE if(parry_chance) return parry_bonus return FALSE @@ -249,4 +250,10 @@ var/datum/martial_art/M = art if(M.no_guns) return M.no_guns_message - return FALSE \ No newline at end of file + return FALSE + +/mob/living/carbon/human/get_standard_pixel_x() + return species.icon_x_offset + +/mob/living/carbon/human/get_standard_pixel_y() + return species.icon_y_offset \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 918249e0547..09a62fd14ed 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -467,9 +467,15 @@ /datum/species/proc/handle_vision(var/mob/living/carbon/human/H) var/list/vision = H.get_accumulated_vision_handlers() H.update_sight() - H.sight |= get_vision_flags(H) - H.sight |= H.equipment_vision_flags - H.sight |= vision[1] + if(H.machine && H.machine.check_eye(H) >= 0 && H.client.eye != H) + // we inherit sight flags from the machine + H.sight &= ~(get_vision_flags(H)) + H.sight &= ~(H.equipment_vision_flags) + H.sight &= ~(vision[1]) + else + H.sight |= get_vision_flags(H) + H.sight |= H.equipment_vision_flags + H.sight |= vision[1] if(H.stat == DEAD) return 1 @@ -637,4 +643,4 @@ return E.key /datum/species/proc/get_injection_modifier() - return injection_mod \ No newline at end of file + return injection_mod diff --git a/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm b/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm index e7ee8ade424..a220feda602 100644 --- a/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm +++ b/code/modules/mob/living/carbon/human/species/station/ipc/ipc_subspecies.dm @@ -47,17 +47,17 @@ appearance_flags = HAS_HAIR_COLOR | HAS_SKIN_TONE | HAS_EYE_COLOR | HAS_FBP | HAS_SKIN_PRESET | HAS_UNDERWEAR | HAS_SOCKS | HAS_LIPS has_limbs = list( - BP_CHEST = list("path" = /obj/item/organ/external/chest/shell), - BP_GROIN = list("path" = /obj/item/organ/external/groin/shell), - BP_HEAD = list("path" = /obj/item/organ/external/head/shell), - BP_L_ARM = list("path" = /obj/item/organ/external/arm/shell), - BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/shell), - BP_L_LEG = list("path" = /obj/item/organ/external/leg/shell), - BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/shell), - BP_L_HAND = list("path" = /obj/item/organ/external/hand/shell), - BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/shell), - BP_L_FOOT = list("path" = /obj/item/organ/external/foot/shell), - BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/shell) + BP_CHEST = list("path" = /obj/item/organ/external/chest/ipc/shell), + BP_GROIN = list("path" = /obj/item/organ/external/groin/ipc/shell), + BP_HEAD = list("path" = /obj/item/organ/external/head/ipc/shell), + BP_L_ARM = list("path" = /obj/item/organ/external/arm/ipc/shell), + BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/ipc/shell), + BP_L_LEG = list("path" = /obj/item/organ/external/leg/ipc/shell), + BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/ipc/shell), + BP_L_HAND = list("path" = /obj/item/organ/external/hand/ipc/shell), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/ipc/shell), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot/ipc/shell), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/ipc/shell) ) base_color = "#25032" @@ -140,17 +140,17 @@ show_ssd = "completely quiescent" has_limbs = list( - BP_CHEST = list("path" = /obj/item/organ/external/chest/industrial), - BP_GROIN = list("path" = /obj/item/organ/external/groin/industrial), - BP_HEAD = list("path" = /obj/item/organ/external/head/industrial), - BP_L_ARM = list("path" = /obj/item/organ/external/arm/industrial), - BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/industrial), - BP_L_LEG = list("path" = /obj/item/organ/external/leg/industrial), - BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/industrial), - BP_L_HAND = list("path" = /obj/item/organ/external/hand/industrial), - BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/industrial), - BP_L_FOOT = list("path" = /obj/item/organ/external/foot/industrial), - BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/industrial) + BP_CHEST = list("path" = /obj/item/organ/external/chest/ipc/industrial), + BP_GROIN = list("path" = /obj/item/organ/external/groin/ipc/industrial), + BP_HEAD = list("path" = /obj/item/organ/external/head/ipc/industrial), + BP_L_ARM = list("path" = /obj/item/organ/external/arm/ipc/industrial), + BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/ipc/industrial), + BP_L_LEG = list("path" = /obj/item/organ/external/leg/ipc/industrial), + BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/ipc/industrial), + BP_L_HAND = list("path" = /obj/item/organ/external/hand/ipc/industrial), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/ipc/industrial), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot/ipc/industrial), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/ipc/industrial) ) flags = IS_IPC | ACCEPTS_COOLER @@ -322,17 +322,17 @@ blurb = "An extremely durable and heavy Industrial model branded by Hephaestus Industries. It is their improved Industrial model, with thicker plating and improved power cell. Its actuators struggle to carry the immense weight, however, making the unit quite slow. This chassis would be seen in roles where it would be dangerous or inefficient to use a less durable unit, such as engineering, security, and mining. While this unit still possesses built-in cooling conduits, the increased plating and thickness of said plating proved a difficult challenge for the engineers to develop good cooling, so the unit suffers somewhat from increased heat loads. Overtaxing its hardware will quickly lead to overheating." has_limbs = list( - BP_CHEST = list("path" = /obj/item/organ/external/chest/industrial/hephaestus), - BP_GROIN = list("path" = /obj/item/organ/external/groin/industrial/hephaestus), - BP_HEAD = list("path" = /obj/item/organ/external/head/industrial/hephaestus), - BP_L_ARM = list("path" = /obj/item/organ/external/arm/industrial/hephaestus), - BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/industrial/hephaestus), - BP_L_LEG = list("path" = /obj/item/organ/external/leg/industrial/hephaestus), - BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/industrial/hephaestus), - BP_L_HAND = list("path" = /obj/item/organ/external/hand/industrial/hephaestus), - BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/industrial/hephaestus), - BP_L_FOOT = list("path" = /obj/item/organ/external/foot/industrial/hephaestus), - BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/industrial/hephaestus) + BP_CHEST = list("path" = /obj/item/organ/external/chest/ipc/industrial/hephaestus), + BP_GROIN = list("path" = /obj/item/organ/external/groin/ipc/industrial/hephaestus), + BP_HEAD = list("path" = /obj/item/organ/external/head/ipc/industrial/hephaestus), + BP_L_ARM = list("path" = /obj/item/organ/external/arm/ipc/industrial/hephaestus), + BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/ipc/industrial/hephaestus), + BP_L_LEG = list("path" = /obj/item/organ/external/leg/ipc/industrial/hephaestus), + BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/ipc/industrial/hephaestus), + BP_L_HAND = list("path" = /obj/item/organ/external/hand/ipc/industrial/hephaestus), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/ipc/industrial/hephaestus), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot/ipc/industrial/hephaestus), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/ipc/industrial/hephaestus) ) /datum/species/machine/industrial/hephaestus/get_light_color(mob/living/carbon/human/H) @@ -371,17 +371,17 @@ blurb = "The Xion Manufacturing Group, being a subsidiary of Hephaestus Industries, saw the original Industrial models and wanted to develop their own chassis based off of the original design. The result is the Xion Industrial model. Sturdy and strong, this chassis is quite powerful and equally durable, with an ample power cell and improved actuators for carrying the increased weight of the body. The Xion model also retains sturdiness without covering the chassis in plating, allowing for the cooling systems to vent heat much easier than the Hephaestus-brand model. This unit can perform EVA without assistance." has_limbs = list( - BP_CHEST = list("path" = /obj/item/organ/external/chest/industrial/xion), - BP_GROIN = list("path" = /obj/item/organ/external/groin/industrial/xion), - BP_HEAD = list("path" = /obj/item/organ/external/head/industrial/xion), - BP_L_ARM = list("path" = /obj/item/organ/external/arm/industrial/xion), - BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/industrial/xion), - BP_L_LEG = list("path" = /obj/item/organ/external/leg/industrial/xion), - BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/industrial/xion), - BP_L_HAND = list("path" = /obj/item/organ/external/hand/industrial/xion), - BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/industrial/xion), - BP_L_FOOT = list("path" = /obj/item/organ/external/foot/industrial/xion), - BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/industrial/xion) + BP_CHEST = list("path" = /obj/item/organ/external/chest/ipc/industrial/xion), + BP_GROIN = list("path" = /obj/item/organ/external/groin/ipc/industrial/xion), + BP_HEAD = list("path" = /obj/item/organ/external/head/ipc/industrial/xion), + BP_L_ARM = list("path" = /obj/item/organ/external/arm/ipc/industrial/xion), + BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/ipc/industrial/xion), + BP_L_LEG = list("path" = /obj/item/organ/external/leg/ipc/industrial/xion), + BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/ipc/industrial/xion), + BP_L_HAND = list("path" = /obj/item/organ/external/hand/ipc/industrial/xion), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/ipc/industrial/xion), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot/ipc/industrial/xion), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/ipc/industrial/xion) ) /datum/species/machine/industrial/xion/remote @@ -426,17 +426,17 @@ blurb = "Being a corporation focused primarily on medical sciences and treatments, Zeng-Hu Pharmaceuticals had little interest in the market of synthetics in the beginning (especially considering a good portion of Zeng-Hu employees are Skrellian). However, after seeing the advances in almost all fields of the galactic market after the advent of synthetics, Zeng-Hu set aside some funds for their own robotics department, focused mainly on medical service and even science related operations. Having taken some inspiration from biological life, the chassis has an interesting leg design: digitigrade legs provide the chassis with enhanced speed. A downside to this development was the reduction of metals on the chassis. Most plates covering the sensitive interior electronics are polymer casts to reduce the weight of the unit, resulting in a not-so-durable android." has_limbs = list( - BP_CHEST = list("path" = /obj/item/organ/external/chest/industrial/zenghu), - BP_GROIN = list("path" = /obj/item/organ/external/groin/industrial/zenghu), - BP_HEAD = list("path" = /obj/item/organ/external/head/industrial/zenghu), - BP_L_ARM = list("path" = /obj/item/organ/external/arm/industrial/zenghu), - BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/industrial/zenghu), - BP_L_LEG = list("path" = /obj/item/organ/external/leg/industrial/zenghu), - BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/industrial/zenghu), - BP_L_HAND = list("path" = /obj/item/organ/external/hand/industrial/zenghu), - BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/industrial/zenghu), - BP_L_FOOT = list("path" = /obj/item/organ/external/foot/industrial/zenghu), - BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/industrial/zenghu) + BP_CHEST = list("path" = /obj/item/organ/external/chest/ipc/industrial/zenghu), + BP_GROIN = list("path" = /obj/item/organ/external/groin/ipc/industrial/zenghu), + BP_HEAD = list("path" = /obj/item/organ/external/head/ipc/industrial/zenghu), + BP_L_ARM = list("path" = /obj/item/organ/external/arm/ipc/industrial/zenghu), + BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/ipc/industrial/zenghu), + BP_L_LEG = list("path" = /obj/item/organ/external/leg/ipc/industrial/zenghu), + BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/ipc/industrial/zenghu), + BP_L_HAND = list("path" = /obj/item/organ/external/hand/ipc/industrial/zenghu), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/ipc/industrial/zenghu), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot/ipc/industrial/zenghu), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/ipc/industrial/zenghu) ) inherent_verbs = list( @@ -475,17 +475,17 @@ blurb = "Bishop Cybernetics frames are among the sleeker, flashier frames widely produced for IPCs. This brand-new, high end design has a focus on pioneering energy efficiency without sacrifice, fitting to Bishop's company vision. Cutting-edge technology in power management means this frame can operate longer while running more demanding processing algorithms than most. This extreme push to minimize power draw means this frame can be equipped with all sorts of extra equipment: a hologram for a face, flashing status displays and embedded lights solely meant for show. The one thing holding this frame back from perfection is the same common criticism leveled against almost all Bishop products: the shiny chrome and glass meant to put all of this tech on display means it's exposed and fragile. It's because of Bishop's unrelenting pursuit of vanity in their designs that these frames often suffer from issues with reliability and struggle to safely perform the same work as cheaper, more rugged frames." has_limbs = list( - BP_CHEST = list("path" = /obj/item/organ/external/chest/industrial/bishop), - BP_GROIN = list("path" = /obj/item/organ/external/groin/industrial/bishop), - BP_HEAD = list("path" = /obj/item/organ/external/head/industrial/bishop), - BP_L_ARM = list("path" = /obj/item/organ/external/arm/industrial/bishop), - BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/industrial/bishop), - BP_L_LEG = list("path" = /obj/item/organ/external/leg/industrial/bishop), - BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/industrial/bishop), - BP_L_HAND = list("path" = /obj/item/organ/external/hand/industrial/bishop), - BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/industrial/bishop), - BP_L_FOOT = list("path" = /obj/item/organ/external/foot/industrial/bishop), - BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/industrial/bishop) + BP_CHEST = list("path" = /obj/item/organ/external/chest/ipc/industrial/bishop), + BP_GROIN = list("path" = /obj/item/organ/external/groin/ipc/industrial/bishop), + BP_HEAD = list("path" = /obj/item/organ/external/head/ipc/industrial/bishop), + BP_L_ARM = list("path" = /obj/item/organ/external/arm/ipc/industrial/bishop), + BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/ipc/industrial/bishop), + BP_L_LEG = list("path" = /obj/item/organ/external/leg/ipc/industrial/bishop), + BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/ipc/industrial/bishop), + BP_L_HAND = list("path" = /obj/item/organ/external/hand/ipc/industrial/bishop), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/ipc/industrial/bishop), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot/ipc/industrial/bishop), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/ipc/industrial/bishop) ) inherent_verbs = list( @@ -519,17 +519,17 @@ spawn_flags = IS_RESTRICTED has_limbs = list( - BP_CHEST = list("path" = /obj/item/organ/external/chest/unbranded), - BP_GROIN = list("path" = /obj/item/organ/external/groin/unbranded), - BP_HEAD = list("path" = /obj/item/organ/external/head/unbranded), - BP_L_ARM = list("path" = /obj/item/organ/external/arm/unbranded), - BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/unbranded), - BP_L_LEG = list("path" = /obj/item/organ/external/leg/unbranded), - BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/unbranded), - BP_L_HAND = list("path" = /obj/item/organ/external/hand/unbranded), - BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/unbranded), - BP_L_FOOT = list("path" = /obj/item/organ/external/foot/unbranded), - BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/unbranded) + BP_CHEST = list("path" = /obj/item/organ/external/chest/ipc/unbranded), + BP_GROIN = list("path" = /obj/item/organ/external/groin/ipc/unbranded), + BP_HEAD = list("path" = /obj/item/organ/external/head/ipc/unbranded), + BP_L_ARM = list("path" = /obj/item/organ/external/arm/ipc/unbranded), + BP_R_ARM = list("path" = /obj/item/organ/external/arm/right/ipc/unbranded), + BP_L_LEG = list("path" = /obj/item/organ/external/leg/ipc/unbranded), + BP_R_LEG = list("path" = /obj/item/organ/external/leg/right/ipc/unbranded), + BP_L_HAND = list("path" = /obj/item/organ/external/hand/ipc/unbranded), + BP_R_HAND = list("path" = /obj/item/organ/external/hand/right/ipc/unbranded), + BP_L_FOOT = list("path" = /obj/item/organ/external/foot/ipc/unbranded), + BP_R_FOOT = list("path" = /obj/item/organ/external/foot/right/ipc/unbranded) ) inherent_verbs = list( @@ -553,4 +553,4 @@ /datum/species/machine/unbranded/get_light_color(mob/living/carbon/human/H) if (istype(H)) - return rgb(H.r_eyes, H.g_eyes, H.b_eyes) \ No newline at end of file + return rgb(H.r_eyes, H.g_eyes, H.b_eyes) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 817c4246716..f70d9773293 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -24,10 +24,10 @@ var/mob/living/next_point_time = 0 face_atom(A) if(isturf(A)) if(pointing_effect) - clear_point() + QDEL_NULL(pointing_effect) pointing_effect = new /obj/effect/decal/point(A) pointing_effect.invisibility = invisibility - addtimer(CALLBACK(src, .proc/clear_point), 20) + addtimer(CALLBACK(GLOBAL_PROC, /proc/qdel, pointing_effect), 2 SECONDS) else var/pointglow = filter(type = "drop_shadow", x = 0, y = -1, offset = 1, size = 1, color = "#F00") LAZYADD(A.filters, pointglow) @@ -980,4 +980,4 @@ default behaviour is: set hidden = 1 set name = "mov_intent" if(hud_used?.move_intent) - hud_used.move_intent.Click() \ No newline at end of file + hud_used.move_intent.Click() diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index 58a891c8e1a..a5aee4ba6dd 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -315,8 +315,8 @@ open_up() /mob/living/silicon/pai/proc/open_up(var/loud = TRUE) - if(istype(card.loc, /mob/living/bot)) - to_chat(src, SPAN_WARNING("You cannot unfold while inside the bot!")) + if(istype(card.loc, /mob/living/bot) || istype(card.loc, /obj/item/glass_jar)) + to_chat(src, SPAN_WARNING("There is no room to unfold!")) return FALSE //I'm not sure how much of this is necessary, but I would rather avoid issues. @@ -526,4 +526,4 @@ card.setEmotion(pai_emotions[selection]) /obj/item/device/radio/pai - canhear_range = 0 // only people on their tile \ No newline at end of file + canhear_range = 0 // only people on their tile diff --git a/code/modules/mob/living/simple_animal/hostile/syndicate.dm b/code/modules/mob/living/simple_animal/hostile/syndicate.dm index 0ffb9d526ec..45061dc0f86 100644 --- a/code/modules/mob/living/simple_animal/hostile/syndicate.dm +++ b/code/modules/mob/living/simple_animal/hostile/syndicate.dm @@ -135,54 +135,4 @@ speed = 0 /mob/living/simple_animal/hostile/syndicate/ranged/space/Allow_Spacemove(var/check_drift = 0) - return - - - -/mob/living/simple_animal/hostile/viscerator - name = "viscerator" - desc = "A small, twin-bladed machine capable of inflicting very deadly lacerations." - icon = 'icons/mob/npc/aibots.dmi' - icon_state = "viscerator_attack" - icon_living = "viscerator_attack" - pass_flags = PASSTABLE - health = 15 - maxHealth = 15 - melee_damage_lower = 10 - melee_damage_upper = 15 - density = 0 - attacktext = "cut" - attack_sound = 'sound/weapons/bladeslice.ogg' - blood_overlay_icon = null - faction = "syndicate" - min_oxy = 0 - max_oxy = 0 - min_tox = 0 - max_tox = 0 - min_co2 = 0 - max_co2 = 0 - min_n2 = 0 - max_n2 = 0 - minbodytemp = 0 - - tameable = FALSE - - flying = TRUE - attack_emote = "buzzes at" - -/mob/living/simple_animal/hostile/viscerator/death() - ..(null,"is smashed into pieces!") - var/T = get_turf(src) - new /obj/effect/gibspawner/robot(T) - spark(T, 3, alldirs) - qdel(src) - -/mob/living/simple_animal/hostile/viscerator/proc/wakeup() - stance = HOSTILE_STANCE_IDLE - -/mob/living/simple_animal/hostile/viscerator/emp_act(severity) - LoseTarget() - stance = HOSTILE_STANCE_TIRED - addtimer(CALLBACK(src, .proc/wakeup), 150) - if(severity == 1.0) - apply_damage(5) + return \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/hostile/viscerator.dm b/code/modules/mob/living/simple_animal/hostile/viscerator.dm new file mode 100644 index 00000000000..84e95860e00 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/viscerator.dm @@ -0,0 +1,56 @@ +/mob/living/simple_animal/hostile/viscerator + name = "viscerator" + desc = "A small, twin-bladed machine capable of inflicting very deadly lacerations." + icon = 'icons/mob/npc/aibots.dmi' + icon_state = "viscerator_attack" + icon_living = "viscerator_attack" + pass_flags = PASSTABLE + health = 15 + maxHealth = 15 + melee_damage_lower = 10 + melee_damage_upper = 15 + density = 0 + attacktext = "cut" + attack_sound = 'sound/weapons/bladeslice.ogg' + blood_overlay_icon = null + faction = "syndicate" + min_oxy = 0 + max_oxy = 0 + min_tox = 0 + max_tox = 0 + min_co2 = 0 + max_co2 = 0 + min_n2 = 0 + max_n2 = 0 + minbodytemp = 0 + + tameable = FALSE + + flying = TRUE + attack_emote = "buzzes at" + +/mob/living/simple_animal/hostile/viscerator/death() + ..(null,"is smashed into pieces!") + var/T = get_turf(src) + new /obj/effect/gibspawner/robot(T) + spark(T, 3, alldirs) + qdel(src) + +/mob/living/simple_animal/hostile/viscerator/proc/wakeup() + stance = HOSTILE_STANCE_IDLE + +/mob/living/simple_animal/hostile/viscerator/emp_act(severity) + LoseTarget() + stance = HOSTILE_STANCE_TIRED + addtimer(CALLBACK(src, .proc/wakeup), 150) + if(severity == 1.0) + apply_damage(5) + +/mob/living/simple_animal/hostile/viscerator/lube/Initialize() + . = ..() + create_reagents(30) + reagents.add_reagent(/datum/reagent/lube, 30) + +/mob/living/simple_animal/hostile/viscerator/lube/death() + reagents.splash(get_turf(src), 30) + ..() \ No newline at end of file diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index c39a8d7d44a..161d32b00f2 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -341,14 +341,10 @@ pointing_effect = new /obj/effect/decal/point(tile) pointing_effect.invisibility = invisibility - addtimer(CALLBACK(src, .proc/clear_point), 20) + addtimer(CALLBACK(GLOBAL_PROC, /proc/qdel, pointing_effect), 2 SECONDS) face_atom(A) return 1 - -/mob/proc/clear_point() - QDEL_NULL(pointing_effect) - /datum/mobl // I have no idea what the fuck this is, but it's better for it to be a datum than an /obj/effect. var/list/container = list() var/master @@ -758,6 +754,10 @@ to_chat(src, "It won't budge!") return + if(length(M.grabbed_by)) + to_chat(src, SPAN_WARNING("You can't pull someone being held in a grab!")) + return + // If your size is larger than theirs and you have some // kind of mob pull value AT ALL, you will be able to pull // them, so don't bother checking that explicitly. @@ -1444,4 +1444,4 @@ if(!check_has_body_select()) return var/obj/screen/zone_sel/selector = mob.zone_sel - selector.set_selected_zone(next_in_list(mob.zone_sel.selecting,zones)) \ No newline at end of file + selector.set_selected_zone(next_in_list(mob.zone_sel.selecting,zones)) diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index 830da5fa297..91a35c3e72b 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -84,7 +84,7 @@ if(affecting.buckled) return null if(state >= GRAB_AGGRESSIVE) - animate(affecting, pixel_x = 0, pixel_y = 0, 4, 1) + animate(affecting, pixel_x = affecting.get_standard_pixel_x(), pixel_y = affecting.get_standard_pixel_y(), 4, 1) return affecting return null @@ -204,10 +204,10 @@ if(!affecting) return if(affecting.buckled) - animate(affecting, pixel_x = 0, pixel_y = 0, 4, 1, LINEAR_EASING) + animate(affecting, pixel_x = affecting.get_standard_pixel_x(), pixel_y = affecting.get_standard_pixel_y(), 4, 1, LINEAR_EASING) return if(affecting.lying && state != GRAB_KILL) - animate(affecting, pixel_x = 0, pixel_y = 0, 5, 1, LINEAR_EASING) + animate(affecting, pixel_x = affecting.get_standard_pixel_x(), pixel_y = affecting.get_standard_pixel_y(), 5, 1, LINEAR_EASING) if(force_down) affecting.set_dir(SOUTH) //face up return @@ -235,14 +235,14 @@ switch(adir) if(NORTH) - animate(affecting, pixel_x = 0, pixel_y =-shift, 5, 1, LINEAR_EASING) + animate(affecting, pixel_x = affecting.get_standard_pixel_x(), pixel_y =-shift, 5, 1, LINEAR_EASING) affecting.layer = 3.9 if(SOUTH) - animate(affecting, pixel_x = 0, pixel_y = shift, 5, 1, LINEAR_EASING) + animate(affecting, pixel_x = affecting.get_standard_pixel_x(), pixel_y = shift, 5, 1, LINEAR_EASING) if(WEST) - animate(affecting, pixel_x = shift, pixel_y = 0, 5, 1, LINEAR_EASING) + animate(affecting, pixel_x = shift, pixel_y = affecting.get_standard_pixel_y(), 5, 1, LINEAR_EASING) if(EAST) - animate(affecting, pixel_x =-shift, pixel_y = 0, 5, 1, LINEAR_EASING) + animate(affecting, pixel_x =-shift, pixel_y = affecting.get_standard_pixel_y(), 5, 1, LINEAR_EASING) /obj/item/grab/proc/s_click(obj/screen/S) if(!affecting) @@ -398,7 +398,7 @@ var/destroying = 0 /obj/item/grab/Destroy() - animate(affecting, pixel_x = 0, pixel_y = 0, 4, 1, LINEAR_EASING) + animate(affecting, pixel_x = affecting.get_standard_pixel_x(), pixel_y = affecting.get_standard_pixel_y(), 4, 1, LINEAR_EASING) affecting.layer = 4 if(affecting) ADD_FALLING_ATOM(affecting) // Makes the grabbee check if they can fall. diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 995834031a6..30183ffe47e 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -898,9 +898,9 @@ proc/is_blind(A) preposition = "inside" if (justmoved) - reportto.contained_visible_message(H, "[H] [action3] [reportto] [preposition] their [newlocation]", "You are [action] [preposition] [H]'s [newlocation]", "", 1) + reportto.contained_visible_message(H, SPAN_NOTICE("[H] [action3] [reportto] [preposition] their [newlocation]."), SPAN_NOTICE("You are [action] [preposition] [H]'s [newlocation]."), "", 1) else - to_chat(reportto, "You are [action] [preposition] [H]'s [newlocation]") + to_chat(reportto, SPAN_NOTICE("You are [action] [preposition] [H]'s [newlocation].")) /atom/proc/get_holding_mob() //This function will return the mob which is holding this holder, or null if it's not held @@ -1196,3 +1196,9 @@ proc/is_blind(A) /mob/assign_player(var/mob/user) ckey = user.ckey return src + +/mob/proc/get_standard_pixel_x() + return initial(pixel_x) + +/mob/proc/get_standard_pixel_y() + return initial(pixel_y) \ No newline at end of file diff --git a/code/modules/modular_computers/computers/modular_computer/ui.dm b/code/modules/modular_computers/computers/modular_computer/ui.dm index c7a9dade416..dd7eac77008 100644 --- a/code/modules/modular_computers/computers/modular_computer/ui.dm +++ b/code/modules/modular_computers/computers/modular_computer/ui.dm @@ -153,6 +153,8 @@ else VUEUI_SET_CHECK(data["apclinkicon"], "", ., data) + data["flashlight"] = flashlight?.enabled ? TRUE : FALSE + switch(get_ntnet_status()) if(0) VUEUI_SET_CHECK(data["ntneticon"], "sig_none.gif", ., data) @@ -175,4 +177,4 @@ continue VUEUI_SET_CHECK(data["programheaders"][P.filename], P.ui_header, ., data) - VUEUI_SET_CHECK(data["showexitprogram"], !!active_program, ., data) // Hides "Exit Program" button on mainscreen \ No newline at end of file + VUEUI_SET_CHECK(data["showexitprogram"], !!active_program, ., data) // Hides "Exit Program" button on mainscreen diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 280d52bcef8..bab9b92b1f7 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -998,16 +998,17 @@ Note that amputating the affected organ does in fact remove the infection from t return //ORGAN_BROKEN doesn't have the same meaning for robot limbs if((status & ORGAN_BROKEN) || !(limb_flags & ORGAN_CAN_BREAK)) return + if(QDELETED(owner)) + return - if(owner) - var/message = pick("broke in half", "shattered") - owner.visible_message(\ - "You hear a loud cracking sound coming from \the [owner]!",\ - "Something feels like it [message] in your [name]!",\ - "You hear a sickening crack!") - if(owner.species && owner.can_feel_pain()) - owner.emote("scream") - owner.flash_strong_pain() + var/message = pick("broke in half", "shattered") + owner.visible_message(\ + "You hear a loud cracking sound coming from \the [owner]!",\ + "Something feels like it [message] in your [name]!",\ + "You hear a sickening crack!") + if(owner.species && owner.can_feel_pain()) + owner.emote("scream") + owner.flash_strong_pain() playsound(src.loc, /decl/sound_category/fracture_sound, 100, 1, -2) status |= ORGAN_BROKEN @@ -1020,7 +1021,6 @@ Note that amputating the affected organ does in fact remove the infection from t // This is mostly for the ninja suit to stop ninja being so crippled by breaks. check_rigsplints() - return /obj/item/organ/external/proc/mend_fracture() if(status & ORGAN_ROBOT) @@ -1133,7 +1133,7 @@ Note that amputating the affected organ does in fact remove the infection from t var/is_robotic = status & ORGAN_ROBOT var/mob/living/carbon/human/victim = owner - ..() + ..(null, user) victim.bad_external_organs -= src diff --git a/code/modules/organs/subtypes/industrial.dm b/code/modules/organs/subtypes/industrial.dm index f5702041d30..4e7a868a981 100644 --- a/code/modules/organs/subtypes/industrial.dm +++ b/code/modules/organs/subtypes/industrial.dm @@ -1,141 +1,141 @@ // Heads -/obj/item/organ/external/head/industrial/hephaestus +/obj/item/organ/external/head/ipc/industrial/hephaestus robotize_type = PROSTHETIC_HI -/obj/item/organ/external/head/industrial/xion +/obj/item/organ/external/head/ipc/industrial/xion robotize_type = PROSTHETIC_XMG -/obj/item/organ/external/head/industrial/zenghu +/obj/item/organ/external/head/ipc/industrial/zenghu robotize_type = PROSTHETIC_ZH -/obj/item/organ/external/head/industrial/bishop +/obj/item/organ/external/head/ipc/industrial/bishop robotize_type = PROSTHETIC_BC // Chest -/obj/item/organ/external/chest/industrial/hephaestus +/obj/item/organ/external/chest/ipc/industrial/hephaestus robotize_type = PROSTHETIC_HI -/obj/item/organ/external/chest/industrial/xion +/obj/item/organ/external/chest/ipc/industrial/xion robotize_type = PROSTHETIC_XMG -/obj/item/organ/external/chest/industrial/zenghu +/obj/item/organ/external/chest/ipc/industrial/zenghu robotize_type = PROSTHETIC_ZH -/obj/item/organ/external/chest/industrial/bishop +/obj/item/organ/external/chest/ipc/industrial/bishop robotize_type = PROSTHETIC_BC // Groin -/obj/item/organ/external/groin/industrial/hephaestus +/obj/item/organ/external/groin/ipc/industrial/hephaestus robotize_type = PROSTHETIC_HI -/obj/item/organ/external/groin/industrial/xion +/obj/item/organ/external/groin/ipc/industrial/xion robotize_type = PROSTHETIC_XMG -/obj/item/organ/external/groin/industrial/zenghu +/obj/item/organ/external/groin/ipc/industrial/zenghu robotize_type = PROSTHETIC_ZH -/obj/item/organ/external/groin/industrial/bishop +/obj/item/organ/external/groin/ipc/industrial/bishop robotize_type = PROSTHETIC_BC // Left Arm -/obj/item/organ/external/arm/industrial/hephaestus +/obj/item/organ/external/arm/ipc/industrial/hephaestus robotize_type = PROSTHETIC_HI -/obj/item/organ/external/arm/industrial/xion +/obj/item/organ/external/arm/ipc/industrial/xion robotize_type = PROSTHETIC_XMG -/obj/item/organ/external/arm/industrial/zenghu +/obj/item/organ/external/arm/ipc/industrial/zenghu robotize_type = PROSTHETIC_ZH -/obj/item/organ/external/arm/industrial/bishop +/obj/item/organ/external/arm/ipc/industrial/bishop robotize_type = PROSTHETIC_BC // Right Arm -/obj/item/organ/external/arm/right/industrial/hephaestus +/obj/item/organ/external/arm/right/ipc/industrial/hephaestus robotize_type = PROSTHETIC_HI -/obj/item/organ/external/arm/right/industrial/xion +/obj/item/organ/external/arm/right/ipc/industrial/xion robotize_type = PROSTHETIC_XMG -/obj/item/organ/external/arm/right/industrial/zenghu +/obj/item/organ/external/arm/right/ipc/industrial/zenghu robotize_type = PROSTHETIC_ZH -/obj/item/organ/external/arm/right/industrial/bishop +/obj/item/organ/external/arm/right/ipc/industrial/bishop robotize_type = PROSTHETIC_BC // Left Leg -/obj/item/organ/external/leg/industrial/hephaestus +/obj/item/organ/external/leg/ipc/industrial/hephaestus robotize_type = PROSTHETIC_HI -/obj/item/organ/external/leg/industrial/xion +/obj/item/organ/external/leg/ipc/industrial/xion robotize_type = PROSTHETIC_XMG -/obj/item/organ/external/leg/industrial/zenghu +/obj/item/organ/external/leg/ipc/industrial/zenghu robotize_type = PROSTHETIC_ZH -/obj/item/organ/external/leg/industrial/bishop +/obj/item/organ/external/leg/ipc/industrial/bishop robotize_type = PROSTHETIC_BC // Right Leg -/obj/item/organ/external/leg/right/industrial/hephaestus +/obj/item/organ/external/leg/right/ipc/industrial/hephaestus robotize_type = PROSTHETIC_HI -/obj/item/organ/external/leg/right/industrial/xion +/obj/item/organ/external/leg/right/ipc/industrial/xion robotize_type = PROSTHETIC_XMG -/obj/item/organ/external/leg/right/industrial/zenghu +/obj/item/organ/external/leg/right/ipc/industrial/zenghu robotize_type = PROSTHETIC_ZH -/obj/item/organ/external/leg/right/industrial/bishop +/obj/item/organ/external/leg/right/ipc/industrial/bishop robotize_type = PROSTHETIC_BC // Left foot -/obj/item/organ/external/foot/industrial/hephaestus +/obj/item/organ/external/foot/ipc/industrial/hephaestus robotize_type = PROSTHETIC_HI -/obj/item/organ/external/foot/industrial/xion +/obj/item/organ/external/foot/ipc/industrial/xion robotize_type = PROSTHETIC_XMG -/obj/item/organ/external/foot/industrial/zenghu +/obj/item/organ/external/foot/ipc/industrial/zenghu robotize_type = PROSTHETIC_ZH -/obj/item/organ/external/foot/industrial/bishop +/obj/item/organ/external/foot/ipc/industrial/bishop robotize_type = PROSTHETIC_BC // Right foot -/obj/item/organ/external/foot/right/industrial/hephaestus +/obj/item/organ/external/foot/right/ipc/industrial/hephaestus robotize_type = PROSTHETIC_HI -/obj/item/organ/external/foot/right/industrial/xion +/obj/item/organ/external/foot/right/ipc/industrial/xion robotize_type = PROSTHETIC_XMG -/obj/item/organ/external/foot/right/industrial/zenghu +/obj/item/organ/external/foot/right/ipc/industrial/zenghu robotize_type = PROSTHETIC_ZH -/obj/item/organ/external/foot/right/industrial/bishop +/obj/item/organ/external/foot/right/ipc/industrial/bishop robotize_type = PROSTHETIC_BC -/obj/item/organ/external/hand/industrial/hephaestus +/obj/item/organ/external/hand/ipc/industrial/hephaestus robotize_type = PROSTHETIC_HI -/obj/item/organ/external/hand/industrial/xion +/obj/item/organ/external/hand/ipc/industrial/xion robotize_type = PROSTHETIC_XMG -/obj/item/organ/external/hand/industrial/zenghu +/obj/item/organ/external/hand/ipc/industrial/zenghu robotize_type = PROSTHETIC_ZH -/obj/item/organ/external/hand/industrial/bishop +/obj/item/organ/external/hand/ipc/industrial/bishop robotize_type = PROSTHETIC_BC // Right hand -/obj/item/organ/external/hand/right/industrial/hephaestus +/obj/item/organ/external/hand/right/ipc/industrial/hephaestus robotize_type = PROSTHETIC_HI -/obj/item/organ/external/hand/right/industrial/xion +/obj/item/organ/external/hand/right/ipc/industrial/xion robotize_type = PROSTHETIC_XMG -/obj/item/organ/external/hand/right/industrial/zenghu +/obj/item/organ/external/hand/right/ipc/industrial/zenghu robotize_type = PROSTHETIC_ZH -/obj/item/organ/external/hand/right/industrial/bishop +/obj/item/organ/external/hand/right/ipc/industrial/bishop robotize_type = PROSTHETIC_BC diff --git a/code/modules/organs/subtypes/machine.dm b/code/modules/organs/subtypes/machine.dm index 448108994a6..2ffe9981511 100644 --- a/code/modules/organs/subtypes/machine.dm +++ b/code/modules/organs/subtypes/machine.dm @@ -380,58 +380,58 @@ //Industrial// ////////////// -/obj/item/organ/external/head/industrial +/obj/item/organ/external/head/ipc/industrial dislocated = -1 can_intake_reagents = 0 encased = "support frame" robotize_type = PROSTHETIC_IND -/obj/item/organ/external/chest/industrial +/obj/item/organ/external/chest/ipc/industrial dislocated = -1 encased = "support frame" robotize_type = PROSTHETIC_IND -/obj/item/organ/external/groin/industrial +/obj/item/organ/external/groin/ipc/industrial dislocated = -1 encased = "support frame" robotize_type = PROSTHETIC_IND -/obj/item/organ/external/arm/industrial +/obj/item/organ/external/arm/ipc/industrial dislocated = -1 encased = "support frame" robotize_type = PROSTHETIC_IND -/obj/item/organ/external/arm/right/industrial +/obj/item/organ/external/arm/right/ipc/industrial dislocated = -1 encased = "support frame" robotize_type = PROSTHETIC_IND -/obj/item/organ/external/leg/industrial +/obj/item/organ/external/leg/ipc/industrial dislocated = -1 encased = "support frame" robotize_type = PROSTHETIC_IND -/obj/item/organ/external/leg/right/industrial +/obj/item/organ/external/leg/right/ipc/industrial dislocated = -1 encased = "support frame" robotize_type = PROSTHETIC_IND -/obj/item/organ/external/foot/industrial +/obj/item/organ/external/foot/ipc/industrial dislocated = -1 encased = "support frame" robotize_type = PROSTHETIC_IND -/obj/item/organ/external/foot/right/industrial +/obj/item/organ/external/foot/right/ipc/industrial dislocated = -1 encased = "support frame" robotize_type = PROSTHETIC_IND -/obj/item/organ/external/hand/industrial +/obj/item/organ/external/hand/ipc/industrial dislocated = -1 encased = "support frame" robotize_type = PROSTHETIC_IND -/obj/item/organ/external/hand/right/industrial +/obj/item/organ/external/hand/right/ipc/industrial dislocated = -1 encased = "support frame" robotize_type = PROSTHETIC_IND @@ -440,68 +440,68 @@ //Shell limbs// /////////////// -/obj/item/organ/external/head/shell +/obj/item/organ/external/head/ipc/shell dislocated = -1 can_intake_reagents = 0 encased = "support frame" force_skintone = TRUE robotize_type = PROSTHETIC_SYNTHSKIN -/obj/item/organ/external/chest/shell +/obj/item/organ/external/chest/ipc/shell dislocated = -1 encased = "support frame" force_skintone = TRUE robotize_type = PROSTHETIC_SYNTHSKIN -/obj/item/organ/external/groin/shell +/obj/item/organ/external/groin/ipc/shell dislocated = -1 encased = "support frame" force_skintone = TRUE robotize_type = PROSTHETIC_SYNTHSKIN -/obj/item/organ/external/arm/shell +/obj/item/organ/external/arm/ipc/shell dislocated = -1 encased = "support frame" force_skintone = TRUE robotize_type = PROSTHETIC_SYNTHSKIN -/obj/item/organ/external/arm/right/shell +/obj/item/organ/external/arm/right/ipc/shell dislocated = -1 encased = "support frame" force_skintone = TRUE robotize_type = PROSTHETIC_SYNTHSKIN -/obj/item/organ/external/leg/shell +/obj/item/organ/external/leg/ipc/shell dislocated = -1 encased = "support frame" force_skintone = TRUE robotize_type = PROSTHETIC_SYNTHSKIN -/obj/item/organ/external/leg/right/shell +/obj/item/organ/external/leg/right/ipc/shell dislocated = -1 encased = "support frame" force_skintone = TRUE robotize_type = PROSTHETIC_SYNTHSKIN -/obj/item/organ/external/foot/shell +/obj/item/organ/external/foot/ipc/shell dislocated = -1 encased = "support frame" force_skintone = TRUE robotize_type = PROSTHETIC_SYNTHSKIN -/obj/item/organ/external/foot/right/shell +/obj/item/organ/external/foot/right/ipc/shell dislocated = -1 encased = "support frame" force_skintone = TRUE robotize_type = PROSTHETIC_SYNTHSKIN -/obj/item/organ/external/hand/shell +/obj/item/organ/external/hand/ipc/shell dislocated = -1 encased = "support frame" force_skintone = TRUE robotize_type = PROSTHETIC_SYNTHSKIN -/obj/item/organ/external/hand/right/shell +/obj/item/organ/external/hand/right/ipc/shell dislocated = -1 encased = "support frame" force_skintone = TRUE @@ -509,58 +509,58 @@ //unbranded -/obj/item/organ/external/head/unbranded +/obj/item/organ/external/head/ipc/unbranded dislocated = -1 can_intake_reagents = 0 encased = "support frame" robotize_type = "Unbranded" -/obj/item/organ/external/chest/unbranded +/obj/item/organ/external/chest/ipc/unbranded dislocated = -1 encased = "support frame" robotize_type = "Unbranded" -/obj/item/organ/external/groin/unbranded +/obj/item/organ/external/groin/ipc/unbranded dislocated = -1 encased = "support frame" robotize_type = "Unbranded" -/obj/item/organ/external/arm/unbranded +/obj/item/organ/external/arm/ipc/unbranded dislocated = -1 encased = "support frame" robotize_type = "Unbranded" -/obj/item/organ/external/arm/right/unbranded +/obj/item/organ/external/arm/right/ipc/unbranded dislocated = -1 encased = "support frame" robotize_type = "Unbranded" -/obj/item/organ/external/leg/unbranded +/obj/item/organ/external/leg/ipc/unbranded dislocated = -1 encased = "support frame" robotize_type = "Unbranded" -/obj/item/organ/external/leg/right/unbranded +/obj/item/organ/external/leg/right/ipc/unbranded dislocated = -1 encased = "support frame" robotize_type = "Unbranded" -/obj/item/organ/external/foot/unbranded +/obj/item/organ/external/foot/ipc/unbranded dislocated = -1 encased = "support frame" robotize_type = "Unbranded" -/obj/item/organ/external/foot/right/unbranded +/obj/item/organ/external/foot/right/ipc/unbranded dislocated = -1 encased = "support frame" robotize_type = "Unbranded" -/obj/item/organ/external/hand/unbranded +/obj/item/organ/external/hand/ipc/unbranded dislocated = -1 encased = "support frame" robotize_type = "Unbranded" -/obj/item/organ/external/hand/right/unbranded +/obj/item/organ/external/hand/right/ipc/unbranded dislocated = -1 encased = "support frame" - robotize_type = "Unbranded" \ No newline at end of file + robotize_type = "Unbranded" diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 6ea14f299cd..7873c92b6d7 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -139,6 +139,10 @@ C.forceMove(src) stored_ammo.Insert(1, C) //add to the head of the list update_icon() + else if(istype(W, /obj/item/gun) && ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.check_weapon_affinity(W)) // if we have gun-kata, we can reload by attacking a magazine + W.attackby(src, user) /obj/item/ammo_magazine/attack_self(mob/user) if(!stored_ammo.len) diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 5740aea26aa..9c253381af9 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -509,7 +509,9 @@ //As opposed to no-delay pew pew P.accuracy += 2 - var/datum/firemode/F = firemodes[sel_mode] + var/datum/firemode/F + if(length(firemodes)) + F = firemodes[sel_mode] if(one_hand_fa_penalty > 2 && !wielded && F?.name == "full auto") // todo: make firemode names defines P.accuracy -= one_hand_fa_penalty/2 P.dispersion -= one_hand_fa_penalty * 0.5 diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index 24ae3031592..3c0796c652b 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -66,11 +66,15 @@ return chambered.BB return null -/obj/item/gun/projectile/handle_post_fire() +/obj/item/gun/projectile/handle_post_fire(mob/user) ..() if(chambered) chambered.expend() process_chambered() + if(ammo_magazine && !length(ammo_magazine.stored_ammo) && ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.check_weapon_affinity(src)) + unload_ammo(user, TRUE, TRUE) update_maptext() /obj/item/gun/projectile/handle_click_empty() @@ -173,9 +177,12 @@ update_icon() //attempts to unload src. If allow_dump is set to 0, the speedloader unloading method will be disabled -/obj/item/gun/projectile/proc/unload_ammo(mob/user, var/allow_dump = 1) +/obj/item/gun/projectile/proc/unload_ammo(mob/user, var/allow_dump = 1, var/drop_mag = FALSE) if(ammo_magazine) - user.put_in_hands(ammo_magazine) + if(drop_mag) + ammo_magazine.forceMove(user.loc) + else + user.put_in_hands(ammo_magazine) user.visible_message("[user] removes [ammo_magazine] from [src].", "You remove [ammo_magazine] from [src].") playsound(src.loc, ammo_magazine.eject_sound, 50, FALSE) ammo_magazine.update_icon() diff --git a/code/modules/projectiles/projectile/change.dm b/code/modules/projectiles/projectile/change.dm index 8c1830282cb..8006a41a2bd 100644 --- a/code/modules/projectiles/projectile/change.dm +++ b/code/modules/projectiles/projectile/change.dm @@ -77,8 +77,6 @@ INVOKE_ASYNC(H, /mob/living/carbon/human.proc/set_species, randomize) H.universal_speak = 1 - var/datum/preferences/A = new() //Randomize appearance for the human - A.randomize_appearance_for(H) if(new_mob) for (var/spell/S in M.spell_list) diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index 440079499af..41b15dcc686 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -52,7 +52,7 @@ if (victim.head.body_parts_covered & EYES) safe_thing = victim.head if(victim.glasses) - if (!safe_thing) + if (!safe_thing && (victim.glasses.body_parts_covered & EYES)) safe_thing = victim.glasses if(safe_thing) diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index aef46d0737a..f9a364d97b3 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -281,7 +281,9 @@ If you add a drink with no empty icon sprite, ensure it is flagged as NO_EMPTY_I /obj/item/reagent_containers/food/drinks/waterbottle name = "bottled water" - desc = "Introduced to the vending machines by Skrellian request, this water comes straight from the Martian poles." + desc = "A fresh bottle of water from the finest bottling plants on Silversun." + desc_fluff = "Previously introduced to the vending machines by Skrellian request, this water used to come straight from the Martian poles. Ever since the Martian catastrophe, however, an Idris subsidiary has since stepped in to fill the gap in the market \ + and 'Martian Water' has become a prized collector's item." icon_state = "waterbottle" flags = 0 //starts closed center_of_mass = list("x"=16, "y"=8) diff --git a/code/modules/research/designs/mechfab/prosthetics/external.dm b/code/modules/research/designs/mechfab/prosthetics/external.dm index 144a548d69f..277b611c5d3 100644 --- a/code/modules/research/designs/mechfab/prosthetics/external.dm +++ b/code/modules/research/designs/mechfab/prosthetics/external.dm @@ -16,48 +16,48 @@ /datum/design/item/mechfab/prosthetic/l_arm name = "Prosthetic Left Arm" - build_path = /obj/item/organ/external/arm/industrial + build_path = /obj/item/organ/external/arm/ipc time = 20 materials = list(DEFAULT_WALL_MATERIAL = 18000) /datum/design/item/mechfab/prosthetic/r_arm name = "Prosthetic Right Arm" - build_path = /obj/item/organ/external/arm/right/industrial + build_path = /obj/item/organ/external/arm/right/ipc time = 20 materials = list(DEFAULT_WALL_MATERIAL = 18000) /datum/design/item/mechfab/prosthetic/l_leg name = "Prosthetic Left Leg" - build_path = /obj/item/organ/external/leg/industrial + build_path = /obj/item/organ/external/leg/ipc time = 20 materials = list(DEFAULT_WALL_MATERIAL = 15000) /datum/design/item/mechfab/prosthetic/r_leg name = "Prosthetic Right Leg" - build_path = /obj/item/organ/external/leg/right/industrial + build_path = /obj/item/organ/external/leg/right/ipc time = 20 materials = list(DEFAULT_WALL_MATERIAL = 15000) /datum/design/item/mechfab/prosthetic/l_hand name = "Prosthetic Left Hand" - build_path = /obj/item/organ/external/hand/industrial + build_path = /obj/item/organ/external/hand/ipc time = 20 materials = list(DEFAULT_WALL_MATERIAL = 8000) /datum/design/item/mechfab/prosthetic/r_hand name = "Prosthetic Right Hand" - build_path = /obj/item/organ/external/hand/right/industrial + build_path = /obj/item/organ/external/hand/right/ipc time = 20 materials = list(DEFAULT_WALL_MATERIAL = 8000) /datum/design/item/mechfab/prosthetic/l_foot name = "Prosthetic Left Foot" - build_path = /obj/item/organ/external/foot/industrial + build_path = /obj/item/organ/external/foot/ipc time = 20 materials = list(DEFAULT_WALL_MATERIAL = 8000) /datum/design/item/mechfab/prosthetic/r_foot name = "Prosthetic Right Foot" - build_path = /obj/item/organ/external/foot/right/industrial + build_path = /obj/item/organ/external/foot/right/ipc time = 20 - materials = list(DEFAULT_WALL_MATERIAL = 8000) \ No newline at end of file + materials = list(DEFAULT_WALL_MATERIAL = 8000) diff --git a/code/modules/shieldgen/energy_field.dm b/code/modules/shieldgen/energy_field.dm index 10b82fe0921..377419399fb 100644 --- a/code/modules/shieldgen/energy_field.dm +++ b/code/modules/shieldgen/energy_field.dm @@ -3,26 +3,37 @@ /obj/effect/energy_field name = "energy field" - desc = "Impenetrable field of energy, capable of blocking anything as long as it's active." + desc = "A strong field of energy, capable of blocking movement as long as it's active." icon = 'icons/obj/machines/shielding.dmi' icon_state = "shieldsparkles" + alpha = 0 + mouse_opacity = 0 anchored = 1 layer = 4.1 //just above mobs density = 0 - invisibility = 101 var/strength = 0 var/ticks_recovering = 10 + var/is_strong = FALSE // if strength goes is 1 or above, this is set to TRUE, this is to prevent flickering and animate being called constantly + atmos_canpass = CANPASS_ALWAYS -/obj/effect/energy_field/New() - ..() +/obj/effect/energy_field/Initialize() + . = ..() update_nearby_tiles() /obj/effect/energy_field/Destroy() update_nearby_tiles() return ..() +/obj/effect/energy_field/attackby(obj/item/I, mob/user) + user.do_attack_animation(src, I) + if(I.force < 10) + user.visible_message(SPAN_WARNING("[user] harmlessly attacks \the [src] with \the [I]."), SPAN_WARNING("You attack \the [src] with \the [I], but it bounces off without doing any damage.")) + else + user.visible_message(SPAN_WARNING("[user] attacks \the [src] with \the [I]."), SPAN_WARNING("You attack \the [src] with \the [I].")) + Stress(I.force / 10) + /obj/effect/energy_field/ex_act(var/severity) Stress(0.5 + severity) @@ -34,14 +45,20 @@ //if we take too much damage, drop out - the generator will bring us back up if we have enough power ticks_recovering = min(ticks_recovering + 2, 10) - if(strength < 1) - invisibility = 101 - density = 0 + if(strength < 1 && is_strong) + alpha = 255 + density = FALSE + mouse_opacity = 0 + animate(src, 2 SECONDS, alpha = 0) + is_strong = FALSE ticks_recovering = 10 strength = 0 - else if(strength >= 1) - invisibility = 0 - density = 1 + else if(strength >= 1 && !is_strong) + alpha = 0 + mouse_opacity = 1 + density = TRUE + animate(src, 2 SECONDS, alpha = 255) + is_strong = TRUE /obj/effect/energy_field/proc/Strengthen(var/severity) strength += severity @@ -50,12 +67,18 @@ //if we take too much damage, drop out - the generator will bring us back up if we have enough power var/old_density = density - if(strength >= 1) - invisibility = 0 - density = 1 - else if(strength < 1) - invisibility = 101 - density = 0 + if(strength >= 1 && !is_strong) + alpha = 0 + mouse_opacity = 1 + density = TRUE + animate(src, 2 SECONDS, alpha = 255) + is_strong = TRUE + else if(strength < 1 && is_strong) + alpha = 255 + density = FALSE + mouse_opacity = 0 + animate(src, 2 SECONDS, alpha = 0) + is_strong = FALSE if (density != old_density) update_nearby_tiles() diff --git a/code/modules/tables/interactions.dm b/code/modules/tables/interactions.dm index fedda714ac0..9607c1da3e3 100644 --- a/code/modules/tables/interactions.dm +++ b/code/modules/tables/interactions.dm @@ -8,6 +8,8 @@ return !density else return 1 + if(istype(mover, /obj/structure/closet/crate)) + return TRUE if(istype(mover) && mover.checkpass(PASSTABLE)) return 1 if(locate(/obj/structure/table) in get_turf(mover)) diff --git a/code/modules/vueui/ui.dm b/code/modules/vueui/ui.dm index 6d981c97ba0..6f54f7f1be0 100644 --- a/code/modules/vueui/ui.dm +++ b/code/modules/vueui/ui.dm @@ -86,7 +86,7 @@ main ui datum. SSvueui.ui_opened(src) // this starts processing and adds the UI to the mob and whatnot - var/params = "window=[windowid];file=[windowid];" + var/params = "window=[windowid];file=[windowid];titlebar=0;can_resize=0;" if(width && height) params += "size=[width]x[height];" send_resources_and_assets(user.client, load_asset) @@ -127,23 +127,23 @@ main ui datum. * @return html code - text */ /datum/vueui/proc/generate_html(var/css_tag) -#ifdef UIDEBUG - var/debugtxt = "
" -#else var/debugtxt = "" -#endif + if(user && check_rights(R_DEV, FALSE, user=user)) + debugtxt = "
" return {" - - - + + + + [css_tag]
Javascript file has failed to load. Click here to force load resources @@ -160,6 +160,9 @@ main ui datum. + "} @@ -178,6 +181,8 @@ main ui datum. sdata["status"] = status sdata["title"] = title sdata["wtime"] = world.time + sdata["debug"] = user && check_rights(R_DEV, FALSE, user=user) + sdata["roundstart_hour"] = roundstart_hour for(var/asset_name in assets) var/asset = assets[asset_name] sdata["assets"][asset_name] = list("ref" = ckey("\ref[asset["img"]]")) @@ -380,10 +385,10 @@ main ui datum. * @return themes class - text */ /datum/vueui/proc/get_theme_class() - return SStheming.get_html_theme_class(user) + return "vueui " + SStheming.get_html_theme_class(user) /datum/vueui/modularcomputer header = "modular-computer" /datum/vueui/modularcomputer/get_theme_class() - return "theme-nano dark-theme" + return "vueui theme-nano dark-theme" diff --git a/config/example/tips.txt b/config/example/tips.txt index a8dc2003b71..3d2d072ce6e 100644 --- a/config/example/tips.txt +++ b/config/example/tips.txt @@ -15,7 +15,7 @@ You can move an item out of the way by dragging it and then clicking on an adjac Maintenance is full of equipment that is randomized every round. Look around and see if anything is worth using. There are many places around the station to hide contraband. A few for starters: linen boxes, toilet cisterns, body bags. Experiment to find more! As the Captain, you are one of the highest priority targets on the station. Everything from revolutions, to mercenaries, to traitors that need to rob you of your antique laser gun or your life are things to worry about. As the Captain, you have absolute access and control over the station, but this does not mean that being a horrible person won't result in mutiny and a ban. -As the Chief Medical Officer, coordinate and communicate with your doctors, chemists, and EMTs during a pirate raid, blob infestation, or some other crisis to keep people alive and fighting. +As the Chief Medical Officer, coordinate and communicate with your doctors, chemists, and first responders during a pirate raid, blob infestation, or some other crisis to keep people alive and fighting. As a Physician, you can attempt to draw blood from a husk with a syringe to determine the cause. If you can extract blood, it was caused by extreme temperatures or lasers, if there is no blood to extract, it was caused by something unnatural. As a Physician, you can surgically implant or extract things from people's chests. This can range from putting in a bomb to pulling out an alien larva. As a Physician, remember to target the correct limb and be on help intent when trying to perform surgery on someone. diff --git a/html/changelog.html b/html/changelog.html index 6ef481a9383..76c39cd7e61 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -35,6 +35,140 @@ -->
+

06 December 2020

+

Bellumes, Ferner updated:

+ +

Geeves updated:

+ +

JohnWildkins updated:

+ +

Sparky_Hotdog updated:

+ + +

05 December 2020

+

Alberyk updated:

+ +

Ferner updated:

+ +

Geeves updated:

+ +

JohnWildkins updated:

+ +

Wowzewow (Wezzy) updated:

+ + +

04 December 2020

+

Wowzewow (Wezzy) updated:

+ + +

03 December 2020

+

Ferner updated:

+ +

Geeves updated:

+ +

JohnWildkins updated:

+ +

Karolis2011 updated:

+ +

Stryker updated:

+ +

Wowzewow (Wezzy) updated:

+ + +

02 December 2020

+

Alberyk updated:

+ +

Geeves updated:

+ +

MoondancerPony updated:

+ + +

01 December 2020

+

Alberyk updated:

+ +

Geeves updated:

+ +

Karolis2011 updated:

+ +

MoondancerPony updated:

+ +

Wowzewow (Wezzy) updated:

+ +

26 November 2020

Ferner updated: