Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
26 commits
Select commit Hold shift + click to select a range
c2926db
Bunch of stuff relating to my own story content.
CRITAWAKETS Feb 22, 2025
a851f16
I am amazed at how errorprone the automatic file ticking can be.
CRITAWAKETS Feb 22, 2025
0d56abd
Updates to attack chain stuffs
CRITAWAKETS May 29, 2025
ae6b012
Evil creatura, Death from Beyond
CRITAWAKETS Jul 12, 2025
04d28f5
fix the order
CRITAWAKETS Jul 13, 2025
3bcacfb
post-merge reordering
CRITAWAKETS Jul 20, 2025
37bcb13
fixes stuff i guess
CRITAWAKETS Sep 28, 2025
db6dbeb
HOPEFULLY FIXES INCLUDES
CRITAWAKETS Sep 29, 2025
55638a4
Adds in Hunter's Smoke
CRITAWAKETS Oct 26, 2025
acc0913
Fixes merge conflict resolution
CRITAWAKETS Oct 26, 2025
d3c31f3
yeah ok
CRITAWAKETS Nov 3, 2025
88477d2
ONE DAY I WILL LEARN THE ALPHABET
CRITAWAKETS Nov 3, 2025
c9dfbb4
Adds in the Grand Library's confidential works
CRITAWAKETS Nov 16, 2025
8e7f54a
Fixed up dme, story lazy templates are now more modular
CRITAWAKETS Nov 16, 2025
e0802f5
Observing the newly loaded lazy template is a choice now
CRITAWAKETS Nov 16, 2025
ebefbb2
Adds in a kanabo.
CRITAWAKETS Nov 16, 2025
8ba178b
Adds in a lot more rapid statuses and spells for them.
CRITAWAKETS Dec 9, 2025
7ea4d5e
Fixes some dmi jank with the moon sprite
CRITAWAKETS Dec 9, 2025
1b1c1eb
Fixes some issues with the shadow knife on drop
CRITAWAKETS Dec 9, 2025
3e816c1
Removes the non-functional summoned star gazer.
CRITAWAKETS Dec 14, 2025
23167ac
Punts everything into new directories
CRITAWAKETS Dec 14, 2025
2637606
i did a stupid
CRITAWAKETS Dec 14, 2025
fa6d549
Spirit Force
CRITAWAKETS Feb 16, 2026
986a268
Dark forging, spirit force is more built out
CRITAWAKETS Feb 24, 2026
3027fed
Adds self-message to clown pockets spell, calls post_created() (#93885)
lelandkemble Nov 12, 2025
0dbde10
Overall improvements
CRITAWAKETS Feb 24, 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
10 changes: 9 additions & 1 deletion code/modules/antagonists/heretic/magic/furious_steel.dm
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,14 @@
/// A ref to the status effect surrounding our heretic on activation.
var/datum/status_effect/protective_blades/blade_effect

/// NON-MODULE CHANGE : Made to make this more modular, actually
/// Time between each blade appearing for the protective effect.
var/time_between_blades = 0.66 SECONDS

/// NON-MODULE CHANGE
/// What status effect we apply
var/applied_status = /datum/status_effect/protective_blades

/datum/action/cooldown/spell/pointed/projectile/furious_steel/Grant(mob/grant_to)
. = ..()
if(!owner)
Expand Down Expand Up @@ -67,7 +75,7 @@
QDEL_NULL(blade_effect)

var/mob/living/living_user = on_who
blade_effect = living_user.apply_status_effect(/datum/status_effect/protective_blades, null, projectile_amount, 25, 0.66 SECONDS)
blade_effect = living_user.apply_status_effect(applied_status, null, projectile_amount, 25, time_between_blades) /// NON-MODULE CHANGE
RegisterSignal(blade_effect, COMSIG_QDELETING, PROC_REF(on_status_effect_deleted))

/datum/action/cooldown/spell/pointed/projectile/furious_steel/on_deactivation(mob/on_who, refund_cooldown = TRUE)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -62,7 +62,7 @@
return ..()

/datum/action/cooldown/spell/conjure_item/clown_pockets/post_created(atom/cast_on, atom/created)
cast_on.visible_message(span_notice("[cast_on] pulls out [created]!"))
cast_on.visible_message(span_notice("[cast_on] pulls out [created]!"), span_notice("You pull out [created]!"))

/datum/action/cooldown/spell/conjure_item/clown_pockets/can_cast_spell(feedback = TRUE)
. = ..()
Expand All @@ -76,15 +76,17 @@
/// Prints a funny message, exists so I can override it to print a different message
/datum/action/cooldown/spell/conjure_item/clown_pockets/proc/cast_message(mob/cast_on)
cast_on.visible_message(span_notice("[cast_on] reaches far deeper into [cast_on.p_their()] pockets than you think \
should be possible and starts rummaging around for something."))
should be possible and starts rummaging around for something."), span_notice("You reach further down into your \
pockets than you ever have before and feel around for something."))

/// Longer cooldown variant which is attached to the enchanted clown suit
/datum/action/cooldown/spell/conjure_item/clown_pockets/enchantment
name = "Enchanted Clown Pockets"
cooldown_time = 60 SECONDS

/datum/action/cooldown/spell/conjure_item/clown_pockets/enchantment/cast_message(mob/cast_on)
cast_on.visible_message(span_notice("[cast_on] starts rummaging around in [cast_on.p_their()] comically large pants."))
cast_on.visible_message(span_notice("[cast_on] starts rummaging around in [cast_on.p_their()] comically large pants."), span_notice("You \
start rummaging around in your comically large pants."))

/// Enchanted clown suit
/obj/item/clothing/under/rank/civilian/clown/magic
Expand Down
2 changes: 2 additions & 0 deletions code/modules/spells/spell_types/conjure_item/_conjure_item.dm
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@
if(istype(mob_caster))
mob_caster.put_in_hands(created, del_on_fail = delete_on_failure)

post_created(cast_on, created)

return ..()

/// Instantiates the item we're conjuring and returns it.
Expand Down
25 changes: 22 additions & 3 deletions maplestation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -6790,13 +6790,32 @@
#include "maplestation_modules\code\modules\wiremod\component_printer.dm"
#include "maplestation_modules\code\modules\wiremod\shells.dm"
#ifdef MAPLESTATION_STORY_CONTENT
#include "maplestation_modules\story_content\__common_story\code\story_lazy_template.dm"
#include "maplestation_modules\story_content\__common_story\code\story_rapid_status.dm"
#include "maplestation_modules\story_content\__common_story\code\story_rapid_status_datum.dm"
#include "maplestation_modules\story_content\__common_story\code\rapid_statuses\lunar_judge.dm"
#include "maplestation_modules\story_content\__common_story\code\rapid_statuses\rabid_shadowfiend.dm"
#include "maplestation_modules\story_content\__common_story\code\smites\death_from_beyond.dm"
#include "maplestation_modules\story_content\__common_story\code\spells\shadow_knife.dm"
#include "maplestation_modules\story_content\__common_story\code\spells\shadow_steel.dm"
#include "maplestation_modules\story_content\__crit_equipment\code\areas.dm"
#include "maplestation_modules\story_content\__crit_equipment\code\heat_blade.dm"
#include "maplestation_modules\story_content\__crit_equipment\code\pendant.dm"
#include "maplestation_modules\story_content\__crit_equipment\code\spells.dm"
#include "maplestation_modules\story_content\__crit_equipment\code\library\invitation.dm"
#include "maplestation_modules\story_content\__crit_equipment\code\library\lazy_templates.dm"
#include "maplestation_modules\story_content\__crit_equipment\code\library\weapons.dm"
#include "maplestation_modules\story_content\__crit_equipment\code\rapid_statuses\_cosmos.dm"
#include "maplestation_modules\story_content\__crit_equipment\code\rapid_statuses\herald_of_cosmos.dm"
#include "maplestation_modules\story_content\__crit_equipment\code\rapid_statuses\prince_of_cosmos.dm"
#include "maplestation_modules\story_content\__crit_equipment\code\rapid_statuses\princess_of_cosmos.dm"
#include "maplestation_modules\story_content\__crit_equipment\code\rapid_statuses\silvered_huntress.dm"
#include "maplestation_modules\story_content\__crit_equipment\code\tevetia_spells\dark_forging.dm"
#include "maplestation_modules\story_content\__crit_equipment\code\tevetia_spells\dark_smoke.dm"
#include "maplestation_modules\story_content\albert_equipment\code\albertclothing.dm"
#include "maplestation_modules\story_content\albert_equipment\code\albertitem.dm"
#include "maplestation_modules\story_content\alraune_miscitems\code\alrmiscitem.dm"
#include "maplestation_modules\story_content\armored_corps\code\clothing\aylie_cloak.dm"
#include "maplestation_modules\story_content\armored_corps\code\mecha_weapons\gauss_override.dm"
#include "maplestation_modules\story_content\armored_corps\code\mecha_weapons\laser_override.dm"
#include "maplestation_modules\story_content\armored_corps\code\mecha_weapons\ppc_override.dm"
#include "maplestation_modules\story_content\armored_corps\code\melee\void_blade.dm"
#include "maplestation_modules\story_content\bell_equipment\code\bellclothing.dm"
#include "maplestation_modules\story_content\enma_equipment\code\enmaclothes.dm"
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
A common folder for story-related code and icons, for things to share or things that can't be easily split off into their own folders.
Original file line number Diff line number Diff line change
@@ -0,0 +1,56 @@
/datum/story_rapid_status/lunar_judge
name = "Lunar Judge"

/datum/story_rapid_status/lunar_judge/apply(mob/living/carbon/human/selected)
var/list/datum/action/cooldown/spell/spells_to_grant = list(
/datum/action/cooldown/spell/jaunt/ethereal_jaunt/lunar,
/datum/action/cooldown/spell/summonitem,
)

grant_spell_list(selected, spells_to_grant, TRUE)

var/obj/item/toy/the_moon_itself/new_moon = new(selected)
selected.equip_conspicuous_item(new_moon)

return TRUE

/datum/action/cooldown/spell/jaunt/ethereal_jaunt/lunar
name = "Judge's Jaunt"

background_icon_state = "bg_hive"
overlay_icon_state = "bg_demon_border"
cooldown_time = 12 SECONDS
cooldown_reduction_per_rank = 0 SECONDS
sound = 'sound/magic/cosmic_energy.ogg'
exit_jaunt_sound = 'sound/magic/cosmic_energy.ogg'

/obj/item/toy/the_moon_itself
name = "The Moon"
desc = "Where did you even get this? I swear there's lunar colonies, are those people shrunk or dead?"
icon = 'maplestation_modules/story_content/__common_story/icons/literally_just_the_moon.dmi'
icon_state = "moon"
inhand_icon_state = "minimeteor"
w_class = WEIGHT_CLASS_SMALL

force = 20
throwforce = 99
max_integrity = 500000
resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF
armor_type = /datum/armor/the_moon_itself

/datum/armor/the_moon_itself
melee = 65
bullet = 70
laser = 90 // highly reflective
energy = 80
consume = 100
bomb = 95
fire = 100
acid = 90

/obj/item/toy/the_moon_itself/throw_impact(atom/hit_atom, datum/thrownthing/throwingdatum)
. = ..()
playsound(src, 'sound/effects/meteorimpact.ogg', 40, TRUE)
for(var/mob/M in urange(10, src))
if(!M.stat && !isAI(M))
shake_camera(M, 3, 1)
Original file line number Diff line number Diff line change
@@ -0,0 +1,40 @@
/datum/story_rapid_status/rabid_shadowfiend
name = "Rabid Shadowfiend"

var/list/datum/action/cooldown/spell/spells_to_grant = list(
/datum/action/cooldown/spell/jaunt/shadow_walk,
/datum/action/cooldown/spell/aoe/flicker_lights,
/datum/action/cooldown/spell/conjure_item/ice_knife/shadow_knife,
)

/datum/story_rapid_status/rabid_shadowfiend/apply(mob/living/carbon/human/selected)
grant_spell_list(selected, spells_to_grant, TRUE)

clawify(selected, BODY_ZONE_L_ARM, 10, 15, 20)
clawify(selected, BODY_ZONE_R_ARM, 10, 15, 20)

return TRUE

/datum/story_rapid_status/rabid_shadowfiend/proc/clawify(mob/living/carbon/human/selected, bodyzone, damage_low, damage_high, effectiveness)
var/obj/item/bodypart/arm/selected_arm = selected.get_bodypart(bodyzone) // your fists are now claws
selected_arm.unarmed_attack_verbs = list("slash")
selected_arm.grappled_attack_verb = "lacerate"
selected_arm.unarmed_attack_effect = ATTACK_EFFECT_CLAW
selected_arm.unarmed_attack_sound = 'sound/weapons/slash.ogg'
selected_arm.unarmed_miss_sound = 'sound/weapons/slashmiss.ogg'
selected_arm.unarmed_damage_low = damage_low
selected_arm.unarmed_damage_high = damage_high
selected_arm.unarmed_effectiveness = effectiveness
selected_arm.appendage_noun = "clawed hand"


/datum/story_rapid_status/rabid_shadowfiend/strong
name = "Rabid Shadowfiend (Strong)"

spells_to_grant = list(
/datum/action/cooldown/spell/jaunt/shadow_walk,
/datum/action/cooldown/spell/aoe/flicker_lights,
/datum/action/cooldown/spell/conjure_item/ice_knife/shadow_knife,
/datum/action/cooldown/spell/pointed/projectile/furious_steel/shadow_steel,
)

Original file line number Diff line number Diff line change
@@ -0,0 +1,58 @@
/// Slashes up the target like bloodless, but SLOWLY
/datum/smite/death_from_beyond
name = "Death from Beyond"
var/strength
var/how_many = 1

/datum/smite/death_from_beyond/configure(client/user)
var/static/list/knowledge_forbidenness = list("Low", "Moderate", "High", "DEATH")
strength = input(user, "How much do you hate this person?") in knowledge_forbidenness

/datum/smite/death_from_beyond/effect(client/user, mob/living/target)
. = ..()
if(!iscarbon(target))
to_chat(user, span_warning("This must be used on a carbon mob."), confidential = TRUE)
return
var/mob/living/carbon/carbon_target = target

switch(strength)
if("Low")
how_many = 3
if("Moderate")
how_many = 4
if("High")
how_many = 5
if("DEATH")
how_many = 10

to_chat(target, span_boldwarning("Cuts rapidly appear all over you as entities from beyond start attacking you!"))

ultra_murder(carbon_target)

/datum/smite/death_from_beyond/proc/ultra_murder(mob/living/carbon/carbon_target)
var/picked_severity
switch(strength)
if("Low")
picked_severity = pick_weight(list(
WOUND_SEVERITY_MODERATE = 2,
WOUND_SEVERITY_SEVERE = 1,
))
if("Moderate")
picked_severity = pick_weight(list(
WOUND_SEVERITY_MODERATE = 1,
WOUND_SEVERITY_SEVERE = 2,
WOUND_SEVERITY_CRITICAL = 1,
))
if("High")
picked_severity = pick_weight(list(
WOUND_SEVERITY_MODERATE = 1,
WOUND_SEVERITY_SEVERE = 1,
WOUND_SEVERITY_CRITICAL = 3,
))
if("DEATH")
picked_severity = WOUND_SEVERITY_CRITICAL

carbon_target.cause_wound_of_type_and_severity(WOUND_SLASH, null, picked_severity)
how_many--
if(how_many > 0)
addtimer(CALLBACK(src, PROC_REF(ultra_murder), carbon_target), rand(0.5 SECONDS, 1 SECONDS), TIMER_DELETE_ME)
Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
/datum/action/cooldown/spell/conjure_item/ice_knife/shadow_knife
name = "Shadow Knife"
desc = "Summon a temporary knife from pure shadow."
background_icon_state = "bg_cult"
overlay_icon_state = "bg_cult_border"
mana_cost = 0
item_type = /obj/item/knife/combat/ice/shadow

cooldown_time = 90 SECONDS
invocation = "Tai'loda."

/obj/item/knife/combat/ice/shadow
name = "shadow knife"
color = "#000000"
desc = "A knife made of concentrated shadow. It won't exist forever. Nothing does."
force = 15
throwforce = 15

/obj/item/knife/combat/ice/shadow/Initialize(mapload)
. = ..()
expire_time = world.time + 40 SECONDS
RegisterSignal(src, COMSIG_ITEM_DROPPED, PROC_REF(on_drop))

// Expires on drop unlike the regular knife.
/obj/item/knife/combat/ice/shadow/proc/on_drop(atom/source)
expire()
Original file line number Diff line number Diff line change
@@ -0,0 +1,75 @@
/datum/action/cooldown/spell/pointed/projectile/furious_steel/shadow_steel
name = "Shadow Steel"
desc = "Summon two shadow blades which orbit you. \
While orbiting you, these blades will protect you from from attacks, but will be consumed on use. \
Additionally, you can click to fire the blades at a target, dealing damage and causing bleeding."
background_icon_state = "bg_cult"
overlay_icon_state = "bg_cult_border"

invocation = span_notice("<b>%CASTER</b> holds out their arm forwards, commanding a blade to fire.")
invocation_self_message = span_notice("You hold your arm forward.")
invocation_type = INVOCATION_EMOTE

active_msg = "You summon forth two blades from darkness."
deactive_msg = "You conceal your black blades."
cast_range = 20
projectile_type = /obj/projectile/shadow_steel
projectile_amount = 2

time_between_blades = 1 SECONDS

applied_status = /datum/status_effect/protective_blades/shadow

/obj/projectile/shadow_steel
name = "blade"
icon = 'icons/obj/service/kitchen.dmi'
icon_state = "knife"
speed = 2
damage = 15
sharpness = SHARP_EDGED
wound_bonus = 20
pass_flags = PASSTABLE | PASSFLAPS

/obj/projectile/shadow_steel/Initialize(mapload)
. = ..()
add_filter("knife_color", 1, list("type" = "color", "color" = "#000000"))
add_filter("knife", 2, list("type" = "outline", "color" = "#640000", "size" = 1))

/obj/projectile/shadow_steel/prehit_pierce(atom/hit)
if(isliving(hit) && isliving(firer))
var/mob/living/caster = firer
var/mob/living/victim = hit
if(caster == victim)
return PROJECTILE_PIERCE_PHASE

if(caster.mind) // probably not going to be used in this one but whatever
var/datum/antagonist/heretic_monster/monster = victim.mind?.has_antag_datum(/datum/antagonist/heretic_monster)
if(monster?.master == caster.mind)
return PROJECTILE_PIERCE_PHASE

if(victim.can_block_magic(MAGIC_RESISTANCE))
visible_message(span_warning("[src] drops to the ground and dissolves on contact [victim]!"))
return PROJECTILE_DELETE_WITHOUT_HITTING

return ..()

/datum/status_effect/protective_blades/shadow

/// overriden to make it use shadow blades
/datum/status_effect/protective_blades/shadow/create_blade()
if(QDELETED(src) || QDELETED(owner))
return

var/obj/effect/floating_blade/shadow/blade = new(get_turf(owner))
blades += blade
blade.orbit(owner, blade_orbit_radius)
RegisterSignal(blade, COMSIG_QDELETING, PROC_REF(remove_blade))
playsound(get_turf(owner), 'sound/items/unsheath.ogg', 33, TRUE)

/obj/effect/floating_blade/shadow
name = "shadow knife"
glow_color = "#640000"

/obj/effect/floating_blade/shadow/Initialize(mapload)
. = ..()
add_filter("knife_color", 1, list("type" = "color", "color" = "#000000"))
Loading