EUD란 무엇인가
[1] EUD?
EUD란 Extended Unit Death를 뜻하는데, 쉽게 설명하면 Death 트리거에서 기존의 유닛 번호 이상으로 넣었을 때의 결과가 설정과 달리 나타나던 것을 이용하는 것이다.
여기서 먼저 트리거가 어디서 정보를 이끌어 오고, 수정하는 지를 알면 EUD를 보다 쉽게 이해할 수 있다.
starcraft.exe는 실행될 때, install.exe/stardat.mpq/broodat.mpq/patch_rt.mpq/battle.snp/standard.snp 등의 파일을 불러오는데 여기서 파일의 정보와 현재 상태가 메모리에 저장된다. 바로 이 메모리를 감지하고 바꾸는 기술을 쓸 수 있는 일종의 '구멍'이 EUD인 셈이다. 트리거 역시 메모리에 기록된 정보를 불러들여 수정하는 것이고, 맵핵 역시 마찬가지이다. 블리자드의 패치에 의해 메모리의 주소가 바뀌면 못 쓰게 되기도 하지만 대개 순서는 같고 시작하는 위치만 달라지는 것이 보통이다.
그런데 EUD가 악성핵이라고 불릴 수 없는 이유는 그것이 건드릴 수 있는 영역에는 한계가 있기 때문이다. 현재, 트리거의 Death 조건부와 Set Death 실행부에서만 이것을 사용할 수 있는데 Death수치가 기록되는 영역 사이의 값들만 건드릴 수 있고, 그 밖으로 나가 있는 것에 대해서는 Death와 Set Death의 최대치를 넘어가기 때문에 건드릴 수 없다. 이것들에 대해서는 맵핵 등으로만 건드릴 수 있다.
[2] Unit ID? Local ID? Locale ID?
우리나라 맵제작 사이트의 경우, Unit ID라는 것을 '코드유닛'이라고 이상하게 부르는데 왜 그렇게 부르는지 알 수 없다. 어느 누가 처음으로 Unit ID를 코드유닛이라고 불렀는지는 몰라도 외국에서 퍼온 자료가 아니라는 것을 우기기 위해서 일부러 그렇게 바꿔 부른 게 아닐까 싶다. 그 결과, 코드유닛은 알아도 Unit ID는 모르는 괴현상이 생겼다... ㅋㅋ
Unit ID라는 것은 0번의 마린부터 시작해서 227번의 자원 조각까지, 쉽게 말하자면 유닛의 고유 번호를 뜻하는데 여기서 228번 이상으로 올린 것을 유닛이나 트리거에 사용하면 의외의 결과가 나온다. 그런데 Unit ID라는 것은 227번까지만 고정되고 그 위로는 버전이 바뀔 때마다 순서나 결과가 계속 바뀔 수 있는 것이라 연구할 가치가 없어 외국에서는 연구하지 않는데, 연구 방법이 쉬워서 그런지 우리나라에서는 멍청하게 계속 파고 있다....
Local ID는 맵에 배치된 유닛의 번호를 뜻하는데, 배치할 수 있는 유닛은 1700개이므로 0번부터 1699번까지 있다. 예를 들어, 플레이어 13~15정도의 스캐럽이나 인터셉터를 맵의 맨 처음에 배치해서 유닛의 공격/이동 속도를 올리려고 하겠다면 Local ID 0번으로 배치되어야 한다. 이것은 scenario.chk의 UNIT 기준으로 볼 때는 최상단에 배치된 유닛을 뜻한다. 즉, 배치된 유닛의 위치가 아니라, 몇번째에 배치되었는가가 중요하다. 맵에디터에서 왼쪽 위에 배치하라는 것은 기술력도 없는 헛소문...
Locale ID는 파일의 언어 정보를 뜻하는 것으로, 기준이 되는 0은 English를 뜻한다.
(1031독일어, 1033영어, 1035스페인어, 1037프랑스어, 1040이탈리아어, 1042한글, 1046포르투갈어)
EUD와는 상관이 없지만 Local ID를 Locale ID라고 잘못 부르는 사람들이 있어서 남김..
첫댓글 멍청하게 코드유닛을 연구했던 나는 아주 바보였네요...
모든 유닛의 고유번호(ID)가 패치될 때마다 초기화되는 것은 아니므로, 아주 뻘짓이라고는 할 수 없겠죠. 본문에서 제가 우리나라 맵제작 사이트에 대해 하려던 말은 Unit ID를 코드유닛이라고 바꿔 부른 이유를 모르겠다 이런 얘기입니다.
그리고, 코드유닛이라는 것을 연구하시던 분들은 아마도 스타포지에서 유닛 속성의 Unit Type을 변경하지 않은가 싶은데, 그건 Unit ID를 뜻합니다. 스타포지 제작자가 scenario.chk의 UNIT단락에서 앞에서부터 9번째 바이트부터가 Unit ID인 것은 알아도, 맨 앞의 4개 바이트가 의미하는 것이 뭔지 몰라서 그렇게 썼던 걸로 알고 있습니다. 맨 앞의 4바이트는 맵에 따라 계산된 Local ID를 뜻합니다. Local ID 0번의 값에서 88만큼 추가하면 두번째 유닛의 계산된 Local ID가 됩니다.
좀 더 쉽게 설명하자면, 메모리상에 스타크래프트의 여러 가지 정보가 들어있는 표가 있습니다. 이 표 중에 유닛 데스 카운트가 등록된 부분도 있구요. 그런데 트리거상에서 접근할 수 있는 부분은 유닛 데스 카운트 표밖에 없으니까 그걸 이용해서 이상한 칸 번호에 접근을 시도해서 표의 다른 부분을 보려고 시도하는 거죠.
덧붙여서, Unit ID는 유닛이 가지는 고유 번호를 뜻하지만 부를 때는 "유닛 몇번이 어쩌구저쩌구 하더라." 이렇게 하시면 됩니다. 인투더맵사이드에서 이거 하나 갖고 이러쿵저러쿵 떠들던데 그냥 간단한 것이 좋은 거죠. Unit ID = "유닛 몇번" 마찬가지로 Local ID = "로컬 몇번" 그리고 또 덧붙여서, EUD도 패치되면 바뀌는데.. 라고 할지 모르겠지만 적어도 Unit ID보다는 규칙적으로 바뀝니다. 그래서 그걸 찾아낼 줄만 알고 있으면 버전이 바뀌어도 역시 찾아낼 수 있는 것이고, 그렇기 때문에 맵핵이 여전히 존재하는 것입니다.