From 2026450460345dc0c26a26987f0f8c61dfb54480 Mon Sep 17 00:00:00 2001 From: Jesusaves Date: Fri, 8 Jun 2018 02:35:06 -0300 Subject: Okay, time to test Soren's Village Stage. (Ugh, I still need to code the house, add the inner warp, and prepare final boss fight on a suitable map with a way back.) --- npc/soren/main.txt | 253 +++++++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 248 insertions(+), 5 deletions(-) (limited to 'npc') diff --git a/npc/soren/main.txt b/npc/soren/main.txt index af9a6259e..4239e48dd 100644 --- a/npc/soren/main.txt +++ b/npc/soren/main.txt @@ -34,7 +34,7 @@ soren,105,57,0 script Soren's House NPC_NO_SPRITE,0,0,{ OnTouch: .@st1=getvariableofnpc(.lifetime, "Soren's Fountain")-gettimetick(2); .@st2=getvariableofnpc(.lifetime, "Soren's Lake")-gettimetick(2); - .@st3=getvariableofnpc(.lifetime, "Soren's Dizmo")-gettimetick(2); + .@st3=getvariableofnpc(.lifetime, "Soren's Gizmo")-gettimetick(2); if (.@st1 > 0 && .@st2 > 0 && .@st3 > 0) { compareandsetq HurnscaldQuest_Celestia, 3, 4; warp "soren-2", 32, 36; @@ -47,6 +47,7 @@ OnTouch: mes col("Also, if I move away from the singularity during disarm process, it'll be lost.", 9); mes col("The singularities keep arming themselves up again, so I have roughly five minutes between first disarm and entering here.", 9); mes col("We should split our team, and have someone to protect our backs. Otherwise, we might not do it.", 9); + // Protip: stock Elixir Of Life if you need to do this quest with less than 3 team members close; } end; @@ -105,7 +106,7 @@ OnTimer31000: .@val=-2; if (getvariableofnpc(.casterId, "Soren's Lake") == .casterId) .@val=.@val-10; - if (getvariableofnpc(.casterId, "Soren's Dizmo") == .casterId) + if (getvariableofnpc(.casterId, "Soren's Gizmo") == .casterId) .@val=.@val-10; percentheal .@val, -15; @@ -183,8 +184,127 @@ OnInit: + + + + + + + + + + + + soren,104,143,0 script Soren's Lake NPC_NO_SPRITE,{ - + // Initial Checks + if (.lifetime > gettimetick(2)) { + npctalk l("This singularity will remain disarmed for @@ more!", FuzzyTime(.lifetime, 2, 2)); + end; + } + if (.st) { + npctalk l("A disarm process is already running."); + end; + } + + // Main menu + mes col("Attempt to disarm the singularity?", 9); + if (askyesno() == ASK_YES) { + .casterId=getcharid(3); + .st=1; + npctalk l("@@ started disarm process. Please stand by.", strcharinfo(0)); + initnpctimer; + } + close; + +// Waves (total: 6 waves + 1 optional) +OnTimer5000: +OnTimer10300: +OnTimer14000: +OnTimer18000: +OnTimer25000: +OnTimer28000: +OnTimer31000: + if (!attachrid(.casterId)) { + npctalk "Disarm process aborted: Disarmer is gone."; + stopnpctimer; .st=0; + end; + } + if (!reachable(.x, .y, .distance)) { + npctalk l("Disarm process aborted: Disarmer is out of reach."); + stopnpctimer; .st=0; + end; + } + if (Sp < MaxSp/100*15) { + npctalk l("Disarm process aborted: Insufficient mana to proceed."); + stopnpctimer; .st=0; + end; + } + + // Penalty Handler. + .@val=-2; + if (getvariableofnpc(.casterId, "Soren's Fountain") == .casterId) + .@val=.@val-10; + if (getvariableofnpc(.casterId, "Soren's Gizmo") == .casterId) + .@val=.@val-10; + + percentheal .@val, -15; + + // Monster Gen. Lake spawns less + .@amount=rand(.st/3+1, .st/2+1); + .@mid=rand(1,3)+.st; + switch (.@mid) { + case 1: + case 2: + .@monsterId = CaveMaggot ; break; + case 3: + case 4: + case 5: + .@monsterId = LavaSlime ; break; + case 6: + case 7: + .@monsterId = MountainSnake ; break; + default: // case 8: case 9: + .@monsterId = Yeti ; break; + } + // Item Gen have a different mechanic here + .@mid=rand(.st, .st*2+1); + switch (.@mid) { + case 1: + case 2: + .@itemId = Acorn ; break; + case 3: + case 4: + .@itemId = ChocolateMouboo ; break; + case 5: + case 6: + .@itemId = OrangeCupcake ; break; + case 7: + case 8: + .@itemId = CherryCake ; break; + case 9: + case 10: + .@itemId = Chagashroom ; break; + case 11: + .@itemId = HastePotion ; break; + case 12: + .@itemId = rand(Diamond, Amethyst) ; break; + default: // case 13 + .@itemId = rand(CopperOre, TitaniumOre) ; break; + } + // Defines for Lake are fixed + .@lx=104; .@ux=104; + .@ly=141; .@uy=141; + + // Core function + areamonster .map$, .@lx, .@ly, .@ux, .@uy, strmobinfo(1, .@monsterId), .@monsterId, .@amount; makeitem(.@itemId, 1, .map$, rand(.@lx, .@ux), rand(.@ly, .@uy)); ++.st; + + // If we're done with waves + if (.st >= 7) { + .lifetime=gettimetick(2)+300+rand(0, 60); + npctalk l("Disarmed with success for: @@", FuzzyTime(.lifetime, 2, 2)); + stopnpctimer; .st=0; + } end; OnInit: @@ -202,10 +322,133 @@ OnInit: -soren,107,37,0 script Soren's Dizmo NPC_NO_SPRITE,{ - + + + + + + + + + + + + + +soren,107,37,0 script Soren's Gizmo NPC_NO_SPRITE,{ + // Initial Checks + if (.lifetime > gettimetick(2)) { + npctalk l("This singularity will remain disarmed for @@ more!", FuzzyTime(.lifetime, 2, 2)); + end; + } + if (.st) { + npctalk l("A disarm process is already running."); + end; + } + + // Main menu + mes col("Attempt to disarm the singularity?", 9); + if (askyesno() == ASK_YES) { + .casterId=getcharid(3); + .st=1; + npctalk l("@@ started disarm process. Please stand by.", strcharinfo(0)); + initnpctimer; + } + close; + +// Waves (total: 6 waves + 1 optional) +OnTimer5000: +OnTimer10300: +OnTimer14000: +OnTimer18000: +OnTimer25000: +OnTimer28000: +OnTimer31000: + if (!attachrid(.casterId)) { + npctalk "Disarm process aborted: Disarmer is gone."; + stopnpctimer; .st=0; + end; + } + if (!reachable(.x, .y, .distance)) { + npctalk l("Disarm process aborted: Disarmer is out of reach."); + stopnpctimer; .st=0; + end; + } + if (Sp < MaxSp/100*15) { + npctalk l("Disarm process aborted: Insufficient mana to proceed."); + stopnpctimer; .st=0; + end; + } + + // Penalty Handler. + .@val=-2; + if (getvariableofnpc(.casterId, "Soren's Lake") == .casterId) + .@val=.@val-10; + if (getvariableofnpc(.casterId, "Soren's Fountain") == .casterId) + .@val=.@val-10; + + percentheal .@val, -15; + + // Monster Gen. Gizmo spawns more monsters because you can move more + .@amount=rand(.st/2+2, .st+2); + .@mid=rand(1,3)+.st; + switch (.@mid) { + case 1: + case 2: + .@monsterId = CaveMaggot ; break; + case 3: + case 4: + case 5: + .@monsterId = LavaSlime ; break; + case 6: + case 7: + .@monsterId = MountainSnake ; break; + default: // case 8: case 9: + .@monsterId = Yeti ; break; + } + // Item Gen + .@mid=rand(1,7)+.st; + switch (.@mid) { + case 1: + case 2: + .@itemId = Acorn ; break; + case 3: + case 4: + .@itemId = ChocolateMouboo ; break; + case 5: + case 6: + .@itemId = OrangeCupcake ; break; + case 7: + case 8: + .@itemId = CherryCake ; break; + case 9: + case 10: + .@itemId = Chagashroom ; break; + case 11: + .@itemId = HastePotion ; break; + case 12: + .@itemId = rand(Diamond, Amethyst) ; break; + default: // case 13 + .@itemId = rand(CopperOre, TitaniumOre) ; break; + } + // Defines + .@lx=.x-.distance; + .@ly=.y-.distance; + .@ux=.x+.distance; + .@uy=.y+.distance; + + // Core function + areamonster .map$, .@lx, .@ly, .@ux, .@uy, strmobinfo(1, .@monsterId), .@monsterId, .@amount; makeitem(.@itemId, 1, .map$, rand(.@lx, .@ux), rand(.@ly, .@uy)); ++.st; + + // If we're done with waves + if (.st >= 7) { + .lifetime=gettimetick(2)+300+rand(0, 60); + npctalk l("Disarmed with success for: @@", FuzzyTime(.lifetime, 2, 2)); + stopnpctimer; .st=0; + } end; + OnInit: .sex = G_OTHER; .distance = 3; -- cgit v1.2.3-60-g2f50