euddraft
euddraft copied to clipboard
Add dynamic allocation/free for requirements and buttonsets.
See https://cafe.naver.com/edac/126655
요구사항 할당
-
요구사항의 크기가 게임 내내 고정인지, 동적으로 할당할지 맵제작자가 체크박스 UI로 체크하게 한다.
-
고정 요구사항들은 모두 앞쪽에 배치한다.
[32] 파이어뱃 생산 요구사항이 [14] 핵 미사일보다 앞에 있는거로 봐서 순서 섞여도 괜찮은 듯
-
동적 요구사항은 게임 시작했을 때는 없다.
-
변수 requirement_pos 에 요구 사항의 맨 뒤 FF FF 주소를 저장한다.
-
맵제작자가 아래처럼 eps 코드를 작성한다:
alloc_requirement(
"Terran Ghost",
"Current unit is...", "Terran Barracks",
"Is not constructing add-on",
"Is not lifted off",
"(Must have)", "Terran Covert Ops",
"(Must have)", "Terran Academy",
);
- 맨 뒤에 새 요구사항이 작성된다.
원래 있던 FF FF <생산 요구사항 끝남 표시>를 지우고 해당 위치부터 작성한다:
01 00 <고스트> 생산 요구사항
02 FF [OpCode] Current unit is...
6F 00 [Value] Terran Barracks
08 FF [OpCode] Is not constructing add-on
05 FF [OpCode] Is not lifted off
75 00 [(OpCode)Value] (Must have) Terran Covert Ops
70 00 [(OpCode)Value] (Must have) Terran Academy
FF FF <End of requirement>
FF FF <생산 요구사항 끝남 표시> // <- 할당 후 requirement_pos는 여기를 가리킴
00 00 00 00 ......
요구사항 변경/해제
-
요구사항 크기가 그대로인 변경은 단순하니까 크기가 변하는 경우만 논한다.
-
변경/해제 전 요구사항과 크기가 같은 요구사항을 맨 뒤부터 하나씩 찾는다.
FF FF를 기준으로 검색하되, 앞에 Upgrade Lv-1/2 Require...OpCode가 있는지도 살펴본다.
-
찾은 요구사항을 앞으로 옮기고, 뒤에 있는 다른 요구사항들은 앞으로 당긴다.
-
(변경일 경우) 고친 요구사항을 맨 뒤에 작성한다.
버튼셋 할당
-
버튼셋이 게임 내내 고정인지, 동적으로 할당할지 맵제작자가 체크박스 UI에 표시하게 한다.
-
고정 버튼셋은 맨 앞에 배치한다.
버튼셋은 개수 + 버튼 데이터 포인터 구조니까 질럿, 드라군, 아칸처럼 이동, 스탑, 어택, 홀드, 패트롤만 있는 버튼셋은 버튼이 추가로 있는 다른 버튼셋(예: 마린, 파뱃 스팀팩 버튼셋)과 같은 주소를 써도 될 거 같다. 테스트 필요.
-
동적 버튼셋은 게임 시작할 때 빈 버튼셋을 가리킨다.
-
변수 buttonset_pos 에 버튼 데이터의 맨 뒤 주소를 저장한다.
-
맵제작자가 아래처럼 eps 코드를 작성한다:
alloc_buttonset(
"Terran Firebat",
/*Move*/ Button(1, 228, 0x4282D0, 0x424440, 0, 0, 664, 0),
/*Stop*/ Button(2, 229, 0x4282D0, 0x4233F0, 0, 0, 665, 0),
/*Attack*/ Button(3, 230, 0x428F30, 0x424380, 0, 0, 666, 0),
/*Patrol*/ Button(4, 254, 0x4282D0, 0x424140, 0, 0, 667, 0),
/*Hold Position*/ Button(5, 255, 0x4282D0, 0x423370, 0, 0, 668, 0),
/*Use Stimpack*/ Button(7, 237, 0x4294E0, 0x4234D0, 0, 0, 334, 346),
);
실제로 이렇게 작성하게 하지는 않을거고 버튼 아이콘, 조건, 액션, 인자1, 인자2는 enum을 넣게 하고,
버튼텍스트는 StatText (stat_txt.tbl) 타입을 입력받게 만들 듯.
- 버튼셋 노드에는 버튼 개수와 buttonset_pos의 현재 주소(=버튼 데이터 시작 주소)를 넣는다.
buttonset_pos에 버튼 데이터를 작성하고, 버튼 데이터의 맨 뒤 주소를 buttonset_pos에 대입한다.
- 할당 후 절대로 해제하지 않을 버튼셋이라면, 똑같은 버튼셋이 이미 있을 경우 재사용해야한다.
(버튼 공간 절약 + 여러 유닛을 같이 선택해도 버튼 누를 수 있게 하기)
버튼셋 해제
버튼셋은 포인터니까 데이터를 매번 앞으로 당길 필요는 없을 거 같고 빈 공간으로 내버려두고 skip list free list로 관리해서 크기가 같거나 작은 할당이 새로 생기면 공간을 재사용하고, skip list free list에 공간이 부족하면 버튼셋 데이터를 당기고 맨 뒤에 공간을 마련한다.