Kodi Development 22.0
for Binary and Script based Add-Ons
 
Loading...
Searching...
No Matches
Game.h
1/*
2 * Copyright (C) 2014-2025 Team Kodi
3 * This file is part of Kodi - https://kodi.tv
4 *
5 * SPDX-License-Identifier: GPL-2.0-or-later
6 * See LICENSES/README.md for more information.
7 */
8
9#pragma once
10
11#include "../AddonBase.h"
12#include "../c-api/addon-instance/game.h"
13
14#include <algorithm>
15#include <functional>
16
17#ifdef __cplusplus
18
19namespace kodi
20{
21namespace addon
22{
23
24//==============================================================================
33
34//==============================================================================
39
40//==============================================================================
48{
49public:
51 explicit GameControllerLayout() = default;
52 GameControllerLayout(const game_controller_layout& layout) : controller_id(layout.controller_id)
53 {
54 provides_input = layout.provides_input;
55 for (unsigned int i = 0; i < layout.digital_button_count; ++i)
56 digital_buttons.emplace_back(layout.digital_buttons[i]);
57 for (unsigned int i = 0; i < layout.analog_button_count; ++i)
58 analog_buttons.emplace_back(layout.analog_buttons[i]);
59 for (unsigned int i = 0; i < layout.analog_stick_count; ++i)
60 analog_sticks.emplace_back(layout.analog_sticks[i]);
61 for (unsigned int i = 0; i < layout.accelerometer_count; ++i)
62 accelerometers.emplace_back(layout.accelerometers[i]);
63 for (unsigned int i = 0; i < layout.key_count; ++i)
64 keys.emplace_back(layout.keys[i]);
65 for (unsigned int i = 0; i < layout.rel_pointer_count; ++i)
66 rel_pointers.emplace_back(layout.rel_pointers[i]);
67 for (unsigned int i = 0; i < layout.abs_pointer_count; ++i)
68 abs_pointers.emplace_back(layout.abs_pointers[i]);
69 for (unsigned int i = 0; i < layout.motor_count; ++i)
70 motors.emplace_back(layout.motors[i]);
71 }
75 std::string controller_id;
76
80 bool provides_input{false};
81
83 std::vector<std::string> digital_buttons;
84
86 std::vector<std::string> analog_buttons;
87
89 std::vector<std::string> analog_sticks;
90
92 std::vector<std::string> accelerometers;
93
95 std::vector<std::string> keys;
96
98 std::vector<std::string> rel_pointers;
99
101 std::vector<std::string> abs_pointers;
102
104 std::vector<std::string> motors;
105};
107//------------------------------------------------------------------------------
108
109//==============================================================================
118class ATTR_DLL_LOCAL CInstanceGame : public IAddonInstance
119{
120public:
121 //============================================================================
127
128 //============================================================================
161 CInstanceGame() : IAddonInstance(IInstanceInfo(CPrivateBase::m_interface->firstKodiInstance))
162 {
163 if (CPrivateBase::m_interface->globalSingleInstance != nullptr)
164 {
165 throw std::logic_error(
166 "kodi::addon::CInstanceGame: Cannot create more than one game instance!");
167 }
168 SetAddonStruct(CPrivateBase::m_interface->firstKodiInstance);
169 CPrivateBase::m_interface->globalSingleInstance = this;
170 }
171 //----------------------------------------------------------------------------
172
173 //============================================================================
176 ~CInstanceGame() override = default;
177 //----------------------------------------------------------------------------
178
179 //============================================================================
187 std::string GameClientDllPath() const { return m_instanceData->props->game_client_dll_path; }
188 //----------------------------------------------------------------------------
189
190 //============================================================================
200 bool ProxyDllPaths(std::vector<std::string>& paths)
201 {
202 for (unsigned int i = 0; i < m_instanceData->props->proxy_dll_count; ++i)
203 {
204 if (m_instanceData->props->proxy_dll_paths[i] != nullptr)
205 paths.emplace_back(m_instanceData->props->proxy_dll_paths[i]);
206 }
207 return !paths.empty();
208 }
209 //----------------------------------------------------------------------------
210
211 //============================================================================
224 bool ResourceDirectories(std::vector<std::string>& dirs)
225 {
226 for (unsigned int i = 0; i < m_instanceData->props->resource_directory_count; ++i)
227 {
228 if (m_instanceData->props->resource_directories[i] != nullptr)
229 dirs.emplace_back(m_instanceData->props->resource_directories[i]);
230 }
231 return !dirs.empty();
232 }
233 //----------------------------------------------------------------------------
234
235 //============================================================================
247 std::string ProfileDirectory() const { return m_instanceData->props->profile_directory; }
248 //----------------------------------------------------------------------------
249
250 //============================================================================
258 bool SupportsVFS() const { return m_instanceData->props->supports_vfs; }
259 //----------------------------------------------------------------------------
260
261 //============================================================================
271 bool Extensions(std::vector<std::string>& extensions)
272 {
273 for (unsigned int i = 0; i < m_instanceData->props->extension_count; ++i)
274 {
275 if (m_instanceData->props->extensions[i] != nullptr)
276 extensions.emplace_back(m_instanceData->props->extensions[i]);
277 }
278 return !extensions.empty();
279 }
280 //----------------------------------------------------------------------------
281
283
284 //--==----==----==----==----==----==----==----==----==----==----==----==----==--
285
286 //============================================================================
305
306 //============================================================================
313 virtual GAME_ERROR LoadGame(const std::string& url) { return GAME_ERROR_NOT_IMPLEMENTED; }
314 //----------------------------------------------------------------------------
315
316 //============================================================================
324 virtual GAME_ERROR LoadGameSpecial(SPECIAL_GAME_TYPE type, const std::vector<std::string>& urls)
325 {
327 }
328 //----------------------------------------------------------------------------
329
330 //============================================================================
341 //----------------------------------------------------------------------------
342
343 //============================================================================
351 //----------------------------------------------------------------------------
352
353 //============================================================================
361 {
363 }
364 //----------------------------------------------------------------------------
365
366 //============================================================================
372 //----------------------------------------------------------------------------
373
374 //============================================================================
382 virtual bool RequiresGameLoop() { return false; }
383 //----------------------------------------------------------------------------
384
385 //============================================================================
391 //----------------------------------------------------------------------------
392
393 //============================================================================
399 //----------------------------------------------------------------------------
400
401 //==========================================================================
407 void CloseGame(void) { m_instanceData->toKodi->CloseGame(m_instanceData->toKodi->kodiInstance); }
408 //----------------------------------------------------------------------------
409
410 //============================================================================
422 {
423 public:
424 CStream() = default;
425
426 CStream(const game_stream_properties& properties) { Open(properties); }
427
428 ~CStream() { Close(); }
429
430 //==========================================================================
440 bool Open(const game_stream_properties& properties)
441 {
442 if (!CPrivateBase::m_interface->globalSingleInstance)
443 return false;
444
445 if (m_handle)
446 {
447 kodi::Log(ADDON_LOG_INFO, "kodi::addon::CInstanceGame::CStream already reopened");
448 Close();
449 }
450
452 *static_cast<CInstanceGame*>(CPrivateBase::m_interface->globalSingleInstance)
453 ->m_instanceData->toKodi;
454 m_handle = cb.OpenStream(cb.kodiInstance, &properties);
455 return m_handle != nullptr;
456 }
457 //--------------------------------------------------------------------------
458
459 //==========================================================================
465 void Close()
466 {
467 if (!m_handle || !CPrivateBase::m_interface->globalSingleInstance)
468 return;
469
471 *static_cast<CInstanceGame*>(CPrivateBase::m_interface->globalSingleInstance)
472 ->m_instanceData->toKodi;
473 cb.CloseStream(cb.kodiInstance, m_handle);
474 m_handle = nullptr;
475 }
476 //--------------------------------------------------------------------------
477
478 //==========================================================================
492 bool GetBuffer(unsigned int width, unsigned int height, game_stream_buffer& buffer)
493 {
494 if (!m_handle || !CPrivateBase::m_interface->globalSingleInstance)
495 return false;
496
498 *static_cast<CInstanceGame*>(CPrivateBase::m_interface->globalSingleInstance)
499 ->m_instanceData->toKodi;
500 return cb.GetStreamBuffer(cb.kodiInstance, m_handle, width, height, &buffer);
501 }
502 //--------------------------------------------------------------------------
503
504 //==========================================================================
512 void AddData(const game_stream_packet& packet)
513 {
514 if (!m_handle || !CPrivateBase::m_interface->globalSingleInstance)
515 return;
516
518 *static_cast<CInstanceGame*>(CPrivateBase::m_interface->globalSingleInstance)
519 ->m_instanceData->toKodi;
520 cb.AddStreamData(cb.kodiInstance, m_handle, &packet);
521 }
522 //--------------------------------------------------------------------------
523
524 //==========================================================================
533 {
534 if (!m_handle || !CPrivateBase::m_interface->globalSingleInstance)
535 return;
536
538 *static_cast<CInstanceGame*>(CPrivateBase::m_interface->globalSingleInstance)
539 ->m_instanceData->toKodi;
540 cb.ReleaseStreamBuffer(cb.kodiInstance, m_handle, &buffer);
541 }
542 //--------------------------------------------------------------------------
543
544 //==========================================================================
552 bool IsOpen() const { return m_handle != nullptr; }
553 //--------------------------------------------------------------------------
554
555 private:
556 KODI_GAME_STREAM_HANDLE m_handle = nullptr;
557 };
559
561
562 //--==----==----==----==----==----==----==----==----==----==----==----==----==--
563
564 //============================================================================
580
581 //==========================================================================
590 {
591 return m_instanceData->toKodi->EnableHardwareRendering(m_instanceData->toKodi->kodiInstance,
592 &properties);
593 }
594 //----------------------------------------------------------------------------
595
596 //============================================================================
604 //----------------------------------------------------------------------------
605
606 //============================================================================
614
615 //============================================================================
625 {
626 return m_instanceData->toKodi->HwGetProcAddress(m_instanceData->toKodi->kodiInstance, sym);
627 }
628 //----------------------------------------------------------------------------
629
631
632 //--==----==----==----==----==----==----==----==----==----==----==----==----==--
633
634 //============================================================================
650
651 //==========================================================================
662 //--------------------------------------------------------------------------
663
665
666 //--==----==----==----==----==----==----==----==----==----==----==----==----==--
667
668 //============================================================================
683
684 //============================================================================
696 virtual bool HasFeature(const std::string& controller_id, const std::string& feature_name)
697 {
698 return false;
699 }
700 //----------------------------------------------------------------------------
701
702 //============================================================================
713 virtual game_input_topology* GetTopology() { return nullptr; }
714 //----------------------------------------------------------------------------
715
716 //============================================================================
721 virtual void FreeTopology(game_input_topology* topology) {}
722 //----------------------------------------------------------------------------
723
724 //============================================================================
733 const std::vector<kodi::addon::GameControllerLayout>& controllers)
734 {
735 }
736 //----------------------------------------------------------------------------
737
738 //============================================================================
746 virtual bool EnableKeyboard(bool enable, const std::string& controller_id) { return false; }
747 //----------------------------------------------------------------------------
748
749 //============================================================================
757 virtual bool EnableMouse(bool enable, const std::string& controller_id) { return false; }
758 //--------------------------------------------------------------------------
759
760 //==========================================================================
804 virtual bool ConnectController(bool connect,
805 const std::string& port_address,
806 const std::string& controller_id)
807 {
808 return false;
809 }
810 //----------------------------------------------------------------------------
811
812 //============================================================================
819 virtual bool InputEvent(const game_input_event& event) { return false; }
820 //----------------------------------------------------------------------------
821
822 //============================================================================
835 {
836 return m_instanceData->toKodi->InputEvent(m_instanceData->toKodi->kodiInstance, &event);
837 }
838 //----------------------------------------------------------------------------
839
841
842 //--==----==----==----==----==----==----==----==----==----==----==----==----==--
843
844 //============================================================================
859
860 //============================================================================
865 virtual size_t SerializeSize() { return 0; }
866 //----------------------------------------------------------------------------
867
868 //============================================================================
876 virtual GAME_ERROR Serialize(uint8_t* data, size_t size) { return GAME_ERROR_NOT_IMPLEMENTED; }
877 //----------------------------------------------------------------------------
878
879 //============================================================================
887 virtual GAME_ERROR Deserialize(const uint8_t* data, size_t size)
888 {
890 }
891 //----------------------------------------------------------------------------
892
894
895 //--==----==----==----==----==----==----==----==----==----==----==----==----==--
896
897 //============================================================================
913
914 //============================================================================
920 //----------------------------------------------------------------------------
921
922 //============================================================================
931 virtual GAME_ERROR GetMemory(GAME_MEMORY type, uint8_t*& data, size_t& size)
932 {
934 }
935 //----------------------------------------------------------------------------
936
937 //============================================================================
946 virtual GAME_ERROR SetCheat(unsigned int index, bool enabled, const std::string& code)
947 {
949 }
950
951 //============================================================================
963 virtual GAME_ERROR RCGenerateHashFromFile(std::string& hash,
964 unsigned int consoleID,
965 const std::string& filePath)
966 {
968 }
969
970 //============================================================================
978 virtual GAME_ERROR RCGetGameIDUrl(std::string& url, const std::string& hash)
979 {
981 }
982
983 //============================================================================
993 virtual GAME_ERROR RCGetPatchFileUrl(std::string& url,
994 const std::string& username,
995 const std::string& token,
996 unsigned int gameID)
997 {
999 }
1000
1001 //============================================================================
1009 virtual GAME_ERROR SetRetroAchievementsCredentials(const std::string& username,
1010 const std::string& token)
1011 {
1013 }
1014
1015 //============================================================================
1029 virtual GAME_ERROR RCPostRichPresenceUrl(std::string& url,
1030 std::string& postData,
1031 const std::string& username,
1032 const std::string& token,
1033 unsigned int gameID,
1034 const std::string& richPresence)
1035 {
1037 }
1038
1039 //============================================================================
1046 virtual GAME_ERROR RCEnableRichPresence(const std::string& script)
1047 {
1049 }
1050
1051 //============================================================================
1063 virtual GAME_ERROR RCGetRichPresenceEvaluation(std::string& evaluation, unsigned int consoleID)
1064 {
1066 }
1067
1068 //============================================================================
1077 virtual GAME_ERROR ActivateAchievement(unsigned int cheevoId,
1078 const std::string& memAddrExpression)
1079 {
1081 }
1082
1083 //============================================================================
1096 const std::function<void(const std::string& achievementUrl, unsigned int cheevoId)>& callback)
1097 {
1099 }
1100
1101 //============================================================================
1109
1110 //----------------------------------------------------------------------------
1111
1113
1114 //--==----==----==----==----==----==----==----==----==----==----==----==----==--
1115
1116 //============================================================================
1131
1132 //============================================================================
1140 virtual bool GetEjectState() { return false; }
1141 //----------------------------------------------------------------------------
1142
1143 //============================================================================
1153 virtual GAME_ERROR SetEjectState(bool ejected) { return GAME_ERROR_NOT_IMPLEMENTED; }
1154 //----------------------------------------------------------------------------
1155
1156 //============================================================================
1162 virtual unsigned int GetImageIndex() { return 0; }
1163 //----------------------------------------------------------------------------
1164
1165 //============================================================================
1174 virtual GAME_ERROR SetImageIndex(unsigned int imageIndex) { return GAME_ERROR_NOT_IMPLEMENTED; }
1175 //----------------------------------------------------------------------------
1176
1177 //============================================================================
1182 virtual unsigned int GetImageCount() { return 0; }
1183 //----------------------------------------------------------------------------
1184
1185 //============================================================================
1192 //----------------------------------------------------------------------------
1193
1194 //============================================================================
1204 virtual GAME_ERROR ReplaceImageIndex(unsigned int imageIndex, const std::string& filePath)
1205 {
1207 }
1208 //----------------------------------------------------------------------------
1209
1210 //============================================================================
1219 virtual GAME_ERROR RemoveImageIndex(unsigned int imageIndex)
1220 {
1222 }
1223 //----------------------------------------------------------------------------
1224
1225 //============================================================================
1234 virtual GAME_ERROR SetInitialImage(unsigned int imageIndex, const std::string& filePath)
1235 {
1237 }
1238 //----------------------------------------------------------------------------
1239
1240 //============================================================================
1247 virtual std::string GetImagePath(unsigned int imageIndex) { return ""; }
1248 //----------------------------------------------------------------------------
1249
1250 //============================================================================
1257 virtual std::string GetImageLabel(unsigned int imageIndex) { return ""; }
1258 //----------------------------------------------------------------------------
1259
1261
1262private:
1263 void SetAddonStruct(KODI_ADDON_INSTANCE_STRUCT* instance)
1264 {
1265 instance->hdl = this;
1266
1267 instance->game->toAddon->LoadGame = ADDON_LoadGame;
1268 instance->game->toAddon->LoadGameSpecial = ADDON_LoadGameSpecial;
1269 instance->game->toAddon->LoadStandalone = ADDON_LoadStandalone;
1270 instance->game->toAddon->UnloadGame = ADDON_UnloadGame;
1271 instance->game->toAddon->GetGameTiming = ADDON_GetGameTiming;
1272 instance->game->toAddon->GetRegion = ADDON_GetRegion;
1273 instance->game->toAddon->RequiresGameLoop = ADDON_RequiresGameLoop;
1274 instance->game->toAddon->RunFrame = ADDON_RunFrame;
1275 instance->game->toAddon->Reset = ADDON_Reset;
1276
1277 instance->game->toAddon->HwContextReset = ADDON_HwContextReset;
1278 instance->game->toAddon->HwContextDestroy = ADDON_HwContextDestroy;
1279
1280 instance->game->toAddon->AudioAvailable = ADDON_AudioAvailable;
1281
1282 instance->game->toAddon->HasFeature = ADDON_HasFeature;
1283 instance->game->toAddon->GetTopology = ADDON_GetTopology;
1284 instance->game->toAddon->FreeTopology = ADDON_FreeTopology;
1285 instance->game->toAddon->SetControllerLayouts = ADDON_SetControllerLayouts;
1286 instance->game->toAddon->EnableKeyboard = ADDON_EnableKeyboard;
1287 instance->game->toAddon->EnableMouse = ADDON_EnableMouse;
1288 instance->game->toAddon->ConnectController = ADDON_ConnectController;
1289 instance->game->toAddon->InputEvent = ADDON_InputEvent;
1290
1291 instance->game->toAddon->SerializeSize = ADDON_SerializeSize;
1292 instance->game->toAddon->Serialize = ADDON_Serialize;
1293 instance->game->toAddon->Deserialize = ADDON_Deserialize;
1294
1295 instance->game->toAddon->CheatReset = ADDON_CheatReset;
1296 instance->game->toAddon->GetMemory = ADDON_GetMemory;
1297 instance->game->toAddon->SetCheat = ADDON_SetCheat;
1298
1299 instance->game->toAddon->RCGenerateHashFromFile = ADDON_RCGenerateHashFromFile;
1300 instance->game->toAddon->RCGetGameIDUrl = ADDON_RCGetGameIDUrl;
1301 instance->game->toAddon->RCGetPatchFileUrl = ADDON_RCGetPatchFileUrl;
1302 instance->game->toAddon->SetRetroAchievementsCredentials =
1303 ADDON_SetRetroAchievementsCredentials;
1304 instance->game->toAddon->RCPostRichPresenceUrl = ADDON_RCPostRichPresenceUrl;
1305 instance->game->toAddon->RCEnableRichPresence = ADDON_RCEnableRichPresence;
1306 instance->game->toAddon->RCGetRichPresenceEvaluation = ADDON_RCGetRichPresenceEvaluation;
1307 instance->game->toAddon->ActivateAchievement = ADDON_ActivateAchievement;
1308 instance->game->toAddon->GetCheevoUrlId = ADDON_GetCheevoUrlId;
1309 instance->game->toAddon->RCResetRuntime = ADDON_RCResetRuntime;
1310
1311 instance->game->toAddon->GetEjectState = ADDON_GetEjectState;
1312 instance->game->toAddon->SetEjectState = ADDON_SetEjectState;
1313 instance->game->toAddon->GetImageIndex = ADDON_GetImageIndex;
1314 instance->game->toAddon->SetImageIndex = ADDON_SetImageIndex;
1315 instance->game->toAddon->GetImageCount = ADDON_GetImageCount;
1316 instance->game->toAddon->AddImageIndex = ADDON_AddImageIndex;
1317 instance->game->toAddon->ReplaceImageIndex = ADDON_ReplaceImageIndex;
1318 instance->game->toAddon->RemoveImageIndex = ADDON_RemoveImageIndex;
1319 instance->game->toAddon->SetInitialImage = ADDON_SetInitialImage;
1320 instance->game->toAddon->GetImagePath = ADDON_GetImagePath;
1321 instance->game->toAddon->GetImageLabel = ADDON_GetImageLabel;
1322
1323 instance->game->toAddon->FreeString = ADDON_FreeString;
1324
1325 m_instanceData = instance->game;
1326 m_instanceData->toAddon->addonInstance = this;
1327 }
1328
1329 // --- Game operations ---------------------------------------------------------
1330
1331 inline static GAME_ERROR ADDON_LoadGame(const AddonInstance_Game* instance, const char* url)
1332 {
1333 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->LoadGame(url);
1334 }
1335
1336 inline static GAME_ERROR ADDON_LoadGameSpecial(const AddonInstance_Game* instance,
1337 SPECIAL_GAME_TYPE type,
1338 const char** urls,
1339 size_t urlCount)
1340 {
1341 std::vector<std::string> urlList;
1342 for (size_t i = 0; i < urlCount; ++i)
1343 {
1344 if (urls[i] != nullptr)
1345 urlList.emplace_back(urls[i]);
1346 }
1347
1348 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1349 ->LoadGameSpecial(type, urlList);
1350 }
1351
1352 inline static GAME_ERROR ADDON_LoadStandalone(const AddonInstance_Game* instance)
1353 {
1354 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->LoadStandalone();
1355 }
1356
1357 inline static GAME_ERROR ADDON_UnloadGame(const AddonInstance_Game* instance)
1358 {
1359 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->UnloadGame();
1360 }
1361
1362 inline static GAME_ERROR ADDON_GetGameTiming(const AddonInstance_Game* instance,
1363 game_system_timing* timing_info)
1364 {
1365 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1366 ->GetGameTiming(*timing_info);
1367 }
1368
1369 inline static GAME_REGION ADDON_GetRegion(const AddonInstance_Game* instance)
1370 {
1371 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->GetRegion();
1372 }
1373
1374 inline static bool ADDON_RequiresGameLoop(const AddonInstance_Game* instance)
1375 {
1376 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->RequiresGameLoop();
1377 }
1378
1379 inline static GAME_ERROR ADDON_RunFrame(const AddonInstance_Game* instance)
1380 {
1381 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->RunFrame();
1382 }
1383
1384 inline static GAME_ERROR ADDON_Reset(const AddonInstance_Game* instance)
1385 {
1386 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->Reset();
1387 }
1388
1389 // --- Hardware rendering operations -------------------------------------------
1390
1391 inline static GAME_ERROR ADDON_HwContextReset(const AddonInstance_Game* instance)
1392 {
1393 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->HwContextReset();
1394 }
1395
1396 inline static GAME_ERROR ADDON_HwContextDestroy(const AddonInstance_Game* instance)
1397 {
1398 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->HwContextDestroy();
1399 }
1400
1401 // --- Audio operations --------------------------------------------------------
1402
1403 inline static GAME_ERROR ADDON_AudioAvailable(const AddonInstance_Game* instance)
1404 {
1405 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->AudioAvailable();
1406 }
1407
1408 // --- Input operations --------------------------------------------------------
1409
1410 inline static bool ADDON_HasFeature(const AddonInstance_Game* instance,
1411 const char* controller_id,
1412 const char* feature_name)
1413 {
1414 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1415 ->HasFeature(controller_id, feature_name);
1416 }
1417
1418 inline static game_input_topology* ADDON_GetTopology(const AddonInstance_Game* instance)
1419 {
1420 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->GetTopology();
1421 }
1422
1423 inline static void ADDON_FreeTopology(const AddonInstance_Game* instance,
1424 game_input_topology* topology)
1425 {
1426 static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->FreeTopology(topology);
1427 }
1428
1429 inline static void ADDON_SetControllerLayouts(const AddonInstance_Game* instance,
1430 const game_controller_layout* controllers,
1431 unsigned int controller_count)
1432 {
1433 if (controllers == nullptr)
1434 return;
1435
1436 std::vector<GameControllerLayout> controllerList;
1437 controllerList.reserve(controller_count);
1438 for (unsigned int i = 0; i < controller_count; ++i)
1439 controllerList.emplace_back(controllers[i]);
1440
1441 static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1442 ->SetControllerLayouts(controllerList);
1443 }
1444
1445 inline static bool ADDON_EnableKeyboard(const AddonInstance_Game* instance,
1446 bool enable,
1447 const char* controller_id)
1448 {
1449 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1450 ->EnableKeyboard(enable, controller_id);
1451 }
1452
1453 inline static bool ADDON_EnableMouse(const AddonInstance_Game* instance,
1454 bool enable,
1455 const char* controller_id)
1456 {
1457 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1458 ->EnableMouse(enable, controller_id);
1459 }
1460
1461 inline static bool ADDON_ConnectController(const AddonInstance_Game* instance,
1462 bool connect,
1463 const char* port_address,
1464 const char* controller_id)
1465 {
1466 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1467 ->ConnectController(connect, port_address, controller_id);
1468 }
1469
1470 inline static bool ADDON_InputEvent(const AddonInstance_Game* instance,
1471 const game_input_event* event)
1472 {
1473 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->InputEvent(*event);
1474 }
1475
1476 // --- Serialization operations ------------------------------------------------
1477
1478 inline static size_t ADDON_SerializeSize(const AddonInstance_Game* instance)
1479 {
1480 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->SerializeSize();
1481 }
1482
1483 inline static GAME_ERROR ADDON_Serialize(const AddonInstance_Game* instance,
1484 uint8_t* data,
1485 size_t size)
1486 {
1487 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->Serialize(data, size);
1488 }
1489
1490 inline static GAME_ERROR ADDON_Deserialize(const AddonInstance_Game* instance,
1491 const uint8_t* data,
1492 size_t size)
1493 {
1494 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->Deserialize(data, size);
1495 }
1496
1497 // --- Cheat operations --------------------------------------------------------
1498
1499 inline static GAME_ERROR ADDON_CheatReset(const AddonInstance_Game* instance)
1500 {
1501 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->CheatReset();
1502 }
1503
1504 inline static GAME_ERROR ADDON_GetMemory(const AddonInstance_Game* instance,
1505 GAME_MEMORY type,
1506 uint8_t** data,
1507 size_t* size)
1508 {
1509 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1510 ->GetMemory(type, *data, *size);
1511 }
1512
1513 inline static GAME_ERROR ADDON_SetCheat(const AddonInstance_Game* instance,
1514 unsigned int index,
1515 bool enabled,
1516 const char* code)
1517 {
1518 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1519 ->SetCheat(index, enabled, code);
1520 }
1521
1522 inline static GAME_ERROR ADDON_RCGenerateHashFromFile(const AddonInstance_Game* instance,
1523 char** hash,
1524 unsigned int consoleID,
1525 const char* filePath)
1526 {
1527 if (hash == nullptr || filePath == nullptr)
1529
1530 *hash = nullptr;
1531
1532 std::string cppHash;
1533
1534 GAME_ERROR ret = static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1535 ->RCGenerateHashFromFile(cppHash, consoleID, filePath);
1536
1537 if (ret == GAME_ERROR_NO_ERROR)
1538 {
1539 *hash = new char[cppHash.size() + 1];
1540 std::copy(cppHash.begin(), cppHash.end(), *hash);
1541 (*hash)[cppHash.size()] = '\0';
1542 }
1543
1544 return ret;
1545 }
1546
1547 inline static GAME_ERROR ADDON_RCGetGameIDUrl(const AddonInstance_Game* instance,
1548 char** url,
1549 const char* hash)
1550 {
1551 if (url == nullptr || hash == nullptr)
1553
1554 *url = nullptr;
1555
1556 std::string cppUrl;
1557 GAME_ERROR ret =
1558 static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->RCGetGameIDUrl(cppUrl, hash);
1559
1560 if (ret == GAME_ERROR_NO_ERROR)
1561 {
1562 *url = new char[cppUrl.size() + 1];
1563 std::copy(cppUrl.begin(), cppUrl.end(), *url);
1564 (*url)[cppUrl.size()] = '\0';
1565 }
1566
1567 return ret;
1568 }
1569
1570 inline static GAME_ERROR ADDON_RCGetPatchFileUrl(const AddonInstance_Game* instance,
1571 char** url,
1572 const char* username,
1573 const char* token,
1574 unsigned int gameID)
1575 {
1576 if (url == nullptr || username == nullptr || token == nullptr)
1578
1579 *url = nullptr;
1580
1581 std::string cppUrl;
1582
1583 GAME_ERROR ret = static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1584 ->RCGetPatchFileUrl(cppUrl, username, token, gameID);
1585
1586 if (ret == GAME_ERROR_NO_ERROR)
1587 {
1588 *url = new char[cppUrl.size() + 1];
1589 std::copy(cppUrl.begin(), cppUrl.end(), *url);
1590 (*url)[cppUrl.size()] = '\0';
1591 }
1592
1593 return ret;
1594 }
1595
1596 inline static GAME_ERROR ADDON_SetRetroAchievementsCredentials(const AddonInstance_Game* instance,
1597 const char* username,
1598 const char* token)
1599 {
1600 if (username == nullptr || token == nullptr)
1602
1603 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1604 ->SetRetroAchievementsCredentials(username, token);
1605 }
1606
1607 inline static GAME_ERROR ADDON_RCPostRichPresenceUrl(const AddonInstance_Game* instance,
1608 char** url,
1609 char** postData,
1610 const char* username,
1611 const char* token,
1612 unsigned int gameID,
1613 const char* richPresence)
1614 {
1615 if (url == nullptr || postData == nullptr || username == nullptr || token == nullptr ||
1616 richPresence == nullptr)
1618
1619 *url = nullptr;
1620 *postData = nullptr;
1621
1622 std::string cppUrl;
1623 std::string cppPostData;
1624
1625 GAME_ERROR ret =
1626 static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1627 ->RCPostRichPresenceUrl(cppUrl, cppPostData, username, token, gameID, richPresence);
1628
1629 if (ret == GAME_ERROR_NO_ERROR)
1630 {
1631 *url = new char[cppUrl.size() + 1];
1632 std::copy(cppUrl.begin(), cppUrl.end(), *url);
1633 (*url)[cppUrl.size()] = '\0';
1634
1635 *postData = new char[cppPostData.size() + 1];
1636 std::copy(cppPostData.begin(), cppPostData.end(), *postData);
1637 (*postData)[cppPostData.size()] = '\0';
1638 }
1639
1640 return ret;
1641 }
1642
1643 inline static GAME_ERROR ADDON_RCEnableRichPresence(const AddonInstance_Game* instance,
1644 const char* script)
1645 {
1646 if (script == nullptr)
1648
1649 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1650 ->RCEnableRichPresence(script);
1651 }
1652
1653 inline static GAME_ERROR ADDON_RCGetRichPresenceEvaluation(const AddonInstance_Game* instance,
1654 char** evaluation,
1655 unsigned int consoleID)
1656 {
1657 if (evaluation == nullptr)
1659
1660 *evaluation = nullptr;
1661
1662 std::string cppEvaluation;
1663 GAME_ERROR ret = static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1664 ->RCGetRichPresenceEvaluation(cppEvaluation, consoleID);
1665
1666 if (ret == GAME_ERROR_NO_ERROR)
1667 {
1668 *evaluation = new char[cppEvaluation.size() + 1];
1669 std::copy(cppEvaluation.begin(), cppEvaluation.end(), *evaluation);
1670 (*evaluation)[cppEvaluation.size()] = '\0';
1671 }
1672
1673 return ret;
1674 }
1675
1676 inline static GAME_ERROR ADDON_ActivateAchievement(const AddonInstance_Game* instance,
1677 unsigned int cheevoId,
1678 const char* memAddrExpression)
1679 {
1680 if (memAddrExpression == nullptr)
1682
1683 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1684 ->ActivateAchievement(cheevoId, memAddrExpression);
1685 }
1686
1687 inline static GAME_ERROR ADDON_GetCheevoUrlId(const AddonInstance_Game* instance,
1688 void(__cdecl* callback)(const void* context,
1689 const char* achievementUrl,
1690 unsigned int cheevoId),
1691 const void* context)
1692 {
1693 if (callback == nullptr)
1695
1696 const auto cppCallback =
1697 [callback, context](const std::string& achievementUrl, unsigned int cheevoId)
1698 { callback(context, achievementUrl.c_str(), cheevoId); };
1699
1700 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1701 ->GetCheevoUrlId(cppCallback);
1702 }
1703
1704 inline static GAME_ERROR ADDON_RCResetRuntime(const AddonInstance_Game* instance)
1705 {
1706 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->RCResetRuntime();
1707 }
1708
1709 inline static bool ADDON_GetEjectState(const AddonInstance_Game* instance)
1710 {
1711 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->GetEjectState();
1712 }
1713
1714 inline static GAME_ERROR ADDON_SetEjectState(const AddonInstance_Game* instance, bool ejected)
1715 {
1716 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->SetEjectState(ejected);
1717 }
1718
1719 inline static unsigned int ADDON_GetImageIndex(const AddonInstance_Game* instance)
1720 {
1721 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->GetImageIndex();
1722 }
1723
1724 inline static GAME_ERROR ADDON_SetImageIndex(const AddonInstance_Game* instance,
1725 unsigned int imageIndex)
1726 {
1727 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->SetImageIndex(imageIndex);
1728 }
1729
1730 inline static unsigned int ADDON_GetImageCount(const AddonInstance_Game* instance)
1731 {
1732 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->GetImageCount();
1733 }
1734
1735 inline static GAME_ERROR ADDON_AddImageIndex(const AddonInstance_Game* instance)
1736 {
1737 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->AddImageIndex();
1738 }
1739
1740 inline static GAME_ERROR ADDON_ReplaceImageIndex(const AddonInstance_Game* instance,
1741 unsigned int imageIndex,
1742 const char* filePath)
1743 {
1744 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1745 ->ReplaceImageIndex(imageIndex, filePath ? filePath : "");
1746 }
1747
1748 inline static GAME_ERROR ADDON_RemoveImageIndex(const AddonInstance_Game* instance,
1749 unsigned int imageIndex)
1750 {
1751 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1752 ->RemoveImageIndex(imageIndex);
1753 }
1754
1755 inline static GAME_ERROR ADDON_SetInitialImage(const AddonInstance_Game* instance,
1756 unsigned int imageIndex,
1757 const char* filePath)
1758 {
1759 return static_cast<CInstanceGame*>(instance->toAddon->addonInstance)
1760 ->SetInitialImage(imageIndex, filePath ? filePath : "");
1761 }
1762
1763 inline static char* ADDON_GetImagePath(const AddonInstance_Game* instance,
1764 unsigned int imageIndex)
1765 {
1766 std::string cppPath =
1767 static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->GetImagePath(imageIndex);
1768 if (cppPath.empty())
1769 return nullptr;
1770
1771 char* path = new char[cppPath.size() + 1];
1772 std::copy(cppPath.begin(), cppPath.end(), path);
1773 path[cppPath.size()] = '\0';
1774 return path;
1775 }
1776
1777 inline static char* ADDON_GetImageLabel(const AddonInstance_Game* instance,
1778 unsigned int imageIndex)
1779 {
1780 std::string cppLabel =
1781 static_cast<CInstanceGame*>(instance->toAddon->addonInstance)->GetImageLabel(imageIndex);
1782 if (cppLabel.empty())
1783 return nullptr;
1784
1785 char* label = new char[cppLabel.size() + 1];
1786 std::copy(cppLabel.begin(), cppLabel.end(), label);
1787 label[cppLabel.size()] = '\0';
1788 return label;
1789 }
1790
1791 inline static void ADDON_FreeString(const AddonInstance_Game* instance, char* str)
1792 {
1793 delete[] str;
1794 }
1795
1796 AddonInstance_Game* m_instanceData;
1797};
1798
1799} /* namespace addon */
1800} /* namespace kodi */
1801
1802#endif /* __cplusplus */
Definition Game.h:119
Definition AddonBase.h:566
Definition AddonBase.h:502
@ ADDON_LOG_INFO
1 : To include information messages in the log file.
Definition addon_base.h:188
virtual GAME_ERROR AudioAvailable()
Tell the client the frontend is ready for audio.
Definition Game.h:661
CInstanceGame()
Game class constructor.
Definition Game.h:161
std::string GameClientDllPath() const
Callback to Kodi Function The path of the game client being loaded.
Definition Game.h:187
bool ProxyDllPaths(std::vector< std::string > &paths)
Callback to Kodi Function Paths to proxy DLLs used to load the game client.
Definition Game.h:200
bool ResourceDirectories(std::vector< std::string > &dirs)
Callback to Kodi Function The "system" directories of the frontend.
Definition Game.h:224
std::string ProfileDirectory() const
Callback to Kodi Function The writable directory of the frontend.
Definition Game.h:247
bool SupportsVFS() const
Callback to Kodi Function The value of the <supports_vfs> property from addon.xml.
Definition Game.h:258
~CInstanceGame() override=default
Destructor.
bool Extensions(std::vector< std::string > &extensions)
Callback to Kodi Function The extensions in the <extensions> property from addon.xml.
Definition Game.h:271
virtual GAME_ERROR RCGetRichPresenceEvaluation(std::string &evaluation, unsigned int consoleID)
Gets the rich presence evaluation for the current frame. Rich presence must be enabled first or this ...
Definition Game.h:1063
virtual GAME_ERROR RCGetPatchFileUrl(std::string &url, const std::string &username, const std::string &token, unsigned int gameID)
Gets a URL to the endpoint that returns the patch file.
Definition Game.h:993
virtual GAME_ERROR RCGenerateHashFromFile(std::string &hash, unsigned int consoleID, const std::string &filePath)
Generates a RetroAchievements hash for a given game that can be used to identify the game by RetroAch...
Definition Game.h:963
virtual GAME_ERROR ActivateAchievement(unsigned int cheevoId, const std::string &memAddrExpression)
Activate an achievement.
Definition Game.h:1077
virtual GAME_ERROR RCPostRichPresenceUrl(std::string &url, std::string &postData, const std::string &username, const std::string &token, unsigned int gameID, const std::string &richPresence)
Gets a URL to the endpoint that updates the rich presence in the user's RetroAchievements profile.
Definition Game.h:1029
virtual GAME_ERROR RCGetGameIDUrl(std::string &url, const std::string &hash)
Gets a URL to the endpoint that returns the game ID.
Definition Game.h:978
virtual GAME_ERROR RCEnableRichPresence(const std::string &script)
Enables rich presence.
Definition Game.h:1046
virtual GAME_ERROR RCResetRuntime()
Resets the runtime. Must be called each time a new rom is starting and when the savestate is changed.
Definition Game.h:1108
virtual GAME_ERROR SetRetroAchievementsCredentials(const std::string &username, const std::string &token)
Set the credentials of the RetroAchievements user.
Definition Game.h:1009
virtual GAME_ERROR GetCheevoUrlId(const std::function< void(const std::string &achievementUrl, unsigned int cheevoId)> &callback)
Get triggered achievement URL and ID pairs.
Definition Game.h:1095
virtual GAME_ERROR CheatReset()
Reset the cheat system.
Definition Game.h:919
virtual GAME_ERROR GetMemory(GAME_MEMORY type, uint8_t *&data, size_t &size)
Get a region of memory.
Definition Game.h:931
virtual GAME_ERROR SetCheat(unsigned int index, bool enabled, const std::string &code)
Set a cheat code.
Definition Game.h:946
Game system timing.
Definition game.h:1140
GAME_REGION
Game region definition
Definition game.h:585
SPECIAL_GAME_TYPE
Special game types passed into game_load_game_special().
Definition game.h:603
GAME_MEMORY
Game Memory
Definition game.h:622
@ GAME_REGION_UNKNOWN
Game region unknown.
Definition game.h:587
void(* game_proc_address_t)(void)
Hardware framebuffer process function address
Definition game.h:425
Hardware rendering properties
Definition game.h:337
std::vector< std::string > analog_buttons
Analog buttons.
Definition Game.h:86
std::vector< std::string > accelerometers
Accelerometers.
Definition Game.h:92
bool provides_input
Provides input.
Definition Game.h:80
std::vector< std::string > digital_buttons
Digital buttons.
Definition Game.h:83
std::vector< std::string > abs_pointers
Absolute pointers.
Definition Game.h:101
std::vector< std::string > motors
Motors.
Definition Game.h:104
std::string controller_id
Controller identifier.
Definition Game.h:75
std::vector< std::string > rel_pointers
Relative pointers.
Definition Game.h:98
std::vector< std::string > keys
Keys.
Definition Game.h:95
std::vector< std::string > analog_sticks
Analog sticks.
Definition Game.h:89
"C" Game add-on controller layout.
Definition game.h:870
An input event.
Definition game.h:1079
The input topology is the possible ways to connect input devices.
Definition game.h:951
Stream buffers for hardware rendering and zero-copy support
Definition game.h:527
Stream packet and ephemeral metadata
Definition game.h:550
Immutable stream metadata
Definition game.h:502
GAME_ERROR
Game add-on error codes
Definition game.h:28
@ GAME_ERROR_INVALID_PARAMETERS
The parameters of the called method are invalid for this operation.
Definition game.h:42
@ GAME_ERROR_NO_ERROR
No error occurred.
Definition game.h:30
@ GAME_ERROR_NOT_IMPLEMENTED
The method called by the frontend is not implemented.
Definition game.h:36
virtual GAME_ERROR SetImageIndex(unsigned int imageIndex)
Inserts the disk image at the given index.
Definition Game.h:1174
virtual unsigned int GetImageCount()
Gets the number of available disk images.
Definition Game.h:1182
virtual std::string GetImageLabel(unsigned int imageIndex)
Gets a user-friendly label for a disk image.
Definition Game.h:1257
virtual GAME_ERROR ReplaceImageIndex(unsigned int imageIndex, const std::string &filePath)
Replaces the disk image at the given index.
Definition Game.h:1204
virtual GAME_ERROR RemoveImageIndex(unsigned int imageIndex)
Removes the disk image at the given index.
Definition Game.h:1219
virtual std::string GetImagePath(unsigned int imageIndex)
Gets the full path of a disk image.
Definition Game.h:1247
virtual unsigned int GetImageIndex()
Gets the index of the currently inserted disk image.
Definition Game.h:1162
virtual GAME_ERROR SetInitialImage(unsigned int imageIndex, const std::string &filePath)
Sets which image should be initially inserted on load.
Definition Game.h:1234
virtual GAME_ERROR SetEjectState(bool ejected)
Opens or closes the virtual disk tray.
Definition Game.h:1153
virtual GAME_ERROR AddImageIndex()
Adds a new disk image slot.
Definition Game.h:1191
virtual bool GetEjectState()
Returns whether the virtual disk tray is currently ejected.
Definition Game.h:1140
virtual GAME_ERROR HwContextDestroy()
Called before the context is destroyed.
Definition Game.h:613
virtual GAME_ERROR HwContextReset()
Invalidates the current HW context and reinitializes GPU resources.
Definition Game.h:603
bool EnableHardwareRendering(const game_hw_rendering_properties &properties)
Callback to Kodi Function Enable hardware rendering functionality
Definition Game.h:589
game_proc_address_t HwGetProcAddress(const char *sym)
Callback to Kodi Function Get a symbol from the hardware context
Definition Game.h:624
virtual bool HasFeature(const std::string &controller_id, const std::string &feature_name)
Check if input is accepted for a feature on the controller.
Definition Game.h:696
virtual bool InputEvent(const game_input_event &event)
Notify the add-on of an input event.
Definition Game.h:819
virtual void FreeTopology(game_input_topology *topology)
Free the topology's resources.
Definition Game.h:721
virtual bool ConnectController(bool connect, const std::string &port_address, const std::string &controller_id)
Connect/disconnect a controller to a port on the virtual game console.
Definition Game.h:804
virtual void SetControllerLayouts(const std::vector< kodi::addon::GameControllerLayout > &controllers)
Set the layouts for known controllers.
Definition Game.h:732
virtual bool EnableMouse(bool enable, const std::string &controller_id)
Enable/disable mouse input using the specified controller.
Definition Game.h:757
virtual bool EnableKeyboard(bool enable, const std::string &controller_id)
Enable/disable keyboard input using the specified controller.
Definition Game.h:746
bool KodiInputEvent(const game_input_event &event)
Callback to Kodi Function Notify the port of an input event
Definition Game.h:834
virtual game_input_topology * GetTopology()
Get the input topology that specifies which controllers can be connected.
Definition Game.h:713
bool IsOpen() const
Check if the stream opened correctly, e.g. after calling the constructor.
Definition Game.h:552
void ReleaseBuffer(game_stream_buffer &buffer)
Free an allocated buffer.
Definition Game.h:532
void Close()
Free the specified stream.
Definition Game.h:465
bool GetBuffer(unsigned int width, unsigned int height, game_stream_buffer &buffer)
Get a buffer for zero-copy stream data.
Definition Game.h:492
void AddData(const game_stream_packet &packet)
Add a data packet to a stream.
Definition Game.h:512
bool Open(const game_stream_properties &properties)
Create a stream for gameplay data.
Definition Game.h:440
virtual GAME_ERROR LoadGameSpecial(SPECIAL_GAME_TYPE type, const std::vector< std::string > &urls)
Load a game that requires multiple files.
Definition Game.h:324
virtual GAME_ERROR UnloadGame()
Unload the current game.
Definition Game.h:350
virtual GAME_ERROR GetGameTiming(game_system_timing &timing_info)
Get timing information about the loaded game.
Definition Game.h:360
virtual GAME_ERROR RunFrame()
Run a single frame for add-ons that use a game loop.
Definition Game.h:390
virtual bool RequiresGameLoop()
Return true if the client requires the frontend to provide a game loop.
Definition Game.h:382
virtual GAME_ERROR Reset()
Reset the current game.
Definition Game.h:398
virtual GAME_ERROR LoadStandalone()
Begin playing without a game file.
Definition Game.h:340
void CloseGame(void)
Callback to Kodi Function Requests the frontend to stop the current game
Definition Game.h:407
virtual GAME_ERROR LoadGame(const std::string &url)
Load a game.
Definition Game.h:313
virtual GAME_REGION GetRegion()
Get region of the loaded game.
Definition Game.h:371
virtual GAME_ERROR Deserialize(const uint8_t *data, size_t size)
Deserialize the game from the given state.
Definition Game.h:887
virtual GAME_ERROR Serialize(uint8_t *data, size_t size)
Serialize the state of the game.
Definition Game.h:876
virtual size_t SerializeSize()
Get the number of bytes required to serialize the game.
Definition Game.h:865
void ATTR_DLL_LOCAL Log(const ADDON_LOG loglevel, const char *format,...)
Add a message to Kodi's log.
Definition AddonBase.h:1939
std::string ATTR_DLL_LOCAL GetRegion(const std::string &id)
Returns your regions setting as a string for the specified id.
Definition General.h:331
Game instance.
Definition game.h:1331
Game callbacks.
Definition game.h:1225
Definition addon_base.h:269
Internal used structure to have stored C API data above and available for everything below.
Definition AddonBase.h:73