Skip to content

Commit

Permalink
Add a cIBuildingStyleInfo2 interface
Browse files Browse the repository at this point in the history
This interface extends cIBuildingStyleInfo with a method to get the
occupant building style list with a user-specified separator, and adds
a method to query if the occupant is marked as wall-to-wall.
  • Loading branch information
0xC0000054 committed Oct 25, 2024
1 parent 95982a5 commit e96abfd
Show file tree
Hide file tree
Showing 9 changed files with 116 additions and 33 deletions.
7 changes: 3 additions & 4 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -180,11 +180,10 @@ if (pSC4App)

This class allows other DLLS to query the style ids and names for the building styles that are present in the
game's `Building Style Control` window.
It also provides a function to get a building occupant's supported styles as a string containing a comma-separated
list of style names, only styles that are present in the game's `Building Style Control` window will be included in
that list.
It also provides a function to get a building occupant's supported styles as a string containing a list of style names,
only styles that are present in the game's `Building Style Control` window will be included in that list.

See [cIBuildingStyleInfo.h](https://github.com/0xC0000054/sc4-more-building-styles/blob/main/src/public/include/cIBuildingStyleInfo.h) for details.
See [cIBuildingStyleInfo2.h](https://github.com/0xC0000054/sc4-more-building-styles/blob/main/src/public/include/cIBuildingStyleInfo2.h) for details.

### cIBuildingStyleWallToWall GZCOM Class

Expand Down
47 changes: 34 additions & 13 deletions src/BuildingStyleInfo.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -28,12 +28,11 @@

namespace
{
const std::string_view StyleNameListSeperator(", ");

void GetStyleNamesFromVariant(
const cIGZVariant& variant,
const BuildingStyleCollection& availableBuildingStyles,
cIGZString& destination)
cIGZString& destination,
const cIGZString& separator)
{
const uint32_t* pData = variant.RefUint32();
const uint32_t repCount = variant.GetCount();
Expand All @@ -58,7 +57,7 @@ namespace
}
else
{
destination.Append(StyleNameListSeperator.data(), StyleNameListSeperator.size());
destination.Append(separator);
}

destination.Append(item->styleName);
Expand Down Expand Up @@ -94,6 +93,13 @@ bool BuildingStyleInfo::QueryInterface(uint32_t riid, void** ppvObj)

return true;
}
else if (riid == GZIID_cIBuildingStyleInfo2)
{
*ppvObj = static_cast<cIBuildingStyleInfo2*>(this);
AddRef();

return true;
}
else if (riid == GZIID_cIGZUnknown)
{
*ppvObj = static_cast<cIGZUnknown*>(this);
Expand Down Expand Up @@ -173,21 +179,36 @@ bool BuildingStyleInfo::GetBuildingStyleName(uint32_t style, cIGZString& name) c
return result;
}

bool BuildingStyleInfo::GetBuildingStyleNames(cISC4Occupant* pOccupant, cIGZString& destination) const
bool BuildingStyleInfo::GetBuildingStyleNames(cISC4Occupant* pBuildingOccupant, cIGZString& destination) const
{
return GetBuildingStyleNamesEx(pBuildingOccupant, destination, cRZBaseString(", "));
}

bool BuildingStyleInfo::IsBuildingStyleAvailable(uint32_t style) const
{
const BuildingStyleCollection& availableBuildingStyles = buildingWinManager.GetAvailableBuildingStyles();

return availableBuildingStyles.find_style(style) != availableBuildingStyles.end();
}

bool BuildingStyleInfo::GetBuildingStyleNamesEx(
cISC4Occupant* pBuildingOccupant,
cIGZString& destination,
cIGZString const& separator) const
{
bool result = false;

destination.Erase(0, destination.Strlen());

const cISC4BuildingOccupant::PurposeType purpose = BuildingUtil::GetPurposeType(pOccupant);
const cISC4BuildingOccupant::PurposeType purpose = BuildingUtil::GetPurposeType(pBuildingOccupant);

if (BuildingUtil::PurposeTypeSupportsBuildingStyles(purpose))
{
const BuildingStyleCollection& availableBuildingStyles = buildingWinManager.GetAvailableBuildingStyles();

if (availableBuildingStyles.size() > 0)
{
const cISCPropertyHolder* pPropertyHolder = pOccupant->AsPropertyHolder();
const cISCPropertyHolder* pPropertyHolder = pBuildingOccupant->AsPropertyHolder();

if (pPropertyHolder)
{
Expand All @@ -202,7 +223,8 @@ bool BuildingStyleInfo::GetBuildingStyleNames(cISC4Occupant* pOccupant, cIGZStri
GetStyleNamesFromVariant(
*pVariant,
availableBuildingStyles,
destination);
destination,
separator);
}
}
else
Expand Down Expand Up @@ -239,7 +261,8 @@ bool BuildingStyleInfo::GetBuildingStyleNames(cISC4Occupant* pOccupant, cIGZStri
GetStyleNamesFromVariant(
*pVariant,
availableBuildingStyles,
destination);
destination,
separator);
}
}
}
Expand All @@ -254,9 +277,7 @@ bool BuildingStyleInfo::GetBuildingStyleNames(cISC4Occupant* pOccupant, cIGZStri
return result;
}

bool BuildingStyleInfo::IsBuildingStyleAvailable(uint32_t style) const
bool BuildingStyleInfo::IsWallToWall(cISC4Occupant* pBuildingOccupant) const
{
const BuildingStyleCollection& availableBuildingStyles = buildingWinManager.GetAvailableBuildingStyles();

return availableBuildingStyles.find_style(style) != availableBuildingStyles.end();
return BuildingUtil::IsWallToWall(pBuildingOccupant);
}
29 changes: 22 additions & 7 deletions src/BuildingStyleInfo.h
Original file line number Diff line number Diff line change
Expand Up @@ -11,25 +11,40 @@
////////////////////////////////////////////////////////////////////////////

#pragma once
#include "cIBuildingStyleInfo.h"
#include "cIBuildingStyleInfo2.h"

class IBuildingSelectWinManager;

class BuildingStyleInfo : public cIBuildingStyleInfo
class BuildingStyleInfo final : public cIBuildingStyleInfo2
{
public:
BuildingStyleInfo(const IBuildingSelectWinManager& buildingWinManager);

// cIGZUnknown

bool QueryInterface(uint32_t riid, void** ppvObj) override;
uint32_t AddRef() override;
uint32_t Release() override;

uint32_t GetAvailableBuildingStyleIds(uint32_t* pStyles, uint32_t size) const;
bool GetBuildingStyleName(uint32_t style, cIGZString& name) const;
bool GetBuildingStyleNames(cISC4Occupant* pBuildingOccupant, cIGZString& destination) const;
bool IsBuildingStyleAvailable(uint32_t style) const;

private:
// cIBuildingStyleInfo

uint32_t GetAvailableBuildingStyleIds(uint32_t* pStyles, uint32_t size) const override;
bool GetBuildingStyleName(uint32_t style, cIGZString& name) const override;
bool GetBuildingStyleNames(cISC4Occupant* pBuildingOccupant, cIGZString& destination) const override;
bool IsBuildingStyleAvailable(uint32_t style) const override;

// cIBuildingStyleInfo2

bool GetBuildingStyleNamesEx(
cISC4Occupant* pBuildingOccupant,
cIGZString& destination,
const cIGZString& separator) const override;

bool IsWallToWall(cISC4Occupant* pBuildingOccupant) const override;

// Private members

uint32_t refCount;
const IBuildingSelectWinManager& buildingWinManager;
};
Expand Down
9 changes: 1 addition & 8 deletions src/BuildingStyleWallToWall.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -120,14 +120,7 @@ bool BuildingStyleWallToWall::GetWallToWallOccupantGroupName(uint32_t occupantGr

bool BuildingStyleWallToWall::HasWallToWallOccupantGroup(cISC4Occupant* pBuildingOccupant) const
{
bool result = false;

if (pBuildingOccupant)
{
result = BuildingUtil::IsWallToWall(pBuildingOccupant->AsPropertyHolder());
}

return result;
return BuildingUtil::IsWallToWall(pBuildingOccupant);
}

bool BuildingStyleWallToWall::GetWallToWallOccupantGroupNames(cISC4Occupant* pBuildingOccupant, cIGZString& destination) const
Expand Down
13 changes: 12 additions & 1 deletion src/BuildingUtil.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,6 @@ bool BuildingUtil::IsWallToWall(const cISCPropertyHolder* pPropertyHolder)

if (pVariant)
{

const uint16_t type = pVariant->GetType();

if (type == cIGZVariant::Bool)
Expand Down Expand Up @@ -134,3 +133,15 @@ bool BuildingUtil::IsWallToWall(const cISCPropertyHolder* pPropertyHolder)

return buildingIsWallToWall;
}

bool BuildingUtil::IsWallToWall(cISC4Occupant* pOccupant)
{
bool result = false;

if (pOccupant)
{
result = IsWallToWall(pOccupant->AsPropertyHolder());
}

return result;
}
1 change: 1 addition & 0 deletions src/BuildingUtil.h
Original file line number Diff line number Diff line change
Expand Up @@ -28,4 +28,5 @@ namespace BuildingUtil
bool IsIndustrialBuilding(cISC4BuildingOccupant::PurposeType purposeType);

bool IsWallToWall(const cISCPropertyHolder* pPropertyHolder);
bool IsWallToWall(cISC4Occupant* pOccupant);
}
1 change: 1 addition & 0 deletions src/SC4MoreBuildingStyles.vcxproj
Original file line number Diff line number Diff line change
Expand Up @@ -89,6 +89,7 @@
<ClInclude Include="LotConfigurationManagerHooks.h" />
<ClInclude Include="Patcher.h" />
<ClInclude Include="public\include\cIBuildingStyleInfo.h" />
<ClInclude Include="public\include\cIBuildingStyleInfo2.h" />
<ClInclude Include="public\include\cIBuildingStyleWallToWall.h" />
<ClInclude Include="SC4NotificationDialog.h" />
<ClInclude Include="SC4Vector.h" />
Expand Down
3 changes: 3 additions & 0 deletions src/SC4MoreBuildingStyles.vcxproj.filters
Original file line number Diff line number Diff line change
Expand Up @@ -287,6 +287,9 @@
<ClInclude Include="BuildingUtil.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="public\include\cIBuildingStyleInfo2.h">
<Filter>Header Files\Public Headers</Filter>
</ClInclude>
</ItemGroup>
<ItemGroup>
<None Include=".editorconfig" />
Expand Down
39 changes: 39 additions & 0 deletions src/public/include/cIBuildingStyleInfo2.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
////////////////////////////////////////////////////////////////////////////
//
// This file is part of sc4-more-building-styles, a DLL Plugin for
// SimCity 4 that adds support for more building styles.
//
// Copyright (c) 2024 Nicholas Hayes
//
// This file is licensed under terms of the MIT License.
// See LICENSE.txt for more information.
//
////////////////////////////////////////////////////////////////////////////

#pragma once
#include "cIBuildingStyleInfo.h"

static const uint32_t GZIID_cIBuildingStyleInfo2 = 0xC6C058F1;

class cIBuildingStyleInfo2 : public cIBuildingStyleInfo
{
public:
/**
* @brief Gets a list of the style names for the specified building.
* @param pBuildingOccupant A pointer to the building occupant.
* @param destination The destination string.
* @param separator The separator between items in the list.
* @return true on success; otherwise, false.
*/
virtual bool GetBuildingStyleNamesEx(
cISC4Occupant* pBuildingOccupant,
cIGZString& destination,
cIGZString const& separator) const = 0;

/**
* @brief Gets a value indicating whether the specified building is wall to wall.
* @param pBuildingOccupant A pointer to the building occupant.
* @return true if the specified building is wall to wall; otherwise, false.
*/
virtual bool IsWallToWall(cISC4Occupant* pBuildingOccupant) const = 0;
};

0 comments on commit e96abfd

Please sign in to comment.