From b324db9b7e64a6493e3d0f5c709acd4c7ad2aaec Mon Sep 17 00:00:00 2001 From: "kortgstation@gmail.com" Date: Wed, 8 Feb 2012 02:58:30 +0000 Subject: [PATCH] The armoured construct is now known as the Juggernaut. Its health was lowered and it takes massive damage from being hit with a bible. The Juggernaut has a lesser version of force wall. Added the Wraith construct, a faster, more fragile construct which has a lesser version of Ethereal Jaunt. It too is vulnerable to bibles. The Chaplain is now immune to blood boil, stun talismans, and cult blind/deafen Constructs are finally creatable by using a full soulstone on an empty construct shell. The creator will be able to choose which kind of construct is created. Cultists can get construct shells from their supply talisman Wizards now get the spell "Artificer" which allows them to create construct shells for free when they select the soulstone belt. Medical Borgs are now relentless to prevent them losing hold of incapacitated patients. Added the Artificer (conjure construct shell), Phase Shift (lesser jaunt), and Shield (lesser forcewall) spells git-svn-id: http://tgstation13.googlecode.com/svn/trunk@3054 316c924e-a436-60f5-8080-3fe189b3f50e --- code/datums/spells/wizard.dm | 45 +++++- code/game/gamemodes/wizard/soulstone.dm | 44 +++++- code/game/gamemodes/wizard/spellbook.dm | 5 +- code/game/magic/cultist/runes.dm | 30 ++-- code/game/magic/cultist/talisman.dm | 3 + .../modules/mob/living/silicon/robot/robot.dm | 1 + code/modules/mob/simple_animal/constructs.dm | 134 ++++++++++++++++-- html/changelog.html | 7 + icons/obj/wizard.dmi | Bin 7389 -> 8241 bytes 9 files changed, 243 insertions(+), 26 deletions(-) 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 009ab5b5edf84a460dd40db3af6560a68d4fcd66..d865796554a6773c4e01a2f420f3234ffba0ef40 100644 GIT binary patch literal 8241 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 C@O5DT literal 7389 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 TpymMhe