static void ipobble_DrawScene() { char s[24]; draw_podzilla(podzilla_bmp_var); me_draw(current_angle); draw_ball(new_ball_x, new_ball_y, new_ball_type, new_ball_type); draw_ball(current_ball_x, current_ball_y, current_ball_type, current_ball_type); if(ball_firing){ /* first 'white' the ball */ GrSetGCForeground(ipobble_gc, WHITE); draw_ball(ball_x,ball_y,ball_type, -1); /* now test if bumping */ if((ball_x + (float)BALL_WIDTH) >= (float)BRD_MAXX || (ball_x - 2) <= (float)BRD_MINX) ball_vx=-ball_vx; ball_x+=ball_vx; ball_y+=ball_vy; /* now test if attaching */ /* if yes set flag to test new 4s... */ GrSetGCForeground(ipobble_gc, BLACK); draw_ball(ball_x,ball_y,ball_type, ball_type); if(test_collision()==1){ boards_ball_draw(0); test_connection(level_connection); } } else { fire_counter--; if(fire_counter * DELTA_TIME % 100 == 0) { sprintf(s, "time: %.3d", fire_counter * DELTA_TIME / 100); GrText(ipobble_wid,ipobble_gc, screen_info.cols - 50, screen_info.rows - HEADER_TOPLINE - 15, s, -1, GR_TFASCII); } if(fire_counter <= 0) do_fire(); } }
/** * This function gets called from within init_game * It is called repeatedly if we are the server, else * it is just called once. */ void do_gameplay(const int sock, int fire) { int x,y,res,win_status=0; char msg[100]; for (int i=0; i<BOARD_SIZE; ++i) { for (int j=0; j<BOARD_SIZE; ++j) { player_shots[i][j] = UNTOUCHED; peer_shots[i][j] = UNTOUCHED; } } initShips(); display_boards(); Ship sh; do { if (fire == 1) { /*you're the attacker*/ mvwprintw(status_win,1,1,"It's your turn! "); wrefresh(status_win); fire = 0; return_cords(&x, &y); res = do_fire(sock, x, y); place_hit_or_mis(player_win,res, x, y, false); switch (res) { case 0: mvwprintw(status_win,2,1,"Missed! "); wrefresh(status_win); break; case 1: mvwprintw(status_win,2,1,"You hit them! "); wrefresh(status_win); /* play_boom("You hit them!"); */ /* display_boards(); */ break; case -1: mvwprintw(status_win,2,1,"You sunk them! "); wrefresh(status_win); /* play_boom("You sunk them!"); */ /* display_boards(); */ break; case -2: win_status = 1; mvwprintw(status_win,2,1,"Game over! "); wrefresh(status_win); fire = -1; break; } } else { /*you're the defender*/ keypad(stdscr, FALSE); curs_set(0); // Set cursor invisible mvwprintw(status_win,1,1,"Waiting for other player to fire..."); wrefresh(status_win); res = do_receive(sock); refresh(); if (res == 0) { //wclear(status_win); mvwprintw(status_win,2,1,"They missed! "); //mvwprintw(status_win,5,1,"It's your turn!"); wrefresh(status_win); } else if (res < 0) { //negative res indicates sunken ship sh = getShipById(-1*res); /* what a hack... */ //wclear(status_win); mvwprintw(status_win,2,1,"They sunk your %s! ", sh.name); /* play_boom("They sunk you!"); */ /* display_boards(); */ //mvwprintw(status_win,5,1,"It's your turn!"); wrefresh(status_win); } else if (res==100);//do nothing...the game is over else { sh = getShipById(res); //wclear(status_win); mvwprintw(status_win,2,1,"They hit your %s! ", sh.name); /* play_boom("They hit you!"); */ /* display_boards(); */ //mvwprintw(status_win,5,1,"It's your turn!"); wrefresh(status_win); } mvwprintw(status_win,1,1,"It's your turn! "); fire = (check_game_over() == 1) ? -1 : 1; refresh(); } } while(fire > -1); sprintf(msg, "Game over! You %s!\nPress any key to view battlefields.", win_status ? "won" : "lost"); show_message_box(msg); getch(); exchange_shipsets(sock); show_battlefields(); }
static void simulate_mappoints (void) { int xx, yy; shuffle_mappoint_array (); for (yy = 0; yy < WORLD_SIDE_LEN; yy++) { /* indirection to rand array to stop lots of linear effects */ int y = mappoint_array_y[yy]; for (xx = 0; xx < WORLD_SIDE_LEN; xx++) { int x = mappoint_array_x[xx]; short grp = MP_GROUP(x,y); if (grp == GROUP_USED || grp == GROUP_BARE) continue; switch (grp) { case GROUP_TRACK: do_track (x, y); break; case GROUP_RAIL: do_rail (x, y); break; case GROUP_ROAD: do_road (x, y); break; case GROUP_ORGANIC_FARM: do_organic_farm (x, y); break; case GROUP_MARKET: do_market (x, y); break; case GROUP_RESIDENCE_LL: do_residence (x, y); break; case GROUP_RESIDENCE_ML: do_residence (x, y); break; case GROUP_RESIDENCE_HL: do_residence (x, y); break; case GROUP_RESIDENCE_LH: do_residence (x, y); break; case GROUP_RESIDENCE_MH: do_residence (x, y); break; case GROUP_RESIDENCE_HH: do_residence (x, y); break; case GROUP_POWER_LINE: do_power_line (x, y); break; case GROUP_SOLAR_POWER: do_power_source (x, y); break; case GROUP_SUBSTATION: do_power_substation (x, y); break; case GROUP_COALMINE: do_coalmine (x, y); break; case GROUP_COAL_POWER: do_power_source_coal (x, y); break; case GROUP_INDUSTRY_L: do_industry_l (x, y); break; case GROUP_INDUSTRY_H: do_industry_h (x, y); break; case GROUP_COMMUNE: do_commune (x, y); break; case GROUP_OREMINE: do_oremine (x, y); break; case GROUP_PORT: do_port (x, y); break; case GROUP_TIP: do_tip (x, y); break; case GROUP_PARKLAND: do_parkland (x, y); break; case GROUP_UNIVERSITY: do_university (x, y); break; case GROUP_RECYCLE: do_recycle (x, y); break; case GROUP_HEALTH: do_health_centre (x, y); break; case GROUP_ROCKET: do_rocket_pad (x, y); break; case GROUP_WINDMILL: do_windmill (x, y); break; case GROUP_MONUMENT: do_monument (x, y); break; case GROUP_SCHOOL: do_school (x, y); break; case GROUP_BLACKSMITH: do_blacksmith (x, y); break; case GROUP_MILL: do_mill (x, y); break; case GROUP_POTTERY: do_pottery (x, y); break; case GROUP_FIRESTATION: do_firestation (x, y); break; case GROUP_CRICKET: do_cricket (x, y); break; case GROUP_FIRE: do_fire (x, y); break; case GROUP_SHANTY: do_shanty (x, y); break; } } } }
static int ipobble_handle_event(GR_EVENT *event) { int ret = 0; static int paused = 0; if(game_status) { switch(event->type) { case ( GR_EVENT_TYPE_TIMER ): if (!paused) ipobble_Game_Loop(); break; /* if in game there is 1 status: waiting for direction */ case( GR_EVENT_TYPE_KEY_DOWN ): switch(event->keystroke.ch) { case '\r': /* push button : do fire! */ if(ball_firing) break; do_fire(); ret |= KEY_CLICK; break; case 'l': GrSetGCForeground(ipobble_gc, WHITE); me_draw(current_angle); draw_podzilla(podzilla_bmp_var); if(accel_status>0) accel_status++; else accel_status=1; current_angle = (current_angle >= 80) ? 80 : current_angle + delta_angle * (accel_status / 5 + 1); GrSetGCForeground(ipobble_gc, BLACK); podzilla_bmp_var = !podzilla_bmp_var; draw_podzilla(podzilla_bmp_var); me_draw(current_angle); ret |= KEY_CLICK; break; case 'r': GrSetGCForeground(ipobble_gc, WHITE); me_draw(current_angle); draw_podzilla(podzilla_bmp_var); if (accel_status < 0) accel_status--; else accel_status=-1; current_angle = (current_angle <= -80) ? -80 : current_angle + delta_angle * (accel_status / 5 - 1); GrSetGCForeground(ipobble_gc, BLACK); podzilla_bmp_var = !podzilla_bmp_var; draw_podzilla(podzilla_bmp_var); me_draw(current_angle); ret |= KEY_CLICK; break; case 'm': /* if Menu Button then destroy all dynamically * created */ pz_close_window(ipobble_wid); GrDestroyTimer (ipobble_timer_id); GrDestroyGC(ipobble_gc); break; case 'h': paused = 1; break; default: ret |= KEY_UNUSED; break; } break; case( GR_EVENT_TYPE_KEY_UP ): if (event->keystroke.ch == 'h') paused = 0; break; default: ret |= EVENT_UNUSED; break; } return ret; } /* if game status play */ /* END OF GAME */ if(onetime == 0){ GrSetGCForeground(ipobble_gc, BLACK); GrText(ipobble_wid, ipobble_gc, screen_info.cols / 2 - 36, screen_info.rows / 2 - 24, "GAME OVER", -1, GR_TFASCII); gameover_waitcounter = 30; } onetime = 1; gameover_waitcounter--; switch(event->type) { case( GR_EVENT_TYPE_KEY_DOWN ): switch(event->keystroke.ch) { case '\r': /* push button */ if(gameover_waitcounter <= 0){ score = 0; GrSetGCForeground(ipobble_gc, WHITE); GrFillRect(ipobble_wid, ipobble_gc, 0, 0, screen_info.cols, screen_info.rows); GrSetGCForeground(ipobble_gc, BLACK); level = 0; score = 0; ipobble_create_board(level); game_status = GAME_STATUS_PLAY; draw_first(); ret |= KEY_CLICK; } break; case 'm': /* if Menu Button then destroy all dynamically * created */ pz_close_window(ipobble_wid); GrDestroyTimer(ipobble_timer_id); GrDestroyGC(ipobble_gc); break; default: ret |= KEY_UNUSED; break; } break; default: ret |= EVENT_UNUSED; break; } return ret; }