mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-27 20:20:40 +00:00
- removed the native implementation od Exhumed's status bar.
This commit is contained in:
parent
663f330684
commit
b520d38bc0
3 changed files with 15 additions and 866 deletions
|
@ -829,10 +829,12 @@ void CreateStatusBar()
|
||||||
StatusBar->SetSize(0, 320, 200);
|
StatusBar->SetSize(0, 320, 200);
|
||||||
InitStatusBar();
|
InitStatusBar();
|
||||||
// this is for comparing the scriptification with the C++ versions
|
// this is for comparing the scriptification with the C++ versions
|
||||||
|
/*
|
||||||
stbarclass = PClass::FindClass("NativeExhumedStatusBar");
|
stbarclass = PClass::FindClass("NativeExhumedStatusBar");
|
||||||
StatusBar2 = static_cast<DBaseStatusBar*>(stbarclass->CreateNew());
|
StatusBar2 = static_cast<DBaseStatusBar*>(stbarclass->CreateNew());
|
||||||
StatusBar2->SetSize(0, 320, 200);
|
StatusBar2->SetSize(0, 320, 200);
|
||||||
StatusBar2->Release();
|
StatusBar2->Release();
|
||||||
|
*/
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1,32 +1,35 @@
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
/*
|
/*
|
||||||
Copyright (C) 2010-2019 EDuke32 developers and contributors
|
Copyright (C) 2020-2021 Christoph Oelckers
|
||||||
Copyright (C) 2019 sirlemonhead, Nuke.YKT
|
|
||||||
This file is part of PCExhumed.
|
This file is part of Raze.
|
||||||
PCExhumed is free software; you can redistribute it and/or
|
|
||||||
modify it under the terms of the GNU General Public License version 2
|
This is free software; you can redistribute it and/or
|
||||||
as published by the Free Software Foundation.
|
modify it under the terms of the GNU General Public License
|
||||||
|
as published by the Free Software Foundation; either version 2
|
||||||
|
of the License, or (at your option) any later version.
|
||||||
|
|
||||||
This program is distributed in the hope that it will be useful,
|
This program is distributed in the hope that it will be useful,
|
||||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||||
|
|
||||||
See the GNU General Public License for more details.
|
See the GNU General Public License for more details.
|
||||||
|
|
||||||
You should have received a copy of the GNU General Public License
|
You should have received a copy of the GNU General Public License
|
||||||
along with this program; if not, write to the Free Software
|
along with this program; if not, write to the Free Software
|
||||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||||
*/
|
*/
|
||||||
//-------------------------------------------------------------------------
|
//-------------------------------------------------------------------------
|
||||||
|
|
||||||
#include "ns.h"
|
#include "ns.h"
|
||||||
#include "engine.h"
|
#include "engine.h"
|
||||||
#include "player.h"
|
#include "player.h"
|
||||||
#include "aistuff.h"
|
|
||||||
#include "status.h"
|
#include "status.h"
|
||||||
#include "exhumed.h"
|
#include "exhumed.h"
|
||||||
#include "sequence.h"
|
#include "sequence.h"
|
||||||
#include "names.h"
|
#include "names.h"
|
||||||
#include "view.h"
|
#include "view.h"
|
||||||
#include "v_2ddrawer.h"
|
#include "v_2ddrawer.h"
|
||||||
#include "multipatchtexture.h"
|
|
||||||
#include "texturemanager.h"
|
|
||||||
#include "statusbar.h"
|
#include "statusbar.h"
|
||||||
#include "v_draw.h"
|
#include "v_draw.h"
|
||||||
#include "automap.h"
|
#include "automap.h"
|
||||||
|
@ -115,857 +118,6 @@ DEFINE_ACTION_FUNCTION_NATIVE(_Exhumed, SizeOfStatusSequence, SizeOfStatusSequen
|
||||||
ACTION_RETURN_INT(SeqSize[nStatusSeqOffset + s1]);
|
ACTION_RETURN_INT(SeqSize[nStatusSeqOffset + s1]);
|
||||||
}
|
}
|
||||||
|
|
||||||
class DNativeExhumedStatusBar : public DBaseStatusBar
|
|
||||||
{
|
|
||||||
DECLARE_CLASS(DNativeExhumedStatusBar, DBaseStatusBar)
|
|
||||||
HAS_OBJECT_POINTERS
|
|
||||||
|
|
||||||
TObjPtr<DHUDFont*> textfont, numberFont;
|
|
||||||
int keyanims[4];
|
|
||||||
int airframe, lungframe;
|
|
||||||
|
|
||||||
int nSelectedItem;
|
|
||||||
int nHealthLevel;
|
|
||||||
int nMagicLevel;
|
|
||||||
int nMeterRange;
|
|
||||||
int nHurt;
|
|
||||||
int nHealthFrame;
|
|
||||||
int nMagicFrame;
|
|
||||||
int nItemAltSeq;
|
|
||||||
int nItemSeq;
|
|
||||||
int nItemFrames;
|
|
||||||
int nItemFrame;
|
|
||||||
|
|
||||||
|
|
||||||
int nCounter;
|
|
||||||
int nCounterDest;
|
|
||||||
int nDigit[3];
|
|
||||||
int ammodelay;
|
|
||||||
int nLastWeapon;
|
|
||||||
|
|
||||||
enum EConst
|
|
||||||
{
|
|
||||||
KeySeq = 36,
|
|
||||||
};
|
|
||||||
|
|
||||||
public:
|
|
||||||
DNativeExhumedStatusBar()
|
|
||||||
{
|
|
||||||
textfont = Create<DHUDFont>(SmallFont, 1, Off, 1, 1);
|
|
||||||
numberFont = Create<DHUDFont>(BigFont, 0, Off, 1, 1);
|
|
||||||
|
|
||||||
int nPicNum = seq_GetSeqPicnum(kSeqStatus, 1, 0);
|
|
||||||
nMeterRange = tileHeight(nPicNum);
|
|
||||||
Reset();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Reset()
|
|
||||||
{
|
|
||||||
airframe = lungframe = nHurt = nHealthFrame = nMagicFrame = nItemAltSeq = nItemFrames = nItemFrame = nCounter = 0;
|
|
||||||
|
|
||||||
nDigit[0] = nDigit[1] = nDigit[2] = 0;
|
|
||||||
nHealthLevel = -1;
|
|
||||||
nMagicLevel = -1;
|
|
||||||
nSelectedItem = -1;
|
|
||||||
nItemSeq = -1;
|
|
||||||
ammodelay = 3;
|
|
||||||
nLastWeapon = -1;
|
|
||||||
SetCounter(0);
|
|
||||||
}
|
|
||||||
|
|
||||||
private:
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// draws a sequence animation to the status bar
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void DrawStatusSequence(short nSequence, uint16_t edx, double ebx, double xoffset = 0)
|
|
||||||
{
|
|
||||||
edx += SeqBase[nSequence];
|
|
||||||
|
|
||||||
short nFrameBase = FrameBase[edx];
|
|
||||||
int16_t nFrameSize = FrameSize[edx];
|
|
||||||
|
|
||||||
while (1)
|
|
||||||
{
|
|
||||||
nFrameSize--;
|
|
||||||
if (nFrameSize < 0)
|
|
||||||
break;
|
|
||||||
|
|
||||||
int flags = 0;
|
|
||||||
|
|
||||||
double x = ChunkXpos[nFrameBase] + xoffset;
|
|
||||||
double y = ChunkYpos[nFrameBase] + ebx;
|
|
||||||
|
|
||||||
if (hud_size <= Hud_StbarOverlay)
|
|
||||||
{
|
|
||||||
x += 161;
|
|
||||||
y += 100;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (x < 0)
|
|
||||||
{
|
|
||||||
x += 160;
|
|
||||||
flags |= DI_SCREEN_LEFT_BOTTOM;
|
|
||||||
}
|
|
||||||
else if (x > 0)
|
|
||||||
{
|
|
||||||
x -= 159; // graphics do not match up precisely.
|
|
||||||
flags |= DI_SCREEN_RIGHT_BOTTOM;
|
|
||||||
}
|
|
||||||
y -= 100;
|
|
||||||
}
|
|
||||||
|
|
||||||
int tile = ChunkPict[nFrameBase];
|
|
||||||
|
|
||||||
short chunkFlag = ChunkFlag[nFrameBase];
|
|
||||||
|
|
||||||
if (chunkFlag & 3)
|
|
||||||
{
|
|
||||||
// This is hard to align with bad offsets, so skip that treatment for mirrored elements.
|
|
||||||
flags |= DI_ITEM_RELCENTER;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
x -= tileWidth(tile) * .5;
|
|
||||||
y -= tileHeight(tile) * .5;
|
|
||||||
flags |= DI_ITEM_OFFSETS;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (chunkFlag & 1)
|
|
||||||
flags |= DI_MIRROR;
|
|
||||||
if (chunkFlag & 2)
|
|
||||||
flags |= DI_MIRRORY;
|
|
||||||
|
|
||||||
DrawGraphic(tileGetTexture(tile), x, y, flags, 1, -1, -1, 1, 1);
|
|
||||||
nFrameBase++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// draws a sequence animation to the status bar
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
FGameTexture * GetStatusSequencePic(short nSequence, uint16_t edx)
|
|
||||||
{
|
|
||||||
edx += SeqBase[nSequence];
|
|
||||||
int nFrameBase = FrameBase[edx];
|
|
||||||
return tileGetTexture(ChunkPict[nFrameBase]);
|
|
||||||
}
|
|
||||||
|
|
||||||
int GetStatusSequenceTile(short nSequence, uint16_t edx)
|
|
||||||
{
|
|
||||||
edx += SeqBase[nSequence];
|
|
||||||
int nFrameBase = FrameBase[edx];
|
|
||||||
return ChunkPict[nFrameBase];
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// Frag display - very ugly and may have to be redone if multiplayer support gets added.
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void DrawMulti()
|
|
||||||
{
|
|
||||||
char stringBuf[30];
|
|
||||||
if (nNetPlayerCount)
|
|
||||||
{
|
|
||||||
BeginHUD(320, 200, 1);
|
|
||||||
|
|
||||||
int shade;
|
|
||||||
|
|
||||||
if ((PlayClock / 120) & 1) {
|
|
||||||
shade = -100;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
shade = 127;
|
|
||||||
}
|
|
||||||
|
|
||||||
int nTile = kTile3593;
|
|
||||||
|
|
||||||
int xx = 320 / (nTotalPlayers + 1);
|
|
||||||
int x = xx - 160;
|
|
||||||
|
|
||||||
for (int i = 0; i < nTotalPlayers; i++)
|
|
||||||
{
|
|
||||||
DrawGraphic(tileGetTexture(nTile), x, 7, DI_ITEM_CENTER, 1, -1, -1, 1, 1);
|
|
||||||
|
|
||||||
if (i != nLocalPlayer) {
|
|
||||||
shade = -100;
|
|
||||||
}
|
|
||||||
|
|
||||||
sprintf(stringBuf, "%d", nPlayerScore[i]);
|
|
||||||
SBar_DrawString(this, textfont, stringBuf, x, 0, DI_ITEM_TOP|DI_TEXT_ALIGN_CENTER, i != nLocalPlayer ? CR_UNTRANSLATED : CR_GOLD, 1, -1, 0, 1, 1);
|
|
||||||
x += xx;
|
|
||||||
nTile++;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nNetTime >= 0)
|
|
||||||
{
|
|
||||||
int y = 0;
|
|
||||||
|
|
||||||
if (nNetTime)
|
|
||||||
{
|
|
||||||
int v12 = (nNetTime + 29) / 30 % 60;
|
|
||||||
int v13 = (nNetTime + 29) / 1800;
|
|
||||||
nNetTime += 29;
|
|
||||||
|
|
||||||
sprintf(stringBuf, "%d.%02d", v13, v12);
|
|
||||||
|
|
||||||
y += 20;
|
|
||||||
nNetTime -= 29;
|
|
||||||
SBar_DrawString(this, textfont, stringBuf, 0, 10, DI_ITEM_TOP | DI_TEXT_ALIGN_LEFT, CR_UNTRANSLATED, 1, -1, 0, 1, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//==========================================================================
|
|
||||||
//
|
|
||||||
// Fullscreen HUD variant #1
|
|
||||||
//
|
|
||||||
//==========================================================================
|
|
||||||
|
|
||||||
int ItemTimer(int num, int plr)
|
|
||||||
{
|
|
||||||
switch (num) {
|
|
||||||
case 1: //Scarab item
|
|
||||||
return (PlayerList[plr].invincibility * 100) / 900;
|
|
||||||
case 3: //Hand item
|
|
||||||
return (PlayerList[plr].nDouble * 100) / 1350;
|
|
||||||
case 5: //Mask
|
|
||||||
return (PlayerList[plr].nMaskAmount * 100) / 1350;
|
|
||||||
case 4: //Invisible
|
|
||||||
return (PlayerList[plr].nInvisible * 100) / 900;
|
|
||||||
case 2: //Torch
|
|
||||||
return (PlayerList[plr].nTorch * 100) / 900;
|
|
||||||
}
|
|
||||||
|
|
||||||
return -1;
|
|
||||||
}
|
|
||||||
|
|
||||||
void DrawHUD2()
|
|
||||||
{
|
|
||||||
BeginHUD(320, 200, 1);
|
|
||||||
|
|
||||||
auto pp = &PlayerList[nLocalPlayer];
|
|
||||||
|
|
||||||
FString format;
|
|
||||||
FGameTexture* img;
|
|
||||||
double imgScale;
|
|
||||||
double baseScale = numberFont->mFont->GetHeight() * 0.75;
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// Health
|
|
||||||
//
|
|
||||||
img = GetStatusSequencePic(nStatusSeqOffset + 125, 0);
|
|
||||||
imgScale = baseScale / img->GetDisplayHeight();
|
|
||||||
DrawGraphic(img, 1.5, -1, DI_ITEM_LEFT_BOTTOM, 1., -1, -1, imgScale, imgScale);
|
|
||||||
|
|
||||||
if (!althud_flashing || pp->nHealth > 150 || (PlayClock & 32))
|
|
||||||
{
|
|
||||||
int s = -8;
|
|
||||||
if (althud_flashing && pp->nHealth > 800)
|
|
||||||
s += bsin(PlayClock << 5, -10);
|
|
||||||
int intens = clamp(255 - 4 * s, 0, 255);
|
|
||||||
auto pe = PalEntry(255, intens, intens, intens);
|
|
||||||
format.Format("%d", pp->nHealth >> 3);
|
|
||||||
SBar_DrawString(this, numberFont, format, 13, -numberFont->mFont->GetHeight()+3, DI_TEXT_ALIGN_LEFT, CR_UNTRANSLATED, 1, 0, 0, 1, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Air
|
|
||||||
//
|
|
||||||
if (SectFlag[nPlayerViewSect[nLocalPlayer]] & kSectUnderwater)
|
|
||||||
{
|
|
||||||
img = GetStatusSequencePic(nStatusSeqOffset + 133, airframe);
|
|
||||||
imgScale = baseScale / img->GetDisplayHeight();
|
|
||||||
DrawGraphic(img, -4, -22, DI_ITEM_RIGHT_BOTTOM, 1., -1, -1, imgScale, imgScale);
|
|
||||||
}
|
|
||||||
|
|
||||||
//
|
|
||||||
// Magic
|
|
||||||
//
|
|
||||||
if (nItemSeq >= 0)
|
|
||||||
{
|
|
||||||
int tile = GetStatusSequenceTile(nItemSeq + nStatusSeqOffset, nItemFrame);
|
|
||||||
int tile2 = tile;
|
|
||||||
if (tile2 > 744 && tile2 < 751) tile2 = 744;
|
|
||||||
|
|
||||||
imgScale = baseScale / tileHeight(tile2);
|
|
||||||
DrawGraphic(tileGetTexture(tile), 70, -1, DI_ITEM_CENTER_BOTTOM, 1., -1, -1, imgScale, imgScale);
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
format.Format("%d", pp->nMagic / 10);
|
|
||||||
|
|
||||||
short nItem = PlayerList[nLocalPlayer].nItem;
|
|
||||||
int timer = ItemTimer(nItem, nLocalPlayer);
|
|
||||||
if (timer > 0)
|
|
||||||
{
|
|
||||||
format.AppendFormat("/%d", timer);
|
|
||||||
}
|
|
||||||
SBar_DrawString(this, numberFont, format, 79.5, -numberFont->mFont->GetHeight() + 3, DI_TEXT_ALIGN_LEFT, CR_UNTRANSLATED, 1, 0, 0, 1, 1);
|
|
||||||
}
|
|
||||||
//
|
|
||||||
// Weapon
|
|
||||||
//
|
|
||||||
const short ammo_sprites[] = { -1, -1 };
|
|
||||||
|
|
||||||
int weapon = pp->nCurrentWeapon;
|
|
||||||
int wicon = 0;// ammo_sprites[weapon];
|
|
||||||
int ammo = nCounterDest;// pp->WpnAmmo[weapon];
|
|
||||||
if (ammo > 0) // wicon > 0
|
|
||||||
{
|
|
||||||
format.Format("%d", ammo);
|
|
||||||
img = tileGetTexture(wicon);
|
|
||||||
imgScale = baseScale / img->GetDisplayHeight();
|
|
||||||
auto imgX = 21.125;
|
|
||||||
auto strlen = format.Len();
|
|
||||||
|
|
||||||
if (strlen > 1)
|
|
||||||
{
|
|
||||||
imgX += (imgX * 0.855) * (strlen - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
if ((!althud_flashing || PlayClock & 32 || ammo > 10))// (DamageData[weapon].max_ammo / 10)))
|
|
||||||
{
|
|
||||||
SBar_DrawString(this, numberFont, format, -3, -numberFont->mFont->GetHeight()+3, DI_TEXT_ALIGN_RIGHT, CR_UNTRANSLATED, 1, 0, 0, 1, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
//DrawGraphic(img, -imgX, -1, DI_ITEM_RIGHT_BOTTOM, 1, -1, -1, imgScale, imgScale);
|
|
||||||
}
|
|
||||||
|
|
||||||
#if 0
|
|
||||||
//
|
|
||||||
// Selected inventory item
|
|
||||||
//
|
|
||||||
img = tileGetTexture(icons[pp->InventoryNum]);
|
|
||||||
imgScale = baseScale / img->GetDisplayHeight();
|
|
||||||
int x = 165;
|
|
||||||
DrawGraphic(img, x, -1, DI_ITEM_LEFT_BOTTOM, 1, -1, -1, imgScale, imgScale);
|
|
||||||
|
|
||||||
PlayerUpdateInventoryState(pp, x + 3.0, -18.0, 1, 1);
|
|
||||||
PlayerUpdateInventoryPercent(pp, x + 3.5, -20.5, 1, 1);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
|
|
||||||
//
|
|
||||||
// keys
|
|
||||||
//
|
|
||||||
|
|
||||||
uint16_t nKeys = PlayerList[nLocalPlayer].keys;
|
|
||||||
|
|
||||||
int val = 675;
|
|
||||||
int x = -134;
|
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
if (nKeys & 0x1000)
|
|
||||||
{
|
|
||||||
auto tex = tileGetTexture(val);
|
|
||||||
if (tex && tex->isValid())
|
|
||||||
{
|
|
||||||
DrawGraphic(tex, x, -2, DI_ITEM_LEFT_BOTTOM, 1, -1, -1, 1, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nKeys >>= 1;
|
|
||||||
val += 4;
|
|
||||||
x += 20;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
// draw the full status bar
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void DrawStatus()
|
|
||||||
{
|
|
||||||
if (hud_size <= Hud_StbarOverlay)
|
|
||||||
{
|
|
||||||
// draw the main bar itself
|
|
||||||
BeginStatusBar(320, 200, 40);
|
|
||||||
if (hud_size == Hud_StbarOverlay) Set43ClipRect();
|
|
||||||
DrawGraphic(tileGetTexture(kTileStatusBar), 160, 200, DI_ITEM_CENTER_BOTTOM, 1, -1, -1, 1, 1);
|
|
||||||
twod->ClearClipRect();
|
|
||||||
}
|
|
||||||
else if (hud_size == Hud_Mini)
|
|
||||||
{
|
|
||||||
auto lh = TexMan.GetGameTextureByName("hud_l");
|
|
||||||
auto rh = TexMan.GetGameTextureByName("hud_r");
|
|
||||||
BeginHUD(320, 200, 1);
|
|
||||||
if (lh) DrawGraphic(lh, 0, 0, DI_ITEM_LEFT_BOTTOM | DI_SCREEN_LEFT_BOTTOM, 1, -1, -1, 1, 1);
|
|
||||||
if (rh) DrawGraphic(rh, 0, 0, DI_ITEM_RIGHT_BOTTOM | DI_SCREEN_RIGHT_BOTTOM, 1, -1, -1, 1, 1);
|
|
||||||
}
|
|
||||||
else if (hud_size == Hud_full)
|
|
||||||
{
|
|
||||||
DrawHUD2();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
if (PlayerList[nLocalPlayer].keys & (4096 << i))
|
|
||||||
{
|
|
||||||
DrawStatusSequence(nStatusSeqOffset + KeySeq + 2 * i, keyanims[i], 0.5, 0.5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (/*!bFullScreen &&*/ nNetTime)
|
|
||||||
{
|
|
||||||
DrawStatusSequence(nStatusSeqOffset + 127, 0, 0);
|
|
||||||
DrawStatusSequence(nStatusSeqOffset + 129, nMagicFrame, nMagicLevel);
|
|
||||||
DrawStatusSequence(nStatusSeqOffset + 131, 0, 0); // magic pool frame (bottom)
|
|
||||||
|
|
||||||
DrawStatusSequence(nStatusSeqOffset + 128, 0, 0);
|
|
||||||
DrawStatusSequence(nStatusSeqOffset + 1, nHealthFrame, nHealthLevel);
|
|
||||||
DrawStatusSequence(nStatusSeqOffset + 125, 0, 0); // draw ankh on health pool
|
|
||||||
DrawStatusSequence(nStatusSeqOffset + 130, 0, 0); // draw health pool frame (top)
|
|
||||||
|
|
||||||
if (nItemSeq >= 0) {
|
|
||||||
DrawStatusSequence(nItemSeq + nStatusSeqOffset, nItemFrame, 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
// draw the blue air level meter when underwater
|
|
||||||
if (SectFlag[nPlayerViewSect[nLocalPlayer]] & kSectUnderwater)
|
|
||||||
{
|
|
||||||
DrawStatusSequence(nStatusSeqOffset + 133, airframe, 0, 0.5);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
DrawStatusSequence(nStatusSeqOffset + 132, lungframe, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nSelectedItem >= 0)
|
|
||||||
{
|
|
||||||
int count = PlayerList[nLocalPlayer].items[nSelectedItem];
|
|
||||||
DrawStatusSequence(nStatusSeqOffset + 156 + 2* count, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
short nLives = PlayerList[nLocalPlayer].nLives;
|
|
||||||
DrawStatusSequence(nStatusSeqOffset + 145 + (2 * nLives), 0, 0);
|
|
||||||
|
|
||||||
if (nHurt > 0) DrawStatusSequence(nStatusSeqOffset + 4, nHurt - 1, 0);
|
|
||||||
|
|
||||||
// draw compass
|
|
||||||
if (hud_size <= Hud_StbarOverlay) DrawStatusSequence(nStatusSeqOffset + 35, ((inita + 128) & kAngleMask) >> 8, 0, 0.5);
|
|
||||||
|
|
||||||
//if (hud_size < Hud_full)
|
|
||||||
{
|
|
||||||
// draw ammo count
|
|
||||||
DrawStatusSequence(nStatusSeqOffset + 44, nDigit[2], 0, 0.5);
|
|
||||||
DrawStatusSequence(nStatusSeqOffset + 45, nDigit[1], 0, 0.5);
|
|
||||||
DrawStatusSequence(nStatusSeqOffset + 46, nDigit[0], 0, 0.5);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
DrawMulti();
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void PrintLevelStats(int bottomy)
|
|
||||||
{
|
|
||||||
FLevelStats stats{};
|
|
||||||
stats.fontscale = 1.;
|
|
||||||
stats.spacing = SmallFont->GetHeight();
|
|
||||||
stats.screenbottomspace = bottomy;
|
|
||||||
stats.font = SmallFont;
|
|
||||||
stats.letterColor = CR_RED;
|
|
||||||
stats.standardColor = CR_UNTRANSLATED;
|
|
||||||
stats.time = Scale(PlayClock, 1000, 120);
|
|
||||||
|
|
||||||
if (automapMode == am_full)
|
|
||||||
{
|
|
||||||
DBaseStatusBar::PrintAutomapInfo(stats, true);
|
|
||||||
}
|
|
||||||
else if (hud_stats)
|
|
||||||
{
|
|
||||||
|
|
||||||
stats.completeColor = CR_DARKGREEN;
|
|
||||||
stats.kills = nCreaturesKilled;
|
|
||||||
stats.maxkills = nCreaturesTotal;
|
|
||||||
stats.frags = -1;
|
|
||||||
stats.secrets = 0;
|
|
||||||
stats.maxsecrets = 0;
|
|
||||||
|
|
||||||
DBaseStatusBar::PrintLevelStats(stats);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void SetItemSeq()
|
|
||||||
{
|
|
||||||
static const int nItemSeqOffset[] = { 91, 72, 76, 79, 68, 87, 83 };
|
|
||||||
|
|
||||||
short nItem = PlayerList[nLocalPlayer].nItem;
|
|
||||||
if (nItem < 0)
|
|
||||||
{
|
|
||||||
nItemSeq = -1;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nItemMagic[nItem] <= PlayerList[nLocalPlayer].nMagic) nItemAltSeq = 0;
|
|
||||||
else nItemAltSeq = 2;
|
|
||||||
|
|
||||||
nItemFrame = 0;
|
|
||||||
nItemSeq = nItemSeqOffset[nItem] + nItemAltSeq;
|
|
||||||
nItemFrames = SeqSize[nItemSeq + nStatusSeqOffset];
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void SetMagicFrame()
|
|
||||||
{
|
|
||||||
int magicperline = 1000 / nMeterRange;
|
|
||||||
|
|
||||||
int newMagicLevel = (1000 - PlayerList[nLocalPlayer].nMagic) / magicperline;
|
|
||||||
newMagicLevel = clamp(newMagicLevel, 0, nMeterRange - 1);
|
|
||||||
if (newMagicLevel != nMagicLevel) SetItemSeq();
|
|
||||||
nMagicLevel = newMagicLevel;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void SetHealthFrame()
|
|
||||||
{
|
|
||||||
if (nHurt)
|
|
||||||
{
|
|
||||||
nHurt++;
|
|
||||||
if (nHurt > SeqSize[nStatusSeqOffset + 4]) nHurt = 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
int healthperline = 800 / nMeterRange;
|
|
||||||
|
|
||||||
int newHealthLevel = (800 - PlayerList[nLocalPlayer].nHealth) / healthperline;
|
|
||||||
newHealthLevel = clamp(newHealthLevel, 0, nMeterRange - 1);
|
|
||||||
if (newHealthLevel > nHealthLevel) nHurt = 1;
|
|
||||||
nHealthLevel = newHealthLevel;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void SetCounter(int nVal)
|
|
||||||
{
|
|
||||||
if (nVal <= 999)
|
|
||||||
{
|
|
||||||
if (nVal < 0) {
|
|
||||||
nVal = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
nVal = 999;
|
|
||||||
}
|
|
||||||
|
|
||||||
nCounterDest = nVal;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void SetCounterImmediate(int nVal)
|
|
||||||
{
|
|
||||||
SetCounter(nVal);
|
|
||||||
nCounter = nCounterDest;
|
|
||||||
|
|
||||||
SetCounterDigits();
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void SetCounterDigits()
|
|
||||||
{
|
|
||||||
nDigit[2] = 3 * (nCounter / 100 % 10);
|
|
||||||
nDigit[1] = 3 * (nCounter / 10 % 10);
|
|
||||||
nDigit[0] = 3 * (nCounter % 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void UpdateCounter()
|
|
||||||
{
|
|
||||||
int nWeapon = PlayerList[nLocalPlayer].nCurrentWeapon;
|
|
||||||
|
|
||||||
if (nWeapon < 0)
|
|
||||||
{
|
|
||||||
SetCounterImmediate(0);
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int thiscount;
|
|
||||||
|
|
||||||
if (nWeapon >= kWeaponSword && nWeapon <= kWeaponRing)
|
|
||||||
thiscount = PlayerList[nLocalPlayer].nAmmo[nWeapon];
|
|
||||||
else
|
|
||||||
thiscount = 0;
|
|
||||||
|
|
||||||
if (nWeapon != nLastWeapon) SetCounterImmediate(thiscount);
|
|
||||||
else SetCounter(thiscount);
|
|
||||||
}
|
|
||||||
nLastWeapon = nWeapon;
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void MoveStatus()
|
|
||||||
{
|
|
||||||
if (nItemSeq >= 0)
|
|
||||||
{
|
|
||||||
nItemFrame++;
|
|
||||||
|
|
||||||
if (nItemFrame >= nItemFrames)
|
|
||||||
{
|
|
||||||
if (nItemSeq == 67) {
|
|
||||||
SetItemSeq();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
nItemSeq -= nItemAltSeq;
|
|
||||||
|
|
||||||
if (nItemAltSeq || totalmoves & 0x1F)
|
|
||||||
{
|
|
||||||
if (nItemSeq < 2) {
|
|
||||||
nItemAltSeq = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
nItemAltSeq = 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
nItemFrame = 0;
|
|
||||||
nItemSeq += nItemAltSeq;
|
|
||||||
nItemFrames = SeqSize[nStatusSeqOffset + nItemSeq];
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
nHealthFrame++;
|
|
||||||
if (nHealthFrame >= SeqSize[nStatusSeqOffset + 1]) nHealthFrame = 0;
|
|
||||||
|
|
||||||
nMagicFrame++;
|
|
||||||
if (nMagicFrame >= SeqSize[nStatusSeqOffset + 129]) nMagicFrame = 0;
|
|
||||||
|
|
||||||
if (nCounter == nCounterDest)
|
|
||||||
{
|
|
||||||
nCounter = nCounterDest;
|
|
||||||
ammodelay = 3;
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
ammodelay--;
|
|
||||||
if (ammodelay > 0) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
int eax = nCounterDest - nCounter;
|
|
||||||
|
|
||||||
if (eax <= 0)
|
|
||||||
{
|
|
||||||
if (eax >= -30)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < 3; i++)
|
|
||||||
{
|
|
||||||
nDigit[i]--;
|
|
||||||
|
|
||||||
if (nDigit[i] < 0)
|
|
||||||
{
|
|
||||||
nDigit[i] += 30;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nDigit[i] < 27) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
nCounter += (nCounterDest - nCounter) >> 1;
|
|
||||||
SetCounterDigits();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
if (eax <= 30)
|
|
||||||
{
|
|
||||||
for (int i = 0; i < 3; i++)
|
|
||||||
{
|
|
||||||
nDigit[i]++;
|
|
||||||
|
|
||||||
if (nDigit[i] <= 27) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nDigit[i] >= 30) {
|
|
||||||
nDigit[i] -= 30;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
nCounter += (nCounterDest - nCounter) >> 1;
|
|
||||||
SetCounterDigits();
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!(nDigit[0] % 3)) {
|
|
||||||
nCounter = nDigit[0] / 3 + 100 * (nDigit[2] / 3) + 10 * (nDigit[1] / 3);
|
|
||||||
}
|
|
||||||
|
|
||||||
eax = nCounterDest - nCounter;
|
|
||||||
if (eax < 0) {
|
|
||||||
eax = -eax;
|
|
||||||
}
|
|
||||||
|
|
||||||
ammodelay = 4 - (eax >> 1);
|
|
||||||
if (ammodelay < 1) {
|
|
||||||
ammodelay = 1;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void SetPlayerItem()
|
|
||||||
{
|
|
||||||
if (nSelectedItem != PlayerList[nLocalPlayer].nItem)
|
|
||||||
{
|
|
||||||
nSelectedItem = PlayerList[nLocalPlayer].nItem;
|
|
||||||
SetItemSeq();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//
|
|
||||||
//---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
void Tick() override
|
|
||||||
{
|
|
||||||
SetMagicFrame();
|
|
||||||
SetHealthFrame();
|
|
||||||
SetPlayerItem();
|
|
||||||
UpdateCounter();
|
|
||||||
MoveStatus();
|
|
||||||
for (int i = 0; i < 4; i++)
|
|
||||||
{
|
|
||||||
int seq = nStatusSeqOffset + KeySeq + 2 * i;
|
|
||||||
if (PlayerList[nLocalPlayer].keys & (4096 << i))
|
|
||||||
{
|
|
||||||
if (keyanims[i] < SeqSize[seq] - 1)
|
|
||||||
{
|
|
||||||
seq_MoveSequence(-1, seq, 0); // this plays the pickup sound.
|
|
||||||
keyanims[i]++;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
keyanims[i] = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (SectFlag[nPlayerViewSect[nLocalPlayer]] & kSectUnderwater)
|
|
||||||
{
|
|
||||||
|
|
||||||
int nAirFrames = SeqSize[nStatusSeqOffset + 133];
|
|
||||||
int airperline = 100 / nAirFrames;
|
|
||||||
|
|
||||||
airframe = PlayerList[nLocalPlayer].nAir / airperline;
|
|
||||||
|
|
||||||
if (airframe >= nAirFrames)
|
|
||||||
{
|
|
||||||
airframe = nAirFrames - 1;
|
|
||||||
}
|
|
||||||
else if (airframe < 0)
|
|
||||||
{
|
|
||||||
airframe = 0;
|
|
||||||
}
|
|
||||||
lungframe = 0;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
int size = SeqSize[nStatusSeqOffset + 132];
|
|
||||||
if (++lungframe == size) lungframe = 0;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
void UpdateStatusBar()
|
|
||||||
{
|
|
||||||
Tick(); // temporary.
|
|
||||||
|
|
||||||
if (hud_size <= Hud_full)
|
|
||||||
{
|
|
||||||
DrawStatus();
|
|
||||||
}
|
|
||||||
PrintLevelStats(hud_size == Hud_Nothing ? 0 : hud_size == Hud_full? 22 : 40);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
IMPLEMENT_CLASS(DNativeExhumedStatusBar, false, true)
|
|
||||||
IMPLEMENT_POINTERS_START(DNativeExhumedStatusBar)
|
|
||||||
IMPLEMENT_POINTER(textfont)
|
|
||||||
IMPLEMENT_POINTER(numberFont)
|
|
||||||
IMPLEMENT_POINTERS_END
|
|
||||||
|
|
||||||
void UpdateFrame()
|
void UpdateFrame()
|
||||||
{
|
{
|
||||||
auto tex = tileGetTexture(nBackgroundPic);
|
auto tex = tileGetTexture(nBackgroundPic);
|
||||||
|
@ -990,7 +142,6 @@ void StatusMessage(int messageTime, const char* fmt, ...)
|
||||||
va_end(ap);
|
va_end(ap);
|
||||||
}
|
}
|
||||||
|
|
||||||
CVAR(Bool, sb_native, false, 0)
|
|
||||||
void DrawStatusBar()
|
void DrawStatusBar()
|
||||||
{
|
{
|
||||||
if (nFreeze == 2) return; // Hide when Ramses is talking.
|
if (nFreeze == 2) return; // Hide when Ramses is talking.
|
||||||
|
@ -1003,8 +154,7 @@ void DrawStatusBar()
|
||||||
info.maxkills = nCreaturesTotal;
|
info.maxkills = nCreaturesTotal;
|
||||||
// got no secrets in the game
|
// got no secrets in the game
|
||||||
info.time = Scale(PlayClock, 1000, 120);
|
info.time = Scale(PlayClock, 1000, 120);
|
||||||
if (!sb_native) UpdateStatusBar(&info);
|
UpdateStatusBar(&info);
|
||||||
else StatusBar2->UpdateStatusBar();
|
|
||||||
|
|
||||||
if (nSnakeCam >= 0)
|
if (nSnakeCam >= 0)
|
||||||
{
|
{
|
||||||
|
|
|
@ -256,8 +256,5 @@ class DukeStatusBar : DukeCommonStatusBar native
|
||||||
class RedneckStatusBar : DukeCommonStatusBar native
|
class RedneckStatusBar : DukeCommonStatusBar native
|
||||||
{}
|
{}
|
||||||
|
|
||||||
class NativeExhumedStatusBar : BaseStatusBar native
|
|
||||||
{}
|
|
||||||
|
|
||||||
class SWStatusBar : BaseStatusBar native
|
class SWStatusBar : BaseStatusBar native
|
||||||
{}
|
{}
|
||||||
|
|
Loading…
Reference in a new issue