3995 lines
110 KiB
C
3995 lines
110 KiB
C
/***************************************************************************/
|
|
/* */
|
|
/* */
|
|
/* Raven 3D Engine */
|
|
/* Copyright (C) 1996 by Softdisk Publishing */
|
|
/* */
|
|
/* Original Design: */
|
|
/* John Carmack of id Software */
|
|
/* */
|
|
/* Enhancements by: */
|
|
/* Robert Morgan of Channel 7............................Main Engine Code */
|
|
/* Todd Lewis of Softdisk Publishing......Tools,Utilities,Special Effects */
|
|
/* John Bianca of Softdisk Publishing..............Low-level Optimization */
|
|
/* Carlos Hasan..........................................Music/Sound Code */
|
|
/* */
|
|
/* */
|
|
/***************************************************************************/
|
|
|
|
#include <DOS.H>
|
|
#include <STDIO.H>
|
|
#include <STDLIB.H>
|
|
#include <STRING.H>
|
|
#include <MATH.H>
|
|
#include <TIME.H>
|
|
#include "d_global.h"
|
|
#include "d_disk.h"
|
|
#include "d_misc.h"
|
|
#include "d_video.h"
|
|
#include "d_ints.h"
|
|
#include "r_refdef.h"
|
|
#include "d_font.h"
|
|
#include "protos.h"
|
|
#include "audio.h"
|
|
#include "svrdos4g.h"
|
|
|
|
/**** VARIABLES ****/
|
|
|
|
#define PLAYERMOVESPEED FRACUNIT*2.5
|
|
#define MOVEUNIT FRACUNIT
|
|
#define FALLUNIT FRACUNIT
|
|
#define MAXAMMO 300
|
|
#define DEFAULTVRDIST 157286
|
|
#define DEFAULTVRANGLE 4
|
|
|
|
player_t player;
|
|
byte resizeScreen, biggerScreen, warpActive, currentViewSize=0;
|
|
longint keyboardDelay, frames, weapdelay, spritemovetime, secretdelay,
|
|
RearViewTime, RearViewDelay, inventorytime;
|
|
font_t *font1, *font2, *font3;
|
|
pic_t *weaponpic[7], *statusbar[4];
|
|
byte *backdrop;
|
|
byte *backdroplookup[256];
|
|
boolean changingweapons, weaponlowering, quitgame, togglemapmode,
|
|
toggleheatmode, heatmode, godmode, togglemotionmode, motionmode,
|
|
hurtborder, recording, playback, activatemenu, specialcode,
|
|
debugmode, gameloaded, nospawn, doorsound, deadrestart, ticker,
|
|
togglegoalitem, waterdrop, gamepause, ExitLevel, exitexists, warpjammer,
|
|
paused, QuickExit, autorun, ToggleRearView, RearViewOn, checktrigger,
|
|
activatehelp, useitem, toggleautorun, goiright, goileft, activatebrief,
|
|
midgetmode, autotarget=1, toggleautotarget, adjustvrangle;
|
|
float adjustvrdist;
|
|
int weapmode, newweapon, weaponychange, headbob, weapbob, moveforward,
|
|
changelight, lighting, wbobcount, turnrate, mapmode, secretindex,
|
|
scrollview, doorx, doory, MapZoom, Warping, goalitem, specialeffect,
|
|
falldamage, netmode, wallanimcount, netmsgindex, netmsgstatus,
|
|
playerturnspeed=8, turnunit=2, exitx, exity, songnum, enemyviewmode;
|
|
fixed_t moverate, strafrate, fallrate, WarpX, WarpY;
|
|
longint wallanimationtime, recordindex, netsendtime, specialeffecttime,
|
|
SwitchTime, nethurtsoundtime;
|
|
byte *demobuffer;
|
|
byte demokb[NUMCODES];
|
|
char secretbuf[30];
|
|
char netmsg[30];
|
|
byte rearbuf[64*64];
|
|
bonus_t BonusItem;
|
|
boolean SaveTheScreen, redo, newsong;
|
|
|
|
extern entry_t entries[1024], *entry_p;
|
|
extern int frameon, rtimecount;
|
|
extern SoundCard SC;
|
|
extern int fliplayed;
|
|
extern void (*timerhook2)();
|
|
|
|
/**** FUNCTIONS ****/
|
|
|
|
int GetFreeMem(void);
|
|
void selectsong(int num);
|
|
|
|
void CheckElevators(void)
|
|
{
|
|
elevobj_t *elev_p;
|
|
longint time;
|
|
fixed_t floorz, newfloorz;
|
|
|
|
floorz=RF_GetFloorZ(player.x,player.y)+player.height;
|
|
time=timecount;
|
|
for(elev_p=firstelevobj.next;elev_p!=&lastelevobj;elev_p=elev_p->next)
|
|
while (time>=elev_p->elevTimer)
|
|
{
|
|
if (elev_p->elevUp && (elev_p->position+=elev_p->speed)>=elev_p->ceiling)
|
|
{
|
|
SoundEffect(SN_ELEVATORSTART,15,(elev_p->mapspot&63)<<FRACTILESHIFT,(elev_p->mapspot>>6)<<FRACTILESHIFT);
|
|
elev_p->position=elev_p->ceiling;
|
|
if (elev_p->type==E_NORMAL) elev_p->elevDown=true;
|
|
else if (elev_p->type!=E_SWAP && elev_p->type!=E_SECRET)
|
|
{
|
|
if (elev_p->endeval)
|
|
Event(elev_p->endeval,false);
|
|
floorheight[elev_p->mapspot]=elev_p->position;
|
|
if (mapsprites[elev_p->mapspot]==SM_ELEVATOR)
|
|
mapsprites[elev_p->mapspot]=0;
|
|
elev_p=elev_p->prev;
|
|
RF_RemoveElevator(elev_p->next);
|
|
break;
|
|
}
|
|
elev_p->elevUp=false;
|
|
elev_p->elevTimer+=280;
|
|
}
|
|
else if (elev_p->elevDown && (elev_p->position-=elev_p->speed)<=elev_p->floor)
|
|
{
|
|
SoundEffect(SN_ELEVATORSTART,15,(elev_p->mapspot&63)<<FRACTILESHIFT,(elev_p->mapspot>>6)<<FRACTILESHIFT);
|
|
elev_p->position=elev_p->floor;
|
|
if (elev_p->type==E_NORMAL || elev_p->type==E_SECRET) elev_p->elevUp=true;
|
|
else if (elev_p->type!=E_SWAP)
|
|
{
|
|
if (elev_p->endeval)
|
|
Event(elev_p->endeval,false);
|
|
floorheight[elev_p->mapspot]=elev_p->position;
|
|
if (mapsprites[elev_p->mapspot]==SM_ELEVATOR)
|
|
mapsprites[elev_p->mapspot]=0;
|
|
elev_p=elev_p->prev;
|
|
RF_RemoveElevator(elev_p->next);
|
|
break;
|
|
}
|
|
elev_p->elevDown=false;
|
|
elev_p->elevTimer+=280;
|
|
}
|
|
if (elev_p->type==E_SECRET && elev_p->elevUp)
|
|
{
|
|
if (player.mapspot==elev_p->mapspot || mapsprites[elev_p->mapspot]) elev_p->position=elev_p->floor;
|
|
}
|
|
if (mapsprites[elev_p->mapspot]==SM_ELEVATOR) mapsprites[elev_p->mapspot]=0;
|
|
floorheight[elev_p->mapspot]=elev_p->position;
|
|
elev_p->elevTimer+=MOVEDELAY;
|
|
}
|
|
newfloorz=RF_GetFloorZ(player.x,player.y)+player.height;
|
|
if (newfloorz!=floorz)
|
|
{
|
|
if (player.z>newfloorz)
|
|
{
|
|
fallrate+=FALLUNIT;
|
|
player.z-=fallrate;
|
|
if (player.z<newfloorz) player.z=newfloorz;
|
|
}
|
|
else if (player.z<newfloorz)
|
|
{
|
|
player.z=newfloorz;
|
|
fallrate=0;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
int GetTargetAngle(int n, fixed_t pz)
|
|
{
|
|
scaleobj_t *hsprite;
|
|
int counter, mapspot, result, x, y, z, d, accuracy;
|
|
boolean found;
|
|
fixed_t sz;
|
|
|
|
if (!autotarget)
|
|
return (-player.scrollmin)&ANGLES;
|
|
accuracy=16; //16 + 2*player.difficulty;
|
|
counter=0;
|
|
found=false;
|
|
msprite=&probe;
|
|
probe.x=player.x;
|
|
probe.y=player.y;
|
|
probe.z=player.z;
|
|
probe.angle=player.angle+n;
|
|
probe.zadj=player.height;
|
|
probe.startspot=(player.y>>FRACTILESHIFT)*MAPCOLS+(player.x>>FRACTILESHIFT);
|
|
while (counter++<MAXPROBE)
|
|
{
|
|
result=SP_Thrust();
|
|
if (result==1)
|
|
{
|
|
for(hsprite=firstscaleobj.next;hsprite!=&lastscaleobj;hsprite=hsprite->next)
|
|
if (hsprite->hitpoints)
|
|
{
|
|
mapspot=(hsprite->y>>FRACTILESHIFT)*MAPCOLS+(hsprite->x>>FRACTILESHIFT);
|
|
if (mapspot==spriteloc)
|
|
{
|
|
found=true;
|
|
counter=MAXPROBE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (!found)
|
|
{
|
|
counter=0;
|
|
msprite=&probe;
|
|
probe.x=player.x;
|
|
probe.y=player.y;
|
|
probe.z=player.z;
|
|
probe.angle=player.angle+n+accuracy;
|
|
probe.zadj=player.height;
|
|
probe.startspot=(player.y>>FRACTILESHIFT)*MAPCOLS+(player.x>>FRACTILESHIFT);
|
|
while (counter++<MAXPROBE)
|
|
{
|
|
result=SP_Thrust();
|
|
if (result==1)
|
|
{
|
|
for(hsprite=firstscaleobj.next;hsprite!=&lastscaleobj;hsprite=hsprite->next)
|
|
if (hsprite->hitpoints)
|
|
{
|
|
mapspot=(hsprite->y>>FRACTILESHIFT)*MAPCOLS+(hsprite->x>>FRACTILESHIFT);
|
|
if (mapspot==spriteloc)
|
|
{
|
|
found=true;
|
|
player.angle+=accuracy;
|
|
counter=MAXPROBE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (!found)
|
|
{
|
|
counter=0;
|
|
msprite=&probe;
|
|
probe.x=player.x;
|
|
probe.y=player.y;
|
|
probe.z=player.z;
|
|
probe.angle=player.angle+n-accuracy;
|
|
probe.zadj=player.height;
|
|
probe.startspot=(player.y>>FRACTILESHIFT)*MAPCOLS+(player.x>>FRACTILESHIFT);
|
|
while (counter++<MAXPROBE)
|
|
{
|
|
result=SP_Thrust();
|
|
if (result==1)
|
|
{
|
|
for(hsprite=firstscaleobj.next;hsprite!=&lastscaleobj;hsprite=hsprite->next)
|
|
if (hsprite->hitpoints)
|
|
{
|
|
mapspot=(hsprite->y>>FRACTILESHIFT)*MAPCOLS+(hsprite->x>>FRACTILESHIFT);
|
|
if (mapspot==spriteloc)
|
|
{
|
|
found=true;
|
|
player.angle-=accuracy;
|
|
counter=MAXPROBE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (!found)
|
|
{
|
|
counter=0;
|
|
msprite=&probe;
|
|
probe.x=player.x;
|
|
probe.y=player.y;
|
|
probe.z=player.z;
|
|
probe.angle=player.angle+n+accuracy/2;
|
|
probe.zadj=player.height;
|
|
probe.startspot=(player.y>>FRACTILESHIFT)*MAPCOLS+(player.x>>FRACTILESHIFT);
|
|
while (counter++<MAXPROBE)
|
|
{
|
|
result=SP_Thrust();
|
|
if (result==1)
|
|
{
|
|
for(hsprite=firstscaleobj.next;hsprite!=&lastscaleobj;hsprite=hsprite->next)
|
|
if (hsprite->hitpoints)
|
|
{
|
|
mapspot=(hsprite->y>>FRACTILESHIFT)*MAPCOLS+(hsprite->x>>FRACTILESHIFT);
|
|
if (mapspot==spriteloc)
|
|
{
|
|
found=true;
|
|
player.angle+=accuracy/2;
|
|
counter=MAXPROBE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (!found)
|
|
{
|
|
counter=0;
|
|
msprite=&probe;
|
|
probe.x=player.x;
|
|
probe.y=player.y;
|
|
probe.z=player.z;
|
|
probe.angle=player.angle+n-accuracy/2;
|
|
probe.zadj=player.height;
|
|
probe.startspot=(player.y>>FRACTILESHIFT)*MAPCOLS+(player.x>>FRACTILESHIFT);
|
|
while (counter++<MAXPROBE)
|
|
{
|
|
result=SP_Thrust();
|
|
if (result==1)
|
|
{
|
|
for(hsprite=firstscaleobj.next;hsprite!=&lastscaleobj;hsprite=hsprite->next)
|
|
if (hsprite->hitpoints)
|
|
{
|
|
mapspot=(hsprite->y>>FRACTILESHIFT)*MAPCOLS+(hsprite->x>>FRACTILESHIFT);
|
|
if (mapspot==spriteloc)
|
|
{
|
|
found=true;
|
|
player.angle-=accuracy/2;
|
|
counter=MAXPROBE;
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
if (found)
|
|
{
|
|
pz+=player.z;
|
|
sz=hsprite->z+(hsprite->height/2);
|
|
if (sz>pz)
|
|
{
|
|
z=(sz-pz)>>(FRACBITS+2);
|
|
if (z>=MAXAUTO) return (-player.scrollmin)&ANGLES;
|
|
x=(hsprite->x-player.x)>>(FRACBITS+2);
|
|
y=(hsprite->y-player.y)>>(FRACBITS+2);
|
|
d=sqrt(x*x + y*y);
|
|
if (d>=MAXAUTO || autoangle2[d][z]==-1) return (-player.scrollmin)&ANGLES;
|
|
return autoangle2[d][z];
|
|
}
|
|
else if (sz<pz)
|
|
{
|
|
z=(pz-sz)>>(FRACBITS+2);
|
|
if (z>=MAXAUTO) return (-player.scrollmin)&ANGLES;
|
|
x=(hsprite->x-player.x)>>(FRACBITS+2);
|
|
y=(hsprite->y-player.y)>>(FRACBITS+2);
|
|
d=sqrt(x*x + y*y);
|
|
if (d>=MAXAUTO || autoangle2[d][z]==-1) return (-player.scrollmin)&ANGLES;
|
|
return -autoangle2[d][z];
|
|
}
|
|
else return (-player.scrollmin)&ANGLES;
|
|
}
|
|
else return (-player.scrollmin)&ANGLES;
|
|
}
|
|
|
|
|
|
void fireweapon(void)
|
|
{
|
|
// scaleobj_t *hsprite;
|
|
// int px, py, sx, sy, xmove, ymove, spriteloc1, spriteloc2, mapspot;
|
|
int i, n, angle2, ammo, angle, angleinc, oldangle;
|
|
fixed_t z, xmove2, ymove2;
|
|
|
|
player.status=2;
|
|
n=player.weapons[player.currentweapon];
|
|
ammo=weapons[n].ammorate;
|
|
if (player.ammo[weapons[n].ammotype]<ammo) return;
|
|
oldangle=player.angle;
|
|
weapons[n].charge=0;
|
|
player.ammo[weapons[n].ammotype]-=ammo;
|
|
if (n!=4 && n!=18 && weapmode!=1) weapmode=1;
|
|
switch (n)
|
|
{
|
|
case 13: // mooman #1
|
|
z=player.height-(fixed_t)(50<<FRACBITS);
|
|
SpawnSprite(S_HANDBULLET,player.x,player.y,player.z,z,player.angle,GetTargetAngle(0,z),true,playernum);
|
|
SoundEffect(SN_BULLET13,0,player.x,player.y);
|
|
if (netmode) NetSoundEffect(SN_BULLET13,0,player.x,player.y);
|
|
break;
|
|
case 8: // lizard #1
|
|
case 14: // specimen #1
|
|
case 15: // trix #1
|
|
z=player.height-(fixed_t)(50<<FRACBITS);
|
|
SpawnSprite(S_HANDBULLET,player.x,player.y,player.z,z,player.angle,GetTargetAngle(0,z),true,playernum);
|
|
SoundEffect(SN_BULLET8,0,player.x,player.y);
|
|
if (netmode) NetSoundEffect(SN_BULLET8,0,player.x,player.y);
|
|
break;
|
|
case 1: // psyborg #2
|
|
z=player.height-(52<<FRACBITS);
|
|
angle2=GetTargetAngle(0,z);
|
|
SpawnSprite(S_BULLET1,player.x,player.y,player.z,z,player.angle,angle2,true,playernum);
|
|
SoundEffect(SN_BULLET1,0,player.x,player.y);
|
|
if (netmode) NetSoundEffect(SN_BULLET1,0,player.x,player.y);
|
|
break;
|
|
case 2:
|
|
z=player.height-(fixed_t)(50<<FRACBITS);
|
|
SpawnSprite(S_BULLET2,player.x,player.y,player.z,z,player.angle,GetTargetAngle(0,z),true,playernum);
|
|
SoundEffect(SN_BULLET5,0,player.x,player.y);
|
|
if (netmode) NetSoundEffect(SN_BULLET5,0,player.x,player.y);
|
|
break;
|
|
case 3:
|
|
z=player.height-(fixed_t)(50<<FRACBITS);
|
|
SpawnSprite(S_BULLET3,player.x,player.y,player.z,z,player.angle,GetTargetAngle(0,z),true,playernum);
|
|
SoundEffect(SN_BULLET3,0,player.x,player.y);
|
|
if (netmode) NetSoundEffect(SN_BULLET3,0,player.x,player.y);
|
|
break;
|
|
case 4:
|
|
z=player.height-(fixed_t)(50<<FRACBITS);
|
|
SpawnSprite(S_BULLET4,player.x,player.y,player.z,z,player.angle-48,GetTargetAngle(-16,z),true,playernum);
|
|
SpawnSprite(S_BULLET4,player.x,player.y,player.z,z,player.angle-24,GetTargetAngle(-32,z),true,playernum);
|
|
SpawnSprite(S_BULLET4,player.x,player.y,player.z,z,player.angle,GetTargetAngle(0,z),true,playernum);
|
|
SpawnSprite(S_BULLET4,player.x,player.y,player.z,z,player.angle+24,GetTargetAngle(+16,z),true,playernum);
|
|
SpawnSprite(S_BULLET4,player.x,player.y,player.z,z,player.angle+48,GetTargetAngle(+32,z),true,playernum);
|
|
break;
|
|
case 5:
|
|
|
|
break;
|
|
case 6:
|
|
break;
|
|
case 7: // psyborg #1
|
|
z=player.height-(52<<FRACBITS);
|
|
angle2=GetTargetAngle(0,z);
|
|
SpawnSprite(S_BULLET7,player.x,player.y,player.z,z,player.angle,angle2,true,playernum);
|
|
SoundEffect(SN_BULLET13,0,player.x,player.y);
|
|
if (netmode) NetSoundEffect(SN_BULLET13,0,player.x,player.y);
|
|
break;
|
|
case 9: // lizard #2
|
|
z=player.height-(52<<FRACBITS);
|
|
angle2=GetTargetAngle(0,z);
|
|
SpawnSprite(S_BULLET9,player.x,player.y,player.z,z,player.angle,angle2,true,playernum);
|
|
SoundEffect(SN_BULLET9,0,player.x,player.y);
|
|
if (netmode) NetSoundEffect(SN_BULLET1,0,player.x,player.y);
|
|
break;
|
|
case 10: // specimen #2
|
|
z=player.height-(52<<FRACBITS);
|
|
angle2=GetTargetAngle(0,z);
|
|
SpawnSprite(S_BULLET10,player.x,player.y,player.z,z,player.angle,angle2,true,playernum);
|
|
SoundEffect(SN_BULLET10,0,player.x,player.y);
|
|
if (netmode) NetSoundEffect(SN_BULLET10,0,player.x,player.y);
|
|
break;
|
|
case 11: // mooman #2
|
|
z=player.height-(52<<FRACBITS);
|
|
angle2=GetTargetAngle(0,z);
|
|
SpawnSprite(S_BULLET11,player.x,player.y,player.z,z,player.angle,angle2,true,playernum);
|
|
SoundEffect(SN_BULLET1,0,player.x,player.y);
|
|
if (netmode) NetSoundEffect(SN_BULLET1,0,player.x,player.y);
|
|
break;
|
|
case 12: // dominatrix #2
|
|
angle=(player.angle-NORTH)&ANGLES;
|
|
xmove2=FIXEDMUL(FRACUNIT*4,costable[angle]);
|
|
ymove2=-FIXEDMUL(FRACUNIT*4,sintable[angle]);
|
|
z=player.height-(fixed_t)(50<<FRACBITS);
|
|
SpawnSprite(S_BULLET12,player.x+xmove2,player.y+ymove2,player.z,z,player.angle,GetTargetAngle(0,z),true,playernum);
|
|
angle=(player.angle+NORTH)&ANGLES;
|
|
xmove2=FIXEDMUL(FRACUNIT*4,costable[angle]);
|
|
ymove2=-FIXEDMUL(FRACUNIT*4,sintable[angle]);
|
|
z=player.height-(fixed_t)(50<<FRACBITS);
|
|
SpawnSprite(S_BULLET12,player.x+xmove2,player.y+ymove2,player.z,z,player.angle,GetTargetAngle(0,z),true,playernum);
|
|
SoundEffect(SN_BULLET12,0,player.x,player.y);
|
|
if (netmode) NetSoundEffect(SN_BULLET12,0,player.x,player.y);
|
|
break;
|
|
|
|
case 16: // red gun
|
|
angle=(player.angle-NORTH)&ANGLES;
|
|
xmove2=FIXEDMUL(FRACUNIT*4,costable[angle]);
|
|
ymove2=-FIXEDMUL(FRACUNIT*4,sintable[angle]);
|
|
z=player.height-(fixed_t)(50<<FRACBITS);
|
|
SpawnSprite(S_BULLET16,player.x+xmove2,player.y+ymove2,player.z,z,player.angle,GetTargetAngle(0,z),true,playernum);
|
|
angle=(player.angle+NORTH)&ANGLES;
|
|
xmove2=FIXEDMUL(FRACUNIT*4,costable[angle]);
|
|
ymove2=-FIXEDMUL(FRACUNIT*4,sintable[angle]);
|
|
z=player.height-(fixed_t)(50<<FRACBITS);
|
|
SpawnSprite(S_BULLET16,player.x+xmove2,player.y+ymove2,player.z,z,player.angle,GetTargetAngle(0,z),true,playernum);
|
|
SoundEffect(SN_BULLET12,0,player.x,player.y);
|
|
if (netmode) NetSoundEffect(SN_BULLET12,0,player.x,player.y);
|
|
break;
|
|
|
|
case 17: // blue gun
|
|
z=player.height-(64<<FRACBITS);
|
|
angle2=GetTargetAngle(0,z);
|
|
SpawnSprite(S_BULLET17,player.x,player.y,player.z,z,player.angle,angle2,true,playernum);
|
|
SoundEffect(SN_BULLET17,0,player.x,player.y);
|
|
if (netmode) NetSoundEffect(SN_BULLET1,0,player.x,player.y);
|
|
break;
|
|
|
|
case 18: // green gun
|
|
angleinc=ANGLES/12;
|
|
angle=0;
|
|
for(i=0;i<12;i++,angle+=angleinc)
|
|
{
|
|
z=player.height-(52<<FRACBITS);
|
|
angle2=GetTargetAngle(0,z);
|
|
SpawnSprite(S_BULLET18,player.x,player.y,player.z,z,angle,angle2,true,playernum);
|
|
}
|
|
if (netmode)
|
|
NetSendSpawn(S_BULLET18,player.x,player.y,player.z,z,angle,angle2,true,playernum);
|
|
break;
|
|
}
|
|
player.angle=oldangle;
|
|
}
|
|
|
|
|
|
boolean FindWarpDestination(int *x, int *y,byte warpValue)
|
|
{
|
|
int search, nosearch;
|
|
|
|
nosearch=*y*MAPSIZE+*x;
|
|
if (!warpActive)
|
|
{
|
|
for(search=0;search<MAPROWS*MAPCOLS;search++)
|
|
if (mapsprites[search]==warpValue && search!=nosearch)
|
|
{
|
|
*x=search & (MAPSIZE-1);
|
|
*y=search>>TILESHIFT;
|
|
turnrate=0;
|
|
moverate=0;
|
|
fallrate=0;
|
|
strafrate=0;
|
|
ResetMouse();
|
|
warpActive=warpValue;
|
|
return true;
|
|
}
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
void CheckItems(int centerx,int centery,boolean useit,int chartype)
|
|
{
|
|
scaleobj_t *sprite;
|
|
int mapspot, value, value2, index, ammo, cmapspot;
|
|
int x, y, i, j;
|
|
elevobj_t *elev_p;
|
|
boolean sound;
|
|
|
|
mapspot=centery*MAPCOLS+centerx;
|
|
value=mapsprites[mapspot];
|
|
switch (value)
|
|
{
|
|
case SM_MEDPAK1:
|
|
case SM_MEDPAK2:
|
|
case SM_MEDPAK3:
|
|
case SM_MEDPAK4:
|
|
value2=value-SM_MEDPAK1+S_MEDPAK1;
|
|
for (sprite=firstscaleobj.next; sprite!=&lastscaleobj;sprite=sprite->next)
|
|
if (sprite->x>>FRACTILESHIFT==centerx && sprite->y>>FRACTILESHIFT==centery)
|
|
if (sprite->type==value2)
|
|
{
|
|
if (useit && netmode) NetItemPickup(centerx,centery);
|
|
mapsprites[mapspot]=0;
|
|
SoundEffect(SN_PICKUP0+chartype,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
if (useit)
|
|
{
|
|
if (player.angst==player.maxangst)
|
|
{
|
|
player.inventory[0]+=5-(value-SM_MEDPAK1);
|
|
if (player.inventory[0]>20) player.inventory[0]=20;
|
|
oldinventory=-2;
|
|
inventoryleft();
|
|
inventoryright();
|
|
writemsg("Stored MedTube!");
|
|
}
|
|
else
|
|
{
|
|
medpaks((5-(value-SM_MEDPAK1))*50);
|
|
writemsg("Used MedTube!");
|
|
}
|
|
}
|
|
SpawnSprite(S_GENERATOR,sprite->x,sprite->y,0,0,0,0,false,0);
|
|
RF_RemoveSprite(sprite);
|
|
return;
|
|
}
|
|
break;
|
|
|
|
case SM_SHIELD1:
|
|
case SM_SHIELD2:
|
|
case SM_SHIELD3:
|
|
case SM_SHIELD4:
|
|
value2=value-SM_MEDPAK1+S_MEDPAK1;
|
|
for (sprite=firstscaleobj.next; sprite!=&lastscaleobj;sprite=sprite->next)
|
|
if (sprite->x>>FRACTILESHIFT==centerx && sprite->y>>FRACTILESHIFT==centery)
|
|
if (sprite->type==value2)
|
|
{
|
|
if (useit && netmode) NetItemPickup(centerx,centery);
|
|
mapsprites[mapspot]=0;
|
|
SoundEffect(SN_PICKUP0+chartype,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
if (useit)
|
|
{
|
|
if (player.shield==player.maxshield)
|
|
{
|
|
player.inventory[1]+=1+(value-SM_SHIELD1);
|
|
if (player.inventory[1]>20) player.inventory[1]=20;
|
|
oldinventory=-2;
|
|
inventoryleft();
|
|
inventoryright();
|
|
writemsg("Stored Shield Charge!");
|
|
}
|
|
else
|
|
{
|
|
heal((1+(value-SM_SHIELD1))*50);
|
|
writemsg("Used Shield Charge!");
|
|
}
|
|
}
|
|
SpawnSprite(S_GENERATOR,sprite->x,sprite->y,0,0,0,0,false,0);
|
|
RF_RemoveSprite(sprite);
|
|
return;
|
|
}
|
|
break;
|
|
|
|
case SM_ENERGY:
|
|
case SM_BALLISTIC:
|
|
case SM_PLASMA:
|
|
value2=value-SM_ENERGY+S_ENERGY;
|
|
for (sprite=firstscaleobj.next;sprite!=&lastscaleobj;sprite=sprite->next)
|
|
if (sprite->x>>FRACTILESHIFT==centerx && sprite->y>>FRACTILESHIFT==centery)
|
|
if (sprite->type==value2)
|
|
{
|
|
if (useit && netmode)
|
|
NetItemPickup(centerx,centery);
|
|
mapsprites[mapspot]=0;
|
|
SoundEffect(SN_PICKUP0+chartype,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
if (useit)
|
|
{
|
|
hurtborder=true;
|
|
VI_ColorBorder(40);
|
|
player.ammo[value-SM_ENERGY]+=75;
|
|
if (player.ammo[value-SM_ENERGY]>MAXAMMO)
|
|
player.ammo[value-SM_ENERGY]=MAXAMMO;
|
|
oldshots=-1;
|
|
writemsg(pickupammomsg[value-SM_ENERGY]);
|
|
}
|
|
SpawnSprite(S_GENERATOR,sprite->x,sprite->y,0,0,0,0,false,0);
|
|
RF_RemoveSprite(sprite);
|
|
return;
|
|
}
|
|
break;
|
|
|
|
case SM_AMMOBOX:
|
|
value2=weapons[player.weapons[player.currentweapon]].ammotype;
|
|
if (useit && (player.ammo[value2]>=MAXAMMO ||
|
|
(weapons[player.currentweapon].ammorate==0 &&
|
|
player.ammo[0]>=MAXAMMO && player.ammo[1]>=MAXAMMO &&
|
|
player.ammo[2]>=MAXAMMO)))
|
|
return;
|
|
for (sprite=firstscaleobj.next;sprite!=&lastscaleobj;sprite=sprite->next)
|
|
if (sprite->x>>FRACTILESHIFT==centerx && sprite->y>>FRACTILESHIFT==centery)
|
|
if (sprite->type==S_AMMOBOX)
|
|
{
|
|
if (useit && netmode)
|
|
NetItemPickup(centerx,centery);
|
|
mapsprites[mapspot]=0;
|
|
SoundEffect(SN_PICKUP0+chartype,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
if (useit)
|
|
{
|
|
hurtborder=true;
|
|
VI_ColorBorder(40);
|
|
|
|
if (weapons[player.currentweapon].ammorate==0)
|
|
{
|
|
player.ammo[0]+=45;
|
|
if (player.ammo[0]>MAXAMMO)
|
|
player.ammo[0]=MAXAMMO;
|
|
player.ammo[1]+=45;
|
|
if (player.ammo[1]>MAXAMMO)
|
|
player.ammo[1]=MAXAMMO;
|
|
player.ammo[2]+=45;
|
|
if (player.ammo[2]>MAXAMMO)
|
|
player.ammo[2]=MAXAMMO;
|
|
}
|
|
else
|
|
{
|
|
player.ammo[value2]+=125;
|
|
if (player.ammo[value2]>MAXAMMO)
|
|
player.ammo[value2]=MAXAMMO;
|
|
}
|
|
oldshots=-1;
|
|
writemsg(pickupmsg[11]);
|
|
}
|
|
if (sprite->deathevent)
|
|
Event(sprite->deathevent,false);
|
|
RF_RemoveSprite(sprite);
|
|
return;
|
|
}
|
|
break;
|
|
case SM_MEDBOX:
|
|
if (useit && player.angst==player.maxangst && player.shield==player.maxshield)
|
|
return;
|
|
for (sprite=firstscaleobj.next;sprite!=&lastscaleobj;sprite=sprite->next)
|
|
if (sprite->x>>FRACTILESHIFT==centerx && sprite->y>>FRACTILESHIFT==centery)
|
|
if (sprite->type==S_MEDBOX)
|
|
{
|
|
if (useit && netmode)
|
|
NetItemPickup(centerx,centery);
|
|
mapsprites[mapspot]=0;
|
|
SoundEffect(SN_PICKUP0+chartype,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
if (useit)
|
|
{
|
|
heal(250);
|
|
medpaks(250);
|
|
hurtborder=true;
|
|
VI_ColorBorder(40);
|
|
writemsg(pickupmsg[12]);
|
|
}
|
|
if (sprite->deathevent)
|
|
Event(sprite->deathevent,false);
|
|
RF_RemoveSprite(sprite);
|
|
return;
|
|
}
|
|
break;
|
|
case SM_GOODIEBOX:
|
|
for (sprite=firstscaleobj.next;sprite!=&lastscaleobj;sprite=sprite->next)
|
|
if (sprite->x>>FRACTILESHIFT==centerx && sprite->y>>FRACTILESHIFT==centery)
|
|
if (sprite->type==S_GOODIEBOX)
|
|
{
|
|
if (useit && netmode)
|
|
NetItemPickup(centerx,centery);
|
|
mapsprites[mapspot]=0;
|
|
SoundEffect(SN_PICKUP0+chartype,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
if (useit)
|
|
{
|
|
for (i=0;i<2;i++)
|
|
{
|
|
if (netmode)
|
|
do
|
|
{
|
|
value2=(clock()+MS_RndT())%11;
|
|
} while (value2!=8);
|
|
else
|
|
do
|
|
{
|
|
value2=(clock()+MS_RndT())%11;
|
|
} while (value2!=6 && value2!=10 && value2!=12);
|
|
player.inventory[value2+2]+=pickupamounts[value2];
|
|
if (value2==2)
|
|
{
|
|
if (player.inventory[2]>15)
|
|
player.inventory[2]=15;
|
|
}
|
|
else if (player.inventory[value2+2]>10)
|
|
player.inventory[value2+2]=10;
|
|
}
|
|
oldinventory=-2;
|
|
inventoryleft();
|
|
inventoryright();
|
|
VI_ColorBorder(40);
|
|
hurtborder=true;
|
|
writemsg(pickupmsg[13]);
|
|
}
|
|
if (sprite->deathevent)
|
|
Event(sprite->deathevent,false);
|
|
RF_RemoveSprite(sprite);
|
|
return;
|
|
}
|
|
break;
|
|
|
|
case SM_IGRENADE:
|
|
case SM_IREVERSO:
|
|
case SM_IPROXMINE:
|
|
case SM_ITIMEMINE:
|
|
case SM_IDECOY:
|
|
case SM_IINSTAWALL:
|
|
case SM_ICLONE:
|
|
case SM_IHOLO:
|
|
case SM_IINVIS:
|
|
case SM_IJAMMER:
|
|
case SM_ISTEALER:
|
|
value2=value-SM_IGRENADE+S_IGRENADE;
|
|
for (sprite=firstscaleobj.next;sprite!=&lastscaleobj;sprite=sprite->next)
|
|
if (sprite->x>>FRACTILESHIFT==centerx && sprite->y>>FRACTILESHIFT==centery)
|
|
if (sprite->type==value2)
|
|
{
|
|
if (useit && netmode)
|
|
NetItemPickup(centerx,centery);
|
|
mapsprites[mapspot]=0;
|
|
SoundEffect(SN_PICKUP0+chartype,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
if (useit)
|
|
{
|
|
hurtborder=true;
|
|
VI_ColorBorder(40);
|
|
player.inventory[value-SM_IGRENADE+2]+=pickupamounts[value-SM_IGRENADE];
|
|
if (value==SM_IGRENADE)
|
|
{
|
|
if (player.inventory[2]>15)
|
|
player.inventory[2]=15;
|
|
}
|
|
else if (player.inventory[value-SM_IGRENADE+2]>10)
|
|
player.inventory[value-SM_IGRENADE+2]=10;
|
|
writemsg(pickupmsg[value-SM_IGRENADE]);
|
|
oldinventory=-2;
|
|
inventoryleft();
|
|
inventoryright();
|
|
}
|
|
SpawnSprite(S_GENERATOR,sprite->x,sprite->y,0,0,0,0,false,0);
|
|
RF_RemoveSprite(sprite);
|
|
return;
|
|
}
|
|
break;
|
|
/* case SM_HOLE:
|
|
if (useit && player.inventory[10]>=10) return;
|
|
for (sprite=firstscaleobj.next;sprite!=&lastscaleobj;sprite=sprite->next)
|
|
if (sprite->x>>FRACTILESHIFT==centerx && sprite->y>>FRACTILESHIFT==centery)
|
|
if (sprite->type==S_HOLE)
|
|
{
|
|
if (useit && netmode) NetItemPickup(centerx,centery);
|
|
mapsprites[mapspot]=0;
|
|
SoundEffect(SN_PICKUP0+chartype,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
if (useit)
|
|
{
|
|
hurtborder=true;
|
|
VI_ColorBorder(40);
|
|
++player.inventory[10];
|
|
writemsg("Portable Hole picked up!");
|
|
oldinventory=-2;
|
|
inventoryleft();
|
|
inventoryright();
|
|
}
|
|
RF_RemoveSprite(sprite);
|
|
return;
|
|
}
|
|
break; */
|
|
|
|
case SM_BONUSITEM:
|
|
if (useit)
|
|
{
|
|
if (netmode) NetItemPickup(centerx,centery);
|
|
addscore(BonusItem.score);
|
|
heal(150);
|
|
medpaks(150);
|
|
hurtborder=true;
|
|
VI_ColorBorder(40);
|
|
writemsg("Bonus Item!");
|
|
}
|
|
BonusItem.score=0;
|
|
BonusItem.mapspot=-1;
|
|
RF_RemoveSprite(BonusItem.sprite);
|
|
mapsprites[mapspot]=0;
|
|
SoundEffect(SN_WEAPPICKUP0+chartype,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
BonusItem.name=NULL;
|
|
break;
|
|
|
|
case SM_PRIMARY1:
|
|
case SM_PRIMARY2:
|
|
value2=mapsprites[mapspot]-SM_PRIMARY1 + S_PRIMARY1;
|
|
for (sprite=firstscaleobj.next; sprite!=&lastscaleobj;sprite=sprite->next)
|
|
if (sprite->x>>FRACTILESHIFT==centerx && sprite->y>>FRACTILESHIFT==centery)
|
|
if (sprite->type==value2)
|
|
{
|
|
if (useit && netmode) NetItemPickup(centerx,centery);
|
|
RF_RemoveSprite(sprite);
|
|
mapsprites[mapspot]=0;
|
|
SoundEffect(SN_WEAPPICKUP0+chartype,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
if (useit)
|
|
{
|
|
heal(150);
|
|
medpaks(150);
|
|
hurtborder=true;
|
|
VI_ColorBorder(40);
|
|
addscore(primaries[(value2-S_PRIMARY1)*2 + 1]);
|
|
writemsg("Primary goal item!");
|
|
player.primaries[value2-S_PRIMARY1]++;
|
|
}
|
|
return;
|
|
}
|
|
break;
|
|
case SM_SECONDARY1:
|
|
case SM_SECONDARY2:
|
|
case SM_SECONDARY3:
|
|
case SM_SECONDARY4:
|
|
case SM_SECONDARY5:
|
|
case SM_SECONDARY6:
|
|
case SM_SECONDARY7:
|
|
value2=mapsprites[mapspot]-SM_SECONDARY1 + S_SECONDARY1;
|
|
for (sprite=firstscaleobj.next; sprite!=&lastscaleobj;sprite=sprite->next)
|
|
if (sprite->x>>FRACTILESHIFT==centerx && sprite->y>>FRACTILESHIFT==centery && sprite->type==value2)
|
|
{
|
|
if (useit && netmode)
|
|
NetItemPickup(centerx,centery);
|
|
RF_RemoveSprite(sprite);
|
|
mapsprites[mapspot]=0;
|
|
SoundEffect(SN_WEAPPICKUP0+chartype,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
if (useit)
|
|
{
|
|
heal(150);
|
|
medpaks(150);
|
|
hurtborder=true;
|
|
VI_ColorBorder(40);
|
|
addscore(secondaries[(value2-S_SECONDARY1)*2 + 1]);
|
|
writemsg("Secondary goal item!");
|
|
player.secondaries[value2-S_SECONDARY1]++;
|
|
}
|
|
return;
|
|
}
|
|
break;
|
|
|
|
case SM_SWITCHDOWN:
|
|
sound=false;
|
|
for(elev_p=firstelevobj.next;elev_p!=&lastelevobj;elev_p=elev_p->next)
|
|
if (elev_p->type==E_SWITCHDOWN && !elev_p->elevDown)
|
|
{
|
|
elev_p->elevDown=true;
|
|
elev_p->elevTimer=timecount;
|
|
sound=true;
|
|
SoundEffect(SN_ELEVATORSTART,15,(elev_p->mapspot&63)<<FRACTILESHIFT,(elev_p->mapspot>>6)<<FRACTILESHIFT);
|
|
}
|
|
if (useit && netmode) NetItemPickup(centerx,centery);
|
|
mapsprites[mapspot]=0;
|
|
if (useit && sound)
|
|
{
|
|
SoundEffect(SN_TRIGGER,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
if (netmode) NetSoundEffect(SN_TRIGGER,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
SoundEffect(SN_TRIGGER,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
if (netmode) NetSoundEffect(SN_TRIGGER,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
}
|
|
break;
|
|
case SM_SWITCHDOWN2:
|
|
if (useit && netmode) NetItemPickup(centerx,centery);
|
|
sound=false;
|
|
for(elev_p=firstelevobj.next;elev_p!=&lastelevobj;elev_p=elev_p->next)
|
|
if (elev_p->type==E_SWITCHDOWN2 && !elev_p->elevDown)
|
|
{
|
|
elev_p->elevDown=true;
|
|
elev_p->elevTimer=timecount;
|
|
SoundEffect(SN_ELEVATORSTART,15,(elev_p->mapspot&63)<<FRACTILESHIFT,(elev_p->mapspot>>6)<<FRACTILESHIFT);
|
|
sound=true;
|
|
}
|
|
if (useit && netmode) NetItemPickup(centerx,centery);
|
|
mapsprites[mapspot]=0;
|
|
if (sound) SoundEffect(SN_TRIGGER,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
break;
|
|
case SM_SWITCHUP:
|
|
if (useit && netmode) NetItemPickup(centerx,centery);
|
|
sound=false;
|
|
for(elev_p=firstelevobj.next;elev_p!=&lastelevobj;elev_p=elev_p->next)
|
|
if (elev_p->type==E_SWITCHUP && !elev_p->elevUp)
|
|
{
|
|
elev_p->elevUp=true;
|
|
elev_p->elevTimer=timecount;
|
|
sound=true;
|
|
SoundEffect(SN_ELEVATORSTART,15,(elev_p->mapspot&63)<<FRACTILESHIFT,(elev_p->mapspot>>6)<<FRACTILESHIFT);
|
|
}
|
|
if (useit && netmode) NetItemPickup(centerx,centery);
|
|
mapsprites[mapspot]=0;
|
|
if (sound) SoundEffect(SN_TRIGGER,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
break;
|
|
|
|
case SM_EXIT:
|
|
ExitLevel=true;
|
|
break;
|
|
|
|
case SM_WEAPON0:
|
|
case SM_WEAPON1:
|
|
case SM_WEAPON2:
|
|
case SM_WEAPON3:
|
|
case SM_WEAPON4:
|
|
case SM_WEAPON5:
|
|
case SM_WEAPON6:
|
|
case SM_WEAPON7:
|
|
case SM_WEAPON8:
|
|
case SM_WEAPON9:
|
|
case SM_WEAPON10:
|
|
case SM_WEAPON11:
|
|
case SM_WEAPON12:
|
|
case SM_WEAPON13:
|
|
case SM_WEAPON14:
|
|
case SM_WEAPON15:
|
|
case SM_WEAPON16:
|
|
case SM_WEAPON17:
|
|
case SM_WEAPON18:
|
|
value2=value-SM_WEAPON0;
|
|
ammo=weapons[value2].ammotype;
|
|
index=ammo+2;
|
|
|
|
if (player.weapons[index]==value2 && !netmode)
|
|
{
|
|
player.ammo[ammo]+=100;
|
|
if (player.ammo[ammo]>MAXAMMO) player.ammo[ammo]=MAXAMMO;
|
|
writemsg("Found more ammo.");
|
|
}
|
|
else if (player.weapons[index]!=-1 && !netmode)
|
|
{
|
|
for(i=-MAPCOLS;i<=MAPCOLS;i+=MAPCOLS)
|
|
for(j=-1;j<=1;j++)
|
|
{
|
|
cmapspot=mapspot+i+j;
|
|
if (cmapspot!=mapspot && floorpic[cmapspot] && mapsprites[cmapspot]==0)
|
|
{
|
|
x=(cmapspot&63)*MAPSIZE+32;
|
|
y=(cmapspot/64)*MAPSIZE+32;
|
|
SpawnSprite(player.weapons[index]+S_WEAPON0,x<<FRACBITS,y<<FRACBITS,0,0,0,0,0,0);
|
|
i=MAPCOLS*2;
|
|
j=1;
|
|
break;
|
|
}
|
|
}
|
|
if (player.currentweapon==index)
|
|
{
|
|
weaponlowering=false;
|
|
newweapon=index;
|
|
loadweapon(value2);
|
|
weaponychange=weaponpic[0]->height-20;
|
|
changingweapons=true;
|
|
}
|
|
else
|
|
{
|
|
changingweapons=true;
|
|
weaponlowering=true;
|
|
newweapon=index;
|
|
}
|
|
writemsg("Exchanged weapons!");
|
|
}
|
|
else if (!netmode)
|
|
{
|
|
writemsg("Acquired new weapon!");
|
|
changingweapons=true;
|
|
weaponlowering=true;
|
|
newweapon=index;
|
|
}
|
|
if (netmode)
|
|
{
|
|
if (player.weapons[index]==value2)
|
|
return;
|
|
writemsg("Acquired new weapon!");
|
|
player.weapons[index]=value-SM_WEAPON0;
|
|
player.ammo[ammo]+=100;
|
|
if (player.ammo[ammo]>MAXAMMO) player.ammo[ammo]=MAXAMMO;
|
|
SoundEffect(SN_WEAPPICKUP0+chartype,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
NetSoundEffect(SN_WEAPPICKUP0+chartype,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
changingweapons=true;
|
|
weaponlowering=true;
|
|
newweapon=index;
|
|
}
|
|
else
|
|
{
|
|
value2=value-SM_WEAPON0+S_WEAPON0;
|
|
for (sprite=firstscaleobj.next;sprite!=&lastscaleobj;sprite=sprite->next)
|
|
if (sprite->x>>FRACTILESHIFT==centerx && sprite->y>>FRACTILESHIFT==centery)
|
|
if (sprite->type==value2)
|
|
{
|
|
player.weapons[index]=value-SM_WEAPON0;
|
|
value2=weapons[player.weapons[index]].ammotype;
|
|
hurtborder=true;
|
|
VI_ColorBorder(40);
|
|
RF_RemoveSprite(sprite);
|
|
mapsprites[mapspot]=0;
|
|
SoundEffect(SN_WEAPPICKUP0+chartype,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
return;
|
|
}
|
|
}
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
void CheckWarps(fixed_t centerx,fixed_t centery)
|
|
{
|
|
int x, y, mapspot;
|
|
|
|
x=centerx>>FRACTILESHIFT;
|
|
y=centery>>FRACTILESHIFT;
|
|
mapspot=y*MAPCOLS+x;
|
|
if (mapsprites[mapspot]>=128 && mapsprites[mapspot]<=130)
|
|
{
|
|
if (Warping) return;
|
|
if (FindWarpDestination(&x, &y, mapsprites[mapspot]))
|
|
{
|
|
WarpX=(x*MAPSIZE+32)<<FRACBITS;
|
|
WarpY=(y*MAPSIZE+32)<<FRACBITS;
|
|
Warping=1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
warpActive=0;
|
|
if (mapsprites[mapspot]>130)
|
|
CheckItems(x,y,true,player.chartype);
|
|
}
|
|
if (triggers[x][y])
|
|
{
|
|
SoundEffect(SN_TRIGGER,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
if (netmode) NetSoundEffect(SN_TRIGGER,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
SoundEffect(SN_TRIGGER,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
if (netmode) NetSoundEffect(SN_TRIGGER,0,centerx<<FRACTILESHIFT,centery<<FRACTILESHIFT);
|
|
Event(triggers[x][y],true);
|
|
}
|
|
}
|
|
|
|
|
|
void CheckDoors(fixed_t centerx, fixed_t centery)
|
|
{
|
|
int x, y, mapspot;
|
|
doorobj_t *door_p, *last_p;
|
|
|
|
x=(int)((centerx)>>FRACTILESHIFT);
|
|
y=(int)((centery)>>FRACTILESHIFT);
|
|
last_p=&doorlist[numdoors];
|
|
for (door_p=doorlist; door_p != last_p; door_p++)
|
|
while (timecount>=door_p->doorTimer)
|
|
{
|
|
mapspot=door_p->tiley*MAPCOLS + door_p->tilex;
|
|
if ((door_p->tilex==x && door_p->tiley==y) || mapsprites[mapspot])
|
|
{
|
|
if (door_p->doorOpen && !door_p->doorClosing) door_p->doorBlocked=true;
|
|
}
|
|
else door_p->doorBlocked=false;
|
|
|
|
if (door_p->doorOpening)
|
|
{
|
|
if ((door_p->doorSize-=4)<=MINDOORSIZE)
|
|
{
|
|
door_p->doorSize=MINDOORSIZE;
|
|
door_p->doorOpening=false;
|
|
door_p->doorOpen=true;
|
|
door_p->doorTimer+=270; // 3 seconds
|
|
}
|
|
else door_p->doorTimer+=MOVEDELAY;
|
|
}
|
|
else if (door_p->doorClosing)
|
|
{
|
|
if ((door_p->doorSize+=4)>=64)
|
|
{
|
|
door_p->doorSize=64;
|
|
door_p->doorClosing=false;
|
|
door_p->doorTimer+=MOVEDELAY;
|
|
}
|
|
else door_p->doorTimer+=MOVEDELAY;
|
|
}
|
|
else if (door_p->doorOpen && timecount>door_p->doorTimer && !door_p->doorBlocked)
|
|
{
|
|
door_p->doorClosing=true;
|
|
door_p->doorOpen=false;
|
|
SoundEffect(SN_DOOR,15,door_p->tilex<<FRACTILESHIFT,door_p->tiley<<FRACTILESHIFT);
|
|
door_p->doorTimer+=MOVEDELAY;
|
|
}
|
|
else door_p->doorTimer+=MOVEDELAY;
|
|
|
|
door_p->position=door_p->doorSize<<FRACBITS;
|
|
}
|
|
}
|
|
|
|
|
|
boolean CheckForSwitch(int x,int y,int angle,boolean doubleswitch)
|
|
{
|
|
int mapspot;
|
|
|
|
mapspot=y*MAPCOLS+x;
|
|
if (timecount<SwitchTime) return false;
|
|
if (angle>=SOUTH+DEGREE45 || angle<DEGREE45)
|
|
{
|
|
if (westwall[mapspot+1]==127) return true;
|
|
else if (westwall[mapspot+1]==128 && doubleswitch) return true;
|
|
else if (westwall[mapspot+1]==172) return true;
|
|
else if (westwall[mapspot+1]==173 && doubleswitch) return true;
|
|
else if (westwall[mapspot+1]==75) return true;
|
|
else if (westwall[mapspot+1]==76 && doubleswitch) return true;
|
|
else if (westwall[mapspot+1]==140) return true;
|
|
else if (westwall[mapspot+1]==141 && doubleswitch) return true;
|
|
else if (westwall[mapspot+1]==234) return true;
|
|
else if (westwall[mapspot+1]==235 && doubleswitch) return true;
|
|
}
|
|
else if (angle>=DEGREE45 && angle<NORTH+DEGREE45)
|
|
{
|
|
if (northwall[mapspot]==127) return true;
|
|
else if (northwall[mapspot]==128 && doubleswitch) return true;
|
|
else if (northwall[mapspot]==172) return true;
|
|
else if (northwall[mapspot]==173 && doubleswitch) return true;
|
|
else if (northwall[mapspot]==75) return true;
|
|
else if (northwall[mapspot]==76 && doubleswitch) return true;
|
|
else if (northwall[mapspot]==140) return true;
|
|
else if (northwall[mapspot]==141 && doubleswitch) return true;
|
|
else if (northwall[mapspot]==234) return true;
|
|
else if (northwall[mapspot]==235 && doubleswitch) return true;
|
|
}
|
|
else if (angle>=NORTH+DEGREE45 && angle<WEST+DEGREE45)
|
|
{
|
|
if (westwall[mapspot]==127) return true;
|
|
else if (westwall[mapspot]==128 && doubleswitch) return true;
|
|
else if (westwall[mapspot]==172) return true;
|
|
else if (westwall[mapspot]==173 && doubleswitch) return true;
|
|
else if (westwall[mapspot]==75) return true;
|
|
else if (westwall[mapspot]==76 && doubleswitch) return true;
|
|
else if (westwall[mapspot]==140) return true;
|
|
else if (westwall[mapspot]==141 && doubleswitch) return true;
|
|
else if (westwall[mapspot]==234) return true;
|
|
else if (westwall[mapspot]==235 && doubleswitch) return true;
|
|
}
|
|
else if (angle>=WEST+DEGREE45)
|
|
{
|
|
if (northwall[mapspot+MAPCOLS]==127) return true;
|
|
else if (northwall[mapspot+MAPCOLS]==128 && doubleswitch) return true;
|
|
else if (northwall[mapspot+MAPCOLS]==172) return true;
|
|
else if (northwall[mapspot+MAPCOLS]==173 && doubleswitch) return true;
|
|
else if (northwall[mapspot+MAPCOLS]==75) return true;
|
|
else if (northwall[mapspot+MAPCOLS]==76 && doubleswitch) return true;
|
|
else if (northwall[mapspot+MAPCOLS]==140) return true;
|
|
else if (northwall[mapspot+MAPCOLS]==141 && doubleswitch) return true;
|
|
else if (northwall[mapspot+MAPCOLS]==234) return true;
|
|
else if (northwall[mapspot+MAPCOLS]==235 && doubleswitch) return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
void SwitchWall(int x,int y,int angle,boolean doubleswitch)
|
|
{
|
|
int mapspot;
|
|
|
|
SoundEffect(SN_WALLSWITCH,0,x<<FRACTILESHIFT,y<<FRACTILESHIFT);
|
|
mapspot=y*MAPCOLS+x;
|
|
if (angle>=SOUTH+DEGREE45 || angle<DEGREE45)
|
|
{
|
|
if (westwall[mapspot+1]==127) westwall[mapspot+1]=128;
|
|
else if (westwall[mapspot+1]==128 && doubleswitch) westwall[mapspot+1]=127;
|
|
else if (westwall[mapspot+1]==172) westwall[mapspot+1]=173;
|
|
else if (westwall[mapspot+1]==173 && doubleswitch) westwall[mapspot+1]=172;
|
|
else if (westwall[mapspot+1]==75) westwall[mapspot+1]=76;
|
|
else if (westwall[mapspot+1]==76 && doubleswitch) westwall[mapspot+1]=75;
|
|
else if (westwall[mapspot+1]==140) westwall[mapspot+1]=141;
|
|
else if (westwall[mapspot+1]==141 && doubleswitch) westwall[mapspot+1]=140;
|
|
else if (westwall[mapspot+1]==234) westwall[mapspot+1]=235;
|
|
else if (westwall[mapspot+1]==235 && doubleswitch) westwall[mapspot+1]=234;
|
|
}
|
|
else if (angle>=DEGREE45 && angle<NORTH+DEGREE45)
|
|
{
|
|
if (northwall[mapspot]==127) northwall[mapspot]=128;
|
|
else if (northwall[mapspot]==128 && doubleswitch) northwall[mapspot]=127;
|
|
else if (northwall[mapspot]==172) northwall[mapspot]=173;
|
|
else if (northwall[mapspot]==173 && doubleswitch) northwall[mapspot]=172;
|
|
else if (northwall[mapspot]==75) northwall[mapspot]=76;
|
|
else if (northwall[mapspot]==76 && doubleswitch) northwall[mapspot]=75;
|
|
else if (northwall[mapspot]==140) northwall[mapspot]=141;
|
|
else if (northwall[mapspot]==141 && doubleswitch) northwall[mapspot]=140;
|
|
else if (northwall[mapspot]==234) northwall[mapspot]=235;
|
|
else if (northwall[mapspot]==235 && doubleswitch) northwall[mapspot]=234;
|
|
}
|
|
else if (angle>=NORTH+DEGREE45 && angle<WEST+DEGREE45)
|
|
{
|
|
if (westwall[mapspot]==127) westwall[mapspot]=128;
|
|
else if (westwall[mapspot]==128 && doubleswitch) westwall[mapspot]=127;
|
|
else if (westwall[mapspot]==172) westwall[mapspot]=173;
|
|
else if (westwall[mapspot]==173 && doubleswitch) westwall[mapspot]=172;
|
|
else if (westwall[mapspot]==75) westwall[mapspot]=76;
|
|
else if (westwall[mapspot]==76 && doubleswitch) westwall[mapspot]=75;
|
|
else if (westwall[mapspot]==140) westwall[mapspot]=141;
|
|
else if (westwall[mapspot]==141 && doubleswitch) westwall[mapspot]=140;
|
|
else if (westwall[mapspot]==234) westwall[mapspot]=235;
|
|
else if (westwall[mapspot]==235 && doubleswitch) westwall[mapspot]=234;
|
|
}
|
|
else if (angle>=WEST+DEGREE45)
|
|
{
|
|
if (northwall[mapspot+MAPCOLS]==127) northwall[mapspot+MAPCOLS]=128;
|
|
else if (northwall[mapspot+MAPCOLS]==128 && doubleswitch) northwall[mapspot+MAPCOLS]=127;
|
|
else if (northwall[mapspot+MAPCOLS]==172) northwall[mapspot+MAPCOLS]=173;
|
|
else if (northwall[mapspot+MAPCOLS]==173 && doubleswitch) northwall[mapspot+MAPCOLS]=172;
|
|
else if (northwall[mapspot+MAPCOLS]==75) northwall[mapspot+MAPCOLS]=76;
|
|
else if (northwall[mapspot+MAPCOLS]==76 && doubleswitch) northwall[mapspot+MAPCOLS]=75;
|
|
else if (northwall[mapspot+MAPCOLS]==140) northwall[mapspot+MAPCOLS]=141;
|
|
else if (northwall[mapspot+MAPCOLS]==141 && doubleswitch) northwall[mapspot+MAPCOLS]=140;
|
|
else if (northwall[mapspot+MAPCOLS]==234) northwall[mapspot+MAPCOLS]=235;
|
|
else if (northwall[mapspot+MAPCOLS]==235 && doubleswitch) northwall[mapspot+MAPCOLS]=234;
|
|
}
|
|
}
|
|
|
|
|
|
void CheckHere(int useit,fixed_t centerx,fixed_t centery,int angle)
|
|
/* check for door at centerx, centery */
|
|
{
|
|
int mapspot, x, y, x1, y1;
|
|
elevobj_t *elev_p;
|
|
boolean switchit;
|
|
|
|
TryDoor(centerx,centery);
|
|
x=centerx>>FRACTILESHIFT;
|
|
y=centery>>FRACTILESHIFT;
|
|
mapspot=y*MAPCOLS+x;
|
|
switchit=false;
|
|
|
|
if (switches[x][y])
|
|
{
|
|
if (useit)
|
|
{
|
|
if (!CheckForSwitch(x,y,angle,true))
|
|
goto skipit;
|
|
if (netmode)
|
|
NetCheckHere(centerx,centery,angle);
|
|
}
|
|
SwitchWall(x,y,angle,true);
|
|
Event(switches[x][y],false);
|
|
}
|
|
skipit:
|
|
switch (mapsprites[mapspot])
|
|
{
|
|
case SM_SWAPSWITCH:
|
|
if (useit && !CheckForSwitch(x,y,angle,true)) break;
|
|
if (useit && netmode) NetCheckHere(centerx,centery,angle);
|
|
for(elev_p=firstelevobj.next;elev_p!=&lastelevobj;elev_p=elev_p->next)
|
|
if (elev_p->type==E_SWAP)
|
|
{
|
|
if (elev_p->position==elev_p->ceiling)
|
|
{
|
|
elev_p->elevDown=true;
|
|
elev_p->elevTimer=timecount;
|
|
switchit=true;
|
|
}
|
|
else if (elev_p->position==elev_p->floor)
|
|
{
|
|
elev_p->elevUp=true;
|
|
elev_p->elevTimer=timecount;
|
|
switchit=true;
|
|
}
|
|
}
|
|
if (switchit)
|
|
{
|
|
SwitchWall(x,y,angle,true);
|
|
SwitchTime=timecount+210;
|
|
}
|
|
break;
|
|
|
|
case SM_STRIGGER:
|
|
for(elev_p=firstelevobj.next;elev_p!=&lastelevobj;elev_p=elev_p->next)
|
|
if (elev_p->type==E_SECRET && elev_p->elevDown==false && elev_p->elevUp==false)
|
|
{
|
|
x1=elev_p->mapspot%MAPCOLS;
|
|
y1=elev_p->mapspot/MAPCOLS;
|
|
if (abs(x1-x)<2 && abs(y1-y)<2)
|
|
{
|
|
switchit=true;
|
|
elev_p->elevDown=true;
|
|
elev_p->elevTimer=timecount;
|
|
CheckHere(false,x1<<FRACTILESHIFT,y1<<FRACTILESHIFT,angle);
|
|
}
|
|
}
|
|
if (switchit && useit && netmode)
|
|
NetCheckHere(centerx,centery,angle);
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
void chargeweapons(void)
|
|
{
|
|
int i, n;
|
|
longint time;
|
|
|
|
time=timecount;
|
|
for(i=0;i<5;i++)
|
|
{
|
|
n=player.weapons[i];
|
|
while (n!=-1 && weapons[n].charge<100 && time>=weapons[n].chargetime)
|
|
{
|
|
if (weapons[n].charge==0)
|
|
weapons[n].chargetime=timecount;
|
|
weapons[n].charge+=20;
|
|
weapons[n].chargetime+=weapons[n].chargerate;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/* timer access! ********************************************/
|
|
void ControlStub1(void)
|
|
{
|
|
}
|
|
|
|
boolean TryDoor(fixed_t xcenter, fixed_t ycenter)
|
|
{
|
|
int xl, yl, xh, yh, x, y;
|
|
doorobj_t *door_p, *last_p;
|
|
|
|
xl = (int)((xcenter-PLAYERSIZE) >> FRACTILESHIFT);
|
|
yl = (int)((ycenter-PLAYERSIZE - (TILEUNIT>>1)) >> FRACTILESHIFT);
|
|
xh = (int)((xcenter+PLAYERSIZE) >> FRACTILESHIFT);
|
|
yh = (int)((ycenter+PLAYERSIZE - (TILEUNIT>>1)) >> FRACTILESHIFT);
|
|
// check for doors on the north wall
|
|
for (y=yl+1;y<=yh;y++)
|
|
for (x=xl;x<=xh;x++)
|
|
{
|
|
if (mapflags[y*MAPSIZE+x] & FL_DOOR) // if tile has a door
|
|
{
|
|
last_p=&doorlist[numdoors];
|
|
for (door_p=doorlist; door_p != last_p; door_p++)
|
|
if (door_p->tilex==x && door_p->tiley==y && (door_p->orientation==dr_horizontal || door_p->orientation==dr_horizontal2))
|
|
{
|
|
if (door_p->doorOpen && !door_p->doorClosing) return true; // can move, door is open
|
|
else if (!door_p->doorOpen && door_p->doorBumpable && !door_p->doorOpening)
|
|
{
|
|
door_p->doorClosing=false;
|
|
door_p->doorOpening=true;
|
|
doorsound=true;
|
|
doorx=door_p->tilex<<FRACTILESHIFT;
|
|
doory=door_p->tiley<<FRACTILESHIFT;
|
|
if (door_p->orientation==dr_horizontal) TryDoor(xcenter+64*FRACUNIT,ycenter);
|
|
else TryDoor(xcenter-64*FRACUNIT,ycenter);
|
|
if (netmode) NetOpenDoor(xcenter,ycenter);
|
|
return false;
|
|
}
|
|
else if (!door_p->doorOpen && door_p->doorBumpable && door_p->doorClosing)
|
|
{
|
|
door_p->doorClosing=false;
|
|
door_p->doorOpening=true;
|
|
doorsound=true;
|
|
doorx=door_p->tilex<<FRACTILESHIFT;
|
|
doory=door_p->tiley<<FRACTILESHIFT;
|
|
if (door_p->orientation==dr_horizontal) TryDoor(xcenter+64*FRACUNIT,ycenter);
|
|
else TryDoor(xcenter-64*FRACUNIT,ycenter);
|
|
if (netmode) NetOpenDoor(xcenter,ycenter);
|
|
return false;
|
|
}
|
|
else return false;
|
|
}
|
|
}
|
|
}
|
|
// check for doors on the west wall
|
|
xl = (int)((xcenter-PLAYERSIZE - (TILEUNIT>>1)) >> FRACTILESHIFT);
|
|
yl = (int)((ycenter-PLAYERSIZE) >> FRACTILESHIFT);
|
|
xh = (int)((xcenter+PLAYERSIZE - (TILEUNIT>>1)) >> FRACTILESHIFT);
|
|
yh = (int)((ycenter+PLAYERSIZE) >> FRACTILESHIFT);
|
|
for (y=yl;y<=yh;y++)
|
|
for (x=xl+1;x<=xh;x++)
|
|
{
|
|
if (mapflags[y*MAPSIZE+x] & FL_DOOR) // if tile has a door
|
|
{
|
|
last_p=&doorlist[numdoors];
|
|
for (door_p=doorlist; door_p != last_p; door_p++)
|
|
if (door_p->tilex==x && door_p->tiley==y && (door_p->orientation==dr_vertical || door_p->orientation==dr_vertical2))
|
|
{
|
|
if (door_p->doorOpen && !door_p->doorClosing) return true; // can move, door is open
|
|
else if (!door_p->doorOpen && door_p->doorBumpable && !door_p->doorOpening)
|
|
{
|
|
door_p->doorOpening=true;
|
|
door_p->doorClosing=false;
|
|
doorsound=true;
|
|
doorx=door_p->tilex<<FRACTILESHIFT;
|
|
doory=door_p->tiley<<FRACTILESHIFT;
|
|
if (door_p->orientation==dr_vertical) TryDoor(xcenter,ycenter+64*FRACUNIT);
|
|
else TryDoor(xcenter,ycenter-64*FRACUNIT);
|
|
if (netmode) NetOpenDoor(xcenter,ycenter);
|
|
return false;
|
|
}
|
|
else if (!door_p->doorOpen && door_p->doorBumpable && door_p->doorClosing)
|
|
{
|
|
door_p->doorClosing=false;
|
|
door_p->doorOpening=true;
|
|
doorsound=true;
|
|
doorx=door_p->tilex<<FRACTILESHIFT;
|
|
doory=door_p->tiley<<FRACTILESHIFT;
|
|
if (door_p->orientation==dr_vertical) TryDoor(xcenter,ycenter+64*FRACUNIT);
|
|
else TryDoor(xcenter,ycenter-64*FRACUNIT);
|
|
if (netmode) NetOpenDoor(xcenter,ycenter);
|
|
return false;
|
|
}
|
|
else return false;
|
|
}
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
boolean TryMove(int angle,fixed_t xcenter, fixed_t ycenter)
|
|
{
|
|
int xl, yl, xh, yh, x, y, mapspot;
|
|
fixed_t pz;
|
|
|
|
if (angle<NORTH || angle>SOUTH)
|
|
{
|
|
xl=xcenter>>FRACTILESHIFT;
|
|
xh=(xcenter+PLAYERSIZE)>>FRACTILESHIFT;
|
|
}
|
|
else if (angle>NORTH && angle<SOUTH)
|
|
{
|
|
xh=xcenter>>FRACTILESHIFT;
|
|
xl=(xcenter-PLAYERSIZE)>>FRACTILESHIFT;
|
|
}
|
|
else
|
|
{
|
|
xh=(xcenter+PLAYERSIZE)>>FRACTILESHIFT;
|
|
xl=(xcenter-PLAYERSIZE)>>FRACTILESHIFT;
|
|
}
|
|
if (angle>WEST)
|
|
{
|
|
yl=ycenter>>FRACTILESHIFT;
|
|
yh=(ycenter+PLAYERSIZE)>>FRACTILESHIFT;
|
|
}
|
|
else if (angle<WEST && angle!=EAST)
|
|
{
|
|
yl=(ycenter-PLAYERSIZE)>>FRACTILESHIFT;
|
|
yh=ycenter>>FRACTILESHIFT;
|
|
}
|
|
else
|
|
{
|
|
yl=(ycenter-PLAYERSIZE)>>FRACTILESHIFT;
|
|
yh=(ycenter+PLAYERSIZE)>>FRACTILESHIFT;
|
|
}
|
|
pz=player.z - player.height + (26<<FRACBITS);
|
|
// check for solid walls
|
|
for (y=yl;y<=yh;y++)
|
|
for (x=xl;x<=xh;x++)
|
|
{
|
|
mapspot=MAPCOLS*y+x;
|
|
if ((y>yl && northwall[mapspot] && !(northflags[mapspot]&F_NOCLIP)) ||
|
|
(x>xl && westwall[mapspot] && !(westflags[mapspot]&F_NOCLIP))) return false;
|
|
if (mapspot!=player.mapspot)
|
|
{
|
|
if (mapsprites[mapspot]>0 && mapsprites[mapspot]<128) return false;
|
|
if (RF_GetFloorZ((x<<FRACTILESHIFT)+(32<<FRACBITS),(y<<FRACTILESHIFT)+(32<<FRACBITS))>pz) return false;
|
|
if (RF_GetCeilingZ((x<<FRACTILESHIFT)+(32<<FRACBITS),(y<<FRACTILESHIFT)+(32<<FRACBITS))<player.z+(10<<FRACBITS)) return false;
|
|
}
|
|
}
|
|
return true;
|
|
}
|
|
|
|
|
|
boolean ClipMove(int angle,fixed_t xmove, fixed_t ymove)
|
|
{
|
|
fixed_t dx, dy;
|
|
int angle2;
|
|
|
|
dx=player.x+xmove;
|
|
dy=player.y+ymove;
|
|
if (TryMove(angle,dx,dy) && TryDoor(dx,dy))
|
|
{
|
|
if (floorpic[(dy>>FRACTILESHIFT)*MAPCOLS+(dx>>FRACTILESHIFT)]==0) return false;
|
|
player.x+=xmove;
|
|
player.y+=ymove;
|
|
return true;
|
|
}
|
|
// the move goes into a wall, so try and move along one axis
|
|
if (xmove>0) angle2=EAST;
|
|
else angle2=WEST;
|
|
if (TryMove(angle2,dx,player.y) && TryDoor(dx,player.y))
|
|
{
|
|
if (floorpic[(player.y>>FRACTILESHIFT)*MAPCOLS+(dx>>FRACTILESHIFT)]==0)
|
|
return false;
|
|
player.x+=xmove;
|
|
return true;
|
|
}
|
|
if (ymove>0) angle2=SOUTH;
|
|
else angle2=NORTH;
|
|
if (TryMove(angle2,player.x,dy) && TryDoor(player.x,dy))
|
|
{
|
|
if (floorpic[(dy>>FRACTILESHIFT)*MAPCOLS+(player.x>>FRACTILESHIFT)]==0)
|
|
return false;
|
|
player.y+=ymove;
|
|
return true;
|
|
}
|
|
return false;
|
|
}
|
|
|
|
|
|
boolean Thrust(int angle,fixed_t speed)
|
|
{
|
|
fixed_t xmove, ymove;
|
|
int result;
|
|
|
|
angle&=ANGLES;
|
|
xmove=FIXEDMUL(speed,costable[angle]);
|
|
ymove=-FIXEDMUL(speed,sintable[angle]);
|
|
result=ClipMove(angle,xmove,ymove);
|
|
player.mapspot=(player.y>>FRACTILESHIFT)*MAPCOLS+(player.x>>FRACTILESHIFT);
|
|
return result;
|
|
}
|
|
|
|
|
|
void ControlMovement (void)
|
|
{
|
|
fixed_t modifiedSpeed;
|
|
int modifiedTurn, modifiedMoveUnit, modifiedturnunit, n;
|
|
fixed_t floorz, fz, xl, yl, xh, yh, maxz;
|
|
int maxx, maxy, mapspot;
|
|
|
|
if (Warping)
|
|
{
|
|
floorz=RF_GetFloorZ(player.x,player.y)+player.height;
|
|
if (player.z>floorz)
|
|
{
|
|
fallrate+=MOVEUNIT;
|
|
player.z-=fallrate;
|
|
if (player.z<floorz) player.z=floorz;
|
|
}
|
|
else if (player.z<floorz)
|
|
{
|
|
player.z=floorz;
|
|
fallrate=0;
|
|
}
|
|
return;
|
|
}
|
|
|
|
//#ifndef DEMO
|
|
// if (keyboard[SC_G] && timecount>keyboardDelay && !netmsgstatus)
|
|
// {
|
|
// SaveTheScreen=true;
|
|
// keyboardDelay=timecount+KBDELAY;
|
|
// }
|
|
//#endif
|
|
|
|
if (keyboard[SC_ESCAPE] && timecount>keyboardDelay && !netmsgstatus)
|
|
activatemenu=true;
|
|
|
|
if (keyboard[SC_F5] && keyboard[SC_LSHIFT] && timecount>keyboardDelay)
|
|
{
|
|
adjustvrangle=-SC.vrangle+DEFAULTVRANGLE;
|
|
adjustvrdist=-1;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
}
|
|
if (keyboard[SC_F4] && keyboard[SC_LSHIFT] && timecount>keyboardDelay)
|
|
{
|
|
adjustvrdist=72090;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
}
|
|
if (keyboard[SC_F3] && keyboard[SC_LSHIFT] && timecount>keyboardDelay)
|
|
{
|
|
adjustvrdist=59578;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
}
|
|
if (keyboard[SC_F2] && keyboard[SC_LSHIFT] && timecount>keyboardDelay)
|
|
{
|
|
adjustvrangle=1;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
}
|
|
if (keyboard[SC_F1] && keyboard[SC_LSHIFT] && timecount>keyboardDelay)
|
|
{
|
|
adjustvrangle=-1;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
}
|
|
|
|
if (keyboard[SC_F1] && timecount>keyboardDelay)
|
|
{
|
|
activatehelp=true;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
}
|
|
|
|
if ((keyboard[SC_F4] || (keyboard[SC_ALT] && keyboard[SC_Q]))
|
|
&& timecount>keyboardDelay) QuickExit=true;
|
|
|
|
if (keyboard[SC_F5] && timecount>keyboardDelay && !netmode)
|
|
activatebrief=true;
|
|
|
|
if (keyboard[SC_P] && timecount>keyboardDelay && !netmsgstatus)
|
|
paused=true;
|
|
|
|
/* change screen size */
|
|
if (keyboard[SC_F9] && !resizeScreen && timecount>keyboardDelay)
|
|
{
|
|
resizeScreen=1;
|
|
biggerScreen=1;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
if (SC.screensize<9) SC.screensize++;
|
|
return;
|
|
}
|
|
if (keyboard[SC_F10] && !resizeScreen && timecount>keyboardDelay)
|
|
{
|
|
resizeScreen=1;
|
|
biggerScreen=0;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
if (SC.screensize) SC.screensize--;
|
|
return;
|
|
}
|
|
|
|
if (keyboard[SC_MINUS] && timecount>keyboardDelay && !netmsgstatus)
|
|
{
|
|
switch (MapZoom)
|
|
{
|
|
case 8:
|
|
MapZoom=4;
|
|
break;
|
|
case 16:
|
|
MapZoom=8;
|
|
break;
|
|
}
|
|
keyboardDelay=timecount+KBDELAY;
|
|
}
|
|
if (keyboard[SC_PLUS] && timecount>keyboardDelay && !netmsgstatus)
|
|
{
|
|
switch (MapZoom)
|
|
{
|
|
case 4:
|
|
MapZoom=8;
|
|
break;
|
|
case 8:
|
|
MapZoom=16;
|
|
break;
|
|
}
|
|
keyboardDelay=timecount+KBDELAY;
|
|
}
|
|
|
|
if (in_button[bt_lookup] && !netmsgstatus) scrollview-=SCROLLRATE;
|
|
if (in_button[bt_lookdown] && !netmsgstatus) scrollview+=SCROLLRATE;
|
|
if (in_button[bt_centerview] && !netmsgstatus) scrollview=255;
|
|
|
|
if (scrollview==255)
|
|
{
|
|
if (player.scrollmin<0)
|
|
{
|
|
player.scrollmin+=SCROLLRATE;
|
|
player.scrollmax+=SCROLLRATE;
|
|
}
|
|
else if (player.scrollmin>0)
|
|
{
|
|
player.scrollmin-=SCROLLRATE;
|
|
player.scrollmax-=SCROLLRATE;
|
|
}
|
|
else scrollview=0;
|
|
}
|
|
|
|
/* display mode toggles */
|
|
if (keyboard[SC_M] && timecount>keyboardDelay && !netmsgstatus)
|
|
{
|
|
togglemapmode=true;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
}
|
|
if (keyboard[SC_H] && timecount>keyboardDelay && !netmsgstatus)
|
|
{
|
|
toggleheatmode=true;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
}
|
|
if (keyboard[SC_S] && timecount>keyboardDelay && !netmsgstatus)
|
|
{
|
|
togglemotionmode=true;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
}
|
|
if (in_button[bt_asscam] && timecount>keyboardDelay && !netmsgstatus)
|
|
{
|
|
ToggleRearView=true;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
}
|
|
if (keyboard[SC_TAB] && timecount>keyboardDelay && !netmsgstatus)
|
|
{
|
|
togglegoalitem=true;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
}
|
|
|
|
|
|
if (keyboard[SC_CAPSLOCK] && timecount>keyboardDelay)
|
|
{
|
|
toggleautorun=true;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
}
|
|
if (keyboard[SC_NUMLOCK] && timecount>keyboardDelay)
|
|
{
|
|
toggleautotarget=true;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
}
|
|
|
|
|
|
/* secrets */
|
|
if (newascii)
|
|
{
|
|
secretbuf[secretindex++]=lastascii;
|
|
if (secretindex>=19) specialcode=true;
|
|
if (netmsgstatus==1) // getting message
|
|
{
|
|
switch (lastascii)
|
|
{
|
|
case 27:
|
|
netmsgstatus=0;
|
|
break;
|
|
case 8:
|
|
netmsg[netmsgindex]=' ';
|
|
if (netmsgindex>0)
|
|
netmsgindex--;
|
|
netmsg[netmsgindex]='_';
|
|
break;
|
|
case 13:
|
|
netmsgstatus=2; // sending
|
|
netmsg[netmsgindex]=' ';
|
|
break;
|
|
default:
|
|
netmsg[netmsgindex]=lastascii;
|
|
if (netmsgindex<29)
|
|
netmsgindex++;
|
|
netmsg[netmsgindex]='_';
|
|
break;
|
|
}
|
|
}
|
|
newascii=false;
|
|
secretdelay=timecount+KBDELAY*5;
|
|
}
|
|
if (timecount>secretdelay)
|
|
{
|
|
specialcode=true;
|
|
secretdelay=timecount+KBDELAY*5;
|
|
}
|
|
|
|
if (keyboard[SC_F6] && netmode && netmsgstatus==0 && timecount>keyboardDelay)
|
|
{
|
|
memset(netmsg,0,sizeof(netmsg));
|
|
netmsgstatus=1;
|
|
netmsgindex=0;
|
|
netmsg[0]='_';
|
|
keyboardDelay=timecount+KBDELAY;
|
|
}
|
|
|
|
if (keyboard[SC_F7])
|
|
newsong=true;
|
|
|
|
if (in_button[bt_invright] && timecount>keyboardDelay)
|
|
{
|
|
goiright=true;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
inventorytime=timecount+(3*70);
|
|
}
|
|
if (in_button[bt_invleft] && timecount>keyboardDelay)
|
|
{
|
|
goileft=true;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
inventorytime=timecount+(3*70);
|
|
}
|
|
|
|
/* he's dead jim! */
|
|
if (player.angst==0)
|
|
{
|
|
|
|
if (floorpic[player.mapspot]>=57 && floorpic[player.mapspot]<=59)
|
|
{
|
|
if (player.z>RF_GetFloorZ(player.x,player.y)+(40<<FRACBITS))
|
|
player.z-=FRACUNIT;
|
|
else if (player.z<RF_GetFloorZ(player.x,player.y)+(40<<FRACBITS))
|
|
player.z=RF_GetFloorZ(player.x,player.y)+(40<<FRACBITS);
|
|
}
|
|
else
|
|
{
|
|
if (player.z>RF_GetFloorZ(player.x,player.y)+(12<<FRACBITS))
|
|
player.z-=FRACUNIT;
|
|
else if (player.z<RF_GetFloorZ(player.x,player.y)+(12<<FRACBITS))
|
|
player.z=RF_GetFloorZ(player.x,player.y)+(12<<FRACBITS);
|
|
}
|
|
if (keyboard[SC_SPACE]) deadrestart=true;
|
|
return;
|
|
}
|
|
|
|
if (in_button[bt_useitem] && timecount>keyboardDelay)
|
|
{
|
|
useitem=true;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
inventorytime=timecount+(3*70);
|
|
}
|
|
|
|
/* change weapon */
|
|
if (keyboard[SC_1] && !changingweapons && player.currentweapon!=0 && !netmsgstatus)
|
|
{
|
|
changingweapons=true;
|
|
weaponlowering=true;
|
|
newweapon=0;
|
|
}
|
|
else if (keyboard[SC_2] && !changingweapons && player.currentweapon!=1 && player.weapons[1]!=-1 && !netmsgstatus)
|
|
{
|
|
changingweapons=true;
|
|
weaponlowering=true;
|
|
newweapon=1;
|
|
}
|
|
else if (keyboard[SC_3] && !changingweapons && player.currentweapon!=2 && player.weapons[2]!=-1 && !netmsgstatus)
|
|
{
|
|
changingweapons=true;
|
|
weaponlowering=true;
|
|
newweapon=2;
|
|
}
|
|
else if (keyboard[SC_4] && !changingweapons && player.currentweapon!=3 && player.weapons[3]!=-1 && !netmsgstatus)
|
|
{
|
|
changingweapons=true;
|
|
weaponlowering=true;
|
|
newweapon=3;
|
|
}
|
|
else if (keyboard[SC_5] && !changingweapons && player.currentweapon!=4 && player.weapons[4]!=-1 && !netmsgstatus)
|
|
{
|
|
changingweapons=true;
|
|
weaponlowering=true;
|
|
newweapon=4;
|
|
}
|
|
|
|
if (in_button[bt_jump] && timecount>keyboardDelay && fallrate==0 && !netmsgstatus)
|
|
{
|
|
fallrate-=FALLUNIT*9+player.jumpmod;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
}
|
|
|
|
/* check run/slow keys */
|
|
if (in_button[bt_run] || autorun)
|
|
{
|
|
modifiedSpeed=(PLAYERMOVESPEED)*6 + player.runmod;
|
|
modifiedTurn=playerturnspeed*2.5;
|
|
modifiedMoveUnit=MOVEUNIT*2;
|
|
modifiedturnunit=turnunit;
|
|
}
|
|
else
|
|
{
|
|
modifiedSpeed=(PLAYERMOVESPEED)*3.5 + player.walkmod;
|
|
modifiedTurn=playerturnspeed;
|
|
modifiedMoveUnit=MOVEUNIT;
|
|
modifiedturnunit=turnunit*2;
|
|
}
|
|
|
|
floorz=RF_GetFloorZ(player.x,player.y)+player.height;
|
|
if (floorpic[player.mapspot]>=57 && floorpic[player.mapspot]<=59)
|
|
{
|
|
if (player.z==floorz)
|
|
modifiedSpeed>>=1;
|
|
}
|
|
|
|
/* check strafe */
|
|
if ((in_button[bt_straf] || in_button[bt_slideleft] || in_button[bt_slideright]) && !netmsgstatus)
|
|
{
|
|
if (in_button[bt_west] || in_button[bt_slideleft])
|
|
{
|
|
strafrate-=modifiedMoveUnit;
|
|
if (strafrate<-modifiedSpeed) strafrate+=modifiedMoveUnit;
|
|
}
|
|
if (in_button[bt_east] || in_button[bt_slideright])
|
|
{
|
|
strafrate+=modifiedMoveUnit;
|
|
if (strafrate>modifiedSpeed) strafrate-=modifiedMoveUnit;
|
|
}
|
|
else if (!in_button[bt_west] && !in_button[bt_slideleft])
|
|
{
|
|
if (strafrate<0) strafrate+=MOVEUNIT;
|
|
else if (strafrate>0) strafrate-=MOVEUNIT;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (strafrate<0) strafrate+=MOVEUNIT;
|
|
else if (strafrate>0) strafrate-=MOVEUNIT;
|
|
|
|
/* not strafing */
|
|
if (in_button[bt_east])
|
|
{
|
|
turnrate-=modifiedturnunit;
|
|
if (turnrate<-modifiedTurn)
|
|
turnrate=-modifiedTurn;
|
|
player.angle+=turnrate;
|
|
}
|
|
else if (in_button[bt_west])
|
|
{
|
|
turnrate+=modifiedturnunit;
|
|
if (turnrate>modifiedTurn)
|
|
turnrate=modifiedTurn;
|
|
player.angle+=turnrate;
|
|
}
|
|
else
|
|
{
|
|
if (turnrate<0)
|
|
{
|
|
turnrate+=modifiedturnunit;
|
|
if (turnrate>0)
|
|
turnrate=0;
|
|
}
|
|
else if (turnrate>0)
|
|
{
|
|
turnrate-=modifiedturnunit;
|
|
if (turnrate<0)
|
|
turnrate=0;
|
|
}
|
|
player.angle+=turnrate;
|
|
}
|
|
player.angle&=ANGLES;
|
|
}
|
|
|
|
if (strafrate<0)
|
|
{
|
|
if (!Thrust(player.angle+NORTH,-strafrate))
|
|
{
|
|
moverate=0;
|
|
strafrate=0;
|
|
}
|
|
}
|
|
else if (strafrate>0)
|
|
{
|
|
if (!Thrust(player.angle+SOUTH,strafrate))
|
|
{
|
|
moverate=0;
|
|
strafrate=0;
|
|
}
|
|
}
|
|
|
|
/* forward/backwards move */
|
|
if (in_button[bt_north]) moveforward=1;
|
|
else if (in_button[bt_south]) moveforward=-1;
|
|
else moveforward=0;
|
|
|
|
/* compute move vectors */
|
|
if (moveforward==1)
|
|
{
|
|
if (moverate<modifiedSpeed) moverate+=modifiedMoveUnit;
|
|
if (moverate>modifiedSpeed) moverate-=modifiedMoveUnit;
|
|
}
|
|
else if (moveforward==-1)
|
|
{
|
|
if (moverate>-modifiedSpeed) moverate-=modifiedMoveUnit;
|
|
if (moverate<-modifiedSpeed) moverate+=modifiedMoveUnit;
|
|
}
|
|
else if (moverate!=0)
|
|
{
|
|
if (moverate<0) moverate+=MOVEUNIT;
|
|
else moverate-=MOVEUNIT;
|
|
}
|
|
|
|
/* move along move vector & compute head bobbing */
|
|
if (moverate<0)
|
|
{
|
|
if (headbob==MAXBOBS-1) headbob=0;
|
|
else ++headbob;
|
|
if (wbobcount==4)
|
|
{
|
|
wbobcount=0;
|
|
if (weapbob==MAXBOBS-1) weapbob=0;
|
|
else ++weapbob;
|
|
}
|
|
else ++wbobcount;
|
|
if (!Thrust(player.angle+WEST,-moverate)) moverate=0;
|
|
}
|
|
else if (moverate>0)
|
|
{
|
|
if (headbob==MAXBOBS-1) headbob=0;
|
|
else ++headbob;
|
|
if (wbobcount==4)
|
|
{
|
|
wbobcount=0;
|
|
if (weapbob==MAXBOBS-1) weapbob=0;
|
|
else ++weapbob;
|
|
}
|
|
else ++wbobcount;
|
|
if (!Thrust(player.angle,moverate)) moverate=0;
|
|
}
|
|
else if (timecount&8)
|
|
{
|
|
if (weapmove[weapbob]!=0)
|
|
{
|
|
if (abs(weapmove[weapbob-1])<abs(weapmove[weapbob])) --weapbob;
|
|
else
|
|
{
|
|
++weapbob;
|
|
if (weapbob==MAXBOBS) weapbob=0;
|
|
}
|
|
}
|
|
if (headmove[headbob]!=0)
|
|
{
|
|
if (abs(headmove[headbob-1])<abs(headmove[headbob])) --headbob;
|
|
else
|
|
{
|
|
++headbob;
|
|
if (headbob==MAXBOBS) headbob=0;
|
|
}
|
|
}
|
|
}
|
|
|
|
/* try to open a door in front of player */
|
|
if (in_button[bt_use] && timecount>keyboardDelay && !netmsgstatus)
|
|
{
|
|
checktrigger=true;
|
|
keyboardDelay=timecount+KBDELAY*2;
|
|
}
|
|
|
|
/* fire a weapon */
|
|
if (in_button[bt_fire] && weapons[player.weapons[player.currentweapon]].charge==100 && !changingweapons)
|
|
{
|
|
n=player.weapons[player.currentweapon];
|
|
if (n==18 || n==4)
|
|
{
|
|
if (player.ammo[weapons[n].ammotype]>=weapons[n].ammorate && weapmode==0) weapmode=1;
|
|
}
|
|
else RF_SetActionHook(fireweapon);
|
|
}
|
|
|
|
/* compute falling or stepping up higher */
|
|
xl=(player.x-(FRACUNIT*8))>>FRACTILESHIFT;
|
|
xh=(player.x+(FRACUNIT*8))>>FRACTILESHIFT;
|
|
yl=(player.y-(FRACUNIT*8))>>FRACTILESHIFT;
|
|
yh=(player.y+(FRACUNIT*8))>>FRACTILESHIFT;
|
|
floorz=player.z-player.height;
|
|
maxz=0;
|
|
for(;xl<=xh;xl++)
|
|
for(;yl<=yh;yl++)
|
|
{
|
|
fz=RF_GetFloorZ((xl*64+32)<<FRACBITS,(yl*64+32)<<FRACBITS);
|
|
if (fz>maxz && fz<floorz+(20<<FRACBITS))
|
|
{
|
|
maxz=fz;
|
|
maxx=xl;
|
|
maxy=yl;
|
|
}
|
|
}
|
|
if (maxz==0)
|
|
{
|
|
maxz=RF_GetFloorZ(player.x,player.y);
|
|
maxx=player.x>>FRACTILESHIFT;
|
|
maxy=player.y>>FRACTILESHIFT;
|
|
}
|
|
floorz=maxz + player.height;
|
|
|
|
if (abs(player.z-floorz)<=10<<FRACBITS)
|
|
{
|
|
mapspot=maxy*MAPCOLS + maxx;
|
|
if (floorflags[mapspot]&F_RIGHT)
|
|
Thrust(EAST,FRACUNIT*4);
|
|
if (floorflags[mapspot]&F_LEFT)
|
|
Thrust(WEST,FRACUNIT*4);
|
|
if (floorflags[mapspot]&F_UP)
|
|
Thrust(NORTH,FRACUNIT*4);
|
|
if (floorflags[mapspot]&F_DOWN)
|
|
Thrust(SOUTH,FRACUNIT*4);
|
|
}
|
|
|
|
// floorz=RF_GetFloorZ(player.x,player.y)+player.height;
|
|
|
|
player.z-=fallrate;
|
|
if (player.z>floorz) fallrate+=FALLUNIT;
|
|
else if (player.z<floorz)
|
|
{
|
|
if (fallrate>=12*FRACUNIT) falldamage=(fallrate>>FRACBITS)/7;
|
|
player.z+=FRACUNIT<<2;
|
|
if (player.z>floorz) player.z=floorz;
|
|
fallrate=0;
|
|
}
|
|
floorz=RF_GetCeilingZ(player.x,player.y);
|
|
if (player.z+(10<<FRACBITS)>floorz)
|
|
{
|
|
player.z=floorz-(10<<FRACBITS);
|
|
fallrate=FALLUNIT;
|
|
}
|
|
}
|
|
|
|
|
|
void PlayerCommand(void)
|
|
/* called by an interrupt */
|
|
{
|
|
// int i;
|
|
|
|
/* if (playback)
|
|
{
|
|
while (demobuffer[recordindex]!=255)
|
|
keyboard[demobuffer[recordindex++]]^=1;
|
|
recordindex++;
|
|
if (recordindex>=RECBUFSIZE || !player.angst) quitgame=true;
|
|
}
|
|
else if (recording)
|
|
{
|
|
for(i=0;i<NUMCODES;i++)
|
|
if (keyboard[i]!=demokb[i])
|
|
{
|
|
demobuffer[recordindex++]=i;
|
|
demokb[i]=keyboard[i];
|
|
}
|
|
demobuffer[recordindex]=255;
|
|
++recordindex;
|
|
if (recordindex>=RECBUFSIZE || !player.angst) quitgame=true;
|
|
} */
|
|
INT_ReadControls();
|
|
ControlMovement();
|
|
}
|
|
void ControlStub2(void)
|
|
{
|
|
}
|
|
|
|
|
|
void newlights(void)
|
|
{
|
|
if (lighting+changelight>4096) lighting=4096;
|
|
else lighting+=changelight;
|
|
if (lighting<=0) lighting=1;
|
|
RF_SetLights((fixed_t)lighting<<FRACBITS);
|
|
changelight=0;
|
|
}
|
|
|
|
|
|
void ChangeScroll(void)
|
|
{
|
|
if (scrollview==255) return;
|
|
if (player.scrollmin+scrollview<=-MAXSCROLL || player.scrollmin+scrollview>=MAXSCROLL)
|
|
{
|
|
scrollview=0;
|
|
return;
|
|
}
|
|
player.scrollmin+=scrollview;
|
|
player.scrollmax+=scrollview;
|
|
scrollview=0;
|
|
}
|
|
|
|
|
|
void Special_Code(char *s)
|
|
/* secrets */
|
|
{
|
|
scaleobj_t *hsprite_p, *sprite_p;
|
|
int i;
|
|
|
|
if (netmode && !MS_CheckParm("ravenger"))
|
|
{
|
|
specialcode=false;
|
|
memset(secretbuf,0,sizeof(secretbuf));
|
|
secretindex=0;
|
|
return;
|
|
}
|
|
if (stricmp(s,"belfast")==0)
|
|
{
|
|
for (sprite_p=firstscaleobj.next; sprite_p!=&lastscaleobj;sprite_p=sprite_p->next)
|
|
if (sprite_p->hitpoints)
|
|
{
|
|
mapsprites[(sprite_p->y>>FRACTILESHIFT)*MAPCOLS+(sprite_p->x>>FRACTILESHIFT)]=0;
|
|
hsprite_p=sprite_p;
|
|
sprite_p=sprite_p->prev;
|
|
KillSprite(hsprite_p,S_BULLET3);
|
|
player.bodycount++;
|
|
}
|
|
writemsg("DeathKiss");
|
|
}
|
|
else if (stricmp(s,"allahmode")==0)
|
|
{
|
|
if (godmode)
|
|
{
|
|
godmode=false;
|
|
writemsg("GodMode Off");
|
|
}
|
|
else
|
|
{
|
|
godmode=true;
|
|
writemsg("GodMode On");
|
|
}
|
|
}
|
|
else if (stricmp(s,"channel7")==0)
|
|
{
|
|
writemsg("Rob Lays Eggs");
|
|
}
|
|
else if (stricmp(s,"lizardman")==0)
|
|
{
|
|
writemsg("Jeremy Lays Eggs");
|
|
}
|
|
else if (stricmp(s,"dominatrix")==0)
|
|
{
|
|
writemsg("On your knees worm!");
|
|
}
|
|
else if (stricmp(s,"cyborg")==0)
|
|
{
|
|
writemsg("Psyborgs Rule!");
|
|
}
|
|
else if (stricmp(s,"mooman")==0)
|
|
{
|
|
writemsg("Brady is better than you, and that ain't saying much!");
|
|
}
|
|
else if (stricmp(s,"raven")==0)
|
|
{
|
|
player.angst=player.maxangst;
|
|
player.shield=player.maxshield;
|
|
writemsg("Ambrosia");
|
|
}
|
|
else if (stricmp(s,"omni")==0)
|
|
{
|
|
for(i=0;i<MAPCOLS*MAPROWS;i++)
|
|
if (northwall[i] & 255) player.northmap[i]=WALL_COLOR;
|
|
for(i=0;i<MAPCOLS*MAPROWS;i++)
|
|
if (westwall[i] & 255) player.westmap[i]=WALL_COLOR;
|
|
writemsg("Omniscience");
|
|
}
|
|
else if (stricmp(s,"kmfdm")==0)
|
|
{
|
|
player.ammo[0]=999;
|
|
player.ammo[1]=999;
|
|
player.ammo[2]=999;
|
|
writemsg("Backpack of Holding");
|
|
oldshots=-1;
|
|
}
|
|
else if (stricmp(s,"beavis")==0)
|
|
{
|
|
player.levelscore=100;
|
|
player.primaries[0]=pcount[0];
|
|
player.primaries[1]=pcount[1];
|
|
for (i=0;i<7;i++)
|
|
player.secondaries[i]=scount[i];
|
|
writemsg("Time Warp");
|
|
}
|
|
else if (stricmp(s,"gulliver")==0)
|
|
{
|
|
if (midgetmode)
|
|
{
|
|
for (sprite_p=firstscaleobj.next;sprite_p!=&lastscaleobj;sprite_p=sprite_p->next)
|
|
sprite_p->scale--;
|
|
midgetmode=false;
|
|
writemsg("Midget Mode Off");
|
|
}
|
|
else
|
|
{
|
|
for (sprite_p=firstscaleobj.next;sprite_p!=&lastscaleobj;sprite_p=sprite_p->next)
|
|
sprite_p->scale++;
|
|
midgetmode=true;
|
|
writemsg("Midget Mode On");
|
|
}
|
|
}
|
|
else if (stricmp(s,"gimme")==0)
|
|
{
|
|
player.inventory[0]=20;
|
|
player.inventory[1]=20;
|
|
player.inventory[2]=15;
|
|
player.inventory[3]=10;
|
|
player.inventory[4]=10;
|
|
player.inventory[5]=10;
|
|
player.inventory[6]=10;
|
|
player.inventory[7]=10;
|
|
player.inventory[8]=10;
|
|
#ifndef DEMO
|
|
player.inventory[9]=10;
|
|
player.inventory[10]=10;
|
|
player.inventory[11]=10;
|
|
player.inventory[12]=10;
|
|
#endif
|
|
writemsg("Bag of Holding");
|
|
}
|
|
else if (stricmp(s,"taco")==0)
|
|
{
|
|
enemyviewmode^=1;
|
|
writemsg("Enemy view toggled");
|
|
}
|
|
#if !defined(DEMO) && !defined(GAME1) && !defined(GAME2) && !defined(GAME3)
|
|
if (s[0]=='g' && s[1]=='o')
|
|
{
|
|
if (stricmp(s,"go1")==0) newmap(0,2);
|
|
else if (stricmp(s,"go2")==0) newmap(1,2);
|
|
else if (stricmp(s,"go3")==0) newmap(2,2);
|
|
else if (stricmp(s,"go4")==0) newmap(3,2);
|
|
else if (stricmp(s,"go5")==0) newmap(4,2);
|
|
else if (stricmp(s,"go6")==0) newmap(5,2);
|
|
else if (stricmp(s,"go7")==0) newmap(6,2);
|
|
else if (stricmp(s,"go8")==0) newmap(7,2);
|
|
else if (stricmp(s,"go9")==0) newmap(8,2);
|
|
else if (stricmp(s,"go10")==0) newmap(9,2);
|
|
else if (stricmp(s,"go11")==0) newmap(10,2);
|
|
else if (stricmp(s,"go12")==0) newmap(11,2);
|
|
else if (stricmp(s,"go13")==0) newmap(12,2);
|
|
else if (stricmp(s,"go14")==0) newmap(13,2);
|
|
else if (stricmp(s,"go15")==0) newmap(14,2);
|
|
else if (stricmp(s,"go16")==0) newmap(15,2);
|
|
else if (stricmp(s,"go17")==0) newmap(16,2);
|
|
else if (stricmp(s,"go18")==0) newmap(17,2);
|
|
else if (stricmp(s,"go19")==0) newmap(18,2);
|
|
else if (stricmp(s,"go20")==0) newmap(19,2);
|
|
else if (stricmp(s,"go21")==0) newmap(20,2);
|
|
else if (stricmp(s,"go22")==0) newmap(21,2);
|
|
else if (stricmp(s,"go23")==0) newmap(22,2);
|
|
else if (stricmp(s,"go24")==0) newmap(23,2);
|
|
else if (stricmp(s,"go25")==0) newmap(24,2);
|
|
else if (stricmp(s,"go26")==0) newmap(25,2);
|
|
else if (stricmp(s,"go27")==0) newmap(26,2);
|
|
else if (stricmp(s,"go28")==0) newmap(27,2);
|
|
else if (stricmp(s,"go29")==0) newmap(28,2);
|
|
else if (stricmp(s,"go30")==0) newmap(29,2);
|
|
else if (stricmp(s,"go31")==0) newmap(30,2);
|
|
else if (stricmp(s,"go32")==0) newmap(31,2);
|
|
INT_TimerHook(PlayerCommand);
|
|
}
|
|
#endif
|
|
else if (s[0]=='b' && s[1]=='l')
|
|
{
|
|
if (stricmp(s,"blammo1")==0) player.weapons[2]=2;
|
|
else if (stricmp(s,"blammo2")==0) player.weapons[2]=3;
|
|
else if (stricmp(s,"blammo3")==0) player.weapons[2]=4;
|
|
else if (stricmp(s,"blammo4")==0) player.weapons[2]=16;
|
|
else if (stricmp(s,"blammo5")==0) player.weapons[2]=17;
|
|
else if (stricmp(s,"blammo6")==0) player.weapons[2]=18;
|
|
if (player.weapons[2]>=0)
|
|
{
|
|
loadweapon(player.weapons[2]);
|
|
player.currentweapon=2;
|
|
weapmode=0;
|
|
}
|
|
}
|
|
specialcode=false;
|
|
memset(secretbuf,0,sizeof(secretbuf));
|
|
secretindex=0;
|
|
}
|
|
|
|
|
|
void CheckSpawnAreas(void)
|
|
{
|
|
spawnarea_t *sa;
|
|
int i, count, type, stype;
|
|
scaleobj_t *sprite_p;
|
|
|
|
if (specialeffect==SE_WARPJAMMER) return;
|
|
if (netwarpjammer && netwarpjamtime>timecount) return;
|
|
|
|
sa=spawnareas;
|
|
for(i=0;i<numspawnareas;i++,sa++)
|
|
if (timecount>=sa->time)
|
|
{
|
|
if (mapsprites[sa->mapspot]==0 && sa->mapspot!=player.mapspot)
|
|
{
|
|
switch (sa->type)
|
|
{
|
|
case 0:
|
|
if (!netmode)
|
|
{
|
|
#ifdef DEMO
|
|
type=(clock()+MS_RndT())%110;
|
|
#else
|
|
type=(clock()+MS_RndT())%114;
|
|
#endif
|
|
if (type<30) stype=S_ENERGY;
|
|
else if (type<60) stype=S_BALLISTIC;
|
|
else if (type<90) stype=S_PLASMA;
|
|
#ifdef DEMO
|
|
else if (type<96) stype=S_IGRENADE;
|
|
else if (type<98) stype=S_IREVERSO;
|
|
else if (type<102) stype=S_IPROXMINE;
|
|
else if (type<106) stype=S_ITIMEMINE;
|
|
else if (type<108) stype=S_IINSTAWALL;
|
|
else stype=S_ICLONE;
|
|
#else
|
|
else if (type<96) stype=S_IGRENADE;
|
|
else if (type<98) stype=S_IREVERSO;
|
|
else if (type<102) stype=S_IPROXMINE;
|
|
else if (type<106) stype=S_ITIMEMINE;
|
|
else if (type<108) stype=S_IINSTAWALL;
|
|
else if (type<110) stype=S_ICLONE;
|
|
else if (type<112) stype=S_IJAMMER;
|
|
else stype=S_ISTEALER;
|
|
#endif
|
|
sa->time=timecount+(clock()&255) + 3500 - (350*(player.difficulty+1));
|
|
}
|
|
else
|
|
{
|
|
#ifdef DEMO
|
|
type=(clock()+MS_RndT())%110;
|
|
#else
|
|
type=(clock()+MS_RndT())%146;
|
|
#endif
|
|
if (type<30) stype=S_ENERGY;
|
|
else if (type<60) stype=S_BALLISTIC;
|
|
else if (type<90) stype=S_PLASMA;
|
|
#ifdef DEMO
|
|
else if (type<96) stype=S_IGRENADE;
|
|
else if (type<98) stype=S_IREVERSO;
|
|
else if (type<102) stype=S_IPROXMINE;
|
|
else if (type<106) stype=S_ITIMEMINE;
|
|
else if (type<108) stype=S_IDECOY;
|
|
else stype=S_IINSTAWALL;
|
|
#else
|
|
else if (type<98) stype=S_IGRENADE;
|
|
else if (type<102) stype=S_IREVERSO;
|
|
else if (type<112) stype=S_IPROXMINE;
|
|
else if (type<116) stype=S_ITIMEMINE;
|
|
else if (type<120) stype=S_IDECOY;
|
|
else if (type<134) stype=S_IINSTAWALL;
|
|
else if (type<138) stype=S_IINVIS;
|
|
else if (type<142) stype=S_ISTEALER;
|
|
else stype=S_IHOLO;
|
|
#endif
|
|
sa->time=timecount + (clock()&255) + (9-greedcom->numplayers)*437;
|
|
}
|
|
break;
|
|
case 1:
|
|
if (!netmode)
|
|
{
|
|
#ifdef DEMO
|
|
type=(clock()+MS_RndT())%110;
|
|
#else
|
|
type=(clock()+MS_RndT())%114;
|
|
#endif
|
|
if (type<15) stype=S_MEDPAK1;
|
|
else if (type<22) stype=S_MEDPAK2;
|
|
else if (type<30) stype=S_MEDPAK3;
|
|
else if (type<45) stype=S_MEDPAK4;
|
|
else if (type<60) stype=S_SHIELD4;
|
|
else if (type<67) stype=S_SHIELD3;
|
|
else if (type<75) stype=S_SHIELD2;
|
|
else if (type<90) stype=S_SHIELD1;
|
|
#ifdef DEMO
|
|
else if (type<96) stype=S_IGRENADE;
|
|
else if (type<98) stype=S_IREVERSO;
|
|
else if (type<102) stype=S_IPROXMINE;
|
|
else if (type<106) stype=S_ITIMEMINE;
|
|
else if (type<108) stype=S_IINSTAWALL;
|
|
else stype=S_ICLONE;
|
|
#else
|
|
else if (type<96) stype=S_IGRENADE;
|
|
else if (type<98) stype=S_IREVERSO;
|
|
else if (type<102) stype=S_IPROXMINE;
|
|
else if (type<106) stype=S_ITIMEMINE;
|
|
else if (type<108) stype=S_IINSTAWALL;
|
|
else if (type<110) stype=S_ICLONE;
|
|
else if (type<112) stype=S_IJAMMER;
|
|
else stype=S_ISTEALER;
|
|
#endif
|
|
sa->time=timecount+(clock()&255) + 3500 - (350*(player.difficulty+1));
|
|
}
|
|
else
|
|
{
|
|
#ifdef DEMO
|
|
type=(clock()+MS_RndT())%110;
|
|
#else
|
|
type=(clock()+MS_RndT())%116;
|
|
#endif
|
|
if (type<15) stype=S_MEDPAK1;
|
|
else if (type<22) stype=S_MEDPAK2;
|
|
else if (type<30) stype=S_MEDPAK3;
|
|
else if (type<45) stype=S_MEDPAK4;
|
|
else if (type<60) stype=S_SHIELD4;
|
|
else if (type<67) stype=S_SHIELD3;
|
|
else if (type<75) stype=S_SHIELD2;
|
|
else if (type<90) stype=S_SHIELD1;
|
|
#ifdef DEMO
|
|
else if (type<96) stype=S_IGRENADE;
|
|
else if (type<98) stype=S_IREVERSO;
|
|
else if (type<102) stype=S_IPROXMINE;
|
|
else if (type<106) stype=S_ITIMEMINE;
|
|
else if (type<108) stype=S_IDECOY;
|
|
else stype=S_IINSTAWALL;
|
|
#else
|
|
else if (type<96) stype=S_IGRENADE;
|
|
else if (type<98) stype=S_IREVERSO;
|
|
else if (type<102) stype=S_IPROXMINE;
|
|
else if (type<106) stype=S_ITIMEMINE;
|
|
else if (type<108) stype=S_IDECOY;
|
|
else if (type<110) stype=S_IINSTAWALL;
|
|
else if (type<110) stype=S_IINVIS;
|
|
else if (type<112) stype=S_IJAMMER;
|
|
else if (type<114) stype=S_ISTEALER;
|
|
else stype=S_IHOLO;
|
|
#endif
|
|
sa->time=timecount + (clock()&255) + (9-greedcom->numplayers)*437;
|
|
}
|
|
break;
|
|
case 10:
|
|
stype=S_MONSTER1;
|
|
sa->time=timecount+(clock()&255) + (2100*(player.difficulty+1));
|
|
break;
|
|
case 11:
|
|
stype=S_MONSTER2;
|
|
sa->time=timecount+(clock()&255) + (4200*(player.difficulty+1));
|
|
break;
|
|
case 12:
|
|
stype=S_MONSTER3;
|
|
sa->time=timecount+(clock()&255) + (2100*(player.difficulty+1));
|
|
break;
|
|
case 13:
|
|
stype=S_MONSTER4;
|
|
sa->time=timecount+(clock()&255) + (10500*(player.difficulty+1));
|
|
break;
|
|
case 14:
|
|
stype=S_MONSTER5;
|
|
sa->time=timecount+(clock()&255) + (4200*(player.difficulty+1));
|
|
break;
|
|
case 15:
|
|
stype=S_MONSTER6;
|
|
sa->time=timecount+(clock()&255) + (4200*(player.difficulty+1));
|
|
break;
|
|
case 16:
|
|
stype=S_MONSTER7;
|
|
sa->time=timecount+(clock()&255) + (4200*(player.difficulty+1));
|
|
break;
|
|
case 17:
|
|
stype=S_MONSTER8;
|
|
sa->time=timecount+(clock()&255) + (4200*(player.difficulty+1));
|
|
break;
|
|
case 18:
|
|
stype=S_MONSTER9;
|
|
sa->time=timecount+(clock()&255) + (4200*(player.difficulty+1));
|
|
break;
|
|
case 19:
|
|
stype=S_MONSTER10;
|
|
sa->time=timecount+(clock()&255) + (1200*(player.difficulty+1));
|
|
break;
|
|
case 20:
|
|
stype=S_MONSTER11;
|
|
sa->time=timecount+(clock()&255) + (4200*(player.difficulty+1));
|
|
break;
|
|
case 21:
|
|
stype=S_MONSTER12;
|
|
sa->time=timecount+(clock()&255) + (4200*(player.difficulty+1));
|
|
break;
|
|
case 22:
|
|
stype=S_MONSTER13;
|
|
sa->time=timecount+(clock()&255) + (4200*(player.difficulty+1));
|
|
break;
|
|
case 23:
|
|
stype=S_MONSTER14;
|
|
sa->time=timecount+(clock()&255) + (4200*(player.difficulty+1));
|
|
break;
|
|
case 24:
|
|
stype=S_MONSTER15;
|
|
sa->time=timecount+(clock()&255) + (4200*(player.difficulty+1));
|
|
break;
|
|
|
|
case 100:
|
|
stype=S_MONSTER8_NS;
|
|
sa->time=timecount+(clock()&255) + (4200*(player.difficulty+1));
|
|
break;
|
|
case 101:
|
|
stype=S_MONSTER9_NS;
|
|
sa->time=timecount+(clock()&255) + (4200*(player.difficulty+1));
|
|
break;
|
|
}
|
|
|
|
if (sa->type>=10)
|
|
{
|
|
count=0;
|
|
for (sprite_p=firstscaleobj.next; sprite_p!=&lastscaleobj;sprite_p=sprite_p->next)
|
|
if (sprite_p->type==stype && sprite_p->hitpoints) ++count;
|
|
}
|
|
else count=0;
|
|
|
|
if (count<MAXSPAWN)
|
|
{
|
|
for (sprite_p=firstscaleobj.next; sprite_p!=&lastscaleobj;sprite_p=sprite_p->next)
|
|
if ((sprite_p->type==S_GENERATOR || (sprite_p->type>=S_GENSTART && sprite_p->type<=S_GENEND))
|
|
&& sprite_p->x==sa->mapx && sprite_p->y==sa->mapy)
|
|
{
|
|
sprite_p=sprite_p->prev;
|
|
RF_RemoveSprite(sprite_p->next);
|
|
}
|
|
if (sa->type>=10)
|
|
for (sprite_p=firstscaleobj.next; sprite_p!=&lastscaleobj;sprite_p=sprite_p->next)
|
|
if (sprite_p->type==stype && sprite_p->hitpoints==0)
|
|
{
|
|
RF_RemoveSprite(sprite_p);
|
|
break;
|
|
}
|
|
if (!netmode || (netmode && playernum==0))
|
|
{
|
|
SpawnSprite(stype,sa->mapx,sa->mapy,0,0,0,0,true,0);
|
|
SpawnSprite(S_WARP,sa->mapx,sa->mapy,0,0,0,0,true,0);
|
|
if (netmode && sa->type>=10)
|
|
NetSendSpawn(stype,sa->mapx,sa->mapy,0,0,0,0,true,0);
|
|
}
|
|
}
|
|
}
|
|
else sa->time=timecount+(clock()&255) + 7000;
|
|
}
|
|
}
|
|
|
|
|
|
void CheckBonusItem(void)
|
|
{
|
|
scaleobj_t *sprite;
|
|
|
|
if (timecount>BonusItem.time)
|
|
{
|
|
if (netmode && playernum!=0) return; // player 0 spawns the bonuses
|
|
|
|
if (BonusItem.score>0)
|
|
{
|
|
for (sprite=firstscaleobj.next; sprite!=&lastscaleobj;sprite=sprite->next)
|
|
if (sprite->type==S_BONUSITEM)
|
|
{
|
|
RF_RemoveSprite(sprite);
|
|
mapsprites[BonusItem.mapspot]=0;
|
|
break;
|
|
}
|
|
SpawnSprite(S_WARP,(BonusItem.tilex*MAPSIZE+32)<<FRACBITS,(BonusItem.tiley*MAPSIZE+32)<<FRACBITS,0,0,0,0,false,0);
|
|
}
|
|
do
|
|
{
|
|
BonusItem.tilex=(clock()+MS_RndT())&63;
|
|
BonusItem.tiley=(clock()+MS_RndT())&63;
|
|
BonusItem.mapspot=BonusItem.tiley*MAPCOLS + BonusItem.tilex;
|
|
} while (floorpic[BonusItem.mapspot]==0 || mapsprites[BonusItem.mapspot] || mapeffects[BonusItem.mapspot]&FL_FLOOR
|
|
|| floorheight[BonusItem.mapspot]==ceilingheight[BonusItem.mapspot]);
|
|
BonusItem.score=2000 + (clock()&7)*300;
|
|
BonusItem.time=timecount + bonustime + (clock()&1023);
|
|
BonusItem.num=clock()%MAXRANDOMITEMS;
|
|
BonusItem.name=randnames[BonusItem.num];
|
|
BonusItem.sprite=SpawnSprite(S_BONUSITEM,(BonusItem.tilex*MAPSIZE+32)<<FRACBITS,(BonusItem.tiley*MAPSIZE+32)<<FRACBITS,0,0,0,0,false,0);
|
|
SpawnSprite(S_WARP,(BonusItem.tilex*MAPSIZE+32)<<FRACBITS,(BonusItem.tiley*MAPSIZE+32)<<FRACBITS,0,0,0,0,false,0);
|
|
BonusItem.sprite->basepic+=BonusItem.num;
|
|
oldgoalitem=-1;
|
|
if (netmode) NetBonusItem();
|
|
goalitem=0;
|
|
}
|
|
}
|
|
|
|
|
|
void TimeUpdate(void)
|
|
{
|
|
// elevobj_t *elev_p;
|
|
longint time;
|
|
// int i;
|
|
|
|
chargeweapons();
|
|
UpdateMouse();
|
|
if (netmode) NetGetData();
|
|
if (netmode)
|
|
{
|
|
NetGetData();
|
|
if (timecount>netsendtime)
|
|
{
|
|
if (player.angst) NetSendPlayerData();
|
|
netsendtime=timecount + 3 + greedcom->numplayers;
|
|
}
|
|
NetGetData();
|
|
}
|
|
time=timecount;
|
|
UpdateSound();
|
|
while (time>=spritemovetime)
|
|
{
|
|
if (netmode) NetGetData();
|
|
if (numprocesses)
|
|
{
|
|
Process();
|
|
if (netmode) NetGetData();
|
|
}
|
|
|
|
// if (recording || playback) rndofs=0;
|
|
|
|
memset(reallight,0,MAPROWS*MAPCOLS*4);
|
|
MoveSprites();
|
|
|
|
if (netmode)
|
|
{
|
|
NetGetData();
|
|
spritemovetime+=2;
|
|
}
|
|
|
|
spritemovetime+=8;
|
|
|
|
/* if (waterdrop)
|
|
{
|
|
waterdrop=false;
|
|
for(i=0;i<MAPCOLS*MAPROWS;i++)
|
|
if ((floorpic[i]==57 || floorpic[i]==58 || floorpic[i]==59) && floorheight[i])
|
|
{
|
|
floorheight[i]--;
|
|
waterdrop=true;
|
|
}
|
|
if (!waterdrop)
|
|
{
|
|
for(elev_p=firstelevobj.next;elev_p!=&lastelevobj;elev_p=elev_p->next)
|
|
if (elev_p->elevTimer==0x70000000 && !elev_p->elevDown)
|
|
{
|
|
elev_p->elevDown=true;
|
|
elev_p->elevTimer=timecount;
|
|
SoundEffect(SN_DOOR,15,(elev_p->mapspot&63)<<FRACTILESHIFT,(elev_p->mapspot>>6)<<FRACTILESHIFT);
|
|
}
|
|
}
|
|
} */
|
|
}
|
|
UpdateMouse();
|
|
if (netmode) NetGetData();
|
|
if (numspawnareas) CheckSpawnAreas();
|
|
if (netmode) NetGetData();
|
|
CheckElevators();
|
|
if (netmode) NetGetData();
|
|
CheckBonusItem();
|
|
if (netmode) NetGetData();
|
|
if (doorsound)
|
|
{
|
|
doorsound=false;
|
|
SoundEffect(SN_DOOR,15,doorx,doory);
|
|
}
|
|
if (netmode) NetGetData();
|
|
UpdateMouse();
|
|
}
|
|
|
|
|
|
extern pevent_t playerdata[MAXPLAYERS];
|
|
|
|
|
|
void RearView(void)
|
|
{
|
|
int scrollmin1, scrollmax1, view, location;
|
|
|
|
view=currentViewSize*2;
|
|
location=viewLocation;
|
|
windowWidth=64;
|
|
windowHeight=64;
|
|
windowLeft=0;
|
|
windowTop=0;
|
|
windowSize=4096;
|
|
viewLocation=(int)screen;
|
|
scrollmin1=player.scrollmin;
|
|
scrollmax1=player.scrollmax;
|
|
SetViewSize(windowWidth,windowHeight);
|
|
ResetScalePostWidth(windowWidth);
|
|
scrollmin=0;
|
|
scrollmax=64;
|
|
memcpy(pixelangle,campixelangle,sizeof(pixelangle));
|
|
memcpy(pixelcosine,campixelcosine,sizeof(pixelcosine));
|
|
if (enemyviewmode && goalitem>0)
|
|
RF_RenderView(playerdata[goalitem-1].x,playerdata[goalitem-1].y,playerdata[goalitem-1].z,playerdata[goalitem-1].angle);
|
|
else
|
|
RF_RenderView(player.x,player.y,player.z,player.angle+WEST);
|
|
memcpy(rearbuf,viewbuffer,sizeof(rearbuf));
|
|
windowLeft=viewLoc[view];
|
|
windowTop=viewLoc[view+1];
|
|
viewLocation=location;
|
|
SetViewSize(viewSizes[view],viewSizes[view+1]);
|
|
ResetScalePostWidth(windowWidth);
|
|
memcpy(pixelangle,wallpixelangle,sizeof(pixelangle));
|
|
memcpy(pixelcosine,wallpixelcosine,sizeof(pixelcosine));
|
|
player.scrollmin=scrollmin1;
|
|
player.scrollmax=scrollmax1;
|
|
}
|
|
|
|
|
|
void NewGoalItem(void)
|
|
{
|
|
togglegoalitem=false;
|
|
goalitem++;
|
|
|
|
if (!netmode)
|
|
{
|
|
if (goalitem==0 && BonusItem.score==0) goalitem++;
|
|
while (goalitem>=1 && goalitem<=2 && primaries[(goalitem-1)*2]==-1) goalitem++;
|
|
while (goalitem>=3 && goalitem<=9 && secondaries[(goalitem-3)*2]==-1) goalitem++;
|
|
if (goalitem>=10)
|
|
{
|
|
goalitem=0;
|
|
if (goalitem==0 && BonusItem.score==0) goalitem++;
|
|
while (goalitem>=1 && goalitem<=2 && primaries[(goalitem-1)*2]==-1) goalitem++;
|
|
while (goalitem>=3 && goalitem<=9 && secondaries[(goalitem-3)*2]==-1) goalitem++;
|
|
if (goalitem==10) goalitem=-1;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (goalitem==0 && BonusItem.score==0) goalitem++;
|
|
if (goalitem>greedcom->numplayers)
|
|
{
|
|
goalitem=0;
|
|
if (goalitem==0 && BonusItem.score==0) goalitem++;
|
|
if (goalitem>greedcom->numplayers)
|
|
goalitem=-1;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void GrabTheScreen(void)
|
|
{
|
|
FILE *f;
|
|
char name[15];
|
|
byte palette[768];
|
|
static int count=0;
|
|
|
|
if (MS_CheckParm("GRAB"))
|
|
{
|
|
sprintf(name,"grab%i.raw",count);
|
|
++count;
|
|
f=fopen(name,"wb");
|
|
if (f==NULL)
|
|
MS_Error("Error opening the screen grab file!");
|
|
fwrite((char *)0xa0000,64000,1,f);
|
|
VI_GetPalette(palette);
|
|
fwrite(palette,768,1,f);
|
|
fclose(f);
|
|
}
|
|
SaveTheScreen=false;
|
|
}
|
|
|
|
|
|
void startover(int restartvalue)
|
|
{
|
|
byte *vrscr;
|
|
int i;
|
|
|
|
if (SC.vrhelmet==1)
|
|
{
|
|
SVRDosSetRegistration(FALSE);
|
|
SVRDosSetMode(SVR_320_200);
|
|
vrscr=screen;
|
|
screen=(byte*)0xA0000;
|
|
for (i=0;i<SCREENHEIGHT;i++)
|
|
ylookup[i]=screen+i*SCREENWIDTH;
|
|
memcpy(screen,vrscr,64000);
|
|
}
|
|
|
|
if (netmode) NetGetData();
|
|
resetdisplay();
|
|
if (restartvalue!=1)
|
|
{
|
|
player.score=0;
|
|
player.levelscore=levelscore;
|
|
player.weapons[2]=-1;
|
|
player.weapons[3]=-1;
|
|
player.weapons[4]=-1;
|
|
player.currentweapon=0;
|
|
loadweapon(player.weapons[0]);
|
|
|
|
if (!netmode)
|
|
{
|
|
memset(player.inventory,0,sizeof(player.inventory));
|
|
player.inventory[7]=2;
|
|
player.inventory[5]=2;
|
|
player.inventory[4]=2;
|
|
player.inventory[2]=4;
|
|
}
|
|
else
|
|
{
|
|
if (player.inventory[7]<2)
|
|
player.inventory[7]=2;
|
|
if (player.inventory[5]<2)
|
|
player.inventory[5]=2;
|
|
if (player.inventory[4]<2)
|
|
player.inventory[4]=2;
|
|
if (player.inventory[2]<4)
|
|
player.inventory[2]=4;
|
|
}
|
|
player.bodycount=0;
|
|
player.ammo[0]=100;
|
|
player.ammo[1]=100;
|
|
player.ammo[2]=100;
|
|
player.angst=player.maxangst;
|
|
player.shield=200;
|
|
}
|
|
player.holopic=0;
|
|
|
|
if (!netmode)
|
|
{
|
|
newmap(player.map,restartvalue);
|
|
INT_TimerHook(PlayerCommand);
|
|
}
|
|
else
|
|
respawnplayer();
|
|
|
|
if (netmode) NetGetData();
|
|
|
|
exitexists=false;
|
|
specialeffecttime=0;
|
|
ExitLevel=false;
|
|
if (currentViewSize>=5)
|
|
VI_DrawPic(4,149,statusbar[2]);
|
|
if (currentViewSize>=4)
|
|
VI_DrawMaskedPic(0,0,statusbar[3]);
|
|
if (netmode) NetGetData();
|
|
turnrate=0;
|
|
moverate=0;
|
|
fallrate=0;
|
|
strafrate=0;
|
|
deadrestart=false;
|
|
player.primaries[0]=0;
|
|
player.primaries[1]=0;
|
|
for(i=0;i<7;i++)
|
|
player.secondaries[i]=0;
|
|
|
|
if (SC.vrhelmet==1)
|
|
{
|
|
screen=vrscr;
|
|
for (i=0;i<SCREENHEIGHT;i++)
|
|
ylookup[i]=screen+i*SCREENWIDTH;
|
|
SVRDosSetMode(SVR_320_200_X);
|
|
VI_SetColor(255,63,63,63);
|
|
SVRDosSetBlackCode(0);
|
|
SVRDosSetWhiteCode(255);
|
|
SVRDosSetRegistration(TRUE);
|
|
SVRDosSetImage(LEFT,0,0,320,200,screen);
|
|
SVRDosSetImage(RIGHT,0,0,320,200,screen);
|
|
}
|
|
}
|
|
|
|
|
|
void EndLevel(void)
|
|
{
|
|
byte *vrscr;
|
|
int i;
|
|
|
|
if (SC.vrhelmet==1)
|
|
{
|
|
SVRDosSetRegistration(FALSE);
|
|
SVRDosSetMode(SVR_320_200);
|
|
vrscr=screen;
|
|
screen=(byte*)0xA0000;
|
|
for (i=0;i<SCREENHEIGHT;i++)
|
|
ylookup[i]=screen+i*SCREENWIDTH;
|
|
memcpy(screen,vrscr,64000);
|
|
}
|
|
VI_FadeOut(0,256,0,0,0,64);
|
|
memset(screen,0,64000);
|
|
VI_SetPalette(CA_CacheLump(CA_GetNamedNum("palette")));
|
|
if (SC.vrhelmet==1)
|
|
{
|
|
VI_SetColor(255,63,63,63);
|
|
SVRDosSetBlackCode(0);
|
|
SVRDosSetWhiteCode(255);
|
|
}
|
|
++player.map;
|
|
if (SC.vrhelmet==1)
|
|
{
|
|
screen=vrscr;
|
|
for (i=0;i<SCREENHEIGHT;i++)
|
|
ylookup[i]=screen+i*SCREENWIDTH;
|
|
SVRDosSetMode(SVR_320_200_X);
|
|
VI_SetPalette(CA_CacheLump(CA_GetNamedNum("palette")));
|
|
VI_SetColor(255,63,63,63);
|
|
SVRDosSetBlackCode(0);
|
|
SVRDosSetWhiteCode(255);
|
|
SVRDosSetRegistration(TRUE);
|
|
SVRDosSetImage(LEFT,0,0,320,200,screen);
|
|
SVRDosSetImage(RIGHT,0,0,320,200,screen);
|
|
}
|
|
startover(1);
|
|
}
|
|
|
|
|
|
void WarpAnim(void)
|
|
{
|
|
if (Warping==1)
|
|
{
|
|
CA_ReadLump(CA_GetNamedNum("WARPLIGHTS"),colormaps);
|
|
Warping=2;
|
|
}
|
|
else if (Warping==2)
|
|
{
|
|
if (lighting>=128) changelight=-128;
|
|
else
|
|
{
|
|
Warping=3;
|
|
player.x=WarpX;
|
|
player.y=WarpY;
|
|
}
|
|
}
|
|
else if (Warping==3)
|
|
{
|
|
if (lighting<SC.ambientlight) changelight=128;
|
|
else
|
|
{
|
|
CA_ReadLump(CA_GetNamedNum("LIGHTS"),colormaps);
|
|
Warping=0;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void DrawHolo(void)
|
|
{
|
|
int i, j, count, bottom, top, x, y;
|
|
byte *collumn;
|
|
scalepic_t *spic;
|
|
|
|
spic=lumpmain[player.holopic]; // draw the pic for it
|
|
x=5;
|
|
for (i=0;i<spic->width;i++,x++)
|
|
if (spic->collumnofs[i])
|
|
{
|
|
collumn=(byte *)spic+spic->collumnofs[i];
|
|
top=*(collumn+1);
|
|
bottom=*(collumn);
|
|
count=bottom-top+1;
|
|
collumn+=2;
|
|
y=windowHeight-top-count-5;
|
|
for (j=0;j<count;j++,collumn++,y++)
|
|
if (y>=0 && *collumn) *(viewylookup[y]+x)=*collumn;
|
|
}
|
|
}
|
|
|
|
|
|
void RunMenu(void)
|
|
{
|
|
byte *vrscr;
|
|
int i;
|
|
|
|
if (SC.vrhelmet==1)
|
|
{
|
|
SVRDosSetRegistration(FALSE);
|
|
SVRDosSetMode(SVR_320_200);
|
|
vrscr=screen;
|
|
screen=(byte*)0xA0000;
|
|
for (i=0;i<SCREENHEIGHT;i++)
|
|
ylookup[i]=screen+i*SCREENWIDTH;
|
|
memcpy(screen,vrscr,64000);
|
|
}
|
|
player.timecount=timecount;
|
|
ShowMenu(0);
|
|
if (!netmode) timecount=player.timecount;
|
|
activatemenu=false;
|
|
INT_TimerHook(PlayerCommand);
|
|
keyboardDelay=timecount+KBDELAY;
|
|
if (SC.vrhelmet==1)
|
|
{
|
|
screen=vrscr;
|
|
for (i=0;i<SCREENHEIGHT;i++)
|
|
ylookup[i]=screen+i*SCREENWIDTH;
|
|
SVRDosSetMode(SVR_320_200_X);
|
|
VI_SetPalette(CA_CacheLump(CA_GetNamedNum("palette")));
|
|
VI_SetColor(255,63,63,63);
|
|
SVRDosSetBlackCode(0);
|
|
SVRDosSetWhiteCode(255);
|
|
SVRDosSetRegistration(TRUE);
|
|
SVRDosSetImage(LEFT,0,0,320,200,screen);
|
|
SVRDosSetImage(RIGHT,0,0,320,200,screen);
|
|
}
|
|
}
|
|
|
|
|
|
void RunHelp(void)
|
|
{
|
|
byte *vrscr;
|
|
int i;
|
|
|
|
if (SC.vrhelmet==1)
|
|
{
|
|
SVRDosSetRegistration(FALSE);
|
|
SVRDosSetMode(SVR_320_200);
|
|
vrscr=screen;
|
|
screen=(byte*)0xA0000;
|
|
for (i=0;i<SCREENHEIGHT;i++)
|
|
ylookup[i]=screen+i*SCREENWIDTH;
|
|
memcpy(screen,vrscr,64000);
|
|
}
|
|
player.timecount=timecount;
|
|
INT_TimerHook(NULL);
|
|
ShowHelp();
|
|
INT_TimerHook(PlayerCommand);
|
|
activatehelp=false;
|
|
timecount=player.timecount;
|
|
keyboardDelay=timecount+KBDELAY;
|
|
if (SC.vrhelmet==1)
|
|
{
|
|
VI_SetColor(255,63,63,63);
|
|
SVRDosSetBlackCode(0);
|
|
SVRDosSetWhiteCode(255);
|
|
screen=vrscr;
|
|
for (i=0;i<SCREENHEIGHT;i++)
|
|
ylookup[i]=screen+i*SCREENWIDTH;
|
|
SVRDosSetMode(SVR_320_200_X);
|
|
SVRDosSetRegistration(TRUE);
|
|
SVRDosSetImage(LEFT,0,0,320,200,screen);
|
|
SVRDosSetImage(RIGHT,0,0,320,200,screen);
|
|
}
|
|
}
|
|
|
|
|
|
void RunQuickExit(void)
|
|
{
|
|
byte *vrscr;
|
|
int i;
|
|
|
|
if (SC.vrhelmet==1)
|
|
{
|
|
SVRDosSetRegistration(FALSE);
|
|
SVRDosSetMode(SVR_320_200);
|
|
vrscr=screen;
|
|
screen=(byte*)0xA0000;
|
|
for (i=0;i<SCREENHEIGHT;i++)
|
|
ylookup[i]=screen+i*SCREENWIDTH;
|
|
memcpy(screen,vrscr,64000);
|
|
}
|
|
QuickExit=false;
|
|
MouseShow();
|
|
if (ShowQuit(PlayerCommand)) quitgame=true;
|
|
MouseHide();
|
|
keyboardDelay=timecount+KBDELAY;
|
|
if (SC.vrhelmet==1)
|
|
{
|
|
screen=vrscr;
|
|
for (i=0;i<SCREENHEIGHT;i++)
|
|
ylookup[i]=screen+i*SCREENWIDTH;
|
|
SVRDosSetMode(SVR_320_200_X);
|
|
SVRDosSetRegistration(TRUE);
|
|
SVRDosSetImage(LEFT,0,0,320,200,screen);
|
|
SVRDosSetImage(RIGHT,0,0,320,200,screen);
|
|
}
|
|
}
|
|
|
|
|
|
void RunPause(void)
|
|
{
|
|
byte *vrscr;
|
|
int i;
|
|
|
|
if (SC.vrhelmet==1)
|
|
{
|
|
SVRDosSetRegistration(FALSE);
|
|
SVRDosSetMode(SVR_320_200);
|
|
vrscr=screen;
|
|
screen=(byte*)0xA0000;
|
|
for (i=0;i<SCREENHEIGHT;i++)
|
|
ylookup[i]=screen+i*SCREENWIDTH;
|
|
memcpy(screen,vrscr,64000);
|
|
}
|
|
if (paused)
|
|
{
|
|
gamepause=true;
|
|
if (netmode) NetPause();
|
|
}
|
|
player.timecount=timecount;
|
|
ShowPause();
|
|
timecount=player.timecount;
|
|
if (paused && netmode) NetUnPause();
|
|
paused=false;
|
|
gamepause=false;
|
|
INT_TimerHook(PlayerCommand);
|
|
keyboardDelay=timecount+KBDELAY;
|
|
if (SC.vrhelmet==1)
|
|
{
|
|
screen=vrscr;
|
|
for (i=0;i<SCREENHEIGHT;i++)
|
|
ylookup[i]=screen+i*SCREENWIDTH;
|
|
SVRDosSetMode(SVR_320_200_X);
|
|
SVRDosSetRegistration(TRUE);
|
|
SVRDosSetImage(LEFT,0,0,320,200,screen);
|
|
SVRDosSetImage(RIGHT,0,0,320,200,screen);
|
|
}
|
|
}
|
|
|
|
|
|
void PrepareNexus(void)
|
|
{
|
|
int i, j, mapspot, x, y;
|
|
|
|
for(i=-MAPCOLS;i<=MAPCOLS;i+=MAPCOLS)
|
|
for(j=-1;j<=1;j++)
|
|
{
|
|
mapspot=player.mapspot+i+j;
|
|
if (mapspot!=player.mapspot && floorpic[mapspot] && mapsprites[mapspot]==0)
|
|
{
|
|
x=((player.mapspot+i+j)&63)*MAPSIZE+32;
|
|
y=((player.mapspot+i+j)/64)*MAPSIZE+32;
|
|
SpawnSprite(S_EXIT,x<<FRACBITS,y<<FRACBITS,0,0,0,0,0,0);
|
|
SoundEffect(SN_NEXUS,0,x<<FRACBITS,y<<FRACBITS);
|
|
SoundEffect(SN_NEXUS,0,x<<FRACBITS,y<<FRACBITS);
|
|
exitexists=true;
|
|
writemsg("Translation Nexus Created!");
|
|
return;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void RunBrief(void)
|
|
{
|
|
byte *vrscr;
|
|
int i;
|
|
|
|
if (SC.vrhelmet==1)
|
|
{
|
|
SVRDosSetRegistration(FALSE);
|
|
SVRDosSetMode(SVR_320_200);
|
|
vrscr=screen;
|
|
screen=(byte*)0xA0000;
|
|
for (i=0;i<SCREENHEIGHT;i++)
|
|
ylookup[i]=screen+i*SCREENWIDTH;
|
|
memcpy(screen,vrscr,64000);
|
|
}
|
|
memcpy(viewbuffer,screen,64000);
|
|
MissionBriefing(player.map);
|
|
INT_TimerHook(PlayerCommand);
|
|
memcpy(screen,viewbuffer,64000);
|
|
activatebrief=false;
|
|
if (SC.vrhelmet==1)
|
|
{
|
|
VI_SetColor(255,63,63,63);
|
|
SVRDosSetBlackCode(0);
|
|
SVRDosSetWhiteCode(255);
|
|
screen=vrscr;
|
|
for (i=0;i<SCREENHEIGHT;i++)
|
|
ylookup[i]=screen+i*SCREENWIDTH;
|
|
SVRDosSetMode(SVR_320_200_X);
|
|
SVRDosSetRegistration(TRUE);
|
|
SVRDosSetImage(LEFT,0,0,320,200,screen);
|
|
SVRDosSetImage(RIGHT,0,0,320,200,screen);
|
|
}
|
|
}
|
|
|
|
|
|
void JamWarps(void)
|
|
{
|
|
scaleobj_t *sp, *t;
|
|
int mapspot, i;
|
|
spawnarea_t *sa;
|
|
|
|
if (specialeffect!=SE_WARPJAMMER)
|
|
{
|
|
specialeffect=SE_WARPJAMMER;
|
|
specialeffecttime=timecount+70*60;
|
|
totaleffecttime=70*60;
|
|
--player.inventory[11];
|
|
for (sp=firstscaleobj.next; sp!=&lastscaleobj;)
|
|
if (sp->type==S_GENERATOR || (sp->type>=S_GENSTART && sp->type<=S_GENEND))
|
|
{
|
|
mapspot=(sp->y>>FRACTILESHIFT)*MAPCOLS + (sp->x>>FRACTILESHIFT);
|
|
mapsprites[mapspot]=0;
|
|
t=sp;
|
|
sp=sp->next;
|
|
RF_RemoveSprite(t);
|
|
}
|
|
else
|
|
sp=sp->next;
|
|
sa=spawnareas;
|
|
for(i=0;i<numspawnareas;i++,sa++)
|
|
sa->time=timecount;
|
|
writemsg("Used Warp Jammer");
|
|
}
|
|
warpjammer=false;
|
|
}
|
|
|
|
|
|
void SelectNewSong(void)
|
|
{
|
|
songnum++;
|
|
songnum%=32;
|
|
selectsong(songnum);
|
|
newsong=false;
|
|
}
|
|
|
|
|
|
void UpdateView(fixed_t px,fixed_t py,fixed_t pz,int angle,int update)
|
|
{
|
|
int weaponx, weapony, i, x;
|
|
pic_t *pic;
|
|
static pic_t *wpic;
|
|
char dbg[80];
|
|
static int weapbob1, wx, wy;
|
|
|
|
angle&=ANGLES;
|
|
|
|
if (update)
|
|
weapbob1=weapbob;
|
|
|
|
if (update)
|
|
rtimecount=timecount;
|
|
RF_RenderView(px,py,pz,angle);
|
|
|
|
if (update==1) TimeUpdate();
|
|
|
|
if (player.holopic) DrawHolo();
|
|
|
|
if (netmode) NetGetData();
|
|
|
|
if (timecount<RearViewTime)
|
|
{
|
|
x=windowWidth-66;
|
|
for(i=1;i<64;i++)
|
|
{
|
|
memcpy(viewylookup[i+1]+x,rearbuf+(i<<6),64);
|
|
*(viewylookup[i+1]+x-1)=30;
|
|
*(viewylookup[i+1]+x+64)=30;
|
|
}
|
|
memset(viewylookup[65]+x-1,30,66);
|
|
memset(viewylookup[1]+x-1,30,66);
|
|
}
|
|
|
|
/* update sprite movement */
|
|
if (update==1) TimeUpdate();
|
|
|
|
/* draw the weapon pic */
|
|
|
|
if (player.angst) // only if alive
|
|
{
|
|
if (update)
|
|
wpic=weaponpic[weapmode];
|
|
|
|
weaponx=((windowWidth-wpic->width)>>1) + (weapmove[weapbob1]>>1);
|
|
weapony=windowHeight - wpic->height + (weapmove[weapbob1/2]>>3);
|
|
|
|
if (currentViewSize>=6) weapony+=25;
|
|
else if (currentViewSize==5) weapony+=15;
|
|
if (changingweapons && weaponlowering)
|
|
{
|
|
weaponychange+=15;
|
|
weapony+=weaponychange;
|
|
if (weapony>=windowHeight-20)
|
|
{
|
|
weaponlowering=false;
|
|
player.currentweapon=newweapon;
|
|
loadweapon(player.weapons[newweapon]);
|
|
weapmode=0;
|
|
wpic=weaponpic[weapmode];
|
|
weaponychange=weaponpic[weapmode]->height-20;
|
|
weapony=windowHeight-21;
|
|
weaponx=((windowWidth-wpic->width)>>1) + (weapmove[weapbob1]>>1);
|
|
}
|
|
}
|
|
else if (changingweapons)
|
|
{
|
|
weaponychange-=10;
|
|
if (weaponychange<=0) changingweapons=false;
|
|
else weapony+=weaponychange;
|
|
}
|
|
|
|
if (update)
|
|
{
|
|
wx=weaponx;
|
|
wy=weapony;
|
|
}
|
|
else
|
|
{
|
|
weaponx=wx;
|
|
weapony=wy;
|
|
}
|
|
|
|
if (netmode) NetGetData();
|
|
if (weapmode==0) VI_DrawMaskedPicToBuffer2(weaponx,weapony,wpic);
|
|
else VI_DrawMaskedPicToBuffer(weaponx,weapony,wpic);
|
|
}
|
|
|
|
/* update sprite movement */
|
|
if (update==1) TimeUpdate();
|
|
|
|
/* update displays */
|
|
|
|
if (mapmode==1) displaymapmode();
|
|
else if (mapmode==2) displayswingmapmode();
|
|
else if (mapmode) MS_Error("PlayLoop: mapmode %i",mapmode);
|
|
if (heatmode)
|
|
{
|
|
if (mapmode) displayheatmapmode();
|
|
else displayheatmode();
|
|
}
|
|
if (motionmode)
|
|
{
|
|
if (mapmode) displaymotionmapmode();
|
|
else displaymotionmode();
|
|
}
|
|
|
|
if (netmode) NetGetData();
|
|
|
|
if (currentViewSize>0 && currentViewSize<=4)
|
|
{
|
|
if (currentViewSize==4) pic=statusbar[2];
|
|
else pic=statusbar[currentViewSize-1];
|
|
VI_DrawMaskedPicToBuffer(statusbarloc[currentViewSize*2],statusbarloc[currentViewSize*2+1],pic);
|
|
}
|
|
|
|
if (netmode) NetGetData();
|
|
|
|
updatedisplay();
|
|
|
|
if (netmode) NetGetData();
|
|
|
|
/* change border if hurt */
|
|
if (hurtborder)
|
|
{
|
|
VI_ColorBorder(0);
|
|
hurtborder=false;
|
|
}
|
|
|
|
/* display the message string */
|
|
rewritemsg();
|
|
|
|
/* finally draw it */
|
|
|
|
if (netmode) NetGetData();
|
|
|
|
if (ticker)
|
|
{
|
|
sprintf(dbg,"sp:%-4i tp:%-4i ver:%-4i e:%-4i mu:%-2i t:%3i:%2i mem:%i",
|
|
numspans,transparentposts,vertexlist_p-vertexlist,entry_p-entries,greedcom->maxusage,timecount/4200,(timecount/70)%60,GetFreeMem());
|
|
// sprintf(dbg,"x: %i y: %i",(player.x>>FRACBITS)&63,(player.y>>FRACBITS)&63);
|
|
fontbasecolor=73;
|
|
font=font1;
|
|
printx=2;
|
|
printy=19;
|
|
FN_RawPrint2(dbg);
|
|
}
|
|
if (netmsgstatus==1)
|
|
{
|
|
fontbasecolor=73;
|
|
font=font1;
|
|
printx=2;
|
|
printy=19;
|
|
sprintf(dbg,"Message: %s",netmsg);
|
|
FN_RawPrint2(dbg);
|
|
}
|
|
else if (netmsgstatus==2)
|
|
{
|
|
NetSendMessage(netmsg);
|
|
netmsgstatus=0;
|
|
}
|
|
|
|
/* update sprite movement */
|
|
if (update==1)
|
|
TimeUpdate();
|
|
}
|
|
|
|
|
|
//#define HELMETDEBUG
|
|
|
|
void HelmetBlit(void)
|
|
{
|
|
fixed_t x, y, z, dx, dy;
|
|
int angle, rangle;
|
|
char str[80];
|
|
#ifdef HELMETDEBUG
|
|
static FILE *f;
|
|
#endif
|
|
|
|
if (adjustvrangle!=0)
|
|
{
|
|
SC.vrangle+=adjustvrangle;
|
|
|
|
if (SC.vrangle>5)
|
|
SC.vrangle=5;
|
|
else if (SC.vrangle<0)
|
|
SC.vrangle=0;
|
|
|
|
adjustvrangle=0;
|
|
|
|
sprintf(str,"VR Angle: %i",SC.vrangle);
|
|
writemsg(str);
|
|
}
|
|
if (adjustvrdist!=0)
|
|
{
|
|
if (adjustvrdist==-1)
|
|
SC.vrdist=DEFAULTVRDIST;
|
|
else
|
|
SC.vrdist=FIXEDMUL(SC.vrdist,adjustvrdist);
|
|
|
|
if (SC.vrdist<20000)
|
|
SC.vrdist=20000;
|
|
else if (SC.vrdist>295000)
|
|
SC.vrdist=295000;
|
|
|
|
adjustvrdist=0;
|
|
|
|
sprintf(str,"VR Eye Distance: %1.1f",((float)SC.vrdist/(float)65536));
|
|
writemsg(str);
|
|
}
|
|
|
|
x=player.x;
|
|
y=player.y;
|
|
z=player.z+headmove[headbob];
|
|
angle=player.angle;
|
|
|
|
/* left */
|
|
dx=FIXEDMUL(SC.vrdist,sintable[angle]);
|
|
dy=FIXEDMUL(SC.vrdist,costable[angle]);
|
|
rangle=(SC.vrangle*SC.vrdist)/DEFAULTVRDIST;
|
|
|
|
#ifdef HELMETDEBUG
|
|
if (f==NULL)
|
|
{
|
|
f=fopen("helmet.dbg","wb");
|
|
if (f==NULL)
|
|
MS_Error("Error creating helmet.dbg");
|
|
}
|
|
fprintf(f,"angle:%i dx:%i dy:%i\n",angle,dx,dy);
|
|
#endif
|
|
UpdateView(x-dx,y-dy,z,angle-rangle,2); /* NORTH is 90 degrees */
|
|
|
|
RF_BlitView();
|
|
SVRDosSetImage(LEFT,0,0,320,200,screen);
|
|
|
|
/* right */
|
|
UpdateView(x+dx,y+dy,z,angle+rangle,0);
|
|
|
|
TimeUpdate();
|
|
RF_BlitView();
|
|
TimeUpdate();
|
|
SVRDosSetImage(RIGHT,0,0,320,200,screen);
|
|
TimeUpdate();
|
|
}
|
|
|
|
|
|
void PlayLoop (void)
|
|
{
|
|
if (netmode) NetWaitStart();
|
|
else timecount=0;
|
|
|
|
#ifdef HELMETDEBUG
|
|
player.angle=NORTH;
|
|
HelmetBlit();
|
|
player.angle=EAST;
|
|
HelmetBlit();
|
|
player.angle=SOUTH;
|
|
HelmetBlit();
|
|
player.angle=WEST;
|
|
HelmetBlit();
|
|
#endif
|
|
|
|
while (!quitgame)
|
|
{
|
|
if (fliplayed)
|
|
{
|
|
if (deadrestart)
|
|
{
|
|
memset(screen,0,64000);
|
|
|
|
if (SC.vrhelmet==1)
|
|
{
|
|
SVRDosSetImage(LEFT,0,0,320,200,screen);
|
|
SVRDosSetImage(RIGHT,0,0,320,200,screen);
|
|
VI_SetPalette(CA_CacheLump(CA_GetNamedNum("palette")));
|
|
VI_SetColor(255,63,63,63);
|
|
SVRDosSetBlackCode(0);
|
|
SVRDosSetWhiteCode(255);
|
|
}
|
|
else
|
|
VI_SetPalette(CA_CacheLump(CA_GetNamedNum("palette")));
|
|
|
|
startover(2);
|
|
}
|
|
continue;
|
|
}
|
|
if (netmode) NetGetData();
|
|
if (toggleautorun)
|
|
{
|
|
autorun^=1;
|
|
if (autorun) writemsg("Auto-Run On");
|
|
else writemsg("Auto-Run Off");
|
|
toggleautorun=false;
|
|
}
|
|
if (toggleautotarget)
|
|
{
|
|
autotarget^=1;
|
|
if (autotarget)
|
|
writemsg("Auto-Target On");
|
|
else
|
|
writemsg("Auto-Target Off");
|
|
toggleautotarget=false;
|
|
}
|
|
if (goiright)
|
|
{
|
|
inventoryright();
|
|
goiright=false;
|
|
}
|
|
if (goileft)
|
|
{
|
|
inventoryleft();
|
|
goileft=false;
|
|
}
|
|
if (useitem)
|
|
{
|
|
useinventory();
|
|
useitem=false;
|
|
}
|
|
if (checktrigger)
|
|
{
|
|
checktrigger=false;
|
|
CheckHere(true,player.x,player.y,player.angle);
|
|
if (fliplayed)
|
|
continue;
|
|
}
|
|
if (warpjammer) JamWarps();
|
|
if (netmode) NetGetData();
|
|
if (falldamage)
|
|
{ // just makes a grunt sound
|
|
SoundEffect(SN_HIT0+player.chartype,15,player.x,player.y);
|
|
if (netmode) NetSoundEffect(SN_HIT0+player.chartype,15,player.x,player.y);
|
|
falldamage=0;
|
|
}
|
|
|
|
if (player.levelscore==0 && !exitexists && !netmode &&
|
|
((primaries[0]!=-1 && player.primaries[0]==pcount[0]) || primaries[0]==-1) &&
|
|
((primaries[2]!=-1 && player.primaries[1]==pcount[1]) || primaries[2]==-1))
|
|
PrepareNexus();
|
|
|
|
if (ExitLevel)
|
|
{
|
|
EndLevel();
|
|
#ifdef DEMO
|
|
if (player.map>=3)
|
|
{
|
|
quitgame=true;
|
|
return;
|
|
}
|
|
#elif defined(GAME1)
|
|
if (player.map>=8)
|
|
{
|
|
quitgame=true;
|
|
return;
|
|
}
|
|
#elif defined(GAME2)
|
|
if (player.map>=16)
|
|
{
|
|
quitgame=true;
|
|
return;
|
|
}
|
|
#else
|
|
if (player.map>=22)
|
|
{
|
|
quitgame=true;
|
|
return;
|
|
}
|
|
#endif
|
|
}
|
|
|
|
if (netmode) NetGetData();
|
|
|
|
if (timecount>specialeffecttime)
|
|
{
|
|
specialeffect=0;
|
|
specialeffecttime=0x7FFFFFFF;
|
|
}
|
|
if (firegrenade)
|
|
{
|
|
SpawnSprite(S_GRENADE,player.x,player.y,player.z,player.height-(50<<FRACBITS),player.angle,(-player.scrollmin)&ANGLES,true,playernum);
|
|
SoundEffect(SN_GRENADE,0,player.x,player.y);
|
|
if (netmode) NetSoundEffect(SN_GRENADE,0,player.x,player.y);
|
|
--player.inventory[2];
|
|
firegrenade=false;
|
|
}
|
|
|
|
if (netmode) NetGetData();
|
|
|
|
if (Warping) WarpAnim();
|
|
|
|
if (netmode) NetGetData();
|
|
|
|
/* check special code flag */
|
|
if (specialcode) Special_Code(secretbuf);
|
|
|
|
/* update sprite movement */
|
|
TimeUpdate();
|
|
|
|
/* update wallanimation */
|
|
if (timecount>=wallanimationtime)
|
|
{
|
|
wallanimcount++;
|
|
switch (wallanimcount%3)
|
|
{
|
|
case 0:
|
|
flattranslation[57]=58;
|
|
flattranslation[58]=59;
|
|
flattranslation[59]=57;
|
|
flattranslation[217]=218;
|
|
flattranslation[218]=219;
|
|
flattranslation[219]=217;
|
|
walltranslation[228]=229;
|
|
walltranslation[229]=230;
|
|
walltranslation[230]=228;
|
|
break;
|
|
case 1:
|
|
flattranslation[57]=59;
|
|
flattranslation[58]=57;
|
|
flattranslation[59]=58;
|
|
flattranslation[217]=219;
|
|
flattranslation[218]=217;
|
|
flattranslation[219]=218;
|
|
walltranslation[228]=230;
|
|
walltranslation[229]=228;
|
|
walltranslation[230]=229;
|
|
break;
|
|
case 2:
|
|
flattranslation[57]=57;
|
|
flattranslation[58]=58;
|
|
flattranslation[59]=59;
|
|
flattranslation[217]=217;
|
|
flattranslation[218]=218;
|
|
flattranslation[219]=219;
|
|
walltranslation[228]=228;
|
|
walltranslation[229]=229;
|
|
walltranslation[230]=230;
|
|
break;
|
|
}
|
|
wallanimationtime=timecount+12;
|
|
if (netmode)
|
|
NetGetData();
|
|
if (floorflags[player.mapspot]&F_DAMAGE && player.z==RF_GetFloorZ(player.x,player.y)+player.height)
|
|
hurt(30);
|
|
}
|
|
|
|
CheckWarps(player.x,player.y);
|
|
if (fliplayed)
|
|
continue;
|
|
|
|
CheckDoors(player.x,player.y);
|
|
if (netmode) NetGetData();
|
|
if (deadrestart) startover(2);
|
|
if (resizeScreen) ChangeViewSize(biggerScreen);
|
|
if (netmode) NetGetData();
|
|
if (scrollview) ChangeScroll();
|
|
|
|
/* update sprite movement */
|
|
TimeUpdate();
|
|
|
|
/* check display toggle flags */
|
|
if (toggleheatmode)
|
|
{
|
|
if (heatmode) heatmode=false;
|
|
else
|
|
{
|
|
heatmode=true;
|
|
if (mapmode==2) mapmode=1;
|
|
}
|
|
toggleheatmode=false;
|
|
}
|
|
if (togglemotionmode)
|
|
{
|
|
if (motionmode) motionmode=false;
|
|
else
|
|
{
|
|
motionmode=true;
|
|
if (mapmode==2) mapmode=1;
|
|
}
|
|
togglemotionmode=false;
|
|
}
|
|
if (togglemapmode)
|
|
{
|
|
switch (mapmode)
|
|
{
|
|
case 0:
|
|
mapmode=1;
|
|
break;
|
|
case 1:
|
|
if (heatmode || motionmode) mapmode=0;
|
|
else mapmode=2;
|
|
break;
|
|
case 2:
|
|
mapmode=0;
|
|
}
|
|
togglemapmode=false;
|
|
}
|
|
if (togglegoalitem) NewGoalItem();
|
|
if (ToggleRearView)
|
|
{
|
|
RearViewOn^=1;
|
|
ToggleRearView=false;
|
|
RearViewDelay=timecount;
|
|
}
|
|
|
|
if (netmode) NetGetData();
|
|
|
|
/* render the view */
|
|
if (RearViewOn && timecount>=RearViewDelay)
|
|
{
|
|
RearViewTime=timecount+140;
|
|
RearView();
|
|
RearViewDelay=timecount+SC.camdelay;
|
|
if (SC.camdelay==70)
|
|
RearViewOn=false;
|
|
}
|
|
|
|
if (netmode) NetGetData();
|
|
|
|
scrollmin=player.scrollmin;
|
|
scrollmax=player.scrollmax;
|
|
|
|
if (SC.vrhelmet)
|
|
HelmetBlit();
|
|
else
|
|
{
|
|
UpdateView(player.x,player.y,player.z,player.angle,1);
|
|
RF_BlitView();
|
|
}
|
|
|
|
if (SaveTheScreen) GrabTheScreen();
|
|
|
|
if (newsong) SelectNewSong();
|
|
|
|
if (activatemenu) RunMenu();
|
|
|
|
if (activatehelp) RunHelp();
|
|
|
|
if (activatebrief) RunBrief();
|
|
|
|
TimeUpdate();
|
|
|
|
if (QuickExit) RunQuickExit();
|
|
|
|
if (netmode) NetGetData();
|
|
|
|
if (paused || netpaused) RunPause();
|
|
|
|
++frames;
|
|
|
|
/* update sprite movement */
|
|
TimeUpdate();
|
|
|
|
/* update lights if necessary */
|
|
if (changelight!=0) newlights();
|
|
|
|
/* update weapon to be displayed */
|
|
while (weapmode && timecount>=weapdelay)
|
|
{
|
|
if (player.weapons[player.currentweapon]==4 || player.weapons[player.currentweapon]==18)
|
|
{
|
|
if (weapmode==1)
|
|
{
|
|
if (player.weapons[player.currentweapon]==4)
|
|
{
|
|
SoundEffect(SN_BULLET4,0,player.x,player.y);
|
|
if (netmode) NetSoundEffect(SN_BULLET4,0,player.x,player.y);
|
|
}
|
|
if (player.weapons[player.currentweapon]==18)
|
|
{
|
|
SoundEffect(SN_BULLET18,0,player.x,player.y);
|
|
if (netmode)
|
|
NetSoundEffect(SN_BULLET18,0,player.x,player.y);
|
|
}
|
|
}
|
|
weapmode=weaponstate[player.weapons[player.currentweapon]][weapmode];
|
|
if (weapmode==0)
|
|
fireweapon();
|
|
}
|
|
else
|
|
weapmode=weaponstate[player.weapons[player.currentweapon]][weapmode];
|
|
weapdelay=timecount+8;
|
|
}
|
|
|
|
if (netmode) NetGetData();
|
|
}
|
|
}
|
|
|
|
|
|
void ActionHook (void)
|
|
{
|
|
actionflag = 0;
|
|
}
|
|
|
|
|
|
void InitData(void)
|
|
{
|
|
int i;
|
|
|
|
quitgame=false;
|
|
mapmode=0;
|
|
heatmode=false;
|
|
motionmode=false;
|
|
turnrate=0;
|
|
moverate=0;
|
|
fallrate=0;
|
|
strafrate=0;
|
|
MapZoom=8;
|
|
memset(secretbuf,0,20);
|
|
secretindex=0;
|
|
// demobuffer=CA_CacheLump(CA_GetNamedNum("demo"));
|
|
if (playback)
|
|
{
|
|
demobuffer=CA_LoadFile("demo1");
|
|
recordindex=0;
|
|
}
|
|
if (recording)
|
|
{
|
|
demobuffer=CA_CacheLump(CA_GetNamedNum("demo"));
|
|
memset(demobuffer,0,RECBUFSIZE);
|
|
recordindex=0;
|
|
}
|
|
probe.moveSpeed=MAXPROBE;
|
|
probe.movesize=16<<FRACBITS; // half a tile
|
|
probe.spawnid=playernum;
|
|
ChangeViewSize(true);
|
|
ChangeViewSize(true);
|
|
ChangeViewSize(true);
|
|
ChangeViewSize(true);
|
|
ChangeViewSize(false);
|
|
ChangeViewSize(false);
|
|
ChangeViewSize(false);
|
|
ChangeViewSize(false);
|
|
for (i=0;i<currentViewSize;i++)
|
|
ChangeViewSize(true);
|
|
resetdisplay();
|
|
}
|
|
|
|
|
|
void SaveDemo(void)
|
|
{
|
|
FILE *f;
|
|
|
|
f=fopen("demo1","w");
|
|
fwrite(demobuffer,RECBUFSIZE,1,f);
|
|
fclose(f);
|
|
}
|
|
|
|
|
|
void maingame(void)
|
|
{
|
|
SVRDosOption_t svr_options;
|
|
|
|
lock_region((void near *)ControlStub1,(char *)ControlStub2 - (char near *)ControlStub1);
|
|
lock_region(doorlist,sizeof(doorlist));
|
|
lock_region(costable,sizeof(costable));
|
|
lock_region(sintable,sizeof(sintable));
|
|
lock_region(northwall,sizeof(westwall));
|
|
lock_region(westwall,sizeof(northwall));
|
|
lock_region(mapsprites,sizeof(mapsprites));
|
|
lock_region(floorheight,sizeof(floorheight));
|
|
lock_region(ceilingheight,sizeof(ceilingheight));
|
|
lock_region(mapflags,sizeof(mapflags));
|
|
lock_region(floorpic,sizeof(floorpic));
|
|
lock_region(weapons,sizeof(weapons));
|
|
lock_region(weapmove,sizeof(weapmove));
|
|
lock_region(headmove,sizeof(headmove));
|
|
lock_region(floorflags,sizeof(floorflags));
|
|
lock_region(&SC,sizeof(SC));
|
|
lock_region(&BonusItem,23000); // catch all (look at greed.map)
|
|
lock_region(&netmode,sizeof(netmode));
|
|
|
|
if (SC.vrhelmet==1)
|
|
{
|
|
VI_Init(1);
|
|
SVRDosInit();
|
|
SVRDosSetMode(SVR_320_200_X);
|
|
VI_SetPalette(CA_CacheLump(CA_GetNamedNum("palette")));
|
|
VI_SetColor(255,63,63,63);
|
|
SVRDosSetBlackCode(0);
|
|
SVRDosSetWhiteCode(255);
|
|
SVRDosGetOptions(&svr_options);
|
|
svr_options.pal_protect=1;
|
|
svr_options.fast_intr=-2;
|
|
SVRDosSetOptions(&svr_options);
|
|
SVRDosSetRegistration(TRUE);
|
|
}
|
|
else
|
|
VI_SetPalette(CA_CacheLump(CA_GetNamedNum("palette")));
|
|
|
|
InitData();
|
|
INT_TimerHook(PlayerCommand); // the players actions are sampled by an interrupt
|
|
newlights();
|
|
PlayLoop();
|
|
|
|
if (SC.vrhelmet==1)
|
|
{
|
|
SVRDosSetRegistration(FALSE);
|
|
SVRDosExit();
|
|
free(screen);
|
|
VI_Init(0);
|
|
}
|
|
|
|
VI_SetVGAMode();
|
|
|
|
player.timecount=timecount;
|
|
if (netmode) NetQuitGame();
|
|
if (recording) SaveDemo();
|
|
dSaveSetup(&SC,"SETUP.CFG");
|
|
playback=false;
|
|
}
|
|
|