BPCore-Engine icon indicating copy to clipboard operation
BPCore-Engine copied to clipboard

Savegame Support

Open FlorianMarsch opened this issue 2 years ago • 3 comments

Hi, im currently doing some research on GBA Development and this Engine is by far the most user friendly I saw so far. It follows a nice approach and is far more beyond a collection of functions and all that.

What I appreciate is the Lua Layer you added to bring GBA development to more people, was also checking on the Rust Compiler and on other Engines. But what I miss in here is a support for saving your game state to cartridge :/

Is there any plan do support this? by doing so this would become far the most simple Engine I could imagine using for using for real projects :) Also do you consider to open the Engine? I think it could be worth to port some interpolator functions into c/c++ and make then accessible via a Lua function to increase performance

FlorianMarsch avatar Feb 05 '23 12:02 FlorianMarsch

Hi!

For saving, there's a section about writing to battery-backed SRAM in the readme: https://github.com/evanbowman/BPCore-Engine#ram-readwrite Maybe I should add some examples. GBA cartridges contain a memory chip for storing save data. The engine allows you to write to an SRAM chip's memory by using any of the functions for writing values to ram. Commercial cartridges sometimes also included flash and eeprom in place of battery-backed SRAM, but I decided to only support SRAM, as it's simplest and most widely supported option (and easiest from a library user's perspective).

For adding additional functions to the engine in C/C++: In the releases section, I attached a file called libBPCoreEngine_Ext.a. This static library implements the engine code, allowing you to compile your own version of BPCoreEngine.gba with added functionality. Then, implement bpcore_extension_main() to match the function signature found here https://github.com/evanbowman/BPCore-Engine/blob/master/source/bpcore.h, and link your program to the engine library. bpcore_entension_main(lua_State*) accepts a lua_State* as an argument, allowing you to bind natively compiled functions to variables in the lua environment. I can make an example of adding extensions to the engine, as I haven't document the steps very well yet.

evanbowman avatar Feb 05 '23 19:02 evanbowman

When writing engine extensions that link the static library release target (libBPCoreEngine_Ext.a), you'll need to use the correct gcc cross compiler and linker for the ARM7 architecture from devkitpro, so I'll make an example when I have some free time.

evanbowman avatar Feb 05 '23 19:02 evanbowman

I use something like this in my project:

if btn(0) then
    poke4(_SRAM,"Saving")
end

if btn(1) then
    print(peek4(_SRAM))
end

Also, I have tested, and the maximum size for _SRAM is about 31.25KB:

poke4(_SRAM + 4 * 7999,"Saving")

nguyengiabach1201 avatar Jul 22 '24 15:07 nguyengiabach1201