POB가 아이템을 인식하는 방식
붙여넣은 아이템에서 Path of Building 이 실제로 보는 줄은 정해져 있습니다. 어느 줄이 틀리면 무엇이 깨지는지 정리합니다.
Path of Building 에 아이템을 붙여넣었는데 인식되지 않을 때가 있습니다. 어떤 줄은 한글이 남아 있어도 멀쩡히 들어가고, 어떤 줄 하나 때문에 아이템 전체가 안 잡힙니다.
POB 의 아이템 파서(Classes/Item.lua)를 읽어 보면 기준이 분명합니다.
위에서부터 순서대로 읽습니다
POB 는 붙여넣은 텍스트를 첫 줄부터 훑으면서 상태를 바꿔 갑니다.
1. Item Class: 로 시작하면 건너뜁니다.
if self.rawLines[l]:match("^Item Class:") then
읽기는 하지만 쓰지는 않습니다. 주석에 이유가 적혀 있습니다 — 아이템 종류는 베이스타입에서 이미 결정되기 때문입니다. 이 줄은 한글로 남아 있어도 아무 문제가 없습니다.
2. Rarity: 에서 등급을 잡습니다.
local rarity = self.rawLines[l]:match("^Rarity: (%a+)")
Rarity: 뒤의 영문 단어 하나를 봅니다. 여기가 아이템 희귀도: 희귀 로 남아 있으면
패턴이 맞지 않아 등급을 잡지 못합니다.
등급을 못 잡으면 다음 단계가 통째로 어긋납니다. 뒤에 나올 이름과 베이스타입을 몇 줄로 볼지가 등급에 따라 달라지기 때문입니다.
3. 이름과 베이스타입.
Rarity: 다음 줄부터가 이름입니다. 그런데 등급에 따라 줄 수가 다릅니다.
if not (self.rarity == "NORMAL" or self.rarity == "MAGIC" or unidentified) then
l = l + 1
end
희귀·고유 아이템은 이름 한 줄 + 베이스타입 한 줄, 총 두 줄입니다.
일반·마법 아이템과 미감정 아이템은 한 줄입니다. 마법 아이템은 이름 자체가
접두 + 베이스타입 + 접미 형태라 이름 줄이 곧 베이스타입 줄이기도 합니다.
여기가 가장 중요합니다. POB 는 베이스타입 문자열로 아이템의 종류·기본 수치· 장착 부위를 전부 판정합니다. 이 줄이 한글로 남아 있으면 아이템이 통째로 인식되지 않습니다.
이름: 값 형태의 줄
구분선 아래로는 이름: 값 형태의 줄들이 나옵니다. POB 는 이걸 세 갈래로 처리합니다.
쓰는 것 — 실제로 계산에 반영합니다.
Armour / Evasion Rating / Evasion / Energy Shield / Ward
Str / Strength / Dex / Dexterity / Int / Intelligence
Quality / Sockets / Item Level / Note / Implicits
무시하는 것 — 인식은 하되 버립니다. 어차피 베이스타입과 옵션으로 다시 계산하기 때문입니다.
Critical Strike Range / Attacks per Second / Weapon Range
Critical Strike Chance / Physical Damage / Elemental Damage
Chaos Damage / Chance to Block / Block chance
Armour / Energy Shield / Evasion
나머지 전부 — 옵션으로 간주합니다. 소스의 주석이 직설적입니다.
-- Anything else is an explicit with a colon in it
이 구조가 만드는 결과
여기서 실제로 겪게 되는 일들이 나옵니다.
대소문자와 철자가 정확해야 합니다. POB 는 이 이름들을 문자열로 정확히 비교합니다.
Attacks per Second 를 Attacks per second 로 쓰면 목록에 걸리지 않고, 위 규칙에 따라
옵션 줄로 잘못 분류됩니다. 존재하지 않는 옵션이 하나 생기는 셈입니다.
실제로 이 프로젝트에서도 같은 실수를 했습니다. 번역 사전에서 가져온 값이 소문자
second 였고, 그대로 내보내다가 무기 속성 줄이 옵션으로 새는 것을 뒤늦게 발견했습니다.
콜론이 든 옵션은 그대로 통과합니다. 일부 고유 아이템에는 콜론이 들어간 옵션이
있는데(Fortress Covenant, Pure Talent 등), POB 는 이것들을 따로 예외 처리하지 않고
“목록에 없으면 옵션” 규칙으로 자연스럽게 처리합니다.
구분선은 블록을 나눕니다. -------- 여덟 개입니다. 내재 옵션과 일반 옵션을
가르는 것이 이 구분선이라, 임의로 지우거나 합치면 옵션의 성격이 바뀝니다.
그래서 무엇을 확인해야 하나
아이템 변환기 결과에 한글이 남았을 때, 어느 줄인지에 따라 대응이 다릅니다.
| 줄 | 한글로 남으면 |
|---|---|
Item Class: |
무해합니다. 그대로 두셔도 됩니다 |
Rarity: |
등급을 못 잡고 이름·베이스타입 판정이 어긋납니다 |
| 베이스타입 | 아이템이 인식되지 않습니다 |
| 옵션 줄 | 그 줄만 빠집니다. 나머지는 정상입니다 |
| 속성 줄 | 대부분 무시되는 값이라 영향이 없습니다 |
정리하면 Rarity: 와 베이스타입 두 줄만 확인하면 됩니다. 이 둘이 영문으로 제대로
나왔다면 나머지에 한글이 조금 남아 있어도 아이템은 들어갑니다. 빠진 옵션은 POB 에서
직접 추가하는 편이 빠릅니다.
변환기가 이 두 줄을 특별히 신경 써서 처리하는 이유이기도 합니다. 베이스타입은 마법 아이템 이름에서 접두·접미를 떼어내서라도 복원하고, 복원한 경우에는 결과에 표시를 남깁니다.