1732 lines
42 KiB
C
1732 lines
42 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 "d_disk.h"
|
|
#include "d_global.h"
|
|
#include "d_video.h"
|
|
#include "d_ints.h"
|
|
#include "r_refdef.h"
|
|
#include "protos.h"
|
|
|
|
/**** CONSTANTS ****/
|
|
|
|
|
|
char *primnames[]=
|
|
{
|
|
"Explosives",
|
|
"Head of Warden",
|
|
"Phlegmatic Eel",
|
|
"Byzantium Brass Ring",
|
|
"Sacrificial Dagger",
|
|
"Book of Chants",
|
|
"Holy Incantation Brazier",
|
|
"error 7",
|
|
"Personality Encode",
|
|
"Space Generator",
|
|
"Imperial Sigil",
|
|
"Psiflex Data Module",
|
|
"Fissure Prism",
|
|
"Mummification Glyph",
|
|
"Soylent Brown Narcotic",
|
|
"Viral Stabilization Pods",
|
|
"Idol of the Felasha Pont",
|
|
"Skull Scepter",
|
|
"Sacred Cow of Tooms",
|
|
"Gene Coding Cube",
|
|
"Desecrate Summoning Circle",
|
|
"Power Coupler",
|
|
};
|
|
|
|
|
|
char *secnames[]=
|
|
{
|
|
"Inmate Uniforms",
|
|
"Delousing Kits",
|
|
"Truth Serum Vials",
|
|
"Hypodermic Needles",
|
|
"Lubricants",
|
|
"Emergency Lantern",
|
|
"Water Tanks",
|
|
"Oxygen Tanks",
|
|
"Exo-suit",
|
|
"Phosfor Pellets",
|
|
"Plasma Conduit Coupling",
|
|
"Madree 3 Cypher Kit",
|
|
"Security Key",
|
|
"Denatured Bio-Proteins",
|
|
"Neural Reanimation Focus",
|
|
"Shunt Matrix",
|
|
"Plasmoid CryoVice",
|
|
"Rad-Shield Goggles",
|
|
"Prayer Scroll",
|
|
"Silver Beetle",
|
|
"Finger Bones",
|
|
"Pain Ankh",
|
|
"War Slug Larvae",
|
|
"War Slug Food",
|
|
"Ritual Candles",
|
|
"Idth Force Key 1",
|
|
"Idth Force Key 2",
|
|
"Idth Force Key 3",
|
|
"Idth Force Key 4",
|
|
"error 29",
|
|
"error 30",
|
|
"error 31",
|
|
"error 32",
|
|
"Tribolek Game Cubes",
|
|
"Atomic Space Heater",
|
|
"Reactor Coolant Container",
|
|
"Power Flow Calibrator",
|
|
"Verimax Insulated Gloves",
|
|
"Gold Ingots",
|
|
"Soul Orb of Eyul",
|
|
"Prayer Scroll"
|
|
};
|
|
|
|
|
|
char *ammonames[]=
|
|
{
|
|
"ENERGY",
|
|
"BULLET",
|
|
"PLASMA",
|
|
};
|
|
|
|
|
|
char *inventorynames[]=
|
|
{
|
|
"Medical Tube ",
|
|
"Shield Charge ",
|
|
"Grenade ",
|
|
"Reverso Pill ",
|
|
"Proximity Mine",
|
|
"Time Bomb ",
|
|
"Decoy ",
|
|
"InstaWall ",
|
|
"Clone ",
|
|
"HoloSuit ",
|
|
//"Portable Hole ",
|
|
"Invisibility ",
|
|
"Warp Jammer ",
|
|
"Soul Stealer "
|
|
};
|
|
|
|
|
|
/**** VARIABLES ****/
|
|
|
|
byte oldcharges[7]; /* delta values (only changes if different) */
|
|
longint oldbodycount, oldscore, oldlevelscore;
|
|
int oldshield, oldangst, oldshots, oldgoalitem, oldangle, statcursor=269,
|
|
oldangstpic, inventorycursor=-1, oldinventory, totaleffecttime,
|
|
inventorylump, primarylump, secondarylump, fraglump;
|
|
pic_t *heart[10];
|
|
boolean firegrenade;
|
|
|
|
extern int fragcount[MAXPLAYERS];
|
|
|
|
/**** FUNCTIONS ****/
|
|
|
|
/*========================================================================*/
|
|
|
|
void resetdisplay(void)
|
|
/* clears delta values */
|
|
{
|
|
int i;
|
|
|
|
memset(oldcharges,-1,7);
|
|
oldbodycount=-1;
|
|
oldshield=-1;
|
|
oldangst=-1;
|
|
oldscore=-1;
|
|
oldshots=-1;
|
|
oldlevelscore=-1;
|
|
oldangle=-1;
|
|
oldangstpic=-1;
|
|
oldinventory=-2;
|
|
oldgoalitem=-1;
|
|
inventorylump=CA_GetNamedNum("medtube");
|
|
primarylump=CA_GetNamedNum("primary");
|
|
secondarylump=CA_GetNamedNum("secondary");
|
|
if (netmode)
|
|
{
|
|
fraglump=CA_GetNamedNum("profiles");
|
|
for (i=0;i<MAXCHARTYPES;i++)
|
|
CA_CacheLump(fraglump+i);
|
|
}
|
|
}
|
|
|
|
|
|
void inventoryright(void)
|
|
{
|
|
if (inventorycursor==-1) inventorycursor=0;
|
|
else inventorycursor++;
|
|
while (inventorycursor<MAXINVENTORY && player.inventory[inventorycursor]==0) inventorycursor++;
|
|
if (inventorycursor>=MAXINVENTORY)
|
|
{
|
|
inventorycursor=0;
|
|
while (inventorycursor<MAXINVENTORY && player.inventory[inventorycursor]==0) inventorycursor++;
|
|
if (inventorycursor==MAXINVENTORY) inventorycursor=-1; // nothing found
|
|
}
|
|
}
|
|
|
|
|
|
void inventoryleft(void)
|
|
{
|
|
inventorycursor--;
|
|
while (inventorycursor>=0 && player.inventory[inventorycursor]==0) inventorycursor--;
|
|
if (inventorycursor<=-1)
|
|
{
|
|
inventorycursor=MAXINVENTORY-1;
|
|
while (inventorycursor>=0 && player.inventory[inventorycursor]==0) inventorycursor--;
|
|
}
|
|
}
|
|
|
|
|
|
void useinventory(void)
|
|
{
|
|
int mindist, pic, x, y, dist, angle, angleinc, i, scale;
|
|
scaleobj_t *sp;
|
|
|
|
if (inventorycursor==-1 || player.inventory[inventorycursor]==0) return;
|
|
|
|
switch (inventorycursor)
|
|
{
|
|
case 0: // medtube
|
|
if (player.angst<player.maxangst)
|
|
{
|
|
medpaks(50);
|
|
--player.inventory[inventorycursor];
|
|
writemsg("Used Medtube");
|
|
}
|
|
break;
|
|
case 1: // shield
|
|
if (player.shield<player.maxshield)
|
|
{
|
|
heal(50);
|
|
--player.inventory[inventorycursor];
|
|
writemsg("Used Shield Charge");
|
|
}
|
|
break;
|
|
case 2: // grenade
|
|
firegrenade=true;
|
|
break;
|
|
case 3: // reversopill
|
|
if (specialeffect!=SE_REVERSOPILL)
|
|
{
|
|
specialeffect=SE_REVERSOPILL;
|
|
specialeffecttime=timecount+70*15;
|
|
totaleffecttime=70*15;
|
|
--player.inventory[inventorycursor];
|
|
writemsg("Used Reverso Pill");
|
|
}
|
|
break;
|
|
case 4:
|
|
SpawnSprite(S_PROXMINE,player.x,player.y,0,0,0,0,false,playernum);
|
|
--player.inventory[inventorycursor];
|
|
writemsg("Dropped Proximity Mine");
|
|
break;
|
|
case 5:
|
|
SpawnSprite(S_TIMEMINE,player.x,player.y,0,0,0,0,false,playernum);
|
|
--player.inventory[inventorycursor];
|
|
writemsg("Dropped Time Bomb");
|
|
break;
|
|
case 6:
|
|
SpawnSprite(S_DECOY,player.x,player.y,0,0,0,0,false,player.chartype);
|
|
--player.inventory[inventorycursor];
|
|
writemsg("Activated Decoy");
|
|
break;
|
|
case 7:
|
|
SpawnSprite(S_INSTAWALL,player.x,player.y,0,0,0,0,false,playernum);
|
|
--player.inventory[inventorycursor];
|
|
writemsg("Activated InstaWall");
|
|
break;
|
|
case 8: // clone
|
|
SpawnSprite(S_CLONE,player.x,player.y,0,0,0,0,false,player.chartype);
|
|
--player.inventory[inventorycursor];
|
|
writemsg("Clone Activated");
|
|
break;
|
|
case 9: // holosuit
|
|
mindist=0x7FFFFFFF;
|
|
for (sp=firstscaleobj.next;sp!=&lastscaleobj;sp=sp->next)
|
|
if (!sp->active && !sp->hitpoints)
|
|
{
|
|
x=(player.x-sp->x)>>FRACTILESHIFT;
|
|
y=(player.y-sp->y)>>FRACTILESHIFT;
|
|
dist=x*x+y*y;
|
|
if (dist<mindist)
|
|
{
|
|
pic=sp->basepic;
|
|
scale=sp->scale;
|
|
mindist=dist;
|
|
}
|
|
}
|
|
if (mindist!=0x7FFFFFFF)
|
|
{
|
|
--player.inventory[inventorycursor];
|
|
player.holopic=pic;
|
|
player.holoscale=scale;
|
|
writemsg("HoloSuit Active");
|
|
}
|
|
else writemsg("Unsuccessful Holo");
|
|
break;
|
|
/* case 10: // portable hole
|
|
if (mapsprites[player.mapspot]!=0)
|
|
{
|
|
SpawnSprite(S_HOLE,player.x,player.y,0,0,0,0,false,player.chartype);
|
|
--player.inventory[inventorycursor];
|
|
writemsg("Dropped Portable Hole");
|
|
}
|
|
else
|
|
writemsg("Portable Hole Blocked");
|
|
break; */
|
|
case 10: // invisibility
|
|
if (specialeffect!=SE_INVISIBILITY)
|
|
{
|
|
specialeffect=SE_INVISIBILITY;
|
|
specialeffecttime=timecount+70*30;
|
|
totaleffecttime=70*30;
|
|
--player.inventory[inventorycursor];
|
|
writemsg("Activated Invisibility Shield");
|
|
}
|
|
break;
|
|
case 11: // warp jammer
|
|
warpjammer=true;
|
|
break;
|
|
case 12: // soul stealer
|
|
angleinc=ANGLES/16;
|
|
angle=0;
|
|
for(i=0,angle=0;i<16;i++,angle+=angleinc)
|
|
SpawnSprite(S_SOULBULLET,player.x,player.y,player.z,player.height-(52<<FRACBITS),angle,0,true,playernum);
|
|
SoundEffect(SN_SOULSTEALER,0,player.x,player.y);
|
|
SoundEffect(SN_SOULSTEALER,0,player.x,player.y);
|
|
if (netmode)
|
|
{
|
|
NetSendSpawn(S_SOULBULLET,player.x,player.y,player.z,player.height-(52<<FRACBITS),angle,0,true,playernum);
|
|
NetSoundEffect(SN_SOULSTEALER,0,player.x,player.y);
|
|
NetSoundEffect(SN_SOULSTEALER,0,player.x,player.y);
|
|
}
|
|
--player.inventory[inventorycursor];
|
|
writemsg("Used Soul Stealer");
|
|
break;
|
|
}
|
|
oldinventory=-2;
|
|
inventoryleft();
|
|
inventoryright();
|
|
}
|
|
|
|
|
|
/*=======================================================================*/
|
|
|
|
void displaystats1(int ofs)
|
|
{
|
|
int d, i, j, c;
|
|
char str1[20];
|
|
|
|
d=(player.shield*28)/player.maxshield;
|
|
for(i=152+ofs;i<=159+ofs;i++)
|
|
{
|
|
c=(d*(i-(152+ofs)))/8 + 140;
|
|
for(j=272;j<=300;j++)
|
|
if (*(viewylookup[i]+j)==254) *(viewylookup[i]+j)=c;
|
|
}
|
|
for(i=193+ofs;i<=199+ofs;i++)
|
|
{
|
|
c=(d*((199+ofs)-i))/7 + 140;
|
|
for(j=272;j<=300;j++)
|
|
if (*(viewylookup[i]+j)==254) *(viewylookup[i]+j)=c;
|
|
}
|
|
for(j=307;j<=315;j++)
|
|
{
|
|
c=(d*(315-j))/9 + 140;
|
|
for(i=165+ofs;i<=187+ofs;i++)
|
|
if (*(viewylookup[i]+j)==254) *(viewylookup[i]+j)=c;
|
|
}
|
|
for(j=257;j<=265;j++)
|
|
{
|
|
c=(d*(j-257))/9 + 140;
|
|
for(i=165+ofs;i<=187+ofs;i++)
|
|
if (*(viewylookup[i]+j)==254) *(viewylookup[i]+j)=c;
|
|
}
|
|
d=(player.angst*10)/player.maxangst;
|
|
if (d>=10) d=9;
|
|
VI_DrawMaskedPicToBuffer(269,161+ofs,heart[d]);
|
|
statcursor+=2;
|
|
if (statcursor>=323) statcursor=269;
|
|
for(j=269;j<=305;j++)
|
|
{
|
|
if (j>statcursor) c=113;
|
|
else
|
|
{
|
|
c=139 - (statcursor-j);
|
|
if (c<120) c=113;
|
|
}
|
|
for(i=161+ofs;i<=185+ofs;i++)
|
|
if (*(viewylookup[i]+j)==254) *(viewylookup[i]+j)=c;
|
|
}
|
|
font=font2;
|
|
fontbasecolor=0;
|
|
sprintf(str1,"%3i",player.angst);
|
|
printx=280;
|
|
printy=188+ofs;
|
|
FN_RawPrint4(str1);
|
|
}
|
|
|
|
|
|
void displaycompass1(int ofs)
|
|
{
|
|
int c, x, y, i;
|
|
fixed_t x1, y1;
|
|
|
|
x=237;
|
|
x1=x<<FRACBITS;
|
|
y=161+ofs;
|
|
y1=y<<FRACBITS;
|
|
c=139;
|
|
for(i=0;i<10;i++,c--)
|
|
{
|
|
*(viewylookup[y]+x)=c;
|
|
x1+=costable[player.angle];
|
|
y1-=FIXEDMUL(sintable[player.angle],54394);
|
|
x=x1>>FRACBITS;
|
|
y=y1>>FRACBITS;
|
|
}
|
|
}
|
|
|
|
|
|
void displaysettings1(int ofs)
|
|
{
|
|
if (heatmode) memset(viewylookup[199+ofs]+236,102,6);
|
|
else memset(viewylookup[199+ofs]+236,0,6);
|
|
if (motionmode) memset(viewylookup[199+ofs]+246,156,6);
|
|
else memset(viewylookup[199+ofs]+246,0,6);
|
|
if (mapmode) memset(viewylookup[199+ofs]+226,133,6);
|
|
else memset(viewylookup[199+ofs]+226,0,6);
|
|
}
|
|
|
|
|
|
void displayinventory1(int ofs)
|
|
{
|
|
int n, ammo, lump, maxshots, i, j, count, top, bottom, x, y;
|
|
char str1[20];
|
|
scalepic_t *pic;
|
|
byte *collumn;
|
|
|
|
font=font2;
|
|
fontbasecolor=0;
|
|
n=player.weapons[player.currentweapon];
|
|
if (weapons[n].ammorate>0)
|
|
{
|
|
ammo=player.ammo[weapons[n].ammotype];
|
|
maxshots=weapons[n].ammorate;
|
|
}
|
|
else
|
|
{
|
|
ammo=999;
|
|
maxshots=999;
|
|
}
|
|
printx=186;
|
|
printy=183+ofs;
|
|
sprintf(str1,"%3i",ammo);
|
|
FN_RawPrint2(str1);
|
|
printx=203;
|
|
printy=183+ofs;
|
|
sprintf(str1,"%3i",maxshots);
|
|
FN_RawPrint2(str1);
|
|
printx=187;
|
|
printy=191+ofs;
|
|
FN_RawPrint2(ammonames[weapons[n].ammotype]);
|
|
|
|
if (inventorycursor==-1 || player.inventory[inventorycursor]==0) inventoryright();
|
|
if (inventorycursor!=-1)
|
|
{
|
|
lump=inventorylump + inventorycursor;
|
|
printx=149; // name
|
|
printy=163+ofs;
|
|
FN_RawPrint2(inventorynames[inventorycursor]);
|
|
font=font3; // number of items
|
|
printx=150;
|
|
printy=172+ofs;
|
|
sprintf(str1,"%2i",player.inventory[inventorycursor]);
|
|
FN_RawPrint2(str1);
|
|
pic=lumpmain[lump]; // draw the pic for it
|
|
x=128-(pic->width>>1);
|
|
for (i=0;i<pic->width;i++,x++)
|
|
if (pic->collumnofs[i])
|
|
{
|
|
collumn=(byte *)pic+pic->collumnofs[i];
|
|
top=*(collumn+1);
|
|
bottom=*(collumn);
|
|
count=bottom-top+1;
|
|
collumn+=2;
|
|
y=(188+ofs)-top-count;
|
|
for (j=0;j<count;j++,collumn++,y++)
|
|
if (*collumn)
|
|
*(viewylookup[y]+x)=*collumn;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
printx=149; // name
|
|
printy=163+ofs;
|
|
sprintf(str1,"%14s"," ");
|
|
FN_RawPrint2(str1);
|
|
font=font3; // number of items
|
|
printx=150;
|
|
printy=172+ofs;
|
|
FN_RawPrint2(" ");
|
|
}
|
|
|
|
}
|
|
|
|
|
|
void displaynetbonusitem1(int ofs)
|
|
{
|
|
char *type, *name;
|
|
char str1[40];
|
|
int i, j, count, top, bottom, x, y, lump, score;
|
|
scalepic_t *pic;
|
|
pic_t *p;
|
|
byte *collumn, *b;
|
|
longint time;
|
|
|
|
font=font2;
|
|
fontbasecolor=0;
|
|
if (goalitem==-1)
|
|
{
|
|
if (BonusItem.score) togglegoalitem=true;
|
|
return;
|
|
}
|
|
if (goalitem==0)
|
|
{
|
|
if (BonusItem.score==0) // bonus item go bye-bye
|
|
{
|
|
togglegoalitem=true;
|
|
return;
|
|
}
|
|
lump=BonusItem.sprite->basepic;
|
|
score=BonusItem.score;
|
|
type="Bonus ";
|
|
time=(BonusItem.time-timecount)/70;
|
|
if (time>10000) time=0;
|
|
sprintf(str1,"%3i s ",time);
|
|
name=BonusItem.name;
|
|
pic=lumpmain[lump];
|
|
x=34-(pic->width>>1);
|
|
for (i=0;i<pic->width;i++,x++)
|
|
if (pic->collumnofs[i])
|
|
{
|
|
collumn=(byte *)pic+pic->collumnofs[i];
|
|
top=*(collumn+1);
|
|
bottom=*(collumn);
|
|
count=bottom-top+1;
|
|
collumn+=2;
|
|
y=(188+ofs)-top-count;
|
|
for (j=0;j<count;j++,collumn++,y++)
|
|
if (*collumn)
|
|
*(viewylookup[y]+x)=*collumn;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
lump=fraglump + playerdata[goalitem-1].chartype;
|
|
p=(pic_t *)lumpmain[lump];
|
|
type="Player ";
|
|
name=netnames[goalitem-1];
|
|
sprintf(str1,"%-5i",fragcount[goalitem-1]);
|
|
b=&(p->data);
|
|
for (y=0;y<30;y++)
|
|
for (x=0;x<30;x++,b++)
|
|
*(viewylookup[y+158+ofs]+19+x)=*b;
|
|
}
|
|
printx=53;
|
|
printy=172+ofs;
|
|
FN_RawPrint2(str1);
|
|
printx=53;
|
|
printy=182+ofs;
|
|
FN_RawPrint2(type);
|
|
printx=22;
|
|
printy=192+ofs;
|
|
sprintf(str1,"%-32s",name);
|
|
FN_RawPrint2(str1);
|
|
}
|
|
|
|
|
|
void displaybonusitem1(int ofs)
|
|
{
|
|
char *type, *name;
|
|
char str1[40];
|
|
int i, j, count, top, bottom, x, y, lump, score, found, total;
|
|
scalepic_t *pic;
|
|
byte *collumn;
|
|
longint time;
|
|
|
|
font=font2;
|
|
fontbasecolor=0;
|
|
if (goalitem==-1)
|
|
{
|
|
if (BonusItem.score) togglegoalitem=true;
|
|
return;
|
|
}
|
|
if (goalitem==0)
|
|
{
|
|
if (BonusItem.score==0) // bonus item go bye-bye
|
|
{
|
|
togglegoalitem=true;
|
|
return;
|
|
}
|
|
lump=BonusItem.sprite->basepic;
|
|
score=BonusItem.score;
|
|
type="Bonus ";
|
|
time=(BonusItem.time-timecount)/70;
|
|
if (time>10000) time=0;
|
|
sprintf(str1,"%3i s",time);
|
|
name=BonusItem.name;
|
|
}
|
|
else if (goalitem>=1 && goalitem<=2)
|
|
{
|
|
lump=primarylump + primaries[(goalitem-1)*2];
|
|
score=primaries[(goalitem-1)*2+1];
|
|
type="Primary";
|
|
found=player.primaries[goalitem-1];
|
|
total=pcount[goalitem-1];
|
|
sprintf(str1,"%2i/%2i",found,total);
|
|
name=primnames[primaries[(goalitem-1)*2]];
|
|
}
|
|
else if (goalitem>=3)
|
|
{
|
|
lump=secondarylump + secondaries[(goalitem-3)*2];
|
|
score=secondaries[(goalitem-3)*2+1];
|
|
type="Second ";
|
|
found=player.secondaries[goalitem-3];
|
|
total=scount[goalitem-3];
|
|
sprintf(str1,"%2i/%2i",found,total);
|
|
name=secnames[secondaries[(goalitem-3)*2]];
|
|
}
|
|
|
|
pic=lumpmain[lump];
|
|
x=34-(pic->width>>1);
|
|
for (i=0;i<pic->width;i++,x++)
|
|
if (pic->collumnofs[i])
|
|
{
|
|
collumn=(byte *)pic+pic->collumnofs[i];
|
|
top=*(collumn+1);
|
|
bottom=*(collumn);
|
|
count=bottom-top+1;
|
|
collumn+=2;
|
|
y=(188+ofs)-top-count;
|
|
for (j=0;j<count;j++,collumn++,y++)
|
|
if (*collumn)
|
|
*(viewylookup[y]+x)=*collumn;
|
|
}
|
|
|
|
printx=53;
|
|
printy=162+ofs;
|
|
FN_RawPrint2(str1);
|
|
sprintf(str1,"%5i",score);
|
|
printx=53;
|
|
printy=172+ofs;
|
|
FN_RawPrint2(str1);
|
|
printx=53;
|
|
printy=182+ofs;
|
|
FN_RawPrint2(type);
|
|
printx=22;
|
|
printy=192+ofs;
|
|
sprintf(str1,"%-32s",name);
|
|
FN_RawPrint2(str1);
|
|
}
|
|
|
|
|
|
void displayrightstats1(int ofs)
|
|
{
|
|
int n, shots;
|
|
char str1[10];
|
|
|
|
n=player.weapons[player.currentweapon];
|
|
if (weapons[n].ammorate>0)
|
|
shots=player.ammo[weapons[n].ammotype]/weapons[n].ammorate;
|
|
else shots=999;
|
|
font=font3;
|
|
printx=225;
|
|
printy=178+ofs;
|
|
fontbasecolor=0;
|
|
sprintf(str1,"%3i",shots);
|
|
FN_RawPrint2(str1);
|
|
displaycompass1(ofs);
|
|
displaysettings1(ofs);
|
|
displaystats1(ofs);
|
|
}
|
|
|
|
/*==========================================================================*/
|
|
|
|
void displaystats2(void)
|
|
{
|
|
int d, i, j, c, p;
|
|
char str1[20];
|
|
|
|
if (player.shield!=oldshield)
|
|
{
|
|
oldshield=player.shield;
|
|
d=(player.shield*28)/player.maxshield;
|
|
for(i=152;i<=159;i++)
|
|
{
|
|
c=(d*(i-(152)))/8 + 140;
|
|
for(j=272;j<=300;j++)
|
|
{
|
|
p=*(ylookup[i]+j);
|
|
if (p==254 || (p>=140 && p<=168)) *(ylookup[i]+j)=c;
|
|
}
|
|
}
|
|
for(i=193;i<=199;i++)
|
|
{
|
|
c=(d*((199)-i))/7 + 140;
|
|
for(j=272;j<=300;j++)
|
|
{
|
|
p=*(ylookup[i]+j);
|
|
if (p==254 || (p>=140 && p<=168)) *(ylookup[i]+j)=c;
|
|
}
|
|
}
|
|
for(j=307;j<=315;j++)
|
|
{
|
|
c=(d*(315-j))/9 + 140;
|
|
for(i=165;i<=187;i++)
|
|
{
|
|
p=*(ylookup[i]+j);
|
|
if (p==254 || (p>=140 && p<=168)) *(ylookup[i]+j)=c;
|
|
}
|
|
}
|
|
for(j=257;j<=265;j++)
|
|
{
|
|
c=(d*(j-257))/9 + 140;
|
|
for(i=165;i<=187;i++)
|
|
{
|
|
p=*(ylookup[i]+j);
|
|
if (p==254 || (p>=140 && p<=168)) *(ylookup[i]+j)=c;
|
|
}
|
|
}
|
|
}
|
|
if (player.angst!=oldangst)
|
|
{
|
|
d=(player.angst*10)/player.maxangst;
|
|
if (d>=10) d=9;
|
|
if (oldangstpic!=d)
|
|
{
|
|
VI_DrawPic(269,161,heart[d]);
|
|
oldangstpic=d;
|
|
}
|
|
oldangst=player.angst;
|
|
font=font2;
|
|
fontbasecolor=0;
|
|
sprintf(str1,"%3i",player.angst);
|
|
printx=280;
|
|
printy=188;
|
|
FN_RawPrint(str1);
|
|
}
|
|
statcursor+=2;
|
|
if (statcursor>=323) statcursor=269;
|
|
for(j=269;j<=305;j++)
|
|
{
|
|
if (j>statcursor) c=113;
|
|
else
|
|
{
|
|
c=139 - (statcursor-j);
|
|
if (c<120) c=113;
|
|
}
|
|
for(i=161;i<=185;i++)
|
|
{
|
|
p=*(ylookup[i]+j);
|
|
if (p==254 || (p>=113 && p<=139)) *(ylookup[i]+j)=c;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void displaycompass2(void)
|
|
{
|
|
int c, x, y, i;
|
|
fixed_t x1, y1;
|
|
|
|
if (player.angle==oldangle) return;
|
|
if (oldangle!=-1)
|
|
{
|
|
x=237;
|
|
x1=x<<FRACBITS;
|
|
y=161;
|
|
y1=y<<FRACBITS;
|
|
for(i=0;i<10;i++)
|
|
{
|
|
*(ylookup[y]+x)=0;
|
|
x1+=costable[oldangle];
|
|
y1-=FIXEDMUL(sintable[oldangle],54394);
|
|
x=x1>>FRACBITS;
|
|
y=y1>>FRACBITS;
|
|
}
|
|
}
|
|
oldangle=player.angle;
|
|
x=237;
|
|
x1=x<<FRACBITS;
|
|
y=161;
|
|
y1=y<<FRACBITS;
|
|
c=139;
|
|
for(i=0;i<10;i++,c--)
|
|
{
|
|
*(ylookup[y]+x)=c;
|
|
x1+=costable[oldangle];
|
|
y1-=FIXEDMUL(sintable[oldangle],54394);
|
|
x=x1>>FRACBITS;
|
|
y=y1>>FRACBITS;
|
|
}
|
|
}
|
|
|
|
|
|
void displaysettings2(void)
|
|
{
|
|
if (heatmode) memset(ylookup[199]+236,102,6);
|
|
else memset(ylookup[199]+236,0,6);
|
|
if (motionmode) memset(ylookup[199]+246,156,6);
|
|
else memset(ylookup[199]+246,0,6);
|
|
if (mapmode) memset(ylookup[199]+226,133,6);
|
|
else memset(ylookup[199]+226,0,6);
|
|
}
|
|
|
|
|
|
void displayinventory2(void)
|
|
{
|
|
int n, ammo, lump, i, j, count, top, bottom, x, y, maxshots;
|
|
char str1[20];
|
|
scalepic_t *pic;
|
|
byte *collumn;
|
|
|
|
font=font2;
|
|
fontbasecolor=0;
|
|
n=player.weapons[player.currentweapon];
|
|
if (weapons[n].ammorate>0)
|
|
{
|
|
ammo=player.ammo[weapons[n].ammotype];
|
|
maxshots=weapons[n].ammorate;
|
|
}
|
|
else
|
|
{
|
|
maxshots=999;
|
|
ammo=999;
|
|
}
|
|
printx=186;
|
|
printy=183;
|
|
FN_Printf("%3i",ammo);
|
|
printx=203;
|
|
printy=183;
|
|
FN_Printf("%3i",maxshots);
|
|
printx=187;
|
|
printy=191;
|
|
FN_RawPrint(ammonames[weapons[n].ammotype]);
|
|
|
|
if (inventorycursor==-1 || player.inventory[inventorycursor]==0) inventoryright();
|
|
if (inventorycursor!=oldinventory)
|
|
{
|
|
oldinventory=inventorycursor;
|
|
for (i=162;i<=184;i++) memset(ylookup[i]+113,0,30);
|
|
if (inventorycursor!=-1)
|
|
{
|
|
lump=inventorylump + inventorycursor;
|
|
printx=149; // name
|
|
printy=163;
|
|
FN_RawPrint(inventorynames[inventorycursor]);
|
|
pic=lumpmain[lump]; // draw the pic for it
|
|
x=128-(pic->width>>1);
|
|
for (i=0;i<pic->width;i++,x++)
|
|
if (pic->collumnofs[i])
|
|
{
|
|
collumn=(byte *)pic+pic->collumnofs[i];
|
|
top=*(collumn+1);
|
|
bottom=*(collumn);
|
|
count=bottom-top+1;
|
|
collumn+=2;
|
|
y=188-top-count;
|
|
for (j=0;j<count;j++,collumn++,y++)
|
|
if (*collumn)
|
|
*(ylookup[y]+x)=*collumn;
|
|
}
|
|
font=font3; // number of items
|
|
printx=150;
|
|
printy=172;
|
|
sprintf(str1,"%2i",player.inventory[inventorycursor]);
|
|
FN_RawPrint(str1);
|
|
}
|
|
else
|
|
{
|
|
printx=149; // name
|
|
printy=163;
|
|
sprintf(str1,"%14s"," ");
|
|
FN_RawPrint(str1);
|
|
font=font3; // number of items
|
|
printx=150;
|
|
printy=172;
|
|
FN_RawPrint(" ");
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void displaynetbonusitem2(void)
|
|
{
|
|
char *type, *name;
|
|
char str1[40];
|
|
int i, j, count, top, bottom, x, y, lump, score;
|
|
scalepic_t *pic;
|
|
pic_t *p;
|
|
byte *collumn, *b;
|
|
longint time;
|
|
|
|
if (goalitem==-1)
|
|
{
|
|
if (BonusItem.score) togglegoalitem=true;
|
|
for(i=158;i<188;i++)
|
|
memset(ylookup[i]+19,0,30);
|
|
font=font2;
|
|
fontbasecolor=0;
|
|
printx=53;
|
|
printy=162;
|
|
FN_RawPrint(" ");
|
|
printx=53;
|
|
printy=172;
|
|
FN_RawPrint(" ");
|
|
printx=53;
|
|
printy=182;
|
|
FN_RawPrint(" ");
|
|
printx=22;
|
|
printy=192;
|
|
sprintf(str1,"%-32s"," ");
|
|
FN_RawPrint(str1);
|
|
return;
|
|
}
|
|
if (goalitem==0 && BonusItem.score==0)
|
|
{
|
|
togglegoalitem=true;
|
|
return;
|
|
}
|
|
if (oldgoalitem==goalitem) return;
|
|
font=font2;
|
|
fontbasecolor=0;
|
|
if (goalitem==0)
|
|
{
|
|
lump=BonusItem.sprite->basepic;
|
|
score=BonusItem.score;
|
|
type="Bonus ";
|
|
time=(BonusItem.time-timecount)/70;
|
|
if (time>10000) time=0;
|
|
sprintf(str1,"%3i s",time);
|
|
name=BonusItem.name;
|
|
pic=lumpmain[lump];
|
|
x=34-(pic->width>>1);
|
|
for(i=158;i<188;i++)
|
|
memset(ylookup[i]+19,0,30);
|
|
for (i=0;i<pic->width;i++,x++)
|
|
if (pic->collumnofs[i])
|
|
{
|
|
collumn=(byte *)pic+pic->collumnofs[i];
|
|
top=*(collumn+1);
|
|
bottom=*(collumn);
|
|
count=bottom-top+1;
|
|
collumn+=2;
|
|
y=188-top-count;
|
|
for (j=0;j<count;j++,collumn++,y++)
|
|
if (*collumn)
|
|
*(ylookup[y]+x)=*collumn;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
lump=fraglump + playerdata[goalitem-1].chartype;
|
|
p=(pic_t *)lumpmain[lump];
|
|
type="Player";
|
|
name=netnames[goalitem-1];
|
|
sprintf(str1,"%-5i",fragcount[goalitem-1]);
|
|
|
|
b=&(p->data);
|
|
for (y=0;y<30;y++)
|
|
for (x=0;x<30;x++,b++)
|
|
*(ylookup[y+158]+19+x)=*b;
|
|
}
|
|
oldgoalitem=goalitem;
|
|
for(i=162;i<168;i++)
|
|
memset(ylookup[i]+53,0,23);
|
|
for(i=172;i<178;i++)
|
|
memset(ylookup[i]+53,0,30);
|
|
for(i=182;i<188;i++)
|
|
memset(ylookup[i]+53,0,39);
|
|
for(i=192;i<198;i++)
|
|
memset(ylookup[i]+22,0,159);
|
|
printx=53;
|
|
printy=162;
|
|
FN_RawPrint(" ");
|
|
printx=53;
|
|
printy=172;
|
|
FN_RawPrint(str1);
|
|
printx=53;
|
|
printy=182;
|
|
FN_RawPrint(type);
|
|
printx=22;
|
|
printy=192;
|
|
sprintf(str1,"%-32s",name);
|
|
FN_RawPrint(str1);
|
|
}
|
|
|
|
|
|
void displaybonusitem2(void)
|
|
{
|
|
char *type, *name;
|
|
char str1[40];
|
|
int i, j, count, top, bottom, x, y, lump, score, found, total;
|
|
scalepic_t *pic;
|
|
byte *collumn;
|
|
longint time;
|
|
|
|
if (goalitem==-1)
|
|
{
|
|
if (BonusItem.score) togglegoalitem=true;
|
|
for(i=158;i<188;i++)
|
|
memset(ylookup[i]+19,0,30);
|
|
font=font2;
|
|
fontbasecolor=0;
|
|
printx=53;
|
|
printy=162;
|
|
FN_RawPrint(" ");
|
|
printx=53;
|
|
printy=172;
|
|
FN_RawPrint(" ");
|
|
printx=53;
|
|
printy=182;
|
|
FN_RawPrint(" ");
|
|
printx=22;
|
|
printy=192;
|
|
sprintf(str1,"%-32s"," ");
|
|
FN_RawPrint(str1);
|
|
return;
|
|
}
|
|
if (goalitem==0 && BonusItem.score==0)
|
|
{
|
|
togglegoalitem=true;
|
|
return;
|
|
}
|
|
if (oldgoalitem==goalitem && goalitem!=0) return;
|
|
font=font2;
|
|
fontbasecolor=0;
|
|
if (goalitem==0)
|
|
{
|
|
lump=BonusItem.sprite->basepic;
|
|
score=BonusItem.score;
|
|
type="Bonus ";
|
|
time=(BonusItem.time-timecount)/70;
|
|
if (time>10000) time=0;
|
|
sprintf(str1,"%3i s",time);
|
|
name=BonusItem.name;
|
|
if (oldgoalitem==goalitem)
|
|
{
|
|
printx=53;
|
|
printy=162;
|
|
FN_RawPrint(str1);
|
|
return;
|
|
}
|
|
}
|
|
else if (goalitem>=1 && goalitem<=2)
|
|
{
|
|
lump=primarylump + primaries[(goalitem-1)*2];
|
|
score=primaries[(goalitem-1)*2+1];
|
|
type="Primary";
|
|
found=player.primaries[goalitem-1];
|
|
total=pcount[goalitem-1];
|
|
sprintf(str1,"%2i/%2i",found,total);
|
|
name=primnames[primaries[(goalitem-1)*2]];
|
|
}
|
|
else if (goalitem>=3)
|
|
{
|
|
lump=secondarylump + secondaries[(goalitem-3)*2];
|
|
score=secondaries[(goalitem-3)*2+1];
|
|
type="Second ";
|
|
found=player.secondaries[goalitem-3];
|
|
total=scount[goalitem-3];
|
|
sprintf(str1,"%2i/%2i",found,total);
|
|
name=secnames[secondaries[(goalitem-3)*2]];
|
|
}
|
|
|
|
oldgoalitem=goalitem;
|
|
|
|
for(i=158;i<188;i++)
|
|
memset(ylookup[i]+19,0,30);
|
|
pic=lumpmain[lump];
|
|
x=34-(pic->width>>1);
|
|
for (i=0;i<pic->width;i++,x++)
|
|
if (pic->collumnofs[i])
|
|
{
|
|
collumn=(byte *)pic+pic->collumnofs[i];
|
|
top=*(collumn+1);
|
|
bottom=*(collumn);
|
|
count=bottom-top+1;
|
|
collumn+=2;
|
|
y=188-top-count;
|
|
for (j=0;j<count;j++,collumn++,y++)
|
|
if (*collumn)
|
|
*(ylookup[y]+x)=*collumn;
|
|
}
|
|
|
|
for(i=162;i<168;i++)
|
|
memset(ylookup[i]+53,0,23);
|
|
for(i=172;i<178;i++)
|
|
memset(ylookup[i]+53,0,30);
|
|
for(i=182;i<188;i++)
|
|
memset(ylookup[i]+53,0,39);
|
|
for(i=192;i<198;i++)
|
|
memset(ylookup[i]+22,0,159);
|
|
|
|
printx=53;
|
|
printy=162;
|
|
FN_RawPrint(str1);
|
|
printx=53;
|
|
printy=172;
|
|
FN_Printf("%5i",score);
|
|
printx=53;
|
|
printy=182;
|
|
FN_RawPrint(type);
|
|
printx=22;
|
|
printy=192;
|
|
sprintf(str1,"%-32s",name);
|
|
FN_RawPrint(str1);
|
|
}
|
|
|
|
|
|
void displayrightstats2(void)
|
|
{
|
|
int n, shots;
|
|
|
|
n=player.weapons[player.currentweapon];
|
|
if (weapons[n].ammorate>0)
|
|
shots=player.ammo[weapons[n].ammotype]/weapons[n].ammorate;
|
|
else shots=999;
|
|
if (shots!=oldshots)
|
|
{
|
|
font=font3;
|
|
printx=225;
|
|
printy=178;
|
|
fontbasecolor=0;
|
|
FN_Printf("%3i",shots);
|
|
oldshots=shots;
|
|
}
|
|
displaycompass2();
|
|
displaysettings2();
|
|
displaystats2();
|
|
}
|
|
|
|
|
|
void displaybodycount2(void)
|
|
{
|
|
char str1[20];
|
|
int i, j, d, d1, c;
|
|
|
|
if (player.bodycount!=oldbodycount)
|
|
{
|
|
font=font2;
|
|
printx=178;
|
|
printy=3;
|
|
fontbasecolor=0;
|
|
sprintf(str1,"%8lu",player.bodycount);
|
|
FN_RawPrint(str1);
|
|
oldbodycount=player.bodycount;
|
|
}
|
|
if (player.score!=oldscore)
|
|
{
|
|
font=font2;
|
|
printx=28;
|
|
printy=3;
|
|
fontbasecolor=0;
|
|
sprintf(str1,"%9lu",player.score);
|
|
FN_RawPrint(str1);
|
|
oldscore=player.score;
|
|
}
|
|
if (player.levelscore!=oldlevelscore)
|
|
{
|
|
font=font2;
|
|
printx=104;
|
|
printy=3;
|
|
fontbasecolor=0;
|
|
sprintf(str1,"%9lu",player.levelscore);
|
|
FN_RawPrint(str1);
|
|
oldlevelscore=player.levelscore;
|
|
}
|
|
if (specialeffecttime!=0x7FFFFFFF)
|
|
{
|
|
d1=(specialeffecttime-timecount)>>2;
|
|
if (d1>97) d=97;
|
|
else if (d1<0) d=0;
|
|
else d=d1;
|
|
|
|
for(j=0;j<d;j++)
|
|
{
|
|
c=(j*26)/d1;
|
|
for(i=2;i<=8;i++)
|
|
*(ylookup[i]+j+221)=c+140;
|
|
}
|
|
if (d<97)
|
|
for(j=d;j<=97;j++)
|
|
for(i=2;i<=8;i++)
|
|
*(ylookup[i]+j+221)=0;
|
|
}
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void displayinventoryitem(void)
|
|
{
|
|
int lump, i, j, count, top, bottom, x, y;
|
|
char str1[20];
|
|
scalepic_t *pic;
|
|
byte *collumn;
|
|
|
|
if (inventorycursor<0) return;
|
|
for(i=0;i<27;i++)
|
|
{
|
|
memset(viewylookup[i]+windowWidth-54,0,54);
|
|
*(viewylookup[i]+windowWidth-55)=30;
|
|
}
|
|
memset(viewylookup[i]+windowWidth-55,30,55);
|
|
lump=inventorylump + inventorycursor;
|
|
pic=lumpmain[lump]; // draw the pic for it
|
|
x=windowWidth-31;
|
|
for (i=0;i<pic->width;i++,x++)
|
|
if (pic->collumnofs[i])
|
|
{
|
|
collumn=(byte *)pic+pic->collumnofs[i];
|
|
top=*(collumn+1);
|
|
bottom=*(collumn);
|
|
count=bottom-top+1;
|
|
collumn+=2;
|
|
y=28-top-count;
|
|
for (j=0;j<count;j++,collumn++,y++)
|
|
if (*collumn)
|
|
*(viewylookup[y]+x)=*collumn;
|
|
}
|
|
fontbasecolor=0;
|
|
font=font3; // number of items
|
|
printx=windowWidth-53;
|
|
printy=6;
|
|
sprintf(str1,"%2i",player.inventory[inventorycursor]);
|
|
FN_RawPrint4(str1);
|
|
}
|
|
|
|
/*=====================================================================*/
|
|
|
|
void updatedisplay(void)
|
|
{
|
|
switch (currentViewSize)
|
|
{
|
|
case 0:
|
|
if (timecount<inventorytime) displayinventoryitem();
|
|
break;
|
|
case 3:
|
|
displayinventory1(0); // level 3 to view
|
|
case 2: // no break!
|
|
if (!netmode)
|
|
displaybonusitem1(0); // level 2 to view
|
|
else
|
|
displaynetbonusitem1(0);
|
|
case 1: // no break!
|
|
displayrightstats1(0); // level 1 to view
|
|
if (currentViewSize<3 && timecount<inventorytime) displayinventoryitem();
|
|
break;
|
|
case 4: // level 4 to view + top to screen
|
|
displayinventory1(-11);
|
|
if (!netmode)
|
|
displaybonusitem1(-11);
|
|
else
|
|
displaynetbonusitem1(-11);
|
|
displayrightstats1(-11);
|
|
displaybodycount2();
|
|
break;
|
|
case 5: // smaller screen sizes
|
|
case 6:
|
|
case 7:
|
|
case 8:
|
|
case 9:
|
|
displayinventory2();
|
|
if (!netmode)
|
|
displaybonusitem2();
|
|
else
|
|
displaynetbonusitem2();
|
|
displayrightstats2();
|
|
displaybodycount2();
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
/*=====================================================================*/
|
|
|
|
void displayarrow(int x,int y)
|
|
{
|
|
int angle;
|
|
|
|
*(viewylookup[y]+x)=26;
|
|
angle=(((player.angle+DEGREE45_2)&ANGLES)*8)/ANGLES;
|
|
switch (angle)
|
|
{
|
|
case 0:
|
|
*(viewylookup[y]+x+1)=40;
|
|
*(viewylookup[y]+x-1)=20;
|
|
break;
|
|
case 1:
|
|
*(viewylookup[y-1]+x+1)=40;
|
|
*(viewylookup[y+1]+x-1)=20;
|
|
break;
|
|
case 2:
|
|
*(viewylookup[y-1]+x)=40;
|
|
*(viewylookup[y+1]+x)=20;
|
|
break;
|
|
case 3:
|
|
*(viewylookup[y-1]+x-1)=40;
|
|
*(viewylookup[y+1]+x+1)=20;
|
|
break;
|
|
case 4:
|
|
*(viewylookup[y]+x-1)=40;
|
|
*(viewylookup[y]+x+1)=20;
|
|
break;
|
|
case 5:
|
|
*(viewylookup[y+1]+x-1)=40;
|
|
*(viewylookup[y-1]+x+1)=20;
|
|
break;
|
|
case 6:
|
|
*(viewylookup[y+1]+x)=40;
|
|
*(viewylookup[y-1]+x)=20;
|
|
break;
|
|
case 7:
|
|
*(viewylookup[y+1]+x+1)=40;
|
|
*(viewylookup[y-1]+x-1)=20;
|
|
break;
|
|
}
|
|
}
|
|
|
|
|
|
void displaymapmode(void)
|
|
/* head up display map */
|
|
{
|
|
int i, j, ofsx, ofsy, x, y, px, py, mapy, mapx, c, a, miny, maxy, minx, maxx;
|
|
int mapspot;
|
|
int b;
|
|
|
|
y=windowHeight/4;
|
|
miny=-(y/2);
|
|
maxy=y/2;
|
|
x=windowWidth/4;
|
|
minx=-(x/2);
|
|
maxx=x/2;
|
|
ofsx=1-((player.x>>(FRACBITS+4))&3);
|
|
ofsy=1-((player.y>>(FRACBITS+4))&3);
|
|
px=player.x>>FRACTILESHIFT;
|
|
py=player.y>>FRACTILESHIFT;
|
|
y=ofsy;
|
|
for(i=miny;i<=maxy;i++,y+=4) // display north maps
|
|
{
|
|
mapy=py+i;
|
|
if (mapy<0 || mapy>=MAPROWS) continue;
|
|
mapx=px+minx;
|
|
mapspot=mapy*MAPCOLS+mapx;
|
|
x=ofsx;
|
|
for(j=minx;j<=maxx;j++,mapspot++,mapx++)
|
|
if (mapx>=0 && mapx<MAPCOLS && player.northmap[mapspot])
|
|
{
|
|
c=player.northmap[mapspot];
|
|
if (c==DOOR_COLOR)
|
|
{
|
|
for(a=0;a<5;a++,x++)
|
|
if (x>=0 && x<windowWidth && y+2<windowHeight && y+2>=0) *(viewylookup[y+2]+x)=c;
|
|
}
|
|
else
|
|
{
|
|
for(a=0;a<5;a++,x++)
|
|
if (x>=0 && x<windowWidth && y<windowHeight && y>=0) *(viewylookup[y]+x)=c;
|
|
}
|
|
x--;
|
|
}
|
|
else x+=4;
|
|
}
|
|
x=ofsx;
|
|
for(j=minx;j<=maxx;j++,x+=4) // display west maps
|
|
{
|
|
mapx=px+j;
|
|
if (mapx<0 || mapx>=MAPCOLS) continue;
|
|
mapy=py+miny;
|
|
mapspot=mapy*MAPCOLS+mapx;
|
|
y=ofsy;
|
|
for(i=miny;i<=maxy;i++,mapspot+=MAPCOLS,mapy++)
|
|
if (mapy>=0 && mapy<MAPROWS && player.westmap[mapspot])
|
|
{
|
|
c=player.westmap[mapspot];
|
|
if (c==DOOR_COLOR)
|
|
{
|
|
for(a=0;a<5;a++,y++)
|
|
if (y>=0 && y<windowHeight && x+2<windowWidth && x+2>=0) *(viewylookup[y]+x+2)=c;
|
|
}
|
|
else
|
|
{
|
|
for(a=0;a<5;a++,y++)
|
|
if (y>=0 && y<windowHeight && x<windowWidth && x>=0) *(viewylookup[y]+x)=c;
|
|
}
|
|
y--;
|
|
}
|
|
else y+=4;
|
|
}
|
|
displayarrow(windowWidth/2+1,windowHeight/2+1);
|
|
if (BonusItem.score)
|
|
{
|
|
y=ofsy + 4*(BonusItem.tiley - py);
|
|
y+=windowHeight/2;
|
|
x=ofsx + 4*(BonusItem.tilex - px);
|
|
x+=windowWidth/2;
|
|
c=44;
|
|
for(a=0;a<4;a++)
|
|
for(b=0;b<4;b++)
|
|
if (x+b<windowWidth && x+b>=0 && y+a<windowHeight && y+a>=0) *(viewylookup[y+a]+b+x)=c;
|
|
}
|
|
if (exitexists)
|
|
{
|
|
y=ofsy + 4*(exity - py);
|
|
y+=windowHeight/2;
|
|
x=ofsx + 4*(exitx - px);
|
|
x+=windowWidth/2;
|
|
for(a=0;a<4;a++)
|
|
for(b=0;b<4;b++)
|
|
if (x+b<windowWidth && x+b>=0 && y+a<windowHeight && y+a>=0) *(viewylookup[y+a]+b+x)=187;
|
|
}
|
|
}
|
|
|
|
|
|
void displayswingmapmode(void)
|
|
/* rotating map display */
|
|
{
|
|
int i, j, ofsx, ofsy, x, y, px, py, c, a, x1, y1, y2, x2;
|
|
fixed_t xfrac, yfrac, xfrac2, yfrac2, xfracstep, yfracstep, xfracstep2, yfracstep2;
|
|
int mapspot;
|
|
|
|
switch (MapZoom)
|
|
{
|
|
case 8:
|
|
ofsx=1-((player.x>>(FRACBITS+3))&7); /* compute player tile offset */
|
|
ofsy=1-((player.y>>(FRACBITS+3))&7);
|
|
break;
|
|
case 4:
|
|
ofsx=1-((player.x>>(FRACBITS+4))&3); /* compute player tile offset */
|
|
ofsy=1-((player.y>>(FRACBITS+4))&3);
|
|
break;
|
|
case 16:
|
|
ofsx=1-((player.x>>(FRACBITS+2))&15); /* compute player tile offset */
|
|
ofsy=1-((player.y>>(FRACBITS+2))&15);
|
|
break;
|
|
}
|
|
|
|
px=(player.x>>FRACTILESHIFT)*MapZoom-ofsx; /* compute player position */
|
|
py=(player.y>>FRACTILESHIFT)*MapZoom-ofsy;
|
|
/* compute incremental values for both diagonal axis */
|
|
xfracstep=cosines[((player.angle+SOUTH)&ANGLES)<<FINESHIFT];
|
|
yfracstep=sines[((player.angle+SOUTH)&ANGLES)<<FINESHIFT];
|
|
xfracstep2=cosines[player.angle<<FINESHIFT];
|
|
yfracstep2=sines[player.angle<<FINESHIFT];
|
|
xfrac2=((windowWidth/2)<<FRACBITS) - (py*xfracstep2 + px*xfracstep);
|
|
yfrac2=((windowHeight/2)<<FRACBITS) - (py*yfracstep2 + px*yfracstep);
|
|
y=yfrac2>>FRACBITS;
|
|
x=xfrac2>>FRACBITS;
|
|
mapspot=0;
|
|
/* don't ask me to explain this!!!
|
|
basically you start at upper left corner, adding one axis increment
|
|
on the y axis and then updating the one for the x axis as it draws */
|
|
if (BonusItem.score)
|
|
{
|
|
yfrac2+=yfracstep2*MapZoom*BonusItem.tiley + (yfracstep2*MapZoom/2); //+ ((MapZoom>>1)*yfracstep2);
|
|
xfrac2+=xfracstep2*MapZoom*BonusItem.tiley + (xfracstep2*MapZoom/2); //+ ((MapZoom>>1)*yfracstep2);
|
|
|
|
xfrac=xfrac2 + xfracstep*MapZoom*BonusItem.tilex + (xfracstep*MapZoom/2); //+ ((MapZoom>>1)*yfracstep);
|
|
yfrac=yfrac2 + yfracstep*MapZoom*BonusItem.tilex + (yfracstep*MapZoom/2); //+ ((MapZoom>>1)*yfracstep);
|
|
|
|
x1=(xfrac>>FRACBITS);
|
|
y1=(yfrac>>FRACBITS);
|
|
|
|
if (y1>=0 && x1>=0 && x1<windowWidth && y1<windowHeight) *(viewylookup[y1]+x1)=44;
|
|
if (y1+1>=0 && x1>=0 && x1<windowWidth && y1+1<windowHeight) *(viewylookup[y1+1]+x1)=44;
|
|
x1++;
|
|
if (y1>=0 && x1>=0 && x1<windowWidth && y1<windowHeight) *(viewylookup[y1]+x1)=44;
|
|
y1++;
|
|
if (y1>=0 && x1>=0 && x1<windowWidth && y1<windowHeight) *(viewylookup[y1]+x1)=44;
|
|
|
|
xfrac2=((windowWidth/2)<<FRACBITS) - (py*xfracstep2 + px*xfracstep);
|
|
yfrac2=((windowHeight/2)<<FRACBITS) - (py*yfracstep2 + px*yfracstep);
|
|
y=yfrac2>>FRACBITS;
|
|
x=xfrac2>>FRACBITS;
|
|
}
|
|
if (exitexists)
|
|
{
|
|
yfrac2+=yfracstep2*MapZoom*exity + (yfracstep2*MapZoom/2); //+ ((MapZoom>>1)*yfracstep2);
|
|
xfrac2+=xfracstep2*MapZoom*exity + (xfracstep2*MapZoom/2); //+ ((MapZoom>>1)*yfracstep2);
|
|
|
|
xfrac=xfrac2 + xfracstep*MapZoom*exitx + (xfracstep*MapZoom/2); //+ ((MapZoom>>1)*yfracstep);
|
|
yfrac=yfrac2 + yfracstep*MapZoom*exitx + (yfracstep*MapZoom/2); //+ ((MapZoom>>1)*yfracstep);
|
|
|
|
x1=(xfrac>>FRACBITS);
|
|
y1=(yfrac>>FRACBITS);
|
|
|
|
if (y1>=0 && x1>=0 && x1<windowWidth && y1<windowHeight) *(viewylookup[y1]+x1)=187;
|
|
if (y1+1>=0 && x1>=0 && x1<windowWidth && y1+1<windowHeight) *(viewylookup[y1+1]+x1)=187;
|
|
x1++;
|
|
if (y1>=0 && x1>=0 && x1<windowWidth && y1<windowHeight) *(viewylookup[y1]+x1)=187;
|
|
y1++;
|
|
if (y1>=0 && x1>=0 && x1<windowWidth && y1<windowHeight) *(viewylookup[y1]+x1)=187;
|
|
|
|
xfrac2=((windowWidth/2)<<FRACBITS) - (py*xfracstep2 + px*xfracstep);
|
|
yfrac2=((windowHeight/2)<<FRACBITS) - (py*yfracstep2 + px*yfracstep);
|
|
y=yfrac2>>FRACBITS;
|
|
x=xfrac2>>FRACBITS;
|
|
}
|
|
|
|
for(i=0;i<MAPCOLS;i++)
|
|
{
|
|
xfrac=xfrac2;
|
|
yfrac=yfrac2;
|
|
x1=x;
|
|
y1=y;
|
|
for(j=0;j<MAPROWS;j++,mapspot++)
|
|
if (player.northmap[mapspot])
|
|
{
|
|
c=player.northmap[mapspot];
|
|
if (c==DOOR_COLOR)
|
|
{
|
|
for(a=0;a<=MapZoom;a++)
|
|
{
|
|
y2=y1+(((MapZoom>>1)*yfracstep2)>>FRACBITS);
|
|
x2=x1+(((MapZoom>>1)*xfracstep2)>>FRACBITS);
|
|
if (y2>=0 && x2>=0 && x2<windowWidth && y2<windowHeight) *(viewylookup[y2]+x2)=c;
|
|
xfrac+=xfracstep;
|
|
x1=xfrac>>FRACBITS;
|
|
yfrac+=yfracstep;
|
|
y1=yfrac>>FRACBITS;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for(a=0;a<=MapZoom;a++)
|
|
{
|
|
if (y1>=0 && x1>=0 && x1<windowWidth && y1<windowHeight) *(viewylookup[y1]+x1)=c;
|
|
xfrac+=xfracstep;
|
|
x1=xfrac>>FRACBITS;
|
|
yfrac+=yfracstep;
|
|
y1=yfrac>>FRACBITS;
|
|
}
|
|
}
|
|
xfrac-=xfracstep;
|
|
x1=xfrac>>FRACBITS;
|
|
yfrac-=yfracstep;
|
|
y1=yfrac>>FRACBITS;
|
|
}
|
|
else
|
|
{
|
|
xfrac+=xfracstep*MapZoom;
|
|
x1=xfrac>>FRACBITS;
|
|
yfrac+=yfracstep*MapZoom;
|
|
y1=yfrac>>FRACBITS;
|
|
}
|
|
yfrac2+=yfracstep2*MapZoom;
|
|
y=yfrac2>>FRACBITS;
|
|
xfrac2+=xfracstep2*MapZoom;
|
|
x=xfrac2>>FRACBITS;
|
|
}
|
|
xfrac=((windowWidth/2)<<FRACBITS) - (py*xfracstep2 + px*xfracstep);
|
|
yfrac=((windowHeight/2)<<FRACBITS) - (py*yfracstep2 + px*yfracstep);
|
|
y=yfrac>>FRACBITS;
|
|
x=xfrac>>FRACBITS;
|
|
for(i=0;i<MAPCOLS;i++)
|
|
{
|
|
xfrac2=xfrac;
|
|
yfrac2=yfrac;
|
|
x1=x;
|
|
y1=y;
|
|
mapspot=i;
|
|
for(j=0;j<MAPROWS;j++,mapspot+=MAPCOLS)
|
|
if (player.westmap[mapspot])
|
|
{
|
|
c=player.westmap[mapspot];
|
|
if (c==DOOR_COLOR)
|
|
{
|
|
for(a=0;a<=MapZoom;a++)
|
|
{
|
|
y2=y1+(((MapZoom>>1)*yfracstep)>>FRACBITS);
|
|
x2=x1+(((MapZoom>>1)*xfracstep)>>FRACBITS);
|
|
if (y2>=0 && x2>=0 && x2<windowWidth && y2<windowHeight) *(viewylookup[y2]+x2)=c;
|
|
xfrac2+=xfracstep2;
|
|
x1=xfrac2>>FRACBITS;
|
|
yfrac2+=yfracstep2;
|
|
y1=yfrac2>>FRACBITS;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for(a=0;a<=MapZoom;a++)
|
|
{
|
|
if (y1>=0 && x1>=0 && x1<windowWidth && y1<windowHeight) *(viewylookup[y1]+x1)=c;
|
|
xfrac2+=xfracstep2;
|
|
x1=xfrac2>>FRACBITS;
|
|
yfrac2+=yfracstep2;
|
|
y1=yfrac2>>FRACBITS;
|
|
}
|
|
}
|
|
xfrac2-=xfracstep2;
|
|
x1=xfrac2>>FRACBITS;
|
|
yfrac2-=yfracstep2;
|
|
y1=yfrac2>>FRACBITS;
|
|
}
|
|
else
|
|
{
|
|
xfrac2+=xfracstep2*MapZoom;
|
|
x1=xfrac2>>FRACBITS;
|
|
yfrac2+=yfracstep2*MapZoom;
|
|
y1=yfrac2>>FRACBITS;
|
|
}
|
|
yfrac+=yfracstep*MapZoom;
|
|
y=yfrac>>FRACBITS;
|
|
xfrac+=xfracstep*MapZoom;
|
|
x=xfrac>>FRACBITS;
|
|
}
|
|
*(viewylookup[windowHeight/2+1]+windowWidth/2+1)=40;
|
|
}
|
|
|
|
|
|
void displayheatmode(void)
|
|
/* display overhead heat sensor */
|
|
{
|
|
int i, j, c;
|
|
|
|
for(i=0;i<64;i++)
|
|
for(j=0;j<64;j++)
|
|
if (reallight[i*64+j])
|
|
{
|
|
c=-reallight[i*64+j]/48;
|
|
if (c>15) c=15;
|
|
else if (c<0) c=0;
|
|
*(viewylookup[i+21]+j+3)=88-c;
|
|
}
|
|
memset(viewylookup[20]+2,73,66);
|
|
memset(viewylookup[85]+2,73,66);
|
|
for(i=21;i<85;i++)
|
|
{
|
|
*(viewylookup[i]+2)=73;
|
|
*(viewylookup[i]+67)=73;
|
|
}
|
|
*(viewylookup[(player.y>>FRACTILESHIFT)+21]+(player.x>>FRACTILESHIFT)+3)=40;
|
|
if (BonusItem.score)
|
|
*(viewylookup[BonusItem.tiley + 21] + BonusItem.tilex + 3)=44;
|
|
if (exitexists)
|
|
*(viewylookup[exity + 21] + exitx + 3)=187;
|
|
}
|
|
|
|
|
|
void displayheatmapmode(void)
|
|
/* display heat traces on the overhead map */
|
|
{
|
|
int i, j, ofsx, ofsy, x, y, px, py, mapy, mapx, c, a, miny, maxy, minx, maxx;
|
|
int mapspot, b;
|
|
|
|
y=windowHeight/4;
|
|
miny=-(y/2);
|
|
maxy=y/2;
|
|
x=windowWidth/4;
|
|
minx=-(x/2);
|
|
maxx=x/2;
|
|
ofsx=1-((player.x>>(FRACBITS+4))&3);
|
|
ofsy=1-((player.y>>(FRACBITS+4))&3);
|
|
px=player.x>>FRACTILESHIFT;
|
|
py=player.y>>FRACTILESHIFT;
|
|
y=ofsy;
|
|
for(i=miny;i<=maxy;i++,y+=4)
|
|
{
|
|
mapy=py+i;
|
|
if (mapy<0 || mapy>=MAPROWS) continue;
|
|
mapx=px+minx;
|
|
mapspot=mapy*MAPCOLS+mapx;
|
|
x=ofsx;
|
|
for(j=minx;j<=maxx;j++,mapspot++,mapx++,x+=4)
|
|
if (mapx>=0 && mapx<MAPCOLS && reallight[mapspot])
|
|
{
|
|
c=-reallight[mapspot]/48;
|
|
if (c>15) c=15;
|
|
else if (c<0) c=0;
|
|
c=88-c;
|
|
for(a=0;a<4;a++)
|
|
if (y+a<windowHeight && y+a>=0)
|
|
for(b=0;b<4;b++)
|
|
if (x+b<windowWidth && x+b>=0) *(viewylookup[y+a]+b+x)=c;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
void displaymotionmode(void)
|
|
/* display sensors on overhead display */
|
|
{
|
|
scaleobj_t *sp;
|
|
int sx, sy, i;
|
|
|
|
for(sp=firstscaleobj.next;sp!=&lastscaleobj;sp=sp->next)
|
|
if (sp->active && sp->hitpoints)
|
|
{
|
|
sx=sp->x>>FRACTILESHIFT;
|
|
sy=sp->y>>FRACTILESHIFT;
|
|
*(viewylookup[sy+21]+sx+3)=152;
|
|
}
|
|
memset(viewylookup[20]+2,73,66);
|
|
memset(viewylookup[85]+2,73,66);
|
|
for(i=21;i<85;i++)
|
|
{
|
|
*(viewylookup[i]+2)=73;
|
|
*(viewylookup[i]+67)=73;
|
|
}
|
|
*(viewylookup[(player.y>>FRACTILESHIFT)+21]+(player.x>>FRACTILESHIFT)+3)=40;
|
|
if (BonusItem.score)
|
|
*(viewylookup[BonusItem.tiley + 21] + BonusItem.tilex + 3)=44;
|
|
if (exitexists)
|
|
*(viewylookup[exity + 21] + exitx + 3)=187;
|
|
}
|
|
|
|
|
|
void displaymotionmapmode(void)
|
|
/* display sensors on overhead map */
|
|
{
|
|
int ofsx, ofsy, x, y, a, b, px, py;
|
|
scaleobj_t *sp;
|
|
|
|
ofsx=1-((player.x>>(FRACBITS+4))&3)+windowWidth/2;
|
|
ofsy=1-((player.y>>(FRACBITS+4))&3)+windowHeight/2;
|
|
px=player.x>>FRACTILESHIFT;
|
|
py=player.y>>FRACTILESHIFT;
|
|
for(sp=firstscaleobj.next;sp!=&lastscaleobj;sp=sp->next)
|
|
if (sp->active && sp->hitpoints)
|
|
{
|
|
x=((((sp->x)>>FRACTILESHIFT)-px)<<2)+ofsx;
|
|
y=((((sp->y)>>FRACTILESHIFT)-py)<<2)+ofsy;
|
|
for(a=0;a<4;a++)
|
|
if (y+a<windowHeight && y+a>=0)
|
|
for(b=0;b<4;b++)
|
|
if (x+b<windowWidth && x+b>=0) *(viewylookup[y+a]+b+x)=152;
|
|
}
|
|
}
|
|
|