뉴스

era/문법

최근 수정 시각:

1. 개요 [편집]

본 문서에서는 era 게임에서 사용되는 프로그래밍 문법, 정확하게는 eramaker 및 Emuera의 사용법(게임 작성 및 개변) 설명과 코멘트를 기술한다.
아래의 설명 중 따로 언급하지 않은 부분은 Emuera 1824 버전을 기준으로 한다.

본 문서에 기술되지 않은 부분, 특히 실제 활용과 관련된 사항은 era/개발 관련 정보 문서를 참조하라.

오피?셜 설명은 eramaker 개발자의 블로그Emuera osdn 위키 EmueraEE 개발자의 사본 웹페이지 에서 볼 수 있다(일본어).

1. 개요2. 변수
2.1. 변수의 기본 문법2.2. 범용 변수의 종류2.3. 로컬 변수2.4. 글로벌 변수2.5. 캐릭터 변수
3. 상수4. 명령
4.1. PRINT계 (출력 명령)4.2. 제어 명령
5. 함수6. 식중함수7. 주석8. 디버그 전용

2. 변수 [편집]

変数.

변수는 값을 저장하는 공간이다. 변수에 들어있는 값은 여러 계산에 사용할 수 있다. 만일 변수가 없다면, 플레이어가 입력한 내용을 저장하는 것도 게임의 진행이 인과 관계를 갖는 것도 불가능하다.

변수의 값은 수치, 문자열 두 가지로 나뉘고, 수치는 수치형 변수에만, 문자열은 문자열형 변수에만 담을 수 있다.
  • 수치형 변수에 담을 수 있는 수의 종류는 양의 정수, 0, 음의 정수로 한정되고 그 범위를 벗어나는 수의 표현은 지원하지 않는다. 표현할 수 있는 수의 정확한 범위는 64-bit signed integer(부호가 있는 64비트 정수)다. 최댓값과 최솟값은 __INT_MAX____INT_MIN__에 담겨 있다.
  • 문자열은 데이터로써 다루는 숫자, 기호와 화이트스페이스, 빈 문자열 따위를 포함하는 모든 문자를 포함한다. 이를테면 숫자로만 이루어진 "123"도 문자열이고, 문자가 들어있지 않은 ""도 문자열이다.

2.1. 변수의 기본 문법 [편집]

변수는 다음과 같이 이용할 수 있다.

변수에 값을 대입할 수 있다. 변수에 들어있던 값은 지워지고, 대입한 값을 새로 담는다.
;MONEY에 500을 대입한다
MONEY = 500

변수에 수식(계산식)을 대입할 수 있다.
;아래의 표현들은, 전부 MONEY에 500을 대입한다
MONEY = 250 + 250
MONEY = 1000 - 500
MONEY = 100 * 5

;나눗셈의 경우, 나머지는 버린다
MONEY = 3506 / 7

;나머지는 % 연산자를 이용한다.
MONEY = 2500 % 1000

;수식에 괄호를 사용할 수 있다
MONEY = (70+30)*5

변수에 변수가 포함된 수식을 대입할 수 있다.
;MONEY에 100을 더한다
MONEY = MONEY + 100

;MONEY에 변수 RESULT의 값을 더한다
MONEY = MONEY + RESULT

이하의 대입 연산자를 사용하면 수식을 간단하게 쓸 수 있다.
;MONEY에 변수 RESULT의 값을 더한다
MONEY += RESULT

;MONEY에서 100을 뺀다
MONEY -= 100

;MONEY에 2를 곱한다
MONEY *= 5 - 3

;MONEY에서 2를 나눈다
MONEY /= (3 - 1) * 2

;MONEY에 MONEY를 1000으로 나눈 나머지를 대입한다
MONEY %= 1000

변수에 1을 더하거나 1을 빼는 대입 연산자를 간략하게 쓸 수 있다.
MONEY += 1
MONEY ++

MONEY -= 1
MONEY --

크기를 갖는 배열형 변수는 동시에 여러 값을 담을 수 있다. 다음과 같이 배열의 요소에 접근할 수 있다.
;LOCAL의 0번째 요소에 0을 대입한다.
LOCAL = 0
LOCAL:0 = 0

;LOCAL의 1번째 요소에 1을 대입한다.
LOCAL:1 = 1
RESULT = 1
LOCAL:RESULT = 1

;0번째 FLAG에 1을 대입한다.
FLAG:0 = 1

;1번째 FLAG에 RESULT의 1번 요소의 값을 대입한다.
FLAG:1 = RESULT:1

;LOCAL의 0번째, 1번째, 2번째 요소에 각각 100, 200, 300을 대입한다.
LOCAL:0 = 100, 200, 300

;FLAG:0에 저장된 값을 참조하여, LOCAL의 요소에 1을 대입한다.
FLAG:0 = 0
LOCAL:(FLAG:0) = 1

배열의 첫번째 순서는 0이며, 배열의 크기를 벗어나는 수치나 음수(-1)의 순서를 찾으려고 하면 오류가 발생한다.
;다음과 같이 작성하면 에러가 발생한다.
RESULT:-1 = 0

;다음과 같이 작성했을 때, VariableSize.csv에서 정의한 BASE의 크기가 100 이하일 경우, 에러가 발생한다.
;배열의 마지막 순서는 (배열의 크기 - 1)번째이다. 예를 들어 크기가 100인 배열의 마지막 순서는 99번째이다.
BASE:100 = 0

문자열을 문자열형 변수에 대입하는 방법도 수치형 변수와 기본적으로 동일하지만, 헷갈리기 쉬운 부분들을 주의해야 한다.
;문자열형 변수 LOCALS에 "맘보토"를 대입한다.
LOCALS = 맘보토

;LOCALS에 문자열 "맘씨 좋은 보라 토끼에요"를 대입한다.
LOCALS = 맘씨 좋은 보라 토끼에요
LOCALS '= "맘씨 좋은 보라 토끼에요";맘껏 쓰는 보지토끼 아니냐???

;LOCALS에 문자열 "맘씨 좋은 보라 토끼에요;맘껏 쓰는 보지토끼 아니냐???"를 대입한다. (종종 이렇게 실수하는 경우가 있다.)
LOCALS = 맘씨 좋은 보라 토끼에요;맘껏 쓰는 보지토끼 아니냐???

;LOCALS에 문자열 "LOCAL:0"을 대입한다.
LOCALS = LOCAL:0

;LOCALS에 조교 대상의 캐릭터 문자열형 변수 CALLNAME의 값을 대입한다.
LOCALS = %CALLNAME:TARGET%
LOCALS '= CALLNAME:TARGET

;LOCALS에 문자열 "%CALLNAME:TARGET%"을 대입한다. (이렇게 잘못 작성하는 경우가 종종 있다)
LOCALS '= "%CALLNAME:TARGET%"

;LOCALS에 조교 대상의 CALLNAME 값에 " 씨"를 붙인 문자열을 대입한다.
LOCALS '= @"%CALLNAME:TARGET% 씨"

;다음과 같이 작성하면 오류가 발생한다.
LOCALS '= %CALLNAME:TARGET%

;LOCALS에 LOCALS:1의 값을 붙인다. ("조교순애"가 된다.)
LOCALS:0 '= "조교", "순애"
LOCALS += LOCALS:1

;LOCALS에 문자열 " 씨"을 붙인다. ("텍붕이 씨"가 된다.)
LOCALS '= "텍붕이"
LOCALS += " 씨"

;LOCALS에 LOCALS의 값을 2번 반복한 내용을 대입한다. ("텍붕텍붕"이 된다)
LOCALS = 텍붕
LOCALS *= 2

;다음과 같이 작성하면 오류가 발생한다.
LOCALS '= LOCALS:1 - LOCALS:2
LOCALS -= LOCALS:1
LOCALS *= LOCALS:1
LOCALS = LOCALS / 2
LOCALS = LOCALS % 2
LOCALS /= 2
LOCALS %= 2

다차원 배열이라고 부르는, 여러 배열로 이루어진 배열을 담는 변수도 있다.
캐릭터 변수 중 무차원 변수가 아닌 배열 변수는 모두 캐릭터의 수만큼 많은 배열을 담는 다차원 배열이다.
;1번 캐릭터의 0번째 CFLAG에 1을 대입한다.
CFLAG:1:0 = 1

;주인(플레이어 캐릭터)의 0번째 CFLAG에 1을 대입한다.
CFLAG:MASTER:0 = 1

;조교 대상의 0번째 CFLAG에 1을 대입한다.
CFLAG:0 = 1

;다차원 배열 변수 DA의 0번째 배열의 1번째 요소에 2를 대입한다.
DA:0:1 = 2

2.2. 범용 변수의 종류 [편집]

Emuera가 기본 제공하고 따로 정의할 필요가 없는 변수들이다.
  • A-Z (수치형, 일차원 배열 변수)
    알파벳 한 글자 이름을 가진 변수로 A부터 Z까지 존재한다. 이용 방법은 딱히 정해져 있지 않으며, 사용하지 않을 것을 강력하게 권장한다.
  • COUNT (수치형, 일차원 배열 변수)
    코드 블럭을 반복시키는 REPEAT ~ REND 제어 명령 실행 시 자동으로 반복 횟수가 0번째 요소에 기록되는 변수다. COUNT:0의 값을 REPEAT 반복 명령 도중에 변경되면 여러 에러를 유발하고, 무한 루프에 빠질 위험도 있다. REPEAT ~ REND 명령 도중에 호출될 가능성이 있는 함수에서는 REPEAT ~ REND 제어 명령이나 COUNT 변수의 조작을 사용하면 안 된다. FOR 반복 제어 명령과 동적 선언된 사용자 정의 프라이빗 변수로 대체할 것을 권장한다.
  • RESULT (수치형, 일차원 배열 변수)
    INPUT 명령으로 입력을 받을 때 또는 RETURN {숫자} 명령으로 함수를 종료할 경우 자동으로 반환된 값이 0번째 요소에 기록되는 변수다. 사용자의 입력 또는 어떤 함수를 실행한 결과에 따라 다른 동작을 해야 할 때 유용하게 사용할 수 있다. 배열형 변수이므로, RESULT:1 과 같은 공간을 사용할 수도 있다. 수시로 내용이 덮어써지므로 VARSET 명령으로 모든 요소를 주기적으로 초기화하는 것을 권장한다.
  • RESULTS (문자열형, 일차원 배열 변수)
    INPUTS 명령으로 문자열 입력을 받을 때 자동으로 입력 값이 0번째 요소에 기록되는 변수다.
    RESULT와 용도는 거의 비슷하지만 문자열형 변수라는 게 차이점이다. 관습적으로, 함수 처리를 종료하기 전에 문자열 데이터를 다음과 같이 전달하는 데도 쓰인다.
@SAMPLEFUNC(ARGS,ARGS:1)
RESULTS:0 = ARGS + ARGS:1
RETURN 1

  • DAY, TIME (수치형 일차원 배열 변수)
    시간 개념을 나타내기 위해 마련되어 있는 변수이며, 특별히 정해진 사용 방법은 없다.
  • MONEY (수치형, 일차원 배열 변수)
    돈을 나타내기 위해 마련되어 있는 변수이며, SHOP 화면에서 아이템을 구입하는 기능을 이용할 때 이 변수의 0번째 요소를 참조한다.
  • MASTER (수치형, 일차원 배열 변수)
    게임의 플레이어 캐릭터를 나타내기 위한 변수이며, 변수명은 '노예들의 주인'에서 유래. 일반적인 상황에서 게임 시작 시 자동생성되는 0번 캐릭터를 가리킨다.
  • TARGET (수치형, 일차원 배열 변수)
    조교 대상 캐릭터를 나타내기 위한 변수이며, 초기값은 1이다.
  • ASSI (수치형, 일차원 배열 변수)
    조수 캐릭터를 나타내기 위한 변수이며, 초기값은 -1이다.
  • PLAYER (수치형, 일차원 배열 변수)
    조교를 실행하는 캐릭터를 나타내기 위한 변수이다. 일반적인 경우, MASTER 또는 ASSI의 값을 일시적으로 저장한다.
  • FLAG (수치형, 일차원 배열 변수)
    게임의 진행 정도 따위를 나타내기 위한 변수이다. FLAG.csv에서 문자열형 배열변수 FLAGNAME의 초기치를 설정할 수 있고, 다음과 같이 인덱스 번호 대신 FLAGNAME을 사용하여 요소를 참조할 수 있다.
;FLAG.csv
0,난이도
1,게임모드

;아무데서든.ERB
IF FLAG:게임모드 == 2
    PRINTW 노 모어 글레이즈 모드입니다.
ENDIF

  • ITEM (수치형, 일차원 배열 변수)
    구매할 수 있는 아이템과 그 갯수를 나타내기 위한 변수이다. ITEM.csv에서 문자열형 배열변수 ITEMNAME의 초기치를 설정할 수 있고, 그 이용 방법은 FLAGNAME과 동일하다.
  • ITEMSALES (수치형, 일차원 배열 변수)
    아이템의 구매 가능 여부를 나타내기 위한 변수이다. ITEM과 마찬가지로 ITEMNAME으로 접근 가능하다. SHOP의 구매 기능을 사용하지 않고 사용자가 상점 화면을 스크립트로 작성하는 경우 일괄 금지하는 것이 좋다.
  • ITEMPRICE (수치형, 대입불가, 일차원 배열 변수)
    아이템의 가격을 나타내기 위한 변수이다. ITEM과 마찬가지로 ITEMNAME으로 접근 가능하다. ITEM.csv에서 초기치를 설정할 수 있다.
  • CHARANUM (수치형, 대입불가, 무차원 변수)
    등록된 캐릭터의 수를 나타내는 특수한 무차원 변수이다. 주로 다음과 같이 많이 이용된다.
FOR LOCAL,0,CHARANUM
    PRINTSL NAME:LOCAL
NEXT
;모든 캐릭터의 이름을 등록 번호 순서대로 출력한다.

  • RAND (수치형, 대입불가, 무차원 변수)
    무작위 수치를 얻기 위해 사용하는 특수한 무차원 변수이다. 다음과 같이 이용한다.
;RAND:2는 무작위로 0부터 1까지 범위의 수치를 값으로 갖는다.
;IF 조건 분기 명령에서 0은 거짓, 그 밖의 수는 참이므로 반반의 확률로 당첨이거나, 꽝이거나인 상황을 나타낸다.
IF RAND:2
    PRINTW 당첨입니다.
ELSE
    PRINTW 꽝입니다.
ENDIF

;더 큰 범위도 지정할 수 있다.
SELECTCASE RAND:100
    CASE 0 TO 65
        PRINTW 꽝입니다.
    CASE 66 TO 89
        PRINTW 당첨이... 아니라 다시 보니까 꽝이 맞네요.
    CASE 90 TO 99
        PRINTW 당첨이네요?
ENDSELECT
0 또는 -1을 RAND의 인덱스로 지정하면 오류가 발생한다.
  • STR (문자열형 일차원 배열 변수)
    STR.csv에 초기치를 지정할 수 있는 문자열형 변수이다. 게임 중에 반복적으로 이용하는 문자열들을 스크립트 외부에서 정의하고 편리하게 일괄 변경하는데 이용할 수 있다. 세이브는 되지 않는다.
  • SAVESTR (문자열형 일차원 배열 변수)
    STR과 비슷하지만 초기치를 지정할 수 없고 세이브가 가능한 문자열형 변수이다.

2.3. 로컬 변수 [편집]

ローカル変数.

로컬 변수는 함수가 각각 다른 것을 갖는 변수이다.

LOCAL, LOCALS, ARG, ARGS 등의 4가지 종류가 있다. 모두 되도록 이용하지 않고 사용자 정의 프라이빗 변수로 대체할 것을 권장한다.

LOCAL와 LOCALS는 각각 수치형 변수, 문자열형 변수로 이용할 수 있다. 사이즈(배열변수가 갖는 요소의 갯수)는 기본적으로 각각 1000, 100이다. VariableSize.csv 파일을 편집하여 초기치를 바꾸거나, 다음과 같은 프리프로세서로 함수마다 다른 사이즈를 지정할 수 있다.

@함수명
#LOCALSIZE <설정할 요소 수>

RETURN 1


LOCAL:0과 같이 쓰면, 그 함수의 로컬 변수가 가진 값을 참조하거나 변경하고 다른 함수에서 작성한 로컬 변수의 내용은 손대지 않는다.

@TESTFUNC
LOCAL:0 = 100;  LOCAL:0에 100을 대입한다

CALL SMALLFUNC

LOCAL:0 /= 2;   LOCAL:0을 2로 나누어 대입한다.
PRINTV LOCAL:0; LOCAL:0의 값을 출력한다.
WAIT

RETURN 1

@SMALLFUNC
LOCAL:0 -= 50;  LOCAL:0에서 50을 빼고 대입한다.

RETURN 1

위 스크립트의 출력 결과는 50이며, SMALLFUNC 함수에서 50을 뺀 명령은 TESTFUNC의 LOCAL:0에 영향을 끼치지 않는다.

내부적으로는 LOCAL@함수이름과 같이 선언되어 있어서 일단 다른 함수에서도 접근하는 것이 가능하지만 그러면 안 된다.

세이브되지 않는 변수이며, 게임을 재기동하는 등 초기화하기 전까지는 값을 그대로 유지한다. 따라서 함수를 실행할 때마다 값을 초기화하려면 VARSET 명령 등을 사용해야 한다.
VARSET LOCAL


ARG와 ARGS는 LOCAL, LOCALS와 거의 비슷한 성질을 갖고 있지만 함수를 호출할 때 전달하는 인수를 저장하기 위해 특별한 취급을 받는다.

@TESTFUNC
LOCAL:0 = 50
LOCAL:1 = 2

CALL SMALLFUNC(LOCAL:0, LOCAL:1)

PRINTV RESULT
WAIT

RETURN 1

;이 함수는 전달받은 인수를 곱한 값을 반환한다.
@SMALLFUNC(ARG:0, ARG:1)
LOCAL:0 = ARG:0 * ARG:1
RETURN LOCAL:0

위 스크립트는 VariableSize.csv에 설정된 ARG의 사이즈가 1이더라도, 함수가 갖는 인수의 갯수에 따라 자동으로 로컬 변수 ARG의 사이즈를 재설정하여 문제 없이 실행된다. (인수의 갯수가 ARG의 사이즈 설정 이하인 경우 그냥 넘어간다.) ARG 및 ARGS 변수는 함수의 인수가 아닌 다른 용도로는 사용하지 않기를 권장한다.

2.4. 글로벌 변수 [편집]

グローバル変数, セーブデータ間で共有される変数

세이브 데이터 간에 공유되는 변수를 글로벌 변수라 부른다.

게임을 새로 시작해서 생성한 서로 다른 세이브 데이터를 이용하더라도 기록이 남아야 하는 공통적인 편의 기능 설정이나 도전과제 등에 이용할 수 있다.

SAVEGLOBAL 명령으로 저장한 글로벌 변수의 값은 global.sav 파일에 저장된다. 또한 글로벌 변수를 이용하려면 @EVENTFIRST@EVENTLOAD 시작 시 LOADGLOBAL 명령으로 글로벌 세이브 데이터를 불러오는 것을 권장한다.

GLOBAL, GLOBALS, 또한 #DIM GLOBAL 변수이름으로 선언한 사용자 정의 변수 등을 글로벌 변수로 이용할 수 있다.

2.5. 캐릭터 변수 [편집]

キャラクタ変数.

캐릭터마다 갖는 변수이다. 게임 중에 각 캐릭터의 상태 변화를 구현하는 데 이용한다.

BASE, ABL, TALENT, EXP, MARK 등 여러 종류가 있고 그 중 많은 수가 EXP:(캐릭터 등록번호):0과 같이 참조 가능한 이중배열이다. 캐릭터 등록번호를 생략하고 EXP:0과 같이 짧게 쓸 경우, 자동으로 TARGET의 값을 참조한다. 일차원 배열인 경우 NO와 같이 써서 TARGET의 캐릭터 변수를 참조할 수도 있다.

TARGET 외에도 MASTER, PLAYER, ASSI 등 캐릭터 등록번호를 담기 위한 변수는 캐릭터 변수 참조에 자주 쓰인다. 캐릭터 등록 수를 나타내는 대입 불가능한 변수인 CHARANUM도 함께 자주 쓰인다.

;다음 두 가지는 동일한 표현이다.
EXP:TARGET:0 += 4

EXP:0 += 4


캐릭터 생성 시, 참조한 CSV에 기록된 대로 캐릭터 변수들의 초기값이 설정된다.

캐릭터 변수의 종류를 추가하려면 보통은 CFLAG나 TALENT 등을 수정할 수 있지만, 필요에 따라 사용자 정의 캐릭터 변수도 ERH에서 선언하여 이용할 수 있다.

;전투 중 캐릭터에게 상태이상에 걸리면 잠시 동안은 내성이 생기는 시스템을 상정한 예시이다.
#DIM CHARDATA 상태이상,4
#DIM CHARADATA SAVEDATA 상태이상내성,4

3. 상수 [편집]

定数[1].

상수는 고정된 숫자 표현을 의미한다. 상수의 내용은 게임 도중 변하지 않는다.

시스템 제공 상수는 종류가 많지 않고, __INT_MAX____INT_MIN__ 등이 있다.

사용자 정의 상수는 ERH 헤더 파일에서 CONST 키워드를 이용하여 정의할 수 있다. 사용자 정의 상수를 선언할 때는 반드시 초기치가 필요하고, 다른 키워드와 같이 사용할 수는 없다.

;다음과 같이 특정 수치를 직접 써넣는 것도 상수 표현이다.
MONEY += 500

;다음과 같이 특정 문자열을 직접 써넣는 것도 문자열형 상수 표현이다.
RESULTS = 나날이 깝깝한 투쟁이었다...

;ERH(헤더 파일)에서 사용자 정의 상수를 선언할 수 있다.

;EXAMPLE_HEADER.ERH
#DIM CONST POCKETMONEY = 500
#DIM CONST MAGNIFIER,3 = 1, 2, 4

;아래 구문은 기능적으로 MONEY += 500과 차이가 없지만,
;이름을 보고 용도를 알기 쉽고, 여러 곳에서 사용한 상수가 담는 값을
;ERH 파일을 편집하여 한꺼번에 바꿀 수 있다는 장점이 있다.
MONEY += POCKETMONEY


다음과 같은 숫자 리터럴 표현은 eramaker에서는 지원하지 않고 Emuera에서 이용할 수 있다.

A = 256
A = 0x100
A = 0b100000000
A = 1p8


위 코드들은 전부 같은 의미로 차례대로 10진수, 16진수, 2진수, 1 * 2의 8승이다.

4. 명령 [편집]

命令.

era 게임 배리언트의 개발자가 작성하지 않아도 기본적으로 사용할 수 있는 기능. 일반 프로그래밍 언어의 '내장함수'에 해당한다.

명령의 이름은 사용자 정의 함수, 변수 등의 이름으로 지정할 수 없는 예약어(reserved word)들이다.

4.1. PRINT계 (출력 명령) [편집]

⋆ PRINT(|V|S|FORM|FORMS)(|K|D)(|L|W)
문자열을 Emuera 화면에 출력하는 명령이다. 키워드 조합에 따라 사용 방법이 조금씩 다르다.

;PRINT 명령은 뒤에 오는 문자열을 가감없이 그대로 출력한다.
PRINT 오늘 점심은 맛있는 짜장면~

;PRINTS 및 PRINTV 명령은 수식 및 문자열식을 참조하여 출력한다.
LOCAL  = 2
LOCALS = 그릇
PRINTV LOCAL
PRINTS LOCALS

;변수 한 개가 아니라 여러 값의 연산 결과도 출력할 수 있다.
PRINTV LOCAL * 5
PRINTS LOCALS + "다갖고와"

;PRINTFORM 명령은 서식을 포함하는 문자열을 출력한다.
;수식은 {} 안에, 문자열식은 %% 안에 써넣어서 표현할 수 있다.
PRINTFORM 오늘 점심은 맛있는 짜장면 {LOCAL + 1}%LOCALS%~

;PRINTFORMS 명령은 서식을 포함하는 문자열식을 출력한다.
;PRINTS와 비슷한 명령이지만, PRINTFORM 명령에서 쓰이는 서식이 포함된 값을 전달하면 전개하여 출력한다.
LOCALS:1 = 오늘 점심은 맛있는 짜장면 {LOCAL + 3}%LOCALS%~
PRINTFORMS LOCALS:1 + "맛있겠다!"


4.2. 제어 명령 [편집]

  • IF
조건문이라 불리는 기본적인 분기문이다. 주어진 값이 0이 아니면 내부 코드를 실행하고 0이면 ELSE이나 ENDIF로 간다.
IF RAND:2
    PRINTL 1
ELSE
    PRINTL 0
ENDIF
IF에 주어진 수식이 0일 때 ELSEIF를 써서 다른 조건을 설정할 수 있다.
IF RESULT > 0
     ...
ELSEIF RESULT == 0
    ...
ELSE
    ...
ENDIF
ELSEIF 및 ELSE 명령은 필요없다면 쓰지 않아도 된다.

조건문 제어 명령과, 조건이 참(0이 아님)일 때 실행하는 줄이 단 한 줄이라면 SIF 명령으로 조건문을 단 두 줄로 간결하게 표기할 수 있다. SIF 명령으로 두 줄 이상 실행하게 할 수는 없다. ELSE 및 ELSEIF 문도 사용할 수 없으며, SIF는 IF와 달리 ENDIF로 닫지 않는다. (닫으려고 시도하면 오히려 오류가 발생한다)
IF RESULT == 0
    PRINTL 0
ENDIF

SIF RESULT == 1
    PRINLT 1
  • REPEAT ~ REND
    정해진 횟수만큼 코드 블럭을 여러 번 실행하는 반복문 제어 명령이다. REPEAT 명령을 반복하는 횟수는 COUNT 변수에 저장된다. REND로 블럭을 닫는다.
REPEAT 3
    PRINTV COUNT
    PRINTL  회 반복했습니다
REND
REPEAT 구문은 엄밀히는 n회 코드를 실행하는 것이 아니라 COUNT 변수가 n이 될 때까지 그 내용을 반복하는 명령이다. 한 번 반복하고 나면 COUNT에 1을 더하는 기본 동작에, 추가로 COUNT의 값을 도중에 변경함으로써 동작을 다르게 할 수 있다. 다음 예문은 1, 3, 5, 7, 9 라는 수치를 5번에 걸쳐 출력한다.
REPEAT 9
   COUNT += 1
   PRINTVL COUNT
REND
이런 특징은 유연한 코딩을 도와주지만, COUNT가 전역변수라는 점 때문에 예기치 못한 오류를 발생시키기도 쉽다. REPEAT 명령이 포함된 함수 중 다른 REPEAT 명령이 포함된 함수를 호출하면 몹시 간단하게 꼬인다.
  • FOR ~ NEXT

5. 함수 [편집]

関数.

era 게임 배리언트의 개발자가 고안한 내용을 담을 수 있는 프로그램 스크립트의 단위를 함수라고 한다.

함수는 이런 형식으로 만들 수 있다.
@EXAMPLE_FUNC
PRINTW EXAMPLE


함수는 CALL 명령이나 JUMP 명령으로 호출할 수 있다. CALL 명령은 호출된 함수 아래의 스크립트들을 실행한 다음 호출한 장소로 돌아와서 스크립트를 마저 실행한다. JUMP 명령은 호출하는 함수를 중단하고 호출된 함수로 프로그램의 흐름을 넘겨준다.

또한 함수를 호출할 때 인수를 넘겨줄 수 있다. 호출된 함수에서 인수로 설정한 변수에, 호출할 때 지정한 값을 대입한다. 인수는 로컬 변수나 그 함수에서 #DIM, #DIMS로 선언한 변수를 이용하는 것을 권장한다. 일단 전역 변수나 범용 변수를 지정할 수도 있긴 하지만, 대입되는 과정을 따라가기 힘들게 해서 스크립트를 몹시 읽기 불편하게 된다.

@EVENTFIRST
;EXAMPLE_FUNC 함수를 호출하면서, 인자로 500과 100을 전달한다.
CALL EXAMPLE_FUNC(500, 100)
;이렇게 괄호없이 호출할수도 있지만 되도록 위와 같은 형식이 추천된다.
CALL EXAMPLE_FUNC, 500, 10
;결과 값을 출력한다.
PRINTVW RESULT

;이 함수는 두 인수를 더한 값을 반환한다.
@EXAMPLE_FUNC, ARG, ARG:1
RETURN ARG + ARG:1

;인수를 다음과 같이 괄호로 감싸서 표현할 수 있다.
@EXAMPLE_FUNC(ARG, ARG:1)
RETURN ARG + ARG:1


인수의 기본값을 지정할 수 있다. 함수를 호출할 때 인수를 생략하면 기본값이 대입된다.

@EVENTFIRST
;EXAMPLE_FUNC 함수를 호출하면서, 인자를 생략한다.
CALL EXAMPLE_FUNC
;결과 값을 출력한다. 기본값인 500과 100을 더한 600이 출력된다
PRINTVW RESULT

@EXAMPLE_FUNC(ARG = 500, ARG:1 = 100)
RETURN ARG + ARG:1

@EXAMPLE_CALL
;이렇게 뒤쪽의 인수를 생략해도 기본값이 설정되어 있으면 정상 작동한다.
CALL EXAMPLE_FUNC(1000)
;이렇게 앞쪽의 인수를 생략하고 뒤쪽 인수만 전달할 수도 있다.
CALL EXAMPLE_FUNC(,200)

;문자열형 변수의 인수의 기본값을 설정할 때는 큰 따옴표("")를 이용해야 한다.
@EXAMPLE_FUNC2(ARGS = "텍붕")


사용자 정의 변수를 함수의 이름 바로 아래에서 선언할 수 있다. 이 변수들은 인수로 이용할 수도 있고, 인수로 이용하지 않을 수도 있다.

;#DIM, #DIMS로 선언한 사용자 정의 변수는 그 함수 내부에서만 접근할 수 있고 다른 함수에서는 참조할 수 없으며,
;동시에 서로 다른 여러 함수에서 같은 이름의 변수를 선언하는 것도 가능하다.

@EXAMPLE_FUNC(VAR1, VAR2, VAR2:1)
;무차원 변수 VAR1을 선언했다.
;또한 함수명을 선언하면서 인수로 지정했다.
#DIM VAR1
;사이즈가 5인 문자열형 배열 변수를 선언했다.
;또한 함수명을 선언하면서 VAR2:0과 VAR2:1을 인수로 지정했다. 나머지 요소들은 대입은 하지 않는다.
#DIMS VAR2,5

;무차원 변수 VAR3을 동적 선언했다. DYNAMIC으로 동적 선언한 변수는 인수로 쓰이지 않는 경우 함수 시작 시 초기화된다.
#DIM DYNAMIC VAR3
;무차원 변수 VAR4를 동적 선언하고 초기값으로 1을 지정했다. (함수 시작 시 초기화되는 값을 정한다.)
#DIM DYNAMIC VAR4 = 1

;일차원 배열 변수 VAR5를 선언하면서 각 요소의 초기값을 지정했다.
;배열의 요소들을 인수로 지정할 경우, 전달한 값으로 덮어써진다.
#DIM VAR5,3 = 0,1,2

;다차원 배열 변수도 선언할 수 있지만, 초기값은 정할 수 없다.
#DIM VAR6,10,10


함수는 게임 도중, 아예 같거나 조금의 차이가 있지만 거의 같은 스크립트를 여러번 반복적으로 실행해야 할 때 사용한다. 이 같은 상황은 수없이 많다.

다음은 eraTWKR에 포함된 선택지 함수를 빌려온 예시이다.

@EXAMPLE_EVENT
#DIM DYNAMIC ACCEPT
WHILE ACCEPT == 0
    PRINTL 이러저러한 사정이 있습니다.
    PRINTL 좀 도와주시겠습니까.
    CALL ASK_YN()
    IF RESULT == 1
        ;아니오
        PRINTL 그럴수가...... 너무해......
        CONTINUE
    ELSE
        ACCEPT = 1
    ENDIF
WEND
PRINTL 감사합니다. 앞으로도 잘 부탁드립니다.
CALL ASK_YN("네","네")


;네, 아니오 두 가지 응답 선택지를 출력하는 함수
@ASK_YN(ARGS:0 = "네", ARGS:1 = "아니오")
PRINTBUTTON @"[%ARGS:0%]", 0
PRINTL
PRINTBUTTON @"[%ARGS:1%]", 1
PRINTL
;입력을 받고, 입력 값이 0이나 1이 아닌 경우 다시 입력해야 한다.
$INPUT_LOOP
INPUT
IF RESULT != 0 && RESULT != 1
    CLEARLINE
    GOTO INPUT_LOOP
ENDIF
RETURN RESULT

6. 식중함수 [편집]

式中関数.

수식 또는 문자열식 중에 써넣을 수 있는 함수를 식중함수라고 부른다.
거꾸로 말하자면, 명령과 식중함수가 아닌 사용자 정의 함수는 수식 또는 문자열식 중에 호출할 수 없다.

사용자 정의 식중함수를 선언할 때는 #FUNCTION 또는 #FUNCTIONS와 같은 프리프로세서를 함수명 아래에 기입해야 한다.

;수치형 식중함수
@EXAMPLE_FUNC(ARG)
#FUNCTION
RETURNF ARG + ARG * ARG

;문자열형 식중함수
@EXAMPLE_FUNCS(ARGS)
#FUNCTIONS
RETURNF ARGS + "페코"


식중함수에서는 PRINT계 출력 명령, 일반 함수 호출 명령, RETURN 명령 등을 사용할 수 없다. RETURN 대신 식중함수를 중단시키고 값을 반환하는 명령으로 RETURNF를 사용한다.

7. 주석 [편집]

コメント.

주석은 인간이 읽고 이해하기 쉽도록 작성하는 스크립트가 아닌 텍스트다. eramaker 또는 Emuera는 주석을 실행하지 않는다.

주석을 쓸 때는 시작점에 ; 문자를 쓴다.

스크립트 행을 작동하지 않게 하기 위해 주석 처리하는 것을 코멘트 아웃이라고 부른다. 엄밀한 의미의 주석은 아니지만, 여러 행을 한꺼번에 실행하지 않도록 하기 위해 [SKIPSTART][SKIPEND]가 사용된다. 이런 방법은 다른 내용으로 대체된 코드를 남겨두고 싶을 때 이용하고 있지만 권장하지 않으며, git 등 버전 관리 기능을 이용하는 것이 좋다.

;이 부분은 주석이다.
;PRINTL 이렇게 써도 실행되지 않는다.

A = 1;A에 1을 대입

LOCALS '= "문자열";LOCALS에 "문자열"을 대입

;다음과 같은 표현은 LOCALS에 "문자열;LOCALS에 "문자열"을 대입"을 대입한다. 틀리기 쉬운 표현.
LOCALS = 문자열;LOCALS에 "문자열"을 대입

[SKIPSTART]
REPEAT 2
    PRINTL 이 반복문은 작동하지 않는다.
REND
[SKIPEND]

;아래 스크립트는 문자열 "출력할 내용;주석"을 출력한다. 틀리기 쉬운 표현.
PRINTFORML 출력할 내용;주석

ERB는 물론, ERH 파일과 CSV에도 쓸 수 있다.

eramaker는 단순히 ;로 시작되는 행을 무시하고, 행 중간부터 주석을 쓸 수 없다. 다음과 같은 표현은 Emuera에서는 실행되지만, eramaker에서는 주석으로 판단하여 무시된다. eramaker 상위 호환을 위한 기능이다.
;!;PRINTFORML eramaker에서는 실행되지 않는다.

8. 디버그 전용 [편집]


특정 키워드로 만든 블럭 내의 코드는 디버그 모드에서만 작동된다
개발할때 특정 값을 콘솔 없이도 확인 하는데 주로 이용된다

PRINTFORM 노예를
[IF_DEBUG]
    ;이 부분은 일반 모드에서 출력되지 않는다
    PRINTFORM 아껴주세요 
[ENDIF]
PRINTFORML 괴롭혀 주세요
[1] 한국식 독음으로는 '정수'지만, 정수(整數, integer)가 아닌, 상수(常數)와 같은 뜻이다. 일본식으로는 표기도 독음도 整數와 다르다.