void eat_fruit(int eactor, int pcount) { switch(pickup[pcount].contains) { case FRUITS_CHERRY: case FRUITS_BLUEBERRY: case FRUITS_FIG: case FRUITS_STRAWBERRY: score_event(eactor, SCORE_SFRUIT, pickup[pcount].contains); create_cloud(CLOUD_1_POINT, pickup[pcount].x, pickup[pcount].y, 0, -20, 65, 1, 0, 0); break; case FRUITM_PEACH: case FRUITM_RAPPLE: case FRUITM_PEAR: score_event(eactor, SCORE_MFRUIT, pickup[pcount].contains); create_cloud(CLOUD_3_POINTS, pickup[pcount].x, pickup[pcount].y, 0, -20, 65, 1, 0, 0); break; case FRUITL_DURIAN: case FRUITL_PINEAPPLE: score_event(eactor, SCORE_LFRUIT, pickup[pcount].contains); create_cloud(CLOUD_5_POINTS, pickup[pcount].x, pickup[pcount].y, 0, -20, 65, 1, 0, 0); break; } }
void run_th_bases(void) { int i; for (i = 0; i < game[0].th_base_no; i ++) { arena[0].th_base_x [i] = pickup[arena[0].th_base_pickup [i]].x; arena[0].th_base_y [i] = pickup[arena[0].th_base_pickup [i]].y; if (arena[0].th_base_taken [i] == TEAM_NONE) continue; if (arena[0].th_base_counter [i] == 1 && serial[0].game_type != SERIAL_CLIENT) { score_message(SMESSAGE_TH, arena[0].th_base_taken [i], 0, 0); score_event(arena[0].th_base_taken [i], SCORE_TH, 0); arena[0].th_base_counter [i] = 900; arena[0].th_base_speed [i] = 1; arena[0].th_base_direction [i] *= -1; arena[0].th_base_move [i] ++; if (arena[0].th_base_move [i] >= 5) { teleport_th_base(i); arena[0].th_base_move [i] = 0; arena[0].th_base_taken [i] = TEAM_NONE; arena[0].th_base_angle [i] = 128; } continue; } arena[0].th_base_counter [i] --; if (arena[0].th_base_counter [i] % 33 == 0) arena[0].th_base_speed [i] ++; arena[0].th_base_angle [i] += arena[0].th_base_speed [i] * arena[0].th_base_direction [i]; if (arena[0].th_base_angle [i] >= 255) arena[0].th_base_angle [i] -= 255; if (arena[0].th_base_angle [i] <= 0) arena[0].th_base_angle [i] += 255; } }
/* There's usually no collision detection between actors or between actors and pickups (ie bases). So the porkball needs it specially: */ void run_porkball(int pactor) { int i; if (arena[0].who_has_porkball == -1 && actor[pactor].jump_delay == 0) { for (i = 0; i < NO_ACTORS; i ++) { if (actor[i].aclass == ACLASS_NONE || actor[i].aclass == ACLASS_GHOST || actor[i].aclass == ACLASS_PORKBALL) continue; if (actor[pactor].x + actor[pactor].width * GRAIN>= actor[i].x - (actor[i].width * GRAIN) && actor[pactor].x - actor[pactor].width * GRAIN <= actor[i].x + (actor[i].width * GRAIN) && actor[pactor].y - actor[pactor].height * GRAIN <= actor[i].y + (actor[i].height * GRAIN) && actor[pactor].y + actor[pactor].height * GRAIN >= actor[i].y - (actor[i].height * GRAIN)) { arena[0].who_has_porkball = i; actor[i].has_porkball = pactor; break; } } } for (i = 0; i < NO_TEAMS; i ++) { if (team[i].active == 0) continue; if (i == arena[0].porkball_state) continue; if (actor[pactor].x > team[i].base_x - (15 * GRAIN) && actor[pactor].x < team[i].base_x + (15 * GRAIN) && actor[pactor].y > team[i].base_y - (15 * GRAIN) && actor[pactor].y < team[i].base_y + (15 * GRAIN)) { if (arena[0].porkball_state != -1) { score_event(arena[0].porkball_state, SCORE_GOAL, i); score_message(SMESSAGE_GOAL, arena[0].porkball_state, i, 0); /* team[arena[0].porkball_state].base_counter ++; if (team[arena[0].porkball_state].base_counter >= 5) { teleport_team_base(arena[0].porkball_state); team[arena[0].porkball_state].base_counter = 0; }*/ team[i].base_counter ++; if (team[i].base_counter >= 5) { teleport_team_base(i); team[i].base_counter = 0; } } drop_porkball(pactor); break; } } // now see if it should be rolling: if (abs(actor[pactor].x_speed) < 500) { char dirt_left = 0, dirt_right = 0, dirt_centre = 0; for (i = (actor[pactor].x / GRAIN) - actor[pactor].width; i < (actor[pactor].x / GRAIN) + actor[pactor].width; i++) { if (get_dirt(i, (actor[pactor].y / GRAIN) + actor[pactor].height + 1)) { if (i < (actor[pactor].x / GRAIN)) dirt_left = 1; else if (i > (actor[pactor].x / GRAIN)) dirt_right = 1; else if (i == (actor[pactor].x / GRAIN)) dirt_centre = 1; } } if (dirt_left == 1 && dirt_right == 0) actor[pactor].x_speed += 20; if (dirt_left == 0 && dirt_right == 1) actor[pactor].x_speed -= 20; } }
void near_base(int bactor) { int i; int j; char occupied = 0; switch(game[0].game_type) { default: return; case GAME_GRAIL: if (actor[bactor].has_grail == 0 || serial[0].game_type == SERIAL_CLIENT) return; break; case GAME_CAP_FLAG: if (actor[bactor].has_flag == -1 || serial[0].game_type == SERIAL_CLIENT) return; break; case GAME_TAKEHOLD: if (serial[0].game_type == SERIAL_CLIENT) return; for (i = 0; i < game[0].th_base_no; i ++) { occupied = 0; if (arena[0].th_base_taken [i] == actor[bactor].team) continue; if (actor[bactor].x > arena[0].th_base_x [i] - (15 * GRAIN) && actor[bactor].x < arena[0].th_base_x [i] + (15 * GRAIN) && actor[bactor].y > arena[0].th_base_y [i] - (15 * GRAIN) && actor[bactor].y < arena[0].th_base_y [i] + (15 * GRAIN)) { if (arena[0].th_base_taken [i] != TEAM_NONE) { for (j = 0; j < NO_ACTORS; j ++) { if (actor[j].aclass != ACLASS_PLAYER) continue; if (actor[j].team == actor[bactor].team) continue; if (actor[j].x > arena[0].th_base_x [i] - (15 * GRAIN) && actor[j].x < arena[0].th_base_x [i] + (15 * GRAIN) && actor[j].y > arena[0].th_base_y [i] - (15 * GRAIN) && actor[j].y < arena[0].th_base_y [i] + (15 * GRAIN)) { occupied = 1; } } if (occupied == 0) { arena[0].th_base_taken [i] = actor[bactor].team; arena[0].th_base_counter [i] = 900; arena[0].th_base_speed [i] = 0; arena[0].th_base_direction [i] *= -1; score_message(SMESSAGE_CAPTURE, actor[bactor].user, actor[bactor].team, 0); } } else { arena[0].th_base_taken [i] = actor[bactor].team; arena[0].th_base_counter [i] = 900; arena[0].th_base_speed [i] = 0; arena[0].th_base_direction [i] *= -1; score_message(SMESSAGE_CAPTURE, actor[bactor].user, actor[bactor].team, 0); // arena[0].th_ } } } return; } if (actor[bactor].x > team[actor[bactor].team].base_x - (15 * GRAIN) && actor[bactor].x < team[actor[bactor].team].base_x + (15 * GRAIN) && actor[bactor].y > team[actor[bactor].team].base_y - (15 * GRAIN) && actor[bactor].y < team[actor[bactor].team].base_y + (15 * GRAIN)) { switch(game[0].game_type) { default: return; case GAME_GRAIL: score_message(SMESSAGE_GRAIL, actor[bactor].user, actor[bactor].team, 0); score_event(bactor, SCORE_GRAIL, 0); actor[bactor].has_grail = 0; drop_pickups(PICKUP_GRAIL, 0); team[actor[bactor].team].base_counter ++; if (team[actor[bactor].team].base_counter >= 5) { teleport_team_base(actor[bactor].team); team[actor[bactor].team].base_counter = 0; } // play_sound(WAV_SCORE); break; case GAME_CAP_FLAG: if (actor[bactor].has_flag == -1 || team[actor[bactor].team].flag_at_base == 0) return; score_event(actor[bactor].team, SCORE_FLAG, actor[bactor].has_flag); score_message(SMESSAGE_FLAG, actor[bactor].user, actor[bactor].has_flag, 0); team[actor[bactor].team].base_counter ++; if (team[actor[bactor].team].base_counter >= 5) { teleport_team_base(actor[bactor].team); team[actor[bactor].team].base_counter = 0; } create_pickup(PICKUP_FLAG, actor[bactor].has_flag, team[actor[bactor].has_flag].base_x, team[actor[bactor].has_flag].base_y, 0, 0, 0, -1, -1); team[actor[bactor].has_flag].flag_at_base = 1; actor[bactor].has_flag = -1; // play_sound(WAV_SCORE); break; } } }
void send_controller_event(controller_event_t event) { score_event(event); interface_event(event); }