From e69698d11edfe564cf4940714482856bd2088fd4 Mon Sep 17 00:00:00 2001 From: Steven Fuller Date: Sun, 5 Oct 2008 21:43:28 -0700 Subject: [PATCH] Added the missing support for static on the televisions. --- Makefile | 2 +- src/avp/win95/frontend/avp_intro.cpp | 4 + src/fixer.h | 8 + src/fmv.c | 368 +++++++++++++++++++++++++++ src/fmv.h | 42 +++ src/main.c | 23 +- src/stubs.c | 52 ---- 7 files changed, 435 insertions(+), 64 deletions(-) create mode 100644 src/fmv.c create mode 100644 src/fmv.h diff --git a/Makefile b/Makefile index 325fccf..9a2115f 100644 --- a/Makefile +++ b/Makefile @@ -11,7 +11,7 @@ CXXFLAGS = $(CFLAGS) LDLIBS = -m32 $(shell sdl-config --libs) $(shell openal-config --libs) -ROOT = main.c files.c winapi.c stubs.c version.c mathline.c opengl.c oglfunc.c openal.c cdplayer.c menus.c net.c frustum.c kshape.c map.c maths.c md5.c mem3dc.c mem3dcpp.cpp module.c morph.c object.c shpanim.c sphere.c tables.c vdb.c +ROOT = main.c files.c winapi.c stubs.c version.c mathline.c opengl.c fmv.c oglfunc.c openal.c cdplayer.c menus.c net.c frustum.c kshape.c map.c maths.c md5.c mem3dc.c mem3dcpp.cpp module.c morph.c object.c shpanim.c sphere.c tables.c vdb.c AVP = ai_sight.c avpview.c bh_agun.c bh_ais.c bh_alien.c bh_binsw.c bh_cable.c bh_corpse.c bh_deathvol.c bh_debri.c bh_dummy.c bh_fan.c bh_far.c bh_fhug.c bh_gener.c bh_ldoor.c bh_lift.c bh_light.c bh_lnksw.c bh_ltfx.c bh_marin.c bh_mission.c bh_near.c bh_pargen.c bh_plachier.c bh_plift.c bh_pred.c bh_queen.c bh_rubberduck.c bh_selfdest.c bh_snds.c bh_spcl.c bh_swdor.c bh_track.c bh_types.c bh_videoscreen.c bh_waypt.c bh_weap.c bh_xeno.c bonusabilities.c cconvars.cpp cdtrackselection.cpp cheatmodes.c comp_map.c comp_shp.c consolelog.cpp davehook.cpp deaths.c decal.c detaillevels.c dynamics.c dynblock.c equipmnt.c extents.c game.c game_statistics.c gamecmds.cpp gamevars.cpp hmodel.c hud.c inventry.c language.c lighting.c load_shp.c los.c mempool.c messagehistory.c missions.cpp movement.c paintball.c particle.c pfarlocs.c pheromon.c player.c pmove.c psnd.c psndproj.c pvisible.c savegame.c scream.cpp secstats.c sfx.c stratdef.c targeting.c track.c triggers.c weapons.c SHAPES = cube.c SUPPORT = consbind.cpp consbtch.cpp coordstr.cpp daemon.cpp indexfnt.cpp r2base.cpp r2pos666.cpp reflist.cpp refobj.cpp rentrntq.cpp scstring.cpp strtab.cpp strutil.c trig666.cpp wrapstr.cpp diff --git a/src/avp/win95/frontend/avp_intro.cpp b/src/avp/win95/frontend/avp_intro.cpp index 8356131..90c3b64 100644 --- a/src/avp/win95/frontend/avp_intro.cpp +++ b/src/avp/win95/frontend/avp_intro.cpp @@ -35,6 +35,10 @@ void PlayMenuMusic(void) { } +void EndMenuMusic(void) +{ +} + void WeWantAnIntro(void) { IntroHasAlreadyBeenPlayed = 0; diff --git a/src/fixer.h b/src/fixer.h index ced3c91..2479780 100644 --- a/src/fixer.h +++ b/src/fixer.h @@ -107,6 +107,14 @@ typedef struct RECT int bottom; } RECT; +typedef struct PALETTEENTRY +{ + BYTE peRed; + BYTE peGreen; + BYTE peBlue; + BYTE peFlags; +} PALETTEENTRY; + #if !defined(__INTEL_COMPILER) typedef int64_t __int64; #else diff --git a/src/fmv.c b/src/fmv.c new file mode 100644 index 0000000..8edbd65 --- /dev/null +++ b/src/fmv.c @@ -0,0 +1,368 @@ +/* KJL 15:25:20 8/16/97 + * + * smacker.c - functions to handle FMV playback + * + */ +#include "3dc.h" +#include "module.h" +#include "inline.h" +#include "stratdef.h" +#include "gamedef.h" +#include "fmv.h" +#include "avp_menus.h" +#include "avp_userprofile.h" +#include "oglfunc.h" + +#define UseLocalAssert 1 +#include "ourasert.h" + +int VolumeOfNearestVideoScreen; +int PanningOfNearestVideoScreen; + +extern char *ScreenBuffer; +extern int GotAnyKey; +extern void DirectReadKeyboard(void); +extern IMAGEHEADER ImageHeaderArray[]; +#if MaxImageGroups>1 +extern int NumImagesArray[]; +#else +extern int NumImages; +#endif + +void PlayFMV(char *filenamePtr); + +void FindLightingValueFromFMV(unsigned short *bufferPtr); +void FindLightingValuesFromTriggeredFMV(unsigned char *bufferPtr, FMVTEXTURE *ftPtr); + +int SmackerSoundVolume=ONE_FIXED/512; +int MoviesAreActive; +int IntroOutroMoviesAreActive=1; + +int FmvColourRed; +int FmvColourGreen; +int FmvColourBlue; + +void ReleaseFMVTexture(FMVTEXTURE *ftPtr); + + +/* KJL 12:45:23 10/08/98 - FMVTEXTURE stuff */ +#define MAX_NO_FMVTEXTURES 10 +FMVTEXTURE FMVTexture[MAX_NO_FMVTEXTURES]; +int NumberOfFMVTextures; + +void ScanImagesForFMVs(void) +{ + + extern void SetupFMVTexture(FMVTEXTURE *ftPtr); + int i; + IMAGEHEADER *ihPtr; + NumberOfFMVTextures=0; + + #if MaxImageGroups>1 + for (j=0; jImageName,"FMVs"))) + { + char filename[30]; + { + char *filenamePtr = filename; + do + { + *filenamePtr++ = *strPtr; + } + while(*strPtr++!='.'); + + *filenamePtr++='s'; + *filenamePtr++='m'; + *filenamePtr++='k'; + *filenamePtr=0; + } + + //if (smackHandle) + //{ + // FMVTexture[NumberOfFMVTextures].IsTriggeredPlotFMV = 0; + //} + //else + { + FMVTexture[NumberOfFMVTextures].IsTriggeredPlotFMV = 1; + } + + { + //FMVTexture[NumberOfFMVTextures].SmackHandle = smackHandle; + FMVTexture[NumberOfFMVTextures].ImagePtr = ihPtr; + FMVTexture[NumberOfFMVTextures].StaticImageDrawn=0; + SetupFMVTexture(&FMVTexture[NumberOfFMVTextures]); + NumberOfFMVTextures++; + + if (NumberOfFMVTextures == MAX_NO_FMVTEXTURES) + { + break; + } + } + } + } + } + } + + +} + +void UpdateAllFMVTextures(void) +{ + extern void UpdateFMVTexture(FMVTEXTURE *ftPtr); + int i = NumberOfFMVTextures; + + while(i--) + { + UpdateFMVTexture(&FMVTexture[i]); + } + +} + +void ReleaseAllFMVTextures(void) +{ + extern void UpdateFMVTexture(FMVTEXTURE *ftPtr); + int i = NumberOfFMVTextures; + + while(i--) + { + ReleaseFMVTexture(&FMVTexture[i]); + } + +} + + +int NextFMVTextureFrame(FMVTEXTURE *ftPtr, void *bufferPtr) +{ + int w = 128; + + if (!ftPtr->StaticImageDrawn) + { + int i = w*96/4; + unsigned int seed = FastRandom(); + int *ptr = (int*)bufferPtr; + do + { + seed = ((seed*1664525)+1013904223); + *ptr++ = seed; + } + while(--i); + ftPtr->StaticImageDrawn=1; + } + FindLightingValuesFromTriggeredFMV((unsigned char*)bufferPtr,ftPtr); + return 1; + +} + +void UpdateFMVTexturePalette(FMVTEXTURE *ftPtr) +{ + //unsigned char *c; + int i; + // + //if (MoviesAreActive && ftPtr->SmackHandle) + //{ + //} + //else + { + { + unsigned int seed = FastRandom(); + for(i=0;i<256;i++) + { + int l = (seed&(seed>>24)&(seed>>16)); + seed = ((seed*1664525)+1013904223); + ftPtr->SrcPalette[i].peRed=l; + ftPtr->SrcPalette[i].peGreen=l; + ftPtr->SrcPalette[i].peBlue=l; + } + } + } +} + +extern void StartTriggerPlotFMV(int number) +{ + (void) number; + + //int i = NumberOfFMVTextures; + //char buffer[25]; + // + //if (CheatMode_Active != CHEATMODE_NONACTIVE) return; + // + //sprintf(buffer,"FMVs//message%d.smk",number); + //{ + // FILE* file=fopen(buffer,"rb"); + // if(!file) + // { + // return; + // } + // fclose(file); + //} + //while(i--) + //{ + // if (FMVTexture[i].IsTriggeredPlotFMV) + // { + // FMVTexture[i].MessageNumber = number; + // } + //} +} + +extern void StartFMVAtFrame(int number, int frame) +{ +} + +extern void GetFMVInformation(int *messageNumberPtr, int *frameNumberPtr) +{ + //int i = NumberOfFMVTextures; + // + //while(i--) + //{ + // if (FMVTexture[i].IsTriggeredPlotFMV) + // { + // if(FMVTexture[i].SmackHandle) + // { + // *messageNumberPtr = FMVTexture[i].MessageNumber; + // *frameNumberPtr = 0; + // return; + // } + // } + //} + + *messageNumberPtr = 0; + *frameNumberPtr = 0; +} + + +extern void InitialiseTriggeredFMVs(void) +{ + //int i = NumberOfFMVTextures; + //while(i--) + //{ + // if (FMVTexture[i].IsTriggeredPlotFMV) + // { + // if(FMVTexture[i].SmackHandle) + // { + // FMVTexture[i].MessageNumber = 0; + // } + // + // FMVTexture[i].SmackHandle = 0; + // } + //} +} + +void FindLightingValuesFromTriggeredFMV(unsigned char *bufferPtr, FMVTEXTURE *ftPtr) +{ + unsigned int totalRed=0; + unsigned int totalBlue=0; + unsigned int totalGreen=0; + + int pixels = 128*96;//64*48;//256*192; + do + { + unsigned char source = (*bufferPtr++); + totalBlue += ftPtr->SrcPalette[source].peBlue; + totalGreen += ftPtr->SrcPalette[source].peGreen; + totalRed += ftPtr->SrcPalette[source].peRed; + } + while(--pixels); + + FmvColourRed = totalRed/48*16; + FmvColourGreen = totalGreen/48*16; + FmvColourBlue = totalBlue/48*16; + +} + +void SetupFMVTexture(FMVTEXTURE *ftPtr) +{ + if (ftPtr->PalettedBuf == NULL) + { + ftPtr->PalettedBuf = (unsigned char*) malloc(128*128*4); + } + + if (ftPtr->RGBBuf == NULL) + { + if (ftPtr->PalettedBuf == NULL) + { + return; + } + + ftPtr->RGBBuf = &ftPtr->PalettedBuf[128*128]; + } +} + +void UpdateFMVTexture(FMVTEXTURE *ftPtr) +{ + unsigned char *srcPtr; + unsigned char *dstPtr; + + int pixels = 128*96;//64*48;//256*192; + + // get the next frame into the paletted buffer + if (!NextFMVTextureFrame(ftPtr, &ftPtr->PalettedBuf[0])) + { + return; + } + + // update the texture palette + UpdateFMVTexturePalette(ftPtr); + + srcPtr = &ftPtr->PalettedBuf[0]; + dstPtr = &ftPtr->RGBBuf[0]; + + // not using paletted textures, so convert to rgb manually + do + { + unsigned char source = (*srcPtr++); + dstPtr[0] = ftPtr->SrcPalette[source].peRed; + dstPtr[1] = ftPtr->SrcPalette[source].peGreen; + dstPtr[2] = ftPtr->SrcPalette[source].peBlue; + + dstPtr += 3; + } while(--pixels); + + // update the opengl texture + pglBindTexture(GL_TEXTURE_2D, ftPtr->ImagePtr->D3DTexture->id); + + pglTexSubImage2D(GL_TEXTURE_2D, 0, 0, 0, 128, 96, GL_RGB, GL_UNSIGNED_BYTE, &ftPtr->RGBBuf[0]); +} + +void ReleaseFMVTexture(FMVTEXTURE *ftPtr) +{ + ftPtr->MessageNumber = 0; + + //if (FMVTexture[i].SrcTexture) + //{ + // ReleaseD3DTexture(FMVTexture[i].SrcTexture); + // FMVTexture[i].SrcTexture=0; + //} + //if (FMVTexture[i].SrcSurface) + //{ + // ReleaseDDSurface(FMVTexture[i].SrcSurface); + // FMVTexture[i].SrcSurface=0; + //} + //if (FMVTexture[i].DestTexture) + //{ + // ReleaseD3DTexture(FMVTexture[i].DestTexture); + // FMVTexture[i].DestTexture = 0; + //} + + if (ftPtr->PalettedBuf != NULL) + { + free(ftPtr->PalettedBuf); + ftPtr->PalettedBuf = NULL; + } + + ftPtr->RGBBuf = NULL; +} diff --git a/src/fmv.h b/src/fmv.h new file mode 100644 index 0000000..4d7b5db --- /dev/null +++ b/src/fmv.h @@ -0,0 +1,42 @@ +#ifndef FMV_H +#define FMV_H + +typedef struct +{ + IMAGEHEADER *ImagePtr; + int SoundVolume; + int IsTriggeredPlotFMV; + int StaticImageDrawn; + + int MessageNumber; + + // disabled direct3d stuff + //LPDIRECTDRAWSURFACE SrcSurface; + //LPDIRECT3DTEXTURE SrcTexture; + //LPDIRECT3DTEXTURE DestTexture; + PALETTEENTRY SrcPalette[256]; + + // buffer used for opengl texture uploads + unsigned char* PalettedBuf; + unsigned char* RGBBuf; + + int RedScale; + int GreenScale; + int BlueScale; + +} FMVTEXTURE; + + +extern int NextFMVTextureFrame(FMVTEXTURE *ftPtr, void *bufferPtr); +extern void UpdateFMVTexturePalette(FMVTEXTURE *ftPtr); +extern void InitialiseTriggeredFMVs(void); +extern void StartTriggerPlotFMV(int number); + +extern void StartFMVAtFrame(int number, int frame); +extern void GetFMVInformation(int *messageNumberPtr, int *frameNumberPtr); + +void UpdateAllFMVTextures(void); +void ScanImagesForFMVs(void); +void ReleaseAllFMVTextures(void); + +#endif diff --git a/src/main.c b/src/main.c index 5081210..eff537f 100644 --- a/src/main.c +++ b/src/main.c @@ -43,6 +43,7 @@ #include "progress_bar.h" #include "scrshot.hpp" #include "version.h" +#include "fmv.h" char LevelName[] = {"predbit6\0QuiteALongNameActually"}; /* the real way to load levels */ @@ -77,6 +78,13 @@ static const char * opengl_library = NULL; /* ** */ +static void IngameKeyboardInput_ClearBuffer(void) +{ + // clear the keyboard state + memset((void*) KeyboardInput, 0, MAX_NUMBER_OF_INPUT_KEYS); + GotAnyKey = 0; +} + void DirectReadKeyboard() { } @@ -494,8 +502,7 @@ int SetSoftVideoMode(int Width, int Height, int Depth) } // reset input - memset((void*) KeyboardInput, 0, MAX_NUMBER_OF_INPUT_KEYS); - GotAnyKey = 0; + IngameKeyboardInput_ClearBuffer(); // force restart the video system SDL_QuitSubSystem(SDL_INIT_VIDEO); @@ -560,8 +567,7 @@ int SetOGLVideoMode(int Width, int Height) } // reset input - memset((void*) KeyboardInput, 0, MAX_NUMBER_OF_INPUT_KEYS); - GotAnyKey = 0; + IngameKeyboardInput_ClearBuffer(); // force restart the video system SDL_QuitSubSystem(SDL_INIT_VIDEO); @@ -1279,7 +1285,7 @@ if (AvP_MainMenus()) AvP.MainLoopRunning = 1; -/* ScanImagesForFMVs(); NOT YET */ + ScanImagesForFMVs(); ResetFrameCounter(); @@ -1296,7 +1302,7 @@ if (AvP_MainMenus()) TeleportNetPlayerToAStartingPosition(Player->ObStrategyBlock,1); } -/* IngameKeyboardInput_ClearBuffer(); NOT YET */ + IngameKeyboardInput_ClearBuffer(); while(AvP.MainLoopRunning) { CheckForWindowsMessages(); @@ -1322,8 +1328,6 @@ if (AvP_MainMenus()) } else { ReadUserInput(); - /* UpdateAllFMVTextures(); NOT YET */ - SoundSys_Management(); FlushD3DZBuffer(); @@ -1376,10 +1380,7 @@ if (AvP_MainMenus()) FixCheatModesInUserProfile(UserProfilePtr); -/* NOT YET - CloseFMV(); ReleaseAllFMVTextures(); -*/ CONSBIND_WriteKeyBindingsToConfigFile(); diff --git a/src/stubs.c b/src/stubs.c index 3515889..b1be586 100644 --- a/src/stubs.c +++ b/src/stubs.c @@ -52,58 +52,6 @@ void EndMenuBackgroundBink() */ } - -/* smacker.c */ -int FmvColourRed; -int FmvColourGreen; -int FmvColourBlue; -int IntroOutroMoviesAreActive = 1; -int MoviesAreActive; -int SmackerSoundVolume; - -void GetFMVInformation(int *messageNumberPtr, int *frameNumberPtr) -{ -/* - fprintf(stderr, "GetFMVInformation(%p, %p)\n", messageNumberPtr, frameNumberPtr); -*/ -} - -void InitialiseTriggeredFMVs() -{ -/* - fprintf(stderr, "InitialiseTriggeredFMVs()\n"); -*/ -} - -void StartFMVAtFrame(int number, int frame) -{ -/* - fprintf(stderr, "StartFMVAtFrame(%d, %d)\n", number, frame); -*/ -} - -void StartTriggerPlotFMV(int number) -{ -/* - fprintf(stderr, "StartTriggerPlotFMV(%d)\n", number); -*/ -} - -void UpdateAllFMVTextures() -{ -/* - fprintf(stderr, "UpdateAllFMVTextures()\n"); -*/ -} - -void EndMenuMusic() -{ -/* - fprintf(stderr, "EndMenuMusic()\n"); -*/ -} - - /* alt_tab.cpp */ void ATIncludeSurface(void * pSurface, void * hBackup) {