Browse Source

Merge branch 'master' of github.com:diasurgical/devilution

pull/910/head
Anders Jenbo 5 years ago
parent
commit
43b5dea6e5
  1. 2
      Source/codec.h
  2. 1093
      Source/diablo.cpp
  3. 47
      Source/diablo.h
  4. 32
      Source/doom.cpp
  5. 17
      Source/doom.h
  6. 76
      Source/dthread.cpp
  7. 4
      Source/dthread.h
  8. 184
      Source/effects.cpp
  9. 12
      Source/effects.h
  10. 58
      Source/encrypt.cpp
  11. 4
      Source/encrypt.h
  12. 194
      Source/engine.cpp
  13. 18
      Source/engine.h
  14. 5
      Source/error.h
  15. 142
      Source/gamemenu.cpp
  16. 25
      Source/gamemenu.h
  17. 226
      Source/gmenu.cpp
  18. 20
      Source/gmenu.h
  19. 42
      Source/help.cpp
  20. 8
      Source/help.h
  21. 23
      Source/init.cpp
  22. 16
      Source/init.h
  23. 480
      Source/interfac.cpp
  24. 11
      Source/interfac.h
  25. 9
      Source/monster.cpp
  26. 2
      Source/objects.cpp
  27. 3
      SourceX/dx.cpp
  28. 6
      enums.h

2
Source/codec.h

@ -12,7 +12,7 @@ DEVILUTION_BEGIN_NAMESPACE
extern "C" {
#endif
int codec_decode(BYTE *pbSrcDst, DWORD size, const char *pszPassword);
int codec_decode(BYTE *pbSrcDst, DWORD size, const char *pszPassword);
DWORD codec_get_encoded_len(DWORD dwSrcBytes);
void codec_encode(BYTE *pbSrcDst, DWORD size, int size_64, const char *pszPassword);

1093
Source/diablo.cpp

File diff suppressed because it is too large Load Diff

47
Source/diablo.h

@ -15,20 +15,8 @@ extern "C" {
extern SDL_Window *ghMainWnd;
extern DWORD glSeedTbl[NUMLEVELS];
extern int gnLevelTypeTbl[NUMLEVELS];
#ifndef HELLFIRE
extern int glEndSeed[NUMLEVELS];
extern int glMid1Seed[NUMLEVELS];
extern int glMid2Seed[NUMLEVELS];
extern int glMid3Seed[NUMLEVELS];
#else
extern int glEndSeed[NUMLEVELS + 1];
extern int glMid1Seed[NUMLEVELS + 1];
extern int glMid2Seed[NUMLEVELS + 1];
extern int glMid3Seed[NUMLEVELS + 1];
#endif
extern int MouseX;
extern int MouseY;
extern BOOL gbGameLoopStartup;
extern BOOL gbRunGame;
extern BOOL gbRunGameResult;
extern BOOL zoomflag;
@ -43,13 +31,10 @@ extern BOOL visiondebug;
extern BOOL was_fonts_init;
extern void FontsCleanup();
/** unused */
extern BOOL scrollflag;
extern BOOL light4flag;
extern BOOL leveldebug;
extern BOOL monstdebug;
/** unused */
extern BOOL trigdebug;
extern int setseed;
extern int debugmonsttypes;
extern int PauseMode;
#ifdef HELLFIRE
@ -61,53 +46,28 @@ extern BOOLEAN UseBarbarianTest;
extern BOOLEAN UseMultiTest;
#endif
extern char sgbMouseDown;
extern int color_cycle_timer;
extern int ticks_per_sec;
extern WORD tick_delay;
void FreeGameMem();
BOOL StartGame(BOOL bNewGame, BOOL bSinglePlayer);
void run_game_loop(unsigned int uMsg);
void start_game(unsigned int uMsg);
void free_game();
int DiabloMain(int argc, char **argv);
void diablo_parse_flags(int argc, char **argv);
void diablo_init_screen();
void diablo_reload_process(HINSTANCE hInstance);
void diablo_quit(int exitStatus);
int DiabloMain(int argc, char **argv);
BOOL TryIconCurs();
BOOL PressEscKey();
void DisableInputWndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
void GM_Game(HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam);
BOOL LeftMouseDown(int wParam);
BOOL LeftMouseCmd(BOOL bShift);
BOOL TryIconCurs();
void LeftMouseUp();
void RightMouseDown();
void j_gmenu_on_mouse_move(LPARAM lParam);
BOOL PressSysKey(int wParam);
void diablo_hotkey_msg(DWORD dwMsg);
void ReleaseKey(int vkey);
void PressKey(int vkey);
void diablo_pause_game();
void PressChar(int vkey);
void LoadLvlGFX();
void LoadAllGFX();
void CreateLevel(int lvldir);
void LoadGameLevel(BOOL firstflag, int lvldir);
void game_loop(BOOL bStartup);
void game_logic();
void timeout_cursor(BOOL bTimeout);
void diablo_color_cyc_logic();
/* data */
/* rdata */
extern BOOL fullscreen;
extern int showintrodebug;
#ifdef _DEBUG
extern int questdebug;
extern int debug_mode_key_s;
extern int debug_mode_key_w;
extern int debug_mode_key_inverted_v;
extern int debug_mode_dollar_sign;
@ -116,15 +76,12 @@ extern int debug_mode_key_i;
extern int dbgplr;
extern int dbgqst;
extern int dbgmon;
extern int arrowdebug;
#endif
extern int frameflag;
extern int frameend;
extern int framerate;
extern int framestart;
extern BOOL FriendlyMode;
extern const char *const spszMsgTbl[4];
extern const char *const spszMsgHotKeyTbl[4];
#ifdef __cplusplus
}

32
Source/doom.cpp

@ -42,10 +42,22 @@ int doom_get_frame_from_time()
return DoomQuestState / 1200;
}
void doom_cleanup()
{
#ifdef HELLFIRE
if (pDoomCel != NULL) {
MemFreeDbg(pDoomCel);
pDoomCel = NULL;
}
#else
MemFreeDbg(pDoomCel);
#endif
}
#ifdef HELLFIRE
BOOLEAN doom_alloc_cel()
static BOOLEAN doom_alloc_cel()
#else
void doom_alloc_cel()
static void doom_alloc_cel()
#endif
{
#ifdef HELLFIRE
@ -57,22 +69,10 @@ void doom_alloc_cel()
#endif
}
void doom_cleanup()
{
#ifdef HELLFIRE
if (pDoomCel != NULL) {
MemFreeDbg(pDoomCel);
pDoomCel = NULL;
}
#else
MemFreeDbg(pDoomCel);
#endif
}
#ifdef HELLFIRE
BOOLEAN doom_load_graphics()
static BOOLEAN doom_load_graphics()
#else
void doom_load_graphics()
static void doom_load_graphics()
#endif
{
#ifdef HELLFIRE

17
Source/doom.h

@ -12,26 +12,9 @@ DEVILUTION_BEGIN_NAMESPACE
extern "C" {
#endif
extern int doom_quest_time;
extern int doom_stars_drawn;
extern BYTE *pDoomCel;
extern DIABOOL doomflag;
extern int DoomQuestState;
/*
void doom_reset_state();
void doom_play_movie();
*/
int doom_get_frame_from_time();
#ifdef HELLFIRE
BOOLEAN doom_alloc_cel();
void doom_cleanup();
BOOLEAN doom_load_graphics();
#else
void doom_alloc_cel();
void doom_cleanup();
void doom_load_graphics();
#endif
void doom_init();
void doom_close();
void doom_draw();

76
Source/dthread.cpp

@ -17,6 +17,44 @@ event_emul *sghWorkToDoEvent;
/* rdata */
static SDL_Thread *sghThread = NULL;
static unsigned int dthread_handler(void *data)
{
const char *error_buf;
TMegaPkt *pkt;
DWORD dwMilliseconds;
while (dthread_running) {
if (!sgpInfoHead && WaitForEvent(sghWorkToDoEvent) == -1) {
error_buf = TraceLastError();
app_fatal("dthread4:\n%s", error_buf);
}
sgMemCrit.Enter();
pkt = sgpInfoHead;
if (sgpInfoHead)
sgpInfoHead = sgpInfoHead->pNext;
else
ResetEvent(sghWorkToDoEvent);
sgMemCrit.Leave();
if (pkt) {
if (pkt->dwSpaceLeft != MAX_PLRS)
multi_send_zero_packet(pkt->dwSpaceLeft, pkt->data[0], &pkt->data[8], *(DWORD *)&pkt->data[4]);
dwMilliseconds = 1000 * *(DWORD *)&pkt->data[4] / gdwDeltaBytesSec;
if (dwMilliseconds >= 1)
dwMilliseconds = 1;
mem_free_dbg(pkt);
if (dwMilliseconds)
SDL_Delay(dwMilliseconds);
}
}
return 0;
}
void dthread_remove_player(int pnum)
{
TMegaPkt *pkt;
@ -78,44 +116,6 @@ void dthread_start()
}
}
unsigned int dthread_handler(void *data)
{
const char *error_buf;
TMegaPkt *pkt;
DWORD dwMilliseconds;
while (dthread_running) {
if (!sgpInfoHead && WaitForEvent(sghWorkToDoEvent) == -1) {
error_buf = TraceLastError();
app_fatal("dthread4:\n%s", error_buf);
}
sgMemCrit.Enter();
pkt = sgpInfoHead;
if (sgpInfoHead)
sgpInfoHead = sgpInfoHead->pNext;
else
ResetEvent(sghWorkToDoEvent);
sgMemCrit.Leave();
if (pkt) {
if (pkt->dwSpaceLeft != MAX_PLRS)
multi_send_zero_packet(pkt->dwSpaceLeft, pkt->data[0], &pkt->data[8], *(DWORD *)&pkt->data[4]);
dwMilliseconds = 1000 * *(DWORD *)&pkt->data[4] / gdwDeltaBytesSec;
if (dwMilliseconds >= 1)
dwMilliseconds = 1;
mem_free_dbg(pkt);
if (dwMilliseconds)
SDL_Delay(dwMilliseconds);
}
}
return 0;
}
void dthread_cleanup()
{
TMegaPkt *tmp;

4
Source/dthread.h

@ -12,13 +12,9 @@ DEVILUTION_BEGIN_NAMESPACE
extern "C" {
#endif
extern SDL_threadID glpDThreadId;
extern BOOLEAN dthread_running;
void dthread_remove_player(int pnum);
void dthread_send_delta(int pnum, char cmd, void *pbSrc, int dwLen);
void dthread_start();
unsigned int dthread_handler(void *data);
void dthread_cleanup();
/* data */

184
Source/effects.cpp

@ -1078,6 +1078,38 @@ void stream_stop()
}
}
static void stream_play(TSFX *pSFX, int lVolume, int lPan)
{
BOOL success;
assert(pSFX);
assert(pSFX->bFlags & sfx_STREAM);
stream_stop();
lVolume += sound_get_or_set_sound_volume(1);
if (lVolume >= VOLUME_MIN) {
if (lVolume > VOLUME_MAX)
lVolume = VOLUME_MAX;
success = SFileOpenFile(pSFX->pszName, &sghStream);
if (!success) {
sghStream = NULL;
} else {
if (!SFileDdaBeginEx(sghStream, 0x40000, 0, 0, lVolume, lPan, 0))
stream_stop();
else
sgpStreamSFX = pSFX;
}
}
}
static void stream_update()
{
DWORD current, end;
if (sghStream != NULL && SFileDdaGetPos(sghStream, &current, &end) && current >= end) {
stream_stop();
}
}
void InitMonsterSND(int monst)
{
TSnd *pSnd;
@ -1130,33 +1162,7 @@ void FreeMonsterSnd()
}
}
void PlayEffect(int i, int mode)
{
int sndIdx, mi, lVolume, lPan;
TSnd *snd;
if (plr[myplr].pLvlLoad) {
return;
}
sndIdx = random_(164, 2);
if (!gbSndInited || !gbSoundOn || gbBufferMsgs) {
return;
}
mi = monster[i]._mMTidx;
snd = Monsters[mi].Snds[mode][sndIdx];
if (!snd || snd_playing(snd)) {
return;
}
if (!calc_snd_position(monster[i]._mx, monster[i]._my, &lVolume, &lPan))
return;
snd_play_snd(snd, lVolume, lPan);
}
BOOL calc_snd_position(int x, int y, int *plVolume, int *plPan)
static BOOL calc_snd_position(int x, int y, int *plVolume, int *plPan)
{
int pan, volume;
@ -1181,13 +1187,7 @@ BOOL calc_snd_position(int x, int y, int *plVolume, int *plPan)
return TRUE;
}
void PlaySFX(int psfx)
{
psfx = RndSFX(psfx);
PlaySFX_priv(&sgSFX[psfx], FALSE, 0, 0);
}
void PlaySFX_priv(TSFX *pSFX, BOOL loc, int x, int y)
static void PlaySFX_priv(TSFX *pSFX, BOOL loc, int x, int y)
{
int lPan, lVolume;
@ -1220,30 +1220,33 @@ void PlaySFX_priv(TSFX *pSFX, BOOL loc, int x, int y)
snd_play_snd(pSFX->pSnd, lVolume, lPan);
}
void stream_play(TSFX *pSFX, int lVolume, int lPan)
void PlayEffect(int i, int mode)
{
BOOL success;
int sndIdx, mi, lVolume, lPan;
TSnd *snd;
assert(pSFX);
assert(pSFX->bFlags & sfx_STREAM);
stream_stop();
lVolume += sound_get_or_set_sound_volume(1);
if (lVolume >= VOLUME_MIN) {
if (lVolume > VOLUME_MAX)
lVolume = VOLUME_MAX;
success = SFileOpenFile(pSFX->pszName, &sghStream);
if (!success) {
sghStream = NULL;
} else {
if (!SFileDdaBeginEx(sghStream, 0x40000, 0, 0, lVolume, lPan, 0))
stream_stop();
else
sgpStreamSFX = pSFX;
}
if (plr[myplr].pLvlLoad) {
return;
}
sndIdx = random_(164, 2);
if (!gbSndInited || !gbSoundOn || gbBufferMsgs) {
return;
}
mi = monster[i]._mMTidx;
snd = Monsters[mi].Snds[mode][sndIdx];
if (!snd || snd_playing(snd)) {
return;
}
if (!calc_snd_position(monster[i]._mx, monster[i]._my, &lVolume, &lPan))
return;
snd_play_snd(snd, lVolume, lPan);
}
int RndSFX(int psfx)
static int RndSFX(int psfx)
{
int nRand;
@ -1280,6 +1283,12 @@ int RndSFX(int psfx)
return psfx + random_(165, nRand);
}
void PlaySFX(int psfx)
{
psfx = RndSFX(psfx);
PlaySFX_priv(&sgSFX[psfx], FALSE, 0, 0);
}
void PlaySfxLoc(int psfx, int x, int y)
{
TSnd *pSnd;
@ -1309,26 +1318,48 @@ void sound_update()
stream_update();
}
void stream_update()
void effects_cleanup_sfx()
{
DWORD current, end;
DWORD i;
if (sghStream != NULL && SFileDdaGetPos(sghStream, &current, &end) && current >= end) {
stream_stop();
sound_stop();
for (i = 0; i < sizeof(sgSFX) / sizeof(TSFX); i++) {
if (sgSFX[i].pSnd) {
sound_file_cleanup(sgSFX[i].pSnd);
sgSFX[i].pSnd = NULL;
}
}
}
void effects_cleanup_sfx()
static void priv_sound_init(BYTE bLoadMask)
{
DWORD i;
sound_stop();
if (!gbSndInited) {
return;
}
for (i = 0; i < sizeof(sgSFX) / sizeof(TSFX); i++) {
if (sgSFX[i].pSnd) {
sound_file_cleanup(sgSFX[i].pSnd);
sgSFX[i].pSnd = NULL;
continue;
}
if (sgSFX[i].bFlags & sfx_STREAM) {
continue;
}
if (!(sgSFX[i].bFlags & bLoadMask)) {
continue;
}
#ifndef HELLFIRE
if (sgSFX[i].bFlags & sfx_HELLFIRE) {
continue;
}
#endif
sgSFX[i].pSnd = sound_file_load(sgSFX[i].pszName);
}
}
@ -1363,37 +1394,6 @@ void sound_init()
priv_sound_init(mask);
}
void priv_sound_init(BYTE bLoadMask)
{
DWORD i;
if (!gbSndInited) {
return;
}
for (i = 0; i < sizeof(sgSFX) / sizeof(TSFX); i++) {
if (sgSFX[i].pSnd) {
continue;
}
if (sgSFX[i].bFlags & sfx_STREAM) {
continue;
}
if (!(sgSFX[i].bFlags & bLoadMask)) {
continue;
}
#ifndef HELLFIRE
if (sgSFX[i].bFlags & sfx_HELLFIRE) {
continue;
}
#endif
sgSFX[i].pSnd = sound_file_load(sgSFX[i].pszName);
}
}
void ui_sound_init()
{
priv_sound_init(sfx_UI);

12
Source/effects.h

@ -14,35 +14,23 @@ extern "C" {
extern int sfxdelay;
extern int sfxdnum;
extern HANDLE sghStream;
extern TSFX *sgpStreamSFX;
BOOL effect_is_playing(int nSFX);
void stream_stop();
void InitMonsterSND(int monst);
void FreeMonsterSnd();
void PlayEffect(int i, int mode);
BOOL calc_snd_position(int x, int y, int *plVolume, int *plPan);
void PlaySFX(int psfx);
void PlaySFX_priv(TSFX *pSFX, BOOL loc, int x, int y);
void stream_play(TSFX *pSFX, int lVolume, int lPan);
int RndSFX(int psfx);
void PlaySfxLoc(int psfx, int x, int y);
void sound_stop();
void sfx_stop();
void sound_update();
void stream_update();
void effects_cleanup_sfx();
void sound_init();
void priv_sound_init(BYTE bLoadMask);
void ui_sound_init();
void effects_play_sound(const char *snd_file);
/* rdata */
extern const char MonstSndChar[];
/* data */
#ifdef __cplusplus
}
#endif

58
Source/encrypt.cpp

@ -75,6 +75,35 @@ void InitHash()
}
}
static unsigned int PkwareBufferRead(char *buf, unsigned int *size, void *param)
{
TDataInfo *pInfo;
DWORD sSize;
pInfo = (TDataInfo *)param;
if (*size >= pInfo->size - pInfo->srcOffset) {
sSize = pInfo->size - pInfo->srcOffset;
} else {
sSize = *size;
}
memcpy(buf, pInfo->srcData + pInfo->srcOffset, sSize);
pInfo->srcOffset += sSize;
return sSize;
}
static void PkwareBufferWrite(char *buf, unsigned int *size, void *param)
{
TDataInfo *pInfo;
pInfo = (TDataInfo *)param;
memcpy(pInfo->destData + pInfo->destOffset, buf, *size);
pInfo->destOffset += *size;
}
int PkwareCompress(BYTE *srcData, int size)
{
BYTE *destData;
@ -111,35 +140,6 @@ int PkwareCompress(BYTE *srcData, int size)
return size;
}
unsigned int PkwareBufferRead(char *buf, unsigned int *size, void *param)
{
TDataInfo *pInfo;
DWORD sSize;
pInfo = (TDataInfo *)param;
if (*size >= pInfo->size - pInfo->srcOffset) {
sSize = pInfo->size - pInfo->srcOffset;
} else {
sSize = *size;
}
memcpy(buf, pInfo->srcData + pInfo->srcOffset, sSize);
pInfo->srcOffset += sSize;
return sSize;
}
void PkwareBufferWrite(char *buf, unsigned int *size, void *param)
{
TDataInfo *pInfo;
pInfo = (TDataInfo *)param;
memcpy(pInfo->destData + pInfo->destOffset, buf, *size);
pInfo->destOffset += *size;
}
void PkwareDecompress(BYTE *pbInBuff, int recv_size, int dwMaxBytes)
{
char *ptr;

4
Source/encrypt.h

@ -12,15 +12,11 @@ DEVILUTION_BEGIN_NAMESPACE
extern "C" {
#endif
extern DWORD hashtable[5][256];
void Decrypt(DWORD *castBlock, DWORD size, DWORD key);
void Encrypt(DWORD *castBlock, DWORD size, DWORD key);
DWORD Hash(const char *s, int type);
void InitHash();
int PkwareCompress(BYTE *srcData, int size);
unsigned int PkwareBufferRead(char *buf, unsigned int *size, void *param);
void PkwareBufferWrite(char *buf, unsigned int *size, void *param);
void PkwareDecompress(BYTE *pbInBuff, int recv_size, int dwMaxBytes);
#ifdef __cplusplus

194
Source/engine.cpp

@ -17,7 +17,9 @@ DEVILUTION_BEGIN_NAMESPACE
/** automap pixel color 8-bit (palette entry) */
char gbPixelCol;
BOOL gbRotateMap; // flip - if y < x
/** flip - if y < x */
BOOL gbRotateMap;
/** Seed value before the most recent call to SetRndSeed() */
int orgseed;
/** Width of sprite being blitted */
int sgnWidth;
@ -26,7 +28,8 @@ int sglGameSeed;
static CCritSect sgMemCrit;
/** Number of times the current seed has been fetched */
int SeedCount;
BOOL gbNotInView; // valid - if x/y are in bounds
/** valid - if x/y are in bounds */
BOOL gbNotInView;
/**
* Specifies the increment used in the Borland C/C++ pseudo-random.
@ -895,32 +898,6 @@ void Cl2ApplyTrans(BYTE *p, BYTE *ttbl, int nCel)
}
}
/**
* @brief Blit CL2 sprite, to the back buffer at the given coordianates
* @param sx Back buffer coordinate
* @param sy Back buffer coordinate
* @param pCelBuff CL2 buffer
* @param nCel CL2 frame number
* @param nWidth Width of sprite
*/
void Cl2Draw(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth)
{
BYTE *pRLEBytes;
int nDataSize;
assert(gpBuffer != NULL);
assert(pCelBuff != NULL);
assert(nCel > 0);
pRLEBytes = CelGetFrameClipped(pCelBuff, nCel, &nDataSize);
Cl2BlitSafe(
&gpBuffer[sx + BUFFER_WIDTH * sy],
pRLEBytes,
nDataSize,
nWidth);
}
/**
* @brief Blit CL2 sprite to the given buffer
* @param pDecodeTo The output buffer
@ -928,7 +905,7 @@ void Cl2Draw(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth)
* @param nDataSize Size of CL2 in bytes
* @param nWidth Width of sprite
*/
void Cl2BlitSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth)
static void Cl2BlitSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth)
{
int w;
char width;
@ -999,36 +976,6 @@ void Cl2BlitSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth)
}
}
/**
* @brief Blit a solid colder shape one pixel larger then the given sprite shape, to the back buffer at the given coordianates
* @param col Color index from current palette
* @param sx Back buffer coordinate
* @param sy Back buffer coordinate
* @param pCelBuff CL2 buffer
* @param nCel CL2 frame number
* @param nWidth Width of sprite
*/
void Cl2DrawOutline(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth)
{
int nDataSize;
BYTE *pRLEBytes;
assert(gpBuffer != NULL);
assert(pCelBuff != NULL);
assert(nCel > 0);
pRLEBytes = CelGetFrameClipped(pCelBuff, nCel, &nDataSize);
gpBufEnd -= BUFFER_WIDTH;
Cl2BlitOutlineSafe(
&gpBuffer[sx + BUFFER_WIDTH * sy],
pRLEBytes,
nDataSize,
nWidth,
col);
gpBufEnd += BUFFER_WIDTH;
}
/**
* @brief Blit a solid colder shape one pixel larger then the given sprite shape, to the given buffer
* @param pDecodeTo The output buffer
@ -1037,7 +984,7 @@ void Cl2DrawOutline(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWid
* @param nWidth Width of sprite
* @param col Color index from current palette
*/
void Cl2BlitOutlineSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, char col)
static void Cl2BlitOutlineSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, char col)
{
int w;
char width;
@ -1114,41 +1061,6 @@ void Cl2BlitOutlineSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWi
}
}
/**
* @brief Blit CL2 sprite, and apply a given lighting, to the back buffer at the given coordianates
* @param sx Back buffer coordinate
* @param sy Back buffer coordinate
* @param pCelBuff CL2 buffer
* @param nCel CL2 frame number
* @param nWidth Width of sprite
* @param light Light shade to use
*/
void Cl2DrawLightTbl(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, char light)
{
int nDataSize, idx;
BYTE *pRLEBytes, *pDecodeTo;
assert(gpBuffer != NULL);
assert(pCelBuff != NULL);
assert(nCel > 0);
pRLEBytes = CelGetFrameClipped(pCelBuff, nCel, &nDataSize);
pDecodeTo = &gpBuffer[sx + BUFFER_WIDTH * sy];
idx = light4flag ? 1024 : 4096;
if (light == 2)
idx += 256; // gray colors
if (light >= 4)
idx += (light - 1) << 8;
Cl2BlitLightSafe(
pDecodeTo,
pRLEBytes,
nDataSize,
nWidth,
&pLightTbl[idx]);
}
/**
* @brief Blit CL2 sprite, and apply lighting, to the given buffer
* @param pDecodeTo The output buffer
@ -1157,7 +1069,7 @@ void Cl2DrawLightTbl(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, char
* @param nWidth With of CL2 sprite
* @param pTable Light color table
*/
void Cl2BlitLightSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, BYTE *pTable)
static void Cl2BlitLightSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, BYTE *pTable)
{
int w;
char width;
@ -1229,6 +1141,96 @@ void Cl2BlitLightSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidt
}
}
/**
* @brief Blit CL2 sprite, to the back buffer at the given coordianates
* @param sx Back buffer coordinate
* @param sy Back buffer coordinate
* @param pCelBuff CL2 buffer
* @param nCel CL2 frame number
* @param nWidth Width of sprite
*/
void Cl2Draw(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth)
{
BYTE *pRLEBytes;
int nDataSize;
assert(gpBuffer != NULL);
assert(pCelBuff != NULL);
assert(nCel > 0);
pRLEBytes = CelGetFrameClipped(pCelBuff, nCel, &nDataSize);
Cl2BlitSafe(
&gpBuffer[sx + BUFFER_WIDTH * sy],
pRLEBytes,
nDataSize,
nWidth);
}
/**
* @brief Blit a solid colder shape one pixel larger then the given sprite shape, to the back buffer at the given coordianates
* @param col Color index from current palette
* @param sx Back buffer coordinate
* @param sy Back buffer coordinate
* @param pCelBuff CL2 buffer
* @param nCel CL2 frame number
* @param nWidth Width of sprite
*/
void Cl2DrawOutline(char col, int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth)
{
int nDataSize;
BYTE *pRLEBytes;
assert(gpBuffer != NULL);
assert(pCelBuff != NULL);
assert(nCel > 0);
pRLEBytes = CelGetFrameClipped(pCelBuff, nCel, &nDataSize);
gpBufEnd -= BUFFER_WIDTH;
Cl2BlitOutlineSafe(
&gpBuffer[sx + BUFFER_WIDTH * sy],
pRLEBytes,
nDataSize,
nWidth,
col);
gpBufEnd += BUFFER_WIDTH;
}
/**
* @brief Blit CL2 sprite, and apply a given lighting, to the back buffer at the given coordianates
* @param sx Back buffer coordinate
* @param sy Back buffer coordinate
* @param pCelBuff CL2 buffer
* @param nCel CL2 frame number
* @param nWidth Width of sprite
* @param light Light shade to use
*/
void Cl2DrawLightTbl(int sx, int sy, BYTE *pCelBuff, int nCel, int nWidth, char light)
{
int nDataSize, idx;
BYTE *pRLEBytes, *pDecodeTo;
assert(gpBuffer != NULL);
assert(pCelBuff != NULL);
assert(nCel > 0);
pRLEBytes = CelGetFrameClipped(pCelBuff, nCel, &nDataSize);
pDecodeTo = &gpBuffer[sx + BUFFER_WIDTH * sy];
idx = light4flag ? 1024 : 4096;
if (light == 2)
idx += 256; // gray colors
if (light >= 4)
idx += (light - 1) << 8;
Cl2BlitLightSafe(
pDecodeTo,
pRLEBytes,
nDataSize,
nWidth,
&pLightTbl[idx]);
}
/**
* @brief Blit CL2 sprite, and apply lighting, to the back buffer at the given coordinates
* @param sx Back buffer coordinate

18
Source/engine.h

@ -19,20 +19,6 @@ DEVILUTION_BEGIN_NAMESPACE
extern "C" {
#endif
//offset 0
//pCelBuff->pFrameTable[0]
/** automap pixel color 8-bit (palette entry) */
extern char gbPixelCol;
/** flip - if y < x */
extern BOOL gbRotateMap;
/** Seed value before the most recent call to SetRndSeed() */
extern int orgseed;
/** Track number of calls to GetRndSeed() since last call to SetRndSeed() */
extern int SeedCount;
/** valid - if x/y are in bounds */
extern BOOL gbNotInView;
inline BYTE *CelGetFrameStart(BYTE *pCelBuff, int nCel)
{
DWORD *pFrameTable;
@ -99,10 +85,6 @@ void Cl2BlitOutlineSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWi
void Cl2BlitLightSafe(BYTE *pDecodeTo, BYTE *pRLEBytes, int nDataSize, int nWidth, BYTE *pTable);
void PlayInGameMovie(const char *pszMovie);
/* rdata */
extern const int RndInc;
extern const int RndMult;
#ifdef __cplusplus
}

5
Source/error.h

@ -12,18 +12,13 @@ DEVILUTION_BEGIN_NAMESPACE
extern "C" {
#endif
extern char msgtable[MAX_SEND_STR_LEN];
extern DWORD msgdelay;
extern char msgflag;
extern char msgcnt;
void InitDiabloMsg(char e);
void ClrDiabloMsg();
void DrawDiabloMsg();
/* data */
extern const char *const MsgStrings[];
#ifdef __cplusplus
}
#endif

142
Source/gamemenu.cpp

@ -80,17 +80,7 @@ char *jogging_title = "Fast Walk";
/** Specifies the menu names for colour cycling disabled and enabled. */
const char *const color_cycling_toggle_names[] = { "Color Cycling Off", "Color Cycling On" };
void gamemenu_on()
{
if (gbMaxPlayers == 1) {
gmenu_set_items(sgSingleMenu, gamemenu_update_single);
} else {
gmenu_set_items(sgMultiMenu, gamemenu_update_multi);
}
PressEscKey();
}
void gamemenu_update_single(TMenuItem *pMenuItems)
static void gamemenu_update_single(TMenuItem *pMenuItems)
{
BOOL enable;
@ -103,11 +93,21 @@ void gamemenu_update_single(TMenuItem *pMenuItems)
gmenu_enable(&sgSingleMenu[0], enable);
}
void gamemenu_update_multi(TMenuItem *pMenuItems)
static void gamemenu_update_multi(TMenuItem *pMenuItems)
{
gmenu_enable(&sgMultiMenu[2], deathflag);
}
void gamemenu_on()
{
if (gbMaxPlayers == 1) {
gmenu_set_items(sgSingleMenu, gamemenu_update_single);
} else {
gmenu_set_items(sgMultiMenu, gamemenu_update_multi);
}
PressEscKey();
}
void gamemenu_off()
{
gmenu_set_items(NULL, NULL);
@ -209,27 +209,7 @@ void gamemenu_restart_town(BOOL bActivate)
NetSendCmd(TRUE, CMD_RETOWN);
}
void gamemenu_options(BOOL bActivate)
{
gamemenu_get_music();
gamemenu_get_sound();
#ifdef HELLFIRE
gamemenu_jogging();
#endif
gamemenu_get_gamma();
#ifndef HELLFIRE
gamemenu_get_speed();
//gamemenu_get_color_cycling();
#endif
gmenu_set_items(sgOptionsMenu, NULL);
}
void gamemenu_get_music()
{
gamemenu_sound_music_toggle(music_toggle_names, sgOptionsMenu, sound_get_or_set_music_volume(1));
}
void gamemenu_sound_music_toggle(const char *const *names, TMenuItem *menu_item, int volume)
static void gamemenu_sound_music_toggle(const char *const *names, TMenuItem *menu_item, int volume)
{
if (gbSndInited) {
menu_item->dwFlags |= GMENU_ENABLED | GMENU_SLIDER;
@ -243,13 +223,23 @@ void gamemenu_sound_music_toggle(const char *const *names, TMenuItem *menu_item,
menu_item->pszStr = names[1];
}
void gamemenu_get_sound()
static int gamemenu_slider_music_sound(TMenuItem *menu_item)
{
return gmenu_slider_get(menu_item, VOLUME_MIN, VOLUME_MAX);
}
static void gamemenu_get_music()
{
gamemenu_sound_music_toggle(music_toggle_names, sgOptionsMenu, sound_get_or_set_music_volume(1));
}
static void gamemenu_get_sound()
{
gamemenu_sound_music_toggle(sound_toggle_names, &sgOptionsMenu[1], sound_get_or_set_sound_volume(1));
}
#ifdef HELLFIRE
void gamemenu_jogging()
static void gamemenu_jogging()
{
gmenu_slider_steps(&sgOptionsMenu[3], 2);
gmenu_slider_set(&sgOptionsMenu[3], 0, 1, jogging_opt);
@ -257,15 +247,57 @@ void gamemenu_jogging()
}
#endif
void gamemenu_get_color_cycling()
static void gamemenu_get_gamma()
{
gmenu_slider_steps(&sgOptionsMenu[2], 15);
gmenu_slider_set(&sgOptionsMenu[2], 30, 100, UpdateGamma(0));
}
static void gamemenu_get_speed()
{
if (gbMaxPlayers != 1) {
sgOptionsMenu[3].dwFlags &= ~(GMENU_ENABLED | GMENU_SLIDER);
if (ticks_per_sec >= 50)
sgOptionsMenu[3].pszStr = "Speed: Fastest";
else if (ticks_per_sec >= 40)
sgOptionsMenu[3].pszStr = "Speed: Faster";
else if (ticks_per_sec >= 30)
sgOptionsMenu[3].pszStr = "Speed: Fast";
else if (ticks_per_sec == 20)
sgOptionsMenu[3].pszStr = "Speed: Normal";
return;
}
sgOptionsMenu[3].dwFlags |= GMENU_ENABLED | GMENU_SLIDER;
sgOptionsMenu[3].pszStr = "Speed";
gmenu_slider_steps(&sgOptionsMenu[3], 46);
gmenu_slider_set(&sgOptionsMenu[3], 20, 50, ticks_per_sec);
}
static void gamemenu_get_color_cycling()
{
sgOptionsMenu[3].pszStr = color_cycling_toggle_names[palette_get_color_cycling() & 1];
}
void gamemenu_get_gamma()
static int gamemenu_slider_gamma()
{
gmenu_slider_steps(&sgOptionsMenu[2], 15);
gmenu_slider_set(&sgOptionsMenu[2], 30, 100, UpdateGamma(0));
return gmenu_slider_get(&sgOptionsMenu[2], 30, 100);
}
void gamemenu_options(BOOL bActivate)
{
gamemenu_get_music();
gamemenu_get_sound();
#ifdef HELLFIRE
gamemenu_jogging();
#endif
gamemenu_get_gamma();
#ifndef HELLFIRE
gamemenu_get_speed();
//gamemenu_get_color_cycling();
#endif
gmenu_set_items(sgOptionsMenu, NULL);
}
void gamemenu_music_volume(BOOL bActivate)
@ -322,11 +354,6 @@ void gamemenu_music_volume(BOOL bActivate)
gamemenu_get_music();
}
int gamemenu_slider_music_sound(TMenuItem *menu_item)
{
return gmenu_slider_get(menu_item, VOLUME_MIN, VOLUME_MAX);
}
void gamemenu_sound_volume(BOOL bActivate)
{
int volume;
@ -384,33 +411,6 @@ void gamemenu_gamma(BOOL bActivate)
gamemenu_get_gamma();
}
int gamemenu_slider_gamma()
{
return gmenu_slider_get(&sgOptionsMenu[2], 30, 100);
}
void gamemenu_get_speed()
{
if (gbMaxPlayers != 1) {
sgOptionsMenu[3].dwFlags &= ~(GMENU_ENABLED | GMENU_SLIDER);
if (ticks_per_sec >= 50)
sgOptionsMenu[3].pszStr = "Speed: Fastest";
else if (ticks_per_sec >= 40)
sgOptionsMenu[3].pszStr = "Speed: Faster";
else if (ticks_per_sec >= 30)
sgOptionsMenu[3].pszStr = "Speed: Fast";
else if (ticks_per_sec == 20)
sgOptionsMenu[3].pszStr = "Speed: Normal";
return;
}
sgOptionsMenu[3].dwFlags |= GMENU_ENABLED | GMENU_SLIDER;
sgOptionsMenu[3].pszStr = "Speed";
gmenu_slider_steps(&sgOptionsMenu[3], 46);
gmenu_slider_set(&sgOptionsMenu[3], 20, 50, ticks_per_sec);
}
void gamemenu_speed(BOOL bActivate)
{
if (bActivate) {

25
Source/gamemenu.h

@ -18,8 +18,6 @@ extern BOOL jogging_opt;
#endif
void gamemenu_on();
void gamemenu_update_single(TMenuItem *pMenuItems);
void gamemenu_update_multi(TMenuItem *pMenuItems);
void gamemenu_off();
void gamemenu_handle_previous();
void gamemenu_previous(BOOL bActivate);
@ -29,36 +27,15 @@ void gamemenu_load_game(BOOL bActivate);
void gamemenu_save_game(BOOL bActivate);
void gamemenu_restart_town(BOOL bActivate);
void gamemenu_options(BOOL bActivate);
void gamemenu_get_music();
void gamemenu_sound_music_toggle(const char *const *names, TMenuItem *menu_item, int gamma);
void gamemenu_get_sound();
#ifdef HELLFIRE
void gamemenu_jogging();
#endif
#ifndef HELLFIRE
void gamemenu_get_color_cycling();
#endif
void gamemenu_get_gamma();
void gamemenu_music_volume(BOOL bActivate);
int gamemenu_slider_music_sound(TMenuItem *menu_item);
void gamemenu_sound_volume(BOOL bActivate);
#ifdef HELLFIRE
void gamemenu_loadjog(BOOL bActivate);
#endif
void gamemenu_gamma(BOOL bActivate);
int gamemenu_slider_gamma();
#ifndef HELLFIRE
void gamemenu_color_cycling(BOOL bActivate);
#endif
void gamemenu_get_speed();
void gamemenu_speed(BOOL bActivate);
/* rdata */
extern const char *const music_toggle_names[];
extern const char *const sound_toggle_names[];
#ifndef HELLFIRE
extern const char *const color_cycling_toggle_names[];
void gamemenu_color_cycling(BOOL bActivate);
#endif
#ifdef __cplusplus

226
Source/gmenu.cpp

@ -50,17 +50,7 @@ const BYTE lfontkern[] = {
11, 10, 12, 11, 21, 23
};
void gmenu_draw_pause()
{
if (currlevel != 0)
RedBack();
if (!sgpCurrentMenu) {
light_table_index = 0;
gmenu_print_text(316 + PANEL_LEFT, 336, "Pause");
}
}
void gmenu_print_text(int x, int y, const char *pszStr)
static void gmenu_print_text(int x, int y, const char *pszStr)
{
BYTE c;
@ -73,6 +63,16 @@ void gmenu_print_text(int x, int y, const char *pszStr)
}
}
void gmenu_draw_pause()
{
if (currlevel != 0)
RedBack();
if (!sgpCurrentMenu) {
light_table_index = 0;
gmenu_print_text(316 + PANEL_LEFT, 336, "Pause");
}
}
void FreeGMenu()
{
MemFreeDbg(sgpLogo);
@ -108,30 +108,7 @@ BOOL gmenu_is_active()
return sgpCurrentMenu != NULL;
}
void gmenu_set_items(TMenuItem *pItem, void (*gmFunc)(TMenuItem *))
{
int i;
PauseMode = 0;
mouseNavigation = FALSE;
sgpCurrentMenu = pItem;
dword_63447C = gmFunc;
if (gmFunc) {
dword_63447C(sgpCurrentMenu);
pItem = sgpCurrentMenu;
}
sgCurrentMenuIdx = 0;
if (sgpCurrentMenu) {
for (i = 0; sgpCurrentMenu[i].fnMenu; i++) {
sgCurrentMenuIdx++;
}
}
// BUGFIX: OOB access when sgCurrentMenuIdx is 0; should be set to NULL instead. (fixed)
sgpCurrItem = sgCurrentMenuIdx > 0 ? &sgpCurrentMenu[sgCurrentMenuIdx - 1] : NULL;
gmenu_up_down(TRUE);
}
void gmenu_up_down(BOOL isDown)
static void gmenu_up_down(BOOL isDown)
{
int i;
@ -161,40 +138,58 @@ void gmenu_up_down(BOOL isDown)
}
}
void gmenu_draw()
void gmenu_set_items(TMenuItem *pItem, void (*gmFunc)(TMenuItem *))
{
int y;
TMenuItem *i;
DWORD ticks;
int i;
PauseMode = 0;
mouseNavigation = FALSE;
sgpCurrentMenu = pItem;
dword_63447C = gmFunc;
if (gmFunc) {
dword_63447C(sgpCurrentMenu);
pItem = sgpCurrentMenu;
}
sgCurrentMenuIdx = 0;
if (sgpCurrentMenu) {
if (dword_63447C)
dword_63447C(sgpCurrentMenu);
#ifdef HELLFIRE
ticks = SDL_GetTicks();
if ((int)(ticks - LogoAnim_tick) > 25) {
LogoAnim_frame++;
if (LogoAnim_frame > 16)
LogoAnim_frame = 1;
LogoAnim_tick = ticks;
}
CelDraw((SCREEN_WIDTH - 430) / 2 + SCREEN_X, 102 + SCREEN_Y + UI_OFFSET_Y, sgpLogo, LogoAnim_frame, 430);
#else
CelDraw((SCREEN_WIDTH - 296) / 2 + SCREEN_X, 102 + SCREEN_Y + UI_OFFSET_Y, sgpLogo, 1, 296);
#endif
y = 160 + SCREEN_Y + UI_OFFSET_Y;
i = sgpCurrentMenu;
if (sgpCurrentMenu->fnMenu) {
while (i->fnMenu) {
gmenu_draw_menu_item(i, y);
i++;
y += 45;
}
for (i = 0; sgpCurrentMenu[i].fnMenu; i++) {
sgCurrentMenuIdx++;
}
}
// BUGFIX: OOB access when sgCurrentMenuIdx is 0; should be set to NULL instead. (fixed)
sgpCurrItem = sgCurrentMenuIdx > 0 ? &sgpCurrentMenu[sgCurrentMenuIdx - 1] : NULL;
gmenu_up_down(TRUE);
}
static void gmenu_clear_buffer(int x, int y, int width, int height)
{
BYTE *i;
i = gpBuffer + BUFFER_WIDTH * y + x;
while (height--) {
memset(i, 205, width);
i -= BUFFER_WIDTH;
}
}
static int gmenu_get_lfont(TMenuItem *pItem)
{
const char *text;
int i;
BYTE c;
if (pItem->dwFlags & GMENU_SLIDER)
return 490;
text = pItem->pszStr;
i = 0;
while (*text) {
c = gbFontTransTbl[(BYTE)*text++];
i += lfontkern[lfontframe[c]] + 2;
}
return i - 2;
}
void gmenu_draw_menu_item(TMenuItem *pItem, int y)
static void gmenu_draw_menu_item(TMenuItem *pItem, int y)
{
DWORD w, x, nSteps, step, pos, t;
#ifndef HELLFIRE
@ -229,32 +224,58 @@ void gmenu_draw_menu_item(TMenuItem *pItem, int y)
}
}
void gmenu_clear_buffer(int x, int y, int width, int height)
void gmenu_draw()
{
BYTE *i;
int y;
TMenuItem *i;
DWORD ticks;
i = gpBuffer + BUFFER_WIDTH * y + x;
while (height--) {
memset(i, 205, width);
i -= BUFFER_WIDTH;
}
if (sgpCurrentMenu) {
if (dword_63447C)
dword_63447C(sgpCurrentMenu);
#ifdef HELLFIRE
ticks = SDL_GetTicks();
if ((int)(ticks - LogoAnim_tick) > 25) {
LogoAnim_frame++;
if (LogoAnim_frame > 16)
LogoAnim_frame = 1;
LogoAnim_tick = ticks;
}
CelDraw((SCREEN_WIDTH - 430) / 2 + SCREEN_X, 102 + SCREEN_Y + UI_OFFSET_Y, sgpLogo, LogoAnim_frame, 430);
#else
CelDraw((SCREEN_WIDTH - 296) / 2 + SCREEN_X, 102 + SCREEN_Y + UI_OFFSET_Y, sgpLogo, 1, 296);
#endif
y = 160 + SCREEN_Y + UI_OFFSET_Y;
i = sgpCurrentMenu;
if (sgpCurrentMenu->fnMenu) {
while (i->fnMenu) {
gmenu_draw_menu_item(i, y);
i++;
y += 45;
}
}
}
}
int gmenu_get_lfont(TMenuItem *pItem)
static void gmenu_left_right(BOOL isRight)
{
const char *text;
int i;
BYTE c;
int step;
if (pItem->dwFlags & GMENU_SLIDER)
return 490;
text = pItem->pszStr;
i = 0;
while (*text) {
c = gbFontTransTbl[(BYTE)*text++];
i += lfontkern[lfontframe[c]] + 2;
if (sgpCurrItem->dwFlags & GMENU_SLIDER) {
step = sgpCurrItem->dwFlags & 0xFFF;
if (isRight) {
if (step == (int)(sgpCurrItem->dwFlags & 0xFFF000) >> 12)
return;
step++;
} else {
if (!step)
return;
step--;
}
sgpCurrItem->dwFlags &= 0xFFFFF000;
sgpCurrItem->dwFlags |= step;
sgpCurrItem->fnMenu(FALSE);
}
return i - 2;
}
BOOL gmenu_presskeys(int vkey)
@ -290,25 +311,19 @@ BOOL gmenu_presskeys(int vkey)
return TRUE;
}
void gmenu_left_right(BOOL isRight)
static BOOLEAN gmenu_get_mouse_slider(int *plOffset)
{
int step;
if (sgpCurrItem->dwFlags & GMENU_SLIDER) {
step = sgpCurrItem->dwFlags & 0xFFF;
if (isRight) {
if (step == (int)(sgpCurrItem->dwFlags & 0xFFF000) >> 12)
return;
step++;
} else {
if (!step)
return;
step--;
}
sgpCurrItem->dwFlags &= 0xFFFFF000;
sgpCurrItem->dwFlags |= step;
sgpCurrItem->fnMenu(FALSE);
*plOffset = 282;
if (MouseX < 282 + PANEL_LEFT) {
*plOffset = 0;
return FALSE;
}
if (MouseX > 538 + PANEL_LEFT) {
*plOffset = 256;
return FALSE;
}
*plOffset = MouseX - 282 - PANEL_LEFT;
return TRUE;
}
BOOL gmenu_on_mouse_move()
@ -328,21 +343,6 @@ BOOL gmenu_on_mouse_move()
return TRUE;
}
BOOLEAN gmenu_get_mouse_slider(int *plOffset)
{
*plOffset = 282;
if (MouseX < 282 + PANEL_LEFT) {
*plOffset = 0;
return FALSE;
}
if (MouseX > 538 + PANEL_LEFT) {
*plOffset = 256;
return FALSE;
}
*plOffset = MouseX - 282 - PANEL_LEFT;
return TRUE;
}
BOOL gmenu_left_mouse(BOOL isDown)
{
TMenuItem *pItem;

20
Source/gmenu.h

@ -12,43 +12,23 @@ DEVILUTION_BEGIN_NAMESPACE
extern "C" {
#endif
extern BYTE *optbar_cel;
extern BOOLEAN mouseNavigation;
extern BYTE *PentSpin_cel;
extern BYTE *BigTGold_cel;
extern int dword_634474;
extern char byte_634478;
extern void (*dword_63447C)(TMenuItem *);
extern TMenuItem *sgpCurrentMenu;
extern BYTE *option_cel;
extern int sgCurrentMenuIdx;
void gmenu_draw_pause();
void gmenu_print_text(int x, int y, const char *pszStr);
void FreeGMenu();
void gmenu_init_menu();
BOOL gmenu_is_active();
void gmenu_set_items(TMenuItem *pItem, void (*gmFunc)(TMenuItem *));
void gmenu_up_down(BOOL isDown);
void gmenu_draw();
void gmenu_draw_menu_item(TMenuItem *pItem, int y);
void gmenu_clear_buffer(int x, int y, int width, int height);
int gmenu_get_lfont(TMenuItem *pItem);
BOOL gmenu_presskeys(int vkey);
void gmenu_left_right(BOOL isRight);
BOOL gmenu_on_mouse_move();
BOOLEAN gmenu_get_mouse_slider(int *plOffset);
BOOL gmenu_left_mouse(BOOL isDown);
void gmenu_enable(TMenuItem *pMenuItem, BOOL enable);
void gmenu_slider_set(TMenuItem *pItem, int min, int max, int gamma);
int gmenu_slider_get(TMenuItem *pItem, int min, int max);
void gmenu_slider_steps(TMenuItem *pItem, int dwTicks);
/* rdata */
extern const BYTE lfontframe[];
extern const BYTE lfontkern[];
#ifdef __cplusplus
}
#endif

42
Source/help.cpp

@ -449,6 +449,27 @@ void InitHelp()
displayinghelp[0] = 0;
}
static void DrawHelpLine(int x, int y, char *text, char color)
{
int sx, sy, width;
BYTE c;
width = 0;
sx = x + 32 + PANEL_X;
sy = y * 12 + 44 + SCREEN_Y + UI_OFFSET_Y;
while (*text) {
c = gbFontTransTbl[(BYTE)*text];
text++;
c = fontframe[c];
width += fontkern[c] + 1;
if (c) {
if (width <= 577)
PrintChar(sx, sy, c, color);
}
sx += fontkern[c] + 1;
}
}
void DrawHelp()
{
int i, c, w;
@ -545,27 +566,6 @@ void DrawHelp()
PrintSString(0, 23, TRUE, "Press ESC to end or the arrow keys to scroll.", COL_GOLD, 0);
}
void DrawHelpLine(int x, int y, char *text, char color)
{
int sx, sy, width;
BYTE c;
width = 0;
sx = x + 32 + PANEL_X;
sy = y * 12 + 44 + SCREEN_Y + UI_OFFSET_Y;
while (*text) {
c = gbFontTransTbl[(BYTE)*text];
text++;
c = fontframe[c];
width += fontkern[c] + 1;
if (c) {
if (width <= 577)
PrintChar(sx, sy, c, color);
}
sx += fontkern[c] + 1;
}
}
void DisplayHelp()
{
help_select_line = 0;

8
Source/help.h

@ -12,22 +12,14 @@ DEVILUTION_BEGIN_NAMESPACE
extern "C" {
#endif
extern int help_select_line;
extern int dword_634494;
extern BOOL helpflag;
extern int displayinghelp[22];
extern int HelpTop;
void InitHelp();
void DrawHelp();
void DrawHelpLine(int x, int y, char *text, char color);
void DisplayHelp();
void HelpScrollUp();
void HelpScrollDown();
/* rdata */
extern const char gszHelpText[];
#ifdef __cplusplus
}
#endif

23
Source/init.cpp

@ -116,16 +116,10 @@ void init_cleanup()
NetClose();
}
void init_create_window()
static void init_get_file_info()
{
if (!SpawnWindow(PROJECT_NAME))
app_fatal("Unable to create main window");
dx_init(NULL);
was_window_init = true;
gbActive = true;
gpBufStart = &gpBuffer[BUFFER_WIDTH * SCREEN_Y];
gpBufEnd = (BYTE *)(BUFFER_WIDTH * (SCREEN_HEIGHT + SCREEN_Y));
SDL_DisableScreenSaver();
snprintf(gszProductName, sizeof(gszProductName) / sizeof(char), "%s v%s", PROJECT_NAME, PROJECT_VERSION);
snprintf(gszVersionNumber, sizeof(gszVersionNumber) / sizeof(char), "version %s", PROJECT_VERSION);
}
void init_archives()
@ -165,10 +159,15 @@ void init_archives()
#endif
}
void init_get_file_info()
void init_create_window()
{
snprintf(gszProductName, sizeof(gszProductName) / sizeof(char), "%s v%s", PROJECT_NAME, PROJECT_VERSION);
snprintf(gszVersionNumber, sizeof(gszVersionNumber) / sizeof(char), "version %s", PROJECT_VERSION);
if (!SpawnWindow(PROJECT_NAME))
app_fatal("Unable to create main window");
dx_init(NULL);
gbActive = true;
gpBufStart = &gpBuffer[BUFFER_WIDTH * SCREEN_Y];
gpBufEnd = (BYTE *)(BUFFER_WIDTH * (SCREEN_HEIGHT + SCREEN_Y));
SDL_DisableScreenSaver();
}
void MainWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam)

16
Source/init.h

@ -17,32 +17,20 @@ extern int gbActive;
extern HANDLE hellfire_mpq;
extern WNDPROC CurrentProc;
extern HANDLE diabdat_mpq;
extern HANDLE patch_rt_mpq;
extern bool gbIsSpawn;
extern BOOLEAN screensaver_enabled_prev;
extern HANDLE patch_rt_mpq;
#ifdef HELLFIRE
extern HANDLE hfmonk_mpq;
extern HANDLE hfbard_mpq;
extern HANDLE hfbarb_mpq;
extern HANDLE hfmusic_mpq;
extern HANDLE hfvoice_mpq;
extern HANDLE hfopt1_mpq;
extern HANDLE hfopt2_mpq;
#endif
void init_cleanup();
void init_disable_screensaver(BOOLEAN disable);
void init_create_window();
void init_archives();
void init_get_file_info();
void init_create_window();
void MainWndProc(HWND hWnd, UINT Msg, WPARAM wParam, LPARAM lParam);
void init_activate_window(HWND hWnd, BOOL bActive);
WNDPROC SetWindowProc(WNDPROC NewProc);
extern BOOL was_window_init; /** defined in dx.cpp */
/* rdata */
/* data */
extern char gszVersionNumber[260];

480
Source/interfac.cpp

@ -16,250 +16,12 @@ const BYTE BarColor[3] = { 138, 43, 254 };
/** The screen position of the top left corner of the progress bar. */
const int BarPos[3][2] = { { 53, 37 }, { 53, 421 }, { 53, 37 } };
void interface_msg_pump()
{
MSG Msg;
while (PeekMessage(&Msg)) {
if (Msg.message != DVL_WM_QUIT) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
}
BOOL IncProgress()
{
interface_msg_pump();
sgdwProgress += 23;
if ((DWORD)sgdwProgress > 534)
sgdwProgress = 534;
if (sgpBackCel)
DrawCutscene();
return (DWORD)sgdwProgress >= 534;
}
void DrawCutscene()
{
DWORD i;
lock_buf(1);
CelDraw(PANEL_X, 480 + SCREEN_Y - 1 + UI_OFFSET_Y, sgpBackCel, 1, 640);
for (i = 0; i < sgdwProgress; i++) {
DrawProgress(
BarPos[progress_id][0] + i + PANEL_X,
BarPos[progress_id][1] + SCREEN_Y + UI_OFFSET_Y,
progress_id);
}
unlock_buf(1);
force_redraw = 255;
scrollrt_draw_game_screen(FALSE);
}
void DrawProgress(int screen_x, int screen_y, int progress_id)
{
BYTE *dst;
int i;
dst = &gpBuffer[screen_x + BUFFER_WIDTH * screen_y];
for (i = 0; i < 22; i++) {
*dst = BarColor[progress_id];
dst += BUFFER_WIDTH;
}
}
void ShowProgress(unsigned int uMsg)
{
WNDPROC saveProc;
gbSomebodyWonGameKludge = FALSE;
plrmsg_delay(TRUE);
assert(ghMainWnd);
saveProc = SetWindowProc(DisableInputWndProc);
interface_msg_pump();
ClearScreenBuffer();
scrollrt_draw_game_screen(TRUE);
InitCutscene(uMsg);
BlackPalette();
DrawCutscene();
PaletteFadeIn(8);
IncProgress();
sound_init();
IncProgress();
switch (uMsg) {
case WM_DIABLOADGAME:
IncProgress();
IncProgress();
LoadGame(TRUE);
IncProgress();
IncProgress();
break;
case WM_DIABNEWGAME:
IncProgress();
FreeGameMem();
IncProgress();
pfile_remove_temp_files();
IncProgress();
LoadGameLevel(TRUE, ENTRY_MAIN);
IncProgress();
break;
case WM_DIABNEXTLVL:
IncProgress();
if (gbMaxPlayers == 1) {
SaveLevel();
} else {
DeltaSaveLevel();
}
IncProgress();
FreeGameMem();
currlevel++;
leveltype = gnLevelTypeTbl[currlevel];
assert(plr[myplr].plrlevel == currlevel);
IncProgress();
LoadGameLevel(FALSE, ENTRY_MAIN);
IncProgress();
break;
case WM_DIABPREVLVL:
IncProgress();
if (gbMaxPlayers == 1) {
SaveLevel();
} else {
DeltaSaveLevel();
}
IncProgress();
FreeGameMem();
currlevel--;
leveltype = gnLevelTypeTbl[currlevel];
assert(plr[myplr].plrlevel == currlevel);
IncProgress();
LoadGameLevel(FALSE, ENTRY_PREV);
IncProgress();
break;
case WM_DIABSETLVL:
SetReturnLvlPos();
IncProgress();
if (gbMaxPlayers == 1) {
SaveLevel();
} else {
DeltaSaveLevel();
}
IncProgress();
setlevel = TRUE;
leveltype = setlvltype;
FreeGameMem();
IncProgress();
LoadGameLevel(FALSE, ENTRY_SETLVL);
IncProgress();
break;
case WM_DIABRTNLVL:
IncProgress();
if (gbMaxPlayers == 1) {
SaveLevel();
} else {
DeltaSaveLevel();
}
IncProgress();
setlevel = FALSE;
FreeGameMem();
IncProgress();
GetReturnLvlPos();
LoadGameLevel(FALSE, ENTRY_RTNLVL);
IncProgress();
break;
case WM_DIABWARPLVL:
IncProgress();
if (gbMaxPlayers == 1) {
SaveLevel();
} else {
DeltaSaveLevel();
}
IncProgress();
FreeGameMem();
GetPortalLevel();
IncProgress();
LoadGameLevel(FALSE, ENTRY_WARPLVL);
IncProgress();
break;
case WM_DIABTOWNWARP:
IncProgress();
if (gbMaxPlayers == 1) {
SaveLevel();
} else {
DeltaSaveLevel();
}
IncProgress();
FreeGameMem();
currlevel = plr[myplr].plrlevel;
leveltype = gnLevelTypeTbl[currlevel];
assert(plr[myplr].plrlevel == currlevel);
IncProgress();
LoadGameLevel(FALSE, ENTRY_TWARPDN);
IncProgress();
break;
case WM_DIABTWARPUP:
IncProgress();
if (gbMaxPlayers == 1) {
SaveLevel();
} else {
DeltaSaveLevel();
}
IncProgress();
FreeGameMem();
currlevel = plr[myplr].plrlevel;
leveltype = gnLevelTypeTbl[currlevel];
assert(plr[myplr].plrlevel == currlevel);
IncProgress();
LoadGameLevel(FALSE, ENTRY_TWARPUP);
IncProgress();
break;
case WM_DIABRETOWN:
IncProgress();
if (gbMaxPlayers == 1) {
SaveLevel();
} else {
DeltaSaveLevel();
}
IncProgress();
FreeGameMem();
currlevel = plr[myplr].plrlevel;
leveltype = gnLevelTypeTbl[currlevel];
assert(plr[myplr].plrlevel == currlevel);
IncProgress();
LoadGameLevel(FALSE, ENTRY_MAIN);
IncProgress();
break;
}
assert(ghMainWnd);
PaletteFadeOut(8);
FreeInterface();
saveProc = SetWindowProc(saveProc);
assert(saveProc == DisableInputWndProc);
NetSendCmdLocParam1(TRUE, CMD_PLAYER_JOINLEVEL, plr[myplr]._px, plr[myplr]._py, plr[myplr].plrlevel);
plrmsg_delay(FALSE);
ResetPal();
if (gbSomebodyWonGameKludge && plr[myplr].plrlevel == 16) {
PrepDoEnding();
}
gbSomebodyWonGameKludge = FALSE;
}
void FreeInterface()
static void FreeInterface()
{
MemFreeDbg(sgpBackCel);
}
void InitCutscene(unsigned int uMsg)
static void InitCutscene(unsigned int uMsg)
{
assert(!sgpBackCel);
@ -490,4 +252,242 @@ void InitCutscene(unsigned int uMsg)
sgdwProgress = 0;
}
static void DrawProgress(int screen_x, int screen_y, int progress_id)
{
BYTE *dst;
int i;
dst = &gpBuffer[screen_x + BUFFER_WIDTH * screen_y];
for (i = 0; i < 22; i++) {
*dst = BarColor[progress_id];
dst += BUFFER_WIDTH;
}
}
static void DrawCutscene()
{
DWORD i;
lock_buf(1);
CelDraw(PANEL_X, 480 + SCREEN_Y - 1 + UI_OFFSET_Y, sgpBackCel, 1, 640);
for (i = 0; i < sgdwProgress; i++) {
DrawProgress(
BarPos[progress_id][0] + i + PANEL_X,
BarPos[progress_id][1] + SCREEN_Y + UI_OFFSET_Y,
progress_id);
}
unlock_buf(1);
force_redraw = 255;
scrollrt_draw_game_screen(FALSE);
}
void interface_msg_pump()
{
MSG Msg;
while (PeekMessage(&Msg)) {
if (Msg.message != DVL_WM_QUIT) {
TranslateMessage(&Msg);
DispatchMessage(&Msg);
}
}
}
BOOL IncProgress()
{
interface_msg_pump();
sgdwProgress += 23;
if ((DWORD)sgdwProgress > 534)
sgdwProgress = 534;
if (sgpBackCel)
DrawCutscene();
return (DWORD)sgdwProgress >= 534;
}
void ShowProgress(unsigned int uMsg)
{
WNDPROC saveProc;
gbSomebodyWonGameKludge = FALSE;
plrmsg_delay(TRUE);
assert(ghMainWnd);
saveProc = SetWindowProc(DisableInputWndProc);
interface_msg_pump();
ClearScreenBuffer();
scrollrt_draw_game_screen(TRUE);
InitCutscene(uMsg);
BlackPalette();
DrawCutscene();
PaletteFadeIn(8);
IncProgress();
sound_init();
IncProgress();
switch (uMsg) {
case WM_DIABLOADGAME:
IncProgress();
IncProgress();
LoadGame(TRUE);
IncProgress();
IncProgress();
break;
case WM_DIABNEWGAME:
IncProgress();
FreeGameMem();
IncProgress();
pfile_remove_temp_files();
IncProgress();
LoadGameLevel(TRUE, ENTRY_MAIN);
IncProgress();
break;
case WM_DIABNEXTLVL:
IncProgress();
if (gbMaxPlayers == 1) {
SaveLevel();
} else {
DeltaSaveLevel();
}
IncProgress();
FreeGameMem();
currlevel++;
leveltype = gnLevelTypeTbl[currlevel];
assert(plr[myplr].plrlevel == currlevel);
IncProgress();
LoadGameLevel(FALSE, ENTRY_MAIN);
IncProgress();
break;
case WM_DIABPREVLVL:
IncProgress();
if (gbMaxPlayers == 1) {
SaveLevel();
} else {
DeltaSaveLevel();
}
IncProgress();
FreeGameMem();
currlevel--;
leveltype = gnLevelTypeTbl[currlevel];
assert(plr[myplr].plrlevel == currlevel);
IncProgress();
LoadGameLevel(FALSE, ENTRY_PREV);
IncProgress();
break;
case WM_DIABSETLVL:
SetReturnLvlPos();
IncProgress();
if (gbMaxPlayers == 1) {
SaveLevel();
} else {
DeltaSaveLevel();
}
IncProgress();
setlevel = TRUE;
leveltype = setlvltype;
FreeGameMem();
IncProgress();
LoadGameLevel(FALSE, ENTRY_SETLVL);
IncProgress();
break;
case WM_DIABRTNLVL:
IncProgress();
if (gbMaxPlayers == 1) {
SaveLevel();
} else {
DeltaSaveLevel();
}
IncProgress();
setlevel = FALSE;
FreeGameMem();
IncProgress();
GetReturnLvlPos();
LoadGameLevel(FALSE, ENTRY_RTNLVL);
IncProgress();
break;
case WM_DIABWARPLVL:
IncProgress();
if (gbMaxPlayers == 1) {
SaveLevel();
} else {
DeltaSaveLevel();
}
IncProgress();
FreeGameMem();
GetPortalLevel();
IncProgress();
LoadGameLevel(FALSE, ENTRY_WARPLVL);
IncProgress();
break;
case WM_DIABTOWNWARP:
IncProgress();
if (gbMaxPlayers == 1) {
SaveLevel();
} else {
DeltaSaveLevel();
}
IncProgress();
FreeGameMem();
currlevel = plr[myplr].plrlevel;
leveltype = gnLevelTypeTbl[currlevel];
assert(plr[myplr].plrlevel == currlevel);
IncProgress();
LoadGameLevel(FALSE, ENTRY_TWARPDN);
IncProgress();
break;
case WM_DIABTWARPUP:
IncProgress();
if (gbMaxPlayers == 1) {
SaveLevel();
} else {
DeltaSaveLevel();
}
IncProgress();
FreeGameMem();
currlevel = plr[myplr].plrlevel;
leveltype = gnLevelTypeTbl[currlevel];
assert(plr[myplr].plrlevel == currlevel);
IncProgress();
LoadGameLevel(FALSE, ENTRY_TWARPUP);
IncProgress();
break;
case WM_DIABRETOWN:
IncProgress();
if (gbMaxPlayers == 1) {
SaveLevel();
} else {
DeltaSaveLevel();
}
IncProgress();
FreeGameMem();
currlevel = plr[myplr].plrlevel;
leveltype = gnLevelTypeTbl[currlevel];
assert(plr[myplr].plrlevel == currlevel);
IncProgress();
LoadGameLevel(FALSE, ENTRY_MAIN);
IncProgress();
break;
}
assert(ghMainWnd);
PaletteFadeOut(8);
FreeInterface();
saveProc = SetWindowProc(saveProc);
assert(saveProc == DisableInputWndProc);
NetSendCmdLocParam1(TRUE, CMD_PLAYER_JOINLEVEL, plr[myplr]._px, plr[myplr]._py, plr[myplr].plrlevel);
plrmsg_delay(FALSE);
ResetPal();
if (gbSomebodyWonGameKludge && plr[myplr].plrlevel == 16) {
PrepDoEnding();
}
gbSomebodyWonGameKludge = FALSE;
}
DEVILUTION_END_NAMESPACE

11
Source/interfac.h

@ -12,20 +12,9 @@ DEVILUTION_BEGIN_NAMESPACE
extern "C" {
#endif
extern int progress_id;
void interface_msg_pump();
BOOL IncProgress();
void DrawCutscene();
void DrawProgress(int screen_x, int screen_y, int progress_id);
void ShowProgress(unsigned int uMsg);
void FreeInterface();
void InitCutscene(unsigned int uMsg);
/* rdata */
extern const BYTE BarColor[3];
extern const int BarPos[3][2];
#ifdef __cplusplus
}

9
Source/monster.cpp

@ -1804,7 +1804,8 @@ void SpawnLoot(int i, BOOL sendmsg)
if (QuestStatus(Q_GARBUD) && Monst->mName == UniqMonst[UMT_GARBUD].mName) {
CreateTypeItem(Monst->_mx + 1, Monst->_my + 1, TRUE, ITYPE_MACE, IMISC_NONE, TRUE, FALSE);
} else if (Monst->mName == UniqMonst[UMT_DEFILER].mName) {
stream_stop();
if (effect_is_playing(USFX_DEFILER8))
stream_stop();
quests[Q_DEFILER]._qlog = 0;
SpawnMapOfDoom(Monst->_mx, Monst->_my);
} else if (Monst->mName == UniqMonst[UMT_HORKDMN].mName) {
@ -1815,7 +1816,11 @@ void SpawnLoot(int i, BOOL sendmsg)
}
} else if (Monst->MType->mtype == MT_HORKSPWN) {
} else if (Monst->MType->mtype == MT_NAKRUL) {
stream_stop();
nSFX = IsUberRoomOpened ? USFX_NAKRUL4 : USFX_NAKRUL5;
if (UseCowFarmer)
nSFX = USFX_NAKRUL6;
if (effect_is_playing(nSFX))
stream_stop();
quests[Q_NAKRUL]._qlog = 0;
UberDiabloMonsterIndex = -2;
CreateMagicWeapon(Monst->_mx, Monst->_my, ITYPE_SWORD, ICURS_GREAT_SWORD, FALSE, TRUE);

2
Source/objects.cpp

@ -1944,7 +1944,7 @@ void Obj_Circle(int i)
quests[Q_BETRAYER]._qvar1 = 4;
AddMissile(plr[myplr]._px, plr[myplr]._py, 35, 46, plr[myplr]._pdir, MIS_RNDTELEPORT, 0, myplr, 0, 0);
track_repeat_walk(FALSE);
sgbMouseDown = 0;
sgbMouseDown = CLICK_NONE;
ClrPlrPath(myplr);
StartStand(myplr, 0);
}

3
SourceX/dx.cpp

@ -32,9 +32,6 @@ SDL_Surface *renderer_texture_surface = NULL;
/** 8-bit surface wrapper around #gpBuffer */
SDL_Surface *pal_surface;
/** To know if surfaces have been initialized or not */
BOOL was_window_init = false;
static void dx_create_back_buffer()
{
pal_surface = SDL_CreateRGBSurfaceWithFormat(0, BUFFER_WIDTH, BUFFER_HEIGHT, 8, SDL_PIXELFORMAT_INDEX8);

6
enums.h

@ -2231,6 +2231,12 @@ typedef enum dflag {
BFLAG_EXPLORED = 0x80,
} dflag;
typedef enum clicktype {
CLICK_NONE = 0,
CLICK_LEFT = 1,
CLICK_RIGHT = 2,
} clicktype;
/*
First 5 bits store level
6th bit stores onlygood flag

Loading…
Cancel
Save