2019-09-18 22:27:46 +00:00
|
|
|
//
|
|
|
|
// Common non-engine code/data for EDuke32 and Mapster32
|
|
|
|
//
|
2019-09-21 18:59:54 +00:00
|
|
|
#include "ns.h" // Must come before everything else!
|
2019-09-18 22:27:46 +00:00
|
|
|
|
|
|
|
#include "compat.h"
|
|
|
|
#include "build.h"
|
|
|
|
#include "baselayer.h"
|
|
|
|
#include "palette.h"
|
2019-10-26 11:41:42 +00:00
|
|
|
#include "cmdlib.h"
|
2019-10-27 08:38:55 +00:00
|
|
|
#include "gamecvars.h"
|
2019-10-27 12:40:24 +00:00
|
|
|
#include "rts.h"
|
2019-10-31 22:25:21 +00:00
|
|
|
#include "gamecontrol.h"
|
2019-09-18 22:27:46 +00:00
|
|
|
|
|
|
|
|
|
|
|
#include "common.h"
|
|
|
|
#include "common_game.h"
|
|
|
|
|
2019-09-21 22:10:48 +00:00
|
|
|
BEGIN_RR_NS
|
|
|
|
|
2019-09-18 22:27:46 +00:00
|
|
|
//////////
|
|
|
|
|
|
|
|
// Set up new-style multi-psky handling.
|
|
|
|
void G_InitMultiPsky(int CLOUDYOCEAN__DYN, int MOONSKY1__DYN, int BIGORBIT1__DYN, int LA__DYN)
|
|
|
|
{
|
|
|
|
// When adding other multi-skies, take care that the tileofs[] values are
|
|
|
|
// <= PSKYOFF_MAX. (It can be increased up to MAXPSKYTILES, but should be
|
|
|
|
// set as tight as possible.)
|
|
|
|
|
|
|
|
// The default sky properties (all others are implicitly zero):
|
|
|
|
psky_t *sky = tileSetupSky(DEFAULTPSKY);
|
|
|
|
sky->lognumtiles = 3;
|
|
|
|
sky->horizfrac = 32768;
|
|
|
|
|
|
|
|
// CLOUDYOCEAN
|
|
|
|
// Aligns with the drawn scene horizon because it has one itself.
|
|
|
|
sky = tileSetupSky(CLOUDYOCEAN__DYN);
|
|
|
|
sky->lognumtiles = 3;
|
|
|
|
sky->horizfrac = 65536;
|
|
|
|
|
|
|
|
// MOONSKY1
|
|
|
|
// earth mountain mountain sun
|
|
|
|
sky = tileSetupSky(MOONSKY1__DYN);
|
|
|
|
sky->lognumtiles = 3;
|
|
|
|
sky->horizfrac = 32768;
|
|
|
|
sky->tileofs[6] = 1;
|
|
|
|
sky->tileofs[1] = 2;
|
|
|
|
sky->tileofs[4] = 2;
|
|
|
|
sky->tileofs[2] = 3;
|
|
|
|
|
|
|
|
// BIGORBIT1 // orbit
|
|
|
|
// earth1 2 3 moon/sun
|
|
|
|
sky = tileSetupSky(BIGORBIT1__DYN);
|
|
|
|
sky->lognumtiles = 3;
|
|
|
|
sky->horizfrac = 32768;
|
|
|
|
sky->tileofs[5] = 1;
|
|
|
|
sky->tileofs[6] = 2;
|
|
|
|
sky->tileofs[7] = 3;
|
|
|
|
sky->tileofs[2] = 4;
|
|
|
|
|
|
|
|
// LA // la city
|
|
|
|
// earth1 2 3 moon/sun
|
|
|
|
sky = tileSetupSky(LA__DYN);
|
|
|
|
sky->lognumtiles = 3;
|
|
|
|
sky->horizfrac = 16384 + 1024;
|
|
|
|
sky->tileofs[0] = 1;
|
|
|
|
sky->tileofs[1] = 2;
|
|
|
|
sky->tileofs[2] = 1;
|
|
|
|
sky->tileofs[3] = 3;
|
|
|
|
sky->tileofs[4] = 4;
|
|
|
|
sky->tileofs[5] = 0;
|
|
|
|
sky->tileofs[6] = 2;
|
|
|
|
sky->tileofs[7] = 3;
|
|
|
|
|
|
|
|
#if 0
|
|
|
|
// This assertion should hold. See note above.
|
|
|
|
for (bssize_t i=0; i<pskynummultis; ++i)
|
|
|
|
for (bssize_t j=0; j<(1<<multipsky[i].lognumtiles); ++j)
|
|
|
|
Bassert(multipsky[i].tileofs[j] <= PSKYOFF_MAX);
|
|
|
|
#endif
|
|
|
|
}
|
|
|
|
|
|
|
|
void G_SetupGlobalPsky(void)
|
|
|
|
{
|
|
|
|
int skyIdx = 0;
|
|
|
|
|
|
|
|
// NOTE: Loop must be running backwards for the same behavior as the game
|
|
|
|
// (greatest sector index with matching parallaxed sky takes precedence).
|
|
|
|
for (bssize_t i = numsectors - 1; i >= 0; i--)
|
|
|
|
{
|
|
|
|
if (sector[i].ceilingstat & 1)
|
|
|
|
{
|
|
|
|
skyIdx = getpskyidx(sector[i].ceilingpicnum);
|
|
|
|
if (skyIdx > 0)
|
|
|
|
break;
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
g_pskyidx = skyIdx;
|
|
|
|
}
|
|
|
|
|
|
|
|
//////////
|
|
|
|
|
|
|
|
void G_LoadLookups(void)
|
|
|
|
{
|
2019-10-20 20:26:53 +00:00
|
|
|
int32_t j;
|
2019-09-18 22:27:46 +00:00
|
|
|
|
2019-10-20 20:26:53 +00:00
|
|
|
auto fr = kopenFileReader("lookup.dat", 0);
|
|
|
|
if (!fr.isOpen())
|
|
|
|
return;
|
2019-09-18 22:27:46 +00:00
|
|
|
|
2019-10-20 20:26:53 +00:00
|
|
|
j = paletteLoadLookupTable(fr);
|
2019-09-18 22:27:46 +00:00
|
|
|
|
|
|
|
if (j < 0)
|
|
|
|
{
|
|
|
|
if (j == -1)
|
|
|
|
initprintf("ERROR loading \"lookup.dat\": failed reading enough data.\n");
|
|
|
|
|
2019-10-20 20:26:53 +00:00
|
|
|
return;
|
2019-09-18 22:27:46 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
uint8_t paldata[768];
|
|
|
|
|
|
|
|
for (j=1; j<=5; j++)
|
|
|
|
{
|
|
|
|
// Account for TITLE and REALMS swap between basepal number and on-disk order.
|
|
|
|
int32_t basepalnum = (j == 3 || j == 4) ? 4+3-j : j;
|
|
|
|
|
2019-10-20 20:26:53 +00:00
|
|
|
if (fr.Read(paldata, 768) != 768)
|
|
|
|
return;
|
2019-09-18 22:27:46 +00:00
|
|
|
|
|
|
|
for (bssize_t k = 0; k < 768; k++)
|
|
|
|
paldata[k] <<= 2;
|
|
|
|
|
|
|
|
paletteSetColorTable(basepalnum, paldata);
|
|
|
|
}
|
|
|
|
|
|
|
|
Bmemcpy(paldata, palette+1, 767);
|
|
|
|
paldata[767] = palette[767];
|
|
|
|
paletteSetColorTable(DRUGPAL, paldata);
|
|
|
|
|
|
|
|
if (RR)
|
|
|
|
{
|
|
|
|
char table[256];
|
|
|
|
for (bssize_t i = 0; i < 256; i++)
|
|
|
|
table[i] = i;
|
|
|
|
for (bssize_t i = 0; i < 32; i++)
|
|
|
|
table[i] = i+32;
|
|
|
|
|
|
|
|
paletteMakeLookupTable(7, table, 0, 0, 0, 0);
|
|
|
|
|
|
|
|
for (bssize_t i = 0; i < 256; i++)
|
|
|
|
table[i] = i;
|
|
|
|
paletteMakeLookupTable(30, table, 0, 0, 0, 0);
|
|
|
|
paletteMakeLookupTable(31, table, 0, 0, 0, 0);
|
|
|
|
paletteMakeLookupTable(32, table, 0, 0, 0, 0);
|
|
|
|
paletteMakeLookupTable(33, table, 0, 0, 0, 0);
|
|
|
|
if (RRRA)
|
|
|
|
paletteMakeLookupTable(105, table, 0, 0, 0, 0);
|
|
|
|
|
|
|
|
j = 63;
|
|
|
|
for (bssize_t i = 64; i < 80; i++)
|
|
|
|
{
|
|
|
|
j--;
|
|
|
|
table[i] = j;
|
|
|
|
table[i+16] = i-24;
|
|
|
|
}
|
|
|
|
table[80] = 80;
|
|
|
|
table[81] = 81;
|
|
|
|
for (bssize_t i = 0; i < 32; i++)
|
|
|
|
table[i] = i+32;
|
|
|
|
paletteMakeLookupTable(34, table, 0, 0, 0, 0);
|
|
|
|
for (bssize_t i = 0; i < 256; i++)
|
|
|
|
table[i] = i;
|
|
|
|
for (bssize_t i = 0; i < 16; i++)
|
|
|
|
table[i] = i+129;
|
|
|
|
for (bssize_t i = 16; i < 32; i++)
|
|
|
|
table[i] = i+192;
|
|
|
|
paletteMakeLookupTable(35, table, 0, 0, 0, 0);
|
|
|
|
if (RRRA)
|
|
|
|
paletteMakeLookupTable(54, palookup[8], 32*4, 32*4, 32*4, 0);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2019-09-21 22:10:48 +00:00
|
|
|
|
|
|
|
END_RR_NS
|