Page Menu
Home
Phabricator (Chris)
Search
Configure Global Search
Log In
Files
F126511
No One
Temporary
Actions
View File
Edit File
Delete File
View Transforms
Subscribe
Flag For Later
Award Token
Authored By
Unknown
Size
8 KB
Referenced Files
None
Subscribers
None
View Options
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
Details
Attached
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)
Attached To
Mode
R78 witchblast
Attached
Detach File
Event Timeline