int CraftingManagerImplementation::calculateExperimentationSuccess(CreatureObject* player, DraftSchematic* draftSchematic, float effectiveness) { float cityBonus = player->getSkillMod("private_spec_experimentation"); int experimentationSkill = player->getSkillMod(draftSchematic->getExperimentationSkill()); int forceSkill = player->getSkillMod("force_experimentation"); experimentationSkill += forceSkill; float experimentingPoints = ((float)experimentationSkill) / 10.0f; int failMitigate = (player->getSkillMod(draftSchematic->getAssemblySkill()) - 100 + cityBonus) / 7; failMitigate += player->getSkillMod("force_failure_reduction"); if(failMitigate < 0) failMitigate = 0; if(failMitigate > 5) failMitigate = 5; // 0.85-1.15 float toolModifier = 1.0f + (effectiveness / 100.0f); //Bespin Port float expbonus = 0; if (player->hasBuff(BuffCRC::FOOD_EXPERIMENT_BONUS)) { Buff* buff = player->getBuff(BuffCRC::FOOD_EXPERIMENT_BONUS); if (buff != NULL) { expbonus = buff->getSkillModifierValue("experiment_bonus"); toolModifier *= 1.0f + (expbonus / 100.0f); } } /// Range 0-100 int luckRoll = System::random(100) + cityBonus; if(luckRoll > ((95 - expbonus) - forceSkill)) return AMAZINGSUCCESS; if(luckRoll < (5 - expbonus - failMitigate)) luckRoll -= System::random(100); //if(luckRoll < 5) // return CRITICALFAILURE; luckRoll += System::random(player->getSkillMod("luck") + player->getSkillMod("force_luck")); /// int experimentRoll = (toolModifier * (luckRoll + (experimentingPoints * 4))); if (experimentRoll > 70) return GREATSUCCESS; if (experimentRoll > 60) return GOODSUCCESS; if (experimentRoll > 50) return MODERATESUCCESS; if (experimentRoll > 40) return SUCCESS; if (experimentRoll > 30) return MARGINALSUCCESS; if (experimentRoll > 20) return OK; return BARELYSUCCESSFUL; }
int SharedLabratory::calculateAssemblySuccess(CreatureObject* player,DraftSchematic* draftSchematic, float effectiveness){ // assemblyPoints is 0-12 /// City bonus should be 10 float cityBonus = player->getSkillMod("private_spec_assembly"); float assemblyPoints = ((float)player->getSkillMod(draftSchematic->getAssemblySkill())) / 10.0f; int failMitigate = (player->getSkillMod(draftSchematic->getAssemblySkill()) - 100 + cityBonus) / 7; if(failMitigate < 0) failMitigate = 0; if(failMitigate > 5) failMitigate = 5; // 0.85-1.15 float toolModifier = 1.0f + (effectiveness / 100.0f); //Pyollian Cake float craftbonus = 0; if (player->hasBuff(BuffCRC::FOOD_CRAFT_BONUS)) { Buff* buff = player->getBuff(BuffCRC::FOOD_CRAFT_BONUS); if (buff != NULL) { craftbonus = buff->getSkillModifierValue("craft_bonus"); toolModifier *= 1.0f + (craftbonus / 100.0f); } } int luckRoll = System::random(100) + cityBonus; if(luckRoll > (95 - craftbonus)) return CraftingManager::AMAZINGSUCCESS; if(luckRoll < (5 - craftbonus - failMitigate)) luckRoll -= System::random(100); //if(luckRoll < 5) // return CRITICALFAILURE; luckRoll += System::random(player->getSkillMod("luck") + player->getSkillMod("force_luck")); int assemblyRoll = (toolModifier * (luckRoll + (assemblyPoints * 5))); if (assemblyRoll > 70) return CraftingManager::GREATSUCCESS; if (assemblyRoll > 60) return CraftingManager::GOODSUCCESS; if (assemblyRoll > 50) return CraftingManager::MODERATESUCCESS; if (assemblyRoll > 40) return CraftingManager::SUCCESS; if (assemblyRoll > 30) return CraftingManager::MARGINALSUCCESS; if (assemblyRoll > 20) return CraftingManager::OK; return CraftingManager::BARELYSUCCESSFUL; }