ȣ��Ŭ�罺 �ΰ����� ��ũ��Ʈ ������
����
2- ��ũ��Ʈ �۵�����
3- ��׳���ũ Ŭ���̾�Ʈ ���� �Լ� ����
4- ��׳���ũ Ŭ���̾�Ʈ ���� ����� ����
5- �⺻������ ������ ��ũ��Ʈ ����
1 – �Ұ�
��׳���ũ(���� ���) ���� ���� ȣ��Ŭ�罺�� �ൿ��, ��� Ŭ���̾�Ʈ ���α׷��� ��ġ�� ������ AI ���� �ȿ� �ִ� AI.lua, Util.lua �� ���ؼ� �����˴ϴ�.
��� ���̸Ӵ� �ڽ��� ���ϴ� �ΰ������� ������ ���� ���� �ְ�, �ٸ� ����� ���� �ΰ������� ����� ���� �ְ� �ϴ� ���� �����Դϴ�.
��ũ��Ʈ�� ��� Ŭ���̾�Ʈ�� �����Ǵ� ������ ���α׷��Դϴ�. �������� ������ �ִٸ� �۵��� ���� ������, �������� ������ �־ ���ϴ� ��� �۵����� �ʽ��ϴ�.
��� ���߽ǿ����� ��ũ��Ʈ�� ���� ������ ���� �ʾƵ� ������ ��� �� �ֵ��� ���� ��ũ��Ʈ�� ������ �����Դϴ�.
���α׷��ֿ� �ͼ����� ���� ����ڵ鿡 ���ؼ��� �ڽ��� ���ϴ� �ΰ������� �����ϴµ� ������ �ǵ��� ����, ������ ���� ��ȹ�Դϴ�.
���α׷��ֿ� ������ �ִ� ����ڵ��� ���ؼ��� ���������� ����� �߰��� ��ȹ�Դϴ�.
��ũ��Ʈ�� �ۼ��ϴ� ���� ���(LUA) �Դϴ�. (http://www.lua.org)
2- ��ũ��Ʈ �۵� ����
��� Ŭ���̾�Ʈ�� Ŭ���̾�Ʈ ���α׷����� ȣ��Ŭ�罺�� ���� �����Ǵ� ������ AI.lua, Util.lua ������ �ؼ��Ͽ��� �ΰ������� �۵�
��ŵ�ϴ�.
ȣ��Ŭ�罺�� ���� �����Ǵ� ������ ������ �����ϴ�.
1) ȣ��Ŭ�罺�� ź����ų ��
2) ���� ȣ��Ŭ�罺�� ����� ��
3) ij���ͼ���â���� ȣ��Ŭ�罺�� ������ ij���͸� �����ϰ� ������ ������ ��
4) ȣ��Ŭ�罺�� ������ ij���Ͱ� �ĸ��� ����, ������ ������ ����� ��
5) ȣ��Ŭ�罺�� ������ ij���Ͱ� ������Ż�� �̿��� ��
6) ȣ��Ŭ�罺�� ������ ij���Ͱ� ī���� �̵����񽺸� ����� ��
��
���� ���׵��� �������� ȣ��Ŭ�罺�� ���� ������ ���� ��Ÿ�� ���Դϴ�.
AI.lua ������ �ؼ��� �Ŀ�, ��� Ŭ���̾�Ʈ ���α׷��� AI.lua ��ũ��Ʈ���� AI ( id) �Լ��� �����ŵ�ϴ�. id�� ���ӻ󿡼� ȣ���� ������ȣ�Դϴ�. id �� ��� Ŭ���̾�Ʈ�� ����� ��ũ��Ʈ�� �����ϴ� �����Դϴ�. AI(id) �� ������ �����Ͽ� ������� ��È��ų �� �ֽ��ϴ�. �������� ȣ���� �ൿ, �� �̵�, ����, �Ա�, ��ų������ �Լ��� ��� Ŭ���̾�Ʈ ���α׷��� ����Ǿ� �ֽ��ϴ�. �ڽ��� ������ ������ ��Ȳ����, �����Ǵ� �Լ��� ������� �˴ϴ�.
Const.lua ��� Ŭ���̾�Ʈ ���α׷����� ���� ������鿡 ���� ������ ��� �ֽ��ϴ�. Const.lua �� AI.lua Utiil.lua ���� �����մϴ�.
Utiil.lua �� AI.lua ���� �����ϵ��� �Ǿ� �ֽ��ϴ�. ���� Util.lua ���� ����Ʈ �ڷᱸ��, ��� �ܼ��� ����� ����Լ����� �ֽ��ϴ�.
ȣ��Ŭ�罺 �ΰ������� �ʼ� ������ AI.lua ���ϰ� AI.lua ���ϳ��� ���ǵ� AI (id) �Լ� �Դϴ�. �� �� ���� �ܴ̿� ��� ���û����Դϴ�. �� Const.lua, Util.lua �� �������� ���Դϴ�. ������ ��ũ��Ʈ �ۼ��� �� �������� ������ �ʿ��ϴ� �־�߰���?
3- ��׳���ũ Ŭ���̾�Ʈ ���� �Լ� ����
# id : ���ӳ��� ��ü�� ������ ���� ��ȣ
1) MoveToOwner (id)
id : ȣ��Ŭ�罺�� id
��ȯ��: ����
��� : ȣ��Ŭ�罺�� ���� ������ �̵���Ų��.
2) Move (id,x,y)
id : ȣ��Ŭ�罺�� id
x : ������ ���� ��ǥ
y : ������ ���� ��ǥ
��ȯ�� : ����
��� : ȣ��Ŭ�罺�� �������� �̵���Ų��.
3) Attack (id1,id2)
id1 : ������
id2 : �ǰ�����
��ȯ�� : ����
��� : ȣ��Ŭ�罺���� id2�� �����ϵ��� �Ѵ�.
4) GetV (V_,id) end
V_... : ��ü�� �Ӽ��� ��Ÿ���� �����
id : �Ӽ��� ���
��ȯ�� : V_... �� ���� �޶�����. ����
���, V_POSITION �� ���� x, y ��ǥ V_HP�� ���� HP �̴�.
��� : id �� �Ӽ�(V_...) �� ��´�. �Ӽ���
��Ÿ���� ������� Util.lua�� ���ǵǾ� �ִ�.
�Ӽ��� ���� �󼼳����� ��4- ��׳���ũ Ŭ���̾�Ʈ ���� ����� ������ ��
�����Ѵ�.
5) GetActors ()
��ȯ�� : id ���� ���մϴ�. ����� table ���·� ��ȯ�ȴ�.
��� : ij����
�þ߿� �ִ� ij����, ���ǽ�, ����, ������, ��ų���� id�� ���´�.
6) GetTick ()
��ȯ�� : 1/1000 �� ������ ����
��� : ��ǻ����
�ð��� ���´�. �� ����, ��ǻ�Ͱ� ������
�� 0 ����
�����ϸ�, 1/1000 �ʸ��� 1 �� �����Ͽ�
���翡 �̸� ���̴�
7) GetMsg (id)
id : ȣ��Ŭ�罺�� id
��ȯ�� : ��׳���ũ
Ŭ���̾�Ʈ�κ��� ���޵� �޽�����. ����� table ���·� ��ȯ�ȴ�.
��� : �������
�������� ���ɵ��� ��ũ��Ʈ�� �����Ѵ�.
8) GetResMsg (id)
id : ȣ��Ŭ�罺�� id
��ȯ�� : ��׳���ũ
Ŭ���̾�Ʈ�κ��� ���޵� ���� �޽�����. ����� table ���·� ��ȯ�ȴ�
��� : �������
�������� ���� ���ɵ��� ��ũ��Ʈ�� �����Ѵ�.
10) SkillObject (id,level,skill,target)
id : ȣ��Ŭ�罺�� id
��ȯ�� : ����
��� : id �� �ش��ϴ� ���� target �� �ش��ϴ� �Ϳ� ���Ͽ� level ���� �ش��ϴ� � ��ų(skill) �� ����Ѵ�.
11) SkillGround (id,level,skill,x,y)
id �� �ش��ϴ�
���� x.y ��ǥ�� ���Ͽ� level ���� �ش��ϴ� skill �� ����Ѵ�.
13) IsMonster (id)
id : ���ӳ��� ��ü
��ȯ�� : id �� �ش��ϴ� ���� �����̸� 1�� ��ȯ�ϰ�
�׷��� �ʴٸ� 0�� ��ȯ�Ѵ�.
��� : ���͸� �Ǻ��Ѵ�.
14) TraceAI (string)
string : TraceAI.txt ���Ͽ� ��ϵǴ� �����̴�. ���ڿ��̿��� �Ѵ�.
��� : �������� ��ũ��Ʈ�� ���� ���¸� ����Ͽ� �м��� �̿��Ѵ�.
4- ��׳���ũ Ŭ���̾�Ʈ ���� ����� ����
���� ��������� Const.lua �� ���ǵǾ� �ֽ��ϴ�.
4-1 GetV �Լ��� ���Ǵ� ��� ����
V_OWNER = 0 --
���� ij������
��ȣ ��ȯ
V_POSITION = 1 -- ���� ��ġ x, y ��ȯ
V_TYPE = 2 -- � ��ü�ΰ�? (�̱���)
V_MOTION = 3 -- ���� ���� ��ȯ
V_ATTACKRANGE = 4 -- ���� ���� ��ȯ (�̱���, �ӽ÷� 1��)
V_TARGET = 5 -- �����̳� ��ų ��� ��ǥ ��ȯ
V_SKILLATTACKRANGE = 6 -- ��ų ���� ���� (�̱���)
V_HOMUNTYPE = 7 -- ȣ��Ŭ�罺 ���� ��ȯ
V_HP = 8 -- ȣ��Ŭ�罺�� �� ������ HP
V_SP = 9 -- ȣ��Ŭ�罺�� �� ������ SP
V_MAXHP = 10 -- ȣ��Ŭ�罺�� �� ������ �ִ� HP
V_MAXSP = 11 -- ȣ��Ŭ�罺�� �� ������ �ִ� SP
4-2 GetV (V_MOTION, id) �� ���� ��ȯ��
MOTION_STAND = 0 : �� �ִ� ����
MOTION_MOVE = 1 : �̵����� ����
MOTION_ATTACK = 2 : �������� ����
MOTION_DEAD = 3 : ���� ����
MOTION_ATTACK2 = 9 : �����ϴ� ����
4-3 GetV (V_HOMUNTYPE, id) �� ���� ��ȯ��
LIF = 1 : ����
AMISTR = 2 : �ƹ̽�Ʈ��
FILIR = 3 : �ʸ���
VANILMIRTH = 4 : �ٴҹ̸���
LIF_H = 5 : ���� ����
AMISTR_H = 6 : ��È�� �ƹ̽�Ʈ��
FILIR_H = 7 : ��È�� �ʸ���
VANILMIRTH_H = 8 : ��È�� �ٴҹ̸���
4-4 GetMsg (id), GetResMsg (id) ��
���ؼ� ��ȯ�Ǵ� ���̺��� ����
NOME_CMD = 0 --
���ɾ���
{���ɹ�ȣ}
MOVE_CMD = 1 -- �̵�
{���ɹ�ȣ,X��ǥ,Y��ǥ}
STOP_CMD = 2 -- ����
{���ɹ�ȣ}
ATTACT_OBJET_CMD = 3 -- ����
{���ɹ�ȣ,��ǥID}
ATTACK_AREA_CMD = 4 -- ���� ����
{���ɹ�ȣ,X��ǥ,Y��ǥ}
PATROL_CMD = 5 -- ����
{���ɹ�ȣ,X��ǥ,Y��ǥ}
HOLD_CMD = 6 -- ���
{���ɹ�ȣ}
SKILL_OBJECT_CMD = 7 -- ��ų���
{���ɹ�ȣ,���÷���,����,��ǥID}
SKILL_AREA_CMD = 8 -- ������ų���
{���ɹ�ȣ,���÷���,����,X��ǥ,Y��ǥ}
FOLLOW_CMD = 9 -- ������ ���� �ٴѴ�
{���ɹ�ȣ}
5- �⺻������ ������ ��ũ��Ʈ ����
5-1 �ΰ����� ��ũ��Ʈ�� �ʼ� ���
��ũ��Ʈ ������ �Ϲ����� �ؽ�Ʈ �����Դϴ�. �޸���� ���� �Ϲ����� ������� �ۼ��ϸ� �˴ϴ�. ���� LUA ��� ���� �������� ������ Ȯ���ڿ� lua �� ����Ͽ����ϴ�.
ȣ��Ŭ�罺 �ΰ������� �ʼ� ������ AI.lua ���ϰ� AI.lua ���ϳ��� ���ǵ� AI (id) �Լ� �Դϴ�. �� �� ���� �ܴ̿� ��� ���û����Դϴ�.
���� ���, ���ο� �ؽ�Ʈ ������ ����� ���� �̸��� AI.lua ��� ��ģ �Ŀ� �޸������� ���ϴ�. �׸��� �� ������
function AI (myid)
end
�̷��� ���� ����, AI ������ �ִ� ���� AI.lua �� �ٸ� ���� �ű�ų� �̸��� �ٲ� �Ŀ� ���� �ۼ��� ������ �����մϴ�. �׸��� ��� Ŭ���̾�Ʈ�� �����ϸ� ����� �۵��մϴ�. ���� ȣ���� �ƹ��͵� ���ϰ� ������ �ֽ��ϴ�.
5-2 ���� ���� ���
������� �ۼ��ϴ� ����� ���� ������ �ֽ��ϴ�. �� �߿��� �ܼ��ϸé¼, ���� ���̴� ����� ���ѻ��±��(FSM, Finite State Machine)�Դϴ�.
���ѻ��±���� �м��� ���Ǵ� ���� ������ ���� ���� �ְڽ��ϴٸ���, ��������ε� ��κ��� ������� �˰� �ִ� ���Դϴ�.
�츮�� ������ ȣ��Ŭ�罺�� ���� ����. �켱 ȣ��Ŭ�罺�� ��� �ൿ�Ͽ� �ֱ⸦ �ٶ�� �ٰ� ���� ���Դϴ�.
�̷� �͵��� ��� ������.
������ �����ϴ� ��ü�� ã�ư��� ȥ�����
������ ���Ͱ� ������ ���� �����ض�.. �Ǵ� ���� �ٳ�� (��ģ�� ^^;;)
�����̶� �ָ� �������� ���� ���� �Ÿ��� �����ض�
���
��Ȳ�� ���� ������ �䱸������ �ֽ��ϴ�.
�� �䱸������ ������ �Ǿ��ٸ� �츮�� ���� ȣ��Ŭ�罺�� ï¿½Ç¾î¼ ï¿½ï¿½ï¿½ï¿½ï¿½Øºï¿½ï¿½Ã´ï¿½.
������ �ƹ��� ���Ͱ� ���� ���ε� ������ �ִ� ��Ȳ�� �Ӹ� �ӿ� �׷����ϴ�. ȣ���� �׳� �޽��ϴ� �����Դϴ�.
������ ���ݹޱ⳪ ���� ���� �޾Ҵٸ� ������ ��ü�� ������ �ν��ϰ� �Ѿư��� �մϴ�. ���� �Ѿư��� ȣ��Ŭ�罺�� �����Դϴ�.
���� ���� ���� �ȿ� ������ ���������� �ϰų� ��ų�� ����մϴ�. ������ �ο�� �����Դϴ�.
���� �Ҹ��ϰų� �Ѿ� ���� ���� ��Š�ָ� �޾Ƴ������� ���� ���� ������ ���� �մϴ�. ������ ���󰡴� �����Դϴ�.
������ ���� �� ���� ���¸� ���� �޽�(IDLE), ����(CHASE),����(ATTACK),ȸ��(FOLLOW) ���¶�� ���Ƿ� ���մϴ�.
�׸��� �� ���¿��� � ��È�� ����� ������ �ƴ� �ٸ� ���·� ��È�ϴ��� �����մϴ�. �׸��� �� ���¿��� �ؾ� �� �ϵ���
���� �ݴϴ�. �� ���� ���� �˻縦 �� �߰��� �� �̰��� �׸����� �׷����� ������ �����ϴ�.
�޽� ���� ���� ȸ�� 1. ����
�Ⱥ��� 2. ���Ҹ� 3. ���� ���ݹ��� �� ���ΰ� ����� 3. ����
���ݹ��� �� 1. ������
���� ���� 2. ����
���� 1. ���Ҹ� 2. ��
�Ⱥ��� ���ΰ� �־��� 4.�þ߾�
�� ��ġ ï¿½ï¿½È 4.������
������ ���´� �޽� �����Դϴ�. ���� ��Ȳ�� ���Կ� ���� ȣ���� ���´� ��È�մϴ�. �׸��� �׶� ���� ������ �ൿ�� �ϵ��� �����ϸ� �˴ϴ�. ���� ��ȹ�� �������� �� ���� �غ� �ϰ� �������� ��ũ��Ʈ�� �ۼ��� ���ϴ�.
5-3 Util.lua
� �۾��� �� ��, �츮�� ������ �۾��� ���Ͽ� �������� �غ��� �Ӵϴ�.
ȣ��Ŭ�罺�� �ΰ������� ������� �ʼ� ����� AI.lua�� AI(id) �Լ��� ������ ������, �̸� �� ���� �������� ����� �δ� ���� �����ϴ�.
�� �������� �ַ� ���̺��̳� �Լ��� �����Դϴ�. �̰͵��� Util.lua �� �ۼ��ϰ�, AI.lua ���� �����ϵ��� �մϴ�
�� ������ ������ Const.lua �� �����ϵ���
require ��./AI/Const.lua��
�� ���� �ݴϴ�.
� �����͵��� ������� �����ϰ� ������� ������ ���� �ڷᱸ���� �ʿ��� ��찡 �ֽ��ϴ�. ȣ��Ŭ�罺�� �ΰ������� ��쿡��
���� ���ɾ ������� �����ϰ� ���� �� �ʿ䰡 �ֽ��ϴ�. �ڷᱸ���� �̸��� List ��� �ϰ� ��� �Լ��� �߰��մϴ�.
(Util.lua ����)
List.new () -- ���ο� ����Ʈ ��ȯ
List.pushleft (list, value) -- list �� ������ ��� �߰�
List.pushright (list, value) -- list �� ������ ��� �߰�
List.popleft (list) -- list �� ���� ù��° ���� ���´�
List.popright (list) -- list �� ���� ù��° ���� ���´�
List.clear (list) -- list �� ����.
List.size (list) -- list �� ��� �ִ� ��ҵ��� ����
���� ���̴� ��� ��� �Լ��鵵 �߰��մϴ�.
GetDistance (x1,y1,x2,y2) -- �� ��ǥ������ �� �Ÿ� (������)
GetDistance2 (id1, id2) -- �� ��ü������ �� �Ÿ� (������)
GetOwnerPosition (id) -- ������ ��ġ
GetDistanceFromOwner (id) -- ���ΰ��� �Ÿ�
IsOutOfSight (id1,id2) -- id1�� id2 �� ���� ���̴� �Ÿ��̸� true, ������ �ʴ� �Ÿ��̸� false �� ��ȯ�Ѵ�.
IsInAttackSight (id1,id2) -- id1�� �����̳� ��ų�������� id2�� ������ true, �ƴϸ� false �� ��ȯ�Ѵ�.
5-4 AI.lua
���� AI.lua �� �ۼ��� ���ϴ�. �ֺ� �ؽ�Ʈ ������ �ϳ� �����, AI.lua �� �̸��� �ٲߴϴ�. �޸������� AI.lua ������ ���ϴ�.
�� ������ ������ Const.lua , Util.lua �� �����ϵ���
require ��./AI/Const.lua��
require ��./AI/Util.lua��
�� ���� �ݴϴ�.
�Ͼ��(�Ǵ� ��İ�) �� ������ �ʼ����
function AI (myid)
end
�� �����ϴ�.
��������� �ϳ��� �ΰ������� �ϼ��� ���Դϴ�. ������ �ֺ� AI(myid) �Լ��� ���� �ΰ������� ����ϸ�, ���ӿ��� ȣ��Ŭ�罺�� �׳�
������ �ֽ��ϴ�. �̰��� �츮�� ��ȹ�� �ƴմϴ�.
��ȹ�ߴ� ��� ���¸� �����մϴ�.
IDLE_ST = 0 --- �޽�
FOLLOW_ST = 1 --- ȸ��
CHASE_ST = 2 --- ����
ATTACK_ST = 3 --- ����
�׸��� ���� ȣ��Ŭ�罺�� ���¸� ����� �� ������ �ʿ��մϴ�. �� ȣ��Ŭ�罺�� id, �� id, ������ ��ǥ �� ����� �� �ʿ䰡 �ֽ��ϴ�.
ȣ��Ŭ�罺�� ���´� ���ʿ��� �޽� �����Դϴ�.
------------------------------------------
-- global variable
------------------------------------------
MyState = IDLE_ST -- ������ ���´� �޽�
MyEnemy = 0 -- �� id
MyDestX = 0 -- ������ x
MyDestY = 0 -- ������ y
MyPatrolX = 0 -- ���� ������ x
MyPatrolY = 0 -- ���� ������ y
ResCmdList = List.new() -- ���� ���ɾ� ����Ʈ
MyID = 0 -- ȣ��Ŭ�罺 id
MySkill = 0 -- ȣ��Ŭ�罺�� ��ų
MySkillLevel = 0 -- ȣ��Ŭ�罺�� ��ų ����
------------------------------------------
function AI (myid)
MyID = myid
end
�޽�
���¸� ó���ϴ� �Լ� OnIDLE_ST() �� �����մϴ�. �׸��� AI(myid) �Լ����� �۵��ϵ��� �����մϴ�.
function OnIDLE_ST ()
local object = GetOwnerEnemy (MyID) -- ������ ���� ã�Ƴ���.
if (object ~= 0) then -- ������ ���� �ִ°�?
MyState = CHASE_ST -- ������ ���� �����Ƿ� �������·� ��ȯ
MyEnemy = object -- ���� �� ��ȣ�� ���
return -- �Լ� ����
end
object = GetMyEnemy (MyID) -- ���� ���� ã�Ƴ���.
if (object ~= 0) then -- ���� ���� �ִ°�?
MyState = CHASE_ST -- ���� ���� �����Ƿ� �������·� ��ȯ
MyEnemy = object -- ���� �� ��ȣ�� ���
return
end
local distance = GetDistanceFromOwner(MyID) -- ���ΰ��� �Ÿ��� ��´�.
if ( distance > 3 or distance == -1) then -- ���ΰ��� �Ÿ��� 3�� �̻��̰ų�, ������ �þ� ���̸�
MyState = FOLLOW_ST -- ȸ�� ���·� ��ȯ
return;
end
end
function AI (myid)
MyID = myid
if (MyState == IDLE_ST) then
OnIDLE_ST ()
end
end
������ ���ݹްų� ���� ���� ���� ��� ���� ���·� �����մϴ�. �� �� �� �ش����� �ʴ� ��� ���ΰ��� �Ÿ��� ����ؼ� �����Ÿ� �̻� ������ ������
ȸ�� ���·� ��ȯ�մϴ�. �׷��ٸ� �������� ���ݹ޴´���, ������ ���� �ִ��� ��� ������ ��� �˱��.?
�������� ���ݹ޴´��� �� ������ ������ ��ü�� �߿��� ������ ���� �� ����� ������ ��찡 �ǰڽ��ϴ�. �׷��ٸ� ���Ͱ� �ƴ� �Ϲ� �÷��̾��� ij���Ͱ�
������ ������ ���� ��� �˱��? �� ij������ ������ ������ ���� �� �� �ֽ��ϴ�.
function GetOwnerEnemy (myid) -- �� ������ ���� ã�Ƴ���.
local result = 0
local owner = GetV (V_OWNER,myid) -- ����
local actors = GetActors () -- ���� �þ߾��� ��ü��
local enemys = {} -- ������ ������ ��� ���̺�
local index = 1
local target
for i,v in ipairs(actors) do -- ���� �þ߾��� ��ü���� ��� ��ȸ�Ѵ�.
if (v ~= owner and v ~= myid) then -- � ��ü�� ��ǥ��
target = GetV (V_TARGET,v)
if (target == owner) then -- ��ǥ���� �����̸�
if (IsMonster(v) == 1) then -- � ��ü�� �����̸�
enemys[index] = v -- ������ ���鿡 �߰�
index = index+1
else -- � ��ü�� ���Ͱ� �ƴϸ�
local motion = GetV(V_MOTION,i) -- � ��ü�� ���� ����
if (motion == MOTION_ATTACK or motion == MOTION_ATTACK2) then – ���ݵ����̸�
enemys[index] = v -- ������ ���鿡 �߰�
index = index+1
end
end
end
end
end
local min_dis = 100 -- �ּ� �Ÿ��� 100 ���� ����
local dis
for i,v in ipairs(enemys) do -- ������ ������ ��� ��ȸ
dis = GetDistance2 (myid,v) -- ���ΰ� � ������ �Ÿ�
if (dis < min_dis) then -- �Ÿ��� �ּ� �Ÿ����� ������
result = v -- ���� ���� ����
min_dis = dis -- �ּ� �Ÿ� ����
end
end
return result -- ���� ��ȯ ��ȯ ( 0�̸� ������ ���� ���� ���̴�. )
end
��� ���� 0 �� �ƴ� ��� ������ ������ �ް� �ִ� ���Դϴ�.
������ ���� �ִ��� �ִ� ��� ������ ��� �Ǵ��ұ��? ���� ȣ��Ŭ�罺�� ���͸� ���� �����ϰ� �ϰ� �ʹٸ�, ������ ���Ͱ� �ִٸ�
���� �ִٶ�� �Ǵ��ϸ� �˴ϴ�. ���� ȣ��Ŭ�罺�� ���� ���� ��츸 ȣ��Ŭ�罺�� �����ϵ��� �ϰ� �ʹٸ�, ȣ��Ŭ�罺�� �����ϴ� �����
�ִ��� �˻��ϸ� �˴ϴ�. �� �ΰ��� �� �ϳ��� ������ ����, �񼱰� ȣ��Ŭ�罺�� ���������ϴ�.
function GetMyEnemy (myid) -- ���� ���� ��.
local result = 0
local type = GetV (V_HOMUNTYPE,myid) -- ���� � ȣ��Ŭ�罺�ΰ�
if (type == LIF or type == LIF_H or type == AMSTR or type == AMSTR_H) then
result = GetMyEnemyA (myid) -- �񼱰��� �� ã�� �Լ�
elseif (type == FILIR or type == FILIR_H or type == VANILMIRTH or type == VANILMIRTH_H) then
result = GetMyEnemyB (myid) -- ������ �� ã�� �Լ�
end
return result
end
-------------------------------------------
-- �񼱰��� GetMyEnemy
-------------------------------------------
function GetMyEnemyA (myid)
local result = 0
local owner = GetV (V_OWNER,myid)
local actors = GetActors ()
local enemys = {}
local index = 1
local target
for i,v in ipairs(actors) do
if (v ~= owner and v ~= myid) then
target = GetV (V_TARGET,v)
if (target == myid) then
enemys[index] = v -- ���� �����ϴ� ��ü�� ���� ������ ����
index = index+1
end
end
end
local min_dis = 100
local dis
for i,v in ipairs(enemys) do
dis = GetDistance2 (myid,v)
if (dis < min_dis) then
result = v
min_dis = dis
end
end
return result
end
-------------------------------------------
-- ������ GetMyEnemy
-------------------------------------------
function GetMyEnemyB (myid)
local result = 0
local owner = GetV (V_OWNER,myid)
local actors = GetActors ()
local enemys = {}
local index = 1
local type
for i,v in ipairs(actors) do
if (v ~= owner and v ~= myid) then
if (1 == IsMonster(v)) then
enemys[index] = v -- �ֺ��� ���͸� ���� ������ ����
index = index+1
end
end
end
local min_dis = 100
local dis
for i,v in ipairs(enemys) do
dis = GetDistance2 (myid,v)
if (dis < min_dis) then
result = v
min_dis = dis
end
end
return result
end
���� ���� �޽� ���¸� ó���ϴ� ���α׷��� �Ͽ����ϴ�. �޽Ļ��¿��� ��ȯ�Ǵ� ��������, ȸ�� ���µ�
����� ������� �ۼ��ϰ� ������ ���µ鵵 ���������Դϴ�.
���������� ȣ��Ŭ�罺�� ������� �������� ������ �����ϵ��� �ϴ� ���� �ֽ��ϴ�.
���콺�� Ư����ġ�� �̵���Ű�ų� Ư�� ���͸� ���ݽ�Ű�ų�, Ű������ Ư��Ű�� ������ ���ڸ�������
������ �ֵ��� �ϰų� �ϴ� ó���Դϴ�.
����ڰ� ������ ������ �޽��� ���·� ��ũ��Ʈ�� ���޵˴ϴ�. �� �޽����� �ؼ��Ͽ�, Ư�������� �����ϴ�
���·� ��ȯ�����ָ� �˴ϴ�. �׷����� �޽����� �ް� �ؼ��ϴ� �κа� Ư�������� ó���ϴ� ���¸� �߰��ϰ�
����ó�� �Լ��� �߰��ϸ� �˴ϴ�. AI(myid) ���Ժο� ������ �߰��մϴ�.
MyID = myid
local msg = GetMsg (myid) -- ���� �޾ƿ���
local rmsg = GetResMsg (myid) -- ���� ���� �޾ƿ���
ProcessCommand (msg) -- ���� ó��
-- ���� ���ɾ� ����
if msg[1] == NONE_CMD then
if rmsg[1] ~= NONE_CMD then
if List.size(ResCmdList) < 10 then -- ���� ������ 10 ���� ����
List.pushright (ResCmdList,rmsg)
end
end
else
List.clear (ResCmdList) -- ���ο� ������ ���� �� ���� ���� ���� ���ɵ��� ����Ѵ�.
end
�޼����� ó���ϴ� ProcessCommand (msg) �� �� �޽��� ó���Լ��� OnMOVE_CMD (msg[2],msg[3]) ���� �߰��ϸ�,
������ ���ɼ������ ó���Լ� (���� ��� OnMOVE_CMD_ST ()) �鵵 �ۼ��մϴ�. ���ɼ�����°� �ʿ��� ������ ���� ������ �Ϸ�� ��
���� ���� ���� �ϷḦ �˻��ϱ� ���� ���Դϴ�.
5-5 ���� ���� �˻�� TraceAI.txt �ۼ�
�ϼ��� ��ũ��Ʈ ������ �������� ������ ��� ���� �� �ֽ��ϴ�. ���������� �ִ� ��ũ��Ʈ�� ��ũ��Ʈ�� Ŭ���̾�Ʈ ���α׷�����
�ؼ��� �� ���� �޽����� �������ϴ�.
Ŭ���̾�Ʈ ���α׷��� �������� �ʴ� ���¿��� �������� �����˻縦 �� �� �ֽ��ϴ�.
��׳���ũ ��ġ������ �ִ� lua.exe ������ ����Ŭ���ϸ� ����������Ʈ�� ���ɴϴ�.
> dofile ��./AI/AI.lua��
�� �Է��ϰ� ���͸� Ĩ�ϴ�. ���������� �ִٸ� �ش� �޽����� ��µ˴ϴ�. ���ٸ� �ƹ��͵� ��µ��� �ʽ��ϴ�.
�� �˻翡�� �������� ������ ������ ȣ���� �ִ� ���¿��� ������ �����ϰԵǸ� ���� �޽����� ���� ��찡 �ֽ��ϴ�.
�̶��� ���������� ������ �ִ� �������� �̵��Ͽ� �����ϰ� �ٽ� ������ �����մϴ�.
�������� ������ ���� ��ũ��Ʈ�� ����Ǿ� ȣ��Ŭ�罺�� �۵��Ǵ��� �������� ������ ï¿½Ö¾î¼ ï¿½ï¿½ï¿½ï¿½ï¿½ï¿½ �������� ���� �� �ִ�. �̷��� ����
ȣ��Ŭ�罺�� ���º�È�� ���� ��ġ�� ��È�� ����Ͽ� ��� �ʿ伺�� ����ϴ�.
���� ���, ȣ��Ŭ�罺�� ���� �����Ͽ� ������ �� ���ķ� ������ ���� �ʴ´ٸ� ���� ���¿��� ���� ������ ������ �߻��Ѵٰ� ������ �� �ֽ��ϴ�.
function OnCHASE_ST ()
TraceAI ("OnCHASE_ST")
if (true == IsOutOfSight(MyID,MyEnemy)) then -- ENEMY_OUTSIGHT_IN
MyState = IDLE_ST
MyEnemy = 0
MyDestX, MyDestY = 0,0
TraceAI ("CHASE_ST -> IDLE_ST : ENEMY_OUTSIGHT_IN")
return
end
if (true == IsInAttackSight(MyID,MyEnemy)) then -- ENEMY_INATTACKSIGHT_IN
MyState = ATTACK_ST
TraceAI ("CHASE_ST -> ATTACK_ST : ENEMY_INATTACKSIGHT_IN")
return
end
local x, y = GetV (V_POSITION,MyEnemy)
if (MyDestX ~= x or MyDestY ~= y) then -- DESTCHANGED_IN
MyDestX, MyDestY = GetV (V_POSITION,MyEnemy);
Move (MyID,MyDestX,MyDestY)
TraceAI ("CHASE_ST -> CHASE_ST : DESTCHANGED_IN")
return
end
TraceAI (string.format(��OnChase_ST end MyEnemy: %d, EnemyX : %d, EnemyY:%d, MyDestX:%d, MyDestY:%d\n��,MyEnemy,x,y,MyDestX,MyDestY))
end
���� ���� Ư�� ���� ó�� �Լ�����, �˰� ���� ������� TraceAI �־� �ݴϴ�.
�׸��� ���� ��È� /traceai ��� ġ�� ��׳���ũ�� ��ġ�� ������ �ִ� TraceAI.txt ���Ͽ� �� ������� ��ϵ˴ϴ�.
�ٽ� /traceai �� �Է��ϸ� ����� ����ϴ�.
� ���������� ����ϰ� ���� ���� string.format �� �̿��Ͽ� ���ڿ��� �����մϴ�.
6- ��Ÿ
���α׷��� ��� ��� (LUA) Ȩ������ : http://www.lua.org
�ѱ� ��� ����Ʈ : http://www.redwiki.net/wiki/wiki.php/Lua
7-���� ����
2005.09.27
1) ���ο� ������ ȣ��Ŭ�罺�� �߰��Ǿî¼, Const.lua �� ȣ���� ���� �κа� , AI.lua �� GetMyEnemy �Լ��� �����Ǿ����ϴ�.
����� ���� �ΰ������� ����Ͻô� ��쿡, ���� �κ��� �����Ͽ���, ȣ��Ŭ�罺�� ����� �۵��մϴ�.
2005-07-19
1) �̵����ɰ� ������ ������ �� �ֽ��ϴ�.
ShiftŰ�� Alt Ű�� ���� ���¿��� �ٴڿ� ���콺 ������ Ŭ���� �ϸ� �̵������� ����˴ϴ�.
ShiftŰ�� Alt Ű�� ���� ���¿��� ���� ��� ���콺 ������ Ŭ���� �ϸ� ���ݸ����� ����˴ϴ�.
function AI(myid)
��
if
msg[1] == NONE_CMD then
if
rmsg[1] ~= NONE_CMD then
if
List.size(ResCmdList) < 10 then
List.pushright
(ResCmdList,rmsg) -- ������� ����
end
end
else
List.clear
(ResCmdList) -- ���ο� ������ �ԷµǸ� ���� ���ɵ��� �����Ѵ�.
ProcessCommand
(msg) -- ���ɾ� ó��
end
��
������ ���� �ٿ� ����, ������ ������ ��������� �����ϰ�
��������� ������ ������� ����Ʈ(ResCmdList) �� �ڿ� �߰��մϴ�.
function OnIDLE_ST
()
TraceAI
("OnIDLE_ST")
local
cmd = List.popleft(ResCmdList)
if
(cmd ~= nil) then
ProcessCommand
(cmd) -- ���� ���ɾ� ó��
return
end
��
�޽Ļ���(IDLE_ST)ó������ ���� ������ɾ� ����Ʈ�� �����Ͽ�, ��������� ó���մϴ�.
� ���¿��� �޽Ļ��·� ��ȯ�Ǹ� ��������� ó���ϰ� �ϴ� �����Դϴ�.
function OnMOVE_CMD
(x,y)
��
local curX, curY = GetV (V_POSITION,MyID)
if
(math.abs(x-curX)+math.abs(y-curY) > 15) then --
��������
���� �Ÿ� �̻��̸� (�������� �հŸ��� ó������ �ʱ� ������)
List.pushleft
(ResCmdList,{MOVE_CMD,x,y}) --
����
���������� �̵��� �����Ѵ�.
x
= math.floor((x+curX)/2) --
�߰���������
���� �̵��Ѵ�.
y
= math.floor((y+curY)/2) --
end
��
end
�̵������� �������� �ʹ� �ְ� �Ǹ� �������� ó������ �ʽ��ϴ�.
�׷��� ���� �������� �̵������� ������ɸ���Ʈ�� �� �տ� �־��ְ�
�߰��������� �ϴ� �̵���û�� �մϴ�.
2) Const.lua �� �ִ� ���ɹ�ȣ NOME_CMD ��Ÿ�� NONE_CMD �����Ͽ����ϴ�.
3) ����� �ΰ����� ������ �߰��Ͽ���, �⺻ �ΰ����ɰ� ����� �ΰ����� ���̸�
��ȯ�ϴ�
Ű�Է°� ��Èâ ���ɾ �߰��Ͽ����ϴ�.
�����
�ΰ����� ������ �⺻������ �����ϴ� �ΰ������� ������Ʈ�� ������
����
�ʵ��� ��������ϴ�. ����� �ΰ�����
������ �ִ� �ΰ����� ��ũ��Ʈ��
�۵��ϴ�
�ʿ������� AI.lua ���ϰ� AI.lua ���Ͽ� �����ϴ� AI (myid) �Լ��Դϴ�.
/ȣ������ �Ǵ� /hoai �� ��È� �Է��ϸ� �⺻ �ΰ����ɰ� ����� ����� ���̸�
��ȯ�մϴ�. ��׳���ũ ����ڵ���
���� ������ �ΰ� ���� ��ũ��Ʈ�� ����Ͻð���
�Ѵٸ� ���� AI ���� ���� USER_AI ������ �� ��ũ��Ʈ�� �����Ͻʽÿ�.
4) �����ɻ���(FOLLOW_CMD_ST)���� Alt+T (�Ǵ� ȣ��Ŭ�罺 �޴�â���� ���)�� ������
�޽Ļ���(IDLE_ST)�� ��ȯ�ϰ� AI.lua �� funciton OnFOLLOW_CMD �� �����߽��ϴ�.