[CNS]트리거에 대해 아주 자세히 가르쳐 주겠습니다 (펌)
페이지 정보
작성자 Leona123 작성일 24-10-03 16:28 조회 494 댓글 0본문
트리거
(역시 용어가 애니매이션의 스프라이트를 뜻하는 '프레임'과 게임상의 1/60초를 뜻하는
'프레임'이 헷갈릴수 있어서 전자의 경우 그냥 '스프라이트'라고 했고 '프레임'이라고 한
경우는 1/60초를 뜻하는 경우만 사용했습니다.)
캐릭터의 동작을 만들기 위해선 명령어가 필요합니다. 예를들어 캐릭터를 앞으로 얼만큼 이
동시킨다든지 언제 공격판정을 만든다든지 하는 것 등인데 이 명령을 수행할 때 조건이 트
리거입니다. 원본파일은 docs폴더의 trigger.txt인데 모르는건 원문그대로.
윈무겐에서 달라진점은 윈무겐 docs폴더의 update.txt 파일을 보면 원문이 있습니다.
앞서도 설명했듯이 명령어의 구조가
[State 번호, ?] ;state 뒤의 번호는 암거나 써도 상관없으나 에러메세지가 뜰 때 알아보
;기 쉽게하기 위해 statedef 의 번호(스텟넘버)랑 맞춰주는게 일반적.
type = ? ;명령어
trigger? ;조건
~~~ ;추가 파라미터
이렇게 되는데 트리거에 쓰인 조건을 만족하면 그 명령이 실행된다는 것입니다.
예를 들어
[state 200]
type = posadd
trigger1 = time = 0
x = 10
이렇게 하면 스텟 시작하자마자 x축으로 10만큼 캐릭터를 앞으로 이동시켜라 하는 게
됩니다.
추가적으로 설명하자면 트리거의 값이 1이 될 경우 해당명령을 실행합니다.
조건인 time = 0을 만족할 경우 컴퓨터는 값 '1(true:맞음)'을 돌려주므로 결과적으로 저
문장은 'trigger1 = 1' 이 되서 해당명령이 실행되는 것입니다. 조건을 만족하지 않으면
컴퓨터는 값 '0(false:틀림)'을 돌려줍니다. 'trigger1 = 0'이 되면 해당명령은 실행되지
않습니다.
또한 triggerall 이라는게 있는데 무조건 만족해야 하는 트리거를 뜻합니다.
예를들어
triggerall = statetype = A
trigger1 = command = "a"
trigger2 = command = "b"
라고 하면 캐릭터가 무조건 스텟타입이 A이어야 하며, a나 b버튼을 눌렀을 때 라는 뜻이
됩니다.
트리거 뒤의 숫자는 차례대로 가야 합니다. 예를들어 trigger2 뒤에 trigger4가 써있으면
제대로 검사가 되지 않습니다.
그리고 디버그모드는 MUGEN.CFG에서 ALLOWDEBUGMODE = 1로 설정돼있으면 도스무
겐에선 ctrl + d 키로 되지만 윈무겐은 무겐실행시 winmugen.exe가 아닌 debug.exe로
실행을 해야 됩니다. 디버그 모드에서는 캐릭터의 애니매이션번호와 스텟번호. gametime과
스텟time, animtime, statetype, ctrl 등의 정보를 볼 수 있습니다.
ctrl+c를 누르면 캐릭터의 판정박스와 무적정보 등이 나옵니다.
만약 모르겠는 트리거가 있다면 CNS의 Displaytoclipboard명령과 appendtoclipboard명령을
사용하면 알수 있을것입니다.
그리고 반환되는 값을 말할 때 1이면 True값이고 0이면 False값이니까 설명되어있지 않아
도 이해하시길 바랍니다.
====================================================================
;여긴 원문그대로
This is an alphabetical index of function-type triggers. For details
on use of function-type triggers in expressions, see the expression
documentation. Unless otherwise specified, we will use P1 to represent
the player who is evaluating the trigger, and P2 to represent his
opponent (usually the closest opponent when in team mode).
Some triggers are nonstandard and cannot take expressions as their
arguments. These are marked with a (*) in the index. Some triggers are
deprecated; these are marked with a (**). Use of these triggers is not
encouraged, as support for them may be removed in future versions of
the engine.
Old-style triggers, marked (***), appear only in clauses of the form
(trigger) (relational operator) (value). See section 8 of exp.doc for
more details.
For all triggers, SFalse will be returned if the trigger is redirected
to a nonexistent destination, or if the ID number for the redirection
evaluates to SFalse. This is not listed in the error conditions for
each trigger.
트리거 목록입니다. 대문자로 쓰나 소문자로 쓰나 같습니다.
--------------------------
-Abs
-Acos
-Alive
-Anim
-AnimElem(*,***)
-AnimElemNo
-AnimElemTime
-AnimExist
-AnimTime
-Asin
-Atan
-AuthorName(*,***)
-BackEdgeBodyDist
-BackEdgeDist
-CanRecover
-Ceil
-Command(*,***)
-Const(*)
-Cos
-Ctrl
-DrawGame
-E
-Exp
-Facing
-Floor
-FrontEdgeBodyDist
-FrontEdgeDist
-FVar
-GameTime
-GetHitVar(*)
-HitCount
-HitDefAttr(*,***)
-HitFall
-HitOver
-HitPauseTime
-HitShakeOver
-HitVel
-ID
-IfElse
-InGuardDist(윈무겐전용)
-IsHelper
-IsHomeTeam
-Life
-LifeMax(윈무겐전용)
-Ln
-Log
-Lose
-MatchNo
-MatchOver
-MoveContact
-MoveGuarded
-MoveHit
-MoveReversed(윈무겐전용)
-MoveType(*,***)
-Name(*,***)
-NumEnemy
-NumExplod
-NumHelper
-NumPartner
-NumProj
-NumProjID
-NumTarget
-P1Name(*,***)
-P2BodyDist
-P2Dist
-P2Life
-P2MoveType(*,***)
-P2Name(*,***)
-P2StateNo
-P2StateType(*,***)
-P3Name(*,***)
-P4Name(*,***)
-PalNo
-ParentDist
-Pi
-PlayerIDExist
-PrevStateNo
-Pos
-Power
-PowerMax(윈무겐전용)
-ProjCancelTime
-ProjContact(*,***)
-ProjContactTime
-ProjGuarded(*,***)
-ProjGuardedTime
-ProjHit(*,***)
-ProjHitTime
-Random
-RootDist
-RoundNo
-RoundsExisted
-RoundState
-ScreenPos
-SelfAnimExist
-Sin
-StateNo
-StateType(*,***)
-SysFVar
-SysVar
-Tan
-TeamMode(*,***)
-TeamSide
-TicksPerSecond
-Time
-TimeMod(*,**,***)
-UniqHitCount
-Var
-Vel
-Win
위의 트리거중에 수학 트리거 목록
----------------------
-abs
-acos
-asin
-atan
-ceil
-cos
-e
-exp
-floor
-IfElse
-ln
-log
-pi
-sin
-tan
------------------------------------------------------------
Abs
------------------------------------------------------------
절대값을 구하는 트리거입니다.
형식
abs(절대값을 구할 값)
괄호안의 수가 정수라면 정수를, 실수라면 실수를 돌려줍니다.
-2의 절대값은 2이고 뭐 이런거 수학에서 나오는데 그거 같습니다만 써본적이 없습니다.
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
------------------------------------------------------------
Acos
------------------------------------------------------------
Computes the arccosine (in radians) of the specified argument.
무슨 삼각함수 라디안에 관련된 코사인 같은데 써본적도 없고 모르겠군요.
Format:
acos(exprn)
Arguments:
exprn
Expression to compute the arccosine of (float).
Return type:
float(실수. 영어원문에서 int는 정수, float은 실수를 뜻합니다)
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn is not in
the domain of arccosine (which is [-1.0,1.0]).
Example:
value = acos(1)
Sets value to the arccosine of 1, which is approximately 0.0
(possibly with some rounding error.)
------------------------------------------------------------
Alive
------------------------------------------------------------
플레이어가 살아있다면 1(true)값을 돌려주고 ko된 상황(체력이 0일때)이면 0을 돌려줍니다.
예)
trigger1 = alive = 0
플레이어가 ko됐을 때
------------------------------------------------------------
Anim
------------------------------------------------------------
플레이어의 애니매이션 번호를 검사합니다.
예)
trigger1 = Anim = 200
액션번호가 200 일때
------------------------------------------------------------
AnimElem(*,***)
------------------------------------------------------------
애니매이션의 몇번째 스프라이트인가를 검사합니다.
예를들어 air파일에서 다음과 같은 액션200이 있다고 칩시다.
[begin action 200]
0,0,0,0,4 - 첫 번째 스프라이트
0,1,0,0,5 - 두 번째 스프라이트
0,2,0,0,6 - 세 번째 스프라이트
이 됩니다.
형식
1. AnimElem = value1
2. AnimElem = value1, [oper] value2
[oper]에 들어가는 부호
=, !=, <, >, <=, >=
value1 (정수)
몇번째 스프라이트인가
value2 (정수)
그 스프라이트에서 몇프레임 째인가
예)
trigger1 = AnimElem = 2
애니매이션의 2번째 스프라이트 시작 직후를 뜻합니다. 그러니까 위의 액션200에서
스프라이트 0,1이 나올 때를 뜻합니다. 다음과 같이 써도 같은 뜻이 됩니다.
trigger1 = AnimElem = 2, = 0 (2번째 스프라이트의 1번째 프레임)
(정확히 말하자면 1번째 스프라이트가 끝나고 2번째 스프라이트로 넘어가는 순간!을 뜻
합니다.)
trigger1 = AnimElem = 2, = 4
2번째 스프라이트 시작 후 4프레임 지났을 때를 뜻합니다. 그러니까 위의 액션200에서
는 스프라이트 0,1이 끝나기 직전이 되겠네요.
(역시 정확히 말하자면 4프레임 지나고 5프레임으로 넘어가는 순간!을 뜻합니다.)
trigger1 = AnimElem = 2, >= 0
trigger1 = AnimElem = 3, < 0
2번째 스프라이트 시작 직후부터 3번째 스프라이트가 나오기 전까지입니다.
만약 3번째 스프라이트가 없다면 2번째 줄은 다음과 같은뜻이 됩니다.
trigger1 = AnimTime <= 0
* 캐릭터가 스텟에 오자마자(animelem=1에) 적의 공격을 막는(가드스텟으로 가는) 경우가
있는데 이경우엔 만약 스텟시작하자마자 poweradd=-1000같은(필살기같은데 쓰이는)게
있을 경우 기만 날리고 기술은 안나가는 경우가 생길수 있습니다. 따라서 이런 상황을 막기
위해서 이런건 trigger1 = animelem = 1,1 이나 trigger1 = time = 1 이런식으로 씁시다.
------------------------------------------------------------
AnimElemNo
------------------------------------------------------------
애니매이션의 스프라이트의 프레임의 범위를 검사?. 설명이 어렵네요. 예를 봅시다.
Returns the number of the animation element in the current action
that would be displayed at the specified time. The argument to AnimElemNo
represents the time to check, expressed in game ticks, relative to the present.
(영어원문에서 tick 이라고 함은 게임진행시간(프레임)을 말하는 것으로 1tick은 1/60초
= 1프레임 입니다)
Format:
AnimElemTime(exprn)
Arguments:
exprn
Expression that evaluates to the time offset (int).
Return type:
int
Error conditions:
Returns SFalse if you try to check a time that would fall before the
start of the current action.
Notes:
If the action is currently within its looping portion, then it is
assumed to have been looping forever. That is, no matter how far into
the past you check, AnimElemNo will always return an element number
that lies within the looping portion of the action.
Examples:
trigger1 = AnimElemNo(0) = 2
True when the animation element to be displayed 0 ticks in the
future (i.e., now) is element 2. This is equivalent to:
이건 다음과 같습니다.
trigger1 = AnimElem = 2, >= 0
trigger1 = AnimElem = 3, < 0
trigger1 = AnimElemNo(2) = 4
True when the animation element that will be displayed two ticks
from now is element 4. This is equivalent to:
이건 다음과 같습니다.
trigger1 = AnimElem = 4, >= -2
trigger1 = AnimElem = 5, < -2
이 animelemno(?)는 잘 쓰이진 않지만 애니매이션을 정시시킬 때 쓸수도 있습니다.
예를들어
[state 500]
type = changeanim
trigger1 = 1
value = anim
elem = animelemno(-1)
이렇게 쓰면 현재 스프라이트가 유지되는데 제캐릭터 쿠로키시의 얼음빔에 맞은 스텟이나
진념 연옥영파 모으는중 히트시 구체를 정지시킬 때, 드레이븐 아이스스톰 맞았을 때 등에
쓰였습니다. 11-cns명령어 파일의 changeanim부분 참조.
------------------------------------------------------------
AnimElemTime
------------------------------------------------------------
안써봤습니다.
Gets the animation-time elapsed since the start of a specified element
of the current animation action. Useful for synchronizing events to
elements of an animation action.
(reminder: first element of an action is element 1, not 0)
Format:
AnimElemTime(exprn)
Arguments:
exprn
Expression that evaluates to the element number to check (int).
Return type:
int
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn evaluates
to an element number that is not valid for the current action.
Examples:
trigger1 = AnimElemTime(2) = 0
True on the first game-tick that the player's animation
is on element 2. Is equivalent to saying:
이건 다음과 같습니다.
trigger1 = AnimElem = 2
trigger1 = AnimElemTime(2) = 4
True 4 game-ticks after the start of the player's
second animation element.
정확히는 모르겠지만 이건 animelem = 2, =4 와 같은것같군요.
trigger1 = AnimElemTime(2) >= 0
trigger1 = AnimElemTime(3) < 0
이건
animelem = 2, >= 0
animelem = 3, <0 과 같은 것 같습니다.
True for the whole of the second element of the player's
animation, assuming there is a third element. If a
third element does not exist, the second line will evaluate
to SFalse and hence trigger1 will never trigger. In this case,
the second line should read,
trigger1 = AnimTime <= 0
------------------------------------------------------------
AnimExist
------------------------------------------------------------
애니매이션 번호가 존재하는지를 검사하는것인데 상대방에 맞아서 상대 스텟으로 간
경우 오작동할수도 있으므로 거의 쓰이지 않고 대신 selfanimexist가 쓰입니다.
예)
trigger1 = !AnimExist(200)
애니매이션 200번이 존재하지 않을때
------------------------------------------------------------
AnimTime
------------------------------------------------------------
애니매이션이 끝날때의 animtime 은 0이 되고 그이전엔 -값에서 계속 0을 향해 1씩
더해집니다.
예를들어 전체 지속시간이 7프레임인 애니매이션이 있다고 하면 그 애니매이션 시작직후
animtime 값은 -7 이며 7프레임째의 값은 -1 그리고 끝날때는 0이 됩니다.
AIR파일에서 loopstart가 쓰여있다고 해도 마지막 스프라이트의 지속시간이 끝나면
animtime값은 0이 됩니다.
예)
trigger1 = AnimTime = 0
애니매이션이 끝났을 때.
이건 대부분의 스텟 마지막 부분에 changestate명령과 함께 쓰입니다.
------------------------------------------------------------
Asin
------------------------------------------------------------
이것도 삼각함수 같은데 모르겠군요.
Computes the arcsine (in radians) of the specified argument.
Format:
asin(exprn)
Arguments:
exprn
Expression to compute the arcsine of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn is not in
the domain of arcsine (which is [-1.0,1.0]).
Example:
value = asin(1)
Sets value to the arcsine of 1, which is approximately pi/2
(possibly with some rounding error.)
------------------------------------------------------------
Atan
------------------------------------------------------------
역시 삼각함수
Computes the arctangent (in radians) of the specified argument.
Format:
atan(exprn)
Arguments:
exprn
Expression to compute the arctangent of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = atan(1)
Sets value to the arccosine of 1, which is approximately pi/4
(possibly with some rounding error.)
------------------------------------------------------------
AuthorName(*,***)
------------------------------------------------------------
제작자의 이름을 검사합니다.
해당 캐릭터의 def파일내에 있는 authorname을 검사하는 것입니다.
예)
trigger1 = Authorname = "sanderx"
def파일에 쓰여있는 authorname이 sanderx 일 경우
------------------------------------------------------------
BackEdgeBodyDist
------------------------------------------------------------
캐릭터의 back.width부터 캐릭터뒤쪽의 화면구석까지의 거리를 구합니다.
그런데 backedgedist와 값의 차이를 모르겠군요.
결과값은 실수입니다만 중요하지 않습니다.
예)
trigger1 = BackEdgeBodyDist < 30
캐릭터의 뒤 너비부터 캐릭터 뒤쪽 스크린 가장자리 까지의 거리가 30픽셀(도트)
미만일 경우
------------------------------------------------------------
BackEdgeDist
------------------------------------------------------------
캐릭터의 x축 중심부터 뒤쪽 화면 가장자리까지의 거리를 구합니다.
역시 backedgebodydist 와 값이 똑같이 나오는군요
결과값은 실수입니다만 역시 중요치 않습니다.
예)
trigger1 = BackEdgeDist < 30
캐릭터의 x축 중심부터 뒤쪽 화면 가장자리까지의 거리가 30픽셀 미만일 경우
------------------------------------------------------------
CanRecover
------------------------------------------------------------
캐릭터가 맞아서 날아가는 중일 때 낙법을 할수 있으면 1을 반환하고 그렇지 않으면
0을 반환합니다. 낙법이 가능한지 불가능한지는 cns의 hitdef의 명령어에 따라 정해집니다.
예) trigger1 = canrecover
------------------------------------------------------------
Ceil
------------------------------------------------------------
수를 올림한 값을 구합니다. 음수일 경우 그 수보다 크거나 같은 정수를 구합니다.
형식
ceil(수)
예)
ceil(5.5)의 값은 6
ceil(5.1)의 값도 6
ceil(-2.6)의 값은 -2
------------------------------------------------------------
Command (*,***)
------------------------------------------------------------
커맨드 입력 감지
예)
trigger1 = Command = "fireball"
fireball 커맨드를 입력했을 때
trigger1 = command != "holdback"
뒤 키를 누르고 있지 않을 때
도스무겐에선 입력된 커맨드 지속시간이 1프레임 이었지만, 윈무겐에서는 cmd파일에
추가된 부분인 [defaults]부분의 command.buffer.time 만큼 지속됩니다. 기술 발동할 때
커맨드를 입력하면 CMD에서 커맨드를 감지해서 스텟을 이동시키는데, 도스무겐에선
이동한 스텟의 time = 0 까지만 커맨드를 입력한걸로 감지하지만, 윈무겐에선 저
값대로(기본값1인 경우 time = 1까지) 감지합니다.
command.buffer.time 값이 1(기본값)이라고 쳤을때
type = varset
trigger1 = time > 0
trigger1 = command = "xx"
이런 부분은 같은커맨드로 연결하는 기술(이오리 규화(밑,뒤+손)같은)에 쓰였었는데
윈무겐을 위해 time > 0 부분을 time > 1 로 고쳐야 합니다.
예를들자면 제 이오리 [statedef 520]에서 다음과 같은 부분이 있습니다.
[State 325,8]
type = Varset
triggerall = time > 1
triggerall = time < 35
triggerall = var(55) = 0
trigger1 = command = "3p1_z"
trigger2 = command = "3p1_x"
persistent = 0
var(5) = 1
이곳의 time > 1을 time > 0으로 고친후 강규화를 실험해보면, 도스무겐에선 문제가
없지만 윈무겐에선 강규화1타가 맞을 경우 2타가 저절로 나가는 현상이 나타납니다.
------------------------------------------------------------
Const (*)
------------------------------------------------------------
캐릭터의 cns파일 처음 부분에 있는 여러 가지 값들을 검사하는 것입니다.
형식
Const(파라미터 이름)
CNS파일 처음부분의 [Data]부분의 값을 검사할 때. (해당 값들을 검사합니다. 굳이 해석할
필요는 없겠죠?)
data.life: Returns value of the "life" parameter. (int)
data.attack: Returns value of the "attack" parameter. (int)
data.defence: Returns value of the "defence" parameter. (int)
data.fall.defence_mul: Returns value of the defence multiplier,
calculated as 100/(f+100), where f is the "fall.defence_up"
parameter. (float)
data.liedown.time: Returns value of the "liedown.time" parameter.
(int)
data.airjuggle: Returns value of the "airjuggle" parameter. (int)
data.sparkno: Returns value of the "sparkno" parameter. (int)
data.guard.sparkno: Returns value of the "guard.sparkno" parameter.
(int)
data.KO.echo: Returns value of the "ko.echo" parameter. (int)
data.IntPersistIndex: Returns value of the "IntPersistIndex"
parameter. (int)
data.FloatPersistIndex: Returns value of the "FloatPersistIndex"
parameter. (int)
CNS의 [Size]부분 값들을 검사할때
size.xscale: Returns value of the "xscale" parameter. (float)
size.yscale: Returns value of the "yscale" parameter. (float)
size.ground.back: Returns value of the "ground.back" parameter.
(int)
size.ground.front: Returns value of the "ground.front" parameter.
(int)
size.air.back: Returns value of the "air.back" parameter. (int)
size.air.front: Returns value of the "air.front" parameter. (int)
size.height: Returns value of the "height" parameter. (int)
size.attack.dist: Returns value of the "attack.dist" parameter.
(int)
size.proj.attack.dist: Returns value of the "proj.attack.dist"
parameter. (int)
size.proj.doscale: Returns value of the "proj.doscale" parameter.
(int)
size.head.pos.x: Returns x-component of the "head.pos" parameter.
(int)
size.head.pos.y: Returns y-component of the "head.pos" parameter.
(int)
size.mid.pos.x: Returns x-component of the "mid.pos" parameter.
(int)
size.mid.pos.y: Returns y-component of the "mid.pos" parameter.
(int)
size.shadowoffset: Returns value of the "shadowoffset" parameter.
(int)
size.draw.offset.x: Returns x-component of the "draw.offset"
parameter. (int)
size.draw.offset.y: Returns y-component of the "draw.offset"
parameter. (int)
CNS의 [Velocity]부분의 값을 검사할 때. 주로 스텟 20(걷기)이나 100(달리기)에서 이
파라미터들을 쓰게 되죠
velocity.walk.fwd.x: Returns value of the "walk.fwd" parameter.
(float)
velocity.walk.back.x: Returns value of the "walk.back" parameter.
(float)
velocity.run.fwd.x: Returns x-component of the "run.fwd" parameter.
(float)
velocity.run.fwd.y: Returns y-component of the "run.fwd" parameter.
(float)
velocity.run.back.x: Returns x-component of the "run.back"
parameter.
(float)
velocity.run.back.y: Returns y-component of the "run.back"
parameter.
(float)
velocity.jump.y: Returns y-component of the "jump.neu" parameter.
Note: this is NOT "velocity.jump.neu.y". Only the "neu"
parameters take a y-component value. (float)
velocity.jump.neu.x: Returns x-component of the "jump.neu"
parameter.
(float)
velocity.jump.back.x: Returns value of the "jump.back" paramamter.
(float)
velocity.jump.fwd.x: Returns value of the "jump.fwd" parameter.
(float)
velocity.runjump.back.x: Returns value of the "runjump.back"
paramamter. (float)
velocity.runjump.fwd.x: Returns value of the "runjump.fwd"
parameter.
(float)
velocity.airjump.y: Returns y-component of the "airjump.neu"
parameter. Note: this is NOT "velocity.airjump.neu.y".
(float)
velocity.airjump.neu.x: Returns x-component of the "airjump.neu"
parameter. (float)
velocity.airjump.back.x: Returns value of the "airjump.back"
paramamter. (float)
velocity.airjump.fwd.x: Returns value of the "airjump.fwd"
parameter.
(float)
역시 [Movement]부분의 값들을 검사할때
movement.airjump.num: Returns value of the "airjump.num" parameter.
(int)
movement.airjump.height: Returns value of the "airjump.height"
parameter. (int)
movement.yaccel: Returns value of the "yaccel" parameter. (float)
movement.stand.friction: Returns value of the "stand.friction"
parameter. (float)
movement.crouch.friction: Returns value of the "crouch.friction"
parameter. (float)
예)
trigger1 = Const(velocity.walk.fwd.x) > 4
CNS파일의 [velocity]부분에 있는 walk.fwd 의 값이 4보다 클 경우
------------------------------------------------------------
Cos
------------------------------------------------------------
삼각함수의 코사인 값을 구합니다. 괄호안에 각도를 쓰는 듯. 예를들어 cos(0) = 1입니다.
실수를 쓸수도 있는데 그것에 대해선 모르겠군요.
Computes the cosine of the specified argument (in radians.)
Format:
cos(exprn)
Arguments:
exprn
Expression to compute the cosine of. (float)
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = cos(0)
Sets value to the cosine of 0, which is approximately 1.0
(possibly with some rounding error.)
------------------------------------------------------------
Ctrl
------------------------------------------------------------
캐릭터 조종이 가능할 경우(?)1을 돌려주고 그렇지 않으면 0을 돌려줍니다.
ctrl값이 0인지 1인지는 각 스텟의 처음 부분의 ctrl =? 등에 따라 결정됩니다.
예)
trigger1 = Ctrl
캐릭터가 컨트롤가능할 경우
------------------------------------------------------------
DrawGame
------------------------------------------------------------
그 라운드를 비길 경우 1이 되고 아니면 0이 됩니다.
예)
trigger1 = DrawGame
라운드가 비긴 상태로 끝날 경우
------------------------------------------------------------
E
------------------------------------------------------------
e값(2.718281828..)이라는데 대학교 고급수학이나 물리에서 나오나? 저는 모르겠습니다.
Returns the value of e (2.718281828...)
Format:
e
Arguments:
none
Return type:
float
Error conditions:
none
------------------------------------------------------------
Exp
------------------------------------------------------------
수학 연산자인데 몰라요.
Computes the exponential of the argument (e raised to the power of
the argument.) This produces slightly more accurate results than the
equivalent expression e**(argument).
Format:
exp(exprn)
Arguments:
exprn
Expression to compute the exponential of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = exp(4-var(0))
Sets value to e raised to the quantity 4-var(0).
------------------------------------------------------------
Facing
------------------------------------------------------------
캐릭터가 오른쪽을 향아고 있으면 1을, 왼쪽을 향하고있으면 -1 값을 줍니다.
예)
Trigger = Facing = -1
캐릭터가 왼쪽을 보고 있을 때
------------------------------------------------------------
Floor
------------------------------------------------------------
버림한 값을 구합니다. ceil과 반대. 음수일 경우 그 수보다 작거나 같은 정수를 구합니다.
예)
floor(5.5)의 값은 5
floor(-2.1)의 값은 -3
------------------------------------------------------------
FrontEdgeBodyDist
------------------------------------------------------------
캐릭터의 앞쪽 너비에서부터 앞쪽 스크린 구석까지의 거리를 구합니다.
역시 밑의 frontedgedist와 갚이 같게 나오는데 어떨 때 다르게 나오는지 모르겠습니다.
예)
trigger1 = FrontEdgeBodyDist < 30
플레이어의 앞쪽 너비부터 앞쪽 스크린 끝까지의 거리가 30픽셀(도트) 미만일 경우
------------------------------------------------------------
FrontEdgeDist
------------------------------------------------------------
플레이어의 x축을 기준으로 앞쪽 스크린구석까지의 거리를 구합니다.
frontedgebodydist와 값이 같게 나오는데 어떨 때 다른지 모르겠습니다.
예)
trigger1 = FrontEdgeDist < 30
플레이어 x축과 앞쪽 스크린 가장자리까지의 거리가 30픽셀 미만일 경우
------------------------------------------------------------
FVar
------------------------------------------------------------
실수변수인 fvar의 값을 검사합니다. fvar(0)부터 fvar(39)까지 있습니다.
값을 정하는 것은 cns명령어인 varset, varadd 로 합니다.
예)
trigger1 = FVar(5) = -1.23
fvar(5)의 값이 -1.23 일 경우
------------------------------------------------------------
GameTime
------------------------------------------------------------
라운드가 시작되면 Gametime은 계속 흘러갑니다. cns명령어인 pause 등으로 게임
화면이 멈춰도 상관없이 1초에 60씩 계속 올라갑니다.
gametime은 주로 일정시간마다 실행할 명령의 조건에 사용됩니다.
예)
trigger1 = (GameTime%27)=0
gametime을27로 나눈 나머지가 0인 경우. 즉, 27프레임마다를 뜻합니다.
------------------------------------------------------------
GetHitVar(*)
------------------------------------------------------------
맞은 공격의 속성(값)들을 검사합니다. cns의 공격판정을 내는 명령인 hitdef의 속성에 따라
값들이 결정되는데, 주로 공격을 한 상대방의 hitdef에서 검사합니다.
Gethitvar는 movetype = H 일 경우에만 지속되며 I일 경우 사라집니다. A일경우엔 일부만
사라지는 듯.
형식
GetHitVar(파라미터이름)
파라미터 종류
xveladd, yveladd, type, animtype, airtype, groundtype, damage,
hitcount, fallcount, hitshaketime, hittime, slidetime, ctrltime,
recovertime, xoff, yoff, zoff, xvel, yvel, yaccel, hitid,
chainid, guarded, fall, fall.damage, fall.xvel, fall.yvel,
fall.recover, fall.time, fall.recovertime, isbound(윈무겐전용).
자세히
xveladd: Returns the additional x-velocity that is added to the
player's own when he is KOed. (float)
KO됐을 때 x속도 더하는 값? 써본적이 없네요. 아마 캐릭터가 KO될때 x,y속도
가 일정값만큼 더해져서 날아가게 되는데 그걸 말하는듯.
yveladd: Returns the additional y-velocity that is added to the
player's own when he is KOed. (float)
type: hitdef의 type. 지상에서 맞으면 ground.type 의 값, 공중이면 air.type의 값입
니다. 0 - none, 1 - high, 2 - low, 3 - trip(3값은 지상에서만 받음)
animtype: hitdef의 animtype에 따라 해당 값을 돌려줍니다. 0 - light, 1 - medium, 2
- hard, 3 - back, 4 - up, 5 - diagup
airtype: hitdef의 air.type값. 돌려주는 값은 위의 type과 같습니다.
groundtype: 마찬가지로 hitdef의 ground.type 값
damage: damage 값
hitcount: 맞은 횟수입니다. 예를들어 2히트콤보를 맞으면 2 뭐 이런식입니다.
fallcount: 콤보맞아서 다운된 횟수
hitshaketime: 경직시간. hitdef의 pausetime 의 영향을 받는데 예를들어 pausetime이 10
인 공격에 맞을 경우 hitshaketime 은 10에서 1씩 줄기 시작해서 10프레임
후엔 0이 됩니다.
hittime: Hitdef의 hittime. 맞아서 회복되는데 걸리는 전체 시간
slidetime: Hitdef의 slidetime. 맞았을 때 밀림이 멈추는데까지 걸리는 시간
ctrltime: 공격을 가드(막다)한 후 컨트롤가능하게 되기까지 시간
recovertime: 넘어졌을 때 일어나기 전까지 시간. 이 값은 0을 향해 점점 줄기 시작하는
데 방향키를 흔들거나 버튼을 연타하면 더 빨리 줄어듭니다.
xoff: "Snap" x offset when hit (deprecated) hitdef의 snap의 x위치?
yoff: "Snap" y offset when hit (deprecated) hitdef의 snap의 y위치?
zoff: "Snap" z offset when hit (deprecated) hitdef의 snap의 z위치? z위치가 뭘뜻하는
지 모르겠군요.
xvel: 맞아서 x방향 밀려나는 속도. hitdef의 velocity들에 있음 (당연히 정수가 아닌 실수)
yvel: 맞아서 y방향으로 뜨는 속도 (역시 실수)
yaccel: Hitdef 의 yaccel값. 맞고 넘어질 때 y 축 가속도 (실수)
chainid: Player-assigned chainID for last hit taken. (int)
마지막 맞은 공격의 chaninID 값인듯 (정수)
guarded: 마지막 받은 공격을 가드했을 경우 1을 돌려주며 아니면 0을 돌려줍니다.
isbound: 플레이어가 상대의 TargetBind 명령의 영향을 받고있으면 1값을
돌려줍니다. 던져지는 스텟에서 버그방지하는데 유용하다는군요(2vs2대전시
p2stateno가 있는 hidef공격이 맞자마자 또다른 상대에게 맞을 경우 발생하는
걸 말하는 듯. 맞은쪽만 스텟이동되는 것). (윈무겐 전용입니다)
fall: 다운되면 1(TRUE), 아니면 0(FALSE)값을 돌려줍니다.
fall.damage: Damage taken upon fall (int) 넘어진 상태에서 받은 대미지인 듯 (정수)
fall.xvel: 바운드(튕김)될 때 x속도. Hitdef의 fall.xvelocity 값 (실수)
fall.yvel: 바운드(튕김)될 때 y속도. Hitdef의 fall.yvelocity 값 (실수)
fall.recover: 낙법이 가능하면 True(1)값을 주며 그렇지 않으면 false(0)값을 줍니다.
fall.recovertime: 낙법이 가능하게 되기까지의 시간.
fall.kill: 넘어진 상태에서 맞았을 때 ko될수 있는가. 역시 hitdef의 fall.kill값
fall.envshake.time: hitdef의 fall.envshake.time 값. 맞고 넘어질 때 지면이 흔들리는
시간(정수)
fall.envshake.freq: hitdef의 fall.envshake.freq 값. 지면 흔들리는 주기(실수)
fall.envshake.ampl: hitdef의 fall.envshake.ampl 값. 지면 흔들리는 너비(정수)
fall.envshake.phase: Returns values set by the fall.envshake.*
parameters in an attacker's hitdef. (실수)
예)
trigger1 = GetHitVar(yvel) < -5.5
맞고 뜰 때 y속도가 -5.5 미만일 때
------------------------------------------------------------
HitCount
------------------------------------------------------------
한 스텟에서 공격을 맞춘 횟수입니다. 다른 스텟으로 넘어가면 0이 됩니다.
Uniqhitcount 랑 다른점은, 같은 공격(hitdef)을 2명의 상대에게 맞췄을 때 hitcount는 1만
증가하지만 Uniqhitcount는 2가 증가합니다.
예)
trigger1 = HitCount > 8
공격스텟이 시작되고 나서 그 스텟 내에서 한 상대에게 공격을 맞춘 횟수가 8회
초과일때
------------------------------------------------------------
HitDefAttr(*,***)
------------------------------------------------------------
활성화되어있는 hitdef의 attr 값. 써본적은 없군요.
형식
HitDefAttr [oper] value1, value2
[oper] 에는 =, != 중에 하나가 들어갈수 있다.
value1
A string that has at least one of the letters "S", "C"
and "A" for standing, crouching and aerial attacks
respectively. For example, "SA" is for standing and
aerial attacks.
S, C, A중 하나이상이 들어가는데 각각 서서공격, 앉아공격, 공중공격이며 hitdef의
attr 값에서 따옵니다. SA처럼 2가지를 쓰면 서서공격이나 앉아공격 이런식으로 되는듯
value2
A set of 2-character strings, separated by commas.
Each 2-character string must be of the form described:
The first character is either "N" for "normal", "S" for
"special", or "H" for "hyper". The second character must
be either "A" for "attack" (a normal hit attack) or "T"
for "throw". For example, "NA, ST" is for normal attacks
and special throws.
2개의 문자가 조합되는데 첫 번째 문자는 N(노멀), S(스페셜:기술), H(하이퍼:필살기)
이며 두 번째 문자는 A(공격), T(잡기)입니다. 역시 hitdef의 attr값을 검사합니다.
form:
arg1, arg2
then the trigger condition is determined to be true only
if arg1 is a subset of value1, AND arg2 is a subset of
value2.
예를들어 S, NA 라고 쓰면 서서 노멀공격일 경우 인 듯 합니다.
예)
trigger1 = A, HA
(원문은 이렇지만 틀린 것 같네요. trigger1 = hitdefattr = A, HA 이어야겠죠?)
공중 필살기 일 때
trigger1 = SC, NA, SA
(역시 틀린 것 같네요. trigger1 = hitdefattr = SC, NA, SA 이겠죠)
서서나 앉아서 공격이어야 하고 노멀공격이거나 스페셜공격(기술)일 때
------------------------------------------------------------
HitFall
------------------------------------------------------------
맞는 스텟에 있을 때 다운이 되는 상태라면 1값을 반환하고 그렇지 않으면 0값을 줍니
다. 예를들어 Hitdef의 fall 값이 1인 경우 그공격에 맞으면 Hitfall 값은 1이 됩니다.
예)
trigger1 = !HitFall
다운이 안될때(또는 다운되는 스텟으로 가게 하지 않을때)
------------------------------------------------------------
HitOver
------------------------------------------------------------
hitdef의 hittime 이 다되면 1값을 돌려줍니다. gethitvar(hittime)값이 0을 향해 계
속 줄어드는데 이 값이 0이 될 경우 1값을 돌려주는 듯.
주로 common1.cns 의 맞는 스텟들에 쓰였습니다
예)
trigger1 = HitOver = 1
hittime 이 만료될 경우. 뒤의 = 1 은 생략해도 됩니다. 반대로 쓰고싶으면
!hitover 로 씁니다.
------------------------------------------------------------
HitPauseTime
------------------------------------------------------------
공격을 맞췄을 때 hitdef의 pausetime 값으로 정해지고 그후로 값이 1/60 초당 1씩 줄어들
어 0으로 향합니다.
If ignorehitpause is not set, this will always return 0.
ignorehitpause 가 정해지면 줄지 않을수도 있다는데 아마 ignorehitpause = 0 으로 설정이
되면 hitpausetime 값이 줄지 않는다는 뜻인 듯한데 ignorehitpause=0을 쓸 이유가 없죠.
이 Hitpausetime은 히트경직중에 값이 변하기 때문에 ignorehitpause = 1을 붙여서 쓰는게
일반적입니다. ignorehitpause 는 11-CNS명령 파일의 처음부분에 설명되어있습니다.
예)
trigger1 = HitPauseTime = 0
공격의 경직이 끝났을 때.
또한 이 Hitpausetime 은 공격을 맞춘 직후 상대의 머리에서 피가 나게 한다거나 하는 효
과를 줄 때 등에 쓸수 있습니다.
예를들어 pausetime 이 15인 공격일 경우 trigger1 = Hitpausetime = 14 로 하면 공격을
맞춘 직후 라는 뜻이 되는데 ignorehitpause = 1과 같이 써야 합니다. 제캐릭터 진념의
강발 등에 쓰였습니다.
------------------------------------------------------------
HitShakeOver
------------------------------------------------------------
공격당했을때 경직이 끝나면 1을 반환, 안그러면 0을 반환합니다.
Hitdef의 pausetime의 경직을 말합니다. common1.cns의 맞는 스텟들에 쓰였습니다.
Example:
trigger1 = HitShakeOver = 0
맞아서 경직된 상태일 때
------------------------------------------------------------
HitVel
------------------------------------------------------------
공격에 맞았을 때 밀려나는 속도
hitvel x 는 x속도, hitvel y 는 y속도입니다.
원문에서는 각 값이 +인게 뒤로 밀려나거나 뜨는 거라고 나와있지만 틀렸군요.
다른것과 마찬가지로 두 속도가 -이면 뒤로 밀려나거나 위로 뜨는 겁니다.
이 값은 맞은 공격의 Hitdef에 설정된 값을 그대로 가져오게 되며 다음 Hitdef에 맞기
전까진 값이 유지됩니다.
예를들어 지상에서 ground.velocity = -13 인 Hitdef에 맞으면 Hitvel x = -13이 됩니다.
예)
trigger1 = HitVel X < -10
밀려나는 x속도가 -10 보다 작을때
------------------------------------------------------------
ID
------------------------------------------------------------
플레이어들의 ID값이며 각 플레이어는 고유의 ID값을 가집니다. 근데 1:1대전과 2:2대전
시의 값이 틀리고 어디다 쓰라는건지 모르겠습니다.
예)
value = ID
값을 ID값으로 해라
------------------------------------------------------------
IfElse
------------------------------------------------------------
조건을 검사해서 만족할때와 그렇지 않을 때 각각 다른 값을 줍니다. 쓸모가 많습니다.
형식
IfElse(조건, 조건만족시의값, 조건불만족시의값)
예)
value = ifelse(var(3),1,2)
var(3)의 값이 0이 아니면 값을 1로 정하고 그렇지않으면 2로 정해라.
주의할점은 조건을 쓸 때 enemynear, 같이 ','(콤마)가 들어가는 조건을 쓸 경우 괄호를
하나 더 쳐서 쓰지 않으면 에러나서 튕깁니다.
예를들어 ifelse(enemynear,statetype=C,-30,-50) 이렇게 쓰면 에러가 나므로
ifelse((enemynear,statetype)=C,-30,-50) 이렇게 써야 에러가 안납니다.
------------------------------------------------------------
InGuardDist(윈무겐 전용입니다 웬만하면 쓰지 맙시다)
------------------------------------------------------------
Returns 1 if the player is within guarding distance of an opponent's physical or
projectile attack. The guarding distance is the value of the guard.dist parameter of
the opponent's HitDef. Returns 0 if out of guard distance, or the opponent is not
attacking.
guard.dist안에 있을 경우 1값을 반환하며 그렇지않으면 0값을 반환합니다. guard.dist값은
Hitdef의 것을따른다고 하는데 Cns처음부분의 attack.dist에도 영향을 받는 듯
윈무겐의 common1.cns 의 가드하는 스텟들에 쓰였군요
------------------------------------------------------------
IsHelper
------------------------------------------------------------
헬퍼인지 아닌지 검사합니다. 괄호안에 아이디를 쓸수도 있습니다.
CNS에서 나오지만, 헬퍼의 아이디는 헬퍼를 생성할 때 정해줄수 있습니다.
예)
1. trigger1 = !IsHelper
헬퍼가 아닐 경우
2. trigger1 = IsHelper(1234)
ID 가 1234인 헬퍼일 경우
------------------------------------------------------------
IsHomeTeam
------------------------------------------------------------
홈팀일 경우 1, 안그러면 0값을 줍니다.
아케이드모드에서는 CPU가 홈팀이 됩니다만 버서스 모드에서는 1P쪽의 캐릭터들이 홈팀이
됩니다. AI를 만들 때 필요한 것 같지만 버서스모드에선 1P가 홈팀이 돼버리는 문제 때문에
대체 어디다 쓰라고 있는 트리거인지 모르겠군요.
예)
trigger1 = ishometeam
음...너무 간단해서 원문에도 사용예는 나와있지 않군요. 앞으로 이런건 설명안해도 되겠죠?
------------------------------------------------------------
Life
------------------------------------------------------------
플레이어의 현재 체력
예)
trigger1 = life <= 10
체력이 10 이하일 때
------------------------------------------------------------
LifeMax(윈무겐전용. 역시 안쓰길 권장)
------------------------------------------------------------
플레이어의 cns의 life =? 값입니다. 체력 최대치를 뜻합니다.
------------------------------------------------------------
Log
------------------------------------------------------------
로그값을 구하는 삼각함수입니다. 수학책을 보시는게 나을 듯.
예를들면 log(2,64) 는 64의 2에대한 로그값?을 구하는것인데, 2를 몇면 제곱해야 64가
나오느냐 하는것이므로 값은 6.0이 됩니다.
Takes two arguments a and b, and returns the base-a logarithm of b.
Format:
Log(exp1,exp2)
Arguments:
exp1
Expression giving the base of the logarithm. Must be positive.
exp2
Expression giving the value to take the logarithm of. Must be
positive.
Return type:
float
Error conditions:
Returns SFalse if either of exp1 or exp2 evaluates to SFalse, or if
either of exp1 or exp2 is not positive.
Example:
value=log(2,64)
Sets value to the base 2 log of 64, which is 6.0.
------------------------------------------------------------
Ln
------------------------------------------------------------
역시 프로그래밍 하는 사람들은 삼각함수까지 알아야 하나 봅니다. ln값을 구합니다.
ln이 아마 지수가 10인 로그던가? 역시 수학책을 봅시다.
Returns the natural logarithm of its argument. This produces slightly
more accurate results than the otherwise equivalent expression
log(e,(argument)).
Format:
ln(exprn)
Arguments:
exprn
Expression to compute the natural logarithm of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn is not
positive.
Example:
value = ln(time)
Sets value to the natural logarithm of the player's statetime.
------------------------------------------------------------
Lose
------------------------------------------------------------
졌을 경우 1 안그러면 0을 줍니다만 3가지가 있습니다.
형식
1. Lose - 아무 상황으로나 졌을때
2. LoseKO - 체력이 바닥나서 졌을때
3. LoseTime - 시간이 다돼서 졌을때
예)
1. trigger1 = Lose
졌을때
2. trigger1 = !LoseKO
타임오버로 졌거나 이겼을 때
------------------------------------------------------------
MatchNo
------------------------------------------------------------
몇번째 스테이지냐 하는것입니다.
버서스 모드에서는 무조건 값이 1이 됩니다.
예)
예) trigger1 = matchno > 3
3스테이지를 통과한 이후. 즉 4스테이지 이후부터. 제캐릭터 드레이븐에서 레벨업이후
체력증가에 쓰였습니다.
------------------------------------------------------------
MatchOver
------------------------------------------------------------
스테이지가 끝나면 값이 1이 되고 안그러면 0이 됩니다.
그러니까 3판2승제라면 2번째 이긴 라운드에서 승리포즈취하기 직전까진 0이고
승리포즈를 취함과 동시에 1이 됩니다.
윈무겐에선 도스무겐보다 좀 빨리 1이 되는데 승자가 결정되기 전에 1이 됩니다.
예)
trigger1 = matchover
스테이지 끝나고 승리포즈 취한후
------------------------------------------------------------
MoveContact
------------------------------------------------------------
공격이 상대에게 닳았을 경우(히트하거나 가드했을 때) 1, 안닳으면 0이 됩니다. 스텟이 넘
어갈 경우 0으로 초기화됩니다.
하지만 주의할점은 Movecontact와 이 밑의 movehit, moveguarded 는 만족할 경우
도스무겐에서는 값이 1로 유지되지만 윈무겐에서는 1,2,3,4 식으로 계속 증가합니다.
따라서 윈무겐에서도 캐릭을 쓰려면 movecontact = 1 대신, movecontact > 0 으로
써주어야 합니다. 밑의 movehit, moveguarded 도 같습니다.
예)
trigger1 = MoveContact > 0
공격이 닳았을 때
------------------------------------------------------------
MoveGuarded
------------------------------------------------------------
공격을 상대가 가드했을 경우 1, 안그러면 0이 됩니다.
예)
trigger1 = MoveGuarded > 0
공격이 막혔을 경우
------------------------------------------------------------
MoveHit
------------------------------------------------------------
공격이 히트했을(맞았을) 경우 1, 안그러면 0값을 반환합니다.
예)
trigger1 = MoveHit > 0
공격을 맞췄을 경우
------------------------------------------------------------
Movereversed(윈무겐 전용입니다. 웬만하면 쓰지 맙시다)
------------------------------------------------------------
공격이 리버설된 경우 1, 안그러면 0값을 반환합니다(원문엔 0이 아닌값을 준다고 돼있는데
1값을 줍니다). Hitdef의 Reversaldef명령에의해 리버설된 경우를 말합니다.
예)
trigger1 = MoveReversed
P1의 공격이 P2에 의해 리버설된 경우
------------------------------------------------------------
MoveType(*,***)
------------------------------------------------------------
플레이어의 movetype 입니다.
예)
trigger1 = movetype != H
movetype 이 H가 아닐 경우(맞는상태가 아닐경우)
------------------------------------------------------------
Name(*,***)
------------------------------------------------------------
DEF파일에 쓰여있는 캐릭터의 NAME을 검사합니다.
캐릭터간 인트로를 만들 때 authorname과 enemy, 같은 것들과 같이 쓰입니다.
enemy, 같은것들은 이 문서 맨 마지막 부분에 설명되어 있습니다.
예)
trigger1 = Name = "Kyo99"
캐릭터명이 kyo99 일 때.(하지만 이렇게 자체적으론 거의 안쓰이죠. 자기이름 검사해서
뭐합니까...)
------------------------------------------------------------
NumEnemy
------------------------------------------------------------
적의 숫자입니다. 중립플레이어와 노멀헬퍼는 포함되지 않음. 중립 플레이어란게 뭔지
모르겠네요. 헬퍼생성시 헬퍼타입을 player로하면 적숫자에 포함되는 듯 하지만 헬퍼타입
player를 쓰지 말라고 sctrl.txt파일에 나와있습니다.
trigger1 = NumEnemy = 2
trigger1 = enemynear(1), name = "Squash"
적의 수가 2명일 때. 2번째로 가까이 있는 적의 이름이 Squash 일 경우
------------------------------------------------------------
NumExplod
------------------------------------------------------------
cns에서 효과 스프라이트를 내는 명령인 explod가 있는데 그 명령에 의해 생긴
explod의 수를 검사합니다. 괄호를 쳐서 ID를 검사할수도 있습니다.
예)
1. trigger1 = NumExplod >= 4
자기가 발생시킨 모든 explod개수가 4개 이상일 경우
2. trigger1 = NumExplod(1234) >= 4
ID가 1234인 Explod의 개수가 4개 이상일 경우
------------------------------------------------------------
NumHelper
------------------------------------------------------------
발생시킨 헬퍼의 개수. 역시 괄호를 쳐서 아이디로 검사가능합니다.
헬퍼에서 발생시킨 헬퍼라도 개수에 포함됩니다. 즉 플레이어가 근원인 전체 헬퍼 개수.
예)
1. trigger1 = NumHelper < 2
헬퍼개수가 2개 미만일때
2. trigger1 = NumHelper(1234) < 2
ID가 1234인 헬퍼의 개수가 2개 미만일 때
------------------------------------------------------------
NumPartner
------------------------------------------------------------
파트너의 수. 역시 뉴트럴 플레이어와 노멀헬퍼는 고려되지 않는다네요.
예)
trigger1 = NumPartner = 1
trigger1 = partner, life < 200
파트너가 1명 있고 그 파트너의 체력이 200미만일 때
------------------------------------------------------------
NumProj
------------------------------------------------------------
cns명령인 projectile로 발생시킨 프로젝타일 개수. 주의점은 헬퍼에서 만든 프로젝타일일
지라도 본체캐릭터의 소유가 되므로 헬퍼에서 검사할땐 root, numproj 처럼 써야 합니다.
예)
trigger1 = NumProj = 0
프로젝타일이 없을 경우
------------------------------------------------------------
NumProjID
------------------------------------------------------------
위와 같지만 아이디로 검사합니다.
예)
trigger1 = NumProjID(1234) = 1
ID 번호가 1234인 프로젝타일이 1개일 때
------------------------------------------------------------
NumTarget
------------------------------------------------------------
타겟 개수. 공격을 맞췄고(막아도됨) 맞은 상대가 movetype = H일 경우 타겟에
포함됩니다. 상대의 movetype 이 H가 아닐 경우엔 타겟에서 벗어납니다.
괄호를 쳐서 아이디로 검사할수도 있습니다.
자기가 맞춘 대상만 포함되므로 헬퍼같은게 맞춘 대상은 본체나 다른 헬퍼의 타겟에
포함되지 않습니다.
예)
1. trigger1 = Numtarget >= 1
공격에 닳은 상태의 상대가 1명 이상일 때
2. trigger1 = Numtarget(200) >= 1
ID 200의 공격에 닳은 상태의 상대가 1명 이상일 때
------------------------------------------------------------
P1Name(*,***)
------------------------------------------------------------
This is an alias for the Name trigger. See "Name".
이름. Name 과 뭐가 틀린지 모르겠습니다.
------------------------------------------------------------
P2BodyDist
------------------------------------------------------------
상대와 거리인데 p2bodydist x는 플레이어의 앞쪽 몸체너비부터 상대의 앞쪽 몸체너비
까지의 거리입니다. 앞쪽 몸체너비란 front.width 값을 말하는데 cns처음부분의
ground.front(지상에 있을 때) 와 air.front(공중에 있을 때) 값에 따라 정해집니다.
p2bodydist y는 p2dist y랑 값이 같게 나오는데 어떨때 틀리게 나오는지 모르겠군요.
p2bodydist 값이 -일 경우 상대보다 위쪽에 있는걸 뜻합니다.
그런데 p2가 들어가는 트리거들의 경우 2명이상의 상대와 싸울 때 가장 가까이 있는
상대를 기준으로 하긴 하지만 그게 제대로 작동하지 않고 멀리있는 상대를 기준으로
돼버릴 때도 있습니다. 이 문제는 윈무겐의 docs폴더의 파일에도 나와있긴 한데 정확히
고쳐졌다고 나와있진 않습니다. 따라서 상황에 따라 enemynear, 같은 명령어를 쓰는게
더 나을 듯 합니다.
별로 중요하지 않지만, 값은 실수입니다.
Details:
For comparing the Y-distance, P2BodyDist gives the difference in the
heights of the players' Y-axes. A negative value means that P2 is
above P1.
For comparing the X-distance, P2BodyDist gives the
X-distance of P2's front from P1's front. So, if the
players are standing right next to each other, then
P2BodyDist is 0. Remember that you can set the width of
the player in "front.width", etc. under [Size] in the
player variables.
See also P2Dist.
예)
trigger1 = P2BodyDist X < 30
플레이어의 몸체앞쪽너비부터 상대몸체앞쪽너비까지 거리가 30픽셀 미만일 경우
------------------------------------------------------------
P2Dist
------------------------------------------------------------
플레이어의 x축과 상대 x축 까지의 거리입니다.
p2dist y는 p2bodydist y 랑 뭐가 틀린지 모르겠습니다. 설명도 같네요.
Details:
For comparing the Y-distance, P2Dist gives the difference in the
heights of the players' Y-axes. A negative value means that P2 is
above P1.
For comparing the X-distance, P2Dist gives the X-distance
of P2's axis from P1's axis. A positive value indicates P2
is in front of P1.
See also P2BodyDist.
Example:
trigger1 = P2Dist Y <= -12
상대보다 12픽셀 이상 높이 있을 때
------------------------------------------------------------
P2Life
------------------------------------------------------------
상대의 체력입니다. 적이 2명이상일 경우 가까이 있는 적의 체력을 검사합니다.
------------------------------------------------------------
P2MoveType
------------------------------------------------------------
상대의 movetype을 검사.
------------------------------------------------------------
P2Name(*,***)
------------------------------------------------------------
상대의 def파일에 있는 name을 검사. 역시 2인대전시는 가까이있는쪽의 name을 검사하
게 되고 상대가 1명이 ko됐으면 살아있는 상대의 name을 검사합니다.
상대가 모두 ko돼서 바닥에 쓰러진 경우 값은 0(false)이 됩니다.
------------------------------------------------------------
P2StateNo
------------------------------------------------------------
상대의 stateno(스텟넘버)를 검사
------------------------------------------------------------
P2StateType
------------------------------------------------------------
상대의 statetype을 검사
------------------------------------------------------------
P3Name(*,***)
------------------------------------------------------------
같은편의 name을 검사합니다. 같은편이 ko된 상태라도 작동합니다.
같은편이 없는 경우에만 무조건 0(false)값을 줍니다.
------------------------------------------------------------
P4Name(*,***)
------------------------------------------------------------
상대가 2명 이상일 때 더 멀리있는 상대의 name을 검사합니다. 상대가 ko당했어도
작동합니다.
상대가 1명이면 값은 무조건 0.
------------------------------------------------------------
PalNo
------------------------------------------------------------
캐릭터의 팔렛번호
캐릭을 고를 때 선택되는 def파일에 나와있는 대로의 팔렛번호 입니다.
DEF에도 설명돼있지만
A - 1 B - 2 C - 3 X - 4 Y - 5 Z - 6 이고 스타트버튼을 누를 경우 6이 더해
지며, 해당팔렛이 없을 경우엔 그다음 팔렛으로 선택됩니다.
예를들어 스타트버튼을 누른채 B버튼을 눌렀는데 8번팔렛부터 12번 팔렛까지 없다면 1번
팔렛이 골라지며 1번팔렛을 이미 골랐다면 2번팔렛으로 되는 식입니다.
예)
trigger1 = PalNo = 5
팔렛번호가 5일 때
이 트리거는 sanderx씨의 캐릭에 쓰였는데 어느 버튼으로 고르냐에 따라서 캐릭의 버전이
바뀌는걸 구현했습니다.(하지만 복잡하다는 단점이 더 크죠)
------------------------------------------------------------
ParentDist
------------------------------------------------------------
헬퍼에서만 쓰이는 트리거. 자신을 만든 부모와 자신과의 거리.
parentdist x 는 부모의 x축과 자신의 x축간의 거리이고 parentdist y로 하면 y축간의
거리입니다.
예)
trigger1 = ParentDist X != 0
부모와의 x위치가 다를때(조금이라도 떨어져있을 경우)
------------------------------------------------------------
Pi
------------------------------------------------------------
Pi값인 3.141593을 나타냅니다. 이것도 무슨 고급 물리나 수학에서 나오는듯.
This trigger returns the numeric value of pi (3.141593...)
Format:
pi
Arguments:
none
Return type:
float
Error conditions:
none
------------------------------------------------------------
Pos
------------------------------------------------------------
플레이어의 x,y축을 기준으로 현재 플레이어의 위치를 검사합니다.
pos x는 x위치, pos y는 y위치를 검사합니다.
화면의 정중앙이 pos x = 0 이며 왼쪽으로 갈수록 -, 오른쪽으로 갈수록 +가 됩니다.
스테이지의 바닥은 pos y = 0이며 위로 갈수록 -, 밑으로 갈수록 +가 됩니다.
중요하진 않지만 값은 실수
예)
trigger1 = Pos Y >= 0
플레이어의 y축 위치가 스테이지 바닥밑으로 내려갔을 때
(주로 넘어지는 스텟에 쓰입니다)
------------------------------------------------------------
Power
------------------------------------------------------------
기(파워)게이지의 양을 검사. 1000이 기 한칸입니다.
예)
trigger1 = power >= 1000
기게이지 레벨이 1이상일 때
------------------------------------------------------------
PowerMax(윈무겐전용)
------------------------------------------------------------
CNS처음부분의 power =? 값입니다. 기(파워)게이지의 최대치. 보통 3000(Lv3)입니다.
------------------------------------------------------------
PlayerIDExist
------------------------------------------------------------
해당 ID를 지닌 플레이어가 존재하느냐 인데 앞서 말했듯 ID값은 몇 명 대전을 하느냐에
따라 달라지므로 쓰기 어정쩡.
예)
trigger1 = PlayerIDExist(var(4))
var(4)와 같은 ID의 플레이어가 존재할 경우
------------------------------------------------------------
PrevStateNo
------------------------------------------------------------
바로이전 스텟번호를 검사
예)
trigger1 = prevstateno = 100
직전 스텟넘버가 100(달리기)이었을 경우
------------------------------------------------------------
ProjCancelTime
------------------------------------------------------------
처음 값은 -1 이며 프로젝타일이 상대프로젝타일에 의해 사라지는 경우 이 값이 0으로
설정된 후 1프레임당 1씩 계속 증가하게 됩니다.
프로젝타일이 사라질땐 Hitflag = P가 들어가는 hitdef에 의해 사라질수도 있는데 이경우엔
ProjCancelTime 에 영향을 주지 않습니다.(그러니까 상대 프로젝타일에 의해 사라진 경우
만 projcanceltime값이 증가합니다.)
괄호안에 검사할 프로젝타일의 아이디를 쓰는데 0을 쓸 경우 프로젝타일의 아이디를
체크하지 않습니다. 즉 projcanceltime(0)은 플레이어의 프로젝타일중에 아무거나가
상쇄되면 0,1,2... 이렇게 증가합니다.
예)
1. trigger1 = ProjCancelTime(1234) = 1
ID 1234의 프로젝타일이 상대 프로젝타일에 의해 사라진 직후
2. trigger1 = ProjcancelTime(0) != -1 && ProjcancelTime(0) < 15
아무 프로젝타일이 상쇄된 후 15프레임 이내
------------------------------------------------------------
ProjContact(*,***)
------------------------------------------------------------
프로젝타일이 상대에게 닳으면 True(1)값을 줍니다. 뒤에 괄호를 치지 않고 아이디번호
를 쓸수있는데, 아이디번호를 쓰지 않거나 0으로 하면 역시 아무 프로젝타일이 닳으면
true값을 줍니다. 프로젝타일이 닳은 후 True값이 된 후엔 값이 바로 0으로 돌아옵니다.
그런데 이상한 것은 trigger1 = projcontact = 1에서 값을 1이상의 아무 숫자로 줘도
마찬가지입니다. projcontact = 2 나 projcontact = 15 이렇게 줘도 projcontact = 1과
같게 작동하는군요. 분명히 설명에선 1이나 0이라고 했는데 말이죠.
그리고 밑의 두 번째 형식처럼 쓸수 있는걸 보니 각 프레임마다 값이 존재하는 듯 하며
이때문인지 Displaytoclipboard명령으로 볼수가 없어서 애매하군요(에러남)
형식
1. ProjContact[ID] = value
2. ProjContact[ID] = value, [oper] value2
이렇게 쓸수도 있는데 뜻은 아래 Details에 나와있습니다만 해석이 애매해서 원문을
놔뒀습니다.
Arguments:
[ID]
Optional ID number.
value (boolean)
Value to compare against. 0 for false, 1 for true.
[oper]
=, !=, <, >, <=, >=
value2
Time value to compare against.
Return type:
boolean int
Details:
ProjContact will trigger once for each hit of the projectile, so a
multi-hit projectile can trigger multiple times.
The first form of ProjContact shown above is only valid for one tick
after contact, unlike MoveContact.
For the second form, ProjContact returns true if the projectile made
contact n ticks ago, where n is a nonnegative number satisfying the
relation "n [oper] value2".
Specifying an ID number of 0 gives the same behavior as if the ID
number is omitted (check all projectiles).
(원문의 boolean은 불 논리 연산=피연산자가 가능(可) 불가능(不) 으로 결과가 나오는
이라고 사전에 나와있군요. 0-불가능 1-가능 이런식입니다)
예)
1. trigger1 = ProjContact1234 = 1
ID 1234의 프로젝타일이 상대에게 막 닳았을 때(닳은 직후)
2. trigger1 = ProjContact456 = 0, < 15
이전 15프레임 내에 ID 456의 프로젝타일이 닳지 않았다면(모르겠으면 cns에서
실험해보거나 밑의 projhit나 projguarded를 보시길)
------------------------------------------------------------
ProjContactTime
------------------------------------------------------------
형식과 값의 변화는 위 projcanceltime과 같지만 이것은 프로젝타일이 닳았을 경우 값이
0,1,2... 이런식으로 증가합니다.
예)
1. trigger1 = ProjContactTime(1234) = 1
아이디 1235의 프로젝타일이 닳은 직후
2. trigger1 = ProjContactTime(0) != -1 && ProjContactTime(0) < 15
아무 프로젝타일이 닳은 후 15프레임 이내
------------------------------------------------------------
ProjGuarded(*,***)
------------------------------------------------------------
projcontact와 같지만 이건 프로젝타일이 막혔을때(가드당했을때)를 감지합니다.
형식 설명도 projcontact와 같군요.
예)
1. trigger1 = ProjGuarded1234 = 1
아이디 1235의 프로젝타일이 가드당한 직후
2. trigger1 = ProjGuarded = 1, < 15
이전 15프레임 사이에 아무프로젝타일이 가드당했을 때
(바꿔말하면 프로젝타일이 가드당한 후 15프레임 이내)
------------------------------------------------------------
ProjGuardedTime
------------------------------------------------------------
역시 projcanceltime과 같지만 프로젝타일이 가드당했을 때 값이 0,1,2...식으로 증가.
예)
1. trigger1 = ProjGuardedTime(1234) = 1
아이디 1235의 프로젝타일이 가드당한 직후
2. trigger1 = ProjGuardedTime(0) != -1 && ProjGuardedTime(0) < 15
아무 프로젝타일이 가드당한후 15프레임 이내
------------------------------------------------------------
ProjHit(*,***)
------------------------------------------------------------
마찬가지로 projcontact 등과 같지만 프로젝타일이 맞았을때(히트했을때)를 감지합니다
예)
1. trigger1 = ProjHit1234 = 1
아이디 1234의 프로젝타일이 히트한 직후
2. trigger1 = ProjHit1234 = 1, < 15
이전 15프레임 이내에 아이디 1234의 프로젝타일이 히트했을 때
(역시 바꿔말하면 아이디 1234의 프로젝타일이 히트한 후 15프레임 이내)
------------------------------------------------------------
ProjHitTime
------------------------------------------------------------
이하동문. projcanceltime 등과 마찬가지지만 이것은 프로젝타일이 히트했을 때 값이
0,1,2... 식으로 증가합니다.
예)
1. trigger1 = ProjHitTime(1234) = 1
아이디 1234의 프로젝타일이 히트한 직후
2. trigger1 = ProjHitTime(0) != -1 && ProjHitTime(0) < 15
아무 프로젝타일이 히트한 후 15프레임 이내
------------------------------------------------------------
Random
------------------------------------------------------------
랜덤수를 발생시킵니다. 수는 0부터 999사이에 정해집니다.
이 Random이란 글자가 나올때마다 무겐은 랜덤수를 만듭니다.
예)
trigger1 = Random <= 249
랜덤값이 249이하일 때(즉 25%확률로 라는 뜻이 됩니다.)
------------------------------------------------------------
RootDist
------------------------------------------------------------
헬퍼에만 사용되는 트리거. 자신을 만든 근원의 x,y축 부터 자신의 x,y축까지의 거리를
구합니다.
Rootdist x는 가로거리, Rootdist y는 세로거리입니다.
예)
trigger1 = RootDist X != 0
루트의 x위치와 다를 때
------------------------------------------------------------
RoundNo
------------------------------------------------------------
라운드 번호입니다.
예)
trigger1 = RoundNo = 3
3라운드일때
------------------------------------------------------------
RoundsExisted
------------------------------------------------------------
자신이 싸운 라운드가 몇번 있었냐 하는겁니다. 첫 라운드의 값은 0이 되며 스테이지
넘어가도 0이 됩니다.
이것은 Turns모드에서의 인트로를 만들 때 유용합니다.
예)
trigger1 = RoundsExisted = 0
trigger1 = TeamMode = Turns
trigger1 = RoundNo > 0
자신이 싸우는 첫 라운드이고 게임모드가 Turns일 때. 3번째 조건은 1라운드 이후일
때 라는건데 당연한 것이니까 무의미한 조건인 것 같군요.
당신은 이 예를 사용하여 초기화 스텟인 5900(라운드 처음 시작시 맨처음 시작스텟)에
changestate명령과 같이써서 팀모드 인트로를 만들 수 있다. 고 하는군요.
------------------------------------------------------------
RoundState
------------------------------------------------------------
라운드의 상태를 나타내는데 라운드 시작시 0부터 시작해서 라운드 끝나면 4가 됩니다.
각 값이 나타내는 것은 다음과 같습니다.
Details:
0: 화면이 페이드인 될 때(맨처음 라운드 시작시 화면 밝아지는 순간)
1: 캐릭터가 인트로(등장 포즈나 이벤트대사 등)를 할때
2: 캐릭터가 싸울때(라운드 x 파이트! 란 글자가 뜬 후)
3: 라운드가 끝났을 때.(캐릭터의 체력이 바닥나거나 타임오버 됐을때
4: 캐릭터가 승리포즈를 취할 때
예)
trigger1 = RoundState = 2
싸우는 중일 때
------------------------------------------------------------
ScreenPos
------------------------------------------------------------
화면의 왼쪽 위 구석부터 얼마만큼의 위치에 있느냐 하는것입니다.
왼쪽 구석이 screenpos x = 0이 되고 오른쪽으로 갈수록 값이 +가 되고 왼쪽으로 갈수록
-가 됩니다.
화면의 맨위 꼭대기가 screenpos y = 0이 되고 밑으로 갈수록 값이 +되고 위로갈수록
-됩니다.
예)
trigger1 = ScreenPos Y = [0,239]
캐릭터 y위치가 화면 꼭대기부터 밑으로 239 픽셀 내에 있을 때
------------------------------------------------------------
SelfAnimExist
------------------------------------------------------------
Animexist와 같은데 animexist는 맞아서 상대방의 스텟에 가있는 경우 그 상대의 AIR파일
을 검사하기 때문에 대부분 이 selfanimexist를 씁니다.
예) trigger1 = selfanimexist(200)
애니매이션번호 200이 존재할때
------------------------------------------------------------
Sin
------------------------------------------------------------
삼각함수의 sin값을 구합니다.
Computes the sine of the specified argument (in radians.)
Format:
sin(exprn)
Arguments:
exprn
Expression to compute the sine of. (float)
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = sin(pi/2)
Sets value to the sine of pi/2, which is approximately 1.0
(possibly with some rounding error.)
------------------------------------------------------------
StateNo
------------------------------------------------------------
스텟넘버를 검사
예)
trigger1 = stateno = [200,650]
스텟번호가 200~650 사이일 때
------------------------------------------------------------
StateType
------------------------------------------------------------
스텟타입을 검사. S,C,A,L중에 하나죠.
예)
trigger1 = StateType != A
스텟타입이 A가 아닐때
------------------------------------------------------------
SysFVar
------------------------------------------------------------
무겐의 변수중에 var와 fvar말고도 sysvar(정수)와 sysfvar(실수)가 있습니다.
현재 윈무겐까지는 sysvar(0), sysvar(1), sysvar(2) 만이 common1.cns 에 사용되었습니다.
원문엔 쓰지 말라고 하는 듯. 원문입니다.
This trigger takes a mandatory variable number as an argument. It
returns the value of the player's specified system float variable.
This trigger should NOT be used under normal circumstances. System
variables are reserved for bookkeeping in common1.cns.
(cns)근데 상대캐릭터를 특정 스텟으로 강제로 이동시킨후에 var를 써야만하는 경우가 있
는데 그냥 var를 쓰면 맞은 캐릭터의 var를 바꿔버리므로 안되니까 그럴 땐 이 sysvar(4)
같은걸 쓰도록 합시다.
sysvar나 sysfvar나 0-4 까지 쓸수 있습니다.
예)
trigger1 = SysFVar(0) = -1.23
sysfvar(0)이 -1.23일 경우
------------------------------------------------------------
SysVar
------------------------------------------------------------
sysfvar는 실수변수지만 sysvar는 정수변수입니다. 역시 0-4 까지 쓸수있긴 한데 sysvar(0)
과 sysvar(1)과 sysvar(2)는 공통스텟(common1.cns)에 쓰였으므로 쓰면 안됩니다.
예)
trigger1 = SysVar(0) = -34
sysvar(0)이 -34일 경우
------------------------------------------------------------
Tan
------------------------------------------------------------
삼각함수 탄젠트값을 구합니다.
Computes the tangent of the specified argument (in radians.)
Format:
tan(exprn)
Arguments:
exprn
Expression to compute the tangent of. (float)
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = tan(pi/4)
Sets value to the tangent of pi/4, which is approximately 1.0
(possibly with some rounding error.)
------------------------------------------------------------
TeamMode(*,***)
------------------------------------------------------------
플레이의 모드값을 구합니다.
single - 싱글플레이
simul - 시뮬플레이
turns - 턴플레이
예)
trigger1 = TeamMode = Single
싱글플레이일때
------------------------------------------------------------
TeamSide
------------------------------------------------------------
라운드 시작시 1P쪽은 1이 되고 2P쪽은 2가 됩니다.
이 트리거는 기게이지를 표시한다든지 할 때 유용합니다.
예)
trigger1 = TeamSide = 2
2P쪽일 때
------------------------------------------------------------
TicksPerSecond
------------------------------------------------------------
실제시간 1초에 몇프레임인지 구합니다. 원래 60인데 게임속도를 slow 9로 하면 15가
되는군요.
예)
trigger1 = Time > 10 * TicksPerSecond
게임스피드에 상관없이 실제시간 10초 이후일 때
------------------------------------------------------------
Time
------------------------------------------------------------
스텟의 시간입니다.
스텟이 시작하면 0부터 시작해서 1프레임당 1씩 계속 증가합니다.
예)
trigger1 = Time = 2
타임이 2일 때. 란 뜻이긴 하지만 자세히 말하자면 time=2일때가 아니라 time=1에서
time=2로 넘어가는 순간을 뜻합니다.(animelem = ? 과 같음)
주의할점은 헬퍼에서 본체의 time을 검사할 경우엔 값을 1더해야 한다는 것입니다.
예. 헬퍼에서) trigger1 = parent, time = 3
부모의 time이 2일 때.
항상실행스텟인 [statedef -?]에서 검사할때도 값에 1을 더해야 합니다.
이렇게 해야하는 이유는 cns의 실행 순서가 일반스텟->헬퍼->항상실행스텟(statedef -?)
이기 때문인 것 같습니다.
* 마찬가지로 캐릭터가 스텟에 오자마자(time=0에) 적의 공격을 막는(가드스텟으로 가는)
경우가 있는데 이경우엔 만약 스텟시작하자마자 poweradd=-1000같은(필살기같은데
쓰이는)게 있을 경우 기만 날리고 기술은 안나가는 경우가 생길수 있습니다. 따라서 이런
상황을 막기 위해서 이런건 trigger1 = time = 1 이렇게 씁시다.
------------------------------------------------------------
TimeMod(*,**,***)
------------------------------------------------------------
스텟의 time을 나눈 나머지를 구합니다. %대신 쓰는게 추천된다고 하는군요.
형식
TimeMod [oper] divisor, value1
Arguments:
[oper]
=, !=, <, >, <=, >=
divisor (int)
나눌 수(0이 아니어야 함)
value1 (int)
나뉠 수
예)
trigger1 = TimeMod = 4, 3
스텟의 time을 4로 나눈 나머지가 3일 경우 그러니까 스텟타임이 각각 3, 7, 11, 15,
...일 경우를 뜻합니다. trigger1 = time%4 = 3과 같습니다.
근데 위에나온 부호인 <, >= 같은건 어떨 때 쓰는지 모르겠군요. 설명에 나온
위치대로 timemode < 4,3식으로 쓰면 에러나네요. timemod = 4, < 3이렇게 쓸수는
있습니다. 각자 실험해봅시다.;
------------------------------------------------------------
UniqHitCount
------------------------------------------------------------
한 스텟에서 공격이 히트한 횟수입니다. hitcount와 다른점은 공격이 2명이상의 상대에
게 맞았을 때 hitcount는 1만 증가하지만 이 uniqhitcount는 맞춘 수대로 증가합니다. 2명한
테 맞췄다면 2증가 이런식입니다.
예)
trigger1 = UniqHitCount = [4,6]
공격이 들어간 횟수가 총 4~6번 사이일 때
------------------------------------------------------------
Var
------------------------------------------------------------
무겐에서 쓸 수 있는 정수변수. var(0) ~ var(59) 까지 쓸수 있습니다.
예)
trigger1 = Var(0) = -34
var(0)이 -34일 경우
------------------------------------------------------------
Vel
------------------------------------------------------------
속도입니다. vel x는 x속도, vel y 는 y속도입니다.
예)
trigger1 = Vel Y >= 0
y속도가 0이상일 때(밑으로 떨어질 때)
------------------------------------------------------------
Win
------------------------------------------------------------
이겼는가를 뜻합니다. 다음의 4가지가 있습니다.
1. Win - 결과적으로 이겼는가
2. WinKO - ko로 이겼는가
3. WinTime - 타임오버로 이겼는가
4. WinPerfect - 퍼펙트로 이겼는가
예)
1. trigger1 = Win
이겼을 때
2. trigger1 = !WinKO
KO로 이기지 않은 경우
------------------------------------------------------------
1
------------------------------------------------------------
항상실행. 즉 trigger1 = 1 이렇게 쓰면 그 스텟 내에서 해당 명령을 계속 실행해라 하는
것이 됩니다.
주의할점은 trigger1 = 1을 쓰면 다른스텟으로 넘어가는 순간까지 해당명령이 실행되기
때문에 cns의 changestate명령이나 selfstate명령에 의해 스텟이 바뀐후에도
1프레임동안(다음스텟의 time = 0일때까지) 해당명령이 실행되게 됩니다.
따라서 정확히 그 스텟 내에서만 명령이 실행되게 하고 싶으면 trigger1 = animtime < 0
이런식으로 상황에 맞게 써줘야 합니다.
==== (여기까지 일단 트리거들 설명 끝이고 추가적으로) =========================
====================================================================
Trigger redirection
====================================================================
원래 exp.txt에 있는거지만 여기 있는게 나을 것 같아서 여기 써놨습니다.
트리거를 쓸 때 자기자신의 조건 말고도 헬퍼나 상대의 상태를 검사할수도 있습니다.
예를들어 trigger1 = time = ? 이러는 것 외에 trigger1 = parent, time = ? 이라고 하면
parent의 time값을 검사합니다. parent니 뭐니 하는건 밑에 설명.
쓸 수 있는 종류는 다음과 같습니다.
*) parent
자기자신을 만든 부모를 뜻합니다. 헬퍼에 쓰이는데 예를들어 캐릭터 A가 있고 A가 생성
시킨 헬퍼 B가 있고 헬퍼B에서 만든 헬퍼C가 있다고 쳤을때
B의 parent는 A가 되고 C의 parent는 B가 됩니다.
B의 스텟에서 trigger1 = parent, time = ? 이라고 하면 A의 스텟타임을 검사하는것입니다.
*) root
자신을 만든 근원(?). 위와 같은 상황에서 B와 C의 root는 A가 됩니다.
*) helper
자신이 만든 헬퍼를 뜻하는데 그냥 helper, 라고 쓰면 맨처음 만든 헬퍼를 뜻한다고
하네요. 그런데 그냥 helper, 로는 거의 쓰지 않고 밑과 같이 helper(ID)로 씁니다.
*) helper(ID)
헬퍼를 만들 때 아이디를 줄수있는데 그 아이디를 가진 헬퍼를 뜻합니다. helper(1234), 라
고 하면 ID 1234의 헬퍼를 뜻합니다.
*) target
공격을 맞춘(막아도 포함) 첫 번째 상대. 이것도 그냥 target으로는 거의 쓰지않고 밑처럼
ID를 줘서 씁니다. 상대의 movetype 이 H일경우에만 되며 상대 movetype이 H가 아닐
경우 타겟에서 벗어납니다.
원문: Redirects the trigger to the first target found.
첫 번째 상대라곤 하지만 2명이상이 같이 맞았을땐 아무 타겟이나 찍는군요.
*) target(ID)
공격판정을 낼 때 ID를 정해줄수 있는데 이걸 이용해 해당 공격에 맞은 타겟을 검사합니
다. target(200), 라고 쓰면 ID 200 인 공격에 맞은 타겟을 뜻합니다.
*) partner
2대2 대전 등을 할 때 같은편 파트너를 뜻합니다. 노멀 헬퍼와 뉴트럴 플레이어는 파트너
에 속하지 않는다고 하는데 하여튼 헬퍼를 제외한 같은편은 파트너로 간주됩니다.
*) enemy
첫 번째 적. 역시 노멀헬퍼와 뉴트럴플레이어는 간주되지 않는다는군요.
*) enemy(n)
괄호안의 숫자는 몇번째 적이냐 하는걸 뜻한다는데 써보지 않아서 정확한 건 모르겠군요.
첫 번째가 2p이고 두 번째가 4p쯤 되지 않을까 싶군요.
*) enemyNear
가장 가까이 있는 적
*) enemyNear(n)
n번째 가까이 있는 적. 0이 가장 가까이 있는적이고 1이 두 번째 가까이 있는 적인듯.
*) playerID(ID)
해당 아이디를 지닌 플레이어. ID를 보려면 displayclipboard 나 appendtoclipboard를 써
서 id를 봐야하는데 이 아이디가 1:1 할 때와 1:2 랑 2:2 할 때 각각 다르므로 대체 어디다
쓰는건지 모르겠습니다.
이들중 2가지이상 중복하여 쓰면 에러납니다. 예) root,target,time = ? 처럼 쓰면 에러.
===================================================================
트리거가 잘못될 경우 캐릭선택시 튕기거나 작은 잘못일 경우 디버그모드에서 흰색글씨로
나온다거나 하므로 메시지를 확인하고 해당부분이 왜 에러가 나는지 생각해서 제대로
고칩시다.
작은 잘못은 예를들어 trigger1 = target(10), stateno = 1031 이라고 썼는데 아이디 10인
타겟이 없을 경우 디버그모드에서 타겟이 없다고 흰색 글씨로 계속 뜨게 됩니다. 이럴
경우는
trigger1 = numtarget(10) > 0
trigger1 = target(10), stateno = 1031
이런식으로 고쳐줘야 합니다. numtarget(10) > 0이 항상 위에 있어야 하고 꼭 두줄로 써야
하며 한줄로 쓰면 마찬가지로 흰색글씨 뜹니다. 예를들어
trigger1 = numtarget(10) > 0 && target(10), stateno = 1031
이렇게 한줄로 묶어서 쓰지말고 꼭 위처럼 2줄로 써야 흰색글씨가 뜨지 않습니다.
이런 건 안고쳐도 게임엔 문제없지만 디버그모드사용시 흰색글씨가 계속뜨는게 보기 안좋으
므로 고치는 거랍니다.
선생님 : Ihoo1836트리거
(역시 용어가 애니매이션의 스프라이트를 뜻하는 '프레임'과 게임상의 1/60초를 뜻하는
'프레임'이 헷갈릴수 있어서 전자의 경우 그냥 '스프라이트'라고 했고 '프레임'이라고 한
경우는 1/60초를 뜻하는 경우만 사용했습니다.)
캐릭터의 동작을 만들기 위해선 명령어가 필요합니다. 예를들어 캐릭터를 앞으로 얼만큼 이
동시킨다든지 언제 공격판정을 만든다든지 하는 것 등인데 이 명령을 수행할 때 조건이 트
리거입니다. 원본파일은 docs폴더의 trigger.txt인데 모르는건 원문그대로.
윈무겐에서 달라진점은 윈무겐 docs폴더의 update.txt 파일을 보면 원문이 있습니다.
앞서도 설명했듯이 명령어의 구조가
[State 번호, ?] ;state 뒤의 번호는 암거나 써도 상관없으나 에러메세지가 뜰 때 알아보
;기 쉽게하기 위해 statedef 의 번호(스텟넘버)랑 맞춰주는게 일반적.
type = ? ;명령어
trigger? ;조건
~~~ ;추가 파라미터
이렇게 되는데 트리거에 쓰인 조건을 만족하면 그 명령이 실행된다는 것입니다.
예를 들어
[state 200]
type = posadd
trigger1 = time = 0
x = 10
이렇게 하면 스텟 시작하자마자 x축으로 10만큼 캐릭터를 앞으로 이동시켜라 하는 게
됩니다.
추가적으로 설명하자면 트리거의 값이 1이 될 경우 해당명령을 실행합니다.
조건인 time = 0을 만족할 경우 컴퓨터는 값 '1(true:맞음)'을 돌려주므로 결과적으로 저
문장은 'trigger1 = 1' 이 되서 해당명령이 실행되는 것입니다. 조건을 만족하지 않으면
컴퓨터는 값 '0(false:틀림)'을 돌려줍니다. 'trigger1 = 0'이 되면 해당명령은 실행되지
않습니다.
또한 triggerall 이라는게 있는데 무조건 만족해야 하는 트리거를 뜻합니다.
예를들어
triggerall = statetype = A
trigger1 = command = "a"
trigger2 = command = "b"
라고 하면 캐릭터가 무조건 스텟타입이 A이어야 하며, a나 b버튼을 눌렀을 때 라는 뜻이
됩니다.
트리거 뒤의 숫자는 차례대로 가야 합니다. 예를들어 trigger2 뒤에 trigger4가 써있으면
제대로 검사가 되지 않습니다.
그리고 디버그모드는 MUGEN.CFG에서 ALLOWDEBUGMODE = 1로 설정돼있으면 도스무
겐에선 ctrl + d 키로 되지만 윈무겐은 무겐실행시 winmugen.exe가 아닌 debug.exe로
실행을 해야 됩니다. 디버그 모드에서는 캐릭터의 애니매이션번호와 스텟번호. gametime과
스텟time, animtime, statetype, ctrl 등의 정보를 볼 수 있습니다.
ctrl+c를 누르면 캐릭터의 판정박스와 무적정보 등이 나옵니다.
만약 모르겠는 트리거가 있다면 CNS의 Displaytoclipboard명령과 appendtoclipboard명령을
사용하면 알수 있을것입니다.
그리고 반환되는 값을 말할 때 1이면 True값이고 0이면 False값이니까 설명되어있지 않아
도 이해하시길 바랍니다.
====================================================================
;여긴 원문그대로
This is an alphabetical index of function-type triggers. For details
on use of function-type triggers in expressions, see the expression
documentation. Unless otherwise specified, we will use P1 to represent
the player who is evaluating the trigger, and P2 to represent his
opponent (usually the closest opponent when in team mode).
Some triggers are nonstandard and cannot take expressions as their
arguments. These are marked with a (*) in the index. Some triggers are
deprecated; these are marked with a (**). Use of these triggers is not
encouraged, as support for them may be removed in future versions of
the engine.
Old-style triggers, marked (***), appear only in clauses of the form
(trigger) (relational operator) (value). See section 8 of exp.doc for
more details.
For all triggers, SFalse will be returned if the trigger is redirected
to a nonexistent destination, or if the ID number for the redirection
evaluates to SFalse. This is not listed in the error conditions for
each trigger.
트리거 목록입니다. 대문자로 쓰나 소문자로 쓰나 같습니다.
--------------------------
-Abs
-Acos
-Alive
-Anim
-AnimElem(*,***)
-AnimElemNo
-AnimElemTime
-AnimExist
-AnimTime
-Asin
-Atan
-AuthorName(*,***)
-BackEdgeBodyDist
-BackEdgeDist
-CanRecover
-Ceil
-Command(*,***)
-Const(*)
-Cos
-Ctrl
-DrawGame
-E
-Exp
-Facing
-Floor
-FrontEdgeBodyDist
-FrontEdgeDist
-FVar
-GameTime
-GetHitVar(*)
-HitCount
-HitDefAttr(*,***)
-HitFall
-HitOver
-HitPauseTime
-HitShakeOver
-HitVel
-ID
-IfElse
-InGuardDist(윈무겐전용)
-IsHelper
-IsHomeTeam
-Life
-LifeMax(윈무겐전용)
-Ln
-Log
-Lose
-MatchNo
-MatchOver
-MoveContact
-MoveGuarded
-MoveHit
-MoveReversed(윈무겐전용)
-MoveType(*,***)
-Name(*,***)
-NumEnemy
-NumExplod
-NumHelper
-NumPartner
-NumProj
-NumProjID
-NumTarget
-P1Name(*,***)
-P2BodyDist
-P2Dist
-P2Life
-P2MoveType(*,***)
-P2Name(*,***)
-P2StateNo
-P2StateType(*,***)
-P3Name(*,***)
-P4Name(*,***)
-PalNo
-ParentDist
-Pi
-PlayerIDExist
-PrevStateNo
-Pos
-Power
-PowerMax(윈무겐전용)
-ProjCancelTime
-ProjContact(*,***)
-ProjContactTime
-ProjGuarded(*,***)
-ProjGuardedTime
-ProjHit(*,***)
-ProjHitTime
-Random
-RootDist
-RoundNo
-RoundsExisted
-RoundState
-ScreenPos
-SelfAnimExist
-Sin
-StateNo
-StateType(*,***)
-SysFVar
-SysVar
-Tan
-TeamMode(*,***)
-TeamSide
-TicksPerSecond
-Time
-TimeMod(*,**,***)
-UniqHitCount
-Var
-Vel
-Win
위의 트리거중에 수학 트리거 목록
----------------------
-abs
-acos
-asin
-atan
-ceil
-cos
-e
-exp
-floor
-IfElse
-ln
-log
-pi
-sin
-tan
------------------------------------------------------------
Abs
------------------------------------------------------------
절대값을 구하는 트리거입니다.
형식
abs(절대값을 구할 값)
괄호안의 수가 정수라면 정수를, 실수라면 실수를 돌려줍니다.
-2의 절대값은 2이고 뭐 이런거 수학에서 나오는데 그거 같습니다만 써본적이 없습니다.
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
------------------------------------------------------------
Acos
------------------------------------------------------------
Computes the arccosine (in radians) of the specified argument.
무슨 삼각함수 라디안에 관련된 코사인 같은데 써본적도 없고 모르겠군요.
Format:
acos(exprn)
Arguments:
exprn
Expression to compute the arccosine of (float).
Return type:
float(실수. 영어원문에서 int는 정수, float은 실수를 뜻합니다)
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn is not in
the domain of arccosine (which is [-1.0,1.0]).
Example:
value = acos(1)
Sets value to the arccosine of 1, which is approximately 0.0
(possibly with some rounding error.)
------------------------------------------------------------
Alive
------------------------------------------------------------
플레이어가 살아있다면 1(true)값을 돌려주고 ko된 상황(체력이 0일때)이면 0을 돌려줍니다.
예)
trigger1 = alive = 0
플레이어가 ko됐을 때
------------------------------------------------------------
Anim
------------------------------------------------------------
플레이어의 애니매이션 번호를 검사합니다.
예)
trigger1 = Anim = 200
액션번호가 200 일때
------------------------------------------------------------
AnimElem(*,***)
------------------------------------------------------------
애니매이션의 몇번째 스프라이트인가를 검사합니다.
예를들어 air파일에서 다음과 같은 액션200이 있다고 칩시다.
[begin action 200]
0,0,0,0,4 - 첫 번째 스프라이트
0,1,0,0,5 - 두 번째 스프라이트
0,2,0,0,6 - 세 번째 스프라이트
이 됩니다.
형식
1. AnimElem = value1
2. AnimElem = value1, [oper] value2
[oper]에 들어가는 부호
=, !=, <, >, <=, >=
value1 (정수)
몇번째 스프라이트인가
value2 (정수)
그 스프라이트에서 몇프레임 째인가
예)
trigger1 = AnimElem = 2
애니매이션의 2번째 스프라이트 시작 직후를 뜻합니다. 그러니까 위의 액션200에서
스프라이트 0,1이 나올 때를 뜻합니다. 다음과 같이 써도 같은 뜻이 됩니다.
trigger1 = AnimElem = 2, = 0 (2번째 스프라이트의 1번째 프레임)
(정확히 말하자면 1번째 스프라이트가 끝나고 2번째 스프라이트로 넘어가는 순간!을 뜻
합니다.)
trigger1 = AnimElem = 2, = 4
2번째 스프라이트 시작 후 4프레임 지났을 때를 뜻합니다. 그러니까 위의 액션200에서
는 스프라이트 0,1이 끝나기 직전이 되겠네요.
(역시 정확히 말하자면 4프레임 지나고 5프레임으로 넘어가는 순간!을 뜻합니다.)
trigger1 = AnimElem = 2, >= 0
trigger1 = AnimElem = 3, < 0
2번째 스프라이트 시작 직후부터 3번째 스프라이트가 나오기 전까지입니다.
만약 3번째 스프라이트가 없다면 2번째 줄은 다음과 같은뜻이 됩니다.
trigger1 = AnimTime <= 0
* 캐릭터가 스텟에 오자마자(animelem=1에) 적의 공격을 막는(가드스텟으로 가는) 경우가
있는데 이경우엔 만약 스텟시작하자마자 poweradd=-1000같은(필살기같은데 쓰이는)게
있을 경우 기만 날리고 기술은 안나가는 경우가 생길수 있습니다. 따라서 이런 상황을 막기
위해서 이런건 trigger1 = animelem = 1,1 이나 trigger1 = time = 1 이런식으로 씁시다.
------------------------------------------------------------
AnimElemNo
------------------------------------------------------------
애니매이션의 스프라이트의 프레임의 범위를 검사?. 설명이 어렵네요. 예를 봅시다.
Returns the number of the animation element in the current action
that would be displayed at the specified time. The argument to AnimElemNo
represents the time to check, expressed in game ticks, relative to the present.
(영어원문에서 tick 이라고 함은 게임진행시간(프레임)을 말하는 것으로 1tick은 1/60초
= 1프레임 입니다)
Format:
AnimElemTime(exprn)
Arguments:
exprn
Expression that evaluates to the time offset (int).
Return type:
int
Error conditions:
Returns SFalse if you try to check a time that would fall before the
start of the current action.
Notes:
If the action is currently within its looping portion, then it is
assumed to have been looping forever. That is, no matter how far into
the past you check, AnimElemNo will always return an element number
that lies within the looping portion of the action.
Examples:
trigger1 = AnimElemNo(0) = 2
True when the animation element to be displayed 0 ticks in the
future (i.e., now) is element 2. This is equivalent to:
이건 다음과 같습니다.
trigger1 = AnimElem = 2, >= 0
trigger1 = AnimElem = 3, < 0
trigger1 = AnimElemNo(2) = 4
True when the animation element that will be displayed two ticks
from now is element 4. This is equivalent to:
이건 다음과 같습니다.
trigger1 = AnimElem = 4, >= -2
trigger1 = AnimElem = 5, < -2
이 animelemno(?)는 잘 쓰이진 않지만 애니매이션을 정시시킬 때 쓸수도 있습니다.
예를들어
[state 500]
type = changeanim
trigger1 = 1
value = anim
elem = animelemno(-1)
이렇게 쓰면 현재 스프라이트가 유지되는데 제캐릭터 쿠로키시의 얼음빔에 맞은 스텟이나
진념 연옥영파 모으는중 히트시 구체를 정지시킬 때, 드레이븐 아이스스톰 맞았을 때 등에
쓰였습니다. 11-cns명령어 파일의 changeanim부분 참조.
------------------------------------------------------------
AnimElemTime
------------------------------------------------------------
안써봤습니다.
Gets the animation-time elapsed since the start of a specified element
of the current animation action. Useful for synchronizing events to
elements of an animation action.
(reminder: first element of an action is element 1, not 0)
Format:
AnimElemTime(exprn)
Arguments:
exprn
Expression that evaluates to the element number to check (int).
Return type:
int
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn evaluates
to an element number that is not valid for the current action.
Examples:
trigger1 = AnimElemTime(2) = 0
True on the first game-tick that the player's animation
is on element 2. Is equivalent to saying:
이건 다음과 같습니다.
trigger1 = AnimElem = 2
trigger1 = AnimElemTime(2) = 4
True 4 game-ticks after the start of the player's
second animation element.
정확히는 모르겠지만 이건 animelem = 2, =4 와 같은것같군요.
trigger1 = AnimElemTime(2) >= 0
trigger1 = AnimElemTime(3) < 0
이건
animelem = 2, >= 0
animelem = 3, <0 과 같은 것 같습니다.
True for the whole of the second element of the player's
animation, assuming there is a third element. If a
third element does not exist, the second line will evaluate
to SFalse and hence trigger1 will never trigger. In this case,
the second line should read,
trigger1 = AnimTime <= 0
------------------------------------------------------------
AnimExist
------------------------------------------------------------
애니매이션 번호가 존재하는지를 검사하는것인데 상대방에 맞아서 상대 스텟으로 간
경우 오작동할수도 있으므로 거의 쓰이지 않고 대신 selfanimexist가 쓰입니다.
예)
trigger1 = !AnimExist(200)
애니매이션 200번이 존재하지 않을때
------------------------------------------------------------
AnimTime
------------------------------------------------------------
애니매이션이 끝날때의 animtime 은 0이 되고 그이전엔 -값에서 계속 0을 향해 1씩
더해집니다.
예를들어 전체 지속시간이 7프레임인 애니매이션이 있다고 하면 그 애니매이션 시작직후
animtime 값은 -7 이며 7프레임째의 값은 -1 그리고 끝날때는 0이 됩니다.
AIR파일에서 loopstart가 쓰여있다고 해도 마지막 스프라이트의 지속시간이 끝나면
animtime값은 0이 됩니다.
예)
trigger1 = AnimTime = 0
애니매이션이 끝났을 때.
이건 대부분의 스텟 마지막 부분에 changestate명령과 함께 쓰입니다.
------------------------------------------------------------
Asin
------------------------------------------------------------
이것도 삼각함수 같은데 모르겠군요.
Computes the arcsine (in radians) of the specified argument.
Format:
asin(exprn)
Arguments:
exprn
Expression to compute the arcsine of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn is not in
the domain of arcsine (which is [-1.0,1.0]).
Example:
value = asin(1)
Sets value to the arcsine of 1, which is approximately pi/2
(possibly with some rounding error.)
------------------------------------------------------------
Atan
------------------------------------------------------------
역시 삼각함수
Computes the arctangent (in radians) of the specified argument.
Format:
atan(exprn)
Arguments:
exprn
Expression to compute the arctangent of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = atan(1)
Sets value to the arccosine of 1, which is approximately pi/4
(possibly with some rounding error.)
------------------------------------------------------------
AuthorName(*,***)
------------------------------------------------------------
제작자의 이름을 검사합니다.
해당 캐릭터의 def파일내에 있는 authorname을 검사하는 것입니다.
예)
trigger1 = Authorname = "sanderx"
def파일에 쓰여있는 authorname이 sanderx 일 경우
------------------------------------------------------------
BackEdgeBodyDist
------------------------------------------------------------
캐릭터의 back.width부터 캐릭터뒤쪽의 화면구석까지의 거리를 구합니다.
그런데 backedgedist와 값의 차이를 모르겠군요.
결과값은 실수입니다만 중요하지 않습니다.
예)
trigger1 = BackEdgeBodyDist < 30
캐릭터의 뒤 너비부터 캐릭터 뒤쪽 스크린 가장자리 까지의 거리가 30픽셀(도트)
미만일 경우
------------------------------------------------------------
BackEdgeDist
------------------------------------------------------------
캐릭터의 x축 중심부터 뒤쪽 화면 가장자리까지의 거리를 구합니다.
역시 backedgebodydist 와 값이 똑같이 나오는군요
결과값은 실수입니다만 역시 중요치 않습니다.
예)
trigger1 = BackEdgeDist < 30
캐릭터의 x축 중심부터 뒤쪽 화면 가장자리까지의 거리가 30픽셀 미만일 경우
------------------------------------------------------------
CanRecover
------------------------------------------------------------
캐릭터가 맞아서 날아가는 중일 때 낙법을 할수 있으면 1을 반환하고 그렇지 않으면
0을 반환합니다. 낙법이 가능한지 불가능한지는 cns의 hitdef의 명령어에 따라 정해집니다.
예) trigger1 = canrecover
------------------------------------------------------------
Ceil
------------------------------------------------------------
수를 올림한 값을 구합니다. 음수일 경우 그 수보다 크거나 같은 정수를 구합니다.
형식
ceil(수)
예)
ceil(5.5)의 값은 6
ceil(5.1)의 값도 6
ceil(-2.6)의 값은 -2
------------------------------------------------------------
Command (*,***)
------------------------------------------------------------
커맨드 입력 감지
예)
trigger1 = Command = "fireball"
fireball 커맨드를 입력했을 때
trigger1 = command != "holdback"
뒤 키를 누르고 있지 않을 때
도스무겐에선 입력된 커맨드 지속시간이 1프레임 이었지만, 윈무겐에서는 cmd파일에
추가된 부분인 [defaults]부분의 command.buffer.time 만큼 지속됩니다. 기술 발동할 때
커맨드를 입력하면 CMD에서 커맨드를 감지해서 스텟을 이동시키는데, 도스무겐에선
이동한 스텟의 time = 0 까지만 커맨드를 입력한걸로 감지하지만, 윈무겐에선 저
값대로(기본값1인 경우 time = 1까지) 감지합니다.
command.buffer.time 값이 1(기본값)이라고 쳤을때
type = varset
trigger1 = time > 0
trigger1 = command = "xx"
이런 부분은 같은커맨드로 연결하는 기술(이오리 규화(밑,뒤+손)같은)에 쓰였었는데
윈무겐을 위해 time > 0 부분을 time > 1 로 고쳐야 합니다.
예를들자면 제 이오리 [statedef 520]에서 다음과 같은 부분이 있습니다.
[State 325,8]
type = Varset
triggerall = time > 1
triggerall = time < 35
triggerall = var(55) = 0
trigger1 = command = "3p1_z"
trigger2 = command = "3p1_x"
persistent = 0
var(5) = 1
이곳의 time > 1을 time > 0으로 고친후 강규화를 실험해보면, 도스무겐에선 문제가
없지만 윈무겐에선 강규화1타가 맞을 경우 2타가 저절로 나가는 현상이 나타납니다.
------------------------------------------------------------
Const (*)
------------------------------------------------------------
캐릭터의 cns파일 처음 부분에 있는 여러 가지 값들을 검사하는 것입니다.
형식
Const(파라미터 이름)
CNS파일 처음부분의 [Data]부분의 값을 검사할 때. (해당 값들을 검사합니다. 굳이 해석할
필요는 없겠죠?)
data.life: Returns value of the "life" parameter. (int)
data.attack: Returns value of the "attack" parameter. (int)
data.defence: Returns value of the "defence" parameter. (int)
data.fall.defence_mul: Returns value of the defence multiplier,
calculated as 100/(f+100), where f is the "fall.defence_up"
parameter. (float)
data.liedown.time: Returns value of the "liedown.time" parameter.
(int)
data.airjuggle: Returns value of the "airjuggle" parameter. (int)
data.sparkno: Returns value of the "sparkno" parameter. (int)
data.guard.sparkno: Returns value of the "guard.sparkno" parameter.
(int)
data.KO.echo: Returns value of the "ko.echo" parameter. (int)
data.IntPersistIndex: Returns value of the "IntPersistIndex"
parameter. (int)
data.FloatPersistIndex: Returns value of the "FloatPersistIndex"
parameter. (int)
CNS의 [Size]부분 값들을 검사할때
size.xscale: Returns value of the "xscale" parameter. (float)
size.yscale: Returns value of the "yscale" parameter. (float)
size.ground.back: Returns value of the "ground.back" parameter.
(int)
size.ground.front: Returns value of the "ground.front" parameter.
(int)
size.air.back: Returns value of the "air.back" parameter. (int)
size.air.front: Returns value of the "air.front" parameter. (int)
size.height: Returns value of the "height" parameter. (int)
size.attack.dist: Returns value of the "attack.dist" parameter.
(int)
size.proj.attack.dist: Returns value of the "proj.attack.dist"
parameter. (int)
size.proj.doscale: Returns value of the "proj.doscale" parameter.
(int)
size.head.pos.x: Returns x-component of the "head.pos" parameter.
(int)
size.head.pos.y: Returns y-component of the "head.pos" parameter.
(int)
size.mid.pos.x: Returns x-component of the "mid.pos" parameter.
(int)
size.mid.pos.y: Returns y-component of the "mid.pos" parameter.
(int)
size.shadowoffset: Returns value of the "shadowoffset" parameter.
(int)
size.draw.offset.x: Returns x-component of the "draw.offset"
parameter. (int)
size.draw.offset.y: Returns y-component of the "draw.offset"
parameter. (int)
CNS의 [Velocity]부분의 값을 검사할 때. 주로 스텟 20(걷기)이나 100(달리기)에서 이
파라미터들을 쓰게 되죠
velocity.walk.fwd.x: Returns value of the "walk.fwd" parameter.
(float)
velocity.walk.back.x: Returns value of the "walk.back" parameter.
(float)
velocity.run.fwd.x: Returns x-component of the "run.fwd" parameter.
(float)
velocity.run.fwd.y: Returns y-component of the "run.fwd" parameter.
(float)
velocity.run.back.x: Returns x-component of the "run.back"
parameter.
(float)
velocity.run.back.y: Returns y-component of the "run.back"
parameter.
(float)
velocity.jump.y: Returns y-component of the "jump.neu" parameter.
Note: this is NOT "velocity.jump.neu.y". Only the "neu"
parameters take a y-component value. (float)
velocity.jump.neu.x: Returns x-component of the "jump.neu"
parameter.
(float)
velocity.jump.back.x: Returns value of the "jump.back" paramamter.
(float)
velocity.jump.fwd.x: Returns value of the "jump.fwd" parameter.
(float)
velocity.runjump.back.x: Returns value of the "runjump.back"
paramamter. (float)
velocity.runjump.fwd.x: Returns value of the "runjump.fwd"
parameter.
(float)
velocity.airjump.y: Returns y-component of the "airjump.neu"
parameter. Note: this is NOT "velocity.airjump.neu.y".
(float)
velocity.airjump.neu.x: Returns x-component of the "airjump.neu"
parameter. (float)
velocity.airjump.back.x: Returns value of the "airjump.back"
paramamter. (float)
velocity.airjump.fwd.x: Returns value of the "airjump.fwd"
parameter.
(float)
역시 [Movement]부분의 값들을 검사할때
movement.airjump.num: Returns value of the "airjump.num" parameter.
(int)
movement.airjump.height: Returns value of the "airjump.height"
parameter. (int)
movement.yaccel: Returns value of the "yaccel" parameter. (float)
movement.stand.friction: Returns value of the "stand.friction"
parameter. (float)
movement.crouch.friction: Returns value of the "crouch.friction"
parameter. (float)
예)
trigger1 = Const(velocity.walk.fwd.x) > 4
CNS파일의 [velocity]부분에 있는 walk.fwd 의 값이 4보다 클 경우
------------------------------------------------------------
Cos
------------------------------------------------------------
삼각함수의 코사인 값을 구합니다. 괄호안에 각도를 쓰는 듯. 예를들어 cos(0) = 1입니다.
실수를 쓸수도 있는데 그것에 대해선 모르겠군요.
Computes the cosine of the specified argument (in radians.)
Format:
cos(exprn)
Arguments:
exprn
Expression to compute the cosine of. (float)
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = cos(0)
Sets value to the cosine of 0, which is approximately 1.0
(possibly with some rounding error.)
------------------------------------------------------------
Ctrl
------------------------------------------------------------
캐릭터 조종이 가능할 경우(?)1을 돌려주고 그렇지 않으면 0을 돌려줍니다.
ctrl값이 0인지 1인지는 각 스텟의 처음 부분의 ctrl =? 등에 따라 결정됩니다.
예)
trigger1 = Ctrl
캐릭터가 컨트롤가능할 경우
------------------------------------------------------------
DrawGame
------------------------------------------------------------
그 라운드를 비길 경우 1이 되고 아니면 0이 됩니다.
예)
trigger1 = DrawGame
라운드가 비긴 상태로 끝날 경우
------------------------------------------------------------
E
------------------------------------------------------------
e값(2.718281828..)이라는데 대학교 고급수학이나 물리에서 나오나? 저는 모르겠습니다.
Returns the value of e (2.718281828...)
Format:
e
Arguments:
none
Return type:
float
Error conditions:
none
------------------------------------------------------------
Exp
------------------------------------------------------------
수학 연산자인데 몰라요.
Computes the exponential of the argument (e raised to the power of
the argument.) This produces slightly more accurate results than the
equivalent expression e**(argument).
Format:
exp(exprn)
Arguments:
exprn
Expression to compute the exponential of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = exp(4-var(0))
Sets value to e raised to the quantity 4-var(0).
------------------------------------------------------------
Facing
------------------------------------------------------------
캐릭터가 오른쪽을 향아고 있으면 1을, 왼쪽을 향하고있으면 -1 값을 줍니다.
예)
Trigger = Facing = -1
캐릭터가 왼쪽을 보고 있을 때
------------------------------------------------------------
Floor
------------------------------------------------------------
버림한 값을 구합니다. ceil과 반대. 음수일 경우 그 수보다 작거나 같은 정수를 구합니다.
예)
floor(5.5)의 값은 5
floor(-2.1)의 값은 -3
------------------------------------------------------------
FrontEdgeBodyDist
------------------------------------------------------------
캐릭터의 앞쪽 너비에서부터 앞쪽 스크린 구석까지의 거리를 구합니다.
역시 밑의 frontedgedist와 갚이 같게 나오는데 어떨 때 다르게 나오는지 모르겠습니다.
예)
trigger1 = FrontEdgeBodyDist < 30
플레이어의 앞쪽 너비부터 앞쪽 스크린 끝까지의 거리가 30픽셀(도트) 미만일 경우
------------------------------------------------------------
FrontEdgeDist
------------------------------------------------------------
플레이어의 x축을 기준으로 앞쪽 스크린구석까지의 거리를 구합니다.
frontedgebodydist와 값이 같게 나오는데 어떨 때 다른지 모르겠습니다.
예)
trigger1 = FrontEdgeDist < 30
플레이어 x축과 앞쪽 스크린 가장자리까지의 거리가 30픽셀 미만일 경우
------------------------------------------------------------
FVar
------------------------------------------------------------
실수변수인 fvar의 값을 검사합니다. fvar(0)부터 fvar(39)까지 있습니다.
값을 정하는 것은 cns명령어인 varset, varadd 로 합니다.
예)
trigger1 = FVar(5) = -1.23
fvar(5)의 값이 -1.23 일 경우
------------------------------------------------------------
GameTime
------------------------------------------------------------
라운드가 시작되면 Gametime은 계속 흘러갑니다. cns명령어인 pause 등으로 게임
화면이 멈춰도 상관없이 1초에 60씩 계속 올라갑니다.
gametime은 주로 일정시간마다 실행할 명령의 조건에 사용됩니다.
예)
trigger1 = (GameTime%27)=0
gametime을27로 나눈 나머지가 0인 경우. 즉, 27프레임마다를 뜻합니다.
------------------------------------------------------------
GetHitVar(*)
------------------------------------------------------------
맞은 공격의 속성(값)들을 검사합니다. cns의 공격판정을 내는 명령인 hitdef의 속성에 따라
값들이 결정되는데, 주로 공격을 한 상대방의 hitdef에서 검사합니다.
Gethitvar는 movetype = H 일 경우에만 지속되며 I일 경우 사라집니다. A일경우엔 일부만
사라지는 듯.
형식
GetHitVar(파라미터이름)
파라미터 종류
xveladd, yveladd, type, animtype, airtype, groundtype, damage,
hitcount, fallcount, hitshaketime, hittime, slidetime, ctrltime,
recovertime, xoff, yoff, zoff, xvel, yvel, yaccel, hitid,
chainid, guarded, fall, fall.damage, fall.xvel, fall.yvel,
fall.recover, fall.time, fall.recovertime, isbound(윈무겐전용).
자세히
xveladd: Returns the additional x-velocity that is added to the
player's own when he is KOed. (float)
KO됐을 때 x속도 더하는 값? 써본적이 없네요. 아마 캐릭터가 KO될때 x,y속도
가 일정값만큼 더해져서 날아가게 되는데 그걸 말하는듯.
yveladd: Returns the additional y-velocity that is added to the
player's own when he is KOed. (float)
type: hitdef의 type. 지상에서 맞으면 ground.type 의 값, 공중이면 air.type의 값입
니다. 0 - none, 1 - high, 2 - low, 3 - trip(3값은 지상에서만 받음)
animtype: hitdef의 animtype에 따라 해당 값을 돌려줍니다. 0 - light, 1 - medium, 2
- hard, 3 - back, 4 - up, 5 - diagup
airtype: hitdef의 air.type값. 돌려주는 값은 위의 type과 같습니다.
groundtype: 마찬가지로 hitdef의 ground.type 값
damage: damage 값
hitcount: 맞은 횟수입니다. 예를들어 2히트콤보를 맞으면 2 뭐 이런식입니다.
fallcount: 콤보맞아서 다운된 횟수
hitshaketime: 경직시간. hitdef의 pausetime 의 영향을 받는데 예를들어 pausetime이 10
인 공격에 맞을 경우 hitshaketime 은 10에서 1씩 줄기 시작해서 10프레임
후엔 0이 됩니다.
hittime: Hitdef의 hittime. 맞아서 회복되는데 걸리는 전체 시간
slidetime: Hitdef의 slidetime. 맞았을 때 밀림이 멈추는데까지 걸리는 시간
ctrltime: 공격을 가드(막다)한 후 컨트롤가능하게 되기까지 시간
recovertime: 넘어졌을 때 일어나기 전까지 시간. 이 값은 0을 향해 점점 줄기 시작하는
데 방향키를 흔들거나 버튼을 연타하면 더 빨리 줄어듭니다.
xoff: "Snap" x offset when hit (deprecated) hitdef의 snap의 x위치?
yoff: "Snap" y offset when hit (deprecated) hitdef의 snap의 y위치?
zoff: "Snap" z offset when hit (deprecated) hitdef의 snap의 z위치? z위치가 뭘뜻하는
지 모르겠군요.
xvel: 맞아서 x방향 밀려나는 속도. hitdef의 velocity들에 있음 (당연히 정수가 아닌 실수)
yvel: 맞아서 y방향으로 뜨는 속도 (역시 실수)
yaccel: Hitdef 의 yaccel값. 맞고 넘어질 때 y 축 가속도 (실수)
chainid: Player-assigned chainID for last hit taken. (int)
마지막 맞은 공격의 chaninID 값인듯 (정수)
guarded: 마지막 받은 공격을 가드했을 경우 1을 돌려주며 아니면 0을 돌려줍니다.
isbound: 플레이어가 상대의 TargetBind 명령의 영향을 받고있으면 1값을
돌려줍니다. 던져지는 스텟에서 버그방지하는데 유용하다는군요(2vs2대전시
p2stateno가 있는 hidef공격이 맞자마자 또다른 상대에게 맞을 경우 발생하는
걸 말하는 듯. 맞은쪽만 스텟이동되는 것). (윈무겐 전용입니다)
fall: 다운되면 1(TRUE), 아니면 0(FALSE)값을 돌려줍니다.
fall.damage: Damage taken upon fall (int) 넘어진 상태에서 받은 대미지인 듯 (정수)
fall.xvel: 바운드(튕김)될 때 x속도. Hitdef의 fall.xvelocity 값 (실수)
fall.yvel: 바운드(튕김)될 때 y속도. Hitdef의 fall.yvelocity 값 (실수)
fall.recover: 낙법이 가능하면 True(1)값을 주며 그렇지 않으면 false(0)값을 줍니다.
fall.recovertime: 낙법이 가능하게 되기까지의 시간.
fall.kill: 넘어진 상태에서 맞았을 때 ko될수 있는가. 역시 hitdef의 fall.kill값
fall.envshake.time: hitdef의 fall.envshake.time 값. 맞고 넘어질 때 지면이 흔들리는
시간(정수)
fall.envshake.freq: hitdef의 fall.envshake.freq 값. 지면 흔들리는 주기(실수)
fall.envshake.ampl: hitdef의 fall.envshake.ampl 값. 지면 흔들리는 너비(정수)
fall.envshake.phase: Returns values set by the fall.envshake.*
parameters in an attacker's hitdef. (실수)
예)
trigger1 = GetHitVar(yvel) < -5.5
맞고 뜰 때 y속도가 -5.5 미만일 때
------------------------------------------------------------
HitCount
------------------------------------------------------------
한 스텟에서 공격을 맞춘 횟수입니다. 다른 스텟으로 넘어가면 0이 됩니다.
Uniqhitcount 랑 다른점은, 같은 공격(hitdef)을 2명의 상대에게 맞췄을 때 hitcount는 1만
증가하지만 Uniqhitcount는 2가 증가합니다.
예)
trigger1 = HitCount > 8
공격스텟이 시작되고 나서 그 스텟 내에서 한 상대에게 공격을 맞춘 횟수가 8회
초과일때
------------------------------------------------------------
HitDefAttr(*,***)
------------------------------------------------------------
활성화되어있는 hitdef의 attr 값. 써본적은 없군요.
형식
HitDefAttr [oper] value1, value2
[oper] 에는 =, != 중에 하나가 들어갈수 있다.
value1
A string that has at least one of the letters "S", "C"
and "A" for standing, crouching and aerial attacks
respectively. For example, "SA" is for standing and
aerial attacks.
S, C, A중 하나이상이 들어가는데 각각 서서공격, 앉아공격, 공중공격이며 hitdef의
attr 값에서 따옵니다. SA처럼 2가지를 쓰면 서서공격이나 앉아공격 이런식으로 되는듯
value2
A set of 2-character strings, separated by commas.
Each 2-character string must be of the form described:
The first character is either "N" for "normal", "S" for
"special", or "H" for "hyper". The second character must
be either "A" for "attack" (a normal hit attack) or "T"
for "throw". For example, "NA, ST" is for normal attacks
and special throws.
2개의 문자가 조합되는데 첫 번째 문자는 N(노멀), S(스페셜:기술), H(하이퍼:필살기)
이며 두 번째 문자는 A(공격), T(잡기)입니다. 역시 hitdef의 attr값을 검사합니다.
form:
arg1, arg2
then the trigger condition is determined to be true only
if arg1 is a subset of value1, AND arg2 is a subset of
value2.
예를들어 S, NA 라고 쓰면 서서 노멀공격일 경우 인 듯 합니다.
예)
trigger1 = A, HA
(원문은 이렇지만 틀린 것 같네요. trigger1 = hitdefattr = A, HA 이어야겠죠?)
공중 필살기 일 때
trigger1 = SC, NA, SA
(역시 틀린 것 같네요. trigger1 = hitdefattr = SC, NA, SA 이겠죠)
서서나 앉아서 공격이어야 하고 노멀공격이거나 스페셜공격(기술)일 때
------------------------------------------------------------
HitFall
------------------------------------------------------------
맞는 스텟에 있을 때 다운이 되는 상태라면 1값을 반환하고 그렇지 않으면 0값을 줍니
다. 예를들어 Hitdef의 fall 값이 1인 경우 그공격에 맞으면 Hitfall 값은 1이 됩니다.
예)
trigger1 = !HitFall
다운이 안될때(또는 다운되는 스텟으로 가게 하지 않을때)
------------------------------------------------------------
HitOver
------------------------------------------------------------
hitdef의 hittime 이 다되면 1값을 돌려줍니다. gethitvar(hittime)값이 0을 향해 계
속 줄어드는데 이 값이 0이 될 경우 1값을 돌려주는 듯.
주로 common1.cns 의 맞는 스텟들에 쓰였습니다
예)
trigger1 = HitOver = 1
hittime 이 만료될 경우. 뒤의 = 1 은 생략해도 됩니다. 반대로 쓰고싶으면
!hitover 로 씁니다.
------------------------------------------------------------
HitPauseTime
------------------------------------------------------------
공격을 맞췄을 때 hitdef의 pausetime 값으로 정해지고 그후로 값이 1/60 초당 1씩 줄어들
어 0으로 향합니다.
If ignorehitpause is not set, this will always return 0.
ignorehitpause 가 정해지면 줄지 않을수도 있다는데 아마 ignorehitpause = 0 으로 설정이
되면 hitpausetime 값이 줄지 않는다는 뜻인 듯한데 ignorehitpause=0을 쓸 이유가 없죠.
이 Hitpausetime은 히트경직중에 값이 변하기 때문에 ignorehitpause = 1을 붙여서 쓰는게
일반적입니다. ignorehitpause 는 11-CNS명령 파일의 처음부분에 설명되어있습니다.
예)
trigger1 = HitPauseTime = 0
공격의 경직이 끝났을 때.
또한 이 Hitpausetime 은 공격을 맞춘 직후 상대의 머리에서 피가 나게 한다거나 하는 효
과를 줄 때 등에 쓸수 있습니다.
예를들어 pausetime 이 15인 공격일 경우 trigger1 = Hitpausetime = 14 로 하면 공격을
맞춘 직후 라는 뜻이 되는데 ignorehitpause = 1과 같이 써야 합니다. 제캐릭터 진념의
강발 등에 쓰였습니다.
------------------------------------------------------------
HitShakeOver
------------------------------------------------------------
공격당했을때 경직이 끝나면 1을 반환, 안그러면 0을 반환합니다.
Hitdef의 pausetime의 경직을 말합니다. common1.cns의 맞는 스텟들에 쓰였습니다.
Example:
trigger1 = HitShakeOver = 0
맞아서 경직된 상태일 때
------------------------------------------------------------
HitVel
------------------------------------------------------------
공격에 맞았을 때 밀려나는 속도
hitvel x 는 x속도, hitvel y 는 y속도입니다.
원문에서는 각 값이 +인게 뒤로 밀려나거나 뜨는 거라고 나와있지만 틀렸군요.
다른것과 마찬가지로 두 속도가 -이면 뒤로 밀려나거나 위로 뜨는 겁니다.
이 값은 맞은 공격의 Hitdef에 설정된 값을 그대로 가져오게 되며 다음 Hitdef에 맞기
전까진 값이 유지됩니다.
예를들어 지상에서 ground.velocity = -13 인 Hitdef에 맞으면 Hitvel x = -13이 됩니다.
예)
trigger1 = HitVel X < -10
밀려나는 x속도가 -10 보다 작을때
------------------------------------------------------------
ID
------------------------------------------------------------
플레이어들의 ID값이며 각 플레이어는 고유의 ID값을 가집니다. 근데 1:1대전과 2:2대전
시의 값이 틀리고 어디다 쓰라는건지 모르겠습니다.
예)
value = ID
값을 ID값으로 해라
------------------------------------------------------------
IfElse
------------------------------------------------------------
조건을 검사해서 만족할때와 그렇지 않을 때 각각 다른 값을 줍니다. 쓸모가 많습니다.
형식
IfElse(조건, 조건만족시의값, 조건불만족시의값)
예)
value = ifelse(var(3),1,2)
var(3)의 값이 0이 아니면 값을 1로 정하고 그렇지않으면 2로 정해라.
주의할점은 조건을 쓸 때 enemynear, 같이 ','(콤마)가 들어가는 조건을 쓸 경우 괄호를
하나 더 쳐서 쓰지 않으면 에러나서 튕깁니다.
예를들어 ifelse(enemynear,statetype=C,-30,-50) 이렇게 쓰면 에러가 나므로
ifelse((enemynear,statetype)=C,-30,-50) 이렇게 써야 에러가 안납니다.
------------------------------------------------------------
InGuardDist(윈무겐 전용입니다 웬만하면 쓰지 맙시다)
------------------------------------------------------------
Returns 1 if the player is within guarding distance of an opponent's physical or
projectile attack. The guarding distance is the value of the guard.dist parameter of
the opponent's HitDef. Returns 0 if out of guard distance, or the opponent is not
attacking.
guard.dist안에 있을 경우 1값을 반환하며 그렇지않으면 0값을 반환합니다. guard.dist값은
Hitdef의 것을따른다고 하는데 Cns처음부분의 attack.dist에도 영향을 받는 듯
윈무겐의 common1.cns 의 가드하는 스텟들에 쓰였군요
------------------------------------------------------------
IsHelper
------------------------------------------------------------
헬퍼인지 아닌지 검사합니다. 괄호안에 아이디를 쓸수도 있습니다.
CNS에서 나오지만, 헬퍼의 아이디는 헬퍼를 생성할 때 정해줄수 있습니다.
예)
1. trigger1 = !IsHelper
헬퍼가 아닐 경우
2. trigger1 = IsHelper(1234)
ID 가 1234인 헬퍼일 경우
------------------------------------------------------------
IsHomeTeam
------------------------------------------------------------
홈팀일 경우 1, 안그러면 0값을 줍니다.
아케이드모드에서는 CPU가 홈팀이 됩니다만 버서스 모드에서는 1P쪽의 캐릭터들이 홈팀이
됩니다. AI를 만들 때 필요한 것 같지만 버서스모드에선 1P가 홈팀이 돼버리는 문제 때문에
대체 어디다 쓰라고 있는 트리거인지 모르겠군요.
예)
trigger1 = ishometeam
음...너무 간단해서 원문에도 사용예는 나와있지 않군요. 앞으로 이런건 설명안해도 되겠죠?
------------------------------------------------------------
Life
------------------------------------------------------------
플레이어의 현재 체력
예)
trigger1 = life <= 10
체력이 10 이하일 때
------------------------------------------------------------
LifeMax(윈무겐전용. 역시 안쓰길 권장)
------------------------------------------------------------
플레이어의 cns의 life =? 값입니다. 체력 최대치를 뜻합니다.
------------------------------------------------------------
Log
------------------------------------------------------------
로그값을 구하는 삼각함수입니다. 수학책을 보시는게 나을 듯.
예를들면 log(2,64) 는 64의 2에대한 로그값?을 구하는것인데, 2를 몇면 제곱해야 64가
나오느냐 하는것이므로 값은 6.0이 됩니다.
Takes two arguments a and b, and returns the base-a logarithm of b.
Format:
Log(exp1,exp2)
Arguments:
exp1
Expression giving the base of the logarithm. Must be positive.
exp2
Expression giving the value to take the logarithm of. Must be
positive.
Return type:
float
Error conditions:
Returns SFalse if either of exp1 or exp2 evaluates to SFalse, or if
either of exp1 or exp2 is not positive.
Example:
value=log(2,64)
Sets value to the base 2 log of 64, which is 6.0.
------------------------------------------------------------
Ln
------------------------------------------------------------
역시 프로그래밍 하는 사람들은 삼각함수까지 알아야 하나 봅니다. ln값을 구합니다.
ln이 아마 지수가 10인 로그던가? 역시 수학책을 봅시다.
Returns the natural logarithm of its argument. This produces slightly
more accurate results than the otherwise equivalent expression
log(e,(argument)).
Format:
ln(exprn)
Arguments:
exprn
Expression to compute the natural logarithm of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn is not
positive.
Example:
value = ln(time)
Sets value to the natural logarithm of the player's statetime.
------------------------------------------------------------
Lose
------------------------------------------------------------
졌을 경우 1 안그러면 0을 줍니다만 3가지가 있습니다.
형식
1. Lose - 아무 상황으로나 졌을때
2. LoseKO - 체력이 바닥나서 졌을때
3. LoseTime - 시간이 다돼서 졌을때
예)
1. trigger1 = Lose
졌을때
2. trigger1 = !LoseKO
타임오버로 졌거나 이겼을 때
------------------------------------------------------------
MatchNo
------------------------------------------------------------
몇번째 스테이지냐 하는것입니다.
버서스 모드에서는 무조건 값이 1이 됩니다.
예)
예) trigger1 = matchno > 3
3스테이지를 통과한 이후. 즉 4스테이지 이후부터. 제캐릭터 드레이븐에서 레벨업이후
체력증가에 쓰였습니다.
------------------------------------------------------------
MatchOver
------------------------------------------------------------
스테이지가 끝나면 값이 1이 되고 안그러면 0이 됩니다.
그러니까 3판2승제라면 2번째 이긴 라운드에서 승리포즈취하기 직전까진 0이고
승리포즈를 취함과 동시에 1이 됩니다.
윈무겐에선 도스무겐보다 좀 빨리 1이 되는데 승자가 결정되기 전에 1이 됩니다.
예)
trigger1 = matchover
스테이지 끝나고 승리포즈 취한후
------------------------------------------------------------
MoveContact
------------------------------------------------------------
공격이 상대에게 닳았을 경우(히트하거나 가드했을 때) 1, 안닳으면 0이 됩니다. 스텟이 넘
어갈 경우 0으로 초기화됩니다.
하지만 주의할점은 Movecontact와 이 밑의 movehit, moveguarded 는 만족할 경우
도스무겐에서는 값이 1로 유지되지만 윈무겐에서는 1,2,3,4 식으로 계속 증가합니다.
따라서 윈무겐에서도 캐릭을 쓰려면 movecontact = 1 대신, movecontact > 0 으로
써주어야 합니다. 밑의 movehit, moveguarded 도 같습니다.
예)
trigger1 = MoveContact > 0
공격이 닳았을 때
------------------------------------------------------------
MoveGuarded
------------------------------------------------------------
공격을 상대가 가드했을 경우 1, 안그러면 0이 됩니다.
예)
trigger1 = MoveGuarded > 0
공격이 막혔을 경우
------------------------------------------------------------
MoveHit
------------------------------------------------------------
공격이 히트했을(맞았을) 경우 1, 안그러면 0값을 반환합니다.
예)
trigger1 = MoveHit > 0
공격을 맞췄을 경우
------------------------------------------------------------
Movereversed(윈무겐 전용입니다. 웬만하면 쓰지 맙시다)
------------------------------------------------------------
공격이 리버설된 경우 1, 안그러면 0값을 반환합니다(원문엔 0이 아닌값을 준다고 돼있는데
1값을 줍니다). Hitdef의 Reversaldef명령에의해 리버설된 경우를 말합니다.
예)
trigger1 = MoveReversed
P1의 공격이 P2에 의해 리버설된 경우
------------------------------------------------------------
MoveType(*,***)
------------------------------------------------------------
플레이어의 movetype 입니다.
예)
trigger1 = movetype != H
movetype 이 H가 아닐 경우(맞는상태가 아닐경우)
------------------------------------------------------------
Name(*,***)
------------------------------------------------------------
DEF파일에 쓰여있는 캐릭터의 NAME을 검사합니다.
캐릭터간 인트로를 만들 때 authorname과 enemy, 같은 것들과 같이 쓰입니다.
enemy, 같은것들은 이 문서 맨 마지막 부분에 설명되어 있습니다.
예)
trigger1 = Name = "Kyo99"
캐릭터명이 kyo99 일 때.(하지만 이렇게 자체적으론 거의 안쓰이죠. 자기이름 검사해서
뭐합니까...)
------------------------------------------------------------
NumEnemy
------------------------------------------------------------
적의 숫자입니다. 중립플레이어와 노멀헬퍼는 포함되지 않음. 중립 플레이어란게 뭔지
모르겠네요. 헬퍼생성시 헬퍼타입을 player로하면 적숫자에 포함되는 듯 하지만 헬퍼타입
player를 쓰지 말라고 sctrl.txt파일에 나와있습니다.
trigger1 = NumEnemy = 2
trigger1 = enemynear(1), name = "Squash"
적의 수가 2명일 때. 2번째로 가까이 있는 적의 이름이 Squash 일 경우
------------------------------------------------------------
NumExplod
------------------------------------------------------------
cns에서 효과 스프라이트를 내는 명령인 explod가 있는데 그 명령에 의해 생긴
explod의 수를 검사합니다. 괄호를 쳐서 ID를 검사할수도 있습니다.
예)
1. trigger1 = NumExplod >= 4
자기가 발생시킨 모든 explod개수가 4개 이상일 경우
2. trigger1 = NumExplod(1234) >= 4
ID가 1234인 Explod의 개수가 4개 이상일 경우
------------------------------------------------------------
NumHelper
------------------------------------------------------------
발생시킨 헬퍼의 개수. 역시 괄호를 쳐서 아이디로 검사가능합니다.
헬퍼에서 발생시킨 헬퍼라도 개수에 포함됩니다. 즉 플레이어가 근원인 전체 헬퍼 개수.
예)
1. trigger1 = NumHelper < 2
헬퍼개수가 2개 미만일때
2. trigger1 = NumHelper(1234) < 2
ID가 1234인 헬퍼의 개수가 2개 미만일 때
------------------------------------------------------------
NumPartner
------------------------------------------------------------
파트너의 수. 역시 뉴트럴 플레이어와 노멀헬퍼는 고려되지 않는다네요.
예)
trigger1 = NumPartner = 1
trigger1 = partner, life < 200
파트너가 1명 있고 그 파트너의 체력이 200미만일 때
------------------------------------------------------------
NumProj
------------------------------------------------------------
cns명령인 projectile로 발생시킨 프로젝타일 개수. 주의점은 헬퍼에서 만든 프로젝타일일
지라도 본체캐릭터의 소유가 되므로 헬퍼에서 검사할땐 root, numproj 처럼 써야 합니다.
예)
trigger1 = NumProj = 0
프로젝타일이 없을 경우
------------------------------------------------------------
NumProjID
------------------------------------------------------------
위와 같지만 아이디로 검사합니다.
예)
trigger1 = NumProjID(1234) = 1
ID 번호가 1234인 프로젝타일이 1개일 때
------------------------------------------------------------
NumTarget
------------------------------------------------------------
타겟 개수. 공격을 맞췄고(막아도됨) 맞은 상대가 movetype = H일 경우 타겟에
포함됩니다. 상대의 movetype 이 H가 아닐 경우엔 타겟에서 벗어납니다.
괄호를 쳐서 아이디로 검사할수도 있습니다.
자기가 맞춘 대상만 포함되므로 헬퍼같은게 맞춘 대상은 본체나 다른 헬퍼의 타겟에
포함되지 않습니다.
예)
1. trigger1 = Numtarget >= 1
공격에 닳은 상태의 상대가 1명 이상일 때
2. trigger1 = Numtarget(200) >= 1
ID 200의 공격에 닳은 상태의 상대가 1명 이상일 때
------------------------------------------------------------
P1Name(*,***)
------------------------------------------------------------
This is an alias for the Name trigger. See "Name".
이름. Name 과 뭐가 틀린지 모르겠습니다.
------------------------------------------------------------
P2BodyDist
------------------------------------------------------------
상대와 거리인데 p2bodydist x는 플레이어의 앞쪽 몸체너비부터 상대의 앞쪽 몸체너비
까지의 거리입니다. 앞쪽 몸체너비란 front.width 값을 말하는데 cns처음부분의
ground.front(지상에 있을 때) 와 air.front(공중에 있을 때) 값에 따라 정해집니다.
p2bodydist y는 p2dist y랑 값이 같게 나오는데 어떨때 틀리게 나오는지 모르겠군요.
p2bodydist 값이 -일 경우 상대보다 위쪽에 있는걸 뜻합니다.
그런데 p2가 들어가는 트리거들의 경우 2명이상의 상대와 싸울 때 가장 가까이 있는
상대를 기준으로 하긴 하지만 그게 제대로 작동하지 않고 멀리있는 상대를 기준으로
돼버릴 때도 있습니다. 이 문제는 윈무겐의 docs폴더의 파일에도 나와있긴 한데 정확히
고쳐졌다고 나와있진 않습니다. 따라서 상황에 따라 enemynear, 같은 명령어를 쓰는게
더 나을 듯 합니다.
별로 중요하지 않지만, 값은 실수입니다.
Details:
For comparing the Y-distance, P2BodyDist gives the difference in the
heights of the players' Y-axes. A negative value means that P2 is
above P1.
For comparing the X-distance, P2BodyDist gives the
X-distance of P2's front from P1's front. So, if the
players are standing right next to each other, then
P2BodyDist is 0. Remember that you can set the width of
the player in "front.width", etc. under [Size] in the
player variables.
See also P2Dist.
예)
trigger1 = P2BodyDist X < 30
플레이어의 몸체앞쪽너비부터 상대몸체앞쪽너비까지 거리가 30픽셀 미만일 경우
------------------------------------------------------------
P2Dist
------------------------------------------------------------
플레이어의 x축과 상대 x축 까지의 거리입니다.
p2dist y는 p2bodydist y 랑 뭐가 틀린지 모르겠습니다. 설명도 같네요.
Details:
For comparing the Y-distance, P2Dist gives the difference in the
heights of the players' Y-axes. A negative value means that P2 is
above P1.
For comparing the X-distance, P2Dist gives the X-distance
of P2's axis from P1's axis. A positive value indicates P2
is in front of P1.
See also P2BodyDist.
Example:
trigger1 = P2Dist Y <= -12
상대보다 12픽셀 이상 높이 있을 때
------------------------------------------------------------
P2Life
------------------------------------------------------------
상대의 체력입니다. 적이 2명이상일 경우 가까이 있는 적의 체력을 검사합니다.
------------------------------------------------------------
P2MoveType
------------------------------------------------------------
상대의 movetype을 검사.
------------------------------------------------------------
P2Name(*,***)
------------------------------------------------------------
상대의 def파일에 있는 name을 검사. 역시 2인대전시는 가까이있는쪽의 name을 검사하
게 되고 상대가 1명이 ko됐으면 살아있는 상대의 name을 검사합니다.
상대가 모두 ko돼서 바닥에 쓰러진 경우 값은 0(false)이 됩니다.
------------------------------------------------------------
P2StateNo
------------------------------------------------------------
상대의 stateno(스텟넘버)를 검사
------------------------------------------------------------
P2StateType
------------------------------------------------------------
상대의 statetype을 검사
------------------------------------------------------------
P3Name(*,***)
------------------------------------------------------------
같은편의 name을 검사합니다. 같은편이 ko된 상태라도 작동합니다.
같은편이 없는 경우에만 무조건 0(false)값을 줍니다.
------------------------------------------------------------
P4Name(*,***)
------------------------------------------------------------
상대가 2명 이상일 때 더 멀리있는 상대의 name을 검사합니다. 상대가 ko당했어도
작동합니다.
상대가 1명이면 값은 무조건 0.
------------------------------------------------------------
PalNo
------------------------------------------------------------
캐릭터의 팔렛번호
캐릭을 고를 때 선택되는 def파일에 나와있는 대로의 팔렛번호 입니다.
DEF에도 설명돼있지만
A - 1 B - 2 C - 3 X - 4 Y - 5 Z - 6 이고 스타트버튼을 누를 경우 6이 더해
지며, 해당팔렛이 없을 경우엔 그다음 팔렛으로 선택됩니다.
예를들어 스타트버튼을 누른채 B버튼을 눌렀는데 8번팔렛부터 12번 팔렛까지 없다면 1번
팔렛이 골라지며 1번팔렛을 이미 골랐다면 2번팔렛으로 되는 식입니다.
예)
trigger1 = PalNo = 5
팔렛번호가 5일 때
이 트리거는 sanderx씨의 캐릭에 쓰였는데 어느 버튼으로 고르냐에 따라서 캐릭의 버전이
바뀌는걸 구현했습니다.(하지만 복잡하다는 단점이 더 크죠)
------------------------------------------------------------
ParentDist
------------------------------------------------------------
헬퍼에서만 쓰이는 트리거. 자신을 만든 부모와 자신과의 거리.
parentdist x 는 부모의 x축과 자신의 x축간의 거리이고 parentdist y로 하면 y축간의
거리입니다.
예)
trigger1 = ParentDist X != 0
부모와의 x위치가 다를때(조금이라도 떨어져있을 경우)
------------------------------------------------------------
Pi
------------------------------------------------------------
Pi값인 3.141593을 나타냅니다. 이것도 무슨 고급 물리나 수학에서 나오는듯.
This trigger returns the numeric value of pi (3.141593...)
Format:
pi
Arguments:
none
Return type:
float
Error conditions:
none
------------------------------------------------------------
Pos
------------------------------------------------------------
플레이어의 x,y축을 기준으로 현재 플레이어의 위치를 검사합니다.
pos x는 x위치, pos y는 y위치를 검사합니다.
화면의 정중앙이 pos x = 0 이며 왼쪽으로 갈수록 -, 오른쪽으로 갈수록 +가 됩니다.
스테이지의 바닥은 pos y = 0이며 위로 갈수록 -, 밑으로 갈수록 +가 됩니다.
중요하진 않지만 값은 실수
예)
trigger1 = Pos Y >= 0
플레이어의 y축 위치가 스테이지 바닥밑으로 내려갔을 때
(주로 넘어지는 스텟에 쓰입니다)
------------------------------------------------------------
Power
------------------------------------------------------------
기(파워)게이지의 양을 검사. 1000이 기 한칸입니다.
예)
trigger1 = power >= 1000
기게이지 레벨이 1이상일 때
------------------------------------------------------------
PowerMax(윈무겐전용)
------------------------------------------------------------
CNS처음부분의 power =? 값입니다. 기(파워)게이지의 최대치. 보통 3000(Lv3)입니다.
------------------------------------------------------------
PlayerIDExist
------------------------------------------------------------
해당 ID를 지닌 플레이어가 존재하느냐 인데 앞서 말했듯 ID값은 몇 명 대전을 하느냐에
따라 달라지므로 쓰기 어정쩡.
예)
trigger1 = PlayerIDExist(var(4))
var(4)와 같은 ID의 플레이어가 존재할 경우
------------------------------------------------------------
PrevStateNo
------------------------------------------------------------
바로이전 스텟번호를 검사
예)
trigger1 = prevstateno = 100
직전 스텟넘버가 100(달리기)이었을 경우
------------------------------------------------------------
ProjCancelTime
------------------------------------------------------------
처음 값은 -1 이며 프로젝타일이 상대프로젝타일에 의해 사라지는 경우 이 값이 0으로
설정된 후 1프레임당 1씩 계속 증가하게 됩니다.
프로젝타일이 사라질땐 Hitflag = P가 들어가는 hitdef에 의해 사라질수도 있는데 이경우엔
ProjCancelTime 에 영향을 주지 않습니다.(그러니까 상대 프로젝타일에 의해 사라진 경우
만 projcanceltime값이 증가합니다.)
괄호안에 검사할 프로젝타일의 아이디를 쓰는데 0을 쓸 경우 프로젝타일의 아이디를
체크하지 않습니다. 즉 projcanceltime(0)은 플레이어의 프로젝타일중에 아무거나가
상쇄되면 0,1,2... 이렇게 증가합니다.
예)
1. trigger1 = ProjCancelTime(1234) = 1
ID 1234의 프로젝타일이 상대 프로젝타일에 의해 사라진 직후
2. trigger1 = ProjcancelTime(0) != -1 && ProjcancelTime(0) < 15
아무 프로젝타일이 상쇄된 후 15프레임 이내
------------------------------------------------------------
ProjContact(*,***)
------------------------------------------------------------
프로젝타일이 상대에게 닳으면 True(1)값을 줍니다. 뒤에 괄호를 치지 않고 아이디번호
를 쓸수있는데, 아이디번호를 쓰지 않거나 0으로 하면 역시 아무 프로젝타일이 닳으면
true값을 줍니다. 프로젝타일이 닳은 후 True값이 된 후엔 값이 바로 0으로 돌아옵니다.
그런데 이상한 것은 trigger1 = projcontact = 1에서 값을 1이상의 아무 숫자로 줘도
마찬가지입니다. projcontact = 2 나 projcontact = 15 이렇게 줘도 projcontact = 1과
같게 작동하는군요. 분명히 설명에선 1이나 0이라고 했는데 말이죠.
그리고 밑의 두 번째 형식처럼 쓸수 있는걸 보니 각 프레임마다 값이 존재하는 듯 하며
이때문인지 Displaytoclipboard명령으로 볼수가 없어서 애매하군요(에러남)
형식
1. ProjContact[ID] = value
2. ProjContact[ID] = value, [oper] value2
이렇게 쓸수도 있는데 뜻은 아래 Details에 나와있습니다만 해석이 애매해서 원문을
놔뒀습니다.
Arguments:
[ID]
Optional ID number.
value (boolean)
Value to compare against. 0 for false, 1 for true.
[oper]
=, !=, <, >, <=, >=
value2
Time value to compare against.
Return type:
boolean int
Details:
ProjContact will trigger once for each hit of the projectile, so a
multi-hit projectile can trigger multiple times.
The first form of ProjContact shown above is only valid for one tick
after contact, unlike MoveContact.
For the second form, ProjContact returns true if the projectile made
contact n ticks ago, where n is a nonnegative number satisfying the
relation "n [oper] value2".
Specifying an ID number of 0 gives the same behavior as if the ID
number is omitted (check all projectiles).
(원문의 boolean은 불 논리 연산=피연산자가 가능(可) 불가능(不) 으로 결과가 나오는
이라고 사전에 나와있군요. 0-불가능 1-가능 이런식입니다)
예)
1. trigger1 = ProjContact1234 = 1
ID 1234의 프로젝타일이 상대에게 막 닳았을 때(닳은 직후)
2. trigger1 = ProjContact456 = 0, < 15
이전 15프레임 내에 ID 456의 프로젝타일이 닳지 않았다면(모르겠으면 cns에서
실험해보거나 밑의 projhit나 projguarded를 보시길)
------------------------------------------------------------
ProjContactTime
------------------------------------------------------------
형식과 값의 변화는 위 projcanceltime과 같지만 이것은 프로젝타일이 닳았을 경우 값이
0,1,2... 이런식으로 증가합니다.
예)
1. trigger1 = ProjContactTime(1234) = 1
아이디 1235의 프로젝타일이 닳은 직후
2. trigger1 = ProjContactTime(0) != -1 && ProjContactTime(0) < 15
아무 프로젝타일이 닳은 후 15프레임 이내
------------------------------------------------------------
ProjGuarded(*,***)
------------------------------------------------------------
projcontact와 같지만 이건 프로젝타일이 막혔을때(가드당했을때)를 감지합니다.
형식 설명도 projcontact와 같군요.
예)
1. trigger1 = ProjGuarded1234 = 1
아이디 1235의 프로젝타일이 가드당한 직후
2. trigger1 = ProjGuarded = 1, < 15
이전 15프레임 사이에 아무프로젝타일이 가드당했을 때
(바꿔말하면 프로젝타일이 가드당한 후 15프레임 이내)
------------------------------------------------------------
ProjGuardedTime
------------------------------------------------------------
역시 projcanceltime과 같지만 프로젝타일이 가드당했을 때 값이 0,1,2...식으로 증가.
예)
1. trigger1 = ProjGuardedTime(1234) = 1
아이디 1235의 프로젝타일이 가드당한 직후
2. trigger1 = ProjGuardedTime(0) != -1 && ProjGuardedTime(0) < 15
아무 프로젝타일이 가드당한후 15프레임 이내
------------------------------------------------------------
ProjHit(*,***)
------------------------------------------------------------
마찬가지로 projcontact 등과 같지만 프로젝타일이 맞았을때(히트했을때)를 감지합니다
예)
1. trigger1 = ProjHit1234 = 1
아이디 1234의 프로젝타일이 히트한 직후
2. trigger1 = ProjHit1234 = 1, < 15
이전 15프레임 이내에 아이디 1234의 프로젝타일이 히트했을 때
(역시 바꿔말하면 아이디 1234의 프로젝타일이 히트한 후 15프레임 이내)
------------------------------------------------------------
ProjHitTime
------------------------------------------------------------
이하동문. projcanceltime 등과 마찬가지지만 이것은 프로젝타일이 히트했을 때 값이
0,1,2... 식으로 증가합니다.
예)
1. trigger1 = ProjHitTime(1234) = 1
아이디 1234의 프로젝타일이 히트한 직후
2. trigger1 = ProjHitTime(0) != -1 && ProjHitTime(0) < 15
아무 프로젝타일이 히트한 후 15프레임 이내
------------------------------------------------------------
Random
------------------------------------------------------------
랜덤수를 발생시킵니다. 수는 0부터 999사이에 정해집니다.
이 Random이란 글자가 나올때마다 무겐은 랜덤수를 만듭니다.
예)
trigger1 = Random <= 249
랜덤값이 249이하일 때(즉 25%확률로 라는 뜻이 됩니다.)
------------------------------------------------------------
RootDist
------------------------------------------------------------
헬퍼에만 사용되는 트리거. 자신을 만든 근원의 x,y축 부터 자신의 x,y축까지의 거리를
구합니다.
Rootdist x는 가로거리, Rootdist y는 세로거리입니다.
예)
trigger1 = RootDist X != 0
루트의 x위치와 다를 때
------------------------------------------------------------
RoundNo
------------------------------------------------------------
라운드 번호입니다.
예)
trigger1 = RoundNo = 3
3라운드일때
------------------------------------------------------------
RoundsExisted
------------------------------------------------------------
자신이 싸운 라운드가 몇번 있었냐 하는겁니다. 첫 라운드의 값은 0이 되며 스테이지
넘어가도 0이 됩니다.
이것은 Turns모드에서의 인트로를 만들 때 유용합니다.
예)
trigger1 = RoundsExisted = 0
trigger1 = TeamMode = Turns
trigger1 = RoundNo > 0
자신이 싸우는 첫 라운드이고 게임모드가 Turns일 때. 3번째 조건은 1라운드 이후일
때 라는건데 당연한 것이니까 무의미한 조건인 것 같군요.
당신은 이 예를 사용하여 초기화 스텟인 5900(라운드 처음 시작시 맨처음 시작스텟)에
changestate명령과 같이써서 팀모드 인트로를 만들 수 있다. 고 하는군요.
------------------------------------------------------------
RoundState
------------------------------------------------------------
라운드의 상태를 나타내는데 라운드 시작시 0부터 시작해서 라운드 끝나면 4가 됩니다.
각 값이 나타내는 것은 다음과 같습니다.
Details:
0: 화면이 페이드인 될 때(맨처음 라운드 시작시 화면 밝아지는 순간)
1: 캐릭터가 인트로(등장 포즈나 이벤트대사 등)를 할때
2: 캐릭터가 싸울때(라운드 x 파이트! 란 글자가 뜬 후)
3: 라운드가 끝났을 때.(캐릭터의 체력이 바닥나거나 타임오버 됐을때
4: 캐릭터가 승리포즈를 취할 때
예)
trigger1 = RoundState = 2
싸우는 중일 때
------------------------------------------------------------
ScreenPos
------------------------------------------------------------
화면의 왼쪽 위 구석부터 얼마만큼의 위치에 있느냐 하는것입니다.
왼쪽 구석이 screenpos x = 0이 되고 오른쪽으로 갈수록 값이 +가 되고 왼쪽으로 갈수록
-가 됩니다.
화면의 맨위 꼭대기가 screenpos y = 0이 되고 밑으로 갈수록 값이 +되고 위로갈수록
-됩니다.
예)
trigger1 = ScreenPos Y = [0,239]
캐릭터 y위치가 화면 꼭대기부터 밑으로 239 픽셀 내에 있을 때
------------------------------------------------------------
SelfAnimExist
------------------------------------------------------------
Animexist와 같은데 animexist는 맞아서 상대방의 스텟에 가있는 경우 그 상대의 AIR파일
을 검사하기 때문에 대부분 이 selfanimexist를 씁니다.
예) trigger1 = selfanimexist(200)
애니매이션번호 200이 존재할때
------------------------------------------------------------
Sin
------------------------------------------------------------
삼각함수의 sin값을 구합니다.
Computes the sine of the specified argument (in radians.)
Format:
sin(exprn)
Arguments:
exprn
Expression to compute the sine of. (float)
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = sin(pi/2)
Sets value to the sine of pi/2, which is approximately 1.0
(possibly with some rounding error.)
------------------------------------------------------------
StateNo
------------------------------------------------------------
스텟넘버를 검사
예)
trigger1 = stateno = [200,650]
스텟번호가 200~650 사이일 때
------------------------------------------------------------
StateType
------------------------------------------------------------
스텟타입을 검사. S,C,A,L중에 하나죠.
예)
trigger1 = StateType != A
스텟타입이 A가 아닐때
------------------------------------------------------------
SysFVar
------------------------------------------------------------
무겐의 변수중에 var와 fvar말고도 sysvar(정수)와 sysfvar(실수)가 있습니다.
현재 윈무겐까지는 sysvar(0), sysvar(1), sysvar(2) 만이 common1.cns 에 사용되었습니다.
원문엔 쓰지 말라고 하는 듯. 원문입니다.
This trigger takes a mandatory variable number as an argument. It
returns the value of the player's specified system float variable.
This trigger should NOT be used under normal circumstances. System
variables are reserved for bookkeeping in common1.cns.
(cns)근데 상대캐릭터를 특정 스텟으로 강제로 이동시킨후에 var를 써야만하는 경우가 있
는데 그냥 var를 쓰면 맞은 캐릭터의 var를 바꿔버리므로 안되니까 그럴 땐 이 sysvar(4)
같은걸 쓰도록 합시다.
sysvar나 sysfvar나 0-4 까지 쓸수 있습니다.
예)
trigger1 = SysFVar(0) = -1.23
sysfvar(0)이 -1.23일 경우
------------------------------------------------------------
SysVar
------------------------------------------------------------
sysfvar는 실수변수지만 sysvar는 정수변수입니다. 역시 0-4 까지 쓸수있긴 한데 sysvar(0)
과 sysvar(1)과 sysvar(2)는 공통스텟(common1.cns)에 쓰였으므로 쓰면 안됩니다.
예)
trigger1 = SysVar(0) = -34
sysvar(0)이 -34일 경우
------------------------------------------------------------
Tan
------------------------------------------------------------
삼각함수 탄젠트값을 구합니다.
Computes the tangent of the specified argument (in radians.)
Format:
tan(exprn)
Arguments:
exprn
Expression to compute the tangent of. (float)
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = tan(pi/4)
Sets value to the tangent of pi/4, which is approximately 1.0
(possibly with some rounding error.)
------------------------------------------------------------
TeamMode(*,***)
------------------------------------------------------------
플레이의 모드값을 구합니다.
single - 싱글플레이
simul - 시뮬플레이
turns - 턴플레이
예)
trigger1 = TeamMode = Single
싱글플레이일때
------------------------------------------------------------
TeamSide
------------------------------------------------------------
라운드 시작시 1P쪽은 1이 되고 2P쪽은 2가 됩니다.
이 트리거는 기게이지를 표시한다든지 할 때 유용합니다.
예)
trigger1 = TeamSide = 2
2P쪽일 때
------------------------------------------------------------
TicksPerSecond
------------------------------------------------------------
실제시간 1초에 몇프레임인지 구합니다. 원래 60인데 게임속도를 slow 9로 하면 15가
되는군요.
예)
trigger1 = Time > 10 * TicksPerSecond
게임스피드에 상관없이 실제시간 10초 이후일 때
------------------------------------------------------------
Time
------------------------------------------------------------
스텟의 시간입니다.
스텟이 시작하면 0부터 시작해서 1프레임당 1씩 계속 증가합니다.
예)
trigger1 = Time = 2
타임이 2일 때. 란 뜻이긴 하지만 자세히 말하자면 time=2일때가 아니라 time=1에서
time=2로 넘어가는 순간을 뜻합니다.(animelem = ? 과 같음)
주의할점은 헬퍼에서 본체의 time을 검사할 경우엔 값을 1더해야 한다는 것입니다.
예. 헬퍼에서) trigger1 = parent, time = 3
부모의 time이 2일 때.
항상실행스텟인 [statedef -?]에서 검사할때도 값에 1을 더해야 합니다.
이렇게 해야하는 이유는 cns의 실행 순서가 일반스텟->헬퍼->항상실행스텟(statedef -?)
이기 때문인 것 같습니다.
* 마찬가지로 캐릭터가 스텟에 오자마자(time=0에) 적의 공격을 막는(가드스텟으로 가는)
경우가 있는데 이경우엔 만약 스텟시작하자마자 poweradd=-1000같은(필살기같은데
쓰이는)게 있을 경우 기만 날리고 기술은 안나가는 경우가 생길수 있습니다. 따라서 이런
상황을 막기 위해서 이런건 trigger1 = time = 1 이렇게 씁시다.
------------------------------------------------------------
TimeMod(*,**,***)
------------------------------------------------------------
스텟의 time을 나눈 나머지를 구합니다. %대신 쓰는게 추천된다고 하는군요.
형식
TimeMod [oper] divisor, value1
Arguments:
[oper]
=, !=, <, >, <=, >=
divisor (int)
나눌 수(0이 아니어야 함)
value1 (int)
나뉠 수
예)
trigger1 = TimeMod = 4, 3
스텟의 time을 4로 나눈 나머지가 3일 경우 그러니까 스텟타임이 각각 3, 7, 11, 15,
...일 경우를 뜻합니다. trigger1 = time%4 = 3과 같습니다.
근데 위에나온 부호인 <, >= 같은건 어떨 때 쓰는지 모르겠군요. 설명에 나온
위치대로 timemode < 4,3식으로 쓰면 에러나네요. timemod = 4, < 3이렇게 쓸수는
있습니다. 각자 실험해봅시다.;
------------------------------------------------------------
UniqHitCount
------------------------------------------------------------
한 스텟에서 공격이 히트한 횟수입니다. hitcount와 다른점은 공격이 2명이상의 상대에
게 맞았을 때 hitcount는 1만 증가하지만 이 uniqhitcount는 맞춘 수대로 증가합니다. 2명한
테 맞췄다면 2증가 이런식입니다.
예)
trigger1 = UniqHitCount = [4,6]
공격이 들어간 횟수가 총 4~6번 사이일 때
------------------------------------------------------------
Var
------------------------------------------------------------
무겐에서 쓸 수 있는 정수변수. var(0) ~ var(59) 까지 쓸수 있습니다.
예)
trigger1 = Var(0) = -34
var(0)이 -34일 경우
------------------------------------------------------------
Vel
------------------------------------------------------------
속도입니다. vel x는 x속도, vel y 는 y속도입니다.
예)
trigger1 = Vel Y >= 0
y속도가 0이상일 때(밑으로 떨어질 때)
------------------------------------------------------------
Win
------------------------------------------------------------
이겼는가를 뜻합니다. 다음의 4가지가 있습니다.
1. Win - 결과적으로 이겼는가
2. WinKO - ko로 이겼는가
3. WinTime - 타임오버로 이겼는가
4. WinPerfect - 퍼펙트로 이겼는가
예)
1. trigger1 = Win
이겼을 때
2. trigger1 = !WinKO
KO로 이기지 않은 경우
------------------------------------------------------------
1
------------------------------------------------------------
항상실행. 즉 trigger1 = 1 이렇게 쓰면 그 스텟 내에서 해당 명령을 계속 실행해라 하는
것이 됩니다.
주의할점은 trigger1 = 1을 쓰면 다른스텟으로 넘어가는 순간까지 해당명령이 실행되기
때문에 cns의 changestate명령이나 selfstate명령에 의해 스텟이 바뀐후에도
1프레임동안(다음스텟의 time = 0일때까지) 해당명령이 실행되게 됩니다.
따라서 정확히 그 스텟 내에서만 명령이 실행되게 하고 싶으면 trigger1 = animtime < 0
이런식으로 상황에 맞게 써줘야 합니다.
==== (여기까지 일단 트리거들 설명 끝이고 추가적으로) =========================
====================================================================
Trigger redirection
====================================================================
원래 exp.txt에 있는거지만 여기 있는게 나을 것 같아서 여기 써놨습니다.
트리거를 쓸 때 자기자신의 조건 말고도 헬퍼나 상대의 상태를 검사할수도 있습니다.
예를들어 trigger1 = time = ? 이러는 것 외에 trigger1 = parent, time = ? 이라고 하면
parent의 time값을 검사합니다. parent니 뭐니 하는건 밑에 설명.
쓸 수 있는 종류는 다음과 같습니다.
*) parent
자기자신을 만든 부모를 뜻합니다. 헬퍼에 쓰이는데 예를들어 캐릭터 A가 있고 A가 생성
시킨 헬퍼 B가 있고 헬퍼B에서 만든 헬퍼C가 있다고 쳤을때
B의 parent는 A가 되고 C의 parent는 B가 됩니다.
B의 스텟에서 trigger1 = parent, time = ? 이라고 하면 A의 스텟타임을 검사하는것입니다.
*) root
자신을 만든 근원(?). 위와 같은 상황에서 B와 C의 root는 A가 됩니다.
*) helper
자신이 만든 헬퍼를 뜻하는데 그냥 helper, 라고 쓰면 맨처음 만든 헬퍼를 뜻한다고
하네요. 그런데 그냥 helper, 로는 거의 쓰지 않고 밑과 같이 helper(ID)로 씁니다.
*) helper(ID)
헬퍼를 만들 때 아이디를 줄수있는데 그 아이디를 가진 헬퍼를 뜻합니다. helper(1234), 라
고 하면 ID 1234의 헬퍼를 뜻합니다.
*) target
공격을 맞춘(막아도 포함) 첫 번째 상대. 이것도 그냥 target으로는 거의 쓰지않고 밑처럼
ID를 줘서 씁니다. 상대의 movetype 이 H일경우에만 되며 상대 movetype이 H가 아닐
경우 타겟에서 벗어납니다.
원문: Redirects the trigger to the first target found.
첫 번째 상대라곤 하지만 2명이상이 같이 맞았을땐 아무 타겟이나 찍는군요.
*) target(ID)
공격판정을 낼 때 ID를 정해줄수 있는데 이걸 이용해 해당 공격에 맞은 타겟을 검사합니
다. target(200), 라고 쓰면 ID 200 인 공격에 맞은 타겟을 뜻합니다.
*) partner
2대2 대전 등을 할 때 같은편 파트너를 뜻합니다. 노멀 헬퍼와 뉴트럴 플레이어는 파트너
에 속하지 않는다고 하는데 하여튼 헬퍼를 제외한 같은편은 파트너로 간주됩니다.
*) enemy
첫 번째 적. 역시 노멀헬퍼와 뉴트럴플레이어는 간주되지 않는다는군요.
*) enemy(n)
괄호안의 숫자는 몇번째 적이냐 하는걸 뜻한다는데 써보지 않아서 정확한 건 모르겠군요.
첫 번째가 2p이고 두 번째가 4p쯤 되지 않을까 싶군요.
*) enemyNear
가장 가까이 있는 적
*) enemyNear(n)
n번째 가까이 있는 적. 0이 가장 가까이 있는적이고 1이 두 번째 가까이 있는 적인듯.
*) playerID(ID)
해당 아이디를 지닌 플레이어. ID를 보려면 displayclipboard 나 appendtoclipboard를 써
서 id를 봐야하는데 이 아이디가 1:1 할 때와 1:2 랑 2:2 할 때 각각 다르므로 대체 어디다
쓰는건지 모르겠습니다.
이들중 2가지이상 중복하여 쓰면 에러납니다. 예) root,target,time = ? 처럼 쓰면 에러.
===================================================================
트리거가 잘못될 경우 캐릭선택시 튕기거나 작은 잘못일 경우 디버그모드에서 흰색글씨로
나온다거나 하므로 메시지를 확인하고 해당부분이 왜 에러가 나는지 생각해서 제대로
고칩시다.
작은 잘못은 예를들어 trigger1 = target(10), stateno = 1031 이라고 썼는데 아이디 10인
타겟이 없을 경우 디버그모드에서 타겟이 없다고 흰색 글씨로 계속 뜨게 됩니다. 이럴
경우는
trigger1 = numtarget(10) > 0
trigger1 = target(10), stateno = 1031
이런식으로 고쳐줘야 합니다. numtarget(10) > 0이 항상 위에 있어야 하고 꼭 두줄로 써야
하며 한줄로 쓰면 마찬가지로 흰색글씨 뜹니다. 예를들어
trigger1 = numtarget(10) > 0 && target(10), stateno = 1031
이렇게 한줄로 묶어서 쓰지말고 꼭 위처럼 2줄로 써야 흰색글씨가 뜨지 않습니다.
이런 건 안고쳐도 게임엔 문제없지만 디버그모드사용시 흰색글씨가 계속뜨는게 보기 안좋으
므로 고치는 거랍니다.
선생님 : Ihoo1836트리거
(역시 용어가 애니매이션의 스프라이트를 뜻하는 '프레임'과 게임상의 1/60초를 뜻하는
'프레임'이 헷갈릴수 있어서 전자의 경우 그냥 '스프라이트'라고 했고 '프레임'이라고 한
경우는 1/60초를 뜻하는 경우만 사용했습니다.)
캐릭터의 동작을 만들기 위해선 명령어가 필요합니다. 예를들어 캐릭터를 앞으로 얼만큼 이
동시킨다든지 언제 공격판정을 만든다든지 하는 것 등인데 이 명령을 수행할 때 조건이 트
리거입니다. 원본파일은 docs폴더의 trigger.txt인데 모르는건 원문그대로.
윈무겐에서 달라진점은 윈무겐 docs폴더의 update.txt 파일을 보면 원문이 있습니다.
앞서도 설명했듯이 명령어의 구조가
[State 번호, ?] ;state 뒤의 번호는 암거나 써도 상관없으나 에러메세지가 뜰 때 알아보
;기 쉽게하기 위해 statedef 의 번호(스텟넘버)랑 맞춰주는게 일반적.
type = ? ;명령어
trigger? ;조건
~~~ ;추가 파라미터
이렇게 되는데 트리거에 쓰인 조건을 만족하면 그 명령이 실행된다는 것입니다.
예를 들어
[state 200]
type = posadd
trigger1 = time = 0
x = 10
이렇게 하면 스텟 시작하자마자 x축으로 10만큼 캐릭터를 앞으로 이동시켜라 하는 게
됩니다.
추가적으로 설명하자면 트리거의 값이 1이 될 경우 해당명령을 실행합니다.
조건인 time = 0을 만족할 경우 컴퓨터는 값 '1(true:맞음)'을 돌려주므로 결과적으로 저
문장은 'trigger1 = 1' 이 되서 해당명령이 실행되는 것입니다. 조건을 만족하지 않으면
컴퓨터는 값 '0(false:틀림)'을 돌려줍니다. 'trigger1 = 0'이 되면 해당명령은 실행되지
않습니다.
또한 triggerall 이라는게 있는데 무조건 만족해야 하는 트리거를 뜻합니다.
예를들어
triggerall = statetype = A
trigger1 = command = "a"
trigger2 = command = "b"
라고 하면 캐릭터가 무조건 스텟타입이 A이어야 하며, a나 b버튼을 눌렀을 때 라는 뜻이
됩니다.
트리거 뒤의 숫자는 차례대로 가야 합니다. 예를들어 trigger2 뒤에 trigger4가 써있으면
제대로 검사가 되지 않습니다.
그리고 디버그모드는 MUGEN.CFG에서 ALLOWDEBUGMODE = 1로 설정돼있으면 도스무
겐에선 ctrl + d 키로 되지만 윈무겐은 무겐실행시 winmugen.exe가 아닌 debug.exe로
실행을 해야 됩니다. 디버그 모드에서는 캐릭터의 애니매이션번호와 스텟번호. gametime과
스텟time, animtime, statetype, ctrl 등의 정보를 볼 수 있습니다.
ctrl+c를 누르면 캐릭터의 판정박스와 무적정보 등이 나옵니다.
만약 모르겠는 트리거가 있다면 CNS의 Displaytoclipboard명령과 appendtoclipboard명령을
사용하면 알수 있을것입니다.
그리고 반환되는 값을 말할 때 1이면 True값이고 0이면 False값이니까 설명되어있지 않아
도 이해하시길 바랍니다.
====================================================================
;여긴 원문그대로
This is an alphabetical index of function-type triggers. For details
on use of function-type triggers in expressions, see the expression
documentation. Unless otherwise specified, we will use P1 to represent
the player who is evaluating the trigger, and P2 to represent his
opponent (usually the closest opponent when in team mode).
Some triggers are nonstandard and cannot take expressions as their
arguments. These are marked with a (*) in the index. Some triggers are
deprecated; these are marked with a (**). Use of these triggers is not
encouraged, as support for them may be removed in future versions of
the engine.
Old-style triggers, marked (***), appear only in clauses of the form
(trigger) (relational operator) (value). See section 8 of exp.doc for
more details.
For all triggers, SFalse will be returned if the trigger is redirected
to a nonexistent destination, or if the ID number for the redirection
evaluates to SFalse. This is not listed in the error conditions for
each trigger.
트리거 목록입니다. 대문자로 쓰나 소문자로 쓰나 같습니다.
--------------------------
-Abs
-Acos
-Alive
-Anim
-AnimElem(*,***)
-AnimElemNo
-AnimElemTime
-AnimExist
-AnimTime
-Asin
-Atan
-AuthorName(*,***)
-BackEdgeBodyDist
-BackEdgeDist
-CanRecover
-Ceil
-Command(*,***)
-Const(*)
-Cos
-Ctrl
-DrawGame
-E
-Exp
-Facing
-Floor
-FrontEdgeBodyDist
-FrontEdgeDist
-FVar
-GameTime
-GetHitVar(*)
-HitCount
-HitDefAttr(*,***)
-HitFall
-HitOver
-HitPauseTime
-HitShakeOver
-HitVel
-ID
-IfElse
-InGuardDist(윈무겐전용)
-IsHelper
-IsHomeTeam
-Life
-LifeMax(윈무겐전용)
-Ln
-Log
-Lose
-MatchNo
-MatchOver
-MoveContact
-MoveGuarded
-MoveHit
-MoveReversed(윈무겐전용)
-MoveType(*,***)
-Name(*,***)
-NumEnemy
-NumExplod
-NumHelper
-NumPartner
-NumProj
-NumProjID
-NumTarget
-P1Name(*,***)
-P2BodyDist
-P2Dist
-P2Life
-P2MoveType(*,***)
-P2Name(*,***)
-P2StateNo
-P2StateType(*,***)
-P3Name(*,***)
-P4Name(*,***)
-PalNo
-ParentDist
-Pi
-PlayerIDExist
-PrevStateNo
-Pos
-Power
-PowerMax(윈무겐전용)
-ProjCancelTime
-ProjContact(*,***)
-ProjContactTime
-ProjGuarded(*,***)
-ProjGuardedTime
-ProjHit(*,***)
-ProjHitTime
-Random
-RootDist
-RoundNo
-RoundsExisted
-RoundState
-ScreenPos
-SelfAnimExist
-Sin
-StateNo
-StateType(*,***)
-SysFVar
-SysVar
-Tan
-TeamMode(*,***)
-TeamSide
-TicksPerSecond
-Time
-TimeMod(*,**,***)
-UniqHitCount
-Var
-Vel
-Win
위의 트리거중에 수학 트리거 목록
----------------------
-abs
-acos
-asin
-atan
-ceil
-cos
-e
-exp
-floor
-IfElse
-ln
-log
-pi
-sin
-tan
------------------------------------------------------------
Abs
------------------------------------------------------------
절대값을 구하는 트리거입니다.
형식
abs(절대값을 구할 값)
괄호안의 수가 정수라면 정수를, 실수라면 실수를 돌려줍니다.
-2의 절대값은 2이고 뭐 이런거 수학에서 나오는데 그거 같습니다만 써본적이 없습니다.
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
------------------------------------------------------------
Acos
------------------------------------------------------------
Computes the arccosine (in radians) of the specified argument.
무슨 삼각함수 라디안에 관련된 코사인 같은데 써본적도 없고 모르겠군요.
Format:
acos(exprn)
Arguments:
exprn
Expression to compute the arccosine of (float).
Return type:
float(실수. 영어원문에서 int는 정수, float은 실수를 뜻합니다)
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn is not in
the domain of arccosine (which is [-1.0,1.0]).
Example:
value = acos(1)
Sets value to the arccosine of 1, which is approximately 0.0
(possibly with some rounding error.)
------------------------------------------------------------
Alive
------------------------------------------------------------
플레이어가 살아있다면 1(true)값을 돌려주고 ko된 상황(체력이 0일때)이면 0을 돌려줍니다.
예)
trigger1 = alive = 0
플레이어가 ko됐을 때
------------------------------------------------------------
Anim
------------------------------------------------------------
플레이어의 애니매이션 번호를 검사합니다.
예)
trigger1 = Anim = 200
액션번호가 200 일때
------------------------------------------------------------
AnimElem(*,***)
------------------------------------------------------------
애니매이션의 몇번째 스프라이트인가를 검사합니다.
예를들어 air파일에서 다음과 같은 액션200이 있다고 칩시다.
[begin action 200]
0,0,0,0,4 - 첫 번째 스프라이트
0,1,0,0,5 - 두 번째 스프라이트
0,2,0,0,6 - 세 번째 스프라이트
이 됩니다.
형식
1. AnimElem = value1
2. AnimElem = value1, [oper] value2
[oper]에 들어가는 부호
=, !=, <, >, <=, >=
value1 (정수)
몇번째 스프라이트인가
value2 (정수)
그 스프라이트에서 몇프레임 째인가
예)
trigger1 = AnimElem = 2
애니매이션의 2번째 스프라이트 시작 직후를 뜻합니다. 그러니까 위의 액션200에서
스프라이트 0,1이 나올 때를 뜻합니다. 다음과 같이 써도 같은 뜻이 됩니다.
trigger1 = AnimElem = 2, = 0 (2번째 스프라이트의 1번째 프레임)
(정확히 말하자면 1번째 스프라이트가 끝나고 2번째 스프라이트로 넘어가는 순간!을 뜻
합니다.)
trigger1 = AnimElem = 2, = 4
2번째 스프라이트 시작 후 4프레임 지났을 때를 뜻합니다. 그러니까 위의 액션200에서
는 스프라이트 0,1이 끝나기 직전이 되겠네요.
(역시 정확히 말하자면 4프레임 지나고 5프레임으로 넘어가는 순간!을 뜻합니다.)
trigger1 = AnimElem = 2, >= 0
trigger1 = AnimElem = 3, < 0
2번째 스프라이트 시작 직후부터 3번째 스프라이트가 나오기 전까지입니다.
만약 3번째 스프라이트가 없다면 2번째 줄은 다음과 같은뜻이 됩니다.
trigger1 = AnimTime <= 0
* 캐릭터가 스텟에 오자마자(animelem=1에) 적의 공격을 막는(가드스텟으로 가는) 경우가
있는데 이경우엔 만약 스텟시작하자마자 poweradd=-1000같은(필살기같은데 쓰이는)게
있을 경우 기만 날리고 기술은 안나가는 경우가 생길수 있습니다. 따라서 이런 상황을 막기
위해서 이런건 trigger1 = animelem = 1,1 이나 trigger1 = time = 1 이런식으로 씁시다.
------------------------------------------------------------
AnimElemNo
------------------------------------------------------------
애니매이션의 스프라이트의 프레임의 범위를 검사?. 설명이 어렵네요. 예를 봅시다.
Returns the number of the animation element in the current action
that would be displayed at the specified time. The argument to AnimElemNo
represents the time to check, expressed in game ticks, relative to the present.
(영어원문에서 tick 이라고 함은 게임진행시간(프레임)을 말하는 것으로 1tick은 1/60초
= 1프레임 입니다)
Format:
AnimElemTime(exprn)
Arguments:
exprn
Expression that evaluates to the time offset (int).
Return type:
int
Error conditions:
Returns SFalse if you try to check a time that would fall before the
start of the current action.
Notes:
If the action is currently within its looping portion, then it is
assumed to have been looping forever. That is, no matter how far into
the past you check, AnimElemNo will always return an element number
that lies within the looping portion of the action.
Examples:
trigger1 = AnimElemNo(0) = 2
True when the animation element to be displayed 0 ticks in the
future (i.e., now) is element 2. This is equivalent to:
이건 다음과 같습니다.
trigger1 = AnimElem = 2, >= 0
trigger1 = AnimElem = 3, < 0
trigger1 = AnimElemNo(2) = 4
True when the animation element that will be displayed two ticks
from now is element 4. This is equivalent to:
이건 다음과 같습니다.
trigger1 = AnimElem = 4, >= -2
trigger1 = AnimElem = 5, < -2
이 animelemno(?)는 잘 쓰이진 않지만 애니매이션을 정시시킬 때 쓸수도 있습니다.
예를들어
[state 500]
type = changeanim
trigger1 = 1
value = anim
elem = animelemno(-1)
이렇게 쓰면 현재 스프라이트가 유지되는데 제캐릭터 쿠로키시의 얼음빔에 맞은 스텟이나
진념 연옥영파 모으는중 히트시 구체를 정지시킬 때, 드레이븐 아이스스톰 맞았을 때 등에
쓰였습니다. 11-cns명령어 파일의 changeanim부분 참조.
------------------------------------------------------------
AnimElemTime
------------------------------------------------------------
안써봤습니다.
Gets the animation-time elapsed since the start of a specified element
of the current animation action. Useful for synchronizing events to
elements of an animation action.
(reminder: first element of an action is element 1, not 0)
Format:
AnimElemTime(exprn)
Arguments:
exprn
Expression that evaluates to the element number to check (int).
Return type:
int
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn evaluates
to an element number that is not valid for the current action.
Examples:
trigger1 = AnimElemTime(2) = 0
True on the first game-tick that the player's animation
is on element 2. Is equivalent to saying:
이건 다음과 같습니다.
trigger1 = AnimElem = 2
trigger1 = AnimElemTime(2) = 4
True 4 game-ticks after the start of the player's
second animation element.
정확히는 모르겠지만 이건 animelem = 2, =4 와 같은것같군요.
trigger1 = AnimElemTime(2) >= 0
trigger1 = AnimElemTime(3) < 0
이건
animelem = 2, >= 0
animelem = 3, <0 과 같은 것 같습니다.
True for the whole of the second element of the player's
animation, assuming there is a third element. If a
third element does not exist, the second line will evaluate
to SFalse and hence trigger1 will never trigger. In this case,
the second line should read,
trigger1 = AnimTime <= 0
------------------------------------------------------------
AnimExist
------------------------------------------------------------
애니매이션 번호가 존재하는지를 검사하는것인데 상대방에 맞아서 상대 스텟으로 간
경우 오작동할수도 있으므로 거의 쓰이지 않고 대신 selfanimexist가 쓰입니다.
예)
trigger1 = !AnimExist(200)
애니매이션 200번이 존재하지 않을때
------------------------------------------------------------
AnimTime
------------------------------------------------------------
애니매이션이 끝날때의 animtime 은 0이 되고 그이전엔 -값에서 계속 0을 향해 1씩
더해집니다.
예를들어 전체 지속시간이 7프레임인 애니매이션이 있다고 하면 그 애니매이션 시작직후
animtime 값은 -7 이며 7프레임째의 값은 -1 그리고 끝날때는 0이 됩니다.
AIR파일에서 loopstart가 쓰여있다고 해도 마지막 스프라이트의 지속시간이 끝나면
animtime값은 0이 됩니다.
예)
trigger1 = AnimTime = 0
애니매이션이 끝났을 때.
이건 대부분의 스텟 마지막 부분에 changestate명령과 함께 쓰입니다.
------------------------------------------------------------
Asin
------------------------------------------------------------
이것도 삼각함수 같은데 모르겠군요.
Computes the arcsine (in radians) of the specified argument.
Format:
asin(exprn)
Arguments:
exprn
Expression to compute the arcsine of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn is not in
the domain of arcsine (which is [-1.0,1.0]).
Example:
value = asin(1)
Sets value to the arcsine of 1, which is approximately pi/2
(possibly with some rounding error.)
------------------------------------------------------------
Atan
------------------------------------------------------------
역시 삼각함수
Computes the arctangent (in radians) of the specified argument.
Format:
atan(exprn)
Arguments:
exprn
Expression to compute the arctangent of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = atan(1)
Sets value to the arccosine of 1, which is approximately pi/4
(possibly with some rounding error.)
------------------------------------------------------------
AuthorName(*,***)
------------------------------------------------------------
제작자의 이름을 검사합니다.
해당 캐릭터의 def파일내에 있는 authorname을 검사하는 것입니다.
예)
trigger1 = Authorname = "sanderx"
def파일에 쓰여있는 authorname이 sanderx 일 경우
------------------------------------------------------------
BackEdgeBodyDist
------------------------------------------------------------
캐릭터의 back.width부터 캐릭터뒤쪽의 화면구석까지의 거리를 구합니다.
그런데 backedgedist와 값의 차이를 모르겠군요.
결과값은 실수입니다만 중요하지 않습니다.
예)
trigger1 = BackEdgeBodyDist < 30
캐릭터의 뒤 너비부터 캐릭터 뒤쪽 스크린 가장자리 까지의 거리가 30픽셀(도트)
미만일 경우
------------------------------------------------------------
BackEdgeDist
------------------------------------------------------------
캐릭터의 x축 중심부터 뒤쪽 화면 가장자리까지의 거리를 구합니다.
역시 backedgebodydist 와 값이 똑같이 나오는군요
결과값은 실수입니다만 역시 중요치 않습니다.
예)
trigger1 = BackEdgeDist < 30
캐릭터의 x축 중심부터 뒤쪽 화면 가장자리까지의 거리가 30픽셀 미만일 경우
------------------------------------------------------------
CanRecover
------------------------------------------------------------
캐릭터가 맞아서 날아가는 중일 때 낙법을 할수 있으면 1을 반환하고 그렇지 않으면
0을 반환합니다. 낙법이 가능한지 불가능한지는 cns의 hitdef의 명령어에 따라 정해집니다.
예) trigger1 = canrecover
------------------------------------------------------------
Ceil
------------------------------------------------------------
수를 올림한 값을 구합니다. 음수일 경우 그 수보다 크거나 같은 정수를 구합니다.
형식
ceil(수)
예)
ceil(5.5)의 값은 6
ceil(5.1)의 값도 6
ceil(-2.6)의 값은 -2
------------------------------------------------------------
Command (*,***)
------------------------------------------------------------
커맨드 입력 감지
예)
trigger1 = Command = "fireball"
fireball 커맨드를 입력했을 때
trigger1 = command != "holdback"
뒤 키를 누르고 있지 않을 때
도스무겐에선 입력된 커맨드 지속시간이 1프레임 이었지만, 윈무겐에서는 cmd파일에
추가된 부분인 [defaults]부분의 command.buffer.time 만큼 지속됩니다. 기술 발동할 때
커맨드를 입력하면 CMD에서 커맨드를 감지해서 스텟을 이동시키는데, 도스무겐에선
이동한 스텟의 time = 0 까지만 커맨드를 입력한걸로 감지하지만, 윈무겐에선 저
값대로(기본값1인 경우 time = 1까지) 감지합니다.
command.buffer.time 값이 1(기본값)이라고 쳤을때
type = varset
trigger1 = time > 0
trigger1 = command = "xx"
이런 부분은 같은커맨드로 연결하는 기술(이오리 규화(밑,뒤+손)같은)에 쓰였었는데
윈무겐을 위해 time > 0 부분을 time > 1 로 고쳐야 합니다.
예를들자면 제 이오리 [statedef 520]에서 다음과 같은 부분이 있습니다.
[State 325,8]
type = Varset
triggerall = time > 1
triggerall = time < 35
triggerall = var(55) = 0
trigger1 = command = "3p1_z"
trigger2 = command = "3p1_x"
persistent = 0
var(5) = 1
이곳의 time > 1을 time > 0으로 고친후 강규화를 실험해보면, 도스무겐에선 문제가
없지만 윈무겐에선 강규화1타가 맞을 경우 2타가 저절로 나가는 현상이 나타납니다.
------------------------------------------------------------
Const (*)
------------------------------------------------------------
캐릭터의 cns파일 처음 부분에 있는 여러 가지 값들을 검사하는 것입니다.
형식
Const(파라미터 이름)
CNS파일 처음부분의 [Data]부분의 값을 검사할 때. (해당 값들을 검사합니다. 굳이 해석할
필요는 없겠죠?)
data.life: Returns value of the "life" parameter. (int)
data.attack: Returns value of the "attack" parameter. (int)
data.defence: Returns value of the "defence" parameter. (int)
data.fall.defence_mul: Returns value of the defence multiplier,
calculated as 100/(f+100), where f is the "fall.defence_up"
parameter. (float)
data.liedown.time: Returns value of the "liedown.time" parameter.
(int)
data.airjuggle: Returns value of the "airjuggle" parameter. (int)
data.sparkno: Returns value of the "sparkno" parameter. (int)
data.guard.sparkno: Returns value of the "guard.sparkno" parameter.
(int)
data.KO.echo: Returns value of the "ko.echo" parameter. (int)
data.IntPersistIndex: Returns value of the "IntPersistIndex"
parameter. (int)
data.FloatPersistIndex: Returns value of the "FloatPersistIndex"
parameter. (int)
CNS의 [Size]부분 값들을 검사할때
size.xscale: Returns value of the "xscale" parameter. (float)
size.yscale: Returns value of the "yscale" parameter. (float)
size.ground.back: Returns value of the "ground.back" parameter.
(int)
size.ground.front: Returns value of the "ground.front" parameter.
(int)
size.air.back: Returns value of the "air.back" parameter. (int)
size.air.front: Returns value of the "air.front" parameter. (int)
size.height: Returns value of the "height" parameter. (int)
size.attack.dist: Returns value of the "attack.dist" parameter.
(int)
size.proj.attack.dist: Returns value of the "proj.attack.dist"
parameter. (int)
size.proj.doscale: Returns value of the "proj.doscale" parameter.
(int)
size.head.pos.x: Returns x-component of the "head.pos" parameter.
(int)
size.head.pos.y: Returns y-component of the "head.pos" parameter.
(int)
size.mid.pos.x: Returns x-component of the "mid.pos" parameter.
(int)
size.mid.pos.y: Returns y-component of the "mid.pos" parameter.
(int)
size.shadowoffset: Returns value of the "shadowoffset" parameter.
(int)
size.draw.offset.x: Returns x-component of the "draw.offset"
parameter. (int)
size.draw.offset.y: Returns y-component of the "draw.offset"
parameter. (int)
CNS의 [Velocity]부분의 값을 검사할 때. 주로 스텟 20(걷기)이나 100(달리기)에서 이
파라미터들을 쓰게 되죠
velocity.walk.fwd.x: Returns value of the "walk.fwd" parameter.
(float)
velocity.walk.back.x: Returns value of the "walk.back" parameter.
(float)
velocity.run.fwd.x: Returns x-component of the "run.fwd" parameter.
(float)
velocity.run.fwd.y: Returns y-component of the "run.fwd" parameter.
(float)
velocity.run.back.x: Returns x-component of the "run.back"
parameter.
(float)
velocity.run.back.y: Returns y-component of the "run.back"
parameter.
(float)
velocity.jump.y: Returns y-component of the "jump.neu" parameter.
Note: this is NOT "velocity.jump.neu.y". Only the "neu"
parameters take a y-component value. (float)
velocity.jump.neu.x: Returns x-component of the "jump.neu"
parameter.
(float)
velocity.jump.back.x: Returns value of the "jump.back" paramamter.
(float)
velocity.jump.fwd.x: Returns value of the "jump.fwd" parameter.
(float)
velocity.runjump.back.x: Returns value of the "runjump.back"
paramamter. (float)
velocity.runjump.fwd.x: Returns value of the "runjump.fwd"
parameter.
(float)
velocity.airjump.y: Returns y-component of the "airjump.neu"
parameter. Note: this is NOT "velocity.airjump.neu.y".
(float)
velocity.airjump.neu.x: Returns x-component of the "airjump.neu"
parameter. (float)
velocity.airjump.back.x: Returns value of the "airjump.back"
paramamter. (float)
velocity.airjump.fwd.x: Returns value of the "airjump.fwd"
parameter.
(float)
역시 [Movement]부분의 값들을 검사할때
movement.airjump.num: Returns value of the "airjump.num" parameter.
(int)
movement.airjump.height: Returns value of the "airjump.height"
parameter. (int)
movement.yaccel: Returns value of the "yaccel" parameter. (float)
movement.stand.friction: Returns value of the "stand.friction"
parameter. (float)
movement.crouch.friction: Returns value of the "crouch.friction"
parameter. (float)
예)
trigger1 = Const(velocity.walk.fwd.x) > 4
CNS파일의 [velocity]부분에 있는 walk.fwd 의 값이 4보다 클 경우
------------------------------------------------------------
Cos
------------------------------------------------------------
삼각함수의 코사인 값을 구합니다. 괄호안에 각도를 쓰는 듯. 예를들어 cos(0) = 1입니다.
실수를 쓸수도 있는데 그것에 대해선 모르겠군요.
Computes the cosine of the specified argument (in radians.)
Format:
cos(exprn)
Arguments:
exprn
Expression to compute the cosine of. (float)
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = cos(0)
Sets value to the cosine of 0, which is approximately 1.0
(possibly with some rounding error.)
------------------------------------------------------------
Ctrl
------------------------------------------------------------
캐릭터 조종이 가능할 경우(?)1을 돌려주고 그렇지 않으면 0을 돌려줍니다.
ctrl값이 0인지 1인지는 각 스텟의 처음 부분의 ctrl =? 등에 따라 결정됩니다.
예)
trigger1 = Ctrl
캐릭터가 컨트롤가능할 경우
------------------------------------------------------------
DrawGame
------------------------------------------------------------
그 라운드를 비길 경우 1이 되고 아니면 0이 됩니다.
예)
trigger1 = DrawGame
라운드가 비긴 상태로 끝날 경우
------------------------------------------------------------
E
------------------------------------------------------------
e값(2.718281828..)이라는데 대학교 고급수학이나 물리에서 나오나? 저는 모르겠습니다.
Returns the value of e (2.718281828...)
Format:
e
Arguments:
none
Return type:
float
Error conditions:
none
------------------------------------------------------------
Exp
------------------------------------------------------------
수학 연산자인데 몰라요.
Computes the exponential of the argument (e raised to the power of
the argument.) This produces slightly more accurate results than the
equivalent expression e**(argument).
Format:
exp(exprn)
Arguments:
exprn
Expression to compute the exponential of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = exp(4-var(0))
Sets value to e raised to the quantity 4-var(0).
------------------------------------------------------------
Facing
------------------------------------------------------------
캐릭터가 오른쪽을 향아고 있으면 1을, 왼쪽을 향하고있으면 -1 값을 줍니다.
예)
Trigger = Facing = -1
캐릭터가 왼쪽을 보고 있을 때
------------------------------------------------------------
Floor
------------------------------------------------------------
버림한 값을 구합니다. ceil과 반대. 음수일 경우 그 수보다 작거나 같은 정수를 구합니다.
예)
floor(5.5)의 값은 5
floor(-2.1)의 값은 -3
------------------------------------------------------------
FrontEdgeBodyDist
------------------------------------------------------------
캐릭터의 앞쪽 너비에서부터 앞쪽 스크린 구석까지의 거리를 구합니다.
역시 밑의 frontedgedist와 갚이 같게 나오는데 어떨 때 다르게 나오는지 모르겠습니다.
예)
trigger1 = FrontEdgeBodyDist < 30
플레이어의 앞쪽 너비부터 앞쪽 스크린 끝까지의 거리가 30픽셀(도트) 미만일 경우
------------------------------------------------------------
FrontEdgeDist
------------------------------------------------------------
플레이어의 x축을 기준으로 앞쪽 스크린구석까지의 거리를 구합니다.
frontedgebodydist와 값이 같게 나오는데 어떨 때 다른지 모르겠습니다.
예)
trigger1 = FrontEdgeDist < 30
플레이어 x축과 앞쪽 스크린 가장자리까지의 거리가 30픽셀 미만일 경우
------------------------------------------------------------
FVar
------------------------------------------------------------
실수변수인 fvar의 값을 검사합니다. fvar(0)부터 fvar(39)까지 있습니다.
값을 정하는 것은 cns명령어인 varset, varadd 로 합니다.
예)
trigger1 = FVar(5) = -1.23
fvar(5)의 값이 -1.23 일 경우
------------------------------------------------------------
GameTime
------------------------------------------------------------
라운드가 시작되면 Gametime은 계속 흘러갑니다. cns명령어인 pause 등으로 게임
화면이 멈춰도 상관없이 1초에 60씩 계속 올라갑니다.
gametime은 주로 일정시간마다 실행할 명령의 조건에 사용됩니다.
예)
trigger1 = (GameTime%27)=0
gametime을27로 나눈 나머지가 0인 경우. 즉, 27프레임마다를 뜻합니다.
------------------------------------------------------------
GetHitVar(*)
------------------------------------------------------------
맞은 공격의 속성(값)들을 검사합니다. cns의 공격판정을 내는 명령인 hitdef의 속성에 따라
값들이 결정되는데, 주로 공격을 한 상대방의 hitdef에서 검사합니다.
Gethitvar는 movetype = H 일 경우에만 지속되며 I일 경우 사라집니다. A일경우엔 일부만
사라지는 듯.
형식
GetHitVar(파라미터이름)
파라미터 종류
xveladd, yveladd, type, animtype, airtype, groundtype, damage,
hitcount, fallcount, hitshaketime, hittime, slidetime, ctrltime,
recovertime, xoff, yoff, zoff, xvel, yvel, yaccel, hitid,
chainid, guarded, fall, fall.damage, fall.xvel, fall.yvel,
fall.recover, fall.time, fall.recovertime, isbound(윈무겐전용).
자세히
xveladd: Returns the additional x-velocity that is added to the
player's own when he is KOed. (float)
KO됐을 때 x속도 더하는 값? 써본적이 없네요. 아마 캐릭터가 KO될때 x,y속도
가 일정값만큼 더해져서 날아가게 되는데 그걸 말하는듯.
yveladd: Returns the additional y-velocity that is added to the
player's own when he is KOed. (float)
type: hitdef의 type. 지상에서 맞으면 ground.type 의 값, 공중이면 air.type의 값입
니다. 0 - none, 1 - high, 2 - low, 3 - trip(3값은 지상에서만 받음)
animtype: hitdef의 animtype에 따라 해당 값을 돌려줍니다. 0 - light, 1 - medium, 2
- hard, 3 - back, 4 - up, 5 - diagup
airtype: hitdef의 air.type값. 돌려주는 값은 위의 type과 같습니다.
groundtype: 마찬가지로 hitdef의 ground.type 값
damage: damage 값
hitcount: 맞은 횟수입니다. 예를들어 2히트콤보를 맞으면 2 뭐 이런식입니다.
fallcount: 콤보맞아서 다운된 횟수
hitshaketime: 경직시간. hitdef의 pausetime 의 영향을 받는데 예를들어 pausetime이 10
인 공격에 맞을 경우 hitshaketime 은 10에서 1씩 줄기 시작해서 10프레임
후엔 0이 됩니다.
hittime: Hitdef의 hittime. 맞아서 회복되는데 걸리는 전체 시간
slidetime: Hitdef의 slidetime. 맞았을 때 밀림이 멈추는데까지 걸리는 시간
ctrltime: 공격을 가드(막다)한 후 컨트롤가능하게 되기까지 시간
recovertime: 넘어졌을 때 일어나기 전까지 시간. 이 값은 0을 향해 점점 줄기 시작하는
데 방향키를 흔들거나 버튼을 연타하면 더 빨리 줄어듭니다.
xoff: "Snap" x offset when hit (deprecated) hitdef의 snap의 x위치?
yoff: "Snap" y offset when hit (deprecated) hitdef의 snap의 y위치?
zoff: "Snap" z offset when hit (deprecated) hitdef의 snap의 z위치? z위치가 뭘뜻하는
지 모르겠군요.
xvel: 맞아서 x방향 밀려나는 속도. hitdef의 velocity들에 있음 (당연히 정수가 아닌 실수)
yvel: 맞아서 y방향으로 뜨는 속도 (역시 실수)
yaccel: Hitdef 의 yaccel값. 맞고 넘어질 때 y 축 가속도 (실수)
chainid: Player-assigned chainID for last hit taken. (int)
마지막 맞은 공격의 chaninID 값인듯 (정수)
guarded: 마지막 받은 공격을 가드했을 경우 1을 돌려주며 아니면 0을 돌려줍니다.
isbound: 플레이어가 상대의 TargetBind 명령의 영향을 받고있으면 1값을
돌려줍니다. 던져지는 스텟에서 버그방지하는데 유용하다는군요(2vs2대전시
p2stateno가 있는 hidef공격이 맞자마자 또다른 상대에게 맞을 경우 발생하는
걸 말하는 듯. 맞은쪽만 스텟이동되는 것). (윈무겐 전용입니다)
fall: 다운되면 1(TRUE), 아니면 0(FALSE)값을 돌려줍니다.
fall.damage: Damage taken upon fall (int) 넘어진 상태에서 받은 대미지인 듯 (정수)
fall.xvel: 바운드(튕김)될 때 x속도. Hitdef의 fall.xvelocity 값 (실수)
fall.yvel: 바운드(튕김)될 때 y속도. Hitdef의 fall.yvelocity 값 (실수)
fall.recover: 낙법이 가능하면 True(1)값을 주며 그렇지 않으면 false(0)값을 줍니다.
fall.recovertime: 낙법이 가능하게 되기까지의 시간.
fall.kill: 넘어진 상태에서 맞았을 때 ko될수 있는가. 역시 hitdef의 fall.kill값
fall.envshake.time: hitdef의 fall.envshake.time 값. 맞고 넘어질 때 지면이 흔들리는
시간(정수)
fall.envshake.freq: hitdef의 fall.envshake.freq 값. 지면 흔들리는 주기(실수)
fall.envshake.ampl: hitdef의 fall.envshake.ampl 값. 지면 흔들리는 너비(정수)
fall.envshake.phase: Returns values set by the fall.envshake.*
parameters in an attacker's hitdef. (실수)
예)
trigger1 = GetHitVar(yvel) < -5.5
맞고 뜰 때 y속도가 -5.5 미만일 때
------------------------------------------------------------
HitCount
------------------------------------------------------------
한 스텟에서 공격을 맞춘 횟수입니다. 다른 스텟으로 넘어가면 0이 됩니다.
Uniqhitcount 랑 다른점은, 같은 공격(hitdef)을 2명의 상대에게 맞췄을 때 hitcount는 1만
증가하지만 Uniqhitcount는 2가 증가합니다.
예)
trigger1 = HitCount > 8
공격스텟이 시작되고 나서 그 스텟 내에서 한 상대에게 공격을 맞춘 횟수가 8회
초과일때
------------------------------------------------------------
HitDefAttr(*,***)
------------------------------------------------------------
활성화되어있는 hitdef의 attr 값. 써본적은 없군요.
형식
HitDefAttr [oper] value1, value2
[oper] 에는 =, != 중에 하나가 들어갈수 있다.
value1
A string that has at least one of the letters "S", "C"
and "A" for standing, crouching and aerial attacks
respectively. For example, "SA" is for standing and
aerial attacks.
S, C, A중 하나이상이 들어가는데 각각 서서공격, 앉아공격, 공중공격이며 hitdef의
attr 값에서 따옵니다. SA처럼 2가지를 쓰면 서서공격이나 앉아공격 이런식으로 되는듯
value2
A set of 2-character strings, separated by commas.
Each 2-character string must be of the form described:
The first character is either "N" for "normal", "S" for
"special", or "H" for "hyper". The second character must
be either "A" for "attack" (a normal hit attack) or "T"
for "throw". For example, "NA, ST" is for normal attacks
and special throws.
2개의 문자가 조합되는데 첫 번째 문자는 N(노멀), S(스페셜:기술), H(하이퍼:필살기)
이며 두 번째 문자는 A(공격), T(잡기)입니다. 역시 hitdef의 attr값을 검사합니다.
form:
arg1, arg2
then the trigger condition is determined to be true only
if arg1 is a subset of value1, AND arg2 is a subset of
value2.
예를들어 S, NA 라고 쓰면 서서 노멀공격일 경우 인 듯 합니다.
예)
trigger1 = A, HA
(원문은 이렇지만 틀린 것 같네요. trigger1 = hitdefattr = A, HA 이어야겠죠?)
공중 필살기 일 때
trigger1 = SC, NA, SA
(역시 틀린 것 같네요. trigger1 = hitdefattr = SC, NA, SA 이겠죠)
서서나 앉아서 공격이어야 하고 노멀공격이거나 스페셜공격(기술)일 때
------------------------------------------------------------
HitFall
------------------------------------------------------------
맞는 스텟에 있을 때 다운이 되는 상태라면 1값을 반환하고 그렇지 않으면 0값을 줍니
다. 예를들어 Hitdef의 fall 값이 1인 경우 그공격에 맞으면 Hitfall 값은 1이 됩니다.
예)
trigger1 = !HitFall
다운이 안될때(또는 다운되는 스텟으로 가게 하지 않을때)
------------------------------------------------------------
HitOver
------------------------------------------------------------
hitdef의 hittime 이 다되면 1값을 돌려줍니다. gethitvar(hittime)값이 0을 향해 계
속 줄어드는데 이 값이 0이 될 경우 1값을 돌려주는 듯.
주로 common1.cns 의 맞는 스텟들에 쓰였습니다
예)
trigger1 = HitOver = 1
hittime 이 만료될 경우. 뒤의 = 1 은 생략해도 됩니다. 반대로 쓰고싶으면
!hitover 로 씁니다.
------------------------------------------------------------
HitPauseTime
------------------------------------------------------------
공격을 맞췄을 때 hitdef의 pausetime 값으로 정해지고 그후로 값이 1/60 초당 1씩 줄어들
어 0으로 향합니다.
If ignorehitpause is not set, this will always return 0.
ignorehitpause 가 정해지면 줄지 않을수도 있다는데 아마 ignorehitpause = 0 으로 설정이
되면 hitpausetime 값이 줄지 않는다는 뜻인 듯한데 ignorehitpause=0을 쓸 이유가 없죠.
이 Hitpausetime은 히트경직중에 값이 변하기 때문에 ignorehitpause = 1을 붙여서 쓰는게
일반적입니다. ignorehitpause 는 11-CNS명령 파일의 처음부분에 설명되어있습니다.
예)
trigger1 = HitPauseTime = 0
공격의 경직이 끝났을 때.
또한 이 Hitpausetime 은 공격을 맞춘 직후 상대의 머리에서 피가 나게 한다거나 하는 효
과를 줄 때 등에 쓸수 있습니다.
예를들어 pausetime 이 15인 공격일 경우 trigger1 = Hitpausetime = 14 로 하면 공격을
맞춘 직후 라는 뜻이 되는데 ignorehitpause = 1과 같이 써야 합니다. 제캐릭터 진념의
강발 등에 쓰였습니다.
------------------------------------------------------------
HitShakeOver
------------------------------------------------------------
공격당했을때 경직이 끝나면 1을 반환, 안그러면 0을 반환합니다.
Hitdef의 pausetime의 경직을 말합니다. common1.cns의 맞는 스텟들에 쓰였습니다.
Example:
trigger1 = HitShakeOver = 0
맞아서 경직된 상태일 때
------------------------------------------------------------
HitVel
------------------------------------------------------------
공격에 맞았을 때 밀려나는 속도
hitvel x 는 x속도, hitvel y 는 y속도입니다.
원문에서는 각 값이 +인게 뒤로 밀려나거나 뜨는 거라고 나와있지만 틀렸군요.
다른것과 마찬가지로 두 속도가 -이면 뒤로 밀려나거나 위로 뜨는 겁니다.
이 값은 맞은 공격의 Hitdef에 설정된 값을 그대로 가져오게 되며 다음 Hitdef에 맞기
전까진 값이 유지됩니다.
예를들어 지상에서 ground.velocity = -13 인 Hitdef에 맞으면 Hitvel x = -13이 됩니다.
예)
trigger1 = HitVel X < -10
밀려나는 x속도가 -10 보다 작을때
------------------------------------------------------------
ID
------------------------------------------------------------
플레이어들의 ID값이며 각 플레이어는 고유의 ID값을 가집니다. 근데 1:1대전과 2:2대전
시의 값이 틀리고 어디다 쓰라는건지 모르겠습니다.
예)
value = ID
값을 ID값으로 해라
------------------------------------------------------------
IfElse
------------------------------------------------------------
조건을 검사해서 만족할때와 그렇지 않을 때 각각 다른 값을 줍니다. 쓸모가 많습니다.
형식
IfElse(조건, 조건만족시의값, 조건불만족시의값)
예)
value = ifelse(var(3),1,2)
var(3)의 값이 0이 아니면 값을 1로 정하고 그렇지않으면 2로 정해라.
주의할점은 조건을 쓸 때 enemynear, 같이 ','(콤마)가 들어가는 조건을 쓸 경우 괄호를
하나 더 쳐서 쓰지 않으면 에러나서 튕깁니다.
예를들어 ifelse(enemynear,statetype=C,-30,-50) 이렇게 쓰면 에러가 나므로
ifelse((enemynear,statetype)=C,-30,-50) 이렇게 써야 에러가 안납니다.
------------------------------------------------------------
InGuardDist(윈무겐 전용입니다 웬만하면 쓰지 맙시다)
------------------------------------------------------------
Returns 1 if the player is within guarding distance of an opponent's physical or
projectile attack. The guarding distance is the value of the guard.dist parameter of
the opponent's HitDef. Returns 0 if out of guard distance, or the opponent is not
attacking.
guard.dist안에 있을 경우 1값을 반환하며 그렇지않으면 0값을 반환합니다. guard.dist값은
Hitdef의 것을따른다고 하는데 Cns처음부분의 attack.dist에도 영향을 받는 듯
윈무겐의 common1.cns 의 가드하는 스텟들에 쓰였군요
------------------------------------------------------------
IsHelper
------------------------------------------------------------
헬퍼인지 아닌지 검사합니다. 괄호안에 아이디를 쓸수도 있습니다.
CNS에서 나오지만, 헬퍼의 아이디는 헬퍼를 생성할 때 정해줄수 있습니다.
예)
1. trigger1 = !IsHelper
헬퍼가 아닐 경우
2. trigger1 = IsHelper(1234)
ID 가 1234인 헬퍼일 경우
------------------------------------------------------------
IsHomeTeam
------------------------------------------------------------
홈팀일 경우 1, 안그러면 0값을 줍니다.
아케이드모드에서는 CPU가 홈팀이 됩니다만 버서스 모드에서는 1P쪽의 캐릭터들이 홈팀이
됩니다. AI를 만들 때 필요한 것 같지만 버서스모드에선 1P가 홈팀이 돼버리는 문제 때문에
대체 어디다 쓰라고 있는 트리거인지 모르겠군요.
예)
trigger1 = ishometeam
음...너무 간단해서 원문에도 사용예는 나와있지 않군요. 앞으로 이런건 설명안해도 되겠죠?
------------------------------------------------------------
Life
------------------------------------------------------------
플레이어의 현재 체력
예)
trigger1 = life <= 10
체력이 10 이하일 때
------------------------------------------------------------
LifeMax(윈무겐전용. 역시 안쓰길 권장)
------------------------------------------------------------
플레이어의 cns의 life =? 값입니다. 체력 최대치를 뜻합니다.
------------------------------------------------------------
Log
------------------------------------------------------------
로그값을 구하는 삼각함수입니다. 수학책을 보시는게 나을 듯.
예를들면 log(2,64) 는 64의 2에대한 로그값?을 구하는것인데, 2를 몇면 제곱해야 64가
나오느냐 하는것이므로 값은 6.0이 됩니다.
Takes two arguments a and b, and returns the base-a logarithm of b.
Format:
Log(exp1,exp2)
Arguments:
exp1
Expression giving the base of the logarithm. Must be positive.
exp2
Expression giving the value to take the logarithm of. Must be
positive.
Return type:
float
Error conditions:
Returns SFalse if either of exp1 or exp2 evaluates to SFalse, or if
either of exp1 or exp2 is not positive.
Example:
value=log(2,64)
Sets value to the base 2 log of 64, which is 6.0.
------------------------------------------------------------
Ln
------------------------------------------------------------
역시 프로그래밍 하는 사람들은 삼각함수까지 알아야 하나 봅니다. ln값을 구합니다.
ln이 아마 지수가 10인 로그던가? 역시 수학책을 봅시다.
Returns the natural logarithm of its argument. This produces slightly
more accurate results than the otherwise equivalent expression
log(e,(argument)).
Format:
ln(exprn)
Arguments:
exprn
Expression to compute the natural logarithm of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn is not
positive.
Example:
value = ln(time)
Sets value to the natural logarithm of the player's statetime.
------------------------------------------------------------
Lose
------------------------------------------------------------
졌을 경우 1 안그러면 0을 줍니다만 3가지가 있습니다.
형식
1. Lose - 아무 상황으로나 졌을때
2. LoseKO - 체력이 바닥나서 졌을때
3. LoseTime - 시간이 다돼서 졌을때
예)
1. trigger1 = Lose
졌을때
2. trigger1 = !LoseKO
타임오버로 졌거나 이겼을 때
------------------------------------------------------------
MatchNo
------------------------------------------------------------
몇번째 스테이지냐 하는것입니다.
버서스 모드에서는 무조건 값이 1이 됩니다.
예)
예) trigger1 = matchno > 3
3스테이지를 통과한 이후. 즉 4스테이지 이후부터. 제캐릭터 드레이븐에서 레벨업이후
체력증가에 쓰였습니다.
------------------------------------------------------------
MatchOver
------------------------------------------------------------
스테이지가 끝나면 값이 1이 되고 안그러면 0이 됩니다.
그러니까 3판2승제라면 2번째 이긴 라운드에서 승리포즈취하기 직전까진 0이고
승리포즈를 취함과 동시에 1이 됩니다.
윈무겐에선 도스무겐보다 좀 빨리 1이 되는데 승자가 결정되기 전에 1이 됩니다.
예)
trigger1 = matchover
스테이지 끝나고 승리포즈 취한후
------------------------------------------------------------
MoveContact
------------------------------------------------------------
공격이 상대에게 닳았을 경우(히트하거나 가드했을 때) 1, 안닳으면 0이 됩니다. 스텟이 넘
어갈 경우 0으로 초기화됩니다.
하지만 주의할점은 Movecontact와 이 밑의 movehit, moveguarded 는 만족할 경우
도스무겐에서는 값이 1로 유지되지만 윈무겐에서는 1,2,3,4 식으로 계속 증가합니다.
따라서 윈무겐에서도 캐릭을 쓰려면 movecontact = 1 대신, movecontact > 0 으로
써주어야 합니다. 밑의 movehit, moveguarded 도 같습니다.
예)
trigger1 = MoveContact > 0
공격이 닳았을 때
------------------------------------------------------------
MoveGuarded
------------------------------------------------------------
공격을 상대가 가드했을 경우 1, 안그러면 0이 됩니다.
예)
trigger1 = MoveGuarded > 0
공격이 막혔을 경우
------------------------------------------------------------
MoveHit
------------------------------------------------------------
공격이 히트했을(맞았을) 경우 1, 안그러면 0값을 반환합니다.
예)
trigger1 = MoveHit > 0
공격을 맞췄을 경우
------------------------------------------------------------
Movereversed(윈무겐 전용입니다. 웬만하면 쓰지 맙시다)
------------------------------------------------------------
공격이 리버설된 경우 1, 안그러면 0값을 반환합니다(원문엔 0이 아닌값을 준다고 돼있는데
1값을 줍니다). Hitdef의 Reversaldef명령에의해 리버설된 경우를 말합니다.
예)
trigger1 = MoveReversed
P1의 공격이 P2에 의해 리버설된 경우
------------------------------------------------------------
MoveType(*,***)
------------------------------------------------------------
플레이어의 movetype 입니다.
예)
trigger1 = movetype != H
movetype 이 H가 아닐 경우(맞는상태가 아닐경우)
------------------------------------------------------------
Name(*,***)
------------------------------------------------------------
DEF파일에 쓰여있는 캐릭터의 NAME을 검사합니다.
캐릭터간 인트로를 만들 때 authorname과 enemy, 같은 것들과 같이 쓰입니다.
enemy, 같은것들은 이 문서 맨 마지막 부분에 설명되어 있습니다.
예)
trigger1 = Name = "Kyo99"
캐릭터명이 kyo99 일 때.(하지만 이렇게 자체적으론 거의 안쓰이죠. 자기이름 검사해서
뭐합니까...)
------------------------------------------------------------
NumEnemy
------------------------------------------------------------
적의 숫자입니다. 중립플레이어와 노멀헬퍼는 포함되지 않음. 중립 플레이어란게 뭔지
모르겠네요. 헬퍼생성시 헬퍼타입을 player로하면 적숫자에 포함되는 듯 하지만 헬퍼타입
player를 쓰지 말라고 sctrl.txt파일에 나와있습니다.
trigger1 = NumEnemy = 2
trigger1 = enemynear(1), name = "Squash"
적의 수가 2명일 때. 2번째로 가까이 있는 적의 이름이 Squash 일 경우
------------------------------------------------------------
NumExplod
------------------------------------------------------------
cns에서 효과 스프라이트를 내는 명령인 explod가 있는데 그 명령에 의해 생긴
explod의 수를 검사합니다. 괄호를 쳐서 ID를 검사할수도 있습니다.
예)
1. trigger1 = NumExplod >= 4
자기가 발생시킨 모든 explod개수가 4개 이상일 경우
2. trigger1 = NumExplod(1234) >= 4
ID가 1234인 Explod의 개수가 4개 이상일 경우
------------------------------------------------------------
NumHelper
------------------------------------------------------------
발생시킨 헬퍼의 개수. 역시 괄호를 쳐서 아이디로 검사가능합니다.
헬퍼에서 발생시킨 헬퍼라도 개수에 포함됩니다. 즉 플레이어가 근원인 전체 헬퍼 개수.
예)
1. trigger1 = NumHelper < 2
헬퍼개수가 2개 미만일때
2. trigger1 = NumHelper(1234) < 2
ID가 1234인 헬퍼의 개수가 2개 미만일 때
------------------------------------------------------------
NumPartner
------------------------------------------------------------
파트너의 수. 역시 뉴트럴 플레이어와 노멀헬퍼는 고려되지 않는다네요.
예)
trigger1 = NumPartner = 1
trigger1 = partner, life < 200
파트너가 1명 있고 그 파트너의 체력이 200미만일 때
------------------------------------------------------------
NumProj
------------------------------------------------------------
cns명령인 projectile로 발생시킨 프로젝타일 개수. 주의점은 헬퍼에서 만든 프로젝타일일
지라도 본체캐릭터의 소유가 되므로 헬퍼에서 검사할땐 root, numproj 처럼 써야 합니다.
예)
trigger1 = NumProj = 0
프로젝타일이 없을 경우
------------------------------------------------------------
NumProjID
------------------------------------------------------------
위와 같지만 아이디로 검사합니다.
예)
trigger1 = NumProjID(1234) = 1
ID 번호가 1234인 프로젝타일이 1개일 때
------------------------------------------------------------
NumTarget
------------------------------------------------------------
타겟 개수. 공격을 맞췄고(막아도됨) 맞은 상대가 movetype = H일 경우 타겟에
포함됩니다. 상대의 movetype 이 H가 아닐 경우엔 타겟에서 벗어납니다.
괄호를 쳐서 아이디로 검사할수도 있습니다.
자기가 맞춘 대상만 포함되므로 헬퍼같은게 맞춘 대상은 본체나 다른 헬퍼의 타겟에
포함되지 않습니다.
예)
1. trigger1 = Numtarget >= 1
공격에 닳은 상태의 상대가 1명 이상일 때
2. trigger1 = Numtarget(200) >= 1
ID 200의 공격에 닳은 상태의 상대가 1명 이상일 때
------------------------------------------------------------
P1Name(*,***)
------------------------------------------------------------
This is an alias for the Name trigger. See "Name".
이름. Name 과 뭐가 틀린지 모르겠습니다.
------------------------------------------------------------
P2BodyDist
------------------------------------------------------------
상대와 거리인데 p2bodydist x는 플레이어의 앞쪽 몸체너비부터 상대의 앞쪽 몸체너비
까지의 거리입니다. 앞쪽 몸체너비란 front.width 값을 말하는데 cns처음부분의
ground.front(지상에 있을 때) 와 air.front(공중에 있을 때) 값에 따라 정해집니다.
p2bodydist y는 p2dist y랑 값이 같게 나오는데 어떨때 틀리게 나오는지 모르겠군요.
p2bodydist 값이 -일 경우 상대보다 위쪽에 있는걸 뜻합니다.
그런데 p2가 들어가는 트리거들의 경우 2명이상의 상대와 싸울 때 가장 가까이 있는
상대를 기준으로 하긴 하지만 그게 제대로 작동하지 않고 멀리있는 상대를 기준으로
돼버릴 때도 있습니다. 이 문제는 윈무겐의 docs폴더의 파일에도 나와있긴 한데 정확히
고쳐졌다고 나와있진 않습니다. 따라서 상황에 따라 enemynear, 같은 명령어를 쓰는게
더 나을 듯 합니다.
별로 중요하지 않지만, 값은 실수입니다.
Details:
For comparing the Y-distance, P2BodyDist gives the difference in the
heights of the players' Y-axes. A negative value means that P2 is
above P1.
For comparing the X-distance, P2BodyDist gives the
X-distance of P2's front from P1's front. So, if the
players are standing right next to each other, then
P2BodyDist is 0. Remember that you can set the width of
the player in "front.width", etc. under [Size] in the
player variables.
See also P2Dist.
예)
trigger1 = P2BodyDist X < 30
플레이어의 몸체앞쪽너비부터 상대몸체앞쪽너비까지 거리가 30픽셀 미만일 경우
------------------------------------------------------------
P2Dist
------------------------------------------------------------
플레이어의 x축과 상대 x축 까지의 거리입니다.
p2dist y는 p2bodydist y 랑 뭐가 틀린지 모르겠습니다. 설명도 같네요.
Details:
For comparing the Y-distance, P2Dist gives the difference in the
heights of the players' Y-axes. A negative value means that P2 is
above P1.
For comparing the X-distance, P2Dist gives the X-distance
of P2's axis from P1's axis. A positive value indicates P2
is in front of P1.
See also P2BodyDist.
Example:
trigger1 = P2Dist Y <= -12
상대보다 12픽셀 이상 높이 있을 때
------------------------------------------------------------
P2Life
------------------------------------------------------------
상대의 체력입니다. 적이 2명이상일 경우 가까이 있는 적의 체력을 검사합니다.
------------------------------------------------------------
P2MoveType
------------------------------------------------------------
상대의 movetype을 검사.
------------------------------------------------------------
P2Name(*,***)
------------------------------------------------------------
상대의 def파일에 있는 name을 검사. 역시 2인대전시는 가까이있는쪽의 name을 검사하
게 되고 상대가 1명이 ko됐으면 살아있는 상대의 name을 검사합니다.
상대가 모두 ko돼서 바닥에 쓰러진 경우 값은 0(false)이 됩니다.
------------------------------------------------------------
P2StateNo
------------------------------------------------------------
상대의 stateno(스텟넘버)를 검사
------------------------------------------------------------
P2StateType
------------------------------------------------------------
상대의 statetype을 검사
------------------------------------------------------------
P3Name(*,***)
------------------------------------------------------------
같은편의 name을 검사합니다. 같은편이 ko된 상태라도 작동합니다.
같은편이 없는 경우에만 무조건 0(false)값을 줍니다.
------------------------------------------------------------
P4Name(*,***)
------------------------------------------------------------
상대가 2명 이상일 때 더 멀리있는 상대의 name을 검사합니다. 상대가 ko당했어도
작동합니다.
상대가 1명이면 값은 무조건 0.
------------------------------------------------------------
PalNo
------------------------------------------------------------
캐릭터의 팔렛번호
캐릭을 고를 때 선택되는 def파일에 나와있는 대로의 팔렛번호 입니다.
DEF에도 설명돼있지만
A - 1 B - 2 C - 3 X - 4 Y - 5 Z - 6 이고 스타트버튼을 누를 경우 6이 더해
지며, 해당팔렛이 없을 경우엔 그다음 팔렛으로 선택됩니다.
예를들어 스타트버튼을 누른채 B버튼을 눌렀는데 8번팔렛부터 12번 팔렛까지 없다면 1번
팔렛이 골라지며 1번팔렛을 이미 골랐다면 2번팔렛으로 되는 식입니다.
예)
trigger1 = PalNo = 5
팔렛번호가 5일 때
이 트리거는 sanderx씨의 캐릭에 쓰였는데 어느 버튼으로 고르냐에 따라서 캐릭의 버전이
바뀌는걸 구현했습니다.(하지만 복잡하다는 단점이 더 크죠)
------------------------------------------------------------
ParentDist
------------------------------------------------------------
헬퍼에서만 쓰이는 트리거. 자신을 만든 부모와 자신과의 거리.
parentdist x 는 부모의 x축과 자신의 x축간의 거리이고 parentdist y로 하면 y축간의
거리입니다.
예)
trigger1 = ParentDist X != 0
부모와의 x위치가 다를때(조금이라도 떨어져있을 경우)
------------------------------------------------------------
Pi
------------------------------------------------------------
Pi값인 3.141593을 나타냅니다. 이것도 무슨 고급 물리나 수학에서 나오는듯.
This trigger returns the numeric value of pi (3.141593...)
Format:
pi
Arguments:
none
Return type:
float
Error conditions:
none
------------------------------------------------------------
Pos
------------------------------------------------------------
플레이어의 x,y축을 기준으로 현재 플레이어의 위치를 검사합니다.
pos x는 x위치, pos y는 y위치를 검사합니다.
화면의 정중앙이 pos x = 0 이며 왼쪽으로 갈수록 -, 오른쪽으로 갈수록 +가 됩니다.
스테이지의 바닥은 pos y = 0이며 위로 갈수록 -, 밑으로 갈수록 +가 됩니다.
중요하진 않지만 값은 실수
예)
trigger1 = Pos Y >= 0
플레이어의 y축 위치가 스테이지 바닥밑으로 내려갔을 때
(주로 넘어지는 스텟에 쓰입니다)
------------------------------------------------------------
Power
------------------------------------------------------------
기(파워)게이지의 양을 검사. 1000이 기 한칸입니다.
예)
trigger1 = power >= 1000
기게이지 레벨이 1이상일 때
------------------------------------------------------------
PowerMax(윈무겐전용)
------------------------------------------------------------
CNS처음부분의 power =? 값입니다. 기(파워)게이지의 최대치. 보통 3000(Lv3)입니다.
------------------------------------------------------------
PlayerIDExist
------------------------------------------------------------
해당 ID를 지닌 플레이어가 존재하느냐 인데 앞서 말했듯 ID값은 몇 명 대전을 하느냐에
따라 달라지므로 쓰기 어정쩡.
예)
trigger1 = PlayerIDExist(var(4))
var(4)와 같은 ID의 플레이어가 존재할 경우
------------------------------------------------------------
PrevStateNo
------------------------------------------------------------
바로이전 스텟번호를 검사
예)
trigger1 = prevstateno = 100
직전 스텟넘버가 100(달리기)이었을 경우
------------------------------------------------------------
ProjCancelTime
------------------------------------------------------------
처음 값은 -1 이며 프로젝타일이 상대프로젝타일에 의해 사라지는 경우 이 값이 0으로
설정된 후 1프레임당 1씩 계속 증가하게 됩니다.
프로젝타일이 사라질땐 Hitflag = P가 들어가는 hitdef에 의해 사라질수도 있는데 이경우엔
ProjCancelTime 에 영향을 주지 않습니다.(그러니까 상대 프로젝타일에 의해 사라진 경우
만 projcanceltime값이 증가합니다.)
괄호안에 검사할 프로젝타일의 아이디를 쓰는데 0을 쓸 경우 프로젝타일의 아이디를
체크하지 않습니다. 즉 projcanceltime(0)은 플레이어의 프로젝타일중에 아무거나가
상쇄되면 0,1,2... 이렇게 증가합니다.
예)
1. trigger1 = ProjCancelTime(1234) = 1
ID 1234의 프로젝타일이 상대 프로젝타일에 의해 사라진 직후
2. trigger1 = ProjcancelTime(0) != -1 && ProjcancelTime(0) < 15
아무 프로젝타일이 상쇄된 후 15프레임 이내
------------------------------------------------------------
ProjContact(*,***)
------------------------------------------------------------
프로젝타일이 상대에게 닳으면 True(1)값을 줍니다. 뒤에 괄호를 치지 않고 아이디번호
를 쓸수있는데, 아이디번호를 쓰지 않거나 0으로 하면 역시 아무 프로젝타일이 닳으면
true값을 줍니다. 프로젝타일이 닳은 후 True값이 된 후엔 값이 바로 0으로 돌아옵니다.
그런데 이상한 것은 trigger1 = projcontact = 1에서 값을 1이상의 아무 숫자로 줘도
마찬가지입니다. projcontact = 2 나 projcontact = 15 이렇게 줘도 projcontact = 1과
같게 작동하는군요. 분명히 설명에선 1이나 0이라고 했는데 말이죠.
그리고 밑의 두 번째 형식처럼 쓸수 있는걸 보니 각 프레임마다 값이 존재하는 듯 하며
이때문인지 Displaytoclipboard명령으로 볼수가 없어서 애매하군요(에러남)
형식
1. ProjContact[ID] = value
2. ProjContact[ID] = value, [oper] value2
이렇게 쓸수도 있는데 뜻은 아래 Details에 나와있습니다만 해석이 애매해서 원문을
놔뒀습니다.
Arguments:
[ID]
Optional ID number.
value (boolean)
Value to compare against. 0 for false, 1 for true.
[oper]
=, !=, <, >, <=, >=
value2
Time value to compare against.
Return type:
boolean int
Details:
ProjContact will trigger once for each hit of the projectile, so a
multi-hit projectile can trigger multiple times.
The first form of ProjContact shown above is only valid for one tick
after contact, unlike MoveContact.
For the second form, ProjContact returns true if the projectile made
contact n ticks ago, where n is a nonnegative number satisfying the
relation "n [oper] value2".
Specifying an ID number of 0 gives the same behavior as if the ID
number is omitted (check all projectiles).
(원문의 boolean은 불 논리 연산=피연산자가 가능(可) 불가능(不) 으로 결과가 나오는
이라고 사전에 나와있군요. 0-불가능 1-가능 이런식입니다)
예)
1. trigger1 = ProjContact1234 = 1
ID 1234의 프로젝타일이 상대에게 막 닳았을 때(닳은 직후)
2. trigger1 = ProjContact456 = 0, < 15
이전 15프레임 내에 ID 456의 프로젝타일이 닳지 않았다면(모르겠으면 cns에서
실험해보거나 밑의 projhit나 projguarded를 보시길)
------------------------------------------------------------
ProjContactTime
------------------------------------------------------------
형식과 값의 변화는 위 projcanceltime과 같지만 이것은 프로젝타일이 닳았을 경우 값이
0,1,2... 이런식으로 증가합니다.
예)
1. trigger1 = ProjContactTime(1234) = 1
아이디 1235의 프로젝타일이 닳은 직후
2. trigger1 = ProjContactTime(0) != -1 && ProjContactTime(0) < 15
아무 프로젝타일이 닳은 후 15프레임 이내
------------------------------------------------------------
ProjGuarded(*,***)
------------------------------------------------------------
projcontact와 같지만 이건 프로젝타일이 막혔을때(가드당했을때)를 감지합니다.
형식 설명도 projcontact와 같군요.
예)
1. trigger1 = ProjGuarded1234 = 1
아이디 1235의 프로젝타일이 가드당한 직후
2. trigger1 = ProjGuarded = 1, < 15
이전 15프레임 사이에 아무프로젝타일이 가드당했을 때
(바꿔말하면 프로젝타일이 가드당한 후 15프레임 이내)
------------------------------------------------------------
ProjGuardedTime
------------------------------------------------------------
역시 projcanceltime과 같지만 프로젝타일이 가드당했을 때 값이 0,1,2...식으로 증가.
예)
1. trigger1 = ProjGuardedTime(1234) = 1
아이디 1235의 프로젝타일이 가드당한 직후
2. trigger1 = ProjGuardedTime(0) != -1 && ProjGuardedTime(0) < 15
아무 프로젝타일이 가드당한후 15프레임 이내
------------------------------------------------------------
ProjHit(*,***)
------------------------------------------------------------
마찬가지로 projcontact 등과 같지만 프로젝타일이 맞았을때(히트했을때)를 감지합니다
예)
1. trigger1 = ProjHit1234 = 1
아이디 1234의 프로젝타일이 히트한 직후
2. trigger1 = ProjHit1234 = 1, < 15
이전 15프레임 이내에 아이디 1234의 프로젝타일이 히트했을 때
(역시 바꿔말하면 아이디 1234의 프로젝타일이 히트한 후 15프레임 이내)
------------------------------------------------------------
ProjHitTime
------------------------------------------------------------
이하동문. projcanceltime 등과 마찬가지지만 이것은 프로젝타일이 히트했을 때 값이
0,1,2... 식으로 증가합니다.
예)
1. trigger1 = ProjHitTime(1234) = 1
아이디 1234의 프로젝타일이 히트한 직후
2. trigger1 = ProjHitTime(0) != -1 && ProjHitTime(0) < 15
아무 프로젝타일이 히트한 후 15프레임 이내
------------------------------------------------------------
Random
------------------------------------------------------------
랜덤수를 발생시킵니다. 수는 0부터 999사이에 정해집니다.
이 Random이란 글자가 나올때마다 무겐은 랜덤수를 만듭니다.
예)
trigger1 = Random <= 249
랜덤값이 249이하일 때(즉 25%확률로 라는 뜻이 됩니다.)
------------------------------------------------------------
RootDist
------------------------------------------------------------
헬퍼에만 사용되는 트리거. 자신을 만든 근원의 x,y축 부터 자신의 x,y축까지의 거리를
구합니다.
Rootdist x는 가로거리, Rootdist y는 세로거리입니다.
예)
trigger1 = RootDist X != 0
루트의 x위치와 다를 때
------------------------------------------------------------
RoundNo
------------------------------------------------------------
라운드 번호입니다.
예)
trigger1 = RoundNo = 3
3라운드일때
------------------------------------------------------------
RoundsExisted
------------------------------------------------------------
자신이 싸운 라운드가 몇번 있었냐 하는겁니다. 첫 라운드의 값은 0이 되며 스테이지
넘어가도 0이 됩니다.
이것은 Turns모드에서의 인트로를 만들 때 유용합니다.
예)
trigger1 = RoundsExisted = 0
trigger1 = TeamMode = Turns
trigger1 = RoundNo > 0
자신이 싸우는 첫 라운드이고 게임모드가 Turns일 때. 3번째 조건은 1라운드 이후일
때 라는건데 당연한 것이니까 무의미한 조건인 것 같군요.
당신은 이 예를 사용하여 초기화 스텟인 5900(라운드 처음 시작시 맨처음 시작스텟)에
changestate명령과 같이써서 팀모드 인트로를 만들 수 있다. 고 하는군요.
------------------------------------------------------------
RoundState
------------------------------------------------------------
라운드의 상태를 나타내는데 라운드 시작시 0부터 시작해서 라운드 끝나면 4가 됩니다.
각 값이 나타내는 것은 다음과 같습니다.
Details:
0: 화면이 페이드인 될 때(맨처음 라운드 시작시 화면 밝아지는 순간)
1: 캐릭터가 인트로(등장 포즈나 이벤트대사 등)를 할때
2: 캐릭터가 싸울때(라운드 x 파이트! 란 글자가 뜬 후)
3: 라운드가 끝났을 때.(캐릭터의 체력이 바닥나거나 타임오버 됐을때
4: 캐릭터가 승리포즈를 취할 때
예)
trigger1 = RoundState = 2
싸우는 중일 때
------------------------------------------------------------
ScreenPos
------------------------------------------------------------
화면의 왼쪽 위 구석부터 얼마만큼의 위치에 있느냐 하는것입니다.
왼쪽 구석이 screenpos x = 0이 되고 오른쪽으로 갈수록 값이 +가 되고 왼쪽으로 갈수록
-가 됩니다.
화면의 맨위 꼭대기가 screenpos y = 0이 되고 밑으로 갈수록 값이 +되고 위로갈수록
-됩니다.
예)
trigger1 = ScreenPos Y = [0,239]
캐릭터 y위치가 화면 꼭대기부터 밑으로 239 픽셀 내에 있을 때
------------------------------------------------------------
SelfAnimExist
------------------------------------------------------------
Animexist와 같은데 animexist는 맞아서 상대방의 스텟에 가있는 경우 그 상대의 AIR파일
을 검사하기 때문에 대부분 이 selfanimexist를 씁니다.
예) trigger1 = selfanimexist(200)
애니매이션번호 200이 존재할때
------------------------------------------------------------
Sin
------------------------------------------------------------
삼각함수의 sin값을 구합니다.
Computes the sine of the specified argument (in radians.)
Format:
sin(exprn)
Arguments:
exprn
Expression to compute the sine of. (float)
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = sin(pi/2)
Sets value to the sine of pi/2, which is approximately 1.0
(possibly with some rounding error.)
------------------------------------------------------------
StateNo
------------------------------------------------------------
스텟넘버를 검사
예)
trigger1 = stateno = [200,650]
스텟번호가 200~650 사이일 때
------------------------------------------------------------
StateType
------------------------------------------------------------
스텟타입을 검사. S,C,A,L중에 하나죠.
예)
trigger1 = StateType != A
스텟타입이 A가 아닐때
------------------------------------------------------------
SysFVar
------------------------------------------------------------
무겐의 변수중에 var와 fvar말고도 sysvar(정수)와 sysfvar(실수)가 있습니다.
현재 윈무겐까지는 sysvar(0), sysvar(1), sysvar(2) 만이 common1.cns 에 사용되었습니다.
원문엔 쓰지 말라고 하는 듯. 원문입니다.
This trigger takes a mandatory variable number as an argument. It
returns the value of the player's specified system float variable.
This trigger should NOT be used under normal circumstances. System
variables are reserved for bookkeeping in common1.cns.
(cns)근데 상대캐릭터를 특정 스텟으로 강제로 이동시킨후에 var를 써야만하는 경우가 있
는데 그냥 var를 쓰면 맞은 캐릭터의 var를 바꿔버리므로 안되니까 그럴 땐 이 sysvar(4)
같은걸 쓰도록 합시다.
sysvar나 sysfvar나 0-4 까지 쓸수 있습니다.
예)
trigger1 = SysFVar(0) = -1.23
sysfvar(0)이 -1.23일 경우
------------------------------------------------------------
SysVar
------------------------------------------------------------
sysfvar는 실수변수지만 sysvar는 정수변수입니다. 역시 0-4 까지 쓸수있긴 한데 sysvar(0)
과 sysvar(1)과 sysvar(2)는 공통스텟(common1.cns)에 쓰였으므로 쓰면 안됩니다.
예)
trigger1 = SysVar(0) = -34
sysvar(0)이 -34일 경우
------------------------------------------------------------
Tan
------------------------------------------------------------
삼각함수 탄젠트값을 구합니다.
Computes the tangent of the specified argument (in radians.)
Format:
tan(exprn)
Arguments:
exprn
Expression to compute the tangent of. (float)
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = tan(pi/4)
Sets value to the tangent of pi/4, which is approximately 1.0
(possibly with some rounding error.)
------------------------------------------------------------
TeamMode(*,***)
------------------------------------------------------------
플레이의 모드값을 구합니다.
single - 싱글플레이
simul - 시뮬플레이
turns - 턴플레이
예)
trigger1 = TeamMode = Single
싱글플레이일때
------------------------------------------------------------
TeamSide
------------------------------------------------------------
라운드 시작시 1P쪽은 1이 되고 2P쪽은 2가 됩니다.
이 트리거는 기게이지를 표시한다든지 할 때 유용합니다.
예)
trigger1 = TeamSide = 2
2P쪽일 때
------------------------------------------------------------
TicksPerSecond
------------------------------------------------------------
실제시간 1초에 몇프레임인지 구합니다. 원래 60인데 게임속도를 slow 9로 하면 15가
되는군요.
예)
trigger1 = Time > 10 * TicksPerSecond
게임스피드에 상관없이 실제시간 10초 이후일 때
------------------------------------------------------------
Time
------------------------------------------------------------
스텟의 시간입니다.
스텟이 시작하면 0부터 시작해서 1프레임당 1씩 계속 증가합니다.
예)
trigger1 = Time = 2
타임이 2일 때. 란 뜻이긴 하지만 자세히 말하자면 time=2일때가 아니라 time=1에서
time=2로 넘어가는 순간을 뜻합니다.(animelem = ? 과 같음)
주의할점은 헬퍼에서 본체의 time을 검사할 경우엔 값을 1더해야 한다는 것입니다.
예. 헬퍼에서) trigger1 = parent, time = 3
부모의 time이 2일 때.
항상실행스텟인 [statedef -?]에서 검사할때도 값에 1을 더해야 합니다.
이렇게 해야하는 이유는 cns의 실행 순서가 일반스텟->헬퍼->항상실행스텟(statedef -?)
이기 때문인 것 같습니다.
* 마찬가지로 캐릭터가 스텟에 오자마자(time=0에) 적의 공격을 막는(가드스텟으로 가는)
경우가 있는데 이경우엔 만약 스텟시작하자마자 poweradd=-1000같은(필살기같은데
쓰이는)게 있을 경우 기만 날리고 기술은 안나가는 경우가 생길수 있습니다. 따라서 이런
상황을 막기 위해서 이런건 trigger1 = time = 1 이렇게 씁시다.
------------------------------------------------------------
TimeMod(*,**,***)
------------------------------------------------------------
스텟의 time을 나눈 나머지를 구합니다. %대신 쓰는게 추천된다고 하는군요.
형식
TimeMod [oper] divisor, value1
Arguments:
[oper]
=, !=, <, >, <=, >=
divisor (int)
나눌 수(0이 아니어야 함)
value1 (int)
나뉠 수
예)
trigger1 = TimeMod = 4, 3
스텟의 time을 4로 나눈 나머지가 3일 경우 그러니까 스텟타임이 각각 3, 7, 11, 15,
...일 경우를 뜻합니다. trigger1 = time%4 = 3과 같습니다.
근데 위에나온 부호인 <, >= 같은건 어떨 때 쓰는지 모르겠군요. 설명에 나온
위치대로 timemode < 4,3식으로 쓰면 에러나네요. timemod = 4, < 3이렇게 쓸수는
있습니다. 각자 실험해봅시다.;
------------------------------------------------------------
UniqHitCount
------------------------------------------------------------
한 스텟에서 공격이 히트한 횟수입니다. hitcount와 다른점은 공격이 2명이상의 상대에
게 맞았을 때 hitcount는 1만 증가하지만 이 uniqhitcount는 맞춘 수대로 증가합니다. 2명한
테 맞췄다면 2증가 이런식입니다.
예)
trigger1 = UniqHitCount = [4,6]
공격이 들어간 횟수가 총 4~6번 사이일 때
------------------------------------------------------------
Var
------------------------------------------------------------
무겐에서 쓸 수 있는 정수변수. var(0) ~ var(59) 까지 쓸수 있습니다.
예)
trigger1 = Var(0) = -34
var(0)이 -34일 경우
------------------------------------------------------------
Vel
------------------------------------------------------------
속도입니다. vel x는 x속도, vel y 는 y속도입니다.
예)
trigger1 = Vel Y >= 0
y속도가 0이상일 때(밑으로 떨어질 때)
------------------------------------------------------------
Win
------------------------------------------------------------
이겼는가를 뜻합니다. 다음의 4가지가 있습니다.
1. Win - 결과적으로 이겼는가
2. WinKO - ko로 이겼는가
3. WinTime - 타임오버로 이겼는가
4. WinPerfect - 퍼펙트로 이겼는가
예)
1. trigger1 = Win
이겼을 때
2. trigger1 = !WinKO
KO로 이기지 않은 경우
------------------------------------------------------------
1
------------------------------------------------------------
항상실행. 즉 trigger1 = 1 이렇게 쓰면 그 스텟 내에서 해당 명령을 계속 실행해라 하는
것이 됩니다.
주의할점은 trigger1 = 1을 쓰면 다른스텟으로 넘어가는 순간까지 해당명령이 실행되기
때문에 cns의 changestate명령이나 selfstate명령에 의해 스텟이 바뀐후에도
1프레임동안(다음스텟의 time = 0일때까지) 해당명령이 실행되게 됩니다.
따라서 정확히 그 스텟 내에서만 명령이 실행되게 하고 싶으면 trigger1 = animtime < 0
이런식으로 상황에 맞게 써줘야 합니다.
==== (여기까지 일단 트리거들 설명 끝이고 추가적으로) =========================
====================================================================
Trigger redirection
====================================================================
원래 exp.txt에 있는거지만 여기 있는게 나을 것 같아서 여기 써놨습니다.
트리거를 쓸 때 자기자신의 조건 말고도 헬퍼나 상대의 상태를 검사할수도 있습니다.
예를들어 trigger1 = time = ? 이러는 것 외에 trigger1 = parent, time = ? 이라고 하면
parent의 time값을 검사합니다. parent니 뭐니 하는건 밑에 설명.
쓸 수 있는 종류는 다음과 같습니다.
*) parent
자기자신을 만든 부모를 뜻합니다. 헬퍼에 쓰이는데 예를들어 캐릭터 A가 있고 A가 생성
시킨 헬퍼 B가 있고 헬퍼B에서 만든 헬퍼C가 있다고 쳤을때
B의 parent는 A가 되고 C의 parent는 B가 됩니다.
B의 스텟에서 trigger1 = parent, time = ? 이라고 하면 A의 스텟타임을 검사하는것입니다.
*) root
자신을 만든 근원(?). 위와 같은 상황에서 B와 C의 root는 A가 됩니다.
*) helper
자신이 만든 헬퍼를 뜻하는데 그냥 helper, 라고 쓰면 맨처음 만든 헬퍼를 뜻한다고
하네요. 그런데 그냥 helper, 로는 거의 쓰지 않고 밑과 같이 helper(ID)로 씁니다.
*) helper(ID)
헬퍼를 만들 때 아이디를 줄수있는데 그 아이디를 가진 헬퍼를 뜻합니다. helper(1234), 라
고 하면 ID 1234의 헬퍼를 뜻합니다.
*) target
공격을 맞춘(막아도 포함) 첫 번째 상대. 이것도 그냥 target으로는 거의 쓰지않고 밑처럼
ID를 줘서 씁니다. 상대의 movetype 이 H일경우에만 되며 상대 movetype이 H가 아닐
경우 타겟에서 벗어납니다.
원문: Redirects the trigger to the first target found.
첫 번째 상대라곤 하지만 2명이상이 같이 맞았을땐 아무 타겟이나 찍는군요.
*) target(ID)
공격판정을 낼 때 ID를 정해줄수 있는데 이걸 이용해 해당 공격에 맞은 타겟을 검사합니
다. target(200), 라고 쓰면 ID 200 인 공격에 맞은 타겟을 뜻합니다.
*) partner
2대2 대전 등을 할 때 같은편 파트너를 뜻합니다. 노멀 헬퍼와 뉴트럴 플레이어는 파트너
에 속하지 않는다고 하는데 하여튼 헬퍼를 제외한 같은편은 파트너로 간주됩니다.
*) enemy
첫 번째 적. 역시 노멀헬퍼와 뉴트럴플레이어는 간주되지 않는다는군요.
*) enemy(n)
괄호안의 숫자는 몇번째 적이냐 하는걸 뜻한다는데 써보지 않아서 정확한 건 모르겠군요.
첫 번째가 2p이고 두 번째가 4p쯤 되지 않을까 싶군요.
*) enemyNear
가장 가까이 있는 적
*) enemyNear(n)
n번째 가까이 있는 적. 0이 가장 가까이 있는적이고 1이 두 번째 가까이 있는 적인듯.
*) playerID(ID)
해당 아이디를 지닌 플레이어. ID를 보려면 displayclipboard 나 appendtoclipboard를 써
서 id를 봐야하는데 이 아이디가 1:1 할 때와 1:2 랑 2:2 할 때 각각 다르므로 대체 어디다
쓰는건지 모르겠습니다.
이들중 2가지이상 중복하여 쓰면 에러납니다. 예) root,target,time = ? 처럼 쓰면 에러.
===================================================================
트리거가 잘못될 경우 캐릭선택시 튕기거나 작은 잘못일 경우 디버그모드에서 흰색글씨로
나온다거나 하므로 메시지를 확인하고 해당부분이 왜 에러가 나는지 생각해서 제대로
고칩시다.
작은 잘못은 예를들어 trigger1 = target(10), stateno = 1031 이라고 썼는데 아이디 10인
타겟이 없을 경우 디버그모드에서 타겟이 없다고 흰색 글씨로 계속 뜨게 됩니다. 이럴
경우는
trigger1 = numtarget(10) > 0
trigger1 = target(10), stateno = 1031
이런식으로 고쳐줘야 합니다. numtarget(10) > 0이 항상 위에 있어야 하고 꼭 두줄로 써야
하며 한줄로 쓰면 마찬가지로 흰색글씨 뜹니다. 예를들어
trigger1 = numtarget(10) > 0 && target(10), stateno = 1031
이렇게 한줄로 묶어서 쓰지말고 꼭 위처럼 2줄로 써야 흰색글씨가 뜨지 않습니다.
이런 건 안고쳐도 게임엔 문제없지만 디버그모드사용시 흰색글씨가 계속뜨는게 보기 안좋으
므로 고치는 거랍니다.
선생님 : Ihoo1836트리거
(역시 용어가 애니매이션의 스프라이트를 뜻하는 '프레임'과 게임상의 1/60초를 뜻하는
'프레임'이 헷갈릴수 있어서 전자의 경우 그냥 '스프라이트'라고 했고 '프레임'이라고 한
경우는 1/60초를 뜻하는 경우만 사용했습니다.)
캐릭터의 동작을 만들기 위해선 명령어가 필요합니다. 예를들어 캐릭터를 앞으로 얼만큼 이
동시킨다든지 언제 공격판정을 만든다든지 하는 것 등인데 이 명령을 수행할 때 조건이 트
리거입니다. 원본파일은 docs폴더의 trigger.txt인데 모르는건 원문그대로.
윈무겐에서 달라진점은 윈무겐 docs폴더의 update.txt 파일을 보면 원문이 있습니다.
앞서도 설명했듯이 명령어의 구조가
[State 번호, ?] ;state 뒤의 번호는 암거나 써도 상관없으나 에러메세지가 뜰 때 알아보
;기 쉽게하기 위해 statedef 의 번호(스텟넘버)랑 맞춰주는게 일반적.
type = ? ;명령어
trigger? ;조건
~~~ ;추가 파라미터
이렇게 되는데 트리거에 쓰인 조건을 만족하면 그 명령이 실행된다는 것입니다.
예를 들어
[state 200]
type = posadd
trigger1 = time = 0
x = 10
이렇게 하면 스텟 시작하자마자 x축으로 10만큼 캐릭터를 앞으로 이동시켜라 하는 게
됩니다.
추가적으로 설명하자면 트리거의 값이 1이 될 경우 해당명령을 실행합니다.
조건인 time = 0을 만족할 경우 컴퓨터는 값 '1(true:맞음)'을 돌려주므로 결과적으로 저
문장은 'trigger1 = 1' 이 되서 해당명령이 실행되는 것입니다. 조건을 만족하지 않으면
컴퓨터는 값 '0(false:틀림)'을 돌려줍니다. 'trigger1 = 0'이 되면 해당명령은 실행되지
않습니다.
또한 triggerall 이라는게 있는데 무조건 만족해야 하는 트리거를 뜻합니다.
예를들어
triggerall = statetype = A
trigger1 = command = "a"
trigger2 = command = "b"
라고 하면 캐릭터가 무조건 스텟타입이 A이어야 하며, a나 b버튼을 눌렀을 때 라는 뜻이
됩니다.
트리거 뒤의 숫자는 차례대로 가야 합니다. 예를들어 trigger2 뒤에 trigger4가 써있으면
제대로 검사가 되지 않습니다.
그리고 디버그모드는 MUGEN.CFG에서 ALLOWDEBUGMODE = 1로 설정돼있으면 도스무
겐에선 ctrl + d 키로 되지만 윈무겐은 무겐실행시 winmugen.exe가 아닌 debug.exe로
실행을 해야 됩니다. 디버그 모드에서는 캐릭터의 애니매이션번호와 스텟번호. gametime과
스텟time, animtime, statetype, ctrl 등의 정보를 볼 수 있습니다.
ctrl+c를 누르면 캐릭터의 판정박스와 무적정보 등이 나옵니다.
만약 모르겠는 트리거가 있다면 CNS의 Displaytoclipboard명령과 appendtoclipboard명령을
사용하면 알수 있을것입니다.
그리고 반환되는 값을 말할 때 1이면 True값이고 0이면 False값이니까 설명되어있지 않아
도 이해하시길 바랍니다.
====================================================================
;여긴 원문그대로
This is an alphabetical index of function-type triggers. For details
on use of function-type triggers in expressions, see the expression
documentation. Unless otherwise specified, we will use P1 to represent
the player who is evaluating the trigger, and P2 to represent his
opponent (usually the closest opponent when in team mode).
Some triggers are nonstandard and cannot take expressions as their
arguments. These are marked with a (*) in the index. Some triggers are
deprecated; these are marked with a (**). Use of these triggers is not
encouraged, as support for them may be removed in future versions of
the engine.
Old-style triggers, marked (***), appear only in clauses of the form
(trigger) (relational operator) (value). See section 8 of exp.doc for
more details.
For all triggers, SFalse will be returned if the trigger is redirected
to a nonexistent destination, or if the ID number for the redirection
evaluates to SFalse. This is not listed in the error conditions for
each trigger.
트리거 목록입니다. 대문자로 쓰나 소문자로 쓰나 같습니다.
--------------------------
-Abs
-Acos
-Alive
-Anim
-AnimElem(*,***)
-AnimElemNo
-AnimElemTime
-AnimExist
-AnimTime
-Asin
-Atan
-AuthorName(*,***)
-BackEdgeBodyDist
-BackEdgeDist
-CanRecover
-Ceil
-Command(*,***)
-Const(*)
-Cos
-Ctrl
-DrawGame
-E
-Exp
-Facing
-Floor
-FrontEdgeBodyDist
-FrontEdgeDist
-FVar
-GameTime
-GetHitVar(*)
-HitCount
-HitDefAttr(*,***)
-HitFall
-HitOver
-HitPauseTime
-HitShakeOver
-HitVel
-ID
-IfElse
-InGuardDist(윈무겐전용)
-IsHelper
-IsHomeTeam
-Life
-LifeMax(윈무겐전용)
-Ln
-Log
-Lose
-MatchNo
-MatchOver
-MoveContact
-MoveGuarded
-MoveHit
-MoveReversed(윈무겐전용)
-MoveType(*,***)
-Name(*,***)
-NumEnemy
-NumExplod
-NumHelper
-NumPartner
-NumProj
-NumProjID
-NumTarget
-P1Name(*,***)
-P2BodyDist
-P2Dist
-P2Life
-P2MoveType(*,***)
-P2Name(*,***)
-P2StateNo
-P2StateType(*,***)
-P3Name(*,***)
-P4Name(*,***)
-PalNo
-ParentDist
-Pi
-PlayerIDExist
-PrevStateNo
-Pos
-Power
-PowerMax(윈무겐전용)
-ProjCancelTime
-ProjContact(*,***)
-ProjContactTime
-ProjGuarded(*,***)
-ProjGuardedTime
-ProjHit(*,***)
-ProjHitTime
-Random
-RootDist
-RoundNo
-RoundsExisted
-RoundState
-ScreenPos
-SelfAnimExist
-Sin
-StateNo
-StateType(*,***)
-SysFVar
-SysVar
-Tan
-TeamMode(*,***)
-TeamSide
-TicksPerSecond
-Time
-TimeMod(*,**,***)
-UniqHitCount
-Var
-Vel
-Win
위의 트리거중에 수학 트리거 목록
----------------------
-abs
-acos
-asin
-atan
-ceil
-cos
-e
-exp
-floor
-IfElse
-ln
-log
-pi
-sin
-tan
------------------------------------------------------------
Abs
------------------------------------------------------------
절대값을 구하는 트리거입니다.
형식
abs(절대값을 구할 값)
괄호안의 수가 정수라면 정수를, 실수라면 실수를 돌려줍니다.
-2의 절대값은 2이고 뭐 이런거 수학에서 나오는데 그거 같습니다만 써본적이 없습니다.
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
------------------------------------------------------------
Acos
------------------------------------------------------------
Computes the arccosine (in radians) of the specified argument.
무슨 삼각함수 라디안에 관련된 코사인 같은데 써본적도 없고 모르겠군요.
Format:
acos(exprn)
Arguments:
exprn
Expression to compute the arccosine of (float).
Return type:
float(실수. 영어원문에서 int는 정수, float은 실수를 뜻합니다)
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn is not in
the domain of arccosine (which is [-1.0,1.0]).
Example:
value = acos(1)
Sets value to the arccosine of 1, which is approximately 0.0
(possibly with some rounding error.)
------------------------------------------------------------
Alive
------------------------------------------------------------
플레이어가 살아있다면 1(true)값을 돌려주고 ko된 상황(체력이 0일때)이면 0을 돌려줍니다.
예)
trigger1 = alive = 0
플레이어가 ko됐을 때
------------------------------------------------------------
Anim
------------------------------------------------------------
플레이어의 애니매이션 번호를 검사합니다.
예)
trigger1 = Anim = 200
액션번호가 200 일때
------------------------------------------------------------
AnimElem(*,***)
------------------------------------------------------------
애니매이션의 몇번째 스프라이트인가를 검사합니다.
예를들어 air파일에서 다음과 같은 액션200이 있다고 칩시다.
[begin action 200]
0,0,0,0,4 - 첫 번째 스프라이트
0,1,0,0,5 - 두 번째 스프라이트
0,2,0,0,6 - 세 번째 스프라이트
이 됩니다.
형식
1. AnimElem = value1
2. AnimElem = value1, [oper] value2
[oper]에 들어가는 부호
=, !=, <, >, <=, >=
value1 (정수)
몇번째 스프라이트인가
value2 (정수)
그 스프라이트에서 몇프레임 째인가
예)
trigger1 = AnimElem = 2
애니매이션의 2번째 스프라이트 시작 직후를 뜻합니다. 그러니까 위의 액션200에서
스프라이트 0,1이 나올 때를 뜻합니다. 다음과 같이 써도 같은 뜻이 됩니다.
trigger1 = AnimElem = 2, = 0 (2번째 스프라이트의 1번째 프레임)
(정확히 말하자면 1번째 스프라이트가 끝나고 2번째 스프라이트로 넘어가는 순간!을 뜻
합니다.)
trigger1 = AnimElem = 2, = 4
2번째 스프라이트 시작 후 4프레임 지났을 때를 뜻합니다. 그러니까 위의 액션200에서
는 스프라이트 0,1이 끝나기 직전이 되겠네요.
(역시 정확히 말하자면 4프레임 지나고 5프레임으로 넘어가는 순간!을 뜻합니다.)
trigger1 = AnimElem = 2, >= 0
trigger1 = AnimElem = 3, < 0
2번째 스프라이트 시작 직후부터 3번째 스프라이트가 나오기 전까지입니다.
만약 3번째 스프라이트가 없다면 2번째 줄은 다음과 같은뜻이 됩니다.
trigger1 = AnimTime <= 0
* 캐릭터가 스텟에 오자마자(animelem=1에) 적의 공격을 막는(가드스텟으로 가는) 경우가
있는데 이경우엔 만약 스텟시작하자마자 poweradd=-1000같은(필살기같은데 쓰이는)게
있을 경우 기만 날리고 기술은 안나가는 경우가 생길수 있습니다. 따라서 이런 상황을 막기
위해서 이런건 trigger1 = animelem = 1,1 이나 trigger1 = time = 1 이런식으로 씁시다.
------------------------------------------------------------
AnimElemNo
------------------------------------------------------------
애니매이션의 스프라이트의 프레임의 범위를 검사?. 설명이 어렵네요. 예를 봅시다.
Returns the number of the animation element in the current action
that would be displayed at the specified time. The argument to AnimElemNo
represents the time to check, expressed in game ticks, relative to the present.
(영어원문에서 tick 이라고 함은 게임진행시간(프레임)을 말하는 것으로 1tick은 1/60초
= 1프레임 입니다)
Format:
AnimElemTime(exprn)
Arguments:
exprn
Expression that evaluates to the time offset (int).
Return type:
int
Error conditions:
Returns SFalse if you try to check a time that would fall before the
start of the current action.
Notes:
If the action is currently within its looping portion, then it is
assumed to have been looping forever. That is, no matter how far into
the past you check, AnimElemNo will always return an element number
that lies within the looping portion of the action.
Examples:
trigger1 = AnimElemNo(0) = 2
True when the animation element to be displayed 0 ticks in the
future (i.e., now) is element 2. This is equivalent to:
이건 다음과 같습니다.
trigger1 = AnimElem = 2, >= 0
trigger1 = AnimElem = 3, < 0
trigger1 = AnimElemNo(2) = 4
True when the animation element that will be displayed two ticks
from now is element 4. This is equivalent to:
이건 다음과 같습니다.
trigger1 = AnimElem = 4, >= -2
trigger1 = AnimElem = 5, < -2
이 animelemno(?)는 잘 쓰이진 않지만 애니매이션을 정시시킬 때 쓸수도 있습니다.
예를들어
[state 500]
type = changeanim
trigger1 = 1
value = anim
elem = animelemno(-1)
이렇게 쓰면 현재 스프라이트가 유지되는데 제캐릭터 쿠로키시의 얼음빔에 맞은 스텟이나
진념 연옥영파 모으는중 히트시 구체를 정지시킬 때, 드레이븐 아이스스톰 맞았을 때 등에
쓰였습니다. 11-cns명령어 파일의 changeanim부분 참조.
------------------------------------------------------------
AnimElemTime
------------------------------------------------------------
안써봤습니다.
Gets the animation-time elapsed since the start of a specified element
of the current animation action. Useful for synchronizing events to
elements of an animation action.
(reminder: first element of an action is element 1, not 0)
Format:
AnimElemTime(exprn)
Arguments:
exprn
Expression that evaluates to the element number to check (int).
Return type:
int
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn evaluates
to an element number that is not valid for the current action.
Examples:
trigger1 = AnimElemTime(2) = 0
True on the first game-tick that the player's animation
is on element 2. Is equivalent to saying:
이건 다음과 같습니다.
trigger1 = AnimElem = 2
trigger1 = AnimElemTime(2) = 4
True 4 game-ticks after the start of the player's
second animation element.
정확히는 모르겠지만 이건 animelem = 2, =4 와 같은것같군요.
trigger1 = AnimElemTime(2) >= 0
trigger1 = AnimElemTime(3) < 0
이건
animelem = 2, >= 0
animelem = 3, <0 과 같은 것 같습니다.
True for the whole of the second element of the player's
animation, assuming there is a third element. If a
third element does not exist, the second line will evaluate
to SFalse and hence trigger1 will never trigger. In this case,
the second line should read,
trigger1 = AnimTime <= 0
------------------------------------------------------------
AnimExist
------------------------------------------------------------
애니매이션 번호가 존재하는지를 검사하는것인데 상대방에 맞아서 상대 스텟으로 간
경우 오작동할수도 있으므로 거의 쓰이지 않고 대신 selfanimexist가 쓰입니다.
예)
trigger1 = !AnimExist(200)
애니매이션 200번이 존재하지 않을때
------------------------------------------------------------
AnimTime
------------------------------------------------------------
애니매이션이 끝날때의 animtime 은 0이 되고 그이전엔 -값에서 계속 0을 향해 1씩
더해집니다.
예를들어 전체 지속시간이 7프레임인 애니매이션이 있다고 하면 그 애니매이션 시작직후
animtime 값은 -7 이며 7프레임째의 값은 -1 그리고 끝날때는 0이 됩니다.
AIR파일에서 loopstart가 쓰여있다고 해도 마지막 스프라이트의 지속시간이 끝나면
animtime값은 0이 됩니다.
예)
trigger1 = AnimTime = 0
애니매이션이 끝났을 때.
이건 대부분의 스텟 마지막 부분에 changestate명령과 함께 쓰입니다.
------------------------------------------------------------
Asin
------------------------------------------------------------
이것도 삼각함수 같은데 모르겠군요.
Computes the arcsine (in radians) of the specified argument.
Format:
asin(exprn)
Arguments:
exprn
Expression to compute the arcsine of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn is not in
the domain of arcsine (which is [-1.0,1.0]).
Example:
value = asin(1)
Sets value to the arcsine of 1, which is approximately pi/2
(possibly with some rounding error.)
------------------------------------------------------------
Atan
------------------------------------------------------------
역시 삼각함수
Computes the arctangent (in radians) of the specified argument.
Format:
atan(exprn)
Arguments:
exprn
Expression to compute the arctangent of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = atan(1)
Sets value to the arccosine of 1, which is approximately pi/4
(possibly with some rounding error.)
------------------------------------------------------------
AuthorName(*,***)
------------------------------------------------------------
제작자의 이름을 검사합니다.
해당 캐릭터의 def파일내에 있는 authorname을 검사하는 것입니다.
예)
trigger1 = Authorname = "sanderx"
def파일에 쓰여있는 authorname이 sanderx 일 경우
------------------------------------------------------------
BackEdgeBodyDist
------------------------------------------------------------
캐릭터의 back.width부터 캐릭터뒤쪽의 화면구석까지의 거리를 구합니다.
그런데 backedgedist와 값의 차이를 모르겠군요.
결과값은 실수입니다만 중요하지 않습니다.
예)
trigger1 = BackEdgeBodyDist < 30
캐릭터의 뒤 너비부터 캐릭터 뒤쪽 스크린 가장자리 까지의 거리가 30픽셀(도트)
미만일 경우
------------------------------------------------------------
BackEdgeDist
------------------------------------------------------------
캐릭터의 x축 중심부터 뒤쪽 화면 가장자리까지의 거리를 구합니다.
역시 backedgebodydist 와 값이 똑같이 나오는군요
결과값은 실수입니다만 역시 중요치 않습니다.
예)
trigger1 = BackEdgeDist < 30
캐릭터의 x축 중심부터 뒤쪽 화면 가장자리까지의 거리가 30픽셀 미만일 경우
------------------------------------------------------------
CanRecover
------------------------------------------------------------
캐릭터가 맞아서 날아가는 중일 때 낙법을 할수 있으면 1을 반환하고 그렇지 않으면
0을 반환합니다. 낙법이 가능한지 불가능한지는 cns의 hitdef의 명령어에 따라 정해집니다.
예) trigger1 = canrecover
------------------------------------------------------------
Ceil
------------------------------------------------------------
수를 올림한 값을 구합니다. 음수일 경우 그 수보다 크거나 같은 정수를 구합니다.
형식
ceil(수)
예)
ceil(5.5)의 값은 6
ceil(5.1)의 값도 6
ceil(-2.6)의 값은 -2
------------------------------------------------------------
Command (*,***)
------------------------------------------------------------
커맨드 입력 감지
예)
trigger1 = Command = "fireball"
fireball 커맨드를 입력했을 때
trigger1 = command != "holdback"
뒤 키를 누르고 있지 않을 때
도스무겐에선 입력된 커맨드 지속시간이 1프레임 이었지만, 윈무겐에서는 cmd파일에
추가된 부분인 [defaults]부분의 command.buffer.time 만큼 지속됩니다. 기술 발동할 때
커맨드를 입력하면 CMD에서 커맨드를 감지해서 스텟을 이동시키는데, 도스무겐에선
이동한 스텟의 time = 0 까지만 커맨드를 입력한걸로 감지하지만, 윈무겐에선 저
값대로(기본값1인 경우 time = 1까지) 감지합니다.
command.buffer.time 값이 1(기본값)이라고 쳤을때
type = varset
trigger1 = time > 0
trigger1 = command = "xx"
이런 부분은 같은커맨드로 연결하는 기술(이오리 규화(밑,뒤+손)같은)에 쓰였었는데
윈무겐을 위해 time > 0 부분을 time > 1 로 고쳐야 합니다.
예를들자면 제 이오리 [statedef 520]에서 다음과 같은 부분이 있습니다.
[State 325,8]
type = Varset
triggerall = time > 1
triggerall = time < 35
triggerall = var(55) = 0
trigger1 = command = "3p1_z"
trigger2 = command = "3p1_x"
persistent = 0
var(5) = 1
이곳의 time > 1을 time > 0으로 고친후 강규화를 실험해보면, 도스무겐에선 문제가
없지만 윈무겐에선 강규화1타가 맞을 경우 2타가 저절로 나가는 현상이 나타납니다.
------------------------------------------------------------
Const (*)
------------------------------------------------------------
캐릭터의 cns파일 처음 부분에 있는 여러 가지 값들을 검사하는 것입니다.
형식
Const(파라미터 이름)
CNS파일 처음부분의 [Data]부분의 값을 검사할 때. (해당 값들을 검사합니다. 굳이 해석할
필요는 없겠죠?)
data.life: Returns value of the "life" parameter. (int)
data.attack: Returns value of the "attack" parameter. (int)
data.defence: Returns value of the "defence" parameter. (int)
data.fall.defence_mul: Returns value of the defence multiplier,
calculated as 100/(f+100), where f is the "fall.defence_up"
parameter. (float)
data.liedown.time: Returns value of the "liedown.time" parameter.
(int)
data.airjuggle: Returns value of the "airjuggle" parameter. (int)
data.sparkno: Returns value of the "sparkno" parameter. (int)
data.guard.sparkno: Returns value of the "guard.sparkno" parameter.
(int)
data.KO.echo: Returns value of the "ko.echo" parameter. (int)
data.IntPersistIndex: Returns value of the "IntPersistIndex"
parameter. (int)
data.FloatPersistIndex: Returns value of the "FloatPersistIndex"
parameter. (int)
CNS의 [Size]부분 값들을 검사할때
size.xscale: Returns value of the "xscale" parameter. (float)
size.yscale: Returns value of the "yscale" parameter. (float)
size.ground.back: Returns value of the "ground.back" parameter.
(int)
size.ground.front: Returns value of the "ground.front" parameter.
(int)
size.air.back: Returns value of the "air.back" parameter. (int)
size.air.front: Returns value of the "air.front" parameter. (int)
size.height: Returns value of the "height" parameter. (int)
size.attack.dist: Returns value of the "attack.dist" parameter.
(int)
size.proj.attack.dist: Returns value of the "proj.attack.dist"
parameter. (int)
size.proj.doscale: Returns value of the "proj.doscale" parameter.
(int)
size.head.pos.x: Returns x-component of the "head.pos" parameter.
(int)
size.head.pos.y: Returns y-component of the "head.pos" parameter.
(int)
size.mid.pos.x: Returns x-component of the "mid.pos" parameter.
(int)
size.mid.pos.y: Returns y-component of the "mid.pos" parameter.
(int)
size.shadowoffset: Returns value of the "shadowoffset" parameter.
(int)
size.draw.offset.x: Returns x-component of the "draw.offset"
parameter. (int)
size.draw.offset.y: Returns y-component of the "draw.offset"
parameter. (int)
CNS의 [Velocity]부분의 값을 검사할 때. 주로 스텟 20(걷기)이나 100(달리기)에서 이
파라미터들을 쓰게 되죠
velocity.walk.fwd.x: Returns value of the "walk.fwd" parameter.
(float)
velocity.walk.back.x: Returns value of the "walk.back" parameter.
(float)
velocity.run.fwd.x: Returns x-component of the "run.fwd" parameter.
(float)
velocity.run.fwd.y: Returns y-component of the "run.fwd" parameter.
(float)
velocity.run.back.x: Returns x-component of the "run.back"
parameter.
(float)
velocity.run.back.y: Returns y-component of the "run.back"
parameter.
(float)
velocity.jump.y: Returns y-component of the "jump.neu" parameter.
Note: this is NOT "velocity.jump.neu.y". Only the "neu"
parameters take a y-component value. (float)
velocity.jump.neu.x: Returns x-component of the "jump.neu"
parameter.
(float)
velocity.jump.back.x: Returns value of the "jump.back" paramamter.
(float)
velocity.jump.fwd.x: Returns value of the "jump.fwd" parameter.
(float)
velocity.runjump.back.x: Returns value of the "runjump.back"
paramamter. (float)
velocity.runjump.fwd.x: Returns value of the "runjump.fwd"
parameter.
(float)
velocity.airjump.y: Returns y-component of the "airjump.neu"
parameter. Note: this is NOT "velocity.airjump.neu.y".
(float)
velocity.airjump.neu.x: Returns x-component of the "airjump.neu"
parameter. (float)
velocity.airjump.back.x: Returns value of the "airjump.back"
paramamter. (float)
velocity.airjump.fwd.x: Returns value of the "airjump.fwd"
parameter.
(float)
역시 [Movement]부분의 값들을 검사할때
movement.airjump.num: Returns value of the "airjump.num" parameter.
(int)
movement.airjump.height: Returns value of the "airjump.height"
parameter. (int)
movement.yaccel: Returns value of the "yaccel" parameter. (float)
movement.stand.friction: Returns value of the "stand.friction"
parameter. (float)
movement.crouch.friction: Returns value of the "crouch.friction"
parameter. (float)
예)
trigger1 = Const(velocity.walk.fwd.x) > 4
CNS파일의 [velocity]부분에 있는 walk.fwd 의 값이 4보다 클 경우
------------------------------------------------------------
Cos
------------------------------------------------------------
삼각함수의 코사인 값을 구합니다. 괄호안에 각도를 쓰는 듯. 예를들어 cos(0) = 1입니다.
실수를 쓸수도 있는데 그것에 대해선 모르겠군요.
Computes the cosine of the specified argument (in radians.)
Format:
cos(exprn)
Arguments:
exprn
Expression to compute the cosine of. (float)
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = cos(0)
Sets value to the cosine of 0, which is approximately 1.0
(possibly with some rounding error.)
------------------------------------------------------------
Ctrl
------------------------------------------------------------
캐릭터 조종이 가능할 경우(?)1을 돌려주고 그렇지 않으면 0을 돌려줍니다.
ctrl값이 0인지 1인지는 각 스텟의 처음 부분의 ctrl =? 등에 따라 결정됩니다.
예)
trigger1 = Ctrl
캐릭터가 컨트롤가능할 경우
------------------------------------------------------------
DrawGame
------------------------------------------------------------
그 라운드를 비길 경우 1이 되고 아니면 0이 됩니다.
예)
trigger1 = DrawGame
라운드가 비긴 상태로 끝날 경우
------------------------------------------------------------
E
------------------------------------------------------------
e값(2.718281828..)이라는데 대학교 고급수학이나 물리에서 나오나? 저는 모르겠습니다.
Returns the value of e (2.718281828...)
Format:
e
Arguments:
none
Return type:
float
Error conditions:
none
------------------------------------------------------------
Exp
------------------------------------------------------------
수학 연산자인데 몰라요.
Computes the exponential of the argument (e raised to the power of
the argument.) This produces slightly more accurate results than the
equivalent expression e**(argument).
Format:
exp(exprn)
Arguments:
exprn
Expression to compute the exponential of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = exp(4-var(0))
Sets value to e raised to the quantity 4-var(0).
------------------------------------------------------------
Facing
------------------------------------------------------------
캐릭터가 오른쪽을 향아고 있으면 1을, 왼쪽을 향하고있으면 -1 값을 줍니다.
예)
Trigger = Facing = -1
캐릭터가 왼쪽을 보고 있을 때
------------------------------------------------------------
Floor
------------------------------------------------------------
버림한 값을 구합니다. ceil과 반대. 음수일 경우 그 수보다 작거나 같은 정수를 구합니다.
예)
floor(5.5)의 값은 5
floor(-2.1)의 값은 -3
------------------------------------------------------------
FrontEdgeBodyDist
------------------------------------------------------------
캐릭터의 앞쪽 너비에서부터 앞쪽 스크린 구석까지의 거리를 구합니다.
역시 밑의 frontedgedist와 갚이 같게 나오는데 어떨 때 다르게 나오는지 모르겠습니다.
예)
trigger1 = FrontEdgeBodyDist < 30
플레이어의 앞쪽 너비부터 앞쪽 스크린 끝까지의 거리가 30픽셀(도트) 미만일 경우
------------------------------------------------------------
FrontEdgeDist
------------------------------------------------------------
플레이어의 x축을 기준으로 앞쪽 스크린구석까지의 거리를 구합니다.
frontedgebodydist와 값이 같게 나오는데 어떨 때 다른지 모르겠습니다.
예)
trigger1 = FrontEdgeDist < 30
플레이어 x축과 앞쪽 스크린 가장자리까지의 거리가 30픽셀 미만일 경우
------------------------------------------------------------
FVar
------------------------------------------------------------
실수변수인 fvar의 값을 검사합니다. fvar(0)부터 fvar(39)까지 있습니다.
값을 정하는 것은 cns명령어인 varset, varadd 로 합니다.
예)
trigger1 = FVar(5) = -1.23
fvar(5)의 값이 -1.23 일 경우
------------------------------------------------------------
GameTime
------------------------------------------------------------
라운드가 시작되면 Gametime은 계속 흘러갑니다. cns명령어인 pause 등으로 게임
화면이 멈춰도 상관없이 1초에 60씩 계속 올라갑니다.
gametime은 주로 일정시간마다 실행할 명령의 조건에 사용됩니다.
예)
trigger1 = (GameTime%27)=0
gametime을27로 나눈 나머지가 0인 경우. 즉, 27프레임마다를 뜻합니다.
------------------------------------------------------------
GetHitVar(*)
------------------------------------------------------------
맞은 공격의 속성(값)들을 검사합니다. cns의 공격판정을 내는 명령인 hitdef의 속성에 따라
값들이 결정되는데, 주로 공격을 한 상대방의 hitdef에서 검사합니다.
Gethitvar는 movetype = H 일 경우에만 지속되며 I일 경우 사라집니다. A일경우엔 일부만
사라지는 듯.
형식
GetHitVar(파라미터이름)
파라미터 종류
xveladd, yveladd, type, animtype, airtype, groundtype, damage,
hitcount, fallcount, hitshaketime, hittime, slidetime, ctrltime,
recovertime, xoff, yoff, zoff, xvel, yvel, yaccel, hitid,
chainid, guarded, fall, fall.damage, fall.xvel, fall.yvel,
fall.recover, fall.time, fall.recovertime, isbound(윈무겐전용).
자세히
xveladd: Returns the additional x-velocity that is added to the
player's own when he is KOed. (float)
KO됐을 때 x속도 더하는 값? 써본적이 없네요. 아마 캐릭터가 KO될때 x,y속도
가 일정값만큼 더해져서 날아가게 되는데 그걸 말하는듯.
yveladd: Returns the additional y-velocity that is added to the
player's own when he is KOed. (float)
type: hitdef의 type. 지상에서 맞으면 ground.type 의 값, 공중이면 air.type의 값입
니다. 0 - none, 1 - high, 2 - low, 3 - trip(3값은 지상에서만 받음)
animtype: hitdef의 animtype에 따라 해당 값을 돌려줍니다. 0 - light, 1 - medium, 2
- hard, 3 - back, 4 - up, 5 - diagup
airtype: hitdef의 air.type값. 돌려주는 값은 위의 type과 같습니다.
groundtype: 마찬가지로 hitdef의 ground.type 값
damage: damage 값
hitcount: 맞은 횟수입니다. 예를들어 2히트콤보를 맞으면 2 뭐 이런식입니다.
fallcount: 콤보맞아서 다운된 횟수
hitshaketime: 경직시간. hitdef의 pausetime 의 영향을 받는데 예를들어 pausetime이 10
인 공격에 맞을 경우 hitshaketime 은 10에서 1씩 줄기 시작해서 10프레임
후엔 0이 됩니다.
hittime: Hitdef의 hittime. 맞아서 회복되는데 걸리는 전체 시간
slidetime: Hitdef의 slidetime. 맞았을 때 밀림이 멈추는데까지 걸리는 시간
ctrltime: 공격을 가드(막다)한 후 컨트롤가능하게 되기까지 시간
recovertime: 넘어졌을 때 일어나기 전까지 시간. 이 값은 0을 향해 점점 줄기 시작하는
데 방향키를 흔들거나 버튼을 연타하면 더 빨리 줄어듭니다.
xoff: "Snap" x offset when hit (deprecated) hitdef의 snap의 x위치?
yoff: "Snap" y offset when hit (deprecated) hitdef의 snap의 y위치?
zoff: "Snap" z offset when hit (deprecated) hitdef의 snap의 z위치? z위치가 뭘뜻하는
지 모르겠군요.
xvel: 맞아서 x방향 밀려나는 속도. hitdef의 velocity들에 있음 (당연히 정수가 아닌 실수)
yvel: 맞아서 y방향으로 뜨는 속도 (역시 실수)
yaccel: Hitdef 의 yaccel값. 맞고 넘어질 때 y 축 가속도 (실수)
chainid: Player-assigned chainID for last hit taken. (int)
마지막 맞은 공격의 chaninID 값인듯 (정수)
guarded: 마지막 받은 공격을 가드했을 경우 1을 돌려주며 아니면 0을 돌려줍니다.
isbound: 플레이어가 상대의 TargetBind 명령의 영향을 받고있으면 1값을
돌려줍니다. 던져지는 스텟에서 버그방지하는데 유용하다는군요(2vs2대전시
p2stateno가 있는 hidef공격이 맞자마자 또다른 상대에게 맞을 경우 발생하는
걸 말하는 듯. 맞은쪽만 스텟이동되는 것). (윈무겐 전용입니다)
fall: 다운되면 1(TRUE), 아니면 0(FALSE)값을 돌려줍니다.
fall.damage: Damage taken upon fall (int) 넘어진 상태에서 받은 대미지인 듯 (정수)
fall.xvel: 바운드(튕김)될 때 x속도. Hitdef의 fall.xvelocity 값 (실수)
fall.yvel: 바운드(튕김)될 때 y속도. Hitdef의 fall.yvelocity 값 (실수)
fall.recover: 낙법이 가능하면 True(1)값을 주며 그렇지 않으면 false(0)값을 줍니다.
fall.recovertime: 낙법이 가능하게 되기까지의 시간.
fall.kill: 넘어진 상태에서 맞았을 때 ko될수 있는가. 역시 hitdef의 fall.kill값
fall.envshake.time: hitdef의 fall.envshake.time 값. 맞고 넘어질 때 지면이 흔들리는
시간(정수)
fall.envshake.freq: hitdef의 fall.envshake.freq 값. 지면 흔들리는 주기(실수)
fall.envshake.ampl: hitdef의 fall.envshake.ampl 값. 지면 흔들리는 너비(정수)
fall.envshake.phase: Returns values set by the fall.envshake.*
parameters in an attacker's hitdef. (실수)
예)
trigger1 = GetHitVar(yvel) < -5.5
맞고 뜰 때 y속도가 -5.5 미만일 때
------------------------------------------------------------
HitCount
------------------------------------------------------------
한 스텟에서 공격을 맞춘 횟수입니다. 다른 스텟으로 넘어가면 0이 됩니다.
Uniqhitcount 랑 다른점은, 같은 공격(hitdef)을 2명의 상대에게 맞췄을 때 hitcount는 1만
증가하지만 Uniqhitcount는 2가 증가합니다.
예)
trigger1 = HitCount > 8
공격스텟이 시작되고 나서 그 스텟 내에서 한 상대에게 공격을 맞춘 횟수가 8회
초과일때
------------------------------------------------------------
HitDefAttr(*,***)
------------------------------------------------------------
활성화되어있는 hitdef의 attr 값. 써본적은 없군요.
형식
HitDefAttr [oper] value1, value2
[oper] 에는 =, != 중에 하나가 들어갈수 있다.
value1
A string that has at least one of the letters "S", "C"
and "A" for standing, crouching and aerial attacks
respectively. For example, "SA" is for standing and
aerial attacks.
S, C, A중 하나이상이 들어가는데 각각 서서공격, 앉아공격, 공중공격이며 hitdef의
attr 값에서 따옵니다. SA처럼 2가지를 쓰면 서서공격이나 앉아공격 이런식으로 되는듯
value2
A set of 2-character strings, separated by commas.
Each 2-character string must be of the form described:
The first character is either "N" for "normal", "S" for
"special", or "H" for "hyper". The second character must
be either "A" for "attack" (a normal hit attack) or "T"
for "throw". For example, "NA, ST" is for normal attacks
and special throws.
2개의 문자가 조합되는데 첫 번째 문자는 N(노멀), S(스페셜:기술), H(하이퍼:필살기)
이며 두 번째 문자는 A(공격), T(잡기)입니다. 역시 hitdef의 attr값을 검사합니다.
form:
arg1, arg2
then the trigger condition is determined to be true only
if arg1 is a subset of value1, AND arg2 is a subset of
value2.
예를들어 S, NA 라고 쓰면 서서 노멀공격일 경우 인 듯 합니다.
예)
trigger1 = A, HA
(원문은 이렇지만 틀린 것 같네요. trigger1 = hitdefattr = A, HA 이어야겠죠?)
공중 필살기 일 때
trigger1 = SC, NA, SA
(역시 틀린 것 같네요. trigger1 = hitdefattr = SC, NA, SA 이겠죠)
서서나 앉아서 공격이어야 하고 노멀공격이거나 스페셜공격(기술)일 때
------------------------------------------------------------
HitFall
------------------------------------------------------------
맞는 스텟에 있을 때 다운이 되는 상태라면 1값을 반환하고 그렇지 않으면 0값을 줍니
다. 예를들어 Hitdef의 fall 값이 1인 경우 그공격에 맞으면 Hitfall 값은 1이 됩니다.
예)
trigger1 = !HitFall
다운이 안될때(또는 다운되는 스텟으로 가게 하지 않을때)
------------------------------------------------------------
HitOver
------------------------------------------------------------
hitdef의 hittime 이 다되면 1값을 돌려줍니다. gethitvar(hittime)값이 0을 향해 계
속 줄어드는데 이 값이 0이 될 경우 1값을 돌려주는 듯.
주로 common1.cns 의 맞는 스텟들에 쓰였습니다
예)
trigger1 = HitOver = 1
hittime 이 만료될 경우. 뒤의 = 1 은 생략해도 됩니다. 반대로 쓰고싶으면
!hitover 로 씁니다.
------------------------------------------------------------
HitPauseTime
------------------------------------------------------------
공격을 맞췄을 때 hitdef의 pausetime 값으로 정해지고 그후로 값이 1/60 초당 1씩 줄어들
어 0으로 향합니다.
If ignorehitpause is not set, this will always return 0.
ignorehitpause 가 정해지면 줄지 않을수도 있다는데 아마 ignorehitpause = 0 으로 설정이
되면 hitpausetime 값이 줄지 않는다는 뜻인 듯한데 ignorehitpause=0을 쓸 이유가 없죠.
이 Hitpausetime은 히트경직중에 값이 변하기 때문에 ignorehitpause = 1을 붙여서 쓰는게
일반적입니다. ignorehitpause 는 11-CNS명령 파일의 처음부분에 설명되어있습니다.
예)
trigger1 = HitPauseTime = 0
공격의 경직이 끝났을 때.
또한 이 Hitpausetime 은 공격을 맞춘 직후 상대의 머리에서 피가 나게 한다거나 하는 효
과를 줄 때 등에 쓸수 있습니다.
예를들어 pausetime 이 15인 공격일 경우 trigger1 = Hitpausetime = 14 로 하면 공격을
맞춘 직후 라는 뜻이 되는데 ignorehitpause = 1과 같이 써야 합니다. 제캐릭터 진념의
강발 등에 쓰였습니다.
------------------------------------------------------------
HitShakeOver
------------------------------------------------------------
공격당했을때 경직이 끝나면 1을 반환, 안그러면 0을 반환합니다.
Hitdef의 pausetime의 경직을 말합니다. common1.cns의 맞는 스텟들에 쓰였습니다.
Example:
trigger1 = HitShakeOver = 0
맞아서 경직된 상태일 때
------------------------------------------------------------
HitVel
------------------------------------------------------------
공격에 맞았을 때 밀려나는 속도
hitvel x 는 x속도, hitvel y 는 y속도입니다.
원문에서는 각 값이 +인게 뒤로 밀려나거나 뜨는 거라고 나와있지만 틀렸군요.
다른것과 마찬가지로 두 속도가 -이면 뒤로 밀려나거나 위로 뜨는 겁니다.
이 값은 맞은 공격의 Hitdef에 설정된 값을 그대로 가져오게 되며 다음 Hitdef에 맞기
전까진 값이 유지됩니다.
예를들어 지상에서 ground.velocity = -13 인 Hitdef에 맞으면 Hitvel x = -13이 됩니다.
예)
trigger1 = HitVel X < -10
밀려나는 x속도가 -10 보다 작을때
------------------------------------------------------------
ID
------------------------------------------------------------
플레이어들의 ID값이며 각 플레이어는 고유의 ID값을 가집니다. 근데 1:1대전과 2:2대전
시의 값이 틀리고 어디다 쓰라는건지 모르겠습니다.
예)
value = ID
값을 ID값으로 해라
------------------------------------------------------------
IfElse
------------------------------------------------------------
조건을 검사해서 만족할때와 그렇지 않을 때 각각 다른 값을 줍니다. 쓸모가 많습니다.
형식
IfElse(조건, 조건만족시의값, 조건불만족시의값)
예)
value = ifelse(var(3),1,2)
var(3)의 값이 0이 아니면 값을 1로 정하고 그렇지않으면 2로 정해라.
주의할점은 조건을 쓸 때 enemynear, 같이 ','(콤마)가 들어가는 조건을 쓸 경우 괄호를
하나 더 쳐서 쓰지 않으면 에러나서 튕깁니다.
예를들어 ifelse(enemynear,statetype=C,-30,-50) 이렇게 쓰면 에러가 나므로
ifelse((enemynear,statetype)=C,-30,-50) 이렇게 써야 에러가 안납니다.
------------------------------------------------------------
InGuardDist(윈무겐 전용입니다 웬만하면 쓰지 맙시다)
------------------------------------------------------------
Returns 1 if the player is within guarding distance of an opponent's physical or
projectile attack. The guarding distance is the value of the guard.dist parameter of
the opponent's HitDef. Returns 0 if out of guard distance, or the opponent is not
attacking.
guard.dist안에 있을 경우 1값을 반환하며 그렇지않으면 0값을 반환합니다. guard.dist값은
Hitdef의 것을따른다고 하는데 Cns처음부분의 attack.dist에도 영향을 받는 듯
윈무겐의 common1.cns 의 가드하는 스텟들에 쓰였군요
------------------------------------------------------------
IsHelper
------------------------------------------------------------
헬퍼인지 아닌지 검사합니다. 괄호안에 아이디를 쓸수도 있습니다.
CNS에서 나오지만, 헬퍼의 아이디는 헬퍼를 생성할 때 정해줄수 있습니다.
예)
1. trigger1 = !IsHelper
헬퍼가 아닐 경우
2. trigger1 = IsHelper(1234)
ID 가 1234인 헬퍼일 경우
------------------------------------------------------------
IsHomeTeam
------------------------------------------------------------
홈팀일 경우 1, 안그러면 0값을 줍니다.
아케이드모드에서는 CPU가 홈팀이 됩니다만 버서스 모드에서는 1P쪽의 캐릭터들이 홈팀이
됩니다. AI를 만들 때 필요한 것 같지만 버서스모드에선 1P가 홈팀이 돼버리는 문제 때문에
대체 어디다 쓰라고 있는 트리거인지 모르겠군요.
예)
trigger1 = ishometeam
음...너무 간단해서 원문에도 사용예는 나와있지 않군요. 앞으로 이런건 설명안해도 되겠죠?
------------------------------------------------------------
Life
------------------------------------------------------------
플레이어의 현재 체력
예)
trigger1 = life <= 10
체력이 10 이하일 때
------------------------------------------------------------
LifeMax(윈무겐전용. 역시 안쓰길 권장)
------------------------------------------------------------
플레이어의 cns의 life =? 값입니다. 체력 최대치를 뜻합니다.
------------------------------------------------------------
Log
------------------------------------------------------------
로그값을 구하는 삼각함수입니다. 수학책을 보시는게 나을 듯.
예를들면 log(2,64) 는 64의 2에대한 로그값?을 구하는것인데, 2를 몇면 제곱해야 64가
나오느냐 하는것이므로 값은 6.0이 됩니다.
Takes two arguments a and b, and returns the base-a logarithm of b.
Format:
Log(exp1,exp2)
Arguments:
exp1
Expression giving the base of the logarithm. Must be positive.
exp2
Expression giving the value to take the logarithm of. Must be
positive.
Return type:
float
Error conditions:
Returns SFalse if either of exp1 or exp2 evaluates to SFalse, or if
either of exp1 or exp2 is not positive.
Example:
value=log(2,64)
Sets value to the base 2 log of 64, which is 6.0.
------------------------------------------------------------
Ln
------------------------------------------------------------
역시 프로그래밍 하는 사람들은 삼각함수까지 알아야 하나 봅니다. ln값을 구합니다.
ln이 아마 지수가 10인 로그던가? 역시 수학책을 봅시다.
Returns the natural logarithm of its argument. This produces slightly
more accurate results than the otherwise equivalent expression
log(e,(argument)).
Format:
ln(exprn)
Arguments:
exprn
Expression to compute the natural logarithm of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn is not
positive.
Example:
value = ln(time)
Sets value to the natural logarithm of the player's statetime.
------------------------------------------------------------
Lose
------------------------------------------------------------
졌을 경우 1 안그러면 0을 줍니다만 3가지가 있습니다.
형식
1. Lose - 아무 상황으로나 졌을때
2. LoseKO - 체력이 바닥나서 졌을때
3. LoseTime - 시간이 다돼서 졌을때
예)
1. trigger1 = Lose
졌을때
2. trigger1 = !LoseKO
타임오버로 졌거나 이겼을 때
------------------------------------------------------------
MatchNo
------------------------------------------------------------
몇번째 스테이지냐 하는것입니다.
버서스 모드에서는 무조건 값이 1이 됩니다.
예)
예) trigger1 = matchno > 3
3스테이지를 통과한 이후. 즉 4스테이지 이후부터. 제캐릭터 드레이븐에서 레벨업이후
체력증가에 쓰였습니다.
------------------------------------------------------------
MatchOver
------------------------------------------------------------
스테이지가 끝나면 값이 1이 되고 안그러면 0이 됩니다.
그러니까 3판2승제라면 2번째 이긴 라운드에서 승리포즈취하기 직전까진 0이고
승리포즈를 취함과 동시에 1이 됩니다.
윈무겐에선 도스무겐보다 좀 빨리 1이 되는데 승자가 결정되기 전에 1이 됩니다.
예)
trigger1 = matchover
스테이지 끝나고 승리포즈 취한후
------------------------------------------------------------
MoveContact
------------------------------------------------------------
공격이 상대에게 닳았을 경우(히트하거나 가드했을 때) 1, 안닳으면 0이 됩니다. 스텟이 넘
어갈 경우 0으로 초기화됩니다.
하지만 주의할점은 Movecontact와 이 밑의 movehit, moveguarded 는 만족할 경우
도스무겐에서는 값이 1로 유지되지만 윈무겐에서는 1,2,3,4 식으로 계속 증가합니다.
따라서 윈무겐에서도 캐릭을 쓰려면 movecontact = 1 대신, movecontact > 0 으로
써주어야 합니다. 밑의 movehit, moveguarded 도 같습니다.
예)
trigger1 = MoveContact > 0
공격이 닳았을 때
------------------------------------------------------------
MoveGuarded
------------------------------------------------------------
공격을 상대가 가드했을 경우 1, 안그러면 0이 됩니다.
예)
trigger1 = MoveGuarded > 0
공격이 막혔을 경우
------------------------------------------------------------
MoveHit
------------------------------------------------------------
공격이 히트했을(맞았을) 경우 1, 안그러면 0값을 반환합니다.
예)
trigger1 = MoveHit > 0
공격을 맞췄을 경우
------------------------------------------------------------
Movereversed(윈무겐 전용입니다. 웬만하면 쓰지 맙시다)
------------------------------------------------------------
공격이 리버설된 경우 1, 안그러면 0값을 반환합니다(원문엔 0이 아닌값을 준다고 돼있는데
1값을 줍니다). Hitdef의 Reversaldef명령에의해 리버설된 경우를 말합니다.
예)
trigger1 = MoveReversed
P1의 공격이 P2에 의해 리버설된 경우
------------------------------------------------------------
MoveType(*,***)
------------------------------------------------------------
플레이어의 movetype 입니다.
예)
trigger1 = movetype != H
movetype 이 H가 아닐 경우(맞는상태가 아닐경우)
------------------------------------------------------------
Name(*,***)
------------------------------------------------------------
DEF파일에 쓰여있는 캐릭터의 NAME을 검사합니다.
캐릭터간 인트로를 만들 때 authorname과 enemy, 같은 것들과 같이 쓰입니다.
enemy, 같은것들은 이 문서 맨 마지막 부분에 설명되어 있습니다.
예)
trigger1 = Name = "Kyo99"
캐릭터명이 kyo99 일 때.(하지만 이렇게 자체적으론 거의 안쓰이죠. 자기이름 검사해서
뭐합니까...)
------------------------------------------------------------
NumEnemy
------------------------------------------------------------
적의 숫자입니다. 중립플레이어와 노멀헬퍼는 포함되지 않음. 중립 플레이어란게 뭔지
모르겠네요. 헬퍼생성시 헬퍼타입을 player로하면 적숫자에 포함되는 듯 하지만 헬퍼타입
player를 쓰지 말라고 sctrl.txt파일에 나와있습니다.
trigger1 = NumEnemy = 2
trigger1 = enemynear(1), name = "Squash"
적의 수가 2명일 때. 2번째로 가까이 있는 적의 이름이 Squash 일 경우
------------------------------------------------------------
NumExplod
------------------------------------------------------------
cns에서 효과 스프라이트를 내는 명령인 explod가 있는데 그 명령에 의해 생긴
explod의 수를 검사합니다. 괄호를 쳐서 ID를 검사할수도 있습니다.
예)
1. trigger1 = NumExplod >= 4
자기가 발생시킨 모든 explod개수가 4개 이상일 경우
2. trigger1 = NumExplod(1234) >= 4
ID가 1234인 Explod의 개수가 4개 이상일 경우
------------------------------------------------------------
NumHelper
------------------------------------------------------------
발생시킨 헬퍼의 개수. 역시 괄호를 쳐서 아이디로 검사가능합니다.
헬퍼에서 발생시킨 헬퍼라도 개수에 포함됩니다. 즉 플레이어가 근원인 전체 헬퍼 개수.
예)
1. trigger1 = NumHelper < 2
헬퍼개수가 2개 미만일때
2. trigger1 = NumHelper(1234) < 2
ID가 1234인 헬퍼의 개수가 2개 미만일 때
------------------------------------------------------------
NumPartner
------------------------------------------------------------
파트너의 수. 역시 뉴트럴 플레이어와 노멀헬퍼는 고려되지 않는다네요.
예)
trigger1 = NumPartner = 1
trigger1 = partner, life < 200
파트너가 1명 있고 그 파트너의 체력이 200미만일 때
------------------------------------------------------------
NumProj
------------------------------------------------------------
cns명령인 projectile로 발생시킨 프로젝타일 개수. 주의점은 헬퍼에서 만든 프로젝타일일
지라도 본체캐릭터의 소유가 되므로 헬퍼에서 검사할땐 root, numproj 처럼 써야 합니다.
예)
trigger1 = NumProj = 0
프로젝타일이 없을 경우
------------------------------------------------------------
NumProjID
------------------------------------------------------------
위와 같지만 아이디로 검사합니다.
예)
trigger1 = NumProjID(1234) = 1
ID 번호가 1234인 프로젝타일이 1개일 때
------------------------------------------------------------
NumTarget
------------------------------------------------------------
타겟 개수. 공격을 맞췄고(막아도됨) 맞은 상대가 movetype = H일 경우 타겟에
포함됩니다. 상대의 movetype 이 H가 아닐 경우엔 타겟에서 벗어납니다.
괄호를 쳐서 아이디로 검사할수도 있습니다.
자기가 맞춘 대상만 포함되므로 헬퍼같은게 맞춘 대상은 본체나 다른 헬퍼의 타겟에
포함되지 않습니다.
예)
1. trigger1 = Numtarget >= 1
공격에 닳은 상태의 상대가 1명 이상일 때
2. trigger1 = Numtarget(200) >= 1
ID 200의 공격에 닳은 상태의 상대가 1명 이상일 때
------------------------------------------------------------
P1Name(*,***)
------------------------------------------------------------
This is an alias for the Name trigger. See "Name".
이름. Name 과 뭐가 틀린지 모르겠습니다.
------------------------------------------------------------
P2BodyDist
------------------------------------------------------------
상대와 거리인데 p2bodydist x는 플레이어의 앞쪽 몸체너비부터 상대의 앞쪽 몸체너비
까지의 거리입니다. 앞쪽 몸체너비란 front.width 값을 말하는데 cns처음부분의
ground.front(지상에 있을 때) 와 air.front(공중에 있을 때) 값에 따라 정해집니다.
p2bodydist y는 p2dist y랑 값이 같게 나오는데 어떨때 틀리게 나오는지 모르겠군요.
p2bodydist 값이 -일 경우 상대보다 위쪽에 있는걸 뜻합니다.
그런데 p2가 들어가는 트리거들의 경우 2명이상의 상대와 싸울 때 가장 가까이 있는
상대를 기준으로 하긴 하지만 그게 제대로 작동하지 않고 멀리있는 상대를 기준으로
돼버릴 때도 있습니다. 이 문제는 윈무겐의 docs폴더의 파일에도 나와있긴 한데 정확히
고쳐졌다고 나와있진 않습니다. 따라서 상황에 따라 enemynear, 같은 명령어를 쓰는게
더 나을 듯 합니다.
별로 중요하지 않지만, 값은 실수입니다.
Details:
For comparing the Y-distance, P2BodyDist gives the difference in the
heights of the players' Y-axes. A negative value means that P2 is
above P1.
For comparing the X-distance, P2BodyDist gives the
X-distance of P2's front from P1's front. So, if the
players are standing right next to each other, then
P2BodyDist is 0. Remember that you can set the width of
the player in "front.width", etc. under [Size] in the
player variables.
See also P2Dist.
예)
trigger1 = P2BodyDist X < 30
플레이어의 몸체앞쪽너비부터 상대몸체앞쪽너비까지 거리가 30픽셀 미만일 경우
------------------------------------------------------------
P2Dist
------------------------------------------------------------
플레이어의 x축과 상대 x축 까지의 거리입니다.
p2dist y는 p2bodydist y 랑 뭐가 틀린지 모르겠습니다. 설명도 같네요.
Details:
For comparing the Y-distance, P2Dist gives the difference in the
heights of the players' Y-axes. A negative value means that P2 is
above P1.
For comparing the X-distance, P2Dist gives the X-distance
of P2's axis from P1's axis. A positive value indicates P2
is in front of P1.
See also P2BodyDist.
Example:
trigger1 = P2Dist Y <= -12
상대보다 12픽셀 이상 높이 있을 때
------------------------------------------------------------
P2Life
------------------------------------------------------------
상대의 체력입니다. 적이 2명이상일 경우 가까이 있는 적의 체력을 검사합니다.
------------------------------------------------------------
P2MoveType
------------------------------------------------------------
상대의 movetype을 검사.
------------------------------------------------------------
P2Name(*,***)
------------------------------------------------------------
상대의 def파일에 있는 name을 검사. 역시 2인대전시는 가까이있는쪽의 name을 검사하
게 되고 상대가 1명이 ko됐으면 살아있는 상대의 name을 검사합니다.
상대가 모두 ko돼서 바닥에 쓰러진 경우 값은 0(false)이 됩니다.
------------------------------------------------------------
P2StateNo
------------------------------------------------------------
상대의 stateno(스텟넘버)를 검사
------------------------------------------------------------
P2StateType
------------------------------------------------------------
상대의 statetype을 검사
------------------------------------------------------------
P3Name(*,***)
------------------------------------------------------------
같은편의 name을 검사합니다. 같은편이 ko된 상태라도 작동합니다.
같은편이 없는 경우에만 무조건 0(false)값을 줍니다.
------------------------------------------------------------
P4Name(*,***)
------------------------------------------------------------
상대가 2명 이상일 때 더 멀리있는 상대의 name을 검사합니다. 상대가 ko당했어도
작동합니다.
상대가 1명이면 값은 무조건 0.
------------------------------------------------------------
PalNo
------------------------------------------------------------
캐릭터의 팔렛번호
캐릭을 고를 때 선택되는 def파일에 나와있는 대로의 팔렛번호 입니다.
DEF에도 설명돼있지만
A - 1 B - 2 C - 3 X - 4 Y - 5 Z - 6 이고 스타트버튼을 누를 경우 6이 더해
지며, 해당팔렛이 없을 경우엔 그다음 팔렛으로 선택됩니다.
예를들어 스타트버튼을 누른채 B버튼을 눌렀는데 8번팔렛부터 12번 팔렛까지 없다면 1번
팔렛이 골라지며 1번팔렛을 이미 골랐다면 2번팔렛으로 되는 식입니다.
예)
trigger1 = PalNo = 5
팔렛번호가 5일 때
이 트리거는 sanderx씨의 캐릭에 쓰였는데 어느 버튼으로 고르냐에 따라서 캐릭의 버전이
바뀌는걸 구현했습니다.(하지만 복잡하다는 단점이 더 크죠)
------------------------------------------------------------
ParentDist
------------------------------------------------------------
헬퍼에서만 쓰이는 트리거. 자신을 만든 부모와 자신과의 거리.
parentdist x 는 부모의 x축과 자신의 x축간의 거리이고 parentdist y로 하면 y축간의
거리입니다.
예)
trigger1 = ParentDist X != 0
부모와의 x위치가 다를때(조금이라도 떨어져있을 경우)
------------------------------------------------------------
Pi
------------------------------------------------------------
Pi값인 3.141593을 나타냅니다. 이것도 무슨 고급 물리나 수학에서 나오는듯.
This trigger returns the numeric value of pi (3.141593...)
Format:
pi
Arguments:
none
Return type:
float
Error conditions:
none
------------------------------------------------------------
Pos
------------------------------------------------------------
플레이어의 x,y축을 기준으로 현재 플레이어의 위치를 검사합니다.
pos x는 x위치, pos y는 y위치를 검사합니다.
화면의 정중앙이 pos x = 0 이며 왼쪽으로 갈수록 -, 오른쪽으로 갈수록 +가 됩니다.
스테이지의 바닥은 pos y = 0이며 위로 갈수록 -, 밑으로 갈수록 +가 됩니다.
중요하진 않지만 값은 실수
예)
trigger1 = Pos Y >= 0
플레이어의 y축 위치가 스테이지 바닥밑으로 내려갔을 때
(주로 넘어지는 스텟에 쓰입니다)
------------------------------------------------------------
Power
------------------------------------------------------------
기(파워)게이지의 양을 검사. 1000이 기 한칸입니다.
예)
trigger1 = power >= 1000
기게이지 레벨이 1이상일 때
------------------------------------------------------------
PowerMax(윈무겐전용)
------------------------------------------------------------
CNS처음부분의 power =? 값입니다. 기(파워)게이지의 최대치. 보통 3000(Lv3)입니다.
------------------------------------------------------------
PlayerIDExist
------------------------------------------------------------
해당 ID를 지닌 플레이어가 존재하느냐 인데 앞서 말했듯 ID값은 몇 명 대전을 하느냐에
따라 달라지므로 쓰기 어정쩡.
예)
trigger1 = PlayerIDExist(var(4))
var(4)와 같은 ID의 플레이어가 존재할 경우
------------------------------------------------------------
PrevStateNo
------------------------------------------------------------
바로이전 스텟번호를 검사
예)
trigger1 = prevstateno = 100
직전 스텟넘버가 100(달리기)이었을 경우
------------------------------------------------------------
ProjCancelTime
------------------------------------------------------------
처음 값은 -1 이며 프로젝타일이 상대프로젝타일에 의해 사라지는 경우 이 값이 0으로
설정된 후 1프레임당 1씩 계속 증가하게 됩니다.
프로젝타일이 사라질땐 Hitflag = P가 들어가는 hitdef에 의해 사라질수도 있는데 이경우엔
ProjCancelTime 에 영향을 주지 않습니다.(그러니까 상대 프로젝타일에 의해 사라진 경우
만 projcanceltime값이 증가합니다.)
괄호안에 검사할 프로젝타일의 아이디를 쓰는데 0을 쓸 경우 프로젝타일의 아이디를
체크하지 않습니다. 즉 projcanceltime(0)은 플레이어의 프로젝타일중에 아무거나가
상쇄되면 0,1,2... 이렇게 증가합니다.
예)
1. trigger1 = ProjCancelTime(1234) = 1
ID 1234의 프로젝타일이 상대 프로젝타일에 의해 사라진 직후
2. trigger1 = ProjcancelTime(0) != -1 && ProjcancelTime(0) < 15
아무 프로젝타일이 상쇄된 후 15프레임 이내
------------------------------------------------------------
ProjContact(*,***)
------------------------------------------------------------
프로젝타일이 상대에게 닳으면 True(1)값을 줍니다. 뒤에 괄호를 치지 않고 아이디번호
를 쓸수있는데, 아이디번호를 쓰지 않거나 0으로 하면 역시 아무 프로젝타일이 닳으면
true값을 줍니다. 프로젝타일이 닳은 후 True값이 된 후엔 값이 바로 0으로 돌아옵니다.
그런데 이상한 것은 trigger1 = projcontact = 1에서 값을 1이상의 아무 숫자로 줘도
마찬가지입니다. projcontact = 2 나 projcontact = 15 이렇게 줘도 projcontact = 1과
같게 작동하는군요. 분명히 설명에선 1이나 0이라고 했는데 말이죠.
그리고 밑의 두 번째 형식처럼 쓸수 있는걸 보니 각 프레임마다 값이 존재하는 듯 하며
이때문인지 Displaytoclipboard명령으로 볼수가 없어서 애매하군요(에러남)
형식
1. ProjContact[ID] = value
2. ProjContact[ID] = value, [oper] value2
이렇게 쓸수도 있는데 뜻은 아래 Details에 나와있습니다만 해석이 애매해서 원문을
놔뒀습니다.
Arguments:
[ID]
Optional ID number.
value (boolean)
Value to compare against. 0 for false, 1 for true.
[oper]
=, !=, <, >, <=, >=
value2
Time value to compare against.
Return type:
boolean int
Details:
ProjContact will trigger once for each hit of the projectile, so a
multi-hit projectile can trigger multiple times.
The first form of ProjContact shown above is only valid for one tick
after contact, unlike MoveContact.
For the second form, ProjContact returns true if the projectile made
contact n ticks ago, where n is a nonnegative number satisfying the
relation "n [oper] value2".
Specifying an ID number of 0 gives the same behavior as if the ID
number is omitted (check all projectiles).
(원문의 boolean은 불 논리 연산=피연산자가 가능(可) 불가능(不) 으로 결과가 나오는
이라고 사전에 나와있군요. 0-불가능 1-가능 이런식입니다)
예)
1. trigger1 = ProjContact1234 = 1
ID 1234의 프로젝타일이 상대에게 막 닳았을 때(닳은 직후)
2. trigger1 = ProjContact456 = 0, < 15
이전 15프레임 내에 ID 456의 프로젝타일이 닳지 않았다면(모르겠으면 cns에서
실험해보거나 밑의 projhit나 projguarded를 보시길)
------------------------------------------------------------
ProjContactTime
------------------------------------------------------------
형식과 값의 변화는 위 projcanceltime과 같지만 이것은 프로젝타일이 닳았을 경우 값이
0,1,2... 이런식으로 증가합니다.
예)
1. trigger1 = ProjContactTime(1234) = 1
아이디 1235의 프로젝타일이 닳은 직후
2. trigger1 = ProjContactTime(0) != -1 && ProjContactTime(0) < 15
아무 프로젝타일이 닳은 후 15프레임 이내
------------------------------------------------------------
ProjGuarded(*,***)
------------------------------------------------------------
projcontact와 같지만 이건 프로젝타일이 막혔을때(가드당했을때)를 감지합니다.
형식 설명도 projcontact와 같군요.
예)
1. trigger1 = ProjGuarded1234 = 1
아이디 1235의 프로젝타일이 가드당한 직후
2. trigger1 = ProjGuarded = 1, < 15
이전 15프레임 사이에 아무프로젝타일이 가드당했을 때
(바꿔말하면 프로젝타일이 가드당한 후 15프레임 이내)
------------------------------------------------------------
ProjGuardedTime
------------------------------------------------------------
역시 projcanceltime과 같지만 프로젝타일이 가드당했을 때 값이 0,1,2...식으로 증가.
예)
1. trigger1 = ProjGuardedTime(1234) = 1
아이디 1235의 프로젝타일이 가드당한 직후
2. trigger1 = ProjGuardedTime(0) != -1 && ProjGuardedTime(0) < 15
아무 프로젝타일이 가드당한후 15프레임 이내
------------------------------------------------------------
ProjHit(*,***)
------------------------------------------------------------
마찬가지로 projcontact 등과 같지만 프로젝타일이 맞았을때(히트했을때)를 감지합니다
예)
1. trigger1 = ProjHit1234 = 1
아이디 1234의 프로젝타일이 히트한 직후
2. trigger1 = ProjHit1234 = 1, < 15
이전 15프레임 이내에 아이디 1234의 프로젝타일이 히트했을 때
(역시 바꿔말하면 아이디 1234의 프로젝타일이 히트한 후 15프레임 이내)
------------------------------------------------------------
ProjHitTime
------------------------------------------------------------
이하동문. projcanceltime 등과 마찬가지지만 이것은 프로젝타일이 히트했을 때 값이
0,1,2... 식으로 증가합니다.
예)
1. trigger1 = ProjHitTime(1234) = 1
아이디 1234의 프로젝타일이 히트한 직후
2. trigger1 = ProjHitTime(0) != -1 && ProjHitTime(0) < 15
아무 프로젝타일이 히트한 후 15프레임 이내
------------------------------------------------------------
Random
------------------------------------------------------------
랜덤수를 발생시킵니다. 수는 0부터 999사이에 정해집니다.
이 Random이란 글자가 나올때마다 무겐은 랜덤수를 만듭니다.
예)
trigger1 = Random <= 249
랜덤값이 249이하일 때(즉 25%확률로 라는 뜻이 됩니다.)
------------------------------------------------------------
RootDist
------------------------------------------------------------
헬퍼에만 사용되는 트리거. 자신을 만든 근원의 x,y축 부터 자신의 x,y축까지의 거리를
구합니다.
Rootdist x는 가로거리, Rootdist y는 세로거리입니다.
예)
trigger1 = RootDist X != 0
루트의 x위치와 다를 때
------------------------------------------------------------
RoundNo
------------------------------------------------------------
라운드 번호입니다.
예)
trigger1 = RoundNo = 3
3라운드일때
------------------------------------------------------------
RoundsExisted
------------------------------------------------------------
자신이 싸운 라운드가 몇번 있었냐 하는겁니다. 첫 라운드의 값은 0이 되며 스테이지
넘어가도 0이 됩니다.
이것은 Turns모드에서의 인트로를 만들 때 유용합니다.
예)
trigger1 = RoundsExisted = 0
trigger1 = TeamMode = Turns
trigger1 = RoundNo > 0
자신이 싸우는 첫 라운드이고 게임모드가 Turns일 때. 3번째 조건은 1라운드 이후일
때 라는건데 당연한 것이니까 무의미한 조건인 것 같군요.
당신은 이 예를 사용하여 초기화 스텟인 5900(라운드 처음 시작시 맨처음 시작스텟)에
changestate명령과 같이써서 팀모드 인트로를 만들 수 있다. 고 하는군요.
------------------------------------------------------------
RoundState
------------------------------------------------------------
라운드의 상태를 나타내는데 라운드 시작시 0부터 시작해서 라운드 끝나면 4가 됩니다.
각 값이 나타내는 것은 다음과 같습니다.
Details:
0: 화면이 페이드인 될 때(맨처음 라운드 시작시 화면 밝아지는 순간)
1: 캐릭터가 인트로(등장 포즈나 이벤트대사 등)를 할때
2: 캐릭터가 싸울때(라운드 x 파이트! 란 글자가 뜬 후)
3: 라운드가 끝났을 때.(캐릭터의 체력이 바닥나거나 타임오버 됐을때
4: 캐릭터가 승리포즈를 취할 때
예)
trigger1 = RoundState = 2
싸우는 중일 때
------------------------------------------------------------
ScreenPos
------------------------------------------------------------
화면의 왼쪽 위 구석부터 얼마만큼의 위치에 있느냐 하는것입니다.
왼쪽 구석이 screenpos x = 0이 되고 오른쪽으로 갈수록 값이 +가 되고 왼쪽으로 갈수록
-가 됩니다.
화면의 맨위 꼭대기가 screenpos y = 0이 되고 밑으로 갈수록 값이 +되고 위로갈수록
-됩니다.
예)
trigger1 = ScreenPos Y = [0,239]
캐릭터 y위치가 화면 꼭대기부터 밑으로 239 픽셀 내에 있을 때
------------------------------------------------------------
SelfAnimExist
------------------------------------------------------------
Animexist와 같은데 animexist는 맞아서 상대방의 스텟에 가있는 경우 그 상대의 AIR파일
을 검사하기 때문에 대부분 이 selfanimexist를 씁니다.
예) trigger1 = selfanimexist(200)
애니매이션번호 200이 존재할때
------------------------------------------------------------
Sin
------------------------------------------------------------
삼각함수의 sin값을 구합니다.
Computes the sine of the specified argument (in radians.)
Format:
sin(exprn)
Arguments:
exprn
Expression to compute the sine of. (float)
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = sin(pi/2)
Sets value to the sine of pi/2, which is approximately 1.0
(possibly with some rounding error.)
------------------------------------------------------------
StateNo
------------------------------------------------------------
스텟넘버를 검사
예)
trigger1 = stateno = [200,650]
스텟번호가 200~650 사이일 때
------------------------------------------------------------
StateType
------------------------------------------------------------
스텟타입을 검사. S,C,A,L중에 하나죠.
예)
trigger1 = StateType != A
스텟타입이 A가 아닐때
------------------------------------------------------------
SysFVar
------------------------------------------------------------
무겐의 변수중에 var와 fvar말고도 sysvar(정수)와 sysfvar(실수)가 있습니다.
현재 윈무겐까지는 sysvar(0), sysvar(1), sysvar(2) 만이 common1.cns 에 사용되었습니다.
원문엔 쓰지 말라고 하는 듯. 원문입니다.
This trigger takes a mandatory variable number as an argument. It
returns the value of the player's specified system float variable.
This trigger should NOT be used under normal circumstances. System
variables are reserved for bookkeeping in common1.cns.
(cns)근데 상대캐릭터를 특정 스텟으로 강제로 이동시킨후에 var를 써야만하는 경우가 있
는데 그냥 var를 쓰면 맞은 캐릭터의 var를 바꿔버리므로 안되니까 그럴 땐 이 sysvar(4)
같은걸 쓰도록 합시다.
sysvar나 sysfvar나 0-4 까지 쓸수 있습니다.
예)
trigger1 = SysFVar(0) = -1.23
sysfvar(0)이 -1.23일 경우
------------------------------------------------------------
SysVar
------------------------------------------------------------
sysfvar는 실수변수지만 sysvar는 정수변수입니다. 역시 0-4 까지 쓸수있긴 한데 sysvar(0)
과 sysvar(1)과 sysvar(2)는 공통스텟(common1.cns)에 쓰였으므로 쓰면 안됩니다.
예)
trigger1 = SysVar(0) = -34
sysvar(0)이 -34일 경우
------------------------------------------------------------
Tan
------------------------------------------------------------
삼각함수 탄젠트값을 구합니다.
Computes the tangent of the specified argument (in radians.)
Format:
tan(exprn)
Arguments:
exprn
Expression to compute the tangent of. (float)
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = tan(pi/4)
Sets value to the tangent of pi/4, which is approximately 1.0
(possibly with some rounding error.)
------------------------------------------------------------
TeamMode(*,***)
------------------------------------------------------------
플레이의 모드값을 구합니다.
single - 싱글플레이
simul - 시뮬플레이
turns - 턴플레이
예)
trigger1 = TeamMode = Single
싱글플레이일때
------------------------------------------------------------
TeamSide
------------------------------------------------------------
라운드 시작시 1P쪽은 1이 되고 2P쪽은 2가 됩니다.
이 트리거는 기게이지를 표시한다든지 할 때 유용합니다.
예)
trigger1 = TeamSide = 2
2P쪽일 때
------------------------------------------------------------
TicksPerSecond
------------------------------------------------------------
실제시간 1초에 몇프레임인지 구합니다. 원래 60인데 게임속도를 slow 9로 하면 15가
되는군요.
예)
trigger1 = Time > 10 * TicksPerSecond
게임스피드에 상관없이 실제시간 10초 이후일 때
------------------------------------------------------------
Time
------------------------------------------------------------
스텟의 시간입니다.
스텟이 시작하면 0부터 시작해서 1프레임당 1씩 계속 증가합니다.
예)
trigger1 = Time = 2
타임이 2일 때. 란 뜻이긴 하지만 자세히 말하자면 time=2일때가 아니라 time=1에서
time=2로 넘어가는 순간을 뜻합니다.(animelem = ? 과 같음)
주의할점은 헬퍼에서 본체의 time을 검사할 경우엔 값을 1더해야 한다는 것입니다.
예. 헬퍼에서) trigger1 = parent, time = 3
부모의 time이 2일 때.
항상실행스텟인 [statedef -?]에서 검사할때도 값에 1을 더해야 합니다.
이렇게 해야하는 이유는 cns의 실행 순서가 일반스텟->헬퍼->항상실행스텟(statedef -?)
이기 때문인 것 같습니다.
* 마찬가지로 캐릭터가 스텟에 오자마자(time=0에) 적의 공격을 막는(가드스텟으로 가는)
경우가 있는데 이경우엔 만약 스텟시작하자마자 poweradd=-1000같은(필살기같은데
쓰이는)게 있을 경우 기만 날리고 기술은 안나가는 경우가 생길수 있습니다. 따라서 이런
상황을 막기 위해서 이런건 trigger1 = time = 1 이렇게 씁시다.
------------------------------------------------------------
TimeMod(*,**,***)
------------------------------------------------------------
스텟의 time을 나눈 나머지를 구합니다. %대신 쓰는게 추천된다고 하는군요.
형식
TimeMod [oper] divisor, value1
Arguments:
[oper]
=, !=, <, >, <=, >=
divisor (int)
나눌 수(0이 아니어야 함)
value1 (int)
나뉠 수
예)
trigger1 = TimeMod = 4, 3
스텟의 time을 4로 나눈 나머지가 3일 경우 그러니까 스텟타임이 각각 3, 7, 11, 15,
...일 경우를 뜻합니다. trigger1 = time%4 = 3과 같습니다.
근데 위에나온 부호인 <, >= 같은건 어떨 때 쓰는지 모르겠군요. 설명에 나온
위치대로 timemode < 4,3식으로 쓰면 에러나네요. timemod = 4, < 3이렇게 쓸수는
있습니다. 각자 실험해봅시다.;
------------------------------------------------------------
UniqHitCount
------------------------------------------------------------
한 스텟에서 공격이 히트한 횟수입니다. hitcount와 다른점은 공격이 2명이상의 상대에
게 맞았을 때 hitcount는 1만 증가하지만 이 uniqhitcount는 맞춘 수대로 증가합니다. 2명한
테 맞췄다면 2증가 이런식입니다.
예)
trigger1 = UniqHitCount = [4,6]
공격이 들어간 횟수가 총 4~6번 사이일 때
------------------------------------------------------------
Var
------------------------------------------------------------
무겐에서 쓸 수 있는 정수변수. var(0) ~ var(59) 까지 쓸수 있습니다.
예)
trigger1 = Var(0) = -34
var(0)이 -34일 경우
------------------------------------------------------------
Vel
------------------------------------------------------------
속도입니다. vel x는 x속도, vel y 는 y속도입니다.
예)
trigger1 = Vel Y >= 0
y속도가 0이상일 때(밑으로 떨어질 때)
------------------------------------------------------------
Win
------------------------------------------------------------
이겼는가를 뜻합니다. 다음의 4가지가 있습니다.
1. Win - 결과적으로 이겼는가
2. WinKO - ko로 이겼는가
3. WinTime - 타임오버로 이겼는가
4. WinPerfect - 퍼펙트로 이겼는가
예)
1. trigger1 = Win
이겼을 때
2. trigger1 = !WinKO
KO로 이기지 않은 경우
------------------------------------------------------------
1
------------------------------------------------------------
항상실행. 즉 trigger1 = 1 이렇게 쓰면 그 스텟 내에서 해당 명령을 계속 실행해라 하는
것이 됩니다.
주의할점은 trigger1 = 1을 쓰면 다른스텟으로 넘어가는 순간까지 해당명령이 실행되기
때문에 cns의 changestate명령이나 selfstate명령에 의해 스텟이 바뀐후에도
1프레임동안(다음스텟의 time = 0일때까지) 해당명령이 실행되게 됩니다.
따라서 정확히 그 스텟 내에서만 명령이 실행되게 하고 싶으면 trigger1 = animtime < 0
이런식으로 상황에 맞게 써줘야 합니다.
==== (여기까지 일단 트리거들 설명 끝이고 추가적으로) =========================
====================================================================
Trigger redirection
====================================================================
원래 exp.txt에 있는거지만 여기 있는게 나을 것 같아서 여기 써놨습니다.
트리거를 쓸 때 자기자신의 조건 말고도 헬퍼나 상대의 상태를 검사할수도 있습니다.
예를들어 trigger1 = time = ? 이러는 것 외에 trigger1 = parent, time = ? 이라고 하면
parent의 time값을 검사합니다. parent니 뭐니 하는건 밑에 설명.
쓸 수 있는 종류는 다음과 같습니다.
*) parent
자기자신을 만든 부모를 뜻합니다. 헬퍼에 쓰이는데 예를들어 캐릭터 A가 있고 A가 생성
시킨 헬퍼 B가 있고 헬퍼B에서 만든 헬퍼C가 있다고 쳤을때
B의 parent는 A가 되고 C의 parent는 B가 됩니다.
B의 스텟에서 trigger1 = parent, time = ? 이라고 하면 A의 스텟타임을 검사하는것입니다.
*) root
자신을 만든 근원(?). 위와 같은 상황에서 B와 C의 root는 A가 됩니다.
*) helper
자신이 만든 헬퍼를 뜻하는데 그냥 helper, 라고 쓰면 맨처음 만든 헬퍼를 뜻한다고
하네요. 그런데 그냥 helper, 로는 거의 쓰지 않고 밑과 같이 helper(ID)로 씁니다.
*) helper(ID)
헬퍼를 만들 때 아이디를 줄수있는데 그 아이디를 가진 헬퍼를 뜻합니다. helper(1234), 라
고 하면 ID 1234의 헬퍼를 뜻합니다.
*) target
공격을 맞춘(막아도 포함) 첫 번째 상대. 이것도 그냥 target으로는 거의 쓰지않고 밑처럼
ID를 줘서 씁니다. 상대의 movetype 이 H일경우에만 되며 상대 movetype이 H가 아닐
경우 타겟에서 벗어납니다.
원문: Redirects the trigger to the first target found.
첫 번째 상대라곤 하지만 2명이상이 같이 맞았을땐 아무 타겟이나 찍는군요.
*) target(ID)
공격판정을 낼 때 ID를 정해줄수 있는데 이걸 이용해 해당 공격에 맞은 타겟을 검사합니
다. target(200), 라고 쓰면 ID 200 인 공격에 맞은 타겟을 뜻합니다.
*) partner
2대2 대전 등을 할 때 같은편 파트너를 뜻합니다. 노멀 헬퍼와 뉴트럴 플레이어는 파트너
에 속하지 않는다고 하는데 하여튼 헬퍼를 제외한 같은편은 파트너로 간주됩니다.
*) enemy
첫 번째 적. 역시 노멀헬퍼와 뉴트럴플레이어는 간주되지 않는다는군요.
*) enemy(n)
괄호안의 숫자는 몇번째 적이냐 하는걸 뜻한다는데 써보지 않아서 정확한 건 모르겠군요.
첫 번째가 2p이고 두 번째가 4p쯤 되지 않을까 싶군요.
*) enemyNear
가장 가까이 있는 적
*) enemyNear(n)
n번째 가까이 있는 적. 0이 가장 가까이 있는적이고 1이 두 번째 가까이 있는 적인듯.
*) playerID(ID)
해당 아이디를 지닌 플레이어. ID를 보려면 displayclipboard 나 appendtoclipboard를 써
서 id를 봐야하는데 이 아이디가 1:1 할 때와 1:2 랑 2:2 할 때 각각 다르므로 대체 어디다
쓰는건지 모르겠습니다.
이들중 2가지이상 중복하여 쓰면 에러납니다. 예) root,target,time = ? 처럼 쓰면 에러.
===================================================================
트리거가 잘못될 경우 캐릭선택시 튕기거나 작은 잘못일 경우 디버그모드에서 흰색글씨로
나온다거나 하므로 메시지를 확인하고 해당부분이 왜 에러가 나는지 생각해서 제대로
고칩시다.
작은 잘못은 예를들어 trigger1 = target(10), stateno = 1031 이라고 썼는데 아이디 10인
타겟이 없을 경우 디버그모드에서 타겟이 없다고 흰색 글씨로 계속 뜨게 됩니다. 이럴
경우는
trigger1 = numtarget(10) > 0
trigger1 = target(10), stateno = 1031
이런식으로 고쳐줘야 합니다. numtarget(10) > 0이 항상 위에 있어야 하고 꼭 두줄로 써야
하며 한줄로 쓰면 마찬가지로 흰색글씨 뜹니다. 예를들어
trigger1 = numtarget(10) > 0 && target(10), stateno = 1031
이렇게 한줄로 묶어서 쓰지말고 꼭 위처럼 2줄로 써야 흰색글씨가 뜨지 않습니다.
이런 건 안고쳐도 게임엔 문제없지만 디버그모드사용시 흰색글씨가 계속뜨는게 보기 안좋으
므로 고치는 거랍니다.
선생님 : Ihoo1836트리거
(역시 용어가 애니매이션의 스프라이트를 뜻하는 '프레임'과 게임상의 1/60초를 뜻하는
'프레임'이 헷갈릴수 있어서 전자의 경우 그냥 '스프라이트'라고 했고 '프레임'이라고 한
경우는 1/60초를 뜻하는 경우만 사용했습니다.)
캐릭터의 동작을 만들기 위해선 명령어가 필요합니다. 예를들어 캐릭터를 앞으로 얼만큼 이
동시킨다든지 언제 공격판정을 만든다든지 하는 것 등인데 이 명령을 수행할 때 조건이 트
리거입니다. 원본파일은 docs폴더의 trigger.txt인데 모르는건 원문그대로.
윈무겐에서 달라진점은 윈무겐 docs폴더의 update.txt 파일을 보면 원문이 있습니다.
앞서도 설명했듯이 명령어의 구조가
[State 번호, ?] ;state 뒤의 번호는 암거나 써도 상관없으나 에러메세지가 뜰 때 알아보
;기 쉽게하기 위해 statedef 의 번호(스텟넘버)랑 맞춰주는게 일반적.
type = ? ;명령어
trigger? ;조건
~~~ ;추가 파라미터
이렇게 되는데 트리거에 쓰인 조건을 만족하면 그 명령이 실행된다는 것입니다.
예를 들어
[state 200]
type = posadd
trigger1 = time = 0
x = 10
이렇게 하면 스텟 시작하자마자 x축으로 10만큼 캐릭터를 앞으로 이동시켜라 하는 게
됩니다.
추가적으로 설명하자면 트리거의 값이 1이 될 경우 해당명령을 실행합니다.
조건인 time = 0을 만족할 경우 컴퓨터는 값 '1(true:맞음)'을 돌려주므로 결과적으로 저
문장은 'trigger1 = 1' 이 되서 해당명령이 실행되는 것입니다. 조건을 만족하지 않으면
컴퓨터는 값 '0(false:틀림)'을 돌려줍니다. 'trigger1 = 0'이 되면 해당명령은 실행되지
않습니다.
또한 triggerall 이라는게 있는데 무조건 만족해야 하는 트리거를 뜻합니다.
예를들어
triggerall = statetype = A
trigger1 = command = "a"
trigger2 = command = "b"
라고 하면 캐릭터가 무조건 스텟타입이 A이어야 하며, a나 b버튼을 눌렀을 때 라는 뜻이
됩니다.
트리거 뒤의 숫자는 차례대로 가야 합니다. 예를들어 trigger2 뒤에 trigger4가 써있으면
제대로 검사가 되지 않습니다.
그리고 디버그모드는 MUGEN.CFG에서 ALLOWDEBUGMODE = 1로 설정돼있으면 도스무
겐에선 ctrl + d 키로 되지만 윈무겐은 무겐실행시 winmugen.exe가 아닌 debug.exe로
실행을 해야 됩니다. 디버그 모드에서는 캐릭터의 애니매이션번호와 스텟번호. gametime과
스텟time, animtime, statetype, ctrl 등의 정보를 볼 수 있습니다.
ctrl+c를 누르면 캐릭터의 판정박스와 무적정보 등이 나옵니다.
만약 모르겠는 트리거가 있다면 CNS의 Displaytoclipboard명령과 appendtoclipboard명령을
사용하면 알수 있을것입니다.
그리고 반환되는 값을 말할 때 1이면 True값이고 0이면 False값이니까 설명되어있지 않아
도 이해하시길 바랍니다.
====================================================================
;여긴 원문그대로
This is an alphabetical index of function-type triggers. For details
on use of function-type triggers in expressions, see the expression
documentation. Unless otherwise specified, we will use P1 to represent
the player who is evaluating the trigger, and P2 to represent his
opponent (usually the closest opponent when in team mode).
Some triggers are nonstandard and cannot take expressions as their
arguments. These are marked with a (*) in the index. Some triggers are
deprecated; these are marked with a (**). Use of these triggers is not
encouraged, as support for them may be removed in future versions of
the engine.
Old-style triggers, marked (***), appear only in clauses of the form
(trigger) (relational operator) (value). See section 8 of exp.doc for
more details.
For all triggers, SFalse will be returned if the trigger is redirected
to a nonexistent destination, or if the ID number for the redirection
evaluates to SFalse. This is not listed in the error conditions for
each trigger.
트리거 목록입니다. 대문자로 쓰나 소문자로 쓰나 같습니다.
--------------------------
-Abs
-Acos
-Alive
-Anim
-AnimElem(*,***)
-AnimElemNo
-AnimElemTime
-AnimExist
-AnimTime
-Asin
-Atan
-AuthorName(*,***)
-BackEdgeBodyDist
-BackEdgeDist
-CanRecover
-Ceil
-Command(*,***)
-Const(*)
-Cos
-Ctrl
-DrawGame
-E
-Exp
-Facing
-Floor
-FrontEdgeBodyDist
-FrontEdgeDist
-FVar
-GameTime
-GetHitVar(*)
-HitCount
-HitDefAttr(*,***)
-HitFall
-HitOver
-HitPauseTime
-HitShakeOver
-HitVel
-ID
-IfElse
-InGuardDist(윈무겐전용)
-IsHelper
-IsHomeTeam
-Life
-LifeMax(윈무겐전용)
-Ln
-Log
-Lose
-MatchNo
-MatchOver
-MoveContact
-MoveGuarded
-MoveHit
-MoveReversed(윈무겐전용)
-MoveType(*,***)
-Name(*,***)
-NumEnemy
-NumExplod
-NumHelper
-NumPartner
-NumProj
-NumProjID
-NumTarget
-P1Name(*,***)
-P2BodyDist
-P2Dist
-P2Life
-P2MoveType(*,***)
-P2Name(*,***)
-P2StateNo
-P2StateType(*,***)
-P3Name(*,***)
-P4Name(*,***)
-PalNo
-ParentDist
-Pi
-PlayerIDExist
-PrevStateNo
-Pos
-Power
-PowerMax(윈무겐전용)
-ProjCancelTime
-ProjContact(*,***)
-ProjContactTime
-ProjGuarded(*,***)
-ProjGuardedTime
-ProjHit(*,***)
-ProjHitTime
-Random
-RootDist
-RoundNo
-RoundsExisted
-RoundState
-ScreenPos
-SelfAnimExist
-Sin
-StateNo
-StateType(*,***)
-SysFVar
-SysVar
-Tan
-TeamMode(*,***)
-TeamSide
-TicksPerSecond
-Time
-TimeMod(*,**,***)
-UniqHitCount
-Var
-Vel
-Win
위의 트리거중에 수학 트리거 목록
----------------------
-abs
-acos
-asin
-atan
-ceil
-cos
-e
-exp
-floor
-IfElse
-ln
-log
-pi
-sin
-tan
------------------------------------------------------------
Abs
------------------------------------------------------------
절대값을 구하는 트리거입니다.
형식
abs(절대값을 구할 값)
괄호안의 수가 정수라면 정수를, 실수라면 실수를 돌려줍니다.
-2의 절대값은 2이고 뭐 이런거 수학에서 나오는데 그거 같습니다만 써본적이 없습니다.
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
------------------------------------------------------------
Acos
------------------------------------------------------------
Computes the arccosine (in radians) of the specified argument.
무슨 삼각함수 라디안에 관련된 코사인 같은데 써본적도 없고 모르겠군요.
Format:
acos(exprn)
Arguments:
exprn
Expression to compute the arccosine of (float).
Return type:
float(실수. 영어원문에서 int는 정수, float은 실수를 뜻합니다)
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn is not in
the domain of arccosine (which is [-1.0,1.0]).
Example:
value = acos(1)
Sets value to the arccosine of 1, which is approximately 0.0
(possibly with some rounding error.)
------------------------------------------------------------
Alive
------------------------------------------------------------
플레이어가 살아있다면 1(true)값을 돌려주고 ko된 상황(체력이 0일때)이면 0을 돌려줍니다.
예)
trigger1 = alive = 0
플레이어가 ko됐을 때
------------------------------------------------------------
Anim
------------------------------------------------------------
플레이어의 애니매이션 번호를 검사합니다.
예)
trigger1 = Anim = 200
액션번호가 200 일때
------------------------------------------------------------
AnimElem(*,***)
------------------------------------------------------------
애니매이션의 몇번째 스프라이트인가를 검사합니다.
예를들어 air파일에서 다음과 같은 액션200이 있다고 칩시다.
[begin action 200]
0,0,0,0,4 - 첫 번째 스프라이트
0,1,0,0,5 - 두 번째 스프라이트
0,2,0,0,6 - 세 번째 스프라이트
이 됩니다.
형식
1. AnimElem = value1
2. AnimElem = value1, [oper] value2
[oper]에 들어가는 부호
=, !=, <, >, <=, >=
value1 (정수)
몇번째 스프라이트인가
value2 (정수)
그 스프라이트에서 몇프레임 째인가
예)
trigger1 = AnimElem = 2
애니매이션의 2번째 스프라이트 시작 직후를 뜻합니다. 그러니까 위의 액션200에서
스프라이트 0,1이 나올 때를 뜻합니다. 다음과 같이 써도 같은 뜻이 됩니다.
trigger1 = AnimElem = 2, = 0 (2번째 스프라이트의 1번째 프레임)
(정확히 말하자면 1번째 스프라이트가 끝나고 2번째 스프라이트로 넘어가는 순간!을 뜻
합니다.)
trigger1 = AnimElem = 2, = 4
2번째 스프라이트 시작 후 4프레임 지났을 때를 뜻합니다. 그러니까 위의 액션200에서
는 스프라이트 0,1이 끝나기 직전이 되겠네요.
(역시 정확히 말하자면 4프레임 지나고 5프레임으로 넘어가는 순간!을 뜻합니다.)
trigger1 = AnimElem = 2, >= 0
trigger1 = AnimElem = 3, < 0
2번째 스프라이트 시작 직후부터 3번째 스프라이트가 나오기 전까지입니다.
만약 3번째 스프라이트가 없다면 2번째 줄은 다음과 같은뜻이 됩니다.
trigger1 = AnimTime <= 0
* 캐릭터가 스텟에 오자마자(animelem=1에) 적의 공격을 막는(가드스텟으로 가는) 경우가
있는데 이경우엔 만약 스텟시작하자마자 poweradd=-1000같은(필살기같은데 쓰이는)게
있을 경우 기만 날리고 기술은 안나가는 경우가 생길수 있습니다. 따라서 이런 상황을 막기
위해서 이런건 trigger1 = animelem = 1,1 이나 trigger1 = time = 1 이런식으로 씁시다.
------------------------------------------------------------
AnimElemNo
------------------------------------------------------------
애니매이션의 스프라이트의 프레임의 범위를 검사?. 설명이 어렵네요. 예를 봅시다.
Returns the number of the animation element in the current action
that would be displayed at the specified time. The argument to AnimElemNo
represents the time to check, expressed in game ticks, relative to the present.
(영어원문에서 tick 이라고 함은 게임진행시간(프레임)을 말하는 것으로 1tick은 1/60초
= 1프레임 입니다)
Format:
AnimElemTime(exprn)
Arguments:
exprn
Expression that evaluates to the time offset (int).
Return type:
int
Error conditions:
Returns SFalse if you try to check a time that would fall before the
start of the current action.
Notes:
If the action is currently within its looping portion, then it is
assumed to have been looping forever. That is, no matter how far into
the past you check, AnimElemNo will always return an element number
that lies within the looping portion of the action.
Examples:
trigger1 = AnimElemNo(0) = 2
True when the animation element to be displayed 0 ticks in the
future (i.e., now) is element 2. This is equivalent to:
이건 다음과 같습니다.
trigger1 = AnimElem = 2, >= 0
trigger1 = AnimElem = 3, < 0
trigger1 = AnimElemNo(2) = 4
True when the animation element that will be displayed two ticks
from now is element 4. This is equivalent to:
이건 다음과 같습니다.
trigger1 = AnimElem = 4, >= -2
trigger1 = AnimElem = 5, < -2
이 animelemno(?)는 잘 쓰이진 않지만 애니매이션을 정시시킬 때 쓸수도 있습니다.
예를들어
[state 500]
type = changeanim
trigger1 = 1
value = anim
elem = animelemno(-1)
이렇게 쓰면 현재 스프라이트가 유지되는데 제캐릭터 쿠로키시의 얼음빔에 맞은 스텟이나
진념 연옥영파 모으는중 히트시 구체를 정지시킬 때, 드레이븐 아이스스톰 맞았을 때 등에
쓰였습니다. 11-cns명령어 파일의 changeanim부분 참조.
------------------------------------------------------------
AnimElemTime
------------------------------------------------------------
안써봤습니다.
Gets the animation-time elapsed since the start of a specified element
of the current animation action. Useful for synchronizing events to
elements of an animation action.
(reminder: first element of an action is element 1, not 0)
Format:
AnimElemTime(exprn)
Arguments:
exprn
Expression that evaluates to the element number to check (int).
Return type:
int
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn evaluates
to an element number that is not valid for the current action.
Examples:
trigger1 = AnimElemTime(2) = 0
True on the first game-tick that the player's animation
is on element 2. Is equivalent to saying:
이건 다음과 같습니다.
trigger1 = AnimElem = 2
trigger1 = AnimElemTime(2) = 4
True 4 game-ticks after the start of the player's
second animation element.
정확히는 모르겠지만 이건 animelem = 2, =4 와 같은것같군요.
trigger1 = AnimElemTime(2) >= 0
trigger1 = AnimElemTime(3) < 0
이건
animelem = 2, >= 0
animelem = 3, <0 과 같은 것 같습니다.
True for the whole of the second element of the player's
animation, assuming there is a third element. If a
third element does not exist, the second line will evaluate
to SFalse and hence trigger1 will never trigger. In this case,
the second line should read,
trigger1 = AnimTime <= 0
------------------------------------------------------------
AnimExist
------------------------------------------------------------
애니매이션 번호가 존재하는지를 검사하는것인데 상대방에 맞아서 상대 스텟으로 간
경우 오작동할수도 있으므로 거의 쓰이지 않고 대신 selfanimexist가 쓰입니다.
예)
trigger1 = !AnimExist(200)
애니매이션 200번이 존재하지 않을때
------------------------------------------------------------
AnimTime
------------------------------------------------------------
애니매이션이 끝날때의 animtime 은 0이 되고 그이전엔 -값에서 계속 0을 향해 1씩
더해집니다.
예를들어 전체 지속시간이 7프레임인 애니매이션이 있다고 하면 그 애니매이션 시작직후
animtime 값은 -7 이며 7프레임째의 값은 -1 그리고 끝날때는 0이 됩니다.
AIR파일에서 loopstart가 쓰여있다고 해도 마지막 스프라이트의 지속시간이 끝나면
animtime값은 0이 됩니다.
예)
trigger1 = AnimTime = 0
애니매이션이 끝났을 때.
이건 대부분의 스텟 마지막 부분에 changestate명령과 함께 쓰입니다.
------------------------------------------------------------
Asin
------------------------------------------------------------
이것도 삼각함수 같은데 모르겠군요.
Computes the arcsine (in radians) of the specified argument.
Format:
asin(exprn)
Arguments:
exprn
Expression to compute the arcsine of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn is not in
the domain of arcsine (which is [-1.0,1.0]).
Example:
value = asin(1)
Sets value to the arcsine of 1, which is approximately pi/2
(possibly with some rounding error.)
------------------------------------------------------------
Atan
------------------------------------------------------------
역시 삼각함수
Computes the arctangent (in radians) of the specified argument.
Format:
atan(exprn)
Arguments:
exprn
Expression to compute the arctangent of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = atan(1)
Sets value to the arccosine of 1, which is approximately pi/4
(possibly with some rounding error.)
------------------------------------------------------------
AuthorName(*,***)
------------------------------------------------------------
제작자의 이름을 검사합니다.
해당 캐릭터의 def파일내에 있는 authorname을 검사하는 것입니다.
예)
trigger1 = Authorname = "sanderx"
def파일에 쓰여있는 authorname이 sanderx 일 경우
------------------------------------------------------------
BackEdgeBodyDist
------------------------------------------------------------
캐릭터의 back.width부터 캐릭터뒤쪽의 화면구석까지의 거리를 구합니다.
그런데 backedgedist와 값의 차이를 모르겠군요.
결과값은 실수입니다만 중요하지 않습니다.
예)
trigger1 = BackEdgeBodyDist < 30
캐릭터의 뒤 너비부터 캐릭터 뒤쪽 스크린 가장자리 까지의 거리가 30픽셀(도트)
미만일 경우
------------------------------------------------------------
BackEdgeDist
------------------------------------------------------------
캐릭터의 x축 중심부터 뒤쪽 화면 가장자리까지의 거리를 구합니다.
역시 backedgebodydist 와 값이 똑같이 나오는군요
결과값은 실수입니다만 역시 중요치 않습니다.
예)
trigger1 = BackEdgeDist < 30
캐릭터의 x축 중심부터 뒤쪽 화면 가장자리까지의 거리가 30픽셀 미만일 경우
------------------------------------------------------------
CanRecover
------------------------------------------------------------
캐릭터가 맞아서 날아가는 중일 때 낙법을 할수 있으면 1을 반환하고 그렇지 않으면
0을 반환합니다. 낙법이 가능한지 불가능한지는 cns의 hitdef의 명령어에 따라 정해집니다.
예) trigger1 = canrecover
------------------------------------------------------------
Ceil
------------------------------------------------------------
수를 올림한 값을 구합니다. 음수일 경우 그 수보다 크거나 같은 정수를 구합니다.
형식
ceil(수)
예)
ceil(5.5)의 값은 6
ceil(5.1)의 값도 6
ceil(-2.6)의 값은 -2
------------------------------------------------------------
Command (*,***)
------------------------------------------------------------
커맨드 입력 감지
예)
trigger1 = Command = "fireball"
fireball 커맨드를 입력했을 때
trigger1 = command != "holdback"
뒤 키를 누르고 있지 않을 때
도스무겐에선 입력된 커맨드 지속시간이 1프레임 이었지만, 윈무겐에서는 cmd파일에
추가된 부분인 [defaults]부분의 command.buffer.time 만큼 지속됩니다. 기술 발동할 때
커맨드를 입력하면 CMD에서 커맨드를 감지해서 스텟을 이동시키는데, 도스무겐에선
이동한 스텟의 time = 0 까지만 커맨드를 입력한걸로 감지하지만, 윈무겐에선 저
값대로(기본값1인 경우 time = 1까지) 감지합니다.
command.buffer.time 값이 1(기본값)이라고 쳤을때
type = varset
trigger1 = time > 0
trigger1 = command = "xx"
이런 부분은 같은커맨드로 연결하는 기술(이오리 규화(밑,뒤+손)같은)에 쓰였었는데
윈무겐을 위해 time > 0 부분을 time > 1 로 고쳐야 합니다.
예를들자면 제 이오리 [statedef 520]에서 다음과 같은 부분이 있습니다.
[State 325,8]
type = Varset
triggerall = time > 1
triggerall = time < 35
triggerall = var(55) = 0
trigger1 = command = "3p1_z"
trigger2 = command = "3p1_x"
persistent = 0
var(5) = 1
이곳의 time > 1을 time > 0으로 고친후 강규화를 실험해보면, 도스무겐에선 문제가
없지만 윈무겐에선 강규화1타가 맞을 경우 2타가 저절로 나가는 현상이 나타납니다.
------------------------------------------------------------
Const (*)
------------------------------------------------------------
캐릭터의 cns파일 처음 부분에 있는 여러 가지 값들을 검사하는 것입니다.
형식
Const(파라미터 이름)
CNS파일 처음부분의 [Data]부분의 값을 검사할 때. (해당 값들을 검사합니다. 굳이 해석할
필요는 없겠죠?)
data.life: Returns value of the "life" parameter. (int)
data.attack: Returns value of the "attack" parameter. (int)
data.defence: Returns value of the "defence" parameter. (int)
data.fall.defence_mul: Returns value of the defence multiplier,
calculated as 100/(f+100), where f is the "fall.defence_up"
parameter. (float)
data.liedown.time: Returns value of the "liedown.time" parameter.
(int)
data.airjuggle: Returns value of the "airjuggle" parameter. (int)
data.sparkno: Returns value of the "sparkno" parameter. (int)
data.guard.sparkno: Returns value of the "guard.sparkno" parameter.
(int)
data.KO.echo: Returns value of the "ko.echo" parameter. (int)
data.IntPersistIndex: Returns value of the "IntPersistIndex"
parameter. (int)
data.FloatPersistIndex: Returns value of the "FloatPersistIndex"
parameter. (int)
CNS의 [Size]부분 값들을 검사할때
size.xscale: Returns value of the "xscale" parameter. (float)
size.yscale: Returns value of the "yscale" parameter. (float)
size.ground.back: Returns value of the "ground.back" parameter.
(int)
size.ground.front: Returns value of the "ground.front" parameter.
(int)
size.air.back: Returns value of the "air.back" parameter. (int)
size.air.front: Returns value of the "air.front" parameter. (int)
size.height: Returns value of the "height" parameter. (int)
size.attack.dist: Returns value of the "attack.dist" parameter.
(int)
size.proj.attack.dist: Returns value of the "proj.attack.dist"
parameter. (int)
size.proj.doscale: Returns value of the "proj.doscale" parameter.
(int)
size.head.pos.x: Returns x-component of the "head.pos" parameter.
(int)
size.head.pos.y: Returns y-component of the "head.pos" parameter.
(int)
size.mid.pos.x: Returns x-component of the "mid.pos" parameter.
(int)
size.mid.pos.y: Returns y-component of the "mid.pos" parameter.
(int)
size.shadowoffset: Returns value of the "shadowoffset" parameter.
(int)
size.draw.offset.x: Returns x-component of the "draw.offset"
parameter. (int)
size.draw.offset.y: Returns y-component of the "draw.offset"
parameter. (int)
CNS의 [Velocity]부분의 값을 검사할 때. 주로 스텟 20(걷기)이나 100(달리기)에서 이
파라미터들을 쓰게 되죠
velocity.walk.fwd.x: Returns value of the "walk.fwd" parameter.
(float)
velocity.walk.back.x: Returns value of the "walk.back" parameter.
(float)
velocity.run.fwd.x: Returns x-component of the "run.fwd" parameter.
(float)
velocity.run.fwd.y: Returns y-component of the "run.fwd" parameter.
(float)
velocity.run.back.x: Returns x-component of the "run.back"
parameter.
(float)
velocity.run.back.y: Returns y-component of the "run.back"
parameter.
(float)
velocity.jump.y: Returns y-component of the "jump.neu" parameter.
Note: this is NOT "velocity.jump.neu.y". Only the "neu"
parameters take a y-component value. (float)
velocity.jump.neu.x: Returns x-component of the "jump.neu"
parameter.
(float)
velocity.jump.back.x: Returns value of the "jump.back" paramamter.
(float)
velocity.jump.fwd.x: Returns value of the "jump.fwd" parameter.
(float)
velocity.runjump.back.x: Returns value of the "runjump.back"
paramamter. (float)
velocity.runjump.fwd.x: Returns value of the "runjump.fwd"
parameter.
(float)
velocity.airjump.y: Returns y-component of the "airjump.neu"
parameter. Note: this is NOT "velocity.airjump.neu.y".
(float)
velocity.airjump.neu.x: Returns x-component of the "airjump.neu"
parameter. (float)
velocity.airjump.back.x: Returns value of the "airjump.back"
paramamter. (float)
velocity.airjump.fwd.x: Returns value of the "airjump.fwd"
parameter.
(float)
역시 [Movement]부분의 값들을 검사할때
movement.airjump.num: Returns value of the "airjump.num" parameter.
(int)
movement.airjump.height: Returns value of the "airjump.height"
parameter. (int)
movement.yaccel: Returns value of the "yaccel" parameter. (float)
movement.stand.friction: Returns value of the "stand.friction"
parameter. (float)
movement.crouch.friction: Returns value of the "crouch.friction"
parameter. (float)
예)
trigger1 = Const(velocity.walk.fwd.x) > 4
CNS파일의 [velocity]부분에 있는 walk.fwd 의 값이 4보다 클 경우
------------------------------------------------------------
Cos
------------------------------------------------------------
삼각함수의 코사인 값을 구합니다. 괄호안에 각도를 쓰는 듯. 예를들어 cos(0) = 1입니다.
실수를 쓸수도 있는데 그것에 대해선 모르겠군요.
Computes the cosine of the specified argument (in radians.)
Format:
cos(exprn)
Arguments:
exprn
Expression to compute the cosine of. (float)
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = cos(0)
Sets value to the cosine of 0, which is approximately 1.0
(possibly with some rounding error.)
------------------------------------------------------------
Ctrl
------------------------------------------------------------
캐릭터 조종이 가능할 경우(?)1을 돌려주고 그렇지 않으면 0을 돌려줍니다.
ctrl값이 0인지 1인지는 각 스텟의 처음 부분의 ctrl =? 등에 따라 결정됩니다.
예)
trigger1 = Ctrl
캐릭터가 컨트롤가능할 경우
------------------------------------------------------------
DrawGame
------------------------------------------------------------
그 라운드를 비길 경우 1이 되고 아니면 0이 됩니다.
예)
trigger1 = DrawGame
라운드가 비긴 상태로 끝날 경우
------------------------------------------------------------
E
------------------------------------------------------------
e값(2.718281828..)이라는데 대학교 고급수학이나 물리에서 나오나? 저는 모르겠습니다.
Returns the value of e (2.718281828...)
Format:
e
Arguments:
none
Return type:
float
Error conditions:
none
------------------------------------------------------------
Exp
------------------------------------------------------------
수학 연산자인데 몰라요.
Computes the exponential of the argument (e raised to the power of
the argument.) This produces slightly more accurate results than the
equivalent expression e**(argument).
Format:
exp(exprn)
Arguments:
exprn
Expression to compute the exponential of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = exp(4-var(0))
Sets value to e raised to the quantity 4-var(0).
------------------------------------------------------------
Facing
------------------------------------------------------------
캐릭터가 오른쪽을 향아고 있으면 1을, 왼쪽을 향하고있으면 -1 값을 줍니다.
예)
Trigger = Facing = -1
캐릭터가 왼쪽을 보고 있을 때
------------------------------------------------------------
Floor
------------------------------------------------------------
버림한 값을 구합니다. ceil과 반대. 음수일 경우 그 수보다 작거나 같은 정수를 구합니다.
예)
floor(5.5)의 값은 5
floor(-2.1)의 값은 -3
------------------------------------------------------------
FrontEdgeBodyDist
------------------------------------------------------------
캐릭터의 앞쪽 너비에서부터 앞쪽 스크린 구석까지의 거리를 구합니다.
역시 밑의 frontedgedist와 갚이 같게 나오는데 어떨 때 다르게 나오는지 모르겠습니다.
예)
trigger1 = FrontEdgeBodyDist < 30
플레이어의 앞쪽 너비부터 앞쪽 스크린 끝까지의 거리가 30픽셀(도트) 미만일 경우
------------------------------------------------------------
FrontEdgeDist
------------------------------------------------------------
플레이어의 x축을 기준으로 앞쪽 스크린구석까지의 거리를 구합니다.
frontedgebodydist와 값이 같게 나오는데 어떨 때 다른지 모르겠습니다.
예)
trigger1 = FrontEdgeDist < 30
플레이어 x축과 앞쪽 스크린 가장자리까지의 거리가 30픽셀 미만일 경우
------------------------------------------------------------
FVar
------------------------------------------------------------
실수변수인 fvar의 값을 검사합니다. fvar(0)부터 fvar(39)까지 있습니다.
값을 정하는 것은 cns명령어인 varset, varadd 로 합니다.
예)
trigger1 = FVar(5) = -1.23
fvar(5)의 값이 -1.23 일 경우
------------------------------------------------------------
GameTime
------------------------------------------------------------
라운드가 시작되면 Gametime은 계속 흘러갑니다. cns명령어인 pause 등으로 게임
화면이 멈춰도 상관없이 1초에 60씩 계속 올라갑니다.
gametime은 주로 일정시간마다 실행할 명령의 조건에 사용됩니다.
예)
trigger1 = (GameTime%27)=0
gametime을27로 나눈 나머지가 0인 경우. 즉, 27프레임마다를 뜻합니다.
------------------------------------------------------------
GetHitVar(*)
------------------------------------------------------------
맞은 공격의 속성(값)들을 검사합니다. cns의 공격판정을 내는 명령인 hitdef의 속성에 따라
값들이 결정되는데, 주로 공격을 한 상대방의 hitdef에서 검사합니다.
Gethitvar는 movetype = H 일 경우에만 지속되며 I일 경우 사라집니다. A일경우엔 일부만
사라지는 듯.
형식
GetHitVar(파라미터이름)
파라미터 종류
xveladd, yveladd, type, animtype, airtype, groundtype, damage,
hitcount, fallcount, hitshaketime, hittime, slidetime, ctrltime,
recovertime, xoff, yoff, zoff, xvel, yvel, yaccel, hitid,
chainid, guarded, fall, fall.damage, fall.xvel, fall.yvel,
fall.recover, fall.time, fall.recovertime, isbound(윈무겐전용).
자세히
xveladd: Returns the additional x-velocity that is added to the
player's own when he is KOed. (float)
KO됐을 때 x속도 더하는 값? 써본적이 없네요. 아마 캐릭터가 KO될때 x,y속도
가 일정값만큼 더해져서 날아가게 되는데 그걸 말하는듯.
yveladd: Returns the additional y-velocity that is added to the
player's own when he is KOed. (float)
type: hitdef의 type. 지상에서 맞으면 ground.type 의 값, 공중이면 air.type의 값입
니다. 0 - none, 1 - high, 2 - low, 3 - trip(3값은 지상에서만 받음)
animtype: hitdef의 animtype에 따라 해당 값을 돌려줍니다. 0 - light, 1 - medium, 2
- hard, 3 - back, 4 - up, 5 - diagup
airtype: hitdef의 air.type값. 돌려주는 값은 위의 type과 같습니다.
groundtype: 마찬가지로 hitdef의 ground.type 값
damage: damage 값
hitcount: 맞은 횟수입니다. 예를들어 2히트콤보를 맞으면 2 뭐 이런식입니다.
fallcount: 콤보맞아서 다운된 횟수
hitshaketime: 경직시간. hitdef의 pausetime 의 영향을 받는데 예를들어 pausetime이 10
인 공격에 맞을 경우 hitshaketime 은 10에서 1씩 줄기 시작해서 10프레임
후엔 0이 됩니다.
hittime: Hitdef의 hittime. 맞아서 회복되는데 걸리는 전체 시간
slidetime: Hitdef의 slidetime. 맞았을 때 밀림이 멈추는데까지 걸리는 시간
ctrltime: 공격을 가드(막다)한 후 컨트롤가능하게 되기까지 시간
recovertime: 넘어졌을 때 일어나기 전까지 시간. 이 값은 0을 향해 점점 줄기 시작하는
데 방향키를 흔들거나 버튼을 연타하면 더 빨리 줄어듭니다.
xoff: "Snap" x offset when hit (deprecated) hitdef의 snap의 x위치?
yoff: "Snap" y offset when hit (deprecated) hitdef의 snap의 y위치?
zoff: "Snap" z offset when hit (deprecated) hitdef의 snap의 z위치? z위치가 뭘뜻하는
지 모르겠군요.
xvel: 맞아서 x방향 밀려나는 속도. hitdef의 velocity들에 있음 (당연히 정수가 아닌 실수)
yvel: 맞아서 y방향으로 뜨는 속도 (역시 실수)
yaccel: Hitdef 의 yaccel값. 맞고 넘어질 때 y 축 가속도 (실수)
chainid: Player-assigned chainID for last hit taken. (int)
마지막 맞은 공격의 chaninID 값인듯 (정수)
guarded: 마지막 받은 공격을 가드했을 경우 1을 돌려주며 아니면 0을 돌려줍니다.
isbound: 플레이어가 상대의 TargetBind 명령의 영향을 받고있으면 1값을
돌려줍니다. 던져지는 스텟에서 버그방지하는데 유용하다는군요(2vs2대전시
p2stateno가 있는 hidef공격이 맞자마자 또다른 상대에게 맞을 경우 발생하는
걸 말하는 듯. 맞은쪽만 스텟이동되는 것). (윈무겐 전용입니다)
fall: 다운되면 1(TRUE), 아니면 0(FALSE)값을 돌려줍니다.
fall.damage: Damage taken upon fall (int) 넘어진 상태에서 받은 대미지인 듯 (정수)
fall.xvel: 바운드(튕김)될 때 x속도. Hitdef의 fall.xvelocity 값 (실수)
fall.yvel: 바운드(튕김)될 때 y속도. Hitdef의 fall.yvelocity 값 (실수)
fall.recover: 낙법이 가능하면 True(1)값을 주며 그렇지 않으면 false(0)값을 줍니다.
fall.recovertime: 낙법이 가능하게 되기까지의 시간.
fall.kill: 넘어진 상태에서 맞았을 때 ko될수 있는가. 역시 hitdef의 fall.kill값
fall.envshake.time: hitdef의 fall.envshake.time 값. 맞고 넘어질 때 지면이 흔들리는
시간(정수)
fall.envshake.freq: hitdef의 fall.envshake.freq 값. 지면 흔들리는 주기(실수)
fall.envshake.ampl: hitdef의 fall.envshake.ampl 값. 지면 흔들리는 너비(정수)
fall.envshake.phase: Returns values set by the fall.envshake.*
parameters in an attacker's hitdef. (실수)
예)
trigger1 = GetHitVar(yvel) < -5.5
맞고 뜰 때 y속도가 -5.5 미만일 때
------------------------------------------------------------
HitCount
------------------------------------------------------------
한 스텟에서 공격을 맞춘 횟수입니다. 다른 스텟으로 넘어가면 0이 됩니다.
Uniqhitcount 랑 다른점은, 같은 공격(hitdef)을 2명의 상대에게 맞췄을 때 hitcount는 1만
증가하지만 Uniqhitcount는 2가 증가합니다.
예)
trigger1 = HitCount > 8
공격스텟이 시작되고 나서 그 스텟 내에서 한 상대에게 공격을 맞춘 횟수가 8회
초과일때
------------------------------------------------------------
HitDefAttr(*,***)
------------------------------------------------------------
활성화되어있는 hitdef의 attr 값. 써본적은 없군요.
형식
HitDefAttr [oper] value1, value2
[oper] 에는 =, != 중에 하나가 들어갈수 있다.
value1
A string that has at least one of the letters "S", "C"
and "A" for standing, crouching and aerial attacks
respectively. For example, "SA" is for standing and
aerial attacks.
S, C, A중 하나이상이 들어가는데 각각 서서공격, 앉아공격, 공중공격이며 hitdef의
attr 값에서 따옵니다. SA처럼 2가지를 쓰면 서서공격이나 앉아공격 이런식으로 되는듯
value2
A set of 2-character strings, separated by commas.
Each 2-character string must be of the form described:
The first character is either "N" for "normal", "S" for
"special", or "H" for "hyper". The second character must
be either "A" for "attack" (a normal hit attack) or "T"
for "throw". For example, "NA, ST" is for normal attacks
and special throws.
2개의 문자가 조합되는데 첫 번째 문자는 N(노멀), S(스페셜:기술), H(하이퍼:필살기)
이며 두 번째 문자는 A(공격), T(잡기)입니다. 역시 hitdef의 attr값을 검사합니다.
form:
arg1, arg2
then the trigger condition is determined to be true only
if arg1 is a subset of value1, AND arg2 is a subset of
value2.
예를들어 S, NA 라고 쓰면 서서 노멀공격일 경우 인 듯 합니다.
예)
trigger1 = A, HA
(원문은 이렇지만 틀린 것 같네요. trigger1 = hitdefattr = A, HA 이어야겠죠?)
공중 필살기 일 때
trigger1 = SC, NA, SA
(역시 틀린 것 같네요. trigger1 = hitdefattr = SC, NA, SA 이겠죠)
서서나 앉아서 공격이어야 하고 노멀공격이거나 스페셜공격(기술)일 때
------------------------------------------------------------
HitFall
------------------------------------------------------------
맞는 스텟에 있을 때 다운이 되는 상태라면 1값을 반환하고 그렇지 않으면 0값을 줍니
다. 예를들어 Hitdef의 fall 값이 1인 경우 그공격에 맞으면 Hitfall 값은 1이 됩니다.
예)
trigger1 = !HitFall
다운이 안될때(또는 다운되는 스텟으로 가게 하지 않을때)
------------------------------------------------------------
HitOver
------------------------------------------------------------
hitdef의 hittime 이 다되면 1값을 돌려줍니다. gethitvar(hittime)값이 0을 향해 계
속 줄어드는데 이 값이 0이 될 경우 1값을 돌려주는 듯.
주로 common1.cns 의 맞는 스텟들에 쓰였습니다
예)
trigger1 = HitOver = 1
hittime 이 만료될 경우. 뒤의 = 1 은 생략해도 됩니다. 반대로 쓰고싶으면
!hitover 로 씁니다.
------------------------------------------------------------
HitPauseTime
------------------------------------------------------------
공격을 맞췄을 때 hitdef의 pausetime 값으로 정해지고 그후로 값이 1/60 초당 1씩 줄어들
어 0으로 향합니다.
If ignorehitpause is not set, this will always return 0.
ignorehitpause 가 정해지면 줄지 않을수도 있다는데 아마 ignorehitpause = 0 으로 설정이
되면 hitpausetime 값이 줄지 않는다는 뜻인 듯한데 ignorehitpause=0을 쓸 이유가 없죠.
이 Hitpausetime은 히트경직중에 값이 변하기 때문에 ignorehitpause = 1을 붙여서 쓰는게
일반적입니다. ignorehitpause 는 11-CNS명령 파일의 처음부분에 설명되어있습니다.
예)
trigger1 = HitPauseTime = 0
공격의 경직이 끝났을 때.
또한 이 Hitpausetime 은 공격을 맞춘 직후 상대의 머리에서 피가 나게 한다거나 하는 효
과를 줄 때 등에 쓸수 있습니다.
예를들어 pausetime 이 15인 공격일 경우 trigger1 = Hitpausetime = 14 로 하면 공격을
맞춘 직후 라는 뜻이 되는데 ignorehitpause = 1과 같이 써야 합니다. 제캐릭터 진념의
강발 등에 쓰였습니다.
------------------------------------------------------------
HitShakeOver
------------------------------------------------------------
공격당했을때 경직이 끝나면 1을 반환, 안그러면 0을 반환합니다.
Hitdef의 pausetime의 경직을 말합니다. common1.cns의 맞는 스텟들에 쓰였습니다.
Example:
trigger1 = HitShakeOver = 0
맞아서 경직된 상태일 때
------------------------------------------------------------
HitVel
------------------------------------------------------------
공격에 맞았을 때 밀려나는 속도
hitvel x 는 x속도, hitvel y 는 y속도입니다.
원문에서는 각 값이 +인게 뒤로 밀려나거나 뜨는 거라고 나와있지만 틀렸군요.
다른것과 마찬가지로 두 속도가 -이면 뒤로 밀려나거나 위로 뜨는 겁니다.
이 값은 맞은 공격의 Hitdef에 설정된 값을 그대로 가져오게 되며 다음 Hitdef에 맞기
전까진 값이 유지됩니다.
예를들어 지상에서 ground.velocity = -13 인 Hitdef에 맞으면 Hitvel x = -13이 됩니다.
예)
trigger1 = HitVel X < -10
밀려나는 x속도가 -10 보다 작을때
------------------------------------------------------------
ID
------------------------------------------------------------
플레이어들의 ID값이며 각 플레이어는 고유의 ID값을 가집니다. 근데 1:1대전과 2:2대전
시의 값이 틀리고 어디다 쓰라는건지 모르겠습니다.
예)
value = ID
값을 ID값으로 해라
------------------------------------------------------------
IfElse
------------------------------------------------------------
조건을 검사해서 만족할때와 그렇지 않을 때 각각 다른 값을 줍니다. 쓸모가 많습니다.
형식
IfElse(조건, 조건만족시의값, 조건불만족시의값)
예)
value = ifelse(var(3),1,2)
var(3)의 값이 0이 아니면 값을 1로 정하고 그렇지않으면 2로 정해라.
주의할점은 조건을 쓸 때 enemynear, 같이 ','(콤마)가 들어가는 조건을 쓸 경우 괄호를
하나 더 쳐서 쓰지 않으면 에러나서 튕깁니다.
예를들어 ifelse(enemynear,statetype=C,-30,-50) 이렇게 쓰면 에러가 나므로
ifelse((enemynear,statetype)=C,-30,-50) 이렇게 써야 에러가 안납니다.
------------------------------------------------------------
InGuardDist(윈무겐 전용입니다 웬만하면 쓰지 맙시다)
------------------------------------------------------------
Returns 1 if the player is within guarding distance of an opponent's physical or
projectile attack. The guarding distance is the value of the guard.dist parameter of
the opponent's HitDef. Returns 0 if out of guard distance, or the opponent is not
attacking.
guard.dist안에 있을 경우 1값을 반환하며 그렇지않으면 0값을 반환합니다. guard.dist값은
Hitdef의 것을따른다고 하는데 Cns처음부분의 attack.dist에도 영향을 받는 듯
윈무겐의 common1.cns 의 가드하는 스텟들에 쓰였군요
------------------------------------------------------------
IsHelper
------------------------------------------------------------
헬퍼인지 아닌지 검사합니다. 괄호안에 아이디를 쓸수도 있습니다.
CNS에서 나오지만, 헬퍼의 아이디는 헬퍼를 생성할 때 정해줄수 있습니다.
예)
1. trigger1 = !IsHelper
헬퍼가 아닐 경우
2. trigger1 = IsHelper(1234)
ID 가 1234인 헬퍼일 경우
------------------------------------------------------------
IsHomeTeam
------------------------------------------------------------
홈팀일 경우 1, 안그러면 0값을 줍니다.
아케이드모드에서는 CPU가 홈팀이 됩니다만 버서스 모드에서는 1P쪽의 캐릭터들이 홈팀이
됩니다. AI를 만들 때 필요한 것 같지만 버서스모드에선 1P가 홈팀이 돼버리는 문제 때문에
대체 어디다 쓰라고 있는 트리거인지 모르겠군요.
예)
trigger1 = ishometeam
음...너무 간단해서 원문에도 사용예는 나와있지 않군요. 앞으로 이런건 설명안해도 되겠죠?
------------------------------------------------------------
Life
------------------------------------------------------------
플레이어의 현재 체력
예)
trigger1 = life <= 10
체력이 10 이하일 때
------------------------------------------------------------
LifeMax(윈무겐전용. 역시 안쓰길 권장)
------------------------------------------------------------
플레이어의 cns의 life =? 값입니다. 체력 최대치를 뜻합니다.
------------------------------------------------------------
Log
------------------------------------------------------------
로그값을 구하는 삼각함수입니다. 수학책을 보시는게 나을 듯.
예를들면 log(2,64) 는 64의 2에대한 로그값?을 구하는것인데, 2를 몇면 제곱해야 64가
나오느냐 하는것이므로 값은 6.0이 됩니다.
Takes two arguments a and b, and returns the base-a logarithm of b.
Format:
Log(exp1,exp2)
Arguments:
exp1
Expression giving the base of the logarithm. Must be positive.
exp2
Expression giving the value to take the logarithm of. Must be
positive.
Return type:
float
Error conditions:
Returns SFalse if either of exp1 or exp2 evaluates to SFalse, or if
either of exp1 or exp2 is not positive.
Example:
value=log(2,64)
Sets value to the base 2 log of 64, which is 6.0.
------------------------------------------------------------
Ln
------------------------------------------------------------
역시 프로그래밍 하는 사람들은 삼각함수까지 알아야 하나 봅니다. ln값을 구합니다.
ln이 아마 지수가 10인 로그던가? 역시 수학책을 봅시다.
Returns the natural logarithm of its argument. This produces slightly
more accurate results than the otherwise equivalent expression
log(e,(argument)).
Format:
ln(exprn)
Arguments:
exprn
Expression to compute the natural logarithm of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn is not
positive.
Example:
value = ln(time)
Sets value to the natural logarithm of the player's statetime.
------------------------------------------------------------
Lose
------------------------------------------------------------
졌을 경우 1 안그러면 0을 줍니다만 3가지가 있습니다.
형식
1. Lose - 아무 상황으로나 졌을때
2. LoseKO - 체력이 바닥나서 졌을때
3. LoseTime - 시간이 다돼서 졌을때
예)
1. trigger1 = Lose
졌을때
2. trigger1 = !LoseKO
타임오버로 졌거나 이겼을 때
------------------------------------------------------------
MatchNo
------------------------------------------------------------
몇번째 스테이지냐 하는것입니다.
버서스 모드에서는 무조건 값이 1이 됩니다.
예)
예) trigger1 = matchno > 3
3스테이지를 통과한 이후. 즉 4스테이지 이후부터. 제캐릭터 드레이븐에서 레벨업이후
체력증가에 쓰였습니다.
------------------------------------------------------------
MatchOver
------------------------------------------------------------
스테이지가 끝나면 값이 1이 되고 안그러면 0이 됩니다.
그러니까 3판2승제라면 2번째 이긴 라운드에서 승리포즈취하기 직전까진 0이고
승리포즈를 취함과 동시에 1이 됩니다.
윈무겐에선 도스무겐보다 좀 빨리 1이 되는데 승자가 결정되기 전에 1이 됩니다.
예)
trigger1 = matchover
스테이지 끝나고 승리포즈 취한후
------------------------------------------------------------
MoveContact
------------------------------------------------------------
공격이 상대에게 닳았을 경우(히트하거나 가드했을 때) 1, 안닳으면 0이 됩니다. 스텟이 넘
어갈 경우 0으로 초기화됩니다.
하지만 주의할점은 Movecontact와 이 밑의 movehit, moveguarded 는 만족할 경우
도스무겐에서는 값이 1로 유지되지만 윈무겐에서는 1,2,3,4 식으로 계속 증가합니다.
따라서 윈무겐에서도 캐릭을 쓰려면 movecontact = 1 대신, movecontact > 0 으로
써주어야 합니다. 밑의 movehit, moveguarded 도 같습니다.
예)
trigger1 = MoveContact > 0
공격이 닳았을 때
------------------------------------------------------------
MoveGuarded
------------------------------------------------------------
공격을 상대가 가드했을 경우 1, 안그러면 0이 됩니다.
예)
trigger1 = MoveGuarded > 0
공격이 막혔을 경우
------------------------------------------------------------
MoveHit
------------------------------------------------------------
공격이 히트했을(맞았을) 경우 1, 안그러면 0값을 반환합니다.
예)
trigger1 = MoveHit > 0
공격을 맞췄을 경우
------------------------------------------------------------
Movereversed(윈무겐 전용입니다. 웬만하면 쓰지 맙시다)
------------------------------------------------------------
공격이 리버설된 경우 1, 안그러면 0값을 반환합니다(원문엔 0이 아닌값을 준다고 돼있는데
1값을 줍니다). Hitdef의 Reversaldef명령에의해 리버설된 경우를 말합니다.
예)
trigger1 = MoveReversed
P1의 공격이 P2에 의해 리버설된 경우
------------------------------------------------------------
MoveType(*,***)
------------------------------------------------------------
플레이어의 movetype 입니다.
예)
trigger1 = movetype != H
movetype 이 H가 아닐 경우(맞는상태가 아닐경우)
------------------------------------------------------------
Name(*,***)
------------------------------------------------------------
DEF파일에 쓰여있는 캐릭터의 NAME을 검사합니다.
캐릭터간 인트로를 만들 때 authorname과 enemy, 같은 것들과 같이 쓰입니다.
enemy, 같은것들은 이 문서 맨 마지막 부분에 설명되어 있습니다.
예)
trigger1 = Name = "Kyo99"
캐릭터명이 kyo99 일 때.(하지만 이렇게 자체적으론 거의 안쓰이죠. 자기이름 검사해서
뭐합니까...)
------------------------------------------------------------
NumEnemy
------------------------------------------------------------
적의 숫자입니다. 중립플레이어와 노멀헬퍼는 포함되지 않음. 중립 플레이어란게 뭔지
모르겠네요. 헬퍼생성시 헬퍼타입을 player로하면 적숫자에 포함되는 듯 하지만 헬퍼타입
player를 쓰지 말라고 sctrl.txt파일에 나와있습니다.
trigger1 = NumEnemy = 2
trigger1 = enemynear(1), name = "Squash"
적의 수가 2명일 때. 2번째로 가까이 있는 적의 이름이 Squash 일 경우
------------------------------------------------------------
NumExplod
------------------------------------------------------------
cns에서 효과 스프라이트를 내는 명령인 explod가 있는데 그 명령에 의해 생긴
explod의 수를 검사합니다. 괄호를 쳐서 ID를 검사할수도 있습니다.
예)
1. trigger1 = NumExplod >= 4
자기가 발생시킨 모든 explod개수가 4개 이상일 경우
2. trigger1 = NumExplod(1234) >= 4
ID가 1234인 Explod의 개수가 4개 이상일 경우
------------------------------------------------------------
NumHelper
------------------------------------------------------------
발생시킨 헬퍼의 개수. 역시 괄호를 쳐서 아이디로 검사가능합니다.
헬퍼에서 발생시킨 헬퍼라도 개수에 포함됩니다. 즉 플레이어가 근원인 전체 헬퍼 개수.
예)
1. trigger1 = NumHelper < 2
헬퍼개수가 2개 미만일때
2. trigger1 = NumHelper(1234) < 2
ID가 1234인 헬퍼의 개수가 2개 미만일 때
------------------------------------------------------------
NumPartner
------------------------------------------------------------
파트너의 수. 역시 뉴트럴 플레이어와 노멀헬퍼는 고려되지 않는다네요.
예)
trigger1 = NumPartner = 1
trigger1 = partner, life < 200
파트너가 1명 있고 그 파트너의 체력이 200미만일 때
------------------------------------------------------------
NumProj
------------------------------------------------------------
cns명령인 projectile로 발생시킨 프로젝타일 개수. 주의점은 헬퍼에서 만든 프로젝타일일
지라도 본체캐릭터의 소유가 되므로 헬퍼에서 검사할땐 root, numproj 처럼 써야 합니다.
예)
trigger1 = NumProj = 0
프로젝타일이 없을 경우
------------------------------------------------------------
NumProjID
------------------------------------------------------------
위와 같지만 아이디로 검사합니다.
예)
trigger1 = NumProjID(1234) = 1
ID 번호가 1234인 프로젝타일이 1개일 때
------------------------------------------------------------
NumTarget
------------------------------------------------------------
타겟 개수. 공격을 맞췄고(막아도됨) 맞은 상대가 movetype = H일 경우 타겟에
포함됩니다. 상대의 movetype 이 H가 아닐 경우엔 타겟에서 벗어납니다.
괄호를 쳐서 아이디로 검사할수도 있습니다.
자기가 맞춘 대상만 포함되므로 헬퍼같은게 맞춘 대상은 본체나 다른 헬퍼의 타겟에
포함되지 않습니다.
예)
1. trigger1 = Numtarget >= 1
공격에 닳은 상태의 상대가 1명 이상일 때
2. trigger1 = Numtarget(200) >= 1
ID 200의 공격에 닳은 상태의 상대가 1명 이상일 때
------------------------------------------------------------
P1Name(*,***)
------------------------------------------------------------
This is an alias for the Name trigger. See "Name".
이름. Name 과 뭐가 틀린지 모르겠습니다.
------------------------------------------------------------
P2BodyDist
------------------------------------------------------------
상대와 거리인데 p2bodydist x는 플레이어의 앞쪽 몸체너비부터 상대의 앞쪽 몸체너비
까지의 거리입니다. 앞쪽 몸체너비란 front.width 값을 말하는데 cns처음부분의
ground.front(지상에 있을 때) 와 air.front(공중에 있을 때) 값에 따라 정해집니다.
p2bodydist y는 p2dist y랑 값이 같게 나오는데 어떨때 틀리게 나오는지 모르겠군요.
p2bodydist 값이 -일 경우 상대보다 위쪽에 있는걸 뜻합니다.
그런데 p2가 들어가는 트리거들의 경우 2명이상의 상대와 싸울 때 가장 가까이 있는
상대를 기준으로 하긴 하지만 그게 제대로 작동하지 않고 멀리있는 상대를 기준으로
돼버릴 때도 있습니다. 이 문제는 윈무겐의 docs폴더의 파일에도 나와있긴 한데 정확히
고쳐졌다고 나와있진 않습니다. 따라서 상황에 따라 enemynear, 같은 명령어를 쓰는게
더 나을 듯 합니다.
별로 중요하지 않지만, 값은 실수입니다.
Details:
For comparing the Y-distance, P2BodyDist gives the difference in the
heights of the players' Y-axes. A negative value means that P2 is
above P1.
For comparing the X-distance, P2BodyDist gives the
X-distance of P2's front from P1's front. So, if the
players are standing right next to each other, then
P2BodyDist is 0. Remember that you can set the width of
the player in "front.width", etc. under [Size] in the
player variables.
See also P2Dist.
예)
trigger1 = P2BodyDist X < 30
플레이어의 몸체앞쪽너비부터 상대몸체앞쪽너비까지 거리가 30픽셀 미만일 경우
------------------------------------------------------------
P2Dist
------------------------------------------------------------
플레이어의 x축과 상대 x축 까지의 거리입니다.
p2dist y는 p2bodydist y 랑 뭐가 틀린지 모르겠습니다. 설명도 같네요.
Details:
For comparing the Y-distance, P2Dist gives the difference in the
heights of the players' Y-axes. A negative value means that P2 is
above P1.
For comparing the X-distance, P2Dist gives the X-distance
of P2's axis from P1's axis. A positive value indicates P2
is in front of P1.
See also P2BodyDist.
Example:
trigger1 = P2Dist Y <= -12
상대보다 12픽셀 이상 높이 있을 때
------------------------------------------------------------
P2Life
------------------------------------------------------------
상대의 체력입니다. 적이 2명이상일 경우 가까이 있는 적의 체력을 검사합니다.
------------------------------------------------------------
P2MoveType
------------------------------------------------------------
상대의 movetype을 검사.
------------------------------------------------------------
P2Name(*,***)
------------------------------------------------------------
상대의 def파일에 있는 name을 검사. 역시 2인대전시는 가까이있는쪽의 name을 검사하
게 되고 상대가 1명이 ko됐으면 살아있는 상대의 name을 검사합니다.
상대가 모두 ko돼서 바닥에 쓰러진 경우 값은 0(false)이 됩니다.
------------------------------------------------------------
P2StateNo
------------------------------------------------------------
상대의 stateno(스텟넘버)를 검사
------------------------------------------------------------
P2StateType
------------------------------------------------------------
상대의 statetype을 검사
------------------------------------------------------------
P3Name(*,***)
------------------------------------------------------------
같은편의 name을 검사합니다. 같은편이 ko된 상태라도 작동합니다.
같은편이 없는 경우에만 무조건 0(false)값을 줍니다.
------------------------------------------------------------
P4Name(*,***)
------------------------------------------------------------
상대가 2명 이상일 때 더 멀리있는 상대의 name을 검사합니다. 상대가 ko당했어도
작동합니다.
상대가 1명이면 값은 무조건 0.
------------------------------------------------------------
PalNo
------------------------------------------------------------
캐릭터의 팔렛번호
캐릭을 고를 때 선택되는 def파일에 나와있는 대로의 팔렛번호 입니다.
DEF에도 설명돼있지만
A - 1 B - 2 C - 3 X - 4 Y - 5 Z - 6 이고 스타트버튼을 누를 경우 6이 더해
지며, 해당팔렛이 없을 경우엔 그다음 팔렛으로 선택됩니다.
예를들어 스타트버튼을 누른채 B버튼을 눌렀는데 8번팔렛부터 12번 팔렛까지 없다면 1번
팔렛이 골라지며 1번팔렛을 이미 골랐다면 2번팔렛으로 되는 식입니다.
예)
trigger1 = PalNo = 5
팔렛번호가 5일 때
이 트리거는 sanderx씨의 캐릭에 쓰였는데 어느 버튼으로 고르냐에 따라서 캐릭의 버전이
바뀌는걸 구현했습니다.(하지만 복잡하다는 단점이 더 크죠)
------------------------------------------------------------
ParentDist
------------------------------------------------------------
헬퍼에서만 쓰이는 트리거. 자신을 만든 부모와 자신과의 거리.
parentdist x 는 부모의 x축과 자신의 x축간의 거리이고 parentdist y로 하면 y축간의
거리입니다.
예)
trigger1 = ParentDist X != 0
부모와의 x위치가 다를때(조금이라도 떨어져있을 경우)
------------------------------------------------------------
Pi
------------------------------------------------------------
Pi값인 3.141593을 나타냅니다. 이것도 무슨 고급 물리나 수학에서 나오는듯.
This trigger returns the numeric value of pi (3.141593...)
Format:
pi
Arguments:
none
Return type:
float
Error conditions:
none
------------------------------------------------------------
Pos
------------------------------------------------------------
플레이어의 x,y축을 기준으로 현재 플레이어의 위치를 검사합니다.
pos x는 x위치, pos y는 y위치를 검사합니다.
화면의 정중앙이 pos x = 0 이며 왼쪽으로 갈수록 -, 오른쪽으로 갈수록 +가 됩니다.
스테이지의 바닥은 pos y = 0이며 위로 갈수록 -, 밑으로 갈수록 +가 됩니다.
중요하진 않지만 값은 실수
예)
trigger1 = Pos Y >= 0
플레이어의 y축 위치가 스테이지 바닥밑으로 내려갔을 때
(주로 넘어지는 스텟에 쓰입니다)
------------------------------------------------------------
Power
------------------------------------------------------------
기(파워)게이지의 양을 검사. 1000이 기 한칸입니다.
예)
trigger1 = power >= 1000
기게이지 레벨이 1이상일 때
------------------------------------------------------------
PowerMax(윈무겐전용)
------------------------------------------------------------
CNS처음부분의 power =? 값입니다. 기(파워)게이지의 최대치. 보통 3000(Lv3)입니다.
------------------------------------------------------------
PlayerIDExist
------------------------------------------------------------
해당 ID를 지닌 플레이어가 존재하느냐 인데 앞서 말했듯 ID값은 몇 명 대전을 하느냐에
따라 달라지므로 쓰기 어정쩡.
예)
trigger1 = PlayerIDExist(var(4))
var(4)와 같은 ID의 플레이어가 존재할 경우
------------------------------------------------------------
PrevStateNo
------------------------------------------------------------
바로이전 스텟번호를 검사
예)
trigger1 = prevstateno = 100
직전 스텟넘버가 100(달리기)이었을 경우
------------------------------------------------------------
ProjCancelTime
------------------------------------------------------------
처음 값은 -1 이며 프로젝타일이 상대프로젝타일에 의해 사라지는 경우 이 값이 0으로
설정된 후 1프레임당 1씩 계속 증가하게 됩니다.
프로젝타일이 사라질땐 Hitflag = P가 들어가는 hitdef에 의해 사라질수도 있는데 이경우엔
ProjCancelTime 에 영향을 주지 않습니다.(그러니까 상대 프로젝타일에 의해 사라진 경우
만 projcanceltime값이 증가합니다.)
괄호안에 검사할 프로젝타일의 아이디를 쓰는데 0을 쓸 경우 프로젝타일의 아이디를
체크하지 않습니다. 즉 projcanceltime(0)은 플레이어의 프로젝타일중에 아무거나가
상쇄되면 0,1,2... 이렇게 증가합니다.
예)
1. trigger1 = ProjCancelTime(1234) = 1
ID 1234의 프로젝타일이 상대 프로젝타일에 의해 사라진 직후
2. trigger1 = ProjcancelTime(0) != -1 && ProjcancelTime(0) < 15
아무 프로젝타일이 상쇄된 후 15프레임 이내
------------------------------------------------------------
ProjContact(*,***)
------------------------------------------------------------
프로젝타일이 상대에게 닳으면 True(1)값을 줍니다. 뒤에 괄호를 치지 않고 아이디번호
를 쓸수있는데, 아이디번호를 쓰지 않거나 0으로 하면 역시 아무 프로젝타일이 닳으면
true값을 줍니다. 프로젝타일이 닳은 후 True값이 된 후엔 값이 바로 0으로 돌아옵니다.
그런데 이상한 것은 trigger1 = projcontact = 1에서 값을 1이상의 아무 숫자로 줘도
마찬가지입니다. projcontact = 2 나 projcontact = 15 이렇게 줘도 projcontact = 1과
같게 작동하는군요. 분명히 설명에선 1이나 0이라고 했는데 말이죠.
그리고 밑의 두 번째 형식처럼 쓸수 있는걸 보니 각 프레임마다 값이 존재하는 듯 하며
이때문인지 Displaytoclipboard명령으로 볼수가 없어서 애매하군요(에러남)
형식
1. ProjContact[ID] = value
2. ProjContact[ID] = value, [oper] value2
이렇게 쓸수도 있는데 뜻은 아래 Details에 나와있습니다만 해석이 애매해서 원문을
놔뒀습니다.
Arguments:
[ID]
Optional ID number.
value (boolean)
Value to compare against. 0 for false, 1 for true.
[oper]
=, !=, <, >, <=, >=
value2
Time value to compare against.
Return type:
boolean int
Details:
ProjContact will trigger once for each hit of the projectile, so a
multi-hit projectile can trigger multiple times.
The first form of ProjContact shown above is only valid for one tick
after contact, unlike MoveContact.
For the second form, ProjContact returns true if the projectile made
contact n ticks ago, where n is a nonnegative number satisfying the
relation "n [oper] value2".
Specifying an ID number of 0 gives the same behavior as if the ID
number is omitted (check all projectiles).
(원문의 boolean은 불 논리 연산=피연산자가 가능(可) 불가능(不) 으로 결과가 나오는
이라고 사전에 나와있군요. 0-불가능 1-가능 이런식입니다)
예)
1. trigger1 = ProjContact1234 = 1
ID 1234의 프로젝타일이 상대에게 막 닳았을 때(닳은 직후)
2. trigger1 = ProjContact456 = 0, < 15
이전 15프레임 내에 ID 456의 프로젝타일이 닳지 않았다면(모르겠으면 cns에서
실험해보거나 밑의 projhit나 projguarded를 보시길)
------------------------------------------------------------
ProjContactTime
------------------------------------------------------------
형식과 값의 변화는 위 projcanceltime과 같지만 이것은 프로젝타일이 닳았을 경우 값이
0,1,2... 이런식으로 증가합니다.
예)
1. trigger1 = ProjContactTime(1234) = 1
아이디 1235의 프로젝타일이 닳은 직후
2. trigger1 = ProjContactTime(0) != -1 && ProjContactTime(0) < 15
아무 프로젝타일이 닳은 후 15프레임 이내
------------------------------------------------------------
ProjGuarded(*,***)
------------------------------------------------------------
projcontact와 같지만 이건 프로젝타일이 막혔을때(가드당했을때)를 감지합니다.
형식 설명도 projcontact와 같군요.
예)
1. trigger1 = ProjGuarded1234 = 1
아이디 1235의 프로젝타일이 가드당한 직후
2. trigger1 = ProjGuarded = 1, < 15
이전 15프레임 사이에 아무프로젝타일이 가드당했을 때
(바꿔말하면 프로젝타일이 가드당한 후 15프레임 이내)
------------------------------------------------------------
ProjGuardedTime
------------------------------------------------------------
역시 projcanceltime과 같지만 프로젝타일이 가드당했을 때 값이 0,1,2...식으로 증가.
예)
1. trigger1 = ProjGuardedTime(1234) = 1
아이디 1235의 프로젝타일이 가드당한 직후
2. trigger1 = ProjGuardedTime(0) != -1 && ProjGuardedTime(0) < 15
아무 프로젝타일이 가드당한후 15프레임 이내
------------------------------------------------------------
ProjHit(*,***)
------------------------------------------------------------
마찬가지로 projcontact 등과 같지만 프로젝타일이 맞았을때(히트했을때)를 감지합니다
예)
1. trigger1 = ProjHit1234 = 1
아이디 1234의 프로젝타일이 히트한 직후
2. trigger1 = ProjHit1234 = 1, < 15
이전 15프레임 이내에 아이디 1234의 프로젝타일이 히트했을 때
(역시 바꿔말하면 아이디 1234의 프로젝타일이 히트한 후 15프레임 이내)
------------------------------------------------------------
ProjHitTime
------------------------------------------------------------
이하동문. projcanceltime 등과 마찬가지지만 이것은 프로젝타일이 히트했을 때 값이
0,1,2... 식으로 증가합니다.
예)
1. trigger1 = ProjHitTime(1234) = 1
아이디 1234의 프로젝타일이 히트한 직후
2. trigger1 = ProjHitTime(0) != -1 && ProjHitTime(0) < 15
아무 프로젝타일이 히트한 후 15프레임 이내
------------------------------------------------------------
Random
------------------------------------------------------------
랜덤수를 발생시킵니다. 수는 0부터 999사이에 정해집니다.
이 Random이란 글자가 나올때마다 무겐은 랜덤수를 만듭니다.
예)
trigger1 = Random <= 249
랜덤값이 249이하일 때(즉 25%확률로 라는 뜻이 됩니다.)
------------------------------------------------------------
RootDist
------------------------------------------------------------
헬퍼에만 사용되는 트리거. 자신을 만든 근원의 x,y축 부터 자신의 x,y축까지의 거리를
구합니다.
Rootdist x는 가로거리, Rootdist y는 세로거리입니다.
예)
trigger1 = RootDist X != 0
루트의 x위치와 다를 때
------------------------------------------------------------
RoundNo
------------------------------------------------------------
라운드 번호입니다.
예)
trigger1 = RoundNo = 3
3라운드일때
------------------------------------------------------------
RoundsExisted
------------------------------------------------------------
자신이 싸운 라운드가 몇번 있었냐 하는겁니다. 첫 라운드의 값은 0이 되며 스테이지
넘어가도 0이 됩니다.
이것은 Turns모드에서의 인트로를 만들 때 유용합니다.
예)
trigger1 = RoundsExisted = 0
trigger1 = TeamMode = Turns
trigger1 = RoundNo > 0
자신이 싸우는 첫 라운드이고 게임모드가 Turns일 때. 3번째 조건은 1라운드 이후일
때 라는건데 당연한 것이니까 무의미한 조건인 것 같군요.
당신은 이 예를 사용하여 초기화 스텟인 5900(라운드 처음 시작시 맨처음 시작스텟)에
changestate명령과 같이써서 팀모드 인트로를 만들 수 있다. 고 하는군요.
------------------------------------------------------------
RoundState
------------------------------------------------------------
라운드의 상태를 나타내는데 라운드 시작시 0부터 시작해서 라운드 끝나면 4가 됩니다.
각 값이 나타내는 것은 다음과 같습니다.
Details:
0: 화면이 페이드인 될 때(맨처음 라운드 시작시 화면 밝아지는 순간)
1: 캐릭터가 인트로(등장 포즈나 이벤트대사 등)를 할때
2: 캐릭터가 싸울때(라운드 x 파이트! 란 글자가 뜬 후)
3: 라운드가 끝났을 때.(캐릭터의 체력이 바닥나거나 타임오버 됐을때
4: 캐릭터가 승리포즈를 취할 때
예)
trigger1 = RoundState = 2
싸우는 중일 때
------------------------------------------------------------
ScreenPos
------------------------------------------------------------
화면의 왼쪽 위 구석부터 얼마만큼의 위치에 있느냐 하는것입니다.
왼쪽 구석이 screenpos x = 0이 되고 오른쪽으로 갈수록 값이 +가 되고 왼쪽으로 갈수록
-가 됩니다.
화면의 맨위 꼭대기가 screenpos y = 0이 되고 밑으로 갈수록 값이 +되고 위로갈수록
-됩니다.
예)
trigger1 = ScreenPos Y = [0,239]
캐릭터 y위치가 화면 꼭대기부터 밑으로 239 픽셀 내에 있을 때
------------------------------------------------------------
SelfAnimExist
------------------------------------------------------------
Animexist와 같은데 animexist는 맞아서 상대방의 스텟에 가있는 경우 그 상대의 AIR파일
을 검사하기 때문에 대부분 이 selfanimexist를 씁니다.
예) trigger1 = selfanimexist(200)
애니매이션번호 200이 존재할때
------------------------------------------------------------
Sin
------------------------------------------------------------
삼각함수의 sin값을 구합니다.
Computes the sine of the specified argument (in radians.)
Format:
sin(exprn)
Arguments:
exprn
Expression to compute the sine of. (float)
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = sin(pi/2)
Sets value to the sine of pi/2, which is approximately 1.0
(possibly with some rounding error.)
------------------------------------------------------------
StateNo
------------------------------------------------------------
스텟넘버를 검사
예)
trigger1 = stateno = [200,650]
스텟번호가 200~650 사이일 때
------------------------------------------------------------
StateType
------------------------------------------------------------
스텟타입을 검사. S,C,A,L중에 하나죠.
예)
trigger1 = StateType != A
스텟타입이 A가 아닐때
------------------------------------------------------------
SysFVar
------------------------------------------------------------
무겐의 변수중에 var와 fvar말고도 sysvar(정수)와 sysfvar(실수)가 있습니다.
현재 윈무겐까지는 sysvar(0), sysvar(1), sysvar(2) 만이 common1.cns 에 사용되었습니다.
원문엔 쓰지 말라고 하는 듯. 원문입니다.
This trigger takes a mandatory variable number as an argument. It
returns the value of the player's specified system float variable.
This trigger should NOT be used under normal circumstances. System
variables are reserved for bookkeeping in common1.cns.
(cns)근데 상대캐릭터를 특정 스텟으로 강제로 이동시킨후에 var를 써야만하는 경우가 있
는데 그냥 var를 쓰면 맞은 캐릭터의 var를 바꿔버리므로 안되니까 그럴 땐 이 sysvar(4)
같은걸 쓰도록 합시다.
sysvar나 sysfvar나 0-4 까지 쓸수 있습니다.
예)
trigger1 = SysFVar(0) = -1.23
sysfvar(0)이 -1.23일 경우
------------------------------------------------------------
SysVar
------------------------------------------------------------
sysfvar는 실수변수지만 sysvar는 정수변수입니다. 역시 0-4 까지 쓸수있긴 한데 sysvar(0)
과 sysvar(1)과 sysvar(2)는 공통스텟(common1.cns)에 쓰였으므로 쓰면 안됩니다.
예)
trigger1 = SysVar(0) = -34
sysvar(0)이 -34일 경우
------------------------------------------------------------
Tan
------------------------------------------------------------
삼각함수 탄젠트값을 구합니다.
Computes the tangent of the specified argument (in radians.)
Format:
tan(exprn)
Arguments:
exprn
Expression to compute the tangent of. (float)
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = tan(pi/4)
Sets value to the tangent of pi/4, which is approximately 1.0
(possibly with some rounding error.)
------------------------------------------------------------
TeamMode(*,***)
------------------------------------------------------------
플레이의 모드값을 구합니다.
single - 싱글플레이
simul - 시뮬플레이
turns - 턴플레이
예)
trigger1 = TeamMode = Single
싱글플레이일때
------------------------------------------------------------
TeamSide
------------------------------------------------------------
라운드 시작시 1P쪽은 1이 되고 2P쪽은 2가 됩니다.
이 트리거는 기게이지를 표시한다든지 할 때 유용합니다.
예)
trigger1 = TeamSide = 2
2P쪽일 때
------------------------------------------------------------
TicksPerSecond
------------------------------------------------------------
실제시간 1초에 몇프레임인지 구합니다. 원래 60인데 게임속도를 slow 9로 하면 15가
되는군요.
예)
trigger1 = Time > 10 * TicksPerSecond
게임스피드에 상관없이 실제시간 10초 이후일 때
------------------------------------------------------------
Time
------------------------------------------------------------
스텟의 시간입니다.
스텟이 시작하면 0부터 시작해서 1프레임당 1씩 계속 증가합니다.
예)
trigger1 = Time = 2
타임이 2일 때. 란 뜻이긴 하지만 자세히 말하자면 time=2일때가 아니라 time=1에서
time=2로 넘어가는 순간을 뜻합니다.(animelem = ? 과 같음)
주의할점은 헬퍼에서 본체의 time을 검사할 경우엔 값을 1더해야 한다는 것입니다.
예. 헬퍼에서) trigger1 = parent, time = 3
부모의 time이 2일 때.
항상실행스텟인 [statedef -?]에서 검사할때도 값에 1을 더해야 합니다.
이렇게 해야하는 이유는 cns의 실행 순서가 일반스텟->헬퍼->항상실행스텟(statedef -?)
이기 때문인 것 같습니다.
* 마찬가지로 캐릭터가 스텟에 오자마자(time=0에) 적의 공격을 막는(가드스텟으로 가는)
경우가 있는데 이경우엔 만약 스텟시작하자마자 poweradd=-1000같은(필살기같은데
쓰이는)게 있을 경우 기만 날리고 기술은 안나가는 경우가 생길수 있습니다. 따라서 이런
상황을 막기 위해서 이런건 trigger1 = time = 1 이렇게 씁시다.
------------------------------------------------------------
TimeMod(*,**,***)
------------------------------------------------------------
스텟의 time을 나눈 나머지를 구합니다. %대신 쓰는게 추천된다고 하는군요.
형식
TimeMod [oper] divisor, value1
Arguments:
[oper]
=, !=, <, >, <=, >=
divisor (int)
나눌 수(0이 아니어야 함)
value1 (int)
나뉠 수
예)
trigger1 = TimeMod = 4, 3
스텟의 time을 4로 나눈 나머지가 3일 경우 그러니까 스텟타임이 각각 3, 7, 11, 15,
...일 경우를 뜻합니다. trigger1 = time%4 = 3과 같습니다.
근데 위에나온 부호인 <, >= 같은건 어떨 때 쓰는지 모르겠군요. 설명에 나온
위치대로 timemode < 4,3식으로 쓰면 에러나네요. timemod = 4, < 3이렇게 쓸수는
있습니다. 각자 실험해봅시다.;
------------------------------------------------------------
UniqHitCount
------------------------------------------------------------
한 스텟에서 공격이 히트한 횟수입니다. hitcount와 다른점은 공격이 2명이상의 상대에
게 맞았을 때 hitcount는 1만 증가하지만 이 uniqhitcount는 맞춘 수대로 증가합니다. 2명한
테 맞췄다면 2증가 이런식입니다.
예)
trigger1 = UniqHitCount = [4,6]
공격이 들어간 횟수가 총 4~6번 사이일 때
------------------------------------------------------------
Var
------------------------------------------------------------
무겐에서 쓸 수 있는 정수변수. var(0) ~ var(59) 까지 쓸수 있습니다.
예)
trigger1 = Var(0) = -34
var(0)이 -34일 경우
------------------------------------------------------------
Vel
------------------------------------------------------------
속도입니다. vel x는 x속도, vel y 는 y속도입니다.
예)
trigger1 = Vel Y >= 0
y속도가 0이상일 때(밑으로 떨어질 때)
------------------------------------------------------------
Win
------------------------------------------------------------
이겼는가를 뜻합니다. 다음의 4가지가 있습니다.
1. Win - 결과적으로 이겼는가
2. WinKO - ko로 이겼는가
3. WinTime - 타임오버로 이겼는가
4. WinPerfect - 퍼펙트로 이겼는가
예)
1. trigger1 = Win
이겼을 때
2. trigger1 = !WinKO
KO로 이기지 않은 경우
------------------------------------------------------------
1
------------------------------------------------------------
항상실행. 즉 trigger1 = 1 이렇게 쓰면 그 스텟 내에서 해당 명령을 계속 실행해라 하는
것이 됩니다.
주의할점은 trigger1 = 1을 쓰면 다른스텟으로 넘어가는 순간까지 해당명령이 실행되기
때문에 cns의 changestate명령이나 selfstate명령에 의해 스텟이 바뀐후에도
1프레임동안(다음스텟의 time = 0일때까지) 해당명령이 실행되게 됩니다.
따라서 정확히 그 스텟 내에서만 명령이 실행되게 하고 싶으면 trigger1 = animtime < 0
이런식으로 상황에 맞게 써줘야 합니다.
==== (여기까지 일단 트리거들 설명 끝이고 추가적으로) =========================
====================================================================
Trigger redirection
====================================================================
원래 exp.txt에 있는거지만 여기 있는게 나을 것 같아서 여기 써놨습니다.
트리거를 쓸 때 자기자신의 조건 말고도 헬퍼나 상대의 상태를 검사할수도 있습니다.
예를들어 trigger1 = time = ? 이러는 것 외에 trigger1 = parent, time = ? 이라고 하면
parent의 time값을 검사합니다. parent니 뭐니 하는건 밑에 설명.
쓸 수 있는 종류는 다음과 같습니다.
*) parent
자기자신을 만든 부모를 뜻합니다. 헬퍼에 쓰이는데 예를들어 캐릭터 A가 있고 A가 생성
시킨 헬퍼 B가 있고 헬퍼B에서 만든 헬퍼C가 있다고 쳤을때
B의 parent는 A가 되고 C의 parent는 B가 됩니다.
B의 스텟에서 trigger1 = parent, time = ? 이라고 하면 A의 스텟타임을 검사하는것입니다.
*) root
자신을 만든 근원(?). 위와 같은 상황에서 B와 C의 root는 A가 됩니다.
*) helper
자신이 만든 헬퍼를 뜻하는데 그냥 helper, 라고 쓰면 맨처음 만든 헬퍼를 뜻한다고
하네요. 그런데 그냥 helper, 로는 거의 쓰지 않고 밑과 같이 helper(ID)로 씁니다.
*) helper(ID)
헬퍼를 만들 때 아이디를 줄수있는데 그 아이디를 가진 헬퍼를 뜻합니다. helper(1234), 라
고 하면 ID 1234의 헬퍼를 뜻합니다.
*) target
공격을 맞춘(막아도 포함) 첫 번째 상대. 이것도 그냥 target으로는 거의 쓰지않고 밑처럼
ID를 줘서 씁니다. 상대의 movetype 이 H일경우에만 되며 상대 movetype이 H가 아닐
경우 타겟에서 벗어납니다.
원문: Redirects the trigger to the first target found.
첫 번째 상대라곤 하지만 2명이상이 같이 맞았을땐 아무 타겟이나 찍는군요.
*) target(ID)
공격판정을 낼 때 ID를 정해줄수 있는데 이걸 이용해 해당 공격에 맞은 타겟을 검사합니
다. target(200), 라고 쓰면 ID 200 인 공격에 맞은 타겟을 뜻합니다.
*) partner
2대2 대전 등을 할 때 같은편 파트너를 뜻합니다. 노멀 헬퍼와 뉴트럴 플레이어는 파트너
에 속하지 않는다고 하는데 하여튼 헬퍼를 제외한 같은편은 파트너로 간주됩니다.
*) enemy
첫 번째 적. 역시 노멀헬퍼와 뉴트럴플레이어는 간주되지 않는다는군요.
*) enemy(n)
괄호안의 숫자는 몇번째 적이냐 하는걸 뜻한다는데 써보지 않아서 정확한 건 모르겠군요.
첫 번째가 2p이고 두 번째가 4p쯤 되지 않을까 싶군요.
*) enemyNear
가장 가까이 있는 적
*) enemyNear(n)
n번째 가까이 있는 적. 0이 가장 가까이 있는적이고 1이 두 번째 가까이 있는 적인듯.
*) playerID(ID)
해당 아이디를 지닌 플레이어. ID를 보려면 displayclipboard 나 appendtoclipboard를 써
서 id를 봐야하는데 이 아이디가 1:1 할 때와 1:2 랑 2:2 할 때 각각 다르므로 대체 어디다
쓰는건지 모르겠습니다.
이들중 2가지이상 중복하여 쓰면 에러납니다. 예) root,target,time = ? 처럼 쓰면 에러.
===================================================================
트리거가 잘못될 경우 캐릭선택시 튕기거나 작은 잘못일 경우 디버그모드에서 흰색글씨로
나온다거나 하므로 메시지를 확인하고 해당부분이 왜 에러가 나는지 생각해서 제대로
고칩시다.
작은 잘못은 예를들어 trigger1 = target(10), stateno = 1031 이라고 썼는데 아이디 10인
타겟이 없을 경우 디버그모드에서 타겟이 없다고 흰색 글씨로 계속 뜨게 됩니다. 이럴
경우는
trigger1 = numtarget(10) > 0
trigger1 = target(10), stateno = 1031
이런식으로 고쳐줘야 합니다. numtarget(10) > 0이 항상 위에 있어야 하고 꼭 두줄로 써야
하며 한줄로 쓰면 마찬가지로 흰색글씨 뜹니다. 예를들어
trigger1 = numtarget(10) > 0 && target(10), stateno = 1031
이렇게 한줄로 묶어서 쓰지말고 꼭 위처럼 2줄로 써야 흰색글씨가 뜨지 않습니다.
이런 건 안고쳐도 게임엔 문제없지만 디버그모드사용시 흰색글씨가 계속뜨는게 보기 안좋으
므로 고치는 거랍니다.
선생님 : Ihoo1836트리거
(역시 용어가 애니매이션의 스프라이트를 뜻하는 '프레임'과 게임상의 1/60초를 뜻하는
'프레임'이 헷갈릴수 있어서 전자의 경우 그냥 '스프라이트'라고 했고 '프레임'이라고 한
경우는 1/60초를 뜻하는 경우만 사용했습니다.)
캐릭터의 동작을 만들기 위해선 명령어가 필요합니다. 예를들어 캐릭터를 앞으로 얼만큼 이
동시킨다든지 언제 공격판정을 만든다든지 하는 것 등인데 이 명령을 수행할 때 조건이 트
리거입니다. 원본파일은 docs폴더의 trigger.txt인데 모르는건 원문그대로.
윈무겐에서 달라진점은 윈무겐 docs폴더의 update.txt 파일을 보면 원문이 있습니다.
앞서도 설명했듯이 명령어의 구조가
[State 번호, ?] ;state 뒤의 번호는 암거나 써도 상관없으나 에러메세지가 뜰 때 알아보
;기 쉽게하기 위해 statedef 의 번호(스텟넘버)랑 맞춰주는게 일반적.
type = ? ;명령어
trigger? ;조건
~~~ ;추가 파라미터
이렇게 되는데 트리거에 쓰인 조건을 만족하면 그 명령이 실행된다는 것입니다.
예를 들어
[state 200]
type = posadd
trigger1 = time = 0
x = 10
이렇게 하면 스텟 시작하자마자 x축으로 10만큼 캐릭터를 앞으로 이동시켜라 하는 게
됩니다.
추가적으로 설명하자면 트리거의 값이 1이 될 경우 해당명령을 실행합니다.
조건인 time = 0을 만족할 경우 컴퓨터는 값 '1(true:맞음)'을 돌려주므로 결과적으로 저
문장은 'trigger1 = 1' 이 되서 해당명령이 실행되는 것입니다. 조건을 만족하지 않으면
컴퓨터는 값 '0(false:틀림)'을 돌려줍니다. 'trigger1 = 0'이 되면 해당명령은 실행되지
않습니다.
또한 triggerall 이라는게 있는데 무조건 만족해야 하는 트리거를 뜻합니다.
예를들어
triggerall = statetype = A
trigger1 = command = "a"
trigger2 = command = "b"
라고 하면 캐릭터가 무조건 스텟타입이 A이어야 하며, a나 b버튼을 눌렀을 때 라는 뜻이
됩니다.
트리거 뒤의 숫자는 차례대로 가야 합니다. 예를들어 trigger2 뒤에 trigger4가 써있으면
제대로 검사가 되지 않습니다.
그리고 디버그모드는 MUGEN.CFG에서 ALLOWDEBUGMODE = 1로 설정돼있으면 도스무
겐에선 ctrl + d 키로 되지만 윈무겐은 무겐실행시 winmugen.exe가 아닌 debug.exe로
실행을 해야 됩니다. 디버그 모드에서는 캐릭터의 애니매이션번호와 스텟번호. gametime과
스텟time, animtime, statetype, ctrl 등의 정보를 볼 수 있습니다.
ctrl+c를 누르면 캐릭터의 판정박스와 무적정보 등이 나옵니다.
만약 모르겠는 트리거가 있다면 CNS의 Displaytoclipboard명령과 appendtoclipboard명령을
사용하면 알수 있을것입니다.
그리고 반환되는 값을 말할 때 1이면 True값이고 0이면 False값이니까 설명되어있지 않아
도 이해하시길 바랍니다.
====================================================================
;여긴 원문그대로
This is an alphabetical index of function-type triggers. For details
on use of function-type triggers in expressions, see the expression
documentation. Unless otherwise specified, we will use P1 to represent
the player who is evaluating the trigger, and P2 to represent his
opponent (usually the closest opponent when in team mode).
Some triggers are nonstandard and cannot take expressions as their
arguments. These are marked with a (*) in the index. Some triggers are
deprecated; these are marked with a (**). Use of these triggers is not
encouraged, as support for them may be removed in future versions of
the engine.
Old-style triggers, marked (***), appear only in clauses of the form
(trigger) (relational operator) (value). See section 8 of exp.doc for
more details.
For all triggers, SFalse will be returned if the trigger is redirected
to a nonexistent destination, or if the ID number for the redirection
evaluates to SFalse. This is not listed in the error conditions for
each trigger.
트리거 목록입니다. 대문자로 쓰나 소문자로 쓰나 같습니다.
--------------------------
-Abs
-Acos
-Alive
-Anim
-AnimElem(*,***)
-AnimElemNo
-AnimElemTime
-AnimExist
-AnimTime
-Asin
-Atan
-AuthorName(*,***)
-BackEdgeBodyDist
-BackEdgeDist
-CanRecover
-Ceil
-Command(*,***)
-Const(*)
-Cos
-Ctrl
-DrawGame
-E
-Exp
-Facing
-Floor
-FrontEdgeBodyDist
-FrontEdgeDist
-FVar
-GameTime
-GetHitVar(*)
-HitCount
-HitDefAttr(*,***)
-HitFall
-HitOver
-HitPauseTime
-HitShakeOver
-HitVel
-ID
-IfElse
-InGuardDist(윈무겐전용)
-IsHelper
-IsHomeTeam
-Life
-LifeMax(윈무겐전용)
-Ln
-Log
-Lose
-MatchNo
-MatchOver
-MoveContact
-MoveGuarded
-MoveHit
-MoveReversed(윈무겐전용)
-MoveType(*,***)
-Name(*,***)
-NumEnemy
-NumExplod
-NumHelper
-NumPartner
-NumProj
-NumProjID
-NumTarget
-P1Name(*,***)
-P2BodyDist
-P2Dist
-P2Life
-P2MoveType(*,***)
-P2Name(*,***)
-P2StateNo
-P2StateType(*,***)
-P3Name(*,***)
-P4Name(*,***)
-PalNo
-ParentDist
-Pi
-PlayerIDExist
-PrevStateNo
-Pos
-Power
-PowerMax(윈무겐전용)
-ProjCancelTime
-ProjContact(*,***)
-ProjContactTime
-ProjGuarded(*,***)
-ProjGuardedTime
-ProjHit(*,***)
-ProjHitTime
-Random
-RootDist
-RoundNo
-RoundsExisted
-RoundState
-ScreenPos
-SelfAnimExist
-Sin
-StateNo
-StateType(*,***)
-SysFVar
-SysVar
-Tan
-TeamMode(*,***)
-TeamSide
-TicksPerSecond
-Time
-TimeMod(*,**,***)
-UniqHitCount
-Var
-Vel
-Win
위의 트리거중에 수학 트리거 목록
----------------------
-abs
-acos
-asin
-atan
-ceil
-cos
-e
-exp
-floor
-IfElse
-ln
-log
-pi
-sin
-tan
------------------------------------------------------------
Abs
------------------------------------------------------------
절대값을 구하는 트리거입니다.
형식
abs(절대값을 구할 값)
괄호안의 수가 정수라면 정수를, 실수라면 실수를 돌려줍니다.
-2의 절대값은 2이고 뭐 이런거 수학에서 나오는데 그거 같습니다만 써본적이 없습니다.
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
------------------------------------------------------------
Acos
------------------------------------------------------------
Computes the arccosine (in radians) of the specified argument.
무슨 삼각함수 라디안에 관련된 코사인 같은데 써본적도 없고 모르겠군요.
Format:
acos(exprn)
Arguments:
exprn
Expression to compute the arccosine of (float).
Return type:
float(실수. 영어원문에서 int는 정수, float은 실수를 뜻합니다)
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn is not in
the domain of arccosine (which is [-1.0,1.0]).
Example:
value = acos(1)
Sets value to the arccosine of 1, which is approximately 0.0
(possibly with some rounding error.)
------------------------------------------------------------
Alive
------------------------------------------------------------
플레이어가 살아있다면 1(true)값을 돌려주고 ko된 상황(체력이 0일때)이면 0을 돌려줍니다.
예)
trigger1 = alive = 0
플레이어가 ko됐을 때
------------------------------------------------------------
Anim
------------------------------------------------------------
플레이어의 애니매이션 번호를 검사합니다.
예)
trigger1 = Anim = 200
액션번호가 200 일때
------------------------------------------------------------
AnimElem(*,***)
------------------------------------------------------------
애니매이션의 몇번째 스프라이트인가를 검사합니다.
예를들어 air파일에서 다음과 같은 액션200이 있다고 칩시다.
[begin action 200]
0,0,0,0,4 - 첫 번째 스프라이트
0,1,0,0,5 - 두 번째 스프라이트
0,2,0,0,6 - 세 번째 스프라이트
이 됩니다.
형식
1. AnimElem = value1
2. AnimElem = value1, [oper] value2
[oper]에 들어가는 부호
=, !=, <, >, <=, >=
value1 (정수)
몇번째 스프라이트인가
value2 (정수)
그 스프라이트에서 몇프레임 째인가
예)
trigger1 = AnimElem = 2
애니매이션의 2번째 스프라이트 시작 직후를 뜻합니다. 그러니까 위의 액션200에서
스프라이트 0,1이 나올 때를 뜻합니다. 다음과 같이 써도 같은 뜻이 됩니다.
trigger1 = AnimElem = 2, = 0 (2번째 스프라이트의 1번째 프레임)
(정확히 말하자면 1번째 스프라이트가 끝나고 2번째 스프라이트로 넘어가는 순간!을 뜻
합니다.)
trigger1 = AnimElem = 2, = 4
2번째 스프라이트 시작 후 4프레임 지났을 때를 뜻합니다. 그러니까 위의 액션200에서
는 스프라이트 0,1이 끝나기 직전이 되겠네요.
(역시 정확히 말하자면 4프레임 지나고 5프레임으로 넘어가는 순간!을 뜻합니다.)
trigger1 = AnimElem = 2, >= 0
trigger1 = AnimElem = 3, < 0
2번째 스프라이트 시작 직후부터 3번째 스프라이트가 나오기 전까지입니다.
만약 3번째 스프라이트가 없다면 2번째 줄은 다음과 같은뜻이 됩니다.
trigger1 = AnimTime <= 0
* 캐릭터가 스텟에 오자마자(animelem=1에) 적의 공격을 막는(가드스텟으로 가는) 경우가
있는데 이경우엔 만약 스텟시작하자마자 poweradd=-1000같은(필살기같은데 쓰이는)게
있을 경우 기만 날리고 기술은 안나가는 경우가 생길수 있습니다. 따라서 이런 상황을 막기
위해서 이런건 trigger1 = animelem = 1,1 이나 trigger1 = time = 1 이런식으로 씁시다.
------------------------------------------------------------
AnimElemNo
------------------------------------------------------------
애니매이션의 스프라이트의 프레임의 범위를 검사?. 설명이 어렵네요. 예를 봅시다.
Returns the number of the animation element in the current action
that would be displayed at the specified time. The argument to AnimElemNo
represents the time to check, expressed in game ticks, relative to the present.
(영어원문에서 tick 이라고 함은 게임진행시간(프레임)을 말하는 것으로 1tick은 1/60초
= 1프레임 입니다)
Format:
AnimElemTime(exprn)
Arguments:
exprn
Expression that evaluates to the time offset (int).
Return type:
int
Error conditions:
Returns SFalse if you try to check a time that would fall before the
start of the current action.
Notes:
If the action is currently within its looping portion, then it is
assumed to have been looping forever. That is, no matter how far into
the past you check, AnimElemNo will always return an element number
that lies within the looping portion of the action.
Examples:
trigger1 = AnimElemNo(0) = 2
True when the animation element to be displayed 0 ticks in the
future (i.e., now) is element 2. This is equivalent to:
이건 다음과 같습니다.
trigger1 = AnimElem = 2, >= 0
trigger1 = AnimElem = 3, < 0
trigger1 = AnimElemNo(2) = 4
True when the animation element that will be displayed two ticks
from now is element 4. This is equivalent to:
이건 다음과 같습니다.
trigger1 = AnimElem = 4, >= -2
trigger1 = AnimElem = 5, < -2
이 animelemno(?)는 잘 쓰이진 않지만 애니매이션을 정시시킬 때 쓸수도 있습니다.
예를들어
[state 500]
type = changeanim
trigger1 = 1
value = anim
elem = animelemno(-1)
이렇게 쓰면 현재 스프라이트가 유지되는데 제캐릭터 쿠로키시의 얼음빔에 맞은 스텟이나
진념 연옥영파 모으는중 히트시 구체를 정지시킬 때, 드레이븐 아이스스톰 맞았을 때 등에
쓰였습니다. 11-cns명령어 파일의 changeanim부분 참조.
------------------------------------------------------------
AnimElemTime
------------------------------------------------------------
안써봤습니다.
Gets the animation-time elapsed since the start of a specified element
of the current animation action. Useful for synchronizing events to
elements of an animation action.
(reminder: first element of an action is element 1, not 0)
Format:
AnimElemTime(exprn)
Arguments:
exprn
Expression that evaluates to the element number to check (int).
Return type:
int
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn evaluates
to an element number that is not valid for the current action.
Examples:
trigger1 = AnimElemTime(2) = 0
True on the first game-tick that the player's animation
is on element 2. Is equivalent to saying:
이건 다음과 같습니다.
trigger1 = AnimElem = 2
trigger1 = AnimElemTime(2) = 4
True 4 game-ticks after the start of the player's
second animation element.
정확히는 모르겠지만 이건 animelem = 2, =4 와 같은것같군요.
trigger1 = AnimElemTime(2) >= 0
trigger1 = AnimElemTime(3) < 0
이건
animelem = 2, >= 0
animelem = 3, <0 과 같은 것 같습니다.
True for the whole of the second element of the player's
animation, assuming there is a third element. If a
third element does not exist, the second line will evaluate
to SFalse and hence trigger1 will never trigger. In this case,
the second line should read,
trigger1 = AnimTime <= 0
------------------------------------------------------------
AnimExist
------------------------------------------------------------
애니매이션 번호가 존재하는지를 검사하는것인데 상대방에 맞아서 상대 스텟으로 간
경우 오작동할수도 있으므로 거의 쓰이지 않고 대신 selfanimexist가 쓰입니다.
예)
trigger1 = !AnimExist(200)
애니매이션 200번이 존재하지 않을때
------------------------------------------------------------
AnimTime
------------------------------------------------------------
애니매이션이 끝날때의 animtime 은 0이 되고 그이전엔 -값에서 계속 0을 향해 1씩
더해집니다.
예를들어 전체 지속시간이 7프레임인 애니매이션이 있다고 하면 그 애니매이션 시작직후
animtime 값은 -7 이며 7프레임째의 값은 -1 그리고 끝날때는 0이 됩니다.
AIR파일에서 loopstart가 쓰여있다고 해도 마지막 스프라이트의 지속시간이 끝나면
animtime값은 0이 됩니다.
예)
trigger1 = AnimTime = 0
애니매이션이 끝났을 때.
이건 대부분의 스텟 마지막 부분에 changestate명령과 함께 쓰입니다.
------------------------------------------------------------
Asin
------------------------------------------------------------
이것도 삼각함수 같은데 모르겠군요.
Computes the arcsine (in radians) of the specified argument.
Format:
asin(exprn)
Arguments:
exprn
Expression to compute the arcsine of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn is not in
the domain of arcsine (which is [-1.0,1.0]).
Example:
value = asin(1)
Sets value to the arcsine of 1, which is approximately pi/2
(possibly with some rounding error.)
------------------------------------------------------------
Atan
------------------------------------------------------------
역시 삼각함수
Computes the arctangent (in radians) of the specified argument.
Format:
atan(exprn)
Arguments:
exprn
Expression to compute the arctangent of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = atan(1)
Sets value to the arccosine of 1, which is approximately pi/4
(possibly with some rounding error.)
------------------------------------------------------------
AuthorName(*,***)
------------------------------------------------------------
제작자의 이름을 검사합니다.
해당 캐릭터의 def파일내에 있는 authorname을 검사하는 것입니다.
예)
trigger1 = Authorname = "sanderx"
def파일에 쓰여있는 authorname이 sanderx 일 경우
------------------------------------------------------------
BackEdgeBodyDist
------------------------------------------------------------
캐릭터의 back.width부터 캐릭터뒤쪽의 화면구석까지의 거리를 구합니다.
그런데 backedgedist와 값의 차이를 모르겠군요.
결과값은 실수입니다만 중요하지 않습니다.
예)
trigger1 = BackEdgeBodyDist < 30
캐릭터의 뒤 너비부터 캐릭터 뒤쪽 스크린 가장자리 까지의 거리가 30픽셀(도트)
미만일 경우
------------------------------------------------------------
BackEdgeDist
------------------------------------------------------------
캐릭터의 x축 중심부터 뒤쪽 화면 가장자리까지의 거리를 구합니다.
역시 backedgebodydist 와 값이 똑같이 나오는군요
결과값은 실수입니다만 역시 중요치 않습니다.
예)
trigger1 = BackEdgeDist < 30
캐릭터의 x축 중심부터 뒤쪽 화면 가장자리까지의 거리가 30픽셀 미만일 경우
------------------------------------------------------------
CanRecover
------------------------------------------------------------
캐릭터가 맞아서 날아가는 중일 때 낙법을 할수 있으면 1을 반환하고 그렇지 않으면
0을 반환합니다. 낙법이 가능한지 불가능한지는 cns의 hitdef의 명령어에 따라 정해집니다.
예) trigger1 = canrecover
------------------------------------------------------------
Ceil
------------------------------------------------------------
수를 올림한 값을 구합니다. 음수일 경우 그 수보다 크거나 같은 정수를 구합니다.
형식
ceil(수)
예)
ceil(5.5)의 값은 6
ceil(5.1)의 값도 6
ceil(-2.6)의 값은 -2
------------------------------------------------------------
Command (*,***)
------------------------------------------------------------
커맨드 입력 감지
예)
trigger1 = Command = "fireball"
fireball 커맨드를 입력했을 때
trigger1 = command != "holdback"
뒤 키를 누르고 있지 않을 때
도스무겐에선 입력된 커맨드 지속시간이 1프레임 이었지만, 윈무겐에서는 cmd파일에
추가된 부분인 [defaults]부분의 command.buffer.time 만큼 지속됩니다. 기술 발동할 때
커맨드를 입력하면 CMD에서 커맨드를 감지해서 스텟을 이동시키는데, 도스무겐에선
이동한 스텟의 time = 0 까지만 커맨드를 입력한걸로 감지하지만, 윈무겐에선 저
값대로(기본값1인 경우 time = 1까지) 감지합니다.
command.buffer.time 값이 1(기본값)이라고 쳤을때
type = varset
trigger1 = time > 0
trigger1 = command = "xx"
이런 부분은 같은커맨드로 연결하는 기술(이오리 규화(밑,뒤+손)같은)에 쓰였었는데
윈무겐을 위해 time > 0 부분을 time > 1 로 고쳐야 합니다.
예를들자면 제 이오리 [statedef 520]에서 다음과 같은 부분이 있습니다.
[State 325,8]
type = Varset
triggerall = time > 1
triggerall = time < 35
triggerall = var(55) = 0
trigger1 = command = "3p1_z"
trigger2 = command = "3p1_x"
persistent = 0
var(5) = 1
이곳의 time > 1을 time > 0으로 고친후 강규화를 실험해보면, 도스무겐에선 문제가
없지만 윈무겐에선 강규화1타가 맞을 경우 2타가 저절로 나가는 현상이 나타납니다.
------------------------------------------------------------
Const (*)
------------------------------------------------------------
캐릭터의 cns파일 처음 부분에 있는 여러 가지 값들을 검사하는 것입니다.
형식
Const(파라미터 이름)
CNS파일 처음부분의 [Data]부분의 값을 검사할 때. (해당 값들을 검사합니다. 굳이 해석할
필요는 없겠죠?)
data.life: Returns value of the "life" parameter. (int)
data.attack: Returns value of the "attack" parameter. (int)
data.defence: Returns value of the "defence" parameter. (int)
data.fall.defence_mul: Returns value of the defence multiplier,
calculated as 100/(f+100), where f is the "fall.defence_up"
parameter. (float)
data.liedown.time: Returns value of the "liedown.time" parameter.
(int)
data.airjuggle: Returns value of the "airjuggle" parameter. (int)
data.sparkno: Returns value of the "sparkno" parameter. (int)
data.guard.sparkno: Returns value of the "guard.sparkno" parameter.
(int)
data.KO.echo: Returns value of the "ko.echo" parameter. (int)
data.IntPersistIndex: Returns value of the "IntPersistIndex"
parameter. (int)
data.FloatPersistIndex: Returns value of the "FloatPersistIndex"
parameter. (int)
CNS의 [Size]부분 값들을 검사할때
size.xscale: Returns value of the "xscale" parameter. (float)
size.yscale: Returns value of the "yscale" parameter. (float)
size.ground.back: Returns value of the "ground.back" parameter.
(int)
size.ground.front: Returns value of the "ground.front" parameter.
(int)
size.air.back: Returns value of the "air.back" parameter. (int)
size.air.front: Returns value of the "air.front" parameter. (int)
size.height: Returns value of the "height" parameter. (int)
size.attack.dist: Returns value of the "attack.dist" parameter.
(int)
size.proj.attack.dist: Returns value of the "proj.attack.dist"
parameter. (int)
size.proj.doscale: Returns value of the "proj.doscale" parameter.
(int)
size.head.pos.x: Returns x-component of the "head.pos" parameter.
(int)
size.head.pos.y: Returns y-component of the "head.pos" parameter.
(int)
size.mid.pos.x: Returns x-component of the "mid.pos" parameter.
(int)
size.mid.pos.y: Returns y-component of the "mid.pos" parameter.
(int)
size.shadowoffset: Returns value of the "shadowoffset" parameter.
(int)
size.draw.offset.x: Returns x-component of the "draw.offset"
parameter. (int)
size.draw.offset.y: Returns y-component of the "draw.offset"
parameter. (int)
CNS의 [Velocity]부분의 값을 검사할 때. 주로 스텟 20(걷기)이나 100(달리기)에서 이
파라미터들을 쓰게 되죠
velocity.walk.fwd.x: Returns value of the "walk.fwd" parameter.
(float)
velocity.walk.back.x: Returns value of the "walk.back" parameter.
(float)
velocity.run.fwd.x: Returns x-component of the "run.fwd" parameter.
(float)
velocity.run.fwd.y: Returns y-component of the "run.fwd" parameter.
(float)
velocity.run.back.x: Returns x-component of the "run.back"
parameter.
(float)
velocity.run.back.y: Returns y-component of the "run.back"
parameter.
(float)
velocity.jump.y: Returns y-component of the "jump.neu" parameter.
Note: this is NOT "velocity.jump.neu.y". Only the "neu"
parameters take a y-component value. (float)
velocity.jump.neu.x: Returns x-component of the "jump.neu"
parameter.
(float)
velocity.jump.back.x: Returns value of the "jump.back" paramamter.
(float)
velocity.jump.fwd.x: Returns value of the "jump.fwd" parameter.
(float)
velocity.runjump.back.x: Returns value of the "runjump.back"
paramamter. (float)
velocity.runjump.fwd.x: Returns value of the "runjump.fwd"
parameter.
(float)
velocity.airjump.y: Returns y-component of the "airjump.neu"
parameter. Note: this is NOT "velocity.airjump.neu.y".
(float)
velocity.airjump.neu.x: Returns x-component of the "airjump.neu"
parameter. (float)
velocity.airjump.back.x: Returns value of the "airjump.back"
paramamter. (float)
velocity.airjump.fwd.x: Returns value of the "airjump.fwd"
parameter.
(float)
역시 [Movement]부분의 값들을 검사할때
movement.airjump.num: Returns value of the "airjump.num" parameter.
(int)
movement.airjump.height: Returns value of the "airjump.height"
parameter. (int)
movement.yaccel: Returns value of the "yaccel" parameter. (float)
movement.stand.friction: Returns value of the "stand.friction"
parameter. (float)
movement.crouch.friction: Returns value of the "crouch.friction"
parameter. (float)
예)
trigger1 = Const(velocity.walk.fwd.x) > 4
CNS파일의 [velocity]부분에 있는 walk.fwd 의 값이 4보다 클 경우
------------------------------------------------------------
Cos
------------------------------------------------------------
삼각함수의 코사인 값을 구합니다. 괄호안에 각도를 쓰는 듯. 예를들어 cos(0) = 1입니다.
실수를 쓸수도 있는데 그것에 대해선 모르겠군요.
Computes the cosine of the specified argument (in radians.)
Format:
cos(exprn)
Arguments:
exprn
Expression to compute the cosine of. (float)
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = cos(0)
Sets value to the cosine of 0, which is approximately 1.0
(possibly with some rounding error.)
------------------------------------------------------------
Ctrl
------------------------------------------------------------
캐릭터 조종이 가능할 경우(?)1을 돌려주고 그렇지 않으면 0을 돌려줍니다.
ctrl값이 0인지 1인지는 각 스텟의 처음 부분의 ctrl =? 등에 따라 결정됩니다.
예)
trigger1 = Ctrl
캐릭터가 컨트롤가능할 경우
------------------------------------------------------------
DrawGame
------------------------------------------------------------
그 라운드를 비길 경우 1이 되고 아니면 0이 됩니다.
예)
trigger1 = DrawGame
라운드가 비긴 상태로 끝날 경우
------------------------------------------------------------
E
------------------------------------------------------------
e값(2.718281828..)이라는데 대학교 고급수학이나 물리에서 나오나? 저는 모르겠습니다.
Returns the value of e (2.718281828...)
Format:
e
Arguments:
none
Return type:
float
Error conditions:
none
------------------------------------------------------------
Exp
------------------------------------------------------------
수학 연산자인데 몰라요.
Computes the exponential of the argument (e raised to the power of
the argument.) This produces slightly more accurate results than the
equivalent expression e**(argument).
Format:
exp(exprn)
Arguments:
exprn
Expression to compute the exponential of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = exp(4-var(0))
Sets value to e raised to the quantity 4-var(0).
------------------------------------------------------------
Facing
------------------------------------------------------------
캐릭터가 오른쪽을 향아고 있으면 1을, 왼쪽을 향하고있으면 -1 값을 줍니다.
예)
Trigger = Facing = -1
캐릭터가 왼쪽을 보고 있을 때
------------------------------------------------------------
Floor
------------------------------------------------------------
버림한 값을 구합니다. ceil과 반대. 음수일 경우 그 수보다 작거나 같은 정수를 구합니다.
예)
floor(5.5)의 값은 5
floor(-2.1)의 값은 -3
------------------------------------------------------------
FrontEdgeBodyDist
------------------------------------------------------------
캐릭터의 앞쪽 너비에서부터 앞쪽 스크린 구석까지의 거리를 구합니다.
역시 밑의 frontedgedist와 갚이 같게 나오는데 어떨 때 다르게 나오는지 모르겠습니다.
예)
trigger1 = FrontEdgeBodyDist < 30
플레이어의 앞쪽 너비부터 앞쪽 스크린 끝까지의 거리가 30픽셀(도트) 미만일 경우
------------------------------------------------------------
FrontEdgeDist
------------------------------------------------------------
플레이어의 x축을 기준으로 앞쪽 스크린구석까지의 거리를 구합니다.
frontedgebodydist와 값이 같게 나오는데 어떨 때 다른지 모르겠습니다.
예)
trigger1 = FrontEdgeDist < 30
플레이어 x축과 앞쪽 스크린 가장자리까지의 거리가 30픽셀 미만일 경우
------------------------------------------------------------
FVar
------------------------------------------------------------
실수변수인 fvar의 값을 검사합니다. fvar(0)부터 fvar(39)까지 있습니다.
값을 정하는 것은 cns명령어인 varset, varadd 로 합니다.
예)
trigger1 = FVar(5) = -1.23
fvar(5)의 값이 -1.23 일 경우
------------------------------------------------------------
GameTime
------------------------------------------------------------
라운드가 시작되면 Gametime은 계속 흘러갑니다. cns명령어인 pause 등으로 게임
화면이 멈춰도 상관없이 1초에 60씩 계속 올라갑니다.
gametime은 주로 일정시간마다 실행할 명령의 조건에 사용됩니다.
예)
trigger1 = (GameTime%27)=0
gametime을27로 나눈 나머지가 0인 경우. 즉, 27프레임마다를 뜻합니다.
------------------------------------------------------------
GetHitVar(*)
------------------------------------------------------------
맞은 공격의 속성(값)들을 검사합니다. cns의 공격판정을 내는 명령인 hitdef의 속성에 따라
값들이 결정되는데, 주로 공격을 한 상대방의 hitdef에서 검사합니다.
Gethitvar는 movetype = H 일 경우에만 지속되며 I일 경우 사라집니다. A일경우엔 일부만
사라지는 듯.
형식
GetHitVar(파라미터이름)
파라미터 종류
xveladd, yveladd, type, animtype, airtype, groundtype, damage,
hitcount, fallcount, hitshaketime, hittime, slidetime, ctrltime,
recovertime, xoff, yoff, zoff, xvel, yvel, yaccel, hitid,
chainid, guarded, fall, fall.damage, fall.xvel, fall.yvel,
fall.recover, fall.time, fall.recovertime, isbound(윈무겐전용).
자세히
xveladd: Returns the additional x-velocity that is added to the
player's own when he is KOed. (float)
KO됐을 때 x속도 더하는 값? 써본적이 없네요. 아마 캐릭터가 KO될때 x,y속도
가 일정값만큼 더해져서 날아가게 되는데 그걸 말하는듯.
yveladd: Returns the additional y-velocity that is added to the
player's own when he is KOed. (float)
type: hitdef의 type. 지상에서 맞으면 ground.type 의 값, 공중이면 air.type의 값입
니다. 0 - none, 1 - high, 2 - low, 3 - trip(3값은 지상에서만 받음)
animtype: hitdef의 animtype에 따라 해당 값을 돌려줍니다. 0 - light, 1 - medium, 2
- hard, 3 - back, 4 - up, 5 - diagup
airtype: hitdef의 air.type값. 돌려주는 값은 위의 type과 같습니다.
groundtype: 마찬가지로 hitdef의 ground.type 값
damage: damage 값
hitcount: 맞은 횟수입니다. 예를들어 2히트콤보를 맞으면 2 뭐 이런식입니다.
fallcount: 콤보맞아서 다운된 횟수
hitshaketime: 경직시간. hitdef의 pausetime 의 영향을 받는데 예를들어 pausetime이 10
인 공격에 맞을 경우 hitshaketime 은 10에서 1씩 줄기 시작해서 10프레임
후엔 0이 됩니다.
hittime: Hitdef의 hittime. 맞아서 회복되는데 걸리는 전체 시간
slidetime: Hitdef의 slidetime. 맞았을 때 밀림이 멈추는데까지 걸리는 시간
ctrltime: 공격을 가드(막다)한 후 컨트롤가능하게 되기까지 시간
recovertime: 넘어졌을 때 일어나기 전까지 시간. 이 값은 0을 향해 점점 줄기 시작하는
데 방향키를 흔들거나 버튼을 연타하면 더 빨리 줄어듭니다.
xoff: "Snap" x offset when hit (deprecated) hitdef의 snap의 x위치?
yoff: "Snap" y offset when hit (deprecated) hitdef의 snap의 y위치?
zoff: "Snap" z offset when hit (deprecated) hitdef의 snap의 z위치? z위치가 뭘뜻하는
지 모르겠군요.
xvel: 맞아서 x방향 밀려나는 속도. hitdef의 velocity들에 있음 (당연히 정수가 아닌 실수)
yvel: 맞아서 y방향으로 뜨는 속도 (역시 실수)
yaccel: Hitdef 의 yaccel값. 맞고 넘어질 때 y 축 가속도 (실수)
chainid: Player-assigned chainID for last hit taken. (int)
마지막 맞은 공격의 chaninID 값인듯 (정수)
guarded: 마지막 받은 공격을 가드했을 경우 1을 돌려주며 아니면 0을 돌려줍니다.
isbound: 플레이어가 상대의 TargetBind 명령의 영향을 받고있으면 1값을
돌려줍니다. 던져지는 스텟에서 버그방지하는데 유용하다는군요(2vs2대전시
p2stateno가 있는 hidef공격이 맞자마자 또다른 상대에게 맞을 경우 발생하는
걸 말하는 듯. 맞은쪽만 스텟이동되는 것). (윈무겐 전용입니다)
fall: 다운되면 1(TRUE), 아니면 0(FALSE)값을 돌려줍니다.
fall.damage: Damage taken upon fall (int) 넘어진 상태에서 받은 대미지인 듯 (정수)
fall.xvel: 바운드(튕김)될 때 x속도. Hitdef의 fall.xvelocity 값 (실수)
fall.yvel: 바운드(튕김)될 때 y속도. Hitdef의 fall.yvelocity 값 (실수)
fall.recover: 낙법이 가능하면 True(1)값을 주며 그렇지 않으면 false(0)값을 줍니다.
fall.recovertime: 낙법이 가능하게 되기까지의 시간.
fall.kill: 넘어진 상태에서 맞았을 때 ko될수 있는가. 역시 hitdef의 fall.kill값
fall.envshake.time: hitdef의 fall.envshake.time 값. 맞고 넘어질 때 지면이 흔들리는
시간(정수)
fall.envshake.freq: hitdef의 fall.envshake.freq 값. 지면 흔들리는 주기(실수)
fall.envshake.ampl: hitdef의 fall.envshake.ampl 값. 지면 흔들리는 너비(정수)
fall.envshake.phase: Returns values set by the fall.envshake.*
parameters in an attacker's hitdef. (실수)
예)
trigger1 = GetHitVar(yvel) < -5.5
맞고 뜰 때 y속도가 -5.5 미만일 때
------------------------------------------------------------
HitCount
------------------------------------------------------------
한 스텟에서 공격을 맞춘 횟수입니다. 다른 스텟으로 넘어가면 0이 됩니다.
Uniqhitcount 랑 다른점은, 같은 공격(hitdef)을 2명의 상대에게 맞췄을 때 hitcount는 1만
증가하지만 Uniqhitcount는 2가 증가합니다.
예)
trigger1 = HitCount > 8
공격스텟이 시작되고 나서 그 스텟 내에서 한 상대에게 공격을 맞춘 횟수가 8회
초과일때
------------------------------------------------------------
HitDefAttr(*,***)
------------------------------------------------------------
활성화되어있는 hitdef의 attr 값. 써본적은 없군요.
형식
HitDefAttr [oper] value1, value2
[oper] 에는 =, != 중에 하나가 들어갈수 있다.
value1
A string that has at least one of the letters "S", "C"
and "A" for standing, crouching and aerial attacks
respectively. For example, "SA" is for standing and
aerial attacks.
S, C, A중 하나이상이 들어가는데 각각 서서공격, 앉아공격, 공중공격이며 hitdef의
attr 값에서 따옵니다. SA처럼 2가지를 쓰면 서서공격이나 앉아공격 이런식으로 되는듯
value2
A set of 2-character strings, separated by commas.
Each 2-character string must be of the form described:
The first character is either "N" for "normal", "S" for
"special", or "H" for "hyper". The second character must
be either "A" for "attack" (a normal hit attack) or "T"
for "throw". For example, "NA, ST" is for normal attacks
and special throws.
2개의 문자가 조합되는데 첫 번째 문자는 N(노멀), S(스페셜:기술), H(하이퍼:필살기)
이며 두 번째 문자는 A(공격), T(잡기)입니다. 역시 hitdef의 attr값을 검사합니다.
form:
arg1, arg2
then the trigger condition is determined to be true only
if arg1 is a subset of value1, AND arg2 is a subset of
value2.
예를들어 S, NA 라고 쓰면 서서 노멀공격일 경우 인 듯 합니다.
예)
trigger1 = A, HA
(원문은 이렇지만 틀린 것 같네요. trigger1 = hitdefattr = A, HA 이어야겠죠?)
공중 필살기 일 때
trigger1 = SC, NA, SA
(역시 틀린 것 같네요. trigger1 = hitdefattr = SC, NA, SA 이겠죠)
서서나 앉아서 공격이어야 하고 노멀공격이거나 스페셜공격(기술)일 때
------------------------------------------------------------
HitFall
------------------------------------------------------------
맞는 스텟에 있을 때 다운이 되는 상태라면 1값을 반환하고 그렇지 않으면 0값을 줍니
다. 예를들어 Hitdef의 fall 값이 1인 경우 그공격에 맞으면 Hitfall 값은 1이 됩니다.
예)
trigger1 = !HitFall
다운이 안될때(또는 다운되는 스텟으로 가게 하지 않을때)
------------------------------------------------------------
HitOver
------------------------------------------------------------
hitdef의 hittime 이 다되면 1값을 돌려줍니다. gethitvar(hittime)값이 0을 향해 계
속 줄어드는데 이 값이 0이 될 경우 1값을 돌려주는 듯.
주로 common1.cns 의 맞는 스텟들에 쓰였습니다
예)
trigger1 = HitOver = 1
hittime 이 만료될 경우. 뒤의 = 1 은 생략해도 됩니다. 반대로 쓰고싶으면
!hitover 로 씁니다.
------------------------------------------------------------
HitPauseTime
------------------------------------------------------------
공격을 맞췄을 때 hitdef의 pausetime 값으로 정해지고 그후로 값이 1/60 초당 1씩 줄어들
어 0으로 향합니다.
If ignorehitpause is not set, this will always return 0.
ignorehitpause 가 정해지면 줄지 않을수도 있다는데 아마 ignorehitpause = 0 으로 설정이
되면 hitpausetime 값이 줄지 않는다는 뜻인 듯한데 ignorehitpause=0을 쓸 이유가 없죠.
이 Hitpausetime은 히트경직중에 값이 변하기 때문에 ignorehitpause = 1을 붙여서 쓰는게
일반적입니다. ignorehitpause 는 11-CNS명령 파일의 처음부분에 설명되어있습니다.
예)
trigger1 = HitPauseTime = 0
공격의 경직이 끝났을 때.
또한 이 Hitpausetime 은 공격을 맞춘 직후 상대의 머리에서 피가 나게 한다거나 하는 효
과를 줄 때 등에 쓸수 있습니다.
예를들어 pausetime 이 15인 공격일 경우 trigger1 = Hitpausetime = 14 로 하면 공격을
맞춘 직후 라는 뜻이 되는데 ignorehitpause = 1과 같이 써야 합니다. 제캐릭터 진념의
강발 등에 쓰였습니다.
------------------------------------------------------------
HitShakeOver
------------------------------------------------------------
공격당했을때 경직이 끝나면 1을 반환, 안그러면 0을 반환합니다.
Hitdef의 pausetime의 경직을 말합니다. common1.cns의 맞는 스텟들에 쓰였습니다.
Example:
trigger1 = HitShakeOver = 0
맞아서 경직된 상태일 때
------------------------------------------------------------
HitVel
------------------------------------------------------------
공격에 맞았을 때 밀려나는 속도
hitvel x 는 x속도, hitvel y 는 y속도입니다.
원문에서는 각 값이 +인게 뒤로 밀려나거나 뜨는 거라고 나와있지만 틀렸군요.
다른것과 마찬가지로 두 속도가 -이면 뒤로 밀려나거나 위로 뜨는 겁니다.
이 값은 맞은 공격의 Hitdef에 설정된 값을 그대로 가져오게 되며 다음 Hitdef에 맞기
전까진 값이 유지됩니다.
예를들어 지상에서 ground.velocity = -13 인 Hitdef에 맞으면 Hitvel x = -13이 됩니다.
예)
trigger1 = HitVel X < -10
밀려나는 x속도가 -10 보다 작을때
------------------------------------------------------------
ID
------------------------------------------------------------
플레이어들의 ID값이며 각 플레이어는 고유의 ID값을 가집니다. 근데 1:1대전과 2:2대전
시의 값이 틀리고 어디다 쓰라는건지 모르겠습니다.
예)
value = ID
값을 ID값으로 해라
------------------------------------------------------------
IfElse
------------------------------------------------------------
조건을 검사해서 만족할때와 그렇지 않을 때 각각 다른 값을 줍니다. 쓸모가 많습니다.
형식
IfElse(조건, 조건만족시의값, 조건불만족시의값)
예)
value = ifelse(var(3),1,2)
var(3)의 값이 0이 아니면 값을 1로 정하고 그렇지않으면 2로 정해라.
주의할점은 조건을 쓸 때 enemynear, 같이 ','(콤마)가 들어가는 조건을 쓸 경우 괄호를
하나 더 쳐서 쓰지 않으면 에러나서 튕깁니다.
예를들어 ifelse(enemynear,statetype=C,-30,-50) 이렇게 쓰면 에러가 나므로
ifelse((enemynear,statetype)=C,-30,-50) 이렇게 써야 에러가 안납니다.
------------------------------------------------------------
InGuardDist(윈무겐 전용입니다 웬만하면 쓰지 맙시다)
------------------------------------------------------------
Returns 1 if the player is within guarding distance of an opponent's physical or
projectile attack. The guarding distance is the value of the guard.dist parameter of
the opponent's HitDef. Returns 0 if out of guard distance, or the opponent is not
attacking.
guard.dist안에 있을 경우 1값을 반환하며 그렇지않으면 0값을 반환합니다. guard.dist값은
Hitdef의 것을따른다고 하는데 Cns처음부분의 attack.dist에도 영향을 받는 듯
윈무겐의 common1.cns 의 가드하는 스텟들에 쓰였군요
------------------------------------------------------------
IsHelper
------------------------------------------------------------
헬퍼인지 아닌지 검사합니다. 괄호안에 아이디를 쓸수도 있습니다.
CNS에서 나오지만, 헬퍼의 아이디는 헬퍼를 생성할 때 정해줄수 있습니다.
예)
1. trigger1 = !IsHelper
헬퍼가 아닐 경우
2. trigger1 = IsHelper(1234)
ID 가 1234인 헬퍼일 경우
------------------------------------------------------------
IsHomeTeam
------------------------------------------------------------
홈팀일 경우 1, 안그러면 0값을 줍니다.
아케이드모드에서는 CPU가 홈팀이 됩니다만 버서스 모드에서는 1P쪽의 캐릭터들이 홈팀이
됩니다. AI를 만들 때 필요한 것 같지만 버서스모드에선 1P가 홈팀이 돼버리는 문제 때문에
대체 어디다 쓰라고 있는 트리거인지 모르겠군요.
예)
trigger1 = ishometeam
음...너무 간단해서 원문에도 사용예는 나와있지 않군요. 앞으로 이런건 설명안해도 되겠죠?
------------------------------------------------------------
Life
------------------------------------------------------------
플레이어의 현재 체력
예)
trigger1 = life <= 10
체력이 10 이하일 때
------------------------------------------------------------
LifeMax(윈무겐전용. 역시 안쓰길 권장)
------------------------------------------------------------
플레이어의 cns의 life =? 값입니다. 체력 최대치를 뜻합니다.
------------------------------------------------------------
Log
------------------------------------------------------------
로그값을 구하는 삼각함수입니다. 수학책을 보시는게 나을 듯.
예를들면 log(2,64) 는 64의 2에대한 로그값?을 구하는것인데, 2를 몇면 제곱해야 64가
나오느냐 하는것이므로 값은 6.0이 됩니다.
Takes two arguments a and b, and returns the base-a logarithm of b.
Format:
Log(exp1,exp2)
Arguments:
exp1
Expression giving the base of the logarithm. Must be positive.
exp2
Expression giving the value to take the logarithm of. Must be
positive.
Return type:
float
Error conditions:
Returns SFalse if either of exp1 or exp2 evaluates to SFalse, or if
either of exp1 or exp2 is not positive.
Example:
value=log(2,64)
Sets value to the base 2 log of 64, which is 6.0.
------------------------------------------------------------
Ln
------------------------------------------------------------
역시 프로그래밍 하는 사람들은 삼각함수까지 알아야 하나 봅니다. ln값을 구합니다.
ln이 아마 지수가 10인 로그던가? 역시 수학책을 봅시다.
Returns the natural logarithm of its argument. This produces slightly
more accurate results than the otherwise equivalent expression
log(e,(argument)).
Format:
ln(exprn)
Arguments:
exprn
Expression to compute the natural logarithm of (float).
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse, or if exprn is not
positive.
Example:
value = ln(time)
Sets value to the natural logarithm of the player's statetime.
------------------------------------------------------------
Lose
------------------------------------------------------------
졌을 경우 1 안그러면 0을 줍니다만 3가지가 있습니다.
형식
1. Lose - 아무 상황으로나 졌을때
2. LoseKO - 체력이 바닥나서 졌을때
3. LoseTime - 시간이 다돼서 졌을때
예)
1. trigger1 = Lose
졌을때
2. trigger1 = !LoseKO
타임오버로 졌거나 이겼을 때
------------------------------------------------------------
MatchNo
------------------------------------------------------------
몇번째 스테이지냐 하는것입니다.
버서스 모드에서는 무조건 값이 1이 됩니다.
예)
예) trigger1 = matchno > 3
3스테이지를 통과한 이후. 즉 4스테이지 이후부터. 제캐릭터 드레이븐에서 레벨업이후
체력증가에 쓰였습니다.
------------------------------------------------------------
MatchOver
------------------------------------------------------------
스테이지가 끝나면 값이 1이 되고 안그러면 0이 됩니다.
그러니까 3판2승제라면 2번째 이긴 라운드에서 승리포즈취하기 직전까진 0이고
승리포즈를 취함과 동시에 1이 됩니다.
윈무겐에선 도스무겐보다 좀 빨리 1이 되는데 승자가 결정되기 전에 1이 됩니다.
예)
trigger1 = matchover
스테이지 끝나고 승리포즈 취한후
------------------------------------------------------------
MoveContact
------------------------------------------------------------
공격이 상대에게 닳았을 경우(히트하거나 가드했을 때) 1, 안닳으면 0이 됩니다. 스텟이 넘
어갈 경우 0으로 초기화됩니다.
하지만 주의할점은 Movecontact와 이 밑의 movehit, moveguarded 는 만족할 경우
도스무겐에서는 값이 1로 유지되지만 윈무겐에서는 1,2,3,4 식으로 계속 증가합니다.
따라서 윈무겐에서도 캐릭을 쓰려면 movecontact = 1 대신, movecontact > 0 으로
써주어야 합니다. 밑의 movehit, moveguarded 도 같습니다.
예)
trigger1 = MoveContact > 0
공격이 닳았을 때
------------------------------------------------------------
MoveGuarded
------------------------------------------------------------
공격을 상대가 가드했을 경우 1, 안그러면 0이 됩니다.
예)
trigger1 = MoveGuarded > 0
공격이 막혔을 경우
------------------------------------------------------------
MoveHit
------------------------------------------------------------
공격이 히트했을(맞았을) 경우 1, 안그러면 0값을 반환합니다.
예)
trigger1 = MoveHit > 0
공격을 맞췄을 경우
------------------------------------------------------------
Movereversed(윈무겐 전용입니다. 웬만하면 쓰지 맙시다)
------------------------------------------------------------
공격이 리버설된 경우 1, 안그러면 0값을 반환합니다(원문엔 0이 아닌값을 준다고 돼있는데
1값을 줍니다). Hitdef의 Reversaldef명령에의해 리버설된 경우를 말합니다.
예)
trigger1 = MoveReversed
P1의 공격이 P2에 의해 리버설된 경우
------------------------------------------------------------
MoveType(*,***)
------------------------------------------------------------
플레이어의 movetype 입니다.
예)
trigger1 = movetype != H
movetype 이 H가 아닐 경우(맞는상태가 아닐경우)
------------------------------------------------------------
Name(*,***)
------------------------------------------------------------
DEF파일에 쓰여있는 캐릭터의 NAME을 검사합니다.
캐릭터간 인트로를 만들 때 authorname과 enemy, 같은 것들과 같이 쓰입니다.
enemy, 같은것들은 이 문서 맨 마지막 부분에 설명되어 있습니다.
예)
trigger1 = Name = "Kyo99"
캐릭터명이 kyo99 일 때.(하지만 이렇게 자체적으론 거의 안쓰이죠. 자기이름 검사해서
뭐합니까...)
------------------------------------------------------------
NumEnemy
------------------------------------------------------------
적의 숫자입니다. 중립플레이어와 노멀헬퍼는 포함되지 않음. 중립 플레이어란게 뭔지
모르겠네요. 헬퍼생성시 헬퍼타입을 player로하면 적숫자에 포함되는 듯 하지만 헬퍼타입
player를 쓰지 말라고 sctrl.txt파일에 나와있습니다.
trigger1 = NumEnemy = 2
trigger1 = enemynear(1), name = "Squash"
적의 수가 2명일 때. 2번째로 가까이 있는 적의 이름이 Squash 일 경우
------------------------------------------------------------
NumExplod
------------------------------------------------------------
cns에서 효과 스프라이트를 내는 명령인 explod가 있는데 그 명령에 의해 생긴
explod의 수를 검사합니다. 괄호를 쳐서 ID를 검사할수도 있습니다.
예)
1. trigger1 = NumExplod >= 4
자기가 발생시킨 모든 explod개수가 4개 이상일 경우
2. trigger1 = NumExplod(1234) >= 4
ID가 1234인 Explod의 개수가 4개 이상일 경우
------------------------------------------------------------
NumHelper
------------------------------------------------------------
발생시킨 헬퍼의 개수. 역시 괄호를 쳐서 아이디로 검사가능합니다.
헬퍼에서 발생시킨 헬퍼라도 개수에 포함됩니다. 즉 플레이어가 근원인 전체 헬퍼 개수.
예)
1. trigger1 = NumHelper < 2
헬퍼개수가 2개 미만일때
2. trigger1 = NumHelper(1234) < 2
ID가 1234인 헬퍼의 개수가 2개 미만일 때
------------------------------------------------------------
NumPartner
------------------------------------------------------------
파트너의 수. 역시 뉴트럴 플레이어와 노멀헬퍼는 고려되지 않는다네요.
예)
trigger1 = NumPartner = 1
trigger1 = partner, life < 200
파트너가 1명 있고 그 파트너의 체력이 200미만일 때
------------------------------------------------------------
NumProj
------------------------------------------------------------
cns명령인 projectile로 발생시킨 프로젝타일 개수. 주의점은 헬퍼에서 만든 프로젝타일일
지라도 본체캐릭터의 소유가 되므로 헬퍼에서 검사할땐 root, numproj 처럼 써야 합니다.
예)
trigger1 = NumProj = 0
프로젝타일이 없을 경우
------------------------------------------------------------
NumProjID
------------------------------------------------------------
위와 같지만 아이디로 검사합니다.
예)
trigger1 = NumProjID(1234) = 1
ID 번호가 1234인 프로젝타일이 1개일 때
------------------------------------------------------------
NumTarget
------------------------------------------------------------
타겟 개수. 공격을 맞췄고(막아도됨) 맞은 상대가 movetype = H일 경우 타겟에
포함됩니다. 상대의 movetype 이 H가 아닐 경우엔 타겟에서 벗어납니다.
괄호를 쳐서 아이디로 검사할수도 있습니다.
자기가 맞춘 대상만 포함되므로 헬퍼같은게 맞춘 대상은 본체나 다른 헬퍼의 타겟에
포함되지 않습니다.
예)
1. trigger1 = Numtarget >= 1
공격에 닳은 상태의 상대가 1명 이상일 때
2. trigger1 = Numtarget(200) >= 1
ID 200의 공격에 닳은 상태의 상대가 1명 이상일 때
------------------------------------------------------------
P1Name(*,***)
------------------------------------------------------------
This is an alias for the Name trigger. See "Name".
이름. Name 과 뭐가 틀린지 모르겠습니다.
------------------------------------------------------------
P2BodyDist
------------------------------------------------------------
상대와 거리인데 p2bodydist x는 플레이어의 앞쪽 몸체너비부터 상대의 앞쪽 몸체너비
까지의 거리입니다. 앞쪽 몸체너비란 front.width 값을 말하는데 cns처음부분의
ground.front(지상에 있을 때) 와 air.front(공중에 있을 때) 값에 따라 정해집니다.
p2bodydist y는 p2dist y랑 값이 같게 나오는데 어떨때 틀리게 나오는지 모르겠군요.
p2bodydist 값이 -일 경우 상대보다 위쪽에 있는걸 뜻합니다.
그런데 p2가 들어가는 트리거들의 경우 2명이상의 상대와 싸울 때 가장 가까이 있는
상대를 기준으로 하긴 하지만 그게 제대로 작동하지 않고 멀리있는 상대를 기준으로
돼버릴 때도 있습니다. 이 문제는 윈무겐의 docs폴더의 파일에도 나와있긴 한데 정확히
고쳐졌다고 나와있진 않습니다. 따라서 상황에 따라 enemynear, 같은 명령어를 쓰는게
더 나을 듯 합니다.
별로 중요하지 않지만, 값은 실수입니다.
Details:
For comparing the Y-distance, P2BodyDist gives the difference in the
heights of the players' Y-axes. A negative value means that P2 is
above P1.
For comparing the X-distance, P2BodyDist gives the
X-distance of P2's front from P1's front. So, if the
players are standing right next to each other, then
P2BodyDist is 0. Remember that you can set the width of
the player in "front.width", etc. under [Size] in the
player variables.
See also P2Dist.
예)
trigger1 = P2BodyDist X < 30
플레이어의 몸체앞쪽너비부터 상대몸체앞쪽너비까지 거리가 30픽셀 미만일 경우
------------------------------------------------------------
P2Dist
------------------------------------------------------------
플레이어의 x축과 상대 x축 까지의 거리입니다.
p2dist y는 p2bodydist y 랑 뭐가 틀린지 모르겠습니다. 설명도 같네요.
Details:
For comparing the Y-distance, P2Dist gives the difference in the
heights of the players' Y-axes. A negative value means that P2 is
above P1.
For comparing the X-distance, P2Dist gives the X-distance
of P2's axis from P1's axis. A positive value indicates P2
is in front of P1.
See also P2BodyDist.
Example:
trigger1 = P2Dist Y <= -12
상대보다 12픽셀 이상 높이 있을 때
------------------------------------------------------------
P2Life
------------------------------------------------------------
상대의 체력입니다. 적이 2명이상일 경우 가까이 있는 적의 체력을 검사합니다.
------------------------------------------------------------
P2MoveType
------------------------------------------------------------
상대의 movetype을 검사.
------------------------------------------------------------
P2Name(*,***)
------------------------------------------------------------
상대의 def파일에 있는 name을 검사. 역시 2인대전시는 가까이있는쪽의 name을 검사하
게 되고 상대가 1명이 ko됐으면 살아있는 상대의 name을 검사합니다.
상대가 모두 ko돼서 바닥에 쓰러진 경우 값은 0(false)이 됩니다.
------------------------------------------------------------
P2StateNo
------------------------------------------------------------
상대의 stateno(스텟넘버)를 검사
------------------------------------------------------------
P2StateType
------------------------------------------------------------
상대의 statetype을 검사
------------------------------------------------------------
P3Name(*,***)
------------------------------------------------------------
같은편의 name을 검사합니다. 같은편이 ko된 상태라도 작동합니다.
같은편이 없는 경우에만 무조건 0(false)값을 줍니다.
------------------------------------------------------------
P4Name(*,***)
------------------------------------------------------------
상대가 2명 이상일 때 더 멀리있는 상대의 name을 검사합니다. 상대가 ko당했어도
작동합니다.
상대가 1명이면 값은 무조건 0.
------------------------------------------------------------
PalNo
------------------------------------------------------------
캐릭터의 팔렛번호
캐릭을 고를 때 선택되는 def파일에 나와있는 대로의 팔렛번호 입니다.
DEF에도 설명돼있지만
A - 1 B - 2 C - 3 X - 4 Y - 5 Z - 6 이고 스타트버튼을 누를 경우 6이 더해
지며, 해당팔렛이 없을 경우엔 그다음 팔렛으로 선택됩니다.
예를들어 스타트버튼을 누른채 B버튼을 눌렀는데 8번팔렛부터 12번 팔렛까지 없다면 1번
팔렛이 골라지며 1번팔렛을 이미 골랐다면 2번팔렛으로 되는 식입니다.
예)
trigger1 = PalNo = 5
팔렛번호가 5일 때
이 트리거는 sanderx씨의 캐릭에 쓰였는데 어느 버튼으로 고르냐에 따라서 캐릭의 버전이
바뀌는걸 구현했습니다.(하지만 복잡하다는 단점이 더 크죠)
------------------------------------------------------------
ParentDist
------------------------------------------------------------
헬퍼에서만 쓰이는 트리거. 자신을 만든 부모와 자신과의 거리.
parentdist x 는 부모의 x축과 자신의 x축간의 거리이고 parentdist y로 하면 y축간의
거리입니다.
예)
trigger1 = ParentDist X != 0
부모와의 x위치가 다를때(조금이라도 떨어져있을 경우)
------------------------------------------------------------
Pi
------------------------------------------------------------
Pi값인 3.141593을 나타냅니다. 이것도 무슨 고급 물리나 수학에서 나오는듯.
This trigger returns the numeric value of pi (3.141593...)
Format:
pi
Arguments:
none
Return type:
float
Error conditions:
none
------------------------------------------------------------
Pos
------------------------------------------------------------
플레이어의 x,y축을 기준으로 현재 플레이어의 위치를 검사합니다.
pos x는 x위치, pos y는 y위치를 검사합니다.
화면의 정중앙이 pos x = 0 이며 왼쪽으로 갈수록 -, 오른쪽으로 갈수록 +가 됩니다.
스테이지의 바닥은 pos y = 0이며 위로 갈수록 -, 밑으로 갈수록 +가 됩니다.
중요하진 않지만 값은 실수
예)
trigger1 = Pos Y >= 0
플레이어의 y축 위치가 스테이지 바닥밑으로 내려갔을 때
(주로 넘어지는 스텟에 쓰입니다)
------------------------------------------------------------
Power
------------------------------------------------------------
기(파워)게이지의 양을 검사. 1000이 기 한칸입니다.
예)
trigger1 = power >= 1000
기게이지 레벨이 1이상일 때
------------------------------------------------------------
PowerMax(윈무겐전용)
------------------------------------------------------------
CNS처음부분의 power =? 값입니다. 기(파워)게이지의 최대치. 보통 3000(Lv3)입니다.
------------------------------------------------------------
PlayerIDExist
------------------------------------------------------------
해당 ID를 지닌 플레이어가 존재하느냐 인데 앞서 말했듯 ID값은 몇 명 대전을 하느냐에
따라 달라지므로 쓰기 어정쩡.
예)
trigger1 = PlayerIDExist(var(4))
var(4)와 같은 ID의 플레이어가 존재할 경우
------------------------------------------------------------
PrevStateNo
------------------------------------------------------------
바로이전 스텟번호를 검사
예)
trigger1 = prevstateno = 100
직전 스텟넘버가 100(달리기)이었을 경우
------------------------------------------------------------
ProjCancelTime
------------------------------------------------------------
처음 값은 -1 이며 프로젝타일이 상대프로젝타일에 의해 사라지는 경우 이 값이 0으로
설정된 후 1프레임당 1씩 계속 증가하게 됩니다.
프로젝타일이 사라질땐 Hitflag = P가 들어가는 hitdef에 의해 사라질수도 있는데 이경우엔
ProjCancelTime 에 영향을 주지 않습니다.(그러니까 상대 프로젝타일에 의해 사라진 경우
만 projcanceltime값이 증가합니다.)
괄호안에 검사할 프로젝타일의 아이디를 쓰는데 0을 쓸 경우 프로젝타일의 아이디를
체크하지 않습니다. 즉 projcanceltime(0)은 플레이어의 프로젝타일중에 아무거나가
상쇄되면 0,1,2... 이렇게 증가합니다.
예)
1. trigger1 = ProjCancelTime(1234) = 1
ID 1234의 프로젝타일이 상대 프로젝타일에 의해 사라진 직후
2. trigger1 = ProjcancelTime(0) != -1 && ProjcancelTime(0) < 15
아무 프로젝타일이 상쇄된 후 15프레임 이내
------------------------------------------------------------
ProjContact(*,***)
------------------------------------------------------------
프로젝타일이 상대에게 닳으면 True(1)값을 줍니다. 뒤에 괄호를 치지 않고 아이디번호
를 쓸수있는데, 아이디번호를 쓰지 않거나 0으로 하면 역시 아무 프로젝타일이 닳으면
true값을 줍니다. 프로젝타일이 닳은 후 True값이 된 후엔 값이 바로 0으로 돌아옵니다.
그런데 이상한 것은 trigger1 = projcontact = 1에서 값을 1이상의 아무 숫자로 줘도
마찬가지입니다. projcontact = 2 나 projcontact = 15 이렇게 줘도 projcontact = 1과
같게 작동하는군요. 분명히 설명에선 1이나 0이라고 했는데 말이죠.
그리고 밑의 두 번째 형식처럼 쓸수 있는걸 보니 각 프레임마다 값이 존재하는 듯 하며
이때문인지 Displaytoclipboard명령으로 볼수가 없어서 애매하군요(에러남)
형식
1. ProjContact[ID] = value
2. ProjContact[ID] = value, [oper] value2
이렇게 쓸수도 있는데 뜻은 아래 Details에 나와있습니다만 해석이 애매해서 원문을
놔뒀습니다.
Arguments:
[ID]
Optional ID number.
value (boolean)
Value to compare against. 0 for false, 1 for true.
[oper]
=, !=, <, >, <=, >=
value2
Time value to compare against.
Return type:
boolean int
Details:
ProjContact will trigger once for each hit of the projectile, so a
multi-hit projectile can trigger multiple times.
The first form of ProjContact shown above is only valid for one tick
after contact, unlike MoveContact.
For the second form, ProjContact returns true if the projectile made
contact n ticks ago, where n is a nonnegative number satisfying the
relation "n [oper] value2".
Specifying an ID number of 0 gives the same behavior as if the ID
number is omitted (check all projectiles).
(원문의 boolean은 불 논리 연산=피연산자가 가능(可) 불가능(不) 으로 결과가 나오는
이라고 사전에 나와있군요. 0-불가능 1-가능 이런식입니다)
예)
1. trigger1 = ProjContact1234 = 1
ID 1234의 프로젝타일이 상대에게 막 닳았을 때(닳은 직후)
2. trigger1 = ProjContact456 = 0, < 15
이전 15프레임 내에 ID 456의 프로젝타일이 닳지 않았다면(모르겠으면 cns에서
실험해보거나 밑의 projhit나 projguarded를 보시길)
------------------------------------------------------------
ProjContactTime
------------------------------------------------------------
형식과 값의 변화는 위 projcanceltime과 같지만 이것은 프로젝타일이 닳았을 경우 값이
0,1,2... 이런식으로 증가합니다.
예)
1. trigger1 = ProjContactTime(1234) = 1
아이디 1235의 프로젝타일이 닳은 직후
2. trigger1 = ProjContactTime(0) != -1 && ProjContactTime(0) < 15
아무 프로젝타일이 닳은 후 15프레임 이내
------------------------------------------------------------
ProjGuarded(*,***)
------------------------------------------------------------
projcontact와 같지만 이건 프로젝타일이 막혔을때(가드당했을때)를 감지합니다.
형식 설명도 projcontact와 같군요.
예)
1. trigger1 = ProjGuarded1234 = 1
아이디 1235의 프로젝타일이 가드당한 직후
2. trigger1 = ProjGuarded = 1, < 15
이전 15프레임 사이에 아무프로젝타일이 가드당했을 때
(바꿔말하면 프로젝타일이 가드당한 후 15프레임 이내)
------------------------------------------------------------
ProjGuardedTime
------------------------------------------------------------
역시 projcanceltime과 같지만 프로젝타일이 가드당했을 때 값이 0,1,2...식으로 증가.
예)
1. trigger1 = ProjGuardedTime(1234) = 1
아이디 1235의 프로젝타일이 가드당한 직후
2. trigger1 = ProjGuardedTime(0) != -1 && ProjGuardedTime(0) < 15
아무 프로젝타일이 가드당한후 15프레임 이내
------------------------------------------------------------
ProjHit(*,***)
------------------------------------------------------------
마찬가지로 projcontact 등과 같지만 프로젝타일이 맞았을때(히트했을때)를 감지합니다
예)
1. trigger1 = ProjHit1234 = 1
아이디 1234의 프로젝타일이 히트한 직후
2. trigger1 = ProjHit1234 = 1, < 15
이전 15프레임 이내에 아이디 1234의 프로젝타일이 히트했을 때
(역시 바꿔말하면 아이디 1234의 프로젝타일이 히트한 후 15프레임 이내)
------------------------------------------------------------
ProjHitTime
------------------------------------------------------------
이하동문. projcanceltime 등과 마찬가지지만 이것은 프로젝타일이 히트했을 때 값이
0,1,2... 식으로 증가합니다.
예)
1. trigger1 = ProjHitTime(1234) = 1
아이디 1234의 프로젝타일이 히트한 직후
2. trigger1 = ProjHitTime(0) != -1 && ProjHitTime(0) < 15
아무 프로젝타일이 히트한 후 15프레임 이내
------------------------------------------------------------
Random
------------------------------------------------------------
랜덤수를 발생시킵니다. 수는 0부터 999사이에 정해집니다.
이 Random이란 글자가 나올때마다 무겐은 랜덤수를 만듭니다.
예)
trigger1 = Random <= 249
랜덤값이 249이하일 때(즉 25%확률로 라는 뜻이 됩니다.)
------------------------------------------------------------
RootDist
------------------------------------------------------------
헬퍼에만 사용되는 트리거. 자신을 만든 근원의 x,y축 부터 자신의 x,y축까지의 거리를
구합니다.
Rootdist x는 가로거리, Rootdist y는 세로거리입니다.
예)
trigger1 = RootDist X != 0
루트의 x위치와 다를 때
------------------------------------------------------------
RoundNo
------------------------------------------------------------
라운드 번호입니다.
예)
trigger1 = RoundNo = 3
3라운드일때
------------------------------------------------------------
RoundsExisted
------------------------------------------------------------
자신이 싸운 라운드가 몇번 있었냐 하는겁니다. 첫 라운드의 값은 0이 되며 스테이지
넘어가도 0이 됩니다.
이것은 Turns모드에서의 인트로를 만들 때 유용합니다.
예)
trigger1 = RoundsExisted = 0
trigger1 = TeamMode = Turns
trigger1 = RoundNo > 0
자신이 싸우는 첫 라운드이고 게임모드가 Turns일 때. 3번째 조건은 1라운드 이후일
때 라는건데 당연한 것이니까 무의미한 조건인 것 같군요.
당신은 이 예를 사용하여 초기화 스텟인 5900(라운드 처음 시작시 맨처음 시작스텟)에
changestate명령과 같이써서 팀모드 인트로를 만들 수 있다. 고 하는군요.
------------------------------------------------------------
RoundState
------------------------------------------------------------
라운드의 상태를 나타내는데 라운드 시작시 0부터 시작해서 라운드 끝나면 4가 됩니다.
각 값이 나타내는 것은 다음과 같습니다.
Details:
0: 화면이 페이드인 될 때(맨처음 라운드 시작시 화면 밝아지는 순간)
1: 캐릭터가 인트로(등장 포즈나 이벤트대사 등)를 할때
2: 캐릭터가 싸울때(라운드 x 파이트! 란 글자가 뜬 후)
3: 라운드가 끝났을 때.(캐릭터의 체력이 바닥나거나 타임오버 됐을때
4: 캐릭터가 승리포즈를 취할 때
예)
trigger1 = RoundState = 2
싸우는 중일 때
------------------------------------------------------------
ScreenPos
------------------------------------------------------------
화면의 왼쪽 위 구석부터 얼마만큼의 위치에 있느냐 하는것입니다.
왼쪽 구석이 screenpos x = 0이 되고 오른쪽으로 갈수록 값이 +가 되고 왼쪽으로 갈수록
-가 됩니다.
화면의 맨위 꼭대기가 screenpos y = 0이 되고 밑으로 갈수록 값이 +되고 위로갈수록
-됩니다.
예)
trigger1 = ScreenPos Y = [0,239]
캐릭터 y위치가 화면 꼭대기부터 밑으로 239 픽셀 내에 있을 때
------------------------------------------------------------
SelfAnimExist
------------------------------------------------------------
Animexist와 같은데 animexist는 맞아서 상대방의 스텟에 가있는 경우 그 상대의 AIR파일
을 검사하기 때문에 대부분 이 selfanimexist를 씁니다.
예) trigger1 = selfanimexist(200)
애니매이션번호 200이 존재할때
------------------------------------------------------------
Sin
------------------------------------------------------------
삼각함수의 sin값을 구합니다.
Computes the sine of the specified argument (in radians.)
Format:
sin(exprn)
Arguments:
exprn
Expression to compute the sine of. (float)
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = sin(pi/2)
Sets value to the sine of pi/2, which is approximately 1.0
(possibly with some rounding error.)
------------------------------------------------------------
StateNo
------------------------------------------------------------
스텟넘버를 검사
예)
trigger1 = stateno = [200,650]
스텟번호가 200~650 사이일 때
------------------------------------------------------------
StateType
------------------------------------------------------------
스텟타입을 검사. S,C,A,L중에 하나죠.
예)
trigger1 = StateType != A
스텟타입이 A가 아닐때
------------------------------------------------------------
SysFVar
------------------------------------------------------------
무겐의 변수중에 var와 fvar말고도 sysvar(정수)와 sysfvar(실수)가 있습니다.
현재 윈무겐까지는 sysvar(0), sysvar(1), sysvar(2) 만이 common1.cns 에 사용되었습니다.
원문엔 쓰지 말라고 하는 듯. 원문입니다.
This trigger takes a mandatory variable number as an argument. It
returns the value of the player's specified system float variable.
This trigger should NOT be used under normal circumstances. System
variables are reserved for bookkeeping in common1.cns.
(cns)근데 상대캐릭터를 특정 스텟으로 강제로 이동시킨후에 var를 써야만하는 경우가 있
는데 그냥 var를 쓰면 맞은 캐릭터의 var를 바꿔버리므로 안되니까 그럴 땐 이 sysvar(4)
같은걸 쓰도록 합시다.
sysvar나 sysfvar나 0-4 까지 쓸수 있습니다.
예)
trigger1 = SysFVar(0) = -1.23
sysfvar(0)이 -1.23일 경우
------------------------------------------------------------
SysVar
------------------------------------------------------------
sysfvar는 실수변수지만 sysvar는 정수변수입니다. 역시 0-4 까지 쓸수있긴 한데 sysvar(0)
과 sysvar(1)과 sysvar(2)는 공통스텟(common1.cns)에 쓰였으므로 쓰면 안됩니다.
예)
trigger1 = SysVar(0) = -34
sysvar(0)이 -34일 경우
------------------------------------------------------------
Tan
------------------------------------------------------------
삼각함수 탄젠트값을 구합니다.
Computes the tangent of the specified argument (in radians.)
Format:
tan(exprn)
Arguments:
exprn
Expression to compute the tangent of. (float)
Return type:
float
Error conditions:
Returns SFalse if exprn evaluates to SFalse.
Example:
value = tan(pi/4)
Sets value to the tangent of pi/4, which is approximately 1.0
(possibly with some rounding error.)
------------------------------------------------------------
TeamMode(*,***)
------------------------------------------------------------
플레이의 모드값을 구합니다.
single - 싱글플레이
simul - 시뮬플레이
turns - 턴플레이
예)
trigger1 = TeamMode = Single
싱글플레이일때
------------------------------------------------------------
TeamSide
------------------------------------------------------------
라운드 시작시 1P쪽은 1이 되고 2P쪽은 2가 됩니다.
이 트리거는 기게이지를 표시한다든지 할 때 유용합니다.
예)
trigger1 = TeamSide = 2
2P쪽일 때
------------------------------------------------------------
TicksPerSecond
------------------------------------------------------------
실제시간 1초에 몇프레임인지 구합니다. 원래 60인데 게임속도를 slow 9로 하면 15가
되는군요.
예)
trigger1 = Time > 10 * TicksPerSecond
게임스피드에 상관없이 실제시간 10초 이후일 때
------------------------------------------------------------
Time
------------------------------------------------------------
스텟의 시간입니다.
스텟이 시작하면 0부터 시작해서 1프레임당 1씩 계속 증가합니다.
예)
trigger1 = Time = 2
타임이 2일 때. 란 뜻이긴 하지만 자세히 말하자면 time=2일때가 아니라 time=1에서
time=2로 넘어가는 순간을 뜻합니다.(animelem = ? 과 같음)
주의할점은 헬퍼에서 본체의 time을 검사할 경우엔 값을 1더해야 한다는 것입니다.
예. 헬퍼에서) trigger1 = parent, time = 3
부모의 time이 2일 때.
항상실행스텟인 [statedef -?]에서 검사할때도 값에 1을 더해야 합니다.
이렇게 해야하는 이유는 cns의 실행 순서가 일반스텟->헬퍼->항상실행스텟(statedef -?)
이기 때문인 것 같습니다.
* 마찬가지로 캐릭터가 스텟에 오자마자(time=0에) 적의 공격을 막는(가드스텟으로 가는)
경우가 있는데 이경우엔 만약 스텟시작하자마자 poweradd=-1000같은(필살기같은데
쓰이는)게 있을 경우 기만 날리고 기술은 안나가는 경우가 생길수 있습니다. 따라서 이런
상황을 막기 위해서 이런건 trigger1 = time = 1 이렇게 씁시다.
------------------------------------------------------------
TimeMod(*,**,***)
------------------------------------------------------------
스텟의 time을 나눈 나머지를 구합니다. %대신 쓰는게 추천된다고 하는군요.
형식
TimeMod [oper] divisor, value1
Arguments:
[oper]
=, !=, <, >, <=, >=
divisor (int)
나눌 수(0이 아니어야 함)
value1 (int)
나뉠 수
예)
trigger1 = TimeMod = 4, 3
스텟의 time을 4로 나눈 나머지가 3일 경우 그러니까 스텟타임이 각각 3, 7, 11, 15,
...일 경우를 뜻합니다. trigger1 = time%4 = 3과 같습니다.
근데 위에나온 부호인 <, >= 같은건 어떨 때 쓰는지 모르겠군요. 설명에 나온
위치대로 timemode < 4,3식으로 쓰면 에러나네요. timemod = 4, < 3이렇게 쓸수는
있습니다. 각자 실험해봅시다.;
------------------------------------------------------------
UniqHitCount
------------------------------------------------------------
한 스텟에서 공격이 히트한 횟수입니다. hitcount와 다른점은 공격이 2명이상의 상대에
게 맞았을 때 hitcount는 1만 증가하지만 이 uniqhitcount는 맞춘 수대로 증가합니다. 2명한
테 맞췄다면 2증가 이런식입니다.
예)
trigger1 = UniqHitCount = [4,6]
공격이 들어간 횟수가 총 4~6번 사이일 때
------------------------------------------------------------
Var
------------------------------------------------------------
무겐에서 쓸 수 있는 정수변수. var(0) ~ var(59) 까지 쓸수 있습니다.
예)
trigger1 = Var(0) = -34
var(0)이 -34일 경우
------------------------------------------------------------
Vel
------------------------------------------------------------
속도입니다. vel x는 x속도, vel y 는 y속도입니다.
예)
trigger1 = Vel Y >= 0
y속도가 0이상일 때(밑으로 떨어질 때)
------------------------------------------------------------
Win
------------------------------------------------------------
이겼는가를 뜻합니다. 다음의 4가지가 있습니다.
1. Win - 결과적으로 이겼는가
2. WinKO - ko로 이겼는가
3. WinTime - 타임오버로 이겼는가
4. WinPerfect - 퍼펙트로 이겼는가
예)
1. trigger1 = Win
이겼을 때
2. trigger1 = !WinKO
KO로 이기지 않은 경우
------------------------------------------------------------
1
------------------------------------------------------------
항상실행. 즉 trigger1 = 1 이렇게 쓰면 그 스텟 내에서 해당 명령을 계속 실행해라 하는
것이 됩니다.
주의할점은 trigger1 = 1을 쓰면 다른스텟으로 넘어가는 순간까지 해당명령이 실행되기
때문에 cns의 changestate명령이나 selfstate명령에 의해 스텟이 바뀐후에도
1프레임동안(다음스텟의 time = 0일때까지) 해당명령이 실행되게 됩니다.
따라서 정확히 그 스텟 내에서만 명령이 실행되게 하고 싶으면 trigger1 = animtime < 0
이런식으로 상황에 맞게 써줘야 합니다.
==== (여기까지 일단 트리거들 설명 끝이고 추가적으로) =========================
====================================================================
Trigger redirection
====================================================================
원래 exp.txt에 있는거지만 여기 있는게 나을 것 같아서 여기 써놨습니다.
트리거를 쓸 때 자기자신의 조건 말고도 헬퍼나 상대의 상태를 검사할수도 있습니다.
예를들어 trigger1 = time = ? 이러는 것 외에 trigger1 = parent, time = ? 이라고 하면
parent의 time값을 검사합니다. parent니 뭐니 하는건 밑에 설명.
쓸 수 있는 종류는 다음과 같습니다.
*) parent
자기자신을 만든 부모를 뜻합니다. 헬퍼에 쓰이는데 예를들어 캐릭터 A가 있고 A가 생성
시킨 헬퍼 B가 있고 헬퍼B에서 만든 헬퍼C가 있다고 쳤을때
B의 parent는 A가 되고 C의 parent는 B가 됩니다.
B의 스텟에서 trigger1 = parent, time = ? 이라고 하면 A의 스텟타임을 검사하는것입니다.
*) root
자신을 만든 근원(?). 위와 같은 상황에서 B와 C의 root는 A가 됩니다.
*) helper
자신이 만든 헬퍼를 뜻하는데 그냥 helper, 라고 쓰면 맨처음 만든 헬퍼를 뜻한다고
하네요. 그런데 그냥 helper, 로는 거의 쓰지 않고 밑과 같이 helper(ID)로 씁니다.
*) helper(ID)
헬퍼를 만들 때 아이디를 줄수있는데 그 아이디를 가진 헬퍼를 뜻합니다. helper(1234), 라
고 하면 ID 1234의 헬퍼를 뜻합니다.
*) target
공격을 맞춘(막아도 포함) 첫 번째 상대. 이것도 그냥 target으로는 거의 쓰지않고 밑처럼
ID를 줘서 씁니다. 상대의 movetype 이 H일경우에만 되며 상대 movetype이 H가 아닐
경우 타겟에서 벗어납니다.
원문: Redirects the trigger to the first target found.
첫 번째 상대라곤 하지만 2명이상이 같이 맞았을땐 아무 타겟이나 찍는군요.
*) target(ID)
공격판정을 낼 때 ID를 정해줄수 있는데 이걸 이용해 해당 공격에 맞은 타겟을 검사합니
다. target(200), 라고 쓰면 ID 200 인 공격에 맞은 타겟을 뜻합니다.
*) partner
2대2 대전 등을 할 때 같은편 파트너를 뜻합니다. 노멀 헬퍼와 뉴트럴 플레이어는 파트너
에 속하지 않는다고 하는데 하여튼 헬퍼를 제외한 같은편은 파트너로 간주됩니다.
*) enemy
첫 번째 적. 역시 노멀헬퍼와 뉴트럴플레이어는 간주되지 않는다는군요.
*) enemy(n)
괄호안의 숫자는 몇번째 적이냐 하는걸 뜻한다는데 써보지 않아서 정확한 건 모르겠군요.
첫 번째가 2p이고 두 번째가 4p쯤 되지 않을까 싶군요.
*) enemyNear
가장 가까이 있는 적
*) enemyNear(n)
n번째 가까이 있는 적. 0이 가장 가까이 있는적이고 1이 두 번째 가까이 있는 적인듯.
*) playerID(ID)
해당 아이디를 지닌 플레이어. ID를 보려면 displayclipboard 나 appendtoclipboard를 써
서 id를 봐야하는데 이 아이디가 1:1 할 때와 1:2 랑 2:2 할 때 각각 다르므로 대체 어디다
쓰는건지 모르겠습니다.
이들중 2가지이상 중복하여 쓰면 에러납니다. 예) root,target,time = ? 처럼 쓰면 에러.
===================================================================
트리거가 잘못될 경우 캐릭선택시 튕기거나 작은 잘못일 경우 디버그모드에서 흰색글씨로
나온다거나 하므로 메시지를 확인하고 해당부분이 왜 에러가 나는지 생각해서 제대로
고칩시다.
작은 잘못은 예를들어 trigger1 = target(10), stateno = 1031 이라고 썼는데 아이디 10인
타겟이 없을 경우 디버그모드에서 타겟이 없다고 흰색 글씨로 계속 뜨게 됩니다. 이럴
경우는
trigger1 = numtarget(10) > 0
trigger1 = target(10), stateno = 1031
이런식으로 고쳐줘야 합니다. numtarget(10) > 0이 항상 위에 있어야 하고 꼭 두줄로 써야
하며 한줄로 쓰면 마찬가지로 흰색글씨 뜹니다. 예를들어
trigger1 = numtarget(10) > 0 && target(10), stateno = 1031
이렇게 한줄로 묶어서 쓰지말고 꼭 위처럼 2줄로 써야 흰색글씨가 뜨지 않습니다.
이런 건 안고쳐도 게임엔 문제없지만 디버그모드사용시 흰색글씨가 계속뜨는게 보기 안좋으
므로 고치는 거랍니다.
선생님 : Ihoo1836
댓글목록 0
등록된 댓글이 없습니다.