static void update_enemies() { static u32b_t ticks=0; // Start a new wave if needed. ticks++; if( ticks >= 10000 ) { ticks = 0; start_wave(); } // Update the enemies. update_enemy_effects(); update_enemies_path(); }
void PlaybackChannel::handle_start(RedPeer::InMessage* message) { PlaybackHandler* handler = static_cast<PlaybackHandler*>(get_message_handler()); SpiceMsgPlaybackStart* start = (SpiceMsgPlaybackStart*)message->data(); handler->set_handler(SPICE_MSG_PLAYBACK_START, NULL); handler->set_handler(SPICE_MSG_PLAYBACK_STOP, &PlaybackChannel::handle_stop); #ifdef WAVE_CAPTURE start_wave(); #endif if (!_wave_player) { // for now support only one setting int celt_mode_err; if (start->format != SPICE_AUDIO_FMT_S16) { THROW("unexpected format"); } int bits_per_sample = 16; int frame_size = 256; _frame_bytes = frame_size * start->channels * bits_per_sample / 8; try { _wave_player = Platform::create_player(start->frequency, bits_per_sample, start->channels); } catch (...) { LOG_WARN("create player failed"); //todo: support disconnecting single channel disable(); return; } if (!(_celt_mode = celt051_mode_create(start->frequency, start->channels, frame_size, &celt_mode_err))) { THROW("create celt mode failed %d", celt_mode_err); } if (!(_celt_decoder = celt051_decoder_create(_celt_mode))) { THROW("create celt decoder"); } } _playing = true; _frame_count = 0; set_data_handler(); }
static void game_loop() { u64b_t ticks = 0; u64b_t t1,t2,sleep; // Set a path for enemies ... State->path = load_path_file("data/bmp/path.bmp"); // Load tower positions from file.. load_towers_file("data/bmp/towers.bmp"); // Add some stuff ... start_wave(); add_some_gems(); // Start the GUI StartGUI("v0.0.1",((gstate_t*)State)); UpdateGuiState(((gstate_t*)State)); while( (State->time = ++ticks) ) { // Progress the game one time step t1 = get_time(); tick(); t2 = get_time(); // Update the gui UpdateGuiState(((gstate_t*)State)); // Sleep for the remainder of the tick cycle if( (t1 < t2) && ((t2-t1) < 5000) ) { sleep = 5000 - (t2-t1); if( sleep > 0 ) { usleep( sleep ); } } } }
static void process_events() { game_eventq_t *q; gem_t gem; int i; for(q=game_event_get(NULL); q; q=game_event_get(q)) { // Find event type switch(q->type) { case GAME_EVENT_TOWER_INSTALL_GEM: for(i=0; i<State->player.ntowers; i++) { // Apply event to the tower at the specified location. if( vector3_compare(&(State->player.towers[i].position), &(q->tower_install_gem.tpos)) ) { tower_install_gem(&(State->player.towers[i]), &(State->player.bag.items[q->tower_install_gem.ndx].gem)); bag_remove_item(&(State->player.bag),q->tower_install_gem.ndx); break; } } // Remove the event from the queue. game_event_remove(q); break; case GAME_EVENT_TOWER_REMOVE_GEM: for(i=0; i<State->player.ntowers; i++) { // Apply event to the tower at the specified location. if( vector3_compare(&(State->player.towers[i].position), &(q->tower_install_gem.tpos)) ) { bag_add_gem(&(State->player.bag), &(State->player.towers[i].gem)); tower_remove_gem(&(State->player.towers[i])); break; } } // Remove the event from the queue. game_event_remove(q); break; case GAME_EVENT_TOWER_SWAP_GEM: for(i=0; i<State->player.ntowers; i++) { // Apply event to the tower at the specified location. if( vector3_compare(&(State->player.towers[i].position), &(q->tower_install_gem.tpos)) ) { bag_add_gem(&(State->player.bag), &(State->player.towers[i].gem)); tower_remove_gem(&(State->player.towers[i])); tower_install_gem(&(State->player.towers[i]), &(State->player.bag.items[q->tower_install_gem.ndx].gem)); bag_remove_item(&(State->player.bag),q->tower_install_gem.ndx); break; } } // Remove the event from the queue. game_event_remove(q); break; case GAME_EVENT_CREATE_GEM: // Create new gem in player's bag. if( State->player.mana >= GEM_CREATE_MANA_COST ) { bag_add_gem(&(State->player.bag), &(q->create_gem.gem)); State->player.mana -= GEM_CREATE_MANA_COST; } // Remove the event from the queue. game_event_remove(q); break; case GAME_EVENT_MIX_GEMS: // Mix gems in player's bag. if( State->player.mana >= GEM_MIX_MANA_COST ) { // Make new "mixed" gem. gem_mix_gems(&(State->player.bag.items[q->mix_gems.ndx1].gem), &(State->player.bag.items[q->mix_gems.ndx2].gem), &gem); bag_add_gem(&(State->player.bag), &gem); // Remove the "parent" gems. bag_remove_item(&(State->player.bag),q->mix_gems.ndx1); bag_remove_item(&(State->player.bag),q->mix_gems.ndx2); // Apply mana cost. State->player.mana -= GEM_MIX_MANA_COST; } // Remove the event from the queue. game_event_remove(q); break; case GAME_EVENT_NEXT_WAVE: // Bring next wave early. start_wave(); // Give player a bonus. State->player.mana += 10; State->player.xp += 100; // Remove the event from the queue. game_event_remove(q); break; } } }