diff --git a/code/datums/spells/wizard.dm b/code/datums/spells/wizard.dm index 66821e3d33b..78faf5b99fc 100644 --- a/code/datums/spells/wizard.dm +++ b/code/datums/spells/wizard.dm @@ -134,6 +134,19 @@ summon_type = list("/obj/effect/forcefield") summon_lifespan = 300 +/obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall + name = "Shield" + desc = "This spell creates a temporary forcefield to shield yourself and allies from incoming fire" + + school = "transmutation" + charge_max = 300 + clothes_req = 0 + invocation = "none" + invocation_type = "none" + range = 0 + summon_type = list("/obj/effect/forcefield") + summon_lifespan = 100 + /obj/effect/proc_holder/spell/aoe_turf/conjure/carp name = "Summon Bigger Carp" desc = "This spell conjures an elite carp." @@ -147,6 +160,21 @@ summon_type = list("/obj/effect/critter/spesscarp/elite") + +/obj/effect/proc_holder/spell/aoe_turf/conjure/construct + name = "Artificer" + desc = "This spell conjures a construct which may be controlled by Shades" + + school = "conjuration" + charge_max = 600 + clothes_req = 0 + invocation = "none" + invocation_type = "none" + range = 1 + + summon_type = list("/obj/structure/constructshell") + + /obj/effect/proc_holder/spell/aoe_turf/conjure/creature name = "Summon Creature Swarm" desc = "This spell tears the fabric of reality, allowing horrific daemons to spill forth" @@ -211,4 +239,19 @@ ex_severe = -1 ex_heavy = -1 ex_light = 2 - ex_flash = 5 \ No newline at end of file + ex_flash = 5 + + +/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift + name = "Phase Shift" + desc = "This spell allows you to pass through walls" + + school = "transmutation" + charge_max = 20 + clothes_req = 0 + invocation = "none" + invocation_type = "none" + range = -1 + include_user = 1 + + jaunt_duration = 25 //in deciseconds \ No newline at end of file diff --git a/code/game/gamemodes/wizard/soulstone.dm b/code/game/gamemodes/wizard/soulstone.dm index 4630aa688b0..f441182c804 100644 --- a/code/game/gamemodes/wizard/soulstone.dm +++ b/code/game/gamemodes/wizard/soulstone.dm @@ -9,6 +9,7 @@ origin_tech = "bluespace=4;materials=4" var/imprinted = "empty" + //////////////////////////////Capturing//////////////////////////////////////////////////////// attack(mob/living/carbon/human/M as mob, mob/user as mob) @@ -75,7 +76,17 @@ src.icon_state = "soulstone" attack_self(U) +///////////////////////////Transferring to constructs///////////////////////////////////////////////////// +/obj/structure/constructshell + name = "empty shell" + icon = 'wizard.dmi' + icon_state = "construct" + desc = "A wicked machine used by those skilled in magical arts. It is inactive" + flags = FPRINT | TABLEPASS +/obj/structure/constructshell/attackby(obj/item/O as obj, mob/user as mob) + if(istype(O, /obj/item/device/soulstone)) + O.transfer_soul("CONSTRUCT",src,user) ////////////////////////////Proc for moving soul in and out off stone////////////////////////////////////// @@ -120,7 +131,7 @@ C.name = "Soul Stone: [S.name]" S << "Your soul has been captured! You are now bound to [U.name]'s will, help them suceed in their goals at all costs." U << "\blue Capture successful!: \black [T.name]'s soul has been ripped from their body and stored within the soul stone." - S << "The soulstone has been imprinted with [S.name]'s mind, it will no longer react to other souls." + U << "The soulstone has been imprinted with [S.name]'s mind, it will no longer react to other souls." C.imprinted = "[S.name]" del T if("SHADE") @@ -142,4 +153,35 @@ C.icon_state = "soulstone2" T << "Your soul has been recaptured by the soul stone, its arcane energies are reknitting your ethereal form" U << "\blue Capture successful!: \black [T.name]'s has been recaptured and stored within the soul stone." + if("CONSTRUCT") + var/obj/structure/constructshell/T = target + var/obj/item/device/soulstone/C = src + var/mob/living/simple_animal/shade/A = locate() in C + if(A) + var/construct_class = alert(U, "Please choose which type of construct you wish to create.",,"Juggernaut","Wraith") + var/mob/living/simple_animal/Z + switch(construct_class) + if("Juggernaut") + Z = new /mob/living/simple_animal/constructarmoured (get_turf(T.loc)) + if (A.client) + A.client.mob = Z + del(T) + Z << "You are playing a Juggernaut. Though slow, you can withstand extreme punishment, and rip apart enemies and walls alike." + Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." + Z.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/lesserforcewall(Z) + Z.cancel_camera() + del(C) + + if("Wraith") + Z = new /mob/living/simple_animal/constructwraith (get_turf(T.loc)) + if (A.client) + A.client.mob = Z + del(T) + Z << "You are playing a Wraith. Though relatively fragile, you are fast, deadly, and even able to phase through walls." + Z << "You are still bound to serve your creator, follow their orders and help them complete their goals at all costs." + Z.spell_list += new /obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift(Z) + Z.cancel_camera() + del(C) + else + U << "\red Creation failed!: \black The soul stone is empty! Go kill someone!" return diff --git a/code/game/gamemodes/wizard/spellbook.dm b/code/game/gamemodes/wizard/spellbook.dm index c2c4cb30235..800d2f609ac 100644 --- a/code/game/gamemodes/wizard/spellbook.dm +++ b/code/game/gamemodes/wizard/spellbook.dm @@ -32,7 +32,7 @@ dat += "
" dat += "Staff of Change
" dat += "
" - dat += "Six Soul Stone Shards
" + dat += "Six Soul Stone Shards and the spell Artificer
" dat += "
" dat += "Re-memorize Spells
" user << browse(dat, "window=radio") @@ -184,7 +184,8 @@ if ("15") feedback_add_details("wizard_spell_learned","SS") //please do not change the abbreviation to keep data processing consistent. Add a unique id to any new spells new /obj/item/weapon/storage/belt/soulstone/full(get_turf(usr)) - src.temp = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying" + usr.spell_list += new /obj/effect/proc_holder/spell/aoe_turf/conjure/construct(usr) + src.temp = "Soul Stone Shards are ancient tools capable of capturing and harnessing the spirits of the dead and dying. The spell Artificer allows you to create arcane machines for the captured souls to pilot." src.max_uses-- if (href_list["spell_choice"] == "16") var/area/wizard_station/A = locate() diff --git a/code/game/magic/cultist/runes.dm b/code/game/magic/cultist/runes.dm index 899d1ee8369..8555828a2c6 100644 --- a/code/game/magic/cultist/runes.dm +++ b/code/game/magic/cultist/runes.dm @@ -782,6 +782,8 @@ var/list/sacrificed = list() for(var/mob/living/carbon/C in range(7,src)) if (iscultist(C)) continue + if(C.mind && (C.mind.assigned_role == "Chaplain")) + continue C.ear_deaf += 50 C.show_message("\red The world around you suddenly becomes quiet.", 3) affected++ @@ -798,6 +800,8 @@ var/list/sacrificed = list() for(var/mob/living/carbon/C in range(7,usr)) if (iscultist(C)) continue + if(C.mind && (C.mind.assigned_role == "Chaplain")) + continue C.ear_deaf += 30 //talismans is weaker. C.show_message("\red The world around you suddenly becomes quiet.", 3) @@ -816,6 +820,8 @@ var/list/sacrificed = list() for(var/mob/living/carbon/C in viewers(src)) if (iscultist(C)) continue + if(C.mind && (C.mind.assigned_role == "Chaplain")) + continue C.eye_blurry += 50 C.eye_blind += 20 if(prob(5)) @@ -835,6 +841,8 @@ var/list/sacrificed = list() for(var/mob/living/carbon/C in viewers(usr)) if (iscultist(C)) continue + if(C.mind && (C.mind.assigned_role == "Chaplain")) + continue C.eye_blurry += 30 C.eye_blind += 10 //talismans is weaker. @@ -862,6 +870,8 @@ var/list/sacrificed = list() for(var/mob/living/carbon/M in viewers(usr)) if(iscultist(M)) continue + if(M.mind && (M.mind.assigned_role == "Chaplain")) + continue M.take_overall_damage(51,51) M << "\red Your blood boils!" if(prob(5)) @@ -922,14 +932,18 @@ var/list/sacrificed = list() del(src) else ///When invoked as talisman, stun and mute the target mob. usr.say("Dream sign ''Evil sealing talisman''!") - for(var/mob/O in viewers(T, null)) - O.show_message(text("\red [] invokes a talisman at []", usr, T), 1) - flick("e_flash", T.flash) - if (!(T.mutations & HULK)) - T.silent += 15 - T.Weaken(25) - T.Stun(25) - return + if(T.mind && (T.mind.assigned_role == "Chaplain")) + for(var/mob/O in viewers(T, null)) + O.show_message(text("\red [] invokes a talisman at [], but they are unaffected!", usr, T), 1) + else + for(var/mob/O in viewers(T, null)) + O.show_message(text("\red [] invokes a talisman at []", usr, T), 1) + flick("e_flash", T.flash) + if (!(T.mutations & HULK)) + T.silent += 15 + T.Weaken(25) + T.Stun(25) + return /////////////////////////////////////////TWENTY-FIFTH RUNE diff --git a/code/game/magic/cultist/talisman.dm b/code/game/magic/cultist/talisman.dm index 30abdbe3a56..5b4498c6bc7 100644 --- a/code/game/magic/cultist/talisman.dm +++ b/code/game/magic/cultist/talisman.dm @@ -73,6 +73,7 @@ dat += "Fuu ma'jin - Allows you to stun a person by attacking them with the talisman.
" dat += "Sa tatha najin - Allows you to summon armoured robes and an unholy blade
" dat += "Kal om neth - Summons a soul stone
" + dat += "Da A'ig Osk - Summons a construct shell for use with captured souls. It is too large to carry on your person.
" usr << browse(dat, "window=id_com;size=350x200") return @@ -107,6 +108,8 @@ T.imbue = "armor" if("soulstone") new /obj/item/device/soulstone(get_turf(usr)) + if("construct") + new /obj/structure/constructshell(get_turf(usr)) src.uses-- supply() return diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 9fe0fdaf5cb..e5d232cf9b8 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -99,6 +99,7 @@ hands.icon_state = "medical" icon_state = "surgeon" modtype = "Med" + relentless = 1 if("Security") module = new /obj/item/weapon/robot_module/security(src) diff --git a/code/modules/mob/simple_animal/constructs.dm b/code/modules/mob/simple_animal/constructs.dm index de15ec75d34..b5ed797b427 100644 --- a/code/modules/mob/simple_animal/constructs.dm +++ b/code/modules/mob/simple_animal/constructs.dm @@ -1,12 +1,12 @@ /mob/living/simple_animal/constructarmoured - name = "Dread Armour" + name = "Juggernaut" desc = "A possessed suit of armour driven by the will of the restless dead" icon = 'mob.dmi' icon_state = "armour" icon_living = "armour" icon_dead = "shade_dead" - maxHealth = 300 - health = 300 + maxHealth = 250 + health = 250 speak_emote = list("hisses") emote_hear = list("wails","screeches") response_help = "thinks better of touching" @@ -37,21 +37,30 @@ return /mob/living/simple_animal/constructarmoured/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(O.force) - if(O.force >= 11) - health -= O.force + if(istype(O, /obj/item/weapon/storage/bible)) + if(user.mind && (user.mind.assigned_role == "Chaplain")) + health -= 75 for(var/mob/M in viewers(src, null)) if ((M.client && !( M.blinded ))) - M.show_message("\red \b [src] has been attacked with the [O] by [user]. ") + M.show_message("\red \b [src] lets out a pained screech, its armoured skin fizzling and melting. ") else + usr << "\red Your faith is not strong enough!" + else + if(O.force) + if(O.force >= 11) + health -= O.force + for(var/mob/M in viewers(src, null)) + if ((M.client && !( M.blinded ))) + M.show_message("\red \b [src] has been attacked with the [O] by [user]. ") + else + for(var/mob/M in viewers(src, null)) + if ((M.client && !( M.blinded ))) + M.show_message("\red \b The [O] bounces harmlessly off of [src]. ") + else + usr << "\red This weapon is ineffective, it does no damage." for(var/mob/M in viewers(src, null)) if ((M.client && !( M.blinded ))) - M.show_message("\red \b The [O] bounces harmlessly off of [src]. ") - else - usr << "\red This weapon is ineffective, it does no damage." - for(var/mob/M in viewers(src, null)) - if ((M.client && !( M.blinded ))) - M.show_message("\red [user] gently taps [src] with the [O]. ") + M.show_message("\red [user] gently taps [src] with the [O]. ") /mob/living/simple_animal/constructarmoured/Bump(atom/movable/AM as mob|obj, yes) @@ -88,4 +97,101 @@ step(AM, t) now_pushing = null return - return \ No newline at end of file + return + + + +/mob/living/simple_animal/constructwraith + name = "Wraith" + desc = "A wicked bladed shell contraption piloted by a bound spirit" + icon = 'mob.dmi' + icon_state = "floating" + icon_living = "floating" + icon_dead = "shade_dead" + maxHealth = 75 + health = 75 + speak_emote = list("hisses") + emote_hear = list("wails","screeches") + response_help = "thinks better of touching" + response_disarm = "flails at" + response_harm = "punches the" + melee_damage_lower = 25 + melee_damage_upper = 25 + attacktext = "slashes" + minbodytemp = 0 + maxbodytemp = 4000 + min_oxy = 0 + max_co2 = 0 + max_tox = 0 + speed = -1 + a_intent = "harm" + stop_automated_movement = 1 + + Life() + ..() + if(stat == 2) + for(var/mob/M in viewers(src, null)) + if((M.client && !( M.blinded ))) + M.show_message("\red [src] collapses in a shattered heap ") + ghostize(0) + del src + return + + +/mob/living/simple_animal/constructwraith/attackby(var/obj/item/O as obj, var/mob/user as mob) + if(istype(O, /obj/item/weapon/storage/bible)) + if(user.mind && (user.mind.assigned_role == "Chaplain")) + health -= 75 + for(var/mob/M in viewers(src, null)) + if ((M.client && !( M.blinded ))) + M.show_message("\red \b [src] lets out a pained screech, its armoured skin fizzling and melting. ") + else + usr << "\red Your faith is not strong enough!" + + else + if(O.force) + health -= O.force + for(var/mob/M in viewers(src, null)) + if ((M.client && !( M.blinded ))) + M.show_message("\red \b [src] has been attacked with the [O] by [user]. ") + else + usr << "\red This weapon is ineffective, it does no damage." + for(var/mob/M in viewers(src, null)) + if ((M.client && !( M.blinded ))) + M.show_message("\red [user] gently taps [src] with the [O]. ") + +/mob/living/simple_animal/constructwraith/Bump(atom/movable/AM as mob|obj, yes) + + spawn( 0 ) + if ((!( yes ) || now_pushing)) + return + now_pushing = 1 + if(ismob(AM)) + var/mob/tmob = AM + if(istype(tmob, /mob/living/carbon/human) && tmob.mutations & FAT) + if(prob(50)) + src << "\red You fail to push [tmob]'s fat ass out of the way." + now_pushing = 0 + return + if(tmob.relentless) + now_pushing = 0 + return + + tmob.LAssailant = src + now_pushing = 0 + ..() + if (!( istype(AM, /atom/movable) )) + return + if (!( now_pushing )) + now_pushing = 1 + if (!( AM.anchored )) + var/t = get_dir(src, AM) + if (istype(AM, /obj/structure/window)) + if(AM:ini_dir == NORTHWEST || AM:ini_dir == NORTHEAST || AM:ini_dir == SOUTHWEST || AM:ini_dir == SOUTHEAST) + for(var/obj/structure/window/win in get_step(AM,t)) + now_pushing = 0 + return + step(AM, t) + now_pushing = null + return + return diff --git a/html/changelog.html b/html/changelog.html index ca97f44a192..d975a0b4084 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -67,6 +67,13 @@ should be listed in the changelog upon commit tho. Thanks. -->
  • Examining humans now works a bit differently. Some external suits and helmets can hide certain pieces of clothing so you don't see them when examining. Glasses are also now displayed when examining.
  • The job selection screen has been changed a little to hopefully make making changes there easier.
  • +
  • Kor updated: + 31 January 2012 diff --git a/icons/obj/wizard.dmi b/icons/obj/wizard.dmi index 009ab5b5edf..d865796554a 100644 Binary files a/icons/obj/wizard.dmi and b/icons/obj/wizard.dmi differ