OSDN Git Service

First version
[st-ro/stro.git] / npc / custom / events / mvp_ladder.txt
1 //===== rAthena Script =======================================
2 //= MVP Ladder Game
3 //===== By: ==================================================
4 //= aftermath, AnnieRuru (rewrite)
5 //===== Current Version: =====================================
6 //= 1.0
7 //===== Compatible With: =====================================
8 //= rAthena Project
9 //===== Description: =========================================
10 //= Gather a party and kill every MVP in ascending order.
11 //===== Additional Comments: =================================
12 //= 1.0 First version, edited. [Euphy]
13 //============================================================
14
15 prontera,164,171,3      script  MvP Ladder Warper       56,{
16         mes "[MvP Ladder Warper]";
17         mes "Say... do you want to play the MvP Ladder game?";
18         next;
19         switch(select("Yes, let's get it on!:Information.:Show me the best record.:No.")) {
20         case 1:
21                 break;
22         case 2:
23                 mes "[MvP Ladder Warper]";
24                 mes "In this game, your party has to kill every single MvP monster in ascending order, from the weakest to strongest.";
25                 if ( .finish_item_amount )
26                         mes "If your party can finish the MVP ladder game, each member will earn "+ callfunc("F_InsertPlural", .finish_item_amount, getitemname( .finish_item_id )) +".";
27                 if ( .register_cost )
28                         mes "But the entrance fee is "+ callfunc( "F_InsertComma", .register_cost ) +" zeny.";
29                 next;
30                 mes "[MvP Ladder Warper]";
31                 mes "You lose the game if you can't finish in "+ .timeout +" minutes, or if your entire party is killed.";
32                 mes "Good luck!";
33                 close;
34         case 3:
35                 mes "[MvP Ladder Warper]";
36                 if ( !$mvpladdderparty_time ) {
37                         mes "Nobody has finished this game yet.";
38                         close;
39                 }
40                 mes "The best record is";
41                 mes "[ "+( $mvpladdderparty_time / 60 )+" min "+( $mvpladdderparty_time % 60 )+" sec ]";
42                 mes "By the party ^FF0000"+ $mvpladdderparty_name$ +"^000000.";
43                 .@size = getarraysize( $mvpladderparty_member$ );
44                 for ( .@i = 0; .@i < .@size; .@i++ )
45                         mes "^000000"+ ( .@i +1 ) +". ^0000FF"+ $mvpladderparty_member$[.@i];
46                 if ( getgmlevel() < .gmlvlreset ) close;
47                 next;
48                 if ( select( "Close.", "Reset the record." ) == 1 ) close;
49                 if ( select( "Never mind.", "I really want to reset it." ) == 1 ) close;
50                 $mvpladdderparty_time = 0;
51                 $mvpladdderparty_name$ = "";
52                 deletearray $mvpladderparty_member$[.@i];
53                 mes "[MvP Ladder Warper]";
54                 mes "Record reset successfully.";
55                 close;
56         case 4:
57                 mes "[MvP Ladder Warper]";
58                 mes "When you are strong enough to complete the game, please come back.";
59                 close;
60         }
61         if ( !getcharid(1) ) {
62                 mes "[MvP Ladder Warper]";
63                 mes "You have to form a party to play.";
64                 close;
65         }
66         if ( getpartyleader( getcharid(1), 2 ) != getcharid(0) ) {
67                 mes "[MvP Ladder Warper]";
68                 mes "Only the party leader can register.";
69                 close;
70         }
71         .@origin = getcharid(3);
72         getpartymember getcharid(1), 1;
73         getpartymember getcharid(1), 2;
74         for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
75                 if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
76                         attachrid $@partymemberaid[.@i];
77                         if ( strcharinfo(3) == strnpcinfo(4) )
78                                 .@online++;
79                 }
80         }
81         attachrid .@origin;
82         if ( $@partymembercount != .register_min ) {
83                 mes "[MvP Ladder Warper]";
84                 mes "You have to form a party with exactly "+ .register_min +" members to play.";
85                 close;
86         }
87         else if ( .@online != .register_min )  {
88                 mes "[MvP Ladder Warper]";
89                 mes "Your party must have "+ .register_min +" members online on map '"+ strnpcinfo(4) +"'.";
90                 close;
91         }
92         else if ( .register_cost && Zeny < .register_cost ) {
93                 mes "[MvP Ladder Warper]";
94                 mes "You don't have enough zeny. Please come back when you do.";
95                 close;
96         }
97         else if ( .party_id ) {
98                 mes "[MvP Ladder Warper]";
99                 mes "I'm sorry, but a party is currently playing the game. Please standby until the party is finished.";
100                 mes "Thank you.";
101                 close;
102         }
103         Zeny -= .register_cost;
104         announce "The party ["+ strcharinfo(1) +"] has started the MvP ladder game.", bc_all;
105         set .party_id, getcharid(1);
106         set .@time_enter, gettimetick(2);
107         for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
108                 if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
109                         attachrid $@partymemberaid[.@i];
110                         if ( strcharinfo(3) == strnpcinfo(4) ) {
111                                 announce "You have "+ .timeout +" minutes to complete "+ .totalround +" rounds.", bc_self;
112                                 .@name$[.@c] = strcharinfo(0);
113                                 .@c++;
114                         }
115                 }
116         }
117         cleanmap .eventmap$;
118         warpparty .eventmap$, 0,0, .party_id, strnpcinfo(4);
119         donpcevent strnpcinfo(0)+"::OnMvpDead";
120         sleep .timeout * 60000;
121         if ( .round == .totalround +1 ) {
122                 getpartymember .party_id, 1;
123                 getpartymember .party_id, 2;
124                 mapannounce .eventmap$, "Congratulations... You were able to defeat all the MVPs!", bc_map;
125                 for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
126                         if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
127                                 attachrid $@partymemberaid[.@i];
128                                 if ( strcharinfo(3) == .eventmap$ )
129                                         getitem .finish_item_id, .finish_item_amount;
130                         }
131                 }
132                 set .@timeused, gettimetick(2) - .@time_enter;
133                 if ( .bonus_item_amount && .@timeused < .bonus_time * 60 ) {
134                         mapannounce .eventmap$, "You are rewarded a bonus item for completing the ladder within "+ .bonus_time +" minutes.", bc_map;
135                         for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
136                                 if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
137                                         attachrid $@partymemberaid[.@i];
138                                         if ( strcharinfo(3) == .eventmap$ )
139                                                 getitem .bonus_item_id, .bonus_item_amount;
140                                 }
141                         }
142                 }
143
144                 if ( !$mvpladdderparty_time || .@timeused < $mvpladdderparty_time ) {
145                         mapannounce .eventmap$, "And you broke the record! [ "+( .@timeused / 60 )+" min "+( .@timeused % 60 )+" sec ]", bc_map;
146                         set $mvpladdderparty_time, .@timeused;
147                         set $mvpladdderparty_name$, getpartyname( .party_id );
148                         copyarray $mvpladderparty_member$, .@name$, .register_min;
149                 }
150                 else
151                         mapannounce .eventmap$, "Time used [ "+( .@timeused / 60 )+" min "+( .@timeused % 60 )+" sec ]", bc_map;
152                 sleep 10000;
153                 announce "The party ["+ getpartyname( .party_id ) +"] has finished the MvP ladder game!", bc_all;
154         }
155         else
156                 announce "The party ["+ getpartyname( .party_id ) +"] has failed to finish the MvP ladder game.", bc_all;
157         mapwarp .eventmap$, .map$, .x, .y;
158         killmonsterall .eventmap$;
159         .party_id = .round = 0;
160         end;
161
162 OnMvpDead:
163         .round++;
164         if ( .round >= 2 && .round != .totalround +1 && .round_item_amount ) {
165                 for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
166                         if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
167                                 attachrid $@partymemberaid[.@i];
168                                 if ( strcharinfo(3) == .eventmap$ )
169                                         getitem .round_item_id, .round_item_amount;
170                         }
171                 }
172         }
173         if ( .round == .totalround +1 ) {
174                 awake strnpcinfo(0);
175                 end;
176         }
177         else if ( .round == .totalround )
178                 mapannounce .eventmap$, "The final Round will begin in "+ .delay +" seconds...", bc_map;
179         else
180                 mapannounce .eventmap$, "Starting round "+ .round +" in "+ .delay +" seconds...", bc_map;
181         sleep .delay * 1000;
182         if ( .mvpid[.round] == 1646 )  // pick random Bio3 MVP
183                 .mvpid[.round] = rand(1646,1651);
184         monster .eventmap$,0,0, "--ja--", .mvpid[.round], 1, strnpcinfo(0)+"::OnMvpDead";
185         mapannounce .eventmap$, getmonsterinfo( .mvpid[.round], MOB_NAME ) +" has spawned!", bc_map|bc_blue;
186         end;
187
188 OnPCLogoutEvent:
189         if ( hp > 0 )
190                 .@less_one = 1;
191         else
192                 end;
193 OnPCDieEvent:
194         if ( strcharinfo(3) != .eventmap$ || !getcharid(1) ) end;
195         if ( getcharid(1) != .party_id ) end;
196         getpartymember .party_id, 1;
197         getpartymember .party_id, 2;
198         for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
199                 if ( isloggedin( $@partymemberaid[.@i], $@partymembercid[.@i] ) ) {
200                         attachrid $@partymemberaid[.@i];
201                         if ( strcharinfo(3) == .eventmap$ && hp > 0 )
202                                 .@alive++;
203                 }
204         }
205         if ( .@less_one )
206                 .@alive--;
207         if ( !.@alive ) {
208                 mapannounce .eventmap$, "Party wiped!", bc_map;
209                 sleep 10000;
210                 awake strnpcinfo(0);
211         }
212         end;
213
214 OnInit:
215 //      Configurations -----------------------------------------------------
216
217         // Time limit (in minutes)
218         // When time runs out, all players inside the room will be kicked out.
219         // Do NOT set this to zero!
220         set .timeout, 60;
221
222         // entrance fee (in Zeny)
223         set .register_cost, 100000;
224
225         // exact amount of party members needed to start the game
226         set .register_min, 2;
227
228         // id of each mvp. you can add more
229         setarray .mvpid[1],
230                 1086,// Golden Thief Bug        64
231                 1115,// Eddga                           65
232                 1150,// Moonlight Flower        67
233                 1159,// Phreeoni                        69
234                 1112,// Drake                           70
235                 1583,// Tao Gunka                       70
236                 1492,// Incantation Samurai     71
237                 1046,// Doppelgangger           72
238                 1252,// Garm                            73
239                 1418,// Evil Snake Lord         73
240                 1059,// Mistress                        74
241                 1190,// Orc Lord                        74
242                 1087,// Orc Hero                        77
243                 1251,// Knight of Windstorm     77
244                 1038,// Osiris                          78
245                 1658,// Ygnizem                         79
246                 1272,// Dark Lord                       80
247                 1871,// Fallen Bishop           80
248                 1039,// Baphomet                        81
249                 1147,// Maya                            81
250                 1785,// Atroce                          82
251                 1389,// Dracula                         85
252                 1630,// Bacsojin                        85
253                 1885,// Gorynych                        85
254                 1623,// RSX 0806                        86
255                 1511,// Amon Ra                         88
256                 1688,// Lady Tanee                      89
257                 1768,// Gloom Under Night       89
258                 1719,// Datale                          90
259                 1734,// Kiel D-01                       90
260                 1157,// Pharaoh                         93
261                 1373,// Lord of Death           94
262                 1312,// Turtle General          97
263                 1779,// Ktullanux                       98
264                 1874,// Beelzebub                       98
265                 1646,// Bio3 placeholder    99
266                 1708,// Thanatos                        99
267                 1751,// Valkyrie Randgris       99
268                 1832;// Ifrit                           99
269
270         // number of rounds (default: 39)
271         set .totalround, getarraysize(.mvpid) -1;
272
273         // item reward for completing each round
274         set .round_item_id, 512;
275         set .round_item_amount, 1;
276
277         // item reward for completing the entire ladder
278         set .finish_item_id, 501;
279         set .finish_item_amount, 10;
280
281         // bonus reward if ladder completed within a certain time (in minutes)
282         set .bonus_time, 45; // if completed within 45 minutes, this reward is given
283         set .bonus_item_id, 504;
284         set .bonus_item_amount, 10;
285
286         // time delay between rounds, in seconds (default: 3)
287         set .delay, 5;
288
289         // minimum GM level to reset the best record
290         set .gmlvlreset, 99;
291
292         // event map
293         set .eventmap$, "guild_vs2-2";
294
295         // mapflag configuration
296         setarray .@mapflag,
297                 mf_nowarp,
298                 mf_nowarpto,
299                 mf_nosave,
300                 mf_nomemo,
301                 mf_noteleport,
302 //              mf_nopenalty, // disable exp loss
303                 mf_noreturn,
304 //              mf_nobranch,
305 //              mf_nomobloot, // disable monster drop loots,
306 //              mf_nomvploot, // 2 of these
307                 mf_partylock;
308
309 //      Config Ends --------------------------------------------------------------
310
311         mapannounce .eventmap$, "An administrator has refreshed the server. Please re-register. We apologize for the inconvenience.", bc_map;
312         getmapxy .map$, .x, .y, UNITTYPE_NPC;
313         mapwarp .eventmap$, .map$, .x, .y;
314         killmonsterall .eventmap$;
315         .@size = getarraysize( .@mapflag );
316         for ( .@i = 0; .@i < .@size; .@i++ )
317                 setmapflag .eventmap$, .@mapflag[.@i];
318         end;
319 }