generated from sigonasr2/CPlusPlusProjectTemplate
Display target ring and target selection
Co-authored-by: sigonasr2 <sigonasr2@gmail.com>
This commit is contained in:
parent
c477fe0729
commit
4da99d3a97
@ -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<WEATHER_POWER*> 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<std::string,ObjectLoadInfo*> BASE_OBJECTS;
|
||||
std::vector<Encounter> 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;i<CURRENT_ENCOUNTER.entities.size();i++) {
|
||||
Entity ent = CURRENT_ENCOUNTER.entities[i];
|
||||
if (!ent.ally&&ent.hp>0) {
|
||||
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,10 +940,20 @@ public:
|
||||
}
|
||||
}
|
||||
for (auto&enc:ENCOUNTERS) {
|
||||
int targetX=-1,targetY=-1;
|
||||
for (auto&ent:enc.entities) {
|
||||
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});
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int getPlantId(int x, int y) {
|
||||
@ -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 (marker<text.length()) {
|
||||
wrappedText+=text[marker];
|
||||
if (GetTextSize(wrappedText).x*scale.x>targetWidth) {
|
||||
int tempMarker=marker;
|
||||
while (wrappedText[tempMarker]!=' ') {
|
||||
wrappedText.erase(tempMarker--);
|
||||
}
|
||||
wrappedText.erase(tempMarker++);
|
||||
wrappedText+='\n';
|
||||
while (tempMarker<marker+1) {
|
||||
wrappedText+=text[tempMarker++];
|
||||
}
|
||||
}
|
||||
marker++;
|
||||
}
|
||||
DrawStringDecal(pos,wrappedText,col,scale);
|
||||
}
|
||||
|
||||
void DrawWrappedPropText(vf2d pos,std::string text,int targetWidth,Pixel col,vf2d scale) {
|
||||
std::string wrappedText;
|
||||
int marker=0;
|
||||
|
Binary file not shown.
BIN
assets/targetCircle.png
Normal file
BIN
assets/targetCircle.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 4.9 KiB |
BIN
assets/targetRange.png
Normal file
BIN
assets/targetRange.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 776 B |
Loading…
x
Reference in New Issue
Block a user