Added provisional LOT priority

This commit is contained in:
Nils 2021-09-03 11:28:44 +02:00
parent 0af567b7fd
commit e527acc3cf
5 changed files with 134 additions and 10 deletions

View file

@ -22,7 +22,15 @@
#define BIFF_AVOID_TURN 1536
#define FEELER_DISTANCE 512
#define FEELER_ANGLE ANGLE(45.0f)
#ifdef CREATURE_AI_PRIORITY_OPTIMIZATION
constexpr int HIGH_PRIO = 8;
constexpr int MEDIUM_PRIO = HIGH_PRIO + HIGH_PRIO * (HIGH_PRIO / 6.0f);
constexpr int LOW_PRIO = MEDIUM_PRIO + MEDIUM_PRIO * (MEDIUM_PRIO / 24.0f);
constexpr int NONE_PRIO = LOW_PRIO + LOW_PRIO * (LOW_PRIO / 32.0f);
constexpr auto FRAME_PRIO_BASE = 4;
constexpr auto FRAME_PRIO_EXP = 1.5;
#endif // CREATURE_AI_PRIORITY_OPTIMIZATION
void DropBaddyPickups(ITEM_INFO* item)
{
ITEM_INFO* pickup = NULL;
@ -1071,7 +1079,23 @@ int SearchLOT(LOT_INFO* LOT, int depth)
return true;
}
int CreatureActive(short itemNumber)
#if CREATURE_AI_PRIORITY_OPTIMIZATION
CREATURE_AI_PRIORITY GetCreatureLOTPriority(ITEM_INFO* item) {
Vector3 itemPos = Vector3(item->pos.xPos, item->pos.yPos, item->pos.zPos);
Vector3 cameraPos = Vector3(Camera.pos.x, Camera.pos.y, Camera.pos.z);
float distance = Vector3::Distance(itemPos, cameraPos);
distance /= SECTOR(1);
if(distance <= HIGH_PRIO)
return CREATURE_AI_PRIORITY::HIGH;
if(distance <= MEDIUM_PRIO)
return CREATURE_AI_PRIORITY::MEDIUM;
if(distance <= LOW_PRIO)
return CREATURE_AI_PRIORITY::LOW;
return CREATURE_AI_PRIORITY::NONE;
}
#endif
int CreatureActive(short itemNumber)
{
ITEM_INFO* item = &g_Level.Items[itemNumber];
@ -1088,6 +1112,10 @@ int CreatureActive(short itemNumber)
}
item->status = ITEM_ACTIVE;
}
#ifdef CREATURE_AI_PRIORITY_OPTIMIZATION
CREATURE_INFO* creature = (CREATURE_INFO*)item->data;
creature->priority = GetCreatureLOTPriority(item);
#endif // CREATURE_AI_PRIORITY_OPTIMIZATION
return true;
}
@ -1611,8 +1639,37 @@ void CreatureMood(ITEM_INFO* item, AI_INFO* info, int violent)
if (LOT->targetBox == NO_BOX)
TargetBox(LOT, item->boxNumber);
#ifdef CREATURE_AI_PRIORITY_OPTIMIZATION
bool shouldUpdateTarget = false;
switch(creature->priority) {
case CREATURE_AI_PRIORITY::HIGH:
shouldUpdateTarget = true;
break;
case CREATURE_AI_PRIORITY::MEDIUM:
{
if(creature->framesSinceLOTUpdate > std::pow(FRAME_PRIO_BASE, FRAME_PRIO_EXP))
shouldUpdateTarget = true;
}
break;
case CREATURE_AI_PRIORITY::LOW:
{
if(creature->framesSinceLOTUpdate > std::pow(FRAME_PRIO_BASE,FRAME_PRIO_EXP*2))
shouldUpdateTarget = true;
}
break;
default:
break;
}
if(shouldUpdateTarget) {
CalculateTarget(&creature->target, item, &creature->LOT);
creature->framesSinceLOTUpdate = 0;
} else {
creature->framesSinceLOTUpdate++;
}
#else
CalculateTarget(&creature->target, item, &creature->LOT);
#endif // CREATURE_AI_PRIORITY_OPTIMIZATION
creature->jumpAhead = false;
creature->monkeyAhead = false;

View file

@ -64,6 +64,14 @@ struct CREATURE_TARGET {
short roomNumber;
};
enum class CREATURE_AI_PRIORITY {
HIGH,
MEDIUM,
LOW,
NONE
};
struct CREATURE_INFO {
short jointRotation[4];
short maximumTurn;
@ -83,4 +91,8 @@ struct CREATURE_INFO {
short itemNum;
PHD_VECTOR target;
LOT_INFO LOT;
#ifdef CREATURE_AI_PRIORITY_OPTIMIZATION
CREATURE_AI_PRIORITY priority;
size_t framesSinceLOTUpdate;
#endif
};

View file

@ -105,8 +105,9 @@ void DisableBaddieAI(short itemNumber)
if (creature)
{
creature->itemNum = NO_ITEM;
item->data = nullptr;
ActiveCreatures.erase(std::find(ActiveCreatures.begin(), ActiveCreatures.end(), creature));
item->data = nullptr;
}
}

View file

@ -64,7 +64,7 @@
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>TurnOffAllWarnings</WarningLevel>
<SDLCheck>true</SDLCheck>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;TR5MAIN_EXPORTS;_WINDOWS;_USRDLL;NOMINMAX;NEW_INV;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;TR5MAIN_EXPORTS;_WINDOWS;_USRDLL;NOMINMAX;NEW_INV;CREATURE_AI_PRIORITY_OPTIMIZATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>false</ConformanceMode>
<AdditionalIncludeDirectories>D:\Dokumente\TR5Main\TR5Main\Game\itemdata;$(SolutionDir)TR5Main\Game\itemdata;$(SolutionDir)TR5Main;$(SolutionDir)TR5Main\Game;$(SolutionDir)TR5Main\Game\Lara;$(SolutionDir)TR5Main\Objects;$(SolutionDir)TR5Main\Objects\Utils;$(SolutionDir)TR5Main\Objects\Effects;$(SolutionDir)TR5Main\Objects\Generic;$(SolutionDir)TR5Main\Objects\Generic\Switches;$(SolutionDir)TR5Main\Objects\Generic\Object;$(SolutionDir)TR5Main\Objects\TR1;$(SolutionDir)TR5Main\Objects\TR1\Entity;$(SolutionDir)TR5Main\Objects\TR1\Trap;$(SolutionDir)TR5Main\Objects\TR2;$(SolutionDir)TR5Main\Objects\TR2\Entity;$(SolutionDir)TR5Main\Objects\TR2\Trap;$(SolutionDir)TR5Main\Objects\TR2\Vehicles;$(SolutionDir)TR5Main\Objects\TR3;$(SolutionDir)TR5Main\Objects\TR3\Entity;$(SolutionDir)TR5Main\Objects\TR3\Trap;$(SolutionDir)TR5Main\Objects\TR3\Vehicles;$(SolutionDir)TR5Main\Objects\TR4;$(SolutionDir)TR5Main\Objects\TR4\Entity;$(SolutionDir)TR5Main\Objects\TR4\Trap;$(SolutionDir)TR5Main\Objects\TR4\Object;$(SolutionDir)TR5Main\Objects\TR4\Floor;$(SolutionDir)TR5Main\Objects\TR4\Switch;$(SolutionDir)TR5Main\Objects\TR4\Vehicles;$(SolutionDir)TR5Main\Objects\TR5;$(SolutionDir)TR5Main\Objects\TR5\Entity;$(SolutionDir)TR5Main\Objects\TR5\Trap;$(SolutionDir)TR5Main\Objects\TR5\Light;$(SolutionDir)TR5Main\Objects\TR5\Emitter;$(SolutionDir)TR5Main\Objects\TR5\Shatter;$(SolutionDir)TR5Main\Objects\TR5\Switch;$(SolutionDir)TR5Main\Objects\TR5\Object;$(SolutionDir)TR5Main\Objects\Vehicles;$(SolutionDir)TR5Main\Renderer;$(SolutionDir)TR5Main\Scripting;$(SolutionDir)TR5Main\Specific;$(SolutionDir)TR5Main\Specific\IO;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreadedDebugDLL</RuntimeLibrary>
@ -95,7 +95,7 @@ xcopy /Y "$(ProjectDir)Shaders\HUD\*.hlsl" "$(TargetDir)\Shaders\HUD\"</Command>
<PrecompiledHeader>Use</PrecompiledHeader>
<WarningLevel>TurnOffAllWarnings</WarningLevel>
<SDLCheck>false</SDLCheck>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;TR5MAIN_EXPORTS;_WINDOWS;_USRDLL;NOMINMAX;NEW_INV;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<PreprocessorDefinitions>_CRT_SECURE_NO_WARNINGS;WIN32;TR5MAIN_EXPORTS;_WINDOWS;_USRDLL;NOMINMAX;NEW_INV;CREATURE_AI_PRIORITY_OPTIMIZATION;%(PreprocessorDefinitions)</PreprocessorDefinitions>
<ConformanceMode>false</ConformanceMode>
<AdditionalIncludeDirectories>$(SolutionDir)TR5Main;$(SolutionDir)TR5Main\Game;$(SolutionDir)TR5Main\Game\Lara;$(SolutionDir)TR5Main\Objects;$(SolutionDir)TR5Main\Objects\Utils;$(SolutionDir)TR5Main\Objects\Effects;$(SolutionDir)TR5Main\Objects\Generic;$(SolutionDir)TR5Main\Objects\Generic\Switches;$(SolutionDir)TR5Main\Objects\Generic\Object;$(SolutionDir)TR5Main\Objects\TR1;$(SolutionDir)TR5Main\Objects\TR1\Entity;$(SolutionDir)TR5Main\Objects\TR1\Trap;$(SolutionDir)TR5Main\Objects\TR2;$(SolutionDir)TR5Main\Objects\TR2\Entity;$(SolutionDir)TR5Main\Objects\TR2\Trap;$(SolutionDir)TR5Main\Objects\TR2\Vehicles;$(SolutionDir)TR5Main\Objects\TR3;$(SolutionDir)TR5Main\Objects\TR3\Entity;$(SolutionDir)TR5Main\Objects\TR3\Trap;$(SolutionDir)TR5Main\Objects\TR3\Vehicles;$(SolutionDir)TR5Main\Objects\TR4;$(SolutionDir)TR5Main\Objects\TR4\Entity;$(SolutionDir)TR5Main\Objects\TR4\Trap;$(SolutionDir)TR5Main\Objects\TR4\Object;$(SolutionDir)TR5Main\Objects\TR4\Floor;$(SolutionDir)TR5Main\Objects\TR4\Switch;$(SolutionDir)TR5Main\Objects\TR4\Vehicles;$(SolutionDir)TR5Main\Objects\TR5;$(SolutionDir)TR5Main\Objects\TR5\Entity;$(SolutionDir)TR5Main\Objects\TR5\Trap;$(SolutionDir)TR5Main\Objects\TR5\Light;$(SolutionDir)TR5Main\Objects\TR5\Emitter;$(SolutionDir)TR5Main\Objects\TR5\Shatter;$(SolutionDir)TR5Main\Objects\TR5\Switch;$(SolutionDir)TR5Main\Objects\TR5\Object;$(SolutionDir)TR5Main\Objects\Vehicles;$(SolutionDir)TR5Main\Renderer;$(SolutionDir)TR5Main\Scripting;$(SolutionDir)TR5Main\Specific;$(SolutionDir)TR5Main\Specific\IO;%(AdditionalIncludeDirectories)</AdditionalIncludeDirectories>
<RuntimeLibrary>MultiThreadedDLL</RuntimeLibrary>

View file

@ -780,9 +780,6 @@
<ClInclude Include="Game\memory\qmalloc.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Game\memory\malloc.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Game\memory\MemoryPoolAllocator.h">
<Filter>File di intestazione</Filter>
</ClInclude>
@ -1086,6 +1083,63 @@
<ClInclude Include="Game\control\trigger.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Game\door_data.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Game\item.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Game\roomvector.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Objects\TR2\Vehicles\boat_info.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Game\creature_info.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Game\itemdata\itemdata.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Game\Lara\lara_info.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Objects\TR2\Vehicles\skidoo_info.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Objects\TR3\Vehicles\biggun_info.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Objects\TR3\Vehicles\kayak_info.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Objects\TR3\Vehicles\minecart_info.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Objects\TR3\Vehicles\quad_info.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Objects\TR3\Vehicles\rubberboat_info.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Objects\TR3\Vehicles\upv_info.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Objects\TR4\Entity\tr4_wraith_info.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Objects\TR4\Vehicles\jeep_info.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Objects\TR4\Vehicles\motorbike_info.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Objects\TR5\Entity\tr5_laserhead_info.h">
<Filter>File di intestazione</Filter>
</ClInclude>
<ClInclude Include="Objects\TR5\Object\tr5_pushableblock_info.h">
<Filter>File di intestazione</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<ClCompile Include="Game\box.cpp">
@ -1736,9 +1790,6 @@
<ClCompile Include="Renderer\RenderView\RenderView.cpp">
<Filter>File di origine</Filter>
</ClCompile>
<ClCompile Include="Game\memory\malloc.cpp">
<Filter>File di origine</Filter>
</ClCompile>
<ClCompile Include="Game\Lara\lara.cpp">
<Filter>File di origine</Filter>
</ClCompile>
@ -1997,6 +2048,9 @@
<ClCompile Include="Game\control\trigger.cpp">
<Filter>File di origine</Filter>
</ClCompile>
<ClCompile Include="Game\itemdata\itemdata.cpp">
<Filter>File di origine</Filter>
</ClCompile>
</ItemGroup>
<ItemGroup>
<None Include="packages.config" />