diff options
author | Jesusaves <cpntb1@ymail.com> | 2020-06-17 05:08:35 -0300 |
---|---|---|
committer | Jesusaves <cpntb1@ymail.com> | 2020-06-17 05:08:35 -0300 |
commit | 654d54d42079e21ac0541cb1e5f28c08cc935d5d (patch) | |
tree | ced30475ba31099de02627b57fb264958193d70d /npc/001-2-32/serena.txt | |
parent | 3cb4b0171536a04e177d823213a1aff51ab56f8d (diff) | |
parent | 4e242e64460a5548b77d512f317a8cd66967a95f (diff) | |
download | serverdata-kfahr.tar.gz serverdata-kfahr.tar.bz2 serverdata-kfahr.tar.xz serverdata-kfahr.zip |
Merge branch 'master' into kfahrkfahr
Diffstat (limited to 'npc/001-2-32/serena.txt')
-rw-r--r-- | npc/001-2-32/serena.txt | 232 |
1 files changed, 193 insertions, 39 deletions
diff --git a/npc/001-2-32/serena.txt b/npc/001-2-32/serena.txt index fa650ef1..8b8f92d4 100644 --- a/npc/001-2-32/serena.txt +++ b/npc/001-2-32/serena.txt @@ -1,50 +1,24 @@ -// Evol scripts. +// 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 lg("Oh darling, what brought you here?"); // TRANSLATORS: Darling - Expresses familiarity or elderliness in relation to PC. - - // <scratch> - // [ PC]: I was just looking around. - // [NPC]: Did not someone offer guidance? - // [NPC]: Enora was supposed to be helping you... - // [NPC]: ...but, she is young, and often absent-minded; did you ask? - // [NPC]: (Alt.) It seems you rushed ahead of her. Go back and talk to Enora. - // ([Enora]: Beyond here is the fighting room o_o;) - // ([Enora]: I... uh... well, you will need alies in there.) - // ([Enora]: And... you see... this is my good outfit and...) - // ([Enora]: ...I've only just cleaned up in there >.>) - // But if you keep getting stronger; that will be the day. - - // Alt-Ready: - // [NPC]: Beyond here is the Fight Room. - // [NPC]: [conditions]* - // [NPC]: Good-luck | Bonne-chance. - - // (Alt.) [NPC]: I used to be an adventurer, like you. - // [NPC]: But there was no one to join for quests. - // [NPC]: So I enlisted for a post at this chapter. - // [NPC]: But my "friends" joined the Brotherhood! - - // [NPC]: The Brotherhood knows a lot more about monsters. - // [NPC]: But they could not "break the Legion's power" without burning all cities to the ground. - // [NPC]: The cities grow fast, ruining farmers and peasants. - // [NPC]: Our differences lead to friction. - - // Alt-What - // The secret is out: We really did create a mutant. - // None of the members were informed until it went out-of-control. - // [...] - // Muahaha-ha! My beautiful mutant. The city of Artis is mine. - // </scratch> - - // Alt-Siege - // The city is being attacked. Go help the warriors and town-guard. - + 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: @@ -53,3 +27,183 @@ OnInit: 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; + } + + // 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; +} + + |