⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 wi_stuff.c

📁 PIXIL is a small footprint operating environment, complete with PDA PIM applications, a browser and
💻 C
📖 第 1 页 / 共 3 页
字号:
// Emacs style mode select   -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: wi_stuff.c,v 1.2 2003/09/08 22:34:32 jasonk Exp $//// Copyright (C) 1993-1996 by id Software, Inc.//// This source is available for distribution and/or modification// only under the terms of the DOOM Source Code License as// published by id Software. All rights reserved.//// The source is distributed in the hope that it will be useful,// but WITHOUT ANY WARRANTY; without even the implied warranty of// FITNESS FOR A PARTICULAR PURPOSE. See the DOOM Source Code License// for more details.//// $Log: wi_stuff.c,v $// Revision 1.2  2003/09/08 22:34:32  jasonk// Updated files because this fucker won't build for no fucking good reason.//// Revision 1.1.1.1  2003/09/04 21:08:14  jasonk// Initial import//// Revision 1.1  2000/12/08 21:07:54  jeffw// nxdoom initial entry -- No nxdoom/Makefile so it won't build automatically////// DESCRIPTION://	Intermission screens.////-----------------------------------------------------------------------------static const charrcsid[] = "$Id: wi_stuff.c,v 1.2 2003/09/08 22:34:32 jasonk Exp $";#include <stdio.h>#include "m_swap.h"#include "z_zone.h"#include "m_random.h"#include "i_system.h"#include "w_wad.h"#include "g_game.h"#include "r_local.h"#include "s_sound.h"#include "doomstat.h"// Data.#include "sounds.h"// Needs access to LFB.#include "v_video.h"#include "wi_stuff.h"//// Data needed to add patches to full screen intermission pics.// Patches are statistics messages, and animations.// Loads of by-pixel layout and placement, offsets etc.////// Different vetween registered DOOM (1994) and//  Ultimate DOOM - Final edition (retail, 1995?).// This is supposedly ignored for commercial//  release (aka DOOM II), which had 34 maps//  in one episode. So there.#define NUMEPISODES	4#define NUMMAPS		9// in tics//U #define PAUSELEN		(TICRATE*2) //U #define SCORESTEP		100//U #define ANIMPERIOD		32// pixel distance from "(YOU)" to "PLAYER N"//U #define STARDIST		10 //U #define WK 1// GLOBAL LOCATIONS#define WI_TITLEY		2#define WI_SPACINGY    		33// SINGPLE-PLAYER STUFF#define SP_STATSX		50#define SP_STATSY		50#define SP_TIMEX		16#define SP_TIMEY		(SCREENHEIGHT-32)// NET GAME STUFF#define NG_STATSY		50#define NG_STATSX		(32 + SHORT(star->width)/2 + 32*!dofrags)#define NG_SPACINGX    		64// DEATHMATCH STUFF#define DM_MATRIXX		42#define DM_MATRIXY		68#define DM_SPACINGX		40#define DM_TOTALSX		269#define DM_KILLERSX		10#define DM_KILLERSY		100#define DM_VICTIMSX    		5#define DM_VICTIMSY		50typedef enum{    ANIM_ALWAYS,    ANIM_RANDOM,    ANIM_LEVEL} animenum_t;typedef struct{    int		x;    int		y;    } point_t;//// Animation.// There is another anim_t used in p_spec.//typedef struct{    animenum_t	type;    // period in tics between animations    int		period;    // number of animation frames    int		nanims;    // location of animation    point_t	loc;    // ALWAYS: n/a,    // RANDOM: period deviation (<256),    // LEVEL: level    int		data1;    // ALWAYS: n/a,    // RANDOM: random base period,    // LEVEL: n/a    int		data2;     // actual graphics for frames of animations    patch_t*	p[3];     // following must be initialized to zero before use!    // next value of bcnt (used in conjunction with period)    int		nexttic;    // last drawn animation frame    int		lastdrawn;    // next frame number to animate    int		ctr;        // used by RANDOM and LEVEL when animating    int		state;  } anim_t;static point_t lnodes[NUMEPISODES][NUMMAPS] ={    // Episode 0 World Map    {	{ 185, 164 },	// location of level 0 (CJ)	{ 148, 143 },	// location of level 1 (CJ)	{ 69, 122 },	// location of level 2 (CJ)	{ 209, 102 },	// location of level 3 (CJ)	{ 116, 89 },	// location of level 4 (CJ)	{ 166, 55 },	// location of level 5 (CJ)	{ 71, 56 },	// location of level 6 (CJ)	{ 135, 29 },	// location of level 7 (CJ)	{ 71, 24 }	// location of level 8 (CJ)    },    // Episode 1 World Map should go here    {	{ 254, 25 },	// location of level 0 (CJ)	{ 97, 50 },	// location of level 1 (CJ)	{ 188, 64 },	// location of level 2 (CJ)	{ 128, 78 },	// location of level 3 (CJ)	{ 214, 92 },	// location of level 4 (CJ)	{ 133, 130 },	// location of level 5 (CJ)	{ 208, 136 },	// location of level 6 (CJ)	{ 148, 140 },	// location of level 7 (CJ)	{ 235, 158 }	// location of level 8 (CJ)    },    // Episode 2 World Map should go here    {	{ 156, 168 },	// location of level 0 (CJ)	{ 48, 154 },	// location of level 1 (CJ)	{ 174, 95 },	// location of level 2 (CJ)	{ 265, 75 },	// location of level 3 (CJ)	{ 130, 48 },	// location of level 4 (CJ)	{ 279, 23 },	// location of level 5 (CJ)	{ 198, 48 },	// location of level 6 (CJ)	{ 140, 25 },	// location of level 7 (CJ)	{ 281, 136 }	// location of level 8 (CJ)    }};//// Animation locations for episode 0 (1).// Using patches saves a lot of space,//  as they replace 320x200 full screen frames.//static anim_t epsd0animinfo[] ={    { ANIM_ALWAYS, TICRATE/3, 3, { 224, 104 } },    { ANIM_ALWAYS, TICRATE/3, 3, { 184, 160 } },    { ANIM_ALWAYS, TICRATE/3, 3, { 112, 136 } },    { ANIM_ALWAYS, TICRATE/3, 3, { 72, 112 } },    { ANIM_ALWAYS, TICRATE/3, 3, { 88, 96 } },    { ANIM_ALWAYS, TICRATE/3, 3, { 64, 48 } },    { ANIM_ALWAYS, TICRATE/3, 3, { 192, 40 } },    { ANIM_ALWAYS, TICRATE/3, 3, { 136, 16 } },    { ANIM_ALWAYS, TICRATE/3, 3, { 80, 16 } },    { ANIM_ALWAYS, TICRATE/3, 3, { 64, 24 } }};static anim_t epsd1animinfo[] ={    { ANIM_LEVEL, TICRATE/3, 1, { 128, 136 }, 1 },    { ANIM_LEVEL, TICRATE/3, 1, { 128, 136 }, 2 },    { ANIM_LEVEL, TICRATE/3, 1, { 128, 136 }, 3 },    { ANIM_LEVEL, TICRATE/3, 1, { 128, 136 }, 4 },    { ANIM_LEVEL, TICRATE/3, 1, { 128, 136 }, 5 },    { ANIM_LEVEL, TICRATE/3, 1, { 128, 136 }, 6 },    { ANIM_LEVEL, TICRATE/3, 1, { 128, 136 }, 7 },    { ANIM_LEVEL, TICRATE/3, 3, { 192, 144 }, 8 },    { ANIM_LEVEL, TICRATE/3, 1, { 128, 136 }, 8 }};static anim_t epsd2animinfo[] ={    { ANIM_ALWAYS, TICRATE/3, 3, { 104, 168 } },    { ANIM_ALWAYS, TICRATE/3, 3, { 40, 136 } },    { ANIM_ALWAYS, TICRATE/3, 3, { 160, 96 } },    { ANIM_ALWAYS, TICRATE/3, 3, { 104, 80 } },    { ANIM_ALWAYS, TICRATE/3, 3, { 120, 32 } },    { ANIM_ALWAYS, TICRATE/4, 3, { 40, 0 } }};static int NUMANIMS[NUMEPISODES] ={    sizeof(epsd0animinfo)/sizeof(anim_t),    sizeof(epsd1animinfo)/sizeof(anim_t),    sizeof(epsd2animinfo)/sizeof(anim_t)};static anim_t *anims[NUMEPISODES] ={    epsd0animinfo,    epsd1animinfo,    epsd2animinfo};//// GENERAL DATA////// Locally used stuff.//#define FB 0// States for single-player#define SP_KILLS		0#define SP_ITEMS		2#define SP_SECRET		4#define SP_FRAGS		6 #define SP_TIME			8 #define SP_PAR			ST_TIME#define SP_PAUSE		1// in seconds#define SHOWNEXTLOCDELAY	4//#define SHOWLASTLOCDELAY	SHOWNEXTLOCDELAY// used to accelerate or skip a stagestatic int		acceleratestage;// wbs->pnumstatic int		me; // specifies current statestatic stateenum_t	state;// contains information passed into intermissionstatic wbstartstruct_t*	wbs;static wbplayerstruct_t* plrs;  // wbs->plyr[]// used for general timingstatic int 		cnt;  // used for timing of background animationstatic int 		bcnt;// signals to refresh everything for one framestatic int 		firstrefresh; static int		cnt_kills[MAXPLAYERS];static int		cnt_items[MAXPLAYERS];static int		cnt_secret[MAXPLAYERS];static int		cnt_time;static int		cnt_par;static int		cnt_pause;// # of commercial levelsstatic int		NUMCMAPS; ////	GRAPHICS//// background (map of levels).static patch_t*		bg;// You Are Here graphicstatic patch_t*		yah[2]; // splatstatic patch_t*		splat;// %, : graphicsstatic patch_t*		percent;static patch_t*		colon;// 0-9 graphicstatic patch_t*		num[10];// minus signstatic patch_t*		wiminus;// "Finished!" graphicsstatic patch_t*		finished;// "Entering" graphicstatic patch_t*		entering; // "secret"static patch_t*		sp_secret; // "Kills", "Scrt", "Items", "Frags"static patch_t*		kills;static patch_t*		secret;static patch_t*		items;static patch_t*		frags;// Time sucks.static patch_t*		d_time;static patch_t*		par;static patch_t*		sucks;// "killers", "victims"static patch_t*		killers;static patch_t*		victims; // "Total", your face, your dead facestatic patch_t*		total;static patch_t*		star;static patch_t*		bstar;// "red P[1..MAXPLAYERS]"static patch_t*		p[MAXPLAYERS];// "gray P[1..MAXPLAYERS]"static patch_t*		bp[MAXPLAYERS]; // Name graphics of each level (centered)static patch_t**	lnames;//// CODE//// slam background// UNUSED static unsigned char *background=0;void WI_slamBackground(void){    memcpy(screens[0], screens[1], SCREENWIDTH * SCREENHEIGHT);    V_MarkRect (0, 0, SCREENWIDTH, SCREENHEIGHT);}// The ticker is used to detect keys//  because of timing issues in netgames.boolean WI_Responder(event_t* ev){    return false;}// Draws "<Levelname> Finished!"void WI_drawLF(void){    int y = WI_TITLEY;    // draw <LevelName>     V_DrawPatch((SCREENWIDTH - SHORT(lnames[wbs->last]->width))/2,		y, FB, lnames[wbs->last]);    // draw "Finished!"    y += (5*SHORT(lnames[wbs->last]->height))/4;        V_DrawPatch((SCREENWIDTH - SHORT(finished->width))/2,		y, FB, finished);}// Draws "Entering <LevelName>"void WI_drawEL(void){    int y = WI_TITLEY;    // draw "Entering"    V_DrawPatch((SCREENWIDTH - SHORT(entering->width))/2,		y, FB, entering);    // draw level    y += (5*SHORT(lnames[wbs->next]->height))/4;    V_DrawPatch((SCREENWIDTH - SHORT(lnames[wbs->next]->width))/2,		y, FB, lnames[wbs->next]);}voidWI_drawOnLnode( int		n,  patch_t*	c[] ){    int		i;    int		left;    int		top;    int		right;    int		bottom;    boolean	fits = false;    i = 0;    do    {	left = lnodes[wbs->epsd][n].x - SHORT(c[i]->leftoffset);	top = lnodes[wbs->epsd][n].y - SHORT(c[i]->topoffset);	right = left + SHORT(c[i]->width);	bottom = top + SHORT(c[i]->height);	if (left >= 0	    && right < SCREENWIDTH	    && top >= 0	    && bottom < SCREENHEIGHT)	{	    fits = true;	}	else	{	    i++;	}    } while (!fits && i!=2);    if (fits && i<2)    {	V_DrawPatch(lnodes[wbs->epsd][n].x, lnodes[wbs->epsd][n].y,		    FB, c[i]);    }    else    {	// DEBUG	printf("Could not place patch on level %d", n+1);     }}void WI_initAnimatedBack(void){    int		i;    anim_t*	a;    if (gamemode == commercial)	return;    if (wbs->epsd > 2)	return;    for (i=0;i<NUMANIMS[wbs->epsd];i++)    {	a = &anims[wbs->epsd][i];	// init variables	a->ctr = -1;	// specify the next time to draw it	if (a->type == ANIM_ALWAYS)	    a->nexttic = bcnt + 1 + (M_Random()%a->period);	else if (a->type == ANIM_RANDOM)	    a->nexttic = bcnt + 1 + a->data2+(M_Random()%a->data1);	else if (a->type == ANIM_LEVEL)	    a->nexttic = bcnt + 1;    }}void WI_updateAnimatedBack(void){    int		i;    anim_t*	a;    if (gamemode == commercial)	return;    if (wbs->epsd > 2)	return;    for (i=0;i<NUMANIMS[wbs->epsd];i++)    {	a = &anims[wbs->epsd][i];	if (bcnt == a->nexttic)	{	    switch (a->type)	    {	      case ANIM_ALWAYS:		if (++a->ctr >= a->nanims) a->ctr = 0;		a->nexttic = bcnt + a->period;		break;	      case ANIM_RANDOM:		a->ctr++;		if (a->ctr == a->nanims)		{		    a->ctr = -1;		    a->nexttic = bcnt+a->data2+(M_Random()%a->data1);		}		else a->nexttic = bcnt + a->period;		break;			      case ANIM_LEVEL:		// gawd-awful hack for level anims		if (!(state == StatCount && i == 7)		    && wbs->next == a->data1)		{		    a->ctr++;		    if (a->ctr == a->nanims) a->ctr--;		    a->nexttic = bcnt + a->period;		}		break;	    }	}    }}void WI_drawAnimatedBack(void){    int			i;    anim_t*		a;    if (commercial)	return;    if (wbs->epsd > 2)	return;    for (i=0 ; i<NUMANIMS[wbs->epsd] ; i++)    {	a = &anims[wbs->epsd][i];	if (a->ctr >= 0)	    V_DrawPatch(a->loc.x, a->loc.y, FB, a->p[a->ctr]);    }}//// Draws a number.// If digits > 0, then use that many digits minimum,//  otherwise only use as many as necessary.// Returns new x position.//int

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -