diff --git a/C++ProjectTemplate b/C++ProjectTemplate index ed31b45..c543a50 100755 Binary files a/C++ProjectTemplate and b/C++ProjectTemplate differ diff --git a/battle.h b/battle.h index e37106c..bb66f4a 100644 --- a/battle.h +++ b/battle.h @@ -88,6 +88,7 @@ namespace Battle{ bool pctDamage=false; //Uses % damage for the base damage instead of flat damage. std::vector> properties={}; //The int is used to determine the chance of something occurring. //Properties order is WET, DRY, COLD, HEAT + bool overworld=false; //Whether or not a move can be used on the overworld. }; } #endif \ No newline at end of file diff --git a/main.cpp b/main.cpp index 121d49b..dae650d 100644 --- a/main.cpp +++ b/main.cpp @@ -151,6 +151,8 @@ public: int OVERWORLD_MENU_SELECTION=0; std::vector INTERACTION_MESSAGES; bool CLOSE_OVERWORLD_WINDOW=false; //When set to true, should cause the overworld menu to close as well once the dialog box is closed. + int OVERWORLD_POWER_SELECTION_OFFSET[4]={0,0,0,0}; + int OVERWORLD_POWER_SELECTION_MEMBER=0; bool MOUSE_PRESSED_DOWN=false,MOUSE_DOWN=false,MOUSE_RELEASED=false; //TODO Implement Mouse things. @@ -650,35 +652,7 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), switch (BATTLE_SELECTION_CURSOR) { case 0:{ //Power selected. BATTLE_STATE=BattleState::POWER_SELECT; - BATTLE_MOVELIST_DISPLAY.clear(); - Entity*member=PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]; - Object*obj=PARTY_MEMBER_OBJ[-CURRENT_TURN-1]; - for (int i=0;imoveSet.size();i++) { - Battle::Move*move = member->moveSet[i]; - bool exists=false; - for (int j=0;jname.compare(move->name)==0) { - bool found=false; - for (int k=0;kgrade]grade]) { - BATTLE_MOVELIST_DISPLAY[j].insert(BATTLE_MOVELIST_DISPLAY[j].begin()+i,move); - found=true; - break; - } - } - if (!found) { - BATTLE_MOVELIST_DISPLAY[j].push_back(move); - } - exists=true; - break; - } - } - if (!exists) { - std::vector vec; - vec.push_back(move); - BATTLE_MOVELIST_DISPLAY.push_back(vec); - } - } + PopulateBattleMoveList(-CURRENT_TURN-1); }break; case 1:{ //Attack selected. PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove=MOVELIST[BattleMoveName::BASH]; @@ -1076,7 +1050,8 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), } }break; case 1:{//Power is selected. - + PopulateBattleMoveList(0,true); + GAME_STATE=GameState::OVERWORLD_POWER_MENU; }break; case 2:{//Items is selected. @@ -1209,9 +1184,14 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), } switch (GAME_STATE) { case GameState::GAME_WORLD: - case GameState::OVERWORLD_MENU:{ + case GameState::OVERWORLD_MENU: + case GameState::OVERWORLD_POWER_MENU: + case GameState::OVERWORLD_GRADE_MENU: + case GameState::OVERWORLD_ITEMS_MENU: + case GameState::OVERWORLD_EQUIP_MENU: + case GameState::OVERWORLD_STATUS_MENU:{ DrawGameWorld(); - if (GAME_STATE==GameState::OVERWORLD_MENU) { + if (GAME_STATE!=GameState::GAME_WORLD) { SetDrawTarget(layer::INTERFACE); vi2d boxPos = {2,2}; DrawDialogBox(boxPos,{(int)(WIDTH*0.25+4),5*16+4},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220)); @@ -1220,7 +1200,10 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), vi2d textPos = {12,i*16+6}; DrawStringPropDecal(boxPos+textPos,MENU_ITEMS[i]); } - DrawDecal({static_cast(2+4),static_cast(2+6+OVERWORLD_MENU_SELECTION*16)},SPRITES["cursor.png"]); + DrawDecal({static_cast(2+4),static_cast(2+6+OVERWORLD_MENU_SELECTION*16)},SPRITES["cursor.png"]); + } + if (GAME_STATE==GameState::OVERWORLD_POWER_MENU||GAME_STATE==GameState::OVERWORLD_GRADE_MENU) { + DrawBattleMoveList(OVERWORLD_POWER_SELECTION_OFFSET[OVERWORLD_POWER_SELECTION_MEMBER]); } }break; case GameState::EDITOR:{ @@ -1339,93 +1322,7 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), DrawDecal({static_cast(BATTLE_SELECTION_CURSOR/2*64+3),static_cast(9+((BATTLE_SELECTION_CURSOR%2==0)?0:14))},SPRITES["cursor.png"]); } if (BATTLE_STATE==BattleState::POWER_SELECT||BATTLE_STATE==BattleState::GRADE_SELECT) { - SetDrawTarget(layer::INTERFACE); - DrawDialogBox({1,1},{(int)(WIDTH/2),HEIGHT/4},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220)); - - vd2d descBoxPos = {WIDTH-(int)(WIDTH/2.5)-2,1}; - vi2d textStartingOffset = {4,4}; - DrawDialogBox(descBoxPos,{(int)(WIDTH/2.5),HEIGHT/4},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220)); - DrawStringPropDecal(descBoxPos+textStartingOffset,Wrap(BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[-CURRENT_TURN-1]][0]->desc,((int)(WIDTH/2.5-8)),true,{0.8,0.8}),WHITE,{0.8,0.8}); - vd2d ppCostBoxPos = {WIDTH-WIDTH/3-2,HEIGHT/4+2}; - DrawDialogBox(ppCostBoxPos,{(int)(WIDTH/6),HEIGHT/8},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220)); - DrawStringPropDecal(ppCostBoxPos+textStartingOffset,"PP Cost",WHITE,{0.7,0.8}); - std::string label = std::to_string(BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[-CURRENT_TURN-1]][POWER_GRADE_CURSOR[-CURRENT_TURN-1]]->PPCost); - DrawStringPropDecal({static_cast(ppCostBoxPos.x+textStartingOffset.x+(WIDTH/6)-8-GetTextSizeProp(label).x*1.5),static_cast(ppCostBoxPos.y+textStartingOffset.y+8)},label,WHITE,{1.5,1.5}); - - vd2d damageBoxPos = {WIDTH-WIDTH/3+WIDTH/6-1,HEIGHT/4+2}; - DrawDialogBox({WIDTH-WIDTH/3+WIDTH/6-1,HEIGHT/4+2},{(int)(WIDTH/6),HEIGHT/8},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220)); - DrawStringPropDecal(damageBoxPos+textStartingOffset,"Damage",WHITE,{0.7,0.8}); - label = (BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[-CURRENT_TURN-1]][POWER_GRADE_CURSOR[-CURRENT_TURN-1]]->baseDmg!=0)?std::to_string(BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[-CURRENT_TURN-1]][POWER_GRADE_CURSOR[-CURRENT_TURN-1]]->baseDmg+PARTY_MEMBER_STATS[-CURRENT_TURN-1]->baseAtk)+"~"+std::to_string(BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[-CURRENT_TURN-1]][POWER_GRADE_CURSOR[-CURRENT_TURN-1]]->randomDmg+BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[-CURRENT_TURN-1]][POWER_GRADE_CURSOR[-CURRENT_TURN-1]]->baseDmg+PARTY_MEMBER_STATS[-CURRENT_TURN-1]->baseAtk):"N/A"; - DrawStringPropDecal({static_cast(damageBoxPos.x+textStartingOffset.x+(WIDTH/6)-8-GetTextSizeProp(label).x*(std::min((double)((WIDTH/6)-8)/GetTextSizeProp(label).x,1.5))),static_cast(damageBoxPos.y+textStartingOffset.y+8)},label,WHITE,{static_cast(std::min((double)((WIDTH/6)-8)/GetTextSizeProp(label).x,1.5)),1.5}); - - - vd2d rangeBoxPos = {WIDTH-WIDTH/3+WIDTH/6-1,HEIGHT/4+HEIGHT/8+3}; - DrawDialogBox({WIDTH-WIDTH/3+WIDTH/6-1,HEIGHT/4+HEIGHT/8+3},{(int)(WIDTH/6),HEIGHT/8},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220)); - DrawStringPropDecal(rangeBoxPos+textStartingOffset,"Range",WHITE,{0.7,0.8}); - label = std::to_string(BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[-CURRENT_TURN-1]][POWER_GRADE_CURSOR[-CURRENT_TURN-1]]->range); - DrawStringPropDecal({static_cast(rangeBoxPos.x+textStartingOffset.x+(WIDTH/6)-8-GetTextSizeProp(label).x*(std::min((double)((WIDTH/6)-8)/GetTextSizeProp(label).x,1.5))),static_cast(rangeBoxPos.y+textStartingOffset.y+8)},label,WHITE,{static_cast(std::min((double)((WIDTH/6)-8)/GetTextSizeProp(label).x,1.5)),1.5}); - - - vd2d channelTimeBoxPos = {WIDTH-WIDTH/3-1,HEIGHT/4+HEIGHT/8+3}; - DrawDialogBox({WIDTH-WIDTH/3-1,HEIGHT/4+HEIGHT/8+3},{(int)(WIDTH/6),HEIGHT/8},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220)); - DrawStringPropDecal(channelTimeBoxPos+textStartingOffset,"Cast",WHITE,{0.7,0.8}); - label = std::to_string((float)BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[-CURRENT_TURN-1]][POWER_GRADE_CURSOR[-CURRENT_TURN-1]]->channelTime/60).erase(3); - DrawStringPropDecal({static_cast(channelTimeBoxPos.x+textStartingOffset.x+(WIDTH/6)-8-GetTextSizeProp(label).x*(std::min((double)((WIDTH/6)-8)/GetTextSizeProp(label).x,1.5))),static_cast(channelTimeBoxPos.y+textStartingOffset.y+8)},label,WHITE,{static_cast(std::min((double)((WIDTH/6)-8)/GetTextSizeProp(label).x,1.5)),1.5}); - - int counter=0; - int displayLimit=0; - for (int i=0;i=POWER_SELECTION_OFFSET[-CURRENT_TURN-1]&&counter<=POWER_SELECTION_OFFSET[-CURRENT_TURN-1]+3) { - int displayYOffset=-POWER_SELECTION_OFFSET[-CURRENT_TURN-1]*12; - std::vector moves = BATTLE_MOVELIST_DISPLAY[i]; - std::string name = moves[0]->name; - if (GetTextSizeProp(name).x>WIDTH/4) { - DrawStringPropDecal({12,static_cast(12*counter+8+displayYOffset)},name,WHITE,{(WIDTH/4)/(float)GetTextSizeProp(name).x,1}); - } else { - DrawStringPropDecal({12,static_cast(12*counter+8+displayYOffset)},name); - } - for (int i=0;iGetPP()>=moves[i]->PPCost) { - drawCol=WHITE; - } else { - drawCol=RED; - } - } else { - if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->GetPP()>=moves[i]->PPCost) { - drawCol=DARK_GREY; - } else { - drawCol=DARK_RED; - } - } - } else { - drawCol=WHITE; - if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->GetPP()>=moves[i]->PPCost) { - drawCol=WHITE; - } else { - drawCol=RED; - } - } - DrawFancyStringDecal({static_cast(8+WIDTH/4+12+i*8),static_cast(12*counter+8+displayYOffset)},std::wstring(1,moves[i]->grade),drawCol); - } - } - ++counter; - } - if (BATTLE_STATE==BattleState::POWER_SELECT) { - DrawDecal({4,static_cast(12*(POWER_SELECTION_CURSOR[-CURRENT_TURN-1]-POWER_SELECTION_OFFSET[-CURRENT_TURN-1])+8)},SPRITES["cursor.png"]); - } else { - DrawDecal({(float)(WIDTH/4+4+POWER_GRADE_CURSOR[-CURRENT_TURN-1]*8+8),static_cast(12*(POWER_SELECTION_CURSOR[-CURRENT_TURN-1]-POWER_SELECTION_OFFSET[-CURRENT_TURN-1])+8)},SPRITES["cursor.png"]); - } - if (BATTLE_MOVELIST_DISPLAY.size()>4) { - if (POWER_SELECTION_OFFSET[-CURRENT_TURN-1]>0) { - DrawRotatedDecal({WIDTH/2-16,7},SPRITES["cursor.png"],-M_PI_2,{4,4}); - } - if (POWER_SELECTION_OFFSET[-CURRENT_TURN-1]+3moveSet.size();i++) { + Battle::Move*move = member->moveSet[i]; + if (overworld&&move->overworld||!overworld) { + bool exists=false; + for (int j=0;jname.compare(move->name)==0) { + bool found=false; + for (int k=0;kgrade]grade]) { + BATTLE_MOVELIST_DISPLAY[j].insert(BATTLE_MOVELIST_DISPLAY[j].begin()+i,move); + found=true; + break; + } + } + if (!found) { + BATTLE_MOVELIST_DISPLAY[j].push_back(move); + } + exists=true; + break; + } + } + if (!exists) { + std::vector vec; + vec.push_back(move); + BATTLE_MOVELIST_DISPLAY.push_back(vec); + } + } + } + } + + void DrawBattleMoveList(int partyMemberSlot) { + SetDrawTarget(layer::INTERFACE); + DrawDialogBox({1,1},{(int)(WIDTH/2),HEIGHT/4},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220)); + + vd2d descBoxPos = {WIDTH-(int)(WIDTH/2.5)-2,1}; + vi2d textStartingOffset = {4,4}; + DrawDialogBox(descBoxPos,{(int)(WIDTH/2.5),HEIGHT/4},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220)); + DrawStringPropDecal(descBoxPos+textStartingOffset,Wrap(BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[partyMemberSlot]][0]->desc,((int)(WIDTH/2.5-8)),true,{0.8,0.8}),WHITE,{0.8,0.8}); + vd2d ppCostBoxPos = {WIDTH-WIDTH/3-2,HEIGHT/4+2}; + DrawDialogBox(ppCostBoxPos,{(int)(WIDTH/6),HEIGHT/8},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220)); + DrawStringPropDecal(ppCostBoxPos+textStartingOffset,"PP Cost",WHITE,{0.7,0.8}); + std::string label = std::to_string(BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[partyMemberSlot]][POWER_GRADE_CURSOR[partyMemberSlot]]->PPCost); + DrawStringPropDecal({static_cast(ppCostBoxPos.x+textStartingOffset.x+(WIDTH/6)-8-GetTextSizeProp(label).x*1.5),static_cast(ppCostBoxPos.y+textStartingOffset.y+8)},label,WHITE,{1.5,1.5}); + + vd2d damageBoxPos = {WIDTH-WIDTH/3+WIDTH/6-1,HEIGHT/4+2}; + DrawDialogBox({WIDTH-WIDTH/3+WIDTH/6-1,HEIGHT/4+2},{(int)(WIDTH/6),HEIGHT/8},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220)); + DrawStringPropDecal(damageBoxPos+textStartingOffset,"Damage",WHITE,{0.7,0.8}); + label = (BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[partyMemberSlot]][POWER_GRADE_CURSOR[partyMemberSlot]]->baseDmg!=0)?std::to_string(BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[partyMemberSlot]][POWER_GRADE_CURSOR[partyMemberSlot]]->baseDmg+PARTY_MEMBER_STATS[partyMemberSlot]->baseAtk)+"~"+std::to_string(BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[partyMemberSlot]][POWER_GRADE_CURSOR[partyMemberSlot]]->randomDmg+BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[partyMemberSlot]][POWER_GRADE_CURSOR[partyMemberSlot]]->baseDmg+PARTY_MEMBER_STATS[partyMemberSlot]->baseAtk):"N/A"; + DrawStringPropDecal({static_cast(damageBoxPos.x+textStartingOffset.x+(WIDTH/6)-8-GetTextSizeProp(label).x*(std::min((double)((WIDTH/6)-8)/GetTextSizeProp(label).x,1.5))),static_cast(damageBoxPos.y+textStartingOffset.y+8)},label,WHITE,{static_cast(std::min((double)((WIDTH/6)-8)/GetTextSizeProp(label).x,1.5)),1.5}); + + if (BATTLE_ENCOUNTER!=nullptr) { + vd2d rangeBoxPos = {WIDTH-WIDTH/3+WIDTH/6-1,HEIGHT/4+HEIGHT/8+3}; + DrawDialogBox({WIDTH-WIDTH/3+WIDTH/6-1,HEIGHT/4+HEIGHT/8+3},{(int)(WIDTH/6),HEIGHT/8},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220)); + DrawStringPropDecal(rangeBoxPos+textStartingOffset,"Range",WHITE,{0.7,0.8}); + label = std::to_string(BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[partyMemberSlot]][POWER_GRADE_CURSOR[partyMemberSlot]]->range); + DrawStringPropDecal({static_cast(rangeBoxPos.x+textStartingOffset.x+(WIDTH/6)-8-GetTextSizeProp(label).x*(std::min((double)((WIDTH/6)-8)/GetTextSizeProp(label).x,1.5))),static_cast(rangeBoxPos.y+textStartingOffset.y+8)},label,WHITE,{static_cast(std::min((double)((WIDTH/6)-8)/GetTextSizeProp(label).x,1.5)),1.5}); + } + + if (BATTLE_ENCOUNTER!=nullptr) { + vd2d channelTimeBoxPos = {WIDTH-WIDTH/3-1,HEIGHT/4+HEIGHT/8+3}; + DrawDialogBox({WIDTH-WIDTH/3-1,HEIGHT/4+HEIGHT/8+3},{(int)(WIDTH/6),HEIGHT/8},Pixel(70, 33, 105,220),Pixel(62, 54, 69,220),Pixel(185, 148, 255,220)); + DrawStringPropDecal(channelTimeBoxPos+textStartingOffset,"Cast",WHITE,{0.7,0.8}); + label = std::to_string((float)BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[partyMemberSlot]][POWER_GRADE_CURSOR[partyMemberSlot]]->channelTime/60).erase(3); + DrawStringPropDecal({static_cast(channelTimeBoxPos.x+textStartingOffset.x+(WIDTH/6)-8-GetTextSizeProp(label).x*(std::min((double)((WIDTH/6)-8)/GetTextSizeProp(label).x,1.5))),static_cast(channelTimeBoxPos.y+textStartingOffset.y+8)},label,WHITE,{static_cast(std::min((double)((WIDTH/6)-8)/GetTextSizeProp(label).x,1.5)),1.5}); + } + + int counter=0; + int displayLimit=0; + for (int i=0;i=POWER_SELECTION_OFFSET[partyMemberSlot]&&counter<=POWER_SELECTION_OFFSET[partyMemberSlot]+3) { + int displayYOffset=-POWER_SELECTION_OFFSET[partyMemberSlot]*12; + std::vector moves = BATTLE_MOVELIST_DISPLAY[i]; + std::string name = moves[0]->name; + if (GetTextSizeProp(name).x>WIDTH/4) { + DrawStringPropDecal({12,static_cast(12*counter+8+displayYOffset)},name,WHITE,{(WIDTH/4)/(float)GetTextSizeProp(name).x,1}); + } else { + DrawStringPropDecal({12,static_cast(12*counter+8+displayYOffset)},name); + } + for (int i=0;iGetPP()>=moves[i]->PPCost) { + drawCol=WHITE; + } else { + drawCol=RED; + } + } else { + if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[partyMemberSlot]]->GetPP()>=moves[i]->PPCost) { + drawCol=DARK_GREY; + } else { + drawCol=DARK_RED; + } + } + } else { + drawCol=WHITE; + if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[partyMemberSlot]]->GetPP()>=moves[i]->PPCost) { + drawCol=WHITE; + } else { + drawCol=RED; + } + } + DrawFancyStringDecal({static_cast(8+WIDTH/4+12+i*8),static_cast(12*counter+8+displayYOffset)},std::wstring(1,moves[i]->grade),drawCol); + } + } + ++counter; + } + if (BATTLE_STATE==BattleState::POWER_SELECT||GAME_STATE==GameState::OVERWORLD_POWER_MENU) { + DrawDecal({4,static_cast(12*(POWER_SELECTION_CURSOR[partyMemberSlot]-POWER_SELECTION_OFFSET[partyMemberSlot])+8)},SPRITES["cursor.png"]); + } else { + DrawDecal({(float)(WIDTH/4+4+POWER_GRADE_CURSOR[partyMemberSlot]*8+8),static_cast(12*(POWER_SELECTION_CURSOR[partyMemberSlot]-POWER_SELECTION_OFFSET[partyMemberSlot])+8)},SPRITES["cursor.png"]); + } + if (BATTLE_MOVELIST_DISPLAY.size()>4) { + if (POWER_SELECTION_OFFSET[partyMemberSlot]>0) { + DrawRotatedDecal({WIDTH/2-16,7},SPRITES["cursor.png"],-M_PI_2,{4,4}); + } + if (POWER_SELECTION_OFFSET[partyMemberSlot]+3