diff --git a/C++ProjectTemplate b/C++ProjectTemplate index 3e75fbc..eace2ea 100755 Binary files a/C++ProjectTemplate and b/C++ProjectTemplate differ diff --git a/main.cpp b/main.cpp index c9ec889..b33150a 100644 --- a/main.cpp +++ b/main.cpp @@ -665,655 +665,234 @@ goes on a very long time, I hope you can understand this is only for testing pur CurrentCutscene->LockAction(); } - if (BATTLE_ENCOUNTER!=nullptr) { - for (int i=0;i0) { - if (BATTLE_ROLLING_COUNTER_WAITTIME==0) { - player_rollwait_counter[i]=0; - } else { - player_rollwait_counter[i]--; + HandleBattle(); + + HandleCutscenes(); + + + switch (GAME_STATE) { + case GameState::TILE_SELECT:{ + if (!TabHeld()) { + GAME_STATE=GameState::EDITOR; + } + if (GetMouse(0).bHeld) { + int selectedTileX=GetMouseX()/TILEMAP_EDITOR_TILESIZE; + int selectedTileY=GetMouseY()/TILEMAP_EDITOR_TILESIZE; + if (selectedTileX*TILEMAP_EDITOR_DRAW_MULT>=0&&selectedTileX*TILEMAP_EDITOR_DRAW_MULT=0) { + SELECTED_TILE={selectedTileX,selectedTileY}; } } - Entity*member=PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]; - if (member->GetHP()>std::clamp(member->GetTargetHP(),0,member->GetTargetHP())) { - if (player_rollhp_counter[i][0]<=0&&player_rollwait_counter[i]==0) { - player_rollhp_display[i][0]--; - player_rollhp_counter[i][0]=13; - member->_SetDirectHP(member->GetHP()-1); - if (player_rollhp_display[i][0]<0) { - player_rollhp_display[i][0]=9; - player_rollhp_counter[i][0]=13; - player_rollhp_display[i][1]--; - player_rollhp_counter[i][1]=13; - if (player_rollhp_display[i][1]<0) { - player_rollhp_display[i][1]=9; - player_rollhp_counter[i][1]=13; - player_rollhp_display[i][2]--; - player_rollhp_counter[i][2]=13; - } - } + }break; + case GameState::ENCOUNTER_SELECT:{ + if (!GetKey(SHIFT).bHeld) { + GAME_STATE=GameState::EDITOR; + } + }break; + case GameState::GAME_WORLD:{ + if (PlayerCanMove()) { + bool moved=false; + vd2d movementComponents = {0,0}; + if (UpHeld()) { + movementComponents.y-=1; } - if (player_rollhp_counter[i][0]>0) { - if (member->GetTargetHP()<-member->maxHP) { - player_rollhp_counter[i][0]-=HEALTH_ROLLING_SPEED+(member->maxHP-member->GetTargetHP())/10; - } else - if (member->GetTargetHP()<0) { - player_rollhp_counter[i][0]-=HEALTH_ROLLING_SPEED+(member->maxHP-member->GetTargetHP())/20; - } else { - player_rollhp_counter[i][0]-=HEALTH_ROLLING_SPEED; - } + if (DownHeld()) { + movementComponents.y+=1; } - if (player_rollhp_counter[i][1]>0) { - player_rollhp_counter[i][1]--; + if (LeftHeld()) { + movementComponents.x-=1; } - if (player_rollhp_counter[i][2]>0) { - player_rollhp_counter[i][2]--; + if (RightHeld()) { + movementComponents.x+=1; } - } else - if (member->GetHP()GetTargetHP()) { - if (player_rollhp_counter[i][0]>=0&&player_rollwait_counter[i]==0) { - player_rollhp_display[i][0]++; - player_rollhp_counter[i][0]=-13; - member->_SetDirectHP(member->GetHP()+1); - if (player_rollhp_display[i][0]>9) { - player_rollhp_display[i][0]=0; - player_rollhp_counter[i][0]=-13; - player_rollhp_display[i][1]++; - player_rollhp_counter[i][1]=-13; - if (player_rollhp_display[i][1]>9) { - player_rollhp_display[i][1]=0; - player_rollhp_counter[i][1]=-13; - player_rollhp_display[i][2]++; - player_rollhp_counter[i][2]=-13; - } + if (movementComponents.mag()>0) { + if (PARTY_MEMBER_OBJ[0]->SmoothMove(movementComponents)) { + UpdatePlayerTrail(movementComponents); + moved=true; } } - if (player_rollhp_counter[i][0]<0) { - player_rollhp_counter[i][0]+=HEALTH_ROLLING_SPEED; - } - if (player_rollhp_counter[i][1]<0) { - player_rollhp_counter[i][1]++; - } - if (player_rollhp_counter[i][2]<0) { - player_rollhp_counter[i][2]++; - } - } else { - if (player_rollhp_counter[i][0]<0) { - player_rollhp_counter[i][0]++; - } - if (player_rollhp_counter[i][1]<0) { - player_rollhp_counter[i][1]++; - } - if (player_rollhp_counter[i][2]<0) { - player_rollhp_counter[i][2]++; - } - if (player_rollhp_counter[i][0]>0) { - player_rollhp_counter[i][0]--; - } - if (player_rollhp_counter[i][1]>0) { - player_rollhp_counter[i][1]--; + if (moved) { + vi2d cameraOffset={WIDTH/2,HEIGHT/2}; + cameraPos=PARTY_MEMBER_OBJ[0]->GetPos()-cameraOffset; } - if (player_rollhp_counter[i][2]>0) { - player_rollhp_counter[i][2]--; + if (moved&&BATTLE_ENCOUNTER==nullptr) { + for (int i=0;iencounters.size();i++) { + if (CURRENT_MAP->encounters[i]->IsEncounterAlive()&&CURRENT_MAP->encounters[i]->IsInRange(PARTY_MEMBER_OBJ[0]->GetPos())) { + BATTLE_STATE=BattleState::MOVE_CAMERA; + BATTLE_ENCOUNTER=CURRENT_MAP->encounters[i]; + break; + } + } } } - - if (player_rollwait_counter[i]==0) { - player_rollwait_counter[i]=BATTLE_ROLLING_COUNTER_WAITTIME*13; + }break; + case GameState::EDITOR:{ + if (IsTextEntryEnabled()) { + return; } - } - switch (BATTLE_STATE) { - case BattleState::MOVE_CAMERA:{ - bool allDone=true; - if (!MoveCameraTowardsPoint(BATTLE_ENCOUNTER->pos,PriorityDirection::BOTH,BATTLE_CAMERA_MOVESPD)) { - allDone=false; - } - for (int i=0;iplayerPos[i]+BATTLE_ENCOUNTER->pos,PriorityDirection::BOTH,BATTLE_CAMERA_MOVESPD)) { - allDone=false; - } - } - if (allDone) { - CAMERA_WAIT_TIMER++; - if (CAMERA_WAIT_TIMER>=CAMERA_WAIT_TIME) { - for (int i=0;iGetHP()%10; - player_rollpp_display[i][j]=member->PP%10; - }break; - case 1:{ - player_rollhp_display[i][j]=member->GetHP()/10%10; - player_rollpp_display[i][j]=member->PP/10%10; - }break; - case 2:{ - player_rollhp_display[i][j]=member->GetHP()/100%10; - player_rollpp_display[i][j]=member->PP/100%10; - }break; - } - } - BATTLE_STATE=BattleState::WAIT; - } + if (TabHeld()) { + GAME_STATE=GameState::TILE_SELECT; + } + if (GetKey(SHIFT).bHeld) { + GAME_STATE=GameState::ENCOUNTER_SELECT; + } + if (PlayerCanMove()) { + if (GetKey(I).bHeld) { + if (PARTY_MEMBER_OBJ[0]->SmoothMove({0,-1})) { + UpdatePlayerTrail({0,-1}); } } - }break; - case BattleState::WAIT:{ - BATTLE_ROLLING_COUNTER_WAITTIME=0; - bool done=false; - if (!done) { - for (int i=0;i<4;i++) { - if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->selectedMove!=nullptr) { - if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->channelTimeRemaining>0) { - PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->channelTimeRemaining--; - } else { - //Attack is being done. - printf("%s performs %s.\n",PARTY_MEMBER_OBJ[i]->name.c_str(),PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->selectedMove->name.c_str()); - BATTLE_STATE=BattleState::WAIT_ANIMATION; - BATTLE_ANIMATION_TIMER=0; - CURRENT_TURN=-i-1; - done=true; - break; - } - } + if (GetKey(K).bHeld) { + if (PARTY_MEMBER_OBJ[0]->SmoothMove({0,1})) { + UpdatePlayerTrail({0,1}); } } - if (!done) { - for (int i=0;iobjs.size();i++) { - if (BATTLE_ENCOUNTER->objs[i]->selectedMove!=nullptr) { - if (BATTLE_ENCOUNTER->objs[i]->channelTimeRemaining>0) { - BATTLE_ENCOUNTER->objs[i]->channelTimeRemaining--; - } else { - CURRENT_TURN=i; - printf("%s performs %s.\n",BATTLE_ENCOUNTER->objs[i]->obj->name.c_str(),BATTLE_ENCOUNTER->objs[i]->selectedMove->name.c_str()); - BATTLE_STATE=BattleState::WAIT_ANIMATION; - BATTLE_ANIMATION_TIMER=0; - done=true; - break; - } - } + if (GetKey(J).bHeld) { + if (PARTY_MEMBER_OBJ[0]->SmoothMove({-1,0})) { + UpdatePlayerTrail({-1,0}); } } - if (!done) { - for (int i=0;i<4;i++) { - if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->selectedMove==nullptr) { - if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->atb>=1000) { - printf("%s ready.\n",PARTY_MEMBER_OBJ[i]->name.c_str()); - CURRENT_TURN=-i-1; - BATTLE_STATE=BattleState::SELECT_ACTION; - BATTLE_SELECTION_CURSOR=0; - POWER_GRADE_CURSOR[-CURRENT_TURN-1]=0; - done=true; - break; - } else { - PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->atb+=PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->speed; - } - } + if (GetKey(L).bHeld) { + if (PARTY_MEMBER_OBJ[0]->SmoothMove({1,0})) { + UpdatePlayerTrail({1,0}); } } - if (!done) { - for (int i=0;iobjs.size();i++) { - if (BATTLE_ENCOUNTER->objs[i]->selectedMove==nullptr) { - if (BATTLE_ENCOUNTER->objs[i]->atb>=1000) { - printf("%s (%d) ready.\n",BATTLE_ENCOUNTER->objs[i]->obj->name.c_str(),i); - CURRENT_TURN=i; - //Enemy picks a random move from the movelist. And a random target. - BATTLE_ENCOUNTER->objs[i]->selectedMove=BATTLE_ENCOUNTER->objs[i]->moveSet[rand()%BATTLE_ENCOUNTER->objs[i]->moveSet.size()]; - BATTLE_ENCOUNTER->objs[i]->channelTimeRemaining=BATTLE_ENCOUNTER->objs[i]->selectedMove->channelTime; - if (BATTLE_ENCOUNTER->objs[i]->selectedMove->friendly) { - do { - BATTLE_ENCOUNTER->objs[i]->selectedTarget=rand()%BATTLE_ENCOUNTER->objs.size(); - } while (BATTLE_ENCOUNTER->objs[BATTLE_ENCOUNTER->objs[i]->selectedTarget]->GetHP()<=0); - } else { - bool playerAlive=false; - for (int i=0;iGetHP()>0) { - playerAlive=true; - break; - } - } - if (playerAlive) { - do { - BATTLE_ENCOUNTER->objs[i]->selectedTarget=-(rand()%PARTY_MEMBER_COUNT)-1; - } while (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-BATTLE_ENCOUNTER->objs[i]->selectedTarget-1]]->GetHP()<=0); - printf("Selected Target: %d\n",BATTLE_ENCOUNTER->objs[i]->selectedTarget); - } - } - printf(" %s chose move %s.\n",BATTLE_ENCOUNTER->objs[i]->obj->name.c_str(),BATTLE_ENCOUNTER->objs[i]->selectedMove->name.c_str()); - BATTLE_STATE=BattleState::WAIT; - BATTLE_SELECTION_CURSOR=0; - done=true; - break; - } else { - BATTLE_ENCOUNTER->objs[i]->atb+=BATTLE_ENCOUNTER->objs[i]->speed; - } - } - } + } + int selectedTileX=(GetMouseX()+cameraPos.x)/32; + int selectedTileY=(GetMouseY()+cameraPos.y)/32; + if (selectedTileX=0&&selectedTileY>=0) { + HIGHLIGHTED_TILE={selectedTileX,selectedTileY}; + } + if (GetMouse(0).bHeld) { + switch (EDITING_LAYER) { + case layer::COLLISION:{ + TILE*tile=MAP5[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; + tile->tileX=SELECTED_TILE.x; + tile->tileY=SELECTED_TILE.y; + }break; + case layer::HIGH:{ + TILE*tile=MAP[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; + tile->tileX=SELECTED_TILE.x; + tile->tileY=SELECTED_TILE.y; + }break; + case layer::DYNAMIC:{ + TILE*tile=MAP2[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; + tile->tileX=SELECTED_TILE.x; + tile->tileY=SELECTED_TILE.y; + }break; + case layer::GROUND:{ + TILE*tile=MAP3[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; + tile->tileX=SELECTED_TILE.x; + tile->tileY=SELECTED_TILE.y; + }break; + case layer::BACKGROUND:{ + TILE*tile=MAP4[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; + tile->tileX=SELECTED_TILE.x; + tile->tileY=SELECTED_TILE.y; + }break; } - }break; - case BattleState::WAIT_ANIMATION:{ - BATTLE_ROLLING_COUNTER_WAITTIME=5; - BATTLE_ANIMATION_TIMER++; - if (BATTLE_ANIMATION_TIMER==90) { - if (CURRENT_TURN<0) { - if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->friendly) { - if (PARTY_MEMBER_STATS[-PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget-1]->GetHP()>0) { - int healAmt = PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->baseDmg+ - ((PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->randomDmg>0)?rand()%PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->randomDmg:0) - +PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->baseAtk; - std::cout << PARTY_MEMBER_OBJ[-CURRENT_TURN-1]->name << " uses " << PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->name << " " << PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->grade << " on " << PARTY_MEMBER_OBJ[-PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget-1]->name << " recovering " << healAmt << " health.\n"; - PARTY_MEMBER_STATS[-PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget-1]->AddHP(healAmt); - } else { - std::cout << PARTY_MEMBER_OBJ[-CURRENT_TURN-1]->name << " uses " << PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->name << " " << PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->grade << " on " << PARTY_MEMBER_OBJ[-PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget-1]->name << " but it failed.\n"; - } - } else { - if (BATTLE_ENCOUNTER->objs[PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget]->GetHP()>0) { - int dmgAmt = PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->baseDmg+ - ((PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->randomDmg>0)?rand()%PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->randomDmg:0) - +PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->baseAtk; - std::cout << PARTY_MEMBER_OBJ[-CURRENT_TURN-1]->name << " uses " << PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->name << " " << PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->grade << " on " << BATTLE_ENCOUNTER->objs[PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget]->obj->name << " dealing " << dmgAmt << " health.\n"; - BATTLE_ENCOUNTER->objs[PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget]->_SetDirectHP( - BATTLE_ENCOUNTER->objs[PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget]->GetHP()-dmgAmt - ); //Enemies have their health directly set. - } else { - std::cout << PARTY_MEMBER_OBJ[-CURRENT_TURN-1]->name << " uses " << PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->name << " " << PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->grade << " on " << BATTLE_ENCOUNTER->objs[PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget]->obj->name << " but it failed.\n"; - } - } - } else { - if (BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->friendly) { - if (BATTLE_ENCOUNTER->objs[BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget]->GetHP()>0) { - int healAmt = BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->baseDmg+ - ((rand()%BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->randomDmg>0)?rand()%BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->randomDmg:0) - +BATTLE_ENCOUNTER->objs[CURRENT_TURN]->baseAtk; - std::cout << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->obj->name << " uses " << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->name << " " << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->grade << " on " << BATTLE_ENCOUNTER->objs[BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget]->obj->name << " recovering " << healAmt << " health.\n"; - BATTLE_ENCOUNTER->objs[BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget]->AddHP(healAmt); - } else { - std::cout << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->obj->name << " uses " << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->name << " " << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->grade << " on " << BATTLE_ENCOUNTER->objs[BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget]->obj->name << " but it failed.\n"; - } - } else { - if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget-1]]->GetHP()>0) { - printf("HP check passes.\n"); - int dmgAmt = BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->baseDmg+ - ((rand()%BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->randomDmg>0)?rand()%BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->randomDmg:0) - +BATTLE_ENCOUNTER->objs[CURRENT_TURN]->baseAtk; - printf("Damage: %d\n",dmgAmt); - std::cout << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->obj->name << " uses " << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->name << " " << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->grade << " on " << PARTY_MEMBER_OBJ[-BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget-1]->name << " dealing " << dmgAmt << " health.\n"; - PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget-1]]->SubtractHP(dmgAmt); - } else { - std::cout << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->obj->name << " uses " << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->name << " " << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->grade << " on " << PARTY_MEMBER_OBJ[-BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget-1]->name << " but it failed.\n"; - } - } - } - } else - if (BATTLE_ANIMATION_TIMER>120) { - //Turn's done! - if (CURRENT_TURN<0) { - PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove=nullptr; - PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->atb=0; - BATTLE_STATE=BattleState::WAIT; - CURRENT_TURN=-99; - } else { - BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove=nullptr; - BATTLE_ENCOUNTER->objs[CURRENT_TURN]->atb=0; - BATTLE_STATE=BattleState::WAIT; - } + } else + if (GetMouse(1).bHeld) { + switch (EDITING_LAYER) { + case layer::COLLISION:{ + TILE*tile=MAP5[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; + tile->tileX=tile->tileY=15; + }break; + case layer::HIGH:{ + TILE*tile=MAP[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; + tile->tileX=tile->tileY=15; + }break; + case layer::DYNAMIC:{ + TILE*tile=MAP2[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; + tile->tileX=tile->tileY=15; + }break; + case layer::GROUND:{ + TILE*tile=MAP3[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; + tile->tileX=tile->tileY=15; + }break; + case layer::BACKGROUND:{ + TILE*tile=MAP4[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; + tile->tileX=tile->tileY=15; + }break; } - }break; - case BattleState::SELECT_ACTION: - case BattleState::ITEM_SELECT: - case BattleState::GRADE_SELECT: - case BattleState::TARGET_SELECT: - case BattleState::POWER_SELECT:{ - BATTLE_ROLLING_COUNTER_WAITTIME=5; - }break; - } + } + + }break; } - switch (CurrentAction) { - case ActionType::SET_FLAG_WHEN_CUTSCENE_ENDS:{ - CurrentCutscene->SetupEndingCutsceneFlag(((SetFlagWhenCutsceneEnds*)CurrentCutscene->GetAction())->GetCutsceneEndingFlag(),((SetFlagWhenCutsceneEnds*)CurrentCutscene->GetAction())->GetCutsceneEndingVal()); - CurrentCutscene->AdvanceAction(); - }break; - case ActionType::PAN_CAMERA:{ - PanCamera*cam=(PanCamera*)CurrentCutscene->GetAction(); - if (MoveCameraTowardsPoint(cam->GetCameraTargetPos(),cam->GetPriorityDirection(),cam->GetCameraSpeed())) { - CurrentCutscene->AdvanceAction(); - } - }break; - case ActionType::PAN_CAMERA_ASYNC:{ - AddAsyncCutsceneAction(PanCameraAsync); - }break; - case ActionType::MOVE_CUTSCENE_OBJ:{ - if (MoveObjectTowardsPoint(CurrentCutscene->GetCutsceneObjects()[((MoveCutsceneObject*)CurrentCutscene->GetAction())->GetObjectID()],((MoveCutsceneObject*)CurrentCutscene->GetAction())->GetTargetPos(),((MoveCutsceneObject*)CurrentCutscene->GetAction())->GetMovement(),((MoveCutsceneObject*)CurrentCutscene->GetAction())->GetMoveSpd())) { - CurrentCutscene->AdvanceAction(); + if (messageBoxVisible) { + AdvanceMessageBox(); + } + + //CAMERA UPDATES MUST BE LAST!!! COLLISIONS RELY ON THE GAME POSITION STATES REMAINING THE SAME! + cameraUpdate(); + } + + void AdvanceMessageBox() { + if (messageBoxLoad) { + const int MESSAGE_BORDER_X=4; + const int MESSAGE_BORDER_Y=4; + bool charsWritten=false; + while (messageBoxStartMarker+messageBoxStopMarkerGetAction())->GetObjects()) { - obj->temp=true; - AddObjectToWorld(CurrentCutscene->AddCutsceneObject(new Object(obj->id,obj->name,obj->GetPos(),obj->spr,obj->GetScale(),obj->color,obj->animationSpd,true))); + if (GetTextSizeProp(messageBoxFinalText).x>=WIDTH/2-MESSAGE_BORDER_X) { + while (messageBoxFinalText[messageBoxStopMarker]!=' ') { + messageBoxStopMarker--; + }; + messageBoxFinalText.erase(messageBoxFinalText.begin()+messageBoxStopMarker,messageBoxFinalText.end()); + messageBoxFinalText+='\n'; + charsWritten=false; } - CurrentCutscene->AdvanceAction(); - }break; - case ActionType::CLEANUP:{ - if (CUTSCENE_QUEUE.size()==0) { - for (int i=0;itemp) { - delete OBJECTS[i]; - OBJECTS.erase(OBJECTS.begin()+i--); - } else { - OBJECTS[i]->objArrElement=i; - } - } - CurrentCutscene->CleanupCutscene(); - CurrentCutscene->ResetCutscene(); - SetGameFlag(CurrentCutscene->GetEndingCutsceneFlag(),CurrentCutscene->GetEndingCutsceneVal()); - CurrentCutscene=nullptr; - CurrentAction=ActionType::NONE; + } + messageBoxLoad=false; + } else { + if (messageBoxMarkerGetAction())->FadeIn()&&CUTSCENE_FADE_VALUE>0) { - CUTSCENE_FADE_VALUE=std::clamp(CUTSCENE_FADE_VALUE-((Fade*)CurrentCutscene->GetAction())->GetFadeSpd(),0.0,255.0); - if (CUTSCENE_FADE_VALUE==0) { - CurrentCutscene->AdvanceAction(); - } - } else - if (!((Fade*)CurrentCutscene->GetAction())->FadeIn()&&CUTSCENE_FADE_VALUE<255) { - CUTSCENE_FADE_VALUE=std::clamp(CUTSCENE_FADE_VALUE+((Fade*)CurrentCutscene->GetAction())->GetFadeSpd(),0.0,255.0); - if (CUTSCENE_FADE_VALUE==255) { - CurrentCutscene->AdvanceAction(); - } + if (RightHeld()) { + cameraPos.x+=CAMERA_MOVESPD; } - }break; - case ActionType::FADE_ASYNC:{ - AddAsyncCutsceneAction(FadeAsync); - }break; - case ActionType::DIALOG:{ - if (!((DialogBox*)CurrentCutscene->GetAction())->MessageHasBeenShown()) { - DisplayMessageBox(((DialogBox*)CurrentCutscene->GetAction())->GetMessage()); - ((DialogBox*)CurrentCutscene->GetAction())->SetMessageBoxVisible(); - } else - if (!messageBoxVisible) { - CurrentCutscene->AdvanceAction(); + if (LeftHeld()) { + cameraPos.x-=CAMERA_MOVESPD; } - }break; - case ActionType::DIALOG_ASYNC:{ - DisplayMessageBox(((DialogBox*)CurrentCutscene->GetAction())->GetMessage()); - CurrentCutscene->AdvanceAction(); - }break; - case ActionType::MODIFY_OBJECT:{ - ModifyObject*action=(ModifyObject*)CurrentCutscene->GetAction(); - Object*obj=CurrentCutscene->GetCutsceneObjects()[action->GetCutsceneObjID()]; - obj->SetScale(action->GetObjScale()); - obj->color=action->GetObjCol(); - obj->spr=action->GetObjSpr(); - if (action->GetFrameIndex()!=-1) { - obj->frameIndex=action->GetFrameIndex(); + if (DownHeld()) { + cameraPos.y+=CAMERA_MOVESPD; } - obj->animationSpd=action->GetAnimationSpeed(); - CurrentCutscene->AdvanceAction(); }break; + } + } + + void OnTextEntryComplete(const std::string&text) override{ + if (EDITING_LAYER==layer::ENCOUNTER&&EDITING_ENCOUNTER!=nullptr) { + int numb=0; + for (int i=0;ichance=numb; } - - for (int i=0;iGetActionType()) { - case ActionType::PAN_CAMERA_ASYNC:{ - PanCameraAsync*cam=(PanCameraAsync*)CUTSCENE_QUEUE[i]; - if (MoveCameraTowardsPoint(cam->GetCameraTargetPos(),cam->GetPriorityDirection(),cam->GetCameraSpeed())) { - CUTSCENE_QUEUE.erase(CUTSCENE_QUEUE.begin()+i--); - } - }break; - case ActionType::MOVE_CUTSCENE_OBJ_ASYNC:{ - if (MoveObjectTowardsPoint(CurrentCutscene->GetCutsceneObjects()[((MoveCutsceneObjectAsync*)CUTSCENE_QUEUE[i])->GetObjectID()],((MoveCutsceneObjectAsync*)CUTSCENE_QUEUE[i])->GetTargetPos(),((MoveCutsceneObjectAsync*)CUTSCENE_QUEUE[i])->GetMovement(),((MoveCutsceneObjectAsync*)CUTSCENE_QUEUE[i])->GetMoveSpd())) { - CUTSCENE_QUEUE.erase(CUTSCENE_QUEUE.begin()+i--); - } - }break; - case ActionType::FADE_ASYNC:{ - if (((FadeAsync*)CUTSCENE_QUEUE[i])->FadeIn()&&CUTSCENE_FADE_VALUE>0) { - CUTSCENE_FADE_VALUE=std::clamp(CUTSCENE_FADE_VALUE-((FadeAsync*)CUTSCENE_QUEUE[i])->GetFadeSpd(),0.0,255.0); - if (CUTSCENE_FADE_VALUE==0) { - CUTSCENE_QUEUE.erase(CUTSCENE_QUEUE.begin()+i--); - } - } else - if (!((FadeAsync*)CUTSCENE_QUEUE[i])->FadeIn()&&CUTSCENE_FADE_VALUE<255) { - CUTSCENE_FADE_VALUE=std::clamp(CUTSCENE_FADE_VALUE+((FadeAsync*)CUTSCENE_QUEUE[i])->GetFadeSpd(),0.0,255.0); - if (CUTSCENE_FADE_VALUE==255) { - CUTSCENE_QUEUE.erase(CUTSCENE_QUEUE.begin()+i--); - } - } - }break; - } - } - - - switch (GAME_STATE) { - case GameState::TILE_SELECT:{ - if (!TabHeld()) { - GAME_STATE=GameState::EDITOR; - } - if (GetMouse(0).bHeld) { - int selectedTileX=GetMouseX()/TILEMAP_EDITOR_TILESIZE; - int selectedTileY=GetMouseY()/TILEMAP_EDITOR_TILESIZE; - if (selectedTileX*TILEMAP_EDITOR_DRAW_MULT>=0&&selectedTileX*TILEMAP_EDITOR_DRAW_MULT=0) { - SELECTED_TILE={selectedTileX,selectedTileY}; - } - } - }break; - case GameState::ENCOUNTER_SELECT:{ - if (!GetKey(SHIFT).bHeld) { - GAME_STATE=GameState::EDITOR; - } - }break; - case GameState::GAME_WORLD:{ - if (PlayerCanMove()) { - bool moved=false; - vd2d movementComponents = {0,0}; - if (UpHeld()) { - movementComponents.y-=1; - } - if (DownHeld()) { - movementComponents.y+=1; - } - if (LeftHeld()) { - movementComponents.x-=1; - } - if (RightHeld()) { - movementComponents.x+=1; - } - if (movementComponents.mag()>0) { - if (PARTY_MEMBER_OBJ[0]->SmoothMove(movementComponents)) { - UpdatePlayerTrail(movementComponents); - moved=true; - } - } - if (moved) { - vi2d cameraOffset={WIDTH/2,HEIGHT/2}; - cameraPos=PARTY_MEMBER_OBJ[0]->GetPos()-cameraOffset; - } - if (moved&&BATTLE_ENCOUNTER==nullptr) { - for (int i=0;iencounters.size();i++) { - if (CURRENT_MAP->encounters[i]->IsEncounterAlive()&&CURRENT_MAP->encounters[i]->IsInRange(PARTY_MEMBER_OBJ[0]->GetPos())) { - BATTLE_STATE=BattleState::MOVE_CAMERA; - BATTLE_ENCOUNTER=CURRENT_MAP->encounters[i]; - break; - } - } - } - } - }break; - case GameState::EDITOR:{ - if (IsTextEntryEnabled()) { - return; - } - if (TabHeld()) { - GAME_STATE=GameState::TILE_SELECT; - } - if (GetKey(SHIFT).bHeld) { - GAME_STATE=GameState::ENCOUNTER_SELECT; - } - if (PlayerCanMove()) { - if (GetKey(I).bHeld) { - if (PARTY_MEMBER_OBJ[0]->SmoothMove({0,-1})) { - UpdatePlayerTrail({0,-1}); - } - } - if (GetKey(K).bHeld) { - if (PARTY_MEMBER_OBJ[0]->SmoothMove({0,1})) { - UpdatePlayerTrail({0,1}); - } - } - if (GetKey(J).bHeld) { - if (PARTY_MEMBER_OBJ[0]->SmoothMove({-1,0})) { - UpdatePlayerTrail({-1,0}); - } - } - if (GetKey(L).bHeld) { - if (PARTY_MEMBER_OBJ[0]->SmoothMove({1,0})) { - UpdatePlayerTrail({1,0}); - } - } - } - int selectedTileX=(GetMouseX()+cameraPos.x)/32; - int selectedTileY=(GetMouseY()+cameraPos.y)/32; - if (selectedTileX=0&&selectedTileY>=0) { - HIGHLIGHTED_TILE={selectedTileX,selectedTileY}; - } - if (GetMouse(0).bHeld) { - switch (EDITING_LAYER) { - case layer::COLLISION:{ - TILE*tile=MAP5[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; - tile->tileX=SELECTED_TILE.x; - tile->tileY=SELECTED_TILE.y; - }break; - case layer::HIGH:{ - TILE*tile=MAP[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; - tile->tileX=SELECTED_TILE.x; - tile->tileY=SELECTED_TILE.y; - }break; - case layer::DYNAMIC:{ - TILE*tile=MAP2[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; - tile->tileX=SELECTED_TILE.x; - tile->tileY=SELECTED_TILE.y; - }break; - case layer::GROUND:{ - TILE*tile=MAP3[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; - tile->tileX=SELECTED_TILE.x; - tile->tileY=SELECTED_TILE.y; - }break; - case layer::BACKGROUND:{ - TILE*tile=MAP4[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; - tile->tileX=SELECTED_TILE.x; - tile->tileY=SELECTED_TILE.y; - }break; - } - } else - if (GetMouse(1).bHeld) { - switch (EDITING_LAYER) { - case layer::COLLISION:{ - TILE*tile=MAP5[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; - tile->tileX=tile->tileY=15; - }break; - case layer::HIGH:{ - TILE*tile=MAP[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; - tile->tileX=tile->tileY=15; - }break; - case layer::DYNAMIC:{ - TILE*tile=MAP2[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; - tile->tileX=tile->tileY=15; - }break; - case layer::GROUND:{ - TILE*tile=MAP3[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; - tile->tileX=tile->tileY=15; - }break; - case layer::BACKGROUND:{ - TILE*tile=MAP4[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; - tile->tileX=tile->tileY=15; - }break; - } - } - - }break; - } - - if (messageBoxVisible) { - AdvanceMessageBox(); - } - - //CAMERA UPDATES MUST BE LAST!!! COLLISIONS RELY ON THE GAME POSITION STATES REMAINING THE SAME! - cameraUpdate(); - } - - void AdvanceMessageBox() { - if (messageBoxLoad) { - const int MESSAGE_BORDER_X=4; - const int MESSAGE_BORDER_Y=4; - bool charsWritten=false; - while (messageBoxStartMarker+messageBoxStopMarker=WIDTH/2-MESSAGE_BORDER_X) { - while (messageBoxFinalText[messageBoxStopMarker]!=' ') { - messageBoxStopMarker--; - }; - messageBoxFinalText.erase(messageBoxFinalText.begin()+messageBoxStopMarker,messageBoxFinalText.end()); - messageBoxFinalText+='\n'; - charsWritten=false; - } - } - messageBoxLoad=false; - } else { - if (messageBoxMarkerchance=numb; - } - } + } void keyUpdates() { if (GetKey(F1).bPressed) { @@ -1921,7 +1500,7 @@ goes on a very long time, I hope you can understand this is only for testing pur } for (int i=0;iobjs.size();i++) { Entity*obj = BATTLE_ENCOUNTER->objs[i]; - if (obj->selectedMove!=nullptr) { + if (obj->GetHP()>0&&obj->selectedMove!=nullptr) { 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,SPRITES["atbbar_back.png"]->sprite->height},{1,1},YELLOW*0.8); DrawDecal(obj->obj->GetPos()+obj->obj->originPoint-cameraPos+barOffset,SPRITES["atbbar_front.png"]); @@ -2799,126 +2378,597 @@ goes on a very long time, I hope you can understand this is only for testing pur return GAME_FLAGS[flag]; } - bool GetGameFlag(Flag flag) { - return GAME_FLAGS[toint(flag)]; - } + bool GetGameFlag(Flag flag) { + return GAME_FLAGS[toint(flag)]; + } + + void LoadEncounter(Map*map,vd2d pos,int chance,int id,bool successful) { + std::vectorents; + for (int i=0;iobjs.size();i++) { + Entity*ent=ENCOUNTER_LIST[id]->objs[i]; + Object*newObj=new Object(ent->obj->id,ent->obj->name,ent->obj->GetPos(),ent->obj->spr,ent->obj->GetScale(),ent->obj->color,ent->obj->animationSpd,ent->obj->temp); + ents.push_back(new Entity(newObj,ent->GetHP(),ent->maxHP,ent->PP,ent->maxPP,ent->baseAtk,ent->resistances,ent->speed,ent->moveSet,ent->damageReduction,ent->smart,ent->dumb)); + } + Encounter*data=new Encounter(id,pos,ENCOUNTER_LIST[id]->playerPos,ents,chance); + data->chance=chance; + data->id=id; + for (int i=0;iobjs.size();i++) { + data->objs[i]->obj->enc=true; + if (!successful) { + data->objs[i]->_SetDirectHP(0); + data->objs[i]->obj->dead=true; + } + } + map->encounters.push_back(data); + for (int i=0;iobjs.size();i++) { + AddObjectToWorld(data->objs[i]->obj); + data->objs[i]->obj->SetPos(data->objs[i]->obj->GetPos()+pos); + } + } + + void UpdatePlayerTrail(vd2d newMovement) { + for (int i=PARTY_TRAIL_LENGTH-1;i>0;i--) { + partyTrail[i]=partyTrail[i-1]; + } + partyTrail[0]=PARTY_MEMBER_OBJ[0]->GetPos()-newMovement; + for (int i=1;iSetPos(partyTrail[PARTY_TRAIL_LENGTH*((double)i/4)]); + } + } + + void drawBox(const olc::vi2d &pos, const olc::vi2d &size, olc::Pixel p = olc::WHITE, olc::Pixel p2 = olc::DARK_GREY, olc::Pixel p3 = olc::VERY_DARK_GREY) { + FillRectDecal({(float)(pos.x+3),(float)(pos.y+3)},{(float)(size.x-5),(float)(size.y-5)},p); + DrawRect({pos.x,pos.y},size,p2); + DrawRect({pos.x+2,pos.y+2},{size.x-4,size.y-4},p3); + DrawRect({pos.x+1,pos.y+1},{size.x-2,size.y-2},p); + Draw({pos.x,pos.y},olc::BLACK); + Draw({pos.x+size.x,pos.y+size.y},olc::BLACK); + Draw({pos.x+size.x,pos.y},olc::BLACK); + Draw({pos.x,pos.y+size.y},olc::BLACK); + } + + void drawCheckerboardBox(const olc::vi2d &pos, const olc::vi2d &size, olc::Pixel p = olc::WHITE, olc::Pixel alternatingCol = olc::WHITE, const olc::vi2d &checkerboardSize = {3,3}, olc::Pixel p2 = olc::DARK_GREY, olc::Pixel p3 = olc::VERY_DARK_GREY) { + drawBox(pos,size,p,p2,p3); + for (int x=3;xwidth) { + do { + if (newStr[newStr.length()-1]!=' ') { + marker--; + //printf("%s\n",newStr.c_str()); + } + newStr.erase(newStr.end()-1); + } while (newStr[newStr.length()-1]!=' '); + //newStr.erase(newStr.end()-1); + newStr+='\n'; + firstChar=false; + } else { + firstChar=true; + marker++; + } + } + return newStr; + } + + //Returns -1 if not found. + int getProperty(Property prop,Battle::Move*move) { + for (int i=0;iproperties.size();i++) { + std::pair p = move->properties[i]; + if (p.first==prop) { + return p.second; + } + } + return -1; + } + + void HandleBattle() { + if (BATTLE_ENCOUNTER!=nullptr) { + for (int i=0;i0) { + if (BATTLE_ROLLING_COUNTER_WAITTIME==0) { + player_rollwait_counter[i]=0; + } else { + player_rollwait_counter[i]--; + } + } + Entity*member=PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]; + if (member->GetHP()>std::clamp(member->GetTargetHP(),0,member->GetTargetHP())) { + if (player_rollhp_counter[i][0]<=0&&player_rollwait_counter[i]==0) { + player_rollhp_display[i][0]--; + player_rollhp_counter[i][0]=13; + member->_SetDirectHP(member->GetHP()-1); + if (player_rollhp_display[i][0]<0) { + player_rollhp_display[i][0]=9; + player_rollhp_counter[i][0]=13; + player_rollhp_display[i][1]--; + player_rollhp_counter[i][1]=13; + if (player_rollhp_display[i][1]<0) { + player_rollhp_display[i][1]=9; + player_rollhp_counter[i][1]=13; + player_rollhp_display[i][2]--; + player_rollhp_counter[i][2]=13; + } + } + } + if (player_rollhp_counter[i][0]>0) { + if (member->GetTargetHP()<-member->maxHP) { + player_rollhp_counter[i][0]-=HEALTH_ROLLING_SPEED+(member->maxHP-member->GetTargetHP())/10; + } else + if (member->GetTargetHP()<0) { + player_rollhp_counter[i][0]-=HEALTH_ROLLING_SPEED+(member->maxHP-member->GetTargetHP())/20; + } else { + player_rollhp_counter[i][0]-=HEALTH_ROLLING_SPEED; + } + } + if (player_rollhp_counter[i][1]>0) { + player_rollhp_counter[i][1]--; + } + if (player_rollhp_counter[i][2]>0) { + player_rollhp_counter[i][2]--; + } + } else + if (member->GetHP()GetTargetHP()) { + if (player_rollhp_counter[i][0]>=0&&player_rollwait_counter[i]==0) { + player_rollhp_display[i][0]++; + player_rollhp_counter[i][0]=-13; + member->_SetDirectHP(member->GetHP()+1); + if (player_rollhp_display[i][0]>9) { + player_rollhp_display[i][0]=0; + player_rollhp_counter[i][0]=-13; + player_rollhp_display[i][1]++; + player_rollhp_counter[i][1]=-13; + if (player_rollhp_display[i][1]>9) { + player_rollhp_display[i][1]=0; + player_rollhp_counter[i][1]=-13; + player_rollhp_display[i][2]++; + player_rollhp_counter[i][2]=-13; + } + } + } + if (player_rollhp_counter[i][0]<0) { + player_rollhp_counter[i][0]+=HEALTH_ROLLING_SPEED; + } + if (player_rollhp_counter[i][1]<0) { + player_rollhp_counter[i][1]++; + } + if (player_rollhp_counter[i][2]<0) { + player_rollhp_counter[i][2]++; + } + } else { + if (player_rollhp_counter[i][0]<0) { + player_rollhp_counter[i][0]++; + } + if (player_rollhp_counter[i][1]<0) { + player_rollhp_counter[i][1]++; + } + if (player_rollhp_counter[i][2]<0) { + player_rollhp_counter[i][2]++; + } + if (player_rollhp_counter[i][0]>0) { + player_rollhp_counter[i][0]--; + } + if (player_rollhp_counter[i][1]>0) { + player_rollhp_counter[i][1]--; + } + if (player_rollhp_counter[i][2]>0) { + player_rollhp_counter[i][2]--; + } + } + + if (player_rollwait_counter[i]==0) { + player_rollwait_counter[i]=BATTLE_ROLLING_COUNTER_WAITTIME*13; + } + } + switch (BATTLE_STATE) { + case BattleState::MOVE_CAMERA:{ + bool allDone=true; + if (!MoveCameraTowardsPoint(BATTLE_ENCOUNTER->pos,PriorityDirection::BOTH,BATTLE_CAMERA_MOVESPD)) { + allDone=false; + } + for (int i=0;iplayerPos[i]+BATTLE_ENCOUNTER->pos,PriorityDirection::BOTH,BATTLE_CAMERA_MOVESPD)) { + allDone=false; + } + } + if (allDone) { + CAMERA_WAIT_TIMER++; + if (CAMERA_WAIT_TIMER>=CAMERA_WAIT_TIME) { + for (int i=0;iGetHP()%10; + player_rollpp_display[i][j]=member->PP%10; + }break; + case 1:{ + player_rollhp_display[i][j]=member->GetHP()/10%10; + player_rollpp_display[i][j]=member->PP/10%10; + }break; + case 2:{ + player_rollhp_display[i][j]=member->GetHP()/100%10; + player_rollpp_display[i][j]=member->PP/100%10; + }break; + } + } + BATTLE_STATE=BattleState::WAIT; + } + } + } + }break; + case BattleState::WAIT:{ + BATTLE_ROLLING_COUNTER_WAITTIME=0; + bool done=false; + if (!done) { + for (int i=0;i<4;i++) { + if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->GetHP()>0) { + if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->selectedMove!=nullptr) { + if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->channelTimeRemaining>0) { + PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->channelTimeRemaining--; + } else { + //Attack is being done. + printf("%s performs %s.\n",PARTY_MEMBER_OBJ[i]->name.c_str(),PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->selectedMove->name.c_str()); + BATTLE_STATE=BattleState::WAIT_ANIMATION; + BATTLE_ANIMATION_TIMER=0; + CURRENT_TURN=-i-1; + done=true; + break; + } + } + } else { + PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->selectedMove=nullptr; + PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->channelTimeRemaining=0; + } + } + } + if (!done) { + for (int i=0;iobjs.size();i++) { + if (BATTLE_ENCOUNTER->objs[i]->GetHP()>0) { + if (BATTLE_ENCOUNTER->objs[i]->selectedMove!=nullptr) { + if (BATTLE_ENCOUNTER->objs[i]->channelTimeRemaining>0) { + BATTLE_ENCOUNTER->objs[i]->channelTimeRemaining--; + } else { + CURRENT_TURN=i; + printf("%s performs %s.\n",BATTLE_ENCOUNTER->objs[i]->obj->name.c_str(),BATTLE_ENCOUNTER->objs[i]->selectedMove->name.c_str()); + BATTLE_STATE=BattleState::WAIT_ANIMATION; + BATTLE_ANIMATION_TIMER=0; + done=true; + break; + } + } + } else { + BATTLE_ENCOUNTER->objs[i]->selectedMove=nullptr; + BATTLE_ENCOUNTER->objs[i]->channelTimeRemaining=0; + } + } + } + if (!done) { + for (int i=0;i<4;i++) { + if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->GetHP()>0) { + if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->selectedMove==nullptr) { + if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->atb>=1000) { + printf("%s ready.\n",PARTY_MEMBER_OBJ[i]->name.c_str()); + CURRENT_TURN=-i-1; + BATTLE_STATE=BattleState::SELECT_ACTION; + BATTLE_SELECTION_CURSOR=0; + POWER_GRADE_CURSOR[-CURRENT_TURN-1]=0; + done=true; + break; + } else { + PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->atb+=PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->speed; + } + } + } else { + PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->atb=0; + } + } + } + if (!done) { + for (int i=0;iobjs.size();i++) { + if (BATTLE_ENCOUNTER->objs[i]->GetHP()>0) { + if (BATTLE_ENCOUNTER->objs[i]->selectedMove==nullptr) { + if (BATTLE_ENCOUNTER->objs[i]->atb>=1000) { + printf("%s (%d) ready.\n",BATTLE_ENCOUNTER->objs[i]->obj->name.c_str(),i); + CURRENT_TURN=i; + //Enemy picks a random move from the movelist. And a random target. + BATTLE_ENCOUNTER->objs[i]->selectedMove=BATTLE_ENCOUNTER->objs[i]->moveSet[rand()%BATTLE_ENCOUNTER->objs[i]->moveSet.size()]; + BATTLE_ENCOUNTER->objs[i]->channelTimeRemaining=BATTLE_ENCOUNTER->objs[i]->selectedMove->channelTime; + if (BATTLE_ENCOUNTER->objs[i]->selectedMove->friendly) { + do { + BATTLE_ENCOUNTER->objs[i]->selectedTarget=rand()%BATTLE_ENCOUNTER->objs.size(); + } while (BATTLE_ENCOUNTER->objs[BATTLE_ENCOUNTER->objs[i]->selectedTarget]->GetHP()<=0); + } else { + bool playerAlive=false; + for (int i=0;iGetHP()>0) { + playerAlive=true; + break; + } + } + if (playerAlive) { + do { + BATTLE_ENCOUNTER->objs[i]->selectedTarget=-(rand()%PARTY_MEMBER_COUNT)-1; + } while (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-BATTLE_ENCOUNTER->objs[i]->selectedTarget-1]]->GetHP()<=0); + printf("Selected Target: %d\n",BATTLE_ENCOUNTER->objs[i]->selectedTarget); + } + } + printf(" %s chose move %s.\n",BATTLE_ENCOUNTER->objs[i]->obj->name.c_str(),BATTLE_ENCOUNTER->objs[i]->selectedMove->name.c_str()); + BATTLE_STATE=BattleState::WAIT; + BATTLE_SELECTION_CURSOR=0; + done=true; + break; + } else { + BATTLE_ENCOUNTER->objs[i]->atb+=BATTLE_ENCOUNTER->objs[i]->speed; + } + } + } else { + BATTLE_ENCOUNTER->objs[i]->atb=0; + } + } + } + }break; + case BattleState::WAIT_ANIMATION:{ + BATTLE_ROLLING_COUNTER_WAITTIME=5; + BATTLE_ANIMATION_TIMER++; + if (BATTLE_ANIMATION_TIMER==90) { + if (CURRENT_TURN<0) { + if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->friendly) { + if (PARTY_MEMBER_STATS[-PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget-1]->GetHP()>0) { + int healAmt = PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->baseDmg+ + ((PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->randomDmg>0)?rand()%PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->randomDmg:0) + +PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->baseAtk; + std::cout << PARTY_MEMBER_OBJ[-CURRENT_TURN-1]->name << " uses " << PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->name << " " << PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->grade << " on " << PARTY_MEMBER_OBJ[-PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget-1]->name << " recovering " << healAmt << " health.\n"; + PARTY_MEMBER_STATS[-PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget-1]->AddHP(healAmt); + } else { + std::cout << PARTY_MEMBER_OBJ[-CURRENT_TURN-1]->name << " uses " << PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->name << " " << PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->grade << " on " << PARTY_MEMBER_OBJ[-PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget-1]->name << " but it failed.\n"; + } + } else { + if (BATTLE_ENCOUNTER->objs[PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget]->GetHP()>0) { + int dmgAmt = PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->baseDmg+ + ((PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->randomDmg>0)?rand()%PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->randomDmg:0) + +PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->baseAtk; + std::cout << PARTY_MEMBER_OBJ[-CURRENT_TURN-1]->name << " uses " << PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->name << " " << PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->grade << " on " << BATTLE_ENCOUNTER->objs[PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget]->obj->name << " dealing " << dmgAmt << " health.\n"; + BATTLE_ENCOUNTER->objs[PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget]->_SetDirectHP( + BATTLE_ENCOUNTER->objs[PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget]->GetHP()-dmgAmt + ); //Enemies have their health directly set. + if (BATTLE_ENCOUNTER->objs[PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget]->GetHP()<=0) { + BATTLE_ENCOUNTER->objs[PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget]->obj->dead=true; + } + } else { + std::cout << PARTY_MEMBER_OBJ[-CURRENT_TURN-1]->name << " uses " << PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->name << " " << PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove->grade << " on " << BATTLE_ENCOUNTER->objs[PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedTarget]->obj->name << " but it failed.\n"; + } + } + } else { + if (BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->friendly) { + if (BATTLE_ENCOUNTER->objs[BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget]->GetHP()>0) { + int healAmt = BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->baseDmg+ + ((rand()%BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->randomDmg>0)?rand()%BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->randomDmg:0) + +BATTLE_ENCOUNTER->objs[CURRENT_TURN]->baseAtk; + std::cout << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->obj->name << " uses " << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->name << " " << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->grade << " on " << BATTLE_ENCOUNTER->objs[BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget]->obj->name << " recovering " << healAmt << " health.\n"; + BATTLE_ENCOUNTER->objs[BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget]->AddHP(healAmt); + } else { + std::cout << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->obj->name << " uses " << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->name << " " << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->grade << " on " << BATTLE_ENCOUNTER->objs[BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget]->obj->name << " but it failed.\n"; + } + } else { + if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget-1]]->GetHP()>0) { + int dmgAmt = BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->baseDmg+ + ((rand()%BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->randomDmg>0)?rand()%BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->randomDmg:0) + +BATTLE_ENCOUNTER->objs[CURRENT_TURN]->baseAtk; + std::cout << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->obj->name << " uses " << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->name << " " << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->grade << " on " << PARTY_MEMBER_OBJ[-BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget-1]->name << " dealing " << dmgAmt << " health.\n"; + PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget-1]]->SubtractHP(dmgAmt); + } else { + std::cout << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->obj->name << " uses " << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->name << " " << BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove->grade << " on " << PARTY_MEMBER_OBJ[-BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedTarget-1]->name << " but it failed.\n"; + } + } + } + } else + if (BATTLE_ANIMATION_TIMER>120) { + //Turn's done! + if (CURRENT_TURN<0) { + PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->selectedMove=nullptr; + PARTY_MEMBER_STATS[PARTY_MEMBER_ID[-CURRENT_TURN-1]]->atb=0; + BATTLE_STATE=BattleState::WAIT; + CURRENT_TURN=-99; + } else { + BATTLE_ENCOUNTER->objs[CURRENT_TURN]->selectedMove=nullptr; + BATTLE_ENCOUNTER->objs[CURRENT_TURN]->atb=0; + BATTLE_STATE=BattleState::WAIT; + } + + bool enemyStillAlive=false; + for (int i=0;iobjs.size();i++) { + if (BATTLE_ENCOUNTER->objs[i]->GetHP()>0) { + enemyStillAlive=true; + break; + } + } - void LoadEncounter(Map*map,vd2d pos,int chance,int id,bool successful) { - std::vectorents; - for (int i=0;iobjs.size();i++) { - Entity*ent=ENCOUNTER_LIST[id]->objs[i]; - Object*newObj=new Object(ent->obj->id,ent->obj->name,ent->obj->GetPos(),ent->obj->spr,ent->obj->GetScale(),ent->obj->color,ent->obj->animationSpd,ent->obj->temp); - ents.push_back(new Entity(newObj,ent->GetHP(),ent->maxHP,ent->PP,ent->maxPP,ent->baseAtk,ent->resistances,ent->speed,ent->moveSet,ent->damageReduction,ent->smart,ent->dumb)); - } - Encounter*data=new Encounter(id,pos,ENCOUNTER_LIST[id]->playerPos,ents,chance); - data->chance=chance; - data->id=id; - for (int i=0;iobjs.size();i++) { - data->objs[i]->obj->enc=true; - if (!successful) { - data->objs[i]->_SetDirectHP(0); - data->objs[i]->obj->dead=true; + if (!enemyStillAlive) { + BATTLE_ENCOUNTER=nullptr; + BATTLE_STATE=BattleState::MOVE_CAMERA; + for (int i=0;iatb=0; + PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->selectedMove=nullptr; + PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->channelTimeRemaining=0; + if (PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->GetTargetHP()>PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->GetHP()) { + PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->_SetDirectHP(PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->GetTargetHP()); + } else { + PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->SetTargetHP(PARTY_MEMBER_STATS[PARTY_MEMBER_ID[i]]->GetHP()); + } + } + } + } + }break; + case BattleState::SELECT_ACTION: + case BattleState::ITEM_SELECT: + case BattleState::GRADE_SELECT: + case BattleState::TARGET_SELECT: + case BattleState::POWER_SELECT:{ + BATTLE_ROLLING_COUNTER_WAITTIME=5; + }break; } } - map->encounters.push_back(data); - for (int i=0;iobjs.size();i++) { - AddObjectToWorld(data->objs[i]->obj); - data->objs[i]->obj->SetPos(data->objs[i]->obj->GetPos()+pos); - } - } - - void UpdatePlayerTrail(vd2d newMovement) { - for (int i=PARTY_TRAIL_LENGTH-1;i>0;i--) { - partyTrail[i]=partyTrail[i-1]; - } - partyTrail[0]=PARTY_MEMBER_OBJ[0]->GetPos()-newMovement; - for (int i=1;iSetPos(partyTrail[PARTY_TRAIL_LENGTH*((double)i/4)]); - } - } - - void drawBox(const olc::vi2d &pos, const olc::vi2d &size, olc::Pixel p = olc::WHITE, olc::Pixel p2 = olc::DARK_GREY, olc::Pixel p3 = olc::VERY_DARK_GREY) { - FillRectDecal({(float)(pos.x+3),(float)(pos.y+3)},{(float)(size.x-5),(float)(size.y-5)},p); - DrawRect({pos.x,pos.y},size,p2); - DrawRect({pos.x+2,pos.y+2},{size.x-4,size.y-4},p3); - DrawRect({pos.x+1,pos.y+1},{size.x-2,size.y-2},p); - Draw({pos.x,pos.y},olc::BLACK); - Draw({pos.x+size.x,pos.y+size.y},olc::BLACK); - Draw({pos.x+size.x,pos.y},olc::BLACK); - Draw({pos.x,pos.y+size.y},olc::BLACK); } - void drawCheckerboardBox(const olc::vi2d &pos, const olc::vi2d &size, olc::Pixel p = olc::WHITE, olc::Pixel alternatingCol = olc::WHITE, const olc::vi2d &checkerboardSize = {3,3}, olc::Pixel p2 = olc::DARK_GREY, olc::Pixel p3 = olc::VERY_DARK_GREY) { - drawBox(pos,size,p,p2,p3); - for (int x=3;xSetupEndingCutsceneFlag(((SetFlagWhenCutsceneEnds*)CurrentCutscene->GetAction())->GetCutsceneEndingFlag(),((SetFlagWhenCutsceneEnds*)CurrentCutscene->GetAction())->GetCutsceneEndingVal()); + CurrentCutscene->AdvanceAction(); + }break; + case ActionType::PAN_CAMERA:{ + PanCamera*cam=(PanCamera*)CurrentCutscene->GetAction(); + if (MoveCameraTowardsPoint(cam->GetCameraTargetPos(),cam->GetPriorityDirection(),cam->GetCameraSpeed())) { + CurrentCutscene->AdvanceAction(); } - } - } - } - - 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}); - } - - void ResetBattleState() { - CAMERA_WAIT_TIMER=0; - } - - std::string Wrap(std::string str,int width,bool proportional,vd2d scale) { - return to_string(Wrap(to_wstring(str),width,proportional,scale)); - } - - std::wstring Wrap(std::wstring str,int width,bool proportional,vd2d scale) { - int marker=0; - std::wstring newStr=L""; - bool firstChar=false; - while (markerwidth) { - do { - if (newStr[newStr.length()-1]!=' ') { - marker--; - //printf("%s\n",newStr.c_str()); + }break; + case ActionType::PAN_CAMERA_ASYNC:{ + AddAsyncCutsceneAction(PanCameraAsync); + }break; + case ActionType::MOVE_CUTSCENE_OBJ:{ + if (MoveObjectTowardsPoint(CurrentCutscene->GetCutsceneObjects()[((MoveCutsceneObject*)CurrentCutscene->GetAction())->GetObjectID()],((MoveCutsceneObject*)CurrentCutscene->GetAction())->GetTargetPos(),((MoveCutsceneObject*)CurrentCutscene->GetAction())->GetMovement(),((MoveCutsceneObject*)CurrentCutscene->GetAction())->GetMoveSpd())) { + CurrentCutscene->AdvanceAction(); + } + }break; + case ActionType::MOVE_CUTSCENE_OBJ_ASYNC:{ + AddAsyncCutsceneAction(MoveCutsceneObjectAsync); + }break; + case ActionType::CREATE_OBJECTS:{ + for (auto&obj:((CreateObjects*)CurrentCutscene->GetAction())->GetObjects()) { + obj->temp=true; + AddObjectToWorld(CurrentCutscene->AddCutsceneObject(new Object(obj->id,obj->name,obj->GetPos(),obj->spr,obj->GetScale(),obj->color,obj->animationSpd,true))); + } + CurrentCutscene->AdvanceAction(); + }break; + case ActionType::CLEANUP:{ + if (CUTSCENE_QUEUE.size()==0) { + for (int i=0;itemp) { + delete OBJECTS[i]; + OBJECTS.erase(OBJECTS.begin()+i--); + } else { + OBJECTS[i]->objArrElement=i; + } } - newStr.erase(newStr.end()-1); - } while (newStr[newStr.length()-1]!=' '); - //newStr.erase(newStr.end()-1); - newStr+='\n'; - firstChar=false; - } else { - firstChar=true; - marker++; - } + CurrentCutscene->CleanupCutscene(); + CurrentCutscene->ResetCutscene(); + SetGameFlag(CurrentCutscene->GetEndingCutsceneFlag(),CurrentCutscene->GetEndingCutsceneVal()); + CurrentCutscene=nullptr; + CurrentAction=ActionType::NONE; + } + }break; + case ActionType::FADE:{ + if (((Fade*)CurrentCutscene->GetAction())->FadeIn()&&CUTSCENE_FADE_VALUE>0) { + CUTSCENE_FADE_VALUE=std::clamp(CUTSCENE_FADE_VALUE-((Fade*)CurrentCutscene->GetAction())->GetFadeSpd(),0.0,255.0); + if (CUTSCENE_FADE_VALUE==0) { + CurrentCutscene->AdvanceAction(); + } + } else + if (!((Fade*)CurrentCutscene->GetAction())->FadeIn()&&CUTSCENE_FADE_VALUE<255) { + CUTSCENE_FADE_VALUE=std::clamp(CUTSCENE_FADE_VALUE+((Fade*)CurrentCutscene->GetAction())->GetFadeSpd(),0.0,255.0); + if (CUTSCENE_FADE_VALUE==255) { + CurrentCutscene->AdvanceAction(); + } + } + }break; + case ActionType::FADE_ASYNC:{ + AddAsyncCutsceneAction(FadeAsync); + }break; + case ActionType::DIALOG:{ + if (!((DialogBox*)CurrentCutscene->GetAction())->MessageHasBeenShown()) { + DisplayMessageBox(((DialogBox*)CurrentCutscene->GetAction())->GetMessage()); + ((DialogBox*)CurrentCutscene->GetAction())->SetMessageBoxVisible(); + } else + if (!messageBoxVisible) { + CurrentCutscene->AdvanceAction(); + } + }break; + case ActionType::DIALOG_ASYNC:{ + DisplayMessageBox(((DialogBox*)CurrentCutscene->GetAction())->GetMessage()); + CurrentCutscene->AdvanceAction(); + }break; + case ActionType::MODIFY_OBJECT:{ + ModifyObject*action=(ModifyObject*)CurrentCutscene->GetAction(); + Object*obj=CurrentCutscene->GetCutsceneObjects()[action->GetCutsceneObjID()]; + obj->SetScale(action->GetObjScale()); + obj->color=action->GetObjCol(); + obj->spr=action->GetObjSpr(); + if (action->GetFrameIndex()!=-1) { + obj->frameIndex=action->GetFrameIndex(); + } + obj->animationSpd=action->GetAnimationSpeed(); + CurrentCutscene->AdvanceAction(); + }break; } - return newStr; - } - //Returns -1 if not found. - int getProperty(Property prop,Battle::Move*move) { - for (int i=0;iproperties.size();i++) { - std::pair p = move->properties[i]; - if (p.first==prop) { - return p.second; + for (int i=0;iGetActionType()) { + case ActionType::PAN_CAMERA_ASYNC:{ + PanCameraAsync*cam=(PanCameraAsync*)CUTSCENE_QUEUE[i]; + if (MoveCameraTowardsPoint(cam->GetCameraTargetPos(),cam->GetPriorityDirection(),cam->GetCameraSpeed())) { + CUTSCENE_QUEUE.erase(CUTSCENE_QUEUE.begin()+i--); + } + }break; + case ActionType::MOVE_CUTSCENE_OBJ_ASYNC:{ + if (MoveObjectTowardsPoint(CurrentCutscene->GetCutsceneObjects()[((MoveCutsceneObjectAsync*)CUTSCENE_QUEUE[i])->GetObjectID()],((MoveCutsceneObjectAsync*)CUTSCENE_QUEUE[i])->GetTargetPos(),((MoveCutsceneObjectAsync*)CUTSCENE_QUEUE[i])->GetMovement(),((MoveCutsceneObjectAsync*)CUTSCENE_QUEUE[i])->GetMoveSpd())) { + CUTSCENE_QUEUE.erase(CUTSCENE_QUEUE.begin()+i--); + } + }break; + case ActionType::FADE_ASYNC:{ + if (((FadeAsync*)CUTSCENE_QUEUE[i])->FadeIn()&&CUTSCENE_FADE_VALUE>0) { + CUTSCENE_FADE_VALUE=std::clamp(CUTSCENE_FADE_VALUE-((FadeAsync*)CUTSCENE_QUEUE[i])->GetFadeSpd(),0.0,255.0); + if (CUTSCENE_FADE_VALUE==0) { + CUTSCENE_QUEUE.erase(CUTSCENE_QUEUE.begin()+i--); + } + } else + if (!((FadeAsync*)CUTSCENE_QUEUE[i])->FadeIn()&&CUTSCENE_FADE_VALUE<255) { + CUTSCENE_FADE_VALUE=std::clamp(CUTSCENE_FADE_VALUE+((FadeAsync*)CUTSCENE_QUEUE[i])->GetFadeSpd(),0.0,255.0); + if (CUTSCENE_FADE_VALUE==255) { + CUTSCENE_QUEUE.erase(CUTSCENE_QUEUE.begin()+i--); + } + } + }break; } } - return -1; } };