Esempio n. 1
0
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;
}
Esempio n. 2
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;
	}
}
Esempio n. 3
0
void player_checkMines( )
{
	if (currentStep != STEP_PLAY)	return;
	 
	if ( mines_collideShip( /*&shipPosition */) == true ) 
		player_hit();
}
Esempio n. 4
0
void player_checkBombs( )
{
	if (currentStep != STEP_PLAY)	return;

	if ( enemies_bombVSShip( /*&shipPosition*/ ) == true )
		player_hit();
}
Esempio n. 5
0
void player_checkFlyingEnemies( )
{
	if (currentStep != STEP_PLAY)	return;

	if ( enemies_flyingVSShip( /*&shipPosition*/ ) == true )
		player_hit();
}
Esempio n. 6
0
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);
}
Esempio n. 7
0
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;
			}
		}
	}
}
Esempio n. 9
0
/* 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);
}
Esempio n. 10
0
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 );
    };

}
Esempio n. 11
0
void player_remove_collision(struct cpSpace *space, void *key, void *data) {
	if (player_hit(key,data)) {
		ERR_TRACE();
	}
}