|
|
|
|
/**
|
|
|
|
|
* @file town.h
|
|
|
|
|
*
|
|
|
|
|
* Implementation of functionality for rendering the town, towners and calling other render routines.
|
|
|
|
|
*/
|
|
|
|
|
#include "all.h"
|
|
|
|
|
|
|
|
|
|
DEVILUTION_BEGIN_NAMESPACE
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Load level data into dPiece
|
|
|
|
|
* @param P3Tiles Tile set
|
|
|
|
|
* @param pSector Sector data
|
|
|
|
|
* @param xi upper left destination
|
|
|
|
|
* @param yi upper left destination
|
|
|
|
|
* @param w width of sector
|
|
|
|
|
* @param h height of sector
|
|
|
|
|
*/
|
|
|
|
|
void T_FillSector(BYTE *P3Tiles, BYTE *pSector, int xi, int yi, int w, int h)
|
|
|
|
|
{
|
|
|
|
|
int i, j, xx, yy, nMap;
|
|
|
|
|
long v1, v2, v3, v4, ii;
|
|
|
|
|
WORD *Sector;
|
|
|
|
|
|
|
|
|
|
ii = 4;
|
|
|
|
|
yy = yi;
|
|
|
|
|
for (j = 0; j < h; j++) {
|
|
|
|
|
xx = xi;
|
|
|
|
|
for (i = 0; i < w; i++) {
|
|
|
|
|
WORD *Map;
|
|
|
|
|
|
|
|
|
|
Map = (WORD *)&pSector[ii];
|
|
|
|
|
nMap = SDL_SwapLE16(*Map);
|
|
|
|
|
if (nMap) {
|
|
|
|
|
Sector = (((WORD *)&P3Tiles[(nMap - 1) * 8]));
|
|
|
|
|
v1 = SDL_SwapLE16(*(Sector + 0)) + 1;
|
|
|
|
|
v2 = SDL_SwapLE16(*(Sector + 1)) + 1;
|
|
|
|
|
v3 = SDL_SwapLE16(*(Sector + 2)) + 1;
|
|
|
|
|
v4 = SDL_SwapLE16(*(Sector + 3)) + 1;
|
|
|
|
|
|
|
|
|
|
} else {
|
|
|
|
|
v1 = 0;
|
|
|
|
|
v2 = 0;
|
|
|
|
|
v3 = 0;
|
|
|
|
|
v4 = 0;
|
|
|
|
|
}
|
|
|
|
|
dPiece[xx][yy] = v1;
|
|
|
|
|
dPiece[xx + 1][yy] = v2;
|
|
|
|
|
dPiece[xx][yy + 1] = v3;
|
|
|
|
|
dPiece[xx + 1][yy + 1] = v4;
|
|
|
|
|
xx += 2;
|
|
|
|
|
ii += 2;
|
|
|
|
|
}
|
|
|
|
|
yy += 2;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Load a tile in to dPiece
|
|
|
|
|
* @param P3Tiles Tile set
|
|
|
|
|
* @param xx upper left destination
|
|
|
|
|
* @param yy upper left destination
|
|
|
|
|
* @param t tile id
|
|
|
|
|
*/
|
|
|
|
|
void T_FillTile(BYTE *P3Tiles, int xx, int yy, int t)
|
|
|
|
|
{
|
|
|
|
|
long v1, v2, v3, v4;
|
|
|
|
|
WORD *Tiles;
|
|
|
|
|
|
|
|
|
|
Tiles = ((WORD *)&P3Tiles[(t - 1) * 8]);
|
|
|
|
|
v1 = SDL_SwapLE16(*(Tiles + 0)) + 1;
|
|
|
|
|
v2 = SDL_SwapLE16(*(Tiles + 1)) + 1;
|
|
|
|
|
v3 = SDL_SwapLE16(*(Tiles + 2)) + 1;
|
|
|
|
|
v4 = SDL_SwapLE16(*(Tiles + 3)) + 1;
|
|
|
|
|
|
|
|
|
|
dPiece[xx][yy] = v1;
|
|
|
|
|
dPiece[xx + 1][yy] = v2;
|
|
|
|
|
dPiece[xx][yy + 1] = v3;
|
|
|
|
|
dPiece[xx + 1][yy + 1] = v4;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void town_4751C6(){
|
|
|
|
|
dPiece[78][60] = 0x48a;
|
|
|
|
|
dPiece[79][60] = 0x48b;
|
|
|
|
|
dPiece[78][61] = 0x48c;
|
|
|
|
|
dPiece[79][61] = 0x50e;
|
|
|
|
|
dPiece[78][62] = 0x4ee;
|
|
|
|
|
dPiece[78][63] = 0x4f0;
|
|
|
|
|
dPiece[79][62] = 0x510;
|
|
|
|
|
dPiece[79][63] = 0x511;
|
|
|
|
|
dPiece[79][64] = 0x512;
|
|
|
|
|
dPiece[78][64] = 0x11a;
|
|
|
|
|
dPiece[78][65] = 0x11c;
|
|
|
|
|
dPiece[79][65] = 0x11d;
|
|
|
|
|
dPiece[80][60] = 0x513;
|
|
|
|
|
dPiece[80][61] = 0x515;
|
|
|
|
|
dPiece[81][61] = 0x516;
|
|
|
|
|
dPiece[82][60] = 0x517;
|
|
|
|
|
dPiece[83][60] = 0x518;
|
|
|
|
|
dPiece[82][61] = 0x519;
|
|
|
|
|
dPiece[83][61] = 0x51a;
|
|
|
|
|
dPiece[80][62] = 0x51b;
|
|
|
|
|
dPiece[81][62] = 0x51c;
|
|
|
|
|
dPiece[80][63] = 0x51d;
|
|
|
|
|
dPiece[81][63] = 0x51e;
|
|
|
|
|
dPiece[80][64] = 0x51f;
|
|
|
|
|
dPiece[81][64] = 0x520;
|
|
|
|
|
dPiece[80][65] = 0x521;
|
|
|
|
|
dPiece[81][65] = 0x522;
|
|
|
|
|
dPiece[82][64] = 0x527;
|
|
|
|
|
dPiece[83][64] = 0x528;
|
|
|
|
|
dPiece[82][65] = 0x529;
|
|
|
|
|
dPiece[83][65] = 0x52a;
|
|
|
|
|
dPiece[82][62] = 0x523;
|
|
|
|
|
dPiece[83][62] = 0x524;
|
|
|
|
|
dPiece[82][63] = 0x525;
|
|
|
|
|
dPiece[83][63] = 0x526;
|
|
|
|
|
dPiece[84][61] = 0x118;
|
|
|
|
|
dPiece[84][62] = 0x118;
|
|
|
|
|
dPiece[84][63] = 0x118;
|
|
|
|
|
dPiece[85][60] = 0x118;
|
|
|
|
|
dPiece[85][61] = 0x118;
|
|
|
|
|
dPiece[85][63] = 8;
|
|
|
|
|
dPiece[85][64] = 8;
|
|
|
|
|
dPiece[86][60] = 0xd9;
|
|
|
|
|
dPiece[86][61] = 0x18;
|
|
|
|
|
dPiece[85][62] = 0x13;
|
|
|
|
|
dPiece[84][64] = 0x118;
|
|
|
|
|
SetDungeonMicros();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void town_475379(){
|
|
|
|
|
dPiece[78][60] = 0x48a;
|
|
|
|
|
dPiece[79][60] = 0x4eb;
|
|
|
|
|
dPiece[78][61] = 0x4ec;
|
|
|
|
|
dPiece[79][61] = 0x4ed;
|
|
|
|
|
dPiece[78][62] = 0x4ee;
|
|
|
|
|
dPiece[79][62] = 0x4ef;
|
|
|
|
|
dPiece[78][63] = 0x4f0;
|
|
|
|
|
dPiece[79][63] = 0x4f1;
|
|
|
|
|
dPiece[78][64] = 0x4f2;
|
|
|
|
|
dPiece[79][64] = 0x4f3;
|
|
|
|
|
dPiece[78][65] = 0x4f4;
|
|
|
|
|
dPiece[80][60] = 0x4f5;
|
|
|
|
|
dPiece[81][60] = 0x4f6;
|
|
|
|
|
dPiece[80][61] = 0x4f7;
|
|
|
|
|
dPiece[81][61] = 0x4f8;
|
|
|
|
|
dPiece[82][60] = 0x4f9;
|
|
|
|
|
dPiece[83][60] = 0x4fa;
|
|
|
|
|
dPiece[82][61] = 0x4fb;
|
|
|
|
|
dPiece[83][61] = 0x4fc;
|
|
|
|
|
dPiece[80][62] = 0x4fd;
|
|
|
|
|
dPiece[81][62] = 0x4fe;
|
|
|
|
|
dPiece[80][63] = 0x4ff;
|
|
|
|
|
dPiece[81][63] = 0x500;
|
|
|
|
|
dPiece[80][64] = 0x501;
|
|
|
|
|
dPiece[81][64] = 0x502;
|
|
|
|
|
dPiece[80][65] = 0x503;
|
|
|
|
|
dPiece[81][65] = 0x504;
|
|
|
|
|
dPiece[82][64] = 0x509;
|
|
|
|
|
dPiece[83][64] = 0x50a;
|
|
|
|
|
dPiece[82][65] = 0x50b;
|
|
|
|
|
dPiece[83][65] = 0x50c;
|
|
|
|
|
dPiece[82][62] = 0x505;
|
|
|
|
|
dPiece[83][62] = 0x506;
|
|
|
|
|
dPiece[82][63] = 0x507;
|
|
|
|
|
dPiece[83][63] = 0x508;
|
|
|
|
|
dPiece[84][61] = 0x118;
|
|
|
|
|
dPiece[84][62] = 0x118;
|
|
|
|
|
dPiece[84][63] = 0x118;
|
|
|
|
|
dPiece[85][60] = 0x118;
|
|
|
|
|
dPiece[85][61] = 0x118;
|
|
|
|
|
dPiece[85][63] = 8;
|
|
|
|
|
dPiece[85][64] = 8;
|
|
|
|
|
dPiece[86][60] = 0xd9;
|
|
|
|
|
dPiece[86][61] = 0x18;
|
|
|
|
|
dPiece[85][62] = 0x13;
|
|
|
|
|
dPiece[84][64] = 0x118;
|
|
|
|
|
SetDungeonMicros();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void town_47552C(){
|
|
|
|
|
dPiece[36][21] = 0x52b;
|
|
|
|
|
dPiece[37][21] = 0x52c;
|
|
|
|
|
dPiece[36][22] = 0x52d;
|
|
|
|
|
dPiece[37][22] = 0x52e;
|
|
|
|
|
dPiece[36][23] = 0x52f;
|
|
|
|
|
dPiece[37][23] = 0x530;
|
|
|
|
|
dPiece[36][24] = 0x531;
|
|
|
|
|
dPiece[37][24] = 0x532;
|
|
|
|
|
dPiece[35][21] = 0x53b;
|
|
|
|
|
dPiece[34][21] = 0x53c;
|
|
|
|
|
SetDungeonMicros();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void town_475595(){
|
|
|
|
|
dPiece[36][21] = 0x533;
|
|
|
|
|
dPiece[37][21] = 0x534;
|
|
|
|
|
dPiece[36][22] = 0x535;
|
|
|
|
|
dPiece[37][22] = 0x536;
|
|
|
|
|
dPiece[36][23] = 0x537;
|
|
|
|
|
dPiece[37][23] = 0x538;
|
|
|
|
|
dPiece[36][24] = 0x539;
|
|
|
|
|
dPiece[37][24] = 0x53a;
|
|
|
|
|
dPiece[35][21] = 0x53b;
|
|
|
|
|
dPiece[34][21] = 0x53c;
|
|
|
|
|
SetDungeonMicros();
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Initialize all of the levels data
|
|
|
|
|
*/
|
|
|
|
|
void T_Pass3()
|
|
|
|
|
{
|
|
|
|
|
int xx, yy, x;
|
|
|
|
|
BYTE *P3Tiles, *pSector;
|
|
|
|
|
|
|
|
|
|
for (yy = 0; yy < MAXDUNY; yy += 2) {
|
|
|
|
|
for (xx = 0; xx < MAXDUNX; xx += 2) {
|
|
|
|
|
dPiece[xx][yy] = 0;
|
|
|
|
|
dPiece[xx + 1][yy] = 0;
|
|
|
|
|
dPiece[xx][yy + 1] = 0;
|
|
|
|
|
dPiece[xx + 1][yy + 1] = 0;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
P3Tiles = LoadFileInMem("Levels\\TownData\\Town.TIL", NULL);
|
|
|
|
|
pSector = LoadFileInMem("Levels\\TownData\\Sector1s.DUN", NULL);
|
|
|
|
|
T_FillSector(P3Tiles, pSector, 46, 46, 25, 25);
|
|
|
|
|
mem_free_dbg(pSector);
|
|
|
|
|
pSector = LoadFileInMem("Levels\\TownData\\Sector2s.DUN", NULL);
|
|
|
|
|
T_FillSector(P3Tiles, pSector, 46, 0, 25, 23);
|
|
|
|
|
mem_free_dbg(pSector);
|
|
|
|
|
pSector = LoadFileInMem("Levels\\TownData\\Sector3s.DUN", NULL);
|
|
|
|
|
T_FillSector(P3Tiles, pSector, 0, 46, 23, 25);
|
|
|
|
|
mem_free_dbg(pSector);
|
|
|
|
|
pSector = LoadFileInMem("Levels\\TownData\\Sector4s.DUN", NULL);
|
|
|
|
|
T_FillSector(P3Tiles, pSector, 0, 0, 23, 23);
|
|
|
|
|
mem_free_dbg(pSector);
|
|
|
|
|
|
|
|
|
|
if (gbIsSpawn || gbMaxPlayers == 1) {
|
|
|
|
|
#ifdef HELLFIRE
|
|
|
|
|
if(quests[Q_FARMER]._qactive == 3 || quests[Q_FARMER]._qactive == 10
|
|
|
|
|
|| quests[Q_JERSEY]._qactive == 3 || quests[Q_JERSEY]._qactive == 10)
|
|
|
|
|
{
|
|
|
|
|
town_4751C6();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
town_475379();
|
|
|
|
|
}
|
|
|
|
|
if ( quests[Q_GRAVE]._qactive == 3 || plr[myplr]._pLvlVisited[21] )
|
|
|
|
|
town_475595();
|
|
|
|
|
else
|
|
|
|
|
town_47552C();
|
|
|
|
|
#endif
|
|
|
|
|
#ifdef HELLFIRE
|
|
|
|
|
if (gbIsSpawn || !(plr[myplr].pTownWarps & 1) && plr[myplr]._pLevel < 10)
|
|
|
|
|
#else
|
|
|
|
|
if (gbIsSpawn || !(plr[myplr].pTownWarps & 1))
|
|
|
|
|
#endif
|
|
|
|
|
{
|
|
|
|
|
T_FillTile(P3Tiles, 48, 20, 320);
|
|
|
|
|
}
|
|
|
|
|
#ifdef HELLFIRE
|
|
|
|
|
if (gbIsSpawn || !(plr[myplr].pTownWarps & 2) && plr[myplr]._pLevel < 15)
|
|
|
|
|
#else
|
|
|
|
|
if (gbIsSpawn || !(plr[myplr].pTownWarps & 2))
|
|
|
|
|
#endif
|
|
|
|
|
{
|
|
|
|
|
T_FillTile(P3Tiles, 16, 68, 332);
|
|
|
|
|
T_FillTile(P3Tiles, 16, 70, 331);
|
|
|
|
|
}
|
|
|
|
|
#ifdef HELLFIRE
|
|
|
|
|
if (gbIsSpawn || !(plr[myplr].pTownWarps & 4) && plr[myplr]._pLevel < 20) {
|
|
|
|
|
#else
|
|
|
|
|
if (gbIsSpawn || !(plr[myplr].pTownWarps & 4)) {
|
|
|
|
|
#endif
|
|
|
|
|
for (x = 36; x < 46; x++) {
|
|
|
|
|
T_FillTile(P3Tiles, x, 78, random_(0, 4) + 1);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
#ifdef HELLFIRE
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
if(quests[Q_FARMER]._qactive == 3 || quests[Q_FARMER]._qactive == 10
|
|
|
|
|
|| quests[Q_JERSEY]._qactive == 3 || quests[Q_JERSEY]._qactive == 10)
|
|
|
|
|
{
|
|
|
|
|
town_4751C6();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
town_475379();
|
|
|
|
|
}
|
|
|
|
|
if ( quests[Q_GRAVE]._qactive == 3 || plr[myplr]._pLvlVisited[21] )
|
|
|
|
|
town_475595();
|
|
|
|
|
else
|
|
|
|
|
town_47552C();
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
|
if (quests[Q_PWATER]._qactive != QUEST_DONE && quests[Q_PWATER]._qactive) {
|
|
|
|
|
T_FillTile(P3Tiles, 60, 70, 342);
|
|
|
|
|
} else {
|
|
|
|
|
T_FillTile(P3Tiles, 60, 70, 71);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
mem_free_dbg(P3Tiles);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
/**
|
|
|
|
|
* @brief Initialize town level
|
|
|
|
|
* @param entry Methode of entry
|
|
|
|
|
*/
|
|
|
|
|
void CreateTown(int entry)
|
|
|
|
|
{
|
|
|
|
|
int x, y;
|
|
|
|
|
|
|
|
|
|
dminx = 10;
|
|
|
|
|
dminy = 10;
|
|
|
|
|
dmaxx = 84;
|
|
|
|
|
dmaxy = 84;
|
|
|
|
|
DRLG_InitTrans();
|
|
|
|
|
DRLG_Init_Globals();
|
|
|
|
|
|
|
|
|
|
if (entry == 0) {
|
|
|
|
|
ViewX = 75;
|
|
|
|
|
ViewY = 68;
|
|
|
|
|
} else if (entry == 1) {
|
|
|
|
|
ViewX = 25;
|
|
|
|
|
ViewY = 31;
|
|
|
|
|
} else if (entry == 7) {
|
|
|
|
|
if (TWarpFrom == 5) {
|
|
|
|
|
ViewX = 49;
|
|
|
|
|
ViewY = 22;
|
|
|
|
|
}
|
|
|
|
|
if (TWarpFrom == 9) {
|
|
|
|
|
ViewX = 18;
|
|
|
|
|
ViewY = 69;
|
|
|
|
|
}
|
|
|
|
|
if (TWarpFrom == 13) {
|
|
|
|
|
ViewX = 41;
|
|
|
|
|
ViewY = 81;
|
|
|
|
|
}
|
|
|
|
|
#ifdef HELLFIRE
|
|
|
|
|
if (TWarpFrom == 21) {
|
|
|
|
|
ViewX = 36;
|
|
|
|
|
ViewY = 25;
|
|
|
|
|
}
|
|
|
|
|
if (TWarpFrom == 17) {
|
|
|
|
|
ViewX = 79;
|
|
|
|
|
ViewY = 62;
|
|
|
|
|
}
|
|
|
|
|
#endif
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
T_Pass3();
|
|
|
|
|
memset(dLight, 0, sizeof(dLight));
|
|
|
|
|
memset(dFlags, 0, sizeof(dFlags));
|
|
|
|
|
memset(dPlayer, 0, sizeof(dPlayer));
|
|
|
|
|
memset(dMonster, 0, sizeof(dMonster));
|
|
|
|
|
memset(dObject, 0, sizeof(dObject));
|
|
|
|
|
memset(dItem, 0, sizeof(dItem));
|
|
|
|
|
memset(dSpecial, 0, sizeof(dSpecial));
|
|
|
|
|
|
|
|
|
|
for (y = 0; y < MAXDUNY; y++) {
|
|
|
|
|
for (x = 0; x < MAXDUNX; x++) {
|
|
|
|
|
if (dPiece[x][y] == 360) {
|
|
|
|
|
dSpecial[x][y] = 1;
|
|
|
|
|
} else if (dPiece[x][y] == 358) {
|
|
|
|
|
dSpecial[x][y] = 2;
|
|
|
|
|
} else if (dPiece[x][y] == 129) {
|
|
|
|
|
dSpecial[x][y] = 6;
|
|
|
|
|
} else if (dPiece[x][y] == 130) {
|
|
|
|
|
dSpecial[x][y] = 7;
|
|
|
|
|
} else if (dPiece[x][y] == 128) {
|
|
|
|
|
dSpecial[x][y] = 8;
|
|
|
|
|
} else if (dPiece[x][y] == 117) {
|
|
|
|
|
dSpecial[x][y] = 9;
|
|
|
|
|
} else if (dPiece[x][y] == 157) {
|
|
|
|
|
dSpecial[x][y] = 10;
|
|
|
|
|
} else if (dPiece[x][y] == 158) {
|
|
|
|
|
dSpecial[x][y] = 11;
|
|
|
|
|
} else if (dPiece[x][y] == 156) {
|
|
|
|
|
dSpecial[x][y] = 12;
|
|
|
|
|
} else if (dPiece[x][y] == 162) {
|
|
|
|
|
dSpecial[x][y] = 13;
|
|
|
|
|
} else if (dPiece[x][y] == 160) {
|
|
|
|
|
dSpecial[x][y] = 14;
|
|
|
|
|
} else if (dPiece[x][y] == 214) {
|
|
|
|
|
dSpecial[x][y] = 15;
|
|
|
|
|
} else if (dPiece[x][y] == 212) {
|
|
|
|
|
dSpecial[x][y] = 16;
|
|
|
|
|
} else if (dPiece[x][y] == 217) {
|
|
|
|
|
dSpecial[x][y] = 17;
|
|
|
|
|
} else if (dPiece[x][y] == 216) {
|
|
|
|
|
dSpecial[x][y] = 18;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
DEVILUTION_END_NAMESPACE
|