Implement BG callback
This commit is contained in:
@@ -2735,11 +2735,22 @@ class CallBG : Code
|
||||
{
|
||||
override void execute(VM vm)
|
||||
{
|
||||
vm.petitcomputer.callidx++;
|
||||
if (!vm.petitcomputer.callback)
|
||||
{
|
||||
vm.petitcomputer.callidx++;
|
||||
return;
|
||||
}
|
||||
vm.petitcomputer.callidx++;
|
||||
if (!vm.petitcomputer.isValidLayer(vm.petitcomputer.callidx))
|
||||
{
|
||||
vm.petitcomputer.callback = false;
|
||||
return;
|
||||
}
|
||||
auto callback = vm.petitcomputer.getBG(vm.petitcomputer.callidx).callback;
|
||||
vm.pc--;
|
||||
if (!callback.isCallable)
|
||||
{
|
||||
return;
|
||||
}
|
||||
callback(vm);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -249,4 +249,6 @@ class BG
|
||||
}
|
||||
}
|
||||
}
|
||||
import otya.smilebasic.vm;
|
||||
Callback callback;
|
||||
}
|
||||
|
||||
@@ -2223,6 +2223,17 @@ class BuiltinFunction
|
||||
}
|
||||
BGLOAD(p, layer, 0, 0, p.getBG(layer).width, p.getBG(layer).height, ary, 0);
|
||||
}
|
||||
static void BGFUNC(PetitComputer p, int layer, wstring func)
|
||||
{
|
||||
if (!p.isValidLayer(layer))
|
||||
{
|
||||
throw new OutOfRange("BGFUNC", 1);
|
||||
}
|
||||
auto callback = p.vm.createCallback(func);
|
||||
if (callback.type == CallbackType.none)
|
||||
throw new IllegalFunctionCall("BGUNC"/*, 2*/);
|
||||
p.getBG(layer).callback = callback;
|
||||
}
|
||||
static void EFCON()
|
||||
{
|
||||
}
|
||||
|
||||
@@ -526,6 +526,16 @@ class PetitComputer
|
||||
SDL_SetWindowSize(window, cast(int)(currentDisplay.windowSize.width * scaleX), cast(int)(currentDisplay.windowSize.height * scaleY));
|
||||
}
|
||||
|
||||
bool isValidLayer(int layer)
|
||||
{
|
||||
if (layer < 0)
|
||||
return false;
|
||||
if(displaynum)
|
||||
{
|
||||
return layer < bg.length - bgmax;
|
||||
}
|
||||
return layer < bgmax;
|
||||
}
|
||||
BG getBG(int layer)
|
||||
{
|
||||
if(displaynum)
|
||||
|
||||
Reference in New Issue
Block a user