You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

809 lines
21 KiB
Plaintext

//===== rAthena Script =======================================
//= Wave Mode
//===== Description: =========================================
//= [Walkthrough Conversion]
//= Wave Mode Forest and Sky Instances
//- Officially monsters can use their skills
// (NPC_SUMMONSLAVE, at least). NPC_EMOTION and
// NPC_EMOTION_ON have been blocked since it disrupts the
// walk system of the instance on rAthena.
//- Note: The instance is currently disabled on KRO.
//===== Changelogs: ==========================================
//= 1.0 First version. [Capuche]
//============================================================
// Simple function to move the monster when idle.
// Move the monster to the next coordinates + end the script on successful; kill the monster + return on failure
// callfunc( "F_mobidle", <npc name + idle label>, <size coord>, <defined x array>, <x shift>, <defined y array>, <defined spot-spot distance array> );
function script F_mobidle {
sleep2 1000; // stop if no RID
.@game_id = getattachedrid();
.@dist_min = 300;
.@size = getarg(1);
.@dx = getarg(3);
getunitdata .@game_id, .@data;
for ( .@i = 0; .@i < .@size; .@i++ ) {
.@dist_to_spot[.@i] = distance( .@data[UMOB_X], .@data[UMOB_Y], (getelementofarray( getarg(2),.@i ) + .@dx), getelementofarray( getarg(4),.@i ) );
if (.@dist_min >= .@dist_to_spot[.@i]) {
.@dist_min = .@dist_to_spot[.@i];
.@index = .@i;
}
}
if (.@dist_min <= 1) {
.@index++;
if (.@index >= .@size) {
unitskilluseid .@game_id,301,1,.@game_id,1,false,41; // SA_INSTANTDEATH
return;
}
}
else if (.@index < (.@size -1)) {
.@total[0] = .@dist_min + getelementofarray( getarg(5), .@index );
.@total[1] = .@dist_to_spot[.@index + 1] + getelementofarray( getarg(5), .@index+1 );
if (.@total[0] > .@total[1])
.@index = .@index + 1;
}
if (.@dist_to_spot[.@index] > 14) {
unitkill .@game_id;
end;
}
if (!.@data[UMOB_TARGETID]) {
unitwalk .@game_id, (getelementofarray( getarg(2),.@index ) + .@dx), getelementofarray( getarg(4),.@index );
sleep2 50; // for now a delay between unitwalk and mob_setidleevent is needed
}
mob_setidleevent .@game_id, getarg(0);
end;
}
prontera,146,75,1 script Zonda Rep#pron 4_F_ZONDAGIRL,{
.@player_name$ = strcharinfo(0);
getmapxy .@map_name$,.@x,.@y, BL_PC;
if (is_party_leader() == true) {
.@party_id = getcharid(1);
getpartymember .@party_id, 1;
getpartymember .@party_id, 2;
for ( .@i = 0; .@i < $@partymembercount; .@i++ ) {
if (isloggedin($@partymemberaid[.@i], $@partymembercid[.@i]) == 1)
.@count_online++;
}
.@menu_entry$ = "Request entry.";
}
mes "[Belka]";
mes "Welcome to Zonda, where innovation begins. What can I do for you?";
next;
switch( select( "Why are you here?", .@menu_entry$, "Enter ^6B9900<Wave Mode - Forest>^000000.", "Enter ^6B9900<Wave Mode - Sky>^000000.", "Cancel." ) ) {
case 1:
mes "[Belka]";
mes "We now offer a new service. Have you heard about the dimensional rifts?";
next;
mes "[Belka]";
mes "In case you haven't, many organizations and scientists study the rifts formed between dimensions.";
next;
mes "[Belka]";
mes "One of them is my company, Zonda, and after long, painstaking research...";
next;
mes "[Belka]";
mes "We've developed two different dimensional rifts that we call Wave Modes - Forest and Sky!";
next;
mes "[Belka]";
mes "Do you have any questions about Zonda's ambitious new project, Wave Mode?";
while(true) {
next;
switch( select( "About ^6B9900<Wave Mode - Forest>^000000", "About ^6B9900<Wave Mode - Sky>^000000", "No." ) ) {
case 1:
mes "[Belka]";
mes "The ^6B9900<Wave Mode - Forest>^000000";
mes "Introducing the first Wave Mode service, Zonda's objective is to work with your party members to keep monster waves from reaching the other side of the bridge.";
next;
mes "[Belka]";
mes "Monsters will advance without fighting, but the party will fail if 20 monsters are let go..";
break;
case 2:
mes "[Belka]";
mes "The ^6B9900<Wave Mode - Sky>^000000";
mes "Available once a day. Like the other Wave Mode, keep the monsters away from reaching the other side of the map.";
next;
mes "[Belka]";
mes "Feel free to come back with your party.";
break;
case 3:
mes "[Belka]";
mes "Thank you for visiting Zonda, where innovation begins.";
close;
}
next;
mes "[Belka]";
mes "Any other questions?";
}
case 2:
mes "[Belka]";
mes "Which Wave Mode would you like to enter: Forest or Sky?";
next;
.@s = select( "Enter ^6B9900<Wave Mode - Forest>^000000.", "Enter ^6B9900<Wave Mode - Sky>^000000." ) - 1;
setarray .@instance_name$[0], "Wave Mode - Forest", "Wave Mode - Sky";
mes "[Belka]";
mes "" + .@count_online + " party " + (.@count_online == 1 ? "member" : "members") + " found " + .@player_name$ + ", right? To enter the ^6B9900<" + .@instance_name$[.@s] + ">^000000, please sign here.";
next;
select("Sign.");
mes "[Belka]";
mes "" + .@player_name$ + " has requested to enter the ^6B9900<" + .@instance_name$[.@s] + ">^000000. Please come back when it's your turn to enter.";
if (instance_create(.@instance_name$[.@s]) < 0) {
mes "Party Name: " + getpartyname( getcharid(1) );
mes "Party Leader: " + strcharinfo(0);
mes "^0000ff" + .@instance_name$[.@s] + " ^000000 - Reservation Failed.";
close;
}
close;
case 3:
switch( instance_enter("Wave Mode - Forest") ) {
case IE_OTHER:
mes "[Belka]";
mes "An unknown error has occurred.";
close;
case IE_NOINSTANCE:
case IE_NOMEMBER:
mes "[Belka]";
mes "Please wait for ^6B9900<Wave Mode - Forest>^000000 stabilization.";
close;
case IE_OK:
mapannounce .@map_name$, "" + .@player_name$ + " of the party " + getpartyname(getcharid(1)) + " is entering <Wave Mode - Forest>.", bc_map,0xFF99;
// warp "1@def01",50,21;
break;
}
break;
case 4:
switch( instance_enter("Wave Mode - Sky") ) {
case IE_OTHER:
mes "[Belka]";
mes "An unknown error has occurred.";
close;
case IE_NOINSTANCE:
case IE_NOMEMBER:
mes "[Belka]";
mes "Currently the ^6B9900<Wave Mode - Sky>^000000 is being stabilized for your convenience. Please wait.";
close;
case IE_OK:
mapannounce .@map_name$, "" + .@player_name$ + " of the party " + getpartyname(getcharid(1)) + " is entering <Wave Mode - Sky>.", bc_map,0xFF99;
// warp "1@def02",29,35;
break;
}
break;
case 5:
mes "[Belka]";
mes "Thank you for visiting Zonda, where innovation begins.";
close;
}
wave_mode_map$ = .@map_name$;
wave_mode_x = .@x;
wave_mode_y = .@y;
end;
}
payon,166,98,1 duplicate(Zonda Rep#pron) Zonda Rep#pay 4_F_ZONDAGIRL
moc_para01,45,89,3 duplicate(Zonda Rep#pron) Zonda Rep#para 4_F_ZONDAGIRL
morocc,168,271,4 duplicate(Zonda Rep#pron) Zonda Rep#mor 4_F_ZONDAGIRL
// Wave mode forest
1@def01,50,21,0 script #wave_mode_forest_entrance HIDDEN_WARP_NPC,1,1,{
end;
OnTouch:
disablenpc instance_npcname("#wave_mode_forest_entrance");
initnpctimer;
end;
OnTimer2000:
mapannounce 'map_def01$, "We would like to thank all loyal customers of the Cool Event Corporation.", bc_map;
end;
OnTimer7000:
mapannounce 'map_def01$, "<Wave mode - Forest> prevent monsters from reaching the other side of the bridge.", bc_map;
end;
OnTimer12000:
mapannounce 'map_def01$, "If 20 monsters reach the other side, the game is over.", bc_map;
end;
OnTimer17000:
mapannounce 'map_def01$, "Ok, here they come.", bc_map;
end;
OnTimer22000:
stopnpctimer;
donpcevent instance_npcname("#wave_mode_forest_system") + "::OnStart";
end;
}
1@def01,1,1,0 script #wave_mode_forest_system -1,{
end;
OnStart:
initnpctimer;
end;
OnTimer1000:
mapannounce 'map_def01$, "3", bc_map;
end;
OnTimer2000:
mapannounce 'map_def01$, "2", bc_map;
end;
OnTimer3000:
mapannounce 'map_def01$, "1", bc_map;
end;
OnTimer4000:
'wave++;
if ('wave % 5)
mapannounce 'map_def01$, "-- Wave " + 'wave + " --", bc_map;
else
mapannounce 'map_def01$, "!! Champions summoned !!", bc_map;
donpcevent 'npc_name$ + "::OnSpawn";
end;
OnTimer24000:
mapannounce 'map_def01$, "Next monsters will come out soon. Get ready.", bc_map;
initnpctimer;
end;
OnStop:
stopnpctimer;
end;
}
1@def01,1,1,0 script #wave_mode_forest_spawn -1,{
end;
OnSpawn:
switch( 'wave % 70 ) {
case 1:
'mob_id = 2401; // G_PORING
break;
case 2:
'mob_id = 2582; // G_LUNATIC
break;
case 3:
'mob_id = 2573; // G_CHONCHON
break;
case 4:
'mob_id = 2590; // G_ROCKER
break;
case 5:
'mob_id = 2699; // C1_PORING
break;
case 6:
'mob_id = 2577; // G_FABRE
break;
case 7:
'mob_id = 1747; // G_SNAKE
break;
case 8:
'mob_id = 2595; // G_STAINER
break;
case 9:
'mob_id = 2576; // G_CREAMY
break;
case 10:
'mob_id = 2678; // C3_RODA_FROG
break;
case 11:
'mob_id = 2572; // G_CARAMEL
break;
case 12:
'mob_id = 1603; // G_BIGFOOT
break;
case 13:
'mob_id = 2589; // G_POPORING
break;
case 14:
'mob_id = 2578; // G_HORN
break;
case 15:
'mob_id = 2670; // C5_SCORPION
break;
case 16:
'mob_id = 2601; // G_YOYO
break;
case 17:
'mob_id = 2575; // G_COCO
break;
case 18:
'mob_id = 2583; // G_MARTIN
break;
case 19:
'mob_id = 2600; // G_WOLF
break;
case 20:
'mob_id = 2705; // C2_POISON_SPORE
break;
case 21:
'mob_id = 1430; // G_ARGOS
break;
case 22:
'mob_id = 2597; // G_STEEL_CHONCHON
break;
case 23:
'mob_id = 1431; // G_BAPHOMET_
break;
case 24:
'mob_id = 2591; // G_SAVAGE
break;
case 25:
'mob_id = 2857; // C5_DENIRO
break;
case 26:
'mob_id = 1457; // G_MANTIS
break;
case 27:
'mob_id = 1424; // G_SIDE_WINDER
break;
case 28:
'mob_id = 1429; // G_ARGIOPE
break;
case 29:
'mob_id = 1441; // G_PENOMENA
break;
case 30:
'mob_id = 2648; // C3_SOLDIER_SKELETON
break;
case 31:
'mob_id = 1422; // G_HUNTER_FLY
break;
case 32:
'mob_id = 2585; // G_MOLE
break;
case 33:
'mob_id = 2592; // G_SIORAVA
break;
case 34:
'mob_id = 2571; // G_BUTOIJO
break;
case 35:
'mob_id = 2673; // C3_SAVAGE
break;
case 36:
'mob_id = 2574; // G_CIVIL_SERVANT
break;
case 37:
'mob_id = 1459; // G_MARIONETTE
break;
case 38:
'mob_id = 1565; // G_WILD_GINSENG
break;
case 39:
'mob_id = 2602; // G_ZIPPER_BEAR
break;
case 40:
'mob_id = 2644; // C4_STALACTIC_GOLEM
break;
case 41:
'mob_id = 2588; // G_PITMAN
break;
case 42:
'mob_id = 1624; // G_WASTE_STOVE
break;
case 43:
'mob_id = 2570; // G_BREEZE
break;
case 44:
'mob_id = 1573; // G_ELDER
break;
case 45:
'mob_id = 2811; // C3_GRAND_PECO
break;
case 46:
'mob_id = 2598; // G_UNGOLIANT
break;
case 47:
'mob_id = 1606; // G_GARM_BABY
break;
case 48:
'mob_id = 1794; // G_ROWEEN
break;
case 49:
'mob_id = 2596; // G_STAPO
break;
case 50:
'mob_id = 2838; // C5_EVIL_DRUID
break;
case 51:
'mob_id = 2569; // G_ANOPHELES
break;
case 52:
'mob_id = 2584; // G_MINERAL
break;
case 53:
'mob_id = 2599; // G_WILD_RIDER
break;
case 54:
'mob_id = 1531; // G_EVIL_CLOUD_HERMIT
break;
case 55:
'mob_id = 2612; // C5_WOOD_GOBLIN
break;
case 56:
'mob_id = 2587; // G_OBSIDIAN
break;
case 57:
'mob_id = 1564; // G_WICKED_NYMPH
break;
case 58:
'mob_id = 2586; // G_NERAID
break;
case 59:
'mob_id = 1483; // G_RYBIO
break;
case 60:
'mob_id = 2888; // C2_BANASPATY
break;
case 61:
'mob_id = 2593; // G_SIROMA
break;
case 62:
'mob_id = 2580; // G_KAHO
break;
case 63:
'mob_id = 1600; // G_HEATER
break;
case 64:
'mob_id = 1791; // G_GALION
break;
case 65:
'mob_id = 2629; // C3_UNGOLIANT
break;
case 66:
'mob_id = 2581; // G_LUDE
break;
case 67:
'mob_id = 2579; // G_HYLOZOIST
break;
case 68:
'mob_id = 1549; // G_LAVA_GOLEM
break;
case 69:
'mob_id = 2594; // G_SNOWIER
break;
default:
'mob_id = 2730; // C2_NOVUS
break;
}
initnpctimer;
end;
OnTimer1000:
stopnpctimer;
if (('wave % 5) == 0) { // champion
donpcevent 'npc_name$ + "::OnSpawn0";
donpcevent 'npc_name$ + "::OnSpawn1";
donpcevent 'npc_name$ + "::OnSpawn2";
donpcevent 'npc_name$ + "::OnSpawn3";
donpcevent 'npc_name$ + "::OnSpawn4";
end;
}
if ('wave == 1) // first wave at x = 51
.@dx = 3;
else
.@dx = 2;
for ( .@i = 0; .@i < 24; .@i++ ) {
donpcevent 'npc_name$ + "::OnSpawn" + .@dx;
sleep 300;
}
// total ~7 secs
end;
OnSpawn0: callsub( S_Spawn, 0 );
OnSpawn1: callsub( S_Spawn, 1 );
OnSpawn2: callsub( S_Spawn, 2 );
OnSpawn3: callsub( S_Spawn, 3 );
OnSpawn4: callsub( S_Spawn, 4 );
S_Spawn:
.@x = 48 + getarg(0);
monster 'map_def01$,.@x,74, "Invader!", 'mob_id,1;
.@gid = $@mobid[0];
setunitdata .@gid, UMOB_MODE, ( MD_CANMOVE|MD_NORANDOMWALK );
setunitdata .@gid, UMOB_IGNORE_CELL_STACK_LIMIT, true;
mob_setidleevent .@gid, 'npc_name$ + "::OnIdle" + getarg(0);
end;
OnIdle0: callsub( S_Idle, 0 );
OnIdle1: callsub( S_Idle, 1 );
OnIdle2: callsub( S_Idle, 2 );
OnIdle3: callsub( S_Idle, 3 );
OnIdle4: callsub( S_Idle, 4 );
S_Idle:
callfunc( "F_mobidle", ('npc_name$ + "::OnIdle" + getarg(0)), 'size_coord, 'x_mob, getarg(0), 'y_mob, 'dist_spot_AZ );
'mob_escaped++;
if ('mob_escaped <= 20)
mapannounce 'map_def01$, "" + 'mob_escaped + " " + ('mob_escaped == 1 ? "monster has" : "monsters have") + " escaped.", bc_map;
if ('mob_escaped == 20)
donpcevent instance_npcname("#wave_mode_forest_out") + "::OnFail";
end;
}
// 1@def01,50,23,0 script #wave_mode_forest_warp WARPNPC,2,2,{
1@def01,50,30,0 script #wave_mode_forest_warp WARPNPC,2,2,{// official warp out
end;
OnTouch:
if (wave_mode_map$ == "")
warp "prontera",0,0;
else {
warp wave_mode_map$, wave_mode_x, wave_mode_y;
wave_mode_map$ = "";
wave_mode_x = wave_mode_y = 0;
}
end;
}
1@def01,1,1,0 script #wave_mode_forest_out -1,{
end;
OnFail:
donpcevent instance_npcname("#wave_mode_forest_system") + "::OnStop";
mapannounce 'map_def01$, "You have failed the <Wave mode - Forest> challenge.", bc_map;
enablenpc instance_npcname("#wave_mode_forest_warp");
initnpctimer;
end;
OnTimer1000:
mapannounce 'map_def01$, "<Wave mode - Forest> service has closed. You will be returned to the place you entered if you use the warp at the entrance.", bc_map;
end;
OnTimer30000:
stopnpctimer;
instance_destroy();
end;
OnInstanceInit:
'wave = 'mob_escaped = 0;
'map_def01$ = instance_mapname("1@def01");
'npc_name$ = instance_npcname("#wave_mode_forest_spawn");
disablenpc instance_npcname("#wave_mode_forest_system");
disablenpc instance_npcname("#wave_mode_forest_warp");
disablenpc instance_npcname("#wave_mode_forest_out");
setarray 'x_mob[0], 48, 48, 48, 48, 48, 48, 48;
setarray 'y_mob[0], 74, 65, 56, 48, 40, 31, 23;
'size_coord = getarraysize('y_mob);
for ( .@i = 0; .@i < 'size_coord -1; .@i++ ) {
.@dist_mob[.@i+1] = distance( 'x_mob[.@i], 'y_mob[.@i], 'x_mob[.@i+1], 'y_mob[.@i+1] );
.@total_mob += .@dist_mob[.@i+1];
}
for ( .@i = 0; .@i < 'size_coord -1; .@i++ )
'dist_spot_AZ[.@i] = .@total_mob - .@dist_mob[.@i];
end;
}
// Wave mode sky
1@def02,30,35,0 script #wave_mode_sky_entrance WARPNPC,1,1,{
end;
OnTouch:
if ('status_instance == 1)
end;
else if ('status_instance == 0) {
'status_instance = 1;
initnpctimer;
disablenpc instance_npcname("#wave_mode_sky_entrance");
}
else if ('status_instance == 2) {
if (wave_mode_map$ == "")
warp "prontera",0,0;
else {
warp wave_mode_map$, wave_mode_x, wave_mode_y;
wave_mode_map$ = "";
wave_mode_x = wave_mode_y = 0;
}
}
end;
OnTimer4000:
stopnpctimer;
donpcevent instance_npcname("#wave_mode_sky_system") + "::OnStart";
end;
}
1@def02,1,1,0 script #wave_mode_sky_system -1,{
end;
OnStart:
initnpctimer;
mapannounce 'map_def02$, "We would like to thank all costumers who always use Zonda Agency.", bc_map;
end;
OnTimer1000:
mapannounce 'map_def02$, "3", bc_map;
end;
OnTimer2000:
mapannounce 'map_def02$, "2", bc_map;
end;
OnTimer3000:
mapannounce 'map_def02$, "1", bc_map;
end;
OnTimer4000:
'wave_num++;
if ('wave_num % 5) {
donpcevent 'npc_name_mob$ + "::OnSpawn";
donpcevent 'npc_name_mercenary$ + "::OnStart";
donpcevent 'npc_name_mercenary$ + "::OnStart";
}
else {
donpcevent 'npc_name_treasure$ + "::OnStart";
}
end;
OnTimer24000:
mapannounce 'map_def02$, "Next monster wave will come out soon. Get ready.", bc_map;
initnpctimer;
end;
OnStop:
stopnpctimer;
end;
}
1@def02,1,1,0 script #wave_mode_sky_treasure -1,{
end;
OnStart:
if ('treasure_num < 5)
'treasure_num++;
mapannounce 'map_def02$, "!! " + 'treasure_num + " treasure box appeared !!", bc_map;
for ( .@i = 0; .@i < 'treasure_num; .@i++ ) {
monster 'map_def02$,0,0, "Treasure box",3075,1; // WA_TREASURE
'treasure_gid[.@i] = $@mobid[0];
}
initnpctimer;
end;
OnTimer16500: callsub( S_Dice, ET_DICE3 );
OnTimer17500: callsub( S_Dice, ET_DICE2 );
OnTimer18500: callsub( S_Dice, ET_DICE1 );
OnTimer19500:
for ( .@i = 0; .@i < 'treasure_num; .@i++ ) {
if (unitexists('treasure_gid[.@i]))
unitskilluseid 'treasure_gid[.@i],301,1,'treasure_gid[.@i],-1; // SA_INSTANTDEATH
}
donpcevent 'npc_name_treasure$ + "::OnStop";
end;
S_Dice:
.@emotion_num = getarg(0);
for ( .@i = 0; .@i < 'treasure_num; .@i++ ) {
if (unitexists('treasure_gid[.@i]))
emotion .@emotion_num, 'treasure_gid[.@i];
}
end;
OnStop:
deletearray 'treasure_gid[0], 'treasure_num;
stopnpctimer;
end;
}
1@def02,1,1,0 script #wave_mode_sky_mercenary -1,{
end;
OnStart:
monster 'map_def02$,29,35, "Mercenary", 3086,1, "",0,AI_WAVEMODE; // WA_MERCENARY
.@gid = $@mobid[0];
emotion ET_SURPRISE, .@gid;
setunitdata .@gid, UMOB_IGNORE_CELL_STACK_LIMIT, true;
mob_setidleevent .@gid, 'npc_name_mercenary$ + "::OnIdle";
sleep 45000;
if (unitexists(.@gid))
unitskilluseid .@gid,301,1,.@gid,1,false; // SA_INSTANTDEATH
end;
OnIdle:
callfunc( "F_mobidle", ('npc_name_mercenary$ + "::OnIdle"), 'size_coord, 'x_merc, 0, 'y_merc, 'dist_spot_ZA );
end;
}
1@def02,1,1,0 script #wave_mode_sky_mob_spawn -1,{
end;
OnSpawn:
mapannounce 'map_def02$, "-- Wave " + 'wave_num + " --", bc_map;
.@i = ('wave_num % 10) - 1;
setarray .@mob_list[0],
3076, // WA_MONSTER_1
3077, // WA_MONSTER_2
3078, // WA_MONSTER_3
3079, // WA_MONSTER_4
3080, // WA_MONSTER_5 (skipped)
3081, // WA_MONSTER_6
3082, // WA_MONSTER_7
3083, // WA_MONSTER_8
3084, // WA_MONSTER_9
3085; // WA_MONSTER_10 (skipped)
'mob_id = .@mob_list[.@i];
initnpctimer;
end;
OnTimer1000: callsub( S_Spawn, true ); // aggressive
OnTimer1500: callsub( S_Spawn, false ); // passive
OnTimer2000: callsub( S_Spawn, true );
OnTimer2500: callsub( S_Spawn, false );
OnTimer3000: callsub( S_Spawn, true );
OnTimer3500: callsub( S_Spawn, false );
OnTimer4000: callsub( S_Spawn, true );
OnTimer4500: callsub( S_Spawn, false );
OnTimer5000: callsub( S_Spawn, true );
OnTimer5500: callsub( S_Spawn, false );
OnTimer6000: callsub( S_Spawn, true );
OnTimer6500: callsub( S_Spawn, false );
OnTimer7000: callsub( S_Spawn, true );
OnTimer7500: callsub( S_Spawn, false );
OnTimer8000: callsub( S_Spawn, true );
OnTimer8500:
stopnpctimer;
end;
S_Spawn:
monster 'map_def02$,48,67, "Go!", 'mob_id,1;
if (getarg(0) == true)
setunitdata $@mobid[0], UMOB_MODE, ( MD_CANMOVE|MD_NORANDOMWALK|MD_AGGRESSIVE|MD_CANATTACK );
.@gid = $@mobid[0];
emotion ET_SURPRISE, .@gid;
setunitdata .@gid, UMOB_IGNORE_CELL_STACK_LIMIT, true;
mob_setidleevent .@gid, 'npc_name_mob$ + "::OnIdle";
end;
OnIdle:
// monster are walking to the nearest next spot
callfunc( "F_mobidle", ('npc_name_mob$ + "::OnIdle"), 'size_coord, 'x_mob, 0, 'y_mob, 'dist_spot_AZ );
'mob_escaped++;
if ('mob_escaped <= 20)
mapannounce 'map_def02$, "" + 'mob_escaped + " " + ('mob_escaped == 1 ? "monster has" : "monsters have") + " escaped.", bc_map;
if ('mob_escaped == 20)
donpcevent instance_npcname("#wave_mode_sky_out") + "::OnFail";
end;
}
1@def02,1,1,0 script #wave_mode_sky_out -1,{
end;
OnFail:
// monsters timers continue
donpcevent instance_npcname("#wave_mode_sky_system") + "::OnStop";
mapannounce 'map_def02$, "You have failed the <Wave mode - Sky> challenge.", bc_map;
'status_instance = 2;
enablenpc instance_npcname("#wave_mode_sky_entrance");
initnpctimer;
end;
OnTimer1000:
mapannounce 'map_def02$, "<Wave mode - Sky> service has closed. You will be returned to the place you entered if you use the warp at the entrance.", bc_map;
end;
OnTimer30000:
stopnpctimer;
instance_destroy();
end;
OnInstanceInit:
deletearray 'treasure_gid[0], 'treasure_num;
'wave_num = 'treasure_num = 'status_instance = 'mob_escaped = 0;
'map_def02$ = instance_mapname("1@def02");
'npc_name_mob$ = instance_npcname("#wave_mode_sky_mob_spawn");
'npc_name_treasure$ = instance_npcname("#wave_mode_sky_treasure");
'npc_name_mercenary$ = instance_npcname("#wave_mode_sky_mercenary");
disablenpc instance_npcname("#wave_mode_sky_out");
setarray 'x_mob[0], 48, 38, 30, 30, 29, 38, 47, 51, 50, 42, 33, 29;
setarray 'y_mob[0], 67, 67, 64, 58, 52, 52, 51, 45, 36, 36, 36, 35;
setarray 'x_merc[0], 29, 33, 42, 50, 51, 47, 38, 29, 30, 30, 38, 47;
setarray 'y_merc[0], 35, 36, 36, 36, 45, 51, 52, 52, 58, 64, 67, 67;
'size_coord = getarraysize('x_mob);
for ( .@i = 0; .@i < 'size_coord -1; .@i++ ) {
.@dist_mob[.@i+1] = distance( 'x_mob[.@i], 'y_mob[.@i], 'x_mob[.@i+1], 'y_mob[.@i+1] );
.@total_mob += .@dist_mob[.@i+1];
.@dist_merc[.@i+1] = distance( 'x_merc[.@i], 'y_merc[.@i], 'x_merc[.@i+1], 'y_merc[.@i+1] );
.@total_merc += .@dist_merc[.@i+1];
}
for ( .@i = 0; .@i < 'size_coord -1; .@i++ ) {
'dist_spot_AZ[.@i] = .@total_mob - .@dist_mob[.@i];
'dist_spot_ZA[.@i] = .@total_merc - .@dist_merc[.@i];
}
end;
}