diff --git a/Makefile b/Makefile index bf5f3d0..71511b1 100644 --- a/Makefile +++ b/Makefile @@ -10,7 +10,7 @@ LDLIBS += -L/usr/X11R6/lib -lX11 -lXext `sdl-config --libs` AFLAGS = -g -Iinclude/ -w+macro-params -w+orphan-labels -w+number-overflow -ROOT = main.c stubs.c stubs2.cpp winapi.c afont.c frustum.c kshape.c map.c maths.c md5.c mem3dc.c mem3dcpp.cpp module.c morph.c mslhand.c object.c shpanim.c sphere.c tables.c vdb.c version.c +ROOT = main.c math.asm stubs.c stubs2.cpp winapi.c afont.c frustum.c kshape.c map.c maths.c md5.c mem3dc.c mem3dcpp.cpp module.c morph.c mslhand.c object.c shpanim.c sphere.c tables.c vdb.c version.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 equiputl.cpp extents.c game.c game_statistics.c gamecmds.cpp gameflow.c gamevars.cpp hmodel.c hud.c inventry.c language.c lighting.c load_shp.c los.c maps.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 r2base.cpp r2pos666.cpp reflist.cpp refobj.cpp scstring.cpp strtab.cpp strutil.c trig666.cpp wrapstr.cpp diff --git a/notes.txt b/notes.txt index 3852832..f24bfcc 100644 --- a/notes.txt +++ b/notes.txt @@ -7,3 +7,5 @@ Changed filenames: avp/win95/system.c (avp_load_rif calls) ======== is AvP.CurrentEnv and StartingEnv used? +======== +SCREENDESCRIPTORBLOCK.SDB_DiagonalWidth is unused diff --git a/src/kshape.c b/src/kshape.c index 9ca70be..1e5d12b 100644 --- a/src/kshape.c +++ b/src/kshape.c @@ -32,9 +32,6 @@ #include "detaillevels.h" #include "avp_userprofile.h" -#if SOFTWARE_RENDERER -#define D3D_ZBufferedGouraudTexturedPolygon_Output Software_ZBufferedGouraudTexturedPolygon_Output -#endif #define ALIENS_LIFEFORCE_GLOW_COLOUR 0x20ff8080 #define MARINES_LIFEFORCE_GLOW_COLOUR 0x208080ff #define PREDATORS_LIFEFORCE_GLOW_COLOUR 0x2080ff80 @@ -4503,10 +4500,16 @@ void TranslatePoint(int *source, int *dest, int *matrix) #endif #endif -/* TODO */ static void TranslatePoint(float *source, float *dest, float *matrix) { - fprintf(stderr, "TranslatePoint(%f, %f, %f)\n"); +// fprintf(stderr, "TranslatePoint(%f, %f, %f)\n"); + +/* TODO - implement the inline assembly here? */ +/* Moved to a separate file because I can't figure out the damn syntax! */ +__asm__("call TranslatePoint_Asm \n\t" + : + : "S" (source), "b" (dest), "d" (matrix) + ); } diff --git a/src/kshape.h b/src/kshape.h index 9282ccd..dc38e33 100644 --- a/src/kshape.h +++ b/src/kshape.h @@ -3,12 +3,6 @@ #include "particle.h" -#define SOFTWARE_RENDERER 0 - -#if SOFTWARE_RENDERER -#include "SoftwareRender.hpp" -#endif - typedef struct { diff --git a/src/main.c b/src/main.c index 1ab8cc5..26ecc90 100644 --- a/src/main.c +++ b/src/main.c @@ -12,6 +12,10 @@ #include "vision.h" #include "comp_shp.h" #include "avp_envinfo.h" +#include "stratdef.h" +#include "bh_types.h" +#include "avp_userprofile.h" +#include "pldnet.h" #include "cdtrackselection.h" char LevelName[] = {"predbit6\0QuiteALongNameActually"}; /* the real way to load levels */ @@ -38,6 +42,9 @@ int ExitWindowsSystem() int main(int argc, char *argv[]) { + int menusActive = 0; + int thisLevelHasBeenCompleted = 0; + LoadCDTrackList(); SetFastRandom(); @@ -56,7 +63,7 @@ int main(int argc, char *argv[]) InitialVideoMode(); /* Env_List can probably be removed */ -// Env_List[0]->main = &(ELOLevelToLoad); /* overwrite the first entry of crappy env_list with LevelName */ +// Env_List[0] = &(ELOLevelToLoad); /* overwrite the first entry of crappy env_list with LevelName */ Env_List[0]->main = LevelName; InitialiseSystem(); @@ -128,21 +135,134 @@ int main(int argc, char *argv[]) switch(AvP.GameMode) { case I_GM_Playing: + if ((!menusActive || (AvP.Network!=I_No_Network && !netGameData.skirmishMode)) && !AvP.LevelCompleted) { + /* TODO: print some debugging stuff */ + + DoAllShapeAnimations(); + + UpdateGame(); + + AvpShowViews(); + + MaintainHUD(); + + CheckCDAndChooseTrackIfNeeded(); + + if(InGameMenusAreRunning() && ( (AvP.Network!=I_No_Network && netGameData.skirmishMode) || (AvP.Network==I_No_Network)) ) { + SoundSys_StopAll(); + } + } else { + ReadUserInput(); + + /* UpdateAllFMVTextures(); NOT YET */ + + SoundSys_Management(); + + FlushD3DZBuffer(); + + ThisFramesRenderingHasBegun(); + } + +/* NOT YET + menusActive = AvP_InGameMenus(); + if (AvP.RestartLevel) menusActive=0; +*/ + + if (AvP.LevelCompleted) { + SoundSys_FadeOutFast(); + DoCompletedLevelStatisticsScreen(); + thisLevelHasBeenCompleted = 1; + } + + ThisFramesRenderingHasFinished(); + +/* NOT YET + InGameFlipBuffers(); +*/ + + FrameCounterHandler(); + { + PLAYER_STATUS *playerStatusPtr = (PLAYER_STATUS *) (Player->ObStrategyBlock->SBdataptr); + + if (!menusActive && playerStatusPtr->IsAlive && !AvP.LevelCompleted) { + DealWithElapsedTime(); + } + } break; + case I_GM_Menus: AvP.GameMode = I_GM_Playing; break; case I_GM_Paused: - break; +// break; default: fprintf(stderr, "AvP.MainLoopRunning: gamemode = %d\n", AvP.GameMode); exit(EXIT_FAILURE); } + + if (AvP.RestartLevel) { + AvP.RestartLevel = 0; + AvP.LevelCompleted = 0; +/* NOT YET + FixCheatModesInUserProfile(UserProfilePtr); +*/ + RestartLevel(); + } + break; /* TODO -- remove when loop works */ } + + AvP.LevelCompleted = thisLevelHasBeenCompleted; + +/* NOT YET + FixCheatModesInUserProfile(UserProfilePtr); +*/ + +/* NOT YET + CloseFMV(); + ReleaseAllFMVTextures(); +*/ + + CONSBIND_WriteKeyBindingsToConfigFile(); + + DeInitialisePlayer(); + + DeallocatePlayersMirrorImage(); + + KillHUD(); + + Destroy_CurrentEnvironment(); + + DeallocateAllImages(); + + EndNPCs(); + + ExitGame(); + + SoundSys_StopAll(); + + SoundSys_ResetFadeLevel(); + + CDDA_Stop(); + + if (AvP.Network != I_No_Network) { +/* NOT YET + EndAVPNetGame(); +*/ + } + + ClearMemoryPool(); // } + SoundSys_StopAll(); + SoundSys_RemoveAll(); + + ExitSystem(); + + CDDA_End(); + ClearMemoryPool(); + fprintf(stderr, "Now exiting Aliens vs Predator! At least it didn't crash!\n"); return 0; diff --git a/src/math.asm b/src/math.asm new file mode 100644 index 0000000..555b289 --- /dev/null +++ b/src/math.asm @@ -0,0 +1,52 @@ +BITS 32 +SECTION .text + +GLOBAL TranslatePoint_Asm + +; float *source, float *dest, float *matrix +; "S" (source), "b" (dest), "d" (matrix) +TranslatePoint_Asm: + fld dword [esi] + fmul dword [edi] + fld dword [esi+4] + fmul dword [edi+4] + fld dword [esi+8] + fmul dword [edi+8] + fxch st1 + faddp st2, st0 + fld dword [esi] + fmul dword [edi+16] + fxch st1 + faddp st2, st0 + fld dword [esi+4] + fmul dword [edi+20] + fld dword [esi+8] + fmul dword [edi+24] + fxch st1 + faddp st2, st0 + fld dword [esi] + fmul dword [edi+32] + fxch st1 + faddp st2, st0 + fld dword [esi+4] + fmul dword [edi+36] + fld dword [esi+8] + fmul dword [edi+40] + fxch st1 + faddp st2, st0 + fxch st3 + fadd dword [edi+12] + fxch st1 + faddp st3, st0 + fxch st1 + fadd dword [edi+28] + fxch st2 + fadd dword [edi+44] + fxch st1 + fstp dword [ebx] + fxch st1 + fstp dword [ebx+4] + fstp dword [ebx+8] + + ret + \ No newline at end of file diff --git a/src/stubs.c b/src/stubs.c index 08c3ea8..677fda7 100644 --- a/src/stubs.c +++ b/src/stubs.c @@ -17,6 +17,9 @@ #include "kshape.h" #include "d3d_hud.h" + +extern IMAGEHEADER ImageHeaderArray[]; + /* winmain.c */ BOOL KeepMainRifFile = FALSE; int HWAccel = 1; @@ -478,6 +481,11 @@ void ThisFramesRenderingHasBegun() fprintf(stderr, "ThisFramesRenderingHasBegun()\n"); } +void ThisFramesRenderingHasFinished() +{ + fprintf(stderr, "ThisFramesRenderingHasFinished()\n"); +} + void SecondFlushD3DZBuffer() { fprintf(stderr, "SecondFlushD3DZBuffer()\n"); @@ -527,9 +535,24 @@ BOOL EndD3DScene() return FALSE; } +static void *CurrTextureHandle; void D3D_ZBufferedGouraudTexturedPolygon_Output(POLYHEADER *inputPolyPtr, RENDERVERTEX *renderVerticesPtr) { + int texoffset; + void *TextureHandle; + + texoffset = inputPolyPtr->PolyColour & ClrTxDefn; + if (texoffset) { + TextureHandle = (void *)ImageHeaderArray[texoffset].D3DHandle; + } else { + TextureHandle = CurrTextureHandle; + } + fprintf(stderr, "D3D_ZBufferedGouraudTexturedPolygon_Output(%p, %p)\n", inputPolyPtr, renderVerticesPtr); + fprintf(stderr, "\tRenderPolygon.NumberOfVertices = %d\n", RenderPolygon.NumberOfVertices); + fprintf(stderr, "\ttexoffset = %d (ptr = %p)\n", texoffset, texoffset ? (void *)ImageHeaderArray[texoffset].D3DHandle : CurrTextureHandle); + + CurrTextureHandle = TextureHandle; } void D3D_ZBufferedGouraudPolygon_Output(POLYHEADER *inputPolyPtr,RENDERVERTEX *renderVerticesPtr) @@ -727,6 +750,11 @@ void CDDA_Start() fprintf(stderr, "CDDA_Start()\n"); } +void CDDA_End() +{ + fprintf(stderr, "CDDA_End()\n"); +} + void CDDA_ChangeVolume(int volume) { fprintf(stderr, "CDDA_ChangeVolume(%d)\n", volume); @@ -897,6 +925,11 @@ void RenderPlayersImageInMirror() fprintf(stderr, "RenderPlayersImageInMirror()\n"); } +void DeallocatePlayersMirrorImage() +{ + fprintf(stderr, "DeallocatePlayersMirrorImage()\n"); +} + void AddNetMsg_AlienAIKilled(STRATEGYBLOCK *sbPtr,int death_code,int death_time, int GibbFactor,DAMAGE_PROFILE* damage) { fprintf(stderr, "AddNetMsg_AlienAIKilled(%p, %d, %d, %d, %p)\n", sbPtr, death_code, death_time, GibbFactor, damage);