rott/rott/cin_main.c

287 lines
4.7 KiB
C
Executable File

/*
Copyright (C) 1994-1995 Apogee Software, Ltd.
This program is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public License
as published by the Free Software Foundation; either version 2
of the License, or (at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
*/
#ifdef DOS
#include <malloc.h>
#include <dos.h>
#include <io.h>
#include <conio.h>
#endif
#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include "cin_glob.h"
#include "scriplib.h"
#include "watcom.h"
#include "z_zone.h"
#include "w_wad.h"
#include "cin_main.h"
#include "modexlib.h"
#include "lumpy.h"
#include "cin_actr.h"
#include "cin_evnt.h"
#include "cin_efct.h"
//MED
#include "memcheck.h"
boolean cinematicdone;
static int cinematictime;
static int cinematictics;
static int cinematictictime;
static int profiletics=-1;
/*
================
=
= ProfileMachine
=
================
*/
void ProfileMachine ( void )
{
int i;
int time;
int endtime;
if (profiletics>0)
return;
time=GetCinematicTime();
for (i=0;i<4;i++)
{
ProfileDisplay();
}
endtime=GetCinematicTime();
profiletics = (endtime-time)>>2;
if (profiletics<1)
profiletics=1;
}
/*
================
=
= StartupCinematic
=
================
*/
void StartupCinematic ( void )
{
StartupEvents ();
StartupCinematicActors ();
cinematicdone=false;
cinematictime=0;
GetCinematicTics ();
ClearCinematicAbort();
ProfileMachine();
}
/*
================
=
= ShutdownCinematic
=
================
*/
void ShutdownCinematic ( void )
{
ShutdownEvents ();
ShutdownCinematicActors ();
}
/*
================
=
= ParseCinematicScript
=
================
*/
void ParseCinematicScript (void)
{
int time;
time=0;
do
{
//
// get next command time
//
GetToken (true);
if (endofscript)
break;
time+=ParseNum(token);
ParseEvent ( time );
}
while (script_p < scriptend_p);
}
/*
==============
=
= CacheScriptFile
=
==============
*/
void CacheScriptFile (char *filename)
{
long size;
int lump;
lump=W_GetNumForName(filename);
scriptbuffer=W_CacheLumpNum(lump,PU_CACHE, CvtNull, 1);
size = W_LumpLength(lump);
script_p = scriptbuffer;
scriptend_p = script_p + size;
scriptline = 1;
endofscript = false;
tokenready = false;
}
/*
=================
=
= GrabCinematicScript
=
=================
*/
void GrabCinematicScript (char const *basename, boolean uselumpy)
{
char script[256];
//
// read in the script file
//
strcpy (script, basename);
strcat (script,".ms");
if (uselumpy==false)
LoadScriptFile (script);
else
CacheScriptFile ((char *)basename);
ParseCinematicScript ();
}
/*
==============
=
= GetCinematicTics
=
==============
*/
void GetCinematicTics ( void )
{
int time;
time=GetCinematicTime();
while (time==cinematictictime)
{
time=GetCinematicTime();
}
cinematictics=(time-cinematictictime);
cinematictictime=time;
cinematictics=profiletics;
}
void PlayMovie ( char * name, boolean uselumpy )
{
int i;
StartupCinematic ( );
GrabCinematicScript (name, uselumpy);
PrecacheCinematic ( );
GetCinematicTics();
while (cinematicdone==false)
{
cinematicdone=CinematicAbort();
#if DUMP
printf("time=%ld\n",cinematictime);
#endif
for (i=0;i<cinematictics;i++)
{
UpdateCinematicEvents ( cinematictime );
UpdateCinematicActors ( );
cinematictime++;
}
DrawCinematicActors ();
GetCinematicTics();
}
ShutdownCinematic ();
}
#ifndef DOS
int cin_iscale;
byte *cin_source;
int cin_texturemid;
int cin_ycenter;
int cin_yh;
int cin_yl;
/* f_scale.asm */
void R_DrawFilmColumn (byte * buf)
{
// This is *NOT* 100% correct - DDOI
int count;
int frac, fracstep;
byte *dest;
count = cin_yh - cin_yl;
if (count < 0) return;
dest = buf + ylookup[cin_yl];
fracstep = cin_iscale;
frac = cin_texturemid + (cin_yl-cin_ycenter)*fracstep;
while (count--) {
*dest = cin_source[(frac>>SFRACBITS)];
dest += iGLOBAL_SCREENWIDTH;
frac += fracstep;
}
}
void DrawFilmPost (byte * buf, byte * src, int height)
{
while (height--) {
*buf = *src;
src++;
buf += linewidth;
}
}
#endif