From f1c4caf1ec3734c74624f37dd83103b6a8de9690 Mon Sep 17 00:00:00 2001 From: harshaaaaw <94235018+harshaaaaw@users.noreply.github.com> Date: Tue, 28 Jul 2026 15:43:54 +0530 Subject: [PATCH 1/2] feat: add dodge roll component (closes #338) --- code/datums/components/dodge.dm | 55 +++++++++++++++++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 code/datums/components/dodge.dm diff --git a/code/datums/components/dodge.dm b/code/datums/components/dodge.dm new file mode 100644 index 00000000000000..2b0c86300303ec --- /dev/null +++ b/code/datums/components/dodge.dm @@ -0,0 +1,55 @@ +/// Dodge roll mechanic: while dodging, the mob takes no damage. +/datum/component/dodge + /// How long (deciseconds) the dodge i-frames last. + var/dodge_duration = 5 + /// Cooldown (deciseconds) before the mob can dodge again. + var/dodge_cooldown = 30 + /// Whether the mob is currently mid-dodge (invulnerable). + var/dodging = FALSE + /// World time at which the mob can dodge again. + var/next_dodge = 0 + +/datum/component/dodge/Initialize(duration = 5, cooldown = 30) + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + dodge_duration = duration + dodge_cooldown = cooldown + RegisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE, PROC_REF(on_apply_damage)) + return ..() + +/datum/component/dodge/Destroy(force, silent) + UnregisterSignal(parent, COMSIG_MOB_APPLY_DAMAGE) + return ..() + +/datum/component/dodge/proc/on_apply_damage(mob/living/source, damage, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) + SIGNAL_HANDLER + if(dodging) + return COMPONENT_NO_DAMAGE + +/// Triggers a dodge roll. Returns TRUE if the dodge started. +/datum/component/dodge/proc/start_dodge() + if(dodging || (world.time < next_dodge)) + return FALSE + var/mob/living/L = parent + dodging = TRUE + L.visible_message(span_danger("[L] performs a dodge roll!")) + // brief movement flair: nudge the mob in its facing direction + if(L.dir) + step(L, L.dir) + addtimer(CALLBACK(src, PROC_REF(end_dodge)), dodge_duration) + return TRUE + +/datum/component/dodge/proc/end_dodge() + dodging = FALSE + next_dodge = world.time + dodge_cooldown + +/// Verb so players can bind a key to dodge. +/mob/living/verb/dodge() + set name = "Dodge Roll" + set category = "IC" + set desc = "Perform a dodge roll, briefly avoiding all damage." + var/datum/component/dodge/D = src.GetComponent(/datum/component/dodge) + if(!D) + D = src.AddComponent(/datum/component/dodge) + if(D) + to_chat(src, D.start_dodge() ? span_notice("You dodge roll!") : span_warning("You can't dodge yet!")) From cae96ea6aa3937023a52dd81c7bfbd92a30dd688 Mon Sep 17 00:00:00 2001 From: harshaaaaw <94235018+harshaaaaw@users.noreply.github.com> Date: Tue, 28 Jul 2026 15:43:57 +0530 Subject: [PATCH 2/2] changelog: dodge roll --- html/changelogs/changelog_dodge.yml | 6 ++++++ 1 file changed, 6 insertions(+) create mode 100644 html/changelogs/changelog_dodge.yml diff --git a/html/changelogs/changelog_dodge.yml b/html/changelogs/changelog_dodge.yml new file mode 100644 index 00000000000000..20d160963ac061 --- /dev/null +++ b/html/changelogs/changelog_dodge.yml @@ -0,0 +1,6 @@ +- type: add + id: dodge_roll + author: harshaaaaw + message: Added a dodge roll mechanic — players can perform a dodge roll that briefly avoids all incoming damage, with a short cooldown. + changes: + - add: Players can now perform a dodge roll (IC verb) that grants brief damage immunity.