游戏开发论坛

 找回密码
 立即注册
搜索
楼主: fsfool

mir3 源代码研究

[复制链接]

93

主题

1527

帖子

1532

积分

金牌会员

Rank: 6Rank: 6

积分
1532
发表于 2006-2-14 12:49:00 | 显示全部楼层

Re:mir3 源代码研究

楼上的 注意下自己的言论 如果你觉得这里人人都不如你 大可不必来 不用叫嚣的想要引起别人的注意

4

主题

106

帖子

115

积分

注册会员

Rank: 2

积分
115
 楼主| 发表于 2006-2-15 02:41:00 | 显示全部楼层

Re: Re:mir3 源代码研究

shaker: Re:mir3 源代码研究

无聊 那代码几年前就调通了....
还....

把人家的代码调通了不算大本事,全改成自己拥有版权,人家说不出话来的才有意思,进一步,若在构思和核心代码块有自己的创意,哪就叫融汇贯通,有所造就哪,您说呢?

4

主题

106

帖子

115

积分

注册会员

Rank: 2

积分
115
 楼主| 发表于 2006-2-15 02:52:00 | 显示全部楼层

第五讲:美国盖次级牛人写的一段代码

下面是美国的盖次级牛人写的一段代码,流传到全世界41个较发达国家,但是有个不易察觉的漏洞,导某些情况下黑屏,您能把它指出来吗?

#define INITGUID
#define WIN32_LEAN_AND_MEAN        // No MFC
#include <d3d8.h>
#include <d3dx8.h>
#include <stdio.h>
#include "dxutil.h"

#define PI 3.1415926535897932384626433832795
#define DegToRad(deg) ((deg/180.0f)*PI)

// Direct 3D Globals
LPDIRECT3D8                                pD3D;
LPDIRECT3DDEVICE8                pd3dDevice;
D3DXMATRIX                                matProj;                // Projection Data
D3DXMATRIX                                matCameraView;        // Camera Data
D3DXVECTOR3                                vecCameraSource;
D3DXVECTOR3                                vecCameraTarget;
LPD3DXMESH                                pMesh;
D3DMATERIAL8                        *pMeshMaterials;
LPDIRECT3DTEXTURE8                *pMeshTextures;
DWORD                                        dwNumMaterials;
LPD3DXBUFFER                        pD3DXMtrlBuffer;
float                                        fRotation = 0.0f;

// Windows Globals
const char        *szWndClass                = "XFileAnimator";
const char        *szProgramName        = "XFileAnimator Example";
HINSTANCE        g_hInstance;

// Function Prototypes
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow);
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
HRESULT hrInit3D( HWND hWnd );
void vCleanup(void);
void vRenderScene(void);
void vSetupView(void);
HRESULT hLoadXFile(char *szName);

//-----------------------------------------------------------------------------
// Name: WinMain()
// Desc: The application's entry point
//-----------------------------------------------------------------------------
int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, int nCmdShow)
{
        WNDCLASS        wc;
        HWND                hWnd;
        MSG                        msg;

        // Set up and register window class
    wc.style = CS_HREDRAW | CS_VREDRAW;
    wc.lpfnWndProc = MsgProc;
    wc.cbClsExtra = 0;
    wc.cbWndExtra = 0;
    wc.hInstance = hInstance;
    wc.hIcon = LoadIcon( NULL, IDI_APPLICATION );
    wc.hCursor = LoadCursor(NULL, IDC_ARROW);
    wc.hbrBackground = (HBRUSH )GetStockObject(BLACK_BRUSH);
    wc.lpszMenuName = NULL;
    wc.lpszClassName = szWndClass;
    RegisterClass(&wc);

    // Create a window
    hWnd = CreateWindowEx(WS_EX_TOPMOST,
                          szWndClass,
                          szProgramName,
                          WS_OVERLAPPEDWINDOW,
                          0,
                          0,
                          640,
                          480,
                          NULL,
                          NULL,
                          hInstance,
                          NULL);

        // Setup global window instance
        g_hInstance = hInstance;

        ShowWindow(hWnd, nCmdShow);
        UpdateWindow(hWnd);

        if( hrInit3D(hWnd) == E_FAIL ) {
                exit(1);
        }

        // Load the X-File Object
        hLoadXFile("3DData//droid_still.x");

        // Setup the view
        vSetupView();

        // Process messages until the program is terminated
        ZeroMemory( &msg, sizeof(msg) );
    while( msg.message!=WM_QUIT )
    {
        if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
        {
            TranslateMessage( &msg );
            DispatchMessage( &msg );
        }
        else {
                        vRenderScene();
                }
    }

        // Cleanup the environment
        vCleanup();

        return(msg.wParam);
};

//-----------------------------------------------------------------------------
// Name: MsgProc()
// Desc: The application's message loop
//-----------------------------------------------------------------------------
LRESULT WINAPI MsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam )
{
        switch( msg )
    {
        case WM_DESTROY:
            PostQuitMessage( 0 );
                        return 0;
                case WM_KEYDOWN:
                        // Handle any non-accelerated key commands
                        switch (wParam)
                        {
                        case VK_ESCAPE:
                                break;
                                // Left Arrow Key
                        case 37:
                                fRotation += 2.0f;
                                break;
                                // Right Arrow Key
                        case 39:
                                fRotation -= 2.0f;
                                break;
                        default:
                                break;
                        }
                        break;
                default:
                        break;
    }

    return DefWindowProc( hWnd, msg, wParam, lParam );
}

//-----------------------------------------------------------------------------
// Name: hrInit3D()
// Desc: Initializes Direct 3D
//-----------------------------------------------------------------------------
HRESULT hrInit3D( HWND hWnd )
{
        D3DPRESENT_PARAMETERS        d3dpp;
        D3DDISPLAYMODE                        d3ddm;
        RECT                                        rcWindowBounds;    // Saved window bounds for mode switches
    RECT                                        rcWindowClient;    // Saved client area size for mode switches

    // Create the D3D object.
    if( NULL == ( pD3D = Direct3DCreate8( D3D_SDK_VERSION ) ) )
        return E_FAIL;
   
        // Get adapter settings
    if( FAILED( pD3D->GetAdapterDisplayMode( D3DADAPTER_DEFAULT, &d3ddm ) ) )
        return E_FAIL;

        // Get the size of the window
        GetWindowRect( hWnd, &rcWindowBounds );
    GetClientRect( hWnd, &rcWindowClient );
       
        // Clear out device parameters
    ZeroMemory( &d3dpp, sizeof(d3dpp) );
       
        //
        // Setup device parameters
        //
        d3dpp.hDeviceWindow                                = hWnd;
        d3dpp.BackBufferWidth                        = (rcWindowClient.right - rcWindowClient.left);
        d3dpp.BackBufferHeight                        = (rcWindowClient.bottom - rcWindowClient.top);
        d3dpp.BackBufferFormat                        = d3ddm.Format;
        d3dpp.BackBufferCount                        = 1;
        d3dpp.SwapEffect                                = D3DSWAPEFFECT_FLIP;
        d3dpp.MultiSampleType                        = D3DMULTISAMPLE_NONE;
        d3dpp.EnableAutoDepthStencil        = TRUE;
        d3dpp.AutoDepthStencilFormat        = D3DFMT_D16;
        d3dpp.Windowed                                        = TRUE;

    // Create the D3DDevice
    if( FAILED( pD3D->CreateDevice( D3DADAPTER_DEFAULT,
                                                                        D3DDEVTYPE_HAL,
                                                                        hWnd,
                                                                        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                                                        &d3dpp,
                                                                        &pd3dDevice ) ) )
    {
                // Try 32-bits
                d3dpp.AutoDepthStencilFormat        = D3DFMT_D32;
                if( FAILED( pD3D->CreateDevice( D3DADAPTER_DEFAULT,
                                                                        D3DDEVTYPE_HAL,
                                                                        hWnd,
                                                                        D3DCREATE_SOFTWARE_VERTEXPROCESSING,
                                                                        &d3dpp,
                                                                        &pd3dDevice ) ) )
                {
                        return E_FAIL;
                }
    }

        // Turn on the zbuffer
    pd3dDevice->SetRenderState( D3DRS_ZENABLE, TRUE );
    // Turn on ambient lighting
    pd3dDevice->SetRenderState( D3DRS_AMBIENT, 0xffffffff );

        return S_OK;
}

//-----------------------------------------------------------------------------
// Name: vSetupView()
// Desc: Sets up the viewport and camera
//-----------------------------------------------------------------------------
void vSetupView(void)
{
        // Set where camera is viewing from
        vecCameraSource.x = 0.0f;
        vecCameraSource.y = 35.0f;
        vecCameraSource.z = -50.0f;
        // Set what camera is looking at
        vecCameraTarget.x = 0.0f;
        vecCameraTarget.y = 10.0f;
        vecCameraTarget.z = 0.0f;

        // Setup Camera View
        D3DXMatrixLookAtLH( &matCameraView,
                                                &vecCameraSource,
                                                &vecCameraTarget,
                                                &D3DXVECTOR3( 0.0f, 1.0f, 0.0f ) );
        // Tell the device to use the camera view for the viewport
        pd3dDevice->SetTransform( D3DTS_VIEW, &matCameraView );

        // Setup Projection
        D3DXMatrixPerspectiveFovLH( &matProj, D3DX_PI/4, 1.0f, 1.0f, 100.0f );
        // Tell the device to use the above matrix for projection
        pd3dDevice->SetTransform( D3DTS_PROJECTION, &matProj );
}

//-----------------------------------------------------------------------------
// Name: vCleanup()
// Desc: Cleans up Direct X Graphics & Other allocations
//-----------------------------------------------------------------------------
void vCleanup(void)
{
        // Release X-File Objects
        SAFE_RELEASE(pMesh);
        SAFE_DELETE_ARRAY(pMeshMaterials)
        SAFE_DELETE_ARRAY(pMeshTextures);
        SAFE_RELEASE(pD3DXMtrlBuffer);
        // Release 3D system objects
        if( pd3dDevice != NULL )
                pd3dDevice->Release();
        if( pD3D != NULL )
                pD3D->Release();
        UnregisterClass( szWndClass, g_hInstance );
}

//-----------------------------------------------------------------------------
// Name: vRenderScene()
// Desc: Displays the 3d scene
//-----------------------------------------------------------------------------
void vRenderScene(void)
{       
        D3DXMATRIX        matRotation;
        int                        mat;
               
        // Clear the backbuffer and the zbuffer
    pd3dDevice->Clear( 0, NULL, D3DCLEAR_TARGET|D3DCLEAR_ZBUFFER, D3DCOLOR_XRGB(0,0,0), 1.0f, 0 );
        // Begin Rendering
        pd3dDevice->BeginScene();
       
        //
        // Initialization
        //
       
        // Set the rotation
        D3DXMatrixRotationY( &matRotation, (float)DegToRad(fRotation) );
        pd3dDevice->SetTransform(D3DTS_WORLD, &matRotation);
       
        // Render the objects
        for( mat = 0 ; mat < (signed)dwNumMaterials ; mat++ ) {
                // Activate the material
                pd3dDevice->SetMaterial( &pMeshMaterials[mat] );
                // Set the appropriate texture
                pd3dDevice->SetTexture( 0, pMeshTextures[mat] );
                // Draw the mesh subset
                pMesh->DrawSubset( mat );
        }

        // Stop Rendering
        pd3dDevice->EndScene();
        // Output the scene
        pd3dDevice-&gtresent( NULL, NULL, NULL, NULL );
}

//-----------------------------------------------------------------------------
// Name: hLoadXFile()
// Desc: Loads an X-File into global memory space
//-----------------------------------------------------------------------------
HRESULT hLoadXFile(char *szName)
{
        HRESULT        hResult = S_OK;
        int                i;
        char        szFullPath[256];

        dwNumMaterials = 0;
       
        // Load Geometry
        if( FAILED( D3DXLoadMeshFromX(
                szName,
                D3DXMESH_SYSTEMMEM,
                pd3dDevice,
                NULL,
                &pD3DXMtrlBuffer,
                &dwNumMaterials,
                &pMesh ) ) ) {
                return(-1);
        }

        D3DXMATERIAL* d3dxMaterials = (D3DXMATERIAL*)pD3DXMtrlBuffer->GetBufferPointer();
        // Allocate memory for materials and textures
        pMeshMaterials = new D3DMATERIAL8[dwNumMaterials];
        pMeshTextures = new LPDIRECT3DTEXTURE8[dwNumMaterials];

        // Load in the materials and textures
        for( i = 0; i < (signed)dwNumMaterials ; i++ ) {
                // Copy the material
                pMeshMaterials = d3dxMaterials.MatD3D;
                // Set the ambient color for the material (D3DX does not do this)
                pMeshMaterials.Ambient = pMeshMaterials.Diffuse;
                sprintf(szFullPath,"3DData//%s",d3dxMaterials.pTextureFilename);
                // Create the texture
                if( FAILED( D3DXCreateTextureFromFile(
                        pd3dDevice,
                        szFullPath,
                        &pMeshTextures ) ) ) {
                                delete pMeshTextures;
                                pMeshTextures = NULL;
                }
        }
        // Release the material buffer
        SAFE_RELEASE(pD3DXMtrlBuffer);

        return( hResult );
}

4

主题

106

帖子

115

积分

注册会员

Rank: 2

积分
115
 楼主| 发表于 2006-2-15 03:07:00 | 显示全部楼层

第六讲:mmsystem.lib 的妙用


看了上面的代码,您可能会说,首先得增加mmsystem.h,然后是mmsysten.lib但实际上这样并不能解决问题,刚开始好象问题解决了,机器人高兴地跳跃和唱歌,但是不知什么时候又不动了,也哑巴哪,接下来还是黑屏!您现在还觉得无聊吗?我提醒您一下,主要的问题在mmsystem.lib 库内,也可以说不在库里,这个问题是应用代码与库代码合谋才得以形成的,您只要认真看看上面的代码,加上对这儿的提示好好理解,很快就会想通的,世界上的事情就是这样,你觉得简单时,当下手去做,就发现不简单了,你觉得困难时,如果能坚持做下去,又觉得简单了,您说对吗?

0

主题

11

帖子

11

积分

新手上路

Rank: 1

积分
11
发表于 2006-2-15 20:09:00 | 显示全部楼层

Re:mir3 源代码研究

9楼白痴

10

主题

47

帖子

49

积分

注册会员

Rank: 2

积分
49
发表于 2006-2-16 09:59:00 | 显示全部楼层

Re:mir3 源代码研究

公开原代码吗?

4

主题

106

帖子

115

积分

注册会员

Rank: 2

积分
115
 楼主| 发表于 2006-2-16 17:35:00 | 显示全部楼层

第七讲:我决定分步公布MIR3的源码

我决定分步公布我的源代码或者公布原来研究的MIR3的源码。
任何人回答出我在5楼提出的问题,计算出符合的数据,我将公布mir3地图解析器的源码,任何人回答六我14楼提出的问题我将公布mir3客户端调试通的源码,附大量简体中文注释!
若我将纯净的黄金撒在旅游海岸,是我的不是还是游客的不是呢?

4

主题

106

帖子

115

积分

注册会员

Rank: 2

积分
115
 楼主| 发表于 2006-2-16 17:40:00 | 显示全部楼层

第七讲++:帮助大家回答4楼问题公布一段源码注释



/*
  wil图像定义文件                                                                                                                 
*/



#ifndef _WILIMAGEHANDLER_
#define        _WILIMAGEHANDLER_



/*
        CWilImageData Class Declaration

  CWilImageData 类的声明
   
*/

//通知编译器使用1字节对齐,保证存储结构与逻辑定义的结构一致。
#pragma pack(1)

/*
mir2原版wil文件头,44字节
*/
typedef struct tagWILFILEHEADER
{
        CHAR        szTmp[40];                //40个字节的图像名字串
        INT                nImageCount;        //4个字节图片数量
}WILFILEHEADER, *LPWILFILEHEADER;

/*
屏幕点信息结构,与原mir2的wil文件中的屏幕点的信息结构兼容,都为12个字节
*/
typedef struct tagWILFILEIMAGEINFO
{
        SHORT        shWidth;        //图像宽度,以瓷砖数量表示
        SHORT        shHeight;        //图像高度,以瓷砖数量表示
        SHORT        shPX;                //每片瓷砖x方向的像素
        SHORT        shPY;                //每片瓷砖y方向的像素
        DWORD        dwImageLength;        //图像的长度
}WILIMAGEINFO, *LPWILIMAGEINFO;

/*
// WIL 文件头格式 (56Byte)
  PImageHeader = ^TImageHeader;
  TImageHeader = record
    Title       : string[40];   // 库文件标题 'WEMADE Entertainment inc.'
    ImageCount  : Integer;      // 图片数量
    ColorCount  : Integer;      // 色彩数量
    PaletteSize : Integer;      // 调色板大小
  end;
*/

/*
mir2原版wix文件-图像索引信息,48字节
注意mir3的wix文件仅仅将这里的40个字节的名字变成了20个字节
*/
typedef struct tagWIXFILEIMAGEINFO
{
        CHAR        szTmp[40];                //名字
        INT                nIndexCount;        //图片索引数量
        INT*        pnPosition;                //指向图像数据位置一个指针数组,有多少图片索引数量,这个数组就有多少项。
}WIXIMAGEINFO, *LPWIXIMAGEINFO;


/*
新的mir3版的wil文件头,28字节
在文件开始处偏移24个字节的地方是本库文件里图像的数量。
*/
typedef struct tagNEWWILFILEHEADER
{
        SHORT        shComp;                        //用于压缩的数据        偏移 0
        CHAR        szTitle[20];        //描述性字串                偏移 2
        SHORT        shVer;                        //版本号                        偏移 22
        INT                nImageCount;        //图片数量                        偏移 24
}NEWWILFILEHEADER, *LPNEWWILFILEHEADER;

/*
新的mir3版wil文件中的屏幕点的信息结构 17字节,增加了影子特性,多用了5个字节。
有多少个图像,就有多少个图像信息块
*/
typedef struct tagNEWWILFILEIMAGEINFO
{
        SHORT        shWidth;                        //图像宽度,以瓷砖数量表示
        SHORT        shHeight;                        //图像高度,以瓷砖数量表示
        SHORT        shPX;                                //每片瓷砖x方向的像素
        SHORT        shPY;                                //每片瓷砖y方向的像素
        CHAR        bShadow;                        //影子,这是新版增加的特性               
        SHORT        shShadowPX;                        //影子x方向的像素,这是新版增加的特性
        SHORT        shShadowPY;                        //影子y方向的像素,这是新版增加的特性
        DWORD        dwImageLength;                //图像的长度
}NEWWILIMAGEINFO, *LPNEWWILIMAGEINFO;

/*
新的mir3版wix文件-图像索引信息 28字节,与mir2区别仅仅在于瓷砖名字串少了20个字节
注意在文件中实际仅仅存储有描述字符串和图片索引数量共24个字节。
pnPosition是一个索引数组,数组中的值是相应的wil文件里图像数据距文件开始位置
的偏移,这个位置在mir2中是固定的0438H,而在mir3中是001cH,这个区别主要由mir2
中使用了调色板所致,调色板占用1024个字节,再加上mir2的56个字节的文件头,
正好是1080也就是0438H,而mir3中文件头部总共28个字节也就是001cH。
*/
typedef struct tagNEWWIXFILEIMAGEINFO
{
        CHAR        szTitle[20];        //描述字符串
        INT                nIndexCount;        //图片索引数量
        INT*        pnPosition;                //给出wil文件中数据的偏移位置
}NEWWIXIMAGEINFO, *LPNEWWIXIMAGEINFO;

//通知编译器使用8字节对齐,这样对32位和64位机器能发挥快速的数据传输能力。
#pragma pack(8)

/*
wil图像数据类
*/
class CWHWilImageData
{
private:
protected:
        BOOL                                m_bIsMemMapped;                                // 判断是否映射到内存了
        BOOL                                m_bIsCompressed;                        // 判断是否被压缩了

        LPBYTE                                m_pbStartData;                                // 指向开始的数据

        INT                                        m_nCurrImageIdx;                        // 当前图像索引


public:
        WIXIMAGEINFO                m_stWixImgaeInfo;                        // Wix 图像信息
        NEWWIXIMAGEINFO                m_stNewWixImgaeInfo;                //新的Wix 图像信息

        LPWILIMAGEINFO                m_lpstCurrWilImageInfo;                // 指向当前wil图像信息
        LPNEWWILIMAGEINFO        m_lpstNewCurrWilImageInfo;        //指向新的当前wil图像信息

        BYTE*                                m_pbCurrImage;                                // 指向当前图像数据
        TCHAR                                m_szWilFileName[MAX_PATH];        //wil文件名字串

        //构造函数与析构函数
        CWHWilImageData();
        ~CWHWilImageData();

        //根据wil文件名字串加载新格式图形文件,默认映射到内存,使用压缩
        BOOL NewLoad(CHAR* szWilFile, BOOL bIsMemMapped = TRUE, BOOL bComp = TRUE);

        //给新图形设置指定的索引
        BOOL NewSetIndex(DWORD dwIndex);

        //加载指定的原版格式图文件,默认映射到内存,使用压缩格式
        BOOL Load(CHAR* szWilFile, BOOL bIsMemMapped = TRUE, BOOL bComp = TRUE);

        VOID Init();        //初始化
        VOID Destroy();        //析构
        VOID SetIndex(INT nIndex);        //设置索引
};


#endif //_WILIMAGEHANDLER_

4

主题

106

帖子

115

积分

注册会员

Rank: 2

积分
115
 楼主| 发表于 2006-2-16 17:47:00 | 显示全部楼层

第八讲:在您没有完全弄清楚之前,不要随意修改mir的源



大陆很多高手都说mir2的地图文件头是52字节,不理解为何是56字节,还讲其修改为52字节,现在您们知道为何会有这种认知上的差距了吗?

42

主题

367

帖子

367

积分

中级会员

Rank: 3Rank: 3

积分
367
发表于 2006-2-17 01:10:00 | 显示全部楼层

Re:mir3 源代码研究

虽然对外挂没兴趣了 不过严重支持
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2025-2-25 02:23

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表