From 8a4bf716002a017de77fe7df301ef8e4aaf00a2e Mon Sep 17 00:00:00 2001 From: Jesusaves Date: Fri, 9 Apr 2021 11:00:49 -0300 Subject: Initial commit --- npc/001-2-32/_import.txt | 6 ++ npc/001-2-32/_warps.txt | 3 + npc/001-2-32/doors.txt | 38 ++++++++ npc/001-2-32/mapflags.txt | 1 + npc/001-2-32/serena.txt | 215 ++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 263 insertions(+) create mode 100644 npc/001-2-32/_import.txt create mode 100644 npc/001-2-32/_warps.txt create mode 100644 npc/001-2-32/doors.txt create mode 100644 npc/001-2-32/mapflags.txt create mode 100644 npc/001-2-32/serena.txt (limited to 'npc/001-2-32') diff --git a/npc/001-2-32/_import.txt b/npc/001-2-32/_import.txt new file mode 100644 index 00000000..b59046e0 --- /dev/null +++ b/npc/001-2-32/_import.txt @@ -0,0 +1,6 @@ +// Map 001-2-32: Training Arena Lobby +// This file is generated automatically. All manually added changes will be removed when running the Converter. +"npc/001-2-32/_warps.txt", +"npc/001-2-32/doors.txt", +"npc/001-2-32/mapflags.txt", +"npc/001-2-32/serena.txt", diff --git a/npc/001-2-32/_warps.txt b/npc/001-2-32/_warps.txt new file mode 100644 index 00000000..4db4b354 --- /dev/null +++ b/npc/001-2-32/_warps.txt @@ -0,0 +1,3 @@ +// This file is generated automatically. All manually added changes will be removed when running the Converter. +// Map 001-2-32: Training Arena Lobby warps +001-2-32,27,33,0 warp #001-2-32_27_33 0,0,001-2-33,39,33 diff --git a/npc/001-2-32/doors.txt b/npc/001-2-32/doors.txt new file mode 100644 index 00000000..828366d2 --- /dev/null +++ b/npc/001-2-32/doors.txt @@ -0,0 +1,38 @@ +// Evol scripts. +// Author: +// Reid +// Jesusalva +// Description: +// Doors NPCs. + +001-2-32,33,29,0 script ToFightRoom#001-2-32 NPC_HIDDEN,0,0,{ + +OnTouch: + if (getq(Artis_Legion_Progress) < 3) + { + narrator + l("You hear some sound behind the door."), + l("Somebody is probably training, better wait for them to finish."); + } + else + { + .@q2=getq2(Artis_Legion_Progress); + .@mapn$="atl2@"+getcharid(0); + // FIXME This code is extremely unreliable + if (isinstance(.@q2) && .@q2 >= 0) + { + instance_set_timeout(3600, 3600, .@q2); + warp .@mapn$, 24, 29; + } else { + .@inst = instance_create("ATL "+getcharid(0), getcharid(3), IOT_CHAR); + instance_attachmap("001-2-35", .@inst, false, .@mapn$); + // Instance lasts one hour + instance_set_timeout(3600, 3600, .@inst); + instance_init(.@inst); + setq2 Artis_Legion_Progress, .@inst; + } + + } + + close; +} diff --git a/npc/001-2-32/mapflags.txt b/npc/001-2-32/mapflags.txt new file mode 100644 index 00000000..8225ecbe --- /dev/null +++ b/npc/001-2-32/mapflags.txt @@ -0,0 +1 @@ +001-2-32 mapflag town 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; +} + + -- cgit v1.2.3-60-g2f50