Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
38 commits
Select commit Hold shift + click to select a range
f1803d0
Merge branch 'master' of https://github.com/TheOneAndOnlyCreeperJoe/D…
anon1efergwerfwer Jul 10, 2026
de84574
Small error with the merge.
anon1efergwerfwer Jul 10, 2026
5a041ea
Better comments on returning throws
anon1efergwerfwer Jul 10, 2026
ae34450
Tweaks returning throw to be able to be usurped if it is the non-retu…
anon1efergwerfwer Jul 10, 2026
a615a04
Previous merge reintroduced moved files as new files so those have to…
anon1efergwerfwer Jul 10, 2026
b3a6544
Accidentally make the adjaceny pick-up range too big oops.
anon1efergwerfwer Jul 10, 2026
abd92a1
Adds path specific background sprites. Fixed a bug with cultivator an…
anon1efergwerfwer Jul 10, 2026
efcc0a8
Icons for all powers that were missing menu icons.
anon1efergwerfwer Jul 10, 2026
7803138
the red folder looks cooler.
anon1efergwerfwer Jul 10, 2026
4f870e4
wrong image because of an underscore instead of a dash
anon1efergwerfwer Jul 10, 2026
35e060d
Removed a leftover check against paths instead of archetypes in anchors.
anon1efergwerfwer Jul 10, 2026
20f7b77
Merge remote-tracking branch 'upstream/master' into new_powers_ui
anon1efergwerfwer Jul 10, 2026
fcaa986
smuggling back in the more defined hunger costs in the post merge-con…
anon1efergwerfwer Jul 10, 2026
bf61fae
Presti no longer unsets on click, fixes deflect going on cooldown on …
anon1efergwerfwer Jul 10, 2026
a6ce736
Deflect now has proper incapacitate gating behind its var, added a va…
anon1efergwerfwer Jul 11, 2026
d3ffd3f
Adresses & fixes all PR comments.
anon1efergwerfwer Jul 11, 2026
749f65d
Moves stray signals in the wrong file. Added signalers for powers bei…
anon1efergwerfwer Jul 11, 2026
2aced51
wrong value
anon1efergwerfwer Jul 11, 2026
298cbf4
aaaand forgor the description aaaaa-
anon1efergwerfwer Jul 11, 2026
0721995
Aberrants now support androids and ethereals in non-standard stomachs…
anon1efergwerfwer Jul 11, 2026
e02e8fe
Left over trailing comment in defines
anon1efergwerfwer Jul 11, 2026
86b2e19
Fixes a linter issue.
anon1efergwerfwer Jul 11, 2026
52d8aac
Merge branch 'master' into new_powers_ui
TheOneAndOnlyCreeperJoe Jul 11, 2026
6f2143d
fixed a missing allow_subtypes = false which prevented manipulate fro…
anon1efergwerfwer Jul 11, 2026
48054f2
Gets rid of constant lists in the TGUI for powers and now builds path…
anon1efergwerfwer Jul 12, 2026
b69c3a8
Updates badly named vars (back when we had advanced/root/standard pow…
anon1efergwerfwer Jul 12, 2026
c26b749
Moves hunger-cost type conversions to a new file and on a proc on sto…
anon1efergwerfwer Jul 12, 2026
a8efcd6
fixes another linter issue.
anon1efergwerfwer Jul 12, 2026
8baac8c
Actions now inherits its magic flags from powers rather than setting …
anon1efergwerfwer Jul 12, 2026
2232b42
fixes another linter issue oml
anon1efergwerfwer Jul 12, 2026
01ac4e7
Fixed a bug with mental shielding causing quality loss on 0 charge co…
anon1efergwerfwer Jul 12, 2026
6bb83fb
LINTEEEEEEEEER!
anon1efergwerfwer Jul 12, 2026
4df9655
Returning throws now only hits one mob on the return path. Telekinesi…
anon1efergwerfwer Jul 13, 2026
9eaf60b
Added a check that powers require you to be standing on a turf (no mo…
anon1efergwerfwer Jul 13, 2026
3f4da9c
changes the balloon alert to be single word
anon1efergwerfwer Jul 13, 2026
fbed210
unhardcodes colors
anon1efergwerfwer Jul 14, 2026
e709cf3
adds a blacklist to gale blast
anon1efergwerfwer Jul 14, 2026
269fdf8
fixed inconsistency in affinity for the custom viszard stuff, as well…
anon1efergwerfwer Jul 14, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
70 changes: 64 additions & 6 deletions code/__DEFINES/~doppler_defines/powers.dm
Original file line number Diff line number Diff line change
Expand Up @@ -10,29 +10,64 @@
#define POWER_PRIORITY_BASIC "Basic"
#define POWER_PRIORITY_ADVANCED "Advanced"

/// Designations whne referring to arcehtypes.
#define POWER_ARCHETYPE_SORCEROUS "Sorcerous"
#define POWER_ARCHETYPE_RESONANT "Resonant"
#define POWER_ARCHETYPE_MORTAL "Mortal"

/// UI/display sort order for power archetypes.
#define POWER_ARCHETYPE_SORT_SORCEROUS 10
#define POWER_ARCHETYPE_SORT_RESONANT 20
#define POWER_ARCHETYPE_SORT_MORTAL 30

/// Designations when referring to paths.
#define POWER_PATH_THAUMATURGE "Thaumaturge"
#define POWER_PATH_ENIGMATIST "Enigmatist"
#define POWER_PATH_THEOLOGIST "Theologist"
#define POWER_PATH_PSYKER "Psyker"
#define POWER_PATH_CULTIVATOR "Cultivator"
#define POWER_PATH_ABERRANT "Aberrant"
#define POWER_PATH_IMBUED "Imbued"
#define POWER_PATH_WARFIGHTER "Warfighter"
#define POWER_PATH_EXPERT "Expert"
#define POWER_PATH_AUGMENTED "Augmented"
#define POWER_PATH_IRREGULAR "Irregular"

/// UI/display sort order for power paths within their archetype.
#define POWER_PATH_SORT_PRIMARY 10
#define POWER_PATH_SORT_SECONDARY 20
#define POWER_PATH_SORT_TERTIARY 30
#define POWER_PATH_SORT_QUATERNARY 40

/// Color association per power. Generally speaking if you want to use colors, use these.
#define POWER_COLOR_THAUMATURGE "#7266dd"
#define POWER_COLOR_ENIGMATIST "#26A300"
#define POWER_COLOR_THEOLOGIST "#ddd166"
#define POWER_COLOR_PSYKER "#FF3CC8"
#define POWER_COLOR_ENIGMATIST "#439c27"
#define POWER_COLOR_THEOLOGIST "#d1c029"
#define POWER_COLOR_PSYKER "#b94398"
#define POWER_COLOR_CULTIVATOR "#66c5dd"
#define POWER_COLOR_ABERRANT "#4F3A57"
#define POWER_COLOR_WARFIGHTER "#cc3d3d"
#define POWER_COLOR_IMBUED "#e9874f"
#define POWER_COLOR_WARFIGHTER "#ac2222"
#define POWER_COLOR_EXPERT "#38495C"
#define POWER_COLOR_AUGMENTED "#7C8287"
#define POWER_COLOR_AUGMENTED "#6b6652"
#define POWER_COLOR_IRREGULAR "#cacaca"

/// Bitflags to determine what anti-magic a power interacts with/what type of magic it is.
#define POWER_MAGIC_STANDARD (1<<0)
#define POWER_MAGIC_MENTAL (1<<1)
#define POWER_MAGIC_UNHOLY (1<<2)
#define POWER_MAGIC_SCRYING (1<<3)

// Signals for power actions and power-holder power mutations.
/// Sent right before a power action resolves through use_action: (mob/living/user, atom/target)
#define COMSIG_POWER_ACTION_USED "power_action_used"
/// Sent when a power action successfully resolves (use_action returned TRUE): (mob/living/user, atom/target)
#define COMSIG_POWER_ACTION_SUCCESS "power_action_success"
/// Sent when a power is added to a mob's power list: (datum/power/added_power)
#define COMSIG_MOB_POWER_ADDED "mob_power_added"
/// Sent when a power is removed from a mob's power list: (datum/power/removed_power)
#define COMSIG_MOB_POWER_REMOVED "mob_power_removed"

/// Any traits granted by powers.
#define POWER_TRAIT "power_trait"

Expand Down Expand Up @@ -133,6 +168,8 @@
#define THAUMATURGE_HEMOMANCY_MAX_AFFINITY 6
// How much blood cost scales from prep_cost (and UI display) for hemomancy.
#define THAUMATURGE_HEMOMANCY_BLOOD_COST_MULTIPLIER 4
/// Sent by thaumaturge get_affinity for external affinity riders: (datum/action/cooldown/power/thaumaturge/action)
#define COMSIG_THAUMATURGE_AFFINITY_QUERY "thaumaturge_affinity_query"

/**
* SORCEROUS: ENIGMATIST
Expand Down Expand Up @@ -297,8 +334,29 @@
* All defines related to the aberrant powers.
*/

/// The value that the below numbers scale off of, because hunger is a little arbitrary. The reason why is as follows:
/// Starving is 150, Hungry is 250, Fed is 350, Well Fed is 450 Full is 550 and Fat is 600. Fat is a negative soft-cap (you can go above 600) and starving is effectively 0 for our power.
/// So our effective 'range' we want to consider is 150-550 (Starving-Full). We calculate this delta and that is effectively the 0%-100% range of our power's 'resource'
#define ABERRANT_HUNGER_COST_BASE (NUTRITION_LEVEL_FULL - NUTRITION_LEVEL_STARVING)

// Hunger costs
#define ABERRANT_HUNGER_TRIVIAL (ABERRANT_HUNGER_COST_BASE / 100)
#define ABERRANT_HUNGER_MINOR (ABERRANT_HUNGER_COST_BASE / 10)
#define ABERRANT_HUNGER_MODERATE (ABERRANT_HUNGER_COST_BASE / 5)
#define ABERRANT_HUNGER_MAJOR (ABERRANT_HUNGER_COST_BASE / 2)
#define ABERRANT_HUNGER_EXTREME (ABERRANT_HUNGER_COST_BASE)

/**
* RESONANT: IMBUED
* All defines related to the imbued powers.
*/

/// Fired by /datum/power/imbued_root/enchanted to collect additive percent bonuses to cooldown recovery.
/// Args: (list/recovery_bonus_percents)
#define COMSIG_IMBUED_ENCHANTED_RECOVERY_MODIFIERS "imbued_enchanted_recovery_modifiers"

// Trait that lets you use the riftwalker mechanic.
#define TRAIT_ABERRANT_RIFTWALKER "riftwalker"
#define TRAIT_IMBUED_RIFTWALKER "riftwalker"

/**MORTAL DEFINES
* I'm literally just using this to define Breacher Knuckle right now
Expand Down
7 changes: 0 additions & 7 deletions code/__DEFINES/~doppler_defines/signals.dm
Original file line number Diff line number Diff line change
@@ -1,19 +1,12 @@
///Fired in combat_indicator.dm, used for syncing CI between mech and pilot
#define COMSIG_MOB_CI_TOGGLED "mob_ci_toggled"

// Power signals
/// Sent when an obj/item calls item_use_power: (use_amount, user, check_only)
#define COMSIG_ITEM_POWER_USE "item_use_power"
#define NO_COMPONENT NONE
#define COMPONENT_POWER_SUCCESS (1<<0)
#define COMPONENT_NO_CELL (1<<1)
#define COMPONENT_NO_CHARGE (1<<2)
/// Sent right before a power action resolves through use_action: (mob/living/user, atom/target)
#define COMSIG_POWER_ACTION_USED "power_action_used"
/// Sent when a power action successfully resolves (use_action returned TRUE): (mob/living/user, atom/target)
#define COMSIG_POWER_ACTION_SUCCESS "power_action_success"
/// Sent by thaumaturge get_affinity for external affinity riders: (datum/action/cooldown/power/thaumaturge/action)
#define COMSIG_THAUMATURGE_AFFINITY_QUERY "thaumaturge_affinity_query"

/// For when a Hemophage's pulsating tumor gets added to their body.
#define COMSIG_PULSATING_TUMOR_ADDED "pulsating_tumor_added"
Expand Down
2 changes: 1 addition & 1 deletion modular_doppler/genemod_quirk/code/genemod_quirk.dm
Original file line number Diff line number Diff line change
Expand Up @@ -33,7 +33,7 @@
can_randomize = FALSE

/proc/generate_genemod_quirk_list()
var/list/stuff_we_dont_want = list(/datum/mutation/self_amputation, /datum/mutation/hulk, /datum/mutation/clever, /datum/mutation/blind, /datum/mutation/thermal, /datum/mutation/telepathy, /datum/mutation/telekinesis, /datum/mutation/void, /datum/mutation/badblink, /datum/mutation/acidflesh)
var/list/stuff_we_dont_want = list(/datum/mutation/self_amputation, /datum/mutation/hulk, /datum/mutation/clever, /datum/mutation/blind, /datum/mutation/thermal, /datum/mutation/telepathy, /datum/mutation/telekinesis, /datum/mutation/void, /datum/mutation/badblink, /datum/mutation/acidflesh, /datum/mutation/inexorable)

var/list/genemods = list()
for (var/datum/mutation/mut as anything in subtypesof(/datum/mutation))
Expand Down
10 changes: 10 additions & 0 deletions modular_doppler/modular_powers/code/_power.dm
Original file line number Diff line number Diff line change
Expand Up @@ -62,6 +62,14 @@
/// If true, the backpack automatically opens on post_add(). Usually set to TRUE when an item is equipped inside the player's backpack.
var/open_backpack = FALSE

/// Icon used inside the powers menu to show this power. If this is left empty, it will default to action_path, and if both are active, this overrides.
/// You don't need to set this if your action_path is fine.
var/menu_icon
/// icon state that matches the icon
var/menu_icon_state
/// Bitflags which determine what type of magic the power is. This is largely used in the powers menu to convey what anti-magics they may trigger, but is also used by some powers to check if a certain power is a certain type of magic.
var/magic_flags = NONE

/datum/power/New()
. = ..()
for(var/trait in no_process_traits)
Expand Down Expand Up @@ -101,6 +109,7 @@

power_holder = new_holder
power_holder.powers += src
SEND_SIGNAL(power_holder, COMSIG_MOB_POWER_ADDED, src)
// If we weren't passed a client source try to use a present one
client_source ||= power_holder.client

Expand Down Expand Up @@ -140,6 +149,7 @@
UnregisterSignal(power_holder, process_update_signals)

power_holder.powers -= src
SEND_SIGNAL(power_holder, COMSIG_MOB_POWER_REMOVED, src)

if(mob_trait && !QDELETED(power_holder))
REMOVE_TRAIT(power_holder, mob_trait, POWER_TRAIT)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
/*
Handles satiety costs and deductions across different unique types of stomachs, translating the resource-cost to the same amount for that stomach percentually.
*/

/// Convers the satiety cost from base satiety into an equivelant amount (percentually) in its own custom mechanics.
/obj/item/organ/stomach/proc/get_satiety_cost(amount)
return amount

/// Returns TRUE/FALSE depending on if a mob can afford the satiety cost.
/obj/item/organ/stomach/proc/can_afford_satiety_cost(amount)
if(amount <= 0)
return TRUE
if(!iscarbon(owner))
return FALSE

var/mob/living/carbon/carbon_owner = owner
return carbon_owner.nutrition > (NUTRITION_LEVEL_STARVING + get_satiety_cost(amount))

/// Adjusts satiety by the given amount.
/obj/item/organ/stomach/proc/adjust_satiety(amount)
if(amount <= 0 || !iscarbon(owner))
return

var/mob/living/carbon/carbon_owner = owner
carbon_owner.adjust_nutrition(-get_satiety_cost(amount))

/*
Special stomach versions below.
*/

/obj/item/organ/stomach/charging/get_satiety_cost(amount)
return scale_satiety_cost(amount, CHARGING_STOMACH_CHARGE_FULL - CHARGING_STOMACH_CHARGE_LOW)

/obj/item/organ/stomach/charging/can_afford_satiety_cost(amount)
if(amount <= 0)
return TRUE

var/obj/item/stock_parts/power_store/charging_cell = get_cell()
return charging_cell?.charge() > (CHARGING_STOMACH_CHARGE_LOW + get_satiety_cost(amount))

/obj/item/organ/stomach/charging/adjust_satiety(amount)
if(amount <= 0)
return

adjust_charge(-get_satiety_cost(amount))

/obj/item/organ/stomach/ethereal/get_satiety_cost(amount)
return scale_satiety_cost(amount, ETHEREAL_CHARGE_FULL - ETHEREAL_CHARGE_LOWPOWER)

/obj/item/organ/stomach/ethereal/can_afford_satiety_cost(amount)
if(amount <= 0)
return TRUE

return cell?.charge() > (ETHEREAL_CHARGE_LOWPOWER + get_satiety_cost(amount))

/obj/item/organ/stomach/ethereal/adjust_satiety(amount)
if(amount <= 0)
return

adjust_charge(-get_satiety_cost(amount))

/obj/item/organ/stomach/proc/scale_satiety_cost(amount, alternate_resource_capacity)
var/base_nutrition_capacity = NUTRITION_LEVEL_FULL - NUTRITION_LEVEL_STARVING
if(amount <= 0 || alternate_resource_capacity <= 0 || base_nutrition_capacity <= 0)
return amount

return amount / base_nutrition_capacity * alternate_resource_capacity
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,13 @@
/obj/item/clothing/suit/wizrobe/marisa/fake,
/obj/item/clothing/suit/wizrobe/tape/fake,
/obj/item/clothing/suit/wizrobe/secwiz,
/obj/item/clothing/suit/wizrobe/viszard
/obj/item/clothing/suit/wizrobe/viszard,
/obj/item/clothing/suit/wizrobe/durathread,
/obj/item/clothing/suit/wizrobe/durathread/earth,
/obj/item/clothing/suit/wizrobe/durathread/electric,
/obj/item/clothing/suit/wizrobe/durathread/fire,
/obj/item/clothing/suit/wizrobe/durathread/ice,
/obj/item/clothing/suit/wizrobe/durathread/necro,
)

/// There's a small chance that we manage to sneak in real wizard robes, in percentages.
Expand Down
Loading
Loading