VillaofDeception.txt 27 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959
  1. //===== rAthena Script =======================================
  2. //= Instance Villa of Deception.
  3. //===== Description: =========================================
  4. //- [Walkthrough conversion]
  5. //- Require to complete the Episode 18 main quest.
  6. //- The function to drop an item with random option is defined in re/other/glocal_npc2.txt
  7. // Notes:
  8. // Some of the setting can be modified in 'Optional settings'.
  9. // The monster inside the hard mode are using relieve level 10 (-99% damages).
  10. // Change it if you think the player damage are too low, this level is a workaround but the damages
  11. // on the mobs are lower in hard mode than in normal on official. The level is 9 on official.
  12. //===== Changelogs: ==========================================
  13. //= 1.0 First version. [Capuche]
  14. //============================================================
  15. wolfvill,79,260,0 script #con_wp11 HIDDEN_WARP_NPC,4,4,{
  16. end;
  17. OnTouch:
  18. if (ep18_main < 57)
  19. end;
  20. cloakoffnpcself( "Aira#con" );
  21. end;
  22. }
  23. wolfvill,79,260,4 script(CLOAKED) Aira#con 4_M_BRZ_JACI,{
  24. if (ep18_main < 57)
  25. end;
  26. switch( checkquest(12522,PLAYTIME) ) {
  27. case -1:
  28. break;
  29. case 0:
  30. case 1:
  31. mes "[Aira]";
  32. mes "Please wait the end of the quest delay.";
  33. close;
  34. case 2:
  35. erasequest 12522;
  36. mes "^0000ff All the aftereffects of access are gone.^000000";
  37. close;
  38. }
  39. mes "[Aira]";
  40. mes "" + strcharinfo(0) + "Thanks to Mr. I arrived safely in the village.";
  41. mes "But it seems that something has been revived in the villa. I think I need to get help one more time.";
  42. next;
  43. .@md_name_normal$ = "Villa of Deception";
  44. .@md_name_hard$ = "Villa of Deception Advanced";
  45. if (is_party_leader() == true) {
  46. .@create_normal$ = "^000044Create " + .@md_name_normal$ + "^000000";
  47. if (countitem(1000471) > 0)
  48. .@create_hard$ = "^000044Create " + .@md_name_hard$ + "^000000";
  49. }
  50. switch( select( "Entry", .@create_normal$, .@create_hard$ ) ) {
  51. case 1:
  52. if (select( .@md_name_normal$, .@md_name_hard$ ) == 1) {
  53. if (BaseLevel < 170) {
  54. mes "[Aira]";
  55. mes "You must be at least BaseLevel 170 to enter.";
  56. close;
  57. }
  58. .@enter_to$ = .@md_name_normal$;
  59. }
  60. else {
  61. if (BaseLevel < 200) {
  62. mes "[Aira]";
  63. mes "You must be at least BaseLevel 200 to enter.";
  64. close;
  65. }
  66. .@enter_to$ = .@md_name_hard$;
  67. }
  68. switch( instance_enter(.@enter_to$) ) {
  69. case IE_OTHER:
  70. mes "^ff0000An unknown error occurred.^000000";
  71. close;
  72. case IE_NOINSTANCE:
  73. mes "^0000ff The dungeon has not been created or you are trying to enter a dungeon different from the party leader.^000000";
  74. close;
  75. case IE_NOMEMBER:
  76. mes "^ff0000Only a member of the party can enter the Memorial Dungeon.^000000";
  77. close;
  78. case IE_OK:
  79. mapannounce "wolfvill", "" + strcharinfo(0) + " of the party, " + getpartyname( getcharid(1) ) + ", is entering " + .@enter_to$ + ".",bc_map,"0x00ff99",FW_NORMAL,12;
  80. if (.@enter_to$ == .@md_name_normal$)
  81. setquest 12520;
  82. else
  83. setquest 12521;
  84. setquest 12522;
  85. // warp "1@advs",111,19;
  86. end;
  87. }
  88. end;
  89. case 2:
  90. if (BaseLevel < 170) {
  91. mes "[Aira]";
  92. mes "You must be at least BaseLevel 170 to create the instance.";
  93. close;
  94. }
  95. if (instance_create(.@md_name_normal$) < 0) {
  96. mes "Party: " + getpartyname(getcharid(1)) + "";
  97. mes "Leader: " + strcharinfo(0) + "";
  98. mes "^0000ff" + .@md_name_normal$ + " ^000000- Unknown error";
  99. close;
  100. }
  101. end;
  102. case 3:
  103. if (BaseLevel < 200) {
  104. mes "[Aira]";
  105. mes "You must be at least BaseLevel 200 to create the instance.";
  106. close;
  107. }
  108. if (countitem(1000471) < 1) {
  109. mes "[Aira]";
  110. mes "Where is the " + getitemname(1000471) + "?";
  111. close;
  112. }
  113. if (instance_create(.@md_name_hard$) < 0) {
  114. mes "Party: " + getpartyname(getcharid(1)) + "";
  115. mes "Leader: " + strcharinfo(0) + "";
  116. mes "^0000ff" + .@md_name_hard$ + " ^000000- Unknown error";
  117. close;
  118. }
  119. delitem 1000471,1;
  120. end;
  121. }
  122. end;
  123. }
  124. 1@advs,1,1,0 script advs_init -1,{
  125. end;
  126. OnInstanceInit:
  127. //--------------------------------------------
  128. // variables initialization
  129. //--------------------------------------------
  130. 'advs_step = 0;
  131. 'map_advs$ = instance_mapname("1@advs");
  132. // variables step 1
  133. 'sw_timer = 0;
  134. deletearray 'sw[0], 2;
  135. // variables step 3
  136. deletearray 'x_reaper[0], 'size_reaper;
  137. deletearray 'y_reaper[0], 'size_reaper;
  138. 'size_reaper = 0;
  139. //--------------------------------------------
  140. // Optional settings
  141. //--------------------------------------------
  142. // Number minimum of reaper spawn on step 3
  143. 'min_reaper = 3;
  144. // Setting according to the mode
  145. if (instance_live_info(ILI_NAME) == "Villa of Deception Advanced") {
  146. 'advs_difficult = 1;
  147. 'sanare_id = 21377; // EP18_MD_SANARE_L
  148. 'hunter_id = 21378; // EP18_MD_HEARTHUNTER_L
  149. 'monster_relieve = 10; // need check but the damages are very low compared to normal mode
  150. // Total of monster to kill in step 1, 2, 3
  151. 'total_monster_step_1 = 80;
  152. 'total_monster_step_2 = 70;
  153. 'total_monster_step_3 = 80;
  154. // Number of monster spawn at the start of step 1, 2, 3
  155. 'init_monster_step_1 = 40;
  156. 'init_monster_step_2 = 30;
  157. 'init_monster_step_3 = 40;
  158. 'schulang_id = 21360; // EP18_MD_SCHULANG_L
  159. 'freyja_id = 21361; // EP18_MD_DEMI_FREYJA_L
  160. // Don't touch this unless you know what you're doing
  161. .@interval = 5; // distance between each reaper
  162. .@max_reaper = 48; // number max of reaper spawn
  163. }
  164. else {
  165. 'advs_difficult = 0;
  166. 'sanare_id = 21318; // EP18_MD_SANARE_R
  167. 'hunter_id = 21319; // EP18_MD_HEARTHUNTER_R2
  168. 'monster_relieve = 9;
  169. // Total of monster to kill in step 1, 2, 3
  170. 'total_monster_step_1 = 35;
  171. 'total_monster_step_2 = 35;
  172. 'total_monster_step_3 = 35;
  173. // Number of monster spawn at the start of step 1, 2, 3
  174. 'init_monster_step_1 = 35;
  175. 'init_monster_step_2 = 25;
  176. 'init_monster_step_3 = 24;
  177. 'schulang_id = 21316; // EP18_MD_SCHULANG_R
  178. 'freyja_id = 21317; // EP18_MD_DEMI_FREYJA_R
  179. // Don't touch this unless you know what you're doing
  180. .@interval = 10;
  181. .@max_reaper = 16;
  182. }
  183. for ( .@i = 109; .@i <= 139; .@i += .@interval ) {
  184. for ( .@j = 219; .@j <= 249; .@j += .@interval ) {
  185. if (.@i == 124 && .@j == 234)
  186. continue;
  187. 'x_reaper[ 'size_reaper ] = .@i;
  188. 'y_reaper[ 'size_reaper ] = .@j;
  189. 'size_reaper++;
  190. }
  191. }
  192. 'total_reaper = min(.@max_reaper, 'size_reaper);
  193. // number total of food necessary to reduce the number of reaper to 'min_reaper
  194. 'max_food = ('total_reaper * 2) - ('min_reaper * 2);
  195. // debug
  196. 'total_monster_step_1 = max('init_monster_step_1, 'total_monster_step_1);
  197. 'total_monster_step_2 = max('init_monster_step_2, 'total_monster_step_2);
  198. 'total_monster_step_3 = max('init_monster_step_3, 'total_monster_step_3);
  199. //--------------------------------------------
  200. // npcs management
  201. //--------------------------------------------
  202. disablenpc instance_npcname("#boss2");
  203. disablenpc instance_npcname("#box_admin");
  204. // warps
  205. disablenpc instance_npcname("#wp1");
  206. disablenpc instance_npcname("#wp2");
  207. disablenpc instance_npcname("#wp3");
  208. disablenpc instance_npcname("#wp4");
  209. disablenpc instance_npcname("#food1");
  210. disablenpc instance_npcname("#food2");
  211. disablenpc instance_npcname("#food3");
  212. disablenpc instance_npcname("#food4");
  213. // circles step final
  214. disablenpc instance_npcname("#b_tr1");
  215. disablenpc instance_npcname("#b_tr2");
  216. disablenpc instance_npcname("#b_tr3");
  217. disablenpc instance_npcname("#b_tr4");
  218. // stop circles from moving
  219. disablenpc instance_npcname("#b_sw1");
  220. disablenpc instance_npcname("#b_sw2");
  221. disablenpc instance_npcname("#b_sw3");
  222. disablenpc instance_npcname("#b_sw4");
  223. disablenpc instance_npcname("#boss1");
  224. disablenpc instance_npcname("#boss2_sw");
  225. donpcevent instance_npcname("#advs_step_1") + "::OnStart";
  226. end;
  227. }
  228. // Entrance
  229. // (npc probably used to enable the npcs according to the instance mode - normal or hard)
  230. // 1@advs,111,19,0 duplicate(dummy_npc) #hidden_wp1 HIDDEN_WARP_NPC,2,2
  231. // 1@advs,134,19,0 duplicate(dummy_npc) #hidden_wp2 HIDDEN_WARP_NPC,2,2
  232. //---------------------------------------------------------------
  233. // Warps
  234. //---------------------------------------------------------------
  235. 1@advs,124,101,0 warp #wp1 2,2,1@advs,124,115
  236. 1@advs,124,205,0 script #wp2 WARPNPC,2,2,{
  237. end;
  238. OnTouch:
  239. .@r = rand(3);
  240. if (.@r == 0)
  241. warp 'map_advs$,101,235;
  242. else if (.@r == 1)
  243. warp 'map_advs$,155,233;
  244. else
  245. warp 'map_advs$,124,211;
  246. end;
  247. }
  248. 1@advs,124,266,0 warp #wp3 2,2,1@advs,124,277
  249. 1@advs,124,307,0 warp #wp4 2,2,1@advs,124,319
  250. // 1@advs,124,307,0 duplicate(dummy_npc) #wp4 WARPNPC,10,10
  251. //---------------------------------------------------------------
  252. // Step 1
  253. //---------------------------------------------------------------
  254. 1@advs,1,1,0 script #advs_step_1 -1,{
  255. end;
  256. OnStart:
  257. 'mob_to_respawn = 'total_monster_step_1 - 'init_monster_step_1;
  258. // The coordinates may be inaccurates (maybe not random on official)
  259. for ( .@i = 0; .@i < 'init_monster_step_1; ++.@i )
  260. callsub( S_Spawn );
  261. end;
  262. OnMobDead:
  263. if ('mob_to_respawn > 0)
  264. 'mob_to_respawn--;
  265. initnpctimer;
  266. sleep 2000;
  267. if ('advs_step == 0 && 'mob_to_respawn > 0) {
  268. if ('mob_to_respawn > 0)
  269. callsub( S_Spawn );
  270. if ('mob_to_respawn > 1)
  271. callsub( S_Spawn );
  272. }
  273. end;
  274. OnTimer2000:
  275. stopnpctimer;
  276. .@alive = mobcount('map_advs$, instance_npcname("#advs_step_1") + "::OnMobDead");
  277. mapannounce 'map_advs$, "Number of monsters left: " + .@alive, bc_map, 0xAAAAFF;
  278. end;
  279. S_Spawn:
  280. .@label$ = instance_npcname("#advs_step_1") + "::OnMobDead";
  281. if (rand(2))
  282. .@mob_id = 'hunter_id;
  283. else
  284. .@mob_id = 'sanare_id;
  285. .@r = rand(3);
  286. if (.@r == 0)
  287. areamonster 'map_advs$,63,89,72,182,"--en--",.@mob_id,1, .@label$;
  288. else if (.@r == 1)
  289. areamonster 'map_advs$,63,89,184,101,"--en--",.@mob_id,1, .@label$;
  290. else
  291. areamonster 'map_advs$,184,89,174,182,"--en--",.@mob_id,1, .@label$;
  292. unitskilluseid $@mobid[0], 771, 'monster_relieve; // NPC_RELIEVE_ON
  293. return;
  294. }
  295. 1@advs,67,182,5 script #sw_1 4_NFWISP,1,1,{
  296. if ('advs_step != 0)
  297. end;
  298. mes "[Unidentified grudge]";
  299. mes "Are you here to set me free?";
  300. next;
  301. if (select( "Stop", "Do it" ) == 1)
  302. end;
  303. if ('advs_step != 0)
  304. end;
  305. disablenpc instance_npcname("#sw_1");
  306. 'sw[0] = 1;
  307. donpcevent instance_npcname("#sw_timer") + "::OnStart";
  308. end;
  309. OnTouch_:
  310. end;
  311. }
  312. 1@advs,180,182,5 script #sw_2 4_NFWISP,1,1,{
  313. if ('advs_step != 0)
  314. end;
  315. mes "[Unidentified grudge]";
  316. mes "Are you here to set me free?";
  317. next;
  318. if (select( "Stop", "Do it" ) == 1)
  319. end;
  320. if ('advs_step != 0)
  321. end;
  322. disablenpc instance_npcname("#sw_2");
  323. 'sw[1] = 1;
  324. donpcevent instance_npcname("#sw_timer") + "::OnStart";
  325. end;
  326. OnTouch_:
  327. end;
  328. }
  329. 1@advs,1,1,5 script #sw_timer -1,{
  330. end;
  331. OnStart:
  332. if ('sw_timer == 1)
  333. end;
  334. 'sw_timer = 1;
  335. initnpctimer;
  336. end;
  337. OnTimer3000:
  338. stopnpctimer;
  339. if ('sw[0] != 1 || 'sw[1] != 1) {
  340. 'sw_timer = 0;
  341. if ('sw[0] == 1)
  342. enablenpc instance_npcname("#sw_1");
  343. if ('sw[1] == 1)
  344. enablenpc instance_npcname("#sw_2");
  345. 'sw[0] = 0;
  346. 'sw[1] = 0;
  347. npctalk "Ah... my half soul beyond this hallway is still unfulfilled...", instance_npcname("#sw_1");
  348. npctalk "Ah... my half soul beyond this hallway is still unfulfilled...", instance_npcname("#sw_2");
  349. mapannounce 'map_advs$, "You must free both souls on the left and right of the hallway at the same time.", bc_map, 0xAAAAFF;
  350. end;
  351. }
  352. if ('advs_step != 0)
  353. end;
  354. mapannounce 'map_advs$, "Two souls are simultaneously liberated, opening the door to the center.", bc_map, 0xAAAAFF;
  355. donpcevent instance_npcname("#advs_step_2") + "::OnStart";
  356. end;
  357. }
  358. 1@advs,75,89,5 script #trap_1 4_M_DEATH,1,1,{
  359. end;
  360. OnTouch:
  361. specialeffect2 EF_FIREHIT;
  362. specialeffect2 EF_ACIDDEMON;
  363. getmapxy( .@map$, .@x, .@y, BL_PC );
  364. getmapxy( .@map$, .@x_npc, .@y_npc, BL_NPC );
  365. if (.@x == .@x_npc) {
  366. if (.@y < 89)
  367. pushpc DIR_SOUTH, 1;
  368. else if (.@y > 99)
  369. pushpc DIR_NORTH, 1;
  370. else
  371. pushpc DIR_EAST, 1; // default
  372. }
  373. else if (.@x < .@x_npc)
  374. pushpc DIR_WEST, 1;
  375. else
  376. pushpc DIR_EAST, 1;
  377. heal -((MaxHp*50)/100),0; // note: heal command is used to (potentially) kill the target
  378. end;
  379. OnMove1:
  380. getmapxy( .@map$, .@x, .@y, BL_NPC );
  381. unitwalk( getnpcid(0),.@x,99, instance_npcname( strnpcinfo(0) ) + "::OnMove2" );
  382. end;
  383. OnMove2:
  384. getmapxy( .@map$, .@x, .@y, BL_NPC );
  385. unitwalk( getnpcid(0),.@x,89, instance_npcname( strnpcinfo(0) ) + "::OnMove1" );
  386. end;
  387. OnInstanceInit:
  388. npcspeed 150;
  389. sleep rand(100,3000);
  390. donpcevent instance_npcname( strnpcinfo(0) ) + "::OnMove1";
  391. end;
  392. }
  393. // traps left
  394. 1@advs,80,89,1 duplicate(#trap_1) #trap_2 4_M_DEATH,1,1
  395. 1@advs,85,89,1 duplicate(#trap_1) #trap_3 4_M_DEATH,1,1
  396. 1@advs,90,89,1 duplicate(#trap_1) #trap_4 4_M_DEATH,1,1
  397. 1@advs,95,89,1 duplicate(#trap_1) #trap_5 4_M_DEATH,1,1
  398. 1@advs,100,89,1 duplicate(#trap_1) #trap_6 4_M_DEATH,1,1
  399. 1@advs,105,89,1 duplicate(#trap_1) #trap_7 4_M_DEATH,1,1
  400. 1@advs,110,89,1 duplicate(#trap_1) #trap_8 4_M_DEATH,1,1
  401. 1@advs,115,89,1 duplicate(#trap_1) #trap_9 4_M_DEATH,1,1
  402. // traps right
  403. 1@advs,130,89,1 duplicate(#trap_1) #trap_10 4_M_DEATH,1,1
  404. 1@advs,135,89,1 duplicate(#trap_1) #trap_11 4_M_DEATH,1,1
  405. 1@advs,140,89,1 duplicate(#trap_1) #trap_12 4_M_DEATH,1,1
  406. 1@advs,145,89,1 duplicate(#trap_1) #trap_13 4_M_DEATH,1,1
  407. 1@advs,150,89,1 duplicate(#trap_1) #trap_14 4_M_DEATH,1,1
  408. 1@advs,155,89,1 duplicate(#trap_1) #trap_15 4_M_DEATH,1,1
  409. 1@advs,160,89,1 duplicate(#trap_1) #trap_16 4_M_DEATH,1,1
  410. 1@advs,165,89,1 duplicate(#trap_1) #trap_17 4_M_DEATH,1,1
  411. 1@advs,170,89,1 duplicate(#trap_1) #trap_18 4_M_DEATH,1,1
  412. //---------------------------------------------------------------
  413. // Step 2
  414. //---------------------------------------------------------------
  415. 1@advs,1,1,0 script #advs_step_2 -1,{
  416. end;
  417. OnStart:
  418. if ('advs_step != 0)
  419. end;
  420. 'advs_step = 1;
  421. disablenpc instance_npcname("#advs_step_1");
  422. enablenpc instance_npcname("#wp1");
  423. enablenpc instance_npcname("#food1");
  424. enablenpc instance_npcname("#food2");
  425. enablenpc instance_npcname("#food3");
  426. enablenpc instance_npcname("#food4");
  427. killmonster 'map_advs$, instance_npcname("#advs_step_1") + "::OnMobDead";
  428. 'mob_to_respawn = 'total_monster_step_2 - 'init_monster_step_2;
  429. for ( .@i = 0; .@i < 'init_monster_step_2; ++.@i )
  430. callsub( S_Spawn );
  431. end;
  432. OnMobDead:
  433. if ('mob_to_respawn > 0)
  434. 'mob_to_respawn--;
  435. initnpctimer;
  436. sleep 2000;
  437. if ('advs_step == 1 && 'mob_to_respawn > 0) {
  438. if ('mob_to_respawn > 0)
  439. callsub( S_Spawn );
  440. if ('mob_to_respawn > 1)
  441. callsub( S_Spawn );
  442. }
  443. end;
  444. OnTimer2000:
  445. stopnpctimer;
  446. .@alive = mobcount('map_advs$, instance_npcname("#advs_step_2") + "::OnMobDead");
  447. mapannounce 'map_advs$, "Number of monsters left: " + .@alive, bc_map, 0xAAAAFF;
  448. if ('advs_step == 1 && 'mob_to_respawn == 0 && .@alive == 0)
  449. donpcevent instance_npcname("#advs_step_3_A") + "::OnStart";
  450. end;
  451. S_Spawn:
  452. .@label$ = instance_npcname("#advs_step_2") + "::OnMobDead";
  453. if (rand(2))
  454. .@mob_id = 'hunter_id;
  455. else
  456. .@mob_id = 'sanare_id;
  457. .@r = rand(3);
  458. if (.@r == 0)
  459. areamonster 'map_advs$,76,145,171,139,"--en--",.@mob_id,1, .@label$;
  460. else if (.@r == 1)
  461. areamonster 'map_advs$,113,205,135,125,"--en--",.@mob_id,1, .@label$;
  462. else
  463. areamonster 'map_advs$,113,205,135,125,"--en--",.@mob_id,1, .@label$;
  464. unitskilluseid $@mobid[0], 771, 'monster_relieve; // NPC_RELIEVE_ON
  465. return;
  466. }
  467. 1@advs,101,159,5 script #food1 4_EP16_FOOD,1,1,{
  468. if ('max_food <= 0) {
  469. mapannounce 'map_advs$, "??? : You really don't know how to cook well, you deserve a casual tour of my garden.", bc_map, 0xAAAAFF;
  470. end;
  471. }
  472. progressbar "",4;
  473. 'max_food--;
  474. .@r = rand(5);
  475. if (.@r == 0)
  476. sc_start SC_CONFUSION,30000,0,100, SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF;
  477. else if (.@r == 1)
  478. sc_start SC_CURSE,30000,0,100, SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF;
  479. else if (.@r == 2)
  480. sc_start SC_BLIND,30000,0,100, SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF;
  481. else if (.@r == 3)
  482. sc_start SC_POISON,30000,0,100, SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF;
  483. else
  484. sc_start SC_SILENCE,30000,0,100, SCSTART_NOAVOID|SCSTART_NOTICKDEF|SCSTART_NORATEDEF;
  485. if ('total_reaper > 'min_reaper && ('max_food % 2) == 0)
  486. 'total_reaper--;
  487. end;
  488. }
  489. 1@advs,101,125,5 duplicate(#food1) #food2 4_EP16_FOOD,1,1
  490. 1@advs,147,162,5 duplicate(#food1) #food3 4_EP16_FOOD,1,1
  491. 1@advs,147,122,5 duplicate(#food1) #food4 4_EP16_FOOD,1,1
  492. //---------------------------------------------------------------
  493. // Step 3
  494. //---------------------------------------------------------------
  495. 1@advs,1,1,5 script #advs_step_3_A -1,{
  496. end;
  497. OnStart:
  498. if ('advs_step != 1)
  499. end;
  500. 'advs_step = 2;
  501. enablenpc instance_npcname("#wp2");
  502. disablenpc instance_npcname("#advs_step_2");
  503. donpcevent instance_npcname("#advs_step_3_A") + "::OnEvent";
  504. donpcevent instance_npcname("#advs_step_3_B") + "::OnEvent";
  505. end;
  506. OnEvent:
  507. .@label$ = instance_npcname("#advs_step_3_A") + "::OnMobDead";
  508. copyarray .@x[0], 'x_reaper[0], 'size_reaper;
  509. copyarray .@y[0], 'y_reaper[0], 'size_reaper;
  510. .@size = 'size_reaper;
  511. for ( .@i = 0; .@i < 'total_reaper; ++.@i ) {
  512. .@r = rand(.@size);
  513. monster 'map_advs$,.@x[.@r],.@y[.@r],"--en--",20846,1, .@label$; // MD_HIDDEN_GROUND01
  514. deletearray .@x[.@r],1;
  515. deletearray .@y[.@r],1;
  516. .@size--;
  517. }
  518. initnpctimer;
  519. end;
  520. OnTimer10000:
  521. killmonster 'map_advs$, instance_npcname("#advs_step_3_A") + "::OnMobDead";
  522. donpcevent instance_npcname("#advs_step_3_A") + "::OnEvent"; // this event never stop
  523. end;
  524. OnMobDead:
  525. end;
  526. }
  527. 1@advs,1,1,0 script #advs_step_3_B -1,{
  528. end;
  529. OnEvent:
  530. 'mob_to_respawn = 'total_monster_step_3 - 'init_monster_step_3;
  531. for ( .@i = 0; .@i < 'init_monster_step_3; ++.@i )
  532. callsub( S_Spawn );
  533. end;
  534. OnMobDead:
  535. if ('mob_to_respawn > 0)
  536. 'mob_to_respawn--;
  537. initnpctimer;
  538. sleep 2000;
  539. if ('advs_step == 2 && 'mob_to_respawn > 0) {
  540. if ('mob_to_respawn > 0)
  541. callsub( S_Spawn );
  542. if ('mob_to_respawn > 1)
  543. callsub( S_Spawn );
  544. }
  545. end;
  546. OnTimer2000:
  547. stopnpctimer;
  548. .@alive = mobcount('map_advs$, instance_npcname("#advs_step_3_B") + "::OnMobDead");
  549. mapannounce 'map_advs$, "Number of monsters left: " + .@alive, bc_map, 0xAAAAFF;
  550. if ('advs_step == 2 && 'mob_to_respawn == 0 && .@alive == 0)
  551. donpcevent instance_npcname("#boss1_advs") + "::OnStart";
  552. end;
  553. S_Spawn:
  554. .@label$ = instance_npcname("#advs_step_3_B") + "::OnMobDead";
  555. if (rand(2))
  556. .@mob_id = 'hunter_id;
  557. else
  558. .@mob_id = 'sanare_id;
  559. .@r = rand(4);
  560. if (.@r == 0)
  561. areamonster 'map_advs$,109,238,119,248,"--en--",.@mob_id,1, .@label$;
  562. else if (.@r == 1)
  563. areamonster 'map_advs$,109,219,119,229,"--en--",.@mob_id,1, .@label$;
  564. else if (.@r == 2)
  565. areamonster 'map_advs$,128,238,138,248,"--en--",.@mob_id,1, .@label$;
  566. else
  567. areamonster 'map_advs$,128,219,138,229,"--en--",.@mob_id,1, .@label$;
  568. unitskilluseid $@mobid[0], 771, 'monster_relieve; // NPC_RELIEVE_ON
  569. return;
  570. }
  571. //---------------------------------------------------------------
  572. // Step 4
  573. //---------------------------------------------------------------
  574. 1@advs,1,1,4 script #boss1_advs -1,{
  575. end;
  576. OnStart:
  577. if ('advs_step != 2)
  578. end;
  579. 'advs_step = 3;
  580. enablenpc instance_npcname("#wp3");
  581. disablenpc instance_npcname("#advs_step_3_B");
  582. enablenpc instance_npcname("#boss1");
  583. end;
  584. OnMobDead:
  585. if ('advs_step != 4)
  586. end;
  587. 'advs_step = 5;
  588. enablenpc instance_npcname("#wp4");
  589. enablenpc instance_npcname("#boss2_sw");
  590. donpcevent instance_npcname("#boss1_advs_skill_1") + "::OnStop";
  591. end;
  592. }
  593. // 1@advs,124,295,4 script #boss1 EP18_MD_SCHULANG_R,1,1,{
  594. 1@advs,124,295,4 script #boss1 EP18_MD_SCHULANG_R,{
  595. if ('advs_step != 3)
  596. end;
  597. if (is_party_leader() == false)
  598. end;
  599. 'advs_step = 4;
  600. npctalk "That's all human.";
  601. unitwalk getnpcid(0), 124,290, instance_npcname("#boss1") + "::OnMove";
  602. end;
  603. OnMove:
  604. disablenpc instance_npcname("#boss1");
  605. monster 'map_advs$,124,290,"--en--",'schulang_id,1, instance_npcname("#boss1_advs") + "::OnMobDead";
  606. 'schulang_gid = $@mobid[0];
  607. unitskilluseid $@mobid[0], 771, 1; // NPC_RELIEVE_ON
  608. unittalk 'schulang_gid, "I'm in a bit of trouble if I approach this more than that!!!";
  609. monster 'map_advs$,123,285,"--en--",21319,1; // EP18_MD_HEARTHUNTER_R2
  610. unitskilluseid $@mobid[0], 771, 'monster_relieve; // NPC_RELIEVE_ON
  611. donpcevent instance_npcname("#boss1_advs_skill_1") + "::OnStart";
  612. end;
  613. // OnTouch: // effect ?
  614. // end;
  615. }
  616. 1@advs,1,1,0 script #boss1_advs_skill_1 -1,{
  617. end;
  618. OnStart:
  619. initnpctimer;
  620. getunitdata 'schulang_gid, .@data;
  621. 'x_sch_event = .@data[UMOB_X];
  622. 'y_sch_event = .@data[UMOB_Y];
  623. 'ignore_column = rand(5); // one column is randomly free
  624. end;
  625. OnTimer1000:
  626. callsub( S_Skill,-8 );
  627. end;
  628. OnTimer1500:
  629. callsub( S_Skill,-4 );
  630. end;
  631. OnTimer2000:
  632. callsub( S_Skill,0 );
  633. end;
  634. OnTimer2500:
  635. callsub( S_Skill,4 );
  636. end;
  637. OnTimer3000:
  638. callsub( S_Skill,8 );
  639. stopnpctimer;
  640. donpcevent instance_npcname("#boss1_advs_skill_1") + "::OnStart";
  641. end;
  642. S_Skill:
  643. .@dxy = getarg(0);
  644. if ('ignore_column != 0)
  645. unitskillusepos 'schulang_gid,"MG_THUNDERSTORM",4, ('x_sch_event - 8), ('y_sch_event + .@dxy), -50;
  646. if ('ignore_column != 1)
  647. unitskillusepos 'schulang_gid,"MG_THUNDERSTORM",4, ('x_sch_event - 4), ('y_sch_event + .@dxy), -50;
  648. if ('ignore_column != 2)
  649. unitskillusepos 'schulang_gid,"MG_THUNDERSTORM",4, 'x_sch_event, ('y_sch_event + .@dxy), -50;
  650. if ('ignore_column != 3)
  651. unitskillusepos 'schulang_gid,"MG_THUNDERSTORM",4, ('x_sch_event + 4), ('y_sch_event + .@dxy), -50;
  652. if ('ignore_column != 4)
  653. unitskillusepos 'schulang_gid,"MG_THUNDERSTORM",4, ('x_sch_event + 8), ('y_sch_event + .@dxy), -50;
  654. return;
  655. OnStop:
  656. stopnpctimer;
  657. end;
  658. }
  659. //---------------------------------------------------------------
  660. // Step 5 (final)
  661. //---------------------------------------------------------------
  662. // 1@advs,124,358,4 script #boss2_sw CLEAR_NPC,1,1,{
  663. 1@advs,124,358,4 script #boss2_sw CLEAR_NPC,{
  664. if ('advs_step != 5)
  665. end;
  666. if (is_party_leader() == false)
  667. end;
  668. 'advs_step = 6;
  669. cloakonnpc instance_npcname("#boss2_sw"); // cloakonnpc to display effect
  670. specialeffect EF_CLOUD4;
  671. specialeffect EF_DQ9_CHARGE3;
  672. sleep 4000;
  673. specialeffect EF_SCREEN_QUAKE;
  674. setnpcdisplay( instance_npcname("#boss2"), 'freyja_id );
  675. enablenpc instance_npcname("#boss2");
  676. specialeffect EF_BEGINSPELL_YB;
  677. sleep 2000;
  678. npctalk "I... and... together... let's play...", instance_npcname("#boss2");
  679. unitwalk getnpcid(0, instance_npcname("#boss2")), 124,346, instance_npcname("#boss2_sw") + "::OnMove";
  680. end;
  681. OnMove:
  682. setnpcdisplay( instance_npcname("#boss2"), CLEAR_NPC );
  683. disablenpc instance_npcname("#boss2");
  684. monster 'map_advs$,124,346,"--en--",'freyja_id,1, instance_npcname("#boss2_sw") + "::OnMobDead";
  685. 'freyja_gid = $@mobid[0];
  686. donpcevent instance_npcname("#advs_boss_relieve") + "::OnStart";
  687. sleep 3000;
  688. mapannounce 'map_advs$, "Tip: Twisted God Freyja is weaken as it get closer to the chandelier.", bc_map, 0xFFCC;
  689. if ('advs_difficult == 1)
  690. sleep 8000;
  691. else
  692. sleep 30000;
  693. // circles
  694. if ('advs_difficult == 1) {
  695. donpcevent instance_npcname("#b_tr1") + "::OnEnable";
  696. donpcevent instance_npcname("#b_tr2") + "::OnEnable";
  697. }
  698. donpcevent instance_npcname("#b_tr3") + "::OnEnable";
  699. donpcevent instance_npcname("#b_tr4") + "::OnEnable";
  700. // stop the circles from moving
  701. enablenpc instance_npcname("#b_sw1");
  702. enablenpc instance_npcname("#b_sw2");
  703. enablenpc instance_npcname("#b_sw3");
  704. enablenpc instance_npcname("#b_sw4");
  705. end;
  706. OnMobDead:
  707. 'freyja_gid = 0;
  708. donpcevent instance_npcname("#advs_boss_relieve") + "::OnStop";
  709. disablenpc instance_npcname("#boss2_sw");
  710. enablenpc instance_npcname("#box_admin");
  711. if ('advs_difficult == 1) {
  712. donpcevent instance_npcname("#b_tr1") + "::OnStop";
  713. donpcevent instance_npcname("#b_tr2") + "::OnStop";
  714. }
  715. donpcevent instance_npcname("#b_tr3") + "::OnStop";
  716. donpcevent instance_npcname("#b_tr4") + "::OnStop";
  717. end;
  718. // OnTouch: // effect ?
  719. // end;
  720. }
  721. 1@advs,124,356,4 duplicate(dummy_npc) #boss2 CLEAR_NPC,1,1
  722. 1@advs,1,1,4 script #advs_boss_relieve -1,{
  723. end;
  724. OnStart:
  725. if (unitexists('freyja_gid) == false)
  726. end;
  727. getunitdata 'freyja_gid, .@data;
  728. .@d = distance(124,356,.@data[UMOB_X],.@data[UMOB_Y]);
  729. .@lv = (.@d / 2) + 1; // level 6 on spawn
  730. .@lv = min(10,.@lv);
  731. .@lv = max(1,.@lv);
  732. unitskilluseid 'freyja_gid, 772, 1; // NPC_RELIEVE_OFF
  733. unitskilluseid 'freyja_gid, 771, .@lv; // NPC_RELIEVE_ON
  734. initnpctimer;
  735. end;
  736. OnTimer2000:
  737. donpcevent instance_npcname("#advs_boss_relieve") + "::OnStart";
  738. end;
  739. OnStop:
  740. stopnpctimer;
  741. end;
  742. }
  743. // circles
  744. 1@advs,124,337,5 script #b_tr1 MD_HIDDEN_GROUND02,2,2,{
  745. end;
  746. OnTouch: // note: warp dead player
  747. if ('freyja_gid == 0)
  748. end;
  749. specialeffect2 EF_FIREHIT;
  750. specialeffect2 EF_ACIDDEMON;
  751. percentheal -10,0; // deal some damage
  752. if (rand(2))
  753. warp 'map_advs$,67,182;
  754. else
  755. warp 'map_advs$,180,182;
  756. end;
  757. OnEnable:
  758. enablenpc instance_npcname( strnpcinfo(0) );
  759. OnStart:
  760. 'circle_move = 1;
  761. OnMove:
  762. if ('freyja_gid == 0)
  763. end;
  764. if ('circle_move == 0)
  765. end;
  766. getmapxy( .@map$, .@x, .@y, BL_NPC );
  767. do {
  768. .@dx = rand(-2,2);
  769. .@dy = rand(-2,2);
  770. .@new_x = .@x + .@dx;
  771. .@new_y = .@y + .@dy;
  772. }
  773. while ((.@dx == 0 && .@dy == 0) || .@new_x < 108 || .@new_x > 139 || .@new_y < 325 || .@new_y > 351);
  774. unitwalk( getnpcid(0),.@new_x,.@new_y, instance_npcname( strnpcinfo(0) ) + "::OnMove" );
  775. end;
  776. OnStop:
  777. 'circle_move = 0; // double check just because
  778. unitstopwalk getnpcid(0);
  779. end;
  780. }
  781. 1@advs,124,337,5 duplicate(#b_tr1) #b_tr2 MD_HIDDEN_GROUND02,2,2
  782. 1@advs,124,337,5 duplicate(#b_tr1) #b_tr3 MD_HIDDEN_GROUND02,2,2
  783. 1@advs,124,337,5 duplicate(#b_tr1) #b_tr4 MD_HIDDEN_GROUND02,2,2
  784. // stop the circles from moving
  785. 1@advs,108,358,4 script #b_sw1 4_ENERGY_YELLOW,2,2,{
  786. 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?";
  787. next;
  788. if (select( "Cancel", "Proceed" ) == 1)
  789. end;
  790. if ('freyja_gid == 0)
  791. end;
  792. // this part need to be checked when more information are available
  793. .@success = callsub( S_Venom );
  794. mes "^0000ffThe magic stone that absorbed your stamina and magic resonates. The magic circle that has been wandering disappears.^000000";
  795. specialeffect EF_BASH3D6;
  796. if (.@success == true && 'circle_move == 1) {
  797. disablenpc();
  798. if ('advs_difficult == 1) {
  799. donpcevent instance_npcname("#b_tr1") + "::OnStop";
  800. donpcevent instance_npcname("#b_tr2") + "::OnStop";
  801. }
  802. donpcevent instance_npcname("#b_tr3") + "::OnStop";
  803. donpcevent instance_npcname("#b_tr4") + "::OnStop";
  804. initnpctimer;
  805. }
  806. close;
  807. S_Venom:
  808. .@percent_hp = max(1, (MaxHp/100)); // deal random damage to the player
  809. .@percent_sp = max(1, (MaxSp/100));
  810. .@r = rand(2,20);
  811. for ( .@i = 0; .@i < .@r; ++.@i ) {
  812. specialeffect2 EF_INVENOM;
  813. heal -.@percent_hp, -.@percent_sp;
  814. if (Hp < 1)
  815. return 0;
  816. sleep2 500;
  817. }
  818. return (Hp > 0);
  819. OnTimer10000: // seems to be around 10s to re-enable the circle, 20s the npc
  820. if ('freyja_gid == 0)
  821. end;
  822. if ('advs_difficult == 1) {
  823. donpcevent instance_npcname("#b_tr1") + "::OnStart";
  824. donpcevent instance_npcname("#b_tr2") + "::OnStart";
  825. }
  826. donpcevent instance_npcname("#b_tr3") + "::OnStart";
  827. donpcevent instance_npcname("#b_tr4") + "::OnStart";
  828. end;
  829. OnTimer20000:
  830. stopnpctimer;
  831. enablenpc();
  832. end;
  833. OnTouch: // effect ?
  834. end;
  835. }
  836. 1@advs,101,351,4 duplicate(#b_sw1) #b_sw2 4_ENERGY_YELLOW,2,2
  837. 1@advs,139,358,4 duplicate(#b_sw1) #b_sw3 4_ENERGY_YELLOW,2,2
  838. 1@advs,145,351,4 duplicate(#b_sw1) #b_sw4 4_ENERGY_YELLOW,2,2
  839. // exit
  840. 1@advs,123,358,4 script #box_admin 4_ENERGY_YELLOW,2,2,{
  841. .@is_hard = (instance_live_info(ILI_NAME) == "Villa of Deception Advanced");
  842. if (isbegin_quest(12520) == 1 && !.@is_hard || isbegin_quest(12521) == 1 && .@is_hard) {
  843. if (checkweight(1000405,10, 1000471,1) == 0) {
  844. mes "- Wait a minute !! -";
  845. mes "- Currently you're carrying -";
  846. mes "- too many items with you. -";
  847. mes "- Please try again -";
  848. mes "- after you loose some weight. -";
  849. close;
  850. }
  851. mes "^0000ffFound something in a bright glowing halo.^000000";
  852. if (get_reputation_points(3) >= 5000)
  853. .@bonus = 2;
  854. getitem 1000405,8+.@bonus; // Ep18_Amethyst_Fragment
  855. if (.@is_hard)
  856. erasequest 12521;
  857. else
  858. erasequest 12520;
  859. if (rand(100) < 10)
  860. getitem 1000471,1;
  861. close;
  862. }
  863. mes "^0000ffI think you can get out now.^000000";
  864. next;
  865. if (select( "Cancel", "Exit" ) == 1)
  866. end;
  867. warp "wolfvill",77,258;
  868. end;
  869. }