// 활성 아이템 오브젝트 처리 (이텍트 == 칼) 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; } }