Skip to content

Commit

Permalink
Merge pull request #1016 from Onutsio/psydongmusic
Browse files Browse the repository at this point in the history
  • Loading branch information
Lutowski authored Dec 11, 2024
2 parents 8031097 + 56f713c commit 2613ff3
Show file tree
Hide file tree
Showing 15 changed files with 264 additions and 9 deletions.
1 change: 1 addition & 0 deletions _maps/map_files/dun_manor/dun_manor.dmm
Original file line number Diff line number Diff line change
Expand Up @@ -1542,6 +1542,7 @@
icon_state = "longtable"
},
/obj/item/natural/feather,
/obj/item/psydonmusicbox,
/turf/open/floor/rogue/herringbone,
/area/rogue/under/town/basement)
"bjK" = (
Expand Down
2 changes: 2 additions & 0 deletions code/__DEFINES/traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@
#define TRAIT_GUARDSMAN "Vigilant Guardsman"
#define TRAIT_KNIGHTSMAN "Royal Defiance"
#define TRAIT_WOODSMAN "Talented Woodsman"
#define TRAIT_INQUISITION "Member of the Otavan Inquisition"

//Hearthstone port (Tracking)
#define TRAIT_PERFECT_TRACKER "Perfect Tracker" //Will always find any tracks and analyzes them perfectly.
Expand Down Expand Up @@ -101,6 +102,7 @@ GLOBAL_LIST_INIT(roguetraits, list(
TRAIT_GUARDSMAN = span_info("I am vigilant in my duties. In the town of Azure Peak, my abilities are sharper due to my routine and familiarity."),
TRAIT_WOODSMAN = span_info("I am vigilant in my duties. In the grove and coast of Azure Peak, my abilities are sharper due to my routine and familiarity."),
TRAIT_KNIGHTSMAN = span_info("I am a stalwart defender of the crown. In the keep of Azure Peak, my abilities are sharper due to my routine and familiarity."),
TRAIT_INQUISITION = span_info("I am a member of the Otavan Inquisition. I can easily identify others of my cadre at a glance."),
TRAIT_CHOSEN = "Astrata choose you to represent her glory.",
TRAIT_WEBWALK = "I can move freely between webs.",
TRAIT_NOSTINK = span_dead("My nose is numb to the smell of decay."),
Expand Down
27 changes: 27 additions & 0 deletions code/datums/status_effects/rogue/roguebuff.dm
Original file line number Diff line number Diff line change
Expand Up @@ -381,4 +381,31 @@
to_chat(owner, span_warning("My feeble mind muddies my warcraft once more."))
REMOVE_TRAIT(owner, TRAIT_GUIDANCE, MAGIC_TRAIT)

#define CRANKBOX_FILTER "crankboxbuff_glow"
/atom/movable/screen/alert/status_effect/buff/churnerprotection
name = "Magick Distorted"
desc = "The wailing box is disrupting magicks around me!"
icon_state = "buff"

/datum/status_effect/buff/churnerprotection
var/outline_colour = "#fad55a"
id = "soulchurnerprotection"
alert_type = /atom/movable/screen/alert/status_effect/buff/churnerprotection
duration = 20 SECONDS

/datum/status_effect/buff/churnerprotection/on_apply()
. = ..()
var/filter = owner.get_filter(CRANKBOX_FILTER)
if (!filter)
owner.add_filter(CRANKBOX_FILTER, 2, list("type" = "outline", "color" = outline_colour, "alpha" = 200, "size" = 1))
to_chat(owner, span_warning("I feel the wailing box distorting magicks around me!"))
ADD_TRAIT(owner, TRAIT_ANTIMAGIC, MAGIC_TRAIT)

/datum/status_effect/buff/churnerprotection/on_remove()
. = ..()
to_chat(owner, span_warning("The wailing box's protection fades..."))
owner.remove_filter(CRANKBOX_FILTER)
REMOVE_TRAIT(owner, TRAIT_ANTIMAGIC, MAGIC_TRAIT)

#undef CRANKBOX_FILTER
#undef MIRACLE_HEALING_FILTER
17 changes: 17 additions & 0 deletions code/datums/stress/negative_events.dm
Original file line number Diff line number Diff line change
Expand Up @@ -276,3 +276,20 @@
stressadd = 1
desc = span_red("Eating such a meal without a table? Churlish.")
timer = 2 MINUTES


/datum/stressevent/soulchurnerhorror
timer = 10 SECONDS
stressadd = 50
desc = span_red("The horrid wails of the dead call for relief! WHAT HAVE I DONE?!")

/datum/stressevent/soulchurner
timer = 1 MINUTES
stressadd = 10
desc = span_red("The horrid wails of the dead call for relief!")


/datum/stressevent/soulchurnerpsydon
timer = 1 MINUTES
stressadd = 1
desc = span_red("The horrid wails of the dead call for relief! I can ENDURE such calls...")
187 changes: 187 additions & 0 deletions code/game/objects/items/rogueitems/inquisitionrelics.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,187 @@
// Soul Churner - Music box which applies magic resistance to Inquisition members, greatly mood debuffs everyone not a Psydon worshipper.
/obj/item/psydonmusicbox
name = "melancholic crankbox"
desc = ""
icon_state = "psydonmusicbox"
icon = 'icons/roguetown/items/misc.dmi'
w_class = WEIGHT_CLASS_HUGE
var/cranking = FALSE
force = 15
max_integrity = 100
attacked_sound = 'sound/combat/hits/onwood/education2.ogg'
gripped_intents = list(/datum/intent/hit)
possible_item_intents = list(/datum/intent/hit)
obj_flags = CAN_BE_HIT
twohands_required = TRUE
var/datum/looping_sound/psydonmusicboxsound/soundloop


/obj/item/psydonmusicbox/examine(mob/user)
. = ..()
if(HAS_TRAIT(usr, TRAIT_INQUISITION))
desc = "A relic from the bowels of the Otavan cathedral's thaumaturgical workshops. Fourteen souls of heretics, all bound together, they will scream and protect us from magicks. It would be wise to not teach the heretics of its true nature, to only bring it to bear in dire circumstances."
else
desc = "A cranked music box, it has the seal of the Otavan Inquisition on the side. It carries a somber feeling to it..."

/obj/item/psydonmusicbox/attack_self(mob/living/user)
. = ..()
if(!HAS_TRAIT(usr, TRAIT_INQUISITION))
user.add_stress(/datum/stressevent/soulchurnerhorror)
to_chat(user, (span_cultsmall("I FEEL SUFFERING WITH EVERY CRANK, WHAT AM I DOING?!")))
cranking = !cranking
update_icon()
if(cranking)
user.apply_status_effect(/datum/status_effect/buff/cranking_soulchurner)
soundloop.start()
var/songhearers = view(7, user)
for(var/mob/living/carbon/human/target in songhearers)
to_chat(target,span_cultsmall("[user] begins cranking the soul churner..."))
if(!cranking)
soundloop.stop()
user.remove_status_effect(/datum/status_effect/buff/cranking_soulchurner)

/obj/item/psydonmusicbox/Initialize()
soundloop = new(list(src), FALSE)
. = ..()

/obj/item/psydonmusicbox/Destroy()
if(soundloop)
QDEL_NULL(soundloop)
src.visible_message(span_cult("A great deluge of souls escapes the shattered box!"))
return ..()

/obj/item/psydonmusicbox/update_icon()
if(cranking)
icon_state = "psydonmusicbox_active"
else
icon_state = "psydonmusicbox"

/obj/item/psydonmusicbox/dropped(mob/living/user, silent)
..()
cranking = FALSE
update_icon()
if(soundloop)
soundloop.stop()
user.remove_status_effect(/datum/status_effect/buff/cranking_soulchurner)

/obj/item/psydonmusicbox/getonmobprop(tag)
. = ..()
if(tag)
switch(tag)
if("gen")
return list("shrink" = 0.6,"sx" = -1,"sy" = 0,"nx" = 11,"ny" = 1,"wx" = 0,"wy" = 1,"ex" = 4,"ey" = 0,"northabove" = 0,"southabove" = 1,"eastabove" = 1,"westabove" = 0,"nturn" = 15,"sturn" = 0,"wturn" = 0,"eturn" = 39,"nflip" = 8,"sflip" = 0,"wflip" = 0,"eflip" = 8)

/atom/movable/screen/alert/status_effect/buff/cranking_soulchurner
name = "Cranking Soulchurner"
desc = "I am bringing the twisted device to life..."
icon_state = "buff"

/datum/status_effect/buff/cranking_soulchurner
id = "crankchurner"
alert_type = /atom/movable/screen/alert/status_effect/buff/cranking_soulchurner
var/effect_color
var/pulse = 0
var/ticks_to_apply = 10
var/astratanlines =list("'HER LIGHT HAS LEFT ME! WHERE AM I?!'", "'SHATTER THIS CONTRAPTION, SO I MAY FEEL HER WARMTH ONE LAST TIME!'", "'I am royal.. Why did they do this to me...?'")
var/noclines =list("'Colder than moonlight...'", "'No wisdom can reach me here...'", "'Please help me, I miss the stars...'")
var/necralines =list("'They snatched me from her grasp, for eternal torment...'", "'Necra! Please! I am so tired! Release me!'", "'I am lost, lost in a sea of stolen ends.'")
var/abyssorlines =list("'I cannot feel the coast's breeze...'", "'We churn tighter here than schooling fish...'", "'Free me, please, so I may return to the sea...'")
var/ravoxlines =list("'Ravoxian kin! Tear this Otavan dog's head off! Free me from this damnable witchery!'", "'There is no justice nor glory to be found here, just endless fatigue...'", "'I begged for a death by the sword...'")
var/pestralines =list("'I only wanted to perfect my cures...'", "'A thousand plagues upon the holder of this accursed machine! Pestra! Can you not hear me?!'", "'I can feel their suffering as they brush against me...'")
var/eoralines =list("'Every caress feels like a thousand splintering bones...'", "'She was a heretic, but how could I hurt her?!'", "'I'm sorry! I only wanted peace! Please release me!'")
var/dendorlines =list("'HIS MADNESS CALLS FOR ME! RRGHNN...'", "'SHATTER THIS BOX, SO WE MAY CHOKE THIS OTAVAN ON DIRT AND ROOTS!'", "'I miss His voice in the leaves... Free me, please...'")
var/xylixlines =list("'ONE, TWO, THREE, FOUR- TWO, TWO, THREE, FOUR. --What do you mean, annoying?'", "'There are thirteen others in here, you know! What a good audience- they literally can't get out of their seats!'", "'Of course I went all-in! I thought he had an ace-high!'", "'No, the XYLIX'S FORTUNE was right- this definitely is quite bad.'")
var/malumlines =list("'The structure of this cursed machine is malleable.. Shatter it, please...'", "'My craft could've changed the world...'", "'Free me, so I may return to my apprentice, please...'")
var/matthioslines =list("'My final transaction... He will never receive my value... Stolen away by these monsters...'", "'Comrade, I have been shackled into this HORRIFIC CONTRAPTION, FREE ME!'", "'I feel our shackles twist with eachother's...'")
var/zizolines =list("'ZAELORION! MY MAGICKS FAIL ME! STRIKE DOWN THESE PSYDONIAN DOGS!'", "'CABALIST? There is TWISTED MAGICK HERE, BEWARE THE MUSIC! OUR VOICES ARE FORCED!'", "'DESTROY THE BOX, KILL THE WIELDER. YOUR MAGICKS WILL BE FREE.'")
var/graggarlines =list("'ANOINTED! TEAR THIS OTAVAN'S HEAD OFF!'", "'ANOINTED! SHATTER THE BOX, AND WE WILL KILL THEM TOGETHER!'", "'GRAGGAR, GIVE ME STRENGTH TO BREAK MY BONDS!'")
var/baothalines =list("'I miss the warmth of ozium... There is no feeling in here for me...'", "'Debauched one, rescue me from this contraption, I have such things to share with you.'", "'MY PERFECTION WAS TAKEN FROM ME BY THESE OTAVAN MONSTERS!'")
var/psydonianlines =list("'FREE US! FREE US! WE HAVE SUFFERED ENOUGH!'", "'PLEASE, RELEASE US!", "WE MISS OUR FAMILIES'", "'WHEN WE ESCAPE, WE ARE GOING TO CHASE YOU INTO YOUR GRAVE.'")


/datum/status_effect/buff/cranking_soulchurner/on_creation(mob/living/new_owner, stress, colour)
effect_color = "#800000"
return ..()

/datum/status_effect/buff/cranking_soulchurner/tick()
var/obj/effect/temp_visual/music_rogue/M = new /obj/effect/temp_visual/music_rogue(get_turf(owner))
M.color = "#800000"
pulse += 1
if (pulse >= ticks_to_apply)
pulse = 0
if(!HAS_TRAIT(owner, TRAIT_INQUISITION))
owner.add_stress(/datum/stressevent/soulchurnerhorror)
for (var/mob/living/carbon/human/H in hearers(7, owner))
if (!H.client)
continue
if (!H.has_stress_event(/datum/stressevent/soulchurner))
switch(H.patron?.type)
if(/datum/patron/old_god)
if (!H.has_stress_event(/datum/stressevent/soulchurnerpsydon))
H.add_stress(/datum/stressevent/soulchurnerpsydon)
to_chat(H, (span_hypnophrase("A voice calls out from the song for you...")))
to_chat(H, (span_cultsmall(pick(psydonianlines))))
if(HAS_TRAIT(H, TRAIT_INQUISITION))
H.apply_status_effect(/datum/status_effect/buff/churnerprotection)
if(/datum/patron/inhumen/matthios)
to_chat(H, (span_hypnophrase("A voice calls out from the song for you...")))
to_chat(H, (span_cultsmall(pick(matthioslines))))
H.add_stress(/datum/stressevent/soulchurner)
if(/datum/patron/inhumen/zizo)
to_chat(H, (span_hypnophrase("A voice calls out from the song for you...")))
to_chat(H, (span_cultsmall(pick(zizolines))))
H.add_stress(/datum/stressevent/soulchurner)
if(/datum/patron/inhumen/graggar)
to_chat(H, (span_hypnophrase("A voice calls out from the song for you...")))
to_chat(H, (span_cultsmall(pick(graggarlines))))
H.add_stress(/datum/stressevent/soulchurner)
if(/datum/patron/inhumen/baotha)
to_chat(H, (span_hypnophrase("A voice calls out from the song for you...")))
to_chat(H, (span_cultsmall(pick(baothalines))))
H.add_stress(/datum/stressevent/soulchurner)
if(/datum/patron/divine/astrata)
to_chat(H, (span_hypnophrase("A voice calls out from the song for you...")))
to_chat(H, (span_cultsmall(pick(astratanlines))))
H.add_stress(/datum/stressevent/soulchurner)
if(/datum/patron/divine/noc)
to_chat(H, (span_hypnophrase("A voice calls out from the song for you...")))
to_chat(H, (span_cultsmall(pick(noclines))))
H.add_stress(/datum/stressevent/soulchurner)
if(/datum/patron/divine/necra)
to_chat(H, (span_hypnophrase("A voice calls out from the song for you...")))
to_chat(H, (span_cultsmall(pick(necralines))))
H.add_stress(/datum/stressevent/soulchurner)
if(/datum/patron/divine/pestra)
to_chat(H, (span_hypnophrase("A voice calls out from the song for you...")))
to_chat(H, (span_cultsmall(pick(pestralines))))
H.add_stress(/datum/stressevent/soulchurner)
if(/datum/patron/divine/malum)
to_chat(H, (span_hypnophrase("A voice calls out from the song for you...")))
to_chat(H, (span_cultsmall(pick(malumlines))))
H.add_stress(/datum/stressevent/soulchurner)
if(/datum/patron/divine/dendor)
to_chat(H, (span_hypnophrase("A voice calls out from the song for you...")))
to_chat(H, (span_cultsmall(pick(dendorlines))))
H.add_stress(/datum/stressevent/soulchurner)
if(/datum/patron/divine/xylix)
to_chat(H, (span_hypnophrase("A voice calls out from the song for you...")))
to_chat(H, (span_cultsmall(pick(xylixlines))))
H.add_stress(/datum/stressevent/soulchurner)
if(/datum/patron/divine/eora)
to_chat(H, (span_hypnophrase("A voice calls out from the song for you...")))
to_chat(H, (span_cultsmall(pick(eoralines))))
H.add_stress(/datum/stressevent/soulchurner)
if(/datum/patron/divine/abyssor)
to_chat(H, (span_hypnophrase("A voice calls out from the song for you...")))
to_chat(H, (span_cultsmall(pick(abyssorlines))))
H.add_stress(/datum/stressevent/soulchurner)
if(/datum/patron/divine/ravox)
to_chat(H, (span_hypnophrase("A voice calls out from the song for you...")))
to_chat(H, (span_cultsmall(pick(ravoxlines))))
H.add_stress(/datum/stressevent/soulchurner)

/datum/looping_sound/psydonmusicboxsound
mid_sounds = list('sound/magic/psydonmusicbox.ogg')
mid_length = 320
volume = 50
extra_range = 10
1 change: 1 addition & 0 deletions code/modules/clothing/rogueclothes/hats.dm
Original file line number Diff line number Diff line change
Expand Up @@ -1366,6 +1366,7 @@
desc = "A hood worn by those who favor Psydon. Forever enduring!"
icon_state = "psydonhood"
item_state = "psydonhood"
color = null
body_parts_covered = NECK
slot_flags = ITEM_SLOT_HEAD
dynamic_hair_suffix = ""
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -21,22 +21,26 @@
H.mind.adjust_skillrank(/datum/skill/misc/stealing, 5, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/lockpicking, 5, TRUE)
H.mind.adjust_skillrank(/datum/skill/misc/tracking, 4, TRUE)
H.mind.adjust_skillrank(/datum/skill/combat/crossbows, 4, TRUE)
cloak = /obj/item/clothing/suit/roguetown/armor/longcoat
beltr = /obj/item/rogueweapon/mace/cudgel
wrists = /obj/item/clothing/neck/roguetown/psicross/silver
gloves = /obj/item/clothing/gloves/roguetown/leather/black
beltl = /obj/item/rogueweapon/huntingknife/idagger/steel
beltr = /obj/item/quiver/bolts
backr = /obj/item/storage/backpack/rogue/satchel/black
belt = /obj/item/storage/belt/rogue/leather
backl = /obj/item/gun/ballistic/revolver/grenadelauncher/crossbow
belt = /obj/item/storage/belt/rogue/leather/knifebelt/black/psydon
pants = /obj/item/clothing/under/roguetown/trou/leather
armor = /obj/item/clothing/suit/roguetown/armor/leather/studded
shirt = /obj/item/clothing/suit/roguetown/shirt/shortshirt/random
shoes = /obj/item/clothing/shoes/roguetown/boots
mask = /obj/item/clothing/mask/rogue/facemask/psydonmask
head = /obj/item/clothing/head/roguetown/roguehood/psydon
backpack_contents = list(/obj/item/roguekey/inquisition = 1, /obj/item/lockpickring/mundane = 1)
backpack_contents = list(/obj/item/roguekey/inquisition = 1, /obj/item/lockpickring/mundane = 1, /obj/item/rogueweapon/mace/cudgel)
H.change_stat("strength", -1) // weasel
H.change_stat("endurance", 3)
H.change_stat("perception", 2)
H.change_stat("speed", 3)
ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_INQUISITION, TRAIT_GENERIC)
Original file line number Diff line number Diff line change
Expand Up @@ -36,6 +36,7 @@
H.change_stat("perception", -1)
ADD_TRAIT(H, TRAIT_DODGEEXPERT, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_INQUISITION, TRAIT_GENERIC)

var/datum/devotion/C = new /datum/devotion(H, H.patron)
C.grant_spells_templar(H)
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -45,6 +45,7 @@

ADD_TRAIT(H, TRAIT_HEAVYARMOR, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_INQUISITION, TRAIT_GENERIC)

H.dna.species.soundpack_m = new /datum/voicepack/male/knight()
var/datum/devotion/C = new /datum/devotion(H, H.patron)
Expand All @@ -54,15 +55,15 @@

/datum/outfit/job/roguetown/psydoniantemplar/choose_loadout(mob/living/carbon/human/H)
. = ..()
var/weapons = list("Bastard Sword","Flail","Mace")
var/weapons = list("Bastard Sword","Whip","Executioner Sword")
var/weapon_choice = input(H,"Choose your weapon.", "TAKE UP ARMS") as anything in weapons
switch(weapon_choice)
if("Bastard Sword")
H.put_in_hands(new /obj/item/rogueweapon/sword/long(H), TRUE)
H.mind.adjust_skillrank(/datum/skill/combat/swords, 1, TRUE)
if("Flail")
H.put_in_hands(new /obj/item/rogueweapon/flail(H), TRUE)
if("Whip")
H.put_in_hands(new /obj/item/rogueweapon/whip(H), TRUE)
H.mind.adjust_skillrank(/datum/skill/combat/whipsflails, 1, TRUE)
if("Mace")
H.put_in_hands(new /obj/item/rogueweapon/mace(H), TRUE)
H.mind.adjust_skillrank(/datum/skill/combat/maces, 1, TRUE)
if("Executioner Sword")
H.put_in_hands(new /obj/item/rogueweapon/sword/long/exe(H), TRUE)
H.mind.adjust_skillrank(/datum/skill/combat/swords, 1, TRUE)
Original file line number Diff line number Diff line change
Expand Up @@ -65,6 +65,7 @@
ADD_TRAIT(H, TRAIT_STEELHEARTED, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_MEDIUMARMOR, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_SILVER_BLESSED, TRAIT_GENERIC)
ADD_TRAIT(H, TRAIT_INQUISITION, TRAIT_GENERIC)

/mob/living/carbon/human/proc/torture_victim()
set name = "Extract Confession"
Expand Down
12 changes: 12 additions & 0 deletions code/modules/mob/living/carbon/human/examine.dm
Original file line number Diff line number Diff line change
Expand Up @@ -98,6 +98,9 @@
var/heretic_text = get_heretic_text(user)
if(heretic_text)
. += span_notice(heretic_text)
var/inquisition_text =get_inquisition_text(user)
if(inquisition_text)
. +=span_notice(inquisition_text)

if(leprosy == 1)
. += span_necrosis("A LEPER...")
Expand Down Expand Up @@ -578,6 +581,15 @@

return heretic_text


// Used for Inquisition tags
/mob/living/proc/get_inquisition_text(mob/examiner)
var/inquisition_text
if(HAS_TRAIT(src, TRAIT_INQUISITION) && HAS_TRAIT(examiner, TRAIT_INQUISITION))
inquisition_text += "Fellow Member of the Inquisition"

return inquisition_text

/// Returns antagonist-related examine text for the mob, if any. Can return null.
/mob/living/proc/get_villain_text(mob/examiner)
var/villain_text
Expand Down
Binary file modified icons/roguetown/clothing/head.dmi
Binary file not shown.
Binary file modified icons/roguetown/items/misc.dmi
Binary file not shown.
1 change: 1 addition & 0 deletions roguetown.dme
Original file line number Diff line number Diff line change
Expand Up @@ -1227,6 +1227,7 @@
#include "code\game\objects\items\rogueitems\dmusicbox.dm"
#include "code\game\objects\items\rogueitems\flintsparker.dm"
#include "code\game\objects\items\rogueitems\gems.dm"
#include "code\game\objects\items\rogueitems\inquisitionrelics.dm"
#include "code\game\objects\items\rogueitems\instruments.dm"
#include "code\game\objects\items\rogueitems\keyrings.dm"
#include "code\game\objects\items\rogueitems\keys.dm"
Expand Down
Binary file added sound/magic/psydonmusicbox.ogg
Binary file not shown.

0 comments on commit 2613ff3

Please sign in to comment.