diff --git a/_maps/map_files/Vampire/runtimetown.dmm b/_maps/map_files/Vampire/runtimetown.dmm
index 5f3288e3573b..1bffecd13ae7 100644
--- a/_maps/map_files/Vampire/runtimetown.dmm
+++ b/_maps/map_files/Vampire/runtimetown.dmm
@@ -1,4 +1,8 @@
//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ah" = (
+/obj/effect/turf_decal/bordur/corner,
+/turf/open/floor/plating/sidewalk,
+/area/vtm/outside/pacificheights)
"an" = (
/obj/structure/vampfence/corner/rich{
dir = 8
@@ -138,6 +142,12 @@
},
/turf/open/floor/plating/rough,
/area/vtm/interior/techshop)
+"cD" = (
+/obj/transfer_point_vamp{
+ id = "test_4"
+ },
+/turf/open/floor/plating/asphalt,
+/area/vtm/outside/pacificheights)
"cQ" = (
/obj/structure/table,
/obj/item/storage/medkit/darkpack/ifak,
@@ -231,10 +241,10 @@
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
"fd" = (
-/obj/effect/turf_decal/bordur{
+/obj/item/vamp/keys/clinic,
+/obj/effect/turf_decal/bordur/corner{
dir = 1
},
-/obj/item/vamp/keys/clinic,
/turf/open/floor/plating/sidewalk/poor,
/area/vtm/outside/pacificheights)
"fh" = (
@@ -453,6 +463,15 @@
},
/turf/open/misc/beach/vamp,
/area/vtm/outside/pacificheights)
+"ji" = (
+/obj/structure/table/wood,
+/obj/item/paper_bin,
+/obj/item/pen/fourcolor,
+/obj/effect/turf_decal/bordur{
+ dir = 4
+ },
+/turf/open/floor/plating/sidewalk/poor,
+/area/vtm/outside/pacificheights)
"jj" = (
/obj/structure/table,
/obj/item/liquid_flamethrower,
@@ -511,6 +530,12 @@
},
/turf/open/misc/grass,
/area/vtm/outside/pacificheights)
+"jU" = (
+/obj/effect/turf_decal/bordur/corner{
+ dir = 4
+ },
+/turf/open/floor/plating/sidewalk,
+/area/vtm/outside/pacificheights)
"jW" = (
/obj/effect/decal/wallpaper/paper/stripe,
/turf/closed/wall/vampwall/market,
@@ -564,6 +589,12 @@
/obj/item/molotov,
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/pacificheights)
+"kN" = (
+/obj/effect/turf_decal/bordur{
+ dir = 4
+ },
+/turf/open/floor/plating/sidewalk/poor,
+/area/vtm/outside/pacificheights)
"kS" = (
/turf/closed/wall/vampwall/market,
/area/vtm/interior/shop)
@@ -623,6 +654,12 @@
/obj/effect/abstract/cargo_landing_spot,
/turf/open/misc/dirt,
/area/vtm/outside/supply)
+"lZ" = (
+/obj/transfer_point_vamp{
+ id = "test_3"
+ },
+/turf/open/floor/plating/asphalt,
+/area/vtm/outside/pacificheights)
"md" = (
/obj/structure/vampdoor{
dir = 4
@@ -659,7 +696,10 @@
"mZ" = (
/obj/machinery/fax/police,
/obj/structure/table/wood,
-/turf/open/misc/beach/vamp,
+/obj/effect/turf_decal/bordur{
+ dir = 4
+ },
+/turf/open/floor/plating/sidewalk/poor,
/area/vtm/outside/pacificheights)
"nj" = (
/turf/open/openspace,
@@ -1224,6 +1264,12 @@
},
/turf/open/floor/plating/rough,
/area/vtm/graveyard/interior)
+"vA" = (
+/obj/transfer_point_vamp{
+ id = "test_5"
+ },
+/turf/open/floor/plating/asphalt,
+/area/vtm/outside/pacificheights)
"vD" = (
/mob/living/carbon/human/npc/shop,
/turf/open/floor/city/toilet,
@@ -1311,6 +1357,12 @@
},
/turf/open/floor/plating/sidewalk,
/area/vtm/outside/pacificheights)
+"xC" = (
+/obj/effect/turf_decal/bordur/corner{
+ dir = 8
+ },
+/turf/open/floor/plating/sidewalk/poor,
+/area/vtm/outside/pacificheights)
"xE" = (
/obj/structure/table,
/obj/item/storage/medkit/darkpack/advanced,
@@ -1553,6 +1605,12 @@
/obj/fusebox/transformer,
/turf/open/floor/plating/sidewalk/poor,
/area/vtm/outside/baywalk)
+"Cg" = (
+/obj/transfer_point_vamp{
+ id = "test_6"
+ },
+/turf/open/floor/plating/asphalt,
+/area/vtm/outside/pacificheights)
"Ct" = (
/obj/structure/lamppost/one{
dir = 1
@@ -1581,6 +1639,12 @@
},
/turf/open/floor/plating/rough,
/area/vtm/graveyard/interior)
+"CM" = (
+/obj/transfer_point_vamp{
+ id = "test_1"
+ },
+/turf/open/floor/plating/asphalt,
+/area/vtm/outside/pacificheights)
"CP" = (
/obj/structure/table/wood,
/obj/item/ammo_box/darkpack/c12g{
@@ -1935,6 +1999,12 @@
/obj/structure/transport/linear/public,
/turf/open/floor/plating/elevatorshaft,
/area/vtm/outside/pacificheights)
+"Hm" = (
+/obj/transfer_point_vamp{
+ id = "test_2"
+ },
+/turf/open/floor/plating/asphalt,
+/area/vtm/outside/pacificheights)
"Hn" = (
/obj/effect/turf_decal/bordur{
dir = 4
@@ -2023,7 +2093,7 @@
/turf/open/floor/plating/rough,
/area/vtm/graveyard/interior)
"ID" = (
-/turf/closed/wall/vampwall/market,
+/turf/open/floor/plating/sidewalk/poor,
/area/vtm/outside/pacificheights)
"IL" = (
/obj/structure/ladder/manhole/up,
@@ -2826,10 +2896,10 @@
/turf/open/floor/plating/sidewalk,
/area/vtm/interior/cog)
"UC" = (
-/obj/item/paper_bin,
-/obj/item/pen/fourcolor,
-/obj/structure/table/wood,
-/turf/open/misc/beach/vamp,
+/obj/effect/turf_decal/bordur{
+ dir = 8
+ },
+/turf/open/floor/plating/sidewalk/poor,
/area/vtm/outside/pacificheights)
"UH" = (
/obj/structure/railing{
@@ -3079,7 +3149,10 @@
"XP" = (
/obj/machinery/fax/admin/police,
/obj/structure/table/wood,
-/turf/open/misc/beach/vamp,
+/obj/effect/turf_decal/bordur{
+ dir = 4
+ },
+/turf/open/floor/plating/sidewalk/poor,
/area/vtm/outside/pacificheights)
"XW" = (
/obj/effect/turf_decal/bordur,
@@ -3769,14 +3842,14 @@ iV
VQ
ik
fd
-NR
+ji
XP
-NR
+kN
mZ
-NR
-NR
-NR
-NR
+kN
+kN
+kN
+Zs
NR
Rj
Rj
@@ -3836,15 +3909,15 @@ cj
ik
VQ
ik
-Fs
-NR
-UC
-NR
-NR
-NR
-NR
-NR
-NR
+kX
+ik
+ik
+ik
+ik
+ik
+ik
+ik
+cD
NR
Rj
Rj
@@ -3904,15 +3977,15 @@ cj
FB
VQ
ik
-Fs
-NR
-NR
-NR
-NR
-NR
-NR
-NR
-NR
+kX
+hi
+hi
+hi
+hi
+hi
+hi
+hi
+vA
NR
Rj
Rj
@@ -3972,15 +4045,15 @@ bp
ik
VQ
ik
-Fs
-NR
-NR
-NR
-NR
-NR
-NR
-NR
-NR
+kX
+ik
+ik
+ik
+ik
+ik
+ik
+ik
+Cg
NR
Rj
Rj
@@ -4040,15 +4113,15 @@ cj
rW
rW
rW
-Fs
-NR
-NR
-NR
-NR
-NR
-NR
-NR
-NR
+xC
+UC
+UC
+UC
+UC
+UC
+UC
+UC
+Zs
NR
Rj
Rj
@@ -7783,9 +7856,9 @@ Kk
Zs
Zs
qV
-qV
-qV
-qV
+CM
+Hm
+lZ
qV
Zs
Zs
@@ -8266,14 +8339,14 @@ rW
cZ
QS
qV
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
Ys
Ys
Ys
@@ -8333,15 +8406,15 @@ ik
ik
kX
ik
+cD
ik
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+ik
+ik
+ik
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -8401,15 +8474,15 @@ ik
ik
kX
hi
+vA
ik
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+ik
+ik
+ik
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -8469,15 +8542,15 @@ ik
ik
kX
ik
+Cg
ik
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+ik
+ik
+ik
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -8538,14 +8611,14 @@ rW
sk
Zc
qV
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+Zc
+Zc
+Zc
+ah
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -8605,6 +8678,14 @@ ik
ik
KU
nq
+eQ
+eQ
+eQ
+eQ
+XJ
+ik
+ik
+ik
qV
Ys
Ys
@@ -8630,14 +8711,6 @@ Ys
Ys
Ys
Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
GJ
"}
(15,1,2) = {"
@@ -8673,15 +8746,15 @@ ik
ik
KU
eQ
-ID
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+eQ
+eQ
+eQ
+eQ
+XJ
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -8741,15 +8814,15 @@ ik
ik
KU
eQ
-ID
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+eQ
+eQ
+eQ
+eQ
+XJ
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -8809,15 +8882,15 @@ ik
ik
KU
eQ
-ID
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+eQ
+eQ
+eQ
+eQ
+XJ
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -8877,15 +8950,15 @@ ik
ik
KU
eQ
-ID
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+eQ
+eQ
+eQ
+eQ
+XJ
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -8945,15 +9018,15 @@ ik
HJ
KU
eQ
-ID
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+eQ
+eQ
+eQ
+eQ
+XJ
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -9013,15 +9086,15 @@ ik
ik
KU
eQ
-ID
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+eQ
+eQ
+eQ
+eQ
+XJ
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -9081,15 +9154,15 @@ ik
ik
KU
eQ
-ID
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+eQ
+eQ
+eQ
+eQ
+XJ
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -9149,15 +9222,15 @@ ik
ik
KU
eQ
-ID
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+eQ
+eQ
+eQ
+eQ
+XJ
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -9217,15 +9290,15 @@ ik
ik
KU
eQ
-ID
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+eQ
+eQ
+eQ
+eQ
+XJ
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -9285,15 +9358,15 @@ ik
ik
KU
eQ
-ID
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+eQ
+eQ
+eQ
+eQ
+XJ
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -9353,15 +9426,15 @@ rW
rW
HO
eQ
-ID
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+eQ
+eQ
+eQ
+eQ
+XJ
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -9421,15 +9494,15 @@ ik
ik
KU
eQ
-ID
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+eQ
+eQ
+eQ
+eQ
+XJ
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -9489,15 +9562,15 @@ ik
ik
Dr
AU
-ID
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+QS
+QS
+QS
+QS
+jU
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -9558,14 +9631,14 @@ ik
ik
ik
ik
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+ik
+ik
+ik
+ik
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -9626,14 +9699,14 @@ ik
ik
ik
ik
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+ik
+ik
+ik
+ik
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -9694,14 +9767,14 @@ ik
ik
ik
ik
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+ik
+ik
+ik
+ik
+ik
+ik
+ik
+qV
Ys
Ys
Ys
@@ -9761,15 +9834,15 @@ ik
ik
ik
ik
-ik
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+XM
+ID
+ID
+ID
+ID
+ID
+ID
+ID
+qV
Ys
Ys
Ys
@@ -9829,15 +9902,15 @@ ik
ik
ik
ik
-ik
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
-Ys
+XM
+qV
+qV
+qV
+qV
+qV
+qV
+qV
+qV
Ys
Ys
Ys
@@ -9897,7 +9970,7 @@ ik
ik
ik
ik
-ik
+XM
Ys
Ys
Ys
@@ -9965,7 +10038,7 @@ ik
ik
ik
ik
-ik
+XM
Ys
Ys
Ys
@@ -10033,7 +10106,7 @@ ik
ik
ik
ik
-ik
+XM
Ys
Ys
Ys
@@ -10101,7 +10174,7 @@ ik
ik
so
gS
-qV
+XM
Ys
Ys
Ys
@@ -10169,7 +10242,7 @@ Ak
Ak
cZ
QS
-qV
+XM
Ys
Ys
Ys
@@ -10237,7 +10310,7 @@ ik
ik
ov
ik
-qV
+XM
Ys
Ys
Ys
@@ -10305,7 +10378,7 @@ ik
ik
ov
Qi
-qV
+XM
Ys
Ys
Ys
@@ -10373,7 +10446,7 @@ ik
ik
ov
ik
-qV
+XM
Ys
Ys
Ys
@@ -10441,7 +10514,7 @@ rW
rW
sk
Zc
-qV
+XM
Ys
Ys
Ys
@@ -10509,7 +10582,7 @@ ik
ik
KU
nq
-qV
+XM
Ys
Ys
Ys
@@ -12067,9 +12140,9 @@ Zs
Zs
Zs
qV
-qV
-qV
-qV
+CM
+Hm
+lZ
qV
xh
XM
diff --git a/code/__DEFINES/~darkpack/combat.dm b/code/__DEFINES/~darkpack/combat.dm
index 164bad9dfd99..2f6fec55c831 100644
--- a/code/__DEFINES/~darkpack/combat.dm
+++ b/code/__DEFINES/~darkpack/combat.dm
@@ -17,3 +17,7 @@
#define LETHAL "lethal"
// exists in code/__DEFINES/~darkpack/aggravated_damage.dm
//#define AGGRAVATED
+
+// To convert a measure of yards into tiles/range
+#define YARDS / 5
+#define YARDS_TO_TILES * 5
diff --git a/code/__DEFINES/~darkpack/fera/fera.dm b/code/__DEFINES/~darkpack/fera/fera.dm
index 6a2f0b7a33f9..fd28eb1c24c2 100644
--- a/code/__DEFINES/~darkpack/fera/fera.dm
+++ b/code/__DEFINES/~darkpack/fera/fera.dm
@@ -9,10 +9,13 @@
#define MAX_GNOSIS 10
#define PRIMAL_URGE_PLACEHOLDER 3
-#define BREED_HOMID "Homid"
+#define BREED_GAROU_HOMID "Garou Homid"
#define BREED_LUPUS "Lupus"
#define BREED_CRINOS "Crinos"
+#define BREED_CORAX_HOMID "Corax Homid"
+#define BREED_CORVID "Corvid"
+
#define FEATURE_FUR_COLOR "fera_fur"
// fera will likely have a seperate list of colors but uses the same feature or var as other fera
@@ -22,7 +25,16 @@ GLOBAL_LIST_INIT(garou_fur_colors, list(
"red" = "red",
"white" = "white",
"ginger" = "ginger",
- "brown" = "brown"
+ "brown" = "brown",
+))
+
+GLOBAL_LIST_INIT(corax_fur_colors, list(
+ "black" = "black",
+ "brown" = "brown",
+ "white" = "white",
+ "green" = "green",
+ "red" = "red",
+ "gray" = "gray",
))
#define STATUS_EFFECT_DELIRIUM /datum/status_effect/delirium
diff --git a/code/__DEFINES/~darkpack/fera/werewolf_tribe.dm b/code/__DEFINES/~darkpack/fera/werewolf_tribe.dm
index e9bfd5a7b088..1d2c927cce83 100644
--- a/code/__DEFINES/~darkpack/fera/werewolf_tribe.dm
+++ b/code/__DEFINES/~darkpack/fera/werewolf_tribe.dm
@@ -16,10 +16,8 @@
#define TRIBE_STARGAZERS "Stargazers"
#define TRIBE_BLACK_SPIRAL_DANCERS "Black Spiral Dancers"
-#define TRIBE_CORAX "Corax" // DARKPACK TODO - CORAX
-
-#define TRIBE_LIST_ALL list(TRIBE_RONIN, TRIBE_GALESTALKERS, TRIBE_CHILDREN_OF_GAIA, TRIBE_UKTENA, TRIBE_FIANNA, TRIBE_GET_OF_FENRIS, TRIBE_BLACK_FURIES, TRIBE_SILVER_FANGS, TRIBE_SILENT_STRIDERS, TRIBE_RED_TALONS, TRIBE_STARGAZERS, TRIBE_GLASS_WALKERS, TRIBE_BONE_GNAWERS, TRIBE_SHADOW_LORDS, TRIBE_BLACK_SPIRAL_DANCERS, TRIBE_CORAX)
-#define TRIBE_LIST_GAIA list(TRIBE_GALESTALKERS, TRIBE_CHILDREN_OF_GAIA, TRIBE_UKTENA, TRIBE_FIANNA, TRIBE_GET_OF_FENRIS, TRIBE_BLACK_FURIES, TRIBE_SILVER_FANGS, TRIBE_SILENT_STRIDERS, TRIBE_RED_TALONS, TRIBE_STARGAZERS, TRIBE_GLASS_WALKERS, TRIBE_BONE_GNAWERS, TRIBE_SHADOW_LORDS, TRIBE_CORAX)
-#define TRIBE_LIST_WYLD list(TRIBE_GALESTALKERS, TRIBE_CHILDREN_OF_GAIA, TRIBE_UKTENA, TRIBE_FIANNA, TRIBE_GET_OF_FENRIS, TRIBE_BLACK_FURIES, TRIBE_SILVER_FANGS, TRIBE_SILENT_STRIDERS, TRIBE_RED_TALONS, TRIBE_STARGAZERS, TRIBE_SHADOW_LORDS, TRIBE_CORAX)
+#define TRIBE_LIST_ALL list(TRIBE_RONIN, TRIBE_GALESTALKERS, TRIBE_CHILDREN_OF_GAIA, TRIBE_UKTENA, TRIBE_FIANNA, TRIBE_GET_OF_FENRIS, TRIBE_BLACK_FURIES, TRIBE_SILVER_FANGS, TRIBE_SILENT_STRIDERS, TRIBE_RED_TALONS, TRIBE_STARGAZERS, TRIBE_GLASS_WALKERS, TRIBE_BONE_GNAWERS, TRIBE_SHADOW_LORDS, TRIBE_BLACK_SPIRAL_DANCERS)
+#define TRIBE_LIST_GAIA list(TRIBE_GALESTALKERS, TRIBE_CHILDREN_OF_GAIA, TRIBE_UKTENA, TRIBE_FIANNA, TRIBE_GET_OF_FENRIS, TRIBE_BLACK_FURIES, TRIBE_SILVER_FANGS, TRIBE_SILENT_STRIDERS, TRIBE_RED_TALONS, TRIBE_STARGAZERS, TRIBE_GLASS_WALKERS, TRIBE_BONE_GNAWERS, TRIBE_SHADOW_LORDS)
+#define TRIBE_LIST_WYLD list(TRIBE_GALESTALKERS, TRIBE_CHILDREN_OF_GAIA, TRIBE_UKTENA, TRIBE_FIANNA, TRIBE_GET_OF_FENRIS, TRIBE_BLACK_FURIES, TRIBE_SILVER_FANGS, TRIBE_SILENT_STRIDERS, TRIBE_RED_TALONS, TRIBE_STARGAZERS, TRIBE_SHADOW_LORDS)
#define TRIBE_LIST_WEAVER list(TRIBE_GLASS_WALKERS, TRIBE_BONE_GNAWERS)
#define TRIBE_LIST_WYRM list(TRIBE_BLACK_SPIRAL_DANCERS)
diff --git a/code/__DEFINES/~darkpack/guns.dm b/code/__DEFINES/~darkpack/guns.dm
index 810db7ba5e49..abe8980425e9 100644
--- a/code/__DEFINES/~darkpack/guns.dm
+++ b/code/__DEFINES/~darkpack/guns.dm
@@ -1,7 +1,8 @@
#define CALIBER_9MMPARA "9x19mm Parabellum"
#define CALIBER_45ACP ".45 ACP"
#define CALIBER_44MAG ".44 Magnum"
-#define CALIBER_50CAL ".50" // DARKPACK TODO: Seperate into .50 BMG and .50 AE
+#define CALIBER_50CAL_BMG ".50 BMG"
+#define CALIBER_50CAL_AE ".50 AE"
#define CALIBER_545SOVIET "5.45x39mm"
#define CALIBER_556NATO "5.56mm NATO"
#define CALIBER_46HK "4.6x30mm HK"
diff --git a/code/__DEFINES/~darkpack/splats.dm b/code/__DEFINES/~darkpack/splats.dm
index cd889cce6054..81d9e7fa4d1c 100644
--- a/code/__DEFINES/~darkpack/splats.dm
+++ b/code/__DEFINES/~darkpack/splats.dm
@@ -8,7 +8,7 @@
/// Parent type for shifters. Not player facing. Shouldnt be needed but put here for clarity.
//#define SPLAT_FERA "splat_fera"
#define SPLAT_GAROU "splat_garou"
-#define SPLAT_CORAX "splat_corax" // DARKPACK TODO - CORAX
+#define SPLAT_CORAX "splat_corax"
#define SPLAT_SHIFTERS list(SPLAT_GAROU, SPLAT_CORAX)
#define SPLAT_PRIO_HALFSPLAT 100
diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm
index 5f87af1713c3..4ef7a8b1e544 100644
--- a/code/__DEFINES/~darkpack/traits/declarations.dm
+++ b/code/__DEFINES/~darkpack/traits/declarations.dm
@@ -45,7 +45,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_PALE_AURA "pale_aura"
#define TRAIT_DECEPTIVE_AURA "deceptive_aura"
#define TRAIT_FRENETIC_AURA "frenetic_aura"
+#define TRAIT_HIDDEN_DIABLERIE "hidden_diablerie"
+#define TRAIT_HIDDEN_WYRMTAINT "hidden_wyrmtaint"
#define TRAIT_BLUSH_OF_HEALTH "blush_of_health"
/// The mob will automatically breach the Masquerade when seen by others, with no exceptions
#define TRAIT_UNMASQUERADE "unmasquerade"
@@ -128,12 +130,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_FERA_FORMS "fera_forms"
// If the splat uses the WTA renown system described in W20 p. 245
#define TRAIT_FERA_RENOWN "wta_fera_renown"
-/// If the species has garou breeds to select.
-#define TRAIT_WTA_GAROU_BREED "wta_garou_breeds"
-// if the species has garou tribes to select.
-#define TRAIT_WTA_GAROU_TRIBE "wta_garou_tribes"
-// If the species has garou auspices to select.
-#define TRAIT_WTA_GAROU_AUSPICE "wta_garou_auspice"
// This mob has fur!
#define TRAIT_FERA_FUR "fera_fur"
/// If the fera is wyrm tainted.
@@ -144,11 +140,17 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_NO_LYING_ANGLE "no_lying_angle"
// Expensive but allows us to ensure there resting gets updated.
#define TRAIT_TRANSFORM_UPDATES_ICON "transform_updates_icon"
+// Fera both grants a flight ability, and has the sprites to support such a thing. (Presently only designed to supprot feral form.)
+#define TRAIT_FERA_FLIGHT "fera_flight"
+#define TRAIT_SILVER_WEAKNESS "silver_weakness"
+#define TRAIT_GOLD_WEAKNESS "gold_weakness"
+// Delirium is effectivly two levels weaker
+#define TRAIT_WEAK_DELIRIUM "weak_delirium"
+// Massivly boosts the range of your howl emote.
+#define TRAIT_LOUD_WARCRY "loud_warcry"
/// Prevents the mob from picking up items larger then small
#define TRAIT_SMALL_HANDS "small_hands"
// Traits granted via gifts
-// Massivly boosts the range of your howl emote.
-#define TRAIT_LOUD_HOWLER "loud_howler"
#define TRAIT_RAZOR_CLAWS "razor_claws"
/// Sixth sense restricted to view range
diff --git a/code/__HELPERS/mobs.dm b/code/__HELPERS/mobs.dm
index cdb4edb0098f..6b0d2fbe1fca 100644
--- a/code/__HELPERS/mobs.dm
+++ b/code/__HELPERS/mobs.dm
@@ -405,8 +405,8 @@ GLOBAL_LIST_INIT(skin_tone_names, list(
override = SEE_DEADCHAT_ADMIN
if(HAS_TRAIT(M, TRAIT_SIXTHSENSE) && message_type == DEADCHAT_REGULAR)
override = SEE_DEADCHAT_NORMAL
- // DARKPACK EDIT ADD START
- if(HAS_TRAIT(M, TRAIT_LOCAL_SIXTHSENSE) && (message_type == DEADCHAT_REGULAR) && (source in orange(DEFAULT_MESSAGE_RANGE, M)))
+ // DARKPACK EDIT ADD START - WEREWOLF - (Spirit Speech)
+ if(HAS_TRAIT(M, TRAIT_LOCAL_SIXTHSENSE) && (message_type == DEADCHAT_REGULAR) && ((follow_target || turf_target) in orange(DEFAULT_MESSAGE_RANGE, M)))
override = SEE_DEADCHAT_NORMAL
// DARKPACK EDIT ADD END
if(SSticker.current_state == GAME_STATE_FINISHED)
diff --git a/code/_globalvars/darkpack/lists/ambience.dm b/code/_globalvars/darkpack/lists/ambience.dm
index 880dc000dcc3..2d6e5dd3eb15 100644
--- a/code/_globalvars/darkpack/lists/ambience.dm
+++ b/code/_globalvars/darkpack/lists/ambience.dm
@@ -20,10 +20,10 @@ GLOBAL_LIST_INIT(office_ambience, list(
))
GLOBAL_LIST_INIT(music_assoc,list(
- MUSIC_CITY = list('modular_darkpack/modules/ambience/sounds/music/downtown.ogg', 'modular_darkpack/modules/ambience/sounds/music/downtown_alt.ogg', 'modular_darkpack/modules/ambience/sounds/music/what_comes_next.ogg'),
+ MUSIC_CITY = list('modular_darkpack/modules/ambience/sounds/music/downtown.ogg', 'modular_darkpack/modules/ambience/sounds/music/downtown_alt.ogg', 'modular_darkpack/modules/ambience/sounds/music/what_comes_next.ogg', 'modular_darkpack/modules/ambience/sounds/music/vtm_redemption_nyc_hub.ogg'),
MUSIC_FOREST = list('modular_darkpack/modules/ambience/sounds/music/night_ambience.ogg', 'modular_darkpack/modules/ambience/sounds/music/for_my_clan.ogg'),
MUSIC_CHURCH = list('modular_darkpack/modules/ambience/sounds/music/hahihaho.ogg'),
- MUSIC_PRINCE = list('modular_darkpack/modules/ambience/sounds/music/prince.ogg'),
+ MUSIC_PRINCE = list('modular_darkpack/modules/ambience/sounds/music/prince.ogg', 'modular_darkpack/modules/ambience/sounds/music/elysium.ogg'),
MUSIC_BAR = list('modular_darkpack/modules/ambience/sounds/music/naive.ogg'),
MUSIC_HOLLYWOOD = list('modular_darkpack/modules/ambience/sounds/music/hollywood.ogg', 'modular_darkpack/modules/ambience/sounds/music/open_season.ogg', 'modular_darkpack/modules/ambience/sounds/music/is_it_all_worth_it.ogg'),
MUSIC_SANTAMONICA = list('modular_darkpack/modules/ambience/sounds/music/santamonica.ogg'),
diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm
index 35d8900b8ee6..79ec3bed8f49 100644
--- a/code/_globalvars/traits/_traits.dm
+++ b/code/_globalvars/traits/_traits.dm
@@ -693,14 +693,18 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_ENHANCED_MELEE_DODGE" = TRAIT_ENHANCED_MELEE_DODGE, // DARKPACK EDIT ADD
"TRAIT_FAIR_GLABRO" = TRAIT_FAIR_GLABRO, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_FEEDING_RESTRICTION" = TRAIT_FEEDING_RESTRICTION, // DARKPACK EDIT ADD
+ "TRAIT_FERA_FLIGHT" = TRAIT_FERA_FLIGHT, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_FERA_FORMS" = TRAIT_FERA_FORMS, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_FERA_FUR" = TRAIT_FERA_FUR, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_FERA_RENOWN" = TRAIT_FERA_RENOWN, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_FORCED_EMOTION" = TRAIT_FORCED_EMOTION, // DARKPACK EDIT ADD - Melpominee
"TRAIT_FRENETIC_AURA" = TRAIT_FRENETIC_AURA, // DARKPACK EDIT ADD
"TRAIT_GHOST_VISION" = TRAIT_GHOST_VISION, // DARKPACK EDIT ADD - POWERS - (Necromancy)
+ "TRAIT_GOLD_WEAKNESS" = TRAIT_GOLD_WEAKNESS, // DARKPACK EDIT ADD - WEREWOLF - (corax)
"TRAIT_GRIP_OF_THE_DAMNED" = TRAIT_GRIP_OF_THE_DAMNED, // DARKPACK EDIT ADD
"TRAIT_GULLET" = TRAIT_GULLET, // DARKPACK EDIT ADD
+ "TRAIT_HIDDEN_DIABLERIE" = TRAIT_HIDDEN_DIABLERIE, //DARKPACK EDIT ADD
+ "TRAIT_HIDDEN_WYRMTAINT" = TRAIT_HIDDEN_WYRMTAINT, // DARKPACK EDIT ADD
"TRAIT_HOMOSEXUAL" = TRAIT_HOMOSEXUAL, // DARKPACK EDIT ADD
"TRAIT_HORRIFIC_APPEARANCE" = TRAIT_HORRIFIC_APPEARANCE, // DARKPACK EDIT ADD - Cappadocian Quirk
"TRAIT_HUNGRY" = TRAIT_HUNGRY, // DARKPACK EDIT ADD
@@ -712,7 +716,7 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_LAZY" = TRAIT_LAZY, // DARKPACK EDIT ADD
"TRAIT_LIGHT_WEAKNESS" = TRAIT_LIGHT_WEAKNESS, // DARKPACK EDIT ADD - Setite Flaw
"TRAIT_LOCAL_SIXTHSENSE" = TRAIT_LOCAL_SIXTHSENSE, // DARKPACK EDIT ADD
- "TRAIT_LOUD_HOWLER" = TRAIT_LOUD_HOWLER, // DARKPACK EDIT ADD - WEREWOLF
+ "TRAIT_LOUD_WARCRY" = TRAIT_LOUD_WARCRY, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_MASQUERADE_VIOLATING_EYES" = TRAIT_MASQUERADE_VIOLATING_EYES, // DARKPACK EDIT ADD
"TRAIT_MASQUERADE_VIOLATING_FACE" = TRAIT_MASQUERADE_VIOLATING_FACE, // DARKPACK EDIT ADD
"TRAIT_MERIT_UNTAMABLE" = TRAIT_MERIT_UNTAMABLE, // DARKPACK EDIT ADD - MERITS_FLAWS
@@ -739,13 +743,13 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_SENSITIVE_HUMANITY" = TRAIT_SENSITIVE_HUMANITY, // DARKPACK EDIT ADD
"TRAIT_SERPENTIS_SKIN" = TRAIT_SERPENTIS_SKIN, // DARKPACK EDIT ADD - POWERS - (Serpentis)
"TRAIT_SILENCED" = TRAIT_SILENCED, // DARKPACK EDIT ADD - POWERS - (Quietus)
+ "TRAIT_SILVER_WEAKNESS" = TRAIT_SILVER_WEAKNESS, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_SMALL_HANDS" = TRAIT_SMALL_HANDS, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_STAKED" = TRAIT_STAKED, // DARKPACK EDIT ADD
"TRAIT_STAKE_IMMUNE" = TRAIT_STAKE_IMMUNE, // DARKPACK EDIT ADD
"TRAIT_STAKE_RESISTANT" = TRAIT_STAKE_RESISTANT, // DARKPACK EDIT ADD
"TRAIT_STILLNESS_OF_DEATH" = TRAIT_STILLNESS_OF_DEATH, // DARKPACK EDIT ADD - Gargoyle Quirk
"TRAIT_THE_LARGEST_MAW" = TRAIT_THE_LARGEST_MAW, // DARKPACK EDIT ADD - MERITS/FLAWS
- "TRAIT_THE_LARGEST_MAW" = TRAIT_THE_LARGEST_MAW, // DARKPACK EDIT ADD - MERITS/FLAWS
"TRAIT_THIRD_EYE" = TRAIT_THIRD_EYE, // DARKPACK EDIT ADD - Tremere & Salubri Quirk
"TRAIT_TIMEWARPER" = TRAIT_TIMEWARPER, // DARKPACK EDIT ADD
"TRAIT_TIME_SENSE" = TRAIT_TIME_SENSE, // DARKPACK EDIT ADD - MERITS_FLAWS
@@ -762,11 +766,9 @@ GLOBAL_LIST_INIT(traits_by_type, list(
"TRAIT_VITAE_ADDICTION" = TRAIT_VITAE_ADDICTION, // DARKPACK EDIT ADD
"TRAIT_VTM_CLANS" = TRAIT_VTM_CLANS, // DARKPACK EDIT ADD
"TRAIT_VTM_MORALITY" = TRAIT_VTM_MORALITY, // DARKPACK EDIT ADD
+ "TRAIT_WEAK_DELIRIUM" = TRAIT_WEAK_DELIRIUM, // DARKPACK EDIT ADD - WEREWOLF - (corax)
"TRAIT_WEAK_TO_DOMINATE" = TRAIT_WEAK_TO_DOMINATE, // DARKPACK EDIT ADD - POWERS - (Dominate)
"TRAIT_WEAK_WILLED" = TRAIT_WEAK_WILLED, // DARKPACK EDIT ADD - MERITS_FLAWS
- "TRAIT_WTA_GAROU_AUSPICE" = TRAIT_WTA_GAROU_AUSPICE, // DARKPACK EDIT ADD - WEREWOLF
- "TRAIT_WTA_GAROU_BREED" = TRAIT_WTA_GAROU_BREED, // DARKPACK EDIT ADD - WEREWOLF
- "TRAIT_WTA_GAROU_TRIBE" = TRAIT_WTA_GAROU_TRIBE, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_WYRMTAINTED" = TRAIT_WYRMTAINTED, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_WYRMTAINTED_SPRITE" = TRAIT_WYRMTAINTED_SPRITE, // DARKPACK EDIT ADD - WEREWOLF
),
diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm
index 4bc8ec772588..fd17092644bc 100644
--- a/code/_globalvars/traits/admin_tooling.dm
+++ b/code/_globalvars/traits/admin_tooling.dm
@@ -387,8 +387,11 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_FERA_RENOWN" = TRAIT_FERA_RENOWN, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_FRENETIC_AURA" = TRAIT_FRENETIC_AURA, // DARKPACK EDIT ADD
"TRAIT_GHOST_VISION" = TRAIT_GHOST_VISION, // DARKPACK EDIT ADD - POWERS - (Necromancy)
+ "TRAIT_GOLD_WEAKNESS" = TRAIT_GOLD_WEAKNESS, // DARKPACK EDIT ADD - WEREWOLF - (corax)
"TRAIT_GRIP_OF_THE_DAMNED" = TRAIT_GRIP_OF_THE_DAMNED, // DARKPACK EDIT ADD
"TRAIT_GULLET" = TRAIT_GULLET, // DARKPACK EDIT ADD
+ "TRAIT_HIDDEN_DIABLERIE" = TRAIT_HIDDEN_DIABLERIE, //DARKPACK EDIT ADD
+ "TRAIT_HIDDEN_WYRMTAINT" = TRAIT_HIDDEN_WYRMTAINT, // DARKPACK EDIT ADD
"TRAIT_HOMOSEXUAL" = TRAIT_HOMOSEXUAL, // DARKPACK EDIT ADD
"TRAIT_HUNGRY" = TRAIT_HUNGRY, // DARKPACK EDIT ADD
"TRAIT_HUNTED" = TRAIT_HUNTED, // DARKPACK EDIT ADD
@@ -399,9 +402,8 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_LAZY" = TRAIT_LAZY, // DARKPACK EDIT ADD
"TRAIT_LIGHT_WEAKNESS" = TRAIT_LIGHT_WEAKNESS, // DARKPACK EDIT ADD - Setite Flaw
"TRAIT_LOCAL_SIXTHSENSE" = TRAIT_LOCAL_SIXTHSENSE, // DARKPACK EDIT ADD
- "TRAIT_LOUD_HOWLER" = TRAIT_LOUD_HOWLER, // DARKPACK EDIT ADD - WEREWOLF
+ "TRAIT_LOUD_WARCRY" = TRAIT_LOUD_WARCRY, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_MASQUERADE_VIOLATING_EYES" = TRAIT_MASQUERADE_VIOLATING_EYES, // DARKPACK EDIT ADD
- "TRAIT_MASQUERADE_VIOLATING_FACE" = TRAIT_MASQUERADE_VIOLATING_FACE, // DARKPACK EDIT ADD
"TRAIT_MERIT_UNTAMABLE" = TRAIT_MERIT_UNTAMABLE, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_METAMORPH" = TRAIT_METAMORPH, // DARKPACK EDIT ADD - MERITS_FLAWS
"TRAIT_NEEDS_BLOOD" = TRAIT_NEEDS_BLOOD, // DARKPACK EDIT ADD - Hunger and Frenzy
@@ -422,6 +424,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_SENSITIVE_HUMANITY" = TRAIT_SENSITIVE_HUMANITY, // DARKPACK EDIT ADD
"TRAIT_SERPENTIS_SKIN" = TRAIT_SERPENTIS_SKIN, // DARKPACK EDIT ADD - POWERS - (Serpentis)
"TRAIT_SILENCED" = TRAIT_SILENCED, // DARKPACK EDIT ADD - POWERS - (Quietus)
+ "TRAIT_SILVER_WEAKNESS" = TRAIT_SILVER_WEAKNESS, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_SMALL_HANDS" = TRAIT_SMALL_HANDS, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_STAKED" = TRAIT_STAKED, // DARKPACK EDIT ADD
"TRAIT_STAKE_IMMUNE" = TRAIT_STAKE_IMMUNE, // DARKPACK EDIT ADD
@@ -439,11 +442,9 @@ GLOBAL_LIST_INIT(admin_visible_traits, list(
"TRAIT_VITAE_ADDICTION" = TRAIT_VITAE_ADDICTION, // DARKPACK EDIT ADD
"TRAIT_VTM_CLANS" = TRAIT_VTM_CLANS, // DARKPACK EDIT ADD
"TRAIT_VTM_MORALITY" = TRAIT_VTM_MORALITY, // DARKPACK EDIT ADD
+ "TRAIT_WEAK_DELIRIUM" = TRAIT_WEAK_DELIRIUM, // DARKPACK EDIT ADD - WEREWOLF - (corax)
"TRAIT_WEAK_TO_DOMINATE" = TRAIT_WEAK_TO_DOMINATE, // DARKPACK EDIT ADD - POWERS - (Dominate)
"TRAIT_WEAK_WILLED" = TRAIT_WEAK_WILLED, // DARKPACK EDIT ADD - MERITS_FLAWS
- "TRAIT_WTA_GAROU_AUSPICE" = TRAIT_WTA_GAROU_AUSPICE, // DARKPACK EDIT ADD - WEREWOLF
- "TRAIT_WTA_GAROU_BREED" = TRAIT_WTA_GAROU_BREED, // DARKPACK EDIT ADD - WEREWOLF
- "TRAIT_WTA_GAROU_TRIBE" = TRAIT_WTA_GAROU_TRIBE, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_WYRMTAINTED" = TRAIT_WYRMTAINTED, // DARKPACK EDIT ADD - WEREWOLF
"TRAIT_WYRMTAINTED_SPRITE" = TRAIT_WYRMTAINTED_SPRITE, // DARKPACK EDIT ADD - WEREWOLF
),
diff --git a/code/modules/client/preferences.dm b/code/modules/client/preferences.dm
index 1a65a4e500a5..c8e24a15f9d9 100644
--- a/code/modules/client/preferences.dm
+++ b/code/modules/client/preferences.dm
@@ -347,7 +347,7 @@ GLOBAL_LIST_EMPTY(preferences_datums)
var/list/preferences = list()
for (var/datum/preference/preference as anything in get_preferences_in_priority_order())
- if (!preference.is_accessible(src))
+ if (!preference.visible_in_page(src)) // DARKPACK EDIT CHANGE - (is_accessible to visible_in_page)
continue
var/value = read_preference(preference.type)
@@ -579,6 +579,9 @@ GLOBAL_LIST_EMPTY(preferences_datums)
if (preference.must_have_relevant_trait && preference.relevant_inherent_trait)
if (!HAS_TRAIT(character, preference.relevant_inherent_trait))
continue
+
+ if (preference.must_be_accessible && !preference.is_accessible(src))
+ continue
// DARKPACK EDIT ADD END - TTRPG preferences
preference.apply_to_human(character, read_preference(preference.type))
diff --git a/code/modules/client/preferences/_preference.dm b/code/modules/client/preferences/_preference.dm
index 9bf2c2d8c8e6..14c785261538 100644
--- a/code/modules/client/preferences/_preference.dm
+++ b/code/modules/client/preferences/_preference.dm
@@ -307,7 +307,7 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key())
/// This will, for instance, update the character preference view.
/// Performs sanity checks.
/datum/preferences/proc/update_preference(datum/preference/preference, preference_value)
- if (!preference.is_accessible(src))
+ if (!preference.visible_in_page(src)) // DARKPACK EDIT CHANGE - (is_accessible to visible_in_page)
return FALSE
var/new_value = preference.deserialize(preference_value, src)
@@ -377,11 +377,24 @@ GLOBAL_LIST_INIT(preference_entries_by_key, init_preference_entries_by_key())
if (!has_relevant_feature(preferences))
return FALSE
+ /* // DARKPACK EDIT REMOVAL - Moved to a wrapper proc
if (!should_show_on_page(preferences.current_window))
return FALSE
+ */
return TRUE
+// DARKPACK EDIT ADD START
+/datum/preference/proc/visible_in_page(datum/preferences/preferences)
+ SHOULD_CALL_PARENT(TRUE)
+ SHOULD_NOT_SLEEP(TRUE)
+
+ if (!should_show_on_page(preferences.current_window))
+ return FALSE
+
+ return is_accessible(preferences)
+// DARKPACK EDIT ADD END
+
/// Returns whether or not, given the PREFERENCE_TAB_*, this preference should
/// appear.
/datum/preference/proc/should_show_on_page(preference_tab)
diff --git a/code/modules/client/preferences_savefile.dm b/code/modules/client/preferences_savefile.dm
index 06e366574b2e..71cde6752df3 100644
--- a/code/modules/client/preferences_savefile.dm
+++ b/code/modules/client/preferences_savefile.dm
@@ -187,8 +187,8 @@ SAVEFILE UPDATING/VERSIONING - 'Simplified', or rather, more coder-friendly ~Car
/datum/preferences/proc/update_character_darkpack(current_version, list/save_data)
if (current_version < 2)
- if(read_preference(/datum/preference/choiced/subsplat/garou_breed) == "Metis")
- write_preference(GLOB.preference_entries[/datum/preference/choiced/subsplat/garou_breed], BREED_CRINOS)
+ if(read_preference(/datum/preference/choiced/subsplat/fera_breed/garou) == "Metis")
+ write_preference(GLOB.preference_entries[/datum/preference/choiced/subsplat/fera_breed/garou], BREED_CRINOS)
// DARKPACK EDIT ADD END
/// checks through keybindings for outdated unbound keys and updates them
diff --git a/config/darkpack_config.txt b/config/darkpack_config.txt
index 5e8029099242..c6398d2f61e7 100644
--- a/config/darkpack_config.txt
+++ b/config/darkpack_config.txt
@@ -43,6 +43,7 @@ ROUNDSTART_SPLATS splat_kindred
ROUNDSTART_SPLATS splat_ghoul
ROUNDSTART_SPLATS splat_kinfolk
ROUNDSTART_SPLATS splat_garou
+ROUNDSTART_SPLATS splat_corax
## If dead people and ghosts can LOOC to people who are alive.
DISABLE_GHOST_LOOC
diff --git a/html/changelogs/AutoChangeLog-pr-1036.yml b/html/changelogs/AutoChangeLog-pr-1036.yml
deleted file mode 100644
index f647ee561b48..000000000000
--- a/html/changelogs/AutoChangeLog-pr-1036.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "chazzyjazzy"
-delete-after: True
-changes:
- - rscadd: "adds the financial crisis event which wipes out people's bank accounts, blame the giovannis"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1042.yml b/html/changelogs/AutoChangeLog-pr-1042.yml
new file mode 100644
index 000000000000..85fc6ecc9674
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1042.yml
@@ -0,0 +1,5 @@
+author: "chazzyjazzy"
+delete-after: True
+changes:
+ - rscadd: "adds the bomb trapped sarcophagus"
+ - rscadd: "adds the sarcophagus & key random event"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1047.yml b/html/changelogs/AutoChangeLog-pr-1047.yml
deleted file mode 100644
index 2277479d4729..000000000000
--- a/html/changelogs/AutoChangeLog-pr-1047.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Biplume"
-delete-after: True
-changes:
- - balance: "Crinos breedforms are no longer safe from silvers."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1050.yml b/html/changelogs/AutoChangeLog-pr-1050.yml
deleted file mode 100644
index 8c81aef21435..000000000000
--- a/html/changelogs/AutoChangeLog-pr-1050.yml
+++ /dev/null
@@ -1,7 +0,0 @@
-author: "Stutternov"
-delete-after: True
-changes:
- - rscadd: "Adds recoil calc stat check to reduce spread as well"
- - rscadd: "Adds difficulty to recoil calc"
- - rscdel: "Removes bonus damage random chance for firearm damage based on skill probability check"
- - balance: "Redoes some weapons recoil and spread slightly; overall changes ranged from 1-2 recoil/spread so very minor."
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1054.yml b/html/changelogs/AutoChangeLog-pr-1054.yml
deleted file mode 100644
index fb94443695c2..000000000000
--- a/html/changelogs/AutoChangeLog-pr-1054.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Magisterium2022"
-delete-after: True
-changes:
- - bugfix: "Fixed incorrect BP cost for Presence 2"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1059.yml b/html/changelogs/AutoChangeLog-pr-1059.yml
deleted file mode 100644
index 69263340352d..000000000000
--- a/html/changelogs/AutoChangeLog-pr-1059.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Marshmellow105"
-delete-after: True
-changes:
- - rscadd: "adds new wallpapers for mappers to use"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1060.yml b/html/changelogs/AutoChangeLog-pr-1060.yml
deleted file mode 100644
index 5aa2e272e113..000000000000
--- a/html/changelogs/AutoChangeLog-pr-1060.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "kyres, bomby"
-delete-after: True
-changes:
- - rscadd: "adds a new billboard with sprites from aurora"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1063.yml b/html/changelogs/AutoChangeLog-pr-1063.yml
deleted file mode 100644
index 643a36daf432..000000000000
--- a/html/changelogs/AutoChangeLog-pr-1063.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "obs7777"
-delete-after: True
-changes:
- - rscadd: "adds czech, polish, and ukrainian as languages"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1064.yml b/html/changelogs/AutoChangeLog-pr-1064.yml
deleted file mode 100644
index 8f2f68b76b5b..000000000000
--- a/html/changelogs/AutoChangeLog-pr-1064.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "FalloutFalcon"
-delete-after: True
-changes:
- - bugfix: "The same area name wont be shown twice when entering areas"
- - bugfix: "Generate forest has a correct area name"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1066.yml b/html/changelogs/AutoChangeLog-pr-1066.yml
deleted file mode 100644
index 11d2cc65b2a8..000000000000
--- a/html/changelogs/AutoChangeLog-pr-1066.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Biplume"
-delete-after: True
-changes:
- - rscadd: "Cast No Reflection flaw for Kindred"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1068.yml b/html/changelogs/AutoChangeLog-pr-1068.yml
deleted file mode 100644
index 708b2921edbc..000000000000
--- a/html/changelogs/AutoChangeLog-pr-1068.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Biplume"
-delete-after: True
-changes:
- - rscadd: "Calm Heart merit for Kindred"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1069.yml b/html/changelogs/AutoChangeLog-pr-1069.yml
deleted file mode 100644
index aa3c8fa2727d..000000000000
--- a/html/changelogs/AutoChangeLog-pr-1069.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Biplume"
-delete-after: True
-changes:
- - rscadd: "Speech Impediment flaw, available to all splats"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1070.yml b/html/changelogs/AutoChangeLog-pr-1070.yml
deleted file mode 100644
index c44daeb7d093..000000000000
--- a/html/changelogs/AutoChangeLog-pr-1070.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "odisurin"
-delete-after: True
-changes:
- - rscadd: "adds a new magadon sign"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1071.yml b/html/changelogs/AutoChangeLog-pr-1071.yml
deleted file mode 100644
index 00ef0fd2115a..000000000000
--- a/html/changelogs/AutoChangeLog-pr-1071.yml
+++ /dev/null
@@ -1,4 +0,0 @@
-author: "Biplume"
-delete-after: True
-changes:
- - bugfix: "Certain merits and flaws are now mutually exclusive; e.g. you can no longer be banned from Thaumaturgy and also banned from everything except Thaumaturgy"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-1088.yml b/html/changelogs/AutoChangeLog-pr-1088.yml
new file mode 100644
index 000000000000..b56d5e6f1a14
--- /dev/null
+++ b/html/changelogs/AutoChangeLog-pr-1088.yml
@@ -0,0 +1,4 @@
+author: "chazzyjazzy"
+delete-after: True
+changes:
+ - code_imp: "removes hard deletes on area texts by cutting out the qdeletion method for making the text disappear, just setting the text to be invisible instead"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-918.yml b/html/changelogs/AutoChangeLog-pr-918.yml
deleted file mode 100644
index ad031e3b9800..000000000000
--- a/html/changelogs/AutoChangeLog-pr-918.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "FalloutFalcon"
-delete-after: True
-changes:
- - rscdel: "Removes a few more TG crafting recipes"
- - balance: "Gives varried skill requirments to a buncha recipes (most are set to only need 0, a ton of the funny ones need 1-5)"
\ No newline at end of file
diff --git a/html/changelogs/AutoChangeLog-pr-981.yml b/html/changelogs/AutoChangeLog-pr-981.yml
deleted file mode 100644
index 047575a35c56..000000000000
--- a/html/changelogs/AutoChangeLog-pr-981.yml
+++ /dev/null
@@ -1,5 +0,0 @@
-author: "Marshmellow105"
-delete-after: True
-changes:
- - rscadd: "adds the FBI SWAT Response Team"
- - rscadd: "three new uniform bits for FBI agents, a turtleneck, fatigues, and fatigue pants"
\ No newline at end of file
diff --git a/html/changelogs/archive/2026-05.yml b/html/changelogs/archive/2026-05.yml
index f236f98c5788..d71c3de5b6d6 100644
--- a/html/changelogs/archive/2026-05.yml
+++ b/html/changelogs/archive/2026-05.yml
@@ -136,3 +136,57 @@
- rscadd: 'added a 1pt merit for sign language
:cl:'
+2026-05-25:
+ Biplume:
+ - rscadd: Cast No Reflection flaw for Kindred
+ - balance: Crinos breedforms are no longer safe from silvers.
+ - rscadd: Speech Impediment flaw, available to all splats
+ - rscadd: Hidden Diablerie merit for Kindred
+ - bugfix: Certain merits and flaws are now mutually exclusive; e.g. you can no longer
+ be banned from Thaumaturgy and also banned from everything except Thaumaturgy
+ - rscadd: Calm Heart merit for Kindred
+ FalloutFalcon:
+ - rscdel: Removes a few more TG crafting recipes
+ - balance: Gives varried skill requirments to a buncha recipes (most are set to
+ only need 0, a ton of the funny ones need 1-5)
+ - rscdel: removes superfluous weaknesses in favor of the trait for baali
+ - bugfix: Fixes interactions surrounding cars and transfer points
+ - bugfix: Frenzy verb is no longer displayed in the verb panel. It can still be
+ found in the context menu for mobs.
+ - qol: Frenzy verb only displays if your a supernatural
+ - qol: Combat dice-rolls are displayed more clearly
+ - bugfix: The same area name wont be shown twice when entering areas
+ - bugfix: Generate forest has a correct area name
+ Magisterium2022:
+ - bugfix: Fixed incorrect BP cost for Presence 2
+ Marshmellow105:
+ - rscadd: adds new wallpapers for mappers to use
+ - rscadd: adds new mannequin subtypes to be used by mappers
+ - rscadd: adds the FBI SWAT Response Team
+ - rscadd: three new uniform bits for FBI agents, a turtleneck, fatigues, and fatigue
+ pants
+ Stutternov:
+ - rscadd: Adds in 5.56 silver to have Agg damage to Garou. 7.62, 12g slug, and .75
+ have received silver variant ammo as well.
+ - balance: Rebalanced multiple bullets (.50 AE now exists, 5.45, 12g slug, 12g buck,
+ 12g rubber) in rather small ways. Except .50 AE, larger rebalance. (70 -> 45)
+ - balance: Rebalanced multiple melee weapons (shovel, scythe, chainsaw, baseball
+ bat, fireaxe)
+ - balance: Hard-buffs the .44 deagle by giving it ONE more round in its magazine...
+ - bugfix: Fixed shotgun slug knockdown not rolling. Not sure why this fixed it but
+ - it managed to.
+ - rscadd: Adds recoil calc stat check to reduce spread as well
+ - rscadd: Adds difficulty to recoil calc
+ - rscdel: Removes bonus damage random chance for firearm damage based on skill probability
+ check
+ - balance: Redoes some weapons recoil and spread slightly; overall changes ranged
+ from 1-2 recoil/spread so very minor.
+ chazzyjazzy:
+ - rscadd: adds the financial crisis event which wipes out people's bank accounts,
+ blame the giovannis
+ kyres, bomby:
+ - rscadd: adds a new billboard with sprites from aurora
+ obs7777:
+ - rscadd: adds czech, polish, and ukrainian as languages
+ odisurin:
+ - rscadd: adds a new magadon sign
diff --git a/html/changelogs/archive/2026-06.yml b/html/changelogs/archive/2026-06.yml
new file mode 100644
index 000000000000..5bf2e6ee4776
--- /dev/null
+++ b/html/changelogs/archive/2026-06.yml
@@ -0,0 +1,25 @@
+2026-06-01:
+ Biplume:
+ - rscadd: Garou now have their feet set as claws in Crinos, Hispo, and Lupus
+ FalloutFalcon:
+ - rscadd: 'The changing breed: Corax'
+ - rscadd: Corax gift "Enemy Ways" which gives an assessment of nearby enemies
+ - rscadd: Corax "eye drinking" a pseudo-gift that allows the fera to speak to the
+ dead and see there death
+ - balance: Razor claws lower the difficulty of claw attacks along with the existing
+ bonuses
+ - refactor: Splits up alot of stuff onto vars and procs to be overrided by other
+ changing breeds
+ - code_imp: Deaths now record some information for use in powers that speak to the
+ dead
+ - code_imp: Fixes the splat prio unit test
+ - bugfix: Spirit speech now works
+ - rscadd: '5 pt merit: Unbondable'
+ - rscadd: '5 pt merit: Touch of the Wyld'
+ - qol: merits wont be displayed if you cant take them
+ Stutternov:
+ - balance: Protean 2, 4, and 5 have proper delays added in accordance with TT discipline
+ use.
+ chazzyjazzy:
+ - bugfix: fixes artifacts from being unbinded from the user when placed into a satchel
+ - bugfix: fixes the odious chalice so that it works
diff --git a/modular_darkpack/master_files/code/controllers/subsystem/ambience.dm b/modular_darkpack/master_files/code/controllers/subsystem/ambience.dm
index 4bf30d4b6ce4..b45c8609f728 100644
--- a/modular_darkpack/master_files/code/controllers/subsystem/ambience.dm
+++ b/modular_darkpack/master_files/code/controllers/subsystem/ambience.dm
@@ -8,19 +8,19 @@
if(last_shown_area_name == new_area.name)
return
last_shown_area_name = new_area.name
- for(var/atom/movable/screen/area_text/old in client.screen)
- qdel(old)
- var/atom/movable/screen/area_text/T = new()
- client.screen += T
+ var/atom/movable/screen/area_text/T = locate() in client.screen
+ if(!T)
+ T = new()
+ client.screen += T
+ deltimer(T.timer_id)
T.maptext = MAPTEXT({"[new_area.name]"})
animate(T, alpha = 255, time = 1 SECONDS, easing = EASE_IN)
- addtimer(CALLBACK(src, PROC_REF(clear_area_text), T), 4 SECONDS)
+ T.timer_id = addtimer(CALLBACK(src, PROC_REF(clear_area_text), T), 4 SECONDS, TIMER_STOPPABLE | TIMER_DELETE_ME)
// this shouldnt be here since its not an override or a subtype of a /tg/ proc (like above) but since it's called right there i figured i'd keep things together.
-/mob/living/proc/clear_area_text(atom/movable/screen/A)
+/mob/living/proc/clear_area_text(atom/movable/screen/area_text/A)
if(!A)
return
if(!client)
return
animate(A, alpha = 0, time = 1 SECONDS, easing = EASE_OUT)
- addtimer(CALLBACK(GLOBAL_PROC, /proc/qdel, A), 2 SECONDS)
diff --git a/modular_darkpack/master_files/code/modules/client/preferences/_preference.dm b/modular_darkpack/master_files/code/modules/client/preferences/_preference.dm
index c3a008fbc7e3..27004194aab9 100644
--- a/modular_darkpack/master_files/code/modules/client/preferences/_preference.dm
+++ b/modular_darkpack/master_files/code/modules/client/preferences/_preference.dm
@@ -2,3 +2,5 @@
/// If set to TRUE, this preference will not be applied unless the character has the preference's relevant inherent trait
var/must_have_relevant_trait = FALSE
+ /// If set to TRUE, only apply preference to the mob if it acctually shows up on there sheet
+ var/must_be_accessible = FALSE
diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/_species.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/_species.dm
index 4c429d28433c..c99570f3bc4c 100644
--- a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/_species.dm
+++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/_species.dm
@@ -1,4 +1,4 @@
-/datum/species
- /// Used in get_generic_name to replace gender
- var/visible_gender_override
+/// Used in get_generic_name to replace gender
+/datum/species/proc/visible_gender_override(mob/living/carbon/human/holder)
+ return
diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/death.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/death.dm
index 7ca2cf4febe0..722471294e72 100644
--- a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/death.dm
+++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/death.dm
@@ -7,3 +7,19 @@
GLOB.masquerade_breakers_list -= src
GLOB.sabbatites -= src
+ last_death_info = new()
+ last_death_info.record_death(src)
+
+
+// Not an override. Usecases will be spread out across modules so it goes here.
+/datum/death_report
+ var/area
+ var/last_words
+ var/last_attacker_name
+ var/suicide
+
+/datum/death_report/proc/record_death(mob/living/carbon/human/dead_guy)
+ area = get_area(dead_guy)
+ last_attacker_name = dead_guy.lastattacker
+ last_words = dead_guy.last_words
+ suicide = HAS_TRAIT(dead_guy, TRAIT_SUICIDED)
diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/human_defines.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/human_defines.dm
index 4ef0b9e89206..ef1bd1877a38 100644
--- a/modular_darkpack/master_files/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/human/human_defines.dm
@@ -10,3 +10,5 @@
// Visible adjectives, used for Guestbooks.
var/visible_adjective = ""
+ /// A datum that tracks all the information at the time of there death. Used for powers that tell you the sitatuons of there demise.
+ var/datum/death_report/last_death_info
diff --git a/modular_darkpack/modules/ambience/sounds/music/chantry.ogg b/modular_darkpack/modules/ambience/sounds/music/chantry.ogg
new file mode 100644
index 000000000000..c63e2ce6c4a2
Binary files /dev/null and b/modular_darkpack/modules/ambience/sounds/music/chantry.ogg differ
diff --git a/modular_darkpack/modules/ambience/sounds/music/elysium.ogg b/modular_darkpack/modules/ambience/sounds/music/elysium.ogg
new file mode 100644
index 000000000000..a66fefee17b1
Binary files /dev/null and b/modular_darkpack/modules/ambience/sounds/music/elysium.ogg differ
diff --git a/modular_darkpack/modules/ambience/sounds/music/giovanni_moldy_old_world.ogg b/modular_darkpack/modules/ambience/sounds/music/giovanni_moldy_old_world.ogg
new file mode 100644
index 000000000000..7d54e08a3c1e
Binary files /dev/null and b/modular_darkpack/modules/ambience/sounds/music/giovanni_moldy_old_world.ogg differ
diff --git a/modular_darkpack/modules/ambience/sounds/music/strip_club.ogg b/modular_darkpack/modules/ambience/sounds/music/strip_club.ogg
new file mode 100644
index 000000000000..903478827554
Binary files /dev/null and b/modular_darkpack/modules/ambience/sounds/music/strip_club.ogg differ
diff --git a/modular_darkpack/modules/ambience/sounds/music/vtm_redemption_nyc_hub.ogg b/modular_darkpack/modules/ambience/sounds/music/vtm_redemption_nyc_hub.ogg
new file mode 100644
index 000000000000..709ee513d952
Binary files /dev/null and b/modular_darkpack/modules/ambience/sounds/music/vtm_redemption_nyc_hub.ogg differ
diff --git a/modular_darkpack/modules/antediluvian_sarcophagus/code/sarcophagus.dm b/modular_darkpack/modules/antediluvian_sarcophagus/code/sarcophagus.dm
index 7f62b6e51eb5..c5b83473689c 100644
--- a/modular_darkpack/modules/antediluvian_sarcophagus/code/sarcophagus.dm
+++ b/modular_darkpack/modules/antediluvian_sarcophagus/code/sarcophagus.dm
@@ -93,7 +93,7 @@ GLOBAL_LIST_INIT(caesar_cipher, list(
icon_state = "b_sarcophagus"
// layer = CAR_LAYER
density = TRUE
- anchored = TRUE
+ anchored = FALSE
pixel_w = -8
var/password = "Brongus"
var/passkey = 5
@@ -102,13 +102,11 @@ GLOBAL_LIST_INIT(caesar_cipher, list(
/obj/sarcophagus/Initialize(mapload)
. = ..()
password = pick(GLOB.sarcophagus_passwords)
- if(prob(50))
- passkey = rand(5, 15)
- else
- passkey = rand(-15, -5)
+ passkey = rand(5, 15)
+
//to_chat(world, span_userdanger("UNKNOWN SARCOPHAGUS POSITION HAS BEEN LEAKED"))
- if(!mapload)
- SEND_SOUND(world, sound('modular_darkpack/master_files/sounds/announce.ogg'))
+ //if(!mapload)
+ // SEND_SOUND(world, sound('modular_darkpack/master_files/sounds/announce.ogg'))
/obj/sarcophagus/examine(mob/user)
. = ..()
@@ -130,17 +128,51 @@ GLOBAL_LIST_INIT(caesar_cipher, list(
if(!pass)
return ITEM_INTERACT_BLOCKING
if(password == uppertext(pass))
- icon_state = "b_sarcophagus-open1"
- to_chat(world, span_userdanger("UNKNOWN SARCOPHAGUS HAS BEEN OPENED"))
- SEND_SOUND(world, sound('modular_darkpack/master_files/sounds/announce.ogg'))
- var/sound_length = SSsounds.get_sound_length(OPEN_SOUND)
- playsound(src, OPEN_SOUND, 100, FALSE)
- spawn(sound_length)
- icon_state = "b_sarcophagus-open0"
- new /mob/living/simple_animal/hostile/megafauna/wendigo/antediluvian(loc)
- return ITEM_INTERACT_SUCCESS
+ open_the_sarcophagus()
+ return ITEM_INTERACT_SUCCESS
+
+/obj/sarcophagus/proc/open_the_sarcophagus()
+ icon_state = "b_sarcophagus-open1"
+ to_chat(world, span_userdanger("UNKNOWN SARCOPHAGUS HAS BEEN OPENED"))
+ SEND_SOUND(world, sound('modular_darkpack/master_files/sounds/announce.ogg'))
+ var/sound_length = SSsounds.get_sound_length(OPEN_SOUND)
+ playsound(src, OPEN_SOUND, 100, FALSE)
+ spawn(sound_length)
+ icon_state = "b_sarcophagus-open0"
+ if(prob(50))
+ new /mob/living/simple_animal/hostile/megafauna/wendigo/antediluvian(loc)
+ else
+ new /mob/living/simple_animal/hostile/megafauna/colossus/antediluvian(loc)
#undef OPEN_SOUND
+/obj/sarcophagus/bomb
+
+/obj/sarcophagus/bomb/open_the_sarcophagus()
+ icon_state = "b_sarcophagus-open2"
+ to_chat(world, span_userdanger("UNKNOWN SARCOPHAGUS HAS BEEN OPENED"))
+ SEND_SOUND(world, sound('modular_darkpack/master_files/sounds/announce.ogg'))
+ playsound(src, 'sound/items/weapons/armbomb.ogg', 100, FALSE)
+ anchored = TRUE
+ addtimer(CALLBACK(src, PROC_REF(explode)), 6 SECONDS)
+
+/obj/sarcophagus/bomb/proc/explode()
+ explosion(src, devastation_range = 2, heavy_impact_range = 7, light_impact_range = 11)
+ qdel(src)
+ priority_announce(
+ "BREAKING NEWS!!! A massive explosion has been reported in your area. First responders are advised to rush to the scene as soon as possible to rescue any survivors and a curfew is issued immediately to all citizens until the city is safe.",
+ "EMERGENCY BREAKING NEWS",
+ 'modular_darkpack/modules/events/sounds/news_notification.ogg',
+ ANNOUNCEMENT_TYPE_PRIORITY,
+ color_override = "red",
+ )
+
+/obj/sarcophagus/empty
+
+/obj/sarcophagus/empty/open_the_sarcophagus()
+ icon_state = "b_sarcophagus-open0"
+ to_chat(world, span_userdanger("UNKNOWN SARCOPHAGUS HAS BEEN OPENED"))
+ SEND_SOUND(world, sound('modular_darkpack/master_files/sounds/announce.ogg'))
+
/obj/fake_sarcophagus
name = "unknown sarcophagus"
desc = "A shiver runs down your spine just looking at it..."
diff --git a/modular_darkpack/modules/antediluvian_sarcophagus/code/the_antediluvian.dm b/modular_darkpack/modules/antediluvian_sarcophagus/code/the_antediluvian.dm
index 9ab2f270ec68..9a386da72850 100644
--- a/modular_darkpack/modules/antediluvian_sarcophagus/code/the_antediluvian.dm
+++ b/modular_darkpack/modules/antediluvian_sarcophagus/code/the_antediluvian.dm
@@ -1,7 +1,7 @@
#define ANTEDILUVIAN_SCORE "Antediluvians Killed"
#define BOSS_MEDAL_ANTEDILUVIAN "Antediluvian Killer"
/mob/living/simple_animal/hostile/megafauna/wendigo/antediluvian
- name = "Unknown Antediluvian"
+ name = "Unknown Methuselah"
desc = "A mythological legendary kindred, you probably aren't going to survive this."
health = 2500
maxHealth = 2500
@@ -18,7 +18,7 @@
score_achievement_type = /datum/award/score/antediluvian_score
/mob/living/simple_animal/hostile/megafauna/colossus/antediluvian
- name = "Unknown Antediluvian"
+ name = "Unknown Methuselah"
desc = "A mythological legendary kindred, you probably aren't going to survive this."
health = 2500
maxHealth = 2500
@@ -32,13 +32,13 @@
score_achievement_type = /datum/award/score/antediluvian_score
/datum/award/achievement/boss/antediluvian_kill
- name = "Antediluvian Killer"
+ name = "Methuselah Killer"
desc = "The bigger they are... the better the loot"
database_id = BOSS_MEDAL_ANTEDILUVIAN
icon_state = "firstboss"
/datum/award/score/antediluvian_score
- name = "Antediluvian Killed"
+ name = "Methuselah Killed"
desc = "You've killed HOW many?"
database_id = ANTEDILUVIAN_SCORE
diff --git a/modular_darkpack/modules/areas/code/area_text_header.dm b/modular_darkpack/modules/areas/code/area_text_header.dm
index 2b86206e829e..a626674e7de1 100644
--- a/modular_darkpack/modules/areas/code/area_text_header.dm
+++ b/modular_darkpack/modules/areas/code/area_text_header.dm
@@ -7,3 +7,8 @@
maptext = ""
layer = SCREENTIP_LAYER
alpha = 0
+ var/timer_id
+
+/atom/movable/screen/area_text/Destroy()
+ deltimer(timer_id)
+ return ..()
diff --git a/modular_darkpack/modules/areas/code/interiors/city_interiors.dm b/modular_darkpack/modules/areas/code/interiors/city_interiors.dm
index e5697e8255e3..4a19b49ebc04 100644
--- a/modular_darkpack/modules/areas/code/interiors/city_interiors.dm
+++ b/modular_darkpack/modules/areas/code/interiors/city_interiors.dm
@@ -11,6 +11,7 @@
/area/vtm/interior/giovanni
name = "Giovanni Mansion"
icon_state = "giovanni"
+ musictracks = list('modular_darkpack/modules/ambience/sounds/music/giovanni_moldy_old_world.ogg')
zone_type = ZONE_ELYSIUM
fire_controled = TRUE
domain = TRUE
@@ -72,6 +73,7 @@
/area/vtm/interior/strip
name = "Strip Club"
icon_state = "strip"
+ musictracks = list('modular_darkpack/modules/ambience/sounds/music/strip_club.ogg')
fire_controled = TRUE
domain = TRUE
@@ -125,6 +127,7 @@
name = "Jazz Club"
icon_state = "camarilla"
ambience_index = AMBIENCE_OFFICE
+ musictracks = list('modular_darkpack/modules/ambience/sounds/music/elysium.ogg')
zone_type = ZONE_ELYSIUM
fire_controled = TRUE
domain = TRUE
@@ -198,8 +201,10 @@
name = "Theatre"
icon_state = "theatre"
music_index = MUSIC_CITY
+ musictracks = list('modular_darkpack/modules/ambience/sounds/music/theatre.ogg')
zone_type = ZONE_ELYSIUM
fire_controled = TRUE
+ forced_music = TRUE // need that epic theatre intro as soon as you walk in
/area/vtm/interior/oldchurch
name = "Old Seaside Church"
diff --git a/modular_darkpack/modules/areas/code/interiors/library.dm b/modular_darkpack/modules/areas/code/interiors/library.dm
index 7cabedf35a88..96d7802dd917 100644
--- a/modular_darkpack/modules/areas/code/interiors/library.dm
+++ b/modular_darkpack/modules/areas/code/interiors/library.dm
@@ -1,11 +1,13 @@
/area/vtm/interior/library
name = "Haight Arts Center" //Someone actually confirmed this with the IRL location.
+ musictracks = list('modular_darkpack/modules/ambience/sounds/music/elysium.ogg', 'modular_darkpack/modules/ambience/sounds/music/chantry.ogg')
domain = TRUE
/area/vtm/interior/chantry
name = "Chantry"
icon_state = "theatre"
zone_type = ZONE_ELYSIUM
+ musictracks = list('modular_darkpack/modules/ambience/sounds/music/elysium.ogg', 'modular_darkpack/modules/ambience/sounds/music/chantry.ogg')
fire_controled = TRUE
domain = TRUE
diff --git a/modular_darkpack/modules/areas/code/interiors/sewers.dm b/modular_darkpack/modules/areas/code/interiors/sewers.dm
index 5afefa11cefd..6f697089e352 100644
--- a/modular_darkpack/modules/areas/code/interiors/sewers.dm
+++ b/modular_darkpack/modules/areas/code/interiors/sewers.dm
@@ -2,7 +2,8 @@
name = "Sewer"
icon_state = "sewer"
ambience_index = AMBIENCE_SEWER
- musictracks = list('modular_darkpack/modules/ambience/sounds/music/nosferatu.ogg')
+ musictracks = list('modular_darkpack/modules/ambience/sounds/music/nosferatu.ogg', 'modular_darkpack/modules/ambience/sounds/music/enterlair.ogg')
+ forced_music = TRUE
outdoors = FALSE
zone_type = ZONE_NO_MASQUERADE
domain = TRUE
diff --git a/modular_darkpack/modules/areas/code/outsides/city_outsides.dm b/modular_darkpack/modules/areas/code/outsides/city_outsides.dm
index 66e24a6968ff..5aee8fcc4345 100644
--- a/modular_darkpack/modules/areas/code/outsides/city_outsides.dm
+++ b/modular_darkpack/modules/areas/code/outsides/city_outsides.dm
@@ -93,5 +93,6 @@
/area/vtm/outside/giovanni/courtyard
name = "Giovanni Mansion - Courtyard"
icon_state = "giovanni"
+ musictracks = list('modular_darkpack/modules/ambience/sounds/music/giovanni_moldy_old_world.ogg')
zone_type = ZONE_ELYSIUM
fire_controled = FALSE
diff --git a/modular_darkpack/modules/cargo/code/supply_packs/weapons.dm b/modular_darkpack/modules/cargo/code/supply_packs/weapons.dm
index 5d045c116ce7..3bae8b0d9f24 100644
--- a/modular_darkpack/modules/cargo/code/supply_packs/weapons.dm
+++ b/modular_darkpack/modules/cargo/code/supply_packs/weapons.dm
@@ -154,14 +154,14 @@
/datum/supply_pack/weapons/ak74
name = "Weapon (AK-74)"
desc = "Contains an AK-74."
- cost = 2200
+ cost = 2250
contains = list(/obj/item/gun/ballistic/automatic/darkpack/ak74)
crate_name = "weapon crate"
/datum/supply_pack/weapons/weaponrifle
name = "Weapon (AR-15)"
desc = "Contains an AR-15 assault rifle."
- cost = 3000
+ cost = 2500
contains = list(/obj/item/gun/ballistic/automatic/darkpack/ar15, /obj/item/ammo_box/magazine/darkpack556)
crate_name = "weapon crate"
@@ -172,6 +172,13 @@
contains = list(/obj/item/gun/ballistic/automatic/darkpack/aug, /obj/item/ammo_box/magazine/darkpackaug)
crate_name = "weapon crate"
+/datum/supply_pack/weapons/musket
+ name = "Weapon (antique musket)"
+ desc = "Contains a .75 caliber antique musket."
+ cost = 3000
+ contains = list(/obj/item/gun/ballistic/automatic/darkpack/musket, /obj/item/ammo_box/darkpack/c75)
+ crate_name = "weapon crate"
+
/datum/supply_pack/weapons/weaponcrossbow
name = "Weapon (crossbow)"
desc = "Contains a crossbow."
@@ -207,6 +214,13 @@
contains = list(/obj/item/ammo_box/darkpack/c12g/buck, /obj/item/ammo_box/darkpack/c12g/buck)
crate_name = "ammo crate"
+/datum/supply_pack/weapons/ammo12gsilver
+ name = "Ammo (12g, silver)"
+ desc = "Contains a box of 12g silver shotgun slugs."
+ cost = 4000
+ contains = list(/obj/item/ammo_box/darkpack/c12g/silver)
+ crate_name = "ammo crate"
+
/datum/supply_pack/weapons/ammo545
name = "Ammo (5.45)"
desc = "Contains a box of 5.45 ammunition."
@@ -256,12 +270,18 @@
contains = list(/obj/item/ammo_box/darkpack/c556/silver)
/datum/supply_pack/weapons/ammo50
- name = "Ammo (.50)"
- desc = "Contains a box of .50 ammunition."
+ name = "Ammo (.50 BMG)"
+ desc = "Contains a box of .50 BMG ammunition."
cost = 2500
contains = list(/obj/item/ammo_box/darkpack/c50)
crate_name = "ammo crate"
+/datum/supply_pack/weapons/ammo50ae
+ name = "Ammo (.50 AE)"
+ desc = "Conmtains a box of .50 AE ammunition"
+ cost = 1000
+ contains = list(/obj/item/ammo_box/darkpack/c50ae, /obj/item/ammo_box/darkpack/c50ae)
+
/datum/supply_pack/weapons/ammo556
name = "Ammo (5.56)"
desc = "Contains a box of 5.56 ammunition."
@@ -283,6 +303,20 @@
contains = list(/obj/item/ammo_box/darkpack/arrows, /obj/item/ammo_box/darkpack/arrows, /obj/item/ammo_box/darkpack/arrows)
crate_name = "ammo crate"
+/datum/supply_pack/weapons/ammo75
+ name = "Cartriages (.75 Ball)"
+ desc = "Contains a bag of .75 ball cartriages."
+ cost = 1000
+ contains = list(/obj/item/ammo_box/darkpack/c75)
+ crate_name = "ammo crate"
+
+/datum/supply_pack/weapons/ammo75_silver
+ name = "Cartriages (.75 Ball Silver)"
+ desc = "Contains a bag of silver .75 ball cartriages."
+ cost = 7000
+ contains = list(/obj/item/ammo_box/darkpack/c75/silver)
+ crate_name = "ammo crate"
+
/datum/supply_pack/weapons/magazine_colt1911
name = "Ammo (3x Colt M1911 magazine)"
desc = "Contains three Colt M1911 magazines."
diff --git a/modular_darkpack/modules/cars/code/car.dm b/modular_darkpack/modules/cars/code/car.dm
index 53d9d4be11a7..15bea8e12e18 100644
--- a/modular_darkpack/modules/cars/code/car.dm
+++ b/modular_darkpack/modules/cars/code/car.dm
@@ -85,7 +85,7 @@
var/list/passengers = list()
var/max_passengers = 3
- var/speed = 1 //Future
+ var/speed = 1 //Future
var/stage = 1
var/on = FALSE
var/locked = TRUE
@@ -473,6 +473,17 @@
if(!prev_speed)
return
+ if(istype(bumped_atom, /obj/transfer_point_vamp))
+ COOLDOWN_START(src, impact_delay, 0.75 SECONDS)
+ /*
+ speed_in_pixels = 0
+ last_pos["x_pix"] = 0
+ last_pos["y_pix"] = 0
+ last_pos["x_frwd"] = 0
+ last_pos["y_frwd"] = 0
+ */
+ return
+
if(istype(bumped_atom, /mob/living))
var/mob/living/hit_mob = bumped_atom
switch(hit_mob.mob_size)
@@ -553,6 +564,7 @@
pixel_y = last_pos["y_pix"]
var/moved_x = round(sin(used_vector)*used_speed)
var/moved_y = round(cos(used_vector)*used_speed)
+ var/bump_target
if(used_speed != 0)
var/true_movement_angle = used_vector
if(used_speed < 0)
@@ -569,6 +581,10 @@
if(debug_car)
// For visualising path of car.
new /obj/effect/temp_visual/telegraphing/car(T)
+
+ if(hit_turf == get_turf(src))
+ continue // Avoid spam bumping and trapping us inside of a dense turf.
+
var/dist_to_hit = get_dist_in_pixels(last_pos["x"]*32+last_pos["x_pix"], last_pos["y"]*32+last_pos["y_pix"], T.x*32, T.y*32)
if(dist_to_hit <= abs(used_speed))
var/list/stuff = T.get_blocking_contents(FALSE, src)
@@ -579,7 +595,8 @@
// For visualising hit tile of car.
new /obj/effect/temp_visual/telegraphing(T)
if(hit_turf)
- Bump(pick(hit_turf.get_blocking_contents(FALSE, src)))
+ if(COOLDOWN_FINISHED(src, impact_delay))
+ bump_target = pick(hit_turf.get_blocking_contents(FALSE, src))
// to_chat(world, "I can't pass that [hit_turf] at [hit_turf.x] x [hit_turf.y] cause of [pick(hit_turf.unpassable)] FUCK")
// var/bearing = get_angle_raw(x, y, pixel_x, pixel_y, hit_turf.x, hit_turf.y, 0, 0)
var/actual_distance = get_dist_in_pixels(last_pos["x"]*32+last_pos["x_pix"], last_pos["y"]*32+last_pos["y_pix"], hit_turf.x*32, hit_turf.y*32)-32
@@ -611,6 +628,9 @@
animate(src, pixel_x = last_pos["x_pix"]+moved_x, pixel_y = last_pos["y_pix"]+moved_y, SScarpool.wait, 1)
update_last_pos(moved_x, moved_y)
+ if(bump_target)
+ Bump(bump_target)
+
/obj/darkpack_car/proc/handle_npc_dodge(turf/target, angle)
for(var/turf/T in get_line(src, target))
var/list/unpassable = T.get_blocking_contents(FALSE, src)
@@ -723,8 +743,10 @@
movement_vector = SIMPLIFY_DEGREES(movement_vector+adjust_true*drift)
/obj/darkpack_car/proc/apply_vector_angle()
+ var/new_dir = angle2dir(movement_vector)
+ setDir(new_dir)
+
var/turn_state = round(SIMPLIFY_DEGREES(movement_vector + 22.5) / 45)
- setDir(GLOB.modulo_angle_to_dir[turn_state + 1])
var/minus_angle = turn_state * 45
var/matrix/M = matrix()
diff --git a/modular_darkpack/modules/cars/code/car_subsystem.dm b/modular_darkpack/modules/cars/code/car_subsystem.dm
index 00e94e9ec1b9..3ec59b4437d7 100644
--- a/modular_darkpack/modules/cars/code/car_subsystem.dm
+++ b/modular_darkpack/modules/cars/code/car_subsystem.dm
@@ -3,4 +3,4 @@ PROCESSING_SUBSYSTEM_DEF(carpool)
ss_flags = SS_POST_FIRE_TIMING|SS_NO_INIT
priority = FIRE_PRIORITY_OBJ
runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
- wait = 5
+ wait = 0.5 SECONDS
diff --git a/modular_darkpack/modules/deprecated/icons/32x48.dmi b/modular_darkpack/modules/deprecated/icons/32x48.dmi
index d3b06fc711f3..44202e3ea1c2 100644
Binary files a/modular_darkpack/modules/deprecated/icons/32x48.dmi and b/modular_darkpack/modules/deprecated/icons/32x48.dmi differ
diff --git a/modular_darkpack/modules/deprecated/icons/hispo.dmi b/modular_darkpack/modules/deprecated/icons/hispo.dmi
deleted file mode 100644
index 51672f049cc7..000000000000
Binary files a/modular_darkpack/modules/deprecated/icons/hispo.dmi and /dev/null differ
diff --git a/modular_darkpack/modules/events/code/landmarks/event_landmarks.dm b/modular_darkpack/modules/events/code/landmarks/event_landmarks.dm
index b5879141ffee..6ff7dd79cd47 100644
--- a/modular_darkpack/modules/events/code/landmarks/event_landmarks.dm
+++ b/modular_darkpack/modules/events/code/landmarks/event_landmarks.dm
@@ -1,3 +1,7 @@
+/obj/effect/landmark/event_spawn/sarcophagus
+ name = "sarcophagus event spawn"
+ icon_state = "navigate"
+
/obj/effect/landmark/event_spawn/szlachta
name = "szlachta event spawn"
icon = 'modular_darkpack/modules/events/icons/event_landmarks.dmi'
diff --git a/modular_darkpack/modules/events/code/sarcophagus_event.dm b/modular_darkpack/modules/events/code/sarcophagus_event.dm
new file mode 100644
index 000000000000..bb9ef472a19b
--- /dev/null
+++ b/modular_darkpack/modules/events/code/sarcophagus_event.dm
@@ -0,0 +1,61 @@
+/datum/round_event_control/darkpack/sarcophagus
+ name = "Sarcophagus"
+ typepath = /datum/round_event/sarcophagus
+ weight = 1
+ min_players = 20
+ max_occurrences = 1
+ earliest_start = 70 MINUTES
+ category = EVENT_CATEGORY_INVASION
+ description = "A strange sarcophagus has appeared in the city..."
+ darkpack_allowed = TRUE
+
+/datum/round_event_control/darkpack/sarcophagus/can_spawn_event(players_amt, allow_magic)
+ . = ..()
+ var/list/valid_landmarks = list()
+ for(var/obj/effect/landmark/event_spawn/sarcophagus/L in GLOB.generic_event_spawns)
+ var/player_nearby = FALSE
+ for(var/mob/living/nearby_mob in view(DEFAULT_SIGHT_DISTANCE, L.loc))
+ if(nearby_mob.client)
+ player_nearby = TRUE
+ break
+ if(!player_nearby)
+ valid_landmarks += L
+
+ return length(valid_landmarks) >= 2
+
+/datum/round_event/sarcophagus
+ start_when = 1
+ announce_when = 5
+
+/datum/round_event/sarcophagus/announce(fake)
+ priority_announce(
+ "You receive a notification about a viral Endpost - a respected archaeologist notes that the location of a long-lost Assyrian sarcophagus alongside it's key, which was famously stolen, seems to be in your city according to newly published criminological records tracking the suspected thief.",
+ "Viral News Story",
+ 'modular_darkpack/modules/events/sounds/news_notification.ogg',
+ ANNOUNCEMENT_TYPE_PRIORITY,
+ color_override = "yellow",
+ )
+
+/datum/round_event/sarcophagus/start()
+ var/list/landmarks = list()
+ for(var/obj/effect/landmark/event_spawn/sarcophagus/L in GLOB.generic_event_spawns)
+ // dont spawn if a player is nearby we don't need them popping in unrealistically
+ var/player_nearby = FALSE
+ for(var/mob/living/nearby_mob in view(DEFAULT_SIGHT_DISTANCE, L.loc))
+ if(nearby_mob.client)
+ player_nearby = TRUE
+ break
+ if(player_nearby)
+ continue
+ landmarks += L
+
+ if(length(landmarks) < 2)
+ return
+
+ var/obj/effect/landmark/event_spawn/sarcophagus/sarcophagus_landmark = pick(landmarks)
+ landmarks -= sarcophagus_landmark
+ var/obj/effect/landmark/event_spawn/sarcophagus/key_landmark = pick(landmarks)
+
+ var/sarcophagus_type = pick(list(/obj/sarcophagus/bomb, /obj/sarcophagus, /obj/sarcophagus/empty))
+ new sarcophagus_type(sarcophagus_landmark.loc)
+ new /obj/item/sarcophagus_key(key_landmark.loc)
diff --git a/modular_darkpack/modules/events/icons/event_landmarks.dmi b/modular_darkpack/modules/events/icons/event_landmarks.dmi
index cef1b3eb4822..258d9218df99 100644
Binary files a/modular_darkpack/modules/events/icons/event_landmarks.dmi and b/modular_darkpack/modules/events/icons/event_landmarks.dmi differ
diff --git a/modular_darkpack/modules/frenzy/code/frenzy.dm b/modular_darkpack/modules/frenzy/code/frenzy.dm
index 140f88bf5963..ea4acc24b92d 100644
--- a/modular_darkpack/modules/frenzy/code/frenzy.dm
+++ b/modular_darkpack/modules/frenzy/code/frenzy.dm
@@ -119,10 +119,9 @@
return frenzy_result
-/mob/living/carbon/human/verb/manual_frenzy_roll(atom/movable/AM as mob|obj in oview(DEFAULT_SIGHT_DISTANCE))
+/mob/living/carbon/human/proc/manual_frenzy_roll(atom/movable/AM as mob|obj in oview(DEFAULT_SIGHT_DISTANCE))
set name = "Manual Frenzy Roll"
set desc = "Trigger a roll for a frenzy"
- set category = "Object"
if(!istype(AM))
return
@@ -138,7 +137,6 @@
/mob/living/carbon/human/proc/manual_frenzy(atom/movable/AM as mob|obj in oview(DEFAULT_SIGHT_DISTANCE))
set name = "Manual Frenzy"
set desc = "Enter a frenzy at will"
- set category = "Object"
if(!istype(AM))
return
diff --git a/modular_darkpack/modules/graveyard/code/graveyard_area.dm b/modular_darkpack/modules/graveyard/code/graveyard_area.dm
index 8c03394b7d26..23b76cdc264b 100644
--- a/modular_darkpack/modules/graveyard/code/graveyard_area.dm
+++ b/modular_darkpack/modules/graveyard/code/graveyard_area.dm
@@ -2,7 +2,7 @@
name = "Graveyard"
icon_state = "graveyard"
ambience_index = AMBIENCE_OFFICE
- musictracks = list('modular_darkpack/modules/ambience/sounds/music/infected_warehouse.ogg')
+ musictracks = list('modular_darkpack/modules/ambience/sounds/music/infected_warehouse.ogg', 'modular_darkpack/modules/ambience/sounds/music/giovanni_moldy_old_world.ogg')
outdoors = TRUE
zone_type = ZONE_NO_MASQUERADE
@@ -11,4 +11,4 @@
icon_state = "interior"
outdoors = FALSE
zone_type = ZONE_NO_MASQUERADE
- musictracks = list('modular_darkpack/modules/ambience/sounds/music/enterlair.ogg')
+ musictracks = list('modular_darkpack/modules/ambience/sounds/music/enterlair.ogg', 'modular_darkpack/modules/ambience/sounds/music/giovanni_moldy_old_world.ogg')
diff --git a/modular_darkpack/modules/guestbook/code/human_helpers.dm b/modular_darkpack/modules/guestbook/code/human_helpers.dm
index 27103c3e0b7d..caffb332351c 100644
--- a/modular_darkpack/modules/guestbook/code/human_helpers.dm
+++ b/modular_darkpack/modules/guestbook/code/human_helpers.dm
@@ -7,8 +7,9 @@
visible_gender = "Woman"
else
visible_gender = "Person"
- if(dna?.species.visible_gender_override)
- visible_gender = dna.species.visible_gender_override
+ var/override = dna?.species.visible_gender_override(src)
+ if(override)
+ visible_gender = override
return visible_gender
diff --git a/modular_darkpack/modules/jobs/code/_job_assignment.dm b/modular_darkpack/modules/jobs/code/_job_assignment.dm
index d73b23cacffc..b88b7df1f5ad 100644
--- a/modular_darkpack/modules/jobs/code/_job_assignment.dm
+++ b/modular_darkpack/modules/jobs/code/_job_assignment.dm
@@ -72,7 +72,7 @@
return JOB_UNAVAILABLE_KINDRED_CLAN
/datum/controller/subsystem/job/proc/check_garou_prefs(client/player_client, mob/dead/new_player/player, datum/job/possible_job, debug_prefix = "", add_job_to_log = FALSE)
- var/datum/subsplat/werewolf/auspice/auspice = get_fera_auspice(player_client.prefs.read_preference(/datum/preference/choiced/subsplat/garou_auspice))
+ var/datum/subsplat/werewolf/auspice/auspice = get_fera_auspice(player_client.prefs.read_preference(/datum/preference/choiced/subsplat/fera_auspice/garou))
if(possible_job.allowed_auspice && !(auspice.name in possible_job.allowed_auspice))
job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_FERA_AUSPICE, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]")
return JOB_UNAVAILABLE_FERA_AUSPICE
@@ -80,7 +80,7 @@
job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_FERA_AUSPICE, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]")
return JOB_UNAVAILABLE_FERA_AUSPICE
- var/datum/subsplat/werewolf/tribe/tribe = get_fera_tribe(player_client.prefs.read_preference(/datum/preference/choiced/subsplat/garou_tribe))
+ var/datum/subsplat/werewolf/tribe/tribe = get_fera_tribe(player_client.prefs.read_preference(/datum/preference/choiced/subsplat/fera_tribe/garou))
if(possible_job.allowed_tribes && !(tribe.name in possible_job.allowed_tribes))
job_debug("[debug_prefix] Error: [get_job_unavailable_error_message(JOB_UNAVAILABLE_FERA_TRIBE, possible_job.title)], Player: [player][add_job_to_log ? ", Job: [possible_job]" : ""]")
return JOB_UNAVAILABLE_FERA_TRIBE
diff --git a/modular_darkpack/modules/jobs/code/miscelllaneous/graveyard_keeper.dm b/modular_darkpack/modules/jobs/code/miscelllaneous/graveyard_keeper.dm
index 16fb2ee3be9a..f2ea5d880dff 100644
--- a/modular_darkpack/modules/jobs/code/miscelllaneous/graveyard_keeper.dm
+++ b/modular_darkpack/modules/jobs/code/miscelllaneous/graveyard_keeper.dm
@@ -31,7 +31,8 @@
l_pocket = /obj/item/smartphone
r_pocket = /obj/item/vamp/keys/graveyard
r_hand = /obj/item/shovel/vamp
- backpack_contents = list(/obj/item/card/credit=1, /obj/item/scythe/vamp=1)
+ belt = /obj/item/scythe/vamp
+ backpack_contents = list(/obj/item/card/credit=1)
backpack = /obj/item/storage/backpack
satchel = /obj/item/storage/backpack/satchel
diff --git a/modular_darkpack/modules/jobs/code/sabbat/sabbat.dm b/modular_darkpack/modules/jobs/code/sabbat/sabbat.dm
index edc5b778f39b..2868d0a58a05 100644
--- a/modular_darkpack/modules/jobs/code/sabbat/sabbat.dm
+++ b/modular_darkpack/modules/jobs/code/sabbat/sabbat.dm
@@ -3,7 +3,8 @@
l_pocket = /obj/item/smartphone
r_pocket = /obj/item/flashlight
suit = /obj/item/clothing/suit/vampire/trench
- backpack_contents = list(/obj/item/vampire_stake=3, /obj/item/gun/ballistic/revolver/darkpack/magnum=1, /obj/item/knife/vamp=1, /obj/item/vamp/keys/hack=1, /obj/item/scythe/vamp=1, /obj/item/vamp/keys/sabbat=1)
+ belt = /obj/item/scythe/vamp
+ backpack_contents = list(/obj/item/vampire_stake=3, /obj/item/gun/ballistic/revolver/darkpack/magnum=1, /obj/item/knife/vamp=1, /obj/item/vamp/keys/hack=1, /obj/item/vamp/keys/sabbat=1)
/datum/outfit/job/vampire/sabbatist/post_equip(mob/living/carbon/human/H)
..()
diff --git a/modular_darkpack/modules/jobs/code/tremere/archivist.dm b/modular_darkpack/modules/jobs/code/tremere/archivist.dm
index 4d6b9d801257..cbabd92d415c 100644
--- a/modular_darkpack/modules/jobs/code/tremere/archivist.dm
+++ b/modular_darkpack/modules/jobs/code/tremere/archivist.dm
@@ -29,7 +29,8 @@
shoes = /obj/item/clothing/shoes/vampire
gloves = /obj/item/clothing/gloves/vampire/latex
uniform = /obj/item/clothing/under/vampire/archivist
+ belt = /obj/item/scythe/vamp
r_pocket = /obj/item/vamp/keys/archive
l_pocket = /obj/item/smartphone/archivist
accessory = /obj/item/clothing/accessory/pocketprotector/full
- backpack_contents = list(/obj/item/ritual_tome/arcane=1, /obj/item/card/credit=1, /obj/item/scythe/vamp=1)
+ backpack_contents = list(/obj/item/ritual_tome/arcane=1, /obj/item/card/credit=1)
diff --git a/modular_darkpack/modules/jobs/code/tremere/gargoyle.dm b/modular_darkpack/modules/jobs/code/tremere/gargoyle.dm
index ff958291fee0..1c9358248927 100644
--- a/modular_darkpack/modules/jobs/code/tremere/gargoyle.dm
+++ b/modular_darkpack/modules/jobs/code/tremere/gargoyle.dm
@@ -30,11 +30,11 @@
uniform = /obj/item/clothing/under/vampire/turtleneck_black
suit = /obj/item/clothing/suit/hooded/robes/tremere
mask = /obj/item/clothing/mask/vampire/venetian_mask
+ belt = /obj/item/scythe/vamp
r_pocket = /obj/item/vamp/keys/archive
l_pocket = /obj/item/smartphone/gargoyle
accessory = /obj/item/clothing/accessory/pocketprotector/full
backpack_contents = list(
/obj/item/ritual_tome/arcane = 1,
/obj/item/card/credit = 1,
- /obj/item/scythe/vamp = 1,
)
diff --git a/modular_darkpack/modules/jobs/code/tremere/regent.dm b/modular_darkpack/modules/jobs/code/tremere/regent.dm
index 95a8c6a66126..711fc9809a4a 100644
--- a/modular_darkpack/modules/jobs/code/tremere/regent.dm
+++ b/modular_darkpack/modules/jobs/code/tremere/regent.dm
@@ -34,5 +34,6 @@
r_pocket = /obj/item/vamp/keys/regent
l_pocket = /obj/item/smartphone/tremere_regent
accessory = /obj/item/clothing/accessory/pocketprotector/full
- backpack_contents = list(/obj/item/phone_book=1, /obj/item/ritual_tome/arcane=1, /obj/item/card/credit/elder=1, /obj/item/scythe/vamp=1)
+ belt = /obj/item/scythe/vamp
+ backpack_contents = list(/obj/item/phone_book=1, /obj/item/ritual_tome/arcane=1, /obj/item/card/credit/elder=1)
diff --git a/modular_darkpack/modules/mannequin/code/mannequin_subtypes.dm b/modular_darkpack/modules/mannequin/code/mannequin_subtypes.dm
index 049a2952688f..42c68f948728 100644
--- a/modular_darkpack/modules/mannequin/code/mannequin_subtypes.dm
+++ b/modular_darkpack/modules/mannequin/code/mannequin_subtypes.dm
@@ -45,3 +45,43 @@
/obj/item/clothing/under/vampire/gangrel/female,
))
. = ..()
+
+/obj/structure/mannequin/plastic/soviet
+ starting_items = list(
+ /obj/item/clothing/head/helmet/rus_ushanka,
+ /obj/item/clothing/shoes/vampire/jackboots/high,
+ /obj/item/clothing/under/costume/soviet,
+ /obj/item/clothing/suit/costume/soviet
+ )
+
+/obj/structure/mannequin/plastic/nemes
+ starting_items = list(
+ /obj/item/clothing/head/costume/nemes,
+ /obj/item/clothing/shoes/sandal,
+ /obj/item/clothing/under/costume/loincloth,
+ /obj/item/clothing/suit/costume/nemes
+ )
+
+/obj/structure/mannequin/plastic/roman
+ starting_items = list(
+ /obj/item/clothing/head/helmet/roman,
+ /obj/item/clothing/shoes/roman,
+ /obj/item/clothing/under/costume/roman,
+ /obj/item/shield/roman/fake
+ )
+
+/obj/structure/mannequin/plastic/medieval
+ starting_items = list(
+ /obj/item/clothing/head/helmet/military,
+ /obj/item/clothing/shoes/vampire/jackboots/work,
+ /obj/item/clothing/under/costume/gamberson/military,
+ /obj/item/clothing/suit/armor/vest/military
+ )
+
+/obj/structure/mannequin/plastic/dutch
+ starting_items = list(
+ /obj/item/clothing/head/vampire/cowboy,
+ /obj/item/clothing/shoes/cowboy/black,
+ /obj/item/clothing/under/costume/dutch,
+ /obj/item/clothing/suit/vampire/trench
+ )
diff --git a/modular_darkpack/modules/masquerade/code/masquerade_contract.dm b/modular_darkpack/modules/masquerade/code/masquerade_contract.dm
index 69f5c450cbcd..6202168b5a31 100644
--- a/modular_darkpack/modules/masquerade/code/masquerade_contract.dm
+++ b/modular_darkpack/modules/masquerade/code/masquerade_contract.dm
@@ -26,7 +26,7 @@
location_info = "[get_area_name(turf)], X:[turf.x] Y:[turf.y] Z:[turf.z]"
else
location_info = "[get_area_name(turf)]"
- to_chat(user, span_info("[breacher.real_name], Masquerade: [breacher.masquerade_score], Diablerist: [HAS_TRAIT(breacher, TRAIT_DIABLERIE) ? "YES" : "NO"], [location_info]"))
+ to_chat(user, span_info("[breacher.real_name], Masquerade: [breacher.masquerade_score], Diablerist: [(HAS_TRAIT(breacher, TRAIT_DIABLERIE) && !HAS_TRAIT(breacher, TRAIT_HIDDEN_DIABLERIE)) ? "YES" : "NO"], [location_info]"))
if(!GLOB.masquerade_breakers_list)
to_chat(user, span_info("No available Masquerade breakers in city..."))
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/hidden_diablerie.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/hidden_diablerie.dm
new file mode 100644
index 000000000000..1f42e7d71d3c
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/hidden_diablerie.dm
@@ -0,0 +1,8 @@
+//Vampire the Masquerade 20th Anniversary Edition, 493
+/datum/quirk/darkpack/hidden_diablerie
+ name = "Hidden Diablerie"
+ desc = "The tell-tale black streaks of diablerie do not manifest in your aura."
+ value = 3
+ mob_trait = TRAIT_HIDDEN_DIABLERIE
+ allowed_splats = list(SPLAT_KINDRED)
+ icon = FA_ICON_WINE_GLASS_EMPTY
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/touch_of_the_wyld.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/touch_of_the_wyld.dm
new file mode 100644
index 000000000000..fc856b52a887
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/touch_of_the_wyld.dm
@@ -0,0 +1,8 @@
+// Vampire: The Wild West
+/datum/quirk/darkpack/touch_of_the_wyld
+ name = "Touch of the Wyld"
+ desc = "Unlike nearly all other undead, you have no obvious Wyrmtaint. You are invisible to those who have the ability to naturally sense the Wyrm."
+ value = 5
+ mob_trait = TRAIT_HIDDEN_WYRMTAINT
+ icon = FA_ICON_TEMPERATURE_HIGH
+ allowed_splats = list(SPLAT_KINDRED)
diff --git a/modular_darkpack/modules/merits_flaws/code/positive_quirks/unbondable.dm b/modular_darkpack/modules/merits_flaws/code/positive_quirks/unbondable.dm
new file mode 100644
index 000000000000..2d2faa1b2436
--- /dev/null
+++ b/modular_darkpack/modules/merits_flaws/code/positive_quirks/unbondable.dm
@@ -0,0 +1,16 @@
+// V20 p. 494
+/datum/quirk/darkpack/unbondable
+ name = "Unbondable"
+ desc = "You are immune to being blood bound. Tremere cannot take this Merit."
+ value = 5
+ mob_trait = TRAIT_UNBONDABLE
+ icon = FA_ICON_CHAIN_BROKEN
+ allowed_splats = list(SPLAT_KINDRED)
+ excluded_clans = list(VAMPIRE_CLAN_TREMERE)
+
+
+/datum/quirk/darkpack/unbondable/ghoul
+ name = "Unbondable (Ghoul)"
+ desc = "You are immune to being blood bound.."
+ value = 6
+ allowed_splats = list(SPLAT_GHOUL)
diff --git a/modular_darkpack/modules/occult_artifacts/code/_artifact.dm b/modular_darkpack/modules/occult_artifacts/code/_artifact.dm
index b68d7037b54e..8c83dbfe63a6 100644
--- a/modular_darkpack/modules/occult_artifacts/code/_artifact.dm
+++ b/modular_darkpack/modules/occult_artifacts/code/_artifact.dm
@@ -57,6 +57,8 @@
grant_powers()
/obj/item/occult_artifact/proc/unbind(mob/user)
+ if(src in owner?.get_all_contents()) // dont unbind if the user has just placed the artifact in their bag - which counts as dropping it
+ return
var/datum/controller/subsystem/processing/subsystem = locate(subsystem_type) in Master.subsystems
STOP_PROCESSING(subsystem, src)
diff --git a/modular_darkpack/modules/occult_artifacts/code/artifacts/heart_of_eliza.dm b/modular_darkpack/modules/occult_artifacts/code/artifacts/heart_of_eliza.dm
index f84fa5fb8ba6..90b0cff312c4 100644
--- a/modular_darkpack/modules/occult_artifacts/code/artifacts/heart_of_eliza.dm
+++ b/modular_darkpack/modules/occult_artifacts/code/artifacts/heart_of_eliza.dm
@@ -10,4 +10,4 @@
/obj/item/occult_artifact/vampire/heart_of_eliza/ungrant_powers()
. = ..()
- owner.st_remove_stat_mod(STAT_STRENGTH, 1, type)
+ owner.st_remove_stat_mod(STAT_STRENGTH, type)
diff --git a/modular_darkpack/modules/occult_artifacts/code/artifacts/odious_chalice.dm b/modular_darkpack/modules/occult_artifacts/code/artifacts/odious_chalice.dm
index ac6a05228d28..56380ddee90f 100644
--- a/modular_darkpack/modules/occult_artifacts/code/artifacts/odious_chalice.dm
+++ b/modular_darkpack/modules/occult_artifacts/code/artifacts/odious_chalice.dm
@@ -4,16 +4,43 @@
icon_state = "o_chalice"
var/stored_blood = 0
research_value = 30
+ COOLDOWN_DECLARE(chalice_alert_cooldown)
/obj/item/occult_artifact/vampire/odious_chalice/examine(mob/user)
. = ..()
. += "[src] contains [stored_blood] blood points..."
+/obj/item/occult_artifact/vampire/odious_chalice/grant_powers()
+ . = ..()
+ RegisterSignal(owner, COMSIG_MOB_ITEM_ATTACK, PROC_REF(on_attack))
+
+/obj/item/occult_artifact/vampire/odious_chalice/proc/on_attack(mob/living/source, mob/living/target, mob/living/user, list/modifiers, list/attack_modifiers)
+ if(!identified)
+ return
+ var/obj/item/weapon = source.get_active_held_item()
+ if(!weapon?.get_sharpness())
+ return
+ if(!prob(50))
+ return
+ if(!(src in source.get_all_contents()))
+ return
+ if(!target.bloodpool && !target.blood_volume)
+ return
+ stored_blood++
+ if(COOLDOWN_FINISHED(src, chalice_alert_cooldown))
+ //rather spammy. 1 scene cooldown
+ balloon_alert(source, "the chalice drinks...")
+ COOLDOWN_START(src, chalice_alert_cooldown, 1 SCENES)
+
+/obj/item/occult_artifact/vampire/odious_chalice/ungrant_powers()
+ . = ..()
+ UnregisterSignal(owner, COMSIG_MOB_ITEM_ATTACK)
+
/obj/item/occult_artifact/vampire/odious_chalice/attack(mob/living/M, mob/living/user)
. = ..()
if(!get_kindred_splat(M))
return
- if(!stored_blood)
+ if(stored_blood <= 0)
return
if(!identified)
return
@@ -21,5 +48,6 @@
M.adjust_fire_loss(-5*stored_blood, TRUE)
M.update_damage_overlays()
M.update_health_hud()
+ stored_blood--
playsound(M.loc,'sound/items/drink.ogg', 50, TRUE)
return
diff --git a/modular_darkpack/modules/occult_artifacts/code/fetishes/nyxs_bangle.dm b/modular_darkpack/modules/occult_artifacts/code/fetishes/nyxs_bangle.dm
index ebef20658b84..d8930fc395a9 100644
--- a/modular_darkpack/modules/occult_artifacts/code/fetishes/nyxs_bangle.dm
+++ b/modular_darkpack/modules/occult_artifacts/code/fetishes/nyxs_bangle.dm
@@ -18,10 +18,8 @@
/obj/item/occult_artifact/werewolf/nyxs_bangle/ungrant_powers()
. = ..()
-
owner.alpha = 255
-
/obj/item/occult_artifact/werewolf/nyxs_bangle/process(seconds_per_tick)
. = ..()
diff --git a/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm b/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm
index 4f71dab12c0f..8b8ed738a0c3 100644
--- a/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm
+++ b/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm
@@ -153,7 +153,7 @@
if(examine_message && quality)
examine_message += " You sense [quality]."
examine_message += "\n \n" // makes the below stand out more
- if(HAS_TRAIT(parent_mob, TRAIT_DIABLERIE))
+ if(HAS_TRAIT(parent_mob, TRAIT_DIABLERIE) && !HAS_TRAIT(parent_mob, TRAIT_HIDDEN_DIABLERIE))
examine_message += "Black veins pulse through [parent_mob.p_their()] aura."
if(HAS_TRAIT(parent_mob, TRAIT_FRENETIC_AURA))
examine_message += "[parent_mob.p_Their()] aura appears especially energetic."
@@ -273,7 +273,7 @@
aura_smoke_image.color = aura_appearance.color
aura_smoke_image.alpha = 50
- if(HAS_TRAIT(parent_mob, TRAIT_DIABLERIE))
+ if(HAS_TRAIT(parent_mob, TRAIT_DIABLERIE) && !HAS_TRAIT(parent_mob, TRAIT_HIDDEN_DIABLERIE))
var/mutable_appearance/diablerie_image = mutable_appearance('modular_darkpack/modules/powers/icons/auras.dmi', "diab", ABOVE_MOB_LAYER + 1, parent_mob, ABOVE_GAME_PLANE)
holder.add_overlay(diablerie_image)
aura_classic_image.color = "#1717178b"
diff --git a/modular_darkpack/modules/powers/code/discipline/protean/protean.dm b/modular_darkpack/modules/powers/code/discipline/protean/protean.dm
index 6bcfcaaf2343..90bda291fa83 100644
--- a/modular_darkpack/modules/powers/code/discipline/protean/protean.dm
+++ b/modular_darkpack/modules/powers/code/discipline/protean/protean.dm
@@ -71,6 +71,14 @@
grouped_powers = list()
+/datum/discipline_power/protean/feral_claws/pre_activation_checks(atom/target)
+ . = ..()
+ if(do_after(owner, 1 TURNS, timed_action_flags = IGNORE_USER_LOC_CHANGE))
+ return TRUE
+ else
+ to_chat(owner, span_warning("You are rendered unable to transform!"))
+ return FALSE
+
/datum/discipline_power/protean/feral_claws/activate()
. = ..()
owner.drop_all_held_items()
@@ -158,6 +166,14 @@
var/datum/action/cooldown/spell/shapeshift/gangrel/beast_form/gangy_form
+/datum/discipline_power/protean/shape_of_the_beast/pre_activation_checks(atom/target)
+ . = ..()
+ if(do_after(owner, 3 TURNS, timed_action_flags = IGNORE_USER_LOC_CHANGE))
+ return TRUE
+ else
+ to_chat(owner, span_warning("You are rendered unable to transform!"))
+ return FALSE
+
/datum/discipline_power/protean/shape_of_the_beast/activate()
. = ..()
if(gangy_form)
@@ -198,6 +214,14 @@
var/datum/action/cooldown/spell/shapeshift/gangrel/mist/mist_form
+/datum/discipline_power/protean/mist_form/pre_activation_checks(atom/target)
+ . = ..()
+ if(do_after(owner, 3 TURNS, timed_action_flags = IGNORE_USER_LOC_CHANGE))
+ return TRUE
+ else
+ to_chat(owner, span_warning("You are rendered unable to transform!"))
+ return FALSE
+
/datum/discipline_power/protean/mist_form/activate()
. = ..()
if(mist_form)
diff --git a/modular_darkpack/modules/splats/code/__splat.dm b/modular_darkpack/modules/splats/code/__splat.dm
index 0791d389f72f..2a9a085c33c4 100644
--- a/modular_darkpack/modules/splats/code/__splat.dm
+++ b/modular_darkpack/modules/splats/code/__splat.dm
@@ -36,6 +36,9 @@
/// Base type of the powers that this splat has
var/power_type
+ /// Can frenzy and is given a verb to manually do it.
+ var/can_frenzy = TRUE
+
/// Splats that someone with this splat cannot gain
var/list/incompatible_splats
diff --git a/modular_darkpack/modules/splats/code/gaining_splats.dm b/modular_darkpack/modules/splats/code/gaining_splats.dm
index 78b932c6b86c..ce2a3c064e14 100644
--- a/modular_darkpack/modules/splats/code/gaining_splats.dm
+++ b/modular_darkpack/modules/splats/code/gaining_splats.dm
@@ -37,6 +37,9 @@
add_actions()
add_biotypes()
+ if(can_frenzy)
+ add_verb(owner, /mob/living/carbon/human/proc/manual_frenzy_roll)
+
on_gain()
if(owner.hud_used)
diff --git a/modular_darkpack/modules/splats/code/splat_management.dm b/modular_darkpack/modules/splats/code/splat_management.dm
index 3d25638c9a55..04b1e4b14c09 100644
--- a/modular_darkpack/modules/splats/code/splat_management.dm
+++ b/modular_darkpack/modules/splats/code/splat_management.dm
@@ -55,7 +55,7 @@
*/
/mob/living/proc/is_splat_compatible(splat_type)
for (var/datum/splat/splat as anything in splats)
- if (splat_type in splat.incompatible_splats)
+ if (is_type_in_list(splat_type, splat.incompatible_splats))
return FALSE
if (splat.type == splat_type)
return FALSE
diff --git a/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm b/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm
index 0fabf7e4701e..eb62e412dbbe 100644
--- a/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm
+++ b/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm
@@ -11,6 +11,9 @@
var/roll_output_type = ROLL_PUBLIC
/// This is a roll that can proc multiple times in rapid sucession and thus has weaker or less notible outputs (forced runechat and quieter dice rolls)
var/spammy_roll = FALSE
+ /// If set, a character or unicode appended to the front of balloon alerts to help convey what the roll is for.
+ var/alert_prefix
+ var/alert_delay
/// A lazy list of times indexed by a weakref to a mob
var/list/mobs_last_rolled
@@ -81,16 +84,27 @@
to_chat(player_mob, output_combined, MESSAGE_TYPE_INFO, trailing_newline = FALSE)
SEND_SOUND(player_mob, sound('sound/items/dice_roll.ogg', volume = roll_important_to_me ? 5 : 20))
else
- if(last_sucess_amount > 0)
- roller.balloon_alert(player_mob, "[last_sucess_amount]", TRUE)
+ if(alert_delay)
+ var/using_number = last_sucess_amount
+ spawn(alert_delay)
+ create_balloon_alert(roller, player_mob, using_number)
else
- roller.balloon_alert(player_mob, "[last_sucess_amount]", TRUE)
+ create_balloon_alert(roller, player_mob, last_sucess_amount)
+
LAZYADDASSOC(mobs_last_rolled, WEAKREF(roller), list(world.time, output))
SEND_SIGNAL(roller, COMSIG_LIVING_DICE_ROLLED, src, output)
return output
+/datum/storyteller_roll/proc/create_balloon_alert(mob/living/roller, mob/player_mob, number)
+ if(QDELETED(roller) || QDELETED(player_mob))
+ return
+
+ if(number > 0)
+ roller.balloon_alert(player_mob, "[alert_prefix][number]", TRUE)
+ else
+ roller.balloon_alert(player_mob, "[alert_prefix][number]", TRUE)
/datum/storyteller_roll/proc/get_mobs_to_show(mob/living/roller, atom/target)
switch(roll_output_type)
diff --git a/modular_darkpack/modules/storyteller_dice/code/roll_subtypes.dm b/modular_darkpack/modules/storyteller_dice/code/roll_subtypes.dm
index 7e234c5da5a0..820b7d0227e7 100644
--- a/modular_darkpack/modules/storyteller_dice/code/roll_subtypes.dm
+++ b/modular_darkpack/modules/storyteller_dice/code/roll_subtypes.dm
@@ -14,6 +14,7 @@
/datum/storyteller_roll/attack
bumper_text = "attack"
spammy_roll = TRUE
+ alert_prefix = "âš”"
applicable_stats = list(STAT_DEXTERITY, STAT_BRAWL)
/datum/storyteller_roll/attack/punch
@@ -39,6 +40,9 @@
bumper_text = "damage"
numerical = TRUE
spammy_roll = TRUE
+ // Ok listen I know this is just an emoji but it looks fine ingame.
+ alert_prefix = "✊"
+ alert_delay = 0.2 SECONDS
applicable_stats = list(STAT_STRENGTH)
/datum/storyteller_roll/damage/punch
diff --git a/modular_darkpack/modules/unit_tests/apply_all_splats.dm b/modular_darkpack/modules/unit_tests/apply_all_splats.dm
index 05d80bf394dc..1d4214c2fed6 100644
--- a/modular_darkpack/modules/unit_tests/apply_all_splats.dm
+++ b/modular_darkpack/modules/unit_tests/apply_all_splats.dm
@@ -49,8 +49,8 @@
splat_prio_list["[splat_prio]"] = splat_type
else
var/datum/splat/checking_type = splat_prio_list["[splat_prio]"]
- var/datum/splat/real_splat = GLOB.splat_prototypes[checking_type::id]
- if(splat_type in real_splat.incompatible_splats)
+ var/datum/splat/real_splat = GLOB.splat_prototypes[checking_type]
+ if(is_path_in_list(checking_type, real_splat.incompatible_splats))
continue
TEST_FAIL("[splat_type] has the same splat priority as [splat_prio_list["[splat_prio]"]] yet is somehow compatible. priority is [splat_prio].")
diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/baali/baali.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/baali/baali.dm
index 882c54bd4437..6592c682fcf4 100644
--- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/baali/baali.dm
+++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/baali/baali.dm
@@ -20,11 +20,6 @@
whitelisted = TRUE
subsplat_keys = /obj/item/vamp/keys/baali
-/datum/subsplat/vampire_clan/baali/on_gain(mob/living/carbon/human/gaining_mob, datum/splat/gaining_splat, joining_round)
- . = ..()
- gaining_mob.AddElement(/datum/element/holy_weakness)
- gaining_mob.gain_trauma(new /datum/brain_trauma/mild/phobia/religion, TRAUMA_RESILIENCE_ABSOLUTE)
-
/datum/subsplat/vampire_clan/baali/psychomania_effect(mob/living/target, mob/living/owner)
to_chat(target, span_notice("The sacred icons appearing before you lack the true substance of faith"))
new /datum/hallucination/delusion(target, TRUE, "repent", 200, 0)
diff --git a/modular_darkpack/modules/weapons/code/ammo_boxes.dm b/modular_darkpack/modules/weapons/code/ammo_boxes.dm
index 8ea75e5c6215..33657551a5e0 100644
--- a/modular_darkpack/modules/weapons/code/ammo_boxes.dm
+++ b/modular_darkpack/modules/weapons/code/ammo_boxes.dm
@@ -63,9 +63,16 @@
ammo_type = /obj/item/ammo_casing/vampire/c44/silver
max_ammo = 60
-// .50 BMG/AE
+// .50 AE
+/obj/item/ammo_box/darkpack/c50ae
+ name = "ammo box (.50 AE)"
+ icon_state = "50box" //placeholder, needs new box
+ ammo_type = /obj/item/ammo_casing/vampire/c50ae
+ max_ammo = 40
+
+// .50 BMG
/obj/item/ammo_box/darkpack/c50
- name = "ammo box (.50)"
+ name = "ammo box (.50 BMG)"
icon_state = "50box"
ammo_type = /obj/item/ammo_casing/vampire/c50
max_ammo = 20
@@ -106,6 +113,12 @@
ammo_type = /obj/item/ammo_casing/vampire/c12g
max_ammo = 30
+/obj/item/ammo_box/darkpack/c12g/silver
+ name = "silver ammo box (12g)"
+ icon_state = "12box_silver"
+ ammo_type = /obj/item/ammo_casing/vampire/c12g/silver
+ max_ammo = 30
+
/obj/item/ammo_box/darkpack/c12g/buck
name = "ammo box (12g, 00 buck)"
icon_state = "12box_buck"
@@ -145,3 +158,20 @@
name = "incendiary ammo box (7.62x51)"
icon_state = "762box-incendiary"
ammo_type = /obj/item/ammo_casing/vampire/c762x51mm/incendiary
+
+/obj/item/ammo_box/darkpack/c762x51mm/incendiary
+ name = "silver ammo box (7.62x51)"
+ icon_state = "762box-silver"
+ ammo_type = /obj/item/ammo_casing/vampire/c762x51mm/silver
+
+// .75 Ball
+/obj/item/ammo_box/darkpack/c75
+ name = "cartriage bag (.75 ball)"
+ icon_state = "cartridge_bag"
+ ammo_type = /obj/item/ammo_casing/vampire/c75
+ max_ammo = 5
+
+/obj/item/ammo_box/darkpack/c75/silver
+ name = "cartriage bag (.75 silver ball)"
+ ammo_type = /obj/item/ammo_casing/vampire/c75/silver
+
diff --git a/modular_darkpack/modules/weapons/code/ammo_casings.dm b/modular_darkpack/modules/weapons/code/ammo_casings.dm
index eadbbc6f4307..c587d7d06bd2 100644
--- a/modular_darkpack/modules/weapons/code/ammo_casings.dm
+++ b/modular_darkpack/modules/weapons/code/ammo_casings.dm
@@ -58,10 +58,18 @@
base_icon_state = "s44"
// .50 BMG/AE
+/obj/item/ammo_casing/vampire/c50ae
+ name = ".50 AE bullet casing"
+ desc = "A .50 AE bullet casing."
+ caliber = CALIBER_50CAL_AE
+ projectile_type = /obj/projectile/bullet/darkpack/vamp50ae
+ icon_state = "44" //placeholder
+ base_icon_state = "44" //placeholder
+
/obj/item/ammo_casing/vampire/c50
- name = ".50 bullet casing"
- desc = "A .50 bullet casing."
- caliber = CALIBER_50CAL
+ name = ".50 BMG bullet casing"
+ desc = "A .50 BMG bullet casing."
+ caliber = CALIBER_50CAL_BMG
projectile_type = /obj/projectile/bullet/darkpack/vamp50
icon_state = "50"
base_icon_state = "50"
@@ -112,6 +120,13 @@
icon_state = "12"
base_icon_state = "12"
+/obj/item/ammo_casing/vampire/c12g/silver
+ name = "12g silver shell casing"
+ desc = "A 12g silver shell casing."
+ icon_state = "s12"
+ base_icon_state = "s12"
+ projectile_type = /obj/projectile/bullet/shotgun_slug/vamp/silver
+
/obj/item/ammo_casing/vampire/c12g/buck
desc = "A 12g shell casing (00 buck)."
projectile_type = /obj/projectile/bullet/darkpack/shotpellet
@@ -130,24 +145,6 @@
icon_state = "12i"
base_icon_state = "12i"
-// DARKPACK TODO - GAROU
-/*
-/obj/item/ammo_casing/vampire/c12g/buck/silver
- name = "silver 12g shell casing"
- desc = "A silver filled 12g shell casing."
- icon_state = "s12"
-/obj/item/ammo_casing/vampire/c12g/buck/silver/on_hit(atom/target, blocked = 0, pierce_hit)
- . = ..()
- if(iswerewolf(target) || get_garou_splat(target))
- var/mob/living/carbon/M = target
- if(M.auspice.gnosis)
- if(prob(40))
- adjust_gnosis(-1, M)
- else
- M.Stun(10)
- M.adjust_brute_loss(50, TRUE)
-*/
-
// Crossbow Bolt
/obj/item/ammo_casing/caseless/bolt
name = "bolt"
@@ -181,7 +178,7 @@
/obj/item/ammo_casing/vampire/c75
name = ".75 cartrige"
- desc = "A .75 musket cartridge containing a musket ball and powder."
+ desc = "A .75 musket cartridge containing a musket ball and gunpowder."
caliber = CALIBER_75BALL
projectile_type = /obj/projectile/bullet/darkpack/vamp75
icon_state = "cartridge"
@@ -190,3 +187,10 @@
/obj/item/ammo_casing/vampire/c75/Initialize(mapload)
. = ..()
AddElement(/datum/element/caseless)
+
+/obj/item/ammo_casing/vampire/c75/silver
+ name = ".75 silver cartrige"
+ desc = "A .75 musket cartridge containing a musket ball, made in pure silver, and gunpowder."
+ projectile_type = /obj/projectile/bullet/darkpack/vamp75/silver
+ icon_state = "scartridge"
+ base_icon_state = "scartridge"
diff --git a/modular_darkpack/modules/weapons/code/guns.dm b/modular_darkpack/modules/weapons/code/guns.dm
index 3d4b6b1f825e..1fc1a8a74529 100644
--- a/modular_darkpack/modules/weapons/code/guns.dm
+++ b/modular_darkpack/modules/weapons/code/guns.dm
@@ -101,8 +101,8 @@
icon = 'modular_darkpack/modules/weapons/icons/ammo.dmi'
ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi')
icon_state = "deagle"
- ammo_type = /obj/item/ammo_casing/vampire/c50
- caliber = CALIBER_50CAL
+ ammo_type = /obj/item/ammo_casing/vampire/c50ae
+ caliber = CALIBER_50CAL_AE
max_ammo = 7
multiple_sprites = AMMO_BOX_FULL_EMPTY
@@ -607,7 +607,7 @@
name = "sniper rifle internal magazine"
desc = "Oh god, this shouldn't be here"
ammo_type = /obj/item/ammo_casing/vampire/c50
- caliber = CALIBER_50CAL
+ caliber = CALIBER_50CAL_BMG
max_ammo = 5
//multiload = TRUE
diff --git a/modular_darkpack/modules/weapons/code/melee.dm b/modular_darkpack/modules/weapons/code/melee.dm
index 0e21ffffadc3..92eddd44ebd4 100644
--- a/modular_darkpack/modules/weapons/code/melee.dm
+++ b/modular_darkpack/modules/weapons/code/melee.dm
@@ -21,6 +21,8 @@
worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi'
ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi')
slot_flags = ITEM_SLOT_BACK | ITEM_SLOT_BELT // Should really be suit storage
+ force_unwielded = 10
+ force_wielded = 40
pixel_w = -8
custom_price = 1800
@@ -80,54 +82,36 @@
var/mob/living/burnt_mob = target
burnt_mob.apply_damage(15, AGGRAVATED)
-/obj/item/melee/sabre/rapier
- name = "rapier"
- desc = "A thin, elegant sword, the rapier is a weapon of the duelist, designed for thrusting."
- icon = 'modular_darkpack/modules/weapons/icons/weapons.dmi'
- lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi'
- righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi'
- worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi'
- ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi')
- icon_state = "rapier"
-
-
-/obj/item/melee/sabre/rapier/Initialize(mapload)
- . = ..()
- AddComponent(/datum/component/selling, 700, "rapier", FALSE)
-
-
-/obj/item/claymore/machete
- name = "machete"
- desc = "A certified chopper fit for the jungles...but you don't see any vines around. Well-weighted enough to be thrown."
+/obj/item/melee/sabre/vamp
+ name = "sabre"
+ desc = "A curved sword, the sabre is a weapon of the cavalry, designed for slashing and thrusting."
icon = 'modular_darkpack/modules/weapons/icons/weapons.dmi'
lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi'
righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi'
worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi'
ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi')
- icon_state = "machete"
- inhand_icon_state = "machete"
- pixel_w = -8
- masquerade_violating = FALSE
- custom_price = 500
+ icon_state = "sabre"
+ var/value = 1000 // DARKPACK TODO: Move this up at some point. I hate the selling component with all my heart.
+ armour_penetration = 50 //Normally 75 pen, that pens army armor. Instead, 50. Pens bullet proof.
-/obj/item/claymore/machete/Initialize(mapload)
+/obj/item/melee/sabre/vamp/Initialize(mapload)
. = ..()
- AddComponent(/datum/component/selling, 70, "machete", FALSE)
+ AddComponent(/datum/component/selling, value, "sabre", FALSE)
-/obj/item/melee/sabre/vamp
- name = "sabre"
- desc = "A curved sword, the sabre is a weapon of the cavalry, designed for slashing and thrusting."
+/obj/item/melee/sabre/rapier
+ name = "rapier"
+ desc = "A thin, elegant sword, the rapier is a weapon of the duelist, designed for thrusting."
icon = 'modular_darkpack/modules/weapons/icons/weapons.dmi'
lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi'
righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi'
worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi'
ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi')
- icon_state = "sabre"
- var/value = 1000 // DARKPACK TODO: Move this up at some point. I hate the selling component with all my heart.
+ icon_state = "rapier"
+ armour_penetration = 50
-/obj/item/melee/sabre/vamp/Initialize(mapload)
+/obj/item/melee/sabre/rapier/Initialize(mapload)
. = ..()
- AddComponent(/datum/component/selling, value, "sabre", FALSE)
+ AddComponent(/datum/component/selling, 700, "rapier", FALSE)
/obj/item/melee/sabre/vamp/training
name = "foam sabre"
@@ -145,11 +129,30 @@
icon_state = "longsword"
inhand_icon_state = "longsword"
-
/obj/item/claymore/longsword/Initialize(mapload)
. = ..()
AddComponent(/datum/component/selling, 600, "longsword", FALSE)
+/obj/item/claymore/machete
+ name = "machete"
+ desc = "A certified chopper fit for the jungles...but you don't see any vines around. Well-weighted enough to be thrown."
+ icon = 'modular_darkpack/modules/weapons/icons/weapons.dmi'
+ lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi'
+ righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi'
+ worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi'
+ ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi')
+ icon_state = "machete"
+ inhand_icon_state = "machete"
+ pixel_w = -8
+ masquerade_violating = FALSE
+ custom_price = 500
+ force = 35 //Short equivelant of longsword. Less damage and block
+ block_chance = 30
+
+/obj/item/claymore/machete/Initialize(mapload)
+ . = ..()
+ AddComponent(/datum/component/selling, 70, "machete", FALSE)
+
// "Keepers" derived from "my brother's keeper" are an epithet for Lasombra but this seems to be a wholly unqiue item not found in any book.
/obj/item/claymore/longsword/keeper
name = "The Brother's Keeper"
@@ -172,6 +175,10 @@
/obj/item/melee/baseball_bat/vamp
name = "baseball bat"
desc = "There ain't a skull in the league that can withstand a swatter."
+ w_class = WEIGHT_CLASS_BULKY //TG parent bat is huge
+ force = 30
+ exposed_wound_bonus = 10
+ wound_bonus = -5
icon = 'modular_darkpack/modules/weapons/icons/weapons.dmi'
lefthand_file = 'modular_darkpack/modules/deprecated/icons/lefthand.dmi'
righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi'
@@ -287,6 +294,8 @@
righthand_file = 'modular_darkpack/modules/deprecated/icons/righthand.dmi'
worn_icon = 'modular_darkpack/modules/weapons/icons/worn_melee.dmi'
ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi')
+ force_on = 60
+ force = 30
custom_price = 2000
/obj/item/shovel/vamp
@@ -299,6 +308,19 @@
ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi')
icon_state = "shovel"
custom_price = 150
+ force = 30 //It's sharp.. somehow.
+
+/obj/item/shovel/vamp/attack(mob/living/target, mob/living/user)
+ . = ..()
+ if(prob(10))
+ to_chat(user, span_warning("You smash [target] over the head with the shovel!"))
+ target.visible_message(
+ span_userdanger("You are smashed over the head by [user]!"),
+ span_warning("You see stars!"),
+ span_hear("You hear a dull THUNK!"))
+ var/head_protection = target.run_armor_check(BODY_ZONE_HEAD, MELEE)
+ target.apply_effect(5 SECONDS, EFFECT_KNOCKDOWN, head_protection)
+ target.drop_all_held_items()
/obj/item/scythe/vamp
name = "scythe"
@@ -310,7 +332,10 @@
ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi')
icon_state = "kosa"
inhand_icon_state = "kosa"
- w_class = WEIGHT_CLASS_NORMAL
+ w_class = WEIGHT_CLASS_BULKY
+ slot_flags = ITEM_SLOT_BELT | ITEM_SLOT_BACK
+ force = 30
+ armour_penetration = 30
/obj/item/instrument/eguitar/vamp
name = "electric guitar"
diff --git a/modular_darkpack/modules/weapons/code/projectiles.dm b/modular_darkpack/modules/weapons/code/projectiles.dm
index 98860519c87d..08fd44d46643 100644
--- a/modular_darkpack/modules/weapons/code/projectiles.dm
+++ b/modular_darkpack/modules/weapons/code/projectiles.dm
@@ -23,7 +23,7 @@
/obj/projectile/bullet/darkpack/vamp45acp
name = ".45 ACP bullet"
damage = 20
- armour_penetration = 2
+ armour_penetration = 5
/obj/projectile/bullet/darkpack/vamp45acp/HP
name = ".45 ACP hollow point bullet"
@@ -65,7 +65,7 @@
/obj/projectile/bullet/darkpack/vamp50ae
name = ".50 AE bullet"
- damage = 70
+ damage = 40
armour_penetration = 20
exposed_wound_bonus = 5
wound_bonus = 5
@@ -94,25 +94,17 @@
name = "5.56mm silver bullet"
armour_penetration = 20
-/*
/obj/projectile/bullet/darkpack/vamp556mm/silver/on_hit(atom/target, blocked = 0, pierce_hit)
. = ..()
- if(iswerewolf(target) || get_garou_splat(target))
- var/mob/living/carbon/M = target
- if(M.auspice.gnosis)
- if(prob(50))
- adjust_gnosis(-1, M)
+ fera_silver_damage(target, 2)
- M.apply_damage(20, AGGRAVATED)
- M.apply_status_effect(STATUS_EFFECT_SILVER_SLOWDOWN)
-*/
// 5.45x39mm
/obj/projectile/bullet/darkpack/vamp545mm
name = "5.45mm bullet"
damage = 40
armour_penetration = 30
- exposed_wound_bonus = 5
- wound_bonus = -5
+ exposed_wound_bonus = -5
+ wound_bonus = 5
// 4.6mm HK
/obj/projectile/bullet/darkpack/vamp46mm
@@ -127,18 +119,8 @@
name = "12g shotgun slug"
damage = 70
armour_penetration = 15
- exposed_wound_bonus = 10
- wound_bonus = 5
-
-/obj/projectile/bullet/darkpack/rubber
- name = "12g shotgun rubber shot"
- damage = 5
- stamina = 50
-
-/obj/projectile/bullet/darkpack/incap
- name = "12g shotgun incapacitation shot"
- damage = 15
- stamina = 80
+ exposed_wound_bonus = 5
+ wound_bonus = 10
/obj/projectile/bullet/shotgun_slug/vamp/on_hit(atom/target, blocked = 0, pierce_hit)
. = ..()
@@ -151,13 +133,33 @@
hit_person.Knockdown(20)
to_chat(hit_person, span_danger("The force of a projectile sends you sprawling!"))
+/obj/projectile/bullet/shotgun_slug/vamp/silver
+ name = "12g silver shotgun slug"
+ armour_penetration = 10
+
+/obj/projectile/bullet/shotgun_slug/vamp/silver/on_hit(atom/target, blocked = 0, pierce_hit)
+ . = ..()
+ fera_silver_damage(target, 3)
+
+/obj/projectile/bullet/darkpack/rubber
+ name = "12g shotgun rubber shot"
+ damage = 5
+ stamina = 50
+ exposed_wound_bonus = 5
+ wound_bonus = -5
+
+/obj/projectile/bullet/darkpack/incap
+ name = "12g shotgun incapacitation shot"
+ damage = 15
+ stamina = 80
+
/obj/projectile/bullet/darkpack/shotpellet
name = "12g shotgun pellet"
damage = 9
range = 22 //range of where you can see + one screen after
- armour_penetration = 15
- exposed_wound_bonus = 5
- wound_bonus = 0
+ armour_penetration = 10
+ exposed_wound_bonus = 10
+ wound_bonus = -5
/obj/projectile/bullet/darkpack/shotpellet/on_hit(atom/target, blocked = 0, pierce_hit)
. = ..()
@@ -192,21 +194,13 @@
M.adjust_fire_stacks(fire_stacks)
M.ignite_mob()
-
/obj/projectile/bullet/darkpack/vamp762x51mm/silver
name = "7.62x51mm silver bullet"
-/*
-/obj/projectile/bullet/darkpack/vamp762x51mm/silver/on_hit(atom/target, blocked = FALSE)
- . = ..()
- if(iswerewolf(target) || get_garou_splat(target))
- var/mob/living/carbon/M = target
- if(M.auspice.gnosis)
- if(prob(50))
- adjust_gnosis(-1, M)
+ armour_penetration = 20
- M.apply_damage(20, CLONE)
- M.apply_status_effect(STATUS_EFFECT_SILVER_SLOWDOWN)
-*/
+/obj/projectile/bullet/darkpack/vamp762x51mm/silver/on_hit(atom/target, blocked = FALSE, pierce_hit)
+ . = ..()
+ fera_silver_damage(target, 4)
/obj/projectile/bullet/darkpack/vamp75
name = ".75 ball"
@@ -214,3 +208,11 @@
armour_penetration = 5
exposed_wound_bonus = 5
wound_bonus = 5
+
+/obj/projectile/bullet/darkpack/vamp75/silver
+ name = ".75 silver ball"
+ armour_penetration = 0
+
+/obj/projectile/bullet/darkpack/vamp75/silver/on_hit(atom/target, blocked = FALSE, pierce_hit)
+ . = ..()
+ fera_silver_damage(target, 5) //Same as silver longsword; it's a solid silver ball. As the founding fathers intended.
diff --git a/modular_darkpack/modules/weapons/icons/ammo.dmi b/modular_darkpack/modules/weapons/icons/ammo.dmi
index 1162a4700de2..0827ad63c68b 100644
Binary files a/modular_darkpack/modules/weapons/icons/ammo.dmi and b/modular_darkpack/modules/weapons/icons/ammo.dmi differ
diff --git a/modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi b/modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi
index 6a66f42ddb38..a7c023e1559b 100644
Binary files a/modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi and b/modular_darkpack/modules/weapons/icons/ammo_onfloor.dmi differ
diff --git a/modular_darkpack/modules/npc/code/nonhuman/friendly/bird.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm
similarity index 92%
rename from modular_darkpack/modules/npc/code/nonhuman/friendly/bird.dm
rename to modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm
index 138e534a3e2e..ae252e62ff10 100644
--- a/modular_darkpack/modules/npc/code/nonhuman/friendly/bird.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird.dm
@@ -1,4 +1,3 @@
-// DARKPACK TODO - CORAX - (Corax kinfolk and thus should be grouped into WTA soon.)
/mob/living/basic/corvid
name = "corvid"
desc = "Caw."
@@ -67,12 +66,12 @@
// eyes_overlay.layer = ABOVE_LIGHTING_LAYER
. += eyes_overlay
-/datum/action/innate/togglecorvidflight // this action handles corvid forms toggle their flight, and swaps their sprite to be of the relevant type, I'm making it a gift because it's also what Hispo is under
+/datum/action/innate/togglecorvidflight // this action handles corvid forms toggle their flight, and swaps their sprite to be of the relevant type.
name = "Toggle Flight"
desc = "Unfurl or withdraw your wings, toggling your ability to fly"
check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_IMMOBILE
- button_icon = 'icons/mob/actions/actions_items.dmi'
- button_icon_state = "flight"
+ button_icon = 'modular_darkpack/master_files/icons/hud/actions.dmi'
+ button_icon_state = "fly"
/datum/action/innate/togglecorvidflight/Trigger(mob/clicker, trigger_flags)
. = ..()
@@ -108,8 +107,7 @@
message = "caws!"
emote_type = EMOTE_VISIBLE | EMOTE_AUDIBLE
vary = TRUE
- // DARKPACK TODO - CORAX - (Move to wta folder)
- sound = 'modular_darkpack/modules/npc/sound/caw.ogg'
+ sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/caw.ogg'
/mob/living/basic/corvid/crow
name = "crow"
diff --git a/modular_darkpack/modules/npc/code/nonhuman/friendly/bird_ai.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird_ai.dm
similarity index 94%
rename from modular_darkpack/modules/npc/code/nonhuman/friendly/bird_ai.dm
rename to modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird_ai.dm
index 1573ea48bb87..c627732fbddf 100644
--- a/modular_darkpack/modules/npc/code/nonhuman/friendly/bird_ai.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/bird_ai.dm
@@ -17,7 +17,7 @@
/datum/ai_planning_subtree/random_speech/corvid
speech_chance = 5
speak = list("Caw!")
- sound = list('modular_darkpack/modules/npc/sound/caw.ogg')
+ sound = list('modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/caw.ogg')
emote_hear = list("Caws.")
/datum/ai_planning_subtree/find_and_hunt_target/find_shiney
diff --git a/modular_darkpack/modules/npc/code/nonhuman/friendly/wolf.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/wolf.dm
similarity index 84%
rename from modular_darkpack/modules/npc/code/nonhuman/friendly/wolf.dm
rename to modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/wolf.dm
index 0fbd0256d074..1d00dcb56774 100644
--- a/modular_darkpack/modules/npc/code/nonhuman/friendly/wolf.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/wolf.dm
@@ -7,7 +7,6 @@
#define TYPE_MUNDANE "wolf"
#define TYPE_KINFOLK "kinfolk"
-#define TYPE_SPIRAL "spiral"
#define WOLF_COAT_HELPER(wolf_type) \
##wolf_type/black { \
@@ -41,7 +40,7 @@
icon_state = "wolf1"
desc = "That's a big, scary wolf. Might be best to steer clear."
base_icon_state = "wolf"
- icon = 'modular_darkpack/modules/npc/icons/wolf.dmi'
+ icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/wolf.dmi'
var/random_wolf_color = TRUE
var/coat_color = COAT_BLACK
var/wolf_type = TYPE_MUNDANE
@@ -80,27 +79,26 @@
/mob/living/basic/pet/dog/wolf/Initialize(mapload)
. = ..()
add_verb(src, /mob/living/proc/toggle_resting)
- var/coat_type
-
-/* if(user.auspice == AUSPICE_PHILODOX && wolf_type != TYPE_MUNDANE) // uncomment when dogs
- switch(wolf_type)
- if(TYPE_KINFOLK)
- . += span_purple("On closer inspection, they appear to be kin.")
- if(TYPE_SPIRAL)
- . += span_warn("They are strongly wyrm-tainted.") // Remove when we have a wyrm-tainted element or something
- coat_type = TYPE_SPIRAL
-*/
-
if(random_wolf_color)
coat_color = rand(1, 6)
- icon_state = "[base_icon_state][coat_type][coat_color]"
- icon_living = "[base_icon_state][coat_type][coat_color]"
- icon_dead = "[base_icon_state][coat_type][coat_color]_dead"
+ icon_state = "[base_icon_state][coat_color]"
+ icon_living = "[base_icon_state][coat_color]"
+ icon_dead = "[base_icon_state][coat_color]_dead"
// AddElement(/datum/element/ai_retaliate)
update_appearance(UPDATE_ICON)
+/mob/living/basic/pet/dog/wolf/examine(mob/user)
+ . = ..()
+ var/datum/splat/werewolf/wolp_splat = get_werewolf_splat(user)
+ if(istype(wolp_splat?.auspice, /datum/subsplat/werewolf/auspice/garou/philodox))
+ if(wolf_type == TYPE_KINFOLK)
+ . += span_purple("On closer inspection, they appear to be kin.")
+ if(HAS_TRAIT(src, TRAIT_WYRMTAINTED))
+ . += span_warning("They are strongly wyrm-tainted.")
+
+
/mob/living/basic/pet/dog/wolf/add_obey_commands()
var/static/list/pet_commands = list(
/datum/pet_command/idle,
@@ -158,7 +156,10 @@
real_name = "tainted kinfolk"
icon_state = "wolfspiral1"
base_icon_state = "wolfspiral"
- wolf_type = TYPE_SPIRAL
+
+/mob/living/basic/pet/dog/wolf/kinfolk/spiral/Initialize(mapload)
+ . = ..()
+ ADD_TRAIT(src, TRAIT_WYRMTAINTED, INNATE_TRAIT)
// STATIC COLORS
WOLF_COAT_HELPER(/mob/living/basic/pet/dog/wolf)
@@ -176,4 +177,3 @@ WOLF_COAT_HELPER(/mob/living/basic/pet/dog/wolf/kinfolk/spiral)
#undef TYPE_MUNDANE
#undef TYPE_KINFOLK
-#undef TYPE_SPIRAL
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/changing_breeds/corax.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/changing_breeds/corax.dm
new file mode 100644
index 000000000000..95e566152caf
--- /dev/null
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/changing_breeds/corax.dm
@@ -0,0 +1,90 @@
+/datum/storyteller_roll/gift/enemy_ways
+ applicable_stats = list(STAT_PERCEPTION)
+ difficulty = 7
+ numerical = TRUE // More successes can give more information but i didnt have any good ideas for rn.
+
+/datum/action/cooldown/power/gift/enemy_ways
+ name = "Enemy Ways"
+ desc = "The Corax gains an acute and accurate danger sense"
+ button_icon_state = "enemy_ways"
+ cooldown_time = 1 SCENES // TTRPG accurate is 1 TURNS but no cost or prevention of spamming
+ rank = 1
+ // Put up here so the codeblock can interact with them
+ var/waiting_clients = 0
+ var/hostiles = 0
+
+ /// A assoc list of answers indexed by weakrefs to the answerer. Used to cache old answers to not spam them.
+ var/list/datum/weakref/old_answers = list()
+
+/datum/action/cooldown/power/gift/enemy_ways/Activate(atom/target)
+ . = ..()
+ waiting_clients = 0
+ hostiles = 0
+
+ var/datum/storyteller_roll/gift/enemy_ways/roll_datum = new()
+ // More successes normally grants geater information.
+ var/roll_result = roll_datum.st_roll(owner, bonus = PRIMAL_URGE_PLACEHOLDER)
+ if(roll_result <= 0)
+ return TRUE
+
+ var/datum/splat/werewolf/wolp_splat = get_werewolf_splat(owner)
+ var/range = round(((wolp_splat?.renown[RENOWN_WISDOM] ? wolp_splat.renown[RENOWN_WISDOM] : 1) YARDS) * 20)
+
+ var/list/old_answers_resolved = list()
+ for(var/datum/weakref/guy_ref, old_choice in old_answers)
+ var/mob/living/resolved_guy = guy_ref.resolve()
+ if(!resolved_guy)
+ old_answers[guy_ref] = null
+ continue
+ old_answers_resolved[resolved_guy] = old_choice
+
+ for(var/mob/living/guy in oview(range, owner))
+ if(guy.stat == DEAD)
+ continue
+
+ if(old_answers_resolved[guy])
+ if(old_answers_resolved[guy] == "Yes")
+ hostiles++
+ else if(guy.client)
+ waiting_clients++
+ ASYNC
+ var/choice = tgui_alert(
+ guy,
+ "Answer truthfully wether or not your character would consider [GET_GUESTBOOK_NAME(guy, owner)][(GET_GUESTBOOK_NAME(guy, owner) != owner.real_name) ? " ([owner.real_name])" : ""] an enemy.",
+ "Is [GET_GUESTBOOK_NAME(guy, owner)] an Enemy?",
+ list("Yes", "No", "Unsure"),
+ 10 SECONDS
+ )
+
+ // Cache diffenitive answers so that we dont spam them upon recasting
+ switch(choice)
+ if("Yes")
+ hostiles++
+ old_answers[WEAKREF(guy)] = choice
+ if("No")
+ old_answers[WEAKREF(guy)] = choice
+
+ guy.log_message("Answered [choice ? choice : "Nothing"] when asked if [owner] was hostile via Enemy's Ways.", LOG_GAME)
+ waiting_clients--
+ else
+ if(!guy.faction_check_atom(owner) && !guy.has_ally(owner))
+ if(guy.maxHealth < 10) // Filter out fake mobs like cockroaches
+ continue
+ if(guy.has_faction(FACTION_HOSTILE))
+ hostiles++
+
+ if(waiting_clients > 0)
+ ASYNC
+ #define TIME_FOR_SLEEPS 0.5 SECONDS
+ var/time_waited = 0
+ while(waiting_clients > 0)
+ if(time_waited >= 10 SECONDS)
+ break
+ time_waited += TIME_FOR_SLEEPS
+ sleep(TIME_FOR_SLEEPS)
+ #undef TIME_FOR_SLEEPS
+ to_chat(owner, span_notice("The Grandfather Thunder's Stormcrow returns you its information. There are [hostiles] within [range] tiles."))
+ else
+ to_chat(owner, span_notice("The Grandfather Thunder's Stormcrow returns you its information. There are [hostiles] within [range] tiles."))
+
+ return TRUE
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/delirium.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/delirium.dm
index e887732ef498..8c500c23e4c2 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/delirium.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/delirium.dm
@@ -36,8 +36,12 @@
if(!wolf)
return FALSE
- to_chat(owner, span_cult_large("Something DEEP inside you fills you with [willpower_levels[willpower_dots]] at the sight of [wolf]"))
- willpower_dots = clamp(human_owner.st_get_stat(STAT_PERMANENT_WILLPOWER), 1, 10)
+ var/effective_dots = human_owner.st_get_stat(STAT_PERMANENT_WILLPOWER)
+ if(HAS_TRAIT(wolf, TRAIT_WEAK_DELIRIUM))
+ effective_dots += 2
+ willpower_dots = clamp(effective_dots, 1, 10)
+
+ to_chat(owner, span_cult_large("Something DEEP inside you fill you with [willpower_levels[willpower_dots]] at the sight of [wolf]"))
if(owner.client)
// dir SOUTH is admitting i compeletly lost the fight against this stupid bullshit and cant get the image to properly mimmic the direction of the mob.
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/emotes.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/emotes.dm
index d7462edc11b3..cade821e3ad0 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/emotes.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/emotes.dm
@@ -22,27 +22,21 @@
/datum/species/human/shifter/feral/get_growl_sound(mob/living/carbon/human/human)
return 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/lupus_growl.ogg'
-/* // DARKPACK TODO - CORAX
-/datum/emote/living/caw
- key = "caw"
- key_third_person = "caws"
-message = "caws!"
+/datum/emote/living/warcry
+ abstract_type = /datum/emote/living/warcry
emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE
-/datum/emote/living/caw/get_sound(mob/living/carbon/human/user)
- if(!istype(user))
- return
- return user.dna.species.get_caw_sound(user)
-*/
+/datum/emote/living/warcry/get_range(mob/living/user)
+ if(HAS_TRAIT(user, TRAIT_LOUD_WARCRY))
+ return 60
-/datum/emote/living/howl
+/datum/emote/living/warcry/howl
key = "howl"
key_third_person = "howls"
message = "howls!"
message_param = "howls for %t!"
- emote_type = EMOTE_AUDIBLE | EMOTE_VISIBLE
-/datum/emote/living/howl/get_sound(mob/living/user)
+/datum/emote/living/warcry/howl/get_sound(mob/living/user)
var/static/list/howl_sounds = list(
'modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/awo1.ogg',
'modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/awo2.ogg',
@@ -56,9 +50,8 @@ message = "caws!"
if(user.is_clan(/datum/subsplat/vampire_clan/gangrel))
return pick(howl_sounds)
-/datum/emote/living/howl/get_range(mob/living/user)
- if(HAS_TRAIT(user, TRAIT_LOUD_HOWLER))
- return 60
+/datum/emote/living/warcry/howl/get_range(mob/living/user)
+ . = ..()
if(isdog(user) || istype(user, /mob/living/basic/mining/wolf))
return 7
@@ -68,3 +61,25 @@ message = "caws!"
if(user.is_clan(/datum/subsplat/vampire_clan/gangrel))
return 7
+
+
+/datum/emote/living/warcry/caw
+ key = "caw"
+ key_third_person = "caws"
+ message = "caws!"
+
+/datum/emote/living/warcry/caw/get_sound(mob/living/carbon/human/user)
+ if(!istype(user))
+ return
+ return user.dna.species.get_caw_sound(user)
+
+/datum/species/proc/get_caw_sound(mob/living/carbon/human/human)
+ return
+
+/datum/species/human/shifter/get_caw_sound(mob/living/carbon/human/human)
+ if(get_corax_splat(human))
+ return 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/caw.ogg'
+
+/datum/species/human/shifter/war/get_caw_sound(mob/living/carbon/human/human)
+ if(get_corax_splat(human))
+ return 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/cawcrinos.ogg'
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm
index 007a06a17a98..bd0f90aaac4f 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/theurge.dm
@@ -98,6 +98,9 @@ the scar is received and an extra Gnosis point is spent.
UnregisterSignal(owner, COMSIG_LIVING_DEATH)
/datum/action/cooldown/power/gift/sense_wyrm/proc/get_sense_difficulty(mob/living/target)
+ if(HAS_TRAIT(target, TRAIT_HIDDEN_WYRMTAINT))
+ return
+
// To be used for stuff like banes.
if(HAS_TRAIT(target, TRAIT_WYRMTAINTED))
. = 6
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/innate/eye_drink.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/innate/eye_drink.dm
new file mode 100644
index 000000000000..27a00fb9f825
--- /dev/null
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/innate/eye_drink.dm
@@ -0,0 +1,90 @@
+/datum/storyteller_roll/eye_drink
+ bumper_text = "Eye-Drinking"
+ applicable_stats = list(STAT_PERCEPTION, STAT_EMPATHY)
+ numerical = TRUE
+
+/datum/action/cooldown/power/gift/eye_drink
+ name = "Eye-Drinking"
+ desc = "Consumes the eyes of a corpse to unlock the secrets of its demise."
+ button_icon_state = "eye_drink"
+ cooldown_time = 1 SCENES
+ innate_ability = TRUE
+ click_to_activate = TRUE
+
+/datum/action/cooldown/power/gift/eye_drink/Activate(atom/target)
+ var/mob/living/carbon/human/human_target = astype(target)
+ if(!human_target)
+ return
+ if(!(human_target in range(1, owner)))
+ return
+ if(human_target.stat != DEAD)
+ to_chat(owner, span_warning("[target] must be a corpse."))
+ return
+ var/obj/item/organ/eyes/victim_eyeballs = human_target.get_organ_slot(ORGAN_SLOT_EYES)
+ if(!victim_eyeballs)
+ to_chat(owner, span_warning("You cannot drink the eyes of a corpse that has no eyes!"))
+ return
+
+ . = ..()
+
+ if(!do_after(owner, 1 TURNS))
+ return TRUE
+
+ var/datum/storyteller_roll/eye_drink/roll_datum = new()
+ var/successes = roll_datum.st_roll(owner, human_target)
+
+ var/mob/prompting_mob
+ if(human_target.client)
+ prompting_mob = human_target
+ else
+ prompting_mob = human_target.get_ghost(TRUE, TRUE)
+
+ if(prompting_mob)
+ var/permission = tgui_alert(prompting_mob, "Will you allow [owner.real_name] to view your death? They received [successes] successes on their Perception + Empathy roll (Note: You are expected to tell the truth in your character's eyes!)", "Select", list("Yes","No","I don't recall") ,"Yes", 1 MINUTES)
+ if(permission != "Yes")
+ to_chat(owner, span_warning("The spirit seems relunctact to let you consume their eyes... so you refrain from doing so."))
+ return TRUE
+ else
+ if(successes <= 0)
+ return TRUE
+
+ to_chat(owner, span_notice("You drink of the eyes of [human_target] and a vision fills your mind..."))
+ SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION)
+
+ var/deathdesc
+ if(prompting_mob)
+ deathdesc = tgui_input_text(
+ prompting_mob,
+ "Eye-Drinking",
+ "Describe a vision of the moments leading up to your death. [owner] received [successes] successes. Be more clear the more successes they received.",
+ max_length = 300,
+ multiline = TRUE,
+ timeout = 5 MINUTES
+ )
+ else if(human_target.last_death_info)
+ var/datum/death_report/death_info = human_target.last_death_info
+ var/list/info_list = list()
+ if(death_info.area)
+ info_list += "The scene begins in [death_info.area]."
+ if(death_info.last_attacker_name)
+ info_list += "Someone attacks them with the apperance of [death_info.last_attacker_name]."
+ if(death_info.last_words)
+ info_list += "They mouth something you cannot hear."
+
+ if(death_info.suicide)
+ info_list += "A graphic scene which shows there unfortunate suicide."
+ else
+ info_list += "The scene ends before the specifics of there death is made clear."
+ deathdesc += jointext(info_list, " ")
+
+ if(!deathdesc)
+ to_chat(owner, span_warning("The vision is hazy, you can't make out too many details..."))
+ else
+ to_chat(owner, "Visions flood your mind: [deathdesc]")
+
+ if(isnpc(human_target)) // Dont have granuliaty for removing one eye and this shows the empty sockets
+ qdel(victim_eyeballs)
+ else // Fuck a real player a little less.
+ victim_eyeballs.apply_scar(pick(LEFT_EYE_SCAR, RIGHT_EYE_SCAR))
+
+ return TRUE
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/innate/howling.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/innate/howling.dm
index 41f6e86075b6..92136aa6ff92 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/innate/howling.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/innate/howling.dm
@@ -54,7 +54,7 @@
. = ..()
var/mob/living/living_mob = owner
- var/datum/splat/werewolf/shifter = get_shifter_splat(owner)
+ var/datum/splat/werewolf/shifter/shifter = get_shifter_splat(owner)
var/list/menu_options = list()
for(var/howl_key in howls)
menu_options += howls[howl_key]["menu"]
@@ -76,9 +76,9 @@
garou_message = replacetext(garou_message, "tribe", tribe)
*/
var/origin_turf = get_turf(living_mob)
- ADD_TRAIT(living_mob, TRAIT_LOUD_HOWLER, GIFT_TRAIT)
- living_mob.emote("howl")
- REMOVE_TRAIT(living_mob, TRAIT_LOUD_HOWLER, GIFT_TRAIT)
+ ADD_TRAIT(living_mob, TRAIT_LOUD_WARCRY, GIFT_TRAIT)
+ living_mob.emote(shifter.warcry_emote)
+ REMOVE_TRAIT(living_mob, TRAIT_LOUD_WARCRY, GIFT_TRAIT)
var/howl_details
var/final_message
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/hud.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/hud.dm
index 0f9059e82980..f03b9f164040 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/hud.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/hud.dm
@@ -4,16 +4,19 @@
#define UI_LIVING_TRANSFORM_WAR "EAST-1,CENTER+1:40"
#define UI_LIVING_TRANSFORM_FERAL "EAST,CENTER+1:40"
-/datum/hud/proc/add_werewolf_elements()
+/datum/hud/proc/add_werewolf_elements(datum/splat/werewolf/werewolf_splat)
+ // if(werewolf_splat.uses_rage || werewolf_splat.uses_gnosis)
add_screen_object(/atom/movable/screen/auspice, HUD_MOB_AUSPICE, HUD_GROUP_INFO)
add_screen_object(/atom/movable/screen/rage_and_gnosis, HUD_MOB_RAGE_AND_GNOSIS, HUD_GROUP_INFO)
- add_screen_object(/atom/movable/screen/fera_transform/homid, HUD_MOB_HOMID_TRANS, HUD_GROUP_INFO)
- add_screen_object(/atom/movable/screen/fera_transform/war, HUD_MOB_WAR_TRANS, HUD_GROUP_INFO)
- add_screen_object(/atom/movable/screen/fera_transform/feral, HUD_MOB_FERAL_TRANS, HUD_GROUP_INFO)
+ if(istype(werewolf_splat, /datum/splat/werewolf/shifter))
+ add_screen_object(/atom/movable/screen/fera_transform/homid, HUD_MOB_HOMID_TRANS, HUD_GROUP_INFO)
+ add_screen_object(/atom/movable/screen/fera_transform/war, HUD_MOB_WAR_TRANS, HUD_GROUP_INFO)
+ add_screen_object(/atom/movable/screen/fera_transform/feral, HUD_MOB_FERAL_TRANS, HUD_GROUP_INFO)
/datum/splat/werewolf/add_relevent_huds(datum/hud/hud_used)
- hud_used.add_werewolf_elements()
+ hud_used.add_werewolf_elements(src)
+
/atom/movable/screen/auspice
name = "auspice"
@@ -131,6 +134,7 @@
return ..()
+
/atom/movable/screen/fera_transform
abstract_type = /atom/movable/screen/fera_transform
icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/hud_transforms.dmi'
@@ -157,23 +161,36 @@
// Right click for alt forms like glabro and hispo. Ctrl click to use rage to do it instantly (doesnt matter if its breed form tho)
shifting.transform_fera(LAZYACCESS(modifiers, RIGHT_CLICK) ? right_click_transform : left_click_transform, LAZYACCESS(modifiers, CTRL_CLICK))
+/atom/movable/screen/fera_transform/update_icon(updates)
+ . = ..()
+
+ var/mob/living/owner = hud?.mymob
+ if(!istype(owner))
+ return
+
+ var/datum/splat/werewolf/shifter/our_splat = get_shifter_splat(owner)
+ if(!istype(our_splat))
+ return
+
+ icon = our_splat.transform_hud_icon
/atom/movable/screen/fera_transform/add_context(atom/source, list/context, obj/item/held_item, mob/user)
. = ..()
var/datum/splat/werewolf/shifter/shifting = get_shifter_splat(user)
- if(left_click_transform)
+ if(left_click_transform && (left_click_transform in shifting.transformation_list))
context[SCREENTIP_CONTEXT_LMB] = "Shift to [left_click_transform::name]"
if(left_click_transform != shifting.get_breed_form_species())
context[SCREENTIP_CONTEXT_CTRL_LMB] = "Shift using rage"
- if(right_click_transform)
+ if(right_click_transform && (right_click_transform in shifting.transformation_list))
context[SCREENTIP_CONTEXT_RMB] = "Shift to [right_click_transform::name]"
if(right_click_transform != shifting.get_breed_form_species())
context[SCREENTIP_CONTEXT_CTRL_RMB] = "Shift using rage"
return CONTEXTUAL_SCREENTIP_SET
+
/atom/movable/screen/fera_transform/homid
name = "homid form"
icon_state = "homid"
@@ -181,12 +198,14 @@
left_click_transform = /datum/species/human/shifter/homid
right_click_transform = /datum/species/human/shifter/bestial
+
/atom/movable/screen/fera_transform/war
name = "war form"
icon_state = "war"
screen_loc = UI_LIVING_TRANSFORM_WAR
left_click_transform = /datum/species/human/shifter/war
+
/atom/movable/screen/fera_transform/feral
name = "feral form"
icon_state = "feral"
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/auspice.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/auspice.dm
index e4ae0065bda4..9afffe9d5f73 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/auspice.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/auspice.dm
@@ -1,16 +1,34 @@
-/datum/preference/choiced/subsplat/garou_auspice
- savefile_key = "garou_auspice"
+/datum/preference/choiced/subsplat/fera_auspice
+ abstract_type = /datum/preference/choiced/subsplat/fera_auspice
main_feature_name = "Auspice"
- relevant_inherent_trait = TRAIT_WTA_GAROU_AUSPICE
+ must_be_accessible = TRUE
+ var/splat_id
-/datum/preference/choiced/subsplat/garou_auspice/init_possible_values()
- return assoc_to_keys(GLOB.auspices_list) // This would be inclusive of ALL auspices so many need to be reworked when adding other fera
+/datum/preference/choiced/subsplat/fera_auspice/init_possible_values()
+ var/list/pref_list = list()
+ // Key is type path not singleton
+ for(var/datum/subsplat/werewolf/auspice/key as anything in GLOB.auspices)
+ if(key::fera_restriction != splat_id)
+ continue
+ UNTYPED_LIST_ADD(pref_list, key::name)
+ return pref_list
-/datum/preference/choiced/subsplat/garou_auspice/icon_for(value)
+/datum/preference/choiced/subsplat/fera_auspice/icon_for(value)
var/datum/universal_icon/auspice_icon = uni_icon('icons/effects/effects.dmi', "nothing")
auspice_icon.blend_icon(uni_icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/auspices.dmi', replacetext(LOWER_TEXT(value), " ", "_")), ICON_OVERLAY)
return auspice_icon
-/datum/preference/choiced/subsplat/garou_auspice/apply_to_human(mob/living/carbon/human/target, value)
+/datum/preference/choiced/subsplat/fera_auspice/apply_to_human(mob/living/carbon/human/target, value)
var/joining_round = !isdummy(target)
target.set_auspice(value, joining_round)
+
+/datum/preference/choiced/subsplat/fera_auspice/is_accessible(datum/preferences/preferences)
+ . = ..()
+ var/datum/splat/splat_path = preferences.read_preference(/datum/preference/choiced/splats)
+ if(!ispath(splat_path) || splat_path::id != splat_id)
+ return FALSE
+
+
+/datum/preference/choiced/subsplat/fera_auspice/garou
+ savefile_key = "garou_auspice"
+ splat_id = SPLAT_GAROU
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/breed.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/breed.dm
index f914e87c17e8..c325a73d7c36 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/breed.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/breed.dm
@@ -1,36 +1,42 @@
-/datum/preference/choiced/subsplat/garou_breed
- savefile_key = "garou_breed"
+/datum/preference/choiced/subsplat/fera_breed
+ abstract_type = /datum/preference/choiced/subsplat/fera_breed
main_feature_name = "Breed"
- relevant_inherent_trait = TRAIT_WTA_GAROU_BREED
-
-/datum/preference/choiced/subsplat/garou_breed/init_possible_values()
- return assoc_to_keys(GLOB.breed_forms_list)
-
-/datum/preference/choiced/subsplat/garou_breed/icon_for(value)
- var/datum/universal_icon/garou_icon = uni_icon('icons/effects/effects.dmi', "nothing")
- switch(value)
- if(BREED_HOMID)
- var/datum/universal_icon/breed_homid = uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_head_m")
- breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_chest_m"), ICON_OVERLAY)
- breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_arm"), ICON_OVERLAY)
- breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_arm"), ICON_OVERLAY)
- breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_leg"), ICON_OVERLAY)
- breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_leg"), ICON_OVERLAY)
- breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_hand"), ICON_OVERLAY)
- breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_hand"), ICON_OVERLAY)
- breed_homid.blend_color(skintone2hex("caucasian1"), ICON_MULTIPLY)
- breed_homid.scale(32, 32)
- garou_icon.blend_icon(breed_homid, ICON_OVERLAY)
- if(BREED_LUPUS)
- var/datum/universal_icon/breed_lupus = uni_icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/lupus.dmi', "black")
- breed_lupus.scale(32, 32)
- garou_icon.blend_icon(breed_lupus, ICON_OVERLAY)
- if(BREED_CRINOS)
- var/datum/universal_icon/breed_crinos = uni_icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/crinos.dmi', "black")
- breed_crinos.scale(32, 32)
- garou_icon.blend_icon(breed_crinos, ICON_OVERLAY)
- return garou_icon
-
-/datum/preference/choiced/subsplat/garou_breed/apply_to_human(mob/living/carbon/human/target, value)
+ must_be_accessible = TRUE
+ var/splat_id
+
+/datum/preference/choiced/subsplat/fera_breed/init_possible_values()
+ var/list/pref_list = list()
+ // Key is type path not singleton
+ for(var/datum/subsplat/werewolf/breed_form/key as anything in GLOB.breed_forms)
+ if(key::fera_restriction != splat_id)
+ continue
+ UNTYPED_LIST_ADD(pref_list, key::name)
+ return pref_list
+
+/datum/preference/choiced/subsplat/fera_breed/icon_for(value)
+ var/datum/universal_icon/breed_icon = uni_icon('icons/effects/effects.dmi', "nothing")
+
+ var/datum/subsplat/werewolf/breed_form/breed_form = get_fera_breed_form(value)
+ breed_form.generation_pref_icon(breed_icon)
+
+ return breed_icon
+
+/datum/preference/choiced/subsplat/fera_breed/apply_to_human(mob/living/carbon/human/target, value)
var/joining_round = !isdummy(target)
target.set_breed_form(value, joining_round)
+
+/datum/preference/choiced/subsplat/fera_breed/is_accessible(datum/preferences/preferences)
+ . = ..()
+ var/datum/splat/splat_path = preferences.read_preference(/datum/preference/choiced/splats)
+ if(!ispath(splat_path) || splat_path::id != splat_id)
+ return FALSE
+
+
+/datum/preference/choiced/subsplat/fera_breed/garou
+ savefile_key = "garou_breed"
+ splat_id = SPLAT_GAROU
+
+
+/datum/preference/choiced/subsplat/fera_breed/coeax
+ savefile_key = "corax_breed"
+ splat_id = SPLAT_CORAX
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/fur.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/fur.dm
index 5ffe5a8988fd..8b2793630fb6 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/fur.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/fur.dm
@@ -1,15 +1,34 @@
-/datum/preference/choiced/garou_fur_color
- savefile_key = "garou_fur_color"
+/datum/preference/choiced/fera_fur_color
+ abstract_type = /datum/preference/choiced/fera_fur_color
+ savefile_key = "fur_color"
savefile_identifier = PREFERENCE_CHARACTER
category = PREFERENCE_CATEGORY_SECONDARY_FEATURES
priority = PREFERENCE_PRIORITY_WORLD_OF_DARKNESS
main_feature_name = "Fera Fur Color"
relevant_inherent_trait = TRAIT_FERA_FUR
must_have_relevant_trait = TRUE
+ var/splat_id
+
+/datum/preference/choiced/fera_fur_color/apply_to_human(mob/living/carbon/human/target, value)
+ target.dna.features[FEATURE_FUR_COLOR] = value
+
+/datum/preference/choiced/fera_fur_color/is_accessible(datum/preferences/preferences)
+ . = ..()
+ var/datum/splat/splat_path = preferences.read_preference(/datum/preference/choiced/splats)
+ if(!ispath(splat_path) || splat_path::id != splat_id)
+ return FALSE
-/datum/preference/choiced/garou_fur_color/init_possible_values()
+
+/datum/preference/choiced/fera_fur_color/garou
+ savefile_key = "garou_fur_color"
+ splat_id = SPLAT_GAROU
+
+/datum/preference/choiced/fera_fur_color/garou/init_possible_values()
return assoc_to_keys(GLOB.garou_fur_colors)
+/datum/preference/choiced/fera_fur_color/corax
+ savefile_key = "corax_fur_color"
+ splat_id = SPLAT_CORAX
-/datum/preference/choiced/garou_fur_color/apply_to_human(mob/living/carbon/human/target, value)
- target.dna.features[FEATURE_FUR_COLOR] = value
+/datum/preference/choiced/fera_fur_color/corax/init_possible_values()
+ return assoc_to_keys(GLOB.corax_fur_colors)
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/tribe.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/tribe.dm
index 289290610c0d..20ee26de9950 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/tribe.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/preferences/tribe.dm
@@ -1,16 +1,40 @@
-/datum/preference/choiced/subsplat/garou_tribe
- savefile_key = "garou_tribe"
+/datum/preference/choiced/subsplat/fera_tribe
+ abstract_type = /datum/preference/choiced/subsplat/fera_tribe
main_feature_name = "Tribe"
- relevant_inherent_trait = TRAIT_WTA_GAROU_TRIBE
+ must_be_accessible = TRUE
+ var/splat_id
-/datum/preference/choiced/subsplat/garou_tribe/init_possible_values()
- return assoc_to_keys(GLOB.tribes_list) // This would be inclusive of ALL tribes so many need to be reworked when adding other fera
+/datum/preference/choiced/subsplat/fera_tribe/init_possible_values()
+ var/list/pref_list = list()
+ // Key is type path not singleton
+ for(var/datum/subsplat/werewolf/tribe/key as anything in GLOB.fera_tribes)
+ if(key::fera_restriction != splat_id)
+ continue
+ UNTYPED_LIST_ADD(pref_list, key::name)
+ return pref_list
-/datum/preference/choiced/subsplat/garou_tribe/icon_for(value)
+/datum/preference/choiced/subsplat/fera_tribe/icon_for(value)
var/datum/universal_icon/tribe_icon = uni_icon('icons/effects/effects.dmi', "nothing")
tribe_icon.blend_icon(uni_icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/tribes.dmi', replacetext(LOWER_TEXT(value), " ", "_")), ICON_OVERLAY)
return tribe_icon
-/datum/preference/choiced/subsplat/garou_tribe/apply_to_human(mob/living/carbon/human/target, value)
+/datum/preference/choiced/subsplat/fera_tribe/apply_to_human(mob/living/carbon/human/target, value)
var/joining_round = !isdummy(target)
target.set_fera_tribe(value, joining_round)
+
+/datum/preference/choiced/subsplat/fera_tribe/is_accessible(datum/preferences/preferences)
+ . = ..()
+ var/datum/splat/splat_path = preferences.read_preference(/datum/preference/choiced/splats)
+ if(!ispath(splat_path) || splat_path::id != splat_id)
+ return FALSE
+
+
+/datum/preference/choiced/subsplat/fera_tribe/garou
+ splat_id = SPLAT_GAROU
+ savefile_key = "garou_tribe"
+
+/* // Exist in the changing breeds book.
+/datum/preference/choiced/subsplat/fera_tribe/corax
+ splat_id = SPLAT_CORAX
+ savefile_key = "corax_tribe"
+*/
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/silver_damage.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/silver_damage.dm
index 013af938bdba..0c0d7ff640f4 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/silver_damage.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/silver_damage.dm
@@ -19,6 +19,8 @@
/obj/projectile/bullet/proc/fera_silver_damage(mob/living/carbon/human/target, dice = 0)
if(!istype(target))
return
+ if(!HAS_TRAIT(target, TRAIT_SILVER_WEAKNESS))
+ return
var/datum/splat/werewolf/shifter/shot_pup_splat = get_shifter_splat(target)
if(shot_pup_splat)
var/mob/living/carbon/human/shot_pup = target
@@ -31,6 +33,8 @@
/obj/item/proc/fera_silver_damage(mob/living/carbon/human/target, dice = 0, gnosis_damage = 0)
if(!istype(target))
return
+ if(!HAS_TRAIT(target, TRAIT_SILVER_WEAKNESS))
+ return
var/datum/splat/werewolf/shifter/shot_pup_splat = get_shifter_splat(target)
if(shot_pup_splat)
var/mob/living/carbon/human/shot_pup = target
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/species/garou_organs.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_organs.dm
similarity index 93%
rename from modular_darkpack/modules/werewolf_the_apocalypse/code/species/garou_organs.dm
rename to modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_organs.dm
index b9622e53a320..60bda0fbfdf9 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/species/garou_organs.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_organs.dm
@@ -41,10 +41,14 @@
/obj/item/bodypart/leg/left/fera
unarmed_sharpness = SHARP_EDGED
// limb_id = SPECIES_FERA
+ footprint_sprite = FOOTPRINT_SPRITE_CLAWS
+ footstep_type = FOOTSTEP_MOB_CLAW
/obj/item/bodypart/leg/right/fera
unarmed_sharpness = SHARP_EDGED
// limb_id = SPECIES_FERA
+ footprint_sprite = FOOTPRINT_SPRITE_CLAWS
+ footstep_type = FOOTSTEP_MOB_CLAW
// Specificly to restrict use of tools... because that was moved to the brain..
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_species.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_species.dm
similarity index 84%
rename from modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_species.dm
rename to modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_species.dm
index 650ba44d65d8..d128d48c300f 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_species.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/fera_species.dm
@@ -26,8 +26,6 @@
var/mob_pixel_z
/// If declared will override the mob size.
var/mob_size_override
- /// Stats added and removed upon gaining the species
- var/list/form_bonus_stats = list()
/// Dice roll difficulty required to shift into this form
var/shift_difficulty = 6
/// If update_body_parts is allowed to override the body render
@@ -36,6 +34,7 @@
var/custom_damage_render = FALSE
/// Fallback dmi to refrence if we fail to get one from our splat
var/fallback_icon
+ var/has_flight_icon_states = FALSE
/// Speed mod applied and removed upon gaining this species
var/speed_mod
/// Causes delirium, which if the user is affected by, does not cause breaches
@@ -67,8 +66,13 @@
clear_buffs(human)
+/datum/species/human/shifter/proc/get_buffs(mob/living/carbon/human/human)
+ var/datum/splat/werewolf/shifter/shifter_splat = get_shifter_splat(human)
+ if(shifter_splat?.transformation_stats && shifter_splat.transformation_stats[id])
+ return shifter_splat.transformation_stats[id]
+
/datum/species/human/shifter/proc/add_buffs(mob/living/carbon/human/human)
- for(var/key, value in form_bonus_stats)
+ for(var/key, value in get_buffs(human))
if(!should_add_buff(human, key, value))
continue
human.st_add_stat_mod(key, value, type)
@@ -77,7 +81,7 @@
return TRUE
/datum/species/human/shifter/proc/clear_buffs(mob/living/carbon/human/human)
- for(var/key, value in form_bonus_stats)
+ for(var/key, value in get_buffs(human))
human.st_remove_stat_mod(key, type)
/datum/species/human/shifter/proc/is_veil_breaching_form(mob/living/carbon/human/human)
@@ -110,7 +114,9 @@
if(HAS_TRAIT(human, TRAIT_WYRMTAINTED_SPRITE))
main_iconstate += "spiral"
main_iconstate += fur_color
- if(human.body_position == LYING_DOWN)
+ if(has_flight_icon_states && HAS_TRAIT(human, TRAIT_FERA_FLIGHT) && HAS_TRAIT(human, TRAIT_MOVE_FLYING) && HAS_TRAIT(human, TRAIT_NO_FLOATING_ANIM))
+ main_iconstate += "_flying"
+ else if(human.body_position == LYING_DOWN)
main_iconstate += "_rest"
human.overlays_standing[BODYPARTS_LAYER] = list(image(mob_icon, main_iconstate))
@@ -148,12 +154,6 @@
/datum/species/human/shifter/bestial
name = "bestial form"
id = SPECIES_FERA_BESTIAL
- form_bonus_stats = list(
- STAT_STRENGTH = 2,
- STAT_STAMINA = 2,
- STAT_MANIPULATION = -2,
- STAT_APPEARANCE = -1
- )
shift_difficulty = 7
fallback_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/glabro.dmi'
veil_breaching_form = TRUE
@@ -221,21 +221,16 @@
no_equip_flags = ITEM_SLOT_ON_BODY
- visible_gender_override = "beast"
-
mob_pixel_w = -8
mob_size_override = MOB_SIZE_LARGE
- form_bonus_stats = list(
- STAT_STRENGTH = 4,
- STAT_STAMINA = 3,
- STAT_DEXTERITY = 1,
- STAT_MANIPULATION = -3,
- // STAT_APPEARANCE = 0 // NOT YET SUPPORTED
- )
custom_body_render = TRUE
custom_damage_render = TRUE
fallback_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/crinos.dmi'
+/datum/species/human/shifter/war/visible_gender_override(mob/living/carbon/human/holder)
+ return "beast"
+
+
/datum/species/human/shifter/dire
name = "dire form"
id = SPECIES_FERA_DIRE
@@ -263,22 +258,18 @@
no_equip_flags = ITEM_SLOT_ON_BODY
- visible_gender_override = "beast"
-
mob_pixel_w = -16
mob_pixel_z = -8
- form_bonus_stats = list(
- STAT_STRENGTH = 3,
- STAT_STAMINA = 3,
- STAT_DEXTERITY = 2,
- STAT_MANIPULATION = -3,
- )
shift_difficulty = 7
custom_body_render = TRUE
custom_damage_render = TRUE
fallback_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/hispo.dmi'
speed_mod = /datum/movespeed_modifier/shifter/dire
+/datum/species/human/shifter/dire/visible_gender_override(mob/living/carbon/human/holder)
+ return "beast"
+
+
/datum/species/human/shifter/feral
name = "feral form"
id = SPECIES_FERA_FERAL
@@ -305,19 +296,31 @@
no_equip_flags = ITEM_SLOT_ON_BODY
- visible_gender_override = "wolf"
-
- form_bonus_stats = list(
- STAT_STRENGTH = 1,
- STAT_STAMINA = 2,
- STAT_DEXTERITY = 2,
- STAT_MANIPULATION = -3,
- )
custom_body_render = TRUE
custom_damage_render = TRUE
fallback_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/lupus.dmi'
+ has_flight_icon_states = TRUE
speed_mod = /datum/movespeed_modifier/shifter/feral
+/datum/species/human/shifter/feral/visible_gender_override(mob/living/carbon/human/holder)
+ var/datum/splat/werewolf/shifter/shifter_splat = get_shifter_splat(holder)
+ if(shifter_splat?.mimmicing_animal)
+ return shifter_splat.mimmicing_animal::name
+
+ return "beast"
+
+/datum/species/human/shifter/feral/on_species_gain(mob/living/carbon/human/human_who_gained_species, datum/species/old_species, pref_load, regenerate_icons)
+ . = ..()
+ if(HAS_TRAIT(human_who_gained_species, TRAIT_FERA_FLIGHT))
+ var/datum/action/innate/toggle_fera_flight/ability = new(human_who_gained_species)
+ ability.Grant(human_who_gained_species)
+
+/datum/species/human/shifter/feral/on_species_loss(mob/living/carbon/human/human, datum/species/new_species, pref_load)
+ . = ..()
+ for(var/datum/action/innate/toggle_fera_flight/action in human.actions)
+ action.Remove(human)
+
+
/datum/movespeed_modifier/shifter
abstract_type = /datum/movespeed_modifier/shifter
movetypes = GROUND
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/species/flight_action.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/flight_action.dm
new file mode 100644
index 000000000000..527a86e934aa
--- /dev/null
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/flight_action.dm
@@ -0,0 +1,35 @@
+/datum/action/innate/toggle_fera_flight // this action handles fera forms toggle their flight, and swaps their sprite to be of the relevant type.
+ name = "Toggle Flight"
+ desc = "Unfurl or withdraw your wings, toggling your ability to fly"
+ check_flags = AB_CHECK_CONSCIOUS|AB_CHECK_IMMOBILE
+ button_icon = 'modular_darkpack/master_files/icons/hud/actions.dmi'
+ button_icon_state = "fly"
+
+/datum/action/innate/toggle_fera_flight/Trigger(mob/clicker, trigger_flags)
+ . = ..()
+ if(!.)
+ return
+
+ var/mob/living/carbon/human/fera_mob = owner
+ if(!istype(fera_mob))
+ return
+ if (!(HAS_TRAIT(fera_mob, TRAIT_MOVE_FLYING)))
+ to_chat(fera_mob, span_notice("You beat your wings and begin to hover gently above the ground..."))
+ fera_mob.add_traits(list(TRAIT_MOVE_FLYING, TRAIT_NO_FLOATING_ANIM), ACTION_TRAIT)
+ else
+ to_chat(fera_mob, span_notice("You settle gently back onto the ground..."))
+ fera_mob.remove_traits(list(TRAIT_MOVE_FLYING, TRAIT_NO_FLOATING_ANIM), ACTION_TRAIT)
+
+ fera_mob.update_body_parts()
+ // fera_mob.update_icon(UPDATE_ICON)
+
+/datum/action/innate/toggle_fera_flight/Remove(mob/removed_from)
+ var/mob/living/carbon/human/fera_mob = owner
+ if(!istype(fera_mob))
+ return
+ to_chat(fera_mob, span_notice("You settle gently back onto the ground..."))
+ fera_mob.remove_traits(list(TRAIT_MOVE_FLYING, TRAIT_NO_FLOATING_ANIM), ACTION_TRAIT)
+
+ fera_mob.update_body_parts()
+
+ return ..()
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/transformation.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/species/transformation.dm
similarity index 100%
rename from modular_darkpack/modules/werewolf_the_apocalypse/code/splats/transformation.dm
rename to modular_darkpack/modules/werewolf_the_apocalypse/code/species/transformation.dm
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/examine_text.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/examine_text.dm
index 0b31ce429c97..889b14b02630 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/examine_text.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/examine_text.dm
@@ -16,10 +16,10 @@
switch(wolp_splat.renown_rank)
if(RANK_CUB to RANK_FOSTERN)
if(same_tribe)
- . += "You know [examined.p_them()] as \a [fera_rank_name(wolp_splat.renown_rank)] of the [wolp_splat.tribe.name]."
+ . += "You know [examined.p_them()] as \a [fera_rank_name(wolp_splat.renown_rank, wolp_splat.id)] of the [wolp_splat.tribe.name]."
is_known = TRUE
if(RANK_ADREN to RANK_LEGEND)
- . += "You know [examined.p_them()] as \a [fera_rank_name(wolp_splat.renown_rank)] [wolp_splat.auspice.name] of the [wolp_splat.tribe.name]."
+ . += "You know [examined.p_them()] as \a [fera_rank_name(wolp_splat.renown_rank, wolp_splat.id)] [wolp_splat.auspice.name] of the [wolp_splat.tribe.name]."
is_known = TRUE
if(is_known)
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm
index b6d6eab37e21..dd460d52115b 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm
@@ -87,12 +87,10 @@
abstract_type = /datum/splat/werewolf/shifter
splat_traits = list(
TRAIT_FERA_FORMS,
- TRAIT_WTA_GAROU_BREED,
- TRAIT_WTA_GAROU_AUSPICE,
- TRAIT_WTA_GAROU_TRIBE,
TRAIT_FERA_FUR,
- TRAIT_FRENETIC_AURA,
TRAIT_FERA_RENOWN,
+ TRAIT_FRENETIC_AURA,
+ TRAIT_SILVER_WEAKNESS,
)
// id = SPLAT_FERA
incompatible_splats = list(
@@ -104,6 +102,8 @@
splat_priority = SPLAT_PRIO_SHIFTER
var/list/transformation_list = list()
+ /// Stats added and removed upon gaining the species of the splat. Assoc list indexed by the species ids for each form
+ var/list/transformation_stats
var/transform_sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/transform.ogg'
COOLDOWN_DECLARE(transform_cd)
/**
@@ -118,9 +118,15 @@
SPECIES_FERA_DIRE = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/hispo.dmi',
SPECIES_FERA_FERAL = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/lupus.dmi'
)
+ var/transform_hud_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/hud_transforms.dmi'
+ /// Type path of the animal we look like in our feral form
+ var/mob/living/basic/mimmicing_animal
COOLDOWN_DECLARE(passive_healing_cd)
COOLDOWN_DECLARE(gnosis_regain_cd)
+ /// Emote uses for activations of gifts and other things
+ var/warcry_emote = "howl"
+
/datum/splat/werewolf/shifter/on_gain()
. = ..()
owner.set_species(/datum/species/human/shifter/homid)
@@ -133,6 +139,7 @@
if(!QDELETED(owner))
owner.set_species(/datum/species/human)
+ remove_power(/datum/action/cooldown/power/gift/howling)
UnregisterSignal(owner, COMSIG_LIVING_DEATH)
/datum/splat/werewolf/shifter/splat_life(seconds_per_tick)
@@ -155,6 +162,13 @@
continue
guy.apply_status_effect(STATUS_EFFECT_DELIRIUM, owner)
+/datum/splat/werewolf/shifter/proc/causes_delirium()
+ var/datum/species/human/shifter/shifter_species = owner.dna.species
+ if(istype(shifter_species))
+ return FALSE
+ if(shifter_species.causes_delirium && !HAS_TRAIT(owner, TRAIT_PIERCED_VEIL))
+ return TRUE
+
// Being used to represent meditating in your caern
/datum/splat/werewolf/shifter/proc/regain_gnosis_process(seconds_per_tick)
if(!COOLDOWN_FINISHED(src, gnosis_regain_cd))
@@ -162,7 +176,7 @@
for(var/obj/structure/werewolf_totem/totem in GLOB.totems)
if(totem.broken)
continue
- if(!(tribe?.name in totem.tribes))
+ if(!totem.is_friend_of_totem(owner))
continue
if(get_area(totem) != get_area(owner))
continue
@@ -179,22 +193,83 @@
/datum/species/human/shifter/dire,
/datum/species/human/shifter/feral
)
+ transformation_stats = list(
+ SPECIES_FERA_BESTIAL = list(
+ STAT_STRENGTH = 2,
+ STAT_STAMINA = 2,
+ STAT_MANIPULATION = -2,
+ STAT_APPEARANCE = -1
+ ),
+ SPECIES_FERA_WAR = list(
+ STAT_STRENGTH = 4,
+ STAT_STAMINA = 3,
+ STAT_DEXTERITY = 1,
+ STAT_MANIPULATION = -3,
+ // STAT_APPEARANCE = 0 // NOT YET SUPPORTED
+ ),
+ SPECIES_FERA_DIRE = list(
+ STAT_STRENGTH = 3,
+ STAT_STAMINA = 3,
+ STAT_DEXTERITY = 2,
+ STAT_MANIPULATION = -3,
+ ),
+ SPECIES_FERA_FERAL = list(
+ STAT_STRENGTH = 1,
+ STAT_STAMINA = 2,
+ STAT_DEXTERITY = 2,
+ STAT_MANIPULATION = -3,
+ )
+ )
+ mimmicing_animal = /mob/living/basic/pet/dog/wolf
-/* // DARKPACK TODO - CORAX
/datum/splat/werewolf/shifter/corax
name = "Corax"
id = SPLAT_CORAX
+ splat_traits = list(
+ TRAIT_FERA_FUR,
+ TRAIT_FERA_RENOWN,
+ TRAIT_FERA_FLIGHT,
+ TRAIT_FRENETIC_AURA,
+ TRAIT_GOLD_WEAKNESS,
+ )
transformation_list = list(
/datum/species/human/shifter/homid,
/datum/species/human/shifter/war,
/datum/species/human/shifter/feral
)
+ transformation_stats = list(
+ SPECIES_FERA_WAR = list(
+ STAT_STRENGTH = 1,
+ STAT_STAMINA = 1,
+ STAT_DEXTERITY = 1,
+ STAT_MANIPULATION = -2,
+ STAT_PERCEPTION = 3,
+ // STAT_APPEARANCE = 0 // NOT YET SUPPORTED
+ ),
+ SPECIES_FERA_FERAL = list(
+ STAT_STRENGTH = -1,
+ STAT_DEXTERITY = 1,
+ STAT_MANIPULATION = -3,
+ STAT_PERCEPTION = 4,
+ )
+ )
+ transform_sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/corax_transform.ogg'
mob_icons = list(
SPECIES_FERA_WAR = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/corax_forms/crinos.dmi',
SPECIES_FERA_FERAL = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/corax_forms/corvid.dmi'
)
- transform_sound = 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/corax_transform.ogg'
-*/
+ transform_hud_icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/hud_transforms_corax.dmi'
+ mimmicing_animal = /mob/living/basic/corvid/raven
+
+ warcry_emote = "caw"
+
+/datum/splat/werewolf/shifter/corax/on_gain()
+ . = ..()
+ add_power(/datum/action/cooldown/power/gift/eye_drink)
+
+/datum/splat/werewolf/shifter/corax/on_lose_or_destroy()
+ . = ..()
+ remove_power(/datum/action/cooldown/power/gift/eye_drink)
/mob/living/carbon/human/splat/kinfolk
@@ -202,3 +277,6 @@
/mob/living/carbon/human/splat/garou
auto_splats = list(/datum/splat/werewolf/shifter/garou)
+
+/mob/living/carbon/human/splat/corax
+ auto_splats = list(/datum/splat/werewolf/shifter/corax)
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/is_werewolf_helpers.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/is_werewolf_helpers.dm
index 08665939ddf5..1054fee7653b 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/is_werewolf_helpers.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/is_werewolf_helpers.dm
@@ -16,12 +16,10 @@
return character.get_splat(/datum/splat/werewolf/shifter/garou)
-/* // DARKPACK TODO - CORAX
/proc/get_corax_splat(mob/character)
- RETURN_TYPE(/datum/splat/werewolf/shifter/cora
+ RETURN_TYPE(/datum/splat/werewolf/shifter/corax)
return character.get_splat(/datum/splat/werewolf/shifter/corax)
-*/
/proc/get_kinfolk_splat(mob/character)
RETURN_TYPE(/datum/splat/werewolf/kinfolk)
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/pref_lore.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/pref_lore.dm
index a37c33482a3e..b872709d2888 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/pref_lore.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/pref_lore.dm
@@ -39,14 +39,60 @@
SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK,
SPECIES_PERK_ICON = FA_ICON_DOG,
SPECIES_PERK_NAME = "Shapeshifting",
- SPECIES_PERK_DESC = "Garou can shift between 5 diffrent forms that grant them bonus.",
+ SPECIES_PERK_DESC = "Garou can shift between 5 diffrent forms that grant them bonuses.",
),
list(
SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK,
SPECIES_PERK_ICON = FA_ICON_BAND_AID,
SPECIES_PERK_NAME = "Passive healing",
SPECIES_PERK_DESC = "Garou have a strong passive healing while outside of their breed form.",
- )
+ ),
+ list(
+ SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK,
+ SPECIES_PERK_ICON = FA_ICON_MOON,
+ SPECIES_PERK_NAME = "Silver weakness",
+ SPECIES_PERK_DESC = "Silver weapons are unable to be soaked in non-breedforms and causes loss of Gnosis.",
+ ),
+ )
+
+ return to_add
+
+/datum/splat/werewolf/shifter/corax/prepare_human_for_preview(mob/living/carbon/human/human)
+ human.set_haircolor("#241e1c", update = FALSE)
+ human.set_hairstyle("Long Over Eye", update = TRUE)
+ human.undershirt = "Shirt (Black)"
+ human.update_body()
+
+/datum/splat/werewolf/shifter/corax/get_splat_description()
+ return "Messengers of Gaia, children of Raven, and scions of Helios; the wereravens travel accross the globe, guided by their innate curiosity and insatiable thirst for gossip. \nThey are renowned for their ability to gather useful intelligence, and the difficulty of making them stop talking."
+
+/datum/splat/werewolf/shifter/corax/get_splat_lore()
+ return list(
+ "Lorem Ipsum",
+ )
+
+/datum/splat/werewolf/shifter/corax/create_pref_unique_perks()
+ var/list/to_add = list()
+
+ to_add += list(
+ list(
+ SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK,
+ SPECIES_PERK_ICON = FA_ICON_CROW,
+ SPECIES_PERK_NAME = "Shapeshifting",
+ SPECIES_PERK_DESC = "Corax can shift between 3 diffrent forms that grant them bonuses.",
+ ),
+ list(
+ SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK,
+ SPECIES_PERK_ICON = FA_ICON_BAND_AID,
+ SPECIES_PERK_NAME = "Passive healing",
+ SPECIES_PERK_DESC = "Corax have a strong passive healing while outside of their breed form.",
+ ),
+ list(
+ SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK,
+ SPECIES_PERK_ICON = FA_ICON_SUN,
+ SPECIES_PERK_NAME = "Gold weakness",
+ SPECIES_PERK_DESC = "Gold weapons is unable to be soaked in non-breedforms and causes loss of Gnosis.",
+ ),
)
return to_add
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/renown.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/renown.dm
index c747ff3b01d1..50f80a4b1540 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/renown.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/renown.dm
@@ -24,7 +24,7 @@
renown_rank = auspice_rank_check()
if(old_rank != renown_rank)
- to_chat(owner, span_boldnotice("You are now a [fera_rank_name(renown_rank)]."))
+ to_chat(owner, span_boldnotice("You are now a [fera_rank_name(renown_rank, id)]."))
// Not acctually used ANYWHERE rn. Its super easy to just calculate it from our renown anyway.
// owner.write_preference_midround(/datum/preference/numeric/fera_rank, renown_rank)
@@ -65,39 +65,38 @@
// Pretty iffy on this. This could likely just be moved onto the splat itself so corax and other breeds can override it.
/proc/fera_rank_name(rank, breed)
-
- // if(breed != "Corax") DARKPACK TODO - CORAX
- switch(rank)
- if(RANK_CUB)
- return "cub" // in lowercase so that \a might function during the character examine
- if(RANK_CLIATH)
- return "cliath"
- if(RANK_FOSTERN)
- return "fostern"
- if(RANK_ADREN)
- return "adren"
- if(RANK_ATHRO)
- return "athro"
- if(RANK_ELDER)
- return "elder"
- if(RANK_LEGEND)
- return "legend"
-/* DARKPACK TODO - CORAX
- switch(rank)
- if(0)
- return "fledgling"
- if(1)
- return "oviculum"
- if(2)
- return "neocornix"
- if(3)
- return "ales"
- if(4)
- return "volucris"
- if(5)
- return "corvus"
- if(6)
- return "grey eminence"
-*/
+ switch(breed)
+ if(SPLAT_CORAX)
+ switch(rank)
+ if(RANK_CUB)
+ return "fledgling"
+ if(RANK_CLIATH)
+ return "oviculum"
+ if(RANK_FOSTERN)
+ return "neocornix"
+ if(RANK_ADREN)
+ return "ales"
+ if(RANK_ATHRO)
+ return "volucris"
+ if(RANK_ELDER)
+ return "corvus"
+ if(RANK_LEGEND)
+ return "grey eminence"
+ else
+ switch(rank)
+ if(RANK_CUB)
+ return "cub" // in lowercase so that \a might function during the character examine
+ if(RANK_CLIATH)
+ return "cliath"
+ if(RANK_FOSTERN)
+ return "fostern"
+ if(RANK_ADREN)
+ return "adren"
+ if(RANK_ATHRO)
+ return "athro"
+ if(RANK_ELDER)
+ return "elder"
+ if(RANK_LEGEND)
+ return "legend"
#undef MAX_RENOWN
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/_breed.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/_breed.dm
index ecb25894efdf..1412ae05a2ad 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/_breed.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/_breed.dm
@@ -11,6 +11,20 @@
var/datum/splat/werewolf/werewolf_splat = astype(gaining_splat)
werewolf_splat?.adjust_gnosis(start_gnosis)
+/datum/subsplat/werewolf/breed_form/proc/generation_pref_icon(datum/universal_icon/main_icon)
+ var/datum/universal_icon/breed_homid = uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_head_m")
+ breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_chest_m"), ICON_OVERLAY)
+ breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_arm"), ICON_OVERLAY)
+ breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_arm"), ICON_OVERLAY)
+ breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_leg"), ICON_OVERLAY)
+ breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_leg"), ICON_OVERLAY)
+ breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_r_hand"), ICON_OVERLAY)
+ breed_homid.blend_icon(uni_icon('icons/mob/human/bodyparts_greyscale.dmi', "human_l_hand"), ICON_OVERLAY)
+ breed_homid.blend_color(skintone2hex("caucasian1"), ICON_MULTIPLY)
+ breed_homid.scale(32, 32)
+ main_icon.blend_icon(breed_homid, ICON_OVERLAY)
+
+
/**
* Gets the singleton of an breed_form
* from its name, typepath, or returns the
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/corax.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/corax.dm
new file mode 100644
index 000000000000..7c2e61e857d6
--- /dev/null
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/corax.dm
@@ -0,0 +1,29 @@
+/datum/subsplat/werewolf/breed_form/corax
+ abstract_type = /datum/subsplat/werewolf/breed_form/corax
+ fera_restriction = SPLAT_CORAX
+
+/datum/subsplat/werewolf/breed_form/corax/homid
+ name = BREED_CORAX_HOMID
+ start_gnosis = 1
+ breed_species = /datum/species/human/shifter/homid
+ gifts_provided = list(
+ /datum/action/cooldown/power/gift/enemy_ways,
+ /datum/action/cooldown/power/gift/open_seal,
+ /datum/action/cooldown/power/gift/spirit_speech,
+ )
+
+/datum/subsplat/werewolf/breed_form/corax/corvid
+ name = BREED_CORVID
+ start_gnosis = 5
+ breed_species = /datum/species/human/shifter/feral
+ gifts_provided = list(
+ /datum/action/cooldown/power/gift/enemy_ways,
+ /datum/action/cooldown/power/gift/scent_of_the_true_form,
+ // /datum/action/cooldown/power/gift/spirit_speech,
+ /datum/action/cooldown/power/gift/truth_of_gaia,
+ )
+
+/datum/subsplat/werewolf/breed_form/corax/corvid/generation_pref_icon(datum/universal_icon/main_icon)
+ var/datum/universal_icon/breed_crinos = uni_icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/corax_forms/corvid.dmi', "black")
+ breed_crinos.scale(32, 32)
+ main_icon.blend_icon(breed_crinos, ICON_OVERLAY)
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/garou.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/garou.dm
index 89195c2f666d..329c30950fe5 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/garou.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/breeds/garou.dm
@@ -2,17 +2,30 @@
abstract_type = /datum/subsplat/werewolf/breed_form/garou
fera_restriction = SPLAT_GAROU
+
/datum/subsplat/werewolf/breed_form/garou/homid
- name = BREED_HOMID
+ name = BREED_GAROU_HOMID
start_gnosis = 1
breed_species = /datum/species/human/shifter/homid
+
/datum/subsplat/werewolf/breed_form/garou/crinos
name = BREED_CRINOS
start_gnosis = 3
breed_species = /datum/species/human/shifter/war
+/datum/subsplat/werewolf/breed_form/garou/crinos/generation_pref_icon(datum/universal_icon/main_icon)
+ var/datum/universal_icon/breed_lupus = uni_icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/lupus.dmi', "black")
+ breed_lupus.scale(32, 32)
+ main_icon.blend_icon(breed_lupus, ICON_OVERLAY)
+
+
/datum/subsplat/werewolf/breed_form/garou/lupus
name = BREED_LUPUS
start_gnosis = 5
breed_species = /datum/species/human/shifter/feral
+
+/datum/subsplat/werewolf/breed_form/garou/lupus/generation_pref_icon(datum/universal_icon/main_icon)
+ var/datum/universal_icon/breed_crinos = uni_icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/crinos.dmi', "black")
+ breed_crinos.scale(32, 32)
+ main_icon.blend_icon(breed_crinos, ICON_OVERLAY)
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/garou.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/garou.dm
index 3917e1a366d6..e5947e031686 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/garou.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/subsplats/tribes/garou.dm
@@ -161,15 +161,3 @@
// /datum/action/cooldown/power/gift/smooth_move,
// /datum/action/cooldown/power/gift/shroud
// )
-
-/* // DARKPACK TODO - CORAX
-/datum/subsplat/werewolf/tribe/garou/corax
- name = TRIBE_CORAX
- desc = "{CONSIDER : THIS IS A PLACEHOLDER, FEATURES WILL BE MISSING.} \nMessengers of Gaia, children of Raven, and scions of Helios; the wereravens travel accross the globe, guided by their innate curiosity and insatiable thirst for gossip. \nThey are renowned for their ability to gather useful intelligence, and the difficulty of making them stop talking."
- gifts_provided = list(
- /datum/action/cooldown/power/gift/eye_drink,
- /datum/action/cooldown/power/gift/smooth_move,
- /datum/action/cooldown/power/gift/suns_guard
- )
- tribe_trait = TRAIT_CORAX
-*/
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm
index 42b0e365caf9..da7ae5dcb71b 100644
--- a/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm
+++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/totems.dm
@@ -105,7 +105,7 @@
continue
if(human.stat == DEAD)
continue
- if(!(shifter_splat.tribe.name in tribes))
+ if(!is_friend_of_totem(human))
continue
if(damage_change < 0)
@@ -122,6 +122,18 @@
SEND_SOUND(human, sound('modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/inspire.ogg', volume = 50))
shifter_splat.adjust_gnosis(1, FALSE)
+/// Returns true or false wether or not the totems benificial affects will target this mob
+/obj/structure/werewolf_totem/proc/is_friend_of_totem(mob/living/potential_friend)
+ var/datum/splat/werewolf/friends_splat = get_werewolf_splat(potential_friend)
+ if(!friends_splat) // RN the only totem effect relys on a werewolf splat
+ return FALSE
+ if(!friends_splat.tribe) // Dont fuck over tribeless fera. Prob need a better way to determine freinds tho
+ return TRUE
+ if(!(friends_splat.tribe.name in tribes))
+ return FALSE
+
+ return TRUE
+
/obj/structure/werewolf_totem/attack_hand(mob/living/user, list/modifiers)
. = ..()
if(user.combat_mode)
diff --git a/modular_darkpack/modules/npc/icons/wolf.dmi b/modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/wolf.dmi
similarity index 100%
rename from modular_darkpack/modules/npc/icons/wolf.dmi
rename to modular_darkpack/modules/werewolf_the_apocalypse/icons/garou_forms/wolf.dmi
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/icons/hud_transforms_corax.dmi b/modular_darkpack/modules/werewolf_the_apocalypse/icons/hud_transforms_corax.dmi
new file mode 100644
index 000000000000..6d04df9f25d3
Binary files /dev/null and b/modular_darkpack/modules/werewolf_the_apocalypse/icons/hud_transforms_corax.dmi differ
diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi b/modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi
index 087f71f43b1f..115c799106ed 100644
Binary files a/modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi and b/modular_darkpack/modules/werewolf_the_apocalypse/icons/werewolf_abilities.dmi differ
diff --git a/modular_darkpack/modules/npc/sound/caw.ogg b/modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/caw.ogg
similarity index 100%
rename from modular_darkpack/modules/npc/sound/caw.ogg
rename to modular_darkpack/modules/werewolf_the_apocalypse/sounds/emotes/caw.ogg
diff --git a/modular_darkpack/modules/z_travel/code/transfer_point.dm b/modular_darkpack/modules/z_travel/code/transfer_point.dm
index 54b7308a944b..892d57c0ed59 100644
--- a/modular_darkpack/modules/z_travel/code/transfer_point.dm
+++ b/modular_darkpack/modules/z_travel/code/transfer_point.dm
@@ -69,12 +69,13 @@ GLOBAL_LIST_EMPTY(unallocted_transfer_points)
/obj/transfer_point_vamp/proc/transfer_atom(atom/movable/arrived)
if(!exit || one_way)
return
- var/turf/T = get_step(exit, get_dir(arrived, src))
- if(T && !T.density)
- arrived.forceMove(T)
- else
- arrived.forceMove(get_turf(exit))
- return TRUE
+ var/moved_dir = get_dir(arrived, src)
+ var/turf/exit_turf
+ exit_turf = get_open_turf_in_dir(exit, moved_dir)
+ if(exit_turf)
+ return arrived.forceMove(exit_turf)
+
+ return arrived.forceMove(get_turf(exit))
// Use inside the umbra. visible
/obj/transfer_point_vamp/umbral
diff --git a/tgstation.dme b/tgstation.dme
index 60a4b07b497d..6e61904c3f7d 100644
--- a/tgstation.dme
+++ b/tgstation.dme
@@ -7273,6 +7273,7 @@
#include "modular_darkpack\modules\events\code\_darkpack_event.dm"
#include "modular_darkpack\modules\events\code\blackout_event.dm"
#include "modular_darkpack\modules\events\code\economy_crash_event.dm"
+#include "modular_darkpack\modules\events\code\sarcophagus_event.dm"
#include "modular_darkpack\modules\events\code\szlachta_attack_event.dm"
#include "modular_darkpack\modules\events\code\landmarks\event_landmarks.dm"
#include "modular_darkpack\modules\external_organs\code\gargoyle_wings.dm"
@@ -7489,10 +7490,13 @@
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\efficient_digestion.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\fair_glabro.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\giovanni_sanguine_incongruity.dm"
+#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\hidden_diablerie.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\metamorph.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\pale_aura.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\stillness_of_death.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\time_sense.dm"
+#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\touch_of_the_wyld.dm"
+#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\unbondable.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\untamable.dm"
#include "modular_darkpack\modules\merits_flaws\code\positive_quirks\wolf_sight.dm"
#include "modular_darkpack\modules\mob_spawners\code\citizen.dm"
@@ -7553,13 +7557,10 @@
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\blood_guard.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\necromancy_zombies.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\beastmaster\shadow_guard.dm"
-#include "modular_darkpack\modules\npc\code\nonhuman\friendly\bird.dm"
-#include "modular_darkpack\modules\npc\code\nonhuman\friendly\bird_ai.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\friendly\cat.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\friendly\dog.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\friendly\rat.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\friendly\spawners.dm"
-#include "modular_darkpack\modules\npc\code\nonhuman\friendly\wolf.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\hostile\abyss_tentacle.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\hostile\baali_guard.dm"
#include "modular_darkpack\modules\npc\code\nonhuman\hostile\bear.dm"
@@ -7926,12 +7927,17 @@
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\silver_damage.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\totems.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\werewolf_globals.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\basic_mobs\bird.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\basic_mobs\bird_ai.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\basic_mobs\wolf.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\changing_breeds\corax.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\_gift.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\auspices\ahroun.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\auspices\galliard.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\auspices\philodox.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\auspices\ragabash.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\auspices\theurge.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\innate\eye_drink.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\innate\howling.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\black_furies.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\black_spiral_dancer.dm"
@@ -7943,14 +7949,15 @@
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\fur.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\renown.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\tribe.dm"
-#include "modular_darkpack\modules\werewolf_the_apocalypse\code\species\garou_organs.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\species\fera_organs.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\species\fera_species.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\species\flight_action.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\species\transformation.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\splats\examine_text.dm"
-#include "modular_darkpack\modules\werewolf_the_apocalypse\code\splats\fera_species.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\splats\fera_splat.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\splats\is_werewolf_helpers.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\splats\pref_lore.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\splats\renown.dm"
-#include "modular_darkpack\modules\werewolf_the_apocalypse\code\splats\transformation.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\splats\varediting.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\splats\werewolf_gift_management.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\status_effects\delirium.dm"
@@ -7959,6 +7966,7 @@
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\subsplats\auspices\_auspice.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\subsplats\auspices\garou.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\subsplats\breeds\_breed.dm"
+#include "modular_darkpack\modules\werewolf_the_apocalypse\code\subsplats\breeds\corax.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\subsplats\breeds\garou.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\subsplats\tribes\_tribe.dm"
#include "modular_darkpack\modules\werewolf_the_apocalypse\code\subsplats\tribes\garou.dm"
diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/QuirksPage.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/QuirksPage.tsx
index 865a12d44847..05a1af48b454 100644
--- a/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/QuirksPage.tsx
+++ b/tgui/packages/tgui/interfaces/PreferencesMenu/CharacterPreferences/QuirksPage.tsx
@@ -402,6 +402,20 @@ function QuirkPage() {
return;
}
+ // DARKPACK EDIT ADD START - MERITS_FLAWS
+ function getReasonToNotDisplay(quirkName: string) {
+ const quirk = quirkInfo[quirkName];
+
+ if (data.clan_disallowed_quirks.includes(quirk.name)) {
+ return false
+ }
+ if (data.splat_disallowed_quirks.includes(quirk.name)) {
+ return false
+ }
+ return;
+ }
+ // DARKPACK EDIT ADD END
+
function getReasonToNotRemove(quirkName: string) {
const quirk = quirkInfo[quirkName];
@@ -465,7 +479,8 @@ function QuirkPage() {
.filter(([quirkName, _]) => {
return (
selectedQuirks.indexOf(quirkName) === -1 &&
- quirkSearch(quirkInfo[quirkName])
+ quirkSearch(quirkInfo[quirkName]) && // DARKPACK EDIT CHANGE - MERITS_FLAWS
+ getReasonToNotDisplay(quirkName) === undefined // DARKPACK EDIT ADD - MERITS_FLAWS
);
})
.map(([quirkName, quirk]) => {