void vs_handle_action(scene *scene, int action) { vs_local *local = scene_get_userdata(scene); if(dialog_is_visible(&local->too_pathetic_dialog)) { dialog_event(&local->too_pathetic_dialog, action); } else if(dialog_is_visible(&local->quit_dialog)) { dialog_event(&local->quit_dialog, action); } else { switch (action) { case ACT_KICK: case ACT_PUNCH: game_state_set_next(scene->gs, SCENE_ARENA0+local->arena); break; case ACT_UP: case ACT_LEFT: if(game_state_get_player(scene->gs, 1)->selectable) { local->arena--; if (local->arena < 0) { local->arena =4; } object_select_sprite(&local->arena_select, local->arena); } break; case ACT_DOWN: case ACT_RIGHT: if(game_state_get_player(scene->gs, 1)->selectable) { local->arena++; if (local->arena > 4) { local->arena = 0; } object_select_sprite(&local->arena_select, local->arena); } break; } } }
int vs_is_netplay(scene *scene) { if(game_state_get_player(scene->gs, 0)->ctrl->type == CTRL_TYPE_NETWORK || game_state_get_player(scene->gs, 1)->ctrl->type == CTRL_TYPE_NETWORK) { return 1; } return 0; }
// Attempts to check for any score that is pending from a finished single player game int found_pending_score(scene *scene) { if(game_state_get_player(scene->gs, 1)->ctrl != NULL && game_state_get_player(scene->gs, 1)->ctrl->type == CTRL_TYPE_AI && game_state_get_player(scene->gs, 0)->score.score > 0) { return 1; } return 0; }
void menu_listen_tick(component *c) { listen_menu_data *local = menu_get_userdata(c); game_state *gs = local->s->gs; if(local->host) { ENetEvent event; if(enet_host_service(local->host, &event, 0) > 0 && event.type == ENET_EVENT_TYPE_CONNECT) { ENetPacket * packet = enet_packet_create("0", 2, ENET_PACKET_FLAG_RELIABLE); enet_peer_send(event.peer, 0, packet); enet_host_flush(local->host); DEBUG("client connected!"); controller *player1_ctrl, *player2_ctrl; keyboard_keys *keys; game_player *p1 = game_state_get_player(gs, 0); game_player *p2 = game_state_get_player(gs, 1); // force the speed to 3 game_state_set_speed(gs, 5); p1->har_id = HAR_JAGUAR; p1->pilot_id = 0; p2->har_id = HAR_JAGUAR; p2->pilot_id = 0; player1_ctrl = malloc(sizeof(controller)); controller_init(player1_ctrl); player1_ctrl->har = p1->har; player2_ctrl = malloc(sizeof(controller)); controller_init(player2_ctrl); player2_ctrl->har = p2->har; // Player 1 controller -- Keyboard settings_keyboard *k = &settings_get()->keys; keys = malloc(sizeof(keyboard_keys)); keys->up = SDL_GetScancodeFromName(k->key1_up); keys->down = SDL_GetScancodeFromName(k->key1_down); keys->left = SDL_GetScancodeFromName(k->key1_left); keys->right = SDL_GetScancodeFromName(k->key1_right); keys->punch = SDL_GetScancodeFromName(k->key1_punch); keys->kick = SDL_GetScancodeFromName(k->key1_kick); keys->escape = SDL_GetScancodeFromName(k->key1_escape); keyboard_create(player1_ctrl, keys, 0); game_player_set_ctrl(p1, player1_ctrl); // Player 2 controller -- Network net_controller_create(player2_ctrl, local->host, event.peer, ROLE_SERVER); game_player_set_ctrl(p2, player2_ctrl); local->host = NULL; game_player_set_selectable(p2, 1); chr_score_set_difficulty(game_player_get_score(game_state_get_player(gs, 0)), AI_DIFFICULTY_CHAMPION); chr_score_set_difficulty(game_player_get_score(game_state_get_player(gs, 1)), AI_DIFFICULTY_CHAMPION); game_state_set_next(gs, SCENE_MELEE); } } }
void melee_tick(scene *scene, int paused) { melee_local *local = scene_get_userdata(scene); game_player *player1 = game_state_get_player(scene->gs, 0); game_player *player2 = game_state_get_player(scene->gs, 1); ctrl_event *i = NULL; // Handle extra controller inputs i = player1->ctrl->extra_events; if (i) { do { if(i->type == EVENT_TYPE_ACTION) { handle_action(scene, 1, i->event_data.action); } else if (i->type == EVENT_TYPE_CLOSE) { game_state_set_next(scene->gs, SCENE_MENU); return; } } while((i = i->next)); } i = player2->ctrl->extra_events; if (i) { do { if(i->type == EVENT_TYPE_ACTION) { handle_action(scene, 2, i->event_data.action); } else if (i->type == EVENT_TYPE_CLOSE) { game_state_set_next(scene->gs, SCENE_MENU); return; } } while((i = i->next)); } if(!local->pulsedir) { local->ticks++; } else { local->ticks--; } if(local->ticks > 120) { local->pulsedir = 1; } if(local->ticks == 0) { local->pulsedir = 0; } local->hartick++; if (local->selection == 1) { if(local->hartick > 10) { local->hartick = 0; object_dynamic_tick(&local->har_player1[5*local->row_a + local->column_a]); if (player2->selectable) { object_dynamic_tick(&local->har_player2[5*local->row_b + local->column_b]); } } } }
int console_cmd_god(game_state *gs, int argc, char **argv) { for(int i = 0;i < game_state_num_players(gs);i++) { game_player *gp = game_state_get_player(gs, i); gp->god = !gp->god; } if(game_state_get_player(gs, 0)->god) { console_output_addline("God mode ON"); } else { console_output_addline("God mode OFF"); } return 0; }
int console_cmd_ez_destruct(game_state *gs, int argc, char **argv) { for(int i = 0;i < game_state_num_players(gs);i++) { game_player *gp = game_state_get_player(gs, i); gp->ez_destruct = !gp->ez_destruct; } if(game_state_get_player(gs, 0)->ez_destruct) { console_output_addline("EASY DESTRUCT ON"); } else { console_output_addline("EASY DESTRUCT OFF"); } return 0; }
void newsroom_continue_dialog_clicked(dialog *dlg, dialog_result result){ scene *sc = dlg->userdata; if(result == DIALOG_RESULT_NO) { game_state_set_next(sc->gs, SCENE_MENU); } else if (result == DIALOG_RESULT_YES_OK) { // Resetting p2->sp_wins here allows the game to progress, // otherwise you get stuck with the same opponent game_player *p1 = game_state_get_player(sc->gs, 0); game_player *p2 = game_state_get_player(sc->gs, 1); p2->sp_wins = 0; chr_score_reset(game_player_get_score(p1), 1); chr_score_reset_wins(game_player_get_score(p1)); game_state_set_next(sc->gs, SCENE_VS); } }
void mechlab_input_tick(scene *scene) { mechlab_local *local = scene_get_userdata(scene); game_player *player1 = game_state_get_player(scene->gs, 0); // Poll the controller ctrl_event *p1 = NULL, *i; controller_poll(player1->ctrl, &p1); i = p1; if(i) { do { if(i->type == EVENT_TYPE_ACTION) { // If view is new dashboard view, pass all input to it if(local->dashtype == DASHBOARD_NEW) { // If inputting text for new player name is done, switch to next view. // If ESC, exit view. // Otherwise handle text input if(i->event_data.action == ACT_ESC) { trnmenu_finish(guiframe_get_root(local->frame)); } else if(i->event_data.action == ACT_KICK || i->event_data.action == ACT_PUNCH) { mechlab_select_dashboard(scene, local, DASHBOARD_SELECT_NEW_PIC); trnmenu_finish(guiframe_get_root(local->frame)); // This will trigger exception case in mechlab_tick } else { guiframe_action(local->dashboard, i->event_data.action); } // If view is any other, just pass input to the bottom menu } else { guiframe_action(local->frame, i->event_data.action); } } } while((i = i->next)); } controller_free_chain(p1); }
int cutscene_event(scene *scene, SDL_Event *event) { cutscene_local *local = scene_get_userdata(scene); game_player *player1 = game_state_get_player(scene->gs, 0); ctrl_event *p1=NULL, *i; controller_event(player1->ctrl, event, &p1); i = p1; if (i) { do { if(i->type == EVENT_TYPE_ACTION) { if ( i->event_data.action == ACT_KICK || i->event_data.action == ACT_PUNCH) { if (strlen(local->current) + local->pos < local->len) { local->pos += strlen(local->current)+1; local->current += strlen(local->current)+1; char * p; if ((p = strchr(local->current, '\n'))) { // null out the byte *p = '\0'; } } else { game_state_set_next(scene->gs, cutscene_next_scene(scene)); } return 1; } } } while((i = i->next)); } controller_free_chain(p1); return 1; }
void vs_input_tick(scene *scene) { vs_local *local = scene->userdata; ctrl_event *p1=NULL, *i; game_player *player1 = game_state_get_player(scene->gs, 0); controller_poll(player1->ctrl, &p1); i = p1; if (i) { do { if(i->type == EVENT_TYPE_ACTION) { if (i->event_data.action == ACT_ESC) { if(dialog_is_visible(&local->too_pathetic_dialog)) { dialog_event(&local->too_pathetic_dialog, i->event_data.action); } else if(dialog_is_visible(&local->quit_dialog)) { dialog_event(&local->quit_dialog, i->event_data.action); } else if(vs_is_singleplayer(scene) && player1->sp_wins != 0) { // there's an active singleplayer campaign, confirm quitting dialog_show(&local->quit_dialog, 1); } else { game_state_set_next(scene->gs, SCENE_MELEE); } } else { vs_handle_action(scene, i->event_data.action); } } else if (i->type == EVENT_TYPE_CLOSE) { game_state_set_next(scene->gs, SCENE_MENU); } } while((i = i->next)); } controller_free_chain(p1); }
void render_highlights(scene *scene) { melee_local *local = scene_get_userdata(scene); game_player *player2 = game_state_get_player(scene->gs, 1); int trans; if (player2->selectable && local->row_a == local->row_b && local->column_a == local->column_b) { video_render_sprite_tint(&local->select_hilight, 11 + (62*local->column_a), 115 + (42*local->row_a), color_create(250-local->ticks, 0, 250-local->ticks, 0), 0); } else { if (player2->selectable) { if (local->done_b) { trans = 250; } else { trans = 250 - local->ticks; } video_render_sprite_tint(&local->select_hilight, 11 + (62*local->column_b), 115 + (42*local->row_b), color_create(0, 0, trans, 0), 0); } if (local->done_a) { trans = 250; } else { trans = 250 - local->ticks; } video_render_sprite_tint(&local->select_hilight, 11 + (62*local->column_a), 115 + (42*local->row_a), color_create(trans, 0, 0, 0), 0); } }
void melee_free(scene *scene) { melee_local *local = scene_get_userdata(scene); game_player *player2 = game_state_get_player(scene->gs, 1); surface_free(&local->feh); surface_free(&local->bleh); surface_free(&local->select_hilight); for(int i = 0; i < 2; i++) { component_free(local->bar_power[i]); component_free(local->bar_agility[i]); component_free(local->bar_endurance[i]); } for(int i = 0; i < 10; i++) { object_free(&local->pilots[i]); object_free(&local->harportraits_player1[i]); object_free(&local->har_player1[i]); if (player2->selectable) { object_free(&local->harportraits_player2[i]); object_free(&local->har_player2[i]); } } object_free(&local->player2_placeholder); object_free(&local->unselected_har_portraits); object_free(&local->bigportrait1); if (player2->selectable) { object_free(&local->bigportrait2); } free(local); }
void melee_input_tick(scene *scene) { melee_local *local = scene_get_userdata(scene); game_player *player1 = game_state_get_player(scene->gs, 0); game_player *player2 = game_state_get_player(scene->gs, 1); ctrl_event *p1=NULL, *p2 = NULL, *i; controller_poll(player1->ctrl, &p1); controller_poll(player2->ctrl, &p2); i = p1; if (i) { do { if(i->type == EVENT_TYPE_ACTION) { if (i->event_data.action == ACT_ESC) { sound_play(20, 0.5f, 0.0f, 2.0f); if (local->selection == 1) { // restore the player selection local->column_a = local->pilot_id_a % 5; local->row_a = local->pilot_id_a / 5; local->column_b = local->pilot_id_b % 5; local->row_b = local->pilot_id_b / 5; local->selection = 0; local->done_a = 0; local->done_b = 0; } else { game_state_set_next(scene->gs, SCENE_MENU); } } else { handle_action(scene, 1, i->event_data.action); } } else if (i->type == EVENT_TYPE_CLOSE) { game_state_set_next(scene->gs, SCENE_MENU); } } while((i = i->next)); } controller_free_chain(p1); i = p2; if (i) { do { if(i->type == EVENT_TYPE_ACTION) { handle_action(scene, 2, i->event_data.action); } else if (i->type == EVENT_TYPE_CLOSE) { game_state_set_next(scene->gs, SCENE_MENU); } } while((i = i->next)); } controller_free_chain(p2); }
int console_cmd_har(game_state *gs, int argc, char **argv) { // change har if(argc == 2) { int i; if(strtoint(argv[1], &i)) { if(i < 0 || i > 10) { return 1; } game_player *player = game_state_get_player(gs, 0); if (scene_load_har(game_state_get_scene(gs), 0, player->har_id)) { return 1; } object *har_obj = game_player_get_har(player); vec2i pos = object_get_pos(har_obj); int hd = object_get_direction(har_obj); object *obj = malloc(sizeof(object)); object_create(obj, gs, pos, vec2f_create(0,0)); player->har_id = i; if(har_create(obj, game_state_get_scene(gs)->af_data[0], hd, player->har_id, player->pilot_id, 0)) { object_free(obj); free(obj); return 1; } // Set HAR to controller and game_player game_state_add_object(gs, obj, RENDER_LAYER_MIDDLE, 0, 0); game_state_del_object(gs, har_obj); // Set HAR for player game_player_set_har(player, obj); game_player_get_ctrl(player)->har = obj; game_player_get_har(player)->animation_state.enemy = game_player_get_har(game_state_get_player(gs, 1)); game_player_get_har(game_state_get_player(gs, 1))->animation_state.enemy = game_player_get_har(player); maybe_install_har_hooks(game_state_get_scene(gs)); return 0; } } return 1; }
int console_cmd_lose(game_state *gs, int argc, char **argv) { if(argc == 1) { game_player *player = game_state_get_player(gs, 0); object *har_obj = game_player_get_har(player); har *har = object_get_userdata(har_obj); har->health = 0; return 0; } return 1; }
int console_cmd_stun(game_state *gs, int argc, char **argv) { if(argc == 1) { game_player *player = game_state_get_player(gs, 1); object *har_obj = game_player_get_har(player); har *har = object_get_userdata(har_obj); har->endurance = 0; har->state = STATE_RECOIL; return 0; } return 1; }
void vs_render(scene *scene) { vs_local *local = scene_get_userdata(scene); game_player *player1 = game_state_get_player(scene->gs, 0); game_player *player2 = game_state_get_player(scene->gs, 1); // player 1 HAR object_render(&local->player1_har); // player 2 HAR object_render(&local->player2_har); // player 1 portrait object_render(&local->player1_portrait); // player 2 portrait object_render(&local->player2_portrait); font_render_shadowed(&font_small, local->vs_str, 160-((strlen(local->vs_str)*font_small.w)/2), 0, COLOR_YELLOW, TEXT_SHADOW_RIGHT|TEXT_SHADOW_BOTTOM); if (player2->selectable) { // arena selection video_render_sprite(&local->arena_select_bg, 55, 150, BLEND_ALPHA, 0); object_render(&local->arena_select); // arena name font_render_wrapped(&font_small, lang_get(56+local->arena), 56+72, 153, (211-72)-4, COLOR_GREEN); // arena description font_render_wrapped(&font_small, lang_get(66+local->arena), 56+72, 160, (211-72)-4, COLOR_GREEN); } else if (player2->pilot_id == 10 && settings_get()->gameplay.difficulty < 2) { // kriessack, but not on Veteran or higher font_render_wrapped(&font_small, lang_get(747), 59, 160, 200, COLOR_YELLOW); } else { font_render_wrapped(&font_small, lang_get(749+(11*player1->pilot_id)+player2->pilot_id), 59, 160, 150, COLOR_YELLOW); font_render_wrapped(&font_small, lang_get(870+(11*player2->pilot_id)+player1->pilot_id), 320-(59+150), 180, 150, COLOR_YELLOW); } }
void vs_dynamic_tick(scene *scene, int paused) { game_player *player1 = game_state_get_player(scene->gs, 0); ctrl_event *i = NULL; // Handle extra controller inputs i = player1->ctrl->extra_events; if (i) { do { if(i->type == EVENT_TYPE_ACTION) { vs_handle_action(scene, i->event_data.action); } else if (i->type == EVENT_TYPE_CLOSE) { game_state_set_next(scene->gs, SCENE_MENU); return; } } while((i = i->next)); } }
int mechlab_event(scene *scene, SDL_Event *event) { mechlab_local *local = scene_get_userdata(scene); game_player *player1 = game_state_get_player(scene->gs, 0); if (player1->ctrl->type == CTRL_TYPE_GAMEPAD || (player1->ctrl->type == CTRL_TYPE_KEYBOARD && event->type == SDL_KEYDOWN && keyboard_binds_key(player1->ctrl, event))) { // these events will be handled by polling return 1; } if(local->dashtype == DASHBOARD_NEW) { return guiframe_event(local->dashboard, event); } else { return guiframe_event(local->frame, event); } }
void vs_free(scene *scene) { vs_local *local = scene_get_userdata(scene); game_player *player2 = game_state_get_player(scene->gs, 1); dialog_free(&local->quit_dialog); dialog_free(&local->too_pathetic_dialog); surface_free(&local->arena_select_bg); object_free(&local->player1_portrait); object_free(&local->player2_portrait); object_free(&local->player1_har); object_free(&local->player2_har); if (player2->selectable) { object_free(&local->arena_select); } free(local); }
void lab_dash_main_update(scene *s, dashboard_widgets *dw) { char tmp[64]; game_player *p1; // Load the player information for player 1 // P1 is always the one being edited in tournament dashboard p1 = game_state_get_player(s->gs, 0); // Set up variables properly snprintf(tmp, 64, "RANK: %d", p1->pilot.rank); label_set_text(dw->rank, tmp); snprintf(tmp, 64, "WINS: %d", p1->pilot.wins); label_set_text(dw->wins, tmp); snprintf(tmp, 64, "LOSES: %d", p1->pilot.losses); label_set_text(dw->losses, tmp); snprintf(tmp, 64, "MONEY: $ %dK", p1->pilot.money); label_set_text(dw->money, tmp); // Tournament and player name label_set_text(dw->name, p1->pilot.name); label_set_text(dw->tournament, p1->pilot.trn_desc); #define SET_GAUGE_X(name) gauge_set_lit(dw->name, p1->pilot.name + 1) // Pilot stats SET_GAUGE_X(power); SET_GAUGE_X(agility); SET_GAUGE_X(endurance); // Har stats SET_GAUGE_X(arm_power); SET_GAUGE_X(leg_power); SET_GAUGE_X(armor); SET_GAUGE_X(arm_speed); SET_GAUGE_X(leg_speed); SET_GAUGE_X(stun_resistance); // Select pilot picture pilotpic_select(dw->photo, PIC_PLAYERS, p1->pilot.photo_id); // Palette palette *base_pal = video_get_base_palette(); palette_set_player_color(base_pal, 0, p1->pilot.color_3, 0); palette_set_player_color(base_pal, 0, p1->pilot.color_2, 1); palette_set_player_color(base_pal, 0, p1->pilot.color_1, 2); video_force_pal_refresh(); }
void scoreboard_input_tick(scene*scene) { scoreboard_local *local = scene_get_userdata(scene); game_player *player1 = game_state_get_player(scene->gs, 0); ctrl_event *p1 = NULL, *i; controller_poll(player1->ctrl, &p1); i = p1; if(i) { do { if(i->type == EVENT_TYPE_ACTION) { // If there is pending data, and name has been given, save if(local->has_pending_data && strlen(local->pending_data.name) > 0 && (i->event_data.action == ACT_KICK || i->event_data.action == ACT_PUNCH)) { handle_scoreboard_save(local); local->has_pending_data = 0; // If there is no data, and confirm is clicked, don't save } else if (local->has_pending_data == 1 && strlen(local->pending_data.name) == 0 && (i->event_data.action == ACT_KICK || i->event_data.action == ACT_PUNCH)) { local->has_pending_data = 0; // Normal exit routine // Only allow if there is no pending data. } else if(!local->has_pending_data && (i->event_data.action == ACT_ESC || i->event_data.action == ACT_KICK || i->event_data.action == ACT_PUNCH)) { game_state_set_next(scene->gs, scene->gs->next_next_id); // If left or right button is pressed, change page // but only if we are not in input mode. } else if(!local->has_pending_data && i->event_data.action == ACT_LEFT) { local->page = (local->page > 0) ? local->page-1 : 0; } else if(!local->has_pending_data && i->event_data.action == ACT_RIGHT) { local->page = (local->page < MAX_PAGES) ? local->page+1 : MAX_PAGES; } } } while((i = i->next)); } controller_free_chain(p1); }
int scoreboard_create(scene *scene) { // Init local data scoreboard_local *local = malloc(sizeof(scoreboard_local)); local->page = settings_get()->gameplay.rounds; // Load scores if(scores_read(&local->data) == 1) { scores_clear(&local->data); DEBUG("No score data found; using empty score array."); } // Check for pending score local->has_pending_data = 0; if(found_pending_score(scene)) { game_player *player = game_state_get_player(scene->gs, 0); unsigned int score = player->score.score; if(score_fits_scoreboard(local, score)) { local->has_pending_data = 1; local->pending_data.score = score; local->pending_data.har_id = player->har_id; local->pending_data.pilot_id = player->pilot_id; local->pending_data.name[0] = 0; } // Wipe old score data, whether it was written on scoreboard or not. chr_score_reset(game_player_get_score(player), 1); } // Create a surface that has an appropriate alpha for darkening the screen a bit surface_create(&local->black_surface, SURFACE_TYPE_RGBA, 32, 32); surface_fill(&local->black_surface, color_create(0,0,0,200)); // Set callbacks scene_set_userdata(scene, local); scene_set_event_cb(scene, scoreboard_event); scene_set_input_poll_cb(scene, scoreboard_input_tick); scene_set_render_overlay_cb(scene, scoreboard_render_overlay); scene_set_free_cb(scene, scoreboard_free); video_select_renderer(VIDEO_RENDERER_HW); // All done return 0; }
int intro_event(scene *scene, SDL_Event *event) { game_player *player1 = game_state_get_player(scene->gs, 0); ctrl_event *p1=NULL, *i; controller_event(player1->ctrl, event, &p1); i = p1; if (i) { do { if(i->type == EVENT_TYPE_ACTION) { if(i->event_data.action == ACT_ESC || i->event_data.action == ACT_KICK || i->event_data.action == ACT_PUNCH) { game_state_set_next(scene->gs, SCENE_MENU); } } } while((i = i->next)); } controller_free_chain(p1); return 1; }
// return 1 on block int ai_block_har(controller *ctrl, ctrl_event **ev) { ai *a = ctrl->data; object *o = ctrl->har; har *h = object_get_userdata(o); object *o_enemy = game_state_get_player(o->gs, h->player_id == 1 ? 0 : 1)->har; har *h_enemy = object_get_userdata(o_enemy); // XXX TODO get maximum move distance from the animation object if(fabsf(o_enemy->pos.x - o->pos.x) < 100) { if(h_enemy->executing_move && maybe(a->difficulty)) { if(har_is_crouching(h_enemy)) { a->cur_act = (o->direction == OBJECT_FACE_RIGHT ? ACT_DOWN|ACT_LEFT : ACT_DOWN|ACT_RIGHT); controller_cmd(ctrl, a->cur_act, ev); } else { a->cur_act = (o->direction == OBJECT_FACE_RIGHT ? ACT_LEFT : ACT_RIGHT); controller_cmd(ctrl, a->cur_act, ev); } return 1; } } return 0; }
int projectile_unserialize(object *obj, serial *ser, int animation_id, game_state *gs) { uint8_t har_id = serial_read_int8(ser); game_player *player; object *o; har *h; for(int i = 0; i < 2; i++) { player = game_state_get_player(gs, i); o = game_player_get_har(player); h = object_get_userdata(o); if (h->af_data->id == har_id) { af_move *move = af_get_move(h->af_data, animation_id); object_set_animation(obj, &move->ani); object_set_userdata(obj, h); object_set_stl(obj, object_get_stl(o)); projectile_create(obj); return 0; } } DEBUG("COULD NOT FIND HAR ID %d", har_id); // could not find the right HAR... return 1; }
void newsroom_overlay_render(scene *scene) { newsroom_local *local = scene_get_userdata(scene); // Render screencapture har_screencaps *caps = &(game_state_get_player(scene->gs, (local->won ? 0 : 1))->screencaps); if(local->screen == 0) { if(caps->ok[SCREENCAP_POSE]) video_render_sprite_size(&caps->cap[SCREENCAP_POSE], 165, 15, SCREENCAP_W, SCREENCAP_H); } else { if(caps->ok[SCREENCAP_BLOW]) video_render_sprite_size(&caps->cap[SCREENCAP_BLOW], 165, 15, SCREENCAP_W, SCREENCAP_H); } // Render text if(str_size(&local->news_str) > 0) { video_render_sprite(&local->news_bg, 20, 140, BLEND_ALPHA, 0); font_render_wrapped(&font_small, str_c(&local->news_str), 30, 150, 250, COLOR_YELLOW); } // Dialog if(dialog_is_visible(&local->continue_dialog)) { dialog_render(&local->continue_dialog); } }
int vs_is_singleplayer(scene *scene) { if(game_state_get_player(scene->gs, 1)->ctrl->type == CTRL_TYPE_AI) { return 1; } return 0; }
int vs_create(scene *scene) { // Init local data vs_local *local = malloc(sizeof(vs_local)); scene_set_userdata(scene, local); game_player *player1 = game_state_get_player(scene->gs, 0); game_player *player2 = game_state_get_player(scene->gs, 1); snprintf(local->vs_str, 128, "%s VS. %s", lang_get(20+player1->pilot_id), lang_get(20+player2->pilot_id)); animation *ani; palette *mpal = video_get_base_palette(); palette_set_player_color(mpal, 0, player1->colors[2], 0); palette_set_player_color(mpal, 0, player1->colors[1], 1); palette_set_player_color(mpal, 0, player1->colors[0], 2); palette_set_player_color(mpal, 1, player2->colors[2], 0); palette_set_player_color(mpal, 1, player2->colors[1], 1); palette_set_player_color(mpal, 1, player2->colors[0], 2); video_force_pal_refresh(); // HAR ani = &bk_get_info(&scene->bk_data, 5)->ani; object_create(&local->player1_har, scene->gs, vec2i_create(160,0), vec2f_create(0, 0)); object_set_animation(&local->player1_har, ani); object_select_sprite(&local->player1_har, player1->har_id); object_create(&local->player2_har, scene->gs, vec2i_create(160,0), vec2f_create(0, 0)); object_set_animation(&local->player2_har, ani); object_select_sprite(&local->player2_har, player2->har_id); object_set_direction(&local->player2_har, OBJECT_FACE_LEFT); object_set_pal_offset(&local->player2_har, 48); // PLAYER ani = &bk_get_info(&scene->bk_data, 4)->ani; object_create(&local->player1_portrait, scene->gs, vec2i_create(-10,150), vec2f_create(0, 0)); object_set_animation(&local->player1_portrait, ani); object_select_sprite(&local->player1_portrait, player1->pilot_id); object_create(&local->player2_portrait, scene->gs, vec2i_create(330,150), vec2f_create(0, 0)); object_set_animation(&local->player2_portrait, ani); object_select_sprite(&local->player2_portrait, player2->pilot_id); object_set_direction(&local->player2_portrait, OBJECT_FACE_LEFT); // clone the left side of the background image // Note! We are touching the scene-wide background surface! surface_sub(&scene->bk_data.background, // DST Surface &scene->bk_data.background, // SRC Surface 160, 0, // DST 0, 0, // SRC 160, 200, // Size SUB_METHOD_MIRROR); // Flip the right side horizontally if (player2->selectable) { // player1 gets to choose, start at arena 0 local->arena = 0; } else { // pick a random arena for 1 player mode local->arena = rand_int(5); // srand was done in melee } // Arena if(player2->selectable) { ani = &bk_get_info(&scene->bk_data, 3)->ani; object_create(&local->arena_select, scene->gs, vec2i_create(59,155), vec2f_create(0, 0)); object_set_animation(&local->arena_select, ani); object_select_sprite(&local->arena_select, local->arena); } // SCIENTIST int scientistpos = rand_int(4); vec2i scientistcoord = spawn_position(scientistpos, 1); if (scientistpos % 2) { scientistcoord.x += 50; } else { scientistcoord.x -= 50; } object *o_scientist = malloc(sizeof(object)); ani = &bk_get_info(&scene->bk_data, 8)->ani; object_create(o_scientist, scene->gs, scientistcoord, vec2f_create(0, 0)); object_set_animation(o_scientist, ani); object_select_sprite(o_scientist, 0); object_set_direction(o_scientist, scientistpos % 2 ? OBJECT_FACE_LEFT : OBJECT_FACE_RIGHT); game_state_add_object(scene->gs, o_scientist, RENDER_LAYER_MIDDLE, 0, 0); // WELDER int welderpos = rand_int(6); // welder can't be on the same gantry or the same *side* as the scientist // he also can't be on the same 'level' // but he has 10 possible starting positions while ((welderpos % 2) == (scientistpos % 2) || (scientistpos < 2 && welderpos < 2) || (scientistpos > 1 && welderpos > 1 && welderpos < 4)) { welderpos = rand_int(6); } object *o_welder = malloc(sizeof(object)); ani = &bk_get_info(&scene->bk_data, 7)->ani; object_create(o_welder, scene->gs, spawn_position(welderpos, 0), vec2f_create(0, 0)); object_set_animation(o_welder, ani); object_select_sprite(o_welder, 0); object_set_spawn_cb(o_welder, cb_vs_spawn_object, (void*)scene); object_set_destroy_cb(o_welder, cb_vs_destroy_object, (void*)scene); object_set_direction(o_welder, welderpos % 2 ? OBJECT_FACE_LEFT : OBJECT_FACE_RIGHT); game_state_add_object(scene->gs, o_welder, RENDER_LAYER_MIDDLE, 0, 0); // GANTRIES object *o_gantry_a = malloc(sizeof(object)); ani = &bk_get_info(&scene->bk_data, 11)->ani; object_create(o_gantry_a, scene->gs, vec2i_create(0,0), vec2f_create(0, 0)); object_set_animation(o_gantry_a, ani); object_select_sprite(o_gantry_a, 0); game_state_add_object(scene->gs, o_gantry_a, RENDER_LAYER_TOP, 0, 0); object *o_gantry_b = malloc(sizeof(object)); object_create(o_gantry_b, scene->gs, vec2i_create(320,0), vec2f_create(0, 0)); object_set_animation(o_gantry_b, ani); object_select_sprite(o_gantry_b, 0); object_set_direction(o_gantry_b, OBJECT_FACE_LEFT); game_state_add_object(scene->gs, o_gantry_b, RENDER_LAYER_TOP, 0, 0); // Background tex menu_background2_create(&local->arena_select_bg, 211, 50); // Quit Dialog dialog_create(&local->quit_dialog, DIALOG_STYLE_YES_NO, "ARE YOU SURE YOU WANT TO QUIT THIS GAME?", 72, 60); local->quit_dialog.userdata = scene; local->quit_dialog.clicked = vs_quit_dialog_clicked; // Too Pathetic Dialog char insult[512]; snprintf(insult, 512, lang_get(748), "Veteran", "Major Kreissack"); dialog_create(&local->too_pathetic_dialog, DIALOG_STYLE_OK, insult, 72, 60); local->too_pathetic_dialog.userdata = scene; local->too_pathetic_dialog.clicked = vs_too_pathetic_dialog_clicked; if (player2->pilot_id == 10 && settings_get()->gameplay.difficulty < 2) { // kriessack, but not on Veteran or higher dialog_show(&local->too_pathetic_dialog, 1); } // Callbacks scene_set_render_cb(scene, vs_render); scene_set_render_overlay_cb(scene, vs_render_overlay); scene_set_input_poll_cb(scene, vs_input_tick); scene_set_dynamic_tick_cb(scene, vs_dynamic_tick); scene_set_static_tick_cb(scene, vs_static_tick); scene_set_free_cb(scene, vs_free); // Pick renderer video_select_renderer(VIDEO_RENDERER_HW); return 0; }