Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
22 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
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
23 changes: 20 additions & 3 deletions maplestation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -6790,13 +6790,30 @@
#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\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_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"))
Original file line number Diff line number Diff line change
@@ -0,0 +1,45 @@
/datum/lazy_template/story
map_dir = "maplestation_modules/story_content/_maps/templates/lazy_templates"
// The name of the map that's shown to the user
var/shown_map_name

// version of the lazy template loader with story maps instead
ADMIN_VERB(load_story_lazy_template, R_ADMIN, "Load/Jump Story Lazy Template", "Loads a lazy template and/or jumps to it.", ADMIN_CATEGORY_EVENTS)
var/list/choices = new()
for(var/datum/lazy_template/story/template as anything in subtypesof(/datum/lazy_template/story))
choices += template.shown_map_name
choices[template.shown_map_name] += template.key

var/choice = tgui_input_list(user, "Key?", "Lazy Loader", choices)
if(!choice)
return

choice = choices[choice]
if(!choice)
to_chat(user, span_warning("No template with that key found, report this!"))
return

var/already_loaded = LAZYACCESS(SSmapping.loaded_lazy_templates, choice)
var/force_load = FALSE
if(already_loaded && (tgui_alert(user, "Template already loaded.", "", list("Jump", "Load Again")) == "Load Again"))
force_load = TRUE

var/datum/turf_reservation/reservation = SSmapping.lazy_load_template(choice, force = force_load)
if(!reservation)
to_chat(user, span_boldwarning("Failed to load template!"))
return

message_admins("[key_name_admin(user)] has loaded lazy template '[choice]'")
if(!already_loaded || force_load)
if(tgui_alert(user, "Do you want to observe the newly loaded lazy template? (Will admin ghost if not already an observer.)", "Check Loaded Template?", list("Yes", "No")) == "Yes")
if(!isobserver(user.mob))
SSadmin_verbs.dynamic_invoke_verb(user, /datum/admin_verb/admin_ghost)
user.mob.forceMove(reservation.bottom_left_turfs[1])
to_chat(user, span_boldnicegreen("Template loaded, you have been moved to the bottom left of the reservation."))
else
to_chat(user, span_boldnicegreen("Template loaded."))
else // repeat of the admin_ghost/forcemove code, not many cleaner ways of doing this
if(!isobserver(user.mob))
SSadmin_verbs.dynamic_invoke_verb(user, /datum/admin_verb/admin_ghost)
user.mob.forceMove(reservation.bottom_left_turfs[1])
to_chat(user, span_boldnicegreen("Template loaded, you have been moved to the bottom left of the reservation."))
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
//Rapid status, a way to make a lot of changes to a mob quickly, albeit preset. Hopefully eventually replaced with JSON. Pretty much taken from the "make me tanky" menu
#define VV_STORY_RAPID_STATUS "story_rapid_status"

/mob/living/carbon/human/vv_get_dropdown()
. = ..()
VV_DROPDOWN_OPTION(VV_STORY_RAPID_STATUS, "Story Rapid Status")

/mob/living/carbon/human/vv_do_topic(list/href_list)
. = ..()

if(href_list[VV_STORY_RAPID_STATUS])
if(!check_rights(R_SPAWN))
return

var/list/options = new()

for(var/datum/story_rapid_status/status as anything in subtypesof(/datum/story_rapid_status))
if(status.selectable)
options += status.name
options[status.name] += status

var/result = tgui_input_list(usr, "Pick something. You can also cancel with \"Cancel\".", "Rapid Status", options + "Cancel")
if(QDELETED(src) || !result || result == "Cancel")
return
var/datum/story_rapid_status/picked = options[result]
picked = new picked()

if(!picked)
return
message_admins("[key_name(usr)] has rapidly given [key_name(src)] the following preset: [result]")
log_admin("[key_name(usr)] has rapidly given [key_name(src)] the following preset: [result]")

picked.apply(selected = src)
Loading
Loading