PACL2/프로그램(r3 판)

해당 리비전 수정 시각:  (2개월 전)
[주의!] 문서의 이전 버전(에 수정)을 보고 있습니다. 최신 버전으로 이동
분류
목차
1. 개요2. 공통 문법3. 고수준 문법4. 저수준 문법
4.1. 명령 목록4.2. 예시
5. 참조
5.1. 태그5.2. 함수5.3. 열거형
6. 문법 오류

1. 개요 [편집]

PACL2의 CustomEvents 기능에 포함된 이벤트로, 변수 조작, 이벤트 실행, 카메라/트랙/장식 이동 등 다양한 동작을 프로그래밍 방식으로 제어할 수 있다.

이벤트마다 사용할 문법을 고수준 또는 저수준 중 하나로 선택할 수 있으며, 고수준 문법을 사용하면 레벨 시작 시 내부적으로 저수준 문법으로 변환된다.

2. 공통 문법 [편집]

  • 값 유형문자열, 배열, 실수, 열거형, 논리, null로 정의된다.
  • 논리값은 true 또는 false로 정의된다.
  • 문자열은 큰따옴표 ""로 정의된다.
  • 지역 변수를 사용할 때는 _ 접두사를 사용한다. 모든 값 유형을 사용할 수 있지만, 해당 이벤트 내에서만 유효하다.
  • 전역 변수는 실수형만 저장할 수 있다. 다른 값 유형을 대입하면 오류가 발생한다.
  • 초기화되지 않은 변수를 읽으려 하면 오류가 발생한다.
  • 이 이벤트의 전역 변수와 변수 관련 이벤트는 서로 상호작용할 수 있다.

3. 고수준 문법 [편집]

프로그램 유형을 "고수준"으로 선택했을 때 적용되는 문법이다.
  • 변수명을 직접 사용하여 해당 변수의 현재 값을 가져온다.
  • [요소1, 요소2, ...]로 배열을 정의한다. 배열의 길이는 대괄호 안 ,를 구분자로 결정된다.
  • 함수(인자1, 인자2, ...)로 사전 정의된 기능을 수행한다. 인자의 개수와 각 인자에 대응하는 값 유형이 함수의 정의와 모두 일치해야 한다.
  • 실수형 값에서 지원되는 연산자는 +"-"*/%이다. 연산 결과는 대입 연산자 =을 통해 변수에 저장하거나 함수의 인자로 삽입할 수 있다.
  • 조건문, 루프 및 비교 연산자는 지원되지 않는다.
  • 명령은 세미콜론 ";"으로 마쳐야 한다.
  • # 접두사로 시작하는 줄에 주석을 작성할 수 있다.

# b에 100을 저장
b = 100;
# 지역변수 a에 3 + b * 2를 저장
_a = 3 + b * 2;
# c에 현재 연속 "정확" 판정 개수와 지역변수 a 중 큰 값을 저장
c = Max(_a, {PerfectCombo});

4. 저수준 문법 [편집]

프로그램 유형을 "저수준"으로 선택했을 때 적용되는 문법이다.

C#의 IL 및 ASM 언어를 일부 모방하여 자체 제작된 스택 기반 가상 머신을 사용한다. 고수준 문법보다 다루기 까다롭지만 루프와 조건문 등 강력한 기능을 제공한다.
  • 명령에 들어갈 피연산자 타입은 일치해야 한다.
  • 에는 모든 값 타입이 들어갈 수 있다.
  • 변수는 플레이하는 동안 바뀔 수 있는 가변 값이다.
  • 상수는 플레이하지 않아도 알 수 있는 불변 값이다.
  • 스택에서 먼저 빠진 값이 피연산자의 뒤쪽에 위치한다.
  • ; 접두사로 시작하는 줄에 주석을 작성할 수 있다.

4.1. 명령 목록 [편집]

기본 명령
명령
설명
push
값을 스택에 넣는다.
pop 변수
스택에서 값을 빼 지정한 변수에 값을 쓴다.
mov 변수
지정한 변수에 값을 쓴다.
add
스택에서 값 2개를 빼고 A + B를 스택에 넣는다.
sub
스택에서 값 2개를 빼고 A - B를 스택에 넣는다.
mul
스택에서 값 2개를 빼고 A * B를 스택에 넣는다.
div
스택에서 값 2개를 빼고 A / B를 스택에 넣는다.
mod
스택에서 값 2개를 빼고 A mod B를 스택에 넣는다.
neg
스택에서 값 1개를 빼고 "−A"를 스택에 넣는다.
arr 상수
스택에서 상수만큼 값을 빼 배열을 정의한다.[1]
라벨명:
라벨을 정의한다. 반드시 ":"으로 끝나야 한다.
jl 라벨명
스택에서 값 2개를 빼 A < B이면 지정한 라벨로 이동한다.
jle 라벨명
스택에서 값 2개를 빼 A <= B이면 지정한 라벨로 이동한다.
jg 라벨명
스택에서 값 2개를 빼 A > B이면 지정한 라벨로 이동한다.
jge 라벨명
스택에서 값 2개를 빼 A >= B이면 지정한 라벨로 이동한다.
je 라벨명
스택에서 값 2개를 빼 A = B이면 지정한 라벨로 이동한다.
jmp 라벨명
지정한 라벨로 이동한다.
고급 명령
명령
설명
fparr 상수
함수 인자로 전달할 지정된 길이의 쓰기 전용 빈 배열을 정의한다.[2]
fppopi 상수
스택에서 값과 배열을 순서대로 빼 지정된 인덱스에 값을 쓰고 결과 배열을 스택에 넣는다.[3]
fpmovi 상수
스택에서 배열을 빼 지정된 인덱스에 값을 쓰고 결과 배열을 스택에 넣는다.[4]
call 함수명
스택에서 함수가 요구하는 인자 개수만큼 빼 함수를 실행한다.[5]

4.2. 예시 [편집]


#!syntax nasm
; b에 100을 저장
mov b 100

; 지역변수 a에 3 + b * 2를 저장
push 3
push b
push 2
mul
add
pop _a

; c에 현재 연속 "정확" 판정 개수와 지역변수 a 중 큰 값을 저장
push _a
push {PerfectCombo}
call Max
pop c

; 위와 동일한 동작 (fparr 사용)
fparr 2
fpmovi 0 _a
push {PerfectCombo}
fppopi 1
call Max
pop c

; c를 100으로 나눈 나머지 연산 (뺄셈 루프)
loop:
push c
push 100
jle exit ; c <= 100이면 exit로 이동

push c
push 100
sub
pop c ; c = c - 100
jmp loop

exit:

5. 참조 [편집]

5.1. 태그 [편집]

{태그}로 지정한 태그의 현재 값을 가져온다.
태그
설명
{PerfectCombo}
연속 "정확" 판정 개수
{PerfectCount}
"정확" 판정 개수
{EPerfectCount}
"빠름" 판정 개수
{EarlyCount}
"빠름!" 판정 개수
{TooEarlyCount}
"빠름!!" 판정 개수
{LPerfectCount}
"느림" 판정 개수
{LateCount}
"느림!" 판정 개수
{TooLateCount}
"느림!!" 판정 개수
{MissCount}
"놓침…" 판정 개수
{OverPressCount}
"과입력!" 판정 개수
{OverloadCount}
"과부하…" 판정 개수
{Fps}
현재 프레임률

5.2. 함수 [편집]

함수의 인자는 이름:값유형(인덱스) 형식으로 표기한다. 인자의 개수는 마지막 인자의 인덱스 + 1이다.[6] 특별한 언급이 없는 경우 기간은 이벤트가 실행되는 타일 기준으로 계산되며 음이 아닌 실수여야 한다.
  • TileNum(): 이 이벤트가 설치된 타일 번호를 반환한다.
  • EntryAngle(): 이 이벤트가 설치된 타일의 진입 각도를 반환한다.
  • ExitAngle(): 이 이벤트가 설치된 타일의 진출 각도를 반환한다.
  • Random(): 0~1 사이의 무작위 실수를 반환한다.[7]
  • Min(실수(0), 실수(1)): 두 수 중 작은 값을 반환한다.
  • Max(실수(0), 실수(1)): 두 수 중 큰 값을 반환한다.
  • Pow(실수(0), 실수(1)): 왼쪽 수를 밑, 오른쪽 수를 지수로 하는 거듭제곱 값을 반환한다.
  • Execute(이벤트태그:문자열(0)): 이벤트를 실행한다. 이벤트 태그는 레벨에 설치된 모든 이벤트에서 검색한다.
  • MoveCamera(기간:실수(0), 가감속:열거(1), 카메라기준좌표:열거?(2), 위치오프셋:배열?(3), 회전오프셋:실수?(4), 확대값:실수?(5)): 카메라를 이동한다.[8]
  • MoveTrack(시작타일:정수(0), 끝타일:정수(1), 틈길이:정수(2), 기간:실수(3), 가감속:열거(4), 위치오프셋:배열?(5), 회전오프셋:실수?(6), 크기:배열?(7), 불투명도:실수?(8)): 트랙을 이동한다.[9]
  • MoveDecorations(태그:문자열(0), 기간:실수(1), 가감속:열거(2), 보이기:논리?(3), 장식기준좌표:열거?(4), 이미지:문자열?(5), 위치오프셋:배열?(6), 중심점오프셋:배열?(7), 회전오프셋:실수?(8), 크기:배열?(9), 색상:배열?(10), 불투명도:실수?(11), 깊이:정수?(12), 시차:배열?(13), 시차오프셋:배열?(14), 마스킹타입:열거?(15), 마스킹깊이사용:논리?(16), 마스킹시작깊이:정수?(17), 마스킹끝깊이:정수?(18)): 장식을 이동한다.[10]

5.3. 열거형 [편집]

열거형 값은 문자열의 확장이다. 코드에서 사용할 때는 문자열과 동일하게 큰따옴표로 감싼다.

# 가감속을 InOutSine으로 하여 카메라를 (0, 0)으로 이동
MoveCamera(1, "InOutSine", null, [0, 0], null, null);

  • 가감속
    • LinearInOutSineInSineOutSine
    • InOutQuadInQuadOutQuad
    • InOutCubicInCubicOutCubic
    • InOutQuartInQuartOutQuart
    • InOutQuintInQuintOutQuint
    • InOutExpoInExpoOutExpo
    • InOutCircInCircOutCirc
    • InOutBounceInBounceOutBounce
    • InOutElasticInElasticOutElastic
  • 카메라기준좌표
    • PlayerTileGlobalLastPositionLastPositionNoRotation
  • 마스킹타입
    • NoneMaskVisibleInsideMaskVisibleOutsideMask
  • 장식기준좌표
    • TileGlobalRedPlanetBluePlanetGreenPlanetCameraCameraAspectLastPosition

6. 문법 오류 [편집]

자동 플레이 상태에서 프로그램에 오류가 발생하면 이벤트 실행 시점에 화면 좌상단에 해당 이벤트가 위치한 타일 번호줄 번호가 메시지로 표시된다.
[1] 상수는 자연수이며, 값 유형은 모두 실수여야 한다.[2] 상수는 자연수여야 한다.[3] 상수는 음이 아닌 정수이며 인덱스를 가리킨다. 스택에서 뺄 배열은 반드시 fparr로 생성된 배열이어야 한다.[4] 상수는 음이 아닌 정수이며 인덱스를 가리킨다. 스택에서 뺄 배열은 반드시 fparr로 생성된 배열이어야 한다.[5] 스택에서 빼온 첫 번째 값이 fparr로 생성된 배열이면 이 배열을 함수의 각 인자로 사용한다. 이벤트를 실행하는 함수의 인자는 10개가 넘지만 대부분은 null이므로 이 경우 fparr를 활용할 수 있다.[6] null이 가능한 인자도 동일한 형식으로 표기한다. 기본적으로 인자가 null인 경우 체크박스 꺼짐 상태로 간주한다.[7] "변수 설정" 이벤트에서 설정된 시드와 무관하게 독립적으로 작동한다.[8] 위치오프셋은 길이가 2이어야 하며 각 요소는 X, Y를 가리킨다. 요소를 NaN으로 설정하면 해당 축으로의 카메라 이동을 막을 수 있다.[9] 위치오프셋과 크기는 길이가 2이어야 하며 각 요소는 X, Y를 가리킨다. 요소를 NaN으로 설정하면 해당 축으로의 속성 변경을 막을 수 있다.[10] 위치오프셋, 중심점오프셋, 크기, 시차, 시차오프셋은 길이가 2이어야 하며 각 요소는 X, Y를 가리킨다. 요소를 NaN으로 설정하면 해당 축으로의 속성 변경을 막을 수 있다. 색상은 길이가 4여야 하며 각 요소는 R, G, B, A를 0과 1 사이의 정규화된 값으로 가리킨다.
모든 문서는 CC BY-NC-SA 4.0에 따라 사용할 수 있습니다.