콘텐츠로 이동

Array

앞서 살펴봤던 EUDVariable은 변수는 기본적으로 하나의 값만 저장할 수 있습니다. 예를 들어, 디펜스게임의 라운드별 적 체력을 변수로 관리한다고 할 때 var round1_hp = 90;처럼 숫자 하나만 담을 수 있죠. 하지만 라운드가 1~2개도 아니고 50라운드 이상의 적 체력은 매번 변수를 만들 수 없습니다. 이렇게 여러 개의 데이터를 하나로 묶어 다뤄야 하는 상황이 많습니다.

이러한 문제를 해결하기 위해 등장한 것이 바로 배열(array) 자료형입니다. 배열은 여러 개의 값을 하나의 변수에 순서대로 저장할 수 있도록 도와주는 자료구조입니다.

EUDArray와 EUDVArray

epScript에서는 크게 두 가지 종류의 배열을 제공합니다. 이 두 배열은 각각 다른 방식으로 동작하며, 상황에 따라 적절한 것을 선택해 사용해야 합니다.

EUDArray: 메모리 직접 접근 방식

EUDArray는 스타크래프트의 메모리에 직접 접근하는 방식의 배열입니다. 데스테이블(Death Table)과 같은 방식으로 게임 메모리에 값을 직접 저장하고 수정합니다.

EUDArray 특징

  1. 빠른 쓰기 속도
    • 메모리에 직접 접근하기 때문에 값을 쓰거나 수정하는 속도가 매우 빠릅니다.
    • 특히 ++, --, == 같은 기본적인 연산이 매우 효율적입니다.
  2. 느린 읽기 속도
    • 값을 읽을 때는 2진 트리 구조를 탐색해야 하므로 상대적으로 느립니다.
    • 자주 읽어야 하는 데이터는 EUDVArray를 고려해보세요.

실제 사용 예시:

const landTimer = EUDArray(50);  // 50개의 구역 타이머

function updateLandTimer() {
    // 모든 구역의 타이머를 매 프레임마다 감소
    for (var i=0; i<landTimer.length; i++) {
        if (landTimer[i] > 0) {
            landTimer[i] -= 1;  // 빠른 감소 연산
        }
    }
}

EUDVArray: 트리거 기반 가상 변수

EUDVArray는 여러 개의 EUDVariable을 하나로 묶은 형태입니다. 각 요소가 독립적인 트리거 변수로 동작하여, 값을 읽고 쓰는 방식이 EUDArray와는 완전히 다릅니다.

EUDVArray 특징

  1. 빠른 읽기 속도

    • 각 요소가 독립된 트리거 변수이므로 값을 읽는 속도가 매우 빠릅니다.
    • 자주 값을 확인하거나 표시해야 하는 데이터에 적합합니다.
  2. 상대적으로 느린 쓰기

    • 값을 수정할 때는 트리거를 통해야 하므로 EUDArray보다는 느립니다.
    • 하지만 읽기가 많은 상황에서는 전체적인 성능이 더 좋을 수 있습니다.

실제 사용 예시:

const heroEPD = EUDVArray(8)();  // 8명의 플레이어의 영웅유닛을 위한 배열

function checkHeroHP(cp) {
    // 여기서 heroEPD는 아래 상황처럼 write보다는 read로 자주 사용하게 됩니다.
    // 영웅이 사망하여 새로운 유닛이 할당되기 전까지는 write가 실행되지 않기 때문입니다.
    const hp = dwread_epd(heroEPD[cp] + 0x08/4);

    if (hp == 0 || hp > 0x7FFFFFFF) {
        // 체력이 0이거나 음수이면 false
        return false;
    }
    return true;
}

언제 무엇을 사용해야 할까?

EUDArray를 쓰면 좋은 경우 EUDVArray를 쓰면 좋은 경우
값을 자주 수정하는 경우 (타이머, 카운터 등) 값을 자주 읽어야 하는 경우
대량 데이터를 저장할 때 플레이어별 상태를 관리할 때
비교 연산이 많은 경우 데이터를 자주 표시하거나 계산에 활용할 때

PVariable

PVariable은 사실 EUDVArray(8)()완전히 동일한 자료형입니다.

// 아래 두 선언은 완전히 동일합니다
const playerScore = PVariable();
const playerScore = EUDVArray(8)();
스타크래프트1 유즈맵은 최대 8인 플레이 환경을 고려해야 하기 때문에, 8명의 플레이어 데이터를 관리하기 위해 자주 EUDVArray(8)을 사용하게 됩니다. 이런 패턴이 매우 흔하기 때문에 epScript에서는 이를 PVariable이라는 별도의 타입으로 제공하여 코드를 더 직관적으로 작성할 수 있게 해줍니다.