Merge branch 'master' into placeholder

This commit is contained in:
Ferner
2020-12-07 03:25:15 +01:00
158 changed files with 7873 additions and 3168 deletions
+21 -10
View File
@@ -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
...
+4 -10
View File
@@ -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
*.vue text
+2
View File
@@ -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"
+11 -4
View File
@@ -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
+15 -11
View File
@@ -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) \
+3 -1
View File
@@ -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)
+1
View File
@@ -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)
+1 -1
View File
@@ -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
+6
View File
@@ -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
+5 -5
View File
@@ -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
+4 -4
View File
@@ -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
+1 -1
View File
@@ -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
)
+3 -1
View File
@@ -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
)
)
+3 -1
View File
@@ -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
)
)
+3 -1
View File
@@ -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
)
)
+4 -2
View File
@@ -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
)
)
+11 -11
View File
@@ -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
+1 -1
View File
@@ -77,7 +77,7 @@ var/list/medical_positions = list(
"Surgeon",
"Psychiatrist",
"Pharmacist",
"Emergency Medical Technician",
"First Responder",
"Medical Intern"
)
+7 -1
View File
@@ -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
+1 -1
View File
@@ -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
+5 -5
View File
@@ -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()
update_categories()
+33 -6
View File
@@ -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, "<span class='notice'>There's already a scribble in this page... You wouldn't want to make things too cluttered, would you?</span>")
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
+4 -1
View File
@@ -318,6 +318,7 @@
if(!src) return
to_chat(user, "<span class='notice'>You [anchored? "un" : ""]secured \the [src]!</span>")
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("<span class='warning'>[src] launches [throw_item.name] at [target.name]!</span>")
return 1
return 1
+10 -1
View File
@@ -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
@@ -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
@@ -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
+21 -30
View File
@@ -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
+2 -2
View File
@@ -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("<b>\The [user]</b> 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)
+12 -35
View File
@@ -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
@@ -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
@@ -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"
+1 -1
View File
@@ -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
@@ -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())
@@ -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
@@ -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()
@@ -8,6 +8,7 @@
icon_state = "wall-locker"
density = 0
anchored = 1
store_mobs = FALSE
icon_closed = "wall-locker"
icon_opened = "wall-lockeropen"
@@ -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
/*
=====================
+1 -1
View File
@@ -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
@@ -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"
+1 -2
View File
@@ -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
+1 -2
View File
@@ -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
+8 -2
View File
@@ -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
@@ -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"
@@ -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)"
@@ -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()
..()
@@ -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
@@ -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
@@ -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()
..()
@@ -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"
@@ -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
@@ -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
+2 -2
View File
@@ -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"
@@ -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,
+8 -8
View File
@@ -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"
@@ -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"
+4 -4
View File
@@ -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."
+4 -4
View File
@@ -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()
+2 -2
View File
@@ -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
@@ -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
+10
View File
@@ -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
+1 -1
View File
@@ -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
+1 -1
View File
@@ -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)
+1 -1
View File
@@ -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]\")")
+13 -9
View File
@@ -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)
+4 -5
View File
@@ -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, "<span class='notice'>You add the robot arm to the first aid kit.</span>")
@@ -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
@@ -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)
@@ -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)
@@ -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
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
@@ -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
return injection_mod
@@ -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)
return rgb(H.r_eyes, H.g_eyes, H.b_eyes)
+3 -3
View File
@@ -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()
hud_used.move_intent.Click()
+3 -3
View File
@@ -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
canhear_range = 0 // only people on their tile
@@ -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
@@ -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)
..()
+6 -6
View File
@@ -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, "<span class='warning'>It won't budge!</span>")
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))
selector.set_selected_zone(next_in_list(mob.zone_sel.selecting,zones))
+8 -8
View File
@@ -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.
+8 -2
View File
@@ -898,9 +898,9 @@ proc/is_blind(A)
preposition = "inside"
if (justmoved)
reportto.contained_visible_message(H, "<span class='notice'>[H] [action3] [reportto] [preposition] their [newlocation]</span>", "<span class='notice'>You are [action] [preposition] [H]'s [newlocation]</span>", "", 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, "<span class='notice'>You are [action] [preposition] [H]'s [newlocation]</span>")
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)
@@ -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
VUEUI_SET_CHECK(data["showexitprogram"], !!active_program, ., data) // Hides "Exit Program" button on mainscreen
+11 -11
View File
@@ -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(\
"<span class='warning'><font size=2>You hear a loud cracking sound coming from \the [owner]!</font></span>",\
"<span class='danger'><font size=3>Something feels like it [message] in your [name]!</font></span>",\
"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(\
"<span class='warning'><font size=2>You hear a loud cracking sound coming from \the [owner]!</font></span>",\
"<span class='danger'><font size=3>Something feels like it [message] in your [name]!</font></span>",\
"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
+44 -44
View File
@@ -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
+34 -34
View File
@@ -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"
robotize_type = "Unbranded"
+4
View File
@@ -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)
+3 -1
View File
@@ -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
+10 -3
View File
@@ -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].", "<span class='notice'>You remove [ammo_magazine] from [src].</span>")
playsound(src.loc, ammo_magazine.eject_sound, 50, FALSE)
ammo_magazine.update_icon()
@@ -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)
@@ -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)
@@ -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)
@@ -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)
materials = list(DEFAULT_WALL_MATERIAL = 8000)
+39 -16
View File
@@ -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()
+2
View File
@@ -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))
+15 -10
View File
@@ -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 = "<div id=\"dapp\"></div>"
#else
var/debugtxt = ""
#endif
if(user && check_rights(R_DEV, FALSE, user=user))
debugtxt = "<div id=\"dapp\"></div>"
return {"
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta charset="UTF-8">
<link rel="stylesheet" type="text/css" href="vueui.css">
<meta http-equiv="X-UA-Compatible" content="IE=edge"/>
<meta charset="UTF-8"/>
<meta id="vueui:windowId" content="[windowid]"/>
<link rel="stylesheet" type="text/css" href="vueui.css"/>
[css_tag]
</head>
<body class="[get_theme_class()]">
<div id="header">
<header-[header]></header-[header]>
<header-handles></header-handles>
</div>
<div id="app">
Javascript file has failed to load. <a href="?src=\ref[src]&vueuiforceresource=1">Click here to force load resources</a>
@@ -160,6 +160,9 @@ main ui datum.
<script type="application/json" id="initialstate">
[generate_data_json()]
</script>
<script type="text/javascript">
window.__windowId__ = document.getElementById('vueui:windowId').getAttribute('content');
</script>
<script type="text/javascript" src="vueui.js"></script>
</html>
"}
@@ -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"
+1 -1
View File
@@ -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.
+134
View File
@@ -35,6 +35,140 @@
-->
<div class="commit sansserif">
<h2 class="date">06 December 2020</h2>
<h3 class="author">Bellumes, Ferner updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added two new asteroid dungeon map templates, one mapped by Bellumes and one by Ferner.</li>
</ul>
<h3 class="author">Geeves updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Emergency Medical Technicians have been renamed to First Responders, their duties remain the same, for now.</li>
</ul>
<h3 class="author">JohnWildkins updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Mechatronic fabricators should now dispense synthskin and other non-industrial IPC limbs correctly.</li>
<li class="bugfix">Cryoing with the same mob name as another player should no longer remove both players from the manifest and records system.</li>
<li class="bugfix">Malf/traitor AI law deletion now correctly rebuilds the law list, so carding a malf AI no longer reveals extra laws (other than law zero).</li>
<li class="bugfix">Mobs that die while pointing no longer leave an infinite point marker.</li>
<li class="bugfix">Thermals, mesons, and material scanner overlays no longer function through security camera monitors.</li>
<li class="rscadd">Ported the titlebar replacement system from /tg/, adopted for Vue UIs. Vue-based UIs will now have their default BYOND titlebar replaced with a suitably themed equivalent, increasing available screen space and style.</li>
<li class="tweak">Scrollbars now scroll only the content of a UI, and not the entire window - this should be most notable while using modular computer programs.</li>
<li class="backend">Developers can toggle the debug interface on and off in-game via the bug icon, even without UIDEBUG defined.</li>
</ul>
<h3 class="author">Sparky_Hotdog updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Goggles worn of your forehead no longer block people squirting stuff into your eyes with droppers</li>
</ul>
<h2 class="date">05 December 2020</h2>
<h3 class="author">Alberyk updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">You can no longer hide large mobs inside closets.</li>
<li class="tweak">You can no longer hide inside wallclosets.</li>
</ul>
<h3 class="author">Ferner updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixed airlock spawners not applying the correct cycle command to the buttons.</li>
<li class="bugfix">The csi kit now no longer goes invisible when carried in the hand on the other side of the player's sprite.</li>
</ul>
<h3 class="author">Geeves updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">You can no longer ctrl-click to pull people out of grabs.</li>
<li class="tweak">Pipe and wiring overlays generated by the t-ray scanner now click on the floor tile instead of the object directly, making it easier to crowbar.</li>
<li class="tweak">T-ray scanner overlays are a little more transparent now.</li>
<li class="rscadd">Added Gun-Kata to the Martial Arts uplink for 4 TC. It allows the user to reload projectile weapons by clicking on magazines with the gun in-hand, as well as automatically ejecting magazines to the floor when they're empty.</li>
<li class="rscadd">Added a grenade that spawns lubed up viscerators. These viscerators coat the floor with lube when killed.</li>
</ul>
<h3 class="author">JohnWildkins updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Crates no longer pass through barricades or other objects that allow small objects (PASSTABLE) through.</li>
<li class="refactor">Crates being lifted (and other timed interactions with objects) now stop being lifted if the crate is moved.</li>
</ul>
<h3 class="author">Wowzewow (Wezzy) updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Adds the ability to roll up newspaper to bat people in the head with.</li>
</ul>
<h2 class="date">04 December 2020</h2>
<h3 class="author">Wowzewow (Wezzy) updated:</h3>
<ul class="changes bgimages16">
<li class="backend">Replaces DMItool with contemporary /tg/ version.</li>
</ul>
<h2 class="date">03 December 2020</h2>
<h3 class="author">Ferner updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixed colorable bandanas, softcaps and berets being darker than they're suppposed to be.</li>
</ul>
<h3 class="author">Geeves updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Removed the grilles in the penal colony, making it more difficult to escape.</li>
</ul>
<h3 class="author">JohnWildkins updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Non-NT/EPMC Liaisons should now once again spawn with an energy pistol and a camera.</li>
<li class="bugfix">Unanchoring and moving vending machines should now properly update their powered status.</li>
<li class="bugfix">Taping papers to lockers should no longer attempt to unlock/lock them.</li>
<li class="bugfix">Medbots and their assemblies should now apply toxin/fire/O2 medkit skins properly.</li>
<li class="bugfix">Polymorph wands should now correctly change the species of their targets.</li>
</ul>
<h3 class="author">Karolis2011 updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Computer clock now should show correct time.</li>
</ul>
<h3 class="author">Stryker updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Changed the water bottle flavor text to be more in line with lore.</li>
</ul>
<h3 class="author">Wowzewow (Wezzy) updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Glass jar mob size has been fixed.</li>
</ul>
<h2 class="date">02 December 2020</h2>
<h3 class="author">Alberyk updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Removed the component pouch from the loadout.</li>
</ul>
<h3 class="author">Geeves updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Using an item on a wall will no longer cause it to play the feeling around message. If you want to feel for an opening, use an empty hand.</li>
</ul>
<h3 class="author">MoondancerPony updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixes the date calculation for the Adhomian watch.</li>
</ul>
<h2 class="date">01 December 2020</h2>
<h3 class="author">Alberyk updated:</h3>
<ul class="changes bgimages16">
<li class="rscdel">Removed the sleeping carp martial art from the uplink.</li>
</ul>
<h3 class="author">Geeves updated:</h3>
<ul class="changes bgimages16">
<li class="tweak">Lowered the cost of various uplink items across the board.</li>
<li class="tweak">The sideeffect b-gone injector box on the uplink now spawns with four injectors.</li>
<li class="rscdel">Removed the AMR and its ammo from the uplink.</li>
<li class="tweak">Optimized explosion code a little, it should be a teeny bit faster.</li>
<li class="rscadd">Added a full stop to the sentence saying which slot you're holding your animal / pAI / drone.</li>
<li class="bugfix">Species with off-centre alignments will now retain those alignments after attacking or after being grabbed.</li>
<li class="rscadd">You can now destroy the energy fields that shield generators make by hitting it, as long as your weapon is strong enough.</li>
<li class="rscadd">Energy shields now fade in and fade out, instead of just popping into existence.</li>
<li class="tweak">Ported Pipe- and Floor Painter sprites from Paradise.</li>
</ul>
<h3 class="author">Karolis2011 updated:</h3>
<ul class="changes bgimages16">
<li class="rscadd">Added back clock to modular computers.</li>
</ul>
<h3 class="author">MoondancerPony updated:</h3>
<ul class="changes bgimages16">
<li class="backend">Gloves and mobs no longer keep a hardref to the mob whose blood they are covered in.</li>
</ul>
<h3 class="author">Wowzewow (Wezzy) updated:</h3>
<ul class="changes bgimages16">
<li class="bugfix">Fixes pAIs unfolding out of glass jars.</li>
</ul>
<h2 class="date">26 November 2020</h2>
<h3 class="author">Ferner updated:</h3>
<ul class="changes bgimages16">
+108
View File
@@ -17199,3 +17199,111 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py.
Wowzewow (Wezzy):
- bugfix: Fixes extinguisher refill inhands.
- bugfix: Striped shirts should now be named appropriately in the loadout.
2020-12-01:
Alberyk:
- rscdel: Removed the sleeping carp martial art from the uplink.
Geeves:
- tweak: Lowered the cost of various uplink items across the board.
- tweak: The sideeffect b-gone injector box on the uplink now spawns with four injectors.
- rscdel: Removed the AMR and its ammo from the uplink.
- tweak: Optimized explosion code a little, it should be a teeny bit faster.
- rscadd: Added a full stop to the sentence saying which slot you're holding your
animal / pAI / drone.
- bugfix: Species with off-centre alignments will now retain those alignments after
attacking or after being grabbed.
- rscadd: You can now destroy the energy fields that shield generators make by hitting
it, as long as your weapon is strong enough.
- rscadd: Energy shields now fade in and fade out, instead of just popping into
existence.
- tweak: Ported Pipe- and Floor Painter sprites from Paradise.
Karolis2011:
- rscadd: Added back clock to modular computers.
MoondancerPony:
- backend: Gloves and mobs no longer keep a hardref to the mob whose blood they
are covered in.
Wowzewow (Wezzy):
- bugfix: Fixes pAIs unfolding out of glass jars.
2020-12-02:
Alberyk:
- bugfix: Removed the component pouch from the loadout.
Geeves:
- rscadd: Using an item on a wall will no longer cause it to play the feeling around
message. If you want to feel for an opening, use an empty hand.
MoondancerPony:
- bugfix: Fixes the date calculation for the Adhomian watch.
2020-12-03:
Ferner:
- bugfix: Fixed colorable bandanas, softcaps and berets being darker than they're
suppposed to be.
Geeves:
- tweak: Removed the grilles in the penal colony, making it more difficult to escape.
JohnWildkins:
- bugfix: Non-NT/EPMC Liaisons should now once again spawn with an energy pistol
and a camera.
- bugfix: Unanchoring and moving vending machines should now properly update their
powered status.
- bugfix: Taping papers to lockers should no longer attempt to unlock/lock them.
- bugfix: Medbots and their assemblies should now apply toxin/fire/O2 medkit skins
properly.
- bugfix: Polymorph wands should now correctly change the species of their targets.
Karolis2011:
- bugfix: Computer clock now should show correct time.
Stryker:
- tweak: Changed the water bottle flavor text to be more in line with lore.
Wowzewow (Wezzy):
- bugfix: Glass jar mob size has been fixed.
2020-12-04:
Wowzewow (Wezzy):
- backend: Replaces DMItool with contemporary /tg/ version.
2020-12-05:
Alberyk:
- tweak: You can no longer hide large mobs inside closets.
- tweak: You can no longer hide inside wallclosets.
Ferner:
- bugfix: Fixed airlock spawners not applying the correct cycle command to the buttons.
- bugfix: The csi kit now no longer goes invisible when carried in the hand on the
other side of the player's sprite.
Geeves:
- tweak: You can no longer ctrl-click to pull people out of grabs.
- tweak: Pipe and wiring overlays generated by the t-ray scanner now click on the
floor tile instead of the object directly, making it easier to crowbar.
- tweak: T-ray scanner overlays are a little more transparent now.
- rscadd: Added Gun-Kata to the Martial Arts uplink for 4 TC. It allows the user
to reload projectile weapons by clicking on magazines with the gun in-hand,
as well as automatically ejecting magazines to the floor when they're empty.
- rscadd: Added a grenade that spawns lubed up viscerators. These viscerators coat
the floor with lube when killed.
JohnWildkins:
- bugfix: Crates no longer pass through barricades or other objects that allow small
objects (PASSTABLE) through.
- refactor: Crates being lifted (and other timed interactions with objects) now
stop being lifted if the crate is moved.
Wowzewow (Wezzy):
- rscadd: Adds the ability to roll up newspaper to bat people in the head with.
2020-12-06:
Bellumes, Ferner:
- rscadd: Added two new asteroid dungeon map templates, one mapped by Bellumes and
one by Ferner.
Geeves:
- tweak: Emergency Medical Technicians have been renamed to First Responders, their
duties remain the same, for now.
JohnWildkins:
- bugfix: Mechatronic fabricators should now dispense synthskin and other non-industrial
IPC limbs correctly.
- bugfix: Cryoing with the same mob name as another player should no longer remove
both players from the manifest and records system.
- bugfix: Malf/traitor AI law deletion now correctly rebuilds the law list, so carding
a malf AI no longer reveals extra laws (other than law zero).
- bugfix: Mobs that die while pointing no longer leave an infinite point marker.
- bugfix: Thermals, mesons, and material scanner overlays no longer function through
security camera monitors.
- rscadd: Ported the titlebar replacement system from /tg/, adopted for Vue UIs.
Vue-based UIs will now have their default BYOND titlebar replaced with a suitably
themed equivalent, increasing available screen space and style.
- tweak: Scrollbars now scroll only the content of a UI, and not the entire window
- this should be most notable while using modular computer programs.
- backend: Developers can toggle the debug interface on and off in-game via the
bug icon, even without UIDEBUG defined.
Sparky_Hotdog:
- bugfix: Goggles worn of your forehead no longer block people squirting stuff into
your eyes with droppers
@@ -1,8 +0,0 @@
author: Geeves
delete-after: True
changes:
- tweak: "Lowered the cost of various uplink items across the board."
- tweak: "The sideeffect b-gone injector box on the uplink now spawns with four injectors."
- rscdel: "Removed the AMR and its ammo from the uplink."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.4 KiB

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 25 KiB

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 747 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 745 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 9.4 KiB

After

Width:  |  Height:  |  Size: 9.5 KiB

Some files were not shown because too many files have changed in this diff Show More