5605 lines
129 KiB
C
Executable File
5605 lines
129 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 <dos.h>
|
||
#include <io.h>
|
||
#include <conio.h>
|
||
#endif
|
||
|
||
#include <stdlib.h>
|
||
#include <string.h>
|
||
#include <stdio.h>
|
||
#include <ctype.h>
|
||
|
||
#include "rt_def.h"
|
||
#include "rt_main.h"
|
||
#include "rt_game.h"
|
||
#include "_rt_game.h"
|
||
#include "rt_menu.h"
|
||
#include "z_zone.h"
|
||
#include "w_wad.h"
|
||
#include "lumpy.h"
|
||
#include "rt_playr.h"
|
||
#include "rt_util.h"
|
||
#include "rt_ted.h"
|
||
#include "rt_draw.h"
|
||
#include "rt_view.h"
|
||
#include "rt_vid.h"
|
||
#include "rt_door.h"
|
||
#include "rt_in.h"
|
||
#include "rt_str.h"
|
||
#include "isr.h"
|
||
#include "rt_build.h"
|
||
#include "rt_rand.h"
|
||
#include "rt_cfg.h"
|
||
#include "rt_sound.h"
|
||
#include "version.h"
|
||
#include "rt_crc.h"
|
||
#include "modexlib.h"
|
||
#include "engine.h"
|
||
#include "gmove.h"
|
||
#include "rt_com.h"
|
||
#include "rt_net.h"
|
||
#include "watcom.h"
|
||
#include "rt_floor.h"
|
||
#include "rt_msg.h"
|
||
#include "rt_scale.h"
|
||
#include "develop.h"
|
||
//MED
|
||
#include "memcheck.h"
|
||
|
||
#if (SHAREWARE == 1)
|
||
#define NUMAMMOGRAPHICS 10
|
||
#else
|
||
#define NUMAMMOGRAPHICS 20
|
||
#endif
|
||
|
||
//******************************************************************************
|
||
//
|
||
// GLOBALS
|
||
//
|
||
//******************************************************************************
|
||
|
||
int PlayerSnds[5] = {SD_PLAYERTCSND, SD_PLAYERTBSND, SD_PLAYERDWSND,
|
||
SD_PLAYERLNSND, SD_PLAYERIPFSND};
|
||
|
||
|
||
unsigned short SHAKETICS = 0xFFFF;//bna++
|
||
//int SHAKETICS = 0xFFFF;
|
||
int damagecount = 0;
|
||
HighScore Scores[MaxScores] =
|
||
{
|
||
{"Tom",70000,7,1},
|
||
{"Chuck",60000,6,1},
|
||
{"Mark",50000,5,1},
|
||
{"The Joes",40000,4,1},
|
||
{"William",30000,3,1},
|
||
{"Jim",20000,2,1},
|
||
{"Steve",10000,1,1},
|
||
};
|
||
|
||
//******************************************************************************
|
||
//
|
||
// LOCALS
|
||
//
|
||
//******************************************************************************
|
||
|
||
static int KeyX[4] = {KEY1_X, KEY2_X, KEY3_X, KEY4_X};
|
||
|
||
static const char *Names[ 5 ] =
|
||
{
|
||
"Taradino", "Thi", "Doug", "Lorelei", "Ian Paul"
|
||
};
|
||
|
||
static const char *LastNames[ 5 ] =
|
||
{
|
||
"Cassatt", "Barrett", "Wendt", "Ni", "Freeley"
|
||
};
|
||
|
||
static STR ScoreStr;
|
||
static STR LivesStr;
|
||
static STR TriadStr;
|
||
static STR KillStr;
|
||
|
||
static pic_t *lifeptnums[10];
|
||
static pic_t *lifenums[10];
|
||
static pic_t *timenums[10];
|
||
static pic_t *scorenums[10];
|
||
static pic_t *keys[4];
|
||
static pic_t *men[5];
|
||
|
||
static pic_t *health[6];
|
||
static pic_t *ammo[26];
|
||
static pic_t *erase;
|
||
static pic_t *eraseb;
|
||
static pic_t *fragpic[ 5 ];
|
||
static pic_t *frag100pic[ 5 ];
|
||
static pic_t *negfragpic[ 5 ];
|
||
static pic_t *menneg[ 5 ];
|
||
static pic_t *blankfragpic;
|
||
|
||
static int powerpics;
|
||
static int poweradjust;
|
||
|
||
static int poweruptime;
|
||
static int powerupheight;
|
||
static int protectiontime;
|
||
static int protectionheight;
|
||
|
||
|
||
static boolean EndLevelStuff = false;
|
||
static boolean borderset = false;
|
||
static int oldsec = -1;
|
||
|
||
static pic_t *BkPic;
|
||
int SaveTime = 0;
|
||
int oldhealth;
|
||
|
||
static int oldplayerhealth;
|
||
static int oldpercenthealth;
|
||
|
||
static int playeruniformcolor;
|
||
|
||
#define NUMBONUSES 11
|
||
#define BONUSBONUS 100000
|
||
|
||
|
||
extern void VL_MemToScreenClipped (byte *source, int width, int height, int x, int y);
|
||
void DrawPPic (int xpos, int ypos, int width, int height, byte *src, int num, boolean up, boolean bufferofsonly);
|
||
extern void MoveScreenUpLeft();
|
||
extern void MoveScreenUpRight();
|
||
extern void MoveScreenDownLeft();
|
||
extern void MoveScreenDownRight();
|
||
//******************************************************************************
|
||
//
|
||
// V_ReDrawBkgnd ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void V_ReDrawBkgnd (int x, int y, int width, int height, boolean shade)
|
||
{
|
||
byte *src;
|
||
byte *dest;
|
||
byte *origdest;
|
||
int j,
|
||
k,
|
||
planes,
|
||
mask,
|
||
m;
|
||
|
||
m = (x&3);
|
||
mask = (1 << m);
|
||
|
||
#ifdef DOS
|
||
origdest = (byte *)(bufferofs+ylookup[y]+(x>>2));
|
||
#else
|
||
origdest = (byte *)(bufferofs+ylookup[y]+x);
|
||
#endif
|
||
|
||
if (VW_MarkUpdateBlock (x, y, x+width-1, y+height-1))
|
||
{
|
||
for (planes = 0; planes < 4; planes++)
|
||
{
|
||
src = (&(BkPic->data)+((80*200)*m)+(80*y)+(x>>2));
|
||
dest = origdest;
|
||
|
||
#ifdef DOS
|
||
VGAMAPMASK (mask);
|
||
#else
|
||
dest += planes;
|
||
#endif
|
||
|
||
for (j = 0; j < height; j++)
|
||
{
|
||
for (k = 0; k < (width/4); k++) {
|
||
if (shade) {
|
||
*dest = *(colormap + ((MENUSHADELEVEL>>2)<<8) + *src++);
|
||
} else {
|
||
*dest = *src++;
|
||
}
|
||
#ifdef DOS
|
||
dest++;
|
||
#else
|
||
dest += 4;
|
||
#endif
|
||
}
|
||
|
||
#ifndef DOS
|
||
// draw the remainder. did the DOS version even bother? - SBF
|
||
if ((width & 3) > planes) {
|
||
if (shade) {
|
||
*dest = *(colormap + ((MENUSHADELEVEL>>2)<<8) + *src);
|
||
} else {
|
||
*dest = *src;
|
||
}
|
||
}
|
||
#endif
|
||
|
||
src += (80-(width/4));
|
||
#ifdef DOS
|
||
dest += (linewidth-(width/4));
|
||
#else
|
||
dest += (linewidth-(width&~3));
|
||
#endif
|
||
}
|
||
|
||
m++;
|
||
|
||
mask <<= 1;
|
||
|
||
if (mask == 16)
|
||
{
|
||
x+=4;
|
||
mask = 1;
|
||
m = 0;
|
||
#ifdef DOS
|
||
origdest++;
|
||
#endif
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// CacheLumpGroup ()
|
||
//
|
||
//******************************************************************************
|
||
void CacheLumpGroup
|
||
(
|
||
char *startlump,
|
||
pic_t **lumparray,
|
||
int numberoflumps
|
||
)
|
||
|
||
{
|
||
int lumpnum;
|
||
int i;
|
||
|
||
lumpnum = W_GetNumForName( startlump );
|
||
|
||
for( i = 0; i < numberoflumps; i++ )
|
||
{
|
||
lumparray[ i ] = ( pic_t * )W_CacheLumpNum( lumpnum + i, PU_LEVEL, Cvt_pic_t, 1 );
|
||
}
|
||
}
|
||
|
||
//******************************************************************************
|
||
//
|
||
// SetupPlayScreen ()
|
||
//
|
||
//******************************************************************************
|
||
void SetupPlayScreen
|
||
(
|
||
void
|
||
)
|
||
|
||
{
|
||
int i;
|
||
int j;
|
||
int num;
|
||
|
||
erase = ( pic_t * )W_CacheLumpName( "erase", PU_LEVEL, Cvt_pic_t, 1 );
|
||
eraseb = ( pic_t * )W_CacheLumpName( "eraseb", PU_LEVEL, Cvt_pic_t, 1 );
|
||
|
||
CacheLumpGroup( "tmnum0", timenums, 10 );
|
||
CacheLumpGroup( "lfnum0", lifeptnums, 10 );
|
||
CacheLumpGroup( "lvnum0", lifenums, 10 );
|
||
CacheLumpGroup( "health1b", health, 6 );
|
||
CacheLumpGroup( "key1", keys, 4 );
|
||
|
||
if ( !BATTLEMODE )
|
||
{
|
||
CacheLumpGroup( "scnum0", scorenums, 10 );
|
||
|
||
num = locplayerstate->player;
|
||
men[ num ] = ( pic_t * )W_CacheLumpNum( W_GetNumForName( "MAN1" ) +
|
||
num, PU_LEVEL, Cvt_pic_t, 1 );
|
||
}
|
||
else
|
||
{
|
||
int man;
|
||
int num100;
|
||
int negnum;
|
||
int negman;
|
||
|
||
CacheLumpGroup( "kilnum0", scorenums, 10 );
|
||
|
||
negnum = W_GetNumForName( "botnpic1" );
|
||
num = W_GetNumForName( "botpic0" );
|
||
num100 = W_GetNumForName( "botopic1" );
|
||
negman = W_GetNumForName( "negman1" );
|
||
man = W_GetNumForName( "man1" );
|
||
|
||
blankfragpic = ( pic_t * )W_CacheLumpNum( num, PU_LEVEL, Cvt_pic_t, 1 );
|
||
num++;
|
||
|
||
for( i = 0; i < numplayers; i++ )
|
||
{
|
||
j = PLAYERSTATE[ i ].player;
|
||
if ( !gamestate.teamplay )
|
||
{
|
||
fragpic[ j ] = ( pic_t * )W_CacheLumpNum( num + j, PU_LEVEL, Cvt_pic_t, 1 );
|
||
frag100pic[ j ] = ( pic_t * )W_CacheLumpNum( num100 + j, PU_LEVEL, Cvt_pic_t, 1 );
|
||
negfragpic[ j ] = ( pic_t * )W_CacheLumpNum( negnum + j, PU_LEVEL, Cvt_pic_t, 1 );
|
||
}
|
||
else
|
||
{
|
||
negfragpic[ j ] = ( pic_t * )W_CacheLumpName( "teamnpic", PU_LEVEL, Cvt_pic_t, 1 );
|
||
fragpic[ j ] = ( pic_t * )W_CacheLumpName( "teampic", PU_LEVEL, Cvt_pic_t, 1 );
|
||
frag100pic[ j ] = fragpic[ j ];
|
||
}
|
||
|
||
menneg[ j ] = ( pic_t * )W_CacheLumpNum( negman + j, PU_LEVEL, Cvt_pic_t, 1 );
|
||
men[ j ] = ( pic_t * )W_CacheLumpNum( man + j, PU_LEVEL, Cvt_pic_t, 1 );
|
||
}
|
||
}
|
||
|
||
powerpics = W_GetNumForName( "GDMODEP" );
|
||
poweradjust = POWERUPTICS / 16;
|
||
|
||
num = W_GetNumForName( "INF_B" );
|
||
|
||
// bullet weapons
|
||
ammo[0] = ( pic_t * )W_CacheLumpNum( num, PU_LEVEL, Cvt_pic_t, 1 );
|
||
ammo[1] = ( pic_t * )W_CacheLumpNum( num, PU_LEVEL, Cvt_pic_t, 1 );
|
||
ammo[2] = ( pic_t * )W_CacheLumpNum( num++, PU_LEVEL, Cvt_pic_t, 1 );
|
||
|
||
|
||
for(i=3;i < 13; i++ )
|
||
{
|
||
ammo[ i ] = ( pic_t * )W_CacheLumpNum( num++, PU_LEVEL, Cvt_pic_t, 1 );
|
||
}
|
||
|
||
ammo[13] = ( pic_t * )W_CacheLumpNum( num, PU_LEVEL, Cvt_pic_t, 1 );
|
||
ammo[14] = ( pic_t * )W_CacheLumpNum( num, PU_LEVEL, Cvt_pic_t, 1 );
|
||
ammo[15] = ( pic_t * )W_CacheLumpNum( num++, PU_LEVEL, Cvt_pic_t, 1 );
|
||
|
||
|
||
for(i=16;i < 26; i++ )
|
||
{
|
||
ammo[ i ] = ( pic_t * )W_CacheLumpNum( num++, PU_LEVEL, Cvt_pic_t, 1 );
|
||
}
|
||
|
||
|
||
oldplayerhealth = -1;
|
||
oldpercenthealth = -1;
|
||
}
|
||
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// GameMemToScreen()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void GameMemToScreen
|
||
(
|
||
pic_t *source,
|
||
int x,
|
||
int y,
|
||
int bufferofsonly
|
||
)
|
||
|
||
{
|
||
if ( bufferofsonly )
|
||
{
|
||
VL_MemToScreen( ( byte * )&source->data, source->width,
|
||
source->height, x, y );
|
||
}
|
||
else
|
||
{
|
||
GM_MemToScreen( ( byte * )&source->data, source->width,
|
||
source->height, x, y );
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DrawPlayScreen ()
|
||
//
|
||
//******************************************************************************
|
||
void DrawPlayScreen (boolean bufferofsonly)
|
||
|
||
{
|
||
pic_t *shape;
|
||
int shapenum;
|
||
int ShowKillsYoffset = 0;//bna++
|
||
|
||
//return;
|
||
|
||
if ( SHOW_TOP_STATUS_BAR() )
|
||
{
|
||
if (iGLOBAL_SCREENWIDTH == 640) {
|
||
//use this as dummy pic to fill out missing bar
|
||
shape = ( pic_t * ) W_CacheLumpName( "bottbar", PU_CACHE, Cvt_pic_t, 1 );
|
||
//GameMemToScreen( shape, 0, 0, bufferofsonly );
|
||
GameMemToScreen( shape, 320, 0, bufferofsonly );
|
||
// delete hart in middle of topbar
|
||
DrawPPic( 323,1, 8 >> 2, 16,
|
||
( byte * )&erase->data, 2, true, bufferofsonly );
|
||
// delete bullet in end of topbar
|
||
DrawPPic( 620,1, 8 >> 2, 16,
|
||
( byte * )&erase->data, 2, true, bufferofsonly );
|
||
shape = ( pic_t * )W_CacheLumpName( "stat_bar", PU_CACHE, Cvt_pic_t, 1 );
|
||
GameMemToScreen( shape, 0, 0, bufferofsonly );
|
||
}else if (iGLOBAL_SCREENWIDTH == 800) {
|
||
//use this as dummy pic to fill out missing bar
|
||
shape = ( pic_t * ) W_CacheLumpName( "bottbar", PU_CACHE, Cvt_pic_t, 1 );
|
||
GameMemToScreen( shape, 0, 0, bufferofsonly );
|
||
GameMemToScreen( shape, 260, 0, bufferofsonly );
|
||
GameMemToScreen( shape, 800-320, 0, bufferofsonly );
|
||
// delete hart in middle of topbar
|
||
DrawPPic( 480+3,1, 8 >> 2, 16,
|
||
( byte * )&erase->data, 2, true, bufferofsonly );
|
||
// delete bullet in end of topbar
|
||
DrawPPic( 780,1, 8 >> 2, 16,
|
||
( byte * )&erase->data, 2, true, bufferofsonly );
|
||
shape = ( pic_t * )W_CacheLumpName( "stat_bar", PU_CACHE, Cvt_pic_t, 1 );
|
||
GameMemToScreen( shape, 0, 0, bufferofsonly );
|
||
}else if (iGLOBAL_SCREENWIDTH == 320) {
|
||
|
||
//SetTextMode ( );
|
||
shape = ( pic_t * )W_CacheLumpName( "stat_bar", PU_CACHE, Cvt_pic_t, 1 );
|
||
GameMemToScreen( shape, 0, 0, bufferofsonly );
|
||
}
|
||
}
|
||
|
||
if ( BATTLEMODE )
|
||
{
|
||
DrawKills( bufferofsonly );
|
||
}
|
||
|
||
if ( SHOW_BOTTOM_STATUS_BAR() )
|
||
{
|
||
shape = ( pic_t * ) W_CacheLumpName( "bottbar", PU_CACHE, Cvt_pic_t, 1 );
|
||
|
||
if ( SHOW_KILLS() )
|
||
{
|
||
ShowKillsYoffset = KILLS_HEIGHT;
|
||
//shape = ( pic_t * )W_CacheLumpName( "backtile", PU_CACHE, Cvt_pic_t, 1 );
|
||
//DrawTiledRegion( 0, 584, iGLOBAL_SCREENWIDTH, 32-16, 0, 16, shape );//bna++
|
||
|
||
|
||
// health_y = iGLOBAL_HEALTH_Y;
|
||
// if ( SHOW_KILLS() )
|
||
// {
|
||
// health_y -= KILLS_HEIGHT;
|
||
//GameMemToScreen( shape, 0, (iGLOBAL_SCREENHEIGHT-40)+16, bufferofsonly );
|
||
|
||
//GameMemToScreen( shape, 0, 160, bufferofsonly );bna++
|
||
}
|
||
//else
|
||
{
|
||
|
||
if (iGLOBAL_SCREENWIDTH == 640) {
|
||
//bna fix - not to good? but no one has 286 any more
|
||
//statusbar dosent cover hole screen, because its a lump picture width max 320
|
||
//first write dummy shape and next over it
|
||
GameMemToScreen( shape, 320, (224*2)+16-ShowKillsYoffset, bufferofsonly );
|
||
//copy next shape to mem
|
||
GameMemToScreen( shape, 0, (224*2)+16-ShowKillsYoffset, bufferofsonly );
|
||
// delete bullet in middle of shape picture
|
||
DrawPPic( 310, (224*2)+17-ShowKillsYoffset, 8 >> 2, 16,
|
||
( byte * )&erase->data, 2, true, bufferofsonly );
|
||
// delete hart in middle of shape picture
|
||
DrawPPic( 324, (224*2)+17-ShowKillsYoffset, 8 >> 2, 16,
|
||
( byte * )&erase->data, 2, true, bufferofsonly );
|
||
|
||
}else if (iGLOBAL_SCREENWIDTH == 800) {
|
||
GameMemToScreen( shape, 800-320, 584-ShowKillsYoffset, bufferofsonly );
|
||
//copy next shape to mem
|
||
GameMemToScreen( shape, 300, 584-ShowKillsYoffset, bufferofsonly );
|
||
//copy next shape to mem
|
||
GameMemToScreen( shape, 0, 584-ShowKillsYoffset, bufferofsonly );
|
||
// delete 2 bullets in middle of shape picture
|
||
DrawPPic( 305, 584+1-ShowKillsYoffset, 8 >> 2, 16,
|
||
( byte * )&erase->data, 2, true, bufferofsonly );
|
||
// delete hart in middle of shape picture
|
||
DrawPPic( 610, 584+1-ShowKillsYoffset, 8 >> 2, 16,
|
||
( byte * )&erase->data, 2, true, bufferofsonly );
|
||
|
||
}else{
|
||
GameMemToScreen( shape, 0, 184, bufferofsonly );
|
||
}
|
||
}
|
||
|
||
DrawBarAmmo( bufferofsonly );
|
||
DrawBarHealth( bufferofsonly );
|
||
|
||
if ( demoplayback )
|
||
{
|
||
shape = ( pic_t * )W_CacheLumpName( "demo", PU_CACHE, Cvt_pic_t, 1 );
|
||
if (iGLOBAL_SCREENWIDTH == 640) {
|
||
//DrawPPic( 148, 185, shape->width, shape->height,
|
||
// ( byte * )&shape->data, 1, true, bufferofsonly );bna
|
||
DrawPPic( 148*2, 465, shape->width, shape->height,
|
||
( byte * )&shape->data, 1, true, bufferofsonly );
|
||
}else if (iGLOBAL_SCREENWIDTH == 800) {
|
||
DrawPPic( 380, 585, shape->width, shape->height,
|
||
( byte * )&shape->data, 1, true, bufferofsonly );
|
||
}else{
|
||
DrawPPic( 148, 185, shape->width, shape->height,
|
||
( byte * )&shape->data, 1, true, bufferofsonly );
|
||
}
|
||
}
|
||
}
|
||
|
||
if ( !SHOW_TOP_STATUS_BAR() )
|
||
{
|
||
return;
|
||
}
|
||
|
||
//draws small player picture and name in topbar
|
||
oldsec = -1;
|
||
|
||
DrawTime( bufferofsonly );
|
||
|
||
if ( !BATTLEMODE )
|
||
{
|
||
int character;
|
||
int width;
|
||
int height;
|
||
|
||
character = locplayerstate->player;
|
||
GameMemToScreen( men[ character ], MEN_X, MEN_Y,bufferofsonly );
|
||
|
||
CurrentFont = tinyfont;
|
||
|
||
// Draw player's name
|
||
DrawGameString ( MEN_X + 3, MEN_Y + 2, Names[ character ], bufferofsonly );
|
||
|
||
VW_MeasurePropString( LastNames[ character ], &width, &height );
|
||
|
||
DrawGameString ( MEN_X + 44 - width, MEN_Y + 8,
|
||
LastNames[ character ], bufferofsonly );
|
||
|
||
UpdateLives( locplayerstate->lives );
|
||
UpdateScore( gamestate.score );
|
||
DrawTriads( bufferofsonly );
|
||
DrawLives( bufferofsonly );
|
||
DrawScore( bufferofsonly );
|
||
}
|
||
|
||
DrawKeys( bufferofsonly );
|
||
|
||
if ( locplayerstate->poweruptime )
|
||
{
|
||
if ( player->flags & FL_GODMODE )
|
||
{
|
||
shapenum = powerpics;
|
||
}
|
||
else if ( player->flags & FL_DOGMODE )
|
||
{
|
||
shapenum = powerpics + 1;
|
||
}
|
||
else if ( player->flags & FL_FLEET )
|
||
{
|
||
shapenum = powerpics + 2;
|
||
}
|
||
else if ( player->flags & FL_ELASTO )
|
||
{
|
||
shapenum = powerpics + 3;
|
||
}
|
||
else if ( player->flags & FL_SHROOMS )
|
||
{
|
||
shapenum = powerpics + 4;
|
||
}
|
||
|
||
shape = ( pic_t * )W_CacheLumpNum ( shapenum, PU_CACHE, Cvt_pic_t, 1 );
|
||
|
||
GameMemToScreen( eraseb, POWERUP1X, POWERUPY, bufferofsonly );
|
||
|
||
DrawMPPic( POWERUP1X, POWERUPY + powerupheight, shape->width,
|
||
shape->height - powerupheight, powerupheight,
|
||
( byte * )&shape->data, bufferofsonly );
|
||
}
|
||
|
||
|
||
if ( locplayerstate->protectiontime )
|
||
{
|
||
if ( player->flags & FL_BPV )
|
||
{
|
||
shapenum = powerpics + 6;
|
||
}
|
||
else if ( player->flags & FL_GASMASK )
|
||
{
|
||
shapenum = powerpics + 5;
|
||
}
|
||
else if ( player->flags & FL_AV )
|
||
{
|
||
shapenum = powerpics + 7;
|
||
}
|
||
|
||
shape = ( pic_t * )W_CacheLumpNum( shapenum, PU_CACHE, Cvt_pic_t, 1 );
|
||
|
||
GameMemToScreen( eraseb, POWERUP2X, POWERUPY, bufferofsonly );
|
||
|
||
DrawMPPic( POWERUP2X, POWERUPY + protectionheight, shape->width,
|
||
shape->height - protectionheight, protectionheight,
|
||
( byte * )&shape->data, bufferofsonly );
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// ShortenCodeName()
|
||
//
|
||
//******************************************************************************
|
||
void GetShortCodeName
|
||
(
|
||
char *dest,
|
||
char *source,
|
||
int maxwidth
|
||
)
|
||
|
||
{
|
||
int width;
|
||
int height;
|
||
int length;
|
||
|
||
strcpy( dest, source );
|
||
|
||
// Shorten name to fit
|
||
length = strlen( dest );
|
||
VW_MeasurePropString( dest, &width, &height );
|
||
while( width > maxwidth )
|
||
{
|
||
dest[ length ] = 0;
|
||
length--;
|
||
VW_MeasurePropString( dest, &width, &height );
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DrawKills ()
|
||
//
|
||
//******************************************************************************
|
||
void DrawKills
|
||
(
|
||
boolean bufferofsonly
|
||
)
|
||
{
|
||
int rank;
|
||
int xpos;
|
||
char codename[ MAXCODENAMELENGTH ];
|
||
int width;
|
||
int playernum;
|
||
int playerimage;
|
||
int temp;
|
||
int iKILLS_Y;
|
||
pic_t *pic;
|
||
|
||
CurrentFont = tinyfont;
|
||
|
||
if ( SHOW_TOP_STATUS_BAR() )
|
||
{
|
||
playernum = BATTLE_Team[ consoleplayer ];
|
||
playerimage = BATTLE_TeamLeader[ playernum ];
|
||
|
||
// Set uniformcolor
|
||
playeruniformcolor = PLAYERSTATE[ playerimage ].uniformcolor;
|
||
|
||
// Draw player's point box
|
||
pic = men[ PLAYERSTATE[ playerimage ].player ];
|
||
if ( ( gamestate.ShowScores ) && ( BATTLE_Points[ playernum ] < 0 ) )
|
||
{
|
||
pic = menneg[ PLAYERSTATE[ playerimage ].player ];
|
||
}
|
||
|
||
DrawPPic( MEN_X, MEN_Y, pic->width, pic->height,
|
||
( byte * )&pic->data, 1, true, bufferofsonly );
|
||
|
||
// Draw player's name
|
||
if ( gamestate.teamplay )
|
||
{
|
||
GetShortCodeName( codename, colorname[ playeruniformcolor ],
|
||
42 );
|
||
}
|
||
else
|
||
{
|
||
GetShortCodeName( codename, PLAYERSTATE[ playerimage ].codename,
|
||
42 );
|
||
}
|
||
|
||
DrawGameString ( MEN_X + 2, MEN_Y + 2, codename, bufferofsonly );
|
||
// Draw "It" if player is 'it'
|
||
if ( ( ( gamestate.battlemode == battle_Tag ) ||
|
||
( gamestate.battlemode == battle_Hunter ) ) &&
|
||
( BATTLE_It == BATTLE_Team[ consoleplayer ] ) )
|
||
{
|
||
DrawGameString ( MEN_X + 22, MEN_Y + 8,
|
||
"It", bufferofsonly);
|
||
}
|
||
|
||
// Draw triad if player is 'it' or has caught a triad
|
||
if ( PLAYER[ consoleplayer ]->flags & FL_DESIGNATED )
|
||
{
|
||
pic = W_CacheLumpName( "smalltri", PU_CACHE, Cvt_pic_t, 1 );
|
||
DrawPPic( TRIAD_X - 1, TRIAD_Y - 2, pic->width, pic->height,
|
||
( byte * )&pic->data, 1, true, bufferofsonly );
|
||
}
|
||
else if ( ( gamestate.ShowScores ) &&
|
||
( DisplayPoints != bo_kills_infinite ) )
|
||
{
|
||
// Draw Kill goal
|
||
if ( ( gamestate.battlemode == battle_Collector ) ||
|
||
( gamestate.battlemode == battle_StandAloneGame ) )
|
||
{
|
||
temp = BATTLE_NumCollectorItems;
|
||
}
|
||
else
|
||
{
|
||
temp = DisplayPoints;
|
||
}
|
||
|
||
ltoa ( temp % 1000, KillStr.str, 10);
|
||
KillStr.length = strlen (KillStr.str);
|
||
DrawNumber (TRIAD_X - 6, TRIAD_Y, 3, 5, bufferofsonly);
|
||
}
|
||
|
||
// Set uniformcolor
|
||
playeruniformcolor = PLAYERSTATE[ consoleplayer ].uniformcolor;
|
||
|
||
if ( gamestate.ShowScores )
|
||
{
|
||
// Draw local player's points
|
||
temp = BATTLE_Points[ playernum ] % 1000;
|
||
if ( temp < 0 )
|
||
{
|
||
temp = -temp;
|
||
}
|
||
ltoa ( temp, KillStr.str, 10);
|
||
KillStr.length = strlen (KillStr.str);
|
||
|
||
DrawNumber( LIVES_X - 12, LIVES_Y, 3, 4, bufferofsonly);
|
||
}
|
||
else
|
||
{
|
||
pic = W_CacheLumpName( "minus", PU_CACHE, Cvt_pic_t, 1 );
|
||
StatusDrawColoredPic( LIVES_X - 12, LIVES_Y, pic, bufferofsonly, playeruniformcolor );
|
||
StatusDrawColoredPic( LIVES_X - 4, LIVES_Y, pic, bufferofsonly, playeruniformcolor );
|
||
}
|
||
|
||
// Draw whoever is 'It'
|
||
playernum = BATTLE_It;
|
||
playerimage = BATTLE_TeamLeader[ playernum ];
|
||
|
||
// Set uniformcolor
|
||
playeruniformcolor = PLAYERSTATE[ playerimage ].uniformcolor;
|
||
|
||
// Draw player's point box
|
||
pic = men[ PLAYERSTATE[ playerimage ].player ];
|
||
if ( ( gamestate.ShowScores ) && ( BATTLE_Points[ playernum ] < 0 ) )
|
||
{
|
||
pic = menneg[ PLAYERSTATE[ playerimage ].player ];
|
||
}
|
||
|
||
DrawPPic( LEADER_X, LEADER_Y, pic->width, pic->height,
|
||
(byte *)&pic->data, 1, true, bufferofsonly );
|
||
|
||
if ( ( gamestate.battlemode == battle_Tag ) ||
|
||
( gamestate.battlemode == battle_Hunter ) )
|
||
{
|
||
DrawGameString ( LEADER_X + 22, LEADER_Y + 8,
|
||
"It", bufferofsonly);
|
||
}
|
||
|
||
if ( gamestate.ShowScores )
|
||
{
|
||
// Draw number of points
|
||
temp = BATTLE_Points[ playernum ] % 1000;
|
||
if ( temp < 0 )
|
||
{
|
||
temp = -temp;
|
||
}
|
||
ltoa ( temp, KillStr.str, 10);
|
||
KillStr.length = strlen (KillStr.str);
|
||
DrawNumber ( LEADER_NUM_X, LEADER_NUM_Y, 3, 4, bufferofsonly);
|
||
}
|
||
else
|
||
{
|
||
pic = W_CacheLumpName( "minus", PU_CACHE, Cvt_pic_t, 1 );
|
||
StatusDrawColoredPic( LEADER_NUM_X, LEADER_NUM_Y, pic, bufferofsonly, playeruniformcolor );
|
||
StatusDrawColoredPic( LEADER_NUM_X + 8, LEADER_NUM_Y, pic, bufferofsonly, playeruniformcolor );
|
||
}
|
||
|
||
// Draw name
|
||
if ( gamestate.teamplay )
|
||
{
|
||
DrawGameString ( LEADER_NAME_X, LEADER_NAME_Y - 1,
|
||
colorname[ playeruniformcolor ], bufferofsonly);
|
||
}
|
||
else
|
||
{
|
||
GetShortCodeName( codename, PLAYERSTATE[ playerimage ].codename,
|
||
42 );
|
||
DrawGameString ( LEADER_NAME_X - 1, LEADER_NAME_Y,
|
||
codename, bufferofsonly);
|
||
}
|
||
}
|
||
|
||
// Only draw the rest of the rifraff when the kill count is selected
|
||
|
||
if ( !SHOW_KILLS() )
|
||
{
|
||
return;
|
||
}
|
||
// SetTextMode ( );
|
||
// Draw all the other losers
|
||
//#define KILLS_Y 176
|
||
iKILLS_Y = iGLOBAL_SCREENHEIGHT - 24;
|
||
//draw blank status pic->width = 8;pic->height = 24
|
||
pic = blankfragpic;
|
||
for (temp = iGLOBAL_SCREENWIDTH-pic->width-24;temp > pic->width; temp -= pic->width){
|
||
DrawPPic( temp, iKILLS_Y, pic->width, pic->height,
|
||
(byte *)&pic->data, 1, true, bufferofsonly );
|
||
|
||
}
|
||
|
||
xpos = KILLS_X;
|
||
for( rank = 0; rank < BATTLE_NumberOfTeams; rank++ )
|
||
{
|
||
playernum = BATTLE_PlayerOrder[ rank ];
|
||
playerimage = BATTLE_TeamLeader[ playernum ];
|
||
|
||
if ( ( playernum == BATTLE_It ) && SHOW_TOP_STATUS_BAR() )
|
||
{
|
||
continue;
|
||
}
|
||
|
||
// Set uniformcolor
|
||
playeruniformcolor = PLAYERSTATE[ playerimage ].uniformcolor;
|
||
|
||
// Draw player's point box
|
||
pic = fragpic[ PLAYERSTATE[ playerimage ].player ];
|
||
if ( gamestate.ShowScores )
|
||
{
|
||
if ( BATTLE_Points[ playernum ] < 0 )
|
||
{
|
||
pic = negfragpic[ PLAYERSTATE[ playerimage ].player ];
|
||
}
|
||
else if ( BATTLE_Points[ playernum ] >= 100 )
|
||
{
|
||
pic = frag100pic[ PLAYERSTATE[ playerimage ].player ];
|
||
}
|
||
}
|
||
DrawPPic( xpos, iKILLS_Y, pic->width, pic->height,
|
||
(byte *)&pic->data, 1, true, bufferofsonly );
|
||
|
||
// Draw number of points
|
||
if ( gamestate.ShowScores )
|
||
{
|
||
temp = BATTLE_Points[ playernum ] % 1000;
|
||
if ( temp < 0 )
|
||
{
|
||
temp = -temp;
|
||
}
|
||
ltoa ( temp, KillStr.str, 10);
|
||
KillStr.length = strlen (KillStr.str);
|
||
width = 2;
|
||
if ( temp > 99 )
|
||
{
|
||
width = 3;
|
||
}
|
||
DrawNumber( xpos + KILLS_OFFSET + 16 - ( 8 * width ), iKILLS_Y, width, 4, bufferofsonly);
|
||
}
|
||
else
|
||
{
|
||
pic = ( pic_t * )W_CacheLumpName( "minus", PU_CACHE, Cvt_pic_t, 1 );
|
||
StatusDrawColoredPic( ( xpos + KILLS_OFFSET ), iKILLS_Y, pic, bufferofsonly, playeruniformcolor );
|
||
StatusDrawColoredPic( ( xpos + KILLS_OFFSET + 8 ), iKILLS_Y, pic, bufferofsonly, playeruniformcolor );
|
||
}
|
||
|
||
// Get codename
|
||
if ( gamestate.teamplay )
|
||
{
|
||
GetShortCodeName( codename, colorname[ playeruniformcolor ],
|
||
KILLS_WIDTH - 2 );
|
||
}
|
||
else
|
||
{
|
||
GetShortCodeName( codename, PLAYERSTATE[ playerimage ].codename,
|
||
KILLS_WIDTH - 2 );
|
||
}
|
||
|
||
// Draw name
|
||
DrawGameString (xpos + 1, KILLS_NAME_Y, codename, bufferofsonly);
|
||
|
||
// Advance to next position
|
||
xpos += KILLS_WIDTH;
|
||
|
||
if ( xpos >= iGLOBAL_SCREENWIDTH )
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
|
||
for( rank = BATTLE_NumberOfTeams; rank <= MAXKILLBOXES; rank++ )
|
||
{
|
||
if ( xpos >= iGLOBAL_SCREENWIDTH )
|
||
{
|
||
break;
|
||
}
|
||
|
||
pic = blankfragpic;
|
||
DrawPPic( xpos, iKILLS_Y, pic->width, pic->height,
|
||
(byte *)&pic->data, 1, true, bufferofsonly );
|
||
|
||
// Advance to next position
|
||
xpos += KILLS_WIDTH;
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DrawPlayers ()
|
||
//
|
||
//******************************************************************************
|
||
void DrawPlayers
|
||
(
|
||
void
|
||
)
|
||
|
||
{
|
||
int num;
|
||
int xpos;
|
||
char codename[ MAXCODENAMELENGTH ];
|
||
int length;
|
||
int width;
|
||
int height;
|
||
int team;
|
||
int player;
|
||
int character;
|
||
pic_t *pic;
|
||
pic_t *enemy;
|
||
pic_t *friend;
|
||
|
||
num = W_GetNumForName( "botpic1" );
|
||
|
||
scorenums[ 0 ]= ( pic_t * )W_CacheLumpName( "kilnum0", PU_CACHE, Cvt_pic_t, 1 );
|
||
friend = ( pic_t * )W_CacheLumpName( "t_friend", PU_CACHE, Cvt_pic_t, 1 );
|
||
enemy = ( pic_t * )W_CacheLumpName( "t_enemy", PU_CACHE, Cvt_pic_t, 1 );
|
||
|
||
// Draw all the losers
|
||
CurrentFont = tinyfont;
|
||
|
||
xpos = (iGLOBAL_SCREENWIDTH - min( numplayers, MAXKILLBOXES ) * KILLS_WIDTH ) / 2;
|
||
//SetTextMode ( );//PLAYERSTATE
|
||
for( team = 0; team < BATTLE_NumberOfTeams; team++ )
|
||
{
|
||
for( player = 0; player < numplayers; player++ )
|
||
{
|
||
if ( BATTLE_Team[ player ] == team )
|
||
{
|
||
character = PLAYERSTATE[ player ].player;
|
||
|
||
fragpic[ character ] = ( pic_t * )W_CacheLumpNum( num +
|
||
character, PU_CACHE, Cvt_pic_t, 1 );
|
||
|
||
if ( ( numplayers <= MAXKILLBOXES ) ||
|
||
( player != consoleplayer ) )
|
||
{
|
||
// Set uniformcolor
|
||
playeruniformcolor = PLAYERSTATE[ player ].uniformcolor;
|
||
|
||
// Draw player's point box
|
||
pic = fragpic[ PLAYERSTATE[ player ].player ];
|
||
|
||
VWB_DrawPic ( xpos, PLAYERS_Y, pic );
|
||
if ( gamestate.teamplay )
|
||
{
|
||
if ( BATTLE_Team[ player ] == BATTLE_Team[ consoleplayer ] )
|
||
{
|
||
VWB_DrawPic ( xpos, PLAYERS_TEAM_Y, friend );
|
||
}
|
||
else
|
||
{
|
||
VWB_DrawPic ( xpos, PLAYERS_TEAM_Y, enemy );
|
||
}
|
||
}
|
||
|
||
strcpy( KillStr.str, "00" );
|
||
KillStr.length = strlen ( KillStr.str );
|
||
DrawNumber( xpos + KILLS_OFFSET, PLAYERS_Y, 2, 4, true );
|
||
|
||
// Get codename
|
||
strcpy( codename, PLAYERSTATE[ player ].codename );
|
||
|
||
// Shorten name to fit into point count
|
||
length = strlen( codename );
|
||
US_MeasureStr( &width, &height, "%s", codename );
|
||
while( width > KILLS_WIDTH )
|
||
{
|
||
codename[ length ] = 0;
|
||
length--;
|
||
US_MeasureStr( &width, &height, "%s", codename );
|
||
}
|
||
|
||
// Draw name
|
||
PrintX = xpos;
|
||
PrintY = PLAYERS_NAME_Y;
|
||
US_Print( codename );
|
||
|
||
// Advance to next position
|
||
xpos += KILLS_WIDTH;
|
||
}
|
||
}
|
||
if ( xpos >= iGLOBAL_SCREENWIDTH )
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
if ( xpos >= iGLOBAL_SCREENWIDTH )
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
//******************************************************************************
|
||
//
|
||
// StatusDrawPic ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void StatusDrawPic (unsigned x, unsigned y, pic_t *nums, boolean bufferofsonly)
|
||
{
|
||
DrawMPPic (x, y, nums->width, nums->height, 0,
|
||
(byte *)&nums->data, bufferofsonly);
|
||
}
|
||
|
||
//******************************************************************************
|
||
//
|
||
// StatusDrawColoredPic ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void StatusDrawColoredPic (unsigned x, unsigned y, pic_t *nums, boolean bufferofsonly, int color)
|
||
{
|
||
DrawColoredMPPic (x, y, nums->width, nums->height, 0,
|
||
(byte *)&nums->data, bufferofsonly, color);
|
||
}
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DrawGameString ()
|
||
//
|
||
// draw string to game screen at x,y
|
||
//
|
||
//******************************************************************************
|
||
|
||
void DrawGameString (int x, int y, const char * str, boolean bufferofsonly)
|
||
{
|
||
byte *tempbuf;
|
||
|
||
px=x;
|
||
py=y;
|
||
|
||
if (bufferofsonly==true)
|
||
VW_DrawPropString (str);
|
||
else
|
||
{
|
||
tempbuf=bufferofs;
|
||
bufferofs=page1start;
|
||
VW_DrawPropString (str);
|
||
#ifdef DOS
|
||
px=x;
|
||
py=y;
|
||
bufferofs=page2start;
|
||
VW_DrawPropString (str);
|
||
px=x;
|
||
py=y;
|
||
bufferofs=page3start;
|
||
VW_DrawPropString (str);
|
||
#endif
|
||
bufferofs=tempbuf;
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DrawNumber ()
|
||
//
|
||
// right justifies and pads with zeros
|
||
//
|
||
//******************************************************************************
|
||
|
||
void DrawNumber (int x, int y, int width, int which, boolean bufferofsonly)
|
||
{
|
||
unsigned length,c;
|
||
char *str;
|
||
byte z;
|
||
|
||
switch (which)
|
||
{
|
||
case 1:
|
||
str = ScoreStr.str;
|
||
length = ScoreStr.length;
|
||
break;
|
||
|
||
case 2:
|
||
str = LivesStr.str;
|
||
length = LivesStr.length;
|
||
break;
|
||
|
||
case 3:
|
||
str = TriadStr.str;
|
||
length = TriadStr.length;
|
||
break;
|
||
|
||
case 4:
|
||
case 5:
|
||
case 6:
|
||
str = KillStr.str;
|
||
length = KillStr.length;
|
||
break;
|
||
}
|
||
|
||
z = width - length; // Num zeros
|
||
|
||
while (z)
|
||
{
|
||
switch (which)
|
||
{
|
||
case 1: StatusDrawPic (x, y, scorenums[0], bufferofsonly); x+=8; break;
|
||
case 2: StatusDrawPic (x, y, lifenums[0], bufferofsonly); x+=8; break;
|
||
case 3: StatusDrawPic (x, y, lifeptnums[0], bufferofsonly); x+=6; break;
|
||
case 4: StatusDrawColoredPic (x, y, scorenums[0], bufferofsonly, playeruniformcolor); x+=8; break;
|
||
case 5: StatusDrawPic (x, y, lifeptnums[0], bufferofsonly); x+=6; break;
|
||
case 6: StatusDrawPic (x, y, lifenums[0], bufferofsonly); x+=8; break;
|
||
}
|
||
z--;
|
||
}
|
||
|
||
c = length <= (unsigned)width ? 0 : length-width;
|
||
while (c < length)
|
||
{
|
||
switch (which)
|
||
{
|
||
case 1: StatusDrawPic (x, y, scorenums[str[c]-'0'], bufferofsonly); x+=8; break;
|
||
case 2: StatusDrawPic (x, y, lifenums[str[c]-'0'], bufferofsonly); x+=8; break;
|
||
case 3: StatusDrawPic (x, y, lifeptnums[str[c]-'0'], bufferofsonly); x+=6; break;
|
||
case 4: StatusDrawColoredPic (x, y, scorenums[str[c]-'0'], bufferofsonly, playeruniformcolor); x+=8; break;
|
||
case 5: StatusDrawPic (x, y, lifeptnums[str[c]-'0'], bufferofsonly); x+=6; break;
|
||
case 6: StatusDrawPic (x, y, lifenums[str[c]-'0'], bufferofsonly); x+=8; break;
|
||
}
|
||
c++;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// HealPlayer ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void HealPlayer
|
||
(
|
||
int points,
|
||
objtype *ob
|
||
)
|
||
|
||
{
|
||
playertype *pstate;
|
||
int maxhitpoints;
|
||
|
||
M_LINKSTATE( ob, pstate );
|
||
|
||
pstate->health += points;
|
||
maxhitpoints = MaxHitpointsForCharacter( pstate );
|
||
if ( pstate->health > maxhitpoints )
|
||
{
|
||
pstate->health = maxhitpoints;
|
||
}
|
||
|
||
if ( ( SHOW_BOTTOM_STATUS_BAR() ) && ( ob == player ) )
|
||
{
|
||
DrawBarHealth( false );
|
||
}
|
||
}
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DrawLives ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void DrawLives
|
||
(
|
||
boolean bufferofsonly
|
||
)
|
||
|
||
{
|
||
if ( !SHOW_TOP_STATUS_BAR() )
|
||
{
|
||
return;
|
||
}
|
||
|
||
if ( !EndLevelStuff )
|
||
{
|
||
DrawNumber( LIVES_X, LIVES_Y, 2, 2, bufferofsonly );
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// GiveExtraMan ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void GiveExtraMan (void)
|
||
{
|
||
if (locplayerstate->lives < 99)
|
||
locplayerstate->lives++;
|
||
UpdateLives (locplayerstate->lives);
|
||
DrawLives (false);
|
||
// SD_PlaySound (BONUS1UPSND);
|
||
}
|
||
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DrawScore ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void DrawScore
|
||
(
|
||
boolean bufferofsonly
|
||
)
|
||
|
||
{
|
||
if ( !SHOW_TOP_STATUS_BAR() )
|
||
{
|
||
return;
|
||
}
|
||
|
||
if ( !BATTLEMODE )
|
||
{
|
||
DrawNumber( SCORE_X, SCORE_Y, 10, 1, bufferofsonly );
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// GivePoints ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void GivePoints (long points)
|
||
{
|
||
gamestate.score += points;
|
||
|
||
UpdateScore (gamestate.score);
|
||
|
||
if (!EndLevelStuff)
|
||
DrawScore (false);
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// GiveKey ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void GiveKey (int key)
|
||
{
|
||
locplayerstate->keys |= (1<<key);
|
||
DrawKeys (false);
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// GiveLives ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void GiveLives (int newlives)
|
||
{
|
||
if ((locplayerstate->lives + newlives) <= 99)
|
||
locplayerstate->lives += newlives;
|
||
else
|
||
locplayerstate->lives = 99;
|
||
UpdateLives (locplayerstate->lives);
|
||
DrawLives (false);
|
||
}
|
||
|
||
|
||
#define EnableOldWeapon(pstate) \
|
||
{ \
|
||
LASTSTAT->flags |= FL_ABP; \
|
||
LASTSTAT->flags &= ~FL_RESPAWN; \
|
||
MakeStatActive(LASTSTAT); \
|
||
pstate->weaponx = ob->tilex; \
|
||
pstate->weapony = ob->tiley; \
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// GiveWeapon ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void GiveWeapon
|
||
(
|
||
objtype *ob,
|
||
int weapon
|
||
)
|
||
|
||
{
|
||
playertype *pstate;
|
||
|
||
M_LINKSTATE( ob, pstate );
|
||
|
||
if ( pstate->weapon == weapon )
|
||
{
|
||
return;
|
||
}
|
||
|
||
pstate->HASBULLETWEAPON[ weapon ] = 1;
|
||
if ( ( pstate->weapon == pstate->bulletweapon ) &&
|
||
( pstate->weapon < weapon ) )
|
||
{
|
||
pstate->new_weapon = weapon;
|
||
pstate->weapondowntics = WEAPONS[ pstate->weapon ].screenheight / GMOVE;
|
||
if ( ( ob == player ) && ( SHOW_BOTTOM_STATUS_BAR() ) )
|
||
{
|
||
DrawBarAmmo( false );
|
||
}
|
||
}
|
||
|
||
if ( gamestate.BattleOptions.WeaponPersistence )
|
||
{
|
||
SpawnStatic(ob->tilex,ob->tiley,GetItemForWeapon(weapon),9);
|
||
EnableOldWeapon(pstate);
|
||
}
|
||
|
||
if ( weapon > pstate->bulletweapon )
|
||
{
|
||
pstate->bulletweapon = weapon;
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// GiveMissileWeapon ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void GiveMissileWeapon(objtype * ob, int which)
|
||
{
|
||
playertype * pstate;
|
||
|
||
|
||
//pstate = (ob==player)?(&playerstate):(&remoteplayerstate);
|
||
M_LINKSTATE(ob,pstate);
|
||
|
||
if (!gamestate.BattleOptions.WeaponPersistence)
|
||
{
|
||
if (pstate->ammo &&
|
||
(pstate->missileweapon != -1) &&
|
||
(!(WEAPON_IS_MAGICAL(which))) &&
|
||
(!(WEAPON_IS_MAGICAL(pstate->missileweapon)))
|
||
)
|
||
{
|
||
int nx,ny;
|
||
|
||
|
||
nx = ob->tilex;
|
||
ny = ob->tiley;
|
||
//FindEmptyTile(&nx,&ny);
|
||
|
||
if (IsPlatform(nx,ny))
|
||
SpawnStatic(nx,ny,GetItemForWeapon(pstate->missileweapon),9);
|
||
else
|
||
{
|
||
int newz = sprites[ob->tilex][ob->tiley]->z;
|
||
SpawnStatic(nx,ny,GetItemForWeapon(pstate->missileweapon),-1);
|
||
LASTSTAT->z = newz;
|
||
}
|
||
LASTSTAT->ammo = pstate->ammo;
|
||
EnableOldWeapon(pstate);
|
||
|
||
}
|
||
}
|
||
|
||
else if (!WEAPON_IS_MAGICAL(which))
|
||
{
|
||
int newz = sprites[ob->tilex][ob->tiley]->z;
|
||
SpawnStatic(ob->tilex,ob->tiley,GetItemForWeapon(which),9);
|
||
LASTSTAT->z = newz;
|
||
EnableOldWeapon(pstate);
|
||
|
||
}
|
||
pstate->new_weapon = pstate->missileweapon = which;
|
||
pstate->weapondowntics = WEAPONS[pstate->weapon].screenheight/GMOVE;
|
||
|
||
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DrawKeys ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void DrawKeys
|
||
(
|
||
boolean bufferofsonly
|
||
)
|
||
|
||
{
|
||
if ( !SHOW_TOP_STATUS_BAR() )
|
||
{
|
||
return;
|
||
}
|
||
|
||
if ( locplayerstate->keys & 1 )
|
||
{
|
||
GameMemToScreen( keys[ 0 ], KeyX[ 0 ], KEY_Y, bufferofsonly );
|
||
}
|
||
|
||
if ( locplayerstate->keys & 2 )
|
||
{
|
||
GameMemToScreen( keys[ 1 ], KeyX[ 1 ], KEY_Y, bufferofsonly );
|
||
}
|
||
|
||
if ( locplayerstate->keys & 4 )
|
||
{
|
||
GameMemToScreen( keys[ 2 ], KeyX[ 2 ], KEY_Y, bufferofsonly );
|
||
}
|
||
|
||
if ( locplayerstate->keys & 8 )
|
||
{
|
||
GameMemToScreen( keys[ 3 ], KeyX[ 3 ], KEY_Y, bufferofsonly );
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// StatusDrawTime ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void StatusDrawTime
|
||
(
|
||
unsigned x,
|
||
unsigned y,
|
||
unsigned num,
|
||
boolean bufferofsonly
|
||
)
|
||
|
||
{
|
||
DrawMPPic( x, y, timenums[ num ]->width, timenums[ num ]->height, 0,
|
||
( byte * )&timenums[ num ]->data, bufferofsonly );
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DrawTimeNumber ()
|
||
//
|
||
// right justifies and pads with blanks
|
||
//
|
||
//******************************************************************************
|
||
|
||
void DrawTimeNumber (int x, int y, int number, boolean seconds, boolean bufferofsonly)
|
||
{
|
||
char str[20];
|
||
|
||
ltoa (number,str,10);
|
||
|
||
if (seconds)
|
||
{
|
||
if (number < 10)
|
||
{
|
||
StatusDrawTime (x, y, 0, bufferofsonly);
|
||
StatusDrawTime (x+8, y, str[0]-'0', bufferofsonly);
|
||
}
|
||
else
|
||
{
|
||
StatusDrawTime (x, y, str[0]-'0', bufferofsonly);
|
||
StatusDrawTime (x+8, y, str[1]-'0', bufferofsonly);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if (number < 10)
|
||
StatusDrawTime (x+8, y, str[0]-'0', bufferofsonly);
|
||
else
|
||
{
|
||
StatusDrawTime (x, y, str[0]-'0', bufferofsonly);
|
||
StatusDrawTime (x+8, y, str[1]-'0', bufferofsonly);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DrawTimeXY ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void DrawTimeXY
|
||
(
|
||
int x,
|
||
int y,
|
||
int sec,
|
||
boolean bufferofsonly
|
||
)
|
||
|
||
{
|
||
int min;
|
||
int hour;
|
||
|
||
while (sec > ( ( 9 * 3600 ) + 3599 ) )
|
||
{
|
||
sec -= ( ( 9 * 3600 ) + 3599 );
|
||
}
|
||
|
||
hour = sec / 3600;
|
||
min = ( sec / 60 ) - ( hour * 60 );
|
||
sec %= 60;
|
||
|
||
DrawTimeNumber ( x + HOUR_X, y, hour, false, bufferofsonly );
|
||
DrawTimeNumber ( x + MIN_X, y, min, true, bufferofsonly );
|
||
DrawTimeNumber ( x + SEC_X, y, sec, true, bufferofsonly );
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DrawTime ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void DrawTime
|
||
(
|
||
boolean bufferofsonly
|
||
)
|
||
|
||
{
|
||
int sec;
|
||
|
||
if ( !SHOW_TOP_STATUS_BAR() )
|
||
{
|
||
return;
|
||
}
|
||
|
||
if (timelimitenabled == true)
|
||
{
|
||
sec = (timelimit-gamestate.TimeCount) / VBLCOUNTER;
|
||
}
|
||
else
|
||
{
|
||
sec = gamestate.TimeCount / VBLCOUNTER;
|
||
}
|
||
|
||
if ( oldsec != sec )
|
||
{
|
||
oldsec = sec;
|
||
DrawTimeXY( GAMETIME_X, GAMETIME_Y, sec, bufferofsonly) ;
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DrawMPPic ()
|
||
//
|
||
// Purpose
|
||
// Draws a masked, planer pic at xpos, ypos.
|
||
//
|
||
// Parms
|
||
// xpos - x position.
|
||
// ypos - y position.
|
||
// width - width of pic : should be << 2.
|
||
// height - height of pic.
|
||
// src - data to draw.
|
||
//
|
||
// Returns
|
||
// Nothing.
|
||
//
|
||
//******************************************************************************
|
||
|
||
void DrawMPPic (int xpos, int ypos, int width, int height, int heightmod, byte *src, boolean bufferofsonly)
|
||
{
|
||
int olddest;
|
||
int dest;
|
||
int x;
|
||
int y;
|
||
int planes;
|
||
byte mask;
|
||
byte pixel;
|
||
|
||
mask = 1 << (xpos&3);
|
||
|
||
#ifdef DOS
|
||
olddest = ylookup[ypos] + (xpos>>2);
|
||
#else
|
||
olddest = ylookup[ypos] + xpos;
|
||
#endif
|
||
|
||
for (planes = 0; planes < 4; planes++)
|
||
{
|
||
VGAMAPMASK (mask);
|
||
|
||
dest = olddest;
|
||
|
||
#ifndef DOS
|
||
dest += planes;
|
||
#endif
|
||
|
||
for (y = 0; y < height; y++)
|
||
{
|
||
for (x = 0; x < width; x++)
|
||
{
|
||
pixel = *src++;
|
||
|
||
if (pixel != 255)
|
||
{
|
||
if (bufferofsonly)
|
||
*(dest+bufferofs) = pixel;
|
||
else
|
||
{
|
||
*(dest+page1start) = pixel;
|
||
*(dest+page2start) = pixel;
|
||
*(dest+page3start) = pixel;
|
||
}
|
||
}
|
||
|
||
#ifdef DOS
|
||
dest++;
|
||
#else
|
||
dest += 4;
|
||
#endif
|
||
}
|
||
|
||
#ifdef DOS
|
||
dest += (linewidth-width);
|
||
#else
|
||
dest += (linewidth-width*4);
|
||
#endif
|
||
}
|
||
|
||
if (heightmod)
|
||
src += (heightmod*width);
|
||
|
||
#ifdef DOS
|
||
mask <<= 1;
|
||
if (mask == 16)
|
||
{
|
||
mask = 1;
|
||
olddest++;
|
||
}
|
||
#endif
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DrawColoredMPPic ()
|
||
//
|
||
// Purpose
|
||
// Draws a masked, planer pic at xpos, ypos.
|
||
//
|
||
// Parms
|
||
// xpos - x position.
|
||
// ypos - y position.
|
||
// width - width of pic : should be << 2.
|
||
// height - height of pic.
|
||
// src - data to draw.
|
||
//
|
||
// Returns
|
||
// Nothing.
|
||
//
|
||
//******************************************************************************
|
||
|
||
void DrawColoredMPPic (int xpos, int ypos, int width, int height, int heightmod, byte *src, boolean bufferofsonly, int color)
|
||
{
|
||
int olddest;
|
||
int dest;
|
||
int x;
|
||
int y;
|
||
int planes;
|
||
byte mask;
|
||
byte pixel;
|
||
byte * cmap;
|
||
|
||
cmap=playermaps[color]+(1<<12);
|
||
|
||
mask = 1 << (xpos&3);
|
||
|
||
#ifdef DOS
|
||
olddest = ylookup[ypos] + (xpos>>2);
|
||
#else
|
||
olddest = ylookup[ypos] + xpos;
|
||
#endif
|
||
|
||
for (planes = 0; planes < 4; planes++)
|
||
{
|
||
VGAMAPMASK (mask);
|
||
|
||
dest = olddest;
|
||
|
||
#ifndef DOS
|
||
dest += planes;
|
||
#endif
|
||
|
||
for (y = 0; y < height; y++)
|
||
{
|
||
for (x = 0; x < width; x++)
|
||
{
|
||
pixel = *src++;
|
||
|
||
pixel = *(cmap+pixel);
|
||
|
||
if (pixel != 255)
|
||
{
|
||
if (bufferofsonly)
|
||
*(dest+bufferofs) = pixel;
|
||
else
|
||
{
|
||
*(dest+page1start) = pixel;
|
||
*(dest+page2start) = pixel;
|
||
*(dest+page3start) = pixel;
|
||
}
|
||
}
|
||
|
||
#ifdef DOS
|
||
dest++;
|
||
#else
|
||
dest += 4;
|
||
#endif
|
||
}
|
||
|
||
#ifdef DOS
|
||
dest += (linewidth-width);
|
||
#else
|
||
dest += (linewidth-width*4);
|
||
#endif
|
||
}
|
||
|
||
if (heightmod)
|
||
src += (heightmod*width);
|
||
|
||
#ifdef DOS
|
||
mask <<= 1;
|
||
if (mask == 16)
|
||
{
|
||
mask = 1;
|
||
olddest++;
|
||
}
|
||
#endif
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// UpdateScore ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void UpdateScore (unsigned int num)
|
||
{
|
||
if (num > 999999999)
|
||
{
|
||
num = 999999999;
|
||
gamestate.score = 999999999;
|
||
}
|
||
|
||
ltoa (num, ScoreStr.str, 10);
|
||
ScoreStr.length = strlen (ScoreStr.str);
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// UpdateLives ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void UpdateLives (int num)
|
||
{
|
||
ltoa (num, LivesStr.str, 10);
|
||
LivesStr.length = strlen (LivesStr.str);
|
||
}
|
||
|
||
//****************************************************************************
|
||
//
|
||
// ClearTriads ()
|
||
//
|
||
//****************************************************************************
|
||
void ClearTriads (playertype * pstate)
|
||
{
|
||
pstate->triads = 0;
|
||
ltoa (pstate->triads, TriadStr.str, 10);
|
||
TriadStr.length = strlen (TriadStr.str);
|
||
}
|
||
|
||
//****************************************************************************
|
||
//
|
||
// UpdateTriads ()
|
||
//
|
||
//****************************************************************************
|
||
|
||
void UpdateTriads (objtype * ob, int num)
|
||
{
|
||
playertype * pstate;
|
||
|
||
M_LINKSTATE(ob,pstate);
|
||
|
||
pstate->triads += num;
|
||
|
||
if (pstate->triads >= 100)
|
||
{
|
||
GiveLives(1);
|
||
if (ob==player)
|
||
{
|
||
AddMessage("100 Life Item Points! Extra Life!",MSG_BONUS);
|
||
SD_PlaySoundRTP (SD_GET1UPSND, player->x, player->y);
|
||
}
|
||
pstate->triads -= 100;
|
||
}
|
||
|
||
if (ob==player)
|
||
{
|
||
ltoa (pstate->triads, TriadStr.str, 10);
|
||
TriadStr.length = strlen (TriadStr.str);
|
||
}
|
||
}
|
||
|
||
//****************************************************************************
|
||
//
|
||
// DrawTriads ()
|
||
//
|
||
//****************************************************************************
|
||
|
||
void DrawTriads
|
||
(
|
||
boolean bufferofsonly
|
||
)
|
||
|
||
{
|
||
if ( !SHOW_TOP_STATUS_BAR() )
|
||
{
|
||
return;
|
||
}
|
||
|
||
if ( !EndLevelStuff )
|
||
{
|
||
DrawNumber( TRIAD_X, TRIAD_Y, 2, 3, bufferofsonly );
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DrawPPic ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void DrawPPic (int xpos, int ypos, int width, int height, byte *src, int num, boolean up, boolean bufferofsonly)
|
||
{
|
||
int olddest;
|
||
int dest;
|
||
int x;
|
||
int y;
|
||
int planes;
|
||
byte mask;
|
||
byte pixel;
|
||
int k;
|
||
int amt;
|
||
|
||
#ifdef DOS
|
||
if (up)
|
||
amt = 2;
|
||
else
|
||
amt = -2;
|
||
#else
|
||
if (up)
|
||
amt = 8;
|
||
else
|
||
amt = -8;
|
||
#endif
|
||
|
||
mask = 1;
|
||
|
||
#ifdef DOS
|
||
olddest = ylookup[ypos] + (xpos>>2);
|
||
#else
|
||
olddest = ylookup[ypos] + xpos;
|
||
#endif
|
||
|
||
for (planes = 0; planes < 4; planes++)
|
||
{
|
||
VGAMAPMASK (mask);
|
||
|
||
dest = olddest;
|
||
|
||
#ifndef DOS
|
||
dest += planes;
|
||
#endif
|
||
|
||
for (y = 0; y < height; y++)
|
||
{
|
||
for (x = 0; x < width; x++)
|
||
{
|
||
pixel = *src++;
|
||
|
||
if (pixel != 255)
|
||
{
|
||
for (k = 0; k < num; k++)
|
||
{
|
||
if (bufferofsonly)
|
||
*(dest+bufferofs+(amt*k)) = pixel;
|
||
else
|
||
{
|
||
*(dest+page1start+(amt*k)) = pixel;
|
||
*(dest+page2start+(amt*k)) = pixel;
|
||
*(dest+page3start+(amt*k)) = pixel;
|
||
}
|
||
}
|
||
}
|
||
|
||
#ifdef DOS
|
||
dest++;
|
||
#else
|
||
dest += 4;
|
||
#endif
|
||
}
|
||
|
||
#ifdef DOS
|
||
dest += (linewidth-width);
|
||
#else
|
||
dest += (linewidth-width*4);
|
||
#endif
|
||
}
|
||
|
||
mask <<= 1;
|
||
}
|
||
}
|
||
|
||
|
||
//****************************************************************************
|
||
//
|
||
// DrawBarHealth ()
|
||
//
|
||
//****************************************************************************
|
||
|
||
void DrawBarHealth
|
||
(
|
||
boolean bufferofsonly
|
||
)
|
||
|
||
{
|
||
int percenthealth;
|
||
int health_y;
|
||
|
||
if ( !SHOW_BOTTOM_STATUS_BAR() )
|
||
{
|
||
return;
|
||
}
|
||
|
||
health_y = iGLOBAL_HEALTH_Y;
|
||
if ( SHOW_KILLS() )
|
||
{
|
||
health_y -= KILLS_HEIGHT;
|
||
}
|
||
|
||
percenthealth = ( locplayerstate->health * 10 ) /
|
||
MaxHitpointsForCharacter( locplayerstate );
|
||
|
||
oldpercenthealth = percenthealth + 1;
|
||
|
||
if ( playstate == ex_died )
|
||
{
|
||
DrawPPic( iGLOBAL_HEALTH_X, health_y, 8 >> 2, 16, ( byte * )&erase->data,
|
||
10, true, bufferofsonly );
|
||
|
||
return;
|
||
}
|
||
|
||
if ( locplayerstate->health <= 0 )
|
||
{
|
||
oldpercenthealth = 0;
|
||
}
|
||
|
||
if ( oldpercenthealth >= 11 )
|
||
{
|
||
oldpercenthealth = 10;
|
||
}
|
||
|
||
if ( oldpercenthealth < 4 )
|
||
{
|
||
DrawPPic( iGLOBAL_HEALTH_X, health_y, 8 >> 2, 16,
|
||
( byte * )&health[ 0 ]->data, oldpercenthealth,
|
||
true, bufferofsonly );
|
||
}
|
||
else if ( oldpercenthealth < 5 )
|
||
{
|
||
DrawPPic( iGLOBAL_HEALTH_X, health_y, 8 >> 2, 16,
|
||
(byte *)&health[ 1 ]->data, oldpercenthealth,
|
||
true, bufferofsonly );
|
||
}
|
||
else
|
||
{
|
||
DrawPPic( iGLOBAL_HEALTH_X, health_y, 8 >> 2, 16,
|
||
( byte * )&health[ 2 ]->data, oldpercenthealth,
|
||
true, bufferofsonly );
|
||
}
|
||
|
||
if ( oldpercenthealth < 10 )
|
||
{
|
||
DrawPPic( iGLOBAL_HEALTH_X + ( 8 * oldpercenthealth ), health_y,
|
||
8 >> 2, 16, ( byte * )&erase->data, 10 - oldpercenthealth,
|
||
true, bufferofsonly );
|
||
}
|
||
}
|
||
|
||
|
||
//****************************************************************************
|
||
//
|
||
// DrawBarAmmo ()
|
||
//
|
||
//****************************************************************************
|
||
|
||
void DrawBarAmmo
|
||
(
|
||
boolean bufferofsonly
|
||
)
|
||
|
||
{
|
||
int ammo_y;
|
||
|
||
if ( ( !SHOW_BOTTOM_STATUS_BAR() ) || ( playstate == ex_died ) )
|
||
{
|
||
return;
|
||
}
|
||
|
||
ammo_y = iGLOBAL_AMMO_Y;
|
||
if ( SHOW_KILLS() )
|
||
{
|
||
ammo_y -= KILLS_HEIGHT;
|
||
}
|
||
|
||
DrawPPic ( iGLOBAL_AMMO_X, ammo_y + 1, 8 >> 2, 16, ( byte * )&erase->data,
|
||
10, false, bufferofsonly );
|
||
|
||
if ( !ARMED( player->dirchoosetime ) )
|
||
{
|
||
return;
|
||
}
|
||
if ((locplayerstate->new_weapon < wp_bazooka) ||
|
||
(locplayerstate->new_weapon == wp_godhand) ||
|
||
( gamestate.BattleOptions.Ammo == bo_infinite_shots )
|
||
)
|
||
{
|
||
DrawPPic( iGLOBAL_AMMO_X - 16, ammo_y, 24 >> 2, 16,
|
||
( byte * )&ammo[ 0 ]->data, 1, true, bufferofsonly);
|
||
|
||
DrawPPic( iGLOBAL_AMMO_X - 32, ammo_y + 1, 8 >> 2, 16,
|
||
( byte * )&erase->data, 2, true, bufferofsonly );
|
||
}
|
||
#if (SHAREWARE == 0)
|
||
else if ( locplayerstate->new_weapon == wp_dog )
|
||
{
|
||
DrawPPic( iGLOBAL_AMMO_X - 16, ammo_y, 24 >> 2, 16,
|
||
( byte * )&ammo[12]->data, 1, true, bufferofsonly );
|
||
|
||
DrawPPic( iGLOBAL_AMMO_X - 32, ammo_y + 1, 8 >> 2, 16,
|
||
( byte * )&erase->data, 2, true, bufferofsonly );
|
||
}
|
||
#endif
|
||
else
|
||
{
|
||
DrawPPic( iGLOBAL_AMMO_X, ammo_y + 1, 8 >> 2, 16,
|
||
( byte * )&ammo[ locplayerstate->new_weapon]->data,
|
||
locplayerstate->ammo, false, bufferofsonly );
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// SingleDrawPPic ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void SingleDrawPPic (int xpos, int ypos, int width, int height, byte *src, int num, boolean up)
|
||
{
|
||
byte *olddest;
|
||
byte *dest;
|
||
int x;
|
||
int y;
|
||
int planes;
|
||
byte mask;
|
||
byte pixel;
|
||
int k;
|
||
int amt;
|
||
|
||
#ifdef DOS
|
||
if (up)
|
||
amt = 2;
|
||
else
|
||
amt = -2;
|
||
#else
|
||
if (up)
|
||
amt = 8;
|
||
else
|
||
amt = -8;
|
||
#endif
|
||
|
||
mask = 1;
|
||
|
||
#ifdef DOS
|
||
olddest = (byte *)(bufferofs - screenofs + ylookup[ypos] + (xpos>>2));
|
||
#else
|
||
olddest = (byte *)(bufferofs - screenofs + ylookup[ypos] + xpos);
|
||
#endif
|
||
|
||
for (planes = 0; planes < 4; planes++)
|
||
{
|
||
VGAMAPMASK (mask);
|
||
|
||
dest = olddest;
|
||
|
||
#ifndef DOS
|
||
dest += planes;
|
||
#endif
|
||
|
||
for (y = 0; y < height; y++)
|
||
{
|
||
for (x = 0; x < width; x++)
|
||
{
|
||
pixel = *src++;
|
||
|
||
if (pixel != 255)
|
||
{
|
||
for (k = 0; k < num; k++)
|
||
{
|
||
*(dest+(amt*k)) = pixel;
|
||
}
|
||
}
|
||
|
||
#ifdef DOS
|
||
dest++;
|
||
#else
|
||
dest += 4;
|
||
#endif
|
||
}
|
||
|
||
#ifdef DOS
|
||
dest += (linewidth-width);
|
||
#else
|
||
dest += (linewidth-width*4);
|
||
#endif
|
||
}
|
||
|
||
mask <<= 1;
|
||
}
|
||
}
|
||
|
||
|
||
|
||
//****************************************************************************
|
||
//
|
||
// DrawStats ()
|
||
//
|
||
//****************************************************************************
|
||
|
||
void DrawStats
|
||
(
|
||
void
|
||
)
|
||
|
||
{
|
||
int percenthealth;
|
||
int health_y;
|
||
int ammo_y;
|
||
|
||
if ( ( !SHOW_PLAYER_STATS() ) || ( playstate == ex_died ) ||
|
||
( locplayerstate->health <= 0 ) )
|
||
{
|
||
return;
|
||
}
|
||
|
||
// Uncomment this if we want transparent health only on sizes < 16
|
||
// if ( viewsize < 16 )
|
||
// {
|
||
// pic_t *shape;
|
||
//
|
||
// shape = W_CacheLumpName( "backtile", PU_CACHE );
|
||
// DrawTiledRegion( 0, 160, 320, 24, shape );
|
||
// }
|
||
|
||
health_y = iGLOBAL_HEALTH_Y;
|
||
ammo_y = iGLOBAL_AMMO_Y;
|
||
|
||
if ( SHOW_KILLS() )
|
||
{
|
||
health_y -= KILLS_HEIGHT;
|
||
ammo_y -= KILLS_HEIGHT;
|
||
}
|
||
|
||
if ( oldplayerhealth != locplayerstate->health )
|
||
{
|
||
oldplayerhealth = locplayerstate->health;
|
||
|
||
percenthealth = ( locplayerstate->health * 10 ) /
|
||
MaxHitpointsForCharacter( locplayerstate );
|
||
|
||
oldpercenthealth = percenthealth + 1;
|
||
}
|
||
|
||
if ( oldpercenthealth > 10 )
|
||
{
|
||
oldpercenthealth = 10;
|
||
}
|
||
|
||
if ( oldpercenthealth < 4 )
|
||
{
|
||
SingleDrawPPic( iGLOBAL_HEALTH_X - 16, health_y, 8 >> 2, 16,
|
||
( byte * )&health[ 3 ]->data, oldpercenthealth, true);
|
||
}
|
||
else if ( oldpercenthealth < 5 )
|
||
{
|
||
SingleDrawPPic( iGLOBAL_HEALTH_X - 16, health_y, 8 >> 2, 16,
|
||
( byte * )&health[ 4 ]->data, oldpercenthealth, true );
|
||
}
|
||
else
|
||
{
|
||
SingleDrawPPic( iGLOBAL_HEALTH_X - 16, health_y, 8 >> 2, 16,
|
||
( byte * )&health[ 5 ]->data, oldpercenthealth, true );
|
||
}
|
||
|
||
if ( ARMED( consoleplayer ) )
|
||
{
|
||
if ((locplayerstate->new_weapon < wp_bazooka) ||
|
||
(locplayerstate->new_weapon == wp_godhand) ||
|
||
(gamestate.BattleOptions.Ammo == bo_infinite_shots )
|
||
)
|
||
|
||
{
|
||
SingleDrawPPic( iGLOBAL_AMMO_X - 16, ammo_y, 24 >> 2, 16,
|
||
( byte * )&ammo[13]->data, 1, true );
|
||
}
|
||
#if (SHAREWARE == 0)
|
||
else if ( locplayerstate->new_weapon == wp_dog )
|
||
{
|
||
SingleDrawPPic( iGLOBAL_AMMO_X - 16, ammo_y + 1, 24 >> 2, 16,
|
||
( byte * )&ammo[25]->data, 1, true );
|
||
}
|
||
#endif
|
||
else
|
||
{
|
||
SingleDrawPPic( iGLOBAL_AMMO_X, ammo_y + 1, 8 >> 2, 16,
|
||
( byte * )&ammo[13 + locplayerstate->new_weapon]->data,
|
||
locplayerstate->ammo, false );
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
//****************************************************************************
|
||
//
|
||
// DrawPauseXY ()
|
||
//
|
||
//****************************************************************************
|
||
|
||
void DrawPauseXY (int x, int y)
|
||
{
|
||
pic_t *p;
|
||
byte *buftmp;
|
||
|
||
buftmp = bufferofs;
|
||
|
||
if (GamePaused == true)
|
||
{
|
||
p = (pic_t *) W_CacheLumpNum (W_GetNumForName ("paused"), PU_CACHE, Cvt_pic_t, 1);
|
||
VL_MemToScreen ((byte *)&p->data, p->width, p->height,x, y);
|
||
//VWB_DrawPic (x, y, p);
|
||
bufferofs = buftmp;
|
||
DrawEpisodeLevel (x,y);
|
||
//VL_MemToScreen ((byte *)&p->data, p->width, p->height,x, y);
|
||
|
||
}
|
||
else
|
||
{
|
||
p = (pic_t *) W_CacheLumpNum (W_GetNumForName ("wait"), PU_CACHE, Cvt_pic_t, 1);
|
||
VL_MemToScreen ((byte *)&p->data, p->width, p->height,x, y);
|
||
//VWB_DrawPic (x, y, p);
|
||
}
|
||
bufferofs = buftmp;
|
||
}
|
||
|
||
//****************************************************************************
|
||
//
|
||
// DrawPause ()
|
||
//
|
||
//****************************************************************************
|
||
|
||
void DrawPause (void)
|
||
{
|
||
pic_t *p;
|
||
byte *bufftemp = bufferofs;
|
||
|
||
bufferofs -= screenofs;
|
||
|
||
if (GamePaused == true)
|
||
{
|
||
bufferofs = bufftemp;
|
||
p = (pic_t *) W_CacheLumpNum (W_GetNumForName ("paused"), PU_CACHE, Cvt_pic_t, 1);
|
||
DrawPauseXY( (iGLOBAL_SCREENWIDTH-(p->width<<2) ) >>1, (iGLOBAL_SCREENHEIGHT-p->height)>>1);//bna++
|
||
//DrawPauseXY( (320-(p->width<<2) ) >>1, (200-p->height)>>1);
|
||
/*
|
||
//buf = (byte *) SafeMalloc (64000);
|
||
w = p->width;
|
||
h = p->height;
|
||
x = (iGLOBAL_SCREENWIDTH-((p->width)<<2) ) >>1;
|
||
y = (iGLOBAL_SCREENHEIGHT-(p->height))>>1;
|
||
|
||
x1 = (iGLOBAL_SCREENWIDTH-((p->width*2)<<2) ) >>1;
|
||
y1 = (iGLOBAL_SCREENHEIGHT-(p->height*2))>>1;
|
||
|
||
source = bufferofs + (iGLOBAL_SCREENWIDTH*y)+x;
|
||
target = bufferofs + (iGLOBAL_SCREENWIDTH*y1)+x1;
|
||
|
||
// memcpy(tmpPICbuf,bufftemp,iGLOBAL_SCREENWIDTH*iGLOBAL_SCREENHEIGHT);
|
||
|
||
bufferofs = bufftemp;//(byte *)tmpPICbuf;//buf;//write picture in tmpbuf
|
||
VL_MemToScreen ((byte *)&p->data, p->width, p->height,x, y);
|
||
bufferofs = bufftemp;
|
||
DrawEpisodeLevel (x,y);
|
||
|
||
|
||
//VL_MemStrechedToScreen ((byte *)&p->data, p->width, p->height,(iGLOBAL_SCREENWIDTH-((p->width*2)<<2) ) >>1, (iGLOBAL_SCREENHEIGHT-(p->height*2))>>1);
|
||
//DrawEpisodeLevel (x,y);
|
||
|
||
//VL_MemToScreen ((byte *)&p->data, p->width, p->height,0, 0);
|
||
//bufferofs = bufftemp;//move ptr back
|
||
//write it back to bufferofs while streching
|
||
|
||
//buf = bufftemp;
|
||
//b = tmpPICbuf ;
|
||
|
||
source = bufferofs + (iGLOBAL_SCREENWIDTH*y)+x+(w*4);
|
||
target = bufferofs + (iGLOBAL_SCREENWIDTH*y1)+x+(2*w*4);
|
||
|
||
//first strech lines in x direction
|
||
for (y=0;y<h;y++){
|
||
c=target;t2=source;
|
||
for (x=0;x<w*4;x++){
|
||
*target-- = *source;
|
||
*target-- = *source--;
|
||
}
|
||
target=c;source=t2;
|
||
target += iGLOBAL_SCREENWIDTH;
|
||
source += iGLOBAL_SCREENWIDTH;
|
||
}
|
||
//strech then lines in y direction
|
||
source -= ((iGLOBAL_SCREENWIDTH*(y/2))+(w*4));//bufferofs + (iGLOBAL_SCREENWIDTH*y)+x+(iGLOBAL_SCREENWIDTH*(y));
|
||
target = (source+(iGLOBAL_SCREENWIDTH*(y))+1);//bufferofs + (iGLOBAL_SCREENWIDTH*y)+x+(iGLOBAL_SCREENWIDTH*(y1));
|
||
|
||
for (y=0;y<h;y++){
|
||
memcpy(target,source,(w*4*2));
|
||
memcpy(target+iGLOBAL_SCREENWIDTH,source,(w*4*2));
|
||
|
||
target -= iGLOBAL_SCREENWIDTH*2;
|
||
source -= iGLOBAL_SCREENWIDTH;
|
||
}
|
||
|
||
/ *
|
||
for (y=0;y<h;y++){
|
||
c=target;t2=source;
|
||
for (x=0;x<w*4;x++){
|
||
*target = *source;
|
||
*(target+++iGLOBAL_SCREENWIDTH) = *source;
|
||
*target = *source;
|
||
*(target+++iGLOBAL_SCREENWIDTH) = *source;
|
||
source++;
|
||
}
|
||
target=c;source=t2;
|
||
target += iGLOBAL_SCREENWIDTH*2;
|
||
source += iGLOBAL_SCREENWIDTH;
|
||
}
|
||
*/
|
||
|
||
// memcpy( bufftemp,tmpPICbuf,iGLOBAL_SCREENWIDTH*iGLOBAL_SCREENHEIGHT);
|
||
|
||
}
|
||
else
|
||
{
|
||
p = (pic_t *) W_CacheLumpNum (W_GetNumForName ("wait"), PU_CACHE, Cvt_pic_t, 1);
|
||
DrawPauseXY( (iGLOBAL_SCREENWIDTH-(p->width<<2) ) >>1, (iGLOBAL_SCREENHEIGHT-p->height)>>1);//bna++
|
||
//DrawPauseXY( (320-(p->width<<2) ) >>1, (200-p->height)>>1);
|
||
}
|
||
// VH_UpdateScreen () ;
|
||
|
||
bufferofs = bufftemp;
|
||
}
|
||
|
||
//****************************************************************************
|
||
//
|
||
// GM_DrawBonus ()
|
||
//
|
||
//****************************************************************************
|
||
|
||
void GM_DrawBonus
|
||
(
|
||
int which
|
||
)
|
||
|
||
{
|
||
int x;
|
||
|
||
if ( which < stat_gasmask )
|
||
{
|
||
x = POWERUP1X;
|
||
poweruptime = GetBonusTimeForItem(which);
|
||
poweradjust = (poweruptime >> 4);
|
||
powerupheight = 0;
|
||
GM_UpdateBonus(poweruptime-poweradjust - 1,true);
|
||
|
||
}
|
||
else
|
||
{
|
||
x = POWERUP2X;
|
||
protectiontime = GetBonusTimeForItem(which);
|
||
poweradjust = (protectiontime >> 4);
|
||
protectionheight = 0;
|
||
GM_UpdateBonus(protectiontime-poweradjust-1,false);
|
||
|
||
}
|
||
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// GM_UpdateBonus ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void GM_UpdateBonus
|
||
(
|
||
int time,
|
||
int powerup
|
||
)
|
||
|
||
{
|
||
pic_t *shape;
|
||
int shapenum;
|
||
|
||
if ( powerup )
|
||
{
|
||
if ( time < ( poweruptime - poweradjust ) )
|
||
{
|
||
powerupheight++;
|
||
if ( !SHOW_TOP_STATUS_BAR() )
|
||
{
|
||
poweruptime = time;
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if ( time < ( protectiontime - poweradjust ) )
|
||
{
|
||
protectionheight++;
|
||
if ( !SHOW_TOP_STATUS_BAR() )
|
||
{
|
||
protectiontime = time;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
if ( !SHOW_TOP_STATUS_BAR() )
|
||
{
|
||
return;
|
||
}
|
||
|
||
if ( !time )
|
||
{
|
||
if ( powerup == 1 )
|
||
{
|
||
shapenum = POWERUP1X;
|
||
}
|
||
else
|
||
{
|
||
shapenum = POWERUP2X;
|
||
}
|
||
|
||
GM_MemToScreen( ( byte * )&eraseb->data, eraseb->width,
|
||
eraseb->height, shapenum, POWERUPY );
|
||
|
||
return;
|
||
}
|
||
|
||
if ( powerup )
|
||
{
|
||
if ( time < ( poweruptime - poweradjust ) )
|
||
{
|
||
if ( player->flags & FL_GODMODE )
|
||
{
|
||
shapenum = powerpics;
|
||
}
|
||
else if ( player->flags & FL_DOGMODE )
|
||
{
|
||
shapenum = powerpics + 1;
|
||
}
|
||
else if ( player->flags & FL_FLEET )
|
||
{
|
||
shapenum = powerpics + 2;
|
||
}
|
||
else if ( player->flags & FL_ELASTO )
|
||
{
|
||
shapenum = powerpics + 3;
|
||
}
|
||
else if ( player->flags & FL_SHROOMS )
|
||
{
|
||
shapenum = powerpics + 4;
|
||
}
|
||
else
|
||
{
|
||
GM_MemToScreen( ( byte * )&eraseb->data,
|
||
eraseb->width, eraseb->height, POWERUP1X, POWERUPY );
|
||
|
||
return;
|
||
}
|
||
|
||
poweruptime = time;
|
||
|
||
shape = ( pic_t * )W_CacheLumpNum( shapenum, PU_CACHE, Cvt_pic_t, 1 );
|
||
|
||
GM_MemToScreen( ( byte * )&eraseb->data, eraseb->width,
|
||
eraseb->height, POWERUP1X, POWERUPY );
|
||
|
||
DrawMPPic( POWERUP1X, POWERUPY + powerupheight, shape->width,
|
||
shape->height - powerupheight, powerupheight,
|
||
( byte * )&shape->data, false );
|
||
}
|
||
}
|
||
else
|
||
{
|
||
if ( time < ( protectiontime - poweradjust ) )
|
||
{
|
||
if ( player->flags & FL_BPV )
|
||
{
|
||
shapenum = powerpics + 6;
|
||
}
|
||
else if ( player->flags & FL_GASMASK )
|
||
{
|
||
shapenum = powerpics + 5;
|
||
}
|
||
else if ( player->flags & FL_AV )
|
||
{
|
||
shapenum = powerpics + 7;
|
||
}
|
||
|
||
protectiontime = time;
|
||
|
||
shape = ( pic_t * )W_CacheLumpNum( shapenum, PU_CACHE, Cvt_pic_t, 1 );
|
||
|
||
GM_MemToScreen( ( byte * )&eraseb->data, eraseb->width,
|
||
eraseb->height, POWERUP2X, POWERUPY );
|
||
|
||
DrawMPPic( POWERUP2X, POWERUPY + protectionheight,
|
||
shape->width, shape->height - protectionheight,
|
||
protectionheight, ( byte * )&shape->data, false );
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// Drawpic ()
|
||
//
|
||
// Purpose
|
||
// Draws a masked, planer pic at xpos, ypos.
|
||
//
|
||
// Parms
|
||
// xpos - x position.
|
||
// ypos - y position.
|
||
// width - width of pic : should be << 2.
|
||
// height - height of pic.
|
||
// src - data to draw.
|
||
//
|
||
// Returns
|
||
// Nothing.
|
||
//
|
||
//******************************************************************************
|
||
|
||
void Drawpic (int xpos, int ypos, int width, int height, byte *src)
|
||
{
|
||
byte *olddest;
|
||
byte *dest;
|
||
int x;
|
||
int y;
|
||
int planes;
|
||
byte mask;
|
||
byte pixel;
|
||
|
||
|
||
mask = 1 << (xpos&3);
|
||
|
||
#ifdef DOS
|
||
olddest = (byte *)(bufferofs + ylookup[ypos] + (xpos>>2));
|
||
#else
|
||
olddest = (byte *)(bufferofs + ylookup[ypos] + xpos);
|
||
#endif
|
||
for (planes = 0; planes < 4; planes++)
|
||
{
|
||
VGAMAPMASK (mask);
|
||
|
||
dest = olddest;
|
||
|
||
#ifdef DOS
|
||
dest += planes;
|
||
#endif
|
||
|
||
for (y = 0; y < height; y++)
|
||
{
|
||
for (x = 0; x < width; x++)
|
||
{
|
||
pixel = *src++;
|
||
|
||
if (pixel != 255)
|
||
*(dest) = pixel;
|
||
|
||
#ifdef DOS
|
||
dest++;
|
||
#else
|
||
dest += 4;
|
||
#endif
|
||
}
|
||
|
||
#ifdef DOS
|
||
dest += (linewidth-width);
|
||
#else
|
||
dest += (linewidth-width*4);
|
||
#endif
|
||
}
|
||
|
||
#ifdef DOS
|
||
mask <<= 1;
|
||
if (mask == 16)
|
||
{
|
||
mask = 1;
|
||
olddest++;
|
||
}
|
||
#endif
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DrawEpisodeLevel ()
|
||
//
|
||
// right justifies and pads with blanks
|
||
//
|
||
//******************************************************************************
|
||
|
||
void DrawEpisodeLevel (int x, int y)
|
||
{
|
||
int level;
|
||
char str[20];
|
||
pic_t *p;
|
||
|
||
if (!BATTLEMODE)
|
||
{
|
||
ltoa (gamestate.episode, str, 10);
|
||
|
||
//bna-- Drawpic (x+29, y+16, 8>>2, 16, (byte *)&timenums[str[0]-'0']->data);
|
||
VL_MemToScreenClipped ((byte *)&timenums[str[0]-'0']->data, 8>>2, 16, x+29, y+16);
|
||
|
||
if ((gamestate.mapon == 6) || (gamestate.mapon == 14) ||
|
||
(gamestate.mapon == 22) || (gamestate.mapon == 32) ||
|
||
(gamestate.mapon == 33))
|
||
{
|
||
p = (pic_t *) W_CacheLumpName ("tnumb", PU_CACHE, Cvt_pic_t, 1);
|
||
//Drawpic (x+40, y+16, 8>>2, 16, (byte *)&p->data);
|
||
VL_MemToScreenClipped ((byte *)&p->data, 8>>2, 16, x+40, y+16);
|
||
|
||
if (gamestate.mapon == 6)
|
||
level = 1;
|
||
else
|
||
if (gamestate.mapon == 14)
|
||
level = 2;
|
||
else
|
||
if (gamestate.mapon == 22)
|
||
level = 3;
|
||
else
|
||
if (gamestate.mapon == 32)
|
||
level = 4;
|
||
else
|
||
level = 5;
|
||
}
|
||
else
|
||
level = GetLevel (gamestate.episode, gamestate.mapon);
|
||
|
||
level = abs(level);
|
||
ltoa (level, str, 10);
|
||
|
||
if (level < 10){
|
||
//Drawpic (x+49, y+16, 8>>2, 16, (byte *)&timenums[str[0]-'0']->data);
|
||
VL_MemToScreenClipped ((byte *)&timenums[str[0]-'0']->data, 8>>2, 16, x+49, y+16);
|
||
}else{
|
||
//Drawpic (x+49, y+16, 8>>2, 16, (byte *)&timenums[str[0]-'0']->data);
|
||
VL_MemToScreenClipped ((byte *)&timenums[str[0]-'0']->data, 8>>2, 16, x+49, y+16);
|
||
//Drawpic (x+57, y+16, 8>>2, 16, (byte *)&timenums[str[1]-'0']->data);
|
||
VL_MemToScreenClipped ((byte *)&timenums[str[1]-'0']->data, 8>>2, 16, x+57, y+16);
|
||
|
||
}
|
||
}
|
||
else
|
||
{
|
||
p = (pic_t *) W_CacheLumpName ("battp", PU_CACHE, Cvt_pic_t, 1);
|
||
//Drawpic (x+16, y+15, 32>>2, 16, (byte *)&p->data);
|
||
VL_MemToScreenClipped ((byte *)&p->data, 32>>2, 16, x+16, y+15);
|
||
|
||
level = abs(gamestate.mapon + 1);
|
||
ltoa (level, str, 10);
|
||
|
||
if (level < 10){
|
||
//Drawpic (x+49, y+16, 8>>2, 16, (byte *)&timenums[str[0]-'0']->data);
|
||
VL_MemToScreenClipped ((byte *)&timenums[str[0]-'0']->data, 8>>2, 16, x+49, y+16);
|
||
}else {
|
||
//Drawpic (x+49, y+16, 8>>2, 16, (byte *)&timenums[str[0]-'0']->data);
|
||
VL_MemToScreenClipped ((byte *)&timenums[str[0]-'0']->data, 8>>2, 16, x+49, y+16);
|
||
//Drawpic (x+57, y+16, 8>>2, 16, (byte *)&timenums[str[1]-'0']->data);
|
||
VL_MemToScreenClipped ((byte *)&timenums[str[1]-'0']->data, 8>>2, 16, x+57, y+16);
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// GM_MemToScreen ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void GM_MemToScreen (byte *source, int width, int height, int x, int y)
|
||
{
|
||
int dest;
|
||
byte *dest1, *dest2, *dest3, mask;
|
||
byte *screen1, *screen2, *screen3;
|
||
int plane;
|
||
int w;
|
||
|
||
#ifdef DOS
|
||
dest = ylookup[y]+(x>>2);
|
||
#else
|
||
dest = ylookup[y]+x;
|
||
#endif
|
||
mask = 1 << (x&3);
|
||
|
||
dest1 = (byte *)(dest+page1start);
|
||
dest2 = (byte *)(dest+page2start);
|
||
dest3 = (byte *)(dest+page3start);
|
||
|
||
for (plane = 0; plane<4; plane++)
|
||
{
|
||
VGAMAPMASK (mask);
|
||
|
||
screen1 = dest1;
|
||
screen2 = dest2;
|
||
screen3 = dest3;
|
||
for (y = 0; y < height; y++, screen1 += linewidth,
|
||
screen2 += linewidth,
|
||
screen3 += linewidth, source+=width)
|
||
{
|
||
#ifdef DOS
|
||
memcpy (screen1, source, width);
|
||
memcpy (screen2, source, width);
|
||
memcpy (screen3, source, width);
|
||
#else
|
||
for (x = 0; x < width; x++) {
|
||
screen1[x*4+plane] = source[x];
|
||
screen2[x*4+plane] = source[x];
|
||
screen3[x*4+plane] = source[x];
|
||
}
|
||
#endif
|
||
}
|
||
|
||
#ifdef DOS
|
||
mask <<= 1;
|
||
|
||
if (mask == 16)
|
||
{
|
||
mask = 1;
|
||
dest1++;
|
||
dest2++;
|
||
dest3++;
|
||
}
|
||
#endif
|
||
}
|
||
}
|
||
|
||
|
||
//==========================================================================
|
||
|
||
/*
|
||
==================
|
||
=
|
||
= ScreenShake
|
||
=
|
||
==================
|
||
*/
|
||
|
||
void ScreenShake (void)
|
||
{
|
||
static int which = 0;
|
||
// SetTextMode ( );
|
||
if (SHAKETICS != 0xFFFF)
|
||
{
|
||
SHAKETICS -= tics;
|
||
if (SHAKETICS >= 0xFF00){SHAKETICS = 0xFFFF;}//bna safety val check
|
||
|
||
which = (RandomNumber ("ScreenShake",0) & 3);
|
||
|
||
switch (which)
|
||
{
|
||
case 0:
|
||
displayofs += 1;
|
||
MoveScreenUpLeft();//SetTextMode ( );
|
||
DrawPlayScreen(true);//repaint ammo and life stat
|
||
break;
|
||
|
||
case 1:
|
||
displayofs -= 1;
|
||
MoveScreenUpRight();
|
||
DrawPlayScreen(true);//repaint ammo and life stat
|
||
break;
|
||
|
||
case 2:
|
||
displayofs += 3*iGLOBAL_SCREENBWIDE;
|
||
MoveScreenDownLeft();
|
||
DrawPlayScreen(true);//repaint ammo and life stat
|
||
break;
|
||
|
||
case 3:
|
||
displayofs -= 3*iGLOBAL_SCREENBWIDE;
|
||
MoveScreenDownRight();
|
||
DrawPlayScreen(true);//repaint ammo and life stat
|
||
break;
|
||
}
|
||
|
||
}
|
||
}
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DoBorderShifts ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void DoBorderShifts (void)
|
||
{
|
||
if (damagecount)
|
||
{
|
||
if (damagecount > 100)
|
||
damagecount = 100;
|
||
|
||
damagecount -= 6;
|
||
|
||
if (damagecount < 0)
|
||
damagecount = 0;
|
||
|
||
SetBorderColor (*(colormap+(((100-damagecount)>>2)<<8)+48));
|
||
|
||
borderset = true;
|
||
}
|
||
else
|
||
if (borderset)
|
||
{
|
||
SetBorderColor (0);
|
||
borderset = false;
|
||
}
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DrawHighScores ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void DrawHighScores (void)
|
||
{
|
||
char buffer[16];
|
||
#if (SHAREWARE == 0)
|
||
char buffer1[5];
|
||
#endif
|
||
int i,
|
||
w,
|
||
h;
|
||
HighScore *s;
|
||
|
||
for (i = 0, s = Scores; i < MaxScores; i++, s++)
|
||
{
|
||
PrintY = 25 + (16 * i);
|
||
|
||
//
|
||
// name
|
||
//
|
||
PrintX = 3*8;
|
||
DrawMenuBufPropString (PrintX, PrintY, s->name);
|
||
|
||
//
|
||
// level
|
||
//
|
||
ultoa (s->completed, buffer, 10);
|
||
|
||
PrintX = (17 * 8)-10;
|
||
#if (SHAREWARE == 0)
|
||
itoa (s->episode, buffer1, 10);
|
||
|
||
DrawMenuBufPropString (PrintX, PrintY, buffer1);
|
||
#else
|
||
DrawMenuBufPropString (PrintX, PrintY, "S");
|
||
#endif
|
||
|
||
DrawMenuBufPropString (PrintX, PrintY, "-");
|
||
|
||
#if (SHAREWARE == 0)
|
||
if (s->completed == 7)
|
||
DrawMenuBufPropString (PrintX, PrintY, "B");
|
||
else if (s->completed == 8)
|
||
DrawMenuBufPropString (PrintX, PrintY, "S");
|
||
else if (s->completed == 9)
|
||
DrawMenuBufPropString (PrintX, PrintY, "C");
|
||
else if (s->completed == 10)
|
||
DrawMenuBufPropString (PrintX, PrintY, "D");
|
||
else
|
||
DrawMenuBufPropString (PrintX, PrintY, buffer);
|
||
#else
|
||
DrawMenuBufPropString (PrintX, PrintY, buffer);
|
||
#endif
|
||
|
||
//
|
||
// score
|
||
//
|
||
ultoa(s->score,buffer,10);
|
||
|
||
VW_MeasurePropString (buffer, &w, &h);
|
||
PrintX = (33 * 8) - w;
|
||
DrawMenuBufPropString (PrintX, PrintY, buffer);
|
||
}
|
||
}
|
||
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// CheckHighScore ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
void CheckHighScore (long score, word other, boolean INMENU)
|
||
{
|
||
word i,j;
|
||
int n;
|
||
HighScore myscore;
|
||
int level;
|
||
|
||
MenuFadeIn();
|
||
if (!INMENU)
|
||
SetupMenuBuf ();
|
||
|
||
strcpy (myscore.name,"");
|
||
myscore.score = score;
|
||
|
||
level = GetLevel (gamestate.episode, other-1);
|
||
|
||
myscore.episode = gamestate.episode;
|
||
myscore.completed = level;
|
||
|
||
CurrentFont = smallfont;
|
||
|
||
for (i = 0, n = -1; i < MaxScores; i++)
|
||
{
|
||
if ((myscore.score > Scores[i].score) ||
|
||
((myscore.score == Scores[i].score) &&
|
||
(myscore.completed > Scores[i].completed)))
|
||
{
|
||
for (j = MaxScores; --j > i;)
|
||
Scores[j] = Scores[j - 1];
|
||
Scores[i] = myscore;
|
||
n = i;
|
||
break;
|
||
}
|
||
}
|
||
|
||
if (INMENU)
|
||
{
|
||
SetAlternateMenuBuf();
|
||
SetMenuTitle ("High Scores");
|
||
ClearMenuBuf();
|
||
DrawHighScores ();
|
||
if (n != -1)
|
||
DisplayInfo (6);
|
||
else
|
||
DisplayInfo (5);
|
||
FlipMenuBuf ();
|
||
}
|
||
else
|
||
{
|
||
ClearMenuBuf ();
|
||
SetMenuTitle ("High Scores");
|
||
DrawHighScores ();
|
||
if (n != -1)
|
||
DisplayInfo (6);
|
||
else
|
||
DisplayInfo (5);
|
||
RefreshMenuBuf (0);
|
||
}
|
||
|
||
if (n != -1)
|
||
{
|
||
PrintY = 25 + (16 * n);
|
||
PrintX = 3*8;
|
||
US_LineInput (PrintX, PrintY, Scores[n].name, NULL,
|
||
true, 10, 98, 0);
|
||
}
|
||
else
|
||
{
|
||
IN_ClearKeysDown ();
|
||
if ( INMENU )
|
||
{
|
||
while( !IN_CheckAck () )
|
||
{
|
||
RefreshMenuBuf (0);
|
||
}
|
||
}
|
||
else
|
||
{
|
||
for( i = 0; i <= 150; i += tics )
|
||
{
|
||
RefreshMenuBuf (0);
|
||
if (IN_CheckAck ())
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
if (INMENU)
|
||
{
|
||
SD_Play (SD_ESCPRESSEDSND);
|
||
}
|
||
else
|
||
{
|
||
ShutdownMenuBuf ();
|
||
}
|
||
}
|
||
|
||
|
||
//===========================================================================
|
||
|
||
//#define HEADERX 140
|
||
//#define BONERNAMEX 170
|
||
#define HEADERX 152
|
||
#define BONERNAMEX 166
|
||
|
||
|
||
/*
|
||
==================
|
||
=
|
||
= DrawEOLHeader ()
|
||
=
|
||
==================
|
||
*/
|
||
void DrawEOLHeader
|
||
(
|
||
int playstate
|
||
)
|
||
|
||
{
|
||
int health;
|
||
char tempstr[ 15 ];
|
||
char *string;
|
||
int level;
|
||
int w;
|
||
int h;
|
||
|
||
VWB_TBar( 30, 5, 250, 75 );
|
||
|
||
switch( playstate )
|
||
{
|
||
case ex_skiplevel :
|
||
if ( ( gamestate.violence >= vl_high ) &&
|
||
( gamestate.difficulty >= gd_hard ) )
|
||
{
|
||
string = "LEVEL WUSSED OUT ON!";
|
||
}
|
||
else
|
||
{
|
||
string = "LEVEL SKIPPED.";
|
||
}
|
||
break;
|
||
|
||
case ex_secretdone :
|
||
string = "SECRET LEVEL COMPLETED!";
|
||
break;
|
||
|
||
case ex_secretlevel :
|
||
string = "SECRET EXIT TAKEN!";
|
||
break;
|
||
|
||
case ex_gameover :
|
||
string = "GAME COMPLETED!";
|
||
break;
|
||
|
||
case ex_bossdied :
|
||
string = "BOSS DEFEATED!";
|
||
break;
|
||
|
||
default :
|
||
string = "LEVEL COMPLETED!";
|
||
break;
|
||
}
|
||
|
||
VW_MeasurePropString( string, &w, &h );
|
||
|
||
px = ( 320 - w ) / 2;
|
||
py = 10;
|
||
VWB_DrawPropString( string );
|
||
|
||
// draw episode number
|
||
string = "EPISODE";
|
||
VW_MeasurePropString( string, &w, &h );
|
||
px = HEADERX - w;
|
||
py = 25;
|
||
VWB_DrawPropString( string );
|
||
|
||
itoa( gamestate.episode, tempstr, 10 );
|
||
px = BONERNAMEX;
|
||
VWB_DrawPropString( tempstr );
|
||
|
||
// draw area number
|
||
level = GetLevel( gamestate.episode, gamestate.mapon );
|
||
itoa( level, tempstr, 10 );
|
||
|
||
py = 35;
|
||
|
||
if ( playstate == ex_secretdone )
|
||
{
|
||
string = "SECRET AREA";
|
||
}
|
||
else if ( playstate == ex_bossdied )
|
||
{
|
||
string = "BOSS AREA";
|
||
}
|
||
else if ( gamestate.mapon == 32 )
|
||
{
|
||
string = "CHASE AREA";
|
||
}
|
||
else
|
||
{
|
||
string = "AREA";
|
||
}
|
||
|
||
VW_MeasurePropString( string, &w, &h);
|
||
px = HEADERX - w;
|
||
VWB_DrawPropString( string );
|
||
|
||
if ( gamestate.mapon != 33 )
|
||
{
|
||
px = BONERNAMEX;
|
||
VWB_DrawPropString( tempstr );
|
||
}
|
||
|
||
string = "SCORE";
|
||
VW_MeasurePropString( string, &w, &h);
|
||
px = HEADERX - w;
|
||
py = 45;
|
||
VWB_DrawPropString( string );
|
||
|
||
px = BONERNAMEX;
|
||
itoa( gamestate.score, tempstr, 10 );
|
||
VWB_DrawPropString( tempstr );
|
||
|
||
string = "HEALTH";
|
||
VW_MeasurePropString( string, &w, &h );
|
||
px = HEADERX - w;
|
||
py = 55;
|
||
VWB_DrawPropString( string );
|
||
|
||
px = BONERNAMEX;
|
||
health = ( ( locplayerstate->health * 100 ) /
|
||
MaxHitpointsForCharacter( locplayerstate ) );
|
||
|
||
itoa( health, tempstr, 10 );
|
||
VWB_DrawPropString( tempstr );
|
||
VWB_DrawPropString( "%" );
|
||
|
||
//
|
||
// Secret count
|
||
//
|
||
|
||
{
|
||
char str1[10];
|
||
char str2[10];
|
||
|
||
itoa(gamestate.secretcount,&(str1[0]),10);
|
||
strcat(str1," / ");
|
||
itoa(gamestate.secrettotal,&(str2[0]),10);
|
||
strcat(str1,str2);
|
||
string = "SECRET WALLS";
|
||
VW_MeasurePropString( string, &w, &h );
|
||
px = HEADERX - w;
|
||
py = 65;
|
||
VWB_DrawPropString( string );
|
||
|
||
px = BONERNAMEX;
|
||
VWB_DrawPropString( str1 );
|
||
}
|
||
|
||
VW_UpdateScreen ();
|
||
}
|
||
|
||
boolean EndBonusFirst;
|
||
boolean EndBonusSkip;
|
||
int EndBonusNumBonuses;
|
||
int EndBonusVoice;
|
||
int EndBonusStartY;
|
||
|
||
void DrawEndBonus
|
||
(
|
||
char *string,
|
||
char *bonusstring,
|
||
int type
|
||
)
|
||
|
||
{
|
||
int w;
|
||
int h;
|
||
int health;
|
||
char tempstr[ 15 ];
|
||
|
||
if ( EndBonusFirst )
|
||
{
|
||
VWB_TBar( 5, EndBonusStartY - 2, 310, 4 );
|
||
EndBonusFirst = false;
|
||
}
|
||
|
||
VWB_TBar( 5, EndBonusStartY + 2, 310, 10 );
|
||
VW_MeasurePropString( string, &w, &h );
|
||
|
||
py = EndBonusStartY;
|
||
if ( bonusstring == NULL )
|
||
{
|
||
px = ( 320 - w ) / 2;
|
||
VWB_DrawPropString( string );
|
||
}
|
||
else
|
||
{
|
||
px = BONERNAMEX - w;
|
||
VWB_DrawPropString( string );
|
||
|
||
EndBonusNumBonuses++;
|
||
VW_MeasurePropString( bonusstring, &w, &h );
|
||
px = 310 - w;
|
||
py = EndBonusStartY;
|
||
VWB_DrawPropString( bonusstring );
|
||
}
|
||
|
||
// Update Score
|
||
py = 45;
|
||
px = BONERNAMEX;
|
||
V_ReDrawBkgnd( px, py, 107, 11, false );
|
||
VWB_TBar( px, py, 107, 11 );
|
||
itoa( gamestate.score, tempstr, 10 );
|
||
VWB_DrawPropString( tempstr );
|
||
|
||
// Update Health
|
||
py = 55;
|
||
px = BONERNAMEX;
|
||
V_ReDrawBkgnd( px, py, 107, 11, false );
|
||
VWB_TBar( px, py, 107, 11 );
|
||
health = ( ( locplayerstate->health * 100 ) /
|
||
MaxHitpointsForCharacter( locplayerstate ) );
|
||
itoa( health, tempstr, 10 );
|
||
VWB_DrawPropString( tempstr );
|
||
VWB_DrawPropString( "%" );
|
||
|
||
switch( type )
|
||
{
|
||
case 0 :
|
||
EndBonusVoice = SD_Play( SD_ENDBONUS1SND );
|
||
break;
|
||
|
||
case 1 :
|
||
EndBonusVoice = SD_Play( SD_NOBONUSSND );
|
||
break;
|
||
|
||
case 2 :
|
||
VL_FillPalette(255,255,255);
|
||
//bna--VW_UpdateScreen();
|
||
VL_FadeIn(0,255,origpal,10);
|
||
EndBonusVoice = SD_Play( SD_LIGHTNINGSND );
|
||
break;
|
||
}
|
||
|
||
EndBonusStartY += 10;
|
||
|
||
//bna--VW_UpdateScreen();
|
||
while( SD_SoundActive( EndBonusVoice ) && !EndBonusSkip )
|
||
{
|
||
if ( IN_CheckAck() )
|
||
{
|
||
EndBonusSkip = true;
|
||
}
|
||
}
|
||
}
|
||
|
||
|
||
|
||
/*
|
||
==================
|
||
=
|
||
= LevelCompleted
|
||
=
|
||
= Exit with the screen faded out
|
||
=
|
||
==================
|
||
*/
|
||
|
||
extern int OLDLMWEAPON;
|
||
extern int OLDLWEAPON;
|
||
|
||
void LevelCompleted
|
||
(
|
||
exit_t playstate
|
||
)
|
||
|
||
{
|
||
objtype *obj;
|
||
boolean dobonus;
|
||
int i;
|
||
int kr;
|
||
int sr;
|
||
int tr;
|
||
int missileratio;
|
||
int superratio;
|
||
int healthratio;
|
||
int democraticratio;
|
||
int plantratio;
|
||
int cnt;
|
||
|
||
pic_t *tmpPic;
|
||
// byte *picbuf;
|
||
|
||
EndBonusNumBonuses = 0;
|
||
EndBonusFirst = true;
|
||
EndBonusSkip = false;
|
||
EndBonusStartY = 90;
|
||
|
||
EnableScreenStretch();
|
||
tmpPic = ( pic_t * )W_CacheLumpName( "mmbk", PU_CACHE, Cvt_pic_t, 1 );
|
||
VWB_DrawPic( 0, 0, tmpPic );
|
||
VW_UpdateScreen();
|
||
// DisableScreenStretch();
|
||
|
||
IN_StartAck();
|
||
EndBonusVoice = 0;
|
||
|
||
|
||
if ( playstate != ex_bossdied )
|
||
{
|
||
EndBonusVoice = SD_Play( SD_LEVELDONESND );
|
||
VL_FillPalette( 255, 255, 255 );
|
||
VL_FadeIn( 0, 255, origpal, 10 );
|
||
if ( player->flags & FL_DOGMODE )
|
||
{
|
||
MU_StartSong( song_dogend );
|
||
}
|
||
else
|
||
{
|
||
MU_StartSong( song_endlevel );
|
||
}
|
||
}
|
||
|
||
BkPic = ( pic_t * )W_CacheLumpName( "mmbk", PU_CACHE, Cvt_pic_t, 1 );
|
||
VWB_DrawPic( 0, 0, BkPic );
|
||
|
||
CheckHolidays();
|
||
CurrentFont = smallfont;
|
||
|
||
// Kill powerups
|
||
if ( player->flags & FL_ELASTO )
|
||
{
|
||
player->flags &= ~FL_NOFRICTION;
|
||
}
|
||
|
||
player->flags &= ~( FL_FLEET | FL_SHROOMS | FL_ELASTO | FL_GODMODE |
|
||
FL_DOGMODE | FL_BPV | FL_AV | FL_GASMASK );
|
||
|
||
// Turn off quickload for next level
|
||
pickquick = false;
|
||
|
||
//
|
||
// FIGURE RATIOS OUT BEFOREHAND
|
||
//
|
||
kr = 0;
|
||
tr = 0;
|
||
tr = 0;
|
||
superratio = 0;
|
||
missileratio = 0;
|
||
healthratio = 0;
|
||
democraticratio = 0;
|
||
plantratio = 0;
|
||
|
||
if ( gamestate.killtotal )
|
||
{
|
||
kr = ( int )( ( ( int )gamestate.killcount ) * 100 ) /
|
||
( ( int )gamestate.killtotal );
|
||
}
|
||
|
||
if ( gamestate.secrettotal )
|
||
{
|
||
sr = ( int )( ( ( int )gamestate.secretcount ) * 100 ) /
|
||
( ( int )gamestate.secrettotal );
|
||
}
|
||
|
||
if ( gamestate.treasuretotal )
|
||
{
|
||
tr = ( int )( ( ( int )gamestate.treasurecount ) * 100 ) /
|
||
( ( int )gamestate.treasuretotal );
|
||
}
|
||
|
||
if ( gamestate.supertotal )
|
||
{
|
||
superratio = ( int )( ( ( int )gamestate.supercount ) * 100 ) /
|
||
( ( int )gamestate.supertotal );
|
||
}
|
||
|
||
if ( gamestate.missiletotal )
|
||
{
|
||
missileratio = ( int )( ( ( int )gamestate.missilecount ) * 100 ) /
|
||
( ( int )gamestate.missiletotal );
|
||
}
|
||
|
||
if ( gamestate.healthtotal )
|
||
{
|
||
healthratio = ( int )( ( ( int )gamestate.healthcount ) * 100 ) /
|
||
( ( int )gamestate.healthtotal );
|
||
}
|
||
|
||
if ( gamestate.democratictotal )
|
||
{
|
||
democraticratio = ( int )( ( ( int )gamestate.democraticcount ) *
|
||
100 ) / ( ( int )gamestate.democratictotal );
|
||
}
|
||
|
||
if ( gamestate.planttotal )
|
||
{
|
||
plantratio = ( int )( ( ( int )gamestate.plantcount ) * 100 ) /
|
||
( ( int )gamestate.planttotal );
|
||
}
|
||
|
||
DrawEOLHeader( playstate );
|
||
/*
|
||
//bna section store picture because its written on again
|
||
// store screen first
|
||
picbuf = (byte *)SafeMalloc (64000);
|
||
memcpy(picbuf ,bufferofs ,64000);
|
||
|
||
EnableScreenStretch();
|
||
VW_UpdateScreen();//tmpPICbuf is destroyed here
|
||
DisableScreenStretch();
|
||
//copy it back
|
||
|
||
memcpy(bufferofs ,picbuf , 64000);
|
||
//bna section end
|
||
*/
|
||
|
||
EndBonusSkip = true;
|
||
|
||
while( SD_SoundActive( EndBonusVoice ) && !EndBonusSkip )
|
||
{
|
||
|
||
//bna--VW_UpdateScreen();
|
||
|
||
if ( IN_CheckAck() )
|
||
{
|
||
EndBonusSkip = true;
|
||
}
|
||
}
|
||
// tmpPic = ( pic_t * )W_CacheLumpName( "mmbk", PU_CACHE, Cvt_pic_t, 1 );
|
||
// VWB_DrawPic( 0, 0, tmpPic );
|
||
|
||
if ( GetNextMap(player->tilex,player->tiley) == -1)
|
||
{
|
||
if ( gamestate.dipballs == 3 )
|
||
{
|
||
gamestate.score += 100000;
|
||
DrawEndBonus( "DIP BONUS", "100000 POINTS", 0 );
|
||
EndBonusStartY += 10;
|
||
}
|
||
|
||
if ( locplayerstate->lives > 0 )
|
||
{
|
||
char str[20];
|
||
char str2[60];
|
||
|
||
DrawEndBonus( "EXTRA LIVES BONUS", "\0", 0 );
|
||
itoa(locplayerstate->lives,str,10);
|
||
strcpy(str2,str);
|
||
strcat(str2," EXTRA LIVES =");
|
||
DrawEndBonus( "\0", str2, 0 );
|
||
itoa(locplayerstate->lives,str,10);
|
||
strcpy(str2,str);
|
||
strcat(str2," X 10000 = ");
|
||
itoa(locplayerstate->lives*10000,str,10);
|
||
strcat(str2,str);
|
||
strcat(str2," POINTS");
|
||
gamestate.score += 10000*locplayerstate->lives;
|
||
DrawEndBonus( "\0", str2, 0 );
|
||
}
|
||
}
|
||
else
|
||
{
|
||
//
|
||
// Check for SKIN OF YO TEETH
|
||
//
|
||
if ( locplayerstate->health <= 10 )
|
||
{
|
||
locplayerstate->health = MaxHitpointsForCharacter( locplayerstate );
|
||
DrawEndBonus( "SKIN OF YOUR TEETH", "100% HEALTH", 0 );
|
||
}
|
||
|
||
// BULL IN CHINA SHOP BONUS
|
||
if ( tr == 100 )
|
||
{
|
||
gamestate.score += 10000;
|
||
DrawEndBonus( "BULL IN CHINA SHOP", "10000 POINTS", 0 );
|
||
}
|
||
|
||
// SUPERCHARE BONUS
|
||
if ( superratio == 100 )
|
||
{
|
||
gamestate.score += 10000;
|
||
DrawEndBonus( "SUPERCHARGE BONUS", "10000 POINTS", 0 );
|
||
}
|
||
|
||
// BLEEDER BONUS
|
||
if ( healthratio == 100 )
|
||
{
|
||
gamestate.score += 10000;
|
||
DrawEndBonus( "BLEEDER BONUS", "10000 POINTS", 0 );
|
||
}
|
||
|
||
// ADRENALINE BONUS
|
||
if ( kr == 100 )
|
||
{
|
||
gamestate.score += 10000;
|
||
DrawEndBonus( "ADRENALINE BONUS", "10000 POINTS", 0 );
|
||
}
|
||
|
||
// CURIOSITY BONUS
|
||
dobonus = true;
|
||
|
||
//
|
||
// Check switches
|
||
cnt = lastswitch - &switches[ 0 ];
|
||
if ( cnt != 0 )
|
||
{
|
||
for ( i = 0; i < cnt; i++ )
|
||
{
|
||
if ( ( switches[ i ].flags & FL_S_FLIPPED ) == 0 )
|
||
{
|
||
dobonus = false;
|
||
break;
|
||
}
|
||
}
|
||
}
|
||
|
||
//
|
||
// Check pillars
|
||
for ( obj = FIRSTACTOR; obj != NULL; obj = obj->next )
|
||
{
|
||
if ( ( obj->obclass == pillarobj ) &&
|
||
( ( obj->flags & FL_FLIPPED ) == 0 ) )
|
||
{
|
||
dobonus = false;
|
||
}
|
||
}
|
||
|
||
if ( ( gamestate.secrettotal ) && ( sr != 100 ) )
|
||
{
|
||
dobonus = false;
|
||
}
|
||
|
||
if ( dobonus )
|
||
{
|
||
gamestate.score += 10000;
|
||
DrawEndBonus( "CURIOSITY BONUS", "10000 POINTS", 0 );
|
||
}
|
||
|
||
// GROUND ZERO BONUS
|
||
if ( gamestate.DOGROUNDZEROBONUS )
|
||
{
|
||
gamestate.score += 10000;
|
||
DrawEndBonus( "GROUND ZERO BONUS", "10000 POINTS", 0 );
|
||
}
|
||
|
||
// REPUBLICAN BONUS 1
|
||
if ( missileratio == 100 )
|
||
{
|
||
gamestate.score += 5000;
|
||
DrawEndBonus( "REPUBLICAN BONUS 1", " 5000 POINTS", 0 );
|
||
}
|
||
|
||
// REPUBLICAN BONUS 2
|
||
if (plantratio == 100)
|
||
{
|
||
gamestate.score += 5000;
|
||
DrawEndBonus( "REPUBLICAN BONUS 2", " 5000 POINTS", 0 );
|
||
}
|
||
|
||
// DEMOCRATIC BONUS 1
|
||
if ( gamestate.DODEMOCRATICBONUS1 )
|
||
{
|
||
gamestate.score += 5000;
|
||
DrawEndBonus( "DEMOCRATIC BONUS 1", " 5000 POINTS", 0 );
|
||
}
|
||
|
||
// DEMOCRATIC BONUS 2
|
||
if (democraticratio == 100)
|
||
{
|
||
gamestate.score += 5000;
|
||
DrawEndBonus( "DEMOCRATIC BONUS 2", " 5000 POINTS", 0 );
|
||
}
|
||
}
|
||
|
||
if ( EndBonusNumBonuses == 0 )
|
||
{
|
||
DrawEndBonus( "NO BONUS!", NULL, 1 );
|
||
}
|
||
|
||
if ( ( EndBonusNumBonuses != 0 ) || ( playstate == ex_gameover ) )
|
||
{
|
||
SD_Play( PlayerSnds[ locplayerstate->player ] );
|
||
|
||
// DO BONUS BONUS
|
||
if ( EndBonusNumBonuses == NUMBONUSES )
|
||
{
|
||
IN_StartAck();
|
||
while( !IN_CheckAck() )
|
||
{
|
||
;
|
||
}
|
||
|
||
BkPic = ( pic_t * )W_CacheLumpName( "mmbk", PU_CACHE, Cvt_pic_t, 1 );
|
||
VWB_DrawPic( 0, 0, BkPic );
|
||
|
||
gamestate.score += BONUSBONUS;
|
||
DrawEOLHeader( playstate );
|
||
EndBonusFirst = true;
|
||
EndBonusStartY = 110;
|
||
EndBonusSkip = true;
|
||
DrawEndBonus( "BONUS BONUS! 1,000,000 POINTS!", NULL, 2 );
|
||
}
|
||
else if ( ( kr == 100 ) && ( dobonus ) )
|
||
{
|
||
IN_StartAck();
|
||
while( !IN_CheckAck() )
|
||
{
|
||
;
|
||
}
|
||
|
||
BkPic = ( pic_t * )W_CacheLumpName( "mmbk", PU_CACHE, Cvt_pic_t, 1 );
|
||
VWB_DrawPic( 0, 0, BkPic );
|
||
|
||
DrawEOLHeader( playstate );
|
||
EndBonusFirst = true;
|
||
EndBonusStartY = 110;
|
||
DrawEndBonus( "You have done well.", NULL, 3 );
|
||
|
||
#if (SHAREWARE==1)
|
||
EndBonusVoice = SD_Play( SD_RICOCHET3SND );
|
||
#else
|
||
EndBonusVoice = SD_Play( SD_PERCENT100SND );
|
||
#endif
|
||
|
||
EndBonusSkip = false;
|
||
DrawEndBonus( "This level is toast.", NULL, 3 );
|
||
|
||
}
|
||
}
|
||
|
||
|
||
|
||
//bna section
|
||
// EnableScreenStretch();//bna++
|
||
VW_UpdateScreen();//bna++
|
||
// DisableScreenStretch();//bna++
|
||
//bna section end
|
||
|
||
|
||
IN_StartAck();
|
||
while( !IN_CheckAck() )
|
||
{
|
||
;
|
||
}
|
||
|
||
EndLevelStuff = false;
|
||
CurrentFont = smallfont;
|
||
}
|
||
|
||
|
||
void DrawTallyHeader
|
||
(
|
||
int which
|
||
)
|
||
|
||
{
|
||
pic_t *Name;
|
||
pic_t *KillCount;
|
||
pic_t *TimesYouKilledPerson;
|
||
pic_t *TimesPersonKilledYou;
|
||
pic_t *Suicides;
|
||
pic_t *Score;
|
||
pic_t *Blank;
|
||
pic_t *TopBar;
|
||
|
||
Name = ( pic_t * )W_CacheLumpName( "t_name", PU_CACHE, Cvt_pic_t, 1 );
|
||
Blank = ( pic_t * )W_CacheLumpName( "t_blnk", PU_CACHE, Cvt_pic_t, 1 );
|
||
KillCount = ( pic_t * )W_CacheLumpName( "t_kcount", PU_CACHE, Cvt_pic_t, 1 );
|
||
TimesYouKilledPerson = ( pic_t * )W_CacheLumpName( "t_kilper", PU_CACHE, Cvt_pic_t, 1 );
|
||
TimesPersonKilledYou = ( pic_t * )W_CacheLumpName( "t_perkil" , PU_CACHE, Cvt_pic_t, 1 );
|
||
Suicides = ( pic_t * )W_CacheLumpName( "t_suicid", PU_CACHE, Cvt_pic_t, 1 );
|
||
Score = ( pic_t * )W_CacheLumpName( "t_score", PU_CACHE, Cvt_pic_t, 1 );
|
||
TopBar = ( pic_t * )W_CacheLumpName( "t_bar", PU_CACHE, Cvt_pic_t, 1 );
|
||
|
||
IFont = ( cfont_t * )W_CacheLumpName( "sifont", PU_CACHE, Cvt_cfont_t, 1 );
|
||
|
||
switch( which )
|
||
{
|
||
case 0 :
|
||
VWB_DrawPic ( 8, 8, TopBar );
|
||
DrawIntensityString( 12, 11, "FINAL SCORE", 20 );
|
||
VWB_DrawPic ( 8, 24, Name );
|
||
VWB_DrawPic ( 136, 24, KillCount );
|
||
VWB_DrawPic ( 184, 24, Suicides );
|
||
VWB_DrawPic ( 272, 24, Score );
|
||
break;
|
||
|
||
case 1 :
|
||
VWB_DrawPic ( 8, 8, TopBar );
|
||
DrawIntensityString( 12, 11, "FINAL SCORE", 20 );
|
||
VWB_DrawPic ( 8, 24, Name );
|
||
VWB_DrawPic ( 136, 24, Blank );
|
||
VWB_DrawPic ( 272, 24, Score );
|
||
break;
|
||
|
||
case 2 :
|
||
VWB_DrawPic ( 8, 8, TopBar );
|
||
DrawIntensityString( 12, 11, "YOUR KILLS", 20 );
|
||
VWB_DrawPic ( 8, 24, Name );
|
||
VWB_DrawPic ( 136, 24, KillCount );
|
||
VWB_DrawPic ( 184, 24, TimesYouKilledPerson );
|
||
break;
|
||
|
||
case 3 :
|
||
VWB_DrawPic ( 8, 8, TopBar );
|
||
DrawIntensityString( 12, 11, "YOUR DEATHS", 20 );
|
||
VWB_DrawPic ( 8, 24, Name );
|
||
VWB_DrawPic ( 136, 24, TimesPersonKilledYou );
|
||
break;
|
||
//bna added
|
||
case 4 :
|
||
VWB_DrawPic ( 198+48, 8, Blank );
|
||
VWB_DrawPic ( 8, 8, TopBar );
|
||
DrawIntensityString( 12, 11, "FINAL SCORE", 20 );
|
||
VWB_DrawPic ( 8, 24, TopBar );//used to blank
|
||
VWB_DrawPic ( 8, 24, Name );
|
||
VWB_DrawPic ( 136, 24, KillCount);
|
||
VWB_DrawPic ( 198, 24, TimesPersonKilledYou);
|
||
VWB_DrawPic ( 198+48, 24, Blank );
|
||
VWB_DrawPic ( 272, 24, Score );
|
||
break;
|
||
//bna added end
|
||
}
|
||
|
||
DrawTimeXY( TALLYTIME_X, TALLYTIME_Y, gamestate.TimeCount / VBLCOUNTER,
|
||
true );
|
||
}
|
||
|
||
|
||
#define BT_RANK_X 23
|
||
#define BT_PLAYER_X 30
|
||
#define BT_KILLS_X ( 139 + ( ( 40 + 20 ) / 2 ) )
|
||
#define BT_DEATHS_X ( 193 + ( ( 56 + 20 ) / 2 ) )
|
||
//#define BT_SCORE_X ( 263 + ( ( 46 + 20 ) / 2 ) )
|
||
#define BT_SCORE_X ( 273 + ( ( 46 + 20 ) / 2 ) )
|
||
|
||
|
||
void ShowKills( int localplayer )
|
||
{
|
||
int w;
|
||
int h;
|
||
int i;
|
||
int j;
|
||
int temp;
|
||
int rank;
|
||
int player;
|
||
int killer;
|
||
int victim;
|
||
int color;
|
||
char tempstr[15];
|
||
int KillCount[ MAXPLAYERS ];
|
||
int Order[ MAXPLAYERS ];
|
||
int NumPlayers;
|
||
|
||
// show at the most 11 players
|
||
NumPlayers = min( numplayers, 11 );
|
||
|
||
// Count kills
|
||
for( killer = 0; killer < NumPlayers; killer++ )
|
||
{
|
||
Order[ killer ] = killer;
|
||
KillCount[ killer ] = 0;
|
||
for( victim = 0; victim < NumPlayers; victim++ )
|
||
{
|
||
if ( BATTLE_Team[ victim ] != BATTLE_Team[ killer ] )
|
||
{
|
||
KillCount[ killer ] += WhoKilledWho[ killer ][ victim ];
|
||
}
|
||
}
|
||
}
|
||
|
||
for( i = 0; i < NumPlayers - 1; i++ )
|
||
{
|
||
for( j = i + 1; j < NumPlayers; j++ )
|
||
{
|
||
if ( KillCount[ Order[ i ] ] < KillCount[ Order[ j ] ] )
|
||
{
|
||
temp = Order[ i ];
|
||
Order[ i ] = Order[ j ];
|
||
Order[ j ] = temp;
|
||
}
|
||
}
|
||
}
|
||
|
||
DrawTallyHeader( 2 );
|
||
|
||
IFont = (cfont_t * )W_CacheLumpNum (W_GetNumForName ("sifont"), PU_CACHE, Cvt_cfont_t, 1);
|
||
CurrentFont = smallfont;
|
||
py = 43;
|
||
|
||
for( rank = 0; rank < NumPlayers; rank++ )
|
||
{
|
||
player = Order[ rank ];
|
||
|
||
color = 21;
|
||
|
||
// Highlight the your score
|
||
if ( player == localplayer )
|
||
{
|
||
// Change to Intensity
|
||
color = 241;
|
||
}
|
||
|
||
// Draw rank if not tied with previous rank
|
||
if ( ( rank == 0 ) || ( KillCount[ player ] !=
|
||
KillCount[ Order[ rank - 1 ] ] ) )
|
||
{
|
||
itoa( rank + 1, tempstr, 10 );
|
||
}
|
||
else
|
||
{
|
||
strcpy( tempstr, "Tie" );
|
||
}
|
||
|
||
VW_MeasureIntensityPropString ( tempstr, &w, &h);
|
||
DrawIntensityString( BT_RANK_X - w, py, tempstr, color );
|
||
|
||
// Draw name
|
||
DrawIntensityString( BT_PLAYER_X, py, PLAYERSTATE[ player ].codename, color );
|
||
|
||
// Draw kills
|
||
itoa( KillCount[ player ], tempstr, 10 );
|
||
VW_MeasureIntensityPropString ( tempstr, &w, &h);
|
||
DrawIntensityString( BT_KILLS_X - w, py, tempstr, color );
|
||
|
||
// Draw times you killed that person
|
||
if ( player != localplayer )
|
||
{
|
||
itoa( WhoKilledWho[ localplayer ][ player ], tempstr, 10 );
|
||
}
|
||
else
|
||
{
|
||
strcpy( tempstr, "-" );
|
||
}
|
||
|
||
VW_MeasureIntensityPropString ( tempstr, &w, &h);
|
||
DrawIntensityString( BT_DEATHS_X - w, py, tempstr, color );
|
||
|
||
if ( gamestate.teamplay )
|
||
{
|
||
DrawIntensityString( BT_DEATHS_X + 16, py,
|
||
colorname[ PLAYERSTATE[ player ].uniformcolor ], color );
|
||
}
|
||
|
||
py += h;
|
||
}
|
||
}
|
||
|
||
|
||
void ShowDeaths( int localplayer )
|
||
{
|
||
int w;
|
||
int h;
|
||
int i;
|
||
int j;
|
||
int temp;
|
||
int rank;
|
||
int player;
|
||
int killer;
|
||
int victim;
|
||
int color;
|
||
char tempstr[15];
|
||
int DeathCount[ MAXPLAYERS ];
|
||
int Order[ MAXPLAYERS ];
|
||
int NumPlayers;
|
||
|
||
// show at the most 11 players
|
||
NumPlayers = min( numplayers, 11 );
|
||
|
||
// Count Deaths
|
||
for( victim = 0; victim < NumPlayers; victim++ )
|
||
{
|
||
Order[ victim ] = victim;
|
||
DeathCount[ victim ] = 0;
|
||
for( killer = 0; killer < NumPlayers; killer++ )
|
||
{
|
||
DeathCount[ victim ] += WhoKilledWho[ killer ][ victim ];
|
||
}
|
||
}
|
||
|
||
for( i = 0; i < NumPlayers - 1; i++ )
|
||
{
|
||
for( j = i + 1; j < NumPlayers; j++ )
|
||
{
|
||
if ( DeathCount[ Order[ i ] ] < DeathCount[ Order[ j ] ] )
|
||
{
|
||
temp = Order[ i ];
|
||
Order[ i ] = Order[ j ];
|
||
Order[ j ] = temp;
|
||
}
|
||
}
|
||
}
|
||
|
||
DrawTallyHeader( 3 );
|
||
|
||
IFont = (cfont_t * )W_CacheLumpNum (W_GetNumForName ("sifont"), PU_CACHE, Cvt_cfont_t, 1);
|
||
CurrentFont = smallfont;
|
||
py = 43;
|
||
|
||
for( rank = 0; rank < NumPlayers; rank++ )
|
||
{
|
||
player = Order[ rank ];
|
||
color = 21;
|
||
|
||
// Highlight the your score
|
||
if ( player == localplayer )
|
||
{
|
||
// Change to Intensity
|
||
color = 241;
|
||
}
|
||
|
||
// Draw rank if not tied with previous rank
|
||
if ( ( rank == 0 ) || ( DeathCount[ player ] !=
|
||
DeathCount[ Order[ rank - 1 ] ] ) )
|
||
{
|
||
itoa( rank + 1, tempstr, 10 );
|
||
}
|
||
else
|
||
{
|
||
strcpy( tempstr, "Tie" );
|
||
}
|
||
|
||
VW_MeasureIntensityPropString ( tempstr, &w, &h);
|
||
DrawIntensityString( BT_RANK_X - w, py, tempstr, color );
|
||
|
||
// Draw name
|
||
DrawIntensityString( BT_PLAYER_X, py, PLAYERSTATE[ player ].codename, color );
|
||
|
||
// Draw deaths
|
||
itoa( DeathCount[ player ], tempstr, 10 );
|
||
VW_MeasureIntensityPropString ( tempstr, &w, &h);
|
||
DrawIntensityString( BT_KILLS_X - w, py, tempstr, color );
|
||
|
||
// Draw times you were killed by that person
|
||
itoa( WhoKilledWho[ player ][ localplayer ], tempstr, 10 );
|
||
VW_MeasureIntensityPropString ( tempstr, &w, &h);
|
||
DrawIntensityString( BT_DEATHS_X - w, py, tempstr, color );
|
||
|
||
if ( gamestate.teamplay )
|
||
{
|
||
DrawIntensityString( BT_DEATHS_X + 16, py,
|
||
colorname[ PLAYERSTATE[ player ].uniformcolor ], color );
|
||
}
|
||
|
||
py += h;
|
||
}
|
||
}
|
||
|
||
|
||
void ShowEndScore( int localplayer )
|
||
{
|
||
int w;
|
||
int h;
|
||
int rank;
|
||
int leader;
|
||
int team;
|
||
int color;
|
||
int killer;
|
||
int victim;
|
||
int killcount;
|
||
int suicidecount;
|
||
char tempstr[15];
|
||
boolean dofullstats;
|
||
int NumPlayers;
|
||
|
||
// show at the most 11 players
|
||
NumPlayers = min( numplayers, 11 );
|
||
|
||
dofullstats = false;
|
||
switch( gamestate.battlemode )
|
||
{
|
||
case battle_Normal :
|
||
case battle_ScoreMore :
|
||
case battle_Hunter :
|
||
dofullstats = true;
|
||
DrawTallyHeader( 0 );
|
||
break;
|
||
|
||
case battle_Collector :
|
||
case battle_Scavenger :
|
||
case battle_Tag :
|
||
case battle_Eluder :
|
||
case battle_Deluder :
|
||
case battle_CaptureTheTriad :
|
||
dofullstats = false;
|
||
DrawTallyHeader( 1 );
|
||
break;
|
||
}
|
||
|
||
IFont = (cfont_t * )W_CacheLumpNum (W_GetNumForName ("sifont"), PU_CACHE, Cvt_cfont_t, 1);
|
||
CurrentFont = smallfont;
|
||
py = 43;
|
||
|
||
for( rank = 0; rank < BATTLE_NumberOfTeams; rank++ )
|
||
{
|
||
team = BATTLE_PlayerOrder[ rank ];
|
||
|
||
color = 21;
|
||
if ( team == BATTLE_Team[ localplayer ] )
|
||
{
|
||
// Change to Intensity
|
||
color = 241;
|
||
}
|
||
|
||
// Draw rank if not tied with previous rank
|
||
if ( ( rank == 0 ) || ( BATTLE_Points[ team ] !=
|
||
BATTLE_Points[ BATTLE_PlayerOrder[ rank - 1 ] ] ) )
|
||
{
|
||
itoa( rank + 1, tempstr, 10 );
|
||
}
|
||
else
|
||
{
|
||
strcpy( tempstr, "Tie" );
|
||
}
|
||
|
||
VW_MeasureIntensityPropString ( tempstr, &w, &h);
|
||
DrawIntensityString( BT_RANK_X - w, py, tempstr, color );
|
||
|
||
// Draw name of team leader
|
||
leader = BATTLE_TeamLeader[ team ];
|
||
if ( gamestate.teamplay )
|
||
{
|
||
DrawIntensityString( BT_PLAYER_X, py,
|
||
colorname[ PLAYERSTATE[ leader ].uniformcolor ], color );
|
||
}
|
||
else
|
||
{
|
||
DrawIntensityString( BT_PLAYER_X, py,
|
||
PLAYERSTATE[ leader ].codename, color );
|
||
}
|
||
|
||
if ( dofullstats )
|
||
{
|
||
// Count how many kills each person on the team got
|
||
killcount = 0;
|
||
suicidecount = 0;
|
||
for( killer = 0; killer < NumPlayers; killer++ )
|
||
{
|
||
if ( BATTLE_Team[ killer ] == team )
|
||
{
|
||
for( victim = 0; victim < NumPlayers; victim++ )
|
||
{
|
||
if ( BATTLE_Team[ victim ] != team )
|
||
{
|
||
killcount += WhoKilledWho[ killer ][ victim ];
|
||
}
|
||
else
|
||
{
|
||
suicidecount += WhoKilledWho[ killer ][ victim ];
|
||
}
|
||
}
|
||
}
|
||
}
|
||
|
||
// Draw kills
|
||
itoa( killcount, tempstr, 10 );
|
||
VW_MeasureIntensityPropString ( tempstr, &w, &h);
|
||
DrawIntensityString( BT_KILLS_X - w, py, tempstr, color );
|
||
|
||
// Draw suicides
|
||
itoa( suicidecount, tempstr, 10 );
|
||
VW_MeasureIntensityPropString ( tempstr, &w, &h);
|
||
DrawIntensityString( BT_DEATHS_X - w, py, tempstr, color );
|
||
}
|
||
|
||
// Draw Score
|
||
itoa( BATTLE_Points[ team ], tempstr, 10 );
|
||
VW_MeasureIntensityPropString ( tempstr, &w, &h);
|
||
DrawIntensityString( BT_SCORE_X - w, py, tempstr, color );
|
||
|
||
py += h;
|
||
}
|
||
}
|
||
|
||
|
||
void BattleLevelCompleted ( int localplayer )
|
||
{
|
||
ControlInfo ci;
|
||
int w;
|
||
int h;
|
||
int key;
|
||
int Screen;
|
||
int LastScreen;
|
||
int Player;
|
||
char text[80];
|
||
|
||
EnableScreenStretch();
|
||
|
||
IN_ClearKeysDown ();
|
||
|
||
Player = localplayer;
|
||
Screen = 1;
|
||
LastScreen = 0;
|
||
key = -1;
|
||
while( 1 )
|
||
{
|
||
if ( Screen != LastScreen )
|
||
{
|
||
VL_DrawPostPic (W_GetNumForName("trilogo"));
|
||
|
||
switch( Screen )
|
||
{
|
||
case 1 :
|
||
ShowEndScore( Player );
|
||
break;
|
||
|
||
case 2 :
|
||
ShowKills( Player );
|
||
break;
|
||
|
||
case 3 :
|
||
ShowDeaths( Player );
|
||
break;
|
||
}
|
||
|
||
CurrentFont = tinyfont;
|
||
|
||
sprintf ( text, "Page %d of 3. Use arrows to switch stats. "
|
||
"Press Esc to quit.", Screen );
|
||
VW_MeasurePropString ( text, &w, &h);
|
||
py = 192;
|
||
px = ( 320 - w ) / 2;
|
||
VWB_DrawPropString ( text );
|
||
VW_UpdateScreen ();
|
||
|
||
do
|
||
{
|
||
ReadAnyControl (&ci);
|
||
}
|
||
while( ci.dir == (dirtype)key );
|
||
}
|
||
|
||
LastScreen = Screen;
|
||
ReadAnyControl ( &ci );
|
||
key = ci.dir;
|
||
if ( ( Screen > 1 ) && ( key == dir_West ) )
|
||
{
|
||
Screen--;
|
||
MN_PlayMenuSnd (SD_MOVECURSORSND);
|
||
}
|
||
else if ( ( Screen < 3 ) && ( key == dir_East ) )
|
||
{
|
||
Screen++;
|
||
MN_PlayMenuSnd (SD_MOVECURSORSND);
|
||
}
|
||
// Allow us to select which player to view
|
||
if ( Keyboard[ sc_RShift ] && ( key == dir_South ) )
|
||
{
|
||
Player++;
|
||
if ( Player >= numplayers )
|
||
{
|
||
Player = 0;
|
||
}
|
||
LastScreen = 0;
|
||
MN_PlayMenuSnd (SD_SELECTSND);
|
||
}
|
||
|
||
if ( Keyboard[ sc_RShift ] && ( key == dir_North ) )
|
||
{
|
||
Player--;
|
||
if ( Player < 0 )
|
||
{
|
||
Player = numplayers - 1;
|
||
}
|
||
LastScreen = 0;
|
||
MN_PlayMenuSnd (SD_SELECTSND);
|
||
}
|
||
|
||
if ( Keyboard[sc_Escape] )
|
||
{
|
||
break;
|
||
}
|
||
}
|
||
|
||
while ( Keyboard[sc_Escape] )
|
||
{
|
||
IN_UpdateKeyboard ();
|
||
}
|
||
|
||
MN_PlayMenuSnd (SD_ESCPRESSEDSND);
|
||
|
||
CurrentFont = smallfont;
|
||
}
|
||
|
||
//==========================================================================
|
||
|
||
/*
|
||
==================
|
||
=
|
||
= FindAngleToWindow
|
||
=
|
||
==================
|
||
*/
|
||
int FindAngleToWindow ( int tx, int ty )
|
||
{
|
||
if (!IsWindow(tx+1,ty))
|
||
return ANG180;
|
||
else if (!IsWindow(tx-1,ty))
|
||
return 0;
|
||
else if (!IsWindow(tx,ty+1))
|
||
return ANG90;
|
||
else
|
||
return ANG270;
|
||
}
|
||
|
||
#define STARTRADIUS (0xa000)
|
||
#define STOPRADIUS (0x14000)
|
||
#define DEATHRADIUS (STOPRADIUS-STARTRADIUS)
|
||
#define ROTRATE (5)
|
||
#define TOTALDEATHROT (FINEANGLES<<1)
|
||
#define RADIUSINC ((DEATHRADIUS)/(TOTALDEATHROT))
|
||
|
||
/*
|
||
==================
|
||
=
|
||
= ZoomDeathOkay
|
||
=
|
||
==================
|
||
*/
|
||
boolean ZoomDeathOkay ( void )
|
||
{
|
||
int x,y;
|
||
int radius;
|
||
|
||
if (
|
||
!(
|
||
(player->state==&s_ashwait) ||
|
||
((player->flags & FL_HBM) && (gamestate.violence >= vl_high))
|
||
)
|
||
)
|
||
return false;
|
||
|
||
radius=STOPRADIUS;
|
||
x=player->x;
|
||
y=player->y;
|
||
while (radius>0)
|
||
{
|
||
if (tilemap[x>>16][(y+radius)>>16])
|
||
return false;
|
||
if (tilemap[x>>16][(y-radius)>>16])
|
||
return false;
|
||
if (tilemap[(x-radius)>>16][y>>16])
|
||
return false;
|
||
if (tilemap[(x+radius)>>16][y>>16])
|
||
return false;
|
||
if (tilemap[(x+radius)>>16][(y+radius)>>16])
|
||
return false;
|
||
if (tilemap[(x+radius)>>16][(y-radius)>>16])
|
||
return false;
|
||
if (tilemap[(x-radius)>>16][(y+radius)>>16])
|
||
return false;
|
||
if (tilemap[(x-radius)>>16][(y-radius)>>16])
|
||
return false;
|
||
radius-=0x10000;
|
||
}
|
||
return true;
|
||
}
|
||
|
||
/*
|
||
==================
|
||
=
|
||
= Died
|
||
=
|
||
==================
|
||
*/
|
||
|
||
#define DEATHROTATE 6
|
||
|
||
extern boolean dopefish;
|
||
void Died (void)
|
||
{
|
||
long dx,dy;
|
||
int iangle,curangle,clockwise,change;
|
||
int da;
|
||
int rate;
|
||
lbm_t *LBM;
|
||
int slowrate;
|
||
playertype *pstate;
|
||
objtype * killerobj=(objtype *)player->target;
|
||
player->yzangle=0;
|
||
|
||
if (killerobj == NULL)
|
||
killerobj = player;
|
||
|
||
if (CheckParm("slowdeath"))
|
||
slowrate=3;
|
||
else
|
||
slowrate=0;
|
||
|
||
M_LINKSTATE (player, pstate);
|
||
|
||
if ( (ZoomDeathOkay()==true) && (pstate->falling==false))
|
||
{
|
||
int x,y,z,radius,heightoffset;
|
||
int endangle,startangle,killangle;
|
||
boolean deadflagset;
|
||
objtype * dummy;
|
||
|
||
x=player->x;
|
||
y=player->y;
|
||
z=player->z;
|
||
dummy=player;
|
||
SpawnPlayerobj (x>>16, y>>16, 0, 0);
|
||
player=dummy;
|
||
dummy=new;
|
||
dummy->x=x;
|
||
dummy->drawx=x;
|
||
dummy->y=y;
|
||
dummy->z=z;
|
||
dummy->drawy=y;
|
||
dummy->flags=player->flags;
|
||
player->momentumx=0;
|
||
player->momentumy=0;
|
||
player->speed=0;
|
||
radius=STARTRADIUS;
|
||
heightoffset=pstate->heightoffset;
|
||
deadflagset=false;
|
||
startangle=(player->angle+ANG180)&(FINEANGLES-1);
|
||
endangle=startangle+TOTALDEATHROT;
|
||
killangle=startangle+(TOTALDEATHROT>>1);
|
||
if (dopefish==true)
|
||
{
|
||
AddMessage("Dopefish Death Cam",MSG_SYSTEM);
|
||
}
|
||
for (iangle=startangle;;)
|
||
{
|
||
if ( iangle > killangle )
|
||
{
|
||
if ( deadflagset==false )
|
||
{
|
||
dummy->hitpoints=0;
|
||
pstate->health=0;
|
||
dummy->flags &= ~FL_DYING;
|
||
dummy->flags |= FL_SHOOTABLE;
|
||
if (player->state==&s_ashwait)
|
||
dummy->flags |= FL_SKELETON;
|
||
Collision(dummy,(objtype*)NULL,0,0);
|
||
deadflagset=true;
|
||
if ( ( killerobj==player ) && ( gamestate.violence >=
|
||
vl_high ) && ( gamestate.difficulty >= gd_hard ) )
|
||
{
|
||
SD_Play( SD_YOUSUCKSND );
|
||
}
|
||
else
|
||
{
|
||
SD_Play (SD_PLAYERTCDEATHSND+(pstate->player));
|
||
}
|
||
}
|
||
}
|
||
else
|
||
{
|
||
dummy->flags &= ~FL_DYING;
|
||
}
|
||
if (dopefish==true)
|
||
{
|
||
dummy->momentumx+=(RandomNumber("Died",0)<<6)-(256<<5);
|
||
dummy->momentumy+=(RandomNumber("Died",0)<<6)-(256<<5);
|
||
}
|
||
player->x=x+FixedMul(radius,costable[iangle&(FINEANGLES-1)]);
|
||
player->y=y-FixedMul(radius,sintable[iangle&(FINEANGLES-1)]);
|
||
player->z=dummy->z;
|
||
player->angle=(iangle+ANG180)&(FINEANGLES-1);
|
||
if (dopefish==true)
|
||
{
|
||
int dx,dy;
|
||
|
||
dx = dummy->x - player->x;
|
||
dy = player->y - dummy->y;
|
||
|
||
if (dx && dy)
|
||
player->angle = atan2_appx (dx,dy);
|
||
}
|
||
pstate->heightoffset=heightoffset;
|
||
player->yzangle=0;
|
||
UpdateGameObjects();
|
||
player->momentumx=0;
|
||
player->momentumy=0;
|
||
player->speed=0;
|
||
ThreeDRefresh ();
|
||
AnimateWalls();
|
||
DoSprites();
|
||
DoAnimatedMaskedWalls();
|
||
UpdatePlayers();
|
||
UpdateLightLevel(player->areanumber);
|
||
|
||
if (iangle<endangle)
|
||
{
|
||
iangle+=(tics<<ROTRATE);
|
||
radius+=tics*(RADIUSINC<<ROTRATE);
|
||
}
|
||
if ( (dummy->state==dummy->state->next) && (iangle>=endangle) )
|
||
break;
|
||
}
|
||
}
|
||
else if (pstate->falling==false)
|
||
{
|
||
|
||
//
|
||
// swing around to face attacker
|
||
//
|
||
|
||
rate=DEATHROTATE-slowrate;
|
||
{
|
||
if (killerobj==player)
|
||
{
|
||
iangle=player->angle;
|
||
if ( ( gamestate.violence >= vl_high ) &&
|
||
( gamestate.difficulty >= gd_hard ) )
|
||
{
|
||
SD_Play( SD_YOUSUCKSND );
|
||
}
|
||
}
|
||
else
|
||
{
|
||
SD_Play (SD_PLAYERTCDEATHSND+(pstate->player));
|
||
if (killerobj->which==PWALL)
|
||
{
|
||
dx = ((pwallobj_t *)killerobj)->x - player->x;
|
||
dy = player->y - ((pwallobj_t *)killerobj)->y;
|
||
}
|
||
else
|
||
{
|
||
dx = killerobj->x - player->x;
|
||
dy = player->y - killerobj->y;
|
||
}
|
||
|
||
iangle = atan2_appx (dx,dy); // returns -pi to pi
|
||
}
|
||
}
|
||
|
||
da = iangle-player->angle;
|
||
|
||
if (da>0)
|
||
clockwise=1;
|
||
else
|
||
clockwise=0;
|
||
da=abs(da);
|
||
if (da>ANG180)
|
||
{
|
||
clockwise^=1;
|
||
da=ANGLES-da;
|
||
}
|
||
|
||
curangle = player->angle;
|
||
|
||
do
|
||
{
|
||
DoBorderShifts ();
|
||
change = tics<<rate;
|
||
if (clockwise==1)
|
||
curangle+=change;
|
||
else
|
||
curangle-=change;
|
||
da-=change;
|
||
if (curangle >= ANGLES)
|
||
curangle -= ANGLES;
|
||
if (curangle < 0)
|
||
curangle += ANGLES;
|
||
player->angle = (curangle & (FINEANGLES-1));
|
||
ThreeDRefresh ();
|
||
CalcTics ();
|
||
} while (da>0);
|
||
}
|
||
else
|
||
{
|
||
DrawFullSky();
|
||
FlipPage();
|
||
}
|
||
|
||
while (damagecount)
|
||
DoBorderShifts ();
|
||
DoBorderShifts ();
|
||
|
||
locplayerstate->weapon = -1; // take away weapon
|
||
|
||
if (
|
||
(tedlevel == false) && // SO'S YA DON'T GET KILLED WHILE LAUNCHING!
|
||
(timelimitenabled == false)
|
||
)
|
||
locplayerstate->lives--;
|
||
|
||
if (pstate->falling==false)
|
||
{
|
||
ThreeDRefresh ();
|
||
}
|
||
|
||
FlipPage();
|
||
FlipPage();
|
||
|
||
if (locplayerstate->lives > -1)
|
||
{
|
||
int rng;
|
||
|
||
rng = RandomNumber ("Died",0);
|
||
|
||
if (pstate->falling==true)
|
||
{
|
||
RotateBuffer (0, 0, (FINEANGLES), (FINEANGLES>>6), (VBLCOUNTER*(1+slowrate)));
|
||
SD_Play (SD_PLAYERTCDEATHSND+(pstate->player));
|
||
pstate->falling=false;
|
||
}
|
||
|
||
else if (rng < 64)
|
||
RotateBuffer (0, 0, (FINEANGLES), (FINEANGLES*64), (VBLCOUNTER*(2+slowrate)));
|
||
else if (rng < 128)
|
||
{
|
||
RotateBuffer (0, 0, (FINEANGLES), (FINEANGLES>>6), (VBLCOUNTER*(1+slowrate)));
|
||
}
|
||
else if (rng < 192)
|
||
RotateBuffer(0, (FINEANGLES*4), (FINEANGLES), (FINEANGLES*64), (VBLCOUNTER*(3+slowrate)));
|
||
else
|
||
VL_FadeToColor (VBLCOUNTER*2, 100, 0, 0);
|
||
|
||
screenfaded=false;
|
||
|
||
VL_FadeOut (0, 255, 0,0,0,VBLCOUNTER>>1);
|
||
gamestate.episode = 1;
|
||
player->flags &= ~FL_DONE;
|
||
|
||
InitializeWeapons (locplayerstate);
|
||
ResetPlayerstate(locplayerstate);
|
||
|
||
UpdateLives (locplayerstate->lives);
|
||
UpdateScore (gamestate.score);
|
||
|
||
DrawTriads(true);
|
||
DrawLives (true);
|
||
DrawKeys (true);
|
||
DrawScore (true);
|
||
}
|
||
else
|
||
{
|
||
int rng;
|
||
|
||
SD_Play (SD_GAMEOVERSND);
|
||
rng=RandomNumber("Died",0);
|
||
if (rng<64)
|
||
RotateBuffer(0,(FINEANGLES>>1),(FINEANGLES),(FINEANGLES*64),(VBLCOUNTER*(3+slowrate)));
|
||
else if (rng<128)
|
||
VL_FadeToColor (VBLCOUNTER*3, 255, 255, 255);
|
||
else if (rng<192)
|
||
RotateBuffer(0,(FINEANGLES*2),(FINEANGLES),(FINEANGLES*64),(VBLCOUNTER*(3+slowrate)));
|
||
else
|
||
RotateBuffer(0,(FINEANGLES*2),(FINEANGLES),(FINEANGLES*64),(VBLCOUNTER*(3+slowrate)));
|
||
|
||
screenfaded=false;
|
||
|
||
VL_FadeOut (0, 255, 0,0,0,VBLCOUNTER>>1);
|
||
|
||
MU_StartSong(song_gameover);
|
||
|
||
#if (SHAREWARE==0)
|
||
if (gamestate.violence==vl_excessive)
|
||
LBM = (lbm_t *) W_CacheLumpNum (W_GetNumForName ("bootblod"), PU_CACHE, Cvt_lbm_t, 1);
|
||
else
|
||
LBM = (lbm_t *) W_CacheLumpNum (W_GetNumForName ("bootnorm"), PU_CACHE, Cvt_lbm_t, 1);
|
||
#else
|
||
LBM = (lbm_t *) W_CacheLumpNum (W_GetNumForName ("bootblod"), PU_CACHE, Cvt_lbm_t, 1);
|
||
#endif
|
||
VL_DecompressLBM (LBM,true);
|
||
|
||
StopWind();
|
||
|
||
IN_UserInput (VBLCOUNTER*60);
|
||
|
||
MainMenu[savegame].active = 0;
|
||
MainMenu[viewscores].routine = (void *)CP_ViewScores;
|
||
MainMenu[viewscores].texture[6] = '7';
|
||
MainMenu[viewscores].texture[7] = '\0';
|
||
MainMenu[viewscores].letter = 'V';
|
||
}
|
||
ClearGraphicsScreen();
|
||
|
||
VL_FadeIn (0, 255, origpal, 15);
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DoLoadGameAction ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
static byte whichstr = 0;
|
||
|
||
void DoLoadGameAction (void)
|
||
{
|
||
if ((SaveTime+1) < GetTicCount())
|
||
{
|
||
byte *temp = bufferofs;
|
||
|
||
bufferofs = displayofs;
|
||
SaveTime = GetTicCount();
|
||
|
||
CurrentFont=tinyfont;
|
||
|
||
px = 92;
|
||
py = 152;
|
||
if (whichstr)
|
||
{
|
||
// VW_DrawPropString ("<22>");
|
||
VW_DrawPropString (".");
|
||
whichstr = 0;
|
||
}
|
||
else
|
||
{
|
||
// VW_DrawPropString ("<22>");
|
||
VW_DrawPropString (".");
|
||
whichstr = 1;
|
||
}
|
||
bufferofs = temp;
|
||
}
|
||
}
|
||
|
||
//******************************************************************************
|
||
//
|
||
// DoCheckSum ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
long DoCheckSum (byte *source, int size, long csum)
|
||
{
|
||
int i;
|
||
long checksum;
|
||
|
||
checksum = csum;
|
||
|
||
for (i = 0; i < size; i++)
|
||
checksum=updatecrc(checksum,*(source+i));
|
||
|
||
return checksum;
|
||
}
|
||
|
||
//******************************************************************************
|
||
//
|
||
// CaculateSaveGameCheckSum ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
#define SAVECHECKSUMSIZE (10000)
|
||
long CalculateSaveGameCheckSum (char * filename)
|
||
{
|
||
int handle;
|
||
int lengthleft;
|
||
int length;
|
||
byte * altbuffer;
|
||
long checksum;
|
||
|
||
altbuffer=SafeMalloc(SAVECHECKSUMSIZE);
|
||
|
||
checksum = 0;
|
||
|
||
// Open the savegame file
|
||
|
||
handle = SafeOpenRead (filename);
|
||
lengthleft = filelength (handle);
|
||
|
||
while (lengthleft>0)
|
||
{
|
||
length=SAVECHECKSUMSIZE;
|
||
if (length>lengthleft)
|
||
length=lengthleft;
|
||
|
||
SafeRead(handle,altbuffer,length);
|
||
checksum = DoCheckSum (altbuffer, length, checksum);
|
||
|
||
lengthleft-=length;
|
||
}
|
||
|
||
SafeFree(altbuffer);
|
||
|
||
close (handle);
|
||
|
||
return checksum;
|
||
}
|
||
|
||
//******************************************************************************
|
||
//
|
||
// StoreBuffer
|
||
//
|
||
//******************************************************************************
|
||
void StoreBuffer (int handle, byte * src, int size)
|
||
{
|
||
SafeWrite(handle,&size,sizeof(size));
|
||
SafeWrite(handle,src,size);
|
||
}
|
||
|
||
//******************************************************************************
|
||
//
|
||
// SaveTag
|
||
//
|
||
//******************************************************************************
|
||
void SaveTag (int handle, char * tag, int size)
|
||
{
|
||
SafeWrite(handle,tag,size);
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// SaveTheGame ()
|
||
//
|
||
// Expects game to be premalloced
|
||
//
|
||
//******************************************************************************
|
||
|
||
boolean SaveTheGame (int num, gamestorage_t * game)
|
||
{
|
||
char loadname[MAX_PATH]="rottgam0.rot";
|
||
char filename[MAX_PATH];
|
||
byte * altbuffer;
|
||
int size;
|
||
int avail;
|
||
int savehandle;
|
||
int crc;
|
||
int i;
|
||
char letter;
|
||
int myticcount;
|
||
|
||
if (num > 15 || num < 0)
|
||
Error("Illegal Saved game value=%d\n",num);
|
||
|
||
//
|
||
// Save Alternate Game Level information for reloading game
|
||
//
|
||
memset (&game->info, 0, sizeof (game->info));
|
||
if (GameLevels.avail == true)
|
||
{
|
||
memcpy (&game->info.path[0], &GameLevels.path[0], sizeof (GameLevels.path));
|
||
memcpy (&game->info.file[0], &GameLevels.file[0], sizeof (GameLevels.file));
|
||
game->info.avail = true;
|
||
}
|
||
|
||
game->mapcrc=GetMapCRC (gamestate.mapon);
|
||
|
||
// Create the proper file name
|
||
|
||
itoa(num,&loadname[7],16);
|
||
loadname[8]='.';
|
||
|
||
|
||
GetPathFromEnvironment( filename, ApogeePath, loadname );
|
||
|
||
#if PLATFORM_DOS
|
||
{
|
||
struct diskfree_t dfree;
|
||
// Determine available disk space
|
||
letter = toupper(filename[0]);
|
||
if (
|
||
(letter >= 'A') &&
|
||
(letter <= 'Q')
|
||
)
|
||
{
|
||
if (_dos_getdiskfree ((letter-'A'+1), &dfree))
|
||
Error ("Error in _dos_getdiskfree call\n");
|
||
}
|
||
else
|
||
{
|
||
if (_dos_getdiskfree (0, &dfree))
|
||
Error ("Error in _dos_getdiskfree call\n");
|
||
}
|
||
|
||
avail = (int) dfree.avail_clusters *
|
||
dfree.bytes_per_sector *
|
||
dfree.sectors_per_cluster;
|
||
avail -= 8192;
|
||
|
||
// Check to see if we have enough
|
||
|
||
if (avail < MAXSAVEDGAMESIZE)
|
||
{
|
||
CP_DisplayMsg ("There is not enough\nspace on your disk\nto Save Game!\nPress any key to continue", 13);
|
||
return (false);
|
||
}
|
||
}
|
||
#endif
|
||
|
||
// Open the savegame file
|
||
|
||
savehandle = SafeOpenWrite (filename);
|
||
|
||
// Save out file tag
|
||
|
||
size=4;
|
||
SaveTag(savehandle,"ROTT",size);
|
||
|
||
// Save out header
|
||
|
||
size=sizeof(*game);
|
||
|
||
SafeWrite(savehandle,game,size);
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
// Save out rest of save game file beyond this point
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
|
||
// Door Tag
|
||
|
||
size=4;
|
||
SaveTag(savehandle,"DOOR",size);
|
||
|
||
// Doors
|
||
|
||
SaveDoors(&altbuffer,&size);
|
||
StoreBuffer(savehandle,altbuffer,size);
|
||
SafeFree(altbuffer);
|
||
|
||
// Elevator Tag
|
||
|
||
size = 9;
|
||
SaveTag(savehandle,"ELEVATORS",size);
|
||
|
||
// Elevators
|
||
|
||
SaveElevators(&altbuffer,&size);
|
||
StoreBuffer(savehandle,altbuffer,size);
|
||
SafeFree(altbuffer);
|
||
|
||
// Pushwall Tag
|
||
|
||
size=5;
|
||
SaveTag(savehandle,"PWALL",size);
|
||
|
||
// PushWalls
|
||
|
||
SavePushWalls(&altbuffer,&size);
|
||
StoreBuffer(savehandle,altbuffer,size);
|
||
SafeFree(altbuffer);
|
||
|
||
// MaskedWalls Tag
|
||
|
||
size=5;
|
||
SaveTag(savehandle,"MWALL",size);
|
||
|
||
// Masked Walls
|
||
|
||
SaveMaskedWalls(&altbuffer,&size);
|
||
StoreBuffer(savehandle,altbuffer,size);
|
||
SafeFree(altbuffer);
|
||
|
||
// Switches Tag
|
||
|
||
size=6;
|
||
SaveTag(savehandle,"SWITCH",size);
|
||
|
||
// Switches
|
||
|
||
SaveSwitches(&altbuffer,&size);
|
||
StoreBuffer(savehandle,altbuffer,size);
|
||
SafeFree(altbuffer);
|
||
|
||
// Statics Tag
|
||
|
||
size=6;
|
||
SaveTag(savehandle,"STATIC",size);
|
||
|
||
// Statics
|
||
|
||
SaveStatics(&altbuffer,&size);
|
||
StoreBuffer(savehandle,altbuffer,size);
|
||
SafeFree(altbuffer);
|
||
|
||
// Actors Tag
|
||
|
||
size=5;
|
||
SaveTag(savehandle,"ACTOR",size);
|
||
|
||
// Actors
|
||
|
||
SaveActors(&altbuffer,&size);
|
||
StoreBuffer(savehandle,altbuffer,size);
|
||
SafeFree(altbuffer);
|
||
|
||
// TouchPlates Tag
|
||
|
||
size=5;
|
||
SaveTag(savehandle,"TOUCH",size);
|
||
|
||
// TouchPlates
|
||
|
||
SaveTouchPlates(&altbuffer,&size);
|
||
StoreBuffer(savehandle,altbuffer,size);
|
||
SafeFree(altbuffer);
|
||
|
||
// GameState Tag
|
||
|
||
size=9;
|
||
SaveTag(savehandle,"GAMESTATE",size);
|
||
|
||
// GameState
|
||
|
||
size=sizeof(gamestate);
|
||
SafeWrite(savehandle,&gamestate,size);
|
||
|
||
// PlayerState Tag
|
||
|
||
size=12;
|
||
SaveTag(savehandle,"PLAYERSTATES",size);
|
||
|
||
// PlayerStates
|
||
size=sizeof(playertype);
|
||
for(i=0;i<numplayers;i++)
|
||
{
|
||
SafeWrite(savehandle,&PLAYERSTATE[i],size);
|
||
}
|
||
|
||
// Mapseen Tag
|
||
|
||
size=7;
|
||
SaveTag(savehandle,"MAPSEEN",size);
|
||
|
||
// MapSeen
|
||
|
||
size=sizeof(mapseen);
|
||
SafeWrite(savehandle,&mapseen,size);
|
||
|
||
// Song Tag
|
||
|
||
size=4;
|
||
SaveTag(savehandle,"SONG",size);
|
||
|
||
// Song info
|
||
|
||
MU_SaveMusic(&altbuffer,&size);
|
||
StoreBuffer(savehandle,altbuffer,size);
|
||
SafeFree(altbuffer);
|
||
|
||
// Misc Tag
|
||
|
||
size=4;
|
||
SaveTag(savehandle,"MISC",size);
|
||
|
||
// Misc
|
||
|
||
// ticcount
|
||
myticcount = GetTicCount();
|
||
size=sizeof(myticcount);
|
||
SafeWrite(savehandle,&myticcount,size);
|
||
|
||
// shaketics
|
||
size=sizeof(SHAKETICS);
|
||
SafeWrite(savehandle,&SHAKETICS,size);
|
||
|
||
// damagecount
|
||
size=sizeof(damagecount);
|
||
SafeWrite(savehandle,&damagecount,size);
|
||
|
||
// viewsize
|
||
size=sizeof(viewsize);
|
||
SafeWrite(savehandle,&viewsize,size);
|
||
|
||
// poweruptimes
|
||
size = sizeof (poweruptime);
|
||
SafeWrite(savehandle,&poweruptime,size);
|
||
|
||
size = sizeof (protectiontime);
|
||
SafeWrite(savehandle,&protectiontime,size);
|
||
|
||
size = sizeof (powerupheight);
|
||
SafeWrite(savehandle,&powerupheight,size);
|
||
|
||
size = sizeof (protectionheight);
|
||
SafeWrite(savehandle,&protectionheight,size);
|
||
|
||
size = sizeof (poweradjust);
|
||
SafeWrite(savehandle,&poweradjust,size);
|
||
|
||
close (savehandle);
|
||
|
||
// Calculate CRC
|
||
|
||
crc = CalculateSaveGameCheckSum (filename);
|
||
|
||
// Append the crc
|
||
|
||
savehandle = SafeOpenAppend (filename);
|
||
|
||
size=sizeof(crc);
|
||
SafeWrite(savehandle,&crc,size);
|
||
|
||
close (savehandle);
|
||
|
||
pickquick = true;
|
||
return (true);
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// LoadTag
|
||
//
|
||
//******************************************************************************
|
||
|
||
void LoadTag (byte ** src, char * tag, int size)
|
||
{
|
||
if (StringsNotEqual((char *)*src,(char *)tag,size)==true)
|
||
Error("Could not locate %s header in saved game file\n",tag);
|
||
*src+=size;
|
||
}
|
||
|
||
//******************************************************************************
|
||
//
|
||
// LoadBuffer
|
||
//
|
||
//******************************************************************************
|
||
int LoadBuffer (byte ** dest, byte ** src)
|
||
{
|
||
int size;
|
||
|
||
memcpy(&size,*src,sizeof(size));
|
||
*src+=sizeof(size);
|
||
*dest=SafeMalloc(size);
|
||
memcpy(*dest,*src,size);
|
||
*src+=size;
|
||
return size;
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// LoadTheGame ()
|
||
//
|
||
// Expects game to be premalloced
|
||
//
|
||
//******************************************************************************
|
||
|
||
boolean LoadTheGame (int num, gamestorage_t * game)
|
||
{
|
||
char loadname[45]="rottgam0.rot";
|
||
char filename[128];
|
||
byte * loadbuffer;
|
||
byte * bufptr;
|
||
byte * altbuffer;
|
||
int size;
|
||
int totalsize;
|
||
int checksum;
|
||
int savedchecksum;
|
||
int i;
|
||
word mapcrc;
|
||
int myticcount;
|
||
|
||
if (num>15 || num<0)
|
||
Error("Illegal Load game value=%d\n",num);
|
||
|
||
// Create the proper file name
|
||
|
||
itoa(num,&loadname[7],16);
|
||
loadname[8]='.';
|
||
|
||
GetPathFromEnvironment( filename, ApogeePath, loadname );
|
||
|
||
// Load the file
|
||
|
||
totalsize=LoadFile(filename,(void **)&loadbuffer);
|
||
bufptr=loadbuffer;
|
||
|
||
// Calculate checksum
|
||
|
||
checksum = DoCheckSum (loadbuffer, totalsize-sizeof(checksum), 0);
|
||
|
||
// Retrieve saved checksum
|
||
|
||
memcpy (&savedchecksum,loadbuffer+(totalsize-sizeof(savedchecksum)),sizeof(savedchecksum));
|
||
|
||
// Compare the two checksums;
|
||
|
||
if (checksum!=savedchecksum)
|
||
{
|
||
if (CP_DisplayMsg ("Your Saved Game file is\n"
|
||
"shall we say, \"corrupted\".\n"
|
||
"Would you like to\n"
|
||
"continue anyway (Y/N)?\n", 12)==false)
|
||
{
|
||
return false;
|
||
}
|
||
}
|
||
|
||
// Load in file tag
|
||
|
||
size=4;
|
||
LoadTag(&bufptr,"ROTT",size);
|
||
|
||
// Load in header
|
||
|
||
size=sizeof(*game);
|
||
memcpy(game,bufptr,size);
|
||
bufptr+=size;
|
||
|
||
if (game->version!=ROTTVERSION)
|
||
return false;
|
||
|
||
memcpy (&GameLevels, &game->info, sizeof (GameLevels));
|
||
|
||
gamestate.episode=game->episode;
|
||
gamestate.mapon=game->area;
|
||
|
||
mapcrc=GetMapCRC (gamestate.mapon);
|
||
|
||
if (mapcrc!=game->mapcrc)
|
||
return false;
|
||
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
// Load in rest of saved game file beyond this point
|
||
/////////////////////////////////////////////////////////////////////////////
|
||
|
||
// Free up the current level
|
||
Z_FreeTags (PU_LEVELSTRUCT, PU_LEVELEND); // Free current level
|
||
|
||
gamestate.battlemode = battle_StandAloneGame;
|
||
BATTLE_SetOptions( &BATTLE_Options[ battle_StandAloneGame ] );
|
||
BATTLE_Init( gamestate.battlemode, 1 );
|
||
|
||
DoLoadGameAction ();
|
||
SetupGameLevel();
|
||
|
||
// This prevents a nasty glitch when loading some saved games
|
||
PreCacheGroup(W_GetNumForName("BULLETHO"),W_GetNumForName("ALTBHO"),cache_transpatch_t);
|
||
|
||
// Door Tag
|
||
|
||
size=4;
|
||
LoadTag(&bufptr,"DOOR",size);
|
||
|
||
// Doors
|
||
|
||
DoLoadGameAction ();
|
||
size=LoadBuffer(&altbuffer,&bufptr);
|
||
LoadDoors(altbuffer,size);
|
||
SafeFree(altbuffer);
|
||
|
||
// Elevator Tag
|
||
|
||
size = 9;
|
||
LoadTag(&bufptr,"ELEVATORS",size);
|
||
|
||
|
||
// Elevators
|
||
|
||
DoLoadGameAction ();
|
||
size=LoadBuffer(&altbuffer,&bufptr);
|
||
LoadElevators(altbuffer,size);
|
||
SafeFree(altbuffer);
|
||
|
||
// Pushwall Tag
|
||
|
||
size=5;
|
||
LoadTag(&bufptr,"PWALL",size);
|
||
|
||
// PushWalls
|
||
|
||
DoLoadGameAction ();
|
||
size=LoadBuffer(&altbuffer,&bufptr);
|
||
LoadPushWalls(altbuffer,size);
|
||
SafeFree(altbuffer);
|
||
#if 0
|
||
// Animated Walls Tag
|
||
|
||
size=5;
|
||
LoadTag(&bufptr,"AWALL",size);
|
||
|
||
// Animated Walls
|
||
size=LoadBuffer(&altbuffer,&bufptr);
|
||
LoadAnimWalls(altbuffer,size);
|
||
SafeFree(altbuffer);
|
||
#endif
|
||
|
||
// MaskedWalls Tag
|
||
|
||
size=5;
|
||
LoadTag(&bufptr,"MWALL",size);
|
||
|
||
// Masked Walls
|
||
|
||
DoLoadGameAction ();
|
||
size=LoadBuffer(&altbuffer,&bufptr);
|
||
LoadMaskedWalls(altbuffer,size);
|
||
SafeFree(altbuffer);
|
||
|
||
// Switches Tag
|
||
|
||
size=6;
|
||
LoadTag(&bufptr,"SWITCH",size);
|
||
|
||
// Switches
|
||
|
||
DoLoadGameAction ();
|
||
size=LoadBuffer(&altbuffer,&bufptr);
|
||
LoadSwitches(altbuffer,size);
|
||
SafeFree(altbuffer);
|
||
|
||
|
||
// Statics Tag
|
||
|
||
size=6;
|
||
LoadTag(&bufptr,"STATIC",size);
|
||
|
||
// Statics
|
||
|
||
DoLoadGameAction ();
|
||
size=LoadBuffer(&altbuffer,&bufptr);
|
||
LoadStatics(altbuffer,size);
|
||
SafeFree(altbuffer);
|
||
|
||
// Actors Tag
|
||
|
||
size=5;
|
||
LoadTag(&bufptr,"ACTOR",size);
|
||
|
||
// Actors
|
||
|
||
DoLoadGameAction ();
|
||
size=LoadBuffer(&altbuffer,&bufptr);
|
||
LoadActors(altbuffer,size);
|
||
SafeFree(altbuffer);
|
||
|
||
// TouchPlates Tag
|
||
|
||
size=5;
|
||
LoadTag(&bufptr,"TOUCH",size);
|
||
|
||
// TouchPlates
|
||
|
||
DoLoadGameAction ();
|
||
size=LoadBuffer(&altbuffer,&bufptr);
|
||
LoadTouchPlates(altbuffer,size);
|
||
SafeFree(altbuffer);
|
||
|
||
// SetupWindows
|
||
|
||
SetupWindows();
|
||
|
||
// GameState Tag
|
||
|
||
size=9;
|
||
LoadTag(&bufptr,"GAMESTATE",size);
|
||
|
||
// GameState
|
||
|
||
DoLoadGameAction ();
|
||
size=sizeof(gamestate);
|
||
memcpy(&gamestate,bufptr,size);
|
||
bufptr+=size;
|
||
|
||
// PlayerState Tag
|
||
|
||
size=12;
|
||
LoadTag(&bufptr,"PLAYERSTATES",size);
|
||
|
||
// PlayerState
|
||
|
||
DoLoadGameAction ();
|
||
size=sizeof(playertype);
|
||
for(i=0;i<numplayers;i++)
|
||
{memcpy(&PLAYERSTATE[i],bufptr,size);
|
||
bufptr+=size;
|
||
}
|
||
|
||
// Zero out player targets
|
||
|
||
locplayerstate->guntarget=0;
|
||
locplayerstate->targettime=0;
|
||
|
||
// Mapseen Tag
|
||
|
||
size=7;
|
||
LoadTag(&bufptr,"MAPSEEN",size);
|
||
|
||
// MapSeen
|
||
|
||
DoLoadGameAction ();
|
||
size=sizeof(mapseen);
|
||
memcpy(&mapseen,bufptr,size);
|
||
bufptr+=size;
|
||
|
||
// Song Tag
|
||
|
||
size=4;
|
||
LoadTag(&bufptr,"SONG",size);
|
||
|
||
// Song info
|
||
|
||
DoLoadGameAction ();
|
||
size=LoadBuffer(&altbuffer,&bufptr);
|
||
MU_LoadMusic(altbuffer,size);
|
||
SafeFree(altbuffer);
|
||
|
||
// Misc Tag
|
||
|
||
size=4;
|
||
LoadTag(&bufptr,"MISC",size);
|
||
|
||
// Misc
|
||
|
||
// ticcount
|
||
DoLoadGameAction ();
|
||
size=sizeof(myticcount);
|
||
memcpy((void *)&myticcount,bufptr,size);
|
||
bufptr+=size;
|
||
SaveTime = myticcount;
|
||
ISR_SetTime(myticcount);
|
||
|
||
// shaketics
|
||
DoLoadGameAction ();
|
||
size=sizeof(SHAKETICS);
|
||
memcpy(&SHAKETICS,bufptr,size);
|
||
bufptr+=size;
|
||
|
||
// damagecount
|
||
DoLoadGameAction ();
|
||
size=sizeof(damagecount);
|
||
memcpy(&damagecount,bufptr,size);
|
||
bufptr+=size;
|
||
|
||
// viewsize
|
||
DoLoadGameAction ();
|
||
size=sizeof(viewsize);
|
||
memcpy(&viewsize,bufptr,size);
|
||
bufptr+=size;
|
||
|
||
// powerup times
|
||
DoLoadGameAction ();
|
||
size = sizeof (poweruptime);
|
||
memcpy (&poweruptime, bufptr, size);
|
||
bufptr += size;
|
||
size = sizeof (protectiontime);
|
||
memcpy (&protectiontime, bufptr, size);
|
||
bufptr += size;
|
||
size = sizeof (powerupheight);
|
||
memcpy (&powerupheight, bufptr, size);
|
||
bufptr += size;
|
||
size = sizeof (protectionheight);
|
||
memcpy (&protectionheight, bufptr, size);
|
||
bufptr += size;
|
||
size = sizeof (poweradjust);
|
||
memcpy (&poweradjust, bufptr, size);
|
||
bufptr += size;
|
||
|
||
// Set the viewsize
|
||
|
||
SetViewSize(viewsize);
|
||
DoLoadGameAction ();
|
||
|
||
// Connect areas
|
||
|
||
ConnectAreas ();
|
||
DoLoadGameAction ();
|
||
|
||
// Free up the loadbuffer
|
||
|
||
SafeFree (loadbuffer);
|
||
DoLoadGameAction ();
|
||
|
||
Illuminate();
|
||
|
||
IN_UpdateKeyboard ();
|
||
LoadPlayer ();
|
||
DoLoadGameAction ();
|
||
SetupPlayScreen();
|
||
UpdateScore (gamestate.score);
|
||
UpdateLives (locplayerstate->lives);
|
||
UpdateTriads (player, 0);
|
||
PreCache ();
|
||
InitializeMessages();
|
||
|
||
for (i=0;i<100;i++)
|
||
UpdateLightLevel(player->areanumber);
|
||
|
||
CalcTics();
|
||
CalcTics();
|
||
|
||
pickquick = true;
|
||
|
||
return (true);
|
||
}
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// GetSavedMessage ()
|
||
//
|
||
// Expects message to be premalloced
|
||
//
|
||
//******************************************************************************
|
||
|
||
void GetSavedMessage (int num, char * message)
|
||
{
|
||
gamestorage_t game;
|
||
char loadname[45]="rottgam0.rot";
|
||
char filename[128];
|
||
byte * loadbuffer;
|
||
byte * bufptr;
|
||
int size;
|
||
|
||
if (num>15 || num<0)
|
||
Error("Illegal Load game value=%d\n",num);
|
||
|
||
// Create the proper file name
|
||
|
||
itoa(num,&loadname[7],16);
|
||
loadname[8]='.';
|
||
|
||
GetPathFromEnvironment( filename, ApogeePath, loadname );
|
||
|
||
// Load the file
|
||
|
||
size=LoadFile(filename,(void **)&loadbuffer);
|
||
bufptr=loadbuffer;
|
||
|
||
size=4;
|
||
LoadTag(&bufptr,"ROTT",size);
|
||
|
||
// Load in header
|
||
|
||
size=sizeof(game);
|
||
memcpy(&game,bufptr,size);
|
||
strcpy(message,game.message);
|
||
SafeFree(loadbuffer);
|
||
}
|
||
|
||
//******************************************************************************
|
||
//
|
||
// GetSavedHeader ()
|
||
//
|
||
// Expects game to be premalloced
|
||
//
|
||
//******************************************************************************
|
||
|
||
void GetSavedHeader (int num, gamestorage_t * game)
|
||
{
|
||
char loadname[45]="rottgam0.rot";
|
||
char filename[128];
|
||
byte * loadbuffer;
|
||
byte * bufptr;
|
||
int size;
|
||
|
||
if (num>15 || num<0)
|
||
Error("Illegal Load game value=%d\n",num);
|
||
|
||
// Create the proper file name
|
||
|
||
itoa(num,&loadname[7],16);
|
||
loadname[8]='.';
|
||
|
||
GetPathFromEnvironment( filename, ApogeePath, loadname );
|
||
|
||
// Load the file
|
||
|
||
size=LoadFile(filename, (void **)&loadbuffer);
|
||
bufptr=loadbuffer;
|
||
|
||
size=4;
|
||
LoadTag(&bufptr,"ROTT",size);
|
||
|
||
// Load in header
|
||
|
||
size=sizeof(*game);
|
||
memcpy(game,bufptr,size);
|
||
SafeFree(loadbuffer);
|
||
}
|
||
|
||
|
||
|
||
//******************************************************************************
|
||
//
|
||
// GetLevel ()
|
||
//
|
||
//******************************************************************************
|
||
|
||
int GetLevel (int episode, int mapon)
|
||
{
|
||
int level;
|
||
|
||
level = (mapon+1) - ((episode-1) << 3);
|
||
|
||
return (level);
|
||
}
|