Merge remote-tracking branch 'citadel/master'

This commit is contained in:
Dip
2020-11-02 16:37:58 -03:00
104 changed files with 1976 additions and 643 deletions
+45
View File
@@ -0,0 +1,45 @@
name: Update TGS DMAPI
on:
schedule:
- cron: "0 0 * * *"
workflow_dispatch:
jobs:
update-dmapi:
runs-on: ubuntu-latest
name: Update the TGS DMAPI
steps:
- name: Clone
uses: actions/checkout@v2
- name: Branch
run: |
git branch -f tgs-dmapi-update
git checkout tgs-dmapi-update
git reset --hard master
- name: Apply DMAPI update
uses: tgstation/tgs-dmapi-updater@v2
with:
header-path: 'code/__DEFINES/tgs.dm'
library-path: 'code/modules/tgs'
- name: Commit and Push
run: |
git config user.name tgstation-server
git config user.email tgstation-server@users.noreply.github.com
git add *
git commit -m 'Update TGS DMAPI'
git push -f -u origin tgs-dmapi-update
- name: Create Pull Request
uses: repo-sync/pull-request@v2
with:
source_branch: "tgs-dmapi-update"
destination_branch: "master"
pr_title: "Automatic TGS DMAPI Update"
pr_body: "This pull request updates the TGS DMAPI to the latest version. Please note any breaking or unimplemented changes before merging."
pr_label: "Tools"
pr_allow_empty: false
github_token: ${{ secrets.GITHUB_TOKEN }}
+350 -137
View File
@@ -17,10 +17,14 @@
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"ag" = (
/obj/structure/shuttle/engine/propulsion/right{
dir = 4
/obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt,
/obj/structure/closet,
/obj/effect/spawner/lootdrop/maintenance{
lootcount = 8;
name = "8maintenance loot spawner"
},
/turf/closed/wall/mineral/titanium,
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"ah" = (
/obj/structure/table/wood,
@@ -70,20 +74,21 @@
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"ar" = (
/obj/machinery/door/airlock/titanium{
name = "Escape Pod Airlock"
},
/turf/open/floor/mineral/titanium,
/turf/closed/wall/mineral/wood,
/area/ruin/powered)
"as" = (
/obj/machinery/light,
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"at" = (
/obj/structure/shuttle/engine/propulsion/left{
dir = 4
/obj/structure/extinguisher_cabinet{
pixel_x = 5;
pixel_y = -32
},
/turf/closed/wall/mineral/titanium,
/obj/machinery/portable_atmospherics/pump,
/obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"au" = (
/obj/item/seeds/tower,
@@ -93,11 +98,15 @@
/area/ruin/powered)
"av" = (
/obj/structure/table/wood,
/obj/item/paper/crumpled{
info = "</b><br><br>So this is it, I guess.. Always thought I'd go out doing something stupid, but.. not like this.<br>Should anyone find this note, tell Jeremy Clarke he can kiss my ass. Launching the pod unprepared like that..<br>Well. Now that I'm keeling over here, I guess I should write how I came to be the last one standing here.<br>Four of us took this pod.. only three of us woke up though.. fourth pod is locked from the inside, we couldn't figure out how to get it open.<br>Me and the clown set up a farm s'we can survive at least a while.. though, he didn't seem to understand that man cannot live on banana alone.<br>Had a bunch of circuits on him for some reason when he eventually passed, whispered to me something about a chem dispenser.. I.. don't know what he meant by that. I was never good with machinary. Maybe he wanted space lube?<br>The assistant that we gave the space suit to go out and find help never came back.. I'm betting he found salvation and left us behind.. never can trust those grubby greytiders."
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton{
pixel_x = 6;
pixel_y = 9
},
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton,
/obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/skeleton{
pixel_x = -5;
pixel_y = 6
},
/obj/item/pen,
/obj/item/stock_parts/cell/hyper,
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"aw" = (
@@ -142,6 +151,17 @@
"aE" = (
/turf/open/floor/plating/asteroid/airless,
/area/ruin/powered)
"aF" = (
/obj/machinery/power/port_gen/pacman{
active = 1;
anchored = 1;
sheets = 10
},
/obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line,
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"aG" = (
/obj/structure/sink/puddle,
/turf/open/floor/plating/asteroid,
@@ -187,9 +207,7 @@
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"aQ" = (
/obj/item/stack/ore/gold,
/obj/item/stack/ore/gold,
/obj/item/stack/ore/gold,
/obj/item/circuitboard/machine/circuit_imprinter,
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"aR" = (
@@ -205,8 +223,12 @@
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"aU" = (
/obj/item/flashlight/lamp,
/obj/structure/table/wood,
/obj/item/reagent_containers/food/snacks/meat/slab/human{
pixel_x = 3;
pixel_y = 3
},
/obj/item/reagent_containers/food/snacks/meat/slab/human,
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"aV" = (
@@ -238,20 +260,24 @@
/turf/closed/mineral/random/no_caves/earth_like,
/area/ruin/powered)
"bc" = (
/obj/item/circuitboard/machine/circuit_imprinter,
/obj/structure/table/wood,
/obj/item/vending_refill/snack,
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"bd" = (
/obj/item/grown/bananapeel,
/turf/open/floor/plating/asteroid,
/obj/structure/shuttle/engine/propulsion/right{
dir = 4
},
/turf/closed/wall/mineral/titanium,
/area/ruin/powered)
"be" = (
/obj/effect/mob_spawn/human/corpse/cargo_tech,
/obj/structure/fans/tiny/invisible,
/obj/structure/chair/wood/normal{
dir = 1
},
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"bf" = (
/obj/item/clothing/glasses/meson,
/obj/machinery/door/airlock/wood,
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"bg" = (
@@ -275,50 +301,43 @@
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"bl" = (
/obj/machinery/power/floodlight,
/obj/structure/cable{
icon_state = "0-2"
/obj/machinery/door/airlock/titanium{
name = "Escape Pod Airlock"
},
/turf/open/floor/plating/asteroid,
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"bm" = (
/obj/structure/cable{
icon_state = "1-4"
},
/obj/item/flashlight/lamp,
/obj/structure/table/wood,
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"bn" = (
/obj/structure/cable{
icon_state = "2-8"
/obj/structure/table/wood,
/obj/item/paper/crumpled{
info = "</b><br><br>So this is it, I guess.. Always thought I'd go out doing something stupid, but.. not like this.<br>Should anyone find this note, tell Jeremy Clarke he can kiss my ass. Launching the pod unprepared like that..<br>Well. Now that I'm keeling over here, I guess I should write how I came to be the last one standing here.<br>Four of us took this pod.. only three of us woke up though.. fourth pod is locked from the inside, we couldn't figure out how to get it open.<br>Me and the clown set up a farm s'we can survive at least a while.. though, he didn't seem to understand that man cannot live on banana alone.<br>Had a bunch of circuits on him for some reason when he eventually passed, whispered to me something about a chem dispenser.. I.. don't know what he meant by that. I was never good with machinary. Maybe he wanted space lube?<br>The assistant that we gave the space suit to go out and find help never came back.. I'm betting he found salvation and left us behind.. never can trust those grubby greytiders."
},
/obj/item/pen,
/obj/item/stock_parts/cell/hyper,
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"bo" = (
/obj/structure/cable{
icon_state = "1-2"
},
/obj/item/grown/bananapeel,
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"bp" = (
/obj/item/stack/ore/iron,
/obj/item/stack/ore/iron,
/obj/item/stack/ore/iron,
/obj/effect/mob_spawn/human/corpse/cargo_tech,
/obj/structure/fans/tiny/invisible,
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"bq" = (
/obj/structure/cable,
/obj/machinery/power/port_gen/pacman{
active = 1;
anchored = 1;
sheets = 10
},
/obj/item/clothing/glasses/meson,
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"br" = (
/obj/item/stack/ore/iron,
/obj/item/stack/sheet/mineral/plasma,
/obj/item/stack/sheet/mineral/plasma,
/turf/open/floor/plating/asteroid,
/obj/effect/decal/cleanable/oil{
icon_state = "floor5"
},
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"bs" = (
/obj/item/flashlight/lamp/bananalamp,
@@ -328,18 +347,181 @@
/obj/item/pickaxe/titanium,
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"fc" = (
/obj/item/stack/ore/iron,
/obj/item/stack/sheet/mineral/plasma,
/obj/item/stack/sheet/mineral/plasma,
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"fp" = (
/turf/closed/mineral/random/high_chance/earth_like,
/area/ruin/powered)
"jx" = (
/turf/closed/mineral/silver/earth_like,
/area/ruin/powered)
"ma" = (
/obj/item/stack/ore/iron,
/obj/item/stack/ore/iron,
/obj/item/stack/ore/iron,
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"mr" = (
/obj/structure/chair/comfy/shuttle{
dir = 8
},
/obj/effect/mob_spawn/human/skeleton,
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"nc" = (
/turf/closed/mineral/bscrystal/earth_like,
/area/ruin/powered)
"nl" = (
/obj/structure/closet/emcloset,
/obj/effect/turf_decal/bot,
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"oR" = (
/obj/structure/cable{
icon_state = "2-8"
},
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"wU" = (
/obj/machinery/portable_atmospherics/canister/air,
/obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"zs" = (
/obj/structure/reagent_dispensers/watertank/high,
/obj/effect/turf_decal/bot,
/obj/effect/turf_decal/stripes/line{
dir = 10
},
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"CY" = (
/obj/machinery/portable_atmospherics/canister/air,
/obj/effect/turf_decal/bot,
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"DH" = (
/obj/structure/chair/comfy/shuttle{
dir = 8
},
/obj/effect/decal/cleanable/vomit/old,
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"Ft" = (
/obj/structure/reagent_dispensers/fueltank/high,
/obj/effect/turf_decal/bot,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/stripes/line{
dir = 8
},
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"HK" = (
/obj/structure/cable{
icon_state = "1-4"
},
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"HP" = (
/obj/machinery/portable_atmospherics/scrubber,
/obj/effect/turf_decal/bot,
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"Iy" = (
/obj/item/clothing/suit/hazardvest{
desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
name = "emergency lifejacket"
},
/obj/item/clothing/suit/hazardvest{
desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
name = "emergency lifejacket"
},
/obj/item/clothing/suit/hazardvest{
desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
name = "emergency lifejacket"
},
/obj/item/clothing/suit/hazardvest{
desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
name = "emergency lifejacket"
},
/obj/item/clothing/suit/hazardvest{
desc = "A high-visibility lifejacket complete with whistle and slot for oxygen tanks.";
name = "emergency lifejacket"
},
/obj/item/tank/internals/emergency_oxygen/double{
pixel_x = 3
},
/obj/item/tank/internals/emergency_oxygen/double{
pixel_x = 3
},
/obj/item/tank/internals/emergency_oxygen/double{
pixel_x = 3
},
/obj/item/tank/internals/emergency_oxygen/double{
pixel_x = 3
},
/obj/item/tank/internals/emergency_oxygen/double{
pixel_x = 3
},
/obj/item/clothing/mask/breath{
pixel_x = -3;
pixel_y = -3
},
/obj/item/clothing/mask/breath{
pixel_x = -3;
pixel_y = -3
},
/obj/item/clothing/mask/breath{
pixel_x = -3;
pixel_y = -3
},
/obj/item/clothing/mask/breath{
pixel_x = -3;
pixel_y = -3
},
/obj/item/clothing/mask/breath{
pixel_x = -3;
pixel_y = -3
},
/obj/item/clothing/head/hardhat/orange{
name = "protective hat";
pixel_y = 9
},
/obj/item/clothing/head/hardhat/orange{
name = "protective hat";
pixel_y = 9
},
/obj/item/clothing/head/hardhat/orange{
name = "protective hat";
pixel_y = 9
},
/obj/item/clothing/head/hardhat/orange{
name = "protective hat";
pixel_y = 9
},
/obj/item/clothing/head/hardhat/orange{
name = "protective hat";
pixel_y = 9
},
/obj/structure/closet/crate/internals,
/obj/effect/turf_decal/bot,
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"JZ" = (
/turf/closed/mineral/titanium/earth_like,
/area/ruin/powered)
"Kj" = (
/obj/machinery/power/floodlight,
/obj/structure/cable{
icon_state = "0-2"
},
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"Lt" = (
/obj/structure/mirror,
/turf/closed/wall/mineral/iron,
@@ -347,6 +529,19 @@
"PG" = (
/turf/closed/mineral/gold/earth_like,
/area/ruin/powered)
"Qi" = (
/obj/structure/cable,
/obj/machinery/power/port_gen/pacman{
active = 1;
anchored = 1;
sheets = 10
},
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"Sv" = (
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/mineral/titanium,
/area/ruin/powered)
"Ue" = (
/turf/closed/mineral/diamond/earth_like,
/area/ruin/powered)
@@ -358,6 +553,24 @@
/obj/item/circuitboard/machine/ore_redemption,
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"WP" = (
/obj/item/stack/ore/gold,
/obj/item/stack/ore/gold,
/obj/item/stack/ore/gold,
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"Xh" = (
/obj/structure/cable{
icon_state = "1-2"
},
/turf/open/floor/plating/asteroid,
/area/ruin/powered)
"XQ" = (
/obj/structure/shuttle/engine/propulsion/left{
dir = 4
},
/turf/closed/wall/mineral/titanium,
/area/ruin/powered)
(1,1,1) = {"
aa
@@ -1123,9 +1336,9 @@ bb
bb
af
ak
ao
ao
ao
DH
an
mr
ak
af
am
@@ -1175,9 +1388,9 @@ bb
aR
ae
ae
an
an
an
af
bl
af
ae
ae
am
@@ -1225,13 +1438,13 @@ ba
ba
bb
aR
ae
ag
ag
af
ar
af
at
nl
an
HP
at
ae
am
bb
fp
@@ -1277,13 +1490,13 @@ aL
bb
bb
aT
am
am
am
am
am
am
am
bl
br
an
an
an
an
bl
aR
bb
bb
@@ -1329,13 +1542,13 @@ am
ba
bb
am
am
am
am
am
am
am
am
af
Ft
zs
Sv
CY
wU
af
bg
bb
fp
@@ -1381,13 +1594,13 @@ am
ba
bb
bb
am
am
am
am
am
am
am
ae
Iy
aF
br
CY
CY
ae
bb
bb
bb
@@ -1432,14 +1645,14 @@ am
bb
bb
bb
aU
am
bd
am
am
bd
af
bl
bm
am
am
af
XQ
XQ
bb
bb
bb
@@ -1484,15 +1697,15 @@ am
bb
bb
ba
av
be
am
am
am
bn
bo
bo
bq
am
am
am
am
am
am
bb
bb
bb
@@ -1525,10 +1738,10 @@ bb
bb
bb
bb
ba
am
am
am
ar
ar
ar
ar
am
am
am
@@ -1536,15 +1749,15 @@ am
bb
bb
bb
bc
bf
am
am
am
am
am
am
br
am
am
am
bb
bb
bb
@@ -1577,10 +1790,10 @@ bb
bb
bb
bb
bb
bb
bb
bb
ar
av
am
ar
am
am
am
@@ -1629,10 +1842,10 @@ bb
fp
bb
bb
bb
bb
bb
bb
ar
aU
be
bf
am
am
am
@@ -1645,8 +1858,8 @@ am
am
aR
am
am
am
Kj
HK
am
bb
bb
@@ -1681,11 +1894,11 @@ bb
bb
bb
bb
bb
bb
bb
bb
ba
ar
bc
am
ar
am
am
am
am
@@ -1698,10 +1911,10 @@ am
am
am
am
am
am
am
am
oR
Xh
Xh
Qi
ba
ba
ba
@@ -1733,16 +1946,18 @@ bb
bb
bb
bb
bb
bb
bb
bb
ar
ar
ar
ar
ba
ba
ba
aK
ba
ba
bm
bo
am
am
am
@@ -1750,9 +1965,7 @@ am
am
am
am
bp
am
am
fc
aR
ba
ba
@@ -1795,16 +2008,16 @@ fp
ba
fp
ba
bn
bp
am
am
am
am
am
aP
am
am
am
am
am
am
am
am
am
aR
ba
ba
@@ -1848,14 +2061,14 @@ ba
ba
ba
aQ
aP
bq
am
am
aR
am
am
am
am
WP
aP
bb
am
ba
@@ -2009,7 +2222,7 @@ bg
am
am
am
am
ma
am
aS
bb
+1 -1
View File
@@ -1453,7 +1453,7 @@
/area/ruin/space/has_grav/hotel/guestroom/room_2)
"eu" = (
/obj/structure/table/wood,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/turf/open/floor/wood,
/area/ruin/space/has_grav/hotel/guestroom/room_2)
"ev" = (
@@ -5371,7 +5371,7 @@
/area/awaymission/research/interior/dorm)
"kS" = (
/obj/structure/table/wood,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/turf/open/floor/plasteel,
/area/awaymission/research/interior/dorm)
"kT" = (
File diff suppressed because it is too large Load Diff
+3 -3
View File
@@ -8535,7 +8535,7 @@
/obj/effect/turf_decal/tile/bar{
dir = 1
},
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/obj/item/toy/cards/deck,
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
@@ -16727,7 +16727,7 @@
/area/bridge)
"aKw" = (
/obj/structure/table,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/obj/item/toy/cards/deck,
/obj/structure/disposalpipe/segment{
dir = 4
@@ -31929,7 +31929,7 @@
/obj/effect/turf_decal/tile/green{
dir = 4
},
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/obj/item/toy/cards/deck,
/turf/open/floor/plasteel/white/corner{
dir = 1
@@ -20277,7 +20277,7 @@
/area/security/prison)
"aND" = (
/obj/structure/table,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
dir = 4
@@ -20973,7 +20973,7 @@
/area/crew_quarters/bar/atrium)
"aOJ" = (
/obj/structure/table/wood,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/obj/effect/turf_decal/tile/red{
dir = 1
},
@@ -73299,7 +73299,7 @@
/area/library)
"ctL" = (
/obj/structure/table/wood,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/obj/machinery/computer/security/telescreen/entertainment{
pixel_y = -32
},
@@ -95302,7 +95302,7 @@
/area/medical/medbay/central)
"deG" = (
/obj/structure/table/wood,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/obj/structure/sign/poster/official/help_others{
pixel_x = -32
},
@@ -116727,7 +116727,7 @@
/area/library/abandoned)
"dQx" = (
/obj/structure/table/wood,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/turf/open/floor/carpet,
/area/library/abandoned)
"dQy" = (
@@ -122957,7 +122957,7 @@
/area/hallway/secondary/exit/departure_lounge)
"ecH" = (
/obj/structure/table,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/hallway/secondary/exit/departure_lounge)
+4 -4
View File
@@ -928,7 +928,7 @@
/area/security/prison)
"acb" = (
/obj/structure/table,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/turf/open/floor/plasteel,
/area/security/prison)
"acc" = (
@@ -15807,7 +15807,7 @@
/area/crew_quarters/dorms)
"aDZ" = (
/obj/structure/table,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/turf/open/floor/plasteel,
/area/crew_quarters/dorms)
"aEa" = (
@@ -21386,7 +21386,7 @@
/area/crew_quarters/locker)
"aPI" = (
/obj/structure/table,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/turf/open/floor/plasteel,
/area/crew_quarters/locker)
"aPJ" = (
@@ -42546,7 +42546,7 @@
dir = 10
},
/obj/structure/table/wood/poker,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/turf/open/floor/wood,
/area/crew_quarters/bar)
"bFt" = (
@@ -22551,7 +22551,7 @@
/area/hallway/primary/starboard)
"aJa" = (
/obj/structure/table,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/obj/machinery/firealarm{
dir = 4;
pixel_x = -24
@@ -22871,7 +22871,7 @@
/obj/machinery/requests_console{
department = "Genetics";
name = "Genetics RC";
pixel_x = 28
pixel_x = 28
},
/turf/open/floor/plasteel/white,
/area/medical/genetics)
@@ -28655,7 +28655,7 @@
"aTf" = (
/obj/structure/table/wood,
/obj/item/clipboard,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
@@ -2180,7 +2180,7 @@
/turf/open/floor/plasteel/dark,
/area/security/prison)
"afp" = (
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/obj/structure/table,
/turf/open/floor/plasteel/dark,
/area/security/prison)
@@ -10645,7 +10645,7 @@
/area/crew_quarters/dorms)
"ayo" = (
/obj/structure/table/wood,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/turf/open/floor/carpet,
/area/crew_quarters/dorms)
"ayq" = (
+3 -3
View File
@@ -4095,7 +4095,7 @@
/area/engine/supermatter)
"aOP" = (
/obj/structure/table/wood,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/turf/open/floor/plasteel/dark,
/area/security/prison)
"aPw" = (
@@ -27914,7 +27914,7 @@
"nIM" = (
/obj/structure/table/wood/poker,
/obj/item/toy/cards/deck,
/obj/item/storage/box/dice{
/obj/item/storage/dice{
pixel_x = 8
},
/obj/structure/sign/poster/contraband/random{
@@ -33380,7 +33380,7 @@
/area/bridge)
"qMN" = (
/obj/structure/table,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/turf/open/floor/plasteel/grimy,
/area/crew_quarters/fitness/recreation)
"qNB" = (
+2 -2
View File
@@ -8429,7 +8429,7 @@
/area/centcom/ferry)
"tx" = (
/obj/structure/table/wood,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/turf/open/floor/plasteel/grimy,
/area/centcom/ferry)
"ty" = (
@@ -10217,7 +10217,7 @@
/area/wizard_station)
"xy" = (
/obj/structure/table/wood/fancy,
/obj/item/storage/box/dice{
/obj/item/storage/dice{
icon_state = "magicdicebag"
},
/turf/open/floor/carpet,
+1 -1
View File
@@ -307,7 +307,7 @@
"D" = (
/obj/structure/table/reinforced,
/obj/item/folder,
/obj/item/storage/box/dice,
/obj/item/storage/dice,
/obj/effect/turf_decal/delivery,
/turf/open/floor/plasteel,
/area/shuttle/arrival)
+1 -1
View File
@@ -237,7 +237,7 @@
/area/shuttle/arrival)
"C" = (
/obj/structure/table/reinforced,
/obj/item/storage/box/dice{
/obj/item/storage/dice{
pixel_x = -2;
pixel_y = 8
},
+7 -1
View File
@@ -76,8 +76,14 @@
#define LINGHIVE_LINK 3
//whether the emote is visible or audible.
// Requires sight
#define EMOTE_VISIBLE 1
// Requires hearing
#define EMOTE_AUDIBLE 2
// Requires sight or hearing
#define EMOTE_BOTH 3
// Always able to be seen
#define EMOTE_OMNI 4
//Don't set this very much higher then 1024 unless you like inviting people in to dos your server with message spam
#define MAX_MESSAGE_LEN 2048 //Citadel edit: What's the WORST that could happen?
@@ -89,4 +95,4 @@
// Audio/Visual Flags. Used to determine what sense are required to notice a message.
#define MSG_VISUAL (1<<0)
#define MSG_AUDIBLE (1<<1)
#define MSG_AUDIBLE (1<<1)
+1
View File
@@ -34,6 +34,7 @@
#define SPECIES_SYNTH "synth"
#define SPECIES_SYNTH_MIL "military_synth"
#define SPECIES_VAMPIRE "vampire"
#define SPECIES_VAMPIRE_WEAK "vampire_roundstart"
#define SPECIES_XENOHYBRID "xeno"
#define SPECIES_ZOMBIE "zombie"
+3 -4
View File
@@ -208,10 +208,9 @@
#define TRAIT_FAST_PUMP "fast_pump"
#define TRAIT_NO_PROCESS_FOOD "no-process-food" // You don't get benefits from nutriment, nor nutrition from reagent consumables
#define TRAIT_NICE_SHOT "nice_shot" //hnnnnnnnggggg..... you're pretty good...
/// Prevents stamina buffer regeneration
#define TRAIT_NO_STAMINA_BUFFER_REGENERATION "block_stamina_buffer_regen"
/// Prevents stamina regeneration
#define TRAIT_NO_STAMINA_REGENERATION "block_stamina_regen"
#define TRAIT_NO_STAMINA_BUFFER_REGENERATION "block_stamina_buffer_regen" /// Prevents stamina buffer regeneration
#define TRAIT_NO_STAMINA_REGENERATION "block_stamina_regen" /// Prevents stamina regeneration
#define TRAIT_ARMOR_BROKEN "armor_broken" //acts as if you are wearing no clothing when taking damage, does not affect non-clothing sources of protection
// mobility flag traits
// IN THE FUTURE, IT WOULD BE NICE TO DO SOMETHING SIMILAR TO https://github.com/tgstation/tgstation/pull/48923/files (ofcourse not nearly the same because I have my.. thoughts on it)
+7 -7
View File
@@ -1,9 +1,9 @@
#define PLURALITY_VOTING 0
#define APPROVAL_VOTING 1
#define SCHULZE_VOTING 2
#define SCORE_VOTING 3
#define MAJORITY_JUDGEMENT_VOTING 4
#define INSTANT_RUNOFF_VOTING 5
#define PLURALITY_VOTING "PLURALITY"
#define APPROVAL_VOTING "APPROVAL"
#define SCHULZE_VOTING "SCHULZE"
#define SCORE_VOTING "SCORE"
#define MAJORITY_JUDGEMENT_VOTING "MAJORITY_JUDGEMENT"
#define INSTANT_RUNOFF_VOTING "IRV"
#define SHOW_RESULTS (1<<0)
#define SHOW_VOTES (1<<1)
@@ -26,4 +26,4 @@ GLOBAL_LIST_INIT(display_vote_settings, list(\
"Ongoing Votes" = SHOW_VOTES,
"Winner" = SHOW_WINNER,
"Abstainers" = SHOW_ABSTENTION
))
))
@@ -290,7 +290,7 @@
/datum/config_entry/flag/tgstyle_maprotation
/datum/config_entry/string/map_vote_type
config_entry_value = "SCORE"
config_entry_value = APPROVAL_VOTING
/datum/config_entry/number/maprotatechancedelta
config_entry_value = 0.75
@@ -50,17 +50,20 @@ PROCESSING_SUBSYSTEM_DEF(circuit)
/obj/item/electronic_assembly/simple,
/obj/item/electronic_assembly/hook,
/obj/item/electronic_assembly/pda,
/obj/item/electronic_assembly/dildo,
/obj/item/electronic_assembly/small/default,
/obj/item/electronic_assembly/small/cylinder,
/obj/item/electronic_assembly/small/scanner,
/obj/item/electronic_assembly/small/hook,
/obj/item/electronic_assembly/small/box,
/obj/item/electronic_assembly/small/dildo,
/obj/item/electronic_assembly/medium/default,
/obj/item/electronic_assembly/medium/box,
/obj/item/electronic_assembly/medium/clam,
/obj/item/electronic_assembly/medium/medical,
/obj/item/electronic_assembly/medium/gun,
/obj/item/electronic_assembly/medium/radio,
/obj/item/electronic_assembly/medium/dildo,
/obj/item/electronic_assembly/large/default,
/obj/item/electronic_assembly/large/scope,
/obj/item/electronic_assembly/large/terminal,
+15 -8
View File
@@ -45,22 +45,29 @@ SUBSYSTEM_DEF(statpanels)
var/list/vote_arry = list(
list("Vote active!", "There is currently a vote running. Question: [SSvote.question]")
) //see the MC on how this works.
if(!(SSvote.vote_system in list(PLURALITY_VOTING, APPROVAL_VOTING)))
if(!(SSvote.vote_system in list(PLURALITY_VOTING, APPROVAL_VOTING, SCHULZE_VOTING, INSTANT_RUNOFF_VOTING)))
vote_arry[++vote_arry.len] += list("STATPANEL VOTING DISABLED!", "The current vote system is not supported by statpanel rendering. Please vote manually by opening the vote popup using the action button or chat link.", "disabled")
//does not return.
else
vote_arry[++vote_arry.len] += list("Time Left:", " [round(SSvote.end_time - world.time)] seconds")
vote_arry[++vote_arry.len] += list("Time Left:", " [DisplayTimeText(SSvote.end_time - world.time)] seconds")
vote_arry[++vote_arry.len] += list("Choices:", "")
for(var/choice in SSvote.choice_statclicks)
var/choice_id = SSvote.choice_statclicks[choice]
var/ivotedforthis = FALSE
if(target.ckey)
switch(SSvote.vote_system)
if(APPROVAL_VOTING)
ivotedforthis = SSvote.voted[target.ckey] && (text2num(choice_id) in SSvote.voted[usr.ckey])
if(PLURALITY_VOTING)
ivotedforthis = (SSvote.voted[target.ckey] == text2num(choice_id))
vote_arry[++vote_arry.len] += list(ivotedforthis ? "\[X\]" : "\[ \]", choice, "[REF(SSvote)];vote=[choice_id];statpannel=1")
if(PLURALITY_VOTING, APPROVAL_VOTING)
var/ivotedforthis = FALSE
if(SSvote.vote_system == APPROVAL_VOTING)
ivotedforthis = SSvote.voted[target.ckey] && (text2num(choice_id) in SSvote.voted[target.ckey])
else
ivotedforthis = (SSvote.voted[target.ckey] == text2num(choice_id))
vote_arry[++vote_arry.len] += list(ivotedforthis ? "\[X\]" : "\[ \]", choice, "[REF(SSvote)];vote=[choice_id];statpannel=1")
if(SCHULZE_VOTING, INSTANT_RUNOFF_VOTING)
var/list/vote = SSvote.voted[target.ckey]
var/vote_position = " "
if(vote)
vote_position = vote.Find(text2num(choice_id))
vote_arry[++vote_arry.len] += list("\[[vote_position]\]", choice, "[REF(SSvote)];vote=[choice_id];statpannel=1")
var/vote_str = url_encode(json_encode(vote_arry))
target << output("[vote_str]", "statbrowser:update_voting")
else
+1 -12
View File
@@ -482,18 +482,7 @@ SUBSYSTEM_DEF(ticker)
INVOKE_ASYNC(SSmapping, /datum/controller/subsystem/mapping/.proc/maprotate)
else
var/vote_type = CONFIG_GET(string/map_vote_type)
switch(vote_type)
if("PLURALITY")
SSvote.initiate_vote("map","server", display = SHOW_RESULTS)
if("APPROVAL")
SSvote.initiate_vote("map","server", display = SHOW_RESULTS, votesystem = APPROVAL_VOTING)
if("IRV")
SSvote.initiate_vote("map","server", display = SHOW_RESULTS, votesystem = INSTANT_RUNOFF_VOTING)
if("SCORE")
SSvote.initiate_vote("map","server", display = SHOW_RESULTS, votesystem = MAJORITY_JUDGEMENT_VOTING)
else
SSvote.initiate_vote("map","server", display = SHOW_RESULTS)
// fallback
SSvote.initiate_vote("map","server", display = SHOW_RESULTS, votesystem = vote_type)
/datum/controller/subsystem/ticker/proc/HasRoundStarted()
return current_state >= GAME_STATE_PLAYING
+6 -9
View File
@@ -25,18 +25,15 @@
/datum/accent/abductor/modify_speech(list/speech_args, datum/source)
var/message = speech_args[SPEECH_MESSAGE]
var/mob/living/carbon/human/user = source
var/mob/living/carbon/user = source
var/obj/item/organ/tongue/abductor/A = user.getorgan(/obj/item/organ/tongue/abductor)
var/rendered = "<span class='abductor'><b>[user.name]:</b> [message]</span>"
user.log_talk(message, LOG_SAY, tag="abductor")
for(var/mob/living/carbon/human/H in GLOB.alive_mob_list)
var/obj/item/organ/tongue/T = H.getorganslot(ORGAN_SLOT_TONGUE)
if(!T || T.type != type)
for(var/mob/living/carbon/C in GLOB.alive_mob_list)
var/obj/item/organ/tongue/abductor/T = C.getorgan(/obj/item/organ/tongue/abductor)
if(!T || T.mothership != A.mothership)
continue
if(H.dna && H.dna.species.id == "abductor" && user.dna && user.dna.species.id == "abductor")
var/datum/antagonist/abductor/A = user.mind.has_antag_datum(/datum/antagonist/abductor)
if(!A || !(H.mind in A.team.members))
continue
to_chat(H, rendered)
to_chat(C, rendered)
for(var/mob/M in GLOB.dead_mob_list)
var/link = FOLLOW_LINK(M, user)
to_chat(M, "[link] [rendered]")
+1 -1
View File
@@ -174,7 +174,7 @@
M.ghostize(can_reenter_corpse = TRUE, voluntary = TRUE)
/datum/action/proc/OnUpdatedIcon()
UpdateButtonIcon()
addtimer(CALLBACK(src, .proc/UpdateButtonIcon), 1) //Hopefully runs after new icon overlays have been compiled.
//Presets for item actions
/datum/action/item_action
@@ -248,7 +248,7 @@
category = CAT_WEAPONRY
subcategory = CAT_WEAPON
/datum/crafting_recipe/ishotgun // smaller and more versatile gun requires some better materials
/datum/crafting_recipe/ishotgun
name = "Improvised Shotgun"
result = /obj/item/gun/ballistic/revolver/doublebarrel/improvised
reqs = list(/obj/item/pipe = 2, // putting a large amount of meaningless timegates by forcing people to turn base resources into upgraded resources kinda sucks
@@ -408,7 +408,7 @@
/datum/crafting_recipe/rifle_receiver
name = "Improvised Rifle Receiver"
result = /obj/item/weaponcrafting/improvised_parts/rifle_receiver
reqs = list(/obj/item/stack/sheet/metal = 15) // you can carry multiple shotguns
reqs = list(/obj/item/stack/sheet/metal = 15)
tools = list(TOOL_SCREWDRIVER, TOOL_WELDER)
time = 25
category = CAT_WEAPONRY
@@ -417,10 +417,9 @@
/datum/crafting_recipe/shotgun_receiver
name = "Improvised Shotgun Receiver"
result = /obj/item/weaponcrafting/improvised_parts/shotgun_receiver
reqs = list(/obj/item/stack/sheet/metal = 15,
/obj/item/stack/sheet/plasteel = 1) // requires access or hacking since shotgun is better
reqs = list(/obj/item/stack/sheet/metal = 10) // shotgun does less damage than the rifle and can't 1shot but is more portable
tools = list(TOOL_SCREWDRIVER, TOOL_WELDER)
time = 25
time = 20
category = CAT_WEAPONRY
subcategory = CAT_PARTS
@@ -432,6 +431,6 @@
reqs = list(/obj/item/stack/sheet/metal = 3,
/obj/item/assembly/igniter = 1)
tools = list(TOOL_SCREWDRIVER, TOOL_WELDER)
time = 25
time = 20
category = CAT_WEAPONRY
subcategory = CAT_PARTS
+15
View File
@@ -46,6 +46,21 @@
if(isnum(use_delay_override))
use_delay = use_delay_override
/datum/component/squeak/UnregisterFromParent()
if(!isatom(parent))
return
UnregisterSignal(parent, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_BLOB_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_PARENT_ATTACKBY))
if(ismovable(parent))
UnregisterSignal(parent, list(COMSIG_MOVABLE_BUMP, COMSIG_MOVABLE_IMPACT,
COMSIG_MOVABLE_CROSSED, COMSIG_ITEM_WEARERCROSSED, COMSIG_MOVABLE_CROSS,
COMSIG_CROSS_SQUEAKED, COMSIG_MOVABLE_DISPOSING))
if(isitem(parent))
UnregisterSignal(parent, list(COMSIG_ITEM_ATTACK, COMSIG_ITEM_ATTACK_OBJ, COMSIG_ITEM_HIT_REACT, COMSIG_ITEM_ATTACK_SELF,
COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED))
if(istype(parent, /obj/item/clothing/shoes))
UnregisterSignal(parent, COMSIG_SHOES_STEP_ACTION)
return ..()
/datum/component/squeak/proc/play_squeak()
do_play_squeak()
+5 -1
View File
@@ -66,8 +66,12 @@
if(emote_type == EMOTE_AUDIBLE)
user.audible_message(msg)
else
else if(emote_type == EMOTE_VISIBLE)
user.visible_message(msg)
else if(emote_type == EMOTE_BOTH)
user.visible_message(msg, blind_message = msg)
else if(emote_type == EMOTE_OMNI)
user.visible_message(msg, omni = TRUE)
/datum/emote/proc/replace_pronoun(mob/user, message)
if(findtext(message, "their"))
-1
View File
@@ -150,7 +150,6 @@
overlays_standing[CM.layer_used] = mut_overlay
apply_overlay(CM.layer_used)
/datum/mutation/human/proc/modify() //called when a genome is applied so we can properly update some stats without having to remove and reapply the mutation from someone
if(modified || !power || !owner)
return
+4 -4
View File
@@ -197,7 +197,7 @@
if(gangtool)//Here is where all of the text occurs when a gang boss first spawns in.
var/obj/item/device/gangtool/G = new()
var/where = H.equip_in_one_of_slots(G, slots)
var/where = H.equip_in_one_of_slots(G, slots, critical = TRUE)
if (!where)
to_chat(H, "Your Syndicate benefactors were unfortunately unable to get you a Gangtool.")
else
@@ -207,7 +207,7 @@
if(pen)
var/obj/item/pen/gang/T = new()
var/where2 = H.equip_in_one_of_slots(T, slots)
var/where2 = H.equip_in_one_of_slots(T, slots, critical = TRUE)
if (!where2)
to_chat(H, "Your Syndicate benefactors were unfortunately unable to get you a recruitment pen to start.")
else
@@ -215,7 +215,7 @@
if(spraycan)
var/obj/item/toy/crayon/spraycan/gang/SC = new(null,gang)
var/where3 = H.equip_in_one_of_slots(SC, slots)
var/where3 = H.equip_in_one_of_slots(SC, slots, critical = TRUE)
if (!where3)
to_chat(H, "Your Syndicate benefactors were unfortunately unable to get you a territory spraycan to start.")
else
@@ -223,7 +223,7 @@
if(hud)
var/obj/item/clothing/glasses/hud/security/chameleon/C = new(null,gang)
var/where4 = H.equip_in_one_of_slots(C, slots)
var/where4 = H.equip_in_one_of_slots(C, slots, critical = TRUE)
if (!where4)
to_chat(H, "Your Syndicate benefactors were unfortunately unable to get you a chameleon security HUD.")
else
+2 -2
View File
@@ -166,7 +166,7 @@ If not set, defaults to check_completion instead. Set it. It's used by cryo.
var/list/slots = list("backpack" = SLOT_IN_BACKPACK)
for(var/eq_path in special_equipment)
var/obj/O = new eq_path
H.equip_in_one_of_slots(O, slots)
H.equip_in_one_of_slots(O, slots, critical = TRUE)
/datum/objective/assassinate
name = "assasinate"
@@ -1152,7 +1152,7 @@ GLOBAL_LIST_EMPTY(cult_contraband)
I.forceMove(get_turf(owner))
if(ishuman(owner))
var/mob/living/carbon/human/H = owner
H.equip_in_one_of_slots(I, list("backpack" = SLOT_IN_BACKPACK))
H.equip_in_one_of_slots(I, list("backpack" = SLOT_IN_BACKPACK), critical = TRUE)
hoarded_item = I
+4 -2
View File
@@ -114,7 +114,7 @@ GLOBAL_LIST_EMPTY(announcement_systems)
. = ..()
if(.)
return
if(!usr.canUseTopic(src, !issilicon(usr)))
if(!usr.canUseTopic(src, !hasSiliconAccessInArea(usr)))
return
if(stat & BROKEN)
visible_message("<span class='warning'>[src] buzzes.</span>", "<span class='hear'>You hear a faint buzz.</span>")
@@ -147,7 +147,7 @@ GLOBAL_LIST_EMPTY(announcement_systems)
. = attack_ai(user)
/obj/machinery/announcement_system/attack_ai(mob/user)
if(!user.canUseTopic(src, !issilicon(user)))
if(!user.canUseTopic(src, !hasSiliconAccessInArea(user)))
return
if(stat & BROKEN)
to_chat(user, "<span class='warning'>[src]'s firmware appears to be malfunctioning!</span>")
@@ -167,7 +167,9 @@ GLOBAL_LIST_EMPTY(announcement_systems)
act_up()
/obj/machinery/announcement_system/emag_act()
. = ..()
if(obj_flags & EMAGGED)
return
obj_flags |= EMAGGED
act_up()
return TRUE
+15
View File
@@ -21,6 +21,9 @@
return
if(R.scrambledcodes)
return
if(hasSiliconAccessInArea(user) && !issilicon(user))
if(!Adjacent(user))
return
return TRUE
/obj/machinery/computer/robotics/ui_interact(mob/user, datum/tgui/ui)
@@ -40,6 +43,10 @@
else if(IsAdminGhost(user))
data["can_hack"] = TRUE
data["can_convert"] = FALSE
if(isAI(user) && is_servant_of_ratvar(user))
data["can_convert"] = TRUE
data["cyborgs"] = list()
for(var/mob/living/silicon/robot/R in GLOB.silicon_mobs)
if(!can_control(user, R))
@@ -54,6 +61,7 @@
module = R.module ? "[R.module.name] Module" : "No Module Detected",
synchronization = R.connected_ai,
emagged = R.emagged,
servant = is_servant_of_ratvar(R),
ref = REF(R)
)
data["cyborgs"] += list(cyborg_data)
@@ -110,6 +118,13 @@
log_game("[key_name(usr)] emagged [key_name(R)] using robotic console!")
message_admins("[ADMIN_LOOKUPFLW(usr)] emagged cyborg [key_name_admin(R)] using robotic console!")
R.SetEmagged(TRUE)
if("convert")
if(isAI(usr) && is_servant_of_ratvar(usr))
var/mob/living/silicon/robot/R = locate(params["ref"]) in GLOB.silicon_mobs
if(istype(R) && !is_servant_of_ratvar(R) && R.connected_ai == usr)
log_game("[key_name(usr)] converted [key_name(R)] using robotic console!")
message_admins("[ADMIN_LOOKUPFLW(usr)] converted cyborg [key_name_admin(R)] using robotic console!")
add_servant_of_ratvar(R)
if("killdrone")
if(allowed(usr))
var/mob/living/simple_animal/drone/D = locate(params["ref"]) in GLOB.mob_list
+9
View File
@@ -32,6 +32,8 @@
. = ..()
if(in_range(user, src) || isobserver(user))
. += "<span class='notice'>The status display reads: Radiation pulse accuracy increased by factor <b>[precision_coeff**2]</b>.<br>Radiation pulse damage decreased by factor <b>[damage_coeff**2]</b>.</span>"
if(scan_level >= 3)
. += "<span class='notice'>Scanner has been upgraded to support autoprocessing.</span>"
/obj/machinery/dna_scannernew/update_icon_state()
//no power or maintenance
@@ -94,6 +96,13 @@
..(user)
// search for ghosts, if the corpse is empty and the scanner is connected to a cloner
var/mob/living/mob_occupant = get_mob_or_brainmob(occupant)
if(istype(mob_occupant))
if(locate_computer(/obj/machinery/computer/cloning))
if(!mob_occupant.suiciding && !(HAS_TRAIT(mob_occupant, TRAIT_NOCLONE)) && !mob_occupant.hellbound)
mob_occupant.notify_ghost_cloning("Your corpse has been placed into a cloning scanner. Re-enter your corpse if you want to be cloned!", source = src)
// DNA manipulators cannot operate on severed heads or brains
if(iscarbon(occupant))
if(linked_console)
+10
View File
@@ -1457,6 +1457,16 @@
ui.open()
return TRUE
/obj/machinery/door/airlock/ui_status(mob/user)
. = ..()
if (!issilicon(user) && hasSiliconAccessInArea(user))
. = UI_INTERACTIVE
/obj/machinery/door/airlock/can_interact(mob/user)
. = ..()
if (!issilicon(user) && hasSiliconAccessInArea(user))
return TRUE
/obj/machinery/door/airlock/ui_data()
var/list/data = list()
@@ -28,10 +28,10 @@
if(!do_after(user, 30 SECONDS, TRUE, src))
to_chat(user, "<span class='warning'>Your fingers slip as you fail to pry the [stored] from the [src], clicking it right back into the slot!</span>")
return
if(user.put_in_hands(stored))
stored.forceMove(user.drop_location())
user.put_in_hands(stored)
to_chat(user, "<span class='warning'>You successfully pry the [stored] from the [src]\
[user.is_holding(stored) ? "" : ", and send its overwhelming weight tumbling onto the ground"]! The tapes on the [src] stop spinning...</span>")
stored = null
to_chat(user, "<span class='warning'>You successfully pry the [stored] from the [src], and send its overwhelming weight tumbling onto the ground! The tapes on the [src] stop spinning...</span>")
update_icon()
return
else
@@ -41,7 +41,7 @@
/obj/machinery/blackbox_recorder/attackby(obj/item/I, mob/living/user, params)
. = ..()
if(istype(I, /obj/item/blackbox))
if(HAS_TRAIT(I, TRAIT_NODROP) || !user.transferItemToLoc(I, src))
if(!user.transferItemToLoc(I, src))
to_chat(user, "<span class='warning'>[I] is stuck to your hand!</span>")
return
user.visible_message("<span class='notice'>[user] clicks the [I] into the [src]!</span>", \
@@ -464,7 +464,7 @@
/obj/effect/spawner/lootdrop/cigars_cases/no_turf = 2,
/obj/effect/spawner/lootdrop/space_cash/no_turf = 5,
/obj/item/reagent_containers/food/snacks/grown/cannabis = 5,
/obj/item/storage/box/dice = 5,
/obj/item/storage/dice = 5,
/obj/item/toy/cards/deck = 5,
/obj/effect/spawner/lootdrop/druggie_pill/no_turf = 5
)
@@ -483,7 +483,7 @@
/obj/effect/spawner/lootdrop/cig_packs/no_turf = 10,
/obj/effect/spawner/lootdrop/cigars_cases/no_turf = 5,
/obj/item/reagent_containers/food/snacks/grown/cannabis = 5,
/obj/item/storage/box/dice = 5,
/obj/item/storage/dice = 5,
/obj/item/toy/cards/deck = 5,
/obj/effect/spawner/lootdrop/druggie_pill/no_turf = 5,
/obj/item/kitchen/knife = 5,
+1 -1
View File
@@ -93,7 +93,7 @@ RSF
use_matter(50, user)
if(4)
to_chat(user, "Dispensing Dice Pack...")
new /obj/item/storage/box/dice(T)
new /obj/item/storage/dice(T)
use_matter(200, user)
if(5)
to_chat(user, "Dispensing Cigarette...")
+1 -1
View File
@@ -616,7 +616,7 @@
if(defib.healdisk)
H.heal_overall_damage(25, 25)
var/list/policies = CONFIG_GET(keyed_list/policyconfig)
var/timelimit = CONFIG_GET(number/defib_cmd_time_limit)
var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds
var/late = timelimit && (tplus > timelimit)
var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT]
if(policy)
+20 -21
View File
@@ -1,39 +1,38 @@
/obj/item/storage/box/dice
/*****************************Dice Bags********************************/
/obj/item/storage/dice
name = "bag of dice"
desc = "Contains all the luck you'll ever need."
icon = 'icons/obj/dice.dmi'
icon_state = "dicebag"
w_class = WEIGHT_CLASS_SMALL
var/list/special_die = list(
/obj/item/dice/d1,
/obj/item/dice/d2,
/obj/item/dice/fudge,
/obj/item/dice/d6/space,
/obj/item/dice/d00,
/obj/item/dice/eightbd20,
/obj/item/dice/fourdd6,
/obj/item/dice/d100
)
/obj/item/storage/box/dice/Initialize()
. = ..()
var/special_die = pick("1","2","fudge","space","00","8bd20","4dd6","100")
if(special_die == "1")
new /obj/item/dice/d1(src)
if(special_die == "2")
new /obj/item/dice/d2(src)
/obj/item/storage/dice/PopulateContents()
new /obj/item/dice/d4(src)
new /obj/item/dice/d6(src)
if(special_die == "fudge")
new /obj/item/dice/fudge(src)
if(special_die == "space")
new /obj/item/dice/d6/space(src)
new /obj/item/dice/d8(src)
new /obj/item/dice/d10(src)
if(special_die == "00")
new /obj/item/dice/d00(src)
new /obj/item/dice/d12(src)
new /obj/item/dice/d20(src)
if(special_die == "8bd20")
new /obj/item/dice/eightbd20(src)
if(special_die == "4dd6")
new /obj/item/dice/fourdd6(src)
if(special_die == "100")
new /obj/item/dice/d100(src)
var/picked = pick(special_die)
new picked(src)
/obj/item/storage/box/dice/suicide_act(mob/user)
/obj/item/storage/dice/suicide_act(mob/user)
user.visible_message("<span class='suicide'>[user] is gambling with death! It looks like [user.p_theyre()] trying to commit suicide!</span>")
return (OXYLOSS)
/*****************************Dice********************************/
/obj/item/dice //depreciated d6, use /obj/item/dice/d6 if you actually want a d6
name = "die"
desc = "A die with six sides. Basic and serviceable."
@@ -92,10 +92,17 @@
/obj/item/implant/hijack/proc/hijack_remotely(obj/machinery/power/apc/apc)
if (apc.hijacker || hijacking)
return FALSE //can't remotely hijack an already hijacked APC
if(apc.being_hijacked)
to_chat(imp_in, "<span class='warning'>This APC is already being hijacked!</span>")
return FALSE
apc.being_hijacked = TRUE
hijacking = TRUE
to_chat(imp_in, "<span class='notice'>Establishing remote connection with APC.</span>")
if (!do_after(imp_in, 4 SECONDS,target=apc))
to_chat(imp_in, "<span class='warning'>Aborting.</span>")
apc.being_hijacked = FALSE
hijacking = FALSE
return TRUE
if (LAZYLEN(imp_in.siliconaccessareas) >= HIJACK_APC_MAX_AMOUNT)
@@ -118,6 +125,7 @@
toggle_eyes()
else
to_chat(imp_in, "<span class='warning'>Aborting.</span>")
apc.being_hijacked = FALSE
hijacking = FALSE
imp_in.light_power = 0
imp_in.light_range = 0
+1 -1
View File
@@ -100,7 +100,7 @@
var/T = new item_path(mob)
var/item_name = initial(item_path.name)
var/where = mob.equip_in_one_of_slots(T, slots)
var/where = mob.equip_in_one_of_slots(T, slots, critical = TRUE)
if(!where)
to_chat(mob, "<span class='userdanger'>Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).</span>")
return 0
@@ -75,7 +75,7 @@
var/T = new item_path(H)
var/item_name = initial(item_path.name)
var/where = H.equip_in_one_of_slots(T, slots)
var/where = H.equip_in_one_of_slots(T, slots, critical = TRUE)
if(!where)
to_chat(H, "<span class='userdanger'>Unfortunately, you weren't able to get a [item_name]. This is very bad and you should adminhelp immediately (press F1).</span>")
return FALSE
@@ -131,14 +131,14 @@
"left pocket" = SLOT_L_STORE,
"right pocket" = SLOT_R_STORE
)
var/where = H.equip_in_one_of_slots(O, slots)
var/where = H.equip_in_one_of_slots(O, slots, critical = TRUE)
if (!where)
to_chat(H, "The Syndicate were unfortunately unable to get you the AI module.")
else
to_chat(H, "Use the AI board in your [where] to take control of the AI, as requested by the Syndicate.")
// Give the implant converter
var/obj/item/overthrow_converter/I = new(H)
where = H.equip_in_one_of_slots(I, slots)
where = H.equip_in_one_of_slots(I, slots, critical = TRUE)
if (!where)
to_chat(H, "The Syndicate were unfortunately unable to get you a converter implant.")
else
@@ -251,7 +251,7 @@
"left pocket" = SLOT_L_STORE,
"right pocket" = SLOT_R_STORE
)
var/where = H.equip_in_one_of_slots(T, slots)
var/where = H.equip_in_one_of_slots(T, slots, critical = TRUE)
if (!where)
to_chat(H, "The Syndicate were unfortunately unable to get you a flash.")
else
@@ -212,7 +212,7 @@
)
var/where = "At your feet"
var/equipped_slot = mob.equip_in_one_of_slots(folder, slots)
var/equipped_slot = mob.equip_in_one_of_slots(folder, slots, critical = TRUE)
if (equipped_slot)
where = "In your [equipped_slot]"
to_chat(mob, "<BR><BR><span class='info'>[where] is a folder containing <b>secret documents</b> that another Syndicate group wants. We have set up a meeting with one of their agents on station to make an exchange. Exercise extreme caution as they cannot be trusted and may be hostile.</span><BR>")
@@ -237,12 +237,21 @@
. += "<span class='notice'>Alt-click to [locked ? "unlock" : "lock"] the interface.</span>"
/obj/machinery/airalarm/ui_status(mob/user)
if(hasSiliconAccessInArea(user) && aidisabled)
to_chat(user, "AI control has been disabled.")
else if(!shorted)
if(hasSiliconAccessInArea(user))
if(aidisabled)
to_chat(user, "AI control has been disabled")
return UI_CLOSE
else if(!issilicon(user)) //True sillycones use ..()
return UI_INTERACTIVE
if(!shorted)
return ..()
return UI_CLOSE
/obj/machinery/airalarm/can_interact(mob/user)
. = ..()
if (!issilicon(user) && hasSiliconAccessInArea(user))
return TRUE
/obj/machinery/airalarm/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
+2 -2
View File
@@ -74,7 +74,7 @@
actions_types = list(/datum/action/item_action/adjust)
visor_flags_inv = HIDEFACE
dog_fashion = /datum/dog_fashion/head/clown
var/static/list/clownmask_designs = list()
var/static/list/clownmask_designs
/obj/item/clothing/mask/gas/clown_hat/Initialize(mapload)
.=..()
@@ -131,7 +131,7 @@
resistance_flags = FLAMMABLE
actions_types = list(/datum/action/item_action/adjust)
visor_flags_inv = HIDEFACE
var/static/list/mimemask_designs = list()
var/static/list/mimemask_designs
/obj/item/clothing/mask/gas/mime/examine(mob/user)
. = ..()
@@ -199,6 +199,15 @@
can_adjust = FALSE
mutantrace_variation = STYLE_DIGITIGRADE|STYLE_NO_ANTHRO_ICON
/obj/item/clothing/under/rank/civilian/janitor/maid/polychromic
icon_state = "polymaid"
item_state = "polymaid"
var/list/poly_colors = list("#FFFFFF", "#000000")
/obj/item/clothing/under/rank/civilian/janitor/maid/polychromic/ComponentInitialize()
. = ..()
AddElement(/datum/element/polychromic, poly_colors, 2)
/obj/item/clothing/under/rank/civilian/lawyer
desc = "Slick threads."
name = "Lawyer suit"
+7 -1
View File
@@ -44,7 +44,13 @@
priority_announce("Localized energetic flux wave detected on long range scanners. Expected location of impact: [impact_area.name].", "Anomaly Alert")
/datum/round_event/anomaly/start()
var/turf/T = pick(get_area_turfs(impact_area))
var/list/turf/valid = list()
for(var/i in get_area_turfs(impact_area))
var/turf/T = i
if(T.density)
continue
valid += T
var/turf/T = pick(valid)
var/newAnomaly
if(T)
newAnomaly = new anomaly_path(T)
+2 -1
View File
@@ -219,7 +219,7 @@
suit_type = /obj/item/clothing/suit/space
helmet_type = /obj/item/clothing/head/helmet/space
mask_type = /obj/item/clothing/mask/breath
storage_type = /obj/item/tank/internals/oxygen
storage_type = /obj/item/tank/jetpack/void
/obj/machinery/loot_locator
@@ -275,6 +275,7 @@
/obj/machinery/computer/piratepad_control
name = "cargo hold control terminal"
resistance_flags = INDESTRUCTIBLE
ui_x = 600
ui_y = 230
var/status_report = "Ready for delivery."
@@ -651,6 +651,11 @@
icon_state = "setup_small_pda"
desc = "It's a case, for building small electronics with. This one resembles a PDA."
/obj/item/electronic_assembly/dildo
name = "type-g electronic assembly"
icon_state = "setup_dildo_medium"
desc = "It's a case, for building small electronics with. This one has a phallic design."
/obj/item/electronic_assembly/small
name = "electronic device"
icon_state = "setup_device"
@@ -682,6 +687,11 @@
icon_state = "setup_device_box"
desc = "It's a case, for building tiny-sized electronics with. This one has a boxy design."
/obj/item/electronic_assembly/small/dildo
name = "type-f electronic device"
icon_state = "setup_dildo_small"
desc = "It's a case, for building tiny-sized electronics with. This one has a phallic design."
/obj/item/electronic_assembly/medium
name = "electronic mechanism"
icon_state = "setup_medium"
@@ -722,6 +732,12 @@
icon_state = "setup_medium_radio"
desc = "It's a case, for building medium-sized electronics with. This one resembles an old radio."
/obj/item/electronic_assembly/medium/dildo
name = "type-g electronic mechanism"
icon_state = "setup_dildo_large"
desc = "It's a case, for building medium-sized electronics with. This one has a phallic design."
/obj/item/electronic_assembly/large
name = "electronic machine"
icon_state = "setup_large"
@@ -115,10 +115,10 @@
source_air = air_contents
// Move gas from one place to another
move_gas(source_air, target_air)
move_gas(source_air, target_air, (istype(target, /obj/item/tank) ? target : null))
air_update_turf()
/obj/item/integrated_circuit/atmospherics/pump/proc/move_gas(datum/gas_mixture/source_air, datum/gas_mixture/target_air)
/obj/item/integrated_circuit/atmospherics/pump/proc/move_gas(datum/gas_mixture/source_air, datum/gas_mixture/target_air, obj/item/tank/snowflake)
// No moles = nothing to pump
if(source_air.total_moles() <= 0 || target_air.return_pressure() >= PUMP_MAX_PRESSURE)
@@ -132,7 +132,10 @@
if(pressure_delta > 0.1)
var/transfer_moles = (pressure_delta*target_air.return_volume()/(source_air.return_temperature() * R_IDEAL_GAS_EQUATION))*PUMP_EFFICIENCY
var/datum/gas_mixture/removed = source_air.remove(transfer_moles)
target_air.merge(removed)
if(istype(snowflake)) //Snowflake check for tanks specifically, because tank ruptures are handled in a very snowflakey way that expects all tank interactions to be handled via the tank's procs
snowflake.assume_air(removed)
else
target_air.merge(removed)
// - volume pump - // **Works**
@@ -165,7 +168,7 @@
direction = SOURCE_TO_TARGET
target_pressure = min(PUMP_MAX_VOLUME,abs(new_amount))
/obj/item/integrated_circuit/atmospherics/pump/volume/move_gas(datum/gas_mixture/source_air, datum/gas_mixture/target_air)
/obj/item/integrated_circuit/atmospherics/pump/volume/move_gas(datum/gas_mixture/source_air, datum/gas_mixture/target_air, obj/item/tank/snowflake)
// No moles = nothing to pump
if(source_air.total_moles() <= 0)
return
@@ -182,7 +185,10 @@
var/datum/gas_mixture/removed = source_air.remove_ratio(transfer_ratio * PUMP_EFFICIENCY)
target_air.merge(removed)
if(istype(snowflake))
snowflake.assume_air(removed)
else
target_air.merge(removed)
// - gas vent - // **works**
@@ -379,9 +385,20 @@ obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir()
removed.set_moles(filtered_gas, 0)
//Check if the pressure is high enough to put stuff in filtered, or else just put it back in the source
var/datum/gas_mixture/target = (filtered_air.return_pressure() < target_pressure ? filtered_air : source_air)
target.merge(filtered_out)
contaminated_air.merge(removed)
if(filtered_air.return_pressure() < target_pressure)
if(istype(filtered, /obj/item/tank))
filtered.assume_air(filtered_out)
else
filtered_air.merge(filtered_out)
else
if(istype(source, /obj/item/tank))
source.assume_air(filtered_out)
else
source_air.merge(filtered_out)
if(istype(contaminants, /obj/item/tank))
contaminants.assume_air(removed)
else
contaminated_air.merge(removed)
/obj/item/integrated_circuit/atmospherics/pump/filter/Initialize()
@@ -449,10 +466,18 @@ obj/item/integrated_circuit/atmospherics/connector/portableConnectorReturnAir()
if(transfer_moles <= 0)
return
var/snowflakecheck = istype(gas_output, /obj/item/tank)
var/datum/gas_mixture/mix = source_1_gases.remove(transfer_moles * gas_percentage)
output_gases.merge(mix)
if(snowflakecheck)
gas_output.assume_air(mix)
else
output_gases.merge(mix)
mix = source_2_gases.remove(transfer_moles * (1-gas_percentage))
output_gases.merge(mix)
if(snowflakecheck)
gas_output.assume_air(mix)
else
output_gases.merge(mix)
// - integrated tank - // **works**
-11
View File
@@ -5,17 +5,6 @@
/datum/keybinding/human/can_use(client/user)
return ishuman(user.mob)
/datum/keybinding/human/quick_equip
hotkey_keys = list("E")
name = "quick_equip"
full_name = "Quick Equip"
description = "Quickly puts an item in the best slot available"
/datum/keybinding/human/quick_equip/down(client/user)
var/mob/living/carbon/human/H = user.mob
H.quick_equip()
return TRUE
/datum/keybinding/human/quick_equipbelt
hotkey_keys = list("ShiftE")
name = "quick_equipbelt"
@@ -5,6 +5,17 @@
/datum/keybinding/living/can_use(client/user)
return isliving(user.mob)
/datum/keybinding/living/quick_equip
hotkey_keys = list("E")
name = "quick_equip"
full_name = "Quick Equip"
description = "Quickly puts an item in the best slot available"
/datum/keybinding/living/quick_equip/down(client/user)
var/mob/living/carbon/human/H = user.mob
H.quick_equip()
return TRUE
/datum/keybinding/living/resist
hotkey_keys = list("B")
name = "resist"
-14
View File
@@ -59,17 +59,3 @@
var/mob/living/silicon/robot/R = user.mob
R.uneq_active()
return TRUE
/datum/keybinding/robot/drone/can_use(client/user)
return isdrone(user.mob)
/datum/keybinding/robot/drone/quick_equip_drone // QOL: Drone quickequip
hotkey_keys = list("E")
name = "quick_equip_drone"
full_name = "Quick Equip (Drone)"
description = "Quickly puts an item in the best slot available"
/datum/keybinding/robot/drone/quick_equip_drone/down(client/user)
var/mob/living/simple_animal/drone/D = user.mob
D.quick_equip()
return TRUE
@@ -202,7 +202,7 @@
var/obj/item/reagent_containers/food/snacks/donkpocket/warm/W = new(src)
load(W)
if(prob(50))
var/obj/item/storage/box/dice/D = new(src)
var/obj/item/storage/dice/D = new(src)
load(D)
else
var/obj/item/instrument/guitar/G = new(src)
@@ -109,9 +109,12 @@ GLOBAL_LIST(labor_sheet_values)
qdel(src)
/obj/machinery/mineral/labor_claim_console/emag_act(mob/user)
if(!(obj_flags & EMAGGED))
obj_flags |= EMAGGED
to_chat(user, "<span class='warning'>PZZTTPFFFT</span>")
. = ..()
if((obj_flags & EMAGGED))
return
obj_flags |= EMAGGED
to_chat(user, "<span class='warning'>PZZTTPFFFT</span>")
return TRUE
/**********************Prisoner Collection Unit**************************/
@@ -760,6 +760,7 @@
/obj/item/melee/transforming/cleaving_saw
name = "cleaving saw"
desc = "This saw, effective at drawing the blood of beasts, transforms into a long cleaver that makes use of centrifugal force."
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
force = 12
force_on = 20 //force when active
throwforce = 20
@@ -1177,6 +1178,7 @@
/obj/item/gun/ballistic/revolver/doublebarrel/super
name = "super combat shotgun"
desc = "From the belly of the beast - or rather, demon. Twice as lethal as a less-than-super shotgun, but a tad bulkier."
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
icon_state = "heckgun"
slot_flags = null
mag_type = /obj/item/ammo_box/magazine/internal/shot/dual/heck
@@ -1207,6 +1209,7 @@
/obj/item/hierophant_club
name = "hierophant club"
desc = "The strange technology of this large club allows various nigh-magical feats. It used to beat you, but now you can set the beat."
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
icon_state = "hierophant_club_ready_beacon"
item_state = "hierophant_club_ready_beacon"
icon = 'icons/obj/lavaland/artefacts.dmi'
@@ -651,11 +651,11 @@
name = "Fennec"
icon_state = "fennec"
/datum/sprite_accessory/tails/mam_tails/human/fish
/datum/sprite_accessory/tails/mam_tails/fish
name = "Fish"
icon_state = "fish"
/datum/sprite_accessory/tails_animated/mam_tails_animated/human/fish
/datum/sprite_accessory/tails_animated/mam_tails_animated/fish
name = "Fish"
icon_state = "fish"
@@ -212,6 +212,7 @@
// called when something steps onto a human
// this could be made more general, but for now just handle mulebot
/mob/living/carbon/human/Crossed(atom/movable/AM)
..()
var/mob/living/simple_animal/bot/mulebot/MB = AM
if(istype(MB))
MB.RunOver(src)
@@ -1,4 +1,6 @@
/mob/living/carbon/human/getarmor(def_zone, type)
if(HAS_TRAIT(src, TRAIT_ARMOR_BROKEN)) //trait that makes it act as if you have no armor at all, you take natural damage from all sources
return 0
var/armorval = 0
var/organnum = 0
@@ -18,7 +20,6 @@
organnum++
return (armorval/max(organnum, 1))
/mob/living/carbon/human/proc/checkarmor(obj/item/bodypart/def_zone, d_type)
if(!d_type || !def_zone)
return 0
@@ -668,7 +668,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
H.remove_overlay(BODY_FRONT_LAYER)
H.remove_overlay(HORNS_LAYER)
if(!mutant_bodyparts)
if(!length(mutant_bodyparts))
return
var/tauric = mutant_bodyparts["taur"] && H.dna.features["taur"] && H.dna.features["taur"] != "None"
@@ -714,18 +714,25 @@
return FALSE
/datum/action/innate/slime_puddle/Activate()
var/mob/living/carbon/human/H = owner
//if they have anything stuck to their hands, we immediately say 'no' and return
for(var/obj/item/I in H.held_items)
if(HAS_TRAIT(I, TRAIT_NODROP))
to_chat(owner, "There's something stuck to your hand, stopping you from transforming!")
return
if(isjellyperson(owner) && IsAvailable())
transforming = TRUE
UpdateButtonIcon()
var/mob/living/carbon/human/H = owner
var/mutcolor = "#" + H.dna.features["mcolor"]
if(!is_puddle)
if(CHECK_MOBILITY(H, MOBILITY_USE))
is_puddle = TRUE
owner.cut_overlays()
if(CHECK_MOBILITY(H, MOBILITY_USE)) //if we can use items, we can turn into a puddle
is_puddle = TRUE //so we know which transformation to use when its used
owner.cut_overlays() //we dont show our normal sprite, we show a puddle sprite
var/obj/effect/puddle_effect = new puddle_into_effect(get_turf(owner), owner.dir)
puddle_effect.color = mutcolor
H.Stun(in_transformation_duration, ignore_canstun = TRUE)
H.Stun(in_transformation_duration, ignore_canstun = TRUE) //cant move while transforming
//series of traits that make up the puddle behaviour
ADD_TRAIT(H, TRAIT_PARALYSIS_L_ARM, SLIMEPUDDLE_TRAIT)
ADD_TRAIT(H, TRAIT_PARALYSIS_R_ARM, SLIMEPUDDLE_TRAIT)
ADD_TRAIT(H, TRAIT_MOBILITY_NOPICKUP, SLIMEPUDDLE_TRAIT)
@@ -733,19 +740,30 @@
ADD_TRAIT(H, TRAIT_SPRINT_LOCKED, SLIMEPUDDLE_TRAIT)
ADD_TRAIT(H, TRAIT_COMBAT_MODE_LOCKED, SLIMEPUDDLE_TRAIT)
ADD_TRAIT(H, TRAIT_MOBILITY_NOREST, SLIMEPUDDLE_TRAIT)
ADD_TRAIT(H, TRAIT_ARMOR_BROKEN, SLIMEPUDDLE_TRAIT)
H.update_disabled_bodyparts(silent = TRUE) //silently update arms to be paralysed
H.add_movespeed_modifier(/datum/movespeed_modifier/slime_puddle)
H.update_disabled_bodyparts(silent = TRUE)
H.layer -= 1 //go one layer down so people go over you
ENABLE_BITFIELD(H.pass_flags, PASSMOB)
squeak = H.AddComponent(/datum/component/squeak, custom_sounds = list('sound/effects/blobattack.ogg'))
sleep(in_transformation_duration)
ENABLE_BITFIELD(H.pass_flags, PASSMOB) //this actually lets people pass over you
squeak = H.AddComponent(/datum/component/squeak, custom_sounds = list('sound/effects/blobattack.ogg')) //blorble noise when people step on you
//if the user is a changeling, retract their sting
H.unset_sting()
sleep(in_transformation_duration) //wait for animation to end
//set the puddle overlay up
var/mutable_appearance/puddle_overlay = mutable_appearance(icon = puddle_icon, icon_state = puddle_state)
puddle_overlay.color = mutcolor
tracked_overlay = puddle_overlay
owner.add_overlay(puddle_overlay)
transforming = FALSE
UpdateButtonIcon()
else
//like the above, but reverse everything done!
owner.cut_overlay(tracked_overlay)
var/obj/effect/puddle_effect = new puddle_from_effect(get_turf(owner), owner.dir)
puddle_effect.color = mutcolor
@@ -758,6 +776,7 @@
REMOVE_TRAIT(H, TRAIT_SPRINT_LOCKED, SLIMEPUDDLE_TRAIT)
REMOVE_TRAIT(H, TRAIT_COMBAT_MODE_LOCKED, SLIMEPUDDLE_TRAIT)
REMOVE_TRAIT(H, TRAIT_MOBILITY_NOREST, SLIMEPUDDLE_TRAIT)
REMOVE_TRAIT(H, TRAIT_ARMOR_BROKEN, SLIMEPUDDLE_TRAIT)
H.update_disabled_bodyparts(silent = TRUE)
H.remove_movespeed_modifier(/datum/movespeed_modifier/slime_puddle)
H.layer += 1 //go one layer back above!
@@ -15,8 +15,13 @@
skinned_type = /obj/item/stack/sheet/animalhide/human
var/info_text = "You are a <span class='danger'>Vampire</span>. You will slowly but constantly lose blood if outside of a coffin. If inside a coffin, you will slowly heal. You may gain more blood by grabbing a live victim and using your drain ability."
species_category = SPECIES_CATEGORY_UNDEAD
var/batform_enabled = TRUE
/datum/species/vampire/check_roundstart_eligible()
/datum/species/vampire/roundstart
id = SPECIES_VAMPIRE_WEAK
batform_enabled = FALSE
/datum/species/vampire/roundstart/check_roundstart_eligible()
if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
return TRUE
return FALSE
@@ -27,8 +32,9 @@
if(!C.dna.skin_tone_override)
C.skin_tone = "albino"
C.update_body(0)
var/obj/effect/proc_holder/spell/targeted/shapeshift/bat/B = new
C.AddSpell(B)
if(batform_enabled)
var/obj/effect/proc_holder/spell/targeted/shapeshift/bat/B = new
C.AddSpell(B)
/datum/species/vampire/on_species_loss(mob/living/carbon/C)
. = ..()
+20 -1
View File
@@ -14,10 +14,29 @@
return legcuffed
return null
/mob/living/carbon/proc/equip_in_one_of_slots(obj/item/I, list/slots, qdel_on_fail = 1)
/mob/living/carbon/proc/equip_in_one_of_slots(obj/item/I, list/slots, qdel_on_fail = 1, critical = FALSE)
for(var/slot in slots)
if(equip_to_slot_if_possible(I, slots[slot], qdel_on_fail = 0, disable_warning = TRUE))
return slot
if(critical) //it is CRITICAL they get this item, no matter what
//do they have a backpack?
var/obj/item/backpack = get_item_by_slot(SLOT_BACK)
if(!backpack)
//nothing on their back
backpack = new /obj/item/storage/backpack(get_turf(src))
if(equip_to_slot(backpack, SLOT_BACK)) //worst-case-scenario, something that shouldnt wear a backpack gets one
I.forceMove(backpack)
return SLOT_BACK
else if(istype(backpack) && SEND_SIGNAL(backpack, COMSIG_CONTAINS_STORAGE))
//place it in here, regardless of storage capacity
I.forceMove(backpack)
return SLOT_BACK
else
//this should NEVER happen, but if it does, report it with the appropriate information
var/conclusion = qdel_on_fail ? "deleted" : "not moved, staying at current position [I.x], [I.y], [I.z]"
message_admins("User [src] failed to get item of critical importance: [I]. Result: item is [conclusion]")
//it's not dropped at their turf as this is generally un-safe for midround antags and we don't know their status
if(qdel_on_fail)
qdel(I)
return null
+1 -12
View File
@@ -443,6 +443,7 @@
key = "me"
key_third_person = "custom"
message = null
emote_type = EMOTE_BOTH
/datum/emote/living/custom/proc/check_invalid(mob/user, input)
if(stop_bad_mime.Find(input, 1, 1))
@@ -462,24 +463,12 @@
else if(!params)
var/custom_emote = stripped_multiline_input_or_reflect(user, "Choose an emote to display.", "Custom Emote", null, MAX_MESSAGE_LEN)
if(custom_emote && !check_invalid(user, custom_emote))
var/type = input("Is this a visible or hearable emote?") as null|anything in list("Visible", "Hearable")
switch(type)
if("Visible")
emote_type = EMOTE_VISIBLE
if("Hearable")
emote_type = EMOTE_AUDIBLE
else
alert("Unable to use this emote, must be either hearable or visible.")
return
message = custom_emote
else
message = params
if(type_override)
emote_type = type_override
message = user.say_emphasis(message)
. = ..()
message = null
emote_type = EMOTE_VISIBLE
/datum/emote/living/custom/replace_pronoun(mob/user, message)
return message
@@ -87,7 +87,7 @@ Difficulty: Medium
return FALSE
return ..()
/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, mob/target, target_message)
/mob/living/simple_animal/hostile/megafauna/dragon/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, mob/target, target_message, omni = FALSE)
if(swooping & SWOOP_INVULNERABLE) //to suppress attack messages without overriding every single proc that could send a message saying we got hit
return
return ..()
@@ -263,6 +263,7 @@ SHITCODE AHEAD. BE ADVISED. Also comment extravaganza
/obj/item/staff/storm
name = "staff of storms"
desc = "An ancient staff retrieved from the remains of Legion. The wind stirs as you move it."
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
icon_state = "staffofstorms"
item_state = "staffofstorms"
icon = 'icons/obj/guns/magic.dmi'
+22 -12
View File
@@ -127,8 +127,9 @@
* * ignored_mobs (optional) doesn't show any message to any given mob in the list.
* * target (optional) is the other mob involved with the visible message. For example, the attacker in many combat messages.
* * target_message (optional) is what the target mob will see e.g. "[src] does something to you!"
* * omni (optional) if TRUE, will show to users no matter what.
*/
/atom/proc/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, ignored_mobs, mob/target, target_message)
/atom/proc/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, ignored_mobs, mob/target, target_message, omni = FALSE)
var/turf/T = get_turf(src)
if(!T)
return
@@ -139,20 +140,26 @@
if(target_message && target && istype(target) && target.client)
hearers -= target
//This entire if/else chain could be in two lines but isn't for readibilties sake.
var/msg = target_message
if(target.see_invisible<invisibility) //if src is invisible to us,
msg = blind_message
//the light object is dark and not invisible to us, darkness does not matter if you're directly next to the target
else if(T.lighting_object && T.lighting_object.invisibility <= target.see_invisible && T.is_softly_lit() && !in_range(T,target))
msg = blind_message
if(msg)
target.show_message(msg, MSG_VISUAL,blind_message, MSG_AUDIBLE)
if(omni)
target.show_message(target_message)
else
//This entire if/else chain could be in two lines but isn't for readibilties sake.
var/msg = target_message
if(target.see_invisible<invisibility) //if src is invisible to us,
msg = blind_message
//the light object is dark and not invisible to us, darkness does not matter if you're directly next to the target
else if(T.lighting_object && T.lighting_object.invisibility <= target.see_invisible && T.is_softly_lit() && !in_range(T,target))
msg = blind_message
if(msg)
target.show_message(msg, MSG_VISUAL,blind_message, MSG_AUDIBLE)
if(self_message)
hearers -= src
for(var/mob/M in hearers)
if(!M.client)
continue
if(omni)
M.show_message(message)
continue
//This entire if/else chain could be in two lines but isn't for readibilties sake.
var/msg = message
//CITADEL EDIT, required for vore code to remove (T != loc && T != src)) as a check
@@ -167,10 +174,13 @@
M.show_message(msg, MSG_VISUAL,blind_message, MSG_AUDIBLE)
///Adds the functionality to self_message.
mob/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, mob/target, target_message)
/mob/visible_message(message, self_message, blind_message, vision_distance = DEFAULT_MESSAGE_RANGE, list/ignored_mobs, mob/target, target_message, omni = FALSE)
. = ..()
if(self_message && target != src)
show_message(self_message, MSG_VISUAL, blind_message, MSG_AUDIBLE)
if(!omni)
show_message(self_message, MSG_VISUAL, blind_message, MSG_AUDIBLE)
else
show_message(self_message)
/**
* Show a message to all mobs in earshot of this atom
+2 -18
View File
@@ -39,15 +39,6 @@ proc/get_top_level_mob(var/mob/S)
else if(!params)
var/subtle_emote = stripped_multiline_input_or_reflect(user, "Choose an emote to display.", "Subtle", null, MAX_MESSAGE_LEN)
if(subtle_emote && !check_invalid(user, subtle_emote))
var/type = input("Is this a visible or hearable emote?") as null|anything in list("Visible", "Hearable")
switch(type)
if("Visible")
emote_type = EMOTE_VISIBLE
if("Hearable")
emote_type = EMOTE_AUDIBLE
else
alert("Unable to use this emote, must be either hearable or visible.")
return
message = subtle_emote
else
return FALSE
@@ -69,11 +60,7 @@ proc/get_top_level_mob(var/mob/S)
if(M.stat == DEAD && M.client && (M.client.prefs.chat_toggles & CHAT_GHOSTSIGHT) && !(M in viewers(T, null)))
M.show_message(message)
if(emote_type == EMOTE_AUDIBLE)
user.audible_message(message=message,hearing_distance=1)
else
user.visible_message(message=message,self_message=message,vision_distance=1)
user.visible_message(message = message, self_message = message, vision_distance = 1, omni = TRUE)
///////////////// SUBTLE 2: NO GHOST BOOGALOO
@@ -122,10 +109,7 @@ proc/get_top_level_mob(var/mob/S)
user.log_message(message, LOG_SUBTLER)
message = "<b>[user]</b> " + "<i>[user.say_emphasis(message)]</i>"
if(emote_type == EMOTE_AUDIBLE)
user.audible_message(message=message,hearing_distance=1, ignored_mobs = GLOB.dead_mob_list)
else
user.visible_message(message=message,self_message=message,vision_distance=1, ignored_mobs = GLOB.dead_mob_list)
user.visible_message(message = message, self_message = message, vision_distance = 1, ignored_mobs = GLOB.dead_mob_list, omni = TRUE)
///////////////// VERB CODE
/mob/living/verb/subtle()
+2 -1
View File
@@ -20,5 +20,6 @@
flags = IGNORE_NOSLOW
/datum/movespeed_modifier/slime_puddle
multiplicative_slowdown = 2
multiplicative_slowdown = 4.5
flags = IGNORE_NOSLOW
variable = TRUE
+11 -1
View File
@@ -111,6 +111,7 @@
var/obj/machinery/computer/apc_control/remote_control = null
var/mob/living/carbon/hijacker
var/hijackerlast = TRUE
var/being_hijacked = FALSE
/obj/machinery/power/apc/unlocked
locked = FALSE
@@ -902,7 +903,7 @@
if(H && !H.stealthmode && H.toggled)
abilitiesavail = TRUE
var/list/data = list(
"locked" = locked,
"locked" = locked && !(integration_cog && is_servant_of_ratvar(user)) && !area.hasSiliconAccessInArea(user, PRIVILEDGES_SILICON|PRIVILEDGES_DRONE),
"failTime" = failure_timer,
"isOperating" = operating,
"externalPower" = main_status,
@@ -1119,10 +1120,14 @@
/obj/machinery/power/apc/proc/hijack(mob/living/L)
if (!istype(L))
return
if(being_hijacked)
to_chat(L, "<span class='warning'>This APC is already being hijacked!</span>")
return
if (hijacker && hijacker != L)
var/obj/item/implant/hijack/H = L.getImplant(/obj/item/implant/hijack)
to_chat(L, "<span class='warning'>Someone already has control of this APC. Beginning counter-hijack.</span>")
H.hijacking = TRUE
being_hijacked = TRUE
if (do_after(L,20 SECONDS,target=src))
hijacker.toggleSiliconAccessArea(area)
if (L.toggleSiliconAccessArea(area))
@@ -1130,23 +1135,28 @@
update_icon()
set_hijacked_lighting()
H.hijacking = FALSE
being_hijacked = FALSE
return
else
to_chat(L, "<span class='warning'>Aborting.</span>")
H.hijacking = FALSE
being_hijacked = FALSE
return
to_chat(L, "<span class='notice'>Beginning hijack of APC.</span>")
var/obj/item/implant/hijack/H = L.getImplant(/obj/item/implant/hijack)
H.hijacking = TRUE
being_hijacked = TRUE
if (do_after(L,H.stealthmode ? 12 SECONDS : 5 SECONDS,target=src))
if (L.toggleSiliconAccessArea(area))
hijacker = L
update_icon()
set_hijacked_lighting()
H.hijacking = FALSE
being_hijacked = FALSE
else
to_chat(L, "<span class='warning'>Aborting.</span>")
H.hijacking = FALSE
being_hijacked = FALSE
return
/obj/machinery/power/apc/proc/malfhack(mob/living/silicon/ai/malf)
@@ -329,7 +329,7 @@
/obj/item/gun/ballistic/revolver/doublebarrel/improvised
name = "improvised shotgun"
desc = "A shoddy break-action breechloaded shotgun. Its lacklustre construction shows in its lesser effectiveness."
desc = "A shoddy break-action breechloaded shotgun. Less ammo-efficient than an actual shotgun, but still packs a punch."
icon_state = "ishotgun"
item_state = "shotgun"
w_class = WEIGHT_CLASS_BULKY
@@ -339,7 +339,6 @@
mag_type = /obj/item/ammo_box/magazine/internal/shot/improvised
sawn_desc = "I'm just here for the gasoline."
unique_reskin = null
projectile_damage_multiplier = 0.9
var/slung = FALSE
/obj/item/gun/ballistic/revolver/doublebarrel/improvised/attackby(obj/item/A, mob/user, params)
@@ -970,7 +970,7 @@
M.emote("gasp")
log_combat(M, M, "revived", src)
var/list/policies = CONFIG_GET(keyed_list/policyconfig)
var/timelimit = CONFIG_GET(number/defib_cmd_time_limit)
var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds
var/late = timelimit && (tplus > timelimit)
var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT]
if(policy)
@@ -1321,7 +1321,7 @@
pH = 11
value = REAGENT_VALUE_COMMON //not any higher. Ambrosia is a milestone for hydroponics already.
//Earthsblood is still a wonderdrug. Just... don't expect to be able to mutate something that makes plants so healthy.
/datum/reagent/medicine/earthsblood/on_hydroponics_apply(obj/item/seeds/myseed, datum/reagents/chems, obj/machinery/hydroponics/mytray, mob/user)
. = ..()
@@ -1335,7 +1335,7 @@
myseed.adjust_yield(round(chems.get_reagent_amount(src.type) * 1))
myseed.adjust_endurance(round(chems.get_reagent_amount(src.type) * 0.5))
myseed.adjust_production(-round(chems.get_reagent_amount(src.type) * 0.5))
/datum/reagent/medicine/earthsblood/on_mob_life(mob/living/carbon/M)
M.adjustBruteLoss(-3 * REM, FALSE)
M.adjustFireLoss(-3 * REM, FALSE)
+1 -1
View File
@@ -132,7 +132,7 @@
lich.real_name = mind.name
mind.transfer_to(lich)
mind.grab_ghost(force=TRUE)
lich.hardset_dna(null,null,null,lich.real_name,null, new /datum/species/skeleton)
lich.hardset_dna(null,null,null,lich.real_name,null, new /datum/species/skeleton/space)
to_chat(lich, "<span class='warning'>Your bones clatter and shudder as you are pulled back into this world!</span>")
var/turf/body_turf = get_turf(old_body)
lich.DefaultCombatKnockdown(200 + 200*resurrections)
+1 -1
View File
@@ -70,7 +70,7 @@
if(O.organ_flags & ORGAN_FAILING)
O.applyOrganDamage(-5)
var/list/policies = CONFIG_GET(keyed_list/policyconfig)
var/timelimit = CONFIG_GET(number/defib_cmd_time_limit)
var/timelimit = CONFIG_GET(number/defib_cmd_time_limit) * 10 //the config is in seconds, not deciseconds
var/late = timelimit && (tplus > timelimit)
var/policy = late? policies[POLICYCONFIG_ON_DEFIB_LATE] : policies[POLICYCONFIG_ON_DEFIB_INTACT]
if(policy)
+1
View File
@@ -181,6 +181,7 @@
/obj/item/clothing/under/pants/mustangjeans = 3,
/obj/item/clothing/neck/necklace/dope = 5,
/obj/item/clothing/suit/jacket/letterman_nanotrasen = 5,
/obj/item/clothing/under/misc/corporateuniform = 5,
/obj/item/clothing/suit/hooded/wintercoat/polychromic = 5)
refill_canister = /obj/item/vending_refill/clothing
default_price = PRICE_CHEAP
+1 -1
View File
@@ -4,7 +4,7 @@
product_ads = "Escape to a fantasy world!;Fuel your gambling addiction!;Ruin your friendships!;Roll for initiative!;Elves and dwarves!;Paranoid computers!;Totally not satanic!;Fun times forever!"
icon_state = "games"
products = list(/obj/item/toy/cards/deck = 5,
/obj/item/storage/box/dice = 10,
/obj/item/storage/dice = 10,
/obj/item/toy/cards/deck/cas = 3,
/obj/item/toy/cards/deck/cas/black = 3,
/obj/item/toy/cards/deck/unum = 3)
+2 -2
View File
@@ -408,7 +408,7 @@ ALLOW_MAP_VOTING 1
## APPROVAL (can vote for as many as you want), I
## IRV (vote by ranked choice, winner determined by instant runoff algorithm)
## SCORE (give individual rankings of each choice, winner determined by majority judgement algorithm)
MAP_VOTE_TYPE SCORE
MAP_VOTE_TYPE APPROVAL
## Map rotate chance delta
## This is the chance of map rotation factored to the round length.
@@ -519,7 +519,7 @@ DEFAULT_VIEW 21x15
### NOTE FOR LINUX HOSTS: This requires manual setup of iptables. Beware that improper configuration of this can and will irreversibly fuck up a server, so please don't tinker with it if you don't know what you're doing.
## Enabled
#FAIL2TOPIC_ENABLED
## Minimum wait time in deciseconds between valid requests
## Minimum wait time in deciseconds between valid requests
FAIL2TOPIC_RATE_LIMIT 10
## Number of requests after breaching rate limit that triggers a ban
FAIL2TOPIC_MAX_FAILS 5
@@ -0,0 +1,8 @@
author: "timothyteakettle"
delete-after: True
changes:
- tweak: "changeling stings retract upon turning into a slime puddle"
- tweak: "you cannot transform into a slime puddle with a no drop item in your hands"
- tweak: "slime puddles are now transparent and their colour looks more natural in comparison to the user"
- tweak: "slime puddles are now even slower"
- tweak: "slime puddles now get no protection from worn clothing"
@@ -0,0 +1,4 @@
author: "Putnam3145"
delete-after: True
changes:
- rscadd: "Stat panel UI for ranked choice votes"
@@ -0,0 +1,4 @@
author: "Putnam3145"
delete-after: True
changes:
- code_imp: "Vote system #defines are now strings"
@@ -0,0 +1,4 @@
author: "timothyteakettle"
delete-after: True
changes:
- tweak: "antag items are now of critical importance and wont fail to be placed on the character"
@@ -0,0 +1,5 @@
author: "kappa-sama"
delete-after: True
changes:
- tweak: "ishotgun crafting recipe no longer requires plasteel and is slightly more convenient"
- balance: "ishotgun does 45 damage now instead of 40.5"
@@ -0,0 +1,4 @@
author: "Trilbyspaceclone"
delete-after: True
changes:
- rscadd: "the corporate unifoms can now be gotton in the clothing mate vender"
@@ -0,0 +1,4 @@
author: "timothyteakettle"
delete-after: True
changes:
- rscadd: "polychromic maid outfit"
@@ -0,0 +1,4 @@
author: "MrJWhit"
delete-after: True
changes:
- rscadd: "Expanded space hermit base"
@@ -0,0 +1,4 @@
author: "Ghommie"
delete-after: True
changes:
- bugfix: "You can access the mime / clown mask skins radial menu once again."
@@ -0,0 +1,4 @@
author: "zeroisthebiggay"
delete-after: True
changes:
- balance: "MEGAFAUNA DROPS ARE LAVAPROOF"
@@ -0,0 +1,8 @@
author: "Ghommie"
delete-after: True
changes:
- bugfix: "Dice bags no longer act like cardboard boxes."
- bugfix: "Abductors should be no longer mute."
- bugfix: "Item action buttons should now properly show the item current overlays, most times."
- bugfix: "The blackbox should now go into your hand slot when pried out, rather than tumbling on the ground everytime."
- tweak: "The Quick Equip hotkey is now usable by all living mobs (so long they have hands and equipment slots)"
@@ -0,0 +1,4 @@
author: "silicons"
delete-after: True
changes:
- rscdel: "anomalies no longer spawn in walls"
@@ -0,0 +1,4 @@
author: "timothyteakettle"
delete-after: True
changes:
- bugfix: "time for memory loss message to show up when being revived is now correctly 300 seconds, instead of 30"
@@ -0,0 +1,4 @@
author: "ArchieBeepBoop"
delete-after: True
changes:
- bugfix: "Outlet Injector Mapping Asset Layer Fix"
@@ -0,0 +1,4 @@
author: "SiliconMain"
delete-after: True
changes:
- tweak: "Engi department has gas masks in loadout"
@@ -0,0 +1,4 @@
author: "zeroisthebiggay"
delete-after: True
changes:
- bugfix: "jacqueline spawns on boxstation"
@@ -0,0 +1,13 @@
author: "DeltaFire15"
delete-after: True
changes:
- bugfix: "The 'Your body is in a cloner' notification works again"
- bugfix: "Hijack implants should work properly again (or, at least better)"
- bugfix: "Liches are now good skeletons again instead of weak ones"
- bugfix: "The piratepad control cannot be destroyed again."
- bugfix: "Pirates have received new supplies of jetpacks instead of useless oxygen tanks"
- bugfix: "Ratvarian AIs are once again able to show their linked borgs Ratvar's light"
- bugfix: "Hijackers are once again unable to detonate borgs without being adjacent to the console"
- bugfix: "Automated annoucement systems and gulag ore consoles no longer waste emag charges"
- bugfix: "Automated announcement systems once again can be remote controlled by non-AIs with silicon access"
- bugfix: "APCs being hijacked multiple times at once is no longer possible, preventing some issues"
Binary file not shown.

Before

Width:  |  Height:  |  Size: 442 KiB

After

Width:  |  Height:  |  Size: 454 KiB

BIN
View File
Binary file not shown.

Before

Width:  |  Height:  |  Size: 287 KiB

After

Width:  |  Height:  |  Size: 287 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 128 KiB

After

Width:  |  Height:  |  Size: 130 KiB

@@ -12,7 +12,7 @@
/datum/gear/hands/dice
name = "Dice bag"
path = /obj/item/storage/box/dice
path = /obj/item/storage/dice
/datum/gear/hands/eightball
name = "Magic eightball"

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