mirror of
https://github.com/jmarshall23/Hellfire.git
synced 2026-08-11 23:40:51 +02:00
Lots of feature upgrades.
This commit is contained in:
+202
-2
@@ -410,6 +410,207 @@ BOOL CheckThemeRoom(int tv)
|
||||
return(TRUE);
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------**
|
||||
**-----------------------------------------------------------------------*/
|
||||
static int ThemeRoomExitCount(int tv)
|
||||
{
|
||||
int i, j;
|
||||
int exits;
|
||||
|
||||
exits = 0;
|
||||
for (j = 1; j < DMAXY - 1; j++) {
|
||||
for (i = 1; i < DMAXX - 1; i++) {
|
||||
if ((dTransVal[i][j] == tv) && (!nSolidTable[dPiece[i][j]])) {
|
||||
if ((dTransVal[i - 1][j] != tv) && (!nSolidTable[dPiece[i - 1][j]])) exits++;
|
||||
if ((dTransVal[i + 1][j] != tv) && (!nSolidTable[dPiece[i + 1][j]])) exits++;
|
||||
if ((dTransVal[i][j - 1] != tv) && (!nSolidTable[dPiece[i][j - 1]])) exits++;
|
||||
if ((dTransVal[i][j + 1] != tv) && (!nSolidTable[dPiece[i][j + 1]])) exits++;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return exits;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------**
|
||||
**-----------------------------------------------------------------------*/
|
||||
static BOOL IsDeadEndThemeRoom(int tv)
|
||||
{
|
||||
return ThemeRoomExitCount(tv) <= 6;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------**
|
||||
**-----------------------------------------------------------------------*/
|
||||
static int ThemeRoomArea(int tv)
|
||||
{
|
||||
int i, j;
|
||||
int area;
|
||||
|
||||
area = 0;
|
||||
for (j = 0; j < DMAXY; j++) {
|
||||
for (i = 0; i < DMAXX; i++) {
|
||||
if ((dTransVal[i][j] == tv) && (!nSolidTable[dPiece[i][j]]))
|
||||
area++;
|
||||
}
|
||||
}
|
||||
|
||||
return area;
|
||||
}
|
||||
|
||||
#define CATROOM_DEADEND 0x01
|
||||
#define CATROOM_SMALL 0x02
|
||||
#define CATROOM_LARGE 0x04
|
||||
|
||||
typedef struct {
|
||||
int minLevel;
|
||||
int maxLevel;
|
||||
int roomFlags;
|
||||
const int *themeList;
|
||||
int themeListLen;
|
||||
} CathedralRoomPick;
|
||||
|
||||
/*-----------------------------------------------------------------------**
|
||||
**-----------------------------------------------------------------------*/
|
||||
static BOOL CathedralRoomShapeFits(int tv, int roomFlags)
|
||||
{
|
||||
int area;
|
||||
|
||||
if ((roomFlags & CATROOM_DEADEND) && !IsDeadEndThemeRoom(tv))
|
||||
return FALSE;
|
||||
|
||||
area = ThemeRoomArea(tv);
|
||||
if ((roomFlags & CATROOM_SMALL) && area > 36)
|
||||
return FALSE;
|
||||
if ((roomFlags & CATROOM_LARGE) && area < 49)
|
||||
return FALSE;
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------**
|
||||
**-----------------------------------------------------------------------*/
|
||||
static BOOL PickThemeFromList(int i, const int *themeList, int themeListLen, int *themeType)
|
||||
{
|
||||
int start, n, t;
|
||||
|
||||
if (themeListLen <= 0) return FALSE;
|
||||
|
||||
start = random(0, themeListLen);
|
||||
for (n = 0; n < themeListLen; n++) {
|
||||
t = themeList[(start + n) % themeListLen];
|
||||
if (SpecialThemeFit(i, t)) {
|
||||
*themeType = t;
|
||||
return TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------**
|
||||
**-----------------------------------------------------------------------*/
|
||||
static BOOL PickCathedralArchetypeTheme(int i, int depth, int *themeType)
|
||||
{
|
||||
static const int candlelitEntryChapel[] = {
|
||||
THEME_SHRINE,
|
||||
THEME_LIBRARY,
|
||||
};
|
||||
static const int collapsedPrayerNook[] = {
|
||||
THEME_BARREL,
|
||||
THEME_SHRINE,
|
||||
THEME_SKELRM,
|
||||
};
|
||||
static const int skeletonAmbushCryptlet[] = {
|
||||
THEME_SKELRM,
|
||||
THEME_MONSTPIT,
|
||||
};
|
||||
static const int desecratedShrineRoom[] = {
|
||||
THEME_GOATSHRINE,
|
||||
THEME_BLOODFTN,
|
||||
THEME_MURKYFTN,
|
||||
};
|
||||
static const int abandonedStudy[] = {
|
||||
THEME_LIBRARY,
|
||||
THEME_SHRINE,
|
||||
};
|
||||
static const int guardedSupplyRoom[] = {
|
||||
THEME_BARREL,
|
||||
THEME_TREASURE,
|
||||
THEME_MONSTPIT,
|
||||
};
|
||||
static const int processionHall[] = {
|
||||
THEME_SHRINE,
|
||||
THEME_LIBRARY,
|
||||
THEME_BARREL,
|
||||
};
|
||||
static const int sealedTreasureCloset[] = {
|
||||
THEME_TREASURE,
|
||||
};
|
||||
static const int bloodTrailRoom[] = {
|
||||
THEME_BLOODFTN,
|
||||
THEME_DECAP,
|
||||
THEME_TORTURE,
|
||||
};
|
||||
static const int falseSanctuary[] = {
|
||||
THEME_SHRINE,
|
||||
THEME_GOATSHRINE,
|
||||
THEME_MONSTPIT,
|
||||
};
|
||||
|
||||
static const CathedralRoomPick rooms[] = {
|
||||
{ 1, 2, CATROOM_LARGE, candlelitEntryChapel, sizeof(candlelitEntryChapel) / sizeof(candlelitEntryChapel[0]) },
|
||||
{ 1, 3, CATROOM_DEADEND | CATROOM_SMALL, collapsedPrayerNook, sizeof(collapsedPrayerNook) / sizeof(collapsedPrayerNook[0]) },
|
||||
{ 1, 4, 0, skeletonAmbushCryptlet, sizeof(skeletonAmbushCryptlet) / sizeof(skeletonAmbushCryptlet[0]) },
|
||||
{ 2, 4, CATROOM_LARGE, desecratedShrineRoom, sizeof(desecratedShrineRoom) / sizeof(desecratedShrineRoom[0]) },
|
||||
{ 1, 3, 0, abandonedStudy, sizeof(abandonedStudy) / sizeof(abandonedStudy[0]) },
|
||||
{ 1, 2, CATROOM_DEADEND | CATROOM_SMALL, guardedSupplyRoom, sizeof(guardedSupplyRoom) / sizeof(guardedSupplyRoom[0]) },
|
||||
{ 1, 4, CATROOM_LARGE, processionHall, sizeof(processionHall) / sizeof(processionHall[0]) },
|
||||
{ 1, 4, CATROOM_DEADEND | CATROOM_SMALL, sealedTreasureCloset, sizeof(sealedTreasureCloset) / sizeof(sealedTreasureCloset[0]) },
|
||||
{ 3, 4, 0, bloodTrailRoom, sizeof(bloodTrailRoom) / sizeof(bloodTrailRoom[0]) },
|
||||
{ 2, 4, 0, falseSanctuary, sizeof(falseSanctuary) / sizeof(falseSanctuary[0]) },
|
||||
};
|
||||
int start, n, roomCount;
|
||||
const CathedralRoomPick *room;
|
||||
|
||||
roomCount = sizeof(rooms) / sizeof(rooms[0]);
|
||||
start = random(0, roomCount);
|
||||
|
||||
for (n = 0; n < roomCount; n++) {
|
||||
room = &rooms[(start + n) % roomCount];
|
||||
if (depth < room->minLevel || depth > room->maxLevel)
|
||||
continue;
|
||||
if (!CathedralRoomShapeFits(theme[i].ttval, room->roomFlags))
|
||||
continue;
|
||||
if (PickThemeFromList(i, room->themeList, room->themeListLen, themeType))
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------**
|
||||
**-----------------------------------------------------------------------*/
|
||||
static int PickL1Theme(int i)
|
||||
{
|
||||
int depth;
|
||||
int tries;
|
||||
int t;
|
||||
|
||||
depth = currlevel;
|
||||
if (depth < 1) depth = 1;
|
||||
if (depth > 4) depth = 4;
|
||||
|
||||
if (PickCathedralArchetypeTheme(i, depth, &t))
|
||||
return t;
|
||||
|
||||
for (tries = 0; tries < 64; tries++) {
|
||||
t = random(0, TOTAL_THEMES);
|
||||
if (SpecialThemeFit(i, t)) return t;
|
||||
}
|
||||
|
||||
return THEME_BARREL;
|
||||
}
|
||||
|
||||
/*-----------------------------------------------------------------------**
|
||||
**-----------------------------------------------------------------------*/
|
||||
|
||||
@@ -438,8 +639,7 @@ void InitThemes()
|
||||
for (i = 0; (i < 256) && (numthemes < MAXTHEMES); i++) {
|
||||
if (CheckThemeRoom(i)) {
|
||||
theme[numthemes].ttval = i;
|
||||
t = ThemeGood[random(0, THEME_NUMGOOD)]; // Normal
|
||||
while (!SpecialThemeFit(numthemes, t)) t = random(0, TOTAL_THEMES);
|
||||
t = PickL1Theme(numthemes);
|
||||
theme[numthemes].ttype = t;
|
||||
numthemes++;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user