mirror of
https://github.com/OpenFusionProject/OpenFusion.git
synced 2025-11-24 02:10:21 +00:00
Implement multiple-choice mission rewards
This commit is contained in:
@@ -147,14 +147,14 @@ void MissionManager::taskEnd(CNSocket* sock, CNPacketData* data) {
|
||||
|
||||
response.iTaskNum = missionData->iTaskNum;
|
||||
|
||||
if (!endTask(sock, missionData->iTaskNum)) {
|
||||
if (!endTask(sock, missionData->iTaskNum, missionData->iBox1Choice)) {
|
||||
return;
|
||||
}
|
||||
|
||||
sock->sendPacket((void*)&response, P_FE2CL_REP_PC_TASK_END_SUCC, sizeof(sP_FE2CL_REP_PC_TASK_END_SUCC));
|
||||
}
|
||||
|
||||
bool MissionManager::endTask(CNSocket *sock, int32_t taskNum) {
|
||||
bool MissionManager::endTask(CNSocket *sock, int32_t taskNum, int choice) {
|
||||
Player *plr = PlayerManager::getPlayer(sock);
|
||||
|
||||
if (Tasks.find(taskNum) == Tasks.end())
|
||||
@@ -165,7 +165,7 @@ bool MissionManager::endTask(CNSocket *sock, int32_t taskNum) {
|
||||
|
||||
// mission rewards
|
||||
if (Rewards.find(taskNum) != Rewards.end()) {
|
||||
if (giveMissionReward(sock, taskNum) == -1)
|
||||
if (giveMissionReward(sock, taskNum, choice) == -1)
|
||||
return false; // we don't want to send anything
|
||||
}
|
||||
// don't take away quest items if we haven't finished the quest
|
||||
@@ -360,7 +360,7 @@ void MissionManager::dropQuestItem(CNSocket *sock, int task, int count, int id,
|
||||
sock->sendPacket((void*)respbuf, P_FE2CL_REP_REWARD_ITEM, resplen);
|
||||
}
|
||||
|
||||
int MissionManager::giveMissionReward(CNSocket *sock, int task) {
|
||||
int MissionManager::giveMissionReward(CNSocket *sock, int task, int choice) {
|
||||
Reward *reward = Rewards[task];
|
||||
Player *plr = PlayerManager::getPlayer(sock);
|
||||
|
||||
@@ -370,6 +370,10 @@ int MissionManager::giveMissionReward(CNSocket *sock, int task) {
|
||||
nrewards++;
|
||||
}
|
||||
|
||||
// this handles multiple choice rewards in the Academy's Mt. Neverest missions
|
||||
if (choice != 0)
|
||||
nrewards = 1;
|
||||
|
||||
int slots[4];
|
||||
for (int i = 0; i < nrewards; i++) {
|
||||
slots[i] = ItemManager::findFreeSlot(plr);
|
||||
@@ -427,9 +431,15 @@ int MissionManager::giveMissionReward(CNSocket *sock, int task) {
|
||||
resp->m_iBatteryN = plr->batteryN;
|
||||
resp->m_iBatteryW = plr->batteryW;
|
||||
|
||||
int offset = 0;
|
||||
|
||||
// choice is actually a bitfield
|
||||
if (choice != 0)
|
||||
offset = (int)log2((int)choice);
|
||||
|
||||
for (int i = 0; i < nrewards; i++) {
|
||||
item[i].sItem.iType = reward->itemTypes[i];
|
||||
item[i].sItem.iID = reward->itemIds[i];
|
||||
item[i].sItem.iType = reward->itemTypes[offset+i];
|
||||
item[i].sItem.iID = reward->itemIds[offset+i];
|
||||
item[i].iSlotNum = slots[i];
|
||||
item[i].eIL = 1;
|
||||
|
||||
|
||||
Reference in New Issue
Block a user