From cf18ce071c79ae37e14ea38943e0b1d88da70a7b Mon Sep 17 00:00:00 2001 From: Jesusaves Date: Fri, 9 Apr 2021 13:33:57 -0300 Subject: Override --- npc/029-2/_import.txt | 16 ++ npc/029-2/_mobs.txt | 3 + npc/029-2/_warps.txt | 8 + npc/029-2/alchemy.txt | 98 +++++++++++ npc/029-2/bankroom.txt | 5 + npc/029-2/barrels.txt | 45 +++++ npc/029-2/barrels_config.txt | 84 ++++++++++ npc/029-2/cynric.txt | 6 + npc/029-2/mapflags.txt | 3 + npc/029-2/morgan.txt | 113 +++++++++++++ npc/029-2/nyle.txt | 47 ++++++ npc/029-2/sorfina.txt | 387 +++++++++++++++++++++++++++++++++++++++++++ npc/029-2/stat_reset.txt | 49 ++++++ npc/029-2/tanisha.txt | 286 ++++++++++++++++++++++++++++++++ npc/029-2/two_arms.txt | 3 + 15 files changed, 1153 insertions(+) create mode 100644 npc/029-2/_import.txt create mode 100644 npc/029-2/_mobs.txt create mode 100644 npc/029-2/_warps.txt create mode 100755 npc/029-2/alchemy.txt create mode 100755 npc/029-2/bankroom.txt create mode 100755 npc/029-2/barrels.txt create mode 100755 npc/029-2/barrels_config.txt create mode 100755 npc/029-2/cynric.txt create mode 100755 npc/029-2/mapflags.txt create mode 100755 npc/029-2/morgan.txt create mode 100755 npc/029-2/nyle.txt create mode 100755 npc/029-2/sorfina.txt create mode 100755 npc/029-2/stat_reset.txt create mode 100755 npc/029-2/tanisha.txt create mode 100755 npc/029-2/two_arms.txt (limited to 'npc/029-2') diff --git a/npc/029-2/_import.txt b/npc/029-2/_import.txt new file mode 100644 index 00000000..1a254643 --- /dev/null +++ b/npc/029-2/_import.txt @@ -0,0 +1,16 @@ +// Map 029-2: Candor Island Indoor +// This file is generated automatically. All manually added changes will be removed when running the Converter. +"npc/029-2/_mobs.txt", +"npc/029-2/_warps.txt", +"npc/029-2/alchemy.txt", +"npc/029-2/bankroom.txt", +"npc/029-2/barrels.txt", +"npc/029-2/barrels_config.txt", +"npc/029-2/cynric.txt", +"npc/029-2/mapflags.txt", +"npc/029-2/morgan.txt", +"npc/029-2/nyle.txt", +"npc/029-2/sorfina.txt", +"npc/029-2/stat_reset.txt", +"npc/029-2/tanisha.txt", +"npc/029-2/two_arms.txt", diff --git a/npc/029-2/_mobs.txt b/npc/029-2/_mobs.txt new file mode 100644 index 00000000..46230226 --- /dev/null +++ b/npc/029-2/_mobs.txt @@ -0,0 +1,3 @@ +// This file is generated automatically. All manually added changes will be removed when running the Converter. +// Map 029-2: Candor Island Indoor mobs +029-2,33,57,12,3 monster Wicked Mushroom 1050,7,100000,30000 diff --git a/npc/029-2/_warps.txt b/npc/029-2/_warps.txt new file mode 100644 index 00000000..3a6e62bb --- /dev/null +++ b/npc/029-2/_warps.txt @@ -0,0 +1,8 @@ +// This file is generated automatically. All manually added changes will be removed when running the Converter. +// Map 029-2: Candor Island Indoor warps +029-2,29,62,0 warp #029-2_29_62 0,0,029-1,40,89 +029-2,22,93,0 warp #029-2_22_93 0,0,029-1,44,84 +029-2,112,84,0 warp #029-2_112_84 0,0,029-2,44,30 +029-2,103,62,0 warp #029-2_103_62 0,0,029-1,52,85 +029-2,94,31,0 warp #029-2_94_31 0,0,029-1,58,80 +029-2,24,124,0 warp #029-2_24_124 0,0,029-1,49,78 diff --git a/npc/029-2/alchemy.txt b/npc/029-2/alchemy.txt new file mode 100755 index 00000000..f9799252 --- /dev/null +++ b/npc/029-2/alchemy.txt @@ -0,0 +1,98 @@ +- script _N-Alchemy NPC32767,{ + @npc_distance = 1; + callfunc "PCtoNPCRange"; + if (@npc_check) end; + + title "Alchemy Lab"; + mes "This is an alchemy lab."; + mes "With it, you can combine reagents together to create powerful potions."; + next; + clear; + mes "##BDrag & drop 2 items from your inventory. All items used will be lost.##b"; + cleararray @alchlab_items$[0], "", 2; // since we're not using a scoped (.@) array, we need to clean it + requestitem @alchlab_items$[0], 2; // TODO: add a craft builtin (npc action 12) + clear; + if (@alchlab_items$[0] == "" || @alchlab_items$[1] == "") + goto L_NoItems; + + mes "You are about to combine the following:"; + mes " ["+ getitemlink(@alchlab_items$[0]) +"]"; + mes " ["+ getitemlink(@alchlab_items$[1]) +"]"; + mes; + mes "##BWarning! This will permanently destroy the selected items.##b"; + // can not use a scope variable to store item names because menu is a script terminator (destroys the scope) + menu + "Abort Mission.", L_Abort, + "Proceed.", L_Proceed; + +L_Proceed: + // XXX: here we could make it wait a little, while the potion is boiling (and show an animation/particles/sound) + if (countitem(@alchlab_items$[0]) < 1 || countitem(@alchlab_items$[1]) < 1) // this shouldn't happen, but just to be safe.. + goto L_NoItems; + delitem @alchlab_items$[0], 1; + delitem @alchlab_items$[1], 1; + if (@alchlab_items$[0] == "BottleOfWater" || @alchlab_items$[1] == "BottleOfWater") // give back used bottles + getitem "EmptyBottle", if_then_else(@alchlab_items$[0] == "BottleOfWater" && @alchlab_items$[1] == "BottleOfWater",2,1); + + .@n = -3; + goto L_CheckRecipes; + +L_CheckRecipes: + .@n = .@n+3; + if (.@n == get(.rsize, "_N-Alchemy")) + goto L_Failed; + if (!(get(.recipes$[.@n], "_N-Alchemy") == @alchlab_items$[0] && get(.recipes$[.@n+1], "_N-Alchemy") == @alchlab_items$[1]) && + !(get(.recipes$[.@n], "_N-Alchemy") == @alchlab_items$[1] && get(.recipes$[.@n+1], "_N-Alchemy") == @alchlab_items$[0])) + goto L_CheckRecipes; + + getitem get(.recipes$[.@n+2], "_N-Alchemy"), 1; // XXX: here we could also make it fail sometimes depending on your expertise + + // XXX: here we could make it give profession/crafting exp + clear; + mes "You combined the following:"; + mes " ["+ getitemlink(@alchlab_items$[0]) +"]"; + mes " ["+ getitemlink(@alchlab_items$[1]) +"]"; + mes; + mes "You obtained:"; + mes " ["+ getitemlink(get(.recipes$[.@n+2], "_N-Alchemy")) +"]"; + close; + +L_NoItems: + mes "You must put exactly 2 items."; + close; + +L_Failed: + mes "The potion bubbles violently and evaporates."; // XXX: here we could have random failure messages + close; + +L_Abort: + close; + +S_Spawn: + .@s = getarraysize(.x1); + if (.spawned >= .@s) + goto S_Return; + .@n$ = "#_Al-lab"+chr(3)+.spawned; + if (puppet(.m$[.spawned], .x1[.spawned], .y1[.spawned], .@n$, 399) < 1) mapexit; + .spawned = .spawned + 1; + if (.spawned < .@s) + goto S_Spawn; + return; + +S_Return: + return; + +OnMaybeStart: + callsub S_Spawn; + if (.started == 0) + goto L_InitVars; + end; + +L_InitVars: + setarray .recipes$[0], 0, + "DilutedConcentrationPot", "DarkConcentrationPotion", "ConcentrationPotion", + "CactusDrink", "CactusDrink", "CactusPotion", + "PinkPetal", "BottleOfWater", "ConcentrationPotion"; + .rsize = getarraysize(.recipes$); + end; +} diff --git a/npc/029-2/bankroom.txt b/npc/029-2/bankroom.txt new file mode 100755 index 00000000..12a7390c --- /dev/null +++ b/npc/029-2/bankroom.txt @@ -0,0 +1,5 @@ + +029-2,35,122,0 script #BankRoom NPC32767,0,0,{ + message strcharinfo(0), "The door is locked. This must be where Cynric saves the people's money and items."; + end; +} diff --git a/npc/029-2/barrels.txt b/npc/029-2/barrels.txt new file mode 100755 index 00000000..b44fec43 --- /dev/null +++ b/npc/029-2/barrels.txt @@ -0,0 +1,45 @@ +029-2,23,86,0 script Barrel#0 NPC400,{ + @barrel = 0; + callfunc "CheckBarrel"; + end; + +OnMaggotDeath: + @mobId = 1050; + callfunc "MobPoints"; + end; +} +029-2,28,86,0 script Barrel#1 NPC400,{ + @barrel = 1; + callfunc "CheckBarrel"; + end; +} +029-2,31,91,0 script Barrel#2 NPC400,{ + @barrel = 2; + callfunc "CheckBarrel"; + end; +} +029-2,36,85,0 script Barrel#3 NPC400,{ + @barrel = 3; + callfunc "CheckBarrel"; + end; +} +029-2,40,89,0 script Barrel#4 NPC400,{ + @barrel = 4; + callfunc "CheckBarrel"; + end; +} +029-2,38,91,0 script Barrel#5 NPC400,{ + @barrel = 5; + callfunc "CheckBarrel"; + end; +} +029-2,29,92,0 script Barrel#6 NPC400,{ + @barrel = 6; + callfunc "CheckBarrel"; + end; +} +029-2,24,91,0 script Barrel#7 NPC400,{ + @barrel = 7; + callfunc "CheckBarrel"; + end; +} diff --git a/npc/029-2/barrels_config.txt b/npc/029-2/barrels_config.txt new file mode 100755 index 00000000..84f4b111 --- /dev/null +++ b/npc/029-2/barrels_config.txt @@ -0,0 +1,84 @@ +029-2,33,88,24,7 monster HouseMaggot 1050,2,100000,30000,Barrel#0::OnMaggotDeath +- script #BarrelConfig NPC32767,{ + end; + +OnInit: + setarray $@BarrelBits, (1 << 20), (1 << 21), (1 << 22), (1 << 23), (1 << 24), (1 << 25), (1 << 26), (1 << 27); + setarray $@BarrelRewards, 533, 507, 505, 518, 537, 526; + $@BarrelSpawnCnt = 1; + $@BarrelSpawnId = 1050; + $@BarrelSpawnName$ = "House Maggot"; + $@BarrelMax = getarraysize($@BarrelBits); + end; +} +function script CountBarrels { + @barrel_count = 0; + @count_tmp = 0; + goto L_Loop; + +L_Loop: + if (STARTAREA & $@BarrelBits[@barrel_count]) + goto L_AddOne; + goto L_LoopAgain; + +L_AddOne: + @barrel_count = (@barrel_count + 1); + goto L_LoopAgain; + +L_LoopAgain: + @count_tmp = (@count_tmp + 1); + if (@count_tmp == getarraysize($@BarrelBits)) + goto L_BarrelTally; + goto L_Loop; + +L_BarrelTally: + return; +} +function script CheckBarrel { + @npc_distance = 2; + callfunc "PCtoNPCRange"; + if(@npc_check) goto L_Return; + if (!(QL_ZEGAS == 2)) + goto L_NoI; + if (STARTAREA & $@BarrelBits[@barrel]) + goto L_Empty; + STARTAREA = STARTAREA | $@BarrelBits[@barrel]; + + callfunc "CountBarrels"; + if (@barrel_count == $@BarrelMax) + goto L_QuestReward; + @player_random = rand(@barrel_count * 10); + @barrel_random = rand(@barrel_count * $@BarrelMax); + if (@barrel_random > @player_random) + goto L_Spawn; + goto L_Reward; + +L_NoI: + message strcharinfo(0), "Nothing interesting here."; + goto L_Return; + +L_Empty: + message strcharinfo(0), "You've already searched this barrel."; + goto L_Return; + +L_QuestReward: + message strcharinfo(0), "You found the bug bomb."; + misceffect 33; + QL_ZEGAS = 3; + killmonster getmapname() + "", "Barrel#0::OnMaggotDeath"; + goto L_Return; + +L_Spawn: + message strcharinfo(0), "Uck, More Maggots!"; + setarray @npc_loc, getnpcx(), getnpcy(); + areamonster getmapname(), @npc_loc[0], @npc_loc[1], (@npc_loc[0] + 1), (@npc_loc[1] + 1), $@BarrelSpawnName$, $@BarrelSpawnId, $@BarrelSpawnCnt, "Barrel#0::OnMaggotDeath"; + cleararray @npc_loc, 0, 2; + goto L_Return; + +L_Reward: + getitem $@BarrelRewards[rand(getarraysize($@BarrelRewards))], 1; + goto L_Return; + +L_Return: + return; +} diff --git a/npc/029-2/cynric.txt b/npc/029-2/cynric.txt new file mode 100755 index 00000000..beecaa04 --- /dev/null +++ b/npc/029-2/cynric.txt @@ -0,0 +1,6 @@ + +029-2,30,118,0 script Cynric NPC161,{ + @npcname$ = "Cynric"; + callfunc "Banker"; + close; +} diff --git a/npc/029-2/mapflags.txt b/npc/029-2/mapflags.txt new file mode 100755 index 00000000..bfe50c0c --- /dev/null +++ b/npc/029-2/mapflags.txt @@ -0,0 +1,3 @@ +029-2 mapflag nosave 029-2,22,24 +//029-2 mapflag resave 029-2,22,24 +029-2 mapflag mask 1 diff --git a/npc/029-2/morgan.txt b/npc/029-2/morgan.txt new file mode 100755 index 00000000..5c12dfc3 --- /dev/null +++ b/npc/029-2/morgan.txt @@ -0,0 +1,113 @@ +029-2,105,57,0 script MorganDebug NPC355,{ + mes "[Morgan Debug]"; + mes "Reset?"; + menu + "Yes.", L_Reset, + "No.", L_End; +L_Reset: + QL_MORGAN = 0; + mes "Reset!"; + goto L_End; + +L_End: + end; + +OnInit: + if (!debug) + disablenpc "MorganDebug"; + end; +} +029-2,101,57,0 script Morgan#_M NPC355,{ + callfunc "PCtoNPCRange"; + if(@npc_check) end; + + if (Int >= 5) + goto L_Learn; + goto L_NotMagic; + +L_Learn: + if (QL_MORGAN == 0) + goto L_NotSeen; + if (QL_MORGAN == 1) + goto L_Seen; + if (QL_MORGAN == 2) + goto L_Started; + if (QL_MORGAN == 3) + goto L_CastOnce; + if (QL_MORGAN == 4) + goto L_LearningDone; + goto L_close; + +L_NotSeen: + QL_MORGAN = 1; + mes "[Morgan]"; + mes "\"Welcome to the magic school of Candor\""; + mes "\"My name is Morgan, I'm Head of Wizardry.\""; + mes "\"You appear to have the markings to use magic.\""; + mes "\"Granted you are still to young to cast spells.\""; + mes "\"But we can teach you to use simple magic devices.\""; + mes "\"Would you like to learn some apprentice skills?\""; + menu + "Yes.", L_Start, + "Maybe later", L_close; + +L_Seen: + mes "[Morgan]"; + mes "\"Have you returned to learn some magic?\""; + menu + "Yes.", L_Start, + "Maybe later", L_close; + +L_NotMagic: + mes "[Morgan]"; + mes "\"Hrmm you don't appear to posses enough magical talent to teach.\""; + goto L_close; + +L_Start: + QL_MORGAN = 2; + mes "\"Great, lets begin your first lesson.\""; + getitem 1171, 1; + mes "\"This is a wand, there are many like it but this one is now yours.\""; + mes "\"Various wands and staffs are found throughout the land with many different strengths and weaknesses.\""; + mes "\"To use the wand you need to have it equipped and speak the incantation to let it tap into your mana.\""; + mes "\"As the power of your magic grows so will the spells you can cast.\""; + mes "\"Lets start with a basic wand attack. " + get(.invocation$, "spell-wand") + "\""; + mes "\"Equip the wand and lets try out that spell.\""; + mes "\"To cast a spell open the chat window, type the invocation and press enter.\""; + mes "\"Speak to me again once you've cast the spell.\""; + goto L_close; + +L_Started: + mes "[Morgan]"; + mes "\"Lets start with a basic wand attack. " + get(.invocation$, "spell-wand") + "\""; + mes "\"Equip the wand and lets try out that spell.\""; + mes "\"To cast a spell open the chat window, type the invocation and press enter.\""; + mes "\"Speak to me again once you've cast the spell.\""; + goto L_close; + +L_CastOnce: + mes "[Morgan]"; + mes "\"Ok, good job! Looks like you have good mana flow.\""; + mes "\"Onto the next lesson. Now that you have " + get(.invocation$, "spell-wand") + " cast,\""; + mes "\"Each time you attack the wand will convert a bit of you mana into a magic bolt.\""; + mes "\"After so many attacks, you will need to recast the invocation to stay attuned to the wand.\""; + mes "\"(Logging out will also cancel any spell effects currently active in-game.).\""; + next; + mes "\"I've taught you all I can for now. You should visit the Mana Seed north west of Hurnscald.\""; + QL_MORGAN = 4; + goto L_close; + +L_LearningDone: + mes "[Morgan]"; + mes "\"" + get(.invocation$, "spell-wand") + " is a basic wand attack.\""; + mes "\"A Wand must be equipped to use the spell.\""; + mes "\"To cast a spell open the chat window, type the invocation and press enter.\""; + mes "\"You can also discharge any active spell by saying " + get(.invocation$, "discharge spell") + ".\""; + mes "\"I've taught you all I can for now. You should visit the Mana Seed north west of Hurnscald.\""; + goto L_close; + +L_close: + close; +} + +029-2,113,59,0 shop Zitoni NPC103,501:25,502:35,825:50,826:100 diff --git a/npc/029-2/nyle.txt b/npc/029-2/nyle.txt new file mode 100755 index 00000000..d4573269 --- /dev/null +++ b/npc/029-2/nyle.txt @@ -0,0 +1,47 @@ + +029-2,26,120,6 script Nyle NPC101,{ + mes "[Nyle]"; + mes "\"Visiting the bank too right? We're only a small village but Cynric is the best bank guy I know.\""; + menu + "Yeah, you're right.", L_close, + "What is banking?", L_Explain; + +L_Explain: + mes "[Nyle]"; + mes "\"There are banks all over the world. Usually every important village or city has one."; + mes "You can save both items and money at a bank.\""; + menu + "How do I save items?", L_Items, + "How do I save money?", L_Money, + "Thanks!", L_Thanks; + +L_Items: + mes "[Nyle]"; + mes "\"Let Cynric open your storage. You might also want to open your inventory."; + mes "Pick an item from either storage or inventory and choose what you want to do with it by clicking the right button."; + mes "You can also pick and drag items from one window into the other but this will move all items of this kind."; + next; + mes "Items in your storage are totally safe. Banking itself is totally safe.\""; + menu + "And how do I save money?", L_Money, + "Thanks!", L_Thanks; + +L_Money: + mes "[Nyle]"; + mes "\"That's easy. Cynric will save your money when you ask him to deposit. Or you pick up your money by asking to withdraw."; + mes "You only have to tell him how much you want to deposit or withdraw."; + mes "Also you can ask how much he already save for you by checking your balance."; + next; + mes "Money in your storage is totally safe. Banking itself is totally safe.\""; + menu + "And how do I save items?", L_Items, + "Thanks!", L_Thanks; + +L_Thanks: + mes "[Nyle]"; + mes "\"You are very welcome.\""; + goto L_close; + +L_close: + close; +} diff --git a/npc/029-2/sorfina.txt b/npc/029-2/sorfina.txt new file mode 100755 index 00000000..fe77d09d --- /dev/null +++ b/npc/029-2/sorfina.txt @@ -0,0 +1,387 @@ +029-2,27,27,0 script Sorfina NPC154,0,1,{ + @npc_distance = 2; + callfunc "PCtoNPCRange"; + if(@npc_check) end; + goto L_Main; + +L_Main: + if (QL_BEGIN == 10) goto L_Hasan; + if (QL_BEGIN >= 4) goto L_Again; + if (QL_BEGIN == 3) goto L_Clothes; + if (QL_BEGIN == 2) goto L_Dresser; + if (QL_BEGIN == 1) goto L_Carpet; + goto L_Start; + +L_Start: + mes "You open your eyes."; + mes ""; + mes "[Old Woman]"; + mes "\"Ah, you woke up. You washed ashore on the beach 3 days ago. You've been asleep since."; + mes "You must have been thrown off one of the ships sailing during that last tremor.\""; + mes "\"My little granddaughter Tanisha found you. Kaan was able to carry you to bed."; + mes "We've been taking care of you ever since. Waiting for you to wake up.\""; + mes "\"You didn't have any possessions on you when we found you and no one knows who you are.\""; + mes "Do you have a name?"; + menu + strcharinfo(0), L_name; + +L_name: + mes "[Old Woman]"; + mes "\"Well " + strcharinfo(0) + " what else can you tell me about yourself?.\""; + next; + mes "[Old Woman]"; + mes "\"Go on. If you need to think a bit, take your time.\""; + select + "... Tulimshar in Tonori ... I'm a Talpan."; + mes ""; + mes "[Old Woman]"; + mes "\"Anything else you can remember?\""; + menu + "Umm... no... I... I don't remember anything else...", L_KnowNothing; + +L_KnowNothing: + mes "[Old Woman]"; + mes "\"Well I can tell you some useful things, if you want to hear."; + mes "Some of it might jog your memory or at least help you catch your bearings."; + mes "Oh, and by the way my name is Sorfina.\""; + menu + "That would be great!",L_Tut, + "No, thanks. I already know how things are going.",L_SkipTut; + +L_Tut: + mes "She smiles at you."; + mes "[Sorfina]"; + mes "\"You have arrived at a very strange time. The Council is visiting Candor today.\""; + mes "\"All the recent rumbling from the cave has all of Candor worried.\""; + mes "\"Our guess is something with the last big shaker was the reason you ended up here.\""; + mes "\"Ok, lets start by getting you dressed.\""; + goto L_Carpet; + +L_Carpet: + mes "[Sorfina]"; + mes "\"Try to take a few steps and walk to that carpet over there."; + next; + camera "#Carpet"; + mapmask getmask() | 4; + next; + camera; + mes "Press [###keyMoveUp;] to move up, press [###keyMoveDown;] to move down, "; + mes "press [###keyMoveLeft;] to move left, press [###keyMoveRight;] to move right "; + mes " or click on the place you want to go to.\""; + QL_BEGIN = 1; + goto L_close; + +L_Dresser: + mes "[Sorfina]"; + mes "\"You should get dressed now.\""; + next; + camera "Dresser#tutorial"; + mapmask getmask() | 32; + mes "\"In that dresser there are some clothes you can wear.\""; + mes "\"To interact with things in your environment or talk to NPCs you can either click on it or press [###keyTargetNPC;] to focus and [###keyTalk;] to talk/activate.\""; + next; + camera; + mes "\"Now get the clothes out of the dresser.\""; + goto L_close; + +L_Naked: + mes "[Sorfina]"; + mes "\"Press [###keyWindowInventory;] or click on the Inventory button in the bar at the upper right corner to open your bag.\""; + mes "\"Once we stop talking, double-click on the clothes to equip.\""; + mes "\"Talk to me again after you get dressed. You can either click on me, or press [###keyTargetNPC;] to focus on me and [###keyTalk;] to talk.\""; + goto L_close; + +L_Clothes: + if (getequipid(equip_torso) < 0) + goto L_Naked; + mes "[Sorfina]"; + mes "\"That's much better, don't you think?\""; + mes "\"Here take this.\""; + getitem "HitchhikersTowel", 1; + mes "\"Your HitchHikers Towel will return you to your last set soul menhir or here if not set.\""; + mes "\"It can't be used constantly as the magic needs time to power the jump.\""; + mes "\"I think this will help you a bit. To get more information, press the button Setup and look at the controls on the Keyboard tab. You can also change them as you like."; + mes "Talk to me again if you want me to explain more things.\""; + + mes "\"Oh, and if you're looking for extra work, you should talk to Aidan and Valon when you go outside. They're giving rewards for monster hunting."; + mes "You can find Aidan near the camp fire outside and Valon out by the fields in the east.\""; + next; + + mes "She digs in her pocket for a moment."; + mes "\"And here is some money for you. Don't spend it all in one place."; + mes "Now go help Tanisha downstairs.\""; + mapmask getmask() | 8; + Zeny = Zeny + 30; + QL_BEGIN = 4; + goto L_close; + +L_Again: + mes "[Sorfina]"; + mes "\"Make yourself at home! Do you have any questions?\""; + menu + "Yes, could you explain about...",L_Explain, + "Could I get Healed?",L_Heal, + "No, thanks.",L_close; + +L_Heal: + if (BaseLevel > 20) + goto L_NoHeal; + mes "[Sorfina]"; + mes "\"Hello Dear! You look tired, you should rest a moment.\""; + mes "You take a short nap and feel refreshed."; + heal MaxHp, 0; + goto L_Main; + +L_NoHeal: + mes "[Sorfina]"; + mes "\"I'm sorry but your wounds are far to advanced for my skills.\""; + goto L_Main; + +L_Explain: + menu + "... walking?",L_Walk, + "... talking?",L_Talk, + "... the inventory and items?",L_Items, + "... shortcuts?",L_Shortcut, + "... what to do in Candor?",L_Aidan, + "... change my appearence?",L_Barber, + "... nevermind.",L_close; + +L_Walk: + mes "[Sorfina]"; + mes "\"You can use the arrow keys to walk around."; + mes "Press [###keyMoveUp;] to move up, press [###keyMoveDown;] to move down, "; + mes "press [###keyMoveLeft;] to move left, press [###keyMoveRight;] to move right "; + mes " or click on the place you want to go to."; + mes "This only works if that place is reachable and walkable.\""; + goto L_close; + +L_Talk: + mes "[Sorfina]"; + mes "\"If you want to talk to a normal person, you can click at him or her."; + mes "Or you can press [###keyTargetNPC;] to focus on the nearest person and then press [###keyTalk;] to talk.\""; + next; + mes "\"If you want to talk to other adventurers, press [###keyChat;] to open your chat window."; + mes "Then type your message and press Enter to send.\""; + next; + mes "\"You may want to talk privately to another adventurer sometimes. In that case you can whisper."; + mes "After pressing [###keyChat;] type '/whisper [name] [message]'."; + mes "Or you can right click on someone and choose the whisper option.\""; + next; + mes "\"Press [###keyWindowChat;] to show and hide your chat window.\""; + goto L_close; + +L_Items: + mes "[Sorfina]"; + mes "\"There are three types of items."; + mes "They can be Consumables, Equipment or Miscellaneous.\""; + next; + mes "\"Consumable items such as Potions, can be used only once."; + mes "After use, they will disappear from your inventory."; + mes "There are some rare items that can be used but don't get consumed.\""; + next; + mes "\"Equipment items like Armors, Weapons, Accessories can be equipped for fashionable purposes or to raise your status.\""; + next; + mes "\"Miscellaneous items such as maggot slime, can be used in creating other items, or just to trade and sell.\""; + next; + mes "\"Your HitchHikers Towel will return you to your last set soul menhir or here if not set.\""; + mes "\"It can't be used constantly as the magic needs time to power the jump.\""; + next; + mes "\"Press [###keyWindowInventory;] to open your inventory."; + mes "When placing your cursor over an item there, you can see a box with some information about that item.\""; + next; + mes "\"To use or equip an item, select it by double-clicking on it."; + mes "Selecting the item then pressing Use or Equip also works.\""; + goto L_close; + +L_Shortcut: + mes "[Sorfina]"; + mes "\"Press [###keyWindowShortcut;] or click the Shortcut button in the bar at the upper right to open your shortcut window.\""; + next; + mes "\"You can select the item you want to put on a shortcut with your mouse and then click on the position in the shortcut window you want to place it.\""; + next; + mes "\"Now you can use or equip/unequip it by pressing the number of the shortcut.\""; + goto L_close; + +L_Aidan: + mes "[Sorfina]"; + mes "\"I heard Aidan and Valon are looking for brave adventurers, you might want to talk to them. "; + mes "You can find Aidan near the camp fire outside. The fields are just south of the town exit. "; + mes "You'll see Valon of the city gaurd standing there. They both are offering rewards for monster hunting.\""; + next; + mes "\"When you leave this area to the South, you'll come to the docks."; + mes "They will take you to Hurnscald, a major trading port.\""; + next; + mes "\"Go east out of Candor and north. You will find the cave everyone is talking about to the north."; + next; + mes "Talk to everybody. You can never tell when they might know something useful.\""; + goto L_close; + +L_Barber: + mes "[Sorfina]"; + mes "\"Jessie downstairs can change your appearance.\""; + mes "\"They will allow you to change your hair color or style as well as gender.\""; + next; + mes "\"There are a number of people across the continent that can change this for you.\""; + mes "\"There is no cost or limit to the number of times it can be changed.\""; + goto L_close; + +L_Hasan: + mes "[Sorfina]"; + mes "\"Make yourself at home! Do you have any questions?\""; + menu + "A guy named Hasan is bullying people.",L_Next, + "Yes, could you explain again about...",L_Explain, + "No, thanks.",L_close; + +L_Next: + mes "\"Ah, Hasan. He's causing trouble again?\""; + mes "She shakes her head."; + mes "[Sorfina]"; + mes "\"This guy has been a plague ever since he could walk. He's always causing trouble.\""; + mes "\"And his father... Well, one day his father thought he should teach Hasan a lesson.\""; + mes "\"He took him into the desert and then left him there!"; + mes "Hasan was only seven years old!\""; + mes "\"I never understood how someone could do something like that to a child, even if it's a rascal like Hasan.\""; + mes "\"Anyway, Hasan tried to find his way back home, but stumbled into a nest of scorpions!\""; + mes "She shakes her head."; + mes "\"If Valon hadn't have come along that moment, Hasan would have died that day.\""; + mes "\"However, the scorpions poison caused a bad fever and once Hasan had recovered from that, he was even more malicious than before.\""; + mes "She sighs."; + QL_BEGIN = 11; + goto L_close; + +L_SkipTut: + mes "[Sorfina]"; + mes "\"Really? You seem quite unexperienced. Listening to some advice won't hurt.\""; + menu + "Thinking about it twice... please tell me.",L_Tut, + "Yeah, but thanks for the offer. Bye.",L_Bye; + +L_Bye: + mes "[Sorfina]"; + mes "\"Alright, if you say so. But take at least this. See you later.\""; + getitem "Knife", 1; + getitem "SlingShot", 1; + getitem "SlingBullet", 500; + getitem "HitchhikersTowel", 1; + getitem "CottonShirt", 1; + getitem "RaggedShorts", 1; + set Zeny, Zeny + 35; // tanisha gives 5 Zeny + QL_BEGIN = 8; + goto L_close; + +L_close: + close; + +OnTouch: + if (QL_BEGIN > 0) + end; + goto L_Start; +} + +029-2,33,27,0 script #Carpet NPC127,1,1,{ + if (QL_BEGIN != 1) + end; + mapmask getmask(); + mes "[Sorfina]"; + mes "\"You should get dressed now.\""; + next; + camera "Dresser#tutorial"; + mapmask getmask() | 16; + mes "\"In that dresser there are some clothes you can wear.\""; + mes "\"To interact with things in your environment or talk to NPCs you can either click on it or press N to focus and T to talk/activate.\""; + next; + camera; + mes "\"Now get the clothes out of the dresser.\""; + QL_BEGIN = 2; + close; +} + +029-2,29,23,0 script Dresser#tutorial NPC400,{ + @npc_distance = 2; + @distance_handler = 1; + callfunc "PCtoNPCRange"; + if (@npc_check) + goto L_closeDis; + if (QL_BEGIN > 2) goto L_Empty; + if (QL_BEGIN == 2) goto L_Shirt; + goto L_Walk; + +L_Walk: + mes "[Sorfina]"; + mes "\"Thats not what I said to do. Please don't skip ahead.\""; + close; + +L_Shirt: + mapmask getmask(); + mes "You take a simple Cotton Shirt and some very worn-out Ragged Shorts out of the dresser."; + getitem "CottonShirt", 1; + getitem "RaggedShorts", 1; + mes "[Sorfina]"; + mes "\"Great! Now you can equip it.\""; + mes "\"You can open your inventory by pressing F3 or clicking on the 'Inventory' button in the bar at the upper right corner.\""; + next; + mes "\"After we finish talking, click on the clothes and press the equip button.\""; + QL_BEGIN = 3; + close; + +L_Empty: + mes "The dresser is empty."; + close; + +L_closeDis: + mes "You cannot reach that far."; + close; +} + +029-2,44,31,0 script #DoorOutTut1 NPC45,0,0,{ + if (QL_BEGIN < 4) + goto L_Block; + mapmask getmask(); + warp "029-2", 112, 85; + end; + +L_Block: + message strcharinfo(0), "Sorfina : ##BWait a moment! ##bYou're not ready to leave."; + // FIXME: this should be changed to npctalk with strcharinfo(0) once we increase the view area + end; +} +029-2,23,24,0 script #GameRules1 NPC32767,0,1,{ + if (TUT_var > 0) + end; + mes "[Server/Client Notice]"; + mes "The explanations in this tutorial are based on the official client, Manaplus."; + mes "If you're using another client, settings and controls may be different."; + callfunc "GameRules"; + close; +} +029-2,21,24,0 script #GameRules2 NPC32767,0,1,{ + if (TUT_var > 0) + end; + mes "[Server/Client Notice]"; + mes "The explanations in this tutorial are based on the official client, Manaplus."; + mes "If you're using another client, settings and controls may be different."; + callfunc "GameRules"; + close; +} +029-2,22,26,0 script #GameRules3 NPC32767,1,0,{ + if (TUT_var == 0) + goto L_KnockBack; + end; + +L_KnockBack: + message strcharinfo(0), "Server : ##BPlease Accept the Game rules"; + warp "029-2", 22, 24; + end; +} +029-2,24,24,0 script #GameRules4 NPC32767,0,1,{ + if (TUT_var == 0) + goto L_KnockBack; + end; + +L_KnockBack: + message strcharinfo(0), "Server : ##BPlease Accept the Game rules"; + warp "029-2", 22, 24; + end; +} diff --git a/npc/029-2/stat_reset.txt b/npc/029-2/stat_reset.txt new file mode 100755 index 00000000..75fe3e66 --- /dev/null +++ b/npc/029-2/stat_reset.txt @@ -0,0 +1,49 @@ + +029-2,98,92,0 script Jessie NPC159,{ + callfunc "PCtoNPCRange"; + if(@npc_check) end; + + if (BaseLevel >= 10) + goto L_Sorry; + + mes "[Jessie]"; + mes "\"I know a spell that will"; + mes "reset status points on the youngings."; + mes ""; + mes "I can also change their appearance.\""; + next; + menu + "Reset my stats",L_Reset, + "Change my appearance", L_Appearance, + "Forget about it",L_Pass; + +L_Appearance: + callfunc "Barber"; + goto L_Pass; + +L_Reset: + resetstatus; + + mes "[Jessie]"; + mes "\"There you are."; + mes ""; + mes "Good as new!\""; + goto L_close; + +L_Pass: + mes "[Jessie]"; + mes "\"Very well then, see you.\""; + goto L_close; + +L_Sorry: + mes "[Jessie]"; + mes "\"My spell only works on the very young, sorry.\""; + next; + mes "\"You can try Mailvox in the Tulimshar Bazaar or Wyara in the Potion Shop in Hurnscald.\""; + menu + "Change my appearance", L_Appearance, + "Bye", L_close; + +L_close: + close; +} diff --git a/npc/029-2/tanisha.txt b/npc/029-2/tanisha.txt new file mode 100755 index 00000000..4e5abe42 --- /dev/null +++ b/npc/029-2/tanisha.txt @@ -0,0 +1,286 @@ + +029-2,110,88,0 script Tanisha NPC114,{ + callfunc "PCtoNPCRange"; + if(@npc_check) end; + + if (isin("029-2", 98, 84, 106, 89)) + goto L_Fighting; + + if (QL_BEGIN >= 8) goto L_Tut_Done; + if (QL_BEGIN == 7) goto L_Stats; + if (QL_BEGIN == 6) goto L_Fail; + if (QL_BEGIN == 5) goto L_Maggots; + + mes "[Tanisha]"; + mes "\"Hey! You're up again!\""; + emotion EMOTE_HAPPY, strcharinfo(0); + mes "\"Are you feeling better?\""; + menu + "Yes, thank you.",L_Next, + "Yeah, but everything is gone. My stuff and memories..",L_Next; + +L_Next: + mes "[Tanisha]"; + mes "\"I'm glad you're feeling better. It was really bad luck what happened to you."; + mes "Hey, I have an idea.\""; + QL_BEGIN = 5; + goto L_Maggots; + +L_Maggots: + mes "[Tanisha]"; + mes "\"There are some maggots eating the goods and I'm supposed to get rid of them."; + mes "But they're so yucky!\""; + mes "\"If you kill them, I'll give you my knife."; + mes "What do you say?\""; + menu + "I guess it's the least I can do.",L_Next1; + +L_Next1: + mes "[Tanisha]"; + mes "\"Wonderful."; + // since the check happens here, it is actually possible to have + // more than $@Maggot_MaxHunters in the area at one time + // but that's not a BIG problem + if (getareausers("029-2", 98, 84, 106, 89) >= $@Maggot_MaxHunters) + goto L_Crowded; + next; + goto L_Fight_Again; + +L_Fight_Again: + mes "[Tanisha]"; + mes "\"Ok, listen what to do."; + mes "Equip a weapon and kill the maggots.\""; + mes "\"Press [###keyTargetMonster;] to focus on a monster. With [###keyTargetAttack;] you can focus and start attacking the same time."; + mes "But it also works to click on the monster with your mouse.\""; + next; + mes "\"If you press the [###keyTarget;], you can abort your attack.\""; + next; + mes "\"Maggots aren't aggressive, so they won't harm you until you attack them first. Take them out one by one.\""; + next; + mes "\"Sometimes dead monsters leave some useful things. You can pick them up by pressing [###keyPickup;] or clicking on the items with your mouse.\""; + close2; + // The getitem must be in the same place as set QL_BEGIN, 2; + // since it was moved to after L_Fight_Again, add it conditionally + if (QL_BEGIN == 5) + goto L_GetFightItems; + goto L_ContinueFight; + +L_GetFightItems: + QL_BEGIN = 6; + getitem "Knife", 1; + getitem "SlingShot", 1; + getitem "SlingBullet", 500; + goto L_ContinueFight; + +L_ContinueFight: + QL_BEGIN = 6; + @Maggot_Kills = 0; + @time = 0; + if (getareausers("029-2", 98, 84, 106, 89) == 0) + initnpctimer; + warp "029-2", 101, 87; + goto L_Summon; + +L_Summon: + areamonster "029-2", 98, 84, 106, 89, "", 1002, 1, "Tanisha::OnMaggotDeath"; + end; + +L_Stats: + mes "[Tanisha]"; + mes "\"That was great! Like a professional exterminator!\""; + mes "\"And it seems you became stronger and more experienced."; + mes "That means you got some status points which you can use to increase your abilities.\""; + mes "\"Press [###keyWindowStatus;] or click the Status button in the bar at the upper right to see your status window. There you can distribute your points on six different properties.\""; + mapmask getmask() | 2; + next; + goto L_StatsRe; + +L_StatsRe: + mes "\"Strength makes you hit harder and you can carry more weight.\""; + mes "\"Agility increases your attack speed and your ability to dodge attacks.\""; + mes "\"Vitality gives you more hit points and more defense against physical attacks.\""; + mes "\"Intelligence is useful for magic attack and defense."; + mes "But as long as you don't know any magic, you shouldn't use your points on this.\""; + mes "\"Dexterity is needed to hit monsters. It's also very important for the damage if you use a ranged weapon.\""; + mes "\"Luck gives you the chance to do critical hits and lowers the chance to receive a critical hit from your opponent.\""; + next; + mes "\"Think about how you want to play before assigning the points.\""; + mes "\"My Uncle sitting at the counter knows a spell to help the younglings reset their stats.\""; + mes "\"He can also change your hair style and color, along with your gender.\""; + mes "\"Furthermore, he knows of mages with even more powerful reset spells for your stats.\""; + next; + if (QL_BEGIN == 7) + goto L_Money; + goto L_Advice; + +L_Money: + next; + mes "[Tanisha]"; + mes "\"Hey, you are so smart taking out all that yucky maggots for me."; + mes "You can have my pocket money. Here.\""; + QL_BEGIN = 8; + Zeny = Zeny + 5; + next; + goto L_Advice; + +L_Advice: + mes "\"When you go to Hurnscald, you should see Bernard. He can make a delicious soup!"; + mes "Good luck!\""; + emotion EMOTE_HAPPY, strcharinfo(0); + goto L_close; + +L_Explain: + menu + "... how to fight?",L_Fight, + "... monsters?",L_Mob, + "... status points?",L_StatsRe, + "... what to do in Hurnscald?",L_Advice, + "... nevermind.",L_close; + +L_Fight: + mes "[Tanisha]"; + mes "\"Press [###keyTargetMonster;] to focus on a monster. With [###keyTargetAttack;] you can focus and attack."; + mes "But it also works to click on the monster with your mouse.\""; + next; + mes "\"If you press the [###keyTarget;] button, you can abort your attack.\""; + next; + mes "\"Sometimes dead monsters leave some useful things. You can pick them up with pressing [###keyPickup;] or clicking on the items with your mouse.\""; + next; + mes "\"If you feel exhausted from battle you can sit down by pressing [###keyBeingSit;] to recover faster.\""; + goto L_close; + +L_Mob: + mes "[Tanisha]"; + mes "\"I don't know much about monsters, I'm just a little girl. But I know a few things."; + mes "There are several types of monsters...Aggressive, Neutral, and Assistants.\""; + next; + mes "\"Aggressive monsters will attack you as soon as they see you.\""; + next; + mes "\"Neutral monsters are peaceful until they get attacked.\""; + next; + mes "\"Assistants are monsters who help each other.\""; + goto L_close; + +L_Tut_Done: + mes "[Tanisha]"; + mes "\"These yucky maggots! They're eating our goods!"; + mes "No matter how many of them you kill, they always come back.\""; + mes "She sighs."; + mes "[Tanisha]"; + mes "\"Do you have any questions?\""; + menu + "Yes, could you explain about...", L_Explain, + "No, thanks.", L_close; + +L_Crowded: + mes "[Tanisha]"; + mes "\"That's great! But..."; + mes "it seems a little crowded in there.\""; + mes "\"Let's wait a short while.\""; + goto L_close; + +L_Sleep: + warp "029-2", 101, 87; + mes "[Tanisha]"; + mes "\"What are you doing in there?"; + mes "Sleeping?"; + mes "Come back when you're serious.\""; + @Maggot_Kills = 0; + @time = 0; + close2; + if (getareausers("029-2", 98, 84, 106, 89) == 0) + goto L_CleanUp; + end; + +L_Fail: + mes "Tanisha seems to be trying hard to supress laughter."; + mes "[Tanisha]"; + mes "\"The maggots defeated you.\""; + mes "She bursts out with laughter."; + mes "\"Oops, I'm sorry. It's just too funny."; + mes "Do you want to try it again?\""; + menu + "Sure!", L_Next2, + "No, I need a rest.", L_close; + +L_Next2: + if (getareausers("029-2", 98, 84, 106, 89) >= $@Maggot_MaxHunters) + goto L_Crowded; + goto L_Fight_Again; + +L_Fighting: + npctalk strnpcinfo(0), "##3I believe in you!", strcharinfo(0); + end; + +OnTimer1000: + setnpctimer 0; + if (getareausers("029-2", 98, 84, 106, 89) == 0) + goto L_CleanUp; + // This is needed because multiple players can be in the area at once + areatimer 0, "029-2", 98, 84, 106, 89, 0, "Tanisha::OnTick"; + end; + +L_CleanUp: + killmonster "029-2", "Tanisha::OnMaggotDeath"; + $@Maggot_Hunters = 0; + stopnpctimer; + areamonster "029-2", 98, 84, 106, 89, "", 1002, 1, "Tanisha::OnMaggotDeath"; + end; + +OnTick: + @time = @time + 1; + if (@time > 300) + goto L_Sleep; + if (ispcdead()) + end; + if (Hp > 20) + end; + heal MaxHp, 0; + npctalk strnpcinfo(0), "##3You're doing good!", strcharinfo(0); + end; + +OnMaggotDeath: + if (@Maggot_Kills == 1) + npctalk strnpcinfo(0), "##3Aaahhhh... another one! It will crawl up your legs!", strcharinfo(0); + if (@Maggot_Kills == 2) + npctalk strnpcinfo(0), "##3Ohh... Irrhk... Eeeeww... They just appear from nowhere!", strcharinfo(0); + if (@Maggot_Kills == 3) + npctalk strnpcinfo(0), "##3Yuck... I think I am getting sick.", strcharinfo(0); + if (isin("029-2", 98, 84, 106, 89)) + @Maggot_Kills = @Maggot_Kills + 1; + if (@Maggot_Kills < 5) + goto L_Summon; + // else, complete + warp "029-2", 110, 88; + QL_BEGIN = 7; + @Maggot_Kills = 0; + @time = 0; + if (getareausers("029-2", 98, 84, 106, 89) == 0) + goto L_CleanUp; + end; + +L_close: + close; + +OnInit: + $@Maggot_MaxHunters = 4; + areamonster "029-2", 98, 84, 106, 89, "", 1002, 1, "Tanisha::OnMaggotDeath"; + end; +} +029-2,114,93,0 script #DoorOutTut2 NPC45,0,0,{ + end; + +OnTouch: + if (QL_BEGIN >= 8) + goto L_Warp; + goto L_Block; + +L_Warp: + mapmask getmask(); + warp "029-1", 32, 100; + end; + +L_Block: + npctalk "Tanisha", "##3##BPlease come here. ##bI'd like some help!", strcharinfo(0); + end; +} diff --git a/npc/029-2/two_arms.txt b/npc/029-2/two_arms.txt new file mode 100755 index 00000000..48dec1cb --- /dev/null +++ b/npc/029-2/two_arms.txt @@ -0,0 +1,3 @@ + +029-2,99,25,0 shop Rosen NPC311,903:50,904:0,530:8000,1199:2,529:2 +029-2,112,24,0 shop Toichi NPC377,1201:25,522:50,521:500,523:1000,603:1000 -- cgit v1.2.3-60-g2f50