EUD/배우기
1. 개요
EUD는 기본적으로 단순하게 'Death' 조건부와 'Set Death' 실행부의 세 가지 변수인 플레이어, 유닛 ID, 죽은/죽일 횟수만으로 구성되어 있지만, 정확히 어떤 오프셋이 어떤 내용을 다루는지에 대해 제대로 이해를 하여야 한다. 대부분 실드 존재 여부, 무기, 방어구, 유닛의 최대 체력 등은 단순히 값만 바꾸는 것으로 큰 위험이 오지 않으나 버튼셋이나 구조오프셋 등 엄청나게 긴 정보를 담고 있는 경우에는 값을 잘못 건드리기만 해도 충돌 현상이 일어나 동시에 바탕화면과 수 번 마주하게 될 수 있으므로 확실하게 이해를 하여야 한다.
2. 준비물
EUD를 만드는데에 필요한 물품이나 유틸리티 프로그램이다.
현재는 EUDEditor, EUDEditor 2, SCM Draft 2, EudDraft가 쓰인다.
EUD Trig는 EUDEditor가 나오기 전에 만들어진 지금은 쓰기 불편한 옛 프로그램이기 때문에 현재는 사용되지 않는다.
2.1. EUDTrig
내려받기
EUDTrig는 O)FaRTy1billion[1] 에 의해지정된 어드레스를 데스테이블 문에 맞게 플레이어 넘버, 유닛 ID와 밸류를 대입하여 간단한 한 줄의 데스테이블을 만들어주는 프로그램으로 EUD 입문자는 물론 초수 고수 상관없이 98% 이상의 EUD 맵 제작자가 사용하는 프로그램이다. 적은 용량에 쉽게 사용할 수 있지만, 이 EUDTrig 프로그램이 한글로 번역된 번역판이 없고 용어도 처음 접하는 사람에겐 생소한 단어들로 구성되어 있다.
참고로, 16진수는 숫자 앞에 0x를 붙이면 된다. 그냥 '10'을 넣으면 10진수로 10을 의미하지만, '0x10'을 넣으면 10진수로 16이 된다.
[image]
'''1. Memory Offset'''
지정 어드레스의 오프셋을 넣는다. 일종의 시작점이 될 어드레스를 이곳에 넣는다고 생각하면 된다.
'''2. Object ID'''상단의 오프셋에서 이동될 값을 적는다.
'''3. Byte'''하나가 담당하는 Byte의 수를 결정한다. 기본적으로 1부터 4까지 있다.
이 Byte는 오프셋에서 자주 보게 되기에 그만큼 많은 초보자들이 헷갈리는 부분인데, 이를 정확히 정의하자면 "다루는 범위"라고 보면 되겠다. 간단한 예로, 유닛의 지상 무기를 담당하는 0x006636B8 오프셋은 유닛 하나당 1byte, 즉 한 칸의 공간 (0 ~ 255)을 사용하고 있다. 반면, 유닛의 어드밴스드 플래그 [2] 를 담당하는 0x00664080 오프셋은 유닛 하나당 4byte, 즉 네 칸의 공간 (0 ~ 4294967295, 2^32-1)을 동시에 쓰고 있으며, 이는 당연히 각 플래그마다 큰 값이 존재하므로 이를 담기 위해 유닛당 소지하는 공간이 많은 것이다. 하나의 데스테이블은 항상 4byte를 포함하고 있으므로 1byte짜리의 오프셋의 경우는 네 개를 동시에 다룰 수 있고, 4byte짜리의 오프셋의 경우는 하나를 다룰 수 있다.
'''4. Use Extended Player Deaths'''이 Byte는 오프셋에서 자주 보게 되기에 그만큼 많은 초보자들이 헷갈리는 부분인데, 이를 정확히 정의하자면 "다루는 범위"라고 보면 되겠다. 간단한 예로, 유닛의 지상 무기를 담당하는 0x006636B8 오프셋은 유닛 하나당 1byte, 즉 한 칸의 공간 (0 ~ 255)을 사용하고 있다. 반면, 유닛의 어드밴스드 플래그 [2] 를 담당하는 0x00664080 오프셋은 유닛 하나당 4byte, 즉 네 칸의 공간 (0 ~ 4294967295, 2^32-1)을 동시에 쓰고 있으며, 이는 당연히 각 플래그마다 큰 값이 존재하므로 이를 담기 위해 유닛당 소지하는 공간이 많은 것이다. 하나의 데스테이블은 항상 4byte를 포함하고 있으므로 1byte짜리의 오프셋의 경우는 네 개를 동시에 다룰 수 있고, 4byte짜리의 오프셋의 경우는 하나를 다룰 수 있다.
EPD (Extended Player Death)를 사용할 지 안할지를 결정한다. EPD는 또 뭐지? 하는 사람들을 위해 설명하자면 보통 EUD는 고도로 높은 유닛의 ID를 사용하지만, EPD 사용을 활성화하면 유닛 ID를 0으로 두고 그것을 플레이어 넘버에 옮긴다. 기본적으로, EUD를 사용시에는 다음과 같은 계산식을 사용한다. (1.16.1 기준)
- 0x58A364 + (Unit ID * 12 + Player Number) * 4 = 오프셋
즉 플레이어 넘버가 10 (11P)이고, 유닛 ID가 300일 경우는 플레이어 넘버는 40, 유닛 ID값은 14400이므로 모두 더하면 0x58DBCC (10진수 5823436)가 된다. 하지만, EPD는 아예 유닛 ID 자체를 사용하지 않아 계산식이 '0x58A364 + 4 * 플레이어 번호'로 크게 단축되며, 또한 다루는 변수가 두 개에서 하나로 줄어듦으로써 정리가 쉬워진다. 특히 음수의 경우는 EPD 사용 여부와 상관없이 무조건 플레이어 넘버만을 사용한다. 때문에 EPD에 적응되는 것이 오히려 좋을 수도 있다.[3]
'''5. Calculate Player/Unit IDs / Calculate Memory Offset'''[image]
아래로 향하는 화살표는 상단의 오프셋과 바이트에 의해 추가된 오브젝트 ID를 합해서 플레이어 넘버와 유닛 ID로 바꾸어준다.
[image]
위로 향하는 화살표는 하단의 플레이어 번호와 유닛 ID를 상단에 오프셋으로 바꾸어준다. 이 때 오프셋은 첫번째 공간 (1byte)에 해당되는 오프셋으로 나오므로 항상 4의 배수이다.
'''6. Player Number'''아래로 향하는 화살표는 상단의 오프셋과 바이트에 의해 추가된 오브젝트 ID를 합해서 플레이어 넘버와 유닛 ID로 바꾸어준다.
[image]
위로 향하는 화살표는 하단의 플레이어 번호와 유닛 ID를 상단에 오프셋으로 바꾸어준다. 이 때 오프셋은 첫번째 공간 (1byte)에 해당되는 오프셋으로 나오므로 항상 4의 배수이다.
플레이어 번호. EPD 사용 비활성화시에는 P1, P2, P3, ...처럼 앞에 P가 붙고 1 ~ 12 사이의 범위가 나오며, EPD 사용 활성화시 P는 사라진다. 참고로 데스테이블을 만들 때에는 P (Player)가 붙은 경우에는 P를 때어내고 그 값에 1을 빼야 한다. P1은 값 0에 해당되며 P12는 값 11에 해당된다.
'''7. Unit ID'''유닛 ID. EPD 사용 활성화하고 출력시에는 항상 0으로 나온다.
'''8. Byte Offset'''해당 오프셋이 지정되는 위치를 직접적으로 보여준다. 출력시 숫자에는 빨갛게 보여지며 Byte의 수에 따라 빨갛게 보여지는 범위가 달라지는데 Byte와 함께 사람들을 혼란에 빠뜨리는 것. 하지만 어드레스와 데스테이블이 4byte를 다룬다는 것을 이해한다면 이 또한 쉽게 풀리게 된다. 다음 테이블은 간단한 예시이다.
즉, 만약 세번째 자리에서 색이 변한다면 65536의 배수인 세번째 공간이 되므로 원하는 값에 65536만큼 곱하면 된다.
즉, 만약 세번째 자리에서 색이 변한다면 65536의 배수인 세번째 공간이 되므로 원하는 값에 65536만큼 곱하면 된다.
2.1.1. 데스테이블 만들기
이제 어느정도 이해를 하였고, 당신이 찾아낸 오프셋으로 플레이어 넘버와 유닛 ID를 출력해냈다면, 이제 그것을 토대로 데스테이블을 하나 출력해내면 된다. 프로그램 상단에 Exporter라는 버튼을 누르면 왼쪽에 창 하나가 뜨는데, 그곳에서 당신만의 데스테이블을 만들어낼 수 있다. 출력창에서는 조건부와 실행부를 모두 만들어낼 수 있으며, 일반 에디터처럼 조건부는 16개, 실행부는 64개가 최대 갯수이다.
'''1. Player'''
메모리 오프셋을 계산하여 출력된 플레이어 번호를 적는다. 오로직 숫자만을 적어야만 하며, 음수 (-)와 양수 (+) 모두 인식할 수 있다.
'''2. Unit ID'''메모리 오프셋을 계산하여 출력된 유닛 ID를 적는다. 오로직 숫자만을 적어야만 하며, 음수 (-)와 양수 (+) 모두 인식할 수 있다.
'''3. Compare / Modifier'''조건부일 경우 값을 기준으로 이상 (At Least)과 이하 (At Most), 그리고 정확히 (Exactly)를 설정할 수 있다. 실행부일 경우 '더하기 (Add)'와 '빼기 (Subtract)', 그리고 '설정 (SetTo)'으로 값을 변동시키거나 지정한 값으로 설정할 수 있다. 위에서도 말했듯이, 하나의 데스테이블은 총 네 개의 공간을 다루므로 조건부의 경우는 4Byte 이상의 오프셋에 자주 쓰이며, 실행부의 경우는 4Byte 이하인 경우 더하기나 빼기 등으로 변경하는 것이 좋으며, 4Byte 이상인 경우 설정을 하는 것이 안전상으로 좋다. 또한 일부 메모리는 게임이 끝난 뒤에도 복구되지 않는 경우가 있으므로 [4] 되도록이면 SetTo를 사용하는 것이 좋다.
'''4. Value'''조건부일 경우 기준이 될 값을 , 실행부일 경우 기존 값에서 변동하거나 설정시킬 값을 넣는다. 즉 데스테이블에서 유닛이 죽은 수/ 유닛을 죽일 수를 결정하는 부분. 실행부로 사용할 경우, 스타크래프트 에디터 내에서는 0x7FFFFFFF (10진수 2147483647)보다 높은 값을 인식하지 못하지만 음수를 인식할 수 있으므로 만약 2147483647보다 높다면 해당 값을 16진수로 바꿔서 넣으면 알아서 값을 음수화시켜준다. 즉 안에 0xFFFFFFFE를 넣으면 -2로 바뀐다.
'''5. Add'''맞게 넣은 값을 데스테이블로 출력한다. 조건부의 경우 조건부 란에, 실행부의 경우 실행부 란에 데스 테이블이 추가된다. 한번 넣으면 리셋 버튼을 누르기 전 까지 사라지지 않으며, 텍스트 형식에서 내용을 지워도 내부에 여전히 저장되어 있다.
'''6. StarForge'''생성된 데스 테이블을 StarForge, 혹은 이와 유사한 텍스트 트리거 형식으로 보여준다. 클릭시 병렬로 놓여진 칸 2개가 존재하며, 위칸에 조건부, 아래칸에 실행부 데스 테이블이 생성된다. 단지 텍스트 형식으로 보여주는 것 뿐만 아니라 직접 복사도 가능하고 내부에 글을 적고 삭제가 가능하므로 임시적인 메모장으로 사용될 수 있다.
'''7. StarEdit'''생성된 데스 테이블을 정리된 데스 테이블 형식으로 보여준다. 클릭시 직렬로 놓여진 칸 2개가 존재하며, 왼쪽 칸에 조건부, 오른쪽 칸에 실행부 데스 테이블이 생성된다.
'''8. Save'''생성된 데스 테이블을 모두 포함하고 있는 하나의 트리거 파일 (*.trg)을 만든다. 저장된 파일은 일반적인 에디터로 불러와서 사용할 수 있으며, 이 때 플레이어 설정이 되어있지 않으며, 아무것도 없이 저장하면 조건부도 실행부도 없는 빈 트리거 파일이 만들어진다.
'''9. Reset'''생성된 모든 데스 테이블을 삭제시킨다. StarForge 형식을 택한 경우, 데스 테이블을 '직접' 지운다 해도 내부에는 데스 테이블이 저장되어 있으므로, 텍스트 트리거 형식을 사용한다면 수시로 리셋을 눌러 내부 데스 테이블을 정리해주어야 한다.
2.2. 치트오매틱 계열 프로그램
특히 치트엔진이나 아트머니처럼 데이터를 확실하게 보고 비교하고 조작할 수 있는 프로그램이면 된다. 물론, 이러한 치트오매틱 계열 프로그램은 많은 백신에서 '''이 프로그램은 해로운 프로그램'''으로 추정해서 삭제해버릴 수가 있고 당연히 대한민국의 많은 온라인 게임에서 이 프로그램도 같이 켜두면 게임이 종료되는 경우가 있다. 하지만 우리의 목적은 온라인 게임 등에서 데이터 조작해 사기치는게 아닌, 현재 블리자드 엔터테인먼트 측에서 손을 때고 그 후속작에 신경쓰고 있어 완전히 남겨져버린 스타크래프트의 데이터를 조작해 "나"만의 맵을 만드는 것이 목적이므로 그냥 백신을 종료해두거나, 탐지 예외 목록에 추가해두면 된다.
2.3. EUD DB
바로가기
EUDTrig를 만든 O)FaRTy1billion이 개설한 EUD 오프셋 모음 사이트[5] . 웬만한 오프셋은 다 모여있다. 기본적으로 오프셋 기준 오름차순으로 나열되어 있다. 만약 당신이 EUD를 연구하다가 새로운 오프셋을 발견했는데, 저 EUD DB에 없다면 당신이 직접 기록할 수 있다. 상단에 Add Address 버튼을 눌러서 그 오프셋이 어떤 내용을 포함하고 있는지를 적으면 된다.
2.4. EUD Editor
EUDEditor
EUDEditor 2
EUDEditor와 EUDEditor 2는 간단하게 "뎡디터"로도 쓰인다 "뎡디터2"는 EUDEditor2만을 지칭할 필요가 있을때 쓰인다.
둘 다 '맛있는 빙수'님이 내놓았고 입문자도 간단하게 사용할 수 있도록 만들었다.
두 프로그램을 사용하기 위해서는 어느정도는 최신버전의 EUD Draft(다운로드 링크)가 필요하다.
사용법은 정말 간단하다. 그냥 해보면 된다.
뎡디터2는 오류 발생시 저장되지 않은 데이터가 그대로 날아갈 수 있으니 자주 저장하는게 좋다.
다음과 같은 경우에 뎡디터 오류 발생의 위험이 있다.
- EUD Draft가 해당 뎡디터를 지원하지 않을 정도로 구버전인 경우
이 경우 적용만 미루어지기도 한다.
- 삽입 시에 해당 맵이 스타크래프트에서 사용 중인 경우- 자동 컴파일 박스에 체크해둔 경우
자동 컴파일은 원본맵의 데이터가 새로이 저장될 때마다 삽입하는 기능으로 저장 시에 맵이 실행 중인 것으로 인식되어 오류가 발생하기도 한다.해당 원인으로 오류가 발생하면 삽입기능에만 오류가 생기므로 수정 및 저장은 가능하다.
2.5. Scmdraft 2
Scmdraft 2
한글판으로 출시된 SCM 드래프트는 모두 구버전이라 해당 프로그램으로는 EUD 트리거 생성이 불가하다.
모두 영문이라 조금 불편할 수는 있으나 유닛이나 트리거 등 내부에서 영어 외의 언어 입력도 가능하다.
EUD로 오프셋도 건드릴 수 있다. 자세한 내용은 Scmdraft 2 항목 참고.
[1] 참고로 EUD DB 사이트를 개설한 사람도 이 사람이다.[2] 유닛의 영웅 여부, 공중 유닛인가 아닌가, 메카닉이나 바이오닉 등을 모두 담당하는 오프셋.[3] EPD가 사용될 수 있는 이유는 일단 일반적인 데이터 조작 프로그램 등을 사용하면 가로와 세로로 보여지지만, 사실 모든 데이터는 한줄로 모두 정렬되어 있기 때문에 플레이어 넘버 하나만으로도 충분히 찾을 수 있기 때문이다. 또한 유닛의 경우는 유닛 하나라 해도 한번에 48개의 공간을 사용하는데 이는 유닛의 죽은 횟수를 담당하는 첫 네 공간은 P1의 0번 유닛인 Terran Marine이며, 그 다음 어드레스는 P2의 0번 유닛의 죽은 횟수에 대한 정보가 담겨있다. 때문에 일반적인 EUD를 사용시 항상 플레이어 번호가 변동된다.[4] 물론 wLauncher에서는 자체적으로 데이터를 복구시키는 기능이 있지만, 혹시나 하는 일에 대해 대비하기 위함이다.[5] 페이지 이름에도 그의 이름이 포함되어 있다. '''farty1billion'''.dyndns.org