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