From ba4a214191d425e30cd26e790109bea5d966da17 Mon Sep 17 00:00:00 2001 From: "vageyenaman@gmail.com" Date: Sun, 7 Aug 2011 02:00:48 +0000 Subject: [PATCH] Bugfixes: - Wizards and Changeling stings can no longer select ghosts. - AIs can no longer change their icon if they're out of power or dead. - PC Metroids can latch onto cyborgs, but they won't actually do anything. NPC Metroids simply won't ever latch onto cyborgs (but they will attack them if provoked!) Changes: - Gave Metroids a slightly longer attack delay. git-svn-id: http://tgstation13.googlecode.com/svn/trunk@1988 316c924e-a436-60f5-8080-3fe189b3f50e --- .../gamemodes/changeling/changeling_powers.dm | 290 ++++++++++-------- code/game/gamemodes/wizard/spells.dm | 69 +++-- .../modules/mob/living/carbon/metroid/life.dm | 19 +- .../mob/living/carbon/metroid/powers.dm | 90 +++--- code/modules/mob/living/silicon/ai/ai.dm | 3 + 5 files changed, 265 insertions(+), 206 deletions(-) diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index ad2ca8a30e7..00eb5725f7b 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -384,172 +384,202 @@ return -/client/proc/changeling_silence_sting(mob/T as mob in oview(usr.sting_range)) +/client/proc/changeling_silence_sting() set category = "Changeling" set name = "Silence sting (10)" set desc="Sting target" - if(usr.stat) - usr << "\red Not when we are incapacitated." + var/list/victims = list() + for(var/mob/living/carbon/C in oview(usr:sting_range)) + victims += C + var/mob/T = input(usr, "Who do you wish to sting?") as null | anything in victims + if(T) + + if(usr.stat) + usr << "\red Not when we are incapacitated." + return + + if(usr.chem_charges < 10) + usr << "\red We don't have enough stored chemicals to do that!" + return + + usr.chem_charges -= 10 + usr.sting_range = 1 + + usr << "\blue We stealthily sting [T]." + T << "You feel a small prick and a burning sensation in your throat." + + T.silent += 30 + + usr.verbs -= /client/proc/changeling_silence_sting + + spawn(5) + usr.verbs += /client/proc/changeling_silence_sting + return - if(usr.chem_charges < 10) - usr << "\red We don't have enough stored chemicals to do that!" - return - - usr.chem_charges -= 10 - usr.sting_range = 1 - - usr << "\blue We stealthily sting [T]." - T << "You feel a small prick and a burning sensation in your throat." - - T.silent += 30 - - usr.verbs -= /client/proc/changeling_silence_sting - - spawn(5) - usr.verbs += /client/proc/changeling_silence_sting - - return - -/client/proc/changeling_blind_sting(mob/T as mob in oview(usr.sting_range)) +/client/proc/changeling_blind_sting() set category = "Changeling" set name = "Blind sting (20)" set desc="Sting target" - if(usr.stat) - usr << "\red Not when we are incapacitated." + var/list/victims = list() + for(var/mob/living/carbon/C in oview(usr.sting_range)) + victims += C + var/mob/T = input(usr, "Who do you wish to sting?") as null | anything in victims + if(T) + if(usr.stat) + usr << "\red Not when we are incapacitated." + return + + if(usr.chem_charges < 20) + usr << "\red We don't have enough stored chemicals to do that!" + return + + usr.chem_charges -= 20 + usr.sting_range = 1 + + usr << "\blue We stealthily sting [T]." + + var/obj/overlay/B = new /obj/overlay( T.loc ) + B.icon_state = "blspell" + B.icon = 'wizard.dmi' + B.name = "spell" + B.anchored = 1 + B.density = 0 + B.layer = 4 + T.canmove = 0 + spawn(5) + del(B) + T.canmove = 1 + T << text("\blue Your eyes cry out in pain!") + T.disabilities |= 1 + spawn(300) + T.disabilities &= ~1 + T.eye_blind = 10 + T.eye_blurry = 20 + + usr.verbs -= /client/proc/changeling_blind_sting + + spawn(5) + usr.verbs += /client/proc/changeling_blind_sting + return - if(usr.chem_charges < 20) - usr << "\red We don't have enough stored chemicals to do that!" - return - - usr.chem_charges -= 20 - usr.sting_range = 1 - - usr << "\blue We stealthily sting [T]." - - var/obj/overlay/B = new /obj/overlay( T.loc ) - B.icon_state = "blspell" - B.icon = 'wizard.dmi' - B.name = "spell" - B.anchored = 1 - B.density = 0 - B.layer = 4 - T.canmove = 0 - spawn(5) - del(B) - T.canmove = 1 - T << text("\blue Your eyes cry out in pain!") - T.disabilities |= 1 - spawn(300) - T.disabilities &= ~1 - T.eye_blind = 10 - T.eye_blurry = 20 - - usr.verbs -= /client/proc/changeling_blind_sting - - spawn(5) - usr.verbs += /client/proc/changeling_blind_sting - - return - -/client/proc/changeling_deaf_sting(mob/T as mob in oview(usr.sting_range)) +/client/proc/changeling_deaf_sting() set category = "Changeling" set name = "Deaf sting (5)" set desc="Sting target:" - if(usr.stat) - usr << "\red Not when we are incapacitated." + var/list/victims = list() + for(var/mob/living/carbon/C in oview(usr.sting_range)) + victims += C + var/mob/T = input(usr, "Who do you wish to sting?") as null | anything in victims + + if(T) + if(usr.stat) + usr << "\red Not when we are incapacitated." + return + + if(usr.chem_charges < 5) + usr << "\red We don't have enough stored chemicals to do that!" + return + + usr.chem_charges -= 5 + usr.sting_range = 1 + + usr << "\blue We stealthily sting [T]." + + T.sdisabilities |= 4 + spawn(300) + T.sdisabilities &= ~4 + + usr.verbs -= /client/proc/changeling_deaf_sting + + spawn(5) + usr.verbs += /client/proc/changeling_deaf_sting + return - if(usr.chem_charges < 5) - usr << "\red We don't have enough stored chemicals to do that!" - return - - usr.chem_charges -= 5 - usr.sting_range = 1 - - usr << "\blue We stealthily sting [T]." - - T.sdisabilities |= 4 - spawn(300) - T.sdisabilities &= ~4 - - usr.verbs -= /client/proc/changeling_deaf_sting - - spawn(5) - usr.verbs += /client/proc/changeling_deaf_sting - - return - -/client/proc/changeling_paralysis_sting(mob/T as mob in oview(usr.sting_range)) +/client/proc/changeling_paralysis_sting() set category = "Changeling" set name = "Paralysis sting (30)" set desc="Sting target" - if(usr.stat) - usr << "\red Not when we are incapacitated." + var/list/victims = list() + for(var/mob/living/carbon/C in oview(usr.sting_range)) + victims += C + var/mob/T = input(usr, "Who do you wish to sting?") as null | anything in victims + + if(T) + + if(usr.stat) + usr << "\red Not when we are incapacitated." + return + + if(usr.chem_charges < 30) + usr << "\red We don't have enough stored chemicals to do that!" + return + + usr.chem_charges -= 30 + usr.sting_range = 1 + + usr << "\blue We stealthily sting [T]." + T << "You feel a small prick and a burning sensation." + + if (T.reagents) + T.reagents.add_reagent("zombiepowder", 20) + + usr.verbs -= /client/proc/changeling_paralysis_sting + + spawn(5) + usr.verbs += /client/proc/changeling_paralysis_sting + return - if(usr.chem_charges < 30) - usr << "\red We don't have enough stored chemicals to do that!" - return - - usr.chem_charges -= 30 - usr.sting_range = 1 - - usr << "\blue We stealthily sting [T]." - T << "You feel a small prick and a burning sensation." - - if (T.reagents) - T.reagents.add_reagent("zombiepowder", 20) - - usr.verbs -= /client/proc/changeling_paralysis_sting - - spawn(5) - usr.verbs += /client/proc/changeling_paralysis_sting - - return - -/client/proc/changeling_transformation_sting(mob/T as mob in oview(usr.sting_range)) +/client/proc/changeling_transformation_sting() set category = "Changeling" set name = "Transformation sting (30)" set desc="Sting target" - if(usr.stat) - usr << "\red Not when we are incapacitated." - return + var/list/victims = list() + for(var/mob/living/carbon/C in oview(usr.sting_range)) + victims += C + var/mob/T = input(usr, "Who do you wish to sting?") as null | anything in victims - if(usr.chem_charges < 30) - usr << "\red We don't have enough stored chemicals to do that!" - return + if(T) + if(usr.stat) + usr << "\red Not when we are incapacitated." + return - if(T.stat != 2 || (T.mutations & HUSK) || (!ishuman(T) && !ismonkey(T))) - usr << "\red We can't transform that target!" - return + if(usr.chem_charges < 30) + usr << "\red We don't have enough stored chemicals to do that!" + return - var/S = input("Select the target DNA: ", "Target DNA", null) in usr.absorbed_dna + if(T.stat != 2 || (T.mutations & HUSK) || (!ishuman(T) && !ismonkey(T))) + usr << "\red We can't transform that target!" + return - if (S == null) - return + var/S = input("Select the target DNA: ", "Target DNA", null) in usr.absorbed_dna - usr.chem_charges -= 30 - usr.sting_range = 1 + if (S == null) + return - usr << "\blue We stealthily sting [T]." + usr.chem_charges -= 30 + usr.sting_range = 1 - T.visible_message(text("\red [T] transforms!")) + usr << "\blue We stealthily sting [T]." - T.dna = usr.absorbed_dna[S] - T.real_name = S - updateappearance(T, T.dna.uni_identity) - domutcheck(T, null) + T.visible_message(text("\red [T] transforms!")) - usr.verbs -= /client/proc/changeling_transformation_sting + T.dna = usr.absorbed_dna[S] + T.real_name = S + updateappearance(T, T.dna.uni_identity) + domutcheck(T, null) - spawn(5) - usr.verbs += /client/proc/changeling_transformation_sting + usr.verbs -= /client/proc/changeling_transformation_sting - return \ No newline at end of file + spawn(5) + usr.verbs += /client/proc/changeling_transformation_sting + + return \ No newline at end of file diff --git a/code/game/gamemodes/wizard/spells.dm b/code/game/gamemodes/wizard/spells.dm index c3b16b19cba..e83c54857e6 100644 --- a/code/game/gamemodes/wizard/spells.dm +++ b/code/game/gamemodes/wizard/spells.dm @@ -1,38 +1,45 @@ //BLIND -/client/proc/blind(mob/M as mob in oview()) +/client/proc/blind() set category = "Spells" set name = "Blind" set desc = "This spell temporarly blinds a single person and does not require wizard garb." - if(usr.stat) - src << "Not when you are incapacitated." + + var/list/victims = list() + for(var/mob/living/carbon/C in oview(usr.sting_range)) + victims += C + var/mob/M = input(usr, "Who do you wish to sting?") as null | anything in victims + + if(M) + if(usr.stat) + src << "Not when you are incapacitated." + return + // if(!usr.casting()) return + usr.verbs -= /client/proc/blind + spawn(300) + usr.verbs += /client/proc/blind + + usr.whisper("STI KALY") + // usr.spellvoice() + + var/obj/overlay/B = new /obj/overlay( M.loc ) + B.icon_state = "blspell" + B.icon = 'wizard.dmi' + B.name = "spell" + B.anchored = 1 + B.density = 0 + B.layer = 4 + M.canmove = 0 + spawn(5) + del(B) + M.canmove = 1 + M << text("\blue Your eyes cry out in pain!") + M.disabilities |= 1 + spawn(300) + M.disabilities &= ~1 + M.eye_blind = 10 + M.eye_blurry = 20 return -// if(!usr.casting()) return - usr.verbs -= /client/proc/blind - spawn(300) - usr.verbs += /client/proc/blind - - usr.whisper("STI KALY") -// usr.spellvoice() - - var/obj/overlay/B = new /obj/overlay( M.loc ) - B.icon_state = "blspell" - B.icon = 'wizard.dmi' - B.name = "spell" - B.anchored = 1 - B.density = 0 - B.layer = 4 - M.canmove = 0 - spawn(5) - del(B) - M.canmove = 1 - M << text("\blue Your eyes cry out in pain!") - M.disabilities |= 1 - spawn(300) - M.disabilities &= ~1 - M.eye_blind = 10 - M.eye_blurry = 20 - return //MAGIC MISSILE @@ -215,7 +222,7 @@ //KILL -/mob/proc/kill(mob/M as mob in oview(1)) +/mob/proc/kill(mob/living/M as mob in oview(1)) set category = "Spells" set name = "Disintegrate" set desc = "This spell instantly kills somebody adjacent to you with the vilest of magick." @@ -482,7 +489,7 @@ //BODY SWAP /N -/mob/proc/swap(mob/M as mob in oview()) +/mob/proc/swap(mob/living/M as mob in oview()) set category = "Spells" set name = "Mind Transfer" set desc = "This spell allows the user to switch bodies with a target." diff --git a/code/modules/mob/living/carbon/metroid/life.dm b/code/modules/mob/living/carbon/metroid/life.dm index d29d6a3cb09..9d873c29886 100644 --- a/code/modules/mob/living/carbon/metroid/life.dm +++ b/code/modules/mob/living/carbon/metroid/life.dm @@ -259,13 +259,23 @@ if(Target in view(1,src)) + if(istype(Target, /mob/living/silicon)) + if(!Atkcool) + spawn() + Atkcool = 1 + sleep(15) + Atkcool = 0 + + if(get_obstacle_ok(Target)) + Target.attack_metroid(src) + return if(prob(80) && !Target.lying) if(Target.client && Target.health >= rand(10,30)) if(!Atkcool) spawn() Atkcool = 1 - sleep(10) + sleep(25) Atkcool = 0 if(get_obstacle_ok(Target)) @@ -276,11 +286,12 @@ step_to(src, Target) else - - Feedon(Target) + if(!Atkcool) + Feedon(Target) else - Feedon(Target) + if(!Atkcool) + Feedon(Target) else if(Target in view(30, src)) diff --git a/code/modules/mob/living/carbon/metroid/powers.dm b/code/modules/mob/living/carbon/metroid/powers.dm index 8b5feedc27c..1712cd1e3b8 100644 --- a/code/modules/mob/living/carbon/metroid/powers.dm +++ b/code/modules/mob/living/carbon/metroid/powers.dm @@ -10,7 +10,7 @@ return var/list/choices = list() - for(var/mob/living/carbon/C in view(1,src)) + for(var/mob/living/C in view(1,src)) if(C!=src && !istype(C,/mob/living/carbon/metroid)) choices += C @@ -18,7 +18,7 @@ if(!M) return if(M in view(1, src)) - if(istype(M, /mob/living/carbon) && !istype(src, /mob/living/carbon/brain)) + if(!istype(src, /mob/living/carbon/brain)) if(!istype(M, /mob/living/carbon/metroid)) if(stat != 2) if(health > -70) @@ -57,7 +57,7 @@ while(Victim && M.health > -70 && stat != 2) // M.canmove = 0 canmove = 0 - if(prob(15) && M.client) + if(prob(15) && M.client && istype(M, /mob/living/carbon)) M << "\red [pick("You can feel your body becoming weak!", \ "You feel like you're about to die!", \ "You feel every part of your body screaming in agony!", \ @@ -66,54 +66,62 @@ "You feel extremely weak!", \ "A sharp, deep pain bathes every inch of your body!")]" - Victim.cloneloss += rand(1,10) - Victim.toxloss += rand(1,2) - if(Victim.health <= 0) - Victim.toxloss += rand(2,4) + if(istype(M, /mob/living/carbon)) + Victim.cloneloss += rand(1,10) + Victim.toxloss += rand(1,2) + if(Victim.health <= 0) + Victim.toxloss += rand(2,4) - if(toxloss > 0) - toxloss = max(0, toxloss-10) + if(toxloss > 0) + toxloss = max(0, toxloss-10) - if(oxyloss > 0) - oxyloss = max(0, oxyloss-10) + if(oxyloss > 0) + oxyloss = max(0, oxyloss-10) - if(bruteloss > 0) - bruteloss = max(0, bruteloss-10) + if(bruteloss > 0) + bruteloss = max(0, bruteloss-10) - if(fireloss > 0) - fireloss = max(0, fireloss-10) + if(fireloss > 0) + fireloss = max(0, fireloss-10) - if(cloneloss > 0) - cloneloss = max(0, cloneloss-10) + if(cloneloss > 0) + cloneloss = max(0, cloneloss-10) - if(Victim) - for(var/mob/living/carbon/metroid/Metroid in view(1,M)) - if(Metroid.Victim == M && Metroid != src) - Metroid.Feedstop() + if(Victim) + for(var/mob/living/carbon/metroid/Metroid in view(1,M)) + if(Metroid.Victim == M && Metroid != src) + Metroid.Feedstop() - if(toxloss<0) toxloss = 0 - if(oxyloss<0) oxyloss = 0 - if(bruteloss<0) bruteloss = 0 - if(fireloss<0) fireloss = 0 - if(cloneloss<0) cloneloss = 0 + if(toxloss<0) toxloss = 0 + if(oxyloss<0) oxyloss = 0 + if(bruteloss<0) bruteloss = 0 + if(fireloss<0) fireloss = 0 + if(cloneloss<0) cloneloss = 0 - nutrition += rand(5,20) - if(nutrition >= lastnut + 100) - if(prob(20)) - lastnut = nutrition - powerlevel++ - if(powerlevel > 10) - powerlevel = 10 + nutrition += rand(5,20) + if(nutrition >= lastnut + 100) + if(prob(20)) + lastnut = nutrition + powerlevel++ + if(powerlevel > 10) + powerlevel = 10 + + if(istype(src, /mob/living/carbon/metroid/adult)) + if(nutrition > 1200) + nutrition = 1200 + else + if(nutrition > 1000) + nutrition = 1000 + + Victim.updatehealth() + updatehealth() - if(istype(src, /mob/living/carbon/metroid/adult)) - if(nutrition > 1200) - nutrition = 1200 else - if(nutrition > 1000) - nutrition = 1000 - - Victim.updatehealth() - updatehealth() + if(prob(25)) + src << "\red [pick("This subject is incompatable", \ + "This subject does not have a life energy", "This subject is empty", \ + "I am not satisified", "I can not feed from this subject", \ + "I do not feel nurished", "This subject is not food")]..." sleep(rand(15,45)) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index a4a8a25a79f..c599632ca30 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -63,6 +63,9 @@ /mob/living/silicon/ai/verb/pick_icon() set category = "AI Commands" set name = "Change AI Core Display" + if(stat || aiRestorePowerRoutine) + return + //if(icon_state == initial(icon_state)) var/icontype = input("Please, select a display!", "AI", null/*, null*/) in list("Clown", "HAL9000", "Monochrome", "Blue", "HAL9000 Mark2", "Inverted", "Firewall", "Green")