diff --git a/C++ProjectTemplate b/C++ProjectTemplate index 2c612cb..25d6ee5 100755 Binary files a/C++ProjectTemplate and b/C++ProjectTemplate differ diff --git a/assets/additionalFont.png b/assets/additionalFont.png index 07ef211..b904ef7 100644 Binary files a/assets/additionalFont.png and b/assets/additionalFont.png differ diff --git a/main.cpp b/main.cpp index e04322e..77cbfa4 100644 --- a/main.cpp +++ b/main.cpp @@ -279,6 +279,18 @@ enum class BattleMoveName{ PKSHIELD_B, PKSHIELD_O, PKSHIELD_S, + PKLIFEUP_A, + PKLIFEUP_B, + PKLIFEUP_G, + PKLIFEUP_O, + PKFUN_A, + PKFUN_B, + PKFUN_G, + PKFUN_O, + PKFIRE_A, + PKFIRE_B, + PKFIRE_G, + PKFIRE_O, }; namespace Battle{ @@ -291,10 +303,11 @@ namespace Battle{ bool pctDamage; //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 + int PPCost=0; int grade=0; //If the name of a move name match, then the grade helps sort it into the same category on menus. - Move(std::string name,int baseDmg,int randomDmg,std::arraycomposition,bool pctDamage=false,std::vector> properties={}) - :Move(name,0,baseDmg,randomDmg,composition,pctDamage,properties){}; - Move(std::string name,int grade,int baseDmg,int randomDmg,std::arraycomposition,bool pctDamage=false,std::vector> properties={}) + Move(std::string name,int baseDmg,int randomDmg,int PPCost,std::arraycomposition,bool pctDamage=false,std::vector> properties={}) + :Move(name,0,baseDmg,randomDmg,PPCost,composition,pctDamage,properties){}; + Move(std::string name,int grade,int baseDmg,int randomDmg,int PPCost,std::arraycomposition,bool pctDamage=false,std::vector> properties={}) :name(name),grade(grade),randomDmg(randomDmg),baseDmg(baseDmg),composition(composition),pctDamage(pctDamage),properties(properties){} }; } @@ -433,10 +446,15 @@ public: int BATTLE_TARGET=-99; //Negative numbers for players and positive numbers for enemy targets. int CURRENT_TURN=-99; //Who's turn we are enacting. int BATTLE_SELECTION_CURSOR=0; - int POWER_SELECTION_CURSOR=0; + int POWER_SELECTION_CURSOR[4]={0,0,0,0}; int TARGET_SELECTION_CURSOR=0; bool ANYKEYPRESSED=false; bool ACTIONKEYPRESSED=false; + std::map> BATTLE_MOVELIST_DISPLAY; + std::map ADDITIONAL_FONT_VALS = { + {α,0},{β,1},{γ,2},{Ω,3},{Σ,4}, + }; + int POWER_SELECTION_OFFSET[4]={0,0,0,0}; @@ -465,8 +483,8 @@ public: EnableLayer(layer::COLLISION,false); - SetupPartyMemberStats(); SetupMoveList(); + SetupPartyMemberStats(); SetupAnimations(); SetupObjectInfo(); SetupEncounters(); @@ -481,9 +499,9 @@ public: additionalChars[α]={0,0}; additionalChars[β]={8,0}; - additionalChars[γ]={16,0}; - additionalChars[Ω]={24,0}; - additionalChars[Σ]={32,0}; + additionalChars[Ω]={16,0}; + additionalChars[Σ]={24,0}; + additionalChars[γ]={32,0}; MAP_ONETT=new Map("map0","map0_2","map0_3","map0_4","map0_5",SPRITES["terrainmap.png"]); @@ -1119,19 +1137,40 @@ goes on a very long time, I hope you can understand this is only for testing pur if (ACTIONKEYPRESSED) { switch (BATTLE_SELECTION_CURSOR) { case 0:{ //Power selected. - DisplayMessageBox("Not implemented yet."); + 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]; + if (BATTLE_MOVELIST_DISPLAY.count(move->name)) { + bool found=false; + for (int i=0;iname].size();i++) { + if (ADDITIONAL_FONT_VALS[move->grade]name][i]->grade]) { + BATTLE_MOVELIST_DISPLAY[move->name].insert(BATTLE_MOVELIST_DISPLAY[move->name].begin()+i,move); + found=true; + break; + } + } + if (!found) { + BATTLE_MOVELIST_DISPLAY[move->name].push_back(move); + } + } else { + BATTLE_MOVELIST_DISPLAY[move->name].push_back(move); + } + } }break; case 1:{ //Attack selected. - DisplayMessageBox("Not implemented yet."); + BATTLE_STATE=BattleState::TARGET_SELECT; }break; case 2:{ //Items selected. - DisplayMessageBox("Not implemented yet."); + BATTLE_STATE=BattleState::ITEM_SELECT; }break; case 3:{ //Defend selected. DisplayMessageBox("Not implemented yet."); }break; case 4:{ //Move selected. - DisplayMessageBox("Not implemented yet."); + BATTLE_STATE=BattleState::MOVE_SELECT; }break; case 5:{ //Run selected. DisplayMessageBox("Not implemented yet."); @@ -1140,6 +1179,22 @@ goes on a very long time, I hope you can understand this is only for testing pur } } }break; + case BattleState::POWER_SELECT:{ + if (CURRENT_TURN<0) { + if (DownPressed()) { + POWER_SELECTION_CURSOR[-CURRENT_TURN-1]=std::clamp(POWER_SELECTION_CURSOR[-CURRENT_TURN-1]+1,0,(int)BATTLE_MOVELIST_DISPLAY.size()-1); + if (POWER_SELECTION_CURSOR[-CURRENT_TURN-1]-POWER_SELECTION_OFFSET[-CURRENT_TURN-1]>=4) { + POWER_SELECTION_OFFSET[-CURRENT_TURN-1]++; + } + } + if (UpPressed()) { + POWER_SELECTION_CURSOR[-CURRENT_TURN-1]=std::clamp(POWER_SELECTION_CURSOR[-CURRENT_TURN-1]-1,0,(int)BATTLE_MOVELIST_DISPLAY.size()-1); + if (POWER_SELECTION_CURSOR[-CURRENT_TURN-1]>::const_iterator it = BATTLE_MOVELIST_DISPLAY.cbegin(); + int counter=0; + int displayLimit=0; + while (it!=BATTLE_MOVELIST_DISPLAY.cend()) { + if (counter>=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 = it->second; + std::string name = it->first; + if (GetTextSizeProp(name).x>WIDTH/4) { + DrawStringPropDecal({12,12*counter+8+displayYOffset},name,WHITE,{(WIDTH/4)/(float)GetTextSizeProp(name).x,1}); + } else { + DrawStringPropDecal({12,12*counter+8+displayYOffset},name); } - drawCheckerboardBox(box,{59,59},olc::Pixel(180,159,194),olc::Pixel(200,179,214),{6,6}); - DrawStringDecal({(float)(box.x+6),(float)(box.y+6)},obj->name,olc::BLACK); - DrawPartialDecal({(float)(box.x+4),(float)(box.y+5+8+2)},SPRITES["atbbar_back.png"],{0,0},{member->atb/1000.0*SPRITES["atbbar_back.png"]->sprite->width,SPRITES["atbbar_back.png"]->sprite->height}); - DrawDecal({(float)(box.x+4),(float)(box.y+5+8+2)},SPRITES["atbbar_front.png"]); - const olc::vi2d hpTextPos = {box.x+5,box.y+25}; - for (int x=-1;x<=1;x++) { - for (int y=-1;y<=1;y++) { - if (x!=0&&y!=0) { - DrawStringDecal({(float)(hpTextPos.x+x),(float)(hpTextPos.y+y)},"HP",olc::WHITE); - } + std::wstring drawStr; + for (int i=0;igrade; + } + DrawFancyStringDecal({8+WIDTH/4+4,12*counter+8+displayYOffset},drawStr); + } + ++it; + ++counter; + } + DrawDecal({4,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,3},SPRITES["cursor.png"],-M_PI_2,{4,4}); + } + if (POWER_SELECTION_OFFSET[-CURRENT_TURN-1]+3name,olc::BLACK); + DrawPartialDecal({(float)(box.x+4),(float)(box.y+5+8+2)},SPRITES["atbbar_back.png"],{0,0},{member->atb/1000.0*SPRITES["atbbar_back.png"]->sprite->width,SPRITES["atbbar_back.png"]->sprite->height}); + DrawDecal({(float)(box.x+4),(float)(box.y+5+8+2)},SPRITES["atbbar_front.png"]); + const olc::vi2d hpTextPos = {box.x+5,box.y+25}; + for (int x=-1;x<=1;x++) { + for (int y=-1;y<=1;y++) { + if (x!=0&&y!=0) { + DrawStringDecal({(float)(hpTextPos.x+x),(float)(hpTextPos.y+y)},"HP",olc::WHITE); } } - DrawStringDecal(hpTextPos,"HP",olc::BLACK); - DrawRollingCounter(hpTextPos,member->HP,player_rollhp_display[i],player_rollhp_counter[i]); - const olc::vi2d mpTextPos = {box.x+5,hpTextPos.y+17}; - for (int x=-1;x<=1;x++) { - for (int y=-1;y<=1;y++) { - if (x!=0&&y!=0) { - DrawStringDecal({(float)(mpTextPos.x+x),(float)(mpTextPos.y+y)},"PP",olc::WHITE); - } + } + DrawStringDecal(hpTextPos,"HP",olc::BLACK); + DrawRollingCounter(hpTextPos,member->HP,player_rollhp_display[i],player_rollhp_counter[i]); + const olc::vi2d mpTextPos = {box.x+5,hpTextPos.y+17}; + for (int x=-1;x<=1;x++) { + for (int y=-1;y<=1;y++) { + if (x!=0&&y!=0) { + DrawStringDecal({(float)(mpTextPos.x+x),(float)(mpTextPos.y+y)},"PP",olc::WHITE); } } - DrawStringDecal(mpTextPos,"PP",olc::BLACK); - DrawRollingCounter(mpTextPos,member->PP,player_rollpp_display[i],player_rollpp_counter[i]); } + DrawStringDecal(mpTextPos,"PP",olc::BLACK); + DrawRollingCounter(mpTextPos,member->PP,player_rollpp_display[i],player_rollpp_counter[i]); } } } @@ -1747,32 +1831,75 @@ goes on a very long time, I hope you can understand this is only for testing pur PARTY_MEMBER_STATS[i]=new Entity(120,120,30,30,8,{0,0,0,0},4,{MOVELIST[BattleMoveName::TESTMOVE1]}); printf("HP:%d Max HP:%d",PARTY_MEMBER_STATS[i]->HP,PARTY_MEMBER_STATS[i]->maxHP); } + PARTY_MEMBER_STATS[PLAYER]->moveSet={ + MOVELIST[BattleMoveName::HAILSTORM_A], + MOVELIST[BattleMoveName::HAILSTORM_B], + MOVELIST[BattleMoveName::HURRICANE_A], + MOVELIST[BattleMoveName::HURRICANE_B], + MOVELIST[BattleMoveName::HURRICANE_G], + MOVELIST[BattleMoveName::HURRICANE_O], + MOVELIST[BattleMoveName::METEORRAIN_A], + MOVELIST[BattleMoveName::PKFUN_A], + MOVELIST[BattleMoveName::PKLIFEUP_A], + MOVELIST[BattleMoveName::PKFREEZE_A], + MOVELIST[BattleMoveName::PKSHIELD_A]}; + PARTY_MEMBER_STATS[NESS]->moveSet={ + MOVELIST[BattleMoveName::PKFUN_A], + MOVELIST[BattleMoveName::PKFUN_B], + MOVELIST[BattleMoveName::PKLIFEUP_A], + MOVELIST[BattleMoveName::PKLIFEUP_B], + MOVELIST[BattleMoveName::PKLIFEUP_G], + MOVELIST[BattleMoveName::PKLIFEUP_O],}; + PARTY_MEMBER_STATS[PAULA]->moveSet={ + MOVELIST[BattleMoveName::PKFREEZE_A], + MOVELIST[BattleMoveName::PKFREEZE_B], + MOVELIST[BattleMoveName::PKFREEZE_G], + MOVELIST[BattleMoveName::PKFREEZE_O], + MOVELIST[BattleMoveName::PKFIRE_A], + MOVELIST[BattleMoveName::PKFIRE_B],}; + PARTY_MEMBER_STATS[ANNA]->moveSet={ + MOVELIST[BattleMoveName::PKFREEZE_A], + MOVELIST[BattleMoveName::PKSHIELD_A], + MOVELIST[BattleMoveName::PKSHIELD_B], + MOVELIST[BattleMoveName::PKLIFEUP_A],}; } void SetupMoveList() { - MOVELIST[BattleMoveName::TESTMOVE1]=new Battle::Move("Test Move 1",30,5,{0,0,0,0}); - MOVELIST[BattleMoveName::TESTMOVE2]=new Battle::Move("Test Move 2",40,10,{0,0,0,0}); - MOVELIST[BattleMoveName::TESTMOVE3]=new Battle::Move("Test Move 3",25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::HAILSTORM_A]=new Battle::Move("Hailstorm",ALPHA,25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::HAILSTORM_B]=new Battle::Move("Hailstorm",BETA,25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::HAILSTORM_G]=new Battle::Move("Hailstorm",GAMMA,25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::HAILSTORM_O]=new Battle::Move("Hailstorm",OMEGA,25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::HURRICANE_A]=new Battle::Move("Hurricane",ALPHA,25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::HURRICANE_B]=new Battle::Move("Hurricane",BETA,25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::HURRICANE_G]=new Battle::Move("Hurricane",GAMMA,25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::HURRICANE_O]=new Battle::Move("Hurricane",OMEGA,25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::METEORRAIN_A]=new Battle::Move("Meteor Rain",ALPHA,25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::METEORRAIN_B]=new Battle::Move("Meteor Rain",BETA,25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::METEORRAIN_G]=new Battle::Move("Meteor Rain",GAMMA,25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::METEORRAIN_O]=new Battle::Move("Meteor Rain",OMEGA,25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::PKFREEZE_A]=new Battle::Move("PK Freeze",ALPHA,25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::PKFREEZE_B]=new Battle::Move("PK Freeze",BETA,25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::PKFREEZE_G]=new Battle::Move("PK Freeze",GAMMA,25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::PKFREEZE_O]=new Battle::Move("PK Freeze",OMEGA,25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::PKSHIELD_A]=new Battle::Move("PK Shield",ALPHA,25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::PKSHIELD_B]=new Battle::Move("PK Shield",BETA,25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::PKSHIELD_O]=new Battle::Move("PK Shield",OMEGA,25,5,{0,0,20,0}); - MOVELIST[BattleMoveName::PKSHIELD_S]=new Battle::Move("PK Shield",SIGMA,25,5,{0,0,20,0}); + MOVELIST[BattleMoveName::TESTMOVE1]=new Battle::Move("Test Move 1",30,5,ㅍ 0,{0,0,0,0}); + MOVELIST[BattleMoveName::TESTMOVE2]=new Battle::Move("Test Move 2",40,10,ㅍ 0,{0,0,0,0}); + MOVELIST[BattleMoveName::TESTMOVE3]=new Battle::Move("Test Move 3",25,5,ㅍ 0,{0,0,20,0}); + MOVELIST[BattleMoveName::HAILSTORM_A]=new Battle::Move("Hailstorm",ALPHA,25,5,ㅍ 4,{0,0,20,0}); + MOVELIST[BattleMoveName::HAILSTORM_B]=new Battle::Move("Hailstorm",BETA,25,5,ㅍ 12,{0,0,20,0}); + MOVELIST[BattleMoveName::HAILSTORM_G]=new Battle::Move("Hailstorm",GAMMA,25,5,ㅍ 28,{0,0,20,0}); + MOVELIST[BattleMoveName::HAILSTORM_O]=new Battle::Move("Hailstorm",OMEGA,25,5,ㅍ 69,{0,0,20,0}); + MOVELIST[BattleMoveName::HURRICANE_A]=new Battle::Move("Hurricane",ALPHA,25,5,ㅍ 7,{0,0,20,0}); + MOVELIST[BattleMoveName::HURRICANE_B]=new Battle::Move("Hurricane",BETA,25,5,ㅍ 13,{0,0,20,0}); + MOVELIST[BattleMoveName::HURRICANE_G]=new Battle::Move("Hurricane",GAMMA,25,5,ㅍ 25,{0,0,20,0}); + MOVELIST[BattleMoveName::HURRICANE_O]=new Battle::Move("Hurricane",OMEGA,25,5,ㅍ 55,{0,0,20,0}); + MOVELIST[BattleMoveName::METEORRAIN_A]=new Battle::Move("Meteor Rain",ALPHA,25,5,ㅍ 10,{0,0,20,0}); + MOVELIST[BattleMoveName::METEORRAIN_B]=new Battle::Move("Meteor Rain",BETA,25,5,ㅍ 22,{0,0,20,0}); + MOVELIST[BattleMoveName::METEORRAIN_G]=new Battle::Move("Meteor Rain",GAMMA,25,5,ㅍ 47,{0,0,20,0}); + MOVELIST[BattleMoveName::METEORRAIN_O]=new Battle::Move("Meteor Rain",OMEGA,25,5,ㅍ 98,{0,0,20,0}); + MOVELIST[BattleMoveName::PKFREEZE_A]=new Battle::Move("PK Freeze",ALPHA,25,5,ㅍ 4,{0,0,20,0}); + MOVELIST[BattleMoveName::PKFREEZE_B]=new Battle::Move("PK Freeze",BETA,25,5,ㅍ 8,{0,0,20,0}); + MOVELIST[BattleMoveName::PKFREEZE_G]=new Battle::Move("PK Freeze",GAMMA,25,5,ㅍ 12,{0,0,20,0}); + MOVELIST[BattleMoveName::PKFREEZE_O]=new Battle::Move("PK Freeze",OMEGA,25,5,ㅍ 22,{0,0,20,0}); + MOVELIST[BattleMoveName::PKSHIELD_A]=new Battle::Move("PK Shield",ALPHA,25,5,ㅍ 12,{0,0,20,0}); + MOVELIST[BattleMoveName::PKSHIELD_B]=new Battle::Move("PK Shield",BETA,25,5,ㅍ 20,{0,0,20,0}); + MOVELIST[BattleMoveName::PKSHIELD_O]=new Battle::Move("PK Shield",OMEGA,25,5,ㅍ 59,{0,0,20,0}); + MOVELIST[BattleMoveName::PKSHIELD_S]=new Battle::Move("PK Shield",SIGMA,25,5,ㅍ 80,{0,0,20,0}); + MOVELIST[BattleMoveName::PKLIFEUP_A]=new Battle::Move("PK Lifeup",ALPHA,25,5,ㅍ 4,{0,0,20,0}); + MOVELIST[BattleMoveName::PKLIFEUP_B]=new Battle::Move("PK Lifeup",BETA,25,5,ㅍ 9,{0,0,20,0}); + MOVELIST[BattleMoveName::PKLIFEUP_G]=new Battle::Move("PK Lifeup",GAMMA,25,5,ㅍ 21,{0,0,20,0}); + MOVELIST[BattleMoveName::PKLIFEUP_O]=new Battle::Move("PK Lifeup",OMEGA,25,5,ㅍ 64,{0,0,20,0}); + MOVELIST[BattleMoveName::PKFUN_A]=new Battle::Move("PK Fun",ALPHA,25,5,ㅍ 15,{0,0,20,0}); + MOVELIST[BattleMoveName::PKFUN_B]=new Battle::Move("PK Fun",BETA,25,5,ㅍ 30,{0,0,20,0}); + MOVELIST[BattleMoveName::PKFUN_G]=new Battle::Move("PK Fun",GAMMA,25,5,ㅍ 45,{0,0,20,0}); + MOVELIST[BattleMoveName::PKFUN_O]=new Battle::Move("PK Fun",OMEGA,25,5,ㅍ 90,{0,0,20,0}); + MOVELIST[BattleMoveName::PKFIRE_A]=new Battle::Move("PK Fire",ALPHA,25,5,ㅍ 6,{0,0,20,0}); + MOVELIST[BattleMoveName::PKFIRE_B]=new Battle::Move("PK Fire",BETA,25,5,ㅍ 12,{0,0,20,0}); + MOVELIST[BattleMoveName::PKFIRE_G]=new Battle::Move("PK Fire",GAMMA,25,5,ㅍ 20,{0,0,20,0}); + MOVELIST[BattleMoveName::PKFIRE_O]=new Battle::Move("PK Fire",OMEGA,25,5,ㅍ 32,{0,0,20,0}); } void SetupAnimations() { diff --git a/states.h b/states.h index 9b84af9..42ac58b 100644 --- a/states.h +++ b/states.h @@ -14,5 +14,9 @@ namespace BattleState{ WAIT, WAIT_ANIMATION, SELECT_ACTION, + POWER_SELECT, + ITEM_SELECT, + TARGET_SELECT, + MOVE_SELECT, }; } \ No newline at end of file