r2
r1

(새 문서)
1[목차]
2== 개요 ==
3[[PACL2]]의 CustomEvents 기능에 포함된 이벤트로, 변수 조작, 이벤트 실행, 카메라/트랙/장식 이동 등 다양한 동작을 프로그래밍 방식으로 제어할 수 있다.
4
5이벤트마다 사용할 문법을 '''고수준''' 또는 '''저수준''' 중 하나로 선택할 수 있으며, 고수준 문법을 사용하면 레벨 시작 시 내부적으로 저수준 문법으로 변환된다.
6
7== 공통 문법 ==
8 * '''값 유형'''은 '''문자열, 배열, 실수, 열거형, 논리, null'''로 정의된다.
r2
9 * 논리값은 {{{true}}} 또는 {{{false}}}로 정의된다.
10 * 문자열은 큰따옴표 {{{""}}}로 정의된다.
11 * 지역 변수를 사용할 때는 {{{_}}} 접두사를 사용한다. 모든 값 유형을 사용할 수 있지만, 해당 이벤트 내에서만 유효하다.
r1

(새 문서)
12 * 전역 변수는 '''실수형만''' 저장할 수 있다. 다른 값 유형을 대입하면 오류가 발생한다.
13 * 초기화되지 않은 변수를 읽으려 하면 오류가 발생한다.
14 * 이 이벤트의 전역 변수와 '''변수 관련 이벤트'''는 서로 상호작용할 수 있다.
15
16== 고수준 문법 ==
17프로그램 유형을 "고수준"으로 선택했을 때 적용되는 문법이다.
18
r2
19 * {{{변수명}}}을 직접 사용하여 해당 변수의 현재 값을 가져온다.
20 * {{{[요소1, 요소2, ...]}}}로 배열을 정의한다. 배열의 길이는 대괄호 안 {{{,}}}를 구분자로 결정된다.
21 * {{{함수(인자1, 인자2, ...)}}}로 사전 정의된 기능을 수행한다. 인자의 개수와 각 인자에 대응하는 값 유형이 함수의 정의와 모두 일치해야 한다.
22 * 실수형 값에서 지원되는 연산자는 {{{+}}}、{{{"-"}}}、{{{*}}}、{{{/}}}、{{{%}}}이다. 연산 결과는 대입 연산자 {{{=}}}을 통해 변수에 저장하거나 함수의 인자로 삽입할 수 있다.
r1

(새 문서)
23 * '''조건문, 루프 및 비교 연산자는 지원되지 않는다.'''
r2
24 * 명령은 세미콜론 {{{";"}}}으로 마쳐야 한다.
25 * {{{#}}} 접두사로 시작하는 줄에 주석을 작성할 수 있다.
r1

(새 문서)
26
27{{{#!syntax python
28# b에 100을 저장
29b = 100;
30# 지역변수 a에 3 + b * 2를 저장
31_a = 3 + b * 2;
32# c에 현재 연속 "정확" 판정 개수와 지역변수 a 중 큰 값을 저장
33c = Max(_a, {PerfectCombo});
34}}}
35
36== 저수준 문법 ==
37프로그램 유형을 "저수준"으로 선택했을 때 적용되는 문법이다.
38
39C#의 IL 및 ASM 언어를 일부 모방하여 자체 제작된 '''스택 기반 가상 머신'''을 사용한다. 고수준 문법보다 다루기 까다롭지만 '''루프와 조건문''' 등 강력한 기능을 제공한다.
40
41 * 명령에 들어갈 피연산자 타입은 일치해야 한다.
r2
42 * {{{값}}}에는 모든 값 타입이 들어갈 수 있다.
43 * {{{변수}}}는 플레이하는 동안 바뀔 수 있는 가변 값이다.
44 * {{{상수}}}는 플레이하지 않아도 알 수 있는 불변 값이다.
r1

(새 문서)
45 * 스택에서 먼저 빠진 값이 피연산자의 '''뒤쪽'''에 위치한다.
r2
46 * {{{;}}} 접두사로 시작하는 줄에 주석을 작성할 수 있다.
r1

(새 문서)
47
48=== 명령 목록 ===
49
50||<-2><bgcolor=#555555><color=#fff> '''기본 명령''' ||
51||<bgcolor=#3D3D3D><color=#fff><width=220> 명령 ||<bgcolor=#3D3D3D><color=#fff> 설명 ||
r2
52|| {{{push}}} {{{값}}} || 값을 스택에 넣는다. ||
53|| {{{pop}}} {{{변수}}} || 스택에서 값을 빼 지정한 변수에 값을 쓴다. ||
54|| {{{mov}}} {{{변수}}} {{{값}}} || 지정한 변수에 값을 쓴다. ||
55|| {{{add}}} || 스택에서 값 2개를 빼고 {{{A + B}}}를 스택에 넣는다. ||
56|| {{{sub}}} || 스택에서 값 2개를 빼고 {{{A - B}}}를 스택에 넣는다. ||
57|| {{{mul}}} || 스택에서 값 2개를 빼고 {{{A * B}}}를 스택에 넣는다. ||
58|| {{{div}}} || 스택에서 값 2개를 빼고 {{{A / B}}}를 스택에 넣는다. ||
59|| {{{mod}}} || 스택에서 값 2개를 빼고 {{{A mod B}}}를 스택에 넣는다. ||
60|| {{{neg}}} || 스택에서 값 1개를 빼고 {{{"−A"}}}를 스택에 넣는다. ||
61|| {{{arr}}} {{{상수}}} || 스택에서 상수만큼 값을 빼 배열을 정의한다.[* 상수는 자연수이며, 값 유형은 모두 실수여야 한다.] ||
62|| {{{라벨명:}}} || 라벨을 정의한다. 반드시 {{{":"}}}으로 끝나야 한다. ||
63|| {{{jl}}} {{{라벨명}}} || 스택에서 값 2개를 빼 {{{A < B}}}이면 지정한 라벨로 이동한다. ||
64|| {{{jle}}} {{{라벨명}}} || 스택에서 값 2개를 빼 {{{A <= B}}}이면 지정한 라벨로 이동한다. ||
65|| {{{jg}}} {{{라벨명}}} || 스택에서 값 2개를 빼 {{{A > B}}}이면 지정한 라벨로 이동한다. ||
66|| {{{jge}}} {{{라벨명}}} || 스택에서 값 2개를 빼 {{{A >= B}}}이면 지정한 라벨로 이동한다. ||
67|| {{{je}}} {{{라벨명}}} || 스택에서 값 2개를 빼 {{{A = B}}}이면 지정한 라벨로 이동한다. ||
68|| {{{jmp}}} {{{라벨명}}} || 지정한 라벨로 이동한다. ||
r1

(새 문서)
69
70||<-2><bgcolor=#555555><color=#fff> '''고급 명령''' ||
71||<bgcolor=#3D3D3D><color=#fff><width=220> 명령 ||<bgcolor=#3D3D3D><color=#fff> 설명 ||
r2
72|| {{{fparr}}} {{{상수}}} || 함수 인자로 전달할 지정된 길이의 쓰기 전용 빈 배열을 정의한다.[* 상수는 자연수여야 한다.] ||
73|| {{{fppopi}}} {{{상수}}} || 스택에서 값과 배열을 순서대로 빼 지정된 인덱스에 값을 쓰고 결과 배열을 스택에 넣는다.[* 상수는 음이 아닌 정수이며 인덱스를 가리킨다. 스택에서 뺄 배열은 반드시 {{{fparr}}}로 생성된 배열이어야 한다.] ||
74|| {{{fpmovi}}} {{{상수}}} {{{값}}} || 스택에서 배열을 빼 지정된 인덱스에 값을 쓰고 결과 배열을 스택에 넣는다.[* 상수는 음이 아닌 정수이며 인덱스를 가리킨다. 스택에서 뺄 배열은 반드시 {{{fparr}}}로 생성된 배열이어야 한다.] ||
75|| {{{call}}} {{{함수명}}} || 스택에서 함수가 요구하는 인자 개수만큼 빼 함수를 실행한다.[* 스택에서 빼온 첫 번째 값이 {{{fparr}}}로 생성된 배열이면 이 배열을 함수의 각 인자로 사용한다. 이벤트를 실행하는 함수의 인자는 10개가 넘지만 대부분은 {{{null}}}이므로 이 경우 {{{fparr}}}를 활용할 수 있다.] ||
r1

(새 문서)
76
77=== 예시 ===
78
79{{{#!syntax nasm
80; b에 100을 저장
81mov b 100
82
83; 지역변수 a에 3 + b * 2를 저장
84push 3
85push b
86push 2
87mul
88add
89pop _a
90
91; c에 현재 연속 "정확" 판정 개수와 지역변수 a 중 큰 값을 저장
92push _a
93push {PerfectCombo}
94call Max
95pop c
96
97; 위와 동일한 동작 (fparr 사용)
98fparr 2
99fpmovi 0 _a
100push {PerfectCombo}
101fppopi 1
102call Max
103pop c
104
105; c를 100으로 나눈 나머지 연산 (뺄셈 루프)
106loop:
107push c
108push 100
109jle exit ; c <= 100이면 exit로 이동
110
111push c
112push 100
113sub
114pop c ; c = c - 100
115jmp loop
116
117exit:
118}}}
119
120== 참조 ==
121=== 태그 ===
r2
122{{{{태그}}}}로 지정한 태그의 현재 값을 가져온다.
r1

(새 문서)
123
124||<bgcolor=#3D3D3D><color=#fff><width=200> 태그 ||<bgcolor=#3D3D3D><color=#fff> 설명 ||
r2
125|| {{{{PerfectCombo}}}} || 연속 "정확" 판정 개수 ||
126|| {{{{PerfectCount}}}} || "정확" 판정 개수 ||
127|| {{{{EPerfectCount}}}} || "빠름" 판정 개수 ||
128|| {{{{EarlyCount}}}} || "빠름!" 판정 개수 ||
129|| {{{{TooEarlyCount}}}} || "빠름!!" 판정 개수 ||
130|| {{{{LPerfectCount}}}} || "느림" 판정 개수 ||
131|| {{{{LateCount}}}} || "느림!" 판정 개수 ||
132|| {{{{TooLateCount}}}} || "느림!!" 판정 개수 ||
133|| {{{{MissCount}}}} || "놓침…" 판정 개수 ||
134|| {{{{OverPressCount}}}} || "과입력!" 판정 개수 ||
135|| {{{{OverloadCount}}}} || "과부하…" 판정 개수 ||
136|| {{{{Fps}}}} || 현재 프레임률 ||
r1

(새 문서)
137
138=== 함수 ===
r2
139함수의 인자는 {{{이름:값유형(인덱스)}}} 형식으로 표기한다. 인자의 개수는 {{{마지막 인자의 인덱스 + 1}}}이다.[* null이 가능한 인자도 동일한 형식으로 표기한다. 기본적으로 인자가 {{{null}}}인 경우 체크박스 꺼짐 상태로 간주한다.] 특별한 언급이 없는 경우 '''기간'''은 이벤트가 실행되는 타일 기준으로 계산되며 음이 아닌 실수여야 한다.
r1

(새 문서)
140
r2
141 * {{{TileNum()}}}: 이 이벤트가 설치된 타일 번호를 반환한다.
142 * {{{EntryAngle()}}}: 이 이벤트가 설치된 타일의 진입 각도를 반환한다.
143 * {{{ExitAngle()}}}: 이 이벤트가 설치된 타일의 진출 각도를 반환한다.
144 * {{{Random()}}}: {{{0~1}}} 사이의 무작위 실수를 반환한다.[* "변수 설정" 이벤트에서 설정된 시드와 무관하게 독립적으로 작동한다.]
145 * {{{Min(실수(0), 실수(1))}}}: 두 수 중 작은 값을 반환한다.
146 * {{{Max(실수(0), 실수(1))}}}: 두 수 중 큰 값을 반환한다.
147 * {{{Pow(실수(0), 실수(1))}}}: 왼쪽 수를 밑, 오른쪽 수를 지수로 하는 거듭제곱 값을 반환한다.
148 * {{{Execute(이벤트태그:문자열(0))}}}: 이벤트를 실행한다. 이벤트 태그는 레벨에 설치된 모든 이벤트에서 검색한다.
149 * {{{MoveCamera(기간:실수(0), 가감속:열거(1), 카메라기준좌표:열거?(2), 위치오프셋:배열?(3), 회전오프셋:실수?(4), 확대값:실수?(5))}}}: 카메라를 이동한다.[* 위치오프셋은 길이가 2이어야 하며 각 요소는 X, Y를 가리킨다. 요소를 {{{NaN}}}으로 설정하면 해당 축으로의 카메라 이동을 막을 수 있다.]
150 * {{{MoveTrack(시작타일:정수(0), 끝타일:정수(1), 틈길이:정수(2), 기간:실수(3), 가감속:열거(4), 위치오프셋:배열?(5), 회전오프셋:실수?(6), 크기:배열?(7), 불투명도:실수?(8))}}}: 트랙을 이동한다.[* 위치오프셋과 크기는 길이가 2이어야 하며 각 요소는 X, Y를 가리킨다. 요소를 {{{NaN}}}으로 설정하면 해당 축으로의 속성 변경을 막을 수 있다.]
151 * {{{MoveDecorations(태그:문자열(0), 기간:실수(1), 가감속:열거(2), 보이기:논리?(3), 장식기준좌표:열거?(4), 이미지:문자열?(5), 위치오프셋:배열?(6), 중심점오프셋:배열?(7), 회전오프셋:실수?(8), 크기:배열?(9), 색상:배열?(10), 불투명도:실수?(11), 깊이:정수?(12), 시차:배열?(13), 시차오프셋:배열?(14), 마스킹타입:열거?(15), 마스킹깊이사용:논리?(16), 마스킹시작깊이:정수?(17), 마스킹끝깊이:정수?(18))}}}: 장식을 이동한다.[* 위치오프셋, 중심점오프셋, 크기, 시차, 시차오프셋은 길이가 2이어야 하며 각 요소는 X, Y를 가리킨다. 요소를 {{{NaN}}}으로 설정하면 해당 축으로의 속성 변경을 막을 수 있다. 색상은 길이가 4여야 하며 각 요소는 R, G, B, A를 0과 1 사이의 정규화된 값으로 가리킨다.]
r1

(새 문서)
152
153=== 열거형 ===
r2
154열거형 값은 문자열의 확장이다. 코드에서 사용할 때는 문자열과 동일하게 큰따옴표로 감싼다.
r1

(새 문서)
155
r2
156{{{#!syntax python
157# 가감속을 InOutSine으로 하여 카메라를 (0, 0)으로 이동
158MoveCamera(1, "InOutSine", null, [0, 0], null, null);
159}}}
160
161 * {{{가감속}}}
162 * {{{Linear}}}、{{{InOutSine}}}、{{{InSine}}}、{{{OutSine}}}
163 * {{{InOutQuad}}}、{{{InQuad}}}、{{{OutQuad}}}
164 * {{{InOutCubic}}}、{{{InCubic}}}、{{{OutCubic}}}
165 * {{{InOutQuart}}}、{{{InQuart}}}、{{{OutQuart}}}
166 * {{{InOutQuint}}}、{{{InQuint}}}、{{{OutQuint}}}
167 * {{{InOutExpo}}}、{{{InExpo}}}、{{{OutExpo}}}
168 * {{{InOutCirc}}}、{{{InCirc}}}、{{{OutCirc}}}
169 * {{{InOutBounce}}}、{{{InBounce}}}、{{{OutBounce}}}
170 * {{{InOutElastic}}}、{{{InElastic}}}、{{{OutElastic}}}
171 * {{{카메라기준좌표}}}
172 * {{{Player}}}、{{{Tile}}}、{{{Global}}}、{{{LastPosition}}}、{{{LastPositionNoRotation}}}
173 * {{{마스킹타입}}}
174 * {{{None}}}、{{{Mask}}}、{{{VisibleInsideMask}}}、{{{VisibleOutsideMask}}}
175 * {{{장식기준좌표}}}
176 * {{{Tile}}}、{{{Global}}}、{{{RedPlanet}}}、{{{BluePlanet}}}、{{{GreenPlanet}}}、{{{Camera}}}、{{{CameraAspect}}}、{{{LastPosition}}}
r1

(새 문서)
177
178== 문법 오류 ==
179자동 플레이 상태에서 프로그램에 오류가 발생하면 이벤트 실행 시점에 화면 좌상단에 해당 이벤트가 위치한 '''타일 번호'''와 '''줄 번호'''가 메시지로 표시된다.