summaryrefslogtreecommitdiff
path: root/npc/016-1
diff options
context:
space:
mode:
authorJesusaves <cpntb1@ymail.com>2021-04-09 13:33:57 -0300
committerJesusaves <cpntb1@ymail.com>2021-04-09 13:33:57 -0300
commitcf18ce071c79ae37e14ea38943e0b1d88da70a7b (patch)
treef9159c9b60b3018300dd22ffba0d797bc5e828e5 /npc/016-1
parent8a4bf716002a017de77fe7df301ef8e4aaf00a2e (diff)
downloadserverdata-cf18ce071c79ae37e14ea38943e0b1d88da70a7b.tar.gz
serverdata-cf18ce071c79ae37e14ea38943e0b1d88da70a7b.tar.bz2
serverdata-cf18ce071c79ae37e14ea38943e0b1d88da70a7b.tar.xz
serverdata-cf18ce071c79ae37e14ea38943e0b1d88da70a7b.zip
Override
Diffstat (limited to 'npc/016-1')
-rw-r--r--npc/016-1/_import.txt7
-rw-r--r--npc/016-1/_mobs.txt11
-rw-r--r--npc/016-1/_warps.txt4
-rwxr-xr-xnpc/016-1/gwendolyn.txt539
-rwxr-xr-xnpc/016-1/mapflags.txt2
-rwxr-xr-xnpc/016-1/rossy.txt288
6 files changed, 851 insertions, 0 deletions
diff --git a/npc/016-1/_import.txt b/npc/016-1/_import.txt
new file mode 100644
index 00000000..3e88e048
--- /dev/null
+++ b/npc/016-1/_import.txt
@@ -0,0 +1,7 @@
+// Map 016-1: Woodland
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/016-1/_mobs.txt",
+"npc/016-1/_warps.txt",
+"npc/016-1/gwendolyn.txt",
+"npc/016-1/mapflags.txt",
+"npc/016-1/rossy.txt",
diff --git a/npc/016-1/_mobs.txt b/npc/016-1/_mobs.txt
new file mode 100644
index 00000000..73aad7ee
--- /dev/null
+++ b/npc/016-1/_mobs.txt
@@ -0,0 +1,11 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 016-1: Woodland mobs
+016-1,0,0,0,0 monster Alizarin Plant 1037,2,100000,30000
+016-1,0,0,0,0 monster Amethyst Vein 1055,10,30,20
+016-1,0,0,0,0 monster Gamboge Plant 1038,30,20,10
+016-1,0,0,0,0 monster Forest Maggot 1028,5,0,0
+016-1,0,0,0,0 monster Bee 1029,3,0,0
+016-1,0,0,0,0 monster Bee 1029,4,270000,180000
+016-1,0,0,0,0 monster Pinkie 1030,3,0,0
+016-1,0,0,0,0 monster Bee 1029,4,270000,180000
+016-1,0,0,0,0 monster Mana Bug 1035,7,150000,7000
diff --git a/npc/016-1/_warps.txt b/npc/016-1/_warps.txt
new file mode 100644
index 00000000..7ef2878d
--- /dev/null
+++ b/npc/016-1/_warps.txt
@@ -0,0 +1,4 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 016-1: Woodland warps
+016-1,56,18,0 warp #016-1_56_18 2,0,010-1,56,104
+016-1,20,53,0 warp #016-1_20_53 0,2,025-1,129,58
diff --git a/npc/016-1/gwendolyn.txt b/npc/016-1/gwendolyn.txt
new file mode 100755
index 00000000..e833219b
--- /dev/null
+++ b/npc/016-1/gwendolyn.txt
@@ -0,0 +1,539 @@
+// TMW2 Script
+// Author:
+// TMW Org.
+// Edited by:
+// Jesusalva
+// Description:
+// Archery Trainer
+
+016-1,91,54,0 script Gwendolyn NPC182,{
+ .@q=getq();
+
+ .@Q_hawkseye_MASK = NIBBLE_6_MASK;
+ .@Q_hawkseye_SHIFT = NIBBLE_6_SHIFT;
+
+ .@Q_hawkseye = (QUEST_Forestbow_state & .@Q_hawkseye_MASK) >> .@Q_hawkseye_SHIFT;
+
+ .@Q_Forestbow_MASK = NIBBLE_0_MASK;
+ .@Q_Forestbow_SHIFT = NIBBLE_0_SHIFT;
+
+ .@FORESTBOW = ((QUEST_Forestbow_state) & .@Q_Forestbow_MASK) >> .@Q_Forestbow_SHIFT;
+
+ if (.@Q_hawkseye == 6) goto L_state6;
+ if (.@Q_hawkseye == 5) goto L_state5;
+ if (.@Q_hawkseye == 4) goto L_state4;
+ if (.@Q_hawkseye == 3) goto L_state3;
+ if (.@Q_hawkseye == 2) goto L_state2;
+ if (.@Q_hawkseye == 1) goto L_state1;
+
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Hello, and welcome to my reopened School of Archery. My name is Gwendolyn Bowmaker; I'm the granddaughter of the famous Gwendolyn Bowmaker.\"";
+ next;
+ mes "\"As you surely know, she was the greatest archer this world had ever seen and opened this School of Archery together with her husband Simon Bowmaker. He was able to make the most well-balanced and the finest bows.\"";
+ next;
+ mes "\"I am now back from my training journey and want to continue with my family's tradition, to teach the Way of Archery.\"";
+ next;
+ mes "\"Are you interested in becoming a student of Archery?\"";
+ next;
+ menu
+ "I want to become an archer!",L_fee,
+ "I'm not interested right now.",L_No_student;
+
+L_fee:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Wonderful! The school's fee is " + .SCHOOLFEE + ".\"";
+ next;
+ menu
+ "That's a lot, but I think it will be worth it.",L_Next,
+ "I'm not sure I want to spend that much.",L_No_student;
+
+L_Next:
+ if (Zeny < .SCHOOLFEE)
+ goto L_No_Money;
+
+ Zeny = Zeny - .SCHOOLFEE;
+ .@Q_hawkseye = 2;
+ callsub S_Update_Var;
+
+ mesn "Gwendolyn Bowmaker";
+ mes "\"The first thing you need is, obviously, a bow. You should not use any you come across, but a high quality one. I think it would be best to go to Alan in Hurnscald. He is my cousin, and knows how to make Forest Bows of exquisite quality. \"";
+
+ if (countitem("ForestBow") < 1)
+ goto L_Close;
+ next;
+ menu
+ "I already have a Forest Bow.",L_state2;
+
+L_state2:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Let me see your bow.\"";
+ next;
+
+ if (countitem("ForestBow") < 1)
+ goto L_No_bow;
+ if (.@FORESTBOW < 5)
+ goto L_bow_bought;
+
+ .@Q_hawkseye = 3;
+ callsub S_Update_Var;
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Very well, this looks fine. It is time for your first lesson. \"";
+ next;
+ goto L_lesson;
+
+L_lesson:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"The advantage of fighting with a ranged weapon is that you can stay out of the enemy's range. So there is no need to spend training on your resistibility.\"";
+ next;
+ mes "\"But remember: this makes you much more vulnerable, so watch your step and don't stumble into your enemy's attack.\"";
+ next;
+ mes "\"Also your strength doesn't matter much. You might be able to shoot a little harder, but not so much as to make it important.\"";
+ next;
+ mes "\"The most important thing to improve is your dexterity. When you use a bow, it is your dexterity that determines if you are able to hit your enemy where it hurts most.\"";
+ next;
+ mes "\"Also worth mentioning is how to improve your ability to shoot fast. You need to be agile to grab a new arrow from your quiver and aim for the next shot before your enemy has recovered from your last.\"";
+ next;
+ goto L_state3;
+
+L_state3:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"To demonstrate that you understood what I'm trying to teach you, you should go and fight against some snakes. To prove me your results, bring me " + .CAVE_EGGS_AMOUNT + " cave snake eggs, " + .SNAKE_EGGS_AMOUNT + " snake eggs, " + .MOUNTAIN_EGGS_AMOUNT + " mountain snake eggs and " + .GRASS_EGGS_AMOUNT + " grass snake eggs.\"";
+ next;
+ menu
+ "Can you please repeat your lesson?",L_lesson,
+ "I will go and hunt some snakes.",L_Close,
+ "I have what you want.",L_Next1;
+
+L_Next1:
+ if (countitem("CaveSnakeEgg") < .CAVE_EGGS_AMOUNT
+ ||countitem("SnakeEgg") < .SNAKE_EGGS_AMOUNT
+ ||countitem("MountainSnakeEgg") < .MOUNTAIN_EGGS_AMOUNT
+ ||countitem("GrassSnakeEgg") < .GRASS_EGGS_AMOUNT)
+ goto L_Not_enough_eggs;
+
+ delitem "CaveSnakeEgg", .CAVE_EGGS_AMOUNT;
+ delitem "SnakeEgg", .SNAKE_EGGS_AMOUNT;
+ delitem "MountainSnakeEgg", .MOUNTAIN_EGGS_AMOUNT;
+ delitem "GrassSnakeEgg", .GRASS_EGGS_AMOUNT;
+
+ getexp .QUEST_EGG_EXP, 0;
+
+ .@Q_hawkseye = 4;
+ callsub S_Update_Var;
+
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Very well. That will make a great meal.\"";
+ next;
+ goto L_state4;
+
+L_state4:
+ if (BaseLevel < .BASELEVEL_GAME)
+ goto L_Not_Ready;
+ if (!(getskilllv(SKILL_POOL)))
+ goto L_Not_Ready;
+ mes "Gwendolyn takes an analyzing look at you. Then she nods.";
+ next;
+
+ .@Q_hawkseye = 5;
+ callsub S_Update_Var;
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Ok. You have made great progress. I think you are ready for further tasks.\"";
+ next;
+ goto L_Game_explain;
+
+L_Game_explain:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"As you might have noticed, it depends on many circumstances if your arrow finds its target. Your shot may be too powerful or too weak, so the arrow goes far beyond your target or hits the ground before it reaches its destination.\"";
+ next;
+ mes "\"The greater the distance to your target is, the more important is the strength and direction of the wind. Even if you are exploring a cave, there might be air flow caused by the corners in the cave.\"";
+ next;
+ mes "\"Ok, you can see that target over there? I will tell you how strong the wind blows and from which direction. Then you will try to hit the target by moving right or left and decide how powerful you want to shoot.\"";
+ next;
+ goto L_state5;
+
+L_state5:
+ // needed for the minigame:
+ set .@wdX, 0; // wind direction x-coordinate, rand
+ set .@wdY, 0; // wind direction y-coordinate, rand
+ // set .@wp, 0; // windpower
+ set .@spX, 0; // start position x-coordinate, player decision
+ // set .@spY, 0; // start position y-coordinate, const
+ set .@sp, 0; // shotpower, player decision
+ //set .@targetX, 0; // target position, const
+ //set .@targetY, 20; // target position, const
+ set .@pointX, 0; // point the player hits, x-coordinate
+ set .@pointY, 0; // point the player hits, y-coordinate
+ .@wdIndex = 0;
+ //
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Show me what you can!\"";
+ next;
+ menu
+ "Can you please explain the task again?",L_Game_explain,
+ "I'm ready, let's start!",L_Game,
+ "I'm sorry, I will come back later.",L_Close;
+
+L_Game:
+ if (countitem("ForestBow") < 1)
+ goto L_No_bow;
+ if (countitem("Arrow") < 1)
+ goto L_No_arrows;
+ delitem "Arrow", 1;
+ mes "You go to the training field and stand exactly on the same level with the target. The target is located about 43 feet north of you.You take one arrow and look at Gwendolyn.";
+ next;
+
+ // possibility for wdX and wdY to become zero is reduced, so windless status is less often
+ .@wdX = rand(9) - 4;
+ if (.@wdX != 2 && .@wdX !=-2) set .@wdX, rand(9) - 4;
+ if (.@wdX == 0) set .@wdX, rand(9) - 4;
+
+ .@wdY = rand(9) - 4;
+ if (.@wdY != 2 && .@wdY !=-2) set .@wdY, rand(9) - 4;
+ if (.@wdY == 0) set .@wdY, rand(9) - 4;
+
+ // wind direction array, where the wind blows to:
+ // 123
+ // 456
+ // 789
+ //here is where the wind comes from, that's why it is the opposite.
+ setarray .@wd$,"error1, please report", "southeast", "south", "southwest", "east", "error2, please report", "west", "northeast", "north", "northwest" ;
+ .@paramX = .@wdX;
+ .@paramY = .@wdY;
+ callsub S_getDirection;
+ .@wdIndex = .@returnIndex;
+
+ .@wp_sq = (.@wdX * .@wdX) + (.@wdY * .@wdY);
+
+ if (.@wp_sq == 0)
+ goto L_wp0;
+ if (.@wp_sq < 3)
+ goto L_wp1;
+ if (.@wp_sq < 9)
+ goto L_wp2;
+ if (.@wp_sq < 19)
+ goto L_wp3;
+ goto L_wp4;
+
+
+L_wp0:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"You're lucky. It is windless now.\"";
+ next;
+ goto L_choose_start_pos;
+
+L_wp1:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"There is a slight breeze coming from "+ .@wd$[.@wdIndex] + ".\"";
+ next;
+ goto L_choose_start_pos;
+
+L_wp2:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"The wind is blowing from "+ .@wd$[.@wdIndex] + ".\"";
+ next;
+ goto L_choose_start_pos;
+
+L_wp3:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Right now, there is a strong wind blowing from " + .@wd$[.@wdIndex] + ".\"";
+ next;
+ goto L_choose_start_pos;
+
+L_wp4:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Here we have a squall from "+ .@wd$[.@wdIndex] + ".\"";
+ next;
+ goto L_choose_start_pos;
+
+L_choose_start_pos:
+ mes "Do you want to go to the left, the right or stay where you are?";
+ next;
+ menu
+ "I want to move left.",L_step_left,
+ "I go right.",L_step_right,
+ "I stay.",L_step_no,
+ "I will try it later.",L_Close;
+
+L_step_no:
+ .@spX = 0;
+ mes "You stay where you are..";
+ next;
+ goto L_choose_shotpower;
+
+L_step_left:
+ mes "How many steps?";
+ next;
+ menu
+ "1",L_step_left1,
+ "2",L_step_left2,
+ "3",L_step_left3,
+ "4",L_step_left4;
+
+L_step_left1:
+ .@spX = -1;
+ mes "You take one step to the left.";
+ next;
+ goto L_choose_shotpower;
+
+L_step_left2:
+ .@spX = -2;
+ mes "You take two steps to the left.";
+ next;
+ goto L_choose_shotpower;
+
+L_step_left3:
+ .@spX = -3;
+ mes "You take three steps to the left.";
+ next;
+ goto L_choose_shotpower;
+
+L_step_left4:
+ .@spX = -4;
+ mes "You take four steps to the left.";
+ next;
+ goto L_choose_shotpower;
+
+L_step_right:
+ mes "How many steps?";
+ next;
+ menu
+ "1",L_step_right1,
+ "2",L_step_right2,
+ "3",L_step_right3,
+ "4",L_step_right4;
+
+L_step_right1:
+ .@spX = 1;
+ mes "You take one step to the right.";
+ next;
+ goto L_choose_shotpower;
+
+L_step_right2:
+ .@spX = 2;
+ mes "You take two steps to the right.";
+ next;
+ goto L_choose_shotpower;
+
+L_step_right3:
+ .@spX = 3;
+ mes "You take three steps to the right.";
+ next;
+ goto L_choose_shotpower;
+
+L_step_right4:
+ .@spX = 4;
+ mes "You take four steps to the right.";
+ next;
+ goto L_choose_shotpower;
+
+L_choose_shotpower:
+ mes "How powerfully do you want to shoot?";
+ next;
+ menu
+ "very weak shot",L_MenuItems,
+ "rather weak shot",L_MenuItems,
+ "weak shot",L_MenuItems,
+ "somewhat weak shot",L_MenuItems,
+ "medium shot",L_MenuItems,
+ "somewhat powerful shot",L_MenuItems,
+ "powerful shot",L_MenuItems,
+ "rather powerful shot",L_MenuItems,
+ "very powerful shot",L_MenuItems;
+
+L_MenuItems:
+ // we have 9 menu entries, so scale .@menu, which is in range 1-9, to a scale in -4 to +4
+ .@sp = .@menu - 5;
+ // calculate where you hit. You range is in [-8, 8] in X and Y as well
+ .@pointX = .@wdX + .@spX;
+ .@pointY = .@wdY + .@sp;
+
+ if( .@pointX==0 && .@pointY==0 )
+ goto L_target_hit;
+
+ //set .@targethit to these numbers:
+ //1,2,3 for left above, above, right above,
+ //4,5,6 for left, hit, right
+ //7,8,9 for lower left, below, lower right;
+ setarray .@target_direction$, "error3, please report", "left above", "above", "right above","left","error4, please report","right","lower left","below","lower right";
+
+ .@paramX = .@pointX;
+ .@paramY = .@pointY;
+ callsub S_getDirection;
+ .@targethit = .@returnIndex;
+
+ //now check how close
+ //get the distance squared:
+ // so it is in range 0 - 64:
+ // 0 is hit
+ // < 5 is very close
+ // <17 is close
+ // rest is a quite fucking shot
+ .@target_dist_sq = (.@pointX * .@pointX) + (.@pointY*.@pointY);
+
+ if (.@target_dist_sq < 5)
+ goto L_target_veryclose;
+ if (.@target_dist_sq < 17)
+ goto L_target_close;
+
+ //here are bad shots:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"D'oh, what a terrible shot!\"";
+ next;
+ mes "\"Do you even know what a bow is?\"";
+ next;
+ mes "\"That was far "+.@target_direction$[.@targethit]+".\"";
+ next;
+ goto L_Game;
+
+L_target_close:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"That was "+.@target_direction$[.@targethit]+".\"";
+ next;
+ mes "\"I suggest some training.\"";
+ next;
+ goto L_Game;
+
+L_target_veryclose:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"That was quite close. Impressive!\"";
+ next;
+ mes "\"It was a little "+.@target_direction$[.@targethit]+".\"";
+ next;
+ mes "\"But you did not hit... have another try.\"";
+ next;
+ //like a coin toss: 2 possibilites, the same chance for both:
+ //if(0 == rand(2)) goto L_Game;
+ mes "\"Hurry up, before the wind changes.\"";
+ next;
+ goto L_choose_start_pos;
+L_target_hit:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"Wonderful! That was great! Directly hit the bull's eye!\"";
+ next;
+ mes "\"Seems like you did it!\"";
+ next;
+ mes "\"Let me inspect it...\" She walks to the target.";
+ next;
+ if( rand(500) > (2*Dex + Agi))
+ goto L_target_nohit;
+ .@Q_hawkseye = 6;
+ callsub S_Update_Var;
+
+ addtoskill SKILL_MALLARDS_EYE, 1;
+ getexp .QUEST_HAWK_EXP, 0;
+
+ mes "\"You proved that you are worthy to call yourself a graduate of the School of Archery.\"";
+ next;
+ mes "\"But remember, there is always something new to learn. And you should not let your training down in order to keep and improve your abilities.\"";
+ goto L_Close;
+
+L_target_nohit:
+ mes "\"Ohh! Half a fingerbreadth aside.\"";
+ next;
+ mes "\"That is quite impressive, but you can perform better with more training.\"";
+ next;
+ goto L_Game;
+
+L_state6:
+ mesn "Gwendolyn Bowmaker";
+ mes "\"You really have a reason to be proud.\"";
+ goto L_Close;
+
+L_state1:
+ mes "[Gwendoly Bowmaker]";
+ mes "\"Welcome back. Did you decide to follow the Way of Archery?\"";
+ next;
+ menu
+ "I want to become an archer!",L_fee,
+ "I am not interested.",L_No_student;
+
+L_No_student:
+ mes "\"That's a pity. Well, if you change your mind, come back any time.\"";
+ .@Q_hawkseye = 1;
+ callsub S_Update_Var;
+ goto L_Close;
+
+L_No_Money:
+ mes "\"I am sorry, but it seems that you don't have enough money. Come back when you have reorganized your finances.\"";
+ .@Q_hawkseye = 1;
+ callsub S_Update_Var;
+ goto L_Close;
+
+L_No_bow:
+ mes "\"As an archer, you should always carry your bow with you. Go and get it.\"";
+ goto L_Close;
+
+L_bow_bought:
+ mes "\"You just bought it? You won't learn anything from that. To understand the nature of this bow, you have to collect the needed material by yourself. Only this way will you get a feeling of what it means to use such a weapon. \"";
+ next;
+ mes "\"The best thing would be to let you make the bow by yourself. But I guess, that would go to far. And it would take ages to get a high quality bow.\"";
+ next;
+ mes "\"Ok, go to Alan and come back with a bow made out of the logs you collected.\"";
+ goto L_Close;
+
+L_Not_enough_eggs:
+ mes "\"Maybe I should also give you a lesson in how to count? You haven't enough.\"";
+ goto L_Close;
+
+L_Not_Ready:
+ mes "\"I am pleased about your progrees, but you are not ready for the next step yet. Go and do some more training, before you come back. Remember also: It is wise to speak with people you meet on your journey, there is always something new to learn.\"";
+ goto L_Close;
+
+L_No_arrows:
+ mes "Gwendolyn sighs and shake her head.";
+ next;
+ mes "\"Another lecture: Take always enough arrows with you. Go and come back when you are equipped adequately.\"";
+ goto L_Close;
+
+L_Close:
+ close;
+
+S_Update_Var:
+ QUEST_Forestbow_state = (QUEST_Forestbow_state & ~(.@Q_hawkseye_MASK) | (.@Q_hawkseye << .@Q_hawkseye_SHIFT));
+ return;
+
+S_getDirection:
+ // get .@paramX .@paramY as parameters
+ // returns an index where these parameters are in relation to origin
+ // 123
+ // 456 whereas 5 is the origin. (3,6,9 there is paramX>0); (1,2,3 there is paramY>0)
+ // 789
+ //first check the quadrants and after check more precisely
+ if(.@paramX>0 && .@paramY>0) set .@returnIndex, 3;
+ if(.@paramX>0 && .@paramY<0) set .@returnIndex, 9;
+ if(.@paramX<0 && .@paramY>0) set .@returnIndex, 1;
+ if(.@paramX<0 && .@paramY<0) set .@returnIndex, 7;
+
+ //straight left
+ if ( (.@paramX < 0) && (.@paramY >= .@paramX/2) && (-.@paramY >= .@paramX/2) ) set .@returnIndex, 4;
+
+ //straight right
+ if ( (.@paramX > 0) && (.@paramY <= .@paramX/2) && (-.@paramY <= .@paramX/2) ) set .@returnIndex, 6;
+
+ //straight above
+ if ( (.@paramY > 0) && (.@paramX <= .@paramY/2) && (-.@paramX <= .@paramY/2) ) set .@returnIndex, 2;
+
+ //straight below
+ if ( (.@paramY < 0) && (.@paramX >= .@paramY/2) && (-.@paramX >= .@paramY/2) ) set .@returnIndex, 8;
+
+ //check the origin, because the origin is found by the "straight" lines as well. (should not, but is.. maybe a bug?)
+ if( .@paramX==0 && .@paramY==0 ) set .@returnIndex, 5;
+ return;
+
+OnInit:
+ // schoolfee in gp
+ .SCHOOLFEE = 25000;
+ // how many eggs do you need of each kind?
+ .CAVE_EGGS_AMOUNT = 18;
+ .SNAKE_EGGS_AMOUNT = 15;
+ .MOUNTAIN_EGGS_AMOUNT = 5;
+ .GRASS_EGGS_AMOUNT = 2;
+ // experience for eggs
+ .QUEST_EGG_EXP = 10000;
+ // The needed level for the minigame:
+ .BASELEVEL_GAME = 50;
+ // experience gained for hitting the bullseye:
+ .QUEST_HAWK_EXP = 10000;
+
+ end;
+}
diff --git a/npc/016-1/mapflags.txt b/npc/016-1/mapflags.txt
new file mode 100755
index 00000000..0ba40687
--- /dev/null
+++ b/npc/016-1/mapflags.txt
@@ -0,0 +1,2 @@
+//016-1 mapflag resave 010-1,27,97
+016-1 mapflag outside
diff --git a/npc/016-1/rossy.txt b/npc/016-1/rossy.txt
new file mode 100755
index 00000000..78b0bacb
--- /dev/null
+++ b/npc/016-1/rossy.txt
@@ -0,0 +1,288 @@
+
+016-1,32,44,0 script Rossy NPC114,{
+ @child_number = 6;
+ callfunc "XmasList";
+
+ @Cherry_Amount = 10;
+ @Cherry_EXP = 2000;
+
+ @CactusDrink_Amount = 24;
+ @MaggotSlime_Amount = 32;
+ @GambodgeHerb_Amount = 50;
+ @AlizarinHerb_Amount = 43;
+ @BugLeg_Amount = 30;
+ @Potion_EXP = 3000;
+
+ @RedRose_Amount = 15;
+ @RedTulip_Amount = 15;
+ @Flower_EXP = 2500;
+
+ @Finish_EXP = 5000;
+ @Finish_Money = 5000;
+
+ if (FLAGS & FLAG_ROSSI_COMPLETED) goto L_FinalEnd;
+ if (Rossy_Quest == 17 || Rossy_Quest == 18) goto L_End;
+
+ if (Rossy_Quest >= 14 && Rossy_Quest <= 16) goto L_Julia;
+ if (Rossy_Quest >= 13) goto L_Best;
+ if (Rossy_Quest >= 11) goto L_Allergic;
+ if (Rossy_Quest >= 8 && Rossy_Quest < 11) goto L_Donet;
+ if (Rossy_Quest == 7) goto L_BT;
+ if (Rossy_Quest == 6) goto L_Check2;
+ if (Rossy_Quest == 5) goto L_Let;
+ if (Rossy_Quest == 4 || Rossy_Quest == 5) goto L_Cherry_Done;
+ if (Rossy_Quest == 3) goto L_Check;
+ if (Rossy_Quest == 2) goto L_Mother;
+
+ mes "A young girl looks at you in tears.";
+ if (Rossy_Quest < 1)
+ close;
+ next;
+ menu
+ "Hey there.... Why are you crying? Are you hurt?", L_Next,
+ "Sorry kid, I don't have time to play with children.", L_No;
+
+L_Next:
+ mes "[Young Girl]";
+ mes "\"No. I'm crying because I lost all my fruits. My sister and I were collecting some near Dimond's Cove, but then I stumbled on a giant snail and it attacked us!";
+ next;
+ mes "But we were lucky, because the snail is really slow and we ran away from it. Julia ran to the left and I ran to the right. The snail got pretty confused, because we are identical twins. The problem is that I dropped the basket full of fruits on the ground and that evil snail ate them all! And now I can't find Julia to help me collect more fruits.\"";
+ next;
+ menu
+ "Did you say \"Julia?\" I talked to your mother; she's very worried about you!", L_SheWorried;
+
+L_SheWorried:
+ mes "[Rossy]";
+ mes "\"Really? But she let us play in the woods. There's no reason to be worried – unless....\"";
+ next;
+ mes "Rossy suddenly gets a strange look on her face, mumbling something about Julia.";
+ next;
+ mes "[Rossy]";
+ mes "\"Could you do me a favor? Please, tell my mother that we're alright. There's ... well ... there's no reason to worry about us.\"";
+ next;
+ menu
+ "Very well, if you say so....", L_SaySo,
+ "Sorry, but I really don't have time for this.", L_No;
+
+L_SaySo:
+ mes "[Rossy]";
+ mes "\"Thank you very much!\"";
+ Rossy_Quest = 2;
+ close;
+
+L_No:
+ close;
+
+L_Mother:
+ mes "[Rossy]";
+ mes "\"Please, tell my mother we are fine. If you feel like helping, come back after you talk to my mother. Maybe you could help us find some fruits.\"";
+ close;
+
+L_Get_Cherry:
+ mes "[Young Girl]";
+ mes "\"No, you don't have " + @Cherry_Amount + " cherries. I know how to count. I hope you get them soon.\"";
+ close;
+
+L_Check:
+ mes "[Rossy]";
+ mes "\"Hey, that is nice of you to come back. I was thinking about giving a basket full of cherries to my mother, to make her happy, you know. But we'd need at least " + @Cherry_Amount + " cherries, and it would take ages for me to get so many by myself!\"";
+ next;
+ menu
+ "That is no problem for me. Just wait and I will come back with the cherries.", L_No,
+ "Hey, I have some cherries in my backpack!", L_HaveSomeCherries,
+ "You should get them yourself.", L_No;
+
+L_HaveSomeCherries:
+ if(countitem("Cherry") < @Cherry_Amount)
+ goto L_Get_Cherry;
+ mes "[Rossy]";
+ Rossy_Quest = 4;
+ getexp @Cherry_EXP, 0;
+ mes "\"I can't believe it! You got all the cherries needed! Please give them to my mother. Tell her that it is a gift from me and Julia and that there's no reason to worry about us.\"";
+ next;
+ mes "Rossy mumbles to herself.";
+ mes "[Rossy]";
+ mes "\"I hope....\"";
+ next;
+ mes "[Rossy]";
+ mes "\"Oh, and after you give the cherries to my mother, please come back here. Err, if you have some free time, of course.\"";
+ close;
+
+L_Cherry_Done:
+ mes "[Rossy]";
+ mes "\"Please, try to distract my mother. I don't want her to be worried about us. While you do this, I will try to find Julia.\"";
+ close;
+
+L_Let:
+ mes "[Rossy]";
+ mes "\"Hello "+ strcharinfo(0) +", nice to see you again. Hey, what are you hiding behind your back? Is that a ... letter?\"";
+ next;
+ menu
+ "Your mother asked me to hand you this letter. She told me it was from your teacher.", L_Let2,
+ "Not at all. I need to go now, see you next time.", L_No;
+
+L_Let2:
+ mes "The little girl grabs the piece of paper and reads it quickly. Her face turns pale.";
+ menu
+ "What does it say?", L_PaperSays;
+
+L_PaperSays:
+ mes "[Rossy]";
+ mes "\"Oh no, I completely forgot! My magic school exam! I need to make a potion and give it to my teacher today! But I haven't found Julia yet and I don't even have any of the ingredients required. Could you get them for me, please?\"";
+ next;
+ Rossy_Quest = 6;
+ mes "\"I need " + @CactusDrink_Amount + " Cactus Drinks, " + @MaggotSlime_Amount + " Maggot Slimes, " + @GambodgeHerb_Amount + " Gamboge Herbs, " + @AlizarinHerb_Amount + " Alizarin Herbs and " + @BugLeg_Amount + " Bug Legs.\"";
+ next;
+ mes "\"Please come back to see me when you have the ingredients. I know the recipe by heart.\"";
+ close;
+
+L_NE:
+ mes "[Rossy]";
+ mes "\"Please bring me " + @CactusDrink_Amount + " Cactus Drinks, " + @MaggotSlime_Amount + " Maggot Slimes, " + @GambodgeHerb_Amount + " Gamboge Herbs, " + @AlizarinHerb_Amount + " Alizarin Herbs and " + @BugLeg_Amount + " Bug Legs.\"";
+ next;
+ mes "\"Please hurry!\"";
+ close;
+
+L_Check2:
+ if(countitem("CactusDrink") < @CactusDrink_Amount)
+ goto L_NE;
+ if(countitem("MaggotSlime") < @MaggotSlime_Amount)
+ goto L_NE;
+ if(countitem("GambogeHerb") < @GambodgeHerb_Amount)
+ goto L_NE;
+ if(countitem("AlizarinHerb") < @AlizarinHerb_Amount)
+ goto L_NE;
+ if(countitem("BugLeg") < @BugLeg_Amount)
+ goto L_NE;
+ delitem "CactusDrink", @CactusDrink_Amount;
+ delitem "MaggotSlime", @MaggotSlime_Amount;
+ delitem "GambogeHerb", @GambodgeHerb_Amount;
+ delitem "AlizarinHerb", @AlizarinHerb_Amount;
+ delitem "BugLeg", @BugLeg_Amount;
+ mes "Rossy takes all the ingredients and places them on the ground. She starts to mix some herbs with the cactus drinks and appears to cast some spells. She seems to know what she is doing.";
+ next;
+ mes "[Rossy]";
+ mes "\"Oh, thank you "+ strcharinfo(0) +"! It is done. If you don't mind, please give this potion to my teacher.\"";
+ Rossy_Quest = 7;
+ getexp @Potion_EXP, 0;
+ message strcharinfo(0), "Rossy hands you the potion, holding the bottle very carefully.";
+ next;
+ mes "\"My teacher's name is David. He is a very young magician and lives near the magic school in the north of Tulimshar.\"";
+ next;
+ mes "\"Please, give it to him as soon as you can!\"";
+ close;
+
+L_BT:
+ mes "[Rossy]";
+ mes "\"Great. Now if you could just give it to my teacher. His name is David. He is a very young magician and lives near the magic school in the north of Tulimshar.\"";
+ next;
+ mes "\"You should take the ferry, that'll be faster than swimming!\"";
+ close;
+
+L_Donet:
+ if (Rossy_Quest == 10
+ && countitem("RedRose") >= @RedRose_Amount)
+ goto L_RG;
+ menu
+ "David took your potion and he tested it in front of me. It worked perfectly!", L_DavidPotion;
+
+L_DavidPotion:
+ mes "[Rossy]";
+ mes "\"YPhew! That was close: I almost forgot about my exam. Please, tell my mother about my success for me. I'm sure she'll be pleased.\"";
+ close;
+
+L_RG:
+ if (countitem("RedRose") < @RedRose_Amount)
+ goto L_No;
+ delitem "RedRose", @RedRose_Amount;
+ menu
+ "Your mother was so happy that she asked me to bring you these flowers.", L_MotherFlowers;
+
+L_MotherFlowers:
+ mes "[Rossy]";
+ mes "\"How nice!\"";
+ next;
+ mes "Rossy takes the flowers from your hands and suddenly throws them on the ground. She begins sneezing.";
+ Rossy_Quest = 11;
+ menu
+ "I presume you don't like roses, right?", L_LikeRoses;
+
+L_LikeRoses:
+ mes "[Rossy]";
+ mes "\"I am allergic to roses, my mother should already know that!\"";
+ close;
+
+L_Allergic:
+ mes "Rossy sneezes a lot.";
+ if (Rossy_Quest == 12
+ && countitem("RedTulip") >= @RedTulip_Amount)
+ goto L_Sorry;
+ close;
+
+L_Sorry:
+ menu
+ "Your mother is sorry about the roses. Here are some beautiful red tulips instead.", L_See;
+
+L_See:
+ mes "[Rossy]";
+ if (countitem("RedTulip") < @RedTulip_Amount)
+ goto L_No;
+ delitem "RedTulip", @RedTulip_Amount;
+ Rossy_Quest = 13;
+ mes "\"That's better! Go and tell my mother that she is the nicest mother in the world.\"";
+ next;
+ mes "\"Now I should really find my sister. Come back later.\"";
+ getexp @Flower_EXP, 0;
+ close;
+
+L_Best:
+ mes "[Rossy]";
+ mes "\"Thank you "+ strcharinfo(0) +", you helped me so much!\"";
+ next;
+ menu
+ "Did you find your sister? I am starting to get worried too.", L_FindMySister;
+
+L_FindMySister:
+ mes "\"I think I have an idea where she might be. Come back in a few minutes, I will tell you if she is ok.\"";
+ Rossy_Quest = 14;
+ close;
+
+L_Julia:
+ mes "[Rossy]";
+ mes "\"I saw Julia! She was running away from something and entered a cave not far from here. I heard her scream. Please can you enter the cave and save her? I'm so scared!\"";
+ close;
+
+L_End:
+ mes "[Rossy]";
+ mes "\"Oh no! Julia ... why would you go to that scary place? ... Have you seen her yet?\"";
+ menu
+ "She'll be back soon, trust me. I saved her.", L_Found,
+ "I didn't see her yet, sorry.", L_No;
+
+L_Found:
+ mes "[Rossy]";
+ if (Rossy_Quest == 17)
+ Rossy_Quest = 18;
+ if (Rossy_Quest == 18)
+ Rossy_Quest = 19;
+ mes "\"Oh, "+ strcharinfo(0) +", thank you very much! Take this, you deserve it!\"";
+ next;
+ mes "Rossy hands you a huge bag full of coins.";
+ getexp @Finish_EXP, 0;
+ Zeny = Zeny + @Finish_Money;
+ if (Rossy_Quest == 19)
+ goto L_Clear;
+ close;
+
+L_Clear:
+ Rossy_Quest = 0;
+ cavefights = 0;
+ FLAGS = FLAGS | FLAG_ROSSI_COMPLETED;
+ close;
+
+L_FinalEnd:
+ mes "[Rossy]";
+ mes "\"Julia and I are playing hide and seek right now. It is fun in the forest!\"";
+ mes "The young girl laughs quietly.";
+ close;
+}