-
일곱번째 포켓몬, 우라오스 구현 (카운터)포켓몬 배틀 구현 2022. 3. 17. 01:48
어느덧 일곱번쨰 포켓몬, 우라오스 차례다.
https://pikalytics.com/pokedex/homebss/urshifu
Urshifu Series 12 Battle Stadium Singles Stats Pokédex | Pokémon | Pikalytics
Focus Sash 49.800% Choice Band 41.900% Choice Scarf 5.600% Life Orb 1.400% Assault Vest 0.800% Lum Berry 0.200% Expert Belt 0.200% Muscle Band 0.000% Eject Pack 0.000% Black Glasses 0.000%
pikalytics.com
우라오스의 경우 통계 순서대로
암흑강타, 인파이트, 기습, 카운터를 채용하였다.
인파이트는 자시안에서,
기습은 에이스번에서 구현하였으니 패스하고,
암흑강타는 "무조건" 급소에 맞는 기술로
개사기 스킬중 하나이다.
int gs = rand() % 16; //급소 카운터. gs는 0부터 15이며 gs가 0일경우 (=1/16 확률) 데미지 2배 if (a[aa][number][0] == "섀도크루" && (gs == 0 || gs == 1)) { gs = 2; } //섀도크루는 급소 확률이 2배 else if (gs == 0 || a[aa][number][0] == "암흑강타") { gs = 2; } //암흑강타는 급소 확정 else gs = 1;
급소의 경우 "공격스킬" 함수에 구현해놨는데,
1/16 확률로 급소가 터지므로
gs = rand() % 16, 즉 0부터 15의 값중 하나이고
해당 값이 0이면 급소에 맞은것으로 처리한다.
else if (gs == 0 || a[aa][number][0] == "암흑강타") { gs = 2; } //암흑강타는 급소 확정
여기서 조건을 해당 값이 0이거나 사용한 스킬 이름이 "암흑강타"이면 급소에 맞은것으로 조건을 바꾸면
암흑강타 구현 완료!
그리고
급소에 맞으면 데미지가 2배가 되고,
공격측의 공격력 랭크다운과 방어측의 방어력 랭크 업,
즉 데미지를 저하시키는 모든 랭크변화를 무시한다.
찬찬히 뜯어보니 더 개사기 스킬이네
if (gs == 2) { if(dfs > stoi(b[bb][11][mt + 6])) //맞는 쪽의 현재 방어력이 원래 방어력보다 높은 경우 = 방어력이 랭크업한 경우 dfs = stoi(b[bb][11][mt + 6]); if (atk < stoi(a[aa][11][tm + 6]))//공격한 쪽의 현재 공격력이 원래 공격력보다 높은 경우 = 공격력이 랭크다운한 경우 atk = stoi(a[aa][11][tm + 6]); }
이 역시 "공격스킬" 함수에 구현해놨다.
https://khs20010327.tistory.com/20
"공격 스킬" 함수의 구현
저번 글의 "명중"함수로 사용한 스킬이 성공하였는지 실패하였는지 확인하였다면, 이번엔 스킬이 명중한 이후를 다룬 "공격스킬" 함수에 대해 알아보겠다. 공격스킬은 적에게 데미지를 주는 스
khs20010327.tistory.com
더 자세한 설명은 해당 글 참고
순식간에 기술 3개가 구현 완료되었지만,
마지막 스킬 카운터가 그 이상으로 시간을 잡아먹어줬다 ^p^
카운터는 상대방에게 받은 "물리"기술의 데미지를 "2배로 만들어" 되돌려주는 기술이다.
상대방의 공격이 나의 공격에 영향을 미치는 몇 안되는 기술중 하나이다.
처음에 이를 어떻게 구현해야하나 막막했는데...
선공이든 후공이든 결국엔
명중 -> 공격스킬 -> 위력증감, 부가효과 의 함수를 거친다.
둘의 차이는 인자로 플레이어의 배열을 먼저 넣나 cpu의 배열을 먼저 넣나 그 뿐이다.
일단 dmg[]라는 배열을 각 함수에 인자로 추가한다.
그냥 기존의 bt[]나 ps[]배열을 사용해도 됐는데, 귀찮게 새로 추가했다. 까비
if (a[aa][number][5] == "물리" && a[aa][number][0] != "카운터") { dmg[0] = damage; dmg[1] = 1; }
"공격 스킬" 함수에서
선공측이 사용한 스킬이 카운터가 아닌 물리 기술이면,
해당 기술의 데미지를 dmg[0]에, 그리고 dmg[1]에 1이란 값을 넣는다
if (a[aa][number][0] == "카운터") { if (dmg[1] == 1) damage = dmg[0] * 2; else damage = 0; }
이후 후공측에서 사용한 기술 이름이 "카운터"일때
dmg[1]이 1이면 상대방이 카운터가 아닌 물리 기술을 사용한 것이므로 카운터가 성공,
데미지는 상대방에게 입은 데미지 dmg[0]의 2배이다.
아니라면 실패한것이므로 데미지는 0이다.
선공이든 후공이든 같은 함수를 사용하므로
한 함수에 값을 전달하는 부분과 값을 전달받는 부분을 따로 만들어
따로 사용하는게 생각보다 헷갈렸지만 나름 재밌는 구현이였다.
마지막으로 우라오스의 특성은 "보이지않는주먹"으로
방어와 같은 기술들을 무시한다.
문제는 방어가 아직 구현이 안되어있다...
우라오스의 특성은 방어를 구현할때 같이 구현하기로 하고,
우라오스 구현은 여기서 끝!
구현 완료된 모습.
'포켓몬 배틀 구현' 카테고리의 다른 글
열번째 포켓몬, 누오 구현 (방어) (0) 2022.03.23 여덟, 아홉번째 포켓몬 이벨타르 & 흑마렉스 구현 (흡혈) (0) 2022.03.23 여섯번째 포켓몬, 가이오가 구현 (스카프, 얼음) (0) 2022.03.17 다섯번째 포켓몬, 메타몽 구현 (변신) (0) 2022.03.16 네번째 포켓몬, 랜드로스 구현 (유턴) (0) 2022.03.16