summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorSteven Fuller <relnev@icculus.org>2001-08-06 19:50:26 +0000
committerPatryk Obara <dreamer.tan@gmail.com>2019-08-20 02:22:36 +0200
commit0770c95c17191b8945695eb5c27c11d279e3c1b9 (patch)
treeae08d9afa6e83bbeeb586b21bb9823f43e93cdc6 /src
parent12c6a39177837a5c4dc8928a78140b4c3bb8f47a (diff)
Moved TranslatePoint into a separate file.
Implemented most of the main loop in main.c. Game now seems to run OK. Need to write texture code and then add OpenGL.
Diffstat (limited to 'src')
-rw-r--r--src/kshape.c13
-rw-r--r--src/kshape.h6
-rw-r--r--src/main.c124
-rw-r--r--src/math.asm52
-rw-r--r--src/stubs.c33
5 files changed, 215 insertions, 13 deletions
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);