-
열세번째 포켓몬, 칠색조 구현 (반동기)포켓몬 배틀 구현 2022. 3. 23. 04:29
13번째 포켓몬, 칠색조 차례이다.
https://pikalytics.com/pokedex/homebss/ho-oh
Ho-Oh Series 12 Battle Stadium Singles Stats Pokédex | Pokémon | Pikalytics
Heavy-Duty Boots 40.500% Assault Vest 26.300% Life Orb 17.700% Weakness Policy 4.000% Lum Berry 3.700% Choice Scarf 3.300% Rocky Helmet 2.400% Wacan Berry 0.500% Leftovers 0.500% Focus Sash 0.200%
pikalytics.com
사용 스킬은 지진, hp회복, 성스로운 불꽃 그리고 브레이브버드.
칠색조 역시 썬더, 랜드로스, 솔가레오와 같이 딜탱형으로 사용되기에,
지진과 hp 회복이 겹쳐 패스하니
생각보다 구현할게 적었다.
성스로운 불꽃은 위력 100에, 화상 확률이 무려 50%인 스킬.
화상은 상대방의 공격력을 절반으로 깎으므로,
hp 회복 외에 별다른 기술 없이도 칠색조를 탱커로써 사용할 수 있게 해주는 스킬이다.
다만 화상은 옛날 옛적에 구현해놨으므로
화상 확률만 50%로 써주면 해당 스킬은 구현 끝(...)
그러면 벌써 마지막 스킬,
브레이브버드를 구현해보자
브레이브버드는 위력과 명중률이 뛰어나지만,
상대방에게 준 피해에 1/3 만큼 자신도 데미지를 입는 반동기이다.
이러한 반동 데미지는 상대방에게 데미지를 준 다음 입으므로,
역시나 데미지 계산 이후인 "부가효과" 함수에서 처리해준다.
if (a[aa][skillnumber][6] == "반동") { cout << a[aa][0][0] << s1(a, aa) << "반동 데미지를 입었다! ("; bandong = damage / stoi(a[aa][skillnumber][7]); //스킬 반동으로 인한 데미지는 스킬의 반동 수치에 따라 결정 if (bandong >= alife[aa]) { bandong = alife[aa]; } //반동 데미지가 현재 체력보다 높을경우 현재 체력만큼 데미지 cout << alife[aa] << "-" << bandong << "="; alife[aa] -= bandong; cout << alife[aa] << ") \n"; if (alife[aa] <= 0) { cout << alife[aa] << s1(a, aa) << "쓰러졌다!"; bt[1] = -1; return; //받아야할 반동 데미지가 2개라 해도 //이전 반동데미지로 기절했을 경우 다음 반동 데미지는 발동하지 않으므로, //기절시 바로 return하는 파트를 각 반동 파트마다 작성해준다. } }
공격시 공격측이 데미지를 받는 경우는
반동기, 울멧, 생구 3가지 경우가 있다.
이미 구현해놓은 해당 코드를 복사해서 살짝 수정해주면 끝.
주의할 점이라면 이렇게 데미지를 받는 경우는 3가지이고,
이 3가지 경우는 전부 중복이 가능하다.
(생구 어태커가 반동기로 울맷 포켓몬을 공격한 경우)
이때 첫번째로 울멧 데미지를 받고 기절한 경우
그 다음의 반동기 데미지와 생구 데미지는 이미 기절했으므로 받지 않는다.
그러므로 반동 데미지로 체력이 0 이하가 됐으면
바로 "ㅇㅇ는 쓰러졌다!" 라는 텍스트를 출력하고 바로 return 하여 함수를 종료한다.
그러면 반동기 역시 간단하게 구현 완료
칠색조가 주로 채용하는 아이템은 통굽부츠이다.
이는 필드의 설치기를 무시하는 효과로,
스텔스록, 압정뿌리기, 독압정 등의 효과를 무시한다.
스텔스록은 상대 필드를 스텔스록 상태로 만들어서,
상대가 교체할때마다 상대방 체력의 1/8만큼 데미지를 준다.
그렇기에 스텔스록을 깐 뒤 상대방의 교체를 유도하는 플레이도 자주 보이곤 한다.
그리고 이 스텔스록은 바위타입인데, 이게 상성이 적용된다
칠색조의 타입은 불꽃, 비행으로 바위 타입에 4배 약점이고,
즉 칠색조는 스텔스록 한방에 체력 절반의 데미지를 입는다!
더군다나 칠색조의 특성은 "재생력"으로
교체하여 나올때마다 체력이 1/3 회복된다.
교체를 압박하는 스텔스록과는 정말로 극상성이고,
그렇기에 칠색조는 보통 스텔스록을 필두로 필드 설치기를 무시하는 통굽부츠를 주로 채용한다.
문제가 있다면
아직 스텔스록을 쓰는 포켓몬을 구현 안해서(...)
일단 아이템만 추가해놨다.그렇게 아이템도 구현할게 없고
마지막으로 방금 말한 칠색조의 특성, "재생력"을 구현해야한다.
구현 자체는 쉽다.
교체할때마다 체력을 1/3 회복하면 된다.
정확히는 교체해서 나올때 체력을 1/3 회복하는게 맞지만,
어차피 교체하면 언젠가는 나오게 되어있으므로
교체할때 회복하는거나 교체하고 나올때 회복하는거나 결과는 동일하다.
void 교체이벤트(int life[], int pp, string p[][one][two], int ps[], string s[][one][two], int ss, int k) { //특성 재생력 : 교체시 체력 1/3 회복 if (p[pp][0][12] == "재생력" && p[pp][0][11]!="메타몽") { int hill = stoi(p[pp][0][3]) / 3; //회복량은 전체 체력의 1/3 if (life[pp] + hill > stoi(p[pp][0][3])) hill = stoi(p[pp][0][3]) - life[pp]; cout << "[특성 재생력]\n"; if (k == 0) { printf("상대 "); } cout << p[pp][0][11] << "의 체력이 회복되었다! ("; cout << life[pp]; life[pp] += hill;//회복 처리 cout << "+" << hill << "=" << life[pp] << ")\n";//회복량 프린트 }
쨌든 교체할때 특성을 발동하면 되므로,
"교체 이벤트" 함수에 이를 추가해준다.
교체했을때 해당 포켓몬의 특성이 재생력이고 이름이 메타몽이 아니면,
현재 체력의 1/3을 회복.
회복한 뒤가 최대 체력보다 많으면
최대체력만큼만 회복.
여기서 "이름이 메타몽이 아니면"이란 조건이 추가로 필요한데,
재생력은 교체하여 "나올때" 체력이 회복되는 특성이고,
메타몽은 "교체하면" 특성이 원래대로 돌아온다.
즉 메타몽이 칠색조의 특성 재생력을 배껴도
교체했을때 체력이 회복되지 않는다.
이를 구현하기 위해 이름이 메타몽이 아닐것이란 조건을 추가해준다.
칠색조 구현도 금방 끝난것같지만,
사실 "교체"함수는 이때 새롭게 바꾼것이다.
원래 "교체" 함수는 "기절" 함수로
포켓몬이 기절했을때 다른 포켓몬으로 교체하는 과정을 담당했다만
이 재생력 특성은 교체했을때만 발동하는 특성이므로, 이를 구현할만한 함수가 없었고,
이를 해결할겸 그리고
기절 외에도 교체하는 경우를 하나의 함수로 처리할 겸
"기절" 함수를 "교체" 함수로 수정하였다.
자세한 이야기는
https://khs20010327.tistory.com/22
"교체" 함수 구현
배틀 시스템의 기초가 되는 대부분의 함수는 설명이 끝났다. 딱 하나 남았는데, 바로 "교체" 함수이다. 처음에 교체 함수는 교체가 아니라 "기절" 함수였다. 포켓몬을 교체하는 순간은 크게 3가지
khs20010327.tistory.com
옛날에 썼었으니 참고
구현 완료된 모습
'포켓몬 배틀 구현' 카테고리의 다른 글
열다섯번째 포켓몬, 맘모꾸리 구현 (연속기) (0) 2022.03.25 열네번째 포켓몬, 폴리곤2 구현 (속임수, 스피드 비교) (0) 2022.03.23 열두번째 포켓몬, 따라큐 구현 (특성 탈) (0) 2022.03.23 열한번째 포켓몬, 솔가레오 구현 (틀깨기, 약점보험) (0) 2022.03.23 열번째 포켓몬, 누오 구현 (방어) (0) 2022.03.23