Add zone priority option to zones.csv

This commit is contained in:
fed 2023-03-08 09:38:35 +01:00
parent a913dac149
commit 758b2d2006
3 changed files with 82 additions and 8 deletions

View File

@ -128,13 +128,14 @@ namespace fastfiles
return true;
}
void add_mod_zones(std::vector<game::XZoneInfo>& zones, utils::memory::allocator& allocator)
void add_mod_zones(std::vector<game::XZoneInfo>& zones, utils::memory::allocator& allocator,
const mods::zone_priority priority)
{
try_add_zone(zones, allocator, "mod", true);
const auto mod_zones = mods::get_mod_zones();
for (const auto& zone : mod_zones)
{
if (zone.alloc_flags & game::DB_ZONE_COMMON)
if ((zone.alloc_flags & game::DB_ZONE_COMMON) && zone.priority == priority)
{
try_add_zone(zones, allocator, zone.name, true);
}
@ -158,6 +159,7 @@ namespace fastfiles
utils::memory::allocator allocator;
std::vector<game::XZoneInfo> zones;
try_add_zone(zones, allocator, "h2_mod_pre_gfx", true);
add_mod_zones(zones, allocator, mods::zone_priority::pre_gfx);
push_zones(zones, zone_info, zone_count);
game::DB_LoadXAssets(zones.data(), static_cast<int>(zones.size()), sync_mode);
@ -175,6 +177,8 @@ namespace fastfiles
std::vector<game::XZoneInfo> zones;
try_add_zone(zones, allocator, "h2_mod_common", true);
add_mod_zones(zones, allocator, mods::zone_priority::post_gfx);
for (auto i = 0u; i < zone_count; i++)
{
zones.push_back(zone_info[i]);
@ -185,7 +189,7 @@ namespace fastfiles
}
}
add_mod_zones(zones, allocator);
add_mod_zones(zones, allocator, mods::zone_priority::post_common);
game::DB_LoadXAssets(zones.data(), static_cast<int>(zones.size()), sync_mode);
}
@ -458,12 +462,12 @@ namespace fastfiles
add_custom_level_load_zone(load, name, size_est);
}
void add_mod_zones_to_load(game::LevelLoad* load)
void add_mod_zones_to_load(game::LevelLoad* load, const mods::zone_priority priority)
{
const auto mod_zones = mods::get_mod_zones();
for (const auto& zone : mod_zones)
{
if (zone.alloc_flags & game::DB_ZONE_GAME)
if ((zone.alloc_flags & game::DB_ZONE_GAME) && zone.priority == priority)
{
add_custom_level_load_zone(load, zone.name.data(), 0x40000);
}
@ -476,6 +480,7 @@ namespace fastfiles
a.pushad64();
a.mov(rcx, rbx);
a.mov(rdx, mods::zone_priority::pre_map);
a.call_aligned(add_mod_zones_to_load);
a.popad64();
@ -529,6 +534,8 @@ namespace fastfiles
{
add_custom_level_load_zone(load, name, size_est);
}
add_mod_zones_to_load(load, mods::zone_priority::post_map);
}
void db_load_xassets_stub(game::XZoneInfo* info, unsigned int zone_count, game::DBSyncMode sync_mode)

View File

@ -40,16 +40,53 @@ namespace mods
{"game", game::DB_ZONE_GAME},
};
std::unordered_map<std::string, zone_priority> priority_map =
{
{"none", zone_priority::none},
{"pre_gfx", zone_priority::post_gfx},
{"post_gfx", zone_priority::post_gfx},
{"post_common", zone_priority::post_common},
{"pre_map", zone_priority::pre_map},
{"post_map", zone_priority::post_map},
};
unsigned int get_alloc_flag(const std::string& name)
{
const auto lower = utils::string::to_lower(name);
if (alloc_flags_map.find(lower) != alloc_flags_map.end())
if (const auto iter = alloc_flags_map.find(lower); iter != alloc_flags_map.end())
{
return alloc_flags_map[lower];
return iter->second;
}
return game::DB_ZONE_COMMON;
}
zone_priority get_default_zone_priority(unsigned int alloc_flags)
{
if (alloc_flags & game::DB_ZONE_COMMON)
{
return zone_priority::post_common;
}
else if (alloc_flags & game::DB_ZONE_GAME)
{
return zone_priority::pre_map;
}
return zone_priority::none;
}
zone_priority get_zone_priority(const std::string& name, unsigned int alloc_flags)
{
const auto lower = utils::string::to_lower(name);
if (const auto iter = priority_map.find(lower); iter != priority_map.end())
{
return iter->second;
}
return get_default_zone_priority(alloc_flags);
}
utils::hook::detour db_release_xassets_hook;
bool release_assets = false;
@ -113,13 +150,28 @@ namespace mods
continue;
}
mod_zone zone{};
const auto alloc_flags = get_alloc_flag(values[0]) | game::DB_ZONE_CUSTOM;
if (alloc_flags & game::DB_ZONE_COMMON)
{
mod_info.zone_info.has_common_zones = true;
}
mod_info.zone_info.zones.emplace_back(values[1], alloc_flags);
zone.alloc_flags = alloc_flags;
if (values.size() <= 2)
{
zone.name = values[1];
zone.priority = get_default_zone_priority(zone.alloc_flags);
mod_info.zone_info.zones.emplace_back(zone);
}
else
{
zone.name = values[2];
zone.priority = get_zone_priority(values[1], zone.alloc_flags);
mod_info.zone_info.zones.emplace_back(zone);
}
}
}

View File

@ -2,10 +2,25 @@
namespace mods
{
enum zone_priority
{
none,
// common
pre_gfx,
post_gfx,
post_common,
// game
pre_map,
post_map,
};
struct mod_zone
{
std::string name;
unsigned int alloc_flags;
zone_priority priority;
};
bool mod_requires_restart(const std::string& path);