|
|
@ -161,6 +161,7 @@ public: |
|
|
|
bool HEALING_OVERWORLD_MEMBERS=false; //When set to true, members will be healed as dialog boxes are closed using the HEALING_OVERWORLD_MEMBER variable.
|
|
|
|
bool HEALING_OVERWORLD_MEMBERS=false; //When set to true, members will be healed as dialog boxes are closed using the HEALING_OVERWORLD_MEMBER variable.
|
|
|
|
int HEALING_OVERWORLD_MEMBER=0; |
|
|
|
int HEALING_OVERWORLD_MEMBER=0; |
|
|
|
bool HEALING_OVERWORLD_SINGLE_MEMBER=false; //When set to true, a single member is being healed.
|
|
|
|
bool HEALING_OVERWORLD_SINGLE_MEMBER=false; //When set to true, a single member is being healed.
|
|
|
|
|
|
|
|
bool OVERWORLD_ITEM_BEING_USED=false; //When set to true, we need to equip an item after target selected.
|
|
|
|
|
|
|
|
|
|
|
|
bool MOUSE_PRESSED_DOWN=false,MOUSE_DOWN=false,MOUSE_RELEASED=false; //TODO Implement Mouse things.
|
|
|
|
bool MOUSE_PRESSED_DOWN=false,MOUSE_DOWN=false,MOUSE_RELEASED=false; //TODO Implement Mouse things.
|
|
|
|
|
|
|
|
|
|
|
@ -1100,7 +1101,7 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), |
|
|
|
} |
|
|
|
} |
|
|
|
}break; |
|
|
|
}break; |
|
|
|
case 2:{//Items is selected.
|
|
|
|
case 2:{//Items is selected.
|
|
|
|
|
|
|
|
GAME_STATE=GameState::OVERWORLD_ITEMS_MENU; |
|
|
|
}break; |
|
|
|
}break; |
|
|
|
case 3:{//Equip is selected.
|
|
|
|
case 3:{//Equip is selected.
|
|
|
|
|
|
|
|
|
|
|
@ -1228,10 +1229,89 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), |
|
|
|
PARTY_MEMBER_OBJ[OVERWORLD_TARGET_SELECTION]->highlighted=true; |
|
|
|
PARTY_MEMBER_OBJ[OVERWORLD_TARGET_SELECTION]->highlighted=true; |
|
|
|
} |
|
|
|
} |
|
|
|
if (UpPressed()){ |
|
|
|
if (UpPressed()){ |
|
|
|
|
|
|
|
if (OVERWORLD_ITEM_BEING_USED) { |
|
|
|
|
|
|
|
GAME_STATE=GameState::OVERWORLD_ITEMS_MENU; |
|
|
|
|
|
|
|
} else { |
|
|
|
GAME_STATE=GameState::OVERWORLD_GRADE_MENU; |
|
|
|
GAME_STATE=GameState::OVERWORLD_GRADE_MENU; |
|
|
|
|
|
|
|
} |
|
|
|
PARTY_MEMBER_OBJ[OVERWORLD_TARGET_SELECTION]->highlighted=false; |
|
|
|
PARTY_MEMBER_OBJ[OVERWORLD_TARGET_SELECTION]->highlighted=false; |
|
|
|
} |
|
|
|
} |
|
|
|
if (ACTIONKEYPRESSED) { |
|
|
|
if (ACTIONKEYPRESSED) { |
|
|
|
|
|
|
|
if (OVERWORLD_ITEM_BEING_USED) { //Equipping an item.
|
|
|
|
|
|
|
|
int prevPartyInvenSize=PARTY_INVENTORY.size(); |
|
|
|
|
|
|
|
if (PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->stats.equip!=EquipSlot::NONE) { |
|
|
|
|
|
|
|
PARTY_MEMBER_STATS[PARTY_MEMBER_ID[OVERWORLD_TARGET_SELECTION]]->EquipItem(ITEM_SELECTION_CURSOR); |
|
|
|
|
|
|
|
GAME_STATE=GameState::OVERWORLD_ITEMS_MENU; |
|
|
|
|
|
|
|
PARTY_MEMBER_OBJ[OVERWORLD_TARGET_SELECTION]->highlighted=true; |
|
|
|
|
|
|
|
} else
|
|
|
|
|
|
|
|
if (PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->stats.consumable!=Consumable::NOT_A_CONSUMABLE) { |
|
|
|
|
|
|
|
if (PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->stats.consumable==Consumable::FRIENDLY||PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->stats.consumable==Consumable::FRIENDLY_PERMANENT) { |
|
|
|
|
|
|
|
//PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove=MOVELIST[BattleMoveName::CONSUMABLE];
|
|
|
|
|
|
|
|
Entity*target=PARTY_MEMBER_STATS[PARTY_MEMBER_ID[OVERWORLD_TARGET_SELECTION]]; |
|
|
|
|
|
|
|
Item*item=PARTY_INVENTORY[ITEM_SELECTION_CURSOR]; |
|
|
|
|
|
|
|
std::string messages=item->name+" is used."; |
|
|
|
|
|
|
|
for (int i=0;i<item->messages.size();i++) { |
|
|
|
|
|
|
|
CustomItemMessage msg = item->messages[i]; |
|
|
|
|
|
|
|
if (msg.s.find("$TARGET")!=std::string::npos) { |
|
|
|
|
|
|
|
if (msg.a!=ItemAction::LEARNMOVE) { |
|
|
|
|
|
|
|
messages+=" "+msg.s.replace(msg.s.find("$TARGET"),7,target->obj->name); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
messages+=" "+msg.s; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
switch (msg.a) { |
|
|
|
|
|
|
|
case ItemAction::HPRECOVERY:{ |
|
|
|
|
|
|
|
target->AddHP(item->stats.hpRecovery); |
|
|
|
|
|
|
|
vi2d box = {(128-32*PARTY_MEMBER_COUNT)+OVERWORLD_TARGET_SELECTION*64+29,170}; |
|
|
|
|
|
|
|
DAMAGE_NUMBERS.push_back(new DamageNumber(-item->stats.hpRecovery,box+cameraPos)); |
|
|
|
|
|
|
|
}break; |
|
|
|
|
|
|
|
case ItemAction::PPRECOVERY:{ |
|
|
|
|
|
|
|
target->AddPP(item->stats.ppRecovery); |
|
|
|
|
|
|
|
}break; |
|
|
|
|
|
|
|
case ItemAction::ATKINCREASE:{ |
|
|
|
|
|
|
|
target->baseAtk+=item->stats.atkIncrease; |
|
|
|
|
|
|
|
}break; |
|
|
|
|
|
|
|
case ItemAction::HPINCREASE:{ |
|
|
|
|
|
|
|
target->maxHP+=item->stats.hpIncrease; |
|
|
|
|
|
|
|
target->AddHP(item->stats.hpIncrease); |
|
|
|
|
|
|
|
vi2d box = {(128-32*PARTY_MEMBER_COUNT)+OVERWORLD_TARGET_SELECTION*64+29,170}; |
|
|
|
|
|
|
|
DAMAGE_NUMBERS.push_back(new DamageNumber(-item->stats.hpIncrease,box+cameraPos)); |
|
|
|
|
|
|
|
}break; |
|
|
|
|
|
|
|
case ItemAction::PPINCREASE:{ |
|
|
|
|
|
|
|
target->maxPP+=item->stats.ppIncrease; |
|
|
|
|
|
|
|
target->AddPP(item->stats.ppIncrease); |
|
|
|
|
|
|
|
}break; |
|
|
|
|
|
|
|
case ItemAction::SPDINCREASE:{ |
|
|
|
|
|
|
|
target->speed+=item->stats.spdIncrease; |
|
|
|
|
|
|
|
}break; |
|
|
|
|
|
|
|
case ItemAction::LEARNMOVE:{ |
|
|
|
|
|
|
|
bool moveLearned=false; |
|
|
|
|
|
|
|
for (int i=0;i<target->moveSet.size();i++) { |
|
|
|
|
|
|
|
if (item->stats.learnAbility==target->moveSet[i]) { |
|
|
|
|
|
|
|
moveLearned=true; |
|
|
|
|
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (!moveLearned) { |
|
|
|
|
|
|
|
messages+=" "+msg.s.replace(msg.s.find("$TARGET"),7,target->obj->name); |
|
|
|
|
|
|
|
target->moveSet.push_back(item->stats.learnAbility); |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
messages+=" Failed to learn "+item->stats.learnAbility->GetPowerName(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}break; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
DisplayMessageBox(messages); |
|
|
|
|
|
|
|
PARTY_MEMBER_STATS[PARTY_MEMBER_ID[OVERWORLD_TARGET_SELECTION]]->RemoveItem(ITEM_SELECTION_CURSOR); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (ITEM_SELECTION_CURSOR>=PARTY_INVENTORY.size()&&prevPartyInvenSize&1&&PARTY_INVENTORY.size()==prevPartyInvenSize-1) { |
|
|
|
|
|
|
|
ITEM_SELECTION_OFFSET-=2; |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
ITEM_SELECTION_CURSOR=std::clamp(ITEM_SELECTION_CURSOR,0,(int)PARTY_INVENTORY.size()-1); |
|
|
|
|
|
|
|
OVERWORLD_ITEM_BEING_USED=false; |
|
|
|
|
|
|
|
GAME_STATE=GameState::OVERWORLD_ITEMS_MENU; |
|
|
|
|
|
|
|
} else { //Using a power instead.
|
|
|
|
HEALING_OVERWORLD_SINGLE_MEMBER=true; |
|
|
|
HEALING_OVERWORLD_SINGLE_MEMBER=true; |
|
|
|
Battle::Move*move=BATTLE_MOVELIST_DISPLAY[OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]][OVERWORLD_POWER_GRADE_CURSOR]; |
|
|
|
Battle::Move*move=BATTLE_MOVELIST_DISPLAY[OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]][OVERWORLD_POWER_GRADE_CURSOR]; |
|
|
|
PARTY_MEMBER_STATS[PARTY_MEMBER_ID[OVERWORLD_POWER_SELECTION_MEMBER]]->SubtractPP(move->PPCost); |
|
|
|
PARTY_MEMBER_STATS[PARTY_MEMBER_ID[OVERWORLD_POWER_SELECTION_MEMBER]]->SubtractPP(move->PPCost); |
|
|
@ -1239,6 +1319,26 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), |
|
|
|
GAME_STATE=GameState::OVERWORLD_GRADE_MENU; |
|
|
|
GAME_STATE=GameState::OVERWORLD_GRADE_MENU; |
|
|
|
PARTY_MEMBER_OBJ[OVERWORLD_TARGET_SELECTION]->highlighted=false; |
|
|
|
PARTY_MEMBER_OBJ[OVERWORLD_TARGET_SELECTION]->highlighted=false; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
}break; |
|
|
|
|
|
|
|
case GameState::OVERWORLD_ITEMS_MENU:{ |
|
|
|
|
|
|
|
if (LeftPressed()&&!(ITEM_SELECTION_CURSOR&1)) { |
|
|
|
|
|
|
|
GAME_STATE=GameState::OVERWORLD_MENU; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
HandleInventoryNavigation(); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (ACTIONKEYPRESSED) { |
|
|
|
|
|
|
|
if (PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->stats.equip!=EquipSlot::NONE||PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->stats.consumable!=Consumable::NOT_A_CONSUMABLE) { |
|
|
|
|
|
|
|
if (PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->stats.equip!=EquipSlot::NONE||PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->stats.consumable==Consumable::FRIENDLY||PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->stats.consumable==Consumable::FRIENDLY_PERMANENT) { |
|
|
|
|
|
|
|
GAME_STATE=GameState::OVERWORLD_TARGET_MENU; |
|
|
|
|
|
|
|
OVERWORLD_ITEM_BEING_USED=true; |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
DisplayMessageBox("Cannot use that here."); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} else { |
|
|
|
|
|
|
|
DisplayMessageBox("Cannot use that here."); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
}break; |
|
|
|
}break; |
|
|
|
case GameState::EDITOR:{ |
|
|
|
case GameState::EDITOR:{ |
|
|
|
if (IsTextEntryEnabled()) { |
|
|
|
if (IsTextEntryEnabled()) { |
|
|
@ -1598,6 +1698,23 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (BATTLE_ENCOUNTER!=nullptr&&BATTLE_STATE==BattleState::ITEM_SELECT||GAME_STATE==GameState::OVERWORLD_ITEMS_MENU) { |
|
|
|
|
|
|
|
DrawDialogBox({4,4},{(int)(WIDTH-8),(int)(HEIGHT/2)},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220)); |
|
|
|
|
|
|
|
DrawDialogBox({(int)(WIDTH*(3.0F/8)),HEIGHT/2+4},{(int)(WIDTH*(5.0F/8)-4),(int)(HEIGHT/4)},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220)); |
|
|
|
|
|
|
|
DrawDecal({static_cast<float>(8+(ITEM_SELECTION_CURSOR)%2*(WIDTH-8)/2),static_cast<float>(12*((ITEM_SELECTION_CURSOR-ITEM_SELECTION_OFFSET)/2)+8)},SPRITES["cursor.png"]); |
|
|
|
|
|
|
|
DrawStringPropDecal({(int)(WIDTH*(3.0F/8))+4,HEIGHT/2+8},Wrap(PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->description,(int)(WIDTH*(5.0F/8))-4,true,{1,1})); |
|
|
|
|
|
|
|
for (int i=0;i<18;i++) { |
|
|
|
|
|
|
|
if (ITEM_SELECTION_OFFSET+i<PARTY_INVENTORY.size()) { |
|
|
|
|
|
|
|
DrawStringPropDecal({static_cast<float>(16+i%2*(WIDTH-8)/2),static_cast<float>(12*(i/2)+8)},PARTY_INVENTORY[ITEM_SELECTION_OFFSET+i]->name,WHITE,{std::clamp((float)(WIDTH-48)/2/GetTextSizeProp(PARTY_INVENTORY[ITEM_SELECTION_OFFSET+i]->name).x,0.0F,1.0F),1.0F}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (ITEM_SELECTION_OFFSET>0) { |
|
|
|
|
|
|
|
DrawRotatedDecal({WIDTH-20,8},SPRITES["cursor.png"],-M_PI_2,{4,4}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (ITEM_SELECTION_OFFSET+18<PARTY_INVENTORY.size()) { |
|
|
|
|
|
|
|
DrawRotatedDecal({WIDTH-20,4+HEIGHT/2-4},SPRITES["cursor.png"],M_PI_2,{4,4}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
if (BATTLE_ENCOUNTER!=nullptr) { |
|
|
|
if (BATTLE_ENCOUNTER!=nullptr) { |
|
|
|
SetDrawTarget(layer::HIGH); |
|
|
|
SetDrawTarget(layer::HIGH); |
|
|
@ -1665,23 +1782,6 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
if (BATTLE_STATE==BattleState::ITEM_SELECT) { |
|
|
|
|
|
|
|
DrawDialogBox({4,4},{(int)(WIDTH-8),(int)(HEIGHT/2)},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220)); |
|
|
|
|
|
|
|
DrawDialogBox({(int)(WIDTH*(3.0F/8)),HEIGHT/2+4},{(int)(WIDTH*(5.0F/8)-4),(int)(HEIGHT/4)},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220)); |
|
|
|
|
|
|
|
DrawDecal({static_cast<float>(8+(ITEM_SELECTION_CURSOR)%2*(WIDTH-8)/2),static_cast<float>(12*((ITEM_SELECTION_CURSOR-ITEM_SELECTION_OFFSET)/2)+8)},SPRITES["cursor.png"]); |
|
|
|
|
|
|
|
DrawStringPropDecal({(int)(WIDTH*(3.0F/8))+4,HEIGHT/2+8},Wrap(PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->description,(int)(WIDTH*(5.0F/8))-4,true,{1,1})); |
|
|
|
|
|
|
|
for (int i=0;i<18;i++) { |
|
|
|
|
|
|
|
if (ITEM_SELECTION_OFFSET+i<PARTY_INVENTORY.size()) { |
|
|
|
|
|
|
|
DrawStringPropDecal({static_cast<float>(16+i%2*(WIDTH-8)/2),static_cast<float>(12*(i/2)+8)},PARTY_INVENTORY[ITEM_SELECTION_OFFSET+i]->name,WHITE,{std::clamp((float)(WIDTH-48)/2/GetTextSizeProp(PARTY_INVENTORY[ITEM_SELECTION_OFFSET+i]->name).x,0.0F,1.0F),1.0F}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (ITEM_SELECTION_OFFSET>0) { |
|
|
|
|
|
|
|
DrawRotatedDecal({WIDTH-20,8},SPRITES["cursor.png"],-M_PI_2,{4,4}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
if (ITEM_SELECTION_OFFSET+18<PARTY_INVENTORY.size()) { |
|
|
|
|
|
|
|
DrawRotatedDecal({WIDTH-20,4+HEIGHT/2-4},SPRITES["cursor.png"],M_PI_2,{4,4}); |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
|
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
//////////////////INTERFACE LAYER.
|
|
|
|
//////////////////INTERFACE LAYER.
|
|
|
@ -2969,7 +3069,7 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), |
|
|
|
if (!moveLearned) { |
|
|
|
if (!moveLearned) { |
|
|
|
target->moveSet.push_back(BATTLE_CUSTOM_ITEM->stats.learnAbility); |
|
|
|
target->moveSet.push_back(BATTLE_CUSTOM_ITEM->stats.learnAbility); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
BATTLE_CURRENT_CUSTOM_MSG.s="Failed to learn "+BATTLE_CUSTOM_ITEM->stats.learnAbility->name; |
|
|
|
BATTLE_CURRENT_CUSTOM_MSG.s="Failed to learn "+BATTLE_CUSTOM_ITEM->stats.learnAbility->GetPowerName(); |
|
|
|
} |
|
|
|
} |
|
|
|
}break; |
|
|
|
}break; |
|
|
|
} |
|
|
|
} |
|
|
|