UNPKG

@ffxiv-teamcraft/simulator

Version:
149 lines 7.25 kB
"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