Page MenuHomePhabricator (Chris)

No OneTemporary

Authored By
Unknown
Size
8 KB
Referenced Files
None
Subscribers
None
diff --git a/src/DungeonMap.h b/src/DungeonMap.h
index 95779ee..703156b 100644
--- a/src/DungeonMap.h
+++ b/src/DungeonMap.h
@@ -1,102 +1,103 @@
#ifndef MAGICMAP_H
#define MAGICMAP_H
#include "sfml_game/GameMap.h"
#include "sfml_game/MyTools.h"
#include <list>
const int MAP_NORMAL_FLOOR = 3;
const int MAP_WALL = 50;
const int MAP_DOOR = 51;
const int MAP_WALL_7 = 52;
const int MAP_WALL_8 = 53;
const int MAP_WALL_9 = 54;
const int MAP_WALL_4 = 55;
const int MAP_WALL_6 = 56;
const int MAP_WALL_1 = 57;
const int MAP_WALL_2 = 58;
const int MAP_WALL_3 = 59;
class GameFloor;
enum roomTypeEnum
{
- roomTypeStarting,
+ roomTypeNULL,
roomTypeStandard,
roomTypeBoss,
roomTypeMerchant,
roomTypeKey,
roomTypeBonus,
- roomTypeExit
+ roomTypeExit,
+ roomTypeStarting
};
class DungeonMap : public GameMap
{
public:
DungeonMap(int width, int height);
DungeonMap(GameFloor* gameFloor, int x, int y);
virtual ~DungeonMap();
void displayToConsole();
bool isVisited();
void setVisited(bool b);
bool isKnown();
void setKnown(bool b);
bool isCleared();
void setCleared(bool b);
bool isWalkable(int x, int y);
// 0 == no, 1 == yes, 2 == boss
int hasNeighbourLeft();
int hasNeighbourRight();
int hasNeighbourUp();
int hasNeighbourDown();
virtual bool isDownBlocking(int x, int y);
virtual bool isUpBlocking(int x, int y);
virtual bool isLeftBlocking(int x, int y);
virtual bool isRightBlocking(int x, int y);
virtual void randomize(int n);
void initRoom();
void generateCarpet(int x0, int y0, int w, int h, int n);
void generateRoom(int type);
Vector2D generateBonusRoom();
Vector2D generateMerchantRoom();
Vector2D generateKeyRoom();
void addItem(int itemType, float x, float y, bool merch);
void addSprite(int spriteType, int frame, float x, float y, float scale);
void addChest(int chestType, bool state, float x, float y);
void restoreItems();
void restoreSprites();
void restoreChests();
void restoreMapObjects();
roomTypeEnum getRoomType();
void setRoomType(roomTypeEnum roomType);
struct itemListElement { int type; float x; float y; bool merch; };
typedef std::list<itemListElement> ItemList;
struct spriteListElement { int type; int frame; float x; float y; float scale;};
typedef std::list<spriteListElement> SpriteList;
struct chestListElement { int type; bool state; float x; float y;};
typedef std::list<chestListElement> ChestList;
protected:
private:
GameFloor* gameFloor;
int x, y;
bool visited;
bool known;
bool cleared;
roomTypeEnum roomType;
ItemList itemList;
SpriteList spriteList;
ChestList chestList;
};
#endif // MAGICMAP_H
diff --git a/src/GameFloor.cpp b/src/GameFloor.cpp
index 0a438b5..8544335 100644
--- a/src/GameFloor.cpp
+++ b/src/GameFloor.cpp
@@ -1,270 +1,269 @@
#include "GameFloor.h"
#include <time.h>
#include <cstdlib>
#include <stdio.h>
#include <iostream>
GameFloor::GameFloor(int level)
{
this->level = level;
// Init maps
for (int i=0; i < FLOOR_WIDTH; i++)
for (int j=0; j < FLOOR_HEIGHT; j++)
maps[i][j] = NULL;
srand(time(NULL));
createFloor();
}
GameFloor::~GameFloor()
{
// Free maps
for (int i=0; i < FLOOR_WIDTH; i++)
for (int j=0; j < FLOOR_HEIGHT; j++)
if (maps[i][j] != NULL) delete (maps[i][j]);
}
int GameFloor::getRoom(int x, int y)
{
if (x < 0 || y < 0 || x >= FLOOR_WIDTH || y >= FLOOR_HEIGHT) return 0;
return floor[x][y];
}
DungeonMap* GameFloor::getMap(int x, int y)
{
if (x < 0 || y < 0 || x >= FLOOR_WIDTH || y >= FLOOR_HEIGHT) return NULL;
return maps[x][y];
}
DungeonMap* GameFloor::getAndVisitMap(int x, int y)
{
maps[x][y]->setVisited(true);
if (x > 0 && floor[x-1][y] > 0) maps[x-1][y]->setKnown(true);
if (x < FLOOR_WIDTH - 1 && floor[x+1][y] > 0) maps[x+1][y]->setKnown(true);;
if (y > 0 && floor[x][y-1] > 0) maps[x][y-1]->setKnown(true);;
if (y < FLOOR_HEIGHT - 1 && floor[x][y+1] > 0) maps[x][y+1]->setKnown(true);;
return maps[x][y];
}
void GameFloor::displayToConsole()
{
for (int j=0; j < FLOOR_HEIGHT; j++)
{
for (int i=0; i < FLOOR_WIDTH; i++)
{
switch (floor[i][j])
{
case 0: printf("."); break;
case 1: printf("#"); break;
case 2: printf("&"); break;
case 3: printf("$"); break;
case 4: printf("!"); break;
case 5: printf("*"); break;
case 6: printf("X"); break;
+ case 7: printf("0"); break;
}
}
printf("\n");
}
}
int GameFloor::neighboorCount(int x, int y)
{
int count = 0;
if (x > 0 && floor[x-1][y] > 0) count++;
if (x < FLOOR_WIDTH - 1 && floor[x+1][y] > 0) count++;
if (y > 0 && floor[x][y-1] > 0) count++;
if (y < FLOOR_HEIGHT - 1 && floor[x][y+1] > 0) count++;
return count;
}
bool GameFloor::isSuperIsolated(int x, int y)
{
if (neighboorCount(x, y) != 1) return false;
else
{
if (x > 0 && floor[x-1][y]==1 && neighboorCount(x-1, y) == 2)
{
floor[x-1][y] = roomTypeBoss;
floor[x][y] = roomTypeExit;
return true;
}
else if (x < FLOOR_WIDTH - 1 && floor[x+1][y]==1 && neighboorCount(x+1, y) == 2)
{
floor[x+1][y] = roomTypeBoss;
floor[x][y] = roomTypeExit;
return true;
}
else if (y > 0 && floor[x][y-1]==1 && neighboorCount(x, y-1) == 2)
{
floor[x][y-1] = roomTypeBoss;
floor[x][y] = roomTypeExit;
return true;
}
else if (y < FLOOR_HEIGHT - 1 && floor[x][y+1]==1 && neighboorCount(x, y+1) == 2)
{
floor[x][y+1] = roomTypeBoss;
floor[x][y] = roomTypeExit;
return true;
}
}
return false;
}
bool GameFloor::finalize()
{
bool bKey = false;
bool bBonus = false;
bool bMerchant = false;
bool bExit = false;
for (int i=0; i < FLOOR_WIDTH; i++)
for (int j=0; j < FLOOR_HEIGHT; j++)
{
if (floor[i][j] == 1 && neighboorCount(i, j) == roomTypeStandard)
{
if (!bExit && isSuperIsolated(i, j))
{
bExit = true;
}
else
{
if (!bKey)
{
floor[i][j]= roomTypeKey;
bKey = true;
}
else if (!bBonus)
{
floor[i][j]= roomTypeBonus;
bBonus = true;
}
else if (!bMerchant)
{
floor[i][j]= roomTypeMerchant;
bMerchant = true;
}
}
}
}
return bExit && bKey && bBonus;
}
void GameFloor::createFloor()
{
bool ok=false;
while (!ok)
{
generate();
ok = finalize();
int x0 = FLOOR_WIDTH / 2;
int y0 = FLOOR_HEIGHT / 2;
// Maps
for (int i=0; i < FLOOR_WIDTH; i++)
for (int j=0; j < FLOOR_HEIGHT; j++)
if (floor[i][j] > 0)
{
maps[i][j] = new DungeonMap(this, i, j);
if (i == x0 && j == y0)
- //maps[i][j]->randomize(0);
maps[i][j]->setRoomType(roomTypeStarting);
else
- //maps[i][j]->randomize(floor[i][j]);
maps[i][j]->setRoomType((roomTypeEnum)(floor[i][j]));
}
displayToConsole();
}
}
void GameFloor::generate()
{
int i, j;
int nbRooms;
int requiredRoms = 15;
// Init
for (i=0; i < FLOOR_WIDTH; i++)
for (j=0; j < FLOOR_HEIGHT; j++)
{
floor[i][j] = 0;
//if (maps[i][j] != NULL) delete maps[i][j];
}
// First room
int x0 = FLOOR_WIDTH / 2;
int y0 = FLOOR_HEIGHT / 2;
- floor[x0][y0] = 1;
+ floor[x0][y0] = roomTypeStarting;
nbRooms = 1;
// neighboor
while (nbRooms == 1)
{
if (rand() % 3 == 0)
{
floor[x0-1][y0] = 1;
nbRooms++;
}
if (rand() % 3 == 0)
{
floor[x0+1][y0] = 1;
nbRooms++;
}
if (rand() % 3 == 0)
{
floor[x0][y0-1] = 1;
nbRooms++;
}
if (rand() % 3 == 0)
{
floor[x0][y0+1] = 1;
nbRooms++;
}
}
// others
while (nbRooms < requiredRoms)
for (int k = 0; k < 8; k++)
{
i = rand() % FLOOR_WIDTH;
j = rand() % FLOOR_HEIGHT;
if (floor[i][j] == 0)
{
int n = neighboorCount(i, j);
switch (n)
{
case 1:
{
floor[i][j] = 1;
nbRooms++;
break;
}
case 2:
{
if (rand()% 5 == 0)
{
floor[i][j] = 1;
nbRooms++;
}
break;
}
case 3:
{
if (rand()% 20 == 0)
{
floor[i][j] = 1;
nbRooms++;
}
break;
}
}
}
}
}

File Metadata

Mime Type
text/x-diff
Expires
Thu, Jun 11, 11:49 AM (3 w, 4 d ago)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
68879
Default Alt Text
(8 KB)

Event Timeline