Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Iskhodnyy_kod_Doom

.pdf
Скачиваний:
7
Добавлен:
13.02.2015
Размер:
1.01 Mб
Скачать

//

// GAME

//

void G_DeathMatchSpawnPlayer (int playernum);

void G_InitNew (skill_t skill, int episode, int map);

//Can be called by the startup code or M_Responder.

//A normal game starts at map 1,

//but a warp test can start elsewhere

void G_DeferedInitNew (skill_t skill, int episode, int map);

void G_DeferedPlayDemo (char* demo);

//Can be called by the startup code or M_Responder,

//calls P_SetupLevel or W_EnterWorld.

void G_LoadGame (char* name);

void G_DoLoadGame (void);

// Called by M_Responder.

void G_SaveGame (int slot, char* description);

// Only called by startup code. void G_RecordDemo (char* name);

void G_BeginRecording (void);

void G_PlayDemo (char* name); void G_TimeDemo (char* name); boolean G_CheckDemoStatus (void);

void G_ExitLevel (void);

void G_SecretExitLevel (void);

void G_WorldDone (void);

 

void G_Ticker (void);

 

boolean G_Responder (event_t*

ev);

void G_ScreenShot (void);

 

#endif

 

//-----------------------------------------------------------------------------

 

//

 

// $Log:$

 

//

 

//-----------------------------------------------------------------------------

 

6 Heads-up display

6.1 hu lib.c

// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------

//

//$Id:$

//Copyright (C) 1993-1996 by id Software, Inc.

//This program 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.

151

//

//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.

//

//$Log:$

//DESCRIPTION: heads-up text and input code

//-----------------------------------------------------------------------------

static const char

rcsid[] = "$Id: hu_lib.c,v 1.3 1997/01/26 07:44:58 b1 Exp $";

#include <ctype.h>

#include "doomdef.h"

#include "v_video.h" #include "m_swap.h"

#include "hu_lib.h" #include "r_local.h" #include "r_draw.h"

// boolean : whether the screen is always erased #define noterased viewwindowx

extern boolean

automapactive;

// in AM_map.c

void HUlib_init(void)

{

}

void HUlib_clearTextLine(hu_textline_t* t)

{

t->len = 0; t->l[0] = 0;

t->needsupdate = true;

}

void

 

HUlib_initTextLine

 

( hu_textline_t*

t,

int

x,

int

y,

patch_t**

f,

int

sc )

{

 

t->x = x; t->y = y; t->f = f; t->sc = sc;

HUlib_clearTextLine(t);

}

boolean

 

HUlib_addCharToTextLine

 

( hu_textline_t*

t,

char

ch )

{

 

if (t->len == HU_MAXLINELENGTH) return false;

152

else

{

t->l[t->len++] = ch; t->l[t->len] = 0; t->needsupdate = 4; return true;

}

}

boolean HUlib_delCharFromTextLine(hu_textline_t* t)

{

if (!t->len) return false; else

{

t->l[--t->len] = 0; t->needsupdate = 4; return true;

}

 

}

 

void

 

HUlib_drawTextLine

 

( hu_textline_t*

l,

boolean

drawcursor )

{

 

int

i;

int

w;

int

x;

unsigned char

c;

// draw the new stuff x = l->x;

for (i=0;i<l->len;i++)

{

c = toupper(l->l[i]); if (c != ’ ’

&&c >= l->sc

&&c <= ’_’)

{

w = SHORT(l->f[c - l->sc]->width); if (x+w > SCREENWIDTH)

break;

V_DrawPatchDirect(x, l->y, FG, l->f[c - l->sc]); x += w;

}

else

{

x += 4;

if (x >= SCREENWIDTH) break;

}

}

// draw the cursor if requested if (drawcursor

&& x + SHORT(l->f[’_’ - l->sc]->width) <= SCREENWIDTH)

{

V_DrawPatchDirect(x, l->y, FG, l->f[’_’ - l->sc]);

}

}

153

// sorta called by HU_Erase and just better darn get things straight void HUlib_eraseTextLine(hu_textline_t* l)

{

int

lh;

int

y;

int

yoffset;

static boolean

lastautomapactive = true;

//Only erases when NOT in automap and the screen is reduced,

//and the text must either need updating or refreshing

//(because of a recent change back from the automap)

if (!automapactive &&

viewwindowx && l->needsupdate)

{

lh = SHORT(l->f[0]->height) + 1;

for (y=l->y,yoffset=y*SCREENWIDTH ; y<l->y+lh ; y++,yoffset+=SCREENWIDTH)

{

if (y < viewwindowy || y >= viewwindowy + viewheight) R_VideoErase(yoffset, SCREENWIDTH); // erase entire line

else

{

R_VideoErase(yoffset, viewwindowx); // erase left border R_VideoErase(yoffset + viewwindowx + viewwidth, viewwindowx); // erase right border

}

}

}

lastautomapactive = automapactive;

if (l->needsupdate) l->needsupdate--;

}

 

void

 

HUlib_initSText

 

( hu_stext_t*

s,

int

x,

int

y,

int

h,

patch_t**

font,

int

startchar,

boolean*

on )

{

 

int i;

s->h = h; s->on = on;

s->laston = true; s->cl = 0;

for (i=0;i<h;i++) HUlib_initTextLine(&s->l[i],

x, y - i*(SHORT(font[0]->height)+1), font, startchar);

}

void HUlib_addLineToSText(hu_stext_t* s)

{

int i;

// add a clear line

154

if (++s->cl == s->h) s->cl = 0;

HUlib_clearTextLine(&s->l[s->cl]);

// everything needs updating for (i=0 ; i<s->h ; i++)

s->l[i].needsupdate = 4;

}

void HUlib_addMessageToSText

( hu_stext_t*

s,

char*

prefix,

char*

msg )

{

HUlib_addLineToSText(s); if (prefix)

while (*prefix)

HUlib_addCharToTextLine(&s->l[s->cl], *(prefix++));

while (*msg)

HUlib_addCharToTextLine(&s->l[s->cl], *(msg++));

}

void HUlib_drawSText(hu_stext_t* s)

{

int i, idx; hu_textline_t *l;

if (!*s->on)

return; // if not on, don’t draw

// draw everything

for (i=0 ; i<s->h ; i++)

{

idx = s->cl - i; if (idx < 0)

idx += s->h; // handle queue of lines

l = &s->l[idx];

// need a decision made here on whether to skip the draw HUlib_drawTextLine(l, false); // no cursor, please

}

}

void HUlib_eraseSText(hu_stext_t* s)

{

int i;

for (i=0 ; i<s->h ; i++)

{

if (s->laston && !*s->on) s->l[i].needsupdate = 4;

HUlib_eraseTextLine(&s->l[i]);

}

s->laston = *s->on;

}

void HUlib_initIText

155

( hu_itext_t*

it,

int

x,

int

y,

patch_t**

font,

int

startchar,

boolean*

on )

{

 

it->lm = 0; // default left margin is start of text it->on = on;

it->laston = true;

HUlib_initTextLine(&it->l, x, y, font, startchar);

}

// The following deletion routines adhere to the left margin restriction void HUlib_delCharFromIText(hu_itext_t* it)

{

if (it->l.len != it->lm) HUlib_delCharFromTextLine(&it->l);

}

void HUlib_eraseLineFromIText(hu_itext_t* it)

{

while (it->lm != it->l.len) HUlib_delCharFromTextLine(&it->l);

}

// Resets left margin as well

void HUlib_resetIText(hu_itext_t* it)

{

it->lm = 0; HUlib_clearTextLine(&it->l);

}

void HUlib_addPrefixToIText

( hu_itext_t*

it,

char*

str )

{

 

while (*str)

HUlib_addCharToTextLine(&it->l, *(str++)); it->lm = it->l.len;

}

//wrapper function for handling general keyed input.

//returns true if it ate the key

boolean HUlib_keyInIText

(hu_itext_t* it, unsigned char ch )

{

if (ch >= ’ ’ && ch <= ’_’) HUlib_addCharToTextLine(&it->l, (char) ch);

else

if (ch == KEY_BACKSPACE) HUlib_delCharFromIText(it);

else

if (ch != KEY_ENTER)

return false; // did not eat key

return true; // ate the key

}

156

void HUlib_drawIText(hu_itext_t* it)

{

hu_textline_t *l = &it->l;

if (!*it->on) return;

HUlib_drawTextLine(l, true); // draw the line w/ cursor

}

void HUlib_eraseIText(hu_itext_t* it)

{

if (it->laston && !*it->on) it->l.needsupdate = 4;

HUlib_eraseTextLine(&it->l); it->laston = *it->on;

}

6.2hu lib.h

// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------

//

//$Id:$

//Copyright (C) 1993-1996 by id Software, Inc.

//This program 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.

//

// DESCRIPTION: none

//

//-----------------------------------------------------------------------------

#ifndef __HULIB__ #define __HULIB__

//We are referring to patches. #include "r_defs.h"

//background and foreground screen numbers

//different from other modules.

#define

BG

1

#define

FG

0

// font

stuff

 

#define

HU_CHARERASE

KEY_BACKSPACE

#define

HU_MAXLINES

4

#define

HU_MAXLINELENGTH

80

//

// Typedefs of widgets

//

157

//Text Line widget

//(parent of Scrolling Text and Input Text widgets) typedef struct

{

// left-justified position of scrolling text window

int

x;

 

int

y;

 

patch_t**

f;

// font

int

sc;

// start character

char

l[HU_MAXLINELENGTH+1];

// line of text

int

len;

// current line length

// whether this line needs to be udpated

 

int

needsupdate;

 

} hu_textline_t;

//Scrolling Text window widget

//(child of Text Line widget) typedef struct

{

hu_textline_t

l[HU_MAXLINES];

// text lines to draw

int

h;

// height in lines

int

cl;

// current line number

// pointer to boolean stating whether to update window

boolean*

on;

 

boolean

laston;

// last value of *->on.

} hu_stext_t;

//Input Text Line widget

//(child of Text Line widget) typedef struct

{

hu_textline_t

l;

 

// text line to input on

// left margin past which I am not to

delete characters

int

 

lm;

 

// pointer to boolean stating whether to update window

boolean*

 

on;

 

boolean

 

laston; // last

value of *->on;

} hu_itext_t;

//

//Widget creation, access, and update routines

//initializes heads-up widget library

void HUlib_init(void);

//

//textline code

//clear a line of text

void

HUlib_clearTextLine(hu_textline_t *t);

158

it,
x,
y,
font,
startchar, on );

void HUlib_initTextLine(hu_textline_t *t, int x, int y, patch_t **f, int sc);

// returns success

boolean HUlib_addCharToTextLine(hu_textline_t *t, char ch);

// returns success

boolean HUlib_delCharFromTextLine(hu_textline_t *t);

// draws tline

void

HUlib_drawTextLine(hu_textline_t *l, boolean drawcursor);

// erases text line

void

HUlib_eraseTextLine(hu_textline_t *l);

//

//Scrolling Text window widget routines

//?

void

 

HUlib_initSText

 

( hu_stext_t*

s,

int

x,

int

y,

int

h,

patch_t**

font,

int

startchar,

boolean*

on );

// add a new line

void HUlib_addLineToSText(hu_stext_t* s);

// ? void

HUlib_addMessageToSText

( hu_stext_t*

s,

char*

prefix,

char*

msg );

// draws stext

void HUlib_drawSText(hu_stext_t* s);

// erases all stext lines

void HUlib_eraseSText(hu_stext_t* s);

// Input Text Line widget routines void

HUlib_initIText ( hu_itext_t*

int int

patch_t** int boolean*

// enforces left margin

void HUlib_delCharFromIText(hu_itext_t* it);

// enforces left margin

void HUlib_eraseLineFromIText(hu_itext_t* it);

// resets line and left margin

void HUlib_resetIText(hu_itext_t* it);

159

// left of left-margin void HUlib_addPrefixToIText

( hu_itext_t*

it,

char*

str );

// whether eaten

 

boolean

 

HUlib_keyInIText

 

( hu_itext_t*

it,

unsigned char ch );

 

void HUlib_drawIText(hu_itext_t* it);

// erases all itext lines

void HUlib_eraseIText(hu_itext_t* it);

#endif //-----------------------------------------------------------------------------

//

// $Log:$

//

//-----------------------------------------------------------------------------

6.3 hu stu .c

// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------

//

//$Id:$

//Copyright (C) 1993-1996 by id Software, Inc.

//This program 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.

//

//$Log:$

//DESCRIPTION: Heads-up displays

//-----------------------------------------------------------------------------

static const char

rcsid[] = "$Id: hu_stuff.c,v 1.4 1997/02/03 16:47:52 b1 Exp $";

#include <ctype.h>

#include "doomdef.h"

#include "z_zone.h"

#include "m_swap.h"

#include "hu_stuff.h" #include "hu_lib.h" #include "w_wad.h"

160

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]