Tự viết AI cho vGE trong 30 phút

Thảo luận trong 'Granado Espada' bắt đầu bởi HeyHiAll, 18/9/10.

  1. zeychu

    zeychu Youtube Master Race

    Tham gia ngày:
    6/5/07
    Bài viết:
    3
    bác ak có định phát triển cái auto này lên V200 300 không bác ? :D
     
  2. HeyHiAll

    HeyHiAll Youtube Master Race

    Tham gia ngày:
    21/6/09
    Bài viết:
    82
    Đây là phiên bản đặc biệt: nhỏ gọn, đánh nhanh, dễ sử dụng, có thể thay thế bản gốc của vGE.
    Nếu phát triển tiếp thì nó sẽ mất tính chất đặc biệt đó.

    Người dùng tự phát triển tiếp nếu muốn.
     
  3. chiengil

    chiengil Youtube Master Race

    Tham gia ngày:
    28/7/09
    Bài viết:
    0
    hịc phát triển kiểu gì khi không có thầy dậy đây hiall
    dậy từng bước thì mới thành tài được chứ
     
  4. HeyHiAll

    HeyHiAll Youtube Master Race

    Tham gia ngày:
    21/6/09
    Bài viết:
    82
    Đây chỉ là 1 cách làm. Có thể làm cách khác cũng đc.

    Các thay đổi so với trước:
    1/:
    Mã:
    func PckTestNearTarg(self,selfAi)
    {
    [B]	if(IsNearFromKeepDestPosition(selfAi,4000) != 'YES'){
    		ClearAiTarget(selfAi);
    		KeepDestMoveTo(selfAi);
    		return 2;
    	}[/B]
    	var curTarget = GetNearAtkableEnemy(selfAi,AtkRange);
    	if(curTarget != nil){
    		SetAiTarget(selfAi,curTarget);
    		return 1;
    	}
    	return 0;
    }
    Hàm trả về 3 giá trị 0,1, hoặc 2;
    Khi gọi hàm này từ 3 files kia (Attacker, Healer và Puppet)
    -Nếu hàm trả về 0 hoặc 1: xử lý giống trước đây
    -Nếu hàm trả về 2: chuyển sang trạng thái chạy (TS_MOVE)
    -Khi nhân vật chạy về tới điểm gốc, nó sẽ chuyển sang trạng thái nghỉ (TS_NONE)

    2/
    Mã:
    func SCR_ATTACKER_TS_HARVEST(self)
    {
    	sleep(100);
    	// Start Log
    	AiLog('ATTACKER_TS_HARVEST : Start!!!');
    
    	// declare variables
    	var selfAi = GetAiActor(self);
    	var prevTS = GetPrevTS(selfAi);
    [B]	var KqTest = 0;[/B]
    	//Hold Check
    	SCR_AI_LIB_UNHOLD(selfAi, prevTS);
    	// Near Item
    	if('ChangeTS' == SCR_AI_LIB_NEARITEM(selfAi)){
    		return;
    	}
    	// Move
    	HarvestDestMoveTo(selfAi);
    	// Main Loop
    	while(1){
    		SCR_AI_LIB_USEPOTION_AUTO(self,selfAi);
    
    		// User Target Check
    		if('ChangeTS' == SCR_AI_LIB_USERTARGET(selfAi)){
    			return;
    		}
    		// User Skill Check
    		if('ChangeTS' == SCR_AI_LIB_USERSKILL(selfAi)){
    			return;
    		}
    
    		// FT Lite 02
    [B]		KqTest = PckTestNearTarg(self,selfAi);
    		if(KqTest == 1){
    			ChangeTacticsAi(selfAi, 'TS_KEEP');
    			return;
    		}
    		else if(KqTest == 2){
    			ChangeTacticsAi(selfAi, 'TS_MOVE');
    			return;
    		}[/B]
    		// Near Item
    		if('ChangeTS' == SCR_AI_LIB_NEARITEM(selfAi)){
    			return;
    		}
    		// Arrival Check
    		if(IsNearFromHarvestDestPosition(selfAi, 100) == 'YES'){
    			ChangeTacticsAi(selfAi, 'TS_NONE');
    			return;
    		}
    		// Main Sleep
    		sleep(100);
    	}
    }
    3/
    -Tại trạng thái nghỉ này, nó lại chuyển sang TS_KEEP nếu chế độ AutoKeep = ON
    Mã:
    func SCR_ATTACKER_TS_NONE(self)
    {
    	sleep(100);
    	// start log
    	AiLog('ATTACKER_TS_NONE : Start!!!');
    	// declare variables
    	var selfAi = GetAiActor(self);
    	var prevTS = GetPrevTS(selfAi);
    	
    	//Hold Check
    	SCR_AI_LIB_UNHOLD(selfAi, prevTS);
    	// Main Loop
    	while(1){
    		// Do Init
    		if(0 != Ak_INIT(self,selfAi)){
    			sleep(200);
    			ChangeTacticsAi(selfAi,'TS_NONE');
    			return;
    		}
    
    		SCR_AI_LIB_USEPOTION_AUTO(self,selfAi);
    
    		// User Target Check
    		if('ChangeTS' == SCR_AI_LIB_USERTARGET(selfAi)){
    			return;
    		}
    		// User Skill Check
    		if('ChangeTS' == SCR_AI_LIB_USERSKILL(selfAi)){
    			return;
    		}
    		// Saved Target Check
    		if('TS_BATTLE_NOMINATE' == prevTS){
    			var savedTarget = GetTarget(selfAi, 'NOMINATE');
    			if(nil != savedTarget){
    				SetAiTarget(selfAi, savedTarget);
    				if(nil != GetAiTarget(selfAi)){
    					ChangeTacticsAi(selfAi, 'TS_BATTLE_NOMINATE');
    					return;
    				}
    			}
    		}
    
    [B]		// Auto Keep Check
    		if(0 != SCR_AI_LIB_AUTO_KEEP(selfAi)){
    			ChangeTacticsAi(selfAi, 'TS_KEEP');
    			return;
    		}[/B]
    		// Main Sleep
    		sleep(100);
    	}
    }
    ;)).

    ---------- Post added at 19:40 ---------- Previous post was at 18:35 ----------

    Giải thích thêm về sự hoạt động của AI ở chế độ auto mình thường dùng để AFK:
    -Khi mới vào game (hoặc chuyển kênh, chuyển map), GE đưa tất cả nhân vật về trạng thái nghỉ, và gọi hàm SCR_ATTACKER_TS_NONE(self) của AI.
    Với các nhân vật thuộc loại Healer thì SCR_HEALER_TS_NONE(self), thuộc loại Puppet thì SCR_PUPPET_TS_NONE(self).
    Ở đây tôi chỉ nói ví dụ với attacker thôi.
    -Trong hàm XXX_TS_NONE, ngay sau while(1) có gọi hàm Ak_INIT
    Mã:
    while(1){
    		// Do Init
    		if(0 != Ak_INIT(self,selfAi)){
    			sleep(200);
    			ChangeTacticsAi(selfAi,'TS_NONE');
    			return;
    		}
    ...
    ...
    }
    -Nếu Ak_INIT trả về != 0, thì dòng ChangeTacticsAi(selfAi,'TS_NONE') làm cho các lệnh bên dưới không chạy được, mà chương trình vòng lại đầu vào của SCR_ATTACKER_TS_NONE(self).
    -Cho đến khi Ak_INIT trả về 0 thì các lệnh bên dưới nó mới được thực hiện.
    -Đây là cách gọi hàm init do tôi đưa ra. Trước đó chưa có một AI nào gọi init theo cách như vậy.
    -Các nhân vật sẽ nằm tại trạng thái nghỉ cho tới khi người dùng nhấn Space. Lúc đó nhân vật tự động chuyển sang trạng thái TS_KEEP.

    ---------- Post added at 19:52 ---------- Previous post was at 19:40 ----------

    Tại trạng thái TS_KEEP AI của chúng ta kiểm tra vài thứ:

    Mã:
    func SCR_ATTACKER_TS_KEEP(self)
    {
    	sleep(100);
    	// start log
    	AiLog('ATTACKER_TS_KEEP : Start!!!');
    	// declare variables
    	var selfAi = GetAiActor(self);
    	var prevTS = GetPrevTS(selfAi);
    	// Hold Check
    	SCR_AI_LIB_UNHOLD(selfAi, prevTS);
    	// Main Loop	
    	while(1){
    		SCR_AI_LIB_USEPOTION_AUTO(self,selfAi);
    
    ...
    [B]		// FT Lite 01
    		if(AtkTestNearItem(self,selfAi) != 0){
    			ChangeTacticsAi(selfAi, 'TS_HARVEST');
    			return;
    		}
    
    		// Near Target Check
    		if('ChangeTS_BATTLE' == SCR_AI_LIB_NEARTARGET(self, selfAi)){
    			ChangeTacticsAi(selfAi, 'TS_KEEP_BATTLE');
    			return;
    		}[/B]
    		// Keep Position Check
    		SCR_AI_LIB_KEEPPOSITION(selfAi);
    		// Main Sleep
    		sleep(100);
    	}
    }
    -Kiểm tra xem có item nằm gần đó không: AtkTestNearItem(self,selfAi)
    .Nếu có: chuyển sang trạng thái nhặt đồ
    .Nếu không:
    -Kiểm tra xem có mục tiêu ở gần đó không: SCR_AI_LIB_NEARTARGET(self, selfAi)
    .Nếu có: chuyển sang trạng thái tấn công mục tiêu,
    .Nếu không: làm thêm vài việc, rồi lặp lại quá trình TS_KEEP.

    -Tương tự như vậy bạn có thể xem code để hiểu khi chuyển sang nhặt đồ, thì AI sẽ chạy tiếp như thế nào,
    -Tương tự như vậy bạn có thể xem code để hiểu khi chuyển sang tấn công mục tiêu, thì AI sẽ chạy tiếp như thế nào,
    ...
    Nếu cứ giải thích như thế này mãi sẽ rất dài. Hãy tự đọc code và suy xét xem AI sẽ làm những gì tiếp theo.
     
  5. sa0ol1000

    sa0ol1000 Youtube Master Race

    Tham gia ngày:
    22/9/10
    Bài viết:
    0
    may anh cho em xin Ai vi hotkey sua? roi voi huhuhu em k0 bjet lam
     
  6. chiengil

    chiengil Youtube Master Race

    Tham gia ngày:
    28/7/09
    Bài viết:
    0
    thầy giáo ơi cho Iphone cái số phone để alo cho thầy hỏi phát được không :D lẹ lẹ nhé
     
  7. Melodylove

    Melodylove Youtube Master Race

    Tham gia ngày:
    3/9/04
    Bài viết:
    7
    Cái này la do quá trình nghịch ngợm mình có và 1 số thông tin có thể chưa nắm rõ ai chưa biết có thể đọc và tự viết 1 cái cho mình.

    file AI.IPF là 1 file nén trong đó có 4 file là:
    - attacker.scp
    - healer.scp
    - puppet.scp
    - lib.scp
    File attacker.scp điều khiển hoạt động của các nhân vật biết đánh nhau(bao gồm đánh người và quái).
    File healer.scp điều khiển hoạt động của các nhân buff máu và buff hỗ trợ.
    File puppet.scp điều khiển hoạt động của các nhân có các skill summon điển hình là viki và cath.
    File lib.scp là file thư viện chứa các hàm dùng chung của 3 file trên.
    Về cơ bản nội dung của 3 file attacker.scp, healer.scp, puppet.scp là giống nhau và chúng có các hàm chức năng điều khiển trạng thái của nhân vật như sau:
    với xxx là tên của các file chứa các hàm.
    Giải thích các hàm trên
    Trong game nhân vật có các hoạt động sau: Đứng yên, Chạy, Đánh, Nhặt đồ, Dùng kỹ năng.
    - Khi các bạn log vào game nhân vật lúc đó sẽ đứng yên và lúc đó nhân vật của bạn ở trạng thái "Đứng yên" do hàm func SCR_XXX_TS_NONE(self) điều khiển.
    - Khi ấn chuột vào 1 điểm để cho các nhân vật chạy đến đó thì nhân vật của bạn chuyển sang trạng thái "Chạy" và do hàm func SCR_XXX_TS_MOVE(self) điều khiển.
    - Trạng thái nhặt đồ có 3 dạng:
    + Chế độ chờ đồ rơi ra để nhặt do hàm func SCR_XXX_TS_HARVEST(self) điều khiển
    + Khi thấy có đồ rơi ra phi vào nhặt do hàm func SCR_XXX_TS_HARVEST_PICK(self) điều khiển.
    + Khi nhân vật nhặt đồ vào trong túi nó ở trạng thái "Nhặt đồ" và do hàm func SCR_XXX_TS_PICK_ITEM(self) điều khiển.
    - Khi dùng kỹ năng thì nhân vật chuyển sang trạng thái "Dùng kỹ năng" và do hàm func SCR_XXX_TS_PICK_ITEM(self) điều khiển.
    - Trạng thái "Đánh" ở trạng thái này tương đối loằng ngoằng vì nó chia ra làm nhiều loại như đánh mục tiêu được chọn = chuột, đánh mục tiêu được chọn tự động = AI, chế độ chỉ đánh các con lại gần, chế độ đánh đến 1 điểm đã được chọn trước và ở chế độ "Đánh" cũng dc chia ra làm 2 chế độ nhỏ là chế độ "Chờ" và chế độ "Thịt".
    + Khi chọn mục tiêu = chuột để các nhân vật phi vào "Thịt" thì nhân vật do hàm func SCR_XXX_TS_BATTLE_NOMINATE(self) điều khiển.
    + Khi bạn ấn Ctrl + chuột trái vào 1 điểm thì các nhận vật sẽ chạy đến điểm đã chọn và trên đường đi có mục tiêu nào thì "Thịt" mục tiêu đó. Và ở trạng thái này do 2 hàm func SCR_XXX_TS_ASSAULT(self)func SCR_XXX_TS_ASSAULT_BATTLE(self) điều khiển. Khi bạn chạy mà chưa thấy mục tiêu thì do hàm func SCR_XXX_TS_ASSAULT(self) điều khiển khi thấy mục tiêu và đánh nó thì do hàm func SCR_XXX_TS_ASSAULT_BATTLE(self) điều khiển.
    + Chế độ đứng yên chỉ đánh các con quái lại gần do hai hàm func SCR_XXX_TS_HOLD(self)func SCR_XXX_TS_HOLD_BATTLE(self) điều khiển.
    + Còn chế độ mà các bạn ai cũng dùng là ấn phím SPACE do hai hàm func SCR_XXX_TS_KEEP(self)func SCR_XXX_TS_KEEP_BATTLE(self) điều khiển.
    Do trạng thái đánh có 2 trạng thái nhỏ là "Chờ" và "Thịt" do đó cứ thấy hàm nào có chữ _BATTLE(self) là chế độ "Thịt" còn ko có _BATTLE(self) là chế độ "Chờ".
    Sau khi đọc cả đoạn dài ngoằng trên theo ngu ý của mình viết 1 AI đơn giản chỉ cần quan tâm đến các hàm sau:
    func SCR_XXX_TS_KEEP(self), func SCR_XXX_TS_KEEP_BATTLE(self), func SCR_XXX_TS_NONE(self), func SCR_XXX_TS_HARVEST(self), func SCR_XXX_TS_HARVEST_PICK(self), func SCR_XXX_TS_MOVE(self).
    Còn viết thế nào các bạn đọc qua các hàm có thể sử dụng dc trong file AI.ipf mà cụ thể là tìm hiểu các hàm của Lua Script 5.0. Còn các giải thuật thì tùy từng người vì mỗi người viết một kiểu và ai cũng cho giải thuật của họ là nhất nên hay hơn cả là tự viết. :))
     
  8. J__

    J__ Youtube Master Race

    Tham gia ngày:
    12/4/08
    Bài viết:
    74
    Khi Pack ta dùng Window Zip lại rồi chỉnh Hex được không? Hay phải dùng WinZip hay loại compresser nào đó?
     
  9. HeyHiAll

    HeyHiAll Youtube Master Race

    Tham gia ngày:
    21/6/09
    Bài viết:
    82
    Được, tôi toàn zip/unzip bằng WinXp.
    Một số ziper chuyên nghiệp sau này có khi lại ko xài được.
     
  10. Coldstream

    Coldstream C O N T R A

    Tham gia ngày:
    8/8/08
    Bài viết:
    1,857
    Auto này sài thích ghê. Tốc độ kill quái phải nhanh hơn 60%. Giá mà có thêm cái tự động chuyển kênh thì quá nuột :((. Auto chỉ sợ quá giờ với hết đạn thôi...
    Còn mấy thứ bác chủ thớt viết trên kia thì em chịu, ko nhét vào đầu nổi =))
     
    Chỉnh sửa cuối: 24/9/10
  11. MARfan

    MARfan The Warrior of Light Lão Làng GVN

    Tham gia ngày:
    17/12/06
    Bài viết:
    2,349
    Nơi ở:
    Tầng hầm nhà chứa
    Auto ko hoạt động đc nữa roài :| . Hôm qua GE vừa update xog
     
  12. One23

    One23 Youtube Master Race

    Tham gia ngày:
    20/9/09
    Bài viết:
    77
    Nơi ở:
    Ho Chi Minh City
    Qua topic tự sửa file ge.exe kìa, 5 phút là AI chạy lại ngay.
     
  13. columb

    columb Donkey Kong

    Tham gia ngày:
    15/1/06
    Bài viết:
    497
    còn làm sao để báo động khi bị report vậy mấy bạn
     
  14. MagicOne

    MagicOne Mario & Luigi Lão Làng GVN

    Tham gia ngày:
    22/3/05
    Bài viết:
    769
    Mò mẫm viết auto suýt cháy CPU, ko hiểu sửa nhầm đoạn nào mà nó vào là nó phang mob liền, ko off được lun :(
     
  15. Judas.

    Judas. T.E.T.Я.I.S

    Tham gia ngày:
    10/10/10
    Bài viết:
    524
    Làm gì mà cháy CPU ghê vậy :|
     
  16. MagicOne

    MagicOne Mario & Luigi Lão Làng GVN

    Tham gia ngày:
    22/3/05
    Bài viết:
    769
    Ko tắt được auto thì cháy chứ sao.
     
  17. songlongdaiduong

    songlongdaiduong T.E.T.Я.I.S

    Tham gia ngày:
    14/12/04
    Bài viết:
    648
    Nơi ở:
    USA
    xin hỏi, vi lần đầu down cái GE auto về
    Không biết sử dụng thế nào???
    là chép cái file auto về rùi bỏ đâu để nó chạy vậy mấy bạn???

    Thanks
     
  18. One23

    One23 Youtube Master Race

    Tham gia ngày:
    20/9/09
    Bài viết:
    77
    Nơi ở:
    Ho Chi Minh City
    Bạn này hiền quá, sao ko xài task manager để tắt game?
    Không biết thì hỏi là đúng nhưng 1 câu hỏi mà quá nhiều người hỏi sẽ gây khó chịu.
    Chiu khó search và đọc kỹ sẽ tìm ra câu tra lời bạn nhé.
    Thêm 1 lời khuyên là mới chơi GE dừng nên xài auto.
     
  19. songlongdaiduong

    songlongdaiduong T.E.T.Я.I.S

    Tham gia ngày:
    14/12/04
    Bài viết:
    648
    Nơi ở:
    USA
    Thật ra mình chơi lâu rồi, bỏ cả năm, thấy cái tool hay và có v5 nên quay lại
    nhưng k biết sử dụng thế nào, còn tìm thì mình đã search cái diển dàn này mấy lần mà không thấy nên mới post lên
    dù sao củng cảm ơn, củng có ng hướng dẩn mình rùi, Thanks
     
  20. loden1987

    loden1987 Youtube Master Race

    Tham gia ngày:
    18/5/08
    Bài viết:
    2
    Sao anh không làm auto chỉ: Đánh chay, Ăn HP (khi HP < 60%) và Nhặt đồ (được quyền chọn nhận vật nhặt đồ), nhưng có chuyển kênh??? Anh cải tiến cái auto 30ph này lên một chút xíu nữa đi.
     

Chia sẻ trang này