diff --git a/C++ProjectTemplate b/C++ProjectTemplate index b175adb..8bd238e 100755 Binary files a/C++ProjectTemplate and b/C++ProjectTemplate differ diff --git a/main.cpp b/main.cpp index 1b363cb..0920592 100644 --- a/main.cpp +++ b/main.cpp @@ -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. int HEALING_OVERWORLD_MEMBER=0; 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. @@ -1100,7 +1101,7 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), } }break; case 2:{//Items is selected. - + GAME_STATE=GameState::OVERWORLD_ITEMS_MENU; }break; case 3:{//Equip is selected. @@ -1228,16 +1229,115 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), PARTY_MEMBER_OBJ[OVERWORLD_TARGET_SELECTION]->highlighted=true; } if (UpPressed()){ - GAME_STATE=GameState::OVERWORLD_GRADE_MENU; + if (OVERWORLD_ITEM_BEING_USED) { + GAME_STATE=GameState::OVERWORLD_ITEMS_MENU; + } else { + GAME_STATE=GameState::OVERWORLD_GRADE_MENU; + } PARTY_MEMBER_OBJ[OVERWORLD_TARGET_SELECTION]->highlighted=false; } if (ACTIONKEYPRESSED) { - HEALING_OVERWORLD_SINGLE_MEMBER=true; - 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); - DisplayMessageBox(PARTY_MEMBER_OBJ[OVERWORLD_POWER_SELECTION_MEMBER]->name+" begins to cast "+move->GetPowerName()+".\n"); - GAME_STATE=GameState::OVERWORLD_GRADE_MENU; - PARTY_MEMBER_OBJ[OVERWORLD_TARGET_SELECTION]->highlighted=false; + 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;imessages.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;imoveSet.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; + 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); + DisplayMessageBox(PARTY_MEMBER_OBJ[OVERWORLD_POWER_SELECTION_MEMBER]->name+" begins to cast "+move->GetPowerName()+".\n"); + GAME_STATE=GameState::OVERWORLD_GRADE_MENU; + 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; case GameState::EDITOR:{ @@ -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(8+(ITEM_SELECTION_CURSOR)%2*(WIDTH-8)/2),static_cast(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(16+i%2*(WIDTH-8)/2),static_cast(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(8+(ITEM_SELECTION_CURSOR)%2*(WIDTH-8)/2),static_cast(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(16+i%2*(WIDTH-8)/2),static_cast(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+18moveSet.push_back(BATTLE_CUSTOM_ITEM->stats.learnAbility); } 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; }