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.
960 lines
28 KiB
Plaintext
960 lines
28 KiB
Plaintext
//===== 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;
|
|
}
|
|
|