summaryrefslogblamecommitdiff
path: root/world/map/npc/033-1/kimarr.txt
blob: 291137695ebc32f1102af0abb457ee6969c483d0 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
13
14













                                                                                                      
























                                                                                                                         

                                                       

          




                                                                                                                                                          

                          
 
               











                                                                                                     










                                                                            
 

                                                                             
         
                   


                                                                                                 
                     



                                                                                    


                               
 







                                                         
        


                                                                                       


                                                                                     

       








                                           
                                                                     
                        
                             
                 
                 

               

                                                                                              
                 
 
            
                                                                                              
        
 
            





                                                                              


                                            







                                         

                  
 
         

                                                                                  

                    



                                            

                    
 
           

                                                 
                            
 


                           




                                                                                              














                                                                                                                       

                                                                                   
                                                                                     
                                                                        

                                                                                     
                                                                 
                                                                                     
 




                               
                            
 
                         
 









                                                                       
                   














                                                                                                                   

           
                   
                    















                                                                            
                                                      
                         
 
                         











                                                                     
 






                                                                 
 








                                                                                                                                                       
 


                                                                                






                                                  
 
// Fluffy hunting quest

// 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
//      3: monsters have been spawned
// global $@Fluffy_Time - the number of seconds since you entered the area
// global

033-1.gat,74,32,0|script|Kimarr|218,{
    if ($@Fluffy_FighterID == getcharid(3))
        goto L_Attention;

    set @Q_Barbarians_MASK, NIBBLE_0_MASK;
    set @Q_Barbarians_SHIFT, NIBBLE_0_SHIFT;

    set @state, ((QUEST_Barbarians & @Q_Barbarians_MASK) >> @Q_Barbarians_SHIFT);

    if (@state >= 3) goto L_Again;
    if (@state == 2) goto L_Reward;
    if (@state == 1) goto L_Ask;

    mes "[Barbarian]";
    mes "\"Greetings, little person.\"";
    next;
    mes "\"I am Kimarr, hunter and warrior of the Mangarr.\"";
    next;
    mes "\"You are very small, better be careful in this snowy mountains. It is cold and dangerous monsters are here.\"";
    menu
        "Hello, my name is " + strcharinfo(0) + " and I'm not small. I'm a great warrior!",-,
        "I'm " + strcharinfo(0) + ", don't underestimate me. I'm an experienced adventurer!" ,-,
        "I'm the legendary " + strcharinfo(0) + ", I've fought countless battles.",-;

    mes "Kimarr seems to be amused.";
    mes "[Kimarr]";
    mes "\"Really? Do you want to prove it?\"";
    menu
        "Sure! What shall I do?", -,
        "No, I don't need to prove anything.", L_Close;

L_Explain:
    mes "[Kimarr]";
    mes "\"Every young member of our tribe proves his or her worth by hunting monsters.\"";
    next;
    mes "\"The first monsters to hunt are fluffies. Fluffies give a good meal for a young person and the fur can be used to make clothes and blankets.\"";
    next;
    set @state, 1;
    callsub S_Update_Mask;

L_Explain_Game:
    mes "[Kimarr]";
    mes "\"In that cave there are living fluffies. They like to eat apples.\"";
    next;
    mes "\"I also saw one of them getting excited about one of that sweet things you call 'cake'.\"";
    next;
    mes "\"You should be careful, other monsters living here might like the food as well\"";
    next;
    mes "\"Go to the cave entrance and throw food on the floor to make them come out.\"";
    next;
    mes "\"Then hunt as many fluffies as you can until I tell you to stop.\"";
    next;
    mes "\"Drop more food when no fluffies are left.\"";
    next;

// dialog starts here if you've asked about it but not done it (@state == 1)
L_Ask:
    mes "[Kimarr]";
    mes "\"So, are you going to try?\"";
    menu
        "Yeah, let's start!", L_Game,
        "Could you explain again?", L_Explain_Game,
        "Maybe later.", -;
    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) + ".";
    next;

    getinventorylist;
    if (@inventorylist_count == 100)
        goto L_Full_Inv;
    mes "[Kimarr]";
    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;

    goto L_Close;

L_Full_Inv:
    mes "[Kimarr]";
    mes "You can't carry the reward I want to give you.";
    goto L_Close;

// dialog starts here after you've completed this quest
L_Again:
    mes "[Kimarr]";
    mes "\"Does the hunter " + strcharinfo(0) + " want to hunt some fluffies again?\"";
    menu
        "Yeah!", L_Game,
        "Can you tell me who were the most successful fluffy hunters?", L_ShowRecord,
        "Not now.", L_Close;

L_Game:
    if ($@Fluffy_Hunting)
        goto L_Someone_Else;
    set $@Fluffy_Hunting, 1;
    set $@Fluffy_Kills, 0;
    set $@Fluffy_PC_Deaths, PC_DIE_COUNTER;
    set $@Fluffy_Fighter$, strcharinfo(0);
    set $@Fluffy_FighterID, getcharid(3);
    set $@Fluffy_Time, 0;

//TODO: set minimum number of killed fluffies (maybe based on level?)
    set $@Fluffy_Min, 1;
    warp "033-1.gat", 79, 34;
    initnpctimer;
    goto L_Close;

L_Someone_Else:
    mes "[Kimarr]";
    mes "\"At the moment someone else is hunting. Let's wait until that hunting has ended.\"";
    goto L_Close;

L_Attention:
    message strcharinfo(0), "Kimarr: You should be focused on hunting fluffies, not talking.";
    end;

OnTimer1000:
// Checking if player is logged
    if (isloggedin($@Fluffy_FighterID) == 0)
        goto L_GotOut;
    attachrid($@Fluffy_FighterID);
// Checking if player is still in the map or used a towell or spell to get out
    if (getareausers("033-1.gat", 79, 28, 88, 42) == 0)
        goto L_GotOut;
    if (PC_DIE_COUNTER > $@Fluffy_PC_Deaths)
        goto L_Died;

    set $@Fluffy_Time, $@Fluffy_Time + 1;
    if ($@Fluffy_Time > 300)
        goto L_TimeOver;
    if ($@Fluffy_Hunting == 1)
        goto L_CheckDrops;

L_ContinueTimer:
    setnpctimer 0;
    end;

L_GotOut:
    // TODO: this is the only use of $@Fluffy_Fighter$, can we remove it?
    npctalk "What a strange thing... " + $@Fluffy_Fighter$ + " just disappeared!";
    callsub S_Clean;
    end;

L_Died:
    warp "033-1.gat", 77, 34;
    message strcharinfo(0), "You are dead.";
    callsub S_Clean;
    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)
        goto L_BeginHunting;
    goto L_ContinueTimer;

L_BeginHunting:
    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;
    if ($@Fluffy_Spawn < $@Fluffy_Min)
        // TODO: should we instead say "You didn't put enough food"
        set $@Fluffy_Spawn, $@Fluffy_Min;

    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;
    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
        areamonster "033-1.gat", 79, 29, 88, 42, "", 1015, 1, "Kimarr::OnOtherDeath";
    // TODO: add the wolvern as well when it has been added
    if ((BaseLevel > 70) && (rand($@Fluffy_Extra) > 600)) // Yeti
        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_Hunting, 3;

    goto L_ContinueTimer;

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)
        goto L_MaybeRecordScore;
    end;

L_DidntDrop:
    warp "033-1.gat", 77, 34;
    mes "[Kimarr]";
    mes "You waited too much to throw the food on the ground... Now the fluffies know you are planning something.";
    callsub S_Clean;
    goto L_Close;

S_Clean:
    killmonster "033-1.gat", "Kimarr::OnOtherDeath";
    killmonster "033-1.gat", "Kimarr::OnFluffyDeath";
    set $@Fluffy_Hunting, 0;
    set $@Fluffy_Time, 0;
    set $@Fluffy_PC_Deaths, 0;
    set $@Fluffy_Fighter$, "";
    set $@Fluffy_FighterID, 0;
    set $@Fluffy_Kills, 0;
    set $@Fluffy_Spawn, 0;
    stopnpctimer;
    return;

L_MaybeRecordScore:
    callsub S_Clean;
    if ($@Fluffy_Kills < $@Fluffy_Min)
        goto L_ShowRecord;
    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_MaybeInsertNext;

L_InsertScore:
    set @loop, @rank;
L_FindLastScore:
    // comment this out to allow the player to be in the list more than once
    // though actually, it might be better just to assume the list is full
    if (strcharinfo(0) == $Record_Fluffy_Name$[@loop])
        goto L_MoveStuff;

    set @loop, @loop + 1;
    if (@loop == MAX_HIGH_SCORES)
        goto L_MoveStuff;
    goto L_FindLastScore;

L_MoveStuff:
    if (@loop == @rank)
        goto L_FinallyInsertMe;
    set $Record_Fluffy_Kills[@loop], $Record_Fluffy_Kills[@loop - 1];
    set $Record_Fluffy_Name$[@loop], $Record_Fluffy_Name$[@loop - 1];
    set $Record_Fluffy_Date$[@loop], $Record_Fluffy_Date$[@loop - 1];
    set @loop, @loop - 1;
    goto L_MoveStuff;

L_FinallyInsertMe:
    set $Record_Fluffy_Kills[@rank], $@Fluffy_Kills;
    set $Record_Fluffy_Name$[@rank], strcharinfo(0);
    callfunc "time_stamp";
    set $Record_Fluffy_Date$[@rank], @ts_date$ + " " + @ts_time$;
    set @ts_date$, "";
    set @ts_time$, "";

L_ShowRecord:
    set @rank, 0;
    set @loop, 0;
L_ShowNextRecord:
    if (! $Record_Fluffy_Kills[@loop])
        goto L_Close;
    mes (@loop + 1) + " - " + $Record_Fluffy_Name$[@loop] + " - " + $Record_Fluffy_Kills[@loop] + " fluffies killed in " + $Record_Fluffy_Date$[@loop];
    set @loop, @loop + 1;
    goto L_ShowNextRecord;

L_Close:
    // TODO: clear all temporary player variables that are not otherwise cleared
    set @loop, 0;
    close;

S_Update_Mask:
    set QUEST_Barbarians,
        (QUEST_Barbarians & ~(@Q_Barbarians_MASK))
            | (@state << @Q_Barbarians_SHIFT);
    return;
}