int melee_init(scene *scene) { char bitmap[51*36*4]; memset(&bitmap, 255, 51*36*4); ticks = 0; pulsedir = 0; selection = 0; row_a = 0; column_a = 0; row_b = 0; column_b = 4; done_a = 0; done_b = 0; for(int i = 0; i < 10; i++) { players[i].sprite = scene->bk->anims[3]->animation->sprites[i]; DEBUG("found sprite %d x %d at %d, %d", players[i].sprite->img->w, players[i].sprite->img->h, players[i].sprite->pos_x, players[i].sprite->pos_y); players_big[i].sprite = scene->bk->anims[4]->animation->sprites[i]; int row = i / 5; int col = i % 5; sd_rgba_image * out = sub_sprite(scene->bk->anims[1]->animation->sprites[0], scene->bk->palettes[0], (62*col), (42*row), 51, 36); texture_create(&harportraits[i], out->data, 51, 36); sd_rgba_image_delete(out); } menu_background2_create(&feh, 90, 61); menu_background2_create(&bleh, 160, 43); texture_create(&select_hilight, bitmap, 51, 36); // set up the magic controller hooks if (scene->player1.ctrl->type == CTRL_TYPE_NETWORK) { controller_add_hook(scene->player2.ctrl, scene->player1.ctrl, scene->player1.ctrl->controller_hook); } if (scene->player2.ctrl->type == CTRL_TYPE_NETWORK) { controller_add_hook(scene->player1.ctrl, scene->player2.ctrl, scene->player2.ctrl->controller_hook); } const color bar_color = color_create(0, 190, 0, 255); const color bar_bg_color = color_create(80, 220, 80, 0); const color bar_border_color = color_create(0, 96, 0, 255); const color bar_top_left_border_color = color_create(0, 255, 0, 255); const color bar_bottom_right_border_color = color_create(0, 125, 0, 255); progressbar_create(&bar_power[0], 74, 12, 20*4, 8, bar_border_color, bar_border_color, bar_bg_color, bar_top_left_border_color, bar_bottom_right_border_color, bar_color, PROGRESSBAR_LEFT); progressbar_create(&bar_agility[0], 74, 30, 20*4, 8, bar_border_color, bar_border_color, bar_bg_color, bar_top_left_border_color, bar_bottom_right_border_color, bar_color, PROGRESSBAR_LEFT); progressbar_create(&bar_endurance[0], 74, 48, 20*4, 8, bar_border_color, bar_border_color, bar_bg_color, bar_top_left_border_color, bar_bottom_right_border_color, bar_color, PROGRESSBAR_LEFT); progressbar_create(&bar_power[1], 320-66-feh.w, 12, 20*4, 8, bar_border_color, bar_border_color, bar_bg_color, bar_top_left_border_color, bar_bottom_right_border_color, bar_color, PROGRESSBAR_LEFT); progressbar_create(&bar_agility[1], 320-66-feh.w, 30, 20*4, 8, bar_border_color, bar_border_color, bar_bg_color, bar_top_left_border_color, bar_bottom_right_border_color, bar_color, PROGRESSBAR_LEFT); progressbar_create(&bar_endurance[1], 320-66-feh.w, 48, 20*4, 8, bar_border_color, bar_border_color, bar_bg_color, bar_top_left_border_color, bar_bottom_right_border_color, bar_color, PROGRESSBAR_LEFT); for(int i = 0;i < 2;i++) { progressbar_set(&bar_power[i], 50); progressbar_set(&bar_agility[i], 50); progressbar_set(&bar_endurance[i], 50); } refresh_pilot_stats(); memset(&harplayer_a, 0, sizeof(harplayer_a)); memset(&harplayer_b, 0, sizeof(harplayer_b)); // All done return 0; }
int melee_create(scene *scene) { char bitmap[51*36*4]; // Init local data melee_local *local = malloc(sizeof(melee_local)); memset(local, 0, sizeof(melee_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); controller *player1_ctrl = game_player_get_ctrl(player1); controller *player2_ctrl = game_player_get_ctrl(player2); palette *mpal = video_get_base_palette(); palette_set_player_color(mpal, 0, 8, 0); palette_set_player_color(mpal, 0, 8, 1); palette_set_player_color(mpal, 0, 8, 2); video_force_pal_refresh(); memset(&bitmap, 255, 51*36*4); local->ticks = 0; local->pulsedir = 0; local->selection = 0; local->row_a = 0; local->column_a = 0; local->row_b = 0; local->column_b = 4; local->done_a = 0; local->done_b = 0; menu_background2_create(&local->feh, 90, 61); menu_background2_create(&local->bleh, 160, 43); surface_create_from_data(&local->select_hilight, SURFACE_TYPE_RGBA, 51, 36, bitmap); // set up the magic controller hooks if(player1_ctrl && player2_ctrl) { if(player1_ctrl->type == CTRL_TYPE_NETWORK) { controller_add_hook(player2_ctrl, player1_ctrl, player1_ctrl->controller_hook); } if (player2_ctrl->type == CTRL_TYPE_NETWORK) { controller_add_hook(player1_ctrl, player2_ctrl, player2_ctrl->controller_hook); } } animation *ani; sprite *spr; for(int i = 0; i < 10; i++) { ani = &bk_get_info(&scene->bk_data, 3)->ani; object_create(&local->pilots[i], scene->gs, vec2i_create(0,0), vec2f_create(0, 0)); object_set_animation(&local->pilots[i], ani); object_select_sprite(&local->pilots[i], i); ani = &bk_get_info(&scene->bk_data, 18+i)->ani; object_create(&local->har_player1[i], scene->gs, vec2i_create(110,95), vec2f_create(0, 0)); object_set_animation(&local->har_player1[i], ani); object_select_sprite(&local->har_player1[i], 0); object_set_repeat(&local->har_player1[i], 1); int row = i / 5; int col = i % 5; spr = sprite_copy(animation_get_sprite(&bk_get_info(&scene->bk_data, 1)->ani, 0)); mask_sprite(spr->data, 62*col, 42*row, 51, 36); ani = create_animation_from_single(spr, spr->pos); object_create(&local->harportraits_player1[i], scene->gs, vec2i_create(0, 0), vec2f_create(0, 0)); object_set_animation(&local->harportraits_player1[i], ani); object_select_sprite(&local->harportraits_player1[i], 0); object_set_animation_owner(&local->harportraits_player1[i], OWNER_OBJECT); if (player2->selectable) { spr = sprite_copy(animation_get_sprite(&bk_get_info(&scene->bk_data, 1)->ani, 0)); mask_sprite(spr->data, 62*col, 42*row, 51, 36); ani = create_animation_from_single(spr, spr->pos); object_create(&local->harportraits_player2[i], scene->gs, vec2i_create(0, 0), vec2f_create(0, 0)); object_set_animation(&local->harportraits_player2[i], ani); object_select_sprite(&local->harportraits_player2[i], 0); object_set_animation_owner(&local->harportraits_player2[i], OWNER_OBJECT); object_set_pal_offset(&local->harportraits_player2[i], 48); ani = &bk_get_info(&scene->bk_data, 18+i)->ani; object_create(&local->har_player2[i], scene->gs, vec2i_create(210,95), vec2f_create(0, 0)); object_set_animation(&local->har_player2[i], ani); object_select_sprite(&local->har_player2[i], 0); object_set_repeat(&local->har_player2[i], 1); object_set_direction(&local->har_player2[i], OBJECT_FACE_LEFT); object_set_pal_offset(&local->har_player2[i], 48); } } ani = &bk_get_info(&scene->bk_data, 4)->ani; object_create(&local->bigportrait1, scene->gs, vec2i_create(0,0), vec2f_create(0, 0)); object_set_animation(&local->bigportrait1, ani); object_select_sprite(&local->bigportrait1, 0); if (player2->selectable) { object_create(&local->bigportrait2, scene->gs, vec2i_create(320,0), vec2f_create(0, 0)); object_set_animation(&local->bigportrait2, ani); object_select_sprite(&local->bigportrait2, 4); object_set_direction(&local->bigportrait2, OBJECT_FACE_LEFT); } ani = &bk_get_info(&scene->bk_data, 5)->ani; object_create(&local->player2_placeholder, scene->gs, vec2i_create(0,0), vec2f_create(0, 0)); object_set_animation(&local->player2_placeholder, ani); if (player2->selectable) { object_select_sprite(&local->player2_placeholder, 0); } else { object_select_sprite(&local->player2_placeholder, 1); } spr = sprite_copy(animation_get_sprite(&bk_get_info(&scene->bk_data, 1)->ani, 0)); surface_convert_to_rgba(spr->data, video_get_pal_ref(), 0); ani = create_animation_from_single(spr, spr->pos); object_create(&local->unselected_har_portraits, scene->gs, vec2i_create(0,0), vec2f_create(0, 0)); object_set_animation(&local->unselected_har_portraits, ani); object_select_sprite(&local->unselected_har_portraits, 0); object_set_animation_owner(&local->unselected_har_portraits, OWNER_OBJECT); for(int i = 0; i < 2; i++) { local->bar_power[i] = progressbar_create(PROGRESSBAR_THEME_MELEE, PROGRESSBAR_LEFT, 50); local->bar_agility[i] = progressbar_create(PROGRESSBAR_THEME_MELEE, PROGRESSBAR_LEFT, 50); local->bar_endurance[i] = progressbar_create(PROGRESSBAR_THEME_MELEE, PROGRESSBAR_LEFT, 50); } component_layout(local->bar_power[0], 74, 12, 20*4, 8); component_layout(local->bar_agility[0], 74, 30, 20*4, 8); component_layout(local->bar_endurance[0], 74, 48, 20*4, 8); component_layout(local->bar_power[1], 320-66-local->feh.w, 12, 20*4, 8); component_layout(local->bar_agility[1], 320-66-local->feh.w, 30, 20*4, 8); component_layout(local->bar_endurance[1], 320-66-local->feh.w, 48, 20*4, 8); refresh_pilot_stats(local); // initialize nova selection cheat memset(local->har_selected, 0, sizeof(local->har_selected)); memset(local->katana_down_count, 0, sizeof(local->katana_down_count)); // Set callbacks scene_set_input_poll_cb(scene, melee_input_tick); scene_set_render_cb(scene, melee_render); scene_set_free_cb(scene, melee_free); scene_set_dynamic_tick_cb(scene, melee_tick); // Play correct music music_play(PSM_MENU); // Pick renderer video_select_renderer(VIDEO_RENDERER_HW); // All done return 0; }
void handle_action(scene *scene, int player, int action) { int *row, *column, *done; if (player == 1) { DEBUG("event for player 1"); row = &row_a; column = &column_a; done = &done_a; } else { DEBUG("event for player 2"); row = &row_b; column = &column_b; done = &done_b; } if (*done) { return; } switch (action) { case ACT_LEFT: (*column)--; if (*column < 0) { *column = 4; } break; case ACT_RIGHT: (*column)++; if (*column > 4) { *column = 0; } break; case ACT_UP: case ACT_DOWN: *row = *row == 0 ? 1 : 0; break; case ACT_KICK: case ACT_PUNCH: *done = 1; if (done_a && (done_b || !scene->player2.selectable)) { done_a = 0; done_b = 0; if (selection == 0) { selection = 1; player_id_a = 5*row_a + column_a; player_id_b = 5*row_b + column_b; } else { scene->player1.har_id = 5*row_a+column_a; scene->player1.player_id = player_id_a; if (scene->player2.selectable) { scene->player2.har_id = 5*row_b+column_b; scene->player2.player_id = player_id_b; } else { // randomly pick opponent and HAR srand(time(NULL)); scene->player2.har_id = rand() % 10; int i; while((i = rand() % 10) == player_id_a) {} scene->player2.player_id = i; } scene->next_id = SCENE_VS; } } break; } refresh_pilot_stats(); if (selection == 1) { int har_animation_a = (5*row_a) + column_a + 18; if (harplayer_a.id != har_animation_a) { melee_switch_animation(scene, &harplayer_a, har_animation_a); // these are just guesses harplayer_a.x = 110; harplayer_a.y = 95; animationplayer_set_direction(&harplayer_a, 1); } if (scene->player2.selectable) { int har_animation_b = (5*row_b) + column_b + 18; if (harplayer_b.id != har_animation_b) { melee_switch_animation(scene, &harplayer_b, har_animation_b); // these are just guesses harplayer_b.x = 320-110; harplayer_b.y = 95; animationplayer_set_direction(&harplayer_b, -1); } } } }
void handle_action(scene *scene, int player, int action) { game_player *player1 = game_state_get_player(scene->gs, 0); game_player *player2 = game_state_get_player(scene->gs, 1); melee_local *local = scene_get_userdata(scene); int *row, *column, *done; if (player == 1) { row = &local->row_a; column = &local->column_a; done = &local->done_a; } else { row = &local->row_b; column = &local->column_b; done = &local->done_b; } if (*done) { return; } switch (action) { case ACT_LEFT: (*column)--; if (*column < 0) { *column = 4; } sound_play(19, 0.5f, 0.0f, 2.0f); break; case ACT_RIGHT: (*column)++; if (*column > 4) { *column = 0; } sound_play(19, 0.5f, 0.0f, 2.0f); break; case ACT_UP: if(*row == 1) { *row = 0; } sound_play(19, 0.5f, 0.0f, 2.0f); break; case ACT_DOWN: if(*row == 0) { *row = 1; } // nova selection cheat if(*row == 1 && *column == 0) { local->katana_down_count[player-1]++; if(local->katana_down_count[player-1] > 11) { local->katana_down_count[player-1] = 11; } } sound_play(19, 0.5f, 0.0f, 2.0f); break; case ACT_KICK: case ACT_PUNCH: *done = 1; sound_play(20, 0.5f, 0.0f, 2.0f); if (local->done_a && (local->done_b || !player2->selectable)) { local->done_a = 0; local->done_b = 0; if (local->selection == 0) { local->selection = 1; local->pilot_id_a = 5*local->row_a + local->column_a; local->pilot_id_b = 5*local->row_b + local->column_b; // nova selection cheat local->har_selected[0][local->pilot_id_a] = 1; local->har_selected[1][local->pilot_id_b] = 1; object_select_sprite(&local->bigportrait1, local->pilot_id_a); // update the player palette palette *base_pal = video_get_base_palette(); pilot p_a; pilot_get_info(&p_a, local->pilot_id_a); palette_set_player_color(base_pal, 0, p_a.colors[0], 2); palette_set_player_color(base_pal, 0, p_a.colors[1], 1); palette_set_player_color(base_pal, 0, p_a.colors[2], 0); video_force_pal_refresh(); player1->colors[0] = p_a.colors[0]; player1->colors[1] = p_a.colors[1]; player1->colors[2] = p_a.colors[2]; if (player2->selectable) { object_select_sprite(&local->bigportrait2, local->pilot_id_b); // update the player palette pilot_get_info(&p_a, local->pilot_id_b); palette_set_player_color(base_pal, 1, p_a.colors[0], 2); palette_set_player_color(base_pal, 1, p_a.colors[1], 1); palette_set_player_color(base_pal, 1, p_a.colors[2], 0); video_force_pal_refresh(); player2->colors[0] = p_a.colors[0]; player2->colors[1] = p_a.colors[1]; player2->colors[2] = p_a.colors[2]; } } else { int nova_activated[2] = {1, 1}; for(int i = 0;i < 2;i++) { for(int j = 0;j < 10;j++) { if(local->har_selected[i][j] == 0) { nova_activated[i] = 0; break; } } if(local->katana_down_count[i] < 11) { nova_activated[i] = 0; } } if(nova_activated[0] && local->row_a == 1 && local->column_a == 2) { player1->har_id = HAR_NOVA; } else { player1->har_id = 5*local->row_a+local->column_a; } player1->pilot_id = local->pilot_id_a; if (player2->selectable) { if(nova_activated[1] && local->row_b == 1 && local->column_b == 2) { player2->har_id = HAR_NOVA; } else { player2->har_id = 5*local->row_b+local->column_b; } player2->pilot_id = local->pilot_id_b; } else { if (player1->sp_wins == (2046 ^ (2 << player1->pilot_id))) { // everyone but kriessack player2->pilot_id = 10; player2->har_id = HAR_NOVA; } else { // pick an opponent we have not yet beaten while(1) { int i = rand_int(10); if ((2 << i) & player1->sp_wins || i == player1->pilot_id) { continue; } player2->pilot_id = i; player2->har_id = rand_int(10); break; } } pilot p_a; pilot_get_info(&p_a, player2->pilot_id); player2->colors[0] = p_a.colors[0]; player2->colors[1] = p_a.colors[1]; player2->colors[2] = p_a.colors[2]; } game_state_set_next(scene->gs, SCENE_VS); } } break; } if(local->selection == 0) { object_select_sprite(&local->bigportrait1, 5*local->row_a + local->column_a); if (player2->selectable) { object_select_sprite(&local->bigportrait2, 5*local->row_b + local->column_b); } } // nova selection cheat if(local->selection == 1) { local->har_selected[player-1][5 * (*row) + *column] = 1; } refresh_pilot_stats(local); }