안녕하세요

 

오랜만에 글 올립니다.

 

선언하기를 이번시간에 강좌를 해보겠습니다.

 

아마 다른거 보다는 간단한 강좌가 될꺼 같습니다.

 

선언하다. == set

 

@ $ #  이 문구는 변수 시간에 알려드렸습니다.

 

근데 웃긴건.. 앞에 set 이라고 되어 있는데 이걸 설명을 않해 드린거 같습니다.

 

set 은 말그대로 명령, 선언 으로 쓰이는 함수로 활용 방식은

 

set *, *;   입니다.

 

변수를 만들때 이 함수를 쓰이게 되는겁니다.

 

set @asdf1;

 

선언하다. 임시변수asdf, 값은 1;

 

 

 

 

if 문 강좌에서 이 선언한 문구를 가지고 활용 합니다.

 

위에 저렇게 선언을 해야

 

if(@asdf == 1)  <- 요놈이 실행이 되겠지요.

 

set @zxcv, 1; 이걸로 선언해 놓고

 

if(@asdf == 1) 이걸로 쓴다면 없는 생성이 안된 임시변수라 사용을 못합니다.

 

 

또 다른 활용법으로

 

set @asdf, get_purehp(mysd());   [[ 여기서 get_purehp 란 순수 체력 구해오기 함수 입니다 ]]

 

요렇게 설정하면 @asdf 라는 임시 변수에 케릭의 순수체력 숫자가 담기는 거죠

 

 

자.. if 문이란 무엇일까요?

 

개인적으로 if 문 활용만 잘하면 CR의 스크립트는 70% 이상 마스터 할수 있다고 자신있게 판단 합니다.

 

대부분의 스크립트는 if문이 가장 기초일테니깐요.

 

 

각설하고..... 네이버 사전을 뒤적여 봤습니다.

 

 

- if -

1. (가정적 조건을 나타내어) (만약) …면
2. (으레 그렇게 된다는 법칙적인 조건을 나타내어) …면, …하기만 하면

 

네. 그렇습니다.

 

만약 뭐뭐 라면... 이라는 뜻입니다.

 

강좌 2문에서 보셨듯이 서버변수, 계정변수, 임시변수가 있습니다. ( 물론 마법상태 체크 등 여러가지가 있겠지요. )

 

이걸 활용 하는겁니다.

 

 

ex) 1번

스크립트 시작 {

if($asdf == 1) { dialog 0,0,0, "하이"; }

else { dialog 0,0,0, "말걸지마"; }

 

}스크립트 끝

 

ex) 2번

스크립트 시작 {

set $asdf, 1;

if($asdf == 1) { dialog 0,0,0, "하이"; }

else { dialog 0,0,0, "말걸지마"; }

 

}스크립트 끝

 

 

자 2강에서 보셨던 스크립트 입니다.

 

잘 보시면 if 문이 들어가 있습니다.

 

왜 들어가있을까요?

 

저기에 쓰이는 $ 이건 무엇일까요? [ 계정변수 ]

 

if문은 거기서 나타내는겁니다.

 

 

 

if($asdf == 1) // 만약(계정변수에 적힌 asdf 가 1일때)

 

한글로 요렇게 해석이 되겠습니다.

 

얼라? 예제문에 보면 else 라는 단어가 있어요.

 

이게 무엇일까요?

 

if문에는 3개로 분류 할수 있습니다.

 

ifelse ifelse

만약그게 아니고 이거라면이도 저도 아니라면

네. 이해 못하시는분들을 위해 한글로 번역하자면

 

if문은 요 3개가 묶여 있습니다.

 

순서대로 나열하자면

 

if > else if > else

 

순이 되겠습니다.

 

if 뒤에는 else if 또는 else 가 나올수가 있고

 

if 뒤에 바로 else 가 나올수 있습니다.

 

그러나!!

 

처음부터 else if 또는 else 나올수는 없습니다.

 

이유인즉!!

 

이해를 쉽게 하기 위해 한글로 표현하겠습니다.

 

ifelse ifelse

만약그게 아니고 이거라면이도 저도 아니라면

 

그게 아니고 이거라면만약, 이도저도 아니라면 // 순서가 이상하죠??

 

그래서 if > else if > else 순으로 되어 있는 겁니다.

 

 

다시 한번 예제를 봅시다.

 

예제 1)

스크립트 시작 {

if($asdf == 1) { dialog 0,0,0, "하이"; }

else if($asdf == 2) { dialog 0,0,0, "방가"; }

else { dialog 0,0,0, "말걸지마"; }

 

}스크립트 끝

 

순서대로 나열해 봤습니다.

 

우선 첫째줄인..

 

 

 

if($asdf == 1) { dialog 0,0,0, "하이"; }

만약(계정변수에 저장된 asdf 가 1일때 { 대화창 : 하이 }

 

 

else if($asdf == 2) { dialog 0,0,0, "방가"; }

그게 아니고 만약(계정변수에 저장된 asdf 가 2일때 { 대화창 : 방가 }

 

 

else { dialog 0,0,0, "말걸지마"; }

위에 제시된 계정변수에 저장된 asdf 가 1도 아니고 2도 아닐때 { 대화창 : 말걸지마 }

 

 

 

이해 되시나요?

 

else 는 총괄로 볼수 있습니다.

 

위에 제시된 2가지의조건이 아니면.. 그러니까..

- 계정변수에 $asdf 라는게 없거나 숫자가 3이상일때  -

 

라는 조건으로 되겠지요.

 

끗~!

 

 

 

 

 

 

강좌 1번을 읽으신분들중에 스크립트는 위에서 부터 아래로 차례때로 읽는다. 라고 적은적이 있습니다.

 

한가지..... 여기서 만약에.........

 

 

예제 1

if($asdf == 2) { dialog 0,0,0, " 멍청이 "; set $asdf, 1; }

else if($asdf == 1) { dialog 0,0,0, " 바보 "; }

 

 

예제 2

if($asdf == 2) { dialog 0,0,0, " 멍청이 "; set $asdf, 1; }

if($asdf == 1) { dialog 0,0,0, " 바보 "; }

 

요렇게 되어 있습니다.

 

예제 1번일 경우 멍청이 대화창뒤에 바보 대화창이 뜰꺼 같죠? 아닙니다. 안떠요.

 

if > else if > else

 

의문을 가지는 분들이 계실껍니다.

 

아니.. set $asdf, 1 로 했으니

 

밑에 asdf == 1 를 읽어야 되는거 아니냐? 라고 의문을 가지는 분들도 계실껍니다.

 

if 문은 한번에 포괄적으로 잡는다고 했죠?

 

if문 밑에 else 가 붙으면 두줄의 스크립트는 한개로 본다 이겁니다.

 

중요하니까 이거 기억하세요.

 

예제 2번을 봅시다.

 

if가 2줄이 있네요.그러나 else 가 안붙고 또 바로 if가 붙습니다.

 

무슨 차이 일까요?

 

네. 정답은

 

첫번째 줄을 읽고 그 밑에 줄도 또 읽는다 입니다.

 

멍청이 라는 대화창이 뜨고 예제1번과 틀리게 밑에 바보 라는 대화창도 뜹니다.

 

이것만 잘 기억해 두시면 if문 활용도 어렵지 않게 볼수 있습니다.

 

 

 

 

3강 IF 문 끗

변수란? // 변하는 수

 

라고 정의할수 있습니다.

 

처음 하시는분들은 헷갈리시죠?

 

자.. 여기서 더 헷갈리게 만들어 드리겠습니다.

 

@ 임시변수

$ 계정변수

# 서버변수

 

CR에서 쓰이는 변수는 3가지가 있습니다.

 

 

에게...? 3개밖에 없어? 간단하네. 라고 생각하시는분들을 위해 좀 더 헷갈리게 만들어 드리겠습니다.

 

 

@ 임시변수 : 한개의 스크립트 안에서만 적용되는 변수 // 아무것도 해당 되는 사항이 없는 無 의공간

$ 계정변수 : 해당되는 아이디에서만 적용되는 변수

# 서버변수 : 모든 아이디가 적용되는 변수

 

 

이쯤 되면 이해하시는 분들도 계실테고 아직도 헷갈리시는 분들이 계실껍니다.

 

아직 함수에대해 언급을 하지 않았으니 예제를 가지고 시작해 보겠습니다.

 

우선 변수를 사용하실려면 선언을 먼저 하셔야 됩니다.

 

@ $ # 에게 명령을 하는거죠

 

 

 

나쁜남자 : 무의공간에서 너에게 명령한다.

나쁜남자 : 너의 임시 이름은 @asdf 이다.

 - @asdf 라는 임시변수가 생겼습니다.

 - @asdf 라는 변수에게 아무 명령을 하지 않았습니다. 그러므로 기본세팅은 0

 

나쁜남자 : @asdf 라는 곳에 1이라는 임무를 주겠다. // 함수로 표현 : set @asdf, 1;

 

 

자. 이제 @asdf 라는 변수에게 선언을 하였으니 @asdf 에 해당되는 사항은 1 입니다.

 

선언을 하였으니 이제 활용을 해야죠.

 

활용편은 if문 강좌에서 시작하겠습니다.

 

일단 보시죠..

 

 

ex) 1번

스크립트 시작 {

if(@asdf == 1) { dialog 0,0,0, "하이"; }

else { dialog 0,0,0, "말걸지마"; }

 

}스크립트 끝

 

ex) 2번

스크립트 시작 {

set @asdf, 1;

if(@asdf == 1) { dialog 0,0,0, "하이"; }

else { dialog 0,0,0, "말걸지마"; }

 

}스크립트 끝

 

 

위 예제 2번을 보시면 아까 위에서 선언했던 set @asdf, 1; 이것을 보실수 있습니다.

 

예제 1번은 set @asdf, 1; 이게 없습니다.

 

같은 스크립트 입니다.

 

무슨 차이일까요? 과연 이렇게 실행되면 어떻게 될까요?

 

예지 1번 같은경우는 set @asdf, 1; 선언을 하지 않았습니다.

 

그러므로 else 부분에 말걸지마 라고 대화창이 뜹니다.

 

2번 일땐 하이 라고 대화창이 뜹니다.

 

두개의 NPC 를 만들고

1번 NPC에게 예제 1번 스크립트를 넣고

2번 NPC에게 예제 2번 스크립트를 넣어 봅시다.

 

2번을 클릭하면 하이라고 문구가 뜨겠지요?

근데 1번을 클릭하면 말걸지마 라고 문구가 뜹니다.

 

이상하네요? 분명 2번 NPC에서 set @asdf, 1; 를 선언했는데

1번을 클릭하면 왜 말걸지마가 뜰까요?

 

 

 

네 그렇습니다. 한개의 스크립트에서만 사용되는 임시변수를 사용했기 때문에 그렇습니다.

 

만약 @ 이걸 $ 이걸로 변경해 주면 어떻게 될까요?

 

똑같은 상황입니다.

 

 

ex) 1번

스크립트 시작 {

if($asdf == 1) { dialog 0,0,0, "하이"; }

else { dialog 0,0,0, "말걸지마"; }

 

}스크립트 끝

 

ex) 2번

스크립트 시작 {

set $asdf, 1;

if($asdf == 1) { dialog 0,0,0, "하이"; }

else { dialog 0,0,0, "말걸지마"; }

 

}스크립트 끝

 

두개의 NPC 를 만들고

1번 NPC에게 예제 1번 스크립트를 넣고

2번 NPC에게 예제 2번 스크립트를 넣어 봅시다.

 

1번을 클릭하면 말걸지마라고 문구가 뜨겠지요? 계정에 set $asdf, 1; 를 선언을 하지 않았습니다.

그뒤에 2번을 클릭하면 하이 라고 문구가 뜹니다.

다시한번 1번을 클릭해 볼까요?

 

어라? 얘도 하이 이러네요?

 

왜 그럴까요?

 

네 눈치채신분들도 있을껍니다.

 

@ 이건 한개의 스크립트에서만 활용되지만

 

$ 요건 해당 아이디 계정에 저장되는 변수 입니다. ( 퀘스트 쓸때 자주 사용 합니다 )

 

그러니 2번 NPC를 클릭하면 set $asdf, 1; 라고 계정에 $asdf 1 로 설정이 되어 버린겁니다.

한마디로 해당 아이디에 $asdf 라는 변수가 저장 된거죠.

따로 set $asdf 를 하지 않는이상 그 아이디는 이제 영구히 $asdf 가 1로 된겁니다.

 

이쯤되면 @ $ 요 두개는 이해가 되셨을꺼라 믿습니다.

 

 

이제 가장 중요한 서버변수 #

 

서버변수는 모든 유저들이 사용할수 있는 변수 입니다.

 

보통 이벤트 같은거 할때 많이 사용 되지요.

 

 

 

다음은 스크립트의 핵심 if 문에 대해서 알아보도록 합시다.

 

 

질문은 댓글로.

1

1. 스크립트는 절대적으로 위에서 아래순으로 읽는다.

 - 별거 아닌거 같지만 이거슨 진리.

 

2. 함수는 꼭 다 외워야 할 필요는 없다.

 - 몇몇 필요 또는 자주쓰는 함수는 외울필요가 있지만 스크립트에 쓰이는 함수 보다는 이런이런 함수가 무슨 역할이다. 라는 것만 알아두면 됨.

 

3. 스크립트를 짜기전에 무작정 짜기 보다는 처음 틀부터 완성 틀까지 대략적으로 그림을 그린뒤 만진다.

 - 이렇게 함으로서 완성도가 높아짐.

 

4. 주석을 달면서 만들면 추후 수정시 쉽게 수정이 가능하다.

 [명사] 낱말이나 문장의 뜻을 쉽게 풀이함. 또는 그런 글.

- ex)

if($asdf == 1) //계정변수에 $asdf == 1일땐 실행한다.

- 스크립트 뒤에 // 두개를 붙임으로서 뒤에있는 글자는 스크립트에서 제외

 

 

 

우선 이점만 알아두시면 될꺼(?) 같습니다.

 

다음은 함수 해석편을 쓰기전 일부 자주 쓰이는 함수에 대해 알아봅시다.

======================================================================

 

[목차]

1. 일부 함수가 비유저스크립트에서 작동하지 않는 문제 해결방법

2. 연속워프시 튕기는 문제의 해결조건

3. set_mobmagicstate 함수의 인자

4. mobstate란?

5. set_damagedrate 함수의 사용법

6. action 함수의 비밀

7. mob_spawn 함수의 비밀

8. magic_aether 함수의 비밀

9. showgage 함수의 비밀

10. damage 함수의 비밀

11. magic_delay 함수의 비밀

12. set_mobtarget 함수의 비밀

13. get_x, get_y 함수의 비밀

 

======================================================================

 

온전치 못한 CR의 함수들을 효과적으로 사용하는 데는 여러가지 노하우가 필요하다.

이를 사소한 것부터 복잡한 것까지 전부 나열하면 백가지도 넘겠지만

함수의 가장 기초적인 사용에 있어서 모르고 지나칠 만한 것 중 13가지만 언급을 해보겠다.

이런 것들을 잘 숙지하여 응용한다면 CR에서 쓰기 어려웠던 각종 기능을 구현하는데 도움이 될 것이다.

그 구체적 응용법은 꽤나 방대하기 때문에 여기서 다 설명하기는 어렵고, 차후 기회가 되면 정리해보겠다.

 

 

1. 일부 함수가 비유저스크립트에서 작동하지 않는 문제 해결방법

 

obj_getxy나 set_mobmagicstate 등의 몇몇 함수는 몹마법, NPCsay 등의 비유저스크립트에서 작동하지 않는다.

예를 들어 몹마법 스크립트 내에서 obj_getxy 함수를 써서 (3, 5)의 오브젝트값을 가져오고 싶다면,

계정변수, 서버변수를 임시변수처럼 다음과 같이 활용할 수 있다.

 

mob 몹마법 {

set @myid, objid();

set @target_id, get_mobtarget(@myid);

set @target_sd, id2sd(@target_id);

 

set_uservar_i @target_sd, "x", 3;

set_uservar_i @target_sd, "y", 5;

runscript @target_sd, "obj_getxy";

printf(" (3, 5) 지점의 obj_id: " + get_uservar_i(@target_sd, $obj_id));

}

script obj_getxy {

set @mysd, mysd();

set $obj_id, obj_getxy($x, $y);

}

 

즉, 몬스터가 obj_getxy 함수를 직접 쓸 수 없기 때문에

인자값들을 특정 유저의 계정변수 또는 서버변수들에 집어넣고

해당 함수를 대신 실행하게 하는 방법이다.

 

 

2. 연속워프시 튕기는 문제의 해결조건

 

warp 함수나 set_xy 함수 등을 이용해 유저가 순간적으로 워프를 2번하면 보통 튕겨버리게 되는데,

sleep 함수를 안쓰더라도 새로 읽어들이는 맵타일의 양이 충분히 적다면 이를 모면할 수 있다.

따라서, 맵크기가 1인 맵을 만들어놓고 순간이동으로 다녀온다면, 마치 ctrl+R을 누른 효과를 보는 셈이다.(모든 이펙트, 깨짐현상 제거)

 

 

3. set_mobmagicstate 함수의 인자

 

기본적으로 set_mobmagicstate에 대한 정보는 아래와 같이 알려져있다.

set_mobmagicstate @target_id, @spell_id, @aethered_time, @type, @effect, @c1, @c2, @c3;

 

MOB_GENERAL = 0, // 일반상태

MOB_POISON = 1, // 중독

MOB_COMA = 2, // 공격X, 이동X

MOB_HEAL = 3, // 이건아직 추가X

MOB_NOTATTACK = 4, // 공격 X

MOB_NOTMOVE = 5, // 이동 X

MOB_CURSE = 6, // 저주

MOB_ATTRACT = 7 // 유인

 

중요한 것은 각 인자들에 대한 구체적인 정보다.

직접 확인해본 바는 아래가 전부이며, 이외의 필요없는 인자는 0으로 놓으면 된다.

 

중독(@type == 1)의 경우 @c1: 중독량[%], @c2: -1(고정값), @c3: (0:최대체력비례, 1:현재체력비례, 2:최대체력비례+어그로, 3:현재체력비례+어그로)이며

참고로, 중독량에 음수값을 입력하면 재생량이 된다.

저주(@type == 6)의 경우 @c1: 저주량

유인(@type == 7)의 경우 @c1: 타겟id

 

덤으로 set_pcmagicstate에 대한 정보는 아래와 같다.

 

PC_GENERAL = 0, // 일반상태

PC_POISON = 1, // 중독

PC_HEAL = 2, // 재생

PC_? = 3, // ?

PC_INVULNERABLE = 4, // 무적

 

중독 또는 재생(@type == 1 || @type == 2)의 경우 @c1: 중독량/재생량, @c2:중독량/재생량[%], @c3:-1(%댐이면 고정값, 수치댐이면 0:방어무시, 1:방어적용)이나 @c1과 @c2 중 하나는 반드시 -1이어야 한다.

 

 

4. mobstate란?

 

아직 set_mobstate 함수의 기능이 정확히 알려져있지 않은데,

사실 set_mobmagicstate 함수가 주던 효과들을 수동으로 조정할 수 있게 해준다.

 

기본적으로 set @state_prev, get_mobstate(@target_id);는 대상 몹의 기존 상태값을 가져오며,

set_mobstate @target_id, @state;는 대상 몹을 @state_prev+@state에 '해당하는' 상태로 설정해준다.

이 설명만으로는 굉장히 어렵게 다가올 수 밖에 없으니 예시를 통해 이해해보자.

 

먼저 현재까지 확인한 각 효과의 상태값은 다음과 같다.

1:중독, 2:?, 4:이동불가, 8:공격불가, 16:유인, ...

예를들어 기본 상태(상태값 0)에서 set_mobstate @target_id, 4;하면 상태값이 4로 바뀌면서 이동불가상태가 된다.

마찬가지로 한번 더 +4를 해주면 상태값이 8로 바뀌면서 공격불가상태가 된다.

그런데 만약 여기서 또다시 +4를 해주면 어떻게 될까?

물론 상태값은 12가 된다. 그런데 12=8+4이므로 이동불가상태이면서 공격불가상태가 된다.

만약 상태값이 20이라면? 20=16+4이므로 유인상태이면서 이동불가상태가 된다.

 

이제 감이 좀 오는가? 이는 결국 하나의 상태값을 가지고 모든 상태 여부를 표시하기 위한 이진법적 표기법이라는 정도로 해두겠다.

즉, 몇개의 상태가 걸려있든 그 전체가 고유한 하나의 상태값으로 나타내어진다는 것이다.

 

또한, set_mobmagicstate 함수를 걸어놓고 get_mobstate나 mob_isstate로 그 상태를 확인할 수 있다.

예를들어 이동불가(@type == 5) 효과를 주는 set_mobmagicstate 함수와, 이동 및 공격불가(@type == 2) 효과를 주는 set_mamagicstate 함수를

걸어놓고 get_mobstate를 찍어본다면 결국 이동불가와 공격불가라는 두 종류의 상태가 걸려있는 셈이므로 4+8=12라는 상태값을 나타낼 것이다.

 

마지막으로, set_mobmagicstate 함수에 의한 상태는 절대적(취소되더라도 즉시 갱신됨)이다.

무슨 말이냐 하면, set_mobmagicstate로 이동불가(@type == 5)를 걸어서 상태값이 4가 되어있는 상태라면,

set_mobstate -4를 해줘서 0이 되었다가 걸려있는 set_mobmagicstate 함수에 의해 즉시 4로 돌아간다는 것이다.

더 신기한 건, set_mobmagicstate로 공격불가(@type == 4)가 걸려 상태값이 8인 경우를 생각해보자.

이때 set_mobstate -4를 해주면, 순간적으로 상태값 4가 되었다가 즉시 공격불가 상태값 8이 추가되므로 상태값 12가 된다.

한편, set_mobmagicstate가 풀리면 제거된 효과에 상당하는 만큼의 상태값이 감소하게 된다.

 

즉 정리하자면, set_mobmagicstate에 의해 걸린 효과는 상응하는 set_mobstate로 제거할 수 '없으나',

set_mobstate에 의해 걸린 효과는 상응하는 set_mobmagicstate가 풀리면서 제거될 수 있다.

따라서 그 원리를 잘 이해한다면, 그리고 이해해야만 유용하게 쓸 수 있는 것이 바로 mobstate 개념이다.

 

 

5. set_damagedrate 함수의 사용법

 

set_damagedrate는 참 이상한 함수다. set은 있는데 get이 없다.

사용법도 굉장히 특이하다. 일련의 테스트 끝에 다음의 룰에 의해 작동함을 알 수 있었다.

1. damagedrate 값 @a는 항상 0 이상의 값을 갖는다.

2. damagedrate 값 @a가 만약 0 이상 1 미만이면 (1-@a)*100%의 대미지를 받는다.

3. 그렇지 않으면 100%의 대미지를 받는다.

4. set_damagedrate @sd, @b를 해주면 damagedrate 값이 기존값 * @b로 바뀐다.

5. set_damagedrate @sd, -1를 해주면 damagedrate 기본값(1)으로 설정된다.

 

이건 뭐 그냥 엿먹으라는 것처럼 보일 수도 있지만..

뭐든지 쓰기 나름이니 허접한 무장체계를 보완하는 유용한 함수로 활용해보자!

 

 

6. action 함수의 비밀

 

action 함수는 몹에게도 적용될 수 있다.

특히 청의태자의 청룡마령참은 청의태자 3번액션에 해당한다.

청의태자 몹이 2번액션을 쓰도록 했더니 본적도 없는 주술액션이 나가는 것을 보고 깜짝 놀랐었다.

그러나 대부분은 0번액션 걷기와 5번액션 죽음, 그리고 25번액션 맞기 이외에는 없다.

가끔 버그에 의해서 어떤 액션번호를 쓰면 이미지순서에 따라 다른 몬스터 이미지로 변했다가 돌아오는 경우도 있다.

그리고 어떤 몹이 쓰는 액션과, 유저가 해당 몹 이미지로 변신하여 쓰는 액션과는 다소 차이가 있다.

마지막으로, action의 세번째 인자는 action의 지속시간을 의미하는데 최대값은 255이다.

 

 

7. mob_spawn 함수의 비밀

 

mob_spawn 함수의 5번째 인자인 @side에는 0~3보다 큰 값이 들어갈 수 있다.

각 방향에 대해 걷거나 때리거나 맞을 때, 죽을 때의 스냅샷이 나타난다.

이를 잘 활용하면 제공되지 않는다고 생각했던 다양한 이미지의 페이크를 만드는 데 도움이 된다.

 

 

8. magic_aether 함수의 비밀

 

magic_aether의 3번째 인자인 @aethered_time에 -1를 입력하면 지속시간이 무한으로 설정된다.

온오프 형태의 버프마법을 표시할 때 9999초처럼 지저분하게 쓰지 않아도 되는 것이 장점이다.

 

 

9. showgage 함수의 비밀

 

이 함수는 두가지 용도로 사용되는데, 하나는 대미지를 임의로 표시하는 것이고,

또 하나는 의도하지 않은 대미지 표시를 취소하는 것이다.

예를 들어 순간적으로 대미지를 2번 주면 표시되는 대미지는 실제와 달라지게 된다.

이럴 경우 참값을 수동으로 표시하기 위해 실제 대미지를 계산해서

showgage의 2번째 인자인 @damage에 입력하면 표시대미지를 참값으로 덮어씌울 수 있다.

한편, 대미지를 계산하기가 어려운 경우 0을 입력하면 힛게이지만 표시가 되고,

바로 전 순간의 쓸모없는 대미지는 표시되지 않는다.

 

 

10. damage 함수의 비밀

 

damage @myid, @target_id, @damage, @option;인 것이 잘 알려져있으나, 한가지 주의할 사항이 있다.

몹이 몹에게 대미지를 가하는 경우는 1번째와 2번째 인자의 순서가 뒤바뀐다는 것이다.

즉, 이런 경우 damage @target_id, @myid, @damage, @option이 된다.

또 한가지, 몹이 스폰되자마자 자살하면 튕김현상을 초래하니 이런 경우 최소 100ms의 딜레이라도 넣도록 하자.

 

 

11. magic_delay 함수의 비밀

 

CR에서의 magic_delay는 해당 마법스크립트에 적용되는 것이 아니라, 최근에 사용한 마법에 적용된다.

따라서 magic_delay 함수는 항상 sleep 함수 이전에 사용되어야 딜레이가 꼬이는 일이 없다.

 

 

12. set_mobtarget 함수의 비밀

 

몹이 맵의 가장자리에 있어서 몹이 유저를 볼 수 있지만 유저는 몹을 볼 수 없는 경우가 있다.

이런 상태의 몹들 여러마리에게 몹타겟을 지정해주게 되면 유저가 읽어들여야하는 맵 정보가 과다해져 서버에 튕김현상을 초래한다.

 

 

13. get_x, get_y 함수의 비밀

 

get_mob_x, get_mob_y 함수가 따로 있음에도 불구하고

get_x, get_y가 유저나 엔피시 뿐만 아니라 몹의 위치도 가져올 수 있다.

현재까지는 굳이 get_mob_x, get_mob_y를 써야할 이유를 찾은 바 없다.

또 비슷한 사례로, myid()도 objid()로 대체하여 써도 아무 문제 없었다.

이런 경우 유저와 몹에게 사용하는 함수를 하나로 통일하는 쪽을 택하는 편이 낫지 싶다.

1. str_support 함수를 활용한 조사 정하기

 

//callfunc "str_support", 기준, 메시지1, 메시지2;

function str_support {

if(strsupport(getarg(0)))

return getarg(1);

else

return getarg(2);

}

 

ex) 

.@item$ = "화요지석";

.@pos = dialog(0, 0, 1, "두 지석의 힘을 모아 " + .@item$ + callfunc("str_support", .@item$, "이", "가") + " 완성되었네!");

//두 지석의 힘을 모아 화요지석이 완성되었네!

 

.@item$ = "거울방패";

.@pos = dialog(0, 0, 1, "두 지석의 힘을 모아 " + .@item$ + callfunc("str_support", .@item$, "이", "가") + " 완성되었네!");

//두 지석의 힘을 모아 거울방패가 완성되었네.

 

 

2. 아이템 이미지 쉽게 가져오기

아이템디비에 있는 image를 셋팅할 때 흔히 1, 아이템이미지, 염색; 으로 가져오곤 한다.

하지만 디비에 있는 값이랑 매칭하려면 여러번 불편함을 감수해야 하는 단점이 있다.

 

//callfunc "item_image_setting", "아이템이름";

function item_image_setting {

image 1, get_itemdb_property(name2itemid(getarg(0)), "icon") - 49151, get_itemdb_property(name2itemid(getarg(0)), "iconcolor");

return;

}

 

ex)

callfunc "item_image_setting", "아이템이름";

//아이템 이미지의 값을 알아서 image 1, 아이템이미지, 아이템염색; 으로 셋팅해준다.

 

 

 

3. 숫자를 한글에 맞게 컨버팅하는 방법

예를 들어 120000000의 숫자를 한글로 표현해주고 싶지만 이를 쉽게 함수로 만들 수 있다.

pdr은 function의 반환값을 문자열로도 할 수 있기 때문이다.

 

//callfunc "conv_number", 숫자;

function conv_number {

.@number = getarg(0);

 

.@jo = .@number / 1000000000000;

.@eok = (.@number % 1000000000000) / 100000000;

.@man = (.@number % 100000000) / 10000;

.@one = .@number % 10000;

 

return ((.@jo > 0) ? (.@jo + "조 ") : "") + ((.@eok > 0) ? (.@eok + "억 ") : "") + ((.@man > 0) ? (.@man + "만 ") : "") + ((.@one > 0) ? .@one : "");

}

 

.@str$ = callfunc("conv_number", 120000000);

//.@str$ = "1억 2000만";

set_gm mysd(), 2;

 

say 이벤트 함수나 npc 또는 아이템 같은거에 저거 넣으면 GM 됩니다...

0 = 일반유저
1 = 부운영자(?)
2 = 최고레벨 권한

 

+ Recent posts