예제 #1
0
파일: game.cpp 프로젝트: elemel/crust
    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();
    }
예제 #2
0
파일: engine.cpp 프로젝트: jastadj/johnrl
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();

}
예제 #3
0
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;
}
예제 #4
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;
}