名稱:風雲麻將 (中文版)
簡介:林育洲撰寫、大宇1989年出品的13張麻將遊戲,採日本規則計台。遊戲的目的主要
是挑戰4位對手,順利取得畢業證書。雖然每次打牌前,都提供玩家一次換牌的機會,
但玩家的進牌率並沒特別調高,每局想聽牌都顯得很困難。而電腦對手則作弊嚴重,
常常沒幾手就聽牌胡牌,且愈到後面的關卡愈嚴重,加上沒有存檔的功能,想一次打
過四關可說是不可能的事。玩家玩個幾次大概就會打退堂鼓,嚴重影響遊戲的娛樂性。
保護:無
限制:單色螢幕。PC速度不能太快,否則會當機。DosBox建議不超過4000 cycles。
備註:正常版請執行PLAY.BAT,修改版請執行UPLAY.BAT(對方得完分後按任一鍵可
清除其分數)。
修改:
遊戲是用BASIC程式寫的,YJL.EXE其實是BASIC解譯器,實際的程式碼是LOVE.DAT。但它已
轉成中介碼,且有壓縮加密保護,所以無法修改。一種方法是用GameMaster搜尋雙方分數
的位置,但也很難找。因為遊戲採用浮點數記錄分數,其格式和傳統IEEE格式不同:
指數(Exponent):8 bit,實際指數=指數-129
正負號(Sign):1 bit
尾數(Mantissa):23 bit
IEEE格式則為:
正負號(Sign):1 bit
指數(Exponent):8 bit,實際指數=指數-127
尾數(Mantissa):23 bit
因此要算出實際的數值,如果不懂程式,會相當困難。以下為其計算的程式:
float32 d = 整數數值;
int32 c = *((int32*)&d);
char* s = (char*)&c;
int sign = s[3] & 0x80;
int exp = ((c >> 23) & 0xff) + 2;
c &= 0x7fffff;
s[2] |= (char)sign;
s[3] = (char)exp;
風雲麻將浮點數值4 byte = s
此外,分數的記錄位置並不固定,每次進遊戲都會變動(不確定遊戲的過程是否會變動),
因此要鎖定記憶體也有困難度,稍一不慎就可能當機。唯一方法便是透過常駐程式,定時去
設定雙方的分數。因為分數的記錄位置並不固定,所以必須得知其記錄規則。經過追蹤,得
知它是採用指標鏈結的方式記錄,開始指標記錄在DS:[5]處,區塊內容意義如下:
下個區塊指標:2 byte,FFFFh表結束
資料辨識碼:4 byte,表示資料的意義,04 53 43 02即分數
子辨識碼:不定長度,表示資料更進一步的意義
敵方分數=D2 D8,我方分數=D2 D9
實際資料:不定大小
以下便是定期重置雙方分數的常駐程式碼(因用時較長,故不使用定時岔斷):
EB73 jmp $start
90 nop
$int09:
9C pushf
06 push es
50 push ax
53 push bx
33C0 xor ax,ax
8EC0 mov es,ax
26813E2400140A cmp word ptr es:[24h],0A14h
7558 jne $exit
26A12600 mov ax,word ptr es:[26h]
058A1F add ax,1F8Ah
8EC0 mov es,ax
268B1E0500 mov bx,word ptr es:[5]
$CheckPtr:
81FB0070 cmp bx,7000h
7644 jbe $exit
83FBFF cmp bx,0FFFFh
743F je $exit
26817F020453 cmp word ptr es:[bx+2],5304h
7532 jne short $next_ptr
26817F044302 cmp word ptr es:[bx+4],0243h
752A jne short $next_ptr
26817F06D2D8 cmp word ptr es:[bx+6],0D8D2h
750E jne $next_id
26C747080000 mov word ptr es:[bx+8],0
26C7470A0000 mov word ptr es:[bx+10],0
EB14 jmp short $next_ptr
$next_id:
26817F06D2D9 cmp word ptr es:[bx+6],0D9D2h
750C jne $next_ptr ; 這裡改成EB0C便不會一場就勝,可一直打到贏
26C747080040 mov word ptr es:[bx+8],4000h
26C7470A1C91 mov word ptr es:[bx+10],911Ch
$next_ptr:
268B1F mov bx,word ptr es:[bx]
EBB6 jmp short $CheckPtr
$exit:
5B pop bx
58 pop ax
07 pop es
9D popf
EA db 0EAh
$int09_addr:
00000000 dd ?
$start:
0E push cs
1F pop ds
B80935 mov ax,3509h
CD21 int 21h
891E7101 mov word ptr [$int09_addr],bx
8C067301 mov word ptr [$int09_addr+2],es
B80925 mov ax,2509h
BA0301 mov dx,offset $int09
CD21 int 21h
BA7501 mov dx,offset $start
CD27 int 27h
操作:
1.主選單
聲音開關:PC喇叭音樂開關
使用說明:打牌的按鍵說明
台數解說:詳列各種台型並說明
實戰遊戲:開始遊戲
結束:離開遊戲,回到DOS
2.換牌階段
Space = 決定指定的牌是否更換(可多選)
Enter = 進行換牌,並開始打牌
3.打牌階段(不會提示是否可吃、碰、或胡牌)
T = 吃
P = 碰
Q = 槓
U = 聽
I = 胡
或按上鍵出現吃碰選單供選擇。
密技:
雜誌上記載:進入第四關擲骰子時,立即輸入32580,即可一開始拿到大牌。
但實測結果是無效的。
說明:(作者-青衫)
1.每一局開打前,都會讓玩家有一次換牌的機會,完成後才會開始打牌。
2.有役(由牌型組成的番台)才能胡,持有寶牌雖有番台,但不算役,一樣不能胡。
3.寶牌為牌尾翻開牌的同花色下一張,風牌依東南西北,三元牌依白發中循環。每槓一次可
多翻一張寶牌。
4.立直聽牌時不需額外付錢,但可多一台(門清才能立直)。
5.流局時,沒聽牌的人不用給有聽牌的人錢。
*** 關卡說明
1.第一關:
2.第二關:
3.第三關:
4.第四關:
*** 胡牌牌型與番台數
1.一番役
平胡:四組順子加一組對子,沒有任何槓子、坎子及字牌。
斷么九:沒有任何一、九以及字牌。
雙龍抱:同一種花色有兩副相同的順子。
龍裡龍(寶牌):胡牌時,若有寶牌,每張加一番。
海底摸月:最後一張牌自摸。
河底撈魚:胡最後一張對方打的牌。
槓上開花:槓牌後立即自摸。
搶槓胡:胡對方明槓的牌。
立直:宣告聽牌,不可再換牌或吃碰槓牌,必須門清才能立直。
一發:立直後馬上胡牌。
門清自摸:沒有吃碰牌,且自己摸到聽的牌而胡牌。
役牌:三元牌、場風牌、門風牌的刻子,每組各1番。
2.二番役
混帶么九:牌面所有組合都帶有么九牌(老頭牌與字牌)。
一色三順:同一種花色有三副相同的順子。
三色同順:有三組不同花色但是數字相同的順子。
一條龍:有同花色三組順子組成的一至九牌型。
二盃口:有兩組〈一盃口〉的牌。
三色同刻:有三組不同花色但是數字相同的刻子。
三連刻:同一種花色有三副連在一起的刻子(同一色三順)。
小三元:三元牌有兩組刻子一組對子。已包含役牌另外加計的二番。
三暗刻:有三組自己摸到的刻子(非碰出來的)。
三槓子:有三組槓子(明暗皆可)。
對對胡:全部是刻子或槓子,沒有順子。
七對子:由七組對子所組成的牌型。
雙立直:第一圈就立直(天聽)。
混老頭:牌面所有組合都是么九牌的刻子與對子(需再加計對對胡的二番)。
3.三番役
純帶么九:牌面所有組合都帶有老頭牌(數字一九),沒有字牌。
混一色:全部為同一花色的牌或字牌。
4.滿貫
十三不搭:起手13張牌除了一個對子外,其他全部獨立,彼此毫無關聯。
5.七番役
清一色:由同一花色組成的牌。
6.役滿
九連寶燈:清一色,且序數為1112345678999再加一張胡牌。
小四喜:四風牌有三組刻子一組對子。
大三元:三元牌均為刻子或槓子。
綠一色:全部是綠色牌(二三四六八索與青發)。
清老頭:牌面所有組合都是老頭牌的刻子與對子。
字一色:全部是字牌。
國士無雙:么九牌(老頭牌與字牌)各有一張,另一張亦為么九牌。
十三門聽:國士無雙聽牌但沒有對子,即聽十三門(一般都算雙役滿)。
四暗刻:有四組自己摸到的刻子(非碰出來的)。
天胡:莊家發牌後即為胡牌的牌型。
地胡:非莊家第一次摸牌即胡牌。
人胡:第一巡就胡對手的牌。
四刻單吊:四暗刻單吊聽牌(一般都算雙役滿)。
大車輪:二筒到八筒形成的七對子。
九門聽:九連寶燈以序數為1112345678999聽牌,即聽九門(一般都算雙役滿)。
7.雙役滿
大四喜:四風牌均為刻子或槓子。
四槓子:有四組槓子。
*** 分數算法
1.每多一番分數加倍。
2.5番以下或滿貫時,客家最多8000分,莊家最多12000分。
3.6~7番時為跳滿,客家12000分,莊家最多18000分。
4.8~10番時為倍滿,客家16000分,莊家最多24000分。
5.11~12番以上為三倍滿,客家24000分,莊家最多36000分。
6.13番以上為役滿,客家32000分,莊家48000分。