카테고리 없음

문자열 생성 이후 - 설명이 안떠요, 창이 이상해요

hyuckkim 2022. 6. 12. 11:20

https://gall.dcinside.com/civilization/265235

 

https://gall.dcinside.com/board/view/?id=civilization&no=265235

 

gall.dcinside.com

이걸 번역하다가 생긴 일이다. 문명 5에서 새로운 기능을 추가해주는 모드이고, 그 설명문을 생성하는 스크립트 (lua로 만듬) 에 대한 이야기다.

(TXT_KEY_문화적_BONUS 대신 설명이 나와야됨)

뭔가 해서 원본 코드를 봤더니 문제를 알 수 있었다.

		-- 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달러에 산 시티즈:스카이라인을 하기로 했다.