123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959 |
- //===== rAthena Script =======================================
- //= Instance Villa of Deception.
- //===== Description: =========================================
- //- [Walkthrough conversion]
- //- Require to complete the Episode 18 main quest.
- //- The function to drop an item with random option is defined in re/other/glocal_npc2.txt
- // Notes:
- // Some of the setting can be modified in 'Optional settings'.
- // The monster inside the hard mode are using relieve level 10 (-99% damages).
- // Change it if you think the player damage are too low, this level is a workaround but the damages
- // on the mobs are lower in hard mode than in normal on official. The level is 9 on official.
- //===== Changelogs: ==========================================
- //= 1.0 First version. [Capuche]
- //============================================================
- wolfvill,79,260,0 script #con_wp11 HIDDEN_WARP_NPC,4,4,{
- end;
- OnTouch:
- if (ep18_main < 57)
- end;
- cloakoffnpcself( "Aira#con" );
- end;
- }
- wolfvill,79,260,4 script(CLOAKED) Aira#con 4_M_BRZ_JACI,{
- if (ep18_main < 57)
- end;
- switch( checkquest(12522,PLAYTIME) ) {
- case -1:
- break;
- case 0:
- case 1:
- mes "[Aira]";
- mes "Please wait the end of the quest delay.";
- close;
- case 2:
- erasequest 12522;
- mes "^0000ff All the aftereffects of access are gone.^000000";
- close;
- }
- mes "[Aira]";
- mes "" + strcharinfo(0) + "Thanks to Mr. I arrived safely in the village.";
- mes "But it seems that something has been revived in the villa. I think I need to get help one more time.";
- next;
- .@md_name_normal$ = "Villa of Deception";
- .@md_name_hard$ = "Villa of Deception Advanced";
- if (is_party_leader() == true) {
- .@create_normal$ = "^000044Create " + .@md_name_normal$ + "^000000";
- if (countitem(1000471) > 0)
- .@create_hard$ = "^000044Create " + .@md_name_hard$ + "^000000";
- }
- switch( select( "Entry", .@create_normal$, .@create_hard$ ) ) {
- case 1:
- if (select( .@md_name_normal$, .@md_name_hard$ ) == 1) {
- if (BaseLevel < 170) {
- mes "[Aira]";
- mes "You must be at least BaseLevel 170 to enter.";
- close;
- }
- .@enter_to$ = .@md_name_normal$;
- }
- else {
- if (BaseLevel < 200) {
- mes "[Aira]";
- mes "You must be at least BaseLevel 200 to enter.";
- close;
- }
- .@enter_to$ = .@md_name_hard$;
- }
- switch( instance_enter(.@enter_to$) ) {
- case IE_OTHER:
- mes "^ff0000An unknown error occurred.^000000";
- close;
- case IE_NOINSTANCE:
- mes "^0000ff The dungeon has not been created or you are trying to enter a dungeon different from the party leader.^000000";
- close;
- case IE_NOMEMBER:
- mes "^ff0000Only a member of the party can enter the Memorial Dungeon.^000000";
- close;
- case IE_OK:
- mapannounce "wolfvill", "" + strcharinfo(0) + " of the party, " + getpartyname( getcharid(1) ) + ", is entering " + .@enter_to$ + ".",bc_map,"0x00ff99",FW_NORMAL,12;
- if (.@enter_to$ == .@md_name_normal$)
- setquest 12520;
- else
- setquest 12521;
- setquest 12522;
- // warp "1@advs",111,19;
- end;
- }
- end;
- case 2:
- if (BaseLevel < 170) {
- mes "[Aira]";
- mes "You must be at least BaseLevel 170 to create the instance.";
- close;
- }
- if (instance_create(.@md_name_normal$) < 0) {
- mes "Party: " + getpartyname(getcharid(1)) + "";
- mes "Leader: " + strcharinfo(0) + "";
- mes "^0000ff" + .@md_name_normal$ + " ^000000- Unknown error";
- close;
- }
- end;
- case 3:
- if (BaseLevel < 200) {
- mes "[Aira]";
- mes "You must be at least BaseLevel 200 to create the instance.";
- close;
- }
- if (countitem(1000471) < 1) {
- mes "[Aira]";
- mes "Where is the " + getitemname(1000471) + "?";
- close;
- }
- if (instance_create(.@md_name_hard$) < 0) {
- mes "Party: " + getpartyname(getcharid(1)) + "";
- mes "Leader: " + strcharinfo(0) + "";
- mes "^0000ff" + .@md_name_hard$ + " ^000000- Unknown error";
- close;
- }
- delitem 1000471,1;
- end;
- }
- end;
- }
- 1@advs,1,1,0 script advs_init -1,{
- end;
- OnInstanceInit:
- //--------------------------------------------
- // variables initialization
- //--------------------------------------------
- 'advs_step = 0;
- 'map_advs$ = instance_mapname("1@advs");
- // variables step 1
- 'sw_timer = 0;
- deletearray 'sw[0], 2;
- // variables step 3
- deletearray 'x_reaper[0], 'size_reaper;
- deletearray 'y_reaper[0], 'size_reaper;
- 'size_reaper = 0;
- //--------------------------------------------
- // Optional settings
- //--------------------------------------------
- // Number minimum of reaper spawn on step 3
- 'min_reaper = 3;
- // Setting according to the mode
- if (instance_live_info(ILI_NAME) == "Villa of Deception Advanced") {
- 'advs_difficult = 1;
- 'sanare_id = 21377; // EP18_MD_SANARE_L
- 'hunter_id = 21378; // EP18_MD_HEARTHUNTER_L
- 'monster_relieve = 10; // need check but the damages are very low compared to normal mode
- // Total of monster to kill in step 1, 2, 3
- 'total_monster_step_1 = 80;
- 'total_monster_step_2 = 70;
- 'total_monster_step_3 = 80;
- // Number of monster spawn at the start of step 1, 2, 3
- 'init_monster_step_1 = 40;
- 'init_monster_step_2 = 30;
- 'init_monster_step_3 = 40;
- 'schulang_id = 21360; // EP18_MD_SCHULANG_L
- 'freyja_id = 21361; // EP18_MD_DEMI_FREYJA_L
-
- // Don't touch this unless you know what you're doing
- .@interval = 5; // distance between each reaper
- .@max_reaper = 48; // number max of reaper spawn
- }
- else {
- 'advs_difficult = 0;
- 'sanare_id = 21318; // EP18_MD_SANARE_R
- 'hunter_id = 21319; // EP18_MD_HEARTHUNTER_R2
- 'monster_relieve = 9;
- // Total of monster to kill in step 1, 2, 3
- 'total_monster_step_1 = 35;
- 'total_monster_step_2 = 35;
- 'total_monster_step_3 = 35;
- // Number of monster spawn at the start of step 1, 2, 3
- 'init_monster_step_1 = 35;
- 'init_monster_step_2 = 25;
- 'init_monster_step_3 = 24;
- 'schulang_id = 21316; // EP18_MD_SCHULANG_R
- 'freyja_id = 21317; // EP18_MD_DEMI_FREYJA_R
- // Don't touch this unless you know what you're doing
- .@interval = 10;
- .@max_reaper = 16;
- }
- for ( .@i = 109; .@i <= 139; .@i += .@interval ) {
- for ( .@j = 219; .@j <= 249; .@j += .@interval ) {
- if (.@i == 124 && .@j == 234)
- continue;
- 'x_reaper[ 'size_reaper ] = .@i;
- 'y_reaper[ 'size_reaper ] = .@j;
- 'size_reaper++;
- }
- }
- 'total_reaper = min(.@max_reaper, 'size_reaper);
- // number total of food necessary to reduce the number of reaper to 'min_reaper
- 'max_food = ('total_reaper * 2) - ('min_reaper * 2);
- // debug
- 'total_monster_step_1 = max('init_monster_step_1, 'total_monster_step_1);
- 'total_monster_step_2 = max('init_monster_step_2, 'total_monster_step_2);
- 'total_monster_step_3 = max('init_monster_step_3, 'total_monster_step_3);
- //--------------------------------------------
- // npcs management
- //--------------------------------------------
- disablenpc instance_npcname("#boss2");
- disablenpc instance_npcname("#box_admin");
- // warps
- disablenpc instance_npcname("#wp1");
- disablenpc instance_npcname("#wp2");
- disablenpc instance_npcname("#wp3");
- disablenpc instance_npcname("#wp4");
- disablenpc instance_npcname("#food1");
- disablenpc instance_npcname("#food2");
- disablenpc instance_npcname("#food3");
- disablenpc instance_npcname("#food4");
- // circles step final
- disablenpc instance_npcname("#b_tr1");
- disablenpc instance_npcname("#b_tr2");
- disablenpc instance_npcname("#b_tr3");
- disablenpc instance_npcname("#b_tr4");
- // stop circles from moving
- disablenpc instance_npcname("#b_sw1");
- disablenpc instance_npcname("#b_sw2");
- disablenpc instance_npcname("#b_sw3");
- disablenpc instance_npcname("#b_sw4");
- disablenpc instance_npcname("#boss1");
- disablenpc instance_npcname("#boss2_sw");
- donpcevent instance_npcname("#advs_step_1") + "::OnStart";
- end;
- }
- // Entrance
- // (npc probably used to enable the npcs according to the instance mode - normal or hard)
- // 1@advs,111,19,0 duplicate(dummy_npc) #hidden_wp1 HIDDEN_WARP_NPC,2,2
- // 1@advs,134,19,0 duplicate(dummy_npc) #hidden_wp2 HIDDEN_WARP_NPC,2,2
- //---------------------------------------------------------------
- // Warps
- //---------------------------------------------------------------
- 1@advs,124,101,0 warp #wp1 2,2,1@advs,124,115
- 1@advs,124,205,0 script #wp2 WARPNPC,2,2,{
- end;
- OnTouch:
- .@r = rand(3);
- if (.@r == 0)
- warp 'map_advs$,101,235;
- else if (.@r == 1)
- warp 'map_advs$,155,233;
- else
- warp 'map_advs$,124,211;
- end;
- }
- 1@advs,124,266,0 warp #wp3 2,2,1@advs,124,277
- 1@advs,124,307,0 warp #wp4 2,2,1@advs,124,319
- // 1@advs,124,307,0 duplicate(dummy_npc) #wp4 WARPNPC,10,10
- //---------------------------------------------------------------
- // Step 1
- //---------------------------------------------------------------
- 1@advs,1,1,0 script #advs_step_1 -1,{
- end;
- OnStart:
- 'mob_to_respawn = 'total_monster_step_1 - 'init_monster_step_1;
- // The coordinates may be inaccurates (maybe not random on official)
- for ( .@i = 0; .@i < 'init_monster_step_1; ++.@i )
- callsub( S_Spawn );
- end;
-
- OnMobDead:
- if ('mob_to_respawn > 0)
- 'mob_to_respawn--;
- initnpctimer;
- sleep 2000;
- if ('advs_step == 0 && 'mob_to_respawn > 0) {
- if ('mob_to_respawn > 0)
- callsub( S_Spawn );
- if ('mob_to_respawn > 1)
- callsub( S_Spawn );
- }
- end;
- OnTimer2000:
- stopnpctimer;
- .@alive = mobcount('map_advs$, instance_npcname("#advs_step_1") + "::OnMobDead");
- mapannounce 'map_advs$, "Number of monsters left: " + .@alive, bc_map, 0xAAAAFF;
- end;
- S_Spawn:
- .@label$ = instance_npcname("#advs_step_1") + "::OnMobDead";
- if (rand(2))
- .@mob_id = 'hunter_id;
- else
- .@mob_id = 'sanare_id;
- .@r = rand(3);
- if (.@r == 0)
- areamonster 'map_advs$,63,89,72,182,"--en--",.@mob_id,1, .@label$;
- else if (.@r == 1)
- areamonster 'map_advs$,63,89,184,101,"--en--",.@mob_id,1, .@label$;
- else
- areamonster 'map_advs$,184,89,174,182,"--en--",.@mob_id,1, .@label$;
- unitskilluseid $@mobid[0], 771, 'monster_relieve; // NPC_RELIEVE_ON
- return;
- }
- 1@advs,67,182,5 script #sw_1 4_NFWISP,1,1,{
- if ('advs_step != 0)
- end;
- mes "[Unidentified grudge]";
- mes "Are you here to set me free?";
- next;
- if (select( "Stop", "Do it" ) == 1)
- end;
- if ('advs_step != 0)
- end;
- disablenpc instance_npcname("#sw_1");
- 'sw[0] = 1;
- donpcevent instance_npcname("#sw_timer") + "::OnStart";
- end;
- OnTouch_:
- end;
- }
- 1@advs,180,182,5 script #sw_2 4_NFWISP,1,1,{
- if ('advs_step != 0)
- end;
- mes "[Unidentified grudge]";
- mes "Are you here to set me free?";
- next;
- if (select( "Stop", "Do it" ) == 1)
- end;
- if ('advs_step != 0)
- end;
- disablenpc instance_npcname("#sw_2");
- 'sw[1] = 1;
- donpcevent instance_npcname("#sw_timer") + "::OnStart";
- end;
- OnTouch_:
- end;
- }
- 1@advs,1,1,5 script #sw_timer -1,{
- end;
- OnStart:
- if ('sw_timer == 1)
- end;
- 'sw_timer = 1;
- initnpctimer;
- end;
- OnTimer3000:
- stopnpctimer;
- if ('sw[0] != 1 || 'sw[1] != 1) {
- 'sw_timer = 0;
- if ('sw[0] == 1)
- enablenpc instance_npcname("#sw_1");
- if ('sw[1] == 1)
- enablenpc instance_npcname("#sw_2");
- 'sw[0] = 0;
- 'sw[1] = 0;
- npctalk "Ah... my half soul beyond this hallway is still unfulfilled...", instance_npcname("#sw_1");
- npctalk "Ah... my half soul beyond this hallway is still unfulfilled...", instance_npcname("#sw_2");
- mapannounce 'map_advs$, "You must free both souls on the left and right of the hallway at the same time.", bc_map, 0xAAAAFF;
- end;
- }
- if ('advs_step != 0)
- end;
- mapannounce 'map_advs$, "Two souls are simultaneously liberated, opening the door to the center.", bc_map, 0xAAAAFF;
- donpcevent instance_npcname("#advs_step_2") + "::OnStart";
- end;
- }
- 1@advs,75,89,5 script #trap_1 4_M_DEATH,1,1,{
- end;
- OnTouch:
- specialeffect2 EF_FIREHIT;
- specialeffect2 EF_ACIDDEMON;
- getmapxy( .@map$, .@x, .@y, BL_PC );
- getmapxy( .@map$, .@x_npc, .@y_npc, BL_NPC );
- if (.@x == .@x_npc) {
- if (.@y < 89)
- pushpc DIR_SOUTH, 1;
- else if (.@y > 99)
- pushpc DIR_NORTH, 1;
- else
- pushpc DIR_EAST, 1; // default
- }
- else if (.@x < .@x_npc)
- pushpc DIR_WEST, 1;
- else
- pushpc DIR_EAST, 1;
- heal -((MaxHp*50)/100),0; // note: heal command is used to (potentially) kill the target
- end;
- OnMove1:
- getmapxy( .@map$, .@x, .@y, BL_NPC );
- unitwalk( getnpcid(0),.@x,99, instance_npcname( strnpcinfo(0) ) + "::OnMove2" );
- end;
- OnMove2:
- getmapxy( .@map$, .@x, .@y, BL_NPC );
- unitwalk( getnpcid(0),.@x,89, instance_npcname( strnpcinfo(0) ) + "::OnMove1" );
- end;
- OnInstanceInit:
- npcspeed 150;
- sleep rand(100,3000);
- donpcevent instance_npcname( strnpcinfo(0) ) + "::OnMove1";
- end;
- }
- // traps left
- 1@advs,80,89,1 duplicate(#trap_1) #trap_2 4_M_DEATH,1,1
- 1@advs,85,89,1 duplicate(#trap_1) #trap_3 4_M_DEATH,1,1
- 1@advs,90,89,1 duplicate(#trap_1) #trap_4 4_M_DEATH,1,1
- 1@advs,95,89,1 duplicate(#trap_1) #trap_5 4_M_DEATH,1,1
- 1@advs,100,89,1 duplicate(#trap_1) #trap_6 4_M_DEATH,1,1
- 1@advs,105,89,1 duplicate(#trap_1) #trap_7 4_M_DEATH,1,1
- 1@advs,110,89,1 duplicate(#trap_1) #trap_8 4_M_DEATH,1,1
- 1@advs,115,89,1 duplicate(#trap_1) #trap_9 4_M_DEATH,1,1
- // traps right
- 1@advs,130,89,1 duplicate(#trap_1) #trap_10 4_M_DEATH,1,1
- 1@advs,135,89,1 duplicate(#trap_1) #trap_11 4_M_DEATH,1,1
- 1@advs,140,89,1 duplicate(#trap_1) #trap_12 4_M_DEATH,1,1
- 1@advs,145,89,1 duplicate(#trap_1) #trap_13 4_M_DEATH,1,1
- 1@advs,150,89,1 duplicate(#trap_1) #trap_14 4_M_DEATH,1,1
- 1@advs,155,89,1 duplicate(#trap_1) #trap_15 4_M_DEATH,1,1
- 1@advs,160,89,1 duplicate(#trap_1) #trap_16 4_M_DEATH,1,1
- 1@advs,165,89,1 duplicate(#trap_1) #trap_17 4_M_DEATH,1,1
- 1@advs,170,89,1 duplicate(#trap_1) #trap_18 4_M_DEATH,1,1
- //---------------------------------------------------------------
- // Step 2
- //---------------------------------------------------------------
- 1@advs,1,1,0 script #advs_step_2 -1,{
- end;
- OnStart:
- if ('advs_step != 0)
- end;
- 'advs_step = 1;
- disablenpc instance_npcname("#advs_step_1");
- enablenpc instance_npcname("#wp1");
- enablenpc instance_npcname("#food1");
- enablenpc instance_npcname("#food2");
- enablenpc instance_npcname("#food3");
- enablenpc instance_npcname("#food4");
- killmonster 'map_advs$, instance_npcname("#advs_step_1") + "::OnMobDead";
- 'mob_to_respawn = 'total_monster_step_2 - 'init_monster_step_2;
- for ( .@i = 0; .@i < 'init_monster_step_2; ++.@i )
- callsub( S_Spawn );
- end;
- OnMobDead:
- if ('mob_to_respawn > 0)
- 'mob_to_respawn--;
- initnpctimer;
- sleep 2000;
- if ('advs_step == 1 && 'mob_to_respawn > 0) {
- if ('mob_to_respawn > 0)
- callsub( S_Spawn );
- if ('mob_to_respawn > 1)
- callsub( S_Spawn );
- }
- end;
- OnTimer2000:
- stopnpctimer;
- .@alive = mobcount('map_advs$, instance_npcname("#advs_step_2") + "::OnMobDead");
- mapannounce 'map_advs$, "Number of monsters left: " + .@alive, bc_map, 0xAAAAFF;
- if ('advs_step == 1 && 'mob_to_respawn == 0 && .@alive == 0)
- donpcevent instance_npcname("#advs_step_3_A") + "::OnStart";
- end;
- S_Spawn:
- .@label$ = instance_npcname("#advs_step_2") + "::OnMobDead";
- if (rand(2))
- .@mob_id = 'hunter_id;
- else
- .@mob_id = 'sanare_id;
- .@r = rand(3);
- if (.@r == 0)
- areamonster 'map_advs$,76,145,171,139,"--en--",.@mob_id,1, .@label$;
- else if (.@r == 1)
- areamonster 'map_advs$,113,205,135,125,"--en--",.@mob_id,1, .@label$;
- else
- areamonster 'map_advs$,113,205,135,125,"--en--",.@mob_id,1, .@label$;
- unitskilluseid $@mobid[0], 771, 'monster_relieve; // NPC_RELIEVE_ON
- return;
- }
- 1@advs,101,159,5 script #food1 4_EP16_FOOD,1,1,{
- if ('max_food <= 0) {
- mapannounce 'map_advs$, "??? : You really don't know how to cook well, you deserve a casual tour of my garden.", bc_map, 0xAAAAFF;
- end;
- }
- progressbar "",4;
- 'max_food--;
-
- .@r = rand(5);
- if (.@r == 0)
- sc_start SC_CONFUSION,30000,0,100, SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF;
- else if (.@r == 1)
- sc_start SC_CURSE,30000,0,100, SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF;
- else if (.@r == 2)
- sc_start SC_BLIND,30000,0,100, SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF;
- else if (.@r == 3)
- sc_start SC_POISON,30000,0,100, SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF;
- else
- sc_start SC_SILENCE,30000,0,100, SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF;
- if ('total_reaper > 'min_reaper && ('max_food % 2) == 0)
- 'total_reaper--;
- end;
- }
- 1@advs,101,125,5 duplicate(#food1) #food2 4_EP16_FOOD,1,1
- 1@advs,147,162,5 duplicate(#food1) #food3 4_EP16_FOOD,1,1
- 1@advs,147,122,5 duplicate(#food1) #food4 4_EP16_FOOD,1,1
- //---------------------------------------------------------------
- // Step 3
- //---------------------------------------------------------------
- 1@advs,1,1,5 script #advs_step_3_A -1,{
- end;
- OnStart:
- if ('advs_step != 1)
- end;
- 'advs_step = 2;
- enablenpc instance_npcname("#wp2");
- disablenpc instance_npcname("#advs_step_2");
- donpcevent instance_npcname("#advs_step_3_A") + "::OnEvent";
- donpcevent instance_npcname("#advs_step_3_B") + "::OnEvent";
- end;
- OnEvent:
- .@label$ = instance_npcname("#advs_step_3_A") + "::OnMobDead";
-
- copyarray .@x[0], 'x_reaper[0], 'size_reaper;
- copyarray .@y[0], 'y_reaper[0], 'size_reaper;
- .@size = 'size_reaper;
- for ( .@i = 0; .@i < 'total_reaper; ++.@i ) {
- .@r = rand(.@size);
-
- monster 'map_advs$,.@x[.@r],.@y[.@r],"--en--",20846,1, .@label$; // MD_HIDDEN_GROUND01
- deletearray .@x[.@r],1;
- deletearray .@y[.@r],1;
- .@size--;
- }
- initnpctimer;
- end;
- OnTimer10000:
- killmonster 'map_advs$, instance_npcname("#advs_step_3_A") + "::OnMobDead";
- donpcevent instance_npcname("#advs_step_3_A") + "::OnEvent"; // this event never stop
- end;
- OnMobDead:
- end;
- }
- 1@advs,1,1,0 script #advs_step_3_B -1,{
- end;
- OnEvent:
- 'mob_to_respawn = 'total_monster_step_3 - 'init_monster_step_3;
- for ( .@i = 0; .@i < 'init_monster_step_3; ++.@i )
- callsub( S_Spawn );
- end;
- OnMobDead:
- if ('mob_to_respawn > 0)
- 'mob_to_respawn--;
- initnpctimer;
- sleep 2000;
- if ('advs_step == 2 && 'mob_to_respawn > 0) {
- if ('mob_to_respawn > 0)
- callsub( S_Spawn );
- if ('mob_to_respawn > 1)
- callsub( S_Spawn );
- }
- end;
- OnTimer2000:
- stopnpctimer;
- .@alive = mobcount('map_advs$, instance_npcname("#advs_step_3_B") + "::OnMobDead");
- mapannounce 'map_advs$, "Number of monsters left: " + .@alive, bc_map, 0xAAAAFF;
- if ('advs_step == 2 && 'mob_to_respawn == 0 && .@alive == 0)
- donpcevent instance_npcname("#boss1_advs") + "::OnStart";
- end;
- S_Spawn:
- .@label$ = instance_npcname("#advs_step_3_B") + "::OnMobDead";
- if (rand(2))
- .@mob_id = 'hunter_id;
- else
- .@mob_id = 'sanare_id;
- .@r = rand(4);
- if (.@r == 0)
- areamonster 'map_advs$,109,238,119,248,"--en--",.@mob_id,1, .@label$;
- else if (.@r == 1)
- areamonster 'map_advs$,109,219,119,229,"--en--",.@mob_id,1, .@label$;
- else if (.@r == 2)
- areamonster 'map_advs$,128,238,138,248,"--en--",.@mob_id,1, .@label$;
- else
- areamonster 'map_advs$,128,219,138,229,"--en--",.@mob_id,1, .@label$;
- unitskilluseid $@mobid[0], 771, 'monster_relieve; // NPC_RELIEVE_ON
- return;
- }
- //---------------------------------------------------------------
- // Step 4
- //---------------------------------------------------------------
- 1@advs,1,1,4 script #boss1_advs -1,{
- end;
- OnStart:
- if ('advs_step != 2)
- end;
- 'advs_step = 3;
- enablenpc instance_npcname("#wp3");
- disablenpc instance_npcname("#advs_step_3_B");
- enablenpc instance_npcname("#boss1");
- end;
- OnMobDead:
- if ('advs_step != 4)
- end;
- 'advs_step = 5;
- enablenpc instance_npcname("#wp4");
- enablenpc instance_npcname("#boss2_sw");
- donpcevent instance_npcname("#boss1_advs_skill_1") + "::OnStop";
- end;
- }
- // 1@advs,124,295,4 script #boss1 EP18_MD_SCHULANG_R,1,1,{
- 1@advs,124,295,4 script #boss1 EP18_MD_SCHULANG_R,{
- if ('advs_step != 3)
- end;
- if (is_party_leader() == false)
- end;
- 'advs_step = 4;
- npctalk "That's all human.";
- unitwalk getnpcid(0), 124,290, instance_npcname("#boss1") + "::OnMove";
- end;
- OnMove:
- disablenpc instance_npcname("#boss1");
- monster 'map_advs$,124,290,"--en--",'schulang_id,1, instance_npcname("#boss1_advs") + "::OnMobDead";
- 'schulang_gid = $@mobid[0];
- unitskilluseid $@mobid[0], 771, 1; // NPC_RELIEVE_ON
- unittalk 'schulang_gid, "I'm in a bit of trouble if I approach this more than that!!!";
- monster 'map_advs$,123,285,"--en--",21319,1; // EP18_MD_HEARTHUNTER_R2
- unitskilluseid $@mobid[0], 771, 'monster_relieve; // NPC_RELIEVE_ON
- donpcevent instance_npcname("#boss1_advs_skill_1") + "::OnStart";
- end;
- // OnTouch: // effect ?
- // end;
- }
- 1@advs,1,1,0 script #boss1_advs_skill_1 -1,{
- end;
- OnStart:
- initnpctimer;
- getunitdata 'schulang_gid, .@data;
- 'x_sch_event = .@data[UMOB_X];
- 'y_sch_event = .@data[UMOB_Y];
- 'ignore_column = rand(5); // one column is randomly free
- end;
- OnTimer1000:
- callsub( S_Skill,-8 );
- end;
- OnTimer1500:
- callsub( S_Skill,-4 );
- end;
- OnTimer2000:
- callsub( S_Skill,0 );
- end;
- OnTimer2500:
- callsub( S_Skill,4 );
- end;
- OnTimer3000:
- callsub( S_Skill,8 );
- stopnpctimer;
- donpcevent instance_npcname("#boss1_advs_skill_1") + "::OnStart";
- end;
- S_Skill:
- .@dxy = getarg(0);
- if ('ignore_column != 0)
- unitskillusepos 'schulang_gid,"MG_THUNDERSTORM",4, ('x_sch_event - 8), ('y_sch_event + .@dxy), -50;
- if ('ignore_column != 1)
- unitskillusepos 'schulang_gid,"MG_THUNDERSTORM",4, ('x_sch_event - 4), ('y_sch_event + .@dxy), -50;
- if ('ignore_column != 2)
- unitskillusepos 'schulang_gid,"MG_THUNDERSTORM",4, 'x_sch_event, ('y_sch_event + .@dxy), -50;
- if ('ignore_column != 3)
- unitskillusepos 'schulang_gid,"MG_THUNDERSTORM",4, ('x_sch_event + 4), ('y_sch_event + .@dxy), -50;
- if ('ignore_column != 4)
- unitskillusepos 'schulang_gid,"MG_THUNDERSTORM",4, ('x_sch_event + 8), ('y_sch_event + .@dxy), -50;
- return;
- OnStop:
- stopnpctimer;
- end;
- }
- //---------------------------------------------------------------
- // Step 5 (final)
- //---------------------------------------------------------------
- // 1@advs,124,358,4 script #boss2_sw CLEAR_NPC,1,1,{
- 1@advs,124,358,4 script #boss2_sw CLEAR_NPC,{
- if ('advs_step != 5)
- end;
- if (is_party_leader() == false)
- end;
- 'advs_step = 6;
- cloakonnpc instance_npcname("#boss2_sw"); // cloakonnpc to display effect
- specialeffect EF_CLOUD4;
- specialeffect EF_DQ9_CHARGE3;
- sleep 4000;
- specialeffect EF_SCREEN_QUAKE;
- setnpcdisplay( instance_npcname("#boss2"), 'freyja_id );
- enablenpc instance_npcname("#boss2");
- specialeffect EF_BEGINSPELL_YB;
- sleep 2000;
- npctalk "I... and... together... let's play...", instance_npcname("#boss2");
- unitwalk getnpcid(0, instance_npcname("#boss2")), 124,346, instance_npcname("#boss2_sw") + "::OnMove";
- end;
- OnMove:
- setnpcdisplay( instance_npcname("#boss2"), CLEAR_NPC );
- disablenpc instance_npcname("#boss2");
- monster 'map_advs$,124,346,"--en--",'freyja_id,1, instance_npcname("#boss2_sw") + "::OnMobDead";
- 'freyja_gid = $@mobid[0];
- donpcevent instance_npcname("#advs_boss_relieve") + "::OnStart";
- sleep 3000;
- mapannounce 'map_advs$, "Tip: Twisted God Freyja is weaken as it get closer to the chandelier.", bc_map, 0xFFCC;
- if ('advs_difficult == 1)
- sleep 8000;
- else
- sleep 30000;
- // circles
- if ('advs_difficult == 1) {
- donpcevent instance_npcname("#b_tr1") + "::OnEnable";
- donpcevent instance_npcname("#b_tr2") + "::OnEnable";
- }
- donpcevent instance_npcname("#b_tr3") + "::OnEnable";
- donpcevent instance_npcname("#b_tr4") + "::OnEnable";
- // stop the circles from moving
- enablenpc instance_npcname("#b_sw1");
- enablenpc instance_npcname("#b_sw2");
- enablenpc instance_npcname("#b_sw3");
- enablenpc instance_npcname("#b_sw4");
- end;
- OnMobDead:
- 'freyja_gid = 0;
- donpcevent instance_npcname("#advs_boss_relieve") + "::OnStop";
- disablenpc instance_npcname("#boss2_sw");
- enablenpc instance_npcname("#box_admin");
- if ('advs_difficult == 1) {
- donpcevent instance_npcname("#b_tr1") + "::OnStop";
- donpcevent instance_npcname("#b_tr2") + "::OnStop";
- }
- donpcevent instance_npcname("#b_tr3") + "::OnStop";
- donpcevent instance_npcname("#b_tr4") + "::OnStop";
- end;
- // OnTouch: // effect ?
- // end;
- }
- 1@advs,124,356,4 duplicate(dummy_npc) #boss2 CLEAR_NPC,1,1
- 1@advs,1,1,4 script #advs_boss_relieve -1,{
- end;
- OnStart:
- if (unitexists('freyja_gid) == false)
- end;
- getunitdata 'freyja_gid, .@data;
- .@d = distance(124,356,.@data[UMOB_X],.@data[UMOB_Y]);
- .@lv = (.@d / 2) + 1; // level 6 on spawn
- .@lv = min(10,.@lv);
- .@lv = max(1,.@lv);
- unitskilluseid 'freyja_gid, 772, 1; // NPC_RELIEVE_OFF
- unitskilluseid 'freyja_gid, 771, .@lv; // NPC_RELIEVE_ON
- initnpctimer;
- end;
- OnTimer2000:
- donpcevent instance_npcname("#advs_boss_relieve") + "::OnStart";
- end;
- OnStop:
- stopnpctimer;
- end;
- }
- // circles
- 1@advs,124,337,5 script #b_tr1 MD_HIDDEN_GROUND02,2,2,{
- end;
- OnTouch: // note: warp dead player
- if ('freyja_gid == 0)
- end;
- specialeffect2 EF_FIREHIT;
- specialeffect2 EF_ACIDDEMON;
- percentheal -10,0; // deal some damage
- if (rand(2))
- warp 'map_advs$,67,182;
- else
- warp 'map_advs$,180,182;
- end;
- OnEnable:
- enablenpc instance_npcname( strnpcinfo(0) );
- OnStart:
- 'circle_move = 1;
- OnMove:
- if ('freyja_gid == 0)
- end;
- if ('circle_move == 0)
- end;
- getmapxy( .@map$, .@x, .@y, BL_NPC );
- do {
- .@dx = rand(-2,2);
- .@dy = rand(-2,2);
- .@new_x = .@x + .@dx;
- .@new_y = .@y + .@dy;
- }
- while ((.@dx == 0 && .@dy == 0) || .@new_x < 108 || .@new_x > 139 || .@new_y < 325 || .@new_y > 351);
- unitwalk( getnpcid(0),.@new_x,.@new_y, instance_npcname( strnpcinfo(0) ) + "::OnMove" );
- end;
- OnStop:
- 'circle_move = 0; // double check just because
- unitstopwalk getnpcid(0);
- end;
- }
- 1@advs,124,337,5 duplicate(#b_tr1) #b_tr2 MD_HIDDEN_GROUND02,2,2
- 1@advs,124,337,5 duplicate(#b_tr1) #b_tr3 MD_HIDDEN_GROUND02,2,2
- 1@advs,124,337,5 duplicate(#b_tr1) #b_tr4 MD_HIDDEN_GROUND02,2,2
- // stop the circles from moving
- 1@advs,108,358,4 script #b_sw1 4_ENERGY_YELLOW,2,2,{
- mes "Ddispel the circle ^ff0000requires your health and mana.^000000 During the process, you ^ff0000becomes immobile and defenseless.^000000 Are you sure you want to start dispelling?";
- next;
- if (select( "Cancel", "Proceed" ) == 1)
- end;
- if ('freyja_gid == 0)
- end;
- // this part need to be checked when more information are available
- .@success = callsub( S_Venom );
- mes "^0000ffThe magic stone that absorbed your stamina and magic resonates. The magic circle that has been wandering disappears.^000000";
- specialeffect EF_BASH3D6;
- if (.@success == true && 'circle_move == 1) {
- disablenpc();
- if ('advs_difficult == 1) {
- donpcevent instance_npcname("#b_tr1") + "::OnStop";
- donpcevent instance_npcname("#b_tr2") + "::OnStop";
- }
- donpcevent instance_npcname("#b_tr3") + "::OnStop";
- donpcevent instance_npcname("#b_tr4") + "::OnStop";
- initnpctimer;
- }
- close;
- S_Venom:
- .@percent_hp = max(1, (MaxHp/100)); // deal random damage to the player
- .@percent_sp = max(1, (MaxSp/100));
- .@r = rand(2,20);
- for ( .@i = 0; .@i < .@r; ++.@i ) {
- specialeffect2 EF_INVENOM;
- heal -.@percent_hp, -.@percent_sp;
- if (Hp < 1)
- return 0;
- sleep2 500;
- }
- return (Hp > 0);
- OnTimer10000: // seems to be around 10s to re-enable the circle, 20s the npc
- if ('freyja_gid == 0)
- end;
- if ('advs_difficult == 1) {
- donpcevent instance_npcname("#b_tr1") + "::OnStart";
- donpcevent instance_npcname("#b_tr2") + "::OnStart";
- }
- donpcevent instance_npcname("#b_tr3") + "::OnStart";
- donpcevent instance_npcname("#b_tr4") + "::OnStart";
- end;
- OnTimer20000:
- stopnpctimer;
- enablenpc();
- end;
- OnTouch: // effect ?
- end;
- }
- 1@advs,101,351,4 duplicate(#b_sw1) #b_sw2 4_ENERGY_YELLOW,2,2
- 1@advs,139,358,4 duplicate(#b_sw1) #b_sw3 4_ENERGY_YELLOW,2,2
- 1@advs,145,351,4 duplicate(#b_sw1) #b_sw4 4_ENERGY_YELLOW,2,2
- // exit
- 1@advs,123,358,4 script #box_admin 4_ENERGY_YELLOW,2,2,{
- .@is_hard = (instance_live_info(ILI_NAME) == "Villa of Deception Advanced");
- if (isbegin_quest(12520) == 1 && !.@is_hard || isbegin_quest(12521) == 1 && .@is_hard) {
- if (checkweight(1000405,10, 1000471,1) == 0) {
- mes "- Wait a minute !! -";
- mes "- Currently you're carrying -";
- mes "- too many items with you. -";
- mes "- Please try again -";
- mes "- after you loose some weight. -";
- close;
- }
- mes "^0000ffFound something in a bright glowing halo.^000000";
- if (get_reputation_points(3) >= 5000)
- .@bonus = 2;
- getitem 1000405,8+.@bonus; // Ep18_Amethyst_Fragment
- if (.@is_hard)
- erasequest 12521;
- else
- erasequest 12520;
- if (rand(100) < 10)
- getitem 1000471,1;
- close;
- }
- mes "^0000ffI think you can get out now.^000000";
- next;
- if (select( "Cancel", "Exit" ) == 1)
- end;
- warp "wolfvill",77,258;
- end;
- }
|