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

📄 g_game.c

📁 Nxdoom真的满好用的
💻 C
📖 第 1 页 / 共 3 页
字号:
	wminfo.partime = 35*pars[gameepisode][gamemap];     wminfo.pnum = consoleplayer;      for (i=0 ; i<MAXPLAYERS ; i++)     { 	wminfo.plyr[i].in = playeringame[i]; 	wminfo.plyr[i].skills = players[i].killcount; 	wminfo.plyr[i].sitems = players[i].itemcount; 	wminfo.plyr[i].ssecret = players[i].secretcount; 	wminfo.plyr[i].stime = leveltime; 	memcpy (wminfo.plyr[i].frags, players[i].frags 		, sizeof(wminfo.plyr[i].frags));     }      gamestate = GS_INTERMISSION;     viewactive = false;     automapactive = false;      if (statcopy)	memcpy (statcopy, &wminfo, sizeof(wminfo));	    WI_Start (&wminfo); } //// G_WorldDone //void G_WorldDone (void) {     gameaction = ga_worlddone;     if (secretexit) 	players[consoleplayer].didsecret = true;     if ( gamemode == commercial )    {	switch (gamemap)	{	  case 15:	  case 31:	    if (!secretexit)		break;	  case 6:	  case 11:	  case 20:	  case 30:	    F_StartFinale ();	    break;	}    }}  void G_DoWorldDone (void) {            gamestate = GS_LEVEL;     gamemap = wminfo.next+1;     G_DoLoadLevel ();     gameaction = ga_nothing;     viewactive = true; }  //// G_InitFromSavegame// Can be called by the startup code or the menu task. //extern boolean setsizeneeded;void R_ExecuteSetViewSize (void);char	savename[256];void G_LoadGame (char* name) {     strcpy (savename, name);     gameaction = ga_loadgame; }  #define VERSIONSIZE		16 void G_DoLoadGame (void) {     int		length;     int		i;     int		a,b,c;     char	vcheck[VERSIONSIZE]; 	     gameaction = ga_nothing; 	     length = M_ReadFile (savename, &savebuffer);     save_p = savebuffer + SAVESTRINGSIZE;        // skip the description field     memset (vcheck,0,sizeof(vcheck));     sprintf (vcheck,"version %i",VERSION_NUM);     if (strcmp ((char *)save_p, vcheck)) 	return;				// bad version     save_p += VERSIONSIZE; 			     gameskill = *save_p++;     gameepisode = *save_p++;     gamemap = *save_p++;     for (i=0 ; i<MAXPLAYERS ; i++) 	playeringame[i] = *save_p++;     // load a base level     G_InitNew (gameskill, gameepisode, gamemap);      // get the times     a = *save_p++;     b = *save_p++;     c = *save_p++;     leveltime = (a<<16) + (b<<8) + c; 	     // dearchive all the modifications    P_UnArchivePlayers ();     P_UnArchiveWorld ();     P_UnArchiveThinkers ();     P_UnArchiveSpecials ();      if (*save_p != 0x1d) 	I_Error ("Bad savegame");        // done     Z_Free (savebuffer);      if (setsizeneeded)	R_ExecuteSetViewSize ();        // draw the pattern into the back screen    R_FillBackScreen ();   }  //// G_SaveGame// Called by the menu task.// Description is a 24 byte text string //voidG_SaveGame( int	slot,  char*	description ) {     savegameslot = slot;     strcpy (savedescription, description);     sendsave = true; }  void G_DoSaveGame (void) {     char	name[100];     char	name2[VERSIONSIZE];     char*	description;     int		length;     int		i; 	    if (M_CheckParm("-cdrom"))	sprintf(name,"c:\\doomdata\\"SAVEGAMENAME"%d.dsg",savegameslot);    else	sprintf (name,SAVEGAMENAME"%d.dsg",savegameslot);     description = savedescription; 	     save_p = savebuffer = screens[1]+0x4000; 	     memcpy (save_p, description, SAVESTRINGSIZE);     save_p += SAVESTRINGSIZE;     memset (name2,0,sizeof(name2));     sprintf (name2,"version %i",VERSION_NUM);     memcpy (save_p, name2, VERSIONSIZE);     save_p += VERSIONSIZE; 	     *save_p++ = gameskill;     *save_p++ = gameepisode;     *save_p++ = gamemap;     for (i=0 ; i<MAXPLAYERS ; i++) 	*save_p++ = playeringame[i];     *save_p++ = leveltime>>16;     *save_p++ = leveltime>>8;     *save_p++ = leveltime;      P_ArchivePlayers ();     P_ArchiveWorld ();     P_ArchiveThinkers ();     P_ArchiveSpecials (); 	     *save_p++ = 0x1d;		// consistancy marker 	     length = save_p - savebuffer;     if (length > SAVEGAMESIZE) 	I_Error ("Savegame buffer overrun");     M_WriteFile (name, savebuffer, length);     gameaction = ga_nothing;     savedescription[0] = 0;		 	     players[consoleplayer].message = GGSAVED;     // draw the pattern into the back screen    R_FillBackScreen ();	}  //// G_InitNew// Can be called by the startup code or the menu task,// consoleplayer, displayplayer, playeringame[] should be set. //skill_t	d_skill; int     d_episode; int     d_map;  voidG_DeferedInitNew( skill_t	skill,  int		episode,  int		map) {     d_skill = skill;     d_episode = episode;     d_map = map;     gameaction = ga_newgame; } void G_DoNewGame (void) {    demoplayback = false;     netdemo = false;    netgame = false;    deathmatch = false;    playeringame[1] = playeringame[2] = playeringame[3] = 0;    respawnparm = false;    fastparm = false;    nomonsters = false;    consoleplayer = 0;    G_InitNew (d_skill, d_episode, d_map);     gameaction = ga_nothing; } // The sky texture to be used instead of the F_SKY1 dummy.extern  int	skytexture; voidG_InitNew( skill_t	skill,  int		episode,  int		map ) {     int             i; 	     if (paused)     { 	paused = false; 	S_ResumeSound ();     } 	    if (skill > sk_nightmare) 	skill = sk_nightmare;    // This was quite messy with SPECIAL and commented parts.    // Supposedly hacks to make the latest edition work.    // It might not work properly.    if (episode < 1)      episode = 1;     if ( gamemode == retail )    {      if (episode > 4)	episode = 4;    }    else if ( gamemode == shareware )    {      if (episode > 1) 	   episode = 1;	// only start episode 1 on shareware    }      else    {      if (episode > 3)	episode = 3;    }          if (map < 1) 	map = 1;        if ( (map > 9)	 && ( gamemode != commercial) )      map = 9; 		     M_ClearRandom (); 	     if (skill == sk_nightmare || respawnparm )	respawnmonsters = true;    else	respawnmonsters = false;		    if (fastparm || (skill == sk_nightmare && gameskill != sk_nightmare) )    { 	for (i=S_SARG_RUN1 ; i<=S_SARG_PAIN2 ; i++) 	    states[i].tics >>= 1; 	mobjinfo[MT_BRUISERSHOT].speed = 20*FRACUNIT; 	mobjinfo[MT_HEADSHOT].speed = 20*FRACUNIT; 	mobjinfo[MT_TROOPSHOT].speed = 20*FRACUNIT;     }     else if (skill != sk_nightmare && gameskill == sk_nightmare)     { 	for (i=S_SARG_RUN1 ; i<=S_SARG_PAIN2 ; i++) 	    states[i].tics <<= 1; 	mobjinfo[MT_BRUISERSHOT].speed = 15*FRACUNIT; 	mobjinfo[MT_HEADSHOT].speed = 10*FRACUNIT; 	mobjinfo[MT_TROOPSHOT].speed = 10*FRACUNIT;     } 	 			     // force players to be initialized upon first level load             for (i=0 ; i<MAXPLAYERS ; i++) 	players[i].playerstate = PST_REBORN;      usergame = true;                // will be set false if a demo     paused = false;     demoplayback = false;     automapactive = false;     viewactive = true;     gameepisode = episode;     gamemap = map;     gameskill = skill;      viewactive = true;        // set the sky map for the episode    if ( gamemode == commercial)    {	skytexture = R_TextureNumForName ("SKY3");	if (gamemap < 12)	    skytexture = R_TextureNumForName ("SKY1");	else	    if (gamemap < 21)		skytexture = R_TextureNumForName ("SKY2");    }    else	switch (episode) 	{ 	  case 1: 	    skytexture = R_TextureNumForName ("SKY1"); 	    break; 	  case 2: 	    skytexture = R_TextureNumForName ("SKY2"); 	    break; 	  case 3: 	    skytexture = R_TextureNumForName ("SKY3"); 	    break; 	  case 4:	// Special Edition sky	    skytexture = R_TextureNumForName ("SKY4");	    break;	}      G_DoLoadLevel (); }  //// DEMO RECORDING // #define DEMOMARKER		0x80void G_ReadDemoTiccmd (ticcmd_t* cmd) {     if (*demo_p == DEMOMARKER)     {	// end of demo data stream 	G_CheckDemoStatus (); 	return;     }     cmd->forwardmove = ((signed char)*demo_p++);     cmd->sidemove = ((signed char)*demo_p++);     cmd->angleturn = ((unsigned char)*demo_p++)<<8;     cmd->buttons = (unsigned char)*demo_p++; } void G_WriteDemoTiccmd (ticcmd_t* cmd) {     if (gamekeydown['q'])           // press q to end demo recording 	G_CheckDemoStatus ();     *demo_p++ = cmd->forwardmove;     *demo_p++ = cmd->sidemove;     *demo_p++ = (cmd->angleturn+128)>>8;     *demo_p++ = cmd->buttons;     demo_p -= 4;     if (demo_p > demoend - 16)    {	// no more space 	G_CheckDemoStatus (); 	return;     } 	    G_ReadDemoTiccmd (cmd);         // make SURE it is exactly the same }    //// G_RecordDemo // void G_RecordDemo (char* name) {     int             i;     int				maxsize;	    usergame = false;     strcpy (demoname, name);     strcat (demoname, ".lmp");     maxsize = 0x20000;    i = M_CheckParm ("-maxdemo");    if (i && i<myargc-1)	maxsize = atoi(myargv[i+1])*1024;    demobuffer = Z_Malloc (maxsize,PU_STATIC,NULL);     demoend = demobuffer + maxsize;	    demorecording = true; }   void G_BeginRecording (void) {     int             i; 		    demo_p = demobuffer;	    *demo_p++ = VERSION_NUM;    *demo_p++ = gameskill;     *demo_p++ = gameepisode;     *demo_p++ = gamemap;     *demo_p++ = deathmatch;     *demo_p++ = respawnparm;    *demo_p++ = fastparm;    *demo_p++ = nomonsters;    *demo_p++ = consoleplayer;	     for (i=0 ; i<MAXPLAYERS ; i++) 	*demo_p++ = playeringame[i]; 		 }  //// G_PlayDemo //char*	defdemoname;  void G_DeferedPlayDemo (char* name) {     defdemoname = name;     gameaction = ga_playdemo; }  void G_DoPlayDemo (void) {     skill_t skill;     int             i, episode, map; 	     gameaction = ga_nothing;     demobuffer = demo_p = W_CacheLumpName (defdemoname, PU_STATIC);     if ( *demo_p++ != VERSION_NUM)    {      fprintf( stderr, "Demo is from a different game version!\n");      gameaction = ga_nothing;      return;    }        skill = *demo_p++;     episode = *demo_p++;     map = *demo_p++;     deathmatch = *demo_p++;    respawnparm = *demo_p++;    fastparm = *demo_p++;    nomonsters = *demo_p++;    consoleplayer = *demo_p++;	    for (i=0 ; i<MAXPLAYERS ; i++) 	playeringame[i] = *demo_p++;     if (playeringame[1])     { 	netgame = true; 	netdemo = true;     }    // don't spend a lot of time in loadlevel     precache = false;    G_InitNew (skill, episode, map);     precache = true;     usergame = false;     demoplayback = true; } //// G_TimeDemo //void G_TimeDemo (char* name) { 	     nodrawers = M_CheckParm ("-nodraw");     noblit = M_CheckParm ("-noblit");     timingdemo = true;     singletics = true;     defdemoname = name;     gameaction = ga_playdemo; }   /* =================== = = G_CheckDemoStatus = = Called after a death or level completion to allow demos to be cleaned up = Returns true if a new demo loop action will take place =================== */  boolean G_CheckDemoStatus (void) {     int             endtime; 	     if (timingdemo)     { 	endtime = I_GetTime (); 	I_Error ("timed %i gametics in %i realtics",gametic 		 , endtime-starttime);     } 	     if (demoplayback)     { 	if (singledemo) 	    I_Quit (); 			 	Z_ChangeTag (demobuffer, PU_CACHE); 	demoplayback = false; 	netdemo = false;	netgame = false;	deathmatch = false;	playeringame[1] = playeringame[2] = playeringame[3] = 0;	respawnparm = false;	fastparm = false;	nomonsters = false;	consoleplayer = 0;	D_AdvanceDemo (); 	return true;     }      if (demorecording)     { 	*demo_p++ = DEMOMARKER; 	M_WriteFile (demoname, demobuffer, demo_p - demobuffer); 	Z_Free (demobuffer); 	demorecording = false; 	I_Error ("Demo %s recorded",demoname);     } 	     return false; }    

⌨️ 快捷键说明

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