|
|
|
@ -1358,6 +1358,95 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), |
|
|
|
|
DrawMovementGrid(YELLOW,BLUE,BLUE); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (BATTLE_ENCOUNTER!=nullptr&&BATTLE_STATE!=BattleState::MOVE_CAMERA&&BATTLE_STATE!=BattleState::MOVE_CAMERA_BACK||OverworldMenuOpen()&&GAME_STATE!=GameState::OVERWORLD_TARGET_MENU) { |
|
|
|
|
SetDrawTarget(layer::INTERFACE); |
|
|
|
|
vi2d screenShakeOffset = {0,0}; |
|
|
|
|
if (BATTLE_ENCOUNTER!=nullptr) { |
|
|
|
|
cameraPos = BATTLE_ENCOUNTER->pos; |
|
|
|
|
if (BATTLE_HIT_SCREENSHAKE>0) { |
|
|
|
|
BATTLE_HIT_SCREENSHAKE--; |
|
|
|
|
if (BATTLE_HIT_SCREENSHAKE%2==0) { |
|
|
|
|
screenShakeOffset = {0,2}; |
|
|
|
|
} else { |
|
|
|
|
screenShakeOffset = {0,-2}; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
cameraPos+=screenShakeOffset; |
|
|
|
|
} |
|
|
|
|
for (int i=0;i<PARTY_MEMBER_COUNT;i++) { |
|
|
|
|
int boxAlpha=BATTLE_STATE==BattleState::TARGET_SELECT?64:255; |
|
|
|
|
Entity*member=PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]; |
|
|
|
|
Object*obj=PARTY_MEMBER_OBJ[i]; |
|
|
|
|
vi2d box = {(128-32*PARTY_MEMBER_COUNT)+i*64,160}; |
|
|
|
|
box+=screenShakeOffset; |
|
|
|
|
if (CURRENT_TURN==-i-1||OVERWORLD_POWER_SELECTION_MEMBER==i) { |
|
|
|
|
box.y-=20; |
|
|
|
|
} |
|
|
|
|
bool underAttack=false; |
|
|
|
|
if (BATTLE_ENCOUNTER!=nullptr) { |
|
|
|
|
std::vector<Entity*> attackedAllies; |
|
|
|
|
|
|
|
|
|
if (CURRENT_TURN>=0&&BATTLE_STATE==BattleState::WAIT_ANIMATION&&BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget<0) { |
|
|
|
|
attackedAllies=GetEntitiesInRange(BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget,BATTLE_ENCOUNTER->objs[CURRENT_TURN]->channelPos,BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove); |
|
|
|
|
} |
|
|
|
|
for (int j=0;j<attackedAllies.size();j++) { |
|
|
|
|
if (attackedAllies[j]->obj==PARTY_MEMBER_OBJ[i]) { |
|
|
|
|
underAttack=true; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (CURRENT_TURN>=0&&BATTLE_STATE==BattleState::WAIT_ANIMATION&&underAttack) { |
|
|
|
|
drawCheckerboardBox(box,{59,59},Pixel(180,159,194,boxAlpha),Pixel(200,179,214,boxAlpha),{6,6},RED,DARK_RED); |
|
|
|
|
} else { |
|
|
|
|
drawCheckerboardBox(box,{59,59},Pixel(180,159,194,boxAlpha),Pixel(200,179,214,boxAlpha),{6,6}); |
|
|
|
|
} |
|
|
|
|
if (member->selectedMove==nullptr) { |
|
|
|
|
DrawStringDecal({(float)(box.x+6),(float)(box.y+6)},obj->name,Pixel(0,0,0,boxAlpha)); |
|
|
|
|
} else { |
|
|
|
|
DrawStringDecal({(float)(box.x+6),(float)(box.y+4)},obj->name,Pixel(0,0,0,boxAlpha),{1,0.8}); |
|
|
|
|
} |
|
|
|
|
if (BATTLE_ENCOUNTER!=nullptr) { |
|
|
|
|
DrawPartialDecal({(float)(box.x+4),(float)(box.y+5+8+2)},SPRITES["atbbar_back.png"],{0,0},{static_cast<float>(member->atb/1000.0*SPRITES["atbbar_back.png"]->sprite->width),static_cast<float>(SPRITES["atbbar_back.png"]->sprite->height)},{1,1},Pixel(255,255,255,boxAlpha)); |
|
|
|
|
DrawDecal({(float)(box.x+4),(float)(box.y+5+8+2)},SPRITES["atbbar_front.png"],{1,1},Pixel(255,255,255,boxAlpha)); |
|
|
|
|
} |
|
|
|
|
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<float>(SPRITES["atbbar_back.png"]->sprite->height)},{1,1},Pixel(0,178,0,boxAlpha)); |
|
|
|
|
std::string label=member->selectedMove->name; |
|
|
|
|
label+=" "; |
|
|
|
|
if (member->selectedMove->grade!=0) { |
|
|
|
|
label+=member->selectedMove->grade; |
|
|
|
|
} |
|
|
|
|
vd2d textOffset=GetTextSize(label)*0.6; |
|
|
|
|
textOffset.y+=10; |
|
|
|
|
vd2d barPos = {(float)(box.x+4),(float)(box.y+5+8+2)}; |
|
|
|
|
DrawStringDecal(barPos-textOffset/2,label,Pixel(0,0,0,boxAlpha),{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++) { |
|
|
|
|
for (int y=-1;y<=1;y++) { |
|
|
|
|
if (x!=0&&y!=0) { |
|
|
|
|
DrawStringDecal({(float)(hpTextPos.x+x),(float)(hpTextPos.y+y)},"HP",Pixel(255,255,255,boxAlpha)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
DrawStringDecal(hpTextPos,"HP",Pixel(0,0,0,boxAlpha)); |
|
|
|
|
DrawRollingCounter(hpTextPos,member->GetHP(),player_rollhp_display[i],player_rollhp_counter[i]); |
|
|
|
|
const 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",Pixel(255,255,255,boxAlpha)); |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
DrawStringDecal(mpTextPos,"PP",Pixel(0,0,0,boxAlpha)); |
|
|
|
|
DrawRollingCounter(mpTextPos,member->GetPP(),player_rollpp_display[i],player_rollpp_counter[i]); |
|
|
|
|
} |
|
|
|
|
SetDrawTarget(layer::DYNAMIC); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
switch (GAME_STATE) { |
|
|
|
|
case GameState::GAME_WORLD: |
|
|
|
|
case GameState::OVERWORLD_MENU: |
|
|
|
@ -1510,94 +1599,6 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
if (BATTLE_ENCOUNTER!=nullptr&&BATTLE_STATE!=BattleState::MOVE_CAMERA&&BATTLE_STATE!=BattleState::MOVE_CAMERA_BACK||OverworldMenuOpen()&&GAME_STATE!=GameState::OVERWORLD_TARGET_MENU) { |
|
|
|
|
SetDrawTarget(layer::INTERFACE); |
|
|
|
|
vi2d screenShakeOffset = {0,0}; |
|
|
|
|
if (BATTLE_ENCOUNTER!=nullptr) { |
|
|
|
|
cameraPos = BATTLE_ENCOUNTER->pos; |
|
|
|
|
if (BATTLE_HIT_SCREENSHAKE>0) { |
|
|
|
|
BATTLE_HIT_SCREENSHAKE--; |
|
|
|
|
if (BATTLE_HIT_SCREENSHAKE%2==0) { |
|
|
|
|
screenShakeOffset = {0,2}; |
|
|
|
|
} else { |
|
|
|
|
screenShakeOffset = {0,-2}; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
cameraPos+=screenShakeOffset; |
|
|
|
|
} |
|
|
|
|
for (int i=0;i<PARTY_MEMBER_COUNT;i++) { |
|
|
|
|
Entity*member=PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]; |
|
|
|
|
Object*obj=PARTY_MEMBER_OBJ[i]; |
|
|
|
|
vi2d box = {(128-32*PARTY_MEMBER_COUNT)+i*64,160}; |
|
|
|
|
box+=screenShakeOffset; |
|
|
|
|
if (CURRENT_TURN==-i-1||OVERWORLD_POWER_SELECTION_MEMBER==i) { |
|
|
|
|
box.y-=20; |
|
|
|
|
} |
|
|
|
|
bool underAttack=false; |
|
|
|
|
if (BATTLE_ENCOUNTER!=nullptr) { |
|
|
|
|
std::vector<Entity*> attackedAllies; |
|
|
|
|
|
|
|
|
|
if (CURRENT_TURN>=0&&BATTLE_STATE==BattleState::WAIT_ANIMATION&&BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget<0) { |
|
|
|
|
attackedAllies=GetEntitiesInRange(BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget,BATTLE_ENCOUNTER->objs[CURRENT_TURN]->channelPos,BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove); |
|
|
|
|
} |
|
|
|
|
for (int j=0;j<attackedAllies.size();j++) { |
|
|
|
|
if (attackedAllies[j]->obj==PARTY_MEMBER_OBJ[i]) { |
|
|
|
|
underAttack=true; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
if (CURRENT_TURN>=0&&BATTLE_STATE==BattleState::WAIT_ANIMATION&&underAttack) { |
|
|
|
|
drawCheckerboardBox(box,{59,59},Pixel(180,159,194),Pixel(200,179,214),{6,6},RED,DARK_RED); |
|
|
|
|
} else { |
|
|
|
|
drawCheckerboardBox(box,{59,59},Pixel(180,159,194),Pixel(200,179,214),{6,6}); |
|
|
|
|
} |
|
|
|
|
if (member->selectedMove==nullptr) { |
|
|
|
|
DrawStringDecal({(float)(box.x+6),(float)(box.y+6)},obj->name,BLACK); |
|
|
|
|
} else { |
|
|
|
|
DrawStringDecal({(float)(box.x+6),(float)(box.y+4)},obj->name,BLACK,{1,0.8}); |
|
|
|
|
} |
|
|
|
|
if (BATTLE_ENCOUNTER!=nullptr) { |
|
|
|
|
DrawPartialDecal({(float)(box.x+4),(float)(box.y+5+8+2)},SPRITES["atbbar_back.png"],{0,0},{static_cast<float>(member->atb/1000.0*SPRITES["atbbar_back.png"]->sprite->width),static_cast<float>(SPRITES["atbbar_back.png"]->sprite->height)}); |
|
|
|
|
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<float>(SPRITES["atbbar_back.png"]->sprite->height)},{1,1},GREEN*0.7); |
|
|
|
|
std::string label=member->selectedMove->name; |
|
|
|
|
label+=" "; |
|
|
|
|
if (member->selectedMove->grade!=0) { |
|
|
|
|
label+=member->selectedMove->grade; |
|
|
|
|
} |
|
|
|
|
vd2d textOffset=GetTextSize(label)*0.6; |
|
|
|
|
textOffset.y+=10; |
|
|
|
|
vd2d barPos = {(float)(box.x+4),(float)(box.y+5+8+2)}; |
|
|
|
|
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++) { |
|
|
|
|
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",BLACK); |
|
|
|
|
DrawRollingCounter(hpTextPos,member->GetHP(),player_rollhp_display[i],player_rollhp_counter[i]); |
|
|
|
|
const 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",BLACK); |
|
|
|
|
DrawRollingCounter(mpTextPos,member->GetPP(),player_rollpp_display[i],player_rollpp_counter[i]); |
|
|
|
|
} |
|
|
|
|
SetDrawTarget(layer::DYNAMIC); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
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) { |
|
|
|
@ -1755,6 +1756,11 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), |
|
|
|
|
} |
|
|
|
|
SetDrawTarget(layer::DYNAMIC); |
|
|
|
|
DrawPartialDecal(obj->GetPos()-cameraPos,obj->spr->spr,{(float)((obj->frameIndex%obj->spr->frames)*obj->spr->width),0},{(float)obj->spr->width,(float)obj->spr->spr->sprite->height},obj->GetScale(),obj->color); |
|
|
|
|
vi2d nameOffset={0,8}; |
|
|
|
|
vi2d shadowOffset={1,1}; |
|
|
|
|
SetDrawTarget(layer::INTERFACE); |
|
|
|
|
DrawStringDecal(obj->GetPosWithOrigin()-cameraPos-GetTextSize(obj->name)/2+shadowOffset+nameOffset,obj->name,BLACK); |
|
|
|
|
DrawStringDecal(obj->GetPosWithOrigin()-cameraPos-GetTextSize(obj->name)/2+nameOffset,obj->name); |
|
|
|
|
} else { |
|
|
|
|
SetDrawTarget(layer::DYNAMIC); |
|
|
|
|
DrawPartialDecal(obj->GetPos()-cameraPos,obj->spr->spr,{(float)((obj->frameIndex%obj->spr->frames)*obj->spr->width),0},{(float)obj->spr->width,(float)obj->spr->spr->sprite->height},obj->GetScale(),obj->color); |
|
|
|
@ -2714,13 +2720,14 @@ This is a test message that lets us trigger straight from a cutscene! Cool!)"), |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void DrawRollingCounter(const olc::vi2d &pos,int val,int*rollcounter,int*rolloffset) { |
|
|
|
|
FillRectDecal({(float)(pos.x+20),(float)(pos.y-3)},{30,13},olc::DARK_GREY); |
|
|
|
|
FillRectDecal({(float)(pos.x+21),(float)(pos.y-2)},{28,11},olc::GREY); |
|
|
|
|
DrawLineDecal({(float)(pos.x+30),(float)(pos.y-3)},{(float)(pos.x+30),(float)(pos.y+10)},olc::DARK_GREY); |
|
|
|
|
DrawLineDecal({(float)(pos.x+40),(float)(pos.y-3)},{(float)(pos.x+40),(float)(pos.y+10)},olc::DARK_GREY); |
|
|
|
|
DrawPartialDecal({(float)(pos.x+22),(float)(pos.y-1)},{7,9},SPRITES["rollingcounter.png"],{0,(float)(rollcounter[2]*13+rolloffset[2]+13)},{7,9}); |
|
|
|
|
DrawPartialDecal({(float)(pos.x+31),(float)(pos.y-1)},{7,9},SPRITES["rollingcounter.png"],{0,(float)(rollcounter[1]*13+rolloffset[1]+13)},{7,9}); |
|
|
|
|
DrawPartialDecal({(float)(pos.x+41),(float)(pos.y-1)},{7,9},SPRITES["rollingcounter.png"],{0,(float)(rollcounter[0]*13+rolloffset[0]+13)},{7,9}); |
|
|
|
|
int boxAlpha=BATTLE_STATE==BattleState::TARGET_SELECT?64:255; |
|
|
|
|
FillRectDecal({(float)(pos.x+20),(float)(pos.y-3)},{30,13},Pixel(128,128,128,boxAlpha)); |
|
|
|
|
FillRectDecal({(float)(pos.x+21),(float)(pos.y-2)},{28,11},Pixel(192,192,192,boxAlpha)); |
|
|
|
|
DrawLineDecal({(float)(pos.x+30),(float)(pos.y-3)},{(float)(pos.x+30),(float)(pos.y+10)},Pixel(128,128,128,boxAlpha)); |
|
|
|
|
DrawLineDecal({(float)(pos.x+40),(float)(pos.y-3)},{(float)(pos.x+40),(float)(pos.y+10)},Pixel(128,128,128,boxAlpha)); |
|
|
|
|
DrawPartialDecal({(float)(pos.x+22),(float)(pos.y-1)},{7,9},SPRITES["rollingcounter.png"],{0,(float)(rollcounter[2]*13+rolloffset[2]+13)},{7,9},Pixel(255,255,255,boxAlpha)); |
|
|
|
|
DrawPartialDecal({(float)(pos.x+31),(float)(pos.y-1)},{7,9},SPRITES["rollingcounter.png"],{0,(float)(rollcounter[1]*13+rolloffset[1]+13)},{7,9},Pixel(255,255,255,boxAlpha)); |
|
|
|
|
DrawPartialDecal({(float)(pos.x+41),(float)(pos.y-1)},{7,9},SPRITES["rollingcounter.png"],{0,(float)(rollcounter[0]*13+rolloffset[0]+13)},{7,9},Pixel(255,255,255,boxAlpha)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
void ResetBattleState() { |
|
|
|
|