//# see detailed description at orum.txt //# see detailed description at orum.txt function|script|GetTorchColor|, { if (@Torch < 0 || @Torch > 2) goto L_Error; set @Mask, 15; set @Shift, 4 * @Torch; set @TorchColor, (OrumQuestTorch >> @Shift) & @Mask; return; L_Error: mes "Torch number is out of range."; close; } function|script|SetTorchColor|, { if (@Torch < 0 || @Torch > 2) goto L_Error; if (@TorchColor < 1 || @TorchColor > 12) goto L_Error2; set @Mask, (15 << (4 * @Torch)); set OrumQuestTorch, (OrumQuestTorch & (~(@Mask))) | @TorchColor << (4 * @Torch); return; L_Error: mes "Torch number is out of range."; close; L_Error2: mes "Torch color is out of range."; close; } function|script|GetTorchIntensity|, { if (@Torch < 0 || @Torch > 2) goto L_Error; set @Mask, 15; set @Shift, 4 * (@Torch + 3); set @TorchIntensity, (OrumQuestTorch >> @Shift) & @Mask; return; L_Error: mes "Torch number is out of range."; close; } function|script|SetTorchIntensity|, { if (@Torch < 0 || @Torch > 2) goto L_Error; if (@TorchIntensity < 0 || @TorchIntensity > 2) goto L_Error2; set @Mask, (15 << (4 * (@Torch + 3))); set OrumQuestTorch, (OrumQuestTorch & (~(@Mask))) | @TorchIntensity << (4 * (@Torch + 3)); return; L_Error: mes "Torch number is out of range."; close; L_Error2: mes "Torch intensity is out of range."; close; } function|script|DoneWithTorches|, { if (OrumQuest < 11 && OrumQuest >= 8) goto L_Return; if (OrumQuest < 7) goto L_Different; if (OrumQuest >= 11) mes "The flame on the torch looks ordinary. Lowering the final barrier seems to have drained them of their magic."; if (OrumQuest < 8) mes "Without that powder the note mentions there isn't much you can do with this torch."; close; L_Different: mes "The flame on this torch looks different than the rest. You better tell Orum about it before doing anything."; set OrumQuest, 6; close; L_Return: return; } // To make sure in range of torches function|script|InRangeTorch1|, { if (isin("009-4.gat",67,20,69,25)) goto L_Return; mes "You're too far away to do anything with that torch."; close; L_Return: return; } function|script|InRangeTorch2|, { if (isin("009-4.gat",65,41,69,46)) goto L_Return; mes "You're too far away to do anything with that torch."; close; L_Return: return; } function|script|InRangeTorch3|, { if (isin("009-4.gat",33,84,37,88)) goto L_Return; mes "You're too far away to do anything with that torch."; close; L_Return: return; } function|script|TorchLoop|, { // Variables used here: // @Torch - pass before calling // @TorchColor - initialized here, updated throughout // @TorchIntensity - initialized here, updated throughout callfunc "GetTorchColor"; callfunc "GetTorchIntensity"; setarray @colors$, "transparent", "red", "dark orange", "orange", "light orange", "yellow", "light green", "green", "dark green", "blue", "dark purple", "purple", "light purple"; setarray @intensities$, "calm", "bright", "blinding"; mes "Looking closely you notice that this torch is not like the others. This one has a " + @intensities$[@TorchIntensity] + " " + @colors$[@TorchColor] + " tint to it."; goto L_Color_Loop; L_Color_Loop: menu "Add Red Powder", L_Use_Red, "Add Yellow Powder", L_Use_Yellow, "Add Blue Powder", L_Use_Blue, "Leave it alone.", L_Leave; L_Leave: mes "The flame flickers as if it's laughing at you."; close; L_Use_Red: if (countitem("RedPowder") < 1) goto L_No_Powder; delitem "RedPowder", 1; // 0 1 2 3 4 5 6 7 8 9 a b c // T R o Y g B p // ^ < < < < , X . > > > > if (@TorchColor == 1) goto L_WrongColor; if (2 <= @TorchColor && @TorchColor <= 5) goto L_Color_Dec; if (@TorchColor == 6) goto L_Color_Dec_Wrong; if (@TorchColor == 7) goto L_WrongColor; if (@TorchColor == 8) goto L_Color_Inc_Wrong; if (9 <= @TorchColor && @TorchColor <= 12) goto L_Color_Inc; // work around an old bug if (@TorchColor == 0) set @TorchColor, 1; goto L_Show_Color; L_Use_Yellow: if (countitem("YellowPowder") < 1) goto L_No_Powder; delitem "YellowPowder", 1; // 0 1 2 3 4 5 6 7 8 9 a b c // T R o Y g B p // > > > > ^ < < < < , X . if (1 <= @TorchColor && @TorchColor <= 4) goto L_Color_Inc; if (@TorchColor == 5) goto L_WrongColor; if (6 <= @TorchColor && @TorchColor <= 9) goto L_Color_Dec; if (@TorchColor == 10) goto L_Color_Dec_Wrong; if (@TorchColor == 11) goto L_WrongColor; if (@TorchColor == 12) goto L_Color_Inc_Wrong; // work around an old bug if (@TorchColor == 0) set @TorchColor, 5; goto L_Show_Color; L_Use_Blue: if (countitem("BluePowder") < 1) goto L_No_Powder; delitem "BluePowder", 1; // 0 1 2 3 4 5 6 7 8 9 a b c // T R o Y g B p // < , X . > > > > ^ < < < if (@TorchColor == 1) goto L_Color_Dec; if (@TorchColor == 2) goto L_Color_Dec_Wrong; if (@TorchColor == 3) goto L_WrongColor; if (@TorchColor == 4) goto L_Color_Inc_Wrong; if (5 <= @TorchColor && @TorchColor <= 8) goto L_Color_Inc; if (@TorchColor == 9) goto L_WrongColor; if (10 <= @TorchColor && @TorchColor <= 12) goto L_Color_Dec; // work around an old bug if (@TorchColor == 0) set @TorchColor, 9; goto L_Show_Color; L_No_Powder: mes "You notice you're all out of that color of powder. Perhaps Orum can make you some more."; close; L_Color_Dec: set @TorchColor, @TorchColor - 1; if (@TorchColor == 0) set @TorchColor, 12; goto L_Show_Color; L_Color_Dec_Wrong: set @TorchColor, @TorchColor - 1; if (@TorchColor == 0) set @TorchColor, 12; goto L_WrongColor; L_Color_Inc_Wrong: set @TorchColor, @TorchColor + 1; if (@TorchColor == 13) set @TorchColor, 1; goto L_WrongColor; L_Color_Inc: set @TorchColor, @TorchColor + 1; if (@TorchColor == 13) set @TorchColor, 1; goto L_Show_Color; L_Show_Color: callfunc "SetTorchColor"; misceffect 5; mes "As your pour the powder into the flame you can see its tint transform to a " + @intensities$[@TorchIntensity] + " " + @colors$[@TorchColor] + "."; goto L_Color_Loop; L_WrongColor: callfunc "SetTorchColor"; set @TorchIntensity, @TorchIntensity + 1; if (@TorchIntensity > 2) goto L_Failed; callfunc "SetTorchIntensity"; misceffect 5; mes "As you pour the powder into the flame it flares violently for a moment and then turns into a " + @intensities$[@TorchIntensity] + " " + @colors$[@TorchColor] + "."; goto L_Color_Loop; L_Failed: mes "As you pour the powder into the flame it flares violently before bursting into your face!"; misceffect 5; misceffect 16; set @TorchIntensity, 0; callfunc "SetTorchIntensity"; heal -Hp, 0; close; } // First Torch 009-4.gat,68,21,0|script|Torch#1|400, { callfunc "InRangeTorch1"; callfunc "DoneWithTorches"; set @Torch, 0; callfunc "TorchLoop"; // unreachable end; } // Second Torch 009-4.gat,67,42,0|script|Torch#2|400, { callfunc "InRangeTorch2"; callfunc "DoneWithTorches"; set @Torch, 1; callfunc "TorchLoop"; // unreachable end; } // Third Torch 009-4.gat,33,86,0|script|Torch#3|400, { callfunc "InRangeTorch3"; callfunc "DoneWithTorches"; set @Torch, 2; callfunc "TorchLoop"; // unreachable end; }