Merge branch 'master' into placeholder
@@ -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
|
||||
|
||||
...
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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) \
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
)
|
||||
|
||||
|
||||
@@ -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
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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
|
||||
)
|
||||
)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -77,7 +77,7 @@ var/list/medical_positions = list(
|
||||
"Surgeon",
|
||||
"Psychiatrist",
|
||||
"Pharmacist",
|
||||
"Emergency Medical Technician",
|
||||
"First Responder",
|
||||
"Medical Intern"
|
||||
)
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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)
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
/*
|
||||
=====================
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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"
|
||||
|
||||
|
||||
@@ -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."
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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,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)
|
||||
|
||||
|
||||
@@ -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]\")")
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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)
|
||||
..()
|
||||
@@ -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))
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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()
|
||||
|
||||
@@ -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))
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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.
|
||||
|
||||
@@ -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">
|
||||
|
||||
@@ -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."
|
||||
|
Before Width: | Height: | Size: 5.4 KiB After Width: | Height: | Size: 5.4 KiB |
|
Before Width: | Height: | Size: 25 KiB After Width: | Height: | Size: 26 KiB |
|
After Width: | Height: | Size: 747 B |
|
After Width: | Height: | Size: 745 B |
|
Before Width: | Height: | Size: 9.4 KiB After Width: | Height: | Size: 9.5 KiB |