Skip to content

Commit b4764e4

Browse files
committed
eliminate Assets.NewAchievement
1 parent 51e0eee commit b4764e4

15 files changed

Lines changed: 180 additions & 166 deletions

src/devkit/data/models/AchievementModel.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -148,7 +148,7 @@ void AchievementModel::CommitTransaction()
148148
bool AchievementModel::IsShownInList() const
149149
{
150150
// don't show warning achievements in asset list
151-
if (GetID() > 101000000 && GetCategory() == AssetCategory::Core)
151+
if (GetID() >= FirstWarningAchievementId && GetCategory() == AssetCategory::Core)
152152
return false;
153153

154154
return true;

src/devkit/data/models/AchievementModel.hh

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,6 +193,11 @@ public:
193193
/// </summary>
194194
static constexpr size_t MaxSerializedLength = 65535;
195195

196+
/// <summary>
197+
/// Gets the unique ientifier of the first warning achievement.
198+
/// </summary>
199+
static constexpr uint32_t FirstWarningAchievementId = 101000001;
200+
196201
protected:
197202
void OnValueChanged(const IntModelProperty::ChangeArgs& args) override;
198203
void OnValueChanged(const StringModelProperty::ChangeArgs& args) override;

src/devkit/data/models/GameAssets.cpp

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -46,18 +46,6 @@ const ra::data::models::AssetModelBase* GameAssets::FindAsset(ra::data::models::
4646
return nullptr;
4747
}
4848

49-
ra::data::models::AchievementModel& GameAssets::NewAchievement()
50-
{
51-
auto vmAchievement = std::make_unique<ra::data::models::AchievementModel>();
52-
vmAchievement->SetID(m_nNextLocalId++);
53-
vmAchievement->SetPoints(0);
54-
vmAchievement->SetNew();
55-
vmAchievement->CreateServerCheckpoint();
56-
vmAchievement->CreateLocalCheckpoint();
57-
58-
return dynamic_cast<ra::data::models::AchievementModel&>(AddItem(std::move(vmAchievement)));
59-
}
60-
6149
ra::data::models::AssetCategory GameAssets::MostPublishedAssetCategory() const
6250
{
6351
bool bHasLocalAssets = false;

src/devkit/data/models/GameAssets.hh

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -56,11 +56,6 @@ public:
5656
return dynamic_cast<const ra::data::models::AchievementModel*>(FindAsset(ra::data::models::AssetType::Achievement, nId));
5757
}
5858

59-
/// <summary>
60-
/// Creates a new achievement asset.
61-
/// </summary>
62-
ra::data::models::AchievementModel& NewAchievement();
63-
6459
/// <summary>
6560
/// Finds the leaderboard asset for the specified ID.
6661
/// </summary>

src/ui/viewmodels/AssetListViewModel.cpp

Lines changed: 23 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1933,22 +1933,26 @@ void AssetListViewModel::CloneSelected()
19331933
const auto* pSourceAchievement = dynamic_cast<const ra::data::models::AchievementModel*>(pAsset);
19341934
if (pSourceAchievement != nullptr)
19351935
{
1936-
auto& vmAchievement = pGameContext.Assets().NewAchievement();
1937-
vmAchievement.SetSubsetID(pSourceAchievement->GetSubsetID());
1938-
vmAchievement.SetCategory(ra::data::models::AssetCategory::Local);
1939-
vmAchievement.SetAuthor(pAuthor);
1940-
vmAchievement.UpdateServerCheckpoint();
1941-
1942-
vmAchievement.SetName(pSourceAchievement->GetTitle() + L" (copy)");
1943-
vmAchievement.SetDescription(pSourceAchievement->GetDescription());
1944-
vmAchievement.SetBadge(pSourceAchievement->GetBadge());
1945-
vmAchievement.SetPoints(pSourceAchievement->GetPoints());
1946-
vmAchievement.SetTrigger(pSourceAchievement->GetTrigger());
1947-
vmAchievement.SetAchievementType(pSourceAchievement->GetAchievementType());
1948-
vmAchievement.SetNew();
1949-
1936+
auto pAchievement = std::make_unique<ra::data::models::AchievementModel>();
1937+
pAchievement->SetID(pGameContext.Assets().GetNextLocalId());
1938+
pAchievement->SetSubsetID(pSourceAchievement->GetSubsetID());
1939+
pAchievement->SetCategory(ra::data::models::AssetCategory::Local);
1940+
pAchievement->SetAuthor(pAuthor);
1941+
pAchievement->CreateServerCheckpoint();
1942+
pAchievement->CreateLocalCheckpoint();
1943+
1944+
pAchievement->SetName(pSourceAchievement->GetTitle() + L" (copy)");
1945+
pAchievement->SetDescription(pSourceAchievement->GetDescription());
1946+
pAchievement->SetBadge(pSourceAchievement->GetBadge());
1947+
pAchievement->SetPoints(pSourceAchievement->GetPoints());
1948+
pAchievement->SetTrigger(pSourceAchievement->GetTrigger());
1949+
pAchievement->SetAchievementType(pSourceAchievement->GetAchievementType());
1950+
pAchievement->SetNew();
1951+
1952+
pAchievement->Validate(); // force re-validation now that everything is set
1953+
1954+
const auto& vmAchievement = dynamic_cast<ra::data::models::AchievementModel&>(pGameContext.Assets().Append(std::move(pAchievement)));
19501955
EnsureAppearsInFilteredList(vmAchievement);
1951-
19521956
vNewIDs.push_back(vmAchievement.GetID());
19531957
}
19541958

@@ -1961,6 +1965,7 @@ void AssetListViewModel::CloneSelected()
19611965
pLeaderboard->SetCategory(ra::data::models::AssetCategory::Local);
19621966
pLeaderboard->SetAuthor(pAuthor);
19631967
pLeaderboard->CreateServerCheckpoint();
1968+
pLeaderboard->CreateLocalCheckpoint();
19641969

19651970
pLeaderboard->SetName(pSourceLeaderboard->GetTitle() + L" (copy)");
19661971
pLeaderboard->SetDescription(pSourceLeaderboard->GetDescription());
@@ -1970,10 +1975,11 @@ void AssetListViewModel::CloneSelected()
19701975
pLeaderboard->SetValueDefinition(pSourceLeaderboard->GetValueDefinition());
19711976
pLeaderboard->SetValueFormat(pSourceLeaderboard->GetValueFormat());
19721977
pLeaderboard->SetLowerIsBetter(pSourceLeaderboard->IsLowerBetter());
1973-
pLeaderboard->CreateLocalCheckpoint();
19741978
pLeaderboard->SetNew();
19751979

1976-
auto& vmLeaderboard = dynamic_cast<ra::data::models::LeaderboardModel&>(pGameContext.Assets().Append(std::move(pLeaderboard)));
1980+
pLeaderboard->Validate(); // force re-validation now that everything is set
1981+
1982+
const auto& vmLeaderboard = dynamic_cast<ra::data::models::LeaderboardModel&>(pGameContext.Assets().Append(std::move(pLeaderboard)));
19771983
EnsureAppearsInFilteredList(vmLeaderboard);
19781984
vNewIDs.push_back(vmLeaderboard.GetID());
19791985
}

tests/Exports_Tests.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -441,17 +441,6 @@ TEST_CLASS(Exports_Tests)
441441
MockWindowManager mockWindowManager;
442442
MockClock mockClock;
443443

444-
ra::data::models::AchievementModel& MockAchievement(unsigned int nId)
445-
{
446-
auto& pAch = mockGameContext.Assets().NewAchievement();
447-
pAch.SetCategory(ra::data::models::AssetCategory::Core);
448-
pAch.SetID(nId);
449-
pAch.SetTrigger("1=1");
450-
pAch.UpdateServerCheckpoint();
451-
pAch.SetState(ra::data::models::AssetState::Active);
452-
return pAch;
453-
}
454-
455444
private:
456445
MockThreadPool mockThreadPool;
457446
MockServer mockServer;

tests/data/context/EmulatorContext_Tests.cpp

Lines changed: 0 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -76,20 +76,6 @@ TEST_CLASS(EmulatorContext_Tests)
7676
MockVersions(sClientVersion, sServerVersion, sServerVersion);
7777
}
7878

79-
ra::data::models::AchievementModel& MockAchievement()
80-
{
81-
auto& pAch = mockGameContext.Assets().NewAchievement();
82-
pAch.SetCategory(ra::data::models::AssetCategory::Core);
83-
pAch.SetID(1U);
84-
pAch.SetName(L"AchievementTitle");
85-
pAch.SetDescription(L"AchievementDescription");
86-
pAch.SetBadge(L"12345");
87-
pAch.SetPoints(5);
88-
pAch.SetState(ra::data::models::AssetState::Active);
89-
pAch.UpdateServerCheckpoint();
90-
return pAch;
91-
}
92-
9379
private:
9480
ra::services::ServiceLocator::ServiceOverride<EmulatorContext> m_Override;
9581
};

tests/data/context/GameContext_Tests.cpp

Lines changed: 4 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
#include "tests\mocks\MockConfiguration.hh"
3434
#include "tests\mocks\MockDesktop.hh"
3535
#include "tests\mocks\MockFrameEventQueue.hh"
36+
#include "tests\mocks\MockGameContext.hh"
3637
#include "tests\mocks\MockOverlayManager.hh"
3738
#include "tests\mocks\MockServer.hh"
3839
#include "tests\mocks\MockSessionTracker.hh"
@@ -122,27 +123,12 @@ TEST_CLASS(GameContext_Tests)
122123

123124
ra::data::models::AchievementModel& MockAchievement()
124125
{
125-
auto& pAch = Assets().NewAchievement();
126-
pAch.SetCategory(ra::data::models::AssetCategory::Core);
127-
pAch.SetID(1U);
128-
pAch.SetName(L"AchievementTitle");
129-
pAch.SetDescription(L"AchievementDescription");
130-
pAch.SetBadge(L"12345");
131-
pAch.SetPoints(5);
132-
pAch.SetState(ra::data::models::AssetState::Active);
133-
pAch.UpdateServerCheckpoint();
134-
return pAch;
126+
return ra::data::context::mocks::MockGameContext::MockAchievement(Assets(), ra::data::models::AssetCategory::Core);
135127
}
136128

137129
ra::data::models::LeaderboardModel& MockLeaderboard()
138130
{
139-
auto vmLeaderboard = std::make_unique<ra::data::models::LeaderboardModel>();
140-
vmLeaderboard->SetID(1U);
141-
vmLeaderboard->SetName(L"LeaderboardTitle");
142-
vmLeaderboard->SetDescription(L"LeaderboardDescription");
143-
vmLeaderboard->CreateServerCheckpoint();
144-
vmLeaderboard->CreateLocalCheckpoint();
145-
return dynamic_cast<ra::data::models::LeaderboardModel&>(Assets().Append(std::move(vmLeaderboard)));
131+
return ra::data::context::mocks::MockGameContext::MockLeaderboard(Assets(), ra::data::models::AssetCategory::Core);
146132
}
147133

148134
void RemoveNonAchievementAssets()
@@ -922,7 +908,7 @@ TEST_CLASS(GameContext_Tests)
922908

923909
// new achievement should be allocated an ID higher than the largest existing local
924910
// ID, even if intermediate values are available
925-
const auto& pAch2 = game.Assets().NewAchievement();
911+
const auto& pAch2 = ra::data::context::mocks::MockGameContext::MockAchievement(game.Assets(), ra::data::models::AssetCategory::Local);
926912
Assert::AreEqual(999000004U, pAch2.GetID());
927913
}
928914

tests/devkit/data/models/GameAssets_Tests.cpp

Lines changed: 25 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -72,29 +72,35 @@ TEST_CLASS(GameAssets_Tests)
7272
ra::data::models::AchievementModel& AddAchievement(AssetCategory nCategory, unsigned nPoints, const std::wstring& sTitle,
7373
const std::wstring& sDescription, const std::wstring& sBadge, const std::string& sTrigger)
7474
{
75-
auto& pAchievement = NewAchievement();
76-
pAchievement.SetCategory(nCategory);
77-
pAchievement.SetPoints(nPoints);
78-
pAchievement.SetName(sTitle);
79-
pAchievement.SetDescription(sDescription);
80-
pAchievement.SetBadge(sBadge);
81-
pAchievement.SetTrigger(sTrigger);
82-
83-
std::wstring sAuthor = L"Auth";
84-
sAuthor.push_back(sBadge.front());
85-
pAchievement.SetAuthor(sAuthor);
75+
auto vmAchievement = std::make_unique<ra::data::models::AchievementModel>();
8676

8777
if (nCategory == AssetCategory::Local)
8878
{
89-
pAchievement.UpdateLocalCheckpoint();
79+
vmAchievement->CreateServerCheckpoint();
80+
vmAchievement->SetID(m_nNextLocalId++);
9081
}
9182
else
9283
{
93-
pAchievement.SetID(gsl::narrow_cast<uint32_t>(Count()));
94-
pAchievement.UpdateServerCheckpoint();
84+
vmAchievement->SetID(gsl::narrow_cast<uint32_t>(Count() + 1));
9585
}
9686

97-
return pAchievement;
87+
vmAchievement->SetCategory(nCategory);
88+
vmAchievement->SetPoints(nPoints);
89+
vmAchievement->SetName(sTitle);
90+
vmAchievement->SetDescription(sDescription);
91+
vmAchievement->SetBadge(sBadge);
92+
vmAchievement->SetTrigger(sTrigger);
93+
94+
std::wstring sAuthor = L"Auth";
95+
sAuthor.push_back(sBadge.front());
96+
vmAchievement->SetAuthor(sAuthor);
97+
98+
if (nCategory != AssetCategory::Local)
99+
vmAchievement->CreateServerCheckpoint();
100+
101+
vmAchievement->CreateLocalCheckpoint();
102+
103+
return dynamic_cast<ra::data::models::AchievementModel&>(Append(std::move(vmAchievement)));
98104
}
99105

100106
ra::data::models::AchievementModel& AddAchievement()
@@ -205,12 +211,12 @@ TEST_CLASS(GameAssets_Tests)
205211
{
206212
GameAssetsHarness gameAssets;
207213
gameAssets.AddAchievement(AssetCategory::Core, 5, L"Ach1", L"Desc1", L"11111", "1=1");
208-
gameAssets.AddAchievement(AssetCategory::Local, 5, L"Ach2", L"Desc2", L"22222", "2=2");
214+
const auto& vmAchievement = gameAssets.AddAchievement(AssetCategory::Local, 5, L"Ach2", L"Desc2", L"22222", "2=2");
209215
gameAssets.AddAchievement(AssetCategory::Unofficial, 5, L"Ach3", L"Desc3", L"33333", "3=3");
210216

211217
gameAssets.SaveAllAssets();
212218

213-
const auto& sExpected = ra::util::String::Printf("0.0.0.0\nGame Title\n%u:\"2=2\":Ach2:Desc2::::Auth2:5:::::22222\n", GameAssets::FirstLocalId + 1);
219+
const auto& sExpected = ra::util::String::Printf("0.0.0.0\nGame Title\n%u:\"2=2\":Ach2:Desc2::::Auth2:5:::::22222\n", vmAchievement.GetID());
214220
Assert::AreEqual(sExpected, gameAssets.GetUserFile());
215221
}
216222

@@ -746,11 +752,11 @@ TEST_CLASS(GameAssets_Tests)
746752
{
747753
GameAssetsHarness gameAssets;
748754
gameAssets.AddLeaderboard(AssetCategory::Core, L"LB1", L"Desc1", "0xH1234=1", "0xH1234=2", "0xH1234=3", "M:0xH1235", Value::Format::Seconds);
749-
gameAssets.AddLeaderboard(AssetCategory::Local, L"LB2", L"Desc2", "0xH2234=1", "0xH2234=2", "0xH2234=3", "M:0xH2235", Value::Format::Minutes);
755+
const auto& vmLeaderboard2 = gameAssets.AddLeaderboard(AssetCategory::Local, L"LB2", L"Desc2", "0xH2234=1", "0xH2234=2", "0xH2234=3", "M:0xH2235", Value::Format::Minutes);
750756

751757
gameAssets.SaveAllAssets();
752758

753-
const auto& sExpected = ra::util::String::Printf("0.0.0.0\nGame Title\nL%u:\"0xH2234=1\":\"0xH2234=2\":\"0xH2234=3\":\"M:0xH2235\":MINUTES:LB2:Desc2:0\n", GameAssets::FirstLocalId + 1);
759+
const auto& sExpected = ra::util::String::Printf("0.0.0.0\nGame Title\nL%u:\"0xH2234=1\":\"0xH2234=2\":\"0xH2234=3\":\"M:0xH2235\":MINUTES:LB2:Desc2:0\n", vmLeaderboard2.GetID());
754760
Assert::AreEqual(sExpected, gameAssets.GetUserFile());
755761
}
756762

tests/mocks/MockGameContext.hh

Lines changed: 86 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -39,7 +39,7 @@ public:
3939
m_nGameId = m_nActiveGameId = nGameId;
4040

4141
// MockRuntime may have populated an AchievementSet. Update it too
42-
auto* pPrimarySet = const_cast<ra::data::models::AchievementSetModel*>(Assets().AchievementSets().GetItemAt(0));
42+
GSL_SUPPRESS_TYPE3 auto* pPrimarySet = const_cast<ra::data::models::AchievementSetModel*>(Assets().AchievementSets().GetItemAt(0));
4343
if (pPrimarySet)
4444
{
4545
pPrimarySet->SetID(nGameId);
@@ -151,6 +151,91 @@ public:
151151
GSL_SUPPRESS_C128
152152
void InitializeFromAchievementRuntime();
153153

154+
static ra::data::models::AchievementModel& MockAchievement(ra::data::models::GameAssets& pAssets, ra::data::models::AssetCategory nCategory)
155+
{
156+
auto vmAchievement = std::make_unique<ra::data::models::AchievementModel>();
157+
158+
if (nCategory == ra::data::models::AssetCategory::Local)
159+
{
160+
vmAchievement->CreateServerCheckpoint();
161+
vmAchievement->SetID(pAssets.GetNextLocalId());
162+
}
163+
else
164+
{
165+
vmAchievement->SetID(gsl::narrow_cast<uint32_t>(pAssets.Count() + 1));
166+
}
167+
168+
vmAchievement->SetCategory(nCategory);
169+
vmAchievement->SetName(L"AchievementTitle");
170+
vmAchievement->SetDescription(L"AchievementDescription");
171+
vmAchievement->SetBadge(L"12345");
172+
vmAchievement->SetPoints(5);
173+
vmAchievement->SetState(ra::data::models::AssetState::Active);
174+
vmAchievement->SetTrigger("1=1");
175+
176+
if (nCategory != ra::data::models::AssetCategory::Local)
177+
vmAchievement->CreateServerCheckpoint();
178+
179+
vmAchievement->CreateLocalCheckpoint();
180+
return dynamic_cast<ra::data::models::AchievementModel&>(pAssets.Append(std::move(vmAchievement)));
181+
}
182+
183+
/// <summary>
184+
/// Creates a new AchievementModel for a promoted achievement.
185+
/// </summary>
186+
ra::data::models::AchievementModel& MockAchievement()
187+
{
188+
return MockAchievement(Assets(), ra::data::models::AssetCategory::Core);
189+
}
190+
191+
/// <summary>
192+
/// Creates a new AchievementModel for an unpromoted achievement.
193+
/// </summary>
194+
ra::data::models::AchievementModel& MockUnofficialAchievement()
195+
{
196+
return MockAchievement(Assets(), ra::data::models::AssetCategory::Unofficial);
197+
}
198+
199+
/// <summary>
200+
/// Creates a new AchievementModel for a promoted achievement.
201+
/// </summary>
202+
ra::data::models::AchievementModel& MockLocalAchievement()
203+
{
204+
return MockAchievement(Assets(), ra::data::models::AssetCategory::Local);
205+
}
206+
207+
static ra::data::models::LeaderboardModel& MockLeaderboard(ra::data::models::GameAssets& pAssets, ra::data::models::AssetCategory nCategory)
208+
{
209+
auto vmLeaderboard = std::make_unique<ra::data::models::AchievementModel>();
210+
211+
if (nCategory == ra::data::models::AssetCategory::Local)
212+
{
213+
vmLeaderboard->CreateServerCheckpoint();
214+
vmLeaderboard->SetID(pAssets.GetNextLocalId());
215+
}
216+
else
217+
{
218+
vmLeaderboard->SetID(gsl::narrow_cast<uint32_t>(pAssets.Count() + 1));
219+
}
220+
221+
vmLeaderboard->SetName(L"LeaderboardTitle");
222+
vmLeaderboard->SetDescription(L"LeaderboardDescription");
223+
224+
if (nCategory != ra::data::models::AssetCategory::Local)
225+
vmLeaderboard->CreateServerCheckpoint();
226+
227+
vmLeaderboard->CreateLocalCheckpoint();
228+
return dynamic_cast<ra::data::models::LeaderboardModel&>(pAssets.Append(std::move(vmLeaderboard)));
229+
}
230+
231+
/// <summary>
232+
/// Creates a new AchievementModel for a promoted achievement.
233+
/// </summary>
234+
ra::data::models::LeaderboardModel& MockLeaderboard()
235+
{
236+
return MockLeaderboard(Assets(), ra::data::models::AssetCategory::Core);
237+
}
238+
154239
private:
155240
class MockMemoryNotesModel : public ra::data::models::MemoryNotesModel
156241
{

0 commit comments

Comments
 (0)