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