diff --git a/code/datums/mind.dm b/code/datums/mind.dm
index f9cf8a59d36..144b25494a4 100644
--- a/code/datums/mind.dm
+++ b/code/datums/mind.dm
@@ -541,11 +541,14 @@
text = uppertext(text)
text = "[text]: "
if(src in ticker.mode.devils)
- text += "DEVIL|sintouched|human"
+ if(devilinfo && !devilinfo.ascendable)
+ text += "DEVIL|Ascendable Devil|sintouched|human"
+ else
+ text += "DEVIL|ASCENDABLE DEVIL|sintouched|human"
else if(src in ticker.mode.sintouched)
- text += "devil|SINTOUCHED|human"
+ text += "devil|Ascendable Devil|SINTOUCHED|human"
else
- text += "devil|sintouched|HUMAN"
+ text += "devil|Ascendable Devil|sintouched|HUMAN"
if(current && current.client && (ROLE_DEVIL in current.client.prefs.be_special))
text += "|Enabled in Prefs"
@@ -1114,6 +1117,11 @@
RemoveSpell(/obj/effect/proc_holder/spell/targeted/summon_contract)
RemoveSpell(/obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork)
RemoveSpell(/obj/effect/proc_holder/spell/targeted/conjure_item/violin)
+ RemoveSpell(/obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/greater)
+ RemoveSpell(/obj/effect/proc_holder/spell/targeted/conjure_item/summon_pitchfork/ascended)
+ RemoveSpell(/obj/effect/proc_holder/spell/targeted/summon_dancefloor)
+ RemoveSpell(/obj/effect/proc_holder/spell/targeted/sintouch)
+ RemoveSpell(/obj/effect/proc_holder/spell/targeted/sintouch/ascended)
message_admins("[key_name_admin(usr)] has de-devil'ed [current].")
devilinfo = null
if(issilicon(current))
@@ -1125,15 +1133,39 @@
message_admins("[key_name_admin(usr)] has de-sintouch'ed [current].")
log_admin("[key_name(usr)] has de-sintouch'ed [current].")
if("devil")
+ if(devilinfo)
+ devilinfo.ascendable = FALSE
+ message_admins("[key_name_admin(usr)] has made [current] unable to ascend as a devil.")
+ log_admin("[key_name_admin(usr)] has made [current] unable to ascend as a devil.")
+ return
+ if(!ishuman(current) && !iscyborg(current))
+ usr << "This only works on humans and cyborgs!"
+ return
+ ticker.mode.devils += src
+ special_role = "devil"
+ ticker.mode.finalize_devil(src, FALSE)
+ ticker.mode.add_devil_objectives(src, 2)
+ announceDevilLaws()
+ announce_objectives()
+ message_admins("[key_name_admin(usr)] has devil'ed [current].")
+ log_admin("[key_name(usr)] has devil'ed [current].")
+ if("ascendable_devil")
+ if(devilinfo)
+ devilinfo.ascendable = TRUE
+ message_admins("[key_name_admin(usr)] has made [current] able to ascend as a devil.")
+ log_admin("[key_name_admin(usr)] has made [current] able to ascend as a devil.")
+ return
if(!ishuman(current) && !iscyborg(current))
to_chat(usr, "This only works on humans and cyborgs!")
return
ticker.mode.devils += src
special_role = "devil"
- ticker.mode.finalize_devil(src)
+ ticker.mode.finalize_devil(src, TRUE)
ticker.mode.add_devil_objectives(src, 2)
announceDevilLaws()
announce_objectives()
+ message_admins("[key_name_admin(usr)] has devil'ed [current]. The devil has been marked as ascendable.")
+ log_admin("[key_name(usr)] has devil'ed [current]. The devil has been marked as ascendable.")
if("sintouched")
if(ishuman(current))
ticker.mode.sintouched += src
diff --git a/code/game/gamemodes/devil/devil_game_mode.dm b/code/game/gamemodes/devil/devil_game_mode.dm
index c64653a986b..70775dfe9d9 100644
--- a/code/game/gamemodes/devil/devil_game_mode.dm
+++ b/code/game/gamemodes/devil/devil_game_mode.dm
@@ -51,7 +51,7 @@
/datum/game_mode/devil/post_setup()
for(var/datum/mind/devil in devils)
spawn(rand(10,100))
- finalize_devil(devil, objective_count)
+ finalize_devil(devil, TRUE)
spawn(100)
add_devil_objectives(devil, objective_count) //This has to be in a separate loop, as we need devil names to be generated before we give objectives in devil agent.
devil.announceDevilLaws()
diff --git a/code/game/gamemodes/devil/devilinfo.dm b/code/game/gamemodes/devil/devilinfo.dm
index a5766fa4edd..82fead15ca4 100644
--- a/code/game/gamemodes/devil/devilinfo.dm
+++ b/code/game/gamemodes/devil/devilinfo.dm
@@ -94,6 +94,7 @@ var/global/list/lawlorify = list (
/obj/effect/proc_holder/spell/targeted/summon_contract,
/obj/effect/proc_holder/spell/targeted/conjure_item/violin,
/obj/effect/proc_holder/spell/targeted/summon_dancefloor)
+ var/ascendable = FALSE
/datum/devilinfo/New()
@@ -187,15 +188,6 @@ var/global/list/lawlorify = list (
remove_spells()
to_chat(owner.current, "As punishment for your failures, all of your powers except contract creation have been revoked.")
-/datum/devilinfo/proc/increase_form()
- switch(form)
- if(BASIC_DEVIL)
- increase_blood_lizard()
- if(BLOOD_LIZARD)
- increase_true_devil()
- if(TRUE_DEVIL)
- increase_arch_devil()
-
/datum/devilinfo/proc/regress_humanoid()
to_chat(owner.current, "Your powers weaken, have more contracts be signed to regain power.")
if(ishuman(owner.current))
@@ -251,6 +243,8 @@ var/global/list/lawlorify = list (
/datum/devilinfo/proc/increase_arch_devil()
+ if(!ascendable)
+ return
var/mob/living/carbon/true_devil/D = owner.current
to_chat(D, "You feel as though your form is about to ascend.")
sleep(50)
@@ -403,7 +397,7 @@ var/global/list/lawlorify = list (
/datum/devilinfo/proc/hellish_resurrection(mob/living/body)
message_admins("[owner.name] (true name is: [truename]) is resurrecting using hellish energy.")
- if(SOULVALUE <= ARCH_THRESHOLD) // once ascended, arch devils do not go down in power by any means.
+ if(SOULVALUE < ARCH_THRESHOLD && ascendable) // once ascended, arch devils do not go down in power by any means.
reviveNumber += LOSS_PER_DEATH
update_hud()
if(body)
@@ -414,41 +408,50 @@ var/global/list/lawlorify = list (
var/mob/living/carbon/true_devil/D = body
if(D.oldform)
D.oldform.revive(1,0) // Heal the old body too, so the devil doesn't resurrect, then immediately regress into a dead body.
+ if(body.stat == DEAD)
+ create_new_body()
else
- if(blobstart.len > 0)
- var/turf/targetturf = get_turf(pick(blobstart))
- var/mob/currentMob = owner.current
- if(!currentMob)
- currentMob = owner.get_ghost()
- if(!currentMob)
- message_admins("[owner.name]'s devil resurrection failed due to client logoff. Aborting.")
- return -1 //
- if(currentMob.mind != owner)
- message_admins("[owner.name]'s devil resurrection failed due to becoming a new mob. Aborting.")
- return -1
- currentMob.change_mob_type( /mob/living/carbon/human , targetturf, null, 1)
- var/mob/living/carbon/human/H = owner.current
- give_summon_contract()
- if(SOULVALUE >= BLOOD_THRESHOLD)
- H.set_species(/datum/species/lizard, 1)
- H.underwear = "Nude"
- H.undershirt = "Nude"
- H.socks = "Nude"
- H.dna.features["mcolor"] = "511"
- H.regenerate_icons()
- if(SOULVALUE >= TRUE_THRESHOLD) //Yes, BOTH this and the above if statement are to run if soulpower is high enough.
- var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(targetturf)
- A.faction |= "hell"
- H.forceMove(A)
- A.oldform = H
- A.set_name()
- owner.transfer_to(A)
- if(SOULVALUE >= ARCH_THRESHOLD)
- A.convert_to_archdevil()
- else
- throw EXCEPTION("Unable to find a blobstart landmark for hellish resurrection")
+ create_new_body()
check_regression()
+/datum/devilinfo/proc/create_new_body()
+ if(blobstart.len > 0)
+ var/turf/targetturf = get_turf(pick(blobstart))
+ var/mob/currentMob = owner.current
+ if(!currentMob)
+ currentMob = owner.get_ghost()
+ if(!currentMob)
+ message_admins("[owner.name]'s devil resurrection failed due to client logoff. Aborting.")
+ return -1
+ if(currentMob.mind != owner)
+ message_admins("[owner.name]'s devil resurrection failed due to becoming a new mob. Aborting.")
+ return -1
+ currentMob.change_mob_type( /mob/living/carbon/human, targetturf, null, 1)
+ var/mob/living/carbon/human/H = owner.current
+ H.equip_to_slot_or_del(new /obj/item/clothing/under/lawyer/black(H), slot_w_uniform)
+ H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes)
+ H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_hands)
+ H.equip_to_slot_or_del(new /obj/item/weapon/pen(H), slot_l_store)
+ if(SOULVALUE >= BLOOD_THRESHOLD)
+ H.set_species(/datum/species/lizard, 1)
+ H.underwear = "Nude"
+ H.undershirt = "Nude"
+ H.socks = "Nude"
+ H.dna.features["mcolor"] = "511"
+ H.regenerate_icons()
+ if(SOULVALUE >= TRUE_THRESHOLD) //Yes, BOTH this and the above if statement are to run if soulpower is high enough.
+ var/mob/living/carbon/true_devil/A = new /mob/living/carbon/true_devil(targetturf)
+ A.faction |= "hell"
+ H.forceMove(A)
+ A.oldform = H
+ A.set_name()
+ owner.transfer_to(A)
+ if(SOULVALUE >= ARCH_THRESHOLD && ascendable)
+ A.convert_to_archdevil()
+ else
+ throw EXCEPTION("Unable to find a blobstart landmark for hellish resurrection")
+
+
/datum/devilinfo/proc/update_hud()
if(istype(owner.current, /mob/living/carbon))
var/mob/living/C = owner.current
diff --git a/code/game/gamemodes/devil/game_mode.dm b/code/game/gamemodes/devil/game_mode.dm
index bd9db9722b6..a99e6abd83b 100644
--- a/code/game/gamemodes/devil/game_mode.dm
+++ b/code/game/gamemodes/devil/game_mode.dm
@@ -30,11 +30,12 @@
to_chat(world, text)
-/datum/game_mode/proc/finalize_devil(datum/mind/devil_mind)
+/datum/game_mode/proc/finalize_devil(datum/mind/devil_mind, ascendable = FALSE)
var/trueName= randomDevilName()
devil_mind.devilinfo = devilInfo(trueName, 1)
+ devil_mind.devilinfo.ascendable = ascendable
devil_mind.store_memory("Your devilic true name is [devil_mind.devilinfo.truename]
[lawlorify[LAW][devil_mind.devilinfo.ban]]
You may not use violence to coerce someone into selling their soul.
You may not directly and knowingly physically harm a devil, other than yourself.
[lawlorify[LAW][devil_mind.devilinfo.bane]]
[lawlorify[LAW][devil_mind.devilinfo.obligation]]
[lawlorify[LAW][devil_mind.devilinfo.banish]]
")
devil_mind.devilinfo.owner = devil_mind
devil_mind.devilinfo.give_base_spells(1)
diff --git a/code/game/objects/items/weapons/twohanded.dm b/code/game/objects/items/weapons/twohanded.dm
index 5b23f99be3c..fe12f6f2f80 100644
--- a/code/game/objects/items/weapons/twohanded.dm
+++ b/code/game/objects/items/weapons/twohanded.dm
@@ -578,6 +578,9 @@
force_unwielded = 19
force_wielded = 25
+/obj/item/weapon/twohanded/pitchfork/demonic/Initialize()
+ set_light(3,6,LIGHT_COLOR_RED)
+
/obj/item/weapon/twohanded/pitchfork/demonic/greater
force = 24
throwforce = 50
@@ -615,6 +618,17 @@
user.apply_damage(rand(force/2, force), BURN, pick("l_arm", "r_arm"))
..()
+/obj/item/weapon/twohanded/pitchfork/demonic/ascended/afterattack(atom/target, mob/user, proximity)
+ if(!proximity || !wielded)
+ return
+ if(istype(target, /turf/closed/wall))
+ var/turf/closed/wall/W = target
+ user.visible_message("[user] blasts \the [target] with \the [src]!")
+ playsound(target, 'sound/magic/Disintegrate.ogg', 100, 1)
+ W.break_wall()
+ return 1
+ ..()
+
//HF blade
/obj/item/weapon/twohanded/vibro_weapon
diff --git a/code/modules/events/devil.dm b/code/modules/events/devil.dm
index 83a0f95b497..527927ce426 100644
--- a/code/modules/events/devil.dm
+++ b/code/modules/events/devil.dm
@@ -32,7 +32,7 @@
var/mob/living/carbon/human/devil = create_event_devil(spawn_loc)
Mind.transfer_to(devil)
- ticker.mode.finalize_devil(Mind)
+ ticker.mode.finalize_devil(Mind, FALSE)
ticker.mode.add_devil_objectives(src, 2)
Mind.announceDevilLaws()
Mind.announce_objectives()
diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm
index 2d29a94e2e1..e86af4f461c 100644
--- a/code/modules/mob/living/carbon/human/human_defense.dm
+++ b/code/modules/mob/living/carbon/human/human_defense.dm
@@ -198,13 +198,15 @@
damage_clothes(15, BRUTE, "melee")
return 1
-/mob/living/carbon/human/attack_hand(mob/living/carbon/human/M)
+/mob/living/carbon/human/attack_hand(mob/user)
if(..()) //to allow surgery to return properly.
return
- if(M.a_intent == INTENT_DISARM)
- if(M.buckled_mobs && (src in M.buckled_mobs) && M.riding_datum)
- M.riding_datum.force_dismount(src)
- dna.species.spec_attack_hand(M, src)
+ if(ishuman(user))
+ var/mob/living/carbon/human/H = user
+ if(H.a_intent == INTENT_DISARM)
+ if(H.buckled_mobs && (src in H.buckled_mobs) && H.riding_datum)
+ H.riding_datum.force_dismount(src)
+ dna.species.spec_attack_hand(H, src)
/mob/living/carbon/human/attack_paw(mob/living/carbon/monkey/M)
diff --git a/code/modules/spells/spell_types/devil.dm b/code/modules/spells/spell_types/devil.dm
index c37718a8b1e..91226d2e448 100644
--- a/code/modules/spells/spell_types/devil.dm
+++ b/code/modules/spells/spell_types/devil.dm
@@ -232,9 +232,12 @@
var/turf/T = dancefloor_turfs[i]
T.ChangeTurf(dancefloor_turfs_types[i])
else
+ var/list/funky_turfs = RANGE_TURFS(1, user)
+ for(var/turf/closed/solid in funky_turfs)
+ user << "You're too close to a wall."
+ return
dancefloor_exists = TRUE
var/i = 1
- var/list/funky_turfs = RANGE_TURFS(1, user)
dancefloor_turfs.len = funky_turfs.len
dancefloor_turfs_types.len = funky_turfs.len
for(var/t in funky_turfs)