You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

335 lines
9.8 KiB

#pragma once
#include <cstdint>
#include <limits>
#include <string>
namespace dvl {
// Note to self: Linker error => forgot a return value in cpp
// Storm API definition
#ifndef STORMAPI
#define STORMAPI
#endif
#ifdef __cplusplus
struct CCritSect {
SDL_mutex *m_critsect;
CCritSect()
{
m_critsect = SDL_CreateMutex();
if (m_critsect == NULL) {
ErrSdl();
}
}
~CCritSect()
{
SDL_DestroyMutex(m_critsect);
}
void Enter()
{
if (SDL_LockMutex(m_critsect) < 0) {
ErrSdl();
}
}
void Leave()
{
if (SDL_UnlockMutex(m_critsect) < 0) {
ErrSdl();
}
}
};
#endif
// Game states
#define GAMESTATE_PRIVATE 0x01
#define GAMESTATE_FULL 0x02
#define GAMESTATE_ACTIVE 0x04
#define GAMESTATE_STARTED 0x08
#define GAMESTATE_REPLAY 0x80
#define PS_CONNECTED 0x10000
#define PS_TURN_ARRIVED 0x20000
#define PS_ACTIVE 0x40000
#define LEAVE_ENDING 0x40000004
#define LEAVE_DROP 0x40000006
#if defined(__GNUC__) || defined(__cplusplus)
extern "C" {
#endif
BOOL STORMAPI SNetCreateGame(const char *pszGameName, const char *pszGamePassword, const char *pszGameStatString, DWORD dwGameType, char *GameTemplateData, int GameTemplateSize, int playerCount, const char *creatorName, const char *a11, int *playerID);
BOOL STORMAPI SNetDestroy();
/* SNetDropPlayer @ 106
*
* Drops a player from the current game.
*
* playerid: The player ID for the player to be dropped.
* flags:
*
* Returns TRUE if the function was called successfully and FALSE otherwise.
*/
BOOL
STORMAPI
SNetDropPlayer(
int playerid,
DWORD flags);
/* SNetGetGameInfo @ 107
*
* Retrieves specific game information from Storm, such as name, password,
* stats, mode, game template, and players.
*
* type: The type of data to retrieve. See GAMEINFO_ flags.
* dst: The destination buffer for the data.
* length: The maximum size of the destination buffer.
*
* Returns TRUE if the function was called successfully and FALSE otherwise.
*/
BOOL
STORMAPI
SNetGetGameInfo(
int type,
void *dst,
unsigned int length);
/* SNetGetTurnsInTransit @ 115
*
* Retrieves the number of turns (buffers) that have been queued
* before sending them over the network.
*
* turns: A pointer to an integer that will receive the value.
*
* Returns TRUE if the function was called successfully and FALSE otherwise.
*/
BOOL
STORMAPI
SNetGetTurnsInTransit(
DWORD *turns);
// Network provider structures
typedef struct _client_info {
DWORD dwSize; // 60
char *pszName;
char *pszVersion;
DWORD dwProduct;
DWORD dwVerbyte;
DWORD dwUnk5;
DWORD dwMaxPlayers;
DWORD dwUnk7;
DWORD dwUnk8;
DWORD dwUnk9;
DWORD dwUnk10; // 0xFF
char *pszCdKey;
char *pszCdOwner;
DWORD dwIsShareware;
DWORD dwLangId;
} client_info;
typedef struct _user_info {
DWORD dwSize; // 16
char *pszPlayerName;
char *pszUnknown;
DWORD dwUnknown;
} user_info;
BOOL STORMAPI SNetJoinGame(int id, char *gameName, char *gamePassword, char *playerName, char *userStats, int *playerid);
/* SNetLeaveGame @ 119
*
* Notifies Storm that the player has left the game. Storm will
* notify all connected peers through the network provider.
*
* type: The leave type. It doesn't appear to be important, no documentation available.
*
* Returns TRUE if the function was called successfully and FALSE otherwise.
*/
BOOL
STORMAPI
SNetLeaveGame(
int type);
BOOL STORMAPI SNetPerformUpgrade(DWORD *upgradestatus);
BOOL STORMAPI SNetReceiveMessage(int *senderplayerid, char **data, int *databytes);
BOOL STORMAPI SNetReceiveTurns(int a1, int arraysize, char **arraydata, DWORD *arraydatabytes, DWORD *arrayplayerstatus);
typedef void(STORMAPI *SEVTHANDLER)(struct _SNETEVENT *);
/* SNetSendMessage @ 127
*
* Sends a message to a player given their player ID. Network message
* is sent using class 01 and is retrieved by the other client using
* SNetReceiveMessage().
*
* playerID: The player index of the player to receive the data.
* Conversely, this field can be one of the following constants:
* SNPLAYER_ALL | Sends the message to all players, including oneself.
* SNPLAYER_OTHERS | Sends the message to all players, except for oneself.
* data: A pointer to the data.
* databytes: The amount of bytes that the data pointer contains.
*
* Returns TRUE if the function was called successfully and FALSE otherwise.
*/
BOOL
STORMAPI
SNetSendMessage(
int playerID,
void *data,
unsigned int databytes);
// Macro values to target specific players
#define SNPLAYER_ALL -1
#define SNPLAYER_OTHERS -2
#define MPQ_FLAG_READ_ONLY 1
#define SFILE_OPEN_FROM_MPQ 0
#define SFILE_OPEN_LOCAL_FILE 0xFFFFFFFF
/* SNetSendTurn @ 128
*
* Sends a turn (data packet) to all players in the game. Network data
* is sent using class 02 and is retrieved by the other client using
* SNetReceiveTurns().
*
* data: A pointer to the data.
* databytes: The amount of bytes that the data pointer contains.
*
* Returns TRUE if the function was called successfully and FALSE otherwise.
*/
BOOL
STORMAPI
SNetSendTurn(
char *data,
unsigned int databytes);
BOOL STORMAPI SFileCloseArchive(HANDLE hArchive);
BOOL STORMAPI SFileCloseFile(HANDLE hFile);
LONG STORMAPI SFileGetFileSize(HANDLE hFile, LPDWORD lpFileSizeHigh);
BOOL STORMAPI SFileOpenArchive(const char *szMpqName, DWORD dwPriority, DWORD dwFlags, HANDLE *phMpq);
BOOL STORMAPI SFileOpenFile(const char *filename, HANDLE *phFile);
BOOL STORMAPI SFileOpenFileEx(HANDLE hMpq, const char *szFileName, DWORD dwSearchScope, HANDLE *phFile);
BOOL STORMAPI SFileReadFile(HANDLE hFile, void *buffer, DWORD nNumberOfBytesToRead, DWORD *read, LONG *lpDistanceToMoveHigh);
/* SBmpLoadImage @ 323
*
* Load an image from an available archive into a buffer.
*
* pszFileName: The name of the graphic in an active archive.
* pPalette: An optional buffer that receives the image palette.
* pBuffer: A buffer that receives the image data.
* dwBuffersize: The size of the specified image buffer.
* pdwWidth: An optional variable that receives the image width.
* pdwHeight: An optional variable that receives the image height.
* pdwBpp: An optional variable that receives the image bits per pixel.
*
* Returns TRUE if the image was supported and loaded correctly, FALSE otherwise.
*/
BOOL
STORMAPI
SBmpLoadImage(
const char *pszFileName,
SDL_Color *pPalette,
BYTE *pBuffer,
DWORD dwBuffersize,
DWORD *pdwWidth,
DWORD *pdwHeight,
DWORD *pdwBpp);
bool getIniBool(const char *sectionName, const char *keyName, bool defaultValue = false);
bool getIniValue(const char *sectionName, const char *keyName, char *string, int stringSize, const char *defaultString = "");
void setIniValue(const char *sectionName, const char *keyName, const char *value, int len = 0);
void SaveIni();
int getIniInt(const char *keyname, const char *valuename, int defaultValue);
void setIniInt(const char *keyname, const char *valuename, int value);
void SVidPlayBegin(const char *filename, int a2, int a3, int a4, int a5, int flags, HANDLE *video);
void SVidPlayEnd(HANDLE video);
/* SErrGetLastError @ 463
*
* Retrieves the last error that was specifically
* set for the Storm library.
*
* Returns the last error set within the Storm library.
*/
DWORD
STORMAPI
SErrGetLastError();
/* SErrSetLastError @ 465
*
* Sets the last error for the Storm library and the Kernel32 library.
*
* dwErrCode: The error code that will be set.
*/
void
STORMAPI
SErrSetLastError(
DWORD dwErrCode);
// Values for dwErrCode
#define STORM_ERROR_GAME_TERMINATED 0x85100069
#define STORM_ERROR_INVALID_PLAYER 0x8510006a
#define STORM_ERROR_NO_MESSAGES_WAITING 0x8510006b
#define STORM_ERROR_NOT_IN_GAME 0x85100070
#define STORM_ERROR_REQUIRES_UPGRADE 0x85100077
/* SStrCopy @ 501
*
* Copies a string from src to dest (including NULL terminator)
* until the max_length is reached.
*
* dest: The destination array.
* src: The source array.
* max_length: The maximum length of dest.
*
*/
void
STORMAPI
SStrCopy(
char *dest,
const char *src,
int max_length);
BOOL SFileSetBasePath(const char *);
BOOL SVidPlayContinue(void);
BOOL SNetGetOwnerTurnsWaiting(DWORD *);
bool SNetUnregisterEventHandler(event_type, SEVTHANDLER);
bool SNetRegisterEventHandler(event_type, SEVTHANDLER);
BOOLEAN SNetSetBasePlayer(int);
int SNetInitializeProvider(Uint32 provider, struct GameData *gameData);
int SNetGetProviderCaps(struct _SNETCAPS *);
int SFileSetFilePointer(HANDLE, int, int*, int);
BOOL SFileEnableDirectAccess(BOOL enable);
#if defined(__GNUC__) || defined(__cplusplus)
}
// Additions to Storm API:
// Sets the file's 64-bit seek position.
inline std::uint64_t SFileSetFilePointer(HANDLE hFile, std::int64_t offset, int whence)
{
int high = static_cast<std::uint64_t>(offset) >> 32;
int low = static_cast<int>(offset);
low = SFileSetFilePointer(hFile, low, &high, whence);
return (static_cast<std::uint64_t>(high) << 32) | low;
}
// Returns the current 64-bit file seek position.
inline std::uint64_t SFileGetFilePointer(HANDLE hFile)
{
// We use `SFileSetFilePointer` with offset 0 to get the current position
// because there is no `SFileGetFilePointer`.
return SFileSetFilePointer(hFile, 0, DVL_FILE_CURRENT);
}
#endif
} // namespace dvl