Skip to content

Commit 0275053

Browse files
authored
Implements ChallengeGenerals. (#728)
1 parent 9dab0ac commit 0275053

File tree

4 files changed

+271
-0
lines changed

4 files changed

+271
-0
lines changed

src/CMakeLists.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ set(GAMEENGINE_SRC
6464
game/weather.cpp
6565
game/client/baseheightmap.cpp
6666
game/client/line2d.cpp
67+
game/client/challengegenerals.cpp
6768
game/client/crashpreferences.cpp
6869
game/client/display.cpp
6970
game/client/displaystring.cpp
Lines changed: 152 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,152 @@
1+
/**
2+
* @file
3+
*
4+
* @author tomsons26
5+
*
6+
* @brief
7+
*
8+
* @copyright Thyme is free software: you can redistribute it and/or
9+
* modify it under the terms of the GNU General Public License
10+
* as published by the Free Software Foundation, either version
11+
* 2 of the License, or (at your option) any later version.
12+
* A full copy of the GNU General Public License can be found in
13+
* LICENSE
14+
*/
15+
16+
#include "challengegenerals.h"
17+
#include "image.h"
18+
#include "ini.h"
19+
20+
#ifndef GAME_DLL
21+
ChallengeGenerals *g_theChallengeGenerals = nullptr;
22+
#endif
23+
24+
GeneralPersona::GeneralPersona() :
25+
m_startsEnabled(false),
26+
m_bioPortraitSmall(nullptr),
27+
m_bioPortraitLarge(nullptr),
28+
m_defeatedImage(nullptr),
29+
m_victoriousImage(nullptr)
30+
{
31+
}
32+
33+
GeneralPersona::~GeneralPersona() {}
34+
35+
void ChallengeGenerals::Init()
36+
{
37+
INI ini;
38+
ini.Load("Data/INI/ChallengeMode.ini", INI_LOAD_OVERWRITE, nullptr);
39+
}
40+
41+
void ChallengeGenerals::Parse_General_Persona(INI *ini, void *formal, void *store, void const *user_data)
42+
{
43+
static FieldParse _parse_table[] = {
44+
{ "StartsEnabled", &INI::Parse_Bool, nullptr, offsetof(GeneralPersona, m_startsEnabled) },
45+
{ "BioNameString", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_bioNameString) },
46+
{ "BioDOBString", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_bioDOBString) },
47+
{ "BioBirthplaceString", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_bioBirthplaceString) },
48+
{ "BioStrategyString", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_bioStrategyString) },
49+
{ "BioRankString", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_bioRankString) },
50+
{ "BioBranchString", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_bioBranchString) },
51+
{ "BioClassNumberString", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_bioClassNumberString) },
52+
{ "BioPortraitSmall", &ImageCollection::Parse_Mapped_Image, nullptr, offsetof(GeneralPersona, m_bioPortraitSmall) },
53+
{ "BioPortraitLarge", &ImageCollection::Parse_Mapped_Image, nullptr, offsetof(GeneralPersona, m_bioPortraitLarge) },
54+
{ "Campaign", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_campaign) },
55+
{ "PlayerTemplate", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_playerTemplate) },
56+
{ "PortraitMovieLeftName", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_portraitMovieLeftName) },
57+
{ "PortraitMovieRightName", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_portraitMovieRightName) },
58+
{ "DefeatedImage", &ImageCollection::Parse_Mapped_Image, nullptr, offsetof(GeneralPersona, m_defeatedImage) },
59+
{ "VictoriousImage", &ImageCollection::Parse_Mapped_Image, nullptr, offsetof(GeneralPersona, m_victoriousImage) },
60+
{ "DefeatedString", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_defeatedString) },
61+
{ "VictoriousString", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_victoriousString) },
62+
{ "SelectionSound", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_selectionSound) },
63+
{ "TauntSound1", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_tauntSound1) },
64+
{ "TauntSound2", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_tauntSound2) },
65+
{ "TauntSound3", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_tauntSound3) },
66+
{ "WinSound", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_winSound) },
67+
{ "LossSound", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_lossSound) },
68+
{ "PreviewSound", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_previewSound) },
69+
{ "NameSound", &INI::Parse_AsciiString, nullptr, offsetof(GeneralPersona, m_nameSound) },
70+
{ nullptr, nullptr, nullptr, 0 }
71+
};
72+
73+
ini->Init_From_INI(store, _parse_table);
74+
}
75+
76+
void ChallengeGenerals::Parse_Challenge_Mode_Definition(INI *ini)
77+
{
78+
static FieldParse _parse_table[] = {
79+
{ "GeneralPersona0", &Parse_General_Persona, nullptr, offsetof(ChallengeGenerals, m_personas[0]) },
80+
{ "GeneralPersona1", &Parse_General_Persona, nullptr, offsetof(ChallengeGenerals, m_personas[1]) },
81+
{ "GeneralPersona2", &Parse_General_Persona, nullptr, offsetof(ChallengeGenerals, m_personas[2]) },
82+
{ "GeneralPersona3", &Parse_General_Persona, nullptr, offsetof(ChallengeGenerals, m_personas[3]) },
83+
{ "GeneralPersona4", &Parse_General_Persona, nullptr, offsetof(ChallengeGenerals, m_personas[4]) },
84+
{ "GeneralPersona5", &Parse_General_Persona, nullptr, offsetof(ChallengeGenerals, m_personas[5]) },
85+
{ "GeneralPersona6", &Parse_General_Persona, nullptr, offsetof(ChallengeGenerals, m_personas[6]) },
86+
{ "GeneralPersona7", &Parse_General_Persona, nullptr, offsetof(ChallengeGenerals, m_personas[7]) },
87+
{ "GeneralPersona8", &Parse_General_Persona, nullptr, offsetof(ChallengeGenerals, m_personas[8]) },
88+
{ "GeneralPersona9", &Parse_General_Persona, nullptr, offsetof(ChallengeGenerals, m_personas[9]) },
89+
{ "GeneralPersona10", &Parse_General_Persona, nullptr, offsetof(ChallengeGenerals, m_personas[10]) },
90+
{ "GeneralPersona11", &Parse_General_Persona, nullptr, offsetof(ChallengeGenerals, m_personas[11]) },
91+
{ nullptr, nullptr, nullptr, 0 }
92+
};
93+
94+
if (g_theChallengeGenerals) {
95+
ini->Init_From_INI(g_theChallengeGenerals, _parse_table);
96+
}
97+
}
98+
99+
GeneralPersona *ChallengeGenerals::Get_Player_General_By_Campaign_Name(Utf8String name)
100+
{
101+
for (int i = 0; i < Number_Of_Personas(); ++i) {
102+
Utf8String campaign_name = m_personas[i].Get_Campaign_Name();
103+
104+
if (campaign_name.Compare_No_Case(name) == 0) {
105+
return &m_personas[i];
106+
}
107+
}
108+
109+
captainslog_debug("Can't find General by Campaign Name");
110+
111+
return nullptr;
112+
}
113+
114+
GeneralPersona *ChallengeGenerals::Get_Player_General_By_General_Name(Utf8String name)
115+
{
116+
for (int i = 0; i < Number_Of_Personas(); ++i) {
117+
Utf8String campaign_name = m_personas[i].Get_General_Name();
118+
119+
if (campaign_name.Compare_No_Case(name) == 0) {
120+
return &m_personas[i];
121+
}
122+
}
123+
124+
captainslog_debug("Can't find General by General Name");
125+
126+
return nullptr;
127+
}
128+
129+
GeneralPersona *ChallengeGenerals::Get_Player_General_By_Template_Name(Utf8String name)
130+
{
131+
for (int i = 0; i < Number_Of_Personas(); ++i) {
132+
Utf8String campaign_name = m_personas[i].Get_Player_Template_Name();
133+
134+
if (campaign_name.Compare_No_Case(name) == 0) {
135+
return &m_personas[i];
136+
}
137+
}
138+
139+
captainslog_debug("Can't find General by Template Name");
140+
141+
return nullptr;
142+
}
143+
144+
int ChallengeGenerals::Number_Of_Personas() const
145+
{
146+
return NUM_GENERALS;
147+
}
148+
149+
ChallengeGenerals *Create_Challenge_Generals()
150+
{
151+
return new ChallengeGenerals;
152+
}
Lines changed: 113 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,113 @@
1+
/**
2+
* @file
3+
*
4+
* @author tomsons26
5+
*
6+
* @brief
7+
*
8+
* @copyright Thyme is free software: you can redistribute it and/or
9+
* modify it under the terms of the GNU General Public License
10+
* as published by the Free Software Foundation, either version
11+
* 2 of the License, or (at your option) any later version.
12+
* A full copy of the GNU General Public License can be found in
13+
* LICENSE
14+
*/
15+
16+
#include "always.h"
17+
#include "asciistring.h"
18+
#include "gamelogic.h"
19+
20+
class Image;
21+
class INI;
22+
23+
class GeneralPersona
24+
{
25+
public:
26+
GeneralPersona();
27+
~GeneralPersona();
28+
29+
Utf8String Get_Campaign_Name() const { return m_campaign; }
30+
Utf8String Get_General_Name() const { return m_bioNameString; }
31+
Utf8String Get_Player_Template_Name() const { return m_playerTemplate; }
32+
33+
bool Get_Starts_Enabled() const { return m_startsEnabled; }
34+
void Set_Starts_Enabled(bool state) { m_startsEnabled = state; }
35+
36+
public:
37+
bool m_startsEnabled;
38+
39+
Utf8String m_bioNameString;
40+
Utf8String m_bioDOBString;
41+
Utf8String m_bioBirthplaceString;
42+
Utf8String m_bioStrategyString;
43+
Utf8String m_bioRankString;
44+
Utf8String m_bioBranchString;
45+
Utf8String m_bioClassNumberString;
46+
Image *m_bioPortraitSmall;
47+
Image *m_bioPortraitLarge;
48+
49+
Utf8String m_campaign;
50+
Utf8String m_playerTemplate;
51+
52+
Utf8String m_portraitMovieLeftName;
53+
Utf8String m_portraitMovieRightName;
54+
55+
Image *m_defeatedImage;
56+
Image *m_victoriousImage;
57+
58+
Utf8String m_defeatedString;
59+
Utf8String m_victoriousString;
60+
61+
Utf8String m_selectionSound;
62+
Utf8String m_tauntSound1;
63+
Utf8String m_tauntSound2;
64+
Utf8String m_tauntSound3;
65+
Utf8String m_winSound;
66+
Utf8String m_lossSound;
67+
Utf8String m_previewSound;
68+
Utf8String m_nameSound;
69+
};
70+
71+
class ChallengeGenerals
72+
{
73+
public:
74+
enum
75+
{
76+
NUM_GENERALS = 12
77+
};
78+
79+
public:
80+
ChallengeGenerals() : m_personas(), m_playerFaction(0), m_difficulty(DIFFICULTY_EASY) {}
81+
82+
void Init();
83+
84+
static void Parse_General_Persona(INI *ini, void *formal, void *store, void const *user_data);
85+
static void Parse_Challenge_Mode_Definition(INI *ini);
86+
87+
GeneralPersona *Get_Player_General_By_Campaign_Name(Utf8String name);
88+
GeneralPersona *Get_Player_General_By_General_Name(Utf8String name);
89+
GeneralPersona *Get_Player_General_By_Template_Name(Utf8String name);
90+
91+
GeneralPersona *Get_Personas() { return m_personas; }
92+
93+
int Get_Player_Faction() const { return m_playerFaction; }
94+
void Set_Player_Faction(int faction) { m_playerFaction = faction; }
95+
96+
GameDifficulty Get_Difficulty() const { return m_difficulty; }
97+
void Set_Difficulty(GameDifficulty diff) { m_difficulty = diff; }
98+
99+
int Number_Of_Personas() const;
100+
101+
private:
102+
GeneralPersona m_personas[NUM_GENERALS];
103+
int m_playerFaction;
104+
GameDifficulty m_difficulty;
105+
};
106+
107+
ChallengeGenerals *Create_Challenge_Generals();
108+
109+
#ifdef GAME_DLL
110+
extern ChallengeGenerals *&g_theChallengeGenerals;
111+
#else
112+
extern ChallengeGenerals *g_theChallengeGenerals;
113+
#endif

src/hooker/setupglobals_zh.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -656,3 +656,8 @@ WeaponStore *&g_theWeaponStore = Make_Global<WeaponStore *>(PICK_ADDRESS(0x00A2B
656656
// team.cpp
657657
class TeamFactory;
658658
TeamFactory *&g_theTeamFactory = Make_Global<TeamFactory *>(PICK_ADDRESS(0x00A2BBE8, 0x04CA864C));
659+
660+
// challengegenerals.cpp
661+
class ChallengeGenerals;
662+
ChallengeGenerals *&g_theChallengeGenerals = Make_Global<ChallengeGenerals *>(PICK_ADDRESS(0x00A2C09C, 0x04CA9C78));
663+

0 commit comments

Comments
 (0)