diff options
Diffstat (limited to 'npc/items/master_skillbook.txt')
-rw-r--r-- | npc/items/master_skillbook.txt | 164 |
1 files changed, 164 insertions, 0 deletions
diff --git a/npc/items/master_skillbook.txt b/npc/items/master_skillbook.txt new file mode 100644 index 00000000..007125cc --- /dev/null +++ b/npc/items/master_skillbook.txt @@ -0,0 +1,164 @@ +// The Mana World script. +// Author: +// Jesusalva +// Elvano +// Description: +// Contains master skills which can only be learnt after killing boss +// See also: https://forums.themanaworld.org/viewtopic.php?f=2&t=19918 +// Notes: +// Not exactly as Elvano proposal. I actually care for restrictions you know... +// Variables: +// PERMANENT: +// MASTERBOOK_PAGES - How many pages your Master Book have. +// Defaults to zero, so you can't @item it. +// MASTERBOOK_SKILL - An array with the skills you have learnt from Master Book. +// - It's more flexible this way. +// TEMPORARY: +// @mb_BossId - Contains the MobID of the boss your party killed. +// @mb_SkillId - Contains the SkillID which can be learnt with the boss. +// @mb_ItemId - Contains the Feather Id to write (or whatever) +// @mb_ItemAm - How many ink is required to write the skill +// Remember: @mb_BossId will be reset to zero after 15 seconds from boss death. +// Or upon logout. Or when changing maps. Temporary variables aren't reliable. +// +// @mb_BossId controls if you'll try to LEARN a skill, or READ the book. +// Remember: A dialog prevents timer events from happening, but doesn't stops the timer. +// TODO: Currently no way to get skill name from database (add getskillinfo() to server-plugin please) +// TODO: Reset @mb_* when register_skill() finish +// TODO: You cannot get Magic Feather anywhere in the game (yet) +// TODO: See if the time (15s) is enough. +// TODO: Skill level up +// TODO: Use the data supplied by magic.txt + +- script #MasterBook NPC_HIDDEN,{ + + + function register_skill { + + setnpcdialogtitle l(.book_name$); + + // If boss is set, but is negative, this means somebody else defeated it + if (@mb_BossId < 0) + { + mesc l("You did not defeat the boss, you can't learn any skills."); + @mb_BossId=0; + close; + } + + // Report the boss you killed, and the boss level + .@mb_lvl=strmobinfo(3, @mb_BossId); + mesc l("You just defeated the following boss: @@ (Lv. @@)", strmobinfo(1, @mb_BossId), .@mb_lvl); + + // The boss must have a skill + if (!@mb_SkillId) + { + mesc l("But there is no skill to be learnt from this boss."); + @mb_BossId=0; + close; + } + // You must have free pages + if (array_entries(MASTERBOOK_SKILL) >= MASTERBOOK_PAGES) + { + mesc l("But you ran out of empty pages on this book."); + @mb_BossId=0; + close; + } + // TODO: Party Level Range + // You must be at most 30 levels below the monster level + if (BaseLevel+30 < .@mb_lvl) + { + mesc l("But you are out of the boss level range."); + @mb_BossId=0; + close; + } + // You must have enough materials + if (countitem(@mb_ItemId) < @mb_ItemAm) + { + mesc l("But you do not have enough Magic Ink. (You need: @@ @@)", @mb_ItemAm, getitemlink(@mb_ItemId)); + //@mb_BossId=0; + close; + } + + // Allow you to check which skills are here to learn + mes ""; + mesc l("You have: @@/@@ @@", countitem(@mb_ItemId), @mb_ItemAm, getitemlink(@mb_ItemId)); + mesc l("Skill Available: %s", getskillname(@mb_SkillId)); + select + rif(!getskilllv(@mb_SkillId), l("Learn Skill")), + l("Do not learn"); + mes ""; + if (@menu == 1) + { + delitem @mb_ItemId, @mb_ItemAm; + skill(@mb_SkillId, 1, 0); + array_push(MASTERBOOK_SKILL, @mb_SkillId); + closeclientdialog; + dispbottom l("You have learnt the skill."); + } + @mb_BossId=0; + close; + } + + + function read_book { + + setnpcdialogtitle l(.book_name$); + mesc l("@@/@@ pages used.", array_entries(MASTERBOOK_SKILL), MASTERBOOK_PAGES); + + mesc l("List of known master skills:"); + mes ""; + for (.@i = 0; .@i < getarraysize(MASTERBOOK_SKILL); ++.@i) { + mesc l("* Skill ID: @@", MASTERBOOK_SKILL[.@i]); + } + close; + } + +OnUse: + // We assume if @mb_BossId is set, everything else is set, too + if (@mb_BossId) + register_skill; + if (openbook()) + read_book; + closeclientdialog(); + close; + +OnInit: + .book_name$ = getitemname(MasterBook); + .distance = 1; + end; + +OnUnset: + @mb_BossId=0; + @mb_SkillId=0; + @mb_ItemId=0; + @mb_ItemAm=0; + end; +} + +// Script Helper +// BossSlain(npcname, "variable") +function script BossSlain { + .@n$=getarg(0); + // Error + if (!playerattached()) + return; + // Only the party which defeated the boss can learn the skill + getmapxy(.@m$, .@x, .@y, 0); + .@party=getcharid(1); + if (.@party > 0) + { + setd(getarg(1), .@party); + areatimer(.@m$, .@x-15, .@y-15, .@x+15, .@y+15, 10, .@n$+"::OnBossCheck"); + mapannounce .@m$, "Boss deafeated by Party: " + getpartyname(.@party), bc_all; + } + else + { + setd(getarg(1), -2); + areatimer(.@m$, .@x-15, .@y-15, .@x+15, .@y+15, 10, .@n$+"::OnBossCheck"); + addtimer(20, .@n$+"::OnBegin"); + mapannounce .@m$, "Boss deafeated by: " + strcharinfo(0), bc_all; + } + return; +} + + |