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

📄 am_map.c

📁 PIXIL is a small footprint operating environment, complete with PDA PIM applications, a browser and
💻 C
📖 第 1 页 / 共 2 页
字号:
// Emacs style mode select   -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: am_map.c,v 1.2 2003/09/08 22:34:26 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: am_map.c,v $// Revision 1.2  2003/09/08 22:34:26  jasonk// Updated files because this fucker won't build for no fucking good reason.//// Revision 1.1.1.1  2003/09/04 21:08:12  jasonk// Initial import//// Revision 1.1  2000/12/08 21:07:51  jeffw// nxdoom initial entry -- No nxdoom/Makefile so it won't build automatically////// DESCRIPTION:  the automap code////-----------------------------------------------------------------------------static const char rcsid[] = "$Id: am_map.c,v 1.2 2003/09/08 22:34:26 jasonk Exp $";#include <stdio.h>#include "z_zone.h"#include "doomdef.h"#include "st_stuff.h"#include "p_local.h"#include "w_wad.h"#include "m_cheat.h"#include "i_system.h"// Needs access to LFB.#include "v_video.h"// State.#include "doomstat.h"#include "r_state.h"// Data.#include "dstrings.h"#include "am_map.h"// For use if I do walls with outsides/insides#define REDS		(256-5*16)#define REDRANGE	16#define BLUES		(256-4*16+8)#define BLUERANGE	8#define GREENS		(7*16)#define GREENRANGE	16#define GRAYS		(6*16)#define GRAYSRANGE	16#define BROWNS		(4*16)#define BROWNRANGE	16#define YELLOWS		(256-32+7)#define YELLOWRANGE	1#define BLACK		0#define WHITE		(256-47)// Automap colors#define BACKGROUND	BLACK#define YOURCOLORS	WHITE#define YOURRANGE	0#define WALLCOLORS	REDS#define WALLRANGE	REDRANGE#define TSWALLCOLORS	GRAYS#define TSWALLRANGE	GRAYSRANGE#define FDWALLCOLORS	BROWNS#define FDWALLRANGE	BROWNRANGE#define CDWALLCOLORS	YELLOWS#define CDWALLRANGE	YELLOWRANGE#define THINGCOLORS	GREENS#define THINGRANGE	GREENRANGE#define SECRETWALLCOLORS WALLCOLORS#define SECRETWALLRANGE WALLRANGE#define GRIDCOLORS	(GRAYS + GRAYSRANGE/2)#define GRIDRANGE	0#define XHAIRCOLORS	GRAYS// drawing stuff#define	FB		0#define AM_PANDOWNKEY	KEY_DOWNARROW#define AM_PANUPKEY	KEY_UPARROW#define AM_PANRIGHTKEY	KEY_RIGHTARROW#define AM_PANLEFTKEY	KEY_LEFTARROW#define AM_ZOOMINKEY	'='#define AM_ZOOMOUTKEY	'-'#define AM_STARTKEY	KEY_TAB#define AM_ENDKEY	KEY_TAB#define AM_GOBIGKEY	'0'#define AM_FOLLOWKEY	'f'#define AM_GRIDKEY	'g'#define AM_MARKKEY	'm'#define AM_CLEARMARKKEY	'c'#define AM_NUMMARKPOINTS 10// scale on entry#define INITSCALEMTOF (.2*FRACUNIT)// how much the automap moves window per tic in frame-buffer coordinates// moves 140 pixels in 1 second#define F_PANINC	4// how much zoom-in per tic// goes to 2x in 1 second#define M_ZOOMIN        ((int) (1.02*FRACUNIT))// how much zoom-out per tic// pulls out to 0.5x in 1 second#define M_ZOOMOUT       ((int) (FRACUNIT/1.02))// translates between frame-buffer and map distances#define FTOM(x) FixedMul(((x)<<16),scale_ftom)#define MTOF(x) (FixedMul((x),scale_mtof)>>16)// translates between frame-buffer and map coordinates#define CXMTOF(x)  (f_x + MTOF((x)-m_x))#define CYMTOF(y)  (f_y + (f_h - MTOF((y)-m_y)))// the following is crap#define LINE_NEVERSEE ML_DONTDRAWtypedef struct{    int x, y;} fpoint_t;typedef struct{    fpoint_t a, b;} fline_t;typedef struct{    fixed_t		x,y;} mpoint_t;typedef struct{    mpoint_t a, b;} mline_t;typedef struct{    fixed_t slp, islp;} islope_t;//// The vector graphics for the automap.//  A line drawing of the player pointing right,//   starting from the middle.//#define R ((8*PLAYERRADIUS)/7)mline_t player_arrow[] = {    { { -R+R/8, 0 }, { R, 0 } }, // -----    { { R, 0 }, { R-R/2, R/4 } },  // ----->    { { R, 0 }, { R-R/2, -R/4 } },    { { -R+R/8, 0 }, { -R-R/8, R/4 } }, // >---->    { { -R+R/8, 0 }, { -R-R/8, -R/4 } },    { { -R+3*R/8, 0 }, { -R+R/8, R/4 } }, // >>--->    { { -R+3*R/8, 0 }, { -R+R/8, -R/4 } }};#undef R#define NUMPLYRLINES (sizeof(player_arrow)/sizeof(mline_t))#define R ((8*PLAYERRADIUS)/7)mline_t cheat_player_arrow[] = {    { { -R+R/8, 0 }, { R, 0 } }, // -----    { { R, 0 }, { R-R/2, R/6 } },  // ----->    { { R, 0 }, { R-R/2, -R/6 } },    { { -R+R/8, 0 }, { -R-R/8, R/6 } }, // >----->    { { -R+R/8, 0 }, { -R-R/8, -R/6 } },    { { -R+3*R/8, 0 }, { -R+R/8, R/6 } }, // >>----->    { { -R+3*R/8, 0 }, { -R+R/8, -R/6 } },    { { -R/2, 0 }, { -R/2, -R/6 } }, // >>-d--->    { { -R/2, -R/6 }, { -R/2+R/6, -R/6 } },    { { -R/2+R/6, -R/6 }, { -R/2+R/6, R/4 } },    { { -R/6, 0 }, { -R/6, -R/6 } }, // >>-dd-->    { { -R/6, -R/6 }, { 0, -R/6 } },    { { 0, -R/6 }, { 0, R/4 } },    { { R/6, R/4 }, { R/6, -R/7 } }, // >>-ddt->    { { R/6, -R/7 }, { R/6+R/32, -R/7-R/32 } },    { { R/6+R/32, -R/7-R/32 }, { R/6+R/10, -R/7 } }};#undef R#define NUMCHEATPLYRLINES (sizeof(cheat_player_arrow)/sizeof(mline_t))#define R (FRACUNIT)mline_t triangle_guy[] = {    { { -.867*R, -.5*R }, { .867*R, -.5*R } },    { { .867*R, -.5*R } , { 0, R } },    { { 0, R }, { -.867*R, -.5*R } }};#undef R#define NUMTRIANGLEGUYLINES (sizeof(triangle_guy)/sizeof(mline_t))#define R (FRACUNIT)mline_t thintriangle_guy[] = {    { { -.5*R, -.7*R }, { R, 0 } },    { { R, 0 }, { -.5*R, .7*R } },    { { -.5*R, .7*R }, { -.5*R, -.7*R } }};#undef R#define NUMTHINTRIANGLEGUYLINES (sizeof(thintriangle_guy)/sizeof(mline_t))static int 	cheating = 0;static int 	grid = 0;static int 	leveljuststarted = 1; 	// kluge until AM_LevelInit() is calledboolean    	automapactive = false;static int 	finit_width = SCREENWIDTH;static int 	finit_height = SCREENHEIGHT - 32;// location of window on screenstatic int 	f_x;static int	f_y;// size of window on screenstatic int 	f_w;static int	f_h;static int 	lightlev; 		// used for funky strobing effectstatic byte*	fb; 			// pseudo-frame bufferstatic int 	amclock;static mpoint_t m_paninc; // how far the window pans each tic (map coords)static fixed_t 	mtof_zoommul; // how far the window zooms in each tic (map coords)static fixed_t 	ftom_zoommul; // how far the window zooms in each tic (fb coords)static fixed_t 	m_x, m_y;   // LL x,y where the window is on the map (map coords)static fixed_t 	m_x2, m_y2; // UR x,y where the window is on the map (map coords)//// width/height of window on map (map coords)//static fixed_t 	m_w;static fixed_t	m_h;// based on level sizestatic fixed_t 	min_x;static fixed_t	min_y; static fixed_t 	max_x;static fixed_t  max_y;static fixed_t 	max_w; // max_x-min_x,static fixed_t  max_h; // max_y-min_y// based on player sizestatic fixed_t 	min_w;static fixed_t  min_h;static fixed_t 	min_scale_mtof; // used to tell when to stop zooming outstatic fixed_t 	max_scale_mtof; // used to tell when to stop zooming in// old stuff for recovery laterstatic fixed_t old_m_w, old_m_h;static fixed_t old_m_x, old_m_y;// old location used by the Follower routinestatic mpoint_t f_oldloc;// used by MTOF to scale from map-to-frame-buffer coordsstatic fixed_t scale_mtof = INITSCALEMTOF;// used by FTOM to scale from frame-buffer-to-map coords (=1/scale_mtof)static fixed_t scale_ftom;static player_t *plr; // the player represented by an arrowstatic patch_t *marknums[10]; // numbers used for marking by the automapstatic mpoint_t markpoints[AM_NUMMARKPOINTS]; // where the points arestatic int markpointnum = 0; // next point to be assignedstatic int followplayer = 1; // specifies whether to follow the player aroundstatic unsigned char cheat_amap_seq[] = { 0xb2, 0x26, 0x26, 0x2e, 0xff };static cheatseq_t cheat_amap = { cheat_amap_seq, 0 };static boolean stopped = true;extern boolean viewactive;//extern byte screens[][SCREENWIDTH*SCREENHEIGHT];voidV_MarkRect( int	x,  int	y,  int	width,  int	height );// Calculates the slope and slope according to the x-axis of a line// segment in map coordinates (with the upright y-axis n' all) so// that it can be used with the brain-dead drawing stuff.voidAM_getIslope( mline_t*	ml,  islope_t*	is ){    int dx, dy;    dy = ml->a.y - ml->b.y;    dx = ml->b.x - ml->a.x;    if (!dy) is->islp = (dx<0?-MAXINT:MAXINT);    else is->islp = FixedDiv(dx, dy);    if (!dx) is->slp = (dy<0?-MAXINT:MAXINT);    else is->slp = FixedDiv(dy, dx);}//////void AM_activateNewScale(void){    m_x += m_w/2;    m_y += m_h/2;    m_w = FTOM(f_w);    m_h = FTOM(f_h);    m_x -= m_w/2;    m_y -= m_h/2;    m_x2 = m_x + m_w;    m_y2 = m_y + m_h;}//////void AM_saveScaleAndLoc(void){    old_m_x = m_x;    old_m_y = m_y;    old_m_w = m_w;    old_m_h = m_h;}//////void AM_restoreScaleAndLoc(void){    m_w = old_m_w;    m_h = old_m_h;    if (!followplayer)    {	m_x = old_m_x;	m_y = old_m_y;    } else {	m_x = plr->mo->x - m_w/2;	m_y = plr->mo->y - m_h/2;    }    m_x2 = m_x + m_w;    m_y2 = m_y + m_h;    // Change the scaling multipliers    scale_mtof = FixedDiv(f_w<<FRACBITS, m_w);    scale_ftom = FixedDiv(FRACUNIT, scale_mtof);}//// adds a marker at the current location//void AM_addMark(void){    markpoints[markpointnum].x = m_x + m_w/2;    markpoints[markpointnum].y = m_y + m_h/2;    markpointnum = (markpointnum + 1) % AM_NUMMARKPOINTS;}//// Determines bounding box of all vertices,// sets global variables controlling zoom range.//void AM_findMinMaxBoundaries(void){    int i;    fixed_t a;    fixed_t b;    min_x = min_y =  MAXINT;    max_x = max_y = -MAXINT;      for (i=0;i<numvertexes;i++)    {	if (vertexes[i].x < min_x)	    min_x = vertexes[i].x;	else if (vertexes[i].x > max_x)	    max_x = vertexes[i].x;    	if (vertexes[i].y < min_y)	    min_y = vertexes[i].y;	else if (vertexes[i].y > max_y)	    max_y = vertexes[i].y;    }      max_w = max_x - min_x;    max_h = max_y - min_y;    min_w = 2*PLAYERRADIUS; // const? never changed?    min_h = 2*PLAYERRADIUS;    a = FixedDiv(f_w<<FRACBITS, max_w);    b = FixedDiv(f_h<<FRACBITS, max_h);      min_scale_mtof = a < b ? a : b;    max_scale_mtof = FixedDiv(f_h<<FRACBITS, 2*PLAYERRADIUS);}//////void AM_changeWindowLoc(void){    if (m_paninc.x || m_paninc.y)    {	followplayer = 0;	f_oldloc.x = MAXINT;    }    m_x += m_paninc.x;    m_y += m_paninc.y;    if (m_x + m_w/2 > max_x)	m_x = max_x - m_w/2;    else if (m_x + m_w/2 < min_x)	m_x = min_x - m_w/2;      if (m_y + m_h/2 > max_y)	m_y = max_y - m_h/2;    else if (m_y + m_h/2 < min_y)	m_y = min_y - m_h/2;    m_x2 = m_x + m_w;    m_y2 = m_y + m_h;}//////void AM_initVariables(void){    int pnum;    static event_t st_notify = { ev_keyup, AM_MSGENTERED };    automapactive = true;    fb = screens[0];    f_oldloc.x = MAXINT;    amclock = 0;    lightlev = 0;    m_paninc.x = m_paninc.y = 0;    ftom_zoommul = FRACUNIT;    mtof_zoommul = FRACUNIT;    m_w = FTOM(f_w);    m_h = FTOM(f_h);    // find player to center on initially    if (!playeringame[pnum = consoleplayer])	for (pnum=0;pnum<MAXPLAYERS;pnum++)	    if (playeringame[pnum])		break;      plr = &players[pnum];    m_x = plr->mo->x - m_w/2;    m_y = plr->mo->y - m_h/2;    AM_changeWindowLoc();    // for saving & restoring    old_m_x = m_x;    old_m_y = m_y;    old_m_w = m_w;    old_m_h = m_h;    // inform the status bar of the change    ST_Responder(&st_notify);}//// //void AM_loadPics(void){    int i;    char namebuf[9];      for (i=0;i<10;i++)    {	sprintf(namebuf, "AMMNUM%d", i);	marknums[i] = W_CacheLumpName(namebuf, PU_STATIC);    }}void AM_unloadPics(void){    int i;      for (i=0;i<10;i++)	Z_ChangeTag(marknums[i], PU_CACHE);}void AM_clearMarks(void){    int i;    for (i=0;i<AM_NUMMARKPOINTS;i++)	markpoints[i].x = -1; // means empty    markpointnum = 0;}//// should be called at the start of every level// right now, i figure it out myself//void AM_LevelInit(void){    leveljuststarted = 0;    f_x = f_y = 0;    f_w = finit_width;    f_h = finit_height;    AM_clearMarks();    AM_findMinMaxBoundaries();    scale_mtof = FixedDiv(min_scale_mtof, (int) (0.7*FRACUNIT));    if (scale_mtof > max_scale_mtof)	scale_mtof = min_scale_mtof;    scale_ftom = FixedDiv(FRACUNIT, scale_mtof);}//////void AM_Stop (void){    static event_t st_notify = { 0, ev_keyup, AM_MSGEXITED };    AM_unloadPics();    automapactive = false;    ST_Responder(&st_notify);    stopped = true;}//////void AM_Start (void){    static int lastlevel = -1, lastepisode = -1;    if (!stopped) AM_Stop();    stopped = false;    if (lastlevel != gamemap || lastepisode != gameepisode)    {	AM_LevelInit();	lastlevel = gamemap;	lastepisode = gameepisode;    }    AM_initVariables();    AM_loadPics();}//// set the window scale to the maximum size//void AM_minOutWindowScale(void){    scale_mtof = min_scale_mtof;    scale_ftom = FixedDiv(FRACUNIT, scale_mtof);    AM_activateNewScale();}//// set the window scale to the minimum size//void AM_maxOutWindowScale(void){    scale_mtof = max_scale_mtof;    scale_ftom = FixedDiv(FRACUNIT, scale_mtof);    AM_activateNewScale();}//// Handle events (user inputs) in automap mode//booleanAM_Responder( event_t*	ev ){    int rc;    static int cheatstate=0;    static int bigstate=0;    static char buffer[20];    rc = false;    if (!automapactive)    {	if (ev->type == ev_keydown && ev->data1 == AM_STARTKEY)	{	    AM_Start ();	    viewactive = false;	    rc = true;	}    }    else if (ev->type == ev_keydown)    {	rc = true;	switch(ev->data1)	{	  case AM_PANRIGHTKEY: // pan right	    if (!followplayer) m_paninc.x = FTOM(F_PANINC);	    else rc = false;	    break;	  case AM_PANLEFTKEY: // pan left	    if (!followplayer) m_paninc.x = -FTOM(F_PANINC);	    else rc = false;	    break;	  case AM_PANUPKEY: // pan up	    if (!followplayer) m_paninc.y = FTOM(F_PANINC);	    else rc = false;	    break;	  case AM_PANDOWNKEY: // pan down	    if (!followplayer) m_paninc.y = -FTOM(F_PANINC);	    else rc = false;	    break;	  case AM_ZOOMOUTKEY: // zoom out	    mtof_zoommul = M_ZOOMOUT;	    ftom_zoommul = M_ZOOMIN;	    break;	  case AM_ZOOMINKEY: // zoom in	    mtof_zoommul = M_ZOOMIN;	    ftom_zoommul = M_ZOOMOUT;	    break;	  case AM_ENDKEY:	    bigstate = 0;	    viewactive = true;	    AM_Stop ();	    break;	  case AM_GOBIGKEY:	    bigstate = !bigstate;

⌨️ 快捷键说明

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