steamworks-ffi-node 0.1.1 → 0.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/steam.js CHANGED
@@ -1,51 +1,23 @@
1
1
  "use strict";
2
- var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
- if (k2 === undefined) k2 = k;
4
- var desc = Object.getOwnPropertyDescriptor(m, k);
5
- if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
- desc = { enumerable: true, get: function() { return m[k]; } };
7
- }
8
- Object.defineProperty(o, k2, desc);
9
- }) : (function(o, m, k, k2) {
10
- if (k2 === undefined) k2 = k;
11
- o[k2] = m[k];
12
- }));
13
- var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
14
- Object.defineProperty(o, "default", { enumerable: true, value: v });
15
- }) : function(o, v) {
16
- o["default"] = v;
17
- });
18
- var __importStar = (this && this.__importStar) || (function () {
19
- var ownKeys = function(o) {
20
- ownKeys = Object.getOwnPropertyNames || function (o) {
21
- var ar = [];
22
- for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
23
- return ar;
24
- };
25
- return ownKeys(o);
26
- };
27
- return function (mod) {
28
- if (mod && mod.__esModule) return mod;
29
- var result = {};
30
- if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
31
- __setModuleDefault(result, mod);
32
- return result;
33
- };
34
- })();
35
2
  Object.defineProperty(exports, "__esModule", { value: true });
36
- const koffi = __importStar(require("koffi"));
37
- const path = __importStar(require("path"));
38
- const fs = __importStar(require("fs"));
3
+ const SteamLibraryLoader_1 = require("./internal/SteamLibraryLoader");
4
+ const SteamAPICore_1 = require("./internal/SteamAPICore");
5
+ const SteamAchievementManager_1 = require("./internal/SteamAchievementManager");
39
6
  /**
40
7
  * Real Steamworks SDK implementation using Koffi FFI
41
8
  * This connects directly to the actual Steam client and Steamworks SDK
9
+ *
10
+ * Uses composition pattern with specialized modules:
11
+ * - SteamLibraryLoader: Handles FFI library loading and function binding
12
+ * - SteamAPICore: Manages Steam API lifecycle (init, shutdown, callbacks)
13
+ * - SteamAchievementManager: Handles all achievement operations
42
14
  */
43
15
  class SteamworksSDK {
44
16
  constructor() {
45
- this.steamLib = null;
46
- this.initialized = false;
47
- this.appId = 0;
48
- this.userStatsInterface = null;
17
+ // Initialize composed modules
18
+ this.libraryLoader = new SteamLibraryLoader_1.SteamLibraryLoader();
19
+ this.apiCore = new SteamAPICore_1.SteamAPICore(this.libraryLoader);
20
+ this.achievementManager = new SteamAchievementManager_1.SteamAchievementManager(this.libraryLoader, this.apiCore);
49
21
  }
50
22
  static getInstance() {
51
23
  if (!SteamworksSDK.instance) {
@@ -53,335 +25,173 @@ class SteamworksSDK {
53
25
  }
54
26
  return SteamworksSDK.instance;
55
27
  }
56
- /**
57
- * Get platform-specific Steam library path
58
- */
59
- getSteamLibraryPath() {
60
- const platform = process.platform;
61
- const arch = process.arch;
62
- let libPath;
63
- if (platform === 'win32') {
64
- if (arch === 'x64') {
65
- libPath = path.join(__dirname, '../steamworks_sdk/redistributable_bin/win64/steam_api64.dll');
66
- }
67
- else {
68
- libPath = path.join(__dirname, '../steamworks_sdk/redistributable_bin/steam_api.dll');
69
- }
70
- }
71
- else if (platform === 'darwin') {
72
- libPath = path.join(__dirname, '../steamworks_sdk/redistributable_bin/osx/libsteam_api.dylib');
73
- }
74
- else if (platform === 'linux') {
75
- libPath = path.join(__dirname, '../steamworks_sdk/redistributable_bin/linux64/libsteam_api.so');
76
- }
77
- else {
78
- throw new Error(`Unsupported platform: ${platform}`);
79
- }
80
- // Check if the library exists
81
- if (!fs.existsSync(libPath)) {
82
- throw new Error(`Steamworks SDK library not found at: ${libPath}\n` +
83
- 'Please download Steamworks SDK and place it in the steamworks_sdk/ directory.');
84
- }
85
- return libPath;
86
- }
87
28
  /**
88
29
  * Initialize Steam API with real Steamworks SDK
89
30
  */
90
31
  init(options) {
91
- try {
92
- this.appId = options.appId;
93
- // Set Steam App ID in environment
94
- process.env.SteamAppId = this.appId.toString();
95
- // Also create steam_appid.txt file (Steam requirement)
96
- const appIdFilePath = path.join(process.cwd(), 'steam_appid.txt');
97
- fs.writeFileSync(appIdFilePath, this.appId.toString());
98
- console.log(`🔌 Loading Steamworks SDK for App ID: ${this.appId}`);
99
- // Load Steam API library using Koffi
100
- const libPath = this.getSteamLibraryPath();
101
- console.log(`📚 Loading library: ${libPath}`);
102
- this.steamLib = koffi.load(libPath);
103
- // Define function signatures using Koffi
104
- this.SteamAPI_Init = this.steamLib.func('SteamAPI_InitSafe', 'bool', []);
105
- this.SteamAPI_Shutdown = this.steamLib.func('SteamAPI_Shutdown', 'void', []);
106
- this.SteamAPI_RunCallbacks = this.steamLib.func('SteamAPI_RunCallbacks', 'void', []);
107
- this.SteamAPI_IsSteamRunning = this.steamLib.func('SteamAPI_IsSteamRunning', 'bool', []);
108
- this.SteamAPI_SteamUserStats_v013 = this.steamLib.func('SteamAPI_SteamUserStats_v013', 'void*', []);
109
- this.SteamAPI_SteamUser_v023 = this.steamLib.func('SteamAPI_SteamUser_v023', 'void*', []);
110
- this.SteamAPI_ISteamUserStats_GetNumAchievements = this.steamLib.func('SteamAPI_ISteamUserStats_GetNumAchievements', 'uint32', ['void*']);
111
- this.SteamAPI_ISteamUserStats_GetAchievementName = this.steamLib.func('SteamAPI_ISteamUserStats_GetAchievementName', 'str', ['void*', 'uint32']);
112
- this.SteamAPI_ISteamUserStats_GetAchievementDisplayAttribute = this.steamLib.func('SteamAPI_ISteamUserStats_GetAchievementDisplayAttribute', 'str', ['void*', 'str', 'str']);
113
- this.SteamAPI_ISteamUserStats_GetAchievement = this.steamLib.func('SteamAPI_ISteamUserStats_GetAchievement', 'bool', ['void*', 'str', 'bool*']);
114
- this.SteamAPI_ISteamUserStats_SetAchievement = this.steamLib.func('SteamAPI_ISteamUserStats_SetAchievement', 'bool', ['void*', 'str']);
115
- this.SteamAPI_ISteamUserStats_ClearAchievement = this.steamLib.func('SteamAPI_ISteamUserStats_ClearAchievement', 'bool', ['void*', 'str']);
116
- this.SteamAPI_ISteamUserStats_StoreStats = this.steamLib.func('SteamAPI_ISteamUserStats_StoreStats', 'bool', ['void*']);
117
- this.SteamAPI_ISteamUserStats_RequestCurrentStats = this.steamLib.func('SteamAPI_ISteamUserStats_RequestUserStats', 'uint64', ['void*', 'uint64']);
118
- this.SteamAPI_ISteamUser_GetSteamID = this.steamLib.func('SteamAPI_ISteamUser_GetSteamID', 'uint64', ['void*']);
119
- console.log('🚀 Initializing Steam API...');
120
- // Initialize Steam API
121
- const initResult = this.SteamAPI_Init();
122
- if (!initResult) {
123
- throw new Error('SteamAPI_Init() failed. Make sure Steam client is running and you\'re logged in.');
124
- }
125
- // Check if Steam is running
126
- const steamRunning = this.SteamAPI_IsSteamRunning();
127
- if (!steamRunning) {
128
- console.warn('⚠️ Steam client might not be running properly');
129
- }
130
- // Get UserStats interface
131
- this.userStatsInterface = this.SteamAPI_SteamUserStats_v013();
132
- if (!this.userStatsInterface || this.userStatsInterface === null) {
133
- throw new Error('Failed to get SteamUserStats interface');
134
- }
135
- // Request current stats from Steam servers
136
- console.log('📊 Requesting current stats from Steam...');
137
- // Use 0 as SteamID to request stats for current user
138
- const statsRequested = this.SteamAPI_ISteamUserStats_RequestCurrentStats(this.userStatsInterface, 0);
139
- if (!statsRequested) {
140
- console.warn('⚠️ Failed to request current stats from Steam servers');
141
- }
142
- // Run callbacks to process any pending Steam events
143
- this.SteamAPI_RunCallbacks();
144
- this.initialized = true;
145
- console.log('✅ Steam API initialized successfully!');
146
- console.log(`🎮 Connected to Steam for App ID: ${this.appId}`);
147
- return true;
148
- }
149
- catch (error) {
150
- console.error('❌ Failed to initialize Steam API:', error.message);
151
- console.error('💡 Make sure:');
152
- console.error(' 1. Steam client is running and you\'re logged in');
153
- console.error(' 2. Steamworks SDK is in steamworks_sdk/ directory');
154
- console.error(' 3. You have Visual Studio C++ Redistributable installed');
155
- return false;
156
- }
32
+ return this.apiCore.init(options);
157
33
  }
158
34
  /**
159
35
  * Shutdown Steam API
160
36
  */
161
37
  shutdown() {
162
- if (this.steamLib && this.initialized) {
163
- console.log('🔌 Shutting down Steam API...');
164
- this.SteamAPI_Shutdown();
165
- this.initialized = false;
166
- this.userStatsInterface = null;
167
- console.log('✅ Steam API shutdown complete');
168
- }
38
+ this.apiCore.shutdown();
169
39
  }
170
40
  /**
171
41
  * Get current Steam status
172
42
  */
173
43
  getStatus() {
174
- let steamId = '0';
175
- if (this.initialized && this.steamLib) {
176
- try {
177
- const userInterface = this.SteamAPI_SteamUser_v023();
178
- if (userInterface && userInterface !== null) {
179
- const steamIdNum = this.SteamAPI_ISteamUser_GetSteamID(userInterface);
180
- steamId = steamIdNum.toString();
181
- }
182
- }
183
- catch (error) {
184
- console.warn('Failed to get Steam ID:', error.message);
185
- }
186
- }
187
- return {
188
- initialized: this.initialized,
189
- appId: this.appId,
190
- steamId
191
- };
44
+ return this.apiCore.getStatus();
192
45
  }
193
46
  /**
194
47
  * Get all achievements from Steam
195
48
  */
196
49
  async getAllAchievements() {
197
- if (!this.initialized || !this.steamLib || !this.userStatsInterface) {
198
- console.warn('⚠️ Steam API not initialized');
199
- return [];
200
- }
201
- try {
202
- // Run callbacks to ensure we have latest data
203
- this.SteamAPI_RunCallbacks();
204
- const achievements = [];
205
- const numAchievements = this.SteamAPI_ISteamUserStats_GetNumAchievements(this.userStatsInterface);
206
- console.log(`📋 Found ${numAchievements} achievements in Steam`);
207
- for (let i = 0; i < numAchievements; i++) {
208
- try {
209
- // Get achievement API name
210
- const apiName = this.SteamAPI_ISteamUserStats_GetAchievementName(this.userStatsInterface, i);
211
- if (!apiName)
212
- continue;
213
- // Get display name
214
- const displayName = this.SteamAPI_ISteamUserStats_GetAchievementDisplayAttribute(this.userStatsInterface, apiName, 'name') || apiName;
215
- // Get description
216
- const description = this.SteamAPI_ISteamUserStats_GetAchievementDisplayAttribute(this.userStatsInterface, apiName, 'desc') || '';
217
- // Check if unlocked
218
- const unlockedPtr = koffi.alloc('bool', 1);
219
- const hasAchievement = this.SteamAPI_ISteamUserStats_GetAchievement(this.userStatsInterface, apiName, unlockedPtr);
220
- const unlocked = hasAchievement ? koffi.decode(unlockedPtr, 'bool') : false;
221
- achievements.push({
222
- apiName,
223
- displayName,
224
- description,
225
- unlocked,
226
- unlockTime: unlocked ? Date.now() : 0 // Steam doesn't provide unlock time easily
227
- });
228
- }
229
- catch (error) {
230
- console.warn(`Failed to get achievement ${i}:`, error.message);
231
- }
232
- }
233
- return achievements;
234
- }
235
- catch (error) {
236
- console.error('❌ Failed to get achievements:', error.message);
237
- return [];
238
- }
50
+ return this.achievementManager.getAllAchievements();
239
51
  }
240
52
  /**
241
53
  * Unlock achievement in Steam
242
54
  */
243
- async unlockAchievement(apiName) {
244
- if (!this.initialized || !this.steamLib || !this.userStatsInterface) {
245
- console.warn('⚠️ Steam API not initialized');
246
- return false;
247
- }
248
- try {
249
- console.log(`🔓 Attempting to unlock achievement: ${apiName}`);
250
- // Set the achievement
251
- const result = this.SteamAPI_ISteamUserStats_SetAchievement(this.userStatsInterface, apiName);
252
- if (result) {
253
- // Store stats to commit the achievement to Steam servers
254
- const storeResult = this.SteamAPI_ISteamUserStats_StoreStats(this.userStatsInterface);
255
- if (storeResult) {
256
- // Run callbacks to process the achievement unlock
257
- this.SteamAPI_RunCallbacks();
258
- console.log(`🏆 Achievement unlocked successfully: ${apiName}`);
259
- return true;
260
- }
261
- else {
262
- console.error(`❌ Failed to store stats for achievement: ${apiName}`);
263
- return false;
264
- }
265
- }
266
- else {
267
- console.error(`❌ Failed to set achievement: ${apiName}`);
268
- return false;
269
- }
270
- }
271
- catch (error) {
272
- console.error(`❌ Error unlocking achievement ${apiName}:`, error.message);
273
- return false;
274
- }
55
+ async unlockAchievement(achievementName) {
56
+ return this.achievementManager.unlockAchievement(achievementName);
275
57
  }
276
58
  /**
277
59
  * Clear achievement in Steam (for testing)
278
60
  */
279
- async clearAchievement(apiName) {
280
- if (!this.initialized || !this.steamLib || !this.userStatsInterface) {
281
- console.warn('⚠️ Steam API not initialized');
282
- return false;
283
- }
284
- try {
285
- console.log(`🔒 Attempting to clear achievement: ${apiName}`);
286
- // Clear the achievement
287
- const result = this.SteamAPI_ISteamUserStats_ClearAchievement(this.userStatsInterface, apiName);
288
- if (result) {
289
- // Store stats to commit the change to Steam servers
290
- const storeResult = this.SteamAPI_ISteamUserStats_StoreStats(this.userStatsInterface);
291
- if (storeResult) {
292
- // Run callbacks to process the change
293
- this.SteamAPI_RunCallbacks();
294
- console.log(`🔒 Achievement cleared successfully: ${apiName}`);
295
- return true;
296
- }
297
- else {
298
- console.error(`❌ Failed to store stats for clearing achievement: ${apiName}`);
299
- return false;
300
- }
301
- }
302
- else {
303
- console.error(`❌ Failed to clear achievement: ${apiName}`);
304
- return false;
305
- }
306
- }
307
- catch (error) {
308
- console.error(`❌ Error clearing achievement ${apiName}:`, error.message);
309
- return false;
310
- }
61
+ async clearAchievement(achievementName) {
62
+ return this.achievementManager.clearAchievement(achievementName);
311
63
  }
312
64
  /**
313
65
  * Check if achievement is unlocked
314
66
  */
315
- async isAchievementUnlocked(apiName) {
316
- if (!this.initialized || !this.steamLib || !this.userStatsInterface) {
317
- return false;
318
- }
319
- try {
320
- const unlockedPtr = koffi.alloc('bool', 1);
321
- const hasAchievement = this.SteamAPI_ISteamUserStats_GetAchievement(this.userStatsInterface, apiName, unlockedPtr);
322
- return hasAchievement ? koffi.decode(unlockedPtr, 'bool') : false;
323
- }
324
- catch (error) {
325
- console.error(`❌ Error checking achievement ${apiName}:`, error.message);
326
- return false;
327
- }
67
+ async isAchievementUnlocked(achievementName) {
68
+ return this.achievementManager.isAchievementUnlocked(achievementName);
328
69
  }
329
70
  /**
330
71
  * Get achievement by API name
331
72
  */
332
- async getAchievement(apiName) {
333
- const achievements = await this.getAllAchievements();
334
- return achievements.find(a => a.apiName === apiName) || null;
73
+ async getAchievementByName(achievementName) {
74
+ return this.achievementManager.getAchievementByName(achievementName);
335
75
  }
336
76
  /**
337
77
  * Get total number of achievements
338
78
  */
339
- async getTotalCount() {
340
- if (!this.initialized || !this.steamLib || !this.userStatsInterface) {
341
- return 0;
342
- }
343
- try {
344
- return this.SteamAPI_ISteamUserStats_GetNumAchievements(this.userStatsInterface);
345
- }
346
- catch (error) {
347
- console.error('❌ Error getting achievement count:', error.message);
348
- return 0;
349
- }
79
+ async getTotalAchievementCount() {
80
+ return this.achievementManager.getTotalAchievementCount();
350
81
  }
351
82
  /**
352
83
  * Get number of unlocked achievements
353
84
  */
354
- async getUnlockedCount() {
355
- const achievements = await this.getAllAchievements();
356
- return achievements.filter(a => a.unlocked).length;
85
+ async getUnlockedAchievementCount() {
86
+ return this.achievementManager.getUnlockedAchievementCount();
357
87
  }
358
88
  /**
359
89
  * Run Steam callbacks to process pending events
360
90
  */
361
91
  runCallbacks() {
362
- if (this.initialized && this.steamLib) {
363
- try {
364
- this.SteamAPI_RunCallbacks();
365
- }
366
- catch (error) {
367
- console.warn('Warning: Error running Steam callbacks:', error.message);
368
- }
369
- }
92
+ this.apiCore.runCallbacks();
370
93
  }
371
94
  /**
372
95
  * Check if Steam client is running
373
96
  */
374
97
  isSteamRunning() {
375
- if (this.initialized && this.steamLib) {
376
- try {
377
- return this.SteamAPI_IsSteamRunning();
378
- }
379
- catch (error) {
380
- console.warn('Warning: Error checking if Steam is running:', error.message);
381
- return false;
382
- }
383
- }
384
- return false;
98
+ return this.apiCore.isSteamRunning();
99
+ }
100
+ // ===== VISUAL & UI FEATURES =====
101
+ /**
102
+ * Get achievement icon handle for use with ISteamUtils::GetImageRGBA()
103
+ */
104
+ async getAchievementIcon(achievementName) {
105
+ return this.achievementManager.getAchievementIcon(achievementName);
106
+ }
107
+ /**
108
+ * Show achievement progress notification in Steam overlay
109
+ */
110
+ async indicateAchievementProgress(achievementName, currentProgress, maxProgress) {
111
+ return this.achievementManager.indicateAchievementProgress(achievementName, currentProgress, maxProgress);
112
+ }
113
+ /**
114
+ * Get all achievements with icon handles
115
+ */
116
+ async getAllAchievementsWithIcons() {
117
+ return this.achievementManager.getAllAchievementsWithIcons();
118
+ }
119
+ // ===== PROGRESS TRACKING =====
120
+ /**
121
+ * Get achievement progress limits (integer-based)
122
+ */
123
+ async getAchievementProgressLimitsInt(achievementName) {
124
+ return this.achievementManager.getAchievementProgressLimitsInt(achievementName);
125
+ }
126
+ /**
127
+ * Get achievement progress limits (float-based)
128
+ */
129
+ async getAchievementProgressLimitsFloat(achievementName) {
130
+ return this.achievementManager.getAchievementProgressLimitsFloat(achievementName);
131
+ }
132
+ // ===== FRIEND/USER ACHIEVEMENTS =====
133
+ /**
134
+ * Request achievement stats for another user (friend)
135
+ * This is async - wait for callback before calling getUserAchievement()
136
+ */
137
+ async requestUserStats(steamId) {
138
+ return this.achievementManager.requestUserStats(steamId);
139
+ }
140
+ /**
141
+ * Get achievement status for another user (friend)
142
+ * Must call requestUserStats() first and wait for callback
143
+ */
144
+ async getUserAchievement(steamId, achievementName) {
145
+ return this.achievementManager.getUserAchievement(steamId, achievementName);
146
+ }
147
+ // ===== GLOBAL STATISTICS =====
148
+ /**
149
+ * Request global achievement percentages from Steam
150
+ * This is async - wait for callback before calling other global stats methods
151
+ */
152
+ async requestGlobalAchievementPercentages() {
153
+ return this.achievementManager.requestGlobalAchievementPercentages();
154
+ }
155
+ /**
156
+ * Get percentage of users who unlocked a specific achievement
157
+ * Must call requestGlobalAchievementPercentages() first
158
+ */
159
+ async getAchievementAchievedPercent(achievementName) {
160
+ return this.achievementManager.getAchievementAchievedPercent(achievementName);
161
+ }
162
+ /**
163
+ * Get all achievements with global unlock percentages
164
+ * Must call requestGlobalAchievementPercentages() first
165
+ */
166
+ async getAllAchievementsWithGlobalStats() {
167
+ return this.achievementManager.getAllAchievementsWithGlobalStats();
168
+ }
169
+ /**
170
+ * Get most achieved achievement
171
+ */
172
+ async getMostAchievedAchievementInfo() {
173
+ return this.achievementManager.getMostAchievedAchievementInfo();
174
+ }
175
+ /**
176
+ * Get next most achieved achievement (iterate by popularity)
177
+ */
178
+ async getNextMostAchievedAchievementInfo(previousIterator) {
179
+ return this.achievementManager.getNextMostAchievedAchievementInfo(previousIterator);
180
+ }
181
+ /**
182
+ * Get all achievements sorted by global popularity (most achieved first)
183
+ * Must call requestGlobalAchievementPercentages() first
184
+ */
185
+ async getAllAchievementsSortedByPopularity() {
186
+ return this.achievementManager.getAllAchievementsSortedByPopularity();
187
+ }
188
+ // ===== TESTING & DEVELOPMENT =====
189
+ /**
190
+ * Reset all stats and optionally achievements
191
+ * WARNING: This clears ALL user stats and achievements!
192
+ */
193
+ async resetAllStats(includeAchievements = false) {
194
+ return this.achievementManager.resetAllStats(includeAchievements);
385
195
  }
386
196
  }
387
197
  exports.default = SteamworksSDK;
package/dist/steam.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"steam.js","sourceRoot":"","sources":["../src/steam.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"steam.js","sourceRoot":"","sources":["../src/steam.ts"],"names":[],"mappings":"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"}
package/dist/types.d.ts CHANGED
@@ -4,6 +4,7 @@ export interface SteamAchievement {
4
4
  description: string;
5
5
  unlocked: boolean;
6
6
  unlockTime: number;
7
+ hidden?: boolean;
7
8
  }
8
9
  export interface SteamInitOptions {
9
10
  appId: number;
@@ -13,4 +14,26 @@ export interface SteamStatus {
13
14
  appId: number;
14
15
  steamId: string;
15
16
  }
17
+ export interface AchievementProgressLimits {
18
+ minProgress: number;
19
+ maxProgress: number;
20
+ }
21
+ export interface UserAchievement {
22
+ steamId: string;
23
+ apiName: string;
24
+ displayName: string;
25
+ description: string;
26
+ unlocked: boolean;
27
+ unlockTime: number;
28
+ }
29
+ export interface AchievementGlobalStats {
30
+ apiName: string;
31
+ displayName: string;
32
+ description: string;
33
+ unlocked: boolean;
34
+ globalUnlockPercentage: number;
35
+ }
36
+ export interface AchievementWithIcon extends SteamAchievement {
37
+ iconHandle: number;
38
+ }
16
39
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AACA,MAAM,WAAW,gBAAgB;IAC/B,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,CAAC,EAAE,OAAO,CAAC;CAClB;AAED,MAAM,WAAW,gBAAgB;IAC/B,KAAK,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,WAAW;IAC1B,WAAW,EAAE,OAAO,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC;IACd,OAAO,EAAE,MAAM,CAAC;CACjB;AAGD,MAAM,WAAW,yBAAyB;IACxC,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;CACrB;AAGD,MAAM,WAAW,eAAe;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;CACpB;AAGD,MAAM,WAAW,sBAAsB;IACrC,OAAO,EAAE,MAAM,CAAC;IAChB,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,sBAAsB,EAAE,MAAM,CAAC;CAChC;AAGD,MAAM,WAAW,mBAAoB,SAAQ,gBAAgB;IAC3D,UAAU,EAAE,MAAM,CAAC;CACpB"}
package/package.json CHANGED
@@ -1,13 +1,13 @@
1
1
  {
2
2
  "name": "steamworks-ffi-node",
3
- "version": "0.1.1",
3
+ "version": "0.2.0",
4
4
  "description": "Real Steamworks SDK wrapper using FFI for Node.js/Electron - Full Steam Integration",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",
7
7
  "scripts": {
8
8
  "build": "tsc",
9
- "start": "node test.js",
10
- "test": "node test.js",
9
+ "start": "node test-complete-achievements.js",
10
+ "test": "node test-complete-achievements.js",
11
11
  "prepublishOnly": "npm run build"
12
12
  },
13
13
  "dependencies": {
@@ -21,7 +21,8 @@
21
21
  "dist/**/*",
22
22
  "steamworks_sdk/redistributable_bin/**/*",
23
23
  "README.md",
24
- "LICENSE"
24
+ "LICENSE",
25
+ "THIRD_PARTY_LICENSES.md"
25
26
  ],
26
27
  "keywords": [
27
28
  "steam",