diff options
Diffstat (limited to 'npc')
47 files changed, 1330 insertions, 41 deletions
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", |