📄 am_map.c
字号:
// Emacs style mode select -*- C++ -*- //-----------------------------------------------------------------------------//// $Id: am_map.c,v 1.8 2001/03/03 06:17:33 bpereira Exp $//// Copyright (C) 1993-1996 by id Software, Inc.// Portions Copyright (C) 1998-2000 by DooM Legacy Team.//// 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: am_map.c,v $// Revision 1.8 2001/03/03 06:17:33 bpereira// no message//// Revision 1.7 2001/02/28 17:50:54 bpereira// no message//// Revision 1.6 2001/02/24 13:35:19 bpereira// no message//// Revision 1.5 2001/02/10 13:14:53 hurdler// to be fixed//// Revision 1.4 2001/02/10 12:27:13 bpereira// no message//// Revision 1.3 2001/01/25 22:15:41 bpereira// added heretic support//// Revision 1.2 2000/02/27 00:42:10 hurdler// fix CR+LF problem//// Revision 1.1.1.1 2000/02/22 20:32:33 hurdler// Initial import into CVS (v1.29 pr3)////// DESCRIPTION: // the automap code////-----------------------------------------------------------------------------#include "doomdef.h"#include "doomstat.h"#include "g_game.h"#include "am_map.h"#include "g_input.h"#include "m_cheat.h"#include "p_local.h"#include "r_defs.h"#include "v_video.h"#include "st_stuff.h"#include "i_system.h"#include "i_video.h"#include "r_state.h"#include "dstrings.h"#include "keys.h"#include "w_wad.h"#include "z_zone.h"#include "r_draw.h"#include "r_main.h"#include "p_info.h"#ifdef HWRENDER#include "hardware/hw_main.h"#endif// For use if I do walls with outsides/insidesstatic byte REDS = (256-5*16);static byte REDRANGE = 16;static byte BLUES = (256-4*16+8);static byte BLUERANGE = 8;static byte GREENS = (7*16);static byte GREENRANGE = 16;static byte GRAYS = (6*16);static byte GRAYSRANGE = 16;static byte BROWNS = (4*16);static byte BROWNRANGE = 16;static byte YELLOWS = (256-32+7);static byte YELLOWRANGE = 1;static byte DBLACK = 0;static byte DWHITE = (256-47);// Automap colors#define BACKGROUND DBLACK#define YOURCOLORS DWHITE#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{ 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[] = { { { (fixed_t)-.867*R, (fixed_t)-.5*R }, { (fixed_t) .867*R, (fixed_t)-.5*R } }, { { (fixed_t) .867*R, (fixed_t)-.5*R }, { (fixed_t) 0, (fixed_t) R } }, { { (fixed_t) 0, (fixed_t) R }, { (fixed_t)-.867*R, (fixed_t)-.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 bigstate; //added:24-01-98:moved here, toggle between // user view and large view (full map view)int am_cheating = 0;static int grid = 0;static int leveljuststarted = 1; // kluge until AM_LevelInit() is calledboolean automapactive = false;boolean am_recalc = false; //added:05-02-98:true when screen size // changes// 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 boolean stopped = true;static byte BLUEKEYCOLOR;static byte YELLOWKEYCOLOR;static byte REDKEYCOLOR;// function for drawing lines, depends on rendermodetypedef void (*AMDRAWFLINEFUNC) (fline_t* fl, int color);static AMDRAWFLINEFUNC AM_drawFline;void V_MarkRect( int x, int y, int width, int height );void AM_drawFline_soft ( fline_t* fl, int color );// 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;}//////static 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];
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -