Ares
Functions

Hooks.BasePlan.cpp File Reference

#include "Body.h"
#include "../HouseType/Body.h"
#include <BuildingTypeClass.h>

Functions

 DEFINE_HOOK (5054B0, HouseClass_GenerateAIBuildList_EnsureSanity, 6)
 DEFINE_HOOK (50610E, HouseClass_FindPositionForBuilding_FixShipyard, 7)
 DEFINE_HOOK (505B58, HouseClass_GenerateAIBuildList_SkipManualCopy, 6)
 DEFINE_HOOK (505C34, HouseClass_GenerateAIBuildList_FullAutoCopy, 5)
 DEFINE_HOOK (505CF1, HouseClass_GenerateAIBuildList_PadWithN1, 5)
 DEFINE_HOOK (4F65BF, HouseClass_CanAffordBase, 6)
 DEFINE_HOOK (5D705E, MPGameMode_SpawnBaseUnit, 6)
 DEFINE_HOOK (688B37, MPGameModeClass_CreateStartingUnits_B, 5)
 DEFINE_HOOK (5D721A, MPGameMode_CreateStartingUnits, 5)

Function Documentation

DEFINE_HOOK ( 5054B0  ,
HouseClass_GenerateAIBuildList_EnsureSanity  ,
 
)
{
        GET(HouseClass *, pHouse, ECX);
        auto pData = HouseExt::ExtMap.Find(pHouse);
        pData->CheckBasePlanSanity();
        return 0;// allow the list to be generated even if it will crash the game - sanity check will log potential problems and thou shalt RTFLog
}
DEFINE_HOOK ( 5D721A  ,
MPGameMode_CreateStartingUnits  ,
 
)
{
        GET_STACK(int, UnitCount, 0x40);
        GET_STACK(HouseClass*, pHouse, 0x4C);
        if(!UnitCount) {
                Debug::DevLog(Debug::Error, "House of country [%s] cannot build anything from [General]BaseUnit=. \n", pHouse->Type->ID);
        }
        return 0;
}
DEFINE_HOOK ( 688B37  ,
MPGameModeClass_CreateStartingUnits_B  ,
 
)
{
        enum { hasBaseUnit = 0x688B75, hasNoBaseUnit = 0x688C09 };

        GET_STACK(HouseClass *, pHouse, 0x10);

        auto pArray = &RulesClass::Instance->BaseUnit;
        bool canBuild = false;
        UnitTypeClass* Item = NULL;
        for(int i = 0; i < pArray->Count; ++i) {
                Item = pArray->GetItem(i);
                if(pHouse->CanExpectToBuild(Item)) {
                        canBuild = true;
                        break;
                }
        }
        if(!canBuild) {
                Debug::DevLog(Debug::Error, "House of country [%s] cannot build anything from [General]BaseUnit=. \n", pHouse->Type->ID);

                return hasNoBaseUnit;
        }

        auto Unit = reinterpret_cast<UnitClass *>(Item->CreateObject(pHouse));
        R->ESI<UnitClass *>(Unit);
        R->EBP(0);
        R->EDI<HouseClass *>(pHouse);
        return hasBaseUnit;
}
DEFINE_HOOK ( 5D705E  ,
MPGameMode_SpawnBaseUnit  ,
 
)
{
        enum { hasBaseUnit = 0x5D7084, hasNoBaseUnit = 0x5D70DB };

        GET(HouseClass *, pHouse, EDI);
        GET(UnitTypeClass *, pBaseUnit, EAX);
        if(!pBaseUnit) {
                Debug::DevLog(Debug::Error, "House of country [%s] cannot build anything from [General]BaseUnit=.\n", pHouse->Type->ID);
                return hasNoBaseUnit;
        }

        auto Unit = reinterpret_cast<UnitClass *>(pBaseUnit->CreateObject(pHouse));
        R->ESI<UnitClass *>(Unit);
        return hasBaseUnit;
}
DEFINE_HOOK ( 4F65BF  ,
HouseClass_CanAffordBase  ,
 
)
{
        GET(UnitTypeClass*, pBaseUnit, ECX);
        if(pBaseUnit) {
                return 0;
        }
//      GET(HouseClass *, pHouse, ESI);
//      Debug::DevLog(Debug::Error, "AI House of country [%s] cannot build anything from [General]BaseUnit=.\n", pHouse->Type->ID);
        return 0x4F65DA;
}
DEFINE_HOOK ( 505CF1  ,
HouseClass_GenerateAIBuildList_PadWithN1  ,
 
)
{
        LEA_STACK(DynamicVectorClass<BuildingTypeClass *> *, PlannedBase2, STACK_OFFS(0xA4, 0x78));
        GET(int, DefenseCount, EAX);
        while(PlannedBase2->Count <= 3) {
                PlannedBase2->AddItem(reinterpret_cast<BuildingTypeClass *>(-1));
                --DefenseCount;
        }
        R->EDI<int>(DefenseCount);
        R->EBX<int>(-1);
        return (DefenseCount > 0)
                ? 0x505CF6
                : 0x505D8D
        ;
}
DEFINE_HOOK ( 505C34  ,
HouseClass_GenerateAIBuildList_FullAutoCopy  ,
 
)
{
        R->EDI<int>(0);
        return 0x505C39;
}
DEFINE_HOOK ( 505B58  ,
HouseClass_GenerateAIBuildList_SkipManualCopy  ,
 
)

v2[0] = v1[0]; v2[1] = v1[1]; v2[2] = v1[2]; for(int i = 3; i < v1.Count; ++i) { v2[i] = v1[i]; } care to guess what happens when v1.Count is < 3?

fixed old fix, which was quite broken itself...

{
        LEA_STACK(DynamicVectorClass<BuildingTypeClass *> *, PlannedBase1, STACK_OFFS(0xA4, 0x90));
        LEA_STACK(DynamicVectorClass<BuildingTypeClass *> *, PlannedBase2, STACK_OFFS(0xA4, 0x78));
        PlannedBase2->SetCapacity(PlannedBase1->Capacity, NULL);
        return 0x505C2C;
}
DEFINE_HOOK ( 50610E  ,
HouseClass_FindPositionForBuilding_FixShipyard  ,
 
)
{
        GET(BuildingTypeClass *, pShipyard, EAX);
        if(pShipyard) {
                R->ESI<int>(pShipyard->GetFoundationWidth() + 2);
                R->EAX<int>(pShipyard->GetFoundationHeight(false));
                return 0x506134;
        } else {
                return 0x5060CE;
        }
}
 All Classes Files Functions Variables Typedefs Enumerations Enumerator Defines