summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJesusaves <cpntb1@ymail.com>2020-05-24 16:17:51 +0000
committerJesusaves <cpntb1@ymail.com>2020-05-24 16:17:51 +0000
commitfb2453e136a2c8a1da5e13ee7f7e2de0522006d9 (patch)
treeb2e47702cb5268b72432a03a1289e11ece6a93d9
parent3f982e4e0785fa4dc8242d87ae8291c6b4c2e659 (diff)
parentb434d69f4305665b84fe7056120c578a792850f0 (diff)
downloadserverdata-fb2453e136a2c8a1da5e13ee7f7e2de0522006d9.tar.gz
serverdata-fb2453e136a2c8a1da5e13ee7f7e2de0522006d9.tar.bz2
serverdata-fb2453e136a2c8a1da5e13ee7f7e2de0522006d9.tar.xz
serverdata-fb2453e136a2c8a1da5e13ee7f7e2de0522006d9.zip
Merge branch 'thief' into 'master'
Thief Closes evol-all#99 See merge request evol/serverdata!238
-rw-r--r--conf/map/maps.conf1
-rw-r--r--db/constants.conf4
-rw-r--r--db/map_index.txt131
-rw-r--r--db/quest_db.conf67
-rw-r--r--db/re/item_db.conf18
-rw-r--r--db/re/mob_db.conf42
-rw-r--r--maps/re/001-2-40.mcachebin223 -> 223 bytes
-rw-r--r--maps/re/001-2-43.mcachebin0 -> 122 bytes
-rw-r--r--maps/re/012-3-3.mcachebin504 -> 503 bytes
-rw-r--r--npc/001-1/_warps.txt2
-rw-r--r--npc/001-1/sophialla.txt1
-rw-r--r--npc/001-2-31/_import.txt2
-rw-r--r--npc/001-2-31/_warps.txt2
-rw-r--r--npc/001-2-39/qanon.txt6
-rw-r--r--npc/001-2-40/_warps.txt1
-rw-r--r--npc/001-2-41/_import.txt2
-rw-r--r--npc/001-2-41/_warps.txt2
-rw-r--r--npc/001-2-43/_import.txt5
-rw-r--r--npc/001-2-43/_warps.txt3
-rw-r--r--npc/001-2-43/core.txt146
-rw-r--r--npc/001-2-43/mapflags.txt1
-rw-r--r--npc/001-2-8/_import.txt1
-rw-r--r--npc/001-2-8/doors.txt59
-rw-r--r--npc/001-3-0/_import.txt1
-rw-r--r--npc/001-3-0/_mobs.txt3
-rw-r--r--npc/001-3-0/gates.txt201
-rw-r--r--npc/001-3-1/_import.txt1
-rw-r--r--npc/001-3-1/_warps.txt1
-rw-r--r--npc/001-3-1/gates.txt66
-rw-r--r--npc/001-3-2/_import.txt1
-rw-r--r--npc/001-3-2/henry.txt356
-rw-r--r--npc/008-3-5/_import.txt1
-rw-r--r--npc/008-3-5/nunia.txt82
-rw-r--r--npc/012-3-3/_mobs.txt2
-rw-r--r--npc/_import.txt1
-rw-r--r--npc/commands/debug-quest.txt3
-rw-r--r--npc/functions/faction.txt104
-rw-r--r--npc/functions/lockpicks.txt193
-rw-r--r--npc/functions/quest-debug/020-ArtisQuests_LazyBrother.txt (renamed from npc/functions/quest-debug/019-ArtisQuests_LazyBrother.txt)2
-rw-r--r--npc/functions/quest-debug/021-ArtisQuests_Urchin.txt (renamed from npc/functions/quest-debug/020-ArtisQuests_Urchin.txt)2
-rw-r--r--npc/functions/quest-debug/022-ArtisQuests_CatchPiou.txt (renamed from npc/functions/quest-debug/021-ArtisQuests_CatchPiou.txt)2
-rw-r--r--npc/functions/quest-debug/023-ArtisQuests_Fishman.txt (renamed from npc/functions/quest-debug/022-ArtisQuests_Fishman.txt)2
-rw-r--r--npc/functions/quest-debug/024-ArtisQuests_QOnan.txt (renamed from npc/functions/quest-debug/023-ArtisQuests_QOnan.txt)2
-rw-r--r--npc/functions/quest-debug/035-ThiefQuests_Artis.txt38
-rw-r--r--npc/functions/quest-debug/050-HurnscaldQuests_Hinnak.txt (renamed from npc/functions/quest-debug/036-HurnscaldQuests_Hinnak.txt)2
-rw-r--r--npc/functions/quest-debug/051-HurnscaldQuests_Soup.txt (renamed from npc/functions/quest-debug/037-HurnscaldQuests_Soup.txt)2
-rw-r--r--npc/functions/quest-debug/052-HurnscaldQuests_Inspector.txt (renamed from npc/functions/quest-debug/038-HurnscaldQuests_Inspector.txt)2
-rw-r--r--npc/functions/quest-debug/053-HurnscaldQuests_ForestBow.txt (renamed from npc/functions/quest-debug/039-HurnscaldQuests_ForestBow.txt)2
-rw-r--r--npc/functions/quest-debug/054-HurnscaldQuests_WoodenShield.txt (renamed from npc/functions/quest-debug/040-HurnscaldQuests_WoodenShield.txt)2
-rw-r--r--npc/functions/quest-debug/055-General_Cooking.txt (renamed from npc/functions/quest-debug/041-General_Cooking.txt)2
-rw-r--r--npc/functions/quest-debug/056-General_Brotherhood.txt (renamed from npc/functions/quest-debug/042-General_Brotherhood.txt)2
-rw-r--r--npc/functions/quest-debug/100-General_Narrator.txt (renamed from npc/functions/quest-debug/028-General_Narrator.txt)2
-rw-r--r--npc/functions/spotlight.txt2
-rw-r--r--npc/functions/timer.txt7
-rw-r--r--npc/items/shovel.txt3
-rw-r--r--npc/scripts.conf46
56 files changed, 1502 insertions, 132 deletions
diff --git a/conf/map/maps.conf b/conf/map/maps.conf
index eed6eea0..531fd8fc 100644
--- a/conf/map/maps.conf
+++ b/conf/map/maps.conf
@@ -49,6 +49,7 @@ map_list: (
"001-2-40",
"001-2-41",
"001-2-42",
+ "001-2-43",
"001-2-5",
"001-2-6",
"001-2-7",
diff --git a/db/constants.conf b/db/constants.conf
index 4c83ec8c..192fb7fa 100644
--- a/db/constants.conf
+++ b/db/constants.conf
@@ -4062,6 +4062,8 @@ constants_db: {
NPC_HASAN: 207
NPC_CRASMANDE: 208
NPC_MANATREE: 210
+ NPC_HENRY: 211
+ NPC_NUNIA: 212
NPC_CONFUSED_TREE: 400
NPC_ALIGE: 401
@@ -4128,6 +4130,8 @@ constants_db: {
NPC_FLAG_L: 464
NPC_FLAG_R: 465
NPC_TOICHI: 466
+ NPC_SEWER_GATE: 467
+ NPC_SEWER_WHEEL: 468
NPC_TREASURE: 469
NPC_TEST1: 800
diff --git a/db/map_index.txt b/db/map_index.txt
index 59a69dbf..ca1ca981 100644
--- a/db/map_index.txt
+++ b/db/map_index.txt
@@ -46,68 +46,69 @@
001-2-40 46
001-2-41 47
001-2-42 48
-001-2-5 49
-001-2-6 50
-001-2-7 51
-001-2-8 52
-001-2-9 53
-001-3-0 54
-001-3-1 55
-001-3-2 56
-008-1-1 57
-008-1-2 58
-008-1 59
-008-2-0 60
-008-2-1 61
-008-2-10 62
-008-2-11 63
-008-2-12 64
-008-2-13 65
-008-2-14 66
-008-2-15 67
-008-2-16 68
-008-2-17 69
-008-2-18 70
-008-2-19 71
-008-2-2 72
-008-2-20 73
-008-2-21 74
-008-2-22 75
-008-2-23 76
-008-2-24 77
-008-2-25 78
-008-2-26 79
-008-2-27 80
-008-2-28 81
-008-2-29 82
-008-2-3 83
-008-2-30 84
-008-2-31 85
-008-2-32 86
-008-2-4 87
-008-2-5 88
-008-2-6 89
-008-2-7 90
-008-2-8 91
-008-2-9 92
-008-3-0 93
-008-3-1 94
-008-3-2 95
-008-3-3 96
-008-3-4 97
-008-3-5 98
-008-3-6 99
-012-1 100
-012-2-1 101
-012-2-2 102
-012-2-3 103
-012-2-4 104
-012-2-5 105
-012-2-6 106
-012-2-7 107
-012-3-1 108
-012-3-2 109
-012-3-3 110
-sec_pri 111
-test 112
-testbg 113
+001-2-43 49
+001-2-5 50
+001-2-6 51
+001-2-7 52
+001-2-8 53
+001-2-9 54
+001-3-0 55
+001-3-1 56
+001-3-2 57
+008-1-1 58
+008-1-2 59
+008-1 60
+008-2-0 61
+008-2-1 62
+008-2-10 63
+008-2-11 64
+008-2-12 65
+008-2-13 66
+008-2-14 67
+008-2-15 68
+008-2-16 69
+008-2-17 70
+008-2-18 71
+008-2-19 72
+008-2-2 73
+008-2-20 74
+008-2-21 75
+008-2-22 76
+008-2-23 77
+008-2-24 78
+008-2-25 79
+008-2-26 80
+008-2-27 81
+008-2-28 82
+008-2-29 83
+008-2-3 84
+008-2-30 85
+008-2-31 86
+008-2-32 87
+008-2-4 88
+008-2-5 89
+008-2-6 90
+008-2-7 91
+008-2-8 92
+008-2-9 93
+008-3-0 94
+008-3-1 95
+008-3-2 96
+008-3-3 97
+008-3-4 98
+008-3-5 99
+008-3-6 100
+012-1 101
+012-2-1 102
+012-2-2 103
+012-2-3 104
+012-2-4 105
+012-2-5 106
+012-2-6 107
+012-2-7 108
+012-3-1 109
+012-3-2 110
+012-3-3 111
+sec_pri 112
+test 113
+testbg 114
diff --git a/db/quest_db.conf b/db/quest_db.conf
index 5f0b27ab..990c76cb 100644
--- a/db/quest_db.conf
+++ b/db/quest_db.conf
@@ -24,7 +24,7 @@ quest_db: (
)
},
******************************************************************************/
-
+// Drasil Island Quests (0~19)
{
Id: 0
Name: "ShipQuests_Julia"
@@ -101,34 +101,29 @@ quest_db: (
Id: 18
Name: "General_Cookies"
},
-{
- Id: 19
- Name: "ArtisQuests_LazyBrother"
-},
+
+// Artis Quests (20~49)
{
Id: 20
- Name: "ArtisQuests_Urchin"
+ Name: "ArtisQuests_LazyBrother"
},
{
Id: 21
- Name: "ArtisQuests_CatchPiou"
+ Name: "ArtisQuests_Urchin"
},
{
Id: 22
- Name: "ArtisQuests_Fishman"
+ Name: "ArtisQuests_CatchPiou"
},
{
Id: 23
- Name: "ArtisQuests_QOnan"
+ Name: "ArtisQuests_Fishman"
},
{
Id: 24
- Name: "Halloween_VisitArtis"
-},
-{
- Id: 25
- Name: "Halloween_BarrelQuest"
+ Name: "ArtisQuests_QOnan"
},
+// ID 25 IS FREE
{
Id: 26
Name: "General_Rumly"
@@ -137,10 +132,7 @@ quest_db: (
Id: 27
Name: "ArtisQuests_Enora"
},
-{
- Id: 28
- Name: "General_Narrator"
-},
+// ID 28 IS FREE
{
Id: 29
Name: "ArtisQuests_Fexil"
@@ -164,35 +156,58 @@ quest_db: (
{
Id: 34
Name: "ArtisQuests_TrainingLegion"
- },
+},
{
- Id: 36
+ Id: 35
+ Name: "ThiefQuests_Artis"
+},
+
+// Argaes Quests (50~99)
+{
+ Id: 50
Name: "HurnscaldQuests_Hinnak"
},
{
- Id: 37
+ Id: 51
Name: "HurnscaldQuests_Soup"
},
{
- Id: 38
+ Id: 52
Name: "HurnscaldQuests_Inspector"
},
{
- Id: 39
+ Id: 53
Name: "HurnscaldQuests_ForestBow"
},
{
- Id: 40
+ Id: 54
Name: "HurnscaldQuests_WoodenShield"
},
{
- Id: 41
+ Id: 55
Name: "General_Cooking"
},
{
- Id: 42
+ Id: 56
Name: "General_Brotherhood"
},
+// 57 reserved Kfahr
+
+// Event and General Quests (100~149)
+{
+ Id: 100
+ Name: "General_Narrator"
+},
+{
+ Id: 101
+ Name: "Halloween_VisitArtis"
+},
+{
+ Id: 102
+ Name: "Halloween_BarrelQuest"
+},
+
+// Test Quests, Debug Quests, etc. (1000+)
{
Id: 1000
Name: "Test_testing1"
diff --git a/db/re/item_db.conf b/db/re/item_db.conf
index 38963955..5594ee93 100644
--- a/db/re/item_db.conf
+++ b/db/re/item_db.conf
@@ -1781,6 +1781,24 @@ item_db: (
Weight: 500
},
{
+ Id: 761
+ AegisName: "Gearwheel"
+ Name: "Gearwheel"
+ Type: "IT_ETC"
+ Buy: 2500
+ Sell: 650
+ Weight: 500
+},
+{
+ Id: 762
+ AegisName: "Lockpicks"
+ Name: "Lockpicks"
+ Type: "IT_ETC"
+ Buy: 5000
+ Sell: 400
+ Weight: 50
+},
+{
Id: 800
AegisName: "DiamondShard"
Name: "Diamond Shard"
diff --git a/db/re/mob_db.conf b/db/re/mob_db.conf
index c9656171..056fd8eb 100644
--- a/db/re/mob_db.conf
+++ b/db/re/mob_db.conf
@@ -3183,6 +3183,48 @@ mob_db: (
}
},
{
+ Id: 1076
+ SpriteName: "GiantMaggot"
+ Name: "Giant Maggot"
+ Lv: 20
+ Hp: 2407
+ Sp: 0
+ Exp: 63
+ JExp: 5
+ AttackRange: 1
+ Attack: [300, 450]
+ Def: 23
+ Mdef: 145
+ Stats: {
+ Str: 10
+ Agi: 30
+ Vit: 35
+ Int: 1
+ Dex: 30
+ Luk: 20
+ }
+ ChaseRange: 12
+ Race: 2
+ Element: (0, 2)
+ Mode: {
+ CanMove: true
+ CanAttack: true
+ CastSensorChase: true
+ ChangeChase: true
+ }
+ MoveSpeed: 1900
+ AttackDelay: 2700
+ AttackMotion: 672
+ DamaeMotion: 480
+ Drops: {
+ BugLeg: 3500
+ Carrot: 1000
+ Moss: 900
+ CommonCarp: 100
+ Pearl: 1
+ }
+},
+{
Id: 1100
SpriteName: "PoisonSkull"
Name: "Poison Skull"
diff --git a/maps/re/001-2-40.mcache b/maps/re/001-2-40.mcache
index aa7a507f..d8ec82c0 100644
--- a/maps/re/001-2-40.mcache
+++ b/maps/re/001-2-40.mcache
Binary files differ
diff --git a/maps/re/001-2-43.mcache b/maps/re/001-2-43.mcache
new file mode 100644
index 00000000..6a4b463f
--- /dev/null
+++ b/maps/re/001-2-43.mcache
Binary files differ
diff --git a/maps/re/012-3-3.mcache b/maps/re/012-3-3.mcache
index 76adf856..d5f82746 100644
--- a/maps/re/012-3-3.mcache
+++ b/maps/re/012-3-3.mcache
Binary files differ
diff --git a/npc/001-1/_warps.txt b/npc/001-1/_warps.txt
index 90a7dc1f..c084792b 100644
--- a/npc/001-1/_warps.txt
+++ b/npc/001-1/_warps.txt
@@ -121,7 +121,7 @@ OnInit:
001-1,134,83,0 warp #001-1_134_83 0,0,001-2-28,60,31
001-1,118,88,0 script #001-1_118_88_h NPC_HIDDEN,0,0,{
OnTouch:
- warp "001-2-28", 29, 42;
+ warp "001-2-28", 29, 41;
close;
OnUnTouch:
diff --git a/npc/001-1/sophialla.txt b/npc/001-1/sophialla.txt
index ad0755ec..d2bb6760 100644
--- a/npc/001-1/sophialla.txt
+++ b/npc/001-1/sophialla.txt
@@ -25,6 +25,7 @@
mes "";
if (@menu == 2)
{
+ // TODO: Tell to look for Henry TODO: Change curious eye conditional
speech
l("If you visit the sewers again... You'll find secret passages..."),
l("Look for the hideout, but tell no one about this. Then, say the password again.");
diff --git a/npc/001-2-31/_import.txt b/npc/001-2-31/_import.txt
index a599f2ae..ef587396 100644
--- a/npc/001-2-31/_import.txt
+++ b/npc/001-2-31/_import.txt
@@ -1,4 +1,4 @@
-// Map 001-2-31: unnamed
+// Map 001-2-31: West Commercial Building
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/001-2-31/_warps.txt",
"npc/001-2-31/mapflags.txt",
diff --git a/npc/001-2-31/_warps.txt b/npc/001-2-31/_warps.txt
index b25ab888..2dfa6c99 100644
--- a/npc/001-2-31/_warps.txt
+++ b/npc/001-2-31/_warps.txt
@@ -1,4 +1,4 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
-// Map 001-2-31: unnamed warps
+// Map 001-2-31: West Commercial Building warps
001-2-31,32,40,0 warp #001-2-31_32_40 0,0,001-1,49,97
001-2-31,36,32,0 warp #001-2-31_36_32 0,0,001-2-41,25,32
diff --git a/npc/001-2-39/qanon.txt b/npc/001-2-39/qanon.txt
index 3a917ba9..427a97ca 100644
--- a/npc/001-2-39/qanon.txt
+++ b/npc/001-2-39/qanon.txt
@@ -23,6 +23,12 @@
if (.@q < 5)
notaMember();
+ // Faction report
+ mesc l("Your current standing with the Legion: %s", faction_standing("LEGION", false));
+ if (LEGION_RANK)
+ mesc l("You are a Legion's %s", legionrank());
+
+ // Main Menu
select
rif(.@q == 5, l("Lozerk told me to talk to you and join the legion.")),
l("Thanks, sir Q'Anon.");
diff --git a/npc/001-2-40/_warps.txt b/npc/001-2-40/_warps.txt
index 89c5c721..ab895c3a 100644
--- a/npc/001-2-40/_warps.txt
+++ b/npc/001-2-40/_warps.txt
@@ -2,3 +2,4 @@
// Map 001-2-40: unnamed warps
001-2-40,45,44,0 warp #001-2-40_45_44 2,0,001-2-33,43,39
001-2-40,27,44,0 warp #001-2-40_27_44 2,0,001-2-33,25,39
+001-2-40,56,41,0 warp #001-2-40_56_41 0,0,001-3-0,56,44
diff --git a/npc/001-2-41/_import.txt b/npc/001-2-41/_import.txt
index a8eee726..1584e4d6 100644
--- a/npc/001-2-41/_import.txt
+++ b/npc/001-2-41/_import.txt
@@ -1,4 +1,4 @@
-// Map 001-2-41: unnamed
+// Map 001-2-41: Barber
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/001-2-41/_warps.txt",
"npc/001-2-41/edouard.txt",
diff --git a/npc/001-2-41/_warps.txt b/npc/001-2-41/_warps.txt
index 7a10c00d..76251c2a 100644
--- a/npc/001-2-41/_warps.txt
+++ b/npc/001-2-41/_warps.txt
@@ -1,3 +1,3 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
-// Map 001-2-41: unnamed warps
+// Map 001-2-41: Barber warps
001-2-41,24,32,0 warp #001-2-41_24_32 0,0,001-2-31,35,32
diff --git a/npc/001-2-43/_import.txt b/npc/001-2-43/_import.txt
new file mode 100644
index 00000000..ed7173e0
--- /dev/null
+++ b/npc/001-2-43/_import.txt
@@ -0,0 +1,5 @@
+// Map 001-2-43: Archive
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+"npc/001-2-43/_warps.txt",
+"npc/001-2-43/core.txt",
+"npc/001-2-43/mapflags.txt",
diff --git a/npc/001-2-43/_warps.txt b/npc/001-2-43/_warps.txt
new file mode 100644
index 00000000..2a53a67d
--- /dev/null
+++ b/npc/001-2-43/_warps.txt
@@ -0,0 +1,3 @@
+// This file is generated automatically. All manually added changes will be removed when running the Converter.
+// Map 001-2-43: Archive warps
+001-2-43,51,35,0 warp #001-2-43_51_35 2,0,001-3-0,90,62
diff --git a/npc/001-2-43/core.txt b/npc/001-2-43/core.txt
new file mode 100644
index 00000000..9f541b54
--- /dev/null
+++ b/npc/001-2-43/core.txt
@@ -0,0 +1,146 @@
+// Evol scripts.
+// Author:
+// Micksha, Jesusalva
+// Description:
+// Core of Henry's Quest
+
+001-2-43,25,24,0 script #ArtisThiefBook_1 NPC_NO_SPRITE,{
+ .@q=getq(ThiefQuests_Artis);
+ .@q3=getq3(ThiefQuests_Artis);
+
+ // Add a forced delay to prevent abuse
+ if (.@q != 1) end;
+ getmapxy(.@m$, @x, @y, 0); // Save in @x/@y
+ dispbottom l("Sec, lemme look this.");
+ addtimer 1000, .name$+"::OnRead";
+ end;
+
+OnRead:
+ // Prepare the Quest Variables
+ .@q=getq(ThiefQuests_Artis);
+ .@q3=getq3(ThiefQuests_Artis);
+
+ // You must not have moved
+ getmapxy(.@m$, .@x, .@y, 0);
+ if (.@x != @x || .@y != @y || .@q != 1) {
+ dispbottom l("I'm so busy, I can look there later.");
+ end;
+ }
+
+ // Clear temporary variables
+ @x=@y=0;
+
+ // Extract the quest ID from name (or fail trying)
+ explode(.@ni$, .name$, "_");
+ .@id=atoi(.@ni$[1]);
+
+ // Check if the file was here
+ if (.@q3 == .@id) {
+ // TODO: Dialog: How will you deal with the file?
+ // .@t$=faction_addrep("Legion", 50)
+ // .@t$=faction_addrep("Thief", 50)
+ // mesc .@t$;
+ mes l("This is it - Henry's files!");
+ mes l("I need to decide swiftly what I'll do with them before I'm caught.");
+ next;
+ select
+ l("Hide the file below the pots"),
+ l("[Legion+] [Thieves-] Highlight the file"),
+ l("[Legion-] [Thieves+] Destroy the file");
+ mes "";
+ switch (@menu) {
+ case 2:
+ .@t$=faction_addrep("Legion", 50);
+ mesc .@t$;
+ .@t$=faction_addrep("Thief", -50);
+ mesc .@t$;
+ next;
+ break;
+ case 3:
+ .@t$=faction_addrep("Legion", -50);
+ mesc .@t$;
+ .@t$=faction_addrep("Thief", 50);
+ mesc .@t$;
+ next;
+ break;
+ }
+ dispbottom l("You notice by chance that the file does not have any picture on it.");
+ setq ThiefQuests_Artis, 2, 0, 0;
+ closeclientdialog;
+ } else {
+ dispbottom l("Not here, lets look elsewhere!");
+ }
+ end;
+
+OnInit:
+ .distance=1;
+ end;
+}
+
+// Duplicate the town files
+001-2-43,24,28,0 duplicate(#ArtisThiefBook_1) #ArtisThiefBook_2 NPC_NO_SPRITE
+001-2-43,25,32,0 duplicate(#ArtisThiefBook_1) #ArtisThiefBook_4 NPC_NO_SPRITE
+001-2-43,29,28,0 duplicate(#ArtisThiefBook_1) #ArtisThiefBook_8 NPC_NO_SPRITE
+001-2-43,34,32,0 duplicate(#ArtisThiefBook_1) #ArtisThiefBook_16 NPC_NO_SPRITE
+001-2-43,38,32,0 duplicate(#ArtisThiefBook_1) #ArtisThiefBook_32 NPC_NO_SPRITE
+001-2-43,44,32,0 duplicate(#ArtisThiefBook_1) #ArtisThiefBook_64 NPC_NO_SPRITE
+001-2-43,48,32,0 duplicate(#ArtisThiefBook_1) #ArtisThiefBook_128 NPC_NO_SPRITE
+001-2-43,48,28,0 duplicate(#ArtisThiefBook_1) #ArtisThiefBook_256 NPC_NO_SPRITE
+001-2-43,43,28,0 duplicate(#ArtisThiefBook_1) #ArtisThiefBook_512 NPC_NO_SPRITE
+001-2-43,38,28,0 duplicate(#ArtisThiefBook_1) #ArtisThiefBook_1024 NPC_NO_SPRITE
+001-2-43,33,28,0 duplicate(#ArtisThiefBook_1) #ArtisThiefBook_2048 NPC_NO_SPRITE
+001-2-43,53,24,0 duplicate(#ArtisThiefBook_1) #ArtisThiefBook_4096 NPC_NO_SPRITE
+001-2-43,44,24,0 duplicate(#ArtisThiefBook_1) #ArtisThiefBook_8192 NPC_NO_SPRITE
+001-2-43,29,24,0 duplicate(#ArtisThiefBook_1) #ArtisThiefBook_16384 NPC_NO_SPRITE
+001-2-43,39,24,0 duplicate(#ArtisThiefBook_1) #ArtisThiefBook_32768 NPC_NO_SPRITE
+001-2-43,49,24,0 duplicate(#ArtisThiefBook_1) #ArtisThiefBook_65536 NPC_NO_SPRITE
+// Fail-safe; Henry's record should not be here
+001-2-43,34,24,0 duplicate(#ArtisThiefBook_1) #ArtisThiefBook_131072 NPC_NO_SPRITE
+//001-2-43,29,31,0 duplicate(#ArtisThiefBook_1) #ArtisThiefBook_131072 NPC_NO_SPRITE
+//001-2-43,24,26,0 duplicate(#ArtisThiefBook_1) #ArtisThiefBook_262144 NPC_NO_SPRITE
+
+
+// Logical Handler
+001-2-43,0,0,0 script #ArtisThiefBook_0 NPC_HIDDEN,{
+ end;
+OnBust1:
+ if (getmap() != .map$)
+ end;
+ dispbottom col(l("90 seconds remaining."), 1);
+ addtimer 30000, "#ArtisThiefBook_0::OnBust2";
+ end;
+
+OnBust2:
+ if (getmap() != .map$)
+ end;
+ dispbottom col(l("60 seconds remaining."), 1);
+ addtimer 30000, "#ArtisThiefBook_0::OnBust3";
+ end;
+
+OnBust3:
+ if (getmap() != .map$)
+ end;
+ dispbottom col(l("30 seconds remaining."), 1);
+ addtimer 30000, "#ArtisThiefBook_0::OnBust4";
+ end;
+
+OnBust4:
+ if (getmap() == .map$) {
+ // Warp you elsewhere before actually arresting
+ // Otherwise, you would return at Archives without this timer =/
+ warp "001-1", 90, 55;
+ sleep2(10);
+
+ // Check if you'll be caught
+ if (ArrestedChances()) {
+ mesc l("Arrested!");
+ mesc l("You'll now spend a few minutes on the jail to reflect on your actions.");
+ ArrestPlayer(5);
+ } else {
+ mesc l("You're almost found out, but manage to make a quick escape!");
+ warp "001-1", 90, 55;
+ }
+ }
+ close;
+}
+
diff --git a/npc/001-2-43/mapflags.txt b/npc/001-2-43/mapflags.txt
new file mode 100644
index 00000000..d32035bb
--- /dev/null
+++ b/npc/001-2-43/mapflags.txt
@@ -0,0 +1 @@
+001-2-43 mapflag nosave 001-1,89,67
diff --git a/npc/001-2-8/_import.txt b/npc/001-2-8/_import.txt
index 93b064fe..17bbd2dc 100644
--- a/npc/001-2-8/_import.txt
+++ b/npc/001-2-8/_import.txt
@@ -1,4 +1,5 @@
// Map 001-2-8: Left Wing
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/001-2-8/_warps.txt",
+"npc/001-2-8/doors.txt",
"npc/001-2-8/mapflags.txt",
diff --git a/npc/001-2-8/doors.txt b/npc/001-2-8/doors.txt
new file mode 100644
index 00000000..7b34c4da
--- /dev/null
+++ b/npc/001-2-8/doors.txt
@@ -0,0 +1,59 @@
+// Evol scripts.
+// Author:
+// Jesusalva
+// Description:
+// The Door for Town Archives
+
+001-2-8,38,30,0 script #ArtisArchiveGate NPC_NO_SPRITE,0,0,{
+ function breakIn;
+ function notToday;
+
+ .@q=getq(ThiefQuests_Artis);
+ mes l("The door is locked and you don't have the key.");
+ next;
+ mes l("This is probably where the town files are kept.");
+ if (.@q > 1) notToday();
+ if (.@q == 1) breakIn();
+ close;
+
+function notToday {
+ mesc l("I have nothing else to do down there.");
+ return;
+}
+
+function breakIn {
+ mesc l("Should we break in? We'll be in a bad situation if we're found out.");
+ next;
+ // Better to not use only a pine!
+ if (LockPicking(2, 3, false)) {
+ // Delete previous timers.
+ deltimer("#ArtisThiefBook_0::OnBust1");
+ deltimer("#ArtisThiefBook_0::OnBust2");
+ deltimer("#ArtisThiefBook_0::OnBust3");
+ deltimer("#ArtisThiefBook_0::OnBust4");
+ // Begin the catch timer (addtimer)
+ addtimer 30000, "#ArtisThiefBook_0::OnBust1";
+ warp "001-2-43", 27, 34;
+ } else {
+ if (ArrestedChances()) {
+ mesc l("Arrested!");
+ mesc l("You'll now spend a few minutes on the jail to reflect on your actions.");
+ ArrestPlayer(5);
+ } else {
+ mesc l("You're almost found out, but manage to make a quick escape!");
+ warp "001-1", 90, 55;
+ }
+
+ }
+ return;
+}
+
+OnTouch:
+ npctalkonce l("Dang! It is locked.");
+ end;
+
+OnInit:
+ .distance=1;
+ end;
+}
+
diff --git a/npc/001-3-0/_import.txt b/npc/001-3-0/_import.txt
index 5ead6439..502507be 100644
--- a/npc/001-3-0/_import.txt
+++ b/npc/001-3-0/_import.txt
@@ -2,4 +2,5 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/001-3-0/_mobs.txt",
"npc/001-3-0/_warps.txt",
+"npc/001-3-0/gates.txt",
"npc/001-3-0/mundane.txt",
diff --git a/npc/001-3-0/_mobs.txt b/npc/001-3-0/_mobs.txt
index cfae2cf4..49443d5a 100644
--- a/npc/001-3-0/_mobs.txt
+++ b/npc/001-3-0/_mobs.txt
@@ -26,7 +26,7 @@
001-3-0,86,131,4,2 monster Little Green Slime 1025,3,500,2000
001-3-0,175,31,4,2 monster Little Green Slime 1025,2,500,2000
001-3-0,147,67,4,2 monster Little Green Slime 1025,2,500,2000
-001-3-0,54,53,5,3 monster Poison Skull 1100,1,35000,60000
+001-3-0,55,50,5,3 monster Giant Maggot 1076,1,25000,20000,Henry#001-3-2::OnGiantMaggot
001-3-0,117,60,5,0 monster Cave Maggot 1027,25,500,2000
001-3-0,156,43,5,2 monster Crafty 1018,3,12000,20000
001-3-0,178,76,5,1 monster Crafty 1018,3,12000,20000
@@ -36,3 +36,4 @@
001-3-0,54,85,5,0 monster Tortuga 1004,1,35000,300000
001-3-0,114,62,5,0 monster Tortuga 1004,1,35000,300000
001-3-0,167,100,6,1 monster Tortuga 1004,1,35000,300000
+001-3-0,41,104,2,3 monster Giant Maggot 1076,1,15000,15000,Henry#001-3-2::OnGiantMaggot
diff --git a/npc/001-3-0/gates.txt b/npc/001-3-0/gates.txt
new file mode 100644
index 00000000..e8accc96
--- /dev/null
+++ b/npc/001-3-0/gates.txt
@@ -0,0 +1,201 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// The Sewer Gates, and Wheels.
+
+001-3-0,90,62,0 script #ArtisThiefGate_1 NPC_SEWER_GATE,0,0,{
+ // Extract the quest ID from name (or fail trying)
+ explode(.@ni$, .name$, "_");
+ .@id=atoi(.@ni$[1]);
+
+ .@q=getq(ThiefQuests_Artis);
+ .@q2=getq2(ThiefQuests_Artis);
+
+ // Check what you can do with the gate
+ if (.@q != .@id) {
+ mes l("This gate is closed.");
+ mesc l("No need to go through here, so lets not bother with it now.");
+ } else if (.@q2 != 2) {
+ mes l("This gate is closed.");
+ mesc l("It seems that it can be open using the mechanism on the side.");
+ } else {
+ mes l("This gate is open.");
+ mesc l("I should still be careful to don't get caught.");
+ }
+ close;
+
+OnTouch:
+ updateSpotlight(true);
+ end;
+
+OnOpenSesame:
+ // Opening
+ if (!.busy) {
+ .dir=2;
+ .busy=true;
+ initnpctimer;
+ }
+ end;
+
+// Open
+OnTimer2200:
+ .dir=4;
+ end;
+
+// Closing
+OnTimer8000:
+ .dir=6;
+ end;
+
+// Closed
+OnTimer10400:
+ .dir=0;
+ end;
+
+// Don't reply immediately, wait a tiny bit
+OnTimer11000:
+ .busy = false;
+ stopnpctimer;
+
+OnInit:
+ .busy = false;
+ .distance = 1;
+ end;
+}
+
+
+
+001-3-0,92,61,0 script #ArtisThiefWheel_1 NPC_SEWER_WHEEL,{
+ // Extract the quest ID from name (or fail trying)
+ explode(.@ni$, .name$, "_");
+ .@id=atoi(.@ni$[1]);
+
+ .@q=getq(ThiefQuests_Artis);
+ .@q2=getq2(ThiefQuests_Artis);
+
+ if (.@q != .@id) {
+ speech
+ l("This wheel seems to be connected to the locked gate on the side."),
+ l("Having to reason to tinker with it, you don't.");
+ close;
+ }
+ speech
+ l("You try to move this wheel, but it is stuck. Something seems to be missing."),
+ l("Maybe some monster ate it, but what would be big enough to do that?!");
+
+ // Switch gearwheel status: 1(looted) 2(unlooted)
+ switch (.@q2) {
+ case 1:
+ // Looted but lost? D:
+ if (!countitem(Gearwheel)) {
+ mesc l("If we only had a %s.", getitemlink(Gearwheel));
+ close;
+ }
+
+ // Prompt player
+ mesc l("Should we install the %s and move it?", getitemlink(Gearwheel)), 1;
+ if (askyesno() == ASK_NO)
+ break;
+
+ delitem Gearwheel, 1;
+ setq2 ThiefQuests_Artis, 2;
+ // FALLTHROUGH
+ case 2:
+ mesc l("With the %s in place, it only takes a bit more effort to make it budge.", getitemlink(Gearwheel));
+ next;
+ closeclientdialog;
+ // Spin the wheel
+ if (!.busy) {
+ .dir = 4;
+ .busy = true;
+ initnpctimer;
+ }
+ // Open the gate
+ addtimer 500, "#ArtisThiefGate_"+.@id+"::OnOpenSesame";
+ break;
+ default:
+ }
+ close;
+
+// Done spinning?
+OnTimer4000:
+ .dir = 0;
+ .busy = false;
+ stopnpctimer;
+
+OnInit:
+ .busy = false;
+ .distance = 2;
+ end;
+}
+
+
+
+// We're missing a gate!
+001-3-0,56,44,0 duplicate(#ArtisThiefGate_1) #ArtisThiefGate_4 NPC_SEWER_GATE,2,2
+001-3-0,58,43,0 duplicate(#ArtisThiefWheel_1) #ArtisThiefWheel_4 NPC_SEWER_WHEEL
+
+
+///////////////////////////
+// The controlled warps
+001-3-0,90,61,0 script #001-3-0_90_61 NPC_HIDDEN,0,0,{
+ end;
+
+OnTouch:
+ // No enter except when q1 and q2 matches
+ .@q=getq(ThiefQuests_Artis);
+ .@q2=getq2(ThiefQuests_Artis);
+ if (.@q != 1 || .@q2 != 2)
+ end;
+
+ // Delete previous timers. Makes easier to cheat but more reliable (FIXME)
+ deltimer("#ArtisThiefBook_0::OnBust1");
+ deltimer("#ArtisThiefBook_0::OnBust2");
+ deltimer("#ArtisThiefBook_0::OnBust3");
+ deltimer("#ArtisThiefBook_0::OnBust4");
+
+ // Archives: Begin
+ addtimer 30000, "#ArtisThiefBook_0::OnBust1";
+ warp "001-2-43", 51, 34;
+ end;
+}
+
+001-3-0,56,43,0 script #001-3-0_56_43 NPC_HIDDEN,0,0,{
+ end;
+
+OnTouch:
+ // No enter except when quest state allows you to
+ // I thought in letting you use this passage and get busted anytime...
+ // ...........Better not. Animation will not like it, anyway.
+ .@q=getq(ThiefQuests_Artis);
+ .@q2=getq2(ThiefQuests_Artis);
+ if (.@q != 4 || .@q2 != 2)
+ end;
+
+ warp "001-2-40", 56, 40;
+ addtimer2(rand2(3000, 7000), .name$+"::OnBusted");
+ end;
+
+// Henry said to you don't use the gate, because you are not discrete enough.
+// Poor player, this is what happens for not paying attention to Henry's advise.
+OnBusted:
+ if (getmap() != "001-2-40")
+ end;
+
+ mesn l("Legion Officer");
+ mes l("HEY! How you got here!?");
+ next;
+ // Check if you'll be caught
+ if (ArrestedChances()) {
+ mesc l("Arrested!");
+ mesc l("You'll now spend a few minutes on the jail to reflect on your actions.");
+ ArrestPlayer(5);
+ } else {
+ mesc l("You're almost found out, but manage to make a quick escape!");
+ warp "001-1", 41, 36;
+ }
+ close;
+}
+
+
diff --git a/npc/001-3-1/_import.txt b/npc/001-3-1/_import.txt
index 1d0a0c00..3462861c 100644
--- a/npc/001-3-1/_import.txt
+++ b/npc/001-3-1/_import.txt
@@ -2,3 +2,4 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/001-3-1/_mobs.txt",
"npc/001-3-1/_warps.txt",
+"npc/001-3-1/gates.txt",
diff --git a/npc/001-3-1/_warps.txt b/npc/001-3-1/_warps.txt
index 4f79c590..f0c3d747 100644
--- a/npc/001-3-1/_warps.txt
+++ b/npc/001-3-1/_warps.txt
@@ -2,4 +2,3 @@
// Map 001-3-1: Rivercave warps
001-3-1,24,58,0 warp #001-3-1_24_58 1,0,001-3-0,162,41
001-3-1,35,59,0 warp #001-3-1_35_59 1,0,001-3-0,172,42
-001-3-1,30,19,0 warp #001-3-1_30_19 0,0,001-3-2,30,116
diff --git a/npc/001-3-1/gates.txt b/npc/001-3-1/gates.txt
new file mode 100644
index 00000000..f3c1a038
--- /dev/null
+++ b/npc/001-3-1/gates.txt
@@ -0,0 +1,66 @@
+// Evol scripts.
+// Author:
+// Micksha, Jesusalva
+// Description:
+// The Sewer Gates, and Wheels.
+
+// Brotherhood hideout, the door opens by itself if player
+// can now talk to Sopiahalla.
+001-3-1,30,19,0 script #001-3-1_30_19 NPC_HIDDEN,0,0,{
+ end;
+
+OnTouch:
+ .@q=getq(General_Brotherhood);
+ updateSpotlight(true);
+ if (.@q)
+ warp "001-3-2", 30, 116;
+ end;
+}
+
+// The gate itself
+001-3-1,30,20,0 script #Gate3 NPC_SEWER_GATE,2,2,{
+ .@q=getq(General_Brotherhood);
+ if (.@q)
+ mes l("This gate opens on its own for you... Should we go inside?");
+ else
+ mes l("This gate is closed.");
+ close;
+
+OnTouch:
+ .@q=getq(General_Brotherhood);
+ updateSpotlight(true);
+ // Opening
+ if (!.busy && .@q) {
+ .dir=2;
+ .busy=true;
+ initnpctimer;
+ }
+ end;
+
+// Open
+OnTimer2200:
+ .dir=4;
+ end;
+
+// Closing
+OnTimer8000:
+ .dir=6;
+ end;
+
+// Closed
+OnTimer10400:
+ .dir=0;
+ end;
+
+// Don't reopen immediately, wait a tiny bit
+OnTimer11000:
+ .busy=false;
+ stopnpctimer;
+
+// Initial configuration
+OnInit:
+ .busy=false;
+ .distance = 2;
+ end;
+}
+
diff --git a/npc/001-3-2/_import.txt b/npc/001-3-2/_import.txt
index d427b6ed..d70ece30 100644
--- a/npc/001-3-2/_import.txt
+++ b/npc/001-3-2/_import.txt
@@ -1,3 +1,4 @@
// Map 001-3-2: Hideout
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/001-3-2/_warps.txt",
+"npc/001-3-2/henry.txt",
diff --git a/npc/001-3-2/henry.txt b/npc/001-3-2/henry.txt
new file mode 100644
index 00000000..f3ab598a
--- /dev/null
+++ b/npc/001-3-2/henry.txt
@@ -0,0 +1,356 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Jesusalva
+// Description:
+// Henry, a Brotherhood member managing the Hideout in Artis.
+// TODO: Koga-related functions (possibly in another NPC)
+
+001-3-2,24,51,0 script Henry#001-3-2 NPC_HENRY,{
+ function proposeFirstQuest;
+ function reportFirstQuest;
+ function proposeSecondQuest;
+ function reportSecondQuest;
+ function proposeThirdQuest;
+ function reportThirdQuest;
+ function completedHenry;
+
+ .@q=getq(ThiefQuests_Artis);
+ switch (.@q) {
+ case 0:
+ proposeFirstQuest();
+ break;
+ case 1:
+ case 2:
+ reportFirstQuest();
+ break;
+ case 3:
+ proposeSecondQuest();
+ break;
+ case 4:
+ case 5:
+ reportSecondQuest();
+ break;
+ case 6:
+ proposeThirdQuest();
+ break;
+ case 7:
+ case 8:
+ reportThirdQuest();
+ break;
+ default:
+ completedHenry();
+ break;
+ }
+ close;
+
+///////////////////////////////////////////////////////
+function proposeFirstQuest {
+ speech
+ l("Stop! Who's there?"),
+ l("Ah, its you. Sophialla already informed me. I can help you to go to Woodland, but you also could do me a favor."),
+ l("The Legion has been on my tail for a while. They're a bit annoying, you know."),
+ l("I mean, what's wrong with smuggling goods?! The town markets would have way less stuff otherwise. You can understand me, right? Don't answer."),
+ l("Anyway, you want to get on my smuggling ship, right? So you better help me out!"),
+ b(l("In Artis Townhall Archives,"))+" "+l("there is an entry about me."),
+ l("If they somehow catch me again, they'll use this entry as evidence to get me on a harsher punishment..."),
+ l("So please find my file on the archives and, I don't know, deal with it?"),
+ l("I am smart, I'll know if you lie. Anyway, just don't get caught inside the archives.");
+ //l("After messing with the Major and the Legion here, I can teach you lockpicking. Ah, and you may try to find my friend Nunia in Woodland, once you go there. She seems to be disappeared."),
+ //l("Call for Micksha and Jesusalva to implement all this, please.");
+ next;
+ mesc l("Accept this quest?"), 3;
+ if (askyesno() == ASK_YES) {
+ mesn;
+ mesq l("Great! Then I'll be counting on you!");
+ setq ThiefQuests_Artis, 1, 0, 2**rand2(17);
+ }
+ return;
+}
+
+function reportFirstQuest {
+ .@q=getq(ThiefQuests_Artis);
+ mesn;
+ mesq l("Have you already did what I asked you to?");
+ select
+ l("Not yet, but I'll be back."),
+ l("What was I supposed to do, again?"),
+ l("Yes, the file has been dealt with.");
+ mes "";
+ switch (@menu) {
+ case 1:
+ mesn;
+ mesq l("I'm not in hurry if you're not in hurry...");
+ break;
+ case 2:
+ speech
+ l("You should invade the townhall archives - I don't care how."),
+ l("There'll be a file about an... incident... with me. Deal with the file - I also don't care how."),
+ l("Try to don't get too much attention, or they'll arrest you as well.");
+ break;
+ case 3:
+ mesn;
+ mesq l("Hm... Then tell me, what was I wearing on the file picture?");
+ next;
+ select
+ l("A fancy hat."),
+ l("A shemagh or a shawl."),
+ l("Sunglasses."),
+ l("A santa hat."),
+ l("A top hat."),
+ l("A legion armor."),
+ l("An eye patch."),
+ l("A bandit hood."),
+ rif(.@q == 2, l("There was no picture on the file."));
+ mes "";
+ if (@menu != 9) {
+ mesc l("%s lunges at you!", strnpcinfo(1));
+ mesc l("You've been stabbed!"), 1;
+ mes "";
+ mesn;
+ mesq l("Now I know you're lying; Go find my file and deal with it!");
+ percentheal -15, 0;
+ close;
+ } else {
+ // WUT How did this even happen?!
+ if (.@q != 2)
+ atcommand("@kick "+strcharinfo(0));
+
+ // TODO: Reward
+ mesn;
+ mesq l("Heh... I hope you disposed of the file.");
+ next;
+ mesn;
+ mesq l("I'll keep my end on the bargain. The Thieves Association will bring you to the Argaes region.");
+ next;
+ mesn;
+ mesq l("Can't bring you directly to the town, but don't worry.");
+ next;
+ mesn;
+ mesq l("Anyway, here's some gold. I might have another task for you if you want.");
+ // Reward Reference: Lv 10
+ getexp 30*BaseLevel, 30;
+ Zeny+=300;
+ setq ThiefQuests_Artis, 3;
+ // Previous state already wiped this:
+ //setq2 ThiefQuests_Artis, false; // Restart wheels
+ }
+
+ }
+ return;
+}
+
+///////////////////////////////////////////////////////
+function proposeSecondQuest {
+ speech
+ l("Ah, its you again. Welcome back."),
+ l("So, if you want to go to Hurnscald, just whistle on the beach."), // FIXME Not Koga? Talk to another NPC, though.
+ l("Anyway, I still could use your help! You see, I would like to play tricks on the legion members during the night."),
+ l("For this, I would like you to to repair the secret passage to the Legion Building."),
+ l("Don't use the passage, you're not skilled enough and will be busted! Just repair it, it'll be enough.");
+ mesc l("You suspect that he is withholding information. Do he really only wants to do pranks? But then, do you care with what he wants to do inside?");
+ next;
+ mesc l("Accept this quest?"), 3;
+ if (askyesno() == ASK_YES) {
+ mesn;
+ mesq l("Great! Then I'll be counting on you!");
+ setq1 ThiefQuests_Artis, 4;
+ close;
+ }
+ return;
+}
+
+function reportSecondQuest {
+ mesn;
+ mesq l("Have you already did what I asked you to?");
+ next;
+ select
+ l("Not yet, but I'll get to it."),
+ l("What was I supposed to do, again?"),
+ l("Yes, the deed is done.");
+ mes "";
+ switch (@menu) {
+ case 1:
+ break;
+ case 2:
+ speech
+ l("In the sewers, there is a passage to the Legion basement."),
+ l("I want to get in there, so please do me a favor, and repair the gate. Don't try to go inside yourself, you'll be caught."),
+ l("Also - don't ask me why I want this. Thieves doesn't make questions. You better remember this!");
+ break;
+ case 3:
+ mesn;
+ mesq l("Great! I'll send a scout to check. I hope you didn't blew up everything by going there, you're not very discrete.");
+ next;
+ mes "...";
+ next;
+ .@q2=getq2(ThiefQuests_Artis);
+ if (.@q2 != 2) {
+ mesn;
+ mesq l("Nope, it is still sealed tight. Go do your job if you want a reward.");
+ break;
+ }
+ mesn;
+ mesq l("Alright - This will be... good. Anyway, I should give you a reward.");
+ next;
+ mesn;
+ mesq l("Take this %s. There is something good on it; Just use a %s.",
+ getitemlink(TreasureMap), getitemlink(IronShovel));
+
+ // Obtain the map, quest is done
+ inventoryplace TreasureMap, 1;
+ getitem TreasureMap, 1;
+ setq1 ThiefQuests_Artis, 6;
+
+ // Override the treasure location, if already existing
+ .@m$="001-1";
+ .@x=any(199, 200);
+ .@y=any(61,62);
+
+ shovel_addquest(.@m$, .@x, .@y, "shovel_randomtreasure");
+ ShovelQuests_AssignedMAP$=shovel_getcity(.@m$);
+ ShovelQuests_AssignedX=.@x;
+ ShovelQuests_AssignedY=.@y;
+
+ // TODO: If we add a daily legion quest, it must be "redemption"~ish
+ // That is, destroy points from all other three factions
+ // ...Also, is *this* specific code a good idea at all?
+ .@t$=faction_addrep("Legion", -15);
+ mesc .@t$;
+ .@t$=faction_addrep("Thief", 15);
+ mesc .@t$;
+ next;
+ mesn;
+ mesq l("I don't know how to get a shovel, though.");
+ next;
+ mesn;
+ mesq l("Remember: \"Use\" the map, and use the debugger (F10) or \"/where\" in chat to check your coordinates!");
+ }
+ return;
+}
+
+///////////////////////////////////////////////////////
+function proposeThirdQuest {
+ speech
+ l("Thanks for the help the other day."),
+ l("I have a beloved friend called Nunia, who handles the Thieves' Guild branch in Hurnscald."),
+ l("What, you thought we wouldn't have an organization and structure? Please. We can even smuggle in a major ship route!"),
+ l("Anyway, I haven't heard about her from quite a while, which is concerning."),
+ l("Could you please go there see if she is well?"),
+ l("I'll give you something... useful... If you want to pursue in being a thief. I'll even put a good word about you.");
+ next;
+ mesc l("Accept this quest?"), 3;
+ if (askyesno() == ASK_YES) {
+ mesn;
+ mesq l("Great! Then I'll be counting on you!");
+ setq1 ThiefQuests_Artis, 7;
+ close;
+ }
+ return;
+}
+
+function reportThirdQuest {
+ mesn;
+ mesq l("Have you already did what I asked you to?");
+ next;
+ select
+ l("Not yet, but I'll get to it."),
+ l("What was I supposed to do, again?"),
+ l("Yes, the deed is done.");
+ mes "";
+ switch (@menu) {
+ case 2:
+ speech
+ l("My beloved friend Nunia in Hurnscald went missing."),
+ l("I mean, I do not receive any letter from her for a while, so I got worried."),
+ l("I would like you to check how she is doing. You know, the Brotherhood could have got her and she is in need of rescue, or something else.");
+ break;
+ case 3:
+ .@q=getq(ThiefQuests_Artis);
+ mesn;
+ mesq l("Before you go on any further, I wanna see the proof that you talked with her.");
+ next;
+ if (.@q != 8) {
+ mesc l("You don't know what sort of proof he is looking for.");
+ break;
+ }
+
+ select
+ l("She has white hair, blue eyes, and always carry a big sack."),
+ l("She told me a passphrase.");
+ mes "";
+ if (@menu == 2) {
+ mesn;
+ mesq l("Liar; Nunia is not creative enough to come up with a passphrase of her own!");
+ next;
+ mesn;
+ mesq l("Besides, if she could give you a passphrase, then I wouldn't have sent ya.");
+ break;
+ }
+
+ mesn;
+ mesq l("That's Nunia alright. So how she is doing?");
+ next;
+ mesc l("You describe to him how Nunia is supposed to lay low for a while.");
+ next;
+ mesn;
+ mesq l("Of course. I'm glad she is safe. You know, we don't really care with this Legion versus Brotherhood stifle.");
+ next;
+ mesn;
+ mesq l("The brotherhood members here are friendly, but mostly because our interests coincide. In Hurnscald, where their main base is, we're enemies.");
+ next;
+ inventoryplace Lockpicks, 5;
+ mesn;
+ mesq l("Anyway, thanks for the report. I'll give you some %s.", getitemlink(Lockpicks));
+ next;
+ mesn;
+ mesq l("Whenever you find a vault, a door, or anything of interest, you can use it to pry it open.");
+ next;
+ mesn;
+ mesq l("Lockpicks are not keys, they can break quite easily. Also, you don't want anyone watching you.");
+ next;
+ mesn;
+ mesq l("If you are caught while lockpicking, you'll be arrested. So be careful.");
+ // TODO: Add a lock here where player can train without being arrested.
+ next;
+ mesn;
+ mesq l("I have other matters to attend do, so you'll have to excuse me.");
+ getitem Lockpicks, 5;
+ setq1 ThiefQuests_Artis, 9;
+ break;
+ }
+ return;
+}
+
+///////////////////////////////////////////////////////
+function completedHenry {
+ mesc l("He seems to ignore you.");
+ mesc l("Probably better not disturb him.");
+ return;
+}
+
+
+///////////////////////////////////////////////////////
+OnInit:
+ .sex = G_MALE;
+ .distance = 3;
+ end;
+
+OnGiantMaggot:
+ .@q=getq(ThiefQuests_Artis);
+ .@q2=getq2(ThiefQuests_Artis);
+ .@max=(.@q == 1 ? true : (.@q == 4 ? true : false));
+
+ // To drop, or not to drop...?
+ if (!.@q2 && .@max) {
+ if (rand2(10000) < 1800) {
+ getitem Gearwheel, 1;
+ setq2 ThiefQuests_Artis, true;
+ }
+ }
+
+ // Eh, whatever, continue with what you were doing, script.
+ fix_mobkill(GiantMaggot);
+ end;
+}
+
diff --git a/npc/008-3-5/_import.txt b/npc/008-3-5/_import.txt
index 55e17985..5113781e 100644
--- a/npc/008-3-5/_import.txt
+++ b/npc/008-3-5/_import.txt
@@ -2,3 +2,4 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
"npc/008-3-5/_mobs.txt",
"npc/008-3-5/_warps.txt",
+"npc/008-3-5/nunia.txt",
diff --git a/npc/008-3-5/nunia.txt b/npc/008-3-5/nunia.txt
new file mode 100644
index 00000000..f87a32d9
--- /dev/null
+++ b/npc/008-3-5/nunia.txt
@@ -0,0 +1,82 @@
+// Evol scripts.
+// Author:
+// Micksha
+// Description:
+// Nunia, Henry's friend and Woodland's master thief.
+// THIS IS A PLACEHOLDER!
+
+008-3-5,50,35,0 script Nunia NPC_NUNIA,{
+ function nuniaIntruder;
+ function nuniaHenry;
+ function nuniaBegin;
+
+ // What do we have here?
+ .@q=getq(ThiefQuests_Artis);
+ switch (.@q) {
+ case 7:
+ nuniaHenry();
+ break;
+ case 8:
+ case 9:
+ nuniaBegin();
+ // TODO: Script control; Transfer quest variable authority
+ break;
+ default:
+ nuniaIntruder();
+ break;
+ }
+ close;
+
+///////////////////////////////////////////////////////////////////////////////
+function nuniaIntruder {
+ speech
+ l("Who dares to enter this cave? Who are you?"),
+ l("At least, you look peaceful."),
+ lg("Let's do like this: You leave me alone, and I don't mess with you. Deal?");
+ select
+ l("Deal."),
+ l("No deal, I'm going to report you to authorities!");
+ mes "";
+ // Some meta option/dialog to improve the immersion
+ if (@menu == 2) {
+ mesn;
+ mesq l("There's only one problem, you know...");
+ next;
+ mesn;
+ mesq l("The dead can't speak.");
+ percentheal -100, -100;
+ }
+ return;
+}
+
+function nuniaHenry {
+ mesn;
+ mesq l("Your smell... Did Henry sent you here? How cute of him!");
+ next;
+ mesn;
+ mesq l("I've raised too much suspicion, so my friends told me to lay low for a while.");
+ next;
+ mesn;
+ mesq l("The Brotherhood is watching our movements, they already suspect who is a member and who isn't, but they don't know for sure.");
+ next;
+ mesn;
+ mesq l("Therefore, we had to cut off our connection with Artis. Don't want Brotherhood to find the secrets of our structure.");
+ setq1 ThiefQuests_Artis, 8;
+ return;
+}
+
+function nuniaBegin {
+ speech
+ l("Who dares to enter this cave? Who are you?"),
+ l("At least, you look peaceful. And I see by your fingers that you can deal with lockpicks."),
+ l("I am going to teach you all what a thief needs to know, later"),
+ l("Call for Micksha and Jesusalva to implement all this, please."),
+ l("And Tezer, our president in Tulimshar, should be able to give you even more training.");
+ return;
+}
+
+OnInit:
+ .sex = G_FEMALE;
+ .distance = 2;
+ end;
+}
diff --git a/npc/012-3-3/_mobs.txt b/npc/012-3-3/_mobs.txt
index f2da13cd..1d281763 100644
--- a/npc/012-3-3/_mobs.txt
+++ b/npc/012-3-3/_mobs.txt
@@ -1,7 +1,7 @@
// This file is generated automatically. All manually added changes will be removed when running the Converter.
// Map 012-3-3: Mana Tree Cave mobs
012-3-3,40,28,13,3 monster Green Slime 1024,4,20000,75000
-012-3-3,41,55,15,31 monster Crafty 1018,7,2500,35000
+012-3-3,41,53,15,31 monster Crafty 1018,7,2500,35000
012-3-3,36,35,9,7 monster Mana Bug 1035,5,10000,10000
012-3-3,42,39,8,12 monster Silkworm 1040,5,3000,6000
012-3-3,42,35,7,6 monster Moubi 1072,1,500000,1000000
diff --git a/npc/_import.txt b/npc/_import.txt
index cf56b97e..dfe1ab2b 100644
--- a/npc/_import.txt
+++ b/npc/_import.txt
@@ -48,6 +48,7 @@
@include "npc/001-2-40/_import.txt"
@include "npc/001-2-41/_import.txt"
@include "npc/001-2-42/_import.txt"
+@include "npc/001-2-43/_import.txt"
@include "npc/001-2-5/_import.txt"
@include "npc/001-2-6/_import.txt"
@include "npc/001-2-7/_import.txt"
diff --git a/npc/commands/debug-quest.txt b/npc/commands/debug-quest.txt
index 34bdf63b..868b807c 100644
--- a/npc/commands/debug-quest.txt
+++ b/npc/commands/debug-quest.txt
@@ -81,7 +81,8 @@ function script GlobalQuestDebug {
"Lloyd", ArtisQuests_Lloyd,
l("Mona's dad"), ArtisQuests_MonaDad,
l("Artis legion progress"), Artis_Legion_Progress,
- l("Legion training"), ArtisQuests_TrainingLegion;
+ l("Legion training"), ArtisQuests_TrainingLegion,
+ "Henry", ThiefQuests_Artis;
switch (@menuret)
{
diff --git a/npc/functions/faction.txt b/npc/functions/faction.txt
new file mode 100644
index 00000000..19450df9
--- /dev/null
+++ b/npc/functions/faction.txt
@@ -0,0 +1,104 @@
+// The Mana World: rEvolt functions.
+// Authors:
+// Jesusalva
+// Description:
+// Faction utils
+// Factions:
+// THIEF / MAGE / LEGION / BROTHERHOOD
+// Variables:
+// FACTION_REP
+// Your reputation with the faction (ally, friendly, cordial, enemy, ...)
+// FACTION_EXP
+// Your personal experience (=skill with the faction dealings)
+// FACTION_RANK
+// Your "level" in the faction, a mix of both above.
+
+
+// Returns, based on a 1-5 range, the title for ranking systems (system guilds)
+// legionrank() / brotherrank() / thiefrank() / magerank()
+function script legionrank {
+ switch (LEGION_RANK) {
+ case 5: return l("Constable");
+ case 4: return l("Tengu");
+ case 3: return l("Terranite");
+ case 2: return l("Fluffy");
+ case 1: return l("Maggot");
+ case 0: return l("Citizen");
+ default: return l("Error");
+ }
+}
+function script brotherrank {
+ switch (BROTHERHOOD_RANK) {
+ case 5: return l("Administrator");
+ case 4: return l("Senior Developer");
+ case 3: return l("Game Master");
+ case 2: return l("Developer");
+ case 1: return l("Contributor");
+ case 0: return l("Citizen");
+ default: return l("Error");
+ }
+}
+function script thiefrank {
+ switch (THIEF_RANK) {
+ case 5: return l("Bandit Lord");
+ case 4: return l("Assassin");
+ case 3: return l("Rogue");
+ case 2: return l("Bandit");
+ case 1: return l("Thief");
+ case 0: return l("Citizen");
+ default: return l("Error");
+ }
+}
+function script magerank {
+ switch (MAGE_RANK) {
+ case 5: return l("Elder Mage");
+ case 4: return l("Great Mage");
+ case 3: return l("Arch Mage");
+ case 2: return l("Mage");
+ case 1: return l("Initiate");
+ case 0: return l("Citizen");
+ default: return l("Error");
+ }
+}
+
+// faction_addrep( faction, amount )
+// Returns a dialog which can be used with mesc() or dispbottom()
+function script faction_addrep {
+ .@fac$=strtoupper(getarg(0));
+ .@old=getd(.@fac$+"_REP");
+ setd(.@fac$+"_REP", .@old+getarg(1));
+ if (getarg(1) > 0)
+ return l("Reputation with %s Faction UP (+%d)!", getarg(0), getarg(1));
+ else
+ return l("Reputation with %s Faction DOWN (%d)!", getarg(0), getarg(1));
+
+ return;
+}
+
+// Returns standing with faction (THIEF/MAGE/LEGION/BROTHERHOOD)
+// An integer from 3 (ally) to -3 (enemy). Standings based on Hands of War;
+// faction_standing( faction{, integer=True} )
+function script faction_standing {
+ .@fac$=strtoupper(getarg(0));
+ .@ret=getarg(1, true);
+ .@rep=getd(.@fac$+"_REP");
+ if (.@rep > 1000) {
+ return (.@ret ? 3 : "Ally"); // 1001 ~ inf.
+ } else if (.@rep > 500) {
+ return (.@ret ? 2 : "Friendly"); // 501 ~ 1000
+ } else if (.@rep > 100) {
+ return (.@ret ? 1 : "Cordial"); // 101 ~ 500
+ } else if (.@rep >= -100) {
+ return (.@ret ? 0 : "Neutral"); // -100 ~ +100
+ } else if (.@rep > -500) {
+ return (.@ret ? -1 : "Unfriendly"); // -101 ~ -500
+ } else if (.@rep > -1000) {
+ return (.@ret ? -2 : "Enemy"); // -501 ~ -1000
+ } else {
+ return (.@ret ? -3 : "Nemesis"); // -1001 ~ inf
+ }
+
+}
+// TODO: faction_checklvup()
+
+
diff --git a/npc/functions/lockpicks.txt b/npc/functions/lockpicks.txt
new file mode 100644
index 00000000..6a3c55f7
--- /dev/null
+++ b/npc/functions/lockpicks.txt
@@ -0,0 +1,193 @@
+// TMW2/LoF Script
+// Author:
+// Jesusalva
+// Description:
+// Lockpicking core
+
+// Important variables:
+// THIEF_EXP
+// Experience on Thief Tree
+// THIEF_RANK
+// Position on the Thief Tree
+
+// LockPicking(num_pins, max_pins, min_rank=num_pins)
+// Returns 0 upon failure, 1 upon success
+// Closes script if an error happen or if you give up / cannot try.
+//
+// The 'next' is upon script responsability
+// Maximum pin number is infinite. Maximum Pin Positiors range from 2~5.
+// If you fail, you can end up having to start again. If you fail too much,
+// you'll be caught!
+function script LockPicking {
+ // If you don't have a LockPick, you can't do this (useless)
+ if (!countitem(Lockpicks)) {
+ mesc l("You need a @@ to try this.", getitemlink(Lockpicks)), 1;
+ close;
+ }
+
+ .@d=getarg(0,1);
+ .@m=getarg(1,3);
+ .@minrank=getarg(2, .@d);
+
+ // Invalid Argument (kill script)
+ if (.@d < 1 || .@m < 2 || .@m > 5)
+ end;
+
+ // You must be rank (number of locks - 1) to try
+ if (THIEF_RANK+1 < .@minrank) {
+ mesc l("This lock is beyond your current capacity."), 1;
+ close;
+ }
+
+ // Create @pins array (the answer)
+ for (.@i=0; .@i < .@d;.@i++)
+ @pins[.@i] = rand2(1,.@m);
+
+ // Check if you'll try to open it.
+ mesc l("This lock is simple, maybe with your thief skills you can manage to pry it open. But beware, you can end up in jail!");
+ mesc l("Will you try to unlock it?");
+ if (askyesno() == ASK_NO)
+ close;
+
+ // Setup your attempt
+ delitem Lockpicks, 1;
+ @pos=0;
+ @chance=min(.@d*.@m-1, THIEF_RANK+.@d);
+ mesc l("You insert the hook pick inside the lock, and, without applying any tension, you discover there are only @@ pins to set.", .@d);
+
+ // You have as many attempts as pins and appliable strenghts.
+ // Each thief rank grants you an extra attempt.
+ // Each pin takes one attempt.
+ // It's not multiplied, so 3 pins with 3 positions: 6 chances, 9 possibilities.
+ // There's no penalty, but the attempt is counted working or not!
+ // Remember if you fail, all previous pins will be cleared (@pos)
+ do {
+ mesc l("You are trying to open the @@th pin. What will to do?", @pos+1);
+
+ menuint
+ rif(.@m >= 4, l("Apply no pressure")), 4,
+ rif(.@m >= 2, l("Apply soft pressure")), 2,
+ rif(.@m >= 1, l("Apply normal pressure")), 1,
+ rif(.@m >= 3, l("Apply strong pressure")), 3,
+ rif(.@m >= 5, l("Apply very strong pressure")), 5,
+ l("Give up!"), 0;
+
+ if (!@menuret) {
+ // 50% chance to save the lockpick
+ if (rand2(2) == 1)
+ getitem Lockpicks, 1;
+ else
+ dispbottom l("The lockpick broke.");
+ close;
+ }
+
+ // Is your guess correct?
+ if (@pins[@pos] == @menuret) {
+ mesc l("*click*");
+ @pos+=1;
+ } else {
+ mesc l("This didn't work. All pins are now unset!");
+ @pos=0;
+ @chance-=1;
+ // We don't need to clear console, each successful attempt IS counted.
+ // Therefore, unsetting 3 pins means you must do 3 new attempts!!
+ // The biggie is that you're running against time, here!!!
+ if (@chance < .@d && rand2(0, THIEF_RANK))
+ mesc l("Your thief instincts suggest you to hurry."), 1;
+ }
+
+ if (@chance <= 0)
+ break;
+
+ if (@pos >= .@d) {
+ // 33% chance to save the lockpick
+ if (rand2(3) == 1)
+ getitem Lockpicks, 1;
+ else
+ dispbottom l("The lockpick broke.");
+
+ // Get EXP and inform the success
+ if (THIEF_RANK)
+ THIEF_EXP += max(0, .@d*.@m-THIEF_RANK);
+ return 1;
+ }
+ } while (true);
+
+ // Failed
+ if (THIEF_RANK)
+ THIEF_EXP += 1;
+ return 0;
+}
+
+// Script helper to say if you were arrested or not
+function script ArrestedChances {
+ .@runaway=cap_value(readbattleparam(getcharid(3), UDT_LUK)+readbattleparam(getcharid(3), UDT_AGI), 0, 200); // 20%
+ .@runaway+=125; // 12.5% base chance
+ .@runaway+=cap_value(THIEF_RANK*15, 0, 100); // real max 7.5%
+ // Max runaway chance: 40%
+ if (rand2(1000) < .@runaway)
+ return false;
+ return true;
+}
+
+// Script helper to actually arrest you. TODO: Arrest anyone
+// ArrestPlayer ( time-in-minutes )
+function script ArrestPlayer {
+ .@t=getarg(0);
+
+ // We can't do anything without a player o.o
+ if (!playerattached())
+ return;
+
+ // You're already jailed so we do nothing and fail silently
+ if (getstatus(SC_JAILED)) {
+ return;
+ }
+
+ // Okay, we can arrest you
+ // TODO: Arrest player, preferably without GM commands D:
+ // (would then take an extra argument: map)
+ atcommand("@jailfor "+.@t+"mn "+strcharinfo(0));
+
+ // Notification
+ dispbottom l("You were arrested; Use %s for information about how long you will spend here.", b("@jailtime"));
+ return;
+}
+
+/*
+// Main script from Moubootaur Legends Vaults
+// LootableVault(tier, level, variable)
+function script LootableVault {
+ .@tier=getarg(0)+1;
+ .@level=getarg(1);
+ .@var$=getarg(2);
+ mesn;
+ mesq l("There's a shiny safe here. How much money is inside? Nobody is looking at you, great!");
+ // 2*3 = 6 possibilities, 5 attempts
+ if (LockPicking(.@tier, .@level)) {
+ Zeny=Zeny+getd("$VAULT_"+.@var$);
+ setd("$VAULT_"+.@var$, 40);
+ mesn;
+ mesq l("Booty!");
+ } else {
+ mesn;
+ .@inch=(Zeny/100);
+ Zeny-=.@inch;
+ setd("$VAULT_"+.@var$, getd("$VAULT_"+.@var$)+.@inch);
+ if (ArrestedChances()) {
+ mesc l("Arrested!");
+ atcommand("@jailfor 5mn "+strcharinfo(0));
+ } else {
+ if (is_night())
+ .@p$=l("The darkness of night gives you cover.");
+ else
+ .@p$=l("Your agile legs and sheer luck allows you to outrun the cops.");
+ mesc l("You run as far as you could. %s", .@p$);
+ warp "000-1", 22, 22;
+ }
+ }
+ return;
+}
+*/
+
+
diff --git a/npc/functions/quest-debug/019-ArtisQuests_LazyBrother.txt b/npc/functions/quest-debug/020-ArtisQuests_LazyBrother.txt
index 41733adf..11cf3a44 100644
--- a/npc/functions/quest-debug/019-ArtisQuests_LazyBrother.txt
+++ b/npc/functions/quest-debug/020-ArtisQuests_LazyBrother.txt
@@ -2,7 +2,7 @@
// Author:
// gumi
-function script QuestDebug19 {
+function script QuestDebug20 {
do
{
clear;
diff --git a/npc/functions/quest-debug/020-ArtisQuests_Urchin.txt b/npc/functions/quest-debug/021-ArtisQuests_Urchin.txt
index 3a092e47..486cae18 100644
--- a/npc/functions/quest-debug/020-ArtisQuests_Urchin.txt
+++ b/npc/functions/quest-debug/021-ArtisQuests_Urchin.txt
@@ -2,7 +2,7 @@
// Author:
// gumi
-function script QuestDebug20 {
+function script QuestDebug21 {
do
{
clear;
diff --git a/npc/functions/quest-debug/021-ArtisQuests_CatchPiou.txt b/npc/functions/quest-debug/022-ArtisQuests_CatchPiou.txt
index f9c45339..9d5afc1c 100644
--- a/npc/functions/quest-debug/021-ArtisQuests_CatchPiou.txt
+++ b/npc/functions/quest-debug/022-ArtisQuests_CatchPiou.txt
@@ -2,7 +2,7 @@
// Author:
// gumi
-function script QuestDebug21 {
+function script QuestDebug22 {
do
{
clear;
diff --git a/npc/functions/quest-debug/022-ArtisQuests_Fishman.txt b/npc/functions/quest-debug/023-ArtisQuests_Fishman.txt
index 0a193e6f..e3b5ac2e 100644
--- a/npc/functions/quest-debug/022-ArtisQuests_Fishman.txt
+++ b/npc/functions/quest-debug/023-ArtisQuests_Fishman.txt
@@ -2,7 +2,7 @@
// Author:
// gumi
-function script QuestDebug22 {
+function script QuestDebug23 {
do
{
clear;
diff --git a/npc/functions/quest-debug/023-ArtisQuests_QOnan.txt b/npc/functions/quest-debug/024-ArtisQuests_QOnan.txt
index 02eaa8f6..702ef9be 100644
--- a/npc/functions/quest-debug/023-ArtisQuests_QOnan.txt
+++ b/npc/functions/quest-debug/024-ArtisQuests_QOnan.txt
@@ -2,7 +2,7 @@
// Author:
// gumi
-function script QuestDebug23 {
+function script QuestDebug24 {
do
{
clear;
diff --git a/npc/functions/quest-debug/035-ThiefQuests_Artis.txt b/npc/functions/quest-debug/035-ThiefQuests_Artis.txt
new file mode 100644
index 00000000..83f9fb9c
--- /dev/null
+++ b/npc/functions/quest-debug/035-ThiefQuests_Artis.txt
@@ -0,0 +1,38 @@
+// Artis Thieves quest debug
+// Author:
+// Jesusalva
+// Field 2: Internal use (gearwheels - odd: collected; even: used)
+// Field 3: Internal use (Archive where the file is)
+
+function script QuestDebug35 {
+ do
+ {
+ clear;
+ setnpcdialogtitle l("Quest debug");
+ mes "ThiefQuests_Artis";
+ mes "---";
+ mes l("Quest state: @@", getq(ThiefQuests_Artis));
+ .@q2=getq2(ThiefQuests_Artis);
+ mesf ("Gearwheels: %d (%s)", .@q2/2, (.@q2 % 2 ? "found" : "not found"));
+ mesf ("Henry's file: %d", getq3(ThiefQuests_Artis));
+ next;
+
+ GenericQuestDebug ThiefQuests_Artis,
+ ("Does not have the quest"), 0,
+ ("Accepted Townhall Quest"), 1,
+ ("Townhall arc complete"), 2,
+ ("Reward taken"), 3,
+ ("Accepted Legion Quest"), 4,
+ ("Legion arc comlete"), 5,
+ ("Reward taken (2)"), 6,
+ ("Nunia Quest Accepted"), 7,
+ ("Nunia arc comlete"), 8,
+ ("Reward taken (3)"), 9;
+
+ if (@menuret < 0)
+ {
+ return;
+ }
+
+ } while (1);
+}
diff --git a/npc/functions/quest-debug/036-HurnscaldQuests_Hinnak.txt b/npc/functions/quest-debug/050-HurnscaldQuests_Hinnak.txt
index 61dc294e..31183eb8 100644
--- a/npc/functions/quest-debug/036-HurnscaldQuests_Hinnak.txt
+++ b/npc/functions/quest-debug/050-HurnscaldQuests_Hinnak.txt
@@ -2,7 +2,7 @@
// Author:
// gumi
-function script QuestDebug36 {
+function script QuestDebug50 {
do
{
clear;
diff --git a/npc/functions/quest-debug/037-HurnscaldQuests_Soup.txt b/npc/functions/quest-debug/051-HurnscaldQuests_Soup.txt
index 43eba0d6..44694f06 100644
--- a/npc/functions/quest-debug/037-HurnscaldQuests_Soup.txt
+++ b/npc/functions/quest-debug/051-HurnscaldQuests_Soup.txt
@@ -2,7 +2,7 @@
// Author:
// gumi
-function script QuestDebug37 {
+function script QuestDebug51 {
do
{
clear;
diff --git a/npc/functions/quest-debug/038-HurnscaldQuests_Inspector.txt b/npc/functions/quest-debug/052-HurnscaldQuests_Inspector.txt
index 053f085e..72d99242 100644
--- a/npc/functions/quest-debug/038-HurnscaldQuests_Inspector.txt
+++ b/npc/functions/quest-debug/052-HurnscaldQuests_Inspector.txt
@@ -2,7 +2,7 @@
// Author:
// gumi
-function script QuestDebug38 {
+function script QuestDebug52 {
do
{
clear;
diff --git a/npc/functions/quest-debug/039-HurnscaldQuests_ForestBow.txt b/npc/functions/quest-debug/053-HurnscaldQuests_ForestBow.txt
index c6a61a1b..2a0993e3 100644
--- a/npc/functions/quest-debug/039-HurnscaldQuests_ForestBow.txt
+++ b/npc/functions/quest-debug/053-HurnscaldQuests_ForestBow.txt
@@ -2,7 +2,7 @@
// Author:
// gumi
-function script QuestDebug39 {
+function script QuestDebug53 {
do
{
clear;
diff --git a/npc/functions/quest-debug/040-HurnscaldQuests_WoodenShield.txt b/npc/functions/quest-debug/054-HurnscaldQuests_WoodenShield.txt
index 05d08130..0cb3ee9d 100644
--- a/npc/functions/quest-debug/040-HurnscaldQuests_WoodenShield.txt
+++ b/npc/functions/quest-debug/054-HurnscaldQuests_WoodenShield.txt
@@ -2,7 +2,7 @@
// Author:
// gumi
-function script QuestDebug40 {
+function script QuestDebug54 {
do
{
clear;
diff --git a/npc/functions/quest-debug/041-General_Cooking.txt b/npc/functions/quest-debug/055-General_Cooking.txt
index 592df547..ed9fb685 100644
--- a/npc/functions/quest-debug/041-General_Cooking.txt
+++ b/npc/functions/quest-debug/055-General_Cooking.txt
@@ -2,7 +2,7 @@
// Author:
// Jesusalva
-function script QuestDebug41 {
+function script QuestDebug55 {
do
{
clear;
diff --git a/npc/functions/quest-debug/042-General_Brotherhood.txt b/npc/functions/quest-debug/056-General_Brotherhood.txt
index 3eb3683b..07fe568f 100644
--- a/npc/functions/quest-debug/042-General_Brotherhood.txt
+++ b/npc/functions/quest-debug/056-General_Brotherhood.txt
@@ -4,7 +4,7 @@
// monwarez
// jesusalva
-function script QuestDebug42 {
+function script QuestDebug56 {
do
{
clear;
diff --git a/npc/functions/quest-debug/028-General_Narrator.txt b/npc/functions/quest-debug/100-General_Narrator.txt
index 408668b7..22737c90 100644
--- a/npc/functions/quest-debug/028-General_Narrator.txt
+++ b/npc/functions/quest-debug/100-General_Narrator.txt
@@ -2,7 +2,7 @@
// Author:
// gumi
-function script QuestDebug28 {
+function script QuestDebug100 {
do
{
clear;
diff --git a/npc/functions/spotlight.txt b/npc/functions/spotlight.txt
index fb0c697e..219d3a31 100644
--- a/npc/functions/spotlight.txt
+++ b/npc/functions/spotlight.txt
@@ -76,7 +76,7 @@ OnTouch:
// npc/001-3-1/_warps.txt
001-3-1,24,58,0 duplicate(#SpotlightMaster) #SPOT001-3-1_24_58 NPC_HIDDEN,2,2
001-3-1,35,59,0 duplicate(#SpotlightMaster) #SPOT001-3-1_35_59 NPC_HIDDEN,2,2
-001-3-1,30,19,0 duplicate(#SpotlightMaster) #SPOT001-3-1_30_19 NPC_HIDDEN,2,2
+//001-3-1,30,19,0 duplicate(#SpotlightMaster) #SPOT001-3-1_30_19 NPC_HIDDEN,2,2
// npc/001-3-2/_warps.txt
001-3-2,30,117,0 duplicate(#SpotlightMaster) #SPOT001-3-2_30_117 NPC_HIDDEN,2,2
diff --git a/npc/functions/timer.txt b/npc/functions/timer.txt
index e79070f3..fbfec3fd 100644
--- a/npc/functions/timer.txt
+++ b/npc/functions/timer.txt
@@ -1,3 +1,10 @@
+// addtimer2(<tick>, "<npc>::<event>")
+function script addtimer2 {
+ deltimer(getarg(1));
+ addtimer(getarg(0), getarg(1));
+ return;
+}
+
// areatimer("<map>", <x1>, <y1>, <x2>, <y2>, <tick>, "<npc>::<event>")
function script areatimer {
.@c = getunits(BL_PC, .@players, false, getarg(0), getarg(1), getarg(2), getarg(3), getarg(4));
diff --git a/npc/items/shovel.txt b/npc/items/shovel.txt
index ac1cd50c..13aba25d 100644
--- a/npc/items/shovel.txt
+++ b/npc/items/shovel.txt
@@ -213,6 +213,7 @@ OnInit:
// Partial maps
AddDigRect("001-1", 172, 26, 200, 48);
+ AddDigRect("001-1", 198, 60, 201, 63);
AddDigRect("008-1-1", 32, 42, 46, 88);
AddDigRect("008-1-2", 40, 52, 114, 146);
AddDigRect("012-1", 44, 21, 139, 47);
@@ -270,7 +271,7 @@ function script shovel_getcity {
// else is not required (return prevails)
if (.@a$ == "001-1")
- return l("Artis Hills");
+ return l("Artis East Beach");
if (.@a$ == "008-1")
return l("East Woodlands");
if (.@a$ == "008-1-1")
diff --git a/npc/scripts.conf b/npc/scripts.conf
index f14c29d0..a42bd0b5 100644
--- a/npc/scripts.conf
+++ b/npc/scripts.conf
@@ -51,12 +51,16 @@
// May rely on custom functions and thus must be handled by last
"npc/functions/util.txt",
+"npc/functions/faction.txt",
"npc/functions/scoreboards.txt",
"npc/functions/manhole.txt",
"npc/functions/skills.txt",
+"npc/functions/lockpicks.txt",
// quest debug
"npc/functions/quest-debug/functions.txt",
+
+// Drasil Island
"npc/functions/quest-debug/000-ShipQuests_Julia.txt",
"npc/functions/quest-debug/001-ShipQuests_Arpan.txt",
"npc/functions/quest-debug/002-ShipQuests_Alige.txt",
@@ -65,7 +69,7 @@
"npc/functions/quest-debug/005-ShipQuests_Knife.txt",
"npc/functions/quest-debug/006-ShipQuests_ArpanMoney.txt",
"npc/functions/quest-debug/007-ShipQuests_Door.txt",
-// 008: ???
+"npc/functions/quest-debug/008-ShipQuests_Couwan.txt",
"npc/functions/quest-debug/009-ShipQuests_TreasureChest.txt",
"npc/functions/quest-debug/010-ShipQuests_Ale.txt",
"npc/functions/quest-debug/011-ShipQuests_Astapolos.txt",
@@ -76,30 +80,38 @@
"npc/functions/quest-debug/016-ShipQuests_Gugli.txt",
"npc/functions/quest-debug/017-ShipQuests_ChefGado.txt",
"npc/functions/quest-debug/018-General_Cookies.txt",
-"npc/functions/quest-debug/019-ArtisQuests_LazyBrother.txt",
-"npc/functions/quest-debug/020-ArtisQuests_Urchin.txt",
-"npc/functions/quest-debug/021-ArtisQuests_CatchPiou.txt",
-"npc/functions/quest-debug/022-ArtisQuests_Fishman.txt",
-"npc/functions/quest-debug/023-ArtisQuests_QOnan.txt",
-// 024: removed quest (Halloween_VisitArtis)
-// 025: removed quest (Halloween_BarrelQuest)
+
+// Artis Town
+"npc/functions/quest-debug/020-ArtisQuests_LazyBrother.txt",
+"npc/functions/quest-debug/021-ArtisQuests_Urchin.txt",
+"npc/functions/quest-debug/022-ArtisQuests_CatchPiou.txt",
+"npc/functions/quest-debug/023-ArtisQuests_Fishman.txt",
+"npc/functions/quest-debug/024-ArtisQuests_QOnan.txt",
+// 025: ID AVAILABLE
"npc/functions/quest-debug/026-General_Rumly.txt",
"npc/functions/quest-debug/027-ArtisQuests_Enora.txt",
-"npc/functions/quest-debug/028-General_Narrator.txt",
+// 028: ID AVAILABLE
"npc/functions/quest-debug/029-ArtisQuests_Fexil.txt",
"npc/functions/quest-debug/030-ArtisQuests_Lloyd.txt",
"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",
"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",
-"npc/functions/quest-debug/038-HurnscaldQuests_Inspector.txt",
-"npc/functions/quest-debug/039-HurnscaldQuests_ForestBow.txt",
-"npc/functions/quest-debug/040-HurnscaldQuests_WoodenShield.txt",
-"npc/functions/quest-debug/041-General_Cooking.txt",
-"npc/functions/quest-debug/042-General_Brotherhood.txt",
+"npc/functions/quest-debug/035-ThiefQuests_Artis.txt",
+
+// Argaes Quests
+"npc/functions/quest-debug/050-HurnscaldQuests_Hinnak.txt",
+"npc/functions/quest-debug/051-HurnscaldQuests_Soup.txt",
+"npc/functions/quest-debug/052-HurnscaldQuests_Inspector.txt",
+"npc/functions/quest-debug/053-HurnscaldQuests_ForestBow.txt",
+"npc/functions/quest-debug/054-HurnscaldQuests_WoodenShield.txt",
+"npc/functions/quest-debug/055-General_Cooking.txt",
+"npc/functions/quest-debug/056-General_Brotherhood.txt",
+
+// Event and General Quests
+"npc/functions/quest-debug/100-General_Narrator.txt",
+// 101: removed quest (Halloween_VisitArtis)
+// 102: removed quest (Halloween_BarrelQuest)
// Item functions
"npc/items/cookie.txt",