From 7f5ac90f31c42ad6a0f56a8fca5f59d21624291d Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Wed, 22 Apr 2026 19:55:57 -0400 Subject: [PATCH 01/35] 0.01 --- code/__DEFINES/~darkpack/splats.dm | 4 ++ .../fomori/code/powers/_fomor_power.dm | 16 ++++++ .../modules/fomori/code/powers/body_barbs.dm | 49 +++++++++++++++++++ .../fomori/code/splats/fomori_splat.dm | 5 ++ tgstation.dme | 2 + 5 files changed, 76 insertions(+) create mode 100644 modular_darkpack/modules/fomori/code/powers/_fomor_power.dm create mode 100644 modular_darkpack/modules/fomori/code/powers/body_barbs.dm create mode 100644 modular_darkpack/modules/fomori/code/splats/fomori_splat.dm diff --git a/code/__DEFINES/~darkpack/splats.dm b/code/__DEFINES/~darkpack/splats.dm index cd889cce6054..1c2468d0cf2c 100644 --- a/code/__DEFINES/~darkpack/splats.dm +++ b/code/__DEFINES/~darkpack/splats.dm @@ -11,11 +11,15 @@ #define SPLAT_CORAX "splat_corax" // DARKPACK TODO - CORAX #define SPLAT_SHIFTERS list(SPLAT_GAROU, SPLAT_CORAX) +#define SPLAT_FOMORI "splat_fomori" + #define SPLAT_PRIO_HALFSPLAT 100 #define SPLAT_PRIO_SPLAT 200 #define SPLAT_PRIO_KINFOLK 40 + SPLAT_PRIO_HALFSPLAT #define SPLAT_PRIO_GHOUL 70 + SPLAT_PRIO_HALFSPLAT +#define SPLAT_PRIO_FOMORI 20 + SPLAT_PRIO_SPLAT #define SPLAT_PRIO_SHIFTER 40 + SPLAT_PRIO_SPLAT #define SPLAT_PRIO_KINDRED 60 + SPLAT_PRIO_SPLAT + diff --git a/modular_darkpack/modules/fomori/code/powers/_fomor_power.dm b/modular_darkpack/modules/fomori/code/powers/_fomor_power.dm new file mode 100644 index 000000000000..e5391f116805 --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/_fomor_power.dm @@ -0,0 +1,16 @@ +// Presently a dummy placeholder, might want to do stuff like flavor the ui, change the dice roll, make fomor_powers private by default or the like +/datum/storyteller_roll/fomor_power + +/datum/action/cooldown/power/fomor_power + background_icon = 'modular_darkpack/modules/fomori/icons/fomori_abilities.dmi' + background_icon_state = "bg_fomor_power" + button_icon = 'modular_darkpack/modules/fomori/icons/fomori_abilities.dmi' + //button_icon_state = "" + overlay_icon = 'modular_darkpack/modules/fomori/icons/fomori_abilities.dmi' + + check_flags = AB_CHECK_IMMOBILE|AB_CHECK_CONSCIOUS + +/atom/movable/screen/alert/status_effect/fomor_power + icon = 'modular_darkpack/modules/fomori/icons/fomori_abilities.dmi' + icon_state = "bg_fomor_power" + overlay_icon = 'modular_darkpack/modules/fomori/icons/fomori_abilities.dmi' diff --git a/modular_darkpack/modules/fomori/code/powers/body_barbs.dm b/modular_darkpack/modules/fomori/code/powers/body_barbs.dm new file mode 100644 index 000000000000..b7437469881f --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/body_barbs.dm @@ -0,0 +1,49 @@ +/obj/item/melee/arm_blade/body_barbs + name = "body barb" + icon = 'icons/obj/weapons/changeling_items.dmi' + icon_state = "body_barb" + inhand_icon_state = "body_barb" + icon_angle = 0 + lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' + righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' + item_flags = ABSTRACT | DROPDEL + force = 25 // Remove this comment if you change this. Kept here in-case we make a balance change on this + wound_bonus = 10 // Remove this comment if you change this. Kept here in-case we make a balance change on this + exposed_wound_bonus = 10 // Remove this comment if you change this. Kept here in-case we make a balance change on this + armour_penetration = 35 // Remove this comment if you change this. Kept here in-case we make a balance change on this + +/datum/action/cooldown/power/fomori_power/body_barbs + name = "Body Barbs" + desc = "Use the grotesque spikes on your body to amplify your brawling ability." + button_icon_state = "bodybarbs" + rank = 1 // of 10 + var/extra_dice = 1 // How many extra dice the fomor gets to brawling + +/datum/action/cooldown/power/fomori_power/body_barbs/Activate(atom/target) + . = ..() + var/obj/item/held = owner.get_active_held_item() + var/obj/item/off_held = owner.get_inactive_held_item() + if(held && !owner.dropItemToGround(held)) + owner.balloon_alert(owner, "hand occupied!") + return + else if(off_held && !owner.dropItemToGround(off_held)) + owner.balloon_alert(owner, "off-hand occupied!") + return + var/obj/item/melee/arm_blade/body_barbs/active_weapon = new + var/obj/item/melee/arm_blade/body_barbs/inactive_weapon = new + + owner.put_in_hands(active_weapon) + owner.put_in_hands(inactive_weapon) + + +/datum/action/cooldown/power/fomori_power/body_barbs/two + rank = 2 + +/datum/action/cooldown/power/fomori_power/body_barbs/three + rank = 3 + +/datum/action/cooldown/power/fomori_power/body_barbs/four + rank = 4 + +/datum/action/cooldown/power/fomori_power/body_barbs/five + rank = 5 diff --git a/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm new file mode 100644 index 000000000000..e31d02601420 --- /dev/null +++ b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm @@ -0,0 +1,5 @@ +/datum/splat/fomori + power_type = /datum/action/cooldown/power/fomori_power + +/mob/living/carbon/human/splat/fomori + auto_splats = list(/datum/splat/fomori) diff --git a/tgstation.dme b/tgstation.dme index 29c8b2b5964e..412f23de3362 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7185,6 +7185,8 @@ #include "modular_darkpack\modules\flavor_text\code\preferences\masked_flavor_text_preference.dm" #include "modular_darkpack\modules\flavor_text\code\preferences\nsfw_content_preference.dm" #include "modular_darkpack\modules\flavor_text\code\preferences\record_preferences.dm" +#include "modular_darkpack\modules\fomori\code\powers\body_barbs.dm" +#include "modular_darkpack\modules\fomori\code\splats\fomori_splat.dm" #include "modular_darkpack\modules\font_adjustments\font_procs.dm" #include "modular_darkpack\modules\food\code\drinking_glass.dm" #include "modular_darkpack\modules\food\code\drinks.dm" From d90239f6d91dcc72f0453ed4e873033a2ca204d1 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Wed, 22 Apr 2026 19:56:06 -0400 Subject: [PATCH 02/35] icons by @Major00 --- .../modules/fomori/icons/fomori_abilities.dmi | Bin 0 -> 2081 bytes 1 file changed, 0 insertions(+), 0 deletions(-) create mode 100644 modular_darkpack/modules/fomori/icons/fomori_abilities.dmi diff --git a/modular_darkpack/modules/fomori/icons/fomori_abilities.dmi b/modular_darkpack/modules/fomori/icons/fomori_abilities.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d59e74ba8076edb69c61501b73e96fc2320c09e4 GIT binary patch literal 2081 zcmV++2;TRJP))03f<1CRqYKiVGqN03=B(E=MND!vFvP0d!JM zQvg8b*k%9#0RMVaSad{Xb7OL8aCB*JZU6vyoRyQyZo?oDMc3vltYlyHwe6-#6lKx; z0>UtuQ4M1aLtOuTNwesx!rjflod@TNegA$uoiF|2K1eoYVz`| zx&Sx^xhGkSKn-`ps69nuJ<|fbQ=LQ3_2Nl&o=t>%{3|E7>cQ}ko6+A43-*jCxe zENvB7p?NYnqSf#vTy7-Vd!hqPUP}PItQ?yKbwa>2YB4yqfmJ_%KR2LFB@VT1n?mo;~~OTfjGP@$}pT*Y12@!Uqt1 z_ZZ>Jbz|wjMDW8)gr8T9@mZXId?*29EdOv_0b|26Tkt5QUH#$ue$V>=AK&>JEBI-( z0LFx1NI{_c^yQ5;1RI9HXKYWf*b#8K0D?HT@Dy8kg62n2{s~$s-C?wAEqGK+sGz-^ zphiKb)7dT*#N+@xAO!*AX)=;rUEf?L2!$9&fOaw5kBLwOdzOG}q`G};g@r%xbP(Jn zj8aB-Jk!(av^qje>MVGm{$a<(0ydDcaKL=i^D251W$;rM13%$>A4QYJ0+vzixkWgV zQFhM|tXKtz5sL#pv>w%S)ml(UQl1oY3O*E-*Vm=IetVn~)ciGuV-Xgs5bM1$J#++o|INJ< zy^rb%0ulrT0o+`9KJ?v}Jd27L-+X@hi3IV~ThDV{YPXX03NQ|sQh=5L;npvwEAUyO z71SJQXC_Ej61=S`g& zDg-zL(Polj0@BXU+8h&|MQH0IXQ5+#6zxtW>f4wgP!cj8AqkQ7kvF3#DY;a&iz9$^ zAKlO1!Ee#dvJ57put#8F=|n{9C`9M8R;$x#<;^RtR_i)M`g1E99Q4GCZ9E-noUT3Q z1El~Y6t~RYl4i!(7n!{$ScEgV6h*L2oCMGavduzeobl{E&$9RCYke%U$V~`%C0W8Q zQ6BO}OHlf}rGCuUp~^&V9ViJWw7e{^=FRM_QE&qKvR~gbyDS0O*y1+okSh~bQJ^*r zSkKWsNfYp#CYFHf0f8ZieLcPGK?T3KzS07{P!kDjL4e0DDY8BBJfi$y2l>viH_T2{ zCL7w0fRo+L*eXzp2#Nirt<^M*W-&7>0uT&gvnKgGjiKI$KBxK z;gyf=P`t(#w)5)8x?o(g!Hh|l{`9e%ID&v5RV?Tj6z>OOsCWGQ*O*{ZF$^8S99vL{ zTc?G#kt;}V(wo3xU8wf@@)$hy>MW3}s-WnacEC7++?Nt=?#Yyb!3=pQ1+lQ`j>XX- zXqJpL=7v#0N<_eRO9Xm=TPM-=dIx)xu2&qKp)Pq~UF-xwUz99RDPe@P`q*5((txa9 zC>Z2-a0+-u!IZHX8w^Y{Rge4WfSVZslQTuY>j=WxU^Za0g=tS{e<4Kw*n}Ojzm_<* z6NFc?5H61UeR_;6K*UqnO2z`z2Lm}v>^|VcFDVG-BXB($nf4qU@dS*IETeW{35Jzb z2eSz=(Vy!4>i?cr_+5ofyYYo3 z_$c$j4%sG9({%Mk4#=gCj$N7NsXR5owWx<)ysH-$Du`TP#zzc`v9+k!kiyA_=v1Qbt5IbZsZwJ`O~<>{~P}RGMfwxIg@l*00000 LNkvXXu0mjflULP* literal 0 HcmV?d00001 From b4e654215329cd1288056336daba4d83d1944a4c Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Wed, 22 Apr 2026 19:56:13 -0400 Subject: [PATCH 03/35] empty inhand sprite files --- modular_darkpack/modules/fomori/icons/fomori_inhand_left.dmi | 0 modular_darkpack/modules/fomori/icons/fomori_inhand_right.dmi | 0 2 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 modular_darkpack/modules/fomori/icons/fomori_inhand_left.dmi create mode 100644 modular_darkpack/modules/fomori/icons/fomori_inhand_right.dmi diff --git a/modular_darkpack/modules/fomori/icons/fomori_inhand_left.dmi b/modular_darkpack/modules/fomori/icons/fomori_inhand_left.dmi new file mode 100644 index 000000000000..e69de29bb2d1 diff --git a/modular_darkpack/modules/fomori/icons/fomori_inhand_right.dmi b/modular_darkpack/modules/fomori/icons/fomori_inhand_right.dmi new file mode 100644 index 000000000000..e69de29bb2d1 From 37b26128e9591e9c50515ce64e4b84a23abeeacf Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Wed, 22 Apr 2026 23:59:48 -0400 Subject: [PATCH 04/35] lol! --- modular_darkpack/modules/fomori/code/splats/fomori_splat.dm | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm index e31d02601420..9183229ec8f5 100644 --- a/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm +++ b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm @@ -1,4 +1,10 @@ /datum/splat/fomori + name = "Fomori" + desc = "An unfortunate vessel possesed by an evil spirit known as a Bane." + id = SPLAT_FOMORI + + splat_priority = SPLAT_PRIO_FOMORI + power_type = /datum/action/cooldown/power/fomori_power /mob/living/carbon/human/splat/fomori From e40f91592cd3e4015a7b54bcb5e6eaaa4b7192c3 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Thu, 23 Apr 2026 08:01:27 -0400 Subject: [PATCH 05/35] how did this get unticked --- tgstation.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/tgstation.dme b/tgstation.dme index 412f23de3362..fa346b70157d 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7185,6 +7185,7 @@ #include "modular_darkpack\modules\flavor_text\code\preferences\masked_flavor_text_preference.dm" #include "modular_darkpack\modules\flavor_text\code\preferences\nsfw_content_preference.dm" #include "modular_darkpack\modules\flavor_text\code\preferences\record_preferences.dm" +#include "modular_darkpack\modules\fomori\code\powers\_fomor_power.dm" #include "modular_darkpack\modules\fomori\code\powers\body_barbs.dm" #include "modular_darkpack\modules\fomori\code\splats\fomori_splat.dm" #include "modular_darkpack\modules\font_adjustments\font_procs.dm" From a131423c3b64c93a6f0405d197f87d819be09880 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Thu, 23 Apr 2026 08:01:33 -0400 Subject: [PATCH 06/35] procs --- .../fomori/code/splats/fomori_splat.dm | 30 +++++++++++++++++++ 1 file changed, 30 insertions(+) diff --git a/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm index 9183229ec8f5..48b0b7542f1f 100644 --- a/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm +++ b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm @@ -9,3 +9,33 @@ /mob/living/carbon/human/splat/fomori auto_splats = list(/datum/splat/fomori) + +/datum/splat/fomori/on_gain() + owner.give_st_power(/datum/action/cooldown/power/fomori_power/body_barbs, 1) + +/datum/splat/fomori/get_power(power_type) + RETURN_TYPE(/datum/action/cooldown/power/fomori_power) + + for(var/datum/action/cooldown/power/fomori_power/found_action as anything in powers) + if(!istype(found_action, power_type)) + continue + + return found_action + +/datum/splat/fomori/add_power(power_type, level) + // Prevent duplicates + if(get_power(power_type)) + return FALSE + var/datum/action/cooldown/power/fomori_power/adding_action = new power_type() + adding_action.Grant(owner) + LAZYADD(powers, adding_action) + return TRUE + +/datum/splat/fomori/remove_power(power_type) + var/datum/action/cooldown/power/fomori_power/found_action = get_power(power_type) + if(!found_action) + return FALSE + + LAZYREMOVE(powers, found_action) + qdel(found_action) + return TRUE From e7b55f454956f2b3619d682a6d6916ab2ee838c7 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Thu, 23 Apr 2026 08:21:35 -0400 Subject: [PATCH 07/35] spelling standardize --- .../{_fomor_power.dm => _fomori_power.dm} | 12 ++++++------ .../modules/fomori/code/powers/body_barbs.dm | 2 +- .../modules/fomori/icons/fomori_abilities.dmi | Bin 2081 -> 4531 bytes tgstation.dme | 2 +- 4 files changed, 8 insertions(+), 8 deletions(-) rename modular_darkpack/modules/fomori/code/powers/{_fomor_power.dm => _fomori_power.dm} (64%) diff --git a/modular_darkpack/modules/fomori/code/powers/_fomor_power.dm b/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm similarity index 64% rename from modular_darkpack/modules/fomori/code/powers/_fomor_power.dm rename to modular_darkpack/modules/fomori/code/powers/_fomori_power.dm index e5391f116805..aba47ffdc43a 100644 --- a/modular_darkpack/modules/fomori/code/powers/_fomor_power.dm +++ b/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm @@ -1,16 +1,16 @@ -// Presently a dummy placeholder, might want to do stuff like flavor the ui, change the dice roll, make fomor_powers private by default or the like -/datum/storyteller_roll/fomor_power +// Presently a dummy placeholder, might want to do stuff like flavor the ui, change the dice roll, make fomori_powers private by default or the like +/datum/storyteller_roll/fomori_power -/datum/action/cooldown/power/fomor_power +/datum/action/cooldown/power/fomori_power background_icon = 'modular_darkpack/modules/fomori/icons/fomori_abilities.dmi' - background_icon_state = "bg_fomor_power" + background_icon_state = "bg_fomori_power" button_icon = 'modular_darkpack/modules/fomori/icons/fomori_abilities.dmi' //button_icon_state = "" overlay_icon = 'modular_darkpack/modules/fomori/icons/fomori_abilities.dmi' check_flags = AB_CHECK_IMMOBILE|AB_CHECK_CONSCIOUS -/atom/movable/screen/alert/status_effect/fomor_power +/atom/movable/screen/alert/status_effect/fomori_power icon = 'modular_darkpack/modules/fomori/icons/fomori_abilities.dmi' - icon_state = "bg_fomor_power" + icon_state = "bg_fomori_power" overlay_icon = 'modular_darkpack/modules/fomori/icons/fomori_abilities.dmi' diff --git a/modular_darkpack/modules/fomori/code/powers/body_barbs.dm b/modular_darkpack/modules/fomori/code/powers/body_barbs.dm index b7437469881f..339e4f4483e2 100644 --- a/modular_darkpack/modules/fomori/code/powers/body_barbs.dm +++ b/modular_darkpack/modules/fomori/code/powers/body_barbs.dm @@ -15,7 +15,7 @@ /datum/action/cooldown/power/fomori_power/body_barbs name = "Body Barbs" desc = "Use the grotesque spikes on your body to amplify your brawling ability." - button_icon_state = "bodybarbs" + button_icon_state = "body_barbs" rank = 1 // of 10 var/extra_dice = 1 // How many extra dice the fomor gets to brawling diff --git a/modular_darkpack/modules/fomori/icons/fomori_abilities.dmi b/modular_darkpack/modules/fomori/icons/fomori_abilities.dmi index d59e74ba8076edb69c61501b73e96fc2320c09e4..d30ef08852cb84fbc5357519e0f7ef4fc94af33c 100644 GIT binary patch delta 4438 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 Date: Sat, 25 Apr 2026 09:35:15 -0400 Subject: [PATCH 08/35] the barbs in question --- .../code/powers/_fomori_power_weapon.dm | 46 ++++++++++ .../modules/fomori/code/powers/body_barbs.dm | 81 +++++++++++------- .../modules/fomori/code/powers/claws.dm | 42 +++++++++ .../modules/fomori/code/powers/fangs.dm | 10 +++ .../modules/fomori/code/powers/horns.dm | 10 +++ .../fomori/code/splats/fomori_splat.dm | 5 +- .../fomori/icons/fomori_inhand_left.dmi | Bin 0 -> 549 bytes .../fomori/icons/fomori_inhand_right.dmi | Bin 0 -> 580 bytes .../fomori/icons/fomori_items48x32.dmi | Bin 0 -> 666 bytes .../icons/fomori_sprite_accessories.dmi | Bin 0 -> 1730 bytes tgstation.dme | 4 + 11 files changed, 165 insertions(+), 33 deletions(-) create mode 100644 modular_darkpack/modules/fomori/code/powers/_fomori_power_weapon.dm create mode 100644 modular_darkpack/modules/fomori/code/powers/claws.dm create mode 100644 modular_darkpack/modules/fomori/code/powers/fangs.dm create mode 100644 modular_darkpack/modules/fomori/code/powers/horns.dm create mode 100644 modular_darkpack/modules/fomori/icons/fomori_items48x32.dmi create mode 100644 modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi diff --git a/modular_darkpack/modules/fomori/code/powers/_fomori_power_weapon.dm b/modular_darkpack/modules/fomori/code/powers/_fomori_power_weapon.dm new file mode 100644 index 000000000000..48036bcb3ecc --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/_fomori_power_weapon.dm @@ -0,0 +1,46 @@ +/datum/action/cooldown/power/fomori_power/weapon + name = "fomor weapon power" + desc = "Report on github if you see this!" + cooldown_time = 1 TURNS // Can't sheathe/unsheathe for at least 5 seconds after use + + + var/deployed = FALSE // Do we have them out already? + + var/draw_text + var/sheathe_text = "Your skub melts back into your skin." + + var/weapon_type = /obj/item/skub + var/unsheathe_sound = 'sound/effects/blob/blobattack.ogg' + var/sheathe_sound = 'sound/effects/meatslap.ogg' + +/datum/action/cooldown/power/fomori_power/weapon/Activate(atom/target) + . = ..() + var/obj/item/held = owner.get_active_held_item() + var/obj/item/off_held = owner.get_inactive_held_item() + if(held && off_held && deployed) + qdel(held) + qdel(off_held) + to_chat(owner, span_warning(sheathe_text)) + playsound(get_turf(owner), sheathe_sound, 50) + return + + if(held && !owner.dropItemToGround(held)) + owner.balloon_alert(owner, "hand occupied!") + return + else if(off_held && !owner.dropItemToGround(off_held)) + owner.balloon_alert(owner, "off-hand occupied!") + return + + var/obj/item/weapon = new weapon_type(owner) + var/obj/item/weapon_offhand = new weapon_type(owner) + + deployed = TRUE + + playsound(get_turf(owner), unsheathe_sound, 50) + owner.put_in_l_hand(weapon) + owner.put_in_r_hand(weapon_offhand) + + + + + diff --git a/modular_darkpack/modules/fomori/code/powers/body_barbs.dm b/modular_darkpack/modules/fomori/code/powers/body_barbs.dm index 339e4f4483e2..576293474cfd 100644 --- a/modular_darkpack/modules/fomori/code/powers/body_barbs.dm +++ b/modular_darkpack/modules/fomori/code/powers/body_barbs.dm @@ -1,49 +1,66 @@ -/obj/item/melee/arm_blade/body_barbs +/obj/item/melee/body_barbs // Largely copied from changeling armblade name = "body barb" - icon = 'icons/obj/weapons/changeling_items.dmi' + icon = 'modular_darkpack/modules/fomori/icons/fomori_items48x32.dmi' icon_state = "body_barb" inhand_icon_state = "body_barb" - icon_angle = 0 - lefthand_file = 'icons/mob/inhands/antag/changeling_lefthand.dmi' - righthand_file = 'icons/mob/inhands/antag/changeling_righthand.dmi' + lefthand_file = 'modular_darkpack/modules/fomori/icons/fomori_inhand_left.dmi' + righthand_file = 'modular_darkpack/modules/fomori/icons/fomori_inhand_right.dmi' item_flags = ABSTRACT | DROPDEL - force = 25 // Remove this comment if you change this. Kept here in-case we make a balance change on this - wound_bonus = 10 // Remove this comment if you change this. Kept here in-case we make a balance change on this - exposed_wound_bonus = 10 // Remove this comment if you change this. Kept here in-case we make a balance change on this - armour_penetration = 35 // Remove this comment if you change this. Kept here in-case we make a balance change on this + w_class = WEIGHT_CLASS_HUGE + force = 40 // Identical to Machete + throwforce = 0 + throw_range = 0 + throw_speed = 0 + hitsound = 'sound/items/weapons/bladeslice.ogg' + wound_bonus = 10 + exposed_wound_bonus = 10 + armour_penetration = 35 + attack_verb_continuous = list("attacks", "slashes", "slices", "tears", "lacerates", "rips", "dices", "cuts") + attack_verb_simple = list("attack", "slash", "slice", "tear", "lacerate", "rip", "dice", "cut") + sharpness = SHARP_EDGED + wound_bonus = 10 + exposed_wound_bonus = 10 + armour_penetration = 35 + var/can_drop = FALSE + var/fake = FALSE + var/list/alt_continuous = list("stabs", "pierces", "impales") + var/list/alt_simple = list("stab", "pierce", "impale") -/datum/action/cooldown/power/fomori_power/body_barbs + abstract_type = /obj/item/melee/body_barbs + +/obj/item/melee/body_barbs/Initialize(mapload,silent,synthetic) // Largely copied from changeling armblade + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, "body_barbs") + if(synthetic) + can_drop = TRUE + alt_continuous = string_list(alt_continuous) + alt_simple = string_list(alt_simple) + AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple, -5) + AddComponent(/datum/component/butchering, \ + speed = 6 SECONDS, \ + effectiveness = 80, \ + ) + +/datum/action/cooldown/power/fomori_power/weapon/body_barbs name = "Body Barbs" desc = "Use the grotesque spikes on your body to amplify your brawling ability." button_icon_state = "body_barbs" - rank = 1 // of 10 - var/extra_dice = 1 // How many extra dice the fomor gets to brawling + rank = 1 // of 10 // Determines how many extra dice we get + weapon_type = /obj/item/melee/body_barbs -/datum/action/cooldown/power/fomori_power/body_barbs/Activate(atom/target) +/datum/action/cooldown/power/fomori_power/weapon/body_barbs/Activate(atom/target) . = ..() - var/obj/item/held = owner.get_active_held_item() - var/obj/item/off_held = owner.get_inactive_held_item() - if(held && !owner.dropItemToGround(held)) - owner.balloon_alert(owner, "hand occupied!") - return - else if(off_held && !owner.dropItemToGround(off_held)) - owner.balloon_alert(owner, "off-hand occupied!") - return - var/obj/item/melee/arm_blade/body_barbs/active_weapon = new - var/obj/item/melee/arm_blade/body_barbs/inactive_weapon = new + owner.visible_message(span_warning("A pair of grotesque barbs extend from [owner]\'s arms!"), \ + span_warning("Your body barbs extend from your arms."), \ + span_hear("You hear organic matter ripping and tearing!")) - owner.put_in_hands(active_weapon) - owner.put_in_hands(inactive_weapon) - - -/datum/action/cooldown/power/fomori_power/body_barbs/two +/datum/action/cooldown/power/fomori_power/weapon/body_barbs/two rank = 2 -/datum/action/cooldown/power/fomori_power/body_barbs/three +/datum/action/cooldown/power/fomori_power/weapon/body_barbs/three rank = 3 -/datum/action/cooldown/power/fomori_power/body_barbs/four +/datum/action/cooldown/power/fomori_power/weapon/body_barbs/four rank = 4 - -/datum/action/cooldown/power/fomori_power/body_barbs/five +/datum/action/cooldown/power/fomori_power/weapon/body_barbs/five rank = 5 diff --git a/modular_darkpack/modules/fomori/code/powers/claws.dm b/modular_darkpack/modules/fomori/code/powers/claws.dm new file mode 100644 index 000000000000..3a4603da8141 --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/claws.dm @@ -0,0 +1,42 @@ +/obj/item/knife/fomor_claws // Just a normal knife, but part of our hands! + name = "claw" + icon = 'modular_darkpack/modules/fomori/icons/fomori_items48x32.dmi' + icon_state = "claw" + inhand_icon_state = "claw" + lefthand_file = 'modular_darkpack/modules/fomori/icons/fomori_inhand_left.dmi' + righthand_file = 'modular_darkpack/modules/fomori/icons/fomori_inhand_right.dmi' + icon_angle = 0 + item_flags = ABSTRACT | DROPDEL + w_class = WEIGHT_CLASS_HUGE + throwforce = 0 + throw_speed = 0 + throw_range = 0 + + abstract_type = /obj/item/knife/fomor_claws + +/obj/item/melee/body_barbs/Initialize(mapload,silent,synthetic) // Largely copied from changeling armblade + . = ..() + ADD_TRAIT(src, TRAIT_NODROP, "fomor_claws") + if(synthetic) + can_drop = TRUE + alt_continuous = string_list(alt_continuous) + alt_simple = string_list(alt_simple) + AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple, -5) + AddComponent(/datum/component/butchering, \ + speed = 6 SECONDS, \ + effectiveness = 80, \ + ) + +/datum/action/cooldown/power/fomori_power/weapon/claws + name = "Claws" + desc = "Use the grotesque claws on your hands to slice and dice." + button_icon_state = "claws" + rank = 1 // of 1 + weapon_type = /obj/item/knife/fomor_claws + unsheathe_sound = 'sound/items/weapons/parry.ogg' + +/datum/action/cooldown/power/fomori_power/weapon/claws/Activate(atom/target) + . = ..() + owner.visible_message(span_warning("A pair of grotesque claws extend from [owner]\'s hands!"), \ + span_warning("Your claws extend from your hands."), \ + span_hear("You hear organic matter ripping and tearing!")) diff --git a/modular_darkpack/modules/fomori/code/powers/fangs.dm b/modular_darkpack/modules/fomori/code/powers/fangs.dm new file mode 100644 index 000000000000..0428e62c35dc --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/fangs.dm @@ -0,0 +1,10 @@ +/datum/action/cooldown/power/fomori_power/fangs + name = "Fangs" + desc = "(UNIMPLEMENTED) Use the grotesque fangs spilling from your mouth to bite your enemies." + button_icon_state = "fangs" + rank = 1 // of 1 + + var/deployed = FALSE + +/datum/action/cooldown/power/fomori_power/fangs/Activate(atom/target) + . = ..() diff --git a/modular_darkpack/modules/fomori/code/powers/horns.dm b/modular_darkpack/modules/fomori/code/powers/horns.dm new file mode 100644 index 000000000000..56e2d293b808 --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/horns.dm @@ -0,0 +1,10 @@ +/datum/action/cooldown/power/fomori_power/horns + name = "Horns" + desc = "(UNIMPLEMENTED) Use the grotesque horns atop your head to gore your enemies." + button_icon_state = "horns" + rank = 1 // of 1 + + var/deployed = FALSE + +/datum/action/cooldown/power/fomori_power/horns/Activate(atom/target) + . = ..() diff --git a/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm index 48b0b7542f1f..764762c9f221 100644 --- a/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm +++ b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm @@ -11,7 +11,10 @@ auto_splats = list(/datum/splat/fomori) /datum/splat/fomori/on_gain() - owner.give_st_power(/datum/action/cooldown/power/fomori_power/body_barbs, 1) + owner.give_st_power(/datum/action/cooldown/power/fomori_power/weapon/body_barbs, 1) + owner.give_st_power(/datum/action/cooldown/power/fomori_power/weapon/claws, 1) + owner.give_st_power(/datum/action/cooldown/power/fomori_power/horns, 1) + owner.give_st_power(/datum/action/cooldown/power/fomori_power/fangs, 1) /datum/splat/fomori/get_power(power_type) RETURN_TYPE(/datum/action/cooldown/power/fomori_power) diff --git a/modular_darkpack/modules/fomori/icons/fomori_inhand_left.dmi b/modular_darkpack/modules/fomori/icons/fomori_inhand_left.dmi index e69de29bb2d1d6434b8b29ae775ad8c2e48c5391..0f51d4991ccebd56cc164bdd49e36367d2ce6db9 100644 GIT binary patch literal 549 zcmV+=0^0qFP)I zs)kCUHB5j|oJ4DAfKVK?(*X4?JJA|O!6+C7BN@P|6QY4DMj6b7S3RscK~ld9zXn)! z0vC|l4Q27z2w>9zt4?5msdhJ1-5DRO6#%R{fdP)9EAC(hyNDb18e=+|1|~r@h)IG< zSky`O~S4rDHO&O2}71}DaUR%W0C`mDITVPB*D^dfK>y7AWQ>` zdoi*G_7?2w85rRsJ$u^4 z3T)yfY3kTDum~w)ElU}NRB&i$@4#A?aB+gch(6K7z-QT~_UP>-|1z*Ucof>AIE zMgd{408*Ofdv-#}vX{8-QJaDKuIePyhgINiP0( Se(2%=0000V=-0C=2JR&a84_w-Y6@%7{?OD!tS%+FJ>RWQ*r;NmRL zOex6#aV)qvGg33tGfIFQVK~|z zRg9w=f&tfI8nB80B%Z`L^gYz&7(`^JAlXgC4gdyD3r%M)MOkg zWO_AUObZDPAvuav141khi0jRJ_^|o7Nc!kI3Jw&gz*Hcn&)g7gMQpaku-Lw;El;ds z4Z(mA1dJ6U67D$ezGysT!2r;?suaLidIhEAh1=rA8(<)D1TqKcSI{zMMl!x ztn*m{6eZ9gcQz`o=CuTIWE7;s=&fYf<&b#fcp4N_%ab)tJVxW(?Qlq_=2jsgQ3sNo z`*i?mr8qK*Cd9;BQ=dpy3y=n)Y3Q+7?F!teRXspZ*gu1*H`Zjq?*M6uCsQKOO?tJn zd&z#$ECFwQ60qrN&l!OJB)rwBF`Hf4Gl0M58zot4vZXm#UjP6A07*qoM6N<$f~`U* AaR2}S literal 0 HcmV?d00001 diff --git a/modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi b/modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi new file mode 100644 index 0000000000000000000000000000000000000000..395cb479b91144ac4f938e424e58bcbe43054283 GIT binary patch literal 1730 zcmV;z20i(SP)004jl0{{R3eocQU0000jP)t-sz`(#h zQ8=8Ua>~P{4I~^{0zJAWCW;Fp=i$inT}axrvhUg0vx$fQ|NjaABpTxR?f?J)0d!JM zQvg8b*k%9#0HbOfy1 ziW(=j)Fvn~6yBZ|1}2p4PP$LNbFI$prR!C5?c@VerWn*o9XDGkX0nWnIqaoCAdmbt znGM4tD~u`RN(xIUuaFcjnF&_C`=v&ck%HH3Xe@@2Ea>PoBk1{+rXm0X$J=sZqCvxx z(|uh~q?`%& zJ*{Tk657kI?o z!h&IGi!q@guo({nTtb9=NSfgWmJ?c_f{kbj3$T#GY}o{v&_?KmL$L`;II;^IU{l8y zs5}d7AJw2ih9iRlgi~T{fdYn2aSIu@?1(hN@|fiqmSPy%k}$Ru1v4z-;3oToMyLve z*t%ia+hvtvEN|nolb9UQ8<_ANInXVH(JeCAjuoK{kfb3Nw&4+S3m5q^E!9Y9L?$uG z6xivtw9{J?7rBS>t1$HfH6A+Q8KE(pR)2>M9XhN)&zsPA;|V)-_&)&3-3)wm7Cttq zsLjhko#QJLF6VmE*N0~!v@3-B4z__n<&EN5?ly9m-|2aSndYjtCB48IHpJzNyytl} zbHGq38jg!w*B1@_D*`9;x^g57KPqKBfA3i4E+HdR8ym_u#F*5=4YpR@LBkJ!A>{kX z{UT%e@gHQJhp-qGMUyG_1lpCAaDsS6$UZuG@i=)nDPmxgkjyX0y%i+nB_V0i{9e{e@NDttl~pE@WGs`i4^9XSodO#R+?MflU?@Xv3}{URdz=<(&*?rjGW8rMrr zzuB|_VfOXxroY3(`~6)N10j=Pvan$shU=At%}ve;N%Hs2Vc-0!$T0WiCMh|X*Aw=P zX2PhL0s7nWR}n0zxHiWd17ixdJ-$`jiIh5#G7`f3#oNoS5^mqq2<@`Ta-8c4!Ar># z`9d8P8CQut)Aljo)sxTUXjn(cdVwMoquz)KRTHuLdhLMF5aW76H;9V+oe|rv^C?L{ zlMP;-k5`0(E5a|x#n&Kowrbx!XTw*7d*mWKgm5eKzY&AYsu!0ffs5nC$}q`#00^B= zD&F9+k>S>zCuphbHzDC?756E0p4RTIaq1e};t#5Xua7~)eTNQj5EwpRWY8#9w?b^_ zwtl|?77~c?t)u*{b(gC@w3ugHAQjjI^O^2sUK4lbdz9BDvPFb$ODCI)g%XDb02t1NEH8S{MZ^1T* zS`w%q;Rtyc{B{fz%x~@#V+)QGXmO3bA0EgBLFLF539oBT@WI`uC}sPudeU{m^fX}l z@IeI51tR?v!|~spz;S0w^0typ<#B?cuI52PFd;s4p!N`ln}e%sOfV)xd(C0jm* zpZ|pwGAY$x4f^J6S64F_2W0kAE7KZ*x!7yvlk1>~^;oI?YH{J=kL`q#0TGIT9W{BT zSR5b$Tn912mQsJUu#?s?OR<9p?RK#yU;P;z#9@uk7s%4opQSE&eI$LQ+X=N%!`rh+ zT{5I%(ts62qyp`0fhe~za=FL}d99sB8`bT25q`Z?-iMj~jEiy8ZAs{fiiXwjGw1@E z2}2`puqCFgpAA=-pX$+}!<&zazB?<_vYz31_0x>?YSLqDE|HX2m#hBsHo}u?lIDK} ziJgHYeAX7=v$>u$xQjy+=sYo90+SZPwHI8=PWX#sl;FZo@=^tF@3bwWYbSRO6EFkz zk}KDqV?q(bDYqX4!POQ*@?3frqVBU&hkpfjy32n{Xq>KhUI!cr$a6q1h|iZW`!Apl9bO6l Y0G&L-M2A7A&j0`b07*qoM6N<$g2^X7#{d8T literal 0 HcmV?d00001 diff --git a/tgstation.dme b/tgstation.dme index 1b8d8eead8bd..2af861919853 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7186,7 +7186,11 @@ #include "modular_darkpack\modules\flavor_text\code\preferences\nsfw_content_preference.dm" #include "modular_darkpack\modules\flavor_text\code\preferences\record_preferences.dm" #include "modular_darkpack\modules\fomori\code\powers\_fomori_power.dm" +#include "modular_darkpack\modules\fomori\code\powers\_fomori_power_weapon.dm" #include "modular_darkpack\modules\fomori\code\powers\body_barbs.dm" +#include "modular_darkpack\modules\fomori\code\powers\claws.dm" +#include "modular_darkpack\modules\fomori\code\powers\fangs.dm" +#include "modular_darkpack\modules\fomori\code\powers\horns.dm" #include "modular_darkpack\modules\fomori\code\splats\fomori_splat.dm" #include "modular_darkpack\modules\font_adjustments\font_procs.dm" #include "modular_darkpack\modules\food\code\drinking_glass.dm" From a3c013c1c2df04717a9a8f83a3810957e3fc5346 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Tue, 28 Apr 2026 15:38:04 -0400 Subject: [PATCH 09/35] darksight and chameleon coloration --- .../code/powers/chameleon_coloration.dm | 50 ++++++++++++++++++ .../modules/fomori/code/powers/darksight.dm | 34 ++++++++++++ .../fomori/code/splats/fomori_splat.dm | 4 +- .../modules/fomori/icons/fomori_abilities.dmi | Bin 4531 -> 4531 bytes tgstation.dme | 2 + 5 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 modular_darkpack/modules/fomori/code/powers/chameleon_coloration.dm create mode 100644 modular_darkpack/modules/fomori/code/powers/darksight.dm diff --git a/modular_darkpack/modules/fomori/code/powers/chameleon_coloration.dm b/modular_darkpack/modules/fomori/code/powers/chameleon_coloration.dm new file mode 100644 index 000000000000..702373827d53 --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/chameleon_coloration.dm @@ -0,0 +1,50 @@ +/datum/action/cooldown/power/fomori_power/chameleon_coloration + name = "Chameleon Coloration" + desc = "Blend into the background to strike unseen." + button_icon_state = "chameleon_coloration" + rank = 1 // of 1 + + var/activated = FALSE + +/datum/action/cooldown/power/fomori_power/chameleon_coloration/Activate(atom/target) + . = ..() + if(activated) + activated = FALSE + owner.alpha = 255 + UnregisterSignal(owner, list(COMSIG_MOVABLE_MOVED, COMSIG_LIVING_UNARMED_ATTACK)) + else + activated = TRUE + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(on_move)) + RegisterSignal(owner, COMSIG_LIVING_UNARMED_ATTACK, PROC_REF(on_attack_hand)) + var/mob/living/living_owner = astype(owner) + living_owner.apply_status_effect(/datum/status_effect/chameleon_coloration) + +/datum/action/cooldown/power/fomori_power/chameleon_coloration/proc/on_move(atom/movable/source, atom/old_loc, move_dir, forced, list/atom/old_locs) + SIGNAL_HANDLER + + owner.alpha = 200 + +/datum/action/cooldown/power/fomori_power/chameleon_coloration/proc/on_attack_hand(mob/living/carbon/human/source, atom/target, proximity, list/modifiers) + SIGNAL_HANDLER + + if(!proximity) + return + owner.alpha = 200 + +/datum/status_effect/chameleon_coloration + id = "chameleon_coloration" + duration = INFINITY + + status_type = STATUS_EFFECT_UNIQUE + + alert_type = /atom/movable/screen/alert/status_effect/chameleon_coloration + +/datum/status_effect/chameleon_coloration/tick(seconds_per_tick) + . = ..() + owner.alpha = max(owner.alpha - 50, 0) // TODO: use animate magic to make this look better + +/atom/movable/screen/alert/status_effect/chameleon_coloration + name = "Chameleon Coloration" + desc = "You are blending in with your surroundings." + icon = 'modular_darkpack/modules/deprecated/icons/hud/screen_alert.dmi' + icon_state = "riddle" // TODO: get an icon for this diff --git a/modular_darkpack/modules/fomori/code/powers/darksight.dm b/modular_darkpack/modules/fomori/code/powers/darksight.dm new file mode 100644 index 000000000000..221f08b32383 --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/darksight.dm @@ -0,0 +1,34 @@ +/datum/action/cooldown/power/fomori_power/darksight // TODO: Make this work with more light sources + name = "Darksight" + desc = "See in the dark unbidden, but beware bright lights." + button_icon_state = "darksight" + rank = 1 // of 1 + + check_flags = AB_CHECK_CONSCIOUS + cooldown_time = 1 SECONDS // So we don't click too fast + + var/activated = FALSE + +/datum/action/cooldown/power/fomori_power/darksight/Activate(atom/target) + . = ..() + to_chat(owner, span_notice("You [activated ? "activate" : "deactivate"] Darksight.")) + if(activated) + activated = FALSE + REMOVE_TRAIT(owner, TRAIT_TRUE_NIGHT_VISION, "fomor_darksight") + owner.remove_client_colour("fomor_darksight") + UnregisterSignal(owner, COMSIG_MOB_FLASHED, PROC_REF(on_flashed)) + else + activated = TRUE + ADD_TRAIT(owner, TRAIT_TRUE_NIGHT_VISION, "fomor_darksight") + owner.add_client_colour(/datum/client_colour/monochrome, "fomor_darksight") + RegisterSignal(owner, COMSIG_MOB_FLASHED) + owner.update_sight() + +/datum/action/cooldown/power/fomori_power/darksight/proc/on_flashed() + SIGNAL_HANDLER + + var/mob/living/carbon/carbon_owner = owner + var/our_perception = carbon_owner.st_get_stat(STAT_PERCEPTION) + carbon_owner.Stun(our_perception TURNS) // Stunned 1 TURNS per dot in perception + if(our_perception > 1) + to_chat(owner, span_userdanger("Your enhanced vision causes you to be stunned for an extra [our_perception] turns!")) diff --git a/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm index 764762c9f221..5a705d26afa8 100644 --- a/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm +++ b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm @@ -10,11 +10,13 @@ /mob/living/carbon/human/splat/fomori auto_splats = list(/datum/splat/fomori) -/datum/splat/fomori/on_gain() +/datum/splat/fomori/on_gain() // WIP: Will be pointbuy eventually owner.give_st_power(/datum/action/cooldown/power/fomori_power/weapon/body_barbs, 1) owner.give_st_power(/datum/action/cooldown/power/fomori_power/weapon/claws, 1) owner.give_st_power(/datum/action/cooldown/power/fomori_power/horns, 1) owner.give_st_power(/datum/action/cooldown/power/fomori_power/fangs, 1) + owner.give_st_power(/datum/action/cooldown/power/fomori_power/chameleon_coloration, 1) + owner.give_st_power(/datum/action/cooldown/power/fomori_power/darksight, 1) /datum/splat/fomori/get_power(power_type) RETURN_TYPE(/datum/action/cooldown/power/fomori_power) diff --git a/modular_darkpack/modules/fomori/icons/fomori_abilities.dmi b/modular_darkpack/modules/fomori/icons/fomori_abilities.dmi index d30ef08852cb84fbc5357519e0f7ef4fc94af33c..73941e717927b1b0fdfb6bbe1a5136dbcf1a55cc 100644 GIT binary patch delta 267 zcmV+m0rdW}BeNrrI)6KE!!QhnXZsXJvKM`=U5W%jhUN-{EYTKGOEf4du5VwZ89Ehm zH#V($781`aF) zGcPE+ws9n>ygaqdASU45{?)Tvp*PZ}s?@W@x@s_StgGx~mVdemt@1pX6vzU8spK1q z`kdqtcmVYX%POIoP&#;uBdDRN4y-H$<#Pktm_uL6)>-%xn~)<|o>+`-`J`o$JS#f5 z(v3({L^7ng9S0 RZ%IT!RCt{2U9&g=dk}Q_f%E_X delta 267 zcmV+m0rdW}BeNrrI)BSpJZv*@bA z-Oa$A2j_}?|9(83Fa6=;tggTrDfMst>%*h!7IYG7^75>@05}G@Cs~X@4R^z+Jw;;F zGcCY7)j8x`Z=O`=*+jU Date: Wed, 29 Apr 2026 07:23:31 -0400 Subject: [PATCH 10/35] put fomor on the splat screen (WIP) --- config/darkpack_config.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/config/darkpack_config.txt b/config/darkpack_config.txt index 0da4988cc480..911fea46b2af 100644 --- a/config/darkpack_config.txt +++ b/config/darkpack_config.txt @@ -35,6 +35,7 @@ ROUNDSTART_SPLATS splat_kindred ROUNDSTART_SPLATS splat_ghoul ROUNDSTART_SPLATS splat_kinfolk ROUNDSTART_SPLATS splat_garou +ROUNDSTART_SPLATS splat_fomori ## If dead people and ghosts can LOOC to people who are alive. DISABLE_GHOST_LOOC From c91ab11f7decfd872901df5e49b336f7a429f149 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Sun, 3 May 2026 19:12:52 -0400 Subject: [PATCH 11/35] combat bites --- .../~darkpack/traits/declarations.dm | 2 + code/_globalvars/traits/_traits.dm | 1 + code/_globalvars/traits/admin_tooling.dm | 1 + .../mob/living/carbon/carbon_defines.dm | 4 ++ .../blood_drinking/code/bite_keybinding.dm | 5 +- .../blood_drinking/code/combat_bite.dm | 67 ++++++++++++++++++ .../code/movable_screens/drinkblood_hud.dm | 5 +- .../modules/fomori/icons/fomori_abilities.dmi | Bin 4531 -> 4901 bytes tgstation.dme | 1 + 9 files changed, 84 insertions(+), 2 deletions(-) create mode 100644 modular_darkpack/modules/blood_drinking/code/combat_bite.dm diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index 3e7b57415af4..17b5e31f5f00 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -28,6 +28,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_BLOODY_SUCKER "bloody_sucker" #define TRAIT_NON_INT "non_intellectual" #define TRAIT_COFFIN_THERAPY "coffin_therapy" +// If we use combat_bite instead of vamp_bite +#define TRAIT_COMBAT_BITE "combat_bite" #define TRAIT_RUBICON "rubicon" #define TRAIT_HUNGRY "hungry" #define TRAIT_STAKE_RESISTANT "stake_resistant" diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 4376a8acf4a0..f83aef8d8b3c 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -680,6 +680,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_CAN_ENTER_TORPOR" = TRAIT_CAN_ENTER_TORPOR, // DARKPACK EDIT ADD "TRAIT_CHARMER" = TRAIT_CHARMER, // DARKPACK EDIT ADD "TRAIT_COFFIN_THERAPY" = TRAIT_COFFIN_THERAPY, // DARKPACK EDIT ADD + "TRAIT_COMBAT_BITE" = TRAIT_COMBAT_BITE, // DARKPACK EDIT ADD "TRAIT_CONSENSUAL_FEEDING_ONLY" = TRAIT_CONSENSUAL_FEEDING_ONLY, // DARKPACK EDIT ADD "TRAIT_DECEPTIVE_AURA" = TRAIT_DECEPTIVE_AURA, // DARKPACK EDIT ADD "TRAIT_DEFICIENT_VITAE" = TRAIT_DEFICIENT_VITAE, // DARKPACK EDIT ADD diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index e7b28166c4f8..16705524cb75 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -370,6 +370,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_CAN_ENTER_TORPOR" = TRAIT_CAN_ENTER_TORPOR, // DARKPACK EDIT ADD "TRAIT_CHARMER" = TRAIT_CHARMER, // DARKPACK EDIT ADD "TRAIT_COFFIN_THERAPY" = TRAIT_COFFIN_THERAPY, // DARKPACK EDIT ADD + "TRAIT_COMBAT_BITE" = TRAIT_COMBAT_BITE, // DARKPACK EDIT ADD "TRAIT_CONSENSUAL_FEEDING_ONLY" = TRAIT_CONSENSUAL_FEEDING_ONLY, // DARKPACK EDIT ADD "TRAIT_DECEPTIVE_AURA" = TRAIT_DECEPTIVE_AURA, // DARKPACK EDIT ADD "TRAIT_DEFICIENT_VITAE" = TRAIT_DEFICIENT_VITAE, // DARKPACK EDIT ADD diff --git a/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm b/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm index 1c3c3d17781d..254e564d5cc2 100644 --- a/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm +++ b/modular_darkpack/master_files/code/modules/mob/living/carbon/carbon_defines.dm @@ -9,3 +9,7 @@ var/fakediablerist = FALSE var/can_be_embraced = TRUE + //stats for combat bites // used for lupus, crinos, hispo, fomori, etc. + var/list/combat_bite_damages = list(BRUTE = 1 LETHAL_TTRPG_DAMAGE, BURN = 0, TOX = 0, OXY = 0, AGGRAVATED = 0) + var/list/combat_bite_stats = list(STAT_DEXTERITY, STAT_BRAWL) + var/list/combat_bite_difficulty = 5 diff --git a/modular_darkpack/modules/blood_drinking/code/bite_keybinding.dm b/modular_darkpack/modules/blood_drinking/code/bite_keybinding.dm index 39fcf252ca67..9c12cfa95be8 100644 --- a/modular_darkpack/modules/blood_drinking/code/bite_keybinding.dm +++ b/modular_darkpack/modules/blood_drinking/code/bite_keybinding.dm @@ -12,6 +12,9 @@ if(ishuman(user.mob)) var/mob/living/carbon/human/human_user = user.mob - human_user.vamp_bite() + if(HAS_TRAIT(human_user, TRAIT_COMBAT_BITE)) + human_user.combat_bite() + else + human_user.vamp_bite() return TRUE diff --git a/modular_darkpack/modules/blood_drinking/code/combat_bite.dm b/modular_darkpack/modules/blood_drinking/code/combat_bite.dm new file mode 100644 index 000000000000..95e604e70817 --- /dev/null +++ b/modular_darkpack/modules/blood_drinking/code/combat_bite.dm @@ -0,0 +1,67 @@ +// Thanks to @hex37 for most of this +/** + * Biting for purposes other than drinking blood + * + * Arguments: + * * pulling - The mob we're biting + * * damage_type - What kind of damage we're doing as a list. If blank, grabs from vars. (ex. list(BRUTE = 0, BURN = 0, TOX = 0, OXY = 0, AGGRAVATED = 0)) + */ +/mob/living/carbon/proc/combat_bite(list/damage_types) + if(!COOLDOWN_FINISHED(src, drinkblood_use_cd) || !COOLDOWN_FINISHED(src, drinkblood_click_cd)) + return + COOLDOWN_START(src, drinkblood_click_cd, 1 SECONDS) + if(!damage_types) + damage_types = combat_bite_damages + if(grab_state > GRAB_PASSIVE) + if(isliving(pulling)) + var/mob/living/bit_living = pulling + visible_message(span_warning("[src] starts biting [bit_living] with [p_their()] sharp teeth!"), span_warning("You start biting [bit_living] with your sharp teeth!"), span_warning("You hear the sound of flesh tearing!")) + bit_living.emote("scream") + if(ishuman(bit_living)) + var/mob/living/carbon/human/bit_human = bit_living + bit_human.add_bite_animation() + + var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) + if(!skipface) + do_combat_bite(bit_living, damage_types, TRUE) + +/mob/living/carbon/proc/do_combat_bite(mob/living/chewed_on, list/damage_types, first_bite = FALSE) + + COOLDOWN_START(src, drinkblood_use_cd, 3 SECONDS) + + if(isnpc(chewed_on)) + var/mob/living/carbon/human/npc/NPC = chewed_on + NPC.danger_source = null + chewed_on.Stun(10) // NPCs can't resist right away + + if(chewed_on.health < (values_sum(damage_types)*1.5)) + to_chat(src, span_userdanger("Your victim is near death.")) + + if(!do_after(src, 2 SECONDS, target = chewed_on, timed_action_flags = NONE, progress = FALSE)) + stop_chewing(chewed_on) + return + + if(iscarbon(chewed_on)) + var/mob/living/carbon/chewtoy = chewed_on + var/datum/storyteller_roll/roll_datum = new /datum/storyteller_roll/damage/bite + roll_datum.difficulty = combat_bite_difficulty + var/roll_result = roll_datum.st_roll(src, chewtoy)+1 + if(roll_result) + for(var/damage_type, damage_amount in damage_types) + if(roll_result > 0) + chewtoy.apply_damage((damage_amount*roll_result), damage_type, sharpness = SHARP_POINTY) + playsound(get_turf(src), 'sound/items/weapons/bite.ogg', 50, TRUE) + + if(chewtoy.reagents) // We might ingest some blood on accident + if(length(chewtoy.reagents.reagent_list)) + if(prob(15)) // We might ingest some blood on accident + chewtoy.reagents.trans_to(src, min(10, chewtoy.reagents.total_volume), transferred_by = chewed_on, methods = INGEST) + + if(grab_state > GRAB_PASSIVE) + stop_sound_channel(CHANNEL_BLOOD) + do_combat_bite(chewed_on, damage_types) + +/mob/living/carbon/proc/stop_chewing() + stop_sound_channel(CHANNEL_BLOOD) + COOLDOWN_RESET(src, drinkblood_use_cd) + return diff --git a/modular_darkpack/modules/blood_drinking/code/movable_screens/drinkblood_hud.dm b/modular_darkpack/modules/blood_drinking/code/movable_screens/drinkblood_hud.dm index 594c1e6205b8..78ce63ff6242 100644 --- a/modular_darkpack/modules/blood_drinking/code/movable_screens/drinkblood_hud.dm +++ b/modular_darkpack/modules/blood_drinking/code/movable_screens/drinkblood_hud.dm @@ -10,4 +10,7 @@ /atom/movable/screen/drinkblood/proc/bite() if(ishuman(usr)) var/mob/living/carbon/human/human_user = usr - human_user.vamp_bite() + if(HAS_TRAIT(human_user, TRAIT_COMBAT_BITE)) + human_user.combat_bite() + else + human_user.vamp_bite() diff --git a/modular_darkpack/modules/fomori/icons/fomori_abilities.dmi b/modular_darkpack/modules/fomori/icons/fomori_abilities.dmi index 73941e717927b1b0fdfb6bbe1a5136dbcf1a55cc..81a704e13e05e9f95fc00a94ab0764f057dbb6c2 100644 GIT binary patch literal 4901 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 Xv>yEuYfbs@g#l=&=qgt|!i4=lOS_+i diff --git a/tgstation.dme b/tgstation.dme index f540382a5c1d..f3ffddfa7318 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7098,6 +7098,7 @@ #include "modular_darkpack\modules\bitcoinminer\code\bitcoinminer.dm" #include "modular_darkpack\modules\blood_drinking\code\bite_helper_procs.dm" #include "modular_darkpack\modules\blood_drinking\code\bite_keybinding.dm" +#include "modular_darkpack\modules\blood_drinking\code\combat_bite.dm" #include "modular_darkpack\modules\blood_drinking\code\drinksomeblood.dm" #include "modular_darkpack\modules\blood_drinking\code\vamp_bite.dm" #include "modular_darkpack\modules\blood_drinking\code\kiss_status_effect\status_effect_kiss.dm" From c74ef5f1359a7278250b3289aeb788dcbcc7e735 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Sun, 3 May 2026 19:13:12 -0400 Subject: [PATCH 12/35] horns 0.1 --- .../modules/fomori/code/powers/horns.dm | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/modular_darkpack/modules/fomori/code/powers/horns.dm b/modular_darkpack/modules/fomori/code/powers/horns.dm index 56e2d293b808..022617843703 100644 --- a/modular_darkpack/modules/fomori/code/powers/horns.dm +++ b/modular_darkpack/modules/fomori/code/powers/horns.dm @@ -6,5 +6,19 @@ var/deployed = FALSE +/datum/action/cooldown/power/fomori_power/horns/Grant() + . = ..() + /datum/action/cooldown/power/fomori_power/horns/Activate(atom/target) . = ..() + var/mob/living/carbon/carbon_owner = astype(owner, /mob/living/carbon) + + if(deployed) + deployed = FALSE + carbon_owner.remove_overlay(MUTATIONS_LAYER) + else + deployed = TRUE + carbon_owner.remove_overlay(MUTATIONS_LAYER) + var/mutable_appearance/fomor_overlay = mutable_appearance('modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi', "horns", -MUTATIONS_LAYER) + carbon_owner.overlays_standing[MUTATIONS_LAYER] = fomor_overlay + carbon_owner.apply_overlay(MUTATIONS_LAYER) From 54bd8792590fe64a9141c8f792f7e07cb102aadd Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Sun, 3 May 2026 19:31:12 -0400 Subject: [PATCH 13/35] fangs 0.1 --- .../modules/fomori/code/powers/fangs.dm | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/modular_darkpack/modules/fomori/code/powers/fangs.dm b/modular_darkpack/modules/fomori/code/powers/fangs.dm index 0428e62c35dc..54da508f8546 100644 --- a/modular_darkpack/modules/fomori/code/powers/fangs.dm +++ b/modular_darkpack/modules/fomori/code/powers/fangs.dm @@ -8,3 +8,20 @@ /datum/action/cooldown/power/fomori_power/fangs/Activate(atom/target) . = ..() + var/mob/living/carbon/carbon_owner = astype(owner, /mob/living/carbon) + + if(deployed) + REMOVE_TRAITS_IN(owner, "fomor_fangs") + deployed = FALSE + carbon_owner.remove_overlay(MUTATIONS_LAYER) + carbon_owner.combat_bite_damages = carbon_owner::combat_bite_damages + else + ADD_TRAIT(owner, TRAIT_COMBAT_BITE, "fomor_fangs") + ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, "fomor_fangs") + deployed = TRUE + carbon_owner.combat_bite_damages = list(BRUTE = 0, BURN = 0, TOX = 0, OXY = 0, AGGRAVATED = 1 TTRPG_DAMAGE) + carbon_owner.remove_overlay(MUTATIONS_LAYER) + var/mutable_appearance/fomor_overlay = mutable_appearance('modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi', "fangs", -MUTATIONS_LAYER) + fomor_overlay.pixel_z = -1 + carbon_owner.overlays_standing[MUTATIONS_LAYER] = fomor_overlay + carbon_owner.apply_overlay(MUTATIONS_LAYER) From 01dd5a468c8dd9adcaef51eb83a9954c5d6d9c74 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Mon, 4 May 2026 00:23:52 -0400 Subject: [PATCH 14/35] some weapon power refactoring/fixes --- .../fomori/code/powers/_fomori_power.dm | 42 +++++++++++++++++++ .../code/powers/_fomori_power_weapon.dm | 11 +++-- .../modules/fomori/code/powers/body_barbs.dm | 16 ++++--- .../modules/fomori/code/powers/claws.dm | 20 ++++----- 4 files changed, 61 insertions(+), 28 deletions(-) diff --git a/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm b/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm index aba47ffdc43a..d30d0179600c 100644 --- a/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm +++ b/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm @@ -10,7 +10,49 @@ check_flags = AB_CHECK_IMMOBILE|AB_CHECK_CONSCIOUS + // Snowflake toggle behavior + var/deployed = FALSE + + // Body feature for horns, fangs, etc. + var/datum/bodypart_overlay/simple/fomor_part + // What bodypart are we putting our feature on? + var/feature_bodypart = BODY_ZONE_HEAD + /atom/movable/screen/alert/status_effect/fomori_power icon = 'modular_darkpack/modules/fomori/icons/fomori_abilities.dmi' icon_state = "bg_fomori_power" overlay_icon = 'modular_darkpack/modules/fomori/icons/fomori_abilities.dmi' + + +///checks if we lose a limb a feature is attached to +/datum/action/cooldown/power/fomori_power/proc/on_removed_limb(datum/source, obj/item/bodypart/removed_limb, special, dismembered) + SIGNAL_HANDLER + + var/mob/living/carbon/human/carbon_owner = astype(owner, /mob/living/carbon) + var/obj/item/bodypart/bodypart = carbon_owner.get_bodypart(feature_bodypart) + + if(fomor_part && istype(removed_limb, bodypart.type)) + remove_feature() + +///for adding fomor features i.e. fangs, horns +/datum/action/cooldown/power/fomori_power/proc/add_feature() + var/mob/living/carbon/human/fomor = owner + var/obj/item/bodypart/bodypart = fomor?.get_bodypart(feature_bodypart) + if(isnull(bodypart)) + return + fomor_part = new() //creates our overlay + bodypart.add_bodypart_overlay(fomor_part) + +///removes the fomor feature +/datum/action/cooldown/power/fomori_power/proc/remove_feature() + var/mob/living/carbon/human/fomor = owner + var/obj/item/bodypart/bodypart = fomor?.get_bodypart(feature_bodypart) + bodypart?.remove_bodypart_overlay(fomor_part) + QDEL_NULL(fomor_part) + +///toggles the feature, TRUE for remove and FALSE for add +/datum/action/cooldown/power/fomori_power/proc/toggle_feature(current_state) + if(current_state) + remove_feature() + else + add_feature() diff --git a/modular_darkpack/modules/fomori/code/powers/_fomori_power_weapon.dm b/modular_darkpack/modules/fomori/code/powers/_fomori_power_weapon.dm index 48036bcb3ecc..0d32009f9f46 100644 --- a/modular_darkpack/modules/fomori/code/powers/_fomori_power_weapon.dm +++ b/modular_darkpack/modules/fomori/code/powers/_fomori_power_weapon.dm @@ -3,10 +3,8 @@ desc = "Report on github if you see this!" cooldown_time = 1 TURNS // Can't sheathe/unsheathe for at least 5 seconds after use + shared_cooldown = MOB_SHARED_COOLDOWN_2 - var/deployed = FALSE // Do we have them out already? - - var/draw_text var/sheathe_text = "Your skub melts back into your skin." var/weapon_type = /obj/item/skub @@ -14,7 +12,6 @@ var/sheathe_sound = 'sound/effects/meatslap.ogg' /datum/action/cooldown/power/fomori_power/weapon/Activate(atom/target) - . = ..() var/obj/item/held = owner.get_active_held_item() var/obj/item/off_held = owner.get_inactive_held_item() if(held && off_held && deployed) @@ -26,10 +23,12 @@ if(held && !owner.dropItemToGround(held)) owner.balloon_alert(owner, "hand occupied!") - return + return FALSE else if(off_held && !owner.dropItemToGround(off_held)) owner.balloon_alert(owner, "off-hand occupied!") - return + return FALSE + + . = ..() var/obj/item/weapon = new weapon_type(owner) var/obj/item/weapon_offhand = new weapon_type(owner) diff --git a/modular_darkpack/modules/fomori/code/powers/body_barbs.dm b/modular_darkpack/modules/fomori/code/powers/body_barbs.dm index 576293474cfd..ad12254942dd 100644 --- a/modular_darkpack/modules/fomori/code/powers/body_barbs.dm +++ b/modular_darkpack/modules/fomori/code/powers/body_barbs.dm @@ -21,18 +21,14 @@ wound_bonus = 10 exposed_wound_bonus = 10 armour_penetration = 35 - var/can_drop = FALSE - var/fake = FALSE var/list/alt_continuous = list("stabs", "pierces", "impales") var/list/alt_simple = list("stab", "pierce", "impale") abstract_type = /obj/item/melee/body_barbs -/obj/item/melee/body_barbs/Initialize(mapload,silent,synthetic) // Largely copied from changeling armblade +/obj/item/melee/body_barbs/Initialize(mapload,silent) // Largely copied from changeling armblade . = ..() - ADD_TRAIT(src, TRAIT_NODROP, "body_barbs") - if(synthetic) - can_drop = TRUE + ADD_TRAIT(src, TRAIT_NODROP, INNATE_TRAIT) alt_continuous = string_list(alt_continuous) alt_simple = string_list(alt_simple) AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple, -5) @@ -47,12 +43,14 @@ button_icon_state = "body_barbs" rank = 1 // of 10 // Determines how many extra dice we get weapon_type = /obj/item/melee/body_barbs + sheathe_text = "Your body barbs retract into your arms." /datum/action/cooldown/power/fomori_power/weapon/body_barbs/Activate(atom/target) . = ..() - owner.visible_message(span_warning("A pair of grotesque barbs extend from [owner]\'s arms!"), \ - span_warning("Your body barbs extend from your arms."), \ - span_hear("You hear organic matter ripping and tearing!")) + if(deployed) + owner.visible_message(span_warning("A pair of grotesque barbs extend from [owner]\'s arms!"), \ + span_warning("Your body barbs extend from your arms."), \ + span_hear("You hear organic matter ripping and tearing!")) /datum/action/cooldown/power/fomori_power/weapon/body_barbs/two rank = 2 diff --git a/modular_darkpack/modules/fomori/code/powers/claws.dm b/modular_darkpack/modules/fomori/code/powers/claws.dm index 3a4603da8141..e1ae7d57dab5 100644 --- a/modular_darkpack/modules/fomori/code/powers/claws.dm +++ b/modular_darkpack/modules/fomori/code/powers/claws.dm @@ -14,18 +14,10 @@ abstract_type = /obj/item/knife/fomor_claws -/obj/item/melee/body_barbs/Initialize(mapload,silent,synthetic) // Largely copied from changeling armblade +/obj/item/knife/fomor_claws/Initialize(mapload,silent) // Largely copied from changeling armblade . = ..() - ADD_TRAIT(src, TRAIT_NODROP, "fomor_claws") - if(synthetic) - can_drop = TRUE - alt_continuous = string_list(alt_continuous) - alt_simple = string_list(alt_simple) + ADD_TRAIT(src, TRAIT_NODROP, INNATE_TRAIT) AddComponent(/datum/component/alternative_sharpness, SHARP_POINTY, alt_continuous, alt_simple, -5) - AddComponent(/datum/component/butchering, \ - speed = 6 SECONDS, \ - effectiveness = 80, \ - ) /datum/action/cooldown/power/fomori_power/weapon/claws name = "Claws" @@ -34,9 +26,11 @@ rank = 1 // of 1 weapon_type = /obj/item/knife/fomor_claws unsheathe_sound = 'sound/items/weapons/parry.ogg' + sheathe_text = "Your claws retract into your arms." /datum/action/cooldown/power/fomori_power/weapon/claws/Activate(atom/target) . = ..() - owner.visible_message(span_warning("A pair of grotesque claws extend from [owner]\'s hands!"), \ - span_warning("Your claws extend from your hands."), \ - span_hear("You hear organic matter ripping and tearing!")) + if(deployed) + owner.visible_message(span_warning("A pair of grotesque claws extend from [owner]\'s hands!"), \ + span_warning("Your claws extend from your hands."), \ + span_hear("You hear organic matter ripping and tearing!")) From d02064d011e5155269db686b0ef643d9d609fefc Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Mon, 4 May 2026 00:24:05 -0400 Subject: [PATCH 15/35] i can't get bodypart_overlays to work --- .../modules/fomori/code/powers/horns.dm | 16 +++++++--------- 1 file changed, 7 insertions(+), 9 deletions(-) diff --git a/modular_darkpack/modules/fomori/code/powers/horns.dm b/modular_darkpack/modules/fomori/code/powers/horns.dm index 022617843703..9b9ec0ca3a2b 100644 --- a/modular_darkpack/modules/fomori/code/powers/horns.dm +++ b/modular_darkpack/modules/fomori/code/powers/horns.dm @@ -1,24 +1,22 @@ +/datum/bodypart_overlay/simple/fomor_horns + icon_state = "horns" + icon = 'modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi' + layers = MUTATIONS_LAYER + /datum/action/cooldown/power/fomori_power/horns name = "Horns" desc = "(UNIMPLEMENTED) Use the grotesque horns atop your head to gore your enemies." button_icon_state = "horns" rank = 1 // of 1 - var/deployed = FALSE - -/datum/action/cooldown/power/fomori_power/horns/Grant() - . = ..() + fomor_part = /datum/bodypart_overlay/simple/fomor_horns /datum/action/cooldown/power/fomori_power/horns/Activate(atom/target) . = ..() var/mob/living/carbon/carbon_owner = astype(owner, /mob/living/carbon) + toggle_feature(deployed) if(deployed) deployed = FALSE - carbon_owner.remove_overlay(MUTATIONS_LAYER) else deployed = TRUE - carbon_owner.remove_overlay(MUTATIONS_LAYER) - var/mutable_appearance/fomor_overlay = mutable_appearance('modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi', "horns", -MUTATIONS_LAYER) - carbon_owner.overlays_standing[MUTATIONS_LAYER] = fomor_overlay - carbon_owner.apply_overlay(MUTATIONS_LAYER) From 7c762ce77480082e5dfbe4470f97e7a979d14fe5 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Mon, 4 May 2026 17:28:16 -0400 Subject: [PATCH 16/35] apperances work --- .../modules/fomori/code/powers/_fomori_power.dm | 3 ++- .../modules/fomori/code/powers/fangs.dm | 14 +++++++------- 2 files changed, 9 insertions(+), 8 deletions(-) diff --git a/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm b/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm index d30d0179600c..bd569a7c60ee 100644 --- a/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm +++ b/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm @@ -40,7 +40,7 @@ var/obj/item/bodypart/bodypart = fomor?.get_bodypart(feature_bodypart) if(isnull(bodypart)) return - fomor_part = new() //creates our overlay + fomor_part = new fomor_part() //creates our overlay bodypart.add_bodypart_overlay(fomor_part) ///removes the fomor feature @@ -54,5 +54,6 @@ /datum/action/cooldown/power/fomori_power/proc/toggle_feature(current_state) if(current_state) remove_feature() + fomor_part = initial(fomor_part) else add_feature() diff --git a/modular_darkpack/modules/fomori/code/powers/fangs.dm b/modular_darkpack/modules/fomori/code/powers/fangs.dm index 54da508f8546..d787da285f1e 100644 --- a/modular_darkpack/modules/fomori/code/powers/fangs.dm +++ b/modular_darkpack/modules/fomori/code/powers/fangs.dm @@ -1,27 +1,27 @@ +/datum/bodypart_overlay/simple/fomor_fangs + icon_state = "fangs" + icon = 'modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi' + layers = LOW_FACEMASK_LAYER + /datum/action/cooldown/power/fomori_power/fangs name = "Fangs" desc = "(UNIMPLEMENTED) Use the grotesque fangs spilling from your mouth to bite your enemies." button_icon_state = "fangs" rank = 1 // of 1 - var/deployed = FALSE + fomor_part = /datum/bodypart_overlay/simple/fomor_fangs /datum/action/cooldown/power/fomori_power/fangs/Activate(atom/target) . = ..() var/mob/living/carbon/carbon_owner = astype(owner, /mob/living/carbon) + toggle_feature(deployed) if(deployed) REMOVE_TRAITS_IN(owner, "fomor_fangs") deployed = FALSE - carbon_owner.remove_overlay(MUTATIONS_LAYER) carbon_owner.combat_bite_damages = carbon_owner::combat_bite_damages else ADD_TRAIT(owner, TRAIT_COMBAT_BITE, "fomor_fangs") ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, "fomor_fangs") deployed = TRUE carbon_owner.combat_bite_damages = list(BRUTE = 0, BURN = 0, TOX = 0, OXY = 0, AGGRAVATED = 1 TTRPG_DAMAGE) - carbon_owner.remove_overlay(MUTATIONS_LAYER) - var/mutable_appearance/fomor_overlay = mutable_appearance('modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi', "fangs", -MUTATIONS_LAYER) - fomor_overlay.pixel_z = -1 - carbon_owner.overlays_standing[MUTATIONS_LAYER] = fomor_overlay - carbon_owner.apply_overlay(MUTATIONS_LAYER) From e8b96e457871a0a86faa3655261b5a06997fb046 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Mon, 4 May 2026 17:28:21 -0400 Subject: [PATCH 17/35] sprite edits --- .../fomori/icons/fomori_inhand_left.dmi | Bin 549 -> 510 bytes .../fomori/icons/fomori_inhand_right.dmi | Bin 580 -> 523 bytes .../icons/fomori_sprite_accessories.dmi | Bin 1730 -> 1692 bytes 3 files changed, 0 insertions(+), 0 deletions(-) diff --git a/modular_darkpack/modules/fomori/icons/fomori_inhand_left.dmi b/modular_darkpack/modules/fomori/icons/fomori_inhand_left.dmi index 0f51d4991ccebd56cc164bdd49e36367d2ce6db9..805605e6f62074b205357f1b8b66d2b8cb87d247 100644 GIT binary patch delta 312 zcmV-80muHO1pWh%Bmp6jB_apFz`!-7x#f{sk$(zFL_t(oh3%HV4uUWchYL}_4H6%K zI5-m*R%3$BzJapfNE}Gqn81;Z*EONNrj*v4F(w-CTdr5`}SFXQaT=hSxks3SKJ&*iE)))W~CqQtW9fpO!+?x}l*913O z^E*W=P)sPQ9VoOO@wl?uv{kyg7^|5wQ-D*FlO{atfYgL zqE;H24$l|~kPdc&T0LB4I@q~ry)6|ag(22g#wqnBw4P4?H+TTSIwL~}nX@GT0000< KMNUMnLSTaO0f`p? delta 351 zcmV-l0igc=1EmCzBmpgvB_b2EiHHCH|Jt;&@7dVEz`%6=M-h=uk$)vgL_t(og=1hC z1*2dn0zm}`&1gWR2G=C01|#CsGrAUmY1Tj|A~l$oC4d=;L~39#Z-dZD3PfsPYlmte zQauC1bO=>Is)kCUHB5j|oJ4DAfKVK?(*X4?JJA|O!6+C7BN@P|6QY4DMj6b7S3Rsc zK~ld9zXn)!0vC|l4S!|v*a%?L0jo}6fT?yjRNWaLtQ7#PI)MR>qATuT2D^wG_8Mb4 zng%98HHb-qN?6sSYhdSSZ-ZLhfnCD{bb+=8R2m&%2$w-=HXM~6hK2$R1`hdAFbYP& zC?E&muN|=1U?2(H=+tnE>A}E;eH2!8j^)v&(F#m+(;`x}E7xMtm zAA<0V#y-S_aG96gmEM>g@o$T8l9#=et2L}_gbL8f1#7X@1)1XWAc`;eTRoQ-LVzeQ zl7ERFlR~QyPG*A?imD_iLa-6_MZq>35#UHlc#eEN!Y~Z;RXi+oi8FHRK#avvK+Mav zNU(gj9^!)K^wC`^oB<(ZXLOg^8FkxI^Z6L|=pZA5y`O~S4rDHO&O2}71}DaUR%W0C`mDITVPB*D^d zfK>y7AWQ>`doi*G_7?2w85rRmTl;V8V8jz@!|k^s5}MkNtE8ayf*&`Mf%+_eGNJP%B0LLym$70q_0>tEaoG->UxD zY<9sQ{g8C}t&gYPs+#V4-nRpgg4pSw5`+Qukqx$utLq9>umFE(Ff4681`;BhvM^A4 z@Q@9m8E#-Xp@jz6jHb8)4H>Q$QxFAhgkCu0+o*>lmcT(aacr*ir-AJ&BWMur2&WL? z6pUTe!LW%sL&_{Wf<{;#wH(8e3`1KG#+Ia@h6Ro~WgkeS451*lZdmrL9FmX4ZCoxA z6+3!EC45_KbPIoBbPEQvSP}{cA$75^4G-X!+U4`KS0kYjnP9>c+3B^k(_2&Ra$l*h z!qhv|w9pC9360^j@jG zd3-KHyFz&As5TO)tWi9RXd{RDjb1mHYfWWX(hHnngI|9>&sUyRD+g5RMZ$4$>-xN5 zeR<$yt+q}?=O?9%XYW21wJXd>Wne?tCLcpB++cUT93=eUCxCA!4~mM_N58`c3voBX zizyT4aV07%;RNxTkbd~=ucyhQN#O&Xgs`|IVk=C@NU*)i92!{wwd_7@tW|5$?+dwn}>x*k^ZnZnCN!>>ntr<}0HOBv?54lR z!Uz3*=>x!Im@IAVhv9l9Ve^!8LP-9(IqaKX6cy&72$GVcMLl89XeNw`H$Zv9*yCHZi%5tQNh1N)FP>hy1I)g!5!!#{l*K;R6QYNbCE|fPDJpiro@;Ro zdi2C^ax|Oe3*jg=p6NmVND&g5NXt?jt;WYwP^NSQ4#pzav4c*r7*HDFoLiol> z{?xjw^*^L|&$vh`(22@tx|2nX-&xy}d@PtVli0gVYNh*r30NM6)&$1~}udtEE^fiCQM&E0Gqtk6CC(1qac5_cl!eTJlXBFs# zRB9pc1M{2V(CjguMxD9JZzAm;1LCE!E;@_}Sm8LWWZP z)u3@`o5h|FerpPpeIc&Q!I}Z0bB<@ zQZ1?eYGEg>dzNBPA++1Ynt1f*coTnzHEr%FmZttJdCA9v^pS2S)OJk`&mwurkcvqI z4-i2G+SdYJhB4x}$O&1koq8M9MZ5}rzEa+Ynf{E6eba40=<$k%)$k))0+I6tOdaQ{uP5;7t!r8X9^)bUK@jY;5*`ErCgl7`_s~#MX#H_JADDBT zI-#zfw*d#H9y0sTE?vaAcm-RBFZ6orqQ3$~-Djl^uLOE}lmC{`I9>0Y1xyi;7l2+6 kUo2tvzkoV)cq#k~HM6q)pBWCadH?_b07*qoM6N<$g0x1r`2YX_ delta 1468 zcmV;t1w;Cr4Z;nu83BKkNkl5jn7@nEct{R&LeYFWat!CU3+RLuwgr&Vm z&i()=W@AdBY#O?TLLk0a?Jd|8_Siy5>CI4jNiVtd(qQNh=pm<22!TNF{S6(hq|y71 zKAhBshN1^s);sggGw;kuGtZ1nND6AFKP4z9%m+5HZJ1q`fWdzQ!h&IGi!q@guo({n zTtb9=NSfgWmJ?c_f{kbj3$T#GY}o{v&_?KmL$L`;II;^IU{l8ys5}d7AJw2ih9iRl zgi~T{fdYn2aSIu@?1(hN@|fiqmSPy%k}$Ru1v4z-;3oToMyLve*t%ia+hvtvEN|no zlb9UQ8<_ANInaMCgwZWB*p3yU43MND7PjFLatjyvGA-3eXhbG4$rRY>wY1Y)6BoIM z@~bfQ0yQ2w;TfSZoK}B_4jnqIK+l`dc;g8>bof62%H0fnbQV4~si@7%L7n3(6E5d^ z($|M)BD5=n`wq5&K;@0%S?)G+nBVDngPG>4wk5s588&~!<%_)Mc{OvuP$?RYi(A(h z4gD(uC-b^;Bnv+(WjufHSmrJvBU2k2$~VNA)WQw6R^36v4}T%#`^o(xWBKtPWSxhw z7!^g6Dfa~0m6dRUctyxQI(hLpc{nLzV3Ux{FUY+WB;+L_Y3{>p!05^3@M(W=M>Q&Z zLKdGoC=P$B_JY(MISs>1{oZ&*_|xR@&u`8BA|m?e@#Wd>Z3hw>*Go;m*|Y&+_Vw(h zzr(}({aqCUA(LUUuwfjA>y?DfP0k5P^7qYQ-~6h`F!$vqDLI(e6ZVW|!l;-5`rGnX z5iF>#`9d8P8CQut z)Aljo)sxTUXjn(cdVwMoquz)KRTHuLdhLMF5aW76H;9V+oe|rv^C?L{lMP;-k5`0( zE5a|x#n&Kowrbx!XTw*7d*mWKgm5eKzY&AYsu!0ffs5nC$}q`#00^B=D&F9+k>S>z zCuo1E>o+0cXBGD;be`7kt#Rra+~N&+yoD82%8)6XNzn#jDu1{#0U*AyFjzj;Pyn@&!YN9b+kk(Pu-Wva|F z&bRdh+2hRo{e)4N9cz9`R^#@LfOl7Xsif4k~cLn_+W3rHi%jhs2|}7 zc^Le53=_<6?i6DSjuU8cjlCZp$OS>=$Q22%YfkXN-KQvJ`>uM@b;9&CVEXVu1kQg2 zBK;J@@!y@mac4{NwvtTcae|?)=0QR*AwG1V_6{QKP00Fw+tK`D_tv~6TRw)L|AiGY zDb-&M`sQp`S2Gv~WcE@k(;9)f*lXpJ>!6ACSgHPMapB>Q?Szs65sH8vHF>6393TN) z2Qk8yQh&9ulh!dyv4aThcCjX3{TY88#9@uk7s%4opQSE&eI$LQ+X=N%!`rh+T{5I% z(ts62qyp`0fhe~za=FL}d99sB8`bT25q`Z?-iMj~jEiy8ZAs{fiiXwjGw1@E2}2`p zuqCFgpAA=-pX$+}!<&zazB?<_vYz31_0x>?YSLqDE|HX2m#hBsHo}u?lIDMZ1&N)3 zBz)Eu;Ip}&G`NdH6zDuLT>_I9!nGG%%TD- Date: Mon, 4 May 2026 17:48:10 -0400 Subject: [PATCH 18/35] layerswap --- modular_darkpack/modules/fomori/code/powers/fangs.dm | 2 +- modular_darkpack/modules/fomori/code/powers/horns.dm | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_darkpack/modules/fomori/code/powers/fangs.dm b/modular_darkpack/modules/fomori/code/powers/fangs.dm index d787da285f1e..f72f51252199 100644 --- a/modular_darkpack/modules/fomori/code/powers/fangs.dm +++ b/modular_darkpack/modules/fomori/code/powers/fangs.dm @@ -1,7 +1,7 @@ /datum/bodypart_overlay/simple/fomor_fangs icon_state = "fangs" icon = 'modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi' - layers = LOW_FACEMASK_LAYER + layers = MUTATIONS_LAYER /datum/action/cooldown/power/fomori_power/fangs name = "Fangs" diff --git a/modular_darkpack/modules/fomori/code/powers/horns.dm b/modular_darkpack/modules/fomori/code/powers/horns.dm index 9b9ec0ca3a2b..a553ab0805af 100644 --- a/modular_darkpack/modules/fomori/code/powers/horns.dm +++ b/modular_darkpack/modules/fomori/code/powers/horns.dm @@ -1,7 +1,7 @@ /datum/bodypart_overlay/simple/fomor_horns icon_state = "horns" icon = 'modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi' - layers = MUTATIONS_LAYER + layers = LOW_FACEMASK_LAYER /datum/action/cooldown/power/fomori_power/horns name = "Horns" From 92a30806d23215f6758774fc93411298f29cc9ce Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Mon, 4 May 2026 18:17:22 -0400 Subject: [PATCH 19/35] fangs are done --- modular_darkpack/modules/fomori/code/powers/fangs.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modular_darkpack/modules/fomori/code/powers/fangs.dm b/modular_darkpack/modules/fomori/code/powers/fangs.dm index f72f51252199..14b25bbf8772 100644 --- a/modular_darkpack/modules/fomori/code/powers/fangs.dm +++ b/modular_darkpack/modules/fomori/code/powers/fangs.dm @@ -3,9 +3,12 @@ icon = 'modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi' layers = MUTATIONS_LAYER +/datum/bodypart_overlay/simple/fomor_fangs/can_draw_on_bodypart(obj/item/bodypart/bodypart_owner, mob/living/carbon/owner, is_husked = FALSE) + return ..() && !(bodypart_owner.owner?.obscured_slots & HIDEFACE) + /datum/action/cooldown/power/fomori_power/fangs name = "Fangs" - desc = "(UNIMPLEMENTED) Use the grotesque fangs spilling from your mouth to bite your enemies." + desc = "Use the grotesque fangs spilling from your mouth to bite your enemies." button_icon_state = "fangs" rank = 1 // of 1 From 8de47057218ce659a58d174bd26a838eabfcbdc9 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Mon, 4 May 2026 18:20:03 -0400 Subject: [PATCH 20/35] hopefully this doesn't break everything --- .../modules/blood_drinking/code/combat_bite.dm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/modular_darkpack/modules/blood_drinking/code/combat_bite.dm b/modular_darkpack/modules/blood_drinking/code/combat_bite.dm index 95e604e70817..90617c081681 100644 --- a/modular_darkpack/modules/blood_drinking/code/combat_bite.dm +++ b/modular_darkpack/modules/blood_drinking/code/combat_bite.dm @@ -12,6 +12,11 @@ COOLDOWN_START(src, drinkblood_click_cd, 1 SECONDS) if(!damage_types) damage_types = combat_bite_damages + var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) + if(skipface) + to_chat(src, span_warning("Take your mask off first!")) + return + if(grab_state > GRAB_PASSIVE) if(isliving(pulling)) var/mob/living/bit_living = pulling @@ -21,9 +26,7 @@ var/mob/living/carbon/human/bit_human = bit_living bit_human.add_bite_animation() - var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if(!skipface) - do_combat_bite(bit_living, damage_types, TRUE) + do_combat_bite(bit_living, damage_types, TRUE) /mob/living/carbon/proc/do_combat_bite(mob/living/chewed_on, list/damage_types, first_bite = FALSE) From 19952c510d924cd8f29abf24e5b0f1cc1629ce7b Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Mon, 4 May 2026 18:28:19 -0400 Subject: [PATCH 21/35] syntax --- .../modules/blood_drinking/code/combat_bite.dm | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/modular_darkpack/modules/blood_drinking/code/combat_bite.dm b/modular_darkpack/modules/blood_drinking/code/combat_bite.dm index 90617c081681..8b6cc4fb605a 100644 --- a/modular_darkpack/modules/blood_drinking/code/combat_bite.dm +++ b/modular_darkpack/modules/blood_drinking/code/combat_bite.dm @@ -12,10 +12,11 @@ COOLDOWN_START(src, drinkblood_click_cd, 1 SECONDS) if(!damage_types) damage_types = combat_bite_damages + var/skipface = (wear_mask && (wear_mask.flags_inv & HIDEFACE)) || (head && (head.flags_inv & HIDEFACE)) - if(skipface) - to_chat(src, span_warning("Take your mask off first!")) - return + if(skipface) + to_chat(src, span_warning("Take your mask off first!")) + return if(grab_state > GRAB_PASSIVE) if(isliving(pulling)) From fd74f9b98d292d20b69fdd8a38d3c1612a4edf80 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Mon, 4 May 2026 18:29:42 -0400 Subject: [PATCH 22/35] oh for sure --- modular_darkpack/modules/fomori/README.md | 25 +++++++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 modular_darkpack/modules/fomori/README.md diff --git a/modular_darkpack/modules/fomori/README.md b/modular_darkpack/modules/fomori/README.md new file mode 100644 index 000000000000..9e44cf8cd034 --- /dev/null +++ b/modular_darkpack/modules/fomori/README.md @@ -0,0 +1,25 @@ +https://github.com/DarkPack13/SecondCity/pull/953 + +## \ + +Module ID: FOMORI + +### Description: + +This module handles everything related to Fomori and their Powers, Taints, and Merits/Flaws. Dependent on BLOOD_DRINKING for the Combat Bite code. + +### TG Proc/File Changes: + +### Modular Overrides: + +### Defines: + +- N/A + +### Included files that are not contained in this module: + +- modular_darkpack/modules/blood_drinking/code/combat_bite.dm + +### Credits: + +dwinters99, Major00, Minzeyes ((BLOCK PR IF THIS WARNING IS STILL HERE)) From a92030bdf704dacb82e2ef0dcd835c9067e5a2f5 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Mon, 4 May 2026 18:36:11 -0400 Subject: [PATCH 23/35] credite --- modular_darkpack/modules/fomori/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_darkpack/modules/fomori/README.md b/modular_darkpack/modules/fomori/README.md index 9e44cf8cd034..6ae3af134bb6 100644 --- a/modular_darkpack/modules/fomori/README.md +++ b/modular_darkpack/modules/fomori/README.md @@ -22,4 +22,4 @@ This module handles everything related to Fomori and their Powers, Taints, and M ### Credits: -dwinters99, Major00, Minzeyes ((BLOCK PR IF THIS WARNING IS STILL HERE)) +dwinters99 (code), Major00 (sprites), Minzeyes (sprites) ((BLOCK PR IF THIS WARNING IS STILL HERE)), FalloutFallcon (troubleshooting) From 8c33b257f4ebf03fd05c378c32c8f1823e767a78 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Mon, 4 May 2026 18:49:34 -0400 Subject: [PATCH 24/35] credite? --- modular_darkpack/modules/fomori/README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_darkpack/modules/fomori/README.md b/modular_darkpack/modules/fomori/README.md index 6ae3af134bb6..2dac2a5c9c9c 100644 --- a/modular_darkpack/modules/fomori/README.md +++ b/modular_darkpack/modules/fomori/README.md @@ -22,4 +22,4 @@ This module handles everything related to Fomori and their Powers, Taints, and M ### Credits: -dwinters99 (code), Major00 (sprites), Minzeyes (sprites) ((BLOCK PR IF THIS WARNING IS STILL HERE)), FalloutFallcon (troubleshooting) +dwinters99 (code), Major00 (sprites), Minzeyes (sprites) ((BLOCK PR IF THIS WARNING IS STILL HERE)), FalloutFallcon (troubleshooting), Chazzyjazzy (for gargoyle wings), hex37 (for blood-drinking code) From c6eae1672e087863bd60e414c35d4555253cb318 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Mon, 4 May 2026 18:49:54 -0400 Subject: [PATCH 25/35] fomorgans --- .../modules/fomori/code/powers/_fomori_power.dm | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm b/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm index bd569a7c60ee..da8e1856193f 100644 --- a/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm +++ b/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm @@ -18,6 +18,11 @@ // What bodypart are we putting our feature on? var/feature_bodypart = BODY_ZONE_HEAD + // What organ are we adding? + var/obj/item/organ/fomor_organ + // Where are we inserting it? + var/fomor_organ_slot + /atom/movable/screen/alert/status_effect/fomori_power icon = 'modular_darkpack/modules/fomori/icons/fomori_abilities.dmi' icon_state = "bg_fomori_power" @@ -57,3 +62,14 @@ fomor_part = initial(fomor_part) else add_feature() + +/datum/action/cooldown/power/fomori_power/proc/add_organ() + var/obj/item/organ/new_organ = new fomor_organ() + new_organ.Insert(owner) + +/datum/action/cooldown/power/fomori_power/proc/remove_organ() + var/obj/item/organ/organ = owner.get_organ_slot(fomor_organ_slot) + if(organ) + organ.Remove(owner) + qdel(organ) + fomor_organ = initial(fomor_organ) From 77b15a2284bff298354ac3590ff7363079679844 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Mon, 4 May 2026 19:49:22 -0400 Subject: [PATCH 26/35] external organs aren't going to work here --- .../modules/fomori/code/powers/_fomori_power.dm | 11 ----------- 1 file changed, 11 deletions(-) diff --git a/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm b/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm index da8e1856193f..3f07982a16f9 100644 --- a/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm +++ b/modular_darkpack/modules/fomori/code/powers/_fomori_power.dm @@ -62,14 +62,3 @@ fomor_part = initial(fomor_part) else add_feature() - -/datum/action/cooldown/power/fomori_power/proc/add_organ() - var/obj/item/organ/new_organ = new fomor_organ() - new_organ.Insert(owner) - -/datum/action/cooldown/power/fomori_power/proc/remove_organ() - var/obj/item/organ/organ = owner.get_organ_slot(fomor_organ_slot) - if(organ) - organ.Remove(owner) - qdel(organ) - fomor_organ = initial(fomor_organ) From 356424a5aadf31dc2492e57e8bf1345202d76de0 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Mon, 4 May 2026 21:32:39 -0400 Subject: [PATCH 27/35] oversight --- .../modules/fomori/code/powers/_fomori_power_weapon.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/modular_darkpack/modules/fomori/code/powers/_fomori_power_weapon.dm b/modular_darkpack/modules/fomori/code/powers/_fomori_power_weapon.dm index 0d32009f9f46..97883e7f6b14 100644 --- a/modular_darkpack/modules/fomori/code/powers/_fomori_power_weapon.dm +++ b/modular_darkpack/modules/fomori/code/powers/_fomori_power_weapon.dm @@ -19,6 +19,7 @@ qdel(off_held) to_chat(owner, span_warning(sheathe_text)) playsound(get_turf(owner), sheathe_sound, 50) + deployed = FALSE return if(held && !owner.dropItemToGround(held)) From a84958fce74d883c57430cea759f26defd9b5674 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Fri, 8 May 2026 09:45:28 -0400 Subject: [PATCH 28/35] exoskeleton and regen --- .../~darkpack/traits/declarations.dm | 3 + code/_globalvars/traits/_traits.dm | 1 + code/_globalvars/traits/admin_tooling.dm | 1 + .../modules/fomori/code/powers/exoskeleton.dm | 29 +++++++++ .../modules/fomori/code/powers/horns.dm | 1 - .../fomori/code/powers/regeneration.dm | 62 +++++++++++++++++++ .../fomori/code/splats/fomori_splat.dm | 9 +++ tgstation.dme | 2 + 8 files changed, 107 insertions(+), 1 deletion(-) create mode 100644 modular_darkpack/modules/fomori/code/powers/exoskeleton.dm create mode 100644 modular_darkpack/modules/fomori/code/powers/regeneration.dm diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index 17b5e31f5f00..78a14f54e622 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -147,6 +147,9 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_LOUD_HOWLER "loud_howler" #define TRAIT_RAZOR_CLAWS "razor_claws" +// Fomori Traits +#define TRAIT_FOMOR_REGEN "fomor_regen" + /// Sixth sense restricted to view range #define TRAIT_LOCAL_SIXTHSENSE "local_sixth_sense" /// If the mob can't have surgery done on it. See: Blood form Tzimisce diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index f83aef8d8b3c..c1c7dae12bf2 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -693,6 +693,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_FEEDING_RESTRICTION" = TRAIT_FEEDING_RESTRICTION, // DARKPACK EDIT ADD "TRAIT_FERA_FUR" = TRAIT_FERA_FUR, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_FERA_RENOWN" = TRAIT_FERA_RENOWN, // DARKPACK EDIT ADD - WEREWOLF + "TRAIT_FOMOR_REGEN" = TRAIT_FOMOR_REGEN, // DARKPACK EDIT ADD - FOMORI "TRAIT_FORCED_EMOTION" = TRAIT_FORCED_EMOTION, // DARKPACK EDIT ADD - Melpominee "TRAIT_FRENETIC_AURA" = TRAIT_FRENETIC_AURA, // DARKPACK EDIT ADD "TRAIT_GHOST_VISION" = TRAIT_GHOST_VISION, // DARKPACK EDIT ADD - POWERS - (Necromancy) diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 16705524cb75..436c217a8788 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -383,6 +383,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_FEEDING_RESTRICTION" = TRAIT_FEEDING_RESTRICTION, // DARKPACK EDIT ADD "TRAIT_FERA_FUR" = TRAIT_FERA_FUR, // DARKPACK EDIT ADD - WEREWOLF "TRAIT_FERA_RENOWN" = TRAIT_FERA_RENOWN, // DARKPACK EDIT ADD - WEREWOLF + "TRAIT_FOMOR_REGEN" = TRAIT_FOMOR_REGEN, // DARKPACK EDIT ADD - FOMORI "TRAIT_FRENETIC_AURA" = TRAIT_FRENETIC_AURA, // DARKPACK EDIT ADD "TRAIT_GHOST_VISION" = TRAIT_GHOST_VISION, // DARKPACK EDIT ADD - POWERS - (Necromancy) "TRAIT_GULLET" = TRAIT_GULLET, // DARKPACK EDIT ADD diff --git a/modular_darkpack/modules/fomori/code/powers/exoskeleton.dm b/modular_darkpack/modules/fomori/code/powers/exoskeleton.dm new file mode 100644 index 000000000000..2458991e607a --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/exoskeleton.dm @@ -0,0 +1,29 @@ +/datum/bodypart_overlay/simple/fomor_exoskeleton + icon_state = "exoskeleton" + icon = 'modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi' + layers = BENEATH_HAIR_LAYER + +/datum/action/cooldown/power/fomori_power/exoskeleton + name = "Exoskeleton" + desc = "(NEED SPRITES) Form a thick carapace around your body, protecting you from harm and increasing your strength." + button_icon_state = "exoskeleton" + rank = 1 // of 1 + + fomor_part = /datum/bodypart_overlay/simple/fomor_exoskeleton + +/datum/action/cooldown/power/fomori_power/exoskeleton/Activate(atom/target) + . = ..() + var/mob/living/carbon/carbon_owner = astype(owner, /mob/living/carbon) + + toggle_feature(deployed) + + if(deployed) + deployed = FALSE + carbon_owner.st_remove_stat_mod(STAT_STAMINA, 1, "exoskeleton") + carbon_owner.st_remove_stat_mod(STAT_STRENGTH, 1, "exoskeleton") + playsound(owner, 'modular_darkpack/modules/powers/sounds/potence_deactivate.ogg', 50) + else + deployed = TRUE + carbon_owner.st_add_stat_mod(STAT_STAMINA, 1, "exoskeleton") + carbon_owner.st_add_stat_mod(STAT_STRENGTH, 1, "exoskeleton") + playsound(owner, 'modular_darkpack/modules/powers/sounds/potence_activate.ogg', 50) diff --git a/modular_darkpack/modules/fomori/code/powers/horns.dm b/modular_darkpack/modules/fomori/code/powers/horns.dm index a553ab0805af..cc64f8217f16 100644 --- a/modular_darkpack/modules/fomori/code/powers/horns.dm +++ b/modular_darkpack/modules/fomori/code/powers/horns.dm @@ -13,7 +13,6 @@ /datum/action/cooldown/power/fomori_power/horns/Activate(atom/target) . = ..() - var/mob/living/carbon/carbon_owner = astype(owner, /mob/living/carbon) toggle_feature(deployed) if(deployed) diff --git a/modular_darkpack/modules/fomori/code/powers/regeneration.dm b/modular_darkpack/modules/fomori/code/powers/regeneration.dm new file mode 100644 index 000000000000..ffef8bbd9318 --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/regeneration.dm @@ -0,0 +1,62 @@ +/datum/storyteller_roll/fomor_regeneration + bumper_text = "regeneration" + difficulty = 6 + applicable_stats = list(STAT_STAMINA) + numerical = FALSE + roll_output_type = ROLL_PRIVATE + +/datum/action/cooldown/power/fomori_power/regeneration + name = "Regeneration" + desc = "Recover from your wounds much the same as the bestial Garou do." + button_icon_state = "regeneration" + rank = 1 // of 1 + +/datum/action/cooldown/power/fomori_power/regeneration/Grant(mob/granted_to) + . = ..() + ADD_TRAIT(owner, TRAIT_FOMOR_REGEN, "regeneration") + +/datum/action/cooldown/power/fomori_power/regeneration/Activate(atom/target) + . = ..() + var/datum/storyteller_roll/roll_datum = new /datum/storyteller_roll/fomor_regeneration + var/roll_result = roll_datum.st_roll(owner) + + if(roll_result) + force_heal() + +/datum/action/cooldown/power/fomori_power/regeneration/proc/force_heal() + var/mob/living/carbon/carbon_owner = astype(owner, /mob/living/carbon) + + //normal bashing/lethal damage + carbon_owner.heal_ordered_damage(30, list(BRUTE, TOX, OXY, STAMINA)) + + if(length(carbon_owner.all_wounds)) + for (var/i in 1 to min(rank, length(carbon_owner.all_wounds))) + var/datum/wound/wound = carbon_owner.all_wounds[i] + wound.remove_wound() + + //brain damage and traumas healing + var/obj/item/organ/brain/brain = carbon_owner.get_organ_slot(ORGAN_SLOT_BRAIN) + if (brain) + brain.apply_organ_damage(-30) + + for (var/i in 1 to min(rank, length(brain.get_traumas_type()))) + var/datum/brain_trauma/healing_trauma = pick(brain.get_traumas_type()) + brain.cure_trauma_type(healing_trauma, resilience = TRAUMA_RESILIENCE_WOUND) + + //miscellaneous organ damage healing + var/obj/item/organ/eyes/eyes = carbon_owner.get_organ_slot(ORGAN_SLOT_EYES) + if (eyes) + eyes.apply_organ_damage(-30) + + carbon_owner.adjust_temp_blindness(-6) + carbon_owner.adjust_eye_blur(-6) + + carbon_owner.visible_message( + span_warning("[carbon_owner]'s wounds heal with unnatural speed!"), + span_warning("Your wounds visibly heal with unnatural speed!")) + + SEND_SIGNAL(carbon_owner, COMSIG_MASQUERADE_VIOLATION) + + //update UI + carbon_owner.update_damage_overlays() + carbon_owner.update_health_hud() diff --git a/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm index 5a705d26afa8..bdeb1202944d 100644 --- a/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm +++ b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm @@ -6,6 +6,13 @@ splat_priority = SPLAT_PRIO_FOMORI power_type = /datum/action/cooldown/power/fomori_power + COOLDOWN_DECLARE(passive_healing_cd) + +/datum/splat/fomori/splat_life(seconds_per_tick) + if(HAS_TRAIT(owner, TRAIT_FOMOR_REGEN)) + if(COOLDOWN_FINISHED(src, passive_healing_cd)) + owner.heal_storyteller_health(1, heal_scars = TRUE, heal_blood = TRUE) + COOLDOWN_START(src, passive_healing_cd, 1 TURNS) /mob/living/carbon/human/splat/fomori auto_splats = list(/datum/splat/fomori) @@ -17,6 +24,8 @@ owner.give_st_power(/datum/action/cooldown/power/fomori_power/fangs, 1) owner.give_st_power(/datum/action/cooldown/power/fomori_power/chameleon_coloration, 1) owner.give_st_power(/datum/action/cooldown/power/fomori_power/darksight, 1) + owner.give_st_power(/datum/action/cooldown/power/fomori_power/exoskeleton, 1) + owner.give_st_power(/datum/action/cooldown/power/fomori_power/regeneration, 1) /datum/splat/fomori/get_power(power_type) RETURN_TYPE(/datum/action/cooldown/power/fomori_power) diff --git a/tgstation.dme b/tgstation.dme index f3ffddfa7318..0a8349e7f8ed 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7240,8 +7240,10 @@ #include "modular_darkpack\modules\fomori\code\powers\chameleon_coloration.dm" #include "modular_darkpack\modules\fomori\code\powers\claws.dm" #include "modular_darkpack\modules\fomori\code\powers\darksight.dm" +#include "modular_darkpack\modules\fomori\code\powers\exoskeleton.dm" #include "modular_darkpack\modules\fomori\code\powers\fangs.dm" #include "modular_darkpack\modules\fomori\code\powers\horns.dm" +#include "modular_darkpack\modules\fomori\code\powers\regeneration.dm" #include "modular_darkpack\modules\fomori\code\splats\fomori_splat.dm" #include "modular_darkpack\modules\font_adjustments\font_procs.dm" #include "modular_darkpack\modules\food\code\drinking_glass.dm" From c5a9c75c400c7d0f98c83596c85568e88cb96b43 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Fri, 8 May 2026 19:30:51 -0400 Subject: [PATCH 29/35] ex --- .../modules/fomori/code/splats/fomori_splat.dm | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) diff --git a/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm index bdeb1202944d..c28476274fc3 100644 --- a/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm +++ b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm @@ -17,15 +17,15 @@ /mob/living/carbon/human/splat/fomori auto_splats = list(/datum/splat/fomori) -/datum/splat/fomori/on_gain() // WIP: Will be pointbuy eventually - owner.give_st_power(/datum/action/cooldown/power/fomori_power/weapon/body_barbs, 1) - owner.give_st_power(/datum/action/cooldown/power/fomori_power/weapon/claws, 1) - owner.give_st_power(/datum/action/cooldown/power/fomori_power/horns, 1) - owner.give_st_power(/datum/action/cooldown/power/fomori_power/fangs, 1) - owner.give_st_power(/datum/action/cooldown/power/fomori_power/chameleon_coloration, 1) - owner.give_st_power(/datum/action/cooldown/power/fomori_power/darksight, 1) - owner.give_st_power(/datum/action/cooldown/power/fomori_power/exoskeleton, 1) - owner.give_st_power(/datum/action/cooldown/power/fomori_power/regeneration, 1) +/datum/splat/fomori/on_gain() // WIP: Will be pointbuy eventually. Don't merge with this code in-tact + owner.give_st_power(/datum/action/cooldown/power/fomori_power/weapon/body_barbs, 1) // done + owner.give_st_power(/datum/action/cooldown/power/fomori_power/weapon/claws, 1) // done + owner.give_st_power(/datum/action/cooldown/power/fomori_power/horns, 1) // unfinished + owner.give_st_power(/datum/action/cooldown/power/fomori_power/fangs, 1) // done + owner.give_st_power(/datum/action/cooldown/power/fomori_power/chameleon_coloration, 1) // done + owner.give_st_power(/datum/action/cooldown/power/fomori_power/darksight, 1) // done + owner.give_st_power(/datum/action/cooldown/power/fomori_power/exoskeleton, 1) // unfinished + owner.give_st_power(/datum/action/cooldown/power/fomori_power/regeneration, 1) // done /datum/splat/fomori/get_power(power_type) RETURN_TYPE(/datum/action/cooldown/power/fomori_power) From 10ad7b7c532a1be0206d9fc498c957df7678f8ae Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Sun, 10 May 2026 07:00:17 -0400 Subject: [PATCH 30/35] infectious touch, hide of the wyrm, masq breaches --- .../modules/fomori/code/powers/body_barbs.dm | 1 + .../modules/fomori/code/powers/claws.dm | 1 + .../modules/fomori/code/powers/exoskeleton.dm | 1 + .../modules/fomori/code/powers/fangs.dm | 1 + .../fomori/code/powers/hide_of_the_wyrm.dm | 33 ++++++++++++++++ .../modules/fomori/code/powers/horns.dm | 1 + .../fomori/code/powers/infectious_touch.dm | 39 +++++++++++++++++++ .../fomori/code/splats/fomori_splat.dm | 4 ++ .../fomori/code/splats/is_fomori_helpers.dm | 4 ++ .../code/components/violation_observer.dm | 12 +++++- .../modules/splats/code/__splat.dm | 2 + .../code/splats/fera_splat.dm | 2 + .../code/splats/is_werewolf_helpers.dm | 1 - tgstation.dme | 3 ++ 14 files changed, 102 insertions(+), 3 deletions(-) create mode 100644 modular_darkpack/modules/fomori/code/powers/hide_of_the_wyrm.dm create mode 100644 modular_darkpack/modules/fomori/code/powers/infectious_touch.dm create mode 100644 modular_darkpack/modules/fomori/code/splats/is_fomori_helpers.dm diff --git a/modular_darkpack/modules/fomori/code/powers/body_barbs.dm b/modular_darkpack/modules/fomori/code/powers/body_barbs.dm index ad12254942dd..5ee4afac9a92 100644 --- a/modular_darkpack/modules/fomori/code/powers/body_barbs.dm +++ b/modular_darkpack/modules/fomori/code/powers/body_barbs.dm @@ -51,6 +51,7 @@ owner.visible_message(span_warning("A pair of grotesque barbs extend from [owner]\'s arms!"), \ span_warning("Your body barbs extend from your arms."), \ span_hear("You hear organic matter ripping and tearing!")) + SEND_SIGNAL(entered_mob, COMSIG_MASQUERADE_VIOLATION) /datum/action/cooldown/power/fomori_power/weapon/body_barbs/two rank = 2 diff --git a/modular_darkpack/modules/fomori/code/powers/claws.dm b/modular_darkpack/modules/fomori/code/powers/claws.dm index e1ae7d57dab5..c8581b3b68f8 100644 --- a/modular_darkpack/modules/fomori/code/powers/claws.dm +++ b/modular_darkpack/modules/fomori/code/powers/claws.dm @@ -34,3 +34,4 @@ owner.visible_message(span_warning("A pair of grotesque claws extend from [owner]\'s hands!"), \ span_warning("Your claws extend from your hands."), \ span_hear("You hear organic matter ripping and tearing!")) + SEND_SIGNAL(entered_mob, COMSIG_MASQUERADE_VIOLATION) diff --git a/modular_darkpack/modules/fomori/code/powers/exoskeleton.dm b/modular_darkpack/modules/fomori/code/powers/exoskeleton.dm index 2458991e607a..df4afe947ca1 100644 --- a/modular_darkpack/modules/fomori/code/powers/exoskeleton.dm +++ b/modular_darkpack/modules/fomori/code/powers/exoskeleton.dm @@ -27,3 +27,4 @@ carbon_owner.st_add_stat_mod(STAT_STAMINA, 1, "exoskeleton") carbon_owner.st_add_stat_mod(STAT_STRENGTH, 1, "exoskeleton") playsound(owner, 'modular_darkpack/modules/powers/sounds/potence_activate.ogg', 50) + SEND_SIGNAL(entered_mob, COMSIG_MASQUERADE_VIOLATION) diff --git a/modular_darkpack/modules/fomori/code/powers/fangs.dm b/modular_darkpack/modules/fomori/code/powers/fangs.dm index 14b25bbf8772..f46834da29df 100644 --- a/modular_darkpack/modules/fomori/code/powers/fangs.dm +++ b/modular_darkpack/modules/fomori/code/powers/fangs.dm @@ -28,3 +28,4 @@ ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, "fomor_fangs") deployed = TRUE carbon_owner.combat_bite_damages = list(BRUTE = 0, BURN = 0, TOX = 0, OXY = 0, AGGRAVATED = 1 TTRPG_DAMAGE) + SEND_SIGNAL(entered_mob, COMSIG_MASQUERADE_VIOLATION) diff --git a/modular_darkpack/modules/fomori/code/powers/hide_of_the_wyrm.dm b/modular_darkpack/modules/fomori/code/powers/hide_of_the_wyrm.dm new file mode 100644 index 000000000000..40a388ae7e67 --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/hide_of_the_wyrm.dm @@ -0,0 +1,33 @@ +/datum/bodypart_overlay/simple/hide_of_the_wyrm + icon_state = "hide_of_the_wyrm" + icon = 'modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi' + layers = EXTERNAL_FRONT + +/datum/action/cooldown/power/fomori_power/hide_of_the_wyrm + name = "Hide of the Wyrm" + desc = "Form a hard, leathery hide around your body, protecting you from harm." + button_icon_state = "hide_of_the_wyrm" + rank = 1 // of 1 + + fomor_part = /datum/bodypart_overlay/simple/hide_of_the_wyrm + feature_bodypart = BODY_ZONE_CHEST + +/datum/action/cooldown/power/fomori_power/hide_of_the_wyrm/Activate(atom/target) // TODO: replace fortitude with soak dice if/when we get it + . = ..() + var/mob/living/carbon/carbon_owner = astype(owner, /mob/living/carbon) + + toggle_feature(deployed) + + if(deployed) + deployed = FALSE + owner.visible_message(span_warning("[owner]'s skin is no longer hard and leathery."), \ + span_warning("Your skin is no longer hard and leathery.")) + carbon_owner.remove_status_effect(/datum/status_effect/fortitude/one) + playsound(owner, 'modular_darkpack/modules/powers/sounds/potence_deactivate.ogg', 50) + else + deployed = TRUE + owner.visible_message(span_warning("[owner]'s skin becomes hard and leathery!"), \ + span_warning("Your skin becomes hard and leathery.")) + carbon_owner.apply_status_effect(/datum/status_effect/fortitude/one) // ! if we ever plan on allowing vampiric fomor, give this it's own status effect ! + playsound(owner, 'modular_darkpack/modules/powers/sounds/potence_activate.ogg', 50) + SEND_SIGNAL(entered_mob, COMSIG_MASQUERADE_VIOLATION) diff --git a/modular_darkpack/modules/fomori/code/powers/horns.dm b/modular_darkpack/modules/fomori/code/powers/horns.dm index cc64f8217f16..1d2500368f9f 100644 --- a/modular_darkpack/modules/fomori/code/powers/horns.dm +++ b/modular_darkpack/modules/fomori/code/powers/horns.dm @@ -19,3 +19,4 @@ deployed = FALSE else deployed = TRUE + SEND_SIGNAL(entered_mob, COMSIG_MASQUERADE_VIOLATION) diff --git a/modular_darkpack/modules/fomori/code/powers/infectious_touch.dm b/modular_darkpack/modules/fomori/code/powers/infectious_touch.dm new file mode 100644 index 000000000000..70aa440c42dd --- /dev/null +++ b/modular_darkpack/modules/fomori/code/powers/infectious_touch.dm @@ -0,0 +1,39 @@ +/datum/storyteller_roll/infectious_touch + bumper_text = "infectious touch" + difficulty = 7 + applicable_stats = list(STAT_STAMINA, STAT_MEDICINE) + numerical = TRUE + roll_output_type = ROLL_PRIVATE + +/datum/storyteller_roll/infectious_touch/defender + applicable_stats = list(STAT_STAMINA) + +/datum/action/cooldown/power/fomori_power/infectious_touch + name = "Infectious Touch" + desc = "With just a touch, cause an unnatural sickness to set in to your target's body." + button_icon_state = "infectious_touch" + rank = 1 // of 1 + click_to_activate = TRUE + willpower_cost = 1 + +/datum/action/cooldown/power/fomori_power/infectious_touch/Activate(atom/target) + if(!isliving(target)) + return + if(!(target in range(1, owner))) + return + + . = ..() + var/mob/living/defender = target + + to_chat(owner, span_warning("You touch [defender], intending to infect them with a grotesque illness...")) + + var/datum/storyteller_roll/roll_datum = new /datum/storyteller_roll/fomor_infectious_touch + var/datum/storyteller_roll/roll_datum_defender = new /datum/storyteller_roll/fomor_infectious_touch/defender + var/our_power = roll_datum.st_roll(owner) + var/their_power = roll_datum_defender.st_roll(defender) + + if(our_power > their_power) + var/net_power = our_power - their_power + if(get_vampire_splat(defender)) + return // Stops just before applying damage without feedback so it's not a splat detector + defender.apply_damage(30*net_power, TOX) // Rules as written it's supposed to be aggravated, but this is better for flavor I think. diff --git a/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm index c28476274fc3..a4122fed0dc1 100644 --- a/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm +++ b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm @@ -6,6 +6,8 @@ splat_priority = SPLAT_PRIO_FOMORI power_type = /datum/action/cooldown/power/fomori_power + + uses_veil = TRUE COOLDOWN_DECLARE(passive_healing_cd) /datum/splat/fomori/splat_life(seconds_per_tick) @@ -26,6 +28,8 @@ owner.give_st_power(/datum/action/cooldown/power/fomori_power/darksight, 1) // done owner.give_st_power(/datum/action/cooldown/power/fomori_power/exoskeleton, 1) // unfinished owner.give_st_power(/datum/action/cooldown/power/fomori_power/regeneration, 1) // done + owner.give_st_power(/datum/action/cooldown/power/fomori_power/hide_of_the_wyrm, 1) // done + owner.give_st_power(/datum/action/cooldown/power/fomori_power/infectious_touch, 1) // /datum/splat/fomori/get_power(power_type) RETURN_TYPE(/datum/action/cooldown/power/fomori_power) diff --git a/modular_darkpack/modules/fomori/code/splats/is_fomori_helpers.dm b/modular_darkpack/modules/fomori/code/splats/is_fomori_helpers.dm new file mode 100644 index 000000000000..a7ac7efc8c5d --- /dev/null +++ b/modular_darkpack/modules/fomori/code/splats/is_fomori_helpers.dm @@ -0,0 +1,4 @@ +/proc/get_fomori_splat(mob/character) + RETURN_TYPE(/datum/splat/fomori) + + return character.get_splat(/datum/splat/fomori) diff --git a/modular_darkpack/modules/masquerade/code/components/violation_observer.dm b/modular_darkpack/modules/masquerade/code/components/violation_observer.dm index 50662339f8f6..9f9a27193224 100644 --- a/modular_darkpack/modules/masquerade/code/components/violation_observer.dm +++ b/modular_darkpack/modules/masquerade/code/components/violation_observer.dm @@ -69,7 +69,11 @@ /atom/proc/observe_masquerade_violation(player_breacher) do_alert_animation() - if(get_werewolf_splat(player_breacher)) + for(var/datum/splat in player_breacher.splats) + if(splat.uses_veil) + should_use_veil = TRUE + + if(should_use_veil) to_chat(player_breacher, span_userdanger(span_bold("VEIL VIOLATION"))) playsound(player_breacher, 'modular_darkpack/modules/masquerade/sound/veil_violation.ogg', 50, FALSE, -5) return @@ -77,7 +81,11 @@ to_chat(player_breacher, span_userdanger(span_bold("MASQUERADE VIOLATION"))) /atom/proc/observe_masquerade_reinforce(player_breacher) - if(get_werewolf_splat(player_breacher)) + for(var/datum/splat in player_breacher.splats) + if(splat.uses_veil) + should_use_veil = TRUE + + if(should_use_veil) to_chat(player_breacher, span_big(span_boldnicegreen("VEIL REINFORCED"))) playsound(player_breacher, 'modular_darkpack/modules/masquerade/sound/humanity_gain.ogg', 50, FALSE, -5) return diff --git a/modular_darkpack/modules/splats/code/__splat.dm b/modular_darkpack/modules/splats/code/__splat.dm index 0791d389f72f..d4bd3f6d5fc2 100644 --- a/modular_darkpack/modules/splats/code/__splat.dm +++ b/modular_darkpack/modules/splats/code/__splat.dm @@ -35,6 +35,8 @@ var/splat_biotypes /// Base type of the powers that this splat has var/power_type + /// Whether or not we use the MASQUERADE or the VEIL + var/uses_veil /// Splats that someone with this splat cannot gain var/list/incompatible_splats diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm index 4ed9d06d10ee..4f7d87bc67fd 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/fera_splat.dm @@ -4,6 +4,8 @@ power_type = /datum/action/cooldown/power/gift + uses_veil = TRUE + // Perm is for rolls // Non-perm/ or temp is for expenditure var/uses_rage = FALSE diff --git a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/is_werewolf_helpers.dm b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/is_werewolf_helpers.dm index 08665939ddf5..e4c47f144655 100644 --- a/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/is_werewolf_helpers.dm +++ b/modular_darkpack/modules/werewolf_the_apocalypse/code/splats/is_werewolf_helpers.dm @@ -27,4 +27,3 @@ RETURN_TYPE(/datum/splat/werewolf/kinfolk) return character.get_splat(/datum/splat/werewolf/kinfolk) - diff --git a/tgstation.dme b/tgstation.dme index 0a8349e7f8ed..e9556dccc7e0 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7242,9 +7242,12 @@ #include "modular_darkpack\modules\fomori\code\powers\darksight.dm" #include "modular_darkpack\modules\fomori\code\powers\exoskeleton.dm" #include "modular_darkpack\modules\fomori\code\powers\fangs.dm" +#include "modular_darkpack\modules\fomori\code\powers\hide_of_the_wyrm.dm" +#include "modular_darkpack\modules\fomori\code\powers\infectious_touch.dm" #include "modular_darkpack\modules\fomori\code\powers\horns.dm" #include "modular_darkpack\modules\fomori\code\powers\regeneration.dm" #include "modular_darkpack\modules\fomori\code\splats\fomori_splat.dm" +#include "modular_darkpack\modules\fomori\code\splats\is_fomori_helpers.dm" #include "modular_darkpack\modules\font_adjustments\font_procs.dm" #include "modular_darkpack\modules\food\code\drinking_glass.dm" #include "modular_darkpack\modules\food\code\drinks.dm" From e73a08aa297bb44fdf0c6a7f309cf5a0cbf0eb2a Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Mon, 11 May 2026 09:47:41 -0400 Subject: [PATCH 31/35] masq + compile --- .../modules/fomori/code/powers/body_barbs.dm | 2 +- .../modules/fomori/code/powers/claws.dm | 2 +- .../modules/fomori/code/powers/exoskeleton.dm | 2 +- .../modules/fomori/code/powers/fangs.dm | 2 +- .../modules/fomori/code/powers/hide_of_the_wyrm.dm | 2 +- .../modules/fomori/code/powers/infectious_touch.dm | 4 ++-- .../code/components/violation_observer.dm | 14 ++++++++------ 7 files changed, 15 insertions(+), 13 deletions(-) diff --git a/modular_darkpack/modules/fomori/code/powers/body_barbs.dm b/modular_darkpack/modules/fomori/code/powers/body_barbs.dm index 5ee4afac9a92..99b6dd7af096 100644 --- a/modular_darkpack/modules/fomori/code/powers/body_barbs.dm +++ b/modular_darkpack/modules/fomori/code/powers/body_barbs.dm @@ -51,7 +51,7 @@ owner.visible_message(span_warning("A pair of grotesque barbs extend from [owner]\'s arms!"), \ span_warning("Your body barbs extend from your arms."), \ span_hear("You hear organic matter ripping and tearing!")) - SEND_SIGNAL(entered_mob, COMSIG_MASQUERADE_VIOLATION) + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) /datum/action/cooldown/power/fomori_power/weapon/body_barbs/two rank = 2 diff --git a/modular_darkpack/modules/fomori/code/powers/claws.dm b/modular_darkpack/modules/fomori/code/powers/claws.dm index c8581b3b68f8..15528af0f7e0 100644 --- a/modular_darkpack/modules/fomori/code/powers/claws.dm +++ b/modular_darkpack/modules/fomori/code/powers/claws.dm @@ -34,4 +34,4 @@ owner.visible_message(span_warning("A pair of grotesque claws extend from [owner]\'s hands!"), \ span_warning("Your claws extend from your hands."), \ span_hear("You hear organic matter ripping and tearing!")) - SEND_SIGNAL(entered_mob, COMSIG_MASQUERADE_VIOLATION) + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) diff --git a/modular_darkpack/modules/fomori/code/powers/exoskeleton.dm b/modular_darkpack/modules/fomori/code/powers/exoskeleton.dm index df4afe947ca1..d50706be6173 100644 --- a/modular_darkpack/modules/fomori/code/powers/exoskeleton.dm +++ b/modular_darkpack/modules/fomori/code/powers/exoskeleton.dm @@ -27,4 +27,4 @@ carbon_owner.st_add_stat_mod(STAT_STAMINA, 1, "exoskeleton") carbon_owner.st_add_stat_mod(STAT_STRENGTH, 1, "exoskeleton") playsound(owner, 'modular_darkpack/modules/powers/sounds/potence_activate.ogg', 50) - SEND_SIGNAL(entered_mob, COMSIG_MASQUERADE_VIOLATION) + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) diff --git a/modular_darkpack/modules/fomori/code/powers/fangs.dm b/modular_darkpack/modules/fomori/code/powers/fangs.dm index f46834da29df..b0753f5a8ec1 100644 --- a/modular_darkpack/modules/fomori/code/powers/fangs.dm +++ b/modular_darkpack/modules/fomori/code/powers/fangs.dm @@ -28,4 +28,4 @@ ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, "fomor_fangs") deployed = TRUE carbon_owner.combat_bite_damages = list(BRUTE = 0, BURN = 0, TOX = 0, OXY = 0, AGGRAVATED = 1 TTRPG_DAMAGE) - SEND_SIGNAL(entered_mob, COMSIG_MASQUERADE_VIOLATION) + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) diff --git a/modular_darkpack/modules/fomori/code/powers/hide_of_the_wyrm.dm b/modular_darkpack/modules/fomori/code/powers/hide_of_the_wyrm.dm index 40a388ae7e67..fead00fed926 100644 --- a/modular_darkpack/modules/fomori/code/powers/hide_of_the_wyrm.dm +++ b/modular_darkpack/modules/fomori/code/powers/hide_of_the_wyrm.dm @@ -30,4 +30,4 @@ span_warning("Your skin becomes hard and leathery.")) carbon_owner.apply_status_effect(/datum/status_effect/fortitude/one) // ! if we ever plan on allowing vampiric fomor, give this it's own status effect ! playsound(owner, 'modular_darkpack/modules/powers/sounds/potence_activate.ogg', 50) - SEND_SIGNAL(entered_mob, COMSIG_MASQUERADE_VIOLATION) + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) diff --git a/modular_darkpack/modules/fomori/code/powers/infectious_touch.dm b/modular_darkpack/modules/fomori/code/powers/infectious_touch.dm index 70aa440c42dd..2bb31ab8635a 100644 --- a/modular_darkpack/modules/fomori/code/powers/infectious_touch.dm +++ b/modular_darkpack/modules/fomori/code/powers/infectious_touch.dm @@ -27,8 +27,8 @@ to_chat(owner, span_warning("You touch [defender], intending to infect them with a grotesque illness...")) - var/datum/storyteller_roll/roll_datum = new /datum/storyteller_roll/fomor_infectious_touch - var/datum/storyteller_roll/roll_datum_defender = new /datum/storyteller_roll/fomor_infectious_touch/defender + var/datum/storyteller_roll/roll_datum = new /datum/storyteller_roll/infectious_touch + var/datum/storyteller_roll/roll_datum_defender = new /datum/storyteller_roll/infectious_touch/defender var/our_power = roll_datum.st_roll(owner) var/their_power = roll_datum_defender.st_roll(defender) diff --git a/modular_darkpack/modules/masquerade/code/components/violation_observer.dm b/modular_darkpack/modules/masquerade/code/components/violation_observer.dm index 9f9a27193224..ea06e61fd2a1 100644 --- a/modular_darkpack/modules/masquerade/code/components/violation_observer.dm +++ b/modular_darkpack/modules/masquerade/code/components/violation_observer.dm @@ -67,10 +67,11 @@ source.observe_masquerade_reinforce(player_breacher) breached_players -= player_breacher -/atom/proc/observe_masquerade_violation(player_breacher) +/atom/proc/observe_masquerade_violation(mob/living/player_breacher) do_alert_animation() - for(var/datum/splat in player_breacher.splats) - if(splat.uses_veil) + var/should_use_veil + for(var/datum/splat/breacher_splat in player_breacher.splats) + if(breacher_splat.uses_veil) should_use_veil = TRUE if(should_use_veil) @@ -80,9 +81,10 @@ playsound(player_breacher, 'modular_darkpack/modules/masquerade/sound/masquerade_violation.ogg', 50, FALSE, -5) to_chat(player_breacher, span_userdanger(span_bold("MASQUERADE VIOLATION"))) -/atom/proc/observe_masquerade_reinforce(player_breacher) - for(var/datum/splat in player_breacher.splats) - if(splat.uses_veil) +/atom/proc/observe_masquerade_reinforce(mob/living/player_breacher) + var/should_use_veil + for(var/datum/splat/breacher_splat in player_breacher.splats) + if(breacher_splat.uses_veil) should_use_veil = TRUE if(should_use_veil) From 82be15116d2405a38d735709bb84c59c0777c5f4 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Mon, 11 May 2026 11:27:19 -0400 Subject: [PATCH 32/35] forgot one --- modular_darkpack/modules/fomori/code/powers/horns.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_darkpack/modules/fomori/code/powers/horns.dm b/modular_darkpack/modules/fomori/code/powers/horns.dm index 1d2500368f9f..3d1f68699765 100644 --- a/modular_darkpack/modules/fomori/code/powers/horns.dm +++ b/modular_darkpack/modules/fomori/code/powers/horns.dm @@ -19,4 +19,4 @@ deployed = FALSE else deployed = TRUE - SEND_SIGNAL(entered_mob, COMSIG_MASQUERADE_VIOLATION) + SEND_SIGNAL(owner, COMSIG_MASQUERADE_VIOLATION) From 29d500ea07e2ae912f131ae62ddb638057453883 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Tue, 12 May 2026 10:19:44 -0400 Subject: [PATCH 33/35] lore --- .../modules/fomori/code/splats/pref_lore.dm | 39 +++++++++++++++++++ tgstation.dme | 3 +- 2 files changed, 41 insertions(+), 1 deletion(-) create mode 100644 modular_darkpack/modules/fomori/code/splats/pref_lore.dm diff --git a/modular_darkpack/modules/fomori/code/splats/pref_lore.dm b/modular_darkpack/modules/fomori/code/splats/pref_lore.dm new file mode 100644 index 000000000000..6bae1f91109b --- /dev/null +++ b/modular_darkpack/modules/fomori/code/splats/pref_lore.dm @@ -0,0 +1,39 @@ +/datum/splat/fomori/prepare_human_for_preview(mob/living/carbon/human/human) + human.set_haircolor("#554435", update = FALSE) + human.set_hairstyle("Boddicker", update = TRUE) + human.set_facial_hairstyle("Beard (Seven o Clock Shadow)", update = TRUE) + human.set_eye_color("#8281ca") + human.undershirt = "Tank Top (White)" + human.update_body() + human.equipOutfit(/datum/outfit/civillian4, TRUE) + +/datum/splat/fomori/get_splat_description() + return "Mortals who have lost themselves to the Wyrm's corruption. \ + A slow death of the self — most do not even realize what has happened to them before the bane takes over completely. \ + Tools of Dancers, and wretched things to mercifully be slain by Gaians. \ + You are but another pawn in a scheme older and grander than you could've ever imagined." + +/datum/splat/fomori/get_splat_lore() + return list( + "The fomori are created when a Bane possesses a human or an animal via a spiritual \"hole\" left by some form of sin or spiritual corruption. The Bane will slowly gain more and more influence, until they are completely fused with the host and cannot be separated.", + ) + +/datum/splat/fomori/create_pref_unique_perks() + var/list/to_add = list() + + to_add += list( + list( + SPECIES_PERK_TYPE = SPECIES_NEUTRAL_PERK, + SPECIES_PERK_ICON = FA_ICON_BOOK_DEAD, + SPECIES_PERK_NAME = "Bane Possession", + SPECIES_PERK_DESC = "Fomori are possessed by spirits called Banes, which imbues them with various powers and taints.", + ), + list( + SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, + SPECIES_PERK_ICON = FA_ICON_CROSSHAIRS, + SPECIES_PERK_NAME = "Hunted and Subservient", + SPECIES_PERK_DESC = "Fomori are hunted by Gaians and expected to serve the Wyrm.", + ), + ) + + return to_add diff --git a/tgstation.dme b/tgstation.dme index e9556dccc7e0..789bef7d1bcc 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7243,11 +7243,12 @@ #include "modular_darkpack\modules\fomori\code\powers\exoskeleton.dm" #include "modular_darkpack\modules\fomori\code\powers\fangs.dm" #include "modular_darkpack\modules\fomori\code\powers\hide_of_the_wyrm.dm" -#include "modular_darkpack\modules\fomori\code\powers\infectious_touch.dm" #include "modular_darkpack\modules\fomori\code\powers\horns.dm" +#include "modular_darkpack\modules\fomori\code\powers\infectious_touch.dm" #include "modular_darkpack\modules\fomori\code\powers\regeneration.dm" #include "modular_darkpack\modules\fomori\code\splats\fomori_splat.dm" #include "modular_darkpack\modules\fomori\code\splats\is_fomori_helpers.dm" +#include "modular_darkpack\modules\fomori\code\splats\pref_lore.dm" #include "modular_darkpack\modules\font_adjustments\font_procs.dm" #include "modular_darkpack\modules\food\code\drinking_glass.dm" #include "modular_darkpack\modules\food\code\drinks.dm" From 7d91183ca4a036119374c4d6ad8c73413af43780 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Tue, 12 May 2026 10:19:52 -0400 Subject: [PATCH 34/35] lore 2 --- modular_darkpack/modules/fomori/code/splats/fomori_splat.dm | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm index a4122fed0dc1..42127f4f05ed 100644 --- a/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm +++ b/modular_darkpack/modules/fomori/code/splats/fomori_splat.dm @@ -1,6 +1,10 @@ /datum/splat/fomori name = "Fomori" - desc = "An unfortunate vessel possesed by an evil spirit known as a Bane." + desc = "Mortals who have lost themselves to the Wyrm's corruption. \ + A slow death of the self — most do not even realize what has happened to them before the bane takes over completely. \ + Tools of Dancers, and wretched things to mercifully be slain by Gaians. \ + You are but another pawn in a scheme older and grander than you could've ever imagined." + id = SPLAT_FOMORI splat_priority = SPLAT_PRIO_FOMORI From e6a651cec78e77c39c5864dbf00e86cf46376801 Mon Sep 17 00:00:00 2001 From: dwinters99 <65516417+dwinters99@users.noreply.github.com> Date: Tue, 12 May 2026 10:20:09 -0400 Subject: [PATCH 35/35] exoskel sprites --- .../icons/fomori_sprite_accessories.dmi | Bin 1692 -> 6445 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi b/modular_darkpack/modules/fomori/icons/fomori_sprite_accessories.dmi index 9aaa016375751ccbd4e2f46b2966b3531d282594..c2e67ab58586122b8737767d253c50ccc142503b 100644 GIT binary patch literal 6445 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 literal 1692 zcmV;N24ne&P)004jl0{{R3eocQU0000jP)t-sz`(#h zQ8=8Ua>~P{4I~^{0zJAWCW;Fp=i$inT}axrvhUg0vx$fQ|NjaABpTxR?f?J)0d!JM zQvg8b*k%9#0HbOfy1 ziW(=j)Fvn~6yBZ|1}2p4PP$LNbFI$prR!C5?c@VerWn*o9XDGkX0nWnIqaoCAdmbt znGM4tD~u`RN(xIUuaFcjnF&_C`=v&ck%HH3Xe@@2Ea>PoBk1{+rXm0X$J=sZqCvxx z(|uh~q?`%S zJWW@vvgl=|dp8Vv>E6r_m}HqOBFH4cSr7u*%eLOaF2WoYLd07@yu?c`UX*}8z(bCL z2m$Z@2CJvLtKX{r*lc#eApMYZ`mK+r-m04JdfvAKkb>ChpAv)t^^py>jjQVlRImVO zFf4681`;BhvM^A4@Q@9m8E#-Xp@jz6jHb8)4H>Q$QxFAhgkCu0+o*>lmcT(aacr*i zr-AJ&BWMur2&WL?6pUTe!LW%sL&_{Wf<{;#wH(8e3`1KG#+Ia@h6Ro~WgkeS451*l zZdmrL9FmX4ZCoxA6+3!EC45_KbPHj03kI`T5()<)b+NDw58#&C<@2;xBcTzQV8RsH z>9w@eTT|_FU#YLc)H~F)&eOc zROv;+adGSVykUKL;AE|~PDJM?rHp6qJ{Gkr%t&QmL)a!CLoM83cfA}W{NN{mZzm6m ziq%KI!v+g+H^Pf46XtOxDl6dx@tTl+`0THz$)ic(1D%AhxFljLOvp+?XkNo?!^pGA z@$>%RuAEf(D=a^86hDZJ1&KRy8n&7Ez44mxhsp6DUz>-8N94)VtMmQa4kk3NmzsXN zDFC7N_3Wm<$HE8wedzv}UuDvGZF+4ghKvMExpu#v{}HN{5XYks5CZ6_znJ@j^SPfNmL zFxh7n=!8^iDKg6PyH1pKB35CSxpC&H9=aj>^EajBQn|`xXsii5$fp_^Y;dron;?$_ z;zz27EDU~mj0?=K?iPEC(g~!v#@=@i#epDe#EGPyYfkX~z2{2F?4JCk>x5}GVEX7` zgz^HBp2cwdcP4n>=?dPGlBrB581iZ!C7=?jNe5!@DTKWVY#g?w=9l}o7A@7{XZYFQ zszQcR{nemv&i8dSqv8nWFSI_b9+=C6Rz7hKnyMZv)n6?xJ^H?#P%tQjJfJ5{EmJIy z6aicZK2j~I{%T<-t$UVYPa(A1#hQ5Z=Xeu`HEr%FmZttJdCA9v^pS2S)OJk`&mwur zkcvqI4-i2G+SdYJhB4x}$O&1koq8M9MZ5}rzEa+Ynf{E6eba40=<$k%)$k))0+I6tOdaQ{uP5;