diff --git a/SeasonsOfLoneliness.cpp b/SeasonsOfLoneliness.cpp index 8fb0dcf..da5cd3a 100644 --- a/SeasonsOfLoneliness.cpp +++ b/SeasonsOfLoneliness.cpp @@ -29,6 +29,7 @@ namespace battle{ NONE, WAITING_FOR_CAMERA, PLAYER_SELECTION, + PLAYER_TARGET_SELECTION, ENEMY_SELECTION, MOVE_RESOLUTION, PERFORM_TURN, @@ -225,12 +226,13 @@ public: std::vector availablePowers; WEATHER_POWER*BATTLE_CARD_SELECTION=HAILSTORM; int BATTLE_CARD_SELECTION_IND=0; + int PLAYER_SELECTED_TARGET=-1; Decal*DOME_DECAL,*FOOD_METER_DECAL,*OXYGEN_METER_DECAL,*PLANT_DECAL, *PLAYER_DECAL, *WEATHERNODE_EFFECT_DECAL,*POWER_HAILSTORM_DECAL,*POWER_HURRICANE_DECAL,*POWER_METEOR_SHOWER_DECAL,*POWER_METEOR_STORM_DECAL,*POWER_SNOWSTORM_DECAL, - *SPIDEY_DECAL; + *SPIDEY_DECAL,*TARGETING_CIRCLE,*TARGETING_RANGE_CIRCLE; std::map BASE_OBJECTS; std::vector ENCOUNTERS; Encounter ENCOUNTER_SPIDEY_1; @@ -255,6 +257,8 @@ public: POWER_METEOR_STORM_DECAL=new Decal(new Sprite("assets/meteor_storm.png")); POWER_SNOWSTORM_DECAL=new Decal(new Sprite("assets/snowstorm_icon.png")); SPIDEY_DECAL=new Decal(new Sprite("assets/spidey.png")); + TARGETING_CIRCLE=new Decal(new Sprite("assets/targetCircle.png")); + TARGETING_RANGE_CIRCLE=new Decal(new Sprite("assets/targetRange.png")); current_playerAnim.spr=PLAYER_DECAL; playerAnim.spr=PLAYER_DECAL; @@ -380,6 +384,20 @@ public: } }break; } + switch (BATTLE_STATE) { + case battle::PLAYER_SELECTION:{ + BATTLE_STATE=battle::PLAYER_TARGET_SELECTION; + if (PLAYER_SELECTED_TARGET==-1||CURRENT_ENCOUNTER.entities[PLAYER_SELECTED_TARGET].hp<=0) { + for (int i=0;i0) { + PLAYER_SELECTED_TARGET=i; + break; + } + } + } + }break; + } } bool OnUserUpdate(float fElapsedTime) override @@ -437,6 +455,26 @@ public: BATTLE_CARD_SELECTION=availablePowers[BATTLE_CARD_SELECTION_IND]; } }break; + case battle::PLAYER_TARGET_SELECTION:{ + if (GetKey(D).bPressed||GetKey(RIGHT).bPressed||GetKey(NP6).bPressed||GetKey(W).bReleased||GetKey(UP).bReleased||GetKey(NP8).bReleased) { + while (true) { + PLAYER_SELECTED_TARGET=(PLAYER_SELECTED_TARGET+1)%CURRENT_ENCOUNTER.entities.size(); + if (CURRENT_ENCOUNTER.entities[PLAYER_SELECTED_TARGET].hp>0) { + break; + } + } + } + if (GetKey(A).bPressed||GetKey(LEFT).bPressed||GetKey(NP4).bPressed||GetKey(S).bReleased||GetKey(DOWN).bReleased||GetKey(NP5).bReleased||GetKey(NP2).bReleased) { + while (true) { + if (--PLAYER_SELECTED_TARGET<0) { + PLAYER_SELECTED_TARGET=CURRENT_ENCOUNTER.entities.size()-1; + } + if (CURRENT_ENCOUNTER.entities[PLAYER_SELECTED_TARGET].hp>0) { + break; + } + } + } + }break; } } drawGame(); @@ -623,6 +661,7 @@ public: } BATTLE_CARD_SELECTION_IND=0; BATTLE_CARD_SELECTION=availablePowers[BATTLE_CARD_SELECTION_IND]; + PLAYER_SELECTED_TARGET=-1; } } } @@ -841,6 +880,12 @@ public: DrawCard(availablePowers[(BATTLE_CARD_SELECTION_IND-1<0)?availablePowers.size()-1:BATTLE_CARD_SELECTION_IND-1],{-96,32},{0.7,0.7},0.4); DrawCard(BATTLE_CARD_SELECTION); }break; + case battle::PLAYER_TARGET_SELECTION:{ + if (PLAYER_SELECTED_TARGET>=0) { + DrawWrappedText({5,5},"Target "+CURRENT_ENCOUNTER.entities[PLAYER_SELECTED_TARGET].name+" "+(char)('A'+PLAYER_SELECTED_TARGET)+" with "+BATTLE_CARD_SELECTION->name,WIDTH-8,BLACK,{2,2}); + DrawWrappedText({4,4},"Target "+CURRENT_ENCOUNTER.entities[PLAYER_SELECTED_TARGET].name+" "+(char)('A'+PLAYER_SELECTED_TARGET)+" with "+BATTLE_CARD_SELECTION->name,WIDTH-8,WHITE,{2,2}); + } + }break; } if (messageBoxVisible) { DrawDialogBox({4,HEIGHT-60},{WIDTH/2,16},Pixel(18, 0, 33,180)); @@ -895,8 +940,18 @@ public: } } for (auto&enc:ENCOUNTERS) { + int targetX=-1,targetY=-1; for (auto&ent:enc.entities) { - DrawDecal({(enc.x+ent.x-PLAYER_COORDS[0])*32+WIDTH/2,(enc.y+ent.y-PLAYER_COORDS[1])*32+HEIGHT/2},ent.spr); + if (PLAYER_SELECTED_TARGET>=0&&CURRENT_ENCOUNTER.entities[PLAYER_SELECTED_TARGET].hp>0&&CURRENT_ENCOUNTER.entities[PLAYER_SELECTED_TARGET].x==ent.x&&CURRENT_ENCOUNTER.entities[PLAYER_SELECTED_TARGET].y==ent.y) { + DrawDecal({(enc.x+ent.x-PLAYER_COORDS[0])*32+WIDTH/2,(enc.y+ent.y-PLAYER_COORDS[1])*32+HEIGHT/2},TARGETING_CIRCLE,{ent.spr->sprite->width/32,ent.spr->sprite->height/32},{255,210,0,255}); + DrawDecal({(enc.x+ent.x-PLAYER_COORDS[0])*32+WIDTH/2,(enc.y+ent.y-PLAYER_COORDS[1])*32+HEIGHT/2},ent.spr,{1,1},{(0.5*(float)sin(frameCount*4/60.0)+0.5)*80+175,(0.5*(float)sin(frameCount*4/60.0)+0.5)*80+175,(0.5*(float)sin(frameCount*4/60.0)+0.5)*80+175,255}); + targetX=ent.x;targetY=ent.y; + } else { + DrawDecal({(enc.x+ent.x-PLAYER_COORDS[0])*32+WIDTH/2,(enc.y+ent.y-PLAYER_COORDS[1])*32+HEIGHT/2},ent.spr); + } + } + if (targetX!=-1&&targetY!=-1) { + DrawDecal({(enc.x+targetX-PLAYER_COORDS[0])*32+WIDTH/2-BATTLE_CARD_SELECTION->range+16,(enc.y+targetY-PLAYER_COORDS[1])*32+HEIGHT/2-BATTLE_CARD_SELECTION->range+16},TARGETING_RANGE_CIRCLE,{BATTLE_CARD_SELECTION->range*2/32.0,BATTLE_CARD_SELECTION->range*2/32.0},{255,60,0,(0.5*(float)sin(frameCount*4/60.0)+0.5)*100}); } } } @@ -1040,6 +1095,27 @@ public: PLAYER_COORDS[1]>=obj.y&&PLAYER_COORDS[1]<=obj.y+HEIGHT/32; } + void DrawWrappedText(vf2d pos,std::string text,int targetWidth,Pixel col,vf2d scale) { + std::string wrappedText; + int marker=0; + while (markertargetWidth) { + int tempMarker=marker; + while (wrappedText[tempMarker]!=' ') { + wrappedText.erase(tempMarker--); + } + wrappedText.erase(tempMarker++); + wrappedText+='\n'; + while (tempMarker