Appearance
Steam Achievements
Unlock and query achievements.
Loading Stats
IMPORTANT
Before reading or writing stats, you must wait for Steam to load the stats data from the server. Call requestStatsAndWait() once at game start.
javascript
// At game start, after steam.init()
const statsReady = await steam.requestStatsAndWait(3000); // Wait up to 3 seconds
if (statsReady) {
console.log('Stats loaded, ready to use achievements and stats!');
} else {
console.warn('Could not load stats from Steam');
}Stats State
You can check the current stats loading state:
javascript
const state = await steam.getStatsState();
// 0 = not requested
// 1 = pending (waiting for Steam)
// 2 = ready (can read/write stats)
// 3 = failed
// Or use the helper:
const ready = await steam.areStatsReady(); // true/falseMethods
unlockAchievement(name)
Unlock an achievement.
javascript
await steam.unlockAchievement('ACH_WIN_FIRST_GAME');
await steam.storeStats(); // Required to savegetAchievement(name)
Check if achievement is unlocked.
javascript
const unlocked = await steam.getAchievement('ACH_WIN_FIRST_GAME');
// true or falseclearAchievement(name)
Clear an achievement (for testing).
javascript
await steam.clearAchievement('ACH_WIN_FIRST_GAME');
await steam.storeStats();storeStats()
Save achievements and stats to Steam.
javascript
await steam.storeStats();WARNING
Always call storeStats() after modifying achievements or stats.
Stats
setStatInt(name, value)
Set an integer stat.
javascript
await steam.setStatInt('TOTAL_KILLS', 100);
await steam.storeStats();getStatInt(name)
Get an integer stat. Returns 0 if stats are not loaded yet.
javascript
const kills = await steam.getStatInt('TOTAL_KILLS');TIP
Make sure to call requestStatsAndWait() at game start before reading stats.
setStatFloat(name, value)
Set a float stat.
javascript
await steam.setStatFloat('TOTAL_DISTANCE', 1234.56);
await steam.storeStats();getStatFloat(name)
Get a float stat. Returns 0 if stats are not loaded yet.
javascript
const distance = await steam.getStatFloat('TOTAL_DISTANCE');requestStats()
Request stats from Steam (async, returns immediately).
javascript
await steam.requestStats();requestStatsAndWait(timeoutMs)
Request stats and wait until they're loaded. Returns true if successful.
javascript
const ready = await steam.requestStatsAndWait(3000); // 3 second timeoutareStatsReady()
Check if stats have been loaded.
javascript
if (await steam.areStatsReady()) {
// Safe to read/write stats
}Examples
Basic Achievement
javascript
async function onBossDefeated(bossName) {
// Achievement for first boss
if (bossName === 'Dragon') {
await steam.unlockAchievement('ACH_DEFEAT_DRAGON');
await steam.storeStats();
}
}Progress Achievement
javascript
// At game start
async function initGame() {
// Wait for stats to load from Steam
const ready = await steam.requestStatsAndWait(3000);
if (!ready) {
console.warn('Stats not available');
}
}
async function onEnemyKilled() {
// Stats are already loaded, safe to read
const kills = await steam.getStatInt('TOTAL_KILLS') || 0;
await steam.setStatInt('TOTAL_KILLS', kills + 1);
// Achievement at 100 kills
if (kills + 1 >= 100) {
await steam.unlockAchievement('ACH_100_KILLS');
}
await steam.storeStats();
}Track Distance
javascript
let sessionDistance = 0;
function onMove(delta) {
sessionDistance += delta;
}
async function onGameEnd() {
const total = await steam.getStatFloat('TOTAL_DISTANCE') || 0;
await steam.setStatFloat('TOTAL_DISTANCE', total + sessionDistance);
// Achievement for 10km
if (total + sessionDistance >= 10000) {
await steam.unlockAchievement('ACH_MARATHON');
}
await steam.storeStats();
sessionDistance = 0;
}Multiple Achievements
javascript
const ACHIEVEMENTS = {
firstWin: 'ACH_FIRST_WIN',
perfectLevel: 'ACH_PERFECT',
speedrun: 'ACH_SPEEDRUN',
collector: 'ACH_ALL_ITEMS'
};
async function checkAchievements(gameState) {
if (gameState.wins >= 1) {
await steam.unlockAchievement(ACHIEVEMENTS.firstWin);
}
if (gameState.perfectLevels >= 1) {
await steam.unlockAchievement(ACHIEVEMENTS.perfectLevel);
}
if (gameState.fastestTime < 60) {
await steam.unlockAchievement(ACHIEVEMENTS.speedrun);
}
if (gameState.items.length >= 50) {
await steam.unlockAchievement(ACHIEVEMENTS.collector);
}
await steam.storeStats();
}Steamworks Dashboard
Define achievements in your Steamworks dashboard:
- Go to Steamworks Partner
- Select your app
- Navigate to Stats & Achievements
- Add achievements with API names
- Upload icons (64x64 locked, 64x64 unlocked)
