2006-04-13 20:47:06 +00:00
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
/*
|
2010-05-25 10:56:00 +00:00
|
|
|
Copyright (C) 2010 EDuke32 developers and contributors
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2010-05-25 10:56:00 +00:00
|
|
|
This file is part of EDuke32.
|
2006-04-13 20:47:06 +00:00
|
|
|
|
|
|
|
EDuke32 is free software; you can redistribute it and/or
|
|
|
|
modify it under the terms of the GNU General Public License version 2
|
|
|
|
as published by the Free Software Foundation.
|
|
|
|
|
|
|
|
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.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
2014-07-20 08:55:56 +00:00
|
|
|
Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
2006-04-13 20:47:06 +00:00
|
|
|
*/
|
|
|
|
//-------------------------------------------------------------------------
|
|
|
|
|
|
|
|
#include "duke3d.h"
|
2012-01-27 15:03:55 +00:00
|
|
|
#include "game.h"
|
2012-11-25 04:25:31 +00:00
|
|
|
#include "common_game.h"
|
2006-04-13 20:47:06 +00:00
|
|
|
#include "osd.h"
|
2009-12-12 11:07:59 +00:00
|
|
|
#include "gamedef.h"
|
2010-08-02 08:13:51 +00:00
|
|
|
#include "premap.h"
|
|
|
|
#include "sounds.h"
|
2014-04-19 22:42:20 +00:00
|
|
|
#include "fx_man.h"
|
2010-08-02 08:13:51 +00:00
|
|
|
#include "gameexec.h"
|
|
|
|
#include "anim.h"
|
|
|
|
#include "menus.h"
|
2010-08-02 08:19:28 +00:00
|
|
|
#include "demo.h"
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2012-06-03 15:45:59 +00:00
|
|
|
#ifdef LUNATIC
|
2012-11-10 20:59:00 +00:00
|
|
|
# include "lunatic_game.h"
|
2011-09-20 19:12:24 +00:00
|
|
|
#endif
|
|
|
|
|
2013-01-20 21:17:31 +00:00
|
|
|
halfdimen_t g_halfScreen;
|
|
|
|
int32_t g_halveScreenArea = 0;
|
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
static int32_t g_whichPalForPlayer = 9;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2009-02-19 09:39:19 +00:00
|
|
|
static uint8_t precachehightile[2][MAXTILES>>3];
|
2009-01-09 09:29:17 +00:00
|
|
|
static int32_t g_precacheCount;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
extern int32_t g_levelTextTime;
|
2008-07-22 09:05:34 +00:00
|
|
|
|
2012-11-17 19:46:37 +00:00
|
|
|
static void flag_precache(int32_t tile, int32_t type)
|
|
|
|
{
|
|
|
|
if (!(gotpic[tile>>3] & pow2char[tile&7]))
|
|
|
|
g_precacheCount++;
|
|
|
|
gotpic[tile>>3] |= pow2char[tile&7];
|
|
|
|
precachehightile[type][tile>>3] |= pow2char[tile&7];
|
|
|
|
}
|
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
static void tloadtile(int32_t tilenume, int32_t type)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2012-11-17 19:46:37 +00:00
|
|
|
int32_t i,j;
|
|
|
|
|
|
|
|
if ((picanm[tilenume].sf&PICANM_ANIMTYPE_MASK)==PICANM_ANIMTYPE_BACK)
|
2006-12-17 21:20:35 +00:00
|
|
|
{
|
2012-11-17 19:46:37 +00:00
|
|
|
i = tilenume - picanm[tilenume].num;
|
|
|
|
j = tilenume;
|
2006-12-17 21:20:35 +00:00
|
|
|
}
|
2012-11-17 19:46:37 +00:00
|
|
|
else
|
2006-11-15 01:16:55 +00:00
|
|
|
{
|
2012-11-17 19:46:37 +00:00
|
|
|
i = tilenume;
|
|
|
|
j = tilenume + picanm[tilenume].num;
|
2006-11-15 01:16:55 +00:00
|
|
|
}
|
2012-11-17 19:46:37 +00:00
|
|
|
|
|
|
|
for (; i<=j; i++)
|
|
|
|
flag_precache(i, type);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
static void G_CacheSpriteNum(int32_t i)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
|
|
|
char maxc;
|
2009-01-09 09:29:17 +00:00
|
|
|
int32_t j;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
if (ud.monsters_off && A_CheckEnemySprite(&sprite[i])) return;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
|
|
|
maxc = 1;
|
|
|
|
|
2014-02-02 10:50:40 +00:00
|
|
|
for (j = PN; j <= g_tile[PN].cacherange; j++)
|
|
|
|
tloadtile(j,1);
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2012-01-28 14:38:23 +00:00
|
|
|
switch (DYNAMICTILEMAP(PN))
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2006-11-16 03:02:42 +00:00
|
|
|
case HYDRENT__STATIC:
|
|
|
|
tloadtile(BROKEFIREHYDRENT,1);
|
|
|
|
for (j = TOILETWATER; j < (TOILETWATER+4); j++) tloadtile(j,1);
|
|
|
|
break;
|
|
|
|
case TOILET__STATIC:
|
|
|
|
tloadtile(TOILETBROKE,1);
|
|
|
|
for (j = TOILETWATER; j < (TOILETWATER+4); j++) tloadtile(j,1);
|
|
|
|
break;
|
|
|
|
case STALL__STATIC:
|
|
|
|
tloadtile(STALLBROKE,1);
|
|
|
|
for (j = TOILETWATER; j < (TOILETWATER+4); j++) tloadtile(j,1);
|
|
|
|
break;
|
|
|
|
case RUBBERCAN__STATIC:
|
|
|
|
maxc = 2;
|
|
|
|
break;
|
|
|
|
case TOILETWATER__STATIC:
|
|
|
|
maxc = 4;
|
|
|
|
break;
|
|
|
|
case FEMPIC1__STATIC:
|
|
|
|
maxc = 44;
|
|
|
|
break;
|
|
|
|
case LIZTROOP__STATIC:
|
|
|
|
case LIZTROOPRUNNING__STATIC:
|
|
|
|
case LIZTROOPSHOOT__STATIC:
|
|
|
|
case LIZTROOPJETPACK__STATIC:
|
|
|
|
case LIZTROOPONTOILET__STATIC:
|
|
|
|
case LIZTROOPDUCKING__STATIC:
|
|
|
|
for (j = LIZTROOP; j < (LIZTROOP+72); j++) tloadtile(j,1);
|
2009-02-19 16:47:54 +00:00
|
|
|
for (j=HEADJIB1; j<LEGJIB1+3; j++) tloadtile(j,1);
|
2006-11-16 03:02:42 +00:00
|
|
|
maxc = 0;
|
|
|
|
break;
|
|
|
|
case WOODENHORSE__STATIC:
|
|
|
|
maxc = 5;
|
|
|
|
for (j = HORSEONSIDE; j < (HORSEONSIDE+4); j++) tloadtile(j,1);
|
|
|
|
break;
|
|
|
|
case NEWBEAST__STATIC:
|
|
|
|
case NEWBEASTSTAYPUT__STATIC:
|
|
|
|
maxc = 90;
|
|
|
|
break;
|
|
|
|
case BOSS1__STATIC:
|
|
|
|
case BOSS2__STATIC:
|
|
|
|
case BOSS3__STATIC:
|
|
|
|
maxc = 30;
|
|
|
|
break;
|
|
|
|
case OCTABRAIN__STATIC:
|
|
|
|
case OCTABRAINSTAYPUT__STATIC:
|
|
|
|
case COMMANDER__STATIC:
|
|
|
|
case COMMANDERSTAYPUT__STATIC:
|
|
|
|
maxc = 38;
|
|
|
|
break;
|
|
|
|
case RECON__STATIC:
|
|
|
|
maxc = 13;
|
|
|
|
break;
|
|
|
|
case PIGCOP__STATIC:
|
|
|
|
case PIGCOPDIVE__STATIC:
|
|
|
|
maxc = 61;
|
|
|
|
break;
|
|
|
|
case SHARK__STATIC:
|
|
|
|
maxc = 30;
|
|
|
|
break;
|
|
|
|
case LIZMAN__STATIC:
|
|
|
|
case LIZMANSPITTING__STATIC:
|
|
|
|
case LIZMANFEEDING__STATIC:
|
|
|
|
case LIZMANJUMP__STATIC:
|
2009-02-19 16:47:54 +00:00
|
|
|
for (j=LIZMANHEAD1; j<LIZMANLEG1+3; j++) tloadtile(j,1);
|
2006-11-16 03:02:42 +00:00
|
|
|
maxc = 80;
|
|
|
|
break;
|
|
|
|
case APLAYER__STATIC:
|
|
|
|
maxc = 0;
|
2010-01-16 23:08:17 +00:00
|
|
|
if ((g_netServer || ud.multimode > 1))
|
2006-11-16 03:02:42 +00:00
|
|
|
{
|
2006-11-15 01:16:55 +00:00
|
|
|
maxc = 5;
|
2009-02-19 16:47:54 +00:00
|
|
|
for (j = 1420; j < 1420+106; j++) tloadtile(j,1);
|
2006-11-16 03:02:42 +00:00
|
|
|
}
|
|
|
|
break;
|
|
|
|
case ATOMICHEALTH__STATIC:
|
|
|
|
maxc = 14;
|
|
|
|
break;
|
|
|
|
case DRONE__STATIC:
|
|
|
|
maxc = 10;
|
|
|
|
break;
|
|
|
|
case EXPLODINGBARREL__STATIC:
|
|
|
|
case SEENINE__STATIC:
|
|
|
|
case OOZFILTER__STATIC:
|
|
|
|
maxc = 3;
|
|
|
|
break;
|
|
|
|
case NUKEBARREL__STATIC:
|
|
|
|
case CAMERA1__STATIC:
|
|
|
|
maxc = 5;
|
|
|
|
break;
|
|
|
|
// caching of HUD sprites for weapons that may be in the level
|
|
|
|
case CHAINGUNSPRITE__STATIC:
|
|
|
|
for (j=CHAINGUN; j<=CHAINGUN+7; j++) tloadtile(j,1);
|
|
|
|
break;
|
|
|
|
case RPGSPRITE__STATIC:
|
|
|
|
for (j=RPGGUN; j<=RPGGUN+2; j++) tloadtile(j,1);
|
|
|
|
break;
|
|
|
|
case FREEZESPRITE__STATIC:
|
|
|
|
for (j=FREEZE; j<=FREEZE+5; j++) tloadtile(j,1);
|
|
|
|
break;
|
|
|
|
case GROWSPRITEICON__STATIC:
|
|
|
|
case SHRINKERSPRITE__STATIC:
|
|
|
|
for (j=SHRINKER-2; j<=SHRINKER+5; j++) tloadtile(j,1);
|
|
|
|
break;
|
|
|
|
case HBOMBAMMO__STATIC:
|
|
|
|
case HEAVYHBOMB__STATIC:
|
|
|
|
for (j=HANDREMOTE; j<=HANDREMOTE+5; j++) tloadtile(j,1);
|
|
|
|
break;
|
|
|
|
case TRIPBOMBSPRITE__STATIC:
|
|
|
|
for (j=HANDHOLDINGLASER; j<=HANDHOLDINGLASER+4; j++) tloadtile(j,1);
|
|
|
|
break;
|
|
|
|
case SHOTGUNSPRITE__STATIC:
|
|
|
|
tloadtile(SHOTGUNSHELL,1);
|
|
|
|
for (j=SHOTGUN; j<=SHOTGUN+6; j++) tloadtile(j,1);
|
|
|
|
break;
|
|
|
|
case DEVISTATORSPRITE__STATIC:
|
|
|
|
for (j=DEVISTATOR; j<=DEVISTATOR+1; j++) tloadtile(j,1);
|
|
|
|
break;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
|
|
|
}
|
|
|
|
|
2006-11-13 23:12:47 +00:00
|
|
|
for (j = PN; j < (PN+maxc); j++) tloadtile(j,1);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
static void G_PrecacheSprites(void)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2009-01-09 09:29:17 +00:00
|
|
|
int32_t i,j;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2009-02-19 16:47:54 +00:00
|
|
|
for (i=0; i<MAXTILES; i++)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2014-02-22 19:38:52 +00:00
|
|
|
if (g_tile[i].flags & SFLAG_PROJECTILE)
|
2006-04-13 20:47:06 +00:00
|
|
|
tloadtile(i,1);
|
2012-10-30 15:54:35 +00:00
|
|
|
|
2014-02-22 19:38:52 +00:00
|
|
|
if (A_CheckSpriteTileFlags(i, SFLAG_CACHE))
|
2012-11-15 14:28:00 +00:00
|
|
|
for (j = i; j <= g_tile[i].cacherange; j++)
|
2006-04-13 20:47:06 +00:00
|
|
|
tloadtile(j,1);
|
|
|
|
}
|
|
|
|
tloadtile(BOTTOMSTATUSBAR,1);
|
2010-01-16 23:08:17 +00:00
|
|
|
if ((g_netServer || ud.multimode > 1))
|
2006-04-13 20:47:06 +00:00
|
|
|
tloadtile(FRAGBAR,1);
|
|
|
|
|
|
|
|
tloadtile(VIEWSCREEN,1);
|
|
|
|
|
2009-02-19 16:47:54 +00:00
|
|
|
for (i=STARTALPHANUM; i<ENDALPHANUM+1; i++) tloadtile(i,1);
|
2013-03-25 04:31:09 +00:00
|
|
|
for (i=BIGALPHANUM-11; i<BIGALPHANUM+82; i++) tloadtile(i,1);
|
|
|
|
for (i=MINIFONT; i<MINIFONT+93; i++) tloadtile(i,1);
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2009-02-19 16:47:54 +00:00
|
|
|
for (i=FOOTPRINTS; i<FOOTPRINTS+3; i++) tloadtile(i,1);
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2006-11-14 21:35:50 +00:00
|
|
|
for (i = BURNING; i < BURNING+14; i++) tloadtile(i,1);
|
|
|
|
for (i = BURNING2; i < BURNING2+14; i++) tloadtile(i,1);
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2006-11-14 21:35:50 +00:00
|
|
|
for (i = CRACKKNUCKLES; i < CRACKKNUCKLES+4; i++) tloadtile(i,1);
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2006-11-14 21:35:50 +00:00
|
|
|
for (i = FIRSTGUN; i < FIRSTGUN+3 ; i++) tloadtile(i,1);
|
|
|
|
for (i = FIRSTGUNRELOAD; i < FIRSTGUNRELOAD+8 ; i++) tloadtile(i,1);
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2006-11-14 21:35:50 +00:00
|
|
|
for (i = EXPLOSION2; i < EXPLOSION2+21 ; i++) tloadtile(i,1);
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2007-03-01 00:50:59 +00:00
|
|
|
for (i = COOLEXPLOSION1; i < COOLEXPLOSION1+21 ; i++) tloadtile(i,1);
|
|
|
|
|
2006-04-13 20:47:06 +00:00
|
|
|
tloadtile(BULLETHOLE,1);
|
2007-03-01 00:50:59 +00:00
|
|
|
tloadtile(BLOODPOOL,1);
|
|
|
|
for (i = TRANSPORTERBEAM; i < (TRANSPORTERBEAM+6); i++) tloadtile(i,1);
|
2007-03-11 00:47:32 +00:00
|
|
|
|
2006-11-14 21:35:50 +00:00
|
|
|
for (i = SMALLSMOKE; i < (SMALLSMOKE+4); i++) tloadtile(i,1);
|
2008-04-25 01:46:19 +00:00
|
|
|
for (i = SHOTSPARK1; i < (SHOTSPARK1+4); i++) tloadtile(i,1);
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2007-03-01 00:50:59 +00:00
|
|
|
for (i = BLOOD; i < (BLOOD+4); i++) tloadtile(i,1);
|
2006-11-14 21:35:50 +00:00
|
|
|
for (i = JIBS1; i < (JIBS5+5); i++) tloadtile(i,1);
|
2008-04-25 01:46:19 +00:00
|
|
|
for (i = JIBS6; i < (JIBS6+8); i++) tloadtile(i,1);
|
|
|
|
|
2007-03-01 00:50:59 +00:00
|
|
|
for (i = SCRAP1; i < (SCRAP1+29); i++) tloadtile(i,1);
|
|
|
|
|
|
|
|
tloadtile(FIRELASER,1);
|
2011-01-09 18:53:06 +00:00
|
|
|
for (i=TRANSPORTERSTAR; i<TRANSPORTERSTAR+6; i++) tloadtile(i,1);
|
2007-03-01 00:50:59 +00:00
|
|
|
for (i=FORCERIPPLE; i<(FORCERIPPLE+9); i++) tloadtile(i,1);
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2007-03-01 00:50:59 +00:00
|
|
|
for (i=MENUSCREEN; i<DUKECAR; i++) tloadtile(i,1);
|
2007-03-11 00:47:32 +00:00
|
|
|
|
2006-04-13 20:47:06 +00:00
|
|
|
for (i=RPG; i<RPG+7; i++) tloadtile(i,1);
|
|
|
|
for (i=FREEZEBLAST; i<FREEZEBLAST+3; i++) tloadtile(i,1);
|
|
|
|
for (i=SHRINKSPARK; i<SHRINKSPARK+4; i++) tloadtile(i,1);
|
|
|
|
for (i=GROWSPARK; i<GROWSPARK+4; i++) tloadtile(i,1);
|
|
|
|
for (i=SHRINKEREXPLOSION; i<SHRINKEREXPLOSION+4; i++) tloadtile(i,1);
|
2010-03-11 23:35:22 +00:00
|
|
|
for (i=MORTER; i<MORTER+4; i++) tloadtile(i,1);
|
2008-08-23 23:37:01 +00:00
|
|
|
for (i=0; i<=60; i++) tloadtile(i,1);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
// FIXME: this function is a piece of shit, needs specific sounds listed
|
2009-02-19 16:47:54 +00:00
|
|
|
static int32_t G_CacheSound(uint32_t num)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2009-01-09 09:29:17 +00:00
|
|
|
int16_t fp = -1;
|
|
|
|
int32_t l;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2007-10-24 06:48:13 +00:00
|
|
|
if (num >= MAXSOUNDS || ud.config.SoundToggle == 0) return 0;
|
2007-08-27 00:20:15 +00:00
|
|
|
if (ud.config.FXDevice < 0) return 0;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2008-11-16 00:48:02 +00:00
|
|
|
if (!g_sounds[num].filename && !g_sounds[num].filename1) return 0;
|
2008-11-20 14:06:36 +00:00
|
|
|
if (g_sounds[num].filename1) fp = kopen4loadfrommod(g_sounds[num].filename1,g_loadFromGroupOnly);
|
|
|
|
if (fp == -1) fp = kopen4loadfrommod(g_sounds[num].filename,g_loadFromGroupOnly);
|
2008-08-23 15:37:30 +00:00
|
|
|
if (fp == -1)
|
|
|
|
{
|
2008-11-20 14:06:36 +00:00
|
|
|
// OSD_Printf(OSDTEXT_RED "Sound %s(#%d) not found!\n",g_sounds[num].filename,num);
|
2008-08-23 15:37:30 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2006-11-14 21:35:50 +00:00
|
|
|
l = kfilelength(fp);
|
2007-09-11 05:26:38 +00:00
|
|
|
g_sounds[num].soundsiz = l;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2006-11-14 21:35:50 +00:00
|
|
|
if ((ud.level_number == 0 && ud.volume_number == 0 && (num == 189 || num == 232 || num == 99 || num == 233 || num == 17)) ||
|
|
|
|
(l < 12288))
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2009-07-12 01:55:34 +00:00
|
|
|
g_soundlocks[num] = 199;
|
|
|
|
allocache((intptr_t *)&g_sounds[num].ptr,l,(char *)&g_soundlocks[num]);
|
2007-09-11 05:26:38 +00:00
|
|
|
if (g_sounds[num].ptr != NULL)
|
|
|
|
kread(fp, g_sounds[num].ptr , l);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
2006-11-14 21:35:50 +00:00
|
|
|
kclose(fp);
|
2006-04-13 20:47:06 +00:00
|
|
|
return 1;
|
|
|
|
}
|
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
static void G_PrecacheSounds(void)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2009-01-09 09:29:17 +00:00
|
|
|
int32_t i, j;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2007-08-27 00:20:15 +00:00
|
|
|
if (ud.config.FXDevice < 0) return;
|
2006-04-13 20:47:06 +00:00
|
|
|
j = 0;
|
|
|
|
|
2010-06-07 09:03:16 +00:00
|
|
|
for (i=MAXSOUNDS-1; i>=0; i--)
|
2007-09-11 05:26:38 +00:00
|
|
|
if (g_sounds[i].ptr == 0)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
|
|
|
j++;
|
2006-11-14 21:35:50 +00:00
|
|
|
if ((j&7) == 0)
|
2012-09-05 17:25:34 +00:00
|
|
|
G_HandleAsync();
|
|
|
|
|
2009-02-19 16:47:54 +00:00
|
|
|
G_CacheSound(i);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-07-01 22:11:33 +00:00
|
|
|
static void G_DoLoadScreen(const char *statustext, int32_t percent)
|
2006-12-10 06:49:01 +00:00
|
|
|
{
|
2009-01-09 09:29:17 +00:00
|
|
|
int32_t i=0,j;
|
2006-12-10 06:49:01 +00:00
|
|
|
|
|
|
|
if (ud.recstat != 2)
|
|
|
|
{
|
2014-11-22 12:29:25 +00:00
|
|
|
j = VM_OnEventWithReturn(EVENT_GETLOADTILE, -1, myconnectindex, LOADSCREEN);
|
2010-05-02 23:27:30 +00:00
|
|
|
|
2011-12-28 20:35:23 +00:00
|
|
|
//g_player[myconnectindex].ps->palette = palette;
|
2012-09-24 21:09:31 +00:00
|
|
|
P_SetGamePalette(g_player[myconnectindex].ps, BASEPAL, 1); // JBF 20040308
|
2011-12-28 20:35:23 +00:00
|
|
|
|
2006-12-10 06:49:01 +00:00
|
|
|
if (!statustext)
|
|
|
|
{
|
|
|
|
i = ud.screen_size;
|
|
|
|
ud.screen_size = 0;
|
2008-11-20 14:06:36 +00:00
|
|
|
G_UpdateScreenArea();
|
2012-08-19 12:53:24 +00:00
|
|
|
clearallviews(0L);
|
2006-12-10 06:49:01 +00:00
|
|
|
}
|
|
|
|
|
2011-08-17 18:52:54 +00:00
|
|
|
if ((uint32_t)j < 2*MAXTILES)
|
|
|
|
{
|
2012-08-19 12:53:24 +00:00
|
|
|
clearallviews(0);
|
2012-08-16 21:48:52 +00:00
|
|
|
|
2012-02-02 17:35:05 +00:00
|
|
|
rotatesprite_fs(320<<15,200<<15,65536L,0, j > MAXTILES-1?j-MAXTILES:j,0,0,
|
|
|
|
2+8+64+(ud.bgstretch?1024:0));
|
2011-08-17 18:52:54 +00:00
|
|
|
}
|
|
|
|
else
|
2006-12-10 06:49:01 +00:00
|
|
|
{
|
|
|
|
nextpage();
|
|
|
|
return;
|
|
|
|
}
|
2011-08-17 18:52:54 +00:00
|
|
|
|
2006-12-10 06:49:01 +00:00
|
|
|
if (boardfilename[0] != 0 && ud.level_number == 7 && ud.volume_number == 0)
|
|
|
|
{
|
2012-03-26 05:07:12 +00:00
|
|
|
menutext(160,90,0,0,"Loading User Map");
|
2006-12-10 06:49:01 +00:00
|
|
|
gametextpal(160,90+10,boardfilename,14,2);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-03-26 05:07:12 +00:00
|
|
|
menutext(160,90,0,0,"Loading");
|
2008-11-20 14:06:36 +00:00
|
|
|
if (MapInfo[(ud.volume_number*MAXLEVELS) + ud.level_number].name != NULL)
|
|
|
|
menutext(160,90+16+8,0,0,MapInfo[(ud.volume_number*MAXLEVELS) + ud.level_number].name);
|
2006-12-10 06:49:01 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
if (statustext) gametext(160,180,statustext,0,2+8+16);
|
2010-05-02 23:27:30 +00:00
|
|
|
|
|
|
|
if (percent != -1)
|
2008-12-17 01:59:36 +00:00
|
|
|
{
|
2009-04-15 05:58:38 +00:00
|
|
|
int32_t ii = scale(scale(xdim-1,288,320),percent,100);
|
|
|
|
rotatesprite(31<<16,145<<16,65536,0,929,15,0,2+8+16,0,0,ii,ydim-1);
|
|
|
|
rotatesprite(159<<16,145<<16,65536,0,929,15,0,2+8+16,0,0,ii,ydim-1);
|
|
|
|
rotatesprite(30<<16,144<<16,65536,0,929,0,0,2+8+16,0,0,ii,ydim-1);
|
|
|
|
rotatesprite(158<<16,144<<16,65536,0,929,0,0,2+8+16,0,0,ii,ydim-1);
|
2008-12-17 01:59:36 +00:00
|
|
|
}
|
2010-05-02 23:27:30 +00:00
|
|
|
|
2014-11-22 12:29:25 +00:00
|
|
|
VM_OnEvent(EVENT_DISPLAYLOADINGSCREEN, g_player[screenpeek].ps->i, screenpeek);
|
2006-12-10 06:49:01 +00:00
|
|
|
nextpage();
|
|
|
|
|
|
|
|
if (!statustext)
|
|
|
|
{
|
|
|
|
KB_FlushKeyboardQueue();
|
|
|
|
ud.screen_size = i;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (!statustext)
|
|
|
|
{
|
2012-08-19 12:53:24 +00:00
|
|
|
clearallviews(0L);
|
2007-08-27 06:46:31 +00:00
|
|
|
//g_player[myconnectindex].ps->palette = palette;
|
2008-11-20 14:06:36 +00:00
|
|
|
//G_FadePalette(0,0,0,0);
|
2011-01-17 03:49:34 +00:00
|
|
|
P_SetGamePalette(g_player[myconnectindex].ps, BASEPAL, 0); // JBF 20040308
|
2006-12-10 06:49:01 +00:00
|
|
|
}
|
2009-01-18 07:32:35 +00:00
|
|
|
/*Gv_SetVar(g_iReturnVarID,LOADSCREEN, -1, -1);*/
|
2011-08-17 18:52:54 +00:00
|
|
|
|
2014-11-22 12:29:25 +00:00
|
|
|
j = VM_OnEventWithReturn(EVENT_GETLOADTILE, -1, myconnectindex, LOADSCREEN);
|
2011-08-17 18:52:54 +00:00
|
|
|
|
|
|
|
if ((uint32_t)j < 2*MAXTILES)
|
|
|
|
{
|
2012-02-02 17:35:05 +00:00
|
|
|
rotatesprite_fs(320<<15,200<<15,65536L, 0,j > MAXTILES-1?j-MAXTILES:j,0,0,
|
|
|
|
2+8+64+(ud.bgstretch?1024:0));
|
2011-08-17 18:52:54 +00:00
|
|
|
}
|
|
|
|
else
|
2006-12-10 06:49:01 +00:00
|
|
|
{
|
|
|
|
nextpage();
|
|
|
|
return;
|
|
|
|
}
|
2011-08-17 18:52:54 +00:00
|
|
|
|
2012-03-26 05:07:12 +00:00
|
|
|
menutext(160,105,0,0,"Loading...");
|
2006-12-10 06:49:01 +00:00
|
|
|
if (statustext) gametext(160,180,statustext,0,2+8+16);
|
2014-11-22 12:29:25 +00:00
|
|
|
VM_OnEvent(EVENT_DISPLAYLOADINGSCREEN, g_player[screenpeek].ps->i, screenpeek);
|
2006-12-10 06:49:01 +00:00
|
|
|
nextpage();
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
extern void G_SetCrosshairColor(int32_t r, int32_t g, int32_t b);
|
2008-11-20 14:06:36 +00:00
|
|
|
extern palette_t CrosshairColors;
|
2008-08-07 13:23:08 +00:00
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
void G_CacheMapData(void)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2009-01-09 09:29:17 +00:00
|
|
|
int32_t i,j,pc=0;
|
|
|
|
int32_t tc;
|
|
|
|
uint32_t starttime, endtime;
|
2006-04-16 03:42:36 +00:00
|
|
|
|
2006-11-13 23:12:47 +00:00
|
|
|
if (ud.recstat == 2)
|
2006-04-16 03:42:36 +00:00
|
|
|
return;
|
|
|
|
|
2009-07-27 05:33:12 +00:00
|
|
|
S_PauseMusic(1);
|
2014-09-07 18:10:14 +00:00
|
|
|
if (MapInfo[MUS_LOADING].musicfn)
|
2008-04-05 04:18:48 +00:00
|
|
|
{
|
2009-07-27 05:33:12 +00:00
|
|
|
S_StopMusic();
|
2014-09-07 18:10:14 +00:00
|
|
|
S_PlayMusic(MapInfo[MUS_LOADING].musicfn, MUS_LOADING);
|
2008-04-05 04:18:48 +00:00
|
|
|
}
|
2008-03-16 06:37:47 +00:00
|
|
|
|
2006-04-16 03:42:36 +00:00
|
|
|
starttime = getticks();
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
G_PrecacheSounds();
|
|
|
|
G_PrecacheSprites();
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2009-02-19 16:47:54 +00:00
|
|
|
for (i=0; i<numwalls; i++)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
|
|
|
tloadtile(wall[i].picnum, 0);
|
|
|
|
|
2006-11-15 01:16:55 +00:00
|
|
|
if (wall[i].overpicnum >= 0)
|
|
|
|
{
|
2006-04-13 20:47:06 +00:00
|
|
|
tloadtile(wall[i].overpicnum, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-02-19 16:47:54 +00:00
|
|
|
for (i=0; i<numsectors; i++)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2006-11-14 21:35:50 +00:00
|
|
|
tloadtile(sector[i].floorpicnum, 0);
|
|
|
|
tloadtile(sector[i].ceilingpicnum, 0);
|
2009-11-14 02:30:47 +00:00
|
|
|
if (sector[i].ceilingpicnum == LA) // JBF 20040509: if( waloff[sector[i].ceilingpicnum] == LA) WTF?!?!?!?
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
|
|
|
tloadtile(LA+1, 0);
|
|
|
|
tloadtile(LA+2, 0);
|
|
|
|
}
|
|
|
|
|
2014-02-02 10:50:40 +00:00
|
|
|
for (SPRITES_OF_SECT(i, j))
|
2006-11-13 23:12:47 +00:00
|
|
|
if (sprite[j].xrepeat != 0 && sprite[j].yrepeat != 0 && (sprite[j].cstat&32768) == 0)
|
2008-11-20 14:06:36 +00:00
|
|
|
G_CacheSpriteNum(j);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2006-04-16 03:42:36 +00:00
|
|
|
tc = totalclock;
|
2006-04-13 20:47:06 +00:00
|
|
|
j = 0;
|
|
|
|
|
2009-02-19 16:47:54 +00:00
|
|
|
for (i=0; i<MAXTILES; i++)
|
2006-11-15 01:16:55 +00:00
|
|
|
{
|
|
|
|
if (!(i&7) && !gotpic[i>>3])
|
|
|
|
{
|
2006-04-16 03:42:36 +00:00
|
|
|
i+=7;
|
|
|
|
continue;
|
|
|
|
}
|
2006-11-15 01:16:55 +00:00
|
|
|
if (gotpic[i>>3] & pow2char[i&7])
|
|
|
|
{
|
2006-04-16 03:42:36 +00:00
|
|
|
if (waloff[i] == 0)
|
2009-01-09 09:29:17 +00:00
|
|
|
loadtile((int16_t)i);
|
2006-04-16 03:42:36 +00:00
|
|
|
|
2011-03-04 08:50:58 +00:00
|
|
|
#ifdef USE_OPENGL
|
2011-01-09 18:53:06 +00:00
|
|
|
// PRECACHE
|
2012-11-04 23:41:05 +00:00
|
|
|
if (ud.config.useprecache && bpp > 8)
|
2006-11-15 01:16:55 +00:00
|
|
|
{
|
2010-03-11 23:35:22 +00:00
|
|
|
int32_t k,type;
|
|
|
|
|
|
|
|
for (type=0; type<=1; type++)
|
|
|
|
if (precachehightile[type][i>>3] & pow2char[i&7])
|
|
|
|
{
|
2011-09-28 20:30:24 +00:00
|
|
|
k = 0;
|
2010-03-11 23:35:22 +00:00
|
|
|
for (k=0; k<MAXPALOOKUPS-RESERVEDPALS && !KB_KeyPressed(sc_Space); k++)
|
2011-09-28 20:30:24 +00:00
|
|
|
{
|
2013-12-28 17:04:27 +00:00
|
|
|
// this is the CROSSHAIR_PAL, see comment in game.c
|
2011-09-28 20:30:24 +00:00
|
|
|
if (k == MAXPALOOKUPS-RESERVEDPALS-1)
|
|
|
|
break;
|
2013-02-07 21:01:24 +00:00
|
|
|
#ifdef POLYMER
|
2013-05-17 03:44:09 +00:00
|
|
|
if (getrendermode() != REND_POLYMER || !polymer_havehighpalookup(0, k))
|
2013-02-07 21:01:24 +00:00
|
|
|
#endif
|
2011-09-28 20:30:24 +00:00
|
|
|
polymost_precache(i,k,type);
|
|
|
|
}
|
|
|
|
|
2010-03-11 23:35:22 +00:00
|
|
|
if (r_detailmapping && !KB_KeyPressed(sc_Space))
|
|
|
|
polymost_precache(i,DETAILPAL,type);
|
|
|
|
if (r_glowmapping && !KB_KeyPressed(sc_Space))
|
|
|
|
polymost_precache(i,GLOWPAL,type);
|
2010-06-23 04:20:46 +00:00
|
|
|
#ifdef POLYMER
|
2013-05-17 03:44:09 +00:00
|
|
|
if (getrendermode() == REND_POLYMER)
|
2010-03-11 23:35:22 +00:00
|
|
|
{
|
|
|
|
if (pr_specularmapping && !KB_KeyPressed(sc_Space))
|
|
|
|
polymost_precache(i,SPECULARPAL,type);
|
|
|
|
if (pr_normalmapping && !KB_KeyPressed(sc_Space))
|
|
|
|
polymost_precache(i,NORMALPAL,type);
|
|
|
|
}
|
2010-06-23 04:20:46 +00:00
|
|
|
#endif
|
2010-03-11 23:35:22 +00:00
|
|
|
}
|
2006-04-16 03:42:36 +00:00
|
|
|
}
|
2006-08-07 19:57:53 +00:00
|
|
|
#endif
|
2006-04-16 03:42:36 +00:00
|
|
|
j++;
|
|
|
|
pc++;
|
2006-11-15 01:16:55 +00:00
|
|
|
}
|
|
|
|
else continue;
|
2006-04-16 03:42:36 +00:00
|
|
|
|
2009-07-28 06:32:58 +00:00
|
|
|
MUSIC_Update();
|
|
|
|
|
2006-11-15 01:16:55 +00:00
|
|
|
if ((j&7) == 0)
|
2012-09-05 17:25:34 +00:00
|
|
|
G_HandleAsync();
|
|
|
|
|
2012-11-04 23:41:05 +00:00
|
|
|
if (bpp > 8 && totalclock - tc > TICRATE/4)
|
2006-11-15 01:16:55 +00:00
|
|
|
{
|
2009-01-19 06:41:28 +00:00
|
|
|
/*Bsprintf(tempbuf,"%d resources remaining\n",g_precacheCount-pc+1);*/
|
2014-10-25 03:29:21 +00:00
|
|
|
tc = min(100, tabledivide32_noinline(100 * pc, g_precacheCount));
|
2009-01-19 06:41:28 +00:00
|
|
|
Bsprintf(tempbuf,"Loaded %d%% (%d/%d textures)\n",tc,pc,g_precacheCount);
|
|
|
|
G_DoLoadScreen(tempbuf, tc);
|
2006-04-16 03:42:36 +00:00
|
|
|
tc = totalclock;
|
|
|
|
}
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2014-01-12 14:54:36 +00:00
|
|
|
Bmemset(gotpic, 0, sizeof(gotpic));
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2006-04-16 03:42:36 +00:00
|
|
|
endtime = getticks();
|
|
|
|
OSD_Printf("Cache time: %dms\n", endtime-starttime);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
void G_UpdateScreenArea(void)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2013-05-30 09:13:32 +00:00
|
|
|
if (!in3dmode())
|
2013-01-17 21:59:11 +00:00
|
|
|
return;
|
2009-04-29 19:43:51 +00:00
|
|
|
|
2012-05-26 21:58:21 +00:00
|
|
|
ud.screen_size = clamp(ud.screen_size, 0, 64);
|
2013-01-17 21:59:11 +00:00
|
|
|
if (ud.screen_size == 0)
|
|
|
|
flushperms();
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2013-01-17 21:59:11 +00:00
|
|
|
{
|
|
|
|
const int32_t ss = max(ud.screen_size-8,0);
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2013-01-17 21:59:11 +00:00
|
|
|
const int32_t x1 = scale(ss,xdim,160);
|
2013-01-20 21:17:31 +00:00
|
|
|
int32_t x2 = xdim-x1;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2013-01-17 21:59:11 +00:00
|
|
|
int32_t y1 = ss;
|
|
|
|
int32_t y2 = 200;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2013-01-17 21:59:11 +00:00
|
|
|
if (ud.screen_size > 0 && (GametypeFlags[ud.coop]&GAMETYPE_FRAGBAR) && (g_netServer || ud.multimode > 1))
|
|
|
|
{
|
|
|
|
int32_t i, j = 0;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2013-01-17 21:59:11 +00:00
|
|
|
for (TRAVERSE_CONNECT(i))
|
|
|
|
if (i > j) j = i;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2013-01-17 21:59:11 +00:00
|
|
|
if (j >= 1) y1 += 8;
|
|
|
|
if (j >= 4) y1 += 8;
|
|
|
|
if (j >= 8) y1 += 8;
|
|
|
|
if (j >= 12) y1 += 8;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (ud.screen_size >= 8 && ud.statusbarmode==0)
|
2014-09-30 04:14:21 +00:00
|
|
|
y2 -= (ss+scale(tilesiz[BOTTOMSTATUSBAR].y,ud.statusbarscale,100));
|
2013-01-17 21:59:11 +00:00
|
|
|
|
|
|
|
y1 = scale(y1,ydim,200);
|
2013-01-20 21:17:31 +00:00
|
|
|
y2 = scale(y2,ydim,200)+(getrendermode() != REND_CLASSIC);
|
|
|
|
|
|
|
|
if (g_halveScreenArea)
|
|
|
|
{
|
|
|
|
int32_t ourxdimen=x2-x1, ourydimen=y2-y1;
|
|
|
|
|
|
|
|
g_halfScreen.x1 = x1;
|
|
|
|
g_halfScreen.y1 = y1;
|
|
|
|
g_halfScreen.xdimen = (ourxdimen>>1);
|
|
|
|
g_halfScreen.ydimen = (ourydimen>>1);
|
|
|
|
|
|
|
|
x2 = x1 + (ourxdimen>>1);
|
|
|
|
y2 = y1 + (ourydimen>>1);
|
|
|
|
}
|
2013-01-17 21:59:11 +00:00
|
|
|
|
2013-01-20 21:17:31 +00:00
|
|
|
setview(x1,y1,x2-1,y2-1);
|
2013-01-17 21:59:11 +00:00
|
|
|
}
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
G_GetCrosshairColor();
|
|
|
|
G_SetCrosshairColor(CrosshairColors.r, CrosshairColors.g, CrosshairColors.b);
|
2008-08-08 00:32:16 +00:00
|
|
|
|
2006-04-13 20:47:06 +00:00
|
|
|
pub = NUMPAGES;
|
|
|
|
pus = NUMPAGES;
|
|
|
|
}
|
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
void P_RandomSpawnPoint(int32_t snum)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2008-11-20 14:06:36 +00:00
|
|
|
DukePlayer_t *p = g_player[snum].ps;
|
2009-01-09 09:29:17 +00:00
|
|
|
int32_t i=snum,j,k;
|
|
|
|
uint32_t dist,pdist = -1;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2010-01-16 23:08:17 +00:00
|
|
|
if ((g_netServer || ud.multimode > 1) && !(GametypeFlags[ud.coop] & GAMETYPE_FIXEDRESPAWN))
|
2006-08-18 23:52:26 +00:00
|
|
|
{
|
2008-11-20 14:06:36 +00:00
|
|
|
i = krand()%g_numPlayerSprites;
|
|
|
|
if (GametypeFlags[ud.coop] & GAMETYPE_TDMSPAWN)
|
2006-08-18 23:52:26 +00:00
|
|
|
{
|
2009-02-19 16:47:54 +00:00
|
|
|
for (j=0; j<ud.multimode; j++)
|
2006-08-18 23:52:26 +00:00
|
|
|
{
|
2008-08-11 23:22:29 +00:00
|
|
|
if (j != snum && g_player[j].ps->team == p->team && sprite[g_player[j].ps->i].extra > 0)
|
2006-08-18 23:52:26 +00:00
|
|
|
{
|
2009-02-19 16:47:54 +00:00
|
|
|
for (k=0; k<g_numPlayerSprites; k++)
|
2006-08-18 23:52:26 +00:00
|
|
|
{
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
dist = FindDistance2D(g_player[j].ps->pos.x-g_playerSpawnPoints[k].pos.x,g_player[j].ps->pos.y-g_playerSpawnPoints[k].pos.y);
|
2006-11-13 23:12:47 +00:00
|
|
|
if (dist < pdist)
|
2006-08-18 23:52:26 +00:00
|
|
|
i = k, pdist = dist;
|
|
|
|
}
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
2006-11-15 01:16:55 +00:00
|
|
|
}
|
2006-08-18 23:52:26 +00:00
|
|
|
}
|
2006-04-13 20:47:06 +00:00
|
|
|
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
p->bobpos.x = p->opos.x = p->pos.x = g_playerSpawnPoints[i].pos.x;
|
|
|
|
p->bobpos.y = p->opos.y = p->pos.y = g_playerSpawnPoints[i].pos.y;
|
|
|
|
p->opos.z = p->pos.z = g_playerSpawnPoints[i].pos.z;
|
|
|
|
p->ang = g_playerSpawnPoints[i].ang;
|
|
|
|
p->cursectnum = g_playerSpawnPoints[i].sect;
|
2009-12-12 11:07:59 +00:00
|
|
|
sprite[p->i].cstat = 1+256;
|
|
|
|
}
|
|
|
|
|
2013-06-20 18:31:50 +00:00
|
|
|
static inline void P_ResetTintFade(DukePlayer_t *ps)
|
|
|
|
{
|
|
|
|
ps->pals.f = 0;
|
|
|
|
#ifdef LUNATIC
|
|
|
|
ps->palsfadeprio = 0;
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
2009-12-12 11:07:59 +00:00
|
|
|
void P_ResetPlayer(int32_t snum)
|
|
|
|
{
|
|
|
|
vec3_t tmpvect;
|
2012-06-26 19:49:44 +00:00
|
|
|
DukePlayer_t *const pl = g_player[snum].ps;
|
|
|
|
spritetype *const sp = &sprite[pl->i];
|
2009-12-12 11:07:59 +00:00
|
|
|
|
2012-06-26 19:49:44 +00:00
|
|
|
tmpvect.x = pl->pos.x;
|
|
|
|
tmpvect.y = pl->pos.y;
|
|
|
|
tmpvect.z = pl->pos.z+PHEIGHT;
|
2009-12-12 11:07:59 +00:00
|
|
|
P_RandomSpawnPoint(snum);
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
sp->x = actor[pl->i].bpos.x = pl->bobpos.x = pl->opos.x = pl->pos.x;
|
|
|
|
sp->y = actor[pl->i].bpos.y = pl->bobpos.y = pl->opos.y = pl->pos.y;
|
2012-12-23 14:00:08 +00:00
|
|
|
sp->z = actor[pl->i].bpos.y = pl->opos.z =pl->pos.z;
|
2012-06-26 19:49:44 +00:00
|
|
|
updatesector(pl->pos.x,pl->pos.y,&pl->cursectnum);
|
|
|
|
setsprite(pl->i,&tmpvect);
|
2009-12-12 11:07:59 +00:00
|
|
|
sp->cstat = 257;
|
|
|
|
|
|
|
|
sp->shade = -12;
|
|
|
|
sp->clipdist = 64;
|
|
|
|
sp->xrepeat = 42;
|
|
|
|
sp->yrepeat = 36;
|
2012-06-26 19:49:44 +00:00
|
|
|
sp->owner = pl->i;
|
2009-12-12 11:07:59 +00:00
|
|
|
sp->xoffset = 0;
|
2012-06-26 19:49:44 +00:00
|
|
|
sp->pal = pl->palookup;
|
|
|
|
|
|
|
|
pl->last_extra = sp->extra = pl->max_player_health;
|
|
|
|
pl->wantweaponfire = -1;
|
|
|
|
pl->horiz = 100;
|
|
|
|
pl->on_crane = -1;
|
|
|
|
pl->frag_ps = snum;
|
|
|
|
pl->horizoff = 0;
|
|
|
|
pl->opyoff = 0;
|
|
|
|
pl->wackedbyactor = -1;
|
|
|
|
pl->inv_amount[GET_SHIELD] = g_startArmorAmount;
|
|
|
|
pl->dead_flag = 0;
|
|
|
|
pl->footprintcount = 0;
|
|
|
|
pl->weapreccnt = 0;
|
|
|
|
pl->fta = 0;
|
|
|
|
pl->ftq = 0;
|
|
|
|
pl->vel.x = pl->vel.y = 0;
|
|
|
|
pl->rotscrnang = 0;
|
|
|
|
pl->runspeed = g_playerFriction;
|
|
|
|
pl->falling_counter = 0;
|
|
|
|
|
2013-06-20 18:31:50 +00:00
|
|
|
P_ResetTintFade(pl);
|
|
|
|
|
2012-06-26 19:49:44 +00:00
|
|
|
actor[pl->i].extra = -1;
|
|
|
|
actor[pl->i].owner = pl->i;
|
|
|
|
|
|
|
|
actor[pl->i].cgg = 0;
|
|
|
|
actor[pl->i].movflag = 0;
|
|
|
|
actor[pl->i].tempang = 0;
|
|
|
|
actor[pl->i].actorstayput = -1;
|
|
|
|
actor[pl->i].dispicnum = 0;
|
|
|
|
actor[pl->i].owner = pl->i;
|
|
|
|
|
|
|
|
actor[pl->i].t_data[4] = 0;
|
2009-12-12 11:07:59 +00:00
|
|
|
|
|
|
|
P_ResetInventory(snum);
|
|
|
|
P_ResetWeapons(snum);
|
|
|
|
|
2012-06-26 19:49:44 +00:00
|
|
|
pl->reloading = 0;
|
2009-12-12 11:07:59 +00:00
|
|
|
|
2012-06-26 19:49:44 +00:00
|
|
|
pl->movement_lock = 0;
|
2009-12-12 11:07:59 +00:00
|
|
|
|
2014-11-22 12:29:25 +00:00
|
|
|
VM_OnEvent(EVENT_RESETPLAYER, pl->i, snum);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2009-12-05 09:22:43 +00:00
|
|
|
void P_ResetStatus(int32_t snum)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2008-11-20 14:06:36 +00:00
|
|
|
DukePlayer_t *p = g_player[snum].ps;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
|
|
|
ud.show_help = 0;
|
|
|
|
ud.showallmap = 0;
|
|
|
|
p->dead_flag = 0;
|
|
|
|
p->wackedbyactor = -1;
|
|
|
|
p->falling_counter = 0;
|
|
|
|
p->quick_kick = 0;
|
|
|
|
p->subweapon = 0;
|
|
|
|
p->last_full_weapon = 0;
|
|
|
|
p->ftq = 0;
|
|
|
|
p->fta = 0;
|
|
|
|
p->tipincs = 0;
|
|
|
|
p->buttonpalette = 0;
|
|
|
|
p->actorsqu =-1;
|
|
|
|
p->invdisptime = 0;
|
|
|
|
p->refresh_inventory= 0;
|
|
|
|
p->last_pissed_time = 0;
|
|
|
|
p->holster_weapon = 0;
|
|
|
|
p->pycount = 0;
|
|
|
|
p->pyoff = 0;
|
|
|
|
p->opyoff = 0;
|
|
|
|
p->loogcnt = 0;
|
|
|
|
p->angvel = 0;
|
|
|
|
p->weapon_sway = 0;
|
|
|
|
p->extra_extra8 = 0;
|
|
|
|
p->show_empty_weapon= 0;
|
|
|
|
p->dummyplayersprite=-1;
|
|
|
|
p->crack_time = 0;
|
|
|
|
p->hbomb_hold_delay = 0;
|
|
|
|
p->transporter_hold = 0;
|
|
|
|
p->wantweaponfire = -1;
|
|
|
|
p->hurt_delay = 0;
|
|
|
|
p->footprintcount = 0;
|
|
|
|
p->footprintpal = 0;
|
|
|
|
p->footprintshade = 0;
|
|
|
|
p->jumping_toggle = 0;
|
|
|
|
p->ohoriz = p->horiz= 140;
|
|
|
|
p->horizoff = 0;
|
|
|
|
p->bobcounter = 0;
|
|
|
|
p->on_ground = 0;
|
|
|
|
p->player_par = 0;
|
|
|
|
p->return_to_center = 9;
|
2009-04-26 05:57:42 +00:00
|
|
|
p->airleft = 15*GAMETICSPERSEC;
|
2006-04-13 20:47:06 +00:00
|
|
|
p->rapid_fire_hold = 0;
|
|
|
|
p->toggle_key_flag = 0;
|
|
|
|
p->access_spritenum = -1;
|
2010-01-16 23:08:17 +00:00
|
|
|
if ((g_netServer || ud.multimode > 1) && (GametypeFlags[ud.coop] & GAMETYPE_ACCESSATSTART))
|
2006-04-13 20:47:06 +00:00
|
|
|
p->got_access = 7;
|
|
|
|
else p->got_access = 0;
|
|
|
|
p->random_club_frame= 0;
|
|
|
|
pus = 1;
|
|
|
|
p->on_warping_sector = 0;
|
|
|
|
p->spritebridge = 0;
|
|
|
|
p->sbs = 0;
|
2011-01-17 03:49:34 +00:00
|
|
|
p->palette = BASEPAL;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2009-12-15 05:53:15 +00:00
|
|
|
if (p->inv_amount[GET_STEROIDS] < 400)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2009-12-15 05:53:15 +00:00
|
|
|
p->inv_amount[GET_STEROIDS] = 0;
|
2012-11-04 23:41:05 +00:00
|
|
|
p->inven_icon = ICON_NONE;
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
p->heat_on = 0;
|
|
|
|
p->jetpack_on = 0;
|
|
|
|
p->holoduke_on = -1;
|
|
|
|
|
|
|
|
p->look_ang = 512 - ((ud.level_number&1)<<10);
|
|
|
|
|
|
|
|
p->rotscrnang = 0;
|
|
|
|
p->orotscrnang = 1; // JBF 20031220
|
|
|
|
p->newowner =-1;
|
|
|
|
p->jumping_counter = 0;
|
|
|
|
p->hard_landing = 0;
|
2011-02-25 21:50:19 +00:00
|
|
|
p->vel.x = 0;
|
|
|
|
p->vel.y = 0;
|
|
|
|
p->vel.z = 0;
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
p->fric.x = 0;
|
|
|
|
p->fric.y = 0;
|
2006-04-13 20:47:06 +00:00
|
|
|
p->somethingonplayer =-1;
|
|
|
|
p->one_eighty_count = 0;
|
|
|
|
p->cheat_phase = 0;
|
|
|
|
|
|
|
|
p->on_crane = -1;
|
|
|
|
|
2012-12-28 17:18:16 +00:00
|
|
|
if ((PWEAPON(snum, p->curr_weapon, WorksLike) == PISTOL_WEAPON) &&
|
|
|
|
(PWEAPON(snum, p->curr_weapon, Reload) > PWEAPON(snum, p->curr_weapon, TotalTime)))
|
|
|
|
p->kickback_pic = PWEAPON(snum, p->curr_weapon, TotalTime);
|
2006-04-13 20:47:06 +00:00
|
|
|
else p->kickback_pic = 0;
|
|
|
|
|
2013-06-27 23:04:57 +00:00
|
|
|
p->weapon_pos = WEAPON_POS_START;
|
2006-04-13 20:47:06 +00:00
|
|
|
p->walking_snd_toggle= 0;
|
|
|
|
p->weapon_ang = 0;
|
|
|
|
|
|
|
|
p->knuckle_incs = 1;
|
|
|
|
p->fist_incs = 0;
|
|
|
|
p->knee_incs = 0;
|
|
|
|
p->jetpack_on = 0;
|
|
|
|
p->reloading = 0;
|
|
|
|
|
2006-05-20 14:31:24 +00:00
|
|
|
p->movement_lock = 0;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2010-01-05 21:53:14 +00:00
|
|
|
p->frag_ps = snum;
|
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
P_UpdateScreenPal(p);
|
2014-11-22 12:29:25 +00:00
|
|
|
VM_OnEvent(EVENT_RESETPLAYER, p->i, snum);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
void P_ResetWeapons(int32_t snum)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2009-01-09 09:29:17 +00:00
|
|
|
int32_t weapon;
|
2008-11-20 14:06:36 +00:00
|
|
|
DukePlayer_t *p = g_player[snum].ps;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2006-11-14 21:35:50 +00:00
|
|
|
for (weapon = PISTOL_WEAPON; weapon < MAX_WEAPONS; weapon++)
|
2006-04-13 20:47:06 +00:00
|
|
|
p->ammo_amount[weapon] = 0;
|
|
|
|
|
2013-06-27 23:04:57 +00:00
|
|
|
p->weapon_pos = WEAPON_POS_START;
|
2006-04-13 20:47:06 +00:00
|
|
|
p->curr_weapon = PISTOL_WEAPON;
|
2012-12-28 17:18:16 +00:00
|
|
|
p->kickback_pic = PWEAPON(snum, p->curr_weapon, TotalTime);
|
2010-05-02 23:27:30 +00:00
|
|
|
p->gotweapon = ((1<<PISTOL_WEAPON) | (1<<KNEE_WEAPON) | (1<<HANDREMOTE_WEAPON));
|
2009-06-28 20:23:12 +00:00
|
|
|
p->ammo_amount[PISTOL_WEAPON] = min(p->max_ammo_amount[PISTOL_WEAPON], 48);
|
2006-04-13 20:47:06 +00:00
|
|
|
p->last_weapon = -1;
|
|
|
|
|
|
|
|
p->show_empty_weapon= 0;
|
|
|
|
p->last_pissed_time = 0;
|
|
|
|
p->holster_weapon = 0;
|
2014-11-22 12:29:25 +00:00
|
|
|
VM_OnEvent(EVENT_RESETWEAPONS, p->i, snum);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
void P_ResetInventory(int32_t snum)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2008-11-20 14:06:36 +00:00
|
|
|
DukePlayer_t *p = g_player[snum].ps;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2009-12-15 05:53:15 +00:00
|
|
|
Bmemset(p->inv_amount, 0, sizeof(p->inv_amount));
|
|
|
|
|
2006-11-15 01:16:55 +00:00
|
|
|
p->scuba_on = 0;
|
|
|
|
p->heat_on = 0;
|
|
|
|
p->jetpack_on = 0;
|
2006-04-13 20:47:06 +00:00
|
|
|
p->holoduke_on = -1;
|
2009-12-15 05:53:15 +00:00
|
|
|
p->inv_amount[GET_SHIELD] = g_startArmorAmount;
|
2012-11-04 23:41:05 +00:00
|
|
|
p->inven_icon = ICON_NONE;
|
2014-11-22 12:29:25 +00:00
|
|
|
VM_OnEvent(EVENT_RESETINVENTORY, p->i, snum);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
static void resetprestat(int32_t snum,int32_t g)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2008-11-20 14:06:36 +00:00
|
|
|
DukePlayer_t *p = g_player[snum].ps;
|
2009-01-09 09:29:17 +00:00
|
|
|
int32_t i;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
g_spriteDeleteQueuePos = 0;
|
2009-02-19 16:47:54 +00:00
|
|
|
for (i=0; i<g_spriteDeleteQueueSize; i++) SpriteDeletionQueue[i] = -1;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
|
|
|
p->hbomb_on = 0;
|
|
|
|
p->cheat_phase = 0;
|
|
|
|
p->toggle_key_flag = 0;
|
|
|
|
p->secret_rooms = 0;
|
|
|
|
p->max_secret_rooms = 0;
|
|
|
|
p->actors_killed = 0;
|
|
|
|
p->max_actors_killed = 0;
|
2013-06-27 23:04:57 +00:00
|
|
|
p->lastrandomspot = 0;
|
|
|
|
p->weapon_pos = WEAPON_POS_START;
|
2010-05-16 22:53:08 +00:00
|
|
|
|
2013-06-20 18:31:50 +00:00
|
|
|
P_ResetTintFade(p);
|
|
|
|
|
2012-12-28 17:18:16 +00:00
|
|
|
if ((PWEAPON(snum, p->curr_weapon, WorksLike) == PISTOL_WEAPON) &&
|
|
|
|
(PWEAPON(snum, p->curr_weapon, Reload) > PWEAPON(snum, p->curr_weapon, TotalTime)))
|
|
|
|
p->kickback_pic = PWEAPON(snum, p->curr_weapon, TotalTime);
|
2010-05-16 22:53:08 +00:00
|
|
|
else p->kickback_pic = 0;
|
|
|
|
|
2006-04-13 20:47:06 +00:00
|
|
|
p->last_weapon = -1;
|
|
|
|
p->weapreccnt = 0;
|
|
|
|
p->interface_toggle_flag = 0;
|
|
|
|
p->show_empty_weapon= 0;
|
|
|
|
p->holster_weapon = 0;
|
|
|
|
p->last_pissed_time = 0;
|
|
|
|
|
|
|
|
p->one_parallax_sectnum = -1;
|
|
|
|
p->visibility = ud.const_visibility;
|
|
|
|
|
|
|
|
screenpeek = myconnectindex;
|
2008-11-20 14:06:36 +00:00
|
|
|
g_numAnimWalls = 0;
|
|
|
|
g_numCyclers = 0;
|
|
|
|
g_animateCount = 0;
|
2006-04-13 20:47:06 +00:00
|
|
|
parallaxtype = 0;
|
2008-11-20 14:06:36 +00:00
|
|
|
randomseed = 1996;
|
2006-04-13 20:47:06 +00:00
|
|
|
ud.pause_on = 0;
|
|
|
|
ud.camerasprite =-1;
|
|
|
|
ud.eog = 0;
|
|
|
|
tempwallptr = 0;
|
2013-12-26 19:45:12 +00:00
|
|
|
g_curViewscreen =-1;
|
2008-11-20 14:06:36 +00:00
|
|
|
g_earthquakeTime = 0;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
g_numInterpolations = 0;
|
2006-04-13 20:47:06 +00:00
|
|
|
startofdynamicinterpolations = 0;
|
|
|
|
|
2010-05-02 23:27:30 +00:00
|
|
|
if (((g&MODE_EOL) != MODE_EOL && numplayers < 2 && !g_netServer) ||
|
2010-08-02 08:13:51 +00:00
|
|
|
(!(GametypeFlags[ud.coop]&GAMETYPE_PRESERVEINVENTORYDEATH) && numplayers > 1))
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2008-11-20 14:06:36 +00:00
|
|
|
P_ResetWeapons(snum);
|
|
|
|
P_ResetInventory(snum);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
2014-10-25 03:25:57 +00:00
|
|
|
else if (PWEAPON(snum, p->curr_weapon, WorksLike) == HANDREMOTE_WEAPON)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
|
|
|
p->ammo_amount[HANDBOMB_WEAPON]++;
|
|
|
|
p->curr_weapon = HANDBOMB_WEAPON;
|
|
|
|
}
|
|
|
|
|
|
|
|
p->timebeforeexit = 0;
|
|
|
|
p->customexitsound = 0;
|
|
|
|
}
|
|
|
|
|
2014-02-22 19:38:54 +00:00
|
|
|
// Tweak sprites contained in moving sectors with these SE lotags.
|
|
|
|
#define FIXSPR_SELOTAGP(k) \
|
|
|
|
((k)==SE_0_ROTATING_SECTOR \
|
|
|
|
|| (k)==SE_6_SUBWAY \
|
|
|
|
|| (k)==SE_14_SUBWAY_CAR)
|
2011-06-22 19:12:47 +00:00
|
|
|
|
2012-12-28 17:17:53 +00:00
|
|
|
// Set up sprites in moving sectors that are to be fixed wrt a certain pivot
|
2011-06-22 19:12:47 +00:00
|
|
|
// position and should not diverge from it due to roundoff error in the future.
|
2012-12-28 17:17:53 +00:00
|
|
|
// Has to be after the spawning stuff.
|
|
|
|
static void G_SetupRotfixedSprites(void)
|
2011-06-22 19:12:47 +00:00
|
|
|
{
|
2012-12-28 17:17:53 +00:00
|
|
|
int32_t i;
|
2011-06-22 19:12:47 +00:00
|
|
|
|
|
|
|
for (i=headspritestat[STAT_EFFECTOR]; i>=0; i=nextspritestat[i])
|
|
|
|
{
|
|
|
|
if (FIXSPR_SELOTAGP(sprite[i].lotag))
|
|
|
|
{
|
2011-06-29 19:57:05 +00:00
|
|
|
#ifdef YAX_ENABLE
|
|
|
|
int32_t firstrun = 1;
|
|
|
|
#endif
|
2012-12-28 17:17:53 +00:00
|
|
|
int32_t j = headspritesect[sprite[i].sectnum];
|
2014-02-22 19:38:54 +00:00
|
|
|
|
2011-06-29 19:57:05 +00:00
|
|
|
while (j>=0)
|
2011-06-22 19:12:47 +00:00
|
|
|
{
|
2014-02-22 19:38:54 +00:00
|
|
|
const spritetype *const spr = &sprite[j];
|
|
|
|
|
2011-06-22 19:12:47 +00:00
|
|
|
// TRIPBOMB uses t_data[7] for its own purposes. Wouldn't be
|
|
|
|
// too useful with moving sectors anyway
|
2014-02-22 19:38:54 +00:00
|
|
|
if ((ROTFIXSPR_STATNUMP(spr->statnum) && spr->picnum!=TRIPBOMB) ||
|
|
|
|
((spr->statnum==STAT_ACTOR || spr->statnum==STAT_ZOMBIEACTOR) &&
|
|
|
|
A_CheckSpriteTileFlags(spr->picnum, SFLAG_ROTFIXED)))
|
2011-06-22 19:12:47 +00:00
|
|
|
{
|
2012-12-28 17:17:53 +00:00
|
|
|
int32_t pivot = i;
|
|
|
|
|
2011-06-22 19:12:47 +00:00
|
|
|
if (sprite[i].lotag==0)
|
|
|
|
pivot = sprite[i].owner;
|
2011-06-29 19:57:05 +00:00
|
|
|
if (j!=i && j!=pivot && pivot>=0 && pivot<MAXSPRITES)
|
|
|
|
{
|
|
|
|
// let's hope we don't step on anyone's toes here
|
2012-12-23 19:24:21 +00:00
|
|
|
actor[j].t_data[7] = ROTFIXSPR_MAGIC | pivot; // 'rs' magic + pivot SE sprite index
|
2014-02-22 19:38:54 +00:00
|
|
|
actor[j].t_data[8] = spr->x - sprite[pivot].x;
|
|
|
|
actor[j].t_data[9] = spr->y - sprite[pivot].y;
|
2011-06-29 19:57:05 +00:00
|
|
|
}
|
2011-06-22 19:12:47 +00:00
|
|
|
}
|
2011-06-29 19:57:05 +00:00
|
|
|
|
|
|
|
j = nextspritesect[j];
|
|
|
|
#ifdef YAX_ENABLE
|
|
|
|
if (j<0 && firstrun)
|
2012-09-08 22:18:44 +00:00
|
|
|
if (sprite[i].lotag==SE_6_SUBWAY || sprite[i].lotag==SE_14_SUBWAY_CAR)
|
2011-06-29 19:57:05 +00:00
|
|
|
{
|
|
|
|
firstrun = 0;
|
|
|
|
j = actor[i].t_data[9];
|
|
|
|
if (j >= 0)
|
|
|
|
j = headspritesect[j];
|
|
|
|
}
|
|
|
|
#endif
|
2011-06-22 19:12:47 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-09-05 17:37:38 +00:00
|
|
|
static inline int32_t G_CheckExitSprite(int32_t i)
|
|
|
|
{
|
|
|
|
return (sprite[i].lotag == UINT16_MAX && (sprite[i].cstat&16));
|
|
|
|
}
|
|
|
|
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
static void prelevel(char g)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2011-08-17 18:52:54 +00:00
|
|
|
int32_t i, nexti, j, startwall, endwall;
|
2009-01-09 09:29:17 +00:00
|
|
|
int32_t switchpicnum;
|
2014-05-30 00:02:19 +00:00
|
|
|
uint8_t *tagbitmap = (uint8_t *)Xcalloc(65536>>3, 1);
|
2011-08-17 18:52:54 +00:00
|
|
|
|
2012-03-25 22:01:03 +00:00
|
|
|
Bmemset(show2dsector, 0, sizeof(show2dsector));
|
2013-12-28 17:04:34 +00:00
|
|
|
#ifdef LEGACY_ROR
|
2009-07-04 09:28:21 +00:00
|
|
|
Bmemset(ror_protectedsectors, 0, MAXSECTORS);
|
2013-12-28 17:04:34 +00:00
|
|
|
#endif
|
2006-04-13 20:47:06 +00:00
|
|
|
resetprestat(0,g);
|
2008-11-20 14:06:36 +00:00
|
|
|
g_numClouds = 0;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
Clean up parallaxed sky functionality, part 2.
- Rename sky_t members: yscale -> horizfrac, bits -> lognumtiles.
- Add default sky (8 tiles, horizfrac=32768 (i.e. 1/2 the scene horiz), offsets
all zero) and CLOUDYOCEAN sky (8 tiles, horizfrac=65536, offsets all zero)
to multipsky[].
- Get rid of "psky_t g_psky", merely maintaining a g_pskyidx instead. Set it up
at map load time so as to keep the behavior of the legacy per-map psky:
the last sector index with a matching psky ceiling wins.
- In mapstate_t, save g_pskyidx too, not (former) pskybits and pskyoffs[].
- Make on-map-load global psky setup consistent for the game and editor by
factoring it out into common.c: G_SetupGlobalPsky().
- Remove a couple of useless initializations, add some static assertions.
This commit is more likely to introduce subtle differences in behavior.
Specifically, getpsky() now always returns the default sky properties instead of
the global sky ones (but with all-zero offsets) when no match for a suiting
multi-psky is found. This is only likely to affect the yscale/horizfrac of
non-multi-pskies when a global non-default multi-psky has been set up.
Bump BYTEVERSION again.
git-svn-id: https://svn.eduke32.com/eduke32@3976 1a8010ca-5511-0410-912e-c29ae57300e0
2013-08-04 20:37:48 +00:00
|
|
|
G_SetupGlobalPsky();
|
|
|
|
|
2009-02-19 16:47:54 +00:00
|
|
|
for (i=0; i<numsectors; i++)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
|
|
|
sector[i].extra = 256;
|
|
|
|
|
2006-11-13 23:12:47 +00:00
|
|
|
switch (sector[i].lotag)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2012-08-26 22:16:08 +00:00
|
|
|
case ST_20_CEILING_DOOR:
|
|
|
|
case ST_22_SPLITTING_DOOR:
|
2006-11-16 03:02:42 +00:00
|
|
|
if (sector[i].floorz > sector[i].ceilingz)
|
|
|
|
sector[i].lotag |= 32768;
|
|
|
|
continue;
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2006-11-13 23:12:47 +00:00
|
|
|
if (sector[i].ceilingstat&1)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2006-11-13 23:12:47 +00:00
|
|
|
if (waloff[sector[i].ceilingpicnum] == 0)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2006-11-13 23:12:47 +00:00
|
|
|
if (sector[i].ceilingpicnum == LA)
|
2009-02-19 16:47:54 +00:00
|
|
|
for (j=0; j<5; j++)
|
2006-04-13 20:47:06 +00:00
|
|
|
tloadtile(sector[i].ceilingpicnum+j, 0);
|
|
|
|
}
|
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
if (sector[i].ceilingpicnum == CLOUDYSKIES && g_numClouds < 127)
|
|
|
|
clouds[g_numClouds++] = i;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2007-08-27 06:46:31 +00:00
|
|
|
if (g_player[0].ps->one_parallax_sectnum == -1)
|
|
|
|
g_player[0].ps->one_parallax_sectnum = i;
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2006-11-13 23:12:47 +00:00
|
|
|
if (sector[i].lotag == 32767) //Found a secret room
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2007-08-27 06:46:31 +00:00
|
|
|
g_player[0].ps->max_secret_rooms++;
|
2006-04-13 20:47:06 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
|
2012-11-15 14:28:18 +00:00
|
|
|
if (sector[i].lotag == UINT16_MAX)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2007-08-27 06:46:31 +00:00
|
|
|
g_player[0].ps->exitx = wall[sector[i].wallptr].x;
|
|
|
|
g_player[0].ps->exity = wall[sector[i].wallptr].y;
|
2006-04-13 20:47:06 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-09-05 17:37:38 +00:00
|
|
|
// NOTE: must be safe loop because callbacks could delete sprites.
|
|
|
|
for (SPRITES_OF_STAT_SAFE(STAT_DEFAULT, i, nexti))
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2008-12-13 07:23:13 +00:00
|
|
|
A_ResetVars(i);
|
2013-10-27 21:12:22 +00:00
|
|
|
#if !defined LUNATIC
|
2008-11-20 14:06:36 +00:00
|
|
|
A_LoadActor(i);
|
2013-02-21 18:54:07 +00:00
|
|
|
#endif
|
2014-11-22 12:29:25 +00:00
|
|
|
VM_OnEvent(EVENT_LOADACTOR, i, -1);
|
2013-09-05 17:37:38 +00:00
|
|
|
if (G_CheckExitSprite(i))
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2007-08-27 06:46:31 +00:00
|
|
|
g_player[0].ps->exitx = SX;
|
|
|
|
g_player[0].ps->exity = SY;
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
2012-01-28 14:38:23 +00:00
|
|
|
else switch (DYNAMICTILEMAP(PN))
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2006-11-16 03:02:42 +00:00
|
|
|
case GPSPEED__STATIC:
|
2013-09-05 17:37:38 +00:00
|
|
|
// DELETE_AFTER_LOADACTOR. Must not change statnum.
|
2006-11-16 03:02:42 +00:00
|
|
|
sector[SECT].extra = SLT;
|
|
|
|
break;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2006-11-16 03:02:42 +00:00
|
|
|
case CYCLER__STATIC:
|
2013-09-05 17:37:38 +00:00
|
|
|
// DELETE_AFTER_LOADACTOR. Must not change statnum.
|
2008-11-20 14:06:36 +00:00
|
|
|
if (g_numCyclers >= MAXCYCLERS)
|
2006-11-16 03:02:42 +00:00
|
|
|
{
|
|
|
|
Bsprintf(tempbuf,"\nToo many cycling sectors (%d max).",MAXCYCLERS);
|
2008-11-20 14:06:36 +00:00
|
|
|
G_GameExit(tempbuf);
|
2006-11-16 03:02:42 +00:00
|
|
|
}
|
2008-11-20 14:06:36 +00:00
|
|
|
cyclers[g_numCyclers][0] = SECT;
|
|
|
|
cyclers[g_numCyclers][1] = SLT;
|
|
|
|
cyclers[g_numCyclers][2] = SS;
|
|
|
|
cyclers[g_numCyclers][3] = sector[SECT].floorshade;
|
|
|
|
cyclers[g_numCyclers][4] = SHT;
|
|
|
|
cyclers[g_numCyclers][5] = (SA == 1536);
|
|
|
|
g_numCyclers++;
|
2006-11-16 03:02:42 +00:00
|
|
|
break;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2006-11-16 03:02:42 +00:00
|
|
|
case SECTOREFFECTOR__STATIC:
|
|
|
|
case ACTIVATOR__STATIC:
|
|
|
|
case TOUCHPLATE__STATIC:
|
|
|
|
case ACTIVATORLOCKED__STATIC:
|
|
|
|
case MUSICANDSFX__STATIC:
|
|
|
|
case LOCATORS__STATIC:
|
|
|
|
case MASTERSWITCH__STATIC:
|
|
|
|
case RESPAWN__STATIC:
|
2009-04-28 05:31:32 +00:00
|
|
|
sprite[i].cstat &= ~(1|256);
|
2006-11-16 03:02:42 +00:00
|
|
|
break;
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2013-09-05 17:37:38 +00:00
|
|
|
// Delete some effector / effector modifier sprites AFTER the loop running
|
|
|
|
// the LOADACTOR events. DELETE_AFTER_LOADACTOR.
|
|
|
|
for (SPRITES_OF_STAT_SAFE(STAT_DEFAULT, i, nexti))
|
|
|
|
if (!G_CheckExitSprite(i))
|
|
|
|
switch (DYNAMICTILEMAP(PN))
|
|
|
|
{
|
|
|
|
case GPSPEED__STATIC:
|
|
|
|
case CYCLER__STATIC:
|
|
|
|
A_DeleteSprite(i);
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
for (i = 0; i < MAXSPRITES; i++)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
if (sprite[i].statnum < MAXSTATUS && (PN != SECTOREFFECTOR || SLT != SE_14_SUBWAY_CAR))
|
|
|
|
A_Spawn(-1, i);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
for (i = 0; i < MAXSPRITES; i++)
|
|
|
|
{
|
|
|
|
if (sprite[i].statnum < MAXSTATUS && PN == SECTOREFFECTOR && SLT == SE_14_SUBWAY_CAR)
|
|
|
|
A_Spawn(-1, i);
|
|
|
|
}
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2012-12-28 17:17:53 +00:00
|
|
|
G_SetupRotfixedSprites();
|
2011-06-22 19:12:47 +00:00
|
|
|
|
2011-08-17 18:52:54 +00:00
|
|
|
for (i=headspritestat[STAT_DEFAULT]; i>=0; i=nextspritestat[i])
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2011-08-20 11:53:52 +00:00
|
|
|
int32_t ii;
|
2012-09-02 14:00:58 +00:00
|
|
|
|
2011-12-11 13:26:39 +00:00
|
|
|
if (PN <= 0) // oob safety for switch below
|
|
|
|
continue;
|
|
|
|
|
2011-08-17 18:52:16 +00:00
|
|
|
for (ii=0; ii<2; ii++)
|
2012-01-28 14:38:23 +00:00
|
|
|
switch (DYNAMICTILEMAP(PN-1+ii))
|
2006-11-16 03:02:42 +00:00
|
|
|
{
|
2011-08-17 18:52:16 +00:00
|
|
|
case DIPSWITCH__STATIC:
|
|
|
|
case DIPSWITCH2__STATIC:
|
|
|
|
case PULLSWITCH__STATIC:
|
|
|
|
case HANDSWITCH__STATIC:
|
|
|
|
case SLOTDOOR__STATIC:
|
|
|
|
case LIGHTSWITCH__STATIC:
|
|
|
|
case SPACELIGHTSWITCH__STATIC:
|
|
|
|
case SPACEDOORSWITCH__STATIC:
|
|
|
|
case FRANKENSTINESWITCH__STATIC:
|
|
|
|
case LIGHTSWITCH2__STATIC:
|
|
|
|
case POWERSWITCH1__STATIC:
|
|
|
|
case LOCKSWITCH1__STATIC:
|
|
|
|
case POWERSWITCH2__STATIC:
|
2012-09-02 14:00:58 +00:00
|
|
|
// the lower code only for the 'on' state (*)
|
2011-08-17 18:52:54 +00:00
|
|
|
if (ii==0)
|
2006-11-16 03:02:42 +00:00
|
|
|
{
|
2013-03-21 10:20:37 +00:00
|
|
|
j = sprite[i].lotag;
|
2011-08-17 18:52:54 +00:00
|
|
|
tagbitmap[j>>3] |= 1<<(j&7);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
2011-08-17 18:52:54 +00:00
|
|
|
|
2011-08-17 18:52:16 +00:00
|
|
|
break;
|
2006-11-16 03:02:42 +00:00
|
|
|
}
|
2011-08-17 18:52:54 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// initially 'on' SE 12 light (*)
|
|
|
|
for (j=headspritestat[STAT_EFFECTOR]; j>=0; j=nextspritestat[j])
|
|
|
|
{
|
2013-03-21 10:20:37 +00:00
|
|
|
int32_t t = sprite[j].hitag;
|
2011-08-17 18:52:16 +00:00
|
|
|
|
2012-09-08 22:18:44 +00:00
|
|
|
if (sprite[j].lotag == SE_12_LIGHT_SWITCH && tagbitmap[t>>3]&(1<<(t&7)))
|
2011-08-17 18:52:54 +00:00
|
|
|
actor[j].t_data[0] = 1;
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2013-03-21 10:20:37 +00:00
|
|
|
Bfree(tagbitmap);
|
2011-08-17 18:52:54 +00:00
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
g_mirrorCount = 0;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2006-11-14 21:35:50 +00:00
|
|
|
for (i = 0; i < numwalls; i++)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
|
|
|
walltype *wal;
|
|
|
|
wal = &wall[i];
|
|
|
|
|
2006-11-13 23:12:47 +00:00
|
|
|
if (wal->overpicnum == MIRROR && (wal->cstat&32) != 0)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
|
|
|
j = wal->nextsector;
|
|
|
|
|
2006-11-14 21:35:50 +00:00
|
|
|
if ((j >= 0) && sector[j].ceilingpicnum != MIRROR)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2012-01-05 20:48:05 +00:00
|
|
|
if (g_mirrorCount > 63)
|
|
|
|
G_GameExit("\nToo many mirrors (64 max.)");
|
|
|
|
|
2006-04-13 20:47:06 +00:00
|
|
|
sector[j].ceilingpicnum = MIRROR;
|
|
|
|
sector[j].floorpicnum = MIRROR;
|
2008-11-20 14:06:36 +00:00
|
|
|
g_mirrorWall[g_mirrorCount] = i;
|
|
|
|
g_mirrorSector[g_mirrorCount] = j;
|
|
|
|
g_mirrorCount++;
|
2006-04-13 20:47:06 +00:00
|
|
|
continue;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
if (g_numAnimWalls >= MAXANIMWALLS)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
|
|
|
Bsprintf(tempbuf,"\nToo many 'anim' walls (%d max).",MAXANIMWALLS);
|
2008-11-20 14:06:36 +00:00
|
|
|
G_GameExit(tempbuf);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
animwall[g_numAnimWalls].tag = 0;
|
|
|
|
animwall[g_numAnimWalls].wallnum = 0;
|
2012-09-12 09:45:14 +00:00
|
|
|
|
2013-12-26 19:45:14 +00:00
|
|
|
switchpicnum = G_GetForcefieldPicnum(i);
|
2011-12-09 19:12:15 +00:00
|
|
|
|
|
|
|
if (switchpicnum >= 0)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2012-01-28 14:38:23 +00:00
|
|
|
switch (DYNAMICTILEMAP(switchpicnum))
|
2011-12-09 19:12:15 +00:00
|
|
|
{
|
|
|
|
case FANSHADOW__STATIC:
|
|
|
|
case FANSPRITE__STATIC:
|
|
|
|
wall->cstat |= 65;
|
|
|
|
animwall[g_numAnimWalls].wallnum = i;
|
|
|
|
g_numAnimWalls++;
|
|
|
|
break;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2011-12-09 19:12:15 +00:00
|
|
|
case W_FORCEFIELD__STATIC:
|
|
|
|
if (wal->overpicnum==W_FORCEFIELD__STATIC)
|
|
|
|
for (j=0; j<3; j++)
|
|
|
|
tloadtile(W_FORCEFIELD+j, 0);
|
|
|
|
if (wal->shade > 31)
|
|
|
|
wal->cstat = 0;
|
2013-12-26 19:45:14 +00:00
|
|
|
else wal->cstat |= FORCEFIELD_CSTAT|256;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
|
|
|
|
2011-12-09 19:12:15 +00:00
|
|
|
if (wal->lotag && wal->nextwall >= 0)
|
|
|
|
wall[wal->nextwall].lotag =
|
|
|
|
wal->lotag;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2011-12-09 19:12:15 +00:00
|
|
|
case BIGFORCE__STATIC:
|
|
|
|
animwall[g_numAnimWalls].wallnum = i;
|
|
|
|
g_numAnimWalls++;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2011-12-09 19:12:15 +00:00
|
|
|
continue;
|
|
|
|
}
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
wal->extra = -1;
|
|
|
|
|
2012-01-28 14:38:23 +00:00
|
|
|
switch (DYNAMICTILEMAP(wal->picnum))
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2006-11-16 03:02:42 +00:00
|
|
|
case WATERTILE2__STATIC:
|
2009-02-19 16:47:54 +00:00
|
|
|
for (j=0; j<3; j++)
|
2006-11-16 03:02:42 +00:00
|
|
|
tloadtile(wal->picnum+j, 0);
|
|
|
|
break;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2006-11-16 03:02:42 +00:00
|
|
|
case TECHLIGHT2__STATIC:
|
|
|
|
case TECHLIGHT4__STATIC:
|
|
|
|
tloadtile(wal->picnum, 0);
|
|
|
|
break;
|
|
|
|
case W_TECHWALL1__STATIC:
|
|
|
|
case W_TECHWALL2__STATIC:
|
|
|
|
case W_TECHWALL3__STATIC:
|
|
|
|
case W_TECHWALL4__STATIC:
|
2008-11-20 14:06:36 +00:00
|
|
|
animwall[g_numAnimWalls].wallnum = i;
|
|
|
|
// animwall[g_numAnimWalls].tag = -1;
|
|
|
|
g_numAnimWalls++;
|
2006-11-16 03:02:42 +00:00
|
|
|
break;
|
|
|
|
case SCREENBREAK6__STATIC:
|
|
|
|
case SCREENBREAK7__STATIC:
|
|
|
|
case SCREENBREAK8__STATIC:
|
2009-02-19 16:47:54 +00:00
|
|
|
for (j=SCREENBREAK6; j<SCREENBREAK9; j++)
|
2006-11-16 03:02:42 +00:00
|
|
|
tloadtile(j, 0);
|
2008-11-20 14:06:36 +00:00
|
|
|
animwall[g_numAnimWalls].wallnum = i;
|
|
|
|
animwall[g_numAnimWalls].tag = -1;
|
|
|
|
g_numAnimWalls++;
|
2006-11-16 03:02:42 +00:00
|
|
|
break;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2006-11-16 03:02:42 +00:00
|
|
|
case FEMPIC1__STATIC:
|
|
|
|
case FEMPIC2__STATIC:
|
|
|
|
case FEMPIC3__STATIC:
|
|
|
|
wal->extra = wal->picnum;
|
2008-11-20 14:06:36 +00:00
|
|
|
animwall[g_numAnimWalls].tag = -1;
|
2006-11-16 03:02:42 +00:00
|
|
|
if (ud.lockout)
|
|
|
|
{
|
|
|
|
if (wal->picnum == FEMPIC1)
|
|
|
|
wal->picnum = BLANKSCREEN;
|
|
|
|
else wal->picnum = SCREENBREAK6;
|
|
|
|
}
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
animwall[g_numAnimWalls].wallnum = i;
|
|
|
|
animwall[g_numAnimWalls].tag = wal->picnum;
|
|
|
|
g_numAnimWalls++;
|
2006-11-16 03:02:42 +00:00
|
|
|
break;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2006-11-16 03:02:42 +00:00
|
|
|
case SCREENBREAK1__STATIC:
|
|
|
|
case SCREENBREAK2__STATIC:
|
|
|
|
case SCREENBREAK3__STATIC:
|
|
|
|
case SCREENBREAK4__STATIC:
|
|
|
|
case SCREENBREAK5__STATIC:
|
2012-09-12 09:45:14 +00:00
|
|
|
//
|
2006-11-16 03:02:42 +00:00
|
|
|
case SCREENBREAK9__STATIC:
|
|
|
|
case SCREENBREAK10__STATIC:
|
|
|
|
case SCREENBREAK11__STATIC:
|
|
|
|
case SCREENBREAK12__STATIC:
|
|
|
|
case SCREENBREAK13__STATIC:
|
|
|
|
case SCREENBREAK14__STATIC:
|
|
|
|
case SCREENBREAK15__STATIC:
|
|
|
|
case SCREENBREAK16__STATIC:
|
|
|
|
case SCREENBREAK17__STATIC:
|
|
|
|
case SCREENBREAK18__STATIC:
|
|
|
|
case SCREENBREAK19__STATIC:
|
2008-11-20 14:06:36 +00:00
|
|
|
animwall[g_numAnimWalls].wallnum = i;
|
|
|
|
animwall[g_numAnimWalls].tag = wal->picnum;
|
|
|
|
g_numAnimWalls++;
|
2006-11-16 03:02:42 +00:00
|
|
|
break;
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
//Invalidate textures in sector behind mirror
|
2009-02-19 16:47:54 +00:00
|
|
|
for (i=0; i<g_mirrorCount; i++)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2008-11-20 14:06:36 +00:00
|
|
|
startwall = sector[g_mirrorSector[i]].wallptr;
|
|
|
|
endwall = startwall + sector[g_mirrorSector[i]].wallnum;
|
2009-02-19 16:47:54 +00:00
|
|
|
for (j=startwall; j<endwall; j++)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
|
|
|
wall[j].picnum = MIRROR;
|
|
|
|
wall[j].overpicnum = MIRROR;
|
2008-11-20 14:06:36 +00:00
|
|
|
if (wall[g_mirrorWall[i]].pal == 4)
|
2008-10-11 11:50:02 +00:00
|
|
|
wall[j].pal = 4;
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-10-25 23:25:38 +00:00
|
|
|
|
2013-07-13 21:04:52 +00:00
|
|
|
void G_NewGame(int32_t vn, int32_t ln, int32_t sk)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2008-11-20 14:06:36 +00:00
|
|
|
DukePlayer_t *p = g_player[0].ps;
|
2009-01-09 09:29:17 +00:00
|
|
|
int32_t i;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2012-09-05 17:25:34 +00:00
|
|
|
G_HandleAsync();
|
2006-12-17 21:20:35 +00:00
|
|
|
|
2014-04-19 22:42:20 +00:00
|
|
|
if (g_skillSoundVoice >= 0 && ud.config.FXDevice >= 0 && ud.config.SoundToggle)
|
2006-12-17 21:20:35 +00:00
|
|
|
{
|
2014-04-19 22:42:20 +00:00
|
|
|
while (FX_SoundActive(g_skillSoundVoice))
|
2012-09-05 17:25:34 +00:00
|
|
|
G_HandleAsync();
|
2006-11-15 01:16:55 +00:00
|
|
|
}
|
2006-12-18 08:37:12 +00:00
|
|
|
|
2014-04-19 22:42:20 +00:00
|
|
|
g_skillSoundVoice = -1;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
|
|
|
ready2send = 0;
|
|
|
|
|
2010-01-16 23:08:17 +00:00
|
|
|
if (ud.m_recstat != 2 && ud.last_level >= 0 && (g_netServer || ud.multimode > 1) && (ud.coop&GAMETYPE_SCORESHEET))
|
2008-11-20 14:06:36 +00:00
|
|
|
G_BonusScreen(1);
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2013-03-15 16:56:29 +00:00
|
|
|
if (ln == 0 && vn == 3 && (!g_netServer && ud.multimode < 2) && ud.lockout == 0
|
|
|
|
&& (G_GetLogoFlags() & LOGO_NOE4CUTSCENE)==0)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2014-09-07 18:10:14 +00:00
|
|
|
S_PlayMusic(MapInfo[MUS_BRIEFING].musicfn, MUS_BRIEFING);
|
2006-04-13 20:47:06 +00:00
|
|
|
|
|
|
|
flushperms();
|
|
|
|
setview(0,0,xdim-1,ydim-1);
|
|
|
|
clearview(0L);
|
|
|
|
nextpage();
|
|
|
|
|
2014-01-12 14:02:30 +00:00
|
|
|
i = G_PlayAnim("vol41a.anm",6);
|
2006-04-13 20:47:06 +00:00
|
|
|
clearview(0L);
|
|
|
|
nextpage();
|
2014-01-12 14:02:30 +00:00
|
|
|
if (i)
|
|
|
|
goto end_vol4a;
|
|
|
|
|
|
|
|
i = G_PlayAnim("vol42a.anm",7);
|
|
|
|
clearview(0L);
|
|
|
|
nextpage();
|
|
|
|
if (i)
|
|
|
|
goto end_vol4a;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
G_PlayAnim("vol43a.anm",9);
|
2006-04-13 20:47:06 +00:00
|
|
|
clearview(0L);
|
|
|
|
nextpage();
|
|
|
|
|
2014-01-12 14:02:30 +00:00
|
|
|
end_vol4a:
|
2006-04-13 20:47:06 +00:00
|
|
|
FX_StopAllSounds();
|
|
|
|
}
|
|
|
|
|
2009-04-26 05:57:42 +00:00
|
|
|
g_showShareware = GAMETICSPERSEC*34;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2013-07-13 21:04:52 +00:00
|
|
|
ud.level_number = ln;
|
|
|
|
ud.volume_number = vn;
|
|
|
|
ud.player_skill = sk;
|
|
|
|
ud.secretlevel = 0;
|
2006-04-13 20:47:06 +00:00
|
|
|
ud.from_bonus = 0;
|
|
|
|
|
|
|
|
ud.last_level = -1;
|
2008-11-20 14:06:36 +00:00
|
|
|
g_lastSaveSlot = -1;
|
2014-10-29 17:07:47 +00:00
|
|
|
|
|
|
|
#ifdef __ANDROID__
|
|
|
|
p->zoom = 360;
|
|
|
|
#else
|
2013-07-13 21:04:52 +00:00
|
|
|
p->zoom = 768;
|
2014-10-29 17:07:47 +00:00
|
|
|
#endif
|
2013-07-13 21:04:52 +00:00
|
|
|
p->gm = 0;
|
2014-11-17 07:39:12 +00:00
|
|
|
M_CloseMenu(0);
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2013-01-19 18:29:00 +00:00
|
|
|
#if !defined LUNATIC
|
2006-12-17 21:20:35 +00:00
|
|
|
//AddLog("Newgame");
|
2008-12-13 07:23:13 +00:00
|
|
|
Gv_ResetVars();
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
Gv_InitWeaponPointers();
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2012-01-03 19:55:38 +00:00
|
|
|
// PK: Gv_ResetVars() might trip up the system (pointer) gamevars,
|
|
|
|
// e.g. if some earlier-version CON code had been loaded before
|
|
|
|
Gv_RefreshPointers();
|
2013-01-01 15:24:18 +00:00
|
|
|
#endif
|
2013-02-07 21:00:48 +00:00
|
|
|
Gv_ResetSystemDefaults();
|
|
|
|
|
2009-02-19 16:47:54 +00:00
|
|
|
for (i=0; i<(MAXVOLUMES*MAXLEVELS); i++)
|
2008-11-20 14:06:36 +00:00
|
|
|
if (MapInfo[i].savedstate)
|
2008-07-18 02:46:24 +00:00
|
|
|
{
|
2008-11-20 14:06:36 +00:00
|
|
|
Bfree(MapInfo[i].savedstate);
|
|
|
|
MapInfo[i].savedstate = NULL;
|
2008-07-18 02:46:24 +00:00
|
|
|
}
|
|
|
|
|
2006-12-17 21:20:35 +00:00
|
|
|
if (ud.m_coop != 1)
|
|
|
|
{
|
2009-02-19 16:47:54 +00:00
|
|
|
for (i=0; i<MAX_WEAPONS; i++)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2012-12-28 17:18:16 +00:00
|
|
|
if (PWEAPON(0, i, WorksLike)==PISTOL_WEAPON)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2006-12-17 21:20:35 +00:00
|
|
|
p->curr_weapon = i;
|
2010-05-02 23:27:30 +00:00
|
|
|
p->gotweapon |= (1<<i);
|
2009-06-28 20:23:12 +00:00
|
|
|
p->ammo_amount[i] = min(p->max_ammo_amount[i], 48);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
2012-12-28 17:18:16 +00:00
|
|
|
else if (PWEAPON(0, i, WorksLike)==KNEE_WEAPON)
|
2010-05-02 23:27:30 +00:00
|
|
|
p->gotweapon |= (1<<i);
|
2012-12-28 17:18:16 +00:00
|
|
|
else if (PWEAPON(0, i, WorksLike)==HANDREMOTE_WEAPON)
|
2010-05-02 23:27:30 +00:00
|
|
|
p->gotweapon |= (1<<i);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
2006-12-17 21:20:35 +00:00
|
|
|
p->last_weapon = -1;
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
2006-12-18 08:37:12 +00:00
|
|
|
|
2013-07-13 21:04:52 +00:00
|
|
|
display_mirror = 0;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2013-07-13 21:04:53 +00:00
|
|
|
#ifdef LUNATIC
|
|
|
|
// NOTE: Lunatic state creation is relatively early. No map has yet been loaded.
|
|
|
|
// XXX: What about the cases where G_EnterLevel() is called without a preceding G_NewGame()?
|
|
|
|
El_CreateGameState();
|
|
|
|
G_PostCreateGameState();
|
|
|
|
#endif
|
2014-11-22 12:29:25 +00:00
|
|
|
VM_OnEvent(EVENT_NEWGAME, g_player[myconnectindex].ps->i, myconnectindex);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2006-12-10 03:15:56 +00:00
|
|
|
static void resetpspritevars(char g)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2012-08-16 21:48:13 +00:00
|
|
|
int16_t i, j; //circ;
|
|
|
|
|
2009-07-12 01:55:34 +00:00
|
|
|
uint8_t aimmode[MAXPLAYERS],autoaim[MAXPLAYERS],weaponswitch[MAXPLAYERS];
|
|
|
|
DukeStatus_t tsbar[MAXPLAYERS];
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2012-02-14 23:13:38 +00:00
|
|
|
if (g_player[0].ps->cursectnum >= 0) // < 0 may happen if we start a map in void space (e.g. testing it)
|
|
|
|
{
|
|
|
|
A_InsertSprite(g_player[0].ps->cursectnum,g_player[0].ps->pos.x,g_player[0].ps->pos.y,g_player[0].ps->pos.z,
|
|
|
|
APLAYER,0,0,0,g_player[0].ps->ang,0,0,0,10);
|
|
|
|
}
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2009-07-12 01:55:34 +00:00
|
|
|
if (ud.recstat != 2)
|
2012-02-21 19:33:33 +00:00
|
|
|
for (TRAVERSE_CONNECT(i))
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2012-02-21 19:33:33 +00:00
|
|
|
aimmode[i] = g_player[i].ps->aim_mode;
|
|
|
|
autoaim[i] = g_player[i].ps->auto_aim;
|
|
|
|
weaponswitch[i] = g_player[i].ps->weaponswitch;
|
|
|
|
if ((g_netServer || ud.multimode > 1) && (GametypeFlags[ud.coop]&GAMETYPE_PRESERVEINVENTORYDEATH) && ud.last_level >= 0)
|
|
|
|
{
|
|
|
|
for (j=0; j<MAX_WEAPONS; j++)
|
|
|
|
tsbar[i].ammo_amount[j] = g_player[i].ps->ammo_amount[j];
|
2010-01-23 22:12:02 +00:00
|
|
|
|
2012-02-21 19:33:33 +00:00
|
|
|
tsbar[i].gotweapon = g_player[i].ps->gotweapon;
|
|
|
|
Bmemcpy(tsbar[i].inv_amount, g_player[i].ps->inv_amount, sizeof(tsbar[i].inv_amount));
|
|
|
|
tsbar[i].curr_weapon = g_player[i].ps->curr_weapon;
|
|
|
|
tsbar[i].inven_icon = g_player[i].ps->inven_icon;
|
|
|
|
}
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
P_ResetStatus(0);
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2012-02-21 19:33:33 +00:00
|
|
|
for (TRAVERSE_CONNECT(i))
|
|
|
|
if (i) Bmemcpy(g_player[i].ps,g_player[0].ps,sizeof(DukePlayer_t));
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2007-03-04 19:52:57 +00:00
|
|
|
if (ud.recstat != 2)
|
2012-02-21 19:33:33 +00:00
|
|
|
for (TRAVERSE_CONNECT(i))
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2012-02-21 19:33:33 +00:00
|
|
|
g_player[i].ps->aim_mode = aimmode[i];
|
|
|
|
g_player[i].ps->auto_aim = autoaim[i];
|
|
|
|
g_player[i].ps->weaponswitch = weaponswitch[i];
|
|
|
|
if ((g_netServer || ud.multimode > 1) && (GametypeFlags[ud.coop]&GAMETYPE_PRESERVEINVENTORYDEATH) && ud.last_level >= 0)
|
|
|
|
{
|
|
|
|
for (j=0; j<MAX_WEAPONS; j++)
|
|
|
|
g_player[i].ps->ammo_amount[j] = tsbar[i].ammo_amount[j];
|
2010-05-02 23:27:30 +00:00
|
|
|
|
2012-02-21 19:33:33 +00:00
|
|
|
g_player[i].ps->gotweapon = tsbar[i].gotweapon;
|
|
|
|
g_player[i].ps->curr_weapon = tsbar[i].curr_weapon;
|
|
|
|
g_player[i].ps->inven_icon = tsbar[i].inven_icon;
|
|
|
|
Bmemcpy(g_player[i].ps->inv_amount, tsbar[i].inv_amount, sizeof(tsbar[i].inv_amount));
|
|
|
|
}
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
g_numPlayerSprites = 0;
|
2011-10-17 18:42:10 +00:00
|
|
|
// circ = 2048/ud.multimode;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
g_whichPalForPlayer = 9;
|
2009-12-05 09:22:43 +00:00
|
|
|
j = 0;
|
2008-11-20 14:06:36 +00:00
|
|
|
i = headspritestat[STAT_PLAYER];
|
2006-11-13 23:12:47 +00:00
|
|
|
while (i >= 0)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2012-08-16 21:48:13 +00:00
|
|
|
const int32_t nexti = nextspritestat[i];
|
|
|
|
spritetype *const s = &sprite[i];
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
if (g_numPlayerSprites == MAXPLAYERS)
|
|
|
|
G_GameExit("\nToo many player sprites (max 16.)");
|
2006-04-13 20:47:06 +00:00
|
|
|
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
g_playerSpawnPoints[g_numPlayerSprites].pos.x = s->x;
|
|
|
|
g_playerSpawnPoints[g_numPlayerSprites].pos.y = s->y;
|
|
|
|
g_playerSpawnPoints[g_numPlayerSprites].pos.z = s->z;
|
|
|
|
g_playerSpawnPoints[g_numPlayerSprites].ang = s->ang;
|
|
|
|
g_playerSpawnPoints[g_numPlayerSprites].sect = s->sectnum;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
g_numPlayerSprites++;
|
2009-12-05 09:22:43 +00:00
|
|
|
|
|
|
|
if (j < MAXPLAYERS)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
|
|
|
s->owner = i;
|
|
|
|
s->shade = 0;
|
|
|
|
s->xrepeat = 42;
|
|
|
|
s->yrepeat = 36;
|
2012-08-13 18:25:32 +00:00
|
|
|
if (!g_fakeMultiMode)
|
|
|
|
s->cstat = j < numplayers ? 1+256 : 32768;
|
|
|
|
else
|
2012-08-16 21:48:13 +00:00
|
|
|
s->cstat = j < ud.multimode ? 1+256 : 32768;
|
2006-04-13 20:47:06 +00:00
|
|
|
s->xoffset = 0;
|
|
|
|
s->clipdist = 64;
|
|
|
|
|
2009-12-05 09:22:43 +00:00
|
|
|
// if (j < playerswhenstarted)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2009-12-05 09:22:43 +00:00
|
|
|
if ((g&MODE_EOL) != MODE_EOL || g_player[j].ps->last_extra == 0)
|
|
|
|
{
|
|
|
|
g_player[j].ps->last_extra = g_player[j].ps->max_player_health;
|
|
|
|
s->extra = g_player[j].ps->max_player_health;
|
|
|
|
g_player[j].ps->runspeed = g_playerFriction;
|
|
|
|
}
|
|
|
|
else s->extra = g_player[j].ps->last_extra;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2009-12-05 09:22:43 +00:00
|
|
|
s->yvel = j;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2010-01-16 23:08:17 +00:00
|
|
|
if (!g_player[j].pcolor && (g_netServer || ud.multimode > 1) && !(GametypeFlags[ud.coop] & GAMETYPE_TDM))
|
2006-04-18 06:01:16 +00:00
|
|
|
{
|
2009-12-05 09:22:43 +00:00
|
|
|
if (s->pal == 0)
|
2006-11-15 01:16:55 +00:00
|
|
|
{
|
2009-12-05 09:22:43 +00:00
|
|
|
int32_t k = 0;
|
|
|
|
|
|
|
|
for (; k<ud.multimode; k++)
|
2006-11-15 01:16:55 +00:00
|
|
|
{
|
2009-12-05 09:22:43 +00:00
|
|
|
if (g_whichPalForPlayer == g_player[k].ps->palookup)
|
|
|
|
{
|
|
|
|
g_whichPalForPlayer++;
|
|
|
|
if (g_whichPalForPlayer >= 17)
|
|
|
|
g_whichPalForPlayer = 9;
|
|
|
|
k=0;
|
|
|
|
}
|
2006-04-18 16:30:15 +00:00
|
|
|
}
|
2009-12-05 09:22:43 +00:00
|
|
|
g_player[j].pcolor = s->pal = g_player[j].ps->palookup = g_whichPalForPlayer++;
|
|
|
|
if (g_whichPalForPlayer >= 17)
|
|
|
|
g_whichPalForPlayer = 9;
|
2006-04-18 16:30:15 +00:00
|
|
|
}
|
2009-12-05 09:22:43 +00:00
|
|
|
else g_player[j].pcolor = g_player[j].ps->palookup = s->pal;
|
2006-04-18 06:01:16 +00:00
|
|
|
}
|
2009-12-05 09:22:43 +00:00
|
|
|
else
|
2006-08-18 23:52:26 +00:00
|
|
|
{
|
2009-12-05 09:22:43 +00:00
|
|
|
int32_t k = g_player[j].pcolor;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2009-12-05 09:22:43 +00:00
|
|
|
if (GametypeFlags[ud.coop] & GAMETYPE_TDM)
|
|
|
|
{
|
|
|
|
k = G_GetTeamPalette(g_player[j].pteam);
|
|
|
|
g_player[j].ps->team = g_player[j].pteam;
|
|
|
|
}
|
|
|
|
s->pal = g_player[j].ps->palookup = k;
|
|
|
|
}
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2009-12-05 09:22:43 +00:00
|
|
|
g_player[j].ps->i = i;
|
|
|
|
g_player[j].ps->frag_ps = j;
|
2010-05-02 23:27:30 +00:00
|
|
|
actor[i].owner = i;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2012-10-29 04:29:17 +00:00
|
|
|
g_player[j].ps->autostep = (20L<<8);
|
|
|
|
g_player[j].ps->autostep_sbw = (4L<<8);
|
|
|
|
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
actor[i].bpos.x = g_player[j].ps->bobpos.x = g_player[j].ps->opos.x = g_player[j].ps->pos.x = s->x;
|
|
|
|
actor[i].bpos.y = g_player[j].ps->bobpos.y = g_player[j].ps->opos.y = g_player[j].ps->pos.y = s->y;
|
2012-12-23 14:00:08 +00:00
|
|
|
actor[i].bpos.z = g_player[j].ps->opos.z = g_player[j].ps->pos.z = s->z;
|
2009-12-05 09:22:43 +00:00
|
|
|
g_player[j].ps->oang = g_player[j].ps->ang = s->ang;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2009-12-05 09:22:43 +00:00
|
|
|
updatesector(s->x,s->y,&g_player[j].ps->cursectnum);
|
|
|
|
}
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2009-12-05 09:22:43 +00:00
|
|
|
j++;
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
2012-03-11 17:38:13 +00:00
|
|
|
else A_DeleteSprite(i);
|
2012-08-16 21:48:13 +00:00
|
|
|
|
2006-04-13 20:47:06 +00:00
|
|
|
i = nexti;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2006-12-10 21:53:33 +00:00
|
|
|
static inline void clearfrags(void)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2011-12-25 15:32:14 +00:00
|
|
|
int32_t i;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2011-12-25 15:32:14 +00:00
|
|
|
for (i=0; i<ud.multimode; i++)
|
2007-08-27 06:46:31 +00:00
|
|
|
{
|
2011-12-25 15:32:14 +00:00
|
|
|
playerdata_t *p = &g_player[i];
|
|
|
|
|
|
|
|
p->ps->frag = p->ps->fraggedself = 0;
|
2012-08-13 18:25:28 +00:00
|
|
|
Bmemset(p->frags, 0, sizeof(p->frags));
|
2007-08-27 06:46:31 +00:00
|
|
|
}
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2013-07-04 19:38:46 +00:00
|
|
|
void G_ResetTimers(uint8_t keepgtics)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
totalclock = cloudtotalclock = ototalclock = lockclock = 0;
|
2006-04-13 20:47:06 +00:00
|
|
|
ready2send = 1;
|
2008-11-20 14:06:36 +00:00
|
|
|
g_levelTextTime = 85;
|
2014-12-21 15:51:48 +00:00
|
|
|
|
2013-07-04 19:38:46 +00:00
|
|
|
if (!keepgtics)
|
|
|
|
g_moveThingsCount = 0;
|
2014-12-21 15:51:48 +00:00
|
|
|
|
2014-10-25 03:27:13 +00:00
|
|
|
if (g_curViewscreen >= 0)
|
|
|
|
actor[g_curViewscreen].t_data[0] = 0;
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2011-02-25 21:50:19 +00:00
|
|
|
void G_ClearFIFO(void)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2011-02-25 21:50:19 +00:00
|
|
|
int32_t i = MAXPLAYERS-1;
|
|
|
|
|
|
|
|
g_emuJumpTics = 0;
|
2007-08-27 00:20:15 +00:00
|
|
|
|
2011-02-25 21:50:19 +00:00
|
|
|
Bmemset(&avg, 0, sizeof(input_t));
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2008-08-06 11:50:34 +00:00
|
|
|
clearbufbyte(&loc,sizeof(input_t),0L);
|
|
|
|
clearbufbyte(&inputfifo,sizeof(input_t)*MOVEFIFOSIZ*MAXPLAYERS,0L);
|
2008-11-20 14:06:36 +00:00
|
|
|
|
2011-02-25 21:50:19 +00:00
|
|
|
for (; i >= 0; i--)
|
2007-08-27 06:46:31 +00:00
|
|
|
{
|
|
|
|
if (g_player[i].sync != NULL)
|
2011-02-25 21:50:19 +00:00
|
|
|
Bmemset(g_player[i].sync, 0, sizeof(input_t));
|
|
|
|
g_player[i].vote = g_player[i].gotvote = 0;
|
2007-08-27 06:46:31 +00:00
|
|
|
}
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2011-02-25 21:50:19 +00:00
|
|
|
int32_t G_FindLevelByFile(const char *fn)
|
2006-12-10 06:49:01 +00:00
|
|
|
{
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
for (int volume = 0; volume < MAXVOLUMES; volume++)
|
2006-12-10 06:49:01 +00:00
|
|
|
{
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
const int voloff = volume * MAXLEVELS;
|
|
|
|
for (int level = 0; level < MAXLEVELS; level++)
|
2006-12-10 06:49:01 +00:00
|
|
|
{
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
if (MapInfo[voloff + level].filename == NULL)
|
|
|
|
continue;
|
|
|
|
|
|
|
|
if (!Bstrcasecmp(fn, MapInfo[voloff + level].filename))
|
|
|
|
return voloff + level;
|
2006-12-10 06:49:01 +00:00
|
|
|
}
|
|
|
|
}
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
|
|
|
|
return MAXLEVELS * MAXVOLUMES;
|
2006-12-10 06:49:01 +00:00
|
|
|
}
|
|
|
|
|
2011-08-17 18:52:54 +00:00
|
|
|
void G_FadeLoad(int32_t r, int32_t g, int32_t b, int32_t start, int32_t end, int32_t step, int32_t ticwait)
|
2010-05-02 23:27:30 +00:00
|
|
|
{
|
2011-08-17 18:52:54 +00:00
|
|
|
int32_t m = (step < 0) ? -1 : 1;
|
|
|
|
|
|
|
|
int32_t nexttic = totalclock;
|
|
|
|
|
|
|
|
for (; m*start <= m*end; start += step)
|
2010-05-02 23:27:30 +00:00
|
|
|
{
|
2011-08-17 18:52:54 +00:00
|
|
|
while (totalclock < nexttic)
|
|
|
|
sampletimer();
|
|
|
|
nexttic += ticwait;
|
2010-05-02 23:27:30 +00:00
|
|
|
|
2011-08-17 18:52:54 +00:00
|
|
|
if (KB_KeyPressed(sc_Space))
|
2010-05-02 23:27:30 +00:00
|
|
|
{
|
2011-08-17 18:52:54 +00:00
|
|
|
KB_ClearKeyDown(sc_Space);
|
|
|
|
return;
|
2010-05-02 23:27:30 +00:00
|
|
|
}
|
2011-08-17 18:52:54 +00:00
|
|
|
|
|
|
|
G_FadePalette(r,g,b,start|128);
|
|
|
|
flushperms();
|
|
|
|
G_DoLoadScreen(" ", -1);
|
|
|
|
}
|
2010-05-02 23:27:30 +00:00
|
|
|
}
|
|
|
|
|
2011-01-09 18:53:06 +00:00
|
|
|
|
|
|
|
static void G_LoadMapHack(char *outbuf, const char *filename)
|
|
|
|
{
|
|
|
|
if (filename != NULL)
|
|
|
|
Bstrcpy(outbuf, filename);
|
2011-02-25 21:50:19 +00:00
|
|
|
|
2013-05-06 19:43:38 +00:00
|
|
|
append_ext_UNSAFE(outbuf, ".mhk");
|
2011-02-25 21:50:19 +00:00
|
|
|
|
|
|
|
if (!loadmaphack(outbuf))
|
2012-03-26 05:05:57 +00:00
|
|
|
initprintf("Loaded map hack file \"%s\"\n",outbuf);
|
2011-01-09 18:53:06 +00:00
|
|
|
}
|
|
|
|
|
2014-09-07 18:10:12 +00:00
|
|
|
static void G_ReallocCopyMusicName(int32_t level_number, const char *levnamebuf, int32_t altp)
|
2011-12-25 15:32:30 +00:00
|
|
|
{
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
char **musfn = altp ? &MapInfo[level_number].ext_musicfn : &MapInfo[level_number].musicfn;
|
|
|
|
uint8_t len = Bstrlen(levnamebuf) + 1;
|
|
|
|
*musfn = (char *)Xrealloc(*musfn, len);
|
|
|
|
Bstrncpy(*musfn, levnamebuf, len);
|
2011-12-25 15:32:30 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
// levnamebuf should have at least size BMAX_PATH
|
|
|
|
void G_SetupFilenameBasedMusic(char *levnamebuf, const char *boardfilename, int32_t level_number)
|
|
|
|
{
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
char *p, *exts[] = {
|
|
|
|
#ifdef HAVE_FLAC
|
|
|
|
"flac",
|
|
|
|
#endif
|
|
|
|
#ifdef HAVE_VORBIS
|
|
|
|
"ogg",
|
|
|
|
#endif
|
|
|
|
"mid"
|
|
|
|
};
|
2011-12-25 15:32:30 +00:00
|
|
|
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
Bstrncpy(levnamebuf, boardfilename, BMAX_PATH);
|
2011-12-25 15:32:30 +00:00
|
|
|
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
Bcorrectfilename(levnamebuf, 0);
|
2011-12-25 15:32:30 +00:00
|
|
|
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
if (NULL == (p = Bstrrchr(levnamebuf, '.')))
|
2011-12-25 15:32:30 +00:00
|
|
|
{
|
|
|
|
p = levnamebuf + Bstrlen(levnamebuf);
|
|
|
|
p[0] = '.';
|
|
|
|
}
|
|
|
|
|
2014-10-29 17:07:47 +00:00
|
|
|
for (unsigned int i = 0; i < ARRAY_SIZE(exts); i++)
|
2011-12-25 15:32:30 +00:00
|
|
|
{
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
int32_t fil;
|
2011-12-25 15:32:30 +00:00
|
|
|
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
Bmemcpy(p+1, exts[i], Bstrlen(exts[i]) + 1);
|
2011-12-25 15:32:30 +00:00
|
|
|
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
if ((fil = kopen4loadfrommod(levnamebuf, 0)) != -1)
|
|
|
|
{
|
|
|
|
kclose(fil);
|
|
|
|
G_ReallocCopyMusicName(level_number, levnamebuf, i < (ARRAY_SIZE(exts) - 1));
|
|
|
|
return;
|
|
|
|
}
|
|
|
|
}
|
2011-12-25 15:32:30 +00:00
|
|
|
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
DO_FREE_AND_NULL(MapInfo[level_number].ext_musicfn);
|
|
|
|
G_ReallocCopyMusicName(level_number, "dethtoll.mid", 0);
|
2011-12-25 15:32:30 +00:00
|
|
|
}
|
|
|
|
|
Clean up some player code a bit... make bobposx/bobposy a vec2_t, make fricxv/fricyv a per-player vec2_t (TODO: CON access), promote angvel in input_t to int16_t and allow for player angle changes that result in odd numbered angles (we were effectively artificially limiting the angle to 1024 values before), fix some HUD model ID stuff that should help with the weapons in the HRP, clean up a bunch of random functions (P_FireWeapon(), P_DisplayTip(), P_DisplayAccess(), P_DisplayWeapon(), P_GetInput(), etc). Also clean up G_SetupFilenameBasedMusic() to loop through flac/ogg/mid when searching for usermap music replacements. Some of this really needs a BYTEVERSION bump, but these commits aren't for synthesis to build so we're not doing it yet. DONT_BUILD.
git-svn-id: https://svn.eduke32.com/eduke32@4703 1a8010ca-5511-0410-912e-c29ae57300e0
2014-10-29 17:07:11 +00:00
|
|
|
static inline int G_HaveUserMap(void)
|
2013-12-24 09:44:25 +00:00
|
|
|
{
|
|
|
|
return (boardfilename[0] != 0 && ud.m_level_number == 7 && ud.m_volume_number == 0);
|
|
|
|
}
|
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
int32_t G_EnterLevel(int32_t g)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2012-05-25 18:39:22 +00:00
|
|
|
int32_t i, mii;
|
2006-04-13 20:47:06 +00:00
|
|
|
char levname[BMAX_PATH];
|
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
// flushpackets();
|
|
|
|
// waitforeverybody();
|
2007-08-27 06:46:31 +00:00
|
|
|
vote_map = vote_episode = voting = -1;
|
|
|
|
|
2006-04-13 20:47:06 +00:00
|
|
|
ud.respawn_monsters = ud.m_respawn_monsters;
|
|
|
|
ud.respawn_items = ud.m_respawn_items;
|
|
|
|
ud.respawn_inventory = ud.m_respawn_inventory;
|
|
|
|
ud.monsters_off = ud.m_monsters_off;
|
|
|
|
ud.coop = ud.m_coop;
|
|
|
|
ud.marker = ud.m_marker;
|
|
|
|
ud.ffire = ud.m_ffire;
|
2006-05-04 03:14:49 +00:00
|
|
|
ud.noexits = ud.m_noexits;
|
|
|
|
|
2013-07-13 21:04:52 +00:00
|
|
|
if ((g&MODE_DEMO) != MODE_DEMO)
|
|
|
|
ud.recstat = ud.m_recstat;
|
2006-11-14 21:35:50 +00:00
|
|
|
if ((g&MODE_DEMO) == 0 && ud.recstat == 2)
|
2006-04-13 20:47:06 +00:00
|
|
|
ud.recstat = 0;
|
|
|
|
|
2011-02-25 21:50:19 +00:00
|
|
|
if (g_networkMode != NET_DEDICATED_SERVER)
|
|
|
|
{
|
|
|
|
FX_StopAllSounds();
|
|
|
|
S_ClearSoundLocks();
|
|
|
|
FX_SetReverb(0);
|
|
|
|
setgamemode(ud.config.ScreenMode,ud.config.ScreenWidth,ud.config.ScreenHeight,ud.config.ScreenBPP);
|
|
|
|
}
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2013-12-24 09:44:25 +00:00
|
|
|
if (G_HaveUserMap())
|
2006-12-09 23:41:43 +00:00
|
|
|
{
|
2009-06-28 20:23:12 +00:00
|
|
|
int32_t volume, level;
|
2006-12-10 06:49:01 +00:00
|
|
|
|
2006-12-12 07:25:01 +00:00
|
|
|
Bcorrectfilename(boardfilename,0);
|
|
|
|
|
2011-02-25 21:50:19 +00:00
|
|
|
volume = level = G_FindLevelByFile(boardfilename);
|
2006-12-10 06:49:01 +00:00
|
|
|
|
2009-07-28 06:32:58 +00:00
|
|
|
if (level != MAXLEVELS*MAXVOLUMES)
|
2006-12-09 23:41:43 +00:00
|
|
|
{
|
2009-06-28 20:23:12 +00:00
|
|
|
level &= MAXLEVELS-1;
|
|
|
|
volume = (volume - level) / MAXLEVELS;
|
|
|
|
|
2006-12-09 23:41:43 +00:00
|
|
|
ud.level_number = ud.m_level_number = level;
|
|
|
|
ud.volume_number = ud.m_volume_number = volume;
|
|
|
|
boardfilename[0] = 0;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2012-05-25 18:39:22 +00:00
|
|
|
mii = (ud.volume_number*MAXLEVELS)+ud.level_number;
|
|
|
|
|
|
|
|
if (MapInfo[mii].name == NULL || MapInfo[mii].filename == NULL)
|
2006-12-04 22:22:07 +00:00
|
|
|
{
|
2013-12-24 09:44:25 +00:00
|
|
|
if (G_HaveUserMap())
|
2006-12-05 21:22:19 +00:00
|
|
|
{
|
2012-05-25 18:39:22 +00:00
|
|
|
if (MapInfo[mii].filename == NULL)
|
2014-05-30 00:02:19 +00:00
|
|
|
MapInfo[mii].filename = (char *)Xcalloc(BMAX_PATH, sizeof(uint8_t));
|
2012-05-25 18:39:22 +00:00
|
|
|
if (MapInfo[mii].name == NULL)
|
2014-05-30 00:02:19 +00:00
|
|
|
MapInfo[mii].name = Xstrdup("User Map");
|
2006-12-05 21:22:19 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2012-05-25 18:39:22 +00:00
|
|
|
OSD_Printf(OSDTEXT_RED "Map E%dL%d not defined!\n", ud.volume_number+1, ud.level_number+1);
|
2006-12-05 21:22:19 +00:00
|
|
|
return 1;
|
|
|
|
}
|
2006-12-04 22:22:07 +00:00
|
|
|
}
|
|
|
|
|
2010-01-24 23:33:17 +00:00
|
|
|
i = ud.screen_size;
|
|
|
|
ud.screen_size = 0;
|
2009-10-25 23:25:38 +00:00
|
|
|
|
2011-01-09 18:53:06 +00:00
|
|
|
G_DoLoadScreen("Loading map . . .", -1);
|
2010-01-24 23:33:17 +00:00
|
|
|
G_UpdateScreenArea();
|
2011-01-09 18:53:06 +00:00
|
|
|
|
2010-01-24 23:33:17 +00:00
|
|
|
ud.screen_size = i;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2013-12-24 09:44:25 +00:00
|
|
|
if (G_HaveUserMap())
|
2006-12-04 22:22:07 +00:00
|
|
|
{
|
|
|
|
Bstrcpy(levname, boardfilename);
|
2014-06-16 23:17:11 +00:00
|
|
|
if (g_gameNamePtr)
|
|
|
|
Bsprintf(apptitle,"%s - %s - " APPNAME,levname,g_gameNamePtr);
|
|
|
|
else
|
|
|
|
Bsprintf(apptitle,"%s - " APPNAME,levname);
|
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
if (g_gameNamePtr)
|
|
|
|
Bsprintf(apptitle,"%s - %s - " APPNAME,MapInfo[mii].name,g_gameNamePtr);
|
|
|
|
else
|
|
|
|
Bsprintf(apptitle,"%s - " APPNAME,MapInfo[mii].name);
|
2006-12-04 22:22:07 +00:00
|
|
|
}
|
2006-12-05 21:22:19 +00:00
|
|
|
|
2008-07-22 09:05:34 +00:00
|
|
|
Bstrcpy(tempbuf,apptitle);
|
2006-12-05 21:22:19 +00:00
|
|
|
wm_setapptitle(tempbuf);
|
2011-01-09 18:53:06 +00:00
|
|
|
|
2013-12-24 09:44:25 +00:00
|
|
|
/***** Load the map *****/
|
2006-11-15 01:16:55 +00:00
|
|
|
{
|
2013-12-24 09:44:25 +00:00
|
|
|
DukePlayer_t *ps = g_player[0].ps;
|
|
|
|
|
|
|
|
if (!VOLUMEONE && G_HaveUserMap())
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2013-12-24 09:44:25 +00:00
|
|
|
if (loadboard(boardfilename, 0, &ps->pos, &ps->ang, &ps->cursectnum) < 0)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2012-05-25 18:39:19 +00:00
|
|
|
OSD_Printf(OSD_ERROR "Map \"%s\" not found or invalid map version!\n",boardfilename);
|
2006-04-13 20:47:06 +00:00
|
|
|
return 1;
|
2006-11-15 01:16:55 +00:00
|
|
|
}
|
2006-12-17 21:20:35 +00:00
|
|
|
|
2011-12-25 15:32:30 +00:00
|
|
|
G_LoadMapHack(levname, boardfilename);
|
|
|
|
G_SetupFilenameBasedMusic(levname, boardfilename, ud.m_level_number);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
2013-12-24 09:44:25 +00:00
|
|
|
else if (loadboard(MapInfo[mii].filename, VOLUMEONE, &ps->pos, &ps->ang, &ps->cursectnum) < 0)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2012-05-25 18:39:19 +00:00
|
|
|
OSD_Printf(OSD_ERROR "Map \"%s\" not found or invalid map version!\n",
|
2012-05-25 18:39:22 +00:00
|
|
|
MapInfo[mii].filename);
|
2006-04-13 20:47:06 +00:00
|
|
|
return 1;
|
2006-11-15 01:16:55 +00:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
2013-09-15 17:59:21 +00:00
|
|
|
G_LoadMapHack(levname, MapInfo[mii].filename);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-01-24 23:33:17 +00:00
|
|
|
g_precacheCount = 0;
|
2011-08-17 18:52:54 +00:00
|
|
|
Bmemset(gotpic, 0, sizeof(gotpic));
|
|
|
|
Bmemset(precachehightile, 0, sizeof(precachehightile));
|
2010-01-24 23:33:17 +00:00
|
|
|
|
2010-05-02 23:27:30 +00:00
|
|
|
//clearbufbyte(Actor,sizeof(Actor),0l); // JBF 20040531: yes? no?
|
2006-04-13 20:47:06 +00:00
|
|
|
|
|
|
|
prelevel(g);
|
|
|
|
|
2012-09-12 09:45:14 +00:00
|
|
|
G_AlignWarpElevators();
|
2006-04-13 20:47:06 +00:00
|
|
|
resetpspritevars(g);
|
|
|
|
|
2011-08-17 18:52:54 +00:00
|
|
|
G_FadeLoad(0,0,0, 63,0, -7, 4);
|
2010-01-24 23:33:17 +00:00
|
|
|
G_CacheMapData();
|
2011-08-17 18:52:54 +00:00
|
|
|
G_FadeLoad(0,0,0, 0,63, 7, 4);
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2006-11-13 23:12:47 +00:00
|
|
|
if (ud.recstat != 2)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2012-05-25 18:39:22 +00:00
|
|
|
g_musicIndex = mii;
|
2012-06-04 22:01:45 +00:00
|
|
|
if (MapInfo[g_musicIndex].musicfn != NULL)
|
|
|
|
S_PlayMusic(MapInfo[g_musicIndex].musicfn, g_musicIndex);
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2010-07-22 20:29:09 +00:00
|
|
|
if (g & (MODE_GAME|MODE_EOL))
|
2009-06-24 08:20:10 +00:00
|
|
|
{
|
2012-02-21 19:33:33 +00:00
|
|
|
for (TRAVERSE_CONNECT(i))
|
2014-11-29 03:43:11 +00:00
|
|
|
{
|
2012-02-21 19:33:33 +00:00
|
|
|
g_player[i].ps->gm = MODE_GAME;
|
2014-11-29 03:43:11 +00:00
|
|
|
M_CloseMenu(i);
|
|
|
|
}
|
2009-06-24 08:20:10 +00:00
|
|
|
}
|
2010-07-22 20:29:09 +00:00
|
|
|
else if (g & MODE_RESTART)
|
2006-04-13 20:47:06 +00:00
|
|
|
{
|
2006-11-13 23:12:47 +00:00
|
|
|
if (ud.recstat == 2)
|
2007-08-27 06:46:31 +00:00
|
|
|
g_player[myconnectindex].ps->gm = MODE_DEMO;
|
|
|
|
else g_player[myconnectindex].ps->gm = MODE_GAME;
|
2006-04-13 20:47:06 +00:00
|
|
|
}
|
|
|
|
|
2006-11-14 21:35:50 +00:00
|
|
|
if ((ud.recstat == 1) && (g&MODE_RESTART) != MODE_RESTART)
|
2008-11-20 14:06:36 +00:00
|
|
|
G_OpenDemoWrite();
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2014-09-30 04:08:10 +00:00
|
|
|
#ifndef __ANDROID__
|
2010-07-22 20:29:09 +00:00
|
|
|
if (VOLUMEONE && ud.level_number == 0 && ud.recstat != 2)
|
2011-02-25 21:50:19 +00:00
|
|
|
P_DoQuote(QUOTE_F1HELP,g_player[myconnectindex].ps);
|
2014-09-30 04:08:10 +00:00
|
|
|
#endif
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2012-02-21 19:33:33 +00:00
|
|
|
for (TRAVERSE_CONNECT(i))
|
|
|
|
switch (DYNAMICTILEMAP(sector[sprite[g_player[i].ps->i].sectnum].floorpicnum))
|
|
|
|
{
|
|
|
|
case HURTRAIL__STATIC:
|
|
|
|
case FLOORSLIME__STATIC:
|
|
|
|
case FLOORPLASMA__STATIC:
|
|
|
|
P_ResetWeapons(i);
|
|
|
|
P_ResetInventory(i);
|
|
|
|
g_player[i].ps->gotweapon &= ~(1<<PISTOL_WEAPON);
|
|
|
|
g_player[i].ps->ammo_amount[PISTOL_WEAPON] = 0;
|
|
|
|
g_player[i].ps->curr_weapon = KNEE_WEAPON;
|
|
|
|
g_player[i].ps->kickback_pic = 0;
|
|
|
|
break;
|
|
|
|
}
|
2006-04-13 20:47:06 +00:00
|
|
|
|
|
|
|
//PREMAP.C - replace near the my's at the end of the file
|
|
|
|
|
2012-12-12 02:53:13 +00:00
|
|
|
Net_NotifyNewGame();
|
2008-11-20 14:06:36 +00:00
|
|
|
Net_ResetPrediction();
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2007-08-27 06:46:31 +00:00
|
|
|
//g_player[myconnectindex].ps->palette = palette;
|
2008-11-20 14:06:36 +00:00
|
|
|
//G_FadePalette(0,0,0,0);
|
2011-01-17 03:49:34 +00:00
|
|
|
P_SetGamePalette(g_player[myconnectindex].ps, BASEPAL, 0); // JBF 20040308
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2010-01-24 23:33:17 +00:00
|
|
|
P_UpdateScreenPal(g_player[myconnectindex].ps);
|
|
|
|
flushperms();
|
2006-04-13 20:47:06 +00:00
|
|
|
|
|
|
|
everyothertime = 0;
|
2008-11-20 14:06:36 +00:00
|
|
|
g_globalRandom = 0;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
|
|
|
ud.last_level = ud.level_number+1;
|
|
|
|
|
2011-02-25 21:50:19 +00:00
|
|
|
G_ClearFIFO();
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2009-02-19 16:47:54 +00:00
|
|
|
for (i=g_numInterpolations-1; i>=0; i--) bakipos[i] = *curipos[i];
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2012-02-02 17:34:16 +00:00
|
|
|
g_restorePalette = -1;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2010-01-24 23:33:17 +00:00
|
|
|
G_FadePalette(0,0,0,0);
|
|
|
|
G_UpdateScreenArea();
|
|
|
|
clearview(0L);
|
|
|
|
G_DrawBackground();
|
|
|
|
G_DrawRooms(myconnectindex,65536);
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2007-08-27 06:46:31 +00:00
|
|
|
g_player[myconnectindex].ps->over_shoulder_on = 0;
|
2006-04-13 20:47:06 +00:00
|
|
|
|
|
|
|
clearfrags();
|
|
|
|
|
2013-07-04 19:38:46 +00:00
|
|
|
G_ResetTimers(0); // Here we go
|
2006-04-13 20:47:06 +00:00
|
|
|
|
2008-11-20 14:06:36 +00:00
|
|
|
//Bsprintf(g_szBuf,"G_EnterLevel L=%d V=%d",ud.level_number, ud.volume_number);
|
2006-04-13 20:47:06 +00:00
|
|
|
//AddLog(g_szBuf);
|
|
|
|
// variables are set by pointer...
|
2006-10-19 00:45:36 +00:00
|
|
|
|
2012-05-25 18:39:22 +00:00
|
|
|
Bmemcpy(currentboardfilename, boardfilename, BMAX_PATH);
|
2014-11-22 12:29:25 +00:00
|
|
|
VM_OnEvent(EVENT_ENTERLEVEL, -1, -1);
|
2012-05-25 18:39:22 +00:00
|
|
|
OSD_Printf(OSDTEXT_YELLOW "E%dL%d: %s\n", ud.volume_number+1, ud.level_number+1,
|
|
|
|
MapInfo[mii].name);
|
2011-04-07 01:16:29 +00:00
|
|
|
|
|
|
|
Net_WaitForServer();
|
2006-04-13 20:47:06 +00:00
|
|
|
return 0;
|
|
|
|
}
|
2008-07-18 02:46:24 +00:00
|
|
|
|
2009-01-09 09:29:17 +00:00
|
|
|
void G_FreeMapState(int32_t mapnum)
|
2008-07-18 02:46:24 +00:00
|
|
|
{
|
2013-05-19 19:29:23 +00:00
|
|
|
map_t *mapinfo = &MapInfo[mapnum];
|
2013-01-20 21:17:06 +00:00
|
|
|
#if !defined LUNATIC
|
2013-05-19 19:29:16 +00:00
|
|
|
int32_t j;
|
2013-05-19 19:29:23 +00:00
|
|
|
#endif
|
|
|
|
if (mapinfo->savedstate == NULL)
|
|
|
|
return;
|
|
|
|
|
|
|
|
#if !defined LUNATIC
|
2009-02-19 16:47:54 +00:00
|
|
|
for (j=0; j<g_gameVarCount; j++)
|
2008-07-18 02:46:24 +00:00
|
|
|
{
|
2008-11-20 14:06:36 +00:00
|
|
|
if (aGameVars[j].dwFlags & GAMEVAR_NORESET) continue;
|
2013-05-19 19:29:23 +00:00
|
|
|
if (aGameVars[j].dwFlags & (GAMEVAR_PERPLAYER|GAMEVAR_PERACTOR))
|
2008-07-18 02:46:24 +00:00
|
|
|
{
|
2013-05-19 19:29:23 +00:00
|
|
|
if (mapinfo->savedstate->vars[j])
|
|
|
|
Bfree(mapinfo->savedstate->vars[j]);
|
2008-07-18 02:46:24 +00:00
|
|
|
}
|
|
|
|
}
|
2013-10-27 21:12:20 +00:00
|
|
|
#else
|
|
|
|
Bfree(mapinfo->savedstate->savecode);
|
2013-01-20 21:17:06 +00:00
|
|
|
#endif
|
2013-05-19 19:29:23 +00:00
|
|
|
Bfree(mapinfo->savedstate);
|
|
|
|
mapinfo->savedstate = NULL;
|
2008-08-09 19:59:41 +00:00
|
|
|
}
|