요구사항의 크기가 게임 내내 고정인지, 동적으로 할당할지 맵제작자가 체크박스 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
FF FF <생산 요구사항 끝남 표시> // <- 할당 후 requirement_pos는 여기를 가리킴
00 00 00 00 ......
# 요구사항 변경/해제
0. 요구사항 크기가 그대로인 변경은 단순하니까 크기가 변하는 경우만 논한다.
1. 변경/해제 전 요구사항과 크기가 같은 요구사항을 맨 뒤부터 하나씩 찾는다.
FF FF를 기준으로 검색하되, 앞에 Upgrade Lv-1/2 Require...OpCode가 있는지도 살펴본다.
2. 찾은 요구사항을 앞으로 옮기고, 뒤에 있는 다른 요구사항들은 앞으로 당긴다.
3. (변경일 경우) 고친 요구사항을 맨 뒤에 작성한다.
# 버튼셋 할당
1. 버튼셋이 게임 내내 고정인지, 동적으로 할당할지 맵제작자가 체크박스 UI에 표시하게 한다.
2. 고정 버튼셋은 맨 앞에 배치한다.
버튼셋은 개수 + 버튼 데이터 포인터 구조니까 질럿, 드라군, 아칸처럼 이동, 스탑, 어택, 홀드, 패트롤만 있는 버튼셋은 버튼이 추가로 있는 다른 버튼셋(예: 마린, 파뱃 스팀팩 버튼셋)과 같은 주소를 써도 될 거 같다. 테스트 필요.
3. 동적 버튼셋은 게임 시작할 때 빈 버튼셋을 가리킨다.
4. 변수 buttonset_pos 에 버튼 데이터의 맨 뒤 주소를 저장한다.
5. 맵제작자가 아래처럼 eps 코드를 작성한다:
```js
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에 공간이 부족하면 버튼셋 데이터를 당기고 맨 뒤에 공간을 마련한다.
요구사항 할당
요구사항의 크기가 게임 내내 고정인지, 동적으로 할당할지 맵제작자가 체크박스 UI로 체크하게 한다.
고정 요구사항들은 모두 앞쪽에 배치한다.
[32] 파이어뱃 생산 요구사항이 [14] 핵 미사일보다 앞에 있는거로 봐서 순서 섞여도 괜찮은 듯
동적 요구사항은 게임 시작했을 때는 없다.
변수 requirement_pos 에 요구 사항의 맨 뒤 FF FF 주소를 저장한다.
맵제작자가 아래처럼 eps 코드를 작성한다:
맨 뒤에 새 요구사항이 작성된다.
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
FF FF <생산 요구사항 끝남 표시> // <- 할당 후 requirement_pos는 여기를 가리킴
00 00 00 00 ......
실제로 이렇게 작성하게 하지는 않을거고 버튼 아이콘, 조건, 액션, 인자1, 인자2는 enum을 넣게 하고,
버튼텍스트는 StatText (stat_txt.tbl) 타입을 입력받게 만들 듯.
buttonset_pos에 버튼 데이터를 작성하고, 버튼 데이터의 맨 뒤 주소를 buttonset_pos에 대입한다.
(버튼 공간 절약 + 여러 유닛을 같이 선택해도 버튼 누를 수 있게 하기)
버튼셋 해제
버튼셋은 포인터니까 데이터를 매번 앞으로 당길 필요는 없을 거 같고 빈 공간으로 내버려두고 skip list free list로 관리해서 크기가 같거나 작은 할당이 새로 생기면 공간을 재사용하고, skip list free list에 공간이 부족하면 버튼셋 데이터를 당기고 맨 뒤에 공간을 마련한다.