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]) => {