mirror of
https://github.com/jmarshall23/Hellfire.git
synced 2026-08-11 23:40:51 +02:00
3754 lines
94 KiB
C++
3754 lines
94 KiB
C++
/*-----------------------------------------------------------------------**
|
|
** Diablo
|
|
**
|
|
** Dungeon file
|
|
**
|
|
** (C)1995 Condor, Inc. All rights reserved.
|
|
**
|
|
**-----------------------------------------------------------------------**
|
|
** $Header: /Diablo/DRLG_L1.CPP 1 1/22/97 2:06p Dgartner $
|
|
**-----------------------------------------------------------------------**
|
|
**
|
|
** File Routines
|
|
** CreateL1Dungeon
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
#include "diablo.h"
|
|
#pragma hdrstop
|
|
#include "sound.h"
|
|
#include "drlg_l1.h"
|
|
#include "gendung.h"
|
|
#include "engine.h"
|
|
#include "trigs.h"
|
|
#include "lighting.h"
|
|
#include "monster.h"
|
|
#include "objects.h"
|
|
#include "quests.h"
|
|
#include "multi.h"
|
|
#include "Items.h"
|
|
|
|
// LEVEL 1
|
|
|
|
#define L1NGRATE 10 // cannot be higher than 100 or less than 0
|
|
|
|
#define L1BGRATE 5
|
|
#define L1RFLOOR 20
|
|
|
|
#define L1BWALL1 30
|
|
#define L1BWALL2 15
|
|
#define L1BWALL3 5
|
|
|
|
#define L1STATUE 10
|
|
|
|
|
|
// LEVEL 2
|
|
|
|
#define L2NGRATE 10 // cannot be higher than 100 or less than 0
|
|
|
|
#define L2BGRATE 10
|
|
#define L2RFLOOR 20
|
|
|
|
#define L2BWALL1 30
|
|
#define L2BWALL2 20
|
|
#define L2BWALL3 10
|
|
|
|
#define L2STATUE 10
|
|
|
|
|
|
// LEVEL 3
|
|
|
|
#define L3NGRATE 10 // cannot be higher than 100 or less than 0
|
|
|
|
#define L3BGRATE 15
|
|
#define L3RFLOOR 30
|
|
|
|
#define L3BWALL1 30
|
|
#define L3BWALL2 20
|
|
#define L3BWALL3 15
|
|
|
|
#define L3STATUE 10
|
|
|
|
|
|
// LEVEL 4
|
|
|
|
#define L4NGRATE 10 // cannot be higher than 100 or less than 0
|
|
|
|
#define L4BGRATE 20
|
|
#define L4RFLOOR 30
|
|
|
|
#define L4BWALL1 30
|
|
#define L4BWALL2 20
|
|
#define L4BWALL3 20
|
|
|
|
#define L4STATUE 10
|
|
|
|
|
|
Na_Krul_Struct Na_Krul; // Info for Na-Kruls room JKE
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
** Registration info
|
|
**-----------------------------------------------------------------------*/
|
|
#include "regconst.h"
|
|
char sgszRegSig2[REG_LEN] = "REGISTRATION_BLOCK";
|
|
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
** File Variables
|
|
**-----------------------------------------------------------------------*/
|
|
static byte dflags[MDMAXX][MDMAXY];
|
|
static byte* pSetPiece;
|
|
static BOOL setloadflag;
|
|
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
** Constant arrays
|
|
**-----------------------------------------------------------------------*/
|
|
/*
|
|
DPatsStruct DPAT[NUMDPATS] = { { 8, 4, 1, 4, 0 },
|
|
{ 8, 1, 1, 4, 0 },
|
|
{ 4, 5, 0, 4, 0 },
|
|
{ 4, 1, 1, 4, 0 },
|
|
{ 2, 5, 1, 0, 0 },
|
|
{ 2, 4, 1, 4, 0 },
|
|
{ 1, 5, 1, 0, 0 },
|
|
{ 1, 1, 1, 4, 0 },
|
|
{ 15, 5, 1, 4, 0 } };
|
|
*/
|
|
|
|
static const ShadowStruct SPATS[NUMSPATS] = {
|
|
{ 7, 13, 0, 13, _S6, 0, _S4 },
|
|
{ 16, 13, 0, 13, _S6, 0, _S4 },
|
|
{ 15, 13, 0, 13, _S7, 0, _S4 },
|
|
{ 5, 13, 13, 13, _S14, _S2, _S1 },
|
|
{ 5, 13, 1, 13, _S5, _S8, _S1 },
|
|
{ 5, 13, 13, 2, _S5, _S2, _S10 },
|
|
{ 5, 0, 1, 2, 0, _S8, _S10 },
|
|
{ 5, 13, 11, 13, _S5, _S9, _S1 },
|
|
{ 5, 13, 13, 12, _S5, _S2, _S11 },
|
|
{ 5, 13, 11, 12, _S12, _S9, _S11 },
|
|
{ 5, 13, 1, 12, _S5, _S8, _S11 },
|
|
{ 5, 13, 11, 2, _S5, _S9, _S10 },
|
|
{ 9, 13, 13, 13, _S6, _S2, _S4 },
|
|
{ 9, 13, 1, 13, _S6, _S8, _S4 },
|
|
{ 9, 13, 11, 13, _S13, _S9, _S4 },
|
|
{ 8, 13, 0, 13, _S6, 0, _S1 },
|
|
{ 8, 13, 0, 12, _S5, 0, _S11 },
|
|
{ 8, 0, 0, 2, 0, 0, _S10 },
|
|
{ 11, 0, 0, 13, 0, 0, _S1 },
|
|
{ 11, 13, 0, 13, _S1, 0, _S1 },
|
|
{ 11, 2, 0, 13, _S10, 0, _S1 },
|
|
{ 11, 12, 0, 13, _S11, 0, _S1 },
|
|
{ 11, 13, 11, 12, _S1, 0, _S11 },
|
|
{ 14, 0, 0, 13, 0, 0, _S1 },
|
|
{ 14, 13, 0, 13, _S1, 0, _S1 },
|
|
{ 14, 2, 0, 13, _S10, 0, _S1 },
|
|
{ 14, 12, 0, 13, _S11, 0, _S1 },
|
|
{ 14, 13, 11, 12, _S1, 0, _S11 },
|
|
{ 10, 0, 13, 0, 0, _S2, 0 },
|
|
{ 10, 13, 13, 0, _S2, _S2, 0 },
|
|
{ 10, 0, 1, 0, 0, _S8, 0 },
|
|
{ 10, 13, 11, 0, _S2, _S9, 0 },
|
|
{ 12, 0, 13, 0, 0, _S2, 0 },
|
|
{ 12, 13, 13, 0, _S2, _S2, 0 },
|
|
{ 12, 0, 1, 0, 0, _S8, 0 },
|
|
{ 12, 13, 11, 0, _S2, _S9, 0 },
|
|
{ 3, 13, 11, 12, _S12, 0, 0 } };
|
|
|
|
// Types for tile substitution
|
|
/*
|
|
static const byte BTYPES[NUMBLOCKS] = { 0,
|
|
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, // L1Base
|
|
0, 0, 0, 0, 0, 0, 0, // L1Dirt
|
|
25, 26, 4, 28, 4, 30, 31, 6, 7, 41, 1, 2, 4, 10, 43, 40, 41, 42, 43, 14, // L1Doors
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // L1Big
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
79, 80, 0, 82, 0, 0, 0, 0, 0, 0, 79, 0, 80, 0, 0, 79, 80, 0, // L1Plain
|
|
2, 2, 2, 1, 1, 11, 25, 13, 13, 13, // L1Blood
|
|
1, 2, 1, 2, 1, 2, 1, 2, 2, 2, 2, 12, 0, 0, 11, 1, 11, 1, // L1Misc
|
|
13, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // L1Shadow
|
|
0, 0, 0, 0, 0, 0, 0, 0, // L1New
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, // L1Massac
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // L1DrOpen
|
|
0, 0, 0, 0, 0, 0, 0, 0, // L1Secret
|
|
0, 0, 0, 0, 0, 0, 0 }; // L1Dirt
|
|
*/
|
|
|
|
// Types for shadow pass
|
|
static const byte BSTYPES[NUMBLOCKS] = { 0,
|
|
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, // L1Base
|
|
0, 0, 0, 0, 0, 0, 0, // L1Dirt
|
|
1, 2, 10, 4, 5, 6, 7, 8, 9, 10, 11, 12, 14, 5, 14, 10, 4, 14, 4, 5, // L1Doors
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // L1Big
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
1, 2, 3, 4, 1, 6, 7, 16, 17, 2, 1, 1, 2, 2, 1, 1, 2, 2, // L1Plain
|
|
2, 2, 2, 1, 1, 11, 1, 13, 13, 13, // L1Blood
|
|
1, 2, 1, 2, 1, 2, 1, 2, 2, 2, 2, 12, 0, 0, 11, 1, 11, 1, // L1Misc
|
|
13, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13,
|
|
13, 13, 13, 13, 13, 13, 13, 1, 11, 2, 12, 13, 13, 13, 12, 2, 1, 2, 2, // L1Shadow
|
|
4, 14, 4, 10, 13, 13, 4, 4, // L1New
|
|
1, 1, 4, 2, 2, 13, 13, 13, 13, // L1Massac
|
|
25, 26, 28, 30, 31, 41, 43, 40, 41, 42, 43, 25, 41, 43, 28, 28, // L1DrOpen
|
|
1, 2, 25, 26, 22, 22, 25, 26, // L1Secret
|
|
0, 0, 0, 0, 0, 0, 0 }; // L1Dirt
|
|
|
|
// Types for tile substitution
|
|
static const byte L5BTYPES[NUMBLOCKS] = { 0,
|
|
1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, // L1Base
|
|
0, 0, 0, 0, 0, 0, 0, // L1Dirt
|
|
25, 26, 0, 28, 0, 30, 31, 0, 0, 0, 0, 0, 0, 0, 0, 40, 41, 42, 43, 0, // L1Doors
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // L1Big
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
|
|
79, 80, 0, 82, 0, 0, 0, 0, 0, 0, 79, 0, 80, 0, 0, 79, 80, 0, // L1Plain
|
|
2, 2, 2, 1, 1, 11, 25, 13, 13, 13, // L1Blood
|
|
1, 2, 1, 2, 1, 2, 1, 2, 2, 2, 2, 12, 0, 0, 11, 1, 11, 1, // L1Misc
|
|
13, 0, 0, 0, 0, 0, 0, 0, 13, 13, 13, 13, 13, 13,
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // L1Shadow
|
|
0, 0, 0, 0, 0, 0, 0, 0, // L1New
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, // L1Massac
|
|
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, // L1DrOpen
|
|
0, 0, 0, 0, 0, 0, 0, 0, // L1Secret
|
|
0, 0, 0, 0, 0, 0, 0 }; // L1Dirt
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
** Manditory mini set pieces
|
|
**-----------------------------------------------------------------------*/
|
|
static const byte STAIRSUP[] = { 4, 4, // X size, Y size
|
|
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, // Pattern to look for
|
|
D_HWALL, D_HWALL, D_HWALL, D_HWALL,
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR,
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR,
|
|
|
|
0, 66, 6, 0, // Pattern to sub
|
|
63, 64, 65, 0,
|
|
0, 67, 68, 0,
|
|
0, 0, 0, 0 };
|
|
|
|
static const byte L5STAIRSUP[] = { 4, 5, // X size, Y size
|
|
|
|
D_DIRT, D_DIRT, D_DIRT, D_DIRT, // Pattern to look for
|
|
D_DIRT, D_DIRT, D_DIRT, D_DIRT,
|
|
D_HWALL, D_HWALL, D_HWALL, D_HWALL,
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR,
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR,
|
|
|
|
0, 54, 23, 0,
|
|
0, 53, 18, 0, // Pattern to sub
|
|
55, 56, 57, 0,
|
|
58, 59, 60, 0,
|
|
0, 0, 0, 0 };
|
|
|
|
static const byte STAIRSDOWN[] = { 4, 3, // X size, Y size
|
|
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, // Pattern to look for
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR,
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR,
|
|
|
|
62, 57, 58, 0, // Pattern to sub
|
|
61, 59, 60, 0,
|
|
0, 0, 0, 0 };
|
|
|
|
static const byte L5STAIRSDOWN[] = { 4, 5,
|
|
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, // Pattern to look for
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR,
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR,
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR,
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR,
|
|
|
|
0, 0, 52, 0, // Pattern to sub
|
|
0, 48, 51, 0,
|
|
0, 47, 50, 0,
|
|
45, 46, 49, 0,
|
|
0, 0, 0, 0 };
|
|
|
|
|
|
|
|
// Temp borrow to get this to work. JKE
|
|
static const byte WARPSTAIRS[] = { 4, 5, // X size, Y size
|
|
|
|
D_DIRT, D_DIRT, D_DIRT, D_DIRT, // Pattern to look for
|
|
D_DIRT, D_DIRT, D_DIRT, D_DIRT,
|
|
D_HWALL, D_HWALL, D_HWALL, D_HWALL,
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR,
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR,
|
|
|
|
0, 62, 23, 0,
|
|
0, 61, 18, 0, // Pattern to sub
|
|
63, 64, 65, 0,
|
|
66, 67, 68, 0,
|
|
0, 0, 0, 0 };
|
|
|
|
static const byte LAMPS[] = { 2, 2, // X size, Y size
|
|
|
|
D_FLOOR, 0, // Pattern to look for
|
|
D_FLOOR, D_FLOOR,
|
|
|
|
129, 0, // Pattern to sub
|
|
130, 128 };
|
|
|
|
|
|
static const byte PWATERIN[] = { 6, 6, // X size, Y size
|
|
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, // Pattern to look for
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, // Pattern to look for
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, // Pattern to look for
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, // Pattern to look for
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, // Pattern to look for
|
|
D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, D_FLOOR, // Pattern to look for
|
|
|
|
0, 0, 0, 0, 0, 0, // Pattern to sub
|
|
0, 202, 200, 200, 84, 0, // Pattern to sub
|
|
0, 199, 203, 203, 83, 0, // Pattern to sub
|
|
0, 85, 206, 80, 81, 0, // Pattern to sub
|
|
0, 0, 134, 135, 0, 0, // Pattern to sub
|
|
0, 0, 0, 0, 0, 0 }; // Pattern to sub
|
|
|
|
|
|
//JKE Enter new swap tiles here then call placerndset()
|
|
/*
|
|
static const byte TEMPLATE[] = { 3, 3, // X size, Y size
|
|
|
|
D_FLOOR, D_FLOOR, D_FLOOR, // Pattern to look for
|
|
D_FLOOR, D_FLOOR, D_FLOOR,
|
|
D_FLOOR, D_FLOOR, D_FLOOR,
|
|
|
|
0, 0, 0, // Pattern to sub
|
|
0, 0, 0,
|
|
0, 0, 0};
|
|
*/
|
|
|
|
// NORMAL GRATE SUBS
|
|
static const byte ARCHLEFT[] = { 1, 1, // X size, Y size
|
|
|
|
D_AVW, // Pattern to look for
|
|
|
|
95 }; // Pattern to sub
|
|
|
|
static const byte ARCHRIGHT[] = { 1, 1, // X size, Y size
|
|
|
|
D_AHW, // Pattern to look for
|
|
|
|
96 }; // Pattern to sub
|
|
|
|
static const byte GRATELEFT[] = { 1, 3, // X size, Y size
|
|
|
|
D_VWALL, // Pattern to look for
|
|
D_VWALL,
|
|
D_VWALL,
|
|
|
|
91, // Pattern to sub
|
|
90,
|
|
89 };
|
|
|
|
static const byte GRATERIGHT[] = { 3, 1, // X size, Y size
|
|
|
|
D_HWALL,D_HWALL,D_HWALL, // Pattern to look for
|
|
|
|
94,93,92 }; // Pattern to sub
|
|
|
|
static const byte FLOOR1[] = { 1, 1, // X size, Y size
|
|
|
|
D_FLOOR, // Pattern to look for
|
|
|
|
97 }; // Pattern to sub
|
|
|
|
static const byte FLOOR2[] = { 1, 1, // X size, Y size
|
|
|
|
D_FLOOR, // Pattern to look for
|
|
|
|
98 }; // Pattern to sub
|
|
|
|
static const byte FLOOR3[] = { 1, 1, // X size, Y size
|
|
|
|
D_FLOOR, // Pattern to look for
|
|
|
|
99 }; // Pattern to sub
|
|
|
|
static const byte FLOOR4[] = { 1, 1, // X size, Y size
|
|
|
|
D_FLOOR, // Pattern to look for
|
|
|
|
100 }; // Pattern to sub
|
|
|
|
static const byte BIGFLOOR[] = { 3, 3, // X size, Y size
|
|
|
|
D_FLOOR,D_FLOOR,D_FLOOR, // Pattern to look for
|
|
D_FLOOR,D_FLOOR,D_FLOOR,
|
|
D_FLOOR,D_FLOOR,D_FLOOR,
|
|
|
|
0, 0, 0, // Pattern to sub
|
|
0,101, 0,
|
|
0, 0, 0 };
|
|
|
|
|
|
// BROKEN GRATE SUBS
|
|
static const byte ARCHLEFT1A[] = { 1, 1, // X size, Y size
|
|
|
|
D_AVW, // Pattern to look for
|
|
|
|
185 }; // Pattern to sub
|
|
|
|
static const byte ARCHLEFT1B[] = { 1, 1, // X size, Y size
|
|
|
|
D_AVW, // Pattern to look for
|
|
|
|
186 }; // Pattern to sub
|
|
|
|
static const byte ARCHRIGHT1A[] = { 1, 1, // X size, Y size
|
|
|
|
D_AHW, // Pattern to look for
|
|
|
|
187 }; // Pattern to sub
|
|
|
|
static const byte ARCHRIGHT1B[] = { 1, 1, // X size, Y size
|
|
|
|
D_AHW, // Pattern to look for
|
|
|
|
188 }; // Pattern to sub
|
|
|
|
static const byte GRATELEFT1BA[] = { 1, 1, // X size, Y size
|
|
|
|
89, // Pattern to look for
|
|
|
|
173 }; // Pattern to sub
|
|
|
|
static const byte GRATELEFT1BB[] = { 1, 1, // X size, Y size
|
|
|
|
89, // Pattern to look for
|
|
|
|
174 }; // Pattern to sub
|
|
|
|
static const byte GRATELEFT1MA[] = { 1, 1, // X size, Y size
|
|
|
|
90, // Pattern to look for
|
|
|
|
175 }; // Pattern to sub
|
|
|
|
static const byte GRATELEFT1MB[] = { 1, 1, // X size, Y size
|
|
|
|
90, // Pattern to look for
|
|
|
|
176 }; // Pattern to sub
|
|
|
|
static const byte GRATELEFT1TA[] = { 1, 1, // X size, Y size
|
|
|
|
91, // Pattern to look for
|
|
|
|
177 }; // Pattern to sub
|
|
|
|
static const byte GRATELEFT1TB[] = { 1, 1, // X size, Y size
|
|
|
|
91, // Pattern to look for
|
|
|
|
178 }; // Pattern to sub
|
|
|
|
static const byte GRATERIGHT1RA[] = { 1, 1, // X size, Y size
|
|
|
|
92, // Pattern to look for
|
|
|
|
179 }; // Pattern to sub
|
|
|
|
static const byte GRATERIGHT1RB[] = { 1, 1, // X size, Y size
|
|
|
|
92, // Pattern to look for
|
|
|
|
180 }; // Pattern to sub
|
|
|
|
static const byte GRATERIGHT1MA[] = { 1, 1, // X size, Y size
|
|
|
|
92, // Pattern to look for
|
|
|
|
181 }; // Pattern to sub
|
|
|
|
static const byte GRATERIGHT1MB[] = { 1, 1, // X size, Y size
|
|
|
|
92, // Pattern to look for
|
|
|
|
182 }; // Pattern to sub
|
|
|
|
static const byte GRATERIGHT1LA[] = { 1, 1, // X size, Y size
|
|
|
|
92, // Pattern to look for
|
|
|
|
183 }; // Pattern to sub
|
|
|
|
static const byte GRATERIGHT1LB[] = { 1, 1, // X size, Y size
|
|
|
|
92, // Pattern to look for
|
|
|
|
184 }; // Pattern to sub
|
|
|
|
static const byte FLOOR1B1[] = { 1, 1, // X size, Y size
|
|
|
|
98, // Pattern to look for
|
|
|
|
189 }; // Pattern to sub
|
|
|
|
static const byte FLOOR2B1[] = { 1, 1, // X size, Y size
|
|
|
|
98, // Pattern to look for
|
|
|
|
190 }; // Pattern to sub
|
|
|
|
static const byte FLOOR3B1[] = { 1, 1, // X size, Y size
|
|
|
|
97, // Pattern to look for
|
|
|
|
191 }; // Pattern to sub
|
|
|
|
static const byte FLOOR4B1[] = { 1, 1, // X size, Y size
|
|
|
|
D_COL, // Pattern to look for
|
|
|
|
192 }; // Pattern to sub
|
|
|
|
static const byte FLOOR5B1[] = { 1, 1, // X size, Y size
|
|
|
|
99, // Pattern to look for
|
|
|
|
193 }; // Pattern to sub
|
|
|
|
static const byte FLOOR6B1[] = { 1, 1, // X size, Y size
|
|
|
|
99, // Pattern to look for
|
|
|
|
194 }; // Pattern to sub
|
|
|
|
static const byte FLOOR7B1[] = { 1, 1, // X size, Y size
|
|
|
|
100, // Pattern to look for
|
|
|
|
195 }; // Pattern to sub
|
|
|
|
static const byte BIGFLOORB1[] = { 1, 1, // X size, Y size
|
|
|
|
101, // Pattern to look for
|
|
|
|
196 };
|
|
|
|
static const byte BIGFLOORB2[] = { 1, 1, // X size, Y size
|
|
|
|
101,
|
|
|
|
197 };
|
|
|
|
static const byte BIGFLOORB3[] = { 1, 1, // X size, Y size
|
|
|
|
101, // Pattern to look for
|
|
|
|
198 };
|
|
|
|
|
|
|
|
// GENERAL FLOOR RUBBLE
|
|
|
|
static const byte BIGFLOORR1[] = { 3, 3, // X size, Y size
|
|
|
|
D_FLOOR,D_FLOOR,D_FLOOR, // Pattern to look for
|
|
D_FLOOR,D_FLOOR,D_FLOOR,
|
|
D_FLOOR,D_FLOOR,D_FLOOR,
|
|
|
|
0, 0, 0, // Pattern to sub
|
|
0,167, 0,
|
|
0, 0, 0 };
|
|
|
|
static const byte BIGFLOORR2[] = { 3, 3, // X size, Y size
|
|
|
|
D_FLOOR,D_FLOOR,D_FLOOR, // Pattern to look for
|
|
D_FLOOR,D_FLOOR,D_FLOOR,
|
|
D_FLOOR,D_FLOOR,D_FLOOR,
|
|
|
|
0, 0, 0, // Pattern to sub
|
|
0,168, 0,
|
|
0, 0, 0 };
|
|
|
|
static const byte BIGFLOORR3[] = { 3, 3, // X size, Y size
|
|
|
|
D_FLOOR,D_FLOOR,D_FLOOR, // Pattern to look for
|
|
D_FLOOR,D_FLOOR,D_FLOOR,
|
|
D_FLOOR,D_FLOOR,D_FLOOR,
|
|
|
|
0, 0, 0, // Pattern to sub
|
|
0,169, 0,
|
|
0, 0, 0 };
|
|
|
|
static const byte BIGFLOORR4[] = { 3, 3, // X size, Y size
|
|
|
|
D_FLOOR,D_FLOOR,D_FLOOR, // Pattern to look for
|
|
D_FLOOR,D_FLOOR,D_FLOOR,
|
|
D_FLOOR,D_FLOOR,D_FLOOR,
|
|
|
|
0, 0, 0, // Pattern to sub
|
|
0,170, 0,
|
|
0, 0, 0 };
|
|
|
|
static const byte BIGFLOORR5[] = { 3, 3, // X size, Y size
|
|
|
|
D_FLOOR,D_FLOOR,D_FLOOR, // Pattern to look for
|
|
D_FLOOR,D_FLOOR,D_FLOOR,
|
|
D_FLOOR,D_FLOOR,D_FLOOR,
|
|
|
|
0, 0, 0, // Pattern to sub
|
|
0,171, 0,
|
|
0, 0, 0 };
|
|
|
|
static const byte BIGFLOORR6[] = { 3, 3, // X size, Y size
|
|
|
|
D_FLOOR,D_FLOOR,D_FLOOR, // Pattern to look for
|
|
D_FLOOR,D_FLOOR,D_FLOOR,
|
|
D_FLOOR,D_FLOOR,D_FLOOR,
|
|
|
|
0, 0, 0, // Pattern to sub
|
|
0,172, 0,
|
|
0, 0, 0 };
|
|
|
|
static const byte FLOORR1[] = { 1, 1, // X size, Y size
|
|
|
|
D_FLOOR, // Pattern to look for
|
|
|
|
163 }; // Pattern to sub
|
|
|
|
static const byte FLOORR2[] = { 1, 1, // X size, Y size
|
|
|
|
D_FLOOR, // Pattern to look for
|
|
|
|
164 }; // Pattern to sub
|
|
|
|
static const byte FLOORR3[] = { 1, 1, // X size, Y size
|
|
|
|
D_FLOOR, // Pattern to look for
|
|
|
|
165 }; // Pattern to sub
|
|
|
|
static const byte FLOORR4[] = { 1, 1, // X size, Y size
|
|
|
|
D_FLOOR, // Pattern to look for
|
|
|
|
166 }; // Pattern to sub
|
|
|
|
|
|
// BROKEN WALL 1
|
|
static const byte BROKEN_VWALL1[] = { 1, 1,
|
|
|
|
D_VWALL,
|
|
|
|
112 };
|
|
|
|
static const byte BROKEN_HWALL1[] = { 1, 1,
|
|
|
|
D_HWALL,
|
|
|
|
113 };
|
|
|
|
static const byte BROKEN_LRC1[] = { 1, 1,
|
|
|
|
D_LRC,
|
|
|
|
114 };
|
|
|
|
static const byte BROKEN_ULC1[] = { 1, 1,
|
|
|
|
D_ULC,
|
|
|
|
115 };
|
|
|
|
static const byte BROKEN_AULC1[] = { 1, 1,
|
|
|
|
D_AULC,
|
|
|
|
116 };
|
|
|
|
static const byte BROKEN_URC1[] = { 1, 1,
|
|
|
|
D_URC,
|
|
|
|
117 };
|
|
|
|
static const byte BROKEN_LLC1[] = { 1, 1,
|
|
|
|
D_LLC,
|
|
|
|
118 };
|
|
|
|
static const byte BROKEN_AURC1[] = { 1, 1,
|
|
|
|
D_AURC,
|
|
|
|
119 };
|
|
|
|
static const byte BROKEN_ALLC1[] = { 1, 1,
|
|
|
|
D_ALLC,
|
|
|
|
120 };
|
|
|
|
static const byte BROKEN_TULC11[] = { 1, 1,
|
|
|
|
D_TULC1,
|
|
|
|
121 };
|
|
|
|
static const byte BROKEN_AVW1[] = { 1, 1,
|
|
|
|
D_AVW,
|
|
|
|
122 };
|
|
|
|
static const byte BROKEN_AHW1[] = { 1, 1,
|
|
|
|
D_AHW,
|
|
|
|
123 };
|
|
|
|
static const byte BROKEN_FLOOR1[] = { 1, 1,
|
|
|
|
D_FLOOR,
|
|
|
|
124 };
|
|
|
|
static const byte BROKEN_TULC21[] = { 1, 1,
|
|
|
|
D_TULC2,
|
|
|
|
125 };
|
|
|
|
static const byte BROKEN_COL1[] = { 1, 1,
|
|
|
|
D_COL,
|
|
|
|
126 };
|
|
|
|
static const byte BROKEN_BCAP1[] = { 1, 1,
|
|
|
|
D_BCAP,
|
|
|
|
127 };
|
|
|
|
static const byte BROKEN_RCAP1[] = { 1, 1,
|
|
|
|
D_RCAP,
|
|
|
|
128 };
|
|
|
|
// BROKEN WALL 2
|
|
static const byte BROKEN_VWALL2[] = { 1, 1,
|
|
|
|
D_VWALL,
|
|
|
|
129 };
|
|
|
|
static const byte BROKEN_HWALL2[] = { 1, 1,
|
|
|
|
D_HWALL,
|
|
|
|
130 };
|
|
|
|
static const byte BROKEN_LRC2[] = { 1, 1,
|
|
|
|
D_LRC,
|
|
|
|
131 };
|
|
|
|
static const byte BROKEN_ULC2[] = { 1, 1,
|
|
|
|
D_ULC,
|
|
|
|
132 };
|
|
|
|
static const byte BROKEN_AULC2[] = { 1, 1,
|
|
|
|
D_AULC,
|
|
|
|
133 };
|
|
|
|
static const byte BROKEN_URC2[] = { 1, 1,
|
|
|
|
D_URC,
|
|
|
|
134 };
|
|
|
|
static const byte BROKEN_LLC2[] = { 1, 1,
|
|
|
|
D_LLC,
|
|
|
|
135 };
|
|
|
|
static const byte BROKEN_AURC2[] = { 1, 1,
|
|
|
|
D_AURC,
|
|
|
|
136 };
|
|
|
|
static const byte BROKEN_ALLC2[] = { 1, 1,
|
|
|
|
D_ALLC,
|
|
|
|
137 };
|
|
|
|
static const byte BROKEN_TULC12[] = { 1, 1,
|
|
|
|
D_TULC1,
|
|
|
|
138 };
|
|
|
|
static const byte BROKEN_AVW2[] = { 1, 1,
|
|
|
|
D_AVW,
|
|
|
|
139 };
|
|
|
|
static const byte BROKEN_AHW2[] = { 1, 1,
|
|
|
|
D_AHW,
|
|
|
|
140 };
|
|
|
|
static const byte BROKEN_FLOOR2[] = { 1, 1,
|
|
|
|
D_FLOOR,
|
|
|
|
141 };
|
|
|
|
static const byte BROKEN_TULC22[] = { 1, 1,
|
|
|
|
D_TULC2,
|
|
|
|
142 };
|
|
|
|
static const byte BROKEN_COL2[] = { 1, 1,
|
|
|
|
D_COL,
|
|
|
|
143 };
|
|
|
|
static const byte BROKEN_BCAP2[] = { 1, 1,
|
|
|
|
D_BCAP,
|
|
|
|
144 };
|
|
|
|
static const byte BROKEN_RCAP2[] = { 1, 1,
|
|
|
|
D_RCAP,
|
|
|
|
145 };
|
|
|
|
// BROKEN WALL 3
|
|
static const byte BROKEN_VWALL3[] = { 1, 1,
|
|
|
|
D_VWALL,
|
|
|
|
146 };
|
|
|
|
static const byte BROKEN_HWALL3[] = { 1, 1,
|
|
|
|
D_HWALL,
|
|
|
|
147 };
|
|
|
|
static const byte BROKEN_LRC3[] = { 1, 1,
|
|
|
|
D_LRC,
|
|
|
|
148 };
|
|
|
|
static const byte BROKEN_ULC3[] = { 1, 1,
|
|
|
|
D_ULC,
|
|
|
|
149 };
|
|
|
|
static const byte BROKEN_AULC3[] = { 1, 1,
|
|
|
|
D_AULC,
|
|
|
|
150 };
|
|
|
|
static const byte BROKEN_URC3[] = { 1, 1,
|
|
|
|
D_URC,
|
|
|
|
151 };
|
|
|
|
static const byte BROKEN_LLC3[] = { 1, 1,
|
|
|
|
D_LLC,
|
|
|
|
152 };
|
|
|
|
static const byte BROKEN_AURC3[] = { 1, 1,
|
|
|
|
D_AURC,
|
|
|
|
153 };
|
|
|
|
static const byte BROKEN_ALLC3[] = { 1, 1,
|
|
|
|
D_ALLC,
|
|
|
|
154 };
|
|
|
|
static const byte BROKEN_TULC13[] = { 1, 1,
|
|
|
|
D_TULC1,
|
|
|
|
155 };
|
|
|
|
static const byte BROKEN_AVW3[] = { 1, 1,
|
|
|
|
D_AVW,
|
|
|
|
156 };
|
|
|
|
static const byte BROKEN_AHW3[] = { 1, 1,
|
|
|
|
D_AHW,
|
|
|
|
157 };
|
|
|
|
static const byte BROKEN_FLOOR3[] = { 1, 1,
|
|
|
|
D_FLOOR,
|
|
|
|
158 };
|
|
|
|
static const byte BROKEN_TULC23[] = { 1, 1,
|
|
|
|
D_TULC2,
|
|
|
|
159 };
|
|
|
|
static const byte BROKEN_COL3[] = { 1, 1,
|
|
|
|
D_COL,
|
|
|
|
160 };
|
|
|
|
static const byte BROKEN_BCAP3[] = { 1, 1,
|
|
|
|
D_BCAP,
|
|
|
|
161 };
|
|
|
|
static const byte BROKEN_RCAP3[] = { 1, 1,
|
|
|
|
D_RCAP,
|
|
|
|
162 };
|
|
|
|
// STATUES
|
|
|
|
static const byte STATUE_LEFTA[] = { 1, 1,
|
|
|
|
D_VWALL,
|
|
|
|
199 };
|
|
|
|
static const byte STATUE_LEFTB[] = { 1, 1,
|
|
|
|
D_VWALL,
|
|
|
|
201 };
|
|
|
|
static const byte STATUE_RIGHTA[] = { 1, 1,
|
|
|
|
D_HWALL,
|
|
|
|
200 };
|
|
|
|
static const byte STATUE_RIGHTB[] = { 1, 1,
|
|
|
|
D_HWALL,
|
|
|
|
202 };
|
|
|
|
|
|
// QUEST ROOMS
|
|
static byte NA_KRULS_ROOM[] = { 4, 6, // Dimensions of the room
|
|
|
|
115,130, 6,D_FLOOR, // Define the room
|
|
129,108, 1,D_FLOOR,
|
|
1,107,103,D_FLOOR,
|
|
146,106,102,D_FLOOR,
|
|
129,168, 1,D_FLOOR,
|
|
7, 2, 3,D_FLOOR };
|
|
|
|
static byte CORNERSTONE[] = { 5, 5,
|
|
|
|
4, 2, 2, 2, 6, // Define the room
|
|
1,111,172, 0, 1,
|
|
1,172, 0, 0,25,
|
|
1, 0, 0, 0, 1,
|
|
7, 2, 2, 2, 3 };
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
/*
|
|
static void DRLG_CheckDoor(int x, int y)
|
|
{
|
|
byte mf, c;
|
|
|
|
mf = 0;
|
|
if ((dflags[x][y] & HDOOR) == HDOOR) {
|
|
c = dungeon[x+1][y];
|
|
if (c == D_VWALL) mf = 1;
|
|
if (c == D_ULC) mf = 1;
|
|
if (c == D_URC) mf = 1;
|
|
if (c == D_TULC1) mf = 1;
|
|
if (c == D_DH) mf = 1;
|
|
if (c == D_DURC) mf = 1;
|
|
if (mf == 1) {
|
|
dflags[x][y] ^= HDOOR;
|
|
dflags[x-1][y] |= HDOOR;
|
|
}
|
|
}
|
|
if ((dflags[x][y] & VDOOR) == VDOOR) {
|
|
c = dungeon[x][y+1];
|
|
if (c == D_HWALL) mf = 1;
|
|
if (c == D_ULC) mf = 1;
|
|
if (c == D_LLC) mf = 1;
|
|
if (c == D_TULC2) mf = 1;
|
|
if (c == D_DV) mf = 1;
|
|
if (c == D_DLLC) mf = 1;
|
|
if (mf == 1) {
|
|
dflags[x][y] ^= VDOOR;
|
|
dflags[x][y-1] |= VDOOR;
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static void DRLG_PlaceDoor(int x, int y)
|
|
{
|
|
byte c, df;
|
|
|
|
if ((dflags[x][y] & SETP_BIT) == 0) {
|
|
//dungeon[x][y] = D_COL;
|
|
//dflags[x][y] = SETP_BIT;
|
|
//return;
|
|
df = dflags[x][y] & SETP_MASK;
|
|
c = dungeon[x][y];
|
|
if (df == HDOOR) {
|
|
if ((y != 1) && (c == D_HWALL)) dungeon[x][y] = D_DRH;
|
|
if ((y != 1) && (c == D_LLC)) dungeon[x][y] = D_DRLLC;
|
|
if ((y != 1) && (c == D_TULC2)) dungeon[x][y] = D_DRHT2;
|
|
if ((y != 1) && (c == D_ULC)) dungeon[x][y] = D_DRHULC;
|
|
if ((x != 1) && (c == D_VWALL)) dungeon[x][y] = D_DRV;
|
|
if ((x != 1) && (c == D_TULC1)) dungeon[x][y] = D_DRVT1;
|
|
if ((x != 1) && (c == D_URC)) dungeon[x][y] = D_DRURC;
|
|
}
|
|
if (df == VDOOR) {
|
|
if ((x != 1) && (c == D_VWALL)) dungeon[x][y] = D_DRV;
|
|
if ((x != 1) && (c == D_URC)) dungeon[x][y] = D_DRURC;
|
|
if ((x != 1) && (c == D_TULC1)) dungeon[x][y] = D_DRVT1;
|
|
if ((x != 1) && (c == D_ULC)) dungeon[x][y] = D_DRVULC;
|
|
if ((y != 1) && (c == D_HWALL)) dungeon[x][y] = D_DRH;
|
|
if ((y != 1) && (c == D_TULC2)) dungeon[x][y] = D_DRHT2;
|
|
if ((y != 1) && (c == D_LLC)) dungeon[x][y] = D_DRLLC;
|
|
}
|
|
if (df == DDOOR) {
|
|
if ((x != 1) && (y != 1) && (c == D_ULC)) dungeon[x][y] = D_DDULC;
|
|
if ((x != 1) && (c == D_TULC1)) dungeon[x][y] = D_DRVT1;
|
|
if ((y != 1) && (c == D_TULC2)) dungeon[x][y] = D_DRHT2;
|
|
if ((y != 1) && (c == D_HWALL)) dungeon[x][y] = D_DRH;
|
|
if ((x != 1) && (c == D_VWALL)) dungeon[x][y] = D_DRV;
|
|
if ((y != 1) && (c == D_LLC)) dungeon[x][y] = D_DRLLC;
|
|
if ((x != 1) && (c == D_URC)) dungeon[x][y] = D_DRURC;
|
|
}
|
|
}
|
|
dflags[x][y] = SETP_BIT;
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
/*
|
|
static int DRLG_SubInitDoor(int v1, int v2)
|
|
{
|
|
int rv;
|
|
|
|
rv = random(0, 3);
|
|
if (rv == 0) rv = v1;
|
|
else if (rv == 1) rv = v2;
|
|
else if (rv == 2) rv = v1 | v2;
|
|
return(rv);
|
|
}
|
|
*/
|
|
static void DRLG_L5Shadows()
|
|
{
|
|
int x, y;
|
|
|
|
for (y = 1; y < MDMAXY; y++)
|
|
{
|
|
for (x = 1; x < MDMAXX; x++)
|
|
{
|
|
switch (dungeon[x][y])
|
|
{
|
|
case 5:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 203;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 204;
|
|
if (dungeon[x][y - 1] == D_FLOOR)
|
|
dungeon[x][y - 1] = 205;
|
|
break;
|
|
|
|
case 7:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 206;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 207;
|
|
break;
|
|
|
|
case 8:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 203;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 204;
|
|
break;
|
|
|
|
case 9:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 206;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 207;
|
|
if (dungeon[x][y - 1] == D_FLOOR)
|
|
dungeon[x][y - 1] = 205;
|
|
break;
|
|
|
|
case 10:
|
|
if (dungeon[x][y - 1] == D_FLOOR)
|
|
dungeon[x][y - 1] = 205;
|
|
break;
|
|
|
|
case 11:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 203;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 204;
|
|
break;
|
|
|
|
case 12:
|
|
if (dungeon[x][y - 1] == D_FLOOR)
|
|
dungeon[x][y - 1] = 205;
|
|
break;
|
|
|
|
case 14:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 203;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 204;
|
|
break;
|
|
|
|
case 15:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 206;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 207;
|
|
break;
|
|
|
|
case 17:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 206;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 207;
|
|
break;
|
|
|
|
case 95:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 203;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 204;
|
|
break;
|
|
|
|
case 96:
|
|
if (dungeon[x][y - 1] == D_FLOOR)
|
|
dungeon[x][y - 1] = 208;
|
|
break;
|
|
|
|
case 116:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 203;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 204;
|
|
if (dungeon[x][y - 1] == D_FLOOR)
|
|
dungeon[x][y - 1] = 205;
|
|
break;
|
|
|
|
case 118:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 206;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 207;
|
|
break;
|
|
|
|
case 119:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 203;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 204;
|
|
break;
|
|
|
|
case 120:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 206;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 207;
|
|
if (dungeon[x][y - 1] == D_FLOOR)
|
|
dungeon[x][y - 1] = 205;
|
|
break;
|
|
|
|
case 121:
|
|
if (dungeon[x][y - 1] == D_FLOOR)
|
|
dungeon[x][y - 1] = 205;
|
|
break;
|
|
|
|
case 122:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 211;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 212;
|
|
break;
|
|
|
|
case 123:
|
|
if (dungeon[x][y - 1] == D_FLOOR)
|
|
dungeon[x][y - 1] = 205;
|
|
break;
|
|
|
|
case 125:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 203;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 204;
|
|
break;
|
|
|
|
case 126:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 206;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 207;
|
|
break;
|
|
|
|
case 128:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 206;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 207;
|
|
break;
|
|
|
|
case 133:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 203;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 204;
|
|
if (dungeon[x][y - 1] == D_FLOOR)
|
|
dungeon[x][y - 1] = 205;
|
|
break;
|
|
|
|
case 135:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 206;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 207;
|
|
break;
|
|
|
|
case 136:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 203;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 204;
|
|
break;
|
|
|
|
case 137:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 213;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 214;
|
|
if (dungeon[x][y - 1] == D_FLOOR)
|
|
dungeon[x][y - 1] = 205;
|
|
break;
|
|
|
|
case 138:
|
|
if (dungeon[x][y - 1] == D_FLOOR)
|
|
dungeon[x][y - 1] = 205;
|
|
break;
|
|
|
|
case 139:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 215;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 216;
|
|
break;
|
|
|
|
case 140:
|
|
if (dungeon[x][y - 1] == D_FLOOR)
|
|
dungeon[x][y - 1] = 217;
|
|
break;
|
|
|
|
case 142:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 203;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 204;
|
|
break;
|
|
|
|
case 143:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 213;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 214;
|
|
break;
|
|
|
|
case 145:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 213;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 214;
|
|
break;
|
|
|
|
case 150:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 203;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 204;
|
|
if (dungeon[x][y - 1] == D_FLOOR)
|
|
dungeon[x][y - 1] = 217;
|
|
break;
|
|
|
|
case 152:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 206;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 207;
|
|
break;
|
|
|
|
case 153:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 203;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 204;
|
|
break;
|
|
|
|
case 154:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 206;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 207;
|
|
if (dungeon[x][y - 1] == D_FLOOR)
|
|
dungeon[x][y - 1] = 205;
|
|
break;
|
|
|
|
case 155:
|
|
if (dungeon[x][y - 1] == D_FLOOR)
|
|
dungeon[x][y - 1] = 205;
|
|
break;
|
|
|
|
case 156:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 203;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 204;
|
|
break;
|
|
|
|
case 157:
|
|
if (dungeon[x][y - 1] == D_FLOOR)
|
|
dungeon[x][y - 1] = 217;
|
|
break;
|
|
|
|
case 159:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 203;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 204;
|
|
break;
|
|
|
|
case 160:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 206;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 207;
|
|
break;
|
|
|
|
case 162:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 209;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 210;
|
|
break;
|
|
|
|
case 167:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 209;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 210;
|
|
break;
|
|
|
|
case 187:
|
|
if (dungeon[x][y - 1] == D_FLOOR)
|
|
dungeon[x][y - 1] = 208;
|
|
break;
|
|
|
|
case 185:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 203;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 204;
|
|
break;
|
|
|
|
case 186:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 203;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 204;
|
|
break;
|
|
|
|
case 192:
|
|
if (dungeon[x - 1][y] == D_FLOOR)
|
|
dungeon[x - 1][y] = 209;
|
|
if (dungeon[x - 1][y - 1] == D_FLOOR)
|
|
dungeon[x - 1][y - 1] = 210;
|
|
break;
|
|
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static void DRLG_L1Shadows()
|
|
{
|
|
int x, y, i, patflag;
|
|
byte sd[2][2];
|
|
byte tnv3;
|
|
|
|
for (y = 1; y < MDMAXY; y++) {
|
|
for (x = 1; x < MDMAXX; x++) {
|
|
if ((x == 60) && (y == 21))
|
|
patflag = 1;
|
|
sd[0][0] = BSTYPES[dungeon[x][y]];
|
|
sd[1][0] = BSTYPES[dungeon[x - 1][y]];
|
|
sd[0][1] = BSTYPES[dungeon[x][y - 1]];
|
|
sd[1][1] = BSTYPES[dungeon[x - 1][y - 1]];
|
|
for (i = 0; i < NUMSPATS; i++) {
|
|
if (SPATS[i].strig == sd[0][0]) {
|
|
patflag = 1;
|
|
if ((SPATS[i].s1 != 0) && (SPATS[i].s1 != sd[1][1])) patflag = 0;
|
|
if ((SPATS[i].s2 != 0) && (SPATS[i].s2 != sd[0][1])) patflag = 0;
|
|
if ((SPATS[i].s3 != 0) && (SPATS[i].s3 != sd[1][0])) patflag = 0;
|
|
if (patflag == 1) {
|
|
if ((SPATS[i].nv1 != 0) && (dflags[x - 1][y - 1] == 0)) dungeon[x - 1][y - 1] = SPATS[i].nv1;
|
|
if ((SPATS[i].nv2 != 0) && (dflags[x][y - 1] == 0)) dungeon[x][y - 1] = SPATS[i].nv2;
|
|
if ((SPATS[i].nv3 != 0) && (dflags[x - 1][y] == 0)) dungeon[x - 1][y] = SPATS[i].nv3;
|
|
}
|
|
}
|
|
|
|
}
|
|
}
|
|
}
|
|
|
|
// Fix grates
|
|
for (y = 1; y < MDMAXY; y++) {
|
|
for (x = 1; x < MDMAXX; x++) {
|
|
if ((dungeon[x - 1][y] == _S1) && (dflags[x - 1][y] == 0)) {
|
|
tnv3 = _S1;
|
|
if (dungeon[x][y] == 29) tnv3 = _S3;
|
|
if (dungeon[x][y] == 32) tnv3 = _S3;
|
|
if (dungeon[x][y] == 35) tnv3 = _S3;
|
|
if (dungeon[x][y] == 37) tnv3 = _S3;
|
|
if (dungeon[x][y] == 38) tnv3 = _S3;
|
|
if (dungeon[x][y] == 39) tnv3 = _S3;
|
|
dungeon[x - 1][y] = tnv3;
|
|
}
|
|
if ((dungeon[x - 1][y] == _S11) && (dflags[x - 1][y] == 0)) {
|
|
tnv3 = _S11;
|
|
if (dungeon[x][y] == 29) tnv3 = _S15;
|
|
if (dungeon[x][y] == 32) tnv3 = _S15;
|
|
if (dungeon[x][y] == 35) tnv3 = _S15;
|
|
if (dungeon[x][y] == 37) tnv3 = _S15;
|
|
if (dungeon[x][y] == 38) tnv3 = _S15;
|
|
if (dungeon[x][y] == 39) tnv3 = _S15;
|
|
dungeon[x - 1][y] = tnv3;
|
|
}
|
|
if ((dungeon[x - 1][y] == _S10) && (dflags[x - 1][y] == 0)) {
|
|
tnv3 = _S10;
|
|
if (dungeon[x][y] == 29) tnv3 = _S16;
|
|
if (dungeon[x][y] == 32) tnv3 = _S16;
|
|
if (dungeon[x][y] == 35) tnv3 = _S16;
|
|
if (dungeon[x][y] == 37) tnv3 = _S16;
|
|
if (dungeon[x][y] == 38) tnv3 = _S16;
|
|
if (dungeon[x][y] == 39) tnv3 = _S16;
|
|
dungeon[x - 1][y] = tnv3;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static int DRLG_PlaceMiniSet(const byte miniset[], int tmin, int tmax, int cx, int cy, int setview, int noquad, int ldir)
|
|
{
|
|
int sx, sy;
|
|
int sw, sh;
|
|
int xx, yy;
|
|
int i, ii, numt;
|
|
int found;
|
|
int abort;
|
|
|
|
// Width and height of the mini set piece
|
|
sw = miniset[0];
|
|
sh = miniset[1];
|
|
|
|
// Number of pieces to place
|
|
if ((tmax - tmin) == 0) numt = 1;
|
|
else numt = random(0, tmax - tmin) + tmin;
|
|
|
|
for (i = 0; i < numt; i++) {
|
|
// Random starting pos
|
|
sx = random(0, MDMAXX - sw);
|
|
sy = random(0, MDMAXY - sh);
|
|
|
|
// Find a location for the mini set piece
|
|
found = 0;
|
|
abort = 0;
|
|
while (found == 0) {
|
|
found = 1;
|
|
if ((cx != -1) && (sx >= (cx - sw)) && (sx <= (cx + 12))) {
|
|
sx++;
|
|
//sx = random(0, MDMAXX-sw);
|
|
//sy = random(0, MDMAXY-sh);
|
|
found = 0;
|
|
}
|
|
if ((cy != -1) && (sy >= (cy - sh)) && (sy <= (cy + 12))) {
|
|
sy++;
|
|
//sx = random(0, MDMAXX-sw);
|
|
//sy = random(0, MDMAXY-sh);
|
|
found = 0;
|
|
}
|
|
switch (noquad) {
|
|
case 0:
|
|
if ((sx < cx) && (sy < cy)) found = 0;
|
|
break;
|
|
case 1:
|
|
if ((sx > cx) && (sy < cy)) found = 0;
|
|
break;
|
|
case 2:
|
|
if ((sx < cx) && (sy > cy)) found = 0;
|
|
break;
|
|
case 3:
|
|
if ((sx > cx) && (sy > cy)) found = 0;
|
|
break;
|
|
}
|
|
ii = 2;
|
|
for (yy = 0; ((yy < sh) && (found == 1)); yy++) {
|
|
for (xx = 0; ((xx < sw) && (found == 1)); xx++) {
|
|
if ((miniset[ii] != 0) && (dungeon[sx + xx][sy + yy] != miniset[ii])) found = 0;
|
|
if (dflags[sx + xx][sy + yy] != 0) found = 0;
|
|
ii++;
|
|
}
|
|
}
|
|
if (found == 0) {
|
|
sx++;
|
|
if (sx == (MDMAXX - sw)) {
|
|
sx = 0;
|
|
sy++;
|
|
if (sy == (MDMAXY - sh)) sy = 0;
|
|
}
|
|
abort++;
|
|
if (abort > 4000) return(-1);
|
|
}
|
|
}
|
|
|
|
// Place mini set piece
|
|
ii = (sh * sw) + 2;
|
|
for (yy = 0; yy < sh; yy++) {
|
|
for (xx = 0; xx < sw; xx++) {
|
|
if (miniset[ii] != 0) dungeon[sx + xx][sy + yy] = miniset[ii];
|
|
ii++;
|
|
}
|
|
}
|
|
}
|
|
|
|
if (miniset == PWATERIN) {
|
|
i = TransVal;
|
|
TransVal = 0;
|
|
DRLG_MRectTrans(sx + 0, sy + 2, sx + 5, sy + 4);
|
|
TransVal = i;
|
|
quests[Q_PWATER]._qtx = (sx << 1) + 5 + DIRTEDGED2;
|
|
quests[Q_PWATER]._qty = (sy << 1) + 6 + DIRTEDGED2;
|
|
}
|
|
|
|
if (setview == 1) {
|
|
ViewX = (sx << 1) + 3 + (DIRTEDGED2);
|
|
ViewY = (sy << 1) + 4 + (DIRTEDGED2);
|
|
}
|
|
|
|
if (ldir == LVL_DOWN) {
|
|
LvlViewX = (sx << 1) + 3 + (DIRTEDGED2);
|
|
LvlViewY = (sy << 1) + 4 + (DIRTEDGED2);
|
|
}
|
|
|
|
if ((sx < cx) && (sy < cy)) return(0);
|
|
if ((sx > cx) && (sy < cy)) return(1);
|
|
if ((sx < cx) && (sy > cy)) return(2);
|
|
return(3);
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static BOOL L5MiniSetFits(const byte miniset[], int sx, int sy)
|
|
{
|
|
int sw, sh;
|
|
int xx, yy;
|
|
int ii;
|
|
|
|
sw = miniset[0];
|
|
sh = miniset[1];
|
|
|
|
if (sx < 0 || sy < 0 || sx + sw >= MDMAXX || sy + sh >= MDMAXY)
|
|
return FALSE;
|
|
|
|
ii = 2;
|
|
for (yy = 0; yy < sh; yy++) {
|
|
for (xx = 0; xx < sw; xx++) {
|
|
if ((miniset[ii] != 0) && (dungeon[sx + xx][sy + yy] != miniset[ii]))
|
|
return FALSE;
|
|
if (dflags[sx + xx][sy + yy] != 0)
|
|
return FALSE;
|
|
ii++;
|
|
}
|
|
}
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static void L5PlaceMiniSetAt(const byte miniset[], int sx, int sy)
|
|
{
|
|
int sw, sh;
|
|
int xx, yy;
|
|
int ii;
|
|
|
|
sw = miniset[0];
|
|
sh = miniset[1];
|
|
ii = (sw * sh) + 2;
|
|
|
|
for (yy = 0; yy < sh; yy++) {
|
|
for (xx = 0; xx < sw; xx++) {
|
|
if (miniset[ii] != 0)
|
|
dungeon[sx + xx][sy + yy] = miniset[ii];
|
|
ii++;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static BOOL L5TryPlaceLamp(int sx, int sy)
|
|
{
|
|
if (!L5MiniSetFits(LAMPS, sx, sy))
|
|
return FALSE;
|
|
|
|
L5PlaceMiniSetAt(LAMPS, sx, sy);
|
|
return TRUE;
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static int L5PlaceLampNear(int cx, int cy, int max)
|
|
{
|
|
static const int offsets[][2] = {
|
|
{ -3, -2 }, { 2, -2 }, { -3, 2 }, { 2, 2 },
|
|
{ -4, 0 }, { 3, 0 }, { 0, -4 }, { 0, 3 },
|
|
{ -5, -1 }, { 4, -1 }, { -1, 4 }, { -1, -5 },
|
|
};
|
|
int i, n, start;
|
|
int placed;
|
|
|
|
placed = 0;
|
|
n = sizeof(offsets) / sizeof(offsets[0]);
|
|
start = random(0, n);
|
|
|
|
for (i = 0; i < n && placed < max; i++) {
|
|
if (L5TryPlaceLamp(cx + offsets[(start + i) % n][0], cy + offsets[(start + i) % n][1]))
|
|
placed++;
|
|
}
|
|
|
|
return placed;
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static void L5PlaceLevel1Lamps()
|
|
{
|
|
int i, j;
|
|
|
|
if (currlevel != 1)
|
|
return;
|
|
|
|
for (j = 1; j < MDMAXY - 1; j++) {
|
|
for (i = 1; i < MDMAXX - 1; i++) {
|
|
if (dungeon[i][j] == 64)
|
|
L5PlaceLampNear(i, j, 2);
|
|
if (dungeon[i][j] == 59)
|
|
L5PlaceLampNear(i, j, 1);
|
|
}
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
/*
|
|
static void DRLG_PlaceRndSet(byte miniset[], int rndper)
|
|
{
|
|
int sx, sy;
|
|
int sw, sh;
|
|
int xx, yy;
|
|
int ii;
|
|
int found;
|
|
|
|
// Width and height of the mini set piece
|
|
sw = miniset[0];
|
|
sh = miniset[1];
|
|
|
|
// Find a location for the mini set piece
|
|
for (sy = 0; sy < (MDMAXY - sh); sy++) {
|
|
for (sx = 0; sx < (MDMAXX - sw); sx++) {
|
|
found = 1;
|
|
ii = 2;
|
|
for (yy = 0; ((yy < sh) && (found == 1)); yy++) {
|
|
for (xx = 0; ((xx < sw) && (found == 1)); xx++) {
|
|
if ((miniset[ii] != 0) && (dungeon[sx+xx][sy+yy] != miniset[ii])) found = 0;
|
|
if (dflags[sx+xx][sy+yy] != 0) found = 0;
|
|
ii++;
|
|
}
|
|
}
|
|
if ((found == 1) && (random(0, 100) < rndper)) {
|
|
// Place mini set piece
|
|
ii = (sh * sw) + 2;
|
|
for (yy = 0; yy < sh; yy++) {
|
|
for (xx = 0; xx < sw; xx++) {
|
|
if (miniset[ii] != 0) dungeon[sx+xx][sy+yy] = miniset[ii];
|
|
ii++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
*/
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static void DRLG_L1Floor()
|
|
{
|
|
int i, j;
|
|
long rv;
|
|
|
|
for (j = 0; j < MDMAXY; j++) {
|
|
for (i = 0; i < MDMAXX; i++) {
|
|
if ((dflags[i][j] == 0) && (dungeon[i][j] == D_FLOOR)) {
|
|
rv = random(0, 3);
|
|
if (rv == 1) dungeon[i][j] = 162;
|
|
if (rv == 2) dungeon[i][j] = 163;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static void DRLG_L1Pass3()
|
|
{
|
|
int i, j, xx, yy;
|
|
long v1, v2, v3, v4, lv;
|
|
|
|
// Init dungeon to dirt
|
|
lv = D_DIRT - 1;
|
|
__asm {
|
|
mov esi, dword ptr[pMegaTiles]
|
|
mov eax, dword ptr[lv];
|
|
shl eax, 3
|
|
add esi, eax
|
|
xor eax, eax
|
|
lodsw
|
|
inc eax
|
|
mov dword ptr[v1], eax
|
|
lodsw
|
|
inc eax
|
|
mov dword ptr[v2], eax
|
|
lodsw
|
|
inc eax
|
|
mov dword ptr[v3], eax
|
|
lodsw
|
|
inc eax
|
|
mov dword ptr[v4], eax
|
|
}
|
|
for (yy = 0; yy < DMAXY; yy += 2) {
|
|
for (xx = 0; xx < DMAXX; xx += 2) {
|
|
dPiece[xx][yy] = (int)v1;
|
|
dPiece[xx + 1][yy] = (int)v2;
|
|
dPiece[xx][yy + 1] = (int)v3;
|
|
dPiece[xx + 1][yy + 1] = (int)v4;
|
|
}
|
|
}
|
|
|
|
// Convert dungeon mega tiles to mini tiles
|
|
yy = DIRTEDGED2;
|
|
for (j = 0; j < MDMAXY; j++) {
|
|
xx = DIRTEDGED2;
|
|
for (i = 0; i < MDMAXX; i++) {
|
|
lv = ((long)dungeon[i][j]) - 1;
|
|
app_assert(lv >= 0);
|
|
__asm {
|
|
mov esi, dword ptr[pMegaTiles]
|
|
mov eax, dword ptr[lv];
|
|
shl eax, 3
|
|
add esi, eax
|
|
xor eax, eax
|
|
lodsw
|
|
inc eax
|
|
mov dword ptr[v1], eax
|
|
lodsw
|
|
inc eax
|
|
mov dword ptr[v2], eax
|
|
lodsw
|
|
inc eax
|
|
mov dword ptr[v3], eax
|
|
lodsw
|
|
inc eax
|
|
mov dword ptr[v4], eax
|
|
}
|
|
dPiece[xx][yy] = (int)v1;
|
|
dPiece[xx + 1][yy] = (int)v2;
|
|
dPiece[xx][yy + 1] = (int)v3;
|
|
dPiece[xx + 1][yy + 1] = (int)v4;
|
|
xx += 2;
|
|
}
|
|
yy += 2;
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static void DRLG_LoadL1SP()
|
|
{
|
|
setloadflag = FALSE;
|
|
if (QuestStatus(Q_BUTCHER)) {
|
|
pSetPiece = LoadFileInMemSig("Levels\\L1Data\\rnd6.DUN", NULL, 'STPC');
|
|
setloadflag = TRUE;
|
|
}
|
|
if (QuestStatus(Q_SKELKING) && (gbMaxPlayers == 1)) {
|
|
pSetPiece = LoadFileInMemSig("Levels\\L1Data\\SKngDO.DUN", NULL, 'STPC');
|
|
setloadflag = TRUE;
|
|
}
|
|
if (QuestStatus(Q_LTBANNER)) {
|
|
pSetPiece = LoadFileInMemSig("Levels\\L1Data\\Banner2.DUN", NULL, 'STPC');
|
|
setloadflag = TRUE;
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static void DRLG_FreeL1SP() {
|
|
DiabloFreePtr(pSetPiece);
|
|
}
|
|
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
void DRLG_Init_Globals() {
|
|
ZeroMemory(dFlags, sizeof(dFlags));
|
|
ZeroMemory(dPlayer, sizeof(dPlayer));
|
|
ZeroMemory(dMonster, sizeof(dMonster));
|
|
ZeroMemory(dDead, sizeof(dDead));
|
|
ZeroMemory(dObject, sizeof(dObject));
|
|
ZeroMemory(dItem, sizeof(dItem));
|
|
ZeroMemory(dMissile, sizeof(dMissile));
|
|
ZeroMemory(dSpecial, sizeof(dSpecial));
|
|
|
|
// Init the light values for each piece
|
|
char cLight;
|
|
if (lightflag == 0) {
|
|
if (light4flag) cLight = 3;
|
|
else cLight = 15;
|
|
}
|
|
else {
|
|
cLight = 0;
|
|
}
|
|
FillMemory(dLight, sizeof(dLight), cLight);
|
|
}
|
|
|
|
|
|
static void DRLG_L5Doors() //JKE
|
|
{
|
|
|
|
for (int j = 0; j < DMAXY; j++) {
|
|
for (int i = 0; i < DMAXX; i++) {
|
|
// place tops of arches
|
|
int nPiece = dPiece[i][j];
|
|
if (nPiece == 77) nPiece = 1;
|
|
else if (nPiece == 80) nPiece = 2;
|
|
else continue;
|
|
|
|
dSpecial[i][j] = nPiece;
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static void DRLG_InitL1Vals() {
|
|
|
|
for (int j = 0; j < DMAXY; j++) {
|
|
for (int i = 0; i < DMAXX; i++) {
|
|
// place tops of arches
|
|
int nPiece = dPiece[i][j];
|
|
if (nPiece == 12) nPiece = 1;
|
|
else if (nPiece == 11) nPiece = 2;
|
|
else if (nPiece == 71) nPiece = 1;
|
|
else if (nPiece == 259) nPiece = 5;
|
|
else if (nPiece == 249) nPiece = 2;
|
|
else if (nPiece == 325) nPiece = 2;
|
|
else if (nPiece == 321) nPiece = 1;
|
|
else if (nPiece == 255) nPiece = 4;
|
|
else if (nPiece == 211) nPiece = 1;
|
|
else if (nPiece == 344) nPiece = 2;
|
|
else if (nPiece == 341) nPiece = 1;
|
|
else if (nPiece == 331) nPiece = 2;
|
|
else if (nPiece == 418) nPiece = 1;
|
|
else if (nPiece == 421) nPiece = 2;
|
|
else continue;
|
|
|
|
dSpecial[i][j] = nPiece;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
void LoadL1Dungeon(char sFileName[], int vx, int vy)
|
|
{
|
|
int i, j, rw, rh;
|
|
byte* pLevelMap, * lm;
|
|
|
|
dminx = DIRTEDGED2;
|
|
dminy = DIRTEDGED2;
|
|
dmaxx = DMAXX - (DIRTEDGED2);
|
|
dmaxy = DMAXY - (DIRTEDGED2);
|
|
|
|
DRLG_InitTrans();
|
|
|
|
// Load map
|
|
pLevelMap = LoadFileInMemSig(sFileName, NULL, 'LMPt');
|
|
lm = pLevelMap;
|
|
|
|
// Fill with dirt
|
|
for (j = 0; j < MDMAXY; j++) {
|
|
for (i = 0; i < MDMAXX; i++) {
|
|
dungeon[i][j] = D_DIRT;
|
|
dflags[i][j] = NODOOR;
|
|
}
|
|
}
|
|
|
|
// Put map in dungeon
|
|
rw = *lm;
|
|
|
|
lm += 2;
|
|
rh = *lm;
|
|
lm += 2;
|
|
for (j = 0; j < rh; j++) {
|
|
for (i = 0; i < rw; i++) {
|
|
if (*lm != 0) {
|
|
dungeon[i][j] = *lm;
|
|
dflags[i][j] |= SETP_BIT; // Don't go changin'
|
|
}
|
|
else dungeon[i][j] = D_FLOOR;
|
|
lm += 2;
|
|
}
|
|
}
|
|
|
|
// Floor subs
|
|
DRLG_L1Floor();
|
|
|
|
ViewX = vx;
|
|
ViewY = vy;
|
|
|
|
// Convert to minis
|
|
DRLG_L1Pass3();
|
|
|
|
DRLG_Init_Globals();
|
|
if (currlevel < HIVESTART) // JKE NO TOPS!!!
|
|
DRLG_InitL1Vals();
|
|
|
|
SetMapMonsters(pLevelMap, 0, 0);
|
|
SetMapObjects(pLevelMap, 0, 0);
|
|
//SetMapItems(pLevelMap);
|
|
|
|
// Free map
|
|
DiabloFreePtr(pLevelMap);
|
|
}
|
|
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
void LoadPreL1Dungeon(char sFileName[], int vx, int vy)
|
|
{
|
|
int i, j, rw, rh;
|
|
byte* pLevelMap, * lm;
|
|
|
|
dminx = DIRTEDGED2;
|
|
dminy = DIRTEDGED2;
|
|
dmaxx = DMAXX - (DIRTEDGED2);
|
|
dmaxy = DMAXY - (DIRTEDGED2);
|
|
|
|
// Load map
|
|
pLevelMap = LoadFileInMemSig(sFileName, NULL, 'LMPt');
|
|
lm = pLevelMap;
|
|
|
|
// Fill with dirt
|
|
for (j = 0; j < MDMAXY; j++) {
|
|
for (i = 0; i < MDMAXX; i++) {
|
|
dungeon[i][j] = D_DIRT;
|
|
dflags[i][j] = NODOOR;
|
|
}
|
|
}
|
|
|
|
// Put map in dungeon
|
|
rw = *lm;
|
|
lm += 2;
|
|
rh = *lm;
|
|
lm += 2;
|
|
for (j = 0; j < rh; j++) {
|
|
for (i = 0; i < rw; i++) {
|
|
if (*lm != 0) {
|
|
dungeon[i][j] = *lm;
|
|
dflags[i][j] |= SETP_BIT; // Don't go changin'
|
|
}
|
|
else dungeon[i][j] = D_FLOOR;
|
|
lm += 2;
|
|
}
|
|
}
|
|
|
|
// Floor subs
|
|
DRLG_L1Floor();
|
|
|
|
for (j = 0; j < MDMAXY; j++) {
|
|
for (i = 0; i < MDMAXX; i++) pdungeon[i][j] = dungeon[i][j];
|
|
}
|
|
|
|
// Free map
|
|
DiabloFreePtr(pLevelMap);
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*
|
|
**
|
|
** DRLG (5)
|
|
** drlg1 - test
|
|
**
|
|
*-------------------------------------------------------------------------*/
|
|
/*------------------------------------------------------------------------*
|
|
** Defines
|
|
**------------------------------------------------------------------------*/
|
|
|
|
#define L5DIR_HORIZ 0
|
|
#define L5DIR_VERT 1
|
|
|
|
#define L5ROOM_MIN 2
|
|
#define L5ROOM_MAX 6
|
|
|
|
#define L5DUNX 40
|
|
#define L5DUNY 40
|
|
|
|
#define L5MIN_AREA ((L5DUNX*L5DUNY)/3) + ((L5DUNX*L5DUNY)/7)
|
|
|
|
#define L5DX 80
|
|
#define L5DY 80
|
|
|
|
byte L5dungeon[L5DX][L5DY];
|
|
byte L5ConvTbl[16] = { 22, 13, 1, 13, 2, 13, 13, 13, 4, 13, 1, 13, 2, 13, 16, 13 };
|
|
|
|
typedef struct {
|
|
int minArea;
|
|
int roomMin;
|
|
int roomMax;
|
|
int wallChance;
|
|
int archWallChance;
|
|
int grateWallChance;
|
|
int archDoorChance;
|
|
int loopChance;
|
|
int lampMin;
|
|
int lampMax;
|
|
} L5CathedralProfile;
|
|
|
|
static L5CathedralProfile L5Profile;
|
|
|
|
/*------------------------------------------------------------------------*
|
|
** Global variables
|
|
**------------------------------------------------------------------------*/
|
|
static BOOL HR1, HR2, HR3;
|
|
static BOOL VR1, VR2, VR3;
|
|
|
|
/*------------------------------------------------------------------------*
|
|
**------------------------------------------------------------------------*/
|
|
static const L5CathedralProfile *GetL5CathedralProfile()
|
|
{
|
|
static const L5CathedralProfile profiles[4] = {
|
|
{ 533, 2, 6, 92, 20, 10, 14, 0, 4, 7 },
|
|
{ 693, 2, 7, 96, 23, 13, 16, 3, 6, 10 },
|
|
{ 761, 4, 7, 100, 25, 16, 18, 5, 4, 8 },
|
|
{ 805, 4, 8, 100, 28, 20, 20, 7, 3, 6 },
|
|
};
|
|
static const L5CathedralProfile oldProfile = {
|
|
761, L5ROOM_MIN, L5ROOM_MAX, 100, 25, 25, 16, 0, 5, 10
|
|
};
|
|
|
|
if (currlevel >= 1 && currlevel <= 4)
|
|
return &profiles[currlevel - 1];
|
|
|
|
return &oldProfile;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*
|
|
**------------------------------------------------------------------------*/
|
|
static void InitL5CathedralProfile()
|
|
{
|
|
L5Profile = *GetL5CathedralProfile();
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*
|
|
**------------------------------------------------------------------------*/
|
|
static void InitL5Dungeon()
|
|
{
|
|
int i, j;
|
|
|
|
for (j = 0; j < L5DUNY; j++) {
|
|
for (i = 0; i < L5DUNX; i++) {
|
|
dungeon[i][j] = 0;
|
|
dflags[i][j] = NODOOR;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*
|
|
**------------------------------------------------------------------------*/
|
|
static void L5ClearFlags()
|
|
{
|
|
int i, j;
|
|
|
|
for (j = 0; j < L5DUNY; j++) {
|
|
for (i = 0; i < L5DUNX; i++) dflags[i][j] &= SETP_TMASK;
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------*
|
|
**-----------------------------------------------------------------------*/
|
|
static void L5drawRoom(int x, int y, int w, int h)
|
|
{
|
|
int i, j;
|
|
|
|
|
|
for (j = 0; j < h; j++) {
|
|
for (i = 0; i < w; i++) {
|
|
dungeon[i + x][j + y] = 1;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*---------------------------------------------------------------------*
|
|
** Check limits of 40 X 40
|
|
**---------------------------------------------------------------------*/
|
|
static BOOL L5checkRoom(int x, int y, int width, int height)
|
|
{
|
|
int i, j;
|
|
|
|
for (j = 0; j < height; j++) {
|
|
for (i = 0; i < width; i++) {
|
|
if ((x + i < 0) || (x + i >= L5DUNX) || (y + j < 0) || (y + j >= L5DUNY)) return(FALSE);
|
|
if (dungeon[x + i][y + j] != 0) return(FALSE);
|
|
}
|
|
}
|
|
return(TRUE);
|
|
}
|
|
|
|
/*---------------------------------------------------------------------**
|
|
** Generate left and right, up and down rooms
|
|
**---------------------------------------------------------------------*/
|
|
static void L5roomGen(int x, int y, int w, int h, int dir)
|
|
{
|
|
int rx, ry, rx2, ry2;
|
|
int height, width;
|
|
int cx1, cy1, cw, ch;
|
|
int num;
|
|
int dirProb;
|
|
int ran;
|
|
BOOL c, d;
|
|
|
|
ran = random(0, 4);
|
|
if (dir == L5DIR_VERT) {
|
|
if (ran == 0) dirProb = L5DIR_HORIZ;
|
|
else dirProb = L5DIR_VERT;
|
|
}
|
|
else {
|
|
if (ran == 0) dirProb = L5DIR_VERT;
|
|
else dirProb = L5DIR_HORIZ;
|
|
}
|
|
switch (dirProb) {
|
|
case L5DIR_HORIZ: // left/right
|
|
// left room
|
|
num = 0;
|
|
do {
|
|
width = ((random(0, L5Profile.roomMax - L5Profile.roomMin + 1) + L5Profile.roomMin) >> 1) << 1;
|
|
height = ((random(0, L5Profile.roomMax - L5Profile.roomMin + 1) + L5Profile.roomMin) >> 1) << 1;
|
|
ry = y + (h / 2) - (height / 2);
|
|
rx = x - width;
|
|
cx1 = rx - 1;
|
|
cy1 = ry - 1;
|
|
cw = height + 2;
|
|
ch = width + 1;
|
|
c = L5checkRoom(cx1, cy1, cw, ch);
|
|
num++;
|
|
} while ((c == FALSE) && (num < 20));
|
|
if (c == TRUE) L5drawRoom(rx, ry, width, height);
|
|
|
|
// right room
|
|
rx2 = x + w;
|
|
cx1 = rx2;
|
|
cy1 = ry - 1;
|
|
ch = height + 2;
|
|
cw = width + 1;
|
|
d = L5checkRoom(cx1, cy1, cw, ch);
|
|
if (d == TRUE) L5drawRoom(rx2, ry, width, height);
|
|
if (c == TRUE) L5roomGen(rx, ry, width, height, L5DIR_VERT);
|
|
if (d == TRUE) L5roomGen(rx2, ry, width, height, L5DIR_VERT);
|
|
break;
|
|
|
|
case L5DIR_VERT: // top/bottom
|
|
// top room
|
|
num = 0;
|
|
do {
|
|
width = ((random(0, L5Profile.roomMax - L5Profile.roomMin + 1) + L5Profile.roomMin) >> 1) << 1;
|
|
height = ((random(0, L5Profile.roomMax - L5Profile.roomMin + 1) + L5Profile.roomMin) >> 1) << 1;
|
|
rx = x + (w / 2) - (width / 2);
|
|
ry = y - height;
|
|
cx1 = rx - 1;
|
|
cy1 = ry - 1;
|
|
ch = height + 1;
|
|
cw = width + 2;
|
|
c = L5checkRoom(cx1, cy1, cw, ch);
|
|
num++;
|
|
|
|
} while ((c == FALSE) && (num < 20));
|
|
if (c == TRUE) L5drawRoom(rx, ry, width, height);
|
|
|
|
// bottom room
|
|
ry2 = y + h;
|
|
cx1 = rx - 1;
|
|
cy1 = ry2;
|
|
ch = height + 1;
|
|
cw = width + 2;
|
|
d = L5checkRoom(cx1, cy1, cw, ch);
|
|
if (d == TRUE) L5drawRoom(rx, ry2, width, height);
|
|
if (c == TRUE) L5roomGen(rx, ry, width, height, L5DIR_HORIZ);
|
|
if (d == TRUE) L5roomGen(rx, ry2, width, height, L5DIR_HORIZ);
|
|
break;
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------*
|
|
** DRLG_GChamber(int sx, int sy, int topflag, int bottomflag, int leftflag, int rightflag)
|
|
**-----------------------------------------------------------------------*/
|
|
static void L5firstRoom()
|
|
{
|
|
int x, y;
|
|
int xs, xe, ys, ye;
|
|
|
|
if (random(0, 2) == 0) { // vertical
|
|
ys = 1;
|
|
ye = L5DUNY - 1;
|
|
VR1 = random(0, 2);
|
|
VR2 = random(0, 2);
|
|
VR3 = random(0, 2);
|
|
if ((VR1 + VR3) <= 1) VR2 = 1;
|
|
if (VR1) L5drawRoom(15, 1, 10, 10);
|
|
else ys += 17;
|
|
if (VR2) L5drawRoom(15, 15, 10, 10);
|
|
if (VR3) L5drawRoom(15, 29, 10, 10);
|
|
else ye -= 17;
|
|
for (y = ys; y < ye; y++) {
|
|
dungeon[17][y] = 1;
|
|
dungeon[18][y] = 1;
|
|
dungeon[19][y] = 1;
|
|
dungeon[20][y] = 1;
|
|
dungeon[21][y] = 1;
|
|
dungeon[22][y] = 1;
|
|
}
|
|
if (VR1) L5roomGen(15, 1, 10, 10, L5DIR_HORIZ);
|
|
if (VR2) L5roomGen(15, 15, 10, 10, L5DIR_HORIZ);
|
|
if (VR3) L5roomGen(15, 29, 10, 10, L5DIR_HORIZ);
|
|
HR1 = HR2 = HR3 = FALSE;
|
|
}
|
|
else { // horizontal
|
|
xs = 1;
|
|
xe = L5DUNX - 1;
|
|
HR1 = random(0, 2);
|
|
HR2 = random(0, 2);
|
|
HR3 = random(0, 2);
|
|
if ((HR1 + HR3) <= 1) HR2 = 1;
|
|
if (HR1) L5drawRoom(1, 15, 10, 10);
|
|
else xs += 17;
|
|
if (HR2) L5drawRoom(15, 15, 10, 10);
|
|
if (HR3) L5drawRoom(29, 15, 10, 10);
|
|
else xe -= 17;
|
|
for (x = xs; x < xe; x++) {
|
|
dungeon[x][17] = 1;
|
|
dungeon[x][18] = 1;
|
|
dungeon[x][19] = 1;
|
|
dungeon[x][20] = 1;
|
|
dungeon[x][21] = 1;
|
|
dungeon[x][22] = 1;
|
|
}
|
|
if (HR1) L5roomGen(1, 15, 10, 10, L5DIR_VERT);
|
|
if (HR2) L5roomGen(15, 15, 10, 10, L5DIR_VERT);
|
|
if (HR3) L5roomGen(29, 15, 10, 10, L5DIR_VERT);
|
|
VR1 = VR2 = VR3 = FALSE;
|
|
}
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*
|
|
**------------------------------------------------------------------------*/
|
|
static long L5GetArea()
|
|
{
|
|
int i, j;
|
|
long rv;
|
|
|
|
rv = 0;
|
|
for (j = 0; j < L5DUNY; j++) {
|
|
for (i = 0; i < L5DUNX; i++) {
|
|
if (dungeon[i][j] == 1) rv++;
|
|
}
|
|
}
|
|
return(rv);
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*
|
|
**------------------------------------------------------------------------*/
|
|
static void L5makeDungeon()
|
|
{
|
|
int i, j;
|
|
int k, l;
|
|
|
|
for (j = 0; j < L5DUNY; j++) {
|
|
for (i = 0; i < L5DUNX; i++) {
|
|
k = i << 1;
|
|
l = j << 1;
|
|
L5dungeon[k][l] = dungeon[i][j];
|
|
L5dungeon[k][l + 1] = dungeon[i][j];
|
|
L5dungeon[k + 1][l] = dungeon[i][j];
|
|
L5dungeon[k + 1][l + 1] = dungeon[i][j];
|
|
}
|
|
}
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*
|
|
**------------------------------------------------------------------------*/
|
|
static void L5makeDmt()
|
|
{
|
|
int i, j;
|
|
int idx;
|
|
int val;
|
|
int dmtx, dmty;
|
|
|
|
for (j = 0; j < L5DUNY; j++)
|
|
for (i = 0; i < L5DUNX; i++) dungeon[i][j] = D_DIRT;
|
|
|
|
dmty = 0;
|
|
for (j = 1; j <= 77; j += 2) {
|
|
dmtx = 0;
|
|
for (i = 1; i <= 77; i += 2) {
|
|
idx = L5dungeon[i][j] + (L5dungeon[i + 1][j] << 1) +
|
|
(L5dungeon[i][j + 1] << 2) + (L5dungeon[i + 1][j + 1] << 3);
|
|
|
|
val = L5ConvTbl[idx];
|
|
dungeon[dmtx][dmty] = val;
|
|
dmtx++;
|
|
}
|
|
dmty++;
|
|
}
|
|
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static int L5HWallOk(int i, int j)
|
|
{
|
|
int x;
|
|
BOOL wallok;
|
|
|
|
x = 1;
|
|
while ((dungeon[i + x][j] == 13) &&
|
|
(dungeon[i + x][j - 1] == 13) &&
|
|
(dungeon[i + x][j + 1] == 13) &&
|
|
(dflags[i + x][j] == NODOOR)) x++;
|
|
wallok = FALSE;
|
|
if ((dungeon[i + x][j] >= 3) && (dungeon[i + x][j] <= 7)) wallok = TRUE;
|
|
if ((dungeon[i + x][j] >= 16) && (dungeon[i + x][j] <= 24)) wallok = TRUE;
|
|
if (dungeon[i + x][j] == 22) wallok = FALSE;
|
|
if (x == 1) wallok = FALSE;
|
|
if (wallok) return(x);
|
|
else return(-1);
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static int L5VWallOk(int i, int j)
|
|
{
|
|
int y;
|
|
BOOL wallok;
|
|
|
|
y = 1;
|
|
while ((dungeon[i][j + y] == 13) &&
|
|
(dungeon[i - 1][j + y] == 13) &&
|
|
(dungeon[i + 1][j + y] == 13) &&
|
|
(dflags[i][j + y] == NODOOR)) y++;
|
|
wallok = FALSE;
|
|
if ((dungeon[i][j + y] >= 3) && (dungeon[i][j + y] <= 7)) wallok = TRUE;
|
|
if ((dungeon[i][j + y] >= 16) && (dungeon[i][j + y] <= 24)) wallok = TRUE;
|
|
if (dungeon[i][j + y] == 22) wallok = FALSE;
|
|
if (y == 1) wallok = FALSE;
|
|
if (wallok) return(y);
|
|
else return(-1);
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static void L5HorizWall(int i, int j, char p, int dx)
|
|
{
|
|
int xx;
|
|
int rv;
|
|
char wt, dt;
|
|
|
|
rv = random(0, 100);
|
|
if (rv < L5Profile.archWallChance) {
|
|
wt = 12; // Arch wall
|
|
if (p == 2) p = 12;
|
|
if (p == 4) p = 10;
|
|
} else if (rv < L5Profile.archWallChance + L5Profile.grateWallChance) {
|
|
wt = 36; // Grate wall
|
|
if (p == 2) p = 36;
|
|
if (p == 4) p = 27;
|
|
} else {
|
|
wt = 2; // Normal solid wall
|
|
}
|
|
|
|
if (random(0, 100) < L5Profile.archDoorChance) dt = 12; // Arch
|
|
else dt = 26; // Door
|
|
|
|
if (wt == 12) dt = 12; // If arch wall, force arch door
|
|
|
|
dungeon[i][j] = p;
|
|
for (xx = 1; xx < dx; xx++) dungeon[i + xx][j] = wt;
|
|
xx = random(0, dx - 1) + 1;
|
|
if (dt == 12) dungeon[i + xx][j] = dt;
|
|
else {
|
|
dungeon[i + xx][j] = 2;
|
|
dflags[i + xx][j] |= HDOOR;
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static void L5VertWall(int i, int j, char p, int dy)
|
|
{
|
|
int yy;
|
|
int rv;
|
|
char wt, dt;
|
|
|
|
rv = random(0, 100);
|
|
if (rv < L5Profile.archWallChance) {
|
|
wt = 11; // Arch wall
|
|
if (p == 1) p = 11;
|
|
if (p == 4) p = 14;
|
|
} else if (rv < L5Profile.archWallChance + L5Profile.grateWallChance) {
|
|
wt = 35; // Grate wall
|
|
if (p == 1) p = 35;
|
|
if (p == 4) p = 37;
|
|
} else {
|
|
wt = 1; // Normal solid wall
|
|
}
|
|
|
|
if (random(0, 100) < L5Profile.archDoorChance) dt = 11; // Arch
|
|
else dt = 25; // Door
|
|
|
|
if (wt == 11) dt = 11; // If arch wall, force arch door
|
|
|
|
dungeon[i][j] = p;
|
|
for (yy = 1; yy < dy; yy++) dungeon[i][j + yy] = wt;
|
|
yy = random(0, dy - 1) + 1;
|
|
if (dt == 11) dungeon[i][j + yy] = dt;
|
|
else {
|
|
dungeon[i][j + yy] = 1;
|
|
dflags[i][j + yy] |= VDOOR;
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static void L5AddWall()
|
|
{
|
|
int i, j;
|
|
int x, y;
|
|
|
|
for (j = 0; j < MDMAXY; j++) {
|
|
for (i = 0; i < MDMAXX; i++) {
|
|
if (dflags[i][j] == 0) {
|
|
if ((dungeon[i][j] == 3) && (random(0, 100) < L5Profile.wallChance)) {
|
|
x = L5HWallOk(i, j);
|
|
if (x != -1) L5HorizWall(i, j, 2, x);
|
|
}
|
|
if ((dungeon[i][j] == 3) && (random(0, 100) < L5Profile.wallChance)) {
|
|
y = L5VWallOk(i, j);
|
|
if (y != -1) L5VertWall(i, j, 1, y);
|
|
}
|
|
if ((dungeon[i][j] == 6) && (random(0, 100) < L5Profile.wallChance)) {
|
|
x = L5HWallOk(i, j);
|
|
if (x != -1) L5HorizWall(i, j, 4, x);
|
|
}
|
|
if ((dungeon[i][j] == 7) && (random(0, 100) < L5Profile.wallChance)) {
|
|
y = L5VWallOk(i, j);
|
|
if (y != -1) L5VertWall(i, j, 4, y);
|
|
}
|
|
if ((dungeon[i][j] == 2) && (random(0, 100) < L5Profile.wallChance)) {
|
|
x = L5HWallOk(i, j);
|
|
if (x != -1) L5HorizWall(i, j, 2, x);
|
|
}
|
|
if ((dungeon[i][j] == 1) && (random(0, 100) < L5Profile.wallChance)) {
|
|
y = L5VWallOk(i, j);
|
|
if (y != -1) L5VertWall(i, j, 1, y);
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*
|
|
**------------------------------------------------------------------------*/
|
|
static BOOL L5OpenFloor(int x, int y)
|
|
{
|
|
return dungeon[x][y] == D_FLOOR && dflags[x][y] == NODOOR;
|
|
}
|
|
|
|
/*------------------------------------------------------------------------*
|
|
**------------------------------------------------------------------------*/
|
|
static void L5AddLoops()
|
|
{
|
|
int i, j;
|
|
|
|
if (L5Profile.loopChance <= 0) return;
|
|
|
|
for (j = 2; j < MDMAXY - 2; j++) {
|
|
for (i = 2; i < MDMAXX - 2; i++) {
|
|
if (dflags[i][j] != NODOOR) continue;
|
|
if (random(0, 100) >= L5Profile.loopChance) continue;
|
|
|
|
if (dungeon[i][j] == D_VWALL && L5OpenFloor(i - 1, j) && L5OpenFloor(i + 1, j)) {
|
|
if (random(0, 100) < L5Profile.archDoorChance)
|
|
dungeon[i][j] = D_AVW;
|
|
else
|
|
dflags[i][j] |= VDOOR;
|
|
} else if (dungeon[i][j] == D_HWALL && L5OpenFloor(i, j - 1) && L5OpenFloor(i, j + 1)) {
|
|
if (random(0, 100) < L5Profile.archDoorChance)
|
|
dungeon[i][j] = D_AHW;
|
|
else
|
|
dflags[i][j] |= HDOOR;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static void DRLG_L5GChamber(int sx, int sy, int topflag, int bottomflag, int leftflag, int rightflag)
|
|
{
|
|
int i, j;
|
|
|
|
if (topflag == 1) {
|
|
// Place top row tiles
|
|
dungeon[sx + 2][sy] = D_AHW;
|
|
dungeon[sx + 3][sy] = D_AHW;
|
|
dungeon[sx + 4][sy] = D_LRC;
|
|
dungeon[sx + 7][sy] = D_ALLC;
|
|
dungeon[sx + 8][sy] = D_AHW;
|
|
dungeon[sx + 9][sy] = D_HWALL;
|
|
}
|
|
if (bottomflag == 1) {
|
|
// Place bottom row tiles
|
|
sy += 11;
|
|
dungeon[sx + 2][sy] = D_TULC1;
|
|
dungeon[sx + 3][sy] = D_AHW;
|
|
dungeon[sx + 4][sy] = D_AURC;
|
|
dungeon[sx + 7][sy] = D_AULC;
|
|
dungeon[sx + 8][sy] = D_AHW;
|
|
if (dungeon[sx + 9][sy] != D_ULC) dungeon[sx + 9][sy] = D_DULC;
|
|
sy -= 11;
|
|
}
|
|
|
|
if (leftflag == 1) {
|
|
// Place left column tiles
|
|
dungeon[sx][sy + 2] = D_AVW;
|
|
dungeon[sx][sy + 3] = D_AVW;
|
|
dungeon[sx][sy + 4] = D_LRC;
|
|
dungeon[sx][sy + 7] = D_AURC;
|
|
dungeon[sx][sy + 8] = D_AVW;
|
|
dungeon[sx][sy + 9] = D_VWALL;
|
|
}
|
|
if (rightflag == 1) {
|
|
// Place right column tiles
|
|
sx += 11;
|
|
dungeon[sx][sy + 2] = D_TULC2;
|
|
dungeon[sx][sy + 3] = D_AVW;
|
|
dungeon[sx][sy + 4] = D_ALLC;
|
|
dungeon[sx][sy + 7] = D_AULC;
|
|
dungeon[sx][sy + 8] = D_AVW;
|
|
if (dungeon[sx][sy + 9] != D_ULC) dungeon[sx][sy + 9] = D_DULC;
|
|
sx -= 11;
|
|
}
|
|
|
|
for (j = 1; j < 11; j++) {
|
|
for (i = 1; i < 11; i++) {
|
|
dungeon[sx + i][sy + j] = D_FLOOR;
|
|
dflags[sx + i][sy + j] |= SETP_TEMP;
|
|
}
|
|
}
|
|
dungeon[sx + 4][sy + 4] = D_COL;
|
|
dungeon[sx + 7][sy + 4] = D_COL;
|
|
dungeon[sx + 4][sy + 7] = D_COL;
|
|
dungeon[sx + 7][sy + 7] = D_COL;
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------*
|
|
**-----------------------------------------------------------------------*/
|
|
static void DRLG_L5GHall(int x1, int y1, int x2, int y2)
|
|
{
|
|
int i;
|
|
|
|
// Horiz or vert?
|
|
if (y1 == y2) {
|
|
// Horiz
|
|
for (i = x1; i < x2; i++) {
|
|
dungeon[i][y1] = D_AHW;
|
|
dungeon[i][y1 + 3] = D_AHW;
|
|
}
|
|
}
|
|
else {
|
|
// Vert
|
|
for (i = y1; i < y2; i++) {
|
|
dungeon[x1][i] = D_AVW;
|
|
dungeon[x1 + 3][i] = D_AVW;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------*
|
|
**-----------------------------------------------------------------------*/
|
|
static void L5tileFix()
|
|
{
|
|
int i, j;
|
|
|
|
for (j = 0; j < MDMAXY; j++) {
|
|
for (i = 0; i < MDMAXX; i++) {
|
|
if ((dungeon[i][j] == 2) && (dungeon[i + 1][j] == 22)) dungeon[i + 1][j] = 23;
|
|
if ((dungeon[i][j] == 13) && (dungeon[i + 1][j] == 22)) dungeon[i + 1][j] = 18;
|
|
if ((dungeon[i][j] == 13) && (dungeon[i + 1][j] == 2)) dungeon[i + 1][j] = 7;
|
|
|
|
if ((dungeon[i][j] == 6) && (dungeon[i + 1][j] == 22)) dungeon[i + 1][j] = 24;
|
|
|
|
if ((dungeon[i][j] == 1) && (dungeon[i][j + 1] == 22)) dungeon[i][j + 1] = 24;
|
|
if ((dungeon[i][j] == 13) && (dungeon[i][j + 1] == 1)) dungeon[i][j + 1] = 6;
|
|
if ((dungeon[i][j] == 13) && (dungeon[i][j + 1] == 22)) dungeon[i][j + 1] = 19;
|
|
}
|
|
}
|
|
for (j = 0; j < MDMAXY; j++) {
|
|
for (i = 0; i < MDMAXX; i++) {
|
|
if ((dungeon[i][j] == 13) && (dungeon[i + 1][j] == 19)) dungeon[i + 1][j] = 21;
|
|
if ((dungeon[i][j] == 13) && (dungeon[i + 1][j] == 22)) dungeon[i + 1][j] = 20;
|
|
if ((dungeon[i][j] == 7) && (dungeon[i + 1][j] == 22)) dungeon[i + 1][j] = 23;
|
|
if ((dungeon[i][j] == 13) && (dungeon[i + 1][j] == 24)) dungeon[i + 1][j] = 21;
|
|
if ((dungeon[i][j] == 19) && (dungeon[i + 1][j] == 22)) dungeon[i + 1][j] = 20;
|
|
if ((dungeon[i][j] == 2) && (dungeon[i + 1][j] == 19)) dungeon[i + 1][j] = 21;
|
|
if ((dungeon[i][j] == 19) && (dungeon[i + 1][j] == 1)) dungeon[i + 1][j] = 6;
|
|
if ((dungeon[i][j] == 7) && (dungeon[i + 1][j] == 19)) dungeon[i + 1][j] = 21;
|
|
if ((dungeon[i][j] == 2) && (dungeon[i + 1][j] == 1)) dungeon[i + 1][j] = 6;
|
|
if ((dungeon[i][j] == 3) && (dungeon[i + 1][j] == 22)) dungeon[i + 1][j] = 24;
|
|
if ((dungeon[i][j] == 21) && (dungeon[i + 1][j] == 1)) dungeon[i + 1][j] = 6;
|
|
if ((dungeon[i][j] == 7) && (dungeon[i + 1][j] == 1)) dungeon[i + 1][j] = 6;
|
|
if ((dungeon[i][j] == 7) && (dungeon[i + 1][j] == 24)) dungeon[i + 1][j] = 21;
|
|
if ((dungeon[i][j] == 4) && (dungeon[i + 1][j] == 16)) dungeon[i + 1][j] = 17;
|
|
if ((dungeon[i][j] == 7) && (dungeon[i + 1][j] == 13)) dungeon[i + 1][j] = 17;
|
|
if ((dungeon[i][j] == 2) && (dungeon[i + 1][j] == 24)) dungeon[i + 1][j] = 21;
|
|
if ((dungeon[i][j] == 2) && (dungeon[i + 1][j] == 13)) dungeon[i + 1][j] = 17;
|
|
|
|
if ((dungeon[i][j] == 23) && (dungeon[i - 1][j] == 22)) dungeon[i - 1][j] = 19;
|
|
if ((dungeon[i][j] == 19) && (dungeon[i - 1][j] == 23)) dungeon[i - 1][j] = 21;
|
|
if ((dungeon[i][j] == 6) && (dungeon[i - 1][j] == 22)) dungeon[i - 1][j] = 24;
|
|
if ((dungeon[i][j] == 6) && (dungeon[i - 1][j] == 23)) dungeon[i - 1][j] = 21;
|
|
|
|
if ((dungeon[i][j] == 1) && (dungeon[i][j + 1] == 2)) dungeon[i][j + 1] = 7;
|
|
if ((dungeon[i][j] == 6) && (dungeon[i][j + 1] == 18)) dungeon[i][j + 1] = 21;
|
|
if ((dungeon[i][j] == 18) && (dungeon[i][j + 1] == 2)) dungeon[i][j + 1] = 7;
|
|
if ((dungeon[i][j] == 6) && (dungeon[i][j + 1] == 2)) dungeon[i][j + 1] = 7;
|
|
if ((dungeon[i][j] == 21) && (dungeon[i][j + 1] == 2)) dungeon[i][j + 1] = 7;
|
|
if ((dungeon[i][j] == 6) && (dungeon[i][j + 1] == 22)) dungeon[i][j + 1] = 24;
|
|
if ((dungeon[i][j] == 6) && (dungeon[i][j + 1] == 13)) dungeon[i][j + 1] = 16;
|
|
if ((dungeon[i][j] == 1) && (dungeon[i][j + 1] == 13)) dungeon[i][j + 1] = 16;
|
|
if ((dungeon[i][j] == 13) && (dungeon[i][j + 1] == 16)) dungeon[i][j + 1] = 17;
|
|
|
|
if ((dungeon[i][j] == 6) && (dungeon[i][j - 1] == 22)) dungeon[i][j - 1] = 7;
|
|
if ((dungeon[i][j] == 6) && (dungeon[i][j - 1] == 22)) dungeon[i][j - 1] = 24;
|
|
if ((dungeon[i][j] == 7) && (dungeon[i][j - 1] == 24)) dungeon[i][j - 1] = 21;
|
|
if ((dungeon[i][j] == 18) && (dungeon[i][j - 1] == 24)) dungeon[i][j - 1] = 21;
|
|
}
|
|
}
|
|
for (j = 0; j < MDMAXY; j++) {
|
|
for (i = 0; i < MDMAXX; i++) {
|
|
if ((dungeon[i][j] == 4) && (dungeon[i][j + 1] == 2)) dungeon[i][j + 1] = 7;
|
|
if ((dungeon[i][j] == 2) && (dungeon[i + 1][j] == 19)) dungeon[i + 1][j] = 21;
|
|
if ((dungeon[i][j] == 18) && (dungeon[i][j + 1] == 22)) dungeon[i][j + 1] = 20;
|
|
}
|
|
}
|
|
}
|
|
|
|
static void DRLG_L5PlaceRndSet(const byte miniset[], int rndper)
|
|
{
|
|
int sx, sy;
|
|
int sw, sh;
|
|
int xx, yy;
|
|
int ii, kk;
|
|
int found;
|
|
|
|
// Width and height of the mini set piece
|
|
sw = miniset[0];
|
|
sh = miniset[1];
|
|
|
|
// Find a location for the mini set piece
|
|
for (sy = 0; sy < (MDMAXY - sh); sy++) {
|
|
for (sx = 0; sx < (MDMAXX - sw); sx++) {
|
|
found = 1;
|
|
ii = 2;
|
|
|
|
// if (((sx >= SP3x1) && (sx <= SP3x2)) && ((sy >= SP3y1) && (sy <= SP3y2))) found = 0;
|
|
|
|
for (yy = 0; ((yy < sh) && (found == 1)); yy++) {
|
|
for (xx = 0; ((xx < sw) && (found == 1)); xx++) {
|
|
if ((miniset[ii] != 0) && (dungeon[sx + xx][sy + yy] != miniset[ii])) found = 0;
|
|
if (dflags[sx + xx][sy + yy] != 0) found = 0;
|
|
ii++;
|
|
}
|
|
}
|
|
|
|
kk = (sh * sw) + 2;
|
|
if (miniset[kk] >= 84 && miniset[kk] <= 100 && found == 1) {
|
|
if (dungeon[sx - 1][sy] >= 84 && dungeon[sx - 1][sy] <= 100) found = 0;
|
|
if (dungeon[sx + 1][sy] >= 84 && dungeon[sx - 1][sy] <= 100) found = 0;
|
|
if (dungeon[sx][sy + 1] >= 84 && dungeon[sx - 1][sy] <= 100) found = 0;
|
|
if (dungeon[sx][sy - 1] >= 84 && dungeon[sx - 1][sy] <= 100) found = 0;
|
|
}
|
|
|
|
if ((found == 1) && (random(0, 100) < rndper)) {
|
|
// Place mini set piece
|
|
for (yy = 0; yy < sh; yy++) {
|
|
for (xx = 0; xx < sw; xx++) {
|
|
if (miniset[kk] != 0) dungeon[sx + xx][sy + yy] = miniset[kk];
|
|
kk++;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static void DRLG_L5Subs()
|
|
{
|
|
int x, y, i, rv;
|
|
byte c;
|
|
|
|
for (y = 0; y < MDMAXY; y++) {
|
|
for (x = 0; x < MDMAXX; x++) {
|
|
rv = random(0, 4);
|
|
if (rv == 0) {
|
|
c = dungeon[x][y];
|
|
c = L5BTYPES[c];
|
|
if ((c != 0) && (dflags[x][y] == 0)) {
|
|
rv = random(0, 16);
|
|
i = -1;
|
|
while (rv >= 0) {
|
|
i++;
|
|
if (i == NUMBLOCKS) i = 0;
|
|
if (c == L5BTYPES[i]) rv--;
|
|
}
|
|
if (i == 89) {
|
|
c = dungeon[x][y - 1];
|
|
if ((L5BTYPES[c] == 79) && (dflags[x][y - 1] == 0)) {
|
|
dungeon[x][y - 1] = 90;
|
|
}
|
|
else i = 79;
|
|
}
|
|
if (i == 91) {
|
|
c = dungeon[x + 1][y];
|
|
if ((L5BTYPES[c] == 80) && (dflags[x + 1][y] == 0)) {
|
|
dungeon[x + 1][y] = 92;
|
|
}
|
|
else i = 80;
|
|
}
|
|
dungeon[x][y] = i;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------*
|
|
**-----------------------------------------------------------------------*/
|
|
static void DRLG_L5SetRoom(int rx1, int ry1)
|
|
{
|
|
int rw, rh;
|
|
int i, j;
|
|
byte* sp;
|
|
|
|
sp = pSetPiece;
|
|
rw = *sp;
|
|
sp += 2;
|
|
rh = *sp;
|
|
sp += 2;
|
|
|
|
setpc_x = rx1;
|
|
setpc_y = ry1;
|
|
setpc_w = rw;
|
|
setpc_h = rh;
|
|
|
|
//DRLG_MRectTrans(rx1, ry1, rx2, ry2);
|
|
//DRLG_MRectTrans(rx1+2, ry1+2, rx2-2, ry2-2);
|
|
|
|
sp = pSetPiece + 4;
|
|
for (j = 0; j < rh; j++) {
|
|
for (i = 0; i < rw; i++) {
|
|
if (*sp != 0) {
|
|
dungeon[rx1 + i][ry1 + j] = *sp;
|
|
dflags[rx1 + i][ry1 + j] |= SETP_BIT;
|
|
}
|
|
else dungeon[rx1 + i][ry1 + j] = D_FLOOR;
|
|
sp += 2;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------*
|
|
**-----------------------------------------------------------------------*/
|
|
static void HRLG_L5SetRoom(int rx1, int ry1)
|
|
{
|
|
int rw;
|
|
int i, j;
|
|
|
|
// Don't know what these do. JKE
|
|
setpc_x = rx1;
|
|
setpc_y = ry1;
|
|
setpc_w = NA_KRULS_ROOM[0];
|
|
setpc_h = NA_KRULS_ROOM[1];
|
|
|
|
Na_Krul.x = ((rx1 + 3) * 2);
|
|
Na_Krul.y = ((ry1 + 4) * 2);
|
|
Na_Krul.Books = FALSE;
|
|
Na_Krul.Open = FALSE;
|
|
Na_Krul.Lever_Thrown = FALSE;
|
|
|
|
|
|
rw = 2;
|
|
for (j = 0; j < NA_KRULS_ROOM[1]; j++) {
|
|
for (i = 0; i < NA_KRULS_ROOM[0]; i++) {
|
|
if (NA_KRULS_ROOM[rw] != 0) {
|
|
dungeon[rx1 + i][ry1 + j] = NA_KRULS_ROOM[rw];
|
|
dflags[rx1 + i][ry1 + j] |= SETP_BIT;
|
|
}
|
|
else dungeon[rx1 + i][ry1 + j] = D_FLOOR;
|
|
++rw;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------*
|
|
**-----------------------------------------------------------------------*/
|
|
static void CRLG_L5SetRoom(int rx1, int ry1)
|
|
{
|
|
int rw;
|
|
int i, j;
|
|
|
|
// Don't know what these do. JKE
|
|
setpc_x = rx1;
|
|
setpc_y = ry1;
|
|
setpc_w = CORNERSTONE[0];
|
|
setpc_h = CORNERSTONE[1];
|
|
|
|
|
|
rw = 2;
|
|
for (j = 0; j < CORNERSTONE[1]; j++) {
|
|
for (i = 0; i < CORNERSTONE[0]; i++) {
|
|
if (CORNERSTONE[rw] != 0) {
|
|
dungeon[rx1 + i][ry1 + j] = CORNERSTONE[rw];
|
|
dflags[rx1 + i][ry1 + j] |= SETP_BIT;
|
|
}
|
|
else dungeon[rx1 + i][ry1 + j] = D_FLOOR;
|
|
++rw;
|
|
}
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------*
|
|
**-----------------------------------------------------------------------*/
|
|
static void L5FillChambers()
|
|
{
|
|
int c;
|
|
|
|
if (HR1) DRLG_L5GChamber(0, 14, 0, 0, 0, 1);
|
|
if (HR2) {
|
|
if ((HR1) && (!HR3)) DRLG_L5GChamber(14, 14, 0, 0, 1, 0);
|
|
if ((!HR1) && (HR3)) DRLG_L5GChamber(14, 14, 0, 0, 0, 1);
|
|
if ((HR1) && (HR3)) DRLG_L5GChamber(14, 14, 0, 0, 1, 1);
|
|
if ((!HR1) && (!HR3)) DRLG_L5GChamber(14, 14, 0, 0, 0, 0);
|
|
}
|
|
if (HR3) DRLG_L5GChamber(28, 14, 0, 0, 1, 0);
|
|
if ((HR1) && (HR2)) DRLG_L5GHall(12, 18, 14, 18);
|
|
if ((HR2) && (HR3)) DRLG_L5GHall(26, 18, 28, 18);
|
|
if ((HR1) && (!HR2) && (HR3)) DRLG_L5GHall(12, 18, 28, 18);
|
|
|
|
if (VR1) DRLG_L5GChamber(14, 0, 0, 1, 0, 0);
|
|
if (VR2) {
|
|
if ((VR1) && (!VR3)) DRLG_L5GChamber(14, 14, 1, 0, 0, 0);
|
|
if ((!VR1) && (VR3)) DRLG_L5GChamber(14, 14, 0, 1, 0, 0);
|
|
if ((VR1) && (VR3)) DRLG_L5GChamber(14, 14, 1, 1, 0, 0);
|
|
if ((!VR1) && (!VR3)) DRLG_L5GChamber(14, 14, 0, 0, 0, 0);
|
|
}
|
|
if (VR3) DRLG_L5GChamber(14, 28, 1, 0, 0, 0);
|
|
if ((VR1) && (VR2)) DRLG_L5GHall(18, 12, 18, 14);
|
|
if ((VR2) && (VR3)) DRLG_L5GHall(18, 26, 18, 28);
|
|
if ((VR1) && (!VR2) && (VR3)) DRLG_L5GHall(18, 12, 18, 28);
|
|
|
|
if (currlevel == NA_KRUL_LEVEL)
|
|
{
|
|
if ((!VR1) && (!VR2) && (!VR3)) {
|
|
// Horizontal
|
|
c = 1; // Middle room
|
|
if ((!HR1) && (HR2) && (HR3)) {
|
|
if (random(0, 2)) c = 2;
|
|
}
|
|
if ((HR1) && (HR2) && (!HR3)) {
|
|
if (random(0, 2)) c = 0;
|
|
}
|
|
if ((HR1) && (!HR2) && (HR3)) {
|
|
if (random(0, 2)) c = 0;
|
|
else c = 2;
|
|
}
|
|
if ((HR1) && (HR2) && (HR3)) c = random(0, 3);
|
|
switch (c) {
|
|
case 0:
|
|
HRLG_L5SetRoom(2, 16);
|
|
break;
|
|
case 1:
|
|
HRLG_L5SetRoom(16, 16);
|
|
break;
|
|
case 2:
|
|
HRLG_L5SetRoom(30, 16);
|
|
break;
|
|
}
|
|
}
|
|
else {
|
|
// Vertical
|
|
c = 1; // Middle room
|
|
if ((!VR1) && (VR2) && (VR3)) {
|
|
if (random(0, 2)) c = 2;
|
|
}
|
|
if ((VR1) && (VR2) && (!VR3)) {
|
|
if (random(0, 2)) c = 0;
|
|
}
|
|
if ((VR1) && (!VR2) && (VR3)) {
|
|
if (random(0, 2)) c = 0;
|
|
else c = 2;
|
|
}
|
|
if ((VR1) && (VR2) && (VR3)) c = random(0, 3);
|
|
switch (c) {
|
|
case 0:
|
|
HRLG_L5SetRoom(16, 2);
|
|
break;
|
|
case 1:
|
|
HRLG_L5SetRoom(16, 16);
|
|
break;
|
|
case 2:
|
|
HRLG_L5SetRoom(16, 30);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (currlevel == CORNERSTONE_LEVEL)
|
|
{
|
|
if ((!VR1) && (!VR2) && (!VR3)) {
|
|
// Horizontal
|
|
c = 1; // Middle room
|
|
if ((!HR1) && (HR2) && (HR3)) {
|
|
if (random(0, 2)) c = 2;
|
|
}
|
|
if ((HR1) && (HR2) && (!HR3)) {
|
|
if (random(0, 2)) c = 0;
|
|
}
|
|
if ((HR1) && (!HR2) && (HR3)) {
|
|
if (random(0, 2)) c = 0;
|
|
else c = 2;
|
|
}
|
|
if ((HR1) && (HR2) && (HR3)) c = random(0, 3);
|
|
switch (c) {
|
|
case 0:
|
|
CRLG_L5SetRoom(2, 16);
|
|
break;
|
|
case 1:
|
|
CRLG_L5SetRoom(16, 16);
|
|
break;
|
|
case 2:
|
|
CRLG_L5SetRoom(30, 16);
|
|
break;
|
|
}
|
|
}
|
|
else {
|
|
// Vertical
|
|
c = 1; // Middle room
|
|
if ((!VR1) && (VR2) && (VR3)) {
|
|
if (random(0, 2)) c = 2;
|
|
}
|
|
if ((VR1) && (VR2) && (!VR3)) {
|
|
if (random(0, 2)) c = 0;
|
|
}
|
|
if ((VR1) && (!VR2) && (VR3)) {
|
|
if (random(0, 2)) c = 0;
|
|
else c = 2;
|
|
}
|
|
if ((VR1) && (VR2) && (VR3)) c = random(0, 3);
|
|
switch (c) {
|
|
case 0:
|
|
CRLG_L5SetRoom(16, 2);
|
|
break;
|
|
case 1:
|
|
CRLG_L5SetRoom(16, 16);
|
|
break;
|
|
case 2:
|
|
CRLG_L5SetRoom(16, 30);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
if (setloadflag) {
|
|
if ((!VR1) && (!VR2) && (!VR3)) {
|
|
// Horizontal
|
|
c = 1; // Middle room
|
|
if ((!HR1) && (HR2) && (HR3)) {
|
|
if (random(0, 2)) c = 2;
|
|
}
|
|
if ((HR1) && (HR2) && (!HR3)) {
|
|
if (random(0, 2)) c = 0;
|
|
}
|
|
if ((HR1) && (!HR2) && (HR3)) {
|
|
if (random(0, 2)) c = 0;
|
|
else c = 2;
|
|
}
|
|
if ((HR1) && (HR2) && (HR3)) c = random(0, 3);
|
|
switch (c) {
|
|
case 0:
|
|
DRLG_L5SetRoom(2, 16);
|
|
break;
|
|
case 1:
|
|
DRLG_L5SetRoom(16, 16);
|
|
break;
|
|
case 2:
|
|
DRLG_L5SetRoom(30, 16);
|
|
break;
|
|
}
|
|
}
|
|
else {
|
|
// Vertical
|
|
c = 1; // Middle room
|
|
if ((!VR1) && (VR2) && (VR3)) {
|
|
if (random(0, 2)) c = 2;
|
|
}
|
|
if ((VR1) && (VR2) && (!VR3)) {
|
|
if (random(0, 2)) c = 0;
|
|
}
|
|
if ((VR1) && (!VR2) && (VR3)) {
|
|
if (random(0, 2)) c = 0;
|
|
else c = 2;
|
|
}
|
|
if ((VR1) && (VR2) && (VR3)) c = random(0, 3);
|
|
switch (c) {
|
|
case 0:
|
|
DRLG_L5SetRoom(16, 2);
|
|
break;
|
|
case 1:
|
|
DRLG_L5SetRoom(16, 16);
|
|
break;
|
|
case 2:
|
|
DRLG_L5SetRoom(16, 30);
|
|
break;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static void DRLG_L5FTVR(int i, int j, int x, int y, int d)
|
|
{
|
|
if ((dTransVal[x][y] == 0) && (dungeon[i][j] == D_FLOOR)) {
|
|
dTransVal[x][y] = TransVal;
|
|
dTransVal[x + 1][y] = TransVal;
|
|
dTransVal[x][y + 1] = TransVal;
|
|
dTransVal[x + 1][y + 1] = TransVal;
|
|
DRLG_L5FTVR(i + 1, j, x + 2, y, 1);
|
|
DRLG_L5FTVR(i - 1, j, x - 2, y, 2);
|
|
DRLG_L5FTVR(i, j + 1, x, y + 2, 3);
|
|
DRLG_L5FTVR(i, j - 1, x, y - 2, 4);
|
|
|
|
DRLG_L5FTVR(i - 1, j - 1, x - 2, y - 2, 5);
|
|
DRLG_L5FTVR(i + 1, j - 1, x + 2, y - 2, 6);
|
|
DRLG_L5FTVR(i - 1, j + 1, x - 2, y + 2, 7);
|
|
DRLG_L5FTVR(i + 1, j + 1, x + 2, y + 2, 8);
|
|
}
|
|
else {
|
|
if (d == 1) {
|
|
dTransVal[x][y] = TransVal;
|
|
dTransVal[x][y + 1] = TransVal;
|
|
}
|
|
if (d == 2) {
|
|
dTransVal[x + 1][y] = TransVal;
|
|
dTransVal[x + 1][y + 1] = TransVal;
|
|
}
|
|
if (d == 3) {
|
|
dTransVal[x][y] = TransVal;
|
|
dTransVal[x + 1][y] = TransVal;
|
|
}
|
|
if (d == 4) {
|
|
dTransVal[x][y + 1] = TransVal;
|
|
dTransVal[x + 1][y + 1] = TransVal;
|
|
}
|
|
if (d == 5) dTransVal[x + 1][y + 1] = TransVal;
|
|
if (d == 6) dTransVal[x][y + 1] = TransVal;
|
|
if (d == 7) dTransVal[x + 1][y] = TransVal;
|
|
if (d == 8) dTransVal[x][y] = TransVal;
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static void DRLG_L5FloodTVal()
|
|
{
|
|
int i, j;
|
|
int xx, yy;
|
|
|
|
yy = DIRTEDGED2;
|
|
for (j = 0; j < MDMAXY; j++) {
|
|
xx = DIRTEDGED2;
|
|
for (i = 0; i < MDMAXX; i++) {
|
|
if ((dungeon[i][j] == D_FLOOR) && (dTransVal[xx][yy] == 0)) {
|
|
DRLG_L5FTVR(i, j, xx, yy, 0);
|
|
TransVal++;
|
|
}
|
|
xx += 2;
|
|
}
|
|
yy += 2;
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
static void DRLG_L5TransFix()
|
|
{
|
|
int i, j;
|
|
int xx, yy;
|
|
|
|
yy = DIRTEDGED2;
|
|
for (j = 0; j < MDMAXY; j++) {
|
|
xx = DIRTEDGED2;
|
|
for (i = 0; i < MDMAXX; i++) {
|
|
if ((dungeon[i][j] == D_DURC) && (dungeon[i][j - 1] == D_DV)) {
|
|
dTransVal[xx + 1][yy] = dTransVal[xx][yy];
|
|
dTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];
|
|
}
|
|
if ((dungeon[i][j] == D_DLLC) && (dungeon[i + 1][j] == D_DH)) {
|
|
dTransVal[xx][yy + 1] = dTransVal[xx][yy];
|
|
dTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];
|
|
}
|
|
if (dungeon[i][j] == D_DV) {
|
|
dTransVal[xx + 1][yy] = dTransVal[xx][yy];
|
|
dTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];
|
|
}
|
|
if (dungeon[i][j] == D_DH) {
|
|
dTransVal[xx][yy + 1] = dTransVal[xx][yy];
|
|
dTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];
|
|
}
|
|
if (dungeon[i][j] == D_DLRC) {
|
|
dTransVal[xx + 1][yy] = dTransVal[xx][yy];
|
|
dTransVal[xx][yy + 1] = dTransVal[xx][yy];
|
|
dTransVal[xx + 1][yy + 1] = dTransVal[xx][yy];
|
|
}
|
|
xx += 2;
|
|
}
|
|
yy += 2;
|
|
}
|
|
}
|
|
/*-----------------------------------------------------------------------*
|
|
**-----------------------------------------------------------------------*/
|
|
static void DRLG_L5DirtFix()
|
|
{
|
|
int i, j;
|
|
|
|
if (currlevel < CRYPTSTART)
|
|
{
|
|
for (j = 0; j < MDMAXY - 1; j++) {
|
|
for (i = 0; i < MDMAXX - 1; i++) {
|
|
if ((dungeon[i][j] == 21) && (dungeon[i + 1][j] != 19)) dungeon[i][j] = 202;
|
|
if ((dungeon[i][j] == 19) && (dungeon[i + 1][j] != 19)) dungeon[i][j] = 200;
|
|
if ((dungeon[i][j] == 24) && (dungeon[i + 1][j] != 19)) dungeon[i][j] = 205;
|
|
|
|
if ((dungeon[i][j] == 18) && (dungeon[i][j + 1] != 18)) dungeon[i][j] = 199;
|
|
if ((dungeon[i][j] == 21) && (dungeon[i][j + 1] != 18)) dungeon[i][j] = 202;
|
|
if ((dungeon[i][j] == 23) && (dungeon[i][j + 1] != 18)) dungeon[i][j] = 204;
|
|
}
|
|
}
|
|
}
|
|
else
|
|
{
|
|
for (j = 0; j < MDMAXY - 1; j++) {
|
|
for (i = 0; i < MDMAXX - 1; i++) {
|
|
// if ((dungeon[i][j] == 21) && (dungeon[i+1][j] != 19))
|
|
// dungeon[i][j] = 85;
|
|
// if ((dungeon[i][j] == 19) && (dungeon[i+1][j] != 19))
|
|
// dungeon[i][j] = 83;
|
|
// if ((dungeon[i][j] == 24) && (dungeon[i+1][j] != 19))
|
|
// dungeon[i][j] = 88;
|
|
|
|
// if ((dungeon[i][j] == 18) && (dungeon[i][j+1] != 18))
|
|
// dungeon[i][j] = 82;
|
|
// if ((dungeon[i][j] == 21) && (dungeon[i][j+1] != 18))
|
|
// dungeon[i][j] = 85;
|
|
// if ((dungeon[i][j] == 23) && (dungeon[i][j+1] != 18))
|
|
if (dungeon[i][j] == 19)
|
|
dungeon[i][j] = 83;
|
|
if (dungeon[i][j] == 21)
|
|
dungeon[i][j] = 85;
|
|
if (dungeon[i][j] == 23)
|
|
dungeon[i][j] = 87;
|
|
if (dungeon[i][j] == 24)
|
|
dungeon[i][j] = 88;
|
|
if (dungeon[i][j] == 18)
|
|
dungeon[i][j] = 82;
|
|
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------*
|
|
**-----------------------------------------------------------------------*/
|
|
|
|
static void DRLG_L5CornerFix()
|
|
{
|
|
int i, j;
|
|
|
|
for (j = 1; j < MDMAXY - 1; j++) {
|
|
for (i = 1; i < MDMAXX - 1; i++) {
|
|
if (!(dflags[i][j] & SETP_BIT)) {
|
|
if ((dungeon[i][j] == 17) && (dungeon[i - 1][j] == 13) && (dungeon[i][j - 1] == 1)) {
|
|
dungeon[i][j] = 16;
|
|
dflags[i][j - 1] &= SETP_BIT;
|
|
}
|
|
}
|
|
if ((dungeon[i][j] == 202) && (dungeon[i + 1][j] == 13) && (dungeon[i][j + 1] == 1)) {
|
|
dungeon[i][j] = 8;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
|
|
static void Statues(int chance)
|
|
{
|
|
DRLG_L5PlaceRndSet(STATUE_LEFTA, chance);
|
|
DRLG_L5PlaceRndSet(STATUE_LEFTB, chance);
|
|
|
|
DRLG_L5PlaceRndSet(STATUE_RIGHTA, chance);
|
|
DRLG_L5PlaceRndSet(STATUE_RIGHTB, chance);
|
|
}
|
|
|
|
static void BrokenWall1(int chance)
|
|
{
|
|
DRLG_L5PlaceRndSet(BROKEN_VWALL1, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_HWALL1, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_LRC1, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_ULC1, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_AULC1, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_URC1, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_LLC1, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_AURC1, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_ALLC1, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_TULC11, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_AVW1, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_AHW1, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_FLOOR1, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_TULC21, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_COL1, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_BCAP1, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_RCAP1, chance);
|
|
}
|
|
|
|
static void BrokenWall2(int chance)
|
|
{
|
|
DRLG_L5PlaceRndSet(BROKEN_VWALL2, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_HWALL2, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_LRC2, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_ULC2, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_AULC2, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_URC2, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_LLC2, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_AURC2, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_ALLC2, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_TULC12, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_AVW2, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_AHW2, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_FLOOR2, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_TULC22, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_COL2, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_BCAP2, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_RCAP2, chance);
|
|
}
|
|
|
|
static void BrokenWall3(int chance)
|
|
{
|
|
DRLG_L5PlaceRndSet(BROKEN_VWALL3, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_HWALL3, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_LRC3, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_ULC3, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_AULC3, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_URC3, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_LLC3, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_AURC3, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_ALLC3, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_TULC13, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_AVW3, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_AHW3, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_FLOOR3, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_TULC23, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_COL3, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_BCAP3, chance);
|
|
DRLG_L5PlaceRndSet(BROKEN_RCAP3, chance);
|
|
}
|
|
|
|
|
|
|
|
static void FloorRubble(int chance)
|
|
{
|
|
DRLG_L5PlaceRndSet(BIGFLOORR1, chance);
|
|
DRLG_L5PlaceRndSet(BIGFLOORR2, chance);
|
|
DRLG_L5PlaceRndSet(BIGFLOORR3, chance);
|
|
DRLG_L5PlaceRndSet(BIGFLOORR4, chance);
|
|
DRLG_L5PlaceRndSet(BIGFLOORR5, chance);
|
|
DRLG_L5PlaceRndSet(BIGFLOORR6, chance);
|
|
|
|
DRLG_L5PlaceRndSet(FLOORR1, chance);
|
|
DRLG_L5PlaceRndSet(FLOORR2, chance);
|
|
DRLG_L5PlaceRndSet(FLOORR3, chance);
|
|
DRLG_L5PlaceRndSet(FLOORR4, chance);
|
|
|
|
}
|
|
|
|
|
|
|
|
static void BrokenGrate(int chance)
|
|
{
|
|
DRLG_L5PlaceRndSet(ARCHLEFT1A, chance);
|
|
DRLG_L5PlaceRndSet(ARCHRIGHT1A, chance);
|
|
|
|
DRLG_L5PlaceRndSet(ARCHLEFT1B, chance);
|
|
DRLG_L5PlaceRndSet(ARCHRIGHT1B, chance);
|
|
|
|
|
|
DRLG_L5PlaceRndSet(GRATELEFT1BA, chance);
|
|
DRLG_L5PlaceRndSet(GRATELEFT1BB, chance);
|
|
|
|
DRLG_L5PlaceRndSet(GRATELEFT1MA, chance);
|
|
DRLG_L5PlaceRndSet(GRATELEFT1MB, chance);
|
|
|
|
DRLG_L5PlaceRndSet(GRATELEFT1TA, chance);
|
|
DRLG_L5PlaceRndSet(GRATELEFT1TB, chance);
|
|
|
|
DRLG_L5PlaceRndSet(GRATERIGHT1RA, chance);
|
|
DRLG_L5PlaceRndSet(GRATERIGHT1RB, chance);
|
|
|
|
DRLG_L5PlaceRndSet(GRATERIGHT1MA, chance);
|
|
DRLG_L5PlaceRndSet(GRATERIGHT1MB, chance);
|
|
|
|
DRLG_L5PlaceRndSet(GRATERIGHT1LA, chance);
|
|
DRLG_L5PlaceRndSet(GRATERIGHT1LB, chance);
|
|
|
|
DRLG_L5PlaceRndSet(FLOOR1B1, chance);
|
|
DRLG_L5PlaceRndSet(FLOOR2B1, chance);
|
|
DRLG_L5PlaceRndSet(FLOOR3B1, chance);
|
|
DRLG_L5PlaceRndSet(FLOOR4B1, chance);
|
|
DRLG_L5PlaceRndSet(FLOOR5B1, chance);
|
|
DRLG_L5PlaceRndSet(FLOOR6B1, chance);
|
|
DRLG_L5PlaceRndSet(FLOOR7B1, chance);
|
|
|
|
DRLG_L5PlaceRndSet(BIGFLOORB1, chance);
|
|
DRLG_L5PlaceRndSet(BIGFLOORB2, chance);
|
|
DRLG_L5PlaceRndSet(BIGFLOORB3, chance);
|
|
|
|
|
|
}
|
|
|
|
static void NormalGrate(int chance)
|
|
{
|
|
DRLG_L5PlaceRndSet(FLOOR1, chance);
|
|
DRLG_L5PlaceRndSet(FLOOR2, chance);
|
|
DRLG_L5PlaceRndSet(FLOOR3, chance);
|
|
DRLG_L5PlaceRndSet(FLOOR4, chance);
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------*
|
|
**-----------------------------------------------------------------------*/
|
|
static void DRLG_L5(int entry)
|
|
{
|
|
long area, minarea;
|
|
BOOL doneflag;
|
|
int i, j;
|
|
int xx, yy;
|
|
|
|
doneflag = FALSE;
|
|
InitL5CathedralProfile();
|
|
minarea = L5Profile.minArea;
|
|
|
|
while (!doneflag) {
|
|
DRLG_InitTrans();
|
|
do {
|
|
InitL5Dungeon();
|
|
L5firstRoom();
|
|
area = L5GetArea();
|
|
} while (area < minarea);
|
|
L5makeDungeon();
|
|
//if (currlevel < CRYPTSTART)
|
|
L5makeDmt();
|
|
L5FillChambers();
|
|
//if (currlevel < CRYPTSTART)
|
|
L5tileFix();
|
|
|
|
L5AddWall();
|
|
if (currlevel < CRYPTSTART) L5AddLoops();
|
|
L5ClearFlags();
|
|
DRLG_L5FloodTVal();
|
|
|
|
doneflag = TRUE;
|
|
|
|
|
|
|
|
if (QuestStatus(Q_PWATER)) {
|
|
if (entry == LVL_DOWN) {
|
|
if (DRLG_PlaceMiniSet(PWATERIN, 1, 1, 0, 0, 1, -1, LVL_DOWN) < 0) doneflag = FALSE;
|
|
}
|
|
else {
|
|
if (DRLG_PlaceMiniSet(PWATERIN, 1, 1, 0, 0, 0, -1, LVL_DOWN) < 0) doneflag = FALSE;
|
|
ViewY--;
|
|
}
|
|
}
|
|
|
|
if (QuestStatus(Q_LTBANNER)) { //JKE This might prove a problem if the quest comes up.
|
|
if (entry == LVL_DOWN) {
|
|
if (DRLG_PlaceMiniSet(STAIRSUP, 1, 1, 0, 0, 1, -1, LVL_DOWN) < 0) doneflag = FALSE;
|
|
}
|
|
else {
|
|
if (DRLG_PlaceMiniSet(STAIRSUP, 1, 1, 0, 0, 0, -1, LVL_DOWN) < 0) doneflag = FALSE;
|
|
if (entry == LVL_UP) {
|
|
ViewX = (setpc_x << 1) + 4 + DIRTEDGED2;
|
|
ViewY = (setpc_y << 1) + 12 + DIRTEDGED2;
|
|
}
|
|
else
|
|
ViewY--;
|
|
}
|
|
}
|
|
else {
|
|
if (entry == LVL_DOWN)
|
|
{
|
|
if (currlevel < CRYPTSTART)
|
|
{
|
|
if (DRLG_PlaceMiniSet(STAIRSUP, 1, 1, 0, 0, 1, -1, LVL_DOWN) < 0) doneflag = FALSE;
|
|
if (DRLG_PlaceMiniSet(STAIRSDOWN, 1, 1, 0, 0, 0, -1, LVL_UP) < 0) doneflag = FALSE;
|
|
}
|
|
else
|
|
{
|
|
if (currlevel == CRYPTSTART) // JKE set town warp up
|
|
{
|
|
if (DRLG_PlaceMiniSet(WARPSTAIRS, 1, 1, 0, 0, 0, -1, LVL_TWARPDN) < 0) doneflag = FALSE;
|
|
if (DRLG_PlaceMiniSet(L5STAIRSDOWN, 1, 1, 0, 0, 0, -1, LVL_UP) < 0) doneflag = FALSE;
|
|
}
|
|
else
|
|
{
|
|
|
|
if (DRLG_PlaceMiniSet(L5STAIRSUP, 1, 1, 0, 0, 1, -1, LVL_DOWN) < 0) doneflag = FALSE;
|
|
if (currlevel != CRYPTEND) // no stairs down on level 20 JKE
|
|
if (DRLG_PlaceMiniSet(L5STAIRSDOWN, 1, 1, 0, 0, 0, -1, LVL_UP) < 0) doneflag = FALSE;
|
|
}
|
|
++ViewY;
|
|
}
|
|
}
|
|
else {
|
|
if (entry == LVL_UP) {
|
|
if (currlevel < CRYPTSTART)
|
|
{
|
|
if (DRLG_PlaceMiniSet(STAIRSUP, 1, 1, 0, 0, 0, -1, LVL_DOWN) < 0) doneflag = FALSE;
|
|
if (DRLG_PlaceMiniSet(STAIRSDOWN, 1, 1, 0, 0, 1, -1, LVL_UP) < 0) doneflag = FALSE;
|
|
ViewY--;
|
|
}
|
|
else
|
|
{
|
|
if (currlevel == CRYPTSTART) // JKE set town warp up
|
|
{
|
|
if (DRLG_PlaceMiniSet(WARPSTAIRS, 1, 1, 0, 0, 0, -1, LVL_TWARPDN) < 0) doneflag = FALSE;
|
|
if (DRLG_PlaceMiniSet(L5STAIRSDOWN, 1, 1, 0, 0, 1, -1, LVL_UP) < 0) doneflag = FALSE;
|
|
}
|
|
else
|
|
{
|
|
if (DRLG_PlaceMiniSet(L5STAIRSUP, 1, 1, 0, 0, 1, -1, LVL_DOWN) < 0) doneflag = FALSE;
|
|
if (currlevel != CRYPTEND) // no stairs down on level 20 JKE
|
|
if (DRLG_PlaceMiniSet(L5STAIRSDOWN, 1, 1, 0, 0, 1, -1, LVL_UP) < 0) doneflag = FALSE;
|
|
}
|
|
ViewY += 3;
|
|
}
|
|
}
|
|
else {
|
|
if (currlevel < CRYPTSTART)
|
|
{
|
|
if (DRLG_PlaceMiniSet(STAIRSUP, 1, 1, 0, 0, 0, -1, LVL_DOWN) < 0) doneflag = FALSE;
|
|
if (DRLG_PlaceMiniSet(STAIRSDOWN, 1, 1, 0, 0, 0, -1, LVL_UP) < 0) doneflag = FALSE;
|
|
}
|
|
else
|
|
{
|
|
if (currlevel == CRYPTSTART) // JKE set town warp up
|
|
{
|
|
if (DRLG_PlaceMiniSet(WARPSTAIRS, 1, 1, 0, 0, 1, -1, LVL_TWARPDN) < 0) doneflag = FALSE;
|
|
if (DRLG_PlaceMiniSet(L5STAIRSDOWN, 1, 1, 0, 0, 0, -1, LVL_UP) < 0) doneflag = FALSE;
|
|
}
|
|
else
|
|
{
|
|
if (DRLG_PlaceMiniSet(L5STAIRSUP, 1, 1, 0, 0, 1, -1, LVL_DOWN) < 0) doneflag = FALSE;
|
|
if (currlevel != CRYPTEND) // no stairs down on level 20 JKE
|
|
if (DRLG_PlaceMiniSet(L5STAIRSDOWN, 1, 1, 0, 0, 0, -1, LVL_UP) < 0) doneflag = FALSE;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// if (currlevel == NA_KRUL_LEVEL)
|
|
// if (DRLG_PlaceMiniSet(NA_KRULS_ROOM, 1, 1, 0, 0, 0, -1, LVL_DOWN) < 0)
|
|
// doneflag = FALSE;
|
|
}
|
|
}
|
|
|
|
|
|
|
|
// Fix stair trans
|
|
for (j = 0; j < MDMAXY; j++) {
|
|
for (i = 0; i < MDMAXX; i++) {
|
|
if (dungeon[i][j] == 64) {
|
|
xx = (i << 1) + DIRTEDGED2;
|
|
yy = (j << 1) + DIRTEDGED2;
|
|
DRLG_CopyTrans(xx, yy + 1, xx, yy);
|
|
DRLG_CopyTrans(xx + 1, yy + 1, xx + 1, yy);
|
|
}
|
|
}
|
|
}
|
|
|
|
// Finish/fix trans
|
|
// if (currlevel < CRYPTSTART)
|
|
DRLG_L5TransFix();
|
|
|
|
// Fix dirt transparency floor corners
|
|
// if (currlevel < CRYPTSTART)
|
|
DRLG_L5DirtFix();
|
|
|
|
// if (currlevel < CRYPTSTART)
|
|
DRLG_L5CornerFix();
|
|
|
|
// Put in doors
|
|
// if (currlevel < CRYPTSTART) JKE Turn off crypt doors
|
|
for (j = 0; j < MDMAXY; j++) {
|
|
for (i = 0; i < MDMAXX; i++)
|
|
if ((dflags[i][j] & SETP_MASK) != NODOOR) DRLG_PlaceDoor(i, j);
|
|
}
|
|
|
|
// Random subs
|
|
if (currlevel < CRYPTSTART) // These are to turn off stuff in the crypt JKE
|
|
{
|
|
// Keep Cathedral levels on the L1-safe substitution table. The broken
|
|
// wall, grate, statue, and rubble minisets below belong to the Crypt art.
|
|
DRLG_L5Subs();
|
|
}
|
|
else
|
|
{
|
|
|
|
Statues(L1STATUE);
|
|
|
|
DRLG_L5PlaceRndSet(ARCHLEFT, 95);
|
|
DRLG_L5PlaceRndSet(ARCHRIGHT, 95);
|
|
DRLG_L5PlaceRndSet(GRATELEFT, 100);
|
|
DRLG_L5PlaceRndSet(GRATERIGHT, 100);
|
|
DRLG_L5PlaceRndSet(BIGFLOOR, 60);
|
|
|
|
DRLG_L5Shadows();
|
|
|
|
switch (currlevel)
|
|
{
|
|
case CRYPTSTART:
|
|
BrokenWall1(L1BWALL1);
|
|
BrokenWall2(L1BWALL2);
|
|
BrokenWall3(L1BWALL3);
|
|
DRLG_L5Shadows();
|
|
NormalGrate(L1NGRATE);
|
|
BrokenGrate(L1BGRATE);
|
|
FloorRubble(L1RFLOOR);
|
|
break;
|
|
case CRYPTSTART + 1:
|
|
NormalGrate(L2NGRATE);
|
|
BrokenGrate(L2BGRATE);
|
|
FloorRubble(L2RFLOOR);
|
|
BrokenWall1(L2BWALL1);
|
|
BrokenWall2(L2BWALL2);
|
|
BrokenWall3(L2BWALL3);
|
|
DRLG_L5Shadows();
|
|
break;
|
|
case CRYPTSTART + 2:
|
|
NormalGrate(L3NGRATE);
|
|
BrokenGrate(L3BGRATE);
|
|
FloorRubble(L3RFLOOR);
|
|
BrokenWall1(L3BWALL1);
|
|
BrokenWall2(L3BWALL2);
|
|
BrokenWall3(L3BWALL3);
|
|
DRLG_L5Shadows();
|
|
break;
|
|
default:
|
|
NormalGrate(L4NGRATE);
|
|
BrokenGrate(L4BGRATE);
|
|
FloorRubble(L4RFLOOR);
|
|
BrokenWall1(L4BWALL1);
|
|
BrokenWall2(L4BWALL2);
|
|
BrokenWall3(L4BWALL3);
|
|
DRLG_L5Shadows();
|
|
break;
|
|
}
|
|
|
|
}
|
|
|
|
|
|
// Create shadows
|
|
if (currlevel < CRYPTSTART)
|
|
DRLG_L1Shadows();
|
|
// else
|
|
// DRLG_L5Shadows();
|
|
|
|
// Create mini set pieces
|
|
if (currlevel < CRYPTSTART) {
|
|
L5PlaceLevel1Lamps();
|
|
DRLG_PlaceMiniSet(LAMPS, L5Profile.lampMin, L5Profile.lampMax, 0, 0, 0, -1, LVL_NODIR);
|
|
}
|
|
|
|
// Floor subs
|
|
if (currlevel < CRYPTSTART)
|
|
DRLG_L1Floor();
|
|
|
|
// if (currlevel >= CRYPTSTART) // Place all our specifics here JKE
|
|
// {
|
|
// DRLG_L5Doors();
|
|
// }
|
|
|
|
|
|
for (j = 0; j < MDMAXY; j++) {
|
|
for (i = 0; i < MDMAXX; i++) pdungeon[i][j] = dungeon[i][j];
|
|
}
|
|
|
|
DRLG_Init_Globals();
|
|
// Check for any mini quest pieces
|
|
DRLG_CheckQuests(setpc_x, setpc_y);
|
|
|
|
}
|
|
|
|
/*-----------------------------------------------------------------------**
|
|
**-----------------------------------------------------------------------*/
|
|
/*
|
|
byte L5TileType(int t)
|
|
{
|
|
return(BTYPES[t]);
|
|
}
|
|
*/
|
|
|
|
/*------------------------------------------------------------------------*
|
|
**------------------------------------------------------------------------*/
|
|
void CreateL5Dungeon(unsigned int rseed, int entry)
|
|
{
|
|
int x, y;
|
|
|
|
SetRndSeed(rseed);
|
|
|
|
dminx = DIRTEDGED2;
|
|
dminy = DIRTEDGED2;
|
|
dmaxx = DMAXX - (DIRTEDGED2);
|
|
dmaxy = DMAXY - (DIRTEDGED2);
|
|
|
|
Na_Krul.x = 0;
|
|
Na_Krul.y = 0;
|
|
Na_Krul.Books = FALSE;
|
|
Na_Krul.Open = FALSE;
|
|
Na_Krul.LeverX = 0;
|
|
Na_Krul.LeverY = 0;
|
|
Na_Krul.Lever_Thrown = FALSE;
|
|
Na_Krul.MIndex = 0;
|
|
|
|
DRLG_InitTrans();
|
|
DRLG_InitSetPC();
|
|
DRLG_LoadL1SP();
|
|
DRLG_L5(entry);
|
|
DRLG_L1Pass3();
|
|
DRLG_FreeL1SP();
|
|
if (currlevel < HIVESTART) // JKE NO TOPS!!!!!
|
|
DRLG_InitL1Vals();
|
|
else
|
|
DRLG_L5Doors();
|
|
DRLG_SetPC();
|
|
|
|
for (y = dminy; y < dmaxy; ++y)
|
|
{
|
|
for (x = dminx; x < dmaxx; ++x)
|
|
{
|
|
if (dPiece[x][y] == 290)
|
|
{
|
|
Na_Krul.x = x;
|
|
Na_Krul.y = y;
|
|
}
|
|
if (dPiece[x][y] == 317)
|
|
{
|
|
CornerStone.x = x;
|
|
CornerStone.y = y;
|
|
}
|
|
}
|
|
}
|
|
}
|