https://gall.dcinside.com/civilization/265235
이걸 번역하다가 생긴 일이다. 문명 5에서 새로운 기능을 추가해주는 모드이고, 그 설명문을 생성하는 스크립트 (lua로 만듬) 에 대한 이야기다.
뭔가 해서 원본 코드를 봤더니 문제를 알 수 있었다.
-- Traits and Personalities
local eMinorTrait = string.upper(L(GetCityStateTraitText(minorPlayerID)))
local eMinorPersonality = minorPlayer:GetPersonality()
local sMinorPersonalityStr = ""
if eMinorPersonality == MinorCivPersonalityTypes.MINOR_CIV_PERSONALITY_FRIENDLY then
sMinorPersonalityStr = string.upper(L("TXT_KEY_CITY_STATE_PERSONALITY_FRIENDLY"))
elseif eMinorPersonality == MinorCivPersonalityTypes.MINOR_CIV_PERSONALITY_NEUTRAL then
sMinorPersonalityStr = string.upper(L("TXT_KEY_CITY_STATE_PERSONALITY_NEUTRAL"))
elseif eMinorPersonality == MinorCivPersonalityTypes.MINOR_CIV_PERSONALITY_HOSTILE then
sMinorPersonalityStr = string.upper(L("TXT_KEY_CITY_STATE_PERSONALITY_HOSTILE"))
end
https://forums.civfanatics.com/threads/unique-city-states.607883 v9, Lua/CityStateStatusHelper.lua line 453.
언어마다 다른 키 값을 불러와서 string.upper를 적용한 후 그대로 다른 키에 넣고 있었다.
이러면 영어에서는 어떻게 작동하겠지만 다른 언어에서는 전부 먹통이 된다. 영어에서만 쓸 거여도 문제가 심각한데, 영어 표현이 바뀌면 함수가 고장나는 거니까 이런 코드가 쌓이면 단어 하나도 맘대로 못 바꾸게 된다.
-- Traits and Personalities
local eMinorTrait = string.upper(L(GetCityStateTraitText(minorPlayerID)))
local eMinorPersonality = minorPlayer:GetPersonality()
local sMinorPersonalityStr = ""
if eMinorPersonality == MinorCivPersonalityTypes.MINOR_CIV_PERSONALITY_FRIENDLY then
sMinorPersonalityStr = "FRIENDLY"
elseif eMinorPersonality == MinorCivPersonalityTypes.MINOR_CIV_PERSONALITY_NEUTRAL then
sMinorPersonalityStr = "NEUTRAL"
elseif eMinorPersonality == MinorCivPersonalityTypes.MINOR_CIV_PERSONALITY_HOSTILE then
sMinorPersonalityStr = "HOSTILE"
end
그래서 그냥 문자를 반환하게 바꿨다.
사실 코드상으로는 이게 더 문제가 심각해 보이긴 하는데, 애초에 키를 동적으로 생성하는 게 문제다.
코드를 유심히 본 대단한 사람이 있다면, GetCityStateTraitText도 똑같은 문제를 가지고 있다는 걸 알 수 있다. GetCityStateTraitText는 다음과 같다.
function GetCityStateTraitText(minorPlayerID)
local minorPlayer = Players[minorPlayerID]
if minorPlayer then
local minorCivTraitID = minorPlayer:GetMinorCivTrait()
for key, value in pairs(MinorCivTraitTypes) do
if minorCivTraitID == value then
return L("TXT_KEY_CITY_STATE" .. key:sub(16) .. "_ADJECTIVE")
end
end
else
print("Lua error - invalid player index")
end
return ""
end
얘도 언어마다 다른 키 값을 반환하는 함수였다. 마찬가지로 그냥 문자를 반환하게 바꾸기로 했다.
function GetCityStateTraitText(minorPlayerID)
local minorPlayer = Players[minorPlayerID]
if minorPlayer then
local minorCivTraitID = minorPlayer:GetMinorCivTrait()
if minorCivTraitID == MinorCivTraitTypes.MINOR_CIV_TRAIT_CULTURED then
return "CULTURED"
end
if minorCivTraitID == MinorCivTraitTypes.MINOR_CIV_TRAIT_MILITARISTIC then
return "MILITARISTIC"
end
if minorCivTraitID == MinorCivTraitTypes.MINOR_CIV_TRAIT_MARITIME then
return "MARITIME"
end
if minorCivTraitID == MinorCivTraitTypes.MINOR_CIV_TRAIT_MERCANTILE then
return "MERCANTILE"
end
if minorCivTraitID == MinorCivTraitTypes.MINOR_CIV_TRAIT_RELIGIOUS then
return "RELIGIOUS"
end
else
print("Lua error - invalid player index")
end
return ""
end
일단 텍스트가 잘 나오니까 일단 잠에 들기로 했다. 엄청 많은 텍스트를 번역하고 버그도 잡고 포럼에 글도 쓰는 건 내게 너무 가혹했다.
그리고 다음 날 성공적으로 모드 번역을 마친 걸 기념하기 위해 문명 게임을 한 판 하기로 했다.
아무래도 GetCityStateTraitText가 굉장히 이곳저곳에서 쓰였나 보다.
이 함수를 GetCityStateTraitKey로 바꾸면 이 모드에서 재정의 하지 않은 원래의 GetCityStateTraitText를 사용하겠지?
로그를 보니 없는 GetCityStateTraitText를 참조하고 있다는 거였고 결국 GetCityStateTraitText는 원본대로 남겨두는 쪽으로 마무리지었다.
이제 모든 버그가 대충 잡혔고 나는 험블번들에서 20달러에 산 시티즈:스카이라인을 하기로 했다.