當前位置:編程學習大全網 - 熱門推薦 - 怎麽把手機遊戲改bt

怎麽把手機遊戲改bt

手機遊戲中主要按文件不同可分為兩類,壹是class文件,代表作品是:英雄傳說等,二是資源文件,代表作品是彩虹城堡等。目前,壹是可以用halo2.0來修改的,二還無法用halo2.0修改,請自行使用十六進制工具(UE、HEX等)修改,本文不作討論。另外,存檔類的修改也不列入本文內容,因為也是涉及到十六進制工具的。

BT修改可能會破壞遊戲原本的樂趣,所以我並不提倡,只是技術上的交流。還是那句話,想要體驗遊戲的樂趣,請自行下載原版。

工具:halo2.0,DJ Java Decompiler

Java遊戲:英雄傳說s60原版(S60V3,240*320)(本文以此為例。為什麽是原版?為什麽只是S60版?這是為了讓更多的迷友,可以自己動手修改英雄傳說的漢化版本,因為想玩才會有動力。若直接使用我修改的,這樣是無法學會BT修改的。)

1、數據的準備

什麽是數據的準備?為何要數據準備?簡而言之,就是我們到底需要改哪些數據,在遊戲中原來的初值究竟是多少?那我們先用sjboy來模擬,看看我們到底想改哪些屬性數據。

咿呀!手機頑童竟然無法模擬?!到選擇人物時,直閃屏,按任何鍵都無法進入遊戲。其實,只需不斷按F3鍵來減緩遊戲的速度即可!進入遊戲後,到人物菜單界面,

好,主要是以下數據,金錢300

圖壹:等級數1,經驗值0,升級需要經驗值80,生命值72/72,法力值60/60

圖二:力量8,生命5,敏捷3,意誌4,進攻16,防守5

圖三:可加點數0

2、數據的查找和修改

那我們壹個個來找到這些數據並修改成自己想要的BT值。復習bb的修改教程,打開halo2.0,選擇class editor,編輯,全文查找,輸入300(為什麽是300?因為這個值較為特殊,重復率較少啊。如果選擇1,0,8或其它的話,可能會查出壹大堆來,沒有編程基礎的迷友就會很迷茫,到底是去選擇哪個才是正確的。那又為什麽不選擇72呢?這個也挺特殊啊!我要告訴妳壹個不幸的消息,在本遊戲查找中,會出現很多,而且可以告訴大家,搜索出來的都不是。Why?經驗?不是。是後面編譯文件的分析。)只查找到壹個目標,按照bb的教程已修改其中的參數,金錢300,力量8,生命5,敏捷3,意誌4。5個值。

那麽按照bb的方法,為何找不到其它相關的數值呢?!我非要修改怎麽辦?其實屬性值的賦值有兩種方式,壹種是顯式,如i=300或a=5,bb的教程中只能修改到這些數據。另壹種是隱式,如a=(b+c)*100等。此教程主要介紹隱式數值的修改。

壹般來說,如果是賦值屬性值的話,會在同壹個class文件中,所以,既然我們找到了金錢300的class所在,我們也應該找到了其它的屬性值。那金錢300具體是在哪個class文件呢?答案就在搜索結果中,類名——ao。

現在用DJ反編譯ao.class,查找300,發現,a_g_fld.a = 300;即金錢的變量名為a_g_fld.a,值為300.說明我們所找的class文件是正確的。那分別查找8,5,3,4,也找到了!

case 6: // '\006'

b_short_fld = 8;

e_short_fld = 5;

f_short_fld = 3;

g_short_fld = 4;

a_e_array1d_fld[0] = (e)ad.a((byte)0, (byte)0, true, false);

a_e_array1d_fld[0].b = true;

a_e_array1d_fld[0].h = 1;

break;

呵呵,力量的變量名為b_short_fld,以下類同,不作解釋。

那查找72看看,的確沒有。這也證實了此為隱式賦值。那我們該怎麽辦?這麽多的變量,字符看得頭都大了,還是分不清哪個是哪個。我起初也想了很久,壹個個去分析,太慢。那我們先搜索b_short_fld看看,發現倪端。

h_short_fld += ((b_short_fld + m) * 4) / 5;

i_short_fld += (b_short_fld + m) / 5;

dataoutputstream.writeShort(b_short_fld);

前兩個不就是什麽所謂的隱式嘛?!那h和i又代表什麽呢?暫且先不考慮。最後壹句是io流操作,意思是把寫入b_short_fld變量值。這個倒是給了點啟示。

因為發現

dataoutputstream = new DataOutputStream(bytearrayoutputstream)).writeByte(f_byte_fld);

dataoutputstream.writeByte(g_byte_fld);

dataoutputstream.writeInt(a_int_fld);

dataoutputstream.writeInt(b_int_fld);

dataoutputstream.writeInt(c_int_fld);

dataoutputstream.writeInt(d_int_fld);

dataoutputstream.writeInt(e_int_fld);

dataoutputstream.writeInt(f_int_fld);

dataoutputstream.writeByte(z);

dataoutputstream.writeShort(a_short_fld);

dataoutputstream.writeShort(b_short_fld);

dataoutputstream.writeShort(e_short_fld);

dataoutputstream.writeShort(f_short_fld);

dataoutputstream.writeShort(g_short_fld);

只要把找到這些數據的源頭,也就是屬性值的源頭了。最後的4個變量即是bb教程中的4個屬性參數,這裏就不作討論了。

1.那麽我們先從f_byte_fld變量開始。首先搜索,看看這個變量到底是代表什麽含義的。這個變量搜索***有3處。前兩處是寫入和讀取;另壹處是賦初值public byte f_byte_fld = 0;所以暫且不管。

2. g_byte_fld變量,還是搜索,g_byte_fld = 1;另外還有幾處判斷,略去,有興趣的迷友可自行研究。

另外,if(g_byte_fld < 99)

{g_byte_fld++;

……

}

猜測是等級,如果變量小於99,遞加……。經測試,的確是表示等級的變量。那麽我們把變量變為11試試,即把g_byte_fld = 1改為g_byte_fld = 1;那這個是顯性函數,修改方法同bb教程,修改後如圖:

3.變量a_int_fld = d_int_fld; b_int_fld = e_int_fld;那麽我們先看變量d_int_fld

d_int_fld = (e_short_fld + n + g_byte_fld) * 12;

e_int_fld = (g_short_fld + p + g_byte_fld) * 12;

讓我們看到了壹些希望。因為72和60都是12的倍數,難道這就是我們所要找的數據。

據我們所知e_short_fld=5,g_short_fld = 4(前面已講到),那麽g_byte_fld就是前面2所講的等級,即生命值和魔法值與生命和意誌有關,而且與等級有關。那n與p又是代表什麽呢?

public final void n()

{

e ae1[] = (e[])a_e_array1d_fld;

m = 0;

n = 0;

o = 0;

p = 0;

for(int i1 = 0; i1 < 5; i1++)

if(ae1[i1] != null)

{

m += ae1[i1].j[0];

n += ae1[i1].j[1];

o += ae1[i1].j[2];

p += ae1[i1].j[3];

}

在n()中賦值和遞加。初值為n=0,p=0;代入,d_int_fld=72;e_int_fld=60,^_^,終於找到真身了。那麽最簡單修改就是修改12這個系數,因為這也既不改變原來的計算公式,也容易操作,當然妳也可以修改成其它。說改就改,把12改成60,理論上應該是360和300.

Halo2.0操作步驟:打開jar,選擇ao.class.右鍵editor class,出現下圖:

反編譯得,d_int_fld = (e_short_fld + n + g_byte_fld) * 12;在public final void n()中,那麽halo2.0方法找到n,發現訪問控制public,final已勾選,類型void,和反編譯的完全相同,那麽選擇n方法下的code,如圖

把159 bipush 12和180 bupush 12中的12均改成60後,保存方法,編譯打包運行得:

與猜測得相壹致。Binggo,當然,還可以直接修改這個隱式函數,這裏不做討論。(修改無極限,只要妳能想到,修改的方法很多。我只是提供大家思路而已)

那麽先前找到的a_int_fld是什麽呢?繼續查找,

public final void b(int i1)

{

a_int_fld += i1;

if(a_int_fld > d_int_fld)

a_int_fld = d_int_fld;

if(a_int_fld < 0)

a_int_fld = 0;

bs.a_as_static_fld.c();

if(a_int_fld == 0)

{

a((byte)6);

super.k = 0;

u = 24;

return;

} else

{

return;

}

}

所以可以知曉,a_int_fld代表生命值的當前值。同理可得b_int_fld代表魔法值的當前值。

4.變量c_int_fld,c_int_fld = 0;初值為0,難道是經驗值?繼續查找,

public final void f(int i1)

{

i1 *= 4;

for(c_int_fld += i1; c_int_fld >= f_int_fld;)

{

c_int_fld -= f_int_fld;

r();

}

if(c_int_fld < 0)

c_int_fld = 0;

bs.a_as_static_fld.e();

a_p_fld.a(i1);

}

既然出現f_int_fld,那麽順便查找壹下,發現

f_int_fld = (g_byte_fld * g_byte_fld * g_byte_fld - g_byte_fld * g_byte_fld) + 80 * g_byte_fld;

看到80了,壹陣激動,因為g_byte_fld的初值為1(前面已經搜索過)那麽f_int_fld的初值就為80,哈哈,終於找到升級需要經驗值了。為了驗證我們的猜想,把80改成99試試,如圖,的確如此:

呵呵,把f_int_fld改成1就可以實現,打壹個怪可以升N級,或者自己編個函數,實現打壹個怪升壹級。

回到剛才的c_int_fld,那麽當c_int_fld += i1; c_int_fld >= f_int_fld;時,c_int_fld += i1; c_int_fld -= f_int_fld;猜想c_int_fld變量代表經驗值。因為,若c_int_fld=82>80時,那麽就升級,經驗值變為82-80=2.好,那我們來簡單修改c_int_fld的初值。c_int_fld = 0,把0改成66試試。變量賦值語句在public final void c(byte byte0)方法中,修改後得下圖:

至此,圖壹所涉及的所有參數等級數、經驗值、升級需要經驗值、生命值、法力值。已都找到並修改。

5.變量a_short_fld,a_short_fld =0,

if(g_byte_fld < 99)

{

g_byte_fld++;

n();

super.a.addElement(new aw((byte)3));

super.a.addElement(new aw((byte)4));

a_short_fld += 3;

}

分析得,a_short_fld變量是表示可加後可加點數的。為什麽?首先初值是0,另外,在等級<99時,每升壹級變量就在自身的基礎上+3,推測應該是表示升級後可加點數。修改後如圖:

至此,已經把io操作流中的寫入數據壹壹分析。但好像還是遺漏了圖2中的攻擊和防禦數值。那它們到底隱藏在何處呢?的確,我也找了很久沒找到,後來發現,攻擊與力量值有壹定聯系,隨著力量數值的修改,攻擊值也會變動

那麽我們就來搜索b_short_fld這個變量。發現

h_short_fld += ae1[0] == null ? 0 : ((short) (ae1[0].a + (ae1[0].e * 5) / 2));

h_short_fld += ((b_short_fld + m) * 4) / 5;

i_short_fld += ae1[1] == null ? 0 : ((short) (ae1[1].a + ae1[1].e));

i_short_fld += ae1[2] == null ? 0 : ((short) (ae1[2].a + ae1[2].e * 2));

i_short_fld += ae1[3] == null ? 0 : ae1[3].a;

i_short_fld += ae1[4] == null ? 0 : ae1[4].a;

i_short_fld += (b_short_fld + m) / 5;

i_short_fld += g_byte_fld / 3;

h_short_fld和i_short_fld很特別,與力量有關的隱式函數,值得我們關註。

經修改發現,的確如我們所料(具體變量間如何變化,就不在展開,牽涉比較多的變量數據基礎,怕很多迷友看得壹頭霧水。有興趣的迷友可以自己參看壹些基礎知識。)

把h_short_fld += ((b_short_fld + m) * 4) / 5中的4改成40,i_short_fld += g_byte_fld / 3中的除法idiv改成乘法imul(具體圖文不列舉了,如果能熟練操作halo2.0的應該沒有問題,即把偏移量為433:idiv,編輯(高級),修改成imul即可。)

得,攻擊變為74,防禦變為8

3、小結:本教程主要講解如何去尋找目標數據,halo2.0上的操作講解並不詳細,請諒解!

數據準備中的所有數據已壹壹找到。

BT修改並不是壹件很容易的事,需要壹定的耐心和推斷能力。

  • 上一篇:娘要嫁人魏淑青為啥要離婚?
  • 下一篇:JAPANESE\CHERRY\BLOSSOM\BODYLOTION這幾個英文是什麽意思?幹嘛用的?
  • copyright 2024編程學習大全網