Skip to content

Commit 33290ac

Browse files
committed
Fill in some Player properties.
1 parent e5b4321 commit 33290ac

15 files changed

Lines changed: 127 additions & 85 deletions

‎TechTree/BitmapInfo.h‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
// Represents an unknown class type with a length of 1064 bytes. It is related to the DirectDrawArea class and widely used.
1212

1313
struct BITMAPINFO256 {
14-
BITMAPINFOHEADER bmiHeader;
15-
RGBQUAD bmiColors[256];
14+
BITMAPINFOHEADER bmiHeader;
15+
RGBQUAD bmiColors[256];
1616
};
1717
#pragma pack(pop)

‎TechTree/ColorTable.h‎

Lines changed: 17 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -13,23 +13,24 @@ class ColorTable : public GameType
1313
{
1414
protected: // Member variables
1515
DWORD _VTable;
16-
int resource_id_;
17-
int type_;
18-
char* table_;
19-
int color_transform_base_;
20-
int unit_outline_color_;
21-
int selection_color_1_;
22-
int selection_color_2_;
23-
int minimap_color_1_;
24-
int minimap_color_2_;
25-
int minimap_color_3_;
26-
int text_color1_;
27-
int text_color2_;
28-
char text_color_r_;
29-
char text_color_g_;
30-
char text_color_b_;
31-
char reserved_;
3216

3317
public:
18+
int ResourceId;
19+
int Type;
20+
char* Table;
21+
int ColorTransformBase;
22+
int UnitOutlineColor;
23+
int SelectionColor1;
24+
int SelectionColor2;
25+
int MinimapColor1;
26+
int MinimapColor2;
27+
int MinimapColor3;
28+
int TextColor1;
29+
int TextColor2;
30+
char TextColorR;
31+
char TextColorG;
32+
char TextColorB;
33+
private:
34+
char reserved_;
3435
};
3536
#pragma pack(pop)

‎TechTree/GameDataHandler.h‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,9 +38,9 @@ class GameDataHandler : public GameType
3838
short _graphicCount;
3939
char _gap_42[2];
4040
int _graphics;
41-
short _unknown_ProbablyPlayerCount;
41+
short _playerCount;
4242
char _gap_4A[2];
43-
int *_dword4C;
43+
Player **_players;
4444
short _civCount;
4545
char _gap_52[2];
4646
CivData **_civs;

‎TechTree/Player.h‎

Lines changed: 36 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,36 @@
1+
#pragma once
2+
3+
/* INCLUDES */
4+
5+
// Base class header
6+
#include "GameType.h"
7+
#include "VTableType.h"
8+
9+
#include "ColorTable.h"
10+
11+
/* DEFINITIONS */
12+
13+
class PlayerVTable;
14+
15+
class Player : public GameType
16+
{
17+
public:
18+
PlayerVTable *_VTable;
19+
20+
private:
21+
char _padding[345];
22+
char _civId;
23+
char _padding2[2];
24+
ColorTable *_colorTable;
25+
char _padding3[6102];
26+
char _diplomaticStances[9];
27+
28+
public:
29+
int GetCivId() const { return _civId; }
30+
ColorTable *GetColorTable() const { return _colorTable; }
31+
char GetDiplomaticStance(int other) const { return _diplomaticStances[other]; }
32+
};
33+
34+
class PlayerVTable : public VTableType
35+
{
36+
};

‎TechTree/TechTree.cpp‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -79,10 +79,10 @@ extern "C" __declspec(dllexport) void Init()
7979

8080
// aoc-mmmod initialization.
8181
extern "C" __declspec(dllexport) void mmm_setup(mmm_mod_info* info) {
82-
info->name = "Moddable Tech Tree";
83-
info->version = TECH_TREE_VERSION;
82+
info->name = "Moddable Tech Tree";
83+
info->version = TECH_TREE_VERSION;
8484
}
8585

8686
extern "C" __declspec(dllexport) void mmm_before_setup(mmm_mod_info* info) {
87-
Init();
87+
Init();
8888
}

‎TechTree/TechTreeData.cpp‎

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -11,10 +11,10 @@
1111
/* STATIC WRAPPER FUNCTIONS */
1212

1313
static void THISCALL(TechTreeData_Constructor, TechTreeData *self, int datFileHandle) {
14-
return self->Constructor(datFileHandle);
14+
return self->Constructor(datFileHandle);
1515
}
1616
static void THISCALL(TechTreeData_Destructor, TechTreeData *self) {
17-
return self->Destructor();
17+
return self->Destructor();
1818
}
1919

2020
/* FUNCTIONS */
@@ -39,7 +39,7 @@ void TechTreeData::__Install()
3939
0xE8, 0x00, 0x00, 0x00, 0x00 // call TechTreeData::Constructor (address will be inserted in the next step)
4040
};
4141
CopyBytesToAddr(0x004268DD, patch1, sizeof(patch1));
42-
CreateCodecave(0x004268ED, reinterpret_cast<void(*)()>(TechTreeData_Constructor));
42+
CreateCodecave(0x004268ED, reinterpret_cast<void(*)()>(TechTreeData_Constructor));
4343

4444
// Install destructor (overwrite VTable address assignment as that isn't neccessary)
4545
BYTE patch2[] =
@@ -48,7 +48,7 @@ void TechTreeData::__Install()
4848
0xE8, 0x00, 0x00, 0x00, 0x00 // call TechTreeData::Destructor (address will be inserted in the next step)
4949
};
5050
CopyBytesToAddr(0x00425F9F, patch2, sizeof(patch2));
51-
CreateCodecave(0x00425FA0, reinterpret_cast<void(*)()>(TechTreeData_Destructor));
51+
CreateCodecave(0x00425FA0, reinterpret_cast<void(*)()>(TechTreeData_Destructor));
5252
}
5353

5454
TechTreeData::TechTreeData(int datFileHandle)
@@ -107,11 +107,11 @@ void TechTreeData::Destructor()
107107
_staticNewTechTreeDataObject = nullptr;
108108
}
109109

110-
void TechTreeData::UpdateRenderStates(char selectedCivId, int unknownGameAndPlayerData)
110+
void TechTreeData::UpdateRenderStates(char selectedCivId, Player *player)
111111
{
112112
// Update render state for all elements recursively
113113
for(auto &r : _rootElements)
114-
r->UpdateRenderState(selectedCivId, unknownGameAndPlayerData);
114+
r->UpdateRenderState(selectedCivId, player);
115115
}
116116

117117
const std::vector<TechTreeElement *> &TechTreeData::GetRootElements()

‎TechTree/TechTreeData.h‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
// Other includes
99
#include "TechTreeElement.h"
1010
#include "TechTreeDesign.h"
11+
#include "Player.h"
1112
#include <vector>
1213

1314
/* DEFINITIONS */
@@ -42,8 +43,8 @@ class TechTreeData : GameType
4243
// Updates the render states for the selected civ.
4344
// Parameters:
4445
// -> selectedCivId: The ID of the selected civ.
45-
// -> unknownGameAndPlayerData: Data given ingame to highlight currently available units and researches.
46-
void UpdateRenderStates(char selectedCivId, int unknownGameAndPlayerData);
46+
// -> player: Data given ingame to highlight currently available units and researches.
47+
void UpdateRenderStates(char selectedCivId, Player *player);
4748

4849
// Returns the root elements of the tech tree.
4950
const std::vector<TechTreeElement *> &GetRootElements();
@@ -53,4 +54,4 @@ class TechTreeData : GameType
5354
};
5455

5556
// The data of the new tech tree. This variable is initialized when the game data is loaded, else its value is nullptr.
56-
extern TechTreeData *_staticNewTechTreeDataObject;
57+
extern TechTreeData *_staticNewTechTreeDataObject;

‎TechTree/TechTreeElement.cpp‎

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,7 @@ TechTreeElement::~TechTreeElement()
7272
delete req;
7373
}
7474

75-
void TechTreeElement::UpdateRenderState(char selectedCivId, int unknownGameAndPlayerData, bool forceNotResearched)
75+
void TechTreeElement::UpdateRenderState(char selectedCivId, Player *player, bool forceNotResearched)
7676
{
7777
// Is the civ disabling this element?
7878
_renderState = ItemRenderState::Visible;
@@ -84,25 +84,25 @@ void TechTreeElement::UpdateRenderState(char selectedCivId, int unknownGameAndPl
8484
else
8585
_renderState = ItemRenderState::Disabled;
8686
}
87-
else if(unknownGameAndPlayerData != 0 && selectedCivId == reinterpret_cast<char *>(unknownGameAndPlayerData)[349]) // Player-Civ? => Mark researched/not researched elements
87+
else if(player != nullptr && selectedCivId == player->GetCivId()) // Player-Civ? => Mark researched/not researched elements
8888
{
8989
// Helper function to check whether research is done (parameters: some data object, research ID)
9090
short(__thiscall *CheckResearchIsDone)(int, short) = reinterpret_cast<short(__thiscall *)(int, short)>(0x0040231B);
9191

9292
// Check if element is researched
93-
if(forceNotResearched || (_age != 0 && CheckResearchIsDone(reinterpret_cast<int *>(unknownGameAndPlayerData)[1192], 100 + _age) != 3))
93+
if(forceNotResearched || (_age != 0 && CheckResearchIsDone(reinterpret_cast<int *>(player)[1192], 100 + _age) != 3))
9494
_renderState = ItemRenderState::NotResearched;
9595
else if(_elementType == ItemType::Building)
9696
{
9797
// Check if building is researched
98-
char *buildingData = reinterpret_cast<char ***>(unknownGameAndPlayerData)[29][_elementObjectID];
98+
char *buildingData = reinterpret_cast<char ***>(player)[29][_elementObjectID];
9999
if(buildingData == nullptr || buildingData[90] != 1)
100100
{
101101
// Check whether there is one required research that is completed
102102
// One is enough - this way we don't have to hardcode anything, although there may be inaccuracies
103103
bool researched = _requiredElements.empty();
104104
for(TechTreeElement::RequiredElement *req : _requiredElements)
105-
if(req->_elementType == TechTreeElement::ItemType::Research && CheckResearchIsDone(reinterpret_cast<int *>(unknownGameAndPlayerData)[1192], req->_elementObjectID) == 3)
105+
if(req->_elementType == TechTreeElement::ItemType::Research && CheckResearchIsDone(reinterpret_cast<int *>(player)[1192], req->_elementObjectID) == 3)
106106
{
107107
// Found
108108
researched = true;
@@ -115,13 +115,13 @@ void TechTreeElement::UpdateRenderState(char selectedCivId, int unknownGameAndPl
115115
else if(_elementType == ItemType::Creatable)
116116
{
117117
// Check if unit is researched
118-
char *unitData = reinterpret_cast<char ***>(unknownGameAndPlayerData)[29][_elementObjectID];
118+
char *unitData = reinterpret_cast<char ***>(player)[29][_elementObjectID];
119119
if(unitData == nullptr || unitData[90] != 1)
120120
{
121121
// Check whether there is one required research that is completed
122122
bool researched = _requiredElements.empty();
123123
for(TechTreeElement::RequiredElement *req : _requiredElements)
124-
if(req->_elementType == TechTreeElement::ItemType::Research && CheckResearchIsDone(reinterpret_cast<int *>(unknownGameAndPlayerData)[1192], req->_elementObjectID) == 3)
124+
if(req->_elementType == TechTreeElement::ItemType::Research && CheckResearchIsDone(reinterpret_cast<int *>(player)[1192], req->_elementObjectID) == 3)
125125
{
126126
// Found
127127
researched = true;
@@ -134,7 +134,7 @@ void TechTreeElement::UpdateRenderState(char selectedCivId, int unknownGameAndPl
134134
else if(_elementType == ItemType::Research)
135135
{
136136
// Check if research is completed
137-
if(CheckResearchIsDone(reinterpret_cast<int *>(unknownGameAndPlayerData)[1192], _elementObjectID) != 3)
137+
if(CheckResearchIsDone(reinterpret_cast<int *>(player)[1192], _elementObjectID) != 3)
138138
_renderState = ItemRenderState::NotResearched;
139139
}
140140
}
@@ -208,7 +208,7 @@ void TechTreeElement::UpdateRenderState(char selectedCivId, int unknownGameAndPl
208208

209209
// Update render state for all children recursively
210210
for(auto &c : _children)
211-
c->UpdateRenderState(selectedCivId, unknownGameAndPlayerData, _renderState == ItemRenderState::NotResearched);
211+
c->UpdateRenderState(selectedCivId, player, _renderState == ItemRenderState::NotResearched);
212212
}
213213

214214
TechTreeElement::RequiredElement::RequiredElement(int datFileHandle)

‎TechTree/TechTreeElement.h‎

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
// Other includes
66
#include <vector>
77
#include "DrawUtilities.h"
8+
#include "Player.h"
89

910
/* DEFINITIONS */
1011

@@ -131,7 +132,7 @@ class TechTreeElement
131132
// Updates the render state for the selected civ.
132133
// Parameters:
133134
// -> selectedCivId: The ID of the selected civ.
134-
// -> unknownGameAndPlayerData: Data given ingame to highlight currently available units and researches.
135+
// -> player: Data given ingame to highlight currently available units and researches.
135136
// -> forceNotResearched: Optional. When set, all child elements are marked as not researched recursively.
136-
void UpdateRenderState(char selectedCivId, int unknownGameAndPlayerData, bool forceNotResearched = false);
137-
};
137+
void UpdateRenderState(char selectedCivId, Player *player, bool forceNotResearched = false);
138+
};

‎TechTree/TechTreeRenderer.cpp‎

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -8,11 +8,11 @@
88

99
/* FUNCTIONS */
1010

11-
TechTreeRenderer::TechTreeRenderer(GameDataHandler *gameData, int unknownGameAndPlayerData)
11+
TechTreeRenderer::TechTreeRenderer(GameDataHandler *gameData, Player *player)
1212
{
1313
// Remember parameters
1414
_gameData = gameData;
15-
_unknownGameAndPlayerData = unknownGameAndPlayerData;
15+
_player = player;
1616

1717
// Initialize selected civ member
1818
_selectedCivId = 0;
@@ -44,11 +44,11 @@ void TechTreeRenderer::SetCurrentCiv(int civId)
4444
_selectedCivId = civId;
4545

4646
// Update render states
47-
_staticNewTechTreeDataObject->UpdateRenderStates(civId, _unknownGameAndPlayerData);
47+
_staticNewTechTreeDataObject->UpdateRenderStates(civId, _player);
4848
}
4949

5050
int TechTreeRenderer::GetAgeCount()
5151
{
5252
// Return age count
5353
return _ageCount;
54-
}
54+
}

0 commit comments

Comments
 (0)