Lots of feature upgrades.

This commit is contained in:
Justin Marshall
2026-05-30 02:50:21 -07:00
parent 7806bb8ef8
commit ea74cd9921
13 changed files with 2433 additions and 153 deletions
+202 -2
View File
@@ -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++;
}