- °³¿ä
- ·ç¾Æ ¼³Ä¡
- ±¸Çö ¸ñÇ¥
- ±¸Çö ¼ø¼
- C++ ÂÊ¿¡¼ °ÔÀÓ °´Ã¼¸¦ ±¸Çö
- ·ç¾Æ¿¡¼ ¾²ÀÏ ·¡ÆÛ ÇÔ¼ö ±¸Çö
- ·ç¾Æ ÇÔ¼ö ±¸Çö
- ·ç¾Æ È£Ã⠺κР±¸Çö
- ÅëÇÕ
- ¿ä¾à
- ÁÖÀÇ»çÇ×
1 °³¿ä
Cpp ÇÁ·Î±×·¥¿¡´Ù°¡ ·ç¾Æ °¡»ó ¸Ó½ÅÀ» Áý¾î³Ö¾î º¸ÀÚ. ¸ñÀûÀº °£´ÜÇÑ ÇÔ¼ö ·¹º§ÀÇ Æ©Å丮¾óÀÌ´Ù. À¯Àú µ¥ÀÌÅÍ´Ï Å¬·¡½º´Ï µé¾î°¡¸é »ó´çÈ÷ º¹ÀâÇØÁö±â ¶§¹®ÀÌ´Ù. °Ô´Ù°¡ ·ç¾Æ°¡ ÁÖ(ñ«)°¡ µÇÁö ¾Ê´Â ÀÌ»ó, ÇÔ¼ö Á¤µµ·Îµµ ÃæºÐÇÏ´Ù.
·ç¾Æ¸¦ C++¿Í ¿¬µ¿½Ãų ¶§ ·ç¾Æ¿Í C++, µÑ Áß¿¡ ¾î´À ÂÊÀ» ÁÖÀÎÀ¸·Î »ïÀ»Áö´Â »ó´çÈ÷ Áß¿äÇÑ ¹®Á¦´Ù. ¿©±â¼ ÁÖÀÎÀ̶ó ÇÔÀº, ½ÇÁ¦ °´Ã¼°¡ ¾î´À ÂÊ¿¡ Á¸ÀçÇÏ´À³Ä´Ù. À½. ¹º°¡ Ç¥ÇöÇϱⰡ ¾î·Á¿îµ¥, °ÔÀÓÀ» ¿¹·Î µé¸é PC³ª NPC µîÀÌ ¾î´À ÂÊ¿¡ Á¸ÀçÇÏ´À³Ä ÀÌ ¸»ÀÌ´Ù.
- ·ç¾Æ ÂÊ¿¡ °ÔÀÓ °´Ã¼°¡ Á¸ÀçÇÏ´Â °æ¿ì: C++ ÂÊ¿¡¼ ·ç¾Æ Å×À̺íÀ» ¹Þ¾Æ¿Í Á¶ÀÛÇÑ ÈÄ, ·ç¾Æ¿¡°Ô ¾Ë·ÁÁÖ´Â Çü½ÄÀÌ µÈ´Ù. »ó´ç ºÐ·®ÀÇ ÄÚµùÀÌ ·ç¾Æ ÂÊ¿¡¼ ÀÌ·ç¾îÁö°í, ¸ÞÀÎ ·çÇÁµµ ·ç¾Æ ÂÊ¿¡ Á¸ÀçÇÏ°Ô µÈ´Ù. ¹°·Ð ±×·¸Áö ¾ÊÀ» ¼öµµ ÀÖ´Ù. Â¥±â ³ª¸§À̴ϱñ.
- C++ ÂÊ¿¡ °ÔÀÓ °´Ã¼°¡ Á¸ÀçÇÏ´Â °æ¿ì: ·ç¾Æ´Â C++ ÂÊÀ» ¹Ù·Î ¾×¼¼½ºÇÒ ¼ö ¾øÀ¸¹Ç·Î, ÀÌÀü¿¡ ÇÁ·Î±×·¡¸Ó°¡ °¡»ó ¸Ó½Å¿¡´Ù µî·ÏÇÑ ·¡ÆÛ ÇÔ¼ö¸¦ ÅëÇØ, C++ »óÀÇ °´Ã¼¸¦ Á¶ÀÛÇÑ ÈÄ À̸¦ C++¿¡°Ô ¾Ë·ÁÁÖ´Â ¹æ½ÄÀÌ µÈ´Ù.
°á±¹ ½ºÅ©¸³Æ® ¾ð¾î¸¦ ¾ó¸¶³ª ÁÖ¾ð¾î·Î ¸¹ÀÌ »ç¿ëÇÒ °ÍÀΰ¡¿¡ ´ëÇÑ À̾߱â¶ó°í ÇÒ ¼ö Àִµ¥, À§¿¡¼µµ À̾߱âÇßµíÀÌ ¿©±â¿¡¼´Â C++ ÂÊÀ» ÁÖ(ñ«)·Î ÇÑ´Ù. ¶ÇÇÑ LuaPlus °°Àº ¾ÖµåÀÎ ¶óÀ̺귯¸®´Â »ç¿ëÇÏÁö ¾Ê´Â´Ù. ÇÔ¼ö·Î¸¸ ³¡³¾ °ÍÀ̱⠶§¹®¿¡ Çʿ䰡 ¾ø´Ù.
2 ·ç¾Æ ¼³Ä¡
ÀÏ´Ü ·ç¾Æ ¶óÀ̺귯¸®°¡ ÀÖ¾î¾ß ÇÑ´Ù.
·ç¾Æ °ø½Ä »çÀÌÆ®¿¡¼ ¹èÆ÷º»À» ´Ù¿î·Îµå¹Þ´Â´Ù.
¹èÆ÷º»ÀÇ ¾ÐÃàÀ» Ç®¸é include µð·ºÅ丮¿Í src µð·ºÅ丮°¡ ÀÖÀ» °ÍÀÌ´Ù. ´Ù¸¥ µð·ºÅ丮µµ ¸¹´Ù¸¸ ´Ù ÇÊ¿ä¾ø´Ù.
- include - ¶óÀ̺귯¸® Çì´õ°¡ µé¾îÀÖ´Ù.
- src - ¶óÀ̺귯¸® ¼Ò½º°¡ µé¾îÀÖ´Ù.
- lib - ·ç¾Æ Ç¥ÁØ ¶óÀ̺귯¸®°¡ µé¾îÀÖ´Ù.
- lua - ·ç¾Æ ÀÎÅÍÇÁ¸®ÅͰ¡ µé¾îÀÖ´Ù.
- luac - ·ç¾Æ ÄÄÆÄÀÏ·¯°¡ µé¾îÀÖ´Ù.
ÀÌÁß¿¡ ½ÇÁ¦·Î ÇÊ¿äÇÑ °ÍÀº include, src, src/lib µð·ºÅ丮¿¡ µé¾îÀÖ´Â ÆÄÀÏ »ÓÀÌ´Ù. µû·Î ºôµåÇØµµ µÇÁö¸¸ ¿µ ±ÍÂú´Ù¸é, lib µð·ºÅ丮¿¡ µé¾îÀÖ´Â ¼Ò½º ÆÄÀϵµ ÇÁ·ÎÁ§Æ®¿¡ °°ÀÌ Ãß°¡Çؼ ºôµåÇØ¹ö·Áµµ µÈ´Ù. ¾î·µç ÀÌ·¸°Ô ºôµåÇϸé Çì´õ ÆÄÀϰú ¶óÀ̺귯¸® ÆÄÀÏÀ» °¡Áö°Ô µÈ´Ù!
3 ±¸Çö ¸ñÇ¥
Ç÷¹À̾ NPC¸¦ Ŭ¸¯Çϸé Ç÷¹À̾îÀÇ ¸í¼º¿¡ µû¶ó NPC°¡ ´Ù¸¥ ¸»À» Ãâ·ÂÇϵµ·Ï ¸¸µé¾îº¸ÀÚ! GUI±îÁö ´Ù Áý¾î³Ö¾î¼ ¸¶¿ì½º Ŭ¸¯ 󸮱îÁö ÇÏ´Â °ÍÀº ¾Æ¹«¸® »ý°¢Çصµ ¿À¹Ù~À̹ǷΠÄÜ¼Ö ÇÁ·Î±×·¥¿¡¼ °£´ÜÈ÷ ½Ã¹Ä·¹À̼ÇÇÏ´Â Á¤µµ·Î¸¸ ÇÏÀÚ.
4 ±¸Çö ¼ø¼
4.1 C++ ÂÊ¿¡¼ °ÔÀÓ °´Ã¼¸¦ ±¸Çö
class Player
{
public:
string name; // Ç÷¹À̾îÀÇ À̸§
int fame; // Ç÷¹À̾îÀÇ ¸í¼º
};
extern Player g_player;
class NPC
{
public:
string name; // NPCÀÇ À̸§
string click_script_name; // Ç÷¹À̾ Ŭ¸¯ÇßÀ» ¶§ ½ÇÇàÇÒ ½ºÅ©¸³Æ®ÀÇ À̸§
NPC(const string& n = "", const string& clicked = "")
: name(n), click_script_name(clicked) {}
}; ÀÏ´Ü °£´ÜÈ÷ ±×³É ·ÎÄÿ¡¼ µ¹¾Æ°¡´Â 1ÀÎ¿ë °ÔÀÓÀ̶ó°í °£ÁÖÇϰí, Ç÷¹À̾î´Â Àü¿ª º¯¼ö·Î µÐ´Ù.
4.2 ·ç¾Æ¿¡¼ ¾²ÀÏ ·¡ÆÛ ÇÔ¼ö ±¸Çö
// NPCÀÇ ´ë»ç¸¦ ȸ鿡´Ù Ãâ·ÂÇÑ´Ù.
int NPC_SAY(lua_State* L)
{
// ½ºÅÿ¡¼ ¸Þ½ÃÁö¸¦ »Ì¾Æ³½´Ù.
luaL_checkstring(pLuaState, -1);
string msg(lua_tostring(pLuaState, -1));
lua_pop(pLuaState, 1);
cout << msg << endl;
// ½ºÅÿ¡ Ǫ½¬ÇÑ ¸®ÅϰªÀÇ °¹¼ö¸¦ ¹ÝÈ¯ÇØ¾ßÇÑ´Ù.
// ·ç¾Æ ÂÊÀ¸·Î ³Ñ°Ü¾ßÇÒ ¹Ýȯ°ªÀÌ ¾øÀ¸¹Ç·Î 0À» ¹ÝȯÇÑ´Ù.
return 0;
}
// Ç÷¹À̾îÀÇ ¸í¼ºÄ¡¸¦ ·ç¾Æ ÂÊÀ¸·Î ³Ñ±ä´Ù.
int GET_PLAYER_FAME(lua_State* L)
{
// Ç÷¹À̾îÀÇ ¸í¼ºÄ¡¸¦ ·ç¾Æ ½ºÅÿ¡´Ù°¡ Ǫ½¬ÇÑ´Ù.
lua_pushnumber(L, g_player.fame);
// ½ºÅÿ¡ Ǫ½¬ÇÑ ¸®ÅϰªÀÇ °¹¼ö¸¦ ¹ÝÈ¯ÇØ¾ßÇÑ´Ù.
// Ç÷¹À̾îÀÇ ¸í¼ºÀ» Ǫ½¬ÇßÀ¸´Ï, 1À» ¹ÝȯÇÑ´Ù.
return 1;
} NPCÀÇ ´ë»ç¸¦ Ãâ·ÂÇÏ´Â ÇÔ¼ö¿Í Ç÷¹À̾îÀÇ ¸í¼ºÄ¡¸¦ ·ç¾Æ ÂÊÀ¸·Î ³Ñ±â´Â ÇÔ¼ö´Ù. C++ ÂÊÀÌ ¸ÞÀÎÀÌ µÈ´Ù°í ÇßÀ¸¹Ç·Î, ·¡ÆÛ ÇÔ¼ö´Â ±×³É ¾à°£ÀÇ ÆÄ¶ó¹ÌÅ͸¦ ÁÖ°í¹ÞÀ¸¸ç C++ ÂÊÀÇ ÇÔ¼ö¸¦ È£ÃâÇÏ´Â ÇÔ¼ö°¡ ´ëºÎºÐÀÌ µÈ´Ù.
4.3 ·ç¾Æ ÇÔ¼ö ±¸Çö
player_fame = GET_PLAYER_FAME()
if player_fame > 500 then
NPC_SAY("Oh, I know you!")
else
NPC_SAY("Who are you?")
end Ç÷¹À̾îÀÇ ¸í¼ºÄ¡°¡ 500 ÀÌ»óÀÏ ¶§¸¸ ¾Æ´Â ü¸¦ ÇÏ´Â NPC ½ºÅ©¸³Æ®ÀÌ´Ù.
4.4 ·ç¾Æ È£Ã⠺κР±¸Çö
// Ç÷¹À̾ NPC¸¦ Ŭ¸¯ÇÑ °æ¿ì¿¡ È£ÃâÇÑ´Ù.
// ½ºÅ©¸³Æ®¸¦ ¹«»çÈ÷ ½ÇÇàÇÑ °æ¿ì¿¡´Â false¸¦ ¹ÝȯÇϰí,
// ¹«¾ð°¡ ¿¡·¯°¡ »ý±ä °æ¿ì¿¡´Â true¸¦ ¹ÝȯÇÑ´Ù.
bool OnNpcClick(lua_State* pLuaState, NPC& npc)
{
const string& filename = npc.click_script_name;
// ¸ÕÀú ½ºÅ©¸³Æ®¸¦ ÆÄ½ÌÇØ¼ ûũ¸¦ ¸¸µç ´ÙÀ½, ½ºÅÿ¡ Ǫ½¬
if (luaL_loadfile(pLuaState, filename.c_str()))
{
// ÆÄ½Ì ½ÇÆÐ!
return true;
}
// Æ®·¹À̽º ÇÔ¼ö¸¦ À§¿¡¼ ÆÄ½ÌÇÑ Ã»Å© ¹Ø¿¡´Ù ³¢¿ö³Ö´Â´Ù.
// Æ®·¹À̽º ÇÔ¼ö´Â Àü¿ª Å×ÀÌºí¿¡ "_TRACEBACK"À̶õ À̸§À¸·Î µé¾î°¡ÀÖ´Ù.
int base = lua_gettop(pLuaState);
lua_getglobal(pLuaState, "_TRACEBACK");
lua_insert(pLuaState, base);
// ½ÇÇàÇÑ´Ù.
return lua_pcall(pLuaState, 0, 0, base) != 0;
} NPC¸¦ Ŭ¸¯ÇÑ °æ¿ì, ±× NPCÀÇ click_script_name ÆÄÀÏ À̸§À» Àоî¿Í ÇØ´ç ÆÄÀÏÀ» ½ÇÇàÇÏ°Ô µÈ´Ù. µð¹ö±ëÀ» Á» ´õ ¿ëÀÌÇÏ°Ô Çϱâ À§Çؼ _TRACEBACK ÇÔ¼ö¸¦ ½ºÅÃÀÇ ¸Ç ¾Æ·¡¿¡´Ù Áý¾î³Ö°í, lua_pcallÀ» È£ÃâÇÏ´Â ºÎºÐÀÌ ¾à°£ º¹ÀâÇϱä ÇÏ´Ù.
4.5 ÅëÇÕ
extern "C" {
#include <lua.h>
#include <lualib.h>
#include <lauxlib.h>
}
#include <iostream>
#include <string>
#include <vector>
using namespace std;
//////////////////////////////////////////////////////////////////////////////
// class Player
//////////////////////////////////////////////////////////////////////////////
class Player
{
public:
string name; // Ç÷¹À̾îÀÇ À̸§
int fame; // Ç÷¹À̾îÀÇ ¸í¼º
};
Player g_player;
//////////////////////////////////////////////////////////////////////////////
// class NPC
//////////////////////////////////////////////////////////////////////////////
class NPC
{
public:
string name; // NPCÀÇ À̸§
string click_script_name; // Ç÷¹À̾ Ŭ¸¯ÇßÀ» ¶§ ½ÇÇàÇÒ ½ºÅ©¸³Æ®ÀÇ À̸§
NPC(const string& n = "", const string& clicked = "")
: name(n), click_script_name(clicked) {}
};
//////////////////////////////////////////////////////////////////////////////
// Function Prototypes
//////////////////////////////////////////////////////////////////////////////
bool OnNpcClick(lua_State* pLuaState, NPC& npc);
int NPC_SAY(lua_State* L);
int GET_PLAYER_FAME(lua_State* L);
//////////////////////////////////////////////////////////////////////////////
void main()
{
// ·ç¾Æ »óÅ °´Ã¼¸¦ »ý¼ºÇÑ´Ù.
lua_State* pLuaState = lua_open();
// ÇÊ¿äÇÑ ¶óÀ̺귯¸®µéÀ» ¿¬´Ù.
lua_baselibopen(pLuaState);
lua_tablibopen(pLuaState);
//lua_iolibopen(pLuaState);
//lua_strlibopen(pLuaState);
lua_mathlibopen(pLuaState);
lua_dblibopen(pLuaState);
// ·¡ÆÛ ÇÔ¼öµéÀ» µî·ÏÇÑ´Ù. µÎ¹øÂ° ÀÎÀÚ´Â ·ç¾Æ¿¡¼ ¾²ÀÏ ÇÔ¼öÀÇ
// À̸§Àε¥, È¥¶õÀ» ¹æÁöÇϱâ À§Çؼ ½ÇÁ¦ ·¡ÆÛ ÇÔ¼öÀÇ À̸§°ú ¶È°°°Ô
// ÇÏ´Â °ÍÀÌ ÁÁ´Ù.
lua_register(pLuaState, "NPC_SAY", NPC_SAY);
lua_register(pLuaState, "GET_PLAYER_FAME", GET_PLAYER_FAME);
// NPCµéÀ» »ý¼ºÇÑ´Ù.
typedef vector<NPC> NPC_VECTOR;
NPC_VECTOR npcs;
npclist.push_back(NPC("NPC1", "clicked.lua"));
npclist.push_back(NPC("NPC2", "clicked.lua"));
npclist.push_back(NPC("NPC3", "clicked.lua"));
npclist.push_back(NPC("NPC4", "clicked.lua"));
// Ç÷¹À̾îÀÇ »óŸ¦ ÀԷ¹޴´Ù.
cout << "Ç÷¹À̾îÀÇ ¸í¼ºÀ» ÀÔ·ÂÇϽÿÀ >> ";
cin >> g_player.fame;
// ¼±ÅÃÀ» ÀԷ¹޾Æ, Ŭ¸¯ ÇÔ¼ö¸¦ È£ÃâÇÑ´Ù.
int index = 0;
cout << "Ŭ¸¯ÇÒ NPCÀÇ À妽º¸¦ ÀÔ·ÂÇϽÿÀ (0~3) >> ";
cin >> index;
OnNpcClick(pLuaState, npcs[index]);
// ´Ù ³¡³µÀ¸´Ï ·ç¾Æ »óÅ °´Ã¼¸¦ »èÁ¦ÇÑ´Ù.
lua_close(pLuaState);
}
//////////////////////////////////////////////////////////////////////////////
// Ç÷¹À̾ NPC¸¦ Ŭ¸¯ÇÑ °æ¿ì¿¡ È£ÃâÇÑ´Ù.
// ½ºÅ©¸³Æ®¸¦ ¹«»çÈ÷ ½ÇÇàÇÑ °æ¿ì¿¡´Â false¸¦ ¹ÝȯÇϰí,
// ¹«¾ð°¡ ¿¡·¯°¡ »ý±ä °æ¿ì¿¡´Â true¸¦ ¹ÝȯÇÑ´Ù.
//////////////////////////////////////////////////////////////////////////////
bool OnNpcClick(lua_State* L, NPC& npc)
{
const string& filename = npc.click_script_name;
// ¸ÕÀú ½ºÅ©¸³Æ®¸¦ ÆÄ½ÌÇØ¼ ûũ¸¦ ¸¸µç ´ÙÀ½, ½ºÅÿ¡ Ǫ½¬
if (luaL_loadfile(L, filename.c_str()))
{
// ÆÄ½Ì ½ÇÆÐ!
return true;
}
// Æ®·¹À̽º ÇÔ¼ö¸¦ À§¿¡¼ ÆÄ½ÌÇÑ Ã»Å© ¹Ø¿¡´Ù ³¢¿ö³Ö´Â´Ù.
// Æ®·¹À̽º ÇÔ¼ö´Â Àü¿ª Å×ÀÌºí¿¡ "_TRACEBACK"À̶õ À̸§À¸·Î µé¾î°¡ÀÖ´Ù.
int base = lua_gettop(L);
lua_getglobal(L, "_TRACEBACK");
lua_insert(L, base);
// ½ÇÇàÇÑ´Ù.
return lua_pcall(L, 0, 0, base) != 0;
}
//////////////////////////////////////////////////////////////////////////////
// NPCÀÇ ´ë»ç¸¦ ȸ鿡´Ù Ãâ·ÂÇÑ´Ù.
//////////////////////////////////////////////////////////////////////////////
int NPC_SAY(lua_State* L)
{
// ½ºÅÿ¡¼ ¸Þ½ÃÁö¸¦ »Ì¾Æ³½´Ù.
luaL_checkstring(L, -1);
string msg(lua_tostring(L, -1));
lua_pop(pLuaState, 1);
cout << msg << endl;
// ½ºÅÿ¡ Ǫ½¬ÇÑ ¸®ÅϰªÀÇ °¹¼ö¸¦ ¹ÝÈ¯ÇØ¾ßÇÑ´Ù.
// ·ç¾Æ ÂÊÀ¸·Î ³Ñ°Ü¾ßÇÒ ¹Ýȯ°ªÀÌ ¾øÀ¸¹Ç·Î 0À» ¹ÝȯÇÑ´Ù.
return 0;
}
//////////////////////////////////////////////////////////////////////////////
// Ç÷¹À̾îÀÇ ¸í¼ºÄ¡¸¦ ·ç¾Æ ÂÊÀ¸·Î ³Ñ±ä´Ù.
//////////////////////////////////////////////////////////////////////////////
int GET_PLAYER_FAME(lua_State* L)
{
// Ç÷¹À̾îÀÇ ¸í¼ºÄ¡¸¦ ·ç¾Æ ½ºÅÿ¡´Ù°¡ Ǫ½¬ÇÑ´Ù.
lua_pushnumber(L, g_player.fame);
// ½ºÅÿ¡ Ǫ½¬ÇÑ ¸®ÅϰªÀÇ °¹¼ö¸¦ ¹ÝÈ¯ÇØ¾ßÇÑ´Ù.
// Ç÷¹À̾îÀÇ ¸í¼ºÀ» Ǫ½¬ÇßÀ¸´Ï, 1À» ¹ÝȯÇÑ´Ù.
return 1;
} ¿¡·¯ 󸮴 ´ëºÎºÐ »ý·«Çß´Ù. ÄÄÆÄÀÏÀº ¾ÈÇØºÃ´Âµ¥, ·ç¾Æ µð·ºÅ丮¸¸ include ÆÐ½º¿¡ Àß Ãß°¡Çß´Ù¸é, ¾Æ¸¶ ÄÄÆÄÀ쵃 °ÍÀÌ´Ù. -_-;;;
5 ¿ä¾à
°á±¹ ÇʼöÀûÀ¸·Î ó¸®ÇؾßÇÏ´Â ÀϵéÀ» ¿ä¾àÇØº¸ÀÚ¸é...
- Ç÷¹À̾îÀÇ ÀԷ¿¡ µû¶ó ½ÇÇàÇÒ ½ºÅ©¸³Æ®¸¦ ÆÇ´ÜÇÒ ¼ö ÀÖ´Â ½Ã½ºÅÛÀÌ ÇÊ¿äÇÏ´Ù. À§ÀÇ ¿¹¿¡¼´Â NPCÀÇ À妽º¸¦ Ç÷¹À̾î·ÎºÎÅÍ ÀԷ¹޾Æ, ÇØ´ç NPC °´Ã¼ÀÇ ¸â¹ö º¯¼ö·Î µé¾î°¡ÀÖ´Â ½ºÅ©¸³Æ® ÆÄÀÏ À̸§À» ÀÌ¿ëÇß´Ù.
- ·ç¾Æ ÂÊ¿¡¼ C++ ÂÊ¿¡ ÀÖ´Â °´Ã¼ÀÇ »óŸ¦ Äõ¸®ÇÒ ¼ö ÀÖ´Â ·¡ÆÛ ÇÔ¼ö°¡ ÇÊ¿äÇÏ´Ù. À§ÀÇ ¿¹¿¡¼´Â Ç÷¹À̾îÀÇ ¸í¼ºÄ¡¸¦ Äõ¸®ÇÏ´Â GET_PLAYER_FAME ÇÔ¼ö°¡ ÀÖ´Ù.
- ·ç¾Æ ÂÊ¿¡¼ C++ ÂÊ¿¡ ÀÖ´Â ±â´ÉÀ» È£ÃâÇÒ ¼ö ÀÖ´Â ·¡ÆÛ ÇÔ¼ö°¡ ÇÊ¿äÇÏ´Ù. À§ÀÇ ¿¹¿¡¼´Â NPCÀÇ ´ë»ç¸¦ ȸ鿡 Ãâ·ÂÇÏ´Â NPC_SAY ÇÔ¼ö°¡ ÀÖ´Ù.
6 ÁÖÀÇ»çÇ×
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)