コード例 #1
0
ファイル: set.c プロジェクト: senquack/neverball
void level_snap(int i, const char *path)
{
    char *filename;

    /* Convert the level name to a PNG filename. */

    filename = concat_string(path,
                             "/",
                             base_name_sans(level_v[i].file, ".sol"),
                             ".png",
                             NULL);

    /* Initialize the game for a snapshot. */

    if (game_client_init(level_v[i].file))
    {
        union cmd cmd;
        cmd.type = CMD_GOAL_OPEN;
        game_proxy_enq(&cmd);
        game_client_sync(NULL);

        /* Render the level and grab the screen. */

        video_clear();
        game_client_fly(1.0f);
        game_kill_fade();
        game_client_draw(POSE_LEVEL, 0);
        video_snap(filename);
        video_swap();
    }

    free(filename);
}
コード例 #2
0
ファイル: st_title.c プロジェクト: NeverHack/neverball
static int init_title_level(void)
{
    if (game_client_init("map-medium/title.sol"))
    {
        union cmd cmd;

        cmd.type = CMD_GOAL_OPEN;
        game_proxy_enq(&cmd);
        game_client_sync(NULL);

        game_client_fly(1.0f);

        return 1;
    }
    return 0;
}
コード例 #3
0
ファイル: progress.c プロジェクト: AMDmi3/neverball
static int init_level(void)
{
    demo_play_init(USER_REPLAY_FILE, level, mode,
                   curr.score, curr.balls, curr.times);

    /*
     * Init both client and server, then process the first batch
     * of commands generated by the server to sync client to
     * server.
     */

    if (game_client_init(level_file(level)) &&
        game_server_init(level_file(level), level_time(level), goal_e))
    {
        game_client_sync(demo_fp);
        audio_music_fade_to(2.0f, level_song(level));
        return 1;
    }

    demo_play_stop(1);
    return 0;
}
コード例 #4
0
ファイル: GameServer.cpp プロジェクト: Deledrius/dirtsand
void* wk_gameWorker(void* sockp)
{
    GameClient_Private client;
    client.m_sock = reinterpret_cast<DS::SocketHandle>(sockp);
    client.m_host = 0;
    client.m_crypt = 0;
    client.m_isLoaded = false;

    try {
        game_client_init(client);
    } catch (DS::AssertException ex) {
        fprintf(stderr, "[Game] Assertion failed at %s:%ld:  %s\n",
                ex.m_file, ex.m_line, ex.m_cond);
        return 0;
    } catch (DS::SockHup) {
        // Socket closed...
        return 0;
    }

    try {
        for ( ;; ) {
            uint16_t msgId = DS::CryptRecvValue<uint16_t>(client.m_sock, client.m_crypt);
            switch (msgId) {
            case e_CliToGame_PingRequest:
                cb_ping(client);
                break;
            case e_CliToGame_JoinAgeRequest:
                cb_join(client);
                break;
            case e_CliToGame_Propagatebuffer:
                DS_PASSERT(client.m_host != 0);
                cb_netmsg(client);
                break;
            case e_CliToGame_GameMgrMsg:
                DS_PASSERT(client.m_host != 0);
                cb_gameMgrMsg(client);
                break;
            default:
                /* Invalid message */
                fprintf(stderr, "[Game] Got invalid message ID %d from %s\n",
                        msgId, DS::SockIpAddress(client.m_sock).c_str());
                DS::CloseSock(client.m_sock);
                throw DS::SockHup();
            }
        }
    } catch (DS::AssertException ex) {
        fprintf(stderr, "[Game] Assertion failed at %s:%ld:  %s\n",
                ex.m_file, ex.m_line, ex.m_cond);
    } catch (DS::SockHup) {
        // Socket closed...
    }

    if (client.m_host) {
        pthread_mutex_lock(&client.m_host->m_clientMutex);
        client.m_host->m_clients.erase(client.m_clientInfo.m_PlayerId);
        pthread_mutex_unlock(&client.m_host->m_clientMutex);
        Game_ClientMessage msg;
        msg.m_client = &client;
        client.m_host->m_channel.putMessage(e_GameDisconnect, reinterpret_cast<void*>(&msg));
        client.m_channel.getMessage();
    }

    DS::CryptStateFree(client.m_crypt);
    DS::FreeSock(client.m_sock);
    return 0;
}