1. script 폴더 구조
정해진 건 아닌데, 스크립트 파일에는 두 가지 형식이 있다고 약속하자.
하나는 스크립트 파일 (진짜로 코드를 작성하는 파일)
다른 하나는 헤더 파일 (다른 스크립트를 참조하는 파일)
DR 통파일 안의 script 폴더에 스크립트 파일들이 들어 있다.
각 파일들은 script/script_load.txt라는 파일에서 처음 참조된다.
스크립트를 참조하는 방식은 두가지다.
script: script/script_file.txt
스크립트 파일을 참조하는 script:
import: script/subfolder/list.txt
참조파일을 참조하는 import:
이게 무슨 소리더냐?
script: 로 작성하면, 스크립트 파일을 등록하는 거고,
import: 로 작성하면, 헤더 파일을 참조한다.
script_load.txt 파일 script: script/npc.txt import: script/부여성/list.txt
import 대상의 파일 이름이 list.txt일 필요는 없는듯?
이렇게 되면 npc.txt 라는 스크립트 파일과 부여성 폴더에 있는 list.txt 참조 파일을 참조한다.
그럼 부여성 폴더 안의 list.txt파일을 읽어서 또 스크립트 파일이나 헤더 파일을 읽는다.
이걸 무한반복한다.
+- script_load.txt +- npc.txt +- 부여성 +- 주모.txt +- 달걀귀신.txt ... ...
사실 따지고보면 구동기에서는 폴더는 신경쓰지 않는다.
오직 스크립트 파일을 읽어서, 각 스크립트를 로드하는 것만 신경쓴다.
이건 우리가 보기 편하게 구조가 대강 저렇다는 걸 알려주고 싶은 것이다.
2. 스크립트 소스 구성
스크립트 소스가 어떻게 작성됐는지,
스크립트 종류에는 어떤 게 있는지 볼 것이다.
something.txt
npc 주모 { onclick: set @id, myid(); set @sd, mysd(); dialog, 0, 0, 1, "환영합니다."; end; }
코딩 공부를 조금이라도 한 사람은 금방 이해할 것이다.
코딩 전혀 모르는 사람은 이 영문자들이 뭘 뜻하는 거지.. npc니까 npc인 것 같긴 한데...
라고 생각들듯.
npc : npc에 적용될 스크립트임을 알려준다.
주모 : 스크립트 이름이다. 절대로 유니크해야한다. 즉, 겹치면 안된다.
중괄호로 묶인 부분 : 스크립트 소스 부분이다.
onclick: : npc의 이벤트 라벨로, npc를 클릭하면 발생하는 이벤트다.
보통 c코드면 라벨은 점프하는 건데, 여기도 마찬가지라고 보면 된다. 해당 위치에서 코드를 수행한다.
set @id, myid(); :
'설정한다' '@id라는 변수에' 'myid()함수의 결과값을'
이 제일 직관적인 설명이다.
함수 인자1, 인자2, 인자3 형태로 소스는 구성된다.
set이라는 건 구동기에 내장된 함수인데, 인자1에 인자2를 넣는다.
dialog도 마찬가지다.
dialog가 써져 있고, 숫자 3개가 있고, 뒤에 뭐라뭐라 적혀 있다.
대충 보면 대화창을 띄우는데, 숫자 3개는 모르겠고, 뒤에가 대화 말 같다.... 라고는 느낄 수 있을 것이다.
함수 사용 방식은 이처럼 다 똑같다.
end; : 소스 수행을 중단하고 스크립트를 빠져나간다. 더 이상 스크립트 진행이 불필요할 때 써주면 된다.
스크립트 종류에는 npc, item, magic, mob, floor, timer, function 이 있다.
NPC
npc npc_script_name { oninit: // npc가 생겨났을 때(처음)만 발생하는 초기화 이벤트 set @id, myid(); set @sd, mysd(); end; onclick: // npc를 클릭했을 때 이벤트 set @id, myid(); set @sd, mysd(); end; onsay: // 유저가 말했을 때 이벤트 @userid // 유저 오브젝트 @last_say$ // 마지막으로 들은 대화 end; }
ITEM
item item_script_name { onuse: // 무기 사용시 이벤트 // 아마 소모성 아이템 사용이나 // 아이템을 휘두를 때 발생 end; onequip: // 무기 장착시 이벤트 end; onunequip: // 무기 장착 해제시 이벤트 end; }
MAGIC
magic magic_script_name { oncast: // 마법을 실행했을 때 end; onuncast: // 마법이 해제됐을 때(시간이 다 되어 풀리거나, uncast스크립트 실행시) end; onconcast: // 지속마법일 때 end; onrecast: // 지속 중에 로그인시 실행 end; }
MOB
mob mob_script_name { oninit: // 몬스터 만들어졌을 때(한번)만 실행 end; onmove: // 몬스터가 한발짝 움직였을 때 end; onattack: // 몬스터가 공격 트리거 실행 end; onsay: // 유저가 말했을 때 // npc와 동일 @userid @last_say$ end; onclick: // 몬스터가 클릭당함 @userid // 누가? end; ondamaged: // 데미지입음 // 스크립트에 의해 damage로도 발생하는지는 실험 필요 @attackerid // 누가? end; ondead: // 죽음 end; }
FLOOR
floor floor_script_name { onpress: // 타일 밟았을 때 end; }
TIMER
every 00:00:00 { // 매 00:00:00 시각에 발생 } every 10 { // 매 10초마다 발생 }
FUNCTION
function function_name { set @arg1, getarg(0) }
빼먹은 게 있을지 모르겠따. 생각나면 추가하기로..
그런데 아닛? 스크립트에 웬 펑션?
우리가 모두 아는 그 함수처럼 사용하면 된다.
인자를 받아서 수행하고, 값을 반환한다.
함수에 관한 자세한 이야기는 언젠가 다음에 하기로 하고...
프리바람 레전드의 귀환, 동시접속자수 1위!
답글삭제봄온라인으로 초대 합니다!
홈페이지 주소 : https://freebarambom.com/