//# 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;
}