##EasyReadMore##

2009年12月22日 星期二

[教程] jass函數教學—解密AI文件



文章網址:http://bbs.wow8.org/viewthread.php?tid=119554&page=1&fromuid=308308#pid1705603

一段時間沒來,今天上論壇發現AI區和其他的區和別的區合併了。。。

AI區非常火爆

那麼我這個菜鳥也來為大家解密下AI文件

申明:我也不是個高手,難免說錯啊。那麼大家理解。
不懂WE和jass的可以無視下面的了。
1:先來說下jass函數的基本格式:
function [名稱] takes [參數列] returns [返回類型]
[函數體部分]
return[返回值]
endfunction 標誌一段function的結束
中括號裡的為我加的此處是些什麼東西加的註釋
那麼先來一個簡單的說明:
function YK takes unit u returns boolean
return GetPlayerController(GetOwningPlayer(u))==MAP_CONTROL_USER
endfunction
此函數名為:YK,參數為單位u,返回值為boolean真假型變量。
函數體部分的意思有WE基礎的很容易看懂吧
那麼基本格式說到這,有很多東西自己體會的,我講多了也沒什麼好處。
2:調用函數: call。這部分我直接引用GREEDWIND的jass基礎教程的講解
用於調用函數. 當使用 call MyFunction(), 則運行了函數MyFunction
    語法格式:
       call 函數名(參數1, 參數2, ...., 參數n)
()號內的的用逗號(,)分割開的參數表. 如果被調用的函數要求輸入參數, 則 call 語句中必須包含被調用函數要求輸入參數類型相同數據類型或用空值.
    這句另人費解的話用人類的模糊語言來說就是:
        我(被調用的函數)要愛情(參數)才可以工作, 你(call 過程)就不要給我麵包(傳遞的參數)
    這個是用jass寫的要愛情和麵包但什麼也不做而且還不高興的空函數:
    function isHappy takes unit whichunit, item needbread returns boolean
        return false    //函數返回值為"假"
    endfunction
    這個是用jass寫的總是高興傻笑的空函數:
    function IamAlwaysHappy takes nothing returns boolean
        return true //函數返回值為(真)
    endfunction
在函數中isHappy()要求傳遞2個參數, 參數數據類型分別是unit和item
    而函數IamAlwaysHappy()沒有要求傳遞任何參數, 就不要多此一舉給它愛情和麵包了
  
    假設girl是unit類型變量, bread是item類型變量. 我們可這樣調用:
    call isHappy(girl, bread)   //給了愛情又給麵包, 真是貼心人啊 。這才是正確的引用,下面的4個都是錯誤的
    call isHappy(null, bread)   //不給愛情只給麵包, 不要餓死他
    call isHappy(girl, null)    //給愛情不給麵包, 為了愛情故, 我把麵包拋
    call isHappy(null, null)    //兩者皆不給, 反正給了也返回"假"值
    call IamAlwaysHappy()       //IamAlwaysHappy()沒有要求任何參數
那麼講了這麼多,貌似沒講到AI部分。那我來結合WONDER的AI文件來慢慢講解
我的講解用的文件時wonder0.792的AI文件。
在AI文件的5000行左右,有類似下面的函數
1號函數:
function Z8 takes nothing returns nothing
call K7(1550,'n003','I024','I01N')
endfunction
2號函數:
function VVV takes nothing returns nothing
call K7(870,'n00S','I00G','I01N')
endfunction
3號函數:
function VEV takes nothing returns nothing
call T7(750,'I024','I00G',0,'n008','kybl')
endfunction
那麼我們先關注的是參數和返回值部分。都為nothing,那麼此函數為過程函數。調用的時候()不要求加任何東西
這是什麼呢?
不知道大家有沒有看過roustar31的解密wonderAI文件這個帖子,他舉得一個裝備合成的例子是玄武,那麼上面這個是衣服。
看函數體部分;三個函數都是調用函數,1和2調用的是同一個:K7,那麼我們來看下這個函數名為K7的函數。
K7函數:
function K7 takes integer L7,integer Q5,integer WP,integer M7 returns nothing
set KR=YW(V)
if KR0 or(M7>0 and VQ(NI,M7)>0)then
return
endif
if EL(NI)<1 then
call H7()
endif
if EL(NI)>0 then
call O7(Q5,WP,1)
endif
endfunction
由於加密的原因,大家是不是看得雲裡霧裡的呢?
用monking提供的解密技術還原的如下:
function zs_buyHiItem takes integer gold,integer shopid,integer itemid,integer enditemid returns nothing
set mGold=GetPlayerGold(ai_player)
if mGold0 or GetNumberOfItemByID(mHero,enditemid)>0 then 
return
endif
  if GetSlotsFreeOnUnit(mHero)<1 then
  call sellLowPrice()
  endif
   if GetSlotsFreeOnUnit(mHero)>0 then
  call buyDueNumberOfItem(shopid,itemid,1)
  endif
endfunction
那麼重點看得是參數列部分;依次是:integer gold(整數型變量gold),integer shopid(整數型變量shopid),integer itemid(整數型變量itemid)integer enditemid(整數型變量enditemid).不懂嗎?
那麼我來一個一個得解釋;第一個是買的東西的要多少黃金。第2個是要買的東西所在商店的ID代碼。第3個是物品的ID代碼。第三個是要合成的物品的ID代碼。
現在來對照1號函數和2號函數。他調用K7函數,那麼括號裡的當然要輸入這些參數,而且要按照順序。1號函數是買什麼的呢?玄武甲?對了
玄武甲價格1550,買它的商店的代碼是n003,物品ID代碼是I024,要合成的是衣服的ID代碼是I01N.
那麼T7函數自己也照我的思路來研究吧
那麼我今天就寫這麼多了
此帖會天天更新的,那麼大家多關注。
會有更多的解密哦、。。
哈哈


沒有留言:

張貼留言

※怎麼下載?Xuite硬碟MediaFireBadongoSendSpace
※文章可以轉貼嗎?可以,不過要註明出處、標示本站連結。
※載點可以轉貼嗎?不可以,不能盜連。
※建議瀏覽器:Chrome 或 Firefox 或 Opera 或 IE7以上
!請按+1來支持本站!