From 29fd79e3264346a6f3623020036a2e2a5fa7011f Mon Sep 17 00:00:00 2001
From: Ben Longbons <b.r.longbons@gmail.com>
Date: Fri, 26 Aug 2011 21:06:53 -0700
Subject: Fix and comment fluffy hunting quest

---
 world/map/db/const.txt          |   2 +-
 world/map/npc/033-1/_import.txt |   1 +
 world/map/npc/033-1/kimarr.txt  | 113 +++++++++++++++++++++++++++++++---------
 world/map/npc/scripts.conf      |   1 +
 4 files changed, 90 insertions(+), 27 deletions(-)

(limited to 'world')

diff --git a/world/map/db/const.txt b/world/map/db/const.txt
index d4a441fa..b5f30d9a 100644
--- a/world/map/db/const.txt
+++ b/world/map/db/const.txt
@@ -389,4 +389,4 @@ OPT_STORAGE_CLOSE 1
 OPT_BANK_CLOSE 2
 
 // currently used by the fluffy hunt (033-1)
-MAX_HIGHSCORES 10
+MAX_HIGH_SCORES 10
diff --git a/world/map/npc/033-1/_import.txt b/world/map/npc/033-1/_import.txt
index 0099a368..eb257c24 100644
--- a/world/map/npc/033-1/_import.txt
+++ b/world/map/npc/033-1/_import.txt
@@ -4,5 +4,6 @@ map: 033-1.gat
 npc: npc/033-1/_mobs.txt
 npc: npc/033-1/_warps.txt
 npc: npc/033-1/birrod.txt
+npc: npc/033-1/debug.txt
 npc: npc/033-1/kimarr.txt
 npc: npc/033-1/yerrnk.txt
diff --git a/world/map/npc/033-1/kimarr.txt b/world/map/npc/033-1/kimarr.txt
index 29113769..fd9dc124 100644
--- a/world/map/npc/033-1/kimarr.txt
+++ b/world/map/npc/033-1/kimarr.txt
@@ -1,13 +1,35 @@
 // Fluffy hunting quest
+// initially by Jenalya
+// more by alastrim
+// broken by o11c, then fixed
 
 // Variables:
 // global $@Fluffy_Hunting - state of the quest
 //      0: nobody is hunting
 //      1: somebody is in there but hasn't dropped anything OR (buggily?) all monster have been killed
-//      2: somebody is in there and has dropped something
+//      2: not used anymore, was: food dropped but no spawn yet
 //      3: monsters have been spawned
 // global $@Fluffy_Time - the number of seconds since you entered the area
-// global
+// global $@Fluffy_Spawn - how many fluffies have been spawned
+// global $@Fluffy_Kills - how many fluffies you have killed so far
+// global $@Fluffy_Min - how many fluffies you have to kill to get a reward
+// global $@Fluffy_PC_Deaths - used to keep track of whether the fluffies kill you
+// global $@Fluffy_Fighter$ - name of the person hunting fluffies (only used for ornamentation)
+// global $@Fluffy_FighterID - ID of the person hunting fluffies
+// nibble 0 of QUEST_Barbarians - state for this and adjacent NPCs
+//      0: haven't talked about it
+//      1: heard about it
+//      2: finished quest
+//      3: got reward
+
+// Note: if you're going to reenable the "drop multiple times" feature
+// 1: please do it every second, not just once you've killed everything
+// 2: you should change $@Fluffy_Spawn to $@Fluffy_Alive and decrement it on kills
+// 3: add a variable to spawn more fluffies if you drop more than 100 apples, as you kill them
+
+// Also, the $@Fluffy_Extra behaviour should be reconsidered (hardly anything spawns ...)
+// that's the only reason I didn't make that one a local variable like it really is
+
 
 033-1.gat,74,32,0|script|Kimarr|218,{
     if ($@Fluffy_FighterID == getcharid(3))
@@ -74,18 +96,38 @@ L_Ask:
         "Maybe later.", -;
     goto L_Close;
 
+L_AlreadyGotReward:
+    callsub S_Clean;
+    mes "Once again you prove your worth as a hunter, " + strcharinfo(0);
+    goto L_Close;
+
+L_Reward1:
+    if (@state >= 2)
+        goto L_AlreadyGotReward;
+
+    set @state, 2;
+    callsub S_Update_Mask;
+    callsub S_Clean;
+
+    // as far as I can tell, this fails because it won't resume from the "next"
+    // when the script is executed via the "OnFluffyDeath" callback
+    // (I haven't tried via the 301st call of OnTimer1000)
+    message "Kimarr: talk to me for your reward";
+    goto L_Close;
+
 // this label is reached on completion of the quest, or, if you inventory was
 // full at the time, when you next initiate dialog (with @state == 2)
 L_Reward:
     mes "[Kimarr]";
-    mes "That was very impressive - now you can call yourself a hunter, " + strcharinfo(0) + ".";
+    mes "\"That was very impressive - now you can call yourself a hunter, " + strcharinfo(0) + ".\"";
     next;
 
     getinventorylist;
     if (@inventorylist_count == 100)
         goto L_Full_Inv;
+    set @inventorylist_count, 0;
     mes "[Kimarr]";
-    mes "Take this as a symbol of your strength. You're a member of our tribe now.";
+    mes "\"Take this as a symbol of your strength. You're a member of our tribe now.\"";
     getitem "YetiSkinShirt", 1;
     set @state, 3;
     callsub S_Update_Mask;
@@ -94,7 +136,7 @@ L_Reward:
 
 L_Full_Inv:
     mes "[Kimarr]";
-    mes "You can't carry the reward I want to give you.";
+    mes "\"You can't carry the reward I want to give you.\"";
     goto L_Close;
 
 // dialog starts here after you've completed this quest
@@ -117,7 +159,8 @@ L_Game:
     set $@Fluffy_Time, 0;
 
 //TODO: set minimum number of killed fluffies (maybe based on level?)
-    set $@Fluffy_Min, 1;
+    // Make sure it is more than 1 to avoid grammar issues "%d fluffies killed"
+    set $@Fluffy_Min, 2;
     warp "033-1.gat", 79, 34;
     initnpctimer;
     goto L_Close;
@@ -165,23 +208,22 @@ L_Died:
     end;
 
 L_TimeOver:
-    warp "033-1.gat", 77, 34;
     message strcharinfo(0), "Your time is over.";
     goto L_MaybeRecordScore;
 
 L_CheckDrops:
     if ($@Fluffy_Time > 15)
         goto L_DidntDrop;
-    set $@Fluffy_RedApple,      getareadropitem("033-1.gat", 79, 29, 88, 42, "RedApple", 1);
-    set $@Fluffy_XmasCake,      getareadropitem("033-1.gat", 79, 29, 88, 42, "XmasCake", 1);
-    set $@Fluffy_Cake,          getareadropitem("033-1.gat", 79, 29, 88, 42, "Cake", 1);
-    set $@Fluffy_GreenApple,    getareadropitem("033-1.gat", 79, 29, 88, 42, "GreenApple", 1);
-    if ($@Fluffy_RedApple || $@Fluffy_XmasCake || $@Fluffy_Cake || $@Fluffy_GreenApple)
+    set @Fluffy_RedApple,      getareadropitem("033-1.gat", 79, 29, 88, 42, "RedApple", 1);
+    set @Fluffy_XmasCake,      getareadropitem("033-1.gat", 79, 29, 88, 42, "XmasCake", 1);
+    set @Fluffy_Cake,          getareadropitem("033-1.gat", 79, 29, 88, 42, "Cake", 1);
+    set @Fluffy_GreenApple,    getareadropitem("033-1.gat", 79, 29, 88, 42, "GreenApple", 1);
+    if (@Fluffy_RedApple || @Fluffy_XmasCake || @Fluffy_Cake || @Fluffy_GreenApple)
         goto L_BeginHunting;
     goto L_ContinueTimer;
 
 L_BeginHunting:
-    set $@Fluffy_Spawn, $@Fluffy_RedApple + 5 * $@Fluffy_XmasCake + 3 * $@Fluffy_Cake + $@Fluffy_GreenApple;
+    set $@Fluffy_Spawn, @Fluffy_RedApple + 5 * @Fluffy_XmasCake + 3 * @Fluffy_Cake + @Fluffy_GreenApple;
     // limit the number of monsters that can be spawned, to prevent people creating lag with massive amount of monsters
     if ($@Fluffy_Spawn > 100)
         set $@Fluffy_Spawn, 100;
@@ -192,7 +234,7 @@ L_BeginHunting:
     areamonster "033-1.gat", 79, 29, 88, 42, "", 1020, $@Fluffy_Spawn, "Kimarr::OnFluffyDeath";
 
     // other monsters don't generate a real event
-    set $@Fluffy_Extra, 5 * $@Fluffy_XmasCake + 3 * $@Fluffy_Cake + 10 * BaseLevel;
+    set $@Fluffy_Extra, 5 * @Fluffy_XmasCake + 3 * @Fluffy_Cake + 10 * BaseLevel;
     if ((BaseLevel > 40) && (rand($@Fluffy_Extra) > 500)) // Ice Goblin
         areamonster "033-1.gat", 79, 29, 88, 42, "", 1058, 1, "Kimarr::OnOtherDeath";
     if ((BaseLevel > 60) && (rand($@Fluffy_Extra) > 550)) // Santa Slime
@@ -202,20 +244,27 @@ L_BeginHunting:
         areamonster "033-1.gat", 79, 29, 88, 42, "", 1072, 1, "Kimarr::OnOtherDeath";
 
     set $@Fluffy_Extra, 0;
-    set $@Fluffy_RedApple, 0;
-    set $@Fluffy_XmasCake, 0;
-    set $@Fluffy_Cake, 0;
-    set $@Fluffy_GreenApple, 0;
+    set @Fluffy_RedApple, 0;
+    set @Fluffy_XmasCake, 0;
+    set @Fluffy_Cake, 0;
+    set @Fluffy_GreenApple, 0;
     set $@Fluffy_Hunting, 3;
 
     goto L_ContinueTimer;
 
+OnOtherDeath:
+    // nothing happens
+    end;
+
 OnFluffyDeath:
     set $@Fluffy_Kills, $@Fluffy_Kills + 1;
     //TODO: remove announce after debugging
     //mapannounce "033-1.gat", "fluffies killed: " + $@Fluffy_Kills, 0;
-    if ($@Fluffy_Kills >= $@Fluffy_Spawn)
+    if ($@Fluffy_Kills < $@Fluffy_Spawn)
+        end;
+    if (attachrid($@Fluffy_FighterID))
         goto L_MaybeRecordScore;
+    goto L_GotOut;
     end;
 
 L_DidntDrop:
@@ -226,6 +275,7 @@ L_DidntDrop:
     goto L_Close;
 
 S_Clean:
+    stopnpctimer;
     killmonster "033-1.gat", "Kimarr::OnOtherDeath";
     killmonster "033-1.gat", "Kimarr::OnFluffyDeath";
     set $@Fluffy_Hunting, 0;
@@ -235,20 +285,19 @@ S_Clean:
     set $@Fluffy_FighterID, 0;
     set $@Fluffy_Kills, 0;
     set $@Fluffy_Spawn, 0;
-    stopnpctimer;
     return;
 
 L_MaybeRecordScore:
-    callsub S_Clean;
+    warp "033-1.gat", 77, 34;
     if ($@Fluffy_Kills < $@Fluffy_Min)
-        goto L_ShowRecord;
+        goto L_NotGoodEnough;
     set @rank, 0;
 L_MaybeInsertNext:
     if ($@Fluffy_Kills > $Record_Fluffy_Kills[@rank])
         goto L_InsertScore;
     set @rank, @rank + 1;
     if (@rank == MAX_HIGH_SCORES)
-        goto L_ShowRecord;
+        goto L_Reward1;
     goto L_MaybeInsertNext;
 
 L_InsertScore:
@@ -280,20 +329,32 @@ L_FinallyInsertMe:
     set $Record_Fluffy_Date$[@rank], @ts_date$ + " " + @ts_time$;
     set @ts_date$, "";
     set @ts_time$, "";
+    goto L_Reward1;
+
+L_NotGoodEnough:
+    callsub S_Clean;
 
 L_ShowRecord:
     set @rank, 0;
     set @loop, 0;
 L_ShowNextRecord:
-    if (! $Record_Fluffy_Kills[@loop])
+    if ($Record_Fluffy_Kills[@loop] == 0)
         goto L_Close;
-    mes (@loop + 1) + " - " + $Record_Fluffy_Name$[@loop] + " - " + $Record_Fluffy_Kills[@loop] + " fluffies killed in " + $Record_Fluffy_Date$[@loop];
+    mes (@loop + 1) + " - " + $Record_Fluffy_Name$[@loop] + " - " + $Record_Fluffy_Kills[@loop] + " fluffies killed at " + $Record_Fluffy_Date$[@loop];
     set @loop, @loop + 1;
     goto L_ShowNextRecord;
 
 L_Close:
-    // TODO: clear all temporary player variables that are not otherwise cleared
+    // clear all temporary player variables that are not otherwise cleared
+
+    // it is not feasible to otherwise clear @loop
+    // but, not all jumpers to L_Close have necessarily used it ...
+    // still, I think it's a good precent to ALWAYS exit via L_Close
     set @loop, 0;
+
+    // if you unset @state, @Q_Barbarians_MASK or @Q_Barbarians_SHIFT, it might break the script
+    // If only we had the concept of "local constants" ...
+
     close;
 
 S_Update_Mask:
diff --git a/world/map/npc/scripts.conf b/world/map/npc/scripts.conf
index 8d07ff18..c8239d27 100644
--- a/world/map/npc/scripts.conf
+++ b/world/map/npc/scripts.conf
@@ -14,6 +14,7 @@ npc: npc/functions/process_equip.txt
 npc: npc/functions/slot_machine.txt
 npc: npc/functions/soul_menhir.txt
 npc: npc/functions/strangerquiz.txt
+npc: npc/functions/time.txt
 npc: npc/functions/water_bottle.txt
 npc: npc/functions/evil_obelisk.txt
 
-- 
cgit v1.2.3-70-g09d2