전투

아래 규칙과 수치는 원작 실행 파일이 실제로 하는 계산에서 읽었습니다. 코드가 이름을 남기지 않은 자리는 지어내지 않고 확인된 데까지만 적습니다.

전투는 라운드로 돌지 않습니다

차례가 한 바퀴씩 도는 방식이 아니라, 모두가 각자의 행동 게이지를 채우다가 20에 닿은 쪽이 행동합니다. 한 바퀴는 이렇게 돕니다.

  1. 게이지 누적 — 파티와 적 전원의 게이지가 각자의 행동력만큼 늘어납니다. 상태이상의 남은 횟수도 이때 함께 1씩 줄어듭니다. 즉 상태이상의 지속은 행동 횟수가 아니라 이 누적 횟수로 셉니다.
  2. 행동할 쪽 고르기 — 게이지가 20 이상인 액터 중 게이지가 가장 큰 쪽입니다. 값이 같으면 나중에 검사된 쪽이 이기고, 적이 파티보다 나중에 검사됩니다.
  3. 행동 — 독에 걸려 있으면 행동에 들어가기 전에 독 피해부터 받습니다. 파티는 명령 입력을, 적은 AI가 고른 기술을 실행합니다.
  4. 20 차감 — 행동한 액터의 게이지에서 20을 빼고, 남은 값은 이월됩니다.
  5. 다시 2번으로 — 아직 20 이상인 액터가 남아 있으면 게이지를 더 채우지 않고 그 액터가 곧바로 이어서 행동합니다. 아무도 없을 때만 잠깐 쉬었다가 1번으로 돌아갑니다.

그래서 행동력이 40 이상인 적은 한 바퀴에 두 번 행동합니다. 그런 몬스터가 5종 있습니다. 적이 전투에 들어설 때 게이지는 0이 아니라 난수로 0~19 사이에서 출발하므로, 같은 구성이라도 누가 먼저 움직이는지는 전투마다 달라집니다.

행동력이 곧 빠르기입니다

게이지 증가량은 상태창에 있는 행동력(AP) 그 값입니다. 그리고 행동력은 레벨을 올려도 오르지 않습니다 — 원작의 레벨업 증가량 표에는 최대 HP·최대 MP·공격·방어 네 칸밖에 없습니다. 파티의 빠르기는 1레벨에 정해진 채로 끝까지 가고, 장비와 상태이상만이 그것을 흔듭니다.

몬스터 쪽 행동력도 같은 값이고, 개발 워크북이 부르는 이름도 AP로 같습니다. 같은 몬스터라도 레벨 변형끼리 다를 수 있어 이름마다 가장 빠른 기록을 실었습니다. 다만 복면남자만 상태창에 23으로 나오고 전투는 22로 씁니다. 원작이 이 칸을 두 벌 들고 있는 탓이며, 위 표는 상태창 값입니다.

게이지를 흔드는 것들

  • — 증가량이 ×3/4로 줄어듭니다. 행동 순서가 밀리는 것과 HP가 깎이는 것을 함께 겪습니다.
  • 수면 · 마비 · 전투불능 — 증가량이 0이라 게이지가 아예 멈춥니다.
  • 고장난 시계 — 증가량이 난수 % (행동력 × 2)가 됩니다. 평균은 거의 그대로인데 편차만 커지는 셈이라, "행동수치가 들쭉날쭉"이라는 원작 설명 그대로입니다.
  • 열받는 스카프 · 피의 방패 — 같은 처리에서 SG 카운터를 한 칸씩 더 올립니다. 기본이 한 바퀴에 1이니 둘 다 갖추면 3배입니다. 카운터 상한은 16이고, 스킬의 SG 소모 최대값도 정확히 16입니다.

세 장비는 이름이 아니라 아이템 번호로 걸립니다. 게이지를 채우는 처리가 그 번호 셋을 직접 물어보므로, 같은 효과의 다른 장비는 없습니다.

해당 장비 고장난 시계 열받는 스카프 피의 방패

명중과 피해

공격 한 번은 명중 판정, 치명 판정, 피해 계산 순으로 끝납니다. 세 판정 모두 0x44e7e5 한 함수 안에 있고, 거기서 방향 관계·속성 상성·수치 자르기를 불러 씁니다. 아래 식은 그 함수를 직접 읽은 것입니다.

명중률 = clamp(80 + 내 레벨 / 3 + 방향 보정 + 상태 보정
              − 적 회피 − 적 행운 + 내 행운, 10, 90)
난수 % 101 ≥ 명중률  →  빗나감

명중률은 양쪽이 같은 식입니다. 파티 쪽만 더 잘 맞는 구조가 아니고, 기준값도 자르는 구간도 하나뿐입니다. 적의 "회피"는 몬스터 레코드 +0x30의, 몬스터 페이지에 이름이 없는 칸입니다.

파티가 때릴 때

기본값 = 내 공격 − 적 방어
기본값 < 5 이면 난수 % 5 + 1

피해 = (난수 % 40 + 80) × 기본값 / 100
       × 상성 % / 100
       × (파워 삼바면 150) / 100
       × 방향 배율 / 100
       × (치명타면 2)
       × 칸 가중치 / 8

치명 = 난수 % 101 < 내 레벨 + 내 행운
                    − 적 행운 + 5

적이 때릴 때

기본값 = 적 공격 − 내 방어
기본값 < 5 이면 난수 % 5 + 1

피해 = (난수 % 40 + 40 + (치명타면 30))
       × 기본값 / 100
       × (데미지 가드면 70) / 100
       × 상성 % / 100

치명 = 난수 % 10 == 0   (고정 10%)

방향 배율은 들어가지 않습니다.

양쪽 다 공격에서 방어를 통째로 뺍니다. 기술의 위력은 이 자리에 들어가지 않고, 난수항도 하나뿐입니다. 5 미만으로 떨어지면 난수 % 5 + 1이 대신 들어가므로, 방어가 공격보다 높은 상대에게도 최소한의 피해는 남습니다. 속성을 가진 공격만 상성표를 보고, 나머지는 100을 씁니다. 피해와 회복 수치는 마지막에 1,058,575에서 잘립니다.

읽은 능력치 칸도 적어 둡니다. 파티 레코드 +0x28 레벨 · +0x64 공격 · +0x68 방어 · +0x6c 행운, 몬스터 레코드 +0x30 회피 · +0x34 공격 · +0x38 방어 · +0x3c 행운입니다. 파티와 몬스터 모두 레코드의 두 번째 능력치 묶음, 즉 턴 게이지가 AP를 읽는 +0x70과 같은 줄에 있는 값이 실제로 쓰입니다. tools/wiki/verify_battle_damage.py가 이 식들을 원본 명령어와 대조합니다.

등을 잡으면

공격자와 대상의 좌표 차이를 대상이 보고 있는 방향 기준으로 돌려서 0~4의 관계 값을 얻습니다. 정면이 0, 등 뒤가 4쪽입니다.

관계01234
명중 보정+0+8+15+23+30
피해 배율100%110%120%135%150%

속성 상성

공격과 대상의 속성 니블을 5×5 표로 맞춰 50%, 100%, 170% 중 하나를 씁니다. 네 속성이 고리처럼 물려 있어, 같은 상대에게 유리한 속성은 반대쪽 하나에 불리합니다.

반격은 별도의 3×5 표입니다. 같은 관계 값에서 위쪽 줄은 30~20%, 가운데는 20~10%, 아래쪽은 10~1%로, 등을 잡을수록 반격을 덜 맞습니다.

상태이상이 걸리는지는 난수 % 100 < 확률로 정합니다. 다만 공격하는 쪽에 행운의 행진이 걸려 있으면 기술이 가진 상태 대신 무엇이 걸릴지까지 무작위로 뽑습니다. 이미 걸려 있는 상태는 후보에서 빠집니다.

난수는 하나의 줄에서 나옵니다

난수는 곱셈 하나와 덧셈 하나로 다음 값을 만드는 고전적인 방식이고, 씨앗은 메모리 한 칸에 삽니다.

씨앗 = 씨앗 × 214013 + 2531011
난수 = (씨앗 >> 16) & 0x7FFF

첫 씨앗은 게임을 시작한 순간의 시스템 시간입니다. 같은 조작을 같은 순서로 반복해도 전투 결과가 판마다 달라지는 이유입니다. 더 중요한 것은 이 줄이 하나뿐이라는 점입니다. 명중·치명·상태이상·드롭 판정만 쓰는 게 아니라 NPC가 몇 칸 걸을지, 파편이 어디로 튈지, 화면 전환의 흩뿌림까지 같은 줄에서 차례로 뽑아 씁니다. 앞에서 연출이 난수를 몇 개 썼는지가 다음 판정을 그대로 밀어 놓습니다.

이벤트 스크립트가 쓰는 난수만 이것과 다른 두 번째 줄이고, 전투 판정과 섞이지 않습니다.

전투가 끝나면

쓰러뜨린 몬스터의 경험치와 돈을 모두 더한 다음, 두 합계에 각각 × 145 / 100을 합니다. 몬스터 페이지의 숫자가 그대로 들어오는 값이 아니라는 뜻입니다. 드롭은 같은 자리에서 몬스터마다 따로 굴리며 난수 % 1000 < 드롭 확률이라, 확률은 1000분율이고 1000이면 확정입니다.

상태이상과 방어 장비

지속 수치는 원작 상태 갱신의 기본 카운트입니다. 실제 해제 시점은 부여·갱신 순서에 따라 달라질 수 있습니다. 무엇을 걸 수 있는지는 공격 플래그의 8~12비트가 정합니다.아군 스킬에는 그 비트가 하나도 없어, 상태이상을 거는 쪽은 무기와 몬스터 기술입니다.

독 · 기본 4회

독 피해 처리 시 현재 HP의 1/4을 잃고, 행동 게이지 증가량이 3/4로 줄어듭니다.

거는 무기 자청수 에인션트 보우 스톰 로드

거는 몬스터 기술 포이즌 리퀴드위력 50 포이즌 미스트위력 80 와라 프레이그(What a plague!)위력 20 포이즌위력 50· 2개 기록 독 마법위력 50

방어 가능한 장비 10개

수면 · 기본 3회

행동할 수 없고 행동 게이지가 증가하지 않습니다.

거는 무기 금강탁 라이트 로드

거는 몬스터 기술 와라 프레이그(What a plague!)위력 20 슬립위력 50· 5개 기록 지루한 만화영화 어택위력 50

방어 가능한 장비 10개

침묵 · 기본 3회

몬스터의 일부 기술 선택을 제한합니다. 아군의 명령 제한은 같은 규칙으로 확인되지 않았습니다.

거는 무기 매직 로드

거는 몬스터 기술 싸일런스위력 50 와라 프레이그(What a plague!)위력 20 사일런스위력 50· 4개 기록

방어 가능한 장비 14개

마비 · 기본 2회

행동할 수 없고 행동 게이지가 증가하지 않습니다.

거는 무기 텅스텐 기타 아이스 로드 실크 로드 예스마이 로드

거는 몬스터 기술 울트라 파라라이즈위력 50 파라라이즈위력 50· 5개 기록 전기 충격위력 150 와라 프레이그(What a plague!)위력 20

방어 가능한 장비 10개

저주 · 기본 3회

명중 보정이 10 감소합니다.

거는 무기 염라도 X 기타 썬더 로드

거는 몬스터 기술 커즈위력 50· 3개 기록 와라 프레이그(What a plague!)위력 20

방어 가능한 장비 10개

이로운 상태

같은 상태 워드의 위쪽 비트이고, 상태창도 같은 시트의 옆칸을 씁니다. 거는 쪽은 스킬의 연출 루틴 주소가 복원된 코어의 이름 붙은 핸들러와 일치하는 경우에만 적었습니다.

행운의 행진 0x2000

명중 보정이 10 늘어납니다. 저주의 반대쪽으로, 같은 두 비트를 함께 읽어 판정합니다.

거는 스킬 럭키 마치

데미지 가드 0x4000

상태창에 표시되는 자리는 확인했지만, 거는 쪽과 계산식은 해독된 코드에서 확인되지 않았습니다.

반사 0x8000

마찬가지로 표시 자리만 확인했습니다. 반격 처리의 반사 플래그는 이것과 다른 값입니다.

파워 삼바 0x10000

원작 설명은 "공격력을 올려준다"입니다. 증가폭은 해독된 코드에 드러나 있지 않습니다.

거는 스킬 파워 삼바

힙합 0x20000

원작 설명은 "불타는 힙합으로 몸을 지키자"입니다. 수치는 마찬가지로 확인되지 않았습니다.

거는 스킬 정열의 힙합

네 격투장

서주 격투장

접수 공간과 전투장이 서로 다른 맵입니다.

남주 격투장

접수 공간과 전투장이 서로 다른 맵입니다.

서쪽 마탑 비밀격투장

서쪽 마탑 7층의 숨겨진 입구로 연결됩니다. 조사 대상 타일은 (4, 17)입니다.

동쪽 마탑 비밀격투장

동쪽 마탑 6층의 숨겨진 입구로 연결됩니다. 조사 대상 타일은 (6, 22)입니다.

두 비밀격투장은 내부 맵을 공유하지만 입장 경로와 귀환 층이 다릅니다. 입구는 진행 상태와 지형 변화의 영향을 받습니다.