summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--db/quest_db.conf3
-rw-r--r--db/re/item_db.conf8
-rw-r--r--db/re/mob_db.conf122
-rw-r--r--npc/001-2-34/doors.txt54
-rw-r--r--npc/001-2-36/_import.txt2
-rw-r--r--npc/001-2-36/hector.txt502
-rw-r--r--npc/001-2-36/training_room_npc.txt165
-rw-r--r--npc/commands/debug-quest.txt3
-rw-r--r--npc/functions/quest-debug/034-ArtisQuests_TrainingLegion.txt28
-rw-r--r--npc/scripts.conf2
10 files changed, 700 insertions, 189 deletions
diff --git a/db/quest_db.conf b/db/quest_db.conf
index 9d87df84..2353115e 100644
--- a/db/quest_db.conf
+++ b/db/quest_db.conf
@@ -162,6 +162,9 @@ quest_db: (
Name: "Artis_Legion_Progress"
},
{
+ Id: 34 Name: "ArtisQuests_TrainingLegion"
+ },
+{
Id: 36
Name: "HurnscaldQuests_Hinnak"
},
diff --git a/db/re/item_db.conf b/db/re/item_db.conf
index 96293603..35d97ec1 100644
--- a/db/re/item_db.conf
+++ b/db/re/item_db.conf
@@ -4124,7 +4124,7 @@ item_db: (
WeaponLv: 1
EquipLv: 5
Refine: false
- Subtype: "W_DAGGER"
+ Subtype: "W_1HSWORD"
BindOnEquip: false
Delay: 0
Sprite: 0
@@ -4146,7 +4146,7 @@ item_db: (
WeaponLv: 1
EquipLv: 5
Refine: false
- Subtype: "W_DAGGER"
+ Subtype: "W_1HSWORD"
BindOnEquip: false
Delay: 0
Sprite: 0
@@ -4168,7 +4168,7 @@ item_db: (
WeaponLv: 1
EquipLv: 15
Refine: false
- Subtype: "W_DAGGER"
+ Subtype: "W_1HSWORD"
BindOnEquip: false
Delay: 0
Sprite: 0
@@ -4332,7 +4332,7 @@ item_db: (
WeaponLv: 1
EquipLv: 10
Refine: false
- Subtype: "W_DAGGER"
+ Subtype: "W_STAFF"
BindOnEquip: false
Delay: 0
Sprite: 0
diff --git a/db/re/mob_db.conf b/db/re/mob_db.conf
index 9b70f689..90b3623f 100644
--- a/db/re/mob_db.conf
+++ b/db/re/mob_db.conf
@@ -2974,4 +2974,126 @@ mob_db: (
Moss: 400
}
},
+{
+ Id: 1107
+ SpriteName: "Dummy2"
+ Name: "Dummy"
+ Lv: 1
+ Hp: 8
+ Sp: 0
+ Exp: 1
+ JExp: 0
+ AttackRange: 1
+ Attack: [1, 1]
+ Def: 1
+ Mdef: 1
+ Stats: {
+ Str: 1
+ Agi: 1
+ Vit: 1
+ Int: 1
+ Dex: 1
+ Luk: 1
+ }
+ ViewRange: 1
+ ChaseRange: 12
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ MoveSpeed: 1000
+ AttackDelay: 800
+ AttackMotion: 672
+ DamageMotion: 480
+ MvpExp: 0
+ SkillAttacks: {
+ SM_BASH: 10000
+ }
+ WeaponAttacks: {
+ NoWeapon: 0
+ Daggers: 0
+ 1HSwords: 0
+ 2HSwords: 0
+ 1HSpears: 0
+ 2HSpears: 0
+ 1HAxes: 0
+ 2HAxes: 0
+ Maces: 0
+ 2HMaces: 0
+ Staves: 0
+ Bows: 0
+ Knuckles: 0
+ Instruments: 0
+ Whips: 0
+ Books: 0
+ Katars: 0
+ Revolvers: 0
+ Rifles: 0
+ GatlingGuns: 0
+ Shotguns: 0
+ GrenadeLaunchers: 0
+ FuumaShurikens: 0
+ }
+},
+{
+ Id: 1108
+ SpriteName: "Dummy3"
+ Name: "Dummy"
+ Lv: 1
+ Hp: 3
+ Sp: 0
+ Exp: 1
+ JExp: 0
+ AttackRange: 1
+ Attack: [1, 1]
+ Def: 100
+ Mdef: 1
+ Stats: {
+ Str: 1
+ Agi: 1
+ Vit: 1
+ Int: 1
+ Dex: 1
+ Luk: 1
+ }
+ ViewRange: 1
+ ChaseRange: 12
+ Size: 1
+ Race: 3
+ Element: (2, 1)
+ Mode: {
+ Plant: true
+ }
+ MoveSpeed: 1000
+ AttackDelay: 800
+ AttackMotion: 672
+ DamageMotion: 480
+ MvpExp: 0
+ SkillAttacks: {
+ SM_BASH: 0
+ }
+ WeaponAttacks: {
+ NoWeapon: 0
+ Daggers: 0
+ 1HSwords: 0
+ 2HSwords: 0
+ 1HSpears: 0
+ 2HSpears: 0
+ 1HAxes: 0
+ 2HAxes: 0
+ Maces: 0
+ 2HMaces: 0
+ Staves: 0
+ Bows: 10000
+ Knuckles: 0
+ Instruments: 0
+ Whips: 0
+ Katars: 0
+ Revolvers: 0
+ Rifles: 0
+ GatlingGuns: 0
+ Shotguns: 0
+ GrenadeLaunchers: 0
+ FuumaShurikens: 0
+ }
+},
)
diff --git a/npc/001-2-34/doors.txt b/npc/001-2-34/doors.txt
index ca513945..d53dfc82 100644
--- a/npc/001-2-34/doors.txt
+++ b/npc/001-2-34/doors.txt
@@ -5,25 +5,45 @@
// Doors NPCs.
001-2-34,23,29,0 script ToTrainingRoom#001-2-34 NPC_HIDDEN,0,0,{
-
OnTouch:
- if ((getmapusers($@MAP_NAME$) == 0) && ($@FightingIsActive > 0))
- {
- set $@FightingIsActive, 0;
- killmonsterall "001-2-36";
- }
- if (mobcount("001-2-36","all") > 0 && $@FightingIsActive > 0)
- {
- narrator
- l("You hear some sound behind the door."),
- l("Somebody is probably training, better wait for him to finish.");
- }
- else
- {
- warp "001-2-36", 36, 30;
+ function doorBlock {
+ .@trainingMap$ = "001-2-36"; // map to create
+ .@CharID = getcharid(CHAR_ID_CHAR); // character ID used for set the name of instance
+
+ // check if a valid instance exists and warp
+ if (.instid >= 0 && isinstance(.instid))
+ {
+ warp(.@CharID+.@trainingMap$, 36, 30);
+ end;
+ }
+
+ // else create new instance
+ .instid = instance_create("training@instance", getcharid(CHAR_ID_ACCOUNT), IOT_CHAR);
+ if (.instid < 0)
+ {
+ debugmes "Error: creating instance";
+ end;
+ }
+
+ .@instanceMapName$ = instance_attachmap(.@trainingMap$, .instid, 0, .@CharID+.@trainingMap$ );
+ if (.@instanceMapName$ == "")
+ {
+ debugmes "Error: instance attach map error";
+ end;
+ }
+
+ instance_set_timeout(1000000, 1000000, .instid);
+ instance_init(.instid);
+
+ // respawn the player in front of door of training room if the player relog inside the instance
+ // do not effect the savepoint
+ setmapflagnosave(.@instanceMapName$, .map$, 24, 29);
+
+ warp(.@CharID+.@trainingMap$, 36, 30);
+ end;
}
- closeclientdialog;
- close;
+ doorBlock;
+ end;
}
diff --git a/npc/001-2-36/_import.txt b/npc/001-2-36/_import.txt
index 222e5a7f..57397efd 100644
--- a/npc/001-2-36/_import.txt
+++ b/npc/001-2-36/_import.txt
@@ -1,5 +1,5 @@
// Map 001-2-36: unnamed
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/001-2-36/_warps.txt",
+"npc/001-2-36/hector.txt",
"npc/001-2-36/mapflags.txt",
-"npc/001-2-36/training_room_npc.txt",
diff --git a/npc/001-2-36/hector.txt b/npc/001-2-36/hector.txt
new file mode 100644
index 00000000..b5551d1e
--- /dev/null
+++ b/npc/001-2-36/hector.txt
@@ -0,0 +1,502 @@
+// TrainingRoom
+// Author:
+// jak1
+// omatt
+// toams
+// Story:
+// Reid
+// Teru
+// Spellchecking & Dialogs:
+// Reid
+// toams
+// Variable:
+// .fightingActive
+// 0 = no fight active
+// 1 = swordfight active
+// 2 = bowfight active
+// 3 = skillfight
+// ArtisQuests_TrainingLegion
+// 0 not started at all
+// 1 swordTraining finished
+// 2 bowTraining finished
+// 3 bow and sword finished
+// 4 end of training
+// .mobID is related to quest state
+// 1 1021 dummy for sword wave
+// 2 1108 dummy for bow wave
+// 3 1107 dummy for skill wave
+//
+// TODO adding rand messages like "try hit it harder..." for wave's
+// TODO in first, second, and third training, input some tips about related weapon given.
+// TODO replace basicControl with GameRules()/@tutorial see !166
+
+
+001-2-36,32,36,0 script Hector#001-2-36 NPC_LUCAS,{
+
+ 'instanceID = instance_id();
+ 'npcName$ = strnpcinfo(NPC_NAME_UNIQUE); // required for call the label in the npc of this one instance
+
+ function basicControl {
+
+ // same text of Ian npc of tmw
+ // feel free to adapt text
+ // a case for skill need to be add
+ do
+ {
+ clear;
+ speech(3,
+ l("Would you like to know about something?"));
+
+ select(
+ l("Fighting."),
+ l("Items."),
+ l("Monsters."),
+ l("Commands."),
+ l("Attributes."),
+ l("Quick Keys."),
+ l("Laws."),
+ l("I know everything!"));
+
+ switch (@menu)
+ {
+ case 1:
+ speech(7,
+ l("People live in this world by living off of monsters."),
+ l("You can fight monsters and even players by hitting the [CTRL] key, or left mouse click."),
+ l("If you get tired of pressing the key too much, you can also type [SHIFT]+[CTRL]."),
+ l("This will make your character attack continuously for the time you are inactive."));
+ break;
+
+ case 2:
+ speech(7,
+ l("There are three types of items."),
+ l("They can be Consumables, Equipment or Miscellaneous."),
+ l("Consumable items such as Potions, can be used only once. After use, they will disappear from your inventory."),
+ l("Equipment items like Armors, Weapons, Accessories can be equipped for fashionable purposes or to raise your status."),
+ l("Miscellaneous items such as maggot slime, are used in creating other items, or just to trade and sell."));
+ break;
+
+ case 3:
+ speech(7,
+ l("In every world, there are beasts. Monsters can be found almost anywhere!~"),
+ l("To fight them, please read [Fighting] if you do not know how."),
+ l("There a several types of monsters, Aggressive, Neutral, and Assistants."),
+ l("Aggressive monsters know that they are always in danger so therefore they always keep their guard up, making them attack anybody in sight."),
+ l("Neutral monsters tend to just lounge around until attacked. They will leave everything alone unless they are threatened."),
+ l("Assistants are monsters who help each other. You should always check how many are around you before attacking a single one!"));
+ break;
+
+ case 4:
+ speech(7,
+ l("/clear clears the text box."),
+ l("/help displays the client commands (ones starting with a /) in the chat box."),
+ l("/whisper [name] allows you to message someone privately."),
+ l("/who displays the current number of online users."),
+ l("/where displays the current map's name."));
+ break;
+
+ case 5:
+ // tips about stats is about tmw, then pre renowal, then not good for here who are renewal
+ // but since i don't play of renewal, i can't change them for better fit .__.
+ speech(7,
+ l("People vary greatly by how much strength, agility, dexterity, intelligence, vitality, and luck they have."),
+ l("Strength helps you carry items, and it also allows you to hit harder – but it is not too helpful if you focus on missile weapons."),
+ l("More agility allows you to attack faster, and to dodge attacks more easily."),
+ l("Your dexterity determines how likely you are to hit a monster, and how effective you are with missile weapons."),
+ l("Vitality determines how resistant to injuries you are, and how much damage you can take before you die."),
+ l("Intelligence is useful for alchemy and magic, but there are few opportunities for either at the moment."),
+ l("Luck determines many small things, including the likelihood of both recieving and dealing critical hits."),
+ l("I recommend that you practice your dexterity, since some of the more dangerous monsters are very hard to hit otherwise."),
+ l("Don't bother trying to work on your luck, and your intelligence is probably not something anyone cares about either."));
+ break;
+
+ case 6:
+ speech(7,
+ l("There are many key combinations, press F1 for a short list of them!"));
+ break;
+
+ case 7:
+ narrator(7,
+ l("There is a paper with some rules written on it."),
+ l("1. ##BDo not bot##b, this means you are not allowed to perform any AFK (away from keyboard) activity, apart from standing idle."),
+ l("2. ##BDo not use offensive/rude language##b in the chats or in your character(s) name(s)."),
+ l("3. ##BDo not spam/flood other players.##b This includes chat spam and spam by trade requests."),
+ l("4. ##BSpeak only English in public areas.##b You can speak whatever language you want through whispers or whenever everyone in the area can speak said language."),
+ l("5. ##BDo not beg others##b for money, items or favours of any kind. If you want to ask for something, do it politely and only once. Try not to annoy other players."),
+ l("6. ##BFollow the [@@http://wiki.evolonline.org/rules/esc|ESC@@]##b (Evol Social Convention)."),
+ l("7. ##BDo not multibox.##b You are not allowed to engage in combat while controlling more than one character at a time."));
+ break;
+
+ default: return 1;
+ }
+ } while (1);
+ }
+
+ function waveEnded {
+
+ if (.fightingActive == 1 && getq(.quest_training) == 2)
+ {
+ npctalk3(l("Well done, you aren't even bleeding that much!"));
+ setq(.quest_training, 3);
+ }
+ if (.fightingActive == 1 && getq(.quest_training) == 0)
+ {
+ npctalk3(l("Well done, you aren't even bleeding that much!"));
+ setq(.quest_training, 1);
+ }
+ if (.fightingActive == 2 && getq(.quest_training) == 0)
+ {
+ npctalk3(l("Great! Don't mind those scorched hairs, they will grow back."));
+ setq(.quest_training, 2);
+ }
+ if (.fightingActive == 2 && getq(.quest_training) == 1)
+ {
+ npctalk3(l("Great! Don't mind those scorched hairs, they will grow back."));
+ setq(.quest_training, 3);
+ }
+ if (.fightingActive == 3)
+ {
+ npctalk3(l("Congratulations, you have finished your training."));
+ sleep2(2000);
+ npctalk3(l("The only way to improve yourself is practice, practice and some more practice."));
+ setq(.quest_training, 4);
+ }
+
+ .currentWaveLevel = 1;
+ .fightingActive = 0;
+ 'mobDead = 0;
+ end;
+ }
+
+ function mobSpawn {
+
+ if (.fightingActive != 0)
+ {
+ if (.currentWaveLevel == .maxWaves)
+ {
+ npctalk3(l("Last Wave!"));
+ }
+ else
+ {
+ npctalk3(l("Wave " + .currentWaveLevel + "!"));
+ }
+
+ areamonster('map$, .mobCoordinate[0], .mobCoordinate[1], .mobCoordinate[2], .mobCoordinate[3],
+ /* map x1 y1 x2 y2 */
+ .mobName$, .mobID[.fightingActive], .currentWaveLevel, 'npcName$+"::OnTrainingMobDead");
+ /* mob display mob id amount label */
+ }
+
+ end;
+ }
+
+ function trainingEnd {
+ sleep2(2000);
+ npctalk3(l("This training is over!"));
+ .fightingActive = 0;
+ .currentWaveLevel = 1;
+ killmonster('map$, "All");
+ end;
+ }
+
+
+ function mobKilled {
+
+ 'mobDead = 0; // reset the count
+
+ if (.currentWaveLevel == .maxWaves )
+ {
+ waveEnded;
+ }
+
+ // check for sword in swordtraining
+ if (getiteminfo(getequipid(EQI_HAND_R), ITEMINFO_SUBTYPE) != W_1HSWORD && .fightingActive == 1)
+ {
+ npctalk3(l("Hey! Use your sword!"));
+ trainingEnd;
+ }
+
+ // check for bow in bowtraining
+ if (getiteminfo(getequipid(EQI_HAND_R), ITEMINFO_SUBTYPE) != W_BOW && .fightingActive == 2)
+ {
+ npctalk3(l("Hey! Use your bow!"));
+ trainingEnd;
+ }
+
+ // no weapons may be equiped when training skill
+ if (getequipid(EQI_HAND_R) != -1 && .fightingActive == 3)
+ {
+ npctalk3(l("Hey! No weapons allowed this round!"));
+ trainingEnd;
+ }
+
+ // check if wave of skill, and if in first wave, then after kill the first dummy, the player receive explain and mana potion
+ if (.fightingActive == 3 && .currentWaveLevel == 1)
+ {
+ setcamnpc(strnpcinfo(NPC_NAME_UNIQUE)); // focus the npc when he talk to the player
+ speech(4,
+ l("This skill consume some spell points."),
+ l("And for regain spell point you have to wait."),
+ l("The speed of regen depend of your intelligence (i don't suspect you are stupid...)."),
+ l("If you sit, you can regain your spell points more faster."),
+ l("Or you can drink a mana potion for restore some spell point when you need."),
+ l("And, i'm a good guy, then i give you few of mine for free, take !"));
+ closedialog;
+ getitem(.mana_potion, 1);
+ sleep2(3000);
+ }
+
+ .currentWaveLevel++; // next wave after killed dummy
+
+ mobSpawn;
+ }
+
+ function trainingActive {
+
+ speech(6,
+ l("Don't be shy and attack the dummies!"));
+
+ }
+
+ function swordTraining {
+ speech(6,
+ l("So you chose the sword for this training, make sure to equip it or we can't start."));
+ if (getiteminfo(getequipid(EQI_HAND_R), ITEMINFO_SUBTYPE) != W_1HSWORD)
+ {
+ speech(6,
+ l("I told you to equip a sword! Come back later with a sword in your hands."));
+ end;
+ }
+
+ speech(10,
+ l("It's time to use this sword, I will place some dummies in the fighting arena. @@ waves of dummies, kill them to finish this training.", .maxWaves),
+ l("Ready?"));
+
+ askyesno;
+ if (@menu == ASK_NO)
+ {
+ closedialog;
+ end;
+ }
+ .fightingActive = 1;
+ }
+
+ function bowTraining {
+ speech(6,
+ l("So you chose the bow for this training, make sure to equip it or we can't start."));
+
+ if (getiteminfo(getequipid(EQI_HAND_R), ITEMINFO_SUBTYPE) != W_BOW)
+ {
+ speech(6,
+ l("I told you to equip a bow! Come back later with a bow in your hands."));
+ end;
+ }
+
+ speech(10,
+ l("Prepare yourself for fighting the dummies!"),
+ l("I've set these dummies on fire. Don't get to close to the dummies or the fire will hurt you."),
+ l("The range of your bow makes it possible to kill them from a distance."),
+ l("Ready?"));
+
+ askyesno;
+ if (@menu == ASK_NO)
+ {
+ closedialog;
+ end;
+ }
+ .fightingActive = 2;
+ }
+
+ function skillTraining {
+
+ // give SM_BASH skill
+ skill(.skill_name, 1, 0);
+
+ speech(10,
+ l("For this skill no weapons are used, so make sure to unequip them."),
+ l("TODO: explain how skills work"),
+ l("@@ waves of dummies, you know how that ends.", .maxWaves),
+ l("Ready?"));
+
+ askyesno;
+ if (@menu == ASK_NO)
+ {
+ closedialog;
+ end;
+ }
+ .fightingActive = 3;
+ }
+
+ function checkCombatZone {
+
+ getmapxy('map$, @x, @y, 0);
+ if (@x < 24 || @x > 32 || @y < 33 || @y > 43)
+ return 1;
+ return 0;
+ }
+
+ function trainingStart {
+
+ if (checkCombatZone())
+ {
+ npctalk3(l("Please enter the combat zone on the left."));
+ closedialog;
+ end;
+ }
+ if (.fightingActive == 0)
+ {
+ switch (getq(.quest_training))
+ {
+ case 0: speech(3,
+ l("Which weapon do you want to train? Bow or sword?"));
+
+ switch (select(l("Sword."),
+ l("Bow."),
+ l("I don't feel like training today, see you later.")))
+ {
+ case 1: swordTraining; break;
+ case 2: bowTraining; break;
+ case 3: closedialog; end;
+ }
+ break;
+ case 1: speech(3,
+ l("You have finished the sword training. Do you want to start train the bow?"));
+
+ switch (select(l("Yes."),
+ l("I don't feel like training today, see you later.")))
+ {
+ case 1: bowTraining; break;
+ case 2: closedialog; end;
+ }
+ break;
+ case 2: speech(3,
+ l("You have finished the bow training. Do you want to start train the sword?"));
+
+ switch (select(l("Yes."),
+ l("I don't feel like training today, see you later.")))
+ {
+ case 1: swordTraining; break;
+ case 2: closedialog; end;
+ }
+ break;
+ case 3: speech(3,
+ l("Congratulations, you have mastered both the bow and the sword. The only thing left to teach you is the bashing skill."));
+
+ switch (select(l("Yes."),
+ l("I don't feel like training today, see you later.")))
+ {
+ case 1: skillTraining; break;
+ case 2: end;
+ }
+ break;
+ }
+ closedialog;
+
+ npctalk3(l("Let's begin"));
+
+ mobSpawn;
+ }
+ }
+
+ function firstCheck {
+
+ // here different messages, when the player are in fight and talk to npc, message is realted to the state of quest
+ if (.fightingActive != 0)
+ {
+ switch (.fightingActive)
+ {
+ case 1: npctalk3(l("Attack with your sword and kill them!")); end;
+ case 2: npctalk3(l("Use your bow and kill them!")); end;
+ case 3: npctalk3(l("Hey lazy bum! Attack the dummies")); end;
+ default: break;
+ }
+ }
+
+ // start menu
+ switch (getq(.quest_training))
+ {
+ case 0: speech(5,
+ l(.mockingGreeting$[rand(getarraysize(.mockingGreeting$))]),
+ l("Do you want some training? To be honest, it looks like you can use some..."));
+ break;
+ case 4: speech(5,
+ l("Your training is finished, I teached you all I know."),
+ l("So now go and explore the world!"));
+ closedialog;
+ end;
+ default: speech(5,
+ l("Hello again, ready to continue your lessions?")); break;
+ }
+
+ do
+ {
+ selectd(
+ l("Yes, train me!"),
+ l("Hmm... But what is exactly this training?"),
+ l("I'm a bit lost in this game, can you first give me few tips?"),
+ l("Not right now, it looks like I got other stuff to do."));
+
+ switch (@menu)
+ {
+ case 1: trainingStart; break;
+ case 2:
+ // here text who explain what is the training of this npc
+ speech(15,
+ l("In this training, my goal is to learn you how to be a skilled warrior, who can use a sword, a bow and a skill."),
+ l("For this, you need a sword and a bow."),
+ l("After you gathered your weapons, I will teach you how to use them."));
+ break;
+ case 3: basicControl; break;
+ case 4: closedialog; end;
+
+ default: closedialog; end;
+ }
+ } while (1);
+ }
+
+ // Here called function who start dialog
+ firstCheck;
+ closedialog;
+ end;
+
+OnTrainingMobDead:
+ // the amount of mob spawned depend of currentwave
+ if (++'mobDead == .currentWaveLevel)
+ {
+ mobKilled;
+ }
+ end;
+
+OnLeaveCombatZone:
+ if (.fightingActive > 0)
+ {
+ npctalk3(l("You left the combat zone!"));
+ trainingEnd;
+ }
+ end;
+
+OnInit:
+ .mana_potion = Croconut; // here need to change the potion
+ .skill_name = SM_BASH;
+ .quest_training = ArtisQuests_TrainingLegion;
+ .quest_debug = .quest_training;
+ .maxWaves = 3;
+ .mobName$ = "Dummy";
+
+ .currentWaveLevel = 1;
+ .fightingActive = 0;
+
+ // here input some sentences "hello noob" like, the npc pick randomly a sentence
+ setarray .mockingGreeting$[0], "Hy noob !", "Hey somethingwholooklikeawarrior...", "Sup' chibi.";
+ setarray .mobID[0],0, 1021, 1108, 1107; // mob id, in array because change for different state of quest
+ setarray .mobCoordinate[0], 24, 34, 31, 41; // this represent the square of "ring" training
+
+ end;
+
+}
+
+001-2-36,33,37,0 script combatzonechecker NPC_HIDDEN,0,1,{
+OnTouch:
+ doevent instance_npcname("Hector#001-2-36",instance_id()) + "::OnLeaveCombatZone";
+end;
+}
diff --git a/npc/001-2-36/training_room_npc.txt b/npc/001-2-36/training_room_npc.txt
deleted file mode 100644
index 022b5d2e..00000000
--- a/npc/001-2-36/training_room_npc.txt
+++ /dev/null
@@ -1,165 +0,0 @@
-// TrainingRoom
-//
-// Author:
-// jak1
-//
-// Story:
-// Akko Teru
-// Reid
-//
-// Spellchecking & Dialogs
-// Reid
-
-// ~~ VARS ~~
-// $@FightingIsActive
-// 0 = can Warp in Room (non active fight)
-// 1 = can't Warp in Room (active fight)
-
-//TODO adding rand messages like "try hit it harder..." for wave's
-
-
-001-2-36,32,36,0 script FightNPCName NPC_LUCAS,{
-
- set $@NPCNAME$, "FightNPCName";
- set $@NPCNEXTNAME$, "Samantha";
- set $@MOB_ID, 1021;
- set $@MOB_NAME$, "Dummy";
- set $@CURRENT_WAVE_LEVEL, 1;
- set $@MAX_WAVES, 10;
-
- //Room and Mobspawn Coordinates
- // TL BR
- setarray $@MOB_SPAWN_COORDINATES, 24, 34, 31, 41;
- setarray $@MAP_NAME$, "001-2-36";
-
- set @roomPlayers, getmapusers($@MAP_NAME$);
-
- if(@roomPlayers > 1)
- goto NotAlone;
-
- if ($@FightingIsActive == 1)
- {
- npctalk3 "You are not done now!";
- end;
- }
-
- //call in Warp door if (1 = block)
- set $@FightingIsActive, 1;
-
- if (!debug || !is_dev())
- goto start;
-
- //can be removed later!
- menu
- "get debug vars", debug_it,
- "reset char var", resetVar,
- "start training", -;
-
-
-start:
- if (FIGHT_TRAINING >= 1)
- goto JobIsDone;
-
- getmapxy(.@map$, .@x, .@y, 0);
- if (.@x < 24 || .@x > 32 || .@y < 33 || .@y > 43)
- {
- speech S_FIRST_BLANK_LINE, l("Please enter the combat zone on the left.");
- close;
- }
-
- setcells "001-2-36", 33, 35, 33, 38, 1, "fence";
- initnpctimer;
- setnpctimer 0;
- startnpctimer;
-
- npctalk3 l("Let's begin");
- end;
-
-
-//cancel all actions, the Player needs to be alone in this Room
-NotAlone:
- npctalk3 "You dont feel so great with audience!";
- set $@FightingIsActive, 0;
- end;
-
-
-//If a Spawned Mob gets Killed
-OnTrainingMobDead:
- if ($@CURRENT_WAVE_LEVEL == $@MAX_WAVES )
- goto FinishedTraining;
-
- set $@CURRENT_WAVE_LEVEL, $@CURRENT_WAVE_LEVEL + 1;
- setnpctimer 0;
- startnpctimer;
- end;
-
-
-SpawnMonster:
- if ( $@FightingIsActive == 1 )
- {
- if ($@CURRENT_WAVE_LEVEL == $@MAX_WAVES)
- {
- npctalk "Last Wave!", $@NPCNAME$;
- }
- else
- {
- npctalk "Wave " + $@CURRENT_WAVE_LEVEL + "!", $@NPCNAME$;
- }
-
- areamonster "001-2-36", $@MOB_SPAWN_COORDINATES[0], $@MOB_SPAWN_COORDINATES[1], $@MOB_SPAWN_COORDINATES[2], $@MOB_SPAWN_COORDINATES[3], $@MOB_NAME$, $@MOB_ID, 1, $@NPCNAME$ + "::OnTrainingMobDead";
- stopnpctimer;
- setnpctimer 0;
- }
- else
- {
- set $@CURRENT_WAVE_LEVEL, 0;
- }
- stopnpctimer;
- setnpctimer 0;
- end;
-
-
-//15 Secounds Waiting (Regeneration for fightRoom)
-OnTimer5000:
- goto SpawnMonster;
-
-
-FinishedTraining:
- //... TODO
-
- npctalk "Con. u finished it...", $@NPCNAME$;
- stopnpctimer;
- setnpctimer 0;
- set $@CURRENT_WAVE_LEVEL, 0;
- delcells "fence";
- if (FIGHT_TRAINING >= 1)
- end;
- set FIGHT_TRAINING, 1;
- end;
-
-JobIsDone:
- mes "Well done, you should talk to \"" + $@NPCNEXTNAME$ + "\"...";
- close;
-
-
-// ----- DEBUG START ! -----
-
-debug_it:
- mes "DEBUG INFO";
- mes "- CharVariable:FIGHT_TRAINING "+ FIGHT_TRAINING;
- mes "- maxWaves "+ $@MAX_WAVES;
- mes "- currentWave "+ $@CURRENT_WAVE_LEVEL;
- mes "- npcName "+ $@NPCNAME$;
- mes "- mobName "+ $@MOB_NAME$;
- mes "- mobID "+ $@MOB_ID;
- close;
-
-resetVar:
- set FIGHT_TRAINING , 0;
-// ----- DEBUG END ! -----
-
-
-OnInit:
- end;
-
-}
diff --git a/npc/commands/debug-quest.txt b/npc/commands/debug-quest.txt
index 96a8e290..34bdf63b 100644
--- a/npc/commands/debug-quest.txt
+++ b/npc/commands/debug-quest.txt
@@ -80,7 +80,8 @@ function script GlobalQuestDebug {
"Fexil", ArtisQuests_Fexil,
"Lloyd", ArtisQuests_Lloyd,
l("Mona's dad"), ArtisQuests_MonaDad,
- l("Artis legion progress"), Artis_Legion_Progress;
+ l("Artis legion progress"), Artis_Legion_Progress,
+ l("Legion training"), ArtisQuests_TrainingLegion;
switch (@menuret)
{
diff --git a/npc/functions/quest-debug/034-ArtisQuests_TrainingLegion.txt b/npc/functions/quest-debug/034-ArtisQuests_TrainingLegion.txt
new file mode 100644
index 00000000..ba72fd07
--- /dev/null
+++ b/npc/functions/quest-debug/034-ArtisQuests_TrainingLegion.txt
@@ -0,0 +1,28 @@
+// Training Legion quest
+// Authors:
+// omatt
+
+function script QuestDebug34 {
+ do
+ {
+ clear;
+ setnpcdialogtitle l("Quest debug");
+ mes "ArtisQuests_TrainingLegion";
+ mes "---";
+ mes l("Quest state: @@", getq(ArtisQuests_TrainingLegion));
+ next;
+
+ GenericQuestDebug ArtisQuests_TrainingLegion,
+ l("Does not have the quest"), 0,
+ l("Finished sword training"), 1,
+ l("Finished bow training"), 2,
+ l("Both sword and bow training are finished"), 3,
+ l("Skill training finished, end of quest"), 4;
+
+ if (@menuret < 0)
+ {
+ return;
+ }
+
+ } while (1);
+}
diff --git a/npc/scripts.conf b/npc/scripts.conf
index ca2bf288..74e0f0e0 100644
--- a/npc/scripts.conf
+++ b/npc/scripts.conf
@@ -86,7 +86,7 @@
"npc/functions/quest-debug/031-General_Janus.txt",
"npc/functions/quest-debug/032-ArtisQuests_MonaDad.txt",
"npc/functions/quest-debug/033-Artis_Legion_Progress.txt",
-// 034: ???
+"npc/functions/quest-debug/034-ArtisQuests_TrainingLegion.txt",
// 035: ???
"npc/functions/quest-debug/036-HurnscaldQuests_Hinnak.txt",
"npc/functions/quest-debug/037-HurnscaldQuests_Soup.txt",