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

📄 am_map.c

📁 使用Doom引擎开发的著名游戏《毁灭巫师》的源代码。
💻 C
📖 第 1 页 / 共 3 页
字号:
//**************************************************************************//**//** am_map.c : Heretic 2 : Raven Software, Corp.//**//** $RCSfile: am_map.c,v $//** $Revision: 1.22 $//** $Date: 96/01/06 18:37:23 $//** $Author: bgokey $//**//**************************************************************************#include "h2def.h"#include "p_local.h"#include "am_map.h"#include "am_data.h"#include <stdio.h>#define NUMALIAS 3 // Number of antialiased lines.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-SBARHEIGHT-3;static int f_x, f_y; // location of window on screenstatic int f_w, f_h; // size of window on screenstatic 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, m_h;static fixed_t min_x, min_y; // based on level sizestatic fixed_t max_x, max_y; // based on level sizestatic fixed_t max_w, max_h; // max_x-min_x, max_y-min_ystatic fixed_t min_w, min_h; // based on player sizestatic 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 vertex_t oldplr;//static patch_t *marknums[10]; // numbers used for marking by the automap//static mpoint_t markpoints[AM_NUMMARKPOINTS]; // where the points are//static int markpointnum = 0; // next point to be assignedstatic int followplayer = 1; // specifies whether to follow the player aroundstatic char cheat_kills[] = { 'k', 'i', 'l', 'l', 's' };static boolean ShowKills = 0;static unsigned ShowKillsCount = 0;extern boolean viewactive;static byte antialias[NUMALIAS][8]={	{ 83, 84, 85, 86, 87, 88, 89, 90 },	{ 96, 96, 95, 94, 93, 92, 91, 90 },	{ 107, 108, 109, 110, 111, 112, 89, 90 }};/*static byte *aliasmax[NUMALIAS] = {	&antialias[0][7], &antialias[1][7], &antialias[2][7]};*/static byte *maplump; // pointer to the raw data for the automap background.static short mapystart=0; // y-value for the start of the map bitmap...used in										//the parallax stuff.static short mapxstart=0; //x-value for the bitmap.//byte screens[][SCREENWIDTH*SCREENHEIGHT];//void V_MarkRect (int x, int y, int width, int height);// Functionsvoid DrawWuLine(int X0, int Y0, int X1, int Y1, byte *BaseColor,	int NumLevels, unsigned short IntensityBits);void AM_DrawDeathmatchStats(void);static void DrawWorldTimer(void);// 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.// Ripped out for Heretic/*void AM_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;}*/void AM_findMinMaxBoundaries(void){  int i;  fixed_t a, 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;  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;		m_paninc.x=0;  }  else if (m_x + m_w/2 < min_x)  {  		m_x = min_x - m_w/2;		m_paninc.x=0;  }  if (m_y + m_h/2 > max_y)  {  		m_y = max_y - m_h/2;		m_paninc.y=0;  }  else if (m_y + m_h/2 < min_y)  {  		m_y = min_y - m_h/2;		m_paninc.y=0;  }/*  mapxstart += MTOF(m_paninc.x+FRACUNIT/2);  mapystart -= MTOF(m_paninc.y+FRACUNIT/2);  if(mapxstart >= finit_width)		mapxstart -= finit_width;  if(mapxstart < 0)		mapxstart += finit_width;  if(mapystart >= finit_height)		mapystart -= finit_height;  if(mapystart < 0)		mapystart += finit_height;*/  m_x2 = m_x + m_w;  m_y2 = m_y + m_h;}void AM_initVariables(void){  int pnum;	thinker_t *think;	mobj_t *mo;  //static event_t st_notify = { ev_keyup, AM_MSGENTERED };  automapactive = true;  fb = screen;  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];  oldplr.x = plr->mo->x;  oldplr.y = plr->mo->y;  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;	// load in the location of keys, if in baby mode//	memset(KeyPoints, 0, sizeof(vertex_t)*3);	if(gameskill == sk_baby)	{		for(think = thinkercap.next; think != &thinkercap; think = think->next)		{			if(think->function != P_MobjThinker)			{ //not a mobj				continue;			}			mo = (mobj_t *)think;		}	}  // inform the status bar of the change//c  ST_Responder(&st_notify);}void AM_loadPics(void){  maplump = W_CacheLumpName("AUTOPAGE", PU_STATIC);}/*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 myselfvoid AM_LevelInit(void){  leveljuststarted = 0;  f_x = f_y = 0;  f_w = finit_width;  f_h = finit_height;	mapxstart = mapystart = 0;//  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);}static boolean stopped = true;void AM_Stop (void){  //static event_t st_notify = { 0, ev_keyup, AM_MSGEXITED };//  AM_unloadPics();  automapactive = false;//  ST_Responder(&st_notify);  stopped = true;	BorderNeedRefresh = true;}void AM_Start (void){  static int lastlevel = -1, lastepisode = -1;  if (!stopped) AM_Stop();  stopped = false;  if(gamestate != GS_LEVEL)  {		return; // don't show automap if we aren't in a game!  }  if (lastlevel != gamemap || lastepisode != gameepisode)  {    AM_LevelInit();    lastlevel = gamemap;    lastepisode = gameepisode;  }  AM_initVariables();  AM_loadPics();}// set the window scale to the maximum sizevoid AM_minOutWindowScale(void){  scale_mtof = min_scale_mtof;  scale_ftom = FixedDiv(FRACUNIT, scale_mtof);  AM_activateNewScale();}// set the window scale to the minimum sizevoid AM_maxOutWindowScale(void){  scale_mtof = max_scale_mtof;  scale_ftom = FixedDiv(FRACUNIT, scale_mtof);  AM_activateNewScale();}boolean AM_Responder (event_t *ev){	int rc;	static int cheatstate=0;	static int bigstate=0;		rc = false;	if (!automapactive)	{		if (ev->type == ev_keydown && ev->data1 == AM_STARTKEY			&& gamestate == GS_LEVEL)		{			AM_Start ();			SB_state = -1;			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 ();				SB_state = -1;				break;			case AM_GOBIGKEY:				bigstate = !bigstate;				if (bigstate)				{					AM_saveScaleAndLoc();					AM_minOutWindowScale();				}				else AM_restoreScaleAndLoc();				break;			case AM_FOLLOWKEY:				followplayer = !followplayer;				f_oldloc.x = MAXINT;				P_SetMessage(plr, 					followplayer ? AMSTR_FOLLOWON : AMSTR_FOLLOWOFF, true);				break;			default:				cheatstate=0;				rc = false;		}

⌨️ 快捷键说明

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