모듈을 사용해 스크립트 구성하기

편의를 위해, Node.js와 유사한 문법인 require 함수와 module.exports 오브젝트를 사용해 스크립트를 모듈로 나눌 수 있습니다. 예를 들어 다음 내용으로 'scout'라는 모듈을 만들 수 있습니다:

module.exports = {
    run(creep) {
        creep.moveTo(...);
    }
}

그런 다음 메인 모듈에서 이렇게 포함할 수 있습니다:

var scout = require('scout');

for(var i in Game.creeps) {
    scout.run(Game.creeps[i]);
}

여러분이 만든 모듈 외에도, 일부 내장 모듈을 사용할 수 있습니다. 현재는 lodash 모듈이 제공되며, 다음처럼 사용할 수 있습니다:

var _ = require('lodash');

var harvesters = _.filter(Game.creeps, {
    memory: {role: 'harvester'}
});

바이너리 모듈(Binary modules)

일반 스크립트 모듈 외에도, 특별한 바이너리 모듈을 만들 수 있습니다. 이런 모듈은 require를 호출할 때 바이너리 데이터가 담긴 원시 Buffer로 로드됩니다. 이를 통해 WebAssembly 같은 기법을 사용해 다른 언어로 작성한 코드를 컴파일하고 Screeps에서 실행할 수 있습니다.

WebAssembly는 바이너리 컴파일 코드 포맷으로, C/C++ 또는 Rust 코드(또는 향후 지원될 다른 언어)를 네이티브에 가까운 성능으로 직접 실행할 수 있게 해줍니다. 자세한 내용은 WebAssembly 문서를 참고하세요.

아래는 Emscripten을 사용해 C/C++ 코드를 컴파일하고 바이너리 파일을 Screeps에 업로드하는 간단한 예시입니다.

.wasm 파일 빌드하기

웹에 있는 이미 컴파일된 .wasm 파일을 사용한다면 이 단계는 건너뛰어도 됩니다. 예를 들어 아래 예제에서 우리가 이미 컴파일해 둔 addTwo.wasm 파일을 사용할 수 있습니다.

이 안내를 따라 Emsripten SDK를 설치하세요.

네이티브 C 함수를 작성하고 addTwo.c 파일로 저장합니다:

int addTwo(int a, int b) {
    return a + b;
}

다음 명령으로 addTwo.wasm으로 컴파일합니다:

emcc -s WASM=1 -s SIDE_MODULE=1 -O3 addTwo.c -o addTwo.wasm

바이너리 모듈 업로드

이 스위치를 사용해 바이너리 타입으로 새 모듈 addTwo를 추가하세요:

addTwo.wasm 파일을 바이너리 모듈 내용으로 업로드하면 다음처럼 보일 것입니다:

✔️ 버튼을 눌러 모듈을 커밋하세요.

Screeps에서 네이티브 모듈 실행하기

바이너리 모듈을 올바르게 업로드했다면, 게임 내 IDE에서 다음과 같은 화면을 볼 수 있습니다:

이제 WebAssembly API를 사용해 main에서 가져온 바이너리 코드를 실행할 수 있습니다:

// This will return an ArrayBuffer with `addTwo.wasm` binary contents
const bytecode = require('addTwo');

const wasmModule = new WebAssembly.Module(bytecode);

const imports = {};

// Some predefined environment for Emscripten. See here:
// https://github.com/WebAssembly/tool-conventions/blob/master/DynamicLinking.md
imports.env = {
    memoryBase: 0,
    tableBase: 0,
    memory: new WebAssembly.Memory({ initial: 256 }),
    table: new WebAssembly.Table({ initial: 0, element: 'anyfunc' })    
};

const wasmInstance = new WebAssembly.Instance(wasmModule, imports);

console.log(wasmInstance.exports.addTwo(2,3));