2006-03-20 17:12:09 +00:00
|
|
|
/* $Id: hud.c,v 1.1.1.1 2006/03/17 19:55:09 zicodxx Exp $ */
|
|
|
|
/*
|
|
|
|
THE COMPUTER CODE CONTAINED HEREIN IS THE SOLE PROPERTY OF PARALLAX
|
|
|
|
SOFTWARE CORPORATION ("PARALLAX"). PARALLAX, IN DISTRIBUTING THE CODE TO
|
|
|
|
END-USERS, AND SUBJECT TO ALL OF THE TERMS AND CONDITIONS HEREIN, GRANTS A
|
|
|
|
ROYALTY-FREE, PERPETUAL LICENSE TO SUCH END-USERS FOR USE BY SUCH END-USERS
|
|
|
|
IN USING, DISPLAYING, AND CREATING DERIVATIVE WORKS THEREOF, SO LONG AS
|
|
|
|
SUCH USE, DISPLAY OR CREATION IS FOR NON-COMMERCIAL, ROYALTY OR REVENUE
|
|
|
|
FREE PURPOSES. IN NO EVENT SHALL THE END-USER USE THE COMPUTER CODE
|
|
|
|
CONTAINED HEREIN FOR REVENUE-BEARING PURPOSES. THE END-USER UNDERSTANDS
|
|
|
|
AND AGREES TO THE TERMS HEREIN AND ACCEPTS THE SAME BY USE OF THIS FILE.
|
|
|
|
COPYRIGHT 1993-1999 PARALLAX SOFTWARE CORPORATION. ALL RIGHTS RESERVED.
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
|
|
|
*
|
|
|
|
* Routines for displaying HUD messages...
|
|
|
|
*
|
|
|
|
*/
|
|
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_CONFIG_H
|
|
|
|
#include <conf.h>
|
|
|
|
#endif
|
|
|
|
|
|
|
|
#include <stdio.h>
|
|
|
|
#include <string.h>
|
|
|
|
#include <stdlib.h>
|
2006-10-08 23:19:46 +00:00
|
|
|
#include <time.h>
|
2006-03-20 17:12:09 +00:00
|
|
|
|
|
|
|
#include "hudmsg.h"
|
|
|
|
|
|
|
|
#include "pstypes.h"
|
|
|
|
#include "u_mem.h"
|
|
|
|
#include "strutil.h"
|
|
|
|
#include "console.h"
|
|
|
|
#include "inferno.h"
|
|
|
|
#include "game.h"
|
|
|
|
#include "screens.h"
|
|
|
|
#include "gauges.h"
|
|
|
|
#include "physics.h"
|
|
|
|
#include "error.h"
|
|
|
|
|
|
|
|
#include "menu.h" // For the font.
|
|
|
|
#include "mono.h"
|
|
|
|
#include "collide.h"
|
|
|
|
#include "newdemo.h"
|
|
|
|
#include "player.h"
|
|
|
|
#include "gamefont.h"
|
|
|
|
|
|
|
|
#include "wall.h"
|
|
|
|
#include "screens.h"
|
|
|
|
#include "text.h"
|
|
|
|
#include "laser.h"
|
|
|
|
#include "args.h"
|
|
|
|
|
|
|
|
int hud_first = 0;
|
|
|
|
int hud_last = 0;
|
|
|
|
|
|
|
|
int HUD_nmessages = 0;
|
|
|
|
fix HUD_message_timer = 0; // Time, relative to Players[Player_num].time (int.frac seconds.frac), at which to erase gauge message
|
|
|
|
char HUD_messages[HUD_MAX_NUM][HUD_MESSAGE_LENGTH+5];
|
|
|
|
|
2007-03-21 12:35:35 +00:00
|
|
|
char Displayed_background_message[HUD_MESSAGE_LENGTH] = "";
|
2006-03-20 17:12:09 +00:00
|
|
|
int Last_msg_ycrd = -1;
|
|
|
|
int Last_msg_height = 6;
|
|
|
|
int HUD_color = -1;
|
|
|
|
|
|
|
|
int MSG_Playermessages = 0;
|
|
|
|
int MSG_Noredundancy = 0;
|
|
|
|
|
|
|
|
int Modex_hud_msg_count;
|
|
|
|
|
2007-07-26 23:57:29 +00:00
|
|
|
#define LHX(x) ((x)*(HiresGFX?2:1))
|
|
|
|
#define LHY(y) ((y)*(HiresGFX?2.4:1))
|
2006-03-20 17:12:09 +00:00
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
void clear_background_messages(void)
|
|
|
|
{
|
2007-03-24 04:37:33 +00:00
|
|
|
if (((Cockpit_mode == CM_STATUS_BAR) || (Cockpit_mode == CM_FULL_SCREEN)) && (Last_msg_ycrd != -1) && (Screen_3d_window.cv_bitmap.bm_y >= 6)) {
|
2006-03-20 17:12:09 +00:00
|
|
|
grs_canvas *canv_save = grd_curcanv;
|
|
|
|
|
2007-03-21 11:32:33 +00:00
|
|
|
gr_set_current_canvas(NULL);
|
2006-03-20 17:12:09 +00:00
|
|
|
|
|
|
|
gr_set_current_canvas(canv_save);
|
|
|
|
|
|
|
|
Last_msg_ycrd = -1;
|
|
|
|
}
|
|
|
|
|
2007-03-21 12:35:35 +00:00
|
|
|
Displayed_background_message[0] = 0;
|
2006-03-20 17:12:09 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
void HUD_clear_messages()
|
|
|
|
{
|
|
|
|
int i;
|
|
|
|
HUD_nmessages = 0;
|
|
|
|
hud_first = hud_last = 0;
|
|
|
|
HUD_message_timer = 0;
|
|
|
|
clear_background_messages();
|
|
|
|
for (i = 0; i < HUD_MAX_NUM; i++)
|
|
|
|
sprintf(HUD_messages[i], "SlagelSlagel!!");
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
extern int Guided_in_big_window;
|
|
|
|
extern int max_window_h;
|
|
|
|
|
|
|
|
extern grs_canvas *print_to_canvas(char *s,grs_font *font, int fc, int bc, int double_flag);
|
|
|
|
|
|
|
|
// -----------------------------------------------------------------------------
|
|
|
|
// print to buffer, double heights, and blit bitmap to screen
|
|
|
|
void modex_hud_message(int x, int y, char *s, grs_font *font, int color)
|
|
|
|
{
|
|
|
|
grs_canvas *temp_canv;
|
|
|
|
|
|
|
|
temp_canv = print_to_canvas(s, font, color, -1, 1);
|
|
|
|
|
|
|
|
gr_bitmapm(x,y,&temp_canv->cv_bitmap);
|
|
|
|
|
|
|
|
gr_free_canvas(temp_canv);
|
|
|
|
}
|
|
|
|
|
|
|
|
extern int max_window_w;
|
|
|
|
|
|
|
|
// ----------------------------------------------------------------------------
|
|
|
|
// Writes a message on the HUD and checks its timer.
|
|
|
|
void HUD_render_message_frame()
|
|
|
|
{
|
|
|
|
int i, y,n;
|
|
|
|
int h,w,aw;
|
|
|
|
|
|
|
|
if (( HUD_nmessages < 0 ) || (HUD_nmessages > HUD_MAX_NUM))
|
|
|
|
Int3(); // Get Rob!
|
|
|
|
|
|
|
|
if ( (HUD_nmessages < 1 ) && (Modex_hud_msg_count == 0))
|
|
|
|
return;
|
|
|
|
|
|
|
|
HUD_message_timer -= FrameTime;
|
|
|
|
|
|
|
|
if ( HUD_message_timer < 0 ) {
|
|
|
|
// Timer expired... get rid of oldest message...
|
|
|
|
if (hud_last!=hud_first) {
|
|
|
|
int temp;
|
|
|
|
|
|
|
|
//&HUD_messages[hud_first][0] is deing deleted...;
|
|
|
|
hud_first = (hud_first+1) % HUD_MAX_NUM;
|
|
|
|
HUD_message_timer = F1_0*2;
|
|
|
|
HUD_nmessages--;
|
|
|
|
if (HUD_nmessages == 0)
|
|
|
|
Modex_hud_msg_count = 2;
|
|
|
|
temp = Last_msg_ycrd;
|
|
|
|
clear_background_messages(); // If in status bar mode and no messages, then erase.
|
|
|
|
if (Modex_hud_msg_count)
|
|
|
|
Last_msg_ycrd = temp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if (HUD_nmessages > 0 ) {
|
|
|
|
|
|
|
|
if (HUD_color == -1)
|
|
|
|
HUD_color = BM_XRGB(0,28,0);
|
|
|
|
|
2007-06-14 20:52:14 +00:00
|
|
|
gr_set_curfont( SMALL_FONT );
|
2006-03-20 17:12:09 +00:00
|
|
|
|
2007-06-14 20:52:14 +00:00
|
|
|
if ( (Cockpit_mode == CM_FULL_SCREEN) || (Cockpit_mode == CM_LETTERBOX) ) {
|
2006-03-20 17:12:09 +00:00
|
|
|
y = SMALL_FONT->ft_h/2;
|
2007-06-14 20:52:14 +00:00
|
|
|
} else
|
|
|
|
y = SMALL_FONT->ft_h/2;
|
|
|
|
|
|
|
|
if (Guided_missile[Player_num] && Guided_missile[Player_num]->type==OBJ_WEAPON && Guided_missile[Player_num]->id==GUIDEDMISS_ID &&
|
|
|
|
Guided_missile[Player_num]->signature==Guided_missile_sig[Player_num] && Guided_in_big_window)
|
|
|
|
y+=SMALL_FONT->ft_h+3;
|
|
|
|
|
|
|
|
for (i=0; i<HUD_nmessages; i++ ) {
|
|
|
|
n = (hud_first+i) % HUD_MAX_NUM;
|
|
|
|
if ((n < 0) || (n >= HUD_MAX_NUM))
|
|
|
|
Int3(); // Get Rob!!
|
|
|
|
if (!strcmp(HUD_messages[n], "This is a bug."))
|
|
|
|
Int3(); // Get Rob!!
|
|
|
|
gr_get_string_size(&HUD_messages[n][0], &w, &h, &aw );
|
|
|
|
gr_set_fontcolor( HUD_color, -1);
|
|
|
|
|
|
|
|
gr_string((grd_curcanv->cv_bitmap.bm_w-w)/2,y, &HUD_messages[n][0] );
|
|
|
|
y += h+FONTSCALE_Y(1);
|
2006-03-20 17:12:09 +00:00
|
|
|
}
|
|
|
|
}
|
2007-03-21 11:32:33 +00:00
|
|
|
else if (grd_curscreen->sc_canvas.cv_bitmap.bm_type == BM_MODEX) {
|
2006-03-20 17:12:09 +00:00
|
|
|
if (Modex_hud_msg_count) {
|
|
|
|
int temp = Last_msg_ycrd;
|
|
|
|
Modex_hud_msg_count--;
|
|
|
|
clear_background_messages(); // If in status bar mode and no messages, then erase.
|
|
|
|
Last_msg_ycrd = temp;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
gr_set_curfont( GAME_FONT );
|
|
|
|
}
|
|
|
|
|
|
|
|
int PlayerMessage=1;
|
|
|
|
|
|
|
|
// Call to flash a message on the HUD. Returns true if message drawn.
|
|
|
|
// (message might not be drawn if previous message was same)
|
|
|
|
int HUD_init_message_va(char * format, va_list args)
|
|
|
|
{
|
2007-04-21 08:27:21 +00:00
|
|
|
int temp, i;
|
2006-03-20 17:12:09 +00:00
|
|
|
char *message = NULL;
|
|
|
|
char *last_message=NULL;
|
|
|
|
#if 0
|
|
|
|
int temp2;
|
|
|
|
char *cleanmessage;
|
|
|
|
#endif
|
|
|
|
char con_message[HUD_MESSAGE_LENGTH + 3];
|
2006-10-08 23:19:46 +00:00
|
|
|
time_t t;
|
|
|
|
struct tm *lt;
|
2006-03-20 17:12:09 +00:00
|
|
|
|
|
|
|
Modex_hud_msg_count = 2;
|
|
|
|
|
|
|
|
if ( (hud_last < 0) || (hud_last >= HUD_MAX_NUM))
|
|
|
|
Int3(); // Get Rob!!
|
|
|
|
|
|
|
|
// -- mprintf((0, "message timer: %7.3f\n", f2fl(HUD_message_timer)));
|
|
|
|
message = &HUD_messages[hud_last][0];
|
|
|
|
vsprintf(message,format,args);
|
|
|
|
|
2007-04-21 08:27:21 +00:00
|
|
|
// clean message if necessary.
|
|
|
|
// using placeholders may mess up message string and crash game(s).
|
|
|
|
// block them also to prevent attacks from other clients.
|
|
|
|
for (i = 0; i <= strlen(message); i++)
|
|
|
|
if (message[i] == '%')
|
|
|
|
message [i] = ' ';
|
|
|
|
|
2006-03-20 17:12:09 +00:00
|
|
|
// Added by Leighton
|
|
|
|
|
2007-07-16 02:34:51 +00:00
|
|
|
if ((Game_mode & GM_MULTI) && GameArg.MplNoRedundancy)
|
2006-03-20 17:12:09 +00:00
|
|
|
if (!strnicmp ("You already",message,11))
|
|
|
|
return 0;
|
|
|
|
|
2007-07-16 02:34:51 +00:00
|
|
|
if ((Game_mode & GM_MULTI) && GameArg.MplPlayerMessages && PlayerMessage==0)
|
2006-03-20 17:12:09 +00:00
|
|
|
return 0;
|
|
|
|
|
|
|
|
if (HUD_nmessages > 0) {
|
|
|
|
if (hud_last==0)
|
|
|
|
last_message = &HUD_messages[HUD_MAX_NUM-1][0];
|
|
|
|
else
|
|
|
|
last_message = &HUD_messages[hud_last-1][0];
|
|
|
|
}
|
|
|
|
|
|
|
|
temp = (hud_last+1) % HUD_MAX_NUM;
|
|
|
|
|
|
|
|
if ( temp==hud_first ) {
|
|
|
|
// If too many messages, remove oldest message to make room
|
|
|
|
hud_first = (hud_first+1) % HUD_MAX_NUM;
|
|
|
|
HUD_nmessages--;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (last_message && (!strcmp(last_message, message))) {
|
|
|
|
HUD_message_timer = F1_0*3; // 1 second per 5 characters
|
|
|
|
return 0; // ignore since it is the same as the last one
|
|
|
|
}
|
|
|
|
|
2007-03-25 21:14:02 +00:00
|
|
|
if (strnicmp ("you",message,3) && strcmp ("SUPER LASER MAXED OUT!",message)) { // block hudlog output messages beginning with you ("your ... maxed out", "you already have ...")
|
2007-02-19 15:21:53 +00:00
|
|
|
t=time(NULL);
|
|
|
|
lt=localtime(&t);
|
|
|
|
|
|
|
|
/* Produce a colorised version and send it to the console */
|
|
|
|
printf("%02i:%02i:%02i ",lt->tm_hour,lt->tm_min,lt->tm_sec);
|
|
|
|
if (HUD_color == -1)
|
|
|
|
HUD_color = BM_XRGB(0,28,0);
|
|
|
|
con_message[0] = CC_COLOR;
|
|
|
|
con_message[1] = HUD_color;
|
|
|
|
con_message[2] = '\0';
|
|
|
|
strcat(con_message, message);
|
|
|
|
con_printf(CON_NORMAL, "%s\n", con_message);
|
|
|
|
}
|
2007-01-14 01:55:59 +00:00
|
|
|
|
2006-03-20 17:12:09 +00:00
|
|
|
hud_last = temp;
|
|
|
|
// Check if memory has been overwritten at this point.
|
|
|
|
if (strlen(message) >= HUD_MESSAGE_LENGTH)
|
|
|
|
Error( "Your message to HUD is too long. Limit is %i characters.\n", HUD_MESSAGE_LENGTH);
|
|
|
|
#ifdef NEWDEMO
|
|
|
|
if (Newdemo_state == ND_STATE_RECORDING )
|
|
|
|
newdemo_record_hud_message( message );
|
|
|
|
#endif
|
|
|
|
HUD_message_timer = F1_0*3; // 1 second per 5 characters
|
|
|
|
HUD_nmessages++;
|
|
|
|
|
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
int HUD_init_message(char * format, ... )
|
|
|
|
{
|
|
|
|
int ret;
|
|
|
|
va_list args;
|
|
|
|
|
|
|
|
va_start(args, format);
|
|
|
|
ret = HUD_init_message_va(format, args);
|
|
|
|
va_end(args);
|
|
|
|
|
|
|
|
return ret;
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
//@@void player_dead_message(void)
|
|
|
|
//@@{
|
|
|
|
//@@ if (!Arcade_mode && Player_exploded) { //(ConsoleObject->flags & OF_EXPLODING)) {
|
|
|
|
//@@ gr_set_curfont( SMALL_FONT );
|
|
|
|
//@@ if (HUD_color == -1)
|
|
|
|
//@@ HUD_color = BM_XRGB(0,28,0);
|
|
|
|
//@@ gr_set_fontcolor( HUD_color, -1);
|
|
|
|
//@@
|
|
|
|
//@@ gr_printf(0x8000, grd_curcanv->cv_bitmap.bm_h-8, TXT_PRESS_ANY_KEY);
|
|
|
|
//@@ gr_set_curfont( GAME_FONT );
|
|
|
|
//@@ }
|
|
|
|
//@@
|
|
|
|
//@@}
|
|
|
|
|
|
|
|
void player_dead_message(void)
|
|
|
|
{
|
|
|
|
if (Player_exploded) {
|
|
|
|
if ( Players[Player_num].lives < 2 ) {
|
|
|
|
int x, y, w, h, aw;
|
|
|
|
gr_set_curfont( HUGE_FONT );
|
|
|
|
gr_get_string_size( TXT_GAME_OVER, &w, &h, &aw );
|
|
|
|
w += 20;
|
|
|
|
h += 8;
|
|
|
|
x = (grd_curcanv->cv_w - w ) / 2;
|
|
|
|
y = (grd_curcanv->cv_h - h ) / 2;
|
|
|
|
|
|
|
|
Gr_scanline_darkening_level = 2*7;
|
|
|
|
gr_setcolor( BM_XRGB(0,0,0) );
|
|
|
|
gr_rect( x, y, x+w, y+h );
|
|
|
|
Gr_scanline_darkening_level = GR_FADE_LEVELS;
|
|
|
|
|
2006-10-12 10:07:20 +00:00
|
|
|
gr_string(0x8000, (grd_curcanv->cv_h - FONTSCALE_Y(grd_curcanv->cv_font->ft_h))/2 + h/8, TXT_GAME_OVER );
|
2006-03-20 17:12:09 +00:00
|
|
|
|
|
|
|
#if 0
|
|
|
|
// Automatically exit death after 10 secs
|
|
|
|
if ( GameTime > Player_time_of_death + F1_0*10 ) {
|
|
|
|
Function_mode = FMODE_MENU;
|
|
|
|
Game_mode = GM_GAME_OVER;
|
|
|
|
longjmp( LeaveGame, 1 ); // Exit out of game loop
|
|
|
|
}
|
|
|
|
#endif
|
|
|
|
|
|
|
|
}
|
|
|
|
gr_set_curfont( GAME_FONT );
|
|
|
|
if (HUD_color == -1)
|
|
|
|
HUD_color = BM_XRGB(0,28,0);
|
|
|
|
gr_set_fontcolor( HUD_color, -1);
|
2007-02-19 21:18:04 +00:00
|
|
|
gr_string(0x8000, grd_curcanv->cv_h-FONTSCALE_Y(grd_curcanv->cv_font->ft_h+3)*((Newdemo_state == ND_STATE_RECORDING)?2:1), TXT_PRESS_ANY_KEY);
|
2006-03-20 17:12:09 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// void say_afterburner_status(void)
|
|
|
|
// {
|
|
|
|
// if (Players[Player_num].flags & PLAYER_FLAGS_AFTERBURNER)
|
|
|
|
// HUD_init_message("Afterburner engaged.");
|
|
|
|
// else
|
|
|
|
// HUD_init_message("Afterburner disengaged.");
|
|
|
|
// }
|
|
|
|
|
|
|
|
void hud_message(int class, char *format, ...)
|
|
|
|
{
|
|
|
|
va_list vp;
|
|
|
|
|
|
|
|
va_start(vp, format);
|
|
|
|
if ((!MSG_Noredundancy || (class & MSGC_NOREDUNDANCY)) &&
|
|
|
|
(!MSG_Playermessages || !(Game_mode & GM_MULTI) ||
|
|
|
|
(class & MSGC_PLAYERMESSAGES)))
|
|
|
|
HUD_init_message_va(format, vp);
|
|
|
|
va_end(vp);
|
|
|
|
}
|
|
|
|
|