Improve gameplay
This commit is contained in:
+11
-67
@@ -6,83 +6,27 @@ g888g858gg
|
|||||||
g8g8g8g8gg
|
g8g8g8g8gg
|
||||||
g858g8g8gg
|
g858g8g8gg
|
||||||
|
|
||||||
Room
|
|
||||||
gggggggggg
|
|
||||||
gggggggggg
|
|
||||||
gggggggggg
|
|
||||||
gggggggggg
|
|
||||||
gggggggggg
|
|
||||||
gggggggggg
|
|
||||||
|
|
||||||
Room
|
|
||||||
0000gggggg
|
|
||||||
0000gggggg
|
|
||||||
0000gggggg
|
|
||||||
0000gggggg
|
|
||||||
0000gggggg
|
|
||||||
gggggggggg
|
|
||||||
|
|
||||||
Room
|
|
||||||
gggggg0000
|
|
||||||
gggggg0000
|
|
||||||
gggggg0000
|
|
||||||
gggggg0000
|
|
||||||
gggggg0000
|
|
||||||
gggggggggg
|
|
||||||
|
|
||||||
Room
|
|
||||||
000000000g
|
|
||||||
000000000g
|
|
||||||
000000000g
|
|
||||||
000000000g
|
|
||||||
000000000g
|
|
||||||
gggggggggg
|
|
||||||
|
|
||||||
Room
|
|
||||||
g000000000
|
|
||||||
g000000000
|
|
||||||
g000000000
|
|
||||||
g000000000
|
|
||||||
g000000000
|
|
||||||
gggggggggg
|
|
||||||
|
|
||||||
Room
|
Room
|
||||||
0000l00000
|
0000l00000
|
||||||
0000l00000
|
0000l00000
|
||||||
7775557757
|
7775557757
|
||||||
5557775575
|
5557775575
|
||||||
0000000000
|
00t0000t00
|
||||||
gggggggggg
|
GGGGGGGGGG
|
||||||
|
|
||||||
Room
|
Room
|
||||||
g000l0000g
|
g0g0gg0g0g
|
||||||
g000l0000g
|
g00000000g
|
||||||
g000l0000g
|
g00000000g
|
||||||
g000l0000g
|
00t0000t00
|
||||||
gDDDlDDDDg
|
0DDDDDDDD0
|
||||||
gggggggggg
|
GGGGGGGGGG
|
||||||
|
|
||||||
Room
|
Room
|
||||||
0000000000
|
0gggggggg0
|
||||||
0000000000
|
0gtggggtg0
|
||||||
0000000000
|
dgdgddgdgd
|
||||||
0000000000
|
|
||||||
dddddddddd
|
|
||||||
gggggggggg
|
gggggggggg
|
||||||
|
|
||||||
Room
|
|
||||||
0000000000
|
|
||||||
0000000000
|
|
||||||
0000000000
|
|
||||||
0000000000
|
|
||||||
dddddddddd
|
|
||||||
gggggggggg
|
gggggggggg
|
||||||
|
|
||||||
Room
|
|
||||||
0000000000
|
|
||||||
0000000000
|
|
||||||
0000000000
|
|
||||||
0000000000
|
|
||||||
dddddddddd
|
|
||||||
gggggggggg
|
gggggggggg
|
||||||
|
|
||||||
|
|||||||
+19
-3
@@ -2,14 +2,30 @@ Room
|
|||||||
5555555555
|
5555555555
|
||||||
0000000000
|
0000000000
|
||||||
0000000000
|
0000000000
|
||||||
0000000000
|
00t0000t00
|
||||||
0000000000
|
0D00DD0pD0
|
||||||
GGGGGGGGGG
|
GGGGGGGGGG
|
||||||
|
|
||||||
Room
|
Room
|
||||||
5555555555
|
5555555555
|
||||||
0000000000
|
00t00p0t00
|
||||||
000lGGGGl0
|
000lGGGGl0
|
||||||
000lggggl0
|
000lggggl0
|
||||||
000lggggl0
|
000lggggl0
|
||||||
GGGGggggGG
|
GGGGggggGG
|
||||||
|
|
||||||
|
Room
|
||||||
|
0000000000
|
||||||
|
00t00p0t00
|
||||||
|
0lg00g00gl
|
||||||
|
0l000g000l
|
||||||
|
0lDDDgDDDl
|
||||||
|
GGGGGGGGGG
|
||||||
|
|
||||||
|
Room
|
||||||
|
0000000000
|
||||||
|
00t0000t00
|
||||||
|
000D0pD000
|
||||||
|
00gggggg00
|
||||||
|
0gggggggg0
|
||||||
|
GggggggggG
|
||||||
+12
-4
@@ -3,13 +3,21 @@ Room
|
|||||||
0000000000
|
0000000000
|
||||||
0000000000
|
0000000000
|
||||||
0000000000
|
0000000000
|
||||||
0000000000
|
0tp00000t0
|
||||||
GGGGPPPPGG
|
GGGGPPPPGG
|
||||||
|
|
||||||
Room
|
Room
|
||||||
0000000000
|
0000000000
|
||||||
0000000000
|
0000000000
|
||||||
0000000000
|
0t000p00t0
|
||||||
0lgggggggl
|
00ggggggg0
|
||||||
0l000000gl
|
00000000g0
|
||||||
GGGGPPPPgG
|
GGGGPPPPgG
|
||||||
|
|
||||||
|
Room
|
||||||
|
0000000000
|
||||||
|
0000000000
|
||||||
|
0000000000
|
||||||
|
0t000000t0
|
||||||
|
000000p000
|
||||||
|
GPPGPPGPPG
|
||||||
|
|||||||
@@ -2,14 +2,14 @@ Room
|
|||||||
0000l00000
|
0000l00000
|
||||||
0000l00000
|
0000l00000
|
||||||
0000l00000
|
0000l00000
|
||||||
0000l00000
|
0t00l000t0
|
||||||
0000l00000
|
0000l0p000
|
||||||
GGGGGGGGGG
|
GGGGGGGGGG
|
||||||
|
|
||||||
Room
|
Room
|
||||||
0000l00000
|
0000l00000
|
||||||
0000l00000
|
00t0l00t00
|
||||||
0lggggggl0
|
0lggggggl0
|
||||||
0l000000l0
|
0l000000l0
|
||||||
0l000000l0
|
0l00p000l0
|
||||||
GGGGGGGGGG
|
GGGGGGGGGG
|
||||||
@@ -2,14 +2,14 @@ Room
|
|||||||
0000l00000
|
0000l00000
|
||||||
0000l00000
|
0000l00000
|
||||||
0000l00000
|
0000l00000
|
||||||
0000l00000
|
0t00l000t0
|
||||||
0000l00000
|
0p00l00000
|
||||||
GGPPlPPPGG
|
GGPPlPPPGG
|
||||||
|
|
||||||
Room
|
Room
|
||||||
0000l00000
|
0000l00000
|
||||||
0000l00000
|
0t00l000t0
|
||||||
ggggggglgg
|
ggggggglgg
|
||||||
0000000l00
|
0000000l00
|
||||||
0000l00l00
|
0000l0pl00
|
||||||
GGPPlGGGGG
|
GGPPlGGGGG
|
||||||
|
|||||||
@@ -11,6 +11,15 @@ TEntityManager::TEntityManager(TRenderManager& renderManager, std::size_t timest
|
|||||||
}
|
}
|
||||||
|
|
||||||
void TEntityManager::Run() {
|
void TEntityManager::Run() {
|
||||||
|
if (PendingReset_) {
|
||||||
|
PendingReset_ = false;
|
||||||
|
Entities_.clear();
|
||||||
|
for (const auto& name : DeferredEntities_) {
|
||||||
|
MakeEntityByName(name);
|
||||||
|
}
|
||||||
|
DeferredEntities_.clear();
|
||||||
|
}
|
||||||
|
|
||||||
Input();
|
Input();
|
||||||
Update();
|
Update();
|
||||||
Draw();
|
Draw();
|
||||||
@@ -85,6 +94,25 @@ std::unordered_set<TEntity::TId> TEntityManager::CollisionList(const Vec2i& posi
|
|||||||
return query;
|
return query;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::vector<TEntity::TId> TEntityManager::Ids() const {
|
||||||
|
std::vector<TEntity::TId> result;
|
||||||
|
|
||||||
|
result.reserve(Entities_.size());
|
||||||
|
for (const auto& entity : Entities_) {
|
||||||
|
result.push_back(entity.first);
|
||||||
|
}
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void TEntityManager::AddToDeferred(const std::string& name) {
|
||||||
|
DeferredEntities_.push_back(name);
|
||||||
|
}
|
||||||
|
|
||||||
|
void TEntityManager::Reset() {
|
||||||
|
PendingReset_ = true;
|
||||||
|
}
|
||||||
|
|
||||||
void TEntityManager::Input() {
|
void TEntityManager::Input() {
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
while (RenderManager_.Input(&event)) {
|
while (RenderManager_.Input(&event)) {
|
||||||
|
|||||||
@@ -40,6 +40,9 @@ public:
|
|||||||
std::shared_ptr<TEntity> MakeEntityByName(const std::string& name);
|
std::shared_ptr<TEntity> MakeEntityByName(const std::string& name);
|
||||||
bool IsPlaceEmpty(const Vec2i& position, const Vec2i& size, TEntity::TCollisionGroup group, TEntity::TId ignoreId = {});
|
bool IsPlaceEmpty(const Vec2i& position, const Vec2i& size, TEntity::TCollisionGroup group, TEntity::TId ignoreId = {});
|
||||||
std::unordered_set<TEntity::TId> CollisionList(const Vec2i& position, const Vec2i& size, TEntity::TCollisionGroup group, TEntity::TId ignoreId = {});
|
std::unordered_set<TEntity::TId> CollisionList(const Vec2i& position, const Vec2i& size, TEntity::TCollisionGroup group, TEntity::TId ignoreId = {});
|
||||||
|
std::vector<TEntity::TId> Ids() const;
|
||||||
|
void AddToDeferred(const std::string& name);
|
||||||
|
void Reset();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
using TFactoryMethod = std::shared_ptr<TEntity>(*)(TEntity::TId);
|
using TFactoryMethod = std::shared_ptr<TEntity>(*)(TEntity::TId);
|
||||||
@@ -57,10 +60,12 @@ private:
|
|||||||
TRenderManager& RenderManager_;
|
TRenderManager& RenderManager_;
|
||||||
std::unordered_map<TEntity::TId, std::shared_ptr<TEntity>> Entities_;
|
std::unordered_map<TEntity::TId, std::shared_ptr<TEntity>> Entities_;
|
||||||
std::unordered_map<std::string, TFactoryMethod> EntityFactories_;
|
std::unordered_map<std::string, TFactoryMethod> EntityFactories_;
|
||||||
|
std::vector<std::string> DeferredEntities_;
|
||||||
std::uint32_t LastUpdateTick_;
|
std::uint32_t LastUpdateTick_;
|
||||||
TEntity::TId IdCounter_;
|
TEntity::TId IdCounter_;
|
||||||
std::size_t Timestep_;
|
std::size_t Timestep_;
|
||||||
TGridmap Gridmap_;
|
TGridmap Gridmap_;
|
||||||
|
bool PendingReset_ = false;
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace NGame
|
} // namespace NGame
|
||||||
+8
-7
@@ -15,7 +15,7 @@ static NGame::TApp *app = nullptr;
|
|||||||
static void InitApp(void) {
|
static void InitApp(void) {
|
||||||
app = NGame::TApp::Instance();
|
app = NGame::TApp::Instance();
|
||||||
|
|
||||||
app->EntityManager().RegisterEntity<THero>("Hero");
|
app->EntityManager().RegisterEntity<THero>("HeroEntity");
|
||||||
app->EntityManager().RegisterEntity<TDirtEntity>("DirtEntity");
|
app->EntityManager().RegisterEntity<TDirtEntity>("DirtEntity");
|
||||||
app->EntityManager().RegisterEntity<TGrassEntity>("GrassEntity");
|
app->EntityManager().RegisterEntity<TGrassEntity>("GrassEntity");
|
||||||
app->EntityManager().RegisterEntity<TPlankEntity>("PlankEntity");
|
app->EntityManager().RegisterEntity<TPlankEntity>("PlankEntity");
|
||||||
@@ -32,13 +32,14 @@ static void InitApp(void) {
|
|||||||
app->EntityManager().RegisterEntity<TBackgroundTiler>("BackgroundTiler");
|
app->EntityManager().RegisterEntity<TBackgroundTiler>("BackgroundTiler");
|
||||||
app->EntityManager().RegisterEntity<TRoomEntity>("RoomEntity");
|
app->EntityManager().RegisterEntity<TRoomEntity>("RoomEntity");
|
||||||
app->EntityManager().RegisterEntity<TRubbleEntity>("RubbleEntity");
|
app->EntityManager().RegisterEntity<TRubbleEntity>("RubbleEntity");
|
||||||
|
app->EntityManager().RegisterEntity<TMainMenu>("MainMenu");
|
||||||
|
app->EntityManager().RegisterEntity<TIntroMenu>("IntroMenu");
|
||||||
|
app->EntityManager().RegisterEntity<TOutroMenu>("OutroMenu");
|
||||||
|
app->EntityManager().RegisterEntity<TEulaMenu>("EulaMenu");
|
||||||
|
app->EntityManager().RegisterEntity<TTorchEntity>("TorchEntity");
|
||||||
|
|
||||||
app->EntityManager().MakeEntityByName("RoomEntity");
|
app->EntityManager().AddToDeferred("RoomEntity");
|
||||||
app->EntityManager().MakeEntityByName("BackgroundTiler");
|
app->EntityManager().Reset();
|
||||||
|
|
||||||
auto h = app->EntityManager().MakeEntityByName("Hero");
|
|
||||||
h->SetPosition({0, -16});
|
|
||||||
app->EntityManager().UpdateCollision(h);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void MainLoop(void) {
|
static void MainLoop(void) {
|
||||||
|
|||||||
+230
-38
@@ -81,11 +81,10 @@ TStoneEntity::TStoneEntity(NGame::TEntity::TId id)
|
|||||||
, SpriteManager_(App_->SpriteManager()) {
|
, SpriteManager_(App_->SpriteManager()) {
|
||||||
SetCollisionGroup(TERRAIN_GROUP);
|
SetCollisionGroup(TERRAIN_GROUP);
|
||||||
SetSize({16, 16});
|
SetSize({16, 16});
|
||||||
Sprite_ = NGame::TApp::Instance()->SpriteManager().Get("Sprites/Wall.txt");
|
Sprite_ = NGame::TApp::Instance()->SpriteManager().Get("Sprites/PushRock.txt");
|
||||||
}
|
}
|
||||||
|
|
||||||
void TStoneEntity::Update(std::uint32_t delta) {
|
void TStoneEntity::Update(std::uint32_t delta) {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void TStoneEntity::Draw() const {
|
void TStoneEntity::Draw() const {
|
||||||
@@ -110,10 +109,6 @@ void TLadderEntity::Update(std::uint32_t delta) {
|
|||||||
void TLadderEntity::Draw() const {
|
void TLadderEntity::Draw() const {
|
||||||
NGame::TApp::Instance()->RenderManager().SetLayer(NGame::TRenderManager::Background);
|
NGame::TApp::Instance()->RenderManager().SetLayer(NGame::TRenderManager::Background);
|
||||||
NGame::TApp::Instance()->SpriteManager().Draw(Sprite_, 0, Position());
|
NGame::TApp::Instance()->SpriteManager().Draw(Sprite_, 0, Position());
|
||||||
|
|
||||||
NGame::TApp::Instance()->RenderManager().SetLayer(NGame::TRenderManager::Light);
|
|
||||||
auto light = NGame::TApp::Instance()->SpriteManager().Get("Sprites/Light.txt");
|
|
||||||
NGame::TApp::Instance()->SpriteManager().Draw(light, 1, Position() - (light->Frames[1].Size * 2 / 2) + Size() / 2, {2, 2});
|
|
||||||
}
|
}
|
||||||
|
|
||||||
TExplosionEntity::TExplosionEntity(NGame::TEntity::TId id)
|
TExplosionEntity::TExplosionEntity(NGame::TEntity::TId id)
|
||||||
@@ -315,7 +310,7 @@ void TExitEntity::Update(std::uint32_t delta) {
|
|||||||
|
|
||||||
void TExitEntity::Draw() const {
|
void TExitEntity::Draw() const {
|
||||||
NGame::TApp::Instance()->RenderManager().SetLayer(NGame::TRenderManager::Background);
|
NGame::TApp::Instance()->RenderManager().SetLayer(NGame::TRenderManager::Background);
|
||||||
NGame::TApp::Instance()->SpriteManager().Draw(Sprite_, 0, Position());
|
NGame::TApp::Instance()->SpriteManager().Draw(Sprite_, 1, Position());
|
||||||
}
|
}
|
||||||
|
|
||||||
TFloatingTextEntity::TFloatingTextEntity(NGame::TEntity::TId id)
|
TFloatingTextEntity::TFloatingTextEntity(NGame::TEntity::TId id)
|
||||||
@@ -418,9 +413,7 @@ void TRoomEntity::FillRow(const std::string& data, std::size_t row, TRoom& room)
|
|||||||
case 'D': room.data[row * 10 + i] = Spike; break;
|
case 'D': room.data[row * 10 + i] = Spike; break;
|
||||||
case 'p': room.data[row * 10 + i] = Passage; break;
|
case 'p': room.data[row * 10 + i] = Passage; break;
|
||||||
case 'P': room.data[row * 10 + i] = Plank; break;
|
case 'P': room.data[row * 10 + i] = Plank; break;
|
||||||
case 'c': room.data[row * 10 + i] = Curse; break;
|
case 't': room.data[row * 10 + i] = Torch; break;
|
||||||
case 'b': room.data[row * 10 + i] = Baddy; break;
|
|
||||||
case 'u': room.data[row * 10 + i] = Utility; break;
|
|
||||||
default: break;
|
default: break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -515,6 +508,40 @@ void TRoomEntity::GenerateLayout() {
|
|||||||
GenerateRoom(maze, NGame::Vec2i(j, i));
|
GenerateRoom(maze, NGame::Vec2i(j, i));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Add border
|
||||||
|
for (int i = -1; i <= ROOM_WIDTH * 10; i++) {
|
||||||
|
auto wall = NGame::TApp::Instance()->EntityManager().MakeEntityByName("StoneEntity");
|
||||||
|
wall->SetPosition({i * 16, -16});
|
||||||
|
NGame::TApp::Instance()->EntityManager().UpdateCollision(wall);
|
||||||
|
|
||||||
|
wall = NGame::TApp::Instance()->EntityManager().MakeEntityByName("StoneEntity");
|
||||||
|
wall->SetPosition({i * 16, 16 * (ROOM_HEIGHT * 6)});
|
||||||
|
NGame::TApp::Instance()->EntityManager().UpdateCollision(wall);
|
||||||
|
}
|
||||||
|
|
||||||
|
for (int i = -1; i <= ROOM_HEIGHT * 6; i++) {
|
||||||
|
auto wall = NGame::TApp::Instance()->EntityManager().MakeEntityByName("StoneEntity");
|
||||||
|
wall->SetPosition({-16, i * 16});
|
||||||
|
NGame::TApp::Instance()->EntityManager().UpdateCollision(wall);
|
||||||
|
|
||||||
|
wall = NGame::TApp::Instance()->EntityManager().MakeEntityByName("StoneEntity");
|
||||||
|
wall->SetPosition({16 * (ROOM_WIDTH * 10), i * 16});
|
||||||
|
NGame::TApp::Instance()->EntityManager().UpdateCollision(wall);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create background tiler and hero entity
|
||||||
|
NGame::TApp::Instance()->EntityManager().MakeEntityByName("BackgroundTiler");
|
||||||
|
auto hero = NGame::TApp::Instance()->EntityManager().MakeEntityByName("HeroEntity");
|
||||||
|
|
||||||
|
for (const auto& otherId : NGame::TApp::Instance()->EntityManager().Ids()) {
|
||||||
|
auto other = NGame::TApp::Instance()->EntityManager().Entity(otherId);
|
||||||
|
if (dynamic_cast<TEntranceEntity*>(other.get())) {
|
||||||
|
hero->SetPosition(other->Position());
|
||||||
|
NGame::TApp::Instance()->EntityManager().UpdateCollision(hero);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TRoomEntity::GenerateRoom(int* maze, const NGame::Vec2i& position) {
|
void TRoomEntity::GenerateRoom(int* maze, const NGame::Vec2i& position) {
|
||||||
@@ -522,6 +549,7 @@ void TRoomEntity::GenerateRoom(int* maze, const NGame::Vec2i& position) {
|
|||||||
auto roomType = maze[ROOM_WIDTH * position.Y + position.X];
|
auto roomType = maze[ROOM_WIDTH * position.Y + position.X];
|
||||||
TRoom sourceRoom;
|
TRoom sourceRoom;
|
||||||
int randomRoomChance = rand() % 100;
|
int randomRoomChance = rand() % 100;
|
||||||
|
NGame::Vec2i startPosition = {0, 0};
|
||||||
|
|
||||||
SelectRoom(roomType & LeftRightUpDown, sourceRoom);
|
SelectRoom(roomType & LeftRightUpDown, sourceRoom);
|
||||||
for (int i = 0; i < 6; i++) {
|
for (int i = 0; i < 6; i++) {
|
||||||
@@ -571,32 +599,24 @@ void TRoomEntity::GenerateRoom(int* maze, const NGame::Vec2i& position) {
|
|||||||
break;
|
break;
|
||||||
|
|
||||||
case Mine:
|
case Mine:
|
||||||
if (NGame::TApp::Instance()->State().Variable("MoreMines").Bool()) {
|
entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("MineEntity");
|
||||||
if (rand() % 100 < 50) {
|
|
||||||
entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("MineEntity");
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
if (rand() % 100 < 25) {
|
|
||||||
entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("MineEntity");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Passage:
|
case Passage:
|
||||||
if (roomType & (Start | Exit)) {
|
if (roomType & Start) {
|
||||||
entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("EntranceEntity");
|
entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("EntranceEntity");
|
||||||
}
|
} else if (roomType & Exit) {
|
||||||
break;
|
entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("ExitEntity");
|
||||||
|
|
||||||
case Curse:
|
|
||||||
if (rand() % 100 < 25) {
|
|
||||||
entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("CurseEntity");
|
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case Spike:
|
case Spike:
|
||||||
if (rand() % 100 < 75) {
|
entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("SpikeEntity");
|
||||||
entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("SpikeEntity");
|
break;
|
||||||
|
|
||||||
|
case Torch:
|
||||||
|
if (rand() % 100 < 15) {
|
||||||
|
entity = NGame::TApp::Instance()->EntityManager().MakeEntityByName("TorchEntity");
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -616,17 +636,17 @@ void TRoomEntity::SelectRoom(int type, TRoom& room) {
|
|||||||
|
|
||||||
if (type == LeftRight) {
|
if (type == LeftRight) {
|
||||||
selection.insert(selection.end(), LRRooms_.begin(), LRRooms_.end());
|
selection.insert(selection.end(), LRRooms_.begin(), LRRooms_.end());
|
||||||
selection.insert(selection.end(), LRDRooms_.begin(), LRDRooms_.end());
|
// selection.insert(selection.end(), LRDRooms_.begin(), LRDRooms_.end());
|
||||||
selection.insert(selection.end(), LRURooms_.begin(), LRURooms_.end());
|
// selection.insert(selection.end(), LRURooms_.begin(), LRURooms_.end());
|
||||||
selection.insert(selection.end(), LRUDRooms_.begin(), LRUDRooms_.end());
|
// selection.insert(selection.end(), LRUDRooms_.begin(), LRUDRooms_.end());
|
||||||
room = selection[rand() % selection.size()];
|
room = selection[rand() % selection.size()];
|
||||||
} else if (type == LeftRightUp) {
|
} else if (type == LeftRightUp) {
|
||||||
selection.insert(selection.end(), LRURooms_.begin(), LRURooms_.end());
|
selection.insert(selection.end(), LRURooms_.begin(), LRURooms_.end());
|
||||||
selection.insert(selection.end(), LRUDRooms_.begin(), LRUDRooms_.end());
|
// selection.insert(selection.end(), LRUDRooms_.begin(), LRUDRooms_.end());
|
||||||
room = selection[rand() % selection.size()];
|
room = selection[rand() % selection.size()];
|
||||||
} else if (type == LeftRightDown) {
|
} else if (type == LeftRightDown) {
|
||||||
selection.insert(selection.end(), LRDRooms_.begin(), LRDRooms_.end());
|
selection.insert(selection.end(), LRDRooms_.begin(), LRDRooms_.end());
|
||||||
selection.insert(selection.end(), LRUDRooms_.begin(), LRUDRooms_.end());
|
// selection.insert(selection.end(), LRUDRooms_.begin(), LRUDRooms_.end());
|
||||||
room = selection[rand() % selection.size()];
|
room = selection[rand() % selection.size()];
|
||||||
} else if (type == LeftRightUpDown) {
|
} else if (type == LeftRightUpDown) {
|
||||||
room = LRUDRooms_[rand() % LRUDRooms_.size()];
|
room = LRUDRooms_[rand() % LRUDRooms_.size()];
|
||||||
@@ -649,10 +669,22 @@ THero::THero(NGame::TEntity::TId id)
|
|||||||
SetSize(NGame::Vec2i(4, 12));
|
SetSize(NGame::Vec2i(4, 12));
|
||||||
SetPosition(NGame::Vec2i(0, 0));
|
SetPosition(NGame::Vec2i(0, 0));
|
||||||
SetCollisionGroup(HERO_GROUP);
|
SetCollisionGroup(HERO_GROUP);
|
||||||
NGame::TApp::Instance()->RenderManager().EnableLight(false);
|
NGame::TApp::Instance()->RenderManager().EnableLight(true);
|
||||||
NGame::TApp::Instance()->RenderManager().SetDefaultLightColor(255, 0, 0);
|
NGame::TApp::Instance()->RenderManager().SetDefaultLightColor(0, 0, 0);
|
||||||
|
|
||||||
Alarm_.Set(0, 100);
|
Alarm_.Set(0, 100);
|
||||||
|
|
||||||
|
// Find exit entity
|
||||||
|
auto otherIds = App_->EntityManager().Ids();
|
||||||
|
ExitPosition_ = {0, 0};
|
||||||
|
for (const auto& otherId : otherIds) {
|
||||||
|
auto other = App_->EntityManager().Entity(otherId);
|
||||||
|
|
||||||
|
if (dynamic_cast<TExitEntity*>(other.get())) {
|
||||||
|
ExitPosition_ = other->Position();
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void THero::Input(SDL_Event* event) {
|
void THero::Input(SDL_Event* event) {
|
||||||
@@ -1007,7 +1039,11 @@ void THero::Update(std::uint32_t delta) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Set camera to track hero
|
// Set camera to track hero
|
||||||
RenderManager_.SetCamera(Position() - App_->RenderManager().Size() / 2);
|
auto cameraPosition = Position() + Size() / 2 - RenderManager_.Size() / 2;
|
||||||
|
|
||||||
|
cameraPosition.X = std::min(std::max(cameraPosition.X, -16), 16 * 10 * ROOM_WIDTH - RenderManager_.Size().X + 16);
|
||||||
|
cameraPosition.Y = std::min(std::max(cameraPosition.Y, -16), 16 * 6 * ROOM_HEIGHT - RenderManager_.Size().Y + 16);
|
||||||
|
RenderManager_.SetCamera(cameraPosition);
|
||||||
|
|
||||||
// Reset pressed keys
|
// Reset pressed keys
|
||||||
IgnorePlanks_ = false;
|
IgnorePlanks_ = false;
|
||||||
@@ -1042,6 +1078,48 @@ void THero::Draw() const {
|
|||||||
RenderManager_.SetLayer(NGame::TRenderManager::Light);
|
RenderManager_.SetLayer(NGame::TRenderManager::Light);
|
||||||
auto light = SpriteManager_.Get("Sprites/Light.txt");
|
auto light = SpriteManager_.Get("Sprites/Light.txt");
|
||||||
SpriteManager_.Draw(light, 0, Position() - (light->Frames[0].Size * 4 / 2), {4, 4});
|
SpriteManager_.Draw(light, 0, Position() - (light->Frames[0].Size * 4 / 2), {4, 4});
|
||||||
|
|
||||||
|
if (!App_->State().Variable("NoCompas").Bool()) {
|
||||||
|
auto heroCenter = RenderManager_.Camera() + RenderManager_.Size() / 2;
|
||||||
|
auto delta = ExitPosition_ - heroCenter;
|
||||||
|
auto halfScreenSize = RenderManager_.Size() / 2;
|
||||||
|
auto screenPosition = delta + halfScreenSize;
|
||||||
|
|
||||||
|
if (screenPosition.X < 0 || screenPosition.X > 304 ||
|
||||||
|
screenPosition.Y < 16 || screenPosition.Y > 224) {
|
||||||
|
int index = 0;
|
||||||
|
|
||||||
|
if (std::abs(delta.X) > std::abs(delta.Y)) {
|
||||||
|
if (screenPosition.X < halfScreenSize.X) {
|
||||||
|
index = 2;
|
||||||
|
} else {
|
||||||
|
index = 0;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (screenPosition.Y < halfScreenSize.Y) {
|
||||||
|
index = 1;
|
||||||
|
} else {
|
||||||
|
index = 3;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
RenderManager_.SetLayer(NGame::TRenderManager::Interface);
|
||||||
|
screenPosition.X = std::min(std::max(screenPosition.X, 0), RenderManager_.Size().X - 16);
|
||||||
|
screenPosition.Y = std::min(std::max(screenPosition.Y, 16), RenderManager_.Size().Y - 16);
|
||||||
|
|
||||||
|
auto arrow = SpriteManager_.Get("Sprites/Arrow.txt");
|
||||||
|
SpriteManager_.Draw(arrow, index, screenPosition);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (FadeAmount_) {
|
||||||
|
RenderManager_.SetLayer(NGame::TRenderManager::Interface);
|
||||||
|
if (WhiteFade_) {
|
||||||
|
RenderManager_.SetColor(255, 255, 255, FadeAmount_);
|
||||||
|
} else {
|
||||||
|
RenderManager_.SetColor(0, 0, 0, FadeAmount_);
|
||||||
|
}
|
||||||
|
RenderManager_.DrawRect({0, 0}, {320, 240}, true);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void THero::Alarm(NGame::TAlarm::TId id) {
|
void THero::Alarm(NGame::TAlarm::TId id) {
|
||||||
@@ -1078,7 +1156,8 @@ TRubbleEntity::TRubbleEntity(NGame::TEntity::TId id)
|
|||||||
, SpriteManager_(App_->SpriteManager()) {
|
, SpriteManager_(App_->SpriteManager()) {
|
||||||
SetSize(8);
|
SetSize(8);
|
||||||
Sprite_ = NGame::TApp::Instance()->SpriteManager().Get("Sprites/Stone.txt");
|
Sprite_ = NGame::TApp::Instance()->SpriteManager().Get("Sprites/Stone.txt");
|
||||||
Alarm_.Set(0, 5000);
|
Alarm_.Set(0, 3000 + rand() % 1000);
|
||||||
|
Flip_ = (rand() % 2) == 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
void TRubbleEntity::Update(std::uint32_t delta) {
|
void TRubbleEntity::Update(std::uint32_t delta) {
|
||||||
@@ -1105,7 +1184,11 @@ void TRubbleEntity::Update(std::uint32_t delta) {
|
|||||||
|
|
||||||
void TRubbleEntity::Draw() const {
|
void TRubbleEntity::Draw() const {
|
||||||
RenderManager_.SetLayer(NGame::TRenderManager::Foreground);
|
RenderManager_.SetLayer(NGame::TRenderManager::Foreground);
|
||||||
SpriteManager_.Draw(Sprite_, 0, Position());
|
if (Flip_) {
|
||||||
|
SpriteManager_.Draw(Sprite_, 0, Position());
|
||||||
|
} else {
|
||||||
|
SpriteManager_.Draw(Sprite_, 0, Position(), {-1, 1});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void TRubbleEntity::Alarm(NGame::TAlarm::TId id) {
|
void TRubbleEntity::Alarm(NGame::TAlarm::TId id) {
|
||||||
@@ -1121,3 +1204,112 @@ const NGame::Vec2f& TRubbleEntity::Speed() const {
|
|||||||
void TRubbleEntity::SetSpeed(const NGame::Vec2f& speed) {
|
void TRubbleEntity::SetSpeed(const NGame::Vec2f& speed) {
|
||||||
Speed_ = speed;
|
Speed_ = speed;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TMainMenu::TMainMenu(NGame::TEntity::TId id)
|
||||||
|
: NGame::TEntity(id)
|
||||||
|
, App_(NGame::TApp::Instance())
|
||||||
|
, RenderManager_(App_->RenderManager())
|
||||||
|
, SpriteManager_(App_->SpriteManager()) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void TMainMenu::Update(std::uint32_t delta) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void TMainMenu::Draw() const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void TMainMenu::Alarm(NGame::TAlarm::TId id) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
TEulaMenu::TEulaMenu(NGame::TEntity::TId id)
|
||||||
|
: NGame::TEntity(id)
|
||||||
|
, App_(NGame::TApp::Instance())
|
||||||
|
, RenderManager_(App_->RenderManager())
|
||||||
|
, SpriteManager_(App_->SpriteManager()) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void TEulaMenu::Update(std::uint32_t delta) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void TEulaMenu::Draw() const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void TEulaMenu::Alarm(NGame::TAlarm::TId id) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
TIntroMenu::TIntroMenu(NGame::TEntity::TId id)
|
||||||
|
: NGame::TEntity(id)
|
||||||
|
, App_(NGame::TApp::Instance())
|
||||||
|
, RenderManager_(App_->RenderManager())
|
||||||
|
, SpriteManager_(App_->SpriteManager()) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void TIntroMenu::Update(std::uint32_t delta) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void TIntroMenu::Draw() const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void TIntroMenu::Alarm(NGame::TAlarm::TId id) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
TOutroMenu::TOutroMenu(NGame::TEntity::TId id)
|
||||||
|
: NGame::TEntity(id)
|
||||||
|
, App_(NGame::TApp::Instance())
|
||||||
|
, RenderManager_(App_->RenderManager())
|
||||||
|
, SpriteManager_(App_->SpriteManager()) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void TOutroMenu::Update(std::uint32_t delta) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void TOutroMenu::Draw() const {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void TOutroMenu::Alarm(NGame::TAlarm::TId id) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
TTorchEntity::TTorchEntity(NGame::TEntity::TId id)
|
||||||
|
: NGame::TEntity(id)
|
||||||
|
, App_(NGame::TApp::Instance())
|
||||||
|
, RenderManager_(App_->RenderManager())
|
||||||
|
, SpriteManager_(App_->SpriteManager()) {
|
||||||
|
SetSize(16);
|
||||||
|
Sprite_ = SpriteManager_.Get("Sprites/Item.txt");
|
||||||
|
LightSprite_ = SpriteManager_.Get("Sprites/Light.txt");
|
||||||
|
}
|
||||||
|
|
||||||
|
void TTorchEntity::Update(std::uint32_t delta) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void TTorchEntity::Draw() const {
|
||||||
|
RenderManager_.SetLayer(NGame::TRenderManager::Background);
|
||||||
|
SpriteManager_.Draw(Sprite_, 2, Position());
|
||||||
|
|
||||||
|
if (RenderManager_.IsLightEnabled()) {
|
||||||
|
RenderManager_.SetLayer(NGame::TRenderManager::Light);
|
||||||
|
SpriteManager_.Draw(LightSprite_, 1, Position() + Size() / 2 - LightSprite_->Frames[1].Size * 2, {4, 4});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void TTorchEntity::Alarm(NGame::TAlarm::TId id) {
|
||||||
|
|
||||||
|
}
|
||||||
|
|||||||
+79
-4
@@ -231,8 +231,6 @@ private:
|
|||||||
|
|
||||||
enum ETile {
|
enum ETile {
|
||||||
Empty,
|
Empty,
|
||||||
Baddy,
|
|
||||||
Curse,
|
|
||||||
Dirt,
|
Dirt,
|
||||||
Grass,
|
Grass,
|
||||||
HighDirt,
|
HighDirt,
|
||||||
@@ -243,7 +241,7 @@ private:
|
|||||||
Passage,
|
Passage,
|
||||||
Plank,
|
Plank,
|
||||||
Spike,
|
Spike,
|
||||||
Utility,
|
Torch
|
||||||
};
|
};
|
||||||
|
|
||||||
struct TRoom {
|
struct TRoom {
|
||||||
@@ -316,7 +314,11 @@ private:
|
|||||||
NGame::Vec2i LastStablePosition_ = {};
|
NGame::Vec2i LastStablePosition_ = {};
|
||||||
NGame::Vec2f Speed_ = NGame::Vec2f(0.0, 0.0);
|
NGame::Vec2f Speed_ = NGame::Vec2f(0.0, 0.0);
|
||||||
NGame::Vec2f Fraction_ = NGame::Vec2f(0.0, 0.0);
|
NGame::Vec2f Fraction_ = NGame::Vec2f(0.0, 0.0);
|
||||||
NGame::Vec2i Want_;
|
NGame::Vec2i ExitPosition_;
|
||||||
|
|
||||||
|
|
||||||
|
bool WhiteFade_ = false;
|
||||||
|
std::size_t FadeAmount_ = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
class TBackgroundTiler : public NGame::TEntity {
|
class TBackgroundTiler : public NGame::TEntity {
|
||||||
@@ -352,4 +354,77 @@ private:
|
|||||||
std::shared_ptr<NGame::TSpriteManager::TSprite> Sprite_;
|
std::shared_ptr<NGame::TSpriteManager::TSprite> Sprite_;
|
||||||
NGame::Vec2f Speed_ = NGame::Vec2f(0.0, 0.0);
|
NGame::Vec2f Speed_ = NGame::Vec2f(0.0, 0.0);
|
||||||
NGame::Vec2f Fraction_ = NGame::Vec2f(0.0, 0.0);
|
NGame::Vec2f Fraction_ = NGame::Vec2f(0.0, 0.0);
|
||||||
|
bool Flip_ = false;
|
||||||
|
};
|
||||||
|
|
||||||
|
class TMainMenu : public NGame::TEntity {
|
||||||
|
public:
|
||||||
|
TMainMenu(NGame::TEntity::TId id);
|
||||||
|
|
||||||
|
virtual void Update(std::uint32_t delta) override;
|
||||||
|
virtual void Draw() const override;
|
||||||
|
virtual void Alarm(NGame::TAlarm::TId id) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
NGame::TApp* App_;
|
||||||
|
NGame::TSpriteManager& SpriteManager_;
|
||||||
|
NGame::TRenderManager& RenderManager_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class TEulaMenu : public NGame::TEntity {
|
||||||
|
public:
|
||||||
|
TEulaMenu(NGame::TEntity::TId id);
|
||||||
|
|
||||||
|
virtual void Update(std::uint32_t delta) override;
|
||||||
|
virtual void Draw() const override;
|
||||||
|
virtual void Alarm(NGame::TAlarm::TId id) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
NGame::TApp* App_;
|
||||||
|
NGame::TSpriteManager& SpriteManager_;
|
||||||
|
NGame::TRenderManager& RenderManager_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class TIntroMenu : public NGame::TEntity {
|
||||||
|
public:
|
||||||
|
TIntroMenu(NGame::TEntity::TId id);
|
||||||
|
|
||||||
|
virtual void Update(std::uint32_t delta) override;
|
||||||
|
virtual void Draw() const override;
|
||||||
|
virtual void Alarm(NGame::TAlarm::TId id) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
NGame::TApp* App_;
|
||||||
|
NGame::TSpriteManager& SpriteManager_;
|
||||||
|
NGame::TRenderManager& RenderManager_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class TOutroMenu : public NGame::TEntity {
|
||||||
|
public:
|
||||||
|
TOutroMenu(NGame::TEntity::TId id);
|
||||||
|
|
||||||
|
virtual void Update(std::uint32_t delta) override;
|
||||||
|
virtual void Draw() const override;
|
||||||
|
virtual void Alarm(NGame::TAlarm::TId id) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
NGame::TApp* App_;
|
||||||
|
NGame::TSpriteManager& SpriteManager_;
|
||||||
|
NGame::TRenderManager& RenderManager_;
|
||||||
|
};
|
||||||
|
|
||||||
|
class TTorchEntity : public NGame::TEntity {
|
||||||
|
public:
|
||||||
|
TTorchEntity(NGame::TEntity::TId id);
|
||||||
|
|
||||||
|
virtual void Update(std::uint32_t delta) override;
|
||||||
|
virtual void Draw() const override;
|
||||||
|
virtual void Alarm(NGame::TAlarm::TId id) override;
|
||||||
|
|
||||||
|
private:
|
||||||
|
std::shared_ptr<NGame::TSpriteManager::TSprite> Sprite_;
|
||||||
|
std::shared_ptr<NGame::TSpriteManager::TSprite> LightSprite_;
|
||||||
|
NGame::TApp* App_;
|
||||||
|
NGame::TSpriteManager& SpriteManager_;
|
||||||
|
NGame::TRenderManager& RenderManager_;
|
||||||
};
|
};
|
||||||
Reference in New Issue
Block a user