void powerup_logic(void) { int i; for(i = 0; i < GAME_MAX_POWERUPS; i++) { if(powerup[i].active) { switch(powerup[i].type) { case POWERUP_TYPE_SPIRIT: { powerup[i].var--; powerup[i].x += powerup[i].vx; powerup[i].y += powerup[i].vy; if(powerup[i].var <= 0) { powerup[i].active = false; } else { t3f_move_collision_object_xy(powerup[i].object, powerup[i].x, powerup[i].y); if(player.active && t3f_check_object_collision(powerup[i].object, player.object)) { al_play_sample(sample[SAMPLE_POWERUP], 1.0, 0.5, 1.0, ALLEGRO_PLAYMODE_ONCE, NULL); score += 10 * multiplier; multiplier_tick++; if(multiplier_tick >= 10) { al_play_sample(sample[SAMPLE_MULTIPLIER], 1.0, 0.5, 1.0, ALLEGRO_PLAYMODE_ONCE, NULL); multiplier++; if(multiplier == 10) { al_play_sample(sample[SAMPLE_MAX_MULTIPLIER], 1.0, 0.5, 1.0, ALLEGRO_PLAYMODE_ONCE, NULL); } if(multiplier > 10) { multiplier = 10; } multiplier_tick = 0; } powerup[i].active = 0; } } powerup[i].tick++; break; } case POWERUP_TYPE_UPGRADE: { break; } } } } }
void demo_logic(void) { int skipy = 0; if(stepmode) { if(t3f_key[ALLEGRO_KEY_ENTER]) { t3f_key[ALLEGRO_KEY_ENTER] = 0; } else { return; } } if(t3f_key[ALLEGRO_KEY_ESCAPE]) { t3f_exit(); } if(t3f_key[ALLEGRO_KEY_F1]) { stepmode = true; } if(t3f_key[ALLEGRO_KEY_1]) { target_z = demo_tilemap->layer[0]->z; } else if(t3f_key[ALLEGRO_KEY_2]) { target_z = demo_tilemap->layer[1]->z; } else if(t3f_key[ALLEGRO_KEY_3]) { target_z = demo_tilemap->layer[2]->z; } else if(t3f_key[ALLEGRO_KEY_4]) { target_z = demo_tilemap->layer[3]->z; } else if(t3f_key[ALLEGRO_KEY_5]) { target_z = demo_tilemap->layer[4]->z; } t3f_read_controller(controller); if(t3f_key[ALLEGRO_KEY_LEFT]) { demo_camera.x -= 2.0; } if(t3f_key[ALLEGRO_KEY_RIGHT]) { demo_camera.x += 2.0; } if(t3f_key[ALLEGRO_KEY_UP]) { demo_camera.y -= 2.0; } if(t3f_key[ALLEGRO_KEY_DOWN]) { demo_camera.y += 2.0; } if(demo_camera.z > target_z) { demo_camera.z -= 10.0; if(demo_camera.z < target_z) { demo_camera.z = target_z; } } else if(demo_camera.z < target_z) { demo_camera.z += 10.0; if(demo_camera.z > target_z) { demo_camera.z = target_z; } } platform.angle += 0.05; platform.x = 320 + cos(platform.angle) * 48.0; t3f_move_collision_object_x(platform.cp, platform.x); platform.y = 240 + sin(platform.angle) * 48.0; t3f_move_collision_object_y(platform.cp, platform.y); if(platform.cp->vy < 0.0 && platform.cp->oy + platform.cp->map.top.point[0].y > player.cp->y + player.cp->map.bottom.point[0].y && t3f_check_object_collision(platform.cp, player.cp)) { player.sticky = platform.cp; player.y = t3f_get_object_top_y(player.cp, platform.cp); t3f_move_collision_object_y(player.cp, player.y); skipy = 1; player.floor = false; } /* add gravity */ if(!player.floor && !player.sticky) { if(controller->state[DEMO_CONTROLLER_UP].held && player.vy < 0.0) { player.vy += 0.35; } else { player.vy += 0.5; } if(player.vy > 10.0) { player.vy = 10.0; } if(player.vy < 0) { if(player.state < 5) { player.state = DEMO_SPRITE_STATE_JUMP_RIGHT; } else { player.state = DEMO_SPRITE_STATE_JUMP_LEFT; } } else { if(player.state < 5) { player.state = DEMO_SPRITE_STATE_FALL_RIGHT; } else { player.state = DEMO_SPRITE_STATE_FALL_LEFT; } } } else { if(controller->state[DEMO_CONTROLLER_DOWN].held) { if(player.state < 5) { player.state = DEMO_SPRITE_STATE_DUCK_RIGHT; } else { player.state = DEMO_SPRITE_STATE_DUCK_LEFT; } } else { if(player.state == DEMO_SPRITE_STATE_DUCK_RIGHT) { player.state = DEMO_SPRITE_STATE_STAND_RIGHT; } else if(player.state == DEMO_SPRITE_STATE_DUCK_LEFT) { player.state = DEMO_SPRITE_STATE_STAND_LEFT; } } } if(controller->state[DEMO_CONTROLLER_LEFT].held && !controller->state[DEMO_CONTROLLER_RIGHT].held) { player.vx -= 0.5; if(player.vx < -3.0) { player.vx = -3.0; } if((player.floor || player.sticky) && player.vx < 0.0 && player.state != DEMO_SPRITE_STATE_WALK_LEFT) { player.state = DEMO_SPRITE_STATE_WALK_LEFT; player.frame = 0; } else { if(player.state == DEMO_SPRITE_STATE_JUMP_RIGHT) { player.state = DEMO_SPRITE_STATE_JUMP_LEFT; } else if(player.state == DEMO_SPRITE_STATE_FALL_RIGHT) { player.state = DEMO_SPRITE_STATE_FALL_LEFT; } } } else if(controller->state[DEMO_CONTROLLER_RIGHT].held && !controller->state[DEMO_CONTROLLER_LEFT].held) { player.vx += 0.5; if(player.vx > 3.0) { player.vx = 3.0; } if((player.floor || player.sticky) && player.vx > 0.0 && player.state != DEMO_SPRITE_STATE_WALK_RIGHT) { player.state = DEMO_SPRITE_STATE_WALK_RIGHT; player.frame = 0; } else { if(player.state == DEMO_SPRITE_STATE_JUMP_LEFT) { player.state = DEMO_SPRITE_STATE_JUMP_RIGHT; } else if(player.state == DEMO_SPRITE_STATE_FALL_LEFT) { player.state = DEMO_SPRITE_STATE_FALL_RIGHT; } } } else if(player.floor || player.sticky) { if(player.vx > 0.0) { player.vx -= 0.25; if(player.vx <= 0.0) { player.vx = 0.0; if(player.state != DEMO_SPRITE_STATE_DUCK_RIGHT) { player.state = DEMO_SPRITE_STATE_STAND_RIGHT; } } } else if(player.vx < 0.0) { player.vx += 0.25; if(player.vx >= 0.0) { player.vx = 0.0; if(player.state != DEMO_SPRITE_STATE_DUCK_LEFT) { player.state = DEMO_SPRITE_STATE_STAND_LEFT; } } } } player.x += player.vx; if(player.sticky) { player.x += player.sticky->vx; } t3f_move_collision_object_x(player.cp, player.x); if(!t3f_get_collision_tilemap_flag(demo_collision_tilemap, player.cp->x + player.cp->map.bottom.point[0].x, player.cp->y + player.cp->map.bottom.point[0].y, T3F_COLLISION_FLAG_SLOPE_TOP)) { if(t3f_check_tilemap_collision_left(player.cp, demo_collision_tilemap)) { player.x = t3f_get_tilemap_collision_x(player.cp, demo_collision_tilemap); player.vx = 0.0; t3f_move_collision_object_x(player.cp, player.x); } else if(t3f_check_tilemap_collision_right(player.cp, demo_collision_tilemap)) { player.x = t3f_get_tilemap_collision_x(player.cp, demo_collision_tilemap); player.vx = 0.0; t3f_move_collision_object_x(player.cp, player.x); } } if(player.sticky && (player.cp->x + player.cp->map.left.point[0].x > player.sticky->x + player.sticky->map.right.point[0].x || player.cp->x + player.cp->map.right.point[0].x < player.sticky->x + player.sticky->map.left.point[0].x)) { player.sticky = NULL; player.floor = false; player.vy = 0.0; } if(player.floor) { player.y = t3f_get_tilemap_walk_position(player.cp, demo_collision_tilemap, T3F_COLLISION_FLAG_SOLID_TOP); t3f_move_collision_object_y(player.cp, player.y); } if(controller->state[DEMO_CONTROLLER_UP].pressed && (player.floor || player.sticky)) { player.vy = -10.0; player.sticky = NULL; player.floor = false; } if(player.sticky && !skipy) { player.y += player.sticky->vy; } if(!player.floor) { player.y += player.vy; } if((player.sticky && !skipy) || !player.floor) { t3f_move_collision_object_y(player.cp, player.y); /* collide with platform */ if(player.cp->vy > 0.0 && player.cp->oy + player.cp->map.bottom.point[0].y < platform.cp->y + platform.cp->map.top.point[0].y && t3f_check_object_collision(player.cp, platform.cp)) { player.y = t3f_get_object_top_y(player.cp, platform.cp); t3f_move_collision_object_y(player.cp, player.y); player.sticky = platform.cp; player.floor = false; if(player.state < 5) { player.state = DEMO_SPRITE_STATE_STAND_RIGHT; } else { player.state = DEMO_SPRITE_STATE_STAND_LEFT; } } if(t3f_check_tilemap_collision_bottom(player.cp, demo_collision_tilemap)) { printf("land\n"); player.y = t3f_get_tilemap_collision_y(player.cp, demo_collision_tilemap); t3f_move_collision_object_y(player.cp, player.y); player.floor = true; player.vy = 0.0; player.sticky = NULL; if(player.state < 5) { player.state = DEMO_SPRITE_STATE_STAND_RIGHT; } else { player.state = DEMO_SPRITE_STATE_STAND_LEFT; } } else if(t3f_check_tilemap_collision_top(player.cp, demo_collision_tilemap)) { player.y = t3f_get_tilemap_collision_y(player.cp, demo_collision_tilemap); player.vy = 0.0; t3f_move_collision_object_y(player.cp, player.y); } } if(player.floor) { bool nf = false; bool af = false; int i; for(i = 0; i < player.cp->map.bottom.points; i++) { if(t3f_get_collision_tilemap_flag(demo_collision_tilemap, player.cp->x + player.cp->map.bottom.point[i].x, player.cp->y + player.cp->map.bottom.point[i].y + 1.0, T3F_COLLISION_FLAG_SOLID_TOP | T3F_COLLISION_FLAG_SLOPE_TOP) == (T3F_COLLISION_FLAG_SOLID_TOP | T3F_COLLISION_FLAG_SLOPE_TOP)) { nf = true; } /* if any bottom point is touching a floor */ if(t3f_check_collision_tilemap_flag(demo_collision_tilemap, player.cp->x + player.cp->map.bottom.point[i].x, player.cp->y + player.cp->map.bottom.point[i].y + 1.0, T3F_COLLISION_FLAG_SOLID_TOP, 0)) { af = true; } } // if(!nf || (!af && t3f_get_collision_tilemap_flag(demo_collision_tilemap, player.cp->x + player.cp->map.bottom.point[0].x, player.cp->y + player.cp->map.bottom.point[0].y + 1.0, T3F_COLLISION_FLAG_SOLID_TOP) != (T3F_COLLISION_FLAG_SOLID_TOP))) if(!af || (nf && t3f_get_collision_tilemap_flag(demo_collision_tilemap, player.cp->x + player.cp->map.bottom.point[0].x, player.cp->y + player.cp->map.bottom.point[0].y + 1.0, T3F_COLLISION_FLAG_SOLID_TOP) != (T3F_COLLISION_FLAG_SOLID_TOP))) { player.vy = 0.0; player.floor = false; if(!af) { printf("af\n"); } else { printf("nf\n"); } } } player.frame++; if(t3f_check_object_collision(platform.cp, player.cp)) { collision = true; } else { collision = false; } demo_camera.x = player.x + 16.0 - 320.0; demo_camera.y = player.y + 16.0 - 240.0; demo_tick++; }
/* logic routines, passed to T^3 Framework */ void paddle_logic(void * data) { /* logic switch, use different logic for each state */ switch(paddle_state) { case EXAMPLE_STATE_TITLE: { t3f_process_gui(paddle_menu, data); break; } case EXAMPLE_STATE_GAME: { /* return to menu if Escape pressed */ if(t3f_key[ALLEGRO_KEY_ESCAPE]) { paddle_game_exit(); } /* store old paddle positions */ paddle[0].oy = paddle[0].y; paddle[1].oy = paddle[1].y; /* move paddle */ paddle[0].y = t3f_mouse_y - 32; if(paddle[0].y < 0) { paddle[0].y = 0; } if(paddle[0].y > 480.0 - 64.0) { paddle[0].y = 480.0 - 64.0; } t3f_move_collision_object_xy(paddle[0].object, paddle[0].x, paddle[0].y); /* move CPU paddle */ if(ball.vx > 0.0) { if(ball.x > paddle[1].x - 24) { paddle[1].y += paddle[1].dvy; } else { if(paddle[1].y < paddle[1].dy - 2.0) { paddle[1].y += 2.0; if(paddle[1].y > 480.0 - 64.0) { paddle[1].y = 480.0 - 64.0; } } else if(paddle[1].y > paddle[1].dy + 2.0) { paddle[1].y -= 2.0; if(paddle[1].y < 0.0) { paddle[1].y = 0.0; } } } /* correct paddle position so it doesn't go past edge */ if(paddle[1].y > 480.0 - 64.0) { paddle[1].y = 480.0 - 64.0; } if(paddle[1].y < 0.0) { paddle[1].y = 0.0; } } t3f_move_collision_object_xy(paddle[1].object, paddle[1].x, paddle[1].y); /* move ball */ ball.x += ball.vx; t3f_move_collision_object_xy(ball.object, ball.x, ball.y); if(ball.vx < 0 && t3f_check_object_collision(paddle[0].object, ball.object)) { al_play_sample(paddle_sample[EXAMPLE_SAMPLE_HIT], 0.5, 0.5, 1.0, ALLEGRO_PLAYMODE_ONCE, NULL); ball.x = paddle[0].x + 16.0; ball.vx = -ball.vx; ball.vx += EXAMPLE_SPEED_INCREASE; ball.vy -= (paddle[0].oy - paddle[0].y) / 4.0; if(ball.vy < -3.0) { ball.vy = -3.0; } if(ball.vy > 3.0) { ball.vy = 3.0; } paddle[1].dy = paddle_ai_predict_y() - 32 + 8.0; paddle[1].dvy = t3f_drand(&rng_state) * 6.0 - 3.0; } else if(ball.vx > 0 && t3f_check_object_collision(paddle[1].object, ball.object)) { al_play_sample(paddle_sample[EXAMPLE_SAMPLE_HIT], 0.5, 0.5, 1.0, ALLEGRO_PLAYMODE_ONCE, NULL); ball.x = paddle[1].x - 16.0 - 1.0; ball.vx = -ball.vx; ball.vx -= EXAMPLE_SPEED_INCREASE; ball.vy -= (paddle[1].oy - paddle[1].y) / 4.0; if(ball.vy < -3.0) { ball.vy = -3.0; } if(ball.vy > 3.0) { ball.vy = 3.0; } } if(ball.x < -16.0) { al_play_sample(paddle_sample[EXAMPLE_SAMPLE_SCORE], 0.5, 0.5, 1.0, ALLEGRO_PLAYMODE_ONCE, NULL); score[1]++; if(score[1] >= 5) { t3f_stop_music(); paddle_state = EXAMPLE_STATE_GAME_OVER; } paddle_init_ball(1.0); } else if(ball.x > 640.0) { al_play_sample(paddle_sample[EXAMPLE_SAMPLE_SCORE], 0.5, 0.5, 1.0, ALLEGRO_PLAYMODE_ONCE, NULL); score[0]++; if(score[0] >= 5) { t3f_stop_music(); paddle_state = EXAMPLE_STATE_GAME_OVER; } paddle_init_ball(-1.0); } ball.y += ball.vy; if(ball.y < 0.0) { ball.y = 0.0; ball.vy = -ball.vy; } else if(ball.y > 480.0 - 16.0) { ball.y = 480.0 - 16.0; ball.vy = -ball.vy; } break; } case EXAMPLE_STATE_GAME_OVER: { /* return to menu if Escape pressed */ if(t3f_mouse_button[0] || t3f_key[ALLEGRO_KEY_ESCAPE]) { paddle_game_exit(); } break; } } }