From 8b8c6e38e4253233cbcacd4c1b2d22f862d27ae6 Mon Sep 17 00:00:00 2001
From: Sam Lantinga <[EMAIL REDACTED]>
Date: Sat, 14 Mar 2026 15:08:05 -0700
Subject: [PATCH] Added support for Steam achievements
---
game/Maelstrom_Globals.h | 1 +
game/game.cpp | 50 ++++++++++++++----
game/main.cpp | 10 ++++
game/objects.h | 10 ++++
game/player.cpp | 12 +++++
game/player.h | 8 +++
game/steam.cpp | 20 +++++++
game/steam.h | 1 +
.../assets/achievements/ACHIEVEMENT_BONUS.xcf | Bin 0 -> 30052 bytes
.../achievements/ACHIEVEMENT_BONUS_2.png | Bin 0 -> 3102 bytes
.../achievements/ACHIEVEMENT_BONUS_2_GRAY.png | Bin 0 -> 2133 bytes
.../achievements/ACHIEVEMENT_BONUS_4.png | Bin 0 -> 3008 bytes
.../achievements/ACHIEVEMENT_BONUS_4_GRAY.png | Bin 0 -> 2064 bytes
.../achievements/ACHIEVEMENT_BONUS_6.png | Bin 0 -> 3203 bytes
.../achievements/ACHIEVEMENT_BONUS_6_GRAY.png | Bin 0 -> 2128 bytes
.../achievements/ACHIEVEMENT_BONUS_8.png | Bin 0 -> 3430 bytes
.../achievements/ACHIEVEMENT_BONUS_8_GRAY.png | Bin 0 -> 2224 bytes
.../achievements/ACHIEVEMENT_STEEL_BALLS.png | Bin 0 -> 4040 bytes
.../achievements/ACHIEVEMENT_STEEL_BALLS.xcf | Bin 0 -> 16053 bytes
.../ACHIEVEMENT_STEEL_BALLS_GRAY.png | Bin 0 -> 2618 bytes
.../assets/achievements/ACHIEVEMENT_WAVE.xcf | Bin 0 -> 65791 bytes
.../achievements/ACHIEVEMENT_WAVE_1.png | Bin 0 -> 2038 bytes
.../achievements/ACHIEVEMENT_WAVE_10.png | Bin 0 -> 2715 bytes
.../achievements/ACHIEVEMENT_WAVE_10_GRAY.png | Bin 0 -> 1847 bytes
.../achievements/ACHIEVEMENT_WAVE_15.png | Bin 0 -> 2729 bytes
.../achievements/ACHIEVEMENT_WAVE_15_GRAY.png | Bin 0 -> 1880 bytes
.../achievements/ACHIEVEMENT_WAVE_1_GRAY.png | Bin 0 -> 1499 bytes
.../achievements/ACHIEVEMENT_WAVE_20.png | Bin 0 -> 2952 bytes
.../achievements/ACHIEVEMENT_WAVE_20_GRAY.png | Bin 0 -> 2036 bytes
.../achievements/ACHIEVEMENT_WAVE_25.png | Bin 0 -> 2946 bytes
.../achievements/ACHIEVEMENT_WAVE_25_GRAY.png | Bin 0 -> 2076 bytes
.../achievements/ACHIEVEMENT_WAVE_30.png | Bin 0 -> 3015 bytes
.../achievements/ACHIEVEMENT_WAVE_30_GRAY.png | Bin 0 -> 2032 bytes
.../achievements/ACHIEVEMENT_WAVE_35.png | Bin 0 -> 3043 bytes
.../achievements/ACHIEVEMENT_WAVE_35_GRAY.png | Bin 0 -> 2077 bytes
.../achievements/ACHIEVEMENT_WAVE_40.png | Bin 0 -> 2899 bytes
.../achievements/ACHIEVEMENT_WAVE_40_GRAY.png | Bin 0 -> 1941 bytes
.../achievements/ACHIEVEMENT_WAVE_45.png | Bin 0 -> 2938 bytes
.../achievements/ACHIEVEMENT_WAVE_45_GRAY.png | Bin 0 -> 1971 bytes
.../achievements/ACHIEVEMENT_WAVE_5.png | Bin 0 -> 2594 bytes
.../achievements/ACHIEVEMENT_WAVE_50.png | Bin 0 -> 3024 bytes
.../achievements/ACHIEVEMENT_WAVE_50_GRAY.png | Bin 0 -> 2015 bytes
.../achievements/ACHIEVEMENT_WAVE_5_GRAY.png | Bin 0 -> 1834 bytes
steam/assets/numbers.xcf | Bin 0 -> 12428 bytes
44 files changed, 101 insertions(+), 11 deletions(-)
create mode 100755 steam/assets/achievements/ACHIEVEMENT_BONUS.xcf
create mode 100755 steam/assets/achievements/ACHIEVEMENT_BONUS_2.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_BONUS_2_GRAY.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_BONUS_4.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_BONUS_4_GRAY.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_BONUS_6.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_BONUS_6_GRAY.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_BONUS_8.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_BONUS_8_GRAY.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_STEEL_BALLS.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_STEEL_BALLS.xcf
create mode 100755 steam/assets/achievements/ACHIEVEMENT_STEEL_BALLS_GRAY.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE.xcf
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_1.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_10.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_10_GRAY.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_15.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_15_GRAY.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_1_GRAY.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_20.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_20_GRAY.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_25.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_25_GRAY.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_30.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_30_GRAY.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_35.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_35_GRAY.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_40.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_40_GRAY.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_45.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_45_GRAY.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_5.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_50.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_50_GRAY.png
create mode 100755 steam/assets/achievements/ACHIEVEMENT_WAVE_5_GRAY.png
create mode 100755 steam/assets/numbers.xcf
diff --git a/game/Maelstrom_Globals.h b/game/Maelstrom_Globals.h
index 330b0fa8..338a7c99 100644
--- a/game/Maelstrom_Globals.h
+++ b/game/Maelstrom_Globals.h
@@ -73,6 +73,7 @@ extern void PrintUsage(void);
extern int DrawText(int x, int y, const char *text, MFont *font, Uint8 style,
Uint8 R, Uint8 G, Uint8 B);
extern void DelayFrame(void);
+extern void DelayAndDraw(int ticks);
// Functions from init.cpp
extern void SetStar(int which);
diff --git a/game/game.cpp b/game/game.cpp
index 55ad52bd..af67ef81 100644
--- a/game/game.cpp
+++ b/game/game.cpp
@@ -813,7 +813,7 @@ GamePanelDelegate::DoBonus()
/* Fade in */
screen->FadeIn();
while ( sound->Playing() )
- Delay(SOUND_DELAY);
+ DelayAndDraw(SOUND_DELAY);
/* -- Count the score down */
@@ -823,6 +823,20 @@ GamePanelDelegate::DoBonus()
if (!gPlayers[i]->IsValid()) {
continue;
}
+
+ if (gPlayers[i]->CanGetSinglePlayerAchievement()) {
+ int bonus = gPlayers[i]->GetBonus() * gPlayers[i]->GetBonusMult();
+ if (bonus >= 8000) {
+ GrantAchievement("ACHIEVEMENT_BONUS_8");
+ } else if (bonus >= 6000) {
+ GrantAchievement("ACHIEVEMENT_BONUS_6");
+ } else if (bonus >= 4000) {
+ GrantAchievement("ACHIEVEMENT_BONUS_4");
+ } else if (bonus >= 2000) {
+ GrantAchievement("ACHIEVEMENT_BONUS_2");
+ }
+ }
+
if (i != gDisplayed) {
gPlayers[i]->MultBonus();
continue;
@@ -837,7 +851,7 @@ GamePanelDelegate::DoBonus()
bonus = panel->GetElement<UIElement>("multiplied_bonus");
TheShip->MultBonus();
- Delay(SOUND_DELAY);
+ DelayAndDraw(SOUND_DELAY);
sound->PlaySound(gMultiplier, 5);
SDL_snprintf(numbuf, sizeof(numbuf), "multiplier%d", TheShip->GetBonusMult());
@@ -846,11 +860,10 @@ GamePanelDelegate::DoBonus()
image->Show();
}
- ui->Draw();
- Delay(60);
+ DelayAndDraw(60);
}
}
- Delay(SOUND_DELAY);
+ DelayAndDraw(SOUND_DELAY);
sound->PlaySound(gFunk, 5);
if (bonus) {
@@ -864,19 +877,19 @@ GamePanelDelegate::DoBonus()
score->Show();
}
ui->Draw();
- Delay(60);
+ DelayAndDraw(60);
/* -- Praise them or taunt them as the case may be */
if (TheShip->GetBonus() == 0) {
- Delay(SOUND_DELAY);
+ DelayAndDraw(SOUND_DELAY);
sound->PlaySound(gNoBonus, 5);
}
if (TheShip->GetBonus() > 10000) {
- Delay(SOUND_DELAY);
+ DelayAndDraw(SOUND_DELAY);
sound->PlaySound(gPrettyGood, 5);
}
while ( sound->Playing() )
- Delay(SOUND_DELAY);
+ DelayAndDraw(SOUND_DELAY);
/* -- Count the score down */
OBJ_LOOP(i, MAX_PLAYERS) {
@@ -893,7 +906,7 @@ GamePanelDelegate::DoBonus()
while (TheShip->GetBonus() > 0) {
while ( sound->Playing() )
- Delay(SOUND_DELAY);
+ DelayAndDraw(SOUND_DELAY);
sound->PlaySound(gBonk, 5);
if ( TheShip->GetBonus() >= 500 ) {
@@ -917,7 +930,7 @@ GamePanelDelegate::DoBonus()
}
}
while ( sound->Playing() )
- Delay(SOUND_DELAY);
+ DelayAndDraw(SOUND_DELAY);
HandleEvents(10);
/* -- Draw the "next wave" message */
@@ -957,6 +970,21 @@ GamePanelDelegate::NextWave()
gShakeTime = 0;
gFreezeTime = 0;
+ if (gWave > 0 && (gWave == 1 || (gWave % 5) == 0)) {
+ char achievement[32];
+
+ SDL_snprintf(achievement, sizeof(achievement), "ACHIEVEMENT_WAVE_%d", gWave);
+ OBJ_LOOP(i, MAX_PLAYERS) {
+ if (!gPlayers[i]->IsValid()) {
+ continue;
+ }
+
+ if (gPlayers[i]->CanGetSinglePlayerAchievement()) {
+ GrantAchievement(achievement);
+ }
+ }
+ }
+
if (gWave != (gGameInfo.wave - 1))
DoBonus();
diff --git a/game/main.cpp b/game/main.cpp
index a1e5bf35..47396d02 100644
--- a/game/main.cpp
+++ b/game/main.cpp
@@ -553,3 +553,13 @@ void DelayFrame(void)
}
gLastDrawn = ticks;
}
+
+void DelayAndDraw(int ticks)
+{
+ while (ticks >= 2) {
+ screen->Update();
+ Delay(2);
+ ticks -= 2;
+ }
+ Delay(ticks);
+}
diff --git a/game/objects.h b/game/objects.h
index 9356062f..33f56e03 100644
--- a/game/objects.h
+++ b/game/objects.h
@@ -553,6 +553,7 @@ class SteelRoid : public Object {
}
int Explode(void) {
+ int i;
int newsprite;
/* Don't do anything if we're already exploding */
@@ -573,6 +574,15 @@ class SteelRoid : public Object {
/* Blow up! */
case 1:
+ OBJ_LOOP(i, MAX_PLAYERS) {
+ if (!gPlayers[i]->IsValid()) {
+ continue;
+ }
+
+ if (gPlayers[i]->CanGetSinglePlayerAchievement()) {
+ GrantAchievement("ACHIEVEMENT_STEEL_BALLS");
+ }
+ }
return(Object::Explode());
/* Turn into a homing mine */
diff --git a/game/player.cpp b/game/player.cpp
index b9235792..560084e5 100644
--- a/game/player.cpp
+++ b/game/player.cpp
@@ -706,6 +706,18 @@ Player::SetControl(unsigned char which, bool enabled)
QueueInput(EncodeInput(which, enabled));
}
+bool
+Player::CanGetAchievement()
+{
+ if (gReplay.IsRecording() && !gReplay.HasContinues() &&
+ !gGameInfo.IsKidMode() &&
+ (gGameInfo.wave == 1) && (gGameInfo.lives == 3) &&
+ IS_LOCAL_CONTROL(controlType)) {
+ return true;
+ }
+ return false;
+}
+
/* Private functions... */
int
diff --git a/game/player.h b/game/player.h
index 9d656141..7731a974 100644
--- a/game/player.h
+++ b/game/player.h
@@ -138,6 +138,14 @@ class Player : public Object {
}
void SetControl(unsigned char which, bool enabled);
+ bool CanGetSinglePlayerAchievement() {
+ return CanGetAchievement() && !gGameInfo.IsMultiplayer();
+ }
+ bool CanGetMultiPlayerAchievement() {
+ return CanGetAchievement() && gGameInfo.IsMultiplayer();
+ }
+ bool CanGetAchievement();
+
private:
int Valid;
int Index;
diff --git a/game/steam.cpp b/game/steam.cpp
index 71adfddb..c4b0e607 100644
--- a/game/steam.cpp
+++ b/game/steam.cpp
@@ -47,6 +47,7 @@ class SteamInterface
void SetSteamTimelineMode(STEAM_TIMELINE_MODE mode);
void SetSteamTimelineLevelStarted(int level);
void SetSteamTimelineEvent(STEAM_TIMELINE_EVENT event);
+ void GrantAchievement(const char *achievement);
void Update();
@@ -203,6 +204,16 @@ void SteamInterface::SetSteamTimelineEvent(STEAM_TIMELINE_EVENT event)
SteamTimeline()->AddInstantaneousTimelineEvent(title, nullptr, icon, 0, 0.0f, k_ETimelineEventClipPriority_Standard);
}
+void SteamInterface::GrantAchievement(const char *achievement)
+{
+ if (!m_initialized) {
+ return;
+ }
+
+ SteamUserStats()->SetAchievement(achievement);
+ SteamUserStats()->StoreStats();
+}
+
void SteamInterface::Update()
{
if (!m_initialized) {
@@ -523,6 +534,11 @@ void SetSteamTimelineEvent(STEAM_TIMELINE_EVENT event)
steam.SetSteamTimelineEvent(event);
}
+void GrantAchievement(const char *achievement)
+{
+ steam.GrantAchievement(achievement);
+}
+
void UpdateSteam()
{
steam.Update();
@@ -585,6 +601,10 @@ void SetSteamTimelineEvent(STEAM_TIMELINE_EVENT event)
{
}
+void GrantAchievement(const char *achievement)
+{
+}
+
void UpdateSteam()
{
}
diff --git a/game/steam.h b/game/steam.h
index 966ad9f6..f773bf92 100644
--- a/game/steam.h
+++ b/game/steam.h
@@ -55,6 +55,7 @@ extern void DisableRemoteInput();
extern void SetSteamTimelineMode(STEAM_TIMELINE_MODE mode);
extern void SetSteamTimelineLevelStarted(int level);
extern void SetSteamTimelineEvent(STEAM_TIMELINE_EVENT event);
+extern void GrantAchievement(const char *achievement);
extern void UpdateSteam();
extern void QuitSteam();
diff --git a/steam/assets/achievements/ACHIEVEMENT_BONUS.xcf b/steam/assets/achievements/ACHIEVEMENT_BONUS.xcf
new file mode 100755
index 0000000000000000000000000000000000000000..b01d0629dbe5dcd29aa041c9e798c4b6d71735d5
GIT binary patch
literal 30052
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
ZgRe3IN+_5m3}R);i|eyKke=|t`Y&voM_K>?
literal 0
HcmV?d00001
diff --git a/steam/assets/achievements/ACHIEVEMENT_BONUS_2.png b/steam/assets/achievements/ACHIEVEMENT_BONUS_2.png
new file mode 100755
index 0000000000000000000000000000000000000000..034f5df6a4054d34021f938f064f7acbe294eb69
GIT binary patch
literal 3102
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
H>c&3-Stpt$
literal 0
HcmV?d00001
diff --git a/steam/assets/achievements/ACHIEVEMENT_BONUS_2_GRAY.png b/steam/assets/achievements/ACHIEVEMENT_BONUS_2_GRAY.png
new file mode 100755
index 0000000000000000000000000000000000000000..360b28366fe235bae116504f8b1f6f284139e2f3
GIT binary patch
literal 2133
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
literal 0
HcmV?d00001
diff --git a/steam/assets/achievements/ACHIEVEMENT_BONUS_4.png b/steam/assets/achievements/ACHIEVEMENT_BONUS_4.png
new file mode 100755
index 0000000000000000000000000000000000000000..9101be70482e32cde8480e1c1a980c56d73f9d22
GIT binary patch
literal 3008
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
literal 0
HcmV?d00001
diff --git a/steam/assets/achievements/ACHIEVEMENT_BONUS_4_GRAY.png b/steam/assets/achievements/ACHIEVEMENT_BONUS_4_GRAY.png
new file mode 100755
index 0000000000000000000000000000000000000000..81567aedadd8b4f10e01f3c829c5bb142d48612a
GIT binary patch
literal 2064
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
Qm)3NuovUq`4fDdk0J&vg*#H0l
literal 0
HcmV?d00001
diff --git a/steam/assets/achievements/ACHIEVEMENT_BONUS_6.png b/steam/assets/achievements/ACHIEVEMENT_BONUS_6.png
new file mode 100755
index 000000000000000000
(Patch may be truncated, please check the link at the top of this post.)