mirror of
https://github.com/OpenFusionProject/OpenFusion.git
synced 2026-10-09 04:20:05 +00:00
Compare commits
3 Commits
master
...
copilot/fi
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
e9e5ec2fd6 | ||
|
|
0639bf2ae8 | ||
|
|
ed3bf6a952 |
@@ -117,7 +117,7 @@ sPCAppearanceData Player::getAppearanceData() {
|
|||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Player::hasHunterBoost() const {
|
bool Player::hasQuestBoost() const {
|
||||||
if (AEQUIP_COUNT < AEQUIP_COUNT_WITH_BOOSTERS)
|
if (AEQUIP_COUNT < AEQUIP_COUNT_WITH_BOOSTERS)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -125,7 +125,7 @@ bool Player::hasHunterBoost() const {
|
|||||||
return booster.iID == 153 && booster.iOpt > 0;
|
return booster.iID == 153 && booster.iOpt > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Player::hasRacerBoost() const {
|
bool Player::hasHunterBoost() const {
|
||||||
if (AEQUIP_COUNT < AEQUIP_COUNT_WITH_BOOSTERS)
|
if (AEQUIP_COUNT < AEQUIP_COUNT_WITH_BOOSTERS)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
@@ -133,7 +133,7 @@ bool Player::hasRacerBoost() const {
|
|||||||
return booster.iID == 154 && booster.iOpt > 0;
|
return booster.iID == 154 && booster.iOpt > 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool Player::hasQuestBoost() const {
|
bool Player::hasRacerBoost() const {
|
||||||
if (AEQUIP_COUNT < AEQUIP_COUNT_WITH_BOOSTERS)
|
if (AEQUIP_COUNT < AEQUIP_COUNT_WITH_BOOSTERS)
|
||||||
return false;
|
return false;
|
||||||
|
|
||||||
|
|||||||
@@ -124,9 +124,9 @@ struct Player : public Entity, public ICombatant {
|
|||||||
|
|
||||||
sNano* getActiveNano();
|
sNano* getActiveNano();
|
||||||
sPCAppearanceData getAppearanceData();
|
sPCAppearanceData getAppearanceData();
|
||||||
|
bool hasQuestBoost() const;
|
||||||
bool hasHunterBoost() const;
|
bool hasHunterBoost() const;
|
||||||
bool hasRacerBoost() const;
|
bool hasRacerBoost() const;
|
||||||
bool hasQuestBoost() const;
|
|
||||||
bool hasSuperBoost() const;
|
bool hasSuperBoost() const;
|
||||||
void addCapped(CappedValueType type, int32_t diff);
|
void addCapped(CappedValueType type, int32_t diff);
|
||||||
void subtractCapped(CappedValueType type, int32_t diff);
|
void subtractCapped(CappedValueType type, int32_t diff);
|
||||||
|
|||||||
@@ -163,14 +163,13 @@ static void racingEnd(CNSocket* sock, CNPacketData* data) {
|
|||||||
resp.iEPScore = postRanking.Score;
|
resp.iEPScore = postRanking.Score;
|
||||||
resp.iEPRaceTime = postRanking.Time;
|
resp.iEPRaceTime = postRanking.Time;
|
||||||
resp.iEPRaceMode = EPRaces[sock].mode;
|
resp.iEPRaceMode = EPRaces[sock].mode;
|
||||||
|
resp.iEPRewardFM = fm;
|
||||||
|
|
||||||
int32_t prevFM = plr->fusionmatter;
|
int32_t fmReward = calculateFMReward(plr, resp.iEPRewardFM);
|
||||||
int32_t fmReward = calculateFMReward(plr, fm);
|
|
||||||
plr->addCapped(CappedValueType::FUSIONMATTER, fmReward);
|
plr->addCapped(CappedValueType::FUSIONMATTER, fmReward);
|
||||||
Missions::updateFusionMatter(sock);
|
Missions::updateFusionMatter(sock);
|
||||||
|
|
||||||
resp.iFusionMatter = plr->fusionmatter;
|
resp.iFusionMatter = plr->fusionmatter;
|
||||||
resp.iEPRewardFM = std::max(0, plr->fusionmatter - prevFM);
|
|
||||||
resp.iFatigue = 50;
|
resp.iFatigue = 50;
|
||||||
resp.iFatigue_Level = 1;
|
resp.iFatigue_Level = 1;
|
||||||
|
|
||||||
|
|||||||
@@ -315,25 +315,13 @@ static void vendorCombineItems(CNSocket* sock, CNPacketData* data) {
|
|||||||
|
|
||||||
sItemBase* itemStats = &plr->Inven[req->iStatItemSlot];
|
sItemBase* itemStats = &plr->Inven[req->iStatItemSlot];
|
||||||
sItemBase* itemLooks = &plr->Inven[req->iCostumeItemSlot];
|
sItemBase* itemLooks = &plr->Inven[req->iCostumeItemSlot];
|
||||||
|
|
||||||
// if item is already combined, the style item id will be in the higher 16 bits of the iOpt
|
|
||||||
int16_t itemLooksNonCombinedID = (itemLooks->iOpt >> 16) > 0 ? (itemLooks->iOpt >> 16) : itemLooks->iID;
|
|
||||||
|
|
||||||
Items::Item* itemStatsDat = Items::getItemData(itemStats->iID, itemStats->iType);
|
Items::Item* itemStatsDat = Items::getItemData(itemStats->iID, itemStats->iType);
|
||||||
Items::Item* itemLooksDat = Items::getItemData(itemLooks->iID, itemLooks->iType);
|
Items::Item* itemLooksDat = Items::getItemData(itemLooks->iID, itemLooks->iType);
|
||||||
Items::Item* itemLooksNonCombinedDat = (itemLooksNonCombinedID == itemLooks->iID) ? itemLooksDat : Items::getItemData(itemLooksNonCombinedID, itemLooks->iType);
|
|
||||||
|
|
||||||
// sanity check item and combination entry existence
|
// sanity check item and combination entry existence
|
||||||
if (itemStatsDat == nullptr || itemLooksDat == nullptr || itemLooksNonCombinedDat == nullptr) {
|
if (itemStatsDat == nullptr || itemLooksDat == nullptr
|
||||||
std::cout << "[WARN] Item ids not found for croc pot" << std::endl;
|
|| Items::CrocPotTable.find(abs(itemStatsDat->level - itemLooksDat->level)) == Items::CrocPotTable.end()) {
|
||||||
sock->sendPacket(failResp, P_FE2CL_REP_PC_ITEM_COMBINATION_FAIL);
|
std::cout << "[WARN] Either item ids or croc pot value set not found" << std::endl;
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
int levelDiff = abs(itemStatsDat->level - itemLooksDat->level);
|
|
||||||
auto recipeIt = Items::CrocPotTable.find(levelDiff);
|
|
||||||
if (recipeIt == Items::CrocPotTable.end()) {
|
|
||||||
std::cout << "[WARN] Croc pot value set not found for level diff " << levelDiff << std::endl;
|
|
||||||
sock->sendPacket(failResp, P_FE2CL_REP_PC_ITEM_COMBINATION_FAIL);
|
sock->sendPacket(failResp, P_FE2CL_REP_PC_ITEM_COMBINATION_FAIL);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -346,9 +334,8 @@ static void vendorCombineItems(CNSocket* sock, CNPacketData* data) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
CrocPotEntry* recipe = &recipeIt->second;
|
CrocPotEntry* recipe = &Items::CrocPotTable[abs(itemStatsDat->level - itemLooksDat->level)];
|
||||||
// buy price of combined items is the uncombined style item's buy price
|
int cost = itemStatsDat->buyPrice * recipe->multStats + itemLooksDat->buyPrice * recipe->multLooks;
|
||||||
int cost = itemStatsDat->buyPrice * recipe->multStats + itemLooksNonCombinedDat->buyPrice * recipe->multLooks;
|
|
||||||
float successChance = recipe->base / 100.0f; // base success chance
|
float successChance = recipe->base / 100.0f; // base success chance
|
||||||
|
|
||||||
// rarity gap multiplier
|
// rarity gap multiplier
|
||||||
@@ -369,23 +356,18 @@ static void vendorCombineItems(CNSocket* sock, CNPacketData* data) {
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef ACADEMY
|
|
||||||
// uncombined academy items in the style slot with level 0 have 100% success chance
|
|
||||||
if (itemLooksNonCombinedID == itemLooks->iID && itemLooksDat->level == 0)
|
|
||||||
successChance = 100.0f;
|
|
||||||
#endif
|
|
||||||
|
|
||||||
float rolled = Rand::randFloat(100.0f); // success chance out of 100
|
float rolled = Rand::randFloat(100.0f); // success chance out of 100
|
||||||
//std::cout << rolled << " vs " << successChance << std::endl;
|
//std::cout << rolled << " vs " << successChance << std::endl;
|
||||||
plr->subtractCapped(CappedValueType::TAROS, cost);
|
plr->subtractCapped(CappedValueType::TAROS, cost);
|
||||||
|
|
||||||
|
|
||||||
INITSTRUCT(sP_FE2CL_REP_PC_ITEM_COMBINATION_SUCC, resp);
|
INITSTRUCT(sP_FE2CL_REP_PC_ITEM_COMBINATION_SUCC, resp);
|
||||||
if (rolled < successChance) {
|
if (rolled < successChance) {
|
||||||
// success
|
// success
|
||||||
resp.iSuccessFlag = 1;
|
resp.iSuccessFlag = 1;
|
||||||
|
|
||||||
// modify the looks item with the new stats and set the appearance through iOpt
|
// modify the looks item with the new stats and set the appearance through iOpt
|
||||||
itemLooks->iOpt = (int32_t)itemLooksNonCombinedID << 16;
|
itemLooks->iOpt = (int32_t)((itemLooks->iOpt) >> 16 > 0 ? (itemLooks->iOpt >> 16) : itemLooks->iID) << 16;
|
||||||
itemLooks->iID = itemStats->iID;
|
itemLooks->iID = itemStats->iID;
|
||||||
|
|
||||||
// delete stats item
|
// delete stats item
|
||||||
|
|||||||
Reference in New Issue
Block a user