2026/01/14 Late update

Updated PEPS.
Tweaked geomorph code to prevent broken transitions.
East/west & north/south are now randomized & tacked separately.
Dungeon will reset areas when empty & no more options are available.
Fixed issue with spell effect NUI.
Full compile.
This commit is contained in:
Jaysyn904
2026-01-14 23:49:30 -05:00
parent 7598075698
commit 7207aba580
26 changed files with 540 additions and 111 deletions

View File

@@ -1,97 +1,151 @@
void main()
{
object oPC = GetEnteringObject();
if (GetIsPC(oPC) != TRUE) return;
//:: Get own ID number
string sSelf = GetTag(OBJECT_SELF);
int iLength = GetStringLength(sSelf);
string sID;
int iChosen = 0;
switch (iLength)
{
case 6:
sID = GetStringRight(sSelf,1);
break;
case 7:
sID = GetStringRight(sSelf,2);
break;
case 8:
sID = GetStringRight(sSelf,3);
break;
}
//SendMessageToPC(oPC,"my area ID is "+sID);
int iMatch = GetLocalInt(OBJECT_SELF,"match"); //:: Current door's match
string sEntryDir = GetStringLeft(GetTag(OBJECT_SELF),1); //:: Current door's direction
string sExitDir;
//:: This inverts the directions
if (sEntryDir == "n")
sExitDir="s";
else if (sEntryDir == "s")
sExitDir="n";
else if (sEntryDir == "w")
sExitDir="e";
else if (sEntryDir == "e")
sExitDir="w";
//SendMessageToPC(oPC,"i should be on the "+sExitDir+" side of the map");
//:: Now determine if there is already a match
if (iMatch != 0) //:: Door already has a match, teleport PC
{
//SendMessageToPC(oPC,"door has a match");
string sTag = "area4_"+IntToString(iMatch);
object oArea = GetObjectByTag(sTag);
object oTarget = GetObjectByTag("wp4_"+IntToString(iMatch)+sExitDir);
location lTarget = GetLocation(oTarget);
float fFace = GetFacing(oPC);
AssignCommand(oPC,ActionJumpToLocation(lTarget));
AssignCommand(oPC,SetFacing(fFace));
iChosen = 1;
return;
}
int iRand = Random(41)+1; //:: Random # for area selection
string sTag = "area4_"+IntToString(iRand);
object oArea = GetObjectByTag(sTag);
int iUsed = GetLocalInt(oArea,"ispop");
float fFace = GetFacing(oPC);
while (iChosen == 0)//selecting new areas
{
iRand = Random(41)+1;
sTag = "area4_"+IntToString(iRand);
oArea = GetObjectByTag(sTag);
iUsed = GetLocalInt(oArea,"ispop");
if (iUsed == 0)
{
// SendMessageToPC(oPC,"unused area chosen");
object oTarget = GetObjectByTag("wp4_"+IntToString(iRand)+sExitDir);
location lTarget = GetLocation(oTarget);
AssignCommand(oPC,ActionJumpToLocation(lTarget));
AssignCommand(oPC,SetFacing(fFace));
SetLocalInt(oArea,"ispop",1);
object oDoor = GetObjectByTag(sExitDir+"door"+IntToString(iRand));
SetLocalInt(OBJECT_SELF,"match",iRand);
SetLocalInt(oDoor,"match",StringToInt(sID));
iChosen = 1;
break;
}
//choose new area and try again until successful or TMI error
}
void main()
{
//object oPC = GetEnteringObject();
object oPC = GetClickingObject();
if (GetIsPC(oPC) != TRUE) return;
//:: Get own ID number
string sSelf = GetTag(OBJECT_SELF);
int iLength = GetStringLength(sSelf);
string sID;
int iChosen = 0;
switch (iLength)
{
case 6:
sID = GetStringRight(sSelf,1);
break;
case 7:
sID = GetStringRight(sSelf,2);
break;
case 8:
sID = GetStringRight(sSelf,3);
break;
default:
SendMessageToPC(oPC, "Valid door tag not found.");
sID = ""; // Initialize to empty string for unexpected lengths
break;
}
//SendMessageToPC(oPC,"my area ID is "+sID);
int iMatch = GetLocalInt(OBJECT_SELF,"match"); //:: Current door's match
string sEntryDir = GetStringLeft(GetTag(OBJECT_SELF),1); //:: Current door's direction
string sExitDir;
//:: This inverts the directions
if (sEntryDir == "n")
sExitDir="s";
else if (sEntryDir == "s")
sExitDir="n";
else if (sEntryDir == "w")
sExitDir="e";
else if (sEntryDir == "e")
sExitDir="w";
//SendMessageToPC(oPC,"i should be on the "+sExitDir+" side of the map");
//:: Now determine if there is already a match
if (iMatch != 0) //:: Door already has a match, teleport PC
{
//SendMessageToPC(oPC,"door has a match");
string sTag = "area4_"+IntToString(iMatch);
object oArea = GetObjectByTag(sTag);
object oTarget = GetObjectByTag("wp4_"+IntToString(iMatch)+sExitDir);
location lTarget = GetLocation(oTarget);
float fFace = GetFacing(oPC);
AssignCommand(oPC,ActionJumpToLocation(lTarget));
AssignCommand(oPC,SetFacing(fFace));
iChosen = 1;
return;
}
int iRand = Random(41)+1; //:: Random # for area selection
string sTag = "area4_"+IntToString(iRand);
object oArea = GetObjectByTag(sTag);
int iUsed = GetLocalInt(oArea,"ispop_"+sExitDir);
float fFace = GetFacing(oPC);
int iRetryCount = 0;
// Extract current area ID before the while loop
string sCurrentAreaTag = GetTag(GetArea(OBJECT_SELF));
int iCurrentAreaID = StringToInt(GetStringRight(sCurrentAreaTag, GetStringLength(sCurrentAreaTag) - 6));
while (iChosen == 0)//selecting new areas
{
iRand = Random(41)+1;
// Skip if this is the current area
if (iRand == iCurrentAreaID) continue;
sTag = "area4_"+IntToString(iRand);
oArea = GetObjectByTag(sTag);
iUsed = GetLocalInt(oArea,"ispop_"+sExitDir);
if (iUsed == 0)
{
// SendMessageToPC(oPC,"unused area chosen");
object oTarget = GetObjectByTag("wp4_"+IntToString(iRand)+sExitDir);
location lTarget = GetLocation(oTarget);
AssignCommand(oPC,ActionJumpToLocation(lTarget));
AssignCommand(oPC,SetFacing(fFace));
SetLocalInt(oArea,"ispop_"+sExitDir,1);
object oDoor = GetObjectByTag(sExitDir+"door"+IntToString(iRand));
SetLocalInt(OBJECT_SELF,"match",iRand);
SetLocalInt(oDoor,"match",StringToInt(sID));
iChosen = 1;
break;
}
// Fallback: reset empty areas if we've tried too many times
iRetryCount++;
if (iRetryCount > 50)
{
int iResetCount = 0;
// Check each area before resetting
int i;
for (i = 1; i <= 41; i++) {
object oCheckArea = GetObjectByTag("area4_"+IntToString(i));
if (GetIsObjectValid(oCheckArea)) {
// Check if all four directions are used
int bNorthUsed = GetLocalInt(oCheckArea, "ispop_n");
int bSouthUsed = GetLocalInt(oCheckArea, "ispop_s");
int bEastUsed = GetLocalInt(oCheckArea, "ispop_e");
int bWestUsed = GetLocalInt(oCheckArea, "ispop_w");
// Only reset if all directions are used AND no players present
if (bNorthUsed && bSouthUsed && bEastUsed && bWestUsed) {
// Check if area has players (using same logic as area_onexit.nss)
object oCheck = GetFirstObjectInArea(oCheckArea);
int bHasPlayers = FALSE;
while (oCheck != OBJECT_INVALID) {
if (GetIsPC(oCheck)) {
bHasPlayers = TRUE;
break;
}
oCheck = GetNextObjectInArea(oCheckArea);
}
// Only reset if no players present
if (!bHasPlayers) {
// Reset all four direction flags
SetLocalInt(oCheckArea, "ispop_n", 0);
SetLocalInt(oCheckArea, "ispop_s", 0);
SetLocalInt(oCheckArea, "ispop_e", 0);
SetLocalInt(oCheckArea, "ispop_w", 0);
iResetCount++;
}
}
}
}
WriteTimestampedLogEntry("door_click: Reset " + IntToString(iResetCount) + " fully exhausted areas");
iRetryCount = 0;
}
}
}