summaryrefslogtreecommitdiff
path: root/npc/config/magic.txt
diff options
context:
space:
mode:
Diffstat (limited to 'npc/config/magic.txt')
-rw-r--r--npc/config/magic.txt451
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;
+}
+