diff --git a/C++ProjectTemplate b/C++ProjectTemplate index d1ad5eb..6c241c7 100755 Binary files a/C++ProjectTemplate and b/C++ProjectTemplate differ diff --git a/cutscene.h b/cutscene.h index feaef7b..aead0a3 100644 --- a/cutscene.h +++ b/cutscene.h @@ -18,8 +18,7 @@ enum PriorityDirection{ namespace CutsceneName{ enum Cutscene{ TEST_CUTSCENE, - TRANSFER_MAP_TWOSON_CUTSCENE, - TRANSFER_MAP_ONETT_CUTSCENE, + TRANSFER_MAP_CUTSCENE, }; } @@ -38,6 +37,7 @@ enum class ActionType{ MOVE_CUTSCENE_OBJ_ASYNC, MODIFY_OBJECT, LOAD_MAP, + MOVE_PLAYER_OBJS, }; class CutsceneAction{ @@ -270,6 +270,24 @@ class LoadMap:public CutsceneAction{ Map*GetTargetMap(){ return map; } + void SetTargetMap(Map*map){ + this->map=map; + } +}; + +class MovePlayerObjects:public CutsceneAction{ + protected: + vd2d newPos; + public: + MovePlayerObjects(vd2d newPos) + :newPos(newPos) {} + ActionType GetActionType() override{return ActionType::MOVE_PLAYER_OBJS;} + vd2d GetTargetPos(){ + return newPos; + } + void SetTargetPos(vd2d newPos){ + this->newPos=newPos; + } }; /* @@ -282,11 +300,12 @@ you can advance the action using AdvanceAction(). class Cutscene{ private: int actionMarker=0; - std::vector actions; bool actionIsActive=false; std::vectorcutsceneObjs; Flag storedFlag=Flag::NONE; bool storedVal=true; + protected: + std::vector actions; public: template Cutscene(std::initializer_list actions) { @@ -353,11 +372,15 @@ class Cutscene{ class MapTransitionCutscene:public Cutscene{ public: - MapTransitionCutscene(Map*newmap) + MapTransitionCutscene() :Cutscene({ 액션 Fade(), - 액션 LoadMap(newmap), + 액션 LoadMap(nullptr), + 액션 MovePlayerObjects({0,0}), 액션 Fade(true), }){} + std::vectorGetActions(){ + return actions; + } }; #endif \ No newline at end of file diff --git a/main.cpp b/main.cpp index ad76b28..d28e84e 100644 --- a/main.cpp +++ b/main.cpp @@ -159,6 +159,9 @@ extern std::map TRIGGERS; TriggerName::Trigger SELECTED_TRIGGER; int TRIGGER_OFFSET=0; int WORLD_DISPLAY_OFFSET=0; +bool SELECTING_A_MAP_FOR_TRIGGER=false; +Trigger*LAST_PLACED_TRIGGER=nullptr; +Map* ORIGINATING_MAP=nullptr; /* [Choice1,Choice2,Choice3] @@ -862,7 +865,24 @@ void SeasonI::LoadMap(Map*map) { std::stringstream split5(data.substr(lastMarker+1,marker-lastMarker-1)); lastMarker=marker; split5>>size_y; - map->triggers.push_back(new Trigger({(int)x,(int)y},{size_x,size_y},(TriggerName::Trigger)id)); + Map*mapTrigger=nullptr; + vd2d triggerCoords; + if (data.find_first_of(';',marker+1)!=std::string::npos) { + //This means there's extra data we should grab. Should be map, and two positional coordinates. + std::stringstream split6(data.substr(lastMarker+1,marker-lastMarker-1)); + lastMarker=marker; + int mapVal; + split6>>mapVal; + mapTrigger=MAPS[(MapName::Map)mapVal]; + std::stringstream split7(data.substr(lastMarker+1,marker-lastMarker-1)); + lastMarker=marker; + split7>>triggerCoords.x; + std::stringstream split8(data.substr(lastMarker+1,marker-lastMarker-1)); + lastMarker=marker; + split8>>triggerCoords.y; + printf(" Found extra data.\n"); + } + map->triggers.push_back(new Trigger({(int)x,(int)y},{size_x,size_y},(TriggerName::Trigger)id,triggerCoords,mapTrigger)); printf("Trigger %d Loaded.\n",id); } } else { @@ -989,7 +1009,7 @@ void SeasonI::SaveMap(Map*map) { for (int i=0;itriggers.size();i++) { f.put('\n'); - const std::string trigger="TRIGGER"+std::to_string(map->triggers[i]->GetPosX())+";"+std::to_string(map->triggers[i]->GetPosY())+";"+std::to_string(map->triggers[i]->GetID())+";"+std::to_string(map->triggers[i]->GetSizeX())+";"+std::to_string(map->triggers[i]->GetSizeY()); + const std::string trigger="TRIGGER"+std::to_string(map->triggers[i]->GetPosX())+";"+std::to_string(map->triggers[i]->GetPosY())+";"+std::to_string(map->triggers[i]->GetID())+";"+std::to_string(map->triggers[i]->GetSizeX())+";"+std::to_string(map->triggers[i]->GetSizeY())+";"+std::to_string(map->triggers[i]->GetMapPtr()->myID)+";"+std::to_string(map->triggers[i]->GetAdditionalCoordData().x)+";"+std::to_string(map->triggers[i]->GetAdditionalCoordData().y); for (int j=0;jtriggers.erase(CURRENT_MAP->triggers.begin()+i--); } } - CURRENT_MAP->triggers.push_back(new Trigger(HIGHLIGHTED_TILE*32,{32,32},SELECTED_TRIGGER)); + if (SELECTED_TRIGGER==TriggerName::GOTO_MAP) { + SELECTING_A_MAP_FOR_TRIGGER=true; + GAME_STATE=GameState::MAP_SELECT; + ORIGINATING_MAP=CURRENT_MAP; + LAST_PLACED_TRIGGER=new Trigger(HIGHLIGHTED_TILE*32,{32,32},SELECTED_TRIGGER); //Don't add it to the list of map triggers yet...It'll be wiped out if we do. + } else { + CURRENT_MAP->triggers.push_back(new Trigger(HIGHLIGHTED_TILE*32,{32,32},SELECTED_TRIGGER)); + } } else { TILE*tile=MAP5[HIGHLIGHTED_TILE.y][HIGHLIGHTED_TILE.x]; tile->tileX=SELECTED_TILE.x; @@ -2230,6 +2257,13 @@ void SeasonI::keyUpdates() { GAME_STATE=GameState::OVERWORLD_MENU; } }break; + case GameState::MAP_POSITION_SELECT:{ + LAST_PLACED_TRIGGER->SetExtraCoords(HIGHLIGHTED_TILE*32); + CURRENT_MAP=LAST_PLACED_TRIGGER->GetMapPtr(); + LoadMap(ORIGINATING_MAP); + CURRENT_MAP->triggers.push_back(LAST_PLACED_TRIGGER); + LAST_PLACED_TRIGGER=nullptr; + }break; case GameState::EDITOR:{ if (IsTextEntryEnabled()) { return; @@ -2315,7 +2349,14 @@ void SeasonI::keyUpdates() { }break; case GameState::MAP_SELECT:{ if (GetKey(ESCAPE).bPressed) { - GAME_STATE=GameState::EDITOR; + if (SELECTING_A_MAP_FOR_TRIGGER) { + SELECTING_A_MAP_FOR_TRIGGER=false; + LAST_PLACED_TRIGGER->SetMap(CURRENT_MAP); + printf("Trigger Map Location set to %s",CURRENT_MAP->mapname.c_str()); + GAME_STATE=GameState::MAP_POSITION_SELECT; + } else { + GAME_STATE=GameState::EDITOR; + } } if ((GetMouseWheel()<0||GetKey(PGDN).bHeld)&&WORLD_DISPLAY_OFFSET+(WIDTH/16)GetPos()-cameraPos,trigger->GetSize(),Pixel(255,0,0,64)); DrawRectDecal(trigger->GetPos()-cameraPos,trigger->GetSize(),YELLOW); vi2d textOffset={2,2}; - DrawStringDecal(trigger->GetPos()-cameraPos+textOffset,TRIGGERS[(TriggerName::Trigger)trigger->GetID()],WHITE,{28.f/GetTextSize(TRIGGERS[(TriggerName::Trigger)trigger->GetID()]).x,1.f}); + std::string triggerText=TRIGGERS[(TriggerName::Trigger)trigger->GetID()]; + if ((TriggerName::Trigger)trigger->GetID()==TriggerName::GOTO_MAP) { + triggerText="GOTO "+trigger->GetMapPtr()->mapname+"\n"+std::to_string(trigger->GetAdditionalCoordData().x)+"\n"+std::to_string(trigger->GetAdditionalCoordData().y); + } + DrawStringDecal(trigger->GetPos()-cameraPos+textOffset,triggerText,WHITE,{28.f/GetTextSize(triggerText).x,1.f}); } } else if (EDITING_LAYER==layer::ENCOUNTER) { @@ -2815,6 +2860,12 @@ void SeasonI::drawGame(){ DrawStringPropDecal({2,2},"Editing Layer "+std::to_string(EDITING_LAYER)); } }break; + case GameState::MAP_POSITION_SELECT:{ + DrawGameWorld(); + SetDrawTarget(layer::INTERFACE); + DrawRectDecal((HIGHLIGHTED_TILE)*32-cameraPos,{32,32},YELLOW); + DrawStringPropDecal({2,2},"Select target tile"); + }break; case GameState::TILE_SELECT:{ //14x14 pixels per tile. DrawDecal({0,0},SPRITES["terrainmap.png"],{TILEMAP_EDITOR_DRAW_MULT,TILEMAP_EDITOR_DRAW_MULT}); @@ -3760,6 +3811,13 @@ void SeasonI::HandleCutscenes() { LoadMap(map); CurrentCutscene->AdvanceAction(); }break; + case ActionType::MOVE_PLAYER_OBJS:{ + MovePlayerObjects*action=(MovePlayerObjects*)CurrentCutscene->GetAction(); + vd2d pos=action->GetTargetPos(); + for (int i=0;iSetPos(pos); + } + }break; } for (int i=0;i SPRITES; int MAP_ENUM_COUNT=0; std::map MAPS={ - {(MapName::Map)MAP_ENUM_COUNT++,new Map("map0","map0_2","map0_3","map0_4","map0_5",SPRITES["terrainmap.png"],"Onett")}, - {(MapName::Map)MAP_ENUM_COUNT++,new Map("newmap","newmap_2","newmap_3","newmap_4","newmap_5",SPRITES["terrainmap.png"],"Twoson")}, + {(MapName::Map)MAP_ENUM_COUNT++,new Map("map0","map0_2","map0_3","map0_4","map0_5",SPRITES["terrainmap.png"],"Onett",(MapName::Map)(MAP_ENUM_COUNT-1))}, + {(MapName::Map)MAP_ENUM_COUNT++,new Map("newmap","newmap_2","newmap_3","newmap_4","newmap_5",SPRITES["terrainmap.png"],"Twoson",(MapName::Map)(MAP_ENUM_COUNT-1))}, }; \ No newline at end of file diff --git a/map.h b/map.h index 627e821..5e9a43e 100644 --- a/map.h +++ b/map.h @@ -24,7 +24,8 @@ class Map{ Decal*tileset; std::vector encounters; std::vector triggers; - Map(std::string fname,std::string layer2_fname,std::string layer3_fname,std::string layer4_fname,std::string layer5_fname,Decal*tileset,std::string mapname) - :filename(fname),l2filename(layer2_fname),l3filename(layer3_fname),l4filename(layer4_fname),l5filename(layer5_fname),mapname(mapname),tileset(tileset) {} + MapName::Map myID; + Map(std::string fname,std::string layer2_fname,std::string layer3_fname,std::string layer4_fname,std::string layer5_fname,Decal*tileset,std::string mapname,MapName::Map myID) + :filename(fname),l2filename(layer2_fname),l3filename(layer3_fname),l4filename(layer4_fname),l5filename(layer5_fname),mapname(mapname),tileset(tileset),myID(myID) {} }; #endif \ No newline at end of file diff --git a/states.h b/states.h index 8f29adb..c673dd3 100644 --- a/states.h +++ b/states.h @@ -22,9 +22,7 @@ namespace GameState{ SHOPKEEPER_CONFIRM_SELL_MENU, TRIGGER_SELECT, MAP_SELECT, - NEW_MAP_INPUT_NAME, - NEW_MAP_INPUT_WIDTH, - NEW_MAP_INPUT_HEIGHT, + MAP_POSITION_SELECT, }; } diff --git a/trigger.cpp b/trigger.cpp index bd95c33..3a9a800 100644 --- a/trigger.cpp +++ b/trigger.cpp @@ -5,6 +5,5 @@ int TRIGGER_ENUM_COUNT=1; std::map TRIGGERS={ {(TriggerName::Trigger)TRIGGER_ENUM_COUNT++,"START_CUTSCENE_1"}, - {(TriggerName::Trigger)TRIGGER_ENUM_COUNT++,"Goto Twoson"}, - {(TriggerName::Trigger)TRIGGER_ENUM_COUNT++,"Goto Onett"}, + {(TriggerName::Trigger)TRIGGER_ENUM_COUNT++,"Goto"}, }; \ No newline at end of file diff --git a/trigger.h b/trigger.h index a198982..30209e6 100644 --- a/trigger.h +++ b/trigger.h @@ -12,23 +12,25 @@ namespace TriggerName{ enum Trigger{ NONE, START_CUTSCENE_1, - GOTO_TWOSON_MAP, - GOTO_ONETT_MAP + GOTO_MAP, }; } extern void DisplayMessageBox(std::string targetT); extern SeasonI*GAME; extern std::map CUTSCENES; +extern Map*CURRENT_MAP; +extern vi2d HIGHLIGHTED_TILE; class Trigger{ vi2d pos; vi2d size; TriggerName::Trigger id; vi2d extraCoords; + Map*mapChoice; public: - Trigger(vi2d pos,vi2d size,TriggerName::Trigger id,vi2d extraCoords={0,0}) - :pos(pos),size(size),id(id),extraCoords(extraCoords){} + Trigger(vi2d pos,vi2d size,TriggerName::Trigger id,vi2d extraCoords={0,0},Map*mapChoice=nullptr) + :pos(pos),size(size),id(id),extraCoords(extraCoords),mapChoice(mapChoice){} bool IsInside(vd2d point) { return point.x>pos.x&&point.xpos.y&&point.ySetGameFlag(Flag::TEST_FLAG1,true); } }break; - case TriggerName::GOTO_TWOSON_MAP:{ - GAME->StartCutscene(CUTSCENES[CutsceneName::TRANSFER_MAP_TWOSON_CUTSCENE]); - }break; - case TriggerName::GOTO_ONETT_MAP:{ - GAME->StartCutscene(CUTSCENES[CutsceneName::TRANSFER_MAP_ONETT_CUTSCENE]); - }break; + case TriggerName::GOTO_MAP:{ + MapTransitionCutscene*scene=(MapTransitionCutscene*)CUTSCENES[CutsceneName::TRANSFER_MAP_CUTSCENE]; + std::vectoractions=scene->GetActions(); + LoadMap*mapLoadAction=(LoadMap*)actions[1]; + mapLoadAction->SetTargetMap(CURRENT_MAP); + MovePlayerObjects*playerMoveAction=(MovePlayerObjects*)actions[2]; + playerMoveAction->SetTargetPos(HIGHLIGHTED_TILE); + }break; } } vi2d GetPos() { @@ -69,5 +73,17 @@ class Trigger{ int GetID() { return id; } + Map*GetMapPtr(){ + return mapChoice; + } + vd2d GetAdditionalCoordData(){ + return extraCoords; + } + void SetExtraCoords(vd2d coords) { + extraCoords=coords; + } + void SetMap(Map*map) { + mapChoice=map; + } }; #endif \ No newline at end of file