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); }
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; }
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; }
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; }