@ffxiv-teamcraft/simulator
Version:
A FINAL FANTASY XIV crafting simulator
149 lines • 7.25 kB
JavaScript
"use strict";
Object.defineProperty(exports, "__esModule", { value: true });
exports.CraftingAction = void 0;
var action_type_1 = require("./action-type");
var crafting_job_enum_1 = require("../crafting-job.enum");
var simulation_fail_cause_enum_1 = require("../simulation-fail-cause.enum");
var step_state_1 = require("../step-state");
var tables_1 = require("../tables");
/**
* This is the parent class of all actions in the simulator.
*/
var CraftingAction = /** @class */ (function () {
function CraftingAction() {
}
/**
* checks if the action can be moved inside the simulation state,
* this is meant to prevent moving automatic actions (looking at you Whistle end progression tick).
* @returns {boolean}
*/
CraftingAction.prototype.canBeMoved = function (currentIndex) {
return true;
};
CraftingAction.prototype.getId = function (jobId) {
// Crafter ids are 8 to 15, we want indexes from 0 to 7, so...
return this.getIds()[jobId - 8] || this.getIds()[0];
};
CraftingAction.prototype.getWaitDuration = function () {
return this.getType() === action_type_1.ActionType.BUFF ? 2 : 3;
};
/**
* If an action is skipped on fail, it doesn't tick buffs.
* Example: Observe, Master's Mend, buffs.
*/
CraftingAction.prototype.skipOnFail = function () {
return false;
};
CraftingAction.prototype.requiresGood = function () {
return false;
};
CraftingAction.prototype.hasCombo = function (simulation) {
return false;
};
CraftingAction.prototype.getSuccessRate = function (simulationState) {
var baseRate = this._getSuccessRate(simulationState);
if (simulationState.state === step_state_1.StepState.CENTERED) {
return baseRate + 25;
}
return baseRate;
};
CraftingAction.prototype.canBeUsed = function (simulationState, linear, safeMode) {
var levelRequirement = this.getLevelRequirement();
var craftsmanshipRequirement = simulationState.recipe.craftsmanshipReq;
var controlRequirement = simulationState.recipe.controlReq;
if (safeMode && this.getSuccessRate(simulationState) < 100) {
return false;
}
if (levelRequirement.job !== crafting_job_enum_1.CraftingJob.ANY &&
simulationState.crafterStats.levels[levelRequirement.job] !== undefined) {
return (simulationState.crafterStats.levels[levelRequirement.job] >= levelRequirement.level &&
this._canBeUsed(simulationState, linear));
}
if (craftsmanshipRequirement && controlRequirement) {
return (simulationState.crafterStats.craftsmanship >= craftsmanshipRequirement &&
simulationState.crafterStats._control >= controlRequirement &&
simulationState.crafterStats.level >= levelRequirement.level &&
this._canBeUsed(simulationState, linear));
}
if (craftsmanshipRequirement) {
return (simulationState.crafterStats.craftsmanship >= craftsmanshipRequirement &&
simulationState.crafterStats.level >= levelRequirement.level &&
this._canBeUsed(simulationState, linear));
}
if (controlRequirement) {
return (simulationState.crafterStats._control >= controlRequirement &&
simulationState.crafterStats.level >= levelRequirement.level &&
this._canBeUsed(simulationState, linear));
}
return (simulationState.crafterStats.level >= levelRequirement.level &&
this._canBeUsed(simulationState, linear));
};
CraftingAction.prototype.getFailCause = function (simulationState, linear, safeMode) {
if (simulationState.success) {
return undefined;
}
var levelRequirement = this.getLevelRequirement();
var craftsmanshipRequirement = simulationState.recipe.craftsmanshipReq;
var controlRequirement = simulationState.recipe.controlReq;
if (safeMode && this.getSuccessRate(simulationState) < 100) {
return simulation_fail_cause_enum_1.SimulationFailCause.UNSAFE_ACTION;
}
if (levelRequirement.job !== crafting_job_enum_1.CraftingJob.ANY &&
simulationState.crafterStats.levels[levelRequirement.job] !== undefined) {
if (simulationState.crafterStats.levels[levelRequirement.job] < levelRequirement.level) {
return simulation_fail_cause_enum_1.SimulationFailCause.MISSING_LEVEL_REQUIREMENT;
}
}
if (simulationState.crafterStats.level < levelRequirement.level) {
return simulation_fail_cause_enum_1.SimulationFailCause.MISSING_LEVEL_REQUIREMENT;
}
if (craftsmanshipRequirement &&
simulationState.crafterStats.craftsmanship < craftsmanshipRequirement) {
return simulation_fail_cause_enum_1.SimulationFailCause.MISSING_STATS_REQUIREMENT;
}
if (controlRequirement && simulationState.crafterStats._control < controlRequirement) {
return simulation_fail_cause_enum_1.SimulationFailCause.MISSING_STATS_REQUIREMENT;
}
return undefined;
};
CraftingAction.prototype.getCPCost = function (simulationState, linear) {
if (linear === void 0) { linear = false; }
var baseCost = this.getBaseCPCost(simulationState);
if (simulationState.state === step_state_1.StepState.PLIANT) {
return Math.ceil(baseCost / 2);
}
return baseCost;
};
CraftingAction.prototype.onFail = function (simulation) {
// Base onFail does nothing, override to implement it, as it wont be used in most cases.
};
CraftingAction.prototype.skipsBuffTicks = function () {
return false;
};
/**
* Checks if this action is an instance of a given other action.
* @param actionClass
*/
CraftingAction.prototype.is = function (actionClass) {
return this instanceof actionClass;
};
CraftingAction.prototype.getBaseProgression = function (simulation) {
var stats = simulation.crafterStats;
var baseValue = (stats.craftsmanship * 10) / simulation.recipe.progressDivider + 2;
if (tables_1.Tables.LEVEL_TABLE[stats.level] <= simulation.recipe.rlvl) {
return Math.fround(baseValue * (simulation.recipe.progressModifier || 100) * Math.fround(0.01));
}
return Math.floor(baseValue);
};
CraftingAction.prototype.getBaseQuality = function (simulation) {
var stats = simulation.crafterStats;
var baseValue = (stats.getControl(simulation) * 10) / simulation.recipe.qualityDivider + 35;
if (tables_1.Tables.LEVEL_TABLE[stats.level] <= simulation.recipe.rlvl) {
return Math.fround(baseValue * (simulation.recipe.qualityModifier || 100) * Math.fround(0.01));
}
return Math.floor(baseValue);
};
return CraftingAction;
}());
exports.CraftingAction = CraftingAction;
//# sourceMappingURL=crafting-action.js.map