// TMW2 scripts. // Authors: // Jesusalva // Description: // AURORA EVENT FRAMEWORK // Previously known as FY:Event System // // Controls weekly events so Saulc, seeds and I can take vacations. // See also: seasons.txt, command/event.txt, event.txt, 003-1/events.txt // soulmenhir.txt, scoreboards.txt and, of course, the event maps (if any). // Aurora Event Framework functions are called by event.txt // specs override and is overriden by those defined in commands/event.txt // Variables: // $MOST_HEROIC$ // Updated every 2 weeks, the top 1 from previous event // Only the hero may begin sieges against Fortress Town. // Every NPC will recognize them, and Lightbringer will also // pay special attention to them. // $FYEVENT_CYCLE // Current cycle. I thought in using gettimeparam(WEEK) but gave up. // Q_AuroraEvent // Quest Variable: DayCtrl, Score, ClaimedControl // // Event Specific Variables: // $REGNUM_BLESSMAP$ // Map under Regnum's Blessing // $REGNUM_BLESSMAP_H$ // Human-readable form of the map under Regnum's Blessing // // $FYREWARD_PT // Array with minimum points for rewards (primary key) // $FYREWARD_ID // Array with claimable reward IDs // $FYREWARD_AM // Array with the amount of the reward ID you'll receive // $FYLOGIN_PTS // How many event score boost you'll receive for daily login // // $WORLDEXPO_ENEMY$ // Name of the enemy responsible for ruining the World's Expo // $RAIDING_BOSS$ // Name of the enemy who is raiding down the world // $DREAMTOWER_SAGE$ // Name of the sage who owns the Dream Towers // DTOWER_DAY (CharReg) // Player variable which controls Dream Tower reset // DTOWER_ROLL (CharReg) // Player variable which controls Dream Ticket drop rate // DTOWER_FLOOR (CharReg) // Player variable which controls current Dream Tower floor // AEF: BEGIN function script FYNewEvent { debugmes "\033[1mFY event is set to happen...\033[0m"; // Aurora Events only begin after Liberation Day if ($GAME_STORYLINE < 1) return; // Update the loop $FYEVENT_CYCLE+=1; // Overrides standard event system $EVENT$=""; // Delayed cleanup (Just in case) DelQuestFromEveryPlayer(Q_AuroraEvent); DelItemFromEveryPlayer(EventTreasure1); DelItemFromEveryPlayer(EventTreasure2); DelItemFromEveryPlayer(EventTreasure3); DelItemFromEveryPlayer(EventFish); DelItemFromEveryPlayer(EventOre); DelItemFromEveryPlayer(BrokenMedal); DelItemFromEveryPlayer(EventDreamTicket); DelItemFromEveryPlayer(EventNaftalin); // Olympics are costlier: Clean less often if ($FYEVENT_CYCLE % 12 == 1) { DelChrRegFromEveryPlayer("FYMOLY_ENBALL"); DelChrRegFromEveryPlayer("FYMOLY_ICBOSS"); DelChrRegFromEveryPlayer("FYMOLY_FLUFFY"); DelChrRegFromEveryPlayer("FYMOLY_CHANTI"); DelChrRegFromEveryPlayer("FYMOLY_ALCHMY"); DelChrRegFromEveryPlayer("FYMOLY_MPWLVL"); DelChrRegFromEveryPlayer("FYMOLY_MANAXP"); DelChrRegFromEveryPlayer("FYMOLY_RACERS"); DelChrRegFromEveryPlayer("FYMOLY_HOCUSM"); DelChrRegFromEveryPlayer("FYMOLY_SURVIV"); DelChrRegFromEveryPlayer("FYMOLY_FRIEND"); DelChrRegFromEveryPlayer("FYMOLY_SPAMMY"); // Same for Raids, Dream Towers and Gemini (they don't repeat) DelChrRegFromEveryPlayer("DTOWER_DAY"); DelChrRegFromEveryPlayer("DTOWER_ROLL"); DelChrRegFromEveryPlayer("DTOWER_FLOOR"); DelChrRegFromEveryPlayer("FYRAID_LV"); DelChrRegFromEveryPlayer("GEMINI_DAY"); } deletearray $FYRAID_OWNER; deletearray $FYRAID_TIME; deletearray $FYRAID_HP; deletearray $FYRAID_LV; // Select the event switch ($FYEVENT_CYCLE % 12) { case 1: $EVENT$="Kamelot"; kamibroadcast("Kamelot Season is now open!", "Aurora Events"); break; case 2: $EVENT$="Expo"; callfunc("FYEConf_Expo"); kamibroadcast("World Expo is now open!", "Aurora Events"); break; case 3: $EVENT$="Regnum"; callfunc("FYEConf_Regnum"); kamibroadcast("Regnum's Blessing: "+$REGNUM_BLESSMAP_H$+" is now blessed!", "Aurora Events"); break; case 4: $EVENT$="Raid"; callfunc("FYEConf_Raid"); kamibroadcast("Oh noes! "+$RAIDING_BOSS$+" is attacking our world!", "Aurora Events"); break; case 5: $EVENT$="Candor"; kamibroadcast("Candor Battle Season is now open!", "Aurora Events"); break; case 6: $EVENT$="Mining"; callfunc("FYEConf_Mining"); kamibroadcast("Miners Union Research Request is now open!", "Aurora Events"); break; case 7: $EVENT$="Celestia"; kamibroadcast("Celestia Season is now open!", "Aurora Events"); break; case 8: $EVENT$="Olympics"; callfunc("FYEConf_Olympics"); kamibroadcast("Magic Olympics are now open!", "Aurora Events"); break; case 9: $EVENT$="Rebirth"; kamibroadcast("Rebirth Season has begun!", "Aurora Events"); break; case 10: $EVENT$="Fishing"; callfunc("FYEConf_Fishing"); kamibroadcast("Catch the Golden Fish is now open!", "Aurora Events"); break; case 11: $EVENT$="Gemini"; kamibroadcast("Gemini Season is now open!", "Aurora Events"); break; default: $EVENT$="Tower"; callfunc("FYEConf_Tower"); kamibroadcast($DREAMTOWER_SAGE$+"'s Dream Towers have appeared!", "Aurora Events"); break; } donpcevent "Aurora::OnRestore"; return; } // Returns an item: (type, lv). Used by the function below (FYE_Autoset) // types: misc, bp, warp, pot, heal, ore, magic, gift // maxlv: 3 5 2 3 - 6 - 5 function script FYT { .@t=getarg(0); .@l=getarg(1, 0); switch (.@t) { case FY_MISC: switch (.@l) { case 1: return any(SmokeGrenade, ScentGrenade, Grenade, DeathPotion, Lockpicks); case 2: return any(MysteriousBottle, TreasureMap, DungeonMap); case 3: return any(ArcmageBoxset, MercBoxA, ScrollSMaggot); } break; case FY_BP: switch (.@l) { case 1: return any(EquipmentBlueprintA, AlchemyBlueprintA); case 2: return any(EquipmentBlueprintB, AlchemyBlueprintB); case 3: return any(EquipmentBlueprintC, AlchemyBlueprintC); case 4: return any(EquipmentBlueprintD, AlchemyBlueprintD); case 5: return any(EquipmentBlueprintE, AlchemyBlueprintE, AncientBlueprint); } break; case FY_WARP: switch (.@l) { case 1: return any(TulimWarpCrystal, CandorWarpCrystal, HurnsWarpCrystal, LoFWarpCrystal); case 2: return any(HalinWarpCrystal, NivalWarpCrystal, FrostiaWarpCrystal); } break; case FY_POT: switch (.@l) { case 1: return any(LukPotionA, DexPotionA, IntPotionA, VitPotionA, AgiPotionA, HastePotion, StrengthPotion); case 2: return any(LukPotionB, DexPotionB, IntPotionB, VitPotionB, AgiPotionB, MoveSpeedPotion, PrecisionPotion, DodgePotion); case 3: return any(SacredImmortalityPotion, SacredLifePotion, SacredManaPotion); } break; case FY_ORE: switch (.@l) { case 1: return any(CopperIngot, IronIngot); case 2: return any(SilverIngot, GoldIngot); case 3: return any(TinIngot, LeadIngot); case 4: return any(TitaniumIngot, TerraniteIngot); case 5: return any(IridiumIngot, IridiumIngot, PlatinumIngot); case 6: return any(Diamond, Ruby, Emerald, Sapphire, Topaz, Amethyst); } break; case FY_GIFT: switch (.@l) { case 1: return BronzeGift; case 2: return SilverGift; case 3: return GoldenGift; case 4: return PrismGift; case 5: return any(SupremeGift, MysteriousFruit, PrismGift, HousingLetterIII, PrismGift); } break; // Single cases doesn't needs break case FY_HEAL: return any(SpearmintTea, Coffee, ClothoLiquor, BottleOfDivineWater); case FY_MAGIC: return any(FluoPowder, Quill, ScholarshipBadge, ScrollSWolvern); } return Exception("Invalid cast to FYEIT: "+.@t+" (Lv "+.@l+")", RB_IRCBROADCAST|RB_DEBUGMES|RB_GLOBALANNOUNCE, Bread); } function script FYE_Autoset { // Sets 30 ranked rewards .@b=FY_BP; .@g=FY_GIFT; .@h=FY_HEAL; .@m=FY_MISC; .@mg=FY_MAGIC; .@o=FY_ORE; .@p=FY_POT; .@w=FY_WARP; setarray $FYREWARD_ID, FYT(.@g, 1), StrangeCoin, FYT(.@m, 1), FYT(.@b, 1), FYT(.@p, 1), FYT(.@h, 1), FYT(.@o, 1), FYT(.@o, 6), FYT(.@g, 2), FYT(.@w, 1), FYT(.@b, 2), FYT(.@m, 2), FYT(.@o, 2), FYT(.@p, 2), FYT(.@o, 3), FYT(.@b, 3), FYT(.@m, 3), StrangeCoin, FYT(.@mg, 1), FYT(.@g, 3), FYT(.@w, 2), StrangeCoin, FYT(.@b, 4), FYT(.@p, 3), AncientBlueprint, FYT(.@g, 4), FYT(.@o, 4), FYT(.@b, 5), FYT(.@o, 5), FYT(.@g, 5); // Item Amount Table .@hv=rand2(1,3); .@p1=any(1,2); .@p2=(.@p1 == 1 ? 2 : 1); setarray $FYREWARD_AM, 1, 20, 1, 1, .@p1, .@hv, 1, 1, 1, 1, 1, 1, 1, .@p2, 1, 1, 1, 60, 1, 1, 1, 100, 1, 1, 1, 1, 1, 1, 1, 1; return; } // Modify Kamelot function script FYE_Kamelot { .@g=getcharid(2); if ($@FYE_KAMELOT[.@g] != gettimeparam(GETTIME_DAYOFMONTH)) { mesc l("Kamelot Season is open!"); // Instance still exists if (instanceowner($@KAMELOT_ID[.@g]) == .@g) { mesc l("However, your guild just challenged Kamelot Dungeons."); mesc l("Please wait a while."); return false; } mesc l("Should we?"); next; askyesno(); closeclientdialog(); // Not going? Spoilsport if (@menu == ASK_NO) return false; // Someone began while you waited if (instanceowner($@KAMELOT_ID[.@g]) == .@g) return true; // Begin //callfunc("KamelotCleanup", .@g); // Not needed $KAMELOT_COOLDOWN[.@g] = ($KAMELOT_COOLDOWN[.@g] ? 1 : 0); $@FYE_KAMELOT[.@g] = gettimeparam(GETTIME_DAYOFMONTH); mesc l("Have fun!"); next; closeclientdialog(); return true; } return false; } // Configure Regnum Blessing function script FYEConf_Regnum { setarray .@ma$, "004-1", "007-1", "004-2", "010-2", "014-3", "014-5", "015-5", "018-3", "019-1", "025-2", "025-2-1", "018-7", "019-5"; setarray .@mb$, "Tulimshar Outskirts", "Tulimshar Mines", "Tulimshar (West) Canyon", "Halinarzo (East) Canyon", "Central Woodlands", "North Woodlands", "Abandoned Mines (Woodlands)", "Somber Caves (LoF)", "Snow Field", "Fortress Island - South", "Fortress Island South Cave", "Lilit's Sanctuary", "Rock Plateau (Nivalis)"; .@m=rand2(getarraysize(.@ma$)); $REGNUM_BLESSMAP$=.@ma$[.@m]; $REGNUM_BLESSMAP_H$=.@mb$[.@m]; // Apply the blessing setmapflag(.@ma$[.@m], mf_bexp, 300); return; } // Configure World Expo function script FYEConf_Expo { $WORLDEXPO_ENEMY$=any("Xakabael the Dark", "Isbamuth", "Saulc", "SUSAN", "Terogan", ($GAME_STORYLINE >= 5 ? "Moubootaur" : "Monster King")); setarray $FYREWARD_PT, 100, 220, 440, 880, 1320, 1760, 2640, 3520, 5280, 7040, 10560, 14080, 21120, 28160, 32000, 36000, 40000, 45000, 50000, 55000, 60000, 70000, 80000, 90000, 100000, 112640, 140800, 168960, 200000, 225280; // PS. Max Est. 225280 pts (#24 - Before Ancient Blueprint) FYE_Autoset(); $FYLOGIN_PTS=rand2(18,22); return; } // Modify Treasure Chests function script FYE_Expo { // TODO: Merit-based random formula getitem EventTreasure1, 1+rand2(15); // 15 getitem EventTreasure2, rand2(6); // 15 getitem EventTreasure3, rand2(4); // 15 // Total: (15+15+15)=1~45 points [AVG: 22 pts] return; } // Configure Dream Tower function script FYEConf_Tower { $DREAMTOWER_SAGE$=any("Jaxad", "Mr. Saves", "Tux", "Freeyorp", "Cassy", "Crush", "Rotonen", "Kage", "Bjorn", "The Elven Sage", "Hocus Pocus the Fidibus", "Elli"); // Bertram? (https://forums.themanaworld.org/viewtopic.php?p=105296#p105296) setarray $FYREWARD_PT, 1, 4, 7, 10, 15, 22, 30, 45, 60, 75, 100, 120, 150, 175, 200, 250, 300, 350, 400, 500, 600, 700, 800, 900, 1000, 1200, 1400, 1600, 1800, 2000; // PS. Max Est. ? FYE_Autoset(); $FYLOGIN_PTS=0; return; } // Dream Tower Ticket function script FYE_Tower1 { .@mob=getarg(0, killedrid); // Obtain the monster level and roll a hidden counter .@lv=getmonsterinfo(.@mob, MOB_LV); DTOWER_ROLL+=.@lv; // There is no luck involved - Just get 1000 dream tower rolls if (DTOWER_ROLL >= 1000) { getitem EventDreamTicket, 1; DTOWER_ROLL-=1000; } return; } // Configure Boss Raid function script FYEConf_Raid { $RAIDING_BOSS$=any("Xakabael the Dark", "Janeb the Evil", "Platyna the Red", "Benjamin the Frost", "Reid the Terrific", "Nu'Rem the Destroyer", "Golbenez the Cruel", "King of Typos"); deletearray $FYRAID_OWNER; deletearray $FYRAID_TIME; deletearray $FYRAID_HP; deletearray $FYRAID_LV; setarray $FYREWARD_PT, 10, 25, 50, 100, 150, 200, 300, 500, 750, 1000, 1250, 1500, 1750, 2000, 2500, 3000, 3500, 4000, 5000, 6000, 7500, 9000, 11000, 15000, 20000, 25000, 30000, 35000, 40000, 50000; // PS. Max Est. ? FYE_Autoset(); $FYLOGIN_PTS=rand2(1, 2); $FYRAID_OWNER[0]=1; // System Reserve return; } // Boss Raid Appears! (What you killed is meaningless) function script FYE_Raid { .@mob=getarg(0, killedrid); // Actually - ignore system or auto-generated entities if (.@mob > 1490) return; .@lv=getmonsterinfo(.@mob, MOB_LV); // Chance goes from 10% to 1% // Defeating the boss lowers the chance in 0.1% if (rand2(1000) > max(100-FYRAID_LV, 10)) return; // Low level mobs may, at their level rate, abort // So a lv 100 mob has 1%, a lv 1 mob has 50%, etc. if (!rand2(.@lv)) return; /* A boss was found, update data */ .@id = array_find($FYRAID_OWNER, getcharid(3)); // Wait - Maybe you already found a boss? if (.@id >= 0) { if ($FYRAID_LV[.@id] == FYRAID_LV) return; } // Never found a boss before, so assign some place for you if (.@id < 0) { FYRAID_LV = 1; array_push($FYRAID_OWNER, getcharid(3)); .@id = array_find($FYRAID_OWNER, getcharid(3)); } // Assign the boss stats $FYRAID_HP[.@id]=2000+FYRAID_LV*1000+(FYRAID_LV/5*500); // Also declared in 001-13/main.txt $FYRAID_LV[.@id]=FYRAID_LV; $FYRAID_TIME[.@id]=gettimetick(2)+3600; // One hour // Announce that the boss was found! announce(l("%s: %s (Lv %d) has appeared!", b(l("BOSS WARNING")), $RAIDING_BOSS$, FYRAID_LV), bc_self); dispbottom l("Talk to Soul Menhir to engage the boss. Time limit = 1 hour."); // The boss is already available for anyone to kill, you get no priority // A new boss won't show up until you visit the Soul Menhir. // (This could be improved) return; } // Configure Fishing function script FYEConf_Fishing { setarray $FYREWARD_PT, 42, 63, 94, 141, 212, 318, 478, 717, 1076, 1345, 1614, 2020, 2421, 3026, 3632, 4540, 5000, 6000, 7000, 8500, 10000, 11000, 12000, 13500, 15000; // PS. Max Est. 14400 pts (#21 - Before 100 Strange Coins) FYE_Autoset(); $FYLOGIN_PTS=rand2(6,8); return; } // Modify Fishing function script FYE_Fishing { // TODO: Merit-based random formula [AVG: 3.5] about 10pts/min getitem EventFish, rand2(1, 6); return; } // Configure Mining Union Research Event function script FYEConf_Mining { setarray $FYREWARD_PT, 100, 220, 440, 880, 1320, 1760, 2640, 3520, 5275, 7040, 10560, 14080, 21120, 28160, 35200, 42240, 57000, 70400, 85000, 112640, 140800, 169000, 197120, 225300, 281160, 337920, 394240, 450560, 550000, 675000; // PS. Max Est. 705740 pts (overflow) FYE_Autoset(); $FYLOGIN_PTS=rand2(16,20); return; } // Modify Bifs function script FYE_Mining { .@mob=getarg(0, killedrid); // Only ores if (getmonsterinfo(.@mob, MOB_RACE) != RC_Mineral) return; // TODO: Merit-based random formula [AVG: 5] about 70pts/min // TODO: Big vs Small bifs (regex OK, size OK) .@ore=rand2(3, 6); if (.@mob == EleniumBif) .@ore-=1; getitem EventOre, .@ore; return; } // Configure Magic Olympics function script FYEConf_Olympics { setarray $FYREWARD_PT, 10, 22, 44, 88, 132, 176, 264, 352, 527, 704, 1056, 1408, 2112, 2816, 3520, 4224, 5700, 7040, 8500, 11264, 14080, 16900, 19712, 22530, 28116, 33792, 39424, 45056, 55000, 67500; // PS. Max Est. ? pts FYE_Autoset(); $FYLOGIN_PTS=0; return; } // Modify Magic Skills function script FYE_Olympics_SK { if ($EVENT$ != "Olympics") return; .@sk=getarg(0, @skillId); .@sl=max(getarg(1, @skillLv), 1); .@st=getarg(2, @skillTarget); .@cl = $@MSK_CLASS[.@sk]; // Supportive if (.@cl == CLASS_SCHOLARSHIP && .@st != getcharid(3) && .@st > 1 && .@sk != SM_PROVOKE && .@sk != EVOL_AREA_PROVOKE) FMOLY_FRIEND += 1; // Generic if (.@sk != TMW2_FAKESKILL && .@sk != TMW2_FAKESKILL2 && .@sk != AM_CALLHOMUN && .@sk != AM_REST && .@sk != AM_RESURRECTHOMUN && .@sk != TMW2_TRANSMIGRATION && .@sk != TMW2_OVHFIRE) FYMOLY_SPAMMY += .@sl; setq Q_AuroraEvent, getq2(Q_AuroraEvent) + rand2(.@sl + 1); return; } // Modify Mana EXP Gain function script FYE_Olympics_MX { if ($EVENT$ != "Olympics") return; .@var=getarg(0, 0); FYMOLY_MANAXP += .@var; setq Q_AuroraEvent, getq2(Q_AuroraEvent) + rand2(.@var + 1); return; } // Count Chanting Usage function script FYE_Olympics_CH { if ($EVENT$ != "Olympics") return; // TODO: Change based on using different verbs/adjectives? FYMOLY_CHANTI += 1; setq Q_AuroraEvent, getq2(Q_AuroraEvent) + 1; return; } // Count Alchemy Usage function script FYE_Olympics_AL { if ($EVENT$ != "Olympics") return; .@units = getarg(0, 1); FYMOLY_ALCHMY += .@units; setq Q_AuroraEvent, getq2(Q_AuroraEvent) + .@units; return; } // Send to Porthos, returns false on failure, true on success function script FYE_Olympics_TO { if ($EVENT$ != "Olympics") return false; .@m$ = "moly@"+getcharid(0); if (instanceowner(@olympics) != getcharid(3)) { .@id = instance_create("moly@"+getcharid(0), getcharid(3), IOT_CHAR); if (.@id < 0) return false; .@mp$ = instance_attachmap("001-14", .@id, 0, .@m$); @olympics = .@id; // It'll be self-destroyed when time runs out (30 minutes) instance_set_timeout(1800, 1800, .@id); instance_init(.@id); } else { instance_set_timeout(1800, 1800, @olympics); } warp .@m$, 92, 90; return true; } // "Submit" button from 003-1/events.txt // Don't forget to enable it in npc/utils.txt as well!! function script FYE_Submit { .@day=getq(Q_AuroraEvent); .@pts=getq2(Q_AuroraEvent); // Handle daily login score rewards if (.@day != gettimeparam(GETTIME_DAYOFMONTH)) { setq1 Q_AuroraEvent, gettimeparam(GETTIME_DAYOFMONTH); setq2 Q_AuroraEvent, .@pts+$FYLOGIN_PTS; .@pts=getq2(Q_AuroraEvent); if ($FYLOGIN_PTS) dispbottom l("Daily Event Bonus: %d Points!", $FYLOGIN_PTS); } // Give you points if ($EVENT$ == "Expo") { // .:: WORLD EXPO EVENT ::. .@pts+=countitem(EventTreasure1)*1; .@pts+=countitem(EventTreasure2)*3; .@pts+=countitem(EventTreasure3)*5; setq2 Q_AuroraEvent, .@pts; delitem EventTreasure1, countitem(EventTreasure1); delitem EventTreasure2, countitem(EventTreasure2); delitem EventTreasure3, countitem(EventTreasure3); } else if ($EVENT$ == "Fishing") { // .:: CATCH THE GOLD FISH EVENT ::. .@pts+=countitem(EventFish)*1; setq2 Q_AuroraEvent, .@pts; delitem EventFish, countitem(EventFish); } else if ($EVENT$ == "Mining") { // .:: MINION UNION'S RESEARCH REQUEST EVENT ::. .@pts+=countitem(EventOre)*1; setq2 Q_AuroraEvent, .@pts; delitem EventOre, countitem(EventOre); } else if ($EVENT$ == "Tower") { // .:: DREAM TOWER APPEARS ::. .@pts+=countitem(BrokenMedal)*1; setq2 Q_AuroraEvent, .@pts; delitem BrokenMedal, countitem(BrokenMedal); } else if ($EVENT$ == "Raid") { // .:: BOSS RAID ::. .@pts+=countitem(EventNaftalin)*1; setq2 Q_AuroraEvent, .@pts; delitem EventNaftalin, countitem(EventNaftalin); } else if ($EVENT$ == "Olympics") { // .:: MAGIC OLYMPICS ::. // Handled separately } else { // Wut? This is not an Aurora Event Exception($EVENT$+" is NOT a valid Aurora Event; Misdefinition.\n\nPlease ensure that it is defined in utils, aurora, news, and command/event.\n\nFYE_Submit - FYEventUsesRanking - FYE_* - FYEConf_* - FYStopEvent", RB_DEFAULT|RB_ISFATAL); } return; } // Stops any Aurora Event function script FYStopEvent { setarray .@av$, "Kamelot", "Regnum", "Expo", "Fishing", "Candor", "Mining", "Tower", "Raid", "Olympics", "Celestia", "Rebirth", "Gemini"; if (array_find(.@av$, $EVENT$) >= 0) { sClear(); $EVENT$=""; } return; } // Handle the ending of Aurora Events (see also functions/util.txt) function script FYRewardEvent { if (FYEventUsesRanking()) { debugmes("Rewards are due"); // This code absolutely can't fail: if ($EVENT$ == "Olympics") { callfunc("HocusScoreNew"); copyarray $@aurora_name$, $@moly_n$, 10; copyarray $@aurora_value, $@moly_v, 10; for (.@i=0; .@i < 10; .@i++) { if ($@aurora_name$[.@i] == "") break; $@aurora_charid[.@i] = gf_charnameid($@aurora_name$[.@i]); } } else { .@nb = query_sql("SELECT c.name, i.count2, c.char_id FROM `quest` AS i, `char` AS c WHERE i.quest_id="+Q_AuroraEvent+" AND i.char_id=c.char_id ORDER BY i.count2 DESC LIMIT 10", $@aurora_name$, $@aurora_value, $@aurora_charid); } $MOST_HEROIC$=$@aurora_name$[0]; for (.@i=0;.@i < getarraysize($@aurora_charid);.@i++) { switch (.@i+1) { case 1: .@prize=120; break; case 2: .@prize=100; break; case 3: .@prize=80; break; case 4: case 5: .@prize=60; break; case 6: case 7: .@prize=40; break; default: .@prize=20; } rodex_sendmail($@aurora_charid[.@i], "Aurora Events", $EVENT$+" Reward!", "Final Ranking: #"+(.@i+1)+". Congratulations on making "+$@aurora_value[.@i]+" points on the event!", 0, StrangeCoin, .@prize); } // Send results copy to syslog consoleinfo("%s event finished:\n#01 - %s (%d)\n#02 - %s (%d)\n#03 - %s (%d)\n#04 - %s (%d)\n#05 - %s (%d)\n", $EVENT$, $@aurora_name$[0], $@aurora_value[0], $@aurora_name$[1], $@aurora_value[1], $@aurora_name$[2], $@aurora_value[2], $@aurora_name$[3], $@aurora_value[3], $@aurora_name$[4], $@aurora_value[4]); // Magic Olympics has extra rewards if ($EVENT$ == "Olympics") { if ($@aurora_charid[0] > 0) rodex_sendmail($@aurora_charid[0], "Hocus Pocus", "A Small Gift", "I wanted to send you cake but the cat ate it.", 0, BlackyCat, 1, ScholarshipTuition, 1); if ($@aurora_charid[1] > 0) rodex_sendmail($@aurora_charid[1], "Hocus Pocus", "A Small Gift", "Here is some noob cake for a bright mind.", 0, ApanaCake, 1, ScholarshipTuition, 1); } // Destroy the quest DelQuestFromEveryPlayer(Q_AuroraEvent); deletearray $@aurora_name$; deletearray $@aurora_value; deletearray $@aurora_charid; /* DelItemFromEveryPlayer(EventTreasure1); DelItemFromEveryPlayer(EventTreasure2); DelItemFromEveryPlayer(EventTreasure3); DelItemFromEveryPlayer(EventFish); DelItemFromEveryPlayer(EventOre); */ } return; } // Modify Mob Killing // Serves for multiple events, preserves killedrid function script AuroraMobkill { if ($EVENT$ == "Mining") FYE_Mining(killedrid); if ($EVENT$ == "Tower") FYE_Tower1(killedrid); if ($EVENT$ == "Raid") FYE_Raid(killedrid); return; } // Normalize Aurora Event after a server restart function script FYE_Normalize { if ($EVENT$ == "Regnum") { // Reapply the Regnum's blessing setmapflag($REGNUM_BLESSMAP$, mf_bexp, 300); } return; }