// 활성 아이템 오브젝트 처리 (이텍트 == 칼)
void MoveEffect() {
  int i;
  for(i = 0; i<40; ++i) {
    if(effect[i].state == DEAD)
      continue;
    if(clock() - effect[i].tick > speed_fastest) {
      effect[i].tick = clock();
      enum ObjectType target = TryMove(effect[i].pos, effect[i].dir);
      if(target == WALL) {
        effect[i].state = DEAD;
        effect[i].dir = STOP;
      }
      else if(target == PLAYER) {
        Move(&effect[i].pos, effect[i].dir);
        int j;
        for(j = 0; j<3; ++j) {
          if(IsSamePos(&player[j].pos, &effect[i].pos))
            DamagePlayer(j);
        }
      }
      else if(target == ENEMY) {
        Move(&effect[i].pos, effect[i].dir);
        int j;
        for(j = 0; j<number_of_enemies; ++j) {
          if(IsSamePos(&enemy[j].pos, &effect[i].pos))
            DamageEnemy(j);
        }
      }
      else {
        Move(&effect[i].pos, effect[i].dir);
        refresh_object = 1;
      }
    }
  }
}
// 적 이동 및 충돌 검사
void MoveEnemy() {
  int i;
  for(i = 0; i<number_of_enemies; ++i) {
    if(enemy[i].state == DEAD)
      continue;
    if(enemy[i].state == FROZEN) {
      if(enemy[i].state_end <= clock()) {
        enemy[i].state = SLOW;
        enemy[i].state_end = clock()+5000;
      }
      else {
        continue;
      }
    }
    int speed = speed_normal;
    if(enemy[i].state == FAST) {
      speed = speed_fast;
    }
    else if(enemy[i].state == SLOW) {
      speed = speed_slow;
      if(enemy[i].state_end <= clock())
        enemy[i].state = NORMAL;
    }
    else {
    }
    if(clock() - enemy[i].tick > speed) {
      enemy[i].tick = clock();
      enum ObjectType target = TryMove(enemy[i].pos, enemy[i].dir);
      if(target == WALL) {
        enemy[i].dir = rand()%4+1;
        enemy[i].tick -= 1000;
      }
      else if(target == PLAYER) {
        Move(&enemy[i].pos, enemy[i].dir);
        int j;
        for(j = 0; j<3; ++j) {
          if(IsSamePos(&player[j].pos, &enemy[i].pos))
            DamagePlayer(j);
        }
      }
      else if(target == EFFECT) {
        DamageEnemy(i);
      }
      else {
        Move(&enemy[i].pos, enemy[i].dir);
        refresh_object = 1;
      }
    }
  }
}
void Bomb(
    int& bomb_time,            // 폭탄의 유효시간
    float x0, float y0,        // 폭탄의 유효범위의 좌상좌표
    float x1, float y1,        // 폭탄의 유효범위의 우하좌표
    float bx0[], float by0[],  // 탄의 좌상좌표
    float bx1[], float by1[],  // 탄의 우하좌표
    int num_bullet,            // 탄의 갯수
    float ex0[], float ey0[],  // 적기의 좌상좌표
    float ex1[], float ey1[],  // 적기의 우하좌표
    int num_enemy		   // 적기의 갯수
) {
    // 폭탄이 유효한 경우의 처리
    if (bomb_time>0) {

        // 탄을 제거하기:
        // 제거하는 구체적인 처리는
        // DeleteBullet 함수에서 수행하기로 함.
        for (int i=0; i<num_bullet; i++) {
            if (bx0[i]<x1 && x0<bx1[i] &&
                    by0[i]<y1 && y0<by1[i]) {
                DeleteBullet(i);
            }
        }

        // 적기에게 피해를 입히기:
        // 피해를 입히는 구체적인 처리는
        // DamageEnemy 함수에서 수행하기로 함.
        for (int i=0; i<num_enemy; i++) {
            if (ex0[i]<x1 && x0<ex1[i] &&
                    ey0[i]<y1 && y0<ey1[i]) {
                DamageEnemy(i);
            }
        }

        // 폭탄의 유효시간을 줄임
        bomb_time--;
    }
}
// 버서크 상태의 처리
void Berserk(
	int num_shot,   // 아군의 샷의 수
	int num_enemy,  // 적기의 갯수
	int num_bullet  // 탄(적기의 탄)의 갯수
) {
	static STATE_TYPE state=NORMAL;  // 메인 캐릭터의 상태(처음에는 보통 상태)
	static int energy=0;             // 에너지
	static int berserk_energy=100;   // 버서크 상태가 되기 위해
	                                 // 필요한 에너지
	static int time;                 // 버서크 효과의 잔여시간
	
	// 메인 캐릭터의 상태에 따라 분기
	switch (state) {
		
		// 보통 상태
		case NORMAL:

			// 보통 공격:
			// 구체적인 처리는 NormalAttack 함수에서 수행하기로 함.
			NormalAttack();

			// 탄이나 적기와 접촉 판정:
			// 부딪히면 피해를 받음.
			// 판정이나 결과의 구체적인 처리는 HitEnemy,
			// HitBullet, Miss 함수에서 각각 수행하기로 함.
			for (int i=0; i<num_enemy; i++)
				if (HitEnemy(i)) Miss();
			for (int i=0; i<num_bullet; i++)
				if (HitBullet(i)) Miss();

			// 아군 캐릭터가 쏜 샷과 접촉 판정:
			// 에너지를 모음.
			// 판정이나 결과의 구체적인 처리는 HitShot,
			// DeleteShot 함수에서 각각 수행하기로 함.
			for (int i=0; i<num_shot; i++) {
				if (HitShot(i)) {
					energy++;
					DeleteShot(i);
				}
			}

			// 에너지 양 판단:
			// 에너지가 충분히 모였으면
			// 버서크 상태로 이동함.
			// 에너지는 시간이 지남에 따라 저절로 감소됨.
			if (energy>=berserk_energy) {
				state=BERSERK;
				time=300;
			} else {
				energy--;
			}

			break;
		
		// 버서크 상태
		case BERSERK:

			// 특수 공격:
			// 구체적인 처리는 SpecialAttack 함수에서 수행하기로 함.
			SpecialAttack();

			// 적기나 탄과 접촉 판정:
			// 적기에는 피해를 주고 탄은 제거함.
			// 결과의 구체적인 처리는 DamageEnemy,
			// DeleteBullet 함수에서 각각 수행하기로 함.
			for (int i=0; i<num_enemy; i++)
				if (HitEnemy(i)) DamageEnemy(i);
			for (int i=0; i<num_bullet; i++)
				if (HitBullet(i)) DeleteBullet(i);
			
			// 남은 시간이 다 되었다면 약한 상태로 이동함.
			time--;
			if (time<=0) {
				state=WEAK;
				time=200;
			}
			
			break;
			
		// 약한 상태
		case WEAK:
			
			// 적기나 탄과 접촉 판정:
			// 맞으면 피해를 받음.
			for (int i=0; i<num_enemy; i++)
				if (HitEnemy(i)) Miss();
			for (int i=0; i<num_bullet; i++)
				if (HitBullet(i)) Miss();

			// 남은 시간이 다 되었다면 보통 상태로 이동함.
			time--;
			if (time<=0) {
				state=NORMAL;
				energy=0;
			}
			
			break;
	}
}