This commit is contained in:
2024-04-13 13:19:21 +10:00
parent abf4d6a4a7
commit 54d6226e4a

View File

@@ -59,12 +59,12 @@ struct SChar
bool blinking; bool blinking;
}; };
inline int clampi ( int a_iVal, int a_iMin, int a_iMax ) inline int clampi(int a_iVal, int a_iMin, int a_iMax)
{ {
return ( a_iVal < a_iMin ) ? a_iMin : ( a_iVal > a_iMax ) ? a_iMax : a_iVal; return (a_iVal < a_iMin) ? a_iMin : (a_iVal > a_iMax) ? a_iMax : a_iVal;
} }
static Uint32 TimerCallback ( Uint32 a_uiInterval, void* a_pParam ) static Uint32 TimerCallback(Uint32 a_uiInterval, void* a_pParam)
{ {
SDL_Event event; SDL_Event event;
SDL_UserEvent userEvent; SDL_UserEvent userEvent;
@@ -77,73 +77,73 @@ static Uint32 TimerCallback ( Uint32 a_uiInterval, void* a_pParam )
event.type = SDL_USEREVENT; event.type = SDL_USEREVENT;
event.user = userEvent; event.user = userEvent;
SDL_PushEvent ( &event ); SDL_PushEvent(&event);
return a_uiInterval; return a_uiInterval;
} }
int main ( int argc, char** argv ) int main(int argc, char** argv)
{ {
if ( SDL_Init ( SDL_INIT_VIDEO ) < 0 ) if (SDL_Init(SDL_INIT_VIDEO) < 0)
{ {
return -1; return -1;
} }
if ( !( IMG_Init ( IMG_INIT_PNG ) & IMG_INIT_PNG ) ) if (!(IMG_Init(IMG_INIT_PNG) & IMG_INIT_PNG))
{ {
SDL_Quit (); SDL_Quit();
return -1; return -1;
} }
SDL_Window* pWindow = nullptr; SDL_Window* pWindow = nullptr;
SDL_Renderer* pRenderer = nullptr; SDL_Renderer* pRenderer = nullptr;
if ( SDL_CreateWindowAndRenderer ( 640, 400, 0, &pWindow, &pRenderer ) < 0 ) if (SDL_CreateWindowAndRenderer(640, 400, 0, &pWindow, &pRenderer) < 0)
{ {
IMG_Quit (); IMG_Quit();
SDL_Quit (); SDL_Quit();
return -1; return -1;
} }
SDL_SetWindowTitle ( pWindow, "EnDOOMed" ); SDL_SetWindowTitle(pWindow, "EnDOOMed");
SDL_Texture* pCodepage = IMG_LoadTexture ( pRenderer, "codepage.png" ); SDL_Texture* pCodepage = IMG_LoadTexture(pRenderer, "codepage.png");
if ( pCodepage == nullptr ) if (pCodepage == nullptr)
{ {
SDL_DestroyRenderer ( pRenderer ); SDL_DestroyRenderer(pRenderer);
SDL_DestroyWindow ( pWindow ); SDL_DestroyWindow(pWindow);
IMG_Quit (); IMG_Quit();
SDL_Quit (); SDL_Quit();
return -1; return -1;
} }
SChar aDisplay[2000]; SChar aDisplay[2000];
memset ( aDisplay, 0, sizeof(aDisplay) ); memset(aDisplay, 0, sizeof(aDisplay));
FILE* pFile = fopen ( "ENDOOM.bin", "rb" ); FILE* pFile = fopen("ENDOOM.bin", "rb");
if ( pFile == nullptr ) if (pFile == nullptr)
{ {
SDL_DestroyTexture ( pCodepage ); SDL_DestroyTexture(pCodepage);
SDL_DestroyRenderer ( pRenderer ); SDL_DestroyRenderer(pRenderer);
SDL_DestroyWindow ( pWindow ); SDL_DestroyWindow(pWindow);
IMG_Quit (); IMG_Quit();
SDL_Quit (); SDL_Quit();
return -1; return -1;
} }
for ( int i = 0; i < 2000; ++i ) for (int i = 0; i < 2000; ++i)
{ {
SChar& currentCharacter = aDisplay[i]; SChar& currentCharacter = aDisplay[i];
unsigned char ucSpecial; unsigned char ucSpecial;
fread ( &currentCharacter.character, sizeof(unsigned char), 1, pFile ); fread(&currentCharacter.character, sizeof(unsigned char), 1, pFile);
fread ( &ucSpecial, sizeof(unsigned char), 1, pFile ); fread(&ucSpecial, sizeof(unsigned char), 1, pFile);
currentCharacter.bgColour = EColour(( ucSpecial & 112 ) >> 4); currentCharacter.bgColour = EColour((ucSpecial & 112) >> 4);
currentCharacter.fgColour = EColour(ucSpecial & 15); currentCharacter.fgColour = EColour(ucSpecial & 15);
currentCharacter.blinking = ( ucSpecial & 128 > 0 ) ? true : false; currentCharacter.blinking = (ucSpecial & 128 > 0) ? true : false;
} }
SDL_AddTimer ( 400, TimerCallback, nullptr ); SDL_AddTimer(400, TimerCallback, nullptr);
SChar leftBrush; SChar leftBrush;
leftBrush.character = 219; leftBrush.character = 219;
@@ -166,115 +166,95 @@ int main ( int argc, char** argv )
bool bBlinkState = true; bool bBlinkState = true;
bool bRunning = true; bool bRunning = true;
SDL_Event event; SDL_Event event;
while ( bRunning ) while (bRunning)
{ {
iMousePrevX = iMouseX; iMousePrevX = iMouseX;
iMousePrevY = iMouseY; iMousePrevY = iMouseY;
SDL_PumpEvents (); SDL_PumpEvents();
if ( SDL_WaitEvent ( &event ) ) if (SDL_WaitEvent(&event))
{ {
do do
{ {
switch ( event.type ) switch (event.type)
{ {
case ( SDL_QUIT ): case SDL_QUIT:
bRunning = false;
break;
case SDL_USEREVENT:
bBlinkState = !bBlinkState;
bValidRender = false;
break;
case SDL_MOUSEBUTTONDOWN:
if (event.button.button == SDL_BUTTON_LEFT)
{ {
bRunning = false; bMouseLeft = true;
break;
} }
case ( SDL_USEREVENT ): else if (event.button.button == SDL_BUTTON_RIGHT)
{ {
bBlinkState = !bBlinkState; bMouseRight = true;
bValidRender = false;
break;
} }
case ( SDL_MOUSEBUTTONDOWN ): break;
case SDL_MOUSEBUTTONUP:
if (event.button.button == SDL_BUTTON_LEFT)
{ {
if ( event.button.button == SDL_BUTTON_LEFT ) bMouseLeft = false;
{
bMouseLeft = true;
}
else
if ( event.button.button == SDL_BUTTON_RIGHT )
{
bMouseRight = true;
}
break;
} }
case ( SDL_MOUSEBUTTONUP ): else if (event.button.button == SDL_BUTTON_RIGHT)
{ {
if ( event.button.button == SDL_BUTTON_LEFT ) bMouseRight = false;
{
bMouseLeft = false;
}
else
if ( event.button.button == SDL_BUTTON_RIGHT )
{
bMouseRight = false;
}
break;
} }
case ( SDL_MOUSEMOTION ): break;
case SDL_MOUSEMOTION:
iMouseX = event.motion.x;
iMouseY = event.motion.y;
break;
case SDL_WINDOWEVENT:
switch (event.window.event)
{ {
iMouseX = event.motion.x; case SDL_WINDOWEVENT_LEAVE:
iMouseY = event.motion.y; bMouseInWindow = false;
break; break;
} case SDL_WINDOWEVENT_ENTER:
case ( SDL_WINDOWEVENT ): bMouseInWindow = true;
{
switch ( event.window.event )
{
case ( SDL_WINDOWEVENT_LEAVE ):
{
bMouseInWindow = false;
break;
};
case ( SDL_WINDOWEVENT_ENTER ):
{
bMouseInWindow = true;
break;
};
};
break; break;
} };
break;
} }
} }
while ( SDL_PollEvent ( &event ) > 0 ); while (SDL_PollEvent(&event) > 0);
} }
if ( bMouseInWindow && ( bMouseLeft || bMouseRight ) ) if (bMouseInWindow && (bMouseLeft || bMouseRight))
{ {
int iFromX = clampi ( iMouseX / CHARWIDTH, 0, 79 ); int iFromX = clampi(iMouseX / CHARWIDTH, 0, 79);
int iFromY = clampi ( iMouseY / CHARHEIGHT, 0, 24 ); int iFromY = clampi(iMouseY / CHARHEIGHT, 0, 24);
int iToX = clampi ( iMousePrevX / CHARWIDTH, 0, 79 ); int iToX = clampi(iMousePrevX / CHARWIDTH, 0, 79);
int iToY = clampi ( iMousePrevY / CHARHEIGHT, 0, 24 ); int iToY = clampi(iMousePrevY / CHARHEIGHT, 0, 24);
SChar* srcChar = nullptr; SChar* srcChar = nullptr;
if ( bMouseLeft ) if (bMouseLeft)
{ {
srcChar = &leftBrush; srcChar = &leftBrush;
} }
else else if (bMouseRight)
if ( bMouseRight )
{ {
srcChar = &rightBrush; srcChar = &rightBrush;
} }
if ( iToX == iFromX && iToY == iFromY ) if (iToX == iFromX && iToY == iFromY)
{ {
SChar& dstChar = aDisplay[iToX + iToY * 80]; SChar& dstChar = aDisplay[iToX + iToY * 80];
dstChar.blinking = srcChar->blinking; dstChar.blinking = srcChar->blinking;
dstChar.bgColour = srcChar->bgColour; dstChar.bgColour = srcChar->bgColour;
dstChar.fgColour = srcChar->fgColour; dstChar.fgColour = srcChar->fgColour;
dstChar.character = srcChar->character; dstChar.character = srcChar->character;
} }
else else
{ {
int iTemp; int iTemp;
bool bSteep = labs ( iToY - iFromY ) > labs ( iToX - iFromX ); bool bSteep = labs(iToY - iFromY) > labs(iToX - iFromX);
if ( bSteep ) if (bSteep)
{ {
iTemp = iFromY; iTemp = iFromY;
iFromY = iFromX; iFromY = iFromX;
@@ -284,7 +264,7 @@ int main ( int argc, char** argv )
iToY = iToX; iToY = iToX;
iToX = iTemp; iToX = iTemp;
} }
if ( iFromX > iToX ) if (iFromX > iToX)
{ {
iTemp = iToX; iTemp = iToX;
iToX = iFromX; iToX = iFromX;
@@ -296,31 +276,31 @@ int main ( int argc, char** argv )
} }
int iDeltaX = iToX - iFromX; int iDeltaX = iToX - iFromX;
int iDeltaY = labs ( iToY - iFromY ); int iDeltaY = labs(iToY - iFromY);
int iError = iDeltaX / 2; int iError = iDeltaX / 2;
int iY = iFromY; int iY = iFromY;
int iYStep = ( iFromY < iToY ) ? 1 : -1; int iYStep = (iFromY < iToY) ? 1 : -1;
for ( int iX = iFromX; iX <= iToX; ++iX ) for (int iX = iFromX; iX <= iToX; ++iX)
{ {
if ( bSteep ) if (bSteep)
{ {
SChar& dstChar = aDisplay[iY + iX * 80]; SChar& dstChar = aDisplay[iY + iX * 80];
dstChar.blinking = srcChar->blinking; dstChar.blinking = srcChar->blinking;
dstChar.bgColour = srcChar->bgColour; dstChar.bgColour = srcChar->bgColour;
dstChar.fgColour = srcChar->fgColour; dstChar.fgColour = srcChar->fgColour;
dstChar.character = srcChar->character; dstChar.character = srcChar->character;
} }
else else
{ {
SChar& dstChar = aDisplay[iX + iY * 80]; SChar& dstChar = aDisplay[iX + iY * 80];
dstChar.blinking = srcChar->blinking; dstChar.blinking = srcChar->blinking;
dstChar.bgColour = srcChar->bgColour; dstChar.bgColour = srcChar->bgColour;
dstChar.fgColour = srcChar->fgColour; dstChar.fgColour = srcChar->fgColour;
dstChar.character = srcChar->character; dstChar.character = srcChar->character;
} }
iError -= iDeltaY; iError -= iDeltaY;
if ( iError < 0 ) if (iError < 0)
{ {
iY += iYStep; iY += iYStep;
iError += iDeltaX; iError += iDeltaX;
@@ -331,10 +311,10 @@ int main ( int argc, char** argv )
bValidRender = false; bValidRender = false;
} }
if ( !bValidRender ) if (!bValidRender)
{ {
SDL_SetRenderDrawColor ( pRenderer, 48, 48, 48, 255 ); SDL_SetRenderDrawColor(pRenderer, 48, 48, 48, 255);
SDL_RenderClear ( pRenderer ); SDL_RenderClear(pRenderer);
SDL_Rect src, dst; SDL_Rect src, dst;
@@ -344,44 +324,44 @@ int main ( int argc, char** argv )
dst.h = CHARHEIGHT; dst.h = CHARHEIGHT;
int iX = 0, iY = 0; int iX = 0, iY = 0;
for ( int i = 0; i < 2000; ++i ) for (int i = 0; i < 2000; ++i)
{ {
SChar& currentCharacter = aDisplay[i]; SChar& currentCharacter = aDisplay[i];
SDL_Colour& currentBgColour = g_aColourTable[(unsigned char)aDisplay[i].bgColour]; SDL_Colour& currentBgColour = g_aColourTable[(unsigned char)aDisplay[i].bgColour];
SDL_Colour& currentFgColour = g_aColourTable[(unsigned char)aDisplay[i].fgColour]; SDL_Colour& currentFgColour = g_aColourTable[(unsigned char)aDisplay[i].fgColour];
src.x = ( currentCharacter.character % 32 ) * CHARWIDTH; src.x = (currentCharacter.character % 32) * CHARWIDTH;
src.y = ( currentCharacter.character / 32 ) * CHARHEIGHT; src.y = (currentCharacter.character / 32) * CHARHEIGHT;
dst.x = iX * CHARWIDTH; dst.x = iX * CHARWIDTH;
dst.y = iY * CHARHEIGHT; dst.y = iY * CHARHEIGHT;
SDL_SetRenderDrawColor ( pRenderer, currentBgColour.r, currentBgColour.g, currentBgColour.b, currentBgColour.a ); SDL_SetRenderDrawColor(pRenderer, currentBgColour.r, currentBgColour.g, currentBgColour.b, currentBgColour.a);
SDL_RenderFillRect ( pRenderer, &dst ); SDL_RenderFillRect(pRenderer, &dst);
SDL_SetRenderDrawColor ( pRenderer, 0, 0, 0, currentFgColour.a ); SDL_SetRenderDrawColor(pRenderer, 0, 0, 0, currentFgColour.a);
if ( bBlinkState || !currentCharacter.blinking ) if (bBlinkState || !currentCharacter.blinking)
{ {
SDL_SetTextureColorMod ( pCodepage, currentFgColour.r, currentFgColour.g, currentFgColour.b ); SDL_SetTextureColorMod(pCodepage, currentFgColour.r, currentFgColour.g, currentFgColour.b);
SDL_RenderCopy ( pRenderer, pCodepage, &src, &dst ); SDL_RenderCopy(pRenderer, pCodepage, &src, &dst);
} }
if ( ++iX >= 80 ) if (++iX >= 80)
{ {
iX = 0; iX = 0;
++iY; ++iY;
} }
} }
SDL_RenderPresent ( pRenderer ); SDL_RenderPresent(pRenderer);
bValidRender = true; bValidRender = true;
} }
} }
fclose ( pFile ); fclose(pFile);
SDL_DestroyTexture ( pCodepage ); SDL_DestroyTexture(pCodepage);
SDL_DestroyRenderer ( pRenderer ); SDL_DestroyRenderer(pRenderer);
SDL_DestroyWindow ( pWindow ); SDL_DestroyWindow(pWindow);
IMG_Quit (); IMG_Quit();
SDL_Quit (); SDL_Quit();
return 0; return 0;
} }