스크랩

HP 32,000의 최종보스를 '회복'시켜 잡는다 — Chrono Trigger 정수 오버플로 공략

HP 32,000의 최종보스를 '회복'시켜 잡는다 — Chrono Trigger 정수 오버플로 공략

한 줄 요약

『Chrono Trigger』 DS판 이후에 등장하는 선택형 슈퍼보스 Dream Devourer는, 데미지를 주는 대신 회복시켜서 쓰러뜨릴 수 있습니다. 이 보스의 최대 HP가 32,000이고, 부호 있는 16비트 정수의 최댓값이 32,767이라는 점을 이용한 공략입니다.

왜 회복시키면 죽을까?

고전 콘솔 게임은 메모리를 아끼기 위해 HP 같은 수치를 16비트 정수에 담는 경우가 많았습니다. 부호 있는(signed) 16비트 정수의 표현 범위는 -32,768 ~ 32,767입니다.

  • Dream Devourer의 HP는 32,000 — 상한선인 32,767과 불과 767 차이
  • 2단계에서 이 보스는 모든 속성을 흡수합니다. 즉 마법 공격이 회복으로 바뀝니다
  • 강력한 마법을 퍼부어 HP를 32,767 위로 밀어 올리면, 카운터가 한 바퀴 돌아 음수가 됩니다
  • 게임은 "HP가 0 이하"를 사망 판정으로 쓰기 때문에, 그대로 전투가 끝납니다

체력을 채워주는 행위가 곧 즉사기가 되는, 전형적인 정수 오버플로(integer overflow) 버그입니다. 요즘 코드로 치면 int16 덧셈에 상한 클램프(saturation)를 걸지 않은 셈이죠.

정공법: 2단계 구조를 이해하기

오버플로가 아니라 정직하게 잡으려면, 단계별로 공격 방식을 정반대로 바꿔야 합니다.

1단계 — 마법으로 밀어붙이기

  • 모든 물리 공격에 Mana Reaper로 반격, 파티원 한 명의 MP를 통째로 날립니다
  • 따라서 이 구간은 Luminaire, Flare, Electrocute 같은 마법과 합동 기술 Antipode Bomb III가 주력
  • 보스가 상태 이상 면역을 무효화할 수 있으므로, 최대한 빨리 넘기는 것이 정답
  • Lavos Core처럼 방어력을 올리는 모션이 나오면 2단계 진입 신호

2단계 — 마법 금지, 비마법 기술만

  • 모든 속성을 흡수하므로 마법은 곧 회복. 여기서는 Cleave, Frenzy, Triple Kick 같은 비마법 기술로 전환
  • 모든 공격에 Chaos Zone으로 반격해 혼란을 유발 → Prismatic Helm, Master's Crown, Angel's Tiara 등 상태 이상 면역 장비 필수
  • Chaos Zone은 전체에 200~300 피해를 주므로 HP를 넉넉히 유지
  • Phantasm, The End of All and Nothing은 1,000 이상의 피해로 파티원을 즉사시킬 수 있음 → 방어력을 최대로 올리거나, 아예 속전속결
  • 파티가 무너지기 시작하면 3인 합동 기술 Life Line이 복구용으로 유효

슈퍼보스전인 만큼 Megalixir와 부활 아이템은 아끼지 않는 편이 낫습니다.

더 빠른 길: 9,999 고정 피해

  • Dimensional Vortex를 완료한 뒤 Robo에게 Apocalypse Arm + Dragon's Tear를 장착하면 9,999 고정 피해 → 3~4턴 클리어
  • Ayla도 레벨 96에서 자동 습득하는 Bronze Fist로 같은 전법이 가능

즉 이 보스는 "정석 2단계 공략 / 고정 피해 속공 / 회복 오버플로"라는 세 가지 완전히 다른 해법이 공존하는, 꽤 독특한 설계입니다.

스토리상의 위치

Dream Devourer는 DS판 이후 추가된 Darkness At The End Of Time의 선택형 슈퍼보스로, Schala와 Lavos가 Time Devourer가 되기 전의 중간 진화 단계입니다. 시간을 가로질러 생각과 기억, 꿈을 먹어 치우는 존재죠.

Magus는 Schala를 구하러 오지만 실패합니다. 잠시 의식을 되찾은 Schala는 "어떤 힘으로도 나를 구할 수 없다"며, Dream Devourer가 모든 것을 파괴하기 전에 다른 삶을 살라고 말합니다. 반발하던 Magus는 결국 쫓겨나고, Schala의 운명론과 그 처지 앞에서 절망한 끝에 자신의 정체성마저 버리게 됩니다.

참고로 전투 테마는 그 유명한 World Revolution입니다.

개발자 관점에서의 교훈

이 버그는 단순한 게임 트리비아로 넘기기엔 아까운 사례입니다.

  • 경계값은 데이터 설계 단계에서 이미 결정된다: HP 32,000은 32,767이라는 타입 경계 바로 아래입니다. 회복 로직이 존재하는 이상, 767의 여유는 사실상 없는 것과 같았습니다
  • 회복도 산술 연산이다: 데미지 계산에는 하한 체크를 넣으면서 회복에는 상한 체크를 빠뜨리는 실수는 지금도 흔합니다
  • "흡수" 같은 예외 규칙은 부호를 뒤집는다: 공격을 회복으로 변환하는 메커니즘은 값의 방향 자체를 바꾸므로, 별도의 클램프가 필요합니다

오늘날이라면 min(hp + heal, maxHp) 한 줄, 혹은 애초에 32비트 타입을 쓰는 것으로 끝났을 문제입니다. 하지만 메모리 한 바이트가 귀하던 시절의 제약이 30년 가까이 지난 지금까지 플레이어들의 공략 루트로 남아 있다는 점이 흥미롭습니다.


원문: https://news.hada.io/topic?id=33988