GetLocalPlayerDynasty("Player")
  local CheatMode = GetSettingNumber("GAME", "CheatMode", 0)

  if CheatMode ~= 1 then
    MsgQuick("Player", "@LCheatMode is disabled")
    MsgNewsNoWait("Player","","","intrigue",-1,
      "@LCheatMode is disabled",
      "@LCurrently CheadMode is disabled. If you want to enable the CheatMode, please add as below in the Config.ini file.$N$N[GAME]$NCheatMode = 1$N$NConfig.ini file can be found in the main folder of The Guild 2")
    return
  end

MsgQuick의 함수 원형은 아래와 같습니다.

Boolean MsgQuick(
  Alias ( of type measuresimobject) Object,
  String Message)

이 함수의 설명은 다음과 같습니다. "a quick message for the given object" 즉, 특정 대상에게 빠르고 간단하게 메세지를 전하기 위해 만들어진 함수라는 이야기네요.. 따라서 위의 Alias Object 부분에는 메세지를 전달할 대상을 그리고 그 밑에 String Message에는 내가 전하고 싶은 메세지를 전달하게 됩니다..

MsgQuick("Player", "@LCheatMode is disabled")

위 의 라인은 Player에게 "CheatMode is disabled")라는 메세지를 뿌려줍니다.. 여기에서 이 Player가 누구인가 하는 문제가 궁금하실 분들이 계실텐데.. GetLocalPlayerDynasty라는 함수의 사용법을 다시 보아야 하겠지요.. 이 함수의 원형은 아래와 같습니다.

Boolean GetLocalPlayerDynasty(Alias ( of type dynasty) ret_pDynasty)

이 함수가 하는 역할은 "Get's the local player dynasty" 라고 되어 있습니다. 즉 현재 플레이를 하고 있는 플레이어의 정보를 얻는다는 이야기입니다. 그 정보를 얻어서 되돌려주는 역할을 합니다.

GetLocalPlayerDynasty("Player")

이 함수는 현재 플레이를 하고 있는 플레이어 가문의 정보를 Player라고 하는 변수에 저장해서 돌려줍니다. 이 때 Player는 변수로서의 역할을 하는데.. 보시면 아시겠지만 변수 선언이 되어 있지 않습니다. 이런 형식의 경우에는 구지 변수 선언이 필요하지 않은 듯 합니다...

따라서 위의 MsgQuick("Player", "@LCheatMode is disabled") 함수는 현재 플레이를 하고 있는 플레이어에게 "CheatMode is disabled" 라는 메세지를 보여주게 됩니다. 메세지가 보여지는 화면은 아래와 같습니다...


다 음으로 이어지는 함수가 MsgNewsNoWait 함수입니다. 이 함수가 MsgNews 함수와 더불어 쪼매 복잡합니다. 복잡한 만큼 굉장히 막강한 기능을 가지고 있기도 하지요. 아마도 MsgNewsNoWait 함수와 MsgNews 함수의 사용법을 익히고 나면 더길드2 모드를 제작하는데 굉장히 자신이 붙게 될 겁니다.

먼저 MsgNewsNoWait 함수가 어떤식으로 비춰지는지부터 그림을 좀 보여드려야 겠네요...


위 의 그림을 보시면 왼쪽에 CheatMode is disabled 라는 내용이 있는 작은 아이콘이 있는 것을 보실 수 있으실 겁니다. 이게 MsgNewsNoWait 함수가 하는 역할입니다. 이런 식으로 메세지를 날려주게 됩니다. 위의 작은 아이콘을 클릭하면 다시 아래와 같은 내용이 출력이 됩니다.


위와 같이 메세지가 출력이 됩니다.. 이런 메세지를 띄워주는것이 역시 MsgNewsNoWait 함수가 하는 역할입니다.. 본격적으로 함수 분석에 들어가겠습니다.. 먼저 원형을 한 번 보시겠습니다.

Boolean MsgNewsNoWait(
  Alias ( of type guildobject) pDestination, 
  Alias ( of type corenode) pJumpToTarget, 
  String pPanelParam, 
  String pMessageClass, 
  Number TimeOut, 
  String pHeaderLabel, 
  String pBodyLabel, 
  Variable Argument List )

첫 번째 pDestination은 이 메세지가 보여질 대상입니다. 이 부분은 무조건 플레이어가 되어야 하겠지요. 이 첫번째 항목에 대해서는 몇 가지 설명이 더 필요할 듯 합니다.. 대상을 지정하는데에는 몇 가지 원칙들이 있습니다.. 알기 쉽게 호감도를 높이는 예를 들어서 설명을 해 보도록 하지요.

호감도를 높이려면 두 대상이 있어야 합니다. 먼저 호감도를 높이기를 원하는 캐릭터를 클릭을 하고, 그런 후에 호감도를 높이는 기능의 아이콘을 클릭을 한 후에 호감도를 높이기 원하는 다른 상대를 클릭을 할 것입니다. 여기에서 호감도를 높이기를 원하는 원래의 캐릭터를 source라고 하고 호감도를 높이기 원하는 대상 캐릭터를 target이라고 했을 때.. 호감도를 높이기 위해 아래와 같은 함수를 사용을 할 것입니다.

ModifyFavorToSim(source, target, 100)

ModifyFavorToSim 함수는 실제로 두 대상간의 호감도를 세팅하는 함수이고, 호감도의 최대값이 100이기 때문에 위와 같이 하면 source와 target의 호감도가 꽉 차게 됩니다.. 그런데 실제 소스에서 위와 같이 사용을 하면 에러가 나서 실행이 안 되겠지요.. 왜냐하면 더길드2 스크립트는 source, target 이라고 하는 예약어는 가지고 있지 않기 때문입니다..

더길드에서 source의 역할을 하는 예약어는 "" 입니다. 따옴표 두개요.. ^^; 이 부분 상당히 중요합니다. 별표 두개 해 주세요 ^^; 실제로 게임상에서 사용자가 마우스로 클릭한 캐릭터를 나타내기 위해서 더길드2의 스크립트는 따옴표 두 개를 사용을 합니다. 그리고 대상을 나타내는 예약어는 "Destination" 입니다. 역시 중요합니다. 모드를 제작하는동안 아주 빈번히 사용될 내용들이니 별표 두개 해 주세요. 따라서 위의 함수는 아래와 같이 바뀌어야 실제로 소스에서 사용이 가능합니다.

ModifyFavorToSim("", "Destination", 100)

위와 같이 하면 실제 게임에서 처음 마우스로 찍은 캐릭터와 두 번째로 선택된 캐릭터 사이의 호감도가 100이 되게 됩니다..

그 런데 위의 소스를 보면 메세지를 표시할 대상이 ""도 아니고 "Destination"도 아니고 Player로 되어 있습니다. 이 부분을 Player로 해 주어야 하는 이유는, 마우스로 찍는 사람이 꼭 플레이어는 아닐 것이기 때문이지요. 가령 예를 들어서 나는 하얀색 가문으로 플레이를 하고 있는데, 내가 치트를 쓰고자 하는 대상은 노란색 가문이라고 한다면..? 메세지를 전달할 대상을 Player로 하지 않을 경우에는 그 메세지가 Player에게로 오지 않게 될 것입니다.

두 번째 pJumpToTarget은 특정 사건이 적용된 대상입니다. 위의 세 번째 그림에 보면 메세지 안에 조그마한 사진이 들어가 있는 것을 보실 수 있습니다. 그 사진의 캐릭터가 pJumpToTarget에 해당합니다.

세 번째 pPanelParam은 매개 변수가 있을경우 매개 변수를 지정을 해 줍니다만, MsgNewsNoWait 함수의 경우에는 pPanelParm을 쓰지 않습니다. 이 부분은 나중에 MsgNews 함수에서 다루도록 하겠습니다.

네 번째 pMessageClass는 메세지의 클래스를 결정합니다. 메세지의 클래스에는 총 10가지가 있습니다. 메세지 클래스의 정의는 더길드의 DB 폴더 안의 messageclass.dbt 파일에 정의가 되어 있으니 이 파일을 참조해 주시고, 그 중에서 제가 사용한 것은 사람들의 신상등에 대한 정보를 출력해주는 "intrigue"를 썼습니다. 이 부분은 각자 기호에 맞게 알맞게 수정하셔도 상관이 없습니다. 이 부분을 바꾸시게 되면 위의 두 번째 그림에서 왼쪽에 표시되는 아이콘이 바뀌게 됩니다.

다섯 번째 TimeOut은 메세지 박스가 열린 후 사용자의 응답이 없을 경우 지정된 시간이 지난 후에 메세지 박스가 닫히게 됩니다.

여섯 번째 pHeaderLabel은 위의 세 번째 그림의 메세지 박스에서 빨간색으로 표시된 "CheatMode is disabled"라는 라인을 표시하는 문자열입니다.

일곱 번째 pBodyLabel은 실제적으로 메세지 박스 안에 표시될 메세지를 표시하게 됩니다.

마지막으로 Argument List는 pBodyLabel 안에 변수값을 표현하고자 할 때 그 변수들을 지정하게 됩니다. 이 역시 MsgNews 함수에서 조금 더 자세하게 설명이 될 것입니다.

    MsgNewsNoWait("Player","","","intrigue",-1,
      "@LCheatMode is disabled",
      "@LCurrently CheadMode is disabled. If you want to enable the CheatMode, please add as below in the Config.ini file.$N$N[GAME]$NCheatMode = 1$N$NConfig.ini file can be found in the main folder of The Guild 2")

이 제 위의 함수를 정리해 보도록 하지요. 먼저 메세지를 뿌려줄 사람은 플레이어가 되어야 할 테니까 pDestination은 Player를 선택을 해 줍니다. 그리고 두 번째 pJumpToTarget은 이 치트가 적용되는 대상인 "" 로 합니다. ""는 사용자가 게임에서 마우스로 클릭한 캐릭터라고 말씀을 드렸습니다. 세 번째 pPanelParam은 아무것도 없으니까 그냥 공란으로 둡니다. 이 세 번째의 ""은 앞의 두 번째의 ""과는 의미가 다릅니다. ^^; 그리고 네 번째 pMessageclass는 임의로 intrigue로 했습니다. 다섯 번째 TimeOut은 -1로 해서 특별히 설정하지 않았습니다. 여섯 번째 헤더를 CheatMode is disabled로 했고 마지막으로 Body 부분을 좀 길게 했습니다.

return

마지막으로 여기에서의 return은 스크립트의 모든 실행을 멈추고 다시 게임으로 돌아가는 역할을 합니다.

사실 return은 해당 함수를 불러온 모체 함수로 돌아가는 명령입니다. 예를 들어서..

function myfunction()

  return
  MsgQuick("", "이 메세지가 보일까?")

end

function Run()

  filename_myfunction()

end

위 와 같은 구조에서 Run 함수를 실행하게 되면 Run 함수에서 myfunction() 함수를 불러오게 됩니다. 그런데 return 함수는 자신을 불러온 어머니 함수로 바로 돌아가는 역할을 하기 때문에 위의 MsgQuick 함수는 실행되지 않은 채 다시 Run() 함수로 돌아가게 됩니다. yCheatXP 소스에서는 return이 속해있는 함수가 Run() 인 관계로 어머지 함수가 없습니다. 이런때는 스크립트의 실행을 멈추고 게임으로 돌아가게 됩니다.

  GetLocalPlayerDynasty("Player")
  local CheatMode = GetSettingNumber("GAME", "CheatMode", 0)

  if CheatMode ~= 1 then
    MsgQuick("Player", "@LCheatMode is disabled")
    MsgNewsNoWait("Player","","","intrigue",-1,
      "@LCheatMode is disabled",
      "@LCurrently CheadMode is disabled. If you want to enable the CheatMode, please add as below in the Config.ini file.$N$N[GAME]$NCheatMode = 1$N$NConfig.ini file can be found in the main folder of The Guild 2")
    return
  end

최 종적으로 정리를 하자면 위의 라인은 먼저 Config.ini 파일에서 [GAME] 항목 밑에 CheatMode 라는 변수가 1이라는 값을 가지고 있는지 살펴보아서, 그렇지 않다면 MsgQuick 함수를 이용해서 "CheatMode is disabled"라는 메세지를 뿌려주고 또 MsgNewsNoWait 함수를 이용해서 구체적으로 치트를 사용하기 위해서 어떻게 해야 하는지 안내문을 보여준 후에 스크립트의 실행을 종료하는 역할을 합니다..

구지 이런 기능을 만들어 둔 이유는.. 간혹 치트를 사용하기를 원하지 않는 분들이 계셔서.. 치트를 꼭 uninstall 하지 않더라도 치트 없이 게임을 할 수 있도록 방법을 만들어주기 위한 배려 차원이라고 이해해 주십시오.. 다음부터는 실질적인 경험치 모드 부분이 들어갑니다.

P.S. : 아고 힘들다...

 

P.S.: 더 길드 2에 대해 더 자세하고 다양한 정보를 얻기 원하시면 네이버의 더길드 카페(http://cafe.naver.com/theguildz2)를 방문해 보세요.

Posted by yyht
,