int16_t shot_collision(void) { int16_t x, y; x = shot.pos.x >> UNITS_X_SHIFT; y = shot.pos.y >> UNITS_Y_SHIFT; //bottom, left, right if( y >= FIELD_Y + FIELD_HEIGHT || x < FIELD_X || x >= FIELD_X + FIELD_WIDTH) { return 1; } //players if(player_hit(&player1, x, y) || player_hit(&player2, x, y)) { return 1; } //terrain if(y >= terrain[x - FIELD_X]) { explosion(x, y); //TODO update terrain return 1; } return 0; }
void bomb_event(struct game* game, struct map* map, struct bomb* bomb, int x, int y) { struct player** players = game_get_players(game); struct player* player = NULL; struct bomb* sbomb = NULL; for(int i = 0; i < game_get_nb_player(game); i++) { player = players[i]; if((x == player_get_x(player) && y == player_get_y(player))) player_hit(player, 3*DEFAULT_GAME_FPS); } int cellType = map_get_cell_type(map, x, y); switch(cellType & 15){ case CELL_BONUS : // Case map_set_cell_type(map, x, y, CELL_EMPTY); break; case CELL_MONSTER : // Monster map_set_monsters( map, monster_hit(map_get_monsters(map), x, y, game) ); break; case CELL_CASE : // Case if(bomb->anim >= DEFAULT_GAME_FPS) map_case_destroyed(game, map, x, y); break; case CELL_BOMB : // Bomb if((sbomb = search_bomb(map, x, y, 0)) != NULL) sbomb->anim = 4 * DEFAULT_GAME_FPS; break; default: // Everything else break; } }
void player_checkMines( ) { if (currentStep != STEP_PLAY) return; if ( mines_collideShip( /*&shipPosition */) == true ) player_hit(); }
void player_checkBombs( ) { if (currentStep != STEP_PLAY) return; if ( enemies_bombVSShip( /*&shipPosition*/ ) == true ) player_hit(); }
void player_checkFlyingEnemies( ) { if (currentStep != STEP_PLAY) return; if ( enemies_flyingVSShip( /*&shipPosition*/ ) == true ) player_hit(); }
void update(objectmachine_t *obj, player_t **team, int team_size, brick_list_t *brick_list, item_list_t *item_list, object_list_t *object_list) { objectdecorator_t *dec = (objectdecorator_t*)obj; objectdecorator_enemy_t *me = (objectdecorator_enemy_t*)obj; objectmachine_t *decorated_machine = dec->decorated_machine; object_t *object = obj->get_object_instance(obj); int i, score; score = (int)expression_evaluate(me->score); /* player x object collision */ for(i=0; i<team_size; i++) { player_t *player = team[i]; if(actor_pixelperfect_collision(object->actor, player->actor)) { if(player_is_attacking(player) || player->invincible) { /* I've been defeated */ player_bounce(player, object->actor); level_add_to_score(score); level_create_item(IT_EXPLOSION, v2d_add(object->actor->position, v2d_new(0,-15))); level_create_animal(object->actor->position); sound_play( soundfactory_get("destroy") ); object->state = ES_DEAD; } else { /* The player has been hit by me */ player_hit(player, object->actor); } } } decorated_machine->update(decorated_machine, team, team_size, brick_list, item_list, object_list); }
void test_cycle() { monster_descr * rat_test = malloc(sizeof(monster_descr)); rat_test->pic = '$'; rat_test->name = "Rat"; rat_test->max_hp = 10; rat_test->dodge = 20; rat_test->max_roll = 100; rat_test->max_dmg = 10; rat_test->min_dmg = 1; //TEST//fix player_descr * player = malloc(sizeof(player_descr)); player->max_hp = 20; player->hp = 20; player->dodge = 20; player->max_roll = 100; player->max_dmg = 20; player->min_dmg = 5; monster * rat1; rat1 = make_monster(rat_test); player_hit(player, rat1); monster_hit(rat1, player); // TODO: add test }
void BattleCommanderStateDirection::CheckPointingActor(void){ Cursor3D* cursor3d(_accessor->GetCursor3D()); if(!cursor3d->GetVisible()){ _pointing_actor = nullptr; return; } D3DXVECTOR3 cursor_position(cursor3d->GetPosition()); HitSphere cursor_hit(nullptr, cursor_position, 5.0f); //敵と味方を全部辿って、当たっている奴の中で一番近いやつを指す _pointing_actor = nullptr; float min_length(1000.0f); int player_count(_accessor->GetPlayerCount()); for(int i=0; i<player_count; i++){ BattleActor* player(_accessor->GetPlayer(i)); Hit* player_hit(player->GetCursorHit()); bool hit(player_hit->HitCheck(&cursor_hit)); if(hit){ D3DXVECTOR3 player_position(player->GetPosition()); D3DXVECTOR3 v(player_position - cursor_position); float length(D3DXVec3Length(&v)); if(min_length > length){ min_length = length; _pointing_actor = player; } } } int enemy_count(_accessor->GetEnemyCount()); for(int i=0; i<enemy_count; i++){ BattleActor* enemy(_accessor->GetEnemy(i)); Hit* enemy_hit(enemy->GetCursorHit()); bool hit(enemy_hit->HitCheck(&cursor_hit)); if(hit){ D3DXVECTOR3 enemy_position(enemy->GetPosition()); D3DXVECTOR3 v(enemy_position - cursor_position); float length(D3DXVec3Length(&v)); if(min_length > length){ min_length = length; _pointing_actor = enemy; } } } }
/* fireball 특성 생성, 설정 (방어막 감소)*/ void fireball_update(item_t* item, player_t** team, int team_size, brick_list_t* brick_list, item_list_t* item_list, enemy_list_t* enemy_list) { int i; actor_t *act = item->actor; fireball_t *me = (fireball_t*)item; /* 캐릭터를 공격 */ for(i=0; i<team_size; i++) { player_t *player = team[i]; if(!player->dying && actor_collision(act, player->actor)) { item->state = IS_DEAD; if(player->shield_type != SH_FIRESHIELD) player_hit(player); } } /* 캐릭터 행동*/ me->run(item, brick_list); }
void GameProcess() { if (game.status == STATUS_PLAYING) { int c_shoot_restore_delay = (6 + 2*game.stage_level); int c_shoot_restore_period = (game.stage_level < 2) ? (3 + game.stage_level) : 5; // shoot if ( ( (game.shoot_keypressed) || (is_key_pressed(RS_ATTACK_KEY_MASK)) ) && (game.ammo>0) ) { game.shoot_delay ++; if (game.shoot_delay > GAME_SHOOT_PERIOD) { // if (game.ammo > 0) { game.shoot_restore_delay = 0; game.ammo--; soundbuf_play(&game.sound_shoot, 0); game_obj_add( game_obj( OBJ_BULLET, 0, 0, 0, game.player_x+5, game.player_y, 0, 0.0) ); // }; game.shoot_delay = 1; // -= GAME_SHOOT_PERIOD; game.shoot_keypressed = 0; }; } else { if (game.ammo < GAME_AMMO_MAX) { game.shoot_restore_delay++; if (game.shoot_restore_delay > c_shoot_restore_delay) { game.shoot_delay++; if (game.shoot_delay > c_shoot_restore_period) { game.ammo++; game.shoot_delay -= c_shoot_restore_period; }; }; }; }; int speed = 4; int bullet_speed = 11; int red_bullet_speed = 8; int rock_speed = 6; game.player_x += speed * ( is_key_pressed(RS_ARROW_RIGHT_MASK) - is_key_pressed(RS_ARROW_LEFT_MASK) ); game.player_y += speed * ( is_key_pressed(RS_ARROW_DOWN_MASK) - is_key_pressed(RS_ARROW_UP_MASK) ); game.player_x = rs_clamp_i(game.player_x, 15, GAME_WIDTH - 45); game.player_y = rs_clamp_i(game.player_y, 15, GAME_HEIGHT - 45); game.tz += 1; int c_rocktimer_const = (game.stage_level < 4) ? (9 - 2*game.stage_level) : 4; int c_rocktimer_var = (game.stage_level < 6) ? (16 - 2*game.stage_level) : 6; game.stage_timer++; if (game.stage == 0) { // level start next_stage_after_sec(3); } else if (game.stage == 1) { // game.stage = 4; // rocks next_rock_timer--; if (next_rock_timer < 1) { next_rock_timer = c_rocktimer_const + rs_rand()%c_rocktimer_var; //game_obj_add( game_obj( ((rs_rand() % 512) > 256) ? OBJ_ROCK : OBJ_MINIROCK, 0, rs_rand() % ROCKS_COUNT , 32, GAME_WIDTH + 100, 30 + rs_rand()%(GAME_HEIGHT-60), 0, 0.0 ) ); int flagsin = 0; if ( game.stage_level > 4 ) { if ( rs_rand()%1024 < (16*game.stage_level) ) { flagsin = OBJ_FLAG_SIN; }; }; game_obj_add( game_obj( OBJ_ROCK, OBJ_FLAG_ENEMY | flagsin, rs_rand() % ROCKS_COUNT , game.tex_rocks[0].w/2, GAME_WIDTH + 50, 30 + rs_rand()%(GAME_HEIGHT-90), 0, 0.0 ) ); }; next_stage_after_sec(12); } if (game.stage == 2) { BIT_SET (game.flags, GAME_FLAG_INSTRUCTIONS_PASSED); next_stage_after_sec(4); } else if (game.stage == 3) { // rocks next_rock_timer--; if (next_rock_timer < 1) { next_rock_timer = c_rocktimer_const + 1 + rs_rand()%c_rocktimer_var; //game_obj_add( game_obj( ((rs_rand() % 512) > 256) ? OBJ_ROCK : OBJ_MINIROCK, 0, rs_rand() % ROCKS_COUNT , 32, GAME_WIDTH + 100, 30 + rs_rand()%(GAME_HEIGHT-60), 0, 0.0 ) ); int flagsin = 0; if ( game.stage_level > 2 ) { if ( rs_rand()%1024 < (16*game.stage_level) ) { flagsin = OBJ_FLAG_SIN; }; }; game_obj_add( game_obj( OBJ_MINIROCK, OBJ_FLAG_ENEMY|flagsin, rs_rand() % ROCKS_COUNT , game.tex_minirocks[0].w/2, GAME_WIDTH + 50, 30 + rs_rand()%(GAME_HEIGHT-90), 0, 0.0 ) ); }; next_stage_after_sec(16); } else if (game.stage == 4) { next_stage_after_sec(4); } else if (game.stage == 5) { // rocks next_rock_timer--; if (next_rock_timer < 1) { next_rock_timer = 5; //game_obj_add( game_obj( ((rs_rand() % 512) > 256) ? OBJ_ROCK : OBJ_MINIROCK, 0, rs_rand() % ROCKS_COUNT , 32, GAME_WIDTH + 100, 30 + rs_rand()%(GAME_HEIGHT-60), 0, 0.0 ) ); game_obj_add( game_obj( OBJ_MINIROCK, OBJ_FLAG_ENEMY | OBJ_FLAG_SIN, rs_rand() % ROCKS_COUNT , game.tex_minirocks[0].w/2, GAME_WIDTH + 50, GAME_HEIGHT/8, 0, 0.0 ) ); }; next_stage_after_sec(6); } else if (game.stage == 6) { // mix rocks next_rock_timer--; if (next_rock_timer < 1) { next_rock_timer = c_rocktimer_const + rs_rand()%(c_rocktimer_var-3); int flagsin = 0; if ( game.stage_level > 3 ) { if ( rs_rand()%1024 < (16*game.stage_level) ) { flagsin = OBJ_FLAG_SIN; }; }; //game_obj_add( game_obj( ((rs_rand() % 512) > 256) ? OBJ_ROCK : OBJ_MINIROCK, 0, rs_rand() % ROCKS_COUNT , 32, GAME_WIDTH + 100, 30 + rs_rand()%(GAME_HEIGHT-60), 0, 0.0 ) ); game_obj_add( game_obj( rs_rand()%1024 < 768 ? OBJ_MINIROCK : OBJ_ROCK, OBJ_FLAG_ENEMY | flagsin, rs_rand() % ROCKS_COUNT , rs_rand()%1024 < 768 ? game.tex_minirocks[0].w/2 : game.tex_rocks[0].w/2, GAME_WIDTH + 100, 30 + rs_rand()%(GAME_HEIGHT-90), 0, 0.0 ) ); }; next_stage_after_sec(10); } else if (game.stage == 7) { if (game.stage_timer > 3*25) { next_stage_now(); BIT_CLEAR(game.flags, GAME_FLAG_BOSS_DESTROYED); game_obj_add( game_obj( OBJ_TURRET, OBJ_FLAG_ENEMY | OBJ_FLAG_BOSS, 60, game.tex_rocks[0].w/2, GAME_WIDTH+60, GAME_HEIGHT/2, 0, 0.0 ) ); }; } else if (game.stage == 8) { if ( IS_BIT_SET(game.flags, GAME_FLAG_BOSS_DESTROYED) ) { next_stage_now(); }; } else if (game.stage == 9) { next_stage_after_sec(2); } else if (game.stage == 10) { /* game.status = STATUS_MENU; menu_open( MENU_LEVEL_PASSED ); level_passed_score_str[1] = '0' + (game.score / 100) % 10; level_passed_score_str[2] = '0' + (game.score / 10) % 10; level_passed_score_str[3] = '0' + (game.score / 1) % 10; */ game.stage_level++; game.stage = 0; game.stage_timer = 0; }; int i, j; game_obj_t *obj; for (i = 0; i < game.objs_count; i++) { obj = &(game.objs[i]); if (obj->obj_type == OBJ_BULLET) { obj->x += bullet_speed; if (obj->x > GAME_WIDTH) { // destroy object game_obj_remove(i); i--; continue; }; for (j = 0; j < game.objs_count; j++) { if (IS_BIT_SET(game.objs[j].flags, OBJ_FLAG_ENEMY)) { if (check_collision(i, j)) { if (IS_BIT_SET( game.objs[j].flags, OBJ_FLAG_BOSS)) { game.objs[j].tag--; if (game.objs[j].tag < 1) { BIT_SET( game.objs[j].flags, OBJ_FLAG_DESTROYED ); BIT_SET( game.flags, GAME_FLAG_BOSS_DESTROYED ); game.score += 50; }; } else { BIT_SET( game.objs[j].flags, OBJ_FLAG_DESTROYED ); game.score += game.objs[j].obj_type == OBJ_ROCK ? 2 : 3; }; game_obj_remove(i); i--; break; // continue parent loop }; }; }; } else if (obj->obj_type == OBJ_RED_BULLET) { obj->x -= red_bullet_speed; if (obj->x < 4) { // destroy object game_obj_remove(i); i--; continue; }; if (check_collision_with_player(i)) { player_hit(); game_obj_remove(i); i--; continue; }; } else if (obj->obj_type == OBJ_EXPLOSION) { obj->t++; if (obj->t >= EXPLOSIONS_COUNT) { game_obj_remove(i); i--; continue; }; } else if (obj->obj_type == OBJ_HUGE_EXPLOSION) { obj->t++; if (obj->t >= HUGE_EXPLOSIONS_COUNT) { game_obj_remove(i); i--; continue; }; } else if ( (obj->obj_type == OBJ_ROCK) || (obj->obj_type == OBJ_MINIROCK) ) { obj->x -= rock_speed; if (obj->x < - obj->radius * 2) { game_obj_remove(i); i--; continue; }; if ( IS_BIT_SET(obj->flags, OBJ_FLAG_SIN) ) { obj->f += 0.2; obj->y += 7.0 * sin(obj->f); }; if ( check_collision_with_player(i) ) { player_hit(); game_obj_remove(i); i--; continue; }; } else if ( obj->obj_type == OBJ_TURRET ) { if (obj->x > GAME_WIDTH*3/4) { obj->x -= 2; } else { obj->f += 0.03; obj->y = GAME_HEIGHT * ( 0.5 + 0.3*sin(obj->f) ); }; if ( obj->x < GAME_WIDTH*4/5 ) { // turret shoot obj->t--; if (obj->t < 1) { soundbuf_play(&game.sound_turret_shoot, 0); game_obj_add( game_obj( OBJ_RED_BULLET, 0, 0, 3, obj->x - 5, obj->y, 0, 0) ); int c_const = (game.stage_level < 4) ? (10 - 2*game.stage_level) : 3; int c_var = (game.stage_level < 6) ? (20 - 3*game.stage_level) : 3; obj->t = c_const + rs_rand() % c_var; if ( (rs_rand()%1024) < 80 ) { obj->t += 18; }; }; }; }; }; for (i = 0; i < game.objs_count; i++) { if ( IS_BIT_SET( game.objs[i].flags, OBJ_FLAG_DESTROYED ) ) { if (game.objs[i].obj_type == OBJ_TURRET) { soundbuf_play( &game.sound_huge_explosion, 0 ); game_obj_add( game_obj( OBJ_HUGE_EXPLOSION, 0, 0, HUGE_EXPLOSION_RADIUS, game.objs[i].x, game.objs[i].y, 0, 0.0 ) ); } else { soundbuf_play( &game.sound_explosions[ rs_rand() % SOUND_EXPLOSIONS_COUNT ], 0 ); game_obj_add( game_obj( OBJ_EXPLOSION, 0, 0, EXPLOSION_RADIUS, game.objs[i].x, game.objs[i].y, 0, 0.0 ) ); }; game_obj_remove(i); i--; }; }; }; game_draw(); if ( (game.status == STATUS_MENU) && (game.menu_index != MENU_PAUSE) ) { soundbuf_loop_check( &game.sound_music ); }; }
void player_remove_collision(struct cpSpace *space, void *key, void *data) { if (player_hit(key,data)) { ERR_TRACE(); } }