From f36feb87b588287b928157da349a93030fb3cf93 Mon Sep 17 00:00:00 2001 From: Mike Long Date: Sun, 12 Mar 2017 15:55:36 -0400 Subject: [PATCH] Lordpidey devil fixes (#24693) * Devils made via event can no longer ascend. Admins can control whether or not a devil may ascend via traitor panel. * Adds logging * Fixes #21326, Fixes #21321 * Fixes compile error, removes dead code. * Moves logging to where it's supposed to be. * Arch devils can now destroy walls with pitchfork. * Fixes compile error. * Summon dancefloor can't be used to break down walls. * Improves disco floor wall check * Fixes traitor panel for devils. * refactors human attack_hand * Fixes compile error * Devils now respawn with clothes. --- code/datums/mind.dm | 40 ++++++++- code/game/gamemodes/devil/devil_game_mode.dm | 2 +- code/game/gamemodes/devil/devilinfo.dm | 87 ++++++++++--------- code/game/gamemodes/devil/game_mode.dm | 3 +- code/game/objects/items/weapons/twohanded.dm | 14 +++ code/modules/events/devil.dm | 2 +- .../mob/living/carbon/human/human_defense.dm | 12 +-- code/modules/spells/spell_types/devil.dm | 5 +- 8 files changed, 110 insertions(+), 55 deletions(-) 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)