#define OLC_PGE_APPLICATION #include "pixelGameEngine.h" #define OLC_PGEX_SPLASHSCREEN #include "splash.h" #define OLC_SOUNDWAVE #include "soundwaveEngine.h" #include "tiles.h" #include "references.h" #include "states.h" #include "flags.h" #include #include "cutscene.h" #include "encounters.h" #define WIDTH 256 #define HEIGHT 224 #define TILEMAP_SIZE_X 512 #define TILEMAP_SIZE_Y 512 #define TILEMAP_EDITOR_DRAW_MULT 0.4375 #define TILEMAP_EDITOR_TILESIZE (32*TILEMAP_EDITOR_DRAW_MULT) #define AddAsyncCutsceneAction(AsyncClass) \ if (!((AsyncClass*)CurrentCutscene->GetAction())->InQueue()) { \ CUTSCENE_QUEUE.push_back(CurrentCutscene->GetAction()); \ } \ ((AsyncClass*)CurrentCutscene->GetAction())->SetQueued(); \ CurrentCutscene->AdvanceAction(); \ #define 액션 (CutsceneAction*)new using namespace olc; namespace layer{ enum layer{ INTERFACE, //Interface items should be on this layer. On top of everything. COLLISION, //Collision checking layer. This layer is HIGH, DYNAMIC, GROUND, BACKGROUND, OBJECT, //The object layer doesn't actually exist, it's used to tell the editor we are adding an object instead. }; } class Animation{ public: Decal*spr; int frames=1; int width=0; Animation(Decal*spr,int width){ this->frames=spr->sprite->width/width; this->width=width; this->spr=spr; } }; class Object{ private: vd2d scale={1,1}; public: int id; Animation*spr; vd2d pos; int frameIndex=0; int frameCount=0; int animationSpd=12; //How many frames to wait between each frame. Setting to 0 pauses the animation. std::string name; Pixel color=WHITE; vd2d originPoint={0,0}; bool drawn=false; Flag disableFlag=Flag::NONE; Flag enableFlag=Flag::NONE; int objArrElement; //Which element in the object array this object is located in. For sorting purposes. bool temp=false; //If set to true, it's marked for deletion after cutscene handling. //animationSpd is how long to wait before switching frames. Object(int id,std::string name,vd2d pos,Animation*spr,vd2d scale={1,1},Pixel color=WHITE,int animationSpd=1,bool temp=false) { this->spr=spr; this->pos=pos; this->id=id; this->name=name; this->color=color; this->animationSpd=animationSpd; SetScale(scale); this->temp=temp; } void SetScale(vd2d scale) { this->scale=scale; this->originPoint={spr->width/2*scale.x,(spr->spr->sprite->height-4)*scale.y}; } vd2d GetScale() { return scale; } }; enum class Resistance{ WET, DRY, COLD, HEAT, }; enum class Property{ PETRIFY, PARALYZE, DIAMONDIZE, CRYING, SLOW, MUSHROOMIZED, CONFUSE, POISON, REGEN, DEFENSE_UP, }; namespace Battle{ class Move{ public: std::string name; int composition[4]; int baseDmg; //The base damage of the attack. int randomDmg; //Additional random roll damage to add onto the base damage. bool pctDamage; //Uses % damage for the base damage instead of flat damage. std::vector> properties; //The int is used to determine the chance of something occurring. Move(std::string name,int baseDmg,int randomDmg,int composition[4]={},bool pctDamage=false,std::vector> properties={}) :name(name),randomDmg(randomDmg),baseDmg(baseDmg),pctDamage(pctDamage),properties(properties){ for (int i=0;i<4;i++) { this->composition[i]=composition[i]; } } }; } class Entity{ public: int HP=0; int targetHP=0; int maxHP=0; int resistances[4]={0,0,0,0}; int speed=0; int baseAtk=0; int damageReduction=0; //A percentage of how much damage to reduce. bool smart=false; bool dumb=false; Object* obj; std::vector moveSet; Entity(Object*obj,int HP,int maxHP,int baseAtk,std::arrayresistances,int speed,std::vectormoveSet,int damageReduction=0,bool smart=false,bool dumb=false) { this->obj=obj; this->HP=this->targetHP=HP; this->maxHP=maxHP; for (int i=0;i<4;i++) { this->resistances[i]=resistances[i]; } this->speed=speed; this->moveSet=moveSet; this->smart=smart; this->dumb=dumb; this->baseAtk=baseAtk; this->damageReduction=damageReduction; } }; class Encounter{ public: vd2d pos; int chance; //Chance of the encounter existing. std::vectorobjs; Encounter(vd2d pos,std::vectorobjs,int chance=25) :pos(pos),objs(objs),chance(chance){} }; class Map{ public: std::string filename; std::string l2filename; std::string l3filename; std::string l4filename; std::string l5filename; Decal*tileset; std::vector encounters; Map(std::string fname,std::string layer2_fname,std::string layer3_fname,std::string layer4_fname,std::string layer5_fname,Decal*tileset) { this->filename=fname; this->l2filename=layer2_fname; this->l3filename=layer3_fname; this->l4filename=layer4_fname; this->l5filename=layer5_fname; this->tileset=tileset; } }; class SeasonI : public PixelGameEngine { public: SeasonI() { sAppName = "Season I: Winters of Loneliness"; } public: int frameCount=0; float elapsedTime=0; const float TARGET_RATE = 1/60.0; int MAP_WIDTH=-1; int MAP_HEIGHT=-1; Map*CURRENT_MAP; Map*MAP_ONETT; int GAME_STATE = GameState::EDITOR; vi2d SELECTED_TILE={0,0}; vi2d HIGHLIGHTED_TILE={0,0}; int EDITING_LAYER=layer::DYNAMIC; int SELECTED_OBJ_ID = PLAYER; int OBJ_DISPLAY_OFFSET = 0; vd2d cameraPos = {0,0}; bool GAME_FLAGS[128]={}; Object* PLAYER_OBJ; bool messageBoxVisible=false; std::string messageBoxText=""; std::string targetText=""; std::string messageBoxFinalText=""; int messageBoxMarker=0; int messageBoxStartMarker=0; //Start of text display. int messageBoxStopMarker=0; //End of text display for current printout. int messageBoxFrameWaitTime=1; bool messageBoxLoad=false; //Set to true when ready to load a message in. std::map additionalChars; Cutscene*TestCutscene; Cutscene*CurrentCutscene=nullptr; ActionType CurrentAction=ActionType::NONE; double CUTSCENE_FADE_VALUE=0; std::vectorCUTSCENE_QUEUE; bool MOUSE_PRESSED_DOWN=false,MOUSE_DOWN=false,MOUSE_RELEASED=false; //TODO Implement Mouse things. std::vector> MAP; //The foreground layer. std::vector> MAP2; std::vector> MAP3; std::vector> MAP4; std::vector> MAP5; //Collision Layer std::map SPRITES; std::map ANIMATIONS; std::map OBJ_INFO; std::vector OBJECTS; bool OnUserCreate() override { for (int i=1;i<6;i++) { CreateLayer(); EnableLayer(i,true); } SetPixelMode(Pixel::ALPHA); ConsoleCaptureStdOut(true); // Called once at the start, so create things here EnableLayer(layer::COLLISION,false); SetupAnimations(); SetupObjectInfo(); SetGameFlag(Flag::TEST_FLAG1,false); SetGameFlag(Flag::TEST_FLAG2,false); SetGameFlag(Flag::TEST_FLAG3,false); additionalChars[0x391]={0,0}; additionalChars[0x392]={8,0}; additionalChars[0x3b3]={16,0}; additionalChars[0x3a3]={24,0}; additionalChars[0x3a9]={32,0}; MAP_ONETT=new Map("map0","map0_2","map0_3","map0_4","map0_5",SPRITES["terrainmap.png"]); CURRENT_MAP=MAP_ONETT; //OBJ_INFO["PLAYER"]=PLAYER_ANIMATION; LoadMap(MAP_ONETT); TestCutscene=new Cutscene({ 액션 Fade(), 액션 CreateObjects({ new Object(PLAYER,"player",{64,64},ANIMATIONS["player.png"],{1,1},MAGENTA), new Object(PLAYER,"player",{136,136},ANIMATIONS["player.png"],{1,1},RED), new Object(PLAYER,"player",{96,96},ANIMATIONS["player.png"],{1,1},DARK_GREEN), }), 액션 Fade(true), 액션 SetFlagWhenCutsceneEnds(Flag::TEST_FLAG1), 액션 PanCamera({128,128},BOTH,1), 액션 MoveCutsceneObjectAsync(1,{80,64},5), 액션 PanCamera({64,0},BOTH), 액션 DialogBoxAsync(R"(Hello! This is a test message that lets us trigger straight from a cutscene! Cool!)"), 액션 ModifyObject(0,ANIMATIONS["player.png"],{5,5},MAGENTA), 액션 MoveCutsceneObject(1,{320,64},1),}); /*DisplayMessageBox(R"(Hello World! This is a rather long message, but I hope it reaches you well in some form or capacity or another. Even though it goes on a very long time, I hope you can understand this is only for testing purposes! )");*/ return true; } bool OnUserUpdate(float fElapsedTime) override { elapsedTime+=fElapsedTime; while (elapsedTime>TARGET_RATE) { elapsedTime-=TARGET_RATE; updateGame(); } keyUpdates(); SetDrawTarget(nullptr); Clear(BLANK); SetDrawTarget(layer::COLLISION); if (EDITING_LAYER!=layer::COLLISION) { Clear(MAGENTA); } else { Clear(BLANK); } SetDrawTarget(layer::HIGH); Clear(BLANK); SetDrawTarget(layer::DYNAMIC); Clear(BLANK); SetDrawTarget(layer::GROUND); Clear(BLANK); SetDrawTarget(layer::BACKGROUND); Clear(BLANK); drawGame(); return true; } void GetAnyKeyPress() override { if (messageBoxVisible) { if (messageBoxMarker==messageBoxFinalText.length()) { if (messageBoxStartMarker+messageBoxStopMarkeranimationSpd!=0&&obj->frameCount++>obj->animationSpd) { obj->frameCount=0; obj->frameIndex++; } } if (GetCurrentCutsceneAction()!=ActionType::NONE) { CurrentAction=GetCurrentCutsceneAction(); CurrentCutscene->LockAction(); } if (!GetGameFlag(Flag::TEST_FLAG1)) { StartCutscene(TestCutscene); } 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:{ if (MoveCameraTowardsPoint((PanCamera*)CurrentCutscene->GetAction())) { 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(); } }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->pos,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--); } } 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; } for (int i=0;iGetActionType()) { case ActionType::PAN_CAMERA_ASYNC:{ if (MoveCameraTowardsPoint((PanCameraAsync*)CUTSCENE_QUEUE[i])) { 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::EDITOR:{ if (TabHeld()) { GAME_STATE=GameState::TILE_SELECT; } if (PlayerCanMove()) { if (GetKey(I).bHeld) { SmoothMove(PLAYER_OBJ,{0,-1}); } if (GetKey(K).bHeld) { SmoothMove(PLAYER_OBJ,{0,1}); } if (GetKey(J).bHeld) { SmoothMove(PLAYER_OBJ,{-1,0}); } if (GetKey(L).bHeld) { SmoothMove(PLAYER_OBJ,{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) { 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 (messageBoxMarkerpos==HIGHLIGHTED_TILE*32) { delete OBJECTS[i]; OBJECTS.erase(OBJECTS.begin()+i--); } } } }break; case GameState::OBJ_SELECT:{ if (GetKey(ESCAPE).bPressed) { GAME_STATE=GameState::EDITOR; } if ((GetMouseWheel()<0||GetKey(PGDN).bHeld)&&OBJ_DISPLAY_OFFSET+(WIDTH/16)0||GetKey(PGUP).bHeld)&&OBJ_DISPLAY_OFFSET-(WIDTH/16)>=0) { OBJ_DISPLAY_OFFSET-=WIDTH/16; } }break; } } void drawGame(){ for (auto&obj:OBJECTS) { obj->drawn=false; } switch (GAME_STATE) { case GameState::EDITOR:{ for (int y=-1;ydrawn&&obj->pos.y+obj->originPoint.y>(y+yTileOffset)*32&&obj->pos.y+obj->originPoint.y<=(y+yTileOffset+1)*32) { obj->drawn=true; SetDrawTarget(layer::DYNAMIC); DrawPartialDecal(obj->pos-cameraPos,obj->spr->spr,{(obj->frameIndex%obj->spr->frames)*obj->spr->width,0},{obj->spr->width,obj->spr->spr->sprite->height},obj->GetScale(),obj->color); } } for (int x=-1;x=0&&x+xTileOffset=0&&y+yTileOffsettileX*MAP5[y+yTileOffset][x+xTileOffset]->tileY!=225) { SetDrawTarget(layer::COLLISION); DrawPartialSprite({x*32-fmod(cameraPos.x,32),y*32-fmod(cameraPos.y,32)},SPRITES["terrainmap.png"]->sprite,{MAP5[y+yTileOffset][x+xTileOffset]->tileX*32,MAP5[y+yTileOffset][x+xTileOffset]->tileY*32},{32,32}); } if(MAP4[y+yTileOffset][x+xTileOffset]->tileX*MAP4[y+yTileOffset][x+xTileOffset]->tileY!=225) { SetDrawTarget(layer::BACKGROUND); DrawPartialDecal({x*32-fmod(cameraPos.x,32),y*32-fmod(cameraPos.y,32)},SPRITES["terrainmap.png"],{MAP4[y+yTileOffset][x+xTileOffset]->tileX*32,MAP4[y+yTileOffset][x+xTileOffset]->tileY*32},{32,32}); } if(MAP3[y+yTileOffset][x+xTileOffset]->tileX*MAP3[y+yTileOffset][x+xTileOffset]->tileY!=225) { SetDrawTarget(layer::GROUND); DrawPartialDecal({x*32-fmod(cameraPos.x,32),y*32-fmod(cameraPos.y,32)},SPRITES["terrainmap.png"],{MAP3[y+yTileOffset][x+xTileOffset]->tileX*32,MAP3[y+yTileOffset][x+xTileOffset]->tileY*32},{32,32}); } if(MAP2[y+yTileOffset][x+xTileOffset]->tileX*MAP2[y+yTileOffset][x+xTileOffset]->tileY!=225) { SetDrawTarget(layer::DYNAMIC); DrawPartialDecal({x*32-fmod(cameraPos.x,32),y*32-fmod(cameraPos.y,32)},SPRITES["terrainmap.png"],{MAP2[y+yTileOffset][x+xTileOffset]->tileX*32,MAP2[y+yTileOffset][x+xTileOffset]->tileY*32},{32,32}); } if(MAP[y+yTileOffset][x+xTileOffset]->tileX*MAP[y+yTileOffset][x+xTileOffset]->tileY!=225) { SetDrawTarget(layer::HIGH); DrawPartialDecal({x*32-fmod(cameraPos.x,32),y*32-fmod(cameraPos.y,32)},SPRITES["terrainmap.png"],{MAP[y+yTileOffset][x+xTileOffset]->tileX*32,MAP[y+yTileOffset][x+xTileOffset]->tileY*32},{32,32}); } } } } SetDrawTarget(nullptr); DrawRectDecal((HIGHLIGHTED_TILE)*32-cameraPos,{32,32},YELLOW); /*if (EDITING_LAYER==layer::OBJECT) { DrawStringPropDecal({2,2},"Editing Objects"); } else { DrawStringPropDecal({2,2},"Editing Layer "+std::to_string(EDITING_LAYER)); }*/ }break; case GameState::TILE_SELECT:{ //14x14 pixels per tile. DrawDecal({0,0},SPRITES["terrainmap.png"],{TILEMAP_EDITOR_DRAW_MULT,TILEMAP_EDITOR_DRAW_MULT}); DrawRectDecal(SELECTED_TILE*(TILEMAP_EDITOR_TILESIZE),{TILEMAP_EDITOR_TILESIZE,TILEMAP_EDITOR_TILESIZE},RED); }break; case GameState::OBJ_SELECT:{ vd2d drawpos={0,0}; int counter=0; for (std::map::const_iterator it = OBJ_INFO.cbegin();it!=OBJ_INFO.cend();++it){ if (counterHEIGHT) { break; } Object*obj = it->second; if (GetMouse(0).bHeld&& GetMousePos().x>=drawpos.x&& GetMousePos().x=drawpos.y&& GetMousePos().yid; EDITING_LAYER=layer::OBJECT; } FillRectDecal(drawpos,{16,24},VERY_DARK_GREY); DrawPartialDecal({drawpos.x,drawpos.y+8},{16,16},obj->spr->spr,{(obj->frameIndex%obj->spr->frames)*obj->spr->width,0},{obj->spr->width,obj->spr->spr->sprite->height},obj->color); DrawStringDecal({drawpos.x+2,drawpos.y},obj->name,WHITE,{12.0/GetTextSize(obj->name).x,1.0}); if (SELECTED_OBJ_ID==obj->id) { DrawRectDecal(drawpos,{16,24},YELLOW); } drawpos.x+=16; if (drawpos.x>=WIDTH) { drawpos.x=0; drawpos.y+=24; } counter++; } }break; } if (messageBoxVisible) { SetDrawTarget(layer::INTERFACE); DrawDialogBox({1,1},{WIDTH/2,HEIGHT/4},Pixel(70, 33, 105,128),Pixel(62, 54, 69,128),Pixel(185, 148, 255,128)); DrawStringPropDecal({6,6},messageBoxText); } SetDrawTarget(layer::INTERFACE); FillRectDecal({0,0},{WIDTH,HEIGHT},Pixel(0,0,0,(int)CUTSCENE_FADE_VALUE)); }; 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) { newpos.x+=8*scale.x; DrawPartialDecal(newpos,SPRITES["additionalFont.png"],additionalChars[sText[i]],{8,8},scale,col); } else if (sText[i]!='\n') { newpos.x+=8*scale.x; DrawStringDecal(newpos,std::string(1,sText[i]),col,scale); } else if (sText[i]=='\n') { newpos.x=pos.x; newpos.y+=8*scale.y; DrawStringDecal(newpos,std::string(1,sText[i]),col,scale); } } } void LoadMap(Map*map) { std::ifstream f("assets/maps/"+map->filename,std::ios::binary); std::ifstream f2("assets/maps/"+map->l2filename,std::ios::binary); std::ifstream f3("assets/maps/"+map->l3filename,std::ios::binary); std::ifstream f4("assets/maps/"+map->l4filename,std::ios::binary); std::ifstream f5("assets/maps/"+map->l5filename,std::ios::binary); for (int i=0;i>data; if (MAP_WIDTH==-1) { MAP_WIDTH=data.length()/2; } if (data.find("OBJECT")!=std::string::npos||data.find("ENCOUNTER")!=std::string::npos) { int marker=data.find_first_of(';'); int lastMarker=marker; std::stringstream split1(data.substr(6,marker-6)); marker=data.find_first_of(';',marker+1); std::stringstream split2(data.substr(lastMarker+1,marker-lastMarker-1)); lastMarker=marker; marker=data.find_first_of(';',marker+1); std::stringstream split3(data.substr(lastMarker+1,marker-lastMarker-1)); lastMarker=marker; double x,y; split1>>x; split2>>y; int id; split3>>id; if (data.find("OBJECT")!=std::string::npos) { bool enabled=true; if (OBJ_INFO[id]->disableFlag!=Flag::NONE) { if (GetGameFlag(OBJ_INFO[id]->disableFlag)) { enabled=false; } } if (OBJ_INFO[id]->enableFlag!=Flag::NONE) { if (!GetGameFlag(OBJ_INFO[id]->enableFlag)) { enabled=false; } } if (enabled) { AddObjectToWorld(CreateObject(id,{x,y})); } printf("Object %s Loaded.\n",OBJ_INFO[id]->name.c_str()); } else if (data.find("ENCOUNTER")!=std::string::npos) { marker=data.find_first_of(';',marker+1); std::stringstream split4(data.substr(lastMarker+1,marker-lastMarker-1)); lastMarker=marker; int pct=id; split4>>id; printf("Encounter %d (%d%) Loaded.\n",id,pct); } } else { std::vector tiles; printf("%s\n",data.c_str()); for (int i=0;i>data; std::vector tiles; for (int i=0;i>data; std::vector tiles; for (int i=0;i>data; std::vector tiles; for (int i=0;i>data; std::vector tiles; for (int i=0;ifilename.c_str()); f.close(); f2.close(); f3.close(); f4.close(); f5.close(); } void SaveMap(Map*map) { std::ofstream f("assets/maps/"+map->filename,std::ios::binary); std::ofstream f2("assets/maps/"+map->l2filename,std::ios::binary); std::ofstream f3("assets/maps/"+map->l3filename,std::ios::binary); std::ofstream f4("assets/maps/"+map->l4filename,std::ios::binary); std::ofstream f5("assets/maps/"+map->l5filename,std::ios::binary); printf("Map width: %d, Map Height: %d::\n",MAP_WIDTH,MAP_HEIGHT); for (int y=0;ytileX+'0');f.put(MAP[y][x]->tileY+'0'); f2.put(MAP2[y][x]->tileX+'0');f2.put(MAP2[y][x]->tileY+'0'); f3.put(MAP3[y][x]->tileX+'0');f3.put(MAP3[y][x]->tileY+'0'); f4.put(MAP4[y][x]->tileX+'0');f4.put(MAP4[y][x]->tileY+'0'); f5.put(MAP5[y][x]->tileX+'0');f5.put(MAP5[y][x]->tileY+'0'); } if (y!=MAP_HEIGHT-1) { f.put('\n'); f2.put('\n'); f3.put('\n'); f4.put('\n'); f5.put('\n'); } } for (int i=0;ipos.x)+";"+std::to_string(OBJECTS[i]->pos.y)+";"+std::to_string(OBJECTS[i]->id); for (int i=0;iname,pos,OBJ_INFO[id]->spr,OBJ_INFO[id]->GetScale(),OBJ_INFO[id]->color,OBJ_INFO[id]->animationSpd); } Object*CreateObjectInfo(Reference ref,std::string name,vd2d pos,std::string spriteFileName,int sprWidth,vd2d scale={1,1},Pixel tint=WHITE,Flag enableFlag=Flag::NONE,Flag disableFlag=Flag::NONE,int animationDelay=1) { if (!ANIMATIONS.count(spriteFileName)) { ANIMATIONS[spriteFileName] = new Animation(SPRITES[spriteFileName]=CreateSprite(spriteFileName),32); } Object*newObj = new Object(ref,name,pos,ANIMATIONS[spriteFileName],scale,tint,animationDelay); newObj->disableFlag=disableFlag; newObj->enableFlag=enableFlag; OBJ_INFO[ref]=newObj; return newObj; } void SetupAnimations() { CreateSprite("terrainmap.png"); CreateSprite("additionalFont.png"); } void SetupObjectInfo() { CreateObjectInfo(PLAYER,"player",{0,0},"player.png",32,{1,1},WHITE); CreateObjectInfo(NPC1,"npc1",{0,0},"player.png",32,{1,1},RED,Flag::NONE,Flag::NONE,60); CreateObjectInfo(NPC2,"npc2",{0,0},"player.png",32,{1,1},GREEN,Flag::NONE,Flag::NONE,2); CreateObjectInfo(NPC3,"npc3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC4,"npc4",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC5,"npc5",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC6,"npc6",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC7,"npc7",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC8,"npc8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC9,"npc9",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC10,"npc10",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC11,"npc11",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC12,"npc12",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC13,"npc13",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC13,"npc14",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC14,"npc15",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC15,"npc16",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC16,"npc17",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC17,"npc18",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC18,"npc19",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC19,"npc20",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC1_2,"npc1_2",{0,0},"player.png",32,{1,1},RED,Flag::NONE,Flag::NONE,60); CreateObjectInfo(NPC2_2,"npc2_2",{0,0},"player.png",32,{1,1},GREEN,Flag::NONE,Flag::NONE,2); CreateObjectInfo(NPC3_2,"npc3_2",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC4_2,"npc4_2",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC5_2,"npc5_2",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC6_2,"npc6_2",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC7_2,"npc7_2",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC8_2,"npc8_2",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC9_2,"npc9_2",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC10_2,"npc10_2",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC11_2,"npc11_2",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC12_2,"npc12_2",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC13_2,"npc13_2",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC13_2,"npc14_2",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC14_2,"npc15_2",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC15_2,"npc16_2",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC16_2,"npc17_2",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC17_2,"npc18_2",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC18_2,"npc19_2",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC19_2,"npc20_2",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC1_3,"npc1_3",{0,0},"player.png",32,{1,1},RED,Flag::NONE,Flag::NONE,60); CreateObjectInfo(NPC2_3,"npc2_3",{0,0},"player.png",32,{1,1},GREEN,Flag::NONE,Flag::NONE,2); CreateObjectInfo(NPC3_3,"npc3_3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC4_3,"npc4_3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC5_3,"npc5_3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC6_3,"npc6_3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC7_3,"npc7_3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC8_3,"npc8_3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC9_3,"npc9_3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC10_3,"npc10_3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC11_3,"npc11_3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC12_3,"npc12_3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC13_3,"npc13_3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC13_3,"npc14_3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC14_3,"npc15_3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC15_3,"npc16_3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC16_3,"npc17_3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC17_3,"npc18_3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC18_3,"npc19_3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC19_3,"npc20_3",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC1_4,"npc1_4",{0,0},"player.png",32,{1,1},RED,Flag::NONE,Flag::NONE,60); CreateObjectInfo(NPC2_4,"npc2_4",{0,0},"player.png",32,{1,1},GREEN,Flag::NONE,Flag::NONE,2); CreateObjectInfo(NPC3_4,"npc3_4",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC4_4,"npc4_4",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC5_4,"npc5_4",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC6_4,"npc6_4",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC7_4,"npc7_4",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC8_4,"npc8_4",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC9_4,"npc9_4",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC10_4,"npc10_4",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC11_4,"npc11_4",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC12_4,"npc12_4",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC13_4,"npc13_4",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC13_4,"npc14_4",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC14_4,"npc15_4",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC15_4,"npc16_4",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC16_4,"npc17_4",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC17_4,"npc18_4",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC18_4,"npc19_4",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC19_4,"npc20_4",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC1_5,"npc1_5",{0,0},"player.png",32,{1,1},RED,Flag::NONE,Flag::NONE,60); CreateObjectInfo(NPC2_5,"npc2_5",{0,0},"player.png",32,{1,1},GREEN,Flag::NONE,Flag::NONE,2); CreateObjectInfo(NPC3_5,"npc3_5",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC4_5,"npc4_5",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC5_5,"npc5_5",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC6_5,"npc6_5",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC7_5,"npc7_5",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC8_5,"npc8_5",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC9_5,"npc9_5",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC10_5,"npc10_5",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC11_5,"npc11_5",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC12_5,"npc12_5",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC13_5,"npc13_5",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC13_5,"npc14_5",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC14_5,"npc15_5",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC15_5,"npc16_5",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC16_5,"npc17_5",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC17_5,"npc18_5",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC18_5,"npc19_5",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC19_5,"npc20_5",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC1_6,"npc1_6",{0,0},"player.png",32,{1,1},RED,Flag::NONE,Flag::NONE,60); CreateObjectInfo(NPC2_6,"npc2_6",{0,0},"player.png",32,{1,1},GREEN,Flag::NONE,Flag::NONE,2); CreateObjectInfo(NPC3_6,"npc3_6",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC4_6,"npc4_6",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC5_6,"npc5_6",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC6_6,"npc6_6",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC7_6,"npc7_6",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC8_6,"npc8_6",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC9_6,"npc9_6",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC10_6,"npc10_6",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC11_6,"npc11_6",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC12_6,"npc12_6",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC13_6,"npc13_6",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC13_6,"npc14_6",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC14_6,"npc15_6",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC15_6,"npc16_6",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC16_6,"npc17_6",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC17_6,"npc18_6",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC18_6,"npc19_6",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC19_6,"npc20_6",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC1_7,"npc1_7",{0,0},"player.png",32,{1,1},RED,Flag::NONE,Flag::NONE,60); CreateObjectInfo(NPC2_7,"npc2_7",{0,0},"player.png",32,{1,1},GREEN,Flag::NONE,Flag::NONE,2); CreateObjectInfo(NPC3_7,"npc3_7",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC4_7,"npc4_7",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC5_7,"npc5_7",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC6_7,"npc6_7",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC7_7,"npc7_7",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC8_7,"npc8_7",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC9_7,"npc9_7",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC10_7,"npc10_7",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC11_7,"npc11_7",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC12_7,"npc12_7",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC13_7,"npc13_7",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC13_7,"npc14_7",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC14_7,"npc15_7",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC15_7,"npc16_7",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC16_7,"npc17_7",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC17_7,"npc18_7",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC18_7,"npc19_7",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC19_7,"npc20_7",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC1_8,"npc1_8",{0,0},"player.png",32,{1,1},RED,Flag::NONE,Flag::NONE,60); CreateObjectInfo(NPC2_8,"npc2_8",{0,0},"player.png",32,{1,1},GREEN,Flag::NONE,Flag::NONE,2); CreateObjectInfo(NPC3_8,"npc3_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC4_8,"npc4_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC5_8,"npc5_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC6_8,"npc6_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC7_8,"npc7_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC8_8,"npc8_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC9_8,"npc9_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC10_8,"npc10_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC11_8,"npc11_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC12_8,"npc12_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC13_8,"npc13_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC13_8,"npc14_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC14_8,"npc15_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC15_8,"npc16_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC16_8,"npc17_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC17_8,"npc18_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC18_8,"npc19_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); CreateObjectInfo(NPC19_8,"npc20_8",{0,0},"player.png",32,{2,2},BLUE,Flag::NONE,Flag::NONE,0); } bool Collision(vd2d pos) { SetDrawTarget(layer::COLLISION); Pixel collisionData = GetDrawTarget()->GetPixel((int)pos.x-cameraPos.x,(int)pos.y-cameraPos.y); return collisionData!=MAGENTA; } void Move(Object*obj,vd2d move) { if (move.y==0) { obj->pos+=move; return; } else { if (move.y<0) { if (obj->objArrElement>0&&OBJECTS[obj->objArrElement-1]->pos.y+OBJECTS[obj->objArrElement-1]->originPoint.y>obj->pos.y+obj->originPoint.y+move.y) { OBJECTS[obj->objArrElement]=OBJECTS[obj->objArrElement-1]; OBJECTS[obj->objArrElement-1]=obj; OBJECTS[obj->objArrElement]->objArrElement=obj->objArrElement; obj->objArrElement--; } } else { if (obj->objArrElementobjArrElement+1]->pos.y+OBJECTS[obj->objArrElement+1]->originPoint.ypos.y+obj->originPoint.y+move.y) { OBJECTS[obj->objArrElement]=OBJECTS[obj->objArrElement+1]; OBJECTS[obj->objArrElement+1]=obj; OBJECTS[obj->objArrElement]->objArrElement=obj->objArrElement; obj->objArrElement++; } } obj->pos+=move; } } void SmoothMove(Object*obj,vd2d move) { const int wiggleRoom=5; vd2d originPos = {obj->pos.x+obj->originPoint.x,obj->pos.y-1+obj->originPoint.y}; if (!Collision(originPos+move)) { Move(PLAYER_OBJ,move); return; } else if (move.x>0) { for (int i=0;i0) { for (int i=0;i::const_iterator it = OBJECTS.begin(); if (obj->id==PLAYER&&!obj->temp) { PLAYER_OBJ=obj; } bool inserted=false; for (int i=0;ipos.y+OBJECTS[i]->originPoint.y>obj->pos.y+obj->originPoint.y) { OBJECTS.insert(it,obj); obj->objArrElement=i; inserted=true; break; } it++; } if (!inserted) { obj->objArrElement=OBJECTS.size(); OBJECTS.push_back(obj); } else { for (int i=0;iobjArrElement=i; } } //printf("OBJECTS (%d):\n",OBJECTS.size()); for (int i=0;iobjArrElement) { printf("%d :: Object %s - %d (%lf,%lf)\n",i,OBJECTS[i]->name.c_str(),OBJECTS[i]->objArrElement,OBJECTS[i]->pos.x,OBJECTS[i]->pos.y); } assert(i==OBJECTS[i]->objArrElement); } //printf("\n"); } bool TabHeld(){ return GetKey(TAB).bHeld; } bool UpPressed(){ return GetKey(W).bPressed||GetKey(UP).bPressed||GetKey(NP8).bPressed||MOUSE_PRESSED_DOWN&&GetMouseY()<=HEIGHT-128+32&&GetMouseY()>=HEIGHT-128&&GetMouseX()<=HEIGHT-128; } bool DownPressed(){ return GetKey(S).bPressed||GetKey(DOWN).bPressed||GetKey(NP5).bPressed||GetKey(NP2).bPressed||MOUSE_PRESSED_DOWN&&GetMouseY()<=HEIGHT&&GetMouseY()>=HEIGHT-32&&GetMouseX()<=HEIGHT-128; } bool LeftPressed(){ return GetKey(A).bPressed||GetKey(LEFT).bPressed||GetKey(NP4).bPressed||MOUSE_PRESSED_DOWN&&GetMouseX()<=32&&GetMouseX()>=0&&GetMouseY()>=HEIGHT-128; } bool RightPressed(){ return GetKey(D).bPressed||GetKey(RIGHT).bPressed||GetKey(NP6).bPressed||MOUSE_PRESSED_DOWN&&GetMouseX()<=128&&GetMouseX()>=96&&GetMouseY()>=HEIGHT-128; } bool UpHeld(){ return GetKey(W).bHeld||GetKey(UP).bHeld||GetKey(NP8).bHeld||MOUSE_DOWN&&GetMouseY()<=HEIGHT-128+32&&GetMouseY()>=HEIGHT-128&&GetMouseX()<=HEIGHT-128; } bool DownHeld(){ return GetKey(S).bHeld||GetKey(DOWN).bHeld||GetKey(NP5).bHeld||GetKey(NP2).bHeld||MOUSE_DOWN&&GetMouseY()<=HEIGHT&&GetMouseY()>=HEIGHT-32&&GetMouseX()<=HEIGHT-128; } bool LeftHeld(){ return GetKey(A).bHeld||GetKey(LEFT).bHeld||GetKey(NP4).bHeld||MOUSE_DOWN&&GetMouseX()<=32&&GetMouseX()>=0&&GetMouseY()>=HEIGHT-128; } bool RightHeld(){ return GetKey(D).bHeld||GetKey(RIGHT).bHeld||GetKey(NP6).bHeld||MOUSE_DOWN&&GetMouseX()<=128&&GetMouseX()>=96&&GetMouseY()>=HEIGHT-128; } bool UpReleased(){ return GetKey(W).bReleased||GetKey(UP).bReleased||GetKey(NP8).bReleased||MOUSE_RELEASED&&GetMouseY()<=HEIGHT-128+32&&GetMouseY()>=HEIGHT-128&&GetMouseX()<=HEIGHT-128; } bool DownReleased(){ return GetKey(S).bReleased||GetKey(DOWN).bReleased||GetKey(NP5).bReleased||GetKey(NP2).bReleased||MOUSE_RELEASED&&GetMouseY()<=HEIGHT&&GetMouseY()>=HEIGHT-32&&GetMouseX()<=HEIGHT-128; } bool LeftReleased(){ return GetKey(A).bReleased||GetKey(LEFT).bReleased||GetKey(NP4).bReleased||MOUSE_RELEASED&&GetMouseX()<=32&&GetMouseX()>=0&&GetMouseY()>=HEIGHT-128; } bool RightReleased(){ return GetKey(D).bReleased||GetKey(RIGHT).bReleased||GetKey(NP6).bReleased||MOUSE_RELEASED&&GetMouseX()<=128&&GetMouseX()>=96&&GetMouseY()>=HEIGHT-128; } bool PlayerCanMove(){ return !messageBoxVisible&&PLAYER_OBJ!=nullptr; } void DisplayMessageBox(std::string targetText) { this->targetText=targetText; messageBoxText=""; messageBoxFinalText=""; messageBoxLoad=true; messageBoxVisible=true; messageBoxMarker=0; messageBoxStartMarker=0; messageBoxStopMarker=0; } void DrawDialogBox(const vi2d &pos, const vi2d &size, Pixel p = WHITE, Pixel p2 = DARK_GREY, Pixel p3 = VERY_DARK_GREY) { FillRect({(float)pos.x,(float)pos.y},size,p2); FillRect({(float)pos.x+1,(float)pos.y+1},{(float)size.x-2,(float)size.y-2},p); FillRect({(float)pos.x+2,(float)pos.y+2},{(float)size.x-4,(float)size.y-4},p3); FillRect({(float)pos.x+3,(float)pos.y+3},{(float)size.x-5,(float)size.y-5},p); Draw({pos.x,pos.y},Pixel(77, 51, 125)); Draw({pos.x+size.x-1,pos.y+size.y-1},Pixel(77, 51, 125)); Draw({pos.x+size.x-1,pos.y},Pixel(77, 51, 125)); Draw({pos.x,pos.y+size.y-1},Pixel(77, 51, 125)); } void StartCutscene(Cutscene*cutscene) { CurrentCutscene=cutscene; } ActionType GetCurrentCutsceneAction() { return (CurrentCutscene==nullptr)?ActionType::NONE:CurrentCutscene->CurrentAction(); } bool MoveCameraTowardsPoint(PanCamera*pan,bool secondRun=false) { bool reachedPosition=true; if (pan->GetPriorityDirection()==HORZ_FIRST||pan->GetPriorityDirection()==BOTH) { if (cameraPos.x!=pan->GetCameraTargetPos().x) { if (cameraPos.xGetCameraTargetPos().x) { cameraPos.x+=pan->GetCameraSpeed(); if (cameraPos.x>pan->GetCameraTargetPos().x) { cameraPos.x=pan->GetCameraTargetPos().x; } } else { cameraPos.x-=pan->GetCameraSpeed(); if (cameraPos.xGetCameraTargetPos().x) { cameraPos.x=pan->GetCameraTargetPos().x; } } reachedPosition=false; } else if (!secondRun&&pan->GetPriorityDirection()!=BOTH) { MoveCameraTowardsPoint(pan,true); } } if (pan->GetPriorityDirection()==VERT_FIRST||pan->GetPriorityDirection()==BOTH) { if (cameraPos.y!=pan->GetCameraTargetPos().y) { if (cameraPos.yGetCameraTargetPos().y) { cameraPos.y+=pan->GetCameraSpeed(); if (cameraPos.y>pan->GetCameraTargetPos().y) { cameraPos.y=pan->GetCameraTargetPos().y; } } else { cameraPos.y-=pan->GetCameraSpeed(); if (cameraPos.yGetCameraTargetPos().y) { cameraPos.y=pan->GetCameraTargetPos().y; } } reachedPosition=false; } else if (!secondRun&&pan->GetPriorityDirection()!=BOTH) { MoveCameraTowardsPoint(pan,true); } } return reachedPosition; } bool MoveObjectTowardsPoint(Object*obj,vd2d targetPos,PriorityDirection dir,double moveSpd,bool secondRun=false) { bool reachedPosition=true; if (dir==HORZ_FIRST||dir==BOTH) { if (obj->pos.x!=targetPos.x) { if (obj->pos.xpos.x+=moveSpd; if (obj->pos.x>targetPos.x) { obj->pos.x=targetPos.x; } } else { obj->pos.x-=moveSpd; if (obj->pos.xpos.x=targetPos.x; } } reachedPosition=false; } else if (!secondRun&&dir!=BOTH) { MoveObjectTowardsPoint(obj,targetPos,dir,moveSpd,true); } } if (dir==VERT_FIRST||dir==BOTH) { if (obj->pos.y!=targetPos.y) { if (obj->pos.ypos.y+=moveSpd; if (obj->pos.y>targetPos.y) { obj->pos.y=targetPos.y; } } else { obj->pos.y-=moveSpd; if (obj->pos.ypos.y=targetPos.y; } } reachedPosition=false; } else if (!secondRun&&dir!=BOTH) { MoveObjectTowardsPoint(obj,targetPos,dir,moveSpd,true); } } return reachedPosition; } void SetGameFlag(Flag flag,bool val) { GAME_FLAGS[toint(flag)]=val; } bool GetGameFlag(Flag flag) { return GAME_FLAGS[toint(flag)]; } void LoadEncounter(Map*map,vd2d pos,int chance,int id) { switch (id) { case encounter::ENCOUNTER_1:{ map->encounters.push_back( new Encounter(pos, std::vector{new Entity( new Object( NPC1_4,"Test Obj",{pos.x+20,pos.y+48},ANIMATIONS["player.png"] ),70,70,14,std::array{0,0,0,0},0,std::vector{} )} ,chance) ); }break; } } }; int main() { SeasonI demo; if (demo.Construct(WIDTH, HEIGHT, 4, 4,false,false,true)) demo.Start(); return 0; }