Skip to content

Commit

Permalink
Allow customizing docking dirs per offset
Browse files Browse the repository at this point in the history
  • Loading branch information
Starkku committed Mar 2, 2024
1 parent 0177dc4 commit d1f4471
Show file tree
Hide file tree
Showing 5 changed files with 51 additions and 13 deletions.
6 changes: 3 additions & 3 deletions docs/Fixed-or-Improved-Logics.md
Original file line number Diff line number Diff line change
Expand Up @@ -253,12 +253,12 @@ HideIfNoOre.Threshold=0 ; integer, minimal ore growth stage

### Aircraft docking direction

- It is now possible to customize the landing direction for docking aircraft via `AircraftDockingDir` on the dock building. This overrides the aircraft's own [landing direction](#landing-direction) setting and defaults to `[AudioVisual]` -> `PoseDir`.
- It is now possible to customize the landing direction for docking aircraft via `AircraftDockingDir(N)` (`N` optionally replaced by 0-based index for each `DockingOffset` separately, `AircraftDockingDir` and `AircraftDockingDir0` are synonymous and will be used if direction is not set for a specific offset) on the dock building. This overrides the aircraft's own [landing direction](#landing-direction) setting and defaults to `[AudioVisual]` -> `PoseDir`.

In `rulesmd.ini`:
```ini
[SOMEBUILDING] ; BuildingType
AircraftDockingDir= ; Direction type (integers from 0-255)
[SOMEBUILDING] ; BuildingType
AircraftDockingDir(N)= ; Direction type (integers from 0-255)
```

### Airstrike target eligibility
Expand Down
13 changes: 10 additions & 3 deletions src/Ext/Aircraft/Body.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -74,9 +74,16 @@ DirType AircraftExt::GetLandingDir(AircraftClass* pThis, BuildingClass* pDock)
if (pBuilding)
{
auto const pBuildingTypeExt = BuildingTypeExt::ExtMap.Find(pBuilding->Type);

if (pBuildingTypeExt->AircraftDockingDir.isset())
return pBuildingTypeExt->AircraftDockingDir.Get();
int docks = pBuilding->Type->NumberOfDocks;
int linkIndex = pBuilding->FindLinkIndex(pThis);

if (docks > 0 && linkIndex >= 0 && linkIndex < docks)
{
if (!pBuildingTypeExt->AircraftDockingDirs[linkIndex].empty())
return pBuildingTypeExt->AircraftDockingDirs[linkIndex].get();
}
else if (docks > 0 && !pBuildingTypeExt->AircraftDockingDirs[0].empty())
return pBuildingTypeExt->AircraftDockingDirs[0].get();
}
}
else if (!pThis->Type->AirportBound)
Expand Down
17 changes: 14 additions & 3 deletions src/Ext/Aircraft/Hooks.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ DEFINE_HOOK(0x417FF1, AircraftClass_Mission_Attack_StrafeShots, 0x6)
GET(AircraftClass*, pThis, ESI);

if (pThis->MissionStatus < (int)AirAttackStatus::FireAtTarget2_Strafe
|| pThis->MissionStatus > (int)AirAttackStatus::FireAtTarget5_Strafe)
|| pThis->MissionStatus >(int)AirAttackStatus::FireAtTarget5_Strafe)
{
return 0;
}
Expand Down Expand Up @@ -143,8 +143,7 @@ DEFINE_HOOK(0x446F6C, BuildingClass_GrandOpening_PoseDir, 0x9)
return 0;
}

DEFINE_HOOK_AGAIN(0x443FEF, BuildingClass_ExitObject_PoseDir, 0xA)
DEFINE_HOOK(0x443FC7, BuildingClass_ExitObject_PoseDir, 0x8)
DEFINE_HOOK(0x443FC7, BuildingClass_ExitObject_PoseDir1, 0x8)
{
GET(BuildingClass*, pThis, ESI);
GET(AircraftClass*, pAircraft, EBP);
Expand All @@ -154,5 +153,17 @@ DEFINE_HOOK(0x443FC7, BuildingClass_ExitObject_PoseDir, 0x8)
return 0;
}

DEFINE_HOOK(0x44402E, BuildingClass_ExitObject_PoseDir2, 0x5)
{
GET(BuildingClass*, pThis, ESI);
GET(AircraftClass*, pAircraft, EBP);

auto dir = DirStruct(AircraftExt::GetLandingDir(pAircraft, pThis));
pAircraft->PrimaryFacing.SetCurrent(dir);
pAircraft->SecondaryFacing.SetCurrent(dir);

return 0;
}

#pragma endregion

24 changes: 22 additions & 2 deletions src/Ext/BuildingType/Body.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -147,7 +147,27 @@ void BuildingTypeExt::ExtData::LoadFromINIFile(CCINIClass* const pINI)
this->ConsideredVehicle.Read(exINI, pSection, "ConsideredVehicle");
this->SellBuildupLength.Read(exINI, pSection, "SellBuildupLength");

this->AircraftDockingDir.Read(exINI, pSection, "AircraftDockingDir");
if (pThis->NumberOfDocks > 0)
{
this->AircraftDockingDirs.clear();
this->AircraftDockingDirs.resize(pThis->NumberOfDocks);

Nullable<DirType> nLandingDir;
nLandingDir.Read(exINI, pSection, "AircraftDockingDir");

if (nLandingDir.isset())
this->AircraftDockingDirs[0] = nLandingDir.Get();

for (int i = 0; i < pThis->NumberOfDocks; ++i)
{
char tempBuffer[32];
_snprintf_s(tempBuffer, sizeof(tempBuffer), "AircraftDockingDir%d", i);
nLandingDir.Read(exINI, pSection, tempBuffer);

if (nLandingDir.isset())
this->AircraftDockingDirs[i] = nLandingDir.Get();
}
}

// Ares tag
this->SpyEffect_Custom.Read(exINI, pSection, "SpyEffect.Custom");
Expand Down Expand Up @@ -236,7 +256,7 @@ void BuildingTypeExt::ExtData::Serialize(T& Stm)
.Process(this->ConsideredVehicle)
.Process(this->ZShapePointMove_OnBuildup)
.Process(this->SellBuildupLength)
.Process(this->AircraftDockingDir)
.Process(this->AircraftDockingDirs)
;
}

Expand Down
4 changes: 2 additions & 2 deletions src/Ext/BuildingType/Body.h
Original file line number Diff line number Diff line change
Expand Up @@ -61,7 +61,7 @@ class BuildingTypeExt
Valueable<bool> ZShapePointMove_OnBuildup;
Valueable<int> SellBuildupLength;

Nullable<DirType> AircraftDockingDir;
std::vector<OptionalStruct<DirType, true>> AircraftDockingDirs;

ExtData(BuildingTypeClass* OwnerObject) : Extension<BuildingTypeClass>(OwnerObject)
, PowersUp_Owner { AffectedHouse::Owner }
Expand Down Expand Up @@ -98,7 +98,7 @@ class BuildingTypeExt
, ConsideredVehicle {}
, ZShapePointMove_OnBuildup { false }
, SellBuildupLength { 23 }
, AircraftDockingDir {}
, AircraftDockingDirs {}
{ }

// Ares 0.A functions
Expand Down

0 comments on commit d1f4471

Please sign in to comment.