diff options
author | Jesusaves <cpntb1@ymail.com> | 2021-04-09 11:00:49 -0300 |
---|---|---|
committer | Jesusaves <cpntb1@ymail.com> | 2021-04-09 11:00:49 -0300 |
commit | 8a4bf716002a017de77fe7df301ef8e4aaf00a2e (patch) | |
tree | 4947d0b015baad639fa07133369e9a09c8a468bc /npc/001-2-32/serena.txt | |
download | serverdata-8a4bf716002a017de77fe7df301ef8e4aaf00a2e.tar.gz serverdata-8a4bf716002a017de77fe7df301ef8e4aaf00a2e.tar.bz2 serverdata-8a4bf716002a017de77fe7df301ef8e4aaf00a2e.tar.xz serverdata-8a4bf716002a017de77fe7df301ef8e4aaf00a2e.zip |
Initial commit
Diffstat (limited to 'npc/001-2-32/serena.txt')
-rw-r--r-- | npc/001-2-32/serena.txt | 215 |
1 files changed, 215 insertions, 0 deletions
diff --git a/npc/001-2-32/serena.txt b/npc/001-2-32/serena.txt new file mode 100644 index 00000000..d7d18a41 --- /dev/null +++ b/npc/001-2-32/serena.txt @@ -0,0 +1,215 @@ +// The Mana World scripts. +// Author: +// Reid +// Jesusalva +// Description: +// Artis's Legion of Aemil officier of the fighting room. +// Note: +// ATL - Artis Training Legion + +001-2-32,27,27,0 script Serena NPC_SERENA,{ + mesn; + mesq l("Oh darling, what brought you here?"); // TRANSLATORS: Darling - Expresses familiarity or elderliness in relation to PC. + next; + select + l("I wanna fight."), + l("Nothing."); + mes ""; + if (@menu == 1) { + mes l("Just walk right and talk to me. I'll be there in no time."); + mesc l("Challenge time limit: 60 minutes after entering the room."); + } + close; + +OnInit: + .distance = 3; + end; +} + +001-2-35,26,27,0 script Serena#Ctrl NPC_SERENA,{ + function checkVictory; + + // We can't begin if we're already doing it + if (.atlf) { + // TODO: We should check if the timers are running + //doevent(instance_npcname(.name$)+"::OnVerify"); + if (getq(Artis_Legion_Progress) == 4) + npctalk l("You're already done with the training, so feel free to leave."); + else + npctalk l("Focus on the fight!"); + end; + } + + // Enemies of the Legion of Aemil cannot train, obviously + if (faction_standing("LEGION", true) < 1) { + mesn; + mesq l("Sorry, but I can only train you if Lieutenant Lozerk authorizes."); + close; + } + + // Otherwise, begin it + mesn; + mesq l("Are you ready for your training?"); + next; + if (askyesno() == ASK_NO) { + mesn; + mesq l("Oh dear, please come back later then."); + close; + } + @ATLFIGHT=true; + // FALL THROUGH + +OnBegin: + mapannounce getmap(), l("Training Arena, %s, get ready!", strcharinfo(0)), bc_all; + // Save permanent data + .atl_blv=BaseLevel; + .atl_Str=readbattleparam(getcharid(3), UDT_STR); + .atl_Agi=readbattleparam(getcharid(3), UDT_AGI); + .atl_Vit=readbattleparam(getcharid(3), UDT_VIT); + .atl_Int=readbattleparam(getcharid(3), UDT_INT); + .atl_Dex=readbattleparam(getcharid(3), UDT_DEX); + .atl_Luk=readbattleparam(getcharid(3), UDT_LUK); + .atl_Dly=readbattleparam(getcharid(3), UDT_ADELAY); + .atl_Rng=readbattleparam(getcharid(3), UDT_ATKRANGE); + + // Save (b)ase data + .atl_bhp=MaxHp; + .atl_bAtk1=readbattleparam(getcharid(3), UDT_ATKMIN); + .atl_bAtk2=readbattleparam(getcharid(3), UDT_ATKMAX); + .atl_bMatk=readbattleparam(getcharid(3), UDT_MATKMAX); + .atl_bDef=readbattleparam(getcharid(3), UDT_DEF); + .atl_bMdef=readbattleparam(getcharid(3), UDT_MDEF); + .atl_bHit=readbattleparam(getcharid(3), UDT_FLEE)*8/10; + .atl_bFlee=readbattleparam(getcharid(3), UDT_HIT)*7/10; + .atl_bCrit=readbattleparam(getcharid(3), UDT_CRIT); + + // Save (p)rogression data + .atl_php=.atl_bhp/6; + .atl_pAtk1=.atl_bAtk1/12; + .atl_pAtk2=.atl_bAtk2/12; + .atl_pMatk=.atl_bMatk/5; + .atl_pDef=.atl_bDef/5; + .atl_pMdef=.atl_bMdef/5; + .atl_pHit=.atl_bFlee/10; + .atl_pFlee=.atl_bHit/15; + .atl_pCrit=.atl_bCrit/10; + + // Begin the battle + doevent(instance_npcname(.name$)+"::OnGladius"); + addtimer(5000, instance_npcname(.name$)+"::OnVerify"); + closeclientdialog; + close; + +OnGladius: + sleep(800); + // TODO: Coordinates, Helpers? + .@mg=monster(instance_mapname("001-2-35"), any(25, 30, 35), any(29, 35, 40, 46), "Gladiator", any(LegionSwordswoman, LegionHalberdier, LegionLieutenant, LegionLieutenant), 1, instance_npcname(.name$)+"::OnGladius"); + + // Set "permanent" data + setunitdata(.@mg, UDT_ADELAY, .atl_Dly-.atlf); + setunitdata(.@mg, UDT_ATKRANGE, .atl_Rng+cap_value(.atlf/10, 0, 3)); + + // Set base data + setunitdata(.@mg, UDT_LEVEL, .atl_blv+.atlf); + setunitdata(.@mg, UDT_STR, .atl_Str+.atlf); + setunitdata(.@mg, UDT_AGI, .atl_Agi+.atlf); + setunitdata(.@mg, UDT_VIT, .atl_Vit+.atlf); + setunitdata(.@mg, UDT_INT, .atl_Int+.atlf); + setunitdata(.@mg, UDT_DEX, .atl_Dex+.atlf); + setunitdata(.@mg, UDT_LUK, .atl_Luk+.atlf); + + // Set variable data + setunitdata(.@mg, UDT_MAXHP, .atl_bhp+.atl_php*(.atlf-1)); + setunitdata(.@mg, UDT_HP, .atl_bhp+.atl_php*(.atlf-1)); + + setunitdata(.@mg, UDT_ATKMIN, .atl_bAtk1+.atl_pAtk1*(.atlf-1)); + setunitdata(.@mg, UDT_ATKMAX, .atl_bAtk2+.atl_pAtk2*(.atlf-1)); + setunitdata(.@mg, UDT_MATKMIN, .atl_bMatk+.atl_pMatk*(.atlf-1)); + setunitdata(.@mg, UDT_MATKMAX, .atl_bMatk+.atl_pMatk*(.atlf-1)); + setunitdata(.@mg, UDT_DEF, .atl_bDef+.atl_pDef*(.atlf-1)); + setunitdata(.@mg, UDT_MDEF, .atl_Mdef+.atl_pMdef*(.atlf-1)); + setunitdata(.@mg, UDT_HIT, .atl_bHit+.atl_pHit*(.atlf-1)); + setunitdata(.@mg, UDT_FLEE, .atl_bFlee+.atl_pFlee*(.atlf-1)); + setunitdata(.@mg, UDT_CRIT, .atl_bCrit+.atl_pCrit*(.atlf-1)); + + setunitdata(.@mg, UDT_PDODGE, min(30, .atl_Luk/10+(.atlf/3))); + + .atlf+=1; + mapannounce instance_mapname("001-2-35"), ("Training Arena, wave " + .atlf + "!"), bc_all; + maptimer(instance_mapname("001-2-35"), 10, instance_npcname(.name$)+"::OnATLUpdate"); + end; + +OnATLUpdate: + if (.atlf > ATLRANK) + ATLRANK=.atlf; + getexp .atlf*7, .atlf*5; // Provide some reward + end; + +// Check for possible cheats, and update default values +OnVerify: + if (!.atlf) + end; + + if (readbattleparam(getcharid(3), UDT_ATKRANGE) > .atl_Rng) + .atl_Rng=readbattleparam(getcharid(3), UDT_ATKRANGE); + + if (readbattleparam(getcharid(3), UDT_ATKMAX) > .atl_bAtk1) { + .atl_bAtk1=readbattleparam(getcharid(3), UDT_ATKMIN); + .atl_bAtk2=readbattleparam(getcharid(3), UDT_ATKMAX); + .atl_pAtk1=.atl_bAtk1/10; + .atl_pAtk2=.atl_bAtk2/10; + } + + if (readbattleparam(getcharid(3), UDT_DEF) > .atl_bDef) { + .atl_bDef=readbattleparam(getcharid(3), UDT_DEF); + .atl_pDef=.atl_bDef/5; + } + + if (readbattleparam(getcharid(3), UDT_MDEF) > .atl_bMdef) { + .atl_bMdef=readbattleparam(getcharid(3), UDT_MDEF); + .atl_pMdef=.atl_bMdef/5; + } + + if (readbattleparam(getcharid(3), UDT_MATKMAX) > .atl_bMatk) { + .atl_bMatk=readbattleparam(getcharid(3), UDT_MATKMAX); + .atl_pMatk=.atl_bMatk/5; + } + + // TODO: Ignore haste potion effects + // TODO: Update battle statuses on the fly + if (readbattleparam(getcharid(3), UDT_ADELAY) < .atl_bDly) + .atl_bDly=readbattleparam(getcharid(3), UDT_DELAY); + + // Victory conditions + if (getq(Artis_Legion_Progress) == 3) + checkVictory(); + + addtimer(5000, instance_npcname(.name$)+"::OnVerify"); + end; + + // Victory conditions + function checkVictory { + if (.atlf > 3) { + npctalk l("Congratulations, %s. I think this is enough. You can continue fighting to set a good score or report to Lozerk.", strcharinfo(0)); + // Duplicate the dialog in case player miss it + dispbottom l("Congratulations, %s. I think this is enough. You can continue fighting to set a good score or report to Lozerk.", strcharinfo(0)); + setq Artis_Legion_Progress, 4, 0; + } + return; + } + +} + +// Helper function for failure +function script ATLFightEnd { + if (@ATLFIGHT) { + @ATLFIGHT=false; + .@mapn$="atl2@"+getcharid(0); + killmonster(.@mapn$, "all", false); + .@q2=getq2(Artis_Legion_Progress); + set(getvariableofnpc(.atlf, instance_npcname("Serena#Ctrl", .@q2)), 0); + } + return; +} + + |