名稱:風雲麻將 (中文版)
簡介:林育洲撰寫、大宇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分。