// 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 // AEF: BEGIN function script FYNewEvent { debugmes "\033[1mFY event is set to happen..."; // 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) DelItemFromEveryPlayer(EventTreasure1); DelItemFromEveryPlayer(EventTreasure2); DelItemFromEveryPlayer(EventTreasure3); DelItemFromEveryPlayer(EventFish); // 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$="Fishing"; callfunc("FYEConf_Fishing"); kamibroadcast("Catch the Golden Fish is now open!", "Aurora Events"); break; case 5: // FIXME: PLACEHOLDER $EVENT$="Kamelot"; kamibroadcast("Kamelot Season is now open!", "Aurora Events"); break; case 6: // FIXME: PLACEHOLDER $EVENT$="Expo"; callfunc("FYEConf_Expo"); kamibroadcast("World Expo is now open!", "Aurora Events"); break; case 7: // FIXME: PLACEHOLDER $EVENT$="Regnum"; callfunc("FYE_Regnum"); kamibroadcast("Regnum's Blessing: "+$REGNUM_BLESSMAP_H$+" is now blessed!", "Aurora Events"); break; case 8: // FIXME: PLACEHOLDER $EVENT$="Fishing"; callfunc("FYEConf_Fishing"); kamibroadcast("Catch the Golden Fish is now open!", "Aurora Events"); break; case 9: // FIXME: PLACEHOLDER $EVENT$="Kamelot"; kamibroadcast("Kamelot Season is now open!", "Aurora Events"); break; case 10: // FIXME: PLACEHOLDER $EVENT$="Expo"; callfunc("FYEConf_Expo"); kamibroadcast("World Expo is now open!", "Aurora Events"); break; case 11: // FIXME: PLACEHOLDER $EVENT$="Regnum"; callfunc("FYE_Regnum"); kamibroadcast("Regnum's Blessing: "+$REGNUM_BLESSMAP_H$+" is now blessed!", "Aurora Events"); break; case 12: // FIXME: PLACEHOLDER $EVENT$="Fishing"; callfunc("FYEConf_Fishing"); kamibroadcast("Catch the Golden Fish is now open!", "Aurora Events"); break; } donpcevent "Aurora::OnRestore"; 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] = 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", "soren"; 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", "Soren Island"; .@m=rand2(getarraysize(.@ma$)); $REGNUM_BLESSMAP$=.@ma$[.@m]; $REGNUM_BLESSMAP_H$=.@mb$[.@m]; // Apply the blessing setmapflag(.@ma$[.@m], mf_bexp, 200); return; } // Configure World Expo function script FYEConf_Expo { $WORLDEXPO_ENEMY$=any("Xakabael the Dark", "Isbamuth", "Saulc", "SUSAN", "Terogan"); setarray $FYREWARD_PT, 100, 200; setarray $FYREWARD_ID, Bread, Bread; setarray $FYREWARD_AM, 1, 2; $FYLOGIN_PTS=rand2(18,22); return; } // Modify Treasure Chests function script FYE_Expo { // TODO: Merit-based random formula getitem EventTreasure1, rand2(6); getitem EventTreasure2, rand2(4); getitem EventTreasure3, rand2(2); return; } // Configure Fishing function script FYEConf_Fishing { setarray $FYREWARD_PT, 100, 200; setarray $FYREWARD_ID, Bread, Bread; setarray $FYREWARD_AM, 1, 2; $FYLOGIN_PTS=rand2(6,8); return; } // Modify Fishing function script FYE_Fishing { // TODO: Merit-based random formula getitem EventFish, 1; return; } // "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 { // 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"; 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: .@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); } // Destroy the quest DelQuestFromEveryPlayer(Q_AuroraEvent); /* DelItemFromEveryPlayer(EventTreasure1); DelItemFromEveryPlayer(EventTreasure2); DelItemFromEveryPlayer(EventTreasure3); DelItemFromEveryPlayer(EventFish); */ } 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, 200); } return; }