캐스팅이 되고 나서 붙인 것이 입질과 파이팅입니다. 걸린 뒤의 실랑이가 낚시 게임의 본체입니다.

입질은 누르기가 아니라 읽기입니다

입질을 "찌가 움직이면 버튼"으로 만들면 반응 속도 게임이 됩니다. 단계마다 실패할 수 있는 순서로 만들었습니다.

흥미 → 접근 → 전 입질(탭) → 본 입질(홀드) → 홀드 중 챔질.

핵심은 탭이 0.12~0.28초로 짧다는 것입니다. 거기서 채면 물고기가 놀라서 18초 동안 근처에도 안 옵니다. 그러니 움직임이 있다고 바로 누르면 안 되고, 짧은 것과 긴 것을 구분해야 합니다. 누르기가 아니라 읽기가 됩니다.

유인력의 세기는 감으로 잡지 않고 평형점으로 잡았습니다. 무리의 응집력이 미터당 0.22이고 루어에 붙은 개체는 무리 중심에서 보통 17m 떨어져 있으니 3.7쯤으로 당겨집니다. 그 균형점이 판정 범위인 2m 안에 들어오도록 이득을 정했습니다.

이러면 루어 품질이 0.2일 때 균형점이 4m가 되어 구경만 하고 안 뭅니다. 그 기울기 자체가 설계 의도라, 이 숫자는 난이도 손잡이가 아닙니다.

드랙이 텐션의 상한입니다

파이팅의 규칙은 결국 한 줄입니다.

미끄러지는 클러치는 설정값 이상을 전달하지 못합니다. 그러니 드랙보다 센 물고기는 줄을 끊지 않고 줄을 가져갑니다. 상한을 넘을 수 있는 건 줄의 신축이 잠깐 저장한 충격뿐이고, 그 크기는 줄 종류가 정합니다.

여기서 지는 방법 둘이 서로 반대 방향으로 갈라져 나옵니다.

  • 줄 터짐 — 드랙을 너무 세게 잠갔을 때
  • 바늘 빠짐 — 하중이 구멍을 벌리거나, 줄이 늘어져 빠질 때

드랙을 조이면 첫 번째로 지고, 풀면 두 번째로 집니다. 어느 쪽으로도 안전한 설정이 없다는 것이 이 게임의 긴장입니다.

HUD의 텐션 게이지에 드랙 설정 위치를 1px 마커로 표시한 것도 그래서입니다. 그 간격이 곧 파이팅입니다.

실측이 잡아낸 오류 다섯

튜닝하면서 고친 것들입니다. 전부 숫자를 재고 나서야 알았습니다.

힘이 질량에 비례했습니다. 260kg 상어가 144kgf로 끌었습니다. 실제로는 큰 동물일수록 체중 대비 약하게 끕니다. 지수를 0.7로 낮추니 27kgf가 됐습니다.

클러치를 "나중에 초과분을 빼는" 방식으로 짰습니다. 그래서 텐션이 먼저 치솟고 나중에 깎였습니다. 20lb 줄이 0.1초 만에 끊겼습니다. 상한을 즉시 적용하고, 넘는 것은 신축이 정하는 충격만 남겼습니다.

클러치가 자기 출력을 입력으로 읽었습니다. 줄이 나가는 속도를 "텐션 초과분"에서 계산했는데, 텐션은 이미 상한에 묶여 있으니 초과분이 거의 0입니다. 30kgf 상어가 초당 0.3m를 가져갔습니다. 요구 하중 기준으로 바꾸고 물고기 유영 속도로 상한을 걸었습니다.

바늘 빠짐이 거꾸로 됐습니다. 임계를 드랙에 상대적으로 잡아서, 드랙을 낮출수록 빨리 빠졌습니다. 실제와 정반대입니다. 절대 하중 기준으로 바꾸되 물고기 힘에 비례하게 했습니다.

릴이 너무 빨라서 리트리브가 뒤집혀 있었습니다

루어는 움직이기 전까지 죽은 쇳조각입니다. 그래서 리트리브 속도가 유인력 전체를 곱하고, 최적 속도를 벗어나면 떨어지게 했습니다.

붙이고 나서 재 보니 이상했습니다.

감을 때 0.15  ·  놔둘 때 0.71

리트리브의 목적과 정반대입니다. 원인은 릴 속도가 2.4m/s인데 모든 루어의 최적 구간이 0.8~1.6이라는 것이었습니다. 감으면 전부 과속 구간으로 밀려났습니다.

릴을 1.4m/s로 낮추고 루어들을 그 주위로 재배치했습니다. 이제 릴 속도에서 포퍼 2.12, 스푼 1.64, 미노우 1.57, 지그 1.22입니다.

새 기능이 기존 상수의 값을 처음으로 검증한 경우였습니다. 릴 속도는 캐스팅 때 정한 값이고 그때는 회수 시간만 보면 됐으니 아무 문제가 없었습니다.

어종 12종은 가중치만 다릅니다

행동 네 가지에 가중치만 다르게 줍니다. 로드에서 그 물고기가 실제로 하는 짓입니다.

  • 방어 — 멈추지 않는 첫 다이빙
  • 우럭 — 구멍으로 돌아가려는 한 수
  • 붕장어 — 어디로도 안 갑니다. 줄에 몸을 감고 버티는 죽은 무게
  • 고등어 — 체력은 없고 대가리만 흔듭니다

원래 프로필이 7종뿐이라 새로 넣은 어종이 전부 열대어로 싸우고 열대어로 불렸습니다. 기본값이 조용히 먹히는 자리를 안 채워 두면, 새로 추가한 것들이 다 같은 얼굴이 됩니다.

기록표에 가짜를 넣지 않았습니다

내 기록은 세션이 이미 저장하는 잡은 목록을 그대로 읽습니다. 따로 동기화할 게 없으니 실제로 일어난 일과 어긋날 수 없습니다.

온라인 순위는 서버가 없습니다. 그럴듯한 이름과 기록을 심어 넣으면 화면은 채워지지만 플레이어가 진짜와 구별할 방법이 사라집니다. 그래서 비어 있고, 비어 있다고 그대로 말합니다. 순위를 모를 때는 숫자 대신 줄표를 씁니다 — 빈 판의 1위는 1위가 아닙니다.

나중에 서버 주소를 넣으면 그때 읽고 씁니다. 그때도 서버가 준 값은 전부 못 믿을 것으로 다룹니다. 아는 필드만 남기고 길이는 숫자로 강제한 뒤에야 비교하거나 화면에 올립니다.