Files
Client/Library/dxx8/samples/Multimedia/Demos/Donuts3D/donuts.h
LGram16 e067522598 Initial commit: ROW Client source code
Game client codebase including:
- CharacterActionControl: Character and creature management
- GlobalScript: Network, items, skills, quests, utilities
- RYLClient: Main client application with GUI and event handlers
- Engine: 3D rendering engine (RYLGL)
- MemoryManager: Custom memory allocation
- Library: Third-party dependencies (DirectX, boost, etc.)
- Tools: Development utilities

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude <noreply@anthropic.com>
2025-11-29 16:24:34 +09:00

545 lines
19 KiB
C++

//-----------------------------------------------------------------------------
// File: Donuts.h
//
// Desc: Header for Donuts3D game
//
// Copyright (C) 1995-2001 Microsoft Corporation. All Rights Reserved.
//-----------------------------------------------------------------------------
#ifndef DONUTS_H
#define DONUTS_H
//-----------------------------------------------------------------------------
// Defines, and constants
//-----------------------------------------------------------------------------
// This GUID must be unique for every game, and the same for
// every instance of this app. // {2014BAAC-F1FD-458e-9091-0F85C8CF6AFE}
// The GUID allows DirectInput to remember input settings
GUID g_guidApp = { 0x2014baac, 0xf1fd, 0x458e, { 0x90, 0x91, 0xf, 0x85, 0xc8, 0xcf, 0x6a, 0xfe } };
// Error codes
#define DONUTS3DERR_NODIRECT3D 0x00000001
#define DONUTS3DERR_NOD3DDEVICE 0x00000002
#define DONUTS3DERR_NOTEXTURES 0x00000003
#define DONUTS3DERR_NOGEOMETRY 0x00000004
#define DONUTS3DERR_NO3DRESOURCES 0x00000005
#define DONUTS3DERR_NOINPUT 0x00000006
// States the app can be in
enum{ APPSTATE_LOADSPLASH, APPSTATE_DISPLAYSPLASH, APPSTATE_ACTIVE,
APPSTATE_BEGINLEVELSCREEN, APPSTATE_DISPLAYLEVELSCREEN };
// Game object types
enum{ OBJ_DONUT=0, OBJ_PYRAMID, OBJ_CUBE, OBJ_SPHERE, OBJ_CLOUD, OBJ_SHIP,
OBJ_BULLET };
// Object dimensions and fixed properties
#define DONUT_WIDTH 32
#define DONUT_HEIGHT 32
#define PYRAMID_WIDTH 32
#define PYRAMID_HEIGHT 32
#define SPHERE_WIDTH 16
#define SPHERE_HEIGHT 16
#define CUBE_WIDTH 16
#define CUBE_HEIGHT 16
#define CLOUD_WIDTH 32
#define CLOUD_HEIGHT 32
#define BULLET_WIDTH 3
#define BULLET_HEIGHT 3
#define NUM_DONUT_FRAMES 30
#define NUM_PYRAMID_FRAMES 40
#define NUM_SPHERE_FRAMES 40
#define NUM_CUBE_FRAMES 40
#define NUM_BULLET_FRAMES 400
#define BULLET_XOFFSET 304
#define BULLET_YOFFSET 0
// Defines for the in-game menu
#define MENU_MAIN 1
#define MENU_SOUND 2
#define MENU_VIDEO 3
#define MENU_INPUT 4
#define MENU_VIEWDEVICES 5
#define MENU_CONFIGDEVICES 6
#define MENU_WINDOWED 7
#define MENU_640x480 8
#define MENU_800x600 9
#define MENU_1024x768 10
#define MENU_BACK 11
#define MENU_SOUNDON 12
#define MENU_SOUNDOFF 13
#define MENU_QUIT 14
TCHAR* g_strShipFiles[] = { _T("Concept Plane 3.x"), _T("Spaceship 2.x"), _T("Shusui.x"),
_T("Space Station 7.x"), _T("Spaceship 8.x"), _T("Orbiter.x"),
_T("Spaceship 13.x"), _T("Spaceship 5.x"), _T("Star Sail.x"),
_T("Heli.x"), };
TCHAR* g_strShipNames[] = { _T("Concept Plane"), _T("Green Machine"), _T("Purple Prowler"),
_T("Drone Clone"), _T("Canyon Fighter"), _T("Roundabout"),
_T("Tie-X7"), _T("Gunner"), _T("Star Sail"),
_T("Helicopter"), };
//-----------------------------------------------------------------------------
// Name: struct DisplayObject
// Desc: A game object that goes in the display list
//-----------------------------------------------------------------------------
struct DisplayObject
{
DisplayObject* pNext; // Link to next object
DisplayObject* pPrev; // Link to previous object
DWORD dwType; // Type of object
BOOL bVisible; // Whether the object is visible
D3DXVECTOR3 vPos; // Position
D3DXVECTOR3 vVel; // Velocity
FLOAT fSize;
// Constructor
DisplayObject( DWORD type, D3DVECTOR p, D3DVECTOR v );
};
//-----------------------------------------------------------------------------
// Derived classes for displayable game objects
//-----------------------------------------------------------------------------
struct C3DSprite : public DisplayObject
{
DWORD dwFramesPerLine; // How anim frames are packed in bitmap
FLOAT frame; // Current animation frame
FLOAT fMaxFrame; // Max animation frame value
FLOAT delay; // Frame/second
DWORD dwColor;
DWORD dwTextureOffsetX; // Pixel offsets into the game texture
DWORD dwTextureOffsetY;
DWORD dwTextureWidth; // Width and height in pixels
DWORD dwTextureHeight;
C3DSprite( DWORD type, D3DVECTOR p, D3DVECTOR v );
};
class CDonut : public C3DSprite
{
public:
CDonut( D3DVECTOR p, D3DVECTOR v );
};
class CPyramid : public C3DSprite
{
public:
CPyramid( D3DVECTOR p, D3DVECTOR v );
};
class CSphere : public C3DSprite
{
public:
CSphere( D3DVECTOR p, D3DVECTOR v );
};
class CCube : public C3DSprite
{
public:
CCube( D3DVECTOR p, D3DVECTOR v );
};
class CCloud : public C3DSprite
{
public:
CCloud( D3DVECTOR p, D3DVECTOR v );
};
class CBullet : public C3DSprite
{
public:
CBullet( D3DVECTOR p, D3DVECTOR v, DWORD dwType );
};
class CShip : public DisplayObject
{
public:
FLOAT fRoll;
FLOAT fAngle;
BOOL bExploded;
FLOAT fShowDelay;
public:
CShip( D3DVECTOR p );
};
//-----------------------------------------------------------------------------
// Custom Direct3D vertex types
//-----------------------------------------------------------------------------
struct SCREENVERTEX
{
D3DXVECTOR4 p;
DWORD color;
};
struct SPRITEVERTEX
{
D3DXVECTOR3 p;
DWORD color;
FLOAT tu, tv;
};
struct MODELVERTEX
{
D3DXVECTOR3 p;
D3DXVECTOR3 n;
FLOAT tu, tv;
};
#define D3DFVF_SCREENVERTEX (D3DFVF_XYZRHW|D3DFVF_DIFFUSE)
#define D3DFVF_SPRITEVERTEX (D3DFVF_XYZ|D3DFVF_DIFFUSE|D3DFVF_TEX1)
#define D3DFVF_MODELVERTEX (D3DFVF_XYZ|D3DFVF_NORMAL|D3DFVF_TEX1)
//-----------------------------------------------------------------------------
// App defined structures
//-----------------------------------------------------------------------------
// DirectInput action mapper reports events only when buttons/axis change
// so we need to remember the present state of relevant axis/buttons for
// each DirectInput device. The CInputDeviceManager will store a
// pointer for each device that points to this struct
struct InputDeviceState
{
FLOAT fAxisMoveUD;
BOOL bButtonForwardThrust;
BOOL bButtonReverseThrust;
FLOAT fAxisRotateLR;
BOOL bButtonRotateLeft;
BOOL bButtonRotateRight;
BOOL bButtonFireWeapons;
// Menu input variables
FLOAT fAxisMenuUD;
};
// Struct to store the current input state
struct UserInput
{
FLOAT fAxisMoveUD;
FLOAT fAxisRotateLR;
BOOL bButtonFireWeapons;
BOOL bButtonEnableShield;
// One-shot variables
BOOL bDoChangeView;
// Menu input variables
BOOL bDoMenuUp;
BOOL bDoMenuDown;
BOOL bDoMenuSelect;
BOOL bDoMenuQuit;
};
//-----------------------------------------------------------------------------
// Game actions (using DInput semantic mapper). The definitions here are kind
// of the whole point of this sample. The game uses these actions to map
// physical input like, "the user pressed the 'W' key", to a more useable
// constant for the game, like "if( dwInput == INPUT_CHANGEWEAPONS )...".
//-----------------------------------------------------------------------------
// Input semantics used by this game
enum INPUT_SEMANTICS
{
// Gameplay semantics
INPUT_AXIS_LR=1, INPUT_AXIS_UD,
INPUT_MOUSE_LR, INPUT_MOUSE_UD, INPUT_MOUSE_SHIPTYPE,
INPUT_TURNLEFT, INPUT_TURNRIGHT, INPUT_FORWARDTHRUST,
INPUT_REVERSETHRUST, INPUT_FIREWEAPONS, INPUT_CHANGESHIPTYPE,
INPUT_CHANGEVIEW, INPUT_CHANGEWEAPONS, INPUT_DISPLAYGAMEMENU,
INPUT_QUITGAME, INPUT_START,
// Menu semantics
INPUT_MENU_UD, INPUT_MENU_WHEEL,
INPUT_MENU_UP, INPUT_MENU_DOWN,
INPUT_MENU_SELECT, INPUT_MENU_QUIT,
};
// Game actions used by this game.
DIACTION g_rgGameAction[] =
{
// (C:\Program Files\DirectX\DirectInput\User Maps\*.ini)
// after changing this, otherwise settings won't reset and will be read
// from the out of date ini files
// Device input (joystick, etc.) that is pre-defined by DInput, according
// to genre type. The genre for this app is space simulators.
{ INPUT_AXIS_LR, DIAXIS_SPACESIM_LATERAL, 0, TEXT("Turn"), },
{ INPUT_AXIS_UD, DIAXIS_SPACESIM_MOVE, 0, TEXT("Move"), },
{ INPUT_FIREWEAPONS, DIBUTTON_SPACESIM_FIRE, 0, TEXT("Fire weapons"), },
{ INPUT_CHANGEVIEW, DIBUTTON_SPACESIM_VIEW, 0, TEXT("Change view"), },
{ INPUT_CHANGEWEAPONS, DIBUTTON_SPACESIM_WEAPONS, 0, TEXT("Change weapons"), },
{ INPUT_CHANGESHIPTYPE, DIBUTTON_SPACESIM_LOWER, 0, TEXT("Change ship type"), },
{ INPUT_DISPLAYGAMEMENU, DIBUTTON_SPACESIM_DEVICE, 0, TEXT("Display game menu"), },
{ INPUT_START, DIBUTTON_SPACESIM_MENU, 0, TEXT("Start/pause"), },
// Keyboard input mappings
{ INPUT_TURNLEFT, DIKEYBOARD_LEFT, 0, TEXT("Turn left"), },
{ INPUT_TURNRIGHT, DIKEYBOARD_RIGHT, 0, TEXT("Turn right"), },
{ INPUT_FORWARDTHRUST, DIKEYBOARD_UP, 0, TEXT("Forward thrust"), },
{ INPUT_REVERSETHRUST, DIKEYBOARD_DOWN, 0, TEXT("Reverse thrust"), },
{ INPUT_FIREWEAPONS, DIKEYBOARD_SPACE, 0, TEXT("Fire weapons"), },
{ INPUT_CHANGESHIPTYPE, DIKEYBOARD_A, 0, TEXT("Change ship type"), },
{ INPUT_CHANGEVIEW, DIKEYBOARD_V, 0, TEXT("Change view"), },
{ INPUT_CHANGEWEAPONS, DIKEYBOARD_W, 0, TEXT("Change weapons"), },
{ INPUT_DISPLAYGAMEMENU, DIKEYBOARD_F1, DIA_APPFIXED, TEXT("Display game menu"), },
{ INPUT_START, DIKEYBOARD_PAUSE, 0, TEXT("Start/pause"), },
{ INPUT_QUITGAME, DIKEYBOARD_ESCAPE, DIA_APPFIXED, TEXT("Quit game"), },
// Mouse input mappings
{ INPUT_MOUSE_LR, DIMOUSE_XAXIS, 0, TEXT("Turn"), },
{ INPUT_MOUSE_UD, DIMOUSE_YAXIS, 0, TEXT("Move"), },
{ INPUT_MOUSE_SHIPTYPE, DIMOUSE_WHEEL, 0, TEXT("Change ship type"), },
{ INPUT_FIREWEAPONS, DIMOUSE_BUTTON0, 0, TEXT("Fire weapons"), },
{ INPUT_CHANGEWEAPONS, DIMOUSE_BUTTON1, 0, TEXT("Change weapons"), },
};
// Game actions used by this game.
DIACTION g_rgBrowserAction[] =
{
// (C:\Program Files\DirectX\DirectInput\User Maps\*.ini)
// after changing this, otherwise settings won't reset and will be read
// from the out of date ini files
// Device input (joystick, etc.) that is pre-defined by DInput, according
// to genre type. The genre for this app is space simulators.
{ INPUT_MENU_UD, DIAXIS_BROWSER_MOVE, 0, TEXT("Up/down"), },
{ INPUT_MENU_UP, DIBUTTON_BROWSER_PREVIOUS, 0, TEXT("Up"), },
{ INPUT_MENU_DOWN, DIBUTTON_BROWSER_NEXT, 0, TEXT("Down"), },
{ INPUT_MENU_SELECT, DIBUTTON_BROWSER_SELECT, 0, TEXT("Select"), },
{ INPUT_MENU_QUIT, DIBUTTON_BROWSER_DEVICE, 0, TEXT("Quit menu"), },
// Keyboard input mappings
{ INPUT_MENU_UP, DIKEYBOARD_UP, 0, TEXT("Up"), },
{ INPUT_MENU_DOWN, DIKEYBOARD_DOWN, 0, TEXT("Down"), },
{ INPUT_MENU_SELECT, DIKEYBOARD_SPACE, 0, TEXT("Select"), },
{ INPUT_MENU_SELECT, DIKEYBOARD_RETURN, 0, TEXT("Select"), },
{ INPUT_MENU_SELECT, DIKEYBOARD_NUMPADENTER, 0, TEXT("Select"), },
{ INPUT_MENU_QUIT, DIKEYBOARD_ESCAPE, 0, TEXT("Quit menu"), },
// Mouse input mappings
{ INPUT_MENU_WHEEL, DIMOUSE_WHEEL, 0, TEXT("Up/down"), },
{ INPUT_MENU_SELECT, DIMOUSE_BUTTON0, 0, TEXT("Select"), },
};
// Number of actions
#define NUMBER_OF_GAMEACTIONS (sizeof(g_rgGameAction)/sizeof(DIACTION))
#define NUMBER_OF_BROWSERACTIONS (sizeof(g_rgBrowserAction)/sizeof(DIACTION))
//-----------------------------------------------------------------------------
// Inline helper functions
//-----------------------------------------------------------------------------
// Simple function to define "hilliness" for terrain
inline FLOAT HeightField( FLOAT x, FLOAT z )
{
return (cosf(x/2.0f+0.2f)*cosf(z/1.5f-0.2f)+1.0f) - 2.0f;
}
// Simple function for generating random numbers
inline FLOAT rnd( FLOAT low, FLOAT high )
{
return low + ( high - low ) * ( (FLOAT)rand() ) / RAND_MAX;
}
FLOAT rnd( FLOAT low=-1.0f, FLOAT high=1.0f );
// Convenient macros for playing sounds
inline VOID PlaySound( CMusicSegment* pSound )
{
if( pSound ) pSound->Play( DMUS_SEGF_SECONDARY );
}
inline VOID StopSound( CMusicSegment* pSound )
{
if( pSound ) pSound->Stop();
}
//-----------------------------------------------------------------------------
// Function prototypes
//-----------------------------------------------------------------------------
LRESULT CALLBACK StaticMsgProc( HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam );
//-----------------------------------------------------------------------------
// Name: class CMyApplication
// Desc: Application class.
//-----------------------------------------------------------------------------
class CMyApplication
{
public:
HRESULT Create( HINSTANCE hInstance );
INT Run();
LRESULT MsgProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam );
CMyApplication();
HRESULT InputAddDeviceCB( CInputDeviceManager::DeviceInfo* pDeviceInfo, const DIDEVICEINSTANCE* pdidi );
static HRESULT CALLBACK StaticInputAddDeviceCB( CInputDeviceManager::DeviceInfo* pDeviceInfo, const DIDEVICEINSTANCE* pdidi, LPVOID pParam );
BOOL ConfigureInputDevicesCB( IUnknown* pUnknown );
static BOOL CALLBACK StaticConfigureInputDevicesCB( IUnknown* pUnknown, VOID* pUserData );
protected:
HRESULT OneTimeSceneInit( HWND hWnd );
HRESULT FrameMove();
HRESULT RenderFrame();
VOID FinalCleanup();
// Sound functions
HRESULT CreateSoundObjects( HWND hWnd );
VOID DestroySoundObjects();
// Input functions
HRESULT CreateInputObjects( HWND hWnd );
VOID DestroyInputObjects();
void UpdateInput( UserInput* pUserInput );
// Display functions
HRESULT CreateDisplayObjects( HWND hWnd );
HRESULT RestoreDisplayObjects();
HRESULT InvalidateDisplayObjects();
HRESULT DestroyDisplayObjects();
HRESULT SwitchDisplayModes( BOOL bFullScreen, DWORD dwWidth, DWORD dwHeight );
// Menu functions
VOID ConstructMenus();
VOID DestroyMenus();
VOID UpdateMenus();
// Rendering functions
VOID UpdateDisplayList();
VOID DrawDisplayList();
VOID ShowFrame();
VOID DarkenScene( FLOAT fAmount );
VOID RenderFieryText( CD3DFont* pFont, TCHAR* strText );
// Misc game functions
VOID DisplayLevelIntroScreen( DWORD dwLevel );
VOID AdvanceLevel();
BOOL IsDisplayListEmpty();
VOID AddToList( DisplayObject* pObject );
VOID DeleteFromList( DisplayObject* pObject );
VOID CheckForHits();
HRESULT LoadTerrainModel();
HRESULT LoadShipModel();
HRESULT SwitchModel();
// Error handling
VOID CleanupAndDisplayError( DWORD dwError );
protected:
TCHAR* m_strAppName;
HWND m_hWndMain; // Main window
DWORD m_dwScreenWidth; // Dimensions for fullscreen modes
DWORD m_dwScreenHeight;
D3DDISPLAYMODE m_DesktopMode;
D3DFORMAT m_d3dfmtFullscreen; // Pixel format for fullscreen modes
D3DFORMAT m_d3dfmtTexture; // Pixel format for textures
BOOL m_bFullScreen; // Whether app is fullscreen (or windowed)
BOOL m_bIsActive; // Whether app is active
BOOL m_bDisplayReady; // Whether display class is initialized
BOOL m_bMouseVisible; // Whether mouse is visible
HBITMAP m_hSplashBitmap; // Bitmap for splash screen
DWORD m_dwAppState; // Current state the app is in
DWORD m_dwLevel; // Current game level
DWORD m_dwScore; // Current game score
// Player view mode
#define NUMVIEWMODES 3
CD3DCamera m_Camera; // Camera used for 3D scene
DWORD m_dwViewMode; // Which view mode is being used
FLOAT m_fViewTransition; // Amount used to transittion views
BOOL m_bAnimatingViewChange; // Whether view is transitioning
BOOL m_bFirstPersonView; // Whether view is first-person
// Bullet mode
FLOAT m_fBulletRechargeTime; // Recharge time for firing bullets
DWORD m_dwBulletType; // Current bullet type
// Display list and player ship
DisplayObject* m_pDisplayList; // Global display list
CShip* m_pShip; // Player's display object
// DirectDraw/Direct3D objects
LPDIRECT3DDEVICE8 m_pd3dDevice; // Class to handle D3D device
D3DPRESENT_PARAMETERS m_d3dpp;
LPDIRECT3DSURFACE8 m_pConfigSurface; // Surface for config'ing DInput devices
LPDIRECT3DVERTEXBUFFER8 m_pViewportVB;
LPDIRECT3DVERTEXBUFFER8 m_pSpriteVB;
// Support for the ship model
CD3DMesh* m_pShipFileObject; // Geometry model of player's ship
DWORD m_dwNumShipTypes;
DWORD m_dwCurrentShipType;
// DirectMusic objects
CMusicManager* m_pMusicManager; // Class to manage DMusic objects
CMusicSegment* m_pBeginLevelSound; // Sounds for the app
CMusicSegment* m_pEngineIdleSound;
CMusicSegment* m_pEngineRevSound;
CMusicSegment* m_pShieldBuzzSound;
CMusicSegment* m_pShipExplodeSound;
CMusicSegment* m_pFireBulletSound;
CMusicSegment* m_pShipBounceSound;
CMusicSegment* m_pDonutExplodeSound;
CMusicSegment* m_pPyramidExplodeSound;
CMusicSegment* m_pCubeExplodeSound;
CMusicSegment* m_pSphereExplodeSound;
// Game objects
LPDIRECT3DTEXTURE8 m_pGameTexture1; // Texture with game object animations
LPDIRECT3DTEXTURE8 m_pGameTexture2; // Texture with game object animations
CD3DMesh* m_pTerrain; // Geometry model of terrain
CD3DFont* m_pGameFont; // Font for displaying score, etc.
CD3DFont* m_pMenuFont; // Font for displaying in-game menus
// Menu objects
CMenuItem* m_pMainMenu; // Menu class for in-game menus
CMenuItem* m_pQuitMenu;
CMenuItem* m_pCurrentMenu;
// DirectInput objects
CInputDeviceManager* m_pInputDeviceManager; // Class for managing DInput devices
UserInput m_UserInput; // Struct for storing user input
DIACTIONFORMAT m_diafGame; // Action format for game play
DIACTIONFORMAT m_diafBrowser; // Action format for menu navigation
BOOL m_bPaused;
};
#endif