vulkan/src/renpy/interpreter.cpp
2026-05-27 21:34:23 -05:00

144 lines
4.1 KiB
C++

#include <assert.h>
#include <stdio.h>
#include "renpy/script.h"
#include "renpy/interpreter.h"
namespace renpy {
void interpreter::reset()
{
pc = 0;
backgroundIndex = -1;
backgroundColor = 0;
shownImagesCount = 0;
say.stringIndex = -1;
say.characterIndex = -1;
menu.count = 0;
interactionWait = false;
}
uint32_t interpreter::findImage(uint32_t imageIndex)
{
for (uint32_t i = 0; i < shownImagesCount; i++) {
if (shownImages[i].imageIndex == imageIndex) {
return i;
}
}
return ~0u;
}
void interpreter::showImage(uint32_t imageIndex, uint32_t transformIndex)
{
uint32_t shownImageIndex = findImage(imageIndex);
if (shownImageIndex == ~0u) {
shownImageIndex = shownImagesCount;
shownImagesCount += 1;
}
shownImages[shownImageIndex].imageIndex = imageIndex;
shownImages[shownImageIndex].transformIndex = transformIndex;
assert(shownImagesCount <= maximumShownImagesCount);
printf("shownImagesCount: %d\n", shownImagesCount);
}
void interpreter::hideImage(uint32_t imageIndex)
{
uint32_t shownImageIndex = findImage(imageIndex);
if (shownImageIndex == ~0u)
return;
for (uint32_t i = shownImageIndex; i < (shownImagesCount - 1); i++) {
shownImages[i] = shownImages[i+1];
printf("here\n");
}
printf("return\n");
shownImagesCount -= 1;
}
void interpreter::interpret_one()
{
assert(pc < (uint32_t)script::statements_length);
language::statement const& statement = script::statements[pc];
switch (statement.type) {
case language::type::play:
fprintf(stderr, "interpret_one[%d]: play\n", pc);
pc += 1;
break;
case language::type::scene_color:
fprintf(stderr, "interpret_one[%d]: scene_color\n", pc);
backgroundIndex = -1;
backgroundColor = statement.scene_color.color;
shownImagesCount = 0;
say.stringIndex = -1;
say.characterIndex = -1;
pc += 1;
break;
case language::type::scene:
fprintf(stderr, "interpret_one[%d]: scene\n", pc);
assert(statement.scene.imageIndex < (uint32_t)script::images_length);
backgroundIndex = statement.scene.imageIndex;
shownImagesCount = 0;
say.stringIndex = -1;
say.characterIndex = -1;
pc += 1;
break;
case language::type::say:
fprintf(stderr, "interpret_one[%d]: say\n", pc);
assert(statement.say.stringIndex < (uint32_t)script::strings_length);
say.stringIndex = statement.say.stringIndex;
say.characterIndex = statement.say.characterIndex;
interactionWait = true;
pc += 1;
break;
case language::type::hide:
fprintf(stderr, "interpret_one[%d]: hide\n", pc);
assert(statement.show.imageIndex < (uint32_t)script::images_length);
assert(statement.show.transformIndex < transformsCount);
hideImage(statement.show.imageIndex);
pc += 1;
break;
case language::type::show:
fprintf(stderr, "interpret_one[%d]: show\n", pc);
assert(statement.show.imageIndex < (uint32_t)script::images_length);
assert(statement.show.transformIndex < transformsCount);
showImage(statement.show.imageIndex, statement.show.transformIndex);
pc += 1;
break;
case language::type::menu:
fprintf(stderr, "interpret_one[%d]: menu\n", pc);
assert(statement.menu.optionIndex < (uint32_t)script::options_length);
assert(statement.menu.count > 0);
menu.count = statement.menu.count;
menu.optionIndex = statement.menu.optionIndex;
pc += 1;
break;
case language::type::jump:
fprintf(stderr, "interpret_one[%d]: jump %d\n", pc, statement.jump.statementIndex);
assert(statement.jump.statementIndex < (uint32_t)script::statements_length);
pc = statement.jump.statementIndex;
break;
default:
fprintf(stderr, "unknown statement type at pc %d\n", pc);
pc += 1;
break;
}
}
void interpreter::interpret()
{
while (!interactionWait) {
//while (true) {
uint32_t last_pc = pc;
interpret_one();
assert(pc != last_pc);
//if (pc == 18) break;
}
}
};