diff --git a/_maps/map_files/Vampire/special_fran/endron_ruin.dmm b/_maps/map_files/Vampire/special_fran/endron_ruin.dmm index 2fb374fd161b..d9a56285a8f2 100644 --- a/_maps/map_files/Vampire/special_fran/endron_ruin.dmm +++ b/_maps/map_files/Vampire/special_fran/endron_ruin.dmm @@ -68,10 +68,6 @@ "bb" = ( /turf/open/misc/dirt, /area/vtm/outside/forest) -"bf" = ( -/obj/effect/spawner/random/trash/garbage, -/turf/open/water/bloodwave, -/area/vtm/interior/forest/cave/bane) "bi" = ( /obj/machinery/light/directional/north, /obj/effect/turf_decal/trimline/red/line{ @@ -250,13 +246,6 @@ }, /turf/open/water/bloodwave, /area/vtm/interior/forest/cave/bane) -"ee" = ( -/obj/effect/turf_decal/darkpack/cave{ - dir = 10 - }, -/obj/effect/spawner/random/trash/garbage, -/turf/open/water/bloodwave, -/area/vtm/interior/forest/cave/bane) "ef" = ( /obj/structure/flora/rock/pile/darkpack, /turf/open/floor/plating/rough, @@ -289,14 +278,6 @@ }, /turf/open/floor/city/plating, /area/vtm/interior/endron_facility/forest) -"eJ" = ( -/obj/structure/lattice/catwalk, -/obj/effect/spawner/random/trash/grime{ - spawn_loot_count = 20; - spawn_scatter_radius = 3 - }, -/turf/open/water/acid, -/area/vtm/interior/endron_facility/forest) "eK" = ( /obj/effect/turf_decal/darkpack/cave{ dir = 8 @@ -595,13 +576,6 @@ /obj/item/clothing/head/vampire/pentex_beret, /turf/open/floor/city/factory, /area/vtm/interior/endron_facility/forest) -"iZ" = ( -/obj/effect/turf_decal/darkpack/cave{ - dir = 10 - }, -/obj/effect/spawner/random/trash/mess, -/turf/open/water/bloodwave, -/area/vtm/interior/forest/cave/bane) "jf" = ( /obj/structure/table, /obj/item/trash/raisins, @@ -757,7 +731,6 @@ /obj/effect/turf_decal/darkpack/cave{ dir = 4 }, -/obj/effect/spawner/random/trash/garbage, /turf/open/water/bloodwave, /area/vtm/interior/forest/cave/bane) "ly" = ( @@ -882,11 +855,6 @@ /obj/effect/mapping_helpers/door/lock, /turf/open/floor/city/plating_mono, /area/vtm/interior/endron_facility/forest) -"nl" = ( -/obj/effect/turf_decal/darkpack/cave, -/obj/effect/spawner/random/trash/garbage, -/turf/open/water/bloodwave, -/area/vtm/interior/forest/cave/bane) "nv" = ( /obj/machinery/shower/directional/north, /obj/structure/curtain, @@ -1054,13 +1022,6 @@ }, /turf/cordon/secret, /area/misc/cordon) -"pD" = ( -/obj/effect/turf_decal/darkpack/cave{ - dir = 8 - }, -/obj/effect/spawner/random/trash/garbage, -/turf/open/water/bloodwave, -/area/vtm/interior/forest/cave/bane) "pG" = ( /obj/effect/turf_decal/darkpack/dirt, /obj/effect/turf_decal/darkpack/dirt/corner{ @@ -1336,13 +1297,6 @@ /obj/effect/spawner/random/trash/janitor_supplies, /turf/open/floor/city/circled, /area/vtm/interior/endron_facility/forest) -"tE" = ( -/obj/effect/turf_decal/darkpack/cave/corner{ - dir = 8 - }, -/obj/effect/spawner/random/trash/garbage, -/turf/open/water/bloodwave, -/area/vtm/interior/forest/cave/bane) "tG" = ( /obj/structure/fence{ dir = 4 @@ -1713,14 +1667,9 @@ /turf/closed/wall/vampwall/rock, /area/vtm/interior/forest/cave/bane) "zn" = ( -/obj/structure/rack{ - density = 0; - icon = 'icons/obj/tank.dmi'; - icon_state = "holder"; - name = "tank rack" - }, /obj/item/tank/internals/anesthetic, /obj/item/clothing/mask/breath/medical, +/obj/structure/rack, /turf/open/floor/city/circled, /area/vtm/interior/endron_facility/forest) "zx" = ( @@ -1809,7 +1758,6 @@ /obj/effect/turf_decal/darkpack/cave{ dir = 5 }, -/obj/effect/spawner/random/trash/garbage, /turf/open/water/bloodwave, /area/vtm/interior/forest/cave/bane) "Bl" = ( @@ -1979,13 +1927,6 @@ /obj/effect/spawner/random/trash/mess, /turf/open/floor/city/factory, /area/vtm/interior/endron_facility/forest) -"Dh" = ( -/obj/effect/turf_decal/darkpack/cave{ - dir = 1 - }, -/obj/effect/spawner/random/trash/garbage, -/turf/open/water/bloodwave, -/area/vtm/interior/forest/cave/bane) "Dl" = ( /obj/effect/turf_decal/darkpack/dirt{ dir = 6 @@ -2056,13 +1997,6 @@ /obj/effect/mob_spawn/corpse/human/endron, /turf/open/floor/city/plating_mono, /area/vtm/interior/endron_facility/forest) -"Ee" = ( -/obj/effect/turf_decal/darkpack/cave{ - dir = 5 - }, -/obj/effect/spawner/random/trash/garbage, -/turf/open/water/bloodwave, -/area/vtm/interior/forest/cave/bane) "Ef" = ( /obj/effect/turf_decal/darkpack/cave{ dir = 5 @@ -2349,7 +2283,6 @@ /area/vtm/interior/endron_facility/forest) "HB" = ( /obj/effect/decal/garou_glyph/wyrm{ - pixel_x = 0; pixel_y = 31 }, /turf/open/misc/dirt, @@ -6015,7 +5948,7 @@ wD wD bi Mh -YT +tw sL Pw Nj @@ -6232,7 +6165,7 @@ mK Mf wD HO -eJ +tw Ul Ox qz @@ -7405,7 +7338,7 @@ za za Ef FR -iZ +IA za Jk za @@ -7513,7 +7446,7 @@ za za za za -Dh +ed wb IA RS @@ -7624,11 +7557,11 @@ za za CX Ux -tE +Wi +eK eK -pD eK -ee +IA Lp Lp hP @@ -7734,7 +7667,7 @@ EE Ak CX Ux -bf +Pg Pg Pg Wi @@ -7847,7 +7780,7 @@ Pg wb Pg Pg -nl +ev Lp JR Iv @@ -8171,7 +8104,7 @@ md Lp CX Ux -bf +Pg Pg Pg ev @@ -8279,7 +8212,7 @@ za Lp iN RS -Ee +CX Ux Pg KX diff --git a/code/__DEFINES/icon_smoothing.dm b/code/__DEFINES/icon_smoothing.dm index 21747c742922..9eb09cf8f2e2 100644 --- a/code/__DEFINES/icon_smoothing.dm +++ b/code/__DEFINES/icon_smoothing.dm @@ -244,6 +244,7 @@ DEFINE_BITFIELD(smoothing_junction, list( #define SMOOTH_GROUP_COLOR_COUNTERTOP S_OBJ(90) ///obj/structure/table/countertop/(color) // DARKPACK EDIT END #define SMOOTH_GROUP_CITY_LOW_WALL S_TURF(91) ///obj/structure/platform/lowwall // DARKPACK EDIT ADD - WALLS +#define SMOOTH_GROUP_FF_TABLES S_OBJ(92) ///obj/structure/table/countertop/fastfood // DARKPACK EDIT ADD - DECOR /// Performs the work to set smoothing_groups and canSmoothWith. /// An inlined function used in both turf/Initialize and atom/Initialize. diff --git a/code/__DEFINES/~darkpack/auras.dm b/code/__DEFINES/~darkpack/auras.dm index 663c4938eafb..960a2672f80a 100644 --- a/code/__DEFINES/~darkpack/auras.dm +++ b/code/__DEFINES/~darkpack/auras.dm @@ -21,6 +21,7 @@ #define AURA_SAD COLOR_SILVER // Silver #define AURA_SPIRITUAL COLOR_GOLD // Gold #define AURA_SUSPICIOUS COLOR_STRONG_BLUE // Dark Blue +#define AURA_CONFIDENCE COLOR_VIVID_YELLOW // Primarly for the Shadow Lords gift "Aura of Confidence" // Modifier auras. #define AURA_ANXIOUS "Anxious" // Auras appear scrambled like static or white noise @@ -65,7 +66,8 @@ GLOBAL_LIST_INIT(aura_list, sort_list(list( "Anxious" = AURA_ANXIOUS, "Confused" = AURA_CONFUSED, "Daydreaming" = AURA_DAYDREAMING, - "Psychotic" = AURA_PSYCHOTIC + "Psychotic" = AURA_PSYCHOTIC, + "Confidence" = AURA_CONFIDENCE, ))) GLOBAL_LIST_INIT(emotion_to_quality, sort_list(list( @@ -94,5 +96,6 @@ GLOBAL_LIST_INIT(emotion_to_quality, sort_list(list( "Anxious" = "anxiety", "Confused" = "confusion", "Daydreaming" = "absentmindedness", - "Psychotic" = "psychosis" + "Psychotic" = "psychosis", + "Confidence" = "confidence", ))) diff --git a/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm b/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm index 3a96936550da..95c19115e7af 100644 --- a/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/~darkpack/dcs/signals_mob/signals_mob_living.dm @@ -7,5 +7,7 @@ //from base of living/CanAllowThrough(): (atom/movable/mover, border_dir) #define COMSIG_LIVING_CAN_ALLOW_THROUGH "living_can_allow_through" #define COMPONENT_LIVING_PASSABLE (1<<0) -//from base of /datum/storyteller_roll/proc/st_roll(): (mob/living/roller, datum/storyteller_roll/roll_datum, output) +//from base of /datum/storyteller_roll/proc/st_roll(): (mob/living/roller, datum/storyteller_roll/roll_datum, atom/target) +#define COMSIG_LIVING_PRE_DICE_ROLLED "living_pre_dice_rolled" +//from base of /datum/storyteller_roll/proc/st_roll(): (mob/living/roller, datum/storyteller_roll/roll_datum, atom/target, output) #define COMSIG_LIVING_DICE_ROLLED "living_dice_rolled" diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index 4ef7a8b1e544..59a10181749b 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -152,6 +152,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_SMALL_HANDS "small_hands" // Traits granted via gifts #define TRAIT_RAZOR_CLAWS "razor_claws" +#define TRAIT_JAMMING_WEAPONS "jamming_weapons" +#define TRAIT_NATURAL "natural" +#define TRAIT_AURA_OF_CONFIDENCE "aura_of_confidence" /// Sixth sense restricted to view range #define TRAIT_LOCAL_SIXTHSENSE "local_sixth_sense" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 8926c5af804f..3239f43454ac 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -39,6 +39,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_UNHITTABLE_BY_LASERS" = TRAIT_UNHITTABLE_BY_LASERS, "TRAIT_UNLINKABLE_FISHING_SPOT" = TRAIT_UNLINKABLE_FISHING_SPOT, "TRAIT_TETHER_ATTACHED" = TRAIT_TETHER_ATTACHED, + "TRAIT_NATURAL" = TRAIT_NATURAL, // DARKPACK EDIT ADD - WEREWOLF ), /atom/movable = list( "TRAIT_ACTIVE_STORAGE" = TRAIT_ACTIVE_STORAGE, @@ -675,6 +676,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_BRAIN_TRAUMA_IMMUNITY" = TRAIT_BRAIN_TRAUMA_IMMUNITY, "TRAIT_NECROPOLIS_WORSHIP" = TRAIT_NECROPOLIS_WORSHIP, "TRAIT_ANIMAL_MUSK" = TRAIT_ANIMAL_MUSK, // DARKPACK EDIT ADD - MERITS_FLAWS + "TRAIT_AURA_OF_CONFIDENCE" = TRAIT_AURA_OF_CONFIDENCE, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_BETRAYERS_MARK" = TRAIT_BETRAYERS_MARK, // DARKPACK EDIT ADD - MERITS_FLAWS - (Tremere) "TRAIT_BLOODY_LOVER" = TRAIT_BLOODY_LOVER, // DARKPACK EDIT ADD "TRAIT_BLOODY_SUCKER" = TRAIT_BLOODY_SUCKER, // DARKPACK EDIT ADD @@ -692,8 +694,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_DIFFICULT_FRENZY" = TRAIT_DIFFICULT_FRENZY, // DARKPACK EDIT ADD - FRENZY "TRAIT_DIFFICULT_RAGE" = TRAIT_DIFFICULT_RAGE, // DARKPACK EDIT ADD - FRENZY "TRAIT_DISCO_DANCER" = TRAIT_DISCO_DANCER, // DARKPACK EDIT ADD - "TRAIT_DULLFANGS" = TRAIT_DULLFANGS, // DARKPACK EDIT ADD - MERITS/FLAWS - "TRAIT_EAT_FOOD" = TRAIT_EAT_FOOD, // DARKPACK EDIT ADD - MERITS/FLAWS + "TRAIT_DULLFANGS" = TRAIT_DULLFANGS, // DARKPACK EDIT ADD - MERITS_FLAWS + "TRAIT_EAT_FOOD" = TRAIT_EAT_FOOD, // DARKPACK EDIT ADD - MERITS_FLAWS "TRAIT_EFFICIENT_DIGESTION" = TRAIT_EFFICIENT_DIGESTION, //DARKPACK EDIT ADD "TRAIT_ENHANCED_MELEE_DODGE" = TRAIT_ENHANCED_MELEE_DODGE, // DARKPACK EDIT ADD "TRAIT_FAIR_GLABRO" = TRAIT_FAIR_GLABRO, // DARKPACK EDIT ADD - MERITS_FLAWS @@ -718,6 +720,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_INVISIBLE_TO_CAMERA" = TRAIT_INVISIBLE_TO_CAMERA, // DARKPACK EDIT ADD "TRAIT_IN_FRENZY" = TRAIT_IN_FRENZY, // DARKPACK EDIT ADD "TRAIT_IRRESISTIBLE_VITAE" = TRAIT_IRRESISTIBLE_VITAE, // DARKPACK EDIT ADD + "TRAIT_JAMMING_WEAPONS" = TRAIT_JAMMING_WEAPONS, // DARKPACK EDIT ADD - WEREWOLF "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 @@ -754,7 +757,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "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 diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index fd17092644bc..e1208f161f76 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -9,6 +9,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_RUSTIMMUNE" = TRAIT_RUSTIMMUNE, "TRAIT_UNHITTABLE_BY_PROJECTILES" = TRAIT_UNHITTABLE_BY_PROJECTILES, "TRAIT_UNHITTABLE_BY_LASERS" = TRAIT_UNHITTABLE_BY_LASERS, + "TRAIT_NATURAL" = TRAIT_NATURAL, // DARKPACK EDIT ADD - WEREWOLF ), /atom/movable = list( "TRAIT_ASHSTORM_IMMUNE" = TRAIT_ASHSTORM_IMMUNE, @@ -363,6 +364,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_RIGHT_EYE_SCAR" = TRAIT_RIGHT_EYE_SCAR, "TRAIT_CARPOTOXIN_IMMUNE" = TRAIT_CARPOTOXIN_IMMUNE, "TRAIT_ANIMAL_MUSK" = TRAIT_ANIMAL_MUSK, // DARKPACK EDIT ADD - MERITS_FLAWS + "TRAIT_AURA_OF_CONFIDENCE" = TRAIT_AURA_OF_CONFIDENCE, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_BLOODY_LOVER" = TRAIT_BLOODY_LOVER, // DARKPACK EDIT ADD "TRAIT_BLOODY_SUCKER" = TRAIT_BLOODY_SUCKER, // DARKPACK EDIT ADD "TRAIT_BLUSH_OF_HEALTH" = TRAIT_BLUSH_OF_HEALTH, // DARKPACK EDIT ADD @@ -399,6 +401,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_INVISIBLE_TO_CAMERA" = TRAIT_INVISIBLE_TO_CAMERA, // DARKPACK EDIT ADD "TRAIT_IN_FRENZY" = TRAIT_IN_FRENZY, // DARKPACK EDIT ADD "TRAIT_IRRESISTIBLE_VITAE" = TRAIT_IRRESISTIBLE_VITAE, // DARKPACK EDIT ADD + "TRAIT_JAMMING_WEAPONS" = TRAIT_JAMMING_WEAPONS, // DARKPACK EDIT ADD - WEREWOLF "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 diff --git a/code/_onclick/item_attack.dm b/code/_onclick/item_attack.dm index 618868072488..358aa249d23f 100644 --- a/code/_onclick/item_attack.dm +++ b/code/_onclick/item_attack.dm @@ -235,6 +235,11 @@ return FALSE var/final_force = CALCULATE_FORCE(src, attack_modifiers) + // DARKPACK EDIT ADD START - WEREWOLF + if(HAS_TRAIT(user, TRAIT_JAMMING_WEAPONS) && !HAS_TRAIT(src, TRAIT_NATURAL)) + to_chat(user, span_warning("[src] ineffectively jams or malfunctions!")) + return FALSE + // DARKPACK EDIT ADD END if(damtype != STAMINA && final_force && HAS_TRAIT(user, TRAIT_PACIFISM)) to_chat(user, span_warning("You don't want to harm other living beings!")) return FALSE @@ -288,6 +293,11 @@ user.changeNext_move(attack_speed) if(get(src, /mob/living) == user) // telekinesis. user.do_attack_animation(attacked_atom) + // DARKPACK EDIT ADD START - WEREWOLF + if(HAS_TRAIT(user, TRAIT_JAMMING_WEAPONS) && !HAS_TRAIT(src, TRAIT_NATURAL)) + to_chat(user, span_warning("[src] ineffectively jams or malfunctions!")) + return FALSE + // DARKPACK EDIT ADD END if(attacked_atom.attacked_by(src, user, modifiers, attack_modifiers) == ATTACK_FAILED) return TRUE SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, attacked_atom, user, modifiers, attack_modifiers) @@ -302,12 +312,16 @@ return ATTACK_FAILED var/final_force = CALCULATE_FORCE(attacking_item, attack_modifiers) -// DARKPACK EDIT ADD START - if(isliving(user)) - var/mob/living/living_user = user - var/stat_multiplier = living_user.st_get_stat(STAT_MELEE) * 0.4 - final_force *= stat_multiplier -// DARKPACK EDIT ADD END + // DARKPACK EDIT ADD START - STORYTELLER_ROLLS/STORYTELLER_STATS + // This is pretty evil, but we are gonna convert all the tg force into the +# that melee weapons have listed. + // This means we can do stuff like set force of a baseball bat to 2 TTRPG_DAM and it just works. + if(isliving(user) && !HAS_TRAIT(user, TRAIT_PERFECT_ATTACKER)) + var/bonus_dice = round(final_force / (1 TTRPG_DAMAGE)) + var/datum/storyteller_roll/damage/damage_roll = new() + damage_roll.applicable_stats = list(attacking_item.st_damage_stat) + var/damage_roll_result = damage_roll.st_roll(user, src, bonus_dice) + final_force = damage_roll_result TTRPG_DAMAGE + // DARKPACK EDIT ADD END if(final_force <= 0) return 0 @@ -348,8 +362,25 @@ if(mob_biotypes & (MOB_ROBOTIC|MOB_MINERAL|MOB_SKELETAL)) // this should probably check hit bodypart for humanoids final_force *= attacking_item.get_demolition_modifier(src) - // DARKPACK EDIT ADD START - (Makes Melee do Something) - final_force += final_force * (user.st_get_stat(STAT_MELEE) * 0.1) + // DARKPACK EDIT ADD START - STORYTELLER_ROLLS/STORYTELLER_STATS + if(isliving(user) && !HAS_TRAIT(user, TRAIT_PERFECT_ATTACKER)) + var/datum/storyteller_roll/attack/attack_roll = new() + attack_roll.applicable_stats = list(attacking_item.st_attack_ability, attacking_item.st_attack_attribute) + attack_roll.difficulty = attacking_item.attack_difficulty + var/attack_roll_result = attack_roll.st_roll(user, src) + + // What i want to do is acctually have it return if not success. But that creates bad visual feedback as all the FX still play. just give them them SOME damage.. + if(attack_roll_result == ROLL_SUCCESS) + // This is pretty evil, but we are gonna convert all the tg force into the +# that melee weapons have listed. + // This means we can do stuff like set force of a baseball bat to 2 TTRPG_DAM and it just works. + var/bonus_dice = round(final_force / (1 TTRPG_DAMAGE)) + var/datum/storyteller_roll/damage/damage_roll = new() + damage_roll.applicable_stats = list(attacking_item.st_damage_stat) + var/damage_roll_result = damage_roll.st_roll(user, src, bonus_dice) + + final_force = max(damage_roll_result TTRPG_DAMAGE, 1 TTRPG_DAMAGE) + else + final_force = 1 TTRPG_DAMAGE // "SOME damage" in question // DARKPACK EDIT ADD END var/wounding = attacking_item.wound_bonus diff --git a/code/game/objects/effects/spawners/random/trash.dm b/code/game/objects/effects/spawners/random/trash.dm index d5a510a071d6..e80fde513eaf 100644 --- a/code/game/objects/effects/spawners/random/trash.dm +++ b/code/game/objects/effects/spawners/random/trash.dm @@ -187,6 +187,8 @@ icon_state = "vomit" loot = list( /obj/effect/decal/cleanable/trash = 20, // DARKPACK EDIT ADD START + /obj/effect/decal/cleanable/trash/big = 6, + /obj/effect/decal/cleanable/trash/books = 6, /obj/effect/decal/cleanable/litter = 6, /obj/effect/decal/cleanable/cardboard = 6, // DARKPACK EDIT ADD END /obj/effect/decal/cleanable/dirt = 6, diff --git a/code/game/objects/structures/beds_chairs/bed.dm b/code/game/objects/structures/beds_chairs/bed.dm index c6435e1973d7..c286b7fa2c8d 100644 --- a/code/game/objects/structures/beds_chairs/bed.dm +++ b/code/game/objects/structures/beds_chairs/bed.dm @@ -11,8 +11,7 @@ name = "bed" desc = "This is used to lie in, sleep in or strap on." icon_state = "bed" - icon = 'icons/obj/bed.dmi' - anchored = TRUE + icon = 'modular_darkpack/master_files/icons/obj/bed.dmi' // DARKPACK EDIT CHANGE can_buckle = TRUE buckle_lying = 90 buckle_dir = SOUTH diff --git a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm index c9986bae481f..64628e508b5a 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/freezer.dm @@ -4,6 +4,7 @@ icon = 'modular_darkpack/master_files/icons/obj/storage/closet32x32.dmi' // DARKPACK EDIT ADD flags_1 = PREVENT_CONTENTS_EXPLOSION_1 // DARKPACK EDIT CHANGE START + base_icon_state = "freezer" door_anim_time = 0 enable_door_overlay = FALSE has_opened_overlay = FALSE @@ -23,7 +24,7 @@ // DARKPACK EDIT ADD START - handles fridge open/close states since parent type handles it alot differently /obj/structure/closet/secure_closet/freezer/update_icon_state() . = ..() - icon_state = opened ? "freezeropen" : "freezer" + icon_state = opened ? "[base_icon_state]open" : "[base_icon_state]" // DARKPACK EDIT ADD END /obj/structure/closet/secure_closet/freezer/process_internal_air(seconds_per_tick) diff --git a/code/modules/food_and_drinks/equipment/kitchen_utensils.dm b/code/modules/food_and_drinks/equipment/kitchen_utensils.dm index 4991cffe03ce..920cec2408a5 100644 --- a/code/modules/food_and_drinks/equipment/kitchen_utensils.dm +++ b/code/modules/food_and_drinks/equipment/kitchen_utensils.dm @@ -22,6 +22,7 @@ /obj/item/kitchen/fork name = "fork" + ONFLOOR_ICON_HELPER('modular_darkpack/master_files/icons/obj/service/kitchen/kitchen.dmi') // DARKPACK EDIT ADD desc = "Pointy." icon_state = "fork" icon_angle = -90 @@ -90,6 +91,7 @@ /obj/item/knife/kitchen name = "kitchen knife" + ONFLOOR_ICON_HELPER('modular_darkpack/master_files/icons/obj/service/kitchen/kitchen.dmi') // DARKPACK EDIT ADD desc = "A general purpose Chef's Knife made by Cookoff Incorporated. Guaranteed to stay sharp for years to come." // DARKPACK EDIT CHANGE /obj/item/knife/plastic @@ -197,6 +199,7 @@ /obj/item/kitchen/spoon name = "spoon" + ONFLOOR_ICON_HELPER('modular_darkpack/master_files/icons/obj/service/kitchen/kitchen.dmi') // DARKPACK EDIT ADD desc = "Just be careful your food doesn't melt the spoon first." icon_state = "spoon" base_icon_state = "spoon" @@ -245,6 +248,10 @@ /obj/item/kitchen/spoon/update_overlays() . = ..() + // DARKPACK EDIT ADD START - WORLD_ICON + if(item_flags & ACTIVE_WORLD_ICON) // World icons have nothing but the base state atm + return + // DARKPACK EDIT ADD END if(reagents.total_volume <= 0) return var/mutable_appearance/filled_overlay = mutable_appearance(icon, "[base_icon_state]_filled") diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index d0f61730727d..c7a76d851536 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -452,6 +452,11 @@ /obj/item/gun/can_trigger_gun(mob/living/user, akimbo_usage) . = ..() + // DARKPACK EDIT ADD START - WEREWOLF + if(HAS_TRAIT(user, TRAIT_JAMMING_WEAPONS) && !HAS_TRAIT(src, TRAIT_NATURAL)) + to_chat(user, span_warning("[src] ineffectively jams or malfunctions!")) + return FALSE + // DARKPACK EDIT ADD END if(!handle_pins(user)) return FALSE diff --git a/code/modules/reagents/reagent_containers/condiment.dm b/code/modules/reagents/reagent_containers/condiment.dm index bcf0cc7e76c0..565f1539b32c 100644 --- a/code/modules/reagents/reagent_containers/condiment.dm +++ b/code/modules/reagents/reagent_containers/condiment.dm @@ -331,6 +331,7 @@ /obj/item/reagent_containers/condiment/ketchup name = "ketchup" + ONFLOOR_ICON_HELPER('modular_darkpack/master_files/icons/obj/food/containers.dmi') // DARKPACK EDIT ADD // At time of writing, "ketchup" mechanically, is just ground tomatoes, // rather than // tomatoes plus vinegar plus sugar. desc = "A tomato slurry in a tall plastic bottle. Somehow still vaguely American." @@ -340,6 +341,7 @@ /obj/item/reagent_containers/condiment/mustard name = "mustard" + ONFLOOR_ICON_HELPER('modular_darkpack/master_files/icons/obj/food/containers.dmi') // DARKPACK EDIT ADD desc = "A spicy and tangy sauce made out of the mustard plant. Great on hotdogs!" icon_state = "mustard" list_reagents = list(/datum/reagent/consumable/mustard = 50) diff --git a/code/modules/unit_tests/novaflower_burn.dm b/code/modules/unit_tests/novaflower_burn.dm index 165a738fda30..a9903dfca37c 100644 --- a/code/modules/unit_tests/novaflower_burn.dm +++ b/code/modules/unit_tests/novaflower_burn.dm @@ -20,6 +20,7 @@ botanist.adjust_fire_loss(-100) // And give them the plant safe trait so we don't have to worry about attacks being cancelled ADD_TRAIT(botanist, TRAIT_PLANT_SAFE, "unit_test") + ADD_TRAIT(botanist, TRAIT_PERFECT_ATTACKER, TRAIT_SOURCE_UNIT_TESTS) // DARKPACK EDIT ADD - (Ensure melee rolls dont skew damage) // Now, let's get a smack with the novaflower and see what happens. weapon.melee_attack_chain(botanist, victim) diff --git a/html/changelogs/AutoChangeLog-pr-1017.yml b/html/changelogs/AutoChangeLog-pr-1017.yml deleted file mode 100644 index 6046101dc5dc..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1017.yml +++ /dev/null @@ -1,5 +0,0 @@ -author: "FalloutFalcon" -delete-after: True -changes: - - balance: "Locks plants mutating behind a \"strange\" tray. (To be mapped inside pentex labs)" - - balance: "Removes the exotic seed crate from cargo" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1083.yml b/html/changelogs/AutoChangeLog-pr-1083.yml new file mode 100644 index 000000000000..bf0e2d94d485 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1083.yml @@ -0,0 +1,5 @@ +author: "Stutternov" +delete-after: True +changes: + - bugfix: "Fixes Obtenebrate embedding issue" + - balance: "Makes Obten 5 TT accurate with burns, agg damage, etc." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1091.yml b/html/changelogs/AutoChangeLog-pr-1091.yml deleted file mode 100644 index 8d5bb5581c3d..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1091.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "chazzyjazzy" -delete-after: True -changes: - - rscadd: "adds artifacts to dumpsters and the fishing loot table" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1108.yml b/html/changelogs/AutoChangeLog-pr-1108.yml deleted file mode 100644 index d4c1c6f5aa12..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1108.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "FalloutFalcon, somniworld" -delete-after: True -changes: - - image: "Replaces the corax war form hud icon with a better icon" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1109.yml b/html/changelogs/AutoChangeLog-pr-1109.yml deleted file mode 100644 index 7b4f7e4aa8e9..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1109.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "FalloutFalcon" -delete-after: True -changes: - - code_imp: "ritual book pulls vars from runes in a same method" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1111.yml b/html/changelogs/AutoChangeLog-pr-1111.yml new file mode 100644 index 000000000000..bb314f805dd5 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1111.yml @@ -0,0 +1,4 @@ +author: "chazzyjazzy" +delete-after: True +changes: + - rscadd: "adds 'inscription' ritual for tremeres which allows them to inscribe a ritual onto a parchment for non thaumaturgists to use" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1114.yml b/html/changelogs/AutoChangeLog-pr-1114.yml deleted file mode 100644 index 39627fa506c0..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1114.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "FalloutFalcon" -delete-after: True -changes: - - bugfix: "underplates layer above tables again" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1126.yml b/html/changelogs/AutoChangeLog-pr-1126.yml deleted file mode 100644 index d04a0064670b..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1126.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "FalloutFalcon" -delete-after: True -changes: - - bugfix: "Corax can have form specific flavor text like Garou" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1127.yml b/html/changelogs/AutoChangeLog-pr-1127.yml deleted file mode 100644 index 79b95bde816c..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1127.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "FalloutFalcon" -delete-after: True -changes: - - bugfix: "Corax and Garou fur colors wont override one another" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1128.yml b/html/changelogs/AutoChangeLog-pr-1128.yml deleted file mode 100644 index c7b30290a3ff..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1128.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "FalloutFalcon" -delete-after: True -changes: - - bugfix: "Characters who have tzimisce selectected internally will not have a zulo preference if not the proper splat" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1129.yml b/html/changelogs/AutoChangeLog-pr-1129.yml deleted file mode 100644 index 8182659837a8..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1129.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "FalloutFalcon" -delete-after: True -changes: - - bugfix: "balefire no longer runtimes" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1132.yml b/html/changelogs/AutoChangeLog-pr-1132.yml deleted file mode 100644 index ad88a05353df..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1132.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Marshmellow105" -delete-after: True -changes: - - bugfix: "fixed stone floors using cave floor icons" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1134.yml b/html/changelogs/AutoChangeLog-pr-1134.yml new file mode 100644 index 000000000000..61e9dc3898ab --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1134.yml @@ -0,0 +1,4 @@ +author: "chazzyjazzy" +delete-after: True +changes: + - rscadd: "adds 'donning the mask of shadows' a level two thaumaturgy ritual which is just a fake, bad obfuscate" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1137.yml b/html/changelogs/AutoChangeLog-pr-1137.yml deleted file mode 100644 index f2bdab0f1e56..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1137.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Dusk-a" -delete-after: True -changes: - - balance: "Gives Corax the proper amount of gnosis they should have" \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1139.yml b/html/changelogs/AutoChangeLog-pr-1139.yml deleted file mode 100644 index eda8cac2747a..000000000000 --- a/html/changelogs/AutoChangeLog-pr-1139.yml +++ /dev/null @@ -1,4 +0,0 @@ -author: "Beautiful TG coders" -delete-after: True -changes: - - code_imp: "TG Pull. Thank you TG." \ No newline at end of file diff --git a/html/changelogs/AutoChangeLog-pr-1159.yml b/html/changelogs/AutoChangeLog-pr-1159.yml new file mode 100644 index 000000000000..5c8a5bf70b8a --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-1159.yml @@ -0,0 +1,4 @@ +author: "chazzyjazzy" +delete-after: True +changes: + - bugfix: "katanas can be worn on the belt slot once more" \ No newline at end of file diff --git a/html/changelogs/archive/2026-06.yml b/html/changelogs/archive/2026-06.yml index edefa309d06c..7958517a5180 100644 --- a/html/changelogs/archive/2026-06.yml +++ b/html/changelogs/archive/2026-06.yml @@ -43,3 +43,58 @@ - bugfix: sarcophagus event will now fire only once per round max ellie: - rscadd: adds dragon's breath shotgun ammo +2026-06-15: + Beautiful TG coders: + - code_imp: TG Pull. Thank you TG. + Dusk-a: + - balance: Gives Corax the proper amount of gnosis they should have + FalloutFalcon: + - bugfix: Characters who have tzimisce selectected internally will not have a zulo + preference if not the proper splat + - bugfix: underplates layer above tables again + - bugfix: Corax can have form specific flavor text like Garou + - bugfix: Corax and Garou fur colors wont override one another + - balance: Locks plants mutating behind a "strange" tray. (To be mapped inside pentex + labs) + - balance: Removes the exotic seed crate from cargo + - code_imp: ritual book pulls vars from runes in a same method + - balance: Reworks melee to roll damage based off two rolls (to parody the TTRPG + and brawl) + - balance: Protean claws use brawl + - refactor: Removes snowflake protean claws damage buff in favor of generic melee + code + - bugfix: balefire no longer runtimes + FalloutFalcon, Major00: + - rscadd: 'Adds new gifts: Jam Weapon (Children of Gaia), Control Simple Machine + (Glasswalker), Hidden Killer (Red Talon), Aura of confidence & Fatal Flaw (Shadow + Lords), Speed of Thought (Silent Striders), Bane Protector (BSD)' + - rscadd: Adds some little lesser banes + - qol: powers that spend willpower log it to chat + - qol: removes pointless to_chat that just says "you cast gift" as most have better + built in feedback + - image: '"Tribe gifts: Part 1" gifts now have unique icons' + - code_imp: adds signal that code can hook onto to change bonus dice of rolls + FalloutFalcon, somniworld: + - image: Replaces the corax war form hud icon with a better icon + Icarus-The-Sun: + - rscadd: Adds Hemophiliac, Lame, Light Sensitive, Permanent Wound, and Short flaws + Marshmellow105: + - bugfix: fixed stone floors using cave floor icons + Stutternov: + - rscadd: Adds forced-flee movement to terrifying presence. + - rscadd: Adds extended action debuff+stun to terrifying presence. + chazzyjazzy: + - rscadd: adds artifacts to dumpsters and the fishing loot table + dwinters99, Major00, INFRARED_BARON: + - rscadd: sleeping bags + - rscadd: carwash rollers, torches, and grates (2 kinds) + - rscadd: fallout shelter signs (2 kinds) + - rscadd: bollards (4 kinds) + - image: new urinal sprite + - rscadd: new table type + addons + - rscadd: cigarette shelves + - rscadd: metal rack + - rscadd: commercial freezers + - image: onfloors for ketchup, mustard, forks, knives, and spoons + - rscadd: new trash and alleyway sprites (all by INFRARED_BARON) + - rscadd: lectern and pulpit diff --git a/icons/obj/smooth_structures/darkpack/fastfood_table.dmi b/icons/obj/smooth_structures/darkpack/fastfood_table.dmi new file mode 100644 index 000000000000..0762bebba22d Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/fastfood_table.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/fastfood_table.png b/icons/obj/smooth_structures/darkpack/fastfood_table.png new file mode 100644 index 000000000000..06b28da03d7d Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/fastfood_table.png differ diff --git a/icons/obj/smooth_structures/darkpack/fastfood_table.png.toml b/icons/obj/smooth_structures/darkpack/fastfood_table.png.toml new file mode 100644 index 000000000000..368de06a332b --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/fastfood_table.png.toml @@ -0,0 +1,2 @@ +output_name = "fastfood_table" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/darkpack/fastfood_table_addon1.dmi b/icons/obj/smooth_structures/darkpack/fastfood_table_addon1.dmi new file mode 100644 index 000000000000..7883b4756b67 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/fastfood_table_addon1.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/fastfood_table_addon1.png b/icons/obj/smooth_structures/darkpack/fastfood_table_addon1.png new file mode 100644 index 000000000000..d3910b99b731 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/fastfood_table_addon1.png differ diff --git a/icons/obj/smooth_structures/darkpack/fastfood_table_addon1.png.toml b/icons/obj/smooth_structures/darkpack/fastfood_table_addon1.png.toml new file mode 100644 index 000000000000..90965114b28b --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/fastfood_table_addon1.png.toml @@ -0,0 +1,2 @@ +output_name = "fastfood_table_addon1" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/darkpack/fastfood_table_addon2.dmi b/icons/obj/smooth_structures/darkpack/fastfood_table_addon2.dmi new file mode 100644 index 000000000000..0f854ccd8739 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/fastfood_table_addon2.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/fastfood_table_addon2.png b/icons/obj/smooth_structures/darkpack/fastfood_table_addon2.png new file mode 100644 index 000000000000..e861a41c3188 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/fastfood_table_addon2.png differ diff --git a/icons/obj/smooth_structures/darkpack/fastfood_table_addon2.png.toml b/icons/obj/smooth_structures/darkpack/fastfood_table_addon2.png.toml new file mode 100644 index 000000000000..2edb630d6a89 --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/fastfood_table_addon2.png.toml @@ -0,0 +1,2 @@ +output_name = "fastfood_table_addon2" +template = "bitmask/diagonal_32x32.toml" diff --git a/icons/obj/smooth_structures/darkpack/fastfood_table_addon3.dmi b/icons/obj/smooth_structures/darkpack/fastfood_table_addon3.dmi new file mode 100644 index 000000000000..bb2259b53b8d Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/fastfood_table_addon3.dmi differ diff --git a/icons/obj/smooth_structures/darkpack/fastfood_table_addon3.png b/icons/obj/smooth_structures/darkpack/fastfood_table_addon3.png new file mode 100644 index 000000000000..236183de3140 Binary files /dev/null and b/icons/obj/smooth_structures/darkpack/fastfood_table_addon3.png differ diff --git a/icons/obj/smooth_structures/darkpack/fastfood_table_addon3.png.toml b/icons/obj/smooth_structures/darkpack/fastfood_table_addon3.png.toml new file mode 100644 index 000000000000..21f6b5ce892e --- /dev/null +++ b/icons/obj/smooth_structures/darkpack/fastfood_table_addon3.png.toml @@ -0,0 +1,2 @@ +output_name = "fastfood_table_addon3" +template = "bitmask/diagonal_32x32.toml" diff --git a/modular_darkpack/master_files/code/game/objects/items.dm b/modular_darkpack/master_files/code/game/objects/items.dm index 0ba0a0b0bbaa..381615140712 100644 --- a/modular_darkpack/master_files/code/game/objects/items.dm +++ b/modular_darkpack/master_files/code/game/objects/items.dm @@ -2,3 +2,9 @@ var/onflooricon var/onflooricon_state var/masquerade_violating + + // STORYTELLR_STATS + var/datum/st_stat/st_attack_ability = STAT_DEXTERITY + var/datum/st_stat/st_attack_attribute = STAT_MELEE + var/attack_difficulty = 6 + var/datum/st_stat/st_damage_stat = STAT_STRENGTH diff --git a/modular_darkpack/master_files/code/modules/rituals/code/ritual_rune_drawing.dm b/modular_darkpack/master_files/code/modules/rituals/code/ritual_rune_drawing.dm index 6cb0555f1c08..cdf5539c2c65 100644 --- a/modular_darkpack/master_files/code/modules/rituals/code/ritual_rune_drawing.dm +++ b/modular_darkpack/master_files/code/modules/rituals/code/ritual_rune_drawing.dm @@ -53,7 +53,7 @@ for(var/rune_path in subtypesof(rune_type)) var/obj/ritual_rune/R = new rune_path(owner) if(R.level <= level) - runes[R.ritual_name] = list("path" = rune_path, "cost" = R.cost) + runes[R.ritual_name] = list("path" = rune_path, "cost" = R.cost, "level" = R.level) qdel(R) return runes diff --git a/modular_darkpack/master_files/icons/obj/bed.dmi b/modular_darkpack/master_files/icons/obj/bed.dmi new file mode 100644 index 000000000000..c283250197f9 Binary files /dev/null and b/modular_darkpack/master_files/icons/obj/bed.dmi differ diff --git a/modular_darkpack/master_files/icons/obj/bed_inhand_left.dmi b/modular_darkpack/master_files/icons/obj/bed_inhand_left.dmi new file mode 100644 index 000000000000..64022c3fe59e Binary files /dev/null and b/modular_darkpack/master_files/icons/obj/bed_inhand_left.dmi differ diff --git a/modular_darkpack/master_files/icons/obj/bed_inhand_right.dmi b/modular_darkpack/master_files/icons/obj/bed_inhand_right.dmi new file mode 100644 index 000000000000..461fcb2c7a1b Binary files /dev/null and b/modular_darkpack/master_files/icons/obj/bed_inhand_right.dmi differ diff --git a/modular_darkpack/master_files/icons/obj/food/containers.dmi b/modular_darkpack/master_files/icons/obj/food/containers.dmi new file mode 100644 index 000000000000..8bfc6f00c63e Binary files /dev/null and b/modular_darkpack/master_files/icons/obj/food/containers.dmi differ diff --git a/modular_darkpack/master_files/icons/obj/service/kitchen/kitchen.dmi b/modular_darkpack/master_files/icons/obj/service/kitchen/kitchen.dmi index b15fe89b818a..6951eab8bead 100644 Binary files a/modular_darkpack/master_files/icons/obj/service/kitchen/kitchen.dmi and b/modular_darkpack/master_files/icons/obj/service/kitchen/kitchen.dmi differ diff --git a/modular_darkpack/master_files/icons/obj/storage/closet32x32.dmi b/modular_darkpack/master_files/icons/obj/storage/closet32x32.dmi index 4a0864a5d141..2a42065da2c5 100644 Binary files a/modular_darkpack/master_files/icons/obj/storage/closet32x32.dmi and b/modular_darkpack/master_files/icons/obj/storage/closet32x32.dmi differ diff --git a/modular_darkpack/master_files/icons/obj/watercloset.dmi b/modular_darkpack/master_files/icons/obj/watercloset.dmi index 6c0d351f1730..8bee1b9ca68a 100644 Binary files a/modular_darkpack/master_files/icons/obj/watercloset.dmi and b/modular_darkpack/master_files/icons/obj/watercloset.dmi differ diff --git a/modular_darkpack/modules/decor/code/bollards.dm b/modular_darkpack/modules/decor/code/bollards.dm new file mode 100644 index 000000000000..6235bed8ac6d --- /dev/null +++ b/modular_darkpack/modules/decor/code/bollards.dm @@ -0,0 +1,18 @@ +/obj/structure/fluff/bollard + name = "bollard" + desc = "For stopping large things but not small things." + icon = 'modular_darkpack/modules/decor/icons/bollards.dmi' + icon_state = "yellow" + +/obj/structure/fluff/bollard/dual + name = "bollards" + icon_state = "yellow_dual" + +/obj/structure/fluff/bollard/grey + icon_state = "grey" + +/obj/structure/fluff/bollard/dual/grey + icon_state = "grey_dual" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fluff/bollard/dual, 0) +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/fluff/bollard/dual/grey, 0) diff --git a/modular_darkpack/modules/decor/code/carwash.dm b/modular_darkpack/modules/decor/code/carwash.dm new file mode 100644 index 000000000000..1712e8c68ceb --- /dev/null +++ b/modular_darkpack/modules/decor/code/carwash.dm @@ -0,0 +1,16 @@ +/obj/structure/carwash + name = "carwash organizational subtype" + icon = 'modular_darkpack/modules/decor/icons/carwash.dmi' + abstract_type = /obj/structure/carwash +/* +/obj/structure/carwash/conveyor // TODO: icon + name = "conveyer" + desc = "One of many things that makes cars move, now bolted to the floor for your convenience." + icon_state = "conveyor" +*/ +/obj/structure/carwash/roller + name = "friction brush" + desc = "Terrifying for dogs and small children." + icon_state = "roller" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/carwash/roller, 0) diff --git a/modular_darkpack/modules/decor/code/cigarette_shelf.dm b/modular_darkpack/modules/decor/code/cigarette_shelf.dm new file mode 100644 index 000000000000..955023efb75c --- /dev/null +++ b/modular_darkpack/modules/decor/code/cigarette_shelf.dm @@ -0,0 +1,15 @@ +/obj/machinery/vending/cigarette/shelf + name = "cigarette shelf" + desc = "Every variety, except for the one you really like." + icon = 'modular_darkpack/modules/decor/icons/cigarette_shelf.dmi' // TODO: add behavior for swapping to the empty icon + icon_state = "ciggies1" + base_icon_state = "ciggies" + tiltable = FALSE + panel_type = "panel22" + light_mask = "ciggies-light-mask" + light_color = COLOR_WHITE + +/obj/machinery/vending/cigarette/shelf/Initialize(mapload) + . = ..() + if(icon_state == src::icon_state) + icon_state = "[base_icon_state][rand(1,3)]" diff --git a/modular_darkpack/modules/decor/code/commercial_freezer.dm b/modular_darkpack/modules/decor/code/commercial_freezer.dm new file mode 100644 index 000000000000..7ad85df0a605 --- /dev/null +++ b/modular_darkpack/modules/decor/code/commercial_freezer.dm @@ -0,0 +1,7 @@ +/obj/structure/closet/secure_closet/freezer/commercial + icon_state = "commercial" + base_icon_state = "commercial" + +/obj/structure/closet/secure_closet/freezer/commercial/small + icon_state = "commercial_small" + base_icon_state = "commercial_small" diff --git a/modular_darkpack/modules/decor/code/decor.dm b/modular_darkpack/modules/decor/code/decor.dm index 51bd0053083a..030ef0a2b7fa 100644 --- a/modular_darkpack/modules/decor/code/decor.dm +++ b/modular_darkpack/modules/decor/code/decor.dm @@ -192,7 +192,7 @@ /obj/structure/trashbag/Initialize(mapload) . = ..() - icon_state = "garbage[rand(7, 9)]" + icon_state = "garbage[rand(3, 6)]" /obj/structure/trashbag/Destroy() new /obj/effect/spawner/random/trash/garbage(loc) @@ -331,19 +331,51 @@ /obj/structure/barrels name = "barrel" - desc = "Storage some liquids." + desc = "Store some liquids." icon = 'modular_darkpack/modules/decor/icons/barrels.dmi' icon_state = "barrel1" + base_icon_state = "barrel" layer = ABOVE_ALL_MOB_LAYER anchored = TRUE density = TRUE + var/variants = 12 /obj/structure/barrels/rand icon_state = "barrel2" /obj/structure/barrels/rand/Initialize(mapload) . = ..() - icon_state = "barrel[rand(1, 12)]" + icon_state = "[base_icon_state][rand(1, variants)]" + +/obj/structure/barrels/plural + name = "barrels" + desc = "Store some liquids." + icon = 'modular_darkpack/modules/decor/icons/barrels.dmi' + icon_state = "barrels1" + base_icon_state = "barrels" + layer = ABOVE_ALL_MOB_LAYER + anchored = TRUE + density = TRUE + +/obj/structure/barrels/rand/plural + icon_state = "barrels2" + base_icon_state = "barrels" + variants = 18 + +/obj/structure/barrels/rusty + name = "barrels" + desc = "Used to store some liquids." + icon = 'modular_darkpack/modules/decor/icons/barrels.dmi' + icon_state = "rustybarrels1" + base_icon_state = "rustybarrels" + layer = ABOVE_ALL_MOB_LAYER + anchored = TRUE + density = TRUE + +/obj/structure/barrels/rand/rusty + icon_state = "rustybarrels2" + base_icon_state = "rustybarrels" + variants = 6 /obj/structure/bricks name = "bricks" @@ -354,6 +386,43 @@ anchored = TRUE density = TRUE +/obj/structure/tire + name = "tire" + desc = "It's a tire." + icon = 'modular_darkpack/modules/decor/icons/alleyway.dmi' + icon_state = "tire" + anchored = TRUE + density = FALSE + +/obj/structure/tire/Initialize(mapload) + . = ..() + AddElement(/datum/element/elevation, pixel_shift = 14) + +/obj/structure/tire/big + icon_state = "bigtire" + density = TRUE + +/obj/structure/tire/big/Initialize(mapload) + . = ..() + AddElement(/datum/element/climbable) + +/obj/structure/pallets + name = "pallets" + desc = "Great for burning and blocking the player in cheap 2005 FPS games." + icon = 'modular_darkpack/modules/decor/icons/alleyway_32x48.dmi' + icon_state = "pallets1" + layer = ABOVE_ALL_MOB_LAYER + anchored = TRUE + density = TRUE + +/obj/structure/pallets/rand + icon_state = "pallets2" + +/obj/structure/pallets/rand/Initialize(mapload) + . = ..() + if(icon_state == src::icon_state) + icon_state = "pallets[rand(1, 2)]" + /obj/effect/decal/pallet name = "pallet" icon = 'modular_darkpack/modules/decor/icons/alleyway.dmi' diff --git a/modular_darkpack/modules/decor/code/fallout_shelter_sign.dm b/modular_darkpack/modules/decor/code/fallout_shelter_sign.dm new file mode 100644 index 000000000000..082110e8e396 --- /dev/null +++ b/modular_darkpack/modules/decor/code/fallout_shelter_sign.dm @@ -0,0 +1,11 @@ +/obj/structure/sign/fallout_shelter + name = "fallout shelter sign" + desc = "Good thing the Cold War is over. Right?" + icon = 'modular_darkpack/modules/decor/icons/fallout_shelter_sign.dmi' + +/obj/structure/sign/fallout_shelter/round + name = "fallout shelter sign" + icon_state = "round" + +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/fallout_shelter, 32) +MAPPING_DIRECTIONAL_HELPERS(/obj/structure/sign/fallout_shelter/round, 32) diff --git a/modular_darkpack/modules/decor/code/grate.dm b/modular_darkpack/modules/decor/code/grate.dm new file mode 100644 index 000000000000..b5376ee9c18a --- /dev/null +++ b/modular_darkpack/modules/decor/code/grate.dm @@ -0,0 +1,25 @@ +/obj/structure/fluff/grate // TODO: make the floor dry faster? Or maybe stop wetting all-together + name = "large grate" + desc = "Shiny. Is that a hairball?" + icon = 'modular_darkpack/modules/decor/icons/grate.dmi' + icon_state = "grate" + plane = FLOOR_PLANE + layer = BELOW_CATWALK_LAYER + +/obj/structure/fluff/grate/rusty + desc = "Rusty. Is that a hairball?" + icon_state = "grate-rust" + +/obj/structure/fluff/grate/round + icon_state = "grate_round" + +/obj/structure/fluff/grate/rusty/round + icon_state = "grate_round-rust" + +/obj/structure/fluff/grate/drain + name = "drain" + icon_state = "grate_small" + +/obj/structure/fluff/grate/drain/rusty + desc = "Rusty. Is that a hairball?" + icon_state = "grate_small-rust" diff --git a/modular_darkpack/modules/decor/code/lectern.dm b/modular_darkpack/modules/decor/code/lectern.dm new file mode 100644 index 000000000000..16fea75ec035 --- /dev/null +++ b/modular_darkpack/modules/decor/code/lectern.dm @@ -0,0 +1,14 @@ +/obj/structure/lectern + name = "lectern" + desc = "This thing would be great cover if someone threw a pair of shoes at you." + icon = 'modular_darkpack/modules/decor/icons/lectern.dmi' + icon_state = "lectern" + density = TRUE + anchored = TRUE + layer = ABOVE_MOB_LAYER + pass_flags_self = PASSSTRUCTURE | PASSTABLE | LETPASSTHROW + +/obj/structure/lectern/pulpit // TODO: make holy for baali repulsion + name = "pulpit" + desc = "Like a lectern, but holy." + icon_state = "pulpit" diff --git a/modular_darkpack/modules/decor/code/racks.dm b/modular_darkpack/modules/decor/code/racks.dm index a94250fd566a..a5fece7b2cda 100644 --- a/modular_darkpack/modules/decor/code/racks.dm +++ b/modular_darkpack/modules/decor/code/racks.dm @@ -30,6 +30,9 @@ icon = 'modular_darkpack/modules/decor/icons/rack.dmi' icon_state = "fruit_stand" +/obj/structure/rack/metal + icon = 'modular_darkpack/modules/decor/icons/rack.dmi' + icon_state = "metal" // Soft deprecated. /obj/structure/rack/food diff --git a/modular_darkpack/modules/decor/code/sleeping_bag.dm b/modular_darkpack/modules/decor/code/sleeping_bag.dm new file mode 100644 index 000000000000..5ffe2c5c1c17 --- /dev/null +++ b/modular_darkpack/modules/decor/code/sleeping_bag.dm @@ -0,0 +1,71 @@ +// Here be sleeping bags +// Largely copied from medical beds, snowflaked here to avoid overlapping functionality + +/obj/structure/bed/sleeping_bag + name = "sleeping bag" + desc = "Some know it as a bedroll." + icon_state = "bedroll" // Sprites by @Major00 + max_integrity = 25 + integrity_failure = 0.35 + build_stack_type = /obj/item/stack/sheet/leather + can_deconstruct = FALSE + anchored = FALSE + var/foldable_type = /obj/item/sleeping_bag // Snowflaked version of the rollerbed behavior + +/obj/structure/bed/sleeping_bag/Initialize(mapload) + . = ..() + AddElement(/datum/element/noisy_movement, movement_sound = 'sound/effects/footstep/crawl1.ogg') + +/obj/structure/bed/sleeping_bag/add_context(atom/source, list/context, obj/item/held_item, mob/living/user) + . = ..() + if(!isnull(foldable_type) && !has_buckled_mobs()) + context[SCREENTIP_CONTEXT_RMB] = "Roll up" + + return CONTEXTUAL_SCREENTIP_SET + +/obj/structure/bed/sleeping_bag/examine(mob/user) + . = ..() + if(anchored) + . += span_notice("It's stuck to the ground.") + else if(!isnull(foldable_type)) + . += span_notice("You can fold it up with a Right-click.") + +/obj/structure/bed/sleeping_bag/attack_hand_secondary(mob/user, list/modifiers) + . = ..() + if(. == SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(!ishuman(user) || !user.can_perform_action(src)) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(has_buckled_mobs()) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + + user.visible_message(span_notice("[user] rolls up [src]."), span_notice("You roll up [src].")) + var/obj/structure/bed/sleeping_bag/folding_bed = new foldable_type(get_turf(src)) + user.put_in_hands(folding_bed) + qdel(src) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/item/sleeping_bag + name = "sleeping bag" + desc = "A rolled up bed that can be carried around. A bedroll if you will." + icon = 'modular_darkpack/master_files/icons/obj/bed.dmi' + icon_state = "bedroll_inv" + inhand_icon_state = "bedroll" + lefthand_file = 'modular_darkpack/master_files/icons/obj/bed_inhand_left.dmi' + righthand_file = 'modular_darkpack/master_files/icons/obj/bed_inhand_right.dmi' + w_class = WEIGHT_CLASS_NORMAL // No more excuses, stop getting blood everywhere + ONFLOOR_ICON_HELPER('modular_darkpack/modules/decor/icons/bed_onfloor.dmi') + +/obj/item/sleeping_bag/attack_self(mob/user) + deploy_bed(user, user.loc) + +/obj/item/sleeping_bag/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers) + if(isopenturf(interacting_with)) + deploy_bed(user, interacting_with) + return ITEM_INTERACT_SUCCESS + return NONE + +/obj/item/sleeping_bag/proc/deploy_bed(mob/user, atom/location) + var/obj/structure/bed/sleeping_bag/deployed = new /obj/structure/bed/sleeping_bag(location) + deployed.add_fingerprint(user) + qdel(src) diff --git a/modular_darkpack/modules/decor/code/tables.dm b/modular_darkpack/modules/decor/code/tables.dm index d8152fe73aff..21690170af0a 100644 --- a/modular_darkpack/modules/decor/code/tables.dm +++ b/modular_darkpack/modules/decor/code/tables.dm @@ -88,3 +88,41 @@ base_icon_state = "yellowtop_table" smoothing_groups = SMOOTH_GROUP_COLOR_COUNTERTOP canSmoothWith = SMOOTH_GROUP_COLOR_COUNTERTOP + +/obj/structure/table/countertop/fastfood + icon = 'icons/obj/smooth_structures/darkpack/fastfood_table.dmi' + icon_state = "fastfood_table-0" + base_icon_state = "fastfood_table" + smoothing_groups = SMOOTH_GROUP_FF_TABLES + canSmoothWith = SMOOTH_GROUP_FF_TABLES + +/obj/structure/table/countertop/fastfood/addon1 + icon = 'icons/obj/smooth_structures/darkpack/fastfood_table_addon1.dmi' + icon_state = "fastfood_table_addon1-0" + base_icon_state = "fastfood_table_addon1" + +/obj/structure/table/countertop/fastfood/addon2 + icon = 'icons/obj/smooth_structures/darkpack/fastfood_table_addon2.dmi' + icon_state = "fastfood_table_addon2-0" + base_icon_state = "fastfood_table_addon2" + +/obj/structure/table/countertop/fastfood/addon3 + icon = 'icons/obj/smooth_structures/darkpack/fastfood_table_addon3.dmi' + icon_state = "fastfood_table_addon3-0" + base_icon_state = "fastfood_table_addon3" + +/obj/structure/table/countertop/fastfood/rand // Should probably use sparingly... + var/list/possible_icons = list('icons/obj/smooth_structures/darkpack/fastfood_table.dmi', + 'icons/obj/smooth_structures/darkpack/fastfood_table_addon1.dmi', + 'icons/obj/smooth_structures/darkpack/fastfood_table_addon2.dmi', + 'icons/obj/smooth_structures/darkpack/fastfood_table_addon3.dmi') + var/list/possible_icon_states = list("fastfood_table-0", "fastfood_table_addon1-0", + "fastfood_table_addon2-0", "fastfood_table_addon3-0") + var/list/possible_base_icon_states = list("fastfood_table", "fastfood_table_addon1", + "fastfood_table_addon2", "fastfood_table_addon3") + +/obj/structure/table/countertop/fastfood/rand/Initialize(mapload) + . = ..() + icon = pick(possible_icons) + icon_state = possible_icon_states[possible_icons.Find(icon)] + base_icon_state = possible_base_icon_states[possible_icons.Find(icon)] diff --git a/modular_darkpack/modules/decor/code/torch.dm b/modular_darkpack/modules/decor/code/torch.dm new file mode 100644 index 000000000000..4c50e0c52345 --- /dev/null +++ b/modular_darkpack/modules/decor/code/torch.dm @@ -0,0 +1,12 @@ +/obj/structure/bonfire/torch + name = "torch" + desc = "A stick on fire. Revolutionary." + icon = 'modular_darkpack/modules/decor/icons/torch.dmi' + icon_state = "torch" + base_icon_state = "torch" + density = TRUE + pass_flags_self = LETPASSTHROW + burn_icon = "_lit" + +/obj/structure/bonfire/torch/unlit + burning = FALSE diff --git a/modular_darkpack/modules/decor/code/trash.dm b/modular_darkpack/modules/decor/code/trash.dm index 902e8120accb..362b6d76e46a 100644 --- a/modular_darkpack/modules/decor/code/trash.dm +++ b/modular_darkpack/modules/decor/code/trash.dm @@ -3,11 +3,13 @@ name = "trash" icon = 'modular_darkpack/modules/decor/icons/trash.dmi' icon_state = "trash1" + base_icon_state = "trash" clean_type = CLEAN_TYPE_HARD_DECAL + var/variants = 30 /obj/effect/decal/cleanable/trash/Initialize(mapload) . = ..() - icon_state = "trash[rand(1, 30)]" + icon_state = "[base_icon_state][rand(1, variants)]" /obj/effect/decal/cleanable/trash/NeverShouldHaveComeHere(turf/here_turf) return isclosedturf(here_turf) @@ -40,3 +42,19 @@ /obj/effect/decal/cleanable/cardboard/NeverShouldHaveComeHere(turf/here_turf) return isclosedturf(here_turf) + +/obj/effect/decal/cleanable/trash/big + name = "trash" + icon = 'modular_darkpack/modules/decor/icons/trash.dmi' + icon_state = "bigtrash1" + base_icon_state = "bigtrash" + clean_type = CLEAN_TYPE_HARD_DECAL + variants = 12 + +/obj/effect/decal/cleanable/trash/books + name = "trash" + icon = 'modular_darkpack/modules/decor/icons/trash.dmi' + icon_state = "books1" + base_icon_state = "books" + clean_type = CLEAN_TYPE_HARD_DECAL + variants = 13 diff --git a/modular_darkpack/modules/decor/icons/alleyway.dmi b/modular_darkpack/modules/decor/icons/alleyway.dmi index de627629cffc..012922250de0 100644 Binary files a/modular_darkpack/modules/decor/icons/alleyway.dmi and b/modular_darkpack/modules/decor/icons/alleyway.dmi differ diff --git a/modular_darkpack/modules/decor/icons/alleyway_32x48.dmi b/modular_darkpack/modules/decor/icons/alleyway_32x48.dmi new file mode 100644 index 000000000000..35eead068023 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/alleyway_32x48.dmi differ diff --git a/modular_darkpack/modules/decor/icons/barrels.dmi b/modular_darkpack/modules/decor/icons/barrels.dmi index 0d09e73dae18..2f4d7552f93d 100644 Binary files a/modular_darkpack/modules/decor/icons/barrels.dmi and b/modular_darkpack/modules/decor/icons/barrels.dmi differ diff --git a/modular_darkpack/modules/decor/icons/bed_onfloor.dmi b/modular_darkpack/modules/decor/icons/bed_onfloor.dmi new file mode 100644 index 000000000000..ac714d2e0b21 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/bed_onfloor.dmi differ diff --git a/modular_darkpack/modules/decor/icons/bollards.dmi b/modular_darkpack/modules/decor/icons/bollards.dmi new file mode 100644 index 000000000000..644c09e5f113 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/bollards.dmi differ diff --git a/modular_darkpack/modules/decor/icons/carwash.dmi b/modular_darkpack/modules/decor/icons/carwash.dmi new file mode 100644 index 000000000000..e5b19dd66c50 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/carwash.dmi differ diff --git a/modular_darkpack/modules/decor/icons/cigarette_shelf.dmi b/modular_darkpack/modules/decor/icons/cigarette_shelf.dmi new file mode 100644 index 000000000000..d5b652420855 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/cigarette_shelf.dmi differ diff --git a/modular_darkpack/modules/decor/icons/fallout_shelter_sign.dmi b/modular_darkpack/modules/decor/icons/fallout_shelter_sign.dmi new file mode 100644 index 000000000000..f923ca5ecf7d Binary files /dev/null and b/modular_darkpack/modules/decor/icons/fallout_shelter_sign.dmi differ diff --git a/modular_darkpack/modules/decor/icons/grate.dmi b/modular_darkpack/modules/decor/icons/grate.dmi new file mode 100644 index 000000000000..8288f99e7656 Binary files /dev/null and b/modular_darkpack/modules/decor/icons/grate.dmi differ diff --git a/modular_darkpack/modules/decor/icons/lectern.dmi b/modular_darkpack/modules/decor/icons/lectern.dmi new file mode 100644 index 000000000000..e7c8bd6380da Binary files /dev/null and b/modular_darkpack/modules/decor/icons/lectern.dmi differ diff --git a/modular_darkpack/modules/decor/icons/rack.dmi b/modular_darkpack/modules/decor/icons/rack.dmi index 9f03e310d954..c098e4586f8b 100644 Binary files a/modular_darkpack/modules/decor/icons/rack.dmi and b/modular_darkpack/modules/decor/icons/rack.dmi differ diff --git a/modular_darkpack/modules/decor/icons/torch.dmi b/modular_darkpack/modules/decor/icons/torch.dmi new file mode 100644 index 000000000000..38c97a794b0a Binary files /dev/null and b/modular_darkpack/modules/decor/icons/torch.dmi differ diff --git a/modular_darkpack/modules/decor/icons/trash.dmi b/modular_darkpack/modules/decor/icons/trash.dmi index 9eaa281aadd5..cf1b35a677b8 100644 Binary files a/modular_darkpack/modules/decor/icons/trash.dmi and b/modular_darkpack/modules/decor/icons/trash.dmi differ diff --git a/modular_darkpack/modules/doors/code/vampdoor.dm b/modular_darkpack/modules/doors/code/vampdoor.dm index 1158f4192fdd..8d55a1924410 100644 --- a/modular_darkpack/modules/doors/code/vampdoor.dm +++ b/modular_darkpack/modules/doors/code/vampdoor.dm @@ -365,10 +365,12 @@ /obj/structure/vampdoor/proc/toggle_lock(mob/living/user) playsound(src, lock_sound, 75, TRUE) if(!locked) - to_chat(user, span_notice("[src] is now locked.")) + if(user) + to_chat(user, span_notice("[src] is now locked.")) locked = TRUE else - to_chat(user, span_notice("[src] is now unlocked.")) + if(user) + to_chat(user, span_notice("[src] is now unlocked.")) proc_unlock("key") locked = FALSE return TRUE diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/hemophiliac.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/hemophiliac.dm new file mode 100644 index 000000000000..6f4007aa946f --- /dev/null +++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/hemophiliac.dm @@ -0,0 +1,33 @@ +// VTM Ghouls and Revenants pg. 136 +/datum/quirk/darkpack/hemophiliac + name = "Hemophiliac" + desc = {"Your character suffers from hemophilia. +If your skin is cut, you will not stop bleeding without medical assistance."} + icon = FA_ICON_DROPLET + value = -3 + gain_text = span_notice("You feel like bleeding is a lot more dangerous.") + lose_text = span_notice("You feel like bleeding's a lot safer now. Whew!") + failure_message = span_notice("You feel like bleeding's a lot safer now. Whew!") + forbidden_splats = list(SPLAT_KINDRED, SPLAT_SHIFTERS) // Kinfolk, humans, and ghouls can take this. Debate adding Garou/Corax to it? + +/*Your character suffers from hemophilia. If your ghoul’s +skin is cut, you will not stop bleeding without medical +assistance. The Blood does not have any effect on a ghoul +or revenant Hemophiliac. +If your character suffers lethal or aggravated damage, +he suffers an additional level of bashing damage every +five minutes until his wound has been dressed to stop +the bleeding. Any vampire who bites a Hemophiliac may +“dress” such wounds. By licking the injury after biting the +ghoul, the vampire will put a stop to any future bashing +damage.*/ + +/datum/quirk/darkpack/hemophiliac/add(client/client_source) + . = ..() + ADD_TRAIT(quirk_holder, TRAIT_EASYBLEED, QUIRK_TRAIT) // Easier to make bleed + ADD_TRAIT(quirk_holder, TRAIT_BLOOD_FOUNTAIN, QUIRK_TRAIT) // worse bleeding when they do + +/datum/quirk/darkpack/hemophiliac/remove() + . = ..() + REMOVE_TRAIT(quirk_holder, TRAIT_EASYBLEED, QUIRK_TRAIT) + REMOVE_TRAIT(quirk_holder, TRAIT_BLOOD_FOUNTAIN, QUIRK_TRAIT) diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/lame.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/lame.dm new file mode 100644 index 000000000000..9f8b8f5bed98 --- /dev/null +++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/lame.dm @@ -0,0 +1,54 @@ +// VTM pg. 482 +/datum/quirk/darkpack/lame + name = "Lame" + desc = {"One or both of your legs are damaged, which prevents you from running or walking easily. +You are forced to walk with a crutch or possibly leg braces, and you have a pronounced limp to your stride."} // we give them one leg trait to select, since using both will make them unable to walk entirely. + icon = FA_ICON_CRUTCH + value = -3 + gain_text = span_notice("Your legs ache!") + lose_text = span_notice("Your legs no longer hurt.") + failure_message = span_notice("Your legs no longer hurt.") + var/lame_leg // Which leg are we not using? + +/*Your legs are damaged, which prevents you from running or walking easily. +You are forced to walk with a cane or possibly leg braces, and you have a pronounced limp to your stride. +Your walking speed is one-quarter that of a normal human, and running is impossible.*/ + +/datum/quirk/darkpack/lame/add(client/client_source) + . = ..() + if(!lame_leg) + lame_leg = client_source?.prefs.read_preference(/datum/preference/choiced/lame_leg) + if(lame_leg == "right") + ADD_TRAIT(quirk_holder, TRAIT_PARALYSIS_R_LEG, QUIRK_TRAIT) + else + ADD_TRAIT(quirk_holder, TRAIT_PARALYSIS_L_LEG, QUIRK_TRAIT) + +/datum/quirk/darkpack/lame/remove() + . = ..() + REMOVE_TRAIT(quirk_holder, TRAIT_PARALYSIS_R_LEG, QUIRK_TRAIT) + REMOVE_TRAIT(quirk_holder, TRAIT_PARALYSIS_L_LEG, QUIRK_TRAIT) + +/datum/quirk_constant_data/lame_leg + associated_typepath = /datum/quirk/darkpack/lame + customization_options = list(/datum/preference/choiced/lame_leg) + +/datum/preference/choiced/lame_leg + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED + savefile_key = "lame_leg" + savefile_identifier = PREFERENCE_CHARACTER + +/datum/preference/choiced/lame_leg/init_possible_values() + return list("right", "left") + +/datum/preference/choiced/lame_leg/create_default_value() + return "right" + +/datum/preference/choiced/lame_leg/is_accessible(datum/preferences/preferences) + . = ..() + if (!.) + return FALSE + + return /datum/quirk/darkpack/lame::name in preferences.all_quirks + +/datum/preference/choiced/lame_leg/apply_to_human(mob/living/carbon/human/target, value) + return diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/light_sensitive.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/light_sensitive.dm new file mode 100644 index 000000000000..32846f12ddc6 --- /dev/null +++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/light_sensitive.dm @@ -0,0 +1,19 @@ +// VTM pg. 495 +/datum/quirk/darkpack/light_sensitive + name = "Light Sensitive" + desc = {"You're more sensitive to the sun than others. +Sunlight deals double damage to you."} + icon = FA_ICON_SUN + value = -1 // A lot less awful than in the ttrpg + mob_trait = TRAIT_LIGHT_WEAKNESS + allowed_splats = list(SPLAT_KINDRED) + excluded_clans = list(VAMPIRE_CLAN_SETITE, VAMPIRE_CLAN_WARRIOR_SETITE, VAMPIRE_CLAN_TLACIQUE) + +/*You are even more sensitive to sunlight than other +vampires are. Sunlight causes double normal damage, +and the light of the moon can cause lethal damage in a +manner similar to the sun, though it must shine direct +ly upon you. Even bright lights hurt your eyes, requir +ing the use of sunglasses. Followers of Set and related +bloodlines cannot take this Flaw, as they already have +a worse version of it.*/ diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/permanent_wound.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/permanent_wound.dm new file mode 100644 index 000000000000..ecaca6cc0df8 --- /dev/null +++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/permanent_wound.dm @@ -0,0 +1,22 @@ +// VTM pg. 482-483 +/datum/quirk/darkpack/permanent_wound + name = "Permanent Wound" + desc = {"You suffered injuries during your Embrace which your transformation somehow failed to repair. +At the beginning of each night, you rise from sleep heavily wounded."} + value = -3 + gain_text = span_notice("An unhealed wound aches.") + lose_text = span_notice("You can't feel the pain of your wound anymore.") + allowed_splats = list(SPLAT_KINDRED) + icon = FA_ICON_USER_INJURED + failure_message = span_notice("You can't feel the pain of your wound anymore.") + +/*You suffered injuries during your Embrace which your transformation somehow failed to repair. +At the beginning of each night, +you rise from sleep at the Wounded health level, though this may be healed by spending blood points.*/ + +/datum/quirk/darkpack/permanent_wound/add(client/client_source) + . = ..() + var/mob/living/carbon/human/human_holder = astype(quirk_holder) + if(!human_holder) + return + human_holder.adjust_agg_loss(90, TRUE) diff --git a/modular_darkpack/modules/merits_flaws/code/negative_quirks/short.dm b/modular_darkpack/modules/merits_flaws/code/negative_quirks/short.dm new file mode 100644 index 000000000000..4d89739d9ec3 --- /dev/null +++ b/modular_darkpack/modules/merits_flaws/code/negative_quirks/short.dm @@ -0,0 +1,34 @@ +// VTM pg. 481 +/datum/quirk/darkpack/short + name = "Short" + desc = {"You are well below average height. +You have difficulty reaching or manipulating objects designed for normal adult size, +and your running speed is one-half that of an average human."} + icon = FA_ICON_ARROW_DOWN + value = -4 // Higher than in the ttrpg because it's a round-lasting debuff that'll be painful. + mob_trait = TRAIT_DWARF // Grants passtable too, but it seems like the simplest way to lock them into being short? + quirk_flags = QUIRK_HUMAN_ONLY|QUIRK_CHANGES_APPEARANCE + gain_text = span_notice("You feel shorter than average.") + lose_text = span_notice("You don't feel so small now.") + failure_message = span_notice("You don't feel so small now.") + +/*You are well below average height — four and a half feet (1.5 meters) tall or less. +You have difficulty reaching or manipulating objects designed for normal adult size, +and your running speed is one-half that of an average human.*/ + +/datum/movespeed_modifier/quirk_short + multiplicative_slowdown = 2 // Play with this number? + +/datum/quirk/darkpack/short/add(client/client_source) + . = ..() + var/mob/living/carbon/human/human_holder = astype(quirk_holder) + if(!human_holder) + return + human_holder.add_movespeed_modifier(/datum/movespeed_modifier/quirk_short) + +/datum/quirk/darkpack/short/remove() + . = ..() + var/mob/living/carbon/human/human_holder = astype(quirk_holder) + if(!human_holder) + return + human_holder.remove_movespeed_modifier(/datum/movespeed_modifier/quirk_short) 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 8b8ed738a0c3..4d030c687f05 100644 --- a/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm +++ b/modular_darkpack/modules/powers/code/discipline/auspex/aura_component.dm @@ -65,6 +65,9 @@ /datum/component/aura/proc/update_emotions(mob/changed_mob, new_emotion) SIGNAL_HANDLER + if(HAS_TRAIT(changed_mob, TRAIT_AURA_OF_CONFIDENCE)) + new_emotion = "Confidence" + if(current_aura == new_emotion) return @@ -94,6 +97,10 @@ /datum/component/aura/proc/update_examine_message(mutable_appearance/aura_appearance) var/mob/parent_mob = parent + if(HAS_TRAIT(parent_mob, TRAIT_AURA_OF_CONFIDENCE)) + examine_message = "[parent_mob.p_Their()] aura is swamped in so much superiority nothing else can be made out." + return + switch(current_aura) if(AURA_AFRAID) examine_message = "[parent_mob.p_Their()] aura burns a bright orange, tense and flickering at the edges." @@ -214,6 +221,9 @@ holder.color = null var/mob/parent_mob = parent + if(HAS_TRAIT(parent_mob, TRAIT_AURA_OF_CONFIDENCE)) + return + if(output_color && has_pale_aura(parent_mob)) var/list/hsv_color_value = rgb2hsv(output_color) hsv_color_value[2] = hsv_color_value[2] * 0.7 // Reduce saturation for kindred @@ -273,6 +283,20 @@ aura_smoke_image.color = aura_appearance.color aura_smoke_image.alpha = 50 + var/matrix/smoke_transform = matrix() + smoke_transform.Scale(1, pick(1.25, 1.5)) + aura_smoke_image.transform = smoke_transform + + var/matrix/classic_aura_transform = matrix() + classic_aura_transform.Scale(pick(0.65, 0.75), 1) + aura_classic_image.transform = classic_aura_transform + + holder.vis_contents += aura_classic_image + holder.vis_contents += aura_smoke_image + + if(HAS_TRAIT(parent_mob, TRAIT_AURA_OF_CONFIDENCE)) + return + 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) @@ -300,17 +324,6 @@ if(isavatar(parent_mob) || isobserver(parent_mob)) holder.opacity = holder.opacity * 0.5 - var/matrix/smoke_transform = matrix() - smoke_transform.Scale(1, pick(1.25, 1.5)) - aura_smoke_image.transform = smoke_transform - - var/matrix/classic_aura_transform = matrix() - classic_aura_transform.Scale(pick(0.65, 0.75), 1) - aura_classic_image.transform = classic_aura_transform - - holder.vis_contents += aura_classic_image - holder.vis_contents += aura_smoke_image - /datum/component/aura/proc/update_aura_filters(mutable_appearance/aura_appearance, image/holder) remove_wibbly_filters(holder) diff --git a/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm b/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm index f08828f82ca8..8c84ce5d4be2 100644 --- a/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm +++ b/modular_darkpack/modules/powers/code/discipline/obtenebration/obtenebration.dm @@ -239,6 +239,8 @@ cooldown_length = 1 TURNS var/activating = FALSE var/saved_brute_mod = 1 + var/saved_burn_mod = 1 + var/saved_aggravated_mod = 1 var/saved_clone_mod = 1 var/saved_stamina_mod = 1 var/saved_brain_mod = 1 @@ -273,8 +275,10 @@ playsound(owner.loc, 'sound/effects/magic/voidblink.ogg', 50, FALSE) saved_brute_mod = owner.physiology.brute_mod owner.physiology.brute_mod = 0 - //saved_clone_mod = owner.physiology.clone_mod - //owner.physiology.clone_mod = 0 + saved_burn_mod = owner.physiology.burn_mod + owner.physiology.burn_mod = 2 + saved_aggravated_mod= owner.physiology.aggravated_mod + owner.physiology.aggravated_mod = 0 saved_stamina_mod = owner.physiology.stamina_mod owner.physiology.stamina_mod = 0 saved_brain_mod = owner.physiology.brain_mod @@ -286,6 +290,7 @@ ADD_TRAIT(owner, TRAIT_NOBLOOD, MAGIC_TRAIT) ADD_TRAIT(owner, TRAIT_PACIFISM, MAGIC_TRAIT) // Can't physically attack while in this form //ADD_TRAIT(owner, TRAIT_MOVE_FLYING, MAGIC_TRAIT) // Flying to simulate being unaffected by gravity + ADD_TRAIT(owner, TRAIT_PIERCEIMMUNE, MAGIC_TRAIT) //Stops bullets from embedding and taser electrodes no longer connect owner.pass_flags |= (PASSDOORS | PASSTABLE | PASSSTRUCTURE) // Phase through doors & fences / tables / machines, dumpsters, barrels, lampposts @@ -297,7 +302,8 @@ to_chat(owner, span_notice("You return to your normal form.")) playsound(owner.loc, 'sound/effects/magic/voidblink.ogg', 50, FALSE) owner.physiology.brute_mod = saved_brute_mod - //owner.physiology.clone_mod = saved_clone_mod + owner.physiology.burn_mod = saved_burn_mod + owner.physiology.aggravated_mod = saved_aggravated_mod owner.physiology.stamina_mod = saved_stamina_mod owner.physiology.brain_mod = saved_brain_mod animate(owner, color = initial(owner.color), time = 1 SECONDS, loop = 1) @@ -307,6 +313,7 @@ REMOVE_TRAIT(owner, TRAIT_NOBLOOD, MAGIC_TRAIT) REMOVE_TRAIT(owner, TRAIT_PACIFISM, MAGIC_TRAIT) //REMOVE_TRAIT(owner, TRAIT_MOVE_FLYING, MAGIC_TRAIT) + REMOVE_TRAIT(owner, TRAIT_PIERCEIMMUNE, MAGIC_TRAIT) //Stops bullets from embedding and taser electrodes no longer connect owner.pass_flags &= ~(PASSDOORS | PASSTABLE | PASSSTRUCTURE) owner.density = saved_density diff --git a/modular_darkpack/modules/powers/code/discipline/presence/presence.dm b/modular_darkpack/modules/powers/code/discipline/presence/presence.dm index d76958da9431..1965c00e180d 100644 --- a/modular_darkpack/modules/powers/code/discipline/presence/presence.dm +++ b/modular_darkpack/modules/powers/code/discipline/presence/presence.dm @@ -159,7 +159,20 @@ /datum/discipline_power/presence/dread_gaze/activate(mob/living/carbon/human/target) . = ..() apply_presence_overlay(target) - + if(successes >= (target.st_get_stat(STAT_WITS) + target.st_get_stat(STAT_COURAGE))) //We check if you just flat out have more successes than their dice pool total. + var/extended_action_prompt = tgui_input_list(owner, "Attempt to force your target to cower in fear? This will take time to preform this extended action to stun and debuff your opponent!", "Terrifying Presence", list("Yes", "No"), "No") + switch(extended_action_prompt) + if("Yes") + ADD_TRAIT(owner, TRAIT_IMMOBILIZED, DISCIPLINE_TRAIT(type)) + if(do_after(owner, 3 SECONDS)) + to_chat(owner, span_warning("You force [target] to cower to your mere presence!")) + to_chat(target, span_userdanger("You are consumed with an overhwelming sense of dread, forced to cower before [owner] as even your legs betray you and your very being is rocked to its core!")) + target.Stun(1 TURNS) //~5 seconds + target.emote("tremble") //Shaking emote for visibility + target.emote(pick("scream","cry")) //Audible emote + target.apply_status_effect(/datum/status_effect/dread_gaze) //Debuffs for set time + REMOVE_TRAIT(owner, TRAIT_IMMOBILIZED, DISCIPLINE_TRAIT(type)) + return TRUE if(successes <= 3) // already checked for above 0 in pre_activation to_chat(target, span_userdanger("You are consumed with terror toward [owner]!")) to_chat(owner, span_warning("You've struck terror into [target]'s heart with your dreadful gaze!")) @@ -168,9 +181,7 @@ to_chat(owner, span_warning("Your terrifying presence sends [target] fleeing in terror!")) //V20's 'dread gaze' section states that with 3 or more successes targets will find themselves scratching at the walls or fleeing against their will because they are so terrified. - //var/datum/cb = CALLBACK(target, TYPE_PROC_REF(/mob/living/carbon/human, step_away_caster), owner) - //for(var/i in 1 to 30) - //addtimer(cb, (i - 1) * target.total_multiplicative_slowdown()) + GLOB.move_manager.move_away(target, owner, 10, target.cached_multiplicative_slowdown) /datum/discipline_power/presence/dread_gaze/deactivate(mob/living/carbon/human/target) . = ..() diff --git a/modular_darkpack/modules/powers/code/discipline/presence/status_effects/dread_gaze.dm b/modular_darkpack/modules/powers/code/discipline/presence/status_effects/dread_gaze.dm new file mode 100644 index 000000000000..2a4632983d10 --- /dev/null +++ b/modular_darkpack/modules/powers/code/discipline/presence/status_effects/dread_gaze.dm @@ -0,0 +1,16 @@ +/datum/status_effect/dread_gaze //Used for extended effect of dreadgaze + id = "dread_gaze" + status_type = STATUS_EFFECT_UNIQUE + duration = 5 SECONDS + alert_type = /atom/movable/screen/alert/status_effect/dread_gaze + +/datum/status_effect/dread_gaze/on_creation(mob/living/new_owner, generation, time) + . = ..() + if(time) + duration = time + owner.st_add_stat_mod(STAT_DEXTERITY, -4) //Nukes your dex temporarily + +/atom/movable/screen/alert/status_effect/dread_gaze + name = "Overwhelming Dread" + desc = "That person- that THING is a monster! I don't stand a chance!" + icon_state = "hypnosis" diff --git a/modular_darkpack/modules/powers/code/discipline/protean/claws.dm b/modular_darkpack/modules/powers/code/discipline/protean/claws.dm index fb4799c83acf..48569fad6a19 100644 --- a/modular_darkpack/modules/powers/code/discipline/protean/claws.dm +++ b/modular_darkpack/modules/powers/code/discipline/protean/claws.dm @@ -12,14 +12,10 @@ item_flags = DROPDEL masquerade_violating = TRUE obj_flags = NONE + st_attack_attribute = STAT_BRAWL /obj/item/gangrel_claws/Initialize(mapload) . = ..() ADD_TRAIT(src, TRAIT_NODROP, INNATE_TRAIT) + ADD_TRAIT(src, TRAIT_NATURAL, INNATE_TRAIT) -/obj/item/gangrel_claws/pre_attack(atom/target, mob/living/user, list/modifiers, list/attack_modifiers) - . = ..() - // Based on V20 - if(isliving(user)) - var/mob/living/living_user = user - force = (living_user.st_get_stat(STAT_STRENGTH) + 1) TTRPG_DAMAGE diff --git a/modular_darkpack/modules/ritual_thaumaturgy/icons/onfloor.dmi b/modular_darkpack/modules/ritual_thaumaturgy/icons/onfloor.dmi new file mode 100644 index 000000000000..c45d82b3a38a Binary files /dev/null and b/modular_darkpack/modules/ritual_thaumaturgy/icons/onfloor.dmi differ diff --git a/modular_darkpack/modules/ritual_thaumaturgy/icons/ritual_scroll.dmi b/modular_darkpack/modules/ritual_thaumaturgy/icons/ritual_scroll.dmi new file mode 100644 index 000000000000..6cce672dd52e Binary files /dev/null and b/modular_darkpack/modules/ritual_thaumaturgy/icons/ritual_scroll.dmi differ diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/donning_the_mask_of_shadows.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/donning_the_mask_of_shadows.dm new file mode 100644 index 000000000000..24676af0275e --- /dev/null +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/donning_the_mask_of_shadows.dm @@ -0,0 +1,59 @@ +// v20 core rulebook page 233 +/obj/ritual_rune/thaumaturgy/donning_the_mask_of_shadows + name = "donning the mask of shadows" + desc = "Renders the caster's visage smoky and footsteps muffled. Requires a glass shard." + icon_state = "rune1" + word = "" + level = 2 + sacrifices = list(/obj/item/shard) + +/obj/ritual_rune/thaumaturgy/donning_the_mask_of_shadows/complete() + . = ..() + last_activator.apply_status_effect(/datum/status_effect/mask_of_shadows, ritual_roll_datum.last_sucess_amount MINUTES) + qdel(src) + +/datum/status_effect/mask_of_shadows + id = "mask_of_shadows" + status_type = STATUS_EFFECT_UNIQUE + alert_type = /atom/movable/screen/alert/status_effect/mask_of_shadows + var/datum/action/remove_mask_of_shadows_action/mask_action + +/datum/status_effect/mask_of_shadows/on_creation(mob/living/new_owner, duration) + src.duration = duration + return ..() + +/datum/status_effect/mask_of_shadows/on_apply() + . = ..() + owner.alpha = 50 + owner.color = "#5f5f5f" + mask_action = new(owner) + mask_action.Grant(owner) + ADD_TRAIT(owner, TRAIT_SILENT_FOOTSTEPS, MAGIC_TRAIT) + +/datum/status_effect/mask_of_shadows/on_remove() + owner.alpha = 255 + owner.color = null + if(mask_action) + mask_action.Remove(owner) + qdel(mask_action) + REMOVE_TRAIT(owner, TRAIT_SILENT_FOOTSTEPS, MAGIC_TRAIT) + return ..() + +/datum/action/remove_mask_of_shadows_action + name = "Become Visible" + desc = "Lower the Mask of Shadows and become visible." + button_icon = 'modular_darkpack/modules/powers/icons/actions.dmi' + button_icon_state = "thaumaturgy" + +/datum/action/remove_mask_of_shadows_action/Trigger(mob/clicker, trigger_flags) + . = ..() + if(!isliving(owner)) + return + var/mob/living/living_owner = owner + living_owner.remove_status_effect(/datum/status_effect/mask_of_shadows) + +/atom/movable/screen/alert/status_effect/mask_of_shadows + name = "Mask of Shadows" + desc = "Your visage is obscured by shadows." + overlay_icon = 'modular_darkpack/modules/powers/icons/actions.dmi' + overlay_state = "thaumaturgy" diff --git a/modular_darkpack/modules/ritual_thaumaturgy/rituals/inscription.dm b/modular_darkpack/modules/ritual_thaumaturgy/rituals/inscription.dm new file mode 100644 index 000000000000..c973f37b456e --- /dev/null +++ b/modular_darkpack/modules/ritual_thaumaturgy/rituals/inscription.dm @@ -0,0 +1,69 @@ +// from clanbook tremere revised page 58 + +/obj/ritual_rune/thaumaturgy/inscription + name = "inscription" + desc = "Create a scroll inscribed with vitae to allow unskilled thaumaturgists or those without thaumaturgy to use a level one or two ritual." + icon_state = "rune5" + word = "" + level = 2 + sacrifices = list(/obj/item/paper) + var/ritual_selected + +/obj/ritual_rune/thaumaturgy/inscription/attack_hand(mob/living/user) + var/datum/action/ritual_drawing/ritual_action = locate() in user.actions + if(!ritual_action) + return + + var/list/ritual_selection = ritual_action.get_available_runes() + + // gonna inscription the inscription ritual + ritual_selection -= "inscription" + + for(var/ritual_name in ritual_selection) + var/ritual_level = ritual_selection[ritual_name]["level"] + if(ritual_level > 2) + ritual_selection -= ritual_name + + var/selection = tgui_input_list(user, "What ritual do you wish to inscribe onto the scroll?", "Ritual Inscription", ritual_selection) + if(!selection) + to_chat(user, span_cult("You decide not to inscribe a ritual onto the parchment.")) + return FALSE + + ritual_selected = ritual_selection[selection]["path"] + . = ..() + +/obj/ritual_rune/thaumaturgy/inscription/complete() + . = ..() + + if(!ritual_selected) + to_chat(last_activator, span_cult("You haven't chosen a ritual to inscribe.")) + return + + var/obj/item/thaumaturgy_scroll/ritual_scroll = new(loc) + ritual_scroll.name = "thaumaturgy scroll ([initial(ritual_selected:name)])" + ritual_scroll.desc = "A scroll inscribed with vitae, allowing its holder to perform the '[initial(ritual_selected:name)]' ritual without thaumaturgical skill. The ritual is described as follows: [initial(ritual_selected:desc)]." + ritual_scroll.ritual = ritual_selected + + to_chat(last_activator, span_cult("You inscribe your vitae onto the paper using Thaumaturgy, allowing the scroll, and the ritual inscribed, to be used by unskilled thaumaturgists, or those without any skill in Thaumaturgy at all.")) + qdel(src) + +/obj/item/thaumaturgy_scroll + name = "thaumaturgy scroll" + desc = "A scroll allowing non-thaumaturgists to use ritual thaumaturgy." + icon = 'modular_darkpack/modules/ritual_thaumaturgy/icons/ritual_scroll.dmi' + icon_state = "scroll" + ONFLOOR_ICON_HELPER('modular_darkpack/modules/ritual_thaumaturgy/icons/onfloor.dmi') + var/ritual + +/obj/item/thaumaturgy_scroll/attack_self(mob/living/user) + if(!ritual) + to_chat(user, span_cult("The scroll is blank - there is nothing to invoke.")) + return + + to_chat(user, span_cult("You unfurl the scroll and follow the instructions, invoking the '[initial(ritual:name)]' ritual.")) + + var/obj/ritual_rune/R = new ritual(user.loc) + R.required_discipline = null // no discipline required to use the ritual + R.attack_hand(user) + + qdel(src) diff --git a/modular_darkpack/modules/splats/code/powers/_power.dm b/modular_darkpack/modules/splats/code/powers/_power.dm index d99530edb81d..2b6a9942b956 100644 --- a/modular_darkpack/modules/splats/code/powers/_power.dm +++ b/modular_darkpack/modules/splats/code/powers/_power.dm @@ -7,6 +7,11 @@ /// Means that this action is not a real power, but some sort of innate ability we represent as a power/disc/gift mechnaicly. var/innate_ability = FALSE + /// If the power manually calls `StartCooldown`, otherwise handled by Activate + var/handles_cooldown = FALSE + /// If the power manually calls `spend_resources` itself, otherwise handled by Activate + var/handles_spend_resources = FALSE + /// How much temporary willpower is required to use this ability var/willpower_cost = 0 @@ -17,9 +22,11 @@ return FALSE /datum/action/cooldown/power/Activate(atom/target) - . = ..() + if(!handles_cooldown) + . = ..() - spend_resources() + if(!handles_spend_resources) + spend_resources() /** @@ -40,6 +47,9 @@ * when casting the power. */ /datum/action/cooldown/power/proc/spend_resources() + SHOULD_CALL_PARENT(TRUE) + if(willpower_cost && isliving(owner)) var/mob/living/living_owner = owner living_owner.st_change_stat(STAT_TEMPORARY_WILLPOWER, -willpower_cost) + to_chat(owner, span_warning("You burn [willpower_cost] willpower.")) diff --git a/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm b/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm index eb62e412dbbe..0963013cef57 100644 --- a/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm +++ b/modular_darkpack/modules/storyteller_dice/code/roll_datum.dm @@ -54,6 +54,8 @@ var/auto_success_amount = calculate_auto_successes(roller) var/used_difficulty = calculate_used_difficulty(roller) + bonus += SEND_SIGNAL(roller, COMSIG_LIVING_PRE_DICE_ROLLED, src, target) + var/list/rolled_dice = roll_dice(dice_amount, auto_success_amount) var/dice_used_text = "[dice_amount] dice" @@ -94,7 +96,7 @@ LAZYADDASSOC(mobs_last_rolled, WEAKREF(roller), list(world.time, output)) - SEND_SIGNAL(roller, COMSIG_LIVING_DICE_ROLLED, src, output) + SEND_SIGNAL(roller, COMSIG_LIVING_DICE_ROLLED, src, target, output) return output /datum/storyteller_roll/proc/create_balloon_alert(mob/living/roller, mob/player_mob, number) diff --git a/modular_darkpack/modules/weapons/code/melee.dm b/modular_darkpack/modules/weapons/code/melee.dm index ddee072479df..f1acd9918727 100644 --- a/modular_darkpack/modules/weapons/code/melee.dm +++ b/modular_darkpack/modules/weapons/code/melee.dm @@ -36,6 +36,7 @@ ONFLOOR_ICON_HELPER('modular_darkpack/modules/weapons/icons/weapons_onfloor.dmi') pixel_w = -8 custom_price = 1300 + slot_flags = ITEM_SLOT_BELT /obj/item/katana/vamp/Initialize(mapload) . = ..() diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/banes/_banes.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/banes/_banes.dm new file mode 100644 index 000000000000..34458348d8ee --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/banes/_banes.dm @@ -0,0 +1,33 @@ +/mob/living/basic/bane + name = "creature" + abstract_type = /mob/living/basic/bane + icon = 'modular_darkpack/modules/werewolf_the_apocalypse/icons/basic/banes.dmi' + + mob_biotypes = MOB_SPIRIT + basic_mob_flags = DEL_ON_DEATH + + speed = 0.35 + maxHealth = 80 + health = 80 + melee_damage_lower = 10 + melee_damage_upper = 20 + obj_damage = 20 + + attack_verb_continuous = "bites" + attack_verb_simple = "bite" + attack_sound = 'sound/items/weapons/bite.ogg' + speak_emote = list("gnashes") + + faction = list("bane") + + pressure_resistance = 200 + bloodpool = 0 + maxbloodpool = 0 + bloodquality = BLOOD_QUALITY_LOW + + ai_controller = /datum/ai_controller/basic_controller/simple/simple_hostile_obstacles + +/mob/living/basic/bane/Initialize(mapload) + . = ..() + AddElement(/datum/element/ai_retaliate) + ADD_TRAIT(src, TRAIT_WYRMTAINTED, INNATE_TRAIT) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/banes/religion.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/banes/religion.dm new file mode 100644 index 000000000000..4e32c692f266 --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/banes/religion.dm @@ -0,0 +1,12 @@ +/mob/living/basic/bane/religion + desc = "A strangly familiar looking creature that reminds you of your aunt." + icon_state = "religion_bane" + maxHealth = 50 + health = 50 + pass_flags = PASSMOB + mob_size = MOB_SIZE_SMALL + +/mob/living/basic/bane/religion/Initialize(mapload) + . = ..() + AddElement(/datum/element/simple_flying) + AddComponent(/datum/component/swarming) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/banes/suffocating.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/banes/suffocating.dm new file mode 100644 index 000000000000..e935f9d81399 --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/basic_mobs/banes/suffocating.dm @@ -0,0 +1,37 @@ +/mob/living/basic/bane/suffocating + desc = "A disgusting gasping creature that writhes and contorts." + icon_state = "suffocating_bane" + maxHealth = 50 + health = 50 + + ai_controller = /datum/ai_controller/basic_controller/suffocating_bane + + mob_size = MOB_SIZE_SMALL + +/datum/ai_controller/basic_controller/suffocating_bane + blackboard = list( + BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + + planning_subtrees = list( + /datum/ai_planning_subtree/escape_captivity, + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/attack_obstacle_in_path, + /datum/ai_planning_subtree/basic_melee_attack_subtree, + /datum/ai_planning_subtree/random_speech/suffocating_bane + ) + + +/datum/ai_planning_subtree/random_speech/suffocating_bane + speech_chance = 15 + speak = list("gasps") + sound = list( + 'sound/mobs/humanoids/human/gasp/gasp_female1.ogg', + 'sound/mobs/humanoids/human/gasp/gasp_female2.ogg', + 'sound/mobs/humanoids/human/gasp/gasp_female3.ogg', + 'sound/mobs/humanoids/human/gasp/gasp_male1.ogg', + 'sound/mobs/humanoids/human/gasp/gasp_male2.ogg', + ) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm index dddbe9be9d7c..dc5b3ff86fb0 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/_gift.dm @@ -10,8 +10,6 @@ check_flags = AB_CHECK_IMMOBILE|AB_CHECK_CONSCIOUS - var/default_activate_message = TRUE - var/rage_cost = 0 var/gnosis_cost = 0 @@ -24,12 +22,6 @@ owner.balloon_alert(owner, "not a gift user!") return FALSE -/datum/action/cooldown/power/gift/Activate(atom/target) - . = ..() - - if(default_activate_message) - to_chat(owner, span_notice("You activate the [name]...")) - /datum/action/cooldown/power/gift/can_afford(feedback) . = ..() var/datum/splat/werewolf/casting_splat = get_werewolf_splat(owner) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm index 20544f098885..1320746e034e 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/galliard.dm @@ -44,6 +44,7 @@ /datum/action/cooldown/power/gift/mindspeak/Activate(atom/target) + . = ..() var/input = tgui_input_text(usr, "What do you want to tell to your Tribe?", name, max_length = MAX_MESSAGE_LEN) if(!input || !IsAvailable(feedback = TRUE)) return diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm index 0a0f7bfc8de2..1dc3575b9d27 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/auspices/ragabash.dm @@ -77,11 +77,11 @@ return FALSE /datum/action/cooldown/power/gift/infectious_laughter/Activate(atom/target) - . = ..() - if(!last_spoken_message || (when_spoken + 3 TURNS < world.time)) return + . = ..() + owner.emote("laugh") playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/infectious_laughter.ogg', 50, FALSE) var/list/hearers = oviewers(DEFAULT_MESSAGE_RANGE, owner) 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 bd0f90aaac4f..b92433961d1a 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 @@ -26,9 +26,9 @@ the scar is received and an extra Gnosis point is spent. /datum/action/cooldown/power/gift/mothers_touch/Activate(atom/target) if(!isliving(target)) - return + return FALSE if(!(target in range(1, owner))) - return + return FALSE . = ..() @@ -40,7 +40,6 @@ the scar is received and an extra Gnosis point is spent. living_target.heal_storyteller_health(successes, TRUE, TRUE, TRUE) SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) - StartCooldown() return TRUE /datum/action/cooldown/power/gift/sense_wyrm diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_spiral_dancers.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_spiral_dancers.dm new file mode 100644 index 000000000000..3d95b08b5a61 --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_spiral_dancers.dm @@ -0,0 +1,38 @@ +/datum/storyteller_roll/gift/bane_protector + bumper_text = "Pact Binding" + applicable_stats = list(STAT_MANIPULATION, STAT_LEADERSHIP) + +/datum/action/cooldown/power/gift/bane_protector + name = "Bane Protector" + desc = "The Black Spiral Dancer binds a Bane in a pact of mutual alliance." + button_icon_state = "bane_protector" + + click_to_activate = TRUE + + rank = 1 + rage_cost = 1 + +/datum/action/cooldown/power/gift/bane_protector/Activate(atom/target) + . = ..() + + var/mob/living/carbon/human/human_owner = astype(owner) + var/mob/living/basic/basic_target = astype(target) + + var/datum/storyteller_roll/gift/bane_protector/roll_datum = new() + if(roll_datum.st_roll(owner, target) != ROLL_SUCCESS) + return TRUE + + if(istype(basic_target, /mob/living/basic/bane)) + qdel(basic_target.GetComponent(/datum/component/obeys_commands)) + human_owner?.add_beastmaster_minion(target) + basic_target.ai_controller = new /datum/ai_controller/basic_controller/beastmaster_summon(basic_target) + return TRUE + + // Just summon a random shitter. + human_owner.playsound_local(get_turf(human_owner), 'sound/effects/fire_puff.ogg') + human_owner?.add_beastmaster_minion(/mob/living/basic/bane/religion/summoned) + return TRUE + + +/mob/living/basic/bane/religion/summoned + ai_controller = /datum/ai_controller/basic_controller/beastmaster_summon diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/bone_gnawers.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/bone_gnawers.dm index 5782e5d09769..790a5b14ead1 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/bone_gnawers.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/bone_gnawers.dm @@ -20,6 +20,7 @@ return FALSE /datum/action/cooldown/power/gift/desperate_strength/Activate(atom/target) + . = ..() var/mob/living/caster = owner var/static/list/radial_menu_options = list( "One" = icon('modular_darkpack/modules/werewolf_the_apocalypse/icons/gifts/tribes/bone_gnawers.dmi', "radial_one"), @@ -71,7 +72,7 @@ /datum/status_effect/desperate_strength/proc/on_dice_rolled(mob/living/roller, datum/storyteller_roll/roll_datum, output) SIGNAL_HANDLER - if(STAT_STRENGTH in roll_datum.applicable_stats) + if(STAT_STRENGTH in roll_datum.using_stats(roller)) qdel(src) /datum/status_effect/desperate_strength/on_remove() diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/childrenofgaia.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/childrenofgaia.dm new file mode 100644 index 000000000000..1b745104ad7a --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/childrenofgaia.dm @@ -0,0 +1,57 @@ +/datum/storyteller_roll/gift/jam_weapon + bumper_text = "Jam Weapon" + applicable_stats = list(STAT_TEMPORARY_WILLPOWER) + numerical = TRUE + +/datum/action/cooldown/power/gift/jam_weapon + name = "Jam Weapon" + desc = "The Child may stop any Weaver-born weapons from working within the range of his voice." + button_icon_state = "jam_weapon" + rank = 1 + gnosis_cost = 1 + var/list/datum/weakref/jammed_mobs = list() + +/datum/action/cooldown/power/gift/jam_weapon/Activate(atom/target) + . = ..() + // could use better flavor/sounds + + // "The player rolls Willpower against a difficulty of highest Willpower of any armed individual within earshot. " + var/highest_willpower = 0 + for(var/mob/living/carbon/human/guy in orange(DEFAULT_MESSAGE_RANGE, owner)) + var/guy_willpower = guy.st_get_stat(STAT_TEMPORARY_WILLPOWER) + if(guy_willpower > highest_willpower) + highest_willpower = guy_willpower + + var/datum/storyteller_roll/gift/jam_weapon/jam_roll = new() + jam_roll.difficulty = highest_willpower + var/roll_result = jam_roll.st_roll(owner) + if(roll_result > 0) + for(var/mob/living/carbon/human/guy in range(DEFAULT_MESSAGE_RANGE, owner)) + guy.apply_status_effect(/datum/status_effect/jam_weapon, roll_result TURNS) + + +/datum/status_effect/jam_weapon + id = "jam_weapon" + duration = STATUS_EFFECT_PERMANENT + + status_type = STATUS_EFFECT_UNIQUE + + alert_type = /atom/movable/screen/alert/status_effect/gift/jam_weapon + +/datum/status_effect/jam_weapon/on_creation(mob/living/owner, duration) + src.duration = duration + return ..() + +/datum/status_effect/jam_weapon/on_apply() + . = ..() + ADD_TRAIT(owner, TRAIT_JAMMING_WEAPONS, GIFT_TRAIT) + +/datum/status_effect/jam_weapon/on_remove() + REMOVE_TRAIT(owner, TRAIT_JAMMING_WEAPONS, GIFT_TRAIT) + return ..() + + +/atom/movable/screen/alert/status_effect/gift/jam_weapon + name = /datum/action/cooldown/power/gift/jam_weapon::name + desc = /datum/action/cooldown/power/gift/jam_weapon::desc + overlay_state = /datum/action/cooldown/power/gift/jam_weapon::button_icon_state diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/fianna.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/fianna.dm index 09d0206e5adb..e39bcd411556 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/fianna.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/fianna.dm @@ -74,7 +74,7 @@ /datum/action/cooldown/power/gift/faerie_light name = "Faerie Light" desc = "Create a bobbing mote of light to light your way or attract targets for an ambush." - button_icon_state = null // TODO: icon + button_icon_state = "faerie_light" click_to_activate = TRUE rank = 1 diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_spiral_dancer.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/galestalkers.dm similarity index 100% rename from modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/black_spiral_dancer.dm rename to modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/galestalkers.dm diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/get_of_fenris.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/get_of_fenris.dm index 198c30aaced5..4a0644b788ba 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/get_of_fenris.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/get_of_fenris.dm @@ -10,11 +10,10 @@ * TODO: less placeholder sound */ -/datum/storyteller_roll/visage_of_fenris +/datum/storyteller_roll/gift/visage_of_fenris bumper_text = "Visage of Fenris" applicable_stats = list(STAT_CHARISMA, STAT_INTIMIDATION) numerical = TRUE - roll_output_type = ROLL_PUBLIC /datum/movespeed_modifier/visage_of_fenris multiplicative_slowdown = 0.75 @@ -31,7 +30,7 @@ . = ..() var/datum/splat/werewolf/our_splat = get_werewolf_splat(owner) - var/datum/storyteller_roll/visage_of_fenris/roll_datum = new() + var/datum/storyteller_roll/gift/visage_of_fenris/roll_datum = new() var/successes = roll_datum.st_roll(owner) var/obj/effect/temp_visual/decoy/D = new /obj/effect/temp_visual/decoy(owner.loc, owner) @@ -39,7 +38,7 @@ playsound(owner, 'modular_darkpack/modules/werewolf_the_apocalypse/sounds/gifts/visage_of_fenris.ogg', 75, FALSE) - for(var/mob/living/guy in viewers(world.view, owner)) + for(var/mob/living/guy in viewers(DEFAULT_SIGHT_DISTANCE, owner)) if(guy == owner) continue diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/ghostcouncil.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/ghostcouncil.dm new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/glasswalkers/control_machine.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/glasswalkers/control_machine.dm new file mode 100644 index 000000000000..cc9b1ca0d61e --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/glasswalkers/control_machine.dm @@ -0,0 +1,277 @@ +/datum/storyteller_roll/gift/control_simple_machine + bumper_text = "Control Simple Machine" + applicable_stats = list(STAT_MANIPULATION, STAT_CRAFTS) + difficulty = 7 + +/datum/storyteller_roll/gift/control_complex_machine + bumper_text = "Control Complex Machine" + applicable_stats = list(STAT_MANIPULATION, STAT_SCIENCE) // or STAT_COMPUTER + + +/datum/action/cooldown/power/gift/control_machine + abstract_type = /datum/action/cooldown/power/gift/control_machine + + click_to_activate = TRUE + + handles_spend_resources = TRUE + willpower_cost = 1 + + var/roll_type + var/datum/storyteller_roll/roll_datum + var/is_complex = FALSE + + /// Stores the most recent target of the ability that succeeded + var/datum/weakref/last_target_ref + /// When the currently weakrefed target was first used. + var/first_target_use = 0 + + var/list/image/object_highlights + +/datum/action/cooldown/power/gift/control_machine/set_click_ability(mob/on_who) + . = ..() + if(!on_who.client) + return + + var/existing_target = last_target_ref?.resolve() + + // Movable cause i dont feel like checking EVERY EVERY atom. + for(var/atom/movable/nearby_atom in oview(on_who, DEFAULT_SIGHT_DISTANCE)) + if(!length(nearby_atom.get_control_machine_options(on_who, is_complex))) + continue + var/color = COLOR_BLUE_LIGHT + if(nearby_atom == existing_target) + color = COLOR_BLUE + + var/image/I = image(loc = nearby_atom) + I.appearance = nearby_atom.appearance + I.layer = nearby_atom.layer - 0.01 + I.pixel_y = 0 + I.pixel_x = 0 + I.pixel_w = 0 + I.pixel_z = 0 + + apply_wibbly_filters(I) + + I.add_filter("control_machine", 1, outline_filter(size = 1, color = color)) + + LAZYINITLIST(object_highlights) + on_who.client.images += I + object_highlights += I + + // Could probaly use a sound. + +/datum/action/cooldown/power/gift/control_machine/unset_click_ability(mob/on_who, refund_cooldown = TRUE) + . = ..() + if(!on_who.client || !object_highlights) + return + for(var/image/I in object_highlights) + if(I in on_who.client.images) + on_who.client.images -= I + QDEL_LAZYLIST(object_highlights) + +// could use sounds +/datum/action/cooldown/power/gift/control_machine/Activate(atom/target) + var/choices = target.get_control_machine_options(owner, is_complex) + if(!length(choices)) + return FALSE + + var/choice = show_radial_menu(owner, target, choices, autopick_single_option = FALSE) + if(!choice) + return + + . = ..() + + if(!roll_datum) + roll_datum = new roll_type() + + if(first_target_use + 1 SCENES < world.time) // Its been active for a whole scene. Clear it + last_target_ref = null + willpower_cost = 1 + + var/free_to_use = FALSE + + var/last_target = last_target_ref?.resolve() + if(last_target == target) + free_to_use = TRUE + willpower_cost = 0 + + if(free_to_use) + target.run_control_machine(owner, choice, is_complex) + else if(roll_datum.st_roll(owner, target) == ROLL_SUCCESS) + target.run_control_machine(owner, choice, is_complex) + last_target_ref = WEAKREF(target) + first_target_use = world.time + + spend_resources() + + return TRUE + + +/datum/action/cooldown/power/gift/control_machine/simple + name = "Control Simple Machine" + desc = "The Garou may command the spirits of the simplest machines, causing levers to flip, doors to unbolt, pulleys to roll, and so on." + button_icon_state = "control_simple_machine" + + rank = 1 + + roll_type = /datum/storyteller_roll/gift/control_simple_machine + +// DARKPACK TODO - (gifts past rank 1) +/datum/action/cooldown/power/gift/control_machine/complex + name = "Control Complex Machine" + desc = "Similar to Control Simple Machine, the Glass Walker may now converse with and command the spirits of electronic devices such as computers, smart phones, and cars." + + rank = 3 + + roll_type = /datum/storyteller_roll/gift/control_complex_machine + is_complex = TRUE + + +/atom/proc/get_control_machine_options(mob/living/user, is_complex = FALSE) + RETURN_TYPE(/list) + + . = list() + +/atom/proc/run_control_machine(mob/living/user, choice, is_complex = FALSE) + return + + +/obj/item/grenade/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + .["prime"] = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_use") + +/obj/item/grenade/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("prime") + arm_grenade() + + +/obj/item/lighter/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + .["light"] = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_use") + +/obj/item/lighter/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("light") + set_lit(!lit) + + +/* Breaks due to requirng a user really hard. +/obj/item/gun/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + .["fire"] = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_use") + +/obj/item/gun/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("fire") + process_fire(get_turf(src)) +*/ + + +/* +/obj/machinery/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + .["unscrew"] = image(icon = 'icons/hud/radial.dmi', icon_state = "machine") + +/obj/machinery/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("unscrew") + toggle_panel_open() + balloon_alert(user, "maintenance hatch [panel_open ? "opened" : "closed"]") +*/ + +/obj/machinery/light/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + if(status != LIGHT_EMPTY) + .["unscrew"] = image(icon = 'icons/hud/radial.dmi', icon_state = "machine") + +/obj/machinery/light/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("unscrew") + var/obj/item/light/bulb = drop_light_tube() + bulb?.shatter() + + +/obj/machinery/button/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + .["flick"] = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_use") + +/obj/machinery/button/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("flick") + attempt_press(user) + + +/obj/machinery/shower/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + if(!is_complex) + .["turn"] = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_use") + +/obj/machinery/shower/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("turn") + interact(user) + + +/obj/machinery/firealarm/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + if(!is_complex) + .["flip"] = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_use") + +/obj/machinery/firealarm/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("flip") + alarm(user) + + +/obj/vehicle/ridden/scooter/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + if(!is_complex) + .["roll"] = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_rotate") + +/obj/vehicle/ridden/scooter/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("roll") + step(src, dir) + + +/obj/structure/vampdoor/get_control_machine_options(mob/living/user, is_complex = FALSE) + . = ..() + if(!is_complex) + .["lock"] = image(icon = 'icons/hud/radial.dmi', icon_state = "radial_rotate") + +/obj/structure/vampdoor/run_control_machine(mob/living/user, choice, is_complex = FALSE) + . = ..() + if(is_complex) + return + switch(choice) + if("lock") + if(!locked) + toggle_lock(user) diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/glasswalkers/glasswalkers.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/glasswalkers/glasswalkers.dm new file mode 100644 index 000000000000..b89ef6e9f4d9 --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/glasswalkers/glasswalkers.dm @@ -0,0 +1,16 @@ +/* +/datum/action/cooldown/power/gift/hands_full_of_thunder + name = "Hands Full of Thunder" + desc = "Invoke the machine spirits to support you in these trying times. Abstain from needing bullets when you fire a gun." + button_icon_state = "hands_full_of_thunder" + rank = 2 + gnosis_cost = 1 + +/datum/action/cooldown/power/gift/hands_full_of_thunder/Activate(atom/target) + . = ..() + ADD_TRAIT(owner, TRAIT_THUNDERSHOT, "thunder") + to_chat(owner, span_notice("You feel your fingers tingling with electricity...!")) + spawn(1 SCENES) + REMOVE_TRAIT(owner, TRAIT_THUNDERSHOT, "thunder") + to_chat(owner, span_notice("The buzz in your fingertips ebbs...")) +*/ diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/redtalons.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/redtalons.dm new file mode 100644 index 000000000000..a6c015997227 --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/redtalons.dm @@ -0,0 +1,54 @@ +/datum/storyteller_roll/gift/hidden_killer + bumper_text = "Hidden Killer" + applicable_stats = list(STAT_INTELLIGENCE, STAT_LARCENY) + +/datum/action/cooldown/power/gift/hidden_killer + name = "Hidden Killer" + desc = "The Red Talons didn't survive for so long without learning ways to conceal themselves. This Gift allows a werewolf to leave behind no physical evidence that would betray her hand (or claws, or teeth) in a slaying." + button_icon_state = "hidden_killer" + + click_to_activate = TRUE + + rank = 1 + +/datum/action/cooldown/power/gift/hidden_killer/Activate(atom/target) + var/mob/living/carbon/human/human_owner = astype(owner) + var/mob/living/dead_guy = astype(target) + if(!dead_guy || dead_guy.stat != DEAD) + return FALSE + if(!(target in range(1, owner))) + return FALSE + + . = ..() + + owner.visible_message("[src] presses a hand to [dead_guy]") + + var/datum/storyteller_roll/gift/hidden_killer/roll_datum = new() + var/roll_result = roll_datum.st_roll(owner) + + if(roll_result != ROLL_SUCCESS) + return TRUE + + var/list/owner_blood_dna = human_owner?.get_blood_dna_list() + var/full_print = md5(human_owner.dna.unique_identity) + + for(var/obj/effect/decal/cleanable/blood/blood_spot in range(12, owner)) + for(var/blood_dna in GET_ATOM_BLOOD_DNA(blood_spot)) + if(blood_dna in owner_blood_dna) + qdel(blood_spot) + break + + for(var/atom/nearby_atom in range(8, owner)) + var/datum/forensics/atom_forensics = nearby_atom.forensics + if(!atom_forensics) + continue + + for(var/fingerprint in atom_forensics.fingerprints) + if(fingerprint == full_print) + atom_forensics.fingerprints -= fingerprint + + for(var/bloodprint in atom_forensics.blood_DNA) + if(bloodprint in owner_blood_dna) + atom_forensics.blood_DNA -= bloodprint + + return TRUE diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/shadowlords.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/shadowlords.dm new file mode 100644 index 000000000000..16a605fd0e7d --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/shadowlords.dm @@ -0,0 +1,119 @@ +/datum/action/cooldown/power/gift/aura_of_confidence + name = "Aura of Confidence" + desc = "The werewolf projects an aura of superiority, preventing attempts to find flaws or read auras." + button_icon_state = "aura_of_confidence" + rank = 1 + +// Effect is permenent +/datum/action/cooldown/power/gift/aura_of_confidence/Grant(mob/granted_to) + . = ..() + ADD_TRAIT(granted_to, TRAIT_AURA_OF_CONFIDENCE, GIFT_TRAIT) + SEND_SIGNAL(granted_to, COMSIG_MOB_UPDATE_AURA) + +/datum/action/cooldown/power/gift/aura_of_confidence/Remove(mob/removed_from) + . = ..() + REMOVE_TRAIT(removed_from, TRAIT_AURA_OF_CONFIDENCE, GIFT_TRAIT) + SEND_SIGNAL(removed_from, COMSIG_MOB_UPDATE_AURA) + + + +/datum/storyteller_roll/gift/fatal_flaw + bumper_text = "Fatal Flaw" + applicable_stats = list(STAT_PERCEPTION, STAT_EMPATHY) + numerical = TRUE + + +/datum/action/cooldown/power/gift/fatal_flaw + name = "Fatal Flaw" + desc = "The Shadow Lord can spy a target's weakness, gaining an advantage in combat." + button_icon_state = "fatal_flaw" + rank = 1 + click_to_activate = TRUE + +/datum/action/cooldown/power/gift/fatal_flaw/Activate(atom/target) + var/mob/living/living_owner = astype(owner) + var/mob/living/living_target = astype(target) + if(!living_target || (living_target == owner)) + return FALSE + if(!(target in range(DEFAULT_SIGHT_DISTANCE, owner))) + return FALSE + + . = ..() + + if(!do_after(owner, 1 TURNS, timed_action_flags = (IGNORE_USER_LOC_CHANGE|IGNORE_HELD_ITEM))) + return TRUE + + var/datum/storyteller_roll/gift/fatal_flaw/roll_datum = new() + roll_datum.difficulty = living_target.st_get_stats(list(STAT_WITS, STAT_SUBTERFUGE)) + var/roll_result = roll_datum.st_roll(owner, target) + + if(roll_result <= 0) + return TRUE + + living_owner?.apply_status_effect(/datum/status_effect/fatal_flaw, target) + to_chat(owner, span_notice("You study [target] and discover a weakness granting you a bonus dice to attacks.")) + + return TRUE + + +/datum/status_effect/fatal_flaw + id = "fatal_flaw" + duration = 1 SCENES + + status_type = STATUS_EFFECT_REPLACE + + alert_type = /atom/movable/screen/alert/status_effect/gift/fatal_flaw + + var/datum/weakref/target_ref + var/image/highlight + +/datum/status_effect/fatal_flaw/on_creation(mob/living/new_owner, mob/living/target) + target_ref = WEAKREF(target) + . = ..() + +/datum/status_effect/fatal_flaw/on_apply() + RegisterSignal(owner, COMSIG_LIVING_PRE_DICE_ROLLED, PROC_REF(on_dice_rolled)) + + if(!owner?.client) + return + + var/mob/living/target = target_ref?.resolve() + + highlight = image(loc = target) + highlight.appearance = target.appearance + highlight.layer = target.layer - 0.01 + highlight.pixel_y = 0 + highlight.pixel_x = 0 + highlight.pixel_w = 0 + highlight.pixel_z = 0 + + apply_wibbly_filters(highlight) + + highlight.add_filter("fatal_flaw", 1, outline_filter(size = 1, color = COLOR_PALE_GREEN_GRAY)) + + owner.client.images += highlight + + return TRUE + +/datum/status_effect/fatal_flaw/on_remove() + owner.client?.images -= highlight + QDEL_NULL(highlight) + + UnregisterSignal(owner, COMSIG_LIVING_PRE_DICE_ROLLED) + +/datum/status_effect/fatal_flaw/proc/on_dice_rolled(mob/living/roller, datum/storyteller_roll/roll_datum, atom/target) + SIGNAL_HANDLER + + if(!istype(roll_datum, /datum/storyteller_roll/damage)) + return + + if(!target || (target != target_ref?.resolve())) + return + + . += 1 // One extra dice + + +/atom/movable/screen/alert/status_effect/gift/fatal_flaw + name = /datum/action/cooldown/power/gift/fatal_flaw::name + desc = /datum/action/cooldown/power/gift/fatal_flaw::desc + overlay_state = /datum/action/cooldown/power/gift/fatal_flaw::button_icon_state diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/silent_striders.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/silent_striders.dm new file mode 100644 index 000000000000..37e0c0385111 --- /dev/null +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/silent_striders.dm @@ -0,0 +1,41 @@ +/datum/action/cooldown/power/gift/speed_of_thought + name = "Speed of Thought" + desc = "The Garou doubles her running speed." + button_icon_state = "smooth_move" + + gnosis_cost = 1 + + rank = 1 + +/datum/action/cooldown/power/gift/speed_of_thought/Activate(atom/target) + . = ..() + var/mob/living/living_owner = astype(owner) + living_owner?.apply_status_effect(/datum/status_effect/speed_of_thought) + + +/datum/status_effect/speed_of_thought + id = "speed_of_thought" + duration = 1 SCENES + + status_type = STATUS_EFFECT_UNIQUE + + alert_type = /atom/movable/screen/alert/status_effect/gift/speed_of_thought + +/datum/status_effect/speed_of_thought/on_apply() + . = ..() + owner.add_movespeed_modifier(/datum/movespeed_modifier/speed_of_thought) + +/datum/status_effect/speed_of_thought/on_remove() + owner.remove_movespeed_modifier(/datum/movespeed_modifier/speed_of_thought) + return ..() + + +/atom/movable/screen/alert/status_effect/gift/speed_of_thought + name = /datum/action/cooldown/power/gift/speed_of_thought::name + desc = /datum/action/cooldown/power/gift/speed_of_thought::desc + overlay_state = /datum/action/cooldown/power/gift/speed_of_thought::button_icon_state + + +/datum/movespeed_modifier/speed_of_thought + multiplicative_slowdown = -0.5 + diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/silver_fangs.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/silver_fangs.dm new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/star_gazers.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/gifts/tribes/star_gazers.dm new file mode 100644 index 000000000000..e69de29bb2d1 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 e5947e031686..02f75b986c38 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 @@ -1,4 +1,3 @@ - /datum/subsplat/werewolf/tribe/garou abstract_type = /datum/subsplat/werewolf/tribe/garou fera_restriction = SPLAT_GAROU @@ -6,21 +5,14 @@ /datum/subsplat/werewolf/tribe/garou/galestalkers name = TRIBE_GALESTALKERS desc = "Tireless trackers and peerless hunters, the galestalkers carry the namesake of the wind that crosses the tundra." - // gifts_provided = list( - // /datum/action/cooldown/power/gift/stoic_pose, - // /datum/action/cooldown/power/gift/freezing_wind, - // /datum/action/cooldown/power/gift/bloody_feast - // ) + gifts_provided = list() subsplat_keys = /obj/item/vamp/keys/nps /datum/subsplat/werewolf/tribe/garou/ghostcouncil name = TRIBE_UKTENA desc = "Seekers of mystery and highly secretive, the Uktena is one of the most misunderstood tribes. Their ranks include guides, academics and the religious." gifts_provided = list( - /datum/action/cooldown/power/gift/spirit_speech, - // /datum/action/cooldown/power/gift/shroud, - // /datum/action/cooldown/power/gift/coils_of_the_serpent, - // /datum/action/cooldown/power/gift/banish_totem + // /datum/action/cooldown/power/gift/spirit_speech, // DARKPACK TODO - (Selectable Gifts) ) subsplat_keys = /obj/item/vamp/keys/nps @@ -29,20 +21,15 @@ desc = "Growing, creating, cultivating and maintaining the most natural of Gaia's creations, the Wardens are some of the closest to nature. Wherever they are, they coax Gaia's blessing out of whatever they can." gifts_provided = list( /datum/action/cooldown/power/gift/faerie_light, - // /datum/action/cooldown/power/gift/stoic_pose, - // /datum/action/cooldown/power/gift/freezing_wind, - // /datum/action/cooldown/power/gift/bloody_feast ) subsplat_keys = /obj/item/vamp/keys/nps /datum/subsplat/werewolf/tribe/garou/glasswalkers name = TRIBE_GLASS_WALKERS desc = "The closest to the Weaver, they find themselves deeply entrenched in modern human society, religion, technology and cities. Every new invention and every new discovery is one that aids the Glass Walkers, instead of impeding them." - // gifts_provided = list( - // /datum/action/cooldown/power/gift/smooth_move, - // /datum/action/cooldown/power/gift/digital_feelings, - // /datum/action/cooldown/power/gift/elemental_improvement - // ) + gifts_provided = list( + /datum/action/cooldown/power/gift/control_machine/simple, + ) subsplat_keys = /obj/item/vamp/keys/techstore /datum/subsplat/werewolf/tribe/garou/bonegnawers @@ -50,9 +37,6 @@ desc = "Survivors and scavengers, often destitute and homeless. The Gnawers are seen as mongrels who live off scraps, but they know better. They're the true survivors, patiently waiting for their moment to strike against overconfident foes." gifts_provided = list( /datum/action/cooldown/power/gift/desperate_strength, - // /datum/action/cooldown/power/gift/guise_of_the_hound, - // /datum/action/cooldown/power/gift/infest, - // /datum/action/cooldown/power/gift/gift_of_the_termite ) subsplat_keys = /obj/item/vamp/keys/children_of_gaia @@ -60,11 +44,9 @@ name = TRIBE_CHILDREN_OF_GAIA desc = "Peacekeepers, negotiators, treaty-makers and philosophers. The Children of Gaia strive as hard as they can create an understanding and unity between the disparate tribes that will allow them to form a united front against their foes." gifts_provided = list( - /datum/action/cooldown/power/gift/mothers_touch, - /datum/action/cooldown/power/gift/resist_pain, - // /datum/action/cooldown/power/gift/stoic_pose, - // /datum/action/cooldown/power/gift/freezing_wind, - // /datum/action/cooldown/power/gift/bloody_feast + /datum/action/cooldown/power/gift/jam_weapon + // /datum/action/cooldown/power/gift/mothers_touch, // DARKPACK TODO - (Selectable Gifts) + // /datum/action/cooldown/power/gift/resist_pain, // DARKPACK TODO - (Selectable Gifts) ) subsplat_keys = /obj/item/vamp/keys/children_of_gaia @@ -72,10 +54,9 @@ name = TRIBE_GET_OF_FENRIS desc = "Warriors, compassionate and fierce. They view themselves are Gaia's strongest heroes, but the rest of the tribes view them with caution, their violence more famous than their courage." gifts_provided = list( + // /datum/action/cooldown/power/gift/razor_claws, // DARKPACK TODO - (Selectable Gifts) + // /datum/action/cooldown/power/gift/resist_pain, // DARKPACK TODO - (Selectable Gifts) /datum/action/cooldown/power/gift/visage_of_fenris, - // /datum/action/cooldown/power/gift/stoic_pose, - // /datum/action/cooldown/power/gift/freezing_wind, - // /datum/action/cooldown/power/gift/bloody_feast ) subsplat_keys = /obj/item/vamp/keys/nps @@ -84,68 +65,58 @@ desc = "An all-female tribe, and the matriarchs of the Garou. The Black Furies are known fondly for their honor, wisdom, pride and impressive prowess in battle." gifts_provided = list( /datum/action/cooldown/power/gift/breath_of_the_wyld, - // /datum/action/cooldown/power/gift/freezing_wind, - // /datum/action/cooldown/power/gift/bloody_feast ) subsplat_keys = /obj/item/vamp/keys/nps /datum/subsplat/werewolf/tribe/garou/silentstriders name = TRIBE_SILENT_STRIDERS desc = "Highly spiritual nomads, the Silent Striders have headed deeper and longer into the depths of the Umbra than any other tribe." - // gifts_provided = list( - // /datum/action/cooldown/power/gift/stoic_pose, - // /datum/action/cooldown/power/gift/freezing_wind, - // /datum/action/cooldown/power/gift/bloody_feast - // ) + gifts_provided = list( + // /datum/action/cooldown/power/gift/sense_wyrm, // DARKPACK TODO - (Selectable Gifts) + /datum/action/cooldown/power/gift/speed_of_thought, + ) subsplat_keys = /obj/item/vamp/keys/nps /datum/subsplat/werewolf/tribe/garou/shadowlords name = TRIBE_SHADOW_LORDS desc = "The closest one could consider a Garou to being a 'politician'. They manipulate the tribes, and their enemies, and rely on cunning and wits more than physical strength. Not to say there aren't adept warriors in their ranks, but the tribe tends towards brains than brawn." - // gifts_provided = list( - // /datum/action/cooldown/power/gift/stoic_pose, - // /datum/action/cooldown/power/gift/freezing_wind, - // /datum/action/cooldown/power/gift/bloody_feast - // ) + gifts_provided = list( + /datum/action/cooldown/power/gift/aura_of_confidence, + /datum/action/cooldown/power/gift/fatal_flaw, + ) subsplat_keys = /obj/item/vamp/keys/techstore /datum/subsplat/werewolf/tribe/garou/redtalons name = TRIBE_RED_TALONS desc = "Exclusively consisting of lupus, the Red Talons shun humanity and think of them as a blight on Gaia." - // gifts_provided = list( - // /datum/action/cooldown/power/gift/stoic_pose, - // /datum/action/cooldown/power/gift/freezing_wind, - // /datum/action/cooldown/power/gift/bloody_feast - // ) + gifts_provided = list( + // /datum/action/cooldown/power/gift/beast_speech, // DARKPACK TODO - (Selectable Gifts) + /datum/action/cooldown/power/gift/hidden_killer, + ) /datum/subsplat/werewolf/tribe/garou/silverfangs name = TRIBE_SILVER_FANGS desc = "Commonly known as the 'Alphas' of the Garou Nation, their ranks consist of traditional rulers and wartime leaders. Known for being honorable and having courage, odd mental quirks have begun plaguing their young members, and the tribe is beginning to suffer from diseases of the spirit and mind." - // gifts_provided = list( - // /datum/action/cooldown/power/gift/stoic_pose, - // /datum/action/cooldown/power/gift/freezing_wind, - // /datum/action/cooldown/power/gift/bloody_feast - // ) + gifts_provided = list( + // /datum/action/cooldown/power/gift/inspiration, // DARKPACK TODO - (Selectable Gifts) + ) subsplat_keys = /obj/item/vamp/keys/nps /datum/subsplat/werewolf/tribe/garou/stargazers name = TRIBE_STARGAZERS desc = "The calmest of the Garou, they are well known for their introversion. They are the smallest of the remaining tribes, many of their kind wiped out by the Wyrm." - // gifts_provided = list( - // /datum/action/cooldown/power/gift/stoic_pose, - // /datum/action/cooldown/power/gift/freezing_wind, - // /datum/action/cooldown/power/gift/bloody_feast - // ) + gifts_provided = list() subsplat_keys = /obj/item/vamp/keys/nps /datum/subsplat/werewolf/tribe/garou/blackspiraldancers name = TRIBE_BLACK_SPIRAL_DANCERS desc = "The lost tribe. The dreadwolves. Those who dance lockstep with the Wyrm. They who have entered the labyrinth and come back, changed.\n{THIS IS AN ADVANCED TRIBE AND NOT RECOMMENDED FOR BEGINNERS. LORE KNOWLEDGE IS REQUIRED TO PLAY THIS TRIBE}" - // gifts_provided = list( - // /datum/action/cooldown/power/gift/stinky_fur, - // /datum/action/cooldown/power/gift/venom_claws, - // /datum/action/cooldown/power/gift/burning_scars - // ) + gifts_provided = list( + /datum/action/cooldown/power/gift/bane_protector, + // /datum/action/cooldown/power/gift/resist_pain, // DARKPACK TODO - (Selectable Gifts) + // /datum/action/cooldown/power/gift/sense_wyrm, // DARKPACK TODO - (Selectable Gifts) + ) + // tribe_trait = TRAIT_WYRMTAINTED_SPRITE /datum/subsplat/werewolf/tribe/garou/blackspiraldancers/psychomania_effect(mob/living/target, mob/living/owner) target.playsound_local(target, "modular_darkpack/modules/powers/sounds/daimonion_laughs/demonlaugh3.ogg", 50, FALSE) @@ -155,9 +126,4 @@ /datum/subsplat/werewolf/tribe/garou/ronin name = TRIBE_RONIN desc = "Garou who, for one reason or another, find themselves as outcasts of the Nation." - // gifts_provided = list( - // /datum/action/cooldown/power/gift/guise_of_the_hound, - // /datum/action/cooldown/power/gift/stoic_pose, - // /datum/action/cooldown/power/gift/smooth_move, - // /datum/action/cooldown/power/gift/shroud - // ) + gifts_provided = list() diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/icons/basic/banes.dmi b/modular_darkpack/modules/werewolf_the_apocalypse/icons/basic/banes.dmi new file mode 100644 index 000000000000..76eafbcf10ca Binary files /dev/null and b/modular_darkpack/modules/werewolf_the_apocalypse/icons/basic/banes.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 115c799106ed..c7d80d11f83f 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/tgstation.dme b/tgstation.dme index dadb532a4f08..1abcc702f237 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7239,18 +7239,27 @@ #include "modular_darkpack\modules\curtains\code\curtains.dm" #include "modular_darkpack\modules\dancing\code\dancing.dm" #include "modular_darkpack\modules\decor\code\bench.dm" +#include "modular_darkpack\modules\decor\code\bollards.dm" +#include "modular_darkpack\modules\decor\code\carwash.dm" +#include "modular_darkpack\modules\decor\code\cigarette_shelf.dm" #include "modular_darkpack\modules\decor\code\city_map.dm" +#include "modular_darkpack\modules\decor\code\commercial_freezer.dm" #include "modular_darkpack\modules\decor\code\decals.dm" #include "modular_darkpack\modules\decor\code\decor.dm" +#include "modular_darkpack\modules\decor\code\fallout_shelter_sign.dm" #include "modular_darkpack\modules\decor\code\flora.dm" +#include "modular_darkpack\modules\decor\code\grate.dm" +#include "modular_darkpack\modules\decor\code\lectern.dm" #include "modular_darkpack\modules\decor\code\posters.dm" #include "modular_darkpack\modules\decor\code\racks.dm" #include "modular_darkpack\modules\decor\code\railing.dm" #include "modular_darkpack\modules\decor\code\road_signs.dm" #include "modular_darkpack\modules\decor\code\signs_city.dm" +#include "modular_darkpack\modules\decor\code\sleeping_bag.dm" #include "modular_darkpack\modules\decor\code\stick.dm" #include "modular_darkpack\modules\decor\code\swaying.dm" #include "modular_darkpack\modules\decor\code\tables.dm" +#include "modular_darkpack\modules\decor\code\torch.dm" #include "modular_darkpack\modules\decor\code\trash.dm" #include "modular_darkpack\modules\decor\code\vents.dm" #include "modular_darkpack\modules\deprecated\code\runtime_town_types.dm" @@ -7502,14 +7511,19 @@ #include "modular_darkpack\modules\merits_flaws\code\negative_quirks\derangement.dm" #include "modular_darkpack\modules\merits_flaws\code\negative_quirks\dulled_bite.dm" #include "modular_darkpack\modules\merits_flaws\code\negative_quirks\grip_of_the_damned.dm" +#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\hemophiliac.dm" #include "modular_darkpack\modules\merits_flaws\code\negative_quirks\horrific_appearance_quirk.dm" +#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\lame.dm" +#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\light_sensitive.dm" #include "modular_darkpack\modules\merits_flaws\code\negative_quirks\mage_blood.dm" #include "modular_darkpack\modules\merits_flaws\code\negative_quirks\monstrous_quirk.dm" #include "modular_darkpack\modules\merits_flaws\code\negative_quirks\one_armed.dm" #include "modular_darkpack\modules\merits_flaws\code\negative_quirks\organovore.dm" #include "modular_darkpack\modules\merits_flaws\code\negative_quirks\permanent_fangs.dm" +#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\permanent_wound.dm" #include "modular_darkpack\modules\merits_flaws\code\negative_quirks\pierced_veil.dm" #include "modular_darkpack\modules\merits_flaws\code\negative_quirks\prey_exclusion.dm" +#include "modular_darkpack\modules\merits_flaws\code\negative_quirks\short.dm" #include "modular_darkpack\modules\merits_flaws\code\negative_quirks\speech_impediment.dm" #include "modular_darkpack\modules\merits_flaws\code\negative_quirks\territorial.dm" #include "modular_darkpack\modules\merits_flaws\code\negative_quirks\thaumaturgically_inept.dm" @@ -7694,6 +7708,7 @@ #include "modular_darkpack\modules\powers\code\discipline\potence\potence_status_effect.dm" #include "modular_darkpack\modules\powers\code\discipline\presence\presence.dm" #include "modular_darkpack\modules\powers\code\discipline\presence\status_effects\awe_status_effect.dm" +#include "modular_darkpack\modules\powers\code\discipline\presence\status_effects\dread_gaze.dm" #include "modular_darkpack\modules\powers\code\discipline\presence\status_effects\entrancement_status_effect.dm" #include "modular_darkpack\modules\powers\code\discipline\protean\beast_form.dm" #include "modular_darkpack\modules\powers\code\discipline\protean\claws.dm" @@ -7798,7 +7813,9 @@ #include "modular_darkpack\modules\ritual_thaumaturgy\rituals\burning_blade.dm" #include "modular_darkpack\modules\ritual_thaumaturgy\rituals\chime_of_the_unseen_spirits.dm" #include "modular_darkpack\modules\ritual_thaumaturgy\rituals\deflection_wooden_doom.dm" +#include "modular_darkpack\modules\ritual_thaumaturgy\rituals\donning_the_mask_of_shadows.dm" #include "modular_darkpack\modules\ritual_thaumaturgy\rituals\gargoyle_transformation.dm" +#include "modular_darkpack\modules\ritual_thaumaturgy\rituals\inscription.dm" #include "modular_darkpack\modules\ritual_thaumaturgy\rituals\question_to_the_ancestors.dm" #include "modular_darkpack\modules\ritual_thaumaturgy\rituals\self_gib.dm" #include "modular_darkpack\modules\ritual_thaumaturgy\rituals\teleport.dm" @@ -7966,6 +7983,9 @@ #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\basic_mobs\banes\_banes.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\basic_mobs\banes\religion.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\basic_mobs\banes\suffocating.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" @@ -7976,10 +7996,20 @@ #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" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\black_spiral_dancers.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\bone_gnawers.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\childrenofgaia.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\fianna.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\galestalkers.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\get_of_fenris.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\ghostcouncil.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\redtalons.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\shadowlords.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\silent_striders.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\silver_fangs.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\star_gazers.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\glasswalkers\control_machine.dm" +#include "modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\glasswalkers\glasswalkers.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\auspice.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\breed.dm" #include "modular_darkpack\modules\werewolf_the_apocalypse\code\preferences\fur.dm" diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/darkpack_merits_flaws_preferences.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/darkpack_merits_flaws_preferences.tsx index 3cdaa85c123e..03d1bca66070 100644 --- a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/darkpack_merits_flaws_preferences.tsx +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/darkpack_merits_flaws_preferences.tsx @@ -11,10 +11,15 @@ export const territorial: FeatureChoiced = { export const prey_exclusion: FeatureChoiced = { name: 'Prey Exclusion', description: 'The Prey Exclusion of this character.', - component: FeatureDropdownInput -} + component: FeatureDropdownInput, +}; export const missing_arm: FeatureChoiced = { name: 'Missing Arm', component: FeatureDropdownInput, }; + +export const lame_leg: FeatureChoiced = { + name: 'Lame Leg', + component: FeatureDropdownInput, +};