diff --git a/src/GameEngine.cpp b/src/GameEngine.cpp index 74d4b55..a35700b 100644 --- a/src/GameEngine.cpp +++ b/src/GameEngine.cpp @@ -24,7 +24,7 @@ GameEngine::GameEngine() McRFPy_API::executePyString("from UIMenu import *"); McRFPy_API::executePyString("from Grid import *"); - scenes["py"] = new PythonScene(this, "TestScene"); + scenes["py"] = new PythonScene(this, "MusicScene"); IndexSprite::game = this; diff --git a/src/IndexSprite.h b/src/IndexSprite.h index bad9fd9..a5b4d39 100644 --- a/src/IndexSprite.h +++ b/src/IndexSprite.h @@ -4,7 +4,8 @@ class GameEngine; // forward declare class IndexSprite { public: - int texture_index, sprite_index, x, y; + int texture_index, sprite_index; + float x, y; float scale; static GameEngine* game; sf::Sprite drawable(); diff --git a/src/McRFPy_API.cpp b/src/McRFPy_API.cpp index 60a1152..560891f 100644 --- a/src/McRFPy_API.cpp +++ b/src/McRFPy_API.cpp @@ -90,7 +90,7 @@ static PyMethodDef mcrfpyMethods[] = { {"inputMode", McRFPy_API::_inputMode, METH_VARARGS, ""}, {"turnNumber", McRFPy_API::_turnNumber, METH_VARARGS, ""}, {"createEntity", McRFPy_API::_createEntity, METH_VARARGS, ""}, - {"listEntities", McRFPy_API::_listEntities, METH_VARARGS, ""}, + //{"listEntities", McRFPy_API::_listEntities, METH_VARARGS, ""}, {NULL, NULL, 0, NULL} }; @@ -560,10 +560,12 @@ PyObject* McRFPy_API::_listGrids(PyObject*, PyObject*) { PyObject* gridmodule = PyImport_AddModule("Grid"); //already imported PyObject* grid_type = PyObject_GetAttrString(gridmodule, "Grid"); PyObject* gridpoint_type = PyObject_GetAttrString(gridmodule, "GridPoint"); + PyObject* entity_type = PyObject_GetAttrString(gridmodule, "Entity"); - std::cout << PyUnicode_AsUTF8(PyObject_Repr(gridmodule)) << std::endl; - std::cout << PyUnicode_AsUTF8(PyObject_Repr(grid_type)) << std::endl; - std::cout << PyUnicode_AsUTF8(PyObject_Repr(gridpoint_type)) << std::endl; + //std::cout << PyUnicode_AsUTF8(PyObject_Repr(gridmodule)) << std::endl; + //std::cout << PyUnicode_AsUTF8(PyObject_Repr(grid_type)) << std::endl; + //std::cout << PyUnicode_AsUTF8(PyObject_Repr(gridpoint_type)) << std::endl; + //std::cout << PyUnicode_AsUTF8(PyObject_Repr(entity_type)) << std::endl; PyObject* gridlist = PyList_New(grids.size()); std::map::iterator it = grids.begin(); @@ -578,12 +580,12 @@ PyObject* McRFPy_API::_listGrids(PyObject*, PyObject*) { (int)grid->grid_x, (int)grid->grid_y, (int)grid->grid_size, (int)p.x, (int)p.y, (int)s.x, (int)s.y); - std::cout << PyUnicode_AsUTF8(PyObject_Repr(grid_args)) << std::endl; + //std::cout << PyUnicode_AsUTF8(PyObject_Repr(grid_args)) << std::endl; PyObject* gridobj = PyObject_CallObject((PyObject*) grid_type, grid_args); - std::cout << (long)gridobj << std::flush <points) { @@ -604,6 +606,24 @@ PyObject* McRFPy_API::_listGrids(PyObject*, PyObject*) { PyObject* gridpobj = PyObject_CallObject((PyObject*) gridpoint_type, gridp_args); PyList_Append(gridp_list, gridpobj); } + + PyObject* ent_list = PyObject_GetAttrString(gridobj, "entities"); + for (auto e : grid->entities) { + //def __init__(self, parent, tex_index, sprite_index, x, y, visible=True): + PyObject* ent_args = Py_BuildValue("siiiiO", + title.c_str(), + e->cGrid->indexsprite.texture_index, + e->cGrid->indexsprite.sprite_index, + e->cGrid->x, + e->cGrid->y, + e->cGrid->visible ? Py_True: Py_False); + //std::cout << PyUnicode_AsUTF8(PyObject_Repr(ent_args)) << std::endl; + e->cGrid->visible ? Py_INCREF(Py_True) : Py_INCREF(Py_False); + PyObject* entobj = PyObject_CallObject((PyObject*) entity_type, ent_args); + PyList_Append(ent_list, entobj); + //std::cout << PyUnicode_AsUTF8(PyObject_Repr(ent_list)) << std::endl; + } + PyList_SET_ITEM(gridlist, i, gridobj); i++; // count iterator steps } @@ -672,10 +692,10 @@ PyObject* _test_createAnimation(PyObject *self, PyObject *args) { McRFPy_API::menus[menu_key]->box.getPosition(), [](){McRFPy_API::executePyString("print('animation callback')");}, [=](sf::Vector2f v) { - std::cout << "write lambda!" << std::endl; + //std::cout << "write lambda!" << std::endl; McRFPy_API::menus[menu_key]->box.setPosition(v); - std::cout << "Position set to" << McRFPy_API::menus[menu_key]->box.getPosition().x - << ", " << McRFPy_API::menus[menu_key]->box.getPosition().y << std::endl; + //std::cout << "Position set to" << McRFPy_API::menus[menu_key]->box.getPosition().x + //<< ", " << McRFPy_API::menus[menu_key]->box.getPosition().y << std::endl; }, false) ); @@ -687,7 +707,7 @@ PyObject* _test_createAnimation(PyObject *self, PyObject *args) { #define CEQ(A, B) (std::string(A).compare(B) == 0) PyObject* McRFPy_API::_createAnimation(PyObject *self, PyObject *args) { - std::cout << "Creating animation called..." << std::endl; + //std::cout << "Creating animation called..." << std::endl; float duration; const char* parent; const char* target_type; @@ -702,6 +722,7 @@ PyObject* McRFPy_API::_createAnimation(PyObject *self, PyObject *args) { bool loop = PyObject_IsTrue(loop_obj); int target_id = PyLong_AsLong(target_id_obj); Py_INCREF(callback); + /* std::cout << "Animation fields received:" << "\nduration: " << duration << "\nparent: " << parent << @@ -711,6 +732,7 @@ PyObject* McRFPy_API::_createAnimation(PyObject *self, PyObject *args) { "\ncallback: " << PyUnicode_AsUTF8(PyObject_Repr(callback)) << "\nloop: " << loop << "\nvalues: " << PyUnicode_AsUTF8(PyObject_Repr(values_obj)) << std::endl; + */ /* Jank alert: * The following block is meant to raise an exception when index is missing from object animations that require one, * but accept the target_id_obj error (and accept None as an index) for menus/grids. @@ -765,8 +787,8 @@ PyObject* McRFPy_API::_createAnimation(PyObject *self, PyObject *args) { // else if (CEQ(field, "bgcolor")) { ) } else if (CEQ(target_type, "sprite")) { - auto obj = menus[std::string(parent)]->sprites[target_id]; if (CEQ(field, "position")) { + auto obj = menus[std::string(parent)]->sprites[target_id]; PyObject* evdata; if (PyList_Check(values_obj)) evdata = PyList_AsTuple(values_obj); else evdata = values_obj; auto end_value = sf::Vector2f(PyFloat_AsDouble(PyTuple_GetItem(evdata, 0)), @@ -798,8 +820,20 @@ PyObject* McRFPy_API::_createAnimation(PyObject *self, PyObject *args) { } } else if (CEQ(target_type, "entity")) { - //auto obj = grids[std::string(parent)];//->entities[target_id]; - if (CEQ(field, "sprite")) { + if (CEQ(field, "position")) { + auto obj = grids[std::string(parent)]->entities[target_id]; + PyObject* evdata; + if (PyList_Check(values_obj)) evdata = PyList_AsTuple(values_obj); else evdata = values_obj; + auto end_value = sf::Vector2f(PyFloat_AsDouble(PyTuple_GetItem(evdata, 0)), + PyFloat_AsDouble(PyTuple_GetItem(evdata, 1))); + McRFPy_API::animations.push_back(new LerpAnimation(duration, end_value, + sf::Vector2f(obj->cGrid->indexsprite.x, obj->cGrid->indexsprite.y), + [=](){PyObject_Call(callback, PyTuple_New(0), NULL);}, + [=](sf::Vector2f v){obj->cGrid->indexsprite.x = v.x; obj->cGrid->indexsprite.y = v.y;}, + loop) + ); + } + else if (CEQ(field, "sprite")) { auto obj = grids[std::string(parent)]; PyObject* evdata; if (PyList_Check(values_obj)) evdata = PyList_AsTuple(values_obj); else evdata = values_obj; @@ -923,7 +957,10 @@ PyObject* McRFPy_API::_createEntity(PyObject* self, PyObject* args) { Py_INCREF(Py_None); return Py_None; } + +/* PyObject* McRFPy_API::_listEntities(PyObject* self, PyObject* args) { Py_INCREF(Py_None); return Py_None; } +*/ diff --git a/src/McRFPy_API.h b/src/McRFPy_API.h index e08acd9..6effe2a 100644 --- a/src/McRFPy_API.h +++ b/src/McRFPy_API.h @@ -73,7 +73,7 @@ public: //static PyObject* _listButtons(PyObject*, PyObject*); static PyObject* _createEntity(PyObject*, PyObject*); - static PyObject* _listEntities(PyObject*, PyObject*); + //static PyObject* _listEntities(PyObject*, PyObject*); static PyObject* _createGrid(PyObject*, PyObject*); static PyObject* _listGrids(PyObject*, PyObject*); diff --git a/src/scripts/MusicScene.py b/src/scripts/MusicScene.py new file mode 100644 index 0000000..1985baf --- /dev/null +++ b/src/scripts/MusicScene.py @@ -0,0 +1,79 @@ +import mcrfpy +BLACK = (0, 0, 0) +WHITE = (255, 255, 255) +RED, GREEN, BLUE = (255, 0, 0), (0, 255, 0), (0, 0, 255) +DARKRED, DARKGREEN, DARKBLUE = (192, 0, 0), (0, 192, 0), (0, 0, 192) +class MusicScene: + def __init__(self, ui_name = "demobox1", grid_name = "demogrid"): + # Texture & Sound Loading + print("Load textures") + mcrfpy.createTexture("./assets/test_portraits.png", 32, 8, 8) #0 - portraits + mcrfpy.createTexture("./assets/alives_other.png", 16, 64, 64) #1 - TinyWorld NPCs + mcrfpy.createTexture("./assets/alives_other.png", 32, 32, 32) #2 - TinyWorld NPCs - 2x2 sprite + # {"createSoundBuffer", McRFPy_API::_createSoundBuffer, METH_VARARGS, "(filename)"}, + #{"loadMusic", McRFPy_API::_loadMusic, METH_VARARGS, "(filename)"}, + #{"setMusicVolume", McRFPy_API::_setMusicVolume, METH_VARARGS, "(int)"}, + #{"setSoundVolume", McRFPy_API::_setSoundVolume, METH_VARARGS, "(int)"}, + #{"playSound", McRFPy_API::_playSound, METH_VARARGS, "(int)"}, + #{"getMusicVolume", McRFPy_API::_getMusicVolume, METH_VARARGS, ""}, + #{"getSoundVolume", McRFPy_API::_getSoundVolume, METH_VARARGS, ""}, + + mcrfpy.loadMusic("./assets/ultima.ogg") + mcrfpy.createSoundBuffer("./assets/boom.wav") + self.ui_name = ui_name + self.grid_name = grid_name + + print("Create UI") + # Create dialog UI + mcrfpy.createMenu(ui_name, 20, 540, 500, 200) + mcrfpy.createCaption(ui_name, f"Music Volume: {mcrfpy.getMusicVolume()}", 24, RED) + mcrfpy.createCaption(ui_name, f"SFX Volume: {mcrfpy.getSoundVolume()}", 24, RED) + #mcrfpy.createButton(ui_name, 250, 20, 100, 50, DARKBLUE, (0, 0, 0), "clicky", "testaction") + mcrfpy.createButton(ui_name, 250, 0, 130, 40, DARKRED, (0, 0, 0), "Music+", "mvol+") + mcrfpy.createButton(ui_name, 250, 0, 130, 40, DARKGREEN, (0, 0, 0), "Music-", "mvol-") + mcrfpy.createButton(ui_name, 250, 0, 130, 40, DARKBLUE, GREEN, "SFX+", "svol+") + mcrfpy.createButton(ui_name, 250, 0, 130, 40, DARKBLUE, RED, "SFX-", "svol-") + mcrfpy.createButton(ui_name, 250, 0, 130, 40, DARKRED, (0, 0, 0), "REPL", "startrepl") + mcrfpy.createSprite(ui_name, 1, 0, 20, 40, 3.0) + + print("Create UI 2") + entitymenu = "entitytestmenu" + + mcrfpy.createMenu(entitymenu, 840, 20, 20, 500) + mcrfpy.createButton(entitymenu, 0, 10, 150, 40, DARKBLUE, BLACK, "PlayM", "playm") + mcrfpy.createButton(entitymenu, 0, 60, 150, 40, DARKBLUE, BLACK, "StopM", "stopm") + mcrfpy.createButton(entitymenu, 0, 110, 150, 40, DARKBLUE, BLACK, "SFX", "boom") + print("Make UIs visible") + self.menus = mcrfpy.listMenus() + self.menus[0].visible = True + self.menus[1].w = 170 + self.menus[1].visible = True + mcrfpy.modMenu(self.menus[0]) + mcrfpy.modMenu(self.menus[1]) + self.mvol = mcrfpy.getMusicVolume() + self.svol = mcrfpy.getSoundVolume() + mcrfpy.registerPyAction("mvol+", lambda: self.setmvol(self.mvol+10)) + mcrfpy.registerPyAction("mvol-", lambda: self.setmvol(self.mvol-10)) + mcrfpy.registerPyAction("svol+", lambda: self.setsvol(self.svol+10)) + mcrfpy.registerPyAction("svol-", lambda: self.setsvol(self.svol-10)) + mcrfpy.registerPyAction("playm", lambda: None) + mcrfpy.registerPyAction("stopm", lambda: None) + mcrfpy.registerPyAction("boom", lambda: mcrfpy.playSound(0)) + + def setmvol(self, v): + mcrfpy.setMusicVolume(int(v)) + self.menus[0].captions[0].text = f"Music Volume: {mcrfpy.getMusicVolume():.1f}" + mcrfpy.modMenu(self.menus[0]) + self.mvol = mcrfpy.getMusicVolume() + + def setsvol(self, v): + mcrfpy.setSoundVolume(int(v)) + self.menus[0].captions[1].text = f"Sound Volume: {mcrfpy.getSoundVolume():.1f}" + mcrfpy.modMenu(self.menus[0]) + self.svol = mcrfpy.getSoundVolume() + +scene = None +def start(): + global scene + scene = MusicScene() +