diff options
Diffstat (limited to 'npc/config/magic.txt')
-rw-r--r-- | npc/config/magic.txt | 451 |
1 files changed, 451 insertions, 0 deletions
diff --git a/npc/config/magic.txt b/npc/config/magic.txt new file mode 100644 index 00000000..dbe665a6 --- /dev/null +++ b/npc/config/magic.txt @@ -0,0 +1,451 @@ +// The Mana World Script +// +// Author: Jesusalva <jesusalva@tmw2.org> +// +// Magic Script Core Functions +// +// Imported from Moubootaur Legends +// +// Important Variables: +// MAGIC_EXP +// Current mana magic experience +// LAST_SKILL +// Last Skill used (array) +// MAGIC_LVL +// Maximum tier of usable magic, capped by something +// MAGIC_PTS +// Amount of used Magic Skill Points (bad logic) +// MAGIC_CLU +// Array of (skill ID, Level) for sk_canlevelup + + +// This function will add MAGIC_EXP +// And manage last skills used memory +// GetManaExp(SkillID, EXP Points) +function script GetManaExp { + .@sk=getarg(0); + .@pt=getarg(1); + if (LAST_SKILL == .@sk) { + .@pt=cap_value(.@pt/3, 0, 1); + .@bonus=0; + } else { + // Update skill memory + LAST_SKILL[4]=LAST_SKILL[3]; + LAST_SKILL[3]=LAST_SKILL[2]; + LAST_SKILL[2]=LAST_SKILL[1]; + LAST_SKILL[1]=LAST_SKILL[0]; + LAST_SKILL[0]=.@sk; + } + + // Update Magic EXP + MAGIC_EXP=MAGIC_EXP+.@pt; + return; +} + + + +// sk_maxpoints() → Max Magic Skill Points you may use +// Returns how many points you can use +// Could be tweaked to read a variable instead +function script sk_maxpoints { + // 2 points per magic level + .@val=(MAGIC_LVL)*2; + // 1 point every twice magic level + .@val+=(MAGIC_LVL/2); + // Excluding first 15, 1 point every 12 job levels (Up to JL 75) + .@val+=min(5, ((JobLevel-15)/12)); + // 1 point per being a player + .@val+=1; + // 2 points per Rebirth + .@val+=(REBIRTH*2); + return .@val; +} + +// Returns how many points you can allocate +// Could be tweaked to NOT use MAGIC_PTS this way +function script sk_points { + return sk_maxpoints()-MAGIC_PTS; +} + +// Returns true if a skill can be leveled up. +// It checks the MSP +// sk_canlvup( {cost=1} ) +function script sk_canlvup { + return ((MAGIC_PTS+getarg(0,1)) <= sk_maxpoints()); +} + +// Level up a skill in 1 level (internal function) +// TODO: Return the point if leveling about Max Level +// sk_lvup( sk{, cost=0} ) +function script sk_lvup { + .@lvl=MAGIC_CLU[getarg(0)]; + getexp 0, 50*(.@lvl+1); + skill(getarg(0), .@lvl+1, 0); + if (getarg(1,0)) { + MAGIC_PTS+=getarg(1, 0); + } + MAGIC_CLU[getarg(0)]=.@lvl+1; + return; +} + +// Internal Magic School Learning Interface +// mlearn( skill, MAX_LV, MSP cost, item, amount{, GP cost} ) +// returns false if cheater; DO NOT USE IN SCRIPTS +function script mlearn { + .@sk=getarg(0); + .@ff=getarg(1); + .@msp=getarg(2); + .@it=getarg(3); + .@am=getarg(4); + .@gp=getarg(5, 0); + // Max level reached + if (getskilllv(.@sk) >= .@ff) { + return true; + } + // Not enough items + if (countitem(.@it) < .@am) + return false; + // Not enough MSP + if (!sk_canlvup(.@msp)) + return false; + // Not enough GP + if (Zeny < .@gp) { + return false; + } + + // Payment + delitem .@it, .@am; + Zeny-=.@gp; + + // Level up + sk_lvup(.@sk, .@msp); + return true; +} + +// NEW Magic School Learning Interface +// learn_magic(Skill) +function script learn_magic { + .@ski=getarg(0); + .@learn$=l("Learning"); + + // Check if skill is valid + .@mlv=$@MSK_MAXLV[.@ski]; + if (.@mlv < 1) { + return false;//Exception("ERROR: The skill "+.@ski+" is not valid!"); + } + + // Load a few temporary variables + .@pre=$@MSK_PREREQ[.@ski]; + .@it=$@MSK_ITEM[.@ski]; + .@am=$@MSK_AMOUNT[.@ski]; + .@msp=$@MSK_MSPCOST[.@ski]; + .@gp=$@MSK_COST[.@ski]; + + // Pre-requisite check + if (.@pre) { + if (getskilllv(.@pre) < 1) { + mesc l("Pre-requisites not met!"), 1; + mesc l("The following skill is needed: %s%s (Lv. %d)", + "##9", getskillname(.@pre), 1), 1; + return false; + } + } + + // Max level reached + if (getskilllv(.@ski) >= .@mlv) { + mesc l("You've reached the maximum level for this skill."), 1; + return true; + } + + // Skill level check + if (getskilllv(.@sk)) { + .@msp=1; + .@learn$=l("Upgrading"); + } + + mesc l("%s %s will require:", .@learn$, getskillname(.@ski)); + mes l("* %d/%d MSP (Magic Skill Points)", .@msp, sk_points()); + mes l("* %d/%d E (Esperins)", .@gp, Zeny); + mes l("* %d/%d %s", .@am, countitem(.@it), getitemlink(.@it)); + mes ""; + mesc l("Really learn this skill?"); + if (askyesno() == ASK_NO) + return false; + + return mlearn(.@ski, .@mlv, .@msp, .@it, .@am, .@gp); +} + +// transcheck( {item 1, amount 1}, {item 2, amount 2}... ) +// returns true upon success +function script transcheck { + if (getargcount() < 2 || getargcount() % 2 != 0) + return false;//Exception("Faulty learning skill command invoked - error"); + + // Count items + for (.@i=0;.@i < getargcount(); .@i++) { + if (countitem(getarg(.@i)) < getarg(.@i+1)) + return false; + .@i++; + } + + // Delete Items + for (.@i=0;.@i < getargcount(); .@i++) { + delitem getarg(.@i), getarg(.@i+1); + .@i++; + } + return true; +} + +// Returns a value defining your current magic control (affects success ratio, higher is better) +// A value of '5' means perfect control, and a value of '0' means overwhelm. +// abizit() +function script abizit { + .@lv=MAGIC_LVL+1; + if (.@lv < 1) return 0; + .@base=((.@lv*2)**3); + return min(MAGIC_EXP/.@base, 5); +} + + +// Reimplementation of abizit() +// Internal helper +// mescordialog(text, color, {dialog=1}) +function script mescordialog { + if (getarg(2, true)) + mesc getarg(0), getarg(1); + else + dispbottom col(getarg(0), getarg(1)); + return; +} + +// Reimplementation of abizit() +// It will show abizit in dialog box or in a floating message +// ShowAbizit({dialog=1}) +function script ShowAbizit { + .@dial=getarg(0, true); + if (.@dial) + mesn l("Current Magic Control"); + + .@lv=MAGIC_LVL+1; + .@val=MAGIC_EXP+rand(-.@lv*5, .@lv*5); + .@base=((.@lv*2)**3); + if (.@val > .@base*5) + mescordialog l("You are perfectly in control of your magic."), 3, .@dial; + else if (.@val > .@base*4) + mescordialog l("You are mostly in control of your magic."), 2, .@dial; + else if (.@val > .@base*3) + mescordialog l("You are somewhat in control of your magic."), 4, .@dial; + else if (.@val > .@base*2) + mescordialog l("Your magic is more powerful than you, but you can control."), 7, .@dial; + else if (.@val > .@base) + mescordialog l("You still are overwhelmed by your magic."), 6, .@dial; + else + mescordialog l("You are completly overwhelmed by your magic."), 1, .@dial; + return; +} + + +///////////////////////////////////////// +// RegisterMagic(MSP, Skill, MaxLv, Item, Amount, Class, Cost, {PreReq, PostReq}) +function script RegisterMagic { + .@msp=getarg(0); + .@ski=getarg(1); + .@max=getarg(2); + .@ite=getarg(3); + .@amo=getarg(4); + .@cla=getarg(5); + .@cos=getarg(6); + .@pre=getarg(7, false); + .@pos=getarg(8, false); + + $@MSK_MSPCOST[.@ski]=.@msp; + $@MSK_MAXLV[.@ski]=.@max; + + $@MSK_ITEM[.@ski]=.@ite; + $@MSK_AMOUNT[.@ski]=.@amo; + $@MSK_COST[.@ski]=.@cos; + + $@MSK_PREREQ[.@ski]=.@pre; + $@MSK_POSTREQ[.@ski]=.@pos; + + //array_push($@MSK_CLASS[.@cla], .@ski); // 3D Arrays are not supported + array_push($@MSK_MAGIC, .@ski); + return; +} + +- script Magic Load NPC_HIDDEN,{ +OnInit: + /* RegisterMagic(MSP, Skill, MaxLv, Item, Amount, + Class, Cost, {PreReq, PostReq}) */ + // (B) - Brawling + // (A) - Active + // (R) - Ranged (bows only) + // (M) - Magic + // (S) - Support + // (T) - Terrain + // (G) - GP on usage + // (P) - Passive + // (X) - Area Of Effect + + //////////////////////// Other: Misc + // Monster Identify + RegisterMagic(0, EVOL_MONSTER_IDENTIFY, 1, Beer, 1, + CLASS_OTHER, 5000); + // Bash (B) + RegisterMagic(0, SM_BASH, 1, MagicFeather, 1, + CLASS_OTHER, 0); + // Free Cast (P) + RegisterMagic(0, SA_FREECAST, 1, MagicFeather, 1, + CLASS_OTHER, 0); + // Full Throttle (A) + RegisterMagic(0, ALL_FULL_THROTTLE, 1, MagicFeather, 1, + CLASS_OTHER, 0); + + + //////////////////////// Master Skill Book: Skills + // These skills are handled by the Master Skill Book + // So the definition here is duplicate. + // Dragon Slayer (P) + RegisterMagic(0, SA_DRAGONOLOGY, 1, MagicFeather, 1, + CLASS_MASTER, 0); + // HP/DEF Boosting (P) + RegisterMagic(0, CR_TRUST, 1, MagicFeather, 1, + CLASS_MASTER, 0); + // HP Recovery (P) + RegisterMagic(0, SM_RECOVERY, 1, MagicFeather, 1, + CLASS_MASTER, 0); + // MP Recovery (P) + RegisterMagic(0, MG_SRECOVERY, 1, MagicFeather, 1, + CLASS_MASTER, 0); + // Mammonite (G) + RegisterMagic(0, MC_MAMMONITE, 1, MagicFeather, 1, + CLASS_MASTER, 0); + // Anti-Poison (A) + RegisterMagic(0, TF_DETOXIFY, 1, MagicFeather, 1, + CLASS_MASTER, 0); + // Trick Dead (A) + RegisterMagic(0, NV_TRICKDEAD, 1, MagicFeather, 1, + CLASS_MASTER, 0); + // Sudden Attack (A) + RegisterMagic(0, GC_DARKILLUSION, 1, MagicFeather, 1, + CLASS_MASTER, 0); + + //////////////////////// Master Skill Book: Spells + // MATK Charge (A) + RegisterMagic(0, HW_MAGICPOWER, 1, MagicFeather, 1, + CLASS_MASTER, 0); + // Poison (?) + RegisterMagic(0, TF_POISON, 1, MagicFeather, 1, + CLASS_MASTER, 0); + // Backslide (A) + RegisterMagic(0, TF_BACKSLIDING, 1, MagicFeather, 1, + CLASS_MASTER, 0); + // Discount (P) + RegisterMagic(0, MC_DISCOUNT, 1, MagicFeather, 1, + CLASS_MASTER, 0); + + + //////////////////////// War Magic: Skills + // Charged Shot (R) + RegisterMagic(1, AC_CHARGEARROW, 1, MagicFeather, 1, + CLASS_WAR, 0); + // Arrow Shower (RX) + RegisterMagic(1, AC_SHOWER, 1, MagicFeather, 1, + CLASS_WAR, 0); + // Ground Strike (AX) + RegisterMagic(1, ASC_METEORASSAULT, 1, MagicFeather, 1, + CLASS_WAR, 0); + // Sharp Shooter (R) + RegisterMagic(1, SN_SHARPSHOOTING, 1, MagicFeather, 1, + CLASS_WAR, 0); + // Critical Counter Attack (A) + RegisterMagic(1, KN_AUTOCOUNTER, 1, MagicFeather, 1, + CLASS_WAR, 0); + // Mallard's Eye (PR) + RegisterMagic(1, AC_VULTURE, 1, MagicFeather, 1, + CLASS_WAR, 0); + + //////////////////////// War Magic: Spells + // Soul Strike (M) + RegisterMagic(1, MG_SOULSTRIKE, 1, MagicFeather, 1, + CLASS_WAR, 0); + // Napalm Beat (MX) + RegisterMagic(1, MG_NAPALMBEAT, 1, MagicFeather, 1, + CLASS_WAR, 0); + + + //////////////////////// Nature Magic: Skills + // Nature Weapon (S) + RegisterMagic(1, SA_SEISMICWEAPON, 1, MagicFeather, 1, + CLASS_NATURE, 0); + // Wind Walker (A) + RegisterMagic(1, SN_WINDWALK, 1, MagicFeather, 1, + CLASS_NATURE, 0); + //////////////////////// Nature Magic: Spells + // Lightning Arrow (M) + RegisterMagic(1, MG_LIGHTNINGBOLT, 1, MagicFeather, 1, + CLASS_NATURE, 0); + // Nature Wall (T) + RegisterMagic(1, MG_FIREWALL, 1, MagicFeather, 1, + CLASS_NATURE, 0); + + + //////////////////////// Fire Magic: Skills + // Fire Weapon (S) + RegisterMagic(1, SA_FLAMELAUNCHER, 1, MagicFeather, 1, + CLASS_FIRE, 0); + //////////////////////// Fire Magic: Spells + // Fire Arrow (M) + RegisterMagic(1, MG_FIREBOLT, 1, MagicFeather, 1, + CLASS_FIRE, 0); + // Fire Ball (MX) + RegisterMagic(1, MG_FIREBALL, 1, MagicFeather, 1, + CLASS_FIRE, 0); + // Fire Walk (MX) + RegisterMagic(2, SO_FIREWALK, 1, MagicFeather, 1, + CLASS_FIRE, 0); + + + //////////////////////// Water Magic: Skills + // Frost Weapon (S) + RegisterMagic(1, SA_FROSTWEAPON, 1, MagicFeather, 1, + CLASS_WATER, 0); + //////////////////////// Water Magic: Spells + // Frost Diver (M) + RegisterMagic(1, MG_FROSTDIVER, 1, MagicFeather, 1, + CLASS_WATER, 0); + // Frost Nova (MX) + RegisterMagic(2, WZ_FROSTNOVA, 1, MagicFeather, 1, + CLASS_WATER, 0); + + + //////////////////////// Harmony Magic: Skills + // Provoke (A) + RegisterMagic(1, SM_PROVOKE, 1, MagicFeather, 1, + CLASS_HARMONY, 0); + // Mass Provoke (A) + RegisterMagic(1, EVOL_MASS_PROVOKE, 1, MagicFeather, 1, + CLASS_HARMONY, 0); + // Stealing (A) + RegisterMagic(1, TF_STEAL, 1, MagicFeather, 1, + CLASS_HARMONY, 0); + // Barter (P) + RegisterMagic(1, MC_OVERCHARGE, 1, MagicFeather, 1, + CLASS_HARMONY, 0); + // Backpack Floating (P) + RegisterMagic(1, ALL_INCCARRY, 1, MagicFeather, 1, + CLASS_HARMONY, 0); + //////////////////////// Harmony Magic: Spells + // Holy Light (M) + RegisterMagic(1, AL_HOLYLIGHT, 1, MagicFeather, 1, + CLASS_HARMONY, 0); + // Healing (MS) + RegisterMagic(1, AL_HEAL, 1, MagicFeather, 1, + CLASS_HARMONY, 0); + // High Healing (MS) + RegisterMagic(2, AB_HIGHNESSHEAL, 1, MagicFeather, 1, + CLASS_HARMONY, 0); + + end; +} + |