diff --git a/C++ProjectTemplate b/C++ProjectTemplate index ad318b0..fa3af42 100755 Binary files a/C++ProjectTemplate and b/C++ProjectTemplate differ diff --git a/assets/newFont.png b/assets/newFont.png new file mode 100644 index 0000000..24cc6d0 Binary files /dev/null and b/assets/newFont.png differ diff --git a/battle.h b/battle.h index bb66f4a..7ea11a4 100644 --- a/battle.h +++ b/battle.h @@ -83,7 +83,7 @@ namespace Battle{ int channelTime=0; //The amount of frames to channel the spell. bool friendly=false; //Target allies instead. std::arraycomposition={0,0,0,0}; - std::wstring attackMsg=L"$USER uses $POWER"; + std::string attackMsg="$USER uses $POWER"; Effect*eff=nullptr; 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. diff --git a/defines.h b/defines.h index 32abe5c..5f8aa0b 100644 --- a/defines.h +++ b/defines.h @@ -21,11 +21,11 @@ using namespace olc; #define ㅍ #define 아 -#define α 0x391 -#define β 0x392 -#define γ 0x3b3 -#define Ω 0x3a3 -#define Σ 0x3a9 +#define α '`' +#define β '{' +#define γ '\u007f' +#define Ω '|' +#define Σ '}' #define AddAsyncCutsceneAction(AsyncClass) \ if (!((AsyncClass*)CurrentCutscene->GetAction())->InQueue()) { \ @@ -38,5 +38,4 @@ using namespace olc; extern PixelGameEngine*GAME; extern vd2d cameraPos; -template inline T transform_to( F str ) noexcept{if (str.empty()) return {}; return { std::begin(str), std::end(str) };}; #endif \ No newline at end of file diff --git a/item.h b/item.h index cfc669c..0d5f61f 100644 --- a/item.h +++ b/item.h @@ -67,7 +67,7 @@ struct ItemStatsStruct{ }; struct CustomItemMessage{ - std::wstring s=L""; + std::string s=""; ItemAction a=ItemAction::HPRECOVERY; }; @@ -81,13 +81,13 @@ class Item{ std::vector messages; Item(std::string name,std::string desc,int dropChance=8,ItemStatsStruct stats={hpRecovery:0,ppRecovery:0,atkIncrease:0,spdIncrease:0,hpIncrease:0,ppIncrease:0,learnAbility:nullptr,damage:0,rollDmg:0,attack:0,defense:0,equip:EquipSlot::NONE,important:false,consumable:Consumable::NOT_A_CONSUMABLE},Battle::Move*battlemove=nullptr) :name(name),description(desc),stats(stats),dropChance(dropChance),battlemove(battlemove){ - if (stats.hpRecovery) {messages.push_back({L"$TARGET recovers "+std::to_wstring(stats.hpRecovery)+L" HP.",ItemAction::HPRECOVERY});} - if (stats.ppRecovery) {messages.push_back({L"$TARGET recovers "+std::to_wstring(stats.ppRecovery)+L" PP.",ItemAction::PPRECOVERY});} - if (stats.atkIncrease) {messages.push_back({L"$TARGET gains "+std::to_wstring(stats.atkIncrease)+L" ATK point"+(stats.atkIncrease==1?L"":L"s")+L".",ItemAction::ATKINCREASE});} - if (stats.hpIncrease) {messages.push_back({L"$TARGET gains "+std::to_wstring(stats.hpIncrease)+L" HP point"+(stats.hpIncrease==1?L"":L"s")+L".",ItemAction::HPINCREASE});} - if (stats.ppIncrease) {messages.push_back({L"$TARGET gains "+std::to_wstring(stats.ppIncrease)+L" PP point"+(stats.ppIncrease==1?L"":L"s")+L".",ItemAction::PPINCREASE});} - if (stats.spdIncrease) {messages.push_back({L"$TARGET gains "+std::to_wstring(stats.spdIncrease)+L" SPD point"+(stats.spdIncrease==1?L"":L"s")+L".",ItemAction::SPDINCREASE});} - if (stats.learnAbility!=nullptr) {messages.push_back({L"$TARGET gains the ability to use "+transform_to(stats.learnAbility->name)+L" "+((stats.learnAbility->grade!=0)?std::wstring(1,stats.learnAbility->grade):L"")+L"!",ItemAction::LEARNMOVE});} + if (stats.hpRecovery) {messages.push_back({"$TARGET recovers "+std::to_string(stats.hpRecovery)+" HP.",ItemAction::HPRECOVERY});} + if (stats.ppRecovery) {messages.push_back({"$TARGET recovers "+std::to_string(stats.ppRecovery)+" PP.",ItemAction::PPRECOVERY});} + if (stats.atkIncrease) {messages.push_back({"$TARGET gains "+std::to_string(stats.atkIncrease)+" ATK point"+(stats.atkIncrease==1?"":"s")+".",ItemAction::ATKINCREASE});} + if (stats.hpIncrease) {messages.push_back({"$TARGET gains "+std::to_string(stats.hpIncrease)+" HP point"+(stats.hpIncrease==1?"":"s")+".",ItemAction::HPINCREASE});} + if (stats.ppIncrease) {messages.push_back({"$TARGET gains "+std::to_string(stats.ppIncrease)+" PP point"+(stats.ppIncrease==1?"":"s")+".",ItemAction::PPINCREASE});} + if (stats.spdIncrease) {messages.push_back({"$TARGET gains "+std::to_string(stats.spdIncrease)+" SPD point"+(stats.spdIncrease==1?"":"s")+".",ItemAction::SPDINCREASE});} + if (stats.learnAbility!=nullptr) {messages.push_back({"$TARGET gains the ability to use "+stats.learnAbility->name+" "+((stats.learnAbility->grade!=0)?std::string(1,stats.learnAbility->grade):"")+"!",ItemAction::LEARNMOVE});} } }; #endif \ No newline at end of file diff --git a/main.cpp b/main.cpp index 096390a..6320ceb 100644 --- a/main.cpp +++ b/main.cpp @@ -141,13 +141,13 @@ public: int BATTLE_ROLLING_COUNTER_WAITTIME = 0; //Number of frames to wait for each rolling counter. int BATTLE_HIT_SCREENSHAKE = 0; //Amount of time the screen will rapidly shake as getting hit. bool ITEM_REQUIRES_EQUIPPING=false; - std::wstring EQUIP_$ITEM_DISPLAY=L" "; //Use this to change the $ITEM tag modifier for abilities. + std::string EQUIP_$ITEM_DISPLAY=" "; //Use this to change the $ITEM tag modifier for abilities. std::vector BATTLE_CUSTOM_MSGS; //Used for displaying additional information during battles. CustomItemMessage BATTLE_CURRENT_CUSTOM_MSG; int BATTLE_CUSTOM_MESSAGE_WAIT_TIME=0; Item*BATTLE_CUSTOM_ITEM; std::vector BATTLE_SPOILS_LIST; - std::wstring BATTLE_SPOILS_MESSAGE; + std::string BATTLE_SPOILS_MESSAGE; 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. @@ -156,6 +156,8 @@ public: int OVERWORLD_POWER_SELECTION_OFFSET[4]={0,0,0,0}; int OVERWORLD_GRADE_SELECTION_OFFSET=0; int OVERWORLD_POWER_SELECTION_MEMBER=0; + Battle::Move*OVERWORLD_SELECTED_POWER; + int OVERWORLD_TARGET_SELECTION=0; bool MOUSE_PRESSED_DOWN=false,MOUSE_DOWN=false,MOUSE_RELEASED=false; //TODO Implement Mouse things. @@ -723,28 +725,32 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), } if (DownPressed()||UpPressed()||LeftPressed()&&POWER_GRADE_CURSOR[-CURRENT_TURN-1]==0) { if (UpPressed()) { - if (POWER_SELECTION_CURSOR[-CURRENT_TURN-1]==0) { - POWER_SELECTION_CURSOR[-CURRENT_TURN-1]=(int)BATTLE_MOVELIST_DISPLAY.size()-1; - POWER_GRADE_CURSOR[-CURRENT_TURN-1]=std::clamp(POWER_GRADE_CURSOR[-CURRENT_TURN-1],0,(int)BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[-CURRENT_TURN-1]].size()-1); - POWER_SELECTION_OFFSET[-CURRENT_TURN-1]=std::clamp(POWER_SELECTION_CURSOR[-CURRENT_TURN-1]-3,0,(int)BATTLE_MOVELIST_DISPLAY.size()-1); - } else { - POWER_SELECTION_CURSOR[-CURRENT_TURN-1]=std::clamp(POWER_SELECTION_CURSOR[-CURRENT_TURN-1]-1,0,(int)BATTLE_MOVELIST_DISPLAY.size()-1); - POWER_GRADE_CURSOR[-CURRENT_TURN-1]=std::clamp(POWER_GRADE_CURSOR[-CURRENT_TURN-1],0,(int)BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[-CURRENT_TURN-1]].size()-1); - if (POWER_SELECTION_CURSOR[-CURRENT_TURN-1]1) { + if (POWER_SELECTION_CURSOR[-CURRENT_TURN-1]==0) { + POWER_SELECTION_CURSOR[-CURRENT_TURN-1]=(int)BATTLE_MOVELIST_DISPLAY.size()-1; + POWER_GRADE_CURSOR[-CURRENT_TURN-1]=std::clamp(POWER_GRADE_CURSOR[-CURRENT_TURN-1],0,(int)BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[-CURRENT_TURN-1]].size()-1); + POWER_SELECTION_OFFSET[-CURRENT_TURN-1]=std::clamp(POWER_SELECTION_CURSOR[-CURRENT_TURN-1]-3,0,(int)BATTLE_MOVELIST_DISPLAY.size()-1); + } else { + POWER_SELECTION_CURSOR[-CURRENT_TURN-1]=std::clamp(POWER_SELECTION_CURSOR[-CURRENT_TURN-1]-1,0,(int)BATTLE_MOVELIST_DISPLAY.size()-1); + POWER_GRADE_CURSOR[-CURRENT_TURN-1]=std::clamp(POWER_GRADE_CURSOR[-CURRENT_TURN-1],0,(int)BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[-CURRENT_TURN-1]].size()-1); + if (POWER_SELECTION_CURSOR[-CURRENT_TURN-1]=4) { - POWER_SELECTION_OFFSET[-CURRENT_TURN-1]++; + if (BATTLE_MOVELIST_DISPLAY.size()>1) { + if (POWER_SELECTION_CURSOR[-CURRENT_TURN-1]==(int)BATTLE_MOVELIST_DISPLAY.size()-1) { + POWER_GRADE_CURSOR[-CURRENT_TURN-1]=0; + POWER_SELECTION_CURSOR[-CURRENT_TURN-1]=0; + POWER_SELECTION_OFFSET[-CURRENT_TURN-1]=0; + } else { + POWER_SELECTION_CURSOR[-CURRENT_TURN-1]=std::clamp(POWER_SELECTION_CURSOR[-CURRENT_TURN-1]+1,0,(int)BATTLE_MOVELIST_DISPLAY.size()-1); + POWER_GRADE_CURSOR[-CURRENT_TURN-1]=std::clamp(POWER_GRADE_CURSOR[-CURRENT_TURN-1],0,(int)BATTLE_MOVELIST_DISPLAY[POWER_SELECTION_CURSOR[-CURRENT_TURN-1]].size()-1); + if (POWER_SELECTION_CURSOR[-CURRENT_TURN-1]-POWER_SELECTION_OFFSET[-CURRENT_TURN-1]>=4) { + POWER_SELECTION_OFFSET[-CURRENT_TURN-1]++; + } } } } else { @@ -949,7 +955,7 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), HandleInventoryNavigation(); } if (ACTIONKEYPRESSED) { - EQUIP_$ITEM_DISPLAY=transform_to(PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->name); + EQUIP_$ITEM_DISPLAY=PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->name; if (PARTY_INVENTORY[ITEM_SELECTION_CURSOR]->stats.equip==EquipSlot::WEAPON) { ITEM_REQUIRES_EQUIPPING=true; PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove=MOVELIST[BattleMoveName::BASH_CHANGE]; @@ -1055,7 +1061,11 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), case 1:{//Power is selected. OVERWORLD_POWER_SELECTION_MEMBER=0; PopulateBattleMoveList(OVERWORLD_POWER_SELECTION_MEMBER,true); - GAME_STATE=GameState::OVERWORLD_POWER_PLAYER_MENU; + if (PARTY_MEMBER_COUNT==1) { + GAME_STATE=GameState::OVERWORLD_POWER_MENU; + } else { + GAME_STATE=GameState::OVERWORLD_POWER_PLAYER_MENU; + } }break; case 2:{//Items is selected. @@ -1081,6 +1091,98 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), OVERWORLD_POWER_SELECTION_MEMBER=(OVERWORLD_POWER_SELECTION_MEMBER+1)%PARTY_MEMBER_COUNT; PopulateBattleMoveList(OVERWORLD_POWER_SELECTION_MEMBER,true); } + if (UpPressed()) { + GAME_STATE=GameState::OVERWORLD_MENU; + } + if (ACTIONKEYPRESSED) { + GAME_STATE=GameState::OVERWORLD_POWER_MENU; + } + }break; + case GameState::OVERWORLD_POWER_MENU:{ + if (CURRENT_TURN<0) { + if (DownPressed()) { + if (OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]==(int)BATTLE_MOVELIST_DISPLAY.size()-1) { + OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]=0; + OVERWORLD_POWER_SELECTION_OFFSET[OVERWORLD_POWER_SELECTION_MEMBER]=0; + } else { + OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]=std::clamp(OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]+1,0,(int)BATTLE_MOVELIST_DISPLAY.size()-1); + if (OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]-OVERWORLD_POWER_SELECTION_OFFSET[OVERWORLD_POWER_SELECTION_MEMBER]>=4) { + OVERWORLD_POWER_SELECTION_OFFSET[OVERWORLD_POWER_SELECTION_MEMBER]++; + } + } + } + if (UpPressed()) { + if (OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]==0) { + OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]=(int)BATTLE_MOVELIST_DISPLAY.size()-1; + OVERWORLD_POWER_SELECTION_OFFSET[OVERWORLD_POWER_SELECTION_MEMBER]=std::clamp(OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]-3,0,(int)BATTLE_MOVELIST_DISPLAY.size()-1); + } else { + OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]=std::clamp(OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]-1,0,(int)BATTLE_MOVELIST_DISPLAY.size()-1); + if (OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]1) { + if (OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]==0) { + OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]=(int)BATTLE_MOVELIST_DISPLAY.size()-1; + OVERWORLD_POWER_GRADE_CURSOR=std::clamp(OVERWORLD_POWER_GRADE_CURSOR,0,(int)BATTLE_MOVELIST_DISPLAY[OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]].size()-1); + POWER_SELECTION_OFFSET[OVERWORLD_POWER_SELECTION_MEMBER]=std::clamp(OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]-3,0,(int)BATTLE_MOVELIST_DISPLAY.size()-1); + } else { + OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]=std::clamp(OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]-1,0,(int)BATTLE_MOVELIST_DISPLAY.size()-1); + OVERWORLD_POWER_GRADE_CURSOR=std::clamp(OVERWORLD_POWER_GRADE_CURSOR,0,(int)BATTLE_MOVELIST_DISPLAY[OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]].size()-1); + if (OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]1) { + if (OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]==(int)BATTLE_MOVELIST_DISPLAY.size()-1) { + OVERWORLD_POWER_GRADE_CURSOR=0; + OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]=0; + POWER_SELECTION_OFFSET[OVERWORLD_POWER_SELECTION_MEMBER]=0; + } else { + OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]=std::clamp(OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]+1,0,(int)BATTLE_MOVELIST_DISPLAY.size()-1); + OVERWORLD_POWER_GRADE_CURSOR=std::clamp(OVERWORLD_POWER_GRADE_CURSOR,0,(int)BATTLE_MOVELIST_DISPLAY[OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]].size()-1); + if (OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]-POWER_SELECTION_OFFSET[OVERWORLD_POWER_SELECTION_MEMBER]>=4) { + POWER_SELECTION_OFFSET[OVERWORLD_POWER_SELECTION_MEMBER]++; + } + } + } + } else { + OVERWORLD_POWER_GRADE_CURSOR=0; + GAME_STATE=GameState::OVERWORLD_POWER_MENU; + } + } else + if (LeftPressed()) { + OVERWORLD_POWER_GRADE_CURSOR=std::clamp(OVERWORLD_POWER_GRADE_CURSOR-1,0,(int)(BATTLE_MOVELIST_DISPLAY[OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]].size())-1); + } + if (ACTIONKEYPRESSED) { + if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[OVERWORLD_POWER_SELECTION_MEMBER]]->GetPP()>=BATTLE_MOVELIST_DISPLAY[OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]][OVERWORLD_POWER_GRADE_CURSOR]->PPCost) { + PerformOverworldMove(BATTLE_MOVELIST_DISPLAY[OVERWORLD_POWER_SELECTION_CURSOR[OVERWORLD_POWER_SELECTION_MEMBER]][OVERWORLD_POWER_GRADE_CURSOR],OVERWORLD_POWER_SELECTION_MEMBER); + } + } + } }break; case GameState::EDITOR:{ if (IsTextEntryEnabled()) { @@ -1178,6 +1280,7 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), } void drawGame(){ + SetDrawTarget(layer::DYNAMIC); for (auto&obj:OBJECTS) { obj->drawn=false; } @@ -1209,7 +1312,8 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), case GameState::OVERWORLD_EQUIP_ITEM_MENU: case GameState::OVERWORLD_EQUIP_MENU: case GameState::OVERWORLD_EQUIP_PLAYER_MENU: - case GameState::OVERWORLD_STATUS_MENU:{ + case GameState::OVERWORLD_STATUS_MENU: + case GameState::OVERWORLD_TARGET_MENU:{ DrawGameWorld(); if (GAME_STATE!=GameState::GAME_WORLD) { SetDrawTarget(layer::INTERFACE); @@ -1330,6 +1434,24 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), } }break; } + if (BATTLE_ENCOUNTER!=nullptr&&BATTLE_STATE==BattleState::TARGET_SELECT||GAME_STATE==GameState::OVERWORLD_TARGET_MENU) { + SetDrawTarget(layer::GROUND); + if (SELECTED_TARGET<0||GAME_STATE==GameState::OVERWORLD_TARGET_MENU) { + int memberIndex = GAME_STATE==GameState::OVERWORLD_TARGET_MENU?OVERWORLD_TARGET_SELECTION:-SELECTED_TARGET-1; + Battle::Move*selectedMove=GameState::OVERWORLD_TARGET_MENU?OVERWORLD_SELECTED_POWER:PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove; + vd2d scale = {PARTY_MEMBER_OBJ[memberIndex]->spr->width/(double)SPRITES["targetCircle.png"]->sprite->width,PARTY_MEMBER_OBJ[memberIndex]->spr->spr->sprite->height/(double)SPRITES["targetCircle.png"]->sprite->height}; + vi2d size = {SPRITES["targetCircle.png"]->sprite->width,SPRITES["targetCircle.png"]->sprite->height}; + DrawDecal(PARTY_MEMBER_OBJ[memberIndex]->GetPosWithOrigin()-cameraPos-size/2*scale,SPRITES["targetCircle.png"],{static_cast(PARTY_MEMBER_OBJ[memberIndex]->spr->width/(double)SPRITES["targetCircle.png"]->sprite->width),static_cast(PARTY_MEMBER_OBJ[memberIndex]->spr->spr->sprite->height/(double)SPRITES["targetCircle.png"]->sprite->height)},GREEN); + if (BATTLE_STATE==BattleState::TARGET_SELECT) { + DrawTargetRangeGrid(PARTY_MEMBER_OBJ[memberIndex]->GetPosWithOrigin(),selectedMove->range); + } + } else { + vd2d scale = {BATTLE_ENCOUNTER->objs[SELECTED_TARGET]->obj->spr->width/(double)SPRITES["targetCircle.png"]->sprite->width,BATTLE_ENCOUNTER->objs[SELECTED_TARGET]->obj->spr->spr->sprite->height/(double)SPRITES["targetCircle.png"]->sprite->height}; + vi2d size = {SPRITES["targetCircle.png"]->sprite->width,SPRITES["targetCircle.png"]->sprite->height}; + DrawDecal(BATTLE_ENCOUNTER->objs[SELECTED_TARGET]->obj->GetPosWithOrigin()-cameraPos-size/2*scale,SPRITES["targetCircle.png"],scale,YELLOW); + DrawTargetRangeGrid(BATTLE_ENCOUNTER->objs[SELECTED_TARGET]->obj->GetPosWithOrigin(),PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->range); + } + } if (BATTLE_ENCOUNTER!=nullptr) { SetDrawTarget(layer::HIGH); if (BATTLE_STATE==BattleState::SELECT_ACTION||BATTLE_STATE==BattleState::POWER_SELECT||BATTLE_STATE==BattleState::GRADE_SELECT||BATTLE_STATE==BattleState::ITEM_SELECT) { @@ -1344,27 +1466,13 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), if (BATTLE_STATE==BattleState::POWER_SELECT||BATTLE_STATE==BattleState::GRADE_SELECT) { DrawBattleMoveList(-CURRENT_TURN-1); } - if (BATTLE_STATE==BattleState::TARGET_SELECT) { - SetDrawTarget(layer::GROUND); - if (SELECTED_TARGET<0) { - vd2d scale = {PARTY_MEMBER_OBJ[-SELECTED_TARGET-1]->spr->width/(double)SPRITES["targetCircle.png"]->sprite->width,PARTY_MEMBER_OBJ[-SELECTED_TARGET-1]->spr->spr->sprite->height/(double)SPRITES["targetCircle.png"]->sprite->height}; - vi2d size = {SPRITES["targetCircle.png"]->sprite->width,SPRITES["targetCircle.png"]->sprite->height}; - DrawDecal(PARTY_MEMBER_OBJ[-SELECTED_TARGET-1]->GetPosWithOrigin()-cameraPos-size/2*scale,SPRITES["targetCircle.png"],{static_cast(PARTY_MEMBER_OBJ[-SELECTED_TARGET-1]->spr->width/(double)SPRITES["targetCircle.png"]->sprite->width),static_cast(PARTY_MEMBER_OBJ[-SELECTED_TARGET-1]->spr->spr->sprite->height/(double)SPRITES["targetCircle.png"]->sprite->height)},GREEN); - DrawTargetRangeGrid(PARTY_MEMBER_OBJ[-SELECTED_TARGET-1]->GetPosWithOrigin(),PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->range); - } else { - vd2d scale = {BATTLE_ENCOUNTER->objs[SELECTED_TARGET]->obj->spr->width/(double)SPRITES["targetCircle.png"]->sprite->width,BATTLE_ENCOUNTER->objs[SELECTED_TARGET]->obj->spr->spr->sprite->height/(double)SPRITES["targetCircle.png"]->sprite->height}; - vi2d size = {SPRITES["targetCircle.png"]->sprite->width,SPRITES["targetCircle.png"]->sprite->height}; - DrawDecal(BATTLE_ENCOUNTER->objs[SELECTED_TARGET]->obj->GetPosWithOrigin()-cameraPos-size/2*scale,SPRITES["targetCircle.png"],scale,YELLOW); - DrawTargetRangeGrid(BATTLE_ENCOUNTER->objs[SELECTED_TARGET]->obj->GetPosWithOrigin(),PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->range); - } - } if (BATTLE_STATE==BattleState::WAIT_ANIMATION) { SetDrawTarget(layer::INTERFACE); vd2d text={2,2}; vd2d shadowOffset={1,1}; - std::wstring label; + std::string label; if (BATTLE_CURRENT_CUSTOM_MSG.s.length()>0) { - std::wstring baseStr = transform_to(BATTLE_CURRENT_CUSTOM_MSG.s); + std::string baseStr = BATTLE_CURRENT_CUSTOM_MSG.s; if (CURRENT_TURN<0) { label=ParseBattleMessage(PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]],baseStr); } else { @@ -1372,22 +1480,22 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), } } else { if (CURRENT_TURN<0) { - std::wstring baseStr = PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->attackMsg; + std::string baseStr = PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->attackMsg; label=ParseBattleMessage(PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]],baseStr); } else { - std::wstring baseStr = BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->attackMsg; + std::string baseStr = BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->attackMsg; label=ParseBattleMessage(BATTLE_ENCOUNTER->objs[CURRENT_TURN],baseStr); } } - DrawFancyStringDecal(text+shadowOffset,Wrap(label,ScreenWidth()-2,false,{1,2}),BLACK,{1,2}); - DrawFancyStringDecal(text,Wrap(label,ScreenWidth()-2,false,{1,2}),WHITE,{1,2}); + DrawStringDecal(text+shadowOffset,Wrap(label,ScreenWidth()-2,false,{1,2}),BLACK,{1,2}); + DrawStringDecal(text,Wrap(label,ScreenWidth()-2,false,{1,2}),WHITE,{1,2}); } if (BATTLE_STATE==BattleState::ENEMY_SPOILS) { SetDrawTarget(layer::INTERFACE); vd2d text={2,2}; vd2d shadowOffset={1,1}; - DrawFancyStringDecal(text+shadowOffset,Wrap(BATTLE_SPOILS_MESSAGE,ScreenWidth()-2,false,{1,2}),BLACK,{1,2}); - DrawFancyStringDecal(text,Wrap(BATTLE_SPOILS_MESSAGE,ScreenWidth()-2,false,{1,2}),WHITE,{1,2}); + DrawStringDecal(text+shadowOffset,Wrap(BATTLE_SPOILS_MESSAGE,ScreenWidth()-2,false,{1,2}),BLACK,{1,2}); + DrawStringDecal(text,Wrap(BATTLE_SPOILS_MESSAGE,ScreenWidth()-2,false,{1,2}),WHITE,{1,2}); } if (BATTLE_STATE!=BattleState::MOVE_CAMERA&&BATTLE_STATE!=BattleState::MOVE_CAMERA_BACK) { SetDrawTarget(layer::INTERFACE); @@ -1438,15 +1546,15 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), DrawDecal({(float)(box.x+4),(float)(box.y+5+8+2)},SPRITES["atbbar_front.png"]); if (member->selectedMove!=nullptr) { DrawPartialDecal({(float)(box.x+4),(float)(box.y+5+8+2)},SPRITES["atbbar_back.png"],{0,0},{(1-((float)member->channelTimeRemaining/member->selectedMove->channelTime))*SPRITES["atbbar_back.png"]->sprite->width,static_cast(SPRITES["atbbar_back.png"]->sprite->height)},{1,1},GREEN*0.7); - std::wstring label=transform_to(member->selectedMove->name); - label+=L" "; + std::string label=member->selectedMove->name; + label+=" "; if (member->selectedMove->grade!=0) { label+=member->selectedMove->grade; } - vd2d textOffset=GetTextSize(transform_to(label))*0.6; + vd2d textOffset=GetTextSize(label)*0.6; textOffset.y+=10; vd2d barPos = {(float)(box.x+4),(float)(box.y+5+8+2)}; - DrawFancyStringDecal(barPos-textOffset/2,label,BLACK,{std::min((float)54/GetTextSize(transform_to(label)).x,(float)1),0.6}); + DrawStringDecal(barPos-textOffset/2,label,BLACK,{std::min((float)54/GetTextSize(label).x,(float)1),0.6}); } const vi2d hpTextPos = {box.x+5,box.y+25}; for (int x=-1;x<=1;x++) { @@ -1475,16 +1583,16 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), vi2d barOffset={-SPRITES["atbbar_front.png"]->sprite->width/2,8}; DrawPartialDecal(obj->obj->GetPos()+obj->obj->originPoint-cameraPos+barOffset,SPRITES["atbbar_back.png"],{0,0},{(1-((float)obj->channelTimeRemaining/obj->selectedMove->channelTime))*SPRITES["atbbar_back.png"]->sprite->width,static_cast(SPRITES["atbbar_back.png"]->sprite->height)},{1,1},YELLOW*0.8); DrawDecal(obj->obj->GetPos()+obj->obj->originPoint-cameraPos+barOffset,SPRITES["atbbar_front.png"]); - std::wstring label=transform_to(obj->selectedMove->name); + std::string label=obj->selectedMove->name; if (obj->selectedMove->grade!=0) { - label+=L" "; + label+=" "; label+=obj->selectedMove->grade; } - vd2d textOffset=GetTextSize(transform_to(label))*0.6; + vd2d textOffset=GetTextSize(label)*0.6; textOffset.y-=6; vi2d shadowOffset = {1,1}; - DrawFancyStringDecal(obj->obj->GetPos()+obj->obj->originPoint-cameraPos+barOffset-textOffset/2+shadowOffset,label,BLACK,{0.6,0.6}); - DrawFancyStringDecal(obj->obj->GetPos()+obj->obj->originPoint-cameraPos+barOffset-textOffset/2,label,WHITE,{0.6,0.6}); + DrawStringDecal(obj->obj->GetPos()+obj->obj->originPoint-cameraPos+barOffset-textOffset/2+shadowOffset,label,BLACK,{0.6,0.6}); + DrawStringDecal(obj->obj->GetPos()+obj->obj->originPoint-cameraPos+barOffset-textOffset/2,label,WHITE,{0.6,0.6}); } } } @@ -1614,25 +1722,6 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), } } - void DrawFancyStringDecal(const olc::vf2d& pos, const std::wstring& sText, const Pixel col = olc::WHITE, const olc::vf2d& scale = { 1.0f, 1.0f }) { - vf2d newpos=pos; - for (int i=0;i=128) { - DrawPartialDecal(newpos,SPRITES["additionalFont.png"],additionalChars[sText[i]],{8,8},scale,col); - newpos.x+=8*scale.x; - } else - if (sText[i]!='\n') { - DrawStringDecal(newpos,std::string(1,sText[i]),col,scale); - newpos.x+=8*scale.x; - } else - if (sText[i]=='\n') { - DrawStringDecal(newpos,std::string(1,sText[i]),col,scale); - newpos.x=pos.x; - newpos.y+=8*scale.y; - } - } - } - void LoadMap(Map*map) { std::ifstream f("assets/maps/"+map->filename,std::ios::binary); std::ifstream f2("assets/maps/"+map->l2filename,std::ios::binary); @@ -1925,11 +2014,11 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), MOVELIST[BattleMoveName::TESTMOVE2]=new Battle::Move{"Test Move 2","An attack",baseDmg:40,randomDmg:10,PPCost:0,range:1,channelTime:0,friendly:false,composition:{0,0,0,0}}; MOVELIST[BattleMoveName::TESTMOVE3]=new Battle::Move{"Test Move 3","An attack",baseDmg:25,randomDmg:5,PPCost:0,range:3,channelTime:0,friendly:false,composition:{0,0,20,0}}; MOVELIST[BattleMoveName::BASH]=new Battle::Move{"Bash","Regular attack.",baseDmg:5,randomDmg:5,PPCost:0,range:1,channelTime:0,friendly:false,composition:{0,0,0,0}}; - MOVELIST[BattleMoveName::BASH_CHANGE]=new Battle::Move{MOVELIST[BattleMoveName::BASH]->name,"Regular attack.",baseDmg:MOVELIST[BattleMoveName::BASH]->baseDmg,randomDmg:MOVELIST[BattleMoveName::BASH]->randomDmg,PPCost:MOVELIST[BattleMoveName::BASH]->PPCost,range:MOVELIST[BattleMoveName::BASH]->range,composition:MOVELIST[BattleMoveName::BASH]->composition,attackMsg:L"$USER equipped the $ITEM instead and attacks.",eff:MOVELIST[BattleMoveName::BASH]->eff,pctDamage:MOVELIST[BattleMoveName::BASH]->pctDamage,properties:MOVELIST[BattleMoveName::BASH]->properties}; + MOVELIST[BattleMoveName::BASH_CHANGE]=new Battle::Move{MOVELIST[BattleMoveName::BASH]->name,"Regular attack.",baseDmg:MOVELIST[BattleMoveName::BASH]->baseDmg,randomDmg:MOVELIST[BattleMoveName::BASH]->randomDmg,PPCost:MOVELIST[BattleMoveName::BASH]->PPCost,range:MOVELIST[BattleMoveName::BASH]->range,composition:MOVELIST[BattleMoveName::BASH]->composition,attackMsg:"$USER equipped the $ITEM instead and attacks.",eff:MOVELIST[BattleMoveName::BASH]->eff,pctDamage:MOVELIST[BattleMoveName::BASH]->pctDamage,properties:MOVELIST[BattleMoveName::BASH]->properties}; MOVELIST[BattleMoveName::DEFEND]=new Battle::Move{"Defend","Defend.",baseDmg:0,randomDmg:0,PPCost:0,range:1,channelTime:5*60,friendly:true,{0,0,0,0}}; - MOVELIST[BattleMoveName::EQUIP_ARMOR]=new Battle::Move{"Equip Armor","Equip Armor.",baseDmg:0,randomDmg:0,PPCost:0,range:1,channelTime:0,friendly:true,composition:{0,0,0,0},L"$USER equips the $ITEM"}; - MOVELIST[BattleMoveName::CONSUMABLE]=new Battle::Move{"Consumable","Consumes an item.",baseDmg:0,randomDmg:0,PPCost:0,range:1,channelTime:0,friendly:true,composition:{0,0,0,0},L"$USER uses $ITEM on $TARGET"}; - MOVELIST[BattleMoveName::CONSUMABLE_ENEMY]=new Battle::Move{"Consumable","Consumes an item.",baseDmg:0,randomDmg:0,PPCost:0,range:1,channelTime:0,friendly:false,composition:{0,0,0,0},L"$USER uses $ITEM on $TARGET"}; + MOVELIST[BattleMoveName::EQUIP_ARMOR]=new Battle::Move{"Equip Armor","Equip Armor.",baseDmg:0,randomDmg:0,PPCost:0,range:1,channelTime:0,friendly:true,composition:{0,0,0,0},"$USER equips the $ITEM"}; + MOVELIST[BattleMoveName::CONSUMABLE]=new Battle::Move{"Consumable","Consumes an item.",baseDmg:0,randomDmg:0,PPCost:0,range:1,channelTime:0,friendly:true,composition:{0,0,0,0},"$USER uses $ITEM on $TARGET"}; + MOVELIST[BattleMoveName::CONSUMABLE_ENEMY]=new Battle::Move{"Consumable","Consumes an item.",baseDmg:0,randomDmg:0,PPCost:0,range:1,channelTime:0,friendly:false,composition:{0,0,0,0},"$USER uses $ITEM on $TARGET"}; MOVELIST[BattleMoveName::HAILSTORM_A]=new Battle::Move{"Hailstorm","Causes heavy ice rocks to crash",ALPHA,baseDmg:40,randomDmg:20,PPCost:4,range:4,channelTime:0,friendly:false,composition:{0,0,20,0}}; MOVELIST[BattleMoveName::HAILSTORM_B]=new Battle::Move{"Hailstorm","Causes heavy ice rocks to crash",BETA,baseDmg:80,randomDmg:20,PPCost:12,range:4,channelTime:0,friendly:false,composition:{0,0,20,0}}; MOVELIST[BattleMoveName::HAILSTORM_G]=new Battle::Move{"Hailstorm","Causes heavy ice rocks to crash",GAMMA,baseDmg:120,randomDmg:20,PPCost:28,range:4,channelTime:0,friendly:false,composition:{0,0,20,0}}; @@ -1954,15 +2043,15 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), MOVELIST[BattleMoveName::PKLIFEUP_B]=new Battle::Move{"PK Lifeup","Restores a moderate amount of health.",BETA,baseDmg:240,randomDmg:60,PPCost:9,range:1,channelTime:0,friendly:true,composition:{0,0,20,0},overworld:true}; MOVELIST[BattleMoveName::PKLIFEUP_G]=new Battle::Move{"PK Lifeup","Restores a large amount of health.",GAMMA,baseDmg:400,randomDmg:50,PPCost:21,range:3,channelTime:0,friendly:true,composition:{0,0,20,0},overworld:true}; MOVELIST[BattleMoveName::PKLIFEUP_O]=new Battle::Move{"PK Lifeup","Restores a great amount of health to all allies.",OMEGA,baseDmg:800,randomDmg:100,PPCost:64,range:6,channelTime:0,friendly:true,composition:{0,0,20,0},overworld:true}; - MOVELIST[BattleMoveName::PKFUN_A]=new Battle::Move{"PK Fun","A very fun barrage. Hits for large damage.",ALPHA,baseDmg:100,randomDmg:10,PPCost:15,range:6,channelTime:0,friendly:false,composition:{0,0,20,0},L"$USER uses $POWER",FOUNTAIN_EFFECT}; - MOVELIST[BattleMoveName::PKFUN_B]=new Battle::Move{"PK Fun","A very fun barrage. Hits for large damage.",BETA,baseDmg:240,randomDmg:40,PPCost:30,range:6,channelTime:0,friendly:false,composition:{0,0,20,0},L"$USER uses $POWER",FOUNTAIN_EFFECT}; - MOVELIST[BattleMoveName::PKFUN_G]=new Battle::Move{"PK Fun","A very fun barrage. Hits for large damage.",GAMMA,baseDmg:360,randomDmg:80,PPCost:45,range:7,channelTime:0,friendly:false,composition:{0,0,20,0},L"$USER uses $POWER",FOUNTAIN_EFFECT}; - MOVELIST[BattleMoveName::PKFUN_O]=new Battle::Move{"PK Fun","A very fun barrage. Hits for large damage.",OMEGA,baseDmg:590,randomDmg:100,PPCost:90,range:8,channelTime:0,friendly:false,composition:{0,0,20,0},L"$USER uses $POWER",FOUNTAIN_EFFECT}; + MOVELIST[BattleMoveName::PKFUN_A]=new Battle::Move{"PK Fun","A very fun barrage. Hits for large damage.",ALPHA,baseDmg:100,randomDmg:10,PPCost:15,range:6,channelTime:0,friendly:false,composition:{0,0,20,0},"$USER uses $POWER",FOUNTAIN_EFFECT}; + MOVELIST[BattleMoveName::PKFUN_B]=new Battle::Move{"PK Fun","A very fun barrage. Hits for large damage.",BETA,baseDmg:240,randomDmg:40,PPCost:30,range:6,channelTime:0,friendly:false,composition:{0,0,20,0},"$USER uses $POWER",FOUNTAIN_EFFECT}; + MOVELIST[BattleMoveName::PKFUN_G]=new Battle::Move{"PK Fun","A very fun barrage. Hits for large damage.",GAMMA,baseDmg:360,randomDmg:80,PPCost:45,range:7,channelTime:0,friendly:false,composition:{0,0,20,0},"$USER uses $POWER",FOUNTAIN_EFFECT}; + MOVELIST[BattleMoveName::PKFUN_O]=new Battle::Move{"PK Fun","A very fun barrage. Hits for large damage.",OMEGA,baseDmg:590,randomDmg:100,PPCost:90,range:8,channelTime:0,friendly:false,composition:{0,0,20,0},"$USER uses $POWER",FOUNTAIN_EFFECT}; MOVELIST[BattleMoveName::PKFIRE_A]=new Battle::Move{"PK Fire","Causes extreme heat to burn foes and scorch trees",ALPHA,baseDmg:60,randomDmg:20,PPCost:6,range:3,channelTime:0,friendly:false,composition:{0,0,20,0}}; MOVELIST[BattleMoveName::PKFIRE_B]=new Battle::Move{"PK Fire","Causes extreme heat to burn foes and scorch trees",BETA,baseDmg:120,randomDmg:40,PPCost:12,range:4,channelTime:0,friendly:false,composition:{0,0,20,0}}; MOVELIST[BattleMoveName::PKFIRE_G]=new Battle::Move{"PK Fire","Causes extreme heat to burn foes and scorch trees",GAMMA,baseDmg:190,randomDmg:50,PPCost:20,range:5,channelTime:0,friendly:false,composition:{0,0,20,0}}; - MOVELIST[BattleMoveName::PKFIRE_O]=new Battle::Move{"PK Fire","Causes extreme heat to burn foes and scorch trees",OMEGA,baseDmg:360,randomDmg:100,PPCost:32,range:7,channelTime:0,friendly:false,composition:{0,0,20,0},L"$USER uses $POWER",FIREFOUNTAIN_EFFECT}; - MOVELIST[BattleMoveName::FREEZE_PACKET]=new Battle::Move{"Freeze Packet","",baseDmg:120,randomDmg:20,PPCost:0,range:1,channelTime:0,friendly:false,composition:{0,0,0,0},L"$USER uses the $POWER"}; + MOVELIST[BattleMoveName::PKFIRE_O]=new Battle::Move{"PK Fire","Causes extreme heat to burn foes and scorch trees",OMEGA,baseDmg:360,randomDmg:100,PPCost:32,range:7,channelTime:0,friendly:false,composition:{0,0,20,0},"$USER uses $POWER",FIREFOUNTAIN_EFFECT}; + MOVELIST[BattleMoveName::FREEZE_PACKET]=new Battle::Move{"Freeze Packet","",baseDmg:120,randomDmg:20,PPCost:0,range:1,channelTime:0,friendly:false,composition:{0,0,0,0},"$USER uses the $POWER"}; } void SetupItemList() { //hpRecovery,ppRecovery,attack,dmgReduction,equip,important,consumable @@ -2571,12 +2660,8 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), } std::string Wrap(std::string str,int width,bool proportional,vd2d scale) { - return transform_to(Wrap(transform_to(str),width,proportional,scale)); - } - - std::wstring Wrap(std::wstring str,int width,bool proportional,vd2d scale) { int marker=0; - std::wstring newStr=L""; + std::string newStr=""; bool firstChar=false; while (marker(newStr)).x*scale.x,GetTextSizeProp(transform_to(newStr)).y*scale.y}; + siz={GetTextSizeProp(newStr).x*scale.x,GetTextSizeProp(newStr).y*scale.y}; } else { - siz={GetTextSize(transform_to(newStr)).x*scale.x,GetTextSize(transform_to(newStr)).y*scale.y}; + siz={GetTextSize(newStr).x*scale.x,GetTextSize(newStr).y*scale.y}; } if (siz.x>width) { do { @@ -2705,7 +2790,7 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), } } if (!done) { - for (int i=0;i<4;i++) { + for (int i=0;iGetHP()>0) { if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->selectedMove==nullptr) { if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->atb>=1000) { @@ -2826,7 +2911,7 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), if (!moveLearned) { target->moveSet.push_back(BATTLE_CUSTOM_ITEM->stats.learnAbility); } else { - BATTLE_CURRENT_CUSTOM_MSG.s=L"Failed to learn "+transform_to(BATTLE_CUSTOM_ITEM->stats.learnAbility->name); + BATTLE_CURRENT_CUSTOM_MSG.s="Failed to learn "+BATTLE_CUSTOM_ITEM->stats.learnAbility->name; } }break; } @@ -2963,7 +3048,7 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), BATTLE_CUSTOM_MSGS.clear(); BATTLE_CURRENT_CUSTOM_MSG={}; BATTLE_ANIMATION_TIMER=0; - BATTLE_SPOILS_MESSAGE=L""; + BATTLE_SPOILS_MESSAGE=""; } }break; case BattleState::ENEMY_SPOILS:{ @@ -2979,7 +3064,7 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), } if (BATTLE_ANIMATION_TIMER%90==0) { if (BATTLE_SPOILS_LIST.size()>0) { - BATTLE_SPOILS_MESSAGE=L"You obtained a"; + BATTLE_SPOILS_MESSAGE="You obtained a"; BATTLE_SPOILS_MESSAGE+=(( BATTLE_SPOILS_LIST[0]->name[0]=='a'|| BATTLE_SPOILS_LIST[0]->name[0]=='e'|| @@ -2991,8 +3076,8 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), BATTLE_SPOILS_LIST[0]->name[0]=='I'|| BATTLE_SPOILS_LIST[0]->name[0]=='O'|| BATTLE_SPOILS_LIST[0]->name[0]=='U' - )?L"n ":L" "); - BATTLE_SPOILS_MESSAGE+=transform_to(BATTLE_SPOILS_LIST[0]->name)+L"."; + )?"n ":" "); + BATTLE_SPOILS_MESSAGE+=BATTLE_SPOILS_LIST[0]->name+"."; PARTY_INVENTORY.push_back(BATTLE_SPOILS_LIST[0]); BATTLE_SPOILS_LIST.erase(BATTLE_SPOILS_LIST.begin()); } else { @@ -3589,20 +3674,20 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), } } - std::wstring ParseBattleMessage(Entity*ent,std::wstring baseStr) { - std::wstring label=L""; + std::string ParseBattleMessage(Entity*ent,std::string baseStr) { + std::string label=""; label=baseStr; - if (label.find(L"$USER")!=std::string::npos) { - label=label.replace(label.find(L"$USER"),5,transform_to(ent->obj->name)); + if (label.find("$USER")!=std::string::npos) { + label=label.replace(label.find("$USER"),5,ent->obj->name); } - if (label.find(L"$POWER")!=std::string::npos) { - label=label.replace(label.find(L"$POWER"),6,transform_to(ent->selectedMove->name)+L" "+((ent->selectedMove->grade!=0)?std::wstring(1,ent->selectedMove->grade):L"")); + if (label.find("$POWER")!=std::string::npos) { + label=label.replace(label.find("$POWER"),6,ent->selectedMove->name+" "+((ent->selectedMove->grade!=0)?std::string(1,ent->selectedMove->grade):"")); } - if (label.find(L"$ITEM")!=std::string::npos) { - label=label.replace(label.find(L"$ITEM"),5,EQUIP_$ITEM_DISPLAY); + if (label.find("$ITEM")!=std::string::npos) { + label=label.replace(label.find("$ITEM"),5,EQUIP_$ITEM_DISPLAY); } - if (label.find(L"$TARGET")!=std::string::npos) { - label=label.replace(label.find(L"$TARGET"),7,transform_to(GetTargetName(ent->selectedTarget))); + if (label.find("$TARGET")!=std::string::npos) { + label=label.replace(label.find("$TARGET"),7,GetTargetName(ent->selectedTarget)); } return label; } @@ -3737,16 +3822,20 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), drawCol=RED; } } - DrawFancyStringDecal({static_cast(8+WIDTH/4+12+i*8),static_cast(12*counter+8+displayYOffset)},std::wstring(1,moves[i]->grade),drawCol); + DrawStringDecal({static_cast(8+WIDTH/4+12+i*8),static_cast(12*counter+8+displayYOffset)},std::string(1,moves[i]->grade),drawCol); } } ++counter; } if (BATTLE_ENCOUNTER==nullptr) { vi2d textSize = GetTextSizeProp(PARTY_MEMBER_STATS[PARTY_MEMBER_ID[partyMemberSlot]]->obj->name)/2; - DrawStringPropDecal({(float)WIDTH/2.F-textSize.x-6,1},PARTY_MEMBER_STATS[PARTY_MEMBER_ID[partyMemberSlot]]->obj->name,WHITE,{0.5,1}); - DrawRotatedDecal({(float)WIDTH/2-textSize.x-8,5},SPRITES["cursor.png"],M_PI,{(float)SPRITES["cursor.png"]->sprite->width/2,(float)SPRITES["cursor.png"]->sprite->height/2},{(sinf(frameCount/20.F*M_PI)>0)?0.5F:0.25F,(sinf(frameCount/20.F*M_PI)>0)?0.5F:0.25F}); - DrawRotatedDecal({(float)WIDTH/2-4,5},SPRITES["cursor.png"],0,{(float)SPRITES["cursor.png"]->sprite->width/2,(float)SPRITES["cursor.png"]->sprite->height/2},{(sinf(frameCount/20.F*M_PI)>0)?0.5F:0.25F,(sinf(frameCount/20.F*M_PI)>0)?0.5F:0.25F}); + if (PARTY_MEMBER_COUNT>1) { + DrawStringPropDecal({(float)WIDTH/2.F-textSize.x-6,1},PARTY_MEMBER_STATS[PARTY_MEMBER_ID[partyMemberSlot]]->obj->name,WHITE,{0.5,1}); + if (GAME_STATE==GameState::OVERWORLD_POWER_PLAYER_MENU) { + DrawRotatedDecal({(float)WIDTH/2-textSize.x-8,5},SPRITES["cursor.png"],M_PI,{(float)SPRITES["cursor.png"]->sprite->width/2,(float)SPRITES["cursor.png"]->sprite->height/2},{(sinf(frameCount/10.F*M_PI)>0)?0.5F:0.25F,(sinf(frameCount/10.F*M_PI)>0)?0.5F:0.25F}); + DrawRotatedDecal({(float)WIDTH/2-4,5},SPRITES["cursor.png"],0,{(float)SPRITES["cursor.png"]->sprite->width/2,(float)SPRITES["cursor.png"]->sprite->height/2},{(sinf(frameCount/10.F*M_PI)>0)?0.5F:0.25F,(sinf(frameCount/10.F*M_PI)>0)?0.5F:0.25F}); + } + } } if (BATTLE_STATE==BattleState::POWER_SELECT||GAME_STATE==GameState::OVERWORLD_POWER_MENU) { DrawDecal({4,static_cast(12*(selectioncursor-powerselectionoffset)+8)},SPRITES["cursor.png"]); @@ -3763,6 +3852,20 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), } } } + + void PerformOverworldMove(Battle::Move*move,int partyMemberSlot) { + OVERWORLD_SELECTED_POWER=move; + OVERWORLD_TARGET_SELECTION=0; + if (move->name=="PK Lifeup") { + if (move->range==1) { + GAME_STATE=GameState::OVERWORLD_TARGET_MENU; + } else { + //DisplayMessageBox(PARTY_MEMBER_OBJ[partyMemberSlot]->name+" begins to cast "+move->name+" "+); + //DisplayMessageBox() + } + } else { + } + } }; int main() diff --git a/pixelGameEngine.h b/pixelGameEngine.h index 368ebc3..92ea242 100644 --- a/pixelGameEngine.h +++ b/pixelGameEngine.h @@ -3575,52 +3575,17 @@ namespace olc void PixelGameEngine::olc_ConstructFontSheet() { - std::string data; - data += "?Q`0001oOch0o01o@F40o000000000"; - data += "O000000nOT0063Qo4d8>?7a14Gno94AA4gno94AaOT0>o3`oO400o7QN00000400"; - data += "Of80001oOg<7O7moBGT7O7lABET024@aBEd714AiOdl717a_=TH013Q>00000000"; - data += "720D000V?V5oB3Q_HdUoE7a9@DdDE4A9@DmoE4A;Hg]oM4Aj8S4D84@`00000000"; - data += "OaPT1000Oa`^13P1@AI[?g`1@A=[OdAoHgljA4Ao?WlBA7l1710007l100000000"; - data += "ObM6000oOfMV?3QoBDD`O7a0BDDH@5A0BDD<@5A0BGeVO5ao@CQR?5Po00000000"; - data += "Oc``000?Ogij70PO2D]??0Ph2DUM@7i`2DTg@7lh2GUj?0TO0C1870T?00000000"; - data += "70<4001o?P<7?1QoHg43O;`h@GT0@:@LB@d0>:@hN@L0@?aoN@<0O7ao0000?000"; - data += "OcH0001SOglLA7mg24TnK7ln24US>0PL24U140PnOgl0>7QgOcH0K71S0000A000"; - data += "00H00000@Dm1S007@DUSg00?OdTnH7YhOfTL<7Yh@Cl0700?@Ah0300700000000"; - data += "<008001QL00ZA41a@6HnI<1i@FHLM81M@@0LG81?O`0nC?Y7?`0ZA7Y300080000"; - data += "O`082000Oh0827mo6>Hn?Wmo?6HnMb11MP08@C11H`08@FP0@@0004@000000000"; - data += "00P00001Oab00003OcKP0006@6=PMgl<@440MglH@000000`@000001P00000000"; - data += "Ob@8@@00Ob@8@Ga13R@8Mga172@8?PAo3R@827QoOb@820@0O`0007`0000007P0"; - data += "O`000P08Od400g`<3V=P0G`673IP0`@3>1`00P@6O`P00g`SetPixel(px, py, olc::Pixel(k, k, k, k)); - if (++py == 48) { px++; py = 0; } - } - } - - fontRenderable.Decal()->Update(); + fontRenderable.Load("assets/newFont.png"); - constexpr std::array vSpacing = { { + constexpr std::array vSpacing = { { + //X position (0-3) offset to display char + //Y position (0-15) width of the char to display 0x03,0x25,0x16,0x08,0x07,0x08,0x08,0x04,0x15,0x15,0x08,0x07,0x15,0x07,0x24,0x08, 0x08,0x17,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x24,0x15,0x06,0x07,0x16,0x17, 0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x08,0x17,0x08,0x08,0x17,0x08,0x08,0x08, 0x08,0x08,0x08,0x08,0x17,0x08,0x08,0x08,0x08,0x17,0x08,0x15,0x08,0x15,0x08,0x08, - 0x24,0x18,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x33,0x17,0x17,0x33,0x18,0x17,0x17, - 0x17,0x17,0x17,0x17,0x07,0x17,0x17,0x18,0x18,0x17,0x17,0x07,0x33,0x07,0x08,0x00, } }; + 0x27,0x18,0x17,0x17,0x17,0x17,0x17,0x17,0x17,0x33,0x17,0x17,0x33,0x18,0x17,0x17, + 0x17,0x17,0x17,0x17,0x07,0x17,0x17,0x18,0x18,0x17,0x17,0x36,0x27,0x36,0x18,0x36, } }; for (auto c : vSpacing) vFontSpacing.push_back({ c >> 4, c & 15 }); diff --git a/states.h b/states.h index 0d673a4..b4dc715 100644 --- a/states.h +++ b/states.h @@ -16,6 +16,7 @@ namespace GameState{ OVERWORLD_EQUIP_MENU, OVERWORLD_EQUIP_PLAYER_MENU, OVERWORLD_STATUS_MENU, + OVERWORLD_TARGET_MENU, }; }