Skip to content

Commit

Permalink
Merge pull request #528 from Wargus/clean_up
Browse files Browse the repository at this point in the history
Clean up
  • Loading branch information
Jarod42 authored Oct 6, 2023
2 parents e181aae + dd7275e commit e247176
Show file tree
Hide file tree
Showing 10 changed files with 79 additions and 123 deletions.
2 changes: 1 addition & 1 deletion src/action/action_die.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -125,7 +125,7 @@ void COrder_Die::Execute(CUnit &unit) /* override */

unit.Remove(nullptr);
unit.Type = &corpseType;
unit.Stats = &corpseType.Stats[unit.Player->Index];
unit.Stats = const_cast<CUnitStats *>(&corpseType.Stats[unit.Player->Index]);
UpdateUnitSightRange(unit);
unit.Place(unit.tilePos);

Expand Down
2 changes: 1 addition & 1 deletion src/action/action_upgradeto.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -156,7 +156,7 @@ static int TransformUnitIntoType(CUnit &unit, const CUnitType &newtype)
}

unit.Type = const_cast<CUnitType *>(&newtype);
unit.Stats = &unit.Type->Stats[player.Index];
unit.Stats = const_cast<CUnitStats *>(&unit.Type->Stats[player.Index]);

if (!newtype.CanCastSpell.empty() && !unit.AutoCastSpell) {
unit.AutoCastSpell = new char[SpellTypeTable.size()];
Expand Down
5 changes: 5 additions & 0 deletions src/include/stratagus.h
Original file line number Diff line number Diff line change
Expand Up @@ -157,6 +157,11 @@ inline bool starts_with(std::string_view s, std::string_view prefix)
return s.substr(0, prefix.size()) == prefix;
}

inline bool starts_with(std::wstring_view s, std::wstring_view prefix)
{
return s.substr(0, prefix.size()) == prefix;
}

/*----------------------------------------------------------------------------
-- General
----------------------------------------------------------------------------*/
Expand Down
2 changes: 1 addition & 1 deletion src/include/unit.h
Original file line number Diff line number Diff line change
Expand Up @@ -342,7 +342,7 @@ class CUnit

const CUnitType *Type = nullptr; /// Pointer to unit-type (peon,...)
CPlayer *Player = nullptr; /// Owner of this unit
const CUnitStats *Stats = nullptr; /// Current unit stats
CUnitStats *Stats = nullptr; /// Current unit stats
int CurrentSightRange; /// Unit's Current Sight Range

// Pathfinding stuff:
Expand Down
4 changes: 2 additions & 2 deletions src/include/upgrade_structs.h
Original file line number Diff line number Diff line change
Expand Up @@ -110,14 +110,14 @@ class CUnitStats
{
public:
CUnitStats() = default;
~CUnitStats();
~CUnitStats() = default;

CUnitStats &operator=(const CUnitStats &rhs);

bool operator == (const CUnitStats &rhs) const;
bool operator != (const CUnitStats &rhs) const;
public:
CVariable *Variables = nullptr; /// user defined variable.
std::vector<CVariable> Variables; /// user defined variable.
int Costs[MaxCosts]{}; /// current costs of the unit
int Storing[MaxCosts]{}; /// storage increasing
int ImproveIncomes[MaxCosts]{}; /// Gives player an improved income
Expand Down
153 changes: 58 additions & 95 deletions src/stratagus/script.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2346,122 +2346,85 @@ void LoadCcl(const fs::path &filename, const std::string &luaArgStr)
}

#ifdef WIN32
// copied from msdn
fs::path GetAVolumePath(__in PWCHAR VolumeName)
{
DWORD CharCount = MAX_PATH + 1;
PWCHAR Names = nullptr;
PWCHAR NameIdx = nullptr;
BOOL Success = FALSE;
DWORD CharCount = MAX_PATH + 1;
std::vector<WCHAR> Names(CharCount);

for (;;) {
Names = (PWCHAR) new BYTE [CharCount * sizeof(WCHAR)];

if (!Names) {
ExitFatal(1);
}

Success = GetVolumePathNamesForVolumeNameW(VolumeName, Names, CharCount, &CharCount);
if (Success) {
break;
}

if (GetLastError() != ERROR_MORE_DATA) {
break;
}

delete [] Names;
Names = nullptr;
}

for (NameIdx = Names; NameIdx[0] != L'\0'; NameIdx += wcslen(NameIdx) + 1) {
fs::path result(NameIdx);
delete [] Names;
Names = nullptr;
return result;
for (;;) {
const BOOL Success =
GetVolumePathNamesForVolumeNameW(VolumeName, Names.data(), Names.size(), &CharCount);
Names.resize(CharCount);
if (Success || GetLastError() != ERROR_MORE_DATA) {
break;
}
}

return fs::path();
return Names.data();
}

std::vector<fs::path> getVolumes()
{
DWORD CharCount = 0;
WCHAR DeviceName[MAX_PATH] = L"";
DWORD Error = ERROR_SUCCESS;
HANDLE FindHandle = INVALID_HANDLE_VALUE;
BOOL Found = FALSE;
size_t Index = 0;
BOOL Success = FALSE;
WCHAR VolumeName[MAX_PATH] = L"";
WCHAR VolumeName[MAX_PATH] = L"";

// Enumerate all volumes in the system.
HANDLE FindHandle = FindFirstVolumeW(VolumeName, std::size(VolumeName));

if (FindHandle == INVALID_HANDLE_VALUE) {
const DWORD Error = GetLastError();
wprintf(L"FindFirstVolumeW failed with error code %d\n", Error);
ExitFatal(1);
}

int curIndex = 0;
std::vector<fs::path> result;
for (;;) {
size_t Index = wcslen(VolumeName) - 1;

wprintf(L"Volume name: %s\n", VolumeName);
if (!starts_with(VolumeName, LR"(\\?\)") || VolumeName[Index] != L'\\') {
wprintf(L"FindFirstVolumeW/FindNextVolumeW returned a bad path: %s\n", VolumeName);
ExitFatal(1);
}

// Skip the \\?\ prefix and remove the trailing backslash.
// QueryDosDeviceW does not allow a trailing backslash,
// so temporarily remove it.
VolumeName[Index] = L'\0';
WCHAR DeviceName[MAX_PATH] = L"";
DWORD CharCount = QueryDosDeviceW(&VolumeName[4], DeviceName, std::size(DeviceName));
VolumeName[Index] = L'\\';

if (CharCount == 0) {
const DWORD Error = GetLastError();
wprintf(L"QueryDosDeviceW failed with error code %d\n", Error);
ExitFatal(1);
}

// Enumerate all volumes in the system.
FindHandle = FindFirstVolumeW(VolumeName, ARRAYSIZE(VolumeName));

if (FindHandle == INVALID_HANDLE_VALUE) {
Error = GetLastError();
wprintf(L"FindFirstVolumeW failed with error code %d\n", Error);
ExitFatal(1);
}

for (;;) {
// Skip the \\?\ prefix and remove the trailing backslash.
Index = wcslen(VolumeName) - 1;

if (VolumeName[0] != L'\\' ||
VolumeName[1] != L'\\' ||
VolumeName[2] != L'?' ||
VolumeName[3] != L'\\' ||
VolumeName[Index] != L'\\') {
Error = ERROR_BAD_PATHNAME;
wprintf(L"FindFirstVolumeW/FindNextVolumeW returned a bad path: %s\n", VolumeName);
ExitFatal(1);
}

// QueryDosDeviceW does not allow a trailing backslash,
// so temporarily remove it.
VolumeName[Index] = L'\0';
CharCount = QueryDosDeviceW(&VolumeName[4], DeviceName, ARRAYSIZE(DeviceName));
VolumeName[Index] = L'\\';

if (CharCount == 0) {
Error = GetLastError();
wprintf(L"QueryDosDeviceW failed with error code %d\n", Error);
ExitFatal(1);
}

wprintf(L"\nFound a device:\n %s", DeviceName);
wprintf(L"\nVolume name: %s", VolumeName);
wprintf(L" Found a device: %s\n", DeviceName);
fs::path r = GetAVolumePath(VolumeName);
if (!r.empty()) {
result.push_back(r);
wprintf(L"\nPath: %s", r.wstring().c_str());
wprintf(L" Path: %s\n", r.wstring().c_str());
}

// Move on to the next volume.
Success = FindNextVolumeW(FindHandle, VolumeName, ARRAYSIZE(VolumeName));
// Move on to the next volume.
const BOOL Success = FindNextVolumeW(FindHandle, VolumeName, std::size(VolumeName));

if (!Success) {
Error = GetLastError();
if (!Success) {
const DWORD Error = GetLastError();

if (Error != ERROR_NO_MORE_FILES) {
wprintf(L"FindNextVolumeW failed with error code %d\n", Error);
ExitFatal(1);
}
if (Error != ERROR_NO_MORE_FILES) {
wprintf(L"FindNextVolumeW failed with error code %d\n", Error);
ExitFatal(1);
}

// Finished iterating through all the volumes.
Error = ERROR_SUCCESS;
break;
}
}
// Finished iterating through all the volumes.
break;
}
}

FindVolumeClose(FindHandle);
FindHandle = INVALID_HANDLE_VALUE;
FindVolumeClose(FindHandle);

return result;
return result;
}
#endif

Expand Down
4 changes: 2 additions & 2 deletions src/unit/script_unittype.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1405,8 +1405,8 @@ static int CclDefineUnitStats(lua_State *l)
Assert(playerId < PlayerMax);

CUnitStats *stats = &type.Stats[playerId];
if (!stats->Variables) {
stats->Variables = new CVariable[UnitTypeVar.GetNumberVariable()];
if (stats->Variables.empty()) {
stats->Variables.resize(UnitTypeVar.GetNumberVariable());
}

// Parse the list: (still everything could be changed!)
Expand Down
10 changes: 5 additions & 5 deletions src/unit/unit.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -621,7 +621,7 @@ void CUnit::Init(const CUnitType &type)
Assert(!Variable);
const unsigned int size = UnitTypeVar.GetNumberVariable();
Variable = new CVariable[size];
std::copy(type.MapDefaultStat.Variables, type.MapDefaultStat.Variables + size, Variable);
std::copy(type.MapDefaultStat.Variables.begin(), type.MapDefaultStat.Variables.end(), Variable);
} else {
Variable = nullptr;
}
Expand Down Expand Up @@ -746,12 +746,12 @@ void CUnit::AssignToPlayer(CPlayer &player)
}
}
Player = &player;
Stats = &type.Stats[Player->Index];
Stats = const_cast<CUnitStats *>(&type.Stats[Player->Index]);
if (!SaveGameLoading) {
if (UnitTypeVar.GetNumberVariable()) {
Assert(Variable);
Assert(Stats->Variables);
memcpy(Variable, Stats->Variables, UnitTypeVar.GetNumberVariable() * sizeof(*Variable));
Assert(Stats->Variables.size() == UnitTypeVar.GetNumberVariable());
std::copy(Stats->Variables.begin(), Stats->Variables.end(), Variable);
}
}
}
Expand Down Expand Up @@ -1870,7 +1870,7 @@ void CUnit::ChangeOwner(CPlayer &newplayer)

MapUnmarkUnitSight(*this);
newplayer.AddUnit(*this);
Stats = &Type->Stats[newplayer.Index];
Stats = const_cast<CUnitStats *>(&Type->Stats[newplayer.Index]);
UpdateUnitSightRange(*this);
MapMarkUnitSight(*this);

Expand Down
6 changes: 2 additions & 4 deletions src/unit/unittype.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -824,10 +824,8 @@ std::pair<CUnitType *, bool> NewUnitTypeSlot(std::string_view ident)
type->Ident = ident;
type->BoolFlag.resize(new_bool_size);

type->DefaultStat.Variables = new CVariable[UnitTypeVar.GetNumberVariable()];
for (unsigned int i = 0; i < UnitTypeVar.GetNumberVariable(); ++i) {
type->DefaultStat.Variables[i] = UnitTypeVar.Variable[i];
}
type->DefaultStat.Variables = UnitTypeVar.Variable;

UnitTypes.push_back(type);
UnitTypeMap[type->Ident] = type;
return {type, false};
Expand Down
14 changes: 2 additions & 12 deletions src/unit/upgrade.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -78,24 +78,14 @@ static std::map<std::string, CUpgrade *, std::less<>> Upgrades;
-- Functions
----------------------------------------------------------------------------*/


CUnitStats::~CUnitStats()
{
delete [] this->Variables;
}

CUnitStats &CUnitStats::operator = (const CUnitStats &rhs)
{
for (unsigned int i = 0; i < MaxCosts; ++i) {
this->Costs[i] = rhs.Costs[i];
this->Storing[i] = rhs.Storing[i];
this->ImproveIncomes[i] = rhs.ImproveIncomes[i];
}
delete [] this->Variables;
const unsigned int size = UnitTypeVar.GetNumberVariable();
this->Variables = new CVariable[size];

std::copy(rhs.Variables, rhs.Variables + size, this->Variables);
this->Variables = rhs.Variables;
return *this;
}

Expand Down Expand Up @@ -248,7 +238,7 @@ static int CclDefineModifier(lua_State *l)

memset(um->ChangeUpgrades, '?', sizeof(um->ChangeUpgrades));
memset(um->ApplyTo, '?', sizeof(um->ApplyTo));
um->Modifier.Variables = new CVariable[UnitTypeVar.GetNumberVariable()];
um->Modifier.Variables.resize(UnitTypeVar.GetNumberVariable());
um->ModifyPercent.resize(UnitTypeVar.GetNumberVariable());

std::string_view upgrade_ident = LuaToString(l, 1);
Expand Down

0 comments on commit e247176

Please sign in to comment.