diff options
Diffstat (limited to 'npc/033-1/kimarr.txt')
-rw-r--r-- | npc/033-1/kimarr.txt | 405 |
1 files changed, 405 insertions, 0 deletions
diff --git a/npc/033-1/kimarr.txt b/npc/033-1/kimarr.txt new file mode 100644 index 00000000..74ae45a1 --- /dev/null +++ b/npc/033-1/kimarr.txt @@ -0,0 +1,405 @@ + + + + + +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 strnpcinfo(0), 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 strnpcinfo(0), "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 strnpcinfo(0), strcharinfo(0) + ", you have 3 minutes."; + if ($@Fluffy_Time == 120) + npctalk strnpcinfo(0), "You have 2 minutes left."; + if ($@Fluffy_Time == 60) + npctalk strnpcinfo(0), "You have 1 minute left."; + if ($@Fluffy_Time == 30) + npctalk strnpcinfo(0), "You have 30 seconds left."; + if ($@Fluffy_Time == 15) + npctalk strnpcinfo(0), "You have 15 seconds left."; + if ($@Fluffy_Time == 10) + npctalk strnpcinfo(0), "You have 10 seconds left."; + if ($@Fluffy_Time == 5) + npctalk strnpcinfo(0), "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 strnpcinfo(0), "What a strange thing... " + $@Fluffy_Fighter$ + " just disappeared!"; + callsub S_Clean; + end; + +OnTooMany: + if (getcharid(3) == $@Fluffy_FighterID) + end; + npctalk strnpcinfo(0), "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 strnpcinfo(0), "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 strnpcinfo(0), strcharinfo(0) + "! This hunt is for " + $@Fluffy_Fighter$ + " alone!"; + heal -Hp, 0; + @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 strnpcinfo(0), "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; +} |