$NetBSD: patch-aj,v 1.4 2006/06/25 18:36:28 wiz Exp $

--- src/gens/emulator/g_main.c.orig	2004-05-18 20:34:00.000000000 +0000
+++ src/gens/emulator/g_main.c
@@ -55,8 +55,27 @@ int Intro_Style = 2;
 int SegaCD_Accurate = 0;
 int Kaillera_Client_Running = 0;
 
+int NbRerecord=0;
+char MovieFileName[1024];
+int MoviePlaying=0;
+int FrameCount=0;
+unsigned MovieLastFrame=0;
+
+FILE *MovieFile;
+
+struct type_MovieFrame
+{
+       char P1;
+       char P2;
+       char PX;
+};
+
+struct type_MovieFrame *MovieData = NULL;
+
 static int Gens_Running = 0;
 
+static int Build_Language_String (void);
+
 void
 SetWindowText (const char *s)
 {
@@ -394,6 +413,13 @@ update_SDL_events ()
 
 	      break;
 
+	    case SDLK_q:
+	      if (KMOD_CTRL & mod)
+		{
+		  close_gens ();
+		}
+	      break;
+
 	    case SDLK_v:
 	      if (KMOD_CTRL & mod)
 		{
@@ -429,14 +455,14 @@ update_SDL_events ()
 	case SDL_JOYAXISMOTION:
 	  if (event.jaxis.axis < 2)
 	    {
-	      if (event.jaxis.value < -500)
+	      if (event.jaxis.value < -10922)
 		{
 		  joystate[0x100 * event.jaxis.which +
 			   ((event.jaxis.axis == 0) ? 0x3 : 0x1)] = 1;
 		  joystate[0x100 * event.jaxis.which +
 			   ((event.jaxis.axis == 0) ? 0x4 : 0x2)] = 0;
 		}
-	      else if (event.jaxis.value > 500)
+	      else if (event.jaxis.value > 10922)
 		{
 		  joystate[0x100 * event.jaxis.which +
 			   ((event.jaxis.axis == 0) ? 0x4 : 0x2)] = 1;
@@ -661,11 +687,11 @@ idle_loop (gpointer data)
 int
 main (int argc, char *argv[])
 {
-  Init_Genesis_Bios ();
-
   char sdlbuf[32];
   GtkWidget *widget;
 
+  Init_Genesis_Bios ();
+
   add_pixmap_directory (DATADIR);
   gtk_init (&argc, &argv);
   gens_window = create_gens_window ();
@@ -850,3 +876,83 @@ Build_Language_String (void)
 
   return (0);
 }
+
+void PlayMovie()
+{
+	if(MoviePlaying) {
+		StopMovie();
+		return;
+	}
+	if(Change_File_L_MV(MovieFileName, State_Dir)==0)
+		return;
+	if (Genesis_Started)
+	{
+		Reset_Genesis();
+	}
+	else if (_32X_Started)
+	{
+		Reset_32X();
+	}
+	FrameCount=0;
+	if(LoadMovieFromFile(MovieFile,MovieFileName)==0)
+		return;
+	MESSAGE_NUM_L("Playing movie from start: %d rerecords","Playing movie from start: %d rerecords",NbRerecord,1500);
+	MoviePlaying=1;
+}
+
+int LoadMovieFromFile(FILE *MovieFile,char* FileName)
+{
+	MovieFile=fopen(FileName,"r+b");
+	if(MovieFile==NULL)
+	{
+		MESSAGE_L("Error loading movie:disk error","Error loading movie:disk error", 2000);
+		return 0;
+	}
+
+	fseek(MovieFile,0,SEEK_END);
+	MovieLastFrame=(ftell(MovieFile)-64)/3;
+	
+	MovieData = malloc(sizeof(struct type_MovieFrame)*MovieLastFrame);
+	if(!MovieData)
+	{
+		MESSAGE_L("Memory error allocating movie", "Memory error allocating movie", 2000);
+		return 0;
+	}
+	fseek(MovieFile,64,SEEK_SET);
+
+	if(fread(MovieData, sizeof(*MovieData), MovieLastFrame, MovieFile) < MovieLastFrame)
+	{
+		MESSAGE_L("Error loading movie:file read","Error loading movie:file read", 2000);
+		return 0;
+	}
+
+	fseek(MovieFile,16,SEEK_SET);
+	fread((char*)&NbRerecord,sizeof(NbRerecord),1,MovieFile);
+
+	fclose(MovieFile);
+	MovieFile=NULL;
+
+	return 1;
+}
+void ReadInMovie(unsigned  frame, char *p1, char *p2, char *px)
+{
+	if(frame>MovieLastFrame)
+	{
+		MESSAGE_NUM_L("Overflow error reading frame : %d","Overflow error reading frame : %d",frame,2000);
+		return;
+	}
+	*p1=MovieData[frame].P1;
+	*p2=MovieData[frame].P2;
+	*px=MovieData[frame].PX;
+}
+
+void
+StopMovie(void)
+{
+  if (!MoviePlaying)
+    return;
+
+  MoviePlaying = 0;
+  free(MovieData);
+  MovieData = NULL;
+}
