initial calculations and data

This commit is contained in:
tmont 2021-02-14 19:09:37 -08:00
commit c4597fd600
10 changed files with 6567 additions and 0 deletions

1
.gitignore vendored Normal file
View File

@ -0,0 +1 @@
.idea

181
calc.js Normal file
View File

@ -0,0 +1,181 @@
// https://gamefaqs.gamespot.com/snes/563501-the-7th-saga/faqs/54038
exports.physicalAttack = (
attackerPowerInnate,
attackerPowerWeapon,
targetGuardInnate,
targetGuardArmor,
targetGuardAccessory,
options = {},
) => {
let attackPower = attackerPowerInnate;
if (options.attackerDefending) {
attackPower *= 1.5;
}
if (options.attackerPowerUp) {
attackPower *= 2;
}
let weaponPower = attackerPowerWeapon;
if (options.attackerDefending) {
weaponPower *= 1.5;
}
let guardPower = targetGuardInnate;
if (options.targetGuardDown) {
guardPower /= 2;
}
const totalAttackPower = attackPower + weaponPower;
const totalGuardPower = guardPower + targetGuardArmor + targetGuardAccessory;
let averageDamage = totalAttackPower - (totalGuardPower / 2);
if (options.targetGuardUp) {
averageDamage /= 2;
}
if (options.targetDefending) {
averageDamage /= 2;
}
let minDamage = averageDamage * 0.75;
let maxDamage = averageDamage * 1.25;
const absoluteMin = 1;
return {
normal: {
avg: Math.max(absoluteMin, averageDamage),
min: Math.max(absoluteMin, minDamage),
max: Math.max(absoluteMin, maxDamage),
},
critical: {
avg: Math.max(absoluteMin, averageDamage * 2),
min: Math.max(absoluteMin, minDamage * 2),
max: Math.max(absoluteMin, maxDamage * 2),
},
};
};
exports.magicalAttack = (
attackerMagicInnate,
targetMagicInnate,
targetResistanceInnate,
targetResistanceArmor,
targetResistanceAccessory,
spellPower,
options = {},
) => {
let attackerPower = attackerMagicInnate;
let targetPower = targetMagicInnate;
if (options.targetMagicUp) {
targetPower += 40;
}
const targetResistance = 100 - targetResistanceInnate - targetResistanceArmor - targetResistanceAccessory;
const spellBonusAttackPower = attackerPower + (options.attackerMagicUp ? 40 : 0);
const spellBonus = ((spellBonusAttackPower / 2) + spellPower) * (targetResistance / 100);
const averageDamage = attackerPower - targetPower + spellBonus;
return {
avg: Math.max(1, averageDamage),
min: Math.max(1, averageDamage * 0.75),
max: Math.max(1, averageDamage * 1.25),
};
};
exports.hpCatcherAttack = (
attackerMagicInnate,
attackerMaxHP,
attackerCurrentHP,
targetCurrentHP,
options = {},
) => {
let attackerPower = attackerMagicInnate;
if (options.attackerMagicUp) {
attackerPower += 40;
}
const adjust = dmg => Math.min(attackerMaxHP - attackerCurrentHP, Math.min(Math.min(dmg, 50), targetCurrentHP));
const minDamage = attackerPower / 2;
return {
min: adjust(minDamage),
max: adjust(minDamage + 15),
};
};
exports.mpCatcherAttack = (
attackerMagicInnate,
attackerMaxMP,
attackerCurrentMP,
targetCurrentMP,
options = {},
) => {
let attackerPower = attackerMagicInnate;
if (options.attackerMagicUp) {
attackerPower += 40;
}
const adjust = dmg => Math.min(attackerMaxMP - attackerCurrentMP, Math.min(Math.min(dmg, 40), targetCurrentMP));
const minDamage = attackerPower / 2;
return {
min: adjust(minDamage),
max: adjust(minDamage + 15),
};
};
exports.effectSpellHitRate = (
targetResistanceInnate,
targetResistanceArmor,
targetResistanceAccessory,
) => {
if (targetResistanceInnate === null) {
// e.g. "Class 1" enemies
return 0;
}
return Math.max(5, 100 - targetResistanceInnate - targetResistanceArmor - targetResistanceAccessory);
};
exports.hitRate = (
attackerSpeedInnate,
targetSpeedInnate,
options = {},
) => {
let attackerSpeed = attackerSpeedInnate;
if (options.attackerSpeedUp) {
attackerSpeed += 30;
}
let targetSpeed = targetSpeedInnate;
if (options.targetSpeedUp) {
targetSpeed += 30;
}
const hitRate = 85 + (0.8 * (attackerSpeed - targetSpeed));
return Math.max(10, Math.min(98, hitRate));
};
exports.runRate = (
attackerSpeedInnate,
targetSpeedInnate,
options = {},
) => {
let attackerSpeed = attackerSpeedInnate;
if (options.attackerSpeedUp) {
attackerSpeed += 30;
}
let targetSpeed = targetSpeedInnate;
if (options.targetSpeedUp) {
targetSpeed += 30;
}
const runRate = 0.25 + (1.6 * (attackerSpeed - targetSpeed));
return Math.max(0.1, Math.min(0.8, runRate));
};

936
docs/enemies.txt Normal file
View File

@ -0,0 +1,936 @@
************************************************************
*Android Exp: 88 Gold: 40 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 80 Thunder 30 Heal1 Opal 1/8
MaxMP 50 Fire 30 HPCatcher
Power 40 Ice 30
Guard 45 Vacuum 30
Magic 15 Debuff 0
Speed 45
************************************************************
*B.Demon Exp: 165 Gold: 75 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 80 Thunder 30 Heal1 (None)
MaxMP 50 Fire 30 Defense1
Power 60 Ice 30 Fire1
Guard 50 Vacuum 30 Poison
Magic 30 Debuff 30
Speed 30
************************************************************
*B.Night Exp: 771 Gold: 350 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 140 Thunder 30 Heal2 (None)
MaxMP 120 Fire 30 Defense1
Power 140 Ice 60 Ice2
Guard 140 Vacuum 60 Vacuum2
Magic 81 Debuff 30
Speed 81
************************************************************
*Brain Exp: 484 Gold: 220 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 158 Thunder 50 Poison Rcvry 1/8
MaxMP 150 Fire 50 Laser2
Power 65 Ice 50
Guard 85 Vacuum 50
Magic 50 Debuff 50
Speed 32
************************************************************
*Chimera Exp: 35 Gold: 16 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 40 Thunder 20 MPCatcher Potn1 1/8
MaxMP 30 Fire 20
Power 11 Ice 20
Guard 5 Vacuum 40
Magic 2 Debuff 20
Speed 30
************************************************************
*Chimere Exp: 660 Gold: 300 Class: 1 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 180 Thunder 50 Heal3 (None)
MaxMP 120 Fire 50 MPCatcher
Power 150 Ice 50 HPCatcher
Guard 240 Vacuum -- Defense2
Magic 140 Debuff --
Speed 160
************************************************************
*Cocoon Exp: 176 Gold: 80 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 67 Thunder 30 Heal2 Opal 1/8
MaxMP 80 Fire 30 Poison
Power 63 Ice 30 Defense1
Guard 120 Vacuum 30 HPCatcher
Magic 80 Debuff 30 Laser2
Speed 88 MPCatcher
Defense2
************************************************************
*Crab Exp: 1542 Gold: 700 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 440 Thunder 40 Petrify Opal 1/8
MaxMP 210 Fire 40 Defense2
Power 200 Ice 40 Ice2
Guard 450 Vacuum 40
Magic 160 Debuff 40
Speed 140
************************************************************
*D.Night Exp: 1630 Gold: 740 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 600 Thunder 50 Heal3 (None)
MaxMP 100 Fire 50 Petrify
Power 400 Ice 50 Defense2
Guard 650 Vacuum 90 MPCatcher
Magic 160 Debuff 50 HPCatcher
Speed 190
************************************************************
*Defeat Exp: 440 Gold: 200 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 200 Thunder 20 Petrify Opal 1/8
MaxMP 70 Fire 0 Defense2
Power 80 Ice 30 Poison
Guard 100 Vacuum 40 Fire1
Magic 70 Debuff 40
Speed 68
************************************************************
*Demon Exp: 33 Gold: 15 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 30 Thunder 10 Heal1 Potn1 3/16
MaxMP 30 Fire 10 Defense2
Power 9 Ice 10
Guard 7 Vacuum 10
Magic 2 Debuff 10
Speed 1
************************************************************
*Dergun Exp: 1101 Gold: 500 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 280 Thunder 40 (None) (None)
MaxMP 0 Fire 40
Power 150 Ice 40
Guard 360 Vacuum 40
Magic 140 Debuff 40
Speed 130
************************************************************
*Despair Exp: 220 Gold: 100 Class: 1 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 200 Thunder 20 Heal1 Opal 1/8
MaxMP 90 Fire 20 Petrify
Power 70 Ice 20 Firebird
Guard 100 Vacuum --
Magic 40 Debuff --
Speed 30
************************************************************
*Dogun Exp: 1101 Gold: 500 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 320 Thunder 40 Heal3 (None)
MaxMP 100 Fire 40
Power 180 Ice 40
Guard 380 Vacuum 70
Magic 160 Debuff 40
Speed 160
************************************************************
*Doom Exp: 771 Gold: 350 Class: 1 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 320 Thunder 20 Fire2 Opal 1/8
MaxMP 110 Fire 20 Fireball
Power 170 Ice 0 MPCatcher
Guard 230 Vacuum --
Magic 140 Debuff --
Speed 100
************************************************************
*Doros Exp: 2423 Gold: 1100 Class: 1 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 1800 Thunder 70 Heal2 (None)
MaxMP 200 Fire 70 Fire2
Power 140 Ice 70 Fireball
Guard 220 Vacuum -- MPCatcher
Magic 130 Debuff -- Vacuum1
Speed 130
************************************************************
*Dragon Exp: 2203 Gold: 1000 Class: 1 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 1100 Thunder 40 Petrify (None)
MaxMP 230 Fire 40 Defense1
Power 110 Ice 40 Defense2
Guard 220 Vacuum -- Fireball
Magic 110 Debuff --
Speed 80
************************************************************
*F.Night Exp: 1410 Gold: 640 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 400 Thunder 60 Fire2 (None)
MaxMP 130 Fire 80 Fireball
Power 340 Ice 20
Guard 550 Vacuum 80
Magic 150 Debuff 80
Speed 150
************************************************************
*F.Witch Exp: 1211 Gold: 550 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 300 Thunder 30 Petrify (None)
MaxMP 140 Fire 30 Vacuum2
Power 160 Ice 30
Guard 380 Vacuum 30
Magic 160 Debuff 30
Speed 130
************************************************************
*Falock Exp: 1057 Gold: 480 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 600 Thunder 30 Agility (None)
MaxMP 80 Fire 30
Power 300 Ice 30
Guard 600 Vacuum 30
Magic 126 Debuff 30
Speed 120
************************************************************
*Flame Exp: 991 Gold: 450 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 400 Thunder 30 Fire2 Opal 1/8
MaxMP 200 Fire 95 Fireball
Power 140 Ice 0 Firebird
Guard 120 Vacuum 40
Magic 86 Debuff 30
Speed 90
************************************************************
*Foma Exp: 3745 Gold: 1700 Class: 1 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 1800 Thunder 60 MPCatcher Opal 1/8
MaxMP 320 Fire 60 Thunder1
Power 180 Ice 60 Thunder2
Guard 500 Vacuum --
Magic 180 Debuff --
Speed 180
************************************************************
*Gariso Exp: 4846 Gold: 2200 Class: 1 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 3000 Thunder 50 Heal2 (None)
MaxMP 220 Fire 50 Ice2
Power 160 Ice 50 Fireball
Guard 250 Vacuum -- Vacuum2
Magic 150 Debuff --
Speed 140
************************************************************
*Ghoul Exp: 881 Gold: 400 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 170 Thunder 30 Heal2 Opal 1/8
MaxMP 110 Fire 30 Revive1
Power 140 Ice 30
Guard 280 Vacuum 30
Magic 133 Debuff 30
Speed 120
************************************************************
*Goron Exp: 6609 Gold: 3000 Class: 1 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 2600 Thunder 50 Blizzard2 (None)
MaxMP 220 Fire 50
Power 230 Ice 50
Guard 520 Vacuum --
Magic 170 Debuff --
Speed 160
************************************************************
*Gorsia Exp: 0 Gold: 0 Class: 1 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 4000 Thunder 70 Heal2 (None)
MaxMP 255 Fire 70 Fire2
Power 600 Ice 70 Blizzard2
Guard 1400 Vacuum -- Vacuum1
Magic 250 Debuff -- Fireball
Speed 250 Ice2
Thunder1
Petrify
************************************************************
*Griffan Exp: 8812 Gold: 4000 Class: 1 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 3400 Thunder 50 Petrify (None)
MaxMP 220 Fire 50 Vacuum2
Power 240 Ice 50 Blizzard2
Guard 480 Vacuum --
Magic 200 Debuff --
Speed 170
************************************************************
*Griffin Exp: 484 Gold: 220 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 100 Thunder 40 Heal2 Opal 1/8
MaxMP 300 Fire 40 Poison
Power 130 Ice 40 Petrify
Guard 130 Vacuum 60 Vacuum1
Magic 100 Debuff 40
Speed 100
************************************************************
*Hermit Exp: 26 Gold: 12 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 18 Thunder 20 (None) Potn1 1/16
MaxMP 0 Fire 20
Power 3 Ice 20
Guard 4 Vacuum 20
Magic 2 Debuff 20
Speed 1
************************************************************
*K.Moon Exp: 660 Gold: 300 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 450 Thunder 40 Fire2 (None)
MaxMP 220 Fire 80 Fireball
Power 140 Ice 10
Guard 210 Vacuum 80
Magic 112 Debuff 70
Speed 90
************************************************************
*K.Night Exp: 1321 Gold: 600 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 380 Thunder 40 Heal2 (None)
MaxMP 200 Fire 40 Ice2
Power 170 Ice 40 Blizzard2
Guard 440 Vacuum 70 Defense1
Magic 150 Debuff 40
Speed 210
************************************************************
*K.Trick Exp: 881 Gold: 400 Class: 1 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 300 Thunder 40 Heal2 Pearl 1/16
MaxMP 180 Fire 40 Poison Topaz 9/16
Power 120 Ice 40 HPCatcher Ruby 3/16
Guard 100 Vacuum -- Ice2 Saphr 2/16
Magic 80 Debuff -- Blizzard2 Emrld 1/16
Speed 90
************************************************************
*M-Pison Exp: 2203 Gold: 1000 Class: 1 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 2400 Thunder 40 Heal3 (None)
MaxMP 120 Fire 40 Petrify
Power 220 Ice 40 Defense1
Guard 260 Vacuum -- Defense2
Magic 150 Debuff -- MPCatcher
Speed 100 Vacuum1
************************************************************
*Manrot Exp: 132 Gold: 60 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 78 Thunder 30 Heal1 Opal 1/8
MaxMP 40 Fire 30 Ice1
Power 50 Ice 30 Petrify
Guard 55 Vacuum 50
Magic 28 Debuff 10
Speed 30
************************************************************
*Manta Exp: 242 Gold: 110 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 88 Thunder 30 Agility Opal 1/8
MaxMP 50 Fire 30
Power 55 Ice 30
Guard 90 Vacuum 30
Magic 50 Debuff 30
Speed 67
************************************************************
*Monmo Exp: 4406 Gold: 2000 Class: 1 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 750 Thunder 99 Heal2 (None)
MaxMP 220 Fire 50 MPCatcher
Power 160 Ice 99 HPCatcher
Guard 1600 Vacuum -- Petrify
Magic 122 Debuff --
Speed 120
************************************************************
*Mutant Exp: 506 Gold: 230 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 300 Thunder 40 Heal2 (None)
MaxMP 130 Fire 40 Blizzard1
Power 120 Ice 40 Revive1
Guard 127 Vacuum 70 Ice1
Magic 100 Debuff 90 Petrify
Speed 70
************************************************************
*N.Brain Exp: 991 Gold: 450 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 450 Thunder 70 Heal2 (None)
MaxMP 220 Fire 70 Revive1
Power 140 Ice 70 HPCatcher
Guard 210 Vacuum 80 Petrify
Magic 112 Debuff 70
Speed 90
************************************************************
*Orc Exp: 136 Gold: 62 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 80 Thunder 20 (None) Opal 1/8
MaxMP 0 Fire 20
Power 44 Ice 20
Guard 60 Vacuum 20
Magic 37 Debuff 10
Speed 55
************************************************************
*P.Moon Exp: 462 Gold: 210 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 440 Thunder 30 Poison (None)
MaxMP 80 Fire 30 MPCatcher
Power 120 Ice 30 Petrify
Guard 110 Vacuum 30
Magic 100 Debuff 30
Speed 120
************************************************************
*Pison Exp: 264 Gold: 120 Class: 1 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 250 Thunder 30 Heal2 (None)
MaxMP 15 Fire 30
Power 40 Ice 30
Guard 50 Vacuum --
Magic 14 Debuff --
Speed 30
************************************************************
*Plater Exp: 440 Gold: 200 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 210 Thunder 10 (None) (None)
MaxMP 0 Fire 10
Power 115 Ice 10
Guard 190 Vacuum 10
Magic 71 Debuff 10
Speed 70
************************************************************
*R.Demon Exp: 462 Gold: 210 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 120 Thunder 30 Heal2 (None)
MaxMP 70 Fire 60 Defense1
Power 100 Ice 0 Fire2
Guard 150 Vacuum 50 Firebird
Magic 60 Debuff 40 Blizzard2
Speed 74
************************************************************
*R-Pison Exp: 2203 Gold: 1000 Class: 1 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 280 Thunder 30 Heal2 (None)
MaxMP 30 Fire 30 Blizzard2
Power 120 Ice 30
Guard 100 Vacuum --
Magic 61 Debuff --
Speed 55
************************************************************
*R.Trick Exp: 440 Gold: 200 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 110 Thunder 40 Poison Pearl 1/16
MaxMP 80 Fire 40 Vacuum1 Topaz 9/16
Power 100 Ice 40 Firebird Ruby 3/16
Guard 100 Vacuum 60 HPCatcher Saphr 2/16
Magic 80 Debuff 40 Emrld 1/16
Speed 70
************************************************************
*Reaper Exp: 881 Gold: 400 Class: 1 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 700 Thunder 30 MPCatcher Opal 1/8
MaxMP 200 Fire 30 Vacuum1
Power 150 Ice 30 Fireball
Guard 380 Vacuum --
Magic 160 Debuff --
Speed 140
************************************************************
*Romus Exp: 528 Gold: 240 Class: 1 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 300 Thunder 40 HPCatcher (None)
MaxMP 110 Fire 40
Power 30 Ice 40
Guard 40 Vacuum --
Magic 12 Debuff --
Speed 20
************************************************************
*S.Brain Exp: 1762 Gold: 800 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 400 Thunder 40 Heal2 (None)
MaxMP 100 Fire 40 MPCatcher
Power 130 Ice 40 HPCatcher
Guard 150 Vacuum 70 Vacuum1
Magic 80 Debuff 40
Speed 60
************************************************************
*S.Demon Exp: 1321 Gold: 600 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 320 Thunder 40 Heal3 (None)
MaxMP 210 Fire 40 Revive1
Power 210 Ice 40 Fire2
Guard 480 Vacuum 80 Defense2
Magic 180 Debuff 40
Speed 180
************************************************************
*S.Witch Exp: 330 Gold: 150 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 160 Thunder 30 Petrify Opal 1/8
MaxMP 90 Fire 30 Defense1
Power 75 Ice 30 Defense2
Guard 140 Vacuum 30 MPCatcher
Magic 50 Debuff 99
Speed 60
************************************************************
*Sage Exp: 330 Gold: 150 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 110 Thunder 50 Heal2 Opal 1/8
MaxMP 100 Fire 50 MPCatcher
Power 90 Ice 50 Revive2
Guard 110 Vacuum 80 Defense2
Magic 110 Debuff 50 Firebird
Speed 80
************************************************************
*Serpant Exp: 1211 Gold: 550 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 240 Thunder 40 Heal2 (None)
MaxMP 170 Fire 40 Petrify
Power 160 Ice 40 MPCatcher
Guard 300 Vacuum 40 Blizzard2
Magic 200 Debuff 40
Speed 180
************************************************************
*Serpent Exp: 3084 Gold: 1400 Class: 1 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 2000 Thunder 50 Ice1 (None)
MaxMP 220 Fire 50 Blizzard1
Power 110 Ice 50 Petrify
Guard 220 Vacuum -- MPCatcher
Magic 90 Debuff -- Defense2
Speed 100 HPCatcher
************************************************************
*Serpint Exp: 1476 Gold: 670 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 320 Thunder 60 MPCatcher (None)
MaxMP 150 Fire 60 Petrify
Power 180 Ice 60 Revive1
Guard 500 Vacuum 90
Magic 160 Debuff 60
Speed 170
************************************************************
*Soidiek Exp: 550 Gold: 250 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 250 Thunder 20 (None) Opal 1/8
MaxMP 0 Fire 20
Power 110 Ice 20
Guard 160 Vacuum 20
Magic 57 Debuff 20
Speed 71
************************************************************
*Spidek Exp: 242 Gold: 110 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 85 Thunder 20 Poison (None)
MaxMP 50 Fire 20 Defense2
Power 70 Ice 20
Guard 84 Vacuum 20
Magic 70 Debuff 20
Speed 90
************************************************************
*Spirit Exp: 1255 Gold: 570 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 280 Thunder 30 Heal2 Opal 1/8
MaxMP 120 Fire 30 Thunder1
Power 210 Ice 30 Thunder2
Guard 350 Vacuum 30 Agility
Magic 140 Debuff 30
Speed 160
************************************************************
*Statue Exp: 30 Gold: 14 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 50 Thunder 10 (None) (None)
MaxMP 0 Fire 10
Power 7 Ice 10
Guard 10 Vacuum 10
Magic 2 Debuff 10
Speed 7
************************************************************
*Sword Exp: 1101 Gold: 500 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 9 Thunder 99 Defense2 TranqSW 1/16
MaxMP 200 Fire 99 Vacuum1 PsyteSW 1/16
Power 200 Ice 99 Petrify AnimSW 1/16
Guard 1800 Vacuum 99 MPCatcher KrynSW 1/16
Magic 150 Debuff 99 Saber 1/16
Speed 100 SwordSW 1/8
************************************************************
*Titan Exp: 264 Gold: 120 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 210 Thunder 20 (None) Opal 1/8
MaxMP 0 Fire 20
Power 65 Ice 20
Guard 100 Vacuum 20
Magic 55 Debuff 20
Speed 50
************************************************************
*Trick Exp: 220 Gold: 100 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 80 Thunder 50 Heal1 Pearl 1/16
MaxMP 50 Fire 50 Poison Topaz 9/16
Power 100 Ice 50 Petrify Ruby 3/16
Guard 60 Vacuum 50 Agility Saphr 2/16
Magic 20 Debuff 50 HPCatcher Emrld 1/16
Speed 35
************************************************************
*Undead Exp: 88 Gold: 40 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 80 Thunder 20 Heal1 Opal 1/8
MaxMP 40 Fire 20 Revive1
Power 30 Ice 20
Guard 32 Vacuum 70
Magic 12 Debuff 20
Speed 28
************************************************************
*Unded Exp: 1101 Gold: 500 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 550 Thunder 40 Heal2 (None)
MaxMP 100 Fire 40 Revive1
Power 160 Ice 40 HPCatcher
Guard 220 Vacuum 90 Vacuum1
Magic 120 Debuff 60
Speed 140
************************************************************
*Undeed Exp: 1321 Gold: 600 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 320 Thunder 40 Heal3 Rcvry 1/8
MaxMP 100 Fire 40 Revive1
Power 240 Ice 40 MPCatcher
Guard 420 Vacuum 70
Magic 170 Debuff 40
Speed 160
************************************************************
*V.Night Exp: 705 Gold: 320 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 350 Thunder 50 Heal3 (None)
MaxMP 120 Fire 50 Fire2
Power 150 Ice 50 Defense1
Guard 300 Vacuum 90 Fireball
Magic 120 Debuff 50
Speed 110
************************************************************
*Wyrock Exp: 550 Gold: 250 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 170 Thunder 30 Heal2 Opal 1/8
MaxMP 210 Fire 20 Ice2
Power 110 Ice 50 Blizzard1
Guard 150 Vacuum 60 Petrify
Magic 110 Debuff 40 Revive1
Speed 80
************************************************************
*Wyvern Exp: 33 Gold: 15 Class: 0 *
************************************************************
Stats Resists Spells Drops
------------ ------------ ------------ ------------
MaxHP 21 Thunder 0 (None) Potn1 3/16
MaxMP 0 Fire 0
Power 7 Ice 0
Guard 1 Vacuum 0
Magic 3 Debuff 0
Speed 26

3153
docs/guide.txt Normal file

File diff suppressed because it is too large Load Diff

32
enemies.js Normal file
View File

@ -0,0 +1,32 @@
exports.enemies = [
{
name: 'Android',
exp: 88,
gold: 40,
cls: 0,
stats: {
hp: 80,
mp: 50,
power: 40,
guard: 45,
magic: 15,
speed: 45,
},
resistance: {
thunder: 30,
fire: 30,
ice: 30,
vacuum: 30,
debuff: 0,
},
spells: [ 'Heal1', 'HPCatcher' ],
drops: {
opal: 1 / 8,
}
},
];
exports.enemyMap = exports.enemies.reduce((map, enemy) => {
map[enemy.name] = enemy;
return map;
}, {});

1750
enemies.json Normal file

File diff suppressed because it is too large Load Diff

82
exp.js Normal file
View File

@ -0,0 +1,82 @@
exports.exp = [
0,
140,
196,
274,
385,
499,
649,
844,
1097,
1427,
1711,
2054,
2465,
2958,
3549,
4082,
4694,
5397,
6208,
7139,
7781,
8482,
9245,
10077,
10984,
11533,
12109,
12716,
13351,
14018,
14299,
14585,
14877,
15174,
15477,
15633,
15789,
15946,
16106,
16267,
16398,
16528,
16661,
16794,
16928,
17064,
17200,
17338,
17476,
17617,
17740,
17863,
17989,
18115,
18242,
18387,
18535,
18683,
18832,
18983,
19401,
19828,
20263,
20710,
21165,
22329,
23557,
24853,
26220,
27662,
30097,
32744,
35626,
38762,
42172,
46390,
51028,
56132,
61744,
67919,
];

249
items.js Normal file
View File

@ -0,0 +1,249 @@
const lux = 'Lux';
const wilme = 'Wilme';
const kamil = 'Kamil';
const olvan = 'Olvan';
const esuna = 'Esuna';
const lejes = 'Lejes';
const valsu = 'Valsu';
const lemele = 'Lemele';
const rablesk = 'Rablesk';
const bonro = 'Bonro';
const zellis = 'Zellis';
const pell = 'Pell';
const patrof = 'Patrof';
const bone = 'Bone';
const dowaine = 'Dowaine';
const belaine = 'Belaine';
const telaine = 'Telaine';
const pang = 'Pang';
const polasu = 'Polasu';
const pandam = 'Pandam';
const bilthem = 'Bilthem';
const padal = 'Padal';
const brush = 'Brush';
const tiffana = 'Tiffana';
const valenca = 'Valenca';
const pharano = 'Pharano';
const bugask = 'Bugask';
const guanta = 'Guanta';
const pasanda = 'Pasanda';
const melenam = 'Melenam';
const ligena = 'Ligena';
const airship = 'Airship';
const palsu = 'Palsu';
const initial = char => `Initial (${char})`;
const weapon = (name, attack, cost, users, locations) => {
return {
name,
attack,
cost,
users,
locations,
};
};
exports.weapons = [
weapon('Claw', 2, 0, [ wilme ], [ initial(wilme) ]),
weapon('ZnteFT', 2, 1000, [ lux ], [initial(lux) ]),
weapon('KrynFT', 20, 22000, [ lux ], [ melenam, airship ]),
weapon('FireAX', 2, 70, [ olvan, kamil ], [ lemele, bonro, initial(olvan) ]),
weapon('PsyteAX', 6, 300, [olvan, kamil ], [ rablesk, bonro ]),
weapon('AnimAX', 19, 2500, [ olvan, kamil ], [ zellis, pell ]),
weapon('AngerAX', 23, 4000, [ olvan, kamil ], [ pell, patrof, bone, dowaine, pang ]),
weapon('PowerAX', 31, 8100, [ olvan ], [ bone, dowaine, belaine, telaine, polasu ]),
weapon('DespAX', 40, 16000, [ olvan ], [ belaine, telaine, padal, bilthem, pandam, brush ]),
weapon('KrynAX', 50, 22200, [ olvan ], [ pang, padal, tiffana, bilthem, pandam, brush, valenca, pharano ]),
weapon('FearAX', 58, 28000, [ olvan ], [ pang, bugask, guanta ]),
weapon('MystAX', 72, 35000, [ olvan ], [ valenca, pharano, pasanda, melenam ]),
weapon('HopeAX', 80, 43000, [ olvan ], [ pasanda, ligena, palsu, melenam ]),
weapon('ImmoAX', 120, 56000, [ olvan ], [ palsu, airship ]),
weapon('TranqSW', 2, 50, [ olvan, kamil, lejes ], [ initial(kamil), initial(lejes) ]),
weapon('ZnteSW', 2, 100, [ olvan, kamil, lejes ], [ 'Buy in Belaine for 4000G' ]),
weapon('PsyteSW', 4, 150, [olvan, kamil, lejes ], [ lemele, rablesk ]),
weapon('AnimSW', 7, 350, [olvan, kamil, lejes ], [ lemele, rablesk, bonro ]),
weapon('KrynSW', 12, 800, [olvan, kamil, lejes ], [ bonro ]),
weapon('AngerSW', 16, 1700, [olvan, kamil, lejes ], [ zellis, pell ]),
weapon('TidalSW', 18, 1000, [olvan, kamil, lejes ], [ 'Buy in Belaine for 1000G' ]),
weapon('NatrSW', 21, 2600, [olvan, kamil, lejes ], [ zellis, pell, patrof ]),
weapon('BrillSW', 25, 4500, [ kamil, lejes ], [ patrof, bone, dowaine ]),
weapon('SwordSW', 25, 2000, [ wilme, olvan, kamil, lejes, valsu, esuna ], [ 'Dropped by Sword' ]),
weapon('MuraSW', 26, 5020, [ kamil, lejes ], [ 'Buy in Belaine for 5000G' ]),
weapon('CourSW', 28, 5300, [ kamil, lejes ], [ bone, dowaine, telaine, pang ]),
weapon('DespSW', 33, 8200, [ kamil, lejes ], [ belaine, telaine, polasu, tiffana, pandam, brush, valenca ]),
weapon('FearSW', 38, 11500, [ kamil, lejes ], [ belaine, padal, polasu, tiffana, pandam, brush, valenca, bugask, guanta ]),
weapon('FortSW', 38, 25000, [ valsu, esuna ], [ 'Gorfun Castle (present)' ]),
weapon('FireSW', 45, 15200, [ kamil ], [ padal, bilthem, bugask, guanta ]),
weapon('InsaSW', 53, 20000, [ kamil ], [ bilthem ]),
weapon('AnscSW', 67, 28500, [ olvan, kamil, lejes ], [ guanta, pharano, pasanda, ligena, melenam ]),
weapon('DoomSW', 90, 37000, [ olvan, kamil, lejes ], [ pharano, pasanda, ligena, palsu, melenam, airship ]),
weapon('VictSW', 100, 48000, [ kamil ], [ palsu, airship ]),
weapon('LightKN', 5, 400, [ valsu, esuna ], [ lemele, rablesk ]),
weapon('Saber', 11, 1700, [ valsu, esuna ], [ zellis, pell, polasu ]),
weapon('FireKN', 26, 15200, [ valsu, esuna ], [ polasu ]),
weapon('LightST', 1, 30, [ olvan, kamil, lejes, valsu, esuna ], [ initial(valsu), initial(esuna) ]),
weapon('PetrST', 3, 180, [ olvan, kamil, lejes, valsu, esuna ], [ lemele, rablesk, bonro ]),
weapon('TideRD', 8, 1000, [ olvan, kamil, lejes, valsu, esuna ], [ zellis, patrof ]),
weapon('ConfRD', 14, 2500, [ olvan, kamil, lejes, valsu, esuna ], [ patrof, bone, dowaine, belaine, telaine, pandam, valenca ]),
weapon('BrillRD', 17, 4000, [ olvan, kamil, lejes, valsu, esuna ], [ telaine, pang, padal, tiffana, bilthem, brush ]),
weapon('DespRD', 20, 5800, [ olvan, kamil, lejes, valsu, esuna ], [ tiffana, bugask, guanta ]),
weapon('NatrRD', 30, 20000, [ olvan, kamil, lejes, valsu, esuna ], [ bugask, pharano ]),
weapon('FearRD', 50, 32000, [ olvan, kamil, valsu, esuna ], [ pasanda, ligena ]),
weapon('MystRD', 75, 40000, [ olvan, kamil, valsu, esuna ], [ ligena ]),
weapon('ImmoRD', 85, 55000, [ lejes, valsu, esuna ], [ palsu, airship ]),
];
const armor = (name, defense, cost, users, locations, resistance) => {
resistance = resistance || [ 0, 0, 0, 0, 0 ];
return {
name,
defense,
cost,
users,
locations,
resistance: {
thunder: resistance[0],
fire: resistance[1],
ice: resistance[2],
vacuum: resistance[3],
debuff: resistance[4],
},
};
};
exports.armor = [
armor('Xtri', 2, 0, [ wilme ], [ initial(wilme) ]),
armor('Coat', 8, 2000, [ lux ], [ initial(lux) ]),
armor('Brwn', 12, 3000, [ lux ], [ 'Find in Melenam (present)' ]),
armor('Blck', 30, 36000, [ lux ], [ melenam, airship ], [ 10, 10, 10, 10, 10 ]),
armor('XtriAR', 1, 80, [ olvan, kamil ], [ initial(olvan), initial(kamil) ]),
armor('PsyteAR', 5, 700, [ olvan, kamil ], [ lemele, rablesk, bonro, zellis, pell, dowaine ]),
armor('AnimAR', 8, 1600, [ olvan, kamil ], [ zellis, pell, patrof, bone, dowaine ]),
armor('RoylAR', 14, 2400, [ olvan, kamil ], [ patrof, bone, belaine, telaine, pang, padal, pandam, valenca ]),
armor('CourAR', 18, 5000, [ olvan, kamil ], [ belaine, telaine, pang, padal, polasu, tiffana, pandam, valenca ]),
armor('BravAR', 24, 8800, [ olvan, kamil ], [ polasu, tiffana, brush ]),
armor('MystcAR', 32, 12000, [ olvan, kamil ], [ bilthem, brush, bugask, guanta ]),
armor('FortAR', 42, 14200, [ olvan, kamil ], [ bilthem, bugask, guanta, pharano, pasanda ]),
armor('ScaleML', 50, 18000, [ olvan, kamil ], [ pharano, pasanda, ligena, palsu ]),
armor('ChainML', 72, 23000, [ olvan, kamil ], [ ligena, palsu ]),
armor('KrynML', 88, 33000, [ olvan, kamil ], [ melenam, airship ]),
armor('LghtRB', 1, 60, [ olvan, kamil, lejes, valsu, esuna ], [ initial(lejes), initial(valsu), initial(esuna) ]),
armor('CttnRB', 2, 440, [ lejes, valsu, esuna ], [ lemele, rablesk ], [ 0, 0, 0, 20, 20 ]),
armor('SilkRB', 4, 800, [ lejes, valsu, esuna ], [ bonro, zellis, pell ], [ 0, 0, 0, 20, 20 ]),
armor('XtreRB', 6, 1600, [ olvan, kamil, lejes, valsu, esuna ], [ zellis ]),
armor('SeasRB', 8, 3700, [ lejes, valsu, esuna ], [ pell, patrof, dowaine, belaine, pang ], [ 0, 0, 0, 20, 20 ]),
armor('HopeRB', 12, 5600, [ lejes, valsu, esuna ], [ bone, dowaine, belaine, telaine, pang, padal, polasu, tiffana, bilthem, brush ], [ 0, 0, 0, 20, 20 ]),
armor('AngerRB', 16, 9000, [ lejes, valsu, esuna ], [ telaine, padal, polasu, tiffana, bilthem, pandam, brush ], [ 0, 0, 0, 20, 20 ]),
armor('VictRB', 21, 14000, [ lejes, valsu, esuna ], [ pandam, valenca, bugask, guanta ], [ 0, 0, 0, 20, 20 ]),
armor('DespRB', 26, 20000, [ lejes, valsu, esuna ], [ valenca, bugask, guanta, pharano ], [ 10, 10, 10, 20, 20 ]),
armor('ConfRB', 30, 32000, [ lejes, valsu, esuna ], [ pharano, pasanda, ligena, melenam ], [ 10, 10, 10, 20, 20 ]),
armor('MystcRB', 36, 48000, [ lejes, valsu, esuna ], [ pasanda, ligena, palsu, melenam, airship ], [ 10, 10, 10, 30, 30 ]),
armor('ImmoRB', 42, 56000, [ lejes, valsu, esuna ], [ palsu, airship ], [ 20, 20, 20, 30, 30 ]),
armor('FireCL', 20, 10000, [ olvan, kamil, lejes, valsu, esuna ], [ 'Find in Dowaine' ], [ 0, 40, 0, 0, 0 ]),
armor('IceCL', 20, 10000, [ olvan, kamil, lejes, valsu, esuna ], [ 'Find in Baran Castle' ], [ 0, 0, 40, 0, 0 ]),
];
const accessory = (name, defense, cost, users, locations, resistance) => {
resistance = resistance || [ 30, 30, 30, 30, 30 ];
return {
name,
defense,
cost,
users,
locations,
resistance: {
thunder: resistance[0],
fire: resistance[1],
ice: resistance[2],
vacuum: resistance[3],
debuff: resistance[4],
},
};
};
exports.accessories = [
accessory('Horn', 0, 0, [ wilme ], [ initial(wilme) ]),
accessory('Pod', 2, 2, [ lux ], [ initial(lux) ]),
accessory('XtriSH', 1, 70, [ olvan, kamil ], [ rablesk, bonro, zellis, tiffana ]),
accessory('KrynSH', 8, 500, [ olvan, kamil ], [ zellis, pell, patrof, bone ]),
accessory('CourSH', 14, 3000, [ olvan, kamil ], [ patrof, bone, dowaine, pang ]),
accessory('BrillSH', 18, 6800, [ olvan, kamil ], [ belaine, telaine ]),
accessory('JustSH', 24, 8600, [ olvan, kamil ], [ pandam ]),
accessory('SoundSH', 28, 10200, [ olvan, kamil ], [ polasu, bilthem ]),
accessory('MystSH', 32, 16200, [ olvan, kamil ], [ brush ]),
accessory('AngerSH', 36, 23000, [ olvan, kamil ], [ padal, pasanda ]),
accessory('IllusSH', 38, 24000, [ olvan, kamil ], [ 'Find in Grime tower' ]),
accessory('MystcSH', 40, 31000, [ olvan, kamil ], [ valenca, bugask, guanta, pharano, pasanda ]),
accessory('FrtnSH', 50, 42000, [ olvan, kamil ], [ ligena, palsu, melenam ]),
accessory('ImmoSH', 56, 51000, [ olvan, kamil ], [ melenam, airship ]),
accessory('XtriHM', 0, 40, [ olvan, kamil, lejes, valsu, esuna ], [ initial(olvan), initial(kamil), initial(lejes), initial(valsu), initial(esuna) ], [ 30, 30, 30, 40, 40 ]),
accessory('Scarf', 10, 1200, [ lejes, valsu, esuna ], [ bonro ], [ 30, 30, 30, 40, 40 ]),
accessory('MaskMK', 20, 9500, [ lejes, valsu, esuna ], [ pang ], [ 30, 30, 30, 40, 40 ]),
accessory('KrynMK', 40, 20000, [ valsu, esuna ], [ bugask ], [ 30, 30, 30, 40, 40 ]),
accessory('BrillCR', 60, 45000, [ valsu, esuna ], [ palsu, airship ], [ 30, 30, 30, 40, 60 ]),
accessory('Ring', 20, 12000, [ olvan, kamil, lejes, valsu, esuna ], [ 'Find in Pandam Inn' ], [ 30, 30, 30, 95, 30 ]),
accessory('Amulet', 30, 10000, [ olvan, kamil, lejes, valsu, esuna ], [ 'Find in Bilthem' ], [ 30, 30, 30, 30, 95 ]),
];
const item = (name, cost, effect, locations) => {
return {
name,
cost,
effect,
locations,
};
};
exports.items = [
item('Potn1', 20, 'Heal1', [ lemele, rablesk, bonro, zellis, pell, bone, dowaine, belaine, telaine, pang, padal, polasu, tiffana, bilthem, valenca, bugask, guanta ]),
item('Potn2', 100, 'Heal2', [ lemele, rablesk, bonro, zellis, pell, patrof, bone, dowaine, belaine, telaine, pang, padal, polasu, tiffana, bilthem, pandam, brush, valenca, bugask, guanta, pharano, pasanda, ligena, palsu, melenam ]),
item('Potn3', 400, 'Heal3', [ bilthem, brush, valenca, bugask, guanta, pharano, pasanda, ligena, palsu, melenam, airship ]),
item('Recvry', 1000, 'Elixir', []),
item('MHerb1', 80, 'Restores 20 MP', [ lemele, rablesk, bonro, pell, bone, belaine, polasu ]),
item('MHerb2', 200, 'Restores 40 MP', [ valenca, pharano, ligena, palsu, melenam, airship ]),
item('M Water', 1200, 'Revive2', [ zellis, patrof, bone, dowaine, belaine, telaine, pang, padal, polasu, tiffana, bilthem, pandam, brush, valenca, bugask, guanta, pharano, pasanda, ligena, palsu, melenam, airship ]),
item('Antid', 80, 'Purify', [ lemele, rablesk, bonro, zellis, pell, patrof, dowaine, padal, tiffana, valenca, bugask, pasanda, ligena, palsu, melenam ]),
item('B Power', 100, 'Power', [ lemele, pell, patrof, pang, pharano, airship ]),
item('B Prtct', 100, 'Defense1', [ rablesk, pell, pang, padal ]),
item('S Dstry', 100, 'Defense2', [ polasu ]),
item('B Aglty', 100, 'Agility', [ pang, padal, pasanda, palsu, airship ]),
item('Mirror', 200, 'Reflect Petrify', [ zellis, pang, pandam, guanta, ligena, palsu, airship ]),
item('Harp', 500, 'Prevents Vacuum1/2', [ polasu, bilthem, ligena, airship ]),
item('B Fire', 20, 'Fire1', [ bone, guanta ]),
item('B Ice', 20, 'Ice1', [ dowaine, belaine, bugask ]),
item('B Fossl', 100, 'Petrify', [ bonro, pang, bugask ]),
item('Msquito', 150, 'HPCatcher', [ polasu, pasanda ]),
item('M Siphn', 200, 'MPCatcher', [ telaine, polasu ]),
item('Vacuum', 200, 'Vacuum1', [ pang, tiffana ]),
item('Exigate', 40, 'Exit', [ bonro, patrof ]),
item('Winball', 80, 'Wind Rune', [ pell, bone, dowaine, belaine, telaine, polasu, pandam, brush, valenca, bugask, guanta ]),
item('Opal', 100, 'Gem', [ lemele, rablesk, zellis, bone, dowaine, padal, tiffana, pandam, brush ]),
item('Pearl', 200, 'Gem', [ lemele, rablesk, bonro, pell, patrof, dowaine, belaine, telaine, padal, bilthem, pandam, brush, valenca, bugask, guanta, pharano, pasanda, ligena, palsu, melenam ]),
item('Topaz', 500, 'Gem', [ lemele, rablesk, bonro, zellis, pell, patrof, bone, telaine, tiffana, pandam, brush, pharano, melenam ]),
item('Ruby', 1000, 'Gem', [ bonro, zellis, patrof, bone, dowaine, belaine, padal, tiffana, bilthem, brush, valenca, guanta, pharano, pasanda, ligena]),
item('Saphr', 2500, 'Gem', [ zellis, patrof, belaine, tiffana, bilthem, pandam, pharano, pasanda, palsu, melenam ]),
item('Emrld', 5000, 'Gem', [ telaine, bilthem, brush, airship ]),
item('Dmnd', 10000, 'Gem', [ telaine, pandam, melenam, airship ]),
item('V Seed', 1000, 'Permanently increase MaxHP by 1-4 points', []),
item('M Seed', 1000, 'Permanently increase MaxMP by 1-4 points', []),
item('P Seed', 1000, 'Permanently increase Power by 1-4 points', []),
item('Pr Seed', 1000, 'Permanently increase Guard by 1-4 points', []),
item('I Seed', 1000, 'Permanently increase Magic by 1-4 points', []),
item('A Seed', 1000, 'Permanently increase Speed by 1-4 points', []),
];

102
parse-enemies.js Normal file
View File

@ -0,0 +1,102 @@
const fs = require('fs');
const path = require('path');
const {spells} = require('./spells');
const spellMap = spells.reduce((map, spell) => {
map[spell.name] = spell;
return map;
}, {});
const contents = fs.readFileSync(path.join(__dirname, 'docs', 'enemies.txt'), {
encoding: 'utf8',
});
const pieces = contents.split('*'.repeat(60));
const regexExecOrDie = (regex, piece) => {
const match = regex.exec(piece);
if (!match) {
throw new Error(`piece did not match regex ${regex.toString()} (${piece})`);
}
return match[1];
}
const enemies = [];
let currentEnemy;
for (let i = 0; i < pieces.length; i++) {
const piece = pieces[i].trim();
const match = /^\*(.+?)\s+Exp:\s*(\d+)\s*Gold:\s*(\d+)\s*Class:\s*(\d)/.exec(piece);
if (match) {
console.log('found enemy: ' + match[1]);
currentEnemy = {
name: match[1],
exp: Number(match[2]),
gold: Number(match[3]),
cls: Number(match[4]),
resistance: {},
spells: [],
drops: {},
};
enemies.push(currentEnemy);
} else if (/^Stats/.test(piece)) {
if (!currentEnemy) {
throw new Error('parsing error: no currentEnemy for stats');
}
const normalized = piece
.replace(/^Stats.*/m, '')
.replace(/^-+[-\s]+$/m, '')
.replace(/\s+/g, ' ')
.split(' ')
.filter(Boolean);
for (let j = 0; j < normalized.length; j++) {
const item = normalized[j];
switch (item) {
case 'MaxHP':
currentEnemy.hp = Number(normalized[++j]);
break;
case 'MaxMP':
currentEnemy.mp = Number(normalized[++j]);
break;
case 'Speed':
case 'Guard':
case 'Magic':
case 'Power':
currentEnemy[item.toLowerCase()] = Number(normalized[++j]);
break;
case 'Thunder':
case 'Fire':
case 'Ice':
case 'Vacuum':
case 'Debuff':
currentEnemy.resistance[item.toLowerCase()] = isNaN(Number(normalized[++j])) ?
null :
Number(normalized[j]);
break;
default:
if (spellMap[item]) {
currentEnemy.spells.push(item);
} else if (item !== '(None)') {
try {
const [numerator, denonimator] = normalized[++j].split('/');
currentEnemy.drops[item] = Number(numerator) / Number(denonimator);
} catch (e) {
console.log(e);
console.log(normalized);
console.log(item);
console.log(require('util').inspect(currentEnemy, false, null, true));
throw e;
}
}
break;
}
}
} else {
console.log('piece did not match: ' + piece);
}
}
fs.writeFileSync(path.join(__dirname, 'enemies.json'), JSON.stringify(enemies, null, ' '));

81
spells.js Normal file
View File

@ -0,0 +1,81 @@
const attackSpell = (name, mp, power, element, multiple) => {
return {
type: 'Attack',
name,
mp,
power,
element,
targets: multiple ? 'multi' : 'single',
};
};
const effectSpell = (name, mp, element, effect, multiple) => {
return {
type: 'Effect',
name,
mp,
element,
effect,
targets: multiple ? 'multi' : 'single',
};
};
const healSpell = (name, mp, effect) => {
return {
type: 'Healing',
name,
mp,
effect,
targets: 'single',
};
};
const supportSpell = (name, mp, effect, locations) => {
return {
type: 'Support',
name,
mp,
effect,
locations,
targets: 'single',
};
};
exports.spells = [
attackSpell('Fire1', 3, 30, 'Fire'),
attackSpell('Fire2', 12, 70, 'Fire'),
attackSpell('Ice1', 3, 36, 'Ice'),
attackSpell('Ice2', 12, 80, 'Ice'),
attackSpell('Laser1', 3, 30, 'Thunder'),
attackSpell('Laser2', 10, 50, 'Thunder'),
attackSpell('Laser3', 20, 100, 'Thunder'),
attackSpell('Firebird', 14, 30, 'Fire', true),
attackSpell('Fireball', 32, 50, 'Fire', true),
attackSpell('Blizzard1', 14, 34, 'Ice', true),
attackSpell('Blizzard2', 32, 60, 'Ice', true),
attackSpell('Thunder1', 10, 40, 'Thunder', true),
attackSpell('Thunder2', 40, 75, 'Thunder', true),
effectSpell('Petrify', 10, 'Debuff', 'Petrification'),
effectSpell('Poison', 0, 'Debuff', 'Poison (monsters only)'),
effectSpell('Defense2', 5, 'Debuff', 'Halves guard'),
effectSpell('HPCatcher', 6, 'Debuff', 'Drains up to 50 HP and heals caster'),
effectSpell('MPCatcher', 8, 'Debuff', 'Drains up to 40 MP and heals caster'),
effectSpell('Vacuum1', 30, 'Vacuum', 'Instant death'),
effectSpell('Vacuum2', 60, 'Vacuum', 'Instant death', true),
healSpell('Heal1', 4, 'Restores 40 HP'),
healSpell('Heal2', 18, 'Restores 90 HP'),
healSpell('Heal3', 34, 'Restores all HP'),
healSpell('Elixir', 120, 'Restores all HP and MP'),
healSpell('Revive1', 40, 'Restores all HP to dead ally, fails ~50% of the time'),
healSpell('Revive2', 90, 'Restores all HP to dead ally, always succeeds'),
supportSpell('Purify', 8, 'Removes petrification and poison', [ 'Battle', 'Map' ]),
supportSpell('Defense1', 5, 'Halves physical damage from enemy', [ 'Battle' ]),
supportSpell('Power', 6, 'Doubles power', [ 'Battle' ]),
supportSpell('Agility', 3, 'Increases Speed by 30', [ 'Battle' ]),
supportSpell('F.Shield', 16, 'Nullifies next attack spell', [ 'Battle' ]),
supportSpell('Protect', 20, 'Nullifies next Vacuum spell', [ 'Battle' ]),
supportSpell('Exit', 30, 'Escape cave/dungeon immediately', [ 'Map' ]),
];