diff options
author | Jesusaves <cpntb1@ymail.com> | 2022-10-23 21:44:22 -0300 |
---|---|---|
committer | Jesusaves <cpntb1@ymail.com> | 2022-10-23 21:44:22 -0300 |
commit | a7c45a192268da2601cef47a4cdba987ae2327ca (patch) | |
tree | c5fb5b97db109fe7106496dd96498c475881046b /npc/001-14 | |
download | serverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.tar.gz serverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.tar.bz2 serverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.tar.xz serverdata-a7c45a192268da2601cef47a4cdba987ae2327ca.zip |
Initial commit (Moubootaur Legends fork)
Diffstat (limited to 'npc/001-14')
-rw-r--r-- | npc/001-14/_import.txt | 6 | ||||
-rw-r--r-- | npc/001-14/_warps.txt | 123 | ||||
-rw-r--r-- | npc/001-14/ctrl.txt | 642 | ||||
-rw-r--r-- | npc/001-14/hocus.txt | 257 | ||||
-rw-r--r-- | npc/001-14/mapflags.txt | 1 |
5 files changed, 1029 insertions, 0 deletions
diff --git a/npc/001-14/_import.txt b/npc/001-14/_import.txt new file mode 100644 index 0000000..530b09c --- /dev/null +++ b/npc/001-14/_import.txt @@ -0,0 +1,6 @@ +// Map 001-14: Porthos - The Town Of Portals +// This file is generated automatically. All manually added changes will be removed when running the Converter. +"npc/001-14/_warps.txt", +"npc/001-14/ctrl.txt", +"npc/001-14/hocus.txt", +"npc/001-14/mapflags.txt", diff --git a/npc/001-14/_warps.txt b/npc/001-14/_warps.txt new file mode 100644 index 0000000..86f8a3f --- /dev/null +++ b/npc/001-14/_warps.txt @@ -0,0 +1,123 @@ +// This file is generated automatically. All manually added changes will be removed when running the Converter. +// Map 001-14: Porthos - The Town Of Portals warps +001-14,90,27,0 script #001-14_90_27 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 90,65; end; +} +001-14,62,33,0 script #001-14_62_33 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 79,70; end; +} +001-14,113,42,0 script #001-14_113_42 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 101,70; end; +} +001-14,135,57,0 script #001-14_135_57 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 110,78; end; +} +001-14,137,85,0 script #001-14_137_85 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 111,89; end; +} +001-14,135,113,0 script #001-14_135_113 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 109,102; end; +} +001-14,119,131,0 script #001-14_119_131 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 101,110; end; +} +001-14,90,139,0 script #001-14_90_139 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 90,114; end; +} +001-14,54,129,0 script #001-14_54_129 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 79,109; end; +} +001-14,39,110,0 script #001-14_39_110 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 71,101; end; +} +001-14,35,84,0 script #001-14_35_84 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 69,89; end; +} +001-14,43,46,0 script #001-14_43_46 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 71,78; end; +} +001-14,90,64,0 script #001-14_90_64 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 90,37; end; +} +001-14,101,69,0 script #001-14_101_69 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 113,49; end; +} +001-14,110,77,0 script #001-14_110_77 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 135,64; end; +} +001-14,111,90,0 script #001-14_111_90 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 137,92; end; +} +001-14,109,103,0 script #001-14_109_103 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 135,120; end; +} +001-14,101,111,0 script #001-14_101_111 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 119,138; end; +} +001-14,90,115,0 script #001-14_90_115 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 90,146; end; +} +001-14,79,110,0 script #001-14_79_110 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 54,136; end; +} +001-14,71,102,0 script #001-14_71_102 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 39,117; end; +} +001-14,69,90,0 script #001-14_69_90 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 35,91; end; +} +001-14,71,77,0 script #001-14_71_77 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 43,58; end; +} +001-14,79,69,0 script #001-14_79_69 NPC_HIDDEN,0,0,{ + end; +OnTouch: + slide 62,40; end; +} +001-14,92,89,0 warp #001-14_92_89 0,0,000-1,22,22 diff --git a/npc/001-14/ctrl.txt b/npc/001-14/ctrl.txt new file mode 100644 index 0000000..070c1c5 --- /dev/null +++ b/npc/001-14/ctrl.txt @@ -0,0 +1,642 @@ +// TMW2 script +// Author: +// Jesusalva +// Description: +// Magic Olympics + +001-14,91,90,0 script #MOLY_Sign00 NPC_NO_SPRITE,{ + dispbottom l("Welcome to Porthos - The Town of Portals (Kaizei's æther / Moubootaur Legends)"); + end; + +OnInit: + .distance=2; + end; +} + +///////////////////////////////////////////////////////////////////////////////// +// FIXME +001-14,88,27,0 script Hocus#MOLY1200 NPC_BLACKWIZARD,{ + npctalk l("Icicle Challenge"); + npctalk l("Not Yet Implemented - Sorry."); + end; + +OnInit: + .distance=7; + end; +} + +///////////////////////////////////////////////////////////////////////////////// +001-14,111,42,0 script Hocus#MOLY0100 NPC_BLACKWIZARD,{ + if (gettimetick(2) < @moly_tick) end; + if (@moly_chall) end; + mes ".:: " + l("Energy Ball Challenge") + ":: ."; + mes l("The goal is simple - I'll spawn an energy ball and you must kill it quickly. You'll be disqualified if you equip a non-magical weapon at any time."); + dnext; + mes l("You'll have 60 seconds to kill as many balls as you can!"); + mesc l("NOTE: Beside wands and staves, %s, %s, and the %s count as magic weapons.", getitemlink(Judgement), getitemlink(DarkPulsar), getitemlink(Lightbringer)); + mes ""; + mesc l("Your progress thus far: %s sparks", fnum(FYMOLY_ENBALL)), 3; + next; + mesc l("Begin campaign?"), 1; + if (askyesno() == ASK_NO) close; + @moly_tick = gettimetick(2) + 60; + @moly_score = 0; + @moly_chall = 1; + .m$=getmap(); + @map$=getmap(); + .@m=areamonster(.m$, 108, 43, 118, 48, "Target", YellowSpark, 1, "Hocus#MOLY0100::OnClick"); + setunitdata(.@m, UDT_HP, 1); + setunitdata(.@m, UDT_MAXHP, 1); + setunitdata(.@m, UDT_LEVEL, 1); + setunitdata(.@m, UDT_SPEED, 60); + npctalk3 l("Countdown: 1 minute"); + addtimer 2000, instance_npcname("Hocus#MOLY0100")+"::OnCheck"; + initnpctimer; + closeclientdialog; + close; + +OnTimer15000: + npctalk "45 seconds"; + end; + +OnTimer30000: + npctalk "30 seconds"; + end; + +OnTimer45000: + npctalk "15 seconds"; + end; + +OnTimer55000: + npctalk col("5 seconds", 1); + end; + +OnTimer60000: + killmonsterall(.m$); + maptimer2(.m$, 10, "Hocus#MOLY0100::OnEnd"); + npctalk col("Time out!", 1); + stopnpctimer; + end; + +OnClick: + if (gettimetick(2) > @moly_tick) end; + if (@moly_chall != 1) end; + @moly_score+=1; + .@m=areamonster(@map$, 108, 43, 118, 48, "Target", YellowSpark, 1, "Hocus#MOLY0100::OnClick"); + .@hp=rand2(50, 100); + setunitdata(.@m, UDT_MAXHP, .@hp); + setunitdata(.@m, UDT_HP, .@hp); + setunitdata(.@m, UDT_LEVEL, 1); + setunitdata(.@m, UDT_SPEED, 60); + setunitdata(.@m, UDT_MODE, MD_CANMOVE); + setunitdata(.@m, UDT_DEF, 32760); + setunitdata(.@m, UDT_MDEF, 0); + setunitdata(.@m, UDT_LUK, 32760); + end; + +OnCheck: + if (@moly_chall != 1) end; + if (gettimetick(2) > @moly_tick) end; + .@wp = getequipid(EQI_HAND_R); + // Disarmed + if (.@wp < 1) { + addtimer(2000, instance_npcname("Hocus#MOLY0100")+"::OnCheck"); + end; + } + // Illegal weapon + if (.@wp != Judgement && + .@wp != DarkPulsar && + .@wp != Lightbringer && + getiteminfo(.@wp, ITEMINFO_SUBTYPE) != W_STAFF) { + @moly_score = -1; + @moly_tick = 0; + @moly_chall = 0; + dispbottom col(l("You have been disqualified - illegal weapon: %s", getitemname(.@wp)), 1); + stopnpctimer; + killmonsterall(getmap()); + end; + } + addtimer 2000, instance_npcname("Hocus#MOLY0100")+"::OnCheck"; + end; + +OnEnd: + if (@moly_chall != 1) end; + .@pts=getq2(Q_AuroraEvent); + setq2 Q_AuroraEvent, .@pts+rand2(1, 1+@moly_scr/10); + dispbottom l("End! Score this time: %d", @moly_score); + FYMOLY_ENBALL = max(FYMOLY_ENBALL, @moly_score); + @moly_score = 0; + @moly_chall = 0; + end; + +OnInit: + .distance=7; + .m$="001-14"; + end; +} + +///////////////////////////////////////////////////////////////////////////////// +001-14,135,61,0 script Hocus#MOLY0200 NPC_BLACKWIZARD,{ + mes ".:: " + l("Intensive Mage Challenge") + ":: ."; + mes l("Description: Use a lot of magic spells, regardless of type or raw strength. Points earned by skill level."); + mesc l("Note: Passives and some skills (e.g. Resync) doesn't count."), 1; + mes ""; + mesc l("Your progress thus far: %s skills casted", fnum(FYMOLY_SPAMMY)), 3; + close; + +OnInit: + .distance=7; + end; +} + +///////////////////////////////////////////////////////////////////////////////// +// FIXME +001-14,139,85,0 script Hocus#MOLY0300 NPC_BLACKWIZARD,{ + npctalk l("Fluffy Hunter Challenge"); + npctalk l("Not Yet Implemented - Sorry."); + end; + +OnInit: + .distance=7; + end; +} + +///////////////////////////////////////////////////////////////////////////////// +// Note: Do player knows any chants? +001-14,135,117,0 script Hocus#MOLY0400 NPC_BLACKWIZARD,{ + mes ".:: " + l("Chanting Challenge") + ":: ."; + mes l("Description: Use chant-based magic. All chants score equally."); + mes ""; + mesc l("Your progress thus far: %s chants casted", fnum(FYMOLY_CHANTI)), 3; + close; + +OnInit: + .distance=7; + end; +} + +///////////////////////////////////////////////////////////////////////////////// +001-14,119,135,0 script Hocus#MOLY0500 NPC_NICHOLAS,{ + mes ".:: " + l("Alchemy Master Challenge") + ":: ."; + mes l("Description: Whoever crafts more potions, regardless of type, wins this event."); + mes ""; + mesc l("Your progress thus far: %s potions baked", fnum(FYMOLY_ALCHMY)), 3; + next; + // FREE brewing during event + do { + mesc l("What will you brew today?"); + mes ""; + + if (AlchemySystem(CRAFT_PLAYER)) { + mesc l("Success!"), 3; + } else { + mesc l("That didn't work!"), 1; + } + next; + mesc l("Try again?"); + } while (askyesno() == ASK_YES); + close; + +OnInit: + .distance=7; + end; +} + +///////////////////////////////////////////////////////////////////////////////// +001-14,88,139,0 script Hocus#MOLY0600 NPC_BLACKWIZARD,{ + if (@moly_chall) end; + mes ".:: " + l("Magic Raw Power Challenge") + ":: ."; + mes l("Description: For starters, I'll blow away all your summons and summon an ent. You must do the most damage to it within 10 seconds."); + mes l("Using potions and support magic is fine. It has high defense, so magic attacks work better."); + mesc l("Only magic weapons are allowed, but legendary ones - %s and %s - won't be tolerated.", getitemlink(Runestaff), getitemlink(Lightbringer)), 1; + mes ""; + mesc l("Your progress thus far: %s damage inflicted", fnum(FYMOLY_MPWLVL)), 3; + next; + mesc l("Begin campaign?"), 1; + if (askyesno() == ASK_NO) close; + killmonsterall(getmap()); + .@m=areamonster(getmap(), 87, 140, 93, 145, strmobinfo(1, EntAbomination), EntAbomination, 1); + setunitdata(.@m, UDT_MAXHP, 1000000); + setunitdata(.@m, UDT_HP, 1000000); + setunitdata(.@m, UDT_LEVEL, 1); + setunitdata(.@m, UDT_SPEED, 60); + setunitdata(.@m, UDT_MODE, MD_CANMOVE|MD_CANATTACK|MD_BOSS); + setunitdata(.@m, UDT_DEF, 999); + setunitdata(.@m, UDT_MDEF, 0); + setunitdata(.@m, UDT_LUK, 32760); + .mob = .@m; + .pid = getcharid(3); + @moly_tick = gettimetick(2) + 60; + @moly_score = 0; + @moly_chall = 6; + npctalk "10"; + addtimer 550, instance_npcname("Hocus#MOLY0600")+"::OnCheck"; + initnpctimer; + closeclientdialog; + close; + +OnCheck: + if (@moly_chall != 6) end; + if (gettimetick(2) > @moly_tick) end; + .@wp = getequipid(EQI_HAND_R); + // Disarmed + if (.@wp < 1) { + addtimer(550, instance_npcname("Hocus#MOLY0600")+"::OnCheck"); + end; + } + // Illegal weapon + if ((.@wp == Lightbringer || .@wp == Runestaff) || + (.@wp != Judgement && + .@wp != DarkPulsar && + getiteminfo(.@wp, ITEMINFO_SUBTYPE) != W_STAFF)) { + @moly_score = -1; + @moly_tick = 0; + @moly_chall = 0; + dispbottom col(l("You have been disqualified - illegal weapon: %s", getitemname(.@wp)), 1); + stopnpctimer; + killmonsterall(getmap()); + end; + } + addtimer 550, instance_npcname("Hocus#MOLY0600")+"::OnCheck"; + end; + +OnTimer1000: + npctalk "9"; end; +OnTimer2000: + npctalk "8"; end; +OnTimer3000: + npctalk "7"; end; +OnTimer4000: + npctalk "6"; end; +OnTimer5000: + npctalk "5"; end; +OnTimer6000: + npctalk "4"; end; +OnTimer7000: + npctalk col("3", 1); end; +OnTimer8000: + npctalk col("2", 1); end; +OnTimer9000: + npctalk col("1", 1); end; +OnTimer10000: + npctalk col("Time out!", 1); + stopnpctimer; + attachrid(.pid); + if (@moly_chall != 6) end; + @moly_score = (getunitdata(.mob, UDT_HP) - getunitdata(.mob, UDT_MAXHP)) * -1; + killmonsterall(getmap()); + .@pts=getq2(Q_AuroraEvent); + setq2 Q_AuroraEvent, .@pts+rand2(1, 1+@moly_score/1500); + dispbottom l("End! Score this time: %d", @moly_score); + FYMOLY_MPWLVL = max(FYMOLY_MPWLVL, @moly_score); + @moly_score = 0; + @moly_chall = 0; + end; + +OnInit: + .distance=7; + .mob = 0; + .pid = 0; + end; +} + +///////////////////////////////////////////////////////////////////////////////// +001-14,54,133,0 script Hocus#MOLY0700 NPC_BLACKWIZARD,{ + mes ".:: " + l("Mana Experience Challenge") + ":: ."; + mes l("Description: Similar to Intensive Mage, but measures mana experience - meaning even less skills will count, and swapping skills give a better effect."); + mes ""; + mesc l("Your progress thus far: %s exp earned", fnum(FYMOLY_MANAXP)), 3; + close; + +OnInit: + .distance=7; + end; +} + +///////////////////////////////////////////////////////////////////////////////// +001-14,39,114,0 script Hocus#MOLY0800 NPC_BLACKWIZARD,{ + if (@moly_chall) end; + mes ".:: " + l("Maze Race Challenge") + ":: ."; + mes l("Description: Reach the other side of the maze and defeat the %s as quick as possible.", getmonsterlink(EntAbomination)); + mes l("There'll be monsters, the maze is randomly generated, and the initial position for you and the Ent is not fixed. Therefore, you may begin handicapped in some cases depending on luck only."); + mesc l("NOTE: No equipment restriction. Less time is better."); + mes ""; + mesc l("Your progress thus far: %s taken.", FuzzyTime(gettimetick(2) + FYMOLY_RACERS)), 3; + next; + mesc l("Begin campaign?"), 1; + if (askyesno() == ASK_NO) close; + addtimer 2500, instance_npcname("Hocus#MOLY0800")+"::OnCheck"; + @map$ = getmap(); + @moly_tick = gettimetick(2); // Will be used to determine score + @moly_score = 0; // Actually unused + @moly_chall = 8; + + CreateMaze(IOT_CHAR); + MazeMobs((max(6, BaseLevel) - 5), false, rand2(12,16)); + InitMaze(900, false, false); + + // Create the target boss + .@mx=getmapinfo(MAPINFO_SIZE_X, MAZE_MAP$)-20; + .@my=getmapinfo(MAPINFO_SIZE_Y, MAZE_MAP$)-20; + .@m=areamonster(MAZE_MAP$, .@mx-20, .@my-20, .@mx, .@my, strmobinfo(1, EntAbomination), EntAbomination, 1, "Hocus#MOLY0800::OnWin"); + setunitdata(.@m, UDT_MAXHP, 100); + setunitdata(.@m, UDT_HP, 100); + setunitdata(.@m, UDT_LEVEL, 1); + setunitdata(.@m, UDT_MODE, MD_BOSS); + setunitdata(.@m, UDT_LUK, 32760); + closeclientdialog; + end; + +OnWin: + warp @map$, 39, 117; + if (@moly_tick < gettimetick(2) / 2) end; // Ticks were Corrupted + @moly_score = gettimetick(2) - @moly_tick; + if (@moly_score < 8) end; // This is impossible*, don't even bother + .@pts=getq2(Q_AuroraEvent); + setq2 Q_AuroraEvent, .@pts+rand2(1, 1+BaseLevel/20); + dispbottom l("End! Score this time: %s", FuzzyTime(@moly_tick)); + if (FYMOLY_RACERS >= 8) + FYMOLY_RACERS = min(FYMOLY_RACERS, @moly_score); + else + FYMOLY_RACERS = @moly_score; + @moly_score = 0; + @moly_chall = 0; + // *: Distance is always at least ~50 tiles in a straight line + end; + +OnCheck: + if (@moly_chall != 8) end; + // Game Over + if (ispcdead() || + getmap() != MAZE_MAP$) { // NOT a typo - starting square is OK + // Game Over! + dispbottom col(l("You have been disqualified - died or left the maze"), 1); + @moly_score = 0; + @moly_chall = 0; + end; + } + addtimer 2500, instance_npcname("Hocus#MOLY0800")+"::OnCheck"; + end; + +OnInit: + .distance=7; + end; +} + +///////////////////////////////////////////////////////////////////////////////// +001-14,37,84,0 script Hocus#MOLY0900 NPC_BLACKWIZARD,{ + if (@moly_chall) end; + mes ".:: " + l("Hocus Said So Challenge") + ":: ."; + mes l("Description: There'll be differently colored sparks and you must kill ONLY those of the color I say so! Failure to do so will cause immediate disqualification!"); + mesc l("PS. No equipment restriction"); + mes ""; + mesc l("Your progress thus far: %s sparks killed", fnum(FYMOLY_HOCUSM)), 3; + next; + mesc l("Begin campaign?"), 1; + if (askyesno() == ASK_NO) close; + @moly_tick = gettimetick(2) + 60; + @moly_score = 0; + @moly_chall = 9; + .m$=getmap(); + @map$=getmap(); + .@m=areamonster(.m$, 38, 85, 40, 90, strmobinfo(1, YellowSpark), YellowSpark, 1, "Hocus#MOLY0900::OnClY"); + setunitdata(.@m, UDT_HP, 1); + setunitdata(.@m, UDT_MAXHP, 1); + setunitdata(.@m, UDT_LEVEL, 1); + setunitdata(.@m, UDT_SPEED, 60); + .@m=areamonster(.m$, 38, 85, 40, 90, strmobinfo(1, MagentaSpark), MagentaSpark, 1, "Hocus#MOLY0900::OnClM"); + setunitdata(.@m, UDT_HP, 1); + setunitdata(.@m, UDT_MAXHP, 1); + setunitdata(.@m, UDT_LEVEL, 1); + setunitdata(.@m, UDT_SPEED, 60); + .@m=areamonster(.m$, 38, 85, 40, 90, strmobinfo(1, YellowSpark), YellowSpark, 1, "Hocus#MOLY0900::OnClY"); + setunitdata(.@m, UDT_HP, 1); + setunitdata(.@m, UDT_MAXHP, 1); + setunitdata(.@m, UDT_LEVEL, 1); + setunitdata(.@m, UDT_SPEED, 60); + .@m=areamonster(.m$, 38, 85, 40, 90, strmobinfo(1, MagentaSpark), MagentaSpark, 1, "Hocus#MOLY0900::OnClM"); + setunitdata(.@m, UDT_HP, 1); + setunitdata(.@m, UDT_MAXHP, 1); + setunitdata(.@m, UDT_LEVEL, 1); + setunitdata(.@m, UDT_SPEED, 60); + @cl=any(YellowSpark, MagentaSpark); + npctalk3 l("Countdown: 1 minute - Kill %s!", strmobinfo(1, @cl)); + initnpctimer; + closeclientdialog; + close; + +OnTimer9000: + npctalk "Hocus commands..."; + end; + +OnTimer10000: + maptimer2(.m$, 10, "Hocus#MOLY0900::OnSeed"); + npctalk sprintf("Time left = 50 seconds"); + end; + +OnTimer19000: + npctalk "Hocus commands..."; + end; + +OnTimer20000: + maptimer2(.m$, 10, "Hocus#MOLY0900::OnSeed"); + npctalk sprintf("Time left = 40 seconds"); + end; + +OnTimer29000: + npctalk "Hocus commands..."; + end; + +OnTimer30000: + maptimer2(.m$, 10, "Hocus#MOLY0900::OnSeed"); + npctalk sprintf("Time left = 30 seconds"); + end; + +OnTimer39000: + npctalk "Hocus commands..."; + end; + +OnTimer40000: + maptimer2(.m$, 10, "Hocus#MOLY0900::OnSeed"); + npctalk sprintf("Time left = 20 seconds"); + end; + +OnTimer49000: + npctalk "Hocus commands..."; + end; + +OnTimer50000: + maptimer2(.m$, 10, "Hocus#MOLY0900::OnSeed"); + npctalk sprintf("Time left = 10 seconds"); + end; + +OnTimer55000: + npctalk col("5 seconds", 1); + end; + +OnTimer60000: + killmonsterall(.m$); + maptimer2(.m$, 10, "Hocus#MOLY0900::OnEnd"); + npctalk col("Time out!", 1); + stopnpctimer; + end; + +OnSeed: + @cl=any(YellowSpark, MagentaSpark); + dispbottom l("Kill %s!", strmobinfo(1, @cl)); + end; + +OnClY: + if (gettimetick(2) > @moly_tick) end; + if (@moly_chall != 9) end; + if (@cl != YellowSpark) { + @moly_score = -1; + @moly_tick = 0; + @moly_chall = 0; + dispbottom col(l("You have been disqualified - target was: %s", strmobinfo(1, @cl)), 1); + killmonsterall(getmap()); + // FIXME: Stop npc timer + end; + } + @moly_score+=1; + .@m=areamonster(getmap(), 38, 85, 40, 90, strmobinfo(1, YellowSpark), YellowSpark, 1, "Hocus#MOLY0900::OnClY"); + setunitdata(.@m, UDT_HP, 1); + setunitdata(.@m, UDT_MAXHP, 1); + setunitdata(.@m, UDT_LEVEL, 1); + setunitdata(.@m, UDT_SPEED, 60); + end; + +OnClM: + if (gettimetick(2) > @moly_tick) end; + if (@moly_chall != 9) end; + if (@cl != MagentaSpark) { + @moly_score = -1; + @moly_tick = 0; + @moly_chall = 0; + dispbottom col(l("You have been disqualified - target was: %s", strmobinfo(1, @cl)), 1); + killmonsterall(getmap()); + // FIXME: Stop npc timer + end; + } + @moly_score+=1; + .@m=areamonster(getmap(), 38, 85, 40, 90, strmobinfo(1, MagentaSpark), MagentaSpark, 1, "Hocus#MOLY0900::OnClM"); + setunitdata(.@m, UDT_HP, 1); + setunitdata(.@m, UDT_MAXHP, 1); + setunitdata(.@m, UDT_LEVEL, 1); + setunitdata(.@m, UDT_SPEED, 60); + end; + +OnEnd: + if (@moly_chall != 9) end; + .@pts=getq2(Q_AuroraEvent); + setq2 Q_AuroraEvent, .@pts+rand2(1, 1+@moly_score/10); + dispbottom l("End! Score this time: %d", @moly_score); + FYMOLY_HOCUSM = max(FYMOLY_HOCUSM, @moly_score); + @moly_score = 0; + @moly_chall = 0; + end; + +OnInit: + .distance=7; + .m$="001-14"; + .cl=Dummy; + end; +} + +///////////////////////////////////////////////////////////////////////////////// +001-14,41,46,0 script Hocus#MOLY1000 NPC_BLACKWIZARD,{ + if (@moly_chall) end; + mes ".:: " + l("Survival Challenge") + ":: ."; + mes l("Description: Survive for the longest you can without leaving the designed region."); + mes l("Using potions and support magic is fine, as well as summons; but using a non-magical weapon will disqualify you."); + mesc l("NOTE: Beside wands and staves, %s, %s, and the %s count as magic weapons.", getitemlink(Judgement), getitemlink(DarkPulsar), getitemlink(Lightbringer)); + mes ""; + mesc l("Your progress thus far: %s survived.", FuzzyTime(gettimetick(2) + FYMOLY_SURVIV)), 3; + next; + mesc l("Begin campaign?"), 1; + if (askyesno() == ASK_NO) close; + killmonsterall(getmap()); + @moly_score = 0; + @moly_chall = 10; + @map$ = getmap(); + addtimer 500, instance_npcname("Hocus#MOLY1000")+"::OnCheck"; + closeclientdialog; + close; + +OnCheck: + if (@moly_chall != 10) end; + @moly_score += 1; + // Game Over + if (ispcdead() || + !isin(@map$, 37, 47, 49, 58)) { // NOT a typo - starting square is OK + // Game Over! + killmonsterall(getmap()); + @moly_score = @moly_score / 2; + .@pts=getq2(Q_AuroraEvent); + setq2 Q_AuroraEvent, .@pts+rand2(1, 1+@moly_score/20); + dispbottom l("End! Score this time: %s", FuzzyTime(gettimetick(2)+@moly_score)); + FYMOLY_SURVIV = max(FYMOLY_SURVIV, @moly_score); + @moly_score = 0; + @moly_chall = 0; + end; + } + /* Spawn */ + if (!(@moly_score % 2)) { + .@m=areamonster(getmap(), 37, 47, 49, 57, strmobinfo(1, EntAbomination), EntAbomination, 1); + setunitdata(.@m, UDT_MAXHP, 50 + @moly_score * 6); + setunitdata(.@m, UDT_HP, 50 + @moly_score * 6); + setunitdata(.@m, UDT_LEVEL, 1 + (@moly_score / 2)); + setunitdata(.@m, UDT_SPEED, max(50, 900-(@moly_score * 10))); + setunitdata(.@m, UDT_MODE, MD_CANMOVE|MD_CANATTACK|MD_AGGRESSIVE|MD_ANGRY); + setunitdata(.@m, UDT_DEF, min(32760, 20+@moly_score)); + setunitdata(.@m, UDT_MDEF, min(32760, @moly_score)); + setunitdata(.@m, UDT_LUK, min(32760, rand2(@moly_score) * 7)); + setunitdata(.@m, UDT_HIT, 32760); + setunitdata(.@m, UDT_FLEE, 0); + setunitdata(.@m, UDT_ATKMIN, @moly_score); + setunitdata(.@m, UDT_ATKMAX, @moly_score+20); + setunitdata(.@m, UDT_ADELAY, max(672, 1872-(@moly_score * 4))); + } + /* Weapon Check */ + .@wp = getequipid(EQI_HAND_R); + // Disarmed + if (.@wp < 1) { + addtimer 500, instance_npcname("Hocus#MOLY1000")+"::OnCheck"; + end; + } + // Illegal weapon + if (.@wp != Judgement && + .@wp != DarkPulsar && + .@wp != Lightbringer && + getiteminfo(.@wp, ITEMINFO_SUBTYPE) != W_STAFF) { + @moly_score = -1; + @moly_tick = 0; + @moly_chall = 0; + dispbottom col(l("You have been disqualified - illegal weapon: %s", getitemname(.@wp)), 1); + killmonsterall(getmap()); + end; + } + addtimer 500, instance_npcname("Hocus#MOLY1000")+"::OnCheck"; + end; + +OnInit: + .distance=7; + end; +} + +///////////////////////////////////////////////////////////////////////////////// +001-14,62,37,0 script Hocus#MOLY1100 NPC_BLACKWIZARD,{ + mes ".:: " + l("Friendship's Strength Challenge") + ":: ."; + mes l("Description: Use support skills and win the event with the power of FRIENDSHIP!"); + mesc l("Note: Support skills used on self does not count."), 1; + mes ""; + mesc l("Your progress thus far: %s friends supported", fnum(FYMOLY_FRIEND)), 3; + close; + +OnInit: + .distance=7; + end; +} + + + diff --git a/npc/001-14/hocus.txt b/npc/001-14/hocus.txt new file mode 100644 index 0000000..3bc241f --- /dev/null +++ b/npc/001-14/hocus.txt @@ -0,0 +1,257 @@ +// TMW2 script +// Author: +// Jesusalva +// Description: +// Magic Olympics + +function script HocusScoreNew { + .@nb = query_sql("SELECT c.name, i.value FROM `char_reg_num_db` AS i, `char` AS c WHERE i.key='FYMOLY_ENBALL' AND i.char_id=c.char_id ORDER BY i.value DESC LIMIT 10", $@moly01_n$, $@moly01_v); + .@nb = query_sql("SELECT c.name, i.value FROM `char_reg_num_db` AS i, `char` AS c WHERE i.key='FYMOLY_ICBOSS' AND i.value > 0 AND i.char_id=c.char_id ORDER BY i.value ASC LIMIT 10", $@moly02_n$, $@moly02_v); // Oddball: less is more + .@nb = query_sql("SELECT c.name, i.value FROM `char_reg_num_db` AS i, `char` AS c WHERE i.key='FYMOLY_FLUFFY' AND i.char_id=c.char_id ORDER BY i.value DESC LIMIT 10", $@moly03_n$, $@moly03_v); + .@nb = query_sql("SELECT c.name, i.value FROM `char_reg_num_db` AS i, `char` AS c WHERE i.key='FYMOLY_CHANTI' AND i.char_id=c.char_id ORDER BY i.value DESC LIMIT 10", $@moly04_n$, $@moly04_v); + .@nb = query_sql("SELECT c.name, i.value FROM `char_reg_num_db` AS i, `char` AS c WHERE i.key='FYMOLY_ALCHMY' AND i.char_id=c.char_id ORDER BY i.value DESC LIMIT 10", $@moly05_n$, $@moly05_v); + .@nb = query_sql("SELECT c.name, i.value FROM `char_reg_num_db` AS i, `char` AS c WHERE i.key='FYMOLY_MPWLVL' AND i.char_id=c.char_id ORDER BY i.value DESC LIMIT 10", $@moly06_n$, $@moly06_v); + .@nb = query_sql("SELECT c.name, i.value FROM `char_reg_num_db` AS i, `char` AS c WHERE i.key='FYMOLY_MANAXP' AND i.char_id=c.char_id ORDER BY i.value DESC LIMIT 10", $@moly07_n$, $@moly07_v); + .@nb = query_sql("SELECT c.name, i.value FROM `char_reg_num_db` AS i, `char` AS c WHERE i.key='FYMOLY_RACERS' AND i.value > 5 AND i.char_id=c.char_id ORDER BY i.value ASC LIMIT 10", $@moly08_n$, $@moly08_v); // Oddball: less is more + .@nb = query_sql("SELECT c.name, i.value FROM `char_reg_num_db` AS i, `char` AS c WHERE i.key='FYMOLY_HOCUSM' AND i.char_id=c.char_id ORDER BY i.value DESC LIMIT 10", $@moly09_n$, $@moly09_v); + .@nb = query_sql("SELECT c.name, i.value FROM `char_reg_num_db` AS i, `char` AS c WHERE i.key='FYMOLY_SURVIV' AND i.char_id=c.char_id ORDER BY i.value DESC LIMIT 10", $@moly10_n$, $@moly10_v); + .@nb = query_sql("SELECT c.name, i.value FROM `char_reg_num_db` AS i, `char` AS c WHERE i.key='FYMOLY_FRIEND' AND i.char_id=c.char_id ORDER BY i.value DESC LIMIT 10", $@moly11_n$, $@moly11_v); + .@nb = query_sql("SELECT c.name, i.value FROM `char_reg_num_db` AS i, `char` AS c WHERE i.key='FYMOLY_SPAMMY' AND i.char_id=c.char_id ORDER BY i.value DESC LIMIT 10", $@moly12_n$, $@moly12_v); + + /* Regenerate global scores */ + deletearray $@moly_n$; + deletearray $@moly_v; + deletearray .@moly_n$; + deletearray .@moly_v; + freeloop(true); + // Challenge 01: Energy Balls + for (.@i = 0; .@i < getarraysize($@moly01_v); .@i++) { + .@p = 10-.@i; + .@m = array_find(.@moly_n$, $@moly01_n$[.@i]); + if (.@m < 0) + .@m = array_push(.@moly_n$, $@moly01_n$[.@i]) - 1; + .@moly_v[.@m] += .@p; + } + // Challenge 02: Boss Fight + for (.@i = 0; .@i < getarraysize($@moly02_v); .@i++) { + .@p = 10-.@i; + .@m = array_find(.@moly_n$, $@moly02_n$[.@i]); + if (.@m < 0) + .@m = array_push(.@moly_n$, $@moly02_n$[.@i]) - 1; + .@moly_v[.@m] += .@p; + } + // Challenge 03: Hunt the Fluffies + for (.@i = 0; .@i < getarraysize($@moly03_v); .@i++) { + .@p = 10-.@i; + .@m = array_find(.@moly_n$, $@moly03_n$[.@i]); + if (.@m < 0) + .@m = array_push(.@moly_n$, $@moly03_n$[.@i]) - 1; + .@moly_v[.@m] += .@p; + } + // Challenge 04: Chanting + for (.@i = 0; .@i < getarraysize($@moly04_v); .@i++) { + .@p = 10-.@i; + .@m = array_find(.@moly_n$, $@moly04_n$[.@i]); + if (.@m < 0) + .@m = array_push(.@moly_n$, $@moly04_n$[.@i]) - 1; + .@moly_v[.@m] += .@p; + } + // Challenge 05: Alchemy Master + for (.@i = 0; .@i < getarraysize($@moly05_v); .@i++) { + .@p = 10-.@i; + .@m = array_find(.@moly_n$, $@moly05_n$[.@i]); + if (.@m < 0) + .@m = array_push(.@moly_n$, $@moly05_n$[.@i]) - 1; + .@moly_v[.@m] += .@p; + } + // Challenge 06: Magic Power + for (.@i = 0; .@i < getarraysize($@moly06_v); .@i++) { + .@p = 10-.@i; + .@m = array_find(.@moly_n$, $@moly06_n$[.@i]); + if (.@m < 0) + .@m = array_push(.@moly_n$, $@moly06_n$[.@i]) - 1; + .@moly_v[.@m] += .@p; + } + // Challenge 07: Mana Exp + for (.@i = 0; .@i < getarraysize($@moly07_v); .@i++) { + .@p = 10-.@i; + .@m = array_find(.@moly_n$, $@moly07_n$[.@i]); + if (.@m < 0) + .@m = array_push(.@moly_n$, $@moly07_n$[.@i]) - 1; + .@moly_v[.@m] += .@p; + } + // Challenge 08: Race + for (.@i = 0; .@i < getarraysize($@moly08_v); .@i++) { + .@p = 10-.@i; + .@m = array_find(.@moly_n$, $@moly08_n$[.@i]); + if (.@m < 0) + .@m = array_push(.@moly_n$, $@moly08_n$[.@i]) - 1; + .@moly_v[.@m] += .@p; + } + // Challenge 09: Hocus Said So + for (.@i = 0; .@i < getarraysize($@moly09_v); .@i++) { + .@p = 10-.@i; + .@m = array_find(.@moly_n$, $@moly09_n$[.@i]); + if (.@m < 0) + .@m = array_push(.@moly_n$, $@moly09_n$[.@i]) - 1; + .@moly_v[.@m] += .@p; + } + // Challenge 10: Survive! + for (.@i = 0; .@i < getarraysize($@moly10_v); .@i++) { + .@p = 10-.@i; + .@m = array_find(.@moly_n$, $@moly10_n$[.@i]); + if (.@m < 0) + .@m = array_push(.@moly_n$, $@moly10_n$[.@i]) - 1; + .@moly_v[.@m] += .@p; + } + // Challenge 11: Friendship Strength + for (.@i = 0; .@i < getarraysize($@moly11_v); .@i++) { + .@p = 10-.@i; + .@m = array_find(.@moly_n$, $@moly11_n$[.@i]); + if (.@m < 0) + .@m = array_push(.@moly_n$, $@moly11_n$[.@i]) - 1; + .@moly_v[.@m] += .@p; + } + // Challenge 12: Intensive Mage + for (.@i = 0; .@i < getarraysize($@moly12_v); .@i++) { + .@p = 10-.@i; + .@m = array_find(.@moly_n$, $@moly12_n$[.@i]); + if (.@m < 0) + .@m = array_push(.@moly_n$, $@moly12_n$[.@i]) - 1; + .@moly_v[.@m] += .@p; + } + freeloop(false); + /* Reorder the .@moly into $@moly */ + do + { + .@t = array_highest(.@moly_v); + if (.@t < 0 || getarraysize($@moly_v) > 10) break; + if (.@moly_v[.@t] < 1) break; + array_push($@moly_n$, .@moly_n$[.@t]); + array_push($@moly_v, .@moly_v[.@t]); + .@moly_v[.@t] = 0; + } while (true); + return; +} + +///////////////////////////////////////////////////////////////////////////////// +001-14,89,89,0 script Hocus Pocus NPC_BLACKWIZARD,{ + function showScores; + function parseScores; + if ($EVENT$ != "Olympics") cwarp "Save", 0, 0; + mesn; + mesq l("Greetings, %s %s, I am Hocus Pocus the Grandmaster.", academicrank(), strcharinfo(0)); + do + { + next; + select + l("Scoreboards"), + l("Detailed Information"), + l("Thanks for your wise words."); + mes ""; + switch (@menu) { + case 1: + showScores(); + break; + case 2: + mesn; + mesq l("The Magic Olympics consist in twelve challenges with scoreboards."); + next; + mesn; + mesq l("Getting ranked #1 in a challenge yields you 10 points, getting ranked #2 yields you 9 points and so on."); + next; + mesn; + mesq l("Not participating in a challenge yields you zero points. In case of a tie, char creation date will be the decisive factor: Older adventurers will get the preference."); + next; + mesn; + mesq l("You also get points for participation, exchange them with Aurora back in Tulimshar before event ends."); + next; + mesn; + mesq l("The grand winner will get a %s. Both the first and second place will get a tuition at the Magic Academy.", getitemlink(BlackyCat)); + next; + mesn; + mesq l("The Magic Olympics happen roughly quarterly, but not always at the same dates. It begins on a monday and ends on the sunday. It usually happens two weeks after the Mining Union Research Request event."); + break; + } + } while (@menu != 3); + close; + +function t { + return gettimetick(2); +} + +function showScores { + parseScores("General Event Score", "$@moly_n$", "$@moly_v"); + mesc l("Reminder: "), 1; + mesc l("Scores are updated every 6 hours."), 1; + next; + parseScores("Energy Balls Challenge", "$@moly01_n$", "$@moly01_v"); + //parseScores("Boss Fight Challenge", "$@moly02_n$", "$@moly02_v", 0); + //parseScores("Fluffy Hunt Challenge", "$@moly03_n$", "$@moly03_v"); + parseScores("Chanting Challenge", "$@moly04_n$", "$@moly04_v"); + parseScores("Alchemy Master Challenge", "$@moly05_n$", "$@moly05_v"); + parseScores("Magic Power Challenge", "$@moly06_n$", "$@moly06_v"); + parseScores("Mana Exp Challenge", "$@moly07_n$", "$@moly07_v"); + parseScores("Obstacle Race Challenge", "$@moly08_n$", "$@moly08_v", t()); + parseScores("Hocus Commands Challenge", "$@moly09_n$", "$@moly09_v"); + parseScores("Survive! Challenge", "$@moly10_n$", "$@moly10_v", t()); + parseScores("Friendship Challenge", "$@moly11_n$", "$@moly11_v"); + parseScores("Intensive Mage Challenge", "$@moly12_n$", "$@moly12_v"); + mes ""; + mesc l("Reminder: "), 1; + mesc l("Scores close at Sunday 23:59 - No scores will be given for last minute rushes!"), 1; + return; +} + +function SCH { + .@n$ = getarg(0); + .@i = getarg(1); + return getd(sprintf("%s[%d]", .@n$, .@i)); +} + +function parseScores { + .@t$ = getarg(0); + .@n$ = getarg(1); + .@v$ = getarg(2); + .@tm = getarg(3, -1); + mes ""; + mes l("##B%s: TOP 10##b", .@t$); + if (.@tm < 0) { + mes("1."+SCH(.@n$, 0)+" ("+fnum(SCH(.@v$, 0))+")"); + mes("2."+SCH(.@n$, 1)+" ("+fnum(SCH(.@v$, 1))+")"); + mes("3."+SCH(.@n$, 2)+" ("+fnum(SCH(.@v$, 2))+")"); + mes("4."+SCH(.@n$, 3)+" ("+fnum(SCH(.@v$, 3))+")"); + mes("5."+SCH(.@n$, 4)+" ("+fnum(SCH(.@v$, 4))+")"); + mes("6."+SCH(.@n$, 5)+" ("+fnum(SCH(.@v$, 5))+")"); + mes("7."+SCH(.@n$, 6)+" ("+fnum(SCH(.@v$, 6))+")"); + mes("8."+SCH(.@n$, 7)+" ("+fnum(SCH(.@v$, 7))+")"); + mes("9."+SCH(.@n$, 8)+" ("+fnum(SCH(.@v$, 8))+")"); + mes("10."+SCH(.@n$, 9)+" ("+fnum(SCH(.@v$, 9))+")"); + } else { + mes("1."+SCH(.@n$, 0)+" ("+FuzzyTime(.@tm - SCH(.@v$, 0))+")"); + mes("2."+SCH(.@n$, 1)+" ("+FuzzyTime(.@tm - SCH(.@v$, 1))+")"); + mes("3."+SCH(.@n$, 2)+" ("+FuzzyTime(.@tm - SCH(.@v$, 2))+")"); + mes("4."+SCH(.@n$, 3)+" ("+FuzzyTime(.@tm - SCH(.@v$, 3))+")"); + mes("5."+SCH(.@n$, 4)+" ("+FuzzyTime(.@tm - SCH(.@v$, 4))+")"); + mes("6."+SCH(.@n$, 5)+" ("+FuzzyTime(.@tm - SCH(.@v$, 5))+")"); + mes("7."+SCH(.@n$, 6)+" ("+FuzzyTime(.@tm - SCH(.@v$, 6))+")"); + mes("8."+SCH(.@n$, 7)+" ("+FuzzyTime(.@tm - SCH(.@v$, 7))+")"); + mes("9."+SCH(.@n$, 8)+" ("+FuzzyTime(.@tm - SCH(.@v$, 8))+")"); + mes("10."+SCH(.@n$, 9)+" ("+FuzzyTime(.@tm - SCH(.@v$, 9))+")"); + } + dnext; + return; +} + +OnInit: + .distance=5; +// Scoreboards are refreshed every 6 hours +OnHour2359: +OnHour0559: +OnHour1159: +OnHour1759: + if ($EVENT$ != "Olympics") end; + HocusScoreNew(); + end; +} + diff --git a/npc/001-14/mapflags.txt b/npc/001-14/mapflags.txt new file mode 100644 index 0000000..7f9ecda --- /dev/null +++ b/npc/001-14/mapflags.txt @@ -0,0 +1 @@ +001-14 mapflag zone MMO |