summaryrefslogblamecommitdiff
path: root/npc/033-1/kimarr.txt
blob: 15e2db81b56e233d3151160188b29b686910f2ee (plain) (tree)







































































                                                                                                                                                          
                                                                                                                      









                                                                                                                               
                                                                                                                














































































                                                                                                                      
                                                         
                             
                                           
                            
                                          
                            
                                            
                            
                                            
                            
                                            
                           
                                           









                                      
                                                                                  





                                           
                                                                                                                      





                                            
                                                                



























































































                                                                                                                       
                                                                                   
          











































































                                                                                                  
                                                                                                          
































                                                                                                                                                       
033-1,74,32,0	script	Kimarr	NPC218,{
    @halloween_npc_id = $@halloween_npc_kimarr;
    callfunc "TrickOrTreat";

    if ($@Fluffy_FighterID == getcharid(3))
        goto L_Attention;

    @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 and must be careful in these 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!",L_Next,
        "I'm " + strcharinfo(0) + ", don't underestimate me. I'm an experienced adventurer!",L_Next,
        "I'm the legendary " + strcharinfo(0) + ", I've fought countless battles.",L_Next;

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

L_Continue:
    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;
    @state = 1;
    callsub S_Update_Mask;
    goto L_ExplainGame;

L_ExplainGame:
    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 those sweet things you call 'cake'.\"";
    next;
    mes "\"Go to the cave entrance and throw food on the floor to make them come out.\"";
    next;
    mes "\"You should be careful, other monsters living here might like the food as well.\"";
    next;
    mes "\"Hunt as many Fluffies as you can until I tell you to stop.\"";
    next;
    mes "\"Drop more food when no Fluffies are left.\"";
    next;
    goto L_Ask;

L_Ask:
    mes "[Kimarr]";
    mes "\"So, are you going to try?\"";
    menu
        "Yeah, let's start!",L_Game,
        "Could you explain again?",L_ExplainGame,
        "Can you tell me who were the most successful Fluffy hunters?",L_ShowRecord,
        "Maybe later.",L_close;

L_AlreadyGotReward:
    npctalk strcharinfo(0) + " killed " + $@Fluffy_Kills + " Fluffies and has once again proven to be a good hunter.";
    message strcharinfo(0), "Kimarr: Once again you prove your worth as a hunter! You killed " + $@Fluffy_Kills + " Fluffies.";
    callsub S_Clean;
    goto L_close;

L_Reward1:
    @state = ((QUEST_Barbarians & $@Q_Barbarians_MASK) >> $@Q_Barbarians_SHIFT);

    if (@state >= 2)
        goto L_AlreadyGotReward;

    npctalk "Hooray! " + strcharinfo(0) + " killed " + $@Fluffy_Kills + " Fluffies and is now a worthy hunter.";

    // 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 strcharinfo(0), "Kimarr: Hooray! You hunted " + $@Fluffy_Kills + " Fluffies. Talk to me for your reward.";

    @state = 2;
    callsub S_Update_Mask;
    callsub S_Clean;
    goto L_close;

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;
    @inventorylist_count = 0;

    mes "\"Take this as a symbol of your strength. You're a member of our tribe now.\"";
    getitem "YetiSkinShirt", 1;
    @state = 3;
    callsub S_Update_Mask;
    goto L_close;

L_Full_Inv:
    mes "\"You can't carry the reward I want to give you.\"";
    goto L_close;

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;
    $@Fluffy_Hunting = 1;
    $@Fluffy_Kills = 0;
    $@Fluffy_PC_Deaths = PC_DIE_COUNTER;
    $@Fluffy_Fighter$ = strcharinfo(0);
    $@Fluffy_FighterID = getcharid(3);
    $@Fluffy_Time = 180;
    $@Fluffy_Min = 1 + (BaseLevel*7)/10;

    warp "033-1", 79, 34;
    initnpctimer;
    goto L_close;

L_Someone_Else:
    mes "[Kimarr]";
    mes "\"Someone else is hunting right now. Let's wait until that hunt has ended.\"";
    goto L_close;

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

OnTimer1000:
    if ($@Fluffy_Hunting == 3)
        goto L_Action;
    $@Fluffy_Hunting = $@Fluffy_Hunting + 1;
    goto L_ContinueTimer;
L_Action:
    if (attachrid($@Fluffy_FighterID) == 0)
        goto L_GotOut;
    if (getareausers("033-1", 79, 28, 88, 42) == 0)
        goto L_GotOut;
    if (PC_DIE_COUNTER > $@Fluffy_PC_Deaths)
        goto L_Died;
    if (getareausers("033-1", 79, 28, 88, 42) > 1)
        areatimer 0, "033-1", 79, 28, 88, 42, 10, "Kimarr::OnTooMany";

    if ($@Fluffy_Time == 180)
        npctalk strcharinfo(0) + ", you have 3 minutes.";
    if ($@Fluffy_Time == 120)
        npctalk "You have 2 minutes left.";
    if ($@Fluffy_Time == 60)
        npctalk "You have 1 minute left.";
    if ($@Fluffy_Time == 30)
        npctalk "You have 30 seconds left.";
    if ($@Fluffy_Time == 15)
        npctalk "You have 15 seconds left.";
    if ($@Fluffy_Time == 10)
        npctalk "You have 10 seconds left.";
    if ($@Fluffy_Time == 5)
        npctalk "You have 5 seconds left.";
    $@Fluffy_Time = $@Fluffy_Time - 1;
    if ($@Fluffy_Time < 0)
        goto L_TimeOver;
    goto L_CheckDrops;

L_ContinueTimer:
    setnpctimer 0;
    end;

L_GotOut:
    npctalk "What a strange thing... " + $@Fluffy_Fighter$ + " just disappeared!";
    callsub S_Clean;
    end;

OnTooMany:
    if (getcharid(3) == $@Fluffy_FighterID)
        end;
    npctalk "Hey " + strcharinfo(0) + "! What are you doing there? This hunt is for " + $@Fluffy_Fighter$ + " alone!";
    warp "033-1", 77, 34;
    end;

L_Died:
    warp "033-1", 77, 34;
    message strcharinfo(0), "You are dead.";
    npctalk "Oh no! " + $@Fluffy_Fighter$ + " got overwhelmed!";
    callsub S_Clean;
    end;

L_TimeOver:
    message strcharinfo(0), "Your time is over.";
    goto L_MaybeRecordScore;

L_CheckDrops:
    @Fluffy_RedApple = getareadropitem("033-1", 79, 29, 88, 42, "RedApple", 1);
    @Fluffy_XmasCake = getareadropitem("033-1", 79, 29, 88, 42, "XmasCake", 1);
    @Fluffy_Cake = getareadropitem("033-1", 79, 29, 88, 42, "Cake", 1);
    @Fluffy_GreenApple = getareadropitem("033-1", 79, 29, 88, 42, "GreenApple", 1);
    if (@Fluffy_RedApple || @Fluffy_XmasCake || @Fluffy_Cake || @Fluffy_GreenApple)
        goto L_BeginHunting;
    goto L_ContinueTimer;

L_BeginHunting:
    $@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 + $@Fluffy_Alive) <= 100)
        goto L_SpawnFluffies;
    message strcharinfo(0), "Wow, calm down, there are already too many Fluffies around here.";
    $@Fluffy_Spawn = 100 - $@Fluffy_Alive;
    if ($@Fluffy_Spawn <= 0)
        goto L_ContinueTimer;
    goto L_SpawnFluffies;

L_SpawnFluffies:
    areamonster "033-1", 79, 29, 88, 42, "", 1089, $@Fluffy_Spawn, "Kimarr::OnFluffyDeath";

    $@Fluffy_Extra = 5 * @Fluffy_XmasCake + 3 * @Fluffy_Cake + 12 * ($@Fluffy_Alive + $@Fluffy_Spawn) + 7 * BaseLevel;
    if ((BaseLevel > 40) && (rand($@Fluffy_Extra) > 500)) // Ice Goblin
        areamonster "033-1", 79, 29, 88, 42, "", 1058, 1, "Kimarr::OnIceGoblinDeath";
    if ((BaseLevel > 60) && (rand($@Fluffy_Extra) > 550)) // Wolvern
        areamonster "033-1", 79, 29, 88, 42, "", 1090, 1, "Kimarr::OnWolvernDeath";
    if ((BaseLevel > 70) && (rand($@Fluffy_Extra) > 600)) // Yeti
        areamonster "033-1", 79, 29, 88, 42, "", 1072, 1, "Kimarr::OnYetiDeath";

    $@Fluffy_Extra = 0;
    @Fluffy_RedApple = 0;
    @Fluffy_XmasCake = 0;
    @Fluffy_Cake = 0;
    @Fluffy_GreenApple = 0;
    $@Fluffy_Alive = $@Fluffy_Alive + $@Fluffy_Spawn;
    goto L_ContinueTimer;

OnIceGoblinDeath:
    @mobId = 1058;
    if (getcharid(3) != $@Fluffy_FighterID)
        goto L_Punish;
    @mobId = 0;
    end;

OnWolvernDeath:
    @mobId = 1090;
    if (getcharid(3) != $@Fluffy_FighterID)
        goto L_Punish;
    @mobId = 0;
    end;

OnYetiDeath:
    @mobId = 1072;
    if (getcharid(3) != $@Fluffy_FighterID)
        goto L_Punish;
    @mobId = 0;
    end;

OnFluffyDeath:
    @mobId = 1089;
    if ($@Fluffy_Hunting == 0)
        end;
    if (getcharid(3) != $@Fluffy_FighterID)
        goto L_Punish;
    @mobId = 0;
    $@Fluffy_Kills = $@Fluffy_Kills + 1;
    $@Fluffy_Alive = $@Fluffy_Alive - 1;
    if ($@Fluffy_Alive != 0)
        end;
    if (attachrid($@Fluffy_FighterID) == 1)
        goto L_Killedall;
    goto L_GotOut;

L_Punish:
    if (@mobId == 1089)
        areamonster "033-1", 79, 29, 88, 42, "", 1089, 1, "Kimarr::OnFluffyDeath";
    if (@mobId == 1058)
        areamonster "033-1", 79, 29, 88, 42, "", 1058, 1, "Kimarr::OnIceGoblinDeath";
    if (@mobId == 1090)
        areamonster "033-1", 79, 29, 88, 42, "", 1090, 1, "Kimarr::OnWolvernDeath";
    if (@mobId == 1072)
        areamonster "033-1", 79, 29, 88, 42, "", 1072, 1, "Kimarr::OnYetiDeath";

    npctalk strcharinfo(0) + "! This hunt is for " + $@Fluffy_Fighter$ + " alone!";
    die();
    @mobId = 0;
    end;

L_Killedall:
    message strcharinfo(0), "Good job, but you still have time to throw more food on the ground.";
    end;

S_Clean:
    stopnpctimer;
    $@Fluffy_Hunting = 0;
    $@Fluffy_Time = 0;
    $@Fluffy_PC_Deaths = 0;
    $@Fluffy_Fighter$ = "";
    $@Fluffy_FighterID = 0;
    $@Fluffy_Kills = 0;
    $@Fluffy_Spawn = 0;
    $@Fluffy_Alive = 0;
    killmonster "033-1", "Kimarr::OnIceGoblinDeath";
    killmonster "033-1", "Kimarr::OnWolvernDeath";
    killmonster "033-1", "Kimarr::OnYetiDeath";
    killmonster "033-1", "Kimarr::OnFluffyDeath";
    @state = 0;
    return;

L_MaybeRecordScore:
    warp "033-1", 77, 34;
    if ($@Fluffy_Kills < $@Fluffy_Min)
        goto L_NotGoodEnough;
    @rank = 0;
    goto L_MaybeInsertNext;

L_MaybeInsertNext:
    if ($@Fluffy_Kills > $Record_Fluffy_Kills[@rank])
        goto L_InsertScore;
    // you already had a better score
    if (strcharinfo(0) == $Record_Fluffy_Name$[@rank])
        goto L_Reward1;
    @rank = @rank + 1;
    if (@rank == MAX_HIGH_SCORES)
        goto L_Reward1;
    goto L_MaybeInsertNext;

L_InsertScore:
    @loop = @rank;
    goto L_FindLastScore;

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;

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

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

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

L_NotGoodEnough:
    npctalk  "What a disappointment, " + strcharinfo(0) + " hunted only " + $@Fluffy_Kills + " Fluffies.";
    message strcharinfo(0), "Kimarr: What a disappointment, you hunted only " + $@Fluffy_Kills + " Fluffies.";
    callsub S_Clean;
    end;

L_ShowRecord:
    @rank = 0;
    @loop = 0;
    goto L_ShowNextRecord;

L_ShowNextRecord:
    if ($Record_Fluffy_Kills[@loop] == 0)
        goto L_close;
    mes (@loop + 1) + " - " + $Record_Fluffy_Name$[@loop] + " - " + $Record_Fluffy_Kills[@loop] + " Fluffies killed at " + $Record_Fluffy_Date$[@loop];
    @loop = @loop + 1;
    goto L_ShowNextRecord;

L_close:
    // 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
    @loop = 0;

    // if you unset @state, it might break the script
    // If only we had the concept of "local constants" ...
    close;

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