diff options
author | Trojal <trojal@gmail.com> | 2013-01-10 20:09:39 -0800 |
---|---|---|
committer | Trojal <trojal@gmail.com> | 2013-01-10 20:32:02 -0800 |
commit | 83e7a4954437c13aec639b0b512252cc20a8f36c (patch) | |
tree | b7f6d11b2058248d026f2d9944e8f4b6ac288d50 /npc/custom | |
parent | 51bfeb38eb139e97e0e1c096c85c15fba234f35b (diff) | |
parent | 38e583df21eccd9e4f31d38acaae32579c6f0d27 (diff) | |
download | hercules-83e7a4954437c13aec639b0b512252cc20a8f36c.tar.gz hercules-83e7a4954437c13aec639b0b512252cc20a8f36c.tar.bz2 hercules-83e7a4954437c13aec639b0b512252cc20a8f36c.tar.xz hercules-83e7a4954437c13aec639b0b512252cc20a8f36c.zip |
Merge rathena repository to form Hercules initial commit.
Diffstat (limited to 'npc/custom')
64 files changed, 19160 insertions, 0 deletions
diff --git a/npc/custom/battleground/bg_common.txt b/npc/custom/battleground/bg_common.txt new file mode 100644 index 000000000..49e48c293 --- /dev/null +++ b/npc/custom/battleground/bg_common.txt @@ -0,0 +1,1328 @@ +// ============================================================================== +// BattleGround System - Common NPCs +// ============================================================================== + +// BattleGround Warper - Entrance +// ********************************************************************* + +- script Maroll Battle Recruiter::BatRecruit 728,{ + mes "[Maroll Battle Recruiter]"; + mes "Good day, adventurer."; + mes "I'm a knight from a far country called Maroll Kingdom."; + next; + mes "[Maroll Battle Recruiter]"; + mes "The two princes of the kingdom are now battling for the throne of Maroll, and are in need of experienced soldiers like you. How would you like to lend your power to one of the princes in the Maroll Kingdom?"; + next; + if( select("Join:Don't Join") == 2 ) + { + mes "[Maroll Battle Recruiter]"; + mes "I'll always be stationed here for more soldiers. Feel free to come back whenever you're interested."; + close; + } + mes "[Maroll Battle Recruiter]"; + mes "May the war god bless you."; + close2; + warp "bat_room",155,150; + end; +} + +payon,189,104,3 duplicate(BatRecruit) Maroll Battle Recruiter::BatRecruit1 728 +prontera,123,83,5 duplicate(BatRecruit) Maroll Battle Recruiter::BatRecruit2 728 +rachel,149,138,5 duplicate(BatRecruit) Maroll Battle Recruiter::BatRecruit3 728 +moc_ruins,75,162,5 duplicate(BatRecruit) Maroll Battle Recruiter::BatRecruit4 728 +aldebaran,146,109,5 duplicate(BatRecruit) Maroll Battle Recruiter::BatRecruit5 728 +lighthalzen,153,86,5 duplicate(BatRecruit) Maroll Battle Recruiter::BatRecruit6 728 + +// BattleGround Warper - Exit +// ********************************************************************* + +bat_room,148,150,4 script Teleporter#bat 124,{ + mes "[Teleporter]"; + mes "Do you wish to leave the battlefield? Use my service to return to town."; + next; + if( select("Leave:Don't Leave") == 2 ) + { + mes "[Teleporter]"; + mes "I'll be here whenever you're in need of my service."; + close; + } + + set .@spoint$, getsavepoint(0); + set .@x, getsavepoint(1); + set .@y, getsavepoint(2); + mes "[Teleporter]"; + mes "You will be sent back to " + .@spoint$ + "."; + close2; + warp .@spoint$, .@x, .@y; + end; +} + +// Kafra +// ********************************************************************* +bat_room,148,147,4 script Kafra Staff::kaf_bat 861,{ + cutin "kafra_09",2; + callfunc "F_Kafra",0,2,1,150,0; +} + +// General Guillaume +// ********************************************************************* +bat_room,160,159,3 script General Guillaume 420,{ + cutin "bat_kiyom2",2; + mes "[General Guillaume]"; + mes "Hot-blooded adventurer, we need your ability to win this battle."; + next; + cutin "bat_kiyom1",2; + mes "[General Guillaume]"; + mes "Our great king, Marcel Marollo VII, is very sick lately. His Majesty has declared that he chosen either me or Prince Croix as the next king amongst his 9 sons."; + next; + mes "[General Guillaume]"; + mes "Two kings can't share a nation!"; + mes "Only the one victorious from His Majesty's appointed battle will be enthroned."; + next; + mes "[General Guillaume]"; + mes "This is however, not just a battle between us. This battle will determine the future of this country. I pledge on my honor to prove that I'm the one who can protect this Maroll from outside threats."; + next; + if( select("Yes, I want to join you.:End Conversation") == 2 ) + { + mes "[General Guillaume]"; + mes "I'll be the one who will capture the flag!"; + close2; + cutin "",255; + end; + } + cutin "bat_kiyom2",2; + mes "[General Guillaume]"; + mes "Welcome to my army, comrade."; + mes "Your eyes tell me that you're a soldier that I can trust."; + set Bat_Team,1; + next; + mes "[General Guillaume]"; + mes "Now, go upstairs and apply for battle with your comrades. I'm sure they'll welcome you whole-heartedly!"; + close2; + cutin "",255; + end; +} + +// General Croix +// ********************************************************************* +bat_room,160,140,3 script Prince Croix 416,{ + cutin "bat_crua1",2; + mes "[Prince Croix]"; + mes "Wise adventurer, why don't you lend us your power for victory?"; + next; + cutin "bat_crua2",2; + mes "[Prince Croix]"; + mes "I do not wish to shed blood, but I have no choice but to fight for the possibility of peace and for the sake of my people."; + next; + mes "[Prince Croix]"; + mes "General Guillaume may have an advantage in this battle as he is the great general of Maroll, but that doesn't automatically mean he'll win. I want to win this battle so that I can grant a better future for my people."; + next; + if( select("Yes, I want to join you!:End Conversation") == 2 ) + { + mes "[Prince Croix]"; + mes "For Maroll!"; + close2; + cutin "",255; + end; + } + mes "[Prince Croix]"; + mes "Thank you so much. I feel like I can win with the help of adventurers like you. Now, please go downstairs and join your comrades in sharpening their skills to fight the enemy!"; + set Bat_Team,2; + close2; + cutin "",255; + end; +} + +// Time calculation Function +// ********************************************************************* +function script Time2Str { + set .@Time_Left, getarg(0) - gettimetick(2); + + set .@Days, .@Time_Left / 86400; + set .@Time_Left, .@Time_Left - (.@Days * 86400); + set .@Hours, .@Time_Left / 3600; + set .@Time_Left, .@Time_Left - (.@Hours * 3600); + set .@Minutes, .@Time_Left / 60; + set .@Time_Left, .@Time_Left - (.@Minutes * 60); + + set .@Time$, ""; + if( .@Days > 1 ) + set .@Time$, .@Time$ + .@Days + " days, "; + else if( .@Days > 0 ) + set .@Time$, .@Time$ + .@Days + " day, "; + + if( .@Hours > 1 ) + set .@Time$, .@Time$ + .@Hours + " hours, "; + else if( .@Hours > 0 ) + set .@Time$, .@Time$ + .@Hours + " hour, "; + + if( .@Minutes > 1 ) + set .@Time$, .@Time$ + .@Minutes + " minutes, "; + else if( .@Minutes > 0 ) + set .@Time$, .@Time$ + .@Minutes + " minute, "; + + if( .@Time_Left > 1 || .@Time_Left == 0 ) + set .@Time$, .@Time$ + .@Time_Left + " seconds."; + else if( .@Time_Left == 1 ) + set .@Time$, .@Time$ + .@Time_Left + " second."; + + return .@Time$; +} + +// Guillaume Knight - Tierra Valley +// ********************************************************************* +bat_room,159,178,5 script Guillaume Knight#1 417,{ + mes "[Guillaume Knight]"; + mes "Tierra Gorge is a very steep canyon with two forts residing in the north and south ends of the map."; + next; + mes "[Guillaume Knight]"; + mes "There is a ration depot for the Guillaume and Croix armies at the 11 and 8 o'clock directions."; + next; + mes "[Guillaume Knight]"; + mes "The battle starts at your army's ship, and the goal is to advance and destroy your enemy's rations depot faster than they can destroy yours."; + mes ""; + mes "The army that captures the neutral flag in the center of the battlefield will be rewarded with extra regeneration points, meaning their soldiers will resurrect more than the other side, giving them an advantage."; + next; + mes "[Guillaume Knight]"; + mes "Are you ready for battle? Then apply with the recruiter next to me!"; + close; +} + +// Tierra Officer - Guillaume +// ********************************************************************* +bat_room,156,178,5 script Tierra Valley Officer#1 418,{ + mes "[Tierra Officer]"; + if( Bat_Team == 2 ) + { + mes "Get out of here you stinky Croix!"; + close; + } + + if( Bat_Team == 0 ) + { + mes "Please sign up for an army with Prince Croix or General Guillaume!"; + close; + } + + mes "Hello " + strcharinfo(0) + ", let's show the power of the Guillaume Army to those stinky Croixs!"; + next; + if( select("I want to join your army!:End Conversation") == 2 ) + close; + + mes "[Tierra Officer]"; + if( BG_Delay_Tick >= gettimetick(2) ) + { + mes "You are a Deserter!!"; + mes "Because of running away, you need to wait ^0000FF" + callfunc("Time2Str",BG_Delay_Tick) + "^000000 to join again a BattleGround."; + close; + } + + if( checkquest(2069,PLAYTIME) == 2 ) erasequest 2069; + if( checkquest(2069,PLAYTIME) != -1 ) + { + mes "You have received an indicator showing that you've participated in the Battle at Tierra Gorge. I can't let you participate in any other battles until the indicator goes off."; + next; + mes "[Tierra Officer]"; + mes "Stand-by for Tierra Gorge Battle until the time limit passes."; + close; + } + + if( BaseLevel < 80 ) + { + mes "I'm very please you want to join our army, but I'm sorry: I can't send a rookie like you to die on the cruel battlefield"; + close; + } + + mes "Good luck!"; + close2; + warp "bat_room",85,224; + end; +} + +// Croix Knight - Tierra Valley +// ********************************************************************* +bat_room,159,121,1 script Croix Knight#1 413,{ + mes "[Croix Knight]"; + mes "Tierra Gorge is a very steep canyon with two forts residing in the north and south ends of the map."; + next; + mes "[Croix Knight]"; + mes "There is a ration depot for the Guillaume and Croix armies at the 11 and 8 o'clock directions."; + next; + mes "[Croix Knight]"; + mes "The battle starts at your army's ship, and the goal is to advance and destroy your enemy's rations depot faster than they can destroy yours."; + mes ""; + mes "The army that captures the neutral flag in the center of the battlefield will be rewarded with extra regeneration points, meaning their soldiers will resurrect more than the other side, giving them an advantage."; + next; + mes "[Croix Knight]"; + mes "Are you ready for battle? Then apply with the recruiter next to me!"; + close; +} + +// Tierra Officer - Croix +// ********************************************************************* +bat_room,156,121,1 script Tierra Valley Officer#2 414,{ + mes "[Tierra Officer]"; + if( Bat_Team == 1 ) + { + mes "Get out of here you stupid Guillaume!"; + close; + } + + if( Bat_Team == 0 ) + { + mes "Please sign up for an army with Prince Croix or General Guillaume!"; + close; + } + + mes "Hello " + strcharinfo(0) + ", let's show the power of the Croix Army to those stinky Guillaumes!"; + next; + if( select("I want to join your army!:End Conversation") == 2 ) + close; + + mes "[Tierra Officer]"; + if( BG_Delay_Tick >= gettimetick(2) ) + { + mes "You are a Deserter!!"; + mes "Because of running away, you need to wait ^0000FF" + callfunc("Time2Str",BG_Delay_Tick) + "^000000 to join again a BattleGround."; + close; + } + + if( checkquest(2069,PLAYTIME) == 2 ) erasequest 2069; + if( checkquest(2069,PLAYTIME) != -1 ) + { + mes "You have received an indicator showing that you've participated in the Battle at Tierra Gorge. I can't let you participate in any other battles until the indicator goes off."; + next; + mes "[Tierra Officer]"; + mes "Stand-by for Tierra Gorge Battle until the time limit passes."; + close; + } + + if( BaseLevel < 80 ) + { + mes "I'm very please you want to join our army, but I'm sorry: I can't send a rookie like you to die on the cruel battlefield"; + close; + } + + mes "Good luck!"; + close2; + warp "bat_room",85,208; + end; +} + +// Guillaume Knight - Tierra +// ********************************************************************* +bat_room,167,178,5 script Guillaume Knight#2 417,{ + mes "[Guillaume Knight]"; + mes "Tierra Gorge is a very steep canyon with two forts residing in the north and south ends of the map."; + next; + mes "[Guillaume Knight]"; + mes "There is a ration depot for the Guillaume and Croix armies at the 11 and 8 o'clock directions."; + next; + mes "[Guillaume Knight]"; + mes "The battle starts at your army's ship, and the goal is to advance and destroy your enemy's rations depot faster than they can destroy yours."; + mes ""; + mes "The army that captures the neutral flag in the center of the battlefield will be rewarded with extra regeneration points, meaning their soldiers will resurrect more than the other side, giving them an advantage."; + next; + mes "[Guillaume Knight]"; + mes "Are you ready for battle? Then apply with the recruiter next to me!"; + close; +} + +// Tierra Officer - Guillaume +// ********************************************************************* +bat_room,164,178,5 script Tierra Valley Officer#3 418,{ + mes "[Tierra Officer]"; + if( Bat_Team == 2 ) + { + mes "Get out of here you stinky Croix!"; + close; + } + + if( Bat_Team == 0 ) + { + mes "Please sign up for an army with Prince Croix or General Guillaume!"; + close; + } + + mes "Hello " + strcharinfo(0) + ", let's show the power of the Guillaume Army to those stinky Croixs!"; + next; + if( select("I want to join your army!:End Conversation") == 2 ) + close; + + mes "[Tierra Officer]"; + if( BG_Delay_Tick >= gettimetick(2) ) + { + mes "You are a Deserter!!"; + mes "Because of running away, you need to wait ^0000FF" + callfunc("Time2Str",BG_Delay_Tick) + "^000000 to join again a BattleGround."; + close; + } + + if( checkquest(2069,PLAYTIME) == 2 ) erasequest 2069; + if( checkquest(2069,PLAYTIME) != -1 ) + { + mes "You have received an indicator showing that you've participated in the Battle at Tierra Gorge. I can't let you participate in any other battles until the indicator goes off."; + next; + mes "[Tierra Officer]"; + mes "Stand-by for Tierra Gorge Battle until the time limit passes."; + close; + } + + if( BaseLevel < 80 ) + { + mes "I'm very please you want to join our army, but I'm sorry: I can't send a rookie like you to die on the cruel battlefield"; + close; + } + + mes "Good luck!"; + close2; + warp "bat_room",57,94; + end; +} + +// Croix Knight - Tierra +// ********************************************************************* +bat_room,167,121,1 script Croix Knight#2 413,{ + mes "[Croix Knight]"; + mes "Tierra Gorge is a very steep canyon with two forts residing in the north and south ends of the map."; + next; + mes "[Croix Knight]"; + mes "There is a ration depot for the Guillaume and Croix armies at the 11 and 8 o'clock directions."; + next; + mes "[Croix Knight]"; + mes "The battle starts at your army's ship, and the goal is to advance and destroy your enemy's rations depot faster than they can destroy yours."; + mes ""; + mes "The army that captures the neutral flag in the center of the battlefield will be rewarded with extra regeneration points, meaning their soldiers will resurrect more than the other side, giving them an advantage."; + next; + mes "[Croix Knight]"; + mes "Are you ready for battle? Then apply with the recruiter next to me!"; + close; +} + +// Tierra Officer - Croix +// ********************************************************************* +bat_room,164,121,1 script Tierra Valley Officer#4 414,{ + mes "[Tierra Officer]"; + if( Bat_Team == 1 ) + { + mes "Get out of here you stupid Guillaume!"; + close; + } + + if( Bat_Team == 0 ) + { + mes "Please sign up for an army with Prince Croix or General Guillaume!"; + close; + } + + mes "Hello " + strcharinfo(0) + ", let's show the power of the Croix Army to those stinky Guillaumes!"; + next; + if( select("I want to join your army!:End Conversation") == 2 ) + close; + + mes "[Tierra Officer]"; + if( BG_Delay_Tick >= gettimetick(2) ) + { + mes "You are a Deserter!!"; + mes "Because of running away, you need to wait ^0000FF" + callfunc("Time2Str",BG_Delay_Tick) + "^000000 to join again a BattleGround."; + close; + } + + if( checkquest(2069,PLAYTIME) == 2 ) erasequest 2069; + if( checkquest(2069,PLAYTIME) != -1 ) + { + mes "You have received an indicator showing that you've participated in the Battle at Tierra Gorge. I can't let you participate in any other battles until the indicator goes off."; + next; + mes "[Tierra Officer]"; + mes "Stand-by for Tierra Gorge Battle until the time limit passes."; + close; + } + + if( BaseLevel < 80 ) + { + mes "I'm very please you want to join our army, but I'm sorry: I can't send a rookie like you to die on the cruel battlefield"; + close; + } + + mes "Good luck!"; + close2; + warp "bat_room",57,77; + end; +} + +// Guillaune Knight - Flavius +// ********************************************************************* +bat_room,175,178,5 script Guillaume Knight#3 417,{ + mes "[Guillaume Knight]"; + mes "The objective of the Flavius Battle is to score 2 points before your enemy by destroying their crystal."; + next; + mes "[Guillaume Knight]"; + mes "The crystals for both armies are protected by special barricades that cannot be destroyed by direct attacks."; + next; + mes "[Guillaume Knight]"; + mes "But they can be removed by destroying the Guardians that protect the enemy army base."; + next; + mes "[Guillaume Knight]"; + mes "The crystals are immune to every type of skill; your physical attacks are the only choice for destroying your enemy's crystal."; + next; + mes "[Guillaume Knight]"; + mes "Are you ready for battle? Then apply with the recruiter next to me!"; + close; +} + +// Flavius Officer - Guillaume +// ********************************************************************* +bat_room,172,178,5 script Flavius Officer#1 418,{ + mes "[Flavius Officer]"; + if( Bat_Team == 2 ) + { + mes "Get out of here you stupid Croix!"; + close; + } + + if( Bat_Team == 0 ) + { + mes "Please sign up for an army with Prince Croix or General Guillaume!"; + close; + } + + mes "Hello " + strcharinfo(0) + ", let's show the power of the Guillaume Army to those stinky Croixs!"; + next; + if( select("I want to join your army!:End Conversation") == 2 ) + close; + + mes "[Flavius Officer]"; + if( BG_Delay_Tick >= gettimetick(2) ) + { + mes "You are a Deserter!!"; + mes "Because of running away, you need to wait ^0000FF" + callfunc("Time2Str",BG_Delay_Tick) + "^000000 to join again a BattleGround."; + close; + } + + if( checkquest(2070,PLAYTIME) == 2 ) erasequest 2070; + if( checkquest(2070,PLAYTIME) != -1 ) + { + mes "You have received an indicator showing that you've participated in the Battle at Flavius. I can't let you participate in any other battles until the indicator goes off."; + next; + mes "[Flavius Officer]"; + mes "Stand-by for Flavius Battle until the time limit passes."; + close; + } + + if( BaseLevel < 80 ) + { + mes "I'm very please you want to join our army, but I'm sorry: I can't send a rookie like you to die on the cruel battlefield"; + close; + } + + mes "Good luck!"; + close2; + warp "bat_room",85,94; + end; +} + +// Croix Knight - Flavius +// ********************************************************************* +bat_room,175,121,1 script Croix Knight#3 413,{ + mes "[Croix Knight]"; + mes "The objective of the Flavius Battle is to score 2 points before your enemy by destroying their crystal."; + next; + mes "[Croix Knight]"; + mes "The crystals for both armies are protected by special barricades that cannot be destroyed by direct attacks."; + next; + mes "[Croix Knight]"; + mes "But they can be removed by destroying the Guardians that protect the enemy army base."; + next; + mes "[Croix Knight]"; + mes "The crystals are immune to every type of skill; your physical attacks are the only choice for destroying your enemy's crystal."; + next; + mes "[Croix Knight]"; + mes "Are you ready for battle? Then apply with the recruiter next to me!"; + close; +} + +// Flavius Officerer - Croix +// ********************************************************************* +bat_room,172,121,1 script Flavius Officer#2 414,{ + mes "[Flavius Officer]"; + if( Bat_Team == 1 ) + { + mes "Get out of here you stupid Guillaume!"; + close; + } + + if( Bat_Team == 0 ) + { + mes "Please sign up for an army with Prince Croix or General Guillaume!"; + close; + } + + mes "Hello " + strcharinfo(0) + ", let's show the power of the Croix Army to those stinky Guillaumes!"; + next; + if( select("I want to join your army!:End Conversation") == 2 ) + close; + + mes "[Flavius Officer]"; + if( BG_Delay_Tick >= gettimetick(2) ) + { + mes "You are a Deserter!!"; + mes "Because of running away, you need to wait ^0000FF" + callfunc("Time2Str",BG_Delay_Tick) + "^000000 to join again a BattleGround."; + close; + } + + if( checkquest(2070,PLAYTIME) == 2 ) erasequest 2070; + if( checkquest(2070,PLAYTIME) != -1 ) + { + mes "You have received an indicator showing that you've participated in the Battle at Flavius. I can't let you participate in any other battles until the indicator goes off."; + next; + mes "[Flavius Officer]"; + mes "Stand-by for Flavius Battle until the time limit passes."; + close; + } + + if( BaseLevel < 80 ) + { + mes "I'm very please you want to join our army, but I'm sorry: I can't send a rookie like you to die on the cruel battlefield"; + close; + } + + mes "Good luck!"; + close2; + warp "bat_room",85,77; + end; +} + +// Guillaune Knight - Flavius +// ********************************************************************* +bat_room,151,178,5 script Guillaume Knight#4 417,{ + mes "[Guillaume Knight]"; + mes "The objective of the Flavius Battle is to score 2 points before your enemy by destroying their crystal."; + next; + mes "[Guillaume Knight]"; + mes "The crystals for both armies are protected by special barricades that cannot be destroyed by direct attacks."; + next; + mes "[Guillaume Knight]"; + mes "But they can be removed by destroying the Guardians that protect the enemy army base."; + next; + mes "[Guillaume Knight]"; + mes "The crystals are immune to every type of skill; your physical attacks are the only choice for destroying your enemy's crystal."; + next; + mes "[Guillaume Knight]"; + mes "Are you ready for battle? Then apply with the recruiter next to me!"; + close; +} + +// Flavius Officerer - Guillaume +// ********************************************************************* +bat_room,148,178,5 script Flavius Officer#3 418,{ + mes "[Flavius Officer]"; + if( Bat_Team == 2 ) + { + mes "Get out of here you stupid Croix!"; + close; + } + + if( Bat_Team == 0 ) + { + mes "Please sign up for an army with Prince Croix or General Guillaume!"; + close; + } + + mes "Hello " + strcharinfo(0) + ", let's show the power of the Guillaume Army to those stinky Croixs!"; + next; + if( select("I want to join your army!:End Conversation") == 2 ) + close; + + mes "[Flavius Officer]"; + if( BG_Delay_Tick >= gettimetick(2) ) + { + mes "You are a Deserter!!"; + mes "Because of running away, you need to wait ^0000FF" + callfunc("Time2Str",BG_Delay_Tick) + "^000000 to join again a BattleGround."; + close; + } + + if( checkquest(2070,PLAYTIME) == 2 ) erasequest 2070; + if( checkquest(2070,PLAYTIME) != -1 ) + { + mes "You have received an indicator showing that you've participated in the Battle at Flavius. I can't let you participate in any other battles until the indicator goes off."; + next; + mes "[Flavius Officer]"; + mes "Stand-by for Flavius Battle until the time limit passes."; + close; + } + + if( BaseLevel < 80 ) + { + mes "I'm very please you want to join our army, but I'm sorry: I can't send a rookie like you to die on the cruel battlefield"; + close; + } + + mes "Good luck!"; + close2; + warp "bat_room",253,94; + end; +} + +// Croix Knight - Flavius +// ********************************************************************* +bat_room,151,121,1 script Croix Knight#4 413,{ + mes "[Croix Knight]"; + mes "The objective of the Flavius Battle is to score 2 points before your enemy by destroying their crystal."; + next; + mes "[Croix Knight]"; + mes "The crystals for both armies are protected by special barricades that cannot be destroyed by direct attacks."; + next; + mes "[Croix Knight]"; + mes "But they can be removed by destroying the Guardians that protect the enemy army base."; + next; + mes "[Croix Knight]"; + mes "The crystals are immune to every type of skill; your physical attacks are the only choice for destroying your enemy's crystal."; + next; + mes "[Croix Knight]"; + mes "Are you ready for battle? Then apply with the recruiter next to me!"; + close; +} + +// Flavius Officerer - Croix +// ********************************************************************* +bat_room,148,121,1 script Flavius Officer#4 414,{ + mes "[Flavius Officer]"; + if( Bat_Team == 1 ) + { + mes "Get out of here you stupid Guillaume!"; + close; + } + + if( Bat_Team == 0 ) + { + mes "Please sign up for an army with Prince Croix or General Guillaume!"; + close; + } + + mes "Hello " + strcharinfo(0) + ", let's show the power of the Croix Army to those stinky Guillaumes!"; + next; + if( select("I want to join your army!:End Conversation") == 2 ) + close; + + mes "[Flavius Officer]"; + if( BG_Delay_Tick >= gettimetick(2) ) + { + mes "You are a Deserter!!"; + mes "Because of running away, you need to wait ^0000FF" + callfunc("Time2Str",BG_Delay_Tick) + "^000000 to join again a BattleGround."; + close; + } + + if( checkquest(2070,PLAYTIME) == 2 ) erasequest 2070; + if( checkquest(2070,PLAYTIME) != -1 ) + { + mes "You have received an indicator showing that you've participated in the Battle at Flavius. I can't let you participate in any other battles until the indicator goes off."; + next; + mes "[Flavius Officer]"; + mes "Stand-by for Flavius Battle until the time limit passes."; + close; + } + + if( BaseLevel < 80 ) + { + mes "I'm very please you want to join our army, but I'm sorry: I can't send a rookie like you to die on the cruel battlefield"; + close; + } + + mes "Good luck!"; + close2; + warp "bat_room",253,77; + end; +} + +// Guillaume Knight - KvM +// ********************************************************************* +bat_room,143,178,5 script Guillaume Knight#5 417,{ + mes "[Guillaume Knight]"; + mes "To win the Battle of Kriger Von Midgard you and your team must kill all the other opponents before all of you die."; + next; + mes "[Guillaume Knight]"; + mes "The first team to lose all their soldiers loses."; + next; + mes "[Guillaume Knight]"; + mes "Since you cannot come back to battle after you die, taking care on the battlefield is essential."; + next; + mes "[Guillaume Knight]"; + mes "Are you ready for battle? Then apply with the recruiter next to me!"; + close; +} + +// KvM Officerer - Guillaume +// ********************************************************************* +bat_room,140,178,5 script KVM [80-99] Officer#1 418,{ + mes "[KVM Officer]"; + if( Bat_Team == 2 ) + { + mes "Get out of here you stinky Croix!"; + close; + } + + if( Bat_Team == 0 ) + { + mes "Please sign up for an army with Prince Croix or General Guillaume!"; + close; + } + + mes "Hello " + strcharinfo(0) + ", let's show the power of the Guillaume Army to those stinky Croixs!"; + next; + if( select("I want to join your army!:End Conversation") == 2 ) + close; + + mes "[KVM Officer]"; + if( BG_Delay_Tick >= gettimetick(2) ) + { + mes "You are a Deserter!!"; + mes "Because of running away, you need to wait ^0000FF" + callfunc("Time2Str",BG_Delay_Tick) + "^000000 to join again a BattleGround."; + close; + } + + if( checkquest(6025,PLAYTIME) == 2 ) erasequest 6025; + if( checkquest(6025,PLAYTIME) != -1 ) + { + mes "You have received an indicator showing that you've participated in the Battle at KvM. I can't let you participate in any other battles until the indicator goes off."; + next; + mes "[KVM Officer]"; + mes "Stand-by for KvM Battle until the time limit passes."; + close; + } + + if( BaseLevel < 80 ) + { + mes "I'm very please you want to join our army, but I'm sorry: This arena is for players with baselevel from 80 to 99."; + close; + } + + mes "Good luck!"; + close2; + warp "bat_room",253,224; + end; +} + +// Croix Knight - KvM +// ********************************************************************* +bat_room,143,121,1 script Croix Knight#5 413,{ + mes "[Croix Knight]"; + mes "To win the Battle of Kriger Von Midgard you and your team must kill all the other opponents before all of you die."; + next; + mes "[Croix Knight]"; + mes "The first team to lose all their soldiers loses."; + next; + mes "[Croix Knight]"; + mes "Since you cannot come back to battle after you die, taking care on the battlefield is essential."; + next; + mes "[Croix Knight]"; + mes "Are you ready for battle? Then apply with the recruiter next to me!"; + close; +} + +// KvM Officer - Croix +// ********************************************************************* +bat_room,140,121,1 script KVM [80-99] Officer#2 414,{ + mes "[KVM Officer]"; + if( Bat_Team == 1 ) + { + mes "Get out of here you stupid Guillaume!"; + close; + } + + if( Bat_Team == 0 ) + { + mes "Please sign up for an army with Prince Croix or General Guillaume!"; + close; + } + + mes "Hello " + strcharinfo(0) + ", let's show the power of the Croix Army to those stinky Guillaumes!"; + next; + if( select("I want to join your army!:End Conversation") == 2 ) + close; + + mes "[KVM Officer]"; + if( BG_Delay_Tick >= gettimetick(2) ) + { + mes "You are a Deserter!!"; + mes "Because of running away, you need to wait ^0000FF" + callfunc("Time2Str",BG_Delay_Tick) + "^000000 to join again a BattleGround."; + close; + } + + if( checkquest(6025,PLAYTIME) == 2 ) erasequest 6025; + if( checkquest(6025,PLAYTIME) != -1 ) + { + mes "You have received an indicator showing that you've participated in the Battle at KvM. I can't let you participate in any other battles until the indicator goes off."; + next; + mes "[KVM Officer]"; + mes "Stand-by for KvM Battle until the time limit passes."; + close; + } + + if( BaseLevel < 80 ) + { + mes "I'm very please you want to join our army, but I'm sorry: This arena is for players with baselevel from 80 to 99."; + close; + } + + mes "Good luck!"; + close2; + warp "bat_room",253,208; + end; +} + +// Guillaume Knight - KvM +// ********************************************************************* +bat_room,135,178,5 script Guillaume Knight#6 417,{ + mes "[Guillaume Knight]"; + mes "To win the Battle of Kriger Von Midgard you and your team must kill all the other opponents before all of you die."; + next; + mes "[Guillaume Knight]"; + mes "The first team to lose all their soldiers loses."; + next; + mes "[Guillaume Knight]"; + mes "Since you cannot come back to battle after you die, taking care on the battlefield is essential."; + next; + mes "[Guillaume Knight]"; + mes "Are you ready for battle? Then apply with the recruiter next to me!"; + close; +} + +// KvM Officerer - Guillaume +// ********************************************************************* +bat_room,132,178,5 script KVM [60-79] Officer#1 418,{ + mes "[KVM Officer]"; + if( Bat_Team == 2 ) + { + mes "Get out of here you stinky Croix!"; + close; + } + + if( Bat_Team == 0 ) + { + mes "Please sign up for an army with Prince Croix or General Guillaume!"; + close; + } + + mes "Hello " + strcharinfo(0) + ", let's show the power of the Guillaume Army to those stinky Croixs!"; + next; + if( select("I want to join your army!:End Conversation") == 2 ) + close; + + mes "[KVM Officer]"; + if( BG_Delay_Tick >= gettimetick(2) ) + { + mes "You are a Deserter!!"; + mes "Because of running away, you need to wait ^0000FF" + callfunc("Time2Str",BG_Delay_Tick) + "^000000 to join again a BattleGround."; + close; + } + + if( checkquest(6025,PLAYTIME) == 2 ) erasequest 6025; + if( checkquest(6025,PLAYTIME) != -1 ) + { + mes "You have received an indicator showing that you've participated in the Battle at KvM. I can't let you participate in any other battles until the indicator goes off."; + next; + mes "[KVM Officer]"; + mes "Stand-by for KvM Battle until the time limit passes."; + close; + } + + if( BaseLevel < 60 || BaseLevel > 79 ) + { + mes "I'm very please you want to join our army, but I'm sorry: This arena is for players with baselevel from 60 to 79."; + close; + } + + mes "Good luck!"; + close2; + warp "bat_room",225,224; + end; +} + +// Croix Knight - KvM +// ********************************************************************* +bat_room,135,121,1 script Croix Knight#6 413,{ + mes "[Croix Knight]"; + mes "To win the Battle of Kriger Von Midgard you and your team must kill all the other opponents before all of you die."; + next; + mes "[Croix Knight]"; + mes "The first team to lose all their soldiers loses."; + next; + mes "[Croix Knight]"; + mes "Since you cannot come back to battle after you die, taking care on the battlefield is essential."; + next; + mes "[Croix Knight]"; + mes "Are you ready for battle? Then apply with the recruiter next to me!"; + close; +} + +// KvM Officer - Croix +// ********************************************************************* +bat_room,132,121,1 script KVM [60-79] Officer#2 414,{ + mes "[KVM Officer]"; + if( Bat_Team == 1 ) + { + mes "Get out of here you stupid Guillaume!"; + close; + } + + if( Bat_Team == 0 ) + { + mes "Please sign up for an army with Prince Croix or General Guillaume!"; + close; + } + + mes "Hello " + strcharinfo(0) + ", let's show the power of the Croix Army to those stinky Guillaumes!"; + next; + if( select("I want to join your army!:End Conversation") == 2 ) + close; + + mes "[KVM Officer]"; + if( BG_Delay_Tick >= gettimetick(2) ) + { + mes "You are a Deserter!!"; + mes "Because of running away, you need to wait ^0000FF" + callfunc("Time2Str",BG_Delay_Tick) + "^000000 to join again a BattleGround."; + close; + } + + if( checkquest(6025,PLAYTIME) == 2 ) erasequest 6025; + if( checkquest(6025,PLAYTIME) != -1 ) + { + mes "You have received an indicator showing that you've participated in the Battle at KvM. I can't let you participate in any other battles until the indicator goes off."; + next; + mes "[KVM Officer]"; + mes "Stand-by for KvM Battle until the time limit passes."; + close; + } + + if( BaseLevel < 60 || BaseLevel > 79 ) + { + mes "I'm very please you want to join our army, but I'm sorry: This arena is for players with baselevel from 60 to 79."; + close; + } + + mes "Good luck!"; + close2; + warp "bat_room",225,208; + end; +} + +// Guillaume Knight - KvM +// ********************************************************************* +bat_room,127,178,5 script Guillaume Knight#7 417,{ + mes "[Guillaume Knight]"; + mes "To win the Battle of Kriger Von Midgard you and your team must kill all the other opponents before all of you die."; + next; + mes "[Guillaume Knight]"; + mes "The first team to lose all their soldiers loses."; + next; + mes "[Guillaume Knight]"; + mes "Since you cannot come back to battle after you die, taking care on the battlefield is essential."; + next; + mes "[Guillaume Knight]"; + mes "Are you ready for battle? Then apply with the recruiter next to me!"; + close; +} + +// KvM Officerer - Guillaume +// ********************************************************************* +bat_room,124,178,5 script KVM [1-59] Officer#1 418,{ + mes "[KVM Officer]"; + if( Bat_Team == 2 ) + { + mes "Get out of here you stinky Croix!"; + close; + } + + if( Bat_Team == 0 ) + { + mes "Please sign up for an army with Prince Croix or General Guillaume!"; + close; + } + + mes "Hello " + strcharinfo(0) + ", let's show the power of the Guillaume Army to those stinky Croixs!"; + next; + if( select("I want to join your army!:End Conversation") == 2 ) + close; + + mes "[KVM Officer]"; + if( BG_Delay_Tick >= gettimetick(2) ) + { + mes "You are a Deserter!!"; + mes "Because of running away, you need to wait ^0000FF" + callfunc("Time2Str",BG_Delay_Tick) + "^000000 to join again a BattleGround."; + close; + } + + if( checkquest(6025,PLAYTIME) == 2 ) erasequest 6025; + if( checkquest(6025,PLAYTIME) != -1 ) + { + mes "You have received an indicator showing that you've participated in the Battle at KvM. I can't let you participate in any other battles until the indicator goes off."; + next; + mes "[KVM Officer]"; + mes "Stand-by for KvM Battle until the time limit passes."; + close; + } + + if( BaseLevel > 59 ) + { + mes "I'm very please you want to join our army, but I'm sorry: This arena is for players with baselevel from 1 to 59."; + close; + } + + mes "Good luck!"; + close2; + warp "bat_room",197,224; + end; +} + +// Croix Knight - KvM +// ********************************************************************* +bat_room,127,121,1 script Croix Knight#7 413,{ + mes "[Croix Knight]"; + mes "To win the Battle of Kriger Von Midgard you and your team must kill all the other opponents before all of you die."; + next; + mes "[Croix Knight]"; + mes "The first team to lose all their soldiers loses."; + next; + mes "[Croix Knight]"; + mes "Since you cannot come back to battle after you die, taking care on the battlefield is essential."; + next; + mes "[Croix Knight]"; + mes "Are you ready for battle? Then apply with the recruiter next to me!"; + close; +} + +// KvM Officer - Croix +// ********************************************************************* +bat_room,124,121,1 script KVM [1-59] Officer#2 414,{ + mes "[KVM Officer]"; + if( Bat_Team == 1 ) + { + mes "Get out of here you stupid Guillaume!"; + close; + } + + if( Bat_Team == 0 ) + { + mes "Please sign up for an army with Prince Croix or General Guillaume!"; + close; + } + + mes "Hello " + strcharinfo(0) + ", let's show the power of the Croix Army to those stinky Guillaumes!"; + next; + if( select("I want to join your army!:End Conversation") == 2 ) + close; + + mes "[KVM Officer]"; + if( BG_Delay_Tick >= gettimetick(2) ) + { + mes "You are a Deserter!!"; + mes "Because of running away, you need to wait ^0000FF" + callfunc("Time2Str",BG_Delay_Tick) + "^000000 to join again a BattleGround."; + close; + } + + if( checkquest(6025,PLAYTIME) == 2 ) erasequest 6025; + if( checkquest(6025,PLAYTIME) != -1 ) + { + mes "You have received an indicator showing that you've participated in the Battle at KvM. I can't let you participate in any other battles until the indicator goes off."; + next; + mes "[KVM Officer]"; + mes "Stand-by for KvM Battle until the time limit passes."; + close; + } + + if( BaseLevel > 59 ) + { + mes "I'm very please you want to join our army, but I'm sorry: This arena is for players with baselevel from 1 to 59."; + close; + } + + mes "Good luck!"; + close2; + warp "bat_room",197,208; + end; +} + +// Guard Dummy +// ********************************************************************* + +bat_room,161,141,3 script Prince Croix's Aid::bat_aid 415,{ end; } +bat_room,161,139,3 duplicate(bat_aid) Prince Croix's Aid::bat_aid2 415 +bat_room,161,160,3 duplicate(bat_aid) General Guillaume's Aid::bat_aid3 419 +bat_room,161,158,3 duplicate(bat_aid) General Guillaume's Aid::bat_aid4 419 + +// Flags +// ********************************************************************* + +- script Guillaume camp#bat 973,{ end; } +- script Croix camp#bat 974,{ end; } + +// Exit from Registration +// ********************************************************************* +- script warp2bat_room -1,{ + end; + +OnTouch: + set BG_Delay_Tick, gettimetick(2) + 30; + warp "bat_room",154,149; + end; +} + +// Flavius bat_b02 +bat_room,57,81,0 duplicate(warp2bat_room) bat1 45,1,1 +bat_room,57,90,0 duplicate(warp2bat_room) bat2 45,1,1 +// Free BG +bat_room,57,220,0 duplicate(warp2bat_room) bat3 45,1,1 +bat_room,57,211,0 duplicate(warp2bat_room) bat4 45,1,1 +// Tierra Valley bat_a02 +bat_room,85,81,0 duplicate(warp2bat_room) bat5 45,1,1 +bat_room,85,90,0 duplicate(warp2bat_room) bat6 45,1,1 +// Tierra Valley bat_a01 +bat_room,85,220,0 duplicate(warp2bat_room) bat7 45,1,1 +bat_room,85,211,0 duplicate(warp2bat_room) bat8 45,1,1 +// Free BG +bat_room,113,81,0 duplicate(warp2bat_room) bat9 45,1,1 +bat_room,113,90,0 duplicate(warp2bat_room) bat10 45,1,1 +// Free BG +bat_room,113,220,0 duplicate(warp2bat_room) bat11 45,1,1 +bat_room,113,211,0 duplicate(warp2bat_room) bat12 45,1,1 +// Free BG +bat_room,141,81,0 duplicate(warp2bat_room) bat13 45,1,1 +bat_room,141,90,0 duplicate(warp2bat_room) bat14 45,1,1 +// Free BG +bat_room,141,220,0 duplicate(warp2bat_room) bat15 45,1,1 +bat_room,141,211,0 duplicate(warp2bat_room) bat16 45,1,1 +// Free BG +bat_room,169,81,0 duplicate(warp2bat_room) bat17 45,1,1 +bat_room,169,90,0 duplicate(warp2bat_room) bat18 45,1,1 +// Free BG +bat_room,169,220,0 duplicate(warp2bat_room) bat19 45,1,1 +bat_room,169,211,0 duplicate(warp2bat_room) bat20 45,1,1 +// Free BG +bat_room,197,81,0 duplicate(warp2bat_room) bat21 45,1,1 +bat_room,197,90,0 duplicate(warp2bat_room) bat22 45,1,1 +// KvM bat_c03 +bat_room,197,220,0 duplicate(warp2bat_room) bat23 45,1,1 +bat_room,197,211,0 duplicate(warp2bat_room) bat24 45,1,1 +// Free BG +bat_room,225,81,0 duplicate(warp2bat_room) bat25 45,1,1 +bat_room,225,90,0 duplicate(warp2bat_room) bat26 45,1,1 +// KvM bat_c02 +bat_room,225,220,0 duplicate(warp2bat_room) bat27 45,1,1 +bat_room,225,211,0 duplicate(warp2bat_room) bat28 45,1,1 +// Flavius bat_b01 +bat_room,253,81,0 duplicate(warp2bat_room) bat29 45,1,1 +bat_room,253,90,0 duplicate(warp2bat_room) bat30 45,1,1 +// KvM bat_c01 +bat_room,253,220,0 duplicate(warp2bat_room) bat31 45,1,1 +bat_room,253,211,0 duplicate(warp2bat_room) bat32 45,1,1 + +// Badges Repairman +// ********************************************************************* + +bat_room,138,144,5 script Repairman#bg 99,{ + callfunc "repairmain","Repairman"; + end; +} + +// Badges Exchange +// ********************************************************************* + +bat_room,160,150,3 script Erundek 109,{ + mes "[Erundek]"; + mes "Welcome, mighty warrior."; + mes "What can I do for you today ?"; + next; + switch( select("Check the Catalog","Exchange Bravery Badges","Exchange Valor Badges","Exchange Heroism Badges","Hmm, nothing I guess.") ) + { + case 1: + mes "[Erundek]"; + mes "We have many items, so please take a look and purchase deliberately."; + close2; + Readbook 11010,1; + end; + case 5: + mes "[Erundek]"; + mes "As you wish."; + mes "See you later."; + close; + case 2: // Bravery Badges + mes "[Erundek]"; + mes "So you want to exchange ^0000FFBravery Badges^000000 from the Battle of Tierra Valley."; + mes "What kind of item do you want to exchange?"; + next; + deletearray .@Item_DB[0],127; + set .@Badge, 7828; + + switch( select("Weapons:Garment:Footgear:Armor:Accessory") ) + { + case 1: setarray .@Item_DB[0],13036,13411,1425,1632,1634,1543,1924,1978,1574,1824,1183,1380,13305,1279,1739,13108,13172; set .@Value, 100; break; + case 2: setarray .@Item_DB[0],2538,2539,2540; set .@Value, 50; break; + case 3: setarray .@Item_DB[0],2435,2436,2437; set .@Value, 50; break; + case 4: setarray .@Item_DB[0],2376,2377,2378,2379,2380,2381,2382; set .@Value, 80; break; + case 5: setarray .@Item_DB[0],2720,2721,2722,2723,2724,2725,2733; set .@Value, 500; break; + } + + break; + case 3: // Valor Badges + mes "[Erundek]"; + mes "So you want to exchange ^FF0000Valor Badges^000000 from the Battle of Flavius."; + mes "What kind of item do you want to exchange?"; + next; + deletearray .@Item_DB[0],127; + set .@Badge, 7829; + + switch( select("Weapons:Garment:Footgear:Armor:Accessory") ) + { + case 1: setarray .@Item_DB[0],13037,13410,1633,1635,1542,1923,1977,1575,1823,1184,1482,1379,13306,1280,1738,13171,13173,13174; set .@Value, 100; break; + case 2: setarray .@Item_DB[0],2538,2539,2540; set .@Value, 50; break; + case 3: setarray .@Item_DB[0],2435,2436,2437; set .@Value, 50; break; + case 4: setarray .@Item_DB[0],2376,2377,2378,2379,2380,2381,2382; set .@Value, 80; break; + case 5: setarray .@Item_DB[0],2720,2721,2722,2723,2724,2725,2733; set .@Value, 500; break; + } + + break; + case 4: // Heroism Badge + mes "[Erundek]"; + mes "So you want to exchange ^FFA500Heroism Badges^000000 from the Battle of Kriger Von Midgard."; + mes "This shop is not available at the moment."; + close; + } + + mes "[Erundek]"; + mes "What item do you want to exchange?"; + mes "If you are not sure, check the catalog."; + next; + + set .@Menu$, ""; + set .@Count, getarraysize(.@Item_DB); + for( set .@i, 0; .@i < .@Count; set .@i, .@i + 1 ) + set .@Menu$, .@Menu$ + getitemname(.@Item_DB[.@i]) + ":"; + + set .@Item_ID, .@Item_DB[select(.@Menu$) - 1]; + + mes "[Erundek]"; + mes "Would you like to exchange ^FF0000" + .@Value + " " + getitemname(.@Badge) + "^000000 for a ^0000FF" + getitemname(.@Item_ID) + "^000000?"; + next; + mes "Remember, Battleground Reward Items are ^FF0000Character Bound^000000."; + mes "Are you sure you want this item?"; + next; + + if( select("Yes:No") == 2 ) + { + mes "[Erundek]"; + mes "Do you need more time to check the items?"; + close; + } + + if( countitem(.@Badge) < .@Value ) + { + mes "[Erundek]"; + mes "I'm sorry, but you don't have enough badges to exchange."; + close; + } + + delitem .@Badge,.@Value; + getitem .@Item_ID,1; + mes "[Erundek]"; + mes "Thank you for exchanging."; + close; +} diff --git a/npc/custom/battleground/bg_flavius_01.txt b/npc/custom/battleground/bg_flavius_01.txt new file mode 100644 index 000000000..4bb6fa7be --- /dev/null +++ b/npc/custom/battleground/bg_flavius_01.txt @@ -0,0 +1,428 @@ +// ============================================================================== +// BattleGround System - Flavius 1 +// ============================================================================== + +// Registration NPC's +// ********************************************************************* + +bat_room,86,227,4 script Registration::Fl1R_Guillaume 418,{ + end; +OnInit: + waitingroom "Battle Station 10 Players",10,"Flavius_BG1::OnGuillaumeJoin",1; + end; +OnEnterBG: + set $@FlaviusBG1_id1, waitingroom2bg("bat_b01",390,10,"Flavius_BG1::OnGuillaumeQuit",""); + end; +} + +bat_room,85,204,0 script Registration::Fl1R_Croix 414,{ + end; +OnInit: + waitingroom "Battle Station 10 Players",10,"Flavius_BG1::OnCroixJoin",1; + end; +OnEnterBG: + set $@FlaviusBG1_id2, waitingroom2bg("bat_b01",10,290,"Flavius_BG1::OnCroixQuit",""); + end; +} + +// Battleground Engine +// ********************************************************************* + +- script Flavius_BG1 -1,{ + end; + +OnInit: + disablenpc "Guillaume Vintenar#fl1"; + disablenpc "Croix Vintenar#fl1"; + disablenpc "Therapist in battle#fl11"; + disablenpc "Therapist in battle#fl12"; + end; + +OnGuillaumeQuit: +OnCroixQuit: + set BG_Delay_Tick, gettimetick(2) + 1200; + end; + +OnGuillaumeJoin: +OnCroixJoin: + if( $@FlaviusBG1 == 0 ) + donpcevent "Flavius_BG1::OnReadyCheck"; + end; + +OnReadyCheck: + if( $@FlaviusBG1 ) + end; + set .@Guillaume, getwaitingroomstate(0,"Fl1R_Guillaume"); + set .@Croix, getwaitingroomstate(0,"Fl1R_Croix"); + + if( .@Guillaume < 10 || .@Croix < 10 ) + { + mapannounce "bat_room","Battleground -- Flavius [80-99] G: " + .@Guillaume + "/10, C: " + .@Croix + "/10",1,0x006400; + end; + } + + // BG Variables + set $@FlaviusBG1, 1; + set $@FlaviusBG1_Victory, 0; + set .Guillaume_Score, 0; + set .Guillaume_Loss, 0; + set .Croix_Score, 0; + set .Croix_Loss, 0; + set .Match, 0; + // Prepare NPC + donpcevent "#gfl1_respawn::OnBGStart"; + donpcevent "#cfl1_respawn::OnBGStart"; + enablenpc "Therapist in battle#fl11"; + enablenpc "Therapist in battle#fl12"; + disablenpc "Guillaume Vintenar#fl1"; + disablenpc "Croix Vintenar#fl1"; + // Build and Warp Teams + donpcevent "Fl1R_Guillaume::OnEnterBG"; + donpcevent "Fl1R_Croix::OnEnterBG"; + announce "Battleground -- Flavius [80-99] has started!",0,0x006400; + initnpctimer; + // Start Match!! + +OnRoundStart: + sleep 2000; + if( $@FlaviusBG1 != 1 ) end; + + areapercentheal "bat_b01",382,2,397,17,100,100; + areapercentheal "bat_b01",2,282,17,297,100,100; + bg_warp $@FlaviusBG1_id1,"bat_b01",311,224; + bg_warp $@FlaviusBG1_id2,"bat_b01",87,75; + + sleep 2000; + if( $@FlaviusBG1 != 1 ) end; + + set .Match, .Match + 1; + // Crystal Spawn + set .Guillaume_Crystal, bg_monster($@FlaviusBG1_id1,"bat_b01",328,150,"Crystal Guillaume",1914,"Flavius_BG1::OnGuillaumeBreak"); + setcell "bat_b01",327,151,329,149,cell_basilica,1; + setcell "bat_b01",327,151,329,149,cell_walkable,1; + + set .Croix_Crystal, bg_monster($@FlaviusBG1_id2,"bat_b01",62,150,"Crystal Croix",1915,"Flavius_BG1::OnCroixBreak"); + setcell "bat_b01",62,149,60,151,cell_basilica,1; + setcell "bat_b01",62,149,60,151,cell_walkable,1; + + // Guardian Spawns + bg_monster $@FlaviusBG1_id1,"bat_b01",328,160,"Guillaume Guardian",1949,"Flavius_BG1::OnGuiGuardian"; + bg_monster $@FlaviusBG1_id1,"bat_b01",328,140,"Guillaume Guardian",1950,"Flavius_BG1::OnGuiGuardian"; + set .Guillaume_Guardian, 2; + bg_monster $@FlaviusBG1_id2,"bat_b01",62,160,"Croix Guardian",1949,"Flavius_BG1::OnCroGuardian"; + bg_monster $@FlaviusBG1_id2,"bat_b01",61,140,"Croix Guardian",1950,"Flavius_BG1::OnCroGuardian"; + set .Croix_Guardian, 2; + // Announces + mapannounce "bat_b01","The Battle of Flavius [ " + .Match + " ] Round has begun!!",1,0x006400; + end; + +OnRoundStop: + // Remove Monsters + killmonster "bat_b01","Flavius_BG1::OnGuiGuardian"; + killmonster "bat_b01","Flavius_BG1::OnCroGuardian"; + setcell "bat_b01",327,151,329,149,cell_walkable,0; + setcell "bat_b01",327,151,329,149,cell_basilica,0; + killmonster "bat_b01","Flavius_BG1::OnGuillaumeBreak"; + setcell "bat_b01",62,149,60,151,cell_walkable,0; + setcell "bat_b01",62,149,60,151,cell_basilica,0; + killmonster "bat_b01","Flavius_BG1::OnCroixBreak"; + end; + +OnGuiGuardian: + if( set(.Guillaume_Guardian, .Guillaume_Guardian - 1) <= 0 ) + { + setcell "bat_b01",327,151,329,149,cell_walkable,0; + setcell "bat_b01",327,151,329,149,cell_basilica,0; + mapannounce "bat_b01","The Guillaume Crystal is vulnerable to attack!",1,0x0000FF; + } + end; + +OnCroGuardian: + if( set(.Croix_Guardian, .Croix_Guardian - 1) <= 0 ) + { + setcell "bat_b01",62,149,60,151,cell_walkable,0; + setcell "bat_b01",62,149,60,151,cell_basilica,0; + mapannounce "bat_b01","The Croix Crystal is vulnerable to attack!",1,0xFF0000; + } + end; + +OnGuillaumeBreak: + donpcevent "Flavius_BG1::OnRoundStop"; + set .Guillaume_Loss, .Guillaume_Loss + 1; + if( set(.Croix_Score, .Croix_Score + 1) < 2 ) + { + bg_updatescore "bat_b01",.Guillaume_Score,.Croix_Score; + mapannounce "bat_b01","The Guillaume Crystal has been destroyed!",1,0x0000FF; + donpcevent "Flavius_BG1::OnRoundStart"; + } + else + { + bg_updatescore "bat_b01",.Guillaume_Score,.Croix_Score; + mapannounce "bat_b01","The Croix army has won the Battle of Flavius!",1,0xFF0000; + set $@FlaviusBG1_Victory, 2; + donpcevent "Flavius_BG1::OnMatchEnd"; + } + end; + +OnCroixBreak: + donpcevent "Flavius_BG1::OnRoundStop"; + set .Croix_Loss, .Croix_Loss + 1; + if( set(.Guillaume_Score, .Guillaume_Score + 1) < 2 ) + { + bg_updatescore "bat_b01",.Guillaume_Score,.Croix_Score; + mapannounce "bat_b01","The Croix Crystal has been destroyed!",1,0xFF0000; + donpcevent "Flavius_BG1::OnRoundStart"; + } + else + { + bg_updatescore "bat_b01",.Guillaume_Score,.Croix_Score; + mapannounce "bat_b01","The Guillaume army has won the Battle of Flavius!",1,0x0000FF; + set $@FlaviusBG1_Victory, 1; + donpcevent "Flavius_BG1::OnMatchEnd"; + } + end; + +OnTimer2400000: + mapannounce "bat_b01","Battle of Flavius will ends in 5 minutes",1,0x006400; + end; +OnTimer2640000: + mapannounce "bat_b01","Battle of Flavius will ends in 1 minute",1,0x006400; + end; + +OnTimer2700000: + if( .Croix_Score > .Guillaume_Score ) + { + mapannounce "bat_b01","The Croix army has won the Battle of Flavius!",1,0xFF0000; + set $@FlaviusBG1_Victory, 2; + } + else if( .Croix_Score < .Guillaume_Score ) + { + mapannounce "bat_b01","The Guillaume army has won the Battle of Flavius!",1,0x0000FF; + set $@FlaviusBG1_Victory, 1; + } + else + { + mapannounce "bat_b01","The Battle of Flavius is over. The time is out, this is a Tie",1,0x006400; + set $@FlaviusBG1_Victory, 3; + } + +OnMatchEnd: + set $@FlaviusBG1, 2; + stopnpctimer; + donpcevent "#gfl1_respawn::OnBGStop"; + donpcevent "#cfl1_respawn::OnBGStop"; + disablenpc "Therapist in battle#fl11"; + disablenpc "Therapist in battle#fl12"; + enablenpc "Guillaume Vintenar#fl1"; + enablenpc "Croix Vintenar#fl1"; + sleep 2000; + bg_warp $@FlaviusBG1_id1,"bat_b01",390,10; + bg_warp $@FlaviusBG1_id2,"bat_b01",10,290; + sleep 3000; + mapannounce "bat_b01","Battle of Flavius will close in 1 minute!",1,0x006400; + initnpctimer; + end; + +OnTimer30000: + if( $@FlaviusBG1 == 2 ) + mapannounce "bat_b01","Battle of Flavius will close in 30 seconds!",1,0x006400; + end; +OnTimer50000: + if( $@FlaviusBG1 == 2 ) + mapannounce "bat_b01","Battle of Flavius will close in 10 seconds!",1,0x006400; + end; + +OnTimer60000: + if( $@FlaviusBG1 != 2 ) + end; +OnReset: + stopnpctimer; + donpcevent "Flavius_BG1::OnRoundStop"; + set .Guillaume_Score, 0; + set .Guillaume_Crystal, 0; + set .Guillaume_Loss, 0; + set .Croix_Score, 0; + set .Croix_Crystal, 0; + set .Croix_Loss, 0; + set .Match, 0; + set $@FlaviusBG1_Victory, 0; + // NPC's + disablenpc "Guillaume Vintenar#fl1"; + disablenpc "Croix Vintenar#fl1"; + disablenpc "Therapist in battle#fl11"; + disablenpc "Therapist in battle#fl12"; + + if( $@FlaviusBG1_id1 ) { bg_destroy $@FlaviusBG1_id1; set $@FlaviusBG1_id1, 0; } + if( $@FlaviusBG1_id2 ) { bg_destroy $@FlaviusBG1_id2; set $@FlaviusBG1_id2, 0; } + sleep 1000; + mapwarp "bat_b01","bat_room",155,150; + sleep 2000; + maprespawnguildid "bat_b01",0,3; // Just in case someone else + sleep 2000; + bg_updatescore "bat_b01",0,0; + set $@FlaviusBG1, 0; + donpcevent "Flavius_BG1::OnReadyCheck"; + end; +} + +// Battleground rewards +// ********************************************************************* + +bat_b01,390,13,5 script Guillaume Vintenar#fl1 419,{ + if( $@FlaviusBG1_Victory ) + { + if( $@FlaviusBG1_Victory == Bat_Team ) + { // Victory + mes "[Swandery]"; + mes "Blessed Guillaume!!"; + mes "Let's enjoy our glorious victory!"; + mes "" + strcharinfo(0) + ", its a sign reflecting victory"; + close2; + set .@Reward, 9; + } + else + { // + mes "[Swandery]"; + mes "You lost, but you're dedicated to this battle."; + mes "This is a reward for your great dedication by Guillaume Marollo!"; + mes "Just take this defeat a lesson, and later you would definitely learn."; + close2; + set .@Reward, 3; + } + + setquest 2070; + getitem 7829, .@Reward; + bg_leave; + warp "bat_room",155,150; + end; + } + end; +} + +bat_b01,10,293,5 script Croix Vintenar#fl1 415,{ + if( $@FlaviusBG1_Victory ) + { + if( $@FlaviusBG1_Victory == Bat_Team ) + { // Victory + mes "[Swandery]"; + mes "Blessed Croax!!"; + mes "Let's enjoy our glorious victory!"; + mes "" + strcharinfo(0) + ", its a sign reflecting victory"; + close2; + set .@Reward, 9; + } + else + { // + mes "[Swandery]"; + mes "Oh, " + strcharinfo(0) + ". Don't be sad."; + mes "Even though we didn't win, we did our best."; + mes "This is a Royal gift from Croix, and please don't forget this battle. We can win the next."; + close2; + set .@Reward, 3; + } + + setquest 2070; + getitem 7829, .@Reward; + bg_leave; + warp "bat_room",155,150; + end; + } + end; +} + +// Battleground Therapist +// ********************************************************************* + +bat_b01,390,13,5 script Therapist in battle#fl12 95,{ + mes "[Therapist in battle]"; + mes "Just close your eyes, and take a deep breathe."; + mes "You can be free from pain."; + specialeffect2 312; + close; +} + +bat_b01,10,293,5 script Therapist in battle#fl11 95,{ + mes "[Therapist in battle]"; + mes "Just close your eyes, and take a deep breathe."; + mes "You can be free from pain."; + specialeffect2 312; + close; +} + +// Battleground Respawn +// ********************************************************************* + +bat_b01,390,10,0 script #gfl1_respawn 139,{ + end; + +OnBGStart: + initnpctimer; + end; + +OnBGStop: + stopnpctimer; + end; + +OnTimer24000: + misceffect 83; + end; + +OnTimer25000: + areapercentheal "bat_b01",382,2,397,17,100,100; + areawarp "bat_b01",382,2,397,17,"bat_b01",311,224; + initnpctimer; + end; +} + +bat_b01,10,290,0 script #cfl1_respawn 139,{ + end; + +OnBGStart: + initnpctimer; + end; + +OnBGStop: + stopnpctimer; + end; + +OnTimer24000: + misceffect 83; + end; + +OnTimer25000: + areapercentheal "bat_b01",2,282,17,297,100,100; + areawarp "bat_b01",2,282,17,297,"bat_b01",87,75; + initnpctimer; + end; +} + +// Flags +// ********************************************************************* + +bat_b01,304,231,1 duplicate(Guillaume camp#bat) Guillaume camp#bat1 973 +bat_b01,319,231,1 duplicate(Guillaume camp#bat) Guillaume camp#bat2 973 +bat_b01,304,218,1 duplicate(Guillaume camp#bat) Guillaume camp#bat3 973 +bat_b01,319,218,1 duplicate(Guillaume camp#bat) Guillaume camp#bat4 973 +bat_b01,304,231,1 duplicate(Guillaume camp#bat) Guillaume camp#bat5 973 +bat_b01,304,231,1 duplicate(Guillaume camp#bat) Guillaume camp#bat6 973 +bat_b01,335,142,1 duplicate(Guillaume camp#bat) Guillaume camp#bat7 973 +bat_b01,335,157,1 duplicate(Guillaume camp#bat) Guillaume camp#bat8 973 +bat_b01,390,16,1 duplicate(Guillaume camp#bat) Guillaume camp#bat9 973 +bat_b01,292,163,1 duplicate(Guillaume camp#bat) Guillaume camp#bat19 973 +bat_b01,292,136,1 duplicate(Guillaume camp#bat) Guillaume camp#bat20 973 +bat_b01,241,185,1 duplicate(Guillaume camp#bat) Guillaume camp#bat21 973 +bat_b01,247,179,1 duplicate(Guillaume camp#bat) Guillaume camp#bat22 973 + +bat_b01,96,81,1 duplicate(Croix camp#bat) Croix camp#bat1 974 +bat_b01,96,68,1 duplicate(Croix camp#bat) Croix camp#bat2 974 +bat_b01,79,81,1 duplicate(Croix camp#bat) Croix camp#bat3 974 +bat_b01,79,68,1 duplicate(Croix camp#bat) Croix camp#bat4 974 +bat_b01,96,81,1 duplicate(Croix camp#bat) Croix camp#bat5 974 +bat_b01,96,81,1 duplicate(Croix camp#bat) Croix camp#bat6 974 +bat_b01,59,164,1 duplicate(Croix camp#bat) Croix camp#bat7 974 +bat_b01,59,137,1 duplicate(Croix camp#bat) Croix camp#bat8 974 +bat_b01,10,296,1 duplicate(Croix camp#bat) Croix camp#bat9 974 +bat_b01,110,162,1 duplicate(Croix camp#bat) Croix camp#bat18 974 +bat_b01,110,137,1 duplicate(Croix camp#bat) Croix camp#bat19 974 +bat_b01,152,120,1 duplicate(Croix camp#bat) Croix camp#bat20 974 +bat_b01,158,114,1 duplicate(Croix camp#bat) Croix camp#bat21 974 diff --git a/npc/custom/battleground/bg_flavius_02.txt b/npc/custom/battleground/bg_flavius_02.txt new file mode 100644 index 000000000..4dc180d14 --- /dev/null +++ b/npc/custom/battleground/bg_flavius_02.txt @@ -0,0 +1,428 @@ +// ============================================================================== +// BattleGround System - Flavius 2 +// ============================================================================== + +// Registration NPC's +// ********************************************************************* + +bat_room,142,227,4 script Registration::Fl2R_Guillaume 418,{ + end; +OnInit: + waitingroom "Battle Station 10 Players",10,"Flavius_BG2::OnGuillaumeJoin",1; + end; +OnEnterBG: + set $@FlaviusBG2_id1, waitingroom2bg("bat_b02",390,10,"Flavius_BG2::OnGuillaumeQuit",""); + end; +} + +bat_room,142,204,0 script Registration::Fl2R_Croix 414,{ + end; +OnInit: + waitingroom "Battle Station 10 Players",10,"Flavius_BG2::OnCroixJoin",1; + end; +OnEnterBG: + set $@FlaviusBG2_id2, waitingroom2bg("bat_b02",10,290,"Flavius_BG2::OnCroixQuit",""); + end; +} + +// Battleground Engine +// ********************************************************************* + +- script Flavius_BG2 -1,{ + end; + +OnInit: + disablenpc "Guillaume Vintenar#fl2"; + disablenpc "Croix Vintenar#fl2"; + disablenpc "Therapist in battle#fl21"; + disablenpc "Therapist in battle#fl22"; + end; + +OnGuillaumeQuit: +OnCroixQuit: + set BG_Delay_Tick, gettimetick(2) + 1200; + end; + +OnGuillaumeJoin: +OnCroixJoin: + if( $@FlaviusBG2 == 0 ) + donpcevent "Flavius_BG2::OnReadyCheck"; + end; + +OnReadyCheck: + if( $@FlaviusBG2 ) + end; + set .@Guillaume, getwaitingroomstate(0,"Fl2R_Guillaume"); + set .@Croix, getwaitingroomstate(0,"Fl2R_Croix"); + + if( .@Guillaume < 10 || .@Croix < 10 ) + { + mapannounce "bat_room","Battleground -- Flavius [80-99] G: " + .@Guillaume + "/10, C: " + .@Croix + "/10",1,0x808000; + end; + } + + // BG Variables + set $@FlaviusBG2, 1; + set $@FlaviusBG2_Victory, 0; + set .Guillaume_Score, 0; + set .Guillaume_Loss, 0; + set .Croix_Score, 0; + set .Croix_Loss, 0; + set .Match, 0; + // Prepare NPC + donpcevent "#gfl2_respawn::OnBGStart"; + donpcevent "#cfl2_respawn::OnBGStart"; + enablenpc "Therapist in battle#fl21"; + enablenpc "Therapist in battle#fl22"; + disablenpc "Guillaume Vintenar#fl2"; + disablenpc "Croix Vintenar#fl2"; + // Build and Warp Teams + donpcevent "Fl2R_Guillaume::OnEnterBG"; + donpcevent "Fl2R_Croix::OnEnterBG"; + announce "Battleground -- Flavius [80-99] has started!",0,0x808000; + initnpctimer; + // Start Match!! + +OnRoundStart: + sleep 2000; + if( $@FlaviusBG2 != 1 ) end; + + areapercentheal "bat_b02",382,2,397,17,100,100; + areapercentheal "bat_b02",2,282,17,297,100,100; + bg_warp $@FlaviusBG2_id1,"bat_b02",311,224; + bg_warp $@FlaviusBG2_id2,"bat_b02",87,75; + + sleep 2000; + if( $@FlaviusBG2 != 1 ) end; + + set .Match, .Match + 1; + // Crystal Spawn + set .Guillaume_Crystal, bg_monster($@FlaviusBG2_id1,"bat_b02",328,150,"Crystal Guillaume",1914,"Flavius_BG2::OnGuillaumeBreak"); + setcell "bat_b02",327,151,329,149,cell_basilica,1; + setcell "bat_b02",327,151,329,149,cell_walkable,1; + + set .Croix_Crystal, bg_monster($@FlaviusBG2_id2,"bat_b02",62,150,"Crystal Croix",1915,"Flavius_BG2::OnCroixBreak"); + setcell "bat_b02",62,149,60,151,cell_basilica,1; + setcell "bat_b02",62,149,60,151,cell_walkable,1; + + // Guardian Spawns + bg_monster $@FlaviusBG2_id1,"bat_b02",328,160,"Guillaume Guardian",1949,"Flavius_BG2::OnGuiGuardian"; + bg_monster $@FlaviusBG2_id1,"bat_b02",328,140,"Guillaume Guardian",1950,"Flavius_BG2::OnGuiGuardian"; + set .Guillaume_Guardian, 2; + bg_monster $@FlaviusBG2_id2,"bat_b02",62,160,"Croix Guardian",1949,"Flavius_BG2::OnCroGuardian"; + bg_monster $@FlaviusBG2_id2,"bat_b02",61,140,"Croix Guardian",1950,"Flavius_BG2::OnCroGuardian"; + set .Croix_Guardian, 2; + // Announces + mapannounce "bat_b02","The Battle of Flavius [ " + .Match + " ] Round has begun!!",1,0x808000; + end; + +OnRoundStop: + // Remove Monsters + killmonster "bat_b02","Flavius_BG2::OnGuiGuardian"; + killmonster "bat_b02","Flavius_BG2::OnCroGuardian"; + setcell "bat_b02",327,151,329,149,cell_walkable,0; + setcell "bat_b02",327,151,329,149,cell_basilica,0; + killmonster "bat_b02","Flavius_BG2::OnGuillaumeBreak"; + setcell "bat_b02",62,149,60,151,cell_walkable,0; + setcell "bat_b02",62,149,60,151,cell_basilica,0; + killmonster "bat_b02","Flavius_BG2::OnCroixBreak"; + end; + +OnGuiGuardian: + if( set(.Guillaume_Guardian, .Guillaume_Guardian - 1) <= 0 ) + { + setcell "bat_b02",327,151,329,149,cell_walkable,0; + setcell "bat_b02",327,151,329,149,cell_basilica,0; + mapannounce "bat_b02","The Guillaume Crystal is vulnerable to attack!",1,0x0000FF; + } + end; + +OnCroGuardian: + if( set(.Croix_Guardian, .Croix_Guardian - 1) <= 0 ) + { + setcell "bat_b02",62,149,60,151,cell_walkable,0; + setcell "bat_b02",62,149,60,151,cell_basilica,0; + mapannounce "bat_b02","The Croix Crystal is vulnerable to attack!",1,0xFF0000; + } + end; + +OnGuillaumeBreak: + donpcevent "Flavius_BG2::OnRoundStop"; + set .Guillaume_Loss, .Guillaume_Loss + 1; + if( set(.Croix_Score, .Croix_Score + 1) < 2 ) + { + bg_updatescore "bat_b02",.Guillaume_Score,.Croix_Score; + mapannounce "bat_b02","The Guillaume Crystal has been destroyed!",1,0x0000FF; + donpcevent "Flavius_BG2::OnRoundStart"; + } + else + { + bg_updatescore "bat_b02",.Guillaume_Score,.Croix_Score; + mapannounce "bat_b02","The Croix army has won the Battle of Flavius!",1,0xFF0000; + set $@FlaviusBG2_Victory, 2; + donpcevent "Flavius_BG2::OnMatchEnd"; + } + end; + +OnCroixBreak: + donpcevent "Flavius_BG2::OnRoundStop"; + set .Croix_Loss, .Croix_Loss + 1; + if( set(.Guillaume_Score, .Guillaume_Score + 1) < 2 ) + { + bg_updatescore "bat_b02",.Guillaume_Score,.Croix_Score; + mapannounce "bat_b02","The Croix Crystal has been destroyed!",1,0xFF0000; + donpcevent "Flavius_BG2::OnRoundStart"; + } + else + { + bg_updatescore "bat_b02",.Guillaume_Score,.Croix_Score; + mapannounce "bat_b02","The Guillaume army has won the Battle of Flavius!",1,0x0000FF; + set $@FlaviusBG2_Victory, 1; + donpcevent "Flavius_BG2::OnMatchEnd"; + } + end; + +OnTimer2400000: + mapannounce "bat_b02","Battle of Flavius will ends in 5 minutes",1,0x808000; + end; +OnTimer2640000: + mapannounce "bat_b02","Battle of Flavius will ends in 1 minute",1,0x808000; + end; + +OnTimer2700000: + if( .Croix_Score > .Guillaume_Score ) + { + mapannounce "bat_b02","The Croix army has won the Battle of Flavius!",1,0xFF0000; + set $@FlaviusBG2_Victory, 2; + } + else if( .Croix_Score < .Guillaume_Score ) + { + mapannounce "bat_b02","The Guillaume army has won the Battle of Flavius!",1,0x0000FF; + set $@FlaviusBG2_Victory, 1; + } + else + { + mapannounce "bat_b02","The Battle of Flavius is over. The time is out, this is a Tie",1,0x808000; + set $@FlaviusBG2_Victory, 3; + } + +OnMatchEnd: + set $@FlaviusBG2, 2; + stopnpctimer; + donpcevent "#gfl2_respawn::OnBGStop"; + donpcevent "#cfl2_respawn::OnBGStop"; + disablenpc "Therapist in battle#fl21"; + disablenpc "Therapist in battle#fl22"; + enablenpc "Guillaume Vintenar#fl2"; + enablenpc "Croix Vintenar#fl2"; + sleep 2000; + bg_warp $@FlaviusBG2_id1,"bat_b02",390,10; + bg_warp $@FlaviusBG2_id2,"bat_b02",10,290; + sleep 3000; + mapannounce "bat_b02","Battle of Flavius will close in 1 minute!",1,0x808000; + initnpctimer; + end; + +OnTimer30000: + if( $@FlaviusBG2 == 2 ) + mapannounce "bat_b02","Battle of Flavius will close in 30 seconds!",1,0x808000; + end; +OnTimer50000: + if( $@FlaviusBG2 == 2 ) + mapannounce "bat_b02","Battle of Flavius will close in 10 seconds!",1,0x808000; + end; + +OnTimer60000: + if( $@FlaviusBG2 != 2 ) + end; +OnReset: + stopnpctimer; + donpcevent "Flavius_BG2::OnRoundStop"; + set .Guillaume_Score, 0; + set .Guillaume_Crystal, 0; + set .Guillaume_Loss, 0; + set .Croix_Score, 0; + set .Croix_Crystal, 0; + set .Croix_Loss, 0; + set .Match, 0; + set $@FlaviusBG2_Victory, 0; + // NPC's + disablenpc "Guillaume Vintenar#fl2"; + disablenpc "Croix Vintenar#fl2"; + disablenpc "Therapist in battle#fl21"; + disablenpc "Therapist in battle#fl22"; + + if( $@FlaviusBG2_id1 ) { bg_destroy $@FlaviusBG2_id1; set $@FlaviusBG2_id1, 0; } + if( $@FlaviusBG2_id2 ) { bg_destroy $@FlaviusBG2_id2; set $@FlaviusBG2_id2, 0; } + sleep 1000; + mapwarp "bat_b02","bat_room",155,150; + sleep 2000; + maprespawnguildid "bat_b02",0,3; // Just in case someone else + sleep 2000; + bg_updatescore "bat_b02",0,0; + set $@FlaviusBG2, 0; + donpcevent "Flavius_BG2::OnReadyCheck"; + end; +} + +// Battleground rewards +// ********************************************************************* + +bat_b02,390,13,5 script Guillaume Vintenar#fl2 419,{ + if( $@FlaviusBG2_Victory ) + { + if( $@FlaviusBG2_Victory == Bat_Team ) + { // Victory + mes "[Swandery]"; + mes "Blessed Guillaume!!"; + mes "Let's enjoy our glorious victory!"; + mes "" + strcharinfo(0) + ", its a sign reflecting victory"; + close2; + set .@Reward, 9; + } + else + { // + mes "[Swandery]"; + mes "You lost, but you're dedicated to this battle."; + mes "This is a reward for your great dedication by Guillaume Marollo!"; + mes "Just take this defeat a lesson, and later you would definitely learn."; + close2; + set .@Reward, 3; + } + + setquest 2070; + getitem 7829, .@Reward; + bg_leave; + warp "bat_room",155,150; + end; + } + end; +} + +bat_b02,10,293,5 script Croix Vintenar#fl2 415,{ + if( $@FlaviusBG2_Victory ) + { + if( $@FlaviusBG2_Victory == Bat_Team ) + { // Victory + mes "[Swandery]"; + mes "Blessed Croax!!"; + mes "Let's enjoy our glorious victory!"; + mes "" + strcharinfo(0) + ", its a sign reflecting victory"; + close2; + set .@Reward, 9; + } + else + { // + mes "[Swandery]"; + mes "Oh, " + strcharinfo(0) + ". Don't be sad."; + mes "Even though we didn't win, we did our best."; + mes "This is a Royal gift from Croix, and please don't forget this battle. We can win the next."; + close2; + set .@Reward, 3; + } + + setquest 2070; + getitem 7829, .@Reward; + bg_leave; + warp "bat_room",155,150; + end; + } + end; +} + +// Battleground Therapist +// ********************************************************************* + +bat_b02,390,13,5 script Therapist in battle#fl22 95,{ + mes "[Therapist in battle]"; + mes "Just close your eyes, and take a deep breathe."; + mes "You can be free from pain."; + specialeffect2 312; + close; +} + +bat_b02,10,293,5 script Therapist in battle#fl21 95,{ + mes "[Therapist in battle]"; + mes "Just close your eyes, and take a deep breathe."; + mes "You can be free from pain."; + specialeffect2 312; + close; +} + +// Battleground Respawn +// ********************************************************************* + +bat_b02,390,10,0 script #gfl2_respawn 139,{ + end; + +OnBGStart: + initnpctimer; + end; + +OnBGStop: + stopnpctimer; + end; + +OnTimer24000: + misceffect 83; + end; + +OnTimer25000: + areapercentheal "bat_b02",382,2,397,17,100,100; + areawarp "bat_b02",382,2,397,17,"bat_b02",311,224; + initnpctimer; + end; +} + +bat_b02,10,290,0 script #cfl2_respawn 139,{ + end; + +OnBGStart: + initnpctimer; + end; + +OnBGStop: + stopnpctimer; + end; + +OnTimer24000: + misceffect 83; + end; + +OnTimer25000: + areapercentheal "bat_b02",2,282,17,297,100,100; + areawarp "bat_b02",2,282,17,297,"bat_b02",87,75; + initnpctimer; + end; +} + +// Flags +// ********************************************************************* + +bat_b02,304,231,1 duplicate(Guillaume camp#bat) Guillaume camp#bat32 973 +bat_b02,319,231,1 duplicate(Guillaume camp#bat) Guillaume camp#bat33 973 +bat_b02,304,218,1 duplicate(Guillaume camp#bat) Guillaume camp#bat34 973 +bat_b02,319,218,1 duplicate(Guillaume camp#bat) Guillaume camp#bat35 973 +bat_b02,304,231,1 duplicate(Guillaume camp#bat) Guillaume camp#bat36 973 +bat_b02,304,231,1 duplicate(Guillaume camp#bat) Guillaume camp#bat37 973 +bat_b02,335,142,1 duplicate(Guillaume camp#bat) Guillaume camp#bat38 973 +bat_b02,335,157,1 duplicate(Guillaume camp#bat) Guillaume camp#bat39 973 +bat_b02,390,16,1 duplicate(Guillaume camp#bat) Guillaume camp#bat40 973 +bat_b02,292,163,1 duplicate(Guillaume camp#bat) Guillaume camp#bat41 973 +bat_b02,292,136,1 duplicate(Guillaume camp#bat) Guillaume camp#bat42 973 +bat_b02,241,185,1 duplicate(Guillaume camp#bat) Guillaume camp#bat43 973 +bat_b02,247,179,1 duplicate(Guillaume camp#bat) Guillaume camp#bat44 973 + +bat_b02,96,81,1 duplicate(Croix camp#bat) Croix camp#bat30 974 +bat_b02,96,68,1 duplicate(Croix camp#bat) Croix camp#bat31 974 +bat_b02,79,81,1 duplicate(Croix camp#bat) Croix camp#bat32 974 +bat_b02,79,68,1 duplicate(Croix camp#bat) Croix camp#bat33 974 +bat_b02,96,81,1 duplicate(Croix camp#bat) Croix camp#bat34 974 +bat_b02,96,81,1 duplicate(Croix camp#bat) Croix camp#bat35 974 +bat_b02,59,164,1 duplicate(Croix camp#bat) Croix camp#bat36 974 +bat_b02,59,137,1 duplicate(Croix camp#bat) Croix camp#bat37 974 +bat_b02,10,296,1 duplicate(Croix camp#bat) Croix camp#bat38 974 +bat_b02,110,162,1 duplicate(Croix camp#bat) Croix camp#bat39 974 +bat_b02,110,137,1 duplicate(Croix camp#bat) Croix camp#bat40 974 +bat_b02,152,120,1 duplicate(Croix camp#bat) Croix camp#bat41 974 +bat_b02,158,114,1 duplicate(Croix camp#bat) Croix camp#bat42 974 diff --git a/npc/custom/battleground/bg_kvm01.txt b/npc/custom/battleground/bg_kvm01.txt new file mode 100644 index 000000000..36c758f37 --- /dev/null +++ b/npc/custom/battleground/bg_kvm01.txt @@ -0,0 +1,378 @@ +// ============================================================================== +// BattleGround System - KvM 80~99 +// ============================================================================== + +// Registration NPC's +// ********************************************************************* + +bat_room,253,227,4 script Registration::KvM01R_Guillaume 418,{ // KvM Guillaume + end; + +OnInit: + waitingroom "Battle Station 5 Players",5,"KvM01_BG::OnGuillaumeJoin",1; + end; + +OnEnterBG: + set $@KvM01BG_id1, waitingroom2bg("bat_c01",53,128,"KvM01_BG::OnGuillaumeQuit","KvM01_BG::OnGuillaumeDie"); + end; +} + +bat_room,253,204,0 script Registration::KvM01R_Croix 414,{ // KvM Croix + end; + +OnInit: + waitingroom "Battle Station 5 Players",5,"KvM01_BG::OnCroixJoin",1; + end; + +OnEnterBG: + set $@KvM01BG_id2, waitingroom2bg("bat_c01",146,55,"KvM01_BG::OnCroixQuit","KvM01_BG::OnCroixDie"); + end; +} + +// Light Effects +// ********************************************************************* + +bat_c01,54,123,0 script #bat_c01a 111,{ + end; + +OnKvM01LightA: misceffect 54; end; +OnKvM01LightB: misceffect 55; end; +OnKvM01LightC: misceffect 56; end; +} + +bat_c01,56,125,0 duplicate(#bat_c01a) #bat_c01b 111 +bat_c01,58,127,0 duplicate(#bat_c01a) #bat_c01c 111 +bat_c01,141,56,0 duplicate(#bat_c01a) #bat_c01d 111 +bat_c01,143,58,0 duplicate(#bat_c01a) #bat_c01e 111 +bat_c01,145,60,0 duplicate(#bat_c01a) #bat_c01f 111 + +// Battleground Engine +// ********************************************************************* + +- script KvM01_BG -1,{ + end; + +OnInit: + setwall "bat_c01",54,122,6,7,0,"batc01wall_a"; + setwall "bat_c01",55,122,5,7,0,"batc01wall_b"; + setwall "bat_c01",140,56,6,7,0,"batc01wall_c"; + setwall "bat_c01",140,57,5,7,0,"batc01wall_d"; + disablenpc "TherapistKvM01a"; + disablenpc "TherapistKvM01b"; + disablenpc "VintenarKvM01a"; + disablenpc "VintenarKvM01b"; + end; + +OnGuillaumeJoin: +OnCroixJoin: + donpcevent "KvM01_BG::OnReadyCheck"; + end; + +OnGuillaumeQuit: + set BG_Delay_Tick, gettimetick(2) + 1200; +OnGuillaumeDie: + if( $@KvM01BG == 2 ) + { + set .Guillaume_Count, .Guillaume_Count - 1; + set .Croix_Score, .Croix_Score + 1; + bg_updatescore "bat_c01",.Guillaume_Score,.Croix_Score; + if( .Guillaume_Count < 1 ) donpcevent "KvM01_BG::OnCroixWin"; + } + end; + +OnCroixQuit: + set BG_Delay_Tick, gettimetick(2) + 1200; +OnCroixDie: + if( $@KvM01BG == 2 ) + { + set .Croix_Count, .Croix_Count - 1; + set .Guillaume_Score, .Guillaume_Score + 1; + bg_updatescore "bat_c01",.Guillaume_Score,.Croix_Score; + if( .Croix_Count < 1 ) donpcevent "KvM01_BG::OnGuillaumeWin"; + } + end; + +OnReadyCheck: + if( $@KvM01BG ) + end; + set .@Guillaume, getwaitingroomstate(0,"KvM01R_Guillaume"); + set .@Croix, getwaitingroomstate(0,"KvM01R_Croix"); + + if( .@Guillaume < 5 || .@Croix < 5 ) + { + if( .@Guillaume > 3 && .@Croix > 3 && !agitcheck() && !agitcheck2() && $@KvM_Flood < gettimetick(2) ) + { + announce "Battleground -- Kreiger Von Midgard [80-99] G: " + .@Guillaume + "/5, C: " + .@Croix + "/5",0,0x696969; + set $@KvM_Flood, gettimetick(2) + 15; + } + else + mapannounce "bat_room","Battleground -- Kreiger Von Midgard [80-99] G: " + .@Guillaume + "/5, C: " + .@Croix + "/5",1,0x696969; + end; + } + + set $@KvM01BG, 1; // Starting + donpcevent "KvM01R_Croix::OnEnterBG"; + donpcevent "KvM01R_Guillaume::OnEnterBG"; + donpcevent "KvM01_BG::OnStart"; + end; + +OnStart: + announce "Battleground -- Kreiger Von Midgard [80-99] has started!",0,0x696969; + enablenpc "TherapistKvM01a"; + enablenpc "TherapistKvM01b"; + disablenpc "VintenarKvM01a"; + disablenpc "VintenarKvM01b"; + set $@KvM01BG_Victory, 0; + sleep 2000; + // Warp Teams + bg_warp $@KvM01BG_id1,"bat_c01",53,128; + bg_warp $@KvM01BG_id2,"bat_c01",146,55; + // ScoreBoard + set .Guillaume_Score, 0; + set .Croix_Score, 0; + initnpctimer; + end; + +OnTimer5000: + areapercentheal "bat_c01",50,123,58,131,100,100; + areapercentheal "bat_c01",141,52,149,60,100,100; + mapannounce "bat_c01","The Battle will start in 25 seconds!!",1,0x696969; + end; + +OnTimer26000: + mapannounce "bat_c01","The Battle will start in 4 seconds!!",1,0x696969; + end; + +OnTimer27000: + donpcevent "::OnKvM01LightA"; + end; + +OnTimer28000: + donpcevent "::OnKvM01LightB"; + end; + +OnTimer29000: + donpcevent "::OnKvM01LightC"; + end; + +OnTimer30000: + // Team Members + set .Guillaume_Count, bg_get_data($@KvM01BG_id1, 0); + set .Croix_Count, bg_get_data($@KvM01BG_id2, 0); + if( .Guillaume_Count < 5 || .Croix_Count < 5 ) + { + set $@KvM01BG_Victory, 3; + set $@KvM01BG, 3; + mapannounce "bat_c01","There are not enough players to start the battle",1,0x696969; + stopnpctimer; + sleep 2000; + donpcevent "KvM01_BG::OnStop"; + end; + } + + set $@KvM01BG, 2; // Playing + areapercentheal "bat_c01",50,123,58,131,100,100; + bg_warp $@KvM01BG_id1,"bat_c01",62,119; + areapercentheal "bat_c01",141,52,149,60,100,100; + bg_warp $@KvM01BG_id2,"bat_c01",137,64; + end; + +OnTimer32000: + mapannounce "bat_c01","The Battle of Kreiger Von Midgard has begun!!",1,0x696969; + end; + +OnTimer300000: + mapannounce "bat_c01","The Battle will ends in 30 seconds!!",1,0x696969; + end; + +OnTimer330000: + if( .Croix_Count > .Guillaume_Count ) + donpcevent "KvM01_BG::OnCroixWin"; + else if( .Croix_Count < .Guillaume_Count ) + donpcevent "KvM01_BG::OnGuillaumeWin"; + else + { // Draw Game + set $@KvM01BG, 3; + set $@KvM01BG_Victory, 3; + + stopnpctimer; + sleep 2000; + mapannounce "bat_c01","The time is out! This is a Tie...",1,0x696969; + donpcevent "KvM01_BG::OnStop"; + } + end; + +OnGuillaumeWin: + set $@KvM01BG, 3; + set $@KvM01BG_Victory, 1; + + stopnpctimer; + sleep 2000; + mapannounce "bat_c01","The Guillaume Army has won the Battle of Kreiger Von Midgard",1,0x0000FF; + donpcevent "KvM01_BG::OnStop"; + end; + +OnCroixWin: + set $@KvM01BG, 3; + set $@KvM01BG_Victory, 2; + + stopnpctimer; + sleep 2000; + mapannounce "bat_c01","The Croix Army has won the Battle of Kreiger Von Midgard",1,0xFF0000; + donpcevent "KvM01_BG::OnStop"; + end; + +OnStop: + disablenpc "TherapistKvM01a"; + disablenpc "TherapistKvM01b"; + enablenpc "VintenarKvM01a"; + enablenpc "VintenarKvM01b"; + // Warp Teams + bg_warp $@KvM01BG_id1,"bat_c01",53,128; + bg_warp $@KvM01BG_id2,"bat_c01",146,55; + donpcevent "KvM01_BG_Out::OnBegin"; + end; + +OnReset: + stopnpctimer; + stopnpctimer "KvM01_BG_Out"; + set .Croix_Count, 0; + set .Guillaume_Count, 0; + set .Croix_Score, 0; + set .Guillaume_Score, 0; + set $@KvM01BG_Victory, 0; + if( $@KvM01BG_id1 ) { bg_destroy $@KvM01BG_id1; set $@KvM01BG_id1, 0; } + if( $@KvM01BG_id2 ) { bg_destroy $@KvM01BG_id2; set $@KvM01BG_id2, 0; } + disablenpc "TherapistKvM01a"; + disablenpc "TherapistKvM01b"; + disablenpc "VintenarKvM01a"; + disablenpc "VintenarKvM01b"; + sleep 1000; + mapwarp "bat_c01","bat_room",155,150; + sleep 2000; + maprespawnguildid "bat_c01",0,3; // Just in case someone else + bg_updatescore "bat_c01",0,0; + sleep 2000; + set $@KvM01BG, 0; + donpcevent "KvM01_BG::OnReadyCheck"; // Maybe a game is ready to start + end; +} + +- script KvM01_BG_Out -1,{ + end; + +OnBegin: + initnpctimer; + end; + +OnTimer3000: + mapannounce "bat_c01","Battle of Kreiger Von Midgard will close in 1 minute!",1,0x696969; + end; +OnTimer30000: + mapannounce "bat_c01","Battle of Kreiger Von Midgard will close in 30 seconds!",1,0x696969; + end; +OnTimer50000: + mapannounce "bat_c01","Battle of Kreiger Von Midgard will close in 10 seconds!",1,0x696969; + end; +OnTimer60000: + donpcevent "KvM01_BG::OnReset"; + end; +} + +// Battleground Therapist +// ********************************************************************* + +bat_c01,51,130,5 script Therapist in battle::TherapistKvM01a 95,{ + mes "[Therapist in battle]"; + mes "Just close your eyes, and take a deep breathe."; + mes "You can be free from pain."; + specialeffect2 312; + close; +} + +bat_c01,148,53,1 script Therapist in battle::TherapistKvM01b 95,{ + mes "[Therapist in battle]"; + mes "Just close your eyes, and take a deep breathe."; + mes "You can be free from pain."; + specialeffect2 312; + close; +} + +// Battleground rewards +// ********************************************************************* + +bat_c01,51,130,5 script Guillaume Vintenar::VintenarKvM01a 419,{ + if( $@KvM01BG_Victory ) + { + if( $@KvM01BG_Victory == 3 ) + { + setquest 6025; + bg_leave; + warp "bat_room",155,150; + end; + } + else if( $@KvM01BG_Victory == Bat_Team ) + { // Victory + set .@Reward, 5; + mes "[Swandery]"; + mes "Blessed Guillaume!!"; + mes "Let's enjoy our glorious victory!"; + mes "" + strcharinfo(0) + ", its a sign reflecting victory"; + close2; + } + else + { // + set .@Reward, 1; + mes "[Swandery]"; + mes "You lost, but you're dedicated to this battle."; + mes "This is a reward for your great dedication by Guillaume Marollo!"; + mes "Just take this defeat a lesson, and later you would definitely learn."; + close2; + } + + setquest 6025; + getitem 7773, .@Reward; + bg_leave; + warp "bat_room",155,150; + end; + } + end; +} + +bat_c01,148,53,1 script Croix Vintenar::VintenarKvM01b 415,{ + if( $@KvM01BG_Victory ) + { + if( $@KvM01BG_Victory == 3 ) + { + setquest 6025; + bg_leave; + warp "bat_room",155,150; + end; + } + else if( $@KvM01BG_Victory == Bat_Team ) + { // Victory + set .@Reward, 5; + mes "[Swandery]"; + mes "Blessed Croax!!"; + mes "Let's enjoy our glorious victory!"; + mes "" + strcharinfo(0) + ", its a sign reflecting victory"; + close2; + } + else + { // + set .@Reward, 1; + mes "[Swandery]"; + mes "Oh, " + strcharinfo(0) + ". Don't be sad."; + mes "Even though we didn't win, we did our best."; + mes "This is a Royal gift from Croix, and please don't forget this battle. We can win the next."; + close2; + } + + setquest 6025; + getitem 7773, .@Reward; + bg_leave; + warp "bat_room",155,150; + end; + } + end; +} diff --git a/npc/custom/battleground/bg_kvm02.txt b/npc/custom/battleground/bg_kvm02.txt new file mode 100644 index 000000000..5bfbba328 --- /dev/null +++ b/npc/custom/battleground/bg_kvm02.txt @@ -0,0 +1,378 @@ +// ============================================================================== +// BattleGround System - KvM 60~79 +// ============================================================================== + +// Registration NPC's +// ********************************************************************* + +bat_room,225,227,4 script Registration::KvM02R_Guillaume 418,{ // KvM Guillaume + end; + +OnInit: + waitingroom "Battle Station 5 Players",5,"KvM02_BG::OnGuillaumeJoin",1; + end; + +OnEnterBG: + set $@KvM02BG_id1, waitingroom2bg("bat_c02",53,128,"KvM02_BG::OnGuillaumeQuit","KvM02_BG::OnGuillaumeDie"); + end; +} + +bat_room,225,204,0 script Registration::KvM02R_Croix 414,{ // KvM Croix + end; + +OnInit: + waitingroom "Battle Station 5 Players",5,"KvM02_BG::OnCroixJoin",1; + end; + +OnEnterBG: + set $@KvM02BG_id2, waitingroom2bg("bat_c02",146,55,"KvM02_BG::OnCroixQuit","KvM02_BG::OnCroixDie"); + end; +} + +// Light Effects +// ********************************************************************* + +bat_c02,54,123,0 script #bat_c02a 111,{ + end; + +OnKvM02LightA: misceffect 54; end; +OnKvM02LightB: misceffect 55; end; +OnKvM02LightC: misceffect 56; end; +} + +bat_c02,56,125,0 duplicate(#bat_c02a) #bat_c02b 111 +bat_c02,58,127,0 duplicate(#bat_c02a) #bat_c02c 111 +bat_c02,141,56,0 duplicate(#bat_c02a) #bat_c02d 111 +bat_c02,143,58,0 duplicate(#bat_c02a) #bat_c02e 111 +bat_c02,145,60,0 duplicate(#bat_c02a) #bat_c02f 111 + +// Battleground Engine +// ********************************************************************* + +- script KvM02_BG -1,{ + end; + +OnInit: + setwall "bat_c02",54,122,6,7,0,"batc02wall_a"; + setwall "bat_c02",55,122,5,7,0,"batc02wall_b"; + setwall "bat_c02",140,56,6,7,0,"batc02wall_c"; + setwall "bat_c02",140,57,5,7,0,"batc02wall_d"; + disablenpc "TherapistKvM02a"; + disablenpc "TherapistKvM02b"; + disablenpc "VintenarKvM02a"; + disablenpc "VintenarKvM02b"; + end; + +OnGuillaumeJoin: +OnCroixJoin: + donpcevent "KvM02_BG::OnReadyCheck"; + end; + +OnGuillaumeQuit: + set BG_Delay_Tick, gettimetick(2) + 1200; +OnGuillaumeDie: + if( $@KvM02BG == 2 ) + { + set .Guillaume_Count, .Guillaume_Count - 1; + set .Croix_Score, .Croix_Score + 1; + bg_updatescore "bat_c02",.Guillaume_Score,.Croix_Score; + if( .Guillaume_Count < 1 ) donpcevent "KvM02_BG::OnCroixWin"; + } + end; + +OnCroixQuit: + set BG_Delay_Tick, gettimetick(2) + 1200; +OnCroixDie: + if( $@KvM02BG == 2 ) + { + set .Croix_Count, .Croix_Count - 1; + set .Guillaume_Score, .Guillaume_Score + 1; + bg_updatescore "bat_c02",.Guillaume_Score,.Croix_Score; + if( .Croix_Count < 1 ) donpcevent "KvM02_BG::OnGuillaumeWin"; + } + end; + +OnReadyCheck: + if( $@KvM02BG ) + end; + set .@Guillaume, getwaitingroomstate(0,"KvM02R_Guillaume"); + set .@Croix, getwaitingroomstate(0,"KvM02R_Croix"); + + if( .@Guillaume < 5 || .@Croix < 5 ) + { + if( .@Guillaume > 3 && .@Croix > 3 && !agitcheck() && !agitcheck2() && $@KvM_Flood < gettimetick(2) ) + { + announce "Battleground -- Kreiger Von Midgard [60-79] G: " + .@Guillaume + "/5, C: " + .@Croix + "/5",0,0x808080; + set $@KvM_Flood, gettimetick(2) + 15; + } + else + mapannounce "bat_room","Battleground -- Kreiger Von Midgard [60-79] G: " + .@Guillaume + "/5, C: " + .@Croix + "/5",1,0x808080; + end; + } + + set $@KvM02BG, 1; // Starting + donpcevent "KvM02R_Croix::OnEnterBG"; + donpcevent "KvM02R_Guillaume::OnEnterBG"; + donpcevent "KvM02_BG::OnStart"; + end; + +OnStart: + announce "Battleground -- Kreiger Von Midgard [60-79] has started!",0,0x808080; + enablenpc "TherapistKvM02a"; + enablenpc "TherapistKvM02b"; + disablenpc "VintenarKvM02a"; + disablenpc "VintenarKvM02b"; + set $@KvM02BG_Victory, 0; + sleep 2000; + // Warp Teams + bg_warp $@KvM02BG_id1,"bat_c02",53,128; + bg_warp $@KvM02BG_id2,"bat_c02",146,55; + // ScoreBoard + set .Guillaume_Score, 0; + set .Croix_Score, 0; + initnpctimer; + end; + +OnTimer5000: + areapercentheal "bat_c02",50,123,58,131,100,100; + areapercentheal "bat_c02",141,52,149,60,100,100; + mapannounce "bat_c02","The Battle will start in 25 seconds!!",1,0x808080; + end; + +OnTimer26000: + mapannounce "bat_c02","The Battle will start in 4 seconds!!",1,0x808080; + end; + +OnTimer27000: + donpcevent "::OnKvM02LightA"; + end; + +OnTimer28000: + donpcevent "::OnKvM02LightB"; + end; + +OnTimer29000: + donpcevent "::OnKvM02LightC"; + end; + +OnTimer30000: + // Team Members + set .Guillaume_Count, bg_get_data($@KvM02BG_id1, 0); + set .Croix_Count, bg_get_data($@KvM02BG_id2, 0); + if( .Guillaume_Count < 5 || .Croix_Count < 5 ) + { + set $@KvM02BG_Victory, 3; + set $@KvM02BG, 3; + mapannounce "bat_c02","There are not enough players to start the battle",1,0x808080; + stopnpctimer; + sleep 2000; + donpcevent "KvM02_BG::OnStop"; + end; + } + + set $@KvM02BG, 2; // Playing + areapercentheal "bat_c02",50,123,58,131,100,100; + bg_warp $@KvM02BG_id1,"bat_c02",62,119; + areapercentheal "bat_c02",141,52,149,60,100,100; + bg_warp $@KvM02BG_id2,"bat_c02",137,64; + end; + +OnTimer32000: + mapannounce "bat_c02","The Battle of Kreiger Von Midgard has begun!!",1,0x808080; + end; + +OnTimer300000: + mapannounce "bat_c02","The Battle will ends in 30 seconds!!",1,0x808080; + end; + +OnTimer330000: + if( .Croix_Count > .Guillaume_Count ) + donpcevent "KvM02_BG::OnCroixWin"; + else if( .Croix_Count < .Guillaume_Count ) + donpcevent "KvM02_BG::OnGuillaumeWin"; + else + { // Draw Game + set $@KvM02BG, 3; + set $@KvM02BG_Victory, 3; + + stopnpctimer; + sleep 2000; + mapannounce "bat_c02","The time is out! This is a Tie...",1,0x808080; + donpcevent "KvM02_BG::OnStop"; + } + end; + +OnGuillaumeWin: + set $@KvM02BG, 3; + set $@KvM02BG_Victory, 1; + + stopnpctimer; + sleep 2000; + mapannounce "bat_c02","The Guillaume Army has won the Battle of Kreiger Von Midgard",1,0x0000FF; + donpcevent "KvM02_BG::OnStop"; + end; + +OnCroixWin: + set $@KvM02BG, 3; + set $@KvM02BG_Victory, 2; + + stopnpctimer; + sleep 2000; + mapannounce "bat_c02","The Croix Army has won the Battle of Kreiger Von Midgard",1,0xFF0000; + donpcevent "KvM02_BG::OnStop"; + end; + +OnStop: + disablenpc "TherapistKvM02a"; + disablenpc "TherapistKvM02b"; + enablenpc "VintenarKvM02a"; + enablenpc "VintenarKvM02b"; + // Warp Teams + bg_warp $@KvM02BG_id1,"bat_c02",53,128; + bg_warp $@KvM02BG_id2,"bat_c02",146,55; + donpcevent "KvM02_BG_Out::OnBegin"; + end; + +OnReset: + stopnpctimer; + stopnpctimer "KvM02_BG_Out"; + set .Croix_Count, 0; + set .Guillaume_Count, 0; + set .Croix_Score, 0; + set .Guillaume_Score, 0; + set $@KvM02BG_Victory, 0; + if( $@KvM02BG_id1 ) { bg_destroy $@KvM02BG_id1; set $@KvM02BG_id1, 0; } + if( $@KvM02BG_id2 ) { bg_destroy $@KvM02BG_id2; set $@KvM02BG_id2, 0; } + disablenpc "TherapistKvM02a"; + disablenpc "TherapistKvM02b"; + disablenpc "VintenarKvM02a"; + disablenpc "VintenarKvM02b"; + sleep 1000; + mapwarp "bat_c02","bat_room",155,150; + sleep 2000; + maprespawnguildid "bat_c02",0,3; // Just in case someone else + bg_updatescore "bat_c02",0,0; + sleep 2000; + set $@KvM02BG, 0; + donpcevent "KvM02_BG::OnReadyCheck"; // Maybe a game is ready to start + end; +} + +- script KvM02_BG_Out -1,{ + end; + +OnBegin: + initnpctimer; + end; + +OnTimer3000: + mapannounce "bat_c02","Battle of Kreiger Von Midgard will close in 1 minute!",1,0x808080; + end; +OnTimer30000: + mapannounce "bat_c02","Battle of Kreiger Von Midgard will close in 30 seconds!",1,0x808080; + end; +OnTimer50000: + mapannounce "bat_c02","Battle of Kreiger Von Midgard will close in 10 seconds!",1,0x808080; + end; +OnTimer60000: + donpcevent "KvM02_BG::OnReset"; + end; +} + +// Battleground Therapist +// ********************************************************************* + +bat_c02,51,130,5 script Therapist in battle::TherapistKvM02a 95,{ + mes "[Therapist in battle]"; + mes "Just close your eyes, and take a deep breathe."; + mes "You can be free from pain."; + specialeffect2 312; + close; +} + +bat_c02,148,53,1 script Therapist in battle::TherapistKvM02b 95,{ + mes "[Therapist in battle]"; + mes "Just close your eyes, and take a deep breathe."; + mes "You can be free from pain."; + specialeffect2 312; + close; +} + +// Battleground rewards +// ********************************************************************* + +bat_c02,51,130,5 script Guillaume Vintenar::VintenarKvM02a 419,{ + if( $@KvM02BG_Victory ) + { + if( $@KvM02BG_Victory == 3 ) + { + setquest 6025; + bg_leave; + warp "bat_room",155,150; + end; + } + else if( $@KvM02BG_Victory == Bat_Team ) + { // Victory + set .@Reward, 3; + mes "[Swandery]"; + mes "Blessed Guillaume!!"; + mes "Let's enjoy our glorious victory!"; + mes "" + strcharinfo(0) + ", its a sign reflecting victory"; + close2; + } + else + { // + set .@Reward, 1; + mes "[Swandery]"; + mes "You lost, but you're dedicated to this battle."; + mes "This is a reward for your great dedication by Guillaume Marollo!"; + mes "Just take this defeat a lesson, and later you would definitely learn."; + close2; + } + + setquest 6025; + getitem 7773, .@Reward; + bg_leave; + warp "bat_room",155,150; + end; + } + end; +} + +bat_c02,148,53,1 script Croix Vintenar::VintenarKvM02b 415,{ + if( $@KvM02BG_Victory ) + { + if( $@KvM02BG_Victory == 3 ) + { + setquest 6025; + bg_leave; + warp "bat_room",155,150; + end; + } + else if( $@KvM02BG_Victory == Bat_Team ) + { // Victory + set .@Reward, 3; + mes "[Swandery]"; + mes "Blessed Croax!!"; + mes "Let's enjoy our glorious victory!"; + mes "" + strcharinfo(0) + ", its a sign reflecting victory"; + close2; + } + else + { // + set .@Reward, 1; + mes "[Swandery]"; + mes "Oh, " + strcharinfo(0) + ". Don't be sad."; + mes "Even though we didn't win, we did our best."; + mes "This is a Royal gift from Croix, and please don't forget this battle. We can win the next."; + close2; + } + + setquest 6025; + getitem 7773, .@Reward; + bg_leave; + warp "bat_room",155,150; + end; + } + end; +} diff --git a/npc/custom/battleground/bg_kvm03.txt b/npc/custom/battleground/bg_kvm03.txt new file mode 100644 index 000000000..6efa99e4c --- /dev/null +++ b/npc/custom/battleground/bg_kvm03.txt @@ -0,0 +1,378 @@ +// ============================================================================== +// BattleGround System - KvM 1~59 +// ============================================================================== + +// Registration NPC's +// ********************************************************************* + +bat_room,197,227,4 script Registration::KvM03R_Guillaume 418,{ // KvM Guillaume + end; + +OnInit: + waitingroom "Battle Station 5 Players",5,"KvM03_BG::OnGuillaumeJoin",1; + end; + +OnEnterBG: + set $@KvM03BG_id1, waitingroom2bg("bat_c03",53,128,"KvM03_BG::OnGuillaumeQuit","KvM03_BG::OnGuillaumeDie"); + end; +} + +bat_room,197,204,0 script Registration::KvM03R_Croix 414,{ // KvM Croix + end; + +OnInit: + waitingroom "Battle Station 5 Players",5,"KvM03_BG::OnCroixJoin",1; + end; + +OnEnterBG: + set $@KvM03BG_id2, waitingroom2bg("bat_c03",146,55,"KvM03_BG::OnCroixQuit","KvM03_BG::OnCroixDie"); + end; +} + +// Light Effects +// ********************************************************************* + +bat_c03,54,123,0 script #bat_c03a 111,{ + end; + +OnKvM03LightA: misceffect 54; end; +OnKvM03LightB: misceffect 55; end; +OnKvM03LightC: misceffect 56; end; +} + +bat_c03,56,125,0 duplicate(#bat_c03a) #bat_c03b 111 +bat_c03,58,127,0 duplicate(#bat_c03a) #bat_c03c 111 +bat_c03,141,56,0 duplicate(#bat_c03a) #bat_c03d 111 +bat_c03,143,58,0 duplicate(#bat_c03a) #bat_c03e 111 +bat_c03,145,60,0 duplicate(#bat_c03a) #bat_c03f 111 + +// Battleground Engine +// ********************************************************************* + +- script KvM03_BG -1,{ + end; + +OnInit: + setwall "bat_c03",54,122,6,7,0,"batc03wall_a"; + setwall "bat_c03",55,122,5,7,0,"batc03wall_b"; + setwall "bat_c03",140,56,6,7,0,"batc03wall_c"; + setwall "bat_c03",140,57,5,7,0,"batc03wall_d"; + disablenpc "TherapistKvM03a"; + disablenpc "TherapistKvM03b"; + disablenpc "VintenarKvM03a"; + disablenpc "VintenarKvM03b"; + end; + +OnGuillaumeJoin: +OnCroixJoin: + donpcevent "KvM03_BG::OnReadyCheck"; + end; + +OnGuillaumeQuit: + set BG_Delay_Tick, gettimetick(2) + 1200; +OnGuillaumeDie: + if( $@KvM03BG == 2 ) + { + set .Guillaume_Count, .Guillaume_Count - 1; + set .Croix_Score, .Croix_Score + 1; + bg_updatescore "bat_c03",.Guillaume_Score,.Croix_Score; + if( .Guillaume_Count < 1 ) donpcevent "KvM03_BG::OnCroixWin"; + } + end; + +OnCroixQuit: + set BG_Delay_Tick, gettimetick(2) + 1200; +OnCroixDie: + if( $@KvM03BG == 2 ) + { + set .Croix_Count, .Croix_Count - 1; + set .Guillaume_Score, .Guillaume_Score + 1; + bg_updatescore "bat_c03",.Guillaume_Score,.Croix_Score; + if( .Croix_Count < 1 ) donpcevent "KvM03_BG::OnGuillaumeWin"; + } + end; + +OnReadyCheck: + if( $@KvM03BG ) + end; + set .@Guillaume, getwaitingroomstate(0,"KvM03R_Guillaume"); + set .@Croix, getwaitingroomstate(0,"KvM03R_Croix"); + + if( .@Guillaume < 5 || .@Croix < 5 ) + { + if( .@Guillaume > 3 && .@Croix > 3 && !agitcheck() && !agitcheck2() && $@KvM_Flood < gettimetick(2) ) + { + announce "Battleground -- Kreiger Von Midgard [1-59] G: " + .@Guillaume + "/5, C: " + .@Croix + "/5",0,0xC0C0C0; + set $@KvM_Flood, gettimetick(2) + 15; + } + else + mapannounce "bat_room","Battleground -- Kreiger Von Midgard [1-59] G: " + .@Guillaume + "/5, C: " + .@Croix + "/5",1,0xC0C0C0; + end; + } + + set $@KvM03BG, 1; // Starting + donpcevent "KvM03R_Croix::OnEnterBG"; + donpcevent "KvM03R_Guillaume::OnEnterBG"; + donpcevent "KvM03_BG::OnStart"; + end; + +OnStart: + announce "Battleground -- Kreiger Von Midgard [1-59] has started!",0,0xC0C0C0; + enablenpc "TherapistKvM03a"; + enablenpc "TherapistKvM03b"; + disablenpc "VintenarKvM03a"; + disablenpc "VintenarKvM03b"; + set $@KvM03BG_Victory, 0; + sleep 2000; + // Warp Teams + bg_warp $@KvM03BG_id1,"bat_c03",53,128; + bg_warp $@KvM03BG_id2,"bat_c03",146,55; + // ScoreBoard + set .Guillaume_Score, 0; + set .Croix_Score, 0; + initnpctimer; + end; + +OnTimer5000: + areapercentheal "bat_c03",50,123,58,131,100,100; + areapercentheal "bat_c03",141,52,149,60,100,100; + mapannounce "bat_c03","The Battle will start in 25 seconds!!",1,0xC0C0C0; + end; + +OnTimer26000: + mapannounce "bat_c03","The Battle will start in 4 seconds!!",1,0xC0C0C0; + end; + +OnTimer27000: + donpcevent "::OnKvM03LightA"; + end; + +OnTimer28000: + donpcevent "::OnKvM03LightB"; + end; + +OnTimer29000: + donpcevent "::OnKvM03LightC"; + end; + +OnTimer30000: + // Team Members + set .Guillaume_Count, bg_get_data($@KvM03BG_id1, 0); + set .Croix_Count, bg_get_data($@KvM03BG_id2, 0); + if( .Guillaume_Count < 5 || .Croix_Count < 5 ) + { + set $@KvM03BG_Victory, 3; + set $@KvM03BG, 3; + mapannounce "bat_c03","There are not enough players to start the battle",1,0xC0C0C0; + stopnpctimer; + sleep 2000; + donpcevent "KvM03_BG::OnStop"; + end; + } + + set $@KvM03BG, 2; // Playing + areapercentheal "bat_c03",50,123,58,131,100,100; + bg_warp $@KvM03BG_id1,"bat_c03",62,119; + areapercentheal "bat_c03",141,52,149,60,100,100; + bg_warp $@KvM03BG_id2,"bat_c03",137,64; + end; + +OnTimer32000: + mapannounce "bat_c03","The Battle of Kreiger Von Midgard has begun!!",1,0xC0C0C0; + end; + +OnTimer300000: + mapannounce "bat_c03","The Battle will ends in 30 seconds!!",1,0xC0C0C0; + end; + +OnTimer330000: + if( .Croix_Count > .Guillaume_Count ) + donpcevent "KvM03_BG::OnCroixWin"; + else if( .Croix_Count < .Guillaume_Count ) + donpcevent "KvM03_BG::OnGuillaumeWin"; + else + { // Draw Game + set $@KvM03BG, 3; + set $@KvM03BG_Victory, 3; + + stopnpctimer; + sleep 2000; + mapannounce "bat_c03","The time is out! This is a Tie...",1,0xC0C0C0; + donpcevent "KvM03_BG::OnStop"; + } + end; + +OnGuillaumeWin: + set $@KvM03BG, 3; + set $@KvM03BG_Victory, 1; + + stopnpctimer; + sleep 2000; + mapannounce "bat_c03","The Guillaume Army has won the Battle of Kreiger Von Midgard",1,0x0000FF; + donpcevent "KvM03_BG::OnStop"; + end; + +OnCroixWin: + set $@KvM03BG, 3; + set $@KvM03BG_Victory, 2; + + stopnpctimer; + sleep 2000; + mapannounce "bat_c03","The Croix Army has won the Battle of Kreiger Von Midgard",1,0xFF0000; + donpcevent "KvM03_BG::OnStop"; + end; + +OnStop: + disablenpc "TherapistKvM03a"; + disablenpc "TherapistKvM03b"; + enablenpc "VintenarKvM03a"; + enablenpc "VintenarKvM03b"; + // Warp Teams + bg_warp $@KvM03BG_id1,"bat_c03",53,128; + bg_warp $@KvM03BG_id2,"bat_c03",146,55; + donpcevent "KvM03_BG_Out::OnBegin"; + end; + +OnReset: + stopnpctimer; + stopnpctimer "KvM03_BG_Out"; + set .Croix_Count, 0; + set .Guillaume_Count, 0; + set .Croix_Score, 0; + set .Guillaume_Score, 0; + set $@KvM03BG_Victory, 0; + if( $@KvM03BG_id1 ) { bg_destroy $@KvM03BG_id1; set $@KvM03BG_id1, 0; } + if( $@KvM03BG_id2 ) { bg_destroy $@KvM03BG_id2; set $@KvM03BG_id2, 0; } + disablenpc "TherapistKvM03a"; + disablenpc "TherapistKvM03b"; + disablenpc "VintenarKvM03a"; + disablenpc "VintenarKvM03b"; + sleep 1000; + mapwarp "bat_c03","bat_room",155,150; + sleep 2000; + maprespawnguildid "bat_c03",0,3; // Just in case someone else + bg_updatescore "bat_c03",0,0; + sleep 2000; + set $@KvM03BG, 0; + donpcevent "KvM03_BG::OnReadyCheck"; // Maybe a game is ready to start + end; +} + +- script KvM03_BG_Out -1,{ + end; + +OnBegin: + initnpctimer; + end; + +OnTimer3000: + mapannounce "bat_c03","Battle of Kreiger Von Midgard will close in 1 minute!",1,0xC0C0C0; + end; +OnTimer30000: + mapannounce "bat_c03","Battle of Kreiger Von Midgard will close in 30 seconds!",1,0xC0C0C0; + end; +OnTimer50000: + mapannounce "bat_c03","Battle of Kreiger Von Midgard will close in 10 seconds!",1,0xC0C0C0; + end; +OnTimer60000: + donpcevent "KvM03_BG::OnReset"; + end; +} + +// Battleground Therapist +// ********************************************************************* + +bat_c03,51,130,5 script Therapist in battle::TherapistKvM03a 95,{ + mes "[Therapist in battle]"; + mes "Just close your eyes, and take a deep breathe."; + mes "You can be free from pain."; + specialeffect2 312; + close; +} + +bat_c03,148,53,1 script Therapist in battle::TherapistKvM03b 95,{ + mes "[Therapist in battle]"; + mes "Just close your eyes, and take a deep breathe."; + mes "You can be free from pain."; + specialeffect2 312; + close; +} + +// Battleground rewards +// ********************************************************************* + +bat_c03,51,130,5 script Guillaume Vintenar::VintenarKvM03a 419,{ + if( $@KvM03BG_Victory ) + { + if( $@KvM03BG_Victory == 3 ) + { + setquest 6025; + bg_leave; + warp "bat_room",155,150; + end; + } + else if( $@KvM03BG_Victory == Bat_Team ) + { // Victory + set .@Reward, 1; + mes "[Swandery]"; + mes "Blessed Guillaume!!"; + mes "Let's enjoy our glorious victory!"; + mes "" + strcharinfo(0) + ", its a sign reflecting victory"; + close2; + } + else + { // + set .@Reward, 0; + mes "[Swandery]"; + mes "You lost, but you're dedicated to this battle."; + mes "This is a reward for your great dedication by Guillaume Marollo!"; + mes "Just take this defeat a lesson, and later you would definitely learn."; + close2; + } + + setquest 6025; + getitem 7773, .@Reward; + bg_leave; + warp "bat_room",155,150; + end; + } + end; +} + +bat_c03,148,53,1 script Croix Vintenar::VintenarKvM03b 415,{ + if( $@KvM03BG_Victory ) + { + if( $@KvM03BG_Victory == 3 ) + { + setquest 6025; + bg_leave; + warp "bat_room",155,150; + end; + } + else if( $@KvM03BG_Victory == Bat_Team ) + { // Victory + set .@Reward, 1; + mes "[Swandery]"; + mes "Blessed Croax!!"; + mes "Let's enjoy our glorious victory!"; + mes "" + strcharinfo(0) + ", its a sign reflecting victory"; + close2; + } + else + { // + set .@Reward, 0; + mes "[Swandery]"; + mes "Oh, " + strcharinfo(0) + ". Don't be sad."; + mes "Even though we didn't win, we did our best."; + mes "Please don't forget this battle. We can win the next."; + close2; + } + + setquest 6025; + getitem 7773, .@Reward; + bg_leave; + warp "bat_room",155,150; + end; + } + end; +} diff --git a/npc/custom/battleground/bg_tierra_01.txt b/npc/custom/battleground/bg_tierra_01.txt new file mode 100644 index 000000000..4c65d0462 --- /dev/null +++ b/npc/custom/battleground/bg_tierra_01.txt @@ -0,0 +1,475 @@ +// ============================================================================== +// BattleGround System - Tierra Valley 1 +// ============================================================================== + +// Registration NPC's +// ********************************************************************* + +bat_room,58,227,4 script Registration::TV1R_Guillaume 418,{ + end; +OnInit: + waitingroom "Battle Station 10 Players",10,"Tierra_BG1::OnGuillaumeJoin",1; + end; +OnEnterBG: + set $@TierraBG1_id1, waitingroom2bg("bat_a01",50,374,"Tierra_BG1::OnGuillaumeQuit",""); + end; +} + +bat_room,58,204,0 script Registration::TV1R_Croix 414,{ + end; +OnInit: + waitingroom "Battle Station 10 Players",10,"Tierra_BG1::OnCroixJoin",1; + end; +OnEnterBG: + set $@TierraBG1_id2, waitingroom2bg("bat_a01",42,16,"Tierra_BG1::OnCroixQuit",""); + end; +} + +// Battleground Engine +// ********************************************************************* + +- script Tierra_BG1 -1,{ + end; + +OnInit: + disablenpc "Croix Vintenar#tv1"; + disablenpc "Guillaume Vintenar#tv1"; + disablenpc "Therapist in battle#tv11"; + disablenpc "Therapist in battle#tv12"; + end; + +OnGuillaumeQuit: +OnCroixQuit: + set BG_Delay_Tick, gettimetick(2) + 1200; + end; + +OnGuillaumeJoin: +OnCroixJoin: + if( $@TierraBG1 == 0 ) + donpcevent "Tierra_BG1::OnReadyCheck"; + end; + +OnReadyCheck: + if( $@TierraBG1 ) + end; + set .@Guillaume, getwaitingroomstate(0,"TV1R_Guillaume"); + set .@Croix, getwaitingroomstate(0,"TV1R_Croix"); + + if( .@Guillaume < 10 || .@Croix < 10 ) + { + mapannounce "bat_room","Battleground -- Tierra Valley [80-99] G: " + .@Guillaume + "/10, C: " + .@Croix + "/10",1,0xFFA500; + end; + } + + set $@TierraBG1, 1; + donpcevent "TV1R_Croix::OnEnterBG"; + donpcevent "TV1R_Guillaume::OnEnterBG"; + donpcevent "Guillaume_TV1B::OnBuild"; + donpcevent "Croix_TV1B::OnBuild"; + bg_monster $@TierraBG1_id1,"bat_a01",176,345,"Food Depot",1909,"Tierra_BG1::OnGuillaumeBreak"; + bg_monster $@TierraBG1_id2,"bat_a01",167,50,"Food Storage",1910,"Tierra_BG1::OnCroixBreak"; + bg_monster 0,"bat_a01",273,204,"Neutrality Flag",1911,"Tierra_BG1::OnNeutralBreak"; + + set .Neutral_Base, 0; + set $@TierraBG1_Victory, 0; + + set .Guardian_1, 0; + set .Guardian_2, 0; + set .Guardian_3, 0; + + enablenpc "Therapist in battle#tv11"; + enablenpc "Therapist in battle#tv12"; + disablenpc "Croix Vintenar#tv1"; + disablenpc "Guillaume Vintenar#tv1"; + // Respawner + donpcevent "#gtv1_respawn::OnBGStart"; + donpcevent "#ctv1_respawn::OnBGStart"; + donpcevent "#ntv1_respawn::OnBGStart"; + // Warp Teams + announce "Battleground -- Tierra Valley [80-99] has started!",0,0xFFA500; + bg_warp $@TierraBG1_id1,"bat_a01",353,344; + bg_warp $@TierraBG1_id2,"bat_a01",353,52; + // Final Messages + sleep 6000; + mapannounce "bat_a01","Guillaume Vintenar Axl Rose : Let's attack to burn down Croix's food storage",1,0x0000FF; + sleep 2000; + mapannounce "bat_a01","Croix Vintenar Swandery : Master of Valhalla! Let us be gifted with unfailing faith and courage",1,0xFF0000; + + initnpctimer; + end; + +OnNeutralBreak: + if( getcharid(4) == $@TierraBG1_id1 ) + { + mapannounce "bat_a01","Guillaume obtained a neurality banner, so they have an advantage.",1,0x0000FF; + bg_team_setxy $@TierraBG1_id2,42,16; + areawarp "bat_a01",52,208,61,217,"bat_a01",42,16; + } + else if( getcharid(4) == $@TierraBG1_id2 ) + { + mapannounce "bat_a01","Croix obtained a neutrality banner, so they have an advantage.",1,0xFF0000; + bg_team_setxy $@TierraBG1_id1,50,374; + areawarp "bat_a01",52,208,61,217,"bat_a01",50,374; + } + else end; + + set .Neutral_Base, getcharid(4); + bg_team_setxy .Neutral_Base,56,212; + + if( .Guardian_1 == 0 ) + set .Guardian_1, bg_monster(.Neutral_Base,"bat_a01",280,233,"Guardian",1949,"Tierra_BG1::OnGuardian1"); + else + bg_monster_set_team .Guardian_1, .Neutral_Base; + + if( .Guardian_2 == 0 ) + set .Guardian_2, bg_monster(.Neutral_Base,"bat_a01",287,203,"Guardian",1950,"Tierra_BG1::OnGuardian2"); + else + bg_monster_set_team .Guardian_2, .Neutral_Base; + + if( .Guardian_3 == 0 ) + set .Guardian_3, bg_monster(.Neutral_Base,"bat_a01",268,204,"Guardian",1949,"Tierra_BG1::OnGuardian3"); + else + bg_monster_set_team .Guardian_3, .Neutral_Base; + + sleep 10000; + if( $@TierraBG1 != 1 ) end; + + if( .Neutral_Base == $@TierraBG1_id1 ) + bg_monster .Neutral_Base,"bat_a01",273,204,"Guillaume Flag",1912,"Tierra_BG1::OnNeutralBreak"; + else if( .Neutral_Base == $@TierraBG1_id2 ) + bg_monster .Neutral_Base,"bat_a01",273,204,"Croix Flag",1913,"Tierra_BG1::OnNeutralBreak"; + end; + +OnGuardian1: set .Guardian_1, 0; end; +OnGuardian2: set .Guardian_2, 0; end; +OnGuardian3: set .Guardian_3, 0; end; + +OnGuillaumeBreak: + set $@TierraBG1_Victory, 2; + mapannounce "bat_a01","Croix Vintenar Swandery: We destroyed Guillaume's food storehouse. We won that! Wow!",1,0xFF0000; + donpcevent "Tierra_BG1::OnStop"; + end; + +OnCroixBreak: + set $@TierraBG1_Victory, 1; + mapannounce "bat_a01","Guillaume Vintenar Axl Rose: We destroyed Croix's food storehouse. We won that! Wow!",1,0x0000FF; + donpcevent "Tierra_BG1::OnStop"; + end; + +OnTimer2400000: + mapannounce "bat_a01","Battle of Tierra Gorge will ends in 5 minutes",1,0xFFA500; + end; +OnTimer2640000: + mapannounce "bat_a01","Battle of Tierra Gorge will ends in 1 minute",1,0xFFA500; + end; + +OnTimer2700000: + set $@TierraBG1_Victory, 3; // Draw Game + mapannounce "bat_a01","Battle of Tierra Gorge is over. The time is out, this is a Tie",1,0xFFA500; + donpcevent "Tierra_BG1::OnStop"; + end; + +OnStop: + set $@TierraBG1, 2; + disablenpc "Therapist in battle#tv11"; + disablenpc "Therapist in battle#tv12"; + donpcevent "#gtv1_respawn::OnBGStop"; + donpcevent "#ctv1_respawn::OnBGStop"; + donpcevent "#ntv1_respawn::OnBGStop"; + enablenpc "Croix Vintenar#tv1"; + enablenpc "Guillaume Vintenar#tv1"; + killmonster "bat_a01","Tierra_BG1::OnGuillaumeBreak"; + killmonster "bat_a01","Tierra_BG1::OnCroixBreak"; + killmonster "bat_a01","Tierra_BG1::OnNeutralBreak"; + killmonster "bat_a01","Tierra_BG1::OnGuardian1"; + killmonster "bat_a01","Tierra_BG1::OnGuardian2"; + killmonster "bat_a01","Tierra_BG1::OnGuardian3"; + stopnpctimer; + sleep 3000; + bg_warp $@TierraBG1_id1,"bat_a01",50,374; + bg_warp $@TierraBG1_id2,"bat_a01",42,16; + sleep 3000; + mapannounce "bat_a01","Battle of Tierra Gorge will close in 1 minute!",1,0xFFA500; + initnpctimer; + end; + +OnTimer30000: + if( $@TierraBG1 == 2 ) + mapannounce "bat_a01","Battle of Tierra Valley will close in 30 seconds!",1,0xFFA500; + end; +OnTimer50000: + if( $@TierraBG1 == 2 ) + mapannounce "bat_a01","Battle of Tierra Valley will close in 10 seconds!",1,0xFFA500; + end; + +OnTimer60000: + if( $@TierraBG1 != 2 ) + end; +OnReset: + stopnpctimer; + set .Neutral_Base, 0; + disablenpc "Croix Vintenar#tv1"; + disablenpc "Guillaume Vintenar#tv1"; + disablenpc "Therapist in battle#tv11"; + disablenpc "Therapist in battle#tv12"; + donpcevent "#gtv1_respawn::OnBGStop"; + donpcevent "#ctv1_respawn::OnBGStop"; + donpcevent "#ntv1_respawn::OnBGStop"; + + killmonster "bat_a01","Tierra_BG1::OnGuillaumeBreak"; + killmonster "bat_a01","Tierra_BG1::OnCroixBreak"; + killmonster "bat_a01","Tierra_BG1::OnNeutralBreak"; + killmonster "bat_a01","Tierra_BG1::OnGuardian1"; + killmonster "bat_a01","Tierra_BG1::OnGuardian2"; + killmonster "bat_a01","Tierra_BG1::OnGuardian3"; + donpcevent "Guillaume_TV1B::OnDestroy"; + donpcevent "Croix_TV1B::OnDestroy"; + + set $@TierraBG1_Victory, 0; + if( $@TierraBG1_id1 ) { bg_destroy $@TierraBG1_id1; set $@TierraBG1_id1, 0; } + if( $@TierraBG1_id2 ) { bg_destroy $@TierraBG1_id2; set $@TierraBG1_id2, 0; } + sleep 1000; + mapwarp "bat_a01","bat_room",155,150; + sleep 2000; + maprespawnguildid "bat_a01",0,3; // Just in case someone else + sleep 2000; + set $@TierraBG1, 0; + donpcevent "Tierra_BG1::OnReadyCheck"; // Maybe a game is ready to start + end; +} + +// Other Flags +// ********************************************************************* + +bat_a01,148,85,1 duplicate(Croix camp#bat) Croix camp#bat10 974 +bat_a01,155,85,1 duplicate(Croix camp#bat) Croix camp#bat11 974 +bat_a01,357,75,1 duplicate(Croix camp#bat) Croix camp#bat12 974 +bat_a01,348,74,1 duplicate(Croix camp#bat) Croix camp#bat13 974 +bat_a01,199,49,1 duplicate(Croix camp#bat) Croix camp#bat14 974 +bat_a01,168,16,1 duplicate(Croix camp#bat) Croix camp#bat15 974 +bat_a01,138,12,1 duplicate(Croix camp#bat) Croix camp#bat16 974 +bat_a01,108,35,1 duplicate(Croix camp#bat) Croix camp#bat17 974 +bat_a01,164,308,1 duplicate(Guillaume camp#bat) Guillaume camp#bat10 973 +bat_a01,157,308,1 duplicate(Guillaume camp#bat) Guillaume camp#bat11 973 +bat_a01,359,327,1 duplicate(Guillaume camp#bat) Guillaume camp#bat12 973 +bat_a01,350,326,1 duplicate(Guillaume camp#bat) Guillaume camp#bat13 973 +bat_a01,209,344,1 duplicate(Guillaume camp#bat) Guillaume camp#bat14 973 +bat_a01,173,380,1 duplicate(Guillaume camp#bat) Guillaume camp#bat15 973 +bat_a01,150,380,1 duplicate(Guillaume camp#bat) Guillaume camp#bat16 973 +bat_a01,118,357,1 duplicate(Guillaume camp#bat) Guillaume camp#bat17 973 +bat_a01,119,336,1 duplicate(Guillaume camp#bat) Guillaume camp#bat18 973 + +// Barricades +// ********************************************************************* + +- script Guillaume_TV1B -1,{ + end; + +OnBuild: + for( set .@i, 0; .@i < 16; set .@i, .@i + 1 ) + bg_monster 0,"bat_a01",170+.@i,130,"Barricade",1906,"Guillaume_TV1B::OnWall"; + + setwall "bat_a01",170,130,16,6,1,"bat_a01_g1"; + set .MyMobCount,16; + end; + +OnDestroy: + killmonster "bat_a01","Guillaume_TV1B::OnWall"; + delwall "bat_a01_g1"; + set .MyMobCount,0; + end; + +OnWall: + if( set(.MyMobCount,.MyMobCount - 1) < 1 ) + { + delwall "bat_a01_g1"; + mapannounce "bat_a01","South Gate : The Gate has been Destroy!!",1,0xFFA500; + } + end; +} + +- script Croix_TV1B -1,{ + end; + +OnBuild: + for( set .@i, 0; .@i < 16; set .@i, .@i + 1 ) + bg_monster 0,"bat_a01",186+.@i,266,"Barricade",1906,"Croix_TV1B::OnWall"; + + setwall "bat_a01",186,266,16,6,1,"bat_a01_c1"; + set .MyMobCount,16; + end; + +OnDestroy: + killmonster "bat_a01","Croix_TV1B::OnWall"; + delwall "bat_a01_c1"; + set .MyMobCount,0; + end; + +OnWall: + if( set(.MyMobCount,.MyMobCount - 1) < 1 ) + { + delwall "bat_a01_c1"; + mapannounce "bat_a01","North Gate : A Gate has been Destroy!!",1,0xFFA500; + } + end; +} + +// Battleground rewards +// ********************************************************************* + +bat_a01,45,19,3 script Croix Vintenar#tv1 415,{ + if( $@TierraBG1_Victory ) + { + if( $@TierraBG1_Victory == Bat_Team ) + { // Victory + set .@Reward, 3; + mes "[Swandery]"; + mes "Blessed Croax!!"; + mes "Let's enjoy our glorious victory!"; + mes "" + strcharinfo(0) + ", its a sign reflecting victory"; + close2; + } + else + { // + set .@Reward, 1; + mes "[Swandery]"; + mes "Oh, " + strcharinfo(0) + ". Don't be sad."; + mes "Even though we didn't win, we did our best."; + mes "This is a Royal gift from Croix, and please don't forget this battle. We can win the next."; + close2; + } + + setquest 2069; + getitem 7828, .@Reward; + bg_leave; + warp "bat_room",155,150; + end; + } + end; +} + +bat_a01,53,377,3 script Guillaume Vintenar#tv1 419,{ + if( $@TierraBG1_Victory ) + { + if( $@TierraBG1_Victory == Bat_Team ) + { // Victory + set .@Reward, 3; + mes "[Swandery]"; + mes "Blessed Guillaume!!"; + mes "Let's enjoy our glorious victory!"; + mes "" + strcharinfo(0) + ", its a sign reflecting victory"; + close2; + } + else + { // + set .@Reward, 1; + mes "[Swandery]"; + mes "You lost, but you're dedicated to this battle."; + mes "This is a reward for your great dedication by Guillaume Marollo!"; + mes "Just take this defeat a lesson, and later you would definitely learn."; + close2; + } + + setquest 2069; + getitem 7828, .@Reward; + bg_leave; + warp "bat_room",155,150; + end; + } + end; +} + +// Battleground Therapist +// ********************************************************************* + +bat_a01,60,216,3 script Ghost#tv13 950,{ + mes "[Ghost in valley]"; + mes "Boo...Boo..."; + specialeffect2 312; + close; +} + +bat_a01,53,377,3 script Therapist in battle#tv12 95,{ + mes "[Therapist in battle]"; + mes "Just close your eyes, and take a deep breathe."; + mes "You can be free from pain."; + specialeffect2 312; + close; +} + +bat_a01,45,18,3 script Therapist in battle#tv11 95,{ + mes "[Therapist in battle]"; + mes "Just close your eyes, and take a deep breathe."; + mes "You can be free from pain."; + specialeffect2 312; + close; +} + +// Battleground Respawn +// ********************************************************************* + +bat_a01,57,213,0 script #ntv1_respawn 139,{ + end; + +OnBGStart: + initnpctimer; + end; + +OnBGStop: + stopnpctimer; + end; + +OnTimer19000: + misceffect 83; + end; + +OnTimer20000: + areapercentheal "bat_a01",52,208,61,217,100,100; + areawarp "bat_a01",52,208,61,217,"bat_a01",301,208; + initnpctimer; + end; +} + +bat_a01,50,374,0 script #gtv1_respawn 139,{ + end; + +OnBGStart: + initnpctimer; + end; + +OnBGStop: + stopnpctimer; + end; + +OnTimer24000: + misceffect 83; + end; + +OnTimer25000: + areapercentheal "bat_a01",46,370,54,378,100,100; + areawarp "bat_a01",46,370,54,378,"bat_a01",354,340; + initnpctimer; + end; +} + +bat_a01,42,16,0 script #ctv1_respawn 139,{ + end; + +OnBGStart: + initnpctimer; + end; + +OnBGStop: + stopnpctimer; + end; + +OnTimer24000: + misceffect 83; + end; + +OnTimer25000: + areapercentheal "bat_a01",38,12,47,21,100,100; + areawarp "bat_a01",38,12,47,21,"bat_a01",354,57; + initnpctimer; + end; +} diff --git a/npc/custom/battleground/bg_tierra_02.txt b/npc/custom/battleground/bg_tierra_02.txt new file mode 100644 index 000000000..7f72cdb3d --- /dev/null +++ b/npc/custom/battleground/bg_tierra_02.txt @@ -0,0 +1,475 @@ +// ============================================================================== +// BattleGround System - Tierra Valley 2 +// ============================================================================== + +// Registration NPC's +// ********************************************************************* + +bat_room,114,227,4 script Registration::TV2R_Guillaume 418,{ + end; +OnInit: + waitingroom "Battle Station 10 Players",10,"Tierra_BG2::OnGuillaumeJoin",1; + end; +OnEnterBG: + set $@TierraBG2_id1, waitingroom2bg("bat_a02",50,374,"Tierra_BG2::OnGuillaumeQuit",""); + end; +} + +bat_room,114,204,0 script Registration::TV2R_Croix 414,{ + end; +OnInit: + waitingroom "Battle Station 10 Players",10,"Tierra_BG2::OnCroixJoin",1; + end; +OnEnterBG: + set $@TierraBG2_id2, waitingroom2bg("bat_a02",42,16,"Tierra_BG2::OnCroixQuit",""); + end; +} + +// Battleground Engine +// ********************************************************************* + +- script Tierra_BG2 -1,{ + end; + +OnInit: + disablenpc "Croix Vintenar#tv2"; + disablenpc "Guillaume Vintenar#tv2"; + disablenpc "Therapist in battle#tv21"; + disablenpc "Therapist in battle#tv22"; + end; + +OnGuillaumeQuit: +OnCroixQuit: + set BG_Delay_Tick, gettimetick(2) + 1200; + end; + +OnGuillaumeJoin: +OnCroixJoin: + if( $@TierraBG2 == 0 ) + donpcevent "Tierra_BG2::OnReadyCheck"; + end; + +OnReadyCheck: + if( $@TierraBG2 ) + end; + set .@Guillaume, getwaitingroomstate(0,"TV2R_Guillaume"); + set .@Croix, getwaitingroomstate(0,"TV2R_Croix"); + + if( .@Guillaume < 10 || .@Croix < 10 ) + { + mapannounce "bat_room","Battleground -- Tierra Valley [80-99] G: " + .@Guillaume + "/10, C: " + .@Croix + "/10",1,0xF4A460; + end; + } + + set $@TierraBG2, 1; + donpcevent "TV2R_Croix::OnEnterBG"; + donpcevent "TV2R_Guillaume::OnEnterBG"; + donpcevent "Guillaume_TV2B::OnBuild"; + donpcevent "Croix_TV2B::OnBuild"; + bg_monster $@TierraBG2_id1,"bat_a02",176,345,"Food Depot",1909,"Tierra_BG2::OnGuillaumeBreak"; + bg_monster $@TierraBG2_id2,"bat_a02",167,50,"Food Storage",1910,"Tierra_BG2::OnCroixBreak"; + bg_monster 0,"bat_a02",273,204,"Neutrality Flag",1911,"Tierra_BG2::OnNeutralBreak"; + + set .Neutral_Base, 0; + set $@TierraBG2_Victory, 0; + + set .Guardian_1, 0; + set .Guardian_2, 0; + set .Guardian_3, 0; + + enablenpc "Therapist in battle#tv21"; + enablenpc "Therapist in battle#tv22"; + disablenpc "Croix Vintenar#tv2"; + disablenpc "Guillaume Vintenar#tv2"; + // Respawner + donpcevent "#gtv2_respawn::OnBGStart"; + donpcevent "#ctv2_respawn::OnBGStart"; + donpcevent "#ntv2_respawn::OnBGStart"; + // Warp Teams + announce "Battleground -- Tierra Valley [80-99] has started!",0,0xF4A460; + bg_warp $@TierraBG2_id1,"bat_a02",353,344; + bg_warp $@TierraBG2_id2,"bat_a02",353,52; + // Final Messages + sleep 6000; + mapannounce "bat_a02","Guillaume Vintenar Axl Rose : Let's attack to burn down Croix's food storage",1,0x0000FF; + sleep 2000; + mapannounce "bat_a02","Croix Vintenar Swandery : Master of Valhalla! Let us be gifted with unfailing faith and courage",1,0xFF0000; + + initnpctimer; + end; + +OnNeutralBreak: + if( getcharid(4) == $@TierraBG2_id1 ) + { + mapannounce "bat_a02","Guillaume obtained a neurality banner, so they have an advantage.",1,0x0000FF; + bg_team_setxy $@TierraBG2_id2,42,16; + areawarp "bat_a02",52,208,61,217,"bat_a02",42,16; + } + else if( getcharid(4) == $@TierraBG2_id2 ) + { + mapannounce "bat_a02","Croix obtained a neutrality banner, so they have an advantage.",1,0xFF0000; + bg_team_setxy $@TierraBG2_id1,50,374; + areawarp "bat_a02",52,208,61,217,"bat_a02",50,374; + } + else end; + + set .Neutral_Base, getcharid(4); + bg_team_setxy .Neutral_Base,56,212; + + if( .Guardian_1 == 0 ) + set .Guardian_1, bg_monster(.Neutral_Base,"bat_a02",280,233,"Guardian",1949,"Tierra_BG2::OnGuardian1"); + else + bg_monster_set_team .Guardian_1, .Neutral_Base; + + if( .Guardian_2 == 0 ) + set .Guardian_2, bg_monster(.Neutral_Base,"bat_a02",287,203,"Guardian",1950,"Tierra_BG2::OnGuardian2"); + else + bg_monster_set_team .Guardian_2, .Neutral_Base; + + if( .Guardian_3 == 0 ) + set .Guardian_3, bg_monster(.Neutral_Base,"bat_a02",268,204,"Guardian",1949,"Tierra_BG2::OnGuardian3"); + else + bg_monster_set_team .Guardian_3, .Neutral_Base; + + sleep 10000; + if( $@TierraBG2 != 1 ) end; + + if( .Neutral_Base == $@TierraBG2_id1 ) + bg_monster .Neutral_Base,"bat_a02",273,204,"Guillaume Flag",1912,"Tierra_BG2::OnNeutralBreak"; + else if( .Neutral_Base == $@TierraBG2_id2 ) + bg_monster .Neutral_Base,"bat_a02",273,204,"Croix Flag",1913,"Tierra_BG2::OnNeutralBreak"; + end; + +OnGuardian1: set .Guardian_1, 0; end; +OnGuardian2: set .Guardian_2, 0; end; +OnGuardian3: set .Guardian_3, 0; end; + +OnGuillaumeBreak: + set $@TierraBG2_Victory, 2; + mapannounce "bat_a02","Croix Vintenar Swandery: We destroyed Guillaume's food storehouse. We won that! Wow!",1,0xFF0000; + donpcevent "Tierra_BG2::OnStop"; + end; + +OnCroixBreak: + set $@TierraBG2_Victory, 1; + mapannounce "bat_a02","Guillaume Vintenar Axl Rose: We destroyed Croix's food storehouse. We won that! Wow!",1,0x0000FF; + donpcevent "Tierra_BG2::OnStop"; + end; + +OnTimer2400000: + mapannounce "bat_a02","Battle of Tierra Gorge will ends in 5 minutes",1,0xF4A460; + end; +OnTimer2640000: + mapannounce "bat_a02","Battle of Tierra Gorge will ends in 1 minute",1,0xF4A460; + end; + +OnTimer2700000: + set $@TierraBG2_Victory, 3; // Draw Game + mapannounce "bat_a02","Battle of Tierra Gorge is over. The time is out, this is a Tie",1,0xF4A460; + donpcevent "Tierra_BG2::OnStop"; + end; + +OnStop: + set $@TierraBG2, 2; + disablenpc "Therapist in battle#tv21"; + disablenpc "Therapist in battle#tv22"; + donpcevent "#gtv2_respawn::OnBGStop"; + donpcevent "#ctv2_respawn::OnBGStop"; + donpcevent "#ntv2_respawn::OnBGStop"; + enablenpc "Croix Vintenar#tv2"; + enablenpc "Guillaume Vintenar#tv2"; + killmonster "bat_a02","Tierra_BG2::OnGuillaumeBreak"; + killmonster "bat_a02","Tierra_BG2::OnCroixBreak"; + killmonster "bat_a02","Tierra_BG2::OnNeutralBreak"; + killmonster "bat_a02","Tierra_BG2::OnGuardian1"; + killmonster "bat_a02","Tierra_BG2::OnGuardian2"; + killmonster "bat_a02","Tierra_BG2::OnGuardian3"; + stopnpctimer; + sleep 3000; + bg_warp $@TierraBG2_id1,"bat_a02",50,374; + bg_warp $@TierraBG2_id2,"bat_a02",42,16; + sleep 3000; + mapannounce "bat_a02","Battle of Tierra Gorge will close in 1 minute!",1,0xF4A460; + initnpctimer; + end; + +OnTimer30000: + if( $@TierraBG2 == 2 ) + mapannounce "bat_a02","Battle of Tierra Valley will close in 30 seconds!",1,0xF4A460; + end; +OnTimer50000: + if( $@TierraBG2 == 2 ) + mapannounce "bat_a02","Battle of Tierra Valley will close in 10 seconds!",1,0xF4A460; + end; + +OnTimer60000: + if( $@TierraBG2 != 2 ) + end; +OnReset: + stopnpctimer; + set .Neutral_Base, 0; + disablenpc "Croix Vintenar#tv2"; + disablenpc "Guillaume Vintenar#tv2"; + disablenpc "Therapist in battle#tv21"; + disablenpc "Therapist in battle#tv22"; + donpcevent "#gtv2_respawn::OnBGStop"; + donpcevent "#gtv2_respawn::OnBGStop"; + donpcevent "#ctv2_respawn::OnBGStop"; + + killmonster "bat_a02","Tierra_BG2::OnGuillaumeBreak"; + killmonster "bat_a02","Tierra_BG2::OnCroixBreak"; + killmonster "bat_a02","Tierra_BG2::OnNeutralBreak"; + killmonster "bat_a02","Tierra_BG2::OnGuardian1"; + killmonster "bat_a02","Tierra_BG2::OnGuardian2"; + killmonster "bat_a02","Tierra_BG2::OnGuardian3"; + donpcevent "Guillaume_TV2B::OnDestroy"; + donpcevent "Croix_TV2B::OnDestroy"; + + set $@TierraBG2_Victory, 0; + if( $@TierraBG2_id1 ) { bg_destroy $@TierraBG2_id1; set $@TierraBG2_id1, 0; } + if( $@TierraBG2_id2 ) { bg_destroy $@TierraBG2_id2; set $@TierraBG2_id2, 0; } + sleep 1000; + mapwarp "bat_a02","bat_room",155,150; + sleep 2000; + maprespawnguildid "bat_a02",0,3; // Just in case someone else + sleep 2000; + set $@TierraBG2, 0; + donpcevent "Tierra_BG2::OnReadyCheck"; // Maybe a game is ready to start + end; +} + +// Other Flags +// ********************************************************************* + +bat_a02,148,85,1 duplicate(Croix camp#bat) Croix camp#bat22 974 +bat_a02,155,85,1 duplicate(Croix camp#bat) Croix camp#bat23 974 +bat_a02,357,75,1 duplicate(Croix camp#bat) Croix camp#bat24 974 +bat_a02,348,74,1 duplicate(Croix camp#bat) Croix camp#bat25 974 +bat_a02,199,49,1 duplicate(Croix camp#bat) Croix camp#bat26 974 +bat_a02,168,16,1 duplicate(Croix camp#bat) Croix camp#bat27 974 +bat_a02,138,12,1 duplicate(Croix camp#bat) Croix camp#bat28 974 +bat_a02,108,35,1 duplicate(Croix camp#bat) Croix camp#bat29 974 +bat_a02,164,308,1 duplicate(Guillaume camp#bat) Guillaume camp#bat23 973 +bat_a02,157,308,1 duplicate(Guillaume camp#bat) Guillaume camp#bat24 973 +bat_a02,359,327,1 duplicate(Guillaume camp#bat) Guillaume camp#bat25 973 +bat_a02,350,326,1 duplicate(Guillaume camp#bat) Guillaume camp#bat26 973 +bat_a02,209,344,1 duplicate(Guillaume camp#bat) Guillaume camp#bat27 973 +bat_a02,173,380,1 duplicate(Guillaume camp#bat) Guillaume camp#bat28 973 +bat_a02,150,380,1 duplicate(Guillaume camp#bat) Guillaume camp#bat29 973 +bat_a02,118,357,1 duplicate(Guillaume camp#bat) Guillaume camp#bat30 973 +bat_a02,119,336,1 duplicate(Guillaume camp#bat) Guillaume camp#bat31 973 + +// Barricades +// ********************************************************************* + +- script Guillaume_TV2B -1,{ + end; + +OnBuild: + for( set .@i, 0; .@i < 16; set .@i, .@i + 1 ) + bg_monster 0,"bat_a02",170+.@i,130,"Barricade",1906,"Guillaume_TV2B::OnWall"; + + setwall "bat_a02",170,130,16,6,1,"bat_a02_g1"; + set .MyMobCount,16; + end; + +OnDestroy: + killmonster "bat_a02","Guillaume_TV2B::OnWall"; + delwall "bat_a02_g1"; + set .MyMobCount,0; + end; + +OnWall: + if( set(.MyMobCount,.MyMobCount - 1) < 1 ) + { + delwall "bat_a02_g1"; + mapannounce "bat_a02","South Gate : The Gate has been Destroy!!",1,0xF4A460; + } + end; +} + +- script Croix_TV2B -1,{ + end; + +OnBuild: + for( set .@i, 0; .@i < 16; set .@i, .@i + 1 ) + bg_monster 0,"bat_a02",186+.@i,266,"Barricade",1906,"Croix_TV2B::OnWall"; + + setwall "bat_a02",186,266,16,6,1,"bat_a02_c1"; + set .MyMobCount,16; + end; + +OnDestroy: + killmonster "bat_a02","Croix_TV2B::OnWall"; + delwall "bat_a02_c1"; + set .MyMobCount,0; + end; + +OnWall: + if( set(.MyMobCount,.MyMobCount - 1) < 1 ) + { + delwall "bat_a02_c1"; + mapannounce "bat_a02","North Gate : A Gate has been Destroy!!",1,0xF4A460; + } + end; +} + +// Battleground rewards +// ********************************************************************* + +bat_a02,45,19,3 script Croix Vintenar#tv2 415,{ + if( $@TierraBG2_Victory ) + { + if( $@TierraBG2_Victory == Bat_Team ) + { // Victory + set .@Reward, 3; + mes "[Swandery]"; + mes "Blessed Croax!!"; + mes "Let's enjoy our glorious victory!"; + mes "" + strcharinfo(0) + ", its a sign reflecting victory"; + close2; + } + else + { // + set .@Reward, 1; + mes "[Swandery]"; + mes "Oh, " + strcharinfo(0) + ". Don't be sad."; + mes "Even though we didn't win, we did our best."; + mes "This is a Royal gift from Croix, and please don't forget this battle. We can win the next."; + close2; + } + + setquest 2069; + getitem 7828, .@Reward; + bg_leave; + warp "bat_room",155,150; + end; + } + end; +} + +bat_a02,53,377,3 script Guillaume Vintenar#tv2 419,{ + if( $@TierraBG2_Victory ) + { + if( $@TierraBG2_Victory == Bat_Team ) + { // Victory + set .@Reward, 3; + mes "[Swandery]"; + mes "Blessed Guillaume!!"; + mes "Let's enjoy our glorious victory!"; + mes "" + strcharinfo(0) + ", its a sign reflecting victory"; + close2; + } + else + { // + set .@Reward, 1; + mes "[Swandery]"; + mes "You lost, but you're dedicated to this battle."; + mes "This is a reward for your great dedication by Guillaume Marollo!"; + mes "Just take this defeat a lesson, and later you would definitely learn."; + close2; + } + + setquest 2069; + getitem 7828, .@Reward; + bg_leave; + warp "bat_room",155,150; + end; + } + end; +} + +// Battleground Therapist +// ********************************************************************* + +bat_a02,60,216,3 script Ghost#tv23 950,{ + mes "[Ghost in valley]"; + mes "Boo...Boo..."; + specialeffect2 312; + close; +} + +bat_a02,53,377,3 script Therapist in battle#tv22 95,{ + mes "[Therapist in battle]"; + mes "Just close your eyes, and take a deep breathe."; + mes "You can be free from pain."; + specialeffect2 312; + close; +} + +bat_a02,45,18,3 script Therapist in battle#tv21 95,{ + mes "[Therapist in battle]"; + mes "Just close your eyes, and take a deep breathe."; + mes "You can be free from pain."; + specialeffect2 312; + close; +} + +// Battleground Respawn +// ********************************************************************* + +bat_a02,57,213,0 script #ntv2_respawn 139,{ + end; + +OnBGStart: + initnpctimer; + end; + +OnBGStop: + stopnpctimer; + end; + +OnTimer19000: + misceffect 83; + end; + +OnTimer20000: + areapercentheal "bat_a02",52,208,61,217,100,100; + areawarp "bat_a02",52,208,61,217,"bat_a02",301,208; + initnpctimer; + end; +} + +bat_a02,50,374,0 script #gtv2_respawn 139,{ + end; + +OnBGStart: + initnpctimer; + end; + +OnBGStop: + stopnpctimer; + end; + +OnTimer24000: + misceffect 83; + end; + +OnTimer25000: + areapercentheal "bat_a02",46,370,54,378,100,100; + areawarp "bat_a02",46,370,54,378,"bat_a02",354,340; + initnpctimer; + end; +} + +bat_a02,42,16,0 script #ctv2_respawn 139,{ + end; + +OnBGStart: + initnpctimer; + end; + +OnBGStop: + stopnpctimer; + end; + +OnTimer24000: + misceffect 83; + end; + +OnTimer25000: + areapercentheal "bat_a02",38,12,47,21,100,100; + areawarp "bat_a02",38,12,47,21,"bat_a02",354,57; + initnpctimer; + end; +} diff --git a/npc/custom/breeder.txt b/npc/custom/breeder.txt new file mode 100644 index 000000000..de4460cd3 --- /dev/null +++ b/npc/custom/breeder.txt @@ -0,0 +1,50 @@ +//===== rAthena Script ======================================= +//= Universal Rental NPC +//===== By: ================================================== +//= Euphy +//===== Current Version: ===================================== +//= 1.0 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= One-click automatic mount rentals. +//============================================================ + +prontera,124,201,1 script Universal Rental NPC 726,{ + if (ismounting()) { + message strcharinfo(0),"You must first remove your mount."; + close; } + else if ((eaclass()&EAJ_THIRDMASK==EAJ_RANGER) && !countitem(6124)) { + if (!checkfalcon() && getskilllv("HT_FALCON") && !checkoption(Option_Wug) && !checkoption(Option_Wugrider)) { + if(select(" ~ Falcon: ~ Warg")==1) setfalcon; + else getitem 6124,1; } + else getitem 6124,1; } + else if ((eaclass()&EAJ_THIRDMASK==EAJ_MECHANIC) && !checkcart() && getskilllv("MC_PUSHCART")) { + if (!checkmadogear() && getskilllv("NC_MADOLICENCE")) { + if(select(" ~ Cart: ~ Mado")==1) setcart; + else setmadogear; } + else setcart; } + else if (!checkcart() && getskilllv("MC_PUSHCART")) setcart; + else if (!checkfalcon() && getskilllv("HT_FALCON") && !checkoption(Option_Wug) && !checkoption(Option_Wugrider)) setfalcon; + else if (!checkriding() && getskilllv("KN_RIDING")) { + if (eaclass()&EAJ_THIRDMASK==EAJ_RUNE_KNIGHT) setdragon; + else setriding; } + else if (!checkmadogear() && getskilllv("NC_MADOLICENCE")) setmadogear; + else { + message strcharinfo(0),"You do not meet requirements to rent."; + close; } + specialeffect2 EF_TEIHIT3; + close; +} + +//============================================================ +// Old changelog +//============================================================ +//= A Free PecoPeco and Falcon Breeder +//= 1.1 FIXED checkriding/cart/falcon funcs [Lupus] +//= 1.2 Added Rebirth/Advanced Class support [Mass Zero] +//= 1.3 Simplified the checks of job [Silentdragon] +//= 1.3a Fixed a Typo Error. [Samuray22] +//= Thanks to ~AnnieRuru~. +//= 1.4 Optimized Script. No need for 50 million Labels. [Spre] +//============================================================
\ No newline at end of file diff --git a/npc/custom/card_remover.txt b/npc/custom/card_remover.txt new file mode 100644 index 000000000..b2dce9b6f --- /dev/null +++ b/npc/custom/card_remover.txt @@ -0,0 +1,148 @@ +//===== rAthena Script ======================================= +//= Card Removal NPC +//===== By: ================================================== +//= TyrNemesis^ +//===== Current Version: ===================================== +//= 1.2 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Removes cards from equipped items. +//===== Additional Comments: ================================= +//= 1.0 First version. [TyrNemesis^] +//= 1.2 Optimized and fixed getequipname menu. [Kisuka] +//============================================================ + +prt_in,28,73,4 script Wise Old Woman#eAcustom 78,{ + set .zenycost,200000; // Set base cost in zeny of the card remover services + set .percardcost,25000; // set cost per card of the card remover services + set .faildestroy,1; // Should the card remover have a chance of failure that destroys items? 1 = Yes, 0 = No. + mes "[Wise Old Woman]"; + mes "Good day, young one. I have the power to remove cards that you have compounded onto your equipment. Does this idea please you?"; + next; + switch(select("Yes, it does.:What do you charge?:No thanks.")) { + case 1: + mes "[Wise Old Woman]"; + mes "Very well. Which item shall I examine for you?"; + next; + + setarray .@position$[1], "Head","Body","Left hand","Right hand","Robe","Shoes","Accessory 1","Accessory 2","Head 2","Head 3"; + set .@menu$,""; + for( set .@i,1; .@i <= 10; set .@i,.@i+1 ) + { + if( getequipisequiped(.@i) ) + set .@menu$, .@menu$ + .@position$[.@i] + "-" + "[" + getequipname(.@i) + "]"; + + set .@menu$, .@menu$ + ":"; + } + set .@part,select(.@menu$); + if(!getequipisequiped(.@part)) { + mes "[Wise Old Woman]"; + mes "Young one... Your not wearing anything there that I can remove cards from."; + close; + } + if(getequipcardcnt(.@part) == 0) { + mes "[Wise Old Woman]"; + mes "Young one... There are no cards compounded on this item. I can do nothing with it, I'm afraid."; + close; + } + set .@cardcount,getequipcardcnt(.@part); + + if (!checkweight(1202,(.@cardcount+1))) { + mes "^3355FFJust a minute!"; + mes "I can't offer any of my"; + mes "services to you because"; + mes "you're carrying too much"; + mes "stuff. Put your extra items in"; + mes "Kafra Storage and come again~"; + close; + } + mes "[Wise Old Woman]"; + mes "This item has " + .@cardcount + " cards compounded on it. To perform my magic, I will need " + (.zenycost+(.@cardcount * .percardcost)) + " zeny, a ^0000FFStar Crumb^000000, and a ^0000FFYellow Gemstone^000000."; + next; + if(select("Very well. Do it.:Nevermind.") == 2) { + mes "[Wise Old Woman]"; + mes "Very well. Return at once if you seek my services."; + close; + } + if((zeny < (.zenycost+(.@cardcount * .percardcost))) || (countitem(1000) < 1) || (countitem(715) < 1)) { + mes "[Wise Old Woman]"; + mes "You do not have all the items I require to work my magic, child. Come again when you do."; + close; + } + mes "[Wise Old Woman]"; + mes "Before I begin, I must warn you--I may fail. If I do, I may destroy the cards, the item, or both. I do not give refunds. That being said, which is more important to you: The cards, or the item?"; + next; + switch(select("I changed my mind about this.:The item.:The cards.")) { + case 1: + mes "[Wise Old Woman]"; + mes "Very well. Return at once if you seek my services."; + close; + case 2: + set .@failtype,1; + break; + case 3: + set .@failtype,2; + } + mes "[Wise Old Woman]"; + mes "Very well. I shall begin."; + set zeny,zeny - (.zenycost+(.@cardcount * .percardcost)); + delitem 1000,1; + delitem 715,1; + + // Replace the constants in the next 3 lines with failure chance values defined in refine_db.txt + // First value = Total failure chance (item and cards destroyed) + // Second value = Partial failure chance (one or the other is destroyed, player decides which one is safe) + // Third value = Harmless failure chance (all that's lost is your investment) + + set .@failchance,rand(100); + if (.faildestroy==1) { + if(.@failchance < 2) { + next; + failedremovecards .@part,0; + mes "[Wise Old Woman]"; + mes "The process was a total failure. I am afraid the item and the cards were destroyed."; + close; + } + + if(.@failchance < 8) { + if (.@failtype == 1) { + next; + failedremovecards .@part,1; + mes "[Wise Old Woman]"; + mes "While I have managed to remove the cards from the item, they were destroyed in the process. The item, however, is okay."; + close; + } + + if (.@failtype == 2) { + next; + failedremovecards .@part,2; + mes "[Wise Old Woman]"; + mes "Most unfortunate. I succeeded at removing the cards, but the item itself was destroyed in the process."; + close; + } + } + } + + if(.@failchance < 10) { + next; + failedremovecards .@part,3; + mes "[Wise Old Woman]"; + mes "I have failed to remove the cards. Luckily, however, both the item and the cards are still okay."; + close; + } + next; + successremovecards .@part; + mes "[Wise Old Woman]"; + mes "The process was a success. Here are your cards and your item. Farewell."; + close; + case 2: + mes "[Wise Old Woman]"; + mes "I charge a flat fee of "+.zenycost+" zeny, plus "+.percardcost+" zeny for each card I remove from the item. In addition, I need a star crumb and a yellow gemstone to work my magic."; + close; + case 3: + mes "[Wise Old Woman]"; + mes "Very well. Return at once if you seek my services."; + close; + } +} diff --git a/npc/custom/etc/airplane.txt b/npc/custom/etc/airplane.txt new file mode 100644 index 000000000..2469b6a24 --- /dev/null +++ b/npc/custom/etc/airplane.txt @@ -0,0 +1,442 @@ +//===== rAthena Script ======================================= +//= elRO Airship +//===== By: ================================================== +//= Draike, Bluto, Hephaestus +//===== Current Version: ===================================== +//= 2.2a +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= It's the elRO airship. XD +//===== Additional Comments: ================================= +//= ALWAYS HAVE AT LEAST TWELVE (12) LOCATIONS AS THE MINIMUM. This is unless you modify to OnMinutes and change the schedule around. +//= If you have "airplane,103,72,0 warp airs02a 1,1,airplane,102,200" as a warp, remove it. Where it's supposed to go, I have no clue. +//= 2.1 Removed Duplicates [Silent] +//= 2.2 Added missing next;'s [Evera] +//============================================================ + +payon,153,43,5 script itinsetter -1,{ + //This is just OnInit stuff to set the hourly intinerary. +OnInit: + deletearray $locationsname$[0],500; + deletearray $locationsmap$[0],500; + deletearray $locationsx[0],500; + deletearray $locationsy[0],500; + deletearray $alreadygoneto[0],500; + setarray $locationsname$[0],"Airport"; + setarray $locationsname$[1],"Prontera"; + setarray $locationsname$[2],"Payon"; + setarray $locationsname$[3],"Aldebaran"; + setarray $locationsname$[4],"Alberta"; + setarray $locationsname$[5],"Geffen"; + setarray $locationsname$[6],"Morocc"; + setarray $locationsname$[7],"Glast Heim"; + setarray $locationsname$[8],"Umbala"; + setarray $locationsname$[9],"Comodo"; + setarray $locationsname$[10],"Amatsu"; + setarray $locationsname$[11],"Niflheim"; + setarray $locationsname$[12],"Lutie"; + setarray $locationsname$[13],"Louyang"; + setarray $locationsname$[14],"Gonryun"; + setarray $locationsname$[15],"Yuno"; + setarray $locationsname$[16],"Ant Hell"; + setarray $locationsname$[17],"Jawaii"; + setarray $locationsname$[18],"Orc Village"; + setarray $locationsname$[19],"Mjolnir Coal Mines"; + setarray $locationsname$[20],"Gefenia Ruins"; + setarray $locationsname$[21],"Ayothaya"; + setarray $locationsname$[22],"Lighthalzen"; + setarray $locationsname$[23],"Juperos"; + setarray $locationsmap$[0],"airport"; + setarray $locationsmap$[1],"prt_fild08"; + setarray $locationsmap$[2],"pay_fild08"; + setarray $locationsmap$[3],"mjolnir_12"; + setarray $locationsmap$[4],"pay_fild03"; + setarray $locationsmap$[5],"gef_fild00"; + setarray $locationsmap$[6],"moc_fild10"; + setarray $locationsmap$[7],"glast_01"; + setarray $locationsmap$[8],"umbala"; + setarray $locationsmap$[9],"comodo"; + setarray $locationsmap$[10],"amatsu"; + setarray $locationsmap$[11],"niflheim"; + setarray $locationsmap$[12],"xmas"; + setarray $locationsmap$[13],"louyang"; + setarray $locationsmap$[14],"gonryun"; + setarray $locationsmap$[15],"yuno"; + setarray $locationsmap$[16],"moc_fild04"; + setarray $locationsmap$[17],"jawaii"; + setarray $locationsmap$[18],"gef_fild10"; + setarray $locationsmap$[19],"mjolnir_02"; + setarray $locationsmap$[20],"gefenia01"; + setarray $locationsmap$[21],"ayothaya"; + setarray $locationsmap$[22],"lighthalzen"; + setarray $locationsmap$[23],"jupe_gate"; + setarray $locationsx[0],148; + setarray $locationsx[1],206; + setarray $locationsx[2],159; + setarray $locationsx[3],62; + setarray $locationsx[4],194; + setarray $locationsx[5],50; + setarray $locationsx[6],163; + setarray $locationsx[7],196; + setarray $locationsx[8],187; + setarray $locationsx[9],203; + setarray $locationsx[10],115; + setarray $locationsx[11],132; + setarray $locationsx[12],232; + setarray $locationsx[13],36; + setarray $locationsx[14],82; + setarray $locationsx[15],58; + setarray $locationsx[16],209; + setarray $locationsx[17],248; + setarray $locationsx[18],158; + setarray $locationsx[19],76; + setarray $locationsx[20],98; + setarray $locationsx[21],183; + setarray $locationsx[22],99; + setarray $locationsx[23],46; + setarray $locationsy[0],45; + setarray $locationsy[1],280; + setarray $locationsy[2],92; + setarray $locationsy[3],381; + setarray $locationsy[4],182; + setarray $locationsy[5],365; + setarray $locationsy[6],172; + setarray $locationsy[7],327; + setarray $locationsy[8],98; + setarray $locationsy[9],76; + setarray $locationsy[10],79; + setarray $locationsy[11],241; + setarray $locationsy[12],308; + setarray $locationsy[13],279; + setarray $locationsy[14],96; + setarray $locationsy[15],194; + setarray $locationsy[16],326; + setarray $locationsy[17],175; + setarray $locationsy[18],95; + setarray $locationsy[19],363; + setarray $locationsy[20],21; + setarray $locationsy[21],104; + setarray $locationsy[22],240; + setarray $locationsy[23],19; + goto resetgoneto; + end; + +setrandomitin: + set $@settervariable,$@settervariable + 1; + setarray $locationn[$@settervariable],rand(0,getarraysize($locationsname$) - 1); + if($alreadygoneto[$locationn[$@settervariable]]==1)set $@settervariable,$@settervariable - 1; + if($alreadygoneto[$locationn[$@settervariable]]==1)goto setrandomitin; + setarray $alreadygoneto[$locationn[$@settervariable]], 1; + if($@settervariable<12)goto setrandomitin; + end; + +resetgoneto: + deletearray $alreadygoneto[0], 500; + set $@currenttime, 0; + goto setrandomitin; + +OnMinute00: + set $@currenttime, 1; + callfunc "F_Itinreset",12,1,2; + +OnMinute03: + set $destination,250; + end; + +OnMinute05: + set $@currenttime, 2; + callfunc "F_Itinreset",1,2,3; + +OnMinute08: + set $destination,250; + end; + +OnMinute10: + set $@currenttime, 3; + callfunc "F_Itinreset",2,3,4; + +OnMinute13: + set $destination,250; + end; + +OnMinute15: + set $@currenttime, 4; + callfunc "F_Itinreset",3,4,5; + +OnMinute18: + set $destination,250; + end; + +OnMinute20: + set $@currenttime, 5; + callfunc "F_Itinreset",4,5,6; + +OnMinute23: + set $destination,250; + end; + +OnMinute25: + set $@currenttime, 6; + callfunc "F_Itinreset",5,6,7; + +OnMinute28: + set $destination,250; + end; + +OnMinute30: + set $@currenttime, 7; + callfunc "F_Itinreset",6,7,8; + +OnMinute33: + set $destination,250; + end; + +OnMinute35: + set $@currenttime, 8; + callfunc "F_Itinreset",7,8,9; + +OnMinute38: + set $destination,250; + end; + +OnMinute40: + set $@currenttime, 9; + callfunc "F_Itinreset",8,9,10; + +OnMinute43: + set $destination,250; + end; + +OnMinute45: + set $@currenttime, 10; + callfunc "F_Itinreset",9,10,11; + +OnMinute48: + set $destination,250; + end; + +OnMinute50: + set $@currenttime, 11; + callfunc "F_Itinreset",10,11,12; + +OnMinute53: + set $destination,250; + end; + +OnMinute55: + set $@currenttime, 12; + callfunc "F_Itinreset",11,12,1; + +OnMinute58: + set $destination,250; + end; +} + +function script F_Porter { + if($destination==getarg(0))goto Board; + if($destination!=getarg(0))goto Notime; + +Board: + mes "^FF0000[Porter]^000000"; + mes "The plane is currently ported. Would you like to board?"; + next; + menu "Yes.",L_Yes,"No.",L_Nope,"View Hourly Itinerary.",Itin; + +L_Yes: + if($destination!=getarg(0))goto Notime; + warp "airplane", 105, 72; + specialeffect2 501; +L_Nope: + mes "^FF0000[Porter]^000000"; + mes "Have a good day. Thank you for traveling with Airship."; + close; + +Notime: + mes "^FF0000[Porter]^000000"; + if(sex==0) mes "Sorry, ma'am, but the plane currently isn't ported. However, you can view the airplane's hourly itinerary."; + if(sex==1) mes "Sorry, sir, but the plane currently isn't ported. However, you can view the airplane's hourly itinerary."; + next; + menu "Yes, please.",Itin,"No thanks.",L_Nope; + close; + end; + +Itin: + mes "^FF0000[Porter]^000000"; + callfunc "F_Itin"; +} + +airport,153,43,5 script Airport Porter 774,{ + callfunc "F_Porter",0; +} +prt_fild08,206,279,5 script Porter#01 774,{ + callfunc "F_Porter",1; +} +gef_fild00,50,364,5 script Porter#02 774,{ + callfunc "F_Porter",5; +} +moc_fild10,163,173,5 script Porter#03 774,{ + callfunc "F_Porter",6; +} +mjolnir_12,61,380,5 script Porter#04 774,{ + callfunc "F_Porter",3; +} +pay_fild08,159,91,5 script Porter#05 774,{ + callfunc "F_Porter",2; +} +pay_fild03,194,181,5 script Porter#06 774,{ + callfunc "F_Porter",4; +} +glast_01,196,326,1 script Porter#07 774,{ + callfunc "F_Porter",7; +} +umbala,188,98,3 script Porter#08 774,{ + callfunc "F_Porter",8; +} +comodo,203,75,8 script Porter#09 774,{ + callfunc "F_Porter",9; +} +amatsu,115,78,8 script Porter#10 774,{ + callfunc "F_Porter",10; +} +niflheim,132,242,5 script Porter#11 774,{ + callfunc "F_Porter",11; +} +xmas,232,309,5 script Porter#12 774,{ + callfunc "F_Porter",12; +} +louyang,35,279,8 script Porter#13 774,{ + callfunc "F_Porter",13; +} +gonryun,82,95,7 script Porter#14 774,{ + callfunc "F_Porter",14; +} +yuno,58,195,4 script Porter#15 774,{ + callfunc "F_Porter",15; +} +moc_fild04,210,326,2 script Porter#16 774,{ + callfunc "F_Porter",16; +} +jawaii,247,174,7 script Porter#17 774,{ + callfunc "F_Porter",17; +} +gef_fild10,159,95,2 script Porter#18 774,{ + callfunc "F_Porter",18; +} +mjolnir_02,76,364,5 script Porter#19 774,{ + callfunc "F_Porter",19; +} +gefenia01,97,22,6 script Porter#20 774,{ + callfunc "F_Porter",20; +} +ayothaya,182,105,5 script Porter#21 774,{ + callfunc "F_Porter",21; +} +lighthalzen,99,241,4 script Porter#22 774,{ + callfunc "F_Porter",22; +} +jupe_gate,46,18,7 script Porter#23 774,{ + callfunc "F_Porter",23; +} +airport,141,43,5 script Itinerary Schedule 837,{ + mes "^FF0000[Itinerary]^000000"; + callfunc "F_Itin"; +} + +airplane,102,68,5 script Docker 852,{ + if($destination == 250) goto Nowhere; + mes "^FF0000[Airplane Attendant]^000000"; + if($destination == 250)goto Notime; + set @dockky, $destination; + if($destination != 250)mes "We are currently docked at "+$locationsname$[$destination]+". Would you like to exit?"; + next; + menu "Yes.",Lyes,"No.",Lnope; + +Lyes: + if($destination == 250)goto Notime; + if($destination != @dockky)goto Notime; + warp $locationsmap$[$destination], $locationsx[$destination], $locationsy[$destination]; + specialeffect2 501; + +Lnope: + mes "^FF0000[Airplane Attendant]^000000"; + mes "Have a good day. Thank you for traveling with us."; + close; + +Notime: + mes "^FF0000[Airplane Attendant]^000000"; + if(sex==0) mes "Sorry, ma'am, but the plane currently isn't docked. Please wait."; + if(sex==1) mes "Sorry, sir, but the plane currently isn't docked. Please wait."; + close; + +Nowhere: + mes "^FF0000[Airplane Attendant]^000000"; + mes "We're currently in air. Please wait until the pilot has announced that we have safely landed."; + close; +} + +function script F_Itin { + //This is the itinerary's function. It should work well enough. + if($@currenttime==0)mes "Try again later. A recent server reboot or rehash has messed the itinerary up for a bit."; + if($@currenttime==0)close; + if($@currenttime==0)end; + set @tempo, 0; + set @tempo, $@currenttime - 1; + goto seta; + close; + +seta: + set @tempo, @tempo + 1; + set @time, gettime(3); + set @minutes, 5 * @tempo - 5; + set @minutess, 5 * @tempo - 2; + if(@minutes<10)set @minutes$, "0" + @minutes; + if(@minutes>9)set @minutes$, @minutes; + if(@minutess<10)set @minutess$, "0" + @minutess; + if(@minutess>9)set @minutess$, @minutess; + if(@time<12)set @time$,@time; + if(@time==12)set @time$,12; + if(@time>12)set @time$,@time - 12; + if(@time<12)mes @time$+":"+ @minutes$ + " A.M. - "+@time$+ ":"+ @minutess$ + " A.M. - "+"^FF0000"+$locationsname$[$locationn[@tempo]]+"^000000"; + if(@time==12)mes @time$+":"+ @minutes$ + " P.M. - "+@time$+ ":"+ @minutess$ + " P.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000"; + if(@time>12 && time<24)mes @time$ +":"+ @minutes$ + " P.M. - "+@time$ + ":"+ @minutess$ + " P.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000"; + if(@time==24)mes @time$+":"+ @minutes$ + " A.M. - "+@time$+ ":"+ @minutess$ + " A.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000"; + if(@tempo<12)goto seta; + set @tempo, 0; + goto setb; + +setb: + if($@currenttime - 1==@tempo)goto setc; + set @tempo, @tempo + 1; + set @time, gettime(3) + 1; + set @minutes, 5 * @tempo - 5; + set @minutess, 5 * @tempo - 2; + if(@minutes<10)set @minutes$, "0" + @minutes; + if(@minutes>9)set @minutes$, @minutes; + if(@minutess<10)set @minutess$, "0" + @minutess; + if(@minutess>9)set @minutess$, @minutess; + if(@time<12)set @time$,@time; + if(@time==12)set @time$,12; + if(@time>12)set @time$,@time - 12; + if(@time<12)mes @time$+":"+ @minutes$ + " A.M. - "+@time$+ ":"+ @minutess$ + " A.M. - "+"^FF0000"+$locationsname$[$locationn[@tempo]]+"^000000"; + if(@time==12)mes @time$+":"+ @minutes$ + " P.M. - "+@time$+ ":"+ @minutess$ + " P.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000"; + if(@time>12 && time<24)mes @time$ +":"+ @minutes$ + " P.M. - "+@time$+ ":"+ @minutess$ + " P.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000"; + if(@time==24)mes @time$+":"+ @minutes$ + " A.M. - "+@time$+ ":"+ @minutess$ + " A.M. -"+"^FF0000 "+$locationsname$[$locationn[@tempo]]+"^000000"; + goto setb; + +setc: + close; + end; +} + +function script F_Itinreset { + setarray $alreadygoneto[$locationn[getarg(0)]], 0; + goto sest; +sest: + setarray $locationn[getarg(0)],rand(0,getarraysize($locationsname$) - 1); + if($alreadygoneto[$locationn[getarg(0)]]==1)goto sest; + setarray $alreadygoneto[$locationn[getarg(0)]], 1; + set $destination,$locationn[$@currenttime]; + announce "Pilot: The plane has arrived at "+$locationsname$[$locationn[getarg(1)]]+". Departure to "+ $locationsname$[$locationn[getarg(2)]] + " is in 3 minutes.",16; + end; +} diff --git a/npc/custom/etc/bank.txt b/npc/custom/etc/bank.txt new file mode 100644 index 000000000..ed514c901 --- /dev/null +++ b/npc/custom/etc/bank.txt @@ -0,0 +1,119 @@ +//===== rAthena Script ======================================= +//= Banker Script +//===== By: ================================================== +//= Syrus22 (1.0) +//===== Current Version: ===================================== +//= 2.0 +//===== Compatible With: ===================================== +//= Any rAthena version with Account variables. +//===== Description: ========================================= +//= An account wide Banker to store Zeny +//===== Additional Comments: ================================= +//= Syrus22 - There's an optional transaction fee at the top of +//= the script. To use it simply change the first set command +//= to set the cost variable to whatever you want the fee to be. +//= Version 2.0: Optimized and brought the script up to standard. [Jguy] +//============================================================ + +prontera,132,217,5 script Banker 109,{ +set @cost,500; +mes "[Banker]"; +mes "Welcome to the First Bank of Prontera. How can I help you today?"; +next; +switch(select("I'd like to make a deposit.:I'd like to make a withdrawl.:What's my current balance?:Cancel")) { + case 1: + mes "[Banker]"; + mes "Very well... How much would you like to deposit? The maximum you can deposit at once is 999,999 Zeny."; + next; + if (@cost > 0) { + mes "[Banker]"; + mes "Oh, and do realize there is a " +@cost + " Zeny charge on all transactions!"; + next; + } + input @deposit; + if (@deposit < 1) { + mes "Make sure you ask me to deposit a real amount."; + close; + } + else if (@deposit > Zeny) { + mes "It does not appear like you have the amount of zeny you're trying to deposit!"; + close; + } + else if (@deposit > (Zeny - @cost)) { + mes "You need " + @cost + " Zeny to cover the transaction fee!"; + close; + } + else { + set Zeny,Zeny - @deposit; + set Zeny,Zeny - @cost; + set #bankstorage,#bankstorage + @deposit; + mes "[Banker]"; + mes "Thank you very much... Your zeny is in good hands."; + close; + } + + case 2: + mes "[Banker]"; + mes "Very well... How much would you like to withdraw? The maximum you can withdraw at one time is 999,999 Zeny"; + next; + if (@cost > 0) { + mes "[Banker]"; + mes "Oh, and do realize there is a " +@cost + " Zeny charge on all transactions!"; + next; + } + input @withdrawl; + if (@withdrawl < 1) { + mes "Please don't play games. I need a real amount to withdraw."; + close; + } + else if (@withdrawl > #bankstorage) { + mes "I show you only have ^00FF00" + #bankstorage +"^000000 zeny in your account!"; + close; + } + else if ((@cost > Zeny) && ((Zeny + @withdrawl) > @cost)) { + mes "[Banker]"; + mes "You don't have the Zeny for the transaction fee right now. Would you like me to take the fee directly from your withdrawl?"; + next; + switch(select("Yes please.:No, Thanks")){ + case 1: + mes "[Banker]"; + mes "Removing " + @cost + " from your withdrawl to cover the deposit fee..."; + set @withdrawl,@withdrawl - @cost; + set #bankstorage,#bankstorage - @cost; + set @cost,0; + next; + set Zeny,Zeny - @cost; + set Zeny,Zeny + @withdrawl; + set #bankstorage,#bankstorage - @withdrawl; + mes "[Banker]"; + mes "There's your Zeny. Have a good day."; + close; + case 2: + mes "[Banker]"; + mes "Very well... come again soon."; + close; + } + } + else { + set Zeny,Zeny - @cost; + set Zeny,Zeny + @withdrawl; + set #bankstorage,#bankstorage - @withdrawl; + mes "[Banker]"; + mes "There's your Zeny. Have a good day."; + close; + } + case 3: + mes "[Banker]"; + mes "Hmmmm let me check some paper work."; + next; + mes "*Rustle, Rustle*"; + next; + mes "[Banker]"; + mes "You currently have " + #bankstorage + " Zeny in your account."; + close; + case 4: + mes "[Banker]"; + mes "Very well... come again soon."; + close; + } +} diff --git a/npc/custom/etc/bank_kafra.txt b/npc/custom/etc/bank_kafra.txt new file mode 100644 index 000000000..734c129d5 --- /dev/null +++ b/npc/custom/etc/bank_kafra.txt @@ -0,0 +1,116 @@ +//===== rAthena Script ======================================= +//= The 2nd Bank of Prontera (with daily 0.01% income!) +//===== By: ================================================== +//= Lupus (1.0) +//===== Current Version: ===================================== +//= 1.2a +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= A bank which has an interest % +//===== Additional Comments: ================================= +// Look for this formula and setup your Bank daily % interest +// #kafrabank/1000 = 0.1% of interest per day +// #kafrabank/100 = 1% of interest per day +// #kafrabank/10 = 10% of interest per day +// +// 1.1 Added log of bank operation -> logmes "some info"; +// 1.2 Set max income to 100,000z. It would help to avoid +// zeny exploits when you change DATE at your server +// 1.2a Corrected bad duplicate names. (bugreport:921) [Samuray22] +//============================================================ + +- script Bank Clerk::bankg 833,{ + mes"[Maniss]"; + mes strcharinfo(0)+", welcome to the 2nd Bank of Prontera!"; + + set @kb_int,(gettime(6)*31)+gettime(5); //today's number + set @income,0; + //calculate % + if (#kafrabank<=0 || #kb_int>=@kb_int) goto L_NoIncomeToday; + set @income,(#kafrabank/1000)*(@kb_int-#kb_int); //@income == % of the sum + //max income constant: + if (@income>100000) set @income,100000; +L_NoIncomeToday: + set #kb_int,@kb_int; //reset days timer + + if(#kafrabank==0) mes "We could open you an account."; + if(@income>0) mes "Today's income: ^135445" + @income + "^000000 zeny."; + set #kafrabank,#kafrabank+@income; + if(#kafrabank>0) mes "Your account: ^135445" + #kafrabank + "^000000 zeny."; + mes "What would you like?"; + next; + if(#kafrabank==0) menu "-Open an account",-,"-Quit",B_EXIT2; + if(#kafrabank>0) menu "-Deposit money",-,"-Withdraw money",M_WITHDRAW,"-Quit",B_EXIT2; + + mes"[Maniss]"; + mes "Please, tell me how much zeny you would like to deposit."; + next; + if(input(@kafrabank) == 1) goto L_TOO_BIG_AMOUNT; + + if(@kafrabank<1000) goto L_LESS_1000; + if(@kafrabank>zeny) goto L_NOT_ENOUGH; + set zeny,zeny-@kafrabank; + set #kafrabank,#kafrabank+@kafrabank; + mes"[Maniss]"; + mes "You've made a deposit of ^135445" + @kafrabank + "z^000000."; + //we log these zeny operations into the log db + logmes "Bank %: " + @income +"z, Deposit: "+ @kafrabank +"z, Final: "+ #kafrabank +"z"; + goto B_EXIT; + +M_WITHDRAW: + if(#kafrabank==0) goto L_ZERO_ACCOUNT; + mes"[Maniss]"; + mes "Your account: ^135445" + #kafrabank + "^000000 zeny."; + mes "How much zeny would you like to withdraw?"; + next; + if(input(@kafrabank) == 1) goto L_TOO_BIG_AMOUNT; + + if(@kafrabank<1) goto B_EXIT2; + if(@kafrabank>#kafrabank) goto L_NOT_ENOUGH; + set #kafrabank,#kafrabank-@kafrabank; + set zeny,zeny+@kafrabank; + mes"[Maniss]"; + mes "Here is your ^135445" + @kafrabank + "z^000000, put your sign here..."; + //we log these zeny operations into the log db + logmes "Bank %: " + @income +"z, Withdraw: "+ @kafrabank +"z, Final: "+ #kafrabank +"z"; + goto B_EXIT; + +L_NOT_ENOUGH: + mes"[Maniss]"; + mes "You don't have enough zeny for this operation."; + next; + goto B_EXIT2; + +L_ZERO_ACCOUNT: + mes"[Maniss]"; + mes "You don't have any zeny on your account!"; + next; + goto B_EXIT2; + +L_TOO_BIG_AMOUNT: + mes"[Maniss]"; + mes "Sorry. The maximum deposit you can make on a time is 10,000,000 zeny."; + next; + goto B_EXIT2; + +L_LESS_1000: + mes"[Maniss]"; + mes "We're sorry, the minimum amount of zeny you can deposit is 1,000 zeny."; + next; + goto B_EXIT2; + +B_EXIT: + mes "Very well... Come again soon!"; + next; + +B_EXIT2: + mes"[Maniss]"; + mes "Thank you for using our Bank Service. We hope to see you again soon."; + close; +} + +prontera,131,190,1 duplicate(bankg) Bank Clerk#1-1 833 +geffen,125,73,3 duplicate(bankg) Bank Clerk#2-1 833 +izlude,145,107,1 duplicate(bankg) Bank Clerk#3-1 833 +morocc,147,84,7 duplicate(bankg) Bank Clerk#4-1 833 diff --git a/npc/custom/etc/blackjack.txt b/npc/custom/etc/blackjack.txt new file mode 100644 index 000000000..951af3f68 --- /dev/null +++ b/npc/custom/etc/blackjack.txt @@ -0,0 +1,347 @@ +//===== rAthena Script ======================================= +//= Black Jack +//===== By: ================================================== +//= kobra_k88 +//===== Current Version: ===================================== +//= 1.0 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Black Jack card game. Gameplay based off standard casino +//= black jack rules. Dealer must have at least 17 to stay and will +//= automatically stay at 17 and up. Player must have at least +//= 13 to stay. Aces counted as 11 or 1. Option to "Double Down". +//= Currently does not allow for "insurance", or "splitting" +//= of pairs. +//===== Additional Comments: ================================= +//= +//============================================================ + +cmd_in02,188,89,1 script Black Jack Dealer 57,{ + mes "[Dealer]"; + mes "Hello there! Would you like to play a game of Black Jack?"; +M_Menu: + next; + menu "What are the rules?",M_0, "I want to play.",L_Play, "No thanks.",M_End; + +M_0: + mes "[Dealer]"; + mes "What would you like to know?"; +sM_Menu0: + next; + menu "The basics.",sM_0a, "Winning and loosing.",sM_0b, "'Double Down'.",sM_0c, + "Ace value.",sM_0d, "Nothing.",M_Menu; + +sM_0a: + mes "[Dealer]"; + mes "Black Jack is a card game in which the goal is to get 21, or as"; + mes "close to 21 points as possible, without going over 21."; + next; + mes "[Dealer]"; + mes "Before the game starts, the player must make a bet. Once the bet"; + mes "has been made, both the dealer and the player are dealt 2 cards"; + mes "each. Depending on what cards you have, you can choose to ^5533FF'stay'^000000,"; + mes "or you can choose to ^5533FF'pull'^000000."; + next; + mes "[Dealer]"; + mes "When you choose to 'stay', you are telling the dealer that you don't"; + mes "need anymore cards. This allows the dealer to pull if he/she"; + mes "wants to. In order to stay, you must have ^FF3355at least 13 points^000000. The"; + mes "dealer can only stay when he/she has^FF3355 17 points or more^000000."; + next; + mes "[Dealer]"; + mes "When you choose to 'pull', you are telling the dealer that you want"; + mes "another card. By pulling more cards you can increase your point"; + mes "total. As long has you have ^FF3355less than 21^000000 points you can pull a"; + mes "card from the deck."; + goto sM_Menu0; +sM_0b: + mes "[Dealer]"; + mes "There are 3 ways to win and loose at Black Jack."; + next; + mes "[Dealer]"; + mes "1.) At the end of a Black Jack round, if you have more points"; + mes "than the dealer you will win the round. Conversely if you have"; + mes "less points than the dealer you will loose."; + next; + mes "[Dealer]"; + mes "2.) If you pull a card that makes your point total go over 21 you"; + mes "will automatically loose the round. This is called a ^5533FF'bust'^000000. If"; + mes "the dealer busts then you will win the round."; + next; + mes "[Dealer]"; + mes "3.) If you have a point total of 21 with the first 2 cards, you"; + mes "will automatically win the round. This is called a ^5533FF'Black Jack'^000000"; + mes "and happens when you get an 'Ace' and a '10 valued' card. If the"; + mes "dealer gets a Black Jack he/she will automatically win the round."; + next; + mes "[Dealer]"; + mes "4.) Besides winning and loosing, you can tie with the dealer. If"; + mes "both you and the dealer have the same point total at the end of a"; + mes "round, this will result in a tie with no winner and no loss or gain"; + mes "in money."; + next; + mes "[Dealer]"; + mes "This is called a ^5533FF'push'^000000 with the dealer. This also"; + mes "applies to both you and the dealer having Black Jack at the same"; + mes "time."; + goto sM_Menu0; +sM_0c: + mes "[Dealer]"; + mes "The 'Double Down' option allows you to double your current bet,"; + mes "but with the drawback that you will only be able to pull one"; + mes "additional card. This option is only available at the beggining of"; + mes "each round."; + next; + mes "[Dealer]"; + mes "An example of when doubling down is useful, is when"; + mes "your first 2 cards give you a point total of 11. You have a good"; + mes "chance of getting 21 or 20 with the next card that you draw. This"; + mes "would be a good hand to double down on."; + goto sM_Menu0; +sM_0d: + mes "[Dealer]"; + mes "The 'Ace' card is a unique card in the game of Black Jack because"; + mes "it can have 2 values. An Ace can be counted as either 11 points,"; + mes "or just 1 point. For example if you had an Ace and a 4, that would"; + mes "give you either 15 or 5 points."; + next; + mes "[Dealer]"; + mes "If you decided to stay, the Ace would automatically be counted as"; + mes "11 points to give you 15 points total."; + next; + mes "[Dealer]"; + mes "If you had decided to pull and received a 9, the ace would"; + mes "automatically be counted as 1 point to give you a total of 14"; + mes "points. If the Ace was counted as 11 points, you would have a"; + mes "point total over 21 and would have lost."; + next; + mes "[Dealer]"; + mes "It is because of the flexibilty you have with the 'Ace' that makes"; + mes "it the most powerfull card in the game."; + goto sM_Menu0; +M_End: + mes "[Dealer]"; + mes "Feel free to come back anytime"; + close; + +//================ +L_Play: + mes "[Dealer]"; + mes "Please place your bets..."; + next; + menu "2z",M_1a, "10z",M_1b, "20z",M_1c, "100z",M_1d, "Too rich for my blood....",M_End; + +M_1a: + if(Zeny < 2) goto sL_NotEnuf; + set @bet, 2; + goto L_Cont0; +M_1b: + if(Zeny < 10) goto sL_NotEnuf; + set @bet, 10; + goto L_Cont0; +M_1c: + if(Zeny < 20) goto sL_NotEnuf; + set @bet, 20; + goto L_Cont0; +M_1d: + if(Zeny < 100) goto sL_NotEnuf; + set @bet, 100; + goto L_Cont0; + +sL_NotEnuf: + mes "[Dealer]"; + mes "I'm sorry but you don't have enough zeny to make that bet."; + close; + +L_Cont0: + mes "(the cards are being dealt)"; + next; + deletearray $@card[0],13; + set @dealerTurn, 0; + set @numP, 0; + set @numD, 0; + set @pAce, 0; + set @dAce, 0; + callsub sF_GetCards, @numP, @playCard[@numP], @playCard$[@numP], @pAce; + callsub sF_GetCards, @numP, @playCard[@numP], @playCard$[@numP], @pAce; + callsub sF_GetCards, @numD, @dealCard[@numD], @dealCard$[@numD], @dAce; + callsub sF_GetCards, @numD, @dealCard[@numD], @dealCard$[@numD], @dAce; + +//============== +L_Start: + callsub sF_GetTot; + + mes "- Here are the ^FF5533DEALER'S^000000 cards:"; + if (@numD==2) callsub sF_D2cards; + if (@numD==3) callsub sF_D3cards; + if (@numD==4) callsub sF_D4cards; + if (@numD==5) callsub sF_D5cards; + mes " The DEALER has: ^FF5533"+@dealTot+"^000000"; + mes " "; + mes "- Here are ^5533FFYOUR^000000 cards:"; + if (@numP==2) callsub sF_P2cards; + if (@numP==3) callsub sF_P3cards; + if (@numP==4) callsub sF_P4cards; + if (@numP==5) callsub sF_P5cards; + if(@pAce != 1 || @playTot == 21) mes " YOU have: ^5533FF" +@playTot+ "^000000"; + if(@pAce == 1 && @playTot != 21) mes " You have: ^5533FF" +@playTot+ "^000000, or ^5533FF" +(@playTot-10)+ "^000000"; + next; + if(@playTot==21 && @dealTot==21) goto sL_Push; + if(@numP==2 && @playTot == 21) goto sL_Win; + if(@numD==2 && @dealTot == 21) goto sL_Lose; + if(@playTot > 21) goto sL_Lose; + if(@dealTot > 21) goto sL_Win; + if(@numP==2 && @dealerTurn==0) menu "Hit me(pull)",M_Hit, "Stay",M_Stay, "Double Down",M_Double; + if(@dealerTurn == 0) menu "Hit me(pull)",M_Hit, "Stay",M_Stay; + +M_Stay: + mes "[Dealer]"; + if(@playTot < 13) goto sL_PlayToLow; + if(@dealTot > 16) mes "The Dealer stays."; + if(@dealTot > 16 || @numD == 5) goto L_Check; + mes "The Dealer is going to pull"; + next; + callsub sF_GetCards, @numD, @dealCard[@numD], @dealCard$[@numD], @dAce; + set @dealerTurn, 1; + goto L_Start; + +sL_PlayToLow: + mes "I'm sorry but you do not have a high enough total to stay. You must pull."; + next; + goto M_Hit; + +M_Hit: + if(@numP == 5) goto M_Stay; + callsub sF_GetCards, @numP, @playCard[@numP], @playCard$[@numP], @pAce; + goto L_Start; +M_Double: + mes "[Dealer]"; + mes "Player has chosen to Double Down. You're current bet will be"; + mes "doubled, and you will only be able to pull 1 extra card."; + next; + set @dealerTurn, 1; + set @bet, @bet*2; + callsub sF_GetCards, @numP, @playCard[@numP], @playCard$[@numP], @pAce; + goto L_Start; + +//============= +L_Check: + next; + if(@playTot < @dealTot) goto sL_Lose; + if(@playTot == @dealTot) goto sL_Push; + +sL_Win: + mes "[Dealer]"; + mes "Congratulations, you've won!"; + next; + set Zeny, Zeny + @bet; + goto L_Play; +sL_Lose: + mes "[Dealer]"; + mes "I'm sorry but you've lost."; + set Zeny, Zeny - @bet; + next; + goto L_Play; +sL_Push: + mes "[Dealer]"; + mes "Its a push. You tied with the Dealer."; + next; + goto L_Play; + + +//================================== + // Sub function for dealing/pulling the cards +sF_GetCards: + set @rnd, rand(1,13); + if($@card[@rnd] == 4) goto sF_GetCards; + set $@card[@rnd], $@card[@rnd] + 1; + set getarg(1), @rnd; + if(getarg(1) > 10) set getarg(1), 10; + if(getarg(1) == 1 && getarg(3) < 1) set getarg(1), 11; + if(getarg(1) == 11) set getarg(3), 1; + set getarg(2), " " + getarg(1) + " "; + if(@rnd == 10) set getarg(2), getarg(1); + if(@rnd == 1) set getarg(2), " A "; + if(@rnd == 11) set getarg(2), " J "; + if(@rnd == 12) set getarg(2), " Q "; + if(@rnd == 13) set getarg(2), " K "; + set getarg(0), getarg(0) + 1; + return; + +//================================== + // Sub function for getting the total score for each hand +sF_GetTot: + set @i, 0; + set @dealTot, 0; + set @playTot, 0; + +GetDealTot: + set @dealTot, @dealTot + @dealCard[@i]; + set @i, @i + 1; + if(@i < @numD) goto GetDealTot; + if(@dAce == 1 && @dealTot > 21) set @dealTot, @dealTot - 10; + set @i, 0; +GetPlayTot: + set @playTot, @playTot + @playCard[@i]; + set @i, @i + 1; + if(@i < @numP) goto GetPlayTot; + if(@pAce == 1 && @playTot > 21) set @pAce, 2; + if(@pAce > 0 && @playTot > 21) set @playTot, @playTot - 10; + return; + +//======================================= + // Sub function for displaying the Cards +sF_D2cards: + mes " .-----. .-----. "; + mes " | "+@dealCard$[0]+" | | "+@dealCard$[1]+" | "; + mes " '-----' '-----' "; + return; +sF_P2cards: + mes " .-----. .-----. "; + mes " | "+@playCard$[0]+" | | "+@playCard$[1]+" | "; + mes " '-----' '-----' "; + return; +sF_D3cards: + mes " .-----. .-----. .-----. "; + mes " | "+@dealCard$[0]+" | | "+@dealCard$[1]+" | | "+@dealCard$[2]+" | "; + mes " '-----' '-----' '-----' "; + return; +sF_P3cards: + mes " .-----. .-----. .-----. "; + mes " | "+@playCard$[0]+" | | "+@playCard$[1]+" | | "+@playCard$[2]+" | "; + mes " '-----' '-----' '-----' "; + return; +sF_D4cards: + mes " .-----. .-----. .-----. "; + mes " | "+@dealCard$[0]+" | | "+@dealCard$[1]+" | | "+@dealCard$[2]+" | "; + mes " '-----' '-----' '-----' "; + mes " .-----. "; + mes " | "+@dealCard$[3]+" |"; + mes " '-----' "; + return; +sF_P4cards: + mes " .-----. .-----. .-----. "; + mes " | "+@playCard$[0]+" | | "+@playCard$[1]+" | | "+@playCard$[2]+" |"; + mes " '-----' '-----' '-----' "; + mes " .-----. "; + mes " | "+@playCard$[3]+" |"; + mes " '-----' "; + return; +sF_D5cards: + mes " .-----. .-----. .-----. "; + mes " | "+@dealCard$[0]+" | | "+@dealCard$[1]+" | | "+@dealCard$[2]+" | "; + mes " '-----' '-----' '-----' "; + mes " .-----. .-----. "; + mes " | "+@dealCard$[3]+" | | "+@dealCard$[4]+" | "; + mes " '-----' '-----' "; + return; +sF_P5cards: + mes " .-----. .-----. .-----. "; + mes " | "+@playCard$[0]+" | | "+@playCard$[1]+" | | "+@playCard$[2]+" | "; + mes " '-----' '-----' '-----' "; + mes " .-----. .-----. "; + mes " | "+@playCard$[3]+" | | "+@playCard$[4]+" | "; + mes " '-----' '-----' "; + return; +} diff --git a/npc/custom/etc/floating_rates.txt b/npc/custom/etc/floating_rates.txt new file mode 100644 index 000000000..daa11878e --- /dev/null +++ b/npc/custom/etc/floating_rates.txt @@ -0,0 +1,43 @@ +//===== rAthena Script ======================================= +//= Floating Server Rates +//===== By: ================================================== +//= Lupus +//===== Current Version: ===================================== +//= 1.0 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= It's a simply example of setbattleflag +//= This script will change your server rates from 1x to 1.5x every 6 hours +//= Note: It doesn't affect Card granted drops, MVP & Treasure Chests drops ^_- +//= It also doesn't affect CARD drops, because they are just 0.01% +//===== Additional Comments: ================================= +//= You can make incredible scripts with 'setbattleflag'! +//============================================================ + +- script FloatingRates -1,{ +OnInit: +//add any other HOURS +OnHour00: +OnHour06: +OnHour12: +OnHour18: +//------------------- + set $@brate,rand(100,150); + set $@jrate,rand(100,150); + set $@drate,rand(100,150); + //Base exp + setbattleflag("base_exp_rate",$@brate); + //Job exp + setbattleflag("job_exp_rate",$@jrate); + //Drops + setbattleflag("item_rate_common",$@drate); + setbattleflag("item_rate_heal",$@drate); + setbattleflag("item_rate_use",$@drate); + setbattleflag("item_rate_equip",$@drate); + //we don't change card drops rate, because these values won't change them anyway + atcommand "@reloadmobdb"; + + announce "Current Rune-Midgard rates are: 1."+($@brate-100)+"x 1."+($@jrate-100)+"x 1."+($@drate-100)+"x",bc_all,0xFF6060; + end; +} diff --git a/npc/custom/etc/lottery.txt b/npc/custom/etc/lottery.txt new file mode 100644 index 000000000..7cc9a53f1 --- /dev/null +++ b/npc/custom/etc/lottery.txt @@ -0,0 +1,454 @@ +//===== rAthena Script ======================================= +//= Lottery +//===== By: ================================================== +//= acky +//===== Current Version: ===================================== +//= 1.2.1a +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Daily lottery draw +//===== Additional Comments: ================================= +//= Numbers drawn daily (Time is configured line 29) +//= *Added GM-Riggability +//= *Ability to renew ticket +//= *Improved interface +//= *Fixed minor bug where first load didn't work. +//= 1.2.1a fix due to new script engine +//============================================================ + +- script lotterygenerator -1,{ +OnInit: + set $L_TicketPrice,4750; // TICKET COST + set $L_Prize_Money,5000000; // JACKPOT AMOUNT + set $L_Prize_Money_Small,1000000; // SECONDARY PRIZE + if ($LID == 0) goto L_GenID; + end; + + //Modify for own time +OnClock2045: + // CHECKS IF LOTTERY IS RIGGED + if ($L_Rigged == 1) goto L_Rigged_Draw; + // GENERATES RANDOM NUMBERS 1-40 +Pick1: + set $LW1,rand (1,40); + +Pick2: + set $LW2,rand (1,40); + if ($LW2 == $LW1) goto Pick2; + +Pick3: + set $LW3,rand (1,40); + if ($LW3 == $LW2) goto Pick3; + if ($LW3 == $LW1) goto Pick3; + +Pick4: + set $LW4,rand (1,40); + if ($LW4 == $LW2) goto Pick4; + if ($LW4 == $LW1) goto Pick4; + if ($LW4 == $LW3) goto Pick4; + +Pick5: + set $LW5,rand (1,40); + if ($LW5 == $LW1) goto Pick5; + if ($LW5 == $LW2) goto Pick5; + if ($LW5 == $LW3) goto Pick5; + if ($LW5 == $LW4) goto Pick5; + +Pick6: + set $LW6,rand (1,40); + if ($LW6 == $LW1) goto Pick6; + if ($LW6 == $LW2) goto Pick6; + if ($LW6 == $LW3) goto Pick6; + if ($LW6 == $LW4) goto Pick6; + if ($LW6 == $LW5) goto Pick6; + + // BROADCASTS DRAW +L_Broadcast: + Announce "Lottery: Welcome to tonight's lotto draw!",8; + Announce "The numbers are as follows: [" + $LW1 + "] [" + $LW2 + "] [" + $LW3 + "] [" + $LW4 + "] [" + $LW5 + "] [" + $LW6 + "]",8; + Announce "Congratulations to the winners of tonight!",8; + + // GENERATES DRAW ID CODE +L_GenID: + set $LID2,$LID; + // SETS TOMORROW'S ID NUMBER + set $LID,rand (100000,999999); + end; + + // SETS DRAW TO RIGGED NUMBERS +L_Rigged_Draw: + set $LW1,$LR1; + set $LW2,$LR2; + set $LW3,$LR3; + set $LW4,$LR4; + set $LW5,$LR5; + set $LW6,$LR6; + set $L_Rigged,0; + goto L_Broadcast; +} + +prontera,141,182,5 script Lottery 76,{ +L_Begin: + mes "[Lottery]"; + mes "Winning Lotto Numbers ("+$LID2+"):"; + mes "^0000FF[" + $LW1 + "] [" + $LW2 + "] [" + $LW3 + "] [" + $LW4 + "] [" + $LW5 + "] [" + $LW6 + "]^000000"; + if ($LID > 99999) mes "Your Ticket ("+#LID+"):"; + if ($LID > 99999) mes "^FF0000[" + #LW1 + "] [" + #LW2 + "] [" + #LW3 + "] [" + #LW4 + "] [" + #LW5 + "] [" + #LW6 + "]^000000"; + mes "Next Draw-ID: ^FF0000" + $LID + "^000000."; + next; + if (getgmlevel() > 90) goto L_GM; + menu "Claim Prize",L_Claim,"Buy New Ticket",L_Buy,"Cancel",L_Cancel; + +// PURCHASE TICKET +L_Buy: + if (#LID == $LID && #L1 != 0) goto L_DoubleTicket; + mes "[Lottery]"; + mes "Tickets cost ^0000FF" + $L_TicketPrice + "z^000000."; + mes "The Jackpot is ^FF0000" + $L_Prize_Money + "z^000000."; + next; + menu "Buy Ticket",-,"Cancel",L_Cancel; + if (zeny < $L_TicketPrice) goto L_NoZeny; + set zeny,zeny-$L_TicketPrice; + mes "[Lottery]"; + mes "Would you like your numbers hand picked or computer generated?"; + next; + menu "Computer Generated",L_ComputerGen,"Hand Picked",L_HandPick,"Renew Ticket",L_Renew; + +// RENEW LAST TICKET +L_Renew: + if ($LID < 99999) goto L_Invalid; + set #LID,$LID; + goto L_Confirm2; + +L_ComputerGen: +// SELECTS RANDOM NUMBERS + set @L1,0; + set @L2,0; + set @L3,0; + set @L4,0; + set @L5,0; + set @L6,0; +Pick1: + set @L1,rand (1,40); +Pick2: + set @L2,rand (1,40); + if (@L2 == @L1) goto Pick2; +Pick3: + set @L3,rand (1,40); + if (@L3 == @L2) goto Pick3; + if (@L3 == @L1) goto Pick3; +Pick4: + set @L4,rand (1,40); + if (@L4 == @L2) goto Pick4; + if (@L4 == @L1) goto Pick4; + if (@L4 == @L3) goto Pick4; +Pick5: + set @L5,rand (1,40); + if (@L5 == @L1) goto Pick5; + if (@L5 == @L2) goto Pick5; + if (@L5 == @L3) goto Pick5; + if (@L5 == @L4) goto Pick5; +Pick6: + set @L6,rand (1,40); + if (@L6 == @L1) goto Pick6; + if (@L6 == @L2) goto Pick6; + if (@L6 == @L3) goto Pick6; + if (@L6 == @L4) goto Pick6; + if (@L6 == @L5) goto Pick6; + mes "[Lottery]"; + mes "The computer has selected the following numbers:"; + mes "^0000FF" + @L1 + " " + @L2 + " " + @L3 + " " + @L4 + " " + @L5 + " " + @L6 + "^000000"; + next; + menu "Confirm",L_Confirm,"Re-Generate",L_ComputerGen; + +// HAND PICK LOTTERY NUMBERS +L_HandPick: + mes "[Lottery]"; + mes "Please pick your numbers (1-40):"; + set @L1,0; + set @L2,0; + set @L3,0; + set @L4,0; + set @L5,0; + set @L6,0; +Input1: + input @L1; + if (@L1 < 1 || @L1 > 40) goto Input1; + mes @L1; +Input2: + input @L2; + if (@L2 < 1 || @L2 > 40) goto Input2; + if (@L2 == @L1) goto Input2; + mes @L2; +Input3: + input @L3; + if (@L3 < 1 || @L3 > 40) goto Input3; + if (@L3 == @L1) goto Input3; + if (@L3 == @L2) goto Input3; + mes @L3; +Input4: + input @L4; + if (@L4 < 1 || @L4 > 40) goto Input4; + if (@L4 == @L1) goto Input4; + if (@L4 == @L2) goto Input4; + if (@L4 == @L3) goto Input4; + mes @L4; +Input5: + input @L5; + if (@L5 < 1 || @L5 > 40) goto Input5; + if (@L5 == @L1) goto Input5; + if (@L5 == @L2) goto Input5; + if (@L5 == @L3) goto Input5; + if (@L5 == @L4) goto Input5; + mes @L5; +Input6: + input @L6; + if (@L6 < 1 || @L6 > 40) goto Input6; + if (@L6 == @L1) goto Input6; + if (@L6 == @L2) goto Input6; + if (@L6 == @L3) goto Input6; + if (@L6 == @L4) goto Input6; + if (@L6 == @L5) goto Input6; + mes @L6; + next; + mes "[Lottery]"; + mes "Your numbers are:"; + mes "^0000FF" + @L1 + " " + @L2 + " " + @L3 + " " + @L4 + " " + @L5 + " " + @L6 + "^000000"; + next; + menu "Confirm",L_Confirm,"Re-Pick",L_HandPick; + +L_Confirm: + set #LW1,@L1; + set #LW2,@L2; + set #LW3,@L3; + set #LW4,@L4; + set #LW5,@L5; + set #LW6,@L6; + set #LID,$LID; +L_Confirm2: + mes "[Lottery]"; + mes "The live broadcasted draw is at 9pm."; + mes "You can claim your ticket between then and the next draw."; + next; + mes "[Lottery]"; + mes "Good luck!"; + close; + +L_Claim: + // CHECKS TICKET VALIDILITY + if (#LID != $LID2) goto L_Invalid; + // CHECKS HOW MANY NUMBERS MATCHED + set @LPrize,0; + if (#LW1 == $LW1) set @LPrize,@LPrize+1; + if (#LW1 == $LW2) set @LPrize,@LPrize+1; + if (#LW1 == $LW3) set @LPrize,@LPrize+1; + if (#LW1 == $LW4) set @LPrize,@LPrize+1; + if (#LW1 == $LW5) set @LPrize,@LPrize+1; + if (#LW1 == $LW6) set @LPrize,@LPrize+1; + if (#LW2 == $LW1) set @LPrize,@LPrize+1; + if (#LW2 == $LW2) set @LPrize,@LPrize+1; + if (#LW2 == $LW3) set @LPrize,@LPrize+1; + if (#LW2 == $LW4) set @LPrize,@LPrize+1; + if (#LW2 == $LW5) set @LPrize,@LPrize+1; + if (#LW2 == $LW6) set @LPrize,@LPrize+1; + if (#LW3 == $LW1) set @LPrize,@LPrize+1; + if (#LW3 == $LW2) set @LPrize,@LPrize+1; + if (#LW3 == $LW3) set @LPrize,@LPrize+1; + if (#LW3 == $LW4) set @LPrize,@LPrize+1; + if (#LW3 == $LW5) set @LPrize,@LPrize+1; + if (#LW3 == $LW6) set @LPrize,@LPrize+1; + if (#LW4 == $LW1) set @LPrize,@LPrize+1; + if (#LW4 == $LW2) set @LPrize,@LPrize+1; + if (#LW4 == $LW3) set @LPrize,@LPrize+1; + if (#LW4 == $LW4) set @LPrize,@LPrize+1; + if (#LW4 == $LW5) set @LPrize,@LPrize+1; + if (#LW4 == $LW6) set @LPrize,@LPrize+1; + if (#LW5 == $LW1) set @LPrize,@LPrize+1; + if (#LW5 == $LW2) set @LPrize,@LPrize+1; + if (#LW5 == $LW3) set @LPrize,@LPrize+1; + if (#LW5 == $LW4) set @LPrize,@LPrize+1; + if (#LW5 == $LW5) set @LPrize,@LPrize+1; + if (#LW5 == $LW6) set @LPrize,@LPrize+1; + if (#LW6 == $LW1) set @LPrize,@LPrize+1; + if (#LW6 == $LW2) set @LPrize,@LPrize+1; + if (#LW6 == $LW3) set @LPrize,@LPrize+1; + if (#LW6 == $LW4) set @LPrize,@LPrize+1; + if (#LW6 == $LW5) set @LPrize,@LPrize+1; + if (#LW6 == $LW6) set @LPrize,@LPrize+1; + + if (@LPrize == 6) goto LWinBig; + if (@LPrize > 3 && @LPrize < 6) goto LWinSmall; + +// NO WINNER + mes "[Lottery]"; + mes "Bad luck, it appears you do not hold a winning ticket."; + next; + mes "[Lottery]"; + mes "Better luck next time!."; + close; + +// MATCHED ALL SIX +LWinBig: + mes "[Lottery]"; + mes "You have matched all six numbers!"; + mes "Jackpot!"; + mes "You've won ^0000FF" + $L_Prize_Money + "z^000000."; + set zeny,zeny+$L_Prize_Money; + Announce "Lottery: " + strcharinfo(0) + " has won the JACKPOT of " + $L_Prize_Money + "z!",8; + set #LID,0; + close; + +// MATCHED AT LEAST 4 +LWinSmall: + mes "[Lottery]"; + mes "You have matched at least 4 numbers!"; + mes "You've won ^0000FF" + $L_Prize_Money_Small + "z^000000."; + set zeny,zeny+$L_Prize_Money_Small; + Announce "Lottery: " + strcharinfo(0) + " has won a prize of " + $L_Prize_Money_Small + "z!",8; + set #LID,0; + close; + +// NO ZENY +L_NoZeny: + mes "[Lottery]"; + mes "You can't afford a lottery ticket."; + close; + +// INVALID TICKET +L_Invalid: + mes "[Lottery]"; + mes "I'm sorry but it appears that you have an invalid ticket."; + close; + +// DOUBLE TICKET +L_DoubleTicket: + mes "[Lottery]"; + mes "It appears that you already have a ticket for today."; + mes "You may only purchase one ticket per draw."; + close; + +L_Cancel: + mes "[Lottery]"; + mes "Come back soon!"; + close; + +// GM MENU (Lets you manually do draws) +L_GM: + menu "Claim Prize",L_Claim,"Buy New Ticket",L_Buy,"[GM]Do Draw Now",-,"[GM]Rig the Lottery",L_GM_Rig,"Cancel",L_Cancel; + + // CHECKS IF LOTTERY IS RIGGED + if ($L_Rigged == 1) goto L_Rigged_Draw; + // GENERATES RANDOM NUMBERS 1-40 +GMPick1: + set $LW1,rand (1,40); + +GMPick2: + set $LW2,rand (1,40); + if ($LW2 == $LW1) goto GMPick2; + +GMPick3: + set $LW3,rand (1,40); + if ($LW3 == $LW2) goto GMPick3; + if ($LW3 == $LW1) goto GMPick3; + +GMPick4: + set $LW4,rand (1,40); + if ($LW4 == $LW2) goto GMPick4; + if ($LW4 == $LW1) goto GMPick4; + if ($LW4 == $LW3) goto GMPick4; + +GMPick5: + set $LW5,rand (1,40); + if ($LW5 == $LW1) goto GMPick5; + if ($LW5 == $LW2) goto GMPick5; + if ($LW5 == $LW3) goto GMPick5; + if ($LW5 == $LW4) goto GMPick5; + +GMPick6: + set $LW6,rand (1,40); + if ($LW6 == $LW1) goto GMPick6; + if ($LW6 == $LW2) goto GMPick6; + if ($LW6 == $LW3) goto GMPick6; + if ($LW6 == $LW4) goto GMPick6; + if ($LW6 == $LW5) goto GMPick6; + +// BROADCASTS DRAW +L_Broadcast: + Announce "Lottery: Welcome to the special GM's lotto draw!",8; + Announce "The numbers are as follows: [" + $LW1 + "] [" + $LW2 + "] [" + $LW3 + "] [" + $LW4 + "] [" + $LW5 + "] [" + $LW6 + "]",8; + Announce "Congratulations to the winners!",8; + +// GENERATES DRAW ID CODE +L_GenID: + set $LID2,$LID; + // SETS TOMORROW'S ID NUMBER + set $LID,rand (100000,999999); + close; + +// SETS DRAW TO RIGGED NUMBERS +L_Rigged_Draw: + set $LW1,$LR1; + set $LW2,$LR2; + set $LW3,$LR3; + set $LW4,$LR4; + set $LW5,$LR5; + set $LW6,$LR6; + set $L_Rigged,0; + goto L_Broadcast; + +// ALLOWS GM TO DO A RIGGED DRAW +L_GM_Rig: + mes "[Lottery]"; + mes "Please pick your numbers (1-40):"; + set $LR1,0; + set $LR2,0; + set $LR3,0; + set $LR4,0; + set $LR5,0; + set $LR6,0; +GMInput1: + Input $LR1; + if ($LR1 < 1 || $LR1 > 40) goto GMInput1; + mes $LR1; +GMInput2: + Input $LR2; + if ($LR2 < 1 || $LR2 > 40) goto GMInput2; + if ($LR2 == $LR1) goto GMInput2; + mes $LR2; +GMInput3: + Input $LR3; + if ($LR3 < 1 || $LR3 > 40) goto GMInput3; + if ($LR3 == $LR1) goto GMInput3; + if ($LR3 == $LR2) goto GMInput3; + mes $LR3; +GMInput4: + Input $LR4; + if ($LR4 < 1 || $LR4 > 40) goto GMInput4; + if ($LR4 == $LR1) goto GMInput4; + if ($LR4 == $LR2) goto GMInput4; + if ($LR4 == $LR3) goto GMInput4; + mes $LR4; +GMInput5: + Input $LR5; + if ($LR5 < 1 || $LR5 > 40) goto GMInput5; + if ($LR5 == $LR1) goto GMInput5; + if ($LR5 == $LR2) goto GMInput5; + if ($LR5 == $LR3) goto GMInput5; + if ($LR5 == $LR4) goto GMInput5; + mes $LR5; +GMInput6: + Input $LR6; + if ($LR6 < 1 || $LR6 > 40) goto GMInput6; + if ($LR6 == $LR1) goto GMInput6; + if ($LR6 == $LR2) goto GMInput6; + if ($LR6 == $LR3) goto GMInput6; + if ($LR6 == $LR4) goto GMInput6; + if ($LR6 == $LR5) goto GMInput6; + mes $LR6; + next; + mes "[Lottery]"; + mes "Lottery rigged for next draw."; + set $L_Rigged,1; + close; +} diff --git a/npc/custom/etc/marriage.txt b/npc/custom/etc/marriage.txt new file mode 100644 index 000000000..0f21c46e7 --- /dev/null +++ b/npc/custom/etc/marriage.txt @@ -0,0 +1,937 @@ +//===== rAthena Script ======================================= +//= Wedding Script +//===== By: ================================================== +//= AppleGirl, Evera +//===== Current Version: ===================================== +//= 2.9 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Fully working wedding script for all kind of weddings +//===== Additional Comments: ================================= +// 1.1 Lesbian and Gay Weddings [ShadowLady] +// 2.0 Complete Rewrite [Skotlex] +// 2.9 Somewhat iRO-official NPC names [DracoRPG] +//============================================================ + +// Configuration Variables: +- script marriage_init -1,{ +OnInit: + set $@wed_allow, 0; //If 1, allows same sex marriages. + set $@wed_veil, 0; //Set to 0 to disable veil check on the bride + +//Id of the item that is traded for the wedding ring (use 0 to disable): + set $@wed_ring, 2613; + + set $@wed_groom_reg, 1300000; //Registration cost for the Groom + set $@wed_bride_reg, 1200000; //Registration cost for the Bride + set $@wed_divorce_fee, 50000; //Divorcing fee + set $@wedding_effect, 1; //On who to display the FX: 0: Priest, 1: Bride, 2: Groom + end; +} + +// Other Configuration: +// Line 61,62: Priest location, sprite and name. +// Line 437,438: Registration location, sprite and name. +// Line 813,814: Divorcing location, sprite and name. + +// Variable Notes: +// $wed_progress Signals that there is a wedding in progress +// $wed_groom$ - Groom's name storage +// $wed_groom_sex - Groom's gender (for same marriage ring giving) +// $wed_bride$ - Bride's name storage +// $wed_bride_sex - Groom's gender (for same marriage ring giving) +// $wed_groom_progress - Notes the progress on the groom's part +// $wed_bride_progress - Notes the progress on the bride's part +// 0: Not registered. 1: Registered. 2: Accepted the partner. 3: Ready to +// Retrieve the ring. 4: Retrieved the ring. 5: All set to be wed. 6: Already +// a couple. +// ceremony. +// $wedding_effect_id - When wedding_effect is enabled, sets the ID of the +// player to show the effect on. +// $divorce_progress signals that there is a divorce in progress +// $@divorcer$ name of the person who requested divorce +// $@divorcee id of the partner, who has to accept the divorce and pay. + +//The Priest - official iRO sprite & in-dialog name (on-map name not confirmed) +prt_church,100,123,4 script Vomars 60,{ + set @name$,"Vomars"; + + function SF_wed_end; + function SF_equip_check; + function SF_Groom; + function SF_Bride; + function SF_AcceptGroom; + function SF_AcceptBride; + function SF_RetrieveRingM; + function SF_RetrieveRingF; + function SF_RingsAccepted; + function SF_StartCeremony; + + if (getpartnerid() > 0) { + mes "["+@name$+"]"; + mes "You have my blessings, have a wonderful married life."; + close; + } + if ($wed_progress == 0) { // Official iRO dialog + mes "["+@name$+"]"; + mes "You must apply for"; + mes "marriage with Happy Marry"; + mes "before you can get married."; + mes "Happy Marry will let you know"; + mes "what else you'll need to do"; + mes "to prepare for marriage"; + close; + } // End official iRO dialog + + if (strcharinfo(0) == $wed_groom$) { + SF_Groom(); + end; + } + if (strcharinfo(0) == $wed_bride$) { + SF_Bride(); + end; + } + mes "["+@name$+"]"; + if ($wed_groom_progress == 0 || $wed_bride_progress == 0) { + mes "There is a wedding being planned. I would appreciate it if you would not interrupt me."; + close; + } + if ($wed_groom_progress == 6) { + mes "I am wedding "+$wed_groom$+" and "+$wed_bride$+", and it's already too late to object. Please let me continue."; + close; + } + mes "I am going to wed "+$wed_groom$+" and "+$wed_bride$+", do you have an objection to it?"; + if (select("Sorry, please go on.","Yes, I actually do.") == 2) { + //Abort + npctalk "Ladies and gentlemen, "+strcharinfo(0)+" has an objection to the wedding!"; + SF_wed_end(); + mes "Why should they not be wed?"; + input $@msg$; + npctalk strcharinfo(0)+"'s objection is: "+$@msg$; + emotion e_sob; + mes "I see..."; + } else + mes "Very well, go sit and enjoy the ceremony."; + close; + +function SF_Groom { + if ($wed_bride_progress == 0) { + mes "["+@name$+"]"; + mes "Looks like your bride has yet to arrive and register."; + close; + } + if (SF_equip_check() == 0) + close; + + switch($wed_groom_progress) { + case 1: + SF_AcceptBride(); + break; + case 2: + mes "["+@name$+"]"; + mes "I am waiting for your partner to accept you to start the ceremony."; + close; + case 3: + SF_RetrieveRingM(); + break; + case 4: + mes "["+@name$+"]"; + mes "Your partner's wedding ring hasn't been retrieved yet. The ceremony will start as soon as you both have claimed your rings."; + close; + case 5: + mes "["+@name$+"]"; + SF_StartCeremony(); + break; + default: + mes "["+@name$+"]"; + mes "Please don't interrupt me now."; + close; + } +} + +function SF_Bride { + if ($wed_groom_progress == 0) { + mes "["+@name$+"]"; + mes "Looks like your groom has yet to arrive and register."; + close; + } + + if (SF_equip_check() == 0) + close; + + switch ($wed_bride_progress) { + case 1: + SF_AcceptGroom(); + break; + case 2: + mes "["+@name$+"]"; + mes "I am waiting for your partner to accept you to start the ceremony."; + close; + case 3: + SF_RetrieveRingF(); + break; + case 4: + mes "["+@name$+"]"; + mes "Your partner's wedding ring hasn't been retrieved yet. The ceremony will start as soon as you both have claimed your rings."; + close; + case 5: + mes "["+@name$+"]"; + SF_StartCeremony(); + break; + default: + mes "["+@name$+"]"; + mes "Please don't interrupt me now."; + close; + } +} + +function SF_AcceptGroom { + mes "["+@name$+"]"; + mes $wed_bride$+", "+$wed_groom$+" has requested to be your husband for the rest of your life. Do you accept?"; + next; + switch(select("I need time to think about it.","No, I don't!","Yes, I do!")) { + case 1: + mes "["+@name$+"]"; + mes "You what!?"; + mes "err.. *cough* *cough* very well... come back after you've made up your mind."; + emotion e_ag; + close; + case 2: + mes "["+@name$+"]"; + mes "!!"; + mes "Ah... err... ehm... okay. You two seem to have some differences to settle first."; + close2; + emotion e_omg; + npctalk "Ladies and gentlemen, "+$wed_bride$+" has rejected to marry "+$wed_groom$+"!"; + SF_wed_end(); + break; + case 3: + set $wed_bride_progress,2; + if ($wed_groom_progress == 2) { + SF_RingsAccepted(); + break; + } + emotion e_ok; + mes "["+@name$+"]"; + mes "After your groom approves, you will be given your rings, the ceremony will begin and you will be officially married."; + close; + } +} + +function SF_AcceptBride { + mes "["+@name$+"]"; + mes $wed_groom$+", "+$wed_bride$+" has requested to be your wife for the rest of your life. Do you accept?"; + next; + switch(select("I need time to think about it.","No, I don't!","Yes, I do!")) { + case 1: + mes "["+@name$+"]"; + mes "You what!?"; + mes "err.. *cough* *cough* very well... come back after you've made up your mind."; + emotion e_ag; + close; + case 2: + mes "["+@name$+"]"; + mes "!!"; + mes "Ah... err... ehm... okay. You two seem to have some differences to settle first."; + emotion e_omg; + close2; + npctalk "Ladies and gentlemen, "+$wed_groom$+" has rejected to marry "+$wed_bride$+"!"; + SF_wed_end(); + break; + case 3: + set $wed_groom_progress,2; + if ($wed_bride_progress == 2) { + SF_RingsAccepted(); + break; + } + emotion e_ok; + mes "["+@name$+"]"; + mes "After your bride approves, you will be given your rings, the ceremony will begin and you will be officially married."; + close; + } +} + +function SF_RingsAccepted { + mes "["+@name$+"]"; + mes "Now that you both have accepted, the wedding will begin. Please come forth, you and your partner, to retrieve your rings."; + set $wed_bride_progress,3; + set $wed_groom_progress,3; + announce $wed_groom$+" and "+$wed_bride$+"'s wedding ceremony will be held at the church!",8; + close2; + emotion e_lv; + npctalk "May the groom and bride please step forward and retrieve their rings?"; +} + +function SF_RetrieveRingM { + mes "["+@name$+"]"; + if ($@wed_ring && countitem($@wed_ring) < 1) { + mes "What happened to your "+getitemname($@wed_ring)+"? You didn't lose it... did you? We need it to continue with the ceremony!"; + close; + } + if ($wed_bride_sex) + set @item, 2634; //Groom's wedding ring + else + set @item, 2635; //Bride's wedding ring + if (getnameditem(@item,$wed_groom$) == 0) { + mes "You don't seem to have enough space to carry the ring... go free up some space and come back to reclaim your partner's ring."; + close; + } + mes "Here's the wedding ring for your bride."; + if ($@wed_ring) delitem $@wed_ring,1; + set $wed_groom_progress,4; + + if ($wed_bride_progress == 4) + SF_StartCeremony(); + else { + mes "Once your bride retrieves the ring, the ceremony will begin."; + close; + } +} + +function SF_RetrieveRingF { + mes "["+@name$+"]"; + if ($@wed_ring && countitem($@wed_ring) < 1) { + mes "What happened to your "+getitemname($@wed_ring)+"? You didn't lose it... did you? We need it to continue with the ceremony!"; + close; + } + if ($wed_groom_sex) + set @item, 2634; //Groom's wedding ring + else + set @item, 2635; //Bride's wedding ring + + if (getnameditem(@item,$wed_bride$) == 0) { + mes "You don't seem to have enough space to carry the ring... go free up some space and come back to reclaim your partner's ring."; + close; + } + mes "Here's the wedding ring for your groom."; + if ($@wed_ring) delitem $@wed_ring,1; + set $wed_bride_progress,4; + + if ($wed_groom_progress == 4) + SF_StartCeremony(); + else { + mes "Once your groom retrieves the ring, the ceremony will begin."; + close; + } +} + +function SF_StartCeremony { + mes "I will now start the wedding ceremony, and you will be declared forth husband and wife."; + set $wed_bride_progress,5; + set $wed_groom_progress,5; + set $@msg$,$wed_groom$; + if (strcharinfo(0) == $wed_groom$) + set $@msg$,$wed_bride$; + if (marriage($@msg$) == 0) { + next; + mes "["+@name$+"]"; + mes "Where is "+$@msg$+"?? I can't marry you both if one is missing..."; + close; + } + set $wed_bride_progress,6; + set $wed_groom_progress,6; + initnpctimer; + close; +} + +OnTimer1000: + npctalk "Ladies and Gentlemen, We will now join in holy matrimony these two lovers."; + end; + +OnTimer5000: + npctalk "Now more than ever, will both of your lives be entwined together as so will be your souls."; + end; + +OnTimer10000: + npctalk "You will both honor and cherish each other through the best and worst of times."; + end; + +OnTimer15000: + npctalk "The safety and well being of your other will now also be your responsibility."; + end; + +OnTimer20000: + npctalk "May in sickness or good health, your love burn bright like no force can extinguish it."; + end; + +OnTimer25000: + npctalk "Those here stand witness to these vows bestowed upon you, you must act accordingly to them."; + end; + +OnTimer30000: + npctalk "Understanding that, we are nothing more but mortals on this earth, but this is our triumph."; + end; + +OnTimer35000: + npctalk "We here will now join these two mortal entities, and create an immortal love."; + end; + +OnTimer40000: + npctalk $wed_groom$+", you have accepted to take "+$wed_bride$+" as your lawfully wedded wife,"; + end; + +OnTimer45000: + npctalk "and you, "+$wed_bride$+", have accepted take "+$wed_groom$+" as your lawfully wedded husband."; + end; + +OnTimer50000: + npctalk "And as such, now, by the powers vested in me..."; + end; + +OnTimer55000: + npctalk "I pronounce you Husband and Wife, you may kiss the bride and exchange rings."; + if ($wedding_effect_id && isloggedin($wedding_effect_id)) + { + attachrid($wedding_effect_id); + wedding; + detachrid; + } else + wedding; + SF_wed_end(); + stopnpctimer; + end; + +//Subfunction: Checks that the groom/bride is still wearing their stuff. +function SF_equip_check { + if (sex && getequipid(2) != 7170) { + mes "["+@name$+"]"; + mes "Child, what did you do with your "+getitemname(7170)+"?"; + emotion e_dots; + return 0; + } + if (sex == 0 && getequipid(2) != 2338) { + mes "["+@name$+"]"; + mes "Child, you are supposed to wear a "+getitemname(2338)+" at all times during the ceremony..."; + emotion e_dots; + return 0; + } + if (sex == 0 && $@wed_veil && getequipid(1) != 2206) { + mes "["+@name$+"]"; + mes "Child, you can't take off your "+getitemname(2206)+" yet...."; + emotion e_dots; + return 0; + } + return 1; +} + +//Subfunction: Resets wedding variables. +function SF_wed_end { + set $wed_groom$,""; + set $wed_groom_sex, 0; + set $wed_bride$,""; + set $wed_bride_sex, 0; + set $wed_groom_progress,0; + set $wed_bride_progress,0; + set $wed_progress,0; + set $wedding_effect_id,0; +} + +OnInit: + if ($wed_groom_progress==6) { + SF_wed_end(); + } + end; +} + +//Registration & Status +prt_church,106,99,3 script Happy Marry 67,{ + set @name$,"Marry"; + if (getpartnerid() > 0) { + mes "["+@name$+"]"; + mes "Isn't marriage beautiful?"; + close; + } + + function SF_WedProgress; + function SF_Principles; + function SF_Procedure; + function SF_Register; + function SF_TryRegister; + + if ($wed_progress) { + SF_WedProgress(); + end; + } + + do { + mes "["+@name$+"]"; + mes "Marriage... is such a beautiful thing."; + mes "Would you like to get married with someone?"; + next; + set @menu, select( + "I'll be single forever!", + "Explain the principles of marriage.", + "Explain the marriage procedure.", + "I want to get married with someone." + ); + switch (@menu) { + case 1: //Quit + mes "["+@name$+"]"; + mes "In that case, enjoy your bachelor's life."; + close; + case 2: //Principles + SF_Principles(); + break; + case 3: //Procedure + SF_Procedure(); + break; + case 4: //Register + SF_Register(); + break; + } + } while (@menu > 1); + end; + +function SF_Register { + if ($@wed_allow) { //Role select + mes "["+@name$+"]"; + mes "Very well, whom would you like to register as?"; + next; + set @submenu, select("Groom","Bride","Cancel"); + } else if (sex) { //Groom + mes "["+@name$+"]"; + mes "Very well, will you register as the Groom?"; + next; + if (select("Yes","I've changed my mind.")==1) + set @submenu, 1; + else + set @submenu, 3; + } else { //Bride + mes "["+@name$+"]"; + mes "Very well, will you register as the Bride?"; + next; + if (select("Yes","I've changed my mind.")==1) + set @submenu, 2; + else + set @submenu, 3; + } + switch (@submenu) { + case 1: //Groom + SF_TryRegister(0); + set $wed_progress,1; + mes "["+@name$+"]"; + mes "You are now registered as the groom."; + mes "Tell your bride to register as soon as possible."; + emotion e_hmm; + initnpctimer; + close; + case 2: //Bride + SF_TryRegister(1); + set $wed_progress,1; + mes "["+@name$+"]"; + mes "You are now registered as the bride."; + mes "Tell your groom to register as soon as possible."; + emotion e_hmm; + initnpctimer; + close; + default: //Cancel + mes "["+@name$+"]"; + mes "Come back when you are ready."; + close; + } +} + +function SF_WedProgress { + if (strcharinfo(0) == $wed_groom$) { + mes "["+@name$+"]"; + if ($wed_bride_progress > 0) + mes "The Priest will handle the rest of the ceremony."; + else + mes "Tell your bride to register, what is taking so long? Time is running out."; + close; + } + if (strcharinfo(0) == $wed_bride$) { + mes "["+@name$+"]"; + if ($wed_groom_progress > 0) + mes "The Priest will handle the rest of the ceremony."; + else + mes "Tell your groom to register, what is taking so long? Time is running out."; + close; + } + if (($wed_groom_progress == 0) && (sex == 1 || $@wed_allow == 1)) { + mes "["+@name$+"]"; + mes $wed_bride$+" is waiting for the groom to register. Are you the one who came to register as groom?"; + next; + if (select("Yes, I am.","Sorry, you got the wrong person.") == 1) { + SF_TryRegister(0); + stopnpctimer; + set $wed_groom_progress,1; + mes "["+@name$+"]"; + mes "Very well, now go to the Priest to reaffirm your vows and the ceremony will begin."; + emotion e_no1; + close2; + npctalk "Registration finished. "+$wed_groom$+" and "+$wed_bride$+", please reaffirm your vows with the Priest."; + emotion e_no1; + end; + } else { + mes "["+@name$+"]"; + mes "I see. Sorry to have bothered you then."; + close; + } + + } + if (($wed_bride_progress == 0) && (sex == 0 || $@wed_allow == 1)) { + mes "["+@name$+"]"; + mes $wed_groom$+" is waiting for the bride to register. Are you the one who came to register as the bride?"; + next; + if(select("Yes, I am.","Sorry, you got the wrong person.") == 1) { + SF_TryRegister(1); + stopnpctimer; + mes "["+@name$+"]"; + mes "Very well, now go to the Priest to reaffirm your vows and the ceremony will begin."; + emotion e_no1; + close2; + npctalk "Registration finished. "+$wed_groom$+" and "+$wed_bride$+", please reaffirm your vows with the Priest."; + emotion e_no1; + end; + } else { + mes "["+@name$+"]"; + mes "I see. Sorry to have bothered you then."; + close; + } + } + mes "["+@name$+"]"; + mes "There is a wedding in progress."; + mes "Would you like to know the progress of said wedding?"; + next; + if (select("Yes","No") != 1) { + mes "["+@name$+"]"; + mes "Enjoy the wedding."; + close; + } + //Display Progress + mes "["+@name$+"]"; + switch ($wed_groom_progress) { + case 0: + mes "The groom has not registered yet."; + break; + case 1: + mes "The groom, "+$wed_groom$+", has yet to accept the bride."; + break; + case 2: + mes "The groom, "+$wed_groom$+", is waiting for the bride's acceptance."; + break; + case 3: + mes "The groom, "+$wed_groom$+", has yet to retrieve the ring."; + break; + case 4: + mes "The groom, "+$wed_groom$+", is waiting for the bride to retrieve the ring."; + break; + } + switch ($wed_bride_progress) { + case 0: + mes "The bride has not registered yet."; + break; + case 1: + mes "The bride, "+$wed_bride$+", has yet to confirm the groom."; + break; + case 2: + mes "The bride, "+$wed_bride$+", is waiting for the groom's acceptance."; + break; + case 3: + mes "The bride, "+$wed_bride$+", has yet to retrieve the ring."; + break; + case 4: + mes "The bride, "+$wed_bride$+", is waiting for the groom to retrieve the ring."; + break; + case 5: + mes "We are just waiting for both "+$wed_groom$+" and "+$wed_bride$+" to be together to marry them."; + break; + case 6: + mes $wed_groom$+" and "+$wed_bride$+"'s wedding ceremony is already well on it's way."; + break; + } + mes "Enjoy the remaining of the wedding."; + close; +} + +OnInit: + if ($wed_groom_progress + $wed_bride_progress == 1) + initnpctimer; + end; + +OnTimer60000: + //Registration failed. + if ($wed_bride_progress == 1) + set $@msg$, $wed_bride$; + else + set $@msg$, $wed_groom$; + + npctalk "Registration timed out. Is it that noone wants to marry "+$@msg$+"..?"; + emotion e_hmm; + + set $wed_groom$,""; + set $wed_groom_sex, 0; + set $wed_bride$,""; + set $wed_bride_sex, 0; + set $wed_groom_progress,0; + set $wed_bride_progress,0; + set $wed_progress,0; + stopnpctimer; + end; + +//Subfunction SF_TryRegister (int bride) +function SF_TryRegister { + set @bride, getarg(0); + set @type$, "groom"; + if (@bride) + set @type$, "bride"; + + mes "["+@name$+"]"; + mes "Before registering as "+@type$+", let me check if you meet all the requirements..."; + next; + if (Upper == 2) { + mes "["+@name$+"]"; + mes "Oh dear, you are too young to be thinking of marriage!"; + emotion e_gasp; + close; + } + if (sex) + set @item, 7170; + else + set @item, 2338; + + if (getequipid(2) != @item) { + mes "["+@name$+"]"; + mes "You should be wearing a "+getitemname(@item)+" if you want to get married."; + close; + } + if (sex == 0 && $@wed_veil && getequipid(1) != 2206) { + mes "["+@name$+"]"; + mes "Where is your "+getitemname(2206)+"? It's a necessary complement to your dress."; + close; + } + if ($@wed_ring && countitem($@wed_ring) < 1) { + mes "["+@name$+"]"; + mes "Where's the ring? You need a "+getitemname($@wed_ring)+" for the ring exchange, dear."; + close; + } + if (@bride) + set @cost, $@wed_bride_reg; + else + set @cost, $@wed_groom_reg; + + if (Zeny < @cost) { + mes "["+@name$+"]"; + mes "I am sorry, but you don't have enough to pay for the registration fee."; + mes "Come back once you have collected "+@cost+"z."; + close; + } + set Zeny,Zeny-@cost; + sc_start SC_Wedding,3600000000,1; //Start Wedding Effect (SC_WEDDING) + if (@bride) { + set $wed_bride_progress,1; + set $wed_bride$,strcharinfo(0); + set $wed_bride_sex, sex; + if ($@wedding_effect == 1) //Store account id for effect. + set $wedding_effect_id, getcharid(3); + } else { + set $wed_groom_progress,1; + set $wed_groom$,strcharinfo(0); + set $wed_groom_sex, sex; + if ($@wedding_effect == 2) //Store account id for effect. + set $wedding_effect_id, getcharid(3); + } +} + +//Explain wedding principles... +function SF_Principles { + mes "["+@name$+"]"; + mes "Weddings are performed by our local Priest with the intent of promoting love and peace among the loving couples."; + next; + mes "["+@name$+"]"; + mes "The proposal must be done with prudence and courtesy, once the wedlocks have been made, they cannot be undone."; + next; + mes "["+@name$+"]"; + mes "The two who have been joined by marriage must remain together forever until the day death do them apart."; + next; + mes "["+@name$+"]"; + if ($@wed_allow == 1) + mes "Altough normally only males can wed females (and viceversa), our local Priest is more open-minded than that and he permits all pairings regardless of gender."; + else + mes "Males may only wed with females, and females only with males, the church will not consent any other kind of partnerships."; + next; + mes "["+@name$+"]"; + mes "If there is a significant other with whom you want to spend the rest of your life with, then don't be shy to propose."; + next; + mes "["+@name$+"]"; + mes "I wish for many blessings upon couples who wish to live happily ever after..."; + next; +} + +//Explain the wedding procedure... +function SF_Procedure { + mes "["+@name$+"]"; + mes "First of all, both groom and bride must register with me."; + next; + if ($@wed_allow == 1) { + mes "["+@name$+"]"; + mes "The registration requirements are:"; + mes "- Males must be wearing a "+getitemname(7170)+"."; + mes "- Females must be wearing a "+getitemname(2338)+"."; + if ($@wed_veil) mes "- Females must also wear a "+getitemname(2206)+"."; + if ($@wed_ring) mes "- Both must own a "+getitemname($@wed_ring)+" each."; + if ($@wed_groom_reg > 0) mes "- The registration fee for the groom is "+$@wed_groom_reg+"z."; + if ($@wed_bride_reg > 0) mes "- The registration fee for the bride is "+$@wed_bride_reg+"z."; + } else { + mes "["+@name$+"]"; + mes "The registration requirements for the groom are:"; + mes "- To be wearing a "+getitemname(7170)+"."; + if ($@wed_ring) mes "- To own a "+getitemname($@wed_ring)+"."; + if ($@wed_groom_reg > 0) mes "- Pay a Registration fee of "+$@wed_groom_reg+"z."; + next; + mes "["+@name$+"]"; + mes "The registration requirements for the bride are:"; + mes "- To be wearing a "+getitemname(2338)+"."; + if ($@wed_veil) mes "- To be wearing a "+getitemname(2206)+"."; + if ($@wed_ring) mes "- To own a "+getitemname($@wed_ring)+"."; + if ($@wed_bride_reg > 0) mes "- Pay a Registration fee of "+$@wed_bride_reg+"z."; + } + next; + mes "["+@name$+"]"; + mes "I shouldn't need to mention this, but adopted kids are too young to get married."; + mes "Both groom and bride must register within a minute of each other, or the wedding will be cancelled. So be sure you both are ready and meet the registration requirements beforehand."; + next; + mes "["+@name$+"]"; + mes "After both have registered with me, you have to go pledge your vows to the Priest and accept your registered partner. If for some reason you reject your registered partner, the wedding will be cancelled..."; + next; + mes "["+@name$+"]"; + mes "If you both accept each other, then the wedding has been decided and the ceremony will begin."; + if ($@wed_ring) { + mes "But first, you need to get your rings ready."; + next; + mes "["+@name$+"]"; + mes "Talk to the priest once more, and he will exchange your "+getitemname($@wed_ring)+" for a wedding ring. After you both have claimed the rings for exchanging, the ceremony will begin."; + } + next; + mes "["+@name$+"]"; + mes "If there are various couples who desire to marry, you should keep in order, for the Priest can only handle one wedding at a time."; + next; +} +} + +prt_church,94,99,4 script Sister Lisa 79,{ + set @name$,"Lisa"; + + function SF_DivorceEnd; + function SF_InProgress; + + if ($@divorce_progress==1) { + goto SF_InProgress; + end; + } + + do { + mes "["+@name$+"]"; + mes "Divorcing can be such a sad event..."; + if (getpartnerid() == 0) { + mes "People shouldn't make shallow vows to others, don't you think?"; + close; + } + mes "You wouldn't want to divorce, by any chance?"; + next; + set @menu, select( + "I am happy as I am, thank you.", + "Explain the divorce.", + "Explain Requirements.", + "I want to divorce." + ); + switch (@menu) { + case 1: + mes "["+@name$+"]"; + mes "Good to hear."; + close; + case 2: //Explanation + mes "["+@name$+"]"; + mes "Even though it is said that once the wedlocks have been made they cannot be undone, sometimes it is necessary to undo our mistakes from the past.."; + next; + mes "["+@name$+"]"; + mes "It is sad, but true. If you happen to have married the wrong person, it is possible to divorce, rather than spend the rest of your life with the wrong one."; + next; + break; + case 3: //Requirement + mes "["+@name$+"]"; + mes "In order to file for divorce, I need you both to agree to it."; + mes "After you file in for divorce, your spouse has one minute to agree, and then you will both be divorced."; + if ($@wed_divorce_fee > 0) mes "The fee is of "+$@wed_divorce_fee+"z and is paid by the person who confirms the divorce, so plan ahead of time how you will divide the costs."; + next; + break; + case 4: //Divorce + mes "["+@name$+"]"; + mes "You should not regret the choices you've made in life."; + mes "Are you positively sure about getting divorced?"; + next; + if (select("Wait... I need to think about it.","Absolutely") != 2) { + mes "["+@name$+"]"; + mes "You should think this through."; + close; + } + mes "["+@name$+"]"; + set $@divorcee,getpartnerid(); + set $@divorcer$,strcharinfo(0); + set $@divorce_progress,1; + initnpctimer; + mes "Very well, get your partner to confirm, and I will collect the fee for filing the divorce then."; + close; + } + } while (@menu > 1); +end; + +function SF_InProgress { + if (strcharinfo(0) == $@divorcer$) { + mes "["+@name$+"]"; + mes "...I am still waiting for your partner to confirm the divorce procedure."; + close; + } + if (getcharid(0) != $@divorcee) { + mes "["+@name$+"]"; + mes "I am in the progress of divorcing "+$@divorcer$+"."; + mes "Do you know who the spouse is?"; + close; + } + //Confirm... + mes "["+@name$+"]"; + mes $@divorcer$+" has asked to divorce you. If you accept, and have the fee of "+$@wed_divorce_fee+"z at hand, I will proceed to divorce you two."; + mes "So, should I proceed with the divorce?"; + next; + if (select("I don't want to divorce....","Yes, we have agreed to this.")!=2) { + mes "["+@name$+"]"; + mes "I hope you can work things out."; + emotion e_pat; + goto SF_DivorceEnd; + close; + } + if (Zeny < $@wed_divorce_fee) { + mes "["+@name$+"]"; + mes "Well, I can't file your divorce because you don't have enough for the fee. Get your partner to lend you some?"; + close; + } + if (!(divorce())) { + mes "["+@name$+"]"; + mes "Where has "+$@divorcer$+" gone to? I can't divorce you unless you both are here..."; + emotion e_swt2; + close; + } + set Zeny,Zeny-$@wed_divorce_fee; + announce $@divorcer$+" has just divorced "+strcharinfo(0)+"...", 8; + mes "["+@name$+"]"; + mes "Your divorce has been filed. You are no longer wed."; + emotion e_sob; + goto SF_DivorceEnd; + close; +} + +function SF_DivorceEnd { + stopnpctimer; + set $@divorce_progress,0; + set $@divorcee,0; + set $@divorcer$,""; +} + +OnTimer60000: + npctalk "Divorce confirmation time's is up. Where did "+$@divorcer$+"'s spouse go..."; + emotion e_what; + SF_DivorceEnd(); + end; +} diff --git a/npc/custom/etc/monster_arena.txt b/npc/custom/etc/monster_arena.txt new file mode 100644 index 000000000..0b6b1cc96 --- /dev/null +++ b/npc/custom/etc/monster_arena.txt @@ -0,0 +1,897 @@ +//===== rAthena Script ======================================= +//= Monster vs Monster +//===== By: ================================================== +//= acky +//===== Current Version: ===================================== +//= 1.2 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Players train monsters and battle other players. +//= Experience can be earned and monsters upgraded. +//===== Additional Comments: ================================= +//= To add monsters, add lines after the commends labled: +//= '// #. ---Change to Add Monsters--- //' +//= There are 6 steps to add a monster at the moment. +//= Added Duel Room +//= --------------------------------------------------------- +//= Script is messy! Be careful! +//= 1.1.2 Changed all gmcommand to atcommand as Poki#3 suggested. [Vicious] +//= 1.1.3 Removed Duplicate Names [Silent] +//= 1.1.4 Fixed SummonPad syntax. [KarLaeda] +//= 1.1.5 Some cleanup & optimization [KarLaeda] +//= 1.2 Replaced effect numerics with constants. [Samuray22] +//============================================================ + +// Entrance // +prontera,158,193,6 script Monster Arena 702,{ + mes "[Monster Arena]"; + mes "Would you like to enter the Monster Arena?"; + mes "Currently ^FF0000" + getmapusers("gon_test") + "^000000 players"; + mes "^FF0000Note:^000000 Pecos, Falcons and Carts will be lost on entry."; +L_Menu: + next; + menu "Enter",-,"Information",L_Info,"Cancel",L_Exit; + + set @marena,1; + savepoint "gon_test",56,99; + set @battle,0; + warp "gon_test",57,99; + close; + +L_Exit: + mes "[Monster Arena]"; + mes "Come back any time."; + close; + +L_Info: + mes "[Monster Arena]"; + mes "You must purchase a pet from the Monster Tamer to start fighting."; + next; + mes "[Monster Arena]"; + mes "Then talk to the Usher and tell him you would like to compete."; + next; + mes "[Monster Arena]"; + mes "Talk to the referee to summon your monster."; + mes "Once your monster has fought, you must talk to the Usher again and choose to spectate."; + next; + mes "[Monster Arena]"; + mes "Talk to the Monster Trainer, he will ask you to heal your pet."; + next; + mes "[Monster Arena]"; + mes "To do this, click the Nurse repearedly until it says your pet is healed."; + next; + mes "[Monster Arena]"; + mes "The more monsters you kill, the more exp you get and the quicker you can upgrade."; + next; + mes "[Monster Arena]"; + mes "The stronger your monster is, the longer it will take to summon again."; + + goto L_Menu; +} + +// Monster Summon Function // +function script monstersummon { + // 1. ---Change to Add Monsters--- // + if (#monster == 10) summon strcharinfo(0) + "'s Poring",1002, "OnPoringKilled"; + if (#monster == 20) summon strcharinfo(0) + "'s Fabre",1007, "OnFaberKilled"; + if (#monster == 30) summon strcharinfo(0) + "'s Lunatic",1063, "OnLunaticKilled"; + if (#monster == 31) summon strcharinfo(0) + "'s Drops",1113, "OnDropsKilled"; + if (#monster == 32) summon strcharinfo(0) + "'s Picky",1049, "OnPickyKilled"; + if (#monster == 40) summon strcharinfo(0) + "'s ChonChon",1011, "OnChonChonKilled"; + if (#monster == 41) summon strcharinfo(0) + "'s Super Picky",1050, "OnSPickyKilled"; + if (#monster == 42) summon strcharinfo(0) + "'s Willow",1010, "OnWillowKilled"; + if (#monster == 50) summon strcharinfo(0) + "'s Roda Frog",1012, "OnRodaKilled"; + if (#monster == 51) summon strcharinfo(0) + "'s Condor",1009, "OnCondorKilled"; + if (#monster == 60) summon strcharinfo(0) + "'s Thief Bug Larva",1051, "OnThiefKilled"; + if (#monster == 70) summon strcharinfo(0) + "'s Savage Babe",1167, "OnSavageKilled"; + if (#monster == 80) summon strcharinfo(0) + "'s Familiar",1005, "OnFamiliarKilled"; + if (#monster == 81) summon strcharinfo(0) + "'s Hornet",1004, "OnHornetKilled"; + if (#monster == 90) summon strcharinfo(0) + "'s Desert Wolf Puppy",1107, "OnPuppyKilled"; + if (#monster == 91) summon strcharinfo(0) + "'s Spore",1014, "OnSporeKilled"; + if (#monster == 92) summon strcharinfo(0) + "'s Rocker",1052, "OnRockerKilled"; + if (#monster == 100) summon strcharinfo(0) + "'s Skeleton",1076, "OnSkeletonKilled"; + if (#monster == 101) summon strcharinfo(0) + "'s Plankton",1161, "OnPlanktonKilled"; + if (#monster == 102) summon strcharinfo(0) + "'s Antonio",1247, "OnAntonioKilled"; + if (#monster == 103) summon strcharinfo(0) + "'s Thief Bug Female",1053, "OnThiefFemaleKilled"; + close; +} + +// Referee // +- script monsterreferee 61,{ + if (@fighting == 1) end; + if (@battle == 1) goto L_Start; + end; + +L_Start: + mes "[Referee]"; + mes "Your monster is:"; + + // 2. ---Change to Add Monsters--- // + if (#monster == 10) mes "Poring"; + if (#monster == 20) mes "Faber"; + if (#monster == 30) mes "Lunatic"; + if (#monster == 31) mes "Drops"; + if (#monster == 32) mes "Picky"; + if (#monster == 40) mes "ChonChon"; + if (#monster == 41) mes "Super Picky"; + if (#monster == 42) mes "Willow"; + if (#monster == 50) mes "Roda Frog"; + if (#monster == 51) mes "Condor"; + if (#monster == 60) mes "Thief Bug Larva"; + if (#monster == 70) mes "Savage Babe"; + if (#monster == 80) mes "Familiar"; + if (#monster == 81) mes "Hornet"; + if (#monster == 90) mes "Desert Wolf Puppy"; + if (#monster == 91) mes "Spore"; + if (#monster == 92) mes "Rocker"; + if (#monster == 100) mes "Skeleton"; + if (#monster == 101) mes "Plankton"; + if (#monster == 102) mes "Antonio"; + if (#monster == 103) mes "Thief Bug Female"; + + mes "Would you like to fight?"; + next; + menu "Fight",-,"Cancel",L_Exit; + + set @fighting,1; + set #heal,1; + set @special,rand (100); // Chance of special summon + if (@special == 1) goto Special1; + if (@special == 2) goto Special2; + if (@special == 3) goto Special3; + if (@special == 4) goto Special4; + if (@special == 5) goto Special5; + + callfunc "monstersummon"; + close; + + // Special Summons // +Special1: + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + summon strcharinfo(0) + "'s Assault Team",1002, "OnPoringKilled"; + close; + +Special2: + summon strcharinfo(0) + "'s Mastering",1090, "OnSpecialKilled"; + close; + +Special3: + summon strcharinfo(0) + "'s Eclipse",1093, "OnSpecialKilled"; + close; + +Special4: + summon strcharinfo(0) + "'s Dragon Fly",1091, "OnSpecialKilled"; + close; + +Special5: + summon strcharinfo(0) + "'s Toad",1089, "OnSpecialKilled"; + close; + +L_Exit: + mes "[Referee]"; + mes "Alright"; + close; +} +gon_test,56,91,6 duplicate(monsterreferee) Referee#01 61 + + +// Usher // +gon_test,58,94,6 script Usher 86,{ + set @marena,1; + mes "[Usher]"; + mes "What would you like to do?"; + next; + menu "^0000FFSpectate",L_Spec,"^FF0000Compete^000000",-,"Return to Town",L_Exit,"Cancel",L_Cancel; + + if (#monster == 0) goto L_NoMon; + if (#heal == 1) goto L_Heal; + + if (#monster < 40) goto L_Low; + if (#monster > 30 && #monster < 80) goto L_Med; + if (#monster > 70) goto L_High; + +L_Low: + menu "Level 1-3",L_1to3,"^FF0000All Levels",L_High; + close; + +L_Med: + menu "Level 4-7",L_4to6,"^FF0000All Levels",L_High; + close; + +L_High: + close2; + savepoint "gon_test",56,99; + set @battle,1; + atcommand strcharinfo(0) + "@option 64 0 64"; + warp "gon_test",72,87; + end; + +L_4to6: + close2; + savepoint "gon_test",56,99; + set @battle,1; + atcommand strcharinfo(0) + "@option 64 0 64"; + warp "gon_test",57,86; + end; + +L_1to3: + close2; + savepoint "gon_test",56,99; + set @battle,1; + atcommand strcharinfo(0) + "@option 64 0 64"; + warp "gon_test",43,87; + end; + +L_Exit: + close2; + savepoint "prontera",149,186; + set @battle,0; + atcommand strcharinfo(0) + "@option 0 0 0"; + warp "prontera",149,186; + end; + +L_Spec: + close2; + savepoint "gon_test",56,99; + set @battle,0; + atcommand strcharinfo(0) + "@option 0 0 0"; + warp "gon_test",57,99; + end; + +L_NoMon: + mes "[Usher]"; + mes "You haven't got a monster, you can only spectate."; + close; + +L_Heal: + mes "[Usher]"; + mes "You have to heal your monster before you can fight again."; + close; + +L_Cancel: + close; +} + +// Monster Trainer // +gon_test,52,103,6 script Monster Trainer 87,{ + mes "[Monster Trainer]"; + if (#monster != 0) goto L_Mon; + + mes "Welcome to the monster arena, would you like to start training?"; + next; + menu "Yes",-,"No",L_Exit; + + mes "[Monster Trainer]"; + mes "New trainers may only start with Porings."; + mes "They cost 1000z, Would you like to buy one?"; + next; + menu "Yes",-,"No",L_Exit; + + if (zeny < 1000) goto L_NoZeny; + set zeny,zeny-1000; + set #monster,10; + mes "[Monster Trainer]"; + mes "Congratulations!"; + mes "When your Poring earns enough experience, talk to me to upgrade."; + close; + +L_Mon: + mes "Welcome back, " + strcharinfo(0) + "."; + mes "Your monster has " + #monpoints + " exp points."; + next; + if (@fighting == 1) goto L_Heal; + menu "Upgrade Monster",L_Upgrade,"Sell Experience",L_Sell,"^FF0000Abandon Monster^000000",L_Abandon,"Cancel",L_Exit; + +L_Abandon: + mes "[Monster Trainer]"; + mes "Are you sure you want to abandon your monster?"; + next; + menu "Yes",-,"No",L_Exit; + set #monster,0; + set #monpoints,0; + mes "[Monster Trainer]"; + mes "Monster released into the wild."; + close; + +L_Sell: + mes "[Monster Trainer]"; + mes "You can sell your monster's experience for 100z each."; + next; + menu "Sell",-,"Cancel",L_Exit; + mes "[Monster Trainer]"; + mes "You have: ^FF0000" + #monpoints + "^000000 experience points"; + mes "How many would you like to sell?"; + next; + input @sellexp; + if (@sellexp > #monpoints) goto L_NoExp; + set #monpoints,#monpoints-@sellexp; + set @sellearn,100*@sellexp; // Price of exp + set zeny,zeny+@sellearn; + mes "[Monster Trainer]"; + mes "You earned ^0000FF" + @sellearn + "^000000z."; + close; + + +L_NoExp: + mes "[Monster Trainer]"; + mes "You do not have enough experience."; + next; + goto L_Exit; + + // Monster Upgrades // +L_Upgrade: + mes "[Monster Trainer]"; + // 3. ---Change to Add Monsters - May not be required--- // + if (#monster > 1 && #monster < 20) mes "You need 10 exp points to upgrade your monster."; + if (#monster > 19 && #monster < 30) mes "You need 20 exp points to upgrade your monster."; + if (#monster > 29 && #monster < 40) mes "You need 40 exp points to upgrade your monster."; + if (#monster > 39 && #monster < 50) mes "You need 80 exp points to upgrade your monster."; + if (#monster > 49 && #monster < 60) mes "You need 160 exp points to upgrade your monster."; + if (#monster > 59 && #monster < 70) mes "You need 320 exp points to upgrade your monster."; + if (#monster > 69 && #monster < 80) mes "You need 640 exp points to upgrade your monster."; + if (#monster > 79 && #monster < 90) mes "You need 1280 exp points to upgrade your monster."; + if (#monster > 89 && #monster < 100) mes "You need 2560 exp points to upgrade your monster."; + next; + menu "Continue",-,"Cancel",L_Exit; + mes "[Monster Trainer]"; + + // 4. ---Change to Add Monsters - May not be required--- // + if (#monster > 1 && #monster < 20 && #monpoints > 9) goto L_Up1; + if (#monster > 19 && #monster < 30 && #monpoints > 19) goto L_Up2; + if (#monster > 29 && #monster < 40 && #monpoints > 39) goto L_Up3; + if (#monster > 39 && #monster < 50 && #monpoints > 79) goto L_Up4; + if (#monster > 49 && #monster < 60 && #monpoints > 159) goto L_Up5; + if (#monster > 59 && #monster < 70 && #monpoints > 319) goto L_Up6; + if (#monster > 69 && #monster < 80 && #monpoints > 639) goto L_Up7; + if (#monster > 79 && #monster < 90 && #monpoints > 1279) goto L_Up8; + if (#monster > 89 && #monster < 100 && #monpoints > 2559) goto L_Up9; + + mes "Unable to upgrade."; + close; + + // 5. ---Change to Add Monsters--- // +L_Up1: + set #monster,20; + set #monpoints,#monpoints-10; + mes "Upgraded to Fabre!"; + close; + +L_Up2: + mes "Which monster would you like to upgrade to?"; + next; + menu "Lunatic",U_Lunatic,"Drops",U_Drops,"Picky",U_Picky; + +U_Drops: + set #monster,31; + set #monpoints,#monpoints-20; + mes "[Monster Trainer]"; + mes "Upgraded to Drops!"; + close; + +U_Picky: + set #monster,32; + set #monpoints,#monpoints-20; + mes "[Monster Trainer]"; + mes "Upgraded to Picky!"; + close; + +U_Lunatic: + set #monster,30; + set #monpoints,#monpoints-20; + mes "[Monster Trainer]"; + mes "Upgraded to Lunatic!"; + close; + +L_Up3: + mes "Which monster would you like to upgrade to?"; + next; + menu "ChonChon",U_ChonChon,"Super Picky",U_SPicky,"Willow",U_Willow; + +U_ChonChon: + set #monster,40; + set #monpoints,#monpoints-40; + mes "[Monster Trainer]"; + mes "Upgraded to ChonChon!"; + close; + +U_SPicky: + set #monster,41; + set #monpoints,#monpoints-40; + mes "[Monster Trainer]"; + mes "Upgraded to Super Picky!"; + close; + +U_Willow: + set #monster,42; + set #monpoints,#monpoints-40; + mes "[Monster Trainer]"; + mes "Upgraded to Willow!"; + close; + +L_Up4: + mes "Which monster would you like to upgrade to?"; + next; + menu "Condor",U_Condor,"Roda Frog",U_Roda; + +U_Condor: + set #monster,51; + set #monpoints,#monpoints-80; + mes "[Monster Trainer]"; + mes "Upgraded to Condor!"; + close; + +U_Roda: + set #monster,50; + set #monpoints,#monpoints-80; + mes "[Monster Trainer]"; + mes "Upgraded to Roda Frog!"; + close; + +L_Up5: + set #monster,60; + set #monpoints,#monpoints-160; + mes "Upgraded to Thief Bug Larva!"; + close; + +L_Up6: + set #monster,70; + set #monpoints,#monpoints-320; + mes "Upgraded to Savage Babe!"; + close; + +L_Up7: + mes "Which monster would you like to upgrade to?"; + next; + menu "Familiar",U_Familiar,"Hornet",U_Hornet; + +U_Hornet: + set #monster,81; + set #monpoints,#monpoints-640; + mes "[Monster Trainer]"; + mes "Upgraded to Hornet!"; + close; + +U_Familiar: + set #monster,80; + set #monpoints,#monpoints-640; + mes "[Monster Trainer]"; + mes "Upgraded to Familiar!"; + close; + +L_Up8: + mes "[Monster Trainer]"; + mes "Which monster would you like to upgrade to?"; + next; + menu "Desert Wolf Puppy",U_Puppy,"Spore",U_Spore,"Rocker",U_Rocker; + +U_Spore: + set #monster,91; + set #monpoints,#monpoints-1280; + mes "[Monster Trainer]"; + mes "Upgraded to Spore!"; + close; + +U_Rocker: + set #monster,92; + set #monpoints,#monpoints-1280; + mes "[Monster Trainer]"; + mes "Upgraded to Rocker!"; + close; + +U_Puppy: + set #monster,90; + set #monpoints,#monpoints-1280; + mes "[Monster Trainer]"; + mes "Upgraded to Desert Wolf Puppy!"; + close; + +L_Up9: + mes "Which monster would you like to upgrade to?"; + next; + menu "Skeleton",U_Skeleton,"Antonio",U_Antonio,"Plankton",U_Plankton,"Thief Bug Female",U_ThiefFemale; + +U_Plankton: + set #monster,101; + set #monpoints,#monpoints-2560; + mes "[Monster Trainer]"; + mes "Upgraded to Plankton!"; + close; + +U_Antonio: + set #monster,102; + set #monpoints,#monpoints-2560; + mes "[Monster Trainer]"; + mes "Upgraded to Antonio!"; + close; + +U_ThiefFemale: + set #monster,103; + set #monpoints,#monpoints-2560; + mes "[Monster Trainer]"; + mes "Upgraded to Thief Bug Female!"; + close; + +U_Skeleton: + set #monster,100; + set #monpoints,#monpoints-2560; + mes "[Monster Trainer]"; + mes "Upgraded to Skeleton!"; + close; + +L_NoZeny: + mes "[Monster Trainer]"; + mes "You don't have enough zeny!"; + close; + +L_Exit: + mes "[Monster Trainer]"; + mes "Goodbye."; + close; + +L_Heal: + mes "[Monster Trainer]"; + mes "Your monster needs to heal."; + mes "It will heal faster if you click the nurse faster."; + set #heal,1; + close; +} + +// Kill Trigger // +// 6/Final. ---Change to Add Monsters--- // +gon_test,56,91,6 script OnPoringKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+1; + announce "You killed a Poring - Gained 1 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnFaberKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+2; + announce "You killed a Faber - Gained 2 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnLunaticKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+4; + announce "You killed a Lunatic - Gained 4 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnDropsKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+4; + announce "You killed a Drops - Gained 4 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnPickyKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+4; + announce "You killed a Picky - Gained 4 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnChonChonKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+8; + announce "You killed a ChonChon - Gained 8 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnSPickyKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+8; + announce "You killed a Super Picky - Gained 8 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnWillowKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+8; + announce "You killed a Willow - Gained 8 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnRodaKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+16; + announce "You killed a Roda Frog - Gained 16 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnCondorKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+16; + announce "You killed a Condor - Gained 16 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnThiefKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+32; + announce "You killed a Theif Bug Larva - Gained 32 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnSavageKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+64; + announce "You killed a Savage Babe - Gained 64 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnFamiliarKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+128; + announce "You killed a Familiar - Gained 128 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnHornetKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+128; + announce "You killed a Hornet - Gained 128 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnPuppyKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+256; + announce "You killed a Desert Wolf Puppy - Gained 256 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnRockerKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+256; + announce "You killed a Rocker - Gained 256 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnSporeKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+256; + announce "You killed a Spore - Gained 256 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnSkeletonKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+512; + announce "You killed a Skeleton - Gained 512 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnPlanktonKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+512; + announce "You killed a Plankton - Gained 512 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnAntonioKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+512; + announce "You killed an Antonio - Gained 512 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnThiefFemaleKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+512; + announce "You killed a Thief Bug Female - Gained 512 exp",19; + callfunc "duelkill"; +} + +gon_test,56,91,6 script OnSpecialKilled -1,{ + if (@marena == 0) callfunc "illegalkill"; + set #monpoints,#monpoints+512; + announce "You killed a Special Monster - Gained 1024 exp",19; + callfunc "duelkill"; +} + +function script duelkill { + if (strcharinfo(0) == $@duelist1$ || strcharinfo(0) == $@duelist2$) goto L_Heal; + end; +L_Heal: + announce strcharinfo(0) + " won the Duel",1; + set @fighting,0; + set #heal,0; + set @healing,0; + end; +} + +function script illegalkill { + announce "Illegal Kill by " + strcharinfo(0) + " Detected",1; + percentheal -100,-100; + end; +} + +// Healer // +gon_test,55,103,6 script Nurse 90,{ + if (@battle == 1 || #heal == 0) goto L_NoHeal; + if (#heal == 1 && @healing < 100) goto L_Heal; //Total healing required + set @fighting,0; + set #heal,0; + set @healing,0; + specialeffect2 EF_VALLENTINE2; + announce "Your monster has healed.",19; + end; + +L_Heal: + set @healrate,140 / #monster; //Rate of heal per click + set @healing,@healing + @healrate; + end; + +L_NoHeal: + announce "Your monster does not need healing yet.",19; + end; +} + +// Warps players // +gon_test,57,86,5 script Summon Pad 1::SummonPad 111,2,2,{ + end; +OnTouch: + set @marena,1; + warp "gon_test",57,99; +} +gon_test,43,87,5 duplicate(SummonPad) Summon Pad 2 111,2,2 +gon_test,72,87,5 duplicate(SummonPad) Summon Pad 3 111,2,2 + + + +// Skill Disabler // +gon_test mapflag noskill + +// Duel Arena // +gon_test,58,103,5 script Duel Master#01 92,{ + if ($@duelist1$ == "") set @duel,0; + if ($@monster1 == "") set @duel,0; + set @marena,1; + if (#monster == 0) goto L_NoMon; + mes "[Duel Master]"; + if ($@duel == 1) goto L_Waiting; + if ($@duel == 2) goto L_Dueling; + + mes "There are currently no players dueling."; + next; + menu "Join",-,"Spectate",L_Spec,"Cancel",L_Exit; + + // Player 1 Enters Duel Area // + if (#heal == 1) goto L_NeedHeal; + if ($@duel == 1) goto L_Duel2; + set $@duel,1; + if (#monster > 1 && #monster < 20) set $@monster1,1; + if (#monster > 19 && #monster < 30) set $@monster1,2; + if (#monster > 29 && #monster < 40) set $@monster1,3; + if (#monster > 39 && #monster < 50) set $@monster1,4; + if (#monster > 49 && #monster < 60) set $@monster1,5; + if (#monster > 59 && #monster < 70) set $@monster1,6; + if (#monster > 69 && #monster < 80) set $@monster1,7; + if (#monster > 79 && #monster < 90) set $@monster1,8; + if (#monster > 89 && #monster < 100) set $@monster1,9; + if (#monster > 99 && #monster < 110) set $@monster1,10; + set $@duelist1$,strcharinfo(0); + set @battle,1; + announce strcharinfo(0) + " [Monster Level: " + $@monster1 + "] is waiting for a duel",1; + atcommand strcharinfo(0) + "@option 64 0 64"; + warp "gon_test",49,5; + close; + +L_Waiting: + mes "^0000FF " + $@duelist1$ + "^000000 [Monster Level: ^FF0000" + $@monster1 + "^000000]"; + mes "Is waiting for an opponent"; + next; + menu "Join",-,"Spectate",L_Spec,"Cancel",L_Exit; + + // Player 2 Enters Duel Area // + if (#heal == 1) goto L_NeedHeal; +L_Duel2: + if ($@duel == 2) goto L_Spec; + set $@duel,2; + if (#monster > 1 && #monster < 20) set $@monster2,1; + if (#monster > 19 && #monster < 30) set $@monster2,2; + if (#monster > 29 && #monster < 40) set $@monster2,3; + if (#monster > 39 && #monster < 50) set $@monster2,4; + if (#monster > 49 && #monster < 60) set $@monster2,5; + if (#monster > 59 && #monster < 70) set $@monster2,6; + if (#monster > 69 && #monster < 80) set $@monster2,7; + if (#monster > 79 && #monster < 90) set $@monster2,8; + if (#monster > 89 && #monster < 100) set $@monster2,9; + if (#monster > 99 && #monster < 110) set $@monster2,10; + set $@duelist2$,strcharinfo(0); + set @battle,1; + announce strcharinfo(0) + " [Monster Level: " + $@monster2 + "] has joined the duel",1; + atcommand strcharinfo(0) + "@option 64 0 64"; + warp "gon_test",49,5; + close; + +L_Dueling: + mes "^0000FF" + $@duelist1$ + "^000000 [Monster Level: ^0000FF" + $@monster1 + "^000000]"; + mes " VS."; + mes "^FF0000" + $@duelist2$ + "^000000 [Monster Level: ^FF0000" + $@monster2 + "^000000]"; + next; + menu "Spectate",L_Spec,"Cancel",L_Exit; + +L_Spec: + set @battle,0; + atcommand strcharinfo(0) + "@option 64 0 64"; + warp "gon_test",49,5; + close; + +L_Exit: + mes "[Duel Master]"; + mes "Goodbye."; + close; + +L_NoMon: + mes "[Duel Master]"; + mes "You haven't got a monster, you can't participate."; + close; + +L_NeedHeal: + mes "[Duel Master]"; + mes "You need to heal before you can join."; + close; +} + +// Duel Exit // +gon_test,42,8,5 script Duel Master#02 92,{ + mes "[Duel Master]"; + mes "Would you like to return?"; + menu "Yes",L_Leave,"No",-; + mes "Alright"; + close; + +L_Leave: + if ($@duelist1$ == strcharinfo(0)) goto L_Leave1; + if ($@duelist2$ == strcharinfo(0)) goto L_Leave2; + +L_Leave3: + atcommand strcharinfo(0) + "@option 0 0 0"; + set @battle,0; + warp "gon_test",57,99; + close; + +L_Leave1: + set $@duelist1$,$@duelist2$; + set $@monster1,$@monster2; + set $@duel,$@duel-1; + announce strcharinfo(0) + " stopped dueling",1; + goto L_Leave3; + +L_Leave2: + set $@duelist2$,""; + set $@monster2,0; + set $@duel,$@duel-1; + announce strcharinfo(0) + " stopped dueling",1; + goto L_Leave3; +} + +gon_test,49,5,5 duplicate(SummonPad) Summon Pad 4 111,2,2 +gon_test,55,8,6 duplicate(monsterreferee) Referee#02 61 diff --git a/npc/custom/etc/morroc_raceway.txt b/npc/custom/etc/morroc_raceway.txt new file mode 100644 index 000000000..768084173 --- /dev/null +++ b/npc/custom/etc/morroc_raceway.txt @@ -0,0 +1,238 @@ +//===== rAthena Script ======================================= +//= Morroc Raceway +//===== By: ================================================== +//= acky +//===== Current Version: ===================================== +//= 1.3 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Lets players race around Morroc (pvp_y_1-5) +//===== Additional Comments: ================================= +//= If there are more than 3 players, at least 3 people +//= must finish before a new race can be started. +//= +//= If there are less than 3 players, at least 1 person +//= must finish before a new race can be started. +//= +//= Removed permanent global variables +//= 1.2 Removed Duplicates [Silent] +//= 1.3 Replaced effect numerics with constants. [Samuray22] +//============================================================ + +//Warps you into race way +morocc,166,105,6 script Race Girl#01 116,{ + mes "[Race Girl]"; + mes "Would you like to visit ^0000FFMorroc Raceway^000000?"; + next; + menu "Yes",L_Warp,"No",-; + mes "[Race Girl]"; + mes "Alright, talk to me again when you want to go."; + close; +L_Warp: + warp "pvp_y_1-5",165,256; + close; +} + +//Warps you out of raceway +pvp_y_1-5,169,265,5 script Race Girl#02 116,{ + mes "[Race Girl]"; + mes "Welcome to Morroc Raceway!"; + next; + menu "Information",-,"Leave",L_Warp,"Cancel",L_Cancel; + mes "[Race Girl]"; + mes "Someone must click on the Starter NPC to start the race."; + next; + mes "[Race Girl]"; + mes "Once the race is started, run around Morroc anti-clockwise."; + next; + mes "[Race Girl]"; + mes "You must reach all the checkpoints - No cheating!"; + close; +L_Warp: + warp "morocc",165,101; +L_Cancel: + mes "[Race Girl]"; + mes "Come again soon!"; + close; +} + +//Counts down and starts race +pvp_y_1-5,145,269,5 script Starter 733,{ + if ($@race != 0) goto L_Started; + if ($@counting != 0) goto L_Started; + if ($@racecount == 1) goto L_Started; +L_Menu: + mes "[Race Starter]"; + mes "Please stay on the Eastern side of me."; + menu "Start Race",L_Count,"Cancel",-; + close; +L_Count: + set $@counting,1; + mes "Counting down..."; + addtimer 1000, "Starter::OnCount1000"; + addtimer 2000, "Starter::OnCount2000"; + addtimer 3000, "Starter::OnCount3000"; + addtimer 4000, "Starter::OnCount4000"; + announce strcharinfo(0) + "Started a countdown",1; + announce "Get ready to race!",1; + close; + +OnCount1000: + announce "[3]",1; + end; +OnCount2000: + announce "[2]",1; + end; +OnCount3000: + announce "[1]",1; + end; +OnCount4000: + emotion 27; + specialeffect EF_CHIMTO; + announce "[GO!]",1; + set $@race,1; + set $@position,0; + set $@counting,0; + set $@raceid,rand(100000,999999); + end; + +L_Started: + if ((getmapusers("pvp_y_1-5") < 3) && ($@position > 0)) goto L_Menu; + if ($@position > 2) goto L_Menu; + mes "[Starter]"; + mes "Race in progress"; + close; + +OnInit: + set $@race,0; + set $@position,0; + set $@racecount,0; + end; +} + +//Checkpoint 1 +pvp_y_1-5,144,262,5 script Check Point 1 111,0,5,{ + end; +OnTouch: + if (@raceid != $@raceid) goto L_Started; + if (@race == 6) goto L_Finished; + if ($@race == 1) goto L_Started; + mes "The race has not started, please move back."; + close; +L_Started: + set @race,1; + set @raceid,$@raceid; + end; +L_Finished: + mes "You have already completed the race."; + close; +} + +//Checkpoint 2 +pvp_y_1-5,73,247,5 script Check Point 2 111,6,6,{ + end; +OnTouch: + if (@race != 1) goto L_Miss; + set @race,2; + announce "[" + strcharinfo(0) +"] has reached Checkpoint [1]",1; + end; +L_Miss: + mes "You have missed a Checkpoint. Please go back."; + close; +} + +//Checkpoint 3 +pvp_y_1-5,77,44,5 script Check Point 3 111,6,6,{ + end; +OnTouch: + if (@race != 2) goto L_Miss; + set @race,3; + announce "[" + strcharinfo(0) +"] has reached Checkpoint [2]",1; + end; +L_Miss: + mes "You have missed a Checkpoint. Please go back."; + close; +} + +//Checkpoint 3 +pvp_y_1-5,249,60,5 script Check Point 4 111,6,6,{ + end; +OnTouch: + if (@race != 3) goto L_Miss; + set @race,4; + announce "[" + strcharinfo(0) +"] has reached Checkpoint [3]",1; + end; +L_Miss: + mes "You have missed a Checkpoint. Please go back."; + close; +} + +//Checkpoint 4 +pvp_y_1-5,255,256,5 script Check Point 5 111,6,6,{ + end; +OnTouch: + if (@race != 4) goto L_Miss; + set @race,5; + announce "[" + strcharinfo(0) +"] has reached Checkpoint [4]",1; + end; +L_Miss: + mes "You have missed a Checkpoint. Please go back."; + close; +} + +//Finish Line +pvp_y_1-5,174,244,5 script Finish Line 111,6,6,{ + end; +OnTouch: + if (@raceid != $@raceid) goto L_WrongRace; + if (@race != 5) goto L_Miss; + set @race,6; + set $@position,$@position+1; + announce "[" + strcharinfo(0) +"] has reached The Finish line! [Position: " + $@position + "]",1; + end; +L_Miss: + mes "You have missed a Checkpoint. Please go back."; + close; +L_WrongRace: + mes "You are not in this race."; + close; +} + +//Check Point Marker Flags +pvp_y_1-5,144,267,4 script Check Point 1#01 722,{ + end; +} +pvp_y_1-5,144,257,4 script Check Point 1#02 722,{ + end; +} +pvp_y_1-5,70,252,3 script Check Point 2#01 722,{ + end; +} +pvp_y_1-5,77,243,3 script Check Point 2#02 722,{ + end; +} +pvp_y_1-5,81,48,1 script Check Point 3#01 722,{ + end; +} +pvp_y_1-5,72,40,1 script Check Point 3#02 722,{ + end; +} +pvp_y_1-5,244,65,7 script Check Point 4#01 722,{ + end; +} +pvp_y_1-5,252,57,7 script Check Point 4#02 722,{ + end; +} +pvp_y_1-5,259,260,5 script Check Point 5#01 722,{ + end; +} +pvp_y_1-5,251,252,5 script Check Point 5#02 722,{ + end; +} +pvp_y_1-5,174,249,4 script Finish Line#01 722,{ + end; +} +pvp_y_1-5,174,238,4 script Finish Line#02 722,{ + end; +} diff --git a/npc/custom/etc/mvp_arena.txt b/npc/custom/etc/mvp_arena.txt new file mode 100644 index 000000000..277895d6c --- /dev/null +++ b/npc/custom/etc/mvp_arena.txt @@ -0,0 +1,284 @@ +//===== rAthena Script ======================================= +//= MVP Arena +//===== By: ================================================== +//= Darkchild +//===== Current Version: ===================================== +//= 1.4 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Rooms containing 16 different MVPs +//===== Additional Comments: ================================= +//= 1.0 - First version of script +//= 1.1 - Optimised The MVP arena [massdriller] +//= 1.2 - NPC in prontera [Silent] +//= 1.3 - Removed Duplicates +//= 1.4 - Optimized, text edited [Euphy] +//============================================================ + +// Entrance +prontera,154,197,3 script MVP Warper 768,{ + mes "[ ^0065DFMVP Warper^000000 ]"; + mes "Would you like to enter"; + mes "the MVP Arena?"; + if (select("Yes!","No thanks.") == 2) close; + warp "quiz_00",50,24; + close; +} + +// Information +quiz_00,49,31,4 script MVP Arena Guide 778,{ + mes "[ ^0065DFMVP Arena Guide^000000 ]"; + mes "Welcome and behold this sacred place. Here you will find out if you truly have what it takes to call yourself a warrior."; + next; + switch(select("Information","Heal me!","Return to Prontera","Cancel")) { + case 1: + mes "[ ^0065DFMVP Arena Guide^000000 ]"; + mes "There are four Keepers, and each can spawn four different MVPs."; + mes "There are eight rooms per Keeper, and sixteen MVPs in total."; + close; + case 2: + specialeffect2 313; + percentheal 100,100; + close; + case 3: + warp "prontera",156,179; + close; + case 4: + close; + } +} + +// Keepers +function script Keeper { + mes "[ ^0065DF"+strnpcinfo(1)+"^000000 ]"; + mes "Which arena would you"; + mes "like to enter?"; + set .@menu$,""; + for(set .@i,1; .@i<9; set .@i,.@i+1) + set .@menu$, .@menu$+"Arena "+.@i+" ["+getmapusers("pvp_n_"+.@i+"-"+getarg(0))+"/20]:"; + set .@i, select(.@menu$); + if (getmapusers("pvp_n_"+.@i+"-"+getarg(0))>19) { + mes "[ ^0065DF"+strnpcinfo(1)+"^000000 ]"; + mes "Sorry, this arena is full!"; + close; + } + warp "pvp_n_"+.@i+"-"+getarg(0),102,102; + close; +} +quiz_00,56,31,4 script Alpha MVP 770,{ callfunc "Keeper",2; } +quiz_00,58,31,4 script Beta MVP 773,{ callfunc "Keeper",3; } +quiz_00,60,31,4 script Theta MVP 774,{ callfunc "Keeper",4; } +quiz_00,62,31,4 script Epsilon MVP 776,{ callfunc "Keeper",5; } + +// Protectors +function script Protector { + switch(select(""+((getarg(0)=="")?"":"Harder Monsters")+":Heal:Exit")) { + case 1: + warp getarg(0),102,102; + close; + case 2: + specialeffect2 313; + percentheal 100,100; + close; + case 3: + warp "prontera",156,179; + close; + } +} +pvp_n_1-2,100,100,4 script MVP-Protector#01 727,{ callfunc "Protector","pvp_n_2-2"; } +pvp_n_2-2,100,100,4 script MVP-Protector#02 727,{ callfunc "Protector","pvp_n_3-2"; } +pvp_n_3-2,100,100,4 script MVP-Protector#03 727,{ callfunc "Protector","pvp_n_4-2"; } +pvp_n_4-2,100,100,4 script MVP-Protector#04 727,{ callfunc "Protector","pvp_n_5-2"; } +pvp_n_5-2,100,100,4 script MVP-Protector#05 727,{ callfunc "Protector","pvp_n_6-2"; } +pvp_n_6-2,100,100,4 script MVP-Protector#06 727,{ callfunc "Protector","pvp_n_7-2"; } +pvp_n_7-2,100,100,4 script MVP-Protector#07 727,{ callfunc "Protector","pvp_n_8-2"; } +pvp_n_8-2,100,100,4 script MVP-Protector#08 727,{ callfunc "Protector",""; } +pvp_n_1-3,100,100,4 script MVP-Protector#09 727,{ callfunc "Protector","pvp_n_2-3"; } +pvp_n_2-3,100,100,4 script MVP-Protector#10 727,{ callfunc "Protector","pvp_n_3-3"; } +pvp_n_3-3,100,100,4 script MVP-Protector#11 727,{ callfunc "Protector","pvp_n_4-3"; } +pvp_n_4-3,100,100,4 script MVP-Protector#12 727,{ callfunc "Protector","pvp_n_5-3"; } +pvp_n_5-3,100,100,4 script MVP-Protector#13 727,{ callfunc "Protector","pvp_n_6-3"; } +pvp_n_6-3,100,100,4 script MVP-Protector#14 727,{ callfunc "Protector","pvp_n_7-3"; } +pvp_n_7-3,100,100,4 script MVP-Protector#15 727,{ callfunc "Protector","pvp_n_8-3"; } +pvp_n_8-3,100,100,4 script MVP-Protector#16 727,{ callfunc "Protector",""; } +pvp_n_1-4,100,100,4 script MVP-Protector#17 727,{ callfunc "Protector","pvp_n_2-4"; } +pvp_n_2-4,100,100,4 script MVP-Protector#18 727,{ callfunc "Protector","pvp_n_3-4"; } +pvp_n_3-4,100,100,4 script MVP-Protector#19 727,{ callfunc "Protector","pvp_n_4-4"; } +pvp_n_4-4,100,100,4 script MVP-Protector#20 727,{ callfunc "Protector","pvp_n_5-4"; } +pvp_n_5-4,100,100,4 script MVP-Protector#21 727,{ callfunc "Protector","pvp_n_6-4"; } +pvp_n_6-4,100,100,4 script MVP-Protector#22 727,{ callfunc "Protector","pvp_n_7-4"; } +pvp_n_7-4,100,100,4 script MVP-Protector#23 727,{ callfunc "Protector","pvp_n_8-4"; } +pvp_n_8-4,100,100,4 script MVP-Protector#24 727,{ callfunc "Protector",""; } +pvp_n_1-5,100,100,4 script MVP-Protector#25 727,{ callfunc "Protector","pvp_n_2-5"; } +pvp_n_2-5,100,100,4 script MVP-Protector#26 727,{ callfunc "Protector","pvp_n_3-5"; } +pvp_n_3-5,100,100,4 script MVP-Protector#27 727,{ callfunc "Protector","pvp_n_4-5"; } +pvp_n_4-5,100,100,4 script MVP-Protector#28 727,{ callfunc "Protector","pvp_n_5-5"; } +pvp_n_5-5,100,100,4 script MVP-Protector#29 727,{ callfunc "Protector","pvp_n_6-5"; } +pvp_n_6-5,100,100,4 script MVP-Protector#30 727,{ callfunc "Protector","pvp_n_7-5"; } +pvp_n_7-5,100,100,4 script MVP-Protector#31 727,{ callfunc "Protector","pvp_n_8-5"; } +pvp_n_8-5,100,100,4 script MVP-Protector#32 727,{ callfunc "Protector",""; } + +// Alpha +pvp_n_1-2,0,0,0,0 monster Eddga 1115,3,60000,66000 +pvp_n_1-2,0,0,0,0 monster Mistress 1059,1,60000,66000 +pvp_n_2-2,0,0,0,0 monster Mistress 1059,3,60000,66000 +pvp_n_2-2,0,0,0,0 monster Moonlight 1150,1,60000,66000 +pvp_n_3-2,0,0,0,0 monster Mistress 1059,1,60000,66000 +pvp_n_3-2,0,0,0,0 monster Moonlight 1150,2,60000,66000 +pvp_n_3-2,0,0,0,0 monster Maya 1147,1,60000,66000 +pvp_n_4-2,0,0,0,0 monster Eddga 1115,1,60000,66000 +pvp_n_4-2,0,0,0,0 monster Mistress 1059,1,60000,66000 +pvp_n_4-2,0,0,0,0 monster Moonlight 1150,1,60000,66000 +pvp_n_4-2,0,0,0,0 monster Maya 1147,1,60000,66000 +pvp_n_5-2,0,0,0,0 monster Eddga 1115,1,60000,66000 +pvp_n_5-2,0,0,0,0 monster Mistress 1059,2,60000,66000 +pvp_n_5-2,0,0,0,0 monster Moonlight 1150,1,60000,66000 +pvp_n_5-2,0,0,0,0 monster Maya 1147,2,60000,66000 +pvp_n_6-2,0,0,0,0 monster Eddga 1115,2,60000,66000 +pvp_n_6-2,0,0,0,0 monster Mistress 1059,3,60000,66000 +pvp_n_6-2,0,0,0,0 monster Moonlight 1150,1,60000,66000 +pvp_n_6-2,0,0,0,0 monster Maya 1147,2,60000,66000 +pvp_n_7-2,0,0,0,0 monster Eddga 1115,3,60000,66000 +pvp_n_7-2,0,0,0,0 monster Mistress 1059,3,60000,66000 +pvp_n_7-2,0,0,0,0 monster Moonlight 1150,2,60000,66000 +pvp_n_7-2,0,0,0,0 monster Maya 1147,2,60000,66000 +pvp_n_8-2,0,0,0,0 monster Eddga 1115,3,60000,66000 +pvp_n_8-2,0,0,0,0 monster Mistress 1059,3,60000,66000 +pvp_n_8-2,0,0,0,0 monster Moonlight 1150,3,60000,66000 +pvp_n_8-2,0,0,0,0 monster Maya 1147,3,60000,66000 + +// Beta +pvp_n_1-3,0,0,0,0 monster Phreeoni 1159,3,60000,66000 +pvp_n_1-3,0,0,0,0 monster Turtle General 1312,1,60000,66000 +pvp_n_2-3,0,0,0,0 monster Phreeoni 1159,2,60000,66000 +pvp_n_2-3,0,0,0,0 monster Turtle General 1312,1,60000,66000 +pvp_n_2-3,0,0,0,0 monster Orc Hero 1087,1,60000,66000 +pvp_n_3-3,0,0,0,0 monster Phreeoni 1159,1,60000,66000 +pvp_n_3-3,0,0,0,0 monster Turtle General 1312,1,60000,66000 +pvp_n_3-3,0,0,0,0 monster Orc Hero 1087,1,60000,66000 +pvp_n_3-3,0,0,0,0 monster Orc Lord 1190,1,60000,66000 +pvp_n_4-3,0,0,0,0 monster Phreeoni 1159,2,60000,66000 +pvp_n_4-3,0,0,0,0 monster Turtle General 1312,1,60000,66000 +pvp_n_4-3,0,0,0,0 monster Orc Hero 1087,1,60000,66000 +pvp_n_4-3,0,0,0,0 monster Orc Lord 1190,1,60000,66000 +pvp_n_5-3,0,0,0,0 monster Phreeoni 1159,1,60000,66000 +pvp_n_5-3,0,0,0,0 monster Turtle General 1312,2,60000,66000 +pvp_n_5-3,0,0,0,0 monster Orc Hero 1087,2,60000,66000 +pvp_n_5-3,0,0,0,0 monster Orc Lord 1190,1,60000,66000 +pvp_n_6-3,0,0,0,0 monster Phreeoni 1159,2,60000,66000 +pvp_n_6-3,0,0,0,0 monster Turtle General 1312,1,60000,66000 +pvp_n_6-3,0,0,0,0 monster Orc Hero 1087,2,60000,66000 +pvp_n_6-3,0,0,0,0 monster Orc Lord 1190,2,60000,66000 +pvp_n_7-3,0,0,0,0 monster Phreeoni 1159,3,60000,66000 +pvp_n_7-3,0,0,0,0 monster Turtle General 1312,1,60000,66000 +pvp_n_7-3,0,0,0,0 monster Orc Hero 1087,2,60000,66000 +pvp_n_7-3,0,0,0,0 monster Orc Lord 1190,3,60000,66000 +pvp_n_8-3,0,0,0,0 monster Phreeoni 1159,3,60000,66000 +pvp_n_8-3,0,0,0,0 monster Turtle General 1312,3,60000,66000 +pvp_n_8-3,0,0,0,0 monster Orc Hero 1087,3,60000,66000 +pvp_n_8-3,0,0,0,0 monster Orc Lord 1190,3,60000,66000 + +// Theta +pvp_n_1-4,0,0,0,0 monster Drake 1112,3,60000,66000 +pvp_n_1-4,0,0,0,0 monster Osiris 1038,1,60000,66000 +pvp_n_2-4,0,0,0,0 monster Drake 1112,2,60000,66000 +pvp_n_2-4,0,0,0,0 monster Osiris 1038,1,60000,66000 +pvp_n_2-4,0,0,0,0 monster Doppelganger 1046,1,60000,66000 +pvp_n_3-4,0,0,0,0 monster Drake 1112,1,60000,66000 +pvp_n_3-4,0,0,0,0 monster Osiris 1038,1,60000,66000 +pvp_n_3-4,0,0,0,0 monster Doppelganger 1046,1,60000,66000 +pvp_n_3-4,0,0,0,0 monster Lord of Death 1373,1,60000,66000 +pvp_n_4-4,0,0,0,0 monster Drake 1112,2,60000,66000 +pvp_n_4-4,0,0,0,0 monster Osiris 1038,1,60000,66000 +pvp_n_4-4,0,0,0,0 monster Doppelganger 1046,2,60000,66000 +pvp_n_4-4,0,0,0,0 monster Lord of Death 1373,1,60000,66000 +pvp_n_5-4,0,0,0,0 monster Drake 1112,3,60000,66000 +pvp_n_5-4,0,0,0,0 monster Osiris 1038,2,60000,66000 +pvp_n_5-4,0,0,0,0 monster Doppelganger 1046,2,60000,66000 +pvp_n_5-4,0,0,0,0 monster Lord of Death 1373,1,60000,66000 +pvp_n_6-4,0,0,0,0 monster Drake 1112,3,60000,66000 +pvp_n_6-4,0,0,0,0 monster Osiris 1038,2,60000,66000 +pvp_n_6-4,0,0,0,0 monster Doppelganger 1046,2,60000,66000 +pvp_n_6-4,0,0,0,0 monster Lord of Death 1373,2,60000,66000 +pvp_n_7-4,0,0,0,0 monster Drake 1112,3,60000,66000 +pvp_n_7-4,0,0,0,0 monster Osiris 1038,2,60000,66000 +pvp_n_7-4,0,0,0,0 monster Doppelganger 1046,3,60000,66000 +pvp_n_7-4,0,0,0,0 monster Lord of Death 1373,2,60000,66000 +pvp_n_8-4,0,0,0,0 monster Drake 1112,3,60000,66000 +pvp_n_8-4,0,0,0,0 monster Osiris 1038,3,60000,66000 +pvp_n_8-4,0,0,0,0 monster Doppelganger 1046,3,60000,66000 +pvp_n_8-4,0,0,0,0 monster Lord of Death 1373,3,60000,66000 + +// Epsilon +pvp_n_1-5,0,0,0,0 monster Incantation Samurai 1492,3,60000,66000 +pvp_n_1-5,0,0,0,0 monster Pharoh 1157,1,60000,66000 +pvp_n_2-5,0,0,0,0 monster Incantation Samurai 1492,2,60000,66000 +pvp_n_2-5,0,0,0,0 monster Pharoh 1157,1,60000,66000 +pvp_n_2-5,0,0,0,0 monster Dark Lord 1272,1,60000,66000 +pvp_n_3-5,0,0,0,0 monster Incantation Samurai 1492,1,60000,66000 +pvp_n_3-5,0,0,0,0 monster Pharoh 1157,1,60000,66000 +pvp_n_3-5,0,0,0,0 monster Dark Lord 1272,1,60000,66000 +pvp_n_3-5,0,0,0,0 monster Baphomet 1039,1,60000,66000 +pvp_n_4-5,0,0,0,0 monster Incantation Samurai 1492,3,60000,66000 +pvp_n_4-5,0,0,0,0 monster Pharoh 1157,1,60000,66000 +pvp_n_4-5,0,0,0,0 monster Dark Lord 1272,1,60000,66000 +pvp_n_4-5,0,0,0,0 monster Baphomet 1039,1,60000,66000 +pvp_n_5-5,0,0,0,0 monster Incantation Samurai 1492,2,60000,66000 +pvp_n_5-5,0,0,0,0 monster Pharoh 1157,2,60000,66000 +pvp_n_5-5,0,0,0,0 monster Dark Lord 1272,2,60000,66000 +pvp_n_5-5,0,0,0,0 monster Baphomet 1039,1,60000,66000 +pvp_n_6-5,0,0,0,0 monster Incantation Samurai 1492,2,60000,66000 +pvp_n_6-5,0,0,0,0 monster Pharoh 1157,2,60000,66000 +pvp_n_6-5,0,0,0,0 monster Dark Lord 1272,2,60000,66000 +pvp_n_6-5,0,0,0,0 monster Baphomet 1039,1,60000,66000 +pvp_n_7-5,0,0,0,0 monster Incantation Samurai 1492,2,60000,66000 +pvp_n_7-5,0,0,0,0 monster Pharoh 1157,2,60000,66000 +pvp_n_7-5,0,0,0,0 monster Dark Lord 1272,2,60000,66000 +pvp_n_7-5,0,0,0,0 monster Baphomet 1039,2,60000,66000 +pvp_n_8-5,0,0,0,0 monster Incantation Samurai 1492,3,60000,66000 +pvp_n_8-5,0,0,0,0 monster Pharoh 1157,2,60000,66000 +pvp_n_8-5,0,0,0,0 monster Dark Lord 1272,2,60000,66000 +pvp_n_8-5,0,0,0,0 monster Baphomet 1039,2,60000,66000 + +// Mapflags +pvp_n_1-1 mapflag pvp_nightmaredrop off +pvp_n_2-1 mapflag pvp_nightmaredrop off +pvp_n_3-1 mapflag pvp_nightmaredrop off +pvp_n_4-1 mapflag pvp_nightmaredrop off +pvp_n_5-1 mapflag pvp_nightmaredrop off +pvp_n_6-1 mapflag pvp_nightmaredrop off +pvp_n_7-1 mapflag pvp_nightmaredrop off +pvp_n_8-1 mapflag pvp_nightmaredrop off +pvp_n_1-2 mapflag pvp_nightmaredrop off +pvp_n_2-2 mapflag pvp_nightmaredrop off +pvp_n_3-2 mapflag pvp_nightmaredrop off +pvp_n_4-2 mapflag pvp_nightmaredrop off +pvp_n_5-2 mapflag pvp_nightmaredrop off +pvp_n_6-2 mapflag pvp_nightmaredrop off +pvp_n_7-2 mapflag pvp_nightmaredrop off +pvp_n_8-2 mapflag pvp_nightmaredrop off +pvp_n_1-3 mapflag pvp_nightmaredrop off +pvp_n_2-3 mapflag pvp_nightmaredrop off +pvp_n_3-3 mapflag pvp_nightmaredrop off +pvp_n_4-3 mapflag pvp_nightmaredrop off +pvp_n_5-3 mapflag pvp_nightmaredrop off +pvp_n_6-3 mapflag pvp_nightmaredrop off +pvp_n_7-3 mapflag pvp_nightmaredrop off +pvp_n_8-3 mapflag pvp_nightmaredrop off +pvp_n_1-4 mapflag pvp_nightmaredrop off +pvp_n_2-4 mapflag pvp_nightmaredrop off +pvp_n_3-4 mapflag pvp_nightmaredrop off +pvp_n_4-4 mapflag pvp_nightmaredrop off +pvp_n_5-4 mapflag pvp_nightmaredrop off +pvp_n_6-4 mapflag pvp_nightmaredrop off +pvp_n_7-4 mapflag pvp_nightmaredrop off +pvp_n_8-4 mapflag pvp_nightmaredrop off +pvp_n_1-5 mapflag pvp_nightmaredrop off +pvp_n_2-5 mapflag pvp_nightmaredrop off +pvp_n_3-5 mapflag pvp_nightmaredrop off +pvp_n_4-5 mapflag pvp_nightmaredrop off +pvp_n_5-5 mapflag pvp_nightmaredrop off +pvp_n_6-5 mapflag pvp_nightmaredrop off +pvp_n_7-5 mapflag pvp_nightmaredrop off +pvp_n_8-5 mapflag pvp_nightmaredrop off diff --git a/npc/custom/etc/penal_servitude.txt b/npc/custom/etc/penal_servitude.txt new file mode 100644 index 000000000..bfbd39c63 --- /dev/null +++ b/npc/custom/etc/penal_servitude.txt @@ -0,0 +1,193 @@ +//===== rAthena Script ======================================= +//= Penal Servitude +//===== By: ================================================== +//= Lupus +//===== Current Version: ===================================== +//= 1.2 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= A simple Penal Servitude Script. +//= It could cheer up your prisoners a bit. +//===== Additional Comments: ================================= +// This script uses CHEQUES of the 2nd KAFRA_BANK.TXT +// var PRISON - it counts number of your imprisonments. +// 1.1 English translation +// 1.2 Stricted the conditions a bit +//============================================================ + +sec_pri,36,58,1 script Chief Warder 105,{ + mes "[Saddeus]"; + emotion 1; + if(sex) { + mes "Mr. Prisoner #"+BaseLevel+JobLevel+","; + } else { + mes "Ms. Prisoner #"+BaseLevel+JobLevel+","; + } + mes "what's the noise over there?"; + next; + menu "Let me free, I'll pay!",-, "Let me to work off my freedom!",M_Q1, "Nothing",M_NO_THANKS; + +M_PAY: + mes "[Saddeus]"; + set @MUSTPAY,(PRISON+1)*1000000; + if (@MUSTPAY<1000000) set @MUSTPAY,1000000; + if (@MUSTPAY>100000000) set @MUSTPAY,100000000; + if (PRISON==1) mes "I can't remember you. Is it your 1st time?"; + if (PRISON>1) mes "You again? Sombody hasn't grown wiser from the very first visit..."; + mes "OK, we could release you for ^FF0000"+@MUSTPAY+"z^000000."; + next; + menu "I pay cash!",M_PAYCASH,"Do you accept cheques?",M_PAYBANK,"I've changed my mind.",-; + + mes "[Saddeus]"; + mes "You've got some time to think about..."; + close; + +M_PAYCASH: + if (@MUSTPAY>Zeny) goto L_NOCASH; + set Zeny,Zeny-@MUSTPAY; + mes "[Saddeus]"; + mes "OK, sing here and there."; + goto L_RELEASE; + +L_NOCASH: + mes "[Saddeus]"; + mes "What's this? It's not enough!"; + close; + +M_PAYBANK: + if (@MUSTPAY>#kafrabank) goto L_NOBANK; + set #kafrabank,#kafrabank-@MUSTPAY; + mes "[Saddeus]"; + mes "OK, sign your cheque. And put down your name in my book."; + goto L_RELEASE; + +L_NOBANK: + mes "[Saddeus]"; + if (#kafrabank==0) mes "Your case says nothing about your bank accounts."; + if (#kafrabank!=0) mes "Alas, there's your bank account info... ^FF0000"+#kafrabank+"z^000000... in the case. It's not enough."; + mes "Stop your silly games now!"; + close; + +L_RELEASE: + set PRISON,PRISON+1; + next; + mes "[Saddeus]"; + mes "You are free now!"; + next; + savepoint "izlude",105,112; + warp "izlude",105,112; + close; + +M_Q1: + mes "[Saddeus]"; + mes "Our stocks are short of toadstools. Remember your morning's skilly? What about some work at our sponsored mushroom farm?"; + next; + menu "OK, I'll work off!",-, "I love this prison!",M_NO_THANKS; + + mes "[Saddeus]"; + if(checkcart() || checkfalcon() || checkriding()){ + emotion e_hmm; + mes "I'm sorry, you should release your Cart, PecoPeco or Falcon!"; + close; + } + mes "Talk to our overseer, Oliver."; + next; + + nude; + + set @rw,rand(1,4); + if (@rw==2) goto L_W2; + if (@rw==3) goto L_W3; + if (@rw==4) goto L_W4; + +L_W1: + savepoint "sec_in02",179,76; + warp "sec_in02",179,76; + close; + +L_W2: + savepoint "sec_in02",139,32; + warp "sec_in02",139,32; + close; + +L_W3: + savepoint "sec_in02",100,28; + warp "sec_in02",100,28; + close; + +L_W4: + savepoint "sec_in02",107,75; + warp "sec_in02",107,75; + close; + +M_NO_THANKS: + mes "[Saddeus]"; + if (rand(2)) mes "Is today X-Mas time, huh?"; + mes "Now shut up and back off!"; + if (rand(2)) emotion 23; + close; +} + +sec_in02,137,57,1 script Overseer 708,{ + mes "[Oliver]"; + + delitem 4002,countitem(4002);//Items: Fabre_Card, + delitem 4009,countitem(4009);//Items: Chonchon_Card, + delitem 4022,countitem(4022);//Items: Spore_Card, + delitem 4048,countitem(4048);//Items: Poison_Spore_Card, + + if (PRISON_Q <= 0 ) goto L_GET_Q; + + mes "I want you to gather ^FF0000"+PRISON_Q+" Orange Net Mushroom^000000."; + if ( countitem(1069)<PRISON_Q ) close;//Items: Orange_Net_Mushroom, + mes "OK... hand me all the shrooms..."; + mes "Let me see... "+countitem(1069)+" of almost eadible ones...";//Items: Orange_Net_Mushroom, + mes "And "+countitem(1070)+" useless deadly ones.";//Items: Orange_Gooey_Mushroom_, + next; + mes "[Oliver]"; + mes "Thank you. You are free!"; + set PRISON_Q,0; + delitem 1069,countitem(1069);//Items: Orange_Net_Mushroom, + delitem 1070,countitem(1070);//Items: Orange_Gooey_Mushroom_, + next; + savepoint "izlude",105,112; + warp "izlude",105,112; + close; + +L_GET_Q: + set PRISON,PRISON+1; + if (PRISON > 1) mes "Hmm... You've been here already... Well-well..."; + + if ( countitem(1069) || countitem(1070) ) mes "Drop these mushrooms!! They are poisonous!";//Items: Orange_Net_Mushroom, Orange_Gooey_Mushroom_, + delitem 1069,countitem(1069);//Items: Orange_Net_Mushroom, + delitem 1070,countitem(1070);//Items: Orange_Gooey_Mushroom_, + + set PRISON_Q, PRISON*3 + BaseLevel/3; + set PRISON_Q, PRISON_Q * (readparam(bAspd)/55 + 1); + set PRISON_Q, PRISON_Q+rand(50,60); + mes "OK, you must bring me ^FF0000"+PRISON_Q+"^000000 edible ^FF0000Orange Net Mushroom^000000 toadstoo.. shrooms."; + if(readparam(bAspd)>=100) mes "You're a fast fella! You'll have to get more shrooms, then."; + if (rand(10)<4) mes "And you may eat the deadly ones for breakfast."; + close; +} + + +sec_in02 mapflag nomemo +sec_in02 mapflag nosave SavePoint +sec_in02 mapflag noteleport +sec_in02 mapflag nobranch +sec_in02 mapflag nowarp +sec_in02 mapflag nowarpto +sec_in02 mapflag noexp +sec_in02 mapflag noskill +//sec_in02 mapflag pvp +//sec_in02 mapflag pvp_noparty +//sec_in02 mapflag gvg +sec_in02 mapflag pvp_nightmaredrop random,all,300 + +sec_in02,138,55,100,100 monster Toadstool 1182,30,10000,10000,1 +sec_in02,138,55,100,100 monster Fabre 1184,10,20000,20000 +sec_in02,138,55,100,100 monster Chonchon 1183,11,20000,20000 +sec_in02,138,55,100,100 monster Spore 1014,12,20000,20000 +sec_in02,138,55,100,100 monster Poison Spore 1077,3,20000,20000 diff --git a/npc/custom/etc/quest_warper.txt b/npc/custom/etc/quest_warper.txt new file mode 100644 index 000000000..2c2d31083 --- /dev/null +++ b/npc/custom/etc/quest_warper.txt @@ -0,0 +1,1692 @@ +//===== rAthena Script ============================================ +//= Quest Warper Script +//===== By: ======================================================= +//= DZeroX, Darkchild, Neouni +//===== Current Version: ========================================== +//= 2.3 +//===== Compatible With: ========================================== +//= rAthena SVN +//===== Description: ============================================== +//= Warper that works only after locations are unlocked. +//===== Additional Comments: ====================================== +//= 1.0 - NPCs created +//= 1.1 - Add Dungeons by sturm +//= 1.2 - Add All char in account unlocked by ace_killer +//= 1.3 - Add new 7 towns and 7 dungeons by escoteiro +// - Correct bug jawaii town by escoteiro +// - Remove some excessive warpras by escoteiro +//= 1.4 - Rewrite of the Warpa system [Neouni] +// - Corrected some bugs caused by autoconverting the old script +//= 1.4a - Rewrite of menu to be custom for each player [Neouni] +// - Dungeon listing rewrite +// - Town listing rewrite +// - GameMaster can Customise Main menu +//= 1.4b - Pricing round [Neouni] +// - GM menu added for pricing +// - Town Warp pricing tags added +// - Dungeon Warp pricing tags added +//= 1.5 - storage functions pricing [Neouni] +// - storage pricing added +// - kafra points setting added +// - kafra storage code security added +// - Healing scripts pricing added +// - Heal Part script added +//= 1.6 - Dungeon warp [Neouni] (beta only) +// - added option to add a extra fee for going down deeper into dungeon +// partly by rebuilding the dungeon warping into variable menu's +//= 1.6a - alot of fixes for beta release [Neouni] (public release) +// - fixed syntax problems +// - fixed missing pyramid gats in @DGat$ array +// - removed the culver level 5 that didn't exist +//= 1.7 - Readability of Dungeon menu building increased [Neouni] +// - Thanatos Tower & Louyang Dungeon added +//= 1.8 - changed around unlock variables [Neouni] +// - Moved warp variables to mark what you have unlocked to an binary array in login based permanent variable +// (warp variables are saved in login database, so all charservers have these unlocked) +// - Town Warp unlock array max 21/(unknown max) items used instead of max account #variables 32 ! +// - Dungeon Warp unlock array 28/(unknown max) items used instead of max account #variables 32 ! +// - (max login ##variables = 16, i used 3) +// - old variables are cleared on next save +// - Extra Variable clear added for every character, just in case (request by Terces) +//= 1.8a - Show amount of users on map [Neouni] +//= 1.8b - Small typo fixed in stampcard script [Neouni] +//= 1.9 - Making it more edit friendly [Neouni] +// - Made Dungeon warp arrays more readable & editable (QWS_Darray) +// - Made town warp arrays more readable & editable (QWS_Tarray) +//= 2.0 - Special Warp menu added [Neouni] +// - when all towns and dungeons are collected a new option on the main menu will show +// - it will only show when you setup the mapname of the warp ! +//= 2.0a - Dungeon Level Limit & Split dungeon fees +// - Limits dungeon based on Depth, access special setup menu thru GM-Menu +// - Dungeon fees split up based on Basic , Advanced & Overseas +// - Old Dungeon fee system removed, all dungeon fees now set to 0 +//= 2.0b - Special warpname menu option name bug fixed +//= 2.1 - Updated names to fall within retrictions. [L0ne_W0lf] +//= 2.2 - #kafra_code is now stored as is. [brianluau] +//= 2.3 - Added new town maps, cleanup, and removed pre-1.8 backwards fix. [Euphy] +//================================================================= + +//========================Function=&=Script======================== + +function script Q_Warpra { + mes "[Warpra]"; + mes "Hello,"; + mes "I can warp you to any town or dungeon, but you need to unlock them first by visiting us."; + mes "What do you need?"; + + if(getarg(0) == 0) callfunc "QWS_MMarray",0; + if(getarg(0) == 1) callfunc "QWS_MMarray",1; + + set @MMenu,select(@Mmenulist$[0],@Mmenulist$[1],@Mmenulist$[2],@Mmenulist$[3],@Mmenulist$[4],@Mmenulist$[5],@Mmenulist$[6],@Mmenulist$[7],@Mmenulist$[8],@Mmenulist$[9],@Mmenulist$[10],@Mmenulist$[11]); + + switch(@Mmenuref[@MMenu-1]+1){ + case 1: goto GM_Menu; + case 2: + warp $QW_SP_WarpMap$, $QW_SP_WarpX, $QW_SP_WarpY; + close2; + debugmes "Please check your special warp menu settings on the Warpra."; + end; + case 3: goto L_town; + case 4: goto L_dungeon; + case 5: goto L_FewWarps; + case 6: goto L_NoUnlock; + case 7: goto L_heal_Full; + case 8: goto L_heal_Part; + case 9: goto L_Storage; + case 10: goto L_GStorage; + case 11: + default: + goto L_end; + } + +//=====================GM-Menu=Functions=========================== + +GM_Menu: + next; + mes "Town warping = "+(($QW_TW_OFF)?"^FF0000 Off":"^00FF00 On")+"^000000"; + mes "Dungeon warping = "+(($QW_DW_OFF)?"^FF0000 Off":"^00FF00 On")+"^000000"; + mes "Dungeon Depth limit is "+(($QW_DL)?"^00FF00 On":"^FF0000 Off")+"^000000"; + mes "If on Dungeon Depth limit is set to ^0000FF"+$QW_DDL+"^000000"; + mes "Show Map Users = "+(($QW_MapUserShow)?"^00FF00 On":"^FF0000 Off")+"^000000"; + + if ($QW_HF) mes "Healing full = ^00FF00 On ^000000"; + if ($QW_HP) mes "Healing partly = ^00FF00 On ^000000"; + if (!$QW_HF && !$QW_HP) mes "Healing = ^FF0000 Off ^000000"; + + mes "Storage = "+(($QW_Stor)?"^00FF00 On":"^FF0000 Off")+"^000000"; + mes "Guild Storage = "+(($QW_GStor)?"^00FF00 On":"^FF0000 Off")+"^000000"; + mes "Kafra points collect = "+(($QW_KPoint)?"^00FF00 On":"^FF0000 Off")+"^000000"; + + switch(select("Town Warping","Dungeon Warping","Dungeon Level Limit","Show Map Users","Healing full","Healing partly","Storage","Guild Storage","Kafra points collect","Set Prices","Special Warp","Exit")) { + case 1: set $QW_TW_OFF,($QW_TW_OFF)?0:1; goto GM_Menu; + case 2: set $QW_DW_OFF,($QW_DW_OFF)?0:1; goto GM_Menu; + case 3: goto DungeonLevelLimit; + case 4: set $QW_MapUserShow,($QW_MapUserShow)?0:1; goto GM_Menu; + case 5: + if ($QW_HF == 0) { + set $QW_HF,1; + set $QW_HP,0; + } + else set $QW_HF,0; + goto GM_Menu; + case 6: + if ($QW_HP == 0) { + set $QW_HP,1; + set $QW_HF,0; + } + else set $QW_HP,0; + goto GM_Menu; + case 7: set $QW_Stor,($QW_Stor)?0:1; goto GM_Menu; + case 8: set $QW_GStor,($QW_GStor)?0:1; goto GM_Menu; + case 9: set $QW_KPoint,($QW_KPoint)?0:1; goto GM_Menu; + case 10: goto Setprice; + case 11: goto SpecialWarpMenu; + default: + close; + end; + } + +//======================GM-Menu=Pricing============================ + +Setprice: + if ($QW_DW_FEE != 0) set $QW_DW_FEE,0; + next; + mes "Scroll through the list to see all the options."; + + mes "Basic - Warps are = "+(($QW_BW_PRICE)?"^00FF00"+$QW_BW_PRICE:"^FF0000Free")+"^000000"; + mes "Advanced - Warps are = "+(($QW_AW_PRICE)?"^00FF00"+$QW_AW_PRICE:"^FF0000Free")+"^000000"; + mes "Overseas - Warps are = "+(($QW_OW_PRICE)?"^00FF00"+$QW_OW_PRICE:"^FF0000Free")+"^000000"; + + mes "Basic Dungeon level warp fee = "+(($QW_BW_FEE)?"^00FF00"+$QW_BW_FEE:"^FF0000NO")+"^000000 zeny per level"; + mes "Advanced Dungeon level warp fee = "+(($QW_AW_FEE)?"^00FF00"+$QW_AW_FEE:"^FF0000NO")+"^000000 zeny per level"; + mes "Overseas Dungeon level warp fee = "+(($QW_OW_FEE)?"^00FF00"+$QW_OW_FEE:"^FF0000NO")+"^000000 zeny per level"; + + mes "Full Healing = "+(($QW_HF_PRICE)?"^00FF00"+$QW_HF_PRICE:"^FF0000Free")+"^000000"; + mes "^FF0000HP ^000000Part Healing = "+(($QW_HP_H_PRICE)?"^00FF00"+$QW_HP_H_PRICE+"^000000 a point":"^FF0000Free^000000"); + mes "^FF0000SP ^000000Part Healing = "+(($QW_HP_S_PRICE)?"^00FF00"+$QW_HP_S_PRICE+"^000000 a point":"^FF0000Free^000000"); + + if ($QW_S_PRICE && $QW_S_PRICE != 60) mes "Storage = ^00FF00 "+$QW_S_PRICE+" ^000000"; + if (!$QW_S_PRICE) mes "Storage = ^FF0000 Free ^000000"; + if ($QW_S_PRICE == 60) mes "Storage = ^0000FF Kafra Mode ^000000"; + mes "Guild Storage = "+(($QW_GS_PRICE)?"^00FF00"+$QW_GS_PRICE:"^FF0000Free")+"^000000"; + + switch(select("Basic - Warps","Advanced - Warps","Overseas - Warps","Basic Dungeon warp fee","Advanced Dungeon warp fee","Overseas Dungeon warp fee","Full Healing","Part Healing","Storage","Guild Storage","Back","Exit")) { + case 1: + next; + mes "Basic - Warps are = "+(($QW_BW_PRICE)?"^00FF00"+$QW_BW_PRICE:"^FF0000Free")+"^000000"; + mes "Basic - Warps are starter towns and related dungeons."; + input $QW_BW_PRICE; + goto Setprice; + case 2: + next; + mes "Advanced - Warps are = "+(($QW_AW_PRICE)?"^00FF00"+$QW_AW_PRICE:"^FF0000Free")+"^000000"; + mes "Advanced - Warps are towns and dungeons on the same island but not close to any starter town."; + input $QW_AW_PRICE; + goto Setprice; + case 3: + next; + mes "Overseas - Warps are = "+(($QW_OW_PRICE)?"^00FF00"+$QW_OW_PRICE:"^FF0000Free")+"^000000"; + mes "Overseas - Warps are towns and dungeons overseas reachable by boat from Alberta."; + input $QW_OW_PRICE; + goto Setprice; + case 4: + next; + mes "Basic Dungeon level warp fee = "+(($QW_BW_FEE)?"^00FF00"+$QW_BW_FEE:"^FF0000NO")+"^000000 zeny per level"; + mes "Basic - Warps are starter town related dungeons."; + mes "Dungeon warp fees are calculated by maps away from entrance of the dungeon times Dungeon warp fee."; + mes "These costs are on top of the regular Warp costs."; + input $QW_BW_FEE; + goto Setprice; + case 5: + next; + mes "Advanced Dungeon level warp fee = "+(($QW_AW_FEE)?"^00FF00"+$QW_AW_FEE:"^FF0000NO")+"^000000 zeny per level"; + mes "Advanced - Warps are dungeons not close to any starter town."; + mes "Dungeon warp fees are calculated by maps away from entrance of the dungeon times Dungeon warp fee."; + mes "These costs are on top of the regular Warp costs."; + input $QW_AW_FEE; + goto Setprice; + case 6: + next; + mes "Overseas Dungeon level warp fee = "+(($QW_OW_FEE)?"^00FF00"+$QW_OW_FEE:"^FF0000NO")+"^000000 zeny per level"; + mes "Overseas - Warps are dungeons related to towns overseas reachable by boat from Alberta."; + mes "Dungeon warp fees are calculated by maps away from entrance of the dungeon times Dungeon warp fee."; + mes "These costs are on top of the regular Warp costs."; + input $QW_OW_FEE; + goto Setprice; + case 7: + next; + mes "Full Healing = "+(($QW_HF_PRICE)?"^00FF00"+$QW_HF_PRICE:"^FF0000Free")+"^000000"; + mes "Instant full healing 1 price."; + input $QW_HF_PRICE; + goto Setprice; + case 8: + next; + mes "^FF0000HP ^000000Part Healing = "+(($QW_HP_H_PRICE)?"^00FF00"+$QW_HP_H_PRICE+"^000000 a point":"^FF0000Free^000000"); + mes "^FF0000SP ^000000Part Healing = "+(($QW_HP_S_PRICE)?"^00FF00"+$QW_HP_S_PRICE+"^000000 a point":"^FF0000Free^000000"); + mes "Healing price per 1 HP."; + mes "Healing price per 1 SP."; + mes "2 inputs, first HP then SP."; + input $QW_HP_H_PRICE; + input $QW_HP_S_PRICE; + goto Setprice; + case 9: + next; + if ($QW_S_PRICE && $QW_S_PRICE != 60) mes "Storage = ^00FF00 "+$QW_S_PRICE+" ^000000"; + if (!$QW_S_PRICE) mes "Storage = ^FF0000 Free ^000000"; + if ($QW_S_PRICE == 60) mes "Storage = ^0000FF Kafra Mode ^000000"; + mes "Storage cost, if set to 60 Kafra pricing will be handled."; + input $QW_S_PRICE; + goto Setprice; + case 10: + next; + mes "Guild Storage = "+(($QW_GS_PRICE)?"^00FF00"+$QW_GS_PRICE:"^FF0000Free")+"^000000"; + mes "Guild Storage, free on Guild Kafras."; + input $QW_GS_PRICE; + goto Setprice; + case 11: + goto GM_Menu; + default: + close; + end; + } + +//======================Special=Warp=Menu========================== + +SpecialWarpMenu: + if ($QW_SP_Warpname$ == "") set $QW_SP_Warpname$,"Special Warp"; + next; + mes "Scroll down to see all the information"; + mes "The Special warp menu option will show in the main menu when all towns & dungeons are unlocked"; + mes "And when the map for special warping has been set"; + mes "menu option name set to ^0000FF"+$QW_SP_Warpname$+"^000000"; + if ($QW_SP_WarpMap$ == "") mes "map is currently ^FF0000not^000000 set, and Special warp menu is off"; + if ($QW_SP_WarpMap$ != "") mes "map is currently set to ^0000FF"+$QW_SP_WarpMap$+"^000000 and Special Warp menu is on"; + mes "coords are set to ^0000FF"+$QW_SP_WarpX+","+$QW_SP_WarpY+"^000000"; + switch(select("Set Special Warp name to show in menu", "Set WarpMap","Set Coords","Go Back to GM_Menu","Exit")){ + case 1: + next; + mes "Set the name to show in the menu as option."; + input $QW_SP_Warpname$; + goto SpecialWarpMenu; + case 2: + next; + mes "Set the map in the ^0000FFmapname^000000 format."; + mes "When this warpmap is set the option for players will show once they meet the requirments."; + mes "To disable Special Warp Menu option, clear this!"; + input $QW_SP_WarpMap$; + goto SpecialWarpMenu; + case 3: + next; + mes "First input = Xcoord"; + mes "Second input = Ycoord"; + input $QW_SP_WarpX; + input $QW_SP_WarpY; + goto SpecialWarpMenu; + case 4: + goto GM_Menu; + default: + close; + end; + } + +//======================Dungeon=Level=Limit======================== + +DungeonLevelLimit: + next; + mes "Dungeon Depth limit is "+(($QW_DL)?"^00FF00On":"^FF0000Off")+"^000000"; + mes "If^00FF00 On ^000000Dungeon Depth limit is set to ^0000FF"+$QW_DDL+"^000000"; + + switch(select("Toggle Dungeon Depth Limit","Set Dungeon Depth Limit","Go Back to GM_Menu","Exit")){ + case 1: set $QW_DL,($QW_DL)?0:1; goto DungeonLevelLimit; + case 2: + next; + mes "Set limit of Dungeon Depth 0 = entrance"; + mes "Depth 1 is a map connected to 0 and so on"; + mes "Shortest Route to map counts as depth"; + input $QW_DDL; + goto DungeonLevelLimit; + case 3: goto GM_Menu; + default: + close; + end; + } + +//===========================Towns================================= + +L_town: + callfunc "QWS_Tarray"; + freeloop(1); + set .@menu$,""; + for(set .@i,0; .@i<35; set .@i,.@i+1) // Expected maximum is 35 + set .@menu$,.@menu$+@Tmenulist$[.@i]+":"; + freeloop(0); + set @TWMenu,select(.@menu$); + + if (@Tmenuref[@TWMenu-1] == 57005) goto L_end; // 57005='dead' in hex + + if(Zeny<@pTprice[@Tmenuref[@TWMenu-1]]) callsub L_Short_on_zeny,0; + set Zeny, Zeny-@pTprice[@Tmenuref[@TWMenu-1]]; + if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + (@pTprice[@Tmenuref[@TWMenu-1]]/16); + warp @pTmap$[@Tmenuref[@TWMenu-1]],@pTXcoords[@Tmenuref[@TWMenu-1]],@pTYcoords[@Tmenuref[@TWMenu-1]]; + close2; + set Zeny, Zeny+@pTprice[@Tmenuref[@TWMenu-1]]; + end; + +//=========================Dungeons================================ + +L_dungeon: + callfunc "QWS_Darray"; + freeloop(1); + set .@menu$,""; + for(set .@i,0; .@i<35; set .@i,.@i+1) // Expected maximum is 35 + set .@menu$,.@menu$+@Dmenulist$[.@i]+":"; + freeloop(0); + set @DWMenu,select(.@menu$); + + if (@Dmenuref[@DWMenu-1] == 57005) goto L_end; // 57005='dead' in hex + set @DwarpMenu, (@Dmenuref[@DWMenu-1]); + callfunc "QWS_DLarray"; + + next; + mes "[Warpra]"; + mes "Please select where you want to go:"; + freeloop(1); + set .@menu$,""; + for(set .@i,0; .@i<18; set .@i,.@i+1) // Expected maximum is 18 + set .@menu$,.@menu$+@DWLmenulist$[.@i]+":"; + freeloop(0); + set @DWLMenu,select(.@menu$); + + if (@DWLmenuref[@DWLMenu-1] == 57005) goto L_end; // 57005='dead' in hex + + set @Darrayref, @DWLmenuref[@DWLMenu-1]; + set @warpprice, @pDprice[@Dmenuref[@DWMenu-1]]+(getd(@pDfee$[@Dmenuref[@DWMenu-1]])*(@DDepth[@Darrayref])); + + if(Zeny<@warpprice) callsub L_Short_on_zeny,1; + set Zeny, Zeny-(@warpprice); + if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + (@warpprice/16); + warp @DGat$[@Darrayref],@DXcoords[@Darrayref],@DYcoords[@Darrayref]; + close2; + set Zeny, Zeny+@pTprice[@Tmenuref[@DWMenu-1]]; + end; + +//=============================Healing============================= + +L_heal_Full: + set @healfee, $QW_HF_PRICE; + if(Zeny<@healfee) callsub L_Short_on_zeny,4; + set Zeny, Zeny-@healfee; + if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + (@healfee/500); + next; + mes "[Warpra]"; + mes "Close this window and I will heal you."; + close2; + percentheal 100,100; + end; + +L_heal_Part: + set @healchoice,select("Full heal","Health Points only","Skill Points only","Exit"); + if (@healchoice == 1) callsub PHeal,1,1; + if (@healchoice == 2) callsub PHeal,1,0; + if (@healchoice == 3) callsub PHeal,0,1; + goto L_end; + +PHeal: + next; + set @Hp, MaxHp-Hp; + set @Sp, MaxSp-Sp; + set @HpPrice, @hp*$QW_HP_H_PRICE; + set @SpPrice, @sp*$QW_HP_S_PRICE; + mes "[Warpra]"; + if(getarg(0) == 1) mes ""+@HpPrice+" Zeny for "+@Hp+" health points"; + if(getarg(1) == 1) mes ""+@SpPrice+" Zeny for "+@Sp+" skill points"; + set @total, @HpPrice+@SpPrice; + mes "for a total of "+@total+" zeny"; + if (select("Heal me","Let me see the choices again")==2) goto L_heal_Part; + + if(getarg(0) == 1)set @HpPrice, (MaxHp-Hp)*$QW_HP_H_PRICE; + if(getarg(1) == 1)set @SpPrice, (MaxSp-Sp)*$QW_HP_S_PRICE; + set @healfee, @HpPrice+@SpPrice; + if (getarg(0) == 1)&&(getarg(1) == 1)&&(Zeny<@healfee) goto Zeny_Short_Both; + if (getarg(0) == 1)&&(Zeny<@healfee) goto Zeny_short_HP; + if (getarg(1) == 1)&&(Zeny<@healfee) goto Zeny_short_SP; + set Zeny, Zeny-@healfee; + if (getarg(0) == 1)&&(getarg(1) == 1) percentheal 100,100; + if (getarg(0) == 1) percentheal 100,0; + if (getarg(1) == 1) percentheal 0,100; + close; + end; + +Zeny_Short_Both: + mes "[Warpra]"; + mes "Choose another option, you can afford both."; + mes "I can heal as much as you can afford, too."; + if (select("OK","Exit") == 2) goto L_end; + goto PHeal; + +Zeny_short_HP: + mes "[Warpra]"; + mes "Do you want me to partly heal your HP?"; + if (select("Yes","No") == 2) goto L_end; + set @Hp, Zeny/$QW_HP_H_PRICE; + set @HpPrice, @Hp*$QW_HP_H_PRICE; + if (@Hp == 1) mes "You're not worth the effort."; + if (@Hp == 1) goto L_end; + set Zeny, Zeny-@HpPrice; + heal @Hp,0; + close; + end; + +Zeny_short_SP: + mes "[Warpra]"; + mes "Do you want me to partly heal your SP?"; + if (select("Yes","No") == 2) goto L_end; + set @Sp, Zeny/$QW_HP_S_PRICE; + set @SpPrice, @Sp*$QW_HP_S_PRICE; + if (@Sp == 1) mes "You're not worth the effort."; + if (@Sp == 1) goto L_end; + set Zeny, Zeny-@SpPrice; + heal 0,@Sp; + close; + end; + +//=============================Storage============================= + +L_Storage: + next; + if(basicskillcheck() > 0 && getskilllv("NV_BASIC") < 6) goto L_StorageJBlow; + set @fee, $QW_S_PRICE; + if ($QW_S_PRICE == 60)&&(BaseJob == Job_Novice) set @fee, 30; + if ($QW_S_PRICE == 60)&&(BaseJob != Job_Novice) set @fee, 60; + if(Zeny<@fee) callsub L_Short_on_zeny,2; + set Zeny, Zeny-@fee; + if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + (@fee/5); + + mes "[Warpra]"; + if(#kafra_code) { + mes "Enter your storage password:"; + set @code_,0; + input @code_; + if(@code_ != #kafra_code) { + dispbottom "Wrong storage password."; + close; + } + set @kafcode_try,0; + set @code_,0; + } + mes "Close this window and I will open your storage."; + close2; + openstorage; + end; + +L_StorageJBlow: + mes "[Warpra]"; + mes "I am sorry but you have to be at least Novice level 6 if you want to use the storage."; + return; + +L_GStorage: + if (!@GID) { + next; + mes "[Warpra]"; + mes "You are not a part of a guild I can't help you."; + close; + end; + } + if (Zeny<$QW_GS_PRICE) callsub L_Short_on_zeny,3; + set Zeny, Zeny-$QW_GS_PRICE; + if ($QW_KPoint == 1) set RESRVPTS, RESRVPTS + ($QW_GS_PRICE/5); + next; + mes "[Warpra]"; + mes "Close this window and I will open the ^5533FF" + GetGuildName(@GID) + "^000000 storage."; + close2; + guildopenstorage; + end; + +L_end: + close; + end; + +//============================Few=Warp============================= +L_FewWarps: + next; + mes "[Warpra]"; + mes "You need to unlock locations before they come available to you."; + mes "To unlock a location talk to my colleagues all over the world."; + mes "Each account has its own stamp card."; + mes "Want me to check what stamps you have collected so far?"; + if (select("Yes","No")==1) callsub stampcard; + close; + end; + +//============================No=Unlock============================ +L_NoUnlock: + next; + mes "[Warpra]"; + mes "I don't unlock this location, my assistant deeper in the dungeon will unlock this place."; + close; + end; + +//=========================Short=On=Zeny=========================== +L_Short_on_zeny: + next; + switch(getarg(0)) { + case 0: mes "You don't seem to have "+@pTprice[@Tmenuref[@TWMenu-1]]+" zeny to pay for the warp to "+@pTmenuitems$[@Tmenuref[@TWMenu-1]]+"."; break; + case 1: mes "You don't seem to have "+@warpprice+" zeny to pay for the warp to "+@DLevelName$[@DWLmenuref[@DWLMenu-1]]+" at "+@pDmenuitems$[@Dmenuref[@DWMenu-1]]+"."; break; + case 2: mes "You don't seem to have "+@fee+" zeny to pay the storage fee."; break; + case 3: mes "You don't seem to have "+$QW_GS_PRICE+" zeny to pay the guild storage fee."; break; + case 4: mes "You don't seem to have "+@healfee+" zeny to pay for your healing."; break; + } + close; + end; + +//===========================Stamp=Card============================ +stampcard: +// Counting of the ammount of places you have unlocked + next; + mes "Let me check what Towns you have."; + callfunc "QWS_TownStamps"; + mes "You collected^00FF00 "+@Tstamp+" of "+@MaxTstamp+" ^000000Towns."; + if (@Tstamp == 15) mes "They say there is an island you can only get to when married..."; + if (@Tstamp == 15) emotion 18; + next; + mes "Let me check what dungeons you have."; + callfunc "QWS_DungeonStamps"; + mes "You collected^00FF00 "+@Dstamp+" of "+@MaxDstamp+" ^000000Dungeons."; + mes "To unlock a dungeon, search for my colleagues."; + mes "You can usually find them near the middle or end of the dungeon."; + return; +} + +function script QWS_TownStamps { + set @Tstamp,0; + set @MaxTstamp,30; //maximum number of towns + set @binvalue,1; + set @Tstamploop,0; + do { + if ((@binvalue & ##QWS_T_Unlock) == @binvalue) set @Tstamp,@Tstamp+1; + set @binvalue, @binvalue *2; + set @Tstamploop, @Tstamploop + 1; + } while (@Tstamploop < @MaxTstamp); + return; +} + +function script QWS_DungeonStamps { + set @Dstamp,0; + set @MaxDstamp,29; //maximum number of dungeons + set @binvalue,1; + set @Dstamploop,0; + do { + if ((@binvalue & ##QWS_D_Unlock) == @binvalue) set @Dstamp,@Dstamp+1; + set @binvalue, @binvalue *2; + set @Dstamploop, @Dstamploop + 1; + } while (@Dstamploop < @MaxDstamp); + return; +} + +//======================Main=Menu=Array============================ + +function script QWS_MMarray { + + // Currently 9 items + setarray @pMmenuitems$[0], "GameMaster Menu", $QW_SP_Warpname$, "Warp to Towns", "Warp to Dungeons", "Why so few warps?", "Why don't you unlock this location?", "Heal", "Heal", "Storage", "Guild Storage", "Cancel"; + set @Mi,0; // loop counter + set @Mj,0; // menu line counter + +//----------------GameMaster-Menu + if (getgmlevel()>= 80) { + set @Mmenulist$[@Mj],@pMmenuitems$[@Mi]; + set @Mmenuref[@Mj],@Mi; + set @Mj,@Mj+1; + } + set @Mi,@Mi+1; +//----------------Special-Warp + callfunc "QWS_TownStamps"; + callfunc "QWS_DungeonStamps"; + if (@Tstamp == @MaxTstamp)&&(@Dstamp == @MaxDstamp)&&($QW_SP_WarpMap$ != "") { + set @Mmenulist$[@Mj],@pMmenuitems$[@Mi]; + set @Mmenuref[@Mj],@Mi; + set @Mj,@Mj+1; + } + set @Mi,@Mi+1; +//----------------Town-Warp + if ($QW_TW_OFF == 0) { + set @Mmenulist$[@Mj],@pMmenuitems$[@Mi]; + set @Mmenuref[@Mj],@Mi; + set @Mj,@Mj+1; + } + set @Mi,@Mi+1; +//----------------Dungeon-Warp + if ($QW_DW_OFF == 0) { + set @Mmenulist$[@Mj],@pMmenuitems$[@Mi]; + set @Mmenuref[@Mj],@Mi; + set @Mj,@Mj+1; + } + set @Mi,@Mi+1; +//----------------Why-So-Few-Warps + set @Mmenulist$[@Mj],@pMmenuitems$[@Mi]; + set @Mmenuref[@Mj],@Mi; + set @Mj,@Mj+1; + set @Mi,@Mi+1; +//----------------No-Unlock + if (getarg(0) == 1) { + set @Mmenulist$[@Mj],@pMmenuitems$[@Mi]; + set @Mmenuref[@Mj],@Mi; + set @Mj,@Mj+1; + } + set @Mi,@Mi+1; +//----------------Healfull + if ($QW_HF == 1) { + set @Mmenulist$[@Mj],@pMmenuitems$[@Mi]; + set @Mmenuref[@Mj],@Mi; + set @Mj,@Mj+1; + } + set @Mi,@Mi+1; +//----------------Healpart + if ($QW_HP == 1) { + set @Mmenulist$[@Mj],@pMmenuitems$[@Mi]; + set @Mmenuref[@Mj],@Mi; + set @Mj,@Mj+1; + } + set @Mi,@Mi+1; +//----------------Storage + if ($QW_Stor == 1) { + set @Mmenulist$[@Mj],@pMmenuitems$[@Mi]; + set @Mmenuref[@Mj],@Mi; + set @Mj,@Mj+1; + } + set @Mi,@Mi+1; +//----------------GuildStorage + if ($QW_GStor == 1) { + set @Mmenulist$[@Mj],@pMmenuitems$[@Mi]; + set @Mmenuref[@Mj],@Mi; + set @Mj,@Mj+1; + } + set @Mi,@Mi+1; +//----------------Cancel + set @Mmenulist$[@Mj],@pMmenuitems$[@Mi]; + set @Mmenuref[@Mj],@Mi; + return; +} + +//======================Town=Menu=Array============================ +// Adding a town: +// setarray @pTmenuitems$[@Ti], "Prontera";// Name of Town shown in Town select Menu +// setarray @pTprice[@Ti], $QW_BW_PRICE; // Warp prices: Basic ($QW_BW_PRICE), Advanced ($QW_AW_PRICE), Overseas ($QW_OW_PRICE) +// +// setarray @pTmap$[@Ti], "prontera"; // Map name +// setarray @pTXcoords[@Ti], 156; // X warp coords +// setarray @pTYcoords[@Ti], 187; // Y warp coords +// +// QWS_Make_Town_Menu 0; // Use a free number (last used is 30, Eclage) +// +// Adding a warpra: +// map,x,y,facing script Warpra#example 113,{ +// callfunc "QWS_Town_Warpra",<town number>,"Your Town"; +// close; +// } +// Town number is the same as "QWS_Make_Town_Menu". +//================================================================== + +function script QWS_Tarray { + function QWS_Make_Town_Menu; + + set @Ti,0; // loop counter + set @Tj,0; // menu lines counter + +//----------------Prontera + setarray @pTmenuitems$[@Ti], "Prontera"; + setarray @pTprice[@Ti], $QW_BW_PRICE; + + setarray @pTmap$[@Ti], "prontera"; + setarray @pTXcoords[@Ti], 156; + setarray @pTYcoords[@Ti], 187; + + QWS_Make_Town_Menu 0; +//----------------Alberta + setarray @pTmenuitems$[@Ti], "Alberta"; + setarray @pTprice[@Ti], $QW_BW_PRICE; + + setarray @pTmap$[@Ti], "alberta"; + setarray @pTXcoords[@Ti], 27; + setarray @pTYcoords[@Ti], 236; + + QWS_Make_Town_Menu 1; +//----------------Aldebaran + setarray @pTmenuitems$[@Ti], "Aldebaran"; + setarray @pTprice[@Ti], $QW_AW_PRICE; + + setarray @pTmap$[@Ti], "aldebaran"; + setarray @pTXcoords[@Ti], 145; + setarray @pTYcoords[@Ti], 120; + + QWS_Make_Town_Menu 2; +//----------------Amatsu: + setarray @pTmenuitems$[@Ti], "Amatsu"; + setarray @pTprice[@Ti], $QW_OW_PRICE; + + setarray @pTmap$[@Ti], "amatsu"; + setarray @pTXcoords[@Ti], 197; + setarray @pTYcoords[@Ti], 86; + + QWS_Make_Town_Menu 3; +//----------------Ayothaya: + setarray @pTmenuitems$[@Ti], "Ayothaya"; + setarray @pTprice[@Ti], $QW_OW_PRICE; + + setarray @pTmap$[@Ti], "ayothaya"; + setarray @pTXcoords[@Ti], 150; + setarray @pTYcoords[@Ti], 57; + + QWS_Make_Town_Menu 4; +//----------------Brasilis: + setarray @pTmenuitems$[@Ti], "Brasilis"; + setarray @pTprice[@Ti], $QW_OW_PRICE; + + setarray @pTmap$[@Ti], "brasilis"; + setarray @pTXcoords[@Ti], 195; + setarray @pTYcoords[@Ti], 220; + + QWS_Make_Town_Menu 21; +//----------------Comodo: + setarray @pTmenuitems$[@Ti], "Comodo"; + setarray @pTprice[@Ti], $QW_AW_PRICE; + + setarray @pTmap$[@Ti], "comodo"; + setarray @pTXcoords[@Ti], 188; + setarray @pTYcoords[@Ti], 161; + + QWS_Make_Town_Menu 5; +//----------------Dewata: + setarray @pTmenuitems$[@Ti], "Dewata"; + setarray @pTprice[@Ti], $QW_OW_PRICE; + + setarray @pTmap$[@Ti], "dewata"; + setarray @pTXcoords[@Ti], 199; + setarray @pTYcoords[@Ti], 179; + + QWS_Make_Town_Menu 29; +//----------------Eclage: + setarray @pTmenuitems$[@Ti], "Eclage"; + setarray @pTprice[@Ti], $QW_OW_PRICE; + + setarray @pTmap$[@Ti], "eclage"; + setarray @pTXcoords[@Ti], 111; + setarray @pTYcoords[@Ti], 39; + + QWS_Make_Town_Menu 30; +//----------------Einbech: + setarray @pTmenuitems$[@Ti], "Einbech"; + setarray @pTprice[@Ti], $QW_AW_PRICE; + + setarray @pTmap$[@Ti], "einbech"; + setarray @pTXcoords[@Ti], 172; + setarray @pTYcoords[@Ti], 126; + + QWS_Make_Town_Menu 6; +//----------------Einbroch: + setarray @pTmenuitems$[@Ti], "Einbroch"; + setarray @pTprice[@Ti], $QW_AW_PRICE; + + setarray @pTmap$[@Ti], "einbroch"; + setarray @pTXcoords[@Ti], 230; + setarray @pTYcoords[@Ti], 191; + + QWS_Make_Town_Menu 7; +//----------------El Dicastes: + setarray @pTmenuitems$[@Ti], "El Dicastes"; + setarray @pTprice[@Ti], $QW_OW_PRICE; + + setarray @pTmap$[@Ti], "dicastes01"; + setarray @pTXcoords[@Ti], 197; + setarray @pTYcoords[@Ti], 187; + + QWS_Make_Town_Menu 22; +//----------------Geffen: + setarray @pTmenuitems$[@Ti], "Geffen"; + setarray @pTprice[@Ti], $QW_BW_PRICE; + + setarray @pTmap$[@Ti], "geffen"; + setarray @pTXcoords[@Ti], 119; + setarray @pTYcoords[@Ti], 66; + + QWS_Make_Town_Menu 8; +//----------------Gonryun: + setarray @pTmenuitems$[@Ti], "Gonryun"; + setarray @pTprice[@Ti], $QW_OW_PRICE; + + setarray @pTmap$[@Ti], "gonryun"; + setarray @pTXcoords[@Ti], 150; + setarray @pTYcoords[@Ti], 130; + + QWS_Make_Town_Menu 9; +//----------------Hugel: + setarray @pTmenuitems$[@Ti], "Hugel"; + setarray @pTprice[@Ti], $QW_AW_PRICE; + + setarray @pTmap$[@Ti], "hugel"; + setarray @pTXcoords[@Ti], 95; + setarray @pTYcoords[@Ti], 121; + + QWS_Make_Town_Menu 10; +//----------------Izlude: + setarray @pTmenuitems$[@Ti], "Izlude"; + setarray @pTprice[@Ti], $QW_BW_PRICE; + + setarray @pTmap$[@Ti], "izlude"; + setarray @pTXcoords[@Ti], 128; + setarray @pTYcoords[@Ti], 111; + + QWS_Make_Town_Menu 11; +//----------------Jawaii: + setarray @pTmenuitems$[@Ti], "Jawaii"; + setarray @pTprice[@Ti], $QW_AW_PRICE; + + setarray @pTmap$[@Ti], "jawaii"; + setarray @pTXcoords[@Ti], 243; + setarray @pTYcoords[@Ti], 115; + + QWS_Make_Town_Menu 12; +//----------------Lighthalzen: + setarray @pTmenuitems$[@Ti], "Lighthalzen"; + setarray @pTprice[@Ti], $QW_AW_PRICE; + + setarray @pTmap$[@Ti], "lighthalzen"; + setarray @pTXcoords[@Ti], 158; + setarray @pTYcoords[@Ti], 110; + + QWS_Make_Town_Menu 13; +//----------------Louyang: + setarray @pTmenuitems$[@Ti], "Louyang"; + setarray @pTprice[@Ti], $QW_OW_PRICE; + + setarray @pTmap$[@Ti], "louyang"; + setarray @pTXcoords[@Ti], 210; + setarray @pTYcoords[@Ti], 108; + + QWS_Make_Town_Menu 14; +//----------------Lutie + setarray @pTmenuitems$[@Ti], "Lutie"; + setarray @pTprice[@Ti], $QW_AW_PRICE; + + setarray @pTmap$[@Ti], "xmas"; + setarray @pTXcoords[@Ti], 148; + setarray @pTYcoords[@Ti], 131; + + QWS_Make_Town_Menu 15; +//----------------Manuk + setarray @pTmenuitems$[@Ti], "Manuk"; + setarray @pTprice[@Ti], $QW_OW_PRICE; + + setarray @pTmap$[@Ti], "manuk"; + setarray @pTXcoords[@Ti], 260; + setarray @pTYcoords[@Ti], 175; + + QWS_Make_Town_Menu 23; +//----------------Mora + setarray @pTmenuitems$[@Ti], "Mora"; + setarray @pTprice[@Ti], $QW_OW_PRICE; + + setarray @pTmap$[@Ti], "mora"; + setarray @pTXcoords[@Ti], 111; + setarray @pTYcoords[@Ti], 97; + + QWS_Make_Town_Menu 24; +//----------------Morroc: + setarray @pTmenuitems$[@Ti], "Morroc"; + setarray @pTprice[@Ti], $QW_BW_PRICE; + + setarray @pTmap$[@Ti], "morocc"; + setarray @pTXcoords[@Ti], 159; + setarray @pTYcoords[@Ti], 93; + + QWS_Make_Town_Menu 16; +//----------------Moscovia + setarray @pTmenuitems$[@Ti], "Moscovia"; + setarray @pTprice[@Ti], $QW_OW_PRICE; + + setarray @pTmap$[@Ti], "moscovia"; + setarray @pTXcoords[@Ti], 219; + setarray @pTYcoords[@Ti], 193; + + QWS_Make_Town_Menu 25; +//----------------Niflheim: + setarray @pTmenuitems$[@Ti], "Niflheim"; + setarray @pTprice[@Ti], $QW_AW_PRICE; + + setarray @pTmap$[@Ti], "niflheim"; + setarray @pTXcoords[@Ti], 195; + setarray @pTYcoords[@Ti], 186; + + QWS_Make_Town_Menu 17; +//----------------Payon: + setarray @pTmenuitems$[@Ti], "Payon"; + setarray @pTprice[@Ti], $QW_BW_PRICE; + + setarray @pTmap$[@Ti], "payon"; + setarray @pTXcoords[@Ti], 152; + setarray @pTYcoords[@Ti], 75; + + QWS_Make_Town_Menu 18; +//----------------Rachel + setarray @pTmenuitems$[@Ti], "Rachel"; + setarray @pTprice[@Ti], $QW_AW_PRICE; + + setarray @pTmap$[@Ti], "rachel"; + setarray @pTXcoords[@Ti], 130; + setarray @pTYcoords[@Ti], 111; + + QWS_Make_Town_Menu 26; +//----------------Splendide + setarray @pTmenuitems$[@Ti], "Splendide"; + setarray @pTprice[@Ti], $QW_OW_PRICE; + + setarray @pTmap$[@Ti], "splendide"; + setarray @pTXcoords[@Ti], 200; + setarray @pTYcoords[@Ti], 153; + + QWS_Make_Town_Menu 27; +//----------------Umbala: + setarray @pTmenuitems$[@Ti], "Umbala"; + setarray @pTprice[@Ti], $QW_AW_PRICE; + + setarray @pTmap$[@Ti], "umbala"; + setarray @pTXcoords[@Ti], 130; + setarray @pTYcoords[@Ti], 130; + + QWS_Make_Town_Menu 19; +//----------------Veins + setarray @pTmenuitems$[@Ti], "Veins"; + setarray @pTprice[@Ti], $QW_OW_PRICE; + + setarray @pTmap$[@Ti], "veins"; + setarray @pTXcoords[@Ti], 216; + setarray @pTYcoords[@Ti], 123; + + QWS_Make_Town_Menu 28; +//----------------Yuno: + setarray @pTmenuitems$[@Ti], "Yuno"; + setarray @pTprice[@Ti], $QW_AW_PRICE; + + setarray @pTmap$[@Ti], "yuno"; + setarray @pTXcoords[@Ti], 160; + setarray @pTYcoords[@Ti], 168; + + QWS_Make_Town_Menu 20; +//----------------Cancel + setarray @pTmenuitems$[@Ti], "Cancel"; + setarray @pTprice[@Ti], 0; + + set @Tmenulist$[@Tj],@pTmenuitems$[@Ti]; + set @Tmenuref[@Tj],57005; // 57005='dead' in hex + return; + + +//----------------Make Town Menu Function + +function QWS_Make_Town_Menu { + set @temptownmenubin,1; + if (getarg(0) == 0) goto menu_item; + set @templooptownmenu,0; + do { + set @temptownmenubin, @temptownmenubin * 2; + set @templooptownmenu, @templooptownmenu + 1; + }while (getarg(0) > @templooptownmenu); +// check marker and make menu item +menu_item: + if ((@temptownmenubin & ##QWS_T_Unlock) != @temptownmenubin) { + set @Ti,@Ti+1; + return; + } + if (@pTprice[@Ti] != 0)&&($QW_MapUserShow == 0) set @Tmenulist$[@Tj], @pTmenuitems$[@Ti]+" -> "+@pTprice[@Ti]; + if (@pTprice[@Ti] == 0)&&($QW_MapUserShow == 0) set @Tmenulist$[@Tj], @pTmenuitems$[@Ti]; + if (@pTprice[@Ti] != 0)&&($QW_MapUserShow == 1) set @Tmenulist$[@Tj], @pTmenuitems$[@Ti]+" ["+getmapusers(@pTmap$[@Ti])+"]"+" -> "+@pTprice[@Ti]; + if (@pTprice[@Ti] == 0)&&($QW_MapUserShow == 1) set @Tmenulist$[@Tj], @pTmenuitems$[@Ti]+" ["+getmapusers(@pTmap$[@Ti])+"]"; + set @Tmenuref[@Tj],@Ti; + set @Tj,@Tj+1; + set @Ti,@Ti+1; + return; +} +} + +//====================Dungeon=Menu=Arrays========================== +// Adding a dungeon: +// setarray @pDmenuitems$[@Di], "Abyss Lake"; // Name of Dungeon shown in Dungeon select Menu +// setarray @pDprice[@Di], $QW_AW_PRICE; // Warp prices: Basic ($QW_BW_PRICE), Advanced ($QW_AW_PRICE), Overseas ($QW_OW_PRICE) +// setarray @pDfee$[@Di], "$QW_AW_FEE"; // Identifier for fee caluclation: Basic ("$QW_BW_FEE"), Advanced ("$QW_AW_FEE"), Overseas ("$QW_OW_FEE") +// setarray @DLevels[@Di], 3; // Number of levels in dungeon +// +// setarray @DGat$[@Dref], "abyss_01", "abyss_02", "abyss_03"; // Map names of dungeon levels +// setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3"; // Name of dungeon levels shown in Menu +// setarray @DXcoords[@Dref], 265, 275, 116; // X warp coords +// setarray @DYcoords[@Dref], 273, 270, 27; // Y warp coords +// setarray @DDepth[@Dref], 0, 1, 2; // Relative depth to entrance, to calculate extra warp fee +// +// QWS_Make_Dungeon_Menu 0; // Use a free number (last used is 28, Kiel Dungeon) +// +// Adding a warpra: +// map,x,y,facing script Warpra Helper#example 112,{ +// callfunc "QWS_Dungeon_Warpra",<dungeon number>,"Your Dungeon"; +// close; +// } +// Dungeon number is the same as "QWS_Make_Dungeon_Menu". +//================================================================== + +function script QWS_Darray { + function QWS_Make_Dungeon_Menu; + + set @Di,0; + set @Dj,0; + set @Dref,0; + +//----------------ABYSS LAKE + setarray @pDmenuitems$[@Di], "Abyss Lake"; + setarray @pDprice[@Di], $QW_AW_PRICE; + setarray @pDfee$[@Di], "$QW_AW_FEE"; + setarray @DLevels[@Di], 3; + + setarray @DGat$[@Dref], "abyss_01", "abyss_02", "abyss_03"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3"; + setarray @DXcoords[@Dref], 265, 275, 116; + setarray @DYcoords[@Dref], 273, 270, 27; + setarray @DDepth[@Dref], 0, 1, 2; + + QWS_Make_Dungeon_Menu 0; + +//----------------AMATSU DUNGEON + setarray @pDmenuitems$[@Di], "Amatsu Dungeon"; + setarray @pDprice[@Di], $QW_OW_PRICE; + setarray @pDfee$[@Di], "$QW_OW_FEE"; + setarray @DLevels[@Di], 3; + + setarray @DGat$[@Dref], "ama_dun01", "ama_dun02", "ama_dun03"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3"; + setarray @DXcoords[@Dref], 227, 32, 119; + setarray @DYcoords[@Dref], 10, 43, 15; + setarray @DDepth[@Dref], 0, 1, 2; + + QWS_Make_Dungeon_Menu 1; + +//----------------ANT HELL + setarray @pDmenuitems$[@Di], "Ant Hell Dungeon"; + setarray @pDprice[@Di], $QW_BW_PRICE; + setarray @pDfee$[@Di], "$QW_BW_FEE"; + setarray @DLevels[2], 2; + + setarray @DGat$[@Dref], "anthell01", "anthell02"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2"; + setarray @DXcoords[@Dref], 32, 34; + setarray @DYcoords[@Dref], 262, 263; + setarray @DDepth[@Dref], 0, 1; + + QWS_Make_Dungeon_Menu 2; + +//----------------AYOTAYA + setarray @pDmenuitems$[@Di], "Ayotaya Dungeon"; + setarray @pDprice[@Di], $QW_OW_PRICE; + setarray @pDfee$[@Di], "$QW_OW_FEE"; + setarray @DLevels[3], 2; + + setarray @DGat$[@Dref], "ayo_dun01", "ayo_dun02"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2"; + setarray @DXcoords[@Dref], 275, 150; + setarray @DYcoords[@Dref], 17, 13; + setarray @DDepth[@Dref], 0, 1; + + QWS_Make_Dungeon_Menu 3; + +//----------------BYALAN + setarray @pDmenuitems$[@Di], "Byalan Dungeon"; + setarray @pDprice[@Di], $QW_BW_PRICE; + setarray @pDfee$[@Di], "$QW_BW_FEE"; + setarray @DLevels[4], 5; + + setarray @DGat$[@Dref], "iz_dun00", "iz_dun01", "iz_dun02", "iz_dun03", "iz_dun04"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Level 5"; + setarray @DXcoords[@Dref], 168, 41, 236, 32, 26; + setarray @DYcoords[@Dref], 168, 37, 204, 63, 27; + setarray @DDepth[@Dref], 0, 1, 2, 3, 4; + + QWS_Make_Dungeon_Menu 4; + +//----------------CLOCK TOWER + setarray @pDmenuitems$[@Di], "Clock Tower Dungeon"; + setarray @pDprice[@Di], $QW_AW_PRICE; + setarray @pDfee$[@Di], "$QW_AW_FEE"; + setarray @DLevels[5], 8; + + setarray @DGat$[@Dref], "c_tower1", "c_tower2", "c_tower3", "c_tower4", "alde_dun01", "alde_dun02", "alde_dun03", "alde_dun04"; + setarray @DLevelName$[@Dref], "Clock Tower Level 1", "Clock Tower Level 2", "Clock Tower Level 3", "Clock Tower Level 4", "Basement 1F", "Basement 2F", "Basement 3F", "Basement 4F"; + setarray @DXcoords[@Dref], 200, 268, 64, 32, 197, 262, 276, 122; + setarray @DYcoords[@Dref], 163, 26, 148, 63, 25, 41, 53, 125; + setarray @DDepth[@Dref], 0, 1, 2, 3, 1, 2, 3, 4; + + QWS_Make_Dungeon_Menu 5; + +//----------------COAL MINE + setarray @pDmenuitems$[@Di], "Coal Mine Dungeon"; + setarray @pDprice[@Di], $QW_AW_PRICE; + setarray @pDfee$[@Di], "$QW_AW_FEE"; + setarray @DLevels[6], 3; + + setarray @DGat$[@Dref], "mjo_dun01", "mjo_dun02", "mjo_dun03"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3"; + setarray @DXcoords[@Dref], 52, 381, 302; + setarray @DYcoords[@Dref], 17, 343, 261; + setarray @DDepth[@Dref], 0, 1, 2; + + QWS_Make_Dungeon_Menu 6; + +//----------------CULVERT + setarray @pDmenuitems$[@Di], "Culvert Dungeon"; + setarray @pDprice[@Di], $QW_BW_PRICE; + setarray @pDfee$[@Di], "$QW_BW_FEE"; + setarray @DLevels[7], 4; + + setarray @DGat$[@Dref], "prt_sewb1", "prt_sewb2", "prt_sewb3", "prt_sewb4"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4"; + setarray @DXcoords[@Dref], 132, 19, 180, 100; + setarray @DYcoords[@Dref], 248, 19, 169, 92; + setarray @DDepth[@Dref], 0, 1, 2, 3; + + QWS_Make_Dungeon_Menu 7; + +//----------------EINBECH DUNGEON + setarray @pDmenuitems$[@Di], "Einbech Dungeon"; + setarray @pDprice[@Di], $QW_AW_PRICE; + setarray @pDfee$[@Di], "$QW_AW_FEE"; + setarray @DLevels[8], 2; + + setarray @DGat$[@Dref], "ein_dun01", "ein_dun02"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2"; + setarray @DXcoords[@Dref], 22, 292; + setarray @DYcoords[@Dref], 14, 290; + setarray @DDepth[@Dref], 0, 1; + + QWS_Make_Dungeon_Menu 8; + +//----------------GEFENIA DUNGEON + setarray @pDmenuitems$[@Di], "Gefenia Dungeon"; + setarray @pDprice[@Di], $QW_BW_PRICE; + setarray @pDfee$[@Di], "$QW_BW_FEE"; + setarray @DLevels[9], 4; + + setarray @DGat$[@Dref], "gefenia01", "gefenia02", "gefenia03", "gefenia04"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4"; + setarray @DXcoords[@Dref], 59, 201, 264, 33; + setarray @DYcoords[@Dref], 167, 35, 236, 270; + setarray @DDepth[@Dref], 0, 1, 2, 3; + + QWS_Make_Dungeon_Menu 9; + +//----------------GEFFEN DUNGEON + setarray @pDmenuitems$[@Di], "Geffen Dungeon"; + setarray @pDprice[@Di], $QW_BW_PRICE; + setarray @pDfee$[@Di], "$QW_BW_FEE"; + setarray @DLevels[@Di], 4; + + setarray @DGat$[@Dref], "gef_dun00", "gef_dun01", "gef_dun02", "gef_dun03"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4"; + setarray @DXcoords[@Dref], 104, 115, 106, 203; + setarray @DYcoords[@Dref], 100, 236, 132, 200; + setarray @DDepth[@Dref], 0, 1, 2, 3; + + QWS_Make_Dungeon_Menu 10; + +//----------------GLAST HEIM + setarray @pDmenuitems$[@Di], "Glast Heim Dungeon"; + setarray @pDprice[@Di], $QW_BW_PRICE; + setarray @pDfee$[@Di], "$QW_BW_FEE"; + setarray @DLevels[@Di], 17; + + setarray @DGat$[@Dref], "glast_01", "gl_church", "gl_chyard", "gl_in01", "gl_cas01", "gl_cas02", "gl_knt01", "gl_knt02", "gl_prison", "gl_prison1", "gl_step", "gl_sew01", "gl_sew02", "gl_sew03", "gl_sew04", "gl_dun01", "gl_dun02"; + setarray @DLevelName$[@Dref], "Glast Heim Entrance", "St. Abbey", "Churchyard", "Inside Glast Heim", "Castle 1", "Castle 2", "Chivalry 1", "Chivalry 2", "Prison 1", "Prison 2", "Steps", "Sewers 1", "Sewers 2", "Sewers 3", "Sewers 4", "Lowest Cave 1", "Lowest Cave 2"; + setarray @DXcoords[@Dref], 370, 156, 147, 121, 199, 104, 150, 157, 14, 150, 117, 258, 108, 171, 68, 133, 224; + setarray @DYcoords[@Dref], 300, 8, 15, 59, 29, 25, 10, 287, 70, 14, 124, 255, 291, 273, 277, 271, 274; + setarray @DDepth[@Dref], 0, 1, 2, 1, 1, 2, 1, 2, 2, 3, 1, 4, 2, 3, 4, 5, 6; + + QWS_Make_Dungeon_Menu 11; + +//----------------GONRYUN DUNGEON + setarray @pDmenuitems$[@Di], "Gonryun Dungeon"; + setarray @pDprice[@Di], $QW_OW_PRICE; + setarray @pDfee$[@Di], "$QW_OW_FEE"; + setarray @DLevels[@Di], 3; + + setarray @DGat$[@Dref], "gon_dun01", "gon_dun02", "gon_dun03"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3"; + setarray @DXcoords[@Dref], 143, 17, 68; + setarray @DYcoords[@Dref], 59, 114, 9; + setarray @DDepth[@Dref], 0, 1, 2; + + QWS_Make_Dungeon_Menu 12; + +//----------------HIDDEN DUNGEON + setarray @pDmenuitems$[@Di], "Hidden Dungeon"; + setarray @pDprice[@Di], $QW_BW_PRICE; + setarray @pDfee$[@Di], "$QW_BW_FEE"; + setarray @DLevels[@Di], 3; + + setarray @DGat$[@Dref], "prt_maze01", "prt_maze02", "prt_maze03"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3"; + setarray @DXcoords[@Dref], 176, 94, 23; + setarray @DYcoords[@Dref], 6, 19, 8; + setarray @DDepth[@Dref], 0, 1, 2; + + QWS_Make_Dungeon_Menu 13; + +//----------------JUPEROS CAVE + setarray @pDmenuitems$[@Di], "Juperos Cave"; + setarray @pDprice[@Di], $QW_AW_PRICE; + setarray @pDfee$[@Di], "$QW_AW_FEE"; + setarray @DLevels[@Di], 2; + + setarray @DGat$[@Dref], "juperos_01", "juperos_02"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2"; + setarray @DXcoords[@Dref], 53, 36; + setarray @DYcoords[@Dref], 247, 60; + setarray @DDepth[@Dref], 0, 1; + + QWS_Make_Dungeon_Menu 14; + +//----------------KIEL DUNGEON + setarray @pDmenuitems$[@Di], "Kiel Dungeon"; + setarray @pDprice[@Di], $QW_AW_PRICE; + setarray @pDfee$[@Di], "$QW_AW_FEE"; + setarray @DLevels[@Di], 2; + + setarray @DGat$[@Dref], "kh_dun01", "kh_dun02"; + setarray @DLevelName$[@Dref], "1st Floor", "2nd Floor"; + setarray @DXcoords[@Dref], 63, 42; + setarray @DYcoords[@Dref], 10, 197; + setarray @DDepth[@Dref], 0, 1; + + QWS_Make_Dungeon_Menu 28; + +//----------------LIGHTHALZEN BIO LAB + setarray @pDmenuitems$[@Di], "Lighthalzen Bio Lab"; + setarray @pDprice[@Di], $QW_AW_PRICE; + setarray @pDfee$[@Di], "$QW_AW_FEE"; + setarray @DLevels[@Di], 3; + + setarray @DGat$[@Dref], "lhz_dun01", "lhz_dun02", "lhz_dun03"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3"; + setarray @DXcoords[@Dref], 150, 150, 140; + setarray @DYcoords[@Dref], 287, 18, 137; + setarray @DDepth[@Dref], 0, 1, 2; + + QWS_Make_Dungeon_Menu 15; + +//----------------LOUYANG DUNGEON + setarray @pDmenuitems$[@Di], "Louyang Dungeon"; + setarray @pDprice[@Di], $QW_OW_PRICE; + setarray @pDfee$[@Di], "$QW_OW_FEE"; + setarray @DLevels[@Di], 2; + + setarray @DGat$[@Dref], "lou_dun02", "lou_dun03"; + setarray @DLevelName$[@Dref], "Royal Tomb Level 1", "Royal Tomb Level 2"; + setarray @DXcoords[@Dref], 282, 165; + setarray @DYcoords[@Dref], 20, 38; + setarray @DDepth[@Dref], 0, 1; + + QWS_Make_Dungeon_Menu 16; + +//----------------MAGMA DUNGEON + setarray @pDmenuitems$[@Di], "Magma Dungeon"; + setarray @pDprice[@Di], $QW_AW_PRICE; + setarray @pDfee$[@Di], "$QW_AW_FEE"; + setarray @DLevels[@Di], 2; + + setarray @DGat$[@Dref], "mag_dun01", "mag_dun02"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2"; + setarray @DXcoords[@Dref], 126, 47; + setarray @DYcoords[@Dref], 69, 32; + setarray @DDepth[@Dref], 0, 1; + + QWS_Make_Dungeon_Menu 17; + +//----------------ODIN TEMPLE + setarray @pDmenuitems$[@Di], "Odin Temple"; + setarray @pDprice[@Di], $QW_AW_PRICE; + setarray @pDfee$[@Di], "$QW_AW_FEE"; + setarray @DLevels[@Di], 1; + + setarray @DGat$[@Dref], "odin_tem01"; + setarray @DLevelName$[@Dref], "Level 1"; + setarray @DXcoords[@Dref], 96; + setarray @DYcoords[@Dref], 145; + setarray @DDepth[@Dref], 0; + + QWS_Make_Dungeon_Menu 18; + +//----------------ORC DUNGEON + setarray @pDmenuitems$[@Di], "Orc Dungeon"; + setarray @pDprice[@Di], $QW_BW_PRICE; + setarray @pDfee$[@Di], "$QW_BW_FEE"; + setarray @DLevels[@Di], 2; + + setarray @DGat$[@Dref], "orcsdun01", "orcsdun02"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2"; + setarray @DXcoords[@Dref], 32, 21; + setarray @DYcoords[@Dref], 169, 185; + setarray @DDepth[@Dref], 0, 1; + + QWS_Make_Dungeon_Menu 19; + +//----------------PAYON DUNGEON + setarray @pDmenuitems$[@Di], "Payon Dungeon"; + setarray @pDprice[@Di], $QW_BW_PRICE; + setarray @pDfee$[@Di], "$QW_BW_FEE"; + setarray @DLevels[@Di], 5; + + setarray @DGat$[@Dref], "pay_dun00", "pay_dun01", "pay_dun02", "pay_dun03", "pay_dun04"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Level 5"; + setarray @DXcoords[@Dref], 22, 19, 19, 155, 201; + setarray @DYcoords[@Dref], 180, 33, 63, 159, 204; + setarray @DDepth[@Dref], 0, 1, 2, 3, 4; + + QWS_Make_Dungeon_Menu 20; + +//----------------PYRAMIDS + setarray @pDmenuitems$[@Di], "Pyramids Dungeon"; + setarray @pDprice[@Di], $QW_BW_PRICE; + setarray @pDfee$[@Di], "$QW_BW_FEE"; + setarray @DLevels[@Di], 6; + + setarray @DGat$[@Dref], "moc_pryd01", "moc_pryd02", "moc_pryd03", "moc_pryd04", "moc_pryd05", "moc_pryd06"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Basement 1", "Basement 2"; + setarray @DXcoords[@Dref], 192, 10, 100, 181, 94, 192; + setarray @DYcoords[@Dref], 9, 192, 92, 11, 96, 8; + setarray @DDepth[@Dref], 0, 1, 2, 3, 1, 2; + + QWS_Make_Dungeon_Menu 21; + +//----------------SPHINX + setarray @pDmenuitems$[@Di], "Sphinx Dungeon"; + setarray @pDprice[@Di], $QW_BW_PRICE; + setarray @pDfee$[@Di], "$QW_BW_FEE"; + setarray @DLevels[@Di], 5; + + setarray @DGat$[@Dref], "in_sphinx1", "in_sphinx2", "in_sphinx3", "in_sphinx4", "in_sphinx5"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Level 5"; + setarray @DXcoords[@Dref], 192, 149, 210, 10, 100; + setarray @DYcoords[@Dref], 9, 81, 54, 222, 99; + setarray @DDepth[@Dref], 0, 1, 2, 3, 4; + + QWS_Make_Dungeon_Menu 22; + +//----------------SUNKEN SHIP + setarray @pDmenuitems$[@Di], "Sunken Ship Dungeon"; + setarray @pDprice[@Di], $QW_BW_PRICE; + setarray @pDfee$[@Di], "$QW_BW_FEE"; + setarray @DLevels[@Di], 2; + + setarray @DGat$[@Dref], "treasure01", "treasure02"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2"; + setarray @DXcoords[@Dref], 69, 102; + setarray @DYcoords[@Dref], 24, 27; + setarray @DDepth[@Dref], 0, 1; + + QWS_Make_Dungeon_Menu 23; + +//----------------THANATOS TOWER + setarray @pDmenuitems$[@Di], "Thanatos Tower"; + setarray @pDprice[@Di], $QW_AW_PRICE; + setarray @pDfee$[@Di], "$QW_AW_FEE"; + setarray @DLevels[@Di], 13; + + setarray @DGat$[@Dref], "tha_t01", "tha_t02", "tha_t03", "tha_t04", "tha_t05", "tha_t06", "tha_t07", "tha_t08", "tha_t09", "tha_t10", "tha_t11", "tha_t12", "thana_boss"; + setarray @DLevelName$[@Dref], "Level 1", "Level 2", "Level 3", "Level 4", "Level 5", "Level 6", "Level 7", "Level 8", "Level 9", "Level 10", "Level 11", "Level 12", "Thanatos Boss"; + setarray @DXcoords[@Dref], 150, 150, 220, 59, 62, 206, 35, 105, 88, 168, 90, 129, 85; + setarray @DYcoords[@Dref], 35, 136, 158, 143, 11, 8, 166, 44, 145, 138, 36, 83, 76; + setarray @DDepth[@Dref], 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12; + + QWS_Make_Dungeon_Menu 24; + +//----------------TOY FACTORY + setarray @pDmenuitems$[@Di], "Toy Factory Dungeon"; + setarray @pDprice[@Di], $QW_AW_PRICE; + setarray @pDfee$[@Di], "$QW_AW_FEE"; + setarray @DLevels[@Di], 2; + + setarray @DGat$[@Dref], "xmas_dun01", "xmas_dun02"; + setarray @DLevelName$[@Dref], "Factory Warehouse", "Classifying Room"; + setarray @DXcoords[@Dref], 205, 129; + setarray @DYcoords[@Dref], 16, 133; + setarray @DDepth[@Dref], 0, 1; + + QWS_Make_Dungeon_Menu 25; + +//----------------TURTLE ISTLAND + setarray @pDmenuitems$[@Di], "Turtle Island Dungeon"; + setarray @pDprice[@Di], $QW_AW_PRICE; + setarray @pDfee$[@Di], "$QW_AW_FEE"; + setarray @DLevels[@Di], 4; + + setarray @DGat$[@Dref], "tur_dun01", "tur_dun02", "tur_dun03", "tur_dun04"; + setarray @DLevelName$[@Dref], "Outside", "Level 1", "Level 2", "Level 3"; + setarray @DXcoords[@Dref], 161, 148, 132, 100; + setarray @DYcoords[@Dref], 34, 256, 190, 192; + setarray @DDepth[@Dref], 0, 0, 1, 2; + + QWS_Make_Dungeon_Menu 26; + +//----------------UMBALA + setarray @pDmenuitems$[@Di], "Umbala Dungeon"; + setarray @pDprice[@Di], $QW_OW_PRICE; + setarray @pDfee$[@Di], "$QW_OW_FEE"; + setarray @DLevels[@Di], 3; + + setarray @DGat$[@Dref], "um_dun01", "um_dun02", "yggdrasil01"; + setarray @DLevelName$[@Dref], "Carpenter's Shop in The Tree", "Passage to a Foreign World", "Hvergelmir's Fountain"; + setarray @DXcoords[@Dref], 205, 48, 40; + setarray @DYcoords[@Dref], 26, 30, 63; + setarray @DDepth[@Dref], 0, 1, 2; + + QWS_Make_Dungeon_Menu 27; + +//----------------Cancel + setarray @pDmenuitems$[@Di], "Cancel"; + setarray @pDprice[@Di], 0; + + set @Dmenulist$[@Dj],@pDmenuitems$[@Di]; + set @Dmenuref[@Dj],57005; // 57005='dead' in hex + return; + + +//----------------Make Dungeon Menu Function + +function QWS_Make_Dungeon_Menu { + set @tempdungeonmenubin,1; + if (getarg(0) == 0) goto menu_item; + set @temploopdungeonmenu,0; + do { + set @tempdungeonmenubin, @tempdungeonmenubin * 2; + set @temploopdungeonmenu, @temploopdungeonmenu + 1; + }while (getarg(0) > @temploopdungeonmenu); +// check marker and make menu item +menu_item: + if ((@tempdungeonmenubin & ##QWS_D_Unlock) != @tempdungeonmenubin) { + setarray @DLocRef[@Di], @Dref; + set @Dref, @Dref+@DLevels[@Di]; + set @Di,@Di+1; + return; + } + if ($QW_MapUserShow == 1) { + set @tempmapusers,0; + set @mapusersloop,0; + do { + set @tempmapusers,(getmapusers(@DGat$[@Dref+@mapusersloop]) + @tempmapusers); + set @mapusersloop, (@mapusersloop + 1); + } while (@DLevels[@Di] > @mapusersloop); + if (@pDprice[@Di] != 0) set @Dmenulist$[@Dj], @pDmenuitems$[@Di]+" ["+@tempmapusers+"] -> "+@pDprice[@Di]; + if (@pDprice[@Di] == 0) set @Dmenulist$[@Dj], @pDmenuitems$[@Di]+" ["+@tempmapusers+"]"; + set @Dmenuref[@Dj],@Di; + set @Dj,@Dj+1; + setarray @DLocRef[@Di], @Dref; + set @Dref, @Dref+@DLevels[@Di]; + set @Di,@Di+1; + return; + } + if (@pDprice[@Di] != 0) set @Dmenulist$[@Dj], @pDmenuitems$[@Di]+" -> "+@pDprice[@Di]; + if (@pDprice[@Di] == 0) set @Dmenulist$[@Dj], @pDmenuitems$[@Di]; + set @Dmenuref[@Dj],@Di; + set @Dj,@Dj+1; + setarray @DLocRef[@Di], @Dref; + set @Dref, @Dref+@DLevels[@Di]; + set @Di,@Di+1; + return; +} +} + +function script QWS_DLarray { +//----------------Start building Menu + set @DWref,@DLocRef[@DwarpMenu]; // reference to the arrays with leveldata + set @DWi,0; // loop counter + set @DWj,0; // menu lines counter + cleararray @DWLmenulist$[0],"",20; // Clearing the array to get rid off ghost items in menu + do { + if ($QW_DL == 0)||($QW_DDL >= @DDepth[@DWref]) { + set @warpprice, (@pDprice[@DwarpMenu]+ (getd(@pDfee$[@DwarpMenu])*@DDepth[@DWref])); + if (@warpprice != 0)&&($QW_MapUserShow == 0) set @DWLmenulist$[@DWj], @DLevelName$[@DWref]+" -> "+@warpprice; + if (@warpprice == 0)&&($QW_MapUserShow == 0) set @DWLmenulist$[@DWj], @DLevelName$[@DWref]; + if (@warpprice != 0)&&($QW_MapUserShow == 1) set @DWLmenulist$[@DWj], @DLevelName$[@DWref]+" ["+getmapusers(@DGat$[@DWref])+"] -> "+@warpprice; + if (@warpprice == 0)&&($QW_MapUserShow == 1) set @DWLmenulist$[@DWj], @DLevelName$[@DWref]+" ["+getmapusers(@DGat$[@DWref])+"]"; + set @DWLmenuref[@DWj],@DWref; + set @DWj,@DWj+1; + } + set @DWref, @DWref+1; + set @DWi,@DWi+1; + } while (@DWi < @DLevels[@DwarpMenu]); + set @DWLmenulist$[@DWj], "Exit"; + set @DWLmenuref[@DWj],57005; // 57005='dead' in hex + return; +} + +//================Dungeon=Warpras=That=Only=Unlock================= + +function script QWS_Dungeon_Warpra { + function QWS_D_getbin; + function QWS_D_setbin; + + if ((QWS_D_getbin(getarg(0)) == 0) && (getarg(1) != "")) { + mes "[Warpra]"; + mes getarg(1)+" unlocked!"; + QWS_D_setbin(getarg(0)); + return; + } else if (QWS_D_getbin(getarg(0)) == 1) { + mes "[Warpra]"; + mes "Sorry, I can only unlock this location."; + } else + debugmes "QWS_Dungeon_Warpra error, improper syntax?"; + return; + + +function QWS_D_setbin { + set @tempsetbindata,1; + if (getarg(0) == 0) goto binset; + set @temploopsetbin,0; + do { + set @tempsetbindata, @tempsetbindata * 2; + set @temploopsetbin, @temploopsetbin + 1; + } while (getarg(0) > @temploopsetbin); +binset: + set ##QWS_D_Unlock,(##QWS_D_Unlock | @tempsetbindata); + return; +} + +function QWS_D_getbin { + set @tempgetbindata,1; + if (getarg(0) == 0) goto binget; + set @temploopgetbin,0; + do { + set @tempgetbindata, @tempgetbindata * 2; + set @temploopgetbin, @temploopgetbin + 1; + } while (getarg(0) > @temploopgetbin); +binget: + if ((@tempgetbindata & ##QWS_D_Unlock) == @tempgetbindata) return 1; + return 0; +} +} + +//==========================Town=Warpras=========================== + +function script QWS_Town_Warpra { + function QWS_T_getbin; + function QWS_T_setbin; + + if ((QWS_T_getbin(getarg(0)) == 0) && (getarg(1) != "")) { + mes "[Warpra]"; + mes getarg(1)+" unlocked!"; + QWS_T_setbin(getarg(0)); + return; + } else if (QWS_T_getbin(getarg(0)) == 1) { + callfunc "Q_Warpra",0; + } else + debugmes "QWS_Town_Warpra error, improper syntax ?"; + return; + +function QWS_T_setbin { + set @tempsetbindata,1; + if (getarg(0) == 0) goto binset; + set @temploopsetbin,0; + do { + set @tempsetbindata, @tempsetbindata * 2; + set @temploopsetbin, @temploopsetbin + 1; + } while (getarg(0) > @temploopsetbin); +binset: + set ##QWS_T_Unlock,(##QWS_T_Unlock | @tempsetbindata); + return; +} + +function QWS_T_getbin { + set @tempgetbindata,1; + if (getarg(0) == 0) goto binget; + set @temploopgetbin,0; + do { + set @tempgetbindata, @tempgetbindata * 2; + set @temploopgetbin, @temploopgetbin + 1; + } while (getarg(0) > @temploopgetbin); +binget: + if ((@tempgetbindata & ##QWS_T_Unlock) == @tempgetbindata) return 1; + return 0; +} +} +//============================Warpras============================== + +- script Warpra#0 -1,{ callfunc "Q_Warpra",1; } +alb2trea,73,101,4 duplicate(Warpra#0) Warpra#1 113 +ama_fild01,178,325,1 duplicate(Warpra#0) Warpra#2 113 +gef_fild10,71,339,4 duplicate(Warpra#0) Warpra#3 113 +izlu2dun,104,82,4 duplicate(Warpra#0) Warpra#4 113 +mjolnir_02,85,363,4 duplicate(Warpra#0) Warpra#5 113 +moc_fild04,207,331,4 duplicate(Warpra#0) Warpra#6 113 +moc_fild19,106,97,4 duplicate(Warpra#0) Warpra#7 113 +moc_ruins,64,166,4 duplicate(Warpra#0) Warpra#8 113 +niflheim,197,192,3 duplicate(Warpra#0) Warpra#9 113 +pay_arche,39,135,4 duplicate(Warpra#0) Warpra#10 113 +prt_fild05,273,215,4 duplicate(Warpra#0) Warpra#11 113 +tur_dun01,148,239,4 duplicate(Warpra#0) Warpra#12 113 +valkyrie,48,35,8 duplicate(Warpra#0) Warpra#13 113 +yuno_fild03,37,135,4 duplicate(Warpra#0) Warpra#14 113 + +alberta,32,240,4 script Warpra#15 113,{ callfunc "QWS_Town_Warpra",1,"Alberta Town"; close; } +aldebaran,146,118,4 script Warpra#16 113,{ callfunc "QWS_Town_Warpra",2,"Aldebaran Town"; close; } +ayothaya,216,171,5 script Warpra#17 113,{ callfunc "QWS_Town_Warpra",4,"Ayotaya Town"; close; } +amatsu,193,81,1 script Warpra#18 113,{ callfunc "QWS_Town_Warpra",3,"Amatsu Town"; close; } +comodo,195,158,4 script Warpra#19 113,{ callfunc "QWS_Town_Warpra",5,"Comodo Town"; close; } +einbroch,229,196,5 script Warpra#20 113,{ callfunc "QWS_Town_Warpra",7,"Einbroch Town"; close; } +einbech,173,131,5 script Warpra#21 113,{ callfunc "QWS_Town_Warpra",6,"Einbech Town"; close; } +geffen,116,66,4 script Warpra#22 113,{ callfunc "QWS_Town_Warpra",8,"Geffen Town"; close; } +gonryun,152,130,4 script Warpra#23 113,{ callfunc "QWS_Town_Warpra",9,"Gonryun Town"; close; } +hugel,90,127,5 script Warpra#24 113,{ callfunc "QWS_Town_Warpra",10,"Hugel Town"; close; } +jawaii,107,182,5 script Warpra#25 113,{ callfunc "QWS_Town_Warpra",12,"Jawaii Town"; close; } +izlude,132,116,4 script Warpra#26 113,{ callfunc "QWS_Town_Warpra",11,"Izlude Town"; close; } +lighthalzen,153,100,5 script Warpra#27 113,{ callfunc "QWS_Town_Warpra",13,"Lighthalzen Town"; close; } +louyang,211,106,4 script Warpra#28 113,{ callfunc "QWS_Town_Warpra",14,"Louyang Town"; close; } +morocc,157,95,4 script Warpra#29 113,{ callfunc "QWS_Town_Warpra",16,"Morroc Town"; close; } +nif_fild01,319,77,1 script Warpra#30 113,{ callfunc "QWS_Town_Warpra",17,"Niflheim Town"; close; } +payon,183,110,4 script Warpra#31 113,{ callfunc "QWS_Town_Warpra",18,"Payon Town"; close; } +prontera,147,172,5 script Warpra#32 113,{ callfunc "QWS_Town_Warpra",0,"Prontera Town"; close; } +umbala,133,130,4 script Warpra#33 113,{ callfunc "QWS_Town_Warpra",19,"Umbala Town"; close; } +xmas,151,136,4 script Warpra#34 113,{ callfunc "QWS_Town_Warpra",15,"Lutie Town"; close; } +yuno,138,162,4 script Warpra#35 113,{ callfunc "QWS_Town_Warpra",20,"Yuno Town"; close; } +brasilis,201,222,4 script Warpra#36 113,{ callfunc "QWS_Town_Warpra",21,"Brasilis Town"; close; } +dicastes01,194,194,6 script Warpra#37 113,{ callfunc "QWS_Town_Warpra",22,"El Dicastes Town"; close; } +manuk,262,177,4 script Warpra#38 113,{ callfunc "QWS_Town_Warpra",23,"Manuk Town"; close; } +mora,110,100,4 script Warpra#39 113,{ callfunc "QWS_Town_Warpra",24,"Mora Town"; close; } +moscovia,216,196,6 script Warpra#40 113,{ callfunc "QWS_Town_Warpra",25,"Moscovia Town"; close; } +rachel,135,116,4 script Warpra#41 113,{ callfunc "QWS_Town_Warpra",26,"Rachel Town"; close; } +splendide,205,153,4 script Warpra#42 113,{ callfunc "QWS_Town_Warpra",27,"Splendide Town"; close; } +veins,214,123,4 script Warpra#43 113,{ callfunc "QWS_Town_Warpra",28,"Veins Town"; close; } +dewata,194,178,6 script Warpra#44 113,{ callfunc "QWS_Town_Warpra",29,"Dewata Town"; close; } +eclage,107,37,4 script Warpra#45 113,{ callfunc "QWS_Town_Warpra",30,"Eclage Town"; close; } + +abyss_02,274,266,1 script Warpra Helper#0 112,{ callfunc "QWS_Dungeon_Warpra",0,"Abyss Lake"; close; } +ama_dun02,192,118,5 script Warpra Helper#1 112,{ callfunc "QWS_Dungeon_Warpra",1,"Amatsu Dungeon"; close; } +anthell02,170,165,3 script Warpra Helper#2 112,{ callfunc "QWS_Dungeon_Warpra",2,"Ant Hell Dungeon"; close; } +ayo_dun02,258,193,5 script Warpra Helper#3 112,{ callfunc "QWS_Dungeon_Warpra",3,"Ayotaya Dungeon"; close; } +ein_dun02,292,282,1 script Warpra Helper#4 112,{ callfunc "QWS_Dungeon_Warpra",8,"Einbech Dungeon"; close; } +iz_dun03,202,47,2 script Warpra Helper#5 112,{ callfunc "QWS_Dungeon_Warpra",4,"Byalan Dungeon"; close; } +c_tower3,129,106,4 script Warpra Helper#6 112,{ callfunc "QWS_Dungeon_Warpra",5,"Clock Tower Dungeon"; close; } +mjo_dun02,39,25,4 script Warpra Helper#7 112,{ callfunc "QWS_Dungeon_Warpra",6,"Coal Mine Dungeon"; close; } +prt_sewb2,176,30,3 script Warpra Helper#8 112,{ callfunc "QWS_Dungeon_Warpra",7,"Culvert Dungeon"; close; } +gefenia03,137,34,0 script Warpra Helper#9 112,{ callfunc "QWS_Dungeon_Warpra",9,"Gefenia Dungeon"; close; } +gef_dun02,218,61,2 script Warpra Helper#10 112,{ callfunc "QWS_Dungeon_Warpra",10,"Gefen Dungeon"; close; } +glast_01,371,308,3 script Warpra Helper#11 112,{ callfunc "QWS_Dungeon_Warpra",11,"Glast Heim Dungeon"; close; } +gon_dun01,167,273,4 script Warpra Helper#12 112,{ callfunc "QWS_Dungeon_Warpra",12,"Gonryun Dungeon"; close; } +juperos_02,127,154,5 script Warpra Helper#13 112,{ callfunc "QWS_Dungeon_Warpra",14,"Juperos Cave"; close; } +kh_dun01,14,224,3 script Warpra Helper#14 112,{ callfunc "QWS_Dungeon_Warpra",28,"Kiel Dungeon"; close; } +lhz_dun02,156,151,5 script Warpra Helper#15 112,{ callfunc "QWS_Dungeon_Warpra",15,"Lighthalzen Bio Lab"; close; } +lou_dun02,168,264,4 script Warpra Helper#16 112,{ callfunc "QWS_Dungeon_Warpra",16,"Louyang Dungeon"; close; } +mag_dun02,46,41,3 script Warpra Helper#17 112,{ callfunc "QWS_Dungeon_Warpra",17,"Magma Dungeon"; close; } +odin_tem01,115,148,3 script Warpra Helper#18 112,{ callfunc "QWS_Dungeon_Warpra",18,"Odin Temple"; close; } +orcsdun01,185,11,3 script Warpra Helper#19 112,{ callfunc "QWS_Dungeon_Warpra",19,"Orc Dungeon"; close; } +pay_dun03,162,143,3 script Warpra Helper#20 112,{ callfunc "QWS_Dungeon_Warpra",20,"Payon Dungeon"; close; } +moc_pryd02,101,95,3 script Warpra Helper#21 112,{ callfunc "QWS_Dungeon_Warpra",21,"Pyramides Dungeon"; close; } +in_sphinx2,274,268,1 script Warpra Helper#22 112,{ callfunc "QWS_Dungeon_Warpra",22,"Sphinx Dungeon"; close; } +tha_t07,111,162,3 script Warpra Helper#23 112,{ callfunc "QWS_Dungeon_Warpra",24,"Thanatos Tower"; close; } +treasure02,104,40,3 script Warpra Helper#24 112,{ callfunc "QWS_Dungeon_Warpra",23,"Sunken Ship Dungeon"; close; } +xmas_dun02,124,131,3 script Warpra Helper#25 112,{ callfunc "QWS_Dungeon_Warpra",25,"Toy Factory Dungeon"; close; } +um_dun02,44,28,3 script Warpra Helper#26 112,{ callfunc "QWS_Dungeon_Warpra",27,"Umbala Dungeon"; close; } +tur_dun02,162,23,3 script Warpra Helper#27 112,{ callfunc "QWS_Dungeon_Warpra",26,"Turtle Island Dungeon"; close; } +prt_maze02,102,69,4 script Warpra Helper#28 112,{ callfunc "QWS_Dungeon_Warpra",13,"Hidden Dungeon"; close; }
\ No newline at end of file diff --git a/npc/custom/etc/rpsroulette.txt b/npc/custom/etc/rpsroulette.txt new file mode 100644 index 000000000..8e3d04a3e --- /dev/null +++ b/npc/custom/etc/rpsroulette.txt @@ -0,0 +1,286 @@ +//===== rAthena Script ======================================= +//= Rock Scissors Roulette +//===== By: ================================================== +//= acky +//===== Current Version: ===================================== +//= 1.2 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Plays a hybrid Russian Roulette Rock Scissors Paper game. +//===== Additional Comments: ================================= +//= Prizes customizable, Added emotions. +//= 1.2 Fixes by Blackthunder and me [Poki#3] +//============================================================ + +cmd_in02,182,126,2 script Crazy Boris 85,{ + mes "Crazy Boris"; + set @counter,1; + mes "Hey you! Up for Rock Scissors Roulette?"; + next; + menu "Let me play.",PLAY,"Explain the rules.",RULES,"Leave",LEAVE; + SAME: + mes "Draw! Again!"; + next; + goto PLAY; + +WIN: + mes "Damnit, You Win!"; + emotion 19; + next; + goto OPPPULL; + +LOSE: + emotion 18; + mes "Boorah! You Lose!"; + next; + goto YOUPULL; + +PLAY: + mes "Rock... Paper..."; + set @opp,rand (1,3); + menu "^0000FFROCK!",ROCK,"^FF0000SCISSORS!",SCISSORS,"^00FF00PAPER!^000000",PAPER; + +ROCK: + if (@lastchoice == 1) set @opp,rand (1,3); + if (@opp == 1) emotion 11; + if (@opp == 2) emotion 10; + if (@opp == 3) emotion 12; + set @lastchoice,1; + if (@opp == 1) goto SAME; + if (@opp == 2) goto WIN; + if (@opp == 3) goto LOSE; + +SCISSORS: + if (@lastchoice == 2) set @opp,rand (1,2); + if (@opp == 1) emotion 11; + if (@opp == 2) emotion 10; + if (@opp == 3) emotion 12; + set @lastchoice,2; + if (@opp == 1) goto LOSE; + if (@opp == 2) goto SAME; + if (@opp == 3) goto WIN; + +PAPER: + if (@lastchoice == 3) set @opp,rand (2,3); + if (@opp == 1) emotion 11; + if (@opp == 2) emotion 10; + if (@opp == 3) emotion 12; + set @lastchoice,3; + if (@opp == 1) goto WIN; + if (@opp == 2) goto LOSE; + if (@opp == 3) goto SAME; + +YOUPULL: + if (@counter == 1) goto ONE; + if (@counter == 2) goto TWO; + if (@counter == 3) goto THREE; + if (@counter == 4) goto FOUR; + if (@counter == 5) goto FIVE; + if (@counter == 6) goto SIX; + +OPPPULL: + if (@counter == 1) goto ONEa; + if (@counter == 2) goto TWOa; + if (@counter == 3) goto THREEa; + if (@counter == 4) goto FOURa; + if (@counter == 5) goto FIVEa; + if (@counter == 6) goto SIXa; + +ONE: + set @counter,2; + mes "1 of 6"; + set @pull,rand (1,6); + next; + if (@pull == 1) goto DIE; + if (@pull != 1) goto SAFE; + +TWO: + set @counter,3; + mes "2 of 6"; + set @pull,rand (1,5); + next; + if (@pull == 1) goto DIE; + if (@pull != 1) goto SAFE; + +THREE: + set @counter,4; + mes "3 of 6"; + set @pull,rand (1,4); + next; + if (@pull == 1) goto DIE; + if (@pull != 1) goto SAFE; + +FOUR: + set @counter,5; + mes "4 of 6"; + set @pull,rand (1,3); + next; + if (@pull == 1) goto DIE; + if (@pull != 1) goto SAFE; + +FIVE: + set @counter,6; + mes "5 of 6"; + set @pull,rand (1,2); + if (@pull == 1) set @pull,rand (1,2); + next; + if (@pull == 1) goto DIE; + if (@pull != 1) goto SAFE; + +SIX: + mes "6 of 6"; + mes "Say your prayers"; + set @pull,1; + next; + if (@pull == 1) goto DIE; + if (@pull != 1) goto SAFE; + +ONEa: + set @counter,2; + mes "1 of 6"; + set @pull,rand (1,6); + next; + if (@pull == 1) goto KILL; + if (@pull != 1) goto SAFE; + +TWOa: + set @counter,3; + mes "2 of 6"; + set @pull,rand (1,5); + next; + if (@pull == 1) goto KILL; + if (@pull != 1) goto SAFE; + +THREEa: + set @counter,4; + mes "3 of 6"; + set @pull,rand (1,4); + next; + if (@pull == 1) goto KILL; + if (@pull != 1) goto SAFE; + +FOURa: + set @counter,5; + mes "4 of 6"; + set @pull,rand (1,3); + next; + if (@pull == 1) goto KILL; + if (@pull != 1) goto SAFE; + +FIVEa: + set @counter,6; + mes "5 of 6"; + set @pull,rand (1,2); + next; + if (@pull == 1) goto KILL; + if (@pull != 1) goto SAFE; + +SIXa: + mes "6 of 6"; + mes "Say your prayers"; + set @pull,1; + next; + if (@pull == 1) goto KILL; + if (@pull != 1) goto SAFE; + +SAFE: + emotion 32; + mes "*^0000FFClick^000000* whew..."; + goto PLAY; + +DIE: + specialeffect2 183; + emotion 29; + percentheal -100,-100; + mes "*^0000FFClick^000000* *^FF0000BANG^000000*"; + mes "You're dead!"; + close; + +KILL: + specialeffect 183; + emotion 23; + mes "*^0000FFClick^000000* *^FF0000BANG^000000*"; + mes "OWWW @#$%^!! THAT HURT LIKE HELL!!"; + next; + goto PRIZE; + +RULES: + mes "Ok here are the rules:"; + mes "I have with me a ^FF00006^000000 chamber pistol with ^FF00001^000000 round. First we play ^FF0000Scissors ^00FF00Paper ^0000FFRock^000000. The loser pulls the trigger. The winner is whoever comes out best."; + mes "Beat me to win a prize."; + menu "Let me play.",CONT,"No thanks.",LEAVE; + +CONT: + mes "Ok here we go..."; + next; + goto PLAY; + +PRIZE: + mes "Congratulations! You have won..."; + set @prize,rand (1,10); + if (@prize == 1) goto P1; + if (@prize == 2) goto P2; + if (@prize == 3) goto P3; + if (@prize == 4) goto P4; + if (@prize == 5) goto P5; + if (@prize == 6) goto P6; + if (@prize == 7) goto P7; + if (@prize == 8) goto P8; + if (@prize == 9) goto P9; + if (@prize == 10) goto P10; + +P1: + mes "10x Oridicon!"; + getitem 984,10; + close; + +P2: + mes "10x Elunium!"; + getitem 985,10; + close; + +P3: + mes "100x Fly Wings!"; + getitem 601,100; + close; + +P4: + mes "8x Old Blue Box!"; + getitem 603,8; + close; + +P5: + mes "4x Old Violet Box!"; + getitem 617,4; + close; + +P6: + mes "1x Old Card Album!"; + getitem 616,1; + close; + +P7: + mes "10x Dead Branch!"; + getitem 604,10; + close; + +P8: + mes "3x Gold!"; + getitem 969,3; + close; + +P9: + mes "10x Elunium!"; + getitem 985,10; + close; + +P10: + mes "20x Blue Potion!"; + getitem 505,20; + close; + +LEAVE: + mes "Pansy."; + close; +} diff --git a/npc/custom/etc/shifty_assassin.txt b/npc/custom/etc/shifty_assassin.txt new file mode 100644 index 000000000..46d3aab07 --- /dev/null +++ b/npc/custom/etc/shifty_assassin.txt @@ -0,0 +1,199 @@ +//===== rAthena Script ======================================= +//= Shifty Assassin +//===== By: ================================================== +//= acky +//===== Current Version: ===================================== +//= 1.1.2 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Players buy ninjas to assassinate other players +//===== Additional Comments: ================================= +//= 1.1.1 Changed all gmcommand to atcommand as Poki#3 suggested. [Vicious] +//= 1.1.2 Updated WoE Check. [Paradox924X] +//============================================================ + +morocc,148,86,5 script Shifty Assassin 725,{ + set $ninja_price,250000; + + // STARTS THE MENU // +M_Start: + mes "[Shifty Assassin]"; + mes "What do you want?"; + next; + if (getgmlevel() > 90) goto M_GM; + menu "Buy Ninjas",M_Buy,"Assassinate somebody",M_Kill,"Check your Ninjas",M_Check,"Cancel",M_Exit; +M_GM: + menu "Buy Ninjas",M_Buy,"Assassinate somebody",M_Kill,"Check your Ninjas",M_Check,"Add Ninjas",M_Add,"Cancel",M_Exit; + + // GM MENU TO ADD NINJAS // +M_Add: + mes "[Shifty Assassin]"; + mes "How many ninjas do you want to make available?"; + next; + set @add,0; + input @add; + set $ninja_avail,$ninja_avail+@add; + mes @add + " ninjas added."; + close; + + // BUY NINJAS // +M_Buy: + mes "[Shifty Assassin]"; + mes "How many ninjas do you want buy?"; + mes "There are ^0000FF" + $ninja_avail + "^000000 ninjas available."; + mes "They cost ^0000FF" + $ninja_price + " zeny ^000000each."; + + set @buy,0; + input @buy; + next; + if ($ninja_avail < 1) goto NoNinjas; + if ($ninja_avail < @buy) goto NotEnoughNinjas; + set @price,@buy*$ninja_price; + if (zeny < @price ) goto NoZeny; + + mes "[Shifty Assassin]"; + mes "That will cost you ^0000FF" + @price + " zeny^000000."; + next; + menu "Continue",-,"Cancel",M_Exit; + + set zeny,zeny-@price; + set #ninjas,#ninjas+@buy; + set $ninja_avail,$ninja_avail-@buy; + + mes "[Shifty Assassin]"; + mes "Thank you."; + close; + + // ASSASSINATE SOMEBODY // +M_Kill: + if (agitcheck()) goto M_Busy; + mes "[Shifty Assassin]"; + mes "Enter the name of the target."; + mes "^FF0000Type the name exactly, otherwise I won't be able to find the victim.^000000"; + next; + menu "Continue",-,"Cancel",M_Exit; + set @name$,"0"; + input @name$; + next; + mes "[Shifty Assassin]"; + mes "Active Ninjas: "+#ninjas; + mes "Resting Ninjas: "+#ninjasr; + mes "How many do you want to send?"; + set @number,0; + input @number; + if (@number < 1) goto NoNinjasSent; + if (@number > #ninjas) goto NotEnoughNinjas1; + if (@number > 10) goto TooManyNinjas; + set @chance,rand (1,12); + set #ninjas,#ninjas-@number; + set #ninjas,#ninjas+#ninjasr; + set #ninjasr,0; + if (@number < @chance) goto M_Failure; + + // SUCCESSFUL ATTACK // + mes "Sending ninjas now."; + next; + mes "[Shifty Assassin]"; + set @ninjasurvived,rand (1,@number); + set #ninjasr,@number-@ninjasurvived; + mes "Your attack succeeded but only ^FF0000" + #ninjasr + "^000000 Ninjas survived."; + + atcommand strcharinfo(0) + "@kill "+@name$; + announce @name$+" has been assassinated by " + strcharinfo(0) +"'s Ninjas.",bc_npc; + close; + + // FAILED ATTACK // +M_Failure: + mes "Sending ninjas now."; + next; + mes "[Shifty Assassin]"; + set @ninjasurvived,rand (1,@number); + set #ninjasr,@number-@ninjasurvived; + mes "Your attack failed and only ^FF0000" + #ninjasr + "^000000 Ninjas survived."; + + announce @name$+" has survived " + strcharinfo(0) +"'s Ninja attack.",8; + close; + + // NINJAS BUSY FOR WOE // +M_Busy: + mes "[Shifty Assassin]"; + mes "Sorry, all my ninjas are busy doing War of Emperium."; + close; + + // CHECK YOUR NINJAS // +M_Check: + mes "[Shifty Assassin]"; + mes "You have:"; + mes "^FF0000" + #ninjas + "^000000 Active Ninjas."; + mes "^0000FF" + #ninjasr + "^000000 Resting Ninjas."; + next; + goto M_Start; + + + // LIMIT // +NoNinjasSent: + mes "[Shifty Assassin]"; + mes "You can't kill anyone without ninjas."; + next; + goto M_Start; + +TooManyNinjas: + mes "[Shifty Assassin]"; + mes "You can only send 10 ninjas max."; + next; + goto M_Start; + +NoZeny: + mes "[Shifty Assassin]"; + mes "You do not have enough zeny."; + close; + +NotEnoughNinjas: + mes "[Shifty Assassin]"; + mes "There aren't that many ninjas to buy."; + next; + goto M_Start; + +NoNinjas: + mes "[Shifty Assassin]"; + mes "There are no ninjas left to buy."; + close; + +NotEnoughNinjas1: + mes "[Shifty Assassin]"; + mes "You do not have that many ninjas."; + next; + goto M_Start; + +M_Exit: + mes "[Shifty Assassin]"; + mes "Goodbye."; + close; + +// TIMER DELAY NINJA ADDER // +OnClock0600: + set $ninja_avail,$ninja_avail+2; + end; +OnClock1200: + set $ninja_avail,$ninja_avail+2; + end; +OnClock1500: + set $ninja_avail,$ninja_avail+2; + end; +OnClock1800: + set $ninja_avail,$ninja_avail+3; + end; +OnClock1900: + set $ninja_avail,$ninja_avail+2; + end; +OnClock2000: + set $ninja_avail,$ninja_avail+2; + end; +OnClock0000: + set $ninja_avail,$ninja_avail+2; + end; +OnInit: + set $ninja_avail,$ninja_avail+1; + end; +} diff --git a/npc/custom/etc/stock_market.txt b/npc/custom/etc/stock_market.txt new file mode 100644 index 000000000..6f90bcaef --- /dev/null +++ b/npc/custom/etc/stock_market.txt @@ -0,0 +1,791 @@ +//===== rAthena Script ======================================= +//= Stock Market Game +//===== By: ================================================== +//= acky +//===== Current Version: ===================================== +//= 1.3.1 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= NPC for a stock market game. +//===== Additional Comments: ================================= +//= GM Must activate the NPC before use. +//= Fixed MAJOR exploit. - players could buy for free +//= Low prices likely to rise, High prices likely to drop +//= Small fix by Galeon +//= Lupus: This script lets players make 40,000,000z a day +//= so use it on your own risk +//============================================================ + +- script sharenames -1,{ + end; +OnInit: + // Sets the names of the shares // + set $S1N$,"JIN"; + set $S2N$,"VNG"; + set $S3N$,"SHA"; + set $S4N$,"RGC"; + set $S5N$,"PSC"; + set $S6N$,"GNG"; + set $S7N$,"XRO"; + set $S8N$,"GRM"; + set $S9N$,"DOP"; + set $S10N$,"POR"; + + // Transaction fee // + set $S_Trans,1500; + + // Min & Max buyable // + set $S_BuyMin,1; + set $S_BuyMax,1000000; + end; + + // Average Price (Your start prices) // + set $S_Avg,100; + + // Set times of fluctuation // +OnClock1100: + set $S_LastUpd$,"12:00"; + goto S_Fluc; + end; + +OnClock0000: + set $S_LastUpd$,"00:00"; + goto S_Fluc; + end; + +OnClock0600: + set $S_LastUpd$,"06:00"; + goto S_Fluc; + end; + +OnClock1800: + set $S_LastUpd$,"18:00"; + goto S_Fluc; + end; + +OnClock2100: + set $S_LastUpd$,"21:00"; + goto S_Fluc; + end; + +OnClock0900: + set $S_LastUpd$,"09:00"; + goto S_Fluc; + end; + +OnClock1500: + set $S_LastUpd$,"15:00"; + goto S_Fluc; + end; + +S_Fluc: + set $fluc,rand (-6,6); + set $S1B,$S1; + set $S1,$S1+$fluc; + if ($S1 < 25) set $S1,$S1+3; + if ($S1 < 50) set $S1,$S1+2; + if ($S1 > 150) set $S1,$S1-2; + if ($S1 > 175) set $S1,$S1-3; + if ($S1 < 1) set $S1,1; + + set $fluc,rand (-6,6); + set $S2B,$S2; + set $S2,$S2+$fluc; + if ($S2 < 25) set $S2,$S2+3; + if ($S2 < 50) set $S2,$S2+2; + if ($S2 > 150) set $S2,$S2-2; + if ($S2 > 175) set $S2,$S2-3; + if ($S2 < 1) set $S2,1; + + set $fluc,rand (-6,6); + set $S3B,$S3; + set $S3,$S3+$fluc; + if ($S3 < 25) set $S3,$S3+3; + if ($S3 < 50) set $S3,$S3+2; + if ($S3 > 150) set $S3,$S3-2; + if ($S3 > 175) set $S3,$S3-3; + if ($S3 < 1) set $S3,1; + + set $fluc,rand (-6,6); + set $S4B,$S4; + set $S4,$S4+$fluc; + if ($S4 < 25) set $S4,$S4+3; + if ($S4 < 50) set $S4,$S4+2; + if ($S4 > 150) set $S4,$S4-2; + if ($S4 > 175) set $S4,$S4-3; + if ($S4 < 1) set $S4,1; + + set $fluc,rand (-6,6); + set $S5B,$S5; + set $S5,$S5+$fluc; + if ($S5 < 25) set $S5,$S5+3; + if ($S5 < 50) set $S5,$S5+2; + if ($S5 > 150) set $S5,$S5-2; + if ($S5 > 175) set $S5,$S5-3; + if ($S5 < 1) set $S5,1; + + set $fluc,rand (-6,6); + set $S6B,$S6; + set $S6,$S6+$fluc; + if ($S6 < 25) set $S6,$S6+3; + if ($S6 < 50) set $S6,$S6+2; + if ($S6 > 150) set $S6,$S6-2; + if ($S6 > 175) set $S6,$S6-3; + if ($S6 < 1) set $S6,1; + + set $fluc,rand (-6,6); + set $S7B,$S7; + set $S7,$S7+$fluc; + if ($S7 < 25) set $S7,$S7+3; + if ($S7 < 50) set $S7,$S7+2; + if ($S7 > 150) set $S7,$S7-2; + if ($S7 > 175) set $S7,$S7-3; + if ($S7 < 1) set $S7,1; + + set $fluc,rand (-6,6); + set $S8B,$S8; + set $S8,$S8+$fluc; + if ($S8 < 25) set $S8,$S8+3; + if ($S8 < 50) set $S8,$S8+2; + if ($S8 > 150) set $S8,$S8-2; + if ($S8 > 175) set $S8,$S8-3; + if ($S8 < 1) set $S8,1; + + set $fluc,rand (-6,6); + set $S9B,$S9; + set $S9,$S9+$fluc; + if ($S9 < 25) set $S9,$S9+3; + if ($S9 < 50) set $S9,$S9+2; + if ($S9 > 150) set $S9,$S9-2; + if ($S9 > 175) set $S9,$S9-3; + if ($S9 < 1) set $S9,1; + + set $fluc,rand (-6,6); + set $S10B,$S10; + set $S10,$S10+$fluc; + if ($S10 < 25) set $S10,$S10+3; + if ($S10 < 50) set $S10,$S10+2; + if ($S10 > 150) set $S10,$S10-2; + if ($S10 > 175) set $S10,$S10-3; + if ($S10 < 1) set $S10,1; + end; +} + +prontera,140,181,5 script Stock Market::stockmarket 109,{ + // Ensures no trading when default prices have not been set // + set @stotal,$S1+$S2+$S3+$S4+$S5+$S6+$S7+$S8+$S9+$S10; + if (@stotal > 0) goto S_Start; + mes "[Stock Market]"; + mes "Trading is currently closed."; + if (getgmlevel() > 90) goto GM_Open; + close; + + // Begining of interface // +S_Start: + mes "[Stock Market]"; + mes "Last fluctuation: " + $S_LastUpd$; + + // Loss/Gain in price // + set @S1Update,$S1-$S1B; + set @S2Update,$S2-$S2B; + set @S3Update,$S3-$S3B; + set @S4Update,$S4-$S4B; + set @S5Update,$S5-$S5B; + set @S6Update,$S6-$S6B; + set @S7Update,$S7-$S7B; + set @S8Update,$S8-$S8B; + set @S9Update,$S9-$S9B; + set @S10Update,$S10-$S10B; + + // Makes Loss/Gain Red/Green // + if (@S1Update < 0) set @S1Update$,"^FF0000"+@S1Update+"^000000"; + if (@S1Update > 0) set @S1Update$,"^00FF00+"+@S1Update+"^000000"; + if (@S1Update == 0) set @S1Update$,@S1Update; + + if (@S2Update < 0) set @S2Update$,"^FF0000"+@S2Update+"^000000"; + if (@S2Update > 0) set @S2Update$,"^00FF00+"+@S2Update+"^000000"; + if (@S2Update == 0) set @S2Update$,@S2Update; + + if (@S3Update < 0) set @S3Update$,"^FF0000"+@S3Update+"^000000"; + if (@S3Update > 0) set @S3Update$,"^00FF00+"+@S3Update+"^000000"; + if (@S3Update == 0) set @S3Update$,@S3Update; + + if (@S4Update < 0) set @S4Update$,"^FF0000"+@S4Update+"^000000"; + if (@S4Update > 0) set @S4Update$,"^00FF00+"+@S4Update+"^000000"; + if (@S4Update == 0) set @S4Update$,@S4Update; + + if (@S5Update < 0) set @S5Update$,"^FF0000"+@S5Update+"^000000"; + if (@S5Update > 0) set @S5Update$,"^00FF00+"+@S5Update+"^000000"; + if (@S5Update == 0) set @S5Update$,@S5Update; + + if (@S6Update < 0) set @S6Update$,"^FF0000"+@S6Update+"^000000"; + if (@S6Update > 0) set @S6Update$,"^00FF00+"+@S6Update+"^000000"; + if (@S6Update == 0) set @S6Update$,@S6Update; + + if (@S7Update < 0) set @S7Update$,"^FF0000"+@S7Update+"^000000"; + if (@S7Update > 0) set @S7Update$,"^00FF00+"+@S7Update+"^000000"; + if (@S7Update == 0) set @S7Update$,@S7Update; + + if (@S8Update < 0) set @S8Update$,"^FF0000"+@S8Update+"^000000"; + if (@S8Update > 0) set @S8Update$,"^00FF00+"+@S8Update+"^000000"; + if (@S8Update == 0) set @S8Update$,@S8Update; + + if (@S9Update < 0) set @S9Update$,"^FF0000"+@S9Update+"^000000"; + if (@S9Update > 0) set @S9Update$,"^00FF00+"+@S9Update+"^000000"; + if (@S9Update == 0) set @S9Update$,@S9Update; + + if (@S10Update < 0) set @S10Update$,"^FF0000"+@S10Update+"^000000"; + if (@S10Update > 0) set @S10Update$,"^00FF00+"+@S10Update+"^000000"; + if (@S10Update == 0) set @S10Update$,@S10Update; + + // Displays shares & prices // + mes "^21698F"+$S1N$+"^000000" + " " + $S1 + "z (" + @S1Update$ + ")"; + mes "^21698F"+$S2N$+"^000000" + " " + $S2 + "z (" + @S2Update$ + ")"; + mes "^21698F"+$S3N$+"^000000" + " " + $S3 + "z (" + @S3Update$ + ")"; + mes "^21698F"+$S4N$+"^000000" + " " + $S4 + "z (" + @S4Update$ + ")"; + mes "^21698F"+$S5N$+"^000000" + " " + $S5 + "z (" + @S5Update$ + ")"; + mes "^21698F"+$S6N$+"^000000" + " " + $S6 + "z (" + @S6Update$ + ")"; + mes "^21698F"+$S7N$+"^000000" + " " + $S7 + "z (" + @S7Update$ + ")"; + mes "^21698F"+$S8N$+"^000000" + " " + $S8 + "z (" + @S8Update$ + ")"; + mes "^21698F"+$S9N$+"^000000" + " " + $S9 + "z (" + @S9Update$ + ")"; + mes "^21698F"+$S10N$+"^000000" + " " + $S10 + "z (" + @S10Update$ + ")"; + next; + + // GM Menu link // + if (getgmlevel() > 90) goto GM_subMenu; + menu "Portfolio",S_Port,"Buy Shares",S_Buy,"Sell Shares",S_Sell,"Cancel",S_Quit; + +GM_subMenu: + menu "Portfolio",S_Port,"Buy Shares",S_Buy,"Sell Shares",S_Sell,"GM Menu",GM_Menu,"Cancel",S_Quit; + + // Selling Shares // +S_Sell: + mes "[Stock Market]"; + mes "Enter the name of the share you wish to sell."; + mes "Transaction fee of ^FF0000" + $S_Trans + "z^000000 will apply."; + if (#S1 > 0) mes "^0000FF"+$S1N$+"^FF0000" + " x " + #S1 + " [" + $S1 + "z]"; + if (#S2 > 0) mes "^0000FF"+$S2N$+"^FF0000" + " x " + #S2 + " [" + $S2 + "z]"; + if (#S3 > 0) mes "^0000FF"+$S3N$+"^FF0000" + " x " + #S3 + " [" + $S3 + "z]"; + if (#S4 > 0) mes "^0000FF"+$S4N$+"^FF0000" + " x " + #S4 + " [" + $S4 + "z]"; + if (#S5 > 0) mes "^0000FF"+$S5N$+"^FF0000" + " x " + #S5 + " [" + $S5 + "z]"; + if (#S6 > 0) mes "^0000FF"+$S6N$+"^FF0000" + " x " + #S6 + " [" + $S6 + "z]"; + if (#S7 > 0) mes "^0000FF"+$S7N$+"^FF0000" + " x " + #S7 + " [" + $S7 + "z]"; + if (#S8 > 0) mes "^0000FF"+$S8N$+"^FF0000" + " x " + #S8 + " [" + $S8 + "z]"; + if (#S9 > 0) mes "^0000FF"+$S9N$+"^FF0000" + " x " + #S9 + " [" + $S9 + "z]"; + if (#S10 > 0) mes "^0000FF"+$S10N$+"^FF0000" + " x " + #S10 + " [" + $S10 + "z]"; + set @sellname$,"0"; + input @sellname$; + set @sellamount,0; + input @sellamount; + if (@sellamount < 1) goto S_SellInv; + if (zeny < $S_Trans) goto S_NoZeny; + set zeny,zeny-$S_Trans; + +SELLS1: + if (@sellname$ != $S1N$) goto SELLS2; + if (@sellamount > #S1) goto S_SellTooHigh; + set @price,@sellamount*$S1; + set #S1,#S1-@sellamount; + set zeny,zeny+@price; + next; + mes "Sold " + @sellamount + " " + $S1N$ + " shares."; + mes "Earned ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +SELLS2: + if (@sellname$ != $S2N$) goto SELLS3; + if (@sellamount > #S2) goto S_SellTooHigh; + set @price,@sellamount*$S2; + set #S2,#S2-@sellamount; + set zeny,zeny+@price; + next; + mes "Sold " + @sellamount + " " + $S2N$ + " shares."; + mes "Earned ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +SELLS3: + if (@sellname$ != $S3N$) goto SELLS4; + if (@sellamount > #S3) goto S_SellTooHigh; + set @price,@sellamount*$S3; + set #S3,#S3-@sellamount; + set zeny,zeny+@price; + next; + mes "Sold " + @sellamount + " " + $S3N$ + " shares."; + mes "Earned ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +SELLS4: + if (@sellname$ != $S4N$) goto SELLS5; + if (@sellamount > #S4) goto S_SellTooHigh; + set @price,@sellamount*$S4; + set #S4,#S4-@sellamount; + set zeny,zeny+@price; + next; + mes "Sold " + @sellamount + " " + $S4N$ + " shares."; + mes "Earned ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +SELLS5: + if (@sellname$ != $S5N$) goto SELLS6; + if (@sellamount > #S5) goto S_SellTooHigh; + set @price,@sellamount*$S5; + set #S5,#S5-@sellamount; + set zeny,zeny+@price; + next; + mes "Sold " + @sellamount + " " + $S5N$ + " shares."; + mes "Earned ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +SELLS6: + if (@sellname$ != $S6N$) goto SELLS7; + if (@sellamount > #S6) goto S_SellTooHigh; + set @price,@sellamount*$S6; + set #S6,#S6-@sellamount; + set zeny,zeny+@price; + next; + mes "Sold " + @sellamount + " " + $S6N$ + " shares."; + mes "Earned ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +SELLS7: + if (@sellname$ != $S7N$) goto SELLS8; + if (@sellamount > #S7) goto S_SellTooHigh; + set @price,@sellamount*$S7; + set #S7,#S7-@sellamount; + set zeny,zeny+@price; + next; + mes "Sold " + @sellamount + " " + $S7N$ + " shares."; + mes "Earned ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +SELLS8: + if (@sellname$ != $S8N$) goto SELLS9; + if (@sellamount > #S8) goto S_SellTooHigh; + set @price,@sellamount*$S8; + set #S8,#S8-@sellamount; + set zeny,zeny+@price; + next; + mes "Sold " + @sellamount + " " + $S8N$ + " shares."; + mes "Earned ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +SELLS9: + if (@sellname$ != $S9N$) goto SELLS10; + if (@sellamount > #S9) goto S_SellTooHigh; + set @price,@sellamount*$S9; + set #S9,#S9-@sellamount; + set zeny,zeny+@price; + next; + mes "Sold " + @sellamount + " " + $S9N$ + " shares."; + mes "Earned ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +SELLS10: + if (@sellname$ != $S10N$) goto SELLS11; + if (@sellamount > #S10) goto S_SellTooHigh; + set @price,@sellamount*$S10; + set #S10,#S10-@sellamount; + set zeny,zeny+@price; + next; + mes "Sold " + @sellamount + " " + $S10N$ + " shares."; + mes "Earned ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +SELLS11: + mes "^FF0000Invalid Share Name.^000000"; + next; + goto S_Start; + +S_SellTooHigh: + mes "^FF0000You don't have that many shares.^000000"; + next; + goto S_Start; + +S_SellInv: + mes "^FF0000Invalid integer.^000000"; + next; + goto S_Start; + + // Buying Shares // +S_Buy: + mes "[Stock Market]"; + mes "Available shares:"; + mes $S1N$; + mes $S2N$; + mes $S3N$; + mes $S4N$; + mes $S5N$; + mes $S6N$; + mes $S7N$; + mes $S8N$; + mes $S9N$; + mes $S10N$; + next; + menu "Continue",-,"Cancel",S_Start; + + mes "Enter the name of the share company"; + mes "Transaction fee of ^FF0000" + $S_Trans + "z^000000 will apply."; + set @buyname$,"0"; + input @buyname$; + + set @buyamount,0; + input @buyamount; + // Checks valid number // + if (@buyamount < $S_BuyMin) goto S_TooLow; + if (@buyamount > $S_BuyMax) goto S_TooHigh; + if (zeny < $S_Trans) goto S_NoZeny; + set zeny,zeny-$S_Trans; + + // Purchases the shares // + +PURS1: + if (@buyname$ != $S1N$) goto PURS2; + set @price,@buyamount*$S1; + if (zeny < @price) goto S_NoZeny; + set #S1,#S1+@buyamount; + set @price,@buyamount*$S1; + set zeny,zeny-@price; + mes "Bought " + @buyamount + " " + $S1N$ + " shares."; + mes "Lost ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +PURS2: + if (@buyname$ != $S2N$) goto PURS3; + set @price,@buyamount*$S2; + if (zeny < @price) goto S_NoZeny; + set #S2,#S2+@buyamount; + set zeny,zeny-@price; + mes "Bought " + @buyamount + " " + $S2N$ + " shares."; + mes "Lost ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +PURS3: + if (@buyname$ != $S3N$) goto PURS4; + set @price,@buyamount*$S3; + if (zeny < @price) goto S_NoZeny; + set #S3,#S3+@buyamount; + set zeny,zeny-@price; + mes "Bought " + @buyamount + " " + $S3N$ + " shares."; + mes "Lost ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +PURS4: + if (@buyname$ != $S4N$) goto PURS5; + set @price,@buyamount*$S4; + if (zeny < @price) goto S_NoZeny; + set #S4,#S4+@buyamount; + set zeny,zeny-@price; + mes "Bought " + @buyamount + " " + $S4N$ + " shares."; + mes "Lost ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +PURS5: + if (@buyname$ != $S5N$) goto PURS6; + set @price,@buyamount*$S5; + if (zeny < @price) goto S_NoZeny; + set #S5,#S5+@buyamount; + set zeny,zeny-@price; + mes "Bought " + @buyamount + " " + $S5N$ + " shares."; + mes "Lost ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +PURS6: + if (@buyname$ != $S6N$) goto PURS7; + set @price,@buyamount*$S6; + if (zeny < @price) goto S_NoZeny; + set #S6,#S6+@buyamount; + set zeny,zeny-@price; + mes "Bought " + @buyamount + " " + $S6N$ + " shares."; + mes "Lost ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +PURS7: + if (@buyname$ != $S7N$) goto PURS8; + set @price,@buyamount*$S7; + if (zeny < @price) goto S_NoZeny; + set #S7,#S7+@buyamount; + set zeny,zeny-@price; + mes "Bought " + @buyamount + " " + $S7N$ + " shares."; + mes "Lost ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +PURS8: + if (@buyname$ != $S8N$) goto PURS9; + set @price,@buyamount*$S8; + if (zeny < @price) goto S_NoZeny; + set #S8,#S8+@buyamount; + set zeny,zeny-@price; + mes "Bought " + @buyamount + " " + $S8N$ + " shares."; + mes "Lost ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +PURS9: + if (@buyname$ != $S9N$) goto PURS10; + set @price,@buyamount*$S9; + if (zeny < @price) goto S_NoZeny; + set #S9,#S9+@buyamount; + set zeny,zeny-@price; + mes "Bought " + @buyamount + " " + $S9N$ + " shares."; + mes "Lost ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +PURS10: + if (@buyname$ != $S10N$) goto PURS11; + set @price,@buyamount*$S10; + if (zeny < @price) goto S_NoZeny; + set #S10,#S10+@buyamount; + set zeny,zeny-@price; + mes "Bought " + @buyamount + " " + $S10N$ + " shares."; + mes "Lost ^0000FF"+@price+"z^000000."; + next; + goto S_Start; + +PURS11: + goto S_InvName; + + // Number too low // +S_TooLow: + mes "^FF0000Minimum of " + $S_BuyMin + " shares can be bought at a time.^000000"; + next; + goto S_Start; + + // Number too high // +S_TooHigh: + mes "^FF0000Maximum number of " + $S_BuyMax + " shares can be bought at a time.^000000"; + next; + goto S_Start; + +S_NoZeny: + mes "^FF0000You do not have enough zeny.^000000"; + next; + goto S_Start; + + // Sends user to start if name invalid // +S_InvName: + mes "^FF0000Invalid share name.^000000"; + next; + goto S_Start; + + // Displays your total amount // +S_Port: + mes "[Stock Market]"; + +ACCS1: + if (#S1 < 1) goto ACCS2; + set @S1,#S1*$S1; + mes $S1N$ + ": " + #S1 + " x " + $S1 + "z = " + @S1 + "z"; + +ACCS2: + if (#S2 < 1) goto ACCS3; + set @S2,#S2*$S2; + mes $S2N$ + ": " + #S2 + " x " + $S2 + "z = " + @S2 + "z"; + +ACCS3: + if (#S3 < 1) goto ACCS4; + set @S3,#S3*$S3; + mes $S3N$ + ": " + #S3 + " x " + $S3 + "z = " + @S3 + "z"; + +ACCS4: + if (#S4 < 1) goto ACCS5; + set @S4,#S4*$S4; + mes $S4N$ + ": " + #S4 + " x " + $S4 + "z = " + @S4 + "z"; + +ACCS5: + if (#S5 < 1) goto ACCS6; + set @S5,#S5*$S5; + mes $S5N$ + ": " + #S5 + " x " + $S5 + "z = " + @S5 + "z"; + +ACCS6: + if (#S6 < 1) goto ACCS7; + set @S6,#S6*$S6; + mes $S6N$ + ": " + #S6 + " x " + $S6 + "z = " + @S6 + "z"; + +ACCS7: + if (#S7 < 1) goto ACCS8; + set @S7,#S7*$S7; + mes $S7N$ + ": " + #S7 + " x " + $S7 + "z = " + @S7 + "z"; + +ACCS8: + if (#S8 < 1) goto ACCS9; + set @S8,#S8*$S8; + mes $S8N$ + ": " + #S8 + " x " + $S8 + "z = " + @S8 + "z"; + +ACCS9: + if (#S9 < 1) goto ACCS10; + set @S9,#S9*$S9; + mes $S9N$ + ": " + #S9 + " x " + $S9 + "z = " + @S9 + "z"; + +ACCS10: + if (#S10 < 1) goto ACCS11; + set @S10,#S10*$S10; + mes $S10N$ + ": " + #S10 + " x " + $S10 + "z = " + @S10 + "z"; + + // Total // +ACCS11: + set @total,@S1 + @S2 + @S3 + @S4 + @S5 + @S6 + @S7 + @S8 + @S9 + @S10; + mes "Total value: "+@total+"z"; + next; + goto S_Start; + + + // GM MENU // +GM_Menu: + mes "[Stock Market]"; + mes "Master, do you require anything?"; + menu "Fluctuate Market",S_Fluc,"Reset Prices",GM_Open,"Nothing",S_Start; + +S_Fluc: + set $fluc,rand (-6,6); + set $S1B,$S1; + set $S1,$S1+$fluc; + if ($S1 < 25) set $S1,$S1+3; + if ($S1 < 50) set $S1,$S1+2; + if ($S1 > 150) set $S1,$S1-2; + if ($S1 > 175) set $S1,$S1-3; + if ($S1 < 1) set $S1,1; + + set $fluc,rand (-6,6); + set $S2B,$S2; + set $S2,$S2+$fluc; + if ($S2 < 25) set $S2,$S2+3; + if ($S2 < 50) set $S2,$S2+2; + if ($S2 > 150) set $S2,$S2-2; + if ($S2 > 175) set $S2,$S2-3; + if ($S2 < 2) set $S2,1; + + set $fluc,rand (-6,6); + set $S3B,$S3; + set $S3,$S3+$fluc; + if ($S3 < 25) set $S3,$S3+3; + if ($S3 < 50) set $S3,$S3+2; + if ($S3 > 150) set $S3,$S3-2; + if ($S3 > 175) set $S3,$S3-3; + if ($S3 < 1) set $S3,1; + + set $fluc,rand (-6,6); + set $S4B,$S4; + set $S4,$S4+$fluc; + if ($S4 < 25) set $S4,$S4+3; + if ($S4 < 50) set $S4,$S4+2; + if ($S4 > 150) set $S4,$S4-2; + if ($S4 > 175) set $S4,$S4-3; + if ($S4 < 1) set $S4,1; + + set $fluc,rand (-6,6); + set $S5B,$S5; + set $S5,$S5+$fluc; + if ($S5 < 25) set $S5,$S5+3; + if ($S5 < 50) set $S5,$S5+2; + if ($S5 > 150) set $S5,$S5-2; + if ($S5 > 175) set $S5,$S5-3; + if ($S5 < 1) set $S5,1; + + set $fluc,rand (-6,6); + set $S6B,$S6; + set $S6,$S6+$fluc; + if ($S6 < 25) set $S6,$S6+3; + if ($S6 < 50) set $S6,$S6+2; + if ($S6 > 150) set $S6,$S6-2; + if ($S6 > 175) set $S6,$S6-3; + if ($S6 < 1) set $S6,1; + + set $fluc,rand (-6,6); + set $S7B,$S7; + set $S7,$S7+$fluc; + if ($S7 < 25) set $S7,$S7+3; + if ($S7 < 50) set $S7,$S7+2; + if ($S7 > 150) set $S7,$S7-2; + if ($S7 > 175) set $S7,$S7-3; + if ($S7 < 1) set $S7,1; + + set $fluc,rand (-6,6); + set $S8B,$S8; + set $S8,$S8+$fluc; + if ($S8 < 25) set $S8,$S8+3; + if ($S8 < 50) set $S8,$S8+2; + if ($S8 > 150) set $S8,$S8-2; + if ($S8 > 175) set $S8,$S8-3; + if ($S8 < 1) set $S8,1; + + set $fluc,rand (-6,6); + set $S9B,$S9; + set $S9,$S9+$fluc; + if ($S9 < 25) set $S9,$S9+3; + if ($S9 < 50) set $S9,$S9+2; + if ($S9 > 150) set $S9,$S9-2; + if ($S9 > 175) set $S9,$S9-3; + if ($S9 < 1) set $S9,1; + + set $fluc,rand (-6,6); + set $S10B,$S10; + set $S10,$S10+$fluc; + if ($S10 < 25) set $S10,$S10+3; + if ($S10 < 50) set $S10,$S10+2; + if ($S10 > 150) set $S10,$S10-2; + if ($S10 > 175) set $S10,$S10-3; + if ($S10 < 1) set $S10,1; + + set $S_LastUpd$,"GM Fluctuation"; + mes "Market fluctuated."; + close; + +GM_Open: + menu "Set prices to...",GM_Set,"Cancel",-; + mes "Farewell."; + close; + +GM_Set: + mes "Are you sure you want to reset?"; + mes "^FF0000All share values will become the same.^000000"; + next; + menu "Yes",-,"No",GM_Menu; + set @gmset,0; + input @gmset; + set $S1,@gmset; + set $S2,@gmset; + set $S3,@gmset; + set $S4,@gmset; + set $S5,@gmset; + set $S6,@gmset; + set $S7,@gmset; + set $S8,@gmset; + set $S9,@gmset; + set $S10,@gmset; + set $S1B,@gmset; + set $S2B,@gmset; + set $S3B,@gmset; + set $S4B,@gmset; + set $S5B,@gmset; + set $S6B,@gmset; + set $S7B,@gmset; + set $S8B,@gmset; + set $S9B,@gmset; + set $S10B,@gmset; + mes "All prices changed to " + @gmset + "z."; + close; + +S_Quit: + mes "[Stock Market]"; + mes "Goodbye."; + close; +} diff --git a/npc/custom/events/cluckers.txt b/npc/custom/events/cluckers.txt new file mode 100644 index 000000000..bc9899488 --- /dev/null +++ b/npc/custom/events/cluckers.txt @@ -0,0 +1,115 @@ +//===== rAthena Script ======================================= +//= Cluck! Cluck! Boom! +//===== By: ================================================== +//= Keale +//===== Current Version: ===================================== +//= 1.2a +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Click the chicken and try retrieve the item at a low +//= chance. If you fail he will nuke, freeze, stone, +//= stun, or make you fall asleep. +//= The prize is configurable and triggered by the NPC. +//===== Additional Comments: ================================= +//= 1.0 First release. +//= 1.1 Using 'switch rand' instead. +//= 1.2 Cleaned and standardized. [Euphy] +//= 1.2a Switched 'atcommand' to 'unitskilluseid'. +//============================================================ + +prontera,156,219,4 script Cluckers 800,{ + + set .@GMAccess,80; // GM level required to access NPC + + if (.startcluck) { + specialeffect2 2; + switch(rand(15)) { + case 0: npctalk "CLUUUUUUCK!!!"; unitskilluseid getcharid(3),"NPC_SELFDESTRUCTION",1; emotion 23; break; + case 1: npctalk "Cluuuuuck!~"; break; + case 2: unitskilluseid getcharid(3),"NPC_SELFDESTRUCTION",1; break; + case 3: sc_start SC_Freeze,10000,0; break; + case 4: npctalk "CLUUUUUUUUUCK!!!"; unitskilluseid getcharid(3),"NPC_SELFDESTRUCTION",1; emotion 23; break; + case 5: sc_start SC_Sleep,10000,0; break; + case 6: sc_start SC_Stone,10000,0; emotion 29; break; + case 7: npctalk "CLUUUUUUCK!!!"; unitskilluseid getcharid(3),"NPC_SELFDESTRUCTION",1; emotion 23; break; + case 8: npctalk "Cluck! CLUUUCK!!"; unitskilluseid getcharid(3),"NPC_SELFDESTRUCTION",1; emotion 23; break; + case 9: sc_start SC_Stun,10000,0; break; + case 10: sc_start SC_Sleep,10000,0; emotion 29; break; + case 11: npctalk "Cluck! Cluck!"; break; + case 12: sc_start SC_Stun,10000,0; break; + case 13: unitskilluseid getcharid(3),"NPC_SELFDESTRUCTION",1; break; + default: + if (rand(50) < 4) { + npctalk "WOOF!..........."; + specialeffect2 72; + announce "[Cluck! Cluck! Boom!] " + strcharinfo(0) + " squeezed out the prize! Well done!",0; + getitem $cluck_item_id,$cluck_item_amount; + set .startcluck,0; + } else { + npctalk "Cluck! CLUUUCK!!"; + unitskilluseid getcharid(3),"NPC_SELFDESTRUCTION",1; + } + break; + } + end; + } + mes "[Cluckers]"; + if (getgmlevel() >= .@GMAccess) { + mes "Cluck cluck! Cluuuuuck? ^FF0000~Hi GM " + strcharinfo(0) + ", Wanna play today?~^000000"; + mes "Cluck cluck... CLUCK! ^FF0000~Just tell me what to do!~^000000"; + next; + while(1) switch(select("Start Event:Check Prize:Set Prize:Not today Cluckers")) { + case 1: + mes "[Cluckers]"; + mes "CLUCK! ^FF0000~Sure thing!~^000000"; + emotion 33; + close2; + announce "[Cluck! Cluck! Boom!] is about to start in Prontera!",bc_blue; + initnpctimer; + end; + case 2: + mes "[Cluckers]"; + mes "Cluck, cluck cluck... Cluck! ^FF0000~The current prize is^000000 ^008000"+ $cluck_item_amount +" "+ getitemname($cluck_item_id) +".^000000"; + next; + break; + case 3: + mes "[Cluckers]"; + mes "Cluck cluck? Cluck??? ^FF0000~What should the prize for winning be? Please input the ID.~^000000"; + input $cluck_item_id; + next; + mes "[Cluckers]"; + mes "Cluck? cluuuck? ^FF0000~How many if this item should I give away?~^000000"; + input $cluck_item_amount; + next; + mes "[Cluckers]"; + mes "Cluck cluck..? Cluck. ^FF0000~So, the prize is^000000 ^008000"+ $cluck_item_amount +" "+ getitemname($cluck_item_id) +"^000000? ^FF0000Great.~^000000"; + emotion 33; + next; + break; + case 4: + mes "[Cluckers]"; + mes "Cluck cluck cluck..."; + close; + } + } + mes "Cluck cluck! Cluuuuuck?"; + mes "Cluck...."; + close; + +OnTimer10000: + announce "Please hurry behind the fountain if you want to play with the crazy chicken!",bc_blue; + end; +OnTimer20000: + announce "Cluckers has eaten one of my items! I'm too scared to retrieve it!",bc_blue; + end; +OnTimer30000: + announce "Click the insane chicken and try squeeze out the item, if you're lucky you'll win! Are you ready?",bc_blue; + end; +OnTimer40000: + announce "GO! Click the chicken to get the prize!",bc_blue; + if (!$cluck_item_id) set $cluck_item_id,512; + if (!$cluck_item_amount) set $cluck_item_amount,1; + set .startcluck,1; + end; +} diff --git a/npc/custom/events/disguise.txt b/npc/custom/events/disguise.txt new file mode 100644 index 000000000..a3113a288 --- /dev/null +++ b/npc/custom/events/disguise.txt @@ -0,0 +1,245 @@ +//===== rAthena Script ======================================= +//= Disguise Event +//===== By: ================================================== +//= GmOcean +//===== Current Version: ===================================== +//= 5.1 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Additional Comments: ================================= +//= Note: This script requires PCRE to run properly. +//= 5.0 Last update by GmOcean. +//= 5.1 Cleaned and standardized, mostly. [Euphy] +//============================================================ + +prontera,160,155,4 script Disguise Event 795,{ + + // Currently set to run every two hours. + // To change times, edit the OnClock labels below. + + set .@GMLevel,60; // GM level required to access NPC. + set .@n$,"[^0000FFDisguise NPC^000000]"; + + if (getgmlevel()>=.@GMLevel) { + mes .@n$; + mes "Select an option."; + next; + switch(select("Turn ON/OFF Event:Event Settings")) { + case 1: + mes .@n$; + if (.EventON) { + mes "The Event is currently: [^0000FFON^000000]"; + mes "Would you like to turn it OFF?"; + } else { + mes "The Event is currently: [^FF0000OFF^000000]"; + mes "Would you like to turn it ON?"; + } + if(select("Yes:No")==2) close; + if (.EventON) { + set .EventON,0; set .Timer,0; + setnpctimer 0; stopnpctimer; + announce "A GM has decided to turn the Disguise Event off. As a result no further prizes will be given.",bc_map | bc_blue; + deletepset 1; + setnpcdisplay "Disguise Event",795; + close; + } + set .EventON,1; set .Timer,1; setnpctimer 0; initnpctimer; + set .ResetCounter,.ResetCounter+1; + announce "The Disguise Event will begin in 3 minutes.",bc_all | bc_blue; + announce "The Event is being held in Prontera.",bc_all | bc_blue; + close; + case 2: + mes .@n$; + mes "Pick a setting to modify."; + next; + switch(select("Monster Display:Number of Rounds:Prize Settings")) { + case 1: + setarray .@r$[0],"Disguise as all monsters.","Disguise as MVPs only."; + mes .@n$; + mes "Choose a disguise rule."; + next; + set .Rule, select(implode(.@r$,":")); + mes .@n$; + mes "The Disguise Rule has been set:"; + mes " > ^0055FF"+.@r$[.Rule-1]+"^000000"; + close; + case 2: + mes .@n$; + mes "Input the number of rounds you want the event to last."; + mes "Current number: [^0000FF"+.Rounds+"^000000]"; + next; + input .@Rounds; + set .Rounds,.@Rounds; + mes .@n$; + mes "The number of rounds has been changed to "+.Rounds+"."; + close; + case 3: + mes .@n$; + mes "Input the Item ID of the prize given each round."; + mes "Current item: [^0000FF"+getitemname(.Prize)+"^000000] (ID #"+.Prize+")"; + next; + input .@Prize; + mes .@n$; + if (getitemname(.@Prize)=="" || getitemname(.@Prize)=="null") { + mes "That item does not exist. Please try again."; + close; + } + set .Prize,.@Prize; + mes "Input the amount to be given."; + next; + input .@amount; + mes .@n$; + if (.@amount<=0 || .@amount>=10000) { + mes "That amount is invalid. Using default ammount of 1."; + set .@amount,1; + next; + mes .@n$; + } + set .PrizeAmt,.@amount; + mes "The Prize has been changed successfully."; + mes "Prize: "+.PrizeAmt+"x [^0000FF"+getitemname(.Prize)+"^000000]"; + close; + } + } + } + if (.EventON) end; + mes .@n$; + mes "Welcome."; + mes "How may I be of assistance?"; + if(select("Information:Nothing, just passing through.")==2) close; + next; + mes .@n$; + mes "This event is quite simple."; + mes "At the start of the event, I will"; + mes "disguise myself as a random"; + mes "monster. You have to shout"; + mes "that monter's name out loud."; + next; + mes "If you are correct, you will receive"; + mes "a prize. If not, keep trying!"; + mes "That's all that there is to this event."; + close; + +OnInit: + set .EventON,0; + set .Wait,0; + set .Winner,0; + set .ResetCounter,0; + set .Rounds,10; + set .Prize,512; + set .PrizeAmt,1; + set .Rule,1; + setarray .MVP[0],1038,1039,1046,1059,1086,1087,1112,1115,1147,1150,1157,1159,1190,1251,1252,1272,1312,1373, + 1389,1399,1418,1492,1502,1511,1583,1623,1630,1646,1647,1648,1649,1650,1651,1658,1685,1688, + 1708,1719,1734,1751,1768,1779,1785,1802,1832,1871,1874,1885,1917,1980,2022,2068,2087,2131, + 2156,2165; + set .BlackList$, "1003,1006,1017,1021,1022,1027,1043,1075,1136,1137,1168," + + "1171,1172,1173,1181,1187,1210,1217,1218,1222,1223,1224,1225,1226,1227,1228," + + "1233,1284,1407,1411,1414,1495,1501,1900,1996,2000,2001,2002,2003,2004," + + "2005,2006,2007,2011,2012,2025,2028,2029,2030,2031,2032,2033,2034,2035," + + "2036,2037,2038,2039,2040,2041,2042,2043,2044,2045,2046,2047,2048,2049," + + "2050,2051,2052,2053,2054,2055,2056,2057,2058,2059,2060,2061,2062,2063," + + "2064,2065,2066,2067,2075,2076,2077,2078,2079,2080,2081,2083,2084,2085," + + "2086,2087,2088,2089,2090,2091,2092,2093,2094,2095,2096,2097,2098,2099," + + "2100,2101,2012,2103,2104,2105,2106,2107,2108,2109,2110,2111,2112,2113," + + "2114,2115,2116,2117,2118,2119,2120,2121,2123,2124,2125,1496,"; + end; +OnClock0000: +OnClock0200: +OnClock0400: +OnClock0600: +OnClock0800: +OnClock1000: +OnClock1200: +OnClock1400: +OnClock1600: +OnClock1800: +OnClock2000: +OnClock2200: + set .ResetCounter,.ResetCounter+1; + set .EventON,1; + set .Timer,1; + set .Wait,1; + announce "The Disguise Event will begin in 3 minutes.",bc_all | bc_blue; + announce "The Event is being held in Prontera.",bc_all | bc_blue; + setnpctimer 0; + initnpctimer; + end; +OnTimer10000: + if (.Timer || .Change) end; + set .Wait,0; + goto iDisguise; + end; +OnTimer30000: + if (.Timer) end; + set .Change,0; + setnpcdisplay "Disguise Event",795; + npctalk "You took too long to guess what I was. Please wait 10 seconds while I disguise again."; + specialeffect 725; + set $MonsterName$,""; + deletepset 1; + stopnpctimer; + setnpctimer 0; + initnpctimer; + end; +OnTimer60000: + if (.Timer!=1) end; + announce "The Disguise Event will begin in 2 minutes.",bc_all | bc_blue; + announce "The Event is being held in Prontera.",bc_all | bc_blue; + end; +OnTimer120000: + if (.Timer!=1) end; + announce "The Disguise Event will begin 1 minute.",bc_all | bc_blue; + announce "The Event is being held in Prontera.",bc_all | bc_blue; + end; +OnTimer180000: + if (.Timer!=1) end; + announce "The Disguise Event has begun!",bc_all | bc_blue; + announce "The Event is being held in Prontera.",bc_all | bc_blue; + set .Timer,0; stopnpctimer; + setnpctimer 0; initnpctimer; +iDisguise: + if (.Rule==1) { + set .Winner,0; + set .Monster,1000+rand(1,995); + if (compare(","+.BlackList$+"," , ","+.Monster+",")) goto iDisguise; + if (.Monster==.LastMonster) goto iDisguise; + set .LastMonster,.Monster; + set $MonsterName$,getmonsterinfo(.Monster,0); + } + if (.Rule==2) { + set .Winner,0; + set .Monster,rand(49); + set $MonsterName$,getmonsterinfo(.MVP[.Monster],0); + } + deletepset 1; + defpattern 1,"([^:]+):.\\s*"+$MonsterName$+".*", "iCorrect"; + activatepset 1; + if (.Rule==1) setnpcdisplay "Disguise Event",.Monster; + if (.Rule==2) setnpcdisplay "Disguise Event",.MVP[.Monster]; + set .Change,1; + setnpctimer 0; + end; +iCorrect: + if (.Winner) { + dispbottom "Someone has already won this round."; + end; + } + set .Winner,1; + set .RoundCount,.RoundCount+1; + deletepset 1; + activatepset 1; + getitem .Prize,.PrizeAmt; + announce strcharinfo(0)+" is correct! I was disguised as: "+$MonsterName$+"",bc_map | bc_blue; + if (.RoundCount>=.Rounds) { + setnpcdisplay "Disguise Event",795; + set .RoundCount,0; set .Change,0; set .EventON,0; + setnpctimer 0; stopnpctimer; + npctalk "Thank you all for playing. That was the last round of the Disguise Event. Come play again later."; + end; + } + setnpcdisplay "Disguise Event",795; + set .Change,0; + setnpctimer 0; + end; +} diff --git a/npc/custom/events/hallow06.txt b/npc/custom/events/hallow06.txt new file mode 100644 index 000000000..57c4ebdf6 --- /dev/null +++ b/npc/custom/events/hallow06.txt @@ -0,0 +1,124 @@ +//===== rAthena Script ======================================= +//= Custom Halloween Event 2006 +//===== By: ================================================== +//= Stryker +//===== Current Version: ===================================== +//= 1.2 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Halloween Event Script +//===== Additional Comments: ================================= +//= 1.1 - Added trick to script +//= 1.2 fixed bugs, optimized. Now uses 1 var instead of 3 [Lupus] +//============================================================ + +prontera,151,190,5 script Hallows' Eve Event 807,{ + mes "[Hallows' Eve Event]"; + if(Class == Job_Novice){ + mes "I am sorry but you have to got a job to complete the event."; + emotion e_swt,1; + close; + } + if(EVENT_HALWN06&1 && EVENT_HALWN06&2){ + mes "I am sorry but you have already completed the event."; + emotion e_sry; + close; + } + mes "Greetings fellow lively human."; + next; + mes "[Hallows' Eve Event]"; + mes "Halloween is upon us and it is almost time to adventure out into places few dare go."; + next; + mes "[Hallows' Eve Event]"; + mes "Trick or treat, which do you prefer?"; + next; + menu "Trick",-, "Treat",L_Treat; + + mes "[Hallows' Eve Event]"; + if(EVENT_HALWN06&2){ + mes "I'm sorry but you have already had a trick. Why don't you go pick a treat now."; + emotion e_sry; + close; + } + mes "Give me a min..."; + next; + set BaseExp,BaseExp+BaseLevel*1000; + set EVENT_HALWN06,EVENT_HALWN06|2; + + mes "[Hallows' Eve Event]"; + mes "Here is your treat. Your Base EXP has been slightly increased."; + next; + mes "[Hallows' Eve Event]"; + mes "I hope you enjoy your trick and Happy Halloween!"; + close; + +L_Treat: + mes "[Hallows' Eve Event]"; + if(EVENT_HALWN06&1){ + mes "I'm sorry but you have already had a treat. Why don't you go pick a trick now."; + emotion e_sry; + close; + } + if(!(EVENT_HALWN06&4)){ + mes "Great! This shall be so much fun."; + next; + mes "[Hallows' Eve Event]"; + mes "I will be sending you on a scavenger hunt for items."; + next; + mes "[Hallows' Eve Event]"; + mes "Bring back all the necessary items, and I will create you a treat."; + next; + mes "[Hallows' Eve Event]"; + mes "Not just any normal treat either that you can eat, but it is something you can wear on your head."; + next; + mes "[Hallows' Eve Event]"; + mes "But with all things made, some items are required first."; + mes "The list:"; + mes "1 Hat,"; + mes "30 Pumpkin, and"; + mes "20 Black Piece of Cloth"; + next; + mes "[Hallows' Eve Event]"; + mes "Hurry along now."; + set EVENT_HALWN06,EVENT_HALWN06|4; + close; + } + mes "Did you get the items I requested or do you need to see the list again?"; + next; + menu "Got'em",-, "Don't Have",L_Dont_Have, "See List",L_List; + + mes "[Hallows' Eve Event]"; + if((countitem(2220) < 1) || (countitem(535) < 30) || (countitem(7205) < 20)){ + mes "You don't have enough items. Come back when you do."; + emotion e_sry; + close; + } + delitem 2220,1; + delitem 535,30; + delitem 7205,20; + getitem 5134,1; + set EVENT_HALWN06,EVENT_HALWN06|1; + mes "Good job! I hope you are happy with your item."; + emotion e_grat; + next; + mes "[Hallows' Eve Event]"; + mes "Enjoy the rest of your halloween."; + emotion e_scissors,1; + close; + +L_Dont_Have: + mes "[Hallows' Eve Event]"; + mes "Go back out and search for them. Would you like to view the list?"; + next; + menu "No",-, "Yes",L_List; + close; + +L_List: + mes "[Hallows' Eve Event]"; + mes "I require the following items:"; + mes "1 Hat,"; + mes "30 Pumpkin, and"; + mes "20 Black Piece of Cloth."; + close; +} diff --git a/npc/custom/events/mushroom_event.txt b/npc/custom/events/mushroom_event.txt new file mode 100644 index 000000000..9ebd3211a --- /dev/null +++ b/npc/custom/events/mushroom_event.txt @@ -0,0 +1,62 @@ +//===== rAthena Script ======================================= +//= Find the Mushroom +//===== By: ================================================== +//= Mysterious +//===== Current Version: ===================================== +//= 3.6a +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Find the Mushroom - random amount of Mushrooms spawns in random maps. +//= Players need to find these mushrooms and kill them to gain prizes! +//===== Additional Comments: ================================= +//= 3.0 Fully Functional with Rewritten script. [Mysterious] +//= 3.6a Slightly edited. [Euphy] +//============================================================ + +prontera,142,228,6 script Find the Mushroom 1084,{ + mes "[ Find The Mushroom ]"; + if (!.Status) + mes "There is no event at the moment!"; + else { + mes "There are "+.Spawn+" Mushrooms left in "+.Map$+"!"; + mes "Find and kill the mushrooms to gain "+getitemname(.Prize)+"!"; + } + if (.Status || getgmlevel() < .GM) close; + mes "Start the event?"; + next; + if(select("- No:- Yes") == 1) close; + donpcevent strnpcinfo(0)+"::OnMinute10"; + mes "[ Find The Mushroom ]"; + mes "Event started!"; + close; + +OnInit: + set .Prize,512; // Reward item ID + set .Amount,10; // Reward item amount + set .GM,60; // GM level required to access NPC + setarray .Maps$[0],"izlude","geffen","morocc","prontera"; // Possible maps + end; + +OnMinute10: // Start time (every hour) + if (.Status) end; + set .Status,1; + set .Spawn,rand(1,10); // How many Mushrooms should spawn? + set .Map$,.Maps$[rand(getarraysize(.Maps$))]; + killmonster .Map$,"All"; + monster .Map$,0,0,"Please don't kill me!",1084,.Spawn,strnpcinfo(0)+"::OnMobKilled"; + announce "Find the Mushroom : Total of "+.Spawn+" Mushrooms have been spawned in "+.Map$+"!",0; + sleep 2500; + announce "Find the Mushroom : Every Mushroom you kill will give you "+getitemname(.Prize)+"!",0; + end; + +OnMobKilled: + set .Spawn, .Spawn - 1; + getitem .Prize, .Amount; + if (.Spawn) announce "[ "+strcharinfo(0)+" ] has killed a Mushroom. There are now "+.Spawn+" Mushroom(s) left.",bc_map; + else { + announce "The Find the Mushroom Event has ended. All the Mushrooms have been killed.",0; + set .Status,0; + } + end; +} diff --git a/npc/custom/events/uneasy_cemetery.txt b/npc/custom/events/uneasy_cemetery.txt new file mode 100644 index 000000000..60d569483 --- /dev/null +++ b/npc/custom/events/uneasy_cemetery.txt @@ -0,0 +1,133 @@ +//===== rAthena Script ======================================= +//= Uneasy Prontera Cemetery Quest +//===== By: ================================================== +//= Lupus +//===== Current Version: ===================================== +//= 1.2a (Tested and fully working!) +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= A periodical quest of the Uneasy Cemetery (Kill undead / Prevent their appearance) +//= Every day, at the midnight Prontera receive a wave of Undeads. +//= They come from Uneasy Cemetery of Prontera. To protect the players +//= from the undeads terror you may either kill the enemy. Or supply Mother Mathana +//= with needed amount of Holy Water. Every citizen can take his part in the +//= saving of Prontera city. After some days of quiet life... the Cemetery strikes back. +//===== Additional Comments: ================================= +//= 1.1 More advanced ver. Added some bonus the the one who'd kill the last walking undead +//= 1.2 Added coords to the script to make label OmMobDead working +//= 1.2a Changed item names to item IDs. [Samuray22] +//============================================================ + +prontera,3,3,3 script Uneasy_Check -1,{ + end; + +OnHour00: + set $UNEASY_DL,$UNEASY_DL-1; + set $UNEASY_BL,$UNEASY_BL+30; //add need of HW for 30 bottles per day + if ($UNEASY_BL>666) set $UNEASY_BL,666; //keep needed bottles not <=666 + if ($UNEASY_DL < 0) goto L_Start_Undead; +//The Cemetery is OK yet. + disablenpc "Mother Mathana"; + end; +OnInit: + if ($UNEASY_DL >= 0) disablenpc "Mother Mathana"; + end; + +OnHour06: + killmonsterall "prontera"; //The Sun kills undead in the morning + end; + +OnHour01: + if ($@UNEASY_MOB > 0) mapannounce "prontera","[Mother Mathana]: In the name of Odin, please finish these roaming undead leftovers!",0; + end; + +OnZombieDead: + set $@UNEASY_MOB,$@UNEASY_MOB-1; + if ($@UNEASY_MOB>0) end; + set $UNEASY_DL,0; + set $UNEASY_H$,strcharinfo(0); + if (Sex==1) mapannounce "prontera","[Mother Mathana]: Brave "+$UNEASY_H$+" has just killed the last undead in Prontera!",0; + if (Sex==0) mapannounce "prontera","[Mother Mathana]: Lady "+$UNEASY_H$+" has just killed the last undead in Prontera!",0; + set JobExp,JobExp+100; + set BaseExp,BaseExp+50; + end; + +L_Start_Undead: + killmonsterall "prontera"; //kills any left monsters + enablenpc "Mother Mathana"; +//call some monsters in the city + set $@UNEASY_MOB, 65; + areamonster "prontera",0,0,0,0,"Zombie",1015,30,"Uneasy_Check::OnZombieDead"; +//in the Cemetery + monster "prontera",268,349,"Zombie",1015,30,"Uneasy_Check::OnZombieDead"; + monster "prontera",269,350,"Ghoul",1036,5,"Uneasy_Check::OnZombieDead"; +//announce + mapannounce "prontera","[Mother Mathana]: The cememtery has become restless! In the name of Odin, hurry to the Sanctuary! Save the city of Prontera!",0; +} + +prontera,257,313,5 script Mother Mathana 79,{ + mes "[Mother Mathana]"; + if ($UNEASY_DL <= 0) goto L_Undead_Walk; + mes "I'm afraid there's something wrong with our old cemetery..."; + if ($UNEASY_H$==strcharinfo(0)) mes "But thanks to you, "+$UNEASY_H$+", we'll be able to sleep " + $UNEASY_DL + " nights!"; + if ($UNEASY_H$!=strcharinfo(0)) mes "But thanks to "+$UNEASY_H$+"'s support, we've got " + $UNEASY_DL + " easy nights!"; + emotion 0; + close; + +L_Undead_Walk: + if ($UNEASY_DL == 0) mes "THEY could return tomorrow's night again!"; + if ($UNEASY_DL == 0 && $UNEASY_H$==strcharinfo(0)) mes "Thank you, "+$UNEASY_H$+"! Now we'll manage to rest till the next midnight!"; + if ($UNEASY_DL == 0 && $UNEASY_H$!=strcharinfo(0)) mes "But due to "+$UNEASY_H$+"'s help we'll manage to rest till the next midnight!"; + mes "To calm down the restless cemetery, we should pour all these graves with the Holy Water. But our sisters and broters have run out of it."; + mes "Could you supply us with Holy Water?"; + next; + menu "Yes, have all my Holy Water!",-, "Nope, I need it.",M_NO, "I don't have any.",M_DONT_HAVE; + + if ( countitem(523)<1 ) goto M_DONT_HAVE; + set $UNEASY_BL,$UNEASY_BL-countitem(523); + delitem 523,countitem(523); + + if ( $UNEASY_BL > 0 ) goto L_NEED_MORE; +//set quiet days!!! no more undead for this period! + set $UNEASY_DL,5+((0-$UNEASY_BL)/30); + set $UNEASY_H$,strcharinfo(0); + mes "[Mother Mathana]"; + mes "Thank you, "+$UNEASY_H$+"! Now we've got enough Holy Water!"; + next; + mes "[Mother Mathana]"; + mes "Upon pouring the cemetery with that water we'll get " + $UNEASY_DL + " safe nights!"; + next; + killmonsterall "prontera"; //kills any left monsters + mes "[Mother Mathana]"; + mes "See, "+ $UNEASY_H$ +"? They all are gone now!"; + next; + mes "[Mother Mathana]"; + mes "Our Church is going to thank you personally..."; + next; + if (Sex==1) mapannounce "prontera","[Mother Mathana]: In the name of Odin we declare handsom "+$UNEASY_H$+" as a Prontera savior!",0; + if (Sex==0) mapannounce "prontera","[Mother Mathana]: In the name of Odin we declare beautiful "+$UNEASY_H$+" as a Prontera savior!",0; + mes "[Mother Mathana]"; + mes "In the name of Odin we bless you and decently present a modest gift just from Mareusis' wine-cellar."; + getitem 505,1; //Blue_Potion + set JobExp,JobExp+100; + set BaseExp,BaseExp+50; + close; + +L_NEED_MORE: + mes "[Mother Mathana]"; + mes "Thank you, good "+strcharinfo(0)+", but we still need " + $UNEASY_BL + " more Holy Water bottles."; + close; + +M_NO: + mes "[Mother Mathana]"; + mes "I'm afraid the old cemetery is going out of control soon... Please, get us all the Holy Water you can get."; + close; + +M_DONT_HAVE: + mes "[Mother Mathana]"; + mes "Alas! We still need " + $UNEASY_BL + " more bottles of Holy Water... Why don't you go and ask other people for some extra Holy Water?"; + mes "The old cemetery is going out of control soon..."; + mes "Please, in the name of Odin, help Prontera city."; + close; +} diff --git a/npc/custom/events/valentinesdayexp.txt b/npc/custom/events/valentinesdayexp.txt new file mode 100644 index 000000000..509b25f71 --- /dev/null +++ b/npc/custom/events/valentinesdayexp.txt @@ -0,0 +1,285 @@ +//===== rAthena Script ======================================= +//= Valentine Event Script + EXP bonus +//===== By: ================================================== +//= Lupus (based on Muad_Dib's work) +//===== Current Version: ===================================== +//= 1.1 +//===== Compatible With: ===================================== +//= rAthena SVN; 4500+ +//===== Description: ========================================= +// Close to other official stValentine event (added white chocolate) +// Custom: Handmade choco gives some EXP bonuses to married people +//===== Additional Comments: ================================= +//= WARNING!! To use this event, disable original valentinesday.txt +//= You can use this event from 12 till 16 February 8) [Lupus] +//= 1.1 Removed Duplicates [Silent] +//============================================================ + +// Tine - Valentine Event Chocolate Even Guide ------------------ +prontera,156,172,4 script Tine 58,{ +// Debug info for item effects and tricky conditions 8) +// mes "@dsv: "+@dsv; +// mes "ispartneron()=="+ispartneron(); +// mes "sex == "+sex; +// if(@dsv == gettime(3)+1) mes "@dsv == gettime(3)+1"; + + mes "[Tine]"; + mes "The legend says that on 14th February... on the Day of Saint Valentine..."; + mes "Only in Run-Midgard kingdom..."; + next; + specialeffect 417; + mes "[Tine]"; + mes "Some married chocolate lovers almost double their experience at trainings!"; + mes "But everything isn't so simply..."; + next; + menu "Wow! Tell me more!",M_INFO,"Marri... what?",-; + + mes "[Tine]"; + mes "Are you a single?"; + mes "Today is a great date to ask your beloved half for marriage!"; + next; + mes "[Tine]"; + mes "The Marriage fee is ridiculous low these days!"; + close; + +M_INFO: + mes "[Tine]"; + mes "The magic effect posesses only handmade chocolate from grand-grand-grand-whoever recipes!"; + next; + mes "[Tine]"; + mes "It being known that Black Handmade Chocolate works on married guys... And the White one on the married girls!"; + mes "If you lose your wedding ring... then alas, it won't work on you."; + next; + mes "[Tine]"; + mes "On having a Chocolate, you should put off your ring then... put it back... And if your partner is online, then magc would last till the next hour!"; + next; + mes "[Tine]"; + mes "Rumors bark that guys and gals have +50% EXP bonuses on FIVE different races of the monsters... Exluding bloody bosses, of course."; + next; + mes "[Tine]"; + mes "There's a fameous confectioner in the Castle of Prontera! He's the one you need."; + close; + +OnInit: + //559,Hand-made_Chocolate + setitemscript 559,"{ itemheal 50,50; if(sex==0 || @dsv == gettime(3)+1 || ispartneron()==0)end; set @dsv,gettime(3)+1; misceffect 113; }"; + //560,Hand-made_White_Chocolate + setitemscript 560,"{ itemheal 50,50; if(sex || @dsv == gettime(3)+1 || ispartneron()==0)end; set @dsv,gettime(3)+1; misceffect 113; }"; + + //2634,Wedding_Ring_M,Wedding Ring,5,,10,0,,0,,0,127918079,7,1,136,,0,0,0,{ skill 334,1; skill 335,1; skill 336,1; } + setitemscript 2634,"{ skill 334,1; skill 335,1; skill 336,1; if(@dsv == gettime(3)+1 && ispartneron()){ bonus2 bExpAddRace,5,50; bonus2 bExpAddRace,6,50; bonus2 bExpAddRace,7,50; bonus2 bExpAddRace,8,50; bonus2 bExpAddRace,1,50; } }"; + //2635,Wedding_Ring_F,Wedding Ring,5,,10,0,,0,,0,127918079,7,0,136,,0,0,0,{ skill 334,1; skill 335,1; skill 336,1; } + setitemscript 2635,"{ skill 334,1; skill 335,1; skill 336,1; if(@dsv == gettime(3)+1 && ispartneron()){ bonus2 bExpAddRace,0,50; bonus2 bExpAddRace,9,50; bonus2 bExpAddRace,2,50; bonus2 bExpAddRace,3,50; bonus2 bExpAddRace,4,50; } }"; + end; +} + +// Stephen - Valentine Event Chocolate seller ------------------ +alberta,26,243,4 script Stephen#val1 58,{ + mes "[Stephen]"; + mes "Guess what I've got?"; + mes "A tasty treat not easily found in Rune-Midgard...."; + next; + mes "[Stephen]"; + mes "Chocolate!"; + mes "That's right, don't you love chocolate.... I do."; + mes "And you are in luck, because I'm selling them for only 5,000 zeny a piece!"; + next; + menu "I want some chocolate!",M_CHOCO,"No thanks.",-; + + mes "[Stephen]"; + mes "You don't want any chocolate?"; + mes "I'm telling you! You'll regret it!"; + mes "You better get some now... you won't come across Chocolate like this ever again!"; + mes "Think it over and visit me again sometime."; + close; + +M_CHOCO: + mes "[Stephen]"; + mes "Hah!"; + mes "I knew it!"; + mes "But I can't sell you more then 5 at once....but, if you really need more...."; + mes "you can come back again."; + mes "So how many do you want?"; + next; + set @needmon,0; + input @flag_num; + if (@flag_num <= 0) goto L_NONE; + if (@flag_num > 5) goto L_ERR; + set @needmon,@flag_num*5000; + if (Zeny < @needmon) goto L_NOTENO; + set Zeny,Zeny - @needmon; + getitem 558,@flag_num; + mes "[Stephen]"; + mes "There you go!"; + mes "You can give that to someone as a gift, or enjoy it yourself!"; + mes "Mmm....sweet chocolate..."; + mes "Visit me anytime...!"; + close; + +L_ERR: + mes "[Stephen]"; + mes "I'm sorry but I can't give you that many."; +L_NONE: + close; + +L_NOTENO: + mes "[Stephen]"; + mes "I'm sorry but it seems you can't afford to buy these of me."; + close; +} + +// Jainie -- Gives information about Valentine Event ------------------------ +alberta,29,243,4 script Jainie#val1 53,{ + mes "[Jainie]"; + mes "You know what? The chocolate that my boyfriend sells are from me!"; + mes "I made them by myself. Now I need some Milk for my special White Chocolate."; + next; + mes "[Jainie]"; + mes "You know ... In cetain countries, there's a tradition of presenting chocolates to a person that you love..."; + mes "They call it ^3355FFValentine's Day^000000."; + next; + mes "[Jainie]"; + mes "So I gave him my delicious chocolate..."; + mes "And then he made me cook a lot more..."; + mes "And now he is selling them to everyone."; + mes "I guess he really enjoyed it."; + mes "But, I do feel good when people buy something I have made."; + next; + mes "[Jainie]"; + mes "It would be great if you bought some too..."; + mes "I will be making white chocolates for a while so..."; + next; + menu "I want some white chocolate!",M_CHOCO,"No thanks.",-; + + mes "[Jainie]"; + mes "You don't like white chocolate?"; + mes "Then buy some Stephen's black one!"; + close; + +M_CHOCO: + mes "[Jainie]"; + mes "I can't sell you more then 5 at once....but, if you really need more...."; + mes "you can come back again."; + mes "So how many do you want? 1 portion is 4500z + 1 Milk."; + next; + set @needmon,0; + input @flag_num; + if (@flag_num == 0) goto L_NONE; + if (@flag_num > 5) goto L_ERR; + set @needmon,@flag_num*4500; + if (Zeny < @needmon) goto L_NOTENO; + if (countitem(519) < @flag_num) goto L_NOMILK; + set Zeny,Zeny - @needmon; + delitem 519,@flag_num; + getitem 561,@flag_num; + mes "[Jainie]"; + mes "There you go!"; + mes "You can give that to someone as a gift, or enjoy it yourself!"; + mes "Mmm... sweet chocolate..."; + mes "Visit me anytime...!"; + close; + +L_ERR: + mes "[Jainie]"; + mes "I'm sorry but I can't give you that many."; +L_NONE: + close; + +L_NOTENO: + mes "[Jainie]"; + mes "I'm sorry but it seems you can't afford to buy these of me."; + close; + +L_NOMILK: + mes "[Jainie]"; + mes "You need "+@flag_num+" Milk for "+@flag_num+" portions of my special White Chocolate..."; + close; +} + +// Carl Orleans -- Valentine Event Chocolate maker ------------------ +prt_castle,54,34,4 script Carl Orleans#val1 47,{ + mes "[Carl Orleans]"; + mes "Yes? What can I cook for you?"; + next; + menu "Black handmade Chocolate, please",-,"I want a White handmade Chocolate...",M_WHITE,"I'm lost, sorry to bother you.",M_END; + + mes "[Carl Orleans]"; + mes "Well, I just might be able to fulfill your needs..."; + next; + if (countitem(558)<3) { + mes "[Carl Orleans]"; + mes "I'm sorry you do not have enough Chocolate Bars to do this."; + if(rand(2))mes "They say Stephen from Alberta used to sell good Chocolate."; + close; + } + delitem 558,3; + mes "[Carl Orleans]"; + mes "You got 3 pieces of pure chocolate I see."; + mes "Give them to me..."; + next; + mes "[Carl Orleans]"; + mes "Ok, now I will only create my special handmade chocolates if you promise to use it wisely."; + next; + mes "[Carl Orleans]"; + mes "....Hmmmmmm....."; + mes "Well..."; + next; + getitem 559,1; + mes "[Carl Orleans]"; + mes "Here."; + if(rand(2))close; + mes "I hope you give it to someone special, because its a special chocolate."; + mes "As you know... only I can create this."; + next; + mes "[Carl Orleans]"; + mes "Enjoy."; + close; + +M_WHITE: + mes "[Carl Orleans]"; + mes "Well, I just might be able to fulfill your needs..."; + next; + if (countitem(561)<3) { + mes "[Carl Orleans]"; + mes "I'm sorry you do not have enough White Chocolate Bars to do this."; + if(rand(2))mes "They say Jainie from Alberta used to sell good White Chocolate."; + close; + } + delitem 561,3; + mes "[Carl Orleans]"; + mes "You got 3 pieces of pure white chocolate I see."; + mes "Give them to me..."; + next; + mes "[Carl Orleans]"; + mes "Ok, now I will only create my special handmade chocolates if you promise to use it wisely."; + next; + mes "[Carl Orleans]"; + mes "....Hmmmmmm....."; + mes "Well..."; + next; + getitem 560,1; + mes "[Carl Orleans]"; + mes "Here."; + if(rand(2))close; + mes "I hope you give it to someone special, because its a special chocolate."; + mes "As you know... only I can create this."; + next; + mes "[Carl Orleans]"; + mes "Enjoy."; + close; + +M_END: + mes "[Carl Orleans]"; + mes "Oh.. well, if you want me to make some of my special handmade Chocolate...."; + mes "You will need to give me at least ^0000FF 3 Chocolates^000000 or ^0000FF 3 White Chocolates^000000."; + if(rand(2))close; + next; + mes "[Carl Orleans]"; + mes "That's right, only ^0000FF 3 Chocolates^000000 or ^0000FF 3 White Chocolates^000000."; + mes "Bring them to me and you'll get what you came for."; + if(rand(2))close; + next; + mes "[Carl Orleans]"; + mes "See You."; + close; +} diff --git a/npc/custom/events/xmas_rings_event.txt b/npc/custom/events/xmas_rings_event.txt new file mode 100644 index 000000000..1a52fd43a --- /dev/null +++ b/npc/custom/events/xmas_rings_event.txt @@ -0,0 +1,193 @@ +//===== rAthena Script ======================================= +//= Karachun Event (Xmas Rings Quest) +//===== By: ================================================== +//= Lupus (1.0) +//===== Current Version: ===================================== +//= 1.2 +//===== Compatible With: ===================================== +//= rAthena SVN; 4880+ (with 'setItemScript' command) +//===== Description: ========================================= +//= Custom event: Karachun (from 8 Dec till 8 Jan), X-Mas, HNY +//===== Additional Comments: ================================= +//= 1.0 Tested, fully working. 1.0a a few typos fix +//= 1.1 Readded Mdef +1 and Luk +1 to Santa's Hat [Lupus] +//= 1.2 Fixed double quotes not being escaped [brianluau] +//============================================================ + +prontera,156,174,4 script Snower 713,{ + mes "[Snower]"; + if(Q_XMSRINGS==2){ + mes "Oh.. is it true? You've helped my sis Sneewy? Thank you."; + }else if(Q_XMSRINGS==3){ + mes "Snoowy's sent me a bird with a message. She told me about your help..."; + mes "I'll tell you a secret of the magic rings."; + emotion e_no1; + next; + mes "[Snower]"; + mes "They have magic power only from 8 December till 8 January."; + next; + mes "[Snower]"; + mes "By the way, just put on Santa's Hat to discover their true power."; + next; + mes "[Snower]"; + mes "If you put on both rings their power would be doubled."; + mes "Have a nice day!"; + close; + }else{ + mes "Hi! Two my sisters and I are preparing gifts for the whole 3 holidays!"; + } + emotion e_sob; + next; + menu "Where are your sisters?",-, "What holidays?",M_PR,"What gifts?",M_WRAP,"May I help you?",M_QUEST; + + mes "[Snower]"; + mes "My younger sis Sneewy's left to some faraway land to prepare gifts for their poor children... I don't know where. You should ask my elder sis and her birdies."; + next; + mes "[Snower]"; + mes "My elder sis? Her name's Snoowy. She's sailed to some green island... She's talking about some gifts for dolphins or something..."; + close; + +M_PR: + mes "[Snower]"; + mes "The whole three holidays? Well they come one after another!"; + mes "^000080The Christmas^000000, ^FF0000Karachun^000000 and ^008000New Year Eve^000000!"; + next; + mes "[Snower]"; + mes "^FF0000Karachun^000000? Heh... This is an old pagans festival. They used to celebrate it before the appearance of HNY and XMas, you know."; + next; + goto M_QUEST; + +M_WRAP: + mes "[Snower]"; + mes "My sisters say that all the gifts should look the same way. Or else some children might fight for fancy ones!"; + next; + mes "[Snower]"; + mes "Would you like me to wrap your fancy gift boxes with a gray paper?"; + next; + menu "Wrap them, please!",-, "No, thanks.",M_QUEST; + + set @prizes, countitem(664)+countitem(665)+countitem(666)+countitem(667); + if( @prizes == 0){ + mes "[Snower]"; + mes "I don't see any gifts in fancy boxes on you..."; + if(countitem(644))mes "You've got only gray boxes."; + close; + } + delitem 664,countitem(664); + delitem 665,countitem(665); + delitem 666,countitem(666); + delitem 667,countitem(667); + getitem 644,@prizes; + + mes "[Snower]"; + mes "*shuffle* Here you go."; + next; + +M_QUEST: + mes "[Snower]"; + mes "I wish you find my sisters ASAP... They need help."; + if(Q_XMSRINGS==0) set Q_XMSRINGS,1; + close; + +OnInit: +//Santa's Hat + setitemscript 2236,"{ bonus bMdef,1; bonus bLuk,1; if(isequipped(2636,2637)){if(@xmr == gettime(2))end; set @xmr,gettime(2); misceffect 410; end;} if(isequipped(2636)){if(@xmr == gettime(2))end; set @xmr,gettime(2); misceffect 72;} if(isequipped(2637)){if(@xmr == gettime(2))end; set @xmr,gettime(2); misceffect 338;}}"; +//Gold Xmas Ring + setitemscript 2636,"{ bonus bLoseSPWhenUnequip,30; if(isequipped(2236)==0)end; if(getskilllv(\"AL_HEAL\")){skill \"TF_HIDING\",4+isequipped(2637);}else{skill \"AL_HEAL\",1+4*isequipped(2637);} }"; +//Silver Xmas Ring + setitemscript 2637,"{ bonus bDamageWhenUnequip,40; if(isequipped(2236)==0)end; if(getskilllv(\"AL_TELEPORT\")){skill \"MC_IDENTIFY\",1;}else{skill \"AL_TELEPORT\",1+isequipped(2636);} }"; + end; +} + +louyang,224,249,4 script Sneewy 717,{ + mes "[Sneewy]"; + if(Q_XMSRINGS==0){ + mes "Hi! I'm waithing for my sister's birdy with mail..."; + emotion e_sob; + close; + } + if(Q_XMSRINGS==1){ + mes "I wish I had 4 more gray Gift Boxes for native children..."; + emotion e_sob; + next; + mes "[Sneewy]"; + mes "Oh, hello. Has my brother Snower told you everything?"; + next; + menu "Here are your 4 Gift Boxes",-, "I don't know any Snowhatevers...",M_END; + + mes "[Sneewy]"; + if(countitem(644)<4){ + mes "Gimme 4 gifts for poor kids... Wait, you haven't got 4 of them!"; + emotion e_sry; + close; + } + set Q_XMSRINGS,2; + delitem 644,4; + getnameditem 2637,strcharinfo(0); + emotion e_kis2; + mes "Thank you! Here's my li'l something for you!"; + next; + mes "[Sneewy]"; + mes "By the way, if you put on 2 different rings then your holidays leveling would be easier!"; + close; + } + emotion e_thx; + mes "Thanks again! No children will meet the holidays without the gifts!"; + close; + +M_END: + mes "[Sneewy]"; + mes "Pity... I've got a magic Santa's ring... I'd exchange it for 4 Gift Boxes..."; + emotion e_swt; + close; +} + +izlu2dun,133,160,2 script Snoowy 714,{ + mes "[Snoowy]"; + if(Q_XMSRINGS==0){ + mes "Helloooou! Do you know my bro and sis? How so? My brother Snower's well known in Prontera!! Just ask any child there."; + emotion e_hmm; + close; + } + if(Q_XMSRINGS==1){ + mes "Darn... How could poor children be more important than the marine folks.. Am I wrong?"; + next; + mes "[Snoowy]"; + mes "Errr. Helloou there. My sister Sneewy's sent me a birdie message. The letter was wet and I couldn't read anything but some ending letters of her address..."; + next; + mes "[Snoowy]"; + mes "Look, it's something like 'yang' in the very end... Hmm... She must be misspelled 'Al Doo Boryang'..."; + close; + } + if(Q_XMSRINGS==2){ + mes "You've helped my sis? It's just great!"; + next; + mes "[Snoowy]"; + mes "But I too need 3 more gifts for my marine folk friends..."; + next; + menu "Have these gifts!",-, "I need a li'l something in return",M_END; + + mes "[Snoowy]"; + if(countitem(644)<3){ + mes "Oops!! You haven't got 3 gray gift boxes on you."; + emotion e_sry; + close; + } + set Q_XMSRINGS,3; + delitem 644,3; + getnameditem 2636,strcharinfo(0); + emotion e_kis; + mes "Thaank yoouu! Have this magic ring!"; + close; + } + emotion e_thx; + mes "Oh... the whole marine folk send you their thanks! They love presents so much!!!"; + if(rand(2))mes "Didn't you know that Santa's Hat reveals the real power of the rings?"; + close; + +M_END: + mes "[Snoowy]"; + mes "I'd exchange a GOLD magic ring for 3 gift boxes..."; + emotion e_swt; + close; +} diff --git a/npc/custom/healer.txt b/npc/custom/healer.txt new file mode 100644 index 000000000..ab7eb9f55 --- /dev/null +++ b/npc/custom/healer.txt @@ -0,0 +1,69 @@ +//===== rAthena Script ======================================= +//= Healer +//===== By: ================================================== +//= Euphy +//===== Current Version: ===================================== +//= 1.0 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Basic healer script. +//============================================================ + +- script Healer -1,{ + + set .@Price,0; // Zeny required for heal + set .@Buffs,0; // Also buff players? (1: yes / 0: no) + set .@Delay,0; // Heal delay, in seconds + + callfunc "F_ClearGarbage",0; + if (@HD > gettimetick(2)) end; + if (.@Price) { + message strcharinfo(0),"Healing costs "+.@Price+" Zeny."; + if (Zeny < .@Price) end; + if(select("^0055FFHeal^000000:^777777Cancel^000000") == 2) close; + set Zeny, Zeny-.@Price; + } + specialeffect2 313; percentheal 100,100; + if (.@Buffs) { + specialeffect2 EF_INCAGILITY; sc_start SC_INCREASEAGI,240000,10; + specialeffect2 EF_BLESSING; sc_start SC_BLESSING,240000,10; + } + if (.@Delay) set @HD, gettimetick(2)+.@Delay; + close; +} + +alberta,25,240,6 duplicate(Healer) Healer#alb 909 +aldebaran,135,118,6 duplicate(Healer) Healer#alde 909 +amatsu,200,79,4 duplicate(Healer) Healer#ama 909 +ayothaya,207,169,6 duplicate(Healer) Healer#ayo 909 +brasilis,194,221,6 duplicate(Healer) Healer#bra 909 +comodo,184,158,6 duplicate(Healer) Healer#com 909 +dewata,193,175,6 duplicate(Healer) Healer#dew 909 +eclage,105,35,4 duplicate(Healer) Healer#ecl 909 +einbech,142,244,4 duplicate(Healer) Healer#einbe 909 +einbroch,57,202,6 duplicate(Healer) Healer#einbr 909 +dicastes01,201,194,4 duplicate(Healer) Healer#dic 909 +geffen,115,72,6 duplicate(Healer) Healer#gef 909 +gonryun,156,122,6 duplicate(Healer) Healer#gon 909 +hugel,89,150,6 duplicate(Healer) Healer#hug 909 +izlude,125,118,5 duplicate(Healer) Healer#izl 909 +lighthalzen,149,103,6 duplicate(Healer) Healer#li 909 +louyang,225,103,4 duplicate(Healer) Healer#lou 909 +malangdo,226,188,4 duplicate(Healer) Healer#mal 909 +malaya,205,205,6 duplicate(Healer) Healer#malay 909 +manuk,256,176,6 duplicate(Healer) Healer#man 909 +mid_camp,203,289,6 duplicate(Healer) Healer#mid 909 +mora,106,100,6 duplicate(Healer) Healer#mora 909 +morocc,153,97,6 duplicate(Healer) Healer#mor 909 +moscovia,215,194,6 duplicate(Healer) Healer#mos 909 +niflheim,188,180,5 duplicate(Healer) Healer#nif 909 +payon,179,106,4 duplicate(Healer) Healer#pay 909 +prontera,162,193,4 duplicate(Healer) Healer#pront 909 +rachel,125,116,6 duplicate(Healer) Healer#rac 909 +splendide,201,153,4 duplicate(Healer) Healer#spl 909 +thor_camp,249,74,4 duplicate(Healer) Healer#thor 909 +umbala,129,132,4 duplicate(Healer) Healer#umb 909 +veins,217,121,4 duplicate(Healer) Healer#ve 909 +xmas,143,136,6 duplicate(Healer) Healer#xmas 909 +yuno,164,45,4 duplicate(Healer) Healer#yuno 909 diff --git a/npc/custom/item_signer.txt b/npc/custom/item_signer.txt new file mode 100644 index 000000000..a3aba3771 --- /dev/null +++ b/npc/custom/item_signer.txt @@ -0,0 +1,133 @@ +//===== rAthena Script ======================================= +//= Sign Your Items +//===== By: ================================================== +//= Lupus +//===== Current Version: ===================================== +//= 1.1 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Write you name on your rare equipment or weapon ^_- +//===== Additional Comments: ================================= +//= 1.1 Cleaned and edited for general use. [Euphy] +//============================================================ + +prt_in,24,61,7 script Perchik 47,{ + + setarray .@Item[0],644,3; // Item requirements: <ID>,<Count>{,...} (0 to disable) + setarray .@Cost[0],0,5000; // Zeny requirements: <base price>,<price per refine> + + mes "[Perchik]"; + mes "I can ^0055FFsign your name^000000 on almost any rare item you hold."; + next; + if(select("Tell me more...:Sign my items, please!") == 1) { + mes "[Perchik]"; + mes "I can put your name on any slotless equipment or weapon."; + emotion e_ic; + next; + mes "[Perchik]"; + if (getarraysize(.@Item) || getarraysize(.@Cost)) { + mes "For my work I accept:"; + if (getarraysize(.@Item)) for(set .@i,0; .@i<getarraysize(.@Item); set .@i,.@i+2) + mes " ~ "+.@Item[.@i+1]+"x "+getitemname(.@Item[.@i]); + if (.@Cost[0]) mes " ~ "+.@Cost[0]+" Zeny"; + if (.@Cost[1]) mes " ~ "+.@Cost[1]+" Zeny per refine"; + } + else mes "I work for free, but..."; + next; + emotion e_cry; + mes "[Perchik]"; + mes "Alas, I have 12 hungry children"; + mes "and a very angry wife."; + next; + mes "[Perchik]"; + mes "Or it was 12 angry children"; + mes "and a very hungry wife..."; + emotion e_hmm; + close; + } + mes "[Perchik]"; + mes "Show me your items to sign..."; + next; + setarray .@pos$[1],"Upper Headgear","Armor","Left hand","Right hand","Garment","Footgear","Left Accessory","Right Accessory","Mid Headgear","Lower Headgear"; + set .@menu$,""; + for (set .@i,1; .@i<=10; set .@i,.@i+1) { + if (getequipisequiped(.@i)) + set .@menu$, .@menu$+.@pos$[.@i]+" [^0055FF"+getequipname(.@i)+"^000000]"; + set .@menu$, .@menu$+":"; + } + set .@part, select(.@menu$); + set .@id, getequipid(.@part); + set .@ref, getequiprefinerycnt(.@part); + mes "[Perchik]"; + if (!getequipisequiped(.@part)) { + mes "Nothing is equipped there!"; + emotion e_wah; + close; + } + for(set .@i,0; .@i<4; set .@i,.@i+1) + set .@slot[.@i], getequipcardid(.@part,.@i); + if (.@slot[0]==255 || .@slot[0]==254 || .@slot[0]<0) { + mes "Alas, this item's already signed."; + mes "I would never touch a master's work."; + emotion e_hmm; + close; + } + if (.@slot[0]>4000 && .@slot[0]<5000) { + mes "A card? Here?!"; + mes "As I said before, I don't sign items with cards."; + emotion e_hmm; + close; + } + if (getiteminfo(.@id,10)) { + mes "Sorry, I don't sign slotted items."; + emotion e_sry; + close; + } + getinventorylist; + for(set .@i,0; .@i<@inventorylist_count; set .@i,.@i+1) + if (@inventorylist_expire[.@i] != 0) { + mes "Sorry, I don't sign rental items!"; + emotion e_hmm; + close; + } + set .@price, .@Cost[0]+(.@Cost[1]*.@ref); + if (getarraysize(.@Item) || .@price) { + mes "I will need:"; + if (getarraysize(.@Item)) for(set .@i,0; .@i<getarraysize(.@Item); set .@i,.@i+2) { + mes " ~ "+.@Item[.@i+1]+"x "+getitemname(.@Item[.@i]); + if (countitem(.@Item[.@i]) < .@Item[.@i+1]) set .@nr,1; + } + if (.@price) mes " ~ "+.@price+" Zeny"; + } + mes "Shall I sign your ^0055FF"+getitemname(.@id)+"^000000?"; + next; + if(select("Ok!:Leave")==2) { + mes "[Perchik]"; + mes "See you..."; + emotion e_yawn; + close; + } + mes "[Perchik]"; + if (Zeny < .@price || .@nr) { + mes "I don't work for 'thanks'."; + emotion e_sry; + close; + } + if (!countitem2(.@id,1,.@ref,0,.@slot[0],.@slot[1],.@slot[2],.@slot[3])) { + mes "Where is "+getitemname(@id)+"...?"; + npctalk "You're a snoozy cheater!"; + logmes "CHEATER: Tried to sign an item not having it: "+getitemname(@id); + emotion e_wah; + close; + } + if (.@price) set Zeny, Zeny-.@price; + if (getarraysize(.@Item)) for(set .@i,0; .@i<getarraysize(.@Item); set .@i,.@i+2) + delitem .@Item[.@i], .@Item[.@i+1]; + delitem2 .@id,1,1,.@ref,0,.@slot[0],.@slot[1],.@slot[2],.@slot[3]; + mes "Done!"; + emotion e_proud; + getitem2 .@id,1,1,.@ref,0,254,0,getcharid(0)&0xffff,(getcharid(0)>>16)&0xffff; + equip .@id; + close; +} diff --git a/npc/custom/itemmall.txt b/npc/custom/itemmall.txt new file mode 100644 index 000000000..b6c4bb800 --- /dev/null +++ b/npc/custom/itemmall.txt @@ -0,0 +1,44 @@ +//===== rAthena Script ======================================= +//= Shop Street +//===== By: ================================================== +//= Masao +//===== Current Version: ===================================== +//= 1.0 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= A Shop Street in Prontera. +//============================================================ + +prontera,147,240,5 shop Armor 99,2304:10000,2306:20000,2308:20000,2310:50000,2311:50000,2313:50000,2315:75000,2317:100000,2322:20000,2326:60000,2331:75000,2342:100000,2353:75000,2364:150000,2367:100000,2399:50000 +prontera,147,242,5 shop Shield 99,2102:10000,2106:60000,2108:60000,2110:85000,2114:30000,2116:30000,2123:50000,2124:50000 +prontera,147,244,5 shop Footgear 99,2404:10000,2406:20000,2409:30000,2412:50000,2417:50000,2418:50000,2424:50000,2425:20000 +prontera,147,246,5 shop Mace 99,1502:10000,1505:20000,1511:20000,1514:-1,1517:-1,1520:50000,1522:100000,1523:25000,1528:50000,1529:50000,1531:50000 +prontera,147,248,5 shop Knuckle 494,1802:20000,1804:50000,1806:60000,1808:75000,1810:70000,1812:60000,1813:100000,1814:100000,1822:150000 +prontera,147,250,5 shop Whips 494,1951:10000,1953:20000,1955:30000,1962:20000,1963:50000,1972:10000,1974:10000,1976:50000 +prontera,147,252,5 shop Instruments 494,1902:10000,1904:20000,1906:-1,1908:50000,1913:50000,1914:50000,1915:50000,1916:50000,1917:50000 +prontera,147,254,5 shop Books 494,1550:30000,1551:60000,1552:51000,1559:25000,1561:75000,1564:25000,1568:70000,1569:70000,1570:70000,1571:70000,1572:50000 +prontera,147,256,5 shop Guns 497,13103:60000,13105:100000,13106:200000,13101:10000,13150:6000,13152:30000,13153:50000,13155:60000,13156:100000,13154:30000,13159:250000,13157:150000,13161:300000,13162:500000 +prontera,147,258,5 shop Fuuma Shuriken 497,7522:500,7521:500,7523:500 +prontera,147,260,5 shop One-Handed Swords 497,1108:10000,1117:10000,1120:100000,1124:50000,1130:100000,1131:50000,1133:50000,1138:200000,1139:200000,1145:-1,1149:50000 +prontera,147,262,5 shop Two-Handed Swords 497,1155:50000,1158:90000,1163:120000,1164:50000,1165:50000,1166:75000,1168:50000,1169:500000,1172:200000,1175:75000 +prontera,147,264,5 shop Spears 731,1405:20000,1408:50000,1415:100000,1417:75000,1421:75000,1422:25000 +prontera,147,238,1 shop Dagger 731,1208:20000,1211:20000,1217:20000,1223:50000,1231:75000,1235:75000,1236:75000,1237:75000 +prontera,164,264,4 shop Axes 731,1302:10000,1306:20000,1307:45000,1309:75000,1352:20000,1355:30000,1358:75000,1363:50000,1364:50000,1365:50000,1366:50000,1371:100000 +prontera,164,262,4 shop Accessories 731,2621:-1,2622:-1,2624:30000,2618:10000,2625:30000,2626:30000,2674:10000,2648:50000,2649:50000,2627:-1,2701:75000 +prontera,164,260,4 shop Bows 731,1702:20000,1705:50000,1708:20000,1720:50000,1723:75000,1724:75000,1725:75000 +prontera,164,258,4 shop Staffs / Rods 731,1602:20000,1605:20000,1608:20000,1611:45000,1618:85000,1620:85000,1622:50000,1624:50000,1625:50000,1626:50000 +prontera,164,256,4 shop Garments 405,2504:10000,2506:40000,2507:82000,2508:56000,2514:50000,2518:60000,2519:60000,2528:85000,2531:10000,2553:10000 +prontera,164,254,4 shop Katars 405,1251:50000,1253:100000,1255:75000,1261:125000,1262:20000,1263:20000,1265:100000,1275:100000,1276:100000,1277:100000,1278:100000 +prontera,164,252,4 shop Lower Headgear 405,2218:10000,5054:30000,2267:5000,5107:100000,2265:5000,2266:50000,2269:50000,2270:50000 +prontera,164,250,4 shop Middle Headgear 405,2201:5000,2203:4000,2205:3500,2212:5000,2225:10000,2229:50000,2231:50000,2234:50000,2235:50000,2281:25000,2292:50000,2296:50000 +prontera,164,248,4 shop Upper Headgear 405,2210:1000,2211:1000,2213:10000,2214:20000,2217:10000,2221:5000,2223:10000,2246:75000,2256:75000,2264:100000,2280:20000,2299:30000 +prontera,164,246,4 shop Headgear 01 832,5380:40000,5382:40000,2269:5000,2270:5000,5107:15000,5110:15000,2247:30000:5206:10000,2245:30000,2286:35000,2296:15000,2258:45000,5161:200000,5104:40000,2295:20000,5026:30000,5032:100000,5038:30000,5229:65000,5227:65000,5228:65000,5198:50000,5058:300000,5253:80000,5252:60000,5296:100000,5231:300000,5232:300000,5233:300000,5230:300000,5234:300000,5076:50000 +prontera,164,244,4 shop Headgear 02 832,5059:100000,5235:75000,5236:75000,5237:75000,5293:150000,5303:35000,5304:65000,5312:65000,5315:45000,5317:45000,5319:75000,5320:120000,5323:588888,5336:50000,5337:50000,5338:50000,5339:50000,5346:50000 +prontera,164,242,4 shop Headgear 03 832,5181:300000,5102:500000,5016:75000,5349:150000,5013:700000,5022:500000,5171:1250000,5135:500000,5029:50000,5033:65000,5040:100000,5047:35000,5065:65000,5068:50000,5074:50000,5084:75000,5086:150000,5108:350000,5121:100000,5133:50000,5137:100000,5138:150000,5140:55000,5146:75000,5151:75000,5152:150000,5170:150000,5173:75000,5174:75000,5175:75000,5184:50000,5185:45000,5187:75000,5188:50000,5191:25000,5192:25000,5193:25000,5194:25000,5195:25000,5196:25000,5197:25000 +prontera,164,240,4 shop Headgear 04 832,5200:75000,5205:100000,5211:75000,5226:50000,5238:75000,5239:75000,5240:75000,5241:75000,5242:75000,5243:50000,5325:75000,5254:100000,5255:65000,5257:50000,5297:100000,2202:45000,5258:35000,5298:50000,5276:50000,5273:50000,5275:50000,5274:50000,5259:50000,5271:250000,5272:50000,5284:50000,5286:75000,5288:50000,5289:50000,5291:55000,5292:55000,5294:55000,5352:50000,5324:100000,5359:50000,5360:50000 +prontera,164,238,4 shop Headgear 05 832,5340:50000,5341:50000,5342:50000,5343:50000,5344:50000,5345:50000,5354:50000,5355:50000,5361:65000,5365:50000,5373:75000,5374:350000,5379:50000,5383:60000,5384:88888,5390:88888,5388:50000,5411:50000,5393:75000,5397:35000,5399:50000,5800:175000,5801:300000,5802:150000 +prontera,151,284,4 shop Ammunition 880,1766:50,1755:20,1750:10,1754:20,1761:20,1752:20,1760:20,1759:20,1772:100,1757:30,1770:20,1769:30,1765:40,1763:30,1762:30,1767:30,1764:30,1751:20,1768:30,1753:30,1756:30,1758:30,1771:1000,13200:50,13202:100,13201:300,13206:500,13203:500,13207:500,13204:500,13205:500,13252:50,13254:500,13251:100,13253:300,13250:50,13256:50,13259:50,13258:50,13255:50,13257:50 +prontera,153,284,4 shop Alchemist Dealer 880,715:600,716:600,717:600,1025:200,7136:500,7135:500,7137:500,7138:500,7139:500 +prontera,155,284,4 shop Street Dealer 880,678:5000,505:-1,506:40,610:4000,545:150,546:600,547:1650 +prontera,157,284,4 shop Sheepy Gonzales 895,12028:1000,12262:500,12016:750 diff --git a/npc/custom/jobmaster.txt b/npc/custom/jobmaster.txt new file mode 100644 index 000000000..c4c259b64 --- /dev/null +++ b/npc/custom/jobmaster.txt @@ -0,0 +1,190 @@ +//===== rAthena Script ======================================= +//= Job Master +//===== By: ================================================== +//= Euphy +//===== Current Version: ===================================== +//= 1.3 +//===== Compatible With: ===================================== +//= rAthena SVN r16114+ +//===== Description: ========================================= +//= A fully functional job changer. +//===== Additional Comments: ================================= +//= 1.1 Fixed reset on Baby job change. [Euphy] +//= 1.2 Added Expanded Super Novice support and initial Kagerou/Oboro support. [Euphy] +//= 1.3 Kagerou/Oboro added. [Euphy] +//============================================================ + +prontera,153,193,6 script Job Master 123,{ +function Job_Menu; function A_An; + + mes "[Job Master]"; + if (Class > 4049) { + mes "No more jobs are available."; + close; + } + if (checkfalcon() || checkcart() || checkriding() || ismounting()) { + mes "Please remove your "+((checkfalcon())?"falcon":"")+((checkcart())?"cart":"")+((checkriding())?"Peco":"")+((ismounting())?"mount":"")+" before proceeding."; + close; + } + if (.SkillPointCheck && SkillPoint) { + mes "Please use all your skill points before proceeding."; + close; + } + + set .@eac, eaclass(); + set .@i, ((.ThirdClass)?roclass(.@eac&EAJ_UPPERMASK):Class); + if (.@i > 6 && .@i < 22) { + if (BaseLevel < .Rebirth[0] || JobLevel < .Rebirth[1]) { + set .@blvl, .Rebirth[0]-BaseLevel; set .@jlvl, .Rebirth[1]-JobLevel; + mes "You need "+((.@blvl>0)?.@blvl+" more base levels "+((.@jlvl>0)?"/ ":""):"")+((.@jlvl>0)?.@jlvl+" more job levels ":"")+"to continue."; + close; + } + if (Class > 21) { + mes "Switch to third class?"; + next; + Job_Menu(roclass(.@eac|EAJL_THIRD)); + close; + } + while(1) { + mes "Select an option."; + next; + set .@i, select(" ~ ^0055FFRebirth^000000:"+((.ThirdClass)?" ~ ^FF0000Third Class^000000":"")+": ~ ^777777Cancel^000000"); + if (.@i==3) close; + mes "[Job Master]"; + mes "Are you sure?"; + next; + Job_Menu(((.@i==1)?4001:roclass(.@eac|EAJL_THIRD))); + mes "[Job Master]"; + } + } + set .@j1, roclass(.@eac|EAJL_2_1); set .@j2,roclass(.@eac|EAJL_2_2); + if ((.@eac&EAJ_UPPERMASK) == EAJ_SUPER_NOVICE) setarray .@exp[0],roclass(.@eac|EAJL_THIRD),99; + if (Class == Job_Ninja) setarray .@exp[0],.@j1,70; + if (.@exp[0] && .ThirdClass) { + if (BaseLevel < .Rebirth[0] || JobLevel < .@exp[1]) { + set .@blvl, .Rebirth[0]-BaseLevel; set .@jlvl, .@exp[1]-JobLevel; + mes "You need "+((.@blvl>0)?.@blvl+" more base levels "+((.@jlvl>0)?"/ ":""):"")+((.@jlvl>0)?.@jlvl+" more job levels ":"")+"to continue."; + close; + } + mes "Switch to "+jobname(.@exp[0])+"?"; + next; + Job_Menu(.@exp[0]); + close; + } + if (.@eac&EAJL_2) + if (.@eac&(EAJL_UPPER|EAJL_BABY) || roclass(.@eac|EAJL_UPPER) == -1) { + mes "No more jobs are available."; + close; + } + if ((.@eac&EAJ_BASEMASK) == EAJ_NOVICE) { + if (JobLevel < .JobReq[0]) + mes "A job level of "+.JobReq[0]+" is required to change into the 1st Class."; + else if (Class == 4001 && .LastJob && lastJob) { + mes "Switch classes now?"; + next; + Job_Menu(roclass((eaclass(lastJob)&EAJ_BASEMASK)|EAJL_UPPER)); + } else switch(Class) { + case 0: Job_Menu(1,2,3,4,5,6,23,4046,24,25,4023); + case 4001: Job_Menu(4002,4003,4004,4005,4006,4007); + case 4023: Job_Menu(4024,4025,4026,4027,4028,4029,4045); + default: mes "An error has occurred."; break; + } + close; + } + if (roclass(.@eac|EAJL_2_1) == -1 || roclass(.@eac|EAJL_2_2) == -1) + mes "No more jobs are available."; + else if (!(.@eac&EAJL_2) && JobLevel < .JobReq[1]) + mes "A job level of "+.JobReq[1]+" is required to change into the 2nd Class."; + else if (.LastJob && lastJob && (.@eac&EAJL_UPPER)) { + mes "Switch classes now?"; + next; + Job_Menu(lastJob+4001); + } else + Job_Menu(.@j1,.@j2); + close; + +function Job_Menu { + while(1) { + if (getargcount() > 1) { + mes "Select a job."; + set .@menu$,""; + for(set .@i,0; .@i<getargcount(); set .@i,.@i+1) + set .@menu$, .@menu$+" ~ "+jobname(getarg(.@i))+":"; + set .@menu$, .@menu$+" ~ ^777777Cancel^000000"; + next; + set .@i, getarg(select(.@menu$)-1,0); + if (!.@i) close; + if ((.@i == 23 || .@i == 4045) && BaseLevel < .SNovice) { + mes "[Job Master]"; + mes "A base level of "+.SNovice+" is required to turn into a "+jobname(.@i)+"."; + close; + } + mes "[Job Master]"; + mes "Are you sure?"; + next; + } else + set .@i, getarg(0); + if (select(" ~ Change into ^0055FF"+jobname(.@i)+"^000000 class: ~ ^777777"+((getargcount() > 1)?"Go back":"Cancel")+"^000000") == 1) { + mes "[Job Master]"; + mes "You are now "+A_An(jobname(.@i))+"!"; + if (.@i==4001 && .LastJob) set lastJob, Class; + jobchange .@i; + if (.@i==4001 || .@i==4023) resetlvl(1); + specialeffect2 338; specialeffect2 432; + if (.Platinum) callsub Get_Platinum; + close; + } + if (getargcount() == 1) return; + mes "[Job Master]"; + } + end; +} + +function A_An { + setarray .@A$[0],"a","e","i","o","u"; + set .@B$, "_"+getarg(0); + for(set .@i,0; .@i<5; set .@i,.@i+1) + if (compare(.@B$,"_"+.@A$[.@i])) return "an "+getarg(0); + return "a "+getarg(0); +} + +Get_Platinum: + skill 142,1,0; + switch(BaseClass) { + case 0: if (Class !=23) skill 143,1,0; break; + case 1: skill 144,1,0; skill 145,1,0; skill 146,1,0; break; + case 2: skill 157,1,0; break; + case 3: skill 147,1,0; skill 148,1,0; break; + case 4: skill 156,1,0; break; + case 5: skill 153,1,0; skill 154,1,0; skill 155,1,0; break; + case 6: skill 149,1,0; skill 150,1,0; skill 151,1,0; skill 152,1,0; break; + default: break; + } + switch(BaseJob) { + case 7: skill 1001,1,0; break; + case 8: skill 1014,1,0; break; + case 9: skill 1006,1,0; break; + case 10: skill 1012,1,0; skill 1013,1,0; break; + case 11: skill 1009,1,0; break; + case 12: skill 1003,1,0; skill 1004,1,0; break; + case 14: skill 1002,1,0; break; + case 15: skill 1015,1,0; skill 1016,1,0; break; + case 16: skill 1007,1,0; skill 1008,1,0; skill 1017,1,0; skill 1018,1,0; skill 1019,1,0; break; + case 17: skill 1005,1,0; break; + case 18: skill 238,1,0; break; + case 19: skill 1010,1,0; break; + case 20: skill 1011,1,0; break; + default: break; + } + return; + +OnInit: + setarray .Rebirth[0],99,50; // Minimum base level, job level to rebirth OR change to third class + setarray .JobReq[0],10,40; // Minimum job level to turn into 1st class, 2nd class + set .ThirdClass,1; // Enable third classes? (1: yes / 0: no) + set .SNovice,45; // Minimum base level to turn into Super Novice + set .LastJob,1; // Enforce linear class changes? (1: yes / 0: no) + set .SkillPointCheck,1; // Force player to use up all skill points? (1: yes / 0: no) + set .Platinum,1; // Get platinum skills automatically? (1: yes / 0: no) + end; +}
\ No newline at end of file diff --git a/npc/custom/platinum_skills.txt b/npc/custom/platinum_skills.txt new file mode 100644 index 000000000..4de742817 --- /dev/null +++ b/npc/custom/platinum_skills.txt @@ -0,0 +1,63 @@ +//===== rAthena Script ======================================= +//= Platinum Skills +//===== By: ================================================== +//= Keichii, DarkChild +//===== Current Version: ===================================== +//= 2.8 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Single NPC that assigns quests skills for all classes +//===== Additional Comments: ================================= +//= 2.0 Added advanced classes by ShadowLady. +//= 2.1 Added baby clases by Midas +//= 2.2 Simplified Job Checks [Silentdragon] +//= 2.3 Thehell? Cleaned up script removed the nastiness. Also added rebirth skills. [Spre] +//= 2.4 Added Advanced skills. [Spre] +//= 2.5 Added dialog for if the user is none of the listed jobs. [Kisuka] +//= 2.6 Fixed 2nd advanced classes not being able to get their advanced skills. [Ancyker] +//= 2.7 Rewrote to give all correct skills to all proper classes. [Paradox924X] +//= 2.8 Clustered conditionals replaced with switch to include all Upper types. [Euphy] +//============================================================ + +prontera,128,200,6 script Platinum Skill NPC 94,{ + mes "[Platinum Skill NPC]"; + mes "I can give you the special skills available to your job."; + mes "Would you like these skills now?"; + next; + if (select("Yes Please:No") == 2) { + mes "[Platinum Skill NPC]"; + mes "Have a nice day... >.>"; + close; + } + skill 142,1,0; + switch(BaseClass) { + case 0: if (Class !=23) skill 143,1,0; break; + case 1: skill 144,1,0; skill 145,1,0; skill 146,1,0; break; + case 2: skill 157,1,0; break; + case 3: skill 147,1,0; skill 148,1,0; break; + case 4: skill 156,1,0; break; + case 5: skill 153,1,0; skill 154,1,0; skill 155,1,0; break; + case 6: skill 149,1,0; skill 150,1,0; skill 151,1,0; skill 152,1,0; break; + default: break; + } + switch(BaseJob) { + case 7: skill 1001,1,0; break; + case 8: skill 1014,1,0; break; + case 9: skill 1006,1,0; break; + case 10: skill 1012,1,0; skill 1013,1,0; break; + case 11: skill 1009,1,0; break; + case 12: skill 1003,1,0; skill 1004,1,0; break; + case 14: skill 1002,1,0; break; + case 15: skill 1015,1,0; skill 1016,1,0; break; + case 16: skill 1007,1,0; skill 1008,1,0; skill 1017,1,0; skill 1018,1,0; skill 1019,1,0; break; + case 17: skill 1005,1,0; break; + case 18: skill 238,1,0; break; + case 19: skill 1010,1,0; break; + case 20: skill 1011,1,0; break; + default: break; + } + mes "[Platinum Skill NPC]"; + mes "There you go!"; + close; +} diff --git a/npc/custom/quests/bandit_beard.txt b/npc/custom/quests/bandit_beard.txt new file mode 100644 index 000000000..0fba60f2f --- /dev/null +++ b/npc/custom/quests/bandit_beard.txt @@ -0,0 +1,237 @@ +//===== rAthena Script ======================================= +//= Bandit Beard Quest +//===== By: ================================================== +//= Mega Man Expert & Lupus +//===== Current Version: ===================================== +//= 1.3 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= A harmless quest for a simply item w/o any bonuses "Bandit Beard" +//===== Additional Comments: ================================= +//= Fully working. +//= 1.0 First release +//= 1.1 Fixed some exploits, bugs and typos. Optimized 8) [Lupus] +//= 1.1b fixed some typos +//= 1.2 fixed donpcevent label [Lupus] +//= 1.3 Removed duplicates [L0ne_W0lf] +//============================================================ + +umbala,126,129,4 script Bearded Man#bandit 120,{ + if(BEARD_QUEST == 4 ) goto L_MAKE; + if(BEARD_QUEST >= 5 ) goto L_DONE; + if(BEARD_QUEST >= 1 ) goto L_THREAD; + + mes "[Bearded Man]"; + mes "Beards! Get your wonderful beards!"; + mes "Would you like a beard?"; + next; + menu "Yes, I'd like some facial hair!",-,"No thanks, thats gross!",M_NO; + + mes "[Bearded Man]"; + mes "HoHo~ So you want some whiskers."; + emotion 18; + mes "Well I would give you my beards but there not cheap."; + mes "Matter of fact I have only one left..."; + mes "but I'm not selling it."; + mes "But don't get mad! I can make you one."; + next; + set BEARD_QUEST,1; +L_THREAD: + mes "[Bearded Man]"; + mes "I would need some ^8080FFThread^000000 for the Beard."; + mes "Talk to my friend in Izlude for some ^8080FFThread^000000."; + next; + + mes "[Bearded Man]"; + mes "Also I would need you to get me some things for the beard."; + mes "They are:"; +L_LIST: + mes "^8080FFElastic Band^000000"; + mes "^8080FF5 Animal Skins^000000"; + mes "^8080FFBlack Dye Stuff^000000"; + mes "^8080FFGranpa Beard^000000"; + mes "^8080FF100 sticky Mucus^000000"; + mes "^8080FFCounteragent^000000"; + mes " and one ^8080FF2 Carat Diamond^000000"; + close; + +M_NO: + mes "[Bearded Man]"; + mes "Fine, be that way!"; + emotion 7; + close; + +L_DONE: + mes "[Bearded Man]"; + mes "Sorry, I can only make one per person."; + mes "We don't want too many beards now. Right?"; + emotion 29; + close; + +L_MAKE: + mes "[Bearded Man]"; + mes "Let's make you your beard!"; + next; + if(countitem(7200) < 1 || countitem(919) < 1 || countitem(983) < 1 || countitem(2241) < 1 || + countitem(938) < 100 || countitem(973) < 1 || countitem(731) < 1) goto L_NOITEMS; + delitem 7200, 1; + delitem 919, 1; + delitem 983, 1; + delitem 2241, 1; + delitem 938, 100; + delitem 973, 1; + delitem 731, 1; + mes "^8080FF~You see him cutting and sewing the beard together~^000000"; + next; + mes "^8080FF~He hands you the finished beard~^000000"; + next; + getitem 2237, 1; + set BEARD_QUEST, 5; + mes "[Bearded Man]"; + mes "Have a nice day!"; + emotion 29; + close; + +L_NOITEMS: + mes "[Bearded Man]"; + mes "What the hell! I can't make a beard without the items!"; + mes "Here is the list again:"; + emotion 23; + goto L_LIST; +} + +//Master Tailor---------- +izlude_in,123,175,4 script Master Tailor#bandit 50,{ + mes "[Master Tailor]"; + mes "Good evening! I am the Master Tailor!"; + if(BEARD_QUEST != 1 ) close; + + next; + mes "[Master Tailor]"; + mes "What? A Bearded Man sent you..."; + mes "Well I'm sorry to say that I am out of ^8080FFThread^000000."; + mes "But I have the address to where I get the shipments."; + mes "It is in Al de Baran Karfa Inc. warehouse area."; + mes "The address is: Al de Baran 59, 221"; + mes "See you later."; + set BEARD_QUEST, 2; + close; +} +// Karfa Thread Clerk--- +aldeba_in,70,179,5 script Karfa Clerk#bandit 113,{ + mes "[Karfa Clerk]"; + if(BEARD_QUEST == 3 ) goto L_REPEAT; + if(BEARD_QUEST > 3 ) goto L_DONE; + + mes "What can I do for you?"; + next; + if(BEARD_QUEST == 2 ) goto L_DELIVERY; + + menu "What's in the boxes?",-,"Nothing.",M_NOPE; + + mes "[Karfa Clerk]"; + mes "They're empty."; +M_NOPE: + close; + +L_DELIVERY: + + mes "[Karfa Clerk]"; + mes "Sorry but we have not received any ^8080FFThread^000000."; + mes "Our shipments have been put off until its safe."; + mes "You see we get our ^8080FFThread^000000 from Alberta and a monsters keeps attacking our merchants."; + next; + mes "[Karfa Clerk]"; + mes "Now this monsters has not been doing this before."; + mes "It may have to do with the warmer months."; + mes "Please help us out!"; + set BEARD_QUEST,3; + next; + mes "[Karfa Clerk]"; +L_REPEAT: + mes "Oh by the way, that Thread Merchant is somewhere around Alberta 60 and 100..."; +L_DONE: + mes "Thank You!"; + close; +} + +//Thread Merchant ------ +alberta,65,123,6 script Man#bandit 85,{ + if(BEARD_QUEST == 3 && $@beardMobD) goto L_KILLED; + if(BEARD_QUEST > 3) goto L_DONE; + + mes "[Thread Merchant]"; + mes "ARGGG!! I can never get my stuff to Al de Baran!"; + mes "I keep getting mobbed by some bugs."; + mes "They steal all my supplies and ^8080FFThread^000000."; + next; + mes "[Thread Merchant]"; + + if(BEARD_QUEST != 3) mes "What am I to do?"; + if(BEARD_QUEST != 3) close; + + if($@beardmob > 0) mes "Kill! Kill them already!!!"; + if($@beardmob > 0) close; + mes "Are you here to help me?"; + emotion 1; + next; + menu "Yes",-,"No",M_NO; + + mes "[Thread Merchant]"; + mes "Oh thank the Gods!"; + mes "If you can only just kill the bugs I would be able to make my delivery."; + next; + mes "[Thread Merchant]"; + mes "Oh NO! Here they come!!"; + emotion 19; + donpcevent "BRDQ_MOBS::OnStart"; + close; + +L_KILLED: + set $@beardMobD,0; + mes "[Thread Merchant]"; + mes "Thank you for killing the Thief Bugs."; + mes "As a token of my gratitude here is a box full of ^8080FFThread^000000."; + set BEARD_QUEST,4; + close; + +L_DONE: + mes "[Thread Merchant]"; + mes "Thank you again!"; + emotion 15; + close; + +M_NO: + mes "[Thread Merchant]"; + mes "What to do..."; + close; +} + +//mobsummons ------- +alberta,1,1,1 script BRDQ_MOBS -1,{ +OnStart: + set $@beardMob,10; + set $@beardMobD,0; + monster "alberta",65,120,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie"; + monster "alberta",66,120,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie"; + monster "alberta",67,120,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie"; + monster "alberta",68,120,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie"; + monster "alberta",66,121,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie"; + monster "alberta",67,121,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie"; + monster "alberta",68,121,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie"; + monster "alberta",66,122,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie"; + monster "alberta",67,122,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie"; + monster "alberta",68,122,"Thef Bug Male",1054,1,"BRDQ_MOBS::OnDie"; + end; +OnDie: + set $@beardmob, $@beardmob - 1; + if($@beardmob > 0) end; + set $@beardMobD,1; + end; +On1201: +On0001: + set $@beardMob,0; + set $@beardMobD,0; + end; +} diff --git a/npc/custom/quests/berzebub.txt b/npc/custom/quests/berzebub.txt new file mode 100644 index 000000000..cfaf78980 --- /dev/null +++ b/npc/custom/quests/berzebub.txt @@ -0,0 +1,64 @@ +//===== rAthena Script ======================================= +//= Berzebub Card Quest +//===== By: ================================================== +//= jabs +//===== Current Version: ===================================== +//= 1.1 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Quest to get the Berzebub Card +//===== Additional Comments: ================================= +//= 1.1 Fixed ingredients. Was too exploitable [Lupus] +//= 1.2 Optimized. [Euphy] +//============================================================ + +prontera,165,178,8 script Old Woman 103,{ + + setarray .@Items[0],714,25,1061,100,1095,200,618,10,1551,2,1614,1,727,20; + set .@n$,"[Old Woman]"; + + mes .@n$; + if(BerzQuest == 1) { + mes "Hey, I remember you! I already told you that you may only complete this quest once."; + close; } + mes "Greeting, lad. I found a really nifty item while I was picking mushrooms near Glast Heim."; + next; + if(select("Keep Talking:Leave")==2) goto M_Leave; + + mes .@n$; + mes "I have never seen an item like this before. I am told it can be placed inside any accessory with a slot available."; + next; + mes .@n$; + mes "If you're interested in this item, I'll tell you what you need for me to make you one of your own. I can only give one of these to each player, so once you finish this quest, you may not do it again."; + next; + if(select("Tell me more about it:Nah, I don't care about it")==2) goto M_Leave; + + mes .@n$; + mes "I believe the item is called a ^FF0000Berzebub Card^000000. It makes you cast spells really fast!"; + next; + mes .@n$; + mes "I need all of the following items:"; + for(set .@i,0; .@i<getarraysize(.@Items); set .@i,.@i+2) { + mes " ~ "+.@Items[.@i+1]+"x "+getitemname(.@Items[.@i]); + if (countitem(.@Items[.@i]) < .@Items[.@i+1]) set .@nr,1; } + next; + if(select("I have all of that!:I'll get those ASAP")==2) goto M_Leave; + + mes .@n$; + if (.@nr) { + mes "You lie! Get out of here and get those items, you sorry excuse for a rock star."; + close; } + for(set .@i,0; .@i<getarraysize(.@Items); set .@i,.@i+2) + delitem .@Items[.@i], .@Items[.@i+1]; + getitem 4145,1; + set BerzQuest, 1; + mes "Congratulations! You have all the items. Here is your ^FF0000Berzebub Card^000000, as promised."; + emotion e_grat; + close; + +M_Leave: + mes .@n$; + mes "Such a great item I have right here..."; + close; +}
\ No newline at end of file diff --git a/npc/custom/quests/dead_branch.txt b/npc/custom/quests/dead_branch.txt new file mode 100644 index 000000000..505da6c0a --- /dev/null +++ b/npc/custom/quests/dead_branch.txt @@ -0,0 +1,104 @@ +//===== rAthena Script ======================================= +//= Dead Branch (+Bloody Branch) Quest +//===== By: ================================================== +//= GM-Yevon +//===== Current Version: ===================================== +//= 1.1 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +// Simple item trade-in quest, a person can get a Dead Branch +// by simply providing the items: Log x3 (7201), Wooden Heart x1 (7189), +// Trunk x5 (1019), and Wooden Gnarl x1 (7222). +//===== Additional Comments: ================================= +//= 1.1 Optimized, added Bloody Branch with 0.01% chance [Lupus] +//============================================================ + +niflheim,204,179,3 script Mister Mobry 121,{ + + mes "[Mister Mobry]"; + mes "Trees possess spirits you know..."; + next; + + mes "[Mister Mobry]"; + mes "In fact I know a secret about these spirits that can in some way... perhaps aid you..."; + next; + + mes "[Mister Mobry]"; + mes "I can create a spirited branch... That is, if you can provide me with the correct materials..."; + next; + goto L_MENU; + +L_MENU: + menu "What Do I Need?",-,"Where Can I find this Crap?",M_FIND,"Make me a Dead Branch!",M_CREATE,"Forget it...",M_END; + + mes "[Mister Mobry]"; + mes "Mwehehe... I see you want to control tree spirits am I right? Ok... I need:"; + mes "^1354453 Logs^000000"; + mes "^1354451 Wooden Heart^000000"; + mes "^1354455 Trunk^000000"; + mes "^1354451 Wooden Gnarl^000000"; + next; + goto L_MENU; + +M_FIND: + mes "[Mister Mobry]"; + mes "You can find the following items from certain monsters heheh..."; + mes "^135445Logs can be found off of Tree Golems.^000000"; + mes "^135445Wooden Hearts the essence of Tree Golems.^000000"; + mes "^135445Trunks? Seriously, think wood...^000000"; + mes "^135445Wooden Gnarl... Gibbet...^000000"; + next; + goto L_MENU; + +L_NOLOG: + mes "[Mister Mobry]"; + mes "^135445Logs^000000 are the body... I need more of them."; + mes "Get me three logs and I'll make you the spirit..."; + close; + +L_NOHEART: + mes "[Mister Mobry]"; + mes "The ^135445Wooden Heart^000000 is the essence of the spirit."; + mes "Get me one wooden heart and I'll make you the spirit..."; + close; + +L_NOTRUNK: + mes "[Mister Mobry]"; + mes "What? You couldn't even find ^1354455 Trunks^000000?"; + mes "Kill Elder Willows or something... Geez... no trunks heh... pathetic."; + close; + +L_NOGNARL: + mes "[Mister Mobry]"; + mes "How can I make one without a ^135445Wooden Gnarl^000000?"; + mes "I said Gibbet... they are all around this place..."; + close; + +M_CREATE: + mes "[Mister Mobry]"; + mes "Well...let us see what you brought me..."; + next; + if(countitem(7201)<3) goto L_NOLOG; + if(countitem(7189)<1) goto L_NOHEART; + if(countitem(1019)<5) goto L_NOTRUNK; + if(countitem(7222)<1) goto L_NOGNARL; + delitem 7201,3; + delitem 7189,1; + delitem 1019,5; + delitem 7222,1; + mes "[Mister Mobry]"; + mes "Heh... Hope you have fun with the tree spirits... Careful now..."; + mes "Heh... careful now? What do I care if you di..... Never mind."; + if(rand(1000)==0) goto L_GIVE2; + getitem 604,1; //Dead Branch + close; +L_GIVE2: + getitem 12103,1; //Bloody Branch + close; + +M_END: + mes "[Mister Mobry]"; + mes "No spirit for you... then go!"; + close; +} diff --git a/npc/custom/quests/elvenear.txt b/npc/custom/quests/elvenear.txt new file mode 100644 index 000000000..c547bf524 --- /dev/null +++ b/npc/custom/quests/elvenear.txt @@ -0,0 +1,68 @@ +//===== rAthena Script ======================================= +//= Daily Job Quest For Elven Ears +//===== By: ================================================== +//= someone +//===== Current Version: ===================================== +//= 1.2 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Elven Ears (require 75+ Base Level) +//===== Additional Comments: ================================= +//= Optimized [Lupus], 1.1 misc fix +//= 1.2 Fixed exploit [Lupus] +//============================================================ + +geffen,127,49,5 script Elven Ears Quest 84,{ + mes "[Elven Ears Quest]"; + mes "Hi, today's quest is...."; + mes "Ah, the ^61B031Elven Ears ^000000Quest!"; + next; + menu "Requirements",L_Bl, "Make Item",-,"Cancel",L_Cancel; + + mes "[Elven Ears quest]"; + mes "Good good, let me just check"; + next; + if(countitem(2213)<1 || countitem(1040)<20 || countitem(919)<20) goto L_NoMake; + delitem 2213,1; + delitem 1040,20; + delitem 919,20; + mes "[Elven Ears quest]"; + mes "Give me a second....."; + next; + getitem 2286,1; + mes "[Elven Ears Quest]"; + mes "Ok done!"; + close; + +L_NoMake: + mes "[Elven Ears Quest]"; + mes "You don't have the requirements."; + mes "Please come back another time..."; + close; + +L_Bl: + mes "[Elven Ears Quest]"; + mes "Ok all you have to do is collect:"; + mes "^362ED61 Kitty Band^000000"; + mes "^362ED620 Elder Pixie Mustaches^000000"; + mes "and ^362ED620 Animal Skin^000000"; + next; + menu "Accept",-, "Leave",L_Leave; + + mes "[Elven Ears Quest]"; + mes "When you are done, bring the items to me. Ok good luck finding those items."; + close; + +L_Leave: + mes "[Elven Ears quest]"; + mes "Maybe another time?"; + close; + +L_Cancel: + mes "[Elven Ears quest]"; + mes "Aw, what a shame"; + mes "Giving up already?"; + mes "Oh well maybe you will participate in tommorow's quest."; + close; +} diff --git a/npc/custom/quests/event_6_new_hats.txt b/npc/custom/quests/event_6_new_hats.txt new file mode 100644 index 000000000..56edaed19 --- /dev/null +++ b/npc/custom/quests/event_6_new_hats.txt @@ -0,0 +1,371 @@ +//===== rAthena Script ======================================= +//= Custom Quest For New Headgears +//===== By: ================================================== +//= RedxSwordxHero, Lupus +//===== Current Version: ===================================== +//= 1.4b +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= 4 brothers give you quests to get 6 new hats (missing +//= from official quests) +//= Use this custom quest instead of event_32_new_hats.txt +//= -Bongun Hat +//= -Poring Hat, Sphinx Hat +//= -Kafra Band, Panda Hat +//= -Crescent Hairpin +//===== Additional Comments: ================================= +//= Event New Hats by RedxSwordxHero +//= Ported and improved with timers [Lupus] +//= Thanks to x[tsk],fixed all item requirements to iRO specs exept +//= for hats which cannot be made on the real server. [Lupus] +//= 1.2 removed already existing official hat quests [Lupus] +//= 1.3 Spiffed up the NPC coords and their appearance [Lupus] +//= 1.4 Fixed exploits. 1.4a fixed wrong item ID [Lupus] +//============================================================ + +prt_in,130,66,5 script Zac 704,{ + mes "[Zac]"; + mes "I am the oldest and strongest of the 4 brothers that makes all the newer hats. You will need to bring me the correct items for each hat, so I can make them."; + next; + mes "[Zac]"; + mes "I provide 1 hat and my brothers provides the other 5."; + next; + menu "Join",L1,"Information",L2,"Cancel",L3; +L1: + mes "[Zac]"; + mes "What hat do you want me to make?"; + next; + menu "Bongun Hat",L1_4; +L1_4: + mes "[Zac]"; + mes "Let me check the items you have brought here."; + next; + if(countitem(609) < 10) goto L_ITEM_1c;//Items: Amulet, + if(countitem(978) < 1) goto L_ITEM_2c;//Items: Cobaltblue Dyestuff, + if(countitem(2264) < 1) goto L_ITEM_3c;//Items: Munak Hat, + delitem 609,10;//Items: Amulet, + delitem 978,1;//Items: Cobaltblue Dyestuff, + delitem 2264,1; //Items: Munak Hat, + mes "[Zac]"; + mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Bongun Hat for you right away. Please Wait a Moment."; + next; + mes "[Zac]"; + mes "Tah Dah! ^FF0000Bongun Hat^000000...! Please Take it!"; + getitem 5046,1;//Items: Bongun Hat, + next; + mes "[Zac]"; + mes "I liked that, I look forward to making more. Thank you."; + close; +L_ITEM_1c: + mes "[Zac]"; + mes "Oh, dear. You need 10 Amulets..."; + close; +L_ITEM_2c: + mes "[Zac]"; + mes "Oh, dear. You need 1 Cobaltblue Dyestuffs..."; + close; +L_ITEM_3c: + mes "[Zac]"; + mes "Oh, dear. You need 1 Munak Hat..."; + close; +L2: + mes "[Zac]"; + mes "Which hat materials do you wish to know?"; + next; + menu "Bongun Hat",L2_4; +L2_4: + mes "[Zac]"; + mes "You need 10 Amulets, 1 Cobaltblue Dyestuffs and 1 Munak Hat for Bongun Hat."; + close; +L3: + mes "[Zac]"; + mes "Stop by some other time with the right materials, so I can make the hats for you."; + close; +} + +prt_in,162,131,5 script Blac 732,{ + mes "[Blac]"; + mes "I am the youngest and sexiest of the 4 brothers that makes all the newer hats. You will need to bring me the correct items for each hat, so I can make them."; + next; + mes "[Blac]"; + mes "I provide 1 hat and my brothers provides the other 5."; + next; + menu "Join",L1,"Information",L2,"Cancel",L3; +L1: + mes "[Blac]"; + mes "What hat do you want me to make?"; + next; + menu "Crescent Hairpin",L1_9; +L1_9: + mes "[Blac]"; + mes "Let me check the items you have brought here."; + next; + if(countitem(5041) < 1) goto L_ITEM_1;//Items: Heart Hairpin, + if(countitem(999) < 10) goto L_ITEM_2;//Items: Steel, + delitem 5041,1;//Items: Heart Hairpin, + delitem 999,10; //Items: Steel, + mes "[Blac]"; + mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Crescent Hairpin for you right away. Please Wait a Moment."; + next; + mes "[Blac]"; + mes "Tah Dah! ^FF0000Crescent Hairpin^000000...! Please Take it!"; + getitem 5048,1;//Items: Cresent Hairpin, + next; + mes "[Blac]"; + mes "I liked that, I look forward to making more. Thank you."; + close; +L_ITEM_1: + mes "[Blac]"; + mes "Oh, dear. You need 1 Heart Hairpin..."; + close; +L_ITEM_2: + mes "[Blac]"; + mes "Oh, dear. You need 10 Steels..."; + close; +L2: + mes "[Blac]"; + mes "Which hat materials do you wish to know?"; + next; + menu "Crescent Hairpin",L2_9; +L2_9: + mes "[Blac]"; + mes "You need 1 Heart Hairpin and 10 Steels for Crescent Hairpin."; + close; +L3: + mes "[Blac]"; + mes "Stop by some other time with the right materials, so I can make the hats for you."; + close; +} + +prt_in,53,56,5 script Jac 107,{ + mes "[Jac]"; + mes "I am the 2nd oldest and calmest of the 4 brothers that makes all the newer hats. You will need to bring me the correct items for each hat, so I can make them."; + next; + mes "[Jac]"; + mes "I provide 2 hats and my brothers provides the other 4."; + next; + menu "Join",L1,"Information",L2,"Cancel",L3; +L1: + mes "[Jac]"; + mes "What hat do you want me to make?"; + next; + menu "Kafra Band",L1_19,"Panda Hat",L1_24; +L1_19: + mes "[Jac]"; + mes "Let me check the items you have brought here."; + next; + if(countitem(10007) < 1) goto L_ITEM_1b;//Items: Silk Ribbon, + if(countitem(10009) < 1) goto L_ITEM_2b;//Items: Wild Flower, + delitem 10007,1;//Items: Silk Ribbon, + delitem 10009,1; //Items: Wild Flower, + mes "[Jac]"; + mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Kafra Band for you right away. Please Wait a Moment."; + next; + mes "[Jac]"; + mes "Tah Dah! ^FF0000Kafra Band^000000...! Please Take it!"; + getitem 5020,1;//Items: Kafra's Band, + next; + mes "[Jac]"; + mes "I liked that, I look forward to making more. Thank you."; + close; +L_ITEM_1b: + mes "[Jac]"; + mes "Oh, dear. You need 1 Silk Ribbon..."; + close; +L_ITEM_2b: + mes "[Jac]"; + mes "Oh, dear. You need 1 Wild Flower..."; + close; +L1_24: + mes "[Jac]"; + mes "Let me check the items you have brought here."; + next; + if(countitem(999) < 10) goto L_ITEM_1g;//Items: Steel, + if(countitem(948) < 200) goto L_ITEM_2g;//Items: Bears Footskin, + delitem 999,10;//Items: Steel, + delitem 948,200; //Items: Bears Footskin, + mes "[Jac]"; + mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Panda Hat for you right away. Please Wait a Moment."; + next; + mes "[Jac]"; + mes "Tah Dah! ^FF0000Panda Hat^000000...! Please Take it!"; + getitem 5030,1;//Items: Panda Hat, + next; + mes "[Jac]"; + mes "I liked that, I look forward to making more. Thank you."; + close; +L_ITEM_1g: + mes "[Jac]"; + mes "Oh, dear. You need 10 Steels..."; + close; +L_ITEM_2g: + mes "[Jac]"; + mes "Oh, dear. You need 200 Bear Footskins..."; + close; +L2: + mes "[Jac]"; + mes "Which hat materials do you wish to know?"; + next; + menu "Kafra Band",L2_19,"Panda Hat",L2_24; +L2_19: + mes "[Jac]"; + mes "You need 1 Silk Ribbon and 1 Wild Flower for Kafra Band."; + close; +L2_24: + mes "[Jac]"; + mes "You need 10 Steels and 200 Bear Footskins for Panda Hat."; + close; +L3: + mes "[Jac]"; + mes "Stop by some other time with the right materials, so I can make the hats for you."; + close; +} + +prt_in,45,113,5 script Pac 705,{ + mes "[Pac]"; + mes "I am 3rd oldest and wisest of the 4 brothers that makes all the newer hats. You will need to bring me the correct items for each hat so I can make them."; + next; + mes "[Pac]"; + mes "I provide 2 hats and my brothers provides the other 4."; + next; + menu "Join",L1,"Information",L2,"Cancel",L3; +L1: + mes "[Pac]"; + mes "What hat do you want me to make?"; + next; + menu "Poring Hat",L1_26,"Sphinx Hat",L1_29; +L1_26: + mes "[Pac]"; + mes "Let me check the items you have brought here."; + next; + if(countitem(741) < 1) goto L_ITEM_1a;//Items: Poring Doll, + if(countitem(909) < 300) goto L_ITEM_2a;//Items: Jellopy, + delitem 741,1;//Items: Poring Doll, + delitem 909,300;//Items: Jellopy, + mes "[Pac]"; + mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Poring Hat for you right away. Please Wait a Moment."; + next; + mes "[Pac]"; + mes "Tah Dah! ^FF0000Poring Hat^000000...! Please Take it!"; + getitem 5035,1;//Items: Poring Hat, + next; + mes "[Pac]"; + mes "I liked that, I look forward to making more. Thank you."; + close; +L_ITEM_1a: + mes "[Pac]"; + mes "Oh, dear. You need 1 Poring Doll..."; + close; +L_ITEM_2a: + mes "[Pac]"; + mes "Oh, dear. You need 300 Jellopys..."; + close; +L1_29: + mes "[Pac]"; + mes "Let me check the items you have brought here."; + next; + if(countitem(999) < 25) goto L_ITEM_1d;//Items: Steel, + if(countitem(979) < 1) goto L_ITEM_2d;//Items: Darkgreen Dyestuff, + if(countitem(976) < 1) goto L_ITEM_3d;//Items: Lemon Dyestuffs, + if(countitem(1059) < 150) goto L_ITEM_4d;//Items: Fabric, + if(countitem(969) < 2) goto L_ITEM_5d;//Items: Gold, + delitem 999,25;//Items: Steel, + delitem 979,1;//Items: Darkgreen Dyestuff, + delitem 976,1;//Items: Lemon Dyestuffs, + delitem 1059,150;//Items: Fabric, + delitem 969,2; //Items: Gold, + mes "[Pac]"; + mes "Wow!! Well done! Finally you have gathered all items needed! We will make the Sphinx Hat for you right away. Please Wait a Moment."; + next; + mes "[Pac]"; + mes "Tah Dah! ^FF0000Sphinx Hat^000000...! Please Take it!"; + getitem 5053,1;//Items: Sphinx Hat, + next; + mes "[Pac]"; + mes "I liked that, I look forward to making more. Thank you."; + close; +L_ITEM_1d: + mes "[Pac]"; + mes "Oh, dear. You need 25 Steels..."; + close; +L_ITEM_2d: + mes "[Pac]"; + mes "Oh, dear. You need 1 DarkGreen Dyestuffs..."; + close; +L_ITEM_3d: + mes "[Pac]"; + mes "Oh, dear. You need 1 Lemon Dyestuffs..."; + close; +L_ITEM_4d: + mes "[Pac]"; + mes "Oh, dear. You need 150 Fabric..."; + close; +L_ITEM_5d: + mes "[Pac]"; + mes "Oh, dear. You need 2 Gold Bar's..."; + close; +L2: + mes "[Pac]"; + mes "Which hat materials do you wish to know?"; + next; + menu "Poring Hat",L2_26,"Sphinx Hat",L2_29; +L2_26: + mes "[Pac]"; + mes "You need 1 Poring Doll and 300 Jellopys for Poring Hat."; + close; +L2_29: + mes "[Pac]"; + mes "You need 25 Steels, 1 DarkGreen Dyestuffs, 1 Lemon Dyestuffs, 150 Fabric and 2 Gold Bar's for Sphinx Hat."; + close; +L3: + mes "[Pac]"; + mes "Stop by some other time with the right materials, so I can make the hats for you."; + close; +} + + +//these scripts make our brothers to appear and disappear in order +- script EDZac -1,{ +OnInit: +OnMinute15: + disablenpc "Zac"; + end; +OnMinute01: + if(rand(2)) end; + enablenpc "Zac"; + end; +} + +- script EDJac -1,{ +OnInit: +OnMinute30: + disablenpc "Jac"; + end; +OnMinute16: + if(rand(2)) end; + enablenpc "Jac"; + end; +} + +- script EDPac -1,{ +OnInit: +OnMinute45: + disablenpc "Pac"; + end; +OnMinute31: + if(rand(2)) end; + enablenpc "Pac"; + end; +} + +- script EDBlac -1,{ +OnInit: +OnMinute00: + disablenpc "Blac"; + end; +OnMinute46: + if(rand(2)) end; + enablenpc "Blac"; + end; +} diff --git a/npc/custom/quests/hunting_missions.txt b/npc/custom/quests/hunting_missions.txt new file mode 100644 index 000000000..438444a14 --- /dev/null +++ b/npc/custom/quests/hunting_missions.txt @@ -0,0 +1,277 @@ +//===== rAthena Script ======================================= +//= Hunting Missions +//===== By: ================================================== +//= Euphy +//===== Current Version: ===================================== +//= 1.2b +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Random hunting missions. +//= Rewards are based on quest difficulty. +//============================================================ + +prontera,152,187,6 script Hunting Missions 951,{ +function Chk; function Cm; + mes "[Hunting Missions]"; + mes "Hello, "+strcharinfo(0)+"!"; + if (!#Mission_Delay) { + next; + mes "[Hunting Missions]"; + mes "I can't find any records..."; + mes "You must be new here!"; + emotion e_omg; + next; + callsub Mission_Info; + emotion e_go; + set #Mission_Delay,1; + close; + } + mes rand(2)?"Working hard, as always...":"Not slacking, I hope..."; + mes "Is there anything I can help"; + mes "you with?"; + mes " "; + mes "^777777~ You've completed ^0055FF"+Mission_Total+"^777777 mission"+((Mission_Total == 1)?"":"s")+". ~^000000"; + next; + switch(select(((!Mission0)?" ~ New Mission::":": ~ Mission Status: ~ Abandon Mission")+": ~ Information: ~ Mission Shop: ~ View Top Hunters: ~ ^777777Cancel^000000")) { + case 1: + mes "[Hunting Missions]"; + if (#Mission_Count) { + mes "You've started a mission"; + mes "on another character."; + close; + } + if (#Mission_Delay > gettimetick(2) && .Delay) { + set .@i, #Mission_Delay-gettimetick(2); + if (.@i > 3600) set .@j$, (.@i/3600)+" hour"+(((.@i/3600) == 1)?"":"s"); + else if (.@i > 60) set .@j$, (.@i/60)+" minute"+(((.@i/60) == 1)?"":"s"); + else set .@j$, (.@i)+" second"+((.@i == 1)?"":"s"); + mes "I'm afraid you'll have to wait "+.@j$+" before taking another mission."; + close; + } + mes "You must hunt:"; + query_sql("SELECT ID FROM mob_db WHERE left(Sprite, 4) != 'meta' AND left(Sprite, 2) != 'E_' AND ~Mode & 32 AND EXP > 0 AND MVP1id = 0 AND DropCardid > 4000 AND DropCardid < 5000 AND ID < 2000 ORDER BY rand() LIMIT "+.Quests, .@mob); + for (set .@i,0; .@i<.Quests; set .@i,.@i+1) { + setd "Mission"+.@i, .@mob[.@i]; + setd "Mission"+.@i +"_",0; + } + set #Mission_Count, rand(.Count[0],.Count[1]); + callsub Mission_Status; + next; + mes "[Hunting Missions]"; + mes "Report back when"; + mes "you've finished."; + mes "Good luck!"; + close; + case 2: + mes "[Hunting Missions]"; + mes "Mission status:"; + callsub Mission_Status; + close; + case 3: + mes "[Hunting Missions]"; + mes "Do you really want to"; + mes "abandon your mission?"; + if (.Delay) mes "Your delay time will not be reset."; + next; + switch(select(" ~ Abandon...: ~ ^777777Cancel^000000")) { + case 1: + mes "[Hunting Missions]"; + mes "Alright, I've dropped"; + mes "your current mission."; + specialeffect2 EF_STORMKICK4; + for(set .@i,0; .@i<.Quests; set .@i,.@i+1) { + setd "Mission"+.@i,0; + setd "Mission"+.@i+"_",0; + } + set #Mission_Count,0; + if (.Delay) set #Mission_Delay, gettimetick(2)+(.Delay*3600); + close; + case 2: + mes "[Hunting Missions]"; + mes "I knew you were kidding!"; + mes "Keep up the good work."; + emotion e_heh; + close; + } + case 4: + callsub Mission_Info; + close; + case 5: + mes "[Hunting Missions]"; + mes "You have ^0055FF"+#Mission_Points+"^000000 Mission Points."; + mes "Use them well!"; + callshop "mission_shop",1; + npcshopattach "mission_shop"; + end; + case 6: + mes "[Hunting Missions]"; + mes "The top hunters are:"; + query_sql("SELECT char_id AS id, (SELECT `name` FROM `char` WHERE char_id = id),`value` FROM `global_reg_value` WHERE str = 'Mission_Total' ORDER BY CAST(`value` AS SIGNED) DESC LIMIT 5",.@id,.@name$,.@val); + for(set .@i,0; .@i<5; set .@i,.@i+1) + mes " [Rank "+(.@i+1)+"] "+((.@name$[.@i] == "")?"^777777none":"^0055FF"+.@name$[.@i]+"^000000 : ^FF0000"+.@val[.@i]+" pt.")+"^000000"; + close; + case 7: + mes "[Hunting Missions]"; + mes "Nothing? Okay..."; + emotion e_hmm; + close; + } + +Mission_Status: + set @f,0; + deletearray .@j[0], getarraysize(.@j); + for(set .@i,0; .@i<.Quests; set .@i,.@i+1) { + set .@j[.@i], getd("Mission"+.@i); + set .@j[.Quests], .@j[.Quests]+strmobinfo(3,.@j[.@i]); + set .@j[.Quests+1], .@j[.Quests+1]+(strmobinfo(6,.@j[.@i])/(getbattleflag("base_exp_rate")/100)*.Modifier[0]); + set .@j[.Quests+2], .@j[.Quests+2]+(strmobinfo(7,.@j[.@i])/(getbattleflag("job_exp_rate")/100)*.Modifier[1]); + mes " > "+Chk(getd("Mission"+.@i+"_"),#Mission_Count)+strmobinfo(1,.@j[.@i])+" ("+getd("Mission"+.@i+"_")+"/"+#Mission_Count+")^000000"; + } + + // Reward formulas: + set .@Mission_Points, 3+(.@j[.Quests]/.Quests/6); + set .@Base_Exp, #Mission_Count*.@j[.Quests+1]/5; + set .@Job_Exp, #Mission_Count*.@j[.Quests+2]/5; + set .@Zeny, #Mission_Count*.Quests*.@j[.@i]*.Modifier[2]; + + next; + mes "[Hunting Missions]"; + mes "Mission rewards:"; + mes " > Mission Points: ^0055FF"+.@Mission_Points+"^000000"; + mes " > Base Experience: ^0055FF"+Cm(.@Base_Exp)+"^000000"; + mes " > Job Experience: ^0055FF"+Cm(.@Job_Exp)+"^000000"; + mes " > Zeny: ^0055FF"+Cm(.@Zeny)+"^000000"; + if (@f) { set @f,0; return; } + next; + mes "[Hunting Missions]"; + mes "Oh, you're done!"; + mes "Good work."; + mes "Here's your reward."; + emotion e_no1; + specialeffect2 EF_ANGEL; + specialeffect2 EF_TRUESIGHT; + set #Mission_Points, #Mission_Points+.@Mission_Points; + set BaseExp, BaseExp+.@Base_Exp; + set JobExp, JobExp+.@Job_Exp; + set Zeny, Zeny+.@Zeny; + for(set .@i,0; .@i<.Quests; set .@i,.@i+1) { + setd "Mission"+.@i,0; + setd "Mission"+.@i+"_",0; + } + set #Mission_Count,0; + if (.Delay) set #Mission_Delay, gettimetick(2)+(.Delay*3600); + set Mission_Total, Mission_Total+1; + if (Mission_Total == 1) query_sql("INSERT INTO `global_reg_value` (`char_id`,`str`,`value`,`type`,`account_id`) VALUES ("+getcharid(0)+",'Mission_Total','1',3,0)"); + else query_sql("UPDATE `global_reg_value` SET `value` = "+Mission_Total+" WHERE char_id = "+getcharid(0)+" AND `str` = 'Mission_Total'"); + close; + +Mission_Info: + mes "[Hunting Missions]"; + mes "If you so choose, I can assign"; + mes "you a random hunting quest."; + mes "Some are easier than others, but"; + mes "the rewards increase with difficulty."; + next; + mes "[Hunting Missions]"; + mes "Missions points are shared"; + mes "amongst all your characters."; + if (.Delay) mes "Delay time is, too."; + mes "You can't take missions on"; + mes "multiple characters at once."; + next; + mes "[Hunting Missions]"; + mes "You can start a quest"; + if (.Delay) mes "every "+((.Delay == 1)?"hour.":.Delay+" hours."); + else mes "whenever you want."; + mes "That's everything~"; + return; + +function Chk { + if (getarg(0) < getarg(1)) { set @f,1; return "^FF0000"; } + else return "^00FF00"; } + +function Cm { + set .@str$, getarg(0); + for(set .@i,getstrlen(.@str$)-3; .@i>0; set .@i,.@i-3) + set .@str$, insertchar(.@str$,",",.@i); + return .@str$; } + +OnBuyItem: + set @cost,0; + for(set .@i,0; .@i<getarraysize(@bought_nameid); set .@i,.@i+1) + for(set .@j,0; .@j<getarraysize(.Shop); set .@j,.@j+2) + if (@bought_nameid[.@i] == .Shop[.@j]) { + set @cost, @cost+(.Shop[.@j+1]*@bought_quantity[.@i]); + break; + } + mes "[Hunting Missions]"; + if (@cost > #Mission_Points) mes "You don't have enough Mission Points."; + else { + for(set .@i,0; .@i<getarraysize(@bought_nameid); set .@i,.@i+1) { + getitem @bought_nameid[.@i], @bought_quantity[.@i]; + dispbottom "Purchased "+@bought_quantity[.@i]+"x "+getitemname(@bought_nameid[.@i])+"."; + } + set #Mission_Points, #Mission_Points-@cost; + mes "Deal completed."; + emotion e_cash; + } + set @cost,0; + deletearray @bought_nameid[0], getarraysize(@bought_nameid); + deletearray @bought_quantity[0], getarraysize(@bought_quantity); + close; + +OnNPCKillEvent: + if (!getcharid(1) || !.Party) { + if (!#Mission_Count || !Mission0) end; + for (set .@i, 0; .@i<.Quests; set .@i,.@i+1) { + if (strmobinfo(1,killedrid) == strmobinfo(1,getd("Mission"+.@i))) { + if (getd("Mission"+.@i+"_") < #Mission_Count) { + dispbottom "[Hunting Mission] Killed "+(set(getd("Mission"+.@i+"_"),getd("Mission"+.@i+"_")+1))+" of "+#Mission_Count+" "+strmobinfo(1,killedrid)+"."; + end; + } + } + } + } else if (.Party) { + set .@mob, killedrid; + getmapxy(.@map1$,.@x1,.@y1,0); + getpartymember getcharid(1),1; + getpartymember getcharid(1),2; + for(set .@i,0; .@i<$@partymembercount; set .@i,.@i+1) { + if (isloggedin($@partymemberaid[.@i], $@partymembercid[.@i])) { + attachrid $@partymemberaid[.@i]; + if (#Mission_Count && Mission0 && HP > 0) { + getmapxy(.@map2$,.@x2,.@y2,0); + if ((.@map1$ == .@map2$ || .Party == 1) && (distance(.@x1,.@y1,.@x2,.@y2) <= 30 || .Party < 3)) { + for(set .@j,0; .@j<.Quests; set .@j,.@j+1) { + if (strmobinfo(1,.@mob) == strmobinfo(1,getd("Mission"+.@j))) { + if (getd("Mission"+.@j+"_") < #Mission_Count) { + dispbottom "[Hunting Mission] Killed "+(set(getd("Mission"+.@j+"_"),getd("Mission"+.@j+"_")+1))+" of "+#Mission_Count+" "+strmobinfo(1,.@mob)+"."; + break; + } + } + } + } + } + } + } + } + end; + +OnInit: + set .Delay,12; // Quest delay, in hours (0 to disable). + set .Quests,4; // Number of subquests per mission (increases rewards). + set .Party,3; // Party options: 0 (exclude party kills), 1 (include party kills), 2 (same map only), 3 (screen area only) + setarray .Count[0], // Min and max monsters per subquest (increases rewards). + 40,70; + setarray .Modifier[0], // Multipliers for Base Exp, Job Exp, and Zeny rewards. + getbattleflag("base_exp_rate")/100,getbattleflag("job_exp_rate")/100,60; + setarray .Shop[0], // Reward items: <ID>,<point cost> (about 10~20 points per hunt). + 512,1,513,1,514,1,538,5,539,5,558,10,561,10; + + npcshopdelitem "mission_shop",512; + for(set .@i,0; .@i<getarraysize(.Shop); set .@i,.@i+2) + npcshopadditem "mission_shop", .Shop[.@i], .Shop[.@i+1]; + end; +} +- shop mission_shop -1,512:-1
\ No newline at end of file diff --git a/npc/custom/quests/jewel_case.txt b/npc/custom/quests/jewel_case.txt new file mode 100644 index 000000000..dfa52bdf6 --- /dev/null +++ b/npc/custom/quests/jewel_case.txt @@ -0,0 +1,66 @@ +//===== rAthena Script ======================================= +//= Jewel Case Quest +//===== By: ================================================== +//= Lupus +//===== Current Version: ===================================== +//= 1.0 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= A quest for players at base level 99, +//= with Jewel Case as a reward. +//===== Additional Comments: ================================= +//= +//============================================================ + +lighthalzen,108,229,2 script La Fenn 766,{ + mes "[La Fenn]"; + if(BaseLevel<99) { + if(Q_99LVL) { + mes "You... You got younger!!! But you are defenitely YOU!"; + mes "I couldn't think you were able to meet my condition..."; + emotion e_hmm; + next; + mes "[La Fenn]"; + mes "Here is your prize. It's yours for good."; + set Q_99LVL,0; + getitem 12106,1; //Jewel Case + emotion e_grat; + } else { + mes callfunc("F_Hi"); + mes "..."; + emotion e_yawn; + next; + mes "[La Fenn]"; + mes "I've got a riddle for a strong man of 2nd Class and 99 Base Level."; + mes "*Yawn* If you meet some, please tell them about my riddle."; + } + close; + } + if(BaseLevel==99 && Upper==0) { + if(Q_99LVL) { + mes "Now go forth and get younger!"; + mes "If you solve my riddle, then I'll give you a magical Jewel Case with a rare accessory."; + } else { + mes callfunc("F_Hi")+" The Hero!"; + if(BaseExp<1000000) { + mes "Now you're strong."; + mes "But... not quite strong for my riddle."; + if(rand(2)) { + mes "Kill "+((1000000-BaseExp)/3765+1)+" more Seals and return."; + } else { + mes "Kill "+((1000000-BaseExp)/81+1)+" more Poporings and come back."; + } + } else { + mes "Now you're REALLY strong."; + mes "And if you get younger than now I'll give you my treasure."; + set Q_99LVL,1; + emotion e_no1; + } + } + close; + } + emotion e_hmm; + mes "..."; + close; +} diff --git a/npc/custom/quests/kaho_balmung.txt b/npc/custom/quests/kaho_balmung.txt new file mode 100644 index 000000000..f3a82def4 --- /dev/null +++ b/npc/custom/quests/kaho_balmung.txt @@ -0,0 +1,51 @@ +//===== rAthena Script ======================================= +//= Balmung & Lord Kaho's Horns Quest +//===== By: ================================================== +//= MagicalTux +//===== Current Version: ===================================== +//= 1.1 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Custom quests for Balmung and Lord Kaho's Horns. +//= WARNING: The quests are very easy, so be careful! +//===== Additional Comments: ================================= +//= 1.1 Cleaned and optimized. [Euphy] +//============================================================ + +prontera,158,356,4 script Royal Messenger 105,{ + + setarray .@Req1[0],1161,999,120,984,10,996,10,994,10,995,10,997,10; + setarray .@Req2[0],5013,2298,1,1001,10,996,10,994,10,995,10,997,10; + + mes "[Royal Messenger]"; + mes "Welcome to Prontera."; + mes "I am the messenger in charge of the Royal Quests."; + next; + if(select("Listen...:Walk away")==2) close; + mes "[Royal Messenger]"; + mes "There are two quests."; + mes "Choose the one you like."; + next; + set .@i, select("Balmung:Lord Kaho's Horns:^777777Never mind.^000000"); + mes "[Royal Messenger]"; + if (.@i==3) { + mes "Have a nice day."; + close; } + mes "You will need the following items:"; + for(set .@j,1; .@j<13; set .@j,.@j+2) { + mes " ~ "+getd(".@Req"+.@i+"["+(.@j+1)+"]")+"x ^0055FF"+getitemname(getd(".@Req"+.@i+"["+.@j+"]"))+"^000000"; + if (!.@nr && countitem(getd(".@Req"+.@i+"["+.@j+"]")) < getd(".@Req"+.@i+"["+(.@j+1)+"]")) set .@nr,1; } + mes " ~ 1,000,000z"; + next; + mes "[Royal Messenger]"; + if (.@nr || Zeny < 1000000) { + mes "Come back when you meet all the requirements."; + close; } + for(set .@j,1; .@j<13; set .@j,.@j+2) + delitem getd(".@Req"+.@i+"["+.@j+"]"), getd(".@Req"+.@i+"["+(.@j+1)+"]"); + set Zeny, Zeny-1000000; + mes "I see you already have all the items you need. Here's your "+getitemname(getd(".@Req"+.@i+"[0]"))+", as promised."; + getitem getd(".@Req"+.@i+"[0]"),1; + close; +}
\ No newline at end of file diff --git a/npc/custom/quests/kahohorn.txt b/npc/custom/quests/kahohorn.txt new file mode 100644 index 000000000..697047821 --- /dev/null +++ b/npc/custom/quests/kahohorn.txt @@ -0,0 +1,69 @@ +//===== rAthena Script ======================================= +//= Lord Kaho's Horns Quest +//===== By: ================================================== +//= +//===== Current Version: ===================================== +//= 1.1 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Custom quest for Lord Kaho's Horns. +//===== Additional Comments: ================================= +//= 1.1 Optimized, and fixed some requirements. [Euphy] +//============================================================ + +geffen,115,107,5 script Lord Kaho's Servant 61,{ + + setarray .@Items[0],7005, 968, 923, 734, 724,2268,7036,7020,5053,7018,741,742,743,750,751,752,753,754; + setarray .@Drops[0],1272,1087,1039,1260,1046,1115,1252,1147,1038,1059; + set .@n$, "[Lord Kaho's Servant]"; + + mes .@n$; + mes "I worked myself to death trying to fulfill Lord Kaho's ridiculous expectations for a headgear!"; + mes "Now that I've finally found the formula for the perfect headgear, I'm willing to share my time and talents."; + next; + mes .@n$; + mes "You need the following to get the Kaho horns:"; + mes "3x ^0055FFEmperium^000000"; + next; + mes .@n$; + mes "Oh yeah..."; + mes "I also forgot to mention these..."; + next; + mes .@n$; + for(set .@i,0; .@i<10; set .@i,.@i+1) + mes "1x ^0055FF"+getitemname(.@Items[.@i])+"^000000 (from "+strmobinfo(1,.@Drops[.@i])+")"; + next; + mes .@n$; + mes "We're not done yet, sweetie..."; + mes "I'm a big fan of dolls, so you need to bring me these cuties!"; + for(set .@i,10; .@i<18; set .@i,.@i+1) + mes "1x ^0055FF"+getitemname(.@Items[.@i])+"^000000"; + next; + mes .@n$; + mes "Finally, I've worked hard to make these horns for my master with all the items mentioned above..."; + mes "Please include ^0055FF5 million Zeny^000000 for my efforts."; + next; + mes .@n$; + mes "Are you ready for me to make this special item?"; + next; + if(select("Sure am!:These requirements are unfathomable!")==2) { + mes .@n$; + mes "What I had to go through was more unfathomable..."; + mes "If you succeed in getting these items, you will have incredible strength!"; + close; } + mes .@n$; + for(set .@i,0; .@i<18; set .@i,.@i+1) + if (!countitem(.@Items[.@i])) { set .@nr,1; break; } + if (.@nr || countitem(714) < 3 || Zeny < 5000000) { + mes "I can't afford to make this if you don't bring all materials needed. Please understand this is to benefit heroes such as yourself!"; + close; } + for(set .@i,0; .@i<18; set .@i,.@i+1) + delitem .@Items[.@i],1; + delitem 714,3; + set Zeny, Zeny-5000000; + mes "Wow! You are brave indeed!"; + getitem 5013,1; + mes "Enjoy being God of Rune-Midgard!"; + close; +}
\ No newline at end of file diff --git a/npc/custom/quests/kings_items.txt b/npc/custom/quests/kings_items.txt new file mode 100644 index 000000000..8140827c1 --- /dev/null +++ b/npc/custom/quests/kings_items.txt @@ -0,0 +1,79 @@ +//===== rAthena Script ======================================= +//= Event King Items +//===== By: ================================================== +//= $ephiroth +//===== Current Version: ===================================== +//= 1.1 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Grand Circlet Quest combined with Excalibur Quest. +//===== Additional Comments: ================================= +//= 2006/09/27: 1.0 Release and fully working. [$ephiroth] +//= 1.1 Optimized. [Euphy] +//============================================================ + +prt_castle,80,170,4 script King of Prontera 108,{ + mes "[King of Prontera]"; + mes "Hello, can you help me?"; + next; + if(select("Sure, what can I do?:Sorry, I'm busy.")==2) { + mes "[King of Prontera]"; + mes "Ok, that's fine, I'm sure someone else will help."; + close; } + mes "[King of Prontera]"; + mes "Thank you. Well, my daughter next to me is a little rowdy..."; + mes "If you get her these items I'm sure she'll calm down."; + mes "I'll give you my crown or my sword as a reward."; + next; + setarray .@Items1[0],5007,742,30,741,50,753,20,732,1,710,20,629,20; + setarray .@Items2[0],1137,2254,1,2282,1,714,1; + switch(select("What do you need?:I have the items!:Forget it.")) { + case 1: + for(set .@i,1; .@i<3; set .@i,.@i+1) { + mes "[King of Prontera]"; + mes "If you could get me:"; + for(set .@j,1; .@j<getarraysize(getd(".@Items"+.@i)); set .@j,.@j+2) + mes " ~ ^0055FF"+getd(".@Items"+.@i+"["+(.@j+1)+"]")+"^000000x "+getitemname(getd(".@Items"+.@i+"["+.@j+"]")); + mes "I'll give my "+((.@i)?"sword.":"crown."); + if (.@i==2) close; + next; } + case 2: + mes "[King of Prontera]"; + mes "What item do you want?"; + next; + set .@i, select("Crown:Sword"); + for(set .@j,1; .@j<getarraysize(getd(".@Items"+.@i)); set .@j,.@j+2) + if (countitem(getd(".@Items"+.@i+"["+.@j+"]")) < getd(".@Items"+.@i+"["+(.@j+1)+"]")) set .@nr,1; + mes "[King of Prontera]"; + if (.@nr) { + mes "You're missing something."; + mes "Come back after you get ALL the items."; + close; } + for(set .@j,1; .@j<getarraysize(getd(".@Items"+.@i)); set .@j,.@j+2) + delitem getd(".@Items"+.@i+"["+.@j+"]"), getd(".@Items"+.@i+"["+(.@j+1)+"]"); + getitem getd(".@Items"+.@i+"[0]"),1; + mes "THANK YOU SOO MUCH!!"; + mes "This will surely calm her down."; + mes "As promised, here is my "+((.@i==1)?"crown.":"sword."); + close; + case 3: + mes "[King of Prontera]"; + mes "Ok, that's fine, I'm sure someone else will help."; + close; + } +} + +prt_castle,84,170,4 script King's Daughter 62,{ + mes "[King's Daughter]"; + mes "Hmph, I hate my dad right now!!"; + next; + if(select("Why?:Whatever...")==2) { + mes "[King's Daughter]"; + mes "FINE THEN! Hmph!!"; + close; } + mes "[King's Daughter]"; + mes "Well, he won't give me what I want!!"; + mes "He's the King of Prontera. He should be able to get me ANYTHING!!!"; + close; +}
\ No newline at end of file diff --git a/npc/custom/quests/may_hats.txt b/npc/custom/quests/may_hats.txt new file mode 100644 index 000000000..10319ae6a --- /dev/null +++ b/npc/custom/quests/may_hats.txt @@ -0,0 +1,180 @@ +//===== rAthena Script ======================================= +//= Quests: Bird Nest, Lion Mask, Skeleton Manteau, +//= Fashion Hip Sack & Sales Banner +//===== By: ================================================== +//= Lupus +//===== Current Version: ===================================== +//= 1.01 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Custom quest for some RO mobile game bonus items +//===== Additional Comments: ================================= +//= 1 May, 2006 +//= 1.01 translated the rest of dialogues +//============================================================ + +gonryun,187,140,4 script Yakima 850,{ + mes "[Yakima]"; + mes callfunc("F_Hi"); + mes "I can make some items for you."; + mes "They are quite rare novadays..."; + specialeffect 417; + next; + menu "Bird Nest",-,"Lion Mask",M_2,"Skeleton Manteau",M_3,"Fashion Hip Sack",M_4,"Sales Banner",M_5,"Leave",M_EXIT; + + mes "[Yakima]"; + mes "Oh.. it's an excellent item for any beast hunter."; + emotion e_rock; + next; + mes "[Yakima]"; + mes "For the hat I'll need:"; + mes "1 Sombrero,"; + mes "920 Feathers of Birds and"; + mes "310 Bills of Birds."; + next; + mes "[Yakima]"; + mes "Do you have all the items?"; + next; + menu "Yeah.",-,"Nay.",M_EXIT; + + if(countitem(5067) < 1 || countitem(916) < 920 || countitem(925) < 310) GOTO L_NOITEM;//Items: Sombrero, Feather_of_Birds, Bill_of_Birds, + delitem 5067,1;//Items: Sombrero, + delitem 916,920;//Items: Feather_of_Birds, + delitem 925,310;//Items: Bill_of_Birds, + getitem 5129,1;//Items: Bird_Nest, + mes "[Yakima]"; + mes "Thank you very very much!"; + mes callfunc("F_Bye"); + close; + +M_2: + mes "[Yakima]"; + mes "Bingo! Many people are afraid of lions... to the muteness..."; + emotion e_slur; + next; + mes "[Yakima]"; + mes "For the hat I'll need:"; + mes "1 Tiger Mask,"; + mes "10 Tiger's Footskins,"; + mes "30 Tiger Skins and"; + mes "300 Tiger Panties."; + next; + mes "[Yakima]"; + mes "Do you have all the items?"; + next; + menu "Yeah.",-,"Nay.",M_EXIT; + + if(countitem(5098) < 1 || countitem(1030) < 10 || countitem(1029) < 30 || countitem(7267) < 300) GOTO L_NOITEM;//Items: Tiger_Mask, Tiger_Skin, Tiger's_Footskin, Tiger_Panty, + delitem 5098,1;//Items: Tiger_Mask, + delitem 1030,10;//Items: Tiger's_Footskin, + delitem 1029,30;//Items: Tiger_Skin, + delitem 7267,300;//Items: Tiger_Panty, + getitem 5130,1;//Items: Lion_Mask, + mes "[Yakima]"; + mes "Thank you very very much!"; + mes callfunc("F_Bye"); + close; + +M_3: + mes "[Yakima]"; + mes "I wish I sold this filthy manteau faster..."; + mes "Guess it isn't so plain as it looks... Hmm."; + emotion e_wah; + next; + mes "[Yakima]"; + mes "I'm giving it almost for free:"; + mes "10 Old Manteaus,"; + mes "3 Skull Rings,"; + mes "2 Manteau[1] and"; + mes "1 Ragamuffin Manteau."; + next; + mes "[Yakima]"; + mes "Do you have all the items?"; + next; + menu "Yeah.",-,"Nay.",M_EXIT; + + if(countitem(2508) < 1 || countitem(2506) < 2 || countitem(2609) < 3 || countitem(7207) < 10) GOTO L_NOITEM;//Items: Ragamuffin_Manteau, Manteau_, Skull_Ring, Old_Manteau, + delitem 2508,1;//Items: Ragamuffin_Manteau, + delitem 2506,2;//Items: Manteau_, + delitem 2609,3;//Items: Skull_Ring, + delitem 7207,10;//Items: Old_Manteau, + getitem 2511,1;//Items: Skeleton_Manteau, + mes "[Yakima]"; + mes "Thank you very very much!"; + mes callfunc("F_Bye"); + close; + +M_4: + mes "[Yakima]"; + mes "It's a fresh style! Ancessory and a bag all in one! You'd get +2 STR... It's different from that sabby nest!"; + mes "It fits to Merchant classonly."; + emotion e_heh; + next; + mes "[Yakima]"; + mes "Now my stock is full of those bags... So I'll make it from 3 flower things and a rough piece of clothes:"; + mes "3 Romantic Flowers,"; + mes "3 Fancy Flowers,"; + mes "2 Flower Rings and"; + mes "3 Pirate Bandanas."; + next; + mes "[Yakima]"; + mes "Do you have all the items?"; + next; + menu "Yeah.",-,"Nay.",M_EXIT; + + if(countitem(2269) < 3 || countitem(2207) < 3 || countitem(2612) < 2 || countitem(2287)<3 ) GOTO L_NOITEM;//Items: Romantic_Flower, Fancy_Flower, Flower_Ring, + delitem 2269,3;//Items: Romantic_Flower, + delitem 2207,3;//Items: Fancy_Flower, + delitem 2612,2;//Items: Flower_Ring, + delitem 2287,3;//Items: Pirate_Bandana + getitem 2641,1;//Items: Fashion_Hip_Sack, + mes "[Yakima]"; + mes "Thank you very very much!"; + mes callfunc("F_Bye"); + close; + +M_5: + mes "[Yakima]"; + mes "Well, well, well... this sign fits any class from a certain level!"; + mes "Your foes'd be dazzled!"; + emotion e_no1; + next; + mes "[Yakima]"; + mes "Well... we construct it from some common items:"; + mes "1 Scarlet Dyestuffs,"; + mes "1 Orange Dyestuffs,"; + mes "2 Stop Posts,"; + mes "3 Clown Noses,"; + mes "180 Fig Leaves and"; + mes "20 Solid Peaches."; + next; + mes "[Yakima]"; + mes "Do you have all the items?"; + next; + menu "Yeah.",-,"Nay.",M_EXIT; + + if(countitem(975) < 1 || countitem(980) < 1 || countitem(2272) < 2 || countitem(2262) < 3 || countitem(7298) < 180 || countitem(7164) < 20) GOTO L_NOITEM;//Items: Scarlet_Dyestuff, Orange_Dyestuff, Stop_Post, Clown_Nose, Fig_Leaf, Solid_Peach, + delitem 975,1;//Items: Scarlet_Dyestuff, + delitem 980,1;//Items: Orange_Dyestuff, + delitem 2272,2;//Items: Stop_Post, + delitem 2262,3;//Items: Clown_Nose, + delitem 7298,180;//Items: Fig_Leaf, + delitem 7164,20;//Items: Solid_Peach, + getitem 5100,1;//Items: Sales_Banner, + mes "[Yakima]"; + mes "Thank you very very much!"; + mes callfunc("F_Bye"); + close; + +L_NOITEM: + mes "[Yakima]"; + mes "You are lack of items. Please, get all the items."; + emotion e_sry; + close; + +M_EXIT: + mes "[Yakima]"; + mes callfunc("F_Bye"); + close; +} diff --git a/npc/custom/quests/quest_shop.txt b/npc/custom/quests/quest_shop.txt new file mode 100644 index 000000000..539c29f23 --- /dev/null +++ b/npc/custom/quests/quest_shop.txt @@ -0,0 +1,222 @@ +//===== rAthena Script ======================================= +//= Euphy's Quest Shop +//===== By: ================================================== +//= Euphy +//===== Current Version: ===================================== +//= 1.6 +//===== Compatible With: ===================================== +//= rAthena SVN r16862+ +//===== Description: ========================================= +//= A dynamic quest shop based on Lunar's, with easier config. +//= Includes support for multiple shops & cashpoints. +//= Item Preview script by ToastOfDoom. +//============================================================ + +// Shop NPCs -- supplying no argument displays entire menu. +// callfunc "qshop"{,<shop ID>{,<shop ID>{,...}}}; +//============================================================ +prontera,164,203,6 script Quest Shop#1 998,{ callfunc "qshop"; } + + +// Script Core +//============================================================ +- script quest_shop -1,{ +function Add; function Chk; function Slot; function A_An; +OnInit: + freeloop(1); + +// ----------------------------------------------------------- +// Basic shop settings. +// ----------------------------------------------------------- + + set .Announce,1; // Announce quest completion? (1: yes / 0: no) + set .ShowSlot,1; // Show item slots? (2: all equipment / 1: if slots > 0 / 0: never) + set .ShowID,0; // Show item IDs? (1: yes / 0: no) + set .ShowZeny,0; // Show Zeny cost, if any? (1: yes / 0: no) + set .MaxStack,100; // Max number of quest items purchased at one time. + +// ----------------------------------------------------------- +// Points variable -- optional quest requirement. +// setarray .Points$[0],"<variable name>","<display name>"; +// ----------------------------------------------------------- + + setarray .Points$[0],"#CASHPOINTS","Cash Points"; + +// ----------------------------------------------------------- +// Shop IDs -- to add shops, copy dummy data at bottom of file. +// setarray .Shops$[1],"<Shop 1>","<Shop 2>"{,...}; +// ----------------------------------------------------------- + + setarray .Shops$[1],"Headgears","Weapons","Other"; + +// ----------------------------------------------------------- +// Quest items -- do NOT use a reward item more than once! +// Add(<shop ID>,<reward ID>,<reward amount>, +// <Zeny cost>,<point cost>, +// <required item ID>,<required item amount>{,...}); +// ----------------------------------------------------------- + + Add(1,5022,1,0,0,7086,1,969,10,999,40,1003,50,984,2); + Add(1,5032,1,0,0,1059,250,2221,1,2227,1,7063,600); + Add(1,5027,1,0,0,2252,1,1036,400,7001,50,4052,1); + Add(1,5045,1,0,0,2252,1,1054,450,943,1200); + + Add(2,1224,1,0,0,7297,30,969,10,999,50,714,10); + Add(2,1225,1,0,0,7292,30,969,10,999,50,714,10); + + Add(3,531,1,3,0,512,1,713,1); + Add(3,532,1,3,0,513,1,713,1); + Add(3,533,1,3,0,514,1,713,1); + Add(3,534,1,3,0,515,1,713,1); + +// ----------------------------------------------------------- + + freeloop(0); + set .menu$,""; + for(set .@i,1; .@i<=getarraysize(.Shops$); set .@i,.@i+1) { + set .menu$, .menu$+.Shops$[.@i]+":"; + npcshopdelitem "qshop"+.@i,909; + } + end; + +OnMenu: + set .@size, getarraysize(@i); + if (!.@size) set .@i, select(.menu$); + else if (.@size == 1) set .@i, @i[0]; + else { + for(set .@j,0; .@j<.@size; set .@j,.@j+1) + set .@menu$, .@menu$+.Shops$[@i[.@j]]+":"; + set .@i, @i[select(.@menu$)-1]; + } + deletearray @i[0],getarraysize(@i); + if (.Shops$[.@i] == "") { + message strcharinfo(0),"An error has occurred."; + end; + } + dispbottom "Select one item at a time."; + callshop "qshop"+.@i,1; + npcshopattach "qshop"+.@i; + end; + +OnBuyItem: + // .@q[] : RewardID, BoughtAmt, RewardAmt, BaseAmt, ReqZeny, ReqPts, { ReqItem, ReqAmt, ... } + setarray .@q[0],@bought_nameid[0],((@bought_quantity[0] > .MaxStack)?.MaxStack:@bought_quantity[0]); + copyarray .@q[3],getd(".q_"+.@q[0]+"[0]"),getarraysize(getd(".q_"+.@q[0])); + set .@q[2],.@q[1]*.@q[3]; + if (!.@q[2] || .@q[2] > 30000) { + message strcharinfo(0),"You can't purchase that many "+getitemname(.@q[0])+"."; + end; + } + mes "[Quest Shop]"; + mes "Reward: ^0055FF"+((.@q[2] > 1)?.@q[2]+"x ":"")+Slot(.@q[0])+"^000000"; + mes "Requirements:"; + if (.@q[4]) mes " > "+Chk(Zeny,.@q[4]*.@q[1])+(.@q[4]*.@q[1])+" Zeny^000000"; + if (.@q[5]) mes " > "+Chk(getd(.Points$[0]),.@q[5]*.@q[1])+(.@q[5]*.@q[1])+" "+.Points$[1]+" ("+getd(.Points$[0])+"/"+(.@q[5]*.@q[1])+")^000000"; + if (.@q[6]) for(set .@i,6; .@i<getarraysize(.@q); set .@i,.@i+2) + mes " > "+Chk(countitem(.@q[.@i]),.@q[.@i+1]*.@q[1])+((.ShowID)?"{"+.@q[.@i]+"} ":"")+Slot(.@q[.@i])+" ("+countitem(.@q[.@i])+"/"+(.@q[.@i+1]*.@q[1])+")^000000"; + next; + setarray @qe[1], getiteminfo(.@q[0],5), getiteminfo(.@q[0],11); + if (((@qe[1] & 1) || (@qe[1] & 256) || (@qe[1] & 512)) && @qe[2] > 0) + set .@preview,1; + addtimer 1000, strnpcinfo(0)+"::OnEnd"; + while(1) { + switch(select(" ~ Purchase ^0055FF"+getitemname(.@q[0])+"^000000:"+((.@preview && !@qe[6])?" ~ Preview...":"")+": ~ ^777777Cancel^000000")) { + case 1: + if (@qe[0]) { + mes "[Quest Shop]"; + mes "You're missing one or more quest requirements."; + close; + } + if (!checkweight(.@q[0],.@q[2])) { + mes "[Quest Shop]"; + mes "^FF0000You need "+(((.@q[2]*getiteminfo(.@q[0],6))+Weight-MaxWeight)/10)+" additional weight capacity to complete this trade.^000000"; + close; + } + if (.@q[4]) set Zeny, Zeny-(.@q[4]*.@q[1]); + if (.@q[5]) setd .Points$[0], getd(.Points$[0])-(.@q[5]*.@q[1]); + if (.@q[6]) for(set .@i,6; .@i<getarraysize(.@q); set .@i,.@i+2) + delitem .@q[.@i],.@q[.@i+1]*.@q[1]; + getitem .@q[0],.@q[2]; + if (.Announce) announce strcharinfo(0)+" has created "+((.@q[2] > 1)?.@q[2]+"x "+getitemname(.@q[0]):A_An(getitemname(.@q[0])))+"!",0; + specialeffect2 699; + close; + case 2: + setarray @qe[3], getlook(LOOK_HEAD_BOTTOM), getlook(LOOK_HEAD_TOP), getlook(LOOK_HEAD_MID), 1; + if (@qe[1] & 1) changelook LOOK_HEAD_BOTTOM, @qe[2]; + if (@qe[1] & 256) changelook LOOK_HEAD_TOP, @qe[2]; + if (@qe[1] & 512) changelook LOOK_HEAD_MID, @qe[2]; + break; + case 3: + close; + } + } + +OnEnd: + if (@qe[6]) { + changelook LOOK_HEAD_BOTTOM, @qe[3]; + changelook LOOK_HEAD_TOP, @qe[4]; + changelook LOOK_HEAD_MID, @qe[5]; + } + deletearray @qe[0],7; + end; + +function Add { + if (getitemname(getarg(1)) == "null") { + debugmes "Quest reward #"+getarg(1)+" invalid (skipped)."; + return; + } + setarray .@j[0],getarg(2),getarg(3),getarg(4); + for(set .@i,5; .@i<getargcount(); set .@i,.@i+2) { + if (getitemname(getarg(.@i)) == "null") { + debugmes "Quest requirement #"+getarg(.@i)+" invalid (skipped)."; + return; + } else + setarray .@j[.@i-2],getarg(.@i),getarg(.@i+1); + } + copyarray getd(".q_"+getarg(1)+"[0]"),.@j[0],getarraysize(.@j); + npcshopadditem "qshop"+getarg(0),getarg(1),((.ShowZeny)?getarg(3):0); + return; +} + +function Chk { + if (getarg(0) < getarg(1)) { + set @qe[0],1; + return "^FF0000"; + } else + return "^00FF00"; +} + +function Slot { + set .@s$,getitemname(getarg(0)); + switch(.ShowSlot) { + case 1: if (!getitemslots(getarg(0))) return .@s$; + case 2: if (getiteminfo(getarg(0),2) == 4 || getiteminfo(getarg(0),2) == 5) return .@s$+" ["+getitemslots(getarg(0))+"]"; + default: return .@s$; + } +} + +function A_An { + setarray .@A$[0],"a","e","i","o","u"; + set .@B$, "_"+getarg(0); + for(set .@i,0; .@i<5; set .@i,.@i+1) + if (compare(.@B$,"_"+.@A$[.@i])) return "an "+getarg(0); + return "a "+getarg(0); +} +} + +function script qshop { + deletearray @i[0],getarraysize(@i); + for(set .@i,0; .@i<getargcount(); set .@i,.@i+1) + set @i[.@i],getarg(.@i); + doevent "quest_shop::OnMenu"; + end; +} + + +// Dummy shop data -- copy as needed. +//============================================================ +- shop qshop1 -1,909:-1 +- shop qshop2 -1,909:-1 +- shop qshop3 -1,909:-1 +- shop qshop4 -1,909:-1 +- shop qshop5 -1,909:-1
\ No newline at end of file diff --git a/npc/custom/quests/questboard.txt b/npc/custom/quests/questboard.txt new file mode 100644 index 000000000..cccbea7ee --- /dev/null +++ b/npc/custom/quests/questboard.txt @@ -0,0 +1,324 @@ +//===== rAthena Script ======================================= +//= tr0n's Questboard +//===== By: ================================================== +//= tr0n +//===== Current Version: ===================================== +//= 1.4.4 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Easily add collection and hunting quests. +//===== Additional Comments: ================================= +// 1.0.0 Release +// 1.1.0 Added zeny reward +// 1.2.0 Rewrote checkmob and killcounter +// 1.3.1 Added level restriction +// 1.3.4 Added Reward Item Amount +// 1.4.4 Added Quest delay +//============================================================ + +prontera,129,215,5 script Questboard 857,{ + + if(c_run==1){ + mes "[^FF7700Questboard^000000]"; + mes "^0000FF"+getd("." + currentquest$ + "_collectionname$")+"^000000"; + mes "--------------------------------"; + for( set .@j, 0; .@j < getarraysize(getd("."+ currentquest$ + "_collectionitem")); set .@j,.@j+2) { + mes "^FF0000"+getitemname(getd("."+currentquest$+"_collectionitem["+.@j+"]"))+" - "+countitem(getd("."+currentquest$+"_collectionitem["+.@j+"]"))+"/"+getd("."+currentquest$+"_collectionitem["+(.@j+1)+"]")+" ea.^000000"; + } + mes "--------------------------------"; + mes "[Reward]"; + mes "Item: ^0000FF"+((getd("." +currentquest$+"_collectionprize"))?getitemname(getd("." +currentquest$+"_collectionprize"))+" - "+getd("." +currentquest$+"_collectionamount")+" ea.^000000":"Nothing^000000"); + mes "Zeny: ^0000FF"+getd("." +currentquest$+"_collectionzeny")+"^000000"; + mes "Base EXP: ^0000FF"+getd("." +currentquest$+"_collectionexp["+0+"]")+"^000000"; + mes "Job EXP: ^0000FF"+getd("." +currentquest$+"_collectionexp["+1+"]")+"^000000"; + next; + if(select("Finish:Abort") == 2){ + mes "[^FF7700Questboard^000000]"; + mes "Quest aborted."; + set currentquest$, ""; + set c_run, 0; + close; + } + goto L_checkitems; + } + + if(h_run==1){ + mes "[^FF7700Questboard^000000]"; + mes "^0000FF"+getd("." + currentquest$ + "_huntingname$")+"^000000"; + mes "--------------------------------"; + for( set .@j, 0; .@j < getarraysize(getd("."+ currentquest$ + "_huntingmob")); set .@j,.@j+2) { + set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@j)+"]"); + mes "^FF0000"+strmobinfo(1,getd("."+currentquest$+"_huntingmob["+.@j+"]"))+" - "+getd(currentquest$+"_"+.@currentmob+"_"+(.@j+1)+"_killcount")+"/"+getd("."+currentquest$+"_huntingmob["+(.@j+1)+"]")+" ea.^000000"; + } + mes "--------------------------------"; + mes "[Reward]"; + mes "Item: ^0000FF"+((getd("." +currentquest$+"_huntingprize"))?getitemname(getd("." +currentquest$+"_huntingprize"))+" - "+getd("." +currentquest$+"_huntingamount")+" ea.^000000":"Nothing^000000"); + mes "Zeny: ^0000FF"+getd("." +currentquest$+"_huntingzeny")+"^000000"; + mes "Base EXP: ^0000FF"+getd("." +currentquest$+"_huntingexp["+0+"]")+"^000000"; + mes "Job EXP: ^0000FF"+getd("." +currentquest$+"_huntingexp["+1+"]")+"^000000"; + next; + if(select("Finish:Abort") == 2){ + mes "[^FF7700Questboard^000000]"; + mes "Quest aborted."; + for(set .@x, 1; .@x < getarraysize(getd("."+currentquest$+"_huntingmob")); set .@x,.@x+2){ + set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@x-1)+"]"); + setd(currentquest$+"_"+.@currentmob+"_"+.@x+"_killcount", 0); + } + set currentquest$, ""; + set h_run, 0; + close; + } + goto L_checkmobs; + } + +L_questmenu: + mes "[^FF7700Questboard^000000]"; + mes "Select category:"; + next; + + switch(select((.collection)?"Collection Quests":"", + (.hunting)?"Hunting Quests":"", + "Exit")) { + +case 1: + set .@collectmenu$, ""; + for( set .@i,0; .@i < .collectionquestcount; set .@i,.@i+1) { + if (.@i) set .@collectmenu$,.@collectmenu$+":"; + set .@collectmenu$, .@collectmenu$ + "[" + getd("." +(.@i+1)+"_collectionmin") + " - " + getd("." +(.@i+1)+"_collectionmax") + "] " + getd("." + (.@i+1) + "_collectionname$"); + } + set .@selection,select(.@collectmenu$); + if(gettimetick(2) < getd(.@selection + "_collection_delay")){ + set .@time_left, getd(.@selection + "_collection_delay")-gettimetick(2); + mes "[^FF7700Questboard^000000]"; + if(.@time_left < 60) mes "You have to wait ^0000FF"+.@time_left+" seconds^000000 to do this quest again."; + if(.@time_left < 3600) mes "You have to wait ^0000FF"+.@time_left/60+" minutes^000000 to do this quest again."; + mes "You have to wait ^0000FF"+.@time_left/60/60+" hours^000000 to do this quest again."; + close; + } + mes "[^FF7700Questboard^000000]"; + mes "^0000FF"+getd("." + .@selection + "_collectionname$")+"^000000"; + mes "--------------------------------"; + for( set .@j, 0; .@j < getarraysize(getd("."+ .@selection + "_collectionitem")); set .@j,.@j+2) { + mes "^FF0000"+getitemname(getd("."+.@selection+"_collectionitem["+.@j+"]"))+" - "+getd("."+.@selection+"_collectionitem["+(.@j+1)+"]")+" ea.^000000"; + } + mes "--------------------------------"; + mes "[Reward]"; + mes "Item: ^0000FF"+((getd("." +.@selection+"_collectionprize"))?getitemname(getd("." +.@selection+"_collectionprize"))+" - "+getd("." +.@selection+"_collectionamount")+" ea.^000000":"Nothing^000000"); + mes "Zeny: ^0000FF"+getd("." +.@selection+"_collectionzeny")+"^000000"; + mes "Base EXP: ^0000FF"+getd("." +.@selection+"_collectionexp["+0+"]")+"^000000"; + mes "Job EXP: ^0000FF"+getd("." +.@selection+"_collectionexp["+1+"]")+"^000000"; + next; + if(select("Accept:Decline") == 2){ + close; + } + if(BaseLevel >= getd("." +.@selection+"_collectionmin") && BaseLevel <= getd("." +.@selection+"_collectionmax")) + { + mes "[^FF7700Questboard^000000]"; + mes "Quest accepted."; + set c_run, 1; + set currentquest$, .@selection; + close; + } + else + { + mes "[^FF7700Questboard^000000]"; + mes "You don't have the required"; + mes "level to do this quest."; + close; + } + +case 2: + set .@huntmenu$, ""; + for( set .@i,0; .@i < .huntingquestcount; set .@i,.@i+1) { + if (.@i) set .@huntmenu$,.@huntmenu$+":"; + set .@huntmenu$, .@huntmenu$ + "[" + getd("." +(.@i+1)+"_huntingmin") + " - " + getd("." +(.@i+1)+"_huntingmax") + "] " + getd("." + (.@i+1) + "_huntingname$"); + } + set .@selection,select(.@huntmenu$); + if(gettimetick(2) < getd(.@selection + "_hunting_delay")){ + set .@time_left, getd(.@selection + "_hunting_delay")-gettimetick(2); + mes "[^FF7700Questboard^000000]"; + if(.@time_left < 60) mes "You have to wait ^0000FF"+.@time_left+" seconds^000000 to do this quest again."; + if(.@time_left < 3600) mes "You have to wait ^0000FF"+.@time_left/60+" minutes^000000 to do this quest again."; + mes "You have to wait ^0000FF"+.@time_left/60/60+" hours^000000 to do this quest again."; + close; + } + mes "[^FF7700Questboard^000000]"; + mes "^0000FF"+getd("." + .@selection + "_huntingname$")+"^000000"; + mes "--------------------------------"; + for( set .@j, 0; .@j < getarraysize(getd("."+ .@selection + "_huntingmob")); set .@j,.@j+2) { + mes "^FF0000"+strmobinfo(1,getd("."+.@selection+"_huntingmob["+.@j+"]"))+" - "+getd("."+.@selection+"_huntingmob["+(.@j+1)+"]")+" ea.^000000"; + } + mes "--------------------------------"; + mes "[Reward]"; + mes "Item: ^0000FF"+((getd("." +.@selection+"_huntingprize"))?getitemname(getd("." +.@selection+"_huntingprize"))+" - "+getd("." +.@selection+"_huntingamount")+" ea.^000000":"Nothing^000000"); + mes "Zeny: ^0000FF"+getd("." +.@selection+"_huntingzeny")+"^000000"; + mes "Base EXP: ^0000FF"+getd("." +.@selection+"_huntingexp["+0+"]")+"^000000"; + mes "Job EXP: ^0000FF"+getd("." +.@selection+"_huntingexp["+1+"]")+"^000000"; + next; + if(select("Accept:Decline") == 2){ + close; + } + if(BaseLevel >= getd("." +.@selection+"_huntingmin") && BaseLevel <= getd("." +.@selection+"_huntingmax")) + { + mes "[^FF7700Questboard^000000]"; + mes "Quest accepted."; + set h_run, 1; + set currentquest$, .@selection; + close; + } + else + { + mes "[^FF7700Questboard^000000]"; + mes "You don't have the required"; + mes "level to do this quest."; + close; + } + +case 3: + close; + } + +L_checkitems: + for( set .@k,0; .@k < getarraysize(getd("."+currentquest$+"_collectionitem")); set .@k,.@k+2) { + if(countitem(getd("."+currentquest$+"_collectionitem["+.@k+"]"))>=getd("."+currentquest$+"_collectionitem["+(.@k+1)+"]")){ + set .@checkitem,.@checkitem+2; + } + } + if(.@checkitem<getarraysize(getd("."+currentquest$+"_collectionitem"))){ + mes "[^FF7700Questboard^000000]"; + mes "You don't have everything."; + close; + } + for( set .@delcount,0; .@delcount < getarraysize(getd("."+currentquest$+"_collectionitem")); set .@delcount,.@delcount+2) { + delitem getd("."+currentquest$+"_collectionitem["+.@delcount+"]"),getd("."+currentquest$+"_collectionitem["+(.@delcount+1)+"]"); + } + mes "[^FF7700Questboard^000000]"; + mes "Congratulation! Here is your Reward."; + if(getd("." +currentquest$+"_collectionprize")!=0) getitem(getd("." +currentquest$+"_collectionprize"),getd("." +currentquest$+"_collectionamount")); + set Zeny,Zeny+getd("." +currentquest$+"_collectionzeny"); + getexp getd("." +currentquest$+"_collectionexp["+0+"]"),getd("." +currentquest$+"_collectionexp["+1+"]"); + setd(currentquest$ + "_collection_delay"),gettimetick(2)+.quest_delay; + set currentquest$, ""; + set c_run, 0; + close; + +L_checkmobs: + set .@goal, (getarraysize(getd("."+currentquest$+"_huntingmob"))/2); + for(set .@i, 1; .@i < getarraysize(getd("."+currentquest$+"_huntingmob")); set .@i,.@i+2){ + set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@i-1)+"]"); + if(getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")==getd("."+currentquest$+"_huntingmob["+.@i+"]")){ + set .@checkmonster, .@checkmonster+1; + if(.@checkmonster==.@goal){ + goto L_checkmobs2; + } + continue; + } + goto L_checkmobs2; + } + +L_checkmobs2: + if(.@checkmonster<.@goal){ + mes "[^FF7700Questboard^000000]"; + mes "You didn't kill everything."; + close; + } + mes "[^FF7700Questboard^000000]"; + mes "Congratulation! Here is your Reward."; + for(set .@x, 1; .@x < getarraysize(getd("."+currentquest$+"_huntingmob")); set .@x,.@x+2){ + set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@x-1)+"]"); + setd(currentquest$+"_"+.@currentmob+"_"+.@x+"_killcount", 0); + } + if(getd("." +currentquest$+"_huntingprize")!=0) getitem(getd("." +currentquest$+"_huntingprize"),getd("." +currentquest$+"_huntingamount")); + set Zeny, Zeny+getd("." +currentquest$+"_huntingzeny"); + getexp getd("." +currentquest$+"_huntingexp["+0+"]"),getd("." +currentquest$+"_huntingexp["+1+"]"); + setd(currentquest$ + "_hunting_delay"),gettimetick(2)+.quest_delay; + set currentquest$, ""; + set h_run, 0; + close; + +OnNPCKillEvent: + if(h_run!=1) end; + for(set .@i, 1; .@i < getarraysize(getd("."+currentquest$+"_huntingmob")); set .@i,.@i+2){ + if(killedrid==getd("."+currentquest$+"_huntingmob["+(.@i-1)+"]")){ + set .@currentmob, getd("."+currentquest$+"_huntingmob["+(.@i-1)+"]"); + if(getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")>=getd("."+currentquest$+"_huntingmob["+.@i+"]")) end; + setd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount", getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")+1); + dispbottom getd("."+currentquest$+"_huntingname$")+": ["+strmobinfo(1,.@currentmob)+"] ("+ getd(currentquest$+"_"+.@currentmob+"_"+.@i+"_killcount")+"/"+getd("."+currentquest$+"_huntingmob["+.@i+"]")+")"; + end; + } + continue; + } + end; + +OnInit: + + function AddCollection; + function AddHunting; + + //Activate/Deactive quest categories here + set .collection, 1; + set .hunting, 1; + + //Quest Delay (seconds) + //24 hours = 86400 seconds + set .quest_delay, 0; + + //Checks if quests are loaded (prevents out of index) + if(.questsloaded==1) end; + set .questsloaded, 1; + + //Add Collection Quests here + //AddCollection("<Quest Name>",<Min Lvl>,<Max Lvl>,<Reward|Item ID>,<Reward|Item Amount>,<Zeny Reward>,<Base EXP>,<Job EXP>,<Item ID>,<Item Amount>,...); + + + //Add Hunting Quests here + //AddHunting("<Quest Name>",<Min Lvl>,<Max Lvl>,<Reward|Item ID>,<Reward|Item Amount>,<Zeny Reward>,<Base EXP>,<Job EXP>,<Monster ID>,<Monster Amount>,...); + + end; + + +function AddCollection { + set .collectionquestcount,.collectionquestcount+1; + setd ("." +.collectionquestcount+"_collectionname$", getarg(0)); + setd ("." +.collectionquestcount+"_collectionmin", getarg(1)); + setd ("." +.collectionquestcount+"_collectionmax", getarg(2)); + setd ("." +.collectionquestcount+"_collectionprize", getarg(3)); + setd ("." +.collectionquestcount+"_collectionamount", getarg(4)); + setd ("." +.collectionquestcount+"_collectionzeny", getarg(5)); + set .@argcount, 6; + set .@size, getarraysize(getd("."+ .collectionquestcount + "_collectionexp")); + setd ("." +.collectionquestcount+"_collectionexp["+.@size+"]",getarg(.@argcount)); + setd ("." +.collectionquestcount+"_collectionexp["+(.@size+1)+"]",getarg(.@argcount+1)); + set .@argcount, .@argcount+2; + while(getarg(.@argcount,-1)!=-1 && getarg(.@argcount+1,-1)!=-1) { + set .@size, getarraysize(getd("."+ .collectionquestcount + "_collectionitem")); + setd ("."+.collectionquestcount+"_collectionitem["+.@size+"]",getarg(.@argcount)); + setd ("."+.collectionquestcount+"_collectionitem["+(.@size+1)+"]",getarg(.@argcount+1)); + set .@argcount,.@argcount+2; + } + return; +} + +function AddHunting { + set .huntingquestcount,.huntingquestcount+1; + setd ("." +.huntingquestcount+"_huntingname$", getarg(0)); + setd ("." +.huntingquestcount+"_huntingmin", getarg(1)); + setd ("." +.huntingquestcount+"_huntingmax", getarg(2)); + setd ("." +.huntingquestcount+"_huntingprize", getarg(3)); + setd ("." +.huntingquestcount+"_huntingamount", getarg(4)); + setd ("." +.huntingquestcount+"_huntingzeny", getarg(5)); + set .@size, getarraysize(getd("."+ .huntingquestcount + "_huntingexp")); + set .@argcount, 6; + setd ("." +.huntingquestcount+"_huntingexp["+.@size+"]",getarg(.@argcount)); + setd ("." +.huntingquestcount+"_huntingexp["+(.@size+1)+"]",getarg(.@argcount+1)); + set .@argcount, .@argcount+2; + while(getarg(.@argcount,-1)!=-1 && getarg(.@argcount+1,-1)!=-1) { + set .@size, getarraysize(getd("."+ .huntingquestcount + "_huntingmob")); + setd ("."+.huntingquestcount+"_huntingmob["+.@size+"]",getarg(.@argcount)); + setd ("."+.huntingquestcount+"_huntingmob["+(.@size+1)+"]",getarg(.@argcount+1)); + set .@argcount, .@argcount+2; + } + return; +} +} diff --git a/npc/custom/quests/sphinx_mask.txt b/npc/custom/quests/sphinx_mask.txt new file mode 100644 index 000000000..00910428c --- /dev/null +++ b/npc/custom/quests/sphinx_mask.txt @@ -0,0 +1,52 @@ +//===== rAthena Script ======================================= +//= Sphinx Mask Quest (custom) +//===== By: ================================================== +//= sabernet09 +//===== Current Version: ===================================== +//= 1.3 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= This quest is related to Umbalian Chief. +//= 1.1 Removed it from official Umbala quests [Lupus] +//= 1.2 Added a missing variable (sphmask_q) [erKURITA] +//= 1.3 Optimized, and coordinates moved. [Euphy] +//============================================================ + +morocc,208,90,6 script Turban Thief 58,{ + mes "[Turban Thief]"; + if(event_umbala < 2) { + mes "What do you wan te withz me? Be gone!"; + close; } + if(sphmask_q) { + mes "You have no more business with me, go away!"; + close; } + mes "E'llo mah frien, would I interesst tu with this rare mask? Its value I assure you is real mah frien. Tis manific!"; + next; + callsub L_Menu,1,"1,000,000",1000000; + callsub L_Menu,2,"750,000",750000; + callsub L_Menu,3,"500,000",500000; + next; + mes "[Turban Thief]"; + mes "Ack! Forgez it! I can do bettaz en elsez where!"; + set sphmask_q,1; + close; + +L_Menu: + mes "[Turban Thief]"; + switch(getarg(0)) { + case 1: mes "Wah? O ho ho ho, so you know thaz I steal dis from those savages no? Well I won'tz give it back. But I will for a pricez... wat you say?"; break; + case 2: mes "Ahh a business man are you no? Fine, how about..."; break; + case 3: mes "Hmmm... you drive a hard bargain, ok... my final offer..."; break; } + next; + if(select("Pay "+getarg(1)+"z:No deal")==2) return; + mes "[Turban Thief]"; + if (Zeny < getarg(2)) { + mes "Are youz playin wit me? You don't have ze money!"; + close; } + set Zeny, Zeny-getarg(2); + mes "O ho ho, it's a deal, then!"; + getitem 7114,1; + set sphmask_q,1; + close; +}
\ No newline at end of file diff --git a/npc/custom/quests/sunglasses.txt b/npc/custom/quests/sunglasses.txt new file mode 100644 index 000000000..fb3353556 --- /dev/null +++ b/npc/custom/quests/sunglasses.txt @@ -0,0 +1,108 @@ +//===== rAthena Script ======================================= +//= Slotted Sunglasses Quest +//===== By: ================================================== +//= amichan +//===== Current Version: ===================================== +//= 1.8 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Quest to get Slotted Sunglasses. +//= Will reset after quest completion. +//===== Additional Comments: ================================= +//= 1.0 by Aegis 1.1 by aichan 1.2 by x[tsk] 1.3 by Darkchild +//= 1.5 Fixed Exploit [Lupus] +//= 1.6 Fixed Exploit [KarLaeda] +//= 1.7 Relocated 'Maseph' to moc_fild07. [Kisuka] +//= 1.8 Cleaning. [Euphy] +//============================================================ + +alberta,88,193,5 script Sunglasses Trader 73,{ + mes "[Sunglasses Trader]"; + if(SG_QUEST1 == 1) { + mes "There is nothing more I can tell you."; + next; + mes "[Sunglasses Trader]"; + mes "Go see Maseph. She is somewhere north of Morroc."; + close; } + mes "Hello. What can I do for you?"; + next; + if(select("I heard that you can make ^0000FFSlotted Sunglasses^000000.:Nothing, sorry to bother you.")==2) { + mes "[Sunglasses Trader]"; + mes "Come back to me than you are ready."; + close; } + mes "[Sunglasses Trader]"; + mes "I do not make them, but I can tell you where to find the person who does. For a small fee..."; + next; + if(select("How much?:No way, I will find her myself!")==2) { + mes "[Sunglasses Trader]"; + mes "Suit yourself, the Maker will not make you ^0000FFSlotted Sunglasses^000000 unless she knows that you are coming."; + mes "Only I can tell her you are coming."; + next; + mes "[Sunglasses Trader]"; + mes "Come back to me when you have given up. Hahaha..."; + close; } + mes "[Sunglasses Trader]"; + mes "In order for me to tell you information on ^0000FFSlotted Sunglasses^000000 you need to get me:"; + mes " - ^0000881 Carat Diamond^000000"; + mes " - ^00008850 Feathers^000000"; + mes " - ^000088100000z^000000"; + next; + if(select("Alright, here.:That's too much!")==2) { + mes "[Sunglasses Trader]"; + mes "Suit yourself."; + close; } + mes "[Sunglasses Trader]"; + if (countitem(730) < 1 || countitem(949) < 50 || Zeny < 100000) { + mes "You're missing something. Come back when you've gathered all the materials."; + close; } + delitem 730,1; + delitem 949,50; + set Zeny, Zeny-100000; + set SG_QUEST1,1; + mes "[Sunglasses Trader]"; + mes "Great. Now, listen carefully."; + next; + mes "[Sunglasses Trader]"; + mes "Look for someone named Maseph somewhere north of Morroc."; + mes "I will send her a message to let her know that you are coming."; + close; +} + +moc_fild07,334,186,5 script Maseph 702,{ + mes "[Maseph]"; + if(SG_QUEST1 != 1) { + mes "Lovely day, isn't it ?"; + close; } + mes "Hello there."; + mes "You came for the ^000088Slotted Sunglasses^000000, right?"; + next; + if(select("Yes:No, sorry to bother you.")==2) { + mes "[Maseph]"; + mes "Off you go, then."; + close; } + mes "[Maseph]"; + mes "To make one, I will need one pair of ^000088Sunglasses^000000 and 400000z."; + next; + if(select("Here you go.:No, thanks.")==2) { + mes "[Maseph]"; + mes "As you wish."; + close; } + mes "[Maseph]"; + if (countitem(2201) < 1) { + mes "I need one pair of ^000088Sunglasses^000000. Come back to me when you have one."; + close; } + if (Zeny < 400000) { + mes "You do not have enough Zeny. Come back to me when you do."; + close; } + delitem 2201,1; + set Zeny, Zeny-400000; + mes "Thank you. I will get on it right away..."; + next; + mes "[Maseph]"; + mes "Here you go, my friend."; + mes "Enjoy your ^000088Slotted Sunglasses^000000."; + getitem 2202,1; + set SG_QUEST1,0; + close; +}
\ No newline at end of file diff --git a/npc/custom/quests/tha_statues.txt b/npc/custom/quests/tha_statues.txt new file mode 100644 index 000000000..fb52d7ed4 --- /dev/null +++ b/npc/custom/quests/tha_statues.txt @@ -0,0 +1,269 @@ +//===== rAthena Script ======================================= +//= Custom Thanatos Tower Quest +//===== By: ================================================== +//= Bibilol, Moryagorn +//===== Current Version: ===================================== +//= 1.1 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Custom Thanatos Tower Quest +//===== Additional Comments: ================================= +//= 1.1 Fixed wrong NPC names in their dialogues, added +//= Justin84's gems check in Sox NPC [Lupus] +//============================================================ + +//Statue (NPC)(U: UP, D: DOWN, R: RIGHT, L: LEFT) : +// Explain Npc +tha_t08,69,106,4 script Statue 111,{ + mes "You can read on the back of the statue:"; + mes "'By the spirit of olds, the walls are closed"; + mes "Upper floors or foreign taboo"; + mes "By the order of the Statues you will find the way"; + mes "Which perhaps a day will bring you to me."; + mes ".....Thanatos '"; + close; +} + +//Tha_t09 : +//(Thalos)(U,L)-->tha_t09,17,158,4 +//(Mediane)(D,R)-->tha_t09,84,99,4 +//Script: + +tha_t09,17,158,4 script Thalos 111,{ + if(TSQ_CHK == 1) goto done; + mes "[Thalos]"; + mes "You must find the 2nd Statue now."; + set TSQ_CHK,1; + close; +done: + mes "[Thalos]"; + mes "Go search the 2nd Statue!"; + close; + +} + +tha_t09,84,99,4 script Mediane 111,{ + if(TSQ_CHK != 1) goto nook; + mes "[Mediane]"; + mes "Okay, i am warping you to the next floor now."; + next; + set TSQ_CHK,0; + warp "tha_t10", 165, 138; + close; +nook: + mes "[Mediane]"; + mes "You must talk with the Spirit in the 1st Statue."; + close; +} + +//Tha_t10 : +//(Melkor)(U)-->tha_t10,130,159,4 +//(Zebrus)(D,R)-->tha_t10,160,98,4 +//(Veriaelle)(D,L)-->tha_t10,99,97,4 +//Script: + +tha_t10,130,159,4 script Melkor 111,{ + if(TSQ_CHK == 1) goto done; + mes "[Melkor]"; + mes "You must find the other Spirits now."; + mes "We are 3."; + set TSQ_CHK,1; + close; +done: + mes "[Melkor]"; + mes "Go Search, They are in this floor."; + close; +} + +tha_t10,160,98,4 script Zebrus 111,{ + if(TSQ_CHK != 1) goto nook; + mes "[Zebrus]"; + mes "Keep on this way, There is one Spirit left"; + set TSQ_CHK,2; + close; +nook: + mes "[Zebrus]"; + mes "You seems to be lost, Go back and talk to Melkor."; + next; + set TSQ_CHK,0; + close; +} + +tha_t10,99,97,4 script Veriaelle 111,{ + if(TSQ_CHK != 2) goto nook; + mes "[Veriaelle]"; + mes "Okay, i am warping you to the next floor."; + next; + set TSQ_CHK,0; + warp "tha_t11", 86, 38; + close; +nook: + mes "[Veriaelle]"; + mes "You seems to be lost, Go back and talk to Melkor."; + next; + set TSQ_CHK,0; + close; +} + +//Tha_t11 : +//(Throtre)(U,L)-->tha_t11,16,85,4 +//(Klermaz)(D,R)-->tha_t11,85,16,4 +//(Mihane)(D,L)-->tha_t11,16,16,4 +//(Seranes)(U,R)-->tha_t11,85,85,4 +//Script: + +tha_t11,16,85,4 script Throtre 111,{ + if(TSQ_CHK == 1) goto done; + mes "[Throtre]"; + mes "You got my authorization for the next floor"; + mes "However, you must show how strong you are to the other Spirits"; + set TSQ_CHK,1; + close; +done: + mes "[Throtre]"; + mes "Go search, They Can't leave this floor."; + close; +} + +tha_t11,85,16,4 script Klermaz 111,{ + if(TSQ_CHK != 1) goto nook; + mes "[Klermaz]"; + mes "Hmm it seems that Throtre allowed you to pass."; + mes "Well then you have my blessing, 2 Spirits remaining."; + set TSQ_CHK,2; + close; +nook: + mes "[Klermaz]"; + mes "You seems to be lost, Go back and talk to Throtre."; + next; + set TSQ_CHK,0; + close; +} + +tha_t11,16,16,4 script Mihane 111,{ + if(TSQ_CHK != 2) goto nook; + mes "[Mihane]"; + mes "Keep on this way, Only 1 Left."; + set TSQ_CHK,3; + close; +nook: + mes "[Mihane]"; + mes "Sorry, You must start over from the begining."; + next; + set TSQ_CHK,0; + close; +} + +tha_t11,85,85,4 script Seranes 111,{ + if(TSQ_CHK != 3 ) goto nook; + mes "[Seranes]"; + mes "Perfect, it seems that the other spirits grants you the access."; + mes "I am warping you to the next floor."; + next; + set TSQ_CHK,0; + warp "tha_t12", 129, 58; + close; +nook: + mes "[Seranes]"; + mes "You did not follow the good order, starts again from the begining."; + next; + set TSQ_CHK,0; + close; +} + +//Tha_t12 ( M: Middle): +//(Nox)(D,L)-->tha_t12,103,18,4 +//(Vox)(R)-->tha_t12,162,58,4 +//(Hox)(L)-->tha_t12,96,57,4 +//(Dox)(D,R)-->tha_t12,153,17,4 +//(Sox)(U)-->tha_t12,128,88,4 +//Script: + +tha_t12,103,18,4 script Nox 111,{ + if(TSQ_CHK == 1 ) goto done; + mes "[Nox]"; + mes "Fine, 4 Spirits left."; + set TSQ_CHK,1; + close; +done: + mes "[Nox]"; + mes "Go search, They can't leave this floor."; + close; +} + +tha_t12,162,58,4 script Vox 111,{ + if(TSQ_CHK != 1 ) goto nook; + mes "[Vox]"; + mes "Keep on this way, 3 Spirits remaining !"; + set TSQ_CHK,2; + close; +nook: + mes "[Vox]"; + mes "Sorry, Go back and talk to Nox."; + next; + set TSQ_CHK,0; + close; +} + +tha_t12,96,57,4 script Hox 111,{ + if(TSQ_CHK != 2 ) goto nook; + mes "[Hox]"; + mes "You are on the good way, 2 Spirits remaining !"; + set TSQ_CHK,3; + close; +nook: + mes "[Hox]"; + mes "Sorry, Go back and talk to Vox."; + next; + set TSQ_CHK,0; + close; +} + +tha_t12,153,17,4 script Dox 111,{ + if(TSQ_CHK != 3 ) goto nook; + mes "[Dox]"; + mes "Perfect, 1 Spirit left."; + set TSQ_CHK,4; + close; +nook: + mes "[Dox]"; + mes "Sorry, Go back and talk to Hox."; + next; + set TSQ_CHK,0; + close; +} + +tha_t12,128,88,4 script Sox 111,{ + if(TSQ_CHK != 4 ) goto nook; + mes "[Sox]"; + mes "You have just passed the test successfully."; + next; + mes "[Sox]"; + mes "You have to give me Red Magic Stone, Yellow Magic Stone, Blue Magic Stone & Green Magic Stone."; + next; + if(countitem(7426) < 1 || countitem(7427) < 1 || countitem(7428) < 1 || countitem(7429) < 1) goto nostone; + delitem 7426,1; + delitem 7427,1; + delitem 7428,1; + delitem 7429,1; + mes "[Sox]"; + mes "I will now warp you to steps of Fate."; + mes "Good-bye."; + next; + set TSQ_CHK,0; + warp "thana_step", 186, 223; + close; + +nostone: + mes "[Sox]"; + mes "Oh well, seems you don't have enough stones."; + close; + +nook: + mes "[Sox]"; + mes "Sorry, Go back and talk to Dox."; + next; + set TSQ_CHK,0; + close; +} diff --git a/npc/custom/quests/thq/THQS_ChatingNPC.txt b/npc/custom/quests/thq/THQS_ChatingNPC.txt new file mode 100644 index 000000000..55971e51f --- /dev/null +++ b/npc/custom/quests/thq/THQS_ChatingNPC.txt @@ -0,0 +1,95 @@ +//===== rAthena Script ======================================= +//= Treasure Hunter Quests +//===== By: ================================================== +//= Fredzilla +//===== Current Version: ===================================== +//= 1.0 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Start for Treasure hunter quests +//===== Additional Comments: ================================= +//= Event_THQS - Used to check if you have already registered +//= #Treasure_Token - used to keep track of tokens +//============================================================ + +//Entrance Flags +yuno,48,101,6 script Notice 722,{ + mes "^FF0000[ Treasure Hunter Guild House ]^000000"; + mes " "; + mes "Welcome to the Treasure Hunter's Guild House."; + mes "Feel free to drop in and look around"; + mes "and feel free to become a memeber if you wish."; + mes " "; + mes "For membership applications please talk to Keegan"; + mes "up the stairs and down the hall."; + close; +} +//Saver Girl; +yuno_in01,32,178,3 script Ahlma 94,{ + mes "[Ahlma]"; + if (Event_THQS == 0) goto N_Member; + mes "Welcome to The Treasure Hunter Guild."; + mes "How may I help you?"; + next; + menu "Save",-,"Quit",N_Quit; + mes "[Ahlma]"; + mes "Ok, saved. Thank you ~ See you soon~"; + savepoint "yuno_in01",34,176; + close; +N_Quit: + mes "[Ahlma]"; + mes "Well if you think you are safe, good on you."; + close; +N_Member: + mes "Sorry, members only."; + close; +} +//Retired Smile mask girl; +yuno_in01,33,162,3 script Smile Helper 92,{ + mes "[Smile Gal]"; + mes "Oh man...I am so sick of"; + mes "trading Mr. Smile masks for crap."; + mes " "; + mes "You ask me for one and you'll find yourself 10 pounds lighter!"; + close; +} +//Usless Female Assasin; +yuno_in01,22,162,6 script Female Assasin 725,{ + mes "[Sharlet]"; + if (Event_THQS > 0) goto N_Member; + mes "Umm sorry I'm not gona waste my time talking to you if you arn't even a member!"; + close; +N_Member: + set @TEMP,rand(1,2); + if (@TEMP == 1) goto N_Chat1; + if (@TEMP == 2) goto N_Chat2; + mes "How are you reading this???"; + mes "Well unless you are reading the code :)"; + close; +N_Chat1: + mes "Ahh welcome fellow Treasure Hunter "+strcharinfo(0)+"."; + mes "Did you hear about that brave man that went into Glast Heim alone?! He must be crazy."; + close; +N_Chat2: + mes ""+strcharinfo(0)+" don't you have something better you could be doing? Like a quest."; + close; +} +//another usless member +yuno_in01,25,162,6 script Female Wizard 123,{ + mes "[Sasha]"; + if (Event_THQS > 0) goto N_Member; + mes "Umm sorry I'm not gona waste my time talking to you if you arn't even a member!"; + close; +N_Member: + set @TEMP,rand(2); + if (@TEMP == 1) goto N_Chat; + mes "Ahh welcome fellow Treasure Hunter "+strcharinfo(0)+"."; + mes "Did you hear about that goat man running around in the trees?"; + mes " "; + mes "Aperently his name is Baphomet and he has been runing around the Forest Maze out side of prontera for quite some time now."; + close; +N_Chat: + mes ""+strcharinfo(0)+" don't you have something better you could be doing? Like a quest."; + close; +} diff --git a/npc/custom/quests/thq/THQS_GuildNPC.txt b/npc/custom/quests/thq/THQS_GuildNPC.txt new file mode 100644 index 000000000..b5bbf5d28 --- /dev/null +++ b/npc/custom/quests/thq/THQS_GuildNPC.txt @@ -0,0 +1,86 @@ +//===== rAthena Script ======================================= +//= Treasure Hunter Quests +//===== By: ================================================== +//= Fredzilla +//===== Current Version: ===================================== +//= 1.0 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Start for Treasure hunter quests +//===== Additional Comments: ================================= +//= Event_THQS - Used to check if you have already registered +//= #Treasure_Token - used to keep track of tokens +//============================================================ + +yuno_in01,124,164,6 script Guild Leader 108,{ + mes "[Keegan]"; + mes "What brings you here? Have something to say?"; + next; + menu "I want to be a Treasure Hunter",-,"Take a New Quest.",N_NQuest,"Take me to the Official Shop.",N_OShop,"Nevermind.",N_NVM; + if(Event_THQS==1) goto N_AlreadyReg; + mes "[Keegan]"; + mes "Well "+strcharinfo(0)+" if you want to be a Treasure Hunter first you must."; + mes " "; + mes "^FF00001.^000000 You well be changed ^FF000025,000z^000000 for basic training and your proof of being a member."; + mes " "; + mes "Umm... Well that is all you need to do. Hahaha."; + next; + menu "Pay ^FF000025,000z^000000.",-,"Thats way to high!!",N_HighPrice; + if (zeny < 25000) goto N_NoZeny; + set Zeny,Zeny-25000; + //getitem 7950, 1; + //getitem 7951, 1; + set Event_THQS,1; + mes "[Keegan]"; + mes "Congratulations!"; + emotion 46; + next; + mes "[Keegan]"; + mes "Welcome to the Guild of Treasure Hunters."; + mes "You may now take a Treasure Hunting Quest as you see fit."; + close; +N_NoZeny: + mes "[Keegan]"; + mes "Hmmm you don't seem to have ^FF000025,000z^000000 "+strcharinfo(0)+". Please come back when you do."; + close; +N_HighPrice: + mes "[Keegan]"; + mes "Well if you can't afford a small ^FF000025,000z^000000 you shouldent be a Treasure Hunter yet."; + close; +N_AlreadyReg: + mes "[Keegan]"; + mes "Ha ha ha...you are already a member."; + close; +N_NQuest: + if (Event_THQS!=1) goto A_NeedReg; + mes "[Keegan]"; + mes "Well "+strcharinfo(0)+" if you wish to take a quest go talk to the fellow Treasure Hunter in the other room there."; + close; +A_NeedReg: + mes "[Keegan]"; + mes "Sorry you must be a member of the Treasure Hunter Guild if you wish to take a quest."; + mes " "; + mes "Also now that you are a member feel free to use our shops anytime you wish.They are all located on this floor."; + mes " "; + mes "We also have another shop for members only,in which we use little metal diamonds called Treasure Hunter Tokens to exchange for rare goods."; + mes " "; + mes "You will even have access to our exclusive personal Dungeon."; + close; +N_OShop: + if (Event_THQS!=1) goto N_NeedMem; + mes "[Keegan]"; + mes "Yes "+strcharinfo(0)+" I will take you to our shop right away!"; + next; + warp "prt_in",166,171; + close; + end; +N_NeedMem: + mes "[Keegan]"; + mes "Im sorry only members may visit our private shop."; + close; +N_NVM: + mes "[Keegan]"; + mes "Alright come back when you have the free time to spare."; + close; +} diff --git a/npc/custom/quests/thq/THQS_QuestNPC.txt b/npc/custom/quests/thq/THQS_QuestNPC.txt new file mode 100644 index 000000000..6a3b33699 --- /dev/null +++ b/npc/custom/quests/thq/THQS_QuestNPC.txt @@ -0,0 +1,554 @@ +//===== rAthena Script ======================================= +//= Treasure Hunter Quests +//===== By: ================================================== +//= Fredzilla +//===== Current Version: ===================================== +//= 1.4 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Start for Treasure hunter quests +//===== Additional Comments: ================================= +//= Event_THQS - Used to check if you have already registered +//= #Treasure_Token - used to keep track of tokens +//= 1.0 - Straight conversionof Aegis NPC file +//= 1.1 Added time penalty to prevent get quests to often [Lupus] +//= 1.2 Fixed not working penalty, added anti-cheat [Lupus] +//= 1.3 Changed some bad RGB Codes. (bugreport:211) [Samuray22] +//= 1.4 Fixed typos. (bugreport:2607) [Kisuka] +//============================================================ + +yuno_in01,112,151,6 script Quest Manager 62,{ + mes "[Guy]"; + mes "Welcome to the Treasure Hunters Guild "+strcharinfo(0)+"."; + next; + if (On_Quest == 0) goto N_NewQuest; + mes "[Guy]"; + mes "Look " +strcharinfo(0)+ ", you can only 1 quest at a time, you should finish the quest unless you have given up."; + mes "Giving up will cost you ^FF00002500z^000000."; + next; + menu "No, never would I leave a quest!",-,"Yah I'm pathetic... Pay 2500z",N_PayZeny; + mes "[Guy]"; + mes "Good well get back out there."; + close; +N_PayZeny: + if (zeny < 2500) goto N_ZenyFail; + set one_qset, 0; + set two_qset, 0; + set three_qset, 0; + set four_qset, 0; + set five_qset, 0; + set six_qset, 0; + set seven_qset, 0; + set eight_qset, 0; + set nine_qset, 0; + set ten_qset, 0; + set On_Quest, 0; + set Zeny,Zeny-2500; + //add time delay penalty. You can get another quest after 2 - 3 hours. [Lupus] + set #THQ_DELAY, (GetTime(7)*12*31*24+GetTime(6)*31*24+GetTime(5)*24+GetTime(3)+rand(2,3)); + mes "[Guy]"; + mes "Its sad to see someone give a quest up..."; + mes "Shame on you."; + emotion 7; + close; + +N_ZenyFail: + mes "[Guy]"; + mes "Thats sad you don't even have ^FF00002500z^000000."; + close; + +N_NewQuest: + if (Event_THQS == 0) goto N_Signup; + //checking if time penalty is over [Lupus] + if (#THQ_DELAY > (GetTime(7)*12*31*24 + GetTime(6)*31*24 + GetTime(5)*24 + GetTime(3)) ) goto L_NoQuestsForYet; + mes "[Guy]"; + mes "Ahh welcome fellow Treasure Hunter."; + mes "You currently have ^FF0000"+#Treasure_Token+"^000000 treasure tokens!!!"; + mes "Would you like me to asign you a Quest?"; + next; + menu "Yes I would like a Quest Please.",-,"Sorry Guy no time today.",N_NoTime; + + mes "[Guy]"; + mes "Ok lets see what quest we can give you today."; + mes "The quest names in ^FF0000This Colour^000000 mean that they are more challanging then the rest, but have better rewards."; + next; + set #THQ_DELAY,(GetTime(7)*12*31*24+GetTime(6)*31*24+GetTime(5)*24+GetTime(3) + 1); //you can get another quest after 1 hour [Lupus] + emotion 21; + if(@treasure_job==0) set @treasure_job,rand(1,10); //doesn't allow cheaters to pick any quest they want + if(@treasure_job==2) goto N_JobList2; + if(@treasure_job==3) goto N_JobList3; + if(@treasure_job==4) goto N_JobList4; + if(@treasure_job==5) goto N_JobList5; + if(@treasure_job==6) goto N_JobList6; + if(@treasure_job==7) goto N_JobList7; + if(@treasure_job==8) goto N_JobList8; + if(@treasure_job==9) goto N_JobList9; + if(@treasure_job==10) goto N_JobList10; + goto N_JobList1; //if(@treasure_job==1) + +N_NoTime: + mes "[Guy]"; + mes "Alright maybe next time "+strcharinfo(0)+"."; + emotion 20; + close; + +N_Signup: + mes "[Guy]"; + mes "I'm afraid you must sign up for the guild before you can go on a quest!"; + emotion 17; + close; + +L_NoQuestsForYet: + mes "[Guy]"; + mes "I'm afraid there aren't any Quests for you yet."; + mes "Call in "+ (#THQ_DELAY - (GetTime(7)*12*31*24+GetTime(6)*31*24+GetTime(5)*24+GetTime(3)) )+" hours later."; + emotion 17; + close; + +L_QuestGiven: + set On_Quest,1; + set @treasure_job,0; //next time u get random quest + close; + +///////Job list 1/////// +N_JobList1: + mes "[Guy]"; + mes "Ok you have a couple quests that can be done here."; + next; + menu "Lost Old Man.",-,"Master needs his Bow.",N_MasterBow,"The Hit List.",N_HitList,"^FF0000The Sad Widow.^000000",N_SadWidow; + mes "[Guy]"; + mes "^FF0000Lost Old Man^000000"; + mes "^FF0000------------^000000"; + mes "This is an easy and low payed quest."; + mes " "; + mes "A wife came in asking us to find his husband, she seems to come in alot asking us to find him over and over again."; + next; + mes "[Guy]"; + mes "But he always seems to be around the same place so there isn't much looking involved,check the mountains 1 west and 1 north of prontera."; + set one_qset,1; + goto L_QuestGiven; + +N_MasterBow: + mes "[Guy]"; + mes "^FF0000Master needs his Bow^000000"; + mes "^FF0000--------------------^000000"; + mes "This is just a package delivery run, no big deal or anything."; + mes " "; + mes "Take this to an archer in the Archer Village outside of Payon."; + getitem 1072,1; //Delivery_Box + set one_qset,2; + goto L_QuestGiven; + +N_HitList: + mes "[Guy]"; + mes "^FF0000The Hit List^000000"; + mes "^FF0000------------^000000"; + mes "In this quest you get to see some action."; + mes " "; + mes "There has been a farmer that keeps having all his crops eaten by ^FF0000Thief Bugs, Porings, and Lunitics^000000 here is a lost of what I need you to do. He is waiting East of Prontera."; + next; + mes "[Guy]"; + mes "Ok go to the east and bash those little bastards like there is no tommorow. When you are done with that list you have just discard it, but you will NOT get another one!."; + set one_qset,3; + goto L_QuestGiven; + +N_SadWidow: + mes "^FF0000The Sad Widow^000000"; + mes "^FF0000*************^000000"; + mes "This is just another quest with possable well pay."; + mes " "; + mes "There is an old Widow in pontera, she recently lost her husband due to a monster attack.She has requested a Guild member to come talk to her at the Pontera Graveyard."; + set one_qset,4; + goto L_QuestGiven; + +///////Job list 2/////// +N_JobList2: + mes "[Guy]"; + mes "Ok you have a couple quests that can be done here."; + next; + menu "The Strange Letter",-,"Jur for Jeramiah",N_JurJeramiah,"Bee Keepers Hunny",N_BeeHunny,"^FF0000The Wander Man^000000",N_WanderMan; + + mes "^FF0000The Strange Letter^000000"; + mes "^FF0000------------------^000000"; + mes "I do not know much about this quest."; + mes " "; + mes "A strange man came in here yesterday and asked me to deliver this ^FF0000Strange Letter^000000 to some woman in Morroc. Knowing us we do not ask questions so you must take care of this delivery."; + mes "The Woman is in located in Morroc and her name is Erika."; + getitem 1072,1; //Delivery_Message + set two_qset, 1; + goto L_QuestGiven; + +N_JurJeramiah: + mes "^FF0000Jur for Jeramiah^000000"; + mes "^FF0000----------------^000000"; + mes "Standard delivery quest."; + mes " "; + mes "Jeramiah ordered a Special Jur from our weapon shop.Your Job is to deliver it to him in the Assasin Temple."; + getitem 1998,1; //Jeramiah's_Jur + set two_qset,2; + goto L_QuestGiven; + +N_BeeHunny: + mes "^FF0000Bee Keepers Hunny^000000"; + mes "^FF0000-----------------^000000"; + mes "Strange man in the marsh need your help."; + mes " "; + mes "There is a strange man in the forest in ^FF00001 south and 1 west^000000 of Prontera, he need your help with something."; + set two_qset,3; + goto L_QuestGiven; + +N_WanderMan: + mes "^FF0000The Wander Man^000000"; + mes "^FF0000**************^000000"; + mes "There is a woman in Payon that is in desperate for aid."; + mes " "; + mes "There is a woman in Payon named Molly please get to her as soon as possable the letter she sent here sounded like someone was killing her."; + set two_qset,4; + goto L_QuestGiven; + +///////Job list 3/////// +N_JobList3: + mes "[Guy]"; + mes "Ok you have a couple quests that can be done here."; + next; + menu "Damn Pixies!",-,"Package Delivery",N_Delivery1,"Prontera Culvert",N_ProntCulvert,"^FF0000Trouble at the Coal Mine^000000",N_CoalMine; + mes "^FF0000Damn Pixies!^000000"; + mes "^FF0000------------^000000"; + mes "Have you ever been to Hell?"; + mes " "; + mes "A man outside of ^FF0000Ant Hell^000000 has requested your audiance, I suggest you hurry."; + set three_qset,1; + goto L_QuestGiven; + +N_Delivery1: + mes "^FF0000Package Delivery^000000"; + mes "^FF0000----------------^000000"; + mes "Standard drop off quest."; + mes " "; + mes "In this quest you need to deliver a mystery box to someone names ^FF0000Flank at the bridge between Aldebaran and Juno^000000."; + getitem 1082,1; //Delivery_Box_ + set three_qset,2; + goto L_QuestGiven; + +N_ProntCulvert: + mes "^FF0000Prontera Culvert^000000"; + mes "^FF0000----------------^000000"; + mes "The bugs,They are everywere!."; + mes " "; + mes "The ^FF0000Prontera Culvert^000000 is out of control!Sign up as a volenteer to clean out some of the culvert."; + next; + mes "I know it seems like there is no stoping them but however many you kill does makes a differance. After you have signed up, inside the Culvert there will be a Knight that will give you a quest."; + set three_qset,3; + goto L_QuestGiven; + +N_CoalMine: + mes "^FF0000Trouble at the Coal Mine^000000"; + mes "^FF0000************************^000000"; + mes "The fun...err...trouble never stops in Rune Midgar."; + mes " "; + mes "Recently there was an acident at the coal mines. There was a huge chasm that released some undead Evil Druids."; + next; + mes "The Evil Druids started to turn all the workers into the undead. We do not know why, but we do not want to find out, contact a man named Rudolfo outside the Coal Mines."; + set three_qset,4; + goto L_QuestGiven; + +///////Job list 4/////// +N_JobList4: + mes "[Guy]"; + mes "Ok you have a couple quests that can be done here."; + next; + menu "Zombie Attack",-,"Mystic Wizard",N_MWizard,"Aww shoot!",N_Shoot,"^FF0000Emperium^000000",N_Emp; + mes "^FF0000Zombie Attack^000000"; + mes "^FF0000-------------^000000"; + mes "The undead have invaded Payon Cave!"; + mes " "; + mes "I remember when Payon Cave used to be a safe place to visit, but now undead Zombies have infested the cave! Please contact ^FF0000Flora outside on Payon Cave^000000 and aid her."; + set four_qset,1; + goto L_QuestGiven; + +N_MWizard: + mes "^FF0000Mystic Wizard^000000"; + mes "^FF0000-------------^000000"; + mes "Proto-type of a Staff must be delivered to Zed the Wizard."; + mes " "; + mes "Zed the Wizard has requested to try out a new un-named proto-type staff. It will be your job to deliver this to him. Zed tend to stay within the general area of Juno."; + getitem 1999,1; //Zed's_Staff + set four_qset,2; + goto L_QuestGiven; + +N_Shoot: + mes "^FF0000Aww shoot!^000000"; + mes "^FF0000----------^000000"; + mes "A little girl is in trouble."; + mes " "; + mes "There is a little girl in trouble, her name is Dassy and she is ^FF0000east of the prontera fountan^000000."; + set four_qset,3; + goto L_QuestGiven; + +N_Emp: + mes "^FF0000Emperium^000000"; + mes "^FF0000********^000000"; + mes "This is a strange quest that I know little about."; + mes " "; + mes "Someone in ^FF0000Prontera Guild Hall^000000 has requested to see one of our members, his name is Czhore."; + set four_qset,4; + goto L_QuestGiven; + +///////Job list 5/////// +N_JobList5: + mes "[Guy]"; + mes "Ok you have a couple quests that can be done here."; + next; + menu "Savage Land",-,"Pyramid's part 1",N_PyrPRT1,"Thinking first",N_Thinkfirst,"^FF0000The not so friendly ghost^000000",N_Ghost; + mes "^FF0000Savage Land^000000"; + mes "^FF0000-----------^000000"; + mes "Easy for some very hard for others."; + mes " "; + mes "A man named Lithin wish's to give you a quest, you can find him north of prontera inside of ^FF0000The Hidden Temple^000000"; + set five_qset,1; + goto L_QuestGiven; + +N_PyrPRT1: + mes "^FF0000Pyramid's^000000"; + mes "^FF0000---------^000000"; + mes "Its funny cause no one knows how these were really made."; + mes " "; + mes "Aperently the Pyramids have are beganing to be infested with undead activity,outside the pyramids a man will be waiting for you. He did no give us his name but he asked for you to hurry."; + set five_qset,2; + goto L_QuestGiven; + +N_Thinkfirst: + mes "^FF0000Thinking first^000000"; + mes "^FF0000--------------^000000"; + mes "This sounds like another one of those ditzy girl quests..."; + mes " "; + mes "Dazzy the local blond around Geffen has asked for you to deliver her these flowers. I don't know why someone would send flowers to herself..."; + getitem 744,1; //Bouquet + set five_qset,3; + goto L_QuestGiven; + +N_Ghost: + mes "^FF0000The not so friendly ghost^000000"; + mes "^FF0000*************************^000000"; + mes "Well no one ever said Casper was nice behind the sceens."; + mes " "; + mes "A wizard on the 3rd floor of geffen tower want's to talk to you about the anchient ruins underneath the city."; + set five_qset,4; + goto L_QuestGiven; + +///////Job list 6/////// +N_JobList6: + mes "[Guy]"; + mes "Ok you have a couple quests that can be done here."; + next; + menu "Package for thiefs",-,"Pyramid's part 2",N_PyrPRT2,"Special delivery",N_Delivery2,"^FF0000Geffenia^000000",N_Gef; + mes "^FF0000Package for thiefs^000000"; + mes "^FF0000------------------^000000"; + mes "How ironic."; + mes " "; + mes "Deliver this Box to the Thiefs guild."; + getitem 1083,1; //Delivery_Box__ + set six_qset,1; + goto L_QuestGiven; + +N_PyrPRT2: + mes "^FF0000Pyramid's part 2^000000"; + mes "^FF0000----------------^000000"; + mes "More undead action in this triangle!"; + mes " "; + mes "Talk to a man outside the entrance of the pyramids, he seems to have another quest for you."; + set six_qset,2; + goto L_QuestGiven; + +N_Delivery2: + mes "^FF0000Special delivery^000000"; + mes "^FF0000----------------^000000"; + mes "Well most of what we do is run packages, this is no different from other's."; + mes " "; + mes "Take this box, DO NOT OPEN IT! To a little girl in Lutie named Chirach she should be around santa."; + getitem 1083,1; //Delivery_Box__ + set six_qset,3; + goto L_QuestGiven; + +N_Gef: + mes "^FF0000Geffenia^000000"; + mes "^FF0000********^000000"; + mes "The little children of Geffen have been haveing strange nightmares."; + mes " "; + mes "We belive that the ruins underneath geffen are causeing this problem, talk to a Wizard named Zuuzuu inside Geffen Tower for your mission."; + set six_qset,4; + goto L_QuestGiven; + +///////Job list 7/////// +N_JobList7: + mes "[Guy]"; + mes "Ok you have a couple quests that can be done here."; + next; + menu "Apple Juice",-,"Delivery",N_Delivery3,"^FF0000Golden Thief Bug^000000",N_GTB,"^FF0000Evil Pirates^000000",N_EvilPirates; + mes "^FF0000Apple Juice^000000"; + mes "^FF0000-----------^000000"; + mes "Can't say no to some good apple juice."; + mes " "; + mes "There is a little girl up in prontera Square a bit north from the fountain, go talk to her."; + set seven_qset,1; + goto L_QuestGiven; + +N_Delivery3: + mes "^FF0000Delivery^000000"; + mes "^FF0000--------^000000"; + mes "So many packages so little time."; + mes " "; + mes "Take this box to a man in Alberta named Charles."; + getitem 1082,1; //Delivery_Box_ + set seven_qset,2; + goto L_QuestGiven; + +N_GTB: + mes "^FF0000Golden Thief Bug^000000"; + mes "^FF0000****************^000000"; + mes "The prontera Culvert has never been the same..."; + mes " "; + mes "Well there have been reports of a Golden Thief Bug running around the bottem on the Culvert. Talk to a Knight inside the Culvert."; + set seven_qset,3; + goto L_QuestGiven; + +N_EvilPirates: + mes "^FF0000Evil Pirates^000000"; + mes "^FF0000************^000000"; + mes "A ghost ship has washed up on shore on an island outside of Izlude."; + mes " "; + mes "A female assasin has a quest for you, she is waiting outside the Ghost Ship.There have been reports of evil undead pirates lurking around inside the ship."; + set seven_qset,4; + goto L_QuestGiven; + +///////Job list 8/////// +N_JobList8: + mes "[Guy]"; + mes "Ok you have a couple quests that can be done here."; + next; + menu "Banana Juice",-,"Another Delivery",N_Delivery4,"My lost beeds",N_LostBeeds,"^FF0000Baphomet!^000000",N_Bapho; + mes "^FF0000Banana Juice^000000"; + mes "^FF0000------------^000000"; + mes "Sound gross to some good to others."; + mes " "; + mes "There is a little girl up in prontera Square a bit north from the fountain, go talk to her."; + set eight_qset,1; + goto L_QuestGiven; + +N_Delivery4: + mes "^FF0000Another Delivery^000000"; + mes "^FF0000----------------^000000"; + mes "Well yah box delivering is in high demand,lots of lazy people."; + mes " "; + mes "Take this package to a man in Morroc named Klye."; + getitem 1081,1; //Delivery_Box + set eight_qset,2; + goto L_QuestGiven; + +N_Bapho: + mes "^FF0000Baphomet!^000000"; + mes "^FF0000*********^000000"; + mes "Hidden in the Temple he watches and guards."; + mes " "; + mes "Rumor has it that a Goat Man is lurking in the Hidden Temple, There is also a man in the Hidden Temple names Zack that needs you help with this Goat Man known as Baphomet."; + set eight_qset,3; + goto L_QuestGiven; + +N_LostBeeds: + mes "^FF0000My lost Beeds^000000"; + mes "^FF0000-------------^000000"; + mes "Oh great I smell stupidity..."; + mes " "; + mes "A little girl in Payon wants to talk to you, her name is Flower, What a stupid name,Hahaha."; + set eight_qset,4; + goto L_QuestGiven; + +///////Job list 9/////// +N_JobList9: + mes "[Guy]"; + mes "Ok you have a couple quests that can be done here."; + next; + menu "Smelly Box",-,"Payon Cave",N_PayonC,"^FF0000Sohee's Everywere!^000000",N_Sohee,"^FF0000Moonlight Flower^000000",N_Moonlight; + mes "^FF0000Smelly Box^000000"; + mes "^FF0000----------^000000"; + mes "Oh god please get this out of here fast."; + mes " "; + mes "Oh man smells like someone died in here.Take this to the Magic School in Geffen and hurry,ahh the smell its burning my eye's!!!"; + getitem 1082,1; //Delivery_Box_ + set nine_qset,1; + goto L_QuestGiven; + +N_Sohee: + mes "^FF0000Sohee's Everywere!^000000"; + mes "^FF0000******************^000000" ; + mes "Hmmm seem's a man named Jack wants to speak to you in the Archer Guild House."; + mes " "; + mes "Well what we know about Payon is that a while ago there was a freak fire that burnt down the old school."; + next; + mes "The strange thing about what happened was that the children inside did not seem to die from the flames."; + mes "Speak to the little school girl somewere in Payon."; + set nine_qset,2; + goto L_QuestGiven; + +N_Moonlight: + mes "^FF0000Moonlight Flower^000000"; + mes "^FF0000****************^000000" ; + mes "Hmmm seem's a man named Jack wants to speak to you in the Archer Guild House."; + mes " "; + mes "Well I don't know much about this, it has to do with the deepest reagions of Payon Cave, We don't know much because no one ever seems to make it back alive."; + set nine_qset,3; + goto L_QuestGiven; + +N_PayonC: + mes "^FF0000Payon Cave^000000"; + mes "^FF0000----------^000000" ; + mes "Hmmm seem's a man named Jack wants to speak to you in the Archer Guild House."; + mes " "; + mes "The farther we go into the cave the stranger it gets."; + set nine_qset,4; + goto L_QuestGiven; + +///////Job list 10/////// +N_JobList10: + mes "[Guy]"; + mes "Ok you have a couple quests that can be done here."; + next; + menu "The Blank Box",-,"^FF0000Eddga^000000",N_Eddga,"^FF0000Phreeoni^000000",N_Phreeoni,"^FF0000Maya^000000",N_Maya; + + mes "^FF0000The Blank Box^000000"; + mes "^FF0000-------------^000000"; + mes "Package to Morroc"; + mes " "; + mes "There is nothing writen on this box but a notice to deliver it to a man Kreg."; + getitem 1082,1; //Delivery_Box_ + set ten_qset,1; + goto L_QuestGiven; + +N_Eddga: + mes "^FF0000Eddga^000000"; + mes "^FF0000*****^000000"; + mes "Tony the Tiger is on crack and destroying the forest."; + mes " "; + mes "Talk to a man outside the 'Hidden' Hunter Guild, He needs your help."; + set ten_qset,2; + goto L_QuestGiven; + +N_Phreeoni: + mes "^FF0000Phreeoni^000000"; + mes "^FF0000********^000000"; + mes "He is big and Pink and you run and hide!"; + mes " "; + mes "This guy just poped into some hole one day, He dosent look that tough but you would be supprised. Talk to a man named Caral outside of Ant Hell."; + set ten_qset,3; + goto L_QuestGiven; + +N_Maya: + mes "^FF0000Maya^000000"; + mes "^FF0000****^000000"; + mes "Something scary!"; + mes " "; + mes "This half naked freak need an army to take down, now its your job, good luck. Meet a girl named Jeni outside of the back entrance to Ant Hell."; + set ten_qset,4; + goto L_QuestGiven; +} diff --git a/npc/custom/quests/thq/THQS_Quests.txt b/npc/custom/quests/thq/THQS_Quests.txt new file mode 100644 index 000000000..b1e6c1652 --- /dev/null +++ b/npc/custom/quests/thq/THQS_Quests.txt @@ -0,0 +1,1052 @@ +//===== rAthena Script ======================================= +//= Treasure Hunter Quests +//===== By: ================================================== +//= Fredzilla +//===== Current Version: ===================================== +//= 1.6 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Start for Treasure hunter quests +//===== Additional Comments: ================================= +//= Event_THQS - Used to check if you have already registered +//= #Treasure_Token - used to keep track of tokens +//= 1.0 - Straight conversionof Aegis NPC file +//= 1.2 some bugfixes, typos [Lupus] +//= 1.3 Removed Duplicates [Silent] +//= 1.4 Further removed duplicates. [L0ne_W0lf] +//= 1.5 Fixed name collision with 'Little Girl' in cities/lutie.txt [Ai4rei] +//= 1.6 Changed "Caral" coordinates because moc_fild04 no longer exists. [Euphy] +//============================================================ + +///////Job list 1/////// +//1-1 +mjolnir_09,187,189,6 script Old Man 107,{ + if (one_qset==1) goto N_QuestStart; + mes "[Old Man]"; + mes "Eh! Can't and old man walk in peace anymore?!"; + close; +N_QuestStart: + mes "[Old Man]"; + mes "Eh? whats that?!"; + mes " "; + mes "My wife wants me home?! Alright, alright... I'm going, I'm going. Thank you for telling me the message."; + mes " "; + mes "Here take this Treasure Token."; + set one_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+1; + close; +} +//1-2; +pay_arche,86,129,6 script Archer 732,{ + if (one_qset == 2) goto N_QuestStart; + mes "[Kieth]"; + mes "Sorry can't talk, I'm a busy man, I'm waiting for my package."; + close; +N_QuestStart: + mes "[Kieth]"; + if (countitem(1072) < 1) { + mes "Weren't you supposed to deliver me a box? Where is it?"; + close; + } + mes "Ahh, you must be from the Treasure Hunter Agensy. Do you have my bow??"; + mes " "; + mes "Ahh, good,thank you for your time. Take this Treasure Token."; + delitem 1072,1; + set one_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+1; + close; +} +//1-3 +prt_fild06,37,192,6 script Farmer 125,{ + if (one_qset == 3 && countitem(909) > 19 && countitem(955) > 19 && countitem(914) > 19 && countitem(705) > 19) goto N_QuestComp; + if (one_qset==3) goto N_QuestStart; + mes "[Billy-Bob]"; + mes "Arrrg!... Those Bastard Bugs have eaten everything, this place donest even look like my farm anymore!!"; + close; +N_QuestComp: + mes "[Billy-Bob]"; + mes "Ohhh, thank you thats a good start for me."; + mes "Well those bugs can bugger off..."; + mes " "; + mes "Well here take these 2 Treasure Tokens."; + delitem 909,20; + delitem 955,20; + delitem 914,20; + delitem 705,20; + set one_qset,0; + set #Treasure_Token,#Treasure_Token+2; + set On_Quest,0; + close; +N_QuestStart: + mes "[Billy-Bob]"; + mes "Those Bastard Bugs are Everywere!!!"; + mes "You must be from the guild! OK, bring me 20 Worm Peelings, 20 Jellopys, 20 fluff and 20 Clovers."; + close; +} +//1-4 +prontera,264,353,6 script Old Lady#thq 103,{ + if (one_qset == 4 && countitem(934) > 14) goto N_QuestComp; + if (one_qset == 4) goto N_QuestStart; + mes "[Old Lady]"; + mes "This is my husbands grave... I'm just paying him a little visit."; + close; +N_QuestComp: + mes "[Old Lady]"; + mes "You have them?!"; + next; + mes "[Old Lady]"; + mes "Thank you sooo much here have these 3 Treasure Tokens."; + delitem 934,15; + set #Treasure_Token,#Treasure_Token+3; + set one_qset,0; + set On_Quest,0; + close; +N_QuestStart: + mes "[Old Lady]"; + mes "So your the one that has come to help me?"; + mes " "; + mes "Ok well this is what I wanted you to do,this greave beside me is my husbands grave and I promised him that I would bury some Mementos with him, The problem is that I have no Mementos..."; + next; + mes "[Old Lady]"; + mes "Bring me 15 Mementos, please."; + close; +} +///////Job list 2/////// +//2-1; +morocc,59,109,6 script Erika 700,{ + if (two_qset == 1 && countitem(1072) > 0) goto N_QuestComp; + if (two_qset == 1) goto N_QuestStart; + mes "[Erika]"; + mes "Hello my name is Erika."; + close; +N_QuestComp: + mes "[Erika]"; + mes "What's that? You have a letter for me!!"; + mes "Oooooh I just love,love letters :D. next here will I open it."; + next; + mes "[Letter]"; + mes "Dear Erika"; + mes " "; + mes "Sorry to inform you but you have been evicted, please move out within 3-5 days."; + mes " "; + mes "-Managment"; + next; + mes "[Erika]"; + mes "Oh... um... Well fuck, that bastard thinks he can kick me out!!!!! He's got another thing coming!"; + mes " "; + mes "Well thank you for delivering this anyway have this Treasure Token."; + delitem 1072,1; + set two_qset,0; + set #Treasure_Token,#Treasure_Token+1; + set On_Quest,0; + close; +N_QuestStart: + mes "[Erika]"; + mes "So your the one that has a letter for me?"; + mes " "; + mes "Ok well where's the letter?"; + close; +} +//2-2; +in_moc_16,15,30,6 script Jeramiah 730,{ + if (two_qset == 2 && countitem(1998) > 0) goto N_QuestComp; + if (two_qset == 2) goto N_QuestStart; + mes "[Jeramiah]"; + mes "Its so boring when you have to next on people..."; + close; +N_QuestComp: + mes "[Jeramiah]"; + mes "Ahh hello, you must be from the Treasure Hunter Guild."; + mes "Do you have my Jur? Ahh good good. Thank you."; + mes "Here have this Treasure Hunter Token."; + delitem 1998,1; + set two_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+1; + close; +N_QuestStart: + mes "[Jeramiah]"; + mes "So your the one that is supposed to bring my Jur?"; + mes "So where's my Jur?"; + close; +} +//2-3; +prt_fild07,316,263,6 script Marsh Man 84,{ + if (two_qset == 3 && countitem(518) > 19) goto N_QuestComp; + if (two_qset == 3) goto N_QuestStart; + mes "[Lenith]"; + mes "Hello, sorry I don't have much time to talk I'm waiting for someone."; + close; +N_QuestComp: + mes "[Lenith]"; + mes "Oh hello, OH you have my honey, my bees and I thank you."; + mes " "; + mes "Here have these 2 Treasure Hunter Tokens."; + delitem 518,20; + set #Treasure_Token,#Treasure_Token+2; + set two_qset,0; + set On_Quest,0; + close; +N_QuestStart: + mes "[Lenith]"; + mes "Hello, my name is Lenith and I have a quest for you."; + mes "Well resently a bunch of stupid bears stole the supers off all my bee's nests...Stupid bears."; + mes " "; + mes "What I need you to do is find me some more honey so these bee's can get through the winter. I will need about 20 Honey."; + close; +} +//2-4; +payon,161,72,6 script Molly 714,{ + if (two_qset == 4 && countitem(7005) > 0) goto N_QuestComp; + if (two_qset == 4) goto N_QuestStart; + mes "[Molly]"; + mes "Sorry can't talk, I'm waiting for someone."; + close; +N_QuestComp: + mes "[Molly]"; + mes "WOW YOU DID IT!!!"; + mes " "; + mes "I knew you looked strong, I have no idea how you could have killed that monster though."; + mes "thank you so much, here have these 3 Guild Tokens as a reward."; + delitem 7005,1; + set two_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+3; + close; +N_QuestStart: + mes "[Molly]"; + mes "Wow you must be the brave man from the treasure hunter guild!"; + mes "Ok here is whats happening, I don't know what started it but there is a strange Ronan Skeleton running aroung the woods 2 East from here."; + next; + mes "[Molly]"; + mes "We have try to kill him in the past but it was not...ummm...It was a bad idea. What I want you to do is go there and bring me back his Skull as proof of you killing him."; + mes " "; + mes "Good Luck"; + close; +} +///////Job list 3/////// +//3-1; +moc_fild04,208,322,6 script Clark 65,{ + if (three_qset == 1 && countitem(1040) > 29) goto N_QuestComp; + if (three_qset == 1) goto N_QuestStart; + mes "[Clark]"; + mes "Love to chat, but I'm waiting for someone."; + close; +N_QuestComp: + mes "[Clark]"; + mes "Ok well this is a start."; + mes " "; + mes "I hope that this hole will go away 1 day, and I might have another quest for you in the future."; + mes "here take these 2 Treasure Tokens."; + delitem 1040,30; + set #Treasure_Token,#Treasure_Token+2; + set three_qset,0; + set On_Quest,0; + close; +N_QuestStart: + mes "[Clark]"; + mes "Well hello to you."; + mes "You must be from the Treasure Hunter Guild."; + mes " "; + mes "Ok well this is my problem, yah see that hole in the ground? Yah that thing just popped out of nowhere a couple years ago, inside its full of these ugly ants and these monsters called Giearths."; + next; + mes "[Clark]"; + mes "What I want you to do is kill some of the Giearths.Bring me 30 of there little Moustaches."; + close; +} +//3-2; +yuno_fild01,186,162,6 script Flank 73,{ + if (three_qset == 2 && countitem(1082) > 0) goto N_QuestComp; + if (three_qset == 2) goto N_QuestStart; + mes "[Flank]"; + mes "Sorry I'm waiting for my package so I don't want to talk."; + close; +N_QuestComp: + mes "[Flank]"; + mes "Perfect right on time, now I must be going to plant this bomb.... Err I meen give this package to my mother for her birthday."; + next; + mes "[Flank]"; + mes "Thanks"; + mes "Have this Treasure Token"; + delitem 1082,1; + set three_qset,0; + set #Treasure_Token,#Treasure_Token+1; + set On_Quest,0; + close; +N_QuestStart: + mes "[Flank]"; + mes "So you have my packages?"; + mes "Well where is it then?"; + close; +} +//3-3 Goes to 7-3 using callfunc +prt_sewb1,120,245,6 script Sewer Managment Knight 705,{ + if (three_qset == 3 && countitem(955) > 149) goto N_QuestComp; + if (three_qset == 3) goto N_QuestStart; + if (seven_qset == 3) goto N_QuestStart2; + mes "[Sewer Managmant]"; + mes "Live dosent get any worse for me,working in the bug filled Culvert every day..."; + close; +N_QuestComp: + mes "[Sewer Managment]"; + mes "Well that looked like it was no trouble for you."; + mes "Thanks have these 4 Treause Tokens."; + delitem 955,150; + set #Treasure_Token,#Treasure_Token+4; + set three_qset,0; + set On_Quest,0; + close; +N_QuestStart: + mes "[Sewer Managmant]"; + mes "For a while now we have had monster, mostly bugs infesting the culvert..."; + mes " "; + mes "What I want you to do is kinda clean some of it out, every little bit counts."; + mes "Bring me 150 Worm Peelings."; + close; +N_QuestStart2: + callfunc "seven_qset-3"; + close; +} +//3-4 +mjolnir_02,87,357,6 script Man#01 51,{ + if (three_qset == 4 && countitem(1041) > 49) goto N_QuestComp; + if (three_qset == 4) goto N_QuestStart; + mes "[Rudolfo]"; + mes "Danger, the Coal Mine is now a hostile area."; + close; +N_QuestComp: + mes "[Rudolfo]"; + mes "Well its good to see that you have come back alive."; + mes "I had my doughts but thank you for your help."; + mes " "; + mes "Here have these 4 Treasure Tokens."; + delitem 1041,50; + set three_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+4; + close; +N_QuestStart: + mes "[Rudolfo]"; + mes "Hello, you must be from the Treasure Hunter Guild."; + mes " "; + mes "They must have filled you in on what is happening on the lower levels of this Coal Mine, I know its desturbing and we are still trying to figure out why and how 2 Evil Druids got down there."; + mes " "; + mes "Well what I want you to do is bring me 50 Lantern's as proof that you have cleaned some of them out, any loot you find down there you may keep other then what I have asked you to get for me."; + close; +} +///////Job list 4/////// +//4-1; +pay_arche,45,138,6 script Flora 724,{ + if (four_qset == 1 && countitem(957) > 49) goto N_QuestComp; + if (four_qset == 1) goto N_QuestStart; + mes "[Flora]"; + mes "Well hello be carfull in the cave, we have heard reports of Undead monster funning around."; + close; +N_QuestComp: + mes "[Flora]"; + mes "Welcome back, good job you did it. (I wonder if that Flaming Bastard is still alive)"; + mes "Well I hope that cut down a bit on the monsters and here have these 2 Tokens."; + delitem 957,50; + set #Treasure_Token,#Treasure_Token+2; + set four_qset,0; + set On_Quest,0; + killmonster "pay_dun00","Flora::OnMobDead"; + close; +N_QuestStart: + mes "[Flora]"; + mes "Well hello there."; + mes " "; + mes "Well this is what I need you to do, bring me 50 Decayed Nails - awile back Payon Cave used to be a safe place to go...But now things have gone out of controll and Zombies have invaded the first floor..."; + mes " "; + mes "There is also these new monsters that have just poped out of no were, we call them Flaming Bastards...Be carfull if you arn't powerfull yet because they are very strong."; + next; + mes "[Flora]"; + mes "Good Luck"; + mes "Remember I need 50 Nail's"; + monster "pay_dun00",0,0,"Flaming Bastard",1072,1,"Flora::OnMobDead"; + monster "pay_dun00",0,0,"Flaming Bastard",1072,1,"Flora::OnMobDead"; + close; +OnMobDead: + end; +} +//4-2; +yuno,45,138,6 script Zed 735,{ + if (four_qset == 2 && countitem(1999) > 0) goto N_QuestComp; + if (four_qset == 2) goto N_QuestStart; + mes "[Zed]"; + mes "Get out of my face you flake."; + close; +N_QuestComp: + mes "[Zed]"; + mes "Dear god took you long enough you bastard!"; + mes "You know how much my time is worth!!!!"; + mes "Your slow and I'm never gona recomend a job for you, Gimmie my staff and get out of me face!"; + next; + mes "[Zed]"; + mes "Well you can take this crapy Treausre Token."; + delitem 1999,1; + set On_Quest,0; + set four_qset,0; + set #Treasure_Token,#Treasure_Token+1; + close; +N_QuestStart: + mes "[Zed]"; + mes "Where's my staff?"; + close; +} +//4-3; +prontera,176,204,6 script Dassy 95,{ + if (four_qset == 3 && countitem(711) > 19) goto N_QuestComp; + if (four_qset == 3) goto N_QuestStart; + mes "[Dassy]"; + mes "Hello!"; + close; +N_QuestComp: + mes "[Dassy]"; + mes "Yes! Now my pet will not starve!"; + mes "Thank you so much!"; + mes "Have this Treasure Token."; + delitem 711,20; + set On_Quest,0; + set four_qset,0; + set #Treasure_Token,#Treasure_Token+1; + close; +N_QuestStart: + mes "[Dassy]"; + mes "Hello person!!"; + mes "You have come to help me? Yes, yes."; + mes " "; + mes "Ok I don't want to talk about it but I need you to fine me 20 Shoot's"; + mes "Thank you!"; + close; +} +//4-4; +prt_gld,157,99,6 script Czhore 752,{ + if (four_qset == 4 && countitem(714) > 0) goto N_QuestComp; + if (four_qset == 4) goto N_QuestStart; + mes "[Czhore]"; + mes "Hello friend"; + mes "Have you come to check out one of these guild halls?"; + close; +N_QuestComp: + mes "[Czhore]"; + mes "Thank god!"; + mes " "; + mes "I'm so happy to see one of these Emperiums! Thank you "+strcharinfo(0)+"."; + next; + mes "[Czhore]"; + mes "Here have these 2 Treasure Tokens."; + mes "And some of my old treasure..."; + delitem 714,1; + monster "prt_gld",155,99,"Old Man's Treasure",1324,1; + set four_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+2; + close; +N_QuestStart: + mes "[Czhore]"; + mes "Hello friend"; + mes "I know this may sound stupid but ever since I was a boy I have dreamed of having an Emperium..."; + mes "As I know I look old, I have just never been able to find one, now that I am retired from the Treasure Hunter Guild there is no more action for me..."; + mes " "; + mes "If you can get me one I shall reward you."; + close; +} +///////Job list 5/////// +//5-1; +prt_maze01,18,184,6 script Lithin#01 752,{ + if (five_qset == 1 && countitem(1028) > 14) goto N_QuestComp; + if (five_qset == 1) goto N_QuestStart; + mes "[Lithin]"; + mes "Well hello."; + mes "Welcome to the Forest Maze."; + close; +N_QuestComp: + mes "[Lithin]"; + mes "Oh thank you so much, but they will be back..."; + next; + mes "Take these 2 Treasure Tokens"; + delitem 1028,15; + set five_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+2; + close; +N_QuestStart: + mes "[Lithin]"; + mes "Well hello."; + mes "Welcome to the Forest Maze, I have a task for you."; + mes " "; + mes "Ever heard of a moster called a Savage? It looks like a boar but it makes very annoying noices."; + mes "What I want you to do is bring me 15 Manes from the savages."; + close; +} +//5-2 goes to 6-2 using callfunc; +moc_ruins,75,167,6 script Lithin#02 87,{ + if (five_qset == 2 && countitem(932) > 29) goto N_QuestComp; + if (five_qset == 2) goto N_QuestStart; + if (six_qset == 2) goto N_QuestStart2; + mes "[Strange Man]"; + mes "..."; + close; +N_QuestComp: + mes "[Strange Man]"; + mes "Much thanks I have for you."; + next; + mes "Take with you these 2 Treasure Token's."; + delitem 932,30; + set #Treasure_Token,#Treasure_Token+2; + set five_qset,0; + set On_Quest,0; + close; +N_QuestStart: + mes "[Strange Man]"; + mes "Must do for me you shall.Venture through the Pyramid."; + mes "When second floor you have reached,slay skeletons of evil."; + mes "Bring me back there bones you must."; + mes "It is 30 that I desire."; + close; +N_QuestStart2: + callfunc "six_qset2"; +} +//5-3; +geffen,57,130,6 script Blonde Girl 724,{ + if (five_qset == 3 && countitem(744) > 0) goto N_QuestComp; + if (five_qset == 3) goto N_QuestStart; + mes "[Blonde Girl]"; + mes "I wonder what happened to my flowers"; + close; +N_QuestComp: + mes "[Blonde Girl]"; + mes "Oh are these my flower! To bad I don't want them anymore..."; + mes " "; + mes "You can keep them is you want."; + next; + mes "[Blonde Girl]"; + mes "Here take this Treasure Token as a reward."; + set five_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+1; + close; +N_QuestStart: + mes "[Blonde Girl]"; + mes "Hello, did you bring me flowers!?!"; + close; +} +//5-4; +gef_tower,49,27,6 script Wizard#01 735,{ + if (five_qset == 4 && countitem(1059) > 49) goto N_QuestComp; + if (five_qset == 4) goto N_QuestStart; + mes "[Wizard]"; + mes "Hello, have you seen my Whisper friend?"; + close; +N_QuestComp: + mes "[Wizard]"; + mes "Thank you for helping me, I presume the worse."; + next; + mes "[Wizard]"; + mes "Here take these 4 Treasure Tokens."; + delitem 1059,50; + set five_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+4; + close; +N_QuestStart: + mes "[Wizard]"; + mes "Hello, the reason why I brought you here was because of a long time ago I made a friend, which happened to be a Whipser."; + mes "He told me that he was always bullied by the other ghosts down there and I haven't seen him in a while."; + mes "Thinking of the worse case here, I want vengance!"; + mes " "; + mes "Bring me 50 Fabrics!"; + close; +} +///////Job list 6/////// +//6-1; +moc_prydb1,47,132,6 script Thief 48,{ + if (six_qset == 1 && countitem(1083) > 0) goto N_QuestComp; + if (six_qset == 1) goto N_QuestStart; + mes "[Thief]"; + mes "Welcome to the Thiefs Guild."; + close; +N_QuestComp: + mes "[Thief]"; + mes "Thank you for this delivery."; + next; + mes "[Thief]"; + mes "Here take this Treasure Token as a reward."; + delitem 1083,1; + set six_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+1; + close; +N_QuestStart: + mes "[Thief]"; + mes "Where's my delivery?"; + close; +} +//6-2 +function script six_qset2 { + if (six_qset == 2 && countitem(930) > 29) goto N_QuestComp2; + mes "[Strange Man]"; + mes "Another quest for you I have."; + mes "Futher into the pyramid you must go."; + mes "Fighting Mummys is future for you."; + mes " "; + mes "Bring back for me their wrappings you must."; + mes "It is 30 Rotten bandages I desire."; + close; +N_QuestComp2: + mes "[Strange Man]"; + mes "Much thanks for you that I have."; + next; + mes "[Strange Man]"; + mes "Take with you these 3 tokens."; + delitem 930,30; + set #Treasure_Token,#Treasure_Token+3; + set On_Quest,0; + set six_qset,0; + close; +} +//6-3; +xmas,144,136,6 script Chirach 48,{ + if (six_qset == 3 && countitem(1083) > 0) goto N_QuestComp; + if (six_qset == 3) goto N_QuestStart; + mes "[Chirach]"; + mes "Welcome."; + close; +N_QuestComp: + mes "[Chirach]"; + mes "Thank you for this delivery."; + next; + mes "[Chirach]"; + mes "Here take this Treasure Token as a reward."; + delitem 1083,1; + set six_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+1; + close; +N_QuestStart: + mes "[Chirach]"; + mes "Where's my delivery?"; + close; +} +//6-4; +gef_tower,52,87,6 script Wizard#02 735,{ + if (six_qset == 4 && countitem(944) > 19) goto N_QuestComp; + if (six_qset == 4) goto N_QuestStart; + mes "[Zuuzuu]"; + mes "Hello, welcome to geffen tower."; + close; +N_QuestComp: + mes "[Wizard]"; + mes "Thank you for helping me."; + next; + mes "Here take these 4 Treasure Tokens."; + delitem 944,20; + set six_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+4; + next; + mes "[Zuuzuu]"; + mes "Oh dear god!!!"; + mes "One of those evil mosters has followed you up here, Kill it, Kill it!!!"; + next; + monster "gef_tower",42,89,"Evil Nightmare",1061,1; + close; +N_QuestStart: + mes "[Zuuzuu]"; + mes "Hello, the reason I sent for a young adventurer was because of the problems we are having under the tower."; + mes "There seem to be more ghosts day after day down there. What I need you to do is go down there and find these mosters we call Nightmares."; + mes " "; + mes "You must slay them and bring me 20 of there horse shoes."; + close; +} +///////Job list 7/////// +//7-1 goes to 8-1 using callfunc; +prontera,123,208,6 script Little Girl#thq 717,{ + if (seven_qset == 1 && countitem(531) > 4) goto N_QuestComp; + if (seven_qset == 1) goto N_QuestStart; + if (eight_qset == 1) goto N_QuestStart2; + mes "[Girl]"; + mes "Hello mister "+strcharinfo(0)+"."; + close; +N_QuestComp: + mes "[Girl]"; + mes "Thank you so much!"; + next; + mes "[Girl]"; + mes "Have these 1 Treasure Tokens."; + delitem 531,5; + set seven_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+1; + close; +N_QuestStart: + mes "[Girl]"; + mes "Hi mister person. Can you get me some apple juice?"; + mes "I want 5 of them."; + close; +N_QuestStart2: + callfunc "eight_qset1"; +} +//7-2; +alberta,101,84,6 script Charles 48,{ + if (seven_qset == 2 && countitem(1082) > 0) goto N_QuestComp; + if (seven_qset == 2) goto N_QuestStart; + mes "[Charles]"; + mes "Hello "+strcharinfo(0)+" welcome to Alberta."; + close; +N_QuestComp: + mes "[Charles]"; + mes "Thank you for this delivery."; + next; + mes "[Charles]"; + mes "Here take this Treasure Token as a reward."; + delitem 1082,1; + set seven_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+1; + close; +N_QuestStart: + mes "[Charles]"; + mes "So where is my package?"; + close; +} +//7-3 +function script seven_qset-3 { + if (seven_qset == 3 && countitem(969) > 0) goto N_QuestComp2; + mes "[Sewer Managment]"; + mes "Well there have been reports of a Golden Thief Bug running around the bottem on the Culvert"; + mes " "; + mes "Bring me 1 Gold Bar from him."; + close; +N_QuestComp2: + mes "[Sewer Managment]"; + mes "Thank you for helping me."; + next; + mes "[Sewer Managment]"; + mes "Here take these 4 Treasure Tokens."; + delitem 969,1; + set seven_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+4; + close; +} +//7-4; +alb2trea,94,102,6 script Scarlet 725,{ + if (seven_qset == 4 && countitem(1127) > 0) goto N_QuestComp; + if (seven_qset == 4) goto N_QuestStart; + mes "[Scarlet]"; + mes "Sorry, busy."; + close; +N_QuestComp: + mes "[Scarlet]"; + mes "Thank you for helping me, I presume the worse."; + next; + mes "[Scarlet]"; + mes "Here take these 4 Treasure Tokens."; + delitem 1127,1; + set seven_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+4; + close; +N_QuestStart: + mes "[Scarlet]"; + mes "Good your here. Ok there are reports of an old captain named Drake abored this ship. Kill Him!"; + mes " "; + mes "Bring me his Saber as proof!"; + close; +} +///////Job list 8/////// +//8-1 +function script eight_qset1 { + if (eight_qset == 1 && countitem(532) > 4) goto N_QuestComp2; + mes "[Girl]"; + mes "Hi mister person. Can you get me some Banana juice?"; + mes "I want 5 of them."; + close; +N_QuestComp2: + mes "[Girl]"; + mes "Thank you so much!"; + next; + mes "[Girl]"; + mes "Have these 1 Treasure Tokens."; + delitem 532,5; + set eight_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+1; + close; +} +//8-2; +morocc,165,55,6 script Klye 48,{ + if (eight_qset == 2 && countitem(1081) > 0) goto N_QuestComp; + if (eight_qset == 2) goto N_QuestStart; + mes "[Klye]"; + mes "Hello "+strcharinfo(0)+"."; + close; +N_QuestComp: + mes "[Klye]"; + mes "Thank you for this delivery."; + next; + mes "[Klye]"; + mes "Here take this Treasure Token as a reward."; + delitem 1081,1; + set eight_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+1; + close; +N_QuestStart: + mes "[Kyle]"; + mes "So where's my Delivery"; + close; + +} +//8-3; +prt_maze02,103,86,6 script Zack 751,{ + if (eight_qset == 3 && countitem(923) > 0) goto N_QuestComp; + if (eight_qset == 3) goto N_QuestStart; + mes "[Zack]"; + mes "Hello, have you seen my Whisper friend?"; + close; +N_QuestComp: + mes "[Zack]"; + mes "Thank you for helping me, I presume the worse."; + next; + mes "[Zack]"; + mes "Here take these 5 Treasure Tokens."; + delitem 923,1; + set eight_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+5; + close; +N_QuestStart: + mes "[Zack]"; + mes "Hello,the reason why I brought you here was because of a very strange monster known as Baphomet."; + mes "People say that Baphomet guilds the gate to the under-world but I don't belive them, Kill Baphomet!"; + mes " "; + mes "Bring me his Evil Horn!"; + close; +} +//8-4; +payon,136,129,6 script Flower 703,{ + if (eight_qset == 4 && countitem(746) > 9) goto N_QuestComp; + if (eight_qset == 4) goto N_QuestStart; + mes "[Flower]"; + mes "Sorry I'm waiting for someone. You will have to come back later."; + close; +N_QuestComp: + mes "[Flower]"; + mes "Thank you for helping me, I presume the worse."; + next; + mes "[Flower]"; + mes "Here take these 2 Treasure Tokens."; + delitem 746,10; + set eight_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+2; + close; +N_QuestStart: + mes "[Flower]"; + mes "Help, help I have lost my Beads!! My brother Bush is going to kill me please help"; + mes " "; + mes "Bring me 10 Glass Beads!"; + close; +} +///////Job list 9/////// +//9-1; +geffen_in,168,124,6 script Mage 48,{ + if (nine_qset == 1 && countitem(1082) > 0) goto N_QuestComp; + if (nine_qset == 1) goto N_QuestStart; + mes "[Mage]"; + mes "Hello "+strcharinfo(0)+" welcome to the Mage Guild."; + close; +N_QuestComp: + mes "[Mage]"; + mes "Thank you for this delivery. Sorry about the smell, Its a box of Toad Tounges"; + next; + mes "[Mage]"; + mes "Here take this Treasure Token as a reward."; + delitem 1082,1; + set nine_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+1; + close; +N_QuestStart: + mes "[Mage]"; + mes "Hello "+strcharinfo(0)+", Where is my box of Toad Tounges?."; + close; +} +//9-2; +pay_arche,98,74,6 script School Girl 703,{ + if (nine_qset == 2 && countitem(1020) > 19) goto N_QuestComp; + if (nine_qset == 2) goto N_QuestStart; + mes "[School Girl]"; + mes "Sorry I'm waiting for someone, you will have to come back later"; + close; +N_QuestComp: + mes "[School Girl]"; + mes "Thank you for helping me."; + next; + mes "[School Girl]"; + mes "Here take these 4 Treasure Tokens."; + delitem 1020,20; + set nine_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+4; + close; +N_QuestStart: + mes "[School Girl]"; + mes "Help, Well what we know about Payon is that a while ago there was a freak fire that burnt down the old school."; + next; + mes "[School Girl]"; + mes "The strange thing about what happened was that the children inside did not seem to die from the flames. They have taken over the entire 3rd floor of Payon Cave."; + mes " "; + mes "Bring me 20 Black Hair!"; + close; +} +//9-3 +payon_in02,19,33,6 script Jack 740,{ + if (nine_qset == 3 && countitem(1022) > 0) goto N_QuestComp; + if (nine_qset == 3) goto N_QuestStart; + if (nine_qset == 4) goto N_QuestStart2; + mes "[Jack]"; + mes "Sorry I'm waiting for someone, you will have to come back later"; + close; +N_QuestComp: + mes "[Jack]"; + mes "Thank you for helping me."; + next; + mes "[Jack]"; + mes "Here take these 4 Treasure Tokens."; + delitem 1022,1; + set nine_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+4; + close; +N_QuestStart: + mes "[Jack]"; + mes "Well I don't know much about this, it has to do with the deepest reagions of Payon Cave. We don't know much because no one ever seems to make it back alive. We suspect a monster we call the Moonlight Flower"; + mes " "; + mes "Bring me back 1 Nine Tales!"; + close; +N_QuestStart2: +//9-4 + if (nine_qset == 4 && countitem(901) > 39) goto N_QuestComp2; + mes "[Jack]"; + mes "Hello, we need you to investigate some crap in the 3rd level of payon."; + mes " "; + mes "Bring me back 40 Daenggie's."; + close; +N_QuestComp2: + mes "[Jack]"; + mes "Thank you for helping me."; + next; + mes "[Jack]"; + mes "Here take these 3 Treasure Tokens."; + delitem 901,40; + set nine_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+3; + close; +} +///////Job list 10/////// +//10-1 +morocc,193,51,6 script Kreg 48,{ + if (ten_qset == 1 && countitem(1082) > 0) goto N_QuestComp; + if (ten_qset == 1) goto N_QuestStart; + mes "[Kreg]"; + mes "Hello "+strcharinfo(0)+" welcome to Morroc."; + close; +N_QuestComp: + mes "[Kreg]"; + mes "Thank you for this delivery."; + next; + mes "[Kreg]"; + mes "Here take this Treasure Token as a reward."; + delitem 1082,1; + set ten_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+1; + close; +N_QuestStart: + mes "[Kreg]"; + mes "So where's my Delivery"; + close; +} +//10-2; +pay_fild10,145,252,6 script Man#02 122,{ + if (ten_qset == 2 && countitem(1029) > 0) goto N_QuestComp; + if (ten_qset == 2) goto N_QuestStart; + mes "[Man]"; + mes "Sorry I'm waiting for someone, you will have to come back later"; + close; +N_QuestComp: + mes "[Man]"; + mes "Thank you for helping me."; + next; + mes "[Man]"; + mes "Here take these 4 Treasure Tokens."; + delitem 1029,1; + set ten_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+4; + close; +N_QuestStart: + mes "[Man]"; + mes "Tony the Tiger is on Crack! He must be stoped, KILL HIM!"; + mes " "; + mes "Bring me back 1 Tiger's_Skin!"; + close; +} +//10-3; +cmd_fild08,328,349,4 script Caral 119,{ + if (ten_qset == 3 && countitem(1015) > 0) goto N_QuestComp; + if (ten_qset == 3) goto N_QuestStart; + mes "[Caral]"; + mes "Sorry I'm waiting for someone, you will have to come back later."; + close; +N_QuestComp: + mes "[Caral]"; + mes "Thank you for helping me."; + next; + mes "[Caral]"; + mes "Here take these 4 Treasure Tokens."; + delitem 1015,1; + set ten_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+4; + close; +N_QuestStart: + mes "[Caral]"; + mes "Phreeoni the Pink Fluff is terrorizing little novices! He must be stoped, KILL HIM!"; + mes " "; + mes "Bring me back 1 Tounge!"; + close; +} +//10-4 +moc_fild15,250,251,6 script Jeni 727,{ + if (ten_qset == 4 && countitem(1096) > 0) goto N_QuestComp; + if (ten_qset == 4) goto N_QuestStart; + mes "[Jeni]"; + mes "Sorry I'm waiting for someone, You will have to come back later"; + close; +N_QuestComp: + mes "[Jeni]"; + mes "Thank you for helping me."; + next; + mes "[Jeni]"; + mes "Here take these 3 Treasure Tokens."; + delitem 1096,1; + set ten_qset,0; + set On_Quest,0; + set #Treasure_Token,#Treasure_Token+3; + close; +N_QuestStart: + mes "[Jeni]"; + mes "This half naked freak need an army to take down, now its your job,good luck."; + mes " "; + mes "Bring me back 1 Round Shell!"; + close; +} diff --git a/npc/custom/quests/thq/THQS_TTShop.txt b/npc/custom/quests/thq/THQS_TTShop.txt new file mode 100644 index 000000000..7752a0960 --- /dev/null +++ b/npc/custom/quests/thq/THQS_TTShop.txt @@ -0,0 +1,516 @@ +//===== rAthena Script ======================================= +//= Treasure Hunter Quests +//===== By: ================================================== +//= Fredzilla +//===== Current Version: ===================================== +//= 1.1 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Start for Treasure hunter quests +//===== Additional Comments: ================================= +//= Event_THQS - Used to check if you have already registered +//= #Treasure_Token - used to keep track of tokens +//= 1.0 - Straight conversion of Aegis NPC file +//= 1.1 - balanced some prices, fixed 1 missing label +//= removed Executioner&Mysteltain swords [Lupus] +//============================================================ + +prt_in,159,172,0 warp thqwrp 3,3,yuno_in01,123,155 + +prt_in,164,174,1 script Treasure Hunter's Shop 65,{ + mes "[Ash]"; + mes "Ahh, "+strcharinfo(0)+"! Welcome to the Offical Treasure Hunter's Guild Shop."; + mes "You currently have ^FF0000"+#Treasure_Token+"^000000 treasure tokens!!!"; + next; + menu "How does this place work?",-,"What do you have in stock?",N_Shop,"Nevermind",N_NVM; + mes "[Ash]"; + mes "Well you see here you can exchange your treasure hunter tokens for zeny or rare weapons forged by our blacksmiths."; + mes " "; + mes "Everything has its own price value and the only way you can get the tokens is by completing quests assigned to you,the system normally works like this."; + mes " "; + mes "The harder the mission the more Tokens you will earn. All red quests are worth 4-8 Tokens, and the rest are worth 1-5."; + mes " "; + mes "Hope that solves your problem and questions."; + close; +N_NVM: + close; + end; +N_Shop: +//This is when it gets hard :) + mes "[Ash]"; + mes "Ok here is our Big list of goods."; + mes " "; + mes "(Note T stands for a Treasure Token.)"; + next; + menu "Trade for Zeny",-,"Trade for Weapons",N_BuyWeps,"Trade for Cards",N_BuyCards,"Nevermind",N_NVM; + mes "[Ash]"; + mes "This is what we have to offer."; + next; + menu "1000z - 1T",-,"10000z - 10T",N_10T,"100000z - 100T",N_100T,"Nevermind",N_NVM; + if (#Treasure_Token > 0) goto N_GetZeny1k; + mes "You don't have enough tokens!"; + close; +N_GetZeny1k: + set #Treasure_Token,#Treasure_Token-1; + set zeny,zeny+1000; + close; +N_10T: + if (#Treasure_Token > 9) goto N_GetZeny10k; + mes "You don't have enough tokens!"; + close; +N_GetZeny10k: + set #Treasure_Token,#Treasure_Token-10; + set zeny,zeny+10000; + close; +N_100T: + if (#Treasure_Token > 99) goto N_GetZeny100k; + mes "You don't have enough tokens!"; + close; +N_GetZeny100k: + set #Treasure_Token,#Treasure_Token-100; + set zeny,zeny+100000; + close; + +N_BuyWeps: + mes "[Ash]"; + mes "This is what we have to offer."; + next; + menu "Axe's",-,"1 Handed Swords",N_1HandSword,"2 Handed Swords",N_2HandSword,"Book's",N_Book,"Bow's",N_Bow,"Katar's",N_Katar,"Knuckle's",N_Knuckle,"Mace's",N_Mace,"Whips",N_Whip,"Wands",N_Wand,"Nevermind",N_NVM; + + mes "[Ash]"; + mes "This is what we have to offer."; + next; + menu "Sabbath - 160T",-,"Slaughter - 160T",N_Slau,"Tomahawk - 180T",N_Toma,"Great Axe - 200T",N_GreatA,"Guillotine - 200T",N_Guill,"Nevermind",N_NVM; + + if (#Treasure_Token < 160) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-160; + getitem 1365,1; + logmes "Treasure Token: Bought a Sabbath"; + close; +N_Slau: + if (#Treasure_Token < 160) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-160; + getitem 1367,1; + logmes "Treasure Token: Bought a Slaughter"; + close; +N_Toma: + if (#Treasure_Token < 180) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-180; + getitem 1368,1; + logmes "Treasure Token: Bought a Tomahawk"; + close; +N_GreatA: + if (#Treasure_Token < 200) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-200; + getitem 1364,1; + logmes "Treasure Token: Bought a Great Axe"; + close; +N_Guill: + if (#Treasure_Token < 200) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-200; + getitem 1369,1; + logmes "Treasure Token: Bought a Guillotine"; + close; +N_NeedToken: + mes "[Ash]"; + mes "You don't have enough tokens!"; + close; + + +N_1HandSword: + mes "[Ash]"; + mes "This is what we have to offer."; + next; + menu "Edge - 130T",-,"Solar Sword - 150T",N_SolarS,"Caesar's Sword - 170T",N_CaesarS,"Nagan - 180T",N_Nagan,"Immaterial Sword - 200T",N_ImmatS,"Excalibur - 200T",N_Excal,"Byeollungum - 240T",N_Byeoll,"Talefing - 320T",N_Talef,"Nevermind",N_NVM; + + if (#Treasure_Token < 130) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-130; + getitem 1132,1; + logmes "Treasure Token: Bought a Edge"; + close; +N_SolarS: + if (#Treasure_Token < 150) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-150; + logmes "Treasure Token: Bought a Solar Sword"; + getitem 1136,1; + close; +N_CaesarS: + if (#Treasure_Token < 170) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-170; + logmes "Treasure Token: Bought a Caesars Sword"; + getitem 1134,1; + close; +N_Nagan: + if (#Treasure_Token < 180) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-180; + logmes "Treasure Token: Bought a Nagan"; + getitem 1130,1; + close; +N_ImmatS: + if (#Treasure_Token < 200) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-200; + logmes "Treasure Token: Bought a Immaterial Sword"; + getitem 1141,1; + close; +N_Excal: + if (#Treasure_Token < 200) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-200; + logmes "Treasure Token: Bought a Excalibur"; + getitem 1137,1; + close; +N_Byeoll: + if (#Treasure_Token < 240) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-240; + logmes "Treasure Token: Bought a Byeollungum"; + getitem 1140,1; + close; +N_Talef: + if (#Treasure_Token < 320) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-320; + logmes "Treasure Token: Bought a Talefing"; + getitem 1139,1; + close; + + +N_2HandSword: + mes "[Ash]"; + mes "This is what we have to offer."; + next; + menu "Dragon Slayer - 140T",-,"Schweizersabel - 200T",N_Schwe,"Katzbalger - 300T",N_Katzb,"Muramasa - 300T",N_Murama,"Masamune - 400T",N_Masamu,"Balmung - 2000T",N_Balmu,"Nevermind",N_NVM; + + if (#Treasure_Token < 140) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-140; + logmes "Treasure Token: Bought a Dragon Slayer"; + getitem 1166,1; + close; +N_Schwe: + if (#Treasure_Token < 200) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-200; + logmes "Treasure Token: Bought a Schweizersabel"; + getitem 1167,1; + close; +N_Katzb: + if (#Treasure_Token < 300) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-300; + logmes "Treasure Token: Bought a Katzbalger"; + getitem 1170,1; + close; +N_Murama: + if (#Treasure_Token < 300) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-300; + logmes "Treasure Token: Bought a Muramasa"; + getitem 1164,1; + close; +N_Masamu: + if (#Treasure_Token < 400) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-400; + logmes "Treasure Token: Bought a Masamune"; + getitem 1165,1; + close; +N_Balmu: + if (#Treasure_Token < 2000) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-2000; + logmes "Treasure Token: Bought a Balmung"; + getitem 1161,1; + close; + + +N_Book: + mes "[Ash]"; + mes "This is what we have to offer."; + next; + menu "Book of the Burning Sun - 80T",-,"Book of the Rough Seas - 80T",N_RoughSea,"Book of the Dry Winds - 80T",N_DryWinds,"Book of the Ripe Earth - 80T",N_RipeEarth,"Book of the Revelations - 80T",N_Revela,"Bible - 90T",N_Bible,"Tablet - 120T",N_Tablet,"Nevermind",N_NVM; + + if (#Treasure_Token < 80) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-80; + logmes "Treasure Token: Bought a Book of the Burning Sun"; + getitem 1555,1; + close; +N_RoughSea: + if (#Treasure_Token < 80) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-80; + logmes "Treasure Token: Bought a Book of the Rough Seas"; + getitem 1553,1; + close; +N_DryWinds: + if (#Treasure_Token < 80) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-80; + logmes "Treasure Token: Bought a Book of the Dry Winds"; + getitem 1556,1; + close; +N_RipeEarth: + if (#Treasure_Token < 80) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-80; + logmes "Treasure Token: Bought a Book of the Ripe Earth"; + getitem 1554,1; + close; +N_Revela: + if (#Treasure_Token < 80) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-80; + logmes "Treasure Token: Bought a Book of the Revelations"; + getitem 1557,1; + close; +N_Bible: + if (#Treasure_Token < 90) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-90; + logmes "Treasure Token: Bought a Bible"; + getitem 1551,1; + close; +N_Tablet: + if (#Treasure_Token < 120) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-120; + logmes "Treasure Token: Bought a Tablet"; + getitem 1552,1; + close; + +N_Bow: + mes "[Ash]"; + mes "This is what we have to offer."; + next; + menu "Rudra's Bow - 150T",-,"Roguemaster's Bow - 150T",N_Rogue,"Nevermind",N_NVM; + + if (#Treasure_Token < 150) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-150; + logmes "Treasure Token: Bought a Rudra Bow"; + getitem 1720,1; + close; +N_Rogue: + if (#Treasure_Token < 150) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-150; + logmes "Treasure Token: Bought a Roguemaster Bow"; + getitem 1719,1; + close; + +N_Katar: + mes "[Ash]"; + mes "This is what we have to offer."; + next; + menu "Katar of the Blazing Rage - 70T",-,"Katar of the Cold Icicle - 70T",N_ColdIce,"Katar of the Piercing Wind - 70T",N_PiercWind,"Katar of the Dusty Thornbush - 70T",N_DustyT,"Sharpened Legbone of Ghoul - 125T",N_Legbone,"Infiltrator - 150T",N_Infiltra,"Nevermind",N_NVM; + + if (#Treasure_Token < 70) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-70; + logmes "Treasure Token: Bought a Katar of the Blazing Rage"; + getitem 1258,1; + close; +N_ColdIce: + if (#Treasure_Token < 70) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-70; + logmes "Treasure Token: Bought a Katar of the Cold Icicle"; + getitem 1256,1; + close; +N_PiercWind: + if (#Treasure_Token < 70) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-70; + logmes "Treasure Token: Bought a Katar of the Piercing Wind"; + getitem 1259,1; + close; +N_DustyT: + if (#Treasure_Token < 70) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-70; + logmes "Treasure Token: Bought a Katar of the Dusty Thornbush"; + getitem 1257,1; + close; +N_Legbone: + if (#Treasure_Token < 125) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-125; + logmes "Treasure Token: Bought a Sharpened Legbone of Ghoul"; + getitem 1260,1; + close; +N_Infiltra: + if (#Treasure_Token < 150) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-150; + logmes "Treasure Token: Bought a Infiltrator"; + getitem 1261,1; + close; + +N_Knuckle: + mes "[Ash]"; + mes "This is what we have to offer."; + next; + menu "Kaiser Knuckle - 75T",-,"Berserk - 75T",N_Berserk,"Nevermind",N_NVM; + + if (#Treasure_Token < 75) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-75; + logmes "Treasure Token: Bought a Kaiser Knuckle"; + getitem 1813,1; + close; +N_Berserk: + if (#Treasure_Token < 75) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-75; + logmes "Treasure Token: Bought a Berserk"; + getitem 1814,1; + close; + +N_Mace: + mes "[Ash]"; + mes "This is what we have to offer."; + next; + menu "Spike - 65T",-,"Slash - 90T",N_Slash,"Grand Cross - 100T",N_GrandC,"Quadrille - 110T",N_Quadr,"Mjolnir - 1000T",N_MJ,"Nevermind",N_NVM; + + if (#Treasure_Token < 65) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-65; + logmes "Treasure Token: Bought a Spike"; + getitem 1523,1; + close; +N_Slash: + if (#Treasure_Token < 90) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-90; + logmes "Treasure Token: Bought a Slash"; + getitem 1526,1; + close; +N_GrandC: + if (#Treasure_Token < 100) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-100; + logmes "Treasure Token: Bought a Grand Cross"; + getitem 1528,1; + close; +N_Quadr: + if (#Treasure_Token < 110) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-110; + logmes "Treasure Token: Bought a Quadrille"; + getitem 1527,1; + close; +N_MJ: + if (#Treasure_Token < 1000) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-1000; + logmes "Treasure Token: Bought a Mjolnir"; + getitem 1530,1; + close; + +N_Whip: + mes "[Ash]"; + mes "This is what we have to offer."; + next; + menu "Rapture Rose - 50T",-,"Chemeti - 65T",N_Chemeti,"Nevermind",N_NVM; + + if (#Treasure_Token < 50) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-50; + logmes "Treasure Token: Bought a Rapture Rose"; + getitem 1963,1; + close; +N_Chemeti: + if (#Treasure_Token < 65) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-65; + logmes "Treasure Token: Bought a Chemeti"; + getitem 1964,1; + close; + +N_Wand: + mes "[Ash]"; + mes "This is what we have to offer."; + next; + menu "Mighty Staff - 90T",-,"Wizardry Staff - 150T",N_Wizardry,"Bone Wand - 110T",N_BoneW,"Staff of Soul - 120T",N_SOSoul,"Nevermind",N_NVM; + + if (#Treasure_Token < 90) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-90; + logmes "Treasure Token: Bought a Mighty Staff"; + getitem 1613,1;//Items: Mighty_Staff, + close; +N_Wizardry: + if (#Treasure_Token < 150) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-150; + logmes "Treasure Token: Bought a Wizardry Staff"; + getitem 1473,1;//Items: Wizardy_Staff, + close; +N_BoneW: + if (#Treasure_Token < 110) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-110; + logmes "Treasure Token: Bought a Bone Wand"; + getitem 1615,1;//Items: Bone_Wand, + close; +N_SOSoul: + if (#Treasure_Token < 120) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-120; + logmes "Treasure Token: Bought a Staff of Soul"; + getitem 1472,1;//Items: Staff_of_Soul, + close; + +N_BuyCards: + mes "[Ash]"; + mes "This is what we have to offer. All Cards are 300T"; + next; + menu "Poring Card - 2T",-,"Pasana Card - 420T",N_CPasana,"Dokebi Card - 420T",N_CDok,"Swordfish Card - 420T",N_CSFish, + "Sandman Card - 420T",N_CSMan,"Drainliar Card - 360T",N_CDrain,"Kaho Card - 360T",N_CKaho,"Mandragora Card - 360T",N_CMand, + "Vadon Card - 360T",N_CVadon,"Mummy Card - 540T",N_CMummy,"Zenorc Card - 240T",N_CZeno,"Condor Card - 240T",N_CCond, + "Zombie Card - 210T",N_CZomb,"Nevermind",N_NVM; + + if (#Treasure_Token < 2) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-2; + logmes "Treasure Token: Bought a Poring Card"; + getitem 4001,1;//Items: Poring_Card, + close; + +N_CPasana: + if (#Treasure_Token < 420) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-420; + logmes "Treasure Token: Bought a Pasana Card"; + getitem 4099,1;//Items: Pasana_Card, + close; +N_CDok: + if (#Treasure_Token < 420) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-420; + logmes "Treasure Token: Bought a Dokebi Card"; + getitem 4098,1;//Items: Dokebi_Card, + close; +N_CSFish: + if (#Treasure_Token < 420) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-420; + logmes "Treasure Token: Bought a Swordfish Card"; + getitem 4089,1;//Items: Sword_Fish_Card, + close; +N_CSMan: + if (#Treasure_Token < 420) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-420; + logmes "Treasure Token: Bought a Sandman Card"; + getitem 4101,1;//Items: Sand_Man_Card, + close; +N_CDrain: + if (#Treasure_Token < 360) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-360; + logmes "Treasure Token: Bought a Drainliar Card"; + getitem 4069,1;//Items: Drainliar_Card, + close; +N_CKaho: + if (#Treasure_Token < 360) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-360; + logmes "Treasure Token: Bought a Kaho Card"; + getitem 4065,1;//Items: Kaho_Card, + close; +N_CMand: + if (#Treasure_Token < 360) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-360; + logmes "Treasure Token: Bought a Mandragora Card"; + getitem 4030,1;//Items: Mandragora_Card, + close; +N_CVadon: + if (#Treasure_Token < 360) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-360; + logmes "Treasure Token: Bought a Vadon Card"; + getitem 4049,1;//Items: Vadon_Card, + close; +N_CMummy: + if (#Treasure_Token < 540) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-540; + logmes "Treasure Token: Bought a Mummy Card"; + getitem 4106,1;//Items: Mummy_Card, + close; +N_CZeno: + if (#Treasure_Token < 240) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-240; + logmes "Treasure Token: Bought a Zenorc Card"; + getitem 4096,1;//Items: Zenorc_Card, + close; +N_CCond: + if (#Treasure_Token < 240) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-240; + logmes "Treasure Token: Bought a Condor Card"; + getitem 4015,1;//Items: Condor_Card, + close; +N_CZomb: + if (#Treasure_Token < 210) goto N_NeedToken; + set #Treasure_Token,#Treasure_Token-210; + logmes "Treasure Token: Bought a Zombie Card"; + getitem 4038,1;//Items: Zombie_Card, + close; +} diff --git a/npc/custom/quests/umbalian_language.txt b/npc/custom/quests/umbalian_language.txt new file mode 100644 index 000000000..674ea6e03 --- /dev/null +++ b/npc/custom/quests/umbalian_language.txt @@ -0,0 +1,208 @@ +//===== rAthena Script ======================================= +//= Custom Umbalian Language Quest +//===== By: ================================================== +//= sabernet09 +//===== Current Version: ===================================== +//= 1.1 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= 1.1 Removed it from offical Umbala Quests [Lupus] +//============================================================ + +prontera,145,290,5 script Mason 742,{ + mes "[Mason]"; + if(umb_lang==0) goto L_NOT_GOT_QUEST; + if(umb_lang==2 || umb_mason==1) goto L_AGAIN; + + mes "Hey there, I came here to Prontera in search of an old lady who can remove cards from slots. Do you know where I can find her?"; + menu "Yes",-, "No",M_NO; + + mes "Oooo, could you please tell me where she's at? I'd be really appreciative."; + menu "Swordsman Association",-, "Sanctuary",M_Boo1,"Prontera Chivalry",M_Boo2,"Trading Post",M_Boo3,"Kit Shop",M_Boo4,"Inn",M_Boo5,"Armory",M_DONE,"Library",M_Boo6,"Job Agency",M_Boo7,"Prontera Castle",M_Boo8,"City Hall",M_Boo9; + + next; + mes "[Mason]"; + mes "Hmm... I dunno why she would be there... guess I'll take a look."; + close; +M_Boo1: + next; + mes "[Mason]"; + mes "Wow I never knew she was a religious person... I'll see to it thanks."; + close; +M_Boo2: + next; + mes "[Mason]"; + mes "Hmm.... are you sure about that?"; + close; +M_Boo3: + next; + mes "[Mason]"; + mes "Why would she need to go there? I think you might be mistaken."; + close; +M_Boo4: + next; + mes "[Mason]"; + mes "The only thing she'd need at a Kit shop is medicine for her rheumatism. She's probably long gone from there by now."; + close; +M_Boo5: + next; + mes "[Mason]"; + mes "I don't think she needs to be there, she LIVES here in Prontera."; + close; +M_Boo6: + next; + mes "[Mason]"; + mes "Ah I see, if she's studying then I don't want to bother her. Thanks anyways."; + close; +M_Boo7: + next; + mes "[Mason]"; + mes "Job Agency? I don't think so. Don't lead me all around Prontera please! She's already a teacher here."; + close; +M_Boo8: + next; + mes "[Mason]"; + mes "The castle eh, I don't want to step in there... just doesn't feel like my style. I don't like that noble feeling of importance type of thing."; + close; +M_Boo9: + next; + mes "[Mason]"; + mes "O wow, did she become an important part of Prontera? I'd think she's too busy for me to visit. I'll try again later."; + close; +M_DONE: + next; + mes "[Mason]"; + mes "Ah, I heard that her class was somewhere around there... thanks a lot! Here's a lil something for your help."; + getitem 7117,1;//Items: Torn Spell Book, + set umb_mason,1; + close; + +L_AGAIN: + emotion e_thx; + mes "Yay, I found her! Thank you very much for you help!"; + close; + +L_NOT_GOT_QUEST: + mes "Hi! I came here to Prontera in search of an old lady... But..."; + close; +M_NO: + mes "Oh.. Ok.. Thanks anyways."; + close; +} + +aldebaran,153,212,1 script Mojo 740,{ + mes "[Mojo]"; + if(umb_lang!=1) goto L_NOT_GOT_QUEST; + mes "Oh no! I lost my teacher's ^FF0000old magic book^000000!"; + mes "What am I going to do... those dumb Bathory..."; + if(umb_lang==1) set umb_mojo,1; + close; +L_NOT_GOT_QUEST: + emotion e_what; + mes "I lost my teacher's book! What am I going to do..."; + close; +} + +amatsu,267,189,4 script Marie 744,{ + mes "[Marie]"; + if(umb_lang==0) goto L_NOT_GOT_QUEST; + if(umb_lang==2 || umb_marie==1) goto L_AGAIN; + if(countitem(9001)>0 && countitem(643)>0) goto L_DONE;//Items: Poring Egg, Pet Incubator, + mes "Hello, is there something you need?"; + next; + menu "No nothing at all.",M_NO,"Your teacher sent me.",-; + + mes "[Marie]"; + mes "What does he want from me?"; + emotion e_what; + next; + mes "[Marie]"; + mes "Oh wait, I see... he wants his reference scroll back am I right? Well, I'm kinda still using it buuut... I'll give it back if you can gimme a poring egg and an incubator. Those things are so cute!"; + close; + +L_NOT_GOT_QUEST: + emotion e_what; + mes "Hi! What do you want from me?"; + close; + +M_NO: + mes "[Marie]"; + mes "Hrrmm okay? Cya then.."; + close; + +L_DONE: + mes "Heyyy there, you have a poring egg and the pet incubator to go with it! Are those for me?"; + menu "Yep!",-, "Sorry, no.",M_DOH; + + mes "[Marie]"; + if(countitem(9001)==0 && countitem(643)==0) goto M_DOH;//Items: Poring Egg, Pet Incubator, + mes "Yatta! Here's a lil something in return."; + delitem 9001,1;//Items: Poring Egg, + delitem 643,1;//Items: Pet Incubator, + getitem 7118,1;//Items: Torn Scroll, + set umb_marie,1; //got Torn Scroll + close; + +M_DOH: + mes "Oh.. pooo... sigh..."; + close; + +L_AGAIN: + emotion e_thx; + mes "Yay! I love Porings!"; + close; +} + +yuno,157,366,2 script Wise Man Fabius 743,{ + mes "[Fabius]"; + if(event_umbala >= 3) set umb_lang,2; //You already learnt Umbalian language from Umbalian Chief. So this Quest is disabled + if(umb_lang<2) goto L_QUEST; + mes "You speak Umbalian fluently! So you will never forget the language of Umbalians!"; + close; +L_QUEST: + if((countitem(1006) < 1) || (countitem(7118) < 1) || (countitem(7117) < 1)) goto L_DONE;//Items: Old Magic Book, Torn Scroll, Torn Spell Book, + delitem 1006,1; //Items: Old Magic Book, + delitem 7118,1; //Items: Torn Scroll, + delitem 7117,1;//Items: Torn Spell Book, + emotion e_thx; + mes "Ah, you've done well in retrieving my references. These artifacts holds information about ruins around the world, from the burning hell of the Magma Dungeon, to the strange eerie Hidden Forest of Yggsadril."; + next; + mes "[Fabius]"; + mes "But enough talk, you're just eager to get your reward aren't you? Well it may not sound much, but my reward for you is knowledge..."; + next; + mes "[Fabius]"; + mes "Actually it is knowledge of the Umbalian people. They are connected to this world of Midgard in some special way, we just can't confirm it yet. There is a theory that they may be like the elves and protect the ancient tree of Yggsadril."; + next; + mes "[Fabius]"; + mes "And I, a great wise man of Yuno, will teach you their language!"; + next; + mes "^0000FF Learned the language of Umbalians! ^000000"; + set umb_lang,2; + //clear subquests + set umb_marie,0; + set umb_mason,0; + set umb_mojo,0; + //make you understand Umbalian people + //it's an alternative way to learn Umbalian Language + if(event_umbala < 3) set event_umbala,3; + close; +L_DONE: + set umb_lang,1; //got Quest + mes "Argh! My three students ran off with my references! Hey you! Can you get them back for me? I'll gladly reward you."; + next; + mes "[Fabius]"; + mes "From what I know, they're in different seperate towns making something out of themselves."; + if(umb_marie==0 && umb_mason==0 && umb_mojo==0) goto L_NOT_MET; + if(umb_marie==1) mes "Oh... You found Marie in Amatsu."; + if(umb_mojo==1) mes "You saw Mojo in Aldebaran?"; + if(umb_mason==1) mes "So... Mason's in Prontera now... Well..."; + if(umb_marie==0) mes "I wonder where is our sea girl Marie?"; + if(umb_mojo==0) mes "Mojo should be somewhere near water..."; + if(umb_mason==0) mes "Where'd Mason go then..."; + mes "Oh yeah, tell them I sent you"; + close; +L_NOT_MET: + mes "Oh yeah, tell them I sent you, their names are Marie, Mason and Mojo."; + close; +} diff --git a/npc/custom/quests/valhallen.txt b/npc/custom/quests/valhallen.txt new file mode 100644 index 000000000..19480b105 --- /dev/null +++ b/npc/custom/quests/valhallen.txt @@ -0,0 +1,68 @@ +//===== rAthena Script ======================================= +//= Valhallen Items Quests NPC +//===== By: ================================================== +//= Avaji +//===== Current Version: ===================================== +//= 1.1 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= All-in-one: Mjolnir,Sleipnir,Brisingamen,Gleipnir,Megingjard +//= Custom quest, ingredients based on official RO FAQ +//===== Additional Comments: ================================= +//= 1.1 Optimized. [Euphy] +//============================================================ + +prontera,147,171,5 script Lenneth 811,{ + mes "[Lenneth]"; + mes "I come from Valhalla to aid you."; + mes "I can transmute for you many of the Valhallen items,"; + mes "although they require many rare elements to make."; + next; + switch(select("Mjolnir:Sleipnir:Brisingamen:Gleipnir:Megingjard")) { + case 1: + mes "[Lenneth]"; + mes "^3355FFMjolnir^000000 is the mighty Hammer of Thor."; + setarray .@Items[0],1530,1531,2,984,20,985,5,969,40,7074,2,7075,4,7078,5,7087,5,7089,5; + break; + case 2: + mes "[Lenneth]"; + mes "^3355FFSleipnir^000000 are boots made after Odin's War Horse."; + setarray .@Items[0],2410,2406,2,984,1,969,20,985,10,7076,3,7079,5,7083,3,7086,3; + break; + case 3: + mes "[Lenneth]"; + mes "^3355FFBrisingammen^000000 is the magical Necklace of Freyja, goddess of Beauty."; + setarray .@Items[0],2630,2603,1,726,2,722,3,727,10,723,5,969,20,7073,4,7077,4,7088,3,7090,3,7092,3; + break; + case 4: + mes "[Lenneth]"; + mes "The ^3355FFGleipnir^000000 is a light yet strong rope required to make ^3355FFMegingjard^000000"; + setarray .@Items[0],7058,7080,4,7081,5,7082,4,7084,3,7085,3; + break; + case 5: + mes "[Lenneth]"; + mes "The ^3355FFMegingjard^000000 is the powerful Belt of Thor."; + setarray .@Items[0],2629,7058,1,2627,1,969,10,726,10,984,5; + break; } + mes "^FF0000The items I need are as follows:^000000"; + for(set .@i,1; .@i<getarraysize(.@Items[0]); set .@i,.@i+2) { + mes " ~ "+.@Items[.@i+1]+"x ^3355FF"+getitemname(.@Items[.@i])+"^000000"; + if (countitem(.@Items[.@i]) < .@Items[.@i+1]) set .@nr,1; } + if (.@nr) close; + next; + mes "[Lenneth]"; + mes "Do you desire ^3355FF"+getitemname(.@Items[0])+"^000000?"; + next; + if(select("Yes:No")==2) { + mes "[Lenneth]"; + mes "Please return if you change your mind."; + close; } + mes "[Lenneth]"; + mes "Here is your ^3355FF"+getitemname(.@Items[0])+"^000000."; + mes "May it serve you well."; + for(set .@i,1; .@i<getarraysize(.@Items); set .@i,.@i+2) + delitem .@Items[.@i], .@Items[.@i+1]; + getitem .@Items[0],1; + close; +} diff --git a/npc/custom/resetnpc.txt b/npc/custom/resetnpc.txt new file mode 100644 index 000000000..eb34137e4 --- /dev/null +++ b/npc/custom/resetnpc.txt @@ -0,0 +1,68 @@ +//===== rAthena Script ======================================= +//= Reset NPC +//===== By: ================================================== +//= rAthena Dev Team +//===== Current Version: ===================================== +//= 1.3 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Resets skills, stats, or both. +//===== Additional Comments: ================================= +//= 1.0 First Version +//= 1.1 Optimized for the greater good. [Kisuka] +//= 1.2 Cleaning [Euphy] +//= 1.3 All statuses removed upon skill reset. [Euphy] +//============================================================ + +prontera,150,193,4 script Reset Girl 124,{ + + set .@ResetStat,5000; // Zeny for stat reset + set .@ResetSkill,5000; // Zeny for skill reset + set .@ResetBoth,9000; // Zeny for resetting both together + + mes "[Reset Girl]"; + mes "I am the Reset Girl."; + mes "Reset Stats: "+ .@ResetStat +"z"; + mes "Reset Skills: "+ .@ResetSkill +"z"; + mes "Reset Both: "+ .@ResetBoth +"z"; + mes "Please select the service you want:"; + next; + switch(select("^FF3355Reset Skills:Reset Stats:Reset Both^000000:Cancel")) { + case 1: + mes "[Reset Girl]"; + if (Zeny < .@ResetSkill) { + mes "Sorry, you don't have enough Zeny."; + close; + } + set Zeny, Zeny-.@ResetSkill; + sc_end SC_ALL; + ResetSkill; + mes "There you go!"; + close; + case 2: + mes "[Reset Girl]"; + if (Zeny < .@ResetStat) { + mes "Sorry, you don't have enough Zeny."; + close; + } + set Zeny, Zeny-.@ResetStat; + ResetStatus; + mes "There you go!"; + close; + case 3: + mes "[Reset Girl]"; + if (Zeny < .@ResetBoth) { + mes "Sorry, you don't have enough Zeny."; + close; + } + set Zeny, Zeny-.@ResetBoth; + sc_end SC_ALL; + ResetSkill; + ResetStatus; + mes "There you go!"; + close; + case 4: + close; + } +} diff --git a/npc/custom/stylist.txt b/npc/custom/stylist.txt new file mode 100644 index 000000000..77bbf7bdb --- /dev/null +++ b/npc/custom/stylist.txt @@ -0,0 +1,36 @@ +//===== rAthena Script ======================================= +//= Stylist +//===== By: ================================================== +//= Euphy +//===== Current Version: ===================================== +//= 1.1 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= Changes your hair style, hair color, and cloth color. +//===== Additional Comments: ================================= +//= 1.1 Switched to 'getbattleflag', credits to Saithis. [Euphy] +//============================================================ + +prontera,170,180,1 script Stylist#custom_stylist 122,{ + + setarray .@Styles[1],getbattleflag("max_cloth_color"),getbattleflag("max_hair_style"),getbattleflag("max_hair_color"); + setarray .@Look[1],7,1,6; + set .@s, select(" ~ Cloth color: ~ Hairstyle: ~ Hair color"); + set .@Revert, getlook(.@Look[.@s]); + set .@Style,1; + while(1) { + setlook .@Look[.@s], .@Style; + message strcharinfo(0),"This is style #"+.@Style+"."; + set .@menu$, " ~ Next (^0055FF"+((.@Style!=.@Styles[.@s])?.@Style+1:1)+"^000000): ~ Previous (^0055FF"+((.@Style!=1)?.@Style-1:.@Styles[.@s])+"^000000): ~ Jump to...: ~ Revert to original (^0055FF"+.@Revert+"^000000)"; + switch(select(.@menu$)) { + case 1: set .@Style, ((.@Style!=.@Styles[.@s])?.@Style+1:1); break; + case 2: set .@Style, ((.@Style!=1)?.@Style-1:.@Styles[.@s]); break; + case 3: message strcharinfo(0),"Choose a style between 1 - "+.@Styles[.@s]+"."; + input .@Style,0,.@Styles[.@s]; + if (!.@Style) set .@Style, rand(1,.@Styles[.@s]); + break; + case 4: set .@Style, .@Revert; setlook .@Look[.@s], .@Revert; break; + } + } +} diff --git a/npc/custom/warper.txt b/npc/custom/warper.txt new file mode 100644 index 000000000..b0fb07a66 --- /dev/null +++ b/npc/custom/warper.txt @@ -0,0 +1,391 @@ +//===== rAthena Script ======================================= +//= Warper +//===== By: ================================================== +//= Euphy +//===== Current Version: ===================================== +//= 1.2 +//===== Compatible With: ===================================== +//= rAthena SVN +//===== Description: ========================================= +//= A complete - but very condensed - warper script. +//= Coordinates written largely by Tekno-Kanix and ToastOfDoom. +//============================================================ + +- script Warper -1,{ +function Go; function Disp; function Pick; + +// -------------------------------------------------- +// Main Menu: +// -------------------------------------------------- + +menu "Last Warp ^777777["+lastwarp$+"]^000000",-, + " ~ Towns",Towns, " ~ Fields",Fields, " ~ Dungeons",Dungeons, + " ~ Guild Castles",Castles, " ~ Special Areas",Special; + + if (lastwarp$ == "") dispbottom "You have not warped anywhere yet."; + else warp lastwarp$,lastwarpx,lastwarpy; + close; + +// ------------------- Functions ------------------- +// * Go("<map>",<x>,<y>); +// ~ Warps directly to a map. +// * Disp("<Menu Option>",<first option>,<last option>); +// * Pick("<map_prefix>"{,<index offset>}); +// ~ Dynamic menu and map selection. +// * Disp("","<Option 1>:<Option 2>:<etc.>"); +// * Pick("","<map1>","<map2>","<etc.>"); +// ~ Manual menu and map selection. +// +// Other notes: +// ~ Array @c[] holds all (x,y) coordinates. +// ~ Use @c[2] EXCEPT when maps begin dynamically +// at 0: use @c[0] and Pick() offset 1. +// -------------------------------------------------- + +function Go { + warp getarg(0),getarg(1,0),getarg(2,0); + getmapxy(lastwarp$,lastwarpx,lastwarpy,0); + close; +} +function Disp { + set @menu$,""; + if(getarg(0)=="") { + set @menu$,getarg(1); + return; + } + for(set .@i,getarg(1); .@i<=getarg(2); set .@i,.@i+1) + set @menu$, @menu$+getarg(0)+" "+.@i+":"; + return; +} +function Pick { + if(getarg(0)=="") { + set .@i, select(@menu$); + warp getarg(.@i),@c[.@i*2],@c[.@i*2+1]; + } else { + set .@i, select(@menu$)-getarg(1,0); + warp getarg(0)+((.@i<10)?"0":"")+.@i,@c[.@i*2],@c[.@i*2+1]; + } + getmapxy(lastwarp$,lastwarpx,lastwarpy,0); + close; +} + +// -------------------------------------------------- + Towns: +// -------------------------------------------------- +menu "Prontera",T1, "Alberta",T2, "Aldebaran",T3, "Amatsu",T4, "Ayothaya",T5, + "Brasilis",T6, "Comodo",T7, "Dewata",T33, "Eclage",T34, "Einbech",T8, + "Einbroch",T9, "El Dicastes",T10, "Geffen",T11, "Gonryun",T12, "Hugel",T13, + "Izlude",T14, "Jawaii",T15, "Lighthalzen",T16, "Louyang",T17, "Lutie",T18, + "Malangdo",T35, "Malaya",T36, "Manuk",T19, "Midgarts Expedition Camp",T20, + "Mora",T21, "Morroc",T22, "Moscovia",T23, "Nameless Island",T24, + "Niflheim",T25, "Payon",T26, "Rachel",T27, "Splendide",T28, "Thor Camp",T29, + "Umbala",T30, "Veins",T31, "Yuno",T32; + +T1: Go("prontera",155,183); +T2: Go("alberta",28,234); +T3: Go("aldebaran",140,131); +T4: Go("amatsu",198,84); +T5: Go("ayothaya",208,166); +T6: Go("brasilis",195,220); +T7: Go("comodo",209,143); +T8: Go("einbech",138,243); +T9: Go("einbroch",64,200); +T10: Go("dicastes01",197,187); +T11: Go("geffen",120,68); +T12: Go("gonryun",160,121); +T13: Go("hugel",96,145); +T14: Go("izlude",128,114); +T15: Go("jawaii",213,230); +T16: Go("lighthalzen",158,92); +T17: Go("louyang",217,100); +T18: Go("xmas",147,134); +T19: Go("manuk",260,175); +T20: Go("mid_camp",210,288); +T21: Go("mora",111,97); +T22: Go("morocc",156,93); +T23: Go("moscovia",219,193); +T24: Go("nameless_n",256,215); +T25: Go("niflheim",202,174); +T26: Go("payon",179,100); +T27: Go("rachel",130,111); +T28: Go("splendide",200,153); +T29: Go("thor_camp",246,68); +T30: Go("umbala",127,128); +T31: Go("veins",216,123); +T32: Go("yuno",157,51); +T33: Go("dewata",199,179); +T34: Go("eclage",111,39); +T35: Go("malangdo",224,184); +T36: Go("malaya",212,206); + +// -------------------------------------------------- + Fields: +// -------------------------------------------------- +menu "Amatsu Fields",F1, "Ayothaya Fields",F2, "Bifrost Fields", F3, + "Brasilis Fields",F4, "Comodo Fields",F5, "Dewata Fields",F26, + "Eclage Fields",F27, "Einbroch Fields",F6, "El Dicastes Fields",F7, + "Geffen Fields",F8, "Gonryun Fields",F9, "Hugel Fields",F10, + "Lighthalzen Fields",F11, "Louyang Field",F12, "Lutie Field",F13, + "Malaya Fields",F28, "Manuk Fields",F14, "Mjolnir Fields",F15, + "Moscovia Fields",F16, "Niflheim Fields",F17, "Payon Forests",F18, + "Prontera Fields",F19, "Rachel Fields",F20, "Sograt Deserts",F21, + "Splendide Fields",F22, "Umbala Fields",F23, "Veins Fields",F24, + "Yuno Fields",F25; + +F1: setarray @c[2],190,197; + Disp("Amatsu Field",1,1); Pick("ama_fild"); +F2: setarray @c[2],173,134,212,150; + Disp("Ayothaya Field",1,2); Pick("ayo_fild"); +F3: setarray @c[2],193,220,220,187; + Disp("Bifrost Field",1,2); Pick("bif_fild"); +F4: setarray @c[2],74,32; + Disp("Brasilis Field",1,1); Pick("bra_fild"); +F5: setarray @c[2],180,178,231,160,191,172,228,194,224,203,190,223,234,177,194,175,172,172; + Disp("Comodo Field",1,9); Pick("cmd_fild"); +F6: setarray @c[2],142,225,182,141,187,228,185,173,216,173,195,148,272,220,173,214,207,174,196,200; + Disp("Einbroch Field",1,10); Pick("ein_fild"); +F7: setarray @c[2],143,132,143,217; + Disp("El Dicastes Field",1,2); Pick("dic_fild"); +F8: setarray @c[0],46,199,213,204,195,212,257,192,188,171,166,263,248,158,195,191,186,183,221,117,178,218,136,328,240,181,235,235,211,185; + Disp("Geffen Field",0,14); Pick("gef_fild",1); +F9: setarray @c[2],220,227; + Disp("Gonryun Field",1,1); Pick("gon_fild"); +F10: setarray @c[2],268,101,222,193,232,185,252,189,196,106,216,220,227,197; + Disp("Hugel Field",1,7); Pick("hu_fild"); +F11: setarray @c[2],240,179,185,235,240,226; + Disp("Lighthalzen Field",1,3); Pick("lhz_fild"); +F12: setarray @c[2],229,187; + Disp("Louyang Field",1,1); Pick("lou_fild"); +F13: setarray @c[2],115,145; + Disp("Lutie Field",1,1); Pick("xmas_fild"); +F14: setarray @c[2],35,236,35,262,84,365; + Disp("Manuk Field",1,3); Pick("man_fild"); +F15: setarray @c[2],204,120,175,193,208,213,179,180,181,240,195,270,235,202,188,215,205,144,245,223,180,206,196,208; + Disp("Mjolnir Field",1,12); Pick("mjolnir_"); +F16: setarray @c[2],82,104,131,147; + Disp("Moscovia Field",1,2); Pick("mosk_fild"); +F17: setarray @c[2],215,229,167,234; + Disp("Niflheim Field",1,2); Pick("nif_fild"); +F18: setarray @c[2],158,206,151,219,205,148,186,247,134,204,193,235,200,177,137,189,201,224,160,205,194,150; + Disp("Payon Forest",1,11); Pick("pay_fild"); +F19: setarray @c[0],208,227,190,206,240,206,190,143,307,252,239,213,185,188,193,194,187,218,210,183,195,149,198,164; + Disp("Prontera Field",0,11); Pick("prt_fild",1); +F20: setarray @c[2],192,162,235,166,202,206,202,208,225,202,202,214,263,196,217,201,87,121,277,181,221,185,175,200,174,197; + Disp("Rachel Field",1,13); Pick("ra_fild"); +F21: setarray @c[2],219,205,177,206,194,182,224,170,198,216,156,187,185,263,206,228,208,238,209,223,85,97,207,202,31,195,38,195; + Disp("","Sograt Desert 1:Sograt Desert 2:Sograt Desert 3:Sograt Desert 7:Sograt Desert 11:Sograt Desert 12:Sograt Desert 13:Sograt Desert 16:Sograt Desert 17:Sograt Desert 18:Sograt Desert 19:Sograt Desert 20:Sograt Desert 21:Sograt Desert 22"); + Pick("","moc_fild01","moc_fild02","moc_fild03","moc_fild07","moc_fild11","moc_fild12","moc_fild13","moc_fild16","moc_fild17","moc_fild18","moc_fild19","moc_fild20","moc_fild21","moc_fild22"); +F22: setarray @c[2],175,186,236,184,188,204; + Disp("Splendide Field",1,3); Pick("spl_fild"); +F23: setarray @c[2],217,206,223,221,237,215,202,197; + Disp("Umbala Field",1,4); Pick("um_fild"); +F24: setarray @c[2],186,175,196,370,222,45,51,250,202,324,150,223,149,307; + Disp("Veins Field",1,7); Pick("ve_fild"); +F25: setarray @c[2],189,224,192,207,221,157,226,199,223,177,187,232,231,174,196,203,183,214,200,124,195,226,210,304; + Disp("Yuno Field",1,12); Pick("yuno_fild"); +F26: setarray @c[2],371,212; + Disp("Dewata Field",1,1); Pick("dew_fild"); +F27: setarray @c[2],97,314; + Disp("Eclage Field",1,1); Pick("ecl_fild"); +F28: setarray @c[2],40,272,207,180; + Disp("Malaya Field",1,2); Pick("ma_fild"); + +// -------------------------------------------------- + Dungeons: +// -------------------------------------------------- +menu "Abyss Lakes",D1, "Amatsu Dungeon",D2, "Anthell",D3, + "Ayothaya Dungeon",D4, "Beach Dungeon",D5, "Bio Labs",D6, + "Brasilis Dungeon",D7, "Byalan Dungeon",D8, "Clock Tower",D9, + "Coal Mines",D10, "Culvert",D11, "Cursed Abbey",D12, "Dewata Dungeon",D41, + "Einbroch Dungeon",D13, "Endless Tower",D14, "Gefenia",D15, + "Geffen Dungeon",D16, "Glast Heim",D17, "Gonryun Dungeon",D18, + "Guild Dungeons",GD, "Hidden Dungeon",D19, "Ice Dungeon",D20, + "Juperos",D21, "Kiel Dungeon",D22, "Louyang Dungeon",D23, + "Magma Dungeon",D24, "Malangdo Dungeon",D42, "Moscovia Dungeon",D25, + "Nidhogg's Dungeon",D26, "Odin Temple",D27, "Orc Dungeon",D28, "Payon Dungeon",D29, + "Pyramids",D30, "Rachel Sanctuary",D31, "Scaraba Hole",D32, "Sealed Shrine",D33, + "Sphinx",D34, "Sunken Ship",D35, "Thanatos Tower",D36, "Thor Volcano",D37, + "Toy Factory",D38, "Turtle Dungeon",D39, "Umbala Dungeon",D40; + +D1: setarray @c[2],261,272,275,270,116,27; + Disp("Abyss Lakes",1,3); Pick("abyss_"); +D2: setarray @c[2],228,11,34,41,119,14; + Disp("Amatsu Dungeon",1,3); Pick("ama_dun"); +D3: setarray @c[2],35,262,168,170; + Disp("Anthell",1,2); Pick("anthell"); +D4: setarray @c[2],275,19,24,26; + Disp("","Ancient Shrine Maze:Inside Ancient Shrine"); Pick("ayo_dun"); +D5: setarray @c[2],266,67,255,244,23,260; + Disp("Beach Dungeon",1,3); Pick("","beach_dun","beach_dun2","beach_dun3"); +D6: setarray @c[2],150,288,150,18,140,134; + Disp("Bio Lab",1,3); Pick("lhz_dun"); +D7: setarray @c[2],87,47,262,262; + Disp("Brasilis Dungeon",1,2); Pick("bra_dun"); +D8: setarray @c[0],168,168,253,252,236,204,32,63,26,27; + Disp("Byalan Dungeon",1,5); Pick("iz_dun",1); +D9: setarray @c[2],199,159,148,283,65,147,56,155,297,25,127,169,277,178,268,74; + Disp("","Clock Tower 1:Clock Tower 2:Clock Tower 3:Clock Tower 4:Basement 1:Basement 2:Basement 3:Basement 4"); + Pick("","c_tower1","c_tower2","c_tower3","c_tower4","alde_dun01","alde_dun02","alde_dun03","alde_dun04"); +D10: setarray @c[2],52,17,381,343,302,262; + Disp("Coal Mines",1,3); Pick("mjo_dun"); +D11: setarray @c[2],131,247,19,19,180,169,100,92; + Disp("Culvert",1,4); Pick("","prt_sewb1","prt_sewb2","prt_sewb3","prt_sewb4"); +D12: setarray @c[2],51,14,150,11,120,10; + Disp("Cursed Abbey",1,3); Pick("abbey"); +D13: setarray @c[2],22,14,292,290; + Disp("Einbroch Dungeon",1,2); Pick("ein_dun"); +D14: setarray @c[2],72,112; + Disp("","Misty Island"); Pick("","e_tower"); +D15: setarray @c[2],40,103,203,34,266,168,130,272; + Disp("Gefenia",1,4); Pick("gefenia",0); +D16: setarray @c[0],104,99,115,236,106,132,203,200; + Disp("Geffen Dungeon",1,4); Pick("gef_dun",1); +D17: setarray @c[2],375,304,199,29,104,25,150,15,157,287,147,15,258,255,108,291,171,283,68,277,156,7,12,7,133,271,224,274,14,70,150,14; + Disp("","Entrance:Castle 1:Castle 2:Chivalry 1:Chivalry 2:Churchyard:Culvert 1:Culvert 2:Culvert 3:Culvert 4:St. Abbey:Staircase Dungeon:Underground Cave 1:Underground Cave 2:Underground Prison 1:Underground Prison 2"); + Pick("","glast_01","gl_cas01","gl_cas02","gl_knt01","gl_knt02","gl_chyard","gl_sew01","gl_sew02","gl_sew03","gl_sew04","gl_church","gl_step","gl_dun01","gl_dun02","gl_prison","gl_prison1"); +D18: setarray @c[2],153,53,28,113,68,16; + Disp("Gonryun Dungeon",1,3); Pick("gon_dun"); +D19: setarray @c[2],176,7,93,20,23,8; + Disp("Hidden Dungeon",1,3); Pick("prt_maze"); +D20: setarray @c[2],157,14,151,155,149,22,33,158; + Disp("Ice Dungeon",1,4); Pick("ice_dun"); +D21: setarray @c[2],140,51,53,247,37,63,150,285; + Disp("","Entrance:Juperos 1:Juperos 2:Core"); + Pick("","jupe_cave","juperos_01","juperos_02","jupe_core"); +D22: setarray @c[2],28,226,41,198; + Disp("Kiel Dungeon",1,2); Pick("kh_dun"); +D23: setarray @c[2],218,196,282,20,165,38; + Disp("","The Royal Tomb:Inside the Royal Tomb:Suei Long Gon"); Pick("lou_dun"); +D24: setarray @c[2],126,68,47,30; + Disp("Magma Dungeon",1,2); Pick("mag_dun"); +D25: setarray @c[2],189,48,165,30,32,135; + Disp("Moscovia Dungeon",1,3); Pick("mosk_dun"); +D26: setarray @c[2],61,239,60,271; + Disp("Nidhogg's Dungeon",1,2); Pick("nyd_dun"); +D27: setarray @c[2],298,167,224,149,266,280; + Disp("Odin Temple",1,3); Pick("odin_tem"); +D28: setarray @c[2],32,170,21,185; + Disp("Orc Dungeon",1,2); Pick("orcsdun"); +D29: setarray @c[0],21,183,19,33,19,63,155,159,201,204; + Disp("Payon Dungeon",1,5); Pick("pay_dun",1); +D30: setarray @c[2],192,9,10,192,100,92,181,11,94,96,192,8; + Disp("","Pyramids 1:Pyramids 2:Pyramids 3:Pyramids 4:Basement 1:Basement 2"); Pick("moc_pryd"); +D31: setarray @c[2],140,11,32,21,4,149,204,218,150,9; + Disp("Rachel Sanctuary",1,5); Pick("ra_san"); +D32: setarray @c[2],364,44,101,141; + Disp("Scaraba Hole",1,2); Pick("dic_dun"); +D33: setarray @c[2],306,143; + Disp("","Friar Patrick"); Pick("","monk_test"); +D34: setarray @c[2],288,9,149,81,210,54,10,222,100,99; + Disp("Sphinx",1,5); Pick("","in_sphinx1","in_sphinx2","in_sphinx3","in_sphinx4","in_sphinx5"); +D35: setarray @c[2],69,24,102,27; + Disp("Sunken Ship",1,2); Pick("treasure"); +D36: setarray @c[2],150,39,150,136,220,158,59,143,62,11,89,221,35,166,93,148,29,107,159,138,19,20,130,52; + Disp("Thanatos Tower",1,12); Pick("tha_t"); +D37: setarray @c[2],21,228,75,205,34,272; + Disp("Thor Volcano",1,3); Pick("thor_v"); +D38: setarray @c[2],205,15,129,133; + Disp("Toy Factory",1,2); Pick("xmas_dun"); +D39: setarray @c[2],154,49,148,261,132,189,100,192; + Disp("","Entrance:Turtle Dungeon 1:Turtle Dungeon 2:Turtle Dungeon 3"); Pick("tur_dun"); +D40: setarray @c[2],42,31,48,30,204,78; + Disp("","Carpenter's Shop in the Tree:Passage to a Foreign World:Hvergermil's Fountain"); + Pick("","um_dun01","um_dun02","yggdrasil01"); +D41: setarray @c[2],285,160,299,29; + Disp("Dewata Dungeon",1,2); Pick("dew_dun"); +D42: setarray @c[2],33,230; + Disp("Malangdo Dungeon",1,1); Pick("mal_dun"); +GD: setarray @c[2],119,93,39,161,50,44,116,45,199,195,200,124; + Disp("","Baldur:Luina:Valkyrie:Britoniah:Arunafeltz:Schwaltzvalt"); + Pick("","gld_dun01","gld_dun02","gld_dun03","gld_dun04","arug_dun01","schg_dun01"); + +// -------------------------------------------------- + Castles: +// -------------------------------------------------- +menu "Aldebaran Castles",C1, "Geffen Castles",C2, "Payon Castles",C3, + "Prontera Castles",C4, "Arunafeltz Castles",C5, "Schwaltzvalt Castles",C6; + +C1: setarray @c[2],48,83,95,249,142,85,239,242,264,90; + Disp("","Neuschwanstein:Hohenschwangau:Nuenberg:Wuerzburg:Rothenburg"); + Pick("","alde_gld","alde_gld","alde_gld","alde_gld","alde_gld"); +C2: setarray @c[2],214,75,308,240,143,240,193,278,305,87; + Disp("","Repherion:Eeyolbriggar:Yesnelph:Bergel:Mersetzdeitz"); + Pick("","gef_fild13","gef_fild13","gef_fild13","gef_fild13","gef_fild13"); +C3: setarray @c[2],121,233,295,116,317,293,140,160,204,266; + Disp("","Bright Arbor:Scarlet Palace:Holy Shadow:Sacred Altar:Bamboo Grove Hill"); + Pick("","pay_gld","pay_gld","pay_gld","pay_gld","pay_gld"); +C4: setarray @c[2],134,65,240,128,153,137,111,240,208,240; + Disp("","Kriemhild:Swanhild:Fadhgridh:Skoegul:Gondul"); + Pick("","prt_gld","prt_gld","prt_gld","prt_gld","prt_gld"); +C5: setarray @c[2],158,272,83,47,68,155,299,345,292,107; + Disp("","Mardol:Cyr:Horn:Gefn:Banadis"); + Pick("","aru_gld","aru_gld","aru_gld","aru_gld","aru_gld"); +C6: setarray @c[2],293,100,288,252,97,196,137,90,71,315; + Disp("","Himinn:Andlangr:Viblainn:Hljod:Skidbladnir"); + Pick("","sch_gld","sch_gld","sch_gld","sch_gld","sch_gld"); + +// -------------------------------------------------- + Special: +// -------------------------------------------------- +menu "Auction Hall",S1, "Battlegrounds",S2, "Casino",S3, "Gonryun Arena",S4, + "Izlude Arena",S5, "Monster Race Arena",S6, "Turbo Track",S7; + +S1: Go("auction_01",22,68); +S2: Go("bat_room",154,150); +S3: Go("cmd_in02",179,129); +S4: Go("gon_test",48,10); +S5: Go("arena_room",100,88); +S6: Go("p_track01",62,41); +S7: Go("turbo_room",99,114); +} + +// -------------------------------------------------- +// Duplicates: +// -------------------------------------------------- +prontera,159,192,4 duplicate(Warper) Warper#1 811 +rachel,135,116,4 duplicate(Warper) Warper#2 811 +alberta,28,240,4 duplicate(Warper) Warper#3 811 +aldebaran,145,118,4 duplicate(Warper) Warper#4 811 +amatsu,203,87,4 duplicate(Warper) Warper#5 811 +ayothaya,209,169,6 duplicate(Warper) Warper#6 811 +comodo,194,158,4 duplicate(Warper) Warper#7 811 +einbech,142,246,4 duplicate(Warper) Warper#8 811 +einbroch,69,202,4 duplicate(Warper) Warper#9 811 +hugel,101,151,4 duplicate(Warper) Warper#10 811 +lighthalzen,151,101,6 duplicate(Warper) Warper#11 811 +geffen,124,72,4 duplicate(Warper) Warper#12 811 +izlude,132,120,4 duplicate(Warper) Warper#13 811 +xmas,150,136,4 duplicate(Warper) Warper#14 811 +morocc,159,97,4 duplicate(Warper) Warper#15 811 +payon,182,108,4 duplicate(Warper) Warper#16 811 +yuno,162,47,4 duplicate(Warper) Warper#17 811 +moc_fild04,207,331,4 duplicate(Warper) Warper#18 811 +izlu2dun,104,82,4 duplicate(Warper) Warper#19 811 +mjolnir_02,85,363,4 duplicate(Warper) Warper#20 811 +prt_fild05,273,215,4 duplicate(Warper) Warper#21 811 +glast_01,370,308,4 duplicate(Warper) Warper#22 811 +yuno_fild03,37,135,4 duplicate(Warper) Warper#23 811 +gef_fild10,71,339,4 duplicate(Warper) Warper#24 811 +pay_arche,39,135,4 duplicate(Warper) Warper#25 811 +moc_ruins,64,166,4 duplicate(Warper) Warper#26 811 +moc_fild19,106,97,4 duplicate(Warper) Warper#27 811 +alb2trea,73,101,4 duplicate(Warper) Warper#28 811 +tur_dun01,148,239,4 duplicate(Warper) Warper#29 811 +gonryun,162,122,4 duplicate(Warper) Warper#30 811 +louyang,208,103,6 duplicate(Warper) Warper#31 811 +umbala,132,130,4 duplicate(Warper) Warper#32 811 +brasilis,201,222,4 duplicate(Warper) Warper#33 811 +manuk,262,177,4 duplicate(Warper) Warper#34 811 +splendide,205,153,4 duplicate(Warper) Warper#35 811 +mid_camp,216,288,4 duplicate(Warper) Warper#36 811 +dicastes01,194,194,6 duplicate(Warper) Warper#37 811 +mora,110,100,4 duplicate(Warper) Warper#38 811 +moscovia,216,196,6 duplicate(Warper) Warper#39 811 +nameless_n,259,213,4 duplicate(Warper) Warper#40 811 +niflheim,205,179,4 duplicate(Warper) Warper#41 811 +thor_camp,249,76,4 duplicate(Warper) Warper#42 811 +veins,214,123,4 duplicate(Warper) Warper#43 811 +dewata,194,178,6 duplicate(Warper) Warper#44 811 +eclage,107,37,4 duplicate(Warper) Warper#45 811 +malaya,210,205,4 duplicate(Warper) Warper#46 811 +malangdo,220,188,6 duplicate(Warper) Warper#47 811 diff --git a/npc/custom/woe_controller.txt b/npc/custom/woe_controller.txt new file mode 100644 index 000000000..d8380e770 --- /dev/null +++ b/npc/custom/woe_controller.txt @@ -0,0 +1,385 @@ +//===== rAthena Script ======================================= +//= Euphy's WOE Controller +//===== By: ================================================== +//= Euphy +//===== Current Version: ===================================== +//= 1.4 +//===== Compatible With: ===================================== +//= rAthena SVN r16571+ +//===== Description: ========================================= +//= A controller for War of Emperium designed for +//= simplicity and ease of use. +//= Many concepts taken from ToastOfDoom's script, +//= and "rewards" function originally by Goddameit. +//===== Additional Comments: ================================= +//= Be sure to disable the default agit controllers! +//== npc\guild\agit_controller.txt +//== npc\guild2\agit_start_se.txt +//============================================================ + +prontera,149,193,4 script WOE Information 835,{ doevent "WOE_CONTROL::OnMenu"; end; OnAgitStart: while(agitcheck()) { misceffect 58; sleep 425; } end; } + +- script WOE_CONTROL -1,{ +function Disp_Owner; function Add_Zero; + +OnInit: +// -------------------------------------------------------------------------------------------------------------------------- + + set .CastleWarp,0; // 1: Always enable all castle warps. | 0: Warp only to active castles. + set .AutoKick,1; // Automatically kick players from inactive castles during WOE? (1:yes / 0:no) + set .NoOwner,0; // Automatically kick players from unconquered castles outside of WOE? (1:yes / 0:no) + set .ExitWarp,0; // Warp all players from castles when WOE ends? (1:yes / 0:no) + set .GMAccess,99; // GM level required to access Session Manager. + setarray .Reward[0],14001,1; // Reward for all members of conquering guilds, per castle: <ID>,<Count>{,...} (0 to disable) + +// -------------------------------------------------------------------------------------------------------------------------- + set .Size, getarraysize($WOE_CONTROL); + setarray .Castles$[0], + "prtg_cas01","prtg_cas02","prtg_cas03","prtg_cas04","prtg_cas05", + "payg_cas01","payg_cas02","payg_cas03","payg_cas04","payg_cas05", + "gefg_cas01","gefg_cas02","gefg_cas03","gefg_cas04","gefg_cas05", + "aldeg_cas01","aldeg_cas02","aldeg_cas03","aldeg_cas04","aldeg_cas05", + "arug_cas01","arug_cas02","arug_cas03","arug_cas04","arug_cas05", + "schg_cas01","schg_cas02","schg_cas03","schg_cas04","schg_cas05"; + setarray .EndLabel$[0],"ar01","ar02","ar03","ar04","ar05","sc01","sc02","sc03","sc04","sc05"; + setarray .Days$[0],"Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"; + setarray .Regions$[0],"Prontera","Payon","Geffen","Aldebaran","Arunafeltz","Schwaltzvalt"; + setarray .Map$[0],"prt_gld","pay_gld","gef_fild13","alde_gld","aru_gld","sch_gld"; + setarray .MapX[0],134,240,153,111,208,121,295,317,140,204,214,308,143,193,305,48, 95,142,239,264,158,83, 68,299,292,293,288, 97,137, 71; + setarray .MapY[0], 65,128,137,240,240,233,116,293,160,266, 75,240,240,278, 87,83,249, 85,242, 90,272,47,155,345,107,100,252,196, 90,315; + if (.AutoKick || .NoOwner) for(set .@i,0; .@i<30; set .@i,.@i+1) { + setmapflag .Castles$[.@i], mf_loadevent; + setd "."+.Castles$[.@i], .@i; + } + if (!agitcheck() && !agitcheck2()) sleep 4000; + set .Init,1; +OnMinute00: + freeloop(1); + if (agitcheck() || agitcheck2()) { + for(set .@i,0; .@i<.Size; set .@i,.@i+4) + if (gettime(4) == $WOE_CONTROL[.@i] && gettime(3) == $WOE_CONTROL[.@i+2]) { + OnWOEEnd: + announce "The War Of Emperium is over!",bc_all|bc_woe; + AgitEnd; AgitEnd2; + sleep 1000; + for(set .@j,0; .@j<30; set .@j,.@j+1) { + if (.Active[0]&(1<<.@j)) Disp_Owner(.Castles$[.@j],1); + if (.ExitWarp) maprespawnguildid .Castles$[.@j],0,3; + } + if (.Reward[0] && .Active[0] && .ForceEnd != 2) callsub OnReward, .Active[0]; + deletearray .Active[0],2; + if (.ForceEnd) { set .ForceEnd,0; end; } + break; + } + } + if ((!agitcheck() && !agitcheck2()) || .Init) { + if (!agitcheck() && !agitcheck2()) set .Init,0; + for(set .@i,0; .@i<.Size; set .@i,.@i+4) + if (gettime(4) == $WOE_CONTROL[.@i] && gettime(3) >= $WOE_CONTROL[.@i+1] && gettime(3) < $WOE_CONTROL[.@i+2]) { + deletearray .Active[0],2; + set .Active[0], $WOE_CONTROL[.@i+3]; + if (.Init) { AgitEnd; AgitEnd2; } + else announce "The War Of Emperium has begun!",bc_all|bc_woe; + sleep 1000; + AgitStart; AgitStart2; + for(set .@j,0; .@j<30; set .@j,.@j+1) { + if (.Active[0]&(1<<.@j)) { + if (!.Init) Disp_Owner(.Castles$[.@j],0); + set .Active[1], .Active[1] | (1<<((.@j/5)+1)); + } else { + if (.@j<20) { + donpcevent "Agit#"+.Castles$[.@j]+"::OnAgitEnd"; + killmonster .Castles$[.@j], "Agit#"+.Castles$[.@j]+"::OnAgitBreak"; + } else { + donpcevent "Manager#"+.Castles$[.@j]+"::OnAgitEnd2"; + killmonster .Castles$[.@j], "Steward#"+.EndLabel$[.@j-20]+"::OnStartArena"; + } + } + } + break; + } + } + set .Init,0; + freeloop(0); + end; + +function Disp_Owner { + set .@o, getcastledata(getarg(0),1); + if (.@o) announce "The ["+getcastlename(getarg(0))+"] castle "+((getarg(1))?"has been conquered":"is currently held")+" by the ["+getguildname(.@o)+"] guild.",bc_all|bc_woe; + else announce "The ["+getcastlename(getarg(0))+"] castle is currently unoccupied.",bc_all|bc_woe; + return; +} +function Add_Zero { + return ((getarg(0)<10)?"0":"")+getarg(0)+(getarg(1,0)?".":":")+"00"; +} + +OnReward: + for(set .@i,0; .@i<30; set .@i,.@i+1) + if (getarg(0)&(1<<.@i)) { + set .@guild, getcastledata(.Castles$[.@i],1); + if (.@guild) { + deletearray .@acc[0], getarraysize(.@acc); deletearray .@char[0], getarraysize(.@char); + query_sql("SELECT account_id,char_id FROM `guild_member` WHERE guild_id = '"+.@guild+"'", .@acc, .@char); + for(set .@j,0; .@j<getarraysize(.@acc); set .@j,.@j+1) + if (isloggedin(.@acc[.@j],.@char[.@j])) { + for(set .@k,0; .@k<getarraysize(.Reward); set .@k,.@k+2) + getitem .Reward[.@k], .Reward[.@k+1], .@acc[.@j]; + message rid2name(.@acc[.@j]),"You have been rewarded for conquering "+getcastlename(.Castles$[.@i])+"."; + } + } + } + return; + +OnPCLoadMapEvent: + if (!compare(strcharinfo(3),"g_cas")) end; + if (((.AutoKick && .Active[0]) || (.NoOwner && !getcastledata(strcharinfo(3),1))) && !(.Active[0]&(1<<getd("."+strcharinfo(3))))) { + if (getcharid(2) && getcastledata(strcharinfo(3),1) == getcharid(2)) end; + sleep2 1000; + message strcharinfo(0), getcastlename(strcharinfo(3))+" is currently inactive."; + sleep2 5000; + if (compare(strcharinfo(3),"g_cas")) warp "SavePoint",0,0; + } + end; + +OnMenu: +while(1) { + mes "[WOE Information]"; + if (agitcheck() || agitcheck2()) { + if (!.Size) mes "The War of Emperium is ^0055FFactive^000000."; + else { + for(set .@i,0; .@i<.Size; set .@i,.@i+4) + if (gettime(4) == $WOE_CONTROL[.@i] && gettime(3) >= $WOE_CONTROL[.@i+1] && gettime(3) < $WOE_CONTROL[.@i+2]) { + set .@i, $WOE_CONTROL[.@i+2]; + break; + } + mes "The War of Emperium is ^0055FFactive^000000 until ^FF0000"+Add_Zero(.@i)+"^000000 in the following regions:"; + mes " "; + for(set .@i,0; .@i<6; set .@i,.@i+1) + if (.Active[1]&(1<<(.@i+1))) mes " > ^777777"+.Regions$[.@i]+"^000000"; + } + } else { + set .@j,0; set .@k,0; + for(set .@i,0; .@i<.Size; set .@i,.@i+4) + if ((gettime(4) == $WOE_CONTROL[.@i] && gettime(3) <= $WOE_CONTROL[.@i+1]) || gettime(4) < $WOE_CONTROL[.@i]) { + set .@j, $WOE_CONTROL[.@i]; set .@k, $WOE_CONTROL[.@i+1]; + break; + } + if (!.@j && !.@k) { + set .@j, $WOE_CONTROL[0]; + set .@k, $WOE_CONTROL[1]; + } + mes "The War of Emperium is ^777777inactive^000000."; + if (.Size) { + mes " "; + mes "The next session will begin"; + mes "on ^0055FF"+.Days$[.@j]+"^000000 at "+Add_Zero(.@k)+"^000000."; + } + } + next; + switch(select(""+((.CastleWarp || .Active[1])?" ~ Warp to castles...":"")+": ~ Check schedule...: ~ View castle owners...:"+((getgmlevel()<.GMAccess || !getgmlevel())?"":" ~ Manage sessions...")+": ~ ^777777Cancel^000000")) { + case 1: + set .@menu$,""; + for(set .@i,0; .@i<6; set .@i,.@i+1) { + if (.CastleWarp || .Active[1]&(1<<(.@i+1))) + set .@menu$, .@menu$+" ~ "+((.Active[1]&(1<<(.@i+1)))?"^0055FF":"^777777")+.Regions$[.@i]+" Castles^000000"; + set .@menu$, .@menu$+":"; + } + set .@i, select(.@menu$)-1; + set .@menu$,""; + for(set .@j,.@i*5; .@j<(.@i*5)+5; set .@j,.@j+1) { + if (.CastleWarp || .Active[0]&(1<<.@j)) + set .@menu$, .@menu$+" ~ "+((.Active[0]&(1<<.@j))?"^0055FF":"^777777")+getcastlename(.Castles$[.@j])+"^000000"; + set .@menu$, .@menu$+":"; + } + set .@j, select(.@menu$)-1; + warp .Map$[.@i],.MapX[(.@i*5)+.@j],.MapY[(.@i*5)+.@j]; + close; + case 2: + mes "[Schedule]"; + if (.Size) { + freeloop(1); + for(set .@i,0; .@i<.Size; set .@i,.@i+4) { + mes "> ^FF0000"+.Days$[$WOE_CONTROL[.@i]]+" ("+Add_Zero($WOE_CONTROL[.@i+1])+"-"+Add_Zero($WOE_CONTROL[.@i+2])+")^000000"; + for(set .@j,0; .@j<30; set .@j,.@j+1) + if ($WOE_CONTROL[.@i+3]&(1<<.@j)) mes " ~ "+getcastlename(.Castles$[.@j])+" ^777777("+.Castles$[.@j]+")^000000"; + if (.@i+4 < .Size) mes " "; + } + freeloop(0); + } + else mes "No times are configured."; + next; + break; + case 3: + mes "[Castle Ownership]"; + for(set .@i,0; .@i<6; set .@i,.@i+1) { + set .@k, .@i*5; + mes "> ^FF0000"+.Regions$[.@i]+"^000000"; + for(set .@j,.@k; .@j<(.@k+5); set .@j,.@j+1) { + set .@t, getcastledata(.Castles$[.@j],1); + mes " ~ "+getcastlename(.Castles$[.@j])+": "+((.@t)?"^0055FF"+getguildname(.@t):"^777777unoccupied")+"^000000"; + } + if (.@i < 5) mes " "; + } + next; + break; + case 4: + while(1) { + mes "[Session Manager]"; + mes "There are ^0055FF"+(.Size/4)+" session(s)^000000 configured."; + mes "What would you like to do?"; + next; + switch(select(" ~ Add a session...: ~ Delete a session...: ~ Reload settings...:"+((agitcheck() || agitcheck2())?" ~ End WOE session...":"")+": ~ ^777777Go back^000000")) { + case 1: + mes "[New Session]"; + if (.Size > 127) { + mes "You have already reached the maximum of 32 sessions."; + next; + break; + } + mes "Select a day."; + next; + set .@Day, select(" ~ "+implode(.Days$,": ~ "))-1; + mes "[New Session]"; + mes "Select a start time for ^0055FF"+.Days$[.@Day]+"^000000."; + next; + set .@menu$,""; + for(set .@i,0; .@i<23; set .@i,.@i+1) + set .@menu$, .@menu$+" ~ "+Add_Zero(.@i,1)+":"; + set .@Start, select(.@menu$)-1; + mes "[New Session]"; + mes "Select an end time for ^0055FF"+.Days$[.@Day]+"^000000."; + next; + set .@menu$,""; + for(set .@i,.@Start+1; .@i<24; set.@i,.@i+1) + set .@menu$, .@menu$+" ~ "+Add_Zero(.@i,1)+":"; + set .@End, select(.@menu$)+.@Start; + for(set .@i,0; .@i<.Size; set .@i,.@i+4) + if (.@Day == $WOE_CONTROL[.@i] && + ((.@Start >= $WOE_CONTROL[.@i+1] && .@Start < $WOE_CONTROL[.@i+2]) || + (.@End > $WOE_CONTROL[.@i+1] && .@End <= $WOE_CONTROL[.@i+2]) || + (.@Start <= $WOE_CONTROL[.@i+1] && .@End >= $WOE_CONTROL[.@i+2]))) { + mes "[New Session]"; + mes "The chosen times overlap with an existing session."; + next; + set .@d,1; + break; + } + if (.@d) { set .@d,0; break; } + set .@Castle,0; + while(1) { + mes "[New Session]"; + mes "^0055FF"+.Days$[.@Day]+" ("+Add_Zero(.@Start)+"-"+Add_Zero(.@End)+")^000000"; + mes " > Castles:"; + if (!.@Castle) mes " ~ ^777777(none selected)^000000"; + else for(set .@i,0; .@i<30; set .@i,.@i+1) + if (.@Castle&(1<<.@i)) mes " ~ "+getcastlename(.Castles$[.@i])+" ("+.Castles$[.@i]+")"; + next; + set .@menu$,((.@Castle)?" ~ ^FF0000Finished...^000000":"")+":"; + for(set .@i,0; .@i<30; set .@i,.@i+1) + set .@menu$, .@menu$+" ~ "+((.@Castle&(1<<.@i))?"^0055FF":"")+getcastlename(.Castles$[.@i])+" ("+.Castles$[.@i]+")^000000:"; + set .@i, select(.@menu$)-1; + if (.@i) set .@Castle, .@Castle^(1<<(.@i-1)); + else { + mes "[New Session]"; + mes "Are you sure?"; + next; + switch(select(" ~ ^0055FFAdd session...^000000: ~ Continue selecting castles...: ~ ^777777Cancel^000000")) { + case 1: + for(set .@i,0; .@i<.Size; set .@i,.@i+4) + if ((.@Day == $WOE_CONTROL[.@i] && .@End <= $WOE_CONTROL[.@i+1]) || .@Day < $WOE_CONTROL[.@i]) { + set .@d,1; + break; + } + if (!.@d) { set .@d,1; set .@i,.Size; } + copyarray $WOE_CONTROL[.@i+4], $WOE_CONTROL[.@i], .Size-.@i; + setarray $WOE_CONTROL[.@i], .@Day, .@Start, .@End, .@Castle; + set .Size, getarraysize($WOE_CONTROL); + case 3: + mes "[New Session]"; + mes ((.@d)?"Session added.":"Cancelled."); + next; + set .@d,1; + case 2: + break; + } + if (.@d) { set .@d,0; break; } + } + } + break; + case 2: + mes "[Remove Session]"; + if (!.Size) { + mes "There are no sessions configured."; + next; + break; + } + mes "Select a session to remove."; + next; + set .@menu$,""; + for(set .@i,0; .@i<.Size; set .@i,.@i+4) + set .@menu$, .@menu$+" ~ "+.Days$[$WOE_CONTROL[.@i]]+" ("+Add_Zero($WOE_CONTROL[.@i+1],1)+"-"+Add_Zero($WOE_CONTROL[.@i+2],1)+"):"; + set .@menu$, .@menu$+" ~ ^777777Cancel^000000"; + set .@i, select(.@menu$)-1; + if (.@i == (.Size/4)) break; + mes "[Remove Session]"; + mes "Delete ^0055FF"+.Days$[$WOE_CONTROL[.@i*4]]+"'s^000000 session?"; + mes "This action cannot be undone."; + next; + set .@j, select(" ~ ^FF0000Delete session...^000000: ~ ^777777Cancel^000000"); + mes "[Remove Session]"; + if (.@j == 2) mes "Cancelled."; + else { + deletearray $WOE_CONTROL[.@i*4],4; + set .Size, getarraysize($WOE_CONTROL); + mes "Session deleted."; + } + next; + break; + case 3: + mes "[Reload Settings]"; + mes "This will trigger all events related to new session configurations, if any."; + if (agitcheck() || agitcheck2()) { + mes " "; + mes "Be aware that this will disrupt the current WOE session."; + } + next; + set .@i, select(" ~ ^0055FFReload settings...^000000: ~ ^777777Cancel^000000"); + mes "[Reload Settings]"; + if (.@i == 2) mes "Cancelled."; + else { + set .Init,1; + donpcevent "WOE_CONTROL::OnMinute00"; + mes "Variables have been re-initialized."; + } + next; + break; + case 4: + mes "[Force Agit End]"; + if (!agitcheck() && !agitcheck2()) { + mes "WOE has already ended."; + next; + break; + } + mes "This command will safely execute all AgitEnd events."; + mes " "; + mes "Kill the current WOE session?"; + next; + set .@i, select(" ~ ^FF0000End session...^000000:"+((.Reward[0])?" ~ ^FF0000End session without rewards...^000000":"")+": ~ ^777777Cancel^000000"); + mes "[Force Agit End]"; + if (.@i == 3) mes "Cancelled."; + else { + set .ForceEnd, .@i; + donpcevent "WOE_CONTROL::OnWOEEnd"; + mes "WOE session terminated."; + } + next; + break; + case 5: + set .@d,1; break; + } + if (.@d) { set .@d,0; break; } + } break; + case 5: + close; + } } +}
\ No newline at end of file |