Merge branch 'master' of https://github.com/Citadel-Station-13/Citadel-Station-13 into antag-overhaul
This commit is contained in:
@@ -6672,12 +6672,6 @@
|
||||
/obj/structure/closet/emcloset,
|
||||
/turf/open/floor/plating,
|
||||
/area/maintenance/port/fore)
|
||||
"aoZ" = (
|
||||
/obj/machinery/atmospherics/components/binary/valve/digital{
|
||||
name = "Waste Release"
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/atmos)
|
||||
"apa" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/green/visible{
|
||||
dir = 4
|
||||
@@ -6916,7 +6910,7 @@
|
||||
/turf/open/floor/plasteel,
|
||||
/area/janitor)
|
||||
"apI" = (
|
||||
/obj/machinery/atmospherics/components/unary/outlet_injector/atmos/atmos_waste{
|
||||
/obj/machinery/atmospherics/components/unary/relief_valve/atmos/atmos_waste{
|
||||
dir = 1
|
||||
},
|
||||
/obj/structure/lattice/catwalk,
|
||||
@@ -25394,6 +25388,7 @@
|
||||
/obj/structure/sign/poster/official/state_laws{
|
||||
pixel_y = -32
|
||||
},
|
||||
/obj/effect/landmark/start/cyborg,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/robotics/mechbay)
|
||||
"blu" = (
|
||||
@@ -25550,7 +25545,7 @@
|
||||
/area/science/lab)
|
||||
"blM" = (
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/effect/landmark/start/roboticist,
|
||||
/obj/effect/landmark/start/cyborg,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/robotics/lab)
|
||||
"blO" = (
|
||||
@@ -26059,6 +26054,7 @@
|
||||
/area/maintenance/aft)
|
||||
"bnb" = (
|
||||
/obj/machinery/recharge_station,
|
||||
/obj/effect/landmark/start/cyborg,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/robotics/mechbay)
|
||||
"bnc" = (
|
||||
@@ -49658,6 +49654,7 @@
|
||||
/area/ai_monitored/turret_protected/aisat_interior)
|
||||
"cum" = (
|
||||
/obj/machinery/recharge_station,
|
||||
/obj/effect/landmark/start/cyborg,
|
||||
/turf/open/floor/plating,
|
||||
/area/ai_monitored/turret_protected/aisat/service)
|
||||
"cun" = (
|
||||
@@ -52362,6 +52359,7 @@
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 8
|
||||
},
|
||||
/obj/effect/landmark/start/roboticist,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/robotics/lab)
|
||||
"cHT" = (
|
||||
@@ -52438,7 +52436,7 @@
|
||||
"cIc" = (
|
||||
/obj/effect/turf_decal/stripes/line,
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/effect/landmark/start/roboticist,
|
||||
/obj/effect/landmark/start/cyborg,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/robotics/lab)
|
||||
"cId" = (
|
||||
@@ -53471,14 +53469,11 @@
|
||||
/turf/open/floor/wood,
|
||||
/area/crew_quarters/bar)
|
||||
"est" = (
|
||||
/obj/machinery/light{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/tile/blue{
|
||||
dir = 4
|
||||
},
|
||||
/obj/item/twohanded/required/kirbyplants{
|
||||
icon_state = "plant-03"
|
||||
/obj/machinery/computer/shuttle/mining/common{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plasteel/white/corner{
|
||||
dir = 1
|
||||
@@ -53625,6 +53620,10 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/gravity_generator)
|
||||
"eZP" = (
|
||||
/obj/effect/spawner/structure/window/reinforced,
|
||||
/turf/open/space/basic,
|
||||
/area/hallway/secondary/entry)
|
||||
"fbm" = (
|
||||
/obj/structure/chair/comfy/brown{
|
||||
dir = 4
|
||||
@@ -54818,6 +54817,15 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/engine/gravity_generator)
|
||||
"jnX" = (
|
||||
/obj/machinery/door/airlock/external{
|
||||
name = "Common Mining Shuttle Bay"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/hallway/secondary/entry)
|
||||
"job" = (
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/hidden{
|
||||
dir = 4
|
||||
@@ -55374,6 +55382,10 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/crew_quarters/fitness)
|
||||
"kRw" = (
|
||||
/obj/effect/landmark/start/roboticist,
|
||||
/turf/open/floor/plasteel/white,
|
||||
/area/science/robotics/lab)
|
||||
"kSb" = (
|
||||
/obj/effect/turf_decal/bot,
|
||||
/turf/open/floor/plasteel,
|
||||
@@ -56831,6 +56843,18 @@
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/maintenance/port)
|
||||
"rHa" = (
|
||||
/obj/docking_port/stationary{
|
||||
dir = 8;
|
||||
dwidth = 3;
|
||||
height = 5;
|
||||
id = "commonmining_home";
|
||||
name = "SS13: Common Mining Dock";
|
||||
roundstart_template = /datum/map_template/shuttle/mining_common/meta;
|
||||
width = 7
|
||||
},
|
||||
/turf/open/space/basic,
|
||||
/area/space)
|
||||
"rKc" = (
|
||||
/obj/structure/lattice/catwalk,
|
||||
/obj/structure/cable{
|
||||
@@ -58110,6 +58134,11 @@
|
||||
"vYa" = (
|
||||
/turf/open/floor/plasteel,
|
||||
/area/crew_quarters/fitness)
|
||||
"vZs" = (
|
||||
/obj/structure/lattice,
|
||||
/obj/structure/lattice,
|
||||
/turf/open/space,
|
||||
/area/space/nearstation)
|
||||
"wcy" = (
|
||||
/obj/structure/reagent_dispensers/water_cooler,
|
||||
/obj/structure/cable{
|
||||
@@ -58551,6 +58580,15 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/circuit)
|
||||
"ycF" = (
|
||||
/obj/machinery/door/airlock/external{
|
||||
name = "Common Mining Shuttle Bay"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/hallway/secondary/entry)
|
||||
"ydD" = (
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/machinery/suit_storage_unit/rd,
|
||||
@@ -66662,7 +66700,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaf
|
||||
aoV
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -66919,12 +66957,12 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaf
|
||||
aoV
|
||||
aaa
|
||||
rHa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaf
|
||||
aoV
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -67176,12 +67214,12 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaf
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaf
|
||||
aaf
|
||||
asE
|
||||
asE
|
||||
ycF
|
||||
asE
|
||||
asE
|
||||
aoV
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -67434,11 +67472,11 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaf
|
||||
aaa
|
||||
aaf
|
||||
aaa
|
||||
aAC
|
||||
eZP
|
||||
auP
|
||||
eZP
|
||||
aaf
|
||||
vZs
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
@@ -67691,10 +67729,10 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
arB
|
||||
awW
|
||||
awW
|
||||
asE
|
||||
arB
|
||||
jnX
|
||||
asE
|
||||
aAC
|
||||
aaf
|
||||
aaa
|
||||
aaa
|
||||
@@ -91636,7 +91674,7 @@ bMK
|
||||
cbB
|
||||
alk
|
||||
alX
|
||||
aoZ
|
||||
cbA
|
||||
bQt
|
||||
apa
|
||||
cgX
|
||||
@@ -102905,7 +102943,7 @@ aYV
|
||||
bfV
|
||||
bhw
|
||||
cHM
|
||||
biL
|
||||
kRw
|
||||
blB
|
||||
blF
|
||||
cHS
|
||||
|
||||
@@ -159,7 +159,9 @@
|
||||
/area/construction/mining/aux_base)
|
||||
"abe" = (
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/obj/item/twohanded/required/kirbyplants/random,
|
||||
/obj/effect/turf_decal/stripes/end{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hallway/secondary/entry)
|
||||
"abf" = (
|
||||
@@ -182,7 +184,7 @@
|
||||
pixel_x = -23
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 9
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hallway/secondary/entry)
|
||||
@@ -108781,6 +108783,7 @@
|
||||
"dCs" = (
|
||||
/obj/effect/decal/cleanable/oil,
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/effect/landmark/start/cyborg,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/robotics/lab)
|
||||
"dCt" = (
|
||||
@@ -108800,6 +108803,7 @@
|
||||
"dCu" = (
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/effect/landmark/start/cyborg,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/robotics/lab)
|
||||
"dCv" = (
|
||||
@@ -110235,6 +110239,7 @@
|
||||
/obj/effect/decal/cleanable/dirt,
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/effect/landmark/start/cyborg,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/robotics/lab)
|
||||
"dEL" = (
|
||||
@@ -110253,6 +110258,7 @@
|
||||
/area/science/robotics/lab)
|
||||
"dEM" = (
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/effect/landmark/start/cyborg,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/robotics/lab)
|
||||
"dEN" = (
|
||||
@@ -125760,6 +125766,17 @@
|
||||
},
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/science/mixing)
|
||||
"eYg" = (
|
||||
/obj/machinery/door/airlock/external{
|
||||
name = "External Docking Port"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper,
|
||||
/obj/effect/turf_decal/stripes/line,
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hallway/secondary/entry)
|
||||
"faI" = (
|
||||
/obj/structure/cable/white{
|
||||
icon_state = "1-2"
|
||||
@@ -125918,6 +125935,15 @@
|
||||
},
|
||||
/turf/open/floor/engine,
|
||||
/area/science/mixing)
|
||||
"gdb" = (
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hallway/secondary/entry)
|
||||
"giN" = (
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 8
|
||||
@@ -125929,6 +125955,19 @@
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden,
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/science/circuit)
|
||||
"gmn" = (
|
||||
/obj/machinery/door/airlock/external{
|
||||
name = "External Docking Port"
|
||||
},
|
||||
/obj/effect/mapping_helpers/airlock/cyclelink_helper{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line{
|
||||
dir = 1
|
||||
},
|
||||
/obj/effect/turf_decal/stripes/line,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hallway/secondary/entry)
|
||||
"gut" = (
|
||||
/obj/effect/turf_decal/tile/neutral{
|
||||
dir = 1
|
||||
@@ -126063,6 +126102,11 @@
|
||||
/obj/structure/sign/warning/vacuum,
|
||||
/turf/closed/wall/r_wall,
|
||||
/area/chapel/office)
|
||||
"hlu" = (
|
||||
/obj/effect/turf_decal/delivery,
|
||||
/obj/machinery/computer/shuttle/mining/common,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/hallway/secondary/entry)
|
||||
"hrP" = (
|
||||
/obj/structure/cable/white{
|
||||
icon_state = "1-2"
|
||||
@@ -127466,6 +127510,17 @@
|
||||
},
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/research/abandoned)
|
||||
"xDY" = (
|
||||
/obj/docking_port/stationary{
|
||||
dwidth = 3;
|
||||
height = 5;
|
||||
id = "commonmining_home";
|
||||
name = "SS13: Common Mining Dock";
|
||||
roundstart_template = /datum/map_template/shuttle/mining_common/meta;
|
||||
width = 7
|
||||
},
|
||||
/turf/open/space/basic,
|
||||
/area/space)
|
||||
"xDZ" = (
|
||||
/obj/machinery/atmospherics/components/unary/portables_connector/visible{
|
||||
dir = 1
|
||||
@@ -159473,8 +159528,8 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
rqh
|
||||
rqh
|
||||
aad
|
||||
aad
|
||||
aaa
|
||||
@@ -159729,8 +159784,8 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaO
|
||||
aaO
|
||||
aaO
|
||||
aaO
|
||||
abf
|
||||
@@ -159985,10 +160040,10 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaO
|
||||
xDY
|
||||
eYg
|
||||
gdb
|
||||
gmn
|
||||
abe
|
||||
abp
|
||||
abC
|
||||
@@ -160243,10 +160298,10 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaO
|
||||
abe
|
||||
aaO
|
||||
aaO
|
||||
hlu
|
||||
abq
|
||||
abD
|
||||
abD
|
||||
@@ -160501,7 +160556,7 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
rqh
|
||||
aaO
|
||||
aaO
|
||||
abf
|
||||
@@ -160758,8 +160813,8 @@ aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
aaa
|
||||
rqh
|
||||
rqh
|
||||
aad
|
||||
aad
|
||||
aaa
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
+1918
-1040
File diff suppressed because it is too large
Load Diff
@@ -25468,6 +25468,7 @@
|
||||
"biw" = (
|
||||
/obj/machinery/recharge_station,
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/effect/landmark/start/cyborg,
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/science/robotics/mechbay)
|
||||
"bix" = (
|
||||
@@ -26658,6 +26659,7 @@
|
||||
/obj/effect/turf_decal/tile/green{
|
||||
dir = 4
|
||||
},
|
||||
/obj/effect/landmark/start/roboticist,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/robotics/lab)
|
||||
"blJ" = (
|
||||
@@ -27579,6 +27581,7 @@
|
||||
/area/science/robotics/lab)
|
||||
"bnQ" = (
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/effect/landmark/start/cyborg,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/robotics/lab)
|
||||
"bnR" = (
|
||||
@@ -28095,8 +28098,8 @@
|
||||
/turf/open/floor/plasteel/dark,
|
||||
/area/science/robotics/lab)
|
||||
"boY" = (
|
||||
/obj/effect/landmark/start/roboticist,
|
||||
/obj/effect/turf_decal/bot,
|
||||
/obj/effect/landmark/start/cyborg,
|
||||
/turf/open/floor/plasteel,
|
||||
/area/science/robotics/lab)
|
||||
"boZ" = (
|
||||
@@ -98808,8 +98811,8 @@ beI
|
||||
bkt
|
||||
blH
|
||||
bmO
|
||||
bnQ
|
||||
bnQ
|
||||
boY
|
||||
boY
|
||||
bqi
|
||||
bry
|
||||
bsZ
|
||||
@@ -99065,7 +99068,7 @@ bju
|
||||
bkt
|
||||
blI
|
||||
bmO
|
||||
bnQ
|
||||
boY
|
||||
boY
|
||||
bqi
|
||||
brz
|
||||
|
||||
@@ -7891,6 +7891,10 @@
|
||||
},
|
||||
/turf/open/floor/engine/cult,
|
||||
/area/wizard_station)
|
||||
"sa" = (
|
||||
/obj/item/hilbertshotel/ghostdojo,
|
||||
/turf/open/indestructible/hotelwood,
|
||||
/area/centcom/holding)
|
||||
"sc" = (
|
||||
/obj/docking_port/stationary{
|
||||
area_type = /area/syndicate_mothership/control;
|
||||
@@ -47751,7 +47755,7 @@ Of
|
||||
QF
|
||||
Nd
|
||||
Sd
|
||||
Sd
|
||||
sa
|
||||
Nd
|
||||
WN
|
||||
Ur
|
||||
|
||||
@@ -0,0 +1,124 @@
|
||||
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
|
||||
"a" = (
|
||||
/turf/closed/wall/mineral/titanium,
|
||||
/area/shuttle/mining)
|
||||
"b" = (
|
||||
/obj/effect/spawner/structure/window/shuttle,
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/mining)
|
||||
"c" = (
|
||||
/obj/structure/table,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/mining)
|
||||
"d" = (
|
||||
/obj/machinery/computer/shuttle/mining/common,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/mining)
|
||||
"e" = (
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/mining)
|
||||
"f" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/mining)
|
||||
"g" = (
|
||||
/obj/machinery/light{
|
||||
dir = 8
|
||||
},
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/mining)
|
||||
"h" = (
|
||||
/obj/machinery/door/airlock/titanium{
|
||||
name = "Lavaland Shuttle Airlock"
|
||||
},
|
||||
/obj/docking_port/mobile{
|
||||
dir = 8;
|
||||
dwidth = 3;
|
||||
height = 5;
|
||||
id = "mining_common";
|
||||
name = "lavaland shuttle";
|
||||
port_direction = 4;
|
||||
width = 7
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/mining)
|
||||
"i" = (
|
||||
/obj/structure/closet/crate,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/mining)
|
||||
"j" = (
|
||||
/obj/structure/shuttle/engine/heater,
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 1;
|
||||
layer = 2.9
|
||||
},
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 8
|
||||
},
|
||||
/obj/structure/window/reinforced{
|
||||
dir = 4
|
||||
},
|
||||
/turf/open/floor/plating,
|
||||
/area/shuttle/mining)
|
||||
"k" = (
|
||||
/obj/structure/ore_box,
|
||||
/turf/open/floor/mineral/titanium/blue,
|
||||
/area/shuttle/mining)
|
||||
"l" = (
|
||||
/obj/structure/shuttle/engine/propulsion/burst,
|
||||
/turf/open/floor/plating/airless,
|
||||
/area/shuttle/mining)
|
||||
"Q" = (
|
||||
/obj/structure/chair/comfy/shuttle{
|
||||
dir = 1
|
||||
},
|
||||
/turf/open/floor/mineral/titanium,
|
||||
/area/shuttle/mining)
|
||||
|
||||
(1,1,1) = {"
|
||||
a
|
||||
a
|
||||
b
|
||||
a
|
||||
b
|
||||
a
|
||||
a
|
||||
"}
|
||||
(2,1,1) = {"
|
||||
a
|
||||
c
|
||||
e
|
||||
g
|
||||
f
|
||||
i
|
||||
a
|
||||
"}
|
||||
(3,1,1) = {"
|
||||
b
|
||||
d
|
||||
Q
|
||||
e
|
||||
f
|
||||
j
|
||||
l
|
||||
"}
|
||||
(4,1,1) = {"
|
||||
a
|
||||
c
|
||||
e
|
||||
e
|
||||
f
|
||||
k
|
||||
a
|
||||
"}
|
||||
(5,1,1) = {"
|
||||
a
|
||||
a
|
||||
b
|
||||
h
|
||||
b
|
||||
a
|
||||
a
|
||||
"}
|
||||
@@ -197,3 +197,9 @@ GLOBAL_LIST_INIT(shove_disarming_types, typecacheof(list(
|
||||
#define TOTAL_MASS_HAND_REPLACEMENT 5 //standard punching stamina cost. most hand replacements are huge items anyway.
|
||||
#define TOTAL_MASS_MEDIEVAL_WEAPON 3.6 //very, very generic average sword/warpick/etc. weight in pounds.
|
||||
#define TOTAL_MASS_TOY_SWORD 1.5
|
||||
|
||||
//bullet_act() return values
|
||||
#define BULLET_ACT_HIT "HIT" //It's a successful hit, whatever that means in the context of the thing it's hitting.
|
||||
#define BULLET_ACT_BLOCK "BLOCK" //It's a blocked hit, whatever that means in the context of the thing it's hitting.
|
||||
#define BULLET_ACT_FORCE_PIERCE "PIERCE" //It pierces through the object regardless of the bullet being piercing by default.
|
||||
#define BULLET_ACT_TURF "TURF" //It hit us but it should hit something on the same turf too. Usually used for turfs.
|
||||
@@ -292,6 +292,7 @@
|
||||
|
||||
//Nanites
|
||||
#define COMSIG_HAS_NANITES "has_nanites" //() returns TRUE if nanites are found
|
||||
#define COMSIG_NANITE_IS_STEALTHY "nanite_is_stealthy" //() returns TRUE if nanites have stealth
|
||||
#define COMSIG_NANITE_GET_PROGRAMS "nanite_get_programs" //(list/nanite_programs) - makes the input list a copy the nanites' program list
|
||||
#define COMSIG_NANITE_SET_VOLUME "nanite_set_volume" //(amount) Sets current nanite volume to the given amount
|
||||
#define COMSIG_NANITE_ADJUST_VOLUME "nanite_adjust" //(amount) Adjusts nanite volume by the given amount
|
||||
@@ -300,6 +301,7 @@
|
||||
#define COMSIG_NANITE_SET_SAFETY "nanite_set_safety" //(amount) Sets safety threshold to the given amount
|
||||
#define COMSIG_NANITE_SET_REGEN "nanite_set_regen" //(amount) Sets regeneration rate to the given amount
|
||||
#define COMSIG_NANITE_SIGNAL "nanite_signal" //(code(1-9999)) Called when sending a nanite signal to a mob.
|
||||
#define COMSIG_NANITE_COMM_SIGNAL "nanite_comm_signal" //(comm_code(1-9999), comm_message) Called when sending a nanite comm signal to a mob.
|
||||
#define COMSIG_NANITE_SCAN "nanite_scan" //(mob/user, full_scan) - sends to chat a scan of the nanites to the user, returns TRUE if nanites are detected
|
||||
#define COMSIG_NANITE_UI_DATA "nanite_ui_data" //(list/data, scan_level) - adds nanite data to the given data list - made for ui_data procs
|
||||
#define COMSIG_NANITE_ADD_PROGRAM "nanite_add_program" //(datum/nanite_program/new_program, datum/nanite_program/source_program) Called when adding a program to a nanite component
|
||||
|
||||
@@ -60,6 +60,7 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
|
||||
#define FLYING (1<<1)
|
||||
#define VENTCRAWLING (1<<2)
|
||||
#define FLOATING (1<<3)
|
||||
#define UNSTOPPABLE (1<<4) //When moving, will Bump()/Cross()/Uncross() everything, but won't be stopped.
|
||||
|
||||
//Fire and Acid stuff, for resistance_flags
|
||||
#define LAVA_PROOF (1<<0)
|
||||
|
||||
@@ -120,6 +120,10 @@
|
||||
if (CONFIG_GET(flag/log_vote))
|
||||
WRITE_LOG(GLOB.world_game_log, "VOTE: [text]")
|
||||
|
||||
/proc/log_craft(text)
|
||||
if (CONFIG_GET(flag/log_craft))
|
||||
WRITE_LOG(GLOB.world_crafting_log, "CRAFT: [text]")
|
||||
|
||||
/proc/log_topic(text)
|
||||
WRITE_LOG(GLOB.world_game_log, "TOPIC: [text]")
|
||||
|
||||
|
||||
@@ -101,7 +101,10 @@ GLOBAL_LIST_INIT(bitfields, list(
|
||||
),
|
||||
"movement_type" = list(
|
||||
"GROUND" = GROUND,
|
||||
"FLYING" = FLYING
|
||||
"FLYING" = FLYING,
|
||||
"VENTCRAWLING" = VENTCRAWLING,
|
||||
"FLOATING" = FLOATING,
|
||||
"UNSTOPPABLE" = UNSTOPPABLE
|
||||
),
|
||||
"resistance_flags" = list(
|
||||
"LAVA_PROOF" = LAVA_PROOF,
|
||||
|
||||
@@ -32,6 +32,8 @@ GLOBAL_VAR(world_map_error_log)
|
||||
GLOBAL_PROTECT(world_map_error_log)
|
||||
GLOBAL_VAR(subsystem_log)
|
||||
GLOBAL_PROTECT(subsystem_log)
|
||||
GLOBAL_VAR(world_crafting_log)
|
||||
GLOBAL_PROTECT(world_crafting_log)
|
||||
|
||||
GLOBAL_LIST_EMPTY(bombers)
|
||||
GLOBAL_PROTECT(bombers)
|
||||
|
||||
@@ -43,6 +43,8 @@
|
||||
|
||||
/datum/config_entry/flag/log_vote // log voting
|
||||
|
||||
/datum/config_entry/flag/log_craft // log crafting
|
||||
|
||||
/datum/config_entry/flag/log_whisper // log client whisper
|
||||
|
||||
/datum/config_entry/flag/log_attack // log attack messages
|
||||
|
||||
@@ -37,6 +37,7 @@
|
||||
/datum/component/nanites/RegisterWithParent()
|
||||
. = ..()
|
||||
RegisterSignal(parent, COMSIG_HAS_NANITES, .proc/confirm_nanites)
|
||||
RegisterSignal(parent, COMSIG_NANITE_IS_STEALTHY, .proc/check_stealth)
|
||||
RegisterSignal(parent, COMSIG_NANITE_UI_DATA, .proc/nanite_ui_data)
|
||||
RegisterSignal(parent, COMSIG_NANITE_GET_PROGRAMS, .proc/get_programs)
|
||||
RegisterSignal(parent, COMSIG_NANITE_SET_VOLUME, .proc/set_volume)
|
||||
@@ -57,10 +58,12 @@
|
||||
RegisterSignal(parent, COMSIG_LIVING_MINOR_SHOCK, .proc/on_minor_shock)
|
||||
RegisterSignal(parent, COMSIG_SPECIES_GAIN, .proc/check_viable_biotype)
|
||||
RegisterSignal(parent, COMSIG_NANITE_SIGNAL, .proc/receive_signal)
|
||||
RegisterSignal(parent, COMSIG_NANITE_COMM_SIGNAL, .proc/receive_comm_signal)
|
||||
|
||||
/datum/component/nanites/UnregisterFromParent()
|
||||
. = ..()
|
||||
UnregisterSignal(parent, list(COMSIG_HAS_NANITES,
|
||||
COMSIG_NANITE_IS_STEALTHY,
|
||||
COMSIG_NANITE_UI_DATA,
|
||||
COMSIG_NANITE_GET_PROGRAMS,
|
||||
COMSIG_NANITE_SET_VOLUME,
|
||||
@@ -79,7 +82,8 @@
|
||||
COMSIG_LIVING_MINOR_SHOCK,
|
||||
COMSIG_MOVABLE_HEAR,
|
||||
COMSIG_SPECIES_GAIN,
|
||||
COMSIG_NANITE_SIGNAL))
|
||||
COMSIG_NANITE_SIGNAL,
|
||||
COMSIG_NANITE_COMM_SIGNAL))
|
||||
|
||||
/datum/component/nanites/Destroy()
|
||||
STOP_PROCESSING(SSnanites, src)
|
||||
@@ -188,6 +192,9 @@
|
||||
var/datum/nanite_program/NP = X
|
||||
NP.on_minor_shock()
|
||||
|
||||
/datum/component/nanites/proc/check_stealth(datum/source)
|
||||
return stealth
|
||||
|
||||
/datum/component/nanites/proc/on_death(datum/source, gibbed)
|
||||
for(var/X in programs)
|
||||
var/datum/nanite_program/NP = X
|
||||
@@ -198,6 +205,12 @@
|
||||
var/datum/nanite_program/NP = X
|
||||
NP.receive_signal(code, source)
|
||||
|
||||
/datum/component/nanites/proc/receive_comm_signal(datum/source, comm_code, comm_message, comm_source = "an unidentified source")
|
||||
for(var/X in programs)
|
||||
if(istype(X, /datum/nanite_program/triggered/comm))
|
||||
var/datum/nanite_program/triggered/comm/NP = X
|
||||
NP.receive_comm_signal(comm_code, comm_message, comm_source)
|
||||
|
||||
/datum/component/nanites/proc/check_viable_biotype()
|
||||
if(!(MOB_ORGANIC in host_mob.mob_biotypes) && !(MOB_UNDEAD in host_mob.mob_biotypes))
|
||||
qdel(src) //bodytype no longer sustains nanites
|
||||
|
||||
@@ -239,7 +239,14 @@
|
||||
mood_change = -3
|
||||
timeout = 1000
|
||||
|
||||
/datum/mood_event/nanite_sadness
|
||||
description = "<span class='warning robot'>+++++++HAPPINESS SUPPRESSION+++++++</span>\n"
|
||||
mood_change = -7
|
||||
/datum/mood_event/daylight_2
|
||||
description = "<span class='boldwarning'>I have been scorched by the unforgiving rays of the sun.</span>\n"
|
||||
mood_change = -6
|
||||
timeout = 1200
|
||||
|
||||
/datum/mood_event/nanite_sadness/add_effects(message)
|
||||
description = "<span class='warning robot'>+++++++[message]+++++++</span>\n"
|
||||
|
||||
|
||||
@@ -142,6 +142,16 @@
|
||||
mood_change = 2
|
||||
timeout = 15 MINUTES
|
||||
|
||||
/datum/mood_event/nanite_happiness
|
||||
description = "<span class='nicegreen robot'>+++++++HAPPINESS ENHANCEMENT+++++++</span>\n"
|
||||
mood_change = 7
|
||||
|
||||
/datum/mood_event/nanite_happiness/add_effects(message)
|
||||
description = "<span class='nicegreen robot'>+++++++[message]+++++++</span>\n"
|
||||
|
||||
/datum/mood_event/area
|
||||
description = "" //Fill this out in the area
|
||||
mood_change = 0
|
||||
//Power gamer stuff below
|
||||
/datum/mood_event/drankblood
|
||||
description = "<span class='nicegreen'>I have fed greedly from that which nourishes me.</span>\n"
|
||||
|
||||
@@ -131,6 +131,10 @@
|
||||
port_id = "mining"
|
||||
can_be_bought = FALSE
|
||||
|
||||
/datum/map_template/shuttle/mining_common
|
||||
port_id = "mining_common"
|
||||
can_be_bought = FALSE
|
||||
|
||||
/datum/map_template/shuttle/cargo
|
||||
port_id = "cargo"
|
||||
can_be_bought = FALSE
|
||||
@@ -493,6 +497,10 @@
|
||||
suffix = "delta"
|
||||
name = "labour shuttle (Delta)"
|
||||
|
||||
/datum/map_template/shuttle/mining_common/meta
|
||||
suffix = "meta"
|
||||
name = "lavaland shuttle (Meta)"
|
||||
|
||||
/datum/map_template/shuttle/arrival/delta
|
||||
suffix = "delta"
|
||||
name = "arrival shuttle (Delta)"
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/turnstile/bullet_act(obj/item/projectile/P, def_zone)
|
||||
return -1 //Pass through!
|
||||
return BULLET_ACT_FORCE_PIERCE //Pass through!
|
||||
|
||||
/obj/machinery/turnstile/proc/allowed_access(var/mob/B)
|
||||
if(B.pulledby && ismob(B.pulledby))
|
||||
|
||||
@@ -677,18 +677,18 @@ RLD
|
||||
icon_state = "rld"
|
||||
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
|
||||
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
|
||||
matter = 500
|
||||
max_matter = 500
|
||||
sheetmultiplier = 16
|
||||
matter = 200
|
||||
max_matter = 200
|
||||
sheetmultiplier = 5
|
||||
var/mode = LIGHT_MODE
|
||||
actions_types = list(/datum/action/item_action/pick_color)
|
||||
ammo_sections = 5
|
||||
has_ammobar = TRUE
|
||||
|
||||
var/wallcost = 10
|
||||
var/floorcost = 15
|
||||
var/launchcost = 5
|
||||
var/deconcost = 10
|
||||
var/wallcost = 20
|
||||
var/floorcost = 25
|
||||
var/launchcost = 10
|
||||
var/deconcost = 20
|
||||
|
||||
var/walldelay = 10
|
||||
var/floordelay = 10
|
||||
|
||||
@@ -19,12 +19,14 @@ GLOBAL_LIST_INIT(atmos_pipe_recipes, list(
|
||||
new /datum/pipe_info/pipe("Manifold", /obj/machinery/atmospherics/pipe/manifold),
|
||||
new /datum/pipe_info/pipe("Manual Valve", /obj/machinery/atmospherics/components/binary/valve),
|
||||
new /datum/pipe_info/pipe("Digital Valve", /obj/machinery/atmospherics/components/binary/valve/digital),
|
||||
new /datum/pipe_info/pipe("Relief Valve", /obj/machinery/atmospherics/components/binary/relief_valve),
|
||||
new /datum/pipe_info/pipe("4-Way Manifold", /obj/machinery/atmospherics/pipe/manifold4w),
|
||||
new /datum/pipe_info/pipe("Layer Manifold", /obj/machinery/atmospherics/pipe/layer_manifold),
|
||||
),
|
||||
"Devices" = list(
|
||||
new /datum/pipe_info/pipe("Connector", /obj/machinery/atmospherics/components/unary/portables_connector),
|
||||
new /datum/pipe_info/pipe("Unary Vent", /obj/machinery/atmospherics/components/unary/vent_pump),
|
||||
new /datum/pipe_info/pipe("Relief Valve", /obj/machinery/atmospherics/components/unary/relief_valve),
|
||||
new /datum/pipe_info/pipe("Gas Pump", /obj/machinery/atmospherics/components/binary/pump),
|
||||
new /datum/pipe_info/pipe("Passive Gate", /obj/machinery/atmospherics/components/binary/passive_gate),
|
||||
new /datum/pipe_info/pipe("Volume Pump", /obj/machinery/atmospherics/components/binary/volume_pump),
|
||||
@@ -33,6 +35,7 @@ GLOBAL_LIST_INIT(atmos_pipe_recipes, list(
|
||||
new /datum/pipe_info/meter("Meter"),
|
||||
new /datum/pipe_info/pipe("Gas Filter", /obj/machinery/atmospherics/components/trinary/filter),
|
||||
new /datum/pipe_info/pipe("Gas Mixer", /obj/machinery/atmospherics/components/trinary/mixer),
|
||||
new /datum/pipe_info/pipe("Passive Vent", /obj/machinery/atmospherics/components/unary/passive_vent),
|
||||
),
|
||||
"Heat Exchange" = list(
|
||||
new /datum/pipe_info/pipe("Pipe", /obj/machinery/atmospherics/pipe/heat_exchanging/simple),
|
||||
|
||||
@@ -74,6 +74,7 @@
|
||||
playsound(src, 'sound/weapons/slice.ogg', 50, 1)
|
||||
if(prob(P.damage))
|
||||
push_over()
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
/obj/item/cardboard_cutout/proc/change_appearance(obj/item/toy/crayon/crayon, mob/living/user)
|
||||
if(!crayon || !user)
|
||||
|
||||
@@ -242,7 +242,7 @@
|
||||
if(Pgun && istype(Pgun))
|
||||
Pgun.field_connect(src)
|
||||
else
|
||||
return 0
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
/obj/effect/chrono_field/assume_air()
|
||||
return 0
|
||||
|
||||
@@ -293,6 +293,10 @@
|
||||
name = "Mining Shuttle (Computer Board)"
|
||||
build_path = /obj/machinery/computer/shuttle/mining
|
||||
|
||||
/obj/item/circuitboard/computer/mining_shuttle/common
|
||||
name = "Lavaland Shuttle (Computer Board)"
|
||||
build_path = /obj/machinery/computer/shuttle/mining/common
|
||||
|
||||
/obj/item/circuitboard/computer/white_ship
|
||||
name = "White Ship (Computer Board)"
|
||||
build_path = /obj/machinery/computer/shuttle/white_ship
|
||||
|
||||
@@ -146,7 +146,7 @@
|
||||
master.disrupt()
|
||||
|
||||
/obj/effect/dummy/chameleon/bullet_act()
|
||||
..()
|
||||
. = ..()
|
||||
master.disrupt()
|
||||
|
||||
/obj/effect/dummy/chameleon/relaymove(mob/user, direction)
|
||||
|
||||
@@ -40,8 +40,10 @@
|
||||
if (prob(50))
|
||||
qdel(src)
|
||||
|
||||
/obj/item/latexballon/bullet_act()
|
||||
burst()
|
||||
/obj/item/latexballon/bullet_act(obj/item/projectile/P)
|
||||
if(!P.nodamage)
|
||||
burst()
|
||||
return ..()
|
||||
|
||||
/obj/item/latexballon/temperature_expose(datum/gas_mixture/air, temperature, volume)
|
||||
if(temperature > T0C+100)
|
||||
|
||||
@@ -358,7 +358,8 @@
|
||||
/obj/item/melee/supermatter_sword/bullet_act(obj/item/projectile/P)
|
||||
visible_message("<span class='danger'>[P] smacks into [src] and rapidly flashes to ash.</span>",\
|
||||
"<span class='italics'>You hear a loud crack as you are washed with a wave of heat.</span>")
|
||||
consume_everything()
|
||||
consume_everything(P)
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
/obj/item/melee/supermatter_sword/suicide_act(mob/user)
|
||||
user.visible_message("<span class='suicide'>[user] touches [src]'s blade. It looks like [user.p_theyre()] tired of waiting for the radiation to kill [user.p_them()]!</span>")
|
||||
|
||||
@@ -60,7 +60,7 @@
|
||||
#define DECALTYPE_BULLET 2
|
||||
|
||||
/obj/item/target/clown/bullet_act(obj/item/projectile/P)
|
||||
..()
|
||||
. = ..()
|
||||
playsound(src.loc, 'sound/items/bikehorn.ogg', 50, 1)
|
||||
|
||||
/obj/item/target/bullet_act(obj/item/projectile/P)
|
||||
@@ -89,8 +89,8 @@
|
||||
else
|
||||
bullet_hole.icon_state = "dent"
|
||||
add_overlay(bullet_hole)
|
||||
return
|
||||
return -1
|
||||
return BULLET_ACT_HIT
|
||||
return BULLET_ACT_FORCE_PIERCE
|
||||
|
||||
#undef DECALTYPE_SCORCH
|
||||
#undef DECALTYPE_BULLET
|
||||
|
||||
@@ -202,6 +202,7 @@
|
||||
if(O)
|
||||
O.setDir(usr.dir)
|
||||
use(R.req_amount * multiplier)
|
||||
log_craft("[O] crafted by [usr] at [loc_name(O.loc)]")
|
||||
|
||||
//START: oh fuck i'm so sorry
|
||||
if(istype(O, /obj/structure/windoor_assembly))
|
||||
|
||||
@@ -66,6 +66,14 @@
|
||||
req_access = null
|
||||
locked = FALSE
|
||||
|
||||
/obj/structure/closet/secure_closet/freezer/gulag_fridge
|
||||
name = "refrigerator"
|
||||
|
||||
/obj/structure/closet/secure_closet/freezer/gulag_fridge/PopulateContents()
|
||||
..()
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/reagent_containers/food/drinks/beer/light(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/freezer/fridge
|
||||
name = "refrigerator"
|
||||
|
||||
|
||||
@@ -290,3 +290,17 @@
|
||||
..()
|
||||
for(var/i in 1 to 3)
|
||||
new /obj/item/storage/box/lethalshot(src)
|
||||
|
||||
/obj/structure/closet/secure_closet/labor_camp_security
|
||||
name = "labor camp security locker"
|
||||
req_access = list(ACCESS_SECURITY)
|
||||
icon_state = "sec"
|
||||
|
||||
/obj/structure/closet/secure_closet/labor_camp_security/PopulateContents()
|
||||
..()
|
||||
new /obj/item/clothing/suit/armor/vest(src)
|
||||
new /obj/item/clothing/head/helmet/sec(src)
|
||||
new /obj/item/clothing/under/rank/security(src)
|
||||
new /obj/item/clothing/under/rank/security/skirt(src)
|
||||
new /obj/item/clothing/glasses/hud/security/sunglasses(src)
|
||||
new /obj/item/flashlight/seclite(src)
|
||||
|
||||
@@ -106,6 +106,7 @@
|
||||
take_damage(10, BRUTE, "melee", 1) //Tasers aren't harmful.
|
||||
if(istype(P, /obj/item/projectile/beam/disabler))
|
||||
take_damage(5, BRUTE, "melee", 1) //Disablers aren't harmful.
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
/obj/structure/holosign/barrier/medical
|
||||
name = "\improper PENLITE holobarrier"
|
||||
@@ -152,6 +153,7 @@
|
||||
|
||||
/obj/structure/holosign/barrier/cyborg/hacked/bullet_act(obj/item/projectile/P)
|
||||
take_damage(P.damage, BRUTE, "melee", 1) //Yeah no this doesn't get projectile resistance.
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
/obj/structure/holosign/barrier/cyborg/hacked/proc/cooldown()
|
||||
shockcd = FALSE
|
||||
|
||||
@@ -64,15 +64,15 @@
|
||||
var/ploc = get_turf(P)
|
||||
if(!finished || !allowed_projectile_typecache[P.type] || !(P.dir in GLOB.cardinals))
|
||||
return ..()
|
||||
if(auto_reflect(P, pdir, ploc, pangle) != -1)
|
||||
if(auto_reflect(P, pdir, ploc, pangle) != BULLET_ACT_FORCE_PIERCE)
|
||||
return ..()
|
||||
return -1
|
||||
return BULLET_ACT_FORCE_PIERCE
|
||||
|
||||
/obj/structure/reflector/proc/auto_reflect(obj/item/projectile/P, pdir, turf/ploc, pangle)
|
||||
P.ignore_source_check = TRUE
|
||||
P.range = P.decayedRange
|
||||
P.decayedRange = max(P.decayedRange--, 0)
|
||||
return -1
|
||||
return BULLET_ACT_FORCE_PIERCE
|
||||
|
||||
/obj/structure/reflector/attackby(obj/item/W, mob/user, params)
|
||||
if(admin)
|
||||
|
||||
@@ -124,7 +124,7 @@
|
||||
message_admins("Plasma statue ignited by [Proj]. No known firer, in [ADMIN_VERBOSEJMP(T)]")
|
||||
log_game("Plasma statue ignited by [Proj] in [AREACOORD(T)]. No known firer.")
|
||||
PlasmaBurn(2500)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/structure/statue/plasma/attackby(obj/item/W, mob/user, params)
|
||||
if(W.get_temperature() > 300 && !QDELETED(src))//If the temperature of the object is over 300, then ignite
|
||||
|
||||
@@ -71,6 +71,5 @@
|
||||
|
||||
/obj/structure/target_stake/bullet_act(obj/item/projectile/P)
|
||||
if(pinned_target)
|
||||
pinned_target.bullet_act(P)
|
||||
else
|
||||
..()
|
||||
return pinned_target.bullet_act(P)
|
||||
return ..()
|
||||
|
||||
@@ -65,13 +65,16 @@
|
||||
|
||||
if(I.use_tool(src, user, 40, volume=50))
|
||||
var/range = I.digrange //Store the current digrange so people don't cheese digspeed swapping for faster mining
|
||||
var/list/dug_tiles = list()
|
||||
if(ismineralturf(src))
|
||||
if(I.digrange > 0)
|
||||
for(var/turf/closed/mineral/M in range(user,range))
|
||||
if(get_dir(user,M)&stored_dir)
|
||||
M.gets_drilled()
|
||||
M.gets_drilled(user)
|
||||
dug_tiles += M
|
||||
to_chat(user, "<span class='notice'>You finish cutting into the rock.</span>")
|
||||
gets_drilled(user)
|
||||
if(!(src in dug_tiles))
|
||||
gets_drilled(user)
|
||||
SSblackbox.record_feedback("tally", "pick_used_mining", 1, I.type)
|
||||
else
|
||||
return attack_hand(user)
|
||||
@@ -615,4 +618,4 @@
|
||||
turf_type = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
baseturfs = /turf/open/floor/plating/asteroid/basalt/lava_land_surface
|
||||
initial_gas_mix = LAVALAND_DEFAULT_ATMOS
|
||||
defer_change = 1
|
||||
defer_change = 1
|
||||
|
||||
@@ -120,7 +120,7 @@
|
||||
PlasmaBurn(2500)
|
||||
else if(istype(Proj, /obj/item/projectile/ion))
|
||||
PlasmaBurn(500)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
|
||||
/turf/closed/wall/mineral/wood
|
||||
|
||||
+21
-7
@@ -224,14 +224,20 @@
|
||||
for(var/i in contents)
|
||||
if(i == mover || i == mover.loc) // Multi tile objects and moving out of other objects
|
||||
continue
|
||||
if(QDELETED(mover))
|
||||
break
|
||||
var/atom/movable/thing = i
|
||||
if(thing.Cross(mover))
|
||||
continue
|
||||
if(!firstbump || ((thing.layer > firstbump.layer || thing.flags_1 & ON_BORDER_1) && !(firstbump.flags_1 & ON_BORDER_1)))
|
||||
firstbump = thing
|
||||
if(!thing.Cross(mover))
|
||||
if(CHECK_BITFIELD(mover.movement_type, UNSTOPPABLE))
|
||||
mover.Bump(thing)
|
||||
continue
|
||||
else
|
||||
if(!firstbump || ((thing.layer > firstbump.layer || thing.flags_1 & ON_BORDER_1) && !(firstbump.flags_1 & ON_BORDER_1)))
|
||||
firstbump = thing
|
||||
if(firstbump)
|
||||
mover.Bump(firstbump)
|
||||
return FALSE
|
||||
if(!QDELETED(mover))
|
||||
mover.Bump(firstbump)
|
||||
return CHECK_BITFIELD(mover.movement_type, UNSTOPPABLE)
|
||||
return TRUE
|
||||
|
||||
/turf/Exit(atom/movable/mover, atom/newloc)
|
||||
@@ -239,13 +245,16 @@
|
||||
if(!.)
|
||||
return FALSE
|
||||
for(var/i in contents)
|
||||
if(QDELETED(mover))
|
||||
break
|
||||
if(i == mover)
|
||||
continue
|
||||
var/atom/movable/thing = i
|
||||
if(!thing.Uncross(mover, newloc))
|
||||
if(thing.flags_1 & ON_BORDER_1)
|
||||
mover.Bump(thing)
|
||||
return FALSE
|
||||
if(!CHECK_BITFIELD(mover.movement_type, UNSTOPPABLE))
|
||||
return FALSE
|
||||
|
||||
/turf/Entered(atom/movable/AM)
|
||||
..()
|
||||
@@ -563,3 +572,8 @@
|
||||
//Should return new turf
|
||||
/turf/proc/Melt()
|
||||
return ScrapeAway(flags = CHANGETURF_INHERIT_AIR)
|
||||
|
||||
/turf/bullet_act(obj/item/projectile/P)
|
||||
. = ..()
|
||||
if(. != BULLET_ACT_FORCE_PIERCE)
|
||||
. = BULLET_ACT_TURF
|
||||
|
||||
@@ -116,6 +116,7 @@ GLOBAL_LIST(topic_status_cache)
|
||||
GLOB.query_debug_log = "[GLOB.log_directory]/query_debug.log"
|
||||
GLOB.world_job_debug_log = "[GLOB.log_directory]/job_debug.log"
|
||||
GLOB.subsystem_log = "[GLOB.log_directory]/subsystem.log"
|
||||
GLOB.world_crafting_log = "[GLOB.log_directory]/crafting.log"
|
||||
|
||||
#ifdef UNIT_TESTS
|
||||
GLOB.test_log = file("[GLOB.log_directory]/tests.log")
|
||||
@@ -131,6 +132,7 @@ GLOBAL_LIST(topic_status_cache)
|
||||
start_log(GLOB.world_runtime_log)
|
||||
start_log(GLOB.world_job_debug_log)
|
||||
start_log(GLOB.subsystem_log)
|
||||
start_log(GLOB.world_crafting_log)
|
||||
|
||||
GLOB.changelog_hash = md5('html/changelog.html') //for telling if the changelog has changed recently
|
||||
if(fexists(GLOB.config_error_log))
|
||||
|
||||
@@ -345,13 +345,13 @@
|
||||
/obj/item/projectile/tentacle/on_hit(atom/target, blocked = FALSE)
|
||||
var/mob/living/carbon/human/H = firer
|
||||
if(blocked >= 100)
|
||||
return 0
|
||||
return BULLET_ACT_BLOCK
|
||||
if(isitem(target))
|
||||
var/obj/item/I = target
|
||||
if(!I.anchored)
|
||||
to_chat(firer, "<span class='notice'>You pull [I] right into your grasp.</span>")
|
||||
H.put_in_hands(I) //Because throwing it is goofy as fuck and unreliable. If you land the tentacle despite the penalties to accuracy, you should have your reward.
|
||||
. = 1
|
||||
. = BULLET_ACT_HIT
|
||||
|
||||
else if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
@@ -366,7 +366,7 @@
|
||||
if(INTENT_HELP)
|
||||
C.visible_message("<span class='danger'>[L] is pulled by [H]'s tentacle!</span>","<span class='userdanger'>A tentacle grabs you and pulls you towards [H]!</span>")
|
||||
C.throw_at(get_step_towards(H,C), 8, 2)
|
||||
return 1
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
if(INTENT_DISARM)
|
||||
var/obj/item/I = C.get_active_held_item()
|
||||
@@ -374,27 +374,27 @@
|
||||
if(C.dropItemToGround(I))
|
||||
C.visible_message("<span class='danger'>[I] is yanked off [C]'s hand by [src]!</span>","<span class='userdanger'>A tentacle pulls [I] away from you!</span>")
|
||||
on_hit(I) //grab the item as if you had hit it directly with the tentacle
|
||||
return 1
|
||||
return BULLET_ACT_HIT
|
||||
else
|
||||
to_chat(firer, "<span class='danger'>You can't seem to pry [I] off [C]'s hands!</span>")
|
||||
return 0
|
||||
return BULLET_ACT_BLOCK
|
||||
else
|
||||
to_chat(firer, "<span class='danger'>[C] has nothing in hand to disarm!</span>")
|
||||
return 0
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
if(INTENT_GRAB)
|
||||
C.visible_message("<span class='danger'>[L] is grabbed by [H]'s tentacle!</span>","<span class='userdanger'>A tentacle grabs you and pulls you towards [H]!</span>")
|
||||
C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, .proc/tentacle_grab, H, C))
|
||||
return 1
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
if(INTENT_HARM)
|
||||
C.visible_message("<span class='danger'>[L] is thrown towards [H] by a tentacle!</span>","<span class='userdanger'>A tentacle grabs you and throws you towards [H]!</span>")
|
||||
C.throw_at(get_step_towards(H,C), 8, 2, H, TRUE, TRUE, callback=CALLBACK(src, .proc/tentacle_stab, H, C))
|
||||
return 1
|
||||
return BULLET_ACT_HIT
|
||||
else
|
||||
L.visible_message("<span class='danger'>[L] is pulled by [H]'s tentacle!</span>","<span class='userdanger'>A tentacle grabs you and pulls you towards [H]!</span>")
|
||||
L.throw_at(get_step_towards(H,L), 8, 2)
|
||||
. = 1
|
||||
. = BULLET_ACT_HIT
|
||||
|
||||
/obj/item/projectile/tentacle/Destroy()
|
||||
qdel(chain)
|
||||
|
||||
@@ -182,7 +182,7 @@
|
||||
if(isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(is_servant_of_ratvar(L) || L.stat || L.has_status_effect(STATUS_EFFECT_KINDLE))
|
||||
return
|
||||
return BULLET_ACT_HIT
|
||||
var/atom/O = L.anti_magic_check()
|
||||
playsound(L, 'sound/magic/fireball.ogg', 50, TRUE, frequency = 1.25)
|
||||
if(O)
|
||||
|
||||
@@ -97,7 +97,7 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder/bullet_act(obj/item/projectile/P)
|
||||
if(deflect_projectile(P))
|
||||
return
|
||||
return BULLET_ACT_BLOCK
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/clockwork/marauder/proc/deflect_projectile(obj/item/projectile/P)
|
||||
|
||||
@@ -31,7 +31,7 @@
|
||||
if(auto_reflect(P, P.dir, get_turf(P), P.Angle) != -1)
|
||||
return ..()
|
||||
|
||||
return -1
|
||||
return BULLET_ACT_FORCE_PIERCE
|
||||
|
||||
/obj/structure/destructible/clockwork/reflector/proc/auto_reflect(obj/item/projectile/P, pdir, turf/ploc, pangle)
|
||||
|
||||
|
||||
@@ -0,0 +1,108 @@
|
||||
/obj/machinery/atmospherics/components/binary/relief_valve
|
||||
name = "binary pressure relief valve"
|
||||
desc = "Like a manual valve, but opens at a certain pressure rather than being toggleable."
|
||||
icon = 'icons/obj/atmospherics/components/relief_valve.dmi'
|
||||
icon_state = "relief_valve-t-map"
|
||||
can_unwrench = TRUE
|
||||
construction_type = /obj/item/pipe/binary
|
||||
var/opened = FALSE
|
||||
var/open_pressure = ONE_ATMOSPHERE * 3
|
||||
var/close_pressure = ONE_ATMOSPHERE
|
||||
pipe_state = "relief_valve-t"
|
||||
|
||||
/obj/machinery/atmospherics/components/binary/relief_valve/layer1
|
||||
piping_layer = PIPING_LAYER_MIN
|
||||
pixel_x = -PIPING_LAYER_P_X
|
||||
pixel_y = -PIPING_LAYER_P_Y
|
||||
|
||||
/obj/machinery/atmospherics/components/binary/relief_valve/layer3
|
||||
piping_layer = PIPING_LAYER_MAX
|
||||
pixel_x = PIPING_LAYER_P_X
|
||||
pixel_y = PIPING_LAYER_P_Y
|
||||
|
||||
/obj/machinery/atmospherics/components/binary/relief_valve/update_icon_nopipes()
|
||||
if(dir==SOUTH)
|
||||
setDir(NORTH)
|
||||
else if(dir==WEST)
|
||||
setDir(EAST)
|
||||
cut_overlays()
|
||||
|
||||
if(!nodes[1] || !opened || !is_operational())
|
||||
icon_state = "relief_valve-t"
|
||||
return
|
||||
|
||||
icon_state = "relief_valve-t-blown"
|
||||
|
||||
/obj/machinery/atmospherics/components/binary/relief_valve/proc/open()
|
||||
opened = TRUE
|
||||
update_icon_nopipes()
|
||||
update_parents()
|
||||
var/datum/pipeline/parent1 = parents[1]
|
||||
parent1.reconcile_air()
|
||||
|
||||
/obj/machinery/atmospherics/components/binary/relief_valve/proc/close()
|
||||
opened = FALSE
|
||||
update_icon_nopipes()
|
||||
|
||||
/obj/machinery/atmospherics/components/binary/relief_valve/process_atmos()
|
||||
..()
|
||||
|
||||
if(!is_operational())
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/air_contents = airs[1]
|
||||
var/our_pressure = air_contents.return_pressure()
|
||||
if(opened && our_pressure < close_pressure)
|
||||
close()
|
||||
else if(!opened && our_pressure >= open_pressure)
|
||||
open()
|
||||
|
||||
/obj/machinery/atmospherics/components/binary/relief_valve/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "atmos_relief", name, 335, 115, master_ui, state)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/atmospherics/components/binary/relief_valve/ui_data()
|
||||
var/data = list()
|
||||
data["open_pressure"] = round(open_pressure)
|
||||
data["close_pressure"] = round(close_pressure)
|
||||
data["max_pressure"] = round(50*ONE_ATMOSPHERE)
|
||||
return data
|
||||
|
||||
/obj/machinery/atmospherics/components/binary/relief_valve/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
switch(action)
|
||||
if("open_pressure")
|
||||
var/pressure = params["open_pressure"]
|
||||
if(pressure == "max")
|
||||
pressure = 50*ONE_ATMOSPHERE
|
||||
. = TRUE
|
||||
else if(pressure == "input")
|
||||
pressure = input("New output pressure ([close_pressure]-[50*ONE_ATMOSPHERE] kPa):", name, open_pressure) as num|null
|
||||
if(!isnull(pressure) && !..())
|
||||
. = TRUE
|
||||
else if(text2num(pressure) != null)
|
||||
pressure = text2num(pressure)
|
||||
. = TRUE
|
||||
if(.)
|
||||
open_pressure = CLAMP(pressure, close_pressure, 50*ONE_ATMOSPHERE)
|
||||
investigate_log("open pressure was set to [open_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS)
|
||||
if("close_pressure")
|
||||
var/pressure = params["close_pressure"]
|
||||
if(pressure == "max")
|
||||
pressure = open_pressure
|
||||
. = TRUE
|
||||
else if(pressure == "input")
|
||||
pressure = input("New output pressure (0-[open_pressure] kPa):", name, close_pressure) as num|null
|
||||
if(!isnull(pressure) && !..())
|
||||
. = TRUE
|
||||
else if(text2num(pressure) != null)
|
||||
pressure = text2num(pressure)
|
||||
. = TRUE
|
||||
if(.)
|
||||
close_pressure = CLAMP(pressure, 0, open_pressure)
|
||||
investigate_log("close pressure was set to [close_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS)
|
||||
update_icon()
|
||||
@@ -0,0 +1,55 @@
|
||||
/obj/machinery/atmospherics/components/unary/passive_vent
|
||||
icon_state = "passive_vent_map-2"
|
||||
|
||||
name = "passive vent"
|
||||
desc = "It is an open vent."
|
||||
can_unwrench = TRUE
|
||||
|
||||
level = 1
|
||||
layer = GAS_SCRUBBER_LAYER
|
||||
|
||||
pipe_state = "pvent"
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/passive_vent/update_icon_nopipes()
|
||||
cut_overlays()
|
||||
if(showpipe)
|
||||
var/image/cap = getpipeimage(icon, "vent_cap", initialize_directions)
|
||||
add_overlay(cap)
|
||||
icon_state = "passive_vent"
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/passive_vent/process_atmos()
|
||||
..()
|
||||
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
var/environment_pressure = environment.return_pressure()
|
||||
var/pressure_delta = abs(environment_pressure - airs[1].return_pressure())
|
||||
|
||||
if((environment.temperature || airs[1].temperature) && pressure_delta > 0.5)
|
||||
if(environment_pressure < airs[1].return_pressure())
|
||||
var/air_temperature = (environment.temperature > 0) ? environment.temperature : airs[1].temperature
|
||||
var/transfer_moles = (pressure_delta * environment.volume) / (air_temperature * R_IDEAL_GAS_EQUATION)
|
||||
var/datum/gas_mixture/removed = airs[1].remove(transfer_moles)
|
||||
loc.assume_air(removed)
|
||||
air_update_turf()
|
||||
else
|
||||
var/air_temperature = (airs[1].temperature > 0) ? airs[1].temperature : environment.temperature
|
||||
var/output_volume = airs[1].volume
|
||||
var/transfer_moles = (pressure_delta * output_volume) / (air_temperature * R_IDEAL_GAS_EQUATION)
|
||||
transfer_moles = min(transfer_moles, environment.total_moles()*airs[1].volume/environment.volume)
|
||||
var/datum/gas_mixture/removed = loc.remove_air(transfer_moles)
|
||||
if(isnull(removed))
|
||||
return
|
||||
airs[1].merge(removed)
|
||||
air_update_turf()
|
||||
update_parents()
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/passive_vent/can_crawl_through()
|
||||
return TRUE
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/passive_vent/layer1
|
||||
piping_layer = PIPING_LAYER_MIN
|
||||
icon_state = "passive_vent_map-1"
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/passive_vent/layer3
|
||||
piping_layer = PIPING_LAYER_MAX
|
||||
icon_state = "passive_vent_map-3"
|
||||
@@ -0,0 +1,111 @@
|
||||
/obj/machinery/atmospherics/components/unary/relief_valve
|
||||
name = "pressure relief valve"
|
||||
desc = "A valve that opens to the air at a certain pressure, then closes once it goes below another."
|
||||
icon = 'icons/obj/atmospherics/components/relief_valve.dmi'
|
||||
icon_state = "relief_valve-e-map"
|
||||
can_unwrench = TRUE
|
||||
var/opened = FALSE
|
||||
var/open_pressure = ONE_ATMOSPHERE * 3
|
||||
var/close_pressure = ONE_ATMOSPHERE
|
||||
pipe_state = "relief_valve-e"
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/relief_valve/layer1
|
||||
piping_layer = PIPING_LAYER_MIN
|
||||
pixel_x = -PIPING_LAYER_P_X
|
||||
pixel_y = -PIPING_LAYER_P_Y
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/relief_valve/layer3
|
||||
piping_layer = PIPING_LAYER_MAX
|
||||
pixel_x = PIPING_LAYER_P_X
|
||||
pixel_y = PIPING_LAYER_P_Y
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/relief_valve/atmos
|
||||
close_pressure = ONE_ATMOSPHERE * 2
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/relief_valve/atmos/atmos_waste
|
||||
name = "atmos waste relief valve"
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/relief_valve/update_icon_nopipes()
|
||||
cut_overlays()
|
||||
|
||||
if(!nodes[1] || !opened || !is_operational())
|
||||
icon_state = "relief_valve-e"
|
||||
return
|
||||
|
||||
icon_state = "relief_valve-e-blown"
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/relief_valve/process_atmos()
|
||||
..()
|
||||
|
||||
if(!is_operational())
|
||||
return
|
||||
|
||||
var/datum/gas_mixture/air_contents = airs[1]
|
||||
var/our_pressure = air_contents.return_pressure()
|
||||
if(opened && our_pressure < close_pressure)
|
||||
opened = FALSE
|
||||
update_icon_nopipes()
|
||||
else if(!opened && our_pressure >= open_pressure)
|
||||
opened = TRUE
|
||||
update_icon_nopipes()
|
||||
if(opened && air_contents.temperature > 0)
|
||||
var/datum/gas_mixture/environment = loc.return_air()
|
||||
var/pressure_delta = our_pressure - environment.return_pressure()
|
||||
var/transfer_moles = pressure_delta*200/(air_contents.temperature * R_IDEAL_GAS_EQUATION)
|
||||
if(transfer_moles > 0)
|
||||
var/datum/gas_mixture/removed = air_contents.remove(transfer_moles)
|
||||
|
||||
loc.assume_air(removed)
|
||||
air_update_turf()
|
||||
|
||||
update_parents()
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/relief_valve/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, \
|
||||
datum/tgui/master_ui = null, datum/ui_state/state = GLOB.default_state)
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "atmos_relief", name, 335, 115, master_ui, state)
|
||||
ui.open()
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/relief_valve/ui_data()
|
||||
var/data = list()
|
||||
data["open_pressure"] = round(open_pressure)
|
||||
data["close_pressure"] = round(close_pressure)
|
||||
data["max_pressure"] = round(50*ONE_ATMOSPHERE)
|
||||
return data
|
||||
|
||||
/obj/machinery/atmospherics/components/unary/relief_valve/ui_act(action, params)
|
||||
if(..())
|
||||
return
|
||||
switch(action)
|
||||
if("open_pressure")
|
||||
var/pressure = params["open_pressure"]
|
||||
if(pressure == "max")
|
||||
pressure = 50*ONE_ATMOSPHERE
|
||||
. = TRUE
|
||||
else if(pressure == "input")
|
||||
pressure = input("New output pressure ([close_pressure]-[50*ONE_ATMOSPHERE] kPa):", name, open_pressure) as num|null
|
||||
if(!isnull(pressure) && !..())
|
||||
. = TRUE
|
||||
else if(text2num(pressure) != null)
|
||||
pressure = text2num(pressure)
|
||||
. = TRUE
|
||||
if(.)
|
||||
open_pressure = CLAMP(pressure, close_pressure, 50*ONE_ATMOSPHERE)
|
||||
investigate_log("open pressure was set to [open_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS)
|
||||
if("close_pressure")
|
||||
var/pressure = params["close_pressure"]
|
||||
if(pressure == "max")
|
||||
pressure = open_pressure
|
||||
. = TRUE
|
||||
else if(pressure == "input")
|
||||
pressure = input("New output pressure (0-[open_pressure] kPa):", name, close_pressure) as num|null
|
||||
if(!isnull(pressure) && !..())
|
||||
. = TRUE
|
||||
else if(text2num(pressure) != null)
|
||||
pressure = text2num(pressure)
|
||||
. = TRUE
|
||||
if(.)
|
||||
close_pressure = CLAMP(pressure, 0, open_pressure)
|
||||
investigate_log("close pressure was set to [close_pressure] kPa by [key_name(usr)]", INVESTIGATE_ATMOS)
|
||||
update_icon()
|
||||
@@ -227,6 +227,11 @@
|
||||
if(V.on)
|
||||
PL |= V.parents[1]
|
||||
PL |= V.parents[2]
|
||||
else if (istype(atmosmch,/obj/machinery/atmospherics/components/binary/relief_valve))
|
||||
var/obj/machinery/atmospherics/components/binary/relief_valve/V = atmosmch
|
||||
if(V.opened)
|
||||
PL |= V.parents[1]
|
||||
PL |= V.parents[2]
|
||||
else if (istype(atmosmch, /obj/machinery/atmospherics/components/unary/portables_connector))
|
||||
var/obj/machinery/atmospherics/components/unary/portables_connector/C = atmosmch
|
||||
if(C.connected_device)
|
||||
|
||||
@@ -35,7 +35,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
/obj/machinery/atmospherics/pipe/simple/general/visible
|
||||
level = PIPE_VISIBLE_LEVEL
|
||||
layer = GAS_PIPE_VISIBLE_LAYER
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/general/visible/layer1
|
||||
piping_layer = PIPING_LAYER_MIN
|
||||
pixel_x = -PIPING_LAYER_P_X
|
||||
@@ -58,7 +58,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
piping_layer = PIPING_LAYER_MAX
|
||||
pixel_x = PIPING_LAYER_P_X
|
||||
pixel_y = PIPING_LAYER_P_Y
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers
|
||||
name="scrubbers pipe"
|
||||
pipe_color=rgb(255,0,0)
|
||||
@@ -77,7 +77,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
piping_layer = PIPING_LAYER_MAX
|
||||
pixel_x = PIPING_LAYER_P_X
|
||||
pixel_y = PIPING_LAYER_P_Y
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden
|
||||
level = PIPE_HIDDEN_LEVEL
|
||||
|
||||
@@ -90,7 +90,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
piping_layer = PIPING_LAYER_MAX
|
||||
pixel_x = PIPING_LAYER_P_X
|
||||
pixel_y = PIPING_LAYER_P_Y
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/supply
|
||||
name="air supply pipe"
|
||||
pipe_color=rgb(0,0,255)
|
||||
@@ -99,7 +99,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/visible
|
||||
level = PIPE_VISIBLE_LEVEL
|
||||
layer = GAS_PIPE_VISIBLE_LAYER
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/supply/visible/layer1
|
||||
piping_layer = PIPING_LAYER_MIN
|
||||
pixel_x = -PIPING_LAYER_P_X
|
||||
@@ -122,7 +122,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
piping_layer = PIPING_LAYER_MAX
|
||||
pixel_x = PIPING_LAYER_P_X
|
||||
pixel_y = PIPING_LAYER_P_Y
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/supplymain
|
||||
name="main air supply pipe"
|
||||
pipe_color=rgb(130,43,255)
|
||||
@@ -141,7 +141,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
piping_layer = PIPING_LAYER_MAX
|
||||
pixel_x = PIPING_LAYER_P_X
|
||||
pixel_y = PIPING_LAYER_P_Y
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/supplymain/hidden
|
||||
level = PIPE_HIDDEN_LEVEL
|
||||
|
||||
@@ -154,7 +154,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
piping_layer = PIPING_LAYER_MAX
|
||||
pixel_x = PIPING_LAYER_P_X
|
||||
pixel_y = PIPING_LAYER_P_Y
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/yellow
|
||||
pipe_color=rgb(255,198,0)
|
||||
color=rgb(255,198,0)
|
||||
@@ -172,7 +172,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
piping_layer = PIPING_LAYER_MAX
|
||||
pixel_x = PIPING_LAYER_P_X
|
||||
pixel_y = PIPING_LAYER_P_Y
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/yellow/hidden
|
||||
level = PIPE_HIDDEN_LEVEL
|
||||
|
||||
@@ -185,7 +185,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
piping_layer = PIPING_LAYER_MAX
|
||||
pixel_x = PIPING_LAYER_P_X
|
||||
pixel_y = PIPING_LAYER_P_Y
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/cyan
|
||||
pipe_color=rgb(0,255,249)
|
||||
color=rgb(0,255,249)
|
||||
@@ -193,7 +193,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
/obj/machinery/atmospherics/pipe/simple/cyan/visible
|
||||
level = PIPE_VISIBLE_LEVEL
|
||||
layer = GAS_PIPE_VISIBLE_LAYER
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/cyan/visible/layer1
|
||||
piping_layer = PIPING_LAYER_MIN
|
||||
pixel_x = -PIPING_LAYER_P_X
|
||||
@@ -206,7 +206,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/cyan/hidden
|
||||
level = PIPE_HIDDEN_LEVEL
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/cyan/hidden/layer1
|
||||
piping_layer = PIPING_LAYER_MIN
|
||||
pixel_x = -PIPING_LAYER_P_X
|
||||
@@ -224,7 +224,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
/obj/machinery/atmospherics/pipe/simple/green/visible
|
||||
level = PIPE_VISIBLE_LEVEL
|
||||
layer = GAS_PIPE_VISIBLE_LAYER
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/green/visible/layer1
|
||||
piping_layer = PIPING_LAYER_MIN
|
||||
pixel_x = -PIPING_LAYER_P_X
|
||||
@@ -237,7 +237,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/green/hidden
|
||||
level = PIPE_HIDDEN_LEVEL
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/green/hidden/layer1
|
||||
piping_layer = PIPING_LAYER_MIN
|
||||
pixel_x = -PIPING_LAYER_P_X
|
||||
@@ -255,7 +255,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
/obj/machinery/atmospherics/pipe/simple/orange/visible
|
||||
level = PIPE_VISIBLE_LEVEL
|
||||
layer = GAS_PIPE_VISIBLE_LAYER
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/orange/visible/layer1
|
||||
piping_layer = PIPING_LAYER_MIN
|
||||
pixel_x = -PIPING_LAYER_P_X
|
||||
@@ -268,7 +268,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/orange/hidden
|
||||
level = PIPE_HIDDEN_LEVEL
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/orange/hidden/layer1
|
||||
piping_layer = PIPING_LAYER_MIN
|
||||
pixel_x = -PIPING_LAYER_P_X
|
||||
@@ -286,7 +286,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
/obj/machinery/atmospherics/pipe/simple/purple/visible
|
||||
level = PIPE_VISIBLE_LEVEL
|
||||
layer = GAS_PIPE_VISIBLE_LAYER
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/purple/visible/layer1
|
||||
piping_layer = PIPING_LAYER_MIN
|
||||
pixel_x = -PIPING_LAYER_P_X
|
||||
@@ -309,7 +309,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
piping_layer = PIPING_LAYER_MAX
|
||||
pixel_x = PIPING_LAYER_P_X
|
||||
pixel_y = PIPING_LAYER_P_Y
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/dark
|
||||
pipe_color=rgb(69,69,69)
|
||||
color=rgb(69,69,69)
|
||||
@@ -317,7 +317,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
/obj/machinery/atmospherics/pipe/simple/dark/visible
|
||||
level = PIPE_VISIBLE_LEVEL
|
||||
layer = GAS_PIPE_VISIBLE_LAYER
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/dark/visible/layer1
|
||||
piping_layer = PIPING_LAYER_MIN
|
||||
pixel_x = -PIPING_LAYER_P_X
|
||||
@@ -340,7 +340,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
piping_layer = PIPING_LAYER_MAX
|
||||
pixel_x = PIPING_LAYER_P_X
|
||||
pixel_y = PIPING_LAYER_P_Y
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/violet
|
||||
pipe_color=rgb(64,0,128)
|
||||
color=rgb(64,0,128)
|
||||
@@ -348,7 +348,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
/obj/machinery/atmospherics/pipe/simple/violet/visible
|
||||
level = PIPE_VISIBLE_LEVEL
|
||||
layer = GAS_PIPE_VISIBLE_LAYER
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/violet/visible/layer1
|
||||
piping_layer = PIPING_LAYER_MIN
|
||||
pixel_x = -PIPING_LAYER_P_X
|
||||
@@ -371,7 +371,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
piping_layer = PIPING_LAYER_MAX
|
||||
pixel_x = PIPING_LAYER_P_X
|
||||
pixel_y = PIPING_LAYER_P_Y
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/brown
|
||||
pipe_color=rgb(178,100,56)
|
||||
color=rgb(178,100,56)
|
||||
@@ -379,7 +379,7 @@ The regular pipe you see everywhere, including bent ones.
|
||||
/obj/machinery/atmospherics/pipe/simple/brown/visible
|
||||
level = PIPE_VISIBLE_LEVEL
|
||||
layer = GAS_PIPE_VISIBLE_LAYER
|
||||
|
||||
|
||||
/obj/machinery/atmospherics/pipe/simple/brown/visible/layer1
|
||||
piping_layer = PIPING_LAYER_MIN
|
||||
pixel_x = -PIPING_LAYER_P_X
|
||||
|
||||
@@ -73,6 +73,17 @@
|
||||
crate_name = "atmospherics hardsuit"
|
||||
crate_type = /obj/structure/closet/crate/secure/engineering
|
||||
|
||||
/datum/supply_pack/engineering/radhardsuit
|
||||
name = "Radiation Hardsuit"
|
||||
desc = "The Singulo is loose? Do you need to do a few changes to its containment and don't want to spent the rest of the shift under the shower? Get this Radiation Hardsuit! It protect from radiations and space only."
|
||||
cost = 3500
|
||||
access = ACCESS_ENGINE
|
||||
contains = list(/obj/item/tank/internals/air,
|
||||
/obj/item/clothing/mask/gas,
|
||||
/obj/item/clothing/suit/space/hardsuit/engine/rad)
|
||||
crate_name = "radiation hardsuit"
|
||||
crate_type = /obj/structure/closet/crate/secure/engineering
|
||||
|
||||
/datum/supply_pack/engineering/industrialrcd
|
||||
name = "Industrial RCD"
|
||||
desc = "An industrial RCD in case the station has gone through more then one meteor storm and the CE needs to bring out the somthing a bit more reliable. Does not contain spare ammo for the industrial RCD or any other RCD models."
|
||||
|
||||
@@ -203,6 +203,31 @@
|
||||
max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/atmos
|
||||
|
||||
//Radiation
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/engine/rad
|
||||
name = "radiation hardsuit helmet"
|
||||
desc = "A special helmet that protects against radiation and space. Not much else unfortunately."
|
||||
icon_state = "cespace_helmet"
|
||||
item_state = "nothing"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0)
|
||||
item_color = "engineering"
|
||||
resistance_flags = FIRE_PROOF
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
actions_types = list()
|
||||
|
||||
/obj/item/clothing/suit/space/hardsuit/engine/rad
|
||||
name = "radiation hardsuit"
|
||||
desc = "A special suit that protects against radiation and space. Not much else unfortunately."
|
||||
icon_state = "hardsuit-rad"
|
||||
item_state = "nothing"
|
||||
armor = list("melee" = 0, "bullet" = 0, "laser" = 0, "energy" = 0, "bomb" = 0, "bio" = 100, "rad" = 100, "fire" = 0, "acid" = 0)
|
||||
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/rad
|
||||
resistance_flags = FIRE_PROOF
|
||||
rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE
|
||||
mutantrace_variation = NONE
|
||||
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/engine/rad/attack_self()
|
||||
return //Sprites required for flashlight
|
||||
|
||||
//Chief Engineer's hardsuit
|
||||
/obj/item/clothing/head/helmet/space/hardsuit/engine/elite
|
||||
|
||||
@@ -158,6 +158,7 @@
|
||||
I.CheckParts(parts, R)
|
||||
if(send_feedback)
|
||||
SSblackbox.record_feedback("tally", "object_crafted", 1, I.type)
|
||||
log_craft("[I] crafted by [user] at [loc_name(I.loc)]")
|
||||
return 0
|
||||
return "."
|
||||
return ", missing tool."
|
||||
|
||||
@@ -65,7 +65,7 @@
|
||||
reagents.add_reagent(extra_reagent, 3)
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/meat
|
||||
name = "Meat Donut"
|
||||
name = "meat donut"
|
||||
desc = "Tastes as gross as it looks."
|
||||
icon_state = "donut_meat"
|
||||
bonus_reagents = list(/datum/reagent/consumable/ketchup = 1)
|
||||
@@ -152,7 +152,7 @@
|
||||
icon_state = "jelly"
|
||||
decorated_icon = "jelly_homer"
|
||||
bonus_reagents = list(/datum/reagent/consumable/sugar = 1, /datum/reagent/consumable/nutriment/vitamin = 1)
|
||||
extra_reagent = "berryjuice"
|
||||
extra_reagent = /datum/reagent/consumable/berryjuice
|
||||
tastes = list("jelly" = 1, "donut" = 3)
|
||||
foodtype = JUNKFOOD | GRAIN | FRIED | FRUIT | SUGAR | BREAKFAST
|
||||
|
||||
@@ -240,7 +240,7 @@
|
||||
name = "jelly donut"
|
||||
desc = "You jelly?"
|
||||
icon_state = "jelly"
|
||||
extra_reagent = "slimejelly"
|
||||
extra_reagent = /datum/reagent/toxin/slimejelly
|
||||
foodtype = JUNKFOOD | GRAIN | FRIED | TOXIC | SUGAR | BREAKFAST
|
||||
|
||||
/obj/item/reagent_containers/food/snacks/donut/jelly/slimejelly/plain
|
||||
|
||||
@@ -90,6 +90,7 @@
|
||||
return ..()
|
||||
if(istype(Proj , /obj/item/projectile/energy/floramut))
|
||||
mutate()
|
||||
return BULLET_ACT_HIT
|
||||
else if(istype(Proj , /obj/item/projectile/energy/florayield))
|
||||
return myseed.bullet_act(Proj)
|
||||
else
|
||||
|
||||
@@ -145,6 +145,7 @@ obj/item/seeds/proc/is_gene_forbidden(typepath)
|
||||
adjust_yield(1 * rating)
|
||||
else if(prob(1/(yield * yield) * 100))//This formula gives you diminishing returns based on yield. 100% with 1 yield, decreasing to 25%, 11%, 6, 4, 2...
|
||||
adjust_yield(1 * rating)
|
||||
return BULLET_ACT_HIT
|
||||
else
|
||||
return ..()
|
||||
|
||||
|
||||
-87
@@ -1,90 +1,4 @@
|
||||
//Landmarks and other helpers which speed up the mapping process and reduce the number of unique instances/subtypes of items/turf/ect
|
||||
|
||||
|
||||
|
||||
/obj/effect/baseturf_helper //Set the baseturfs of every turf in the /area/ it is placed.
|
||||
name = "baseturf editor"
|
||||
icon = 'icons/effects/mapping_helpers.dmi'
|
||||
icon_state = ""
|
||||
|
||||
var/list/baseturf_to_replace
|
||||
var/baseturf
|
||||
|
||||
layer = POINT_LAYER
|
||||
|
||||
/obj/effect/baseturf_helper/Initialize()
|
||||
. = ..()
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/obj/effect/baseturf_helper/LateInitialize()
|
||||
if(!baseturf_to_replace)
|
||||
baseturf_to_replace = typecacheof(list(/turf/open/space,/turf/baseturf_bottom))
|
||||
else if(!length(baseturf_to_replace))
|
||||
baseturf_to_replace = list(baseturf_to_replace = TRUE)
|
||||
else if(baseturf_to_replace[baseturf_to_replace[1]] != TRUE) // It's not associative
|
||||
var/list/formatted = list()
|
||||
for(var/i in baseturf_to_replace)
|
||||
formatted[i] = TRUE
|
||||
baseturf_to_replace = formatted
|
||||
|
||||
var/area/our_area = get_area(src)
|
||||
for(var/i in get_area_turfs(our_area, z))
|
||||
replace_baseturf(i)
|
||||
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/baseturf_helper/proc/replace_baseturf(turf/thing)
|
||||
var/list/baseturf_cache = thing.baseturfs
|
||||
if(length(baseturf_cache))
|
||||
for(var/i in baseturf_cache)
|
||||
if(baseturf_to_replace[i])
|
||||
baseturf_cache -= i
|
||||
if(!baseturf_cache.len)
|
||||
thing.assemble_baseturfs(baseturf)
|
||||
else
|
||||
thing.PlaceOnBottom(null, baseturf)
|
||||
else if(baseturf_to_replace[thing.baseturfs])
|
||||
thing.assemble_baseturfs(baseturf)
|
||||
else
|
||||
thing.PlaceOnBottom(null, baseturf)
|
||||
|
||||
/obj/effect/baseturf_helper/space
|
||||
name = "space baseturf editor"
|
||||
baseturf = /turf/open/space
|
||||
|
||||
/obj/effect/baseturf_helper/asteroid
|
||||
name = "asteroid baseturf editor"
|
||||
baseturf = /turf/open/floor/plating/asteroid
|
||||
|
||||
/obj/effect/baseturf_helper/asteroid/airless
|
||||
name = "asteroid airless baseturf editor"
|
||||
baseturf = /turf/open/floor/plating/asteroid/airless
|
||||
|
||||
/obj/effect/baseturf_helper/asteroid/basalt
|
||||
name = "asteroid basalt baseturf editor"
|
||||
baseturf = /turf/open/floor/plating/asteroid/basalt
|
||||
|
||||
/obj/effect/baseturf_helper/asteroid/snow
|
||||
name = "asteroid snow baseturf editor"
|
||||
baseturf = /turf/open/floor/plating/asteroid/snow
|
||||
|
||||
/obj/effect/baseturf_helper/beach/sand
|
||||
name = "beach sand baseturf editor"
|
||||
baseturf = /turf/open/floor/plating/beach/sand
|
||||
|
||||
/obj/effect/baseturf_helper/beach/water
|
||||
name = "water baseturf editor"
|
||||
baseturf = /turf/open/floor/plating/beach/water
|
||||
|
||||
/obj/effect/baseturf_helper/lava
|
||||
name = "lava baseturf editor"
|
||||
baseturf = /turf/open/lava/smooth
|
||||
|
||||
/obj/effect/baseturf_helper/lava_land/surface
|
||||
name = "lavaland baseturf editor"
|
||||
baseturf = /turf/open/lava/smooth/lava_land_surface
|
||||
|
||||
|
||||
/obj/effect/mapping_helpers
|
||||
icon = 'icons/effects/mapping_helpers.dmi'
|
||||
icon_state = ""
|
||||
@@ -94,7 +8,6 @@
|
||||
..()
|
||||
return late ? INITIALIZE_HINT_LATELOAD : INITIALIZE_HINT_QDEL
|
||||
|
||||
|
||||
//airlock helpers
|
||||
/obj/effect/mapping_helpers/airlock
|
||||
layer = DOOR_HELPER_LAYER
|
||||
@@ -0,0 +1,82 @@
|
||||
/obj/effect/baseturf_helper //Set the baseturfs of every turf in the /area/ it is placed.
|
||||
name = "baseturf editor"
|
||||
icon = 'icons/effects/mapping_helpers.dmi'
|
||||
icon_state = ""
|
||||
|
||||
var/list/baseturf_to_replace
|
||||
var/baseturf
|
||||
|
||||
layer = POINT_LAYER
|
||||
|
||||
/obj/effect/baseturf_helper/Initialize()
|
||||
. = ..()
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/obj/effect/baseturf_helper/LateInitialize()
|
||||
if(!baseturf_to_replace)
|
||||
baseturf_to_replace = typecacheof(list(/turf/open/space,/turf/baseturf_bottom))
|
||||
else if(!length(baseturf_to_replace))
|
||||
baseturf_to_replace = list(baseturf_to_replace = TRUE)
|
||||
else if(baseturf_to_replace[baseturf_to_replace[1]] != TRUE) // It's not associative
|
||||
var/list/formatted = list()
|
||||
for(var/i in baseturf_to_replace)
|
||||
formatted[i] = TRUE
|
||||
baseturf_to_replace = formatted
|
||||
|
||||
var/area/our_area = get_area(src)
|
||||
for(var/i in get_area_turfs(our_area, z))
|
||||
replace_baseturf(i)
|
||||
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/baseturf_helper/proc/replace_baseturf(turf/thing)
|
||||
var/list/baseturf_cache = thing.baseturfs
|
||||
if(length(baseturf_cache))
|
||||
for(var/i in baseturf_cache)
|
||||
if(baseturf_to_replace[i])
|
||||
baseturf_cache -= i
|
||||
if(!baseturf_cache.len)
|
||||
thing.assemble_baseturfs(baseturf)
|
||||
else
|
||||
thing.PlaceOnBottom(null, baseturf)
|
||||
else if(baseturf_to_replace[thing.baseturfs])
|
||||
thing.assemble_baseturfs(baseturf)
|
||||
else
|
||||
thing.PlaceOnBottom(null, baseturf)
|
||||
|
||||
/obj/effect/baseturf_helper/space
|
||||
name = "space baseturf editor"
|
||||
baseturf = /turf/open/space
|
||||
|
||||
/obj/effect/baseturf_helper/asteroid
|
||||
name = "asteroid baseturf editor"
|
||||
baseturf = /turf/open/floor/plating/asteroid
|
||||
|
||||
/obj/effect/baseturf_helper/asteroid/airless
|
||||
name = "asteroid airless baseturf editor"
|
||||
baseturf = /turf/open/floor/plating/asteroid/airless
|
||||
|
||||
/obj/effect/baseturf_helper/asteroid/basalt
|
||||
name = "asteroid basalt baseturf editor"
|
||||
baseturf = /turf/open/floor/plating/asteroid/basalt
|
||||
|
||||
/obj/effect/baseturf_helper/asteroid/snow
|
||||
name = "asteroid snow baseturf editor"
|
||||
baseturf = /turf/open/floor/plating/asteroid/snow
|
||||
|
||||
/obj/effect/baseturf_helper/beach/sand
|
||||
name = "beach sand baseturf editor"
|
||||
baseturf = /turf/open/floor/plating/beach/sand
|
||||
|
||||
/obj/effect/baseturf_helper/beach/water
|
||||
name = "water baseturf editor"
|
||||
baseturf = /turf/open/floor/plating/beach/water
|
||||
|
||||
/obj/effect/baseturf_helper/lava
|
||||
name = "lava baseturf editor"
|
||||
baseturf = /turf/open/lava/smooth
|
||||
|
||||
/obj/effect/baseturf_helper/lava_land/surface
|
||||
name = "lavaland baseturf editor"
|
||||
baseturf = /turf/open/lava/smooth/lava_land_surface
|
||||
|
||||
@@ -0,0 +1,43 @@
|
||||
//Builds networks like power cables/atmos lines/etc
|
||||
//Just a holder parent type for now..
|
||||
/obj/effect/mapping_helpers/network_builder
|
||||
/// set var to true to not del on lateload
|
||||
var/custom_spawned = FALSE
|
||||
|
||||
icon = 'icons/effects/mapping_helpers.dmi'
|
||||
|
||||
late = TRUE
|
||||
/// what directions we know connections are in
|
||||
var/list/network_directions = list()
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/Initialize(mapload)
|
||||
. = ..()
|
||||
to_chat(world, "DEBUG: Initializing [COORD(src)]")
|
||||
var/conflict = check_duplicates()
|
||||
if(conflict)
|
||||
stack_trace("WARNING: [type] network building helper found check_duplicates() conflict [conflict] in its location.!")
|
||||
return INITIALIZE_HINT_QDEL
|
||||
if(!mapload)
|
||||
if(GLOB.Debug2)
|
||||
custom_spawned = TRUE
|
||||
return INITIALIZE_HINT_NORMAL
|
||||
else
|
||||
return INITIALIZE_HINT_QDEL
|
||||
return INITIALIZE_HINT_LATELOAD
|
||||
|
||||
/// How this works: On LateInitialize, detect all directions that this should be applicable to, and do what it needs to do, and then inform all network builders in said directions that it's been around since it won't be around afterwards.
|
||||
/obj/effect/mapping_helpers/network_builder/LateInitialize()
|
||||
to_chat(world, "DEBUG: LateInitializing [COORD(src)]")
|
||||
scan_directions()
|
||||
build_network()
|
||||
if(!custom_spawned)
|
||||
qdel(src)
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/proc/check_duplicates()
|
||||
CRASH("Base abstract network builder tried to check duplicates.")
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/proc/scan_directions()
|
||||
CRASH("Base abstract network builder tried to scan directions.")
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/proc/build_network()
|
||||
CRASH("Base abstract network builder tried to build network.")
|
||||
@@ -0,0 +1,96 @@
|
||||
/* Automatically places pipes on init based on any pipes connecting to it and adjacent helpers. Only supports cardinals.
|
||||
* Conflicts with ANY PIPE ON ITS LAYER, as well as atmos network build helpers on the same layer, as well as any pipe on all layers. Do those manually.
|
||||
*/
|
||||
/obj/effect/mapping_helpers/network_builder/atmos_pipe
|
||||
name = "atmos pipe autobuilder"
|
||||
icon_state = "atmospipebuilder"
|
||||
|
||||
/// Layer to put our pipes on
|
||||
var/pipe_layer = PIPING_LAYER_DEFAULT
|
||||
|
||||
/// Color to set our pipes to
|
||||
var/pipe_color
|
||||
|
||||
/// Whether or not pipes we make are visible
|
||||
var/visible_pipes = FALSE
|
||||
|
||||
color = null
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/atmos_pipe/check_duplicates()
|
||||
for(var/obj/effect/mapping_helpers/network_builder/atmos_pipe/other in loc)
|
||||
if(other == src)
|
||||
continue
|
||||
if(other.pipe_layer == pipe_layer)
|
||||
return other
|
||||
for(var/obj/machinery/atmospherics/A in loc)
|
||||
if(A.pipe_flags & PIPING_ALL_LAYER)
|
||||
return A
|
||||
if(A.piping_layer == pipe_layer)
|
||||
return A
|
||||
return FALSE
|
||||
|
||||
/// Scans directions, sets network_directions to have every direction that we can link to. If there's another power cable builder detected, make sure they know we're here by adding us to their cable directions list before we're deleted.
|
||||
/obj/effect/mapping_helpers/network_builder/atmos_pipe/scan_directions()
|
||||
var/turf/T
|
||||
for(var/i in GLOB.cardinals)
|
||||
if(i in network_directions)
|
||||
continue //we're already set, that means another builder set us.
|
||||
T = get_step(loc, i)
|
||||
if(!T)
|
||||
continue
|
||||
var/found = FALSE
|
||||
for(var/obj/effect/mapping_helpers/network_builder/atmos_pipe/other in T)
|
||||
if(other.pipe_layer == pipe_layer)
|
||||
network_directions += i
|
||||
other.network_directions += turn(i, 180)
|
||||
found = TRUE
|
||||
break
|
||||
if(found)
|
||||
continue
|
||||
for(var/obj/machinery/atmospherics/A in T)
|
||||
if((A.piping_layer == pipe_layer) && (A.initialize_directions & turn(i, 180)))
|
||||
network_directions += i
|
||||
break
|
||||
return network_directions
|
||||
|
||||
/// Directions should only ever have cardinals.
|
||||
/obj/effect/mapping_helpers/network_builder/atmos_pipe/build_network()
|
||||
if(length(network_directions) <= 1)
|
||||
return
|
||||
var/obj/machinery/atmospherics/pipe/built
|
||||
switch(length(network_directions))
|
||||
if(2) //straight pipe
|
||||
built = new /obj/machinery/atmospherics/pipe/simple(loc)
|
||||
var/d1 = network_directions[1]
|
||||
var/d2 = network_directions[2]
|
||||
var/combined = d1 | d2
|
||||
if(combined in GLOB.diagonals)
|
||||
built.setDir(combined)
|
||||
else
|
||||
built.setDir(d1)
|
||||
if(3) //manifold
|
||||
var/list/missing = network_directions ^ GLOB.cardinals
|
||||
missing = missing[1]
|
||||
built = new /obj/machinery/atmospherics/pipe/manifold(loc)
|
||||
built.setDir(missing)
|
||||
if(4) //4 way manifold
|
||||
built = new /obj/machinery/atmospherics/pipe/manifold4w(loc)
|
||||
built.SetInitDirections()
|
||||
built.on_construction(pipe_color, pipe_layer)
|
||||
built.hide(!visible_pipes)
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/atmos_pipe/distro
|
||||
name = "distro line autobuilder"
|
||||
pipe_layer = PIPING_LAYER_MIN
|
||||
pixel_x = -PIPING_LAYER_P_X
|
||||
pixel_y = -PIPING_LAYER_P_Y
|
||||
pipe_color = rgb(130,43,255)
|
||||
color = rgb(130,43,255)
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/atmos_pipe/scrubbers
|
||||
name = "scrubbers line autobuilder"
|
||||
pipe_layer = PIPING_LAYER_MAX
|
||||
pixel_x = PIPING_LAYER_P_X
|
||||
pixel_y = PIPING_LAYER_P_Y
|
||||
pipe_color = rgb(255,0,0)
|
||||
color = rgb(255,0,0)
|
||||
@@ -0,0 +1,189 @@
|
||||
#define NO_KNOT 0
|
||||
#define KNOT_AUTO 1
|
||||
#define KNOT_FORCED 2
|
||||
|
||||
/// Automatically links on init to power cables and other cable builder helpers. Only supports cardinals.
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable
|
||||
name = "power line autobuilder"
|
||||
icon_state = "powerlinebuilder"
|
||||
|
||||
color = "#ff0000"
|
||||
|
||||
/// Whether or not we forcefully make a knot
|
||||
var/knot = NO_KNOT
|
||||
|
||||
/// cable color as from GLOB.cable_colors
|
||||
var/cable_color = "red"
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/check_duplicates()
|
||||
var/obj/structure/cable/C = locate() in loc
|
||||
if(C)
|
||||
return C
|
||||
for(var/obj/effect/mapping_helpers/network_builder/power_cable/other in loc)
|
||||
if(other == src)
|
||||
continue
|
||||
return other
|
||||
|
||||
/// Scans directions, sets network_directions to have every direction that we can link to. If there's another power cable builder detected, make sure they know we're here by adding us to their cable directions list before we're deleted.
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/scan_directions()
|
||||
var/turf/T
|
||||
for(var/i in GLOB.cardinals)
|
||||
if(i in network_directions)
|
||||
continue //we're already set, that means another builder set us.
|
||||
T = get_step(loc, i)
|
||||
if(!T)
|
||||
continue
|
||||
var/obj/effect/mapping_helpers/network_builder/power_cable/other = locate() in T
|
||||
if(other)
|
||||
network_directions += i
|
||||
other.network_directions += turn(i, 180)
|
||||
continue
|
||||
for(var/obj/structure/cable/C in T)
|
||||
if(C.d1 == turn(i, 180) || C.d2 == turn(i, 180))
|
||||
network_directions += i
|
||||
continue
|
||||
return network_directions
|
||||
|
||||
/// Directions should only ever have cardinals.
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/build_network()
|
||||
if(!length(network_directions))
|
||||
return
|
||||
else if(length(network_directions) == 1)
|
||||
new /obj/structure/cable(loc, cable_color, NONE, network_directions[1])
|
||||
else
|
||||
if(knot == KNOT_FORCED)
|
||||
for(var/d in network_directions)
|
||||
new /obj/structure/cable(loc, cable_color, NONE, d)
|
||||
else
|
||||
var/do_knot = (knot == KNOT_FORCED) || ((knot == KNOT_AUTO) && should_auto_knot())
|
||||
var/dirs = length(network_directions)
|
||||
for(var/i in 1 to dirs - 1)
|
||||
var/li = (i == 1)? dirs : (i - 1)
|
||||
var/d1 = network_directions[i]
|
||||
var/d2 = network_directions[li]
|
||||
if(d1 > d2) //this is ugly please help me
|
||||
d1 = network_directions[li]
|
||||
d2 = network_directions[i]
|
||||
new /obj/structure/cable(loc, cable_color, d1, d2)
|
||||
if(do_knot)
|
||||
new /obj/structure/cable(loc, cable_color, NONE, network_directions[i])
|
||||
do_knot = FALSE
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/proc/should_auto_knot()
|
||||
return (locate(/obj/machinery/power/terminal) in loc)
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/knot
|
||||
icon_state = "powerlinebuilderknot"
|
||||
knot = KNOT_FORCED
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/auto
|
||||
icon_state = "powerlinebuilderauto"
|
||||
knot = KNOT_AUTO
|
||||
|
||||
// Red
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/red
|
||||
color = "#ff0000"
|
||||
cable_color = "red"
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/red/knot
|
||||
icon_state = "powerlinebuilderknot"
|
||||
knot = KNOT_FORCED
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/red/auto
|
||||
icon_state = "powerlinebuilderauto"
|
||||
knot = KNOT_AUTO
|
||||
|
||||
// White
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/white
|
||||
color = "#ffffff"
|
||||
cable_color = "white"
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/white/knot
|
||||
icon_state = "powerlinebuilderknot"
|
||||
knot = KNOT_FORCED
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/white/auto
|
||||
icon_state = "powerlinebuilderauto"
|
||||
knot = KNOT_AUTO
|
||||
|
||||
// Cyan
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/cyan
|
||||
color = "#00ffff"
|
||||
cable_color = "cyan"
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/cyan/knot
|
||||
icon_state = "powerlinebuilderknot"
|
||||
knot = KNOT_FORCED
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/cyan/auto
|
||||
icon_state = "powerlinebuilderauto"
|
||||
knot = KNOT_AUTO
|
||||
|
||||
// Orange
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/orange
|
||||
color = "#ff8000"
|
||||
cable_color = "orange"
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/orange/knot
|
||||
icon_state = "powerlinebuilderknot"
|
||||
knot = KNOT_FORCED
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/orange/auto
|
||||
icon_state = "powerlinebuilderauto"
|
||||
knot = KNOT_AUTO
|
||||
|
||||
// Pink
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/pink
|
||||
color = "#ff3cc8"
|
||||
cable_color = "pink"
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/pink/knot
|
||||
icon_state = "powerlinebuilderknot"
|
||||
knot = KNOT_FORCED
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/pink/auto
|
||||
icon_state = "powerlinebuilderauto"
|
||||
knot = KNOT_AUTO
|
||||
|
||||
// Blue
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/blue
|
||||
color = "#1919c8"
|
||||
cable_color = "blue"
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/blue/knot
|
||||
icon_state = "powerlinebuilderknot"
|
||||
knot = KNOT_FORCED
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/blue/auto
|
||||
icon_state = "powerlinebuilderauto"
|
||||
knot = KNOT_AUTO
|
||||
|
||||
// Green
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/green
|
||||
color = "#00aa00"
|
||||
cable_color = "green"
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/green/knot
|
||||
icon_state = "powerlinebuilderknot"
|
||||
knot = KNOT_FORCED
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/green/auto
|
||||
icon_state = "powerlinebuilderauto"
|
||||
knot = KNOT_AUTO
|
||||
|
||||
// Yellow
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/yellow
|
||||
color = "#ffff00"
|
||||
cable_color = "yellow"
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/yellow/knot
|
||||
icon_state = "powerlinebuilderknot"
|
||||
knot = KNOT_FORCED
|
||||
|
||||
/obj/effect/mapping_helpers/network_builder/power_cable/yellow/auto
|
||||
icon_state = "powerlinebuilderauto"
|
||||
knot = KNOT_AUTO
|
||||
|
||||
#undef NO_KNOT
|
||||
#undef KNOT_AUTO
|
||||
#undef KNOT_FORCED
|
||||
@@ -87,6 +87,14 @@
|
||||
return
|
||||
. = ..()
|
||||
|
||||
/obj/machinery/computer/shuttle/mining/common
|
||||
name = "lavaland shuttle console"
|
||||
desc = "Used to call and send the lavaland shuttle."
|
||||
req_access = list()
|
||||
circuit = /obj/item/circuitboard/computer/mining_shuttle/common
|
||||
shuttleId = "mining_common"
|
||||
possible_destinations = "whiteship_home;lavaland_common_away;landing_zone_dock;mining_public"
|
||||
|
||||
/**********************Mining car (Crate like thing, not the rail car)**************************/
|
||||
|
||||
/obj/structure/closet/crate/miningcar
|
||||
|
||||
@@ -250,7 +250,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\
|
||||
|
||||
/obj/item/twohanded/required/gibtonite/bullet_act(obj/item/projectile/P)
|
||||
GibtoniteReaction(P.firer)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/obj/item/twohanded/required/gibtonite/ex_act()
|
||||
GibtoniteReaction(null, 1)
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
/obj/effect/dummy/phased_mob/slaughter/ex_act()
|
||||
return
|
||||
/obj/effect/dummy/phased_mob/slaughter/bullet_act()
|
||||
return
|
||||
return BULLET_ACT_FORCE_PIERCE
|
||||
|
||||
/obj/effect/dummy/phased_mob/slaughter/singularity_act()
|
||||
return
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
if(prob(mind.martial_art.dodge_chance))
|
||||
var/dodgemessage = pick("dodges under the projectile!","dodges to the right of the projectile!","jumps over the projectile!")
|
||||
visible_message("<span class='danger'>[src] [dodgemessage]</span>", "<span class='userdanger'>You dodge the projectile!</span>")
|
||||
return -1
|
||||
return BULLET_ACT_BLOCK
|
||||
if(mind.martial_art && !incapacitated(FALSE, TRUE) && mind.martial_art.can_use(src) && mind.martial_art.deflection_chance) //Some martial arts users can deflect projectiles!
|
||||
if(prob(mind.martial_art.deflection_chance))
|
||||
if(!lying && dna && !dna.check_mutation(HULK)) //But only if they're not lying down, and hulks can't do it
|
||||
@@ -60,12 +60,10 @@
|
||||
else
|
||||
visible_message("<span class='danger'>[src] deflects the projectile!</span>", "<span class='userdanger'>You deflect the projectile!</span>")
|
||||
playsound(src, pick('sound/weapons/bulletflyby.ogg', 'sound/weapons/bulletflyby2.ogg', 'sound/weapons/bulletflyby3.ogg'), 75, 1)
|
||||
if(!mind.martial_art.reroute_deflection)
|
||||
return FALSE
|
||||
else
|
||||
if(mind.martial_art.reroute_deflection)
|
||||
P.firer = src
|
||||
P.setAngle(rand(0, 360))//SHING
|
||||
return FALSE
|
||||
return BULLET_ACT_FORCE_PIERCE
|
||||
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -1998,7 +1998,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names)
|
||||
|
||||
/datum/species/proc/bullet_act(obj/item/projectile/P, mob/living/carbon/human/H)
|
||||
// called before a projectile hit
|
||||
return 0
|
||||
return
|
||||
|
||||
/////////////
|
||||
//BREATHING//
|
||||
|
||||
@@ -360,8 +360,8 @@
|
||||
playsound(H, 'sound/effects/shovel_dig.ogg', 70, 1)
|
||||
H.visible_message("<span class='danger'>The [P.name] sinks harmlessly in [H]'s sandy body!</span>", \
|
||||
"<span class='userdanger'>The [P.name] sinks harmlessly in [H]'s sandy body!</span>")
|
||||
return 2
|
||||
return 0
|
||||
return BULLET_ACT_BLOCK
|
||||
return ..()
|
||||
|
||||
//Reflects lasers and resistant to burn damage, but very vulnerable to brute damage. Shatters on death.
|
||||
/datum/species/golem/glass
|
||||
@@ -397,8 +397,8 @@
|
||||
var/turf/target = get_turf(P.starting)
|
||||
// redirect the projectile
|
||||
P.preparePixelProjectile(locate(CLAMP(target.x + new_x, 1, world.maxx), CLAMP(target.y + new_y, 1, world.maxy), H.z), H)
|
||||
return -1
|
||||
return 0
|
||||
return BULLET_ACT_FORCE_PIERCE
|
||||
return ..()
|
||||
|
||||
//Teleports when hit or when it wants to
|
||||
/datum/species/golem/bluespace
|
||||
|
||||
@@ -60,8 +60,8 @@
|
||||
if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD)
|
||||
H.visible_message("<span class='danger'>[H] dances in the shadows, evading [P]!</span>")
|
||||
playsound(T, "bullet_miss", 75, 1)
|
||||
return -1
|
||||
return 0
|
||||
return BULLET_ACT_FORCE_PIERCE
|
||||
return ..()
|
||||
|
||||
/datum/species/shadow/nightmare/check_roundstart_eligible()
|
||||
return FALSE
|
||||
|
||||
@@ -403,7 +403,7 @@
|
||||
if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))
|
||||
if(!Proj.nodamage && Proj.damage < src.health && isliving(Proj.firer))
|
||||
retaliate(Proj.firer)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/monkey/hitby(atom/movable/AM, skipcatch = FALSE, hitpush = TRUE, blocked = FALSE)
|
||||
if(istype(AM, /obj/item))
|
||||
|
||||
@@ -110,7 +110,7 @@
|
||||
|
||||
/mob/living/proc/apply_effects(stun = 0, knockdown = 0, unconscious = 0, irradiate = 0, slur = 0, stutter = 0, eyeblur = 0, drowsy = 0, blocked = FALSE, stamina = 0, jitter = 0, kd_stamoverride, kd_stammax)
|
||||
if(blocked >= 100)
|
||||
return 0
|
||||
return BULLET_ACT_BLOCK
|
||||
if(stun)
|
||||
apply_effect(stun, EFFECT_STUN, blocked)
|
||||
if(knockdown)
|
||||
@@ -131,7 +131,7 @@
|
||||
apply_damage(stamina, STAMINA, null, blocked)
|
||||
if(jitter)
|
||||
apply_effect(jitter, EFFECT_JITTER, blocked)
|
||||
return 1
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
|
||||
/mob/living/proc/getBruteLoss()
|
||||
|
||||
@@ -34,7 +34,7 @@
|
||||
return FALSE
|
||||
|
||||
/mob/living/proc/on_hit(obj/item/projectile/P)
|
||||
return
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
/mob/living/proc/check_shields(atom/AM, damage, attack_text = "the attack", attack_type = MELEE_ATTACK, armour_penetration = 0)
|
||||
var/block_chance_modifier = round(damage / -3)
|
||||
@@ -76,16 +76,16 @@
|
||||
/mob/living/bullet_act(obj/item/projectile/P, def_zone)
|
||||
if(P.original != src || P.firer != src) //try to block or reflect the bullet, can't do so when shooting oneself
|
||||
if(reflect_bullet_check(P, def_zone))
|
||||
return -1 // complete projectile permutation
|
||||
return BULLET_ACT_FORCE_PIERCE // complete projectile permutation
|
||||
if(check_shields(P, P.damage, "the [P.name]", PROJECTILE_ATTACK, P.armour_penetration))
|
||||
P.on_hit(src, 100, def_zone)
|
||||
return 2
|
||||
return BULLET_ACT_BLOCK
|
||||
var/armor = run_armor_check(def_zone, P.flag, null, null, P.armour_penetration, null)
|
||||
if(!P.nodamage)
|
||||
apply_damage(P.damage, P.damage_type, def_zone, armor)
|
||||
if(P.dismemberment)
|
||||
check_projectile_dismemberment(P, def_zone)
|
||||
return P.on_hit(src, armor)
|
||||
return P.on_hit(src, armor) ? BULLET_ACT_HIT : BULLET_ACT_BLOCK
|
||||
|
||||
/mob/living/proc/check_projectile_dismemberment(obj/item/projectile/P, def_zone)
|
||||
return 0
|
||||
|
||||
@@ -2,6 +2,21 @@
|
||||
. = ..()
|
||||
update_turf_movespeed(loc)
|
||||
|
||||
/mob/living/CanPass(atom/movable/mover, turf/target)
|
||||
if((mover.pass_flags & PASSMOB))
|
||||
return TRUE
|
||||
if(istype(mover, /obj/item/projectile))
|
||||
var/obj/item/projectile/P = mover
|
||||
return !P.can_hit_target(src, P.permutated, src == P.original, TRUE)
|
||||
if(mover.throwing)
|
||||
return (!density || lying)
|
||||
if(buckled == mover)
|
||||
return TRUE
|
||||
if(ismob(mover))
|
||||
if (mover in buckled_mobs)
|
||||
return TRUE
|
||||
return (!mover.density || !density || lying || (mover.throwing && mover.throwing.thrower == src && !ismob(mover)))
|
||||
|
||||
/mob/living/toggle_move_intent()
|
||||
. = ..()
|
||||
update_move_intent_slowdown()
|
||||
|
||||
@@ -42,9 +42,8 @@
|
||||
|
||||
|
||||
/mob/living/silicon/ai/bullet_act(obj/item/projectile/Proj)
|
||||
..(Proj)
|
||||
. = ..()
|
||||
updatehealth()
|
||||
return 2
|
||||
|
||||
/mob/living/silicon/ai/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0)
|
||||
return // no eyes, no flashing
|
||||
|
||||
@@ -55,7 +55,7 @@
|
||||
if(P.stun)
|
||||
fold_in(force = TRUE)
|
||||
visible_message("<span class='warning'>The electrically-charged projectile disrupts [src]'s holomatrix, forcing [src] to fold in!</span>")
|
||||
. = ..()
|
||||
return ..()
|
||||
|
||||
/mob/living/silicon/pai/stripPanelUnequip(obj/item/what, mob/who, where) //prevents stripping
|
||||
to_chat(src, "<span class='warning'>Your holochassis stutters and warps intensely as you attempt to interact with the object, forcing you to cease lest the field fail.</span>")
|
||||
|
||||
@@ -184,8 +184,7 @@
|
||||
adjustBruteLoss(30)
|
||||
|
||||
/mob/living/silicon/robot/bullet_act(obj/item/projectile/P, def_zone)
|
||||
..()
|
||||
. = ..()
|
||||
updatehealth()
|
||||
if(prob(75) && P.damage > 0)
|
||||
spark_system.start()
|
||||
return 2
|
||||
|
||||
@@ -129,7 +129,7 @@
|
||||
unbuckle_mob(M)
|
||||
M.visible_message("<span class='boldwarning'>[M] is knocked off of [src] by the [P]!</span>")
|
||||
P.on_hit(src)
|
||||
return 2
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
/mob/living/silicon/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash/static)
|
||||
if(affect_silicon)
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
return
|
||||
apply_damage(Proj.damage, Proj.damage_type)
|
||||
Proj.on_hit(src)
|
||||
return 0
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
/mob/living/simple_animal/ex_act(severity, target, origin)
|
||||
if(origin && istype(origin, /datum/spacevine_mutation) && isvineimmune(src))
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
/mob/living/simple_animal/bot/secbot/grievous/bullet_act(obj/item/projectile/P)
|
||||
visible_message("[src] deflects [P] with its energy swords!")
|
||||
playsound(src, 'sound/weapons/blade1.ogg', 50, TRUE)
|
||||
return FALSE
|
||||
return BULLET_ACT_BLOCK
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/grievous/Crossed(atom/movable/AM)
|
||||
..()
|
||||
|
||||
@@ -210,7 +210,7 @@ Auto Patrol[]"},
|
||||
if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))
|
||||
if(!Proj.nodamage && Proj.damage < src.health && ishuman(Proj.firer))
|
||||
retaliate(Proj.firer)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/handle_automated_action()
|
||||
if(!..())
|
||||
@@ -510,11 +510,9 @@ Auto Patrol[]"},
|
||||
spawn(100)
|
||||
disabled = 0
|
||||
icon_state = "[lasercolor]ed2091"
|
||||
return 1
|
||||
else
|
||||
..(Proj)
|
||||
else
|
||||
..(Proj)
|
||||
return BULLET_ACT_HIT
|
||||
return ..()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/bluetag
|
||||
lasercolor = "b"
|
||||
|
||||
@@ -139,7 +139,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"},
|
||||
/mob/living/simple_animal/bot/honkbot/bullet_act(obj/item/projectile/Proj)
|
||||
if((istype(Proj,/obj/item/projectile/beam)) || (istype(Proj,/obj/item/projectile/bullet) && (Proj.damage_type == BURN))||(Proj.damage_type == BRUTE) && (!Proj.nodamage && Proj.damage < health && ishuman(Proj.firer)))
|
||||
retaliate(Proj.firer)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/bot/honkbot/UnarmedAttack(atom/A)
|
||||
if(!on)
|
||||
|
||||
@@ -152,7 +152,7 @@
|
||||
|
||||
/mob/living/simple_animal/bot/mulebot/bullet_act(obj/item/projectile/Proj)
|
||||
. = ..()
|
||||
if(. && !QDELETED(src)) //Got hit and not blown up yet.
|
||||
if(. == BULLET_ACT_HIT && !QDELETED(src)) //Got hit and not blown up yet.)
|
||||
if(prob(50) && !isnull(load))
|
||||
unload(0)
|
||||
if(prob(25))
|
||||
|
||||
@@ -205,7 +205,7 @@ Auto Patrol: []"},
|
||||
if((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE))
|
||||
if(!Proj.nodamage && Proj.damage < src.health && ishuman(Proj.firer))
|
||||
retaliate(Proj.firer)
|
||||
..()
|
||||
return ..()
|
||||
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/UnarmedAttack(atom/A)
|
||||
|
||||
@@ -167,9 +167,9 @@
|
||||
new_angle_s -= 360
|
||||
P.setAngle(new_angle_s)
|
||||
|
||||
return -1 // complete projectile permutation
|
||||
return BULLET_ACT_FORCE_PIERCE // complete projectile permutation
|
||||
|
||||
return (..(P))
|
||||
return ..()
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -117,7 +117,7 @@ Difficulty: Very Hard
|
||||
|
||||
var/random_y = rand(0, 72)
|
||||
AT.pixel_y += random_y
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/megafauna/colossus/proc/enrage(mob/living/L)
|
||||
if(ishuman(L))
|
||||
@@ -395,7 +395,7 @@ Difficulty: Very Hard
|
||||
..()
|
||||
|
||||
/obj/machinery/anomalous_crystal/bullet_act(obj/item/projectile/P, def_zone)
|
||||
..()
|
||||
. = ..()
|
||||
if(istype(P, /obj/item/projectile/magic))
|
||||
ActivationReaction(P.firer, ACTIVATE_MAGIC, P.damage_type)
|
||||
return
|
||||
|
||||
@@ -98,7 +98,7 @@ IGNORE_PROC_IF_NOT_TARGET(attack_slime)
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/curseblob/bullet_act(obj/item/projectile/Proj)
|
||||
if(Proj.firer != set_target)
|
||||
return
|
||||
return BULLET_ACT_FORCE_PIERCE
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/curseblob/attacked_by(obj/item/I, mob/living/L)
|
||||
|
||||
@@ -75,7 +75,7 @@
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/bullet_act(obj/item/projectile/P)
|
||||
visible_message("<span class='danger'>The [P.name] was repelled by [name]'s girth!</span>")
|
||||
return
|
||||
return BULLET_ACT_BLOCK
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
|
||||
vision_range = 9
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
if(P.damage < 30 && P.damage_type != BRUTE)
|
||||
P.damage = (P.damage / 3)
|
||||
visible_message("<span class='danger'>[P] has a reduced effect on [src]!</span>")
|
||||
..()
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/asteroid/hitby(atom/movable/AM)//No floor tiling them to death, wiseguy
|
||||
if(istype(AM, /obj/item))
|
||||
|
||||
@@ -179,9 +179,10 @@
|
||||
if(T.throwforce)
|
||||
Bruise()
|
||||
|
||||
/mob/living/simple_animal/hostile/mushroom/bullet_act()
|
||||
..()
|
||||
Bruise()
|
||||
/mob/living/simple_animal/hostile/mushroom/bullet_act(obj/item/projectile/P)
|
||||
. = ..()
|
||||
if(!P.nodamage)
|
||||
Bruise()
|
||||
|
||||
/mob/living/simple_animal/hostile/mushroom/harvest()
|
||||
var/counter
|
||||
|
||||
@@ -128,13 +128,10 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/bullet_act(obj/item/projectile/Proj)
|
||||
if(!Proj)
|
||||
return
|
||||
if(prob(25))
|
||||
return ..()
|
||||
else
|
||||
visible_message("<span class='danger'>[src] blocks [Proj] with its shield!</span>")
|
||||
return 0
|
||||
visible_message("<span class='danger'>[src] blocks [Proj] with its shield!</span>")
|
||||
return BULLET_ACT_BLOCK
|
||||
|
||||
/mob/living/simple_animal/hostile/syndicate/melee/sword/space
|
||||
icon_state = "syndicate_space_sword"
|
||||
|
||||
@@ -337,7 +337,7 @@
|
||||
|
||||
//Bullets
|
||||
/mob/living/simple_animal/parrot/bullet_act(obj/item/projectile/Proj)
|
||||
..()
|
||||
. = ..()
|
||||
if(!stat && !client)
|
||||
if(parrot_state == PARROT_PERCH)
|
||||
parrot_sleep_dur = parrot_sleep_max //Reset it's sleep timer if it was perched
|
||||
@@ -347,7 +347,6 @@
|
||||
//parrot_been_shot += 5
|
||||
icon_state = icon_living
|
||||
drop_held_item(0)
|
||||
return
|
||||
|
||||
|
||||
/*
|
||||
|
||||
@@ -220,15 +220,12 @@
|
||||
return ..() //Heals them
|
||||
|
||||
/mob/living/simple_animal/slime/bullet_act(obj/item/projectile/Proj)
|
||||
if(!Proj)
|
||||
return
|
||||
attacked += 10
|
||||
if((Proj.damage_type == BURN))
|
||||
adjustBruteLoss(-abs(Proj.damage)) //fire projectiles heals slimes.
|
||||
Proj.on_hit(src)
|
||||
else
|
||||
..(Proj)
|
||||
return 0
|
||||
return BULLET_ACT_BLOCK
|
||||
return ..()
|
||||
|
||||
/mob/living/simple_animal/slime/emp_act(severity)
|
||||
. = ..()
|
||||
|
||||
@@ -508,6 +508,10 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0)
|
||||
usr << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", name, replacetext(flavor_text, "\n", "<BR>")), text("window=[];size=500x200", name))
|
||||
onclose(usr, "[name]")
|
||||
|
||||
if(href_list["flavor2_more"])
|
||||
usr << browse(text("<HTML><HEAD><TITLE>[]</TITLE></HEAD><BODY><TT>[]</TT></BODY></HTML>", name, replacetext(flavor_text_2, "\n", "<BR>")), text("window=[];size=500x200", name))
|
||||
onclose(usr, "[name]")
|
||||
|
||||
if(href_list["flavor_change"])
|
||||
update_flavor_text()
|
||||
|
||||
|
||||
@@ -1,15 +1,3 @@
|
||||
/mob/CanPass(atom/movable/mover, turf/target)
|
||||
if((mover.pass_flags & PASSMOB))
|
||||
return TRUE
|
||||
if(istype(mover, /obj/item/projectile) || mover.throwing)
|
||||
return (!density || lying)
|
||||
if(buckled == mover)
|
||||
return TRUE
|
||||
if(ismob(mover))
|
||||
if (mover in buckled_mobs)
|
||||
return TRUE
|
||||
return (!mover.density || !density || lying || (mover.throwing && mover.throwing.thrower == src && !ismob(mover)))
|
||||
|
||||
//DO NOT USE THIS UNLESS YOU ABSOLUTELY HAVE TO. THIS IS BEING PHASED OUT FOR THE MOVESPEED MODIFICATION SYSTEM.
|
||||
//See mob_movespeed.dm
|
||||
/mob/proc/movement_delay() //update /living/movement_delay() if you change this
|
||||
|
||||
@@ -51,7 +51,7 @@
|
||||
if(length(msg) <= 40)
|
||||
return "<span class='notice'>[html_encode(msg)]</span>"
|
||||
else
|
||||
return "<span class='notice'>[html_encode(copytext(msg, 1, 37))]... <a href='?src=[REF(src)];flavor_more=1'>More...</span></a>"
|
||||
return "<span class='notice'>[html_encode(copytext(msg, 1, 37))]... <a href='?src=[REF(src)];flavor2_more=1'>More...</span></a>"
|
||||
|
||||
|
||||
/mob/proc/get_top_level_mob()
|
||||
|
||||
@@ -158,4 +158,5 @@
|
||||
// "Brute" damage mostly damages the casing.
|
||||
/obj/machinery/modular_computer/bullet_act(obj/item/projectile/Proj)
|
||||
if(cpu)
|
||||
cpu.bullet_act(Proj)
|
||||
return cpu.bullet_act(Proj)
|
||||
return ..()
|
||||
|
||||
@@ -79,13 +79,17 @@ By design, d1 is the smallest direction and d2 is the highest
|
||||
color = "#ffffff"
|
||||
|
||||
// the power cable object
|
||||
/obj/structure/cable/Initialize(mapload, param_color)
|
||||
/obj/structure/cable/Initialize(mapload, param_color, _d1, _d2)
|
||||
. = ..()
|
||||
|
||||
// ensure d1 & d2 reflect the icon_state for entering and exiting cable
|
||||
var/dash = findtext(icon_state, "-")
|
||||
d1 = text2num( copytext( icon_state, 1, dash ) )
|
||||
d2 = text2num( copytext( icon_state, dash+1 ) )
|
||||
if(isnull(_d1) || isnull(_d2))
|
||||
// ensure d1 & d2 reflect the icon_state for entering and exiting cable
|
||||
var/dash = findtext(icon_state, "-")
|
||||
d1 = text2num( copytext( icon_state, 1, dash ) )
|
||||
d2 = text2num( copytext( icon_state, dash+1 ) )
|
||||
else
|
||||
d1 = _d1
|
||||
d2 = _d2
|
||||
|
||||
var/turf/T = get_turf(src) // hide if turf is not intact
|
||||
if(level==1)
|
||||
|
||||
@@ -74,7 +74,7 @@
|
||||
addtimer(CALLBACK(GLOBAL_PROC, .proc/explosion, get_turf(src), 2, 3, 4, 8), 100) // Not a normal explosion.
|
||||
|
||||
/obj/machinery/power/rtg/abductor/bullet_act(obj/item/projectile/Proj)
|
||||
..()
|
||||
. = ..()
|
||||
if(!going_kaboom && istype(Proj) && !Proj.nodamage && ((Proj.damage_type == BURN) || (Proj.damage_type == BRUTE)))
|
||||
message_admins("[ADMIN_LOOKUPFLW(Proj.firer)] triggered an Abductor Core explosion at [AREACOORD(src)] via projectile.")
|
||||
log_game("[key_name(Proj.firer)] triggered an Abductor Core explosion at [AREACOORD(src)] via projectile.")
|
||||
|
||||
@@ -113,7 +113,8 @@
|
||||
|
||||
|
||||
/obj/singularity/bullet_act(obj/item/projectile/P)
|
||||
return 0 //Will there be an impact? Who knows. Will we see it? No.
|
||||
qdel(P)
|
||||
return BULLET_ACT_HIT //Will there be an impact? Who knows. Will we see it? No.
|
||||
|
||||
|
||||
/obj/singularity/Bump(atom/A)
|
||||
|
||||
@@ -521,7 +521,7 @@ GLOBAL_DATUM(main_supermatter_engine, /obj/machinery/power/supermatter_crystal)
|
||||
has_been_powered = TRUE
|
||||
else if(takes_damage)
|
||||
damage += Proj.damage * config_bullet_energy
|
||||
return FALSE
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
/obj/machinery/power/supermatter_crystal/singularity_act()
|
||||
var/gain = 100
|
||||
|
||||
@@ -569,4 +569,4 @@
|
||||
|
||||
/obj/item/projectile/beam/beam_rifle/hitscan/aiming_beam/on_hit()
|
||||
qdel(src)
|
||||
return FALSE
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
@@ -114,7 +114,7 @@
|
||||
icon_state = "blastwave"
|
||||
damage = 0
|
||||
nodamage = FALSE
|
||||
forcedodge = TRUE
|
||||
movement_type = FLYING | UNSTOPPABLE
|
||||
var/heavyr = 0
|
||||
var/mediumr = 0
|
||||
var/lightr = 0
|
||||
|
||||
@@ -11,15 +11,16 @@
|
||||
item_flags = ABSTRACT
|
||||
pass_flags = PASSTABLE
|
||||
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
|
||||
movement_type = FLYING
|
||||
hitsound = 'sound/weapons/pierce.ogg'
|
||||
var/hitsound_wall = ""
|
||||
|
||||
resistance_flags = LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF
|
||||
var/def_zone = "" //Aiming at
|
||||
var/atom/movable/firer = null//Who shot it
|
||||
var/atom/fired_from = null // the atom that the projectile was fired from (gun, turret)
|
||||
var/atom/fired_from = null // the atom that the projectile was fired from (gun, turret) var/suppressed = FALSE //Attack message
|
||||
var/suppressed = FALSE //Attack message
|
||||
var/candink = FALSE //Can this projectile play the dink sound when hitting the head?
|
||||
var/candink = FALSE //Can this projectile play the dink sound when hitting the head? var/yo = null
|
||||
var/yo = null
|
||||
var/xo = null
|
||||
var/atom/original = null // the original target clicked
|
||||
@@ -84,7 +85,8 @@
|
||||
var/flag = "bullet" //Defines what armor to use when it hits things. Must be set to bullet, laser, energy,or bomb
|
||||
var/projectile_type = /obj/item/projectile
|
||||
var/range = 50 //This will de-increment every step. When 0, it will deletze the projectile.
|
||||
var/decayedRange
|
||||
var/decayedRange //stores original range
|
||||
var/reflect_range_decrease = 5 //amount of original range that falls off when reflecting, so it doesn't go forever
|
||||
var/is_reflectable = FALSE // Can it be reflected or not?
|
||||
//Effects
|
||||
var/stun = 0
|
||||
@@ -99,11 +101,12 @@
|
||||
var/drowsy = 0
|
||||
var/stamina = 0
|
||||
var/jitter = 0
|
||||
var/forcedodge = 0 //to pass through everything
|
||||
var/dismemberment = 0 //The higher the number, the greater the bonus to dismembering. 0 will not dismember at all.
|
||||
var/impact_effect_type //what type of impact effect to show when hitting something
|
||||
var/log_override = FALSE //is this type spammed enough to not log? (KAs)
|
||||
|
||||
var/temporary_unstoppable_movement = FALSE
|
||||
|
||||
/obj/item/projectile/Initialize()
|
||||
. = ..()
|
||||
permutated = list()
|
||||
@@ -152,12 +155,12 @@
|
||||
|
||||
W.add_dent(WALL_DENT_SHOT, hitx, hity)
|
||||
|
||||
return 0
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
if(!isliving(target))
|
||||
if(impact_effect_type && !hitscan)
|
||||
new impact_effect_type(target_loca, hitx, hity)
|
||||
return 0
|
||||
return BULLET_ACT_HIT
|
||||
|
||||
var/mob/living/L = target
|
||||
|
||||
@@ -185,7 +188,6 @@
|
||||
C.bleed(damage)
|
||||
else
|
||||
L.add_splatter_floor(target_loca)
|
||||
|
||||
else if(impact_effect_type && !hitscan)
|
||||
new impact_effect_type(target_loca, hitx, hity)
|
||||
|
||||
@@ -235,24 +237,20 @@
|
||||
beam_segments[beam_index] = null
|
||||
|
||||
/obj/item/projectile/Bump(atom/A)
|
||||
var/turf/T = get_turf(A)
|
||||
if(trajectory && check_ricochet(A) && check_ricochet_flag(A) && ricochets < ricochets_max)
|
||||
var/datum/point/pcache = trajectory.copy_to()
|
||||
ricochets++
|
||||
if(A.handle_ricochet(src))
|
||||
on_ricochet(A)
|
||||
ignore_source_check = TRUE
|
||||
range = initial(range)
|
||||
decayedRange = max(0, decayedRange - reflect_range_decrease)
|
||||
range = decayedRange
|
||||
if(hitscan)
|
||||
store_hitscan_collision(pcache)
|
||||
return TRUE
|
||||
if(firer && !ignore_source_check)
|
||||
if(A == firer || (A == firer.loc && ismecha(A))) //cannot shoot yourself or your mech
|
||||
trajectory_ignore_forcemove = TRUE
|
||||
forceMove(get_turf(A))
|
||||
trajectory_ignore_forcemove = FALSE
|
||||
return FALSE
|
||||
|
||||
var/distance = get_dist(get_turf(A), starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations.
|
||||
var/distance = get_dist(T, starting) // Get the distance between the turf shot from and the mob we hit and use that for the calculations.
|
||||
def_zone = ran_zone(def_zone, max(100-(7*distance), 5)) //Lower accurancy/longer range tradeoff. 7 is a balanced number to use.
|
||||
|
||||
if(isturf(A) && hitsound_wall)
|
||||
@@ -261,51 +259,66 @@
|
||||
volume = 5
|
||||
playsound(loc, hitsound_wall, volume, 1, -1)
|
||||
|
||||
var/turf/target_turf = get_turf(A)
|
||||
return process_hit(T, select_target(T, A))
|
||||
|
||||
if(!prehit(A))
|
||||
if(forcedodge)
|
||||
trajectory_ignore_forcemove = TRUE
|
||||
forceMove(target_turf)
|
||||
trajectory_ignore_forcemove = FALSE
|
||||
return FALSE
|
||||
#define QDEL_SELF 1 //Delete if we're not UNSTOPPABLE flagged non-temporarily
|
||||
#define DO_NOT_QDEL 2 //Pass through.
|
||||
#define FORCE_QDEL 3 //Force deletion.
|
||||
|
||||
var/permutation = A.bullet_act(src, def_zone) // searches for return value, could be deleted after run so check A isn't null
|
||||
if(permutation == -1 || forcedodge)// the bullet passes through a dense object!
|
||||
trajectory_ignore_forcemove = TRUE
|
||||
forceMove(target_turf)
|
||||
trajectory_ignore_forcemove = FALSE
|
||||
if(A)
|
||||
permutated.Add(A)
|
||||
return FALSE
|
||||
else
|
||||
var/atom/alt = select_target(A)
|
||||
if(alt)
|
||||
if(!prehit(alt))
|
||||
return FALSE
|
||||
alt.bullet_act(src, def_zone)
|
||||
qdel(src)
|
||||
return TRUE
|
||||
/obj/item/projectile/proc/process_hit(turf/T, atom/target, qdel_self, hit_something = FALSE) //probably needs to be reworked entirely when pixel movement is done.
|
||||
if(QDELETED(src) || !T || !target) //We're done, nothing's left.
|
||||
if((qdel_self == FORCE_QDEL) || ((qdel_self == QDEL_SELF) && !temporary_unstoppable_movement && !CHECK_BITFIELD(movement_type, UNSTOPPABLE)))
|
||||
qdel(src)
|
||||
return hit_something
|
||||
permutated |= target //Make sure we're never hitting it again. If we ever run into weirdness with piercing projectiles needing to hit something multiple times.. well.. that's a to-do.
|
||||
if(!prehit(target))
|
||||
return process_hit(T, select_target(T), qdel_self, hit_something) //Hit whatever else we can since that didn't work.
|
||||
var/result = target.bullet_act(src, def_zone)
|
||||
if(result == BULLET_ACT_FORCE_PIERCE)
|
||||
if(!CHECK_BITFIELD(movement_type, UNSTOPPABLE))
|
||||
temporary_unstoppable_movement = TRUE
|
||||
ENABLE_BITFIELD(movement_type, UNSTOPPABLE)
|
||||
return process_hit(T, select_target(T), qdel_self, TRUE) //Hit whatever else we can since we're piercing through but we're still on the same tile.
|
||||
else if(result == BULLET_ACT_TURF) //We hit the turf but instead we're going to also hit something else on it.
|
||||
return process_hit(T, select_target(T), QDEL_SELF, TRUE)
|
||||
else //Whether it hit or blocked, we're done!
|
||||
qdel_self = QDEL_SELF
|
||||
hit_something = TRUE
|
||||
if((qdel_self == FORCE_QDEL) || ((qdel_self == QDEL_SELF) && !temporary_unstoppable_movement && !CHECK_BITFIELD(movement_type, UNSTOPPABLE)))
|
||||
qdel(src)
|
||||
return hit_something
|
||||
|
||||
/obj/item/projectile/proc/select_target(atom/A) //Selects another target from a wall if we hit a wall.
|
||||
if(!A || !A.density || (A.flags_1 & ON_BORDER_1) || ismob(A) || A == original) //if we hit a dense non-border obj or dense turf then we also hit one of the mobs or machines/structures on that tile.
|
||||
return
|
||||
var/turf/T = get_turf(A)
|
||||
if(original in T)
|
||||
#undef QDEL_SELF
|
||||
#undef DO_NOT_QDEL
|
||||
#undef FORCE_QDEL
|
||||
|
||||
/obj/item/projectile/proc/select_target(turf/T, atom/target) //Select a target from a turf.
|
||||
if((original in T) && can_hit_target(original, permutated, TRUE, TRUE))
|
||||
return original
|
||||
var/list/mob/possible_mobs = typecache_filter_list(T, GLOB.typecache_mob) - A
|
||||
if(target && can_hit_target(target, permutated, target == original, TRUE))
|
||||
return target
|
||||
var/list/mob/living/possible_mobs = typecache_filter_list(T, GLOB.typecache_mob)
|
||||
var/list/mob/mobs = list()
|
||||
for(var/i in possible_mobs)
|
||||
var/mob/M = i
|
||||
if(M.lying)
|
||||
for(var/mob/living/M in possible_mobs)
|
||||
if(!can_hit_target(M, permutated, M == original, TRUE))
|
||||
continue
|
||||
mobs += M
|
||||
var/mob/M = safepick(mobs)
|
||||
if(M)
|
||||
return M.lowest_buckled_mob()
|
||||
var/obj/O = safepick(typecache_filter_list(T, GLOB.typecache_machine_or_structure) - A)
|
||||
var/list/obj/possible_objs = typecache_filter_list(T, GLOB.typecache_machine_or_structure)
|
||||
var/list/obj/objs = list()
|
||||
for(var/obj/O in possible_objs)
|
||||
if(!can_hit_target(O, permutated, O == original, TRUE))
|
||||
continue
|
||||
objs += O
|
||||
var/obj/O = safepick(objs)
|
||||
if(O)
|
||||
return O
|
||||
//Nothing else is here that we can hit, hit the turf if we haven't.
|
||||
if(!(T in permutated) && can_hit_target(T, permutated, T == original, TRUE))
|
||||
return T
|
||||
//Returns null if nothing at all was found.
|
||||
|
||||
/obj/item/projectile/proc/check_ricochet()
|
||||
if(prob(ricochet_chance))
|
||||
@@ -332,7 +345,7 @@
|
||||
var/turf/ending = return_predicted_turf_after_moves(moves, forced_angle)
|
||||
return getline(current, ending)
|
||||
|
||||
/obj/item/projectile/Process_Spacemove(var/movement_dir = 0)
|
||||
/obj/item/projectile/Process_Spacemove(movement_dir = 0)
|
||||
return TRUE //Bullets don't drift in space
|
||||
|
||||
/obj/item/projectile/process()
|
||||
@@ -360,8 +373,7 @@
|
||||
|
||||
/obj/item/projectile/proc/fire(angle, atom/direct_target)
|
||||
if(fired_from)
|
||||
SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_BEFORE_FIRE, src, original)
|
||||
//If no angle needs to resolve it from xo/yo!
|
||||
SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_BEFORE_FIRE, src, original) //If no angle needs to resolve it from xo/yo!
|
||||
if(!log_override && firer && original)
|
||||
log_combat(firer, original, "fired at", src, "from [get_area_name(src, TRUE)]")
|
||||
if(direct_target)
|
||||
@@ -498,8 +510,6 @@
|
||||
else if(T != loc)
|
||||
step_towards(src, T)
|
||||
hitscan_last = loc
|
||||
if(can_hit_target(original, permutated))
|
||||
Bump(original)
|
||||
if(!hitscanning && !forcemoved)
|
||||
pixel_x = trajectory.return_px() - trajectory.mpx * trajectory_multiplier * SSprojectiles.global_iterations_per_move
|
||||
pixel_y = trajectory.return_py() - trajectory.mpy * trajectory_multiplier * SSprojectiles.global_iterations_per_move
|
||||
@@ -528,8 +538,28 @@
|
||||
homing_offset_y = -homing_offset_y
|
||||
|
||||
//Returns true if the target atom is on our current turf and above the right layer
|
||||
/obj/item/projectile/proc/can_hit_target(atom/target, var/list/passthrough)
|
||||
return (target && ((target.layer >= PROJECTILE_HIT_THRESHHOLD_LAYER) || ismob(target)) && (loc == get_turf(target)) && (!(target in passthrough)))
|
||||
//If direct target is true it's the originally clicked target.
|
||||
/obj/item/projectile/proc/can_hit_target(atom/target, list/passthrough, direct_target = FALSE, ignore_loc = FALSE)
|
||||
if(QDELETED(target))
|
||||
return FALSE
|
||||
if(!ignore_source_check && firer)
|
||||
var/mob/M = firer
|
||||
if((target == firer) || ((target == firer.loc) && ismecha(firer.loc)) || (target in firer.buckled_mobs) || (istype(M) && (M.buckled == target)))
|
||||
return FALSE
|
||||
if(!ignore_loc && (loc != target.loc))
|
||||
return FALSE
|
||||
if(target in passthrough)
|
||||
return FALSE
|
||||
if(target.density) //This thing blocks projectiles, hit it regardless of layer/mob stuns/etc.
|
||||
return TRUE
|
||||
if(!isliving(target))
|
||||
if(target.layer < PROJECTILE_HIT_THRESHHOLD_LAYER)
|
||||
return FALSE
|
||||
else
|
||||
var/mob/living/L = target
|
||||
if(!direct_target && !L.density)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
//Spread is FORCED!
|
||||
/obj/item/projectile/proc/preparePixelProjectile(atom/target, atom/source, params, spread = 0)
|
||||
@@ -591,9 +621,20 @@
|
||||
return list(angle, p_x, p_y)
|
||||
|
||||
/obj/item/projectile/Crossed(atom/movable/AM) //A mob moving on a tile with a projectile is hit by it.
|
||||
..()
|
||||
if(isliving(AM) && (AM.density || AM == original) && !(src.pass_flags & PASSMOB))
|
||||
Bump(AM)
|
||||
. = ..()
|
||||
if(isliving(AM) && !(pass_flags & PASSMOB))
|
||||
var/mob/living/L = AM
|
||||
if(can_hit_target(L, permutated, (AM == original)))
|
||||
Bump(AM)
|
||||
|
||||
/obj/item/projectile/Move(atom/newloc, dir = NONE)
|
||||
. = ..()
|
||||
if(.)
|
||||
if(temporary_unstoppable_movement)
|
||||
temporary_unstoppable_movement = FALSE
|
||||
DISABLE_BITFIELD(movement_type, UNSTOPPABLE)
|
||||
if(fired && can_hit_target(original, permutated, TRUE))
|
||||
Bump(original)
|
||||
|
||||
/obj/item/projectile/Destroy()
|
||||
if(hitscan)
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user