Add zone priority option to zones.csv
This commit is contained in:
parent
a913dac149
commit
758b2d2006
@ -128,13 +128,14 @@ namespace fastfiles
|
|||||||
return true;
|
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);
|
try_add_zone(zones, allocator, "mod", true);
|
||||||
const auto mod_zones = mods::get_mod_zones();
|
const auto mod_zones = mods::get_mod_zones();
|
||||||
for (const auto& zone : 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);
|
try_add_zone(zones, allocator, zone.name, true);
|
||||||
}
|
}
|
||||||
@ -158,6 +159,7 @@ namespace fastfiles
|
|||||||
utils::memory::allocator allocator;
|
utils::memory::allocator allocator;
|
||||||
std::vector<game::XZoneInfo> zones;
|
std::vector<game::XZoneInfo> zones;
|
||||||
try_add_zone(zones, allocator, "h2_mod_pre_gfx", true);
|
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);
|
push_zones(zones, zone_info, zone_count);
|
||||||
|
|
||||||
game::DB_LoadXAssets(zones.data(), static_cast<int>(zones.size()), sync_mode);
|
game::DB_LoadXAssets(zones.data(), static_cast<int>(zones.size()), sync_mode);
|
||||||
@ -175,6 +177,8 @@ namespace fastfiles
|
|||||||
std::vector<game::XZoneInfo> zones;
|
std::vector<game::XZoneInfo> zones;
|
||||||
|
|
||||||
try_add_zone(zones, allocator, "h2_mod_common", true);
|
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++)
|
for (auto i = 0u; i < zone_count; i++)
|
||||||
{
|
{
|
||||||
zones.push_back(zone_info[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);
|
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);
|
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();
|
const auto mod_zones = mods::get_mod_zones();
|
||||||
for (const auto& zone : 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);
|
add_custom_level_load_zone(load, zone.name.data(), 0x40000);
|
||||||
}
|
}
|
||||||
@ -476,6 +480,7 @@ namespace fastfiles
|
|||||||
|
|
||||||
a.pushad64();
|
a.pushad64();
|
||||||
a.mov(rcx, rbx);
|
a.mov(rcx, rbx);
|
||||||
|
a.mov(rdx, mods::zone_priority::pre_map);
|
||||||
a.call_aligned(add_mod_zones_to_load);
|
a.call_aligned(add_mod_zones_to_load);
|
||||||
a.popad64();
|
a.popad64();
|
||||||
|
|
||||||
@ -529,6 +534,8 @@ namespace fastfiles
|
|||||||
{
|
{
|
||||||
add_custom_level_load_zone(load, name, size_est);
|
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)
|
void db_load_xassets_stub(game::XZoneInfo* info, unsigned int zone_count, game::DBSyncMode sync_mode)
|
||||||
|
@ -40,17 +40,54 @@ namespace mods
|
|||||||
{"game", game::DB_ZONE_GAME},
|
{"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)
|
unsigned int get_alloc_flag(const std::string& name)
|
||||||
{
|
{
|
||||||
const auto lower = utils::string::to_lower(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;
|
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;
|
utils::hook::detour db_release_xassets_hook;
|
||||||
bool release_assets = false;
|
bool release_assets = false;
|
||||||
|
|
||||||
@ -113,13 +150,28 @@ namespace mods
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
mod_zone zone{};
|
||||||
|
|
||||||
const auto alloc_flags = get_alloc_flag(values[0]) | game::DB_ZONE_CUSTOM;
|
const auto alloc_flags = get_alloc_flag(values[0]) | game::DB_ZONE_CUSTOM;
|
||||||
if (alloc_flags & game::DB_ZONE_COMMON)
|
if (alloc_flags & game::DB_ZONE_COMMON)
|
||||||
{
|
{
|
||||||
mod_info.zone_info.has_common_zones = true;
|
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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,10 +2,25 @@
|
|||||||
|
|
||||||
namespace mods
|
namespace mods
|
||||||
{
|
{
|
||||||
|
enum zone_priority
|
||||||
|
{
|
||||||
|
none,
|
||||||
|
|
||||||
|
// common
|
||||||
|
pre_gfx,
|
||||||
|
post_gfx,
|
||||||
|
post_common,
|
||||||
|
|
||||||
|
// game
|
||||||
|
pre_map,
|
||||||
|
post_map,
|
||||||
|
};
|
||||||
|
|
||||||
struct mod_zone
|
struct mod_zone
|
||||||
{
|
{
|
||||||
std::string name;
|
std::string name;
|
||||||
unsigned int alloc_flags;
|
unsigned int alloc_flags;
|
||||||
|
zone_priority priority;
|
||||||
};
|
};
|
||||||
|
|
||||||
bool mod_requires_restart(const std::string& path);
|
bool mod_requires_restart(const std::string& path);
|
||||||
|
Loading…
x
Reference in New Issue
Block a user