标题: ls11格式详解
性别:未知-离线 gameplore

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
好贴 1
功绩 7
帖子 274
编号 17912
注册 2004-9-18


发表于 2004-12-3 14:24 资料 短消息 只看该作者


QUOTE:
原帖由Maxwell于2004-12-03, 14:20:01发表

QUOTE:
原帖由gameplore于2004-12-03, 14:15:37发表
尝试了一下压回去,却不能还原   

可能编码方法不太正确  

压缩算法可能有问题吧,我一直没有仔细研究lz系列算法,只是大致明白原理,从来没有写过代码。lz是个贪心算法吧?不一定能够达到最大压缩率是吗?

我用的是lz77的方法,压回去后比原m_msg.s9稍小。但是由于寻找重复串时全文本比较,因此非常非常地慢。估计原来的压缩方法并没有这么慢。


顶部
性别:未知-离线 Maxwell

代王
监管使
枢密直学士
山南西道节度使

Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27
柱国(正二品)
组别 诸侯
级别 征东将军
好贴 4
功绩 1845
帖子 5799
编号 622
注册 2004-7-7


发表于 2004-12-3 14:27 资料 文集 短消息 只看该作者
那你的字典压缩压缩了没有?更新了字典了没有?


顶部
性别:未知-离线 gameplore

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
好贴 1
功绩 7
帖子 274
编号 17912
注册 2004-9-18


发表于 2004-12-3 14:43 资料 短消息 只看该作者
// Msg_Codec.cpp : Defines the entry point for the console application.
//

#include "stdafx.h"
#include <crtdbg.h>

#ifndef BYTE
typedef unsigned char BYTE;
#endif

static const int DICT_LEN = 0x100;
static const int ACTUAL_LEN = 0x9DE3A;

class CLS11
{
// Operations
public:
    //---------------------------------------------------------------------------
    // Inputs:  pDict       -- Pointer to the dictionary.
    //          pSrc        -- Pointer to source data buffer.
    //          pDest       -- Pointer to destination data buffer.
    //          nLenActual  -- Length of valid source data.
    //          nLenSrc     -- Length of source data buffer.
    //          nLenDest    -- Length of destination data buffer.
    //          bCompress   -- true if LZ compression needs to be taken.
    // Returns: The length of encoded data.
    // Summary: Call this method to encode specified data with LS11.
    //--------------------------------------------------------------------------
    int Encode( BYTE *pDict, const BYTE *pSrc, BYTE *pDest, int nLenActual, int nLenSrc, int nLenDest, bool bCompress = false );
   
    //--------------------------------------------------------------------------
    // Inputs:  pDict       -- Pointer to the dictionary.
    //          pSrc        -- Pointer to source data buffer.
    //          pDest       -- Pointer to destination data buffer.
    //          nLenSrc     -- Length of source data buffer.
    //          nLenDest    -- Length of destination data buffer.
    //          nLenActual  -- Length of original data.
    // Returns: The length of decoded data.
    // Summary: Call this method to decode LS11-encoded data. This procedure is
    //          based on the code written by Maxwell & van.
    //--------------------------------------------------------------------------
    int Decode( BYTE *pDict, const BYTE *pSrc, BYTE *pDest, int nLenActual, int nLenSrc, int nLenDest );

// Properties
protected:
    int m_srcpos;
    int m_destpos;
    int m_bitpos;
    BYTE *m_pDest;
    const BYTE *m_pSrc;

// Implementations
protected:   
    void SetCode( unsigned int code );
    unsigned int GetCode( );
    void ReorderDict( BYTE const *pDictSrc, BYTE *pDictDest, int nLenDict );   
   
} ;

int CLS11::Encode( BYTE *pDict, const BYTE *pSrc, BYTE *pDest, int nLenActual, int nLenSrc, int nLenDest, bool bCompress )
{
    int off, len, lenmax, offmax;
    BYTE *pNewDict = new BYTE[DICT_LEN];
   
    m_pDest = pDest;
    m_pSrc = pSrc;
    m_srcpos = 0;
    m_destpos = 0;
    m_bitpos = 0;
        
    _ASSERT( nLenActual <= nLenSrc && pNewDict );

    memset( m_pDest, 0, nLenDest );
    ReorderDict( pDict, pNewDict, DICT_LEN );

    // If no compress needs to be taken, use dictionary only.
    if( !bCompress )
    {
        while( m_srcpos < nLenActual && m_destpos < nLenDest )
        {
            SetCode( pNewDict[m_pSrc[m_srcpos++]] );
        }
    }
    else
    {
        while( m_srcpos < nLenActual && m_destpos < nLenDest )
        {           
            // Scan whole text
            for( off = 1, lenmax = 0, offmax = 1; off <= m_srcpos; off++ )
            {
                for( len = 0; len + m_srcpos < nLenSrc && m_pSrc[m_srcpos - off + len] == m_pSrc[m_srcpos + len]; len++ );                        
                if( len > lenmax )
                {
                    lenmax = len;
                    offmax = off;
                }
            }
            // Replace the duplicated string with two number: offmax + 256 and lenmax - 3
            if( lenmax >= 3 )
            {
                SetCode( offmax + 256 );
                SetCode( lenmax - 3 );

                m_srcpos += lenmax;
            }
            else
            {
                SetCode( pNewDict[m_pSrc[m_srcpos++]] );
            }        
        }
    }

    while( m_bitpos )
    {
        m_pDest[m_destpos] <<= 1;
        m_bitpos++;
        if( m_bitpos > 7 )
        {
            m_bitpos = 0;
            m_destpos++;
            break;
        }
    }   

    delete [] pNewDict;
    return m_destpos;
}
int CLS11:ecode( BYTE *pDict, const BYTE *pSrc, BYTE *pDest, int nLenActual, int nLenSrc, int nLenDest )
{
    unsigned int code, off, len;   

    m_pSrc = pSrc;
    m_destpos = 0;
    m_srcpos = 0;
    m_bitpos = 7;

    _ASSERT( nLenActual <= nLenDest );
    while( m_srcpos < nLenSrc && m_destpos < nLenActual )
    {
        code = GetCode( );  
        if( code < 256 )
        {
            pDest[m_destpos++] = pDict[code];
        }
        else
        {            
            off = code - 256;
            len = GetCode( ) + 3;
            for( unsigned int i = 0; i < len && m_destpos < nLenDest; i++ )
            {
                pDest[m_destpos] = pDest[m_destpos - off];
                m_destpos++;
            }
        }
    }
    // Padding
    while( m_destpos < nLenActual )
    {
        pDest[m_destpos++] = pDict[0];
    }
    return m_destpos;
}

void CLS11::SetCode( unsigned int code )
{
    unsigned int temp, code1, code2;
    int len, i;
    temp = code;
    len = 0;
    code1 = 0;        
    // How many valid bits are contained in variable code
    while( temp > 1)
    {
        temp >>= 1;
        code1 = (code1 << 1) | 0x01;
        len++;
    }     
    if( (code1 << 1) <= code )
    {
        len++;
        code1 = code & (~1);
    }
    else
        code1--;

    code2 = code - code1;

    // Output bits of code1
    for( i = len - 1; i >= 0; i-- )
    {
        m_pDest[m_destpos] = (m_pDest[m_destpos] << 1) | (code1 >> i);
        m_bitpos++;
        if( m_bitpos > 7)
        {
            m_bitpos = 0;
            m_destpos++;
        }
    }
    // Output bits of code2
    for( i = len - 1; i >= 0; i-- )
    {
        m_pDest[m_destpos] = (m_pDest[m_destpos] << 1) | (code2 >> i);
        m_bitpos++;
        if( m_bitpos > 7)
        {
            m_bitpos = 0;
            m_destpos++;
        }
    }
}
unsigned int CLS11::GetCode( )
{
    unsigned int code1 = 0, code2 = 0;
    int len = 0, bit;
    do
    {
        bit = (m_pSrc[m_srcpos] >> m_bitpos) & 0x01;
        code1 = (code1 << 1) | bit;
        len++;
        m_bitpos--;
        if( m_bitpos < 0 )
        {
            m_bitpos = 7;
            m_srcpos++;
        }
    } while( bit );
    for( int i = 0; i < len; i++ )
    {
        bit = (m_pSrc[m_srcpos] >> m_bitpos) & 0x01;
        code2 = (code2 << 1) | bit;
        m_bitpos--;
        if( m_bitpos < 0 )
        {
            m_bitpos = 7;
            m_srcpos++;
        }
    }

    return (code1 + code2);
}

void CLS11::ReorderDict( const BYTE *pDictSrc, BYTE *pDictDest, int nLenDict )
{
    for( int i = 0; i < nLenDict; i++ )
    {
        for( int j = 0; j < nLenDict; j++ )
        {
            if( pDictSrc[j] == i )
            {
                pDictDest = j;
                break;
            }
        }        
    }
}
// Big-endian to Little-endian or reverse
int Convert( int x )
{
    int ret = 0;
    BYTE *p = (BYTE *)(&x);
    ret = (p[0] << 24) | (p[1] << 16) | (p[2] << 8) | p[3];   
    return ret;
}
void TestEncode()
{
    CLS11 ls11;
    BYTE *pDict, *pSrc, *pDest;

    int l1, l2, off, zero = 0;// Big-endian values

    pDict = new BYTE[DICT_LEN];   

    FILE *fin = fopen("C:/code/m_msg_dec.s9", "rb");
    FILE *fout = fopen("C:/code/m_msg_enc1.s9", "wb");
    FILE *fout2 = fopen("C:/code/m_msg_enc2.s9", "wb");

    _ASSERT( fin && fout && fout2 && pDict );

    fread( pDict, 0x10, 1, fin );
    fwrite( pDict, 0x10, 1, fout );
    fwrite( pDict, 0x10, 1, fout2 );

    fread( pDict, 0x100, 1, fin );
    fwrite( pDict, 0x100, 1, fout );   
    fwrite( pDict, 0x100, 1, fout2 );

    fread( &l1, 4, 1, fin );   
    pSrc = new BYTE[Convert(l1)];

    fread( &l2, 4, 1, fin );   
    pDest = new BYTE[Convert(l2)];

    fread( &off, 4, 1, fin );   

    _ASSERT( pSrc && pDest );
        
    fseek( fin, Convert(off), SEEK_SET );
    fseek( fout, Convert(off), SEEK_SET );   

    fread( pSrc, Convert(l1), 1, fin );   
    int nLen = ls11.Encode( pDict, pSrc, pDest, ACTUAL_LEN, Convert(l1), Convert(l2), false );
    fwrite( pDest, nLen, 1, fout );

    fseek( fout, 0x110, SEEK_SET );
    l1 = Convert( nLen );   
    fwrite( &l1, 4, 1, fout );
    fwrite( &l2, 4, 1, fout );   
    fwrite( &off, 4, 1, fout );
    fwrite( &zero, 4, 1, fout );

   
    nLen = ls11.Encode( pDict, pSrc, pDest, ACTUAL_LEN, Convert(l2), Convert(l2), true );   
    fseek( fout2, Convert(off), SEEK_SET );
    fwrite( pDest, nLen, 1, fout2 );

    fseek( fout2, 0x110, SEEK_SET );
    l1 = Convert( nLen );   
    fwrite( &l1, 4, 1, fout2 );
    fwrite( &l2, 4, 1, fout2 );   
    fwrite( &off, 4, 1, fout2 );
    fwrite( &zero, 4, 1, fout2 );

    fclose( fin );
    fclose( fout );
    fclose( fout2 );

    delete [] pDict;
    delete [] pSrc;
    delete [] pDest;
}

void TestDecode()
{
    CLS11 ls11;
    BYTE *pDict, *pSrc, *pDest;

    int l1, l2, off, zero = 0;

    pDict = new BYTE[DICT_LEN];   

    FILE *fin = fopen("I:/San9pk/m_msg.s9", "rb");
    FILE *fout = fopen("C:/code/m_msg_dec.s9", "wb");

    _ASSERT( fin && fout && pDict );

    fread( pDict, 0x10, 1, fin );
    fwrite( pDict, 0x10, 1, fout );

    fread( pDict, 0x100, 1, fin );
    fwrite( pDict, 0x100, 1, fout );   

    fread( &l1, 4, 1, fin );
    l1 = Convert( l1 );
    pSrc = new BYTE[l1];

    fread( &l2, 4, 1, fin );
    l2 = Convert( l2 );
    pDest = new BYTE[12];

    fread( &off, 4, 1, fin );
    off = Convert( off );

    _ASSERT( pSrc && pDest );
        
    fseek( fin, off, SEEK_SET );
    fseek( fout, off, SEEK_SET );

    fread( pSrc, 0x47EEF, 1, fin );

    int nLen = ls11.Decode( pDict, pSrc, pDest, ACTUAL_LEN, l1, l2 );

    fwrite( pDest, nLen, 1, fout );

    fseek( fout, 0x110, SEEK_SET );
    l1 = l2 = Convert( nLen );
    fwrite( &l1, 4, 1, fout );
    fwrite( &l2, 4, 1, fout );
    off = Convert( off );
    fwrite( &off, 4, 1, fout );
    fwrite( &zero, 4, 1, fout );

    fclose( fin );
    fclose( fout );

    delete [] pDict;
    delete [] pSrc;
    delete [] pDest;
}



int _tmain(int argc, _TCHAR* argv[])
{
    //TestDecode();
    TestEncode();
    return 0;
}
顶部
性别:未知-离线 gameplore

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
好贴 1
功绩 7
帖子 274
编号 17912
注册 2004-9-18


发表于 2004-12-3 14:51 资料 短消息 只看该作者
根据解码时的描述:
向回偏移a个位置后复制b个字节

所以猜测编码时采用的是类似于lz77的那种方法,不过原来的编码可能没有全文本扫描匹配,而只在前后一定长度范围内扫描。。。
顶部
性别:未知-离线 Maxwell

代王
监管使
枢密直学士
山南西道节度使

Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27
柱国(正二品)
组别 诸侯
级别 征东将军
好贴 4
功绩 1845
帖子 5799
编号 622
注册 2004-7-7


发表于 2004-12-3 15:09 资料 文集 短消息 只看该作者


QUOTE:
原帖由gameplore于2004-12-03, 14:51:32发表
根据解码时的描述:
向回偏移a个位置后复制b个字节

所以猜测编码时采用的是类似于lz77的那种方法,不过原来的编码可能没有全文本扫描匹配,而只在前后一定长度范围内扫描。。。

其实分块大小和窗口大小只影响压缩速度和压缩率,并不影响解压缩。
顶部
性别:未知-离线 gameplore

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
好贴 1
功绩 7
帖子 274
编号 17912
注册 2004-9-18


发表于 2004-12-4 00:50 资料 短消息 只看该作者
前面的压缩编码方法有点小bug,调试后已经修正。解码出来的文件再压缩回去之后,san9.exe都能够正确识别。

附件:

m_msg_dec.s9: 从原来的m_msg.s9中解压出来的,并改了两个人的名字:
曹操==>嬴政;吕布==>项羽

m_msg_enc1.s9:采用最低压缩率(没有用lz扫描,而只用了字典)对m_msg_dec.s9重新压缩后的文件;

m_msg_end2.s9:采用最高压缩率(全文本lz扫描,对于lz来说应该是最高了)对m_msg_dec.s9重新压缩后的文件。

把m_msg_enc1.s9和m_msg_enc2.s9改名为m_msg.s9后放回去,游戏程序都能正确解压,而且进入游戏发现曹操和吕布的名字变成嬴政和项羽了  

很早之前,我就一直在考虑怎么改历史武将的姓名,无奈自己水平有限,很长时间以来都不知道怎么改。幸好得到van,maxwell等的帮助,今日才得以实现。   

另外还有一个问题,虽然名字是改了,可是旗子怎么还是没变呢?新武将的话,旗子应该是和姓有关系的,怎么历史武将的旗子不是根据姓名来确定的么?

附件装不下,分3个帖子


附件: m_msg_dec.rar (2004-12-4 00:50, 173.47 K)
该附件被下载次数 425
顶部
性别:未知-离线 gameplore

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
好贴 1
功绩 7
帖子 274
编号 17912
注册 2004-9-18


发表于 2004-12-4 00:52 资料 短消息 只看该作者
m_msg_enc2.s9


附件: m_msg_enc2.rar (2004-12-4 00:52, 239.26 K)
该附件被下载次数 361
顶部
性别:未知-离线 gameplore

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
好贴 1
功绩 7
帖子 274
编号 17912
注册 2004-9-18


发表于 2004-12-4 00:56 资料 短消息 只看该作者
m_msg_enc1_part1.s9


附件: m_msg_enc1.part1.rar (2004-12-4 00:56, 200 K)
该附件被下载次数 289
顶部
性别:未知-离线 gameplore

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
好贴 1
功绩 7
帖子 274
编号 17912
注册 2004-9-18


发表于 2004-12-4 00:58 资料 短消息 只看该作者
m_msg_enc1 part2


附件: m_msg_enc1.part2.rar (2004-12-4 00:58, 123.7 K)
该附件被下载次数 288
顶部
性别:男-离线 东方无翼

燕王

Rank: 28Rank: 28Rank: 28Rank: 28
组别 诸侯
级别 卫将军
好贴 6
功绩 849
帖子 6143
编号 1704
注册 2003-10-27


真的要压缩回去
顶部
性别:未知-离线 Maxwell

代王
监管使
枢密直学士
山南西道节度使

Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27
柱国(正二品)
组别 诸侯
级别 征东将军
好贴 4
功绩 1845
帖子 5799
编号 622
注册 2004-7-7


发表于 2004-12-4 11:07 资料 文集 短消息 只看该作者
原来gameplore是用vc的高手呀,以后这个版上有人请教vc的问题你可要出手呀。
顶部
性别:男-离线 van

平曲侯泸川军节度使

Rank: 13Rank: 13Rank: 13Rank: 13
柱国(正二品) 工神
组别 节度使
级别 军师将军
好贴 3
功绩 475
帖子 984
编号 25461
注册 2004-11-24


发表于 2004-12-4 12:18 资料 主页 文集 短消息 只看该作者
另外还有一个问题,虽然名字是改了,可是旗子怎么还是没变呢?新武将的话,旗子应该是和姓有关系的,怎么历史武将的旗子不是根据姓名来确定的么?

类似于三十,游戏里只支持一部分姓,所以对于历史武将,旗帜编号应该存在于剧本中
顶部
性别:未知-离线 gameplore

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
好贴 1
功绩 7
帖子 274
编号 17912
注册 2004-9-18


发表于 2004-12-4 15:28 资料 短消息 只看该作者


QUOTE:
原帖由Maxwell于2004-12-04, 11:07:38发表
原来gameplore是用vc的高手呀,以后这个版上有人请教vc的问题你可要出手呀。

高手不敢当,不过欢迎讨论
顶部
性别:未知-离线 gameplore

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
好贴 1
功绩 7
帖子 274
编号 17912
注册 2004-9-18


发表于 2004-12-4 15:35 资料 短消息 只看该作者


QUOTE:
原帖由van于2004-12-04, 12:18:19发表
类似于三十,游戏里只支持一部分姓,所以对于历史武将,旗帜编号应该存在于剧本中

这就试一下
顶部
性别:未知-离线 爱喝绿茶

Rank: 2Rank: 2
组别 百姓
级别 奋威校尉
功绩 1
帖子 103
编号 17338
注册 2004-9-9


发表于 2005-1-16 16:20 资料 短消息 只看该作者
编译无法通过,有完整的cpp文件或程序吗?
顶部
性别:未知-离线 Maxwell

代王
监管使
枢密直学士
山南西道节度使

Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27
柱国(正二品)
组别 诸侯
级别 征东将军
好贴 4
功绩 1845
帖子 5799
编号 622
注册 2004-7-7


发表于 2005-1-16 19:26 资料 文集 短消息 只看该作者


QUOTE:
原帖由爱喝绿茶于2005-01-16, 16:20:20发表
编译无法通过,有完整的cpp文件或程序吗?

给出的应该都是完整的代码,自己加上调用部分就可以了。
顶部
性别:未知-离线 爱喝绿茶

Rank: 2Rank: 2
组别 百姓
级别 奋威校尉
功绩 1
帖子 103
编号 17338
注册 2004-9-9


发表于 2005-1-20 11:13 资料 短消息 只看该作者
大哥知道是怎么回事吗?
顶部
性别:未知-离线 Maxwell

代王
监管使
枢密直学士
山南西道节度使

Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27
柱国(正二品)
组别 诸侯
级别 征东将军
好贴 4
功绩 1845
帖子 5799
编号 622
注册 2004-7-7


发表于 2005-1-20 11:27 资料 文集 短消息 只看该作者
应该是你复制代码的时候出了问题,重新从论坛上复制一遍就可以了。
顶部
性别:男-离线 van

平曲侯泸川军节度使

Rank: 13Rank: 13Rank: 13Rank: 13
柱国(正二品) 工神
组别 节度使
级别 军师将军
好贴 3
功绩 475
帖子 984
编号 25461
注册 2004-11-24


发表于 2005-1-20 12:09 资料 主页 文集 短消息 只看该作者
网页上复制的是全角空格,在VC里将全角空格(0xa10xa1)全部替换为空格(0x32)就可以了
顶部
性别:未知-离线 爱喝绿茶

Rank: 2Rank: 2
组别 百姓
级别 奋威校尉
功绩 1
帖子 103
编号 17338
注册 2004-9-9


发表于 2005-1-20 16:19 资料 短消息 只看该作者
替换后发现少了个引用文件 stdio.h
顶部
性别:未知-离线 爱喝绿茶

Rank: 2Rank: 2
组别 百姓
级别 奋威校尉
功绩 1
帖子 103
编号 17338
注册 2004-9-9


发表于 2005-1-21 11:18 资料 短消息 只看该作者
可能吧,搞不好改好了_tchar 的某个地方就出来了。
金圭子解决了这些问题了吗?
指点一下啊!!!
顶部
性别:男-离线 东方无翼

燕王

Rank: 28Rank: 28Rank: 28Rank: 28
组别 诸侯
级别 卫将军
好贴 6
功绩 849
帖子 6143
编号 1704
注册 2003-10-27




QUOTE:
原帖由van于2005-01-20, 12:09:59发表
网页上复制的是全角空格,在VC里将全角空格(0xa10xa1)全部替换为空格(0x32)就可以了

真是不好意思,我为了对齐把两个半角的空格合并成一个全角的了。看来还造成了不少麻烦。
顶部
性别:未知-离线 金圭子

白衣伯爵中大夫

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 白衣卿相
级别 征西将军
好贴 4
功绩 265
帖子 4926
编号 27961
注册 2004-12-16


发表于 2005-1-24 09:15 资料 文集 短消息 只看该作者


QUOTE:
原帖由爱喝绿茶于2005-01-21, 11:18:13发表
可能吧,搞不好改好了_tchar 的某个地方就出来了。
金圭子解决了这些问题了吗?
指点一下啊!!!

这个…………可惜我也是没解决………………直接放弃了。
顶部
性别:男-离线 三国在飞
(天外怪魔 分封不动)

合肥侯谏议大夫

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 翰林学士
级别 安东将军
好贴 2
功绩 668
帖子 3313
编号 1650
注册 2003-10-24
来自 江西


好人做到底,把三九的也做出来吧!

作个能修改三九的MSG来,不能让三十专美于前啊!

代码有啦,怎么没有人帮忙做个出来呢???
顶部
性别:未知-离线 gameplore

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
好贴 1
功绩 7
帖子 274
编号 17912
注册 2004-9-18


发表于 2005-4-1 19:31 资料 短消息 只看该作者


QUOTE:
原帖由三国在飞于2005-04-01, 18:52:34发表
好人做到底,把三九的也做出来吧!

作个能修改三九的MSG来,不能让三十专美于前啊!

代码有啦,怎么没有人帮忙做个出来呢???

三九的msg好像不是很有规律

直接用ultraedit改改就可以啦
顶部
性别:男-离线 三国在飞
(天外怪魔 分封不动)

合肥侯谏议大夫

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 翰林学士
级别 安东将军
好贴 2
功绩 668
帖子 3313
编号 1650
注册 2003-10-24
来自 江西




QUOTE:
原帖由gameplore于2005-04-01, 19:31:14发表

QUOTE:
原帖由三国在飞于2005-04-01, 18:52:34发表
好人做到底,把三九的也做出来吧!

作个能修改三九的MSG来,不能让三十专美于前啊!

代码有啦,怎么没有人帮忙做个出来呢???

三九的msg好像不是很有规律

直接用ultraedit改改就可以啦

不行,全是看不懂的乱码,怎么改,另外,乱改后游戏都进不去啊!
顶部
性别:未知-离线 gameplore

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
好贴 1
功绩 7
帖子 274
编号 17912
注册 2004-9-18


发表于 2005-4-5 18:03 资料 短消息 只看该作者


QUOTE:
原帖由三国在飞于2005-04-01, 22:15:56发表
不行,全是看不懂的乱码,怎么改,另外,乱改后游戏都进不去啊!

可以改的

乱码是因为解压缩之后还是BIG5,要用AppLocale启动UE32,选择繁体中文语言(BIG5),然后再打开文件解压缩后的文件,就可以看见文字了。

至于输入,随便哪一个能输入BIG5码的输入法都可以
顶部
性别:男-离线 三国在飞
(天外怪魔 分封不动)

合肥侯谏议大夫

Rank: 14Rank: 14Rank: 14Rank: 14Rank: 14
组别 翰林学士
级别 安东将军
好贴 2
功绩 668
帖子 3313
编号 1650
注册 2003-10-24
来自 江西




QUOTE:
原帖由gameplore于2005-04-05, 18:03:46发表
可以改的

乱码是因为解压缩之后还是BIG5,要用AppLocale启动UE32,选择繁体中文语言(BIG5),然后再打开文件解压缩后的文件,就可以看见文字了。

至于输入,随便哪一个能输入BIG5码的输入法都可以

我做不出来的,不会解压啊,更不要说解压更改后再压缩回去!你能不能帮忙做个出来呢(修改器)
顶部
性别:未知-离线 Maxwell

代王
监管使
枢密直学士
山南西道节度使

Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27Rank: 27
柱国(正二品)
组别 诸侯
级别 征东将军
好贴 4
功绩 1845
帖子 5799
编号 622
注册 2004-7-7


发表于 2005-4-6 12:35 资料 文集 短消息 只看该作者
修改器应该不是很难做,只要有解压,压缩,GB<->BIG5几个就可以了。
顶部
性别:未知-离线 gameplore

Rank: 3Rank: 3Rank: 3
组别 士兵
级别 忠义校尉
好贴 1
功绩 7
帖子 274
编号 17912
注册 2004-9-18


发表于 2005-4-14 23:52 资料 短消息 只看该作者


QUOTE:
原帖由三国在飞于2005-04-05, 18:13:18发表

QUOTE:
原帖由gameplore于2005-04-05, 18:03:46发表
可以改的

乱码是因为解压缩之后还是BIG5,要用AppLocale启动UE32,选择繁体中文语言(BIG5),然后再打开文件解压缩后的文件,就可以看见文字了。

至于输入,随便哪一个能输入BIG5码的输入法都可以

我做不出来的,不会解压啊,更不要说解压更改后再压缩回去!你能不能帮忙做个出来呢(修改器)

原来是不会解压缩啊,其实前面的代码已经给出了。这里附上了一个简单的压缩/解压缩程序

我没有测试过,只在以前试过修改人名是可以的。完整的源代码也附上,想做完整的msg修改器的朋友可以以此为基础

程序仅仅提供压缩、解压缩功能,没有提供BIG5/GBK转码及修改功能。

使用方法:
1. 将m_msg.s9解压缩,假设解压后为m_msg_dec.s9;
2.用applocale开ultraedit32打开m_msg_dec.s9进行修改;
3.将m_msg_dec.s9压缩,假设压缩后为m_msg_enc.s9;
4.备份原来的m_msg.s9,将m_msg_enc.s9重命名为m_msg.s9,修改生效。


附件: s9msg.rar (2005-4-14 23:52, 284.77 K)
该附件被下载次数 416


顶部

正在浏览此帖的会员 - 11 人在线 - 0 位会员(0 隐身), 11 位游客




当前时区 GMT+8, 现在时间是 2024-11-20 14:44
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.021271 second(s), 9 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP