Merge branch 'master' into assu

This commit is contained in:
Anonymous
2019-11-05 15:45:04 +03:00
77 changed files with 1533 additions and 827 deletions
+1 -1
View File
@@ -1,4 +1,4 @@
FROM tgstation/byond:512.1488 as base
FROM tgstation/byond:513.1490 as base
FROM base as build_base
@@ -68,7 +68,10 @@
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
"k" = (
/obj/machinery/computer/arcade/battle,
/obj/machinery/computer/arcade/battle{
icon_state = "arcade";
dir = 4
},
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
"l" = (
@@ -105,6 +108,13 @@
/obj/machinery/computer/shuttle,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
"s" = (
/obj/machinery/computer/arcade/orion_trail{
icon_state = "arcade";
dir = 4
},
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
"t" = (
/obj/structure/extinguisher_cabinet{
pixel_y = 30
@@ -142,10 +152,6 @@
/obj/machinery/reagentgrinder,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
"y" = (
/obj/machinery/computer/arcade/orion_trail,
/turf/open/floor/mineral/titanium/purple,
/area/ruin/powered/golem_ship)
"z" = (
/obj/structure/extinguisher_cabinet{
pixel_y = -30
@@ -332,7 +338,7 @@ l
l
j
l
y
s
b
a
a
@@ -167,6 +167,56 @@
},
/turf/open/floor/plating,
/area/ruin/unpowered/syndicate_lava_base/circuits)
"av" = (
/obj/structure/bed/roller,
/obj/machinery/iv_drip,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/mob/living/carbon/monkey{
faction = list("neutral","Syndicate")
},
/turf/open/floor/plasteel/dark,
/area/ruin/unpowered/syndicate_lava_base/testlab)
"aw" = (
/obj/machinery/light/small,
/obj/structure/bed/roller,
/obj/machinery/iv_drip,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/mob/living/carbon/monkey{
faction = list("neutral","Syndicate")
},
/turf/open/floor/plasteel/dark,
/area/ruin/unpowered/syndicate_lava_base/testlab)
"ax" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/obj/machinery/computer/arcade/orion_trail{
icon_state = "arcade";
dir = 1
},
/turf/open/floor/plasteel/dark,
/area/ruin/unpowered/syndicate_lava_base/bar)
"aF" = (
/obj/machinery/atmospherics/pipe/simple/scrubbers/hidden/layer3{
dir = 4
@@ -790,26 +840,6 @@
/obj/structure/disposalpipe/trunk,
/turf/open/floor/plating/asteroid/basalt/lava_land_surface,
/area/ruin/unpowered/syndicate_lava_base/virology)
"ej" = (
/obj/structure/bed/roller,
/obj/machinery/iv_drip,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/mob/living/carbon/monkey{
faction = list("neutral","Syndicate")
},
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/turf/open/floor/plasteel/dark,
/area/ruin/unpowered/syndicate_lava_base/testlab)
"ek" = (
/obj/structure/grille,
/obj/structure/window/plastitanium,
@@ -1136,27 +1166,6 @@
/obj/structure/disposalpipe/segment,
/turf/closed/wall/mineral/plastitanium/nodiagonal,
/area/ruin/unpowered/syndicate_lava_base/virology)
"eK" = (
/obj/machinery/light/small,
/obj/structure/bed/roller,
/obj/machinery/iv_drip,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/mob/living/carbon/monkey{
faction = list("neutral","Syndicate")
},
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/turf/open/floor/plasteel/dark,
/area/ruin/unpowered/syndicate_lava_base/testlab)
"eL" = (
/obj/machinery/door/airlock/hatch{
name = "Monkey Pen";
@@ -5148,12 +5157,6 @@
/obj/item/clothing/mask/gas,
/turf/open/floor/plating,
/area/ruin/unpowered/syndicate_lava_base/arrivals)
"mt" = (
/obj/machinery/computer/arcade/orion_trail,
/obj/effect/decal/cleanable/dirt,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plasteel/dark,
/area/ruin/unpowered/syndicate_lava_base/bar)
"mu" = (
/obj/item/twohanded/required/kirbyplants{
icon_state = "plant-22"
@@ -7340,8 +7343,8 @@ ae
ae
ae
ae
ej
eK
av
aw
ae
fD
ad
@@ -7362,7 +7365,7 @@ kH
jN
jZ
lU
mt
ax
mU
np
nP
+3 -5
View File
@@ -56,11 +56,9 @@
/obj/structure/chair/sofa{
dir = 4
},
/mob/living/simple_animal/hostile/gorilla{
AIStatus = null;
desc = "There is no need to be upset.";
dir = 4;
name = "Familiar Gorilla"
/mob/living/simple_animal/hostile/gorilla/familiar{
icon_state = "crawling";
dir = 4
},
/turf/open/floor/plating/beach/sand,
/area/ruin/powered)
+9 -6
View File
@@ -16,6 +16,13 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/hive)
"ae" = (
/obj/machinery/computer/arcade{
icon_state = "arcade";
dir = 1
},
/turf/open/floor/plasteel/dark,
/area/awaymission/moonoutpost19/arrivals)
"ag" = (
/obj/structure/alien/weeds,
/obj/structure/alien/weeds{
@@ -6408,10 +6415,6 @@
heat_capacity = 1e+006
},
/area/awaymission/moonoutpost19/arrivals)
"mB" = (
/obj/machinery/computer/arcade,
/turf/open/floor/plasteel/dark,
/area/awaymission/moonoutpost19/arrivals)
"mC" = (
/obj/machinery/vending/cigarette,
/obj/structure/sign/poster/contraband/smoke{
@@ -43385,7 +43388,7 @@ la
lq
jk
mj
mB
ae
hJ
ba
ba
@@ -43642,7 +43645,7 @@ jN
lr
jj
mj
mB
ae
hI
ba
ba
+214 -214
View File
@@ -245,10 +245,38 @@
},
/turf/open/floor/plating,
/area/awaymission/research/interior/engineering)
"aS" = (
/obj/effect/turf_decal/tile/purple{
dir = 1
},
/obj/effect/turf_decal/tile/purple,
/obj/effect/turf_decal/tile/purple{
dir = 4
},
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/mob/living/carbon/monkey,
/turf/open/floor/plasteel,
/area/awaymission/research/interior/genetics)
"aT" = (
/mob/living/simple_animal/hostile/syndicate/melee/sword,
/turf/open/floor/plating,
/area/awaymission/research/interior/engineering)
"aU" = (
/obj/effect/turf_decal/tile/purple{
dir = 1
},
/obj/effect/turf_decal/tile/purple,
/obj/effect/turf_decal/tile/purple{
dir = 4
},
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/mob/living/carbon/human,
/turf/open/floor/plasteel,
/area/awaymission/research/interior/genetics)
"aV" = (
/obj/item/stack/sheet/plasteel,
/obj/effect/turf_decal/tile/yellow{
@@ -326,6 +354,23 @@
icon_state = "damaged4"
},
/area/awaymission/research/interior/engineering)
"bc" = (
/obj/structure/window/reinforced{
dir = 4
},
/obj/effect/turf_decal/tile/purple{
dir = 1
},
/obj/effect/turf_decal/tile/purple,
/obj/effect/turf_decal/tile/purple{
dir = 4
},
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/mob/living/carbon/monkey,
/turf/open/floor/plasteel,
/area/awaymission/research/interior/genetics)
"bd" = (
/turf/open/floor/plasteel{
icon_state = "damaged3"
@@ -903,6 +948,17 @@
/obj/machinery/light/small,
/turf/open/floor/plating,
/area/awaymission/research/interior/maint)
"co" = (
/obj/item/ammo_casing/c45,
/obj/effect/turf_decal/tile/yellow{
dir = 1
},
/obj/effect/turf_decal/tile/yellow{
dir = 8
},
/mob/living/simple_animal/hostile/syndicate,
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior)
"cp" = (
/turf/closed/wall/r_wall,
/area/awaymission/research/interior)
@@ -1195,19 +1251,19 @@
/turf/open/floor/plating,
/area/awaymission/research/interior/genetics)
"cT" = (
/mob/living/carbon/monkey,
/obj/effect/turf_decal/tile/purple{
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/effect/turf_decal/tile/purple,
/obj/effect/turf_decal/tile/purple{
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
dir = 4
},
/obj/effect/turf_decal/tile/purple{
/obj/effect/turf_decal/tile/red{
dir = 8
},
/mob/living/simple_animal/hostile/nanotrasen/ranged,
/turf/open/floor/plasteel,
/area/awaymission/research/interior/genetics)
/area/awaymission/research/interior/security)
"cU" = (
/obj/machinery/door/window/eastright,
/obj/effect/turf_decal/tile/purple{
@@ -1253,7 +1309,9 @@
/turf/open/floor/plasteel,
/area/awaymission/research/interior/genetics)
"cX" = (
/mob/living/carbon/human,
/obj/structure/window/reinforced{
dir = 8
},
/obj/effect/turf_decal/tile/purple{
dir = 1
},
@@ -1264,6 +1322,7 @@
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/mob/living/carbon/human,
/turf/open/floor/plasteel,
/area/awaymission/research/interior/genetics)
"cY" = (
@@ -1356,22 +1415,15 @@
/turf/open/floor/plasteel,
/area/awaymission/research/interior/genetics)
"di" = (
/obj/structure/window/reinforced{
dir = 4
},
/mob/living/carbon/monkey,
/obj/effect/turf_decal/tile/purple{
dir = 1
},
/obj/effect/turf_decal/tile/purple,
/obj/effect/turf_decal/tile/purple{
dir = 4
},
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/turf/open/floor/plasteel,
/area/awaymission/research/interior/genetics)
/mob/living/simple_animal/hostile/nanotrasen/ranged,
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/cryo)
"dj" = (
/obj/effect/decal/cleanable/blood,
/obj/item/stack/rods,
@@ -1416,14 +1468,14 @@
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior)
"dn" = (
/obj/item/ammo_casing/c45,
/mob/living/simple_animal/hostile/syndicate,
/obj/effect/turf_decal/tile/yellow{
dir = 1
},
/obj/effect/turf_decal/tile/yellow,
/obj/effect/turf_decal/tile/yellow{
dir = 8
dir = 4
},
/mob/living/simple_animal/hostile/syndicate,
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior)
"do" = (
@@ -1675,7 +1727,6 @@
/turf/open/floor/plasteel,
/area/awaymission/research/interior/security)
"dI" = (
/mob/living/simple_animal/hostile/nanotrasen/ranged,
/obj/effect/turf_decal/tile/red{
dir = 1
},
@@ -1686,7 +1737,8 @@
/obj/effect/turf_decal/tile/red{
dir = 8
},
/turf/open/floor/plasteel,
/mob/living/simple_animal/hostile/nanotrasen/ranged/smg,
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/security)
"dJ" = (
/obj/structure/rack,
@@ -1777,11 +1829,7 @@
},
/turf/open/floor/plasteel/dark,
/area/awaymission/research/interior/genetics)
"dQ" = (
/obj/structure/window/reinforced{
dir = 8
},
/mob/living/carbon/human,
"dP" = (
/obj/effect/turf_decal/tile/purple{
dir = 1
},
@@ -1792,8 +1840,23 @@
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/mob/living/simple_animal/hostile/nanotrasen/ranged,
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/cryo)
"dQ" = (
/obj/effect/turf_decal/tile/purple{
dir = 1
},
/obj/effect/turf_decal/tile/purple,
/obj/effect/turf_decal/tile/purple{
dir = 4
},
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/mob/living/simple_animal/hostile/nanotrasen,
/turf/open/floor/plasteel,
/area/awaymission/research/interior/genetics)
/area/awaymission/research/interior/cryo)
"dR" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -2144,15 +2207,15 @@
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/cryo)
"eB" = (
/mob/living/simple_animal/hostile/nanotrasen/ranged,
/obj/effect/turf_decal/tile/purple{
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/effect/turf_decal/tile/purple{
/obj/effect/turf_decal/tile/red{
dir = 4
},
/mob/living/simple_animal/hostile/nanotrasen/ranged/smg,
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/cryo)
/area/awaymission/research/interior/security)
"eC" = (
/obj/item/ammo_casing/c9mm,
/obj/effect/turf_decal/tile/purple{
@@ -2214,16 +2277,22 @@
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior)
"eL" = (
/mob/living/simple_animal/hostile/syndicate,
/obj/effect/turf_decal/tile/yellow{
/obj/structure/window/reinforced{
dir = 8
},
/obj/effect/turf_decal/tile/purple{
dir = 1
},
/obj/effect/turf_decal/tile/yellow,
/obj/effect/turf_decal/tile/yellow{
/obj/effect/turf_decal/tile/purple,
/obj/effect/turf_decal/tile/purple{
dir = 4
},
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior)
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/mob/living/carbon/monkey,
/turf/open/floor/plasteel,
/area/awaymission/research/interior/genetics)
"eM" = (
/obj/item/ammo_casing/c45,
/obj/item/ammo_casing/c45,
@@ -2846,19 +2915,19 @@
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/security)
"fY" = (
/mob/living/simple_animal/hostile/nanotrasen/ranged/smg,
/obj/effect/turf_decal/tile/red{
/obj/effect/turf_decal/tile/green{
dir = 1
},
/obj/effect/turf_decal/tile/red,
/obj/effect/turf_decal/tile/red{
/obj/effect/turf_decal/tile/green,
/obj/effect/turf_decal/tile/green{
dir = 4
},
/obj/effect/turf_decal/tile/red{
/obj/effect/turf_decal/tile/green{
dir = 8
},
/mob/living/simple_animal/hostile/syndicate/ranged/smg,
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/security)
/area/awaymission/research/interior)
"fZ" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -2966,6 +3035,23 @@
},
/turf/open/floor/plasteel/dark,
/area/awaymission/research/interior/secure)
"gi" = (
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/effect/turf_decal/tile/red{
dir = 4
},
/mob/living/simple_animal/bot/secbot/beepsky{
desc = "A beefy variant of the standard securitron model.";
emagged = 1;
faction = list("nanotrasenprivate");
health = 50;
maxHealth = 50;
name = "Officer Genesky"
},
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/security)
"gj" = (
/obj/structure/cable{
icon_state = "4-8"
@@ -3115,19 +3201,13 @@
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/cryo)
"gv" = (
/mob/living/simple_animal/hostile/nanotrasen/ranged,
/obj/effect/turf_decal/tile/purple{
dir = 1
},
/obj/effect/turf_decal/tile/purple,
/obj/effect/turf_decal/tile/purple{
/obj/effect/turf_decal/tile/green,
/obj/effect/turf_decal/tile/green{
dir = 4
},
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/mob/living/simple_animal/hostile/syndicate,
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/cryo)
/area/awaymission/research/interior)
"gw" = (
/obj/effect/mob_spawn/human/doctor{
brute_damage = 145;
@@ -3508,6 +3588,35 @@
},
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior)
"gW" = (
/obj/structure/sign/directions/security{
dir = 1;
pixel_x = 32;
pixel_y = 40
},
/obj/structure/sign/directions/engineering{
dir = 1;
pixel_x = 32;
pixel_y = 33
},
/obj/structure/sign/directions/science{
dir = 1;
pixel_x = 32;
pixel_y = 26
},
/obj/effect/turf_decal/tile/green{
dir = 1
},
/obj/effect/turf_decal/tile/green,
/obj/effect/turf_decal/tile/green{
dir = 4
},
/obj/effect/turf_decal/tile/green{
dir = 8
},
/mob/living/simple_animal/hostile/syndicate/ranged/smg,
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior)
"gX" = (
/obj/effect/decal/cleanable/blood/drip,
/obj/effect/turf_decal/tile/purple{
@@ -3660,19 +3769,19 @@
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/security)
"hj" = (
/mob/living/simple_animal/hostile/nanotrasen,
/obj/effect/turf_decal/tile/purple{
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/purple,
/obj/effect/turf_decal/tile/purple{
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/purple{
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/turf/open/floor/plasteel,
/area/awaymission/research/interior/cryo)
/mob/living/simple_animal/hostile/syndicate/ranged/smg,
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/medbay)
"hk" = (
/obj/effect/decal/cleanable/blood,
/obj/effect/turf_decal/tile/purple{
@@ -3736,15 +3845,19 @@
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/security)
"hq" = (
/mob/living/simple_animal/hostile/nanotrasen/ranged/smg,
/obj/effect/turf_decal/tile/red{
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/red{
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/mob/living/simple_animal/hostile/syndicate,
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/security)
/area/awaymission/research/interior/medbay)
"hr" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -3799,6 +3912,15 @@
},
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/cryo)
"hw" = (
/obj/machinery/computer/arcade{
icon_state = "arcade";
dir = 8
},
/turf/open/floor/plasteel/yellowsiding{
dir = 4
},
/area/awaymission/research/interior/dorm)
"hx" = (
/obj/structure/cable{
icon_state = "2-4"
@@ -4066,23 +4188,6 @@
},
/turf/open/floor/plasteel/dark,
/area/awaymission/research/interior/genetics)
"hW" = (
/obj/structure/window/reinforced{
dir = 8
},
/mob/living/carbon/monkey,
/obj/effect/turf_decal/tile/purple{
dir = 1
},
/obj/effect/turf_decal/tile/purple,
/obj/effect/turf_decal/tile/purple{
dir = 4
},
/obj/effect/turf_decal/tile/purple{
dir = 8
},
/turf/open/floor/plasteel,
/area/awaymission/research/interior/genetics)
"hX" = (
/obj/structure/rack,
/obj/effect/spawner/lootdrop/maintenance,
@@ -4139,20 +4244,6 @@
},
/turf/open/floor/plating,
/area/awaymission/research/interior/maint)
"if" = (
/mob/living/simple_animal/hostile/syndicate/ranged/smg,
/obj/effect/turf_decal/tile/green{
dir = 1
},
/obj/effect/turf_decal/tile/green,
/obj/effect/turf_decal/tile/green{
dir = 4
},
/obj/effect/turf_decal/tile/green{
dir = 8
},
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior)
"ig" = (
/obj/structure/cable{
icon_state = "2-4"
@@ -4186,23 +4277,6 @@
},
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/security)
"ij" = (
/mob/living/simple_animal/bot/secbot/beepsky{
desc = "A beefy variant of the standard securitron model.";
emagged = 1;
faction = list("nanotrasenprivate");
health = 50;
maxHealth = 50;
name = "Officer Genesky"
},
/obj/effect/turf_decal/tile/red{
dir = 1
},
/obj/effect/turf_decal/tile/red{
dir = 4
},
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/security)
"ik" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -4546,14 +4620,6 @@
},
/turf/open/floor/plasteel/freezer,
/area/awaymission/research/interior/bathroom)
"iQ" = (
/mob/living/simple_animal/hostile/syndicate,
/obj/effect/turf_decal/tile/green,
/obj/effect/turf_decal/tile/green{
dir = 4
},
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior)
"iR" = (
/turf/open/floor/plasteel,
/area/awaymission/research/interior/maint)
@@ -4723,35 +4789,6 @@
},
/turf/open/floor/plasteel,
/area/awaymission/research/interior)
"jr" = (
/obj/structure/sign/directions/security{
dir = 1;
pixel_x = 32;
pixel_y = 40
},
/obj/structure/sign/directions/engineering{
dir = 1;
pixel_x = 32;
pixel_y = 33
},
/obj/structure/sign/directions/science{
dir = 1;
pixel_x = 32;
pixel_y = 26
},
/mob/living/simple_animal/hostile/syndicate/ranged/smg,
/obj/effect/turf_decal/tile/green{
dir = 1
},
/obj/effect/turf_decal/tile/green,
/obj/effect/turf_decal/tile/green{
dir = 4
},
/obj/effect/turf_decal/tile/green{
dir = 8
},
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior)
"js" = (
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
@@ -4976,20 +5013,6 @@
},
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/medbay)
"jP" = (
/mob/living/simple_animal/hostile/syndicate/ranged/smg,
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/medbay)
"jQ" = (
/obj/effect/decal/cleanable/blood/drip,
/obj/effect/turf_decal/tile/blue{
@@ -5591,9 +5614,6 @@
dir = 8
},
/area/awaymission/research/interior/dorm)
"ln" = (
/turf/open/floor/plasteel,
/area/space/nearstation)
"lo" = (
/obj/structure/table/wood,
/obj/structure/bedsheetbin,
@@ -5613,20 +5633,6 @@
},
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/medbay)
"lr" = (
/mob/living/simple_animal/hostile/syndicate,
/obj/effect/turf_decal/tile/blue{
dir = 1
},
/obj/effect/turf_decal/tile/blue,
/obj/effect/turf_decal/tile/blue{
dir = 4
},
/obj/effect/turf_decal/tile/blue{
dir = 8
},
/turf/open/floor/plasteel/white,
/area/awaymission/research/interior/medbay)
"ls" = (
/obj/structure/table,
/obj/item/storage/firstaid/regular,
@@ -5867,12 +5873,6 @@
/obj/effect/landmark/awaystart,
/turf/open/floor/wood,
/area/awaymission/research/interior/dorm)
"lU" = (
/obj/machinery/computer/arcade,
/turf/open/floor/plasteel/yellowsiding{
dir = 4
},
/area/awaymission/research/interior/dorm)
"lV" = (
/obj/machinery/light/small{
dir = 1
@@ -38316,7 +38316,7 @@ ea
ev
fd
fE
gv
dP
ev
fd
fE
@@ -38565,10 +38565,10 @@ aH
cm
cw
cx
cT
aS
dh
dq
cT
aS
ea
ev
fc
@@ -38823,7 +38823,7 @@ cd
cx
cx
cU
di
bc
dr
dr
ea
@@ -39603,7 +39603,7 @@ ey
fG
gw
gR
hj
dQ
hu
hK
cK
@@ -40367,7 +40367,7 @@ cx
cW
dh
du
dQ
cX
ea
eA
fd
@@ -40377,7 +40377,7 @@ ev
fd
fE
ea
hW
eL
ib
ib
iz
@@ -40621,12 +40621,12 @@ aH
ce
cc
cx
cX
aU
dh
dv
dh
ea
eB
di
fc
fH
gx
@@ -40637,7 +40637,7 @@ ea
dh
dv
dh
cT
aS
cx
cm
cw
@@ -40651,7 +40651,7 @@ kr
jn
jF
jF
ln
jF
kc
lL
jk
@@ -41143,7 +41143,7 @@ ea
ev
fh
fI
gv
dP
ev
fc
fE
@@ -43224,8 +43224,8 @@ lc
lp
lp
lN
lU
lU
hw
hw
lY
aP
cd
@@ -44224,7 +44224,7 @@ dl
dz
cZ
ek
eL
dn
fl
eJ
eZ
@@ -44238,7 +44238,7 @@ ir
hZ
hZ
hZ
iQ
gv
hZ
hZ
hA
@@ -44490,7 +44490,7 @@ hl
hl
hl
hl
if
fY
is
hl
hl
@@ -44734,7 +44734,7 @@ cs
cC
cP
TD
dn
co
dB
da
em
@@ -44756,7 +44756,7 @@ ia
ia
ia
ia
jr
gW
jI
hl
kv
@@ -47584,7 +47584,7 @@ aO
iW
iW
ju
jP
hj
kh
iW
iW
@@ -48361,7 +48361,7 @@ kg
kM
jh
jw
lr
hq
kg
iW
cd
@@ -48855,7 +48855,7 @@ fq
fW
gK
fW
hq
eB
do
dH
dH
@@ -49366,7 +49366,7 @@ dT
eo
eR
fr
fY
dI
gK
fW
ho
@@ -49646,7 +49646,7 @@ kg
kL
kZ
lg
lr
hq
lD
iW
lW
@@ -50389,7 +50389,7 @@ ad
aH
aO
do
dI
cT
dH
dH
eS
@@ -50401,7 +50401,7 @@ fW
fW
fW
fW
ij
gi
do
hD
aH
@@ -50672,7 +50672,7 @@ jw
km
kB
kO
jP
hj
lj
lw
lI
+29 -20
View File
@@ -372,7 +372,10 @@
/turf/open/space,
/area/space/nearstation)
"aaU" = (
/obj/machinery/computer/arcade,
/obj/machinery/computer/arcade{
icon_state = "arcade";
dir = 4
},
/turf/open/floor/plasteel,
/area/security/prison)
"aaV" = (
@@ -6019,6 +6022,18 @@
},
/turf/open/floor/plasteel,
/area/security/processing)
"amd" = (
/obj/effect/turf_decal/tile/red{
dir = 8
},
/obj/machinery/computer/arcade{
icon_state = "arcade";
dir = 4
},
/turf/open/floor/plasteel/white/corner{
dir = 1
},
/area/hallway/secondary/exit)
"ame" = (
/obj/structure/cable{
icon_state = "1-2"
@@ -6225,6 +6240,17 @@
},
/turf/open/floor/plating,
/area/maintenance/solars/port/fore)
"amB" = (
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
dir = 1
},
/obj/machinery/computer/arcade{
icon_state = "arcade";
dir = 1
},
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"amC" = (
/turf/open/floor/plating,
/area/maintenance/port/fore)
@@ -19937,15 +19963,6 @@
dir = 1
},
/area/chapel/main)
"aUL" = (
/obj/machinery/computer/arcade,
/obj/effect/turf_decal/tile/red{
dir = 8
},
/turf/open/floor/plasteel/white/corner{
dir = 1
},
/area/hallway/secondary/exit)
"aUM" = (
/obj/machinery/camera{
c_tag = "Arrivals Bay 2";
@@ -22268,14 +22285,6 @@
},
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"baa" = (
/obj/machinery/computer/arcade,
/obj/effect/turf_decal/tile/bar,
/obj/effect/turf_decal/tile/bar{
dir = 1
},
/turf/open/floor/plasteel,
/area/crew_quarters/bar)
"bab" = (
/obj/machinery/light,
/obj/machinery/firealarm{
@@ -91961,7 +91970,7 @@ aUf
aQc
aXi
aQc
baa
amB
aJC
bcq
bcq
@@ -106349,7 +106358,7 @@ aCR
aCR
aCR
aTl
aUL
amd
aVW
aXD
aZj
+89 -25
View File
@@ -173,6 +173,88 @@
/obj/effect/landmark/xeno_spawn,
/turf/open/space,
/area/solar/starboard/fore)
"aav" = (
/obj/effect/decal/cleanable/cobweb,
/obj/machinery/computer/arcade{
icon_state = "arcade";
dir = 4
},
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aaw" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/machinery/computer/arcade{
icon_state = "arcade";
dir = 4
},
/turf/open/floor/plasteel/dark,
/area/maintenance/starboard/fore)
"aax" = (
/obj/effect/decal/cleanable/dirt,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/machinery/computer/arcade{
icon_state = "arcade";
dir = 1
},
/turf/open/floor/plasteel/dark,
/area/maintenance/starboard/fore)
"aay" = (
/obj/machinery/computer/arcade{
icon_state = "arcade";
dir = 1
},
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aaz" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/machinery/computer/arcade{
icon_state = "arcade";
dir = 1
},
/turf/open/floor/plasteel/dark,
/area/maintenance/starboard/fore)
"aaA" = (
/obj/effect/decal/cleanable/dirt,
/obj/machinery/computer/arcade{
icon_state = "arcade";
dir = 1
},
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"aaB" = (
/obj/machinery/computer/arcade{
icon_state = "arcade";
dir = 1
},
/turf/open/floor/plating,
/area/security/prison)
"aaE" = (
/obj/structure/lattice/catwalk,
/turf/open/space,
@@ -4563,11 +4645,6 @@
},
/turf/open/floor/plasteel,
/area/maintenance/starboard/fore)
"anz" = (
/obj/machinery/computer/arcade,
/obj/effect/decal/cleanable/cobweb,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"anA" = (
/obj/structure/cable/white{
icon_state = "0-2"
@@ -7122,10 +7199,6 @@
},
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"arX" = (
/obj/machinery/computer/arcade,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"arY" = (
/obj/structure/table/wood,
/obj/item/toy/talking/codex_gigas,
@@ -7156,11 +7229,6 @@
},
/turf/open/floor/plasteel/dark,
/area/maintenance/starboard/fore)
"asa" = (
/obj/machinery/computer/arcade,
/obj/effect/decal/cleanable/dirt,
/turf/open/floor/plating,
/area/maintenance/starboard/fore)
"asb" = (
/obj/machinery/airalarm{
dir = 1;
@@ -21997,10 +22065,6 @@
/obj/machinery/atmospherics/pipe/simple/supply/hidden,
/turf/open/floor/plating,
/area/security/prison)
"aRi" = (
/obj/machinery/computer/arcade,
/turf/open/floor/plating,
/area/security/prison)
"aRj" = (
/obj/structure/cable/white{
icon_state = "0-2"
@@ -170617,7 +170681,7 @@ aox
apu
aqy
arb
aoy
aax
aig
auA
avU
@@ -170874,7 +170938,7 @@ aoy
apv
aqz
apu
arX
aay
aig
auB
avU
@@ -171383,8 +171447,8 @@ aiC
akU
alI
amE
anz
aox
aav
aaw
apw
aqA
apy
@@ -171902,7 +171966,7 @@ aiC
apy
apy
apu
aox
aaz
atw
auD
avW
@@ -172159,7 +172223,7 @@ aoB
apz
apw
apv
asa
aaA
atw
auE
avW
@@ -182715,7 +182779,7 @@ aFn
aMn
aNI
aPr
aRi
aaB
aKV
aUC
aWk
+17 -15
View File
@@ -1279,6 +1279,22 @@
},
/turf/open/floor/plasteel,
/area/science/mixing)
"abQ" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/machinery/computer/arcade{
dir = 4
},
/turf/open/floor/plasteel/dark,
/area/maintenance/port)
"abR" = (
/obj/structure/lattice,
/turf/open/space,
@@ -37164,20 +37180,6 @@
},
/turf/open/floor/plasteel,
/area/hallway/primary/starboard)
"dEa" = (
/obj/machinery/computer/arcade,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/turf/open/floor/plasteel/dark,
/area/maintenance/port)
"dFV" = (
/obj/machinery/atmospherics/pipe/simple/green/visible{
dir = 4
@@ -76194,7 +76196,7 @@ aZp
bak
bbc
bbQ
dEa
abQ
bdD
beu
sKE
+26 -20
View File
@@ -35,6 +35,30 @@
icon_state = "platingdmg3"
},
/area/maintenance/department/science)
"aae" = (
/obj/machinery/computer/arcade{
icon_state = "arcade";
dir = 8
},
/turf/open/floor/plasteel/dark,
/area/security/prison)
"aaf" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/machinery/computer/arcade{
icon_state = "arcade";
dir = 1
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/captain)
"abf" = (
/obj/structure/bed,
/turf/open/floor/plating,
@@ -1621,10 +1645,6 @@
},
/turf/open/floor/plasteel/dark,
/area/security/prison)
"afI" = (
/obj/machinery/computer/arcade,
/turf/open/floor/plasteel/dark,
/area/security/prison)
"afJ" = (
/obj/effect/landmark/carpspawn,
/turf/open/space/basic,
@@ -13685,20 +13705,6 @@
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/captain)
"aGm" = (
/obj/machinery/computer/arcade,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/turf/open/floor/plasteel/dark,
/area/crew_quarters/heads/captain)
"aGn" = (
/obj/item/twohanded/required/kirbyplants/photosynthetic{
layer = 3.1
@@ -83601,7 +83607,7 @@ aeu
aeI
lGp
aeU
afI
aae
aeU
dUk
agy
@@ -90832,7 +90838,7 @@ aCC
aDG
aBm
aFz
aGm
aaf
awR
aHQ
aIO
+35 -35
View File
@@ -26979,9 +26979,9 @@ ab
ab
ab
ab
ab
ab
ab
ae
ae
ae
ab
ab
ab
@@ -27235,11 +27235,11 @@ ab
ab
ab
ab
ab
ab
ab
ab
ab
ae
ag
ag
ag
ae
ab
ab
ab
@@ -27492,11 +27492,11 @@ ab
ab
ab
ab
ab
ab
ab
ab
ab
ae
ag
ag
ag
ae
aF
aF
aF
@@ -27747,8 +27747,8 @@ ab
ab
ab
ab
ae
ae
ab
ab
ah
ah
ai
@@ -28003,9 +28003,9 @@ ab
ab
ab
ab
ae
ag
ag
ab
ab
ab
ah
ar
aj
@@ -28260,9 +28260,9 @@ ab
ab
ab
ab
ae
ag
ag
ab
ab
ab
ah
as
aj
@@ -28517,9 +28517,9 @@ ab
ab
ab
ab
ae
ag
ag
ab
ab
ab
ah
VP
aj
@@ -28775,8 +28775,8 @@ ab
ab
ab
ab
ae
ae
ab
ab
ah
ah
ay
@@ -29033,7 +29033,7 @@ ab
ab
ab
ab
ae
ab
an
au
aj
@@ -33657,7 +33657,7 @@ ab
ab
ab
ab
ae
ab
ah
al
aj
@@ -33914,7 +33914,7 @@ ab
ab
ab
ab
ae
ab
ai
bE
aj
@@ -34171,7 +34171,7 @@ ab
ab
ab
ab
ae
ab
ah
al
aj
@@ -34688,11 +34688,11 @@ ab
ab
ab
ab
ab
ab
ab
ab
ab
ae
ae
ag
ae
ae
aF
aF
aF
+18 -16
View File
@@ -591,6 +591,22 @@
/obj/machinery/recharger,
/turf/open/floor/mineral/plastitanium/red/brig,
/area/shuttle/escape)
"bh" = (
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/obj/machinery/computer/arcade{
dir = 4
},
/turf/open/floor/plasteel,
/area/shuttle/escape)
"bj" = (
/turf/open/floor/mech_bay_recharge_floor,
/area/shuttle/escape)
@@ -1181,20 +1197,6 @@
},
/turf/open/floor/plasteel/white,
/area/shuttle/escape)
"cz" = (
/obj/machinery/computer/arcade,
/obj/effect/turf_decal/tile/neutral{
dir = 1
},
/obj/effect/turf_decal/tile/neutral,
/obj/effect/turf_decal/tile/neutral{
dir = 4
},
/obj/effect/turf_decal/tile/neutral{
dir = 8
},
/turf/open/floor/plasteel,
/area/shuttle/escape)
"cA" = (
/obj/machinery/light{
dir = 8
@@ -1815,8 +1817,8 @@ ab
ad
cn
cn
cz
cz
bh
bh
cn
cn
ab
+1 -1
View File
@@ -15,7 +15,7 @@
#define ui_boxvore "EAST-5:22,SOUTH+1:6"
//Filters
#define CIT_FILTER_STAMINACRIT filter(type="drop_shadow", x=0, y=0, size=-3, border=0, color="#04080F")
#define CIT_FILTER_STAMINACRIT filter(type="drop_shadow", x=0, y=0, size=-3, color="#04080F")
//organ defines
#define VAGINA_LAYER_INDEX 1
+7
View File
@@ -157,6 +157,10 @@
// /mob/living/carbon signals
#define COMSIG_CARBON_SOUNDBANG "carbon_soundbang" //from base of mob/living/carbon/soundbang_act(): (list(intensity))
// /mob/living/simple_animal/hostile signals
#define COMSIG_HOSTILE_ATTACKINGTARGET "hostile_attackingtarget"
#define COMPONENT_HOSTILE_NO_ATTACK 1
// /obj signals
#define COMSIG_OBJ_DECONSTRUCT "obj_deconstruct" //from base of obj/deconstruct(): (disassembled)
#define COMSIG_OBJ_BREAK "obj_break" //from base of /obj/obj_break(): (damage_flag)
@@ -206,6 +210,9 @@
// /obj/item/pen signals
#define COMSIG_PEN_ROTATED "pen_rotated" //called after rotation in /obj/item/pen/attack_self(): (rotation, mob/living/carbon/user)
// /obj/item/projectile signals (sent to the firer)
#define COMSIG_PROJECTILE_ON_HIT "projectile_on_hit" // from base of /obj/item/projectile/proc/on_hit(): (atom/movable/firer, atom/target, Angle)
#define COMSIG_PROJECTILE_BEFORE_FIRE "projectile_before_fire" // from base of /obj/item/projectile/proc/fire(): (obj/item/projectile, atom/original_target)
// /mob/living/carbon/human signals
#define COMSIG_HUMAN_MELEE_UNARMED_ATTACK "human_melee_unarmed_attack" //from mob/living/carbon/human/UnarmedAttack(): (atom/target)
+5
View File
@@ -0,0 +1,5 @@
#define AFFIX_PREFIX (1 << 0)
#define AFFIX_SUFFIX (1 << 1)
#define AFFIX_GOOD (1 << 0)
#define AFFIX_EVIL (1 << 1)
+4
View File
@@ -219,6 +219,10 @@ GLOBAL_LIST_INIT(pointed_types, typecacheof(list(
#define isbodypart(A) (istype(A, /obj/item/bodypart))
#define isprojectile(A) (istype(A, /obj/item/projectile))
#define isgun(A) (istype(A, /obj/item/gun))
//Assemblies
#define isassembly(O) (istype(O, /obj/item/assembly))
+1 -1
View File
@@ -490,7 +490,7 @@ GLOBAL_LIST_INIT(pda_reskins, list(PDA_SKIN_CLASSIC = 'icons/obj/pda.dmi', PDA_S
#define PDAIMG(what) {"<span class="pda16x16 [#what]"></span>"}
//Filters
#define AMBIENT_OCCLUSION list("type"="drop_shadow","x"=0,"y"=-2,"size"=4,"border"=4,"color"="#04080FAA")
#define AMBIENT_OCCLUSION list("type"="drop_shadow","x"=0,"y"=-2,"size"=4,"color"="#04080FAA")
#define EYE_BLUR(size) list("type"="blur", "size"=size)
#define GRAVITY_MOTION_BLUR list("type"="motion_blur","x"=0,"y"=0)
@@ -380,6 +380,22 @@
config_entry_value = 6
min_val = 1
/datum/config_entry/number/dynamic_midround_delay_min
config_entry_value = 15
min_val = 1
/datum/config_entry/number/dynamic_midround_delay_max
config_entry_value = 35
min_val = 1
/datum/config_entry/number/dynamic_latejoin_delay_min
config_entry_value = 5
min_val = 1
/datum/config_entry/number/dynamic_latejoin_delay_max
config_entry_value = 25
min_val = 1
/datum/config_entry/keyed_list/dynamic_cost
key_mode = KEY_MODE_TEXT
value_mode = VALUE_MODE_NUM
+11 -11
View File
@@ -4,7 +4,7 @@ SUBSYSTEM_DEF(job)
flags = SS_NO_FIRE
var/list/occupations = list() //List of all jobs
var/list/name_occupations = list() //Dict of all jobs, keys are titles
var/list/datum/job/name_occupations = list() //Dict of all jobs, keys are titles
var/list/type_occupations = list() //Dict of all jobs, keys are types
var/list/unassigned = list() //Players who need jobs
var/initial_players_to_assign = 0 //used for checking against population caps
@@ -14,6 +14,8 @@ SUBSYSTEM_DEF(job)
var/overflow_role = "Assistant"
var/list/level_order = list(JP_HIGH,JP_MEDIUM,JP_LOW)
/datum/controller/subsystem/job/Initialize(timeofday)
SSmapping.HACK_LoadMapConfig()
if(!occupations.len)
@@ -119,7 +121,7 @@ SUBSYSTEM_DEF(job)
if(player.mind && job.title in player.mind.restricted_roles)
JobDebug("FOC incompatible with antagonist role, Player: [player]")
continue
if(player.client.prefs.job_preferences["[job.title]"] == level)
if(player.client.prefs.job_preferences[job.title] == level)
JobDebug("FOC pass, Player: [player], Level:[level]")
candidates += player
return candidates
@@ -181,7 +183,7 @@ SUBSYSTEM_DEF(job)
//it locates a head or runs out of levels to check
//This is basically to ensure that there's atleast a few heads in the round
/datum/controller/subsystem/job/proc/FillHeadPosition()
for(var/level = 1 to 3)
for(var/level in level_order)
for(var/command_position in GLOB.command_positions)
var/datum/job/job = GetJob(command_position)
if(!job)
@@ -218,7 +220,7 @@ SUBSYSTEM_DEF(job)
if(!job)
return 0
for(var/i = job.total_positions, i > 0, i--)
for(var/level = 1 to 3)
for(var/level in level_order)
var/list/candidates = list()
candidates = FindOccupationCandidates(job, level)
if(candidates.len)
@@ -304,8 +306,7 @@ SUBSYSTEM_DEF(job)
// Loop through all levels from high to low
var/list/shuffledoccupations = shuffle(occupations)
var/list/levels = list(JP_HIGH,JP_MEDIUM,JP_LOW)
for(var/level in levels)
for(var/level in level_order)
//Check the head jobs first each level
CheckHeadPositions(level)
@@ -334,7 +335,7 @@ SUBSYSTEM_DEF(job)
if(job.required_playtime_remaining(player.client))
JobDebug("DO player not enough xp, Player: [player], Job:[job.title]")
continue
if(!player.client.prefs.pref_species.qualifies_for_rank(job.title, player.client.prefs.features))
JobDebug("DO non-human failed, Player: [player], Job:[job.title]")
continue
@@ -344,7 +345,7 @@ SUBSYSTEM_DEF(job)
continue
// If the player wants that job on this level, then try give it to him.
if(player.client.prefs.job_preferences["[job.title]"] == level)
if(player.client.prefs.job_preferences[job.title] == level)
// If the job isn't filled
if((job.current_positions < job.spawn_positions) || job.spawn_positions == -1)
JobDebug("DO pass, Player: [player], Level:[level], Job:[job.title]")
@@ -475,7 +476,6 @@ SUBSYSTEM_DEF(job)
to_chat(M, "<b>[job.custom_spawn_text]</b>")
if(CONFIG_GET(number/minimal_access_threshold))
to_chat(M, "<span class='notice'><B>As this station was initially staffed with a [CONFIG_GET(flag/jobs_have_minimal_access) ? "full crew, only your job's necessities" : "skeleton crew, additional access may"] have been added to your ID card.</B></span>")
if(job && H)
if(job.dresscodecompliant)// CIT CHANGE - dress code compliance
equip_loadout(N, H) // CIT CHANGE - allows players to spawn with loadout items
@@ -551,7 +551,7 @@ SUBSYSTEM_DEF(job)
if(job.required_playtime_remaining(player.client))
young++
continue
switch(player.client.prefs.job_preferences["[job.title]"])
switch(player.client.prefs.job_preferences[job.title])
if(JP_HIGH)
high++
if(JP_MEDIUM)
@@ -698,4 +698,4 @@ SUBSYSTEM_DEF(job)
. |= player.mind
/datum/controller/subsystem/job/proc/JobDebug(message)
log_job_debug(message)
log_job_debug(message)
+45
View File
@@ -0,0 +1,45 @@
/datum/component/bane
dupe_mode = COMPONENT_DUPE_ALLOWED
var/mobtype
var/speciestype
var/damage_multiplier
/datum/component/bane/Initialize(mobtype, damage_multiplier=1)
if(!isitem(parent))
return COMPONENT_INCOMPATIBLE
if(ispath(mobtype, /mob/living))
src.mobtype = mobtype
else if(ispath(mobtype, /datum/species))
speciestype = mobtype
else
return COMPONENT_INCOMPATIBLE
src.damage_multiplier = damage_multiplier
/datum/component/bane/RegisterWithParent()
if(speciestype)
RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/speciesCheck)
else
RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/mobCheck)
/datum/component/bane/UnregisterFromParent()
UnregisterSignal(parent, COMSIG_ITEM_AFTERATTACK)
/datum/component/bane/proc/speciesCheck(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
if(!is_species(target, speciestype))
return
activate(source, target, user)
/datum/component/bane/proc/mobCheck(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
if(!istype(target, mobtype))
return
activate(source, target, user)
/datum/component/bane/proc/activate(obj/item/source, mob/living/target, mob/attacker)
if(attacker.a_intent != INTENT_HARM)
return
var/extra_damage = max(0, source.force * damage_multiplier)
target.apply_damage(extra_damage, source.damtype, attacker.zone_selected)
+140
View File
@@ -0,0 +1,140 @@
/datum/component/fantasy
dupe_mode = COMPONENT_DUPE_UNIQUE_PASSARGS
var/quality
var/canFail
var/announce
var/originalName
var/list/affixes
var/list/appliedComponents
var/static/list/affixListing
/datum/component/fantasy/Initialize(quality, list/affixes = list(), canFail=FALSE, announce=FALSE)
if(!isitem(parent))
return COMPONENT_INCOMPATIBLE
src.quality = quality || randomQuality()
src.canFail = canFail
src.announce = announce
src.affixes = affixes
appliedComponents = list()
randomAffixes()
/datum/component/fantasy/Destroy()
unmodify()
affixes = null
return ..()
/datum/component/fantasy/RegisterWithParent()
var/obj/item/master = parent
originalName = master.name
modify()
/datum/component/fantasy/UnregisterFromParent()
unmodify()
/datum/component/fantasy/InheritComponent(datum/component/fantasy/newComp, original, list/arguments)
unmodify()
if(newComp)
quality += newComp.quality
canFail = newComp.canFail
announce = newComp.announce
else
arguments.len = 5 // This is done to replicate what happens when an arglist smaller than the necessary arguments is given
quality += arguments[1]
canFail = arguments[4] || canFail
announce = arguments[5] || announce
modify()
/datum/component/fantasy/proc/randomQuality()
var/quality = pick(1;15, 2;14, 2;13, 2;12, 3;11, 3;10, 3;9, 4;8, 4;7, 4;6, 5;5, 5;4, 5;3, 6;2, 6;1, 6;0)
if(prob(50))
quality = -quality
return quality
/datum/component/fantasy/proc/randomAffixes(force)
if(!affixListing)
affixListing = list()
for(var/T in subtypesof(/datum/fantasy_affix))
var/datum/fantasy_affix/affix = new T
affixListing[affix] = affix.weight
if(length(affixes))
if(!force)
return
affixes = list()
var/alignment
if(quality >= 0)
alignment |= AFFIX_GOOD
if(quality <= 0)
alignment |= AFFIX_EVIL
var/usedSlots = NONE
for(var/i in 1 to max(1, abs(quality))) // We want at least 1 affix applied
var/datum/fantasy_affix/affix = pickweight(affixListing)
if(affix.placement & usedSlots)
continue
if(!(affix.alignment & alignment))
continue
if(!affix.validate(src))
continue
affixes += affix
usedSlots |= affix.placement
/datum/component/fantasy/proc/modify()
var/obj/item/master = parent
master.force = max(0, master.force + quality)
master.throwforce = max(0, master.throwforce + quality)
master.armor = master.armor?.modifyAllRatings(quality)
var/newName = originalName
for(var/i in affixes)
var/datum/fantasy_affix/affix = i
newName = affix.apply(src, newName)
if(quality != 0)
newName = "[newName] [quality > 0 ? "+" : ""][quality]"
if(canFail && prob((quality - 9)*10))
var/turf/place = get_turf(parent)
place.visible_message("<span class='danger'>[parent] <span class='blue'>violently glows blue</span> for a while, then evaporates.</span>")
master.burn()
return
else if(announce)
announce()
master.name = newName
/datum/component/fantasy/proc/unmodify()
var/obj/item/master = parent
for(var/i in affixes)
var/datum/fantasy_affix/affix = i
affix.remove(src)
for(var/i in appliedComponents)
qdel(i)
master.force = max(0, master.force - quality)
master.throwforce = max(0, master.throwforce - quality)
master.armor = master.armor?.modifyAllRatings(-quality)
master.name = originalName
/datum/component/fantasy/proc/announce()
var/turf/location = get_turf(parent)
var/span
var/effect_description
if(quality >= 0)
span = "<span class='notice'>"
effect_description = "<span class='heavy_brass'>shimmering golden glow</span>"
else
span = "<span class='danger'>"
effect_description = "<span class='bold'>mottled black glow</span>"
location.visible_message("[span][originalName] is covered by a [effect_description] and then transforms into [parent]!</span>")
+13
View File
@@ -0,0 +1,13 @@
/datum/fantasy_affix
var/placement // A bitflag of "slots" this affix takes up, for example pre/suffix
var/alignment
var/weight = 10
// For those occasional affixes which only make sense in certain circumstances
/datum/fantasy_affix/proc/validate(datum/component/fantasy/comp)
return TRUE
/datum/fantasy_affix/proc/apply(datum/component/fantasy/comp, newName)
return newName
/datum/fantasy_affix/proc/remove(datum/component/fantasy/comp)
@@ -0,0 +1,68 @@
/datum/fantasy_affix/cosmetic_prefixes
placement = AFFIX_PREFIX
alignment = AFFIX_GOOD | AFFIX_EVIL
var/list/goodPrefixes
var/list/badPrefixes
/datum/fantasy_affix/cosmetic_prefixes/New()
goodPrefixes = list(
"greater",
"major",
"blessed",
"superior",
"empowered",
"honed",
"true",
"glorious",
"robust",
)
badPrefixes = list(
"lesser",
"minor",
"blighted",
"inferior",
"enfeebled",
"rusted",
"unsteady",
"tragic",
"gimped",
"cursed",
)
weight = (length(goodPrefixes) + length(badPrefixes)) * 10
/datum/fantasy_affix/cosmetic_prefixes/apply(datum/component/fantasy/comp, newName)
if(comp.quality > 0 || (comp.quality == 0 && prob(50)))
return "[pick(goodPrefixes)] [newName]"
else
return "[pick(badPrefixes)] [newName]"
/datum/fantasy_affix/tactical
placement = AFFIX_PREFIX
alignment = AFFIX_GOOD
weight = 1 // Very powerful, no one should have such power
/datum/fantasy_affix/tactical/apply(datum/component/fantasy/comp, newName)
var/obj/item/master = comp.parent
comp.appliedComponents += master.AddComponent(/datum/component/tactical)
return "tactical [newName]"
/datum/fantasy_affix/pyromantic
placement = AFFIX_PREFIX
alignment = AFFIX_GOOD
/datum/fantasy_affix/pyromantic/apply(datum/component/fantasy/comp, newName)
var/obj/item/master = comp.parent
comp.appliedComponents += master.AddComponent(/datum/component/igniter, CLAMP(comp.quality, 1, 10))
return "pyromantic [newName]"
/datum/fantasy_affix/vampiric
placement = AFFIX_PREFIX
alignment = AFFIX_GOOD
weight = 5
/datum/fantasy_affix/vampiric/apply(datum/component/fantasy/comp, newName)
var/obj/item/master = comp.parent
comp.appliedComponents += master.AddComponent(/datum/component/lifesteal, comp.quality)
return "vampiric [newName]"
+170
View File
@@ -0,0 +1,170 @@
/datum/fantasy_affix/cosmetic_suffixes
placement = AFFIX_SUFFIX
alignment = AFFIX_GOOD | AFFIX_EVIL
var/list/goodSuffixes
var/list/badSuffixes
/datum/fantasy_affix/cosmetic_suffixes/New()
goodSuffixes = list(
"dexterity",
"constitution",
"intelligence",
"wisdom",
"charisma",
"the forest",
"the hills",
"the plains",
"the sea",
"the sun",
"the moon",
"the void",
"the world",
"many secrets",
"many tales",
"many colors",
"rending",
"sundering",
"the night",
"the day",
)
badSuffixes = list(
"draining",
"burden",
"discomfort",
"awkwardness",
"poor hygiene",
"timidity",
)
weight = (length(goodSuffixes) + length(badSuffixes)) * 10
/datum/fantasy_affix/cosmetic_suffixes/apply(datum/component/fantasy/comp, newName)
if(comp.quality > 0 || (comp.quality == 0 && prob(50)))
return "[newName] of [pick(goodSuffixes)]"
else
return "[newName] of [pick(badSuffixes)]"
//////////// Good suffixes
/datum/fantasy_affix/bane
placement = AFFIX_SUFFIX
alignment = AFFIX_GOOD
weight = 20
/datum/fantasy_affix/bane/apply(datum/component/fantasy/comp, newName)
. = ..()
// This is set up to be easy to add to these lists as I expect it will need modifications
var/static/list/possible_mobtypes
if(!possible_mobtypes)
// The base list of allowed mob/species types
possible_mobtypes = typecacheof(list(
/mob/living/simple_animal,
/mob/living/carbon,
/datum/species,
))
// Some particular types to disallow if they're too broad/abstract
possible_mobtypes -= list(
/mob/living/simple_animal/hostile,
)
// Some types to remove them and their subtypes
possible_mobtypes -= typecacheof(list(
/mob/living/carbon/human/species,
))
var/mob/picked_mobtype = pick(possible_mobtypes)
// This works even with the species picks since we're only accessing the name
var/obj/item/master = comp.parent
comp.appliedComponents += master.AddComponent(/datum/component/bane, picked_mobtype)
return "[newName] of [initial(picked_mobtype.name)] slaying"
/datum/fantasy_affix/summoning
placement = AFFIX_SUFFIX
alignment = AFFIX_GOOD
weight = 5
/datum/fantasy_affix/summoning/apply(datum/component/fantasy/comp, newName)
. = ..()
// This is set up to be easy to add to these lists as I expect it will need modifications
var/static/list/possible_mobtypes
if(!possible_mobtypes)
// The base list of allowed mob/species types
possible_mobtypes = typecacheof(list(
/mob/living/simple_animal,
/mob/living/carbon,
/datum/species,
))
// Some particular types to disallow if they're too broad/abstract
possible_mobtypes -= list(
/mob/living/simple_animal/hostile,
)
// Some types to remove them and their subtypes
possible_mobtypes -= typecacheof(list(
/mob/living/carbon/human/species,
/mob/living/simple_animal/hostile/megafauna,
))
var/mob/picked_mobtype = pick(possible_mobtypes)
// This works even with the species picks since we're only accessing the name
var/obj/item/master = comp.parent
var/max_mobs = max(CEILING(comp.quality/2, 1), 1)
var/spawn_delay = 300 - 30 * comp.quality
comp.appliedComponents += master.AddComponent(/datum/component/summoning, list(picked_mobtype), 100, max_mobs, spawn_delay)
return "[newName] of [initial(picked_mobtype.name)] summoning"
/datum/fantasy_affix/shrapnel
placement = AFFIX_SUFFIX
alignment = AFFIX_GOOD
/datum/fantasy_affix/shrapnel/validate(datum/component/fantasy/comp)
if(isgun(comp.parent))
return TRUE
return FALSE
/datum/fantasy_affix/shrapnel/apply(datum/component/fantasy/comp, newName)
. = ..()
// higher means more likely
var/list/weighted_projectile_types = list(/obj/item/projectile/meteor = 1,
/obj/item/projectile/energy/nuclear_particle = 1,
/obj/item/projectile/beam/pulse = 1,
/obj/item/projectile/bullet/honker = 15,
/obj/item/projectile/temp = 15,
/obj/item/projectile/ion = 15,
/obj/item/projectile/magic/door = 15,
/obj/item/projectile/magic/locker = 15,
// /obj/item/projectile/magic/fetch = 15,
/obj/item/projectile/beam/emitter = 15,
// /obj/item/projectile/magic/flying = 15,
/obj/item/projectile/energy/net = 15,
/obj/item/projectile/bullet/incendiary/c9mm = 15,
/obj/item/projectile/temp/hot = 15,
/obj/item/projectile/beam/disabler = 15)
var/obj/item/projectile/picked_projectiletype = pickweight(weighted_projectile_types)
var/obj/item/master = comp.parent
comp.appliedComponents += master.AddComponent(/datum/component/shrapnel, picked_projectiletype)
return "[newName] of [initial(picked_projectiletype.name)] shrapnel"
/datum/fantasy_affix/strength
placement = AFFIX_SUFFIX
alignment = AFFIX_GOOD
/datum/fantasy_affix/strength/apply(datum/component/fantasy/comp, newName)
. = ..()
var/obj/item/master = comp.parent
comp.appliedComponents += master.AddComponent(/datum/component/knockback, CEILING(comp.quality/2, 1), FLOOR(comp.quality/10, 1))
return "[newName] of strength"
//////////// Bad suffixes
/datum/fantasy_affix/fool
placement = AFFIX_SUFFIX
alignment = AFFIX_EVIL
/datum/fantasy_affix/fool/apply(datum/component/fantasy/comp, newName)
. = ..()
var/obj/item/master = comp.parent
comp.appliedComponents += master.AddComponent(/datum/component/squeak, list('sound/items/bikehorn.ogg'=1), 50)
return "[newName] of the fool"
+37
View File
@@ -0,0 +1,37 @@
/datum/component/igniter
var/fire_stacks
/datum/component/igniter/Initialize(fire_stacks=1)
if(!isitem(parent) && !ishostile(parent) && !isgun(parent) && !ismachinery(parent) && !isstructure(parent))
return COMPONENT_INCOMPATIBLE
src.fire_stacks = fire_stacks
/datum/component/igniter/RegisterWithParent()
if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc
RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit)
else if(isitem(parent))
RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/item_afterattack)
else if(ishostile(parent))
RegisterSignal(parent, COMSIG_HOSTILE_ATTACKINGTARGET, .proc/hostile_attackingtarget)
/datum/component/igniter/UnregisterFromParent()
UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT))
/datum/component/igniter/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
if(!proximity_flag)
return
do_igniter(target)
/datum/component/igniter/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target)
do_igniter(target)
/datum/component/igniter/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle)
do_igniter(target)
/datum/component/igniter/proc/do_igniter(atom/target)
if(isliving(target))
var/mob/living/L = target
L.adjust_fire_stacks(fire_stacks)
L.IgniteMob()
+44
View File
@@ -0,0 +1,44 @@
/datum/component/knockback
var/throw_distance
var/throw_anchored
/datum/component/knockback/Initialize(throw_distance=1)
if(!isitem(parent) && !ishostile(parent) && !isgun(parent) && !ismachinery(parent) && !isstructure(parent))
return COMPONENT_INCOMPATIBLE
src.throw_distance = throw_distance
src.throw_anchored = throw_anchored
/datum/component/knockback/RegisterWithParent()
if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc
RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit)
else if(isitem(parent))
RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/item_afterattack)
else if(ishostile(parent))
RegisterSignal(parent, COMSIG_HOSTILE_ATTACKINGTARGET, .proc/hostile_attackingtarget)
/datum/component/knockback/UnregisterFromParent()
UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT))
/datum/component/knockback/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
if(!proximity_flag)
return
do_knockback(target, user, get_dir(source, target))
/datum/component/knockback/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target)
do_knockback(target, attacker, get_dir(attacker, target))
/datum/component/knockback/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle)
do_knockback(target, null, angle2dir(Angle))
/datum/component/knockback/proc/do_knockback(atom/target, mob/thrower, throw_dir)
if(!ismovableatom(target) || throw_dir == null)
return
var/atom/movable/throwee = target
if(throwee.anchored && !throw_anchored)
return
if(throw_distance < 0)
throw_dir = turn(throw_dir, 180)
throw_distance *= -1
var/atom/throw_target = get_edge_target_turf(throwee, throw_dir)
throwee.safe_throw_at(throw_target, throw_distance, 1, thrower)
+39
View File
@@ -0,0 +1,39 @@
/datum/component/lifesteal
var/flat_heal // heals a constant amount every time a hit occurs
var/static/list/damage_heal_order = list(BRUTE, BURN, OXY)
/datum/component/lifesteal/Initialize(flat_heal=0)
if(!isitem(parent) && !ishostile(parent) && !isgun(parent))
return COMPONENT_INCOMPATIBLE
src.flat_heal = flat_heal
/datum/component/lifesteal/RegisterWithParent()
if(isgun(parent))
RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit)
else if(isitem(parent))
RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/item_afterattack)
else if(ishostile(parent))
RegisterSignal(parent, COMSIG_HOSTILE_ATTACKINGTARGET, .proc/hostile_attackingtarget)
/datum/component/lifesteal/UnregisterFromParent()
UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT))
/datum/component/lifesteal/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
if(!proximity_flag)
return
do_lifesteal(user, target)
/datum/component/lifesteal/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target)
do_lifesteal(attacker, target)
/datum/component/lifesteal/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle)
do_lifesteal(firer, target)
/datum/component/lifesteal/proc/do_lifesteal(atom/heal_target, atom/damage_target)
if(isliving(heal_target) && isliving(damage_target))
var/mob/living/healing = heal_target
var/mob/living/damaging = damage_target
if(damaging.stat != DEAD)
healing.heal_ordered_damage(flat_heal, damage_heal_order)
+6 -15
View File
@@ -7,33 +7,24 @@
var/filter_x
var/filter_y
var/filter_size
var/filter_border
var/filter_color
/datum/component/wearertargeting/phantomthief/Initialize(_x = -2, _y = 0, _size = 0, _border = 0, _color = "#E62111", list/_valid_slots = list(SLOT_GLASSES))
/datum/component/wearertargeting/phantomthief/Initialize(_x = -2, _y = 0, _size = 0, _color = "#E62111", list/_valid_slots = list(SLOT_GLASSES))
. = ..()
if(. == COMPONENT_INCOMPATIBLE)
return
filter_x = _x
filter_y = _y
filter_size = _size
filter_border = _border
filter_color = _color
valid_slots = _valid_slots
/datum/component/wearertargeting/phantomthief/proc/handlefilterstuff(datum/source, mob/user, combatmodestate)
if(istype(user))
var/thefilter = filter(type = "drop_shadow", x = filter_x, y = filter_y, size = filter_size, border = filter_border, color = filter_color)
if(!combatmodestate)
user.filters -= thefilter
else
user.filters += thefilter
/datum/component/wearertargeting/phantomthief/proc/stripdesiredfilter(mob/user)
if(istype(user))
var/thefilter = filter(type = "drop_shadow", x = filter_x, y = filter_y, size = filter_size, border = filter_border, color = filter_color)
user.filters -= thefilter
if(!combatmodestate)
user.remove_filter("phantomthief")
else
user.add_filter("phantomthief", 4, list(type = "drop_shadow", x = filter_x, y = filter_y, size = filter_size, color = filter_color))
/datum/component/wearertargeting/phantomthief/on_drop(datum/source, mob/user)
. = ..()
stripdesiredfilter(user)
user.remove_filter("phantomthief")
+23 -24
View File
@@ -18,6 +18,7 @@
var/ride_check_rider_incapacitated = FALSE
var/ride_check_rider_restrained = FALSE
var/ride_check_ridden_incapacitated = FALSE
var/list/offhands = list() // keyed list containing all the current riding offsets associated by mob
/datum/component/riding/Initialize()
if(!ismovableatom(parent))
@@ -299,36 +300,34 @@
M.throw_at(target, 14, 5, AM)
M.Knockdown(60)
/datum/component/riding/proc/equip_buckle_inhands(mob/living/carbon/human/user, amount_required = 1, riding_target_override = null)
var/atom/movable/AM = parent
var/amount_equipped = 0
/datum/component/riding/proc/equip_buckle_inhands(mob/living/carbon/human/user, amount_required = 1, mob/living/riding_target_override)
var/list/equipped
var/mob/living/L = riding_target_override ? riding_target_override : user
for(var/amount_needed = amount_required, amount_needed > 0, amount_needed--)
var/obj/item/riding_offhand/inhand = new /obj/item/riding_offhand(user)
if(!riding_target_override)
inhand.rider = user
else
inhand.rider = riding_target_override
inhand.parent = AM
if(user.put_in_hands(inhand, TRUE))
amount_equipped++
else
var/obj/item/riding_offhand/inhand = new
inhand.rider = L
inhand.parent = parent
if(!user.put_in_hands(inhand, TRUE))
qdel(inhand) // it isn't going to be added to offhands anyway
break
LAZYADD(equipped, src)
var/amount_equipped = LAZYLEN(equipped)
if(amount_equipped)
LAZYADD(offhands[L], amount_equipped)
if(amount_equipped >= amount_required)
return TRUE
else
unequip_buckle_inhands(user)
return FALSE
unequip_buckle_inhands(L)
return FALSE
/datum/component/riding/proc/unequip_buckle_inhands(mob/living/carbon/user)
var/atom/movable/AM = parent
for(var/obj/item/riding_offhand/O in user.contents)
if(O.parent != AM)
CRASH("RIDING OFFHAND ON WRONG MOB")
continue
if(O.selfdeleting)
continue
else
qdel(O)
for(var/a in offhands[user])
LAZYREMOVE(offhands[user], a)
if(a) //edge cases null entries
var/obj/item/riding_offhand/O = a
if(O.parent != parent)
CRASH("RIDING OFFHAND ON WRONG MOB")
else if(!O.selfdeleting)
qdel(O)
return TRUE
/obj/item/riding_offhand
+39
View File
@@ -0,0 +1,39 @@
/datum/component/shrapnel
var/projectile_type
var/radius // shoots a projectile for every turf on this radius from the hit target
var/override_projectile_range
/datum/component/shrapnel/Initialize(projectile_type, radius=1, override_projectile_range)
if(!isgun(parent) && !ismachinery(parent) && !isstructure(parent))
return COMPONENT_INCOMPATIBLE
src.projectile_type = projectile_type
src.radius = radius
src.override_projectile_range = override_projectile_range
/datum/component/shrapnel/RegisterWithParent()
if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc
RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit)
/datum/component/shrapnel/UnregisterFromParent()
UnregisterSignal(parent, list(COMSIG_PROJECTILE_ON_HIT))
/datum/component/shrapnel/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle)
do_shrapnel(firer, target)
/datum/component/shrapnel/proc/do_shrapnel(mob/firer, atom/target)
if(radius < 1)
return
var/turf/target_turf = get_turf(target)
for(var/turf/shootat_turf in RANGE_TURFS(radius, target) - RANGE_TURFS(radius-1, target))
var/obj/item/projectile/P = new projectile_type(target_turf)
//Shooting Code:
P.range = radius+1
if(override_projectile_range)
P.range = override_projectile_range
P.preparePixelProjectile(shootat_turf, target)
P.firer = firer // don't hit ourself that would be really annoying
P.permutated += target // don't hit the target we hit already with the flak
P.fire()
+69
View File
@@ -0,0 +1,69 @@
/datum/component/summoning
var/list/mob_types = list()
var/spawn_chance // chance for the mob to spawn on hit in percent
var/max_mobs
var/spawn_delay // delay in spawning between mobs (deciseconds)
var/spawn_text
var/spawn_sound
var/list/faction
var/last_spawned_time = 0
var/list/spawned_mobs = list()
/datum/component/summoning/Initialize(mob_types, spawn_chance=100, max_mobs=3, spawn_delay=100, spawn_text="appears out of nowhere", spawn_sound='sound/magic/summon_magic.ogg', faction)
if(!isitem(parent) && !ishostile(parent) && !isgun(parent) && !ismachinery(parent) && !isstructure(parent))
return COMPONENT_INCOMPATIBLE
src.mob_types = mob_types
src.spawn_chance = spawn_chance
src.max_mobs = max_mobs
src.spawn_delay = spawn_delay
src.spawn_text = spawn_text
src.spawn_sound = spawn_sound
src.faction = faction
/datum/component/summoning/RegisterWithParent()
if(ismachinery(parent) || isstructure(parent) || isgun(parent)) // turrets, etc
RegisterSignal(parent, COMSIG_PROJECTILE_ON_HIT, .proc/projectile_hit)
else if(isitem(parent))
RegisterSignal(parent, COMSIG_ITEM_AFTERATTACK, .proc/item_afterattack)
else if(ishostile(parent))
RegisterSignal(parent, COMSIG_HOSTILE_ATTACKINGTARGET, .proc/hostile_attackingtarget)
/datum/component/summoning/UnregisterFromParent()
UnregisterSignal(parent, list(COMSIG_ITEM_AFTERATTACK, COMSIG_HOSTILE_ATTACKINGTARGET, COMSIG_PROJECTILE_ON_HIT))
/datum/component/summoning/proc/item_afterattack(obj/item/source, atom/target, mob/user, proximity_flag, click_parameters)
if(!proximity_flag)
return
do_spawn_mob(get_turf(target), user)
/datum/component/summoning/proc/hostile_attackingtarget(mob/living/simple_animal/hostile/attacker, atom/target)
do_spawn_mob(get_turf(target), attacker)
/datum/component/summoning/proc/projectile_hit(atom/fired_from, atom/movable/firer, atom/target, Angle)
do_spawn_mob(get_turf(target), firer)
/datum/component/summoning/proc/do_spawn_mob(atom/spawn_location, summoner)
if(spawned_mobs.len >= max_mobs)
return 0
if(last_spawned_time > world.time)
return 0
if(!prob(spawn_chance))
return 0
last_spawned_time = world.time + spawn_delay
var/chosen_mob_type = pick(mob_types)
var/mob/living/simple_animal/L = new chosen_mob_type(spawn_location)
if(ishostile(L))
var/mob/living/simple_animal/hostile/H = L
H.friends += summoner // do not attack our summon boy
spawned_mobs += L
if(faction != null)
L.faction = faction
RegisterSignal(L, COMSIG_MOB_DEATH, .proc/on_spawned_death) // so we can remove them from the list, etc (for mobs with corpses)
playsound(spawn_location,spawn_sound, 50, 1)
spawn_location.visible_message("<span class='danger'>[L] [spawn_text].</span>")
/datum/component/summoning/proc/on_spawned_death(mob/killed, gibbed)
spawned_mobs -= killed
+42
View File
@@ -0,0 +1,42 @@
/datum/component/tactical
var/allowed_slot
/datum/component/tactical/Initialize(allowed_slot)
if(!isitem(parent))
return COMPONENT_INCOMPATIBLE
src.allowed_slot = allowed_slot
/datum/component/tactical/RegisterWithParent()
RegisterSignal(parent, COMSIG_ITEM_EQUIPPED, .proc/modify)
RegisterSignal(parent, COMSIG_ITEM_DROPPED, .proc/unmodify)
/datum/component/tactical/UnregisterFromParent()
UnregisterSignal(parent, list(COMSIG_ITEM_EQUIPPED, COMSIG_ITEM_DROPPED))
unmodify()
/datum/component/fantasy/Destroy()
unmodify()
return ..()
/datum/component/tactical/proc/modify(obj/item/source, mob/user, slot)
if(allowed_slot && slot != allowed_slot)
unmodify()
return
var/obj/item/master = parent
var/image/I = image(icon = master.icon, icon_state = master.icon_state, loc = user)
I.copy_overlays(master)
I.override = TRUE
source.add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "sneaking_mission", I)
I.layer = ABOVE_MOB_LAYER
/datum/component/tactical/proc/unmodify(obj/item/source, mob/user)
var/obj/item/master = source || parent
if(!user)
if(!ismob(master.loc))
return
user = master.loc
user.remove_alt_appearance("sneaking_mission")
@@ -79,7 +79,7 @@
if(M.getToxLoss() && prob(5))
to_chat(M, "<span class='notice'>Your skin tingles as the starlight seems to heal you.</span>")
M.adjustToxLoss(-(4 * heal_amt)) //most effective on toxins
M.adjustToxLoss(-(4 * heal_amt), forced = TRUE) //most effective on toxins
var/list/parts = M.get_damaged_bodyparts(1,1)
@@ -368,7 +368,7 @@
level = 8
passive_message = "<span class='notice'>You feel an odd attraction to plasma.</span>"
var/temp_rate = 1
threshold_desc = "<b>Transmission 6:</b> Increases temperature adjustment rate.<br>\
threshold_desc = "<b>Transmission 6:</b> Increases temperature adjustment rate and heals toxin lovers.<br>\
<b>Stage Speed 7:</b> Increases healing speed."
/datum/symptom/heal/plasma/Start(datum/disease/advance/A)
@@ -410,7 +410,7 @@
if(prob(5))
to_chat(M, "<span class='notice'>You feel warmer.</span>")
M.adjustToxLoss(-heal_amt)
M.adjustToxLoss(-heal_amt, forced = (temp_rate == 4))
var/list/parts = M.get_damaged_bodyparts(1,1)
if(!parts.len)
@@ -435,7 +435,7 @@
symptom_delay_max = 1
passive_message = "<span class='notice'>Your skin glows faintly for a moment.</span>"
var/cellular_damage = FALSE
threshold_desc = "<b>Transmission 6:</b> Additionally heals cellular damage.<br>\
threshold_desc = "<b>Transmission 6:</b> Additionally heals cellular damage and toxin lovers.<br>\
<b>Resistance 7:</b> Increases healing speed."
/datum/symptom/heal/radiation/Start(datum/disease/advance/A)
@@ -468,7 +468,7 @@
if(cellular_damage)
M.adjustCloneLoss(-heal_amt * 0.5)
M.adjustToxLoss(-(2 * heal_amt))
M.adjustToxLoss(-(2 * heal_amt), forced = cellular_damage)
var/list/parts = M.get_damaged_bodyparts(1,1)
+4
View File
@@ -111,6 +111,10 @@ GLOBAL_VAR_INIT(dynamic_forced_threat_level, -1)
..()
pop_per_requirement = CONFIG_GET(number/dynamic_pop_per_requirement)
GLOB.dynamic_high_pop_limit = CONFIG_GET(number/dynamic_high_pop_limit)
GLOB.dynamic_latejoin_delay_min = CONFIG_GET(number/dynamic_latejoin_delay_min)*600
GLOB.dynamic_latejoin_delay_max = CONFIG_GET(number/dynamic_latejoin_delay_max)*600
GLOB.dynamic_midround_delay_min = CONFIG_GET(number/dynamic_midround_delay_min)*600
GLOB.dynamic_midround_delay_max = CONFIG_GET(number/dynamic_midround_delay_max)*600
/datum/game_mode/dynamic/admin_panel()
var/list/dat = list("<html><head><title>Game Mode Panel</title></head><body><h1><B>Game Mode Panel</B></h1>")
+3 -3
View File
@@ -34,9 +34,9 @@
/obj/machinery/computer/ratvar_act()
if(!clockwork)
clockwork = TRUE
icon_screen = "ratvar[rand(1, 4)]"
icon_keyboard = "ratvar_key[rand(1, 6)]"
icon_state = "ratvarcomputer[rand(1, 4)]"
icon_screen = "ratvar[rand(1, 3)]"
icon_keyboard = "ratvar_key[rand(1, 2)]"
icon_state = "ratvarcomputer"
update_icon()
/obj/machinery/computer/narsie_act()
+2 -1
View File
@@ -86,7 +86,8 @@
/obj/item/circuitboard/computer/arcade/amputation = 2)
var/thegame = pickweight(gameodds)
var/obj/item/circuitboard/CB = new thegame()
new CB.build_path(loc, CB)
var/obj/machinery/computer/arcade/A = new CB.build_path(loc, CB)
A.setDir(dir)
return INITIALIZE_HINT_QDEL
//The below object acts as a spawner with a wide array of possible picks, most being uninspired references to past/current player characters.
//Nevertheless, this keeps its ratio constant with the sum of all the others prizes.
+6 -5
View File
@@ -24,6 +24,8 @@ Possible to do for anyone motivated enough:
* Holopad
*/
GLOBAL_LIST_EMPTY(network_holopads)
#define HOLOPAD_PASSIVE_POWER_USAGE 1
#define HOLOGRAM_POWER_USAGE 2
@@ -55,7 +57,6 @@ Possible to do for anyone motivated enough:
var/record_user //user that inititiated the recording
var/obj/effect/overlay/holo_pad_hologram/replay_holo //replay hologram
var/static/force_answer_call = FALSE //Calls will be automatically answered after a couple rings, here for debugging
var/static/list/holopads = list()
var/obj/effect/overlay/holoray/ray
var/ringing = FALSE
var/offset = FALSE
@@ -96,7 +97,7 @@ Possible to do for anyone motivated enough:
/obj/machinery/holopad/Initialize()
. = ..()
if(on_network)
holopads += src
GLOB.network_holopads += src
/obj/machinery/holopad/Destroy()
if(outgoing_call)
@@ -116,7 +117,7 @@ Possible to do for anyone motivated enough:
QDEL_NULL(disk)
holopads -= src
GLOB.network_holopads -= src
return ..()
/obj/machinery/holopad/power_change()
@@ -260,7 +261,7 @@ Possible to do for anyone motivated enough:
temp += "<A href='?src=[REF(src)];mainmenu=1'>Main Menu</A>"
if(usr.loc == loc)
var/list/callnames = list()
for(var/I in holopads)
for(var/I in GLOB.network_holopads)
var/area/A = get_area(I)
if(A)
LAZYADD(callnames[A], I)
@@ -474,7 +475,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/
var/obj/effect/overlay/holo_pad_hologram/h = masters[holo_owner]
if(!h || h.HC) //Holocalls can't change source.
return FALSE
for(var/pad in holopads)
for(var/pad in GLOB.network_holopads)
var/obj/machinery/holopad/another = pad
if(another == src)
continue
@@ -562,6 +562,7 @@
//Shooting Code:
A.preparePixelProjectile(target, T)
A.firer = src
A.fired_from = src
A.fire()
return A
-1
View File
@@ -89,7 +89,6 @@
buckled_mob.clear_alert("buckled")
buckled_mobs -= buckled_mob
SEND_SIGNAL(src, COMSIG_MOVABLE_UNBUCKLE, buckled_mob, force)
SEND_SIGNAL(src, COMSIG_MOVABLE_UNBUCKLE, src, force)
post_unbuckle_mob(.)
+1 -5
View File
@@ -97,9 +97,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
// non-clothing items
var/datum/dog_fashion/dog_fashion = null
var/datum/rpg_loot/rpg_loot = null
//Tooltip vars
var/force_string //string form of an item's force. Edit this var only to set a custom force string
var/last_force_string_check = 0
@@ -124,7 +121,7 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
actions_types = null
if(GLOB.rpg_loot_items)
rpg_loot = new(src)
AddComponent(/datum/component/fantasy)
if(force_string)
item_flags |= FORCE_STRING_OVERRIDE
@@ -149,7 +146,6 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE)
m.temporarilyRemoveItemFromInventory(src, TRUE)
for(var/X in actions)
qdel(X)
QDEL_NULL(rpg_loot)
return ..()
/obj/item/proc/check_allowed_items(atom/target, not_inside, target_self)
+103 -146
View File
@@ -6,8 +6,7 @@
icon = 'icons/mob/dogborg.dmi'
icon_state = "sleeper"
w_class = WEIGHT_CLASS_TINY
var/mob/living/carbon/patient = null
var/mob/living/silicon/robot/hound = null
var/mob/living/carbon/patient
var/inject_amount = 10
var/min_health = -100
var/cleaning = FALSE
@@ -61,8 +60,18 @@
/obj/item/dogborg/sleeper/Exit(atom/movable/O)
return 0
/obj/item/dogborg/sleeper/proc/get_host()
if(!loc)
return
if(iscyborg(loc))
return loc
else if(iscyborg(loc.loc))
return loc.loc //cursed cyborg code
/obj/item/dogborg/sleeper/afterattack(mob/living/carbon/target, mob/living/silicon/user, proximity)
hound = loc
var/mob/living/silicon/robot/hound = get_host()
if(!hound)
return
if(!proximity)
return
if(!iscarbon(target))
@@ -82,7 +91,8 @@
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't eat them.
if(patient) return //If you try to eat two people at once, you can only eat one.
if(patient)
return //If you try to eat two people at once, you can only eat one.
else //If you don't have someone in you, proceed.
if(!isjellyperson(target) && ("toxin" in injection_chems))
@@ -94,14 +104,17 @@
target.forceMove(src)
target.reset_perspective(src)
target.ExtinguishMob() //The tongue already puts out fire stacks but being put into the sleeper shouldn't allow you to keep burning.
update_gut()
update_gut(hound)
user.visible_message("<span class='warning'>[voracious ? "[hound]'s [src.name] lights up and expands as [target] slips inside into their [src.name]." : "[hound]'s sleeper indicator lights up as [target] is scooped up into [hound.p_their()] [src]."]</span>", \
"<span class='notice'>Your [voracious ? "[src.name] lights up as [target] slips into" : "sleeper indicator light shines brightly as [target] is scooped inside"] your [src]. Life support functions engaged.</span>")
message_admins("[key_name(hound)] has sleeper'd [key_name(patient)] as a dogborg. [ADMIN_JMP(src)]")
playsound(hound, 'sound/effects/bin_close.ogg', 100, 1)
/obj/item/dogborg/sleeper/container_resist(mob/living/user)
hound = loc
var/mob/living/silicon/robot/hound = get_host()
if(!hound)
go_out(user)
return
user.changeNext_move(CLICK_CD_BREAKOUT)
user.last_special = world.time + CLICK_CD_BREAKOUT
if(user.a_intent == INTENT_HELP)
@@ -113,55 +126,41 @@
"<span class='notice'>[voracious ? "You start struggling inside of [src]'s tight, flexible confines," : "You start pounding against the metallic walls of [src],"] trying to trigger the release... (this will take about [DisplayTimeText(breakout_time)].)</span>", \
"<span class='italics'>You hear a [voracious ? "couple of thumps" : "loud banging noise"] coming from within [hound].</span>")
if(do_after(user, breakout_time, target = src))
if(!user || user.stat != CONSCIOUS || user.loc != src )
return
user.visible_message("<span class='warning'>[user] successfully broke out of [hound.name]!</span>", \
"<span class='notice'>You successfully break out of [hound.name]!</span>")
go_out()
go_out(user, hound)
/obj/item/dogborg/sleeper/proc/go_out(var/target)
hound = loc
hound.setClickCooldown(50)
var/voracious = TRUE
if(!hound.client || !(hound.client.prefs.cit_toggles & MEDIHOUND_SLEEPER))
voracious = FALSE
else
for(var/mob/M in contents)
if(!M.client || !(M.client.prefs.cit_toggles & MEDIHOUND_SLEEPER))
voracious = FALSE
if(length(contents) > 0)
hound.visible_message("<span class='warning'>[voracious ? "[hound] empties out [hound.p_their()] contents via [hound.p_their()] release port." : "[hound]'s underside slides open with an audible clunk before [hound.p_their()] [src] flips over, carelessly dumping its contents onto the ground below [hound.p_them()] before closing right back up again."]</span>", \
"<span class='notice'>[voracious ? "You empty your contents via your release port." : "You open your sleeper hatch, quickly releasing all of the contents within before closing it again."]</span>")
if(target)
if(iscarbon(target))
var/mob/living/carbon/person = target
person.forceMove(get_turf(src))
person.reset_perspective()
else
var/obj/T = target
T.loc = hound.loc
/obj/item/dogborg/sleeper/proc/go_out(atom/movable/target, mob/living/silicon/robot/hound)
var/voracious = hound ? TRUE : FALSE
var/list/targets = target && hound ? list(target) : contents
if(hound)
hound.setClickCooldown(50)
if(!hound.client || !(hound.client.prefs.cit_toggles & MEDIHOUND_SLEEPER))
voracious = FALSE
else
for(var/C in contents)
if(iscarbon(C))
var/mob/living/carbon/person = C
person.forceMove(get_turf(src))
person.reset_perspective()
else
var/obj/T = C
T.loc = hound.loc
items_preserved.Cut()
update_gut()
cleaning = FALSE
for(var/mob/M in targets)
if(!M.client || !(M.client.prefs.cit_toggles & MEDIHOUND_SLEEPER))
voracious = FALSE
if(length(targets))
if(hound)
hound.visible_message("<span class='warning'>[voracious ? "[hound] empties out [hound.p_their()] contents via [hound.p_their()] release port." : "[hound]'s underside slides open with an audible clunk before [hound.p_their()] [src] flips over, carelessly dumping its contents onto the ground below [hound.p_them()] before closing right back up again."]</span>", \
"<span class='notice'>[voracious ? "You empty your contents via your release port." : "You open your sleeper hatch, quickly releasing all of the contents within before closing it again."]</span>")
for(var/a in contents)
var/atom/movable/AM = a
AM.forceMove(get_turf(src))
if(ismob(AM))
var/mob/M = AM
M.reset_perspective()
playsound(loc, voracious ? 'sound/effects/splat.ogg' : 'sound/effects/bin_close.ogg', 50, 1)
else //You clicked eject with nothing in you, let's just reset stuff to be sure.
items_preserved.Cut()
cleaning = FALSE
update_gut()
items_preserved.Cut()
cleaning = FALSE
if(hound)
update_gut(hound)
/obj/item/dogborg/sleeper/attack_self(mob/user)
if(..())
. = ..()
if(. || !iscyborg(user))
return
ui_interact(user)
@@ -219,30 +218,31 @@
return data
/obj/item/dogborg/sleeper/ui_act(action, params)
if(..())
. = ..()
if(. || !iscyborg(usr))
return
switch(action)
if("eject")
go_out()
go_out(null, usr)
. = TRUE
if("inject")
var/chem = params["chem"]
if(!patient)
return
inject_chem(chem)
inject_chem(chem, usr)
. = TRUE
if("cleaning")
if(!contents)
to_chat(src, "Your [src] is already cleaned.")
return
if(patient)
to_chat(patient, "<span class='danger'>[hound.name]'s [src] fills with caustic enzymes around you!</span>")
to_chat(patient, "<span class='danger'>[usr.name]'s [src] fills with caustic enzymes around you!</span>")
to_chat(src, "<span class='danger'>Cleaning process enabled.</span>")
clean_cycle()
clean_cycle(usr)
. = TRUE
/obj/item/dogborg/sleeper/proc/update_gut()
/obj/item/dogborg/sleeper/proc/update_gut(mob/living/silicon/robot/hound)
//Well, we HAD one, what happened to them?
var/prociconupdate = FALSE
var/currentenvy = hound.sleeper_nv
@@ -291,7 +291,7 @@
//Update icon and return new patient
hound.update_icons()
return(C)
return
//Cleaning looks better with red on, even with nobody in it
if(cleaning && !patient)
@@ -307,8 +307,10 @@
hound.update_icons()
//Gurgleborg process
/obj/item/dogborg/sleeper/proc/clean_cycle()
/obj/item/dogborg/sleeper/proc/clean_cycle(mob/living/silicon/robot/hound)
//Sanity
if(!hound)
return
for(var/I in items_preserved)
if(!(I in contents))
items_preserved -= I
@@ -320,13 +322,12 @@
if(cleaning_cycles)
cleaning_cycles--
cleaning = TRUE
for(var/mob/living/carbon/human/T in (touchable_items))
if((T.status_flags & GODMODE) || !T.digestable)
items_preserved += T
for(var/mob/living/carbon/C in (touchable_items))
if((C.status_flags & GODMODE) || !C.digestable)
items_preserved += C
else
T.adjustBruteLoss(2)
T.adjustFireLoss(3)
update_gut()
C.adjustBruteLoss(2)
C.adjustFireLoss(3)
if(contents)
var/atom/target = pick(touchable_items)
if(iscarbon(target)) //Handle the target being a mob
@@ -359,7 +360,6 @@
if(!T.dropItemToGround(W))
qdel(W)
qdel(T)
update_gut()
//Handle the target being anything but a mob
else if(isobj(target))
var/obj/T = target
@@ -374,12 +374,10 @@
cleaning_cycles = initial(cleaning_cycles)
cleaning = FALSE
to_chat(hound, "<span class='notice'>Your [src] chimes it ends its self-cleaning cycle.</span>")//Belly is entirely empty
update_gut()
if(!length(contents))
to_chat(hound, "<span class='notice'>Your [src] is now clean. Ending self-cleaning cycle.</span>")
cleaning = FALSE
update_gut()
//sound effects
if(prob(50))
@@ -397,13 +395,17 @@
else if(H in contents)
H.playsound_local(source, null, 65, falloff = 0, S = prey_digest)
update_gut(hound)
if(cleaning)
addtimer(CALLBACK(src, .proc/clean_cycle), 50)
addtimer(CALLBACK(src, .proc/clean_cycle, hound), 50)
/obj/item/dogborg/sleeper/proc/CheckAccepted(obj/item/I)
return is_type_in_typecache(I, important_items)
/obj/item/dogborg/sleeper/proc/inject_chem(chem)
/obj/item/dogborg/sleeper/proc/inject_chem(chem, mob/living/silicon/robot/hound)
if(!hound)
return
if(hound.cell.charge <= 800) //This is so borgs don't kill themselves with it. Remember, 750 charge used every injection.
to_chat(hound, "<span class='notice'>You don't have enough power to synthesize fluids.</span>")
return
@@ -438,40 +440,27 @@
else
. = ..()
/obj/item/dogborg/sleeper/K9/afterattack(var/atom/movable/target, mob/living/silicon/user, proximity)
hound = loc
/obj/item/dogborg/sleeper/K9/afterattack(mob/living/carbon/target, mob/living/silicon/user, proximity)
var/mob/living/silicon/robot/hound = get_host()
if(!hound || !istype(target) || !proximity || target.anchored)
return
if (!target.devourable)
to_chat(user, "The target registers an error code. Unable to insert into [src].")
return
if(target)
to_chat(user,"<span class='warning'>Your [src] is already occupied.</span>")
return
if(target.buckled)
to_chat(user,"<span class='warning'>[target] is buckled and can not be put into your [src].</span>")
return
user.visible_message("<span class='warning'>[hound.name] is ingesting [target] into their [src].</span>", "<span class='notice'>You start ingesting [target] into your [src.name]...</span>")
if(do_after(user, 30, target = target) && !patient && !target.buckled)
target.forceMove(src)
target.reset_perspective(src)
update_gut(hound)
user.visible_message("<span class='warning'>[hound.name]'s mobile brig clunks in series as [target] slips inside.</span>", "<span class='notice'>Your mobile brig groans lightly as [target] slips inside.</span>")
playsound(hound, 'sound/effects/bin_close.ogg', 80, 1) // Really don't need ERP sound effects for robots
if(!istype(target))
return
if(!proximity)
return
if(target.anchored)
return
if(isobj(target))
to_chat(user, "You are above putting such trash inside of yourself.")
return
if(iscarbon(target))
var/mob/living/carbon/brigman = target
if (!brigman.devourable)
to_chat(user, "The target registers an error code. Unable to insert into [src].")
return
if(patient)
to_chat(user,"<span class='warning'>Your [src] is already occupied.</span>")
return
if(brigman.buckled)
to_chat(user,"<span class='warning'>[brigman] is buckled and can not be put into your [src].</span>")
return
user.visible_message("<span class='warning'>[hound.name] is ingesting [brigman] into their [src].</span>", "<span class='notice'>You start ingesting [brigman] into your [src.name]...</span>")
if(do_after(user, 30, target = brigman) && !patient && !brigman.buckled)
if(!in_range(src, brigman)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't eat them.
brigman.forceMove(src)
brigman.reset_perspective(src)
update_gut()
user.visible_message("<span class='warning'>[hound.name]'s mobile brig clunks in series as [brigman] slips inside.</span>", "<span class='notice'>Your mobile brig groans lightly as [brigman] slips inside.</span>")
playsound(hound, 'sound/effects/bin_close.ogg', 80, 1) // Really don't need ERP sound effects for robots
return
return
/obj/item/dogborg/sleeper/compactor //Janihound gut.
name = "garbage processor"
@@ -489,31 +478,25 @@
else
. = ..()
/obj/item/dogborg/sleeper/compactor/afterattack(var/atom/movable/target, mob/living/silicon/user, proximity)//GARBO NOMS
hound = loc
var/obj/item/target_obj = target
if(!istype(target))
return
if(!proximity)
return
if(target.anchored)
/obj/item/dogborg/sleeper/compactor/afterattack(atom/movable/target, mob/living/silicon/user, proximity)//GARBO NOMS
var/mob/living/silicon/robot/hound = get_host()
if(!hound || !istype(target) || !proximity || target.anchored)
return
if(length(contents) > (max_item_count - 1))
to_chat(user,"<span class='warning'>Your [src] is full. Eject or process contents to continue.</span>")
return
if(isobj(target))
if(CheckAccepted(target))
to_chat(user,"<span class='warning'>\The [target] registers an error code to your [src]</span>")
if(isitem(target))
var/obj/item/I = target
if(CheckAccepted(I))
to_chat(user,"<span class='warning'>[I] registers an error code to your [src]</span>")
return
if(target_obj.w_class > WEIGHT_CLASS_NORMAL)
to_chat(user,"<span class='warning'>\The [target] is too large to fit into your [src]</span>")
if(I.w_class > WEIGHT_CLASS_NORMAL)
to_chat(user,"<span class='warning'>[I] is too large to fit into your [src]</span>")
return
user.visible_message("<span class='warning'>[hound.name] is ingesting [target.name] into their [src.name].</span>", "<span class='notice'>You start ingesting [target] into your [src.name]...</span>")
user.visible_message("<span class='warning'>[hound.name] is ingesting [I] into their [src.name].</span>", "<span class='notice'>You start ingesting [target] into your [src.name]...</span>")
if(do_after(user, 15, target = target) && length(contents) < max_item_count)
if(!in_range(src, target)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't eat them. This still applies to items, don't magically eat things I picked up already.
target.forceMove(src)
user.visible_message("<span class='warning'>[hound.name]'s garbage processor groans lightly as [target.name] slips inside.</span>", "<span class='notice'>Your garbage compactor groans lightly as [target] slips inside.</span>")
I.forceMove(src)
I.visible_message("<span class='warning'>[hound.name]'s garbage processor groans lightly as [I] slips inside.</span>", "<span class='notice'>Your garbage compactor groans lightly as [I] slips inside.</span>")
playsound(hound, 'sound/machines/disposalflush.ogg', 50, 1)
if(length(contents) > 11) //grow that tum after a certain junk amount
hound.sleeper_r = 1
@@ -523,9 +506,9 @@
hound.update_icons()
return
else if(iscarbon(target))
var/mob/living/carbon/trashman = target
if (!trashman.devourable)
if(iscarbon(target) || issilicon(target))
var/mob/living/trashman = target
if(!trashman.devourable)
to_chat(user, "<span class='warning'>[target] registers an error code to your [src]</span>")
return
if(patient)
@@ -536,34 +519,8 @@
return
user.visible_message("<span class='warning'>[hound.name] is ingesting [trashman] into their [src].</span>", "<span class='notice'>You start ingesting [trashman] into your [src.name]...</span>")
if(do_after(user, 30, target = trashman) && !patient && !trashman.buckled && length(contents) < max_item_count)
if(!in_range(src, trashman)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't eat them.
trashman.forceMove(src)
trashman.reset_perspective(src)
update_gut()
user.visible_message("<span class='warning'>[hound.name]'s garbage processor groans lightly as [trashman] slips inside.</span>", "<span class='notice'>Your garbage compactor groans lightly as [trashman] slips inside.</span>")
playsound(hound, 'sound/effects/bin_close.ogg', 80, 1)
return
else if(issilicon(target))
var/mob/living/silicon/trashbot = target
if (!trashbot.devourable)
to_chat(user, "<span class='warning'>[target] registers an error code to your [src]</span>")
return
if(patient)
to_chat(user,"<span class='warning'>Your [src] is already occupied.</span>")
return
if(trashbot.buckled)
to_chat(user,"<span class='warning'>[trashbot] is buckled and can not be put into your [src].</span>")
return
user.visible_message("<span class='warning'>[hound.name] is ingesting [trashbot] into their [src].</span>", "<span class='notice'>You start ingesting [trashbot] into your [src.name]...</span>")
if(do_after(user, 30, target = trashbot) && !patient && !trashbot.buckled && length(contents) < max_item_count)
if(!in_range(src, trashbot)) //Proximity is probably old news by now, do a new check.
return //If they moved away, you can't eat them.
trashbot.forceMove(src)
trashbot.reset_perspective(src)
update_gut()
user.visible_message("<span class='warning'>[hound.name]'s garbage processor groans lightly as [trashbot] slips inside.</span>", "<span class='notice'>Your garbage compactor groans lightly as [trashbot] slips inside.</span>")
playsound(hound, 'sound/effects/bin_close.ogg', 80, 1)
return
return
@@ -12,7 +12,7 @@
/obj/item/implant/storage/removed(source, silent = FALSE, special = 0)
if(!special)
qdel(pocket)
QDEL_NULL(pocket)
else
pocket?.moveToNullspace()
return ..()
@@ -29,7 +29,7 @@
return FALSE
. = ..()
if(.)
if(pocket)
if(!QDELETED(pocket))
pocket.forceMove(target)
else
pocket = new(target)
@@ -41,7 +41,6 @@
desc = "A tiny yet spacious pocket, usually found implanted inside sneaky syndicate agents and nowhere else."
component_type = /datum/component/storage/concrete/implant
resistance_flags = INDESTRUCTIBLE //A bomb!
item_flags = DROPDEL
/obj/item/implanter/storage
name = "implanter (storage)"
+2 -2
View File
@@ -430,7 +430,7 @@
A.BB.nodamage = FALSE
A.BB.speed = 0.5
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
A.fire_casing(target, user, params, 0, 0, null, 0)
A.fire_casing(target, user, params, 0, 0, null, 0, src)
user.visible_message("<span class='warning'>[user] blasts a flying lollipop at [target]!</span>")
check_amount()
@@ -446,7 +446,7 @@
A.BB.speed = 0.5
A.BB.color = rgb(rand(0, 255), rand(0, 255), rand(0, 255))
playsound(src.loc, 'sound/weapons/bulletflyby3.ogg', 50, 1)
A.fire_casing(target, user, params, 0, 0, null, 0)
A.fire_casing(target, user, params, 0, 0, null, 0, src)
user.visible_message("<span class='warning'>[user] shoots a high-velocity gumball at [target]!</span>")
check_amount()
+3 -12
View File
@@ -300,18 +300,9 @@
throw_speed = 2
throw_range = 4
/obj/item/twohanded/required/kirbyplants/equipped(mob/living/user)
var/image/I = image(icon = 'icons/obj/flora/plants.dmi' , icon_state = src.icon_state, loc = user)
I.copy_overlays(src)
I.override = 1
add_alt_appearance(/datum/atom_hud/alternate_appearance/basic/everyone, "sneaking_mission", I)
I.layer = ABOVE_MOB_LAYER
..()
/obj/item/twohanded/required/kirbyplants/dropped(mob/living/user)
..()
user.remove_alt_appearance("sneaking_mission")
/obj/item/twohanded/required/kirbyplants/Initialize()
. = ..()
AddComponent(/datum/component/tactical)
/obj/item/twohanded/required/kirbyplants/random
icon = 'icons/obj/flora/_flora.dmi'
-14
View File
@@ -82,13 +82,6 @@
item_state = "nr_helmet"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
/obj/item/clothing/head/stalhelm
name = "Stalhelm"
desc = "Ein Helm, um die Nazi-Interesse an fremden Raumstationen zu sichern."
icon_state = "stalhelm"
item_state = "stalhelm"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
/obj/item/clothing/head/panzer
name = "Panzer Cap"
desc = "Command any mech in style."
@@ -96,13 +89,6 @@
item_state = "panzercap"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
/obj/item/clothing/head/naziofficer
name = "Officer Cap"
desc = "Style is all that matters."
icon_state = "officercap"
item_state = "officercap"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
/obj/item/clothing/head/russobluecamohat
name = "russian blue camo beret"
desc = "A symbol of discipline, honor, and lots and lots of removal of some type of skewered food."
@@ -1,24 +1,5 @@
//VG Ports
/obj/item/clothing/head/helmet/space/hardsuit/nazi
name = "nazi hardhelmet"
desc = "This is the face of das vaterland's top elite. Gas or energy are your only escapes."
item_state = "hardsuit0-nazi"
icon_state = "hardsuit0-nazi"
armor = list(melee = 40, bullet = 30, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 20)
item_color = "nazi"
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
/obj/item/clothing/suit/space/hardsuit/nazi
name = "nazi hardsuit"
desc = "The attire of a true krieger. All shall fall, and only das vaterland will remain."
item_state = "hardsuit-nazi"
icon_state = "hardsuit-nazi"
slowdown = 1
armor = list(melee = 40, bullet = 30, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 20)
allowed = list(/obj/item/gun,/obj/item/flashlight,/obj/item/tank,/obj/item/melee/)
helmettype = /obj/item/clothing/head/helmet/space/hardsuit/nazi
icon = 'modular_citadel/icons/obj/clothing/vg_clothes.dmi'
/obj/item/clothing/head/helmet/space/hardsuit/soviet
name = "soviet hardhelmet"
+9 -72
View File
@@ -8,8 +8,11 @@
/datum/round_event/wizard/rpgloot/start()
var/upgrade_scroll_chance = 0
for(var/obj/item/I in world)
if(!istype(I.rpg_loot))
I.rpg_loot = new(I)
CHECK_TICK
if(!(I.flags_1 & INITIALIZED_1))
continue
I.AddComponent(/datum/component/fantasy)
if(istype(I, /obj/item/storage))
var/obj/item/storage/S = I
@@ -31,86 +34,20 @@
var/upgrade_amount = 1
var/can_backfire = TRUE
var/one_use = TRUE
var/uses = 1
/obj/item/upgradescroll/afterattack(obj/item/target, mob/user , proximity)
. = ..()
if(!proximity || !istype(target))
return
var/datum/rpg_loot/rpg_loot_datum = target.rpg_loot
if(!istype(rpg_loot_datum))
target.rpg_loot = rpg_loot_datum = new /datum/rpg_loot(target)
target.AddComponent(/datum/component/fantasy, upgrade_amount, null, null, can_backfire, TRUE)
var/quality = rpg_loot_datum.quality
if(can_backfire && (quality > 9 && prob((quality - 9)*10)))
to_chat(user, "<span class='danger'>[target] violently glows blue for a while, then evaporates.</span>")
target.burn()
else
to_chat(user, "<span class='notice'>[target] glows blue and seems vaguely \"better\"!</span>")
rpg_loot_datum.modify(upgrade_amount)
if(one_use)
if(--uses <= 0)
qdel(src)
/obj/item/upgradescroll/unlimited
name = "unlimited foolproof item fortification scroll"
desc = "Somehow, this piece of paper can be applied to items to make them \"better\". This scroll is made from the tongues of dead paper wizards, and can be used an unlimited number of times, with no drawbacks."
one_use = FALSE
uses = INFINITY
can_backfire = FALSE
/datum/rpg_loot
var/positive_prefix = "okay"
var/negative_prefix = "weak"
var/suffix = "something profound"
var/quality = 0
var/obj/item/attached
var/original_name
/datum/rpg_loot/New(attached_item=null)
attached = attached_item
randomise()
/datum/rpg_loot/Destroy()
attached = null
/datum/rpg_loot/proc/randomise()
var/static/list/prefixespositive = list("greater", "major", "blessed", "superior", "empowered", "honed", "true", "glorious", "robust")
var/static/list/prefixesnegative = list("lesser", "minor", "blighted", "inferior", "enfeebled", "rusted", "unsteady", "tragic", "gimped")
var/static/list/suffixes = list("orc slaying", "elf slaying", "corgi slaying", "strength", "dexterity", "constitution", "intelligence", "wisdom", "charisma", "the forest", "the hills", "the plains", "the sea", "the sun", "the moon", "the void", "the world", "the fool", "many secrets", "many tales", "many colors", "rending", "sundering", "the night", "the day")
var/new_quality = pick(1;15, 2;14, 2;13, 2;12, 3;11, 3;10, 3;9, 4;8, 4;7, 4;6, 5;5, 5;4, 5;3, 6;2, 6;1, 6;0)
suffix = pick(suffixes)
positive_prefix = pick(prefixespositive)
negative_prefix = pick(prefixesnegative)
if(prob(50))
new_quality = -new_quality
modify(new_quality)
/datum/rpg_loot/proc/rename()
var/obj/item/I = attached
if(!original_name)
original_name = I.name
if(quality < 0)
I.name = "[negative_prefix] [original_name] of [suffix] [quality]"
else if(quality == 0)
I.name = "[original_name] of [suffix]"
else if(quality > 0)
I.name = "[positive_prefix] [original_name] of [suffix] +[quality]"
/datum/rpg_loot/proc/modify(quality_mod)
var/obj/item/I = attached
quality += quality_mod
I.force = max(0,I.force + quality_mod)
I.throwforce = max(0,I.throwforce + quality_mod)
I.armor = I.armor.modifyAllRatings(quality)
rename()
+19 -30
View File
@@ -95,45 +95,34 @@
last_poof = world.realtime
var/datum/reagents/R = new/datum/reagents(100)//Hey, just in case.
var/datum/effect_system/smoke_spread/chem/s = new()
R.add_reagent("secretcatchem", (10))
R.add_reagent("secretcatchem", 10)
s.set_up(R, 0, loc)
s.start()
visible_message("<b>[src]</b> disappears in a puff of smoke!")
canmove = TRUE
health = 25
var/hp_list = list()
for(var/obj/machinery/holopad/hp in world)
hp_list += hp
//Try to go to populated areas
var/list/pop_areas = list()
for(var/mob/living/L in GLOB.player_list)
var/area/A = get_area(L)
pop_areas += A
var/nono_areas = list("AI ")
for(var/i = 0, i <= 6, i+=1) //Attempts a jump 6 times.
var/obj/machinery/holopad/hp = pick(hp_list)
if(forceMove(pick(hp.loc)))
var/jacq_please_no = FALSE
for(var/no_area in nono_areas)
var/turf/L1 = hp.loc
if(!L1) //Incase the area isn't a turf (i.e. in a locker)
continue
var/area/L2 = L1.loc
if(L2)
if(findtext(L2.name, no_area))
jacq_please_no = TRUE
if(jacq_please_no)
i-=1
continue
//Try to go to populated areas
var/list/seen = viewers(8, get_turf(src))
for(var/victim in seen)
if(ishuman(victim))
if(z == cached_z)
return TRUE
var/list/targets = list()
for(var/H in GLOB.network_holopads)
var/area/A = get_area(H)
if(findtextEx(A, "AI") || !(A in pop_areas) || !is_station_level(H))
continue
targets += H
if(!targets)
targets = GLOB.generic_event_spawns
for(var/i in 1 to 6) //Attempts a jump up to 6 times.
var/atom/A = pick(targets)
if(do_teleport(src, A, channel = TELEPORT_CHANNEL_MAGIC))
return TRUE
targets -= A
return FALSE
/mob/living/simple_animal/jacq/proc/gender_check(mob/living/carbon/C)
@@ -66,7 +66,7 @@
playsound(C, pick(spooks), 50, TRUE, 10)
//Congrats you somehow died so hard you stopped being a zombie
/datum/species/zombie/infectious/spec_death(mob/living/carbon/C)
/datum/species/zombie/infectious/spec_death(gibbed, mob/living/carbon/C)
. = ..()
var/obj/item/organ/zombie_infection/infection
infection = C.getorganslot(ORGAN_SLOT_ZOMBIE)
+1 -1
View File
@@ -98,7 +98,7 @@
var/datum/gas_mixture/breath
if(!getorganslot(ORGAN_SLOT_BREATHING_TUBE))
if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL) || lungs.organ_flags & ORGAN_FAILING)
if(health <= HEALTH_THRESHOLD_FULLCRIT || (pulledby && pulledby.grab_state >= GRAB_KILL) || !lungs || lungs.organ_flags & ORGAN_FAILING)
losebreath++ //You can't breath at all when in critical or when being choked, so you're going to miss a breath
else if(health <= crit_threshold)
@@ -2,7 +2,7 @@
#define GORILLA_TOTAL_LAYERS 1
/mob/living/simple_animal/hostile/gorilla
name = "Gorilla"
name = "gorilla"
desc = "A ground-dwelling, predominantly herbivorous ape that inhabits the forests of central Africa."
icon = 'icons/mob/gorilla.dmi'
icon_state = "crawling"
@@ -108,3 +108,10 @@
playsound(src, 'sound/creatures/gorilla.ogg', 200)
oogas = 0
/mob/living/simple_animal/hostile/gorilla/familiar
name = "familiar gorilla"
desc = "There is no need to be upset."
unique_name = FALSE
AIStatus = AI_OFF
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
@@ -344,6 +344,7 @@
/mob/living/simple_animal/hostile/proc/AttackingTarget()
SEND_SIGNAL(src, COMSIG_HOSTILE_ATTACKINGTARGET, target)
in_melee = TRUE
if(vore_active)
if(isliving(target))
@@ -426,12 +427,13 @@
if(casingtype)
var/obj/item/ammo_casing/casing = new casingtype(startloc)
playsound(src, projectilesound, 100, 1)
casing.fire_casing(targeted_atom, src, null, null, null, ran_zone())
casing.fire_casing(targeted_atom, src, null, null, null, ran_zone(), src)
else if(projectiletype)
var/obj/item/projectile/P = new projectiletype(startloc)
playsound(src, projectilesound, 100, 1)
P.starting = startloc
P.firer = src
P.fired_from = src
P.yo = targeted_atom.y - startloc.y
P.xo = targeted_atom.x - startloc.x
if(AIStatus != AI_ON)//Don't want mindless mobs to have their movement screwed up firing in space
@@ -199,6 +199,7 @@
if(prob(35))
sparks.start()
P.firer = user ? user : src
P.fired_from = src
if(last_projectile_params)
P.p_x = last_projectile_params[2]
P.p_y = last_projectile_params[3]
@@ -1,8 +1,8 @@
/obj/item/ammo_casing/proc/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread)
/obj/item/ammo_casing/proc/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from)
distro += variance
for (var/i = max(1, pellets), i > 0, i--)
var/targloc = get_turf(target)
ready_proj(target, user, quiet, zone_override)
ready_proj(target, user, quiet, zone_override, fired_from)
if(distro) //We have to spread a pixel-precision bullet. throw_proj was called before so angles should exist by now...
if(randomspread)
spread = round((rand() - 0.5) * distro)
@@ -20,11 +20,12 @@
update_icon()
return 1
/obj/item/ammo_casing/proc/ready_proj(atom/target, mob/living/user, quiet, zone_override = "")
/obj/item/ammo_casing/proc/ready_proj(atom/target, mob/living/user, quiet, zone_override = "", fired_from)
if (!BB)
return
BB.original = target
BB.firer = user
BB.fired_from = fired_from
if (zone_override)
BB.def_zone = zone_override
else
@@ -3,7 +3,7 @@
firing_effect_type = null
heavy_metal = FALSE
/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread)
/obj/item/ammo_casing/caseless/fire_casing(atom/target, mob/living/user, params, distro, quiet, zone_override, spread, atom/fired_from)
if (..()) //successfully firing
moveToNullspace()
QDEL_NULL(src)
+2 -2
View File
@@ -233,7 +233,7 @@
else //Smart spread
sprd = round((((rand_spr/burst_size) * iteration) - (0.5 + (rand_spr * 0.25))) * (randomized_gun_spread + randomized_bonus_spread), 1)
if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd))
if(!chambered.fire_casing(target, user, params, ,suppressed, zone_override, sprd, src))
shoot_with_empty_chamber(user)
firing_burst = FALSE
return FALSE
@@ -280,7 +280,7 @@
to_chat(user, "<span class='notice'> [src] is lethally chambered! You don't want to risk harming anyone...</span>")
return
sprd = round((rand() - 0.5) * DUALWIELD_PENALTY_EXTRA_MULTIPLIER * (randomized_gun_spread + randomized_bonus_spread))
if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd))
if(!chambered.fire_casing(target, user, params, , suppressed, zone_override, sprd, src))
shoot_with_empty_chamber(user)
return
else
@@ -331,9 +331,9 @@
uninstall(KA)
/obj/item/borg/upgrade/modkit/proc/uninstall(obj/item/gun/energy/kinetic_accelerator/KA, forcemove = TRUE)
KA.modkits -= src
if(forcemove)
forceMove(get_turf(KA))
KA.modkits -= src
/obj/item/borg/upgrade/modkit/proc/modify_projectile(obj/item/projectile/kinetic/K)
+5
View File
@@ -17,6 +17,7 @@
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/suppressed = FALSE //Attack message
var/candink = FALSE //Can this projectile play the dink sound when hitting the head?
var/yo = null
@@ -131,6 +132,8 @@
return TRUE
/obj/item/projectile/proc/on_hit(atom/target, blocked = FALSE)
if(fired_from)
SEND_SIGNAL(fired_from, COMSIG_PROJECTILE_ON_HIT, firer, target, Angle)
var/turf/target_loca = get_turf(target)
var/hitx
@@ -356,6 +359,8 @@
pixel_move(1, FALSE)
/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!
if(!log_override && firer && original)
log_combat(firer, original, "fired at", src, "from [get_area_name(src, TRUE)]")
+1 -1
View File
@@ -338,7 +338,7 @@
/obj/item/organ/eyes/robotic/glow/proc/start_visuals()
if(!islist(eye_lighting))
regenerate_light_effects()
if((eye_lighting.len < light_beam_distance) || !on_mob)
if((LAZYLEN(eye_lighting) < light_beam_distance) || !on_mob)
regenerate_light_effects()
sync_light_effects()
update_visuals()
+1 -1
View File
@@ -92,7 +92,7 @@
return TRUE
if(iscyborg(user) && user.a_intent != INTENT_HARM) //to save asimov borgs a LOT of heartache
return TRUE
if(tool.item_flags & SURGICAL_TOOL) //Just because you used the wrong tool it doesn't mean you meant to whack the patient with it
if(tool && tool.item_flags & SURGICAL_TOOL) //Just because you used the wrong tool it doesn't mean you meant to whack the patient with it
to_chat(user, "<span class='warning'>This step requires a different tool!</span>")
return TRUE
+1 -1
View File
@@ -158,7 +158,7 @@
/obj/belly/Destroy()
SSbellies.belly_list -= src
if(owner)
if(owner?.vore_organs)
owner.vore_organs -= src
owner = null
. = ..()
+6
View File
@@ -258,6 +258,12 @@ EVENTS_MIN_PLAYERS_MUL 1
### DYNAMIC MODE ###
## Injection delays: how long (in minutes) will pass before a midround or latejoin antag is injected.
DYNAMIC_MIDROUND_DELAY_MIN 15
DYNAMIC_MIDROUND_DELAY_MAX 35
DYNAMIC_LATEJOIN_DELAY_MIN 5
DYNAMIC_LATEJOIN_DELAY_MAX 25
## How many roundstart players required for high population override to take effect.
DYNAMIC_HIGH_POP_LIMIT 55
@@ -0,0 +1,4 @@
author: "Putnam3145"
delete-after: True
changes:
- config: "Added dynamic midround/latejoin antag injection to the config."
@@ -0,0 +1,4 @@
author: "Ghommie"
delete-after: True
changes:
- bugfix: "Fixed dogborg sleepers. Just don't tell me what is exactly fixed, cause I don't want to find out."
@@ -0,0 +1,4 @@
author: "Ghommie"
delete-after: True
changes:
- bugfix: "Buffed the deep space familiar gorilla against runtimes."
@@ -0,0 +1,5 @@
author: "Putnam3145"
delete-after: True
changes:
- balance: "Made starlight condensation not kill slime people."
- balance: "Added not-killing-slime-people to the transmission threshold of plasma fixation and radioactive resonance."
@@ -0,0 +1,4 @@
author: "Ghommie"
delete-after: True
changes:
- imageadd: "Updated ratvarian computer sprites."
@@ -0,0 +1,4 @@
author: "PersianXerxes"
delete-after: True
changes:
- tweak: "Relocates cult catwalks outside the Reebe dressing room."
@@ -0,0 +1,5 @@
author: "ninjanomnom and WhoneedSpacee"
delete-after: True
changes:
- rscadd: "Some rpg affixes now have special effects"
- rscadd: "New RPGLoot modifiers: Vampirism which heals you when you attack, Pyromantic which sets things you hit on fire. Shrapnel which causes projectiles fired from a gun to fire projectiles in a radius when they hit something. Finally, Summoning which summons mobs that sometimes aid you in combat."
@@ -0,0 +1,4 @@
author: "Ghommie"
delete-after: True
changes:
- bugfix: "Fixed storage implant transplant."
@@ -0,0 +1,4 @@
author: "Ghommie"
delete-after: True
changes:
- bugfix: "Refactored how Jacqueen teleportation destination is selected, preventing them from teleporting on off-station holopads."
Binary file not shown.

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 115 KiB

After

Width:  |  Height:  |  Size: 127 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

After

Width:  |  Height:  |  Size: 4.4 KiB

@@ -72,32 +72,7 @@
/obj/item/reagent_containers/glass/bottle/hexacrocin = 10
)
refill_canister = /obj/item/vending_refill/kink
/*
/obj/machinery/vending/nazivend
name = "Nazivend"
desc = "A vending machine containing Nazi German supplies. A label reads: \"Remember the gorrilions lost.\""
icon = 'icons/obj/citvending.dmi'
icon_state = "nazi"
vend_reply = "SIEG HEIL!"
product_slogans = "Das Vierte Reich wird zuruckkehren!;ENTFERNEN JUDEN!;Billiger als die Juden jemals geben!;Rader auf dem adminbus geht rund und rund.;Warten Sie, warum wir wieder hassen Juden?- *BZZT*"
products = list(
/obj/item/clothing/head/stalhelm = 20,
/obj/item/clothing/head/panzer = 20,
/obj/item/clothing/suit/soldiercoat = 20,
// /obj/item/clothing/under/soldieruniform = 20,
/obj/item/clothing/shoes/jackboots = 20
)
contraband = list(
/obj/item/clothing/head/naziofficer = 10,
// /obj/item/clothing/suit/officercoat = 10,
// /obj/item/clothing/under/officeruniform = 10,
/obj/item/clothing/suit/space/hardsuit/nazi = 3,
/obj/item/gun/energy/plasma/MP40k = 4
)
premium = list()
refill_canister = /obj/item/vending_refill/nazi
*/
/obj/machinery/vending/sovietvend
name = "KomradeVendtink"
desc = "Rodina-mat' zovyot!"
@@ -137,10 +112,6 @@
icon = 'modular_citadel/icons/vending_restock.dmi'
icon_state = "refill_kink"
/obj/item/vending_refill/nazi
machine_name = "nazivend"
icon_state = "refill_nazi"
/obj/item/vending_refill/soviet
machine_name = "sovietvend"
icon_state = "refill_soviet"
+12
View File
@@ -45,6 +45,7 @@
#include "code\__DEFINES\donator_groupings.dm"
#include "code\__DEFINES\events.dm"
#include "code\__DEFINES\exports.dm"
#include "code\__DEFINES\fantasy_affixes.dm"
#include "code\__DEFINES\flags.dm"
#include "code\__DEFINES\food.dm"
#include "code\__DEFINES\footsteps.dm"
@@ -344,6 +345,7 @@
#include "code\datums\components\_component.dm"
#include "code\datums\components\anti_magic.dm"
#include "code\datums\components\armor_plate.dm"
#include "code\datums\components\bane.dm"
#include "code\datums\components\bouncy.dm"
#include "code\datums\components\butchering.dm"
#include "code\datums\components\caltrop.dm"
@@ -357,9 +359,12 @@
#include "code\datums\components\empprotection.dm"
#include "code\datums\components\footstep.dm"
#include "code\datums\components\forced_gravity.dm"
#include "code\datums\components\igniter.dm"
#include "code\datums\components\infective.dm"
#include "code\datums\components\jousting.dm"
#include "code\datums\components\knockback.dm"
#include "code\datums\components\knockoff.dm"
#include "code\datums\components\lifesteal.dm"
#include "code\datums\components\lockon_aiming.dm"
#include "code\datums\components\magnetic_catch.dm"
#include "code\datums\components\material_container.dm"
@@ -375,16 +380,23 @@
#include "code\datums\components\remote_materials.dm"
#include "code\datums\components\riding.dm"
#include "code\datums\components\rotation.dm"
#include "code\datums\components\shrapnel.dm"
#include "code\datums\components\slippery.dm"
#include "code\datums\components\spooky.dm"
#include "code\datums\components\squeak.dm"
#include "code\datums\components\stationloving.dm"
#include "code\datums\components\summoning.dm"
#include "code\datums\components\swarming.dm"
#include "code\datums\components\tactical.dm"
#include "code\datums\components\thermite.dm"
#include "code\datums\components\uplink.dm"
#include "code\datums\components\virtual_reality.dm"
#include "code\datums\components\wearertargeting.dm"
#include "code\datums\components\wet_floor.dm"
#include "code\datums\components\fantasy\_fantasy.dm"
#include "code\datums\components\fantasy\affix.dm"
#include "code\datums\components\fantasy\prefixes.dm"
#include "code\datums\components\fantasy\suffixes.dm"
#include "code\datums\components\storage\storage.dm"
#include "code\datums\components\storage\concrete\_concrete.dm"
#include "code\datums\components\storage\concrete\bag_of_holding.dm"
+1 -1
View File
@@ -1,3 +1,3 @@
pygit2==0.27.2
bidict==0.13.1
Pillow==5.1.0
Pillow==6.2.0