973
|
1 import std/dynlib
|
|
2 import std/strutils
|
|
3 import std/logging
|
|
4
|
|
5 var
|
|
6 steam_api: LibHandle
|
|
7 steam_is_loaded = false
|
|
8
|
|
9 when defined(linux):
|
|
10 proc dlerror(): cstring {.stdcall, importc.}
|
|
11 steam_api = "libsteam_api.so".loadLib()
|
|
12 if steam_api == nil:
|
|
13 echo dlerror()
|
|
14 elif defined(windows):
|
|
15 steam_api = "steam_api".loadLib()
|
974
|
16 # TODO: maybe should get some error reporting on windows too?
|
973
|
17
|
|
18
|
|
19 # required to store reference, when calling certain APIs
|
|
20 type
|
|
21 SteamUserStatsRef = ptr object
|
|
22 var userStats: SteamUserStatsRef
|
|
23
|
974
|
24 # load function pointers for steam API
|
973
|
25 var
|
|
26 Shutdown*: proc() {.stdcall.}
|
|
27 Init: proc(msg: ptr array[1024, char]): cint {.stdcall.}
|
|
28 SteamUserStats: proc(): SteamUserStatsRef {.stdcall.}
|
|
29 RequestCurrentStats: proc(self: SteamUserStatsRef): bool {.stdcall.} # needs to be called before the achievment-stuff
|
|
30 ClearAchievement: proc(self: SteamUserStatsRef, pchName: cstring): bool {.stdcall.}
|
|
31 SetAchievement: proc(self: SteamUserStatsRef, pchName: cstring): bool {.stdcall.}
|
|
32 StoreStats: proc(self: SteamUserStatsRef): bool {.stdcall.} # needs to be called in order for achievments to be saved
|
|
33 # dynlib-helper function
|
|
34 proc loadFunc[T](nimFunc: var T, dllFuncName: string) =
|
|
35 nimFunc = cast[T](steam_api.checkedSymAddr(dllFuncName))
|
|
36 if steam_api != nil:
|
|
37 loadFunc(Init, "SteamAPI_InitFlat")
|
|
38 loadFunc(Shutdown, "SteamAPI_Shutdown")
|
|
39 loadFunc(SteamUserStats, "SteamAPI_SteamUserStats_v012")
|
|
40 loadFunc(RequestCurrentStats, "SteamAPI_ISteamUserStats_RequestCurrentStats")
|
|
41 loadFunc(ClearAchievement, "SteamAPI_ISteamUserStats_ClearAchievement")
|
|
42 loadFunc(SetAchievement, "SteamAPI_ISteamUserStats_SetAchievement")
|
|
43 loadFunc(StoreStats, "SteamAPI_ISteamUserStats_StoreStats")
|
|
44
|
|
45
|
|
46 # nice wrappers for steam API
|
|
47
|
|
48 proc SteamRequestCurrentStats*(): bool =
|
|
49 RequestCurrentStats(userStats)
|
|
50
|
|
51 proc SteamClearAchievement*(name: string): bool =
|
|
52 userStats.ClearAchievement(name.cstring)
|
|
53
|
|
54 proc SteamSetAchievement*(name: string): bool =
|
|
55 userStats.SetAchievement(name.cstring)
|
|
56
|
991
|
57 proc SteamStoreStats*(): bool =
|
973
|
58 userStats.StoreStats()
|
|
59
|
|
60 proc SteamShutdown*() =
|
|
61 Shutdown()
|
|
62
|
|
63
|
|
64 # helper funcs
|
|
65 proc SteamAvailable*(): bool =
|
|
66 steam_api != nil and steam_is_loaded
|
|
67
|
|
68 # first function that should be called
|
|
69 proc TrySteamInit*() =
|
|
70 if steam_api != nil and not steam_is_loaded:
|
|
71 var msg: array[1024, char]
|
|
72 let success = Init(addr msg) == 0
|
|
73 warn join(@msg, "")
|
|
74 if success:
|
|
75 userStats = SteamUserStats()
|
|
76 steam_is_loaded = SteamRequestCurrentStats()
|