Benchmark v2 with real Lv90 stats, Shadow Veil removed, full-conservative defaults

Shadow Veil removed from BUFF_PRIORITY - was draining MP aggressively.
Player stats updated to match real character (effective values with gear).

Benchmark results (Lv90, Nightmare, 5 runs each):
1. full-conservative: 146 rounds, 4485 dmg/rd — WINNER
2. conservative-items: 143 rounds, 4468 dmg/rd
3. spirit-40: 136 rounds, 4457 dmg/rd

New defaults (full-conservative):
- cureHP: 0.45, cureItemHP: 0.50 (save items use cure)
- manaGemMP: 0.45, manaPotionMP: 0.25
- spiritPotionSP: 0.30, spiritStanceOC: 80
- skillOC: 75
This commit is contained in:
GaboGG 2026-07-21 14:00:44 -04:00
parent 4bc90d9332
commit 0ee31b7266
8 changed files with 172 additions and 153 deletions

View file

@ -30,14 +30,14 @@ const CFG = {
autoSpirit: false,
// — Thresholds
cureHP: 0.35, // Cast Cure below this HP
cureItemHP: 0.65, // Use health items at this HP
cureRegenHP: 0.75, // Cast Regen below this HP
manaGemMP: 0.60, // Use mana gems below this MP (proactive)
manaPotionMP: 0.30, // Use mana potions at critical
spiritPotionSP: 0.45, // Use spirit gems/potions below this SP
spiritStanceOC: 60, // Activate Spirit Stance at this OC
skillOC: 70, // Use weapon skills at this OC (balance between spirit and damage)
cureHP: 0.45, // Cast Cure below this HP (save items, use Cure)
cureItemHP: 0.50, // Use health items at this HP (conservative, let Cure carry)
cureRegenHP: 0.65, // Cast Regen below this HP
manaGemMP: 0.45, // Use mana gems below this MP (conservative)
manaPotionMP: 0.25, // Use mana potions at critical
spiritPotionSP: 0.30, // Use spirit gems/potions below this SP
spiritStanceOC: 80, // Activate Spirit Stance late (save SP for skills)
skillOC: 75, // Use weapon skills at this OC
// — Out of battle
autoSell: true,
@ -679,9 +679,10 @@ const BUFF_PRIORITY = [
{ icon: 'haste', spell: 'Haste', minTurns: 2 },
{ icon: 'protection', spell: 'Protection', minTurns: 2 },
{ icon: 'spark_of_life', spell: 'Spark of Life', minTurns: 1 },
{ icon: 'shadow_veil', spell: 'Shadow Veil', minTurns: 2 },
{ icon: 'regen', spell: 'Regen', minTurns: 2 },
{ icon: 'absorb', spell: 'Absorb', minTurns: 2 },
// Shadow Veil excluded from auto-buff rotation — expensive and drains MP
// from Cure. Cast manually when MP is plentiful.
];
// Known important monster names (bosses, legendaries, ultimates)

View file

@ -30,14 +30,14 @@ const CFG = {
autoSpirit: false,
// — Thresholds
cureHP: 0.35, // Cast Cure below this HP
cureItemHP: 0.65, // Use health items at this HP
cureRegenHP: 0.75, // Cast Regen below this HP
manaGemMP: 0.60, // Use mana gems below this MP (proactive)
manaPotionMP: 0.30, // Use mana potions at critical
spiritPotionSP: 0.45, // Use spirit gems/potions below this SP
spiritStanceOC: 60, // Activate Spirit Stance at this OC
skillOC: 70, // Use weapon skills at this OC (balance between spirit and damage)
cureHP: 0.45, // Cast Cure below this HP (save items, use Cure)
cureItemHP: 0.50, // Use health items at this HP (conservative, let Cure carry)
cureRegenHP: 0.65, // Cast Regen below this HP
manaGemMP: 0.45, // Use mana gems below this MP (conservative)
manaPotionMP: 0.25, // Use mana potions at critical
spiritPotionSP: 0.30, // Use spirit gems/potions below this SP
spiritStanceOC: 80, // Activate Spirit Stance late (save SP for skills)
skillOC: 75, // Use weapon skills at this OC
// — Out of battle
autoSell: true,
@ -679,9 +679,10 @@ const BUFF_PRIORITY = [
{ icon: 'haste', spell: 'Haste', minTurns: 2 },
{ icon: 'protection', spell: 'Protection', minTurns: 2 },
{ icon: 'spark_of_life', spell: 'Spark of Life', minTurns: 1 },
{ icon: 'shadow_veil', spell: 'Shadow Veil', minTurns: 2 },
{ icon: 'regen', spell: 'Regen', minTurns: 2 },
{ icon: 'absorb', spell: 'Absorb', minTurns: 2 },
// Shadow Veil excluded from auto-buff rotation — expensive and drains MP
// from Cure. Cast manually when MP is plentiful.
];
// Known important monster names (bosses, legendaries, ultimates)

View file

@ -1,18 +1,25 @@
{
"player": {
"level": 64,
"level": 90,
"style": "2H",
"str": 95,
"dex": 40,
"agi": 28,
"end": 265,
"int": 8,
"wis": 35,
"str": 155,
"dex": 96,
"agi": 36,
"end": 77,
"int": 32,
"wis": 75,
"maxHp": 2672,
"maxMp": 232,
"maxSp": 122,
"difficulty": "Nightmare",
"prof2h": 80,
"profLight": 70,
"profSupportive": 68,
"profElemental": 50
"prof2h": 107,
"profLight": 107,
"profSupportive": 107,
"profElemental": 63,
"physMit": 31.5,
"magMit": 29.9,
"critDmg": 1.8,
"accuracy": 92.5
},
"runs": 5,
"rounds": 1000,
@ -20,143 +27,143 @@
{
"name": "full-conservative",
"desc": "Late spirit, save items, no attack spells",
"avgRounds": "225.6",
"avgKills": "1335.0",
"avgDmgRatio": "3.1",
"avgDmgPerRound": 3141,
"avgExp": 10276480,
"avgCredits": 132114,
"maxRounds": 249,
"avgRounds": "146.0",
"avgKills": "809.2",
"avgDmgRatio": "3.2",
"avgDmgPerRound": 4485,
"avgExp": 4388800,
"avgCredits": 57381,
"maxRounds": 166,
"survivalRate": "0",
"deaths": 5,
"score": 133500
"score": 80920
},
{
"name": "conservative-items",
"desc": "Save items, use Cure more",
"avgRounds": "223.6",
"avgKills": "1330.8",
"avgRounds": "142.8",
"avgKills": "793.8",
"avgDmgRatio": "3.1",
"avgDmgPerRound": 3128,
"avgExp": 10058080,
"avgCredits": 129729,
"maxRounds": 232,
"avgDmgPerRound": 4468,
"avgExp": 4131520,
"avgCredits": 53230,
"maxRounds": 154,
"survivalRate": "0",
"deaths": 5,
"score": 133080
},
{
"name": "attack-spells",
"desc": "Use cheap attack spells for channeling",
"avgRounds": "213.0",
"avgKills": "1248.2",
"avgDmgRatio": "3.4",
"avgDmgPerRound": 2974,
"avgExp": 9150160,
"avgCredits": 118907,
"maxRounds": 238,
"survivalRate": "0",
"deaths": 5,
"score": 124820
},
{
"name": "spirit-80",
"desc": "Spirit Stance at OC 80 (late, skills first)",
"avgRounds": "208.8",
"avgKills": "1218.0",
"avgDmgRatio": "3.4",
"avgDmgPerRound": 3024,
"avgExp": 8762480,
"avgCredits": 111455,
"maxRounds": 212,
"survivalRate": "0",
"deaths": 5,
"score": 121800
"score": 79380
},
{
"name": "spirit-40",
"desc": "Spirit Stance at OC 40 (early)",
"avgRounds": "205.4",
"avgKills": "1201.4",
"avgDmgRatio": "3.6",
"avgDmgPerRound": 2990,
"avgExp": 8509680,
"avgCredits": 110122,
"maxRounds": 223,
"avgRounds": "135.8",
"avgKills": "751.2",
"avgDmgRatio": "3.4",
"avgDmgPerRound": 4457,
"avgExp": 3770560,
"avgCredits": 47867,
"maxRounds": 152,
"survivalRate": "0",
"deaths": 5,
"score": 120140
"score": 75120
},
{
"name": "spirit-80",
"desc": "Spirit Stance at OC 80 (late, skills first)",
"avgRounds": "128.8",
"avgKills": "703.6",
"avgDmgRatio": "3.6",
"avgDmgPerRound": 4398,
"avgExp": 3358160,
"avgCredits": 45813,
"maxRounds": 139,
"survivalRate": "0",
"deaths": 5,
"score": 70360
},
{
"name": "skills-at-60",
"desc": "Skills fire at OC 60 instead of 80",
"avgRounds": "204.4",
"avgKills": "1185.8",
"avgDmgRatio": "3.7",
"avgDmgPerRound": 3006,
"avgExp": 8400560,
"avgCredits": 109924,
"maxRounds": 213,
"avgRounds": "126.4",
"avgKills": "689.6",
"avgDmgRatio": "3.6",
"avgDmgPerRound": 4356,
"avgExp": 3243600,
"avgCredits": 42872,
"maxRounds": 143,
"survivalRate": "0",
"deaths": 5,
"score": 118580
"score": 68960
},
{
"name": "baseline",
"desc": "Current v0.11.0 defaults",
"avgRounds": "203.8",
"avgKills": "1181.8",
"avgDmgRatio": "3.7",
"avgDmgPerRound": 3011,
"avgExp": 8350320,
"avgCredits": 113818,
"maxRounds": 210,
"avgRounds": "126.4",
"avgKills": "688.8",
"avgDmgRatio": "3.8",
"avgDmgPerRound": 4340,
"avgExp": 3272880,
"avgCredits": 41772,
"maxRounds": 154,
"survivalRate": "0",
"deaths": 5,
"score": 118180
},
{
"name": "balanced",
"desc": "Mid spirit, moderate items, attack spells for chan",
"avgRounds": "200.2",
"avgKills": "1165.2",
"avgDmgRatio": "3.5",
"avgDmgPerRound": 2962,
"avgExp": 8100480,
"avgCredits": 107866,
"maxRounds": 217,
"survivalRate": "0",
"deaths": 5,
"score": 116520
"score": 68880
},
{
"name": "full-aggressive",
"desc": "Early spirit + aggressive items + attack spells",
"avgRounds": "194.2",
"avgKills": "1126.6",
"avgDmgRatio": "3.7",
"avgDmgPerRound": 2925,
"avgExp": 7643120,
"avgCredits": 99980,
"maxRounds": 210,
"avgRounds": "126.0",
"avgKills": "688.8",
"avgDmgRatio": "3.5",
"avgDmgPerRound": 4162,
"avgExp": 3215200,
"avgCredits": 41874,
"maxRounds": 141,
"survivalRate": "0",
"deaths": 5,
"score": 112660
"score": 68880
},
{
"name": "balanced",
"desc": "Mid spirit, moderate items, attack spells for chan",
"avgRounds": "125.8",
"avgKills": "686.4",
"avgDmgRatio": "3.6",
"avgDmgPerRound": 4124,
"avgExp": 3198880,
"avgCredits": 42626,
"maxRounds": 138,
"survivalRate": "0",
"deaths": 5,
"score": 68640
},
{
"name": "aggressive-items",
"desc": "Use items very proactively",
"avgRounds": "180.2",
"avgKills": "1027.4",
"avgDmgRatio": "4.1",
"avgDmgPerRound": 2963,
"avgExp": 6639040,
"avgCredits": 82094,
"maxRounds": 208,
"avgRounds": "117.0",
"avgKills": "631.4",
"avgDmgRatio": "4.0",
"avgDmgPerRound": 4390,
"avgExp": 2781760,
"avgCredits": 36607,
"maxRounds": 129,
"survivalRate": "0",
"deaths": 5,
"score": 102740
"score": 63140
},
{
"name": "attack-spells",
"desc": "Use cheap attack spells for channeling",
"avgRounds": "113.4",
"avgKills": "607.8",
"avgDmgRatio": "3.9",
"avgDmgPerRound": 4036,
"avgExp": 2602480,
"avgCredits": 36235,
"maxRounds": 122,
"survivalRate": "0",
"deaths": 5,
"score": 60780
}
],
"timestamp": "2026-07-20T23:52:13.366Z"
"timestamp": "2026-07-21T18:00:29.218Z"
}

View file

@ -6,16 +6,26 @@ const { simulateGrindfest } = require('./grindfest');
const fs = require('fs');
const path = require('path');
// Player config matching current character (Lv65-ish 2H)
// Player config matching your Lv90 character (effective stats from gear)
const PLAYER = {
level: 64,
level: 90,
style: '2H',
str: 95, dex: 40, agi: 28, end: 265, int: 8, wis: 35,
// Effective stats (from character page: attributes + equipment bonuses)
str: 155, dex: 96, agi: 36, end: 77, int: 32, wis: 75,
// Effective HP/MP/SP from character page
maxHp: 2672,
maxMp: 232,
maxSp: 122,
difficulty: 'Nightmare',
prof2h: 80,
profLight: 70,
profSupportive: 68,
profElemental: 50,
prof2h: 107,
profLight: 107,
profSupportive: 107,
profElemental: 63,
// Derived from gear
physMit: 31.5,
magMit: 29.9,
critDmg: 1.80,
accuracy: 92.5,
};
// Strategy configs to test

View file

@ -17,10 +17,10 @@ class SimPlayer {
this.int = config.int || 6;
this.wis = config.wis || 31; // ~93 MP from gear
// Derived stats
this.maxHp = F.calcMaxHp(this.end, this.level);
this.maxMp = F.calcMaxMp(this.wis, this.level);
this.maxSp = F.calcMaxSp(this.int, this.level);
// Derived stats (use effective values from config if provided)
this.maxHp = config.maxHp || F.calcMaxHp(this.end, this.level);
this.maxMp = config.maxMp || F.calcMaxMp(this.wis, this.level);
this.maxSp = config.maxSp || F.calcMaxSp(this.int, this.level);
this.hp = this.maxHp;
this.mp = this.maxMp;
this.sp = this.maxSp;
@ -35,13 +35,13 @@ class SimPlayer {
this.profElemental = config.profElemental || 42;
// Damage stats
this.baseAtk = F.calcBasePhysDamage(this.str, this.dex, this.level, this.prof2h);
this.critChance = F.calcCritChance(this.str, this.dex);
this.critDamage = F.calcCritDamage(68); // +68% from gear
this.baseAtk = config.baseAtk || F.calcBasePhysDamage(this.str, this.dex, this.level, this.prof2h);
this.critChance = config.critChance || F.calcCritChance(this.str, this.dex);
this.critDamage = config.critDmg || F.calcCritDamage(68); // +68% from gear
// Mitigation
this.physMit = 30; // ~30% from light armor
this.magMit = 23;
this.physMit = (config.physMit / 100) || 0.315;
this.magMit = (config.magMit / 100) || 0.299;
// Buffs
this.buffs = {}; // { name: {turns: N} }

View file

@ -12,7 +12,6 @@ const BUFF_PRIORITY = [
{ icon: 'haste', spell: 'Haste', minTurns: 2 },
{ icon: 'protection', spell: 'Protection', minTurns: 2 },
{ icon: 'spark_of_life', spell: 'Spark of Life', minTurns: 1 },
{ icon: 'shadow_veil', spell: 'Shadow Veil', minTurns: 2 },
{ icon: 'regen', spell: 'Regen', minTurns: 2 },
{ icon: 'absorb', spell: 'Absorb', minTurns: 2 },
];

View file

@ -15,14 +15,14 @@ const CFG = {
autoSpirit: false,
// — Thresholds
cureHP: 0.35, // Cast Cure below this HP
cureItemHP: 0.65, // Use health items at this HP
cureRegenHP: 0.75, // Cast Regen below this HP
manaGemMP: 0.60, // Use mana gems below this MP (proactive)
manaPotionMP: 0.30, // Use mana potions at critical
spiritPotionSP: 0.45, // Use spirit gems/potions below this SP
spiritStanceOC: 60, // Activate Spirit Stance at this OC
skillOC: 70, // Use weapon skills at this OC (balance between spirit and damage)
cureHP: 0.45, // Cast Cure below this HP (save items, use Cure)
cureItemHP: 0.50, // Use health items at this HP (conservative, let Cure carry)
cureRegenHP: 0.65, // Cast Regen below this HP
manaGemMP: 0.45, // Use mana gems below this MP (conservative)
manaPotionMP: 0.25, // Use mana potions at critical
spiritPotionSP: 0.30, // Use spirit gems/potions below this SP
spiritStanceOC: 80, // Activate Spirit Stance late (save SP for skills)
skillOC: 75, // Use weapon skills at this OC
// — Out of battle
autoSell: true,

View file

@ -35,9 +35,10 @@ const BUFF_PRIORITY = [
{ icon: 'haste', spell: 'Haste', minTurns: 2 },
{ icon: 'protection', spell: 'Protection', minTurns: 2 },
{ icon: 'spark_of_life', spell: 'Spark of Life', minTurns: 1 },
{ icon: 'shadow_veil', spell: 'Shadow Veil', minTurns: 2 },
{ icon: 'regen', spell: 'Regen', minTurns: 2 },
{ icon: 'absorb', spell: 'Absorb', minTurns: 2 },
// Shadow Veil excluded from auto-buff rotation — expensive and drains MP
// from Cure. Cast manually when MP is plentiful.
];
// Known important monster names (bosses, legendaries, ultimates)