mirror of
https://github.com/ZDoom/raze-gles.git
synced 2024-12-28 20:40:47 +00:00
- migrated all of SW's text display to the backend and removed the various redundant printing functions.
This commit is contained in:
parent
f0150569a4
commit
910ca69484
19 changed files with 206 additions and 1043 deletions
|
@ -133,7 +133,6 @@ enum ENativeFontValues
|
|||
{
|
||||
NIT_BigFont,
|
||||
NIT_SmallFont,
|
||||
NIT_TinyFont,
|
||||
|
||||
NIT_ActiveColor = -1,
|
||||
NIT_InactiveColor = -2,
|
||||
|
|
|
@ -23,7 +23,6 @@ set( PCH_SOURCES
|
|||
src/interpsh.cpp
|
||||
src/interpso.cpp
|
||||
src/inv.cpp
|
||||
src/jplayer.cpp
|
||||
src/jsector.cpp
|
||||
src/jweapon.cpp
|
||||
src/lava.cpp
|
||||
|
|
|
@ -480,7 +480,7 @@ class DSWMultiSummaryScreen : public DScreenJob
|
|||
int y = STAT_START_Y;
|
||||
|
||||
// Hm.... how to translate this without messing up the formatting?
|
||||
DisplayMiniBarSmString(x, y, 0, " NAME 1 2 3 4 5 6 7 8 KILLS");
|
||||
MNU_DrawSmallString(x, y, " NAME 1 2 3 4 5 6 7 8 KILLS", 0, 0);
|
||||
int rows = OrigCommPlayers;
|
||||
int cols = OrigCommPlayers;
|
||||
|
||||
|
@ -493,10 +493,10 @@ class DSWMultiSummaryScreen : public DScreenJob
|
|||
auto pp = Player + i;
|
||||
|
||||
ds.Format("%d", i + 1);
|
||||
DisplayMiniBarSmString(x, y, 0, ds);
|
||||
MNU_DrawSmallString(x, y, ds, 0, 0);
|
||||
|
||||
ds.Format(" %-13s", pp->PlayerName);
|
||||
DisplayMiniBarSmString(x, y, User[pp->PlayerSprite]->spal, ds);
|
||||
MNU_DrawSmallString(x, y, ds, 0, User[pp->PlayerSprite]->spal);
|
||||
|
||||
x = STAT_TABLE_X;
|
||||
for (int j = 0; j < cols; j++)
|
||||
|
@ -527,7 +527,7 @@ class DSWMultiSummaryScreen : public DScreenJob
|
|||
}
|
||||
|
||||
ds.Format("%d", pp->KilledPlayer[j]);
|
||||
DisplayMiniBarSmString(x, y, pal, ds);
|
||||
MNU_DrawSmallString(x, y, ds, 0, pal);
|
||||
x += STAT_TABLE_XOFF;
|
||||
}
|
||||
|
||||
|
@ -541,13 +541,13 @@ class DSWMultiSummaryScreen : public DScreenJob
|
|||
y += STAT_OFF_Y;
|
||||
|
||||
ds.Format(" %s", GStrings("DEATHS"));
|
||||
DisplayMiniBarSmString(x, y, 0, ds);
|
||||
MNU_DrawSmallString(x, y, ds, 0, 0);
|
||||
x = STAT_TABLE_X;
|
||||
|
||||
for (int j = 0; j < cols; j++)
|
||||
{
|
||||
ds.Format("%d", death_total[j]);
|
||||
DisplayMiniBarSmString(x, y, 0, ds);
|
||||
MNU_DrawSmallString(x, y, ds, 0, 0);
|
||||
x += STAT_TABLE_XOFF;
|
||||
}
|
||||
|
||||
|
@ -563,7 +563,7 @@ class DSWMultiSummaryScreen : public DScreenJob
|
|||
auto pp = Player + i;
|
||||
|
||||
ds.Format("%d", kills[i]); //pp->Kills);
|
||||
DisplayMiniBarSmString(x, y, 0, ds);
|
||||
MNU_DrawSmallString(x, y, ds, 0, 0);
|
||||
|
||||
y += STAT_OFF_Y;
|
||||
}
|
||||
|
|
|
@ -122,21 +122,12 @@ void GameInterface::DrawNativeMenuText(int fontnum, int state, double xpos, doub
|
|||
switch (fontnum)
|
||||
{
|
||||
case NIT_BigFont:
|
||||
MNU_MeasureStringLarge(text, &w, &h);
|
||||
if (flags & LMF_Centered) xpos -= w/2;
|
||||
MNU_DrawStringLarge(short(xpos), short(ypos), text, state == NIT_InactiveState? 20 : 0);
|
||||
MNU_DrawStringLarge(short(xpos), short(ypos), text, state == NIT_InactiveState? 20 : 0, (flags & LMF_Centered)? 0 : -1);
|
||||
break;
|
||||
|
||||
case NIT_SmallFont:
|
||||
MNU_MeasureString(text, &w, &h);
|
||||
if (flags & LMF_Centered) xpos -= w/2;
|
||||
MNU_DrawString(short(xpos), short(ypos), text, state == NIT_InactiveState? 20 : 0, 16);
|
||||
break;
|
||||
|
||||
case NIT_TinyFont:
|
||||
MNU_MeasureSmallString(text, &w, &h);
|
||||
if (flags & LMF_Centered) xpos -= w/2;
|
||||
MNU_DrawSmallString(short(xpos), short(ypos), text, state == NIT_InactiveState? 20 : 0, 16);
|
||||
default:
|
||||
MNU_DrawString(short(xpos), short(ypos), text, state == NIT_InactiveState? 20 : 0, 16, (flags & LMF_Centered) ? 0 : -1);
|
||||
break;
|
||||
}
|
||||
if (state == NIT_SelectedState)
|
||||
|
@ -157,9 +148,8 @@ void GameInterface::DrawNativeMenuText(int fontnum, int state, double xpos, doub
|
|||
x -= ((tilesiz[pic_yinyang].x) / 2) - 3;
|
||||
y += 8;
|
||||
}
|
||||
|
||||
rotatesprite(x << 16, y << 16,
|
||||
scale, 0, pic_yinyang, 2, 0, MenuDrawFlags, 0, 0, xdim - 1, ydim - 1);
|
||||
DrawTexture(twod, tileGetTexture(pic_yinyang, true), x, y, DTA_FullscreenScale, FSMode_ScaleToFit43, DTA_VirtualWidth, 320, DTA_VirtualHeight, 200,
|
||||
DTA_CenterOffset, true, DTA_Color, 0xfff0f0f0, DTA_ScaleX, scale / 65536., DTA_ScaleY, scale / 65536., TAG_DONE);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -258,28 +248,7 @@ void GameInterface::DrawMenuCaption(const DVector2& origin, const char* text)
|
|||
// Draw the backdrop bar
|
||||
rotatesprite(10 << 16, (5-3) << 16, 65536, 0, 2427,
|
||||
2, 0, MenuDrawFlags|RS_TOPLEFT, 0, 0, xdim - 1, ydim - 1);
|
||||
MNU_MeasureStringLarge(text, &w, &h);
|
||||
MNU_DrawStringLarge(TEXT_XCENTER(w), 5, text, 1);
|
||||
}
|
||||
|
||||
void GameInterface::DrawCenteredTextScreen(const DVector2& origin, const char* text, int position, bool bg)
|
||||
{
|
||||
if (text)
|
||||
{
|
||||
short width, height = 0;
|
||||
MNU_MeasureString("T", &width, &height);
|
||||
|
||||
auto lines = FString(text).Split("\n");
|
||||
int y = 100 - (height * lines.Size() / 2);
|
||||
for (auto& l : lines)
|
||||
{
|
||||
short lheight = 0;
|
||||
MNU_MeasureString(l, &width, &lheight);
|
||||
int x = 160 - width / 2;
|
||||
MNU_DrawString(x, y, l, 0, 0);
|
||||
y += height;
|
||||
}
|
||||
}
|
||||
MNU_DrawStringLarge(160, 5, text, 1, 0);
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -1357,31 +1357,6 @@ FString GameInterface::GetCoordString()
|
|||
return out;
|
||||
}
|
||||
|
||||
SWBOOL DebugSecret = FALSE;
|
||||
void SecretInfo(PLAYERp pp)
|
||||
{
|
||||
if (!hud_stats) return;
|
||||
#define Y_STEP 7
|
||||
#define AVERAGEFRAMES 16
|
||||
int x = windowxy1.x+2;
|
||||
int y = windowxy1.y+2+8;
|
||||
extern short LevelSecrets,TotalKillable;
|
||||
|
||||
if (CommEnabled || numplayers > 1)
|
||||
return;
|
||||
|
||||
x = x / (xdim/320.0);
|
||||
y = y / (ydim/200.0);
|
||||
|
||||
if (hud_stats)
|
||||
{
|
||||
sprintf(ds, "Kills %d/%d", Player->Kills, TotalKillable);
|
||||
DisplayMiniBarSmString(x, y, PAL_XLAT_BROWN, ds);
|
||||
|
||||
sprintf(ds, "Secrets %d/%d", Player->SecretsFound, LevelSecrets);
|
||||
DisplayMiniBarSmString(x, y+10, PAL_XLAT_BROWN, ds);
|
||||
}
|
||||
}
|
||||
|
||||
void PrintSpriteInfo(PLAYERp pp)
|
||||
{
|
||||
|
@ -2139,17 +2114,13 @@ drawscreen(PLAYERp pp)
|
|||
DrawCrosshair(pp);
|
||||
|
||||
|
||||
operatefta(); // Draw all the user quotes in the quote array
|
||||
|
||||
operateconfta(); // Draw messages in the console
|
||||
|
||||
DoPlayerDiveMeter(pp); // Do the underwater breathing bar
|
||||
|
||||
// Boss Health Meter, if Boss present
|
||||
BossHealthMeter();
|
||||
|
||||
if (!M_Active())
|
||||
SecretInfo(pp);
|
||||
//if (!M_Active())
|
||||
|
||||
videoNextPage();
|
||||
|
||||
|
@ -2167,14 +2138,7 @@ drawscreen(PLAYERp pp)
|
|||
|
||||
if (paused && !M_Active())
|
||||
{
|
||||
short w,h;
|
||||
#define MSG_GAME_PAUSED "Game Paused"
|
||||
MNU_MeasureString(MSG_GAME_PAUSED, &w, &h);
|
||||
PutStringTimer(pp, TEXT_TEST_COL(w), 100, MSG_GAME_PAUSED, 999);
|
||||
}
|
||||
else
|
||||
{
|
||||
pClearTextLine(pp, 100);
|
||||
MNU_DrawString(160, 100, "Game Paused", 0, 0, 0);
|
||||
}
|
||||
|
||||
if (!CommEnabled && TEST(pp->Flags, PF_DEAD))
|
||||
|
|
|
@ -348,18 +348,6 @@ bool LoadLevel(const char *filename)
|
|||
return true;
|
||||
}
|
||||
|
||||
void DisplayDemoText(void)
|
||||
{
|
||||
short w,h;
|
||||
short i;
|
||||
|
||||
for (i = 0; i < 3; i++)
|
||||
{
|
||||
MNU_MeasureString(DemoText[i], &w, &h);
|
||||
PutStringTimer(Player, TEXT_TEST_COL(w), DemoTextYstart+(i*12), DemoText[i], 999);
|
||||
}
|
||||
}
|
||||
|
||||
void MultiSharewareCheck(void)
|
||||
{
|
||||
if (!SW_SHAREWARE) return;
|
||||
|
@ -467,6 +455,7 @@ bool InitGame()
|
|||
}
|
||||
|
||||
TileFiles.LoadArtSet("tiles%03d.art");
|
||||
InitFonts();
|
||||
|
||||
Connect();
|
||||
SortBreakInfo();
|
||||
|
@ -758,11 +747,6 @@ InitLevel(void)
|
|||
initlava();
|
||||
|
||||
SongLevelNum = Level;
|
||||
|
||||
if (DemoMode)
|
||||
{
|
||||
DisplayDemoText();
|
||||
}
|
||||
|
||||
// reset NewGame
|
||||
NewGame = FALSE;
|
||||
|
@ -994,12 +978,10 @@ void MenuLevel(void)
|
|||
if (CommEnabled)
|
||||
{
|
||||
sprintf(ds,"Lo Wang is waiting for other players...");
|
||||
MNU_MeasureString(ds, &w, &h);
|
||||
MNU_DrawString(TEXT_TEST_COL(w), 170, ds, 1, 16);
|
||||
MNU_DrawString(160, 170, ds, 1, 16, 0);
|
||||
|
||||
sprintf(ds,"They are afraid!");
|
||||
MNU_MeasureString(ds, &w, &h);
|
||||
MNU_DrawString(TEXT_TEST_COL(w), 180, ds, 1, 16);
|
||||
MNU_DrawString(160, 180, ds, 1, 16, 0);
|
||||
}
|
||||
|
||||
videoNextPage();
|
||||
|
@ -1701,7 +1683,7 @@ FunctionKeys(PLAYERp pp)
|
|||
short pnum;
|
||||
|
||||
sprintf(ds,"SENT: %s",**CombatMacros[fn_key-1]);
|
||||
adduserquote(ds);
|
||||
Printf(PRINT_NOTIFY | PRINT_TEAMCHAT, "%s\n", ds);
|
||||
|
||||
TRAVERSE_CONNECT(pnum)
|
||||
{
|
||||
|
@ -2250,12 +2232,12 @@ void drawoverheadmap(int cposx, int cposy, int czoom, short cang)
|
|||
|
||||
if (ScrollMode2D)
|
||||
{
|
||||
minigametext(txt_x,txt_y-7,"Follow Mode",2+8);
|
||||
MNU_DrawSmallString(txt_x, txt_y - 7, "Follow Mode", 0, 0);
|
||||
}
|
||||
|
||||
sprintf(ds,"%s",currentLevel->DisplayName());
|
||||
|
||||
minigametext(txt_x,txt_y,ds,2+8);
|
||||
MNU_DrawSmallString(txt_x,txt_y,ds,0, 0);
|
||||
|
||||
//////////////////////////////////
|
||||
|
||||
|
|
|
@ -830,34 +830,8 @@ SWBOOL DLL_ExecFunc(int procHandle, char *fName);
|
|||
// JPlayer
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
#define MESSAGE_LINE 142 // Used to be 164
|
||||
#define MAXUSERQUOTES 6
|
||||
#define MAXCONQUOTES 13
|
||||
|
||||
extern int quotebot, quotebotgoal;
|
||||
extern short user_quote_time[MAXUSERQUOTES];
|
||||
extern char user_quote[MAXUSERQUOTES][256];
|
||||
|
||||
extern int conbot, conbotgoal;
|
||||
extern char con_quote[MAXCONQUOTES][256];
|
||||
|
||||
int minitext(int x,int y,char *t,char p,char sb);
|
||||
int minitextshade(int x,int y,char *t,char s,char p,char sb);
|
||||
void operatefta(void);
|
||||
void adduserquote(const char *daquote);
|
||||
void operateconfta(void);
|
||||
void addconquote(const char *daquote);
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
// Console
|
||||
//
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
void CON_StoreArg(const char *userarg);
|
||||
SWBOOL CON_CheckParm(const char *userarg);
|
||||
void CON_CommandHistory(signed char dir);
|
||||
SWBOOL CON_AddCommand(const char *command, void (*function)(void));
|
||||
void CON_ProcessUserCommand(void);
|
||||
|
||||
///////////////////////////////////////////////////////////////////////////////////////////
|
||||
//
|
||||
|
@ -2263,23 +2237,6 @@ extern USER puser[MAX_SW_PLAYERS_REG];
|
|||
#define TEXT_TEST_COL(width) TEXT_XCENTER(width)
|
||||
#define TEXT_TEST_TIME 2
|
||||
|
||||
void PutStringTimer(PLAYERp pp, short x, short y, const char *string, short seconds);
|
||||
|
||||
///////////////////////////
|
||||
//
|
||||
// OLDER network additions
|
||||
//
|
||||
///////////////////////////
|
||||
|
||||
/*
|
||||
int initmultiplayers(int, int, int);
|
||||
void uninitmultiplayers(void);
|
||||
|
||||
void sendlogon(void);
|
||||
void sendlogoff(void);
|
||||
*/
|
||||
|
||||
|
||||
///////////////////////////
|
||||
//
|
||||
// RECENT network additions
|
||||
|
@ -2356,7 +2313,6 @@ void post_analyzesprites(void); // draw.c
|
|||
int COVERsetgamemode(int mode, int xdim, int ydim, int bpp); // draw.c
|
||||
void ScreenCaptureKeys(void); // draw.c
|
||||
|
||||
int minigametext(int x,int y,const char *t,short dabits); // jplayer.c
|
||||
void computergetinput(int snum,SW_PACKET *syn); // jplayer.c
|
||||
|
||||
void DrawOverlapRoom(int tx,int ty,int tz,fix16_t tq16ang,fix16_t tq16horiz,short tsectnum); // rooms.c
|
||||
|
@ -2421,6 +2377,7 @@ extern short LastSaveNum;
|
|||
void LoadSaveMsg(const char *msg);
|
||||
|
||||
void UpdateStatusBar(ClockTicks arg);
|
||||
void InitFonts();
|
||||
|
||||
extern int PlayClock;
|
||||
extern short LevelSecrets;
|
||||
|
@ -2447,7 +2404,6 @@ struct GameInterface : ::GameInterface
|
|||
void StartGame(FNewGameStartup& gs) override;
|
||||
FSavegameInfo GetSaveSig() override;
|
||||
void DrawMenuCaption(const DVector2& origin, const char* text) override;
|
||||
void DrawCenteredTextScreen(const DVector2& origin, const char* text, int position, bool bg) override;
|
||||
bool CleanupForLoad() override;
|
||||
bool LoadGame(FSaveGameNode* sv) override;
|
||||
bool SaveGame(FSaveGameNode* sv) override;
|
||||
|
|
|
@ -1,299 +0,0 @@
|
|||
//-------------------------------------------------------------------------
|
||||
/*
|
||||
Copyright (C) 1997, 2005 - 3D Realms Entertainment
|
||||
|
||||
This file is part of Shadow Warrior version 1.2
|
||||
|
||||
Shadow Warrior is free software; you can redistribute it and/or
|
||||
modify it under the terms of the GNU General Public License
|
||||
as published by the Free Software Foundation; either version 2
|
||||
of the License, or (at your option) any later version.
|
||||
|
||||
This program is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
|
||||
|
||||
See the GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; if not, write to the Free Software
|
||||
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
||||
|
||||
Original Source: 1997 - Frank Maddin and Jim Norwood
|
||||
Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
|
||||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
|
||||
// JPLAYER.C
|
||||
// Copyright (c) 1996 by Jim Norwood
|
||||
#include "ns.h"
|
||||
|
||||
#include "build.h"
|
||||
|
||||
#include "mytypes.h"
|
||||
#include "names2.h"
|
||||
#include "panel.h"
|
||||
#include "game.h"
|
||||
#include "tags.h"
|
||||
#include "player.h"
|
||||
#include "lists.h"
|
||||
#include "quake.h"
|
||||
|
||||
#include "gamecontrol.h"
|
||||
|
||||
#include "menus.h"
|
||||
#include "network.h"
|
||||
#include "pal.h"
|
||||
|
||||
#include "bots.h"
|
||||
|
||||
BEGIN_SW_NS
|
||||
|
||||
SWBOOL WeaponOK(PLAYERp pp);
|
||||
|
||||
#define MAXANGVEL 80
|
||||
|
||||
// From build.h
|
||||
#define CLIPMASK0 (((1L)<<16)+1L)
|
||||
#define CLIPMASK1 (((256L)<<16)+64L)
|
||||
|
||||
|
||||
// PLAYER QUOTES TO OTHER PLAYERS ////////////////////////////////////////////////////////////
|
||||
|
||||
#define STARTALPHANUM 4608 // New SW font for typing in stuff, It's in ASCII order.
|
||||
#define ENDALPHANUM 4701
|
||||
#define MINIFONT 2930 // Start of small font, it's blue for good palette swapping
|
||||
|
||||
#define NUMPAGES 1
|
||||
#define NUMOFFIRSTTIMEACTIVE 100 // You can save up to 100 strings in the message history queue
|
||||
|
||||
char pus, pub; // Global text vars
|
||||
char fta_quotes[NUMOFFIRSTTIMEACTIVE][64];
|
||||
|
||||
|
||||
int gametext(int x,int y,char *t,char s,short dabits)
|
||||
{
|
||||
short ac,newx;
|
||||
char centre, *oldt;
|
||||
|
||||
centre = (x == (320>>1));
|
||||
newx = 0;
|
||||
oldt = t;
|
||||
|
||||
if (centre)
|
||||
{
|
||||
while (*t)
|
||||
{
|
||||
if (*t == 32) {newx+=5; t++; continue; }
|
||||
else ac = *t - '!' + STARTALPHANUM;
|
||||
|
||||
if (ac < STARTALPHANUM || ac > ENDALPHANUM) break;
|
||||
|
||||
if (*t >= '0' && *t <= '9')
|
||||
newx += 8;
|
||||
else newx += tilesiz[ac].x;
|
||||
t++;
|
||||
}
|
||||
|
||||
t = oldt;
|
||||
x = (320>>1)-(newx>>1);
|
||||
}
|
||||
|
||||
while (*t)
|
||||
{
|
||||
if (*t == 32) {x+=5; t++; continue; }
|
||||
else ac = *t - '!' + STARTALPHANUM;
|
||||
|
||||
if (ac < STARTALPHANUM || ac > ENDALPHANUM)
|
||||
break;
|
||||
|
||||
rotatesprite(x<<16,y<<16,65536L,0,ac,s,16,dabits,0,0,xdim-1,ydim-1);
|
||||
|
||||
if (*t >= '0' && *t <= '9')
|
||||
x += 8;
|
||||
else x += tilesiz[ac].x;
|
||||
|
||||
t++;
|
||||
}
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
int minigametext(int x,int y,const char *t,short dabits)
|
||||
{
|
||||
short ac,newx;
|
||||
char centre;
|
||||
const char *oldt;
|
||||
|
||||
centre = (x == (320>>1));
|
||||
newx = 0;
|
||||
oldt = t;
|
||||
|
||||
if (centre)
|
||||
{
|
||||
while (*t)
|
||||
{
|
||||
if (*t == 32) {newx+=4; t++; continue; }
|
||||
else ac = *t - '!' + 2930;
|
||||
|
||||
if (*t > asc_Space && *t < 127)
|
||||
{
|
||||
newx += tilesiz[ac].x;
|
||||
}
|
||||
else
|
||||
x += 4;
|
||||
|
||||
t++;
|
||||
}
|
||||
|
||||
t = oldt;
|
||||
x = (320>>1)-(newx>>1);
|
||||
}
|
||||
|
||||
while (*t)
|
||||
{
|
||||
if (*t == 32) {x+=4; t++; continue; }
|
||||
else ac = *t - '!' + 2930;
|
||||
|
||||
if (*t > asc_Space && *t < 127)
|
||||
{
|
||||
rotatesprite(x<<16,y<<16,65536L,0,ac,-128,17,dabits,0,0,xdim-1,ydim-1);
|
||||
x += tilesiz[ac].x;
|
||||
}
|
||||
else
|
||||
x += 4;
|
||||
|
||||
t++;
|
||||
}
|
||||
|
||||
return x;
|
||||
}
|
||||
|
||||
int minitext(int x,int y,char *t,char p,char sb)
|
||||
{
|
||||
short ac;
|
||||
|
||||
while (*t)
|
||||
{
|
||||
*t = toupper(*t);
|
||||
if (*t == 32) {x+=5; t++; continue; }
|
||||
else ac = *t - '!' + MINIFONT;
|
||||
|
||||
rotatesprite(x<<16,y<<16,65536L,0,ac,0,p,sb,0,0,xdim-1,ydim-1);
|
||||
x += 4; // tilesiz[ac].x+1;
|
||||
|
||||
t++;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
int minitextshade(int x,int y,char *t,char s,char p,char sb)
|
||||
{
|
||||
short ac;
|
||||
|
||||
while (*t)
|
||||
{
|
||||
*t = toupper(*t);
|
||||
if (*t == 32) {x+=5; t++; continue; }
|
||||
else ac = *t - '!' + MINIFONT;
|
||||
|
||||
rotatesprite(x<<16,y<<16,65536L,0,ac,s,p,sb,0,0,xdim-1,ydim-1);
|
||||
x += 4; // tilesiz[ac].x+1;
|
||||
|
||||
t++;
|
||||
}
|
||||
return x;
|
||||
}
|
||||
|
||||
int quotebot, quotebotgoal;
|
||||
short user_quote_time[MAXUSERQUOTES];
|
||||
char user_quote[MAXUSERQUOTES][256];
|
||||
|
||||
void adduserquote(const char *daquote)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=MAXUSERQUOTES-1; i>0; i--)
|
||||
{
|
||||
strcpy(user_quote[i],user_quote[i-1]);
|
||||
user_quote_time[i] = user_quote_time[i-1];
|
||||
}
|
||||
strcpy(user_quote[0],daquote);
|
||||
user_quote_time[0] = 180;
|
||||
}
|
||||
|
||||
void operatefta(void)
|
||||
{
|
||||
int i, j, k;
|
||||
|
||||
j=MESSAGE_LINE; // Base line position on screen
|
||||
quotebot = min(quotebot,j);
|
||||
quotebotgoal = min(quotebotgoal,j);
|
||||
quotebotgoal = j;
|
||||
j = quotebot;
|
||||
|
||||
for (i=0; i<MAXUSERQUOTES; i++)
|
||||
{
|
||||
k = user_quote_time[i];
|
||||
if (k <= 0)
|
||||
break;
|
||||
|
||||
if (gs.BorderNum <= BORDER_BAR+1)
|
||||
{
|
||||
// dont fade out
|
||||
if (k > 4)
|
||||
minigametext(320>>1,j,user_quote[i],2+8);
|
||||
else if (k > 2)
|
||||
minigametext(320>>1,j,user_quote[i],2+8+1);
|
||||
else
|
||||
minigametext(320>>1,j,user_quote[i],2+8+1+32);
|
||||
}
|
||||
else
|
||||
{
|
||||
// dont fade out
|
||||
minigametext(320>>1,j,user_quote[i],2+8);
|
||||
}
|
||||
|
||||
j -= 6;
|
||||
}
|
||||
}
|
||||
|
||||
//////////// Console Message Queue ////////////////////////////////////
|
||||
int conbot, conbotgoal;
|
||||
char con_quote[MAXCONQUOTES][256];
|
||||
|
||||
void addconquote(const char *daquote)
|
||||
{
|
||||
int i;
|
||||
|
||||
for (i=MAXCONQUOTES-1; i>0; i--)
|
||||
{
|
||||
strcpy(con_quote[i],con_quote[i-1]);
|
||||
}
|
||||
strcpy(con_quote[0],daquote);
|
||||
}
|
||||
|
||||
#define CON_ROT_FLAGS (RS_TOPLEFT|ROTATE_SPRITE_SCREEN_CLIP|ROTATE_SPRITE_NON_MASK)
|
||||
void operateconfta(void)
|
||||
{
|
||||
int i, j;
|
||||
|
||||
if (!ConPanel) return; // If panel isn't up, don't draw anything
|
||||
|
||||
// Draw the background console pic
|
||||
rotatesprite((0)<<16,(0)<<16,65536L,0,5119,0,0,CON_ROT_FLAGS,0,0,xdim-1,ydim-1);
|
||||
|
||||
j=99; // Base line position on screen
|
||||
conbot = min(conbot,j);
|
||||
conbotgoal = min(conbotgoal,j);
|
||||
if (ConInputMode) j -= 6; // Bump all lines up one to make room for new line
|
||||
conbotgoal = j; j = conbot;
|
||||
|
||||
for (i=0; i<MAXCONQUOTES; i++)
|
||||
{
|
||||
MNU_DrawSmallString(27, j, con_quote[i], 0, 17); // 17 = white
|
||||
j -= 6;
|
||||
}
|
||||
}
|
||||
|
||||
END_SW_NS
|
|
@ -318,30 +318,21 @@ SWBOOL MNU_ShareWareMessage()
|
|||
if (SW_SHAREWARE)
|
||||
{
|
||||
extra_text = "Be sure to call 800-3DREALMS today";
|
||||
MNU_MeasureString(extra_text, &w, &h);
|
||||
MNU_DrawString(TEXT_XCENTER(w), 110, extra_text, 1, 16);
|
||||
MNU_DrawString(160, 110, extra_text, 1, 16, 0);
|
||||
extra_text = "and order the game.";
|
||||
MNU_MeasureString(extra_text, &w, &h);
|
||||
MNU_DrawString(TEXT_XCENTER(w), 120, extra_text, 1, 16);
|
||||
MNU_DrawString(160, 120, extra_text, 1, 16, 0);
|
||||
extra_text = "You are only playing the first ";
|
||||
MNU_MeasureString(extra_text, &w, &h);
|
||||
MNU_DrawString(TEXT_XCENTER(w), 130, extra_text, 1, 16);
|
||||
MNU_DrawString(160, 130, extra_text, 1, 16, 0);
|
||||
extra_text = "four levels, and are missing most";
|
||||
MNU_MeasureString(extra_text, &w, &h);
|
||||
MNU_DrawString(TEXT_XCENTER(w), 140, extra_text, 1, 16);
|
||||
MNU_DrawString(160, 140, extra_text, 1, 16, 0);
|
||||
extra_text = "of the game, weapons and monsters.";
|
||||
MNU_MeasureString(extra_text, &w, &h);
|
||||
MNU_DrawString(TEXT_XCENTER(w), 150, extra_text, 1, 16);
|
||||
MNU_DrawString(160, 150, extra_text, 1, 16, 0);
|
||||
extra_text = "See the ordering information.";
|
||||
MNU_MeasureString(extra_text, &w, &h);
|
||||
MNU_DrawString(TEXT_XCENTER(w), 160, extra_text, 1, 16);
|
||||
MNU_DrawString(160, 160, extra_text, 1, 16, 0);
|
||||
//SET(item->flags, mf_disabled);
|
||||
}
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#if 0
|
||||
|
||||
#endif
|
||||
|
||||
END_SW_NS
|
||||
|
|
|
@ -32,12 +32,9 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
|
|||
|
||||
BEGIN_SW_NS
|
||||
|
||||
void MNU_MeasureString(const char* string, short* w, short* h);
|
||||
void MNU_DrawString(short x, short y, const char* string, short shade, short pal, int align = -1);
|
||||
void MNU_MeasureSmallString(const char* string, short* w, short* h);
|
||||
void MNU_DrawSmallString(short x, short y, const char* string, short shade, short pal);
|
||||
void MNU_MeasureStringLarge(const char* string, short* w, short* h);
|
||||
void MNU_DrawStringLarge(short x, short y, const char* string, int shade = 0);
|
||||
void MNU_DrawString(int x, int y, const char* string, int shade, int pal, int align = -1);
|
||||
void MNU_DrawSmallString(int x, int y, const char* string, int shade, int pal, int align = -1, double alpha = 1);
|
||||
void MNU_DrawStringLarge(int x, int y, const char* string, int shade = 0, int align = -1);
|
||||
|
||||
#define pic_none 0
|
||||
#define pic_radiobuttn1 2816
|
||||
|
|
|
@ -51,16 +51,10 @@ void MoveSectorObjects(SECTOR_OBJECTp sop, short locktics);
|
|||
#define TEXT_INFO_TIME (3)
|
||||
#define TEXT_INFO_Y (40)
|
||||
#define TEXT_INFO_YOFF (10)
|
||||
inline int TEXT_INFO_LINE(int line) { return (TEXT_INFO_Y + ((line)*TEXT_INFO_YOFF)); }
|
||||
inline constexpr int TEXT_INFO_LINE(int line) { return (TEXT_INFO_Y + ((line)*TEXT_INFO_YOFF)); }
|
||||
|
||||
void DisplayMiniBarSmString(short xs, short ys, short pal, const char* buffer);
|
||||
void PutStringInfo(PLAYERp pp, const char* string);
|
||||
void PutStringInfoLine(PLAYERp pp, const char* string);
|
||||
void PutStringInfoLine2(PLAYERp pp, const char* string);
|
||||
void pClearTextLine(PLAYERp pp, int y);
|
||||
void pMenuClearTextLine(PLAYERp pp);
|
||||
|
||||
void StringTimer(PANEL_SPRITEp psp);
|
||||
|
||||
short DoSlidorMatch(PLAYERp pp, short match, SWBOOL);
|
||||
SWBOOL TestSlidorMatchActive(short match);
|
||||
|
|
|
@ -522,23 +522,6 @@ CheckVersion(int GameVersion)
|
|||
{
|
||||
Printf("CheckVersion(): player %d has version %d, expecting %d\n",
|
||||
pnum, Player[pnum].PlayerVersion, GameVersion);
|
||||
|
||||
adduserquote(VERSION_MSG);
|
||||
adduserquote(VERSION_MSG);
|
||||
adduserquote(VERSION_MSG);
|
||||
adduserquote(VERSION_MSG);
|
||||
adduserquote(VERSION_MSG);
|
||||
adduserquote(VERSION_MSG);
|
||||
|
||||
if (!Player[pnum].PlayerVersion)
|
||||
{
|
||||
SW_SendMessage(pnum, VERSION_MSG);
|
||||
SW_SendMessage(pnum, VERSION_MSG);
|
||||
SW_SendMessage(pnum, VERSION_MSG);
|
||||
SW_SendMessage(pnum, VERSION_MSG);
|
||||
SW_SendMessage(pnum, VERSION_MSG);
|
||||
SW_SendMessage(pnum, VERSION_MSG);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -651,7 +634,7 @@ SWBOOL MyCommPlayerQuit(void)
|
|||
if (i != myconnectindex)
|
||||
{
|
||||
sprintf(ds,"%s has quit the game.",Player[i].PlayerName);
|
||||
adduserquote(ds);
|
||||
Printf(PRINT_NOTIFY | PRINT_TEAMCHAT, "%s\n", ds);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1340,7 +1323,7 @@ getpackets(void)
|
|||
memcpy(ds,&packbuf[3],packbufleng-3);
|
||||
ds[packbufleng-3] = 0;
|
||||
//sprintf(ds, "%s",&packbuf[3]);
|
||||
adduserquote(ds);
|
||||
Printf(PRINT_NOTIFY | PRINT_TEAMCHAT, "%s\n", ds);
|
||||
break;
|
||||
}
|
||||
|
||||
|
|
|
@ -7396,7 +7396,6 @@ static saveable_code saveable_panel_code[] =
|
|||
SAVE_CODE(SwordBlur),
|
||||
SAVE_CODE(SpecialUziRetractFunc),
|
||||
SAVE_CODE(FistBlur),
|
||||
SAVE_CODE(StringTimer),
|
||||
};
|
||||
|
||||
static saveable_data saveable_panel_data[] =
|
||||
|
|
|
@ -6474,7 +6474,7 @@ DoPlayerDeathMessage(PLAYERp pp, PLAYERp killer)
|
|||
TRAVERSE_CONNECT(pnum)
|
||||
{
|
||||
if (pnum == myconnectindex)
|
||||
adduserquote(ds);
|
||||
Printf(PRINT_NOTIFY|PRINT_TEAMCHAT, "%s\n", ds);
|
||||
else
|
||||
SW_SendMessage(pnum, ds);
|
||||
}
|
||||
|
@ -6489,7 +6489,6 @@ DoPlayerBeginDie(PLAYERp pp)
|
|||
extern SWBOOL ReloadPrompt;
|
||||
short bak;
|
||||
int choosesnd = 0;
|
||||
extern short GlobInfoStringTime;
|
||||
|
||||
USERp u = User[pp->PlayerSprite];
|
||||
|
||||
|
@ -6533,10 +6532,7 @@ DoPlayerBeginDie(PLAYERp pp)
|
|||
else
|
||||
#endif
|
||||
{
|
||||
bak = GlobInfoStringTime;
|
||||
GlobInfoStringTime = 999;
|
||||
PutStringInfo(pp, GStrings("TXTS_PRESSSPACE"));
|
||||
GlobInfoStringTime = bak;
|
||||
}
|
||||
|
||||
if (pp->sop_control)
|
||||
|
@ -6873,8 +6869,6 @@ void DoPlayerDeathCheckKeys(PLAYERp pp)
|
|||
InitBloodSpray(pp->PlayerSprite,TRUE,-1);
|
||||
}
|
||||
|
||||
pClearTextLine(pp, TEXT_INFO_LINE(0));
|
||||
|
||||
PlayerSpawnPosition(pp);
|
||||
|
||||
NewStateGroup(pp->PlayerSprite, u->ActorActionSet->Stand);
|
||||
|
@ -7754,47 +7748,6 @@ void PlayerGlobal(PLAYERp pp)
|
|||
}
|
||||
|
||||
|
||||
void UpdateScrollingMessages(void)
|
||||
{
|
||||
short i;
|
||||
|
||||
// Update the scrolling multiplayer messages
|
||||
for (i=0; i<MAXUSERQUOTES; i++)
|
||||
{
|
||||
if (user_quote_time[i])
|
||||
{
|
||||
user_quote_time[i]--;
|
||||
|
||||
if (user_quote_time[i] <= 0)
|
||||
{
|
||||
user_quote_time[i] = 0;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (gs.BorderNum > BORDER_BAR+1)
|
||||
{
|
||||
quotebot = quotebotgoal;
|
||||
}
|
||||
else
|
||||
{
|
||||
if ((klabs(quotebotgoal-quotebot) <= 16))
|
||||
quotebot += ksgn(quotebotgoal-quotebot);
|
||||
else
|
||||
quotebot = quotebotgoal;
|
||||
}
|
||||
}
|
||||
|
||||
void UpdateConMessages(void)
|
||||
{
|
||||
if (!ConInputMode) return;
|
||||
|
||||
if ((klabs(conbotgoal-conbot) <= 12))
|
||||
conbot += ksgn(conbotgoal-conbot);
|
||||
else
|
||||
conbot = conbotgoal;
|
||||
}
|
||||
|
||||
void MultiPlayLimits(void)
|
||||
{
|
||||
short pnum;
|
||||
|
@ -7842,6 +7795,7 @@ void MultiPlayLimits(void)
|
|||
|
||||
void PauseMultiPlay(void)
|
||||
{
|
||||
#if 0
|
||||
static SWBOOL SavePrediction;
|
||||
PLAYERp pp;
|
||||
short pnum,p;
|
||||
|
@ -7861,13 +7815,6 @@ void PauseMultiPlay(void)
|
|||
|
||||
if (paused)
|
||||
{
|
||||
short w,h;
|
||||
auto m = GStrings("Game Paused");
|
||||
MNU_MeasureString(m, &w, &h);
|
||||
|
||||
TRAVERSE_CONNECT(p)
|
||||
PutStringTimer(Player + p, TEXT_TEST_COL(w), 100, m, 999);
|
||||
|
||||
SavePrediction = PredictionOn;
|
||||
PredictionOn = FALSE;
|
||||
}
|
||||
|
@ -7875,7 +7822,6 @@ void PauseMultiPlay(void)
|
|||
{
|
||||
PredictionOn = SavePrediction;
|
||||
TRAVERSE_CONNECT(p)
|
||||
pClearTextLine(Player + p, 100);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -7884,6 +7830,7 @@ void PauseMultiPlay(void)
|
|||
FLAG_KEY_RESET(pp, SK_PAUSE);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -7914,9 +7861,6 @@ domovethings(void)
|
|||
if (MyCommPlayerQuit())
|
||||
return;
|
||||
|
||||
UpdateScrollingMessages(); // Update the multiplayer type messages
|
||||
UpdateConMessages(); // Update the console messages
|
||||
|
||||
#if SYNC_TEST
|
||||
if (/* CTW REMOVED !gTenActivated ||*/ !(movefifoplc & 0x3f))
|
||||
getsyncstat();
|
||||
|
|
|
@ -79,7 +79,6 @@ void Saveable_Init(void)
|
|||
MODULE(zombie)
|
||||
|
||||
MODULE(sector)
|
||||
MODULE(text)
|
||||
}
|
||||
|
||||
int Saveable_FindCodeSym(void *ptr, savedcodesym *sym)
|
||||
|
|
|
@ -38,6 +38,9 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
|
|||
#include "v_2ddrawer.h"
|
||||
#include "statusbar.h"
|
||||
#include "network.h"
|
||||
#include "v_draw.h"
|
||||
#include "menus.h"
|
||||
|
||||
|
||||
BEGIN_SW_NS
|
||||
|
||||
|
@ -64,6 +67,7 @@ static const short icons[] = {
|
|||
|
||||
class DSWStatusBar : public DBaseStatusBar
|
||||
{
|
||||
DHUDFont miniFont;
|
||||
|
||||
enum
|
||||
{
|
||||
|
@ -137,6 +141,14 @@ class DSWStatusBar : public DBaseStatusBar
|
|||
ID_SelectionBox = 2435,
|
||||
};
|
||||
|
||||
|
||||
public:
|
||||
DSWStatusBar()
|
||||
{
|
||||
miniFont = { SmallFont2, 0, Off, 1, 1 };
|
||||
}
|
||||
|
||||
private:
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
|
@ -224,23 +236,7 @@ class DSWStatusBar : public DBaseStatusBar
|
|||
|
||||
void DisplayTinyString(double xs, double ys, const char* buffer, int pal)
|
||||
{
|
||||
double x;
|
||||
const char* ptr;
|
||||
|
||||
const int FRAG_FIRST_ASCII = ('!');
|
||||
const int FRAG_FIRST_TILE = 2930;
|
||||
|
||||
for (ptr = buffer, x = xs; *ptr; ptr++)
|
||||
{
|
||||
if (*ptr == ' ')
|
||||
continue;
|
||||
|
||||
assert(*ptr >= '!' && *ptr <= '}');
|
||||
|
||||
auto tex = tileGetTexture(FRAG_FIRST_TILE + (*ptr - FRAG_FIRST_ASCII));
|
||||
DrawGraphic(tex, x, ys, DI_ITEM_LEFT_TOP, 1, -1, -1, 1, 1, 0xffffffff, TRANSLATION(Translation_Remap, pal));
|
||||
x += 4;
|
||||
}
|
||||
SBar_DrawString(this, &miniFont, buffer, xs, ys, DI_ITEM_LEFT_TOP, TRANSLATION(Translation_Remap, pal), 1, -1, -1, 1, 1);
|
||||
}
|
||||
|
||||
void DisplayFragString(PLAYERp pp, double xs, double ys, const char* buffer)
|
||||
|
@ -846,6 +842,34 @@ public:
|
|||
|
||||
};
|
||||
|
||||
#if 0
|
||||
SWBOOL DebugSecret = FALSE;
|
||||
void SecretInfo(PLAYERp pp)
|
||||
{
|
||||
if (!hud_stats) return;
|
||||
#define Y_STEP 7
|
||||
#define AVERAGEFRAMES 16
|
||||
int x = windowxy1.x + 2;
|
||||
int y = windowxy1.y + 2 + 8;
|
||||
extern short LevelSecrets, TotalKillable;
|
||||
|
||||
if (CommEnabled || numplayers > 1)
|
||||
return;
|
||||
|
||||
x = x / (xdim / 320.0);
|
||||
y = y / (ydim / 200.0);
|
||||
|
||||
if (hud_stats)
|
||||
{
|
||||
sprintf(ds, "Kills %d/%d", Player->Kills, TotalKillable);
|
||||
MNU_DrawSmallString(x, y, PAL_XLAT_BROWN, ds);
|
||||
|
||||
sprintf(ds, "Secrets %d/%d", Player->SecretsFound, LevelSecrets);
|
||||
MNU_DrawSmallString(x, y + 10, PAL_XLAT_BROWN, ds);
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
static void UpdateFrame(void)
|
||||
{
|
||||
|
@ -863,6 +887,15 @@ static void UpdateFrame(void)
|
|||
twod->AddFlatFill(windowxy1.x - 3, windowxy2.y + 1, windowxy2.x + 1, windowxy2.y + 4, tex, 0, 1, 0xff2a2a2a);
|
||||
}
|
||||
|
||||
static FString cookieQuote;
|
||||
static int cookieTime;
|
||||
|
||||
void adduserquote(const char* daquote)
|
||||
{
|
||||
cookieQuote = daquote;
|
||||
cookieTime = totalclock + 540;
|
||||
}
|
||||
|
||||
void UpdateStatusBar(ClockTicks arg)
|
||||
{
|
||||
DSWStatusBar sbar;
|
||||
|
@ -873,6 +906,11 @@ void UpdateStatusBar(ClockTicks arg)
|
|||
}
|
||||
|
||||
sbar.UpdateStatusBar(arg);
|
||||
if (totalclock < cookieTime)
|
||||
{
|
||||
const int MESSAGE_LINE = 142; // Used to be 164
|
||||
MNU_DrawSmallString(160, MESSAGE_LINE, cookieQuote, 0, 0, 0, clamp((cookieTime - totalclock) / 60., 0., 1.));
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -6356,35 +6356,6 @@ KeyMain:
|
|||
KillGetAmmo(SpriteNum);
|
||||
break;
|
||||
|
||||
#if 0
|
||||
case ICON_SPELL:
|
||||
{
|
||||
short w, h, select;
|
||||
|
||||
#define TEXT_SPELL_INFO_LINE 20
|
||||
|
||||
static int8_t* SpellName[] =
|
||||
{
|
||||
"Icon of Flight",
|
||||
"EnvironSuit Skin",
|
||||
"Strength",
|
||||
"Cloak Device",
|
||||
"Oxygen",
|
||||
"Night Vision"
|
||||
};
|
||||
|
||||
select = RANDOM_P2(4 << 8) >> 8; // Not allowed to get
|
||||
// last two items.
|
||||
MNU_MeasureString(SpellName[sp->lotag], &w, &h);
|
||||
PutStringTimer(pp, TEXT_TEST_COL(w), TEXT_SPELL_INFO_LINE, SpellName[sp->lotag], TEXT_TEST_TIME);
|
||||
if (pp == Player+myconnectindex)
|
||||
PlaySound(DIGI_ITEM, sp, v3df_dontpan);
|
||||
KillGet(SpriteNum);
|
||||
break;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
case ICON_HEAT_CARD:
|
||||
if (pp->WpnRocketHeat != 5)
|
||||
{
|
||||
|
|
|
@ -394,16 +394,13 @@ SyncStatMessage(void)
|
|||
}
|
||||
else
|
||||
{
|
||||
short w,h;
|
||||
// production out of sync error
|
||||
|
||||
sprintf(ds,"GAME OUT OF SYNC!");
|
||||
MNU_MeasureString(ds, &w, &h);
|
||||
MNU_DrawString(TEXT_TEST_COL(w), 20, ds, 0, 19);
|
||||
MNU_DrawString(160, 20, ds, 0, 19, 0);
|
||||
|
||||
sprintf(ds,"Restart the game.");
|
||||
MNU_MeasureString(ds, &w, &h);
|
||||
MNU_DrawString(TEXT_TEST_COL(w), 30, ds, 0, 19);
|
||||
MNU_DrawString(160, 30, ds, 0, 19, 0);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -24,8 +24,6 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
|
|||
*/
|
||||
//-------------------------------------------------------------------------
|
||||
#include "ns.h"
|
||||
#undef MAIN
|
||||
#include "build.h"
|
||||
|
||||
#include "names2.h"
|
||||
#include "panel.h"
|
||||
|
@ -36,479 +34,161 @@ Prepared for public release: 03/28/2005 - Charlie Wiederhold, 3D Realms
|
|||
#include "menus.h"
|
||||
|
||||
#include "network.h"
|
||||
#include "v_font.h"
|
||||
#include "v_draw.h"
|
||||
|
||||
BEGIN_SW_NS
|
||||
|
||||
#define PANEL_FONT_G 3636
|
||||
#define PANEL_FONT_Y 3646
|
||||
#define PANEL_FONT_R 3656
|
||||
|
||||
#define PANEL_SM_FONT_G 3601
|
||||
#define PANEL_SM_FONT_Y 3613
|
||||
#define PANEL_SM_FONT_R 3625
|
||||
|
||||
PANEL_SPRITEp pClearTextLineID(PLAYERp pp, short id, int y, short pri)
|
||||
{
|
||||
PANEL_SPRITEp psp=NULL, next;
|
||||
|
||||
TRAVERSE(&pp->PanelSpriteList, psp, next)
|
||||
{
|
||||
// early out
|
||||
if (psp->priority > pri)
|
||||
return NULL;
|
||||
|
||||
if (psp->ID == id && psp->y == y && psp->priority == pri)
|
||||
{
|
||||
pSetSuicide(psp);
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
// only call this from menu code - it does a pKillSprite
|
||||
PANEL_SPRITEp pMenuClearTextLineID(PLAYERp pp, short id, int y, short pri)
|
||||
{
|
||||
PANEL_SPRITEp psp=NULL, next;
|
||||
|
||||
TRAVERSE(&pp->PanelSpriteList, psp, next)
|
||||
{
|
||||
// early out
|
||||
if (psp->priority > pri)
|
||||
return NULL;
|
||||
|
||||
if (psp->ID == id && psp->y == y && psp->priority == pri)
|
||||
{
|
||||
pKillSprite(psp);
|
||||
}
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
void pClearTextLine(PLAYERp pp, int y)
|
||||
{
|
||||
pClearTextLineID(pp, ID_TEXT, y, PRI_FRONT_MAX);
|
||||
}
|
||||
|
||||
void StringTimer(PANEL_SPRITEp psp)
|
||||
{
|
||||
if ((psp->kill_tics -= synctics) <= 0)
|
||||
{
|
||||
pKillSprite(psp);
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
void PutStringTimer(PLAYERp pp, short x, short y, const char *string, short seconds)
|
||||
{
|
||||
int ndx, offset;
|
||||
char c;
|
||||
PANEL_SPRITEp nsp;
|
||||
long kill_tics;
|
||||
short id, ac;
|
||||
PANEL_SPRITE_FUNCp func;
|
||||
|
||||
|
||||
offset = x;
|
||||
|
||||
if (seconds == 999)
|
||||
{
|
||||
pClearTextLineID(pp, ID_TEXT, y, PRI_FRONT_MAX);
|
||||
func = NULL;
|
||||
kill_tics = 0;
|
||||
id = ID_TEXT;
|
||||
}
|
||||
else
|
||||
{
|
||||
pClearTextLineID(pp, ID_TEXT, y, PRI_FRONT_MAX);
|
||||
func = StringTimer;
|
||||
kill_tics = seconds * 120;
|
||||
id = ID_TEXT;
|
||||
}
|
||||
|
||||
// Temporarily disabled because this uses a feature of the panel system that needs to be removed before this can be refactored.
|
||||
#if 0
|
||||
for (ndx = 0; (c = string[ndx]) != 0; ndx++)
|
||||
{
|
||||
ac = c - '!' + STARTALPHANUM;
|
||||
if ((ac < STARTALPHANUM || ac > ENDALPHANUM) && c != asc_Space)
|
||||
break;
|
||||
|
||||
if (c > asc_Space && c < 127)
|
||||
{
|
||||
nsp = pSpawnFullViewSprite(pp, ac, PRI_FRONT_MAX, offset, y);
|
||||
nsp->PanelSpriteFunc = func;
|
||||
nsp->kill_tics = kill_tics;
|
||||
nsp->ID = id;
|
||||
offset += tilesiz[ac].x;
|
||||
}
|
||||
else if (c == asc_Space)
|
||||
offset += 4; // Special case for space char
|
||||
}
|
||||
#endif
|
||||
}
|
||||
|
||||
void KillString(PLAYERp pp, short y)
|
||||
{
|
||||
pClearTextLineID(pp, ID_TEXT, y, PRI_FRONT_MAX);
|
||||
}
|
||||
|
||||
PANEL_SPRITEp pClearSpriteXY(PLAYERp pp, short x, short y)
|
||||
{
|
||||
PANEL_SPRITEp psp=NULL, next;
|
||||
|
||||
TRAVERSE(&pp->PanelSpriteList, psp, next)
|
||||
{
|
||||
if (psp->x == x && psp->y == y)
|
||||
pSetSuicide(psp);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
PANEL_SPRITEp pClearSpriteID(PLAYERp pp, short id)
|
||||
{
|
||||
PANEL_SPRITEp psp=NULL, next;
|
||||
|
||||
TRAVERSE(&pp->PanelSpriteList, psp, next)
|
||||
{
|
||||
if (psp->ID == id)
|
||||
pSetSuicide(psp);
|
||||
}
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
|
||||
void
|
||||
DisplayMiniBarSmString(short xs, short ys, short pal, const char *buffer)
|
||||
{
|
||||
short size=4,x;
|
||||
const char *ptr;
|
||||
short pic;
|
||||
|
||||
#define FRAG_FIRST_ASCII ('!') //exclamation point
|
||||
#define FRAG_FIRST_TILE 2930 //exclamation point
|
||||
|
||||
for (ptr = buffer, x = xs; *ptr; ptr++, x += size)
|
||||
{
|
||||
if (*ptr == ' ')
|
||||
continue;
|
||||
|
||||
ASSERT(*ptr >= '!' && *ptr <= '}');
|
||||
|
||||
pic = FRAG_FIRST_TILE + (*ptr - FRAG_FIRST_ASCII);
|
||||
|
||||
rotatesprite((int)x << 16, (int)ys << 16, (1 << 16), 0, pic, 0, pal,
|
||||
ROTATE_SPRITE_SCREEN_CLIP | RS_TOPLEFT | RS_ALIGN_L,
|
||||
0, 0, xdim - 1, ydim - 1);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////
|
||||
// Measure the pixel width of a graphic string
|
||||
////////////////////////////////////////////////
|
||||
static char lg_xlat_num[] = { 0,1,2,3,4,5,6,7,8,9 };
|
||||
#define FONT_LARGE_ALPHA 3706
|
||||
#define FONT_LARGE_DIGIT 3732
|
||||
#define MenuDrawFlags (ROTATE_SPRITE_SCREEN_CLIP)
|
||||
#define MZ 65536
|
||||
#define MENU_SHADE_DEFAULT 0
|
||||
#define MENU_SHADE_INACTIVE 20
|
||||
|
||||
void MNU_MeasureStringLarge(const char* string, short* w, short* h)
|
||||
{
|
||||
short ndx, width, height;
|
||||
char c;
|
||||
short pic;
|
||||
|
||||
width = 0;
|
||||
height = *h;
|
||||
|
||||
for (ndx = 0; (c = string[ndx]) != 0; ndx++)
|
||||
{
|
||||
if (isalpha(c))
|
||||
{
|
||||
c = toupper(c);
|
||||
pic = FONT_LARGE_ALPHA + (c - 'A');
|
||||
}
|
||||
else if (isdigit(c))
|
||||
{
|
||||
pic = FONT_LARGE_DIGIT + lg_xlat_num[(c - '0')];
|
||||
}
|
||||
else if (c == ' ')
|
||||
{
|
||||
width += 10; // Special case for space char
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
width += tilesiz[pic].x + 1;
|
||||
if (height < tilesiz[pic].y)
|
||||
height = tilesiz[pic].y;
|
||||
}
|
||||
|
||||
*w = width;
|
||||
*h = height;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////
|
||||
// Draw a string using a graphic font
|
||||
////////////////////////////////////////////////
|
||||
void MNU_DrawStringLarge(short x, short y, const char* string, int shade)
|
||||
{
|
||||
int ndx, offset;
|
||||
char c;
|
||||
short pic;
|
||||
|
||||
offset = x;
|
||||
|
||||
for (ndx = 0; (c = string[ndx]) != 0; ndx++)
|
||||
{
|
||||
if (isalpha(c))
|
||||
{
|
||||
c = toupper(c);
|
||||
pic = FONT_LARGE_ALPHA + (c - 'A');
|
||||
}
|
||||
else if (isdigit(c))
|
||||
{
|
||||
pic = FONT_LARGE_DIGIT + lg_xlat_num[(c - '0')];
|
||||
}
|
||||
else if (c == ' ')
|
||||
{
|
||||
offset += 10;
|
||||
continue;
|
||||
}
|
||||
else
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
rotatesprite(offset << 16, y << 16, MZ, 0, pic, shade, 0, MenuDrawFlags | RS_TOPLEFT, 0, 0, xdim - 1, ydim - 1);
|
||||
offset += tilesiz[pic].x + 1;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
////////////////////////////////////////////////
|
||||
// Measure the pixel width of a graphic string
|
||||
////////////////////////////////////////////////
|
||||
void MNU_MeasureString(const char* string, short* w, short* h)
|
||||
{
|
||||
short ndx, width, height;
|
||||
char c;
|
||||
short ac;
|
||||
|
||||
if (string[0] == '^')
|
||||
{
|
||||
MNU_MeasureStringLarge(&string[1], w, h);
|
||||
return;
|
||||
}
|
||||
|
||||
width = 0;
|
||||
height = *h;
|
||||
|
||||
for (ndx = 0; (c = string[ndx]) != 0; ndx++)
|
||||
{
|
||||
ac = c - '!' + STARTALPHANUM;
|
||||
if ((ac < STARTALPHANUM || ac > ENDALPHANUM) && c != asc_Space)
|
||||
break;
|
||||
|
||||
if (c > asc_Space && c < 127)
|
||||
{
|
||||
width += tilesiz[ac].x;
|
||||
if (height < tilesiz[ac].y)
|
||||
height = tilesiz[ac].y;
|
||||
}
|
||||
else if (c == asc_Space)
|
||||
width += 4; // Special case for space char
|
||||
}
|
||||
|
||||
*w = width;
|
||||
*h = height;
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////
|
||||
// Draw a string using a graphic font
|
||||
//==========================================================================
|
||||
//
|
||||
// MenuTextShade and MenuDrawFlags
|
||||
////////////////////////////////////////////////
|
||||
void MNU_DrawString(short x, short y, const char* string, short shade, short pal, int align)
|
||||
{
|
||||
int ndx, offset;
|
||||
char c;
|
||||
short ac;
|
||||
// Sets up the game fonts.
|
||||
//
|
||||
//==========================================================================
|
||||
|
||||
if (string[0] == '^')
|
||||
void InitFonts()
|
||||
{
|
||||
GlyphSet fontdata;
|
||||
|
||||
// Small font
|
||||
for (int i = 0; i < 95; i++)
|
||||
{
|
||||
MNU_DrawStringLarge(x, y, &string[1]);
|
||||
return;
|
||||
auto tile = tileGetTexture(STARTALPHANUM + i);
|
||||
if (tile && tile->isValid() && tile->GetTexelWidth() > 0 && tile->GetTexelHeight() > 0)
|
||||
{
|
||||
fontdata.Insert('!' + i, tile);
|
||||
tile->SetOffsetsNotForFont();
|
||||
}
|
||||
}
|
||||
SmallFont = new ::FFont("SmallFont", nullptr, "defsmallfont", 0, 0, 0, -1, 4, false, false, false, &fontdata);
|
||||
fontdata.Clear();
|
||||
|
||||
// Tiny font
|
||||
for (int i = 0; i < 95; i++)
|
||||
{
|
||||
auto tile = tileGetTexture(2930 + i);
|
||||
if (tile && tile->isValid() && tile->GetTexelWidth() > 0 && tile->GetTexelHeight() > 0)
|
||||
{
|
||||
fontdata.Insert('!' + i, tile);
|
||||
tile->SetOffsetsNotForFont();
|
||||
}
|
||||
}
|
||||
SmallFont2 = new ::FFont("SmallFont2", nullptr, "defsmallfont2", 0, 0, 0, -1, 4, false, false, false, &fontdata);
|
||||
fontdata.Clear();
|
||||
|
||||
const int FONT_LARGE_ALPHA = 3706;
|
||||
const int FONT_LARGE_DIGIT = 3732;
|
||||
|
||||
// Big
|
||||
for (int i = 0; i < 10; i++)
|
||||
{
|
||||
auto tile = tileGetTexture(FONT_LARGE_DIGIT + i);
|
||||
if (tile && tile->isValid() && tile->GetTexelWidth() > 0 && tile->GetTexelHeight() > 0)
|
||||
{
|
||||
fontdata.Insert('0' + i, tile);
|
||||
tile->SetOffsetsNotForFont();
|
||||
}
|
||||
}
|
||||
for (int i = 0; i < 26; i++)
|
||||
{
|
||||
auto tile = tileGetTexture(FONT_LARGE_ALPHA + i);
|
||||
if (tile && tile->isValid() && tile->GetTexelWidth() > 0 && tile->GetTexelHeight() > 0)
|
||||
{
|
||||
fontdata.Insert('A' + i, tile);
|
||||
tile->SetOffsetsNotForFont();
|
||||
}
|
||||
}
|
||||
|
||||
BigFont = new ::FFont("BigFont", nullptr, "defbigfont", 0, 0, 0, -1, 10, false, false, false, &fontdata);
|
||||
BigFont->SetKerning(1);
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void MNU_DrawStringLarge(int x, int y, const char* string, int shade, int align)
|
||||
{
|
||||
if (align > -1)
|
||||
{
|
||||
short w, h;
|
||||
MNU_MeasureString(string, &w, &h);
|
||||
int w = BigFont->StringWidth(string);
|
||||
if (align == 0) x -= w / 2;
|
||||
else x -= w;
|
||||
}
|
||||
|
||||
offset = x;
|
||||
|
||||
for (ndx = 0; (c = string[ndx]) != 0; ndx++)
|
||||
{
|
||||
ac = c - '!' + STARTALPHANUM;
|
||||
if ((ac < STARTALPHANUM || ac > ENDALPHANUM) && c != asc_Space)
|
||||
break;
|
||||
|
||||
if (c > asc_Space && c < 127)
|
||||
{
|
||||
rotatesprite(offset << 16, y << 16, MZ, 0, ac, shade, pal, MenuDrawFlags, 0, 0, xdim - 1, ydim - 1);
|
||||
offset += tilesiz[ac].x;
|
||||
}
|
||||
else if (c == asc_Space)
|
||||
offset += 4; // Special case for space char
|
||||
}
|
||||
|
||||
DrawText(twod, BigFont, CR_UNDEFINED, x, y, string, DTA_FullscreenScale, FSMode_ScaleToFit43, DTA_VirtualWidth, 320, DTA_VirtualHeight, 200,
|
||||
DTA_Color, shadeToLight(shade), TAG_DONE);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////
|
||||
// Measure the pixel width of a small font string
|
||||
////////////////////////////////////////////////
|
||||
void MNU_MeasureSmallString(const char* string, short* w, short* h)
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void MNU_DrawString(int x, int y, const char* string, int shade, int pal, int align)
|
||||
{
|
||||
short ndx, width, height;
|
||||
char c;
|
||||
short ac;
|
||||
|
||||
width = 0;
|
||||
height = *h;
|
||||
|
||||
for (ndx = 0; (c = string[ndx]) != 0; ndx++)
|
||||
if (align > -1)
|
||||
{
|
||||
ac = (c - '!') + 2930;
|
||||
if ((ac < 2930 || ac > 3023) && c != asc_Space)
|
||||
break;
|
||||
|
||||
if (c > asc_Space && c < 127)
|
||||
{
|
||||
width += tilesiz[ac].x;
|
||||
if (height < tilesiz[ac].y)
|
||||
height = tilesiz[ac].y;
|
||||
}
|
||||
else if (c == asc_Space)
|
||||
width += 4; // Special case for space char
|
||||
int w = SmallFont->StringWidth(string);
|
||||
if (align == 0) x -= w / 2;
|
||||
else x -= w;
|
||||
}
|
||||
|
||||
*w = width;
|
||||
*h = height;
|
||||
DrawText(twod, SmallFont, CR_UNDEFINED, x, y, string, DTA_FullscreenScale, FSMode_ScaleToFit43, DTA_VirtualWidth, 320, DTA_VirtualHeight, 200,
|
||||
DTA_Color, shadeToLight(shade), DTA_TranslationIndex, TRANSLATION(Translation_Remap, pal), TAG_DONE);
|
||||
}
|
||||
|
||||
////////////////////////////////////////////////
|
||||
// Draw a string using a small graphic font
|
||||
////////////////////////////////////////////////
|
||||
void MNU_DrawSmallString(short x, short y, const char* string, short shade, short pal)
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
//
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
void MNU_DrawSmallString(int x, int y, const char* string, int shade, int pal, int align, double alpha)
|
||||
{
|
||||
int ndx;
|
||||
char c;
|
||||
short ac, offset;
|
||||
|
||||
|
||||
offset = x;
|
||||
|
||||
for (ndx = 0; (c = string[ndx]) != 0; ndx++)
|
||||
if (align > -1)
|
||||
{
|
||||
ac = c - '!' + 2930;
|
||||
if ((ac < 2930 || ac > 3023) && c != asc_Space)
|
||||
break;
|
||||
|
||||
if (c > asc_Space && c < 127)
|
||||
{
|
||||
rotatesprite(offset << 16, y << 16, MZ, 0, ac, shade, pal, MenuDrawFlags, 0, 0, xdim - 1, ydim - 1);
|
||||
|
||||
offset += tilesiz[ac].x;
|
||||
|
||||
}
|
||||
else if (c == asc_Space)
|
||||
{
|
||||
offset += 4; // Special case for space char
|
||||
}
|
||||
int w = SmallFont2->StringWidth(string);
|
||||
if (align == 0) x -= w / 2;
|
||||
else x -= w;
|
||||
}
|
||||
DrawText(twod, SmallFont2, CR_UNDEFINED, x, y, string, DTA_FullscreenScale, FSMode_ScaleToFit43, DTA_VirtualWidth, 320, DTA_VirtualHeight, 200,
|
||||
DTA_Color, shadeToLight(shade), DTA_TranslationIndex, TRANSLATION(Translation_Remap, pal), DTA_Alpha, alpha, TAG_DONE);
|
||||
|
||||
}
|
||||
|
||||
//---------------------------------------------------------------------------
|
||||
//
|
||||
// Notification messages. Native SW-style display should later be
|
||||
// provided by the backend.
|
||||
//
|
||||
//---------------------------------------------------------------------------
|
||||
|
||||
|
||||
|
||||
short GlobInfoStringTime = TEXT_INFO_TIME;
|
||||
void PutStringInfo(PLAYERp pp, const char *string)
|
||||
{
|
||||
if (pp-Player != myconnectindex)
|
||||
return;
|
||||
|
||||
if (!hud_messages)
|
||||
return;
|
||||
|
||||
Printf(PRINT_MEDIUM|PRINT_NOTIFY, "%s\n", string); // Put it in the console too
|
||||
if (hud_messages == 1) PutStringInfoLine(pp, string);
|
||||
if (pp-Player == myconnectindex && hud_messages)
|
||||
Printf(PRINT_MEDIUM|PRINT_NOTIFY, "%s\n", string); // Put it in the console too
|
||||
}
|
||||
|
||||
|
||||
#if 0 // kept as a reminder to reimplement a 'native' looking display option in the backend
|
||||
void PutStringInfoLine(PLAYERp pp, const char *string)
|
||||
{
|
||||
short GlobInfoStringTime = TEXT_INFO_TIME;
|
||||
|
||||
short x,y;
|
||||
short w,h;
|
||||
|
||||
if (pp-Player != myconnectindex)
|
||||
return;
|
||||
|
||||
MNU_MeasureString(string, &w, &h);
|
||||
|
||||
x = TEXT_XCENTER(w);
|
||||
x = 160;
|
||||
y = TEXT_INFO_LINE(0);
|
||||
|
||||
// Move lower on this level because of boss meters
|
||||
//if ((Level == 20 && numplayers > 1) || numplayers > 4)
|
||||
// y += 20;
|
||||
//if (numplayers > 1 && numplayers <= 4)
|
||||
// y+= 10;
|
||||
|
||||
PutStringTimer(pp, x, y, string, GlobInfoStringTime);
|
||||
// when printing info line clear the second line
|
||||
//PutStringInfoLine2(pp, "");
|
||||
|
||||
}
|
||||
|
||||
void pMenuClearTextLine(PLAYERp pp)
|
||||
{
|
||||
pMenuClearTextLineID(pp, ID_TEXT, TEXT_INFO_LINE(0), PRI_FRONT_MAX);
|
||||
pMenuClearTextLineID(pp, ID_TEXT, TEXT_INFO_LINE(1), PRI_FRONT_MAX);
|
||||
}
|
||||
|
||||
#define TEXT_PLAYER_INFO_TIME (3)
|
||||
#define TEXT_PLAYER_INFO_Y (200 - 40)
|
||||
|
||||
#include "saveable.h"
|
||||
|
||||
static saveable_code saveable_text_code[] =
|
||||
{
|
||||
SAVE_CODE(StringTimer),
|
||||
};
|
||||
|
||||
saveable_module saveable_text =
|
||||
{
|
||||
// code
|
||||
saveable_text_code,
|
||||
SIZ(saveable_text_code),
|
||||
|
||||
// data
|
||||
NULL,0
|
||||
};
|
||||
#endif
|
||||
|
||||
END_SW_NS
|
||||
|
|
Loading…
Reference in a new issue