armoha / euddraft

System for pluginizing eudplib codes.
Other
29 stars 4 forks source link

Add dynamic allocation/free for requirements and buttonsets. #125

Open armoha opened 8 months ago

armoha commented 8 months ago

See https://cafe.naver.com/edac/126655

요구사항 할당

  1. 요구사항의 크기가 게임 내내 고정인지, 동적으로 할당할지 맵제작자가 체크박스 UI로 체크하게 한다.

  2. 고정 요구사항들은 모두 앞쪽에 배치한다.

[32] 파이어뱃 생산 요구사항이 [14] 핵 미사일보다 앞에 있는거로 봐서 순서 섞여도 괜찮은 듯

  1. 동적 요구사항은 게임 시작했을 때는 없다.

  2. 변수 requirement_pos 에 요구 사항의 맨 뒤 FF FF 주소를 저장한다.

  3. 맵제작자가 아래처럼 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",
    );
  4. 맨 뒤에 새 요구사항이 작성된다.

    
    원래 있던 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) 타입을 입력받게 만들 듯.

  1. 버튼셋 노드에는 버튼 개수와 buttonset_pos의 현재 주소(=버튼 데이터 시작 주소)를 넣는다.

buttonset_pos에 버튼 데이터를 작성하고, 버튼 데이터의 맨 뒤 주소를 buttonset_pos에 대입한다.

  1. 할당 후 절대로 해제하지 않을 버튼셋이라면, 똑같은 버튼셋이 이미 있을 경우 재사용해야한다.

(버튼 공간 절약 + 여러 유닛을 같이 선택해도 버튼 누를 수 있게 하기)

버튼셋 해제

버튼셋은 포인터니까 데이터를 매번 앞으로 당길 필요는 없을 거 같고 빈 공간으로 내버려두고 skip list free list로 관리해서 크기가 같거나 작은 할당이 새로 생기면 공간을 재사용하고, skip list free list에 공간이 부족하면 버튼셋 데이터를 당기고 맨 뒤에 공간을 마련한다.