Game::Game(Config const *config) : config_(config), quitting_(false), windowWidth_(config->windowWidth), windowHeight_(config->windowHeight), window_(0), context_(0), appTime_(0.0), time_(0.0), bounds_(Vector2(-15.0f, -15.0f), Vector2(15.0f, 15.0f)), fpsTime_(0.0), fpsCount_(0), delauneyTriangulation_(bounds_), dungeonGenerator_(&random_, bounds_), playerActor_(0) { actorFactory_.reset(new ActorFactory(this)); initWindow(); initContext(); initVoronoiDiagram(); inputManager_.reset(new InputManager(this)); physicsManager_.reset(new PhysicsManager(this)); controlService_.reset(new ControlService(this)); graphicsManager_.reset(new GraphicsManager(this)); initBlocks(); initDungeon(); initMonsters(); }
void Engine::start() { //start console thread console_thread = new sf::Thread(&Engine::console, this); console_thread->launch(); //init curses std::cout << "Initializing SFMLCurs..."; if(initCurses()) std::cout << "done.\n"; else std::cout << "failed.\n"; //init screen std::cout << "Initializing screen..."; if(initScreen()) std::cout << "done.\n"; else std::cout << "failed.\n"; std::cout << "Initializing liquids..."; if(initLiquids()) std::cout << "done.\n"; else std::cout << "failed.\n"; std::cout << "Initializing map tiles..."; if(initMapTiles()) std::cout << "done.\n"; else std::cout << "failed.\n"; std::cout << "Initializing monster database list..."; if(initMonsters()) std::cout << "done.\n"; else std::cout << "failed.\n"; std::cout << "Initializing item database list..."; if(initItems()) std::cout << "done.\n"; else std::cout << "failed.\n"; //debug noise //noisetest(); std::cout << "Starting new game.\n"; newGame(); //start mainloop std::cout << "Starting main loop...\n"; mainLoop(); //if player died... if(!m_Player->isAlive()) playerDeath(); }
int generateDungeon(dungeon_t* dungeonPtr) { dungeonPtr->roomCount = MIN_ROOMS + (rand() % (MAX_ROOMS - MIN_ROOMS + 1)); printf("Room count: %d\n", dungeonPtr->roomCount); if (!(dungeonPtr->rooms = malloc(sizeof(room_t) * dungeonPtr->roomCount))) { return -1; } for (int i = 0; i < dungeonPtr->roomCount; i++) { generateRoom(&dungeonPtr->rooms[i], dungeonPtr->rooms, i); } if (populateGrid(dungeonPtr)) { return -2; } connectRooms(dungeonPtr->grid, dungeonPtr->rooms, dungeonPtr->roomCount); initMonsters(dungeonPtr); turnInit(dungeonPtr); return 0; }
int loadDungeon(dungeon_t* dungeonPtr, char* fileName) { size_t bytesRead; char magicBytes[6]; uint32_t version; uint32_t dataLen; // malloc2DArray could fail. Should be checked. malloc2DArray((void ***) &dungeonPtr->grid, sizeof(**dungeonPtr->grid), WIDTH, HEIGHT); FILE* file = fopen(fileName, "r"); if (file == NULL) { // error opening file return -1; } // read magic bytes bytesRead = fread(magicBytes, sizeof(char), 6, file); if (bytesRead < 6) { // error reading magic bytes return -2; } if (strncmp("RLG327", magicBytes, 6) != 0) { // invalid magic bytes return -3; } // read version bytesRead = fread(&version, sizeof(version), 1, file); if (bytesRead != 1) { // Error reading version return -4; } if (version != VERSION) { // file version is newer than this program's version return -5; } version = be32toh(version); // read data length bytesRead = fread(&dataLen, sizeof(dataLen), 1, file); if (bytesRead != 1) { // error reading data len return -6; } dataLen = be32toh(dataLen); if (dataLen < 1482) { // data is too short for the grid return -7; } // place the solid border for (int x = 0; x < WIDTH; x++) { dungeonPtr->grid[0][x].hardness = 255; dungeonPtr->grid[0][x].material = rock; dungeonPtr->grid[0][x].monsterPtr = NULL; dungeonPtr->grid[HEIGHT - 1][x].hardness = 255; dungeonPtr->grid[HEIGHT - 1][x].material = rock; dungeonPtr->grid[HEIGHT - 1][x].monsterPtr = NULL; } for (int y = 0; y < HEIGHT; y++) { dungeonPtr->grid[y][0].hardness = ROCK_HARDNESS_IMMUTABLE; dungeonPtr->grid[y][0].material = rock; dungeonPtr->grid[y][0].monsterPtr = NULL; dungeonPtr->grid[y][WIDTH - 1].hardness = ROCK_HARDNESS_IMMUTABLE; dungeonPtr->grid[y][WIDTH - 1].material = rock; dungeonPtr->grid[y][WIDTH - 1].monsterPtr = NULL; } // read the hardness grid for (int y = 0; y < HEIGHT - 2; y++) { for (int x = 0; x < WIDTH - 2; x++) { bytesRead = fread(&dungeonPtr->grid[y + 1][x + 1].hardness, sizeof((**dungeonPtr->grid).hardness), 1, file); if (bytesRead != 1) { // error reading hardness data return -8; } if (dungeonPtr->grid[y + 1][x + 1].hardness == 0) { // The cell is a corridor or a room. For now it will be a corridor. dungeonPtr->grid[y + 1][x + 1].material = corridor; } else { dungeonPtr->grid[y + 1][x + 1].material = rock; } dungeonPtr->grid[y + 1][x + 1].monsterPtr = NULL; } } dataLen -= (HEIGHT - 2) * (WIDTH - 2) + 14; if (dataLen % 4 != 0) { // invalid data length for rooms return -9; } dungeonPtr->roomCount = dataLen / 4; dungeonPtr->rooms = malloc(sizeof(room_t) * dungeonPtr->roomCount); for (int r = 0; r < dungeonPtr->roomCount; r++) { bytesRead = fread(&dungeonPtr->rooms[r], sizeof(room_t), 1, file); if (bytesRead != 1) { // failure reading a room return -10; } } initMonsters(dungeonPtr); turnInit(dungeonPtr); return 0; }