123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808 |
- //===== 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;
- }
|