From f45aa2613e54e9b4390f878bdd100a03ac72db8d Mon Sep 17 00:00:00 2001
From: Marmio64 <60946370+Marmio64@users.noreply.github.com>
Date: Tue, 22 Feb 2022 08:56:55 -0600
Subject: [PATCH 01/30] demon spells, objectives, more
---
code/__DEFINES/role_preferences.dm | 4 +-
code/__DEFINES/{yogs_defines}/antagonists.dm | 1 +
code/modules/antagonists/demon/demons.dm | 155 ++++++++++++++++++
.../antagonists/demon/general_powers.dm | 65 ++++++++
code/modules/antagonists/demon/objectives.dm | 17 ++
code/modules/antagonists/demon/sins/envy.dm | 40 +++++
.../antagonists/demon/sins/gluttony.dm | 47 ++++++
code/modules/antagonists/demon/sins/greed.dm | 17 ++
code/modules/antagonists/demon/sins/pride.dm | 18 ++
code/modules/antagonists/demon/sins/wrath.dm | 39 +++++
code/modules/events/sinfuldemon.dm | 62 +++++++
.../chemistry/reagents/other_reagents.dm | 19 +++
.../ruins/objects_and_mobs/sin_ruins.dm | 3 +
.../spells/spell_types/inflict_handler.dm | 9 +-
icons/mob/actions/actions_minor_antag.dmi | Bin 16036 -> 18390 bytes
icons/mob/actions/actions_spells.dmi | Bin 20646 -> 21216 bytes
icons/mob/hud.dmi | Bin 15817 -> 15961 bytes
icons/mob/mob.dmi | Bin 305860 -> 307835 bytes
tgui/yarn.lock | 36 ++--
yogstation.dme | 9 +
20 files changed, 518 insertions(+), 23 deletions(-)
create mode 100644 code/modules/antagonists/demon/demons.dm
create mode 100644 code/modules/antagonists/demon/general_powers.dm
create mode 100644 code/modules/antagonists/demon/objectives.dm
create mode 100644 code/modules/antagonists/demon/sins/envy.dm
create mode 100644 code/modules/antagonists/demon/sins/gluttony.dm
create mode 100644 code/modules/antagonists/demon/sins/greed.dm
create mode 100644 code/modules/antagonists/demon/sins/pride.dm
create mode 100644 code/modules/antagonists/demon/sins/wrath.dm
create mode 100644 code/modules/events/sinfuldemon.dm
diff --git a/code/__DEFINES/role_preferences.dm b/code/__DEFINES/role_preferences.dm
index 604486e4b9bd..a4a920e0f94d 100644
--- a/code/__DEFINES/role_preferences.dm
+++ b/code/__DEFINES/role_preferences.dm
@@ -47,6 +47,7 @@
#define ROLE_HORROR "Eldritch Horror" // Yogs
#define ROLE_INFILTRATOR "Infiltrator" // Yogs
#define ROLE_ZOMBIE "Zombie"
+#define ROLE_SINFULDEMON "Demon of Sin"
//Missing assignment means it's not a gamemode specific role, IT'S NOT A BUG OR ERROR.
@@ -85,7 +86,8 @@ GLOBAL_LIST_INIT(special_roles, list(
ROLE_DARKSPAWN = /datum/game_mode/darkspawn,
ROLE_SENTIENCE,
ROLE_ZOMBIE = /datum/game_mode/zombie,
- ROLE_FUGITIVE
+ ROLE_FUGITIVE,
+ ROLE_SINFULDEMON
))
//Job defines for what happens when you fail to qualify for any job during job selection
diff --git a/code/__DEFINES/{yogs_defines}/antagonists.dm b/code/__DEFINES/{yogs_defines}/antagonists.dm
index 0cfa66b79b1c..7afc8ce41334 100644
--- a/code/__DEFINES/{yogs_defines}/antagonists.dm
+++ b/code/__DEFINES/{yogs_defines}/antagonists.dm
@@ -5,6 +5,7 @@
#define ANTAG_DATUM_VEIL /datum/antagonist/veil
#define ANTAG_DATUM_INFILTRATOR /datum/antagonist/infiltrator
#define ANTAG_DATUM_HIJACKEDAI /datum/antagonist/hijacked_ai
+#define ANTAG_DATUM_SINFULDEMON /datum/antagonist/sinfuldemon
#define NOT_DOMINATING -1
#define MAX_LEADERS_GANG 3
diff --git a/code/modules/antagonists/demon/demons.dm b/code/modules/antagonists/demon/demons.dm
new file mode 100644
index 000000000000..f4992e6f9057
--- /dev/null
+++ b/code/modules/antagonists/demon/demons.dm
@@ -0,0 +1,155 @@
+#define SIN_GLUTTONY "gluttony"
+#define SIN_GREED "greed"
+#define SIN_SLOTH "sloth"
+#define SIN_WRATH "wrath"
+#define SIN_ENVY "envy"
+#define SIN_PRIDE "pride"
+
+/mob/living/carbon/human/Life()
+ . = ..()
+ if(is_sinfuldemon(src))
+ var/datum/antagonist/sinfuldemon/demon = mind.has_antag_datum(/datum/antagonist/sinfuldemon)
+ demon.sinfuldemon_life()
+
+/datum/antagonist/sinfuldemon
+ name = "Sinful Demon"
+ roundend_category = "demons of sin"
+ antagpanel_category = "Demon"
+ job_rank = ROLE_DEVIL
+ show_to_ghosts = TRUE
+ var/demonsin
+ var/static/list/demonsins = list(SIN_GLUTTONY,SIN_GREED,SIN_WRATH,SIN_ENVY,SIN_PRIDE)
+
+/datum/antagonist/sinfuldemon/proc/sinfuldemon_life()
+ var/mob/living/carbon/C = owner.current
+ if(!C)
+ return
+ if(istype(get_area(C.loc), /area/chapel))
+ demon_burn()
+
+/datum/antagonist/sinfuldemon/proc/demon_burn() //sinful demons are even more vulnerable to the chapel than vampires, but can turn into their true form to negate this.
+ var/mob/living/L = owner.current
+ if(!L)
+ return
+ if(L.stat != DEAD) //demons however wont dust from the chapel so this needs to be a check to avoid spam while they're already dead
+ if(prob(50) && L.health >= 50)
+ switch(L.health)
+ if(85 to 100)
+ L.visible_message(span_warning("[L]'s skin begins to heat up and darken!"), span_danger("Your flesh begins to sear..."))
+ if(60 to 85)
+ L.visible_message(span_warning("[L]'s skin begins to melt apart!"), span_danger("Your skin is melting!"), "You hear sizzling.")
+ L.adjustFireLoss(5)
+ else if(L.health < 60)
+ if(!L.on_fire)
+ L.visible_message(span_warning("[L] lights up in a holy blaze!"), span_danger("Your skin catches fire!"))
+ L.emote("scream")
+ else
+ L.visible_message(span_warning("[L] continues to burn!"), span_danger("You continue to burn!"))
+ L.adjust_fire_stacks(5)
+ L.IgniteMob()
+ return
+
+/datum/antagonist/sinfuldemon/New()
+ . = ..()
+ demonsin = pick(demonsins)
+
+/datum/antagonist/sinfuldemon/proc/forge_objectives()
+ var/datum/objective/demonsingeneral/O
+ switch(demonsin)//the 5 most interesting of the 8 sins. Left out sloth because it sounds boring, couldn't think of a good enough objective/power for acedia, and lust for obvious reasons.
+ if(SIN_GLUTTONY)
+ O = new /datum/objective/demonsingeneral/gluttony
+ if(SIN_GREED)
+ O = new /datum/objective/demonsingeneral/greed
+ if(SIN_WRATH)
+ O = new /datum/objective/demonsingeneral/wrath
+ if(prob(50))
+ var/N = pick(/datum/objective/assassinate, /datum/objective/assassinate/cloned, /datum/objective/assassinate/once)
+ var/datum/objective/assassinate/kill_objective = new N
+ kill_objective.owner = owner
+ kill_objective.find_target()
+ objectives += kill_objective
+ if(SIN_ENVY)
+ O = new /datum/objective/demonsingeneral/envy
+ if(prob(50))
+ var/datum/objective/escape/escape_with_identity/identity_theft = new
+ identity_theft.owner = owner
+ identity_theft.find_target()
+ identity_theft.update_explanation_text()
+ objectives += identity_theft
+ if(SIN_PRIDE)
+ O = new /datum/objective/demonsingeneral/pride
+ objectives += O
+
+/datum/antagonist/sinfuldemon/can_be_owned(datum/mind/new_owner)
+ . = ..()
+ return . && (ishuman(new_owner.current) || iscyborg(new_owner.current))
+
+/proc/is_sinfuldemon(mob/living/M)
+ return M?.mind?.has_antag_datum(/datum/antagonist/sinfuldemon)
+
+/datum/antagonist/sinfuldemon/admin_add(datum/mind/new_owner,mob/admin)
+ var/choices = demonsins + "Random"
+ var/chosen_sin = input(admin,"What kind ?","Sin kind") as null|anything in choices
+ if(!chosen_sin)
+ return
+ if(chosen_sin in demonsins)
+ demonsin = chosen_sin
+ new_owner.add_antag_datum(src)
+ message_admins("[key_name_admin(admin)] has demonized [key_name_admin(new_owner)].")
+ log_admin("[key_name(admin)] has demonized [key_name(new_owner)].")
+
+/datum/antagonist/sinfuldemon/antag_listing_name()
+ return ..() + "(, demon of [demonsin])" // Boris Smith, demon of Wrath
+
+/datum/antagonist/sinfuldemon/greet()
+ to_chat(owner.current, span_warning("You remember your link to the infernal. You are a demon of [demonsin] released from hell to spread sin amongst the living."))
+ to_chat(owner.current, span_warning("However, your infernal form is not without weaknesses."))
+ to_chat(owner.current, "You are incredibly vulnerable to holy artifacts and influence.")
+ to_chat(owner.current, "While blessed with the unholy ability to transform into your true form, this form is extremely obvious and vulnerable to holy weapons.")
+ to_chat(owner.current, "[span_warning("Do your best to complete your objectives without unnessecary death, unless you are a wrathful demon.")]
")
+ owner.announce_objectives()
+ .=..()
+
+/datum/antagonist/sinfuldemon/on_gain()
+ forge_objectives()
+ owner.special_role = "sinfuldemon"
+ owner.current.faction += "hell"
+ if(owner.assigned_role == "Clown" && ishuman(owner.current))
+ var/mob/living/carbon/human/S = owner.current
+ to_chat(S, span_notice("Your infernal nature has allowed you to overcome your clownishness."))
+ S.dna.remove_mutation(CLOWNMUT)
+ switch(demonsin)
+ if(SIN_GLUTTONY)
+ owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/shapeshift/demon/gluttony)
+ if(SIN_GREED)
+ owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/shapeshift/demon)
+ owner.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/summon_greedslots)
+ if(SIN_WRATH)
+ owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/shapeshift/demon/wrath)
+ owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/inflict_handler/ignite)
+ if(SIN_ENVY)
+ owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/shapeshift/demon)
+ owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/touch/envy)
+ if(SIN_PRIDE)
+ owner.AddSpell(new /obj/effect/proc_holder/spell/targeted/shapeshift/demon)
+ owner.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/conjure/summon_mirror)
+ .=..()
+
+/datum/antagonist/sinfuldemon/on_removal()
+ owner.special_role = null
+ owner.current.faction -= "hell"
+ to_chat(owner.current, span_userdanger("Your infernal link has been severed! You are no longer a demon!"))
+ .=..()
+
+/datum/antagonist/sinfuldemon/roundend_report()
+ var/list/parts = list()
+ parts += printplayer(owner)
+ parts += printobjectives(objectives)
+ return parts.Join("
")
+
+#undef SIN_ENVY
+#undef SIN_GLUTTONY
+#undef SIN_GREED
+#undef SIN_PRIDE
+#undef SIN_SLOTH
+#undef SIN_WRATH
diff --git a/code/modules/antagonists/demon/general_powers.dm b/code/modules/antagonists/demon/general_powers.dm
new file mode 100644
index 000000000000..63cd4ae678a8
--- /dev/null
+++ b/code/modules/antagonists/demon/general_powers.dm
@@ -0,0 +1,65 @@
+/obj/effect/proc_holder/spell/targeted/shapeshift/demon //emergency get out of jail card.
+ name = "Lesser Demon Form"
+ desc = "Take on your true demon form. This form is strong but very obvious, and especially weak to holy influence. \
+ Also note that damage taken in this form can transform into your normal body. Heal by attacking living creatures before transforming back if gravely wounded!"
+ invocation = "COWER, MORTALS!!"
+ shapeshift_type = /mob/living/simple_animal/lesserdemon
+ action_icon = 'icons/mob/actions/actions_minor_antag.dmi'
+ action_icon_state = "daemontransform"
+ action_background_icon_state = "bg_demon"
+
+/mob/living/simple_animal/lesserdemon
+ name = "demon"
+ real_name = "demon"
+ desc = "A large, menacing creature covered in armored red scales."
+ speak_emote = list("cackles")
+ emote_hear = list("cackles","screeches")
+ response_help = "thinks better of touching"
+ response_disarm = "flails at"
+ response_harm = "punches"
+ icon = 'icons/mob/mob.dmi'
+ icon_state = "lesserdaemon"
+ icon_living = "lesserdaemon"
+ mob_biotypes = list(MOB_ORGANIC, MOB_HUMANOID)
+ speed = 0.33
+ a_intent = INTENT_HARM
+ stop_automated_movement = 1
+ status_flags = CANPUSH
+ attack_sound = 'sound/magic/demon_attack1.ogg'
+ deathsound = 'sound/magic/demon_dies.ogg'
+ deathmessage = "wails in anger and fear as it collapses in defeat!"
+ atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
+ minbodytemp = 250 //Weak to cold
+ maxbodytemp = INFINITY
+ faction = list("hell")
+ attacktext = "wildly tears into"
+ maxHealth = 200
+ health = 200
+ environment_smash = ENVIRONMENT_SMASH_STRUCTURES
+ obj_damage = 40
+ melee_damage_lower = 24
+ melee_damage_upper = 24
+ wound_bonus = -15
+ see_in_dark = 8
+ lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
+
+/mob/living/simple_animal/lesserdemon/attackby(obj/item/W, mob/living/user, params)
+ . = ..()
+ if(istype(W, /obj/item/nullrod))
+ visible_message(span_warning("[src] screams in unholy pain from the blow!"), \
+ span_cult("As \the [W] hits you, you feel holy power blast through your form, tearing it apart!"))
+ adjustBruteLoss(22) //22 extra damage from the nullrod while in your true form. On average this means 40 damage is taken now.
+
+/mob/living/simple_animal/lesserdemon/UnarmedAttack(mob/living/L, proximity)//10 hp healed from landing a hit.
+ if(isliving(L))
+ if(L.stat != DEAD && !L.anti_magic_check(TRUE, TRUE)) //demons do not gain succor from the dead or holy
+ adjustHealth(-maxHealth * 0.05)
+ return ..()
+
+/mob/living/simple_animal/lesserdemon/Life()
+ . = ..()
+ if(!src)
+ return
+ if(istype(get_area(src.loc), /area/chapel)) //being a non-carbon will not save you!
+ src.visible_message(span_warning("[src] begins to melt apart!"), span_danger("Your very soul melts from the holy room!"), "You hear sizzling.")
+ adjustHealth(15) //15 damage every ~2 seconds
diff --git a/code/modules/antagonists/demon/objectives.dm b/code/modules/antagonists/demon/objectives.dm
new file mode 100644
index 000000000000..cbc647b4080a
--- /dev/null
+++ b/code/modules/antagonists/demon/objectives.dm
@@ -0,0 +1,17 @@
+/datum/objective/demonsingeneral
+ completed = 1
+
+/datum/objective/demonsingeneral/gluttony
+ explanation_text = "Devour as much food as possible."
+
+/datum/objective/demonsingeneral/greed
+ explanation_text = "Acquire as much wealth as possible."
+
+/datum/objective/demonsingeneral/wrath
+ explanation_text = "Inflict as much pain as possible."
+
+/datum/objective/demonsingeneral/envy
+ explanation_text = "Do not allow anyone to become more popular than you."
+
+/datum/objective/demonsingeneral/pride
+ explanation_text = "Become as popular, powerful, and influential to as many people possible."
diff --git a/code/modules/antagonists/demon/sins/envy.dm b/code/modules/antagonists/demon/sins/envy.dm
new file mode 100644
index 000000000000..9ab55614535d
--- /dev/null
+++ b/code/modules/antagonists/demon/sins/envy.dm
@@ -0,0 +1,40 @@
+/obj/effect/proc_holder/spell/targeted/touch/envy
+ name = "Vanity Steal"
+ desc = "Engulfs your arm in a jealous might, allowing you to steal the look of the first human-like struck with it. Note, the form change is not reversable."
+ hand_path = /obj/item/melee/touch_attack/envy
+ school = "evocation"
+ charge_max = 150
+ clothes_req = FALSE
+ invocation = "ETERNAL FLAMES"
+ invocation_type = "whisper"
+ action_icon = 'icons/mob/actions/actions_changeling.dmi'
+ action_icon_state = "transform"
+ action_background_icon_state = "bg_demon"
+
+/obj/item/melee/touch_attack/envy
+ name = "Envious Hand"
+ desc = "A writhing, burning aura of jealousy, ready to be unleashed."
+ icon_state = "flagellation"
+ item_state = "hivemind"
+ catchphrase = "I'M BETTER THAN YOU!!"
+
+/obj/item/melee/touch_attack/envy/afterattack(atom/target, mob/living/carbon/human/user, proximity_flag, click_parameters)
+ if(!proximity_flag)
+ return
+ var/mob/living/M = target
+ if(M.anti_magic_check())
+ to_chat(user, span_warning("[M] resists your unholy jealousy!"))
+ to_chat(M, span_warning("A creeping feeling of jealousy dances around your mind before being suddenly dispelled."))
+ ..()
+ return
+ playsound(user, 'sound/magic/demon_attack1.ogg', 75, TRUE)
+ if(ishuman(target))
+ var/mob/living/carbon/human/H = target
+ if(user.real_name != H.dna.real_name)
+ user.real_name = H.dna.real_name
+ H.dna.transfer_identity(user, transfer_SE=1)
+ user.updateappearance(mutcolor_update=1)
+ user.domutcheck()
+ user.visible_message(span_warning("[user]'s appearance shifts into [H]'s!"), \
+ span_boldannounce("[H.p_they(TRUE)] think[H.p_s()] [H.p_theyre()] sooo much better than you. Not anymore, [H.p_they()] won't."))
+ return ..()
diff --git a/code/modules/antagonists/demon/sins/gluttony.dm b/code/modules/antagonists/demon/sins/gluttony.dm
new file mode 100644
index 000000000000..1767a32a598b
--- /dev/null
+++ b/code/modules/antagonists/demon/sins/gluttony.dm
@@ -0,0 +1,47 @@
+/obj/effect/proc_holder/spell/targeted/shapeshift/demon/gluttony //emergency get out of jail card, but better. It also eats everything.
+ name = "Gluttony Demon Form"
+ desc = "Take on your true demon form. This form is strong but very obvious, and especially weak to holy influence. \
+ Also note that damage taken in this form can transform into your normal body. Heal by attacking living creatures before transforming back if gravely wounded! \
+ Your unique form as a demon of gluttony also allows you to eat just about any item/corpse by clicking on it."
+ shapeshift_type = /mob/living/simple_animal/lesserdemon/gluttony
+
+/mob/living/simple_animal/lesserdemon/gluttony //capable of devouring pretty much anything.
+ name = "gluttonous demon"
+ real_name = "gluttonous demon"
+ melee_damage_lower = 26
+ melee_damage_upper = 26
+
+/mob/living/simple_animal/lesserdemon/gluttony/death(gibbed)
+ barf_contents()
+ ..()
+
+/mob/living/simple_animal/lesserdemon/gluttony/proc/barf_contents()
+ for(var/atom/movable/AM in src)
+ AM.forceMove(loc)
+ if(prob(90))
+ step(AM, pick(GLOB.alldirs))
+
+/mob/living/simple_animal/lesserdemon/gluttony/wabbajack_act(mob/living/new_mob)
+ barf_contents()
+ . = ..()
+
+/mob/living/simple_animal/lesserdemon/gluttony/proc/eat(atom/movable/A)
+ if(A && A.loc != src)
+ visible_message(span_warning("[src] swallows [A] whole!"))
+ A.forceMove(src)
+ return TRUE
+ return FALSE
+
+/mob/living/simple_animal/lesserdemon/gluttony/UnarmedAttack(mob/living/L, obj/item/I)
+ if(isliving(L)) //Eat Corpses to regen health
+ if(L.stat == DEAD)
+ if(do_after(src, 3 SECONDS, target = L))
+ if(eat(L))
+ adjustHealth(-50)
+ return
+ else if(isitem(L)) //Eat items just to be annoying
+ if(!I.anchored)
+ if(do_after(src, 2 SECONDS, target = I))
+ eat(I)
+ return
+ return ..()
diff --git a/code/modules/antagonists/demon/sins/greed.dm b/code/modules/antagonists/demon/sins/greed.dm
new file mode 100644
index 000000000000..4ee00734f542
--- /dev/null
+++ b/code/modules/antagonists/demon/sins/greed.dm
@@ -0,0 +1,17 @@
+/obj/effect/proc_holder/spell/aoe_turf/conjure/summon_greedslots
+ name = "Summon Slotmachine"
+ desc = "Summon forth a temporary slot machine of greed, allowing you to offer patrons a deadly game where the price is their life (and some money if you'd like) and the possible prize is a die of fate."
+ invocation = "Just one game?"
+ invocation_type = "whisper"
+ clothes_req = FALSE
+ charge_max = 600
+ cooldown_min = 200
+ summon_type = list(/obj/structure/cursed_slot_machine)
+ summon_lifespan = 600
+ summon_amt = 1
+ range = 1
+ action_icon = 'icons/mob/actions/actions_minor_antag.dmi'
+ action_icon_state = "slots"
+ action_background_icon_state = "bg_demon"
+
+
diff --git a/code/modules/antagonists/demon/sins/pride.dm b/code/modules/antagonists/demon/sins/pride.dm
new file mode 100644
index 000000000000..ade15cb945bf
--- /dev/null
+++ b/code/modules/antagonists/demon/sins/pride.dm
@@ -0,0 +1,18 @@
+/obj/effect/proc_holder/spell/aoe_turf/conjure/summon_mirror
+ name = "Summon Mirror"
+ desc = "Summon forth a temporary mirror of sin that will allow you and others to change anything they want about themselves."
+ invocation = "Aren't I so amazing?"
+ invocation_type = "whisper"
+ clothes_req = FALSE
+ charge_max = 600
+ cooldown_min = 200
+ summon_type = list(/obj/structure/mirror/magic/lesser)
+ summon_lifespan = 600
+ summon_amt = 1
+ range = 1
+ action_icon = 'icons/mob/actions/actions_minor_antag.dmi'
+ action_icon_state = "magic_mirror"
+ action_background_icon_state = "bg_demon"
+
+
+
diff --git a/code/modules/antagonists/demon/sins/wrath.dm b/code/modules/antagonists/demon/sins/wrath.dm
new file mode 100644
index 000000000000..236bb80b4bf9
--- /dev/null
+++ b/code/modules/antagonists/demon/sins/wrath.dm
@@ -0,0 +1,39 @@
+/obj/effect/proc_holder/spell/targeted/shapeshift/demon/wrath //emergency get out of jail card, but better.
+ name = "Wrath Demon Form"
+ shapeshift_type = /mob/living/simple_animal/lesserdemon/wrath
+
+/mob/living/simple_animal/lesserdemon/wrath //slightly more damage.
+ name = "wrathful demon"
+ real_name = "wrathful demon"
+ melee_damage_lower = 28
+ melee_damage_upper = 28
+
+/obj/effect/proc_holder/spell/pointed/trigger/ignite
+ name = "Ignite"
+ desc = "This spell sets a person on fire from range."
+ school = "transmutation"
+ charge_max = 600
+ clothes_req = FALSE
+ invocation = "BURN IN HELL!!"
+ invocation_type = "shout"
+ message = span_notice("You ignite in a flash of hellfire!")
+ cooldown_min = 75
+ ranged_mousepointer = 'icons/effects/mouse_pointers/throw_target.dmi'
+ action_icon = 'icons/mob/actions/humble/actions_humble.dmi'
+ action_icon_state = "sacredflame"
+ active_msg = "You prepare to ignite a target..."
+
+/obj/effect/proc_holder/spell/targeted/inflict_handler/ignite
+ name = "Ignite"
+ desc = "This spell sets a person on fire from range."
+ school = "transmutation"
+ invocation = "BURN IN HELL!!"
+ invocation_type = "shout"
+ charge_max = 600
+ clothes_req = FALSE
+ action_icon = 'icons/mob/actions/humble/actions_humble.dmi'
+ action_icon_state = "sacredflame"
+ amt_firestacks = 5
+ ignites = TRUE
+ sound = 'sound/magic/fireball.ogg'
+
diff --git a/code/modules/events/sinfuldemon.dm b/code/modules/events/sinfuldemon.dm
new file mode 100644
index 000000000000..1261ffeb82d4
--- /dev/null
+++ b/code/modules/events/sinfuldemon.dm
@@ -0,0 +1,62 @@
+/datum/round_event_control/sinfuldemon
+ name = "Create Demon of Sin"
+ typepath = /datum/round_event/ghost_role/sinfuldemon
+ max_occurrences = 2 //misery loves company
+ min_players = 15
+ earliest_start = 20 MINUTES
+
+/datum/round_event/ghost_role/sinfuldemon
+ var/success_spawn = 0
+ minimum_required = 1
+ role_name = "sinfuldemon"
+ fakeable = FALSE
+
+/datum/round_event/ghost_role/sinfuldemon/kill()
+ if(!success_spawn && control)
+ control.occurrences--
+ return ..()
+
+/datum/round_event/ghost_role/sinfuldemon/spawn_role()
+ //selecting a spawn_loc
+ if(!SSjob.latejoin_trackers.len)
+ return MAP_ERROR
+
+ //selecting a candidate player
+ var/list/candidates = get_candidates(ROLE_SINFULDEMON, null, ROLE_SINFULDEMON)
+ if(!candidates.len)
+ return NOT_ENOUGH_PLAYERS
+
+ var/mob/dead/selected_candidate = pick_n_take(candidates)
+ var/key = selected_candidate.key
+
+ var/datum/mind/Mind = create_sinfuldemon_mind(key)
+ Mind.active = 1
+
+ var/mob/living/carbon/human/sinfuldemon = create_event_sinfuldemon()
+ Mind.transfer_to(sinfuldemon)
+ add_sinfuldemon(sinfuldemon, ascendable = FALSE)
+
+ spawned_mobs += sinfuldemon
+ message_admins("[ADMIN_LOOKUPFLW(sinfuldemon)] has been made into a demon of sin by an event.")
+ log_game("[key_name(sinfuldemon)] was spawned as a demon of sin by an event.")
+ var/datum/job/jobdatum = SSjob.GetJob("Assistant")
+ sinfuldemon.job = jobdatum.title
+ jobdatum.equip(sinfuldemon)
+ return SUCCESSFUL_SPAWN
+
+
+/proc/create_event_sinfuldemon(spawn_loc)
+ var/mob/living/carbon/human/new_devil = new(spawn_loc)
+ if(!spawn_loc)
+ SSjob.SendToLateJoin(new_sinfuldemon)
+ var/datum/preferences/A = new() //Randomize appearance for the devil.
+ A.copy_to(new_sinfuldemon)
+ new_devil.dna.update_dna_identity()
+ return new_devil
+
+/proc/create_sinfuldemon_mind(key)
+ var/datum/mind/Mind = new /datum/mind(key)
+ Mind.assigned_role = ROLE_SINFULDEMON
+ Mind.special_role = ROLE_SINFULDEMON
+ SSticker.mode.sinfuldemons |= Mind
+ return Mind
diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm
index 02771207decf..e21a9523c3ea 100644
--- a/code/modules/reagents/chemistry/reagents/other_reagents.dm
+++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm
@@ -268,6 +268,23 @@
M.adjust_fire_stacks(3)
M.IgniteMob() //Only problem with igniting people is currently the commonly availible fire suits make you immune to being on fire
M.adjustFireLoss(3) //Hence the other damages... ain't I a bastard? // Yogs End
+ if(ishuman(M) && is_sinfuldemon(M) && prob(80))
+ switch(data)
+ if(1 to 4)
+ to_chat(M, span_warning("Your unholy blood begins to burn as holy power creeps through you."))
+ M.adjustFireLoss(1)
+ if(5 to 10)
+ to_chat(M, span_danger("The burning deepens and strengthens!"))
+ M.adjustFireLoss(2)
+ if(11 to 12)
+ to_chat(M, span_danger("Your flesh itself begins to melt apart in agony!"))
+ M.adjustFireLoss(3)
+ M.emote("scream")
+ if(13 to INFINITY)
+ M.visible_message("[M] suddenly ignites in a brilliant flash of white!", span_userdanger("You suddenly ignite in a holy fire!"))
+ M.adjust_fire_stacks(3)
+ M.IgniteMob()
+ M.adjustFireLoss(4)
holder.remove_reagent(type, 0.4) //fixed consumption to prevent balancing going out of whack
/datum/reagent/water/holywater/reaction_turf(turf/T, reac_volume)
@@ -936,6 +953,8 @@
/datum/reagent/silver/reaction_mob(mob/living/M, method=TOUCH, reac_volume)
if(M.has_bane(BANE_SILVER))
M.reagents.add_reagent(/datum/reagent/toxin, reac_volume)
+ if(ishuman(M) && is_sinfuldemon(M) && prob(80)) //sinful demons have a lesser reaction to silver
+ M.reagents.add_reagent(/datum/reagent/toxin, reac_volume)
..()
/datum/reagent/uranium
diff --git a/code/modules/ruins/objects_and_mobs/sin_ruins.dm b/code/modules/ruins/objects_and_mobs/sin_ruins.dm
index 63234595ced1..c7f89f88a3d2 100644
--- a/code/modules/ruins/objects_and_mobs/sin_ruins.dm
+++ b/code/modules/ruins/objects_and_mobs/sin_ruins.dm
@@ -14,6 +14,9 @@
return
if(obj_flags & IN_USE)
return
+ if(is_sinfuldemon(user)) //this is probably a snowflake way of doing it but sure. Demons of Greed don't need to farm this.
+ to_chat(user,"Reserve this foolish game for mortals.")
+ return
obj_flags |= IN_USE
user.health -= 20
user.maxHealth -= 20
diff --git a/code/modules/spells/spell_types/inflict_handler.dm b/code/modules/spells/spell_types/inflict_handler.dm
index 2ad9a5ed169b..d223a731dfce 100644
--- a/code/modules/spells/spell_types/inflict_handler.dm
+++ b/code/modules/spells/spell_types/inflict_handler.dm
@@ -1,6 +1,6 @@
/obj/effect/proc_holder/spell/targeted/inflict_handler
name = "Inflict Handler"
- desc = "This spell blinds and/or destroys/damages/heals and/or knockdowns/stuns the target."
+ desc = "This spell blinds and/or destroys/damages/heals/ignites and/or knockdowns/stuns the target."
var/amt_paralyze = 0
var/amt_unconscious = 0
@@ -18,6 +18,9 @@
var/amt_eye_blind = 0
var/amt_eye_blurry = 0
+ var/amt_firestacks = 0
+ var/ignites = FALSE
+
var/destroys = "none" //can be "none", "gib" or "disintegrate"
var/summon_type = null //this will put an obj at the target's location
@@ -50,6 +53,7 @@
target.blind_eyes(amt_eye_blind)
target.blur_eyes(amt_eye_blurry)
+ target.adjust_fire_stacks(amt_firestacks)
//summoning
if(summon_type)
new summon_type(target.loc, target)
@@ -58,3 +62,6 @@
var/list/stat_args = status_params.Copy()
stat_args.Insert(1,inflict_status)
target.apply_status_effect(arglist(stat_args))
+
+ if(ignites == TRUE)
+ target.IgniteMob()
diff --git a/icons/mob/actions/actions_minor_antag.dmi b/icons/mob/actions/actions_minor_antag.dmi
index 3b9fe54577e6b8448b82f4e5a6a7b8146f57f39f..cff0a42f972d36ee45abcbe48e5cabf7f98a29bf 100644
GIT binary patch
literal 18390
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
wk0zivl10R=jvjAJA-ETc6qiDAE$(^J
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
W@=n?Wb~SSMIe?r-%hX6)g#RBBzlU`I
diff --git a/icons/mob/actions/actions_spells.dmi b/icons/mob/actions/actions_spells.dmi
index ca84f29d4a2e0c14e4cabc6c83b21348671ddc92..82ba375a4fe826c4305727d5977346b5273296bb 100644
GIT binary patch
literal 21216
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