理論分析
遊戲修改並不是什麼難事,首先要認清遊戲本質,在修改之前,要清楚“自己所面對的只是一串數字”,修改精華和難點也都在於這裡,閣下能不能成功的把這串數字和遊戲中的HP、MP、物品、魔法等一一對位將成為整個修改全局的中心點。
因為PC不同於街機和次世代遊戲機,PC的硬體和軟體都是開放式的,才給我們以修改的可能。
要使電腦執行一程式(這裡就是閣下所謂的“遊戲”),它首先把重要的數據讀入記憶體。當閣下發出存檔命令時,程式自動將有關數據存入硬碟。遊戲修改就抓住這兩個環節,或改寫記憶體中的數據(稱為動態修改),或改寫硬碟上的存檔檔案(稱為靜態修改)。
動態修改
常規步驟如下:
1:確定欲改數據,記下它的值。
2:呼叫修改器,在數據欄里輸入欲改數據。
3:回到遊戲中,想辦法改變欲改數據(比如,花掉一些錢或吃藥加點血等)。
4:再次呼叫修改器,在數據欄里輸入改動後的數據。
如此基本上就可以找到數據了,但有時找到的數據地址有多個,那么還要再進行一次或幾次原有數據地址基礎上查找。這樣做實際就可概括為“篩選”。找到了數據就能改了,但有時無論怎么找都有兩個以上地址,那么就把記憶體數據列表打開看看,一般來說,會有其中一個地址的記憶體數據非常簡潔,那就是這個了。如果每個地址的數據列表都是差不多的,那乾脆都改了。
改數據的基本方式有三種:
1.普通修改,是簡單地把數據改過來,一旦修改數值應該發生變化,則修改數據會在修改基礎上進行應當的加減變化。
2.鎖定修改,修改器自動把數據鎖定,如果修改數值應該發生變化,修改器也會強制此數值不變,或在極短時間內修改器會強制此數值變回玩家所規定的數值。
3.熱鍵修改,可以理解為“手動鎖定”,即數據改變後按一下設定好的熱鍵,數據馬上就又回到了設定值。
靜態修改
一般是利用存檔紀錄的數值差找出地址,進行修改,一般為普通修改,多用於不支持切換的遊戲,或防動態修改的遊戲,需修改量大等情況下。
多數遊戲中都有各種可用數值來標定的屬性或特性,譬如RPG中的經驗值、生命值,動作遊戲中的彈藥數和金錢數等等,這些都可作為修改對象。更高級的還可以通過修改程式中的代碼對一些道具進行修改,其實質都是因為遊戲是用數值編寫的。但數據的存放和大家的平時習慣不同,一般存為16進制、10進制、8進制、2進制,而且會出現數值“倒裝”譬如對一個數——9999,轉為16進制為27 0F,但在電腦里的存放則為0F 27,正好兩位想倒,所以一定要注意。
對於初學者來說,一般還是選一些明顯的具有數值屬性的目標修改,待積累了一定經驗後再深入。
另外,遊戲修改一般要有遊戲修改工具,在學習下面的課程時請拿好閣下的傢伙,動態修改如:金山遊俠、東方不敗、Game Master、FPE等都很適合初學者,靜態修改如JediEdit、UltraEdit、HEX Workshop等,另外靜態修改有時也可以利用動態遊戲修改工具完成。
總之,修改遊戲比起編程、解密一類的要簡單得多。記得有人說過:“遊戲是通向電腦世界的捷徑,那么修改遊戲則是捷徑中的捷徑。”
進制換算
大家在生活中一般接觸較多十進制,即1+9=10,有時也接觸到了60進制,比如60分=1時。以上是逢十進一或逢六十進一的。其它進制還有二進制,三進制,四進制...n進制,只要數得出來都可以。電腦(特別是對於遊戲來說)一般採用二,十,十六進制。
現在的Windows都自帶計算器,進制的轉換可以不用手算,但是實踐中進制轉化會對修改者意想不到的方便,所以勸告大家不要鬆懈,把它當作基礎的基礎來學習。
首先學習幾個概念:基數,權值。
逢n進一的n就是基數,基數為幾就有幾個數字,如二進制基數為二,則有0,1兩個;八進制基數為八有0,1,2,3,4,5,6,7八個。總之從0開始,最後一位位n-1。而如十六進制等基數超過十的,從十開始為A(相當於10進制的10),B,C,D,E,F(相當於10進制的15)。
權可以這樣理解,一種進制的某一個數的每位都有一個權值m,並且權值為位數減一,如個位上的數的權值為0(位數1-1=0),十位為1(位數2-1=1)。
各個進制之間的轉化一般分為兩類。
十進制轉換為其他進制:可以概括為“除基取余”。如十進制的12化為16進制,12/16=0餘12,但十六進制是用C來表示的,所以十進制的10就是12進制的C;又如十進制30化為十六進制,30/16=1餘14,第二次用商14/16=0餘14,則十進制30轉化為十六進制為1E(由後往前取),其他類推。十進制轉化為二進制也是如此,如9/2=4餘1,4/2=2餘0,2/2=1餘0,1/2=0餘1,也就是1001了。10進制轉化為其它進制,也是一樣,但不常用,所以就不說了。
其它進制轉化為十進制:可以概括為“按權展開”。知道了權值m,就可以轉化了。 首先,每一位的位數乘以基數n的m次方,如八進制個位4,4x8^0=4(8^0等於8的0次方),百位4,4x8^2=256.最後加總。
另外一般默認十進制以d結尾,八進制為o,二進制為b,十六進制為h。
================================================
下面來練習一下:
1.420d=( )h
2.420h=( )d
3.110100100b=( )d
4.420d=( )b
================================================
答案:1、1A4;2、1056;3、420;4、110100100
================================================
2進制和16進制的轉化:有些情況中,常會遇到2進制和16進制轉化如果通過二進制轉換為十進制,再轉換為十六進制完成,有很大麻煩,下面有一種方法,提高效率。
二進制到十六進制的轉換。我們可以將二進制數由右至左分為幾部分,每一部分有四位(因為2的4次方為16),不足四位的補0,如10111b,可分為0001(補了3個0)和0111兩部分。然後將兩部分分別化為十六進制,第一個是1,第二個是7。最後合起來,為17h。
十六進制到二進制的轉換。同理,我們可將十六進制的每一位,一分為四,再合併即可。如13h,分為1和3兩部分,在一分為四,0001和0011,合併去0,就是10011。
進制的轉化,就講到這裡,修改的一個要點,相信閣下已經掌握了。
數據存儲
位、位元組
在前面,大家知道了二進制的權為2,即它只有0和1兩個數字組成,表示及運算都十分簡單。因此在計算機中就把它作為數據的基本單位‘位’(bit),然後再把八個這樣的位組成一個位元組(byte),如 1001,0011。
好了,運用前面的進制轉換知識將二進制1111,1111轉換為十進制,為255,於是可知1位元組的表示範圍是0(0000,0000)--255(1111,1111)。在計算機中常用來表示數據的有二位元組,四位元組,八位元組,十位元組等,他們都可依照上法求的範圍。(在FPE2000中的8,16,32就是指一,二,四位元組)。
另外,浮點數(即帶小數點的小數)一般用四位元組以上表示,視精度而定,對於初學者,也就不多說了。
原碼、反碼、補碼:
原碼:一位元組數據可表示的範圍是0--255,那么負數又怎么表示呢?計算機中是這樣規定的,用一個數的最高一位表示正負,0為正,1為負。例如0111,1111轉換為十進制為127,1111,1111轉換為十進制為-127,由此我們知一位元組的範圍為-127--127,其他位元組的範圍類推。
反碼:上面講的都是原碼錶示法,可在計算機中的數據都是以補碼存放的,只有這樣才能減輕cpu的負擔。提到補碼,就不得不提反碼了。計算機中是這樣規定反碼的,如果是正數,則按原碼形式不變,如127仍為0111,1111;而如果為負數則,第一位為1,其他各位取反(即0變為1,1變為0),如原碼-127(1111,1111),表示為1000,0000。
補碼:補碼同上,如果是正數,則按原碼形式不變,如127仍為0111,1111;如果為負數則除第一位為1外,其他各位取反加1,如-127,先取反為1000,0000,然後加1,為1000,0001。但1000,0000比較特殊,用它來表示-128,由此我們知補碼可表示的範圍是-128--127(因為-64d為1000,000b反碼為1111,1111b補碼+1不能用2byte表示)。
數據存儲
現在把所有的有用的數據集中起來放在一起,並取一個名字來代表這些數據的集合,這就是一個檔案了。如存檔檔案就是將遊戲中某一場景的關鍵數據集中記錄到一個檔案中,那么下次讀取這些數據也就可以接著玩了。
而且我們知道檔案中數據的存放是有序的,以位元組為單位,分別給他們編號,第一個位元組為0,第二個為1……一定要注意的是第一個位元組是0而不是1,這在後面會多次碰到。在許多地方所指的地址就是這些編號了。如一個二位元組的數據,其第一個位元組的地址為3,則整個數據的地址就為3。
另外注意的一點是,在記憶體(即檔案)中二,四等多位元組的數據,其存放的順序是顛倒的;十六進制AA BB,你在編輯工具中將看到BB AA。