// Basic magic functionality
// Magic system uses:
// - MAGIC_EXP (magic experience points, gained for spellcasting)
// - MAGIC_FLAGS
// Magic quests use:
// - QUEST_MAGIC
// - QUEST_MAGIC2
// ------------------------------------------------------------
// Gain initial magic skill
// ------------------------------------------------------------
function|script|MagicGainBasic
{
set MAGIC_FLAGS, MAGIC_FLAGS | MFLAG_DRANK_POTION;
// Doomsday Act 5 utils
if (getmap() == "099-5")
addtimer 10, "Zax De'Kagen#0::OnAdjustPotion";
return;
}
// ------------------------------------------------------------
// Initialise Menu for selecting a choice of things to ask about
// ------------------------------------------------------------
function|script|MagicTalkOptionsSetup
{
set @QQ_ELANORE, 1;
set @QQ_MANASEED, 2;
set @QQ_MANAPOTION, 4;
set @QQ_WYARA, 8;
set @QQ_SAGATHA, 16;
set @QQ_AULDSBEL, 32;
set @QQ_IMP, 64;
set @QQ_OLDWIZ, 128;
set @QQ_ASTRALSOUL, 256;
return;
}
// ------------------------------------------------------------
// Print and run menu for choice of things to ask about
// Ignores the entry in @ignore
// Returns the result in @c, or returns 0 if there is no result
// ------------------------------------------------------------
function|script|MagicTalkMenu
{
setarray @choice$, "", "", "", "", "", "", "", "", "", "";
set @choices_nr, 0;
setarray @choice_idx, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0;
if (@ignore & @QQ_ELANORE)
goto L_Q_post_elanore;
set @choice$[@choices_nr], "...Elanore the Healer?";
set @choice_idx[@choices_nr], @QQ_ELANORE;
set @choices_nr, @choices_nr + 1;
goto L_Q_post_elanore;
L_Q_post_elanore:
if (@ignore == @QQ_MANASEED)
goto L_Q_post_manaseed;
if (!(MAGIC_FLAGS & (MFLAG_KNOWS_MANASEED | MFLAG_MANASEED_RUMOUR)))
goto L_Q_post_manaseed;
set @choice$[@choices_nr], "...the Mana Seed?";
set @choice_idx[@choices_nr], @QQ_MANASEED;
set @choices_nr, @choices_nr + 1;
goto L_Q_post_manaseed;
L_Q_post_manaseed:
if (@ignore & @QQ_MANAPOTION)
goto L_Q_post_manapotion;
if (!(MAGIC_FLAGS & MFLAG_KNOWS_MANAPOTION))
goto L_Q_post_manapotion;
set @choice$[@choices_nr], "...Mana Potions?";
set @choice_idx[@choices_nr], @QQ_MANAPOTION;
set @choices_nr, @choices_nr + 1;
goto L_Q_post_manapotion;
L_Q_post_manapotion:
if (@ignore & @QQ_WYARA)
goto L_Q_post_wyara;
if (!(MAGIC_FLAGS & MFLAG_KNOWS_WYARA))
goto L_Q_post_wyara;
set @choice$[@choices_nr], "...Wyara the Witch?";
set @choice_idx[@choices_nr], @QQ_WYARA;
set @choices_nr, @choices_nr + 1;
goto L_Q_post_wyara;
L_Q_post_wyara:
if (@ignore & @QQ_SAGATHA)
goto L_Q_post_sagatha;
if (!(MAGIC_FLAGS & MFLAG_KNOWS_SAGATHA))
goto L_Q_post_sagatha;
set @choice$[@choices_nr], "...Sagatha the Witch?";
set @choice_idx[@choices_nr], @QQ_SAGATHA;
set @choices_nr, @choices_nr + 1;
goto L_Q_post_sagatha;
L_Q_post_sagatha:
if (@ignore & @QQ_AULDSBEL)
goto L_Q_post_auldsbel;
if (!(MAGIC_FLAGS & MFLAG_KNOWS_AULDSBEL))
goto L_Q_post_auldsbel;
set @choice$[@choices_nr], "...Auldsbel the Wizard?";
set @choice_idx[@choices_nr], @QQ_AULDSBEL;
set @choices_nr, @choices_nr + 1;
goto L_Q_post_auldsbel;
L_Q_post_auldsbel:
if (@ignore & @QQ_OLDWIZ)
goto L_Q_post_oldwiz;
if (!(MAGIC_FLAGS & MFLAG_KNOWS_OLD_WIZARD))
goto L_Q_post_oldwiz;
set @choice$[@choices_nr], "...the Old Wizard?";
set @choice_idx[@choices_nr], @QQ_OLDWIZ;
set @choices_nr, @choices_nr + 1;
goto L_Q_post_oldwiz;
L_Q_post_oldwiz:
if (@ignore & @QQ_IMP)
goto L_Q_post_imp;
if (!(MAGIC_FLAGS & MFLAG_KNOWS_IMP))
goto L_Q_post_imp;
set @choice$[@choices_nr], "...the Earth Spirit in the desert well?";
set @choice_idx[@choices_nr], @QQ_IMP;
set @choices_nr, @choices_nr + 1;
goto L_Q_post_imp;
L_Q_post_imp:
if (@ignore & @QQ_ASTRALSOUL)
goto L_Q_post_astralsoul;
if (!(getskilllv(SKILL_MAGIC)))
goto L_Q_post_astralsoul;
if (!(getskilllv(SKILL_POOL)))
goto L_Q_post_astralsoul;
set @choice$[@choices_nr], "...ways to improve my magic?";
set @choice_idx[@choices_nr], @QQ_ASTRALSOUL;
set @choices_nr, @choices_nr + 1;
goto L_Q_post_astralsoul;
L_Q_post_astralsoul:
set @choice$[@choices_nr], "...never mind.";
set @choice_idx[@choices_nr], 0;
set @choices_nr, @choices_nr + 1;
menu
@choice$[0], L_MenuItems,
@choice$[1], L_MenuItems,
@choice$[2], L_MenuItems,
@choice$[3], L_MenuItems,
@choice$[4], L_MenuItems,
@choice$[5], L_MenuItems,
@choice$[6], L_MenuItems,
@choice$[7], L_MenuItems,
@choice$[8], L_MenuItems,
@choice$[9], L_MenuItems;
L_MenuItems:
set @menu, @menu - 1;
if (@menu >= @choices_nr)
set @menu, 0;
set @c, @choice_idx[@menu];
return;
}
// ------------------------------------------------------------
// Level up a skill
// @SUP_id skill ID to level up
// @SUP_lvl skill level to attain
// @SUP_name$ name of the skill to level up
// @SUP_xp # of experience points to award if the level up succeeds
// ------------------------------------------------------------
function|script|SkillUp
{
if (getskilllv(@SUP_id) >= @SUP_lvl)
goto L_shortcut;
misceffect sfx_skillup, strcharinfo(0);
setskill @SUP_id, @SUP_lvl;
getexp @SUP_xp, 0;
if (@SUP_xp)
mes "[" + @SUP_xp + " experience points]";
mes "[Level " + @SUP_lvl + " in " + @SUP_name$ + "]";
return;
L_shortcut:
mes "[You already have level " + getskilllv(@SUP_id) + " in " + @SUP_name$ + "]";
return;
}