diff --git a/src/McRFPy_API.cpp b/src/McRFPy_API.cpp index 5bc92ca..4df666e 100644 --- a/src/McRFPy_API.cpp +++ b/src/McRFPy_API.cpp @@ -7,7 +7,6 @@ #include #include -std::map McRFPy_API::callbacks; std::vector McRFPy_API::soundbuffers; sf::Music McRFPy_API::music; sf::Sound McRFPy_API::sfx; @@ -18,11 +17,6 @@ PyObject* McRFPy_API::mcrf_module; static PyMethodDef mcrfpyMethods[] = { - {"registerPyAction", McRFPy_API::_registerPyAction, METH_VARARGS, - "Register a callable Python object to correspond to an action string. (actionstr, callable)"}, - - {"registerInputAction", McRFPy_API::_registerInputAction, METH_VARARGS, - "Register a SFML input code to correspond to an action string. (input_code, actionstr)"}, {"createSoundBuffer", McRFPy_API::_createSoundBuffer, METH_VARARGS, "(filename)"}, {"loadMusic", McRFPy_API::_loadMusic, METH_VARARGS, "(filename)"}, @@ -344,63 +338,7 @@ void McRFPy_API::REPL_device(FILE * fp, const char *filename) } // python connection -PyObject* McRFPy_API::_registerPyAction(PyObject *self, PyObject *args) -{ - PyObject* callable; - const char * actionstr; - if (!PyArg_ParseTuple(args, "sO", &actionstr, &callable)) return NULL; - //TODO: if the string already exists in the callbacks map, - // decrease our reference count so it can potentially be garbage collected - callbacks[std::string(actionstr)] = callable; - Py_INCREF(callable); - // return None correctly - Py_INCREF(Py_None); - return Py_None; -} - -PyObject* McRFPy_API::_registerInputAction(PyObject *self, PyObject *args) -{ - int action_code; - const char * actionstr; - if (!PyArg_ParseTuple(args, "iz", &action_code, &actionstr)) return NULL; - - bool success; - - if (actionstr == NULL) { // Action provided is None, i.e. unregister - std::cout << "Unregistering\n"; - success = game->currentScene()->unregisterActionInjected(action_code, std::string(actionstr) + "_py"); - } else { - std::cout << "Registering " << actionstr << "_py to " << action_code << "\n"; - success = game->currentScene()->registerActionInjected(action_code, std::string(actionstr) + "_py"); - } - - success ? Py_INCREF(Py_True) : Py_INCREF(Py_False); - return success ? Py_True : Py_False; - -} - -void McRFPy_API::doAction(std::string actionstr) { - // hard coded actions that require no registration - //std::cout << "Calling Python Action: " << actionstr; - if (!actionstr.compare("startrepl")) return McRFPy_API::REPL(); - if (callbacks.find(actionstr) == callbacks.end()) - { - //std::cout << " (not found)" << std::endl; - return; - } - //std::cout << " (" << PyUnicode_AsUTF8(PyObject_Repr(callbacks[actionstr])) << ")" << std::endl; - PyObject* retval = PyObject_Call(callbacks[actionstr], PyTuple_New(0), NULL); - if (!retval) - { - std::cout << "doAction has raised an exception. It's going to STDERR and being dropped:" << std::endl; - PyErr_Print(); - PyErr_Clear(); - } else if (retval != Py_None) - { - std::cout << "doAction returned a non-None value. It's not an error, it's just not being saved or used." << std::endl; - } -} /* PyObject* McRFPy_API::_refreshFov(PyObject* self, PyObject* args) { @@ -475,14 +413,8 @@ PyObject* McRFPy_API::_getSoundVolume(PyObject* self, PyObject* args) { // Removed deprecated player_input, computerTurn, playerTurn functions // These were part of the old turn-based system that is no longer used - //std::cout << "grid center: " << ag->center_x << ", " << ag->center_y << std::endl << - // "player grid pos: " << e->cGrid->x << ", " << e->cGrid->y << std::endl << - // "player sprite pos: " << e->cGrid->indexsprite.x << ", " << e->cGrid->indexsprite.y << std::endl; - ag->center_x = e->cGrid->indexsprite.x * ag->grid_size + ag->grid_size * 0.5; - ag->center_y = e->cGrid->indexsprite.y * ag->grid_size + ag->grid_size * 0.5; - } -} +/* PyObject* McRFPy_API::_camFollow(PyObject* self, PyObject* args) { PyObject* set_camfollow = NULL; //std::cout << "camFollow Parse Args" << std::endl; diff --git a/src/McRFPy_API.h b/src/McRFPy_API.h index c2538f8..c714448 100644 --- a/src/McRFPy_API.h +++ b/src/McRFPy_API.h @@ -40,9 +40,6 @@ public: static sf::Music music; static sf::Sound sfx; - static std::map callbacks; - static PyObject* _registerPyAction(PyObject*, PyObject*); - static PyObject* _registerInputAction(PyObject*, PyObject*); static PyObject* _createSoundBuffer(PyObject*, PyObject*); static PyObject* _loadMusic(PyObject*, PyObject*); @@ -70,7 +67,6 @@ public: // accept keyboard input from scene static sf::Vector2i cursor_position; - static void doAction(std::string); static void executeScript(std::string); static void executePyString(std::string); diff --git a/src/PyScene.cpp b/src/PyScene.cpp index a42d85f..35f3ae3 100644 --- a/src/PyScene.cpp +++ b/src/PyScene.cpp @@ -54,10 +54,7 @@ void PyScene::do_mouse_input(std::string button, std::string type) void PyScene::doAction(std::string name, std::string type) { - if (ACTIONPY) { - McRFPy_API::doAction(name.substr(0, name.size() - 3)); - } - else if (name.compare("left") == 0 || name.compare("rclick") == 0 || name.compare("wheel_up") == 0 || name.compare("wheel_down") == 0) { + if (name.compare("left") == 0 || name.compare("rclick") == 0 || name.compare("wheel_up") == 0 || name.compare("wheel_down") == 0) { do_mouse_input(name, type); } else if ACTIONONCE("debug_menu") { diff --git a/src/Scene.cpp b/src/Scene.cpp index d9438e3..928e6d9 100644 --- a/src/Scene.cpp +++ b/src/Scene.cpp @@ -30,16 +30,6 @@ std::string Scene::action(int code) return actions[code]; } -bool Scene::registerActionInjected(int code, std::string name) -{ - std::cout << "Inject registered action - default implementation\n"; - return false; -} - -bool Scene::unregisterActionInjected(int code, std::string name) -{ - return false; -} void Scene::key_register(PyObject* callable) { diff --git a/src/Scene.h b/src/Scene.h index 0ebb5a9..e8d322c 100644 --- a/src/Scene.h +++ b/src/Scene.h @@ -4,7 +4,6 @@ #define ACTION(X, Y) (name.compare(X) == 0 && type.compare(Y) == 0) #define ACTIONONCE(X) ((name.compare(X) == 0 && type.compare("start") == 0 && !actionState[name])) #define ACTIONAFTER(X) ((name.compare(X) == 0 && type.compare("end") == 0)) -#define ACTIONPY ((name.size() > 3 && name.compare(name.size() - 3, 3, "_py") == 0)) #include "Common.h" #include @@ -37,8 +36,6 @@ public: bool hasAction(int); std::string action(int); - virtual bool registerActionInjected(int, std::string); - virtual bool unregisterActionInjected(int, std::string); std::shared_ptr>> ui_elements; diff --git a/tests/api_registerPyAction_issue2_test.py b/tests/api_registerPyAction_issue2_test.py deleted file mode 100644 index b00e036..0000000 --- a/tests/api_registerPyAction_issue2_test.py +++ /dev/null @@ -1,90 +0,0 @@ -#!/usr/bin/env python3 -"""Test for registerPyAction - Related to issue #2 (review necessity)""" -import mcrfpy -from mcrfpy import automation -from datetime import datetime - -action_calls = {"test_action": 0, "another_action": 0} - -def test_action_handler(): - """Handler for test_action""" - action_calls["test_action"] += 1 - print(f"test_action called: {action_calls['test_action']} times") - -def another_action_handler(): - """Handler for another_action""" - action_calls["another_action"] += 1 - print(f"another_action called: {action_calls['another_action']} times") - -def test_registerPyAction(): - """Test registerPyAction functionality (Alpha Blocker Issue #2)""" - print("Testing registerPyAction (Issue #2 - Review necessity)...") - print("This is marked as an Alpha Blocker - may need removal") - - # Register actions - try: - mcrfpy.registerPyAction("test_action", test_action_handler) - print("✓ Registered test_action") - - mcrfpy.registerPyAction("another_action", another_action_handler) - print("✓ Registered another_action") - except Exception as e: - print(f"✗ registerPyAction failed: {e}") - print("FAIL") - return - - # Test registerInputAction to map keys to actions - try: - # These are SFML key codes - may need adjustment - mcrfpy.registerInputAction(0, "test_action") # Key A - mcrfpy.registerInputAction(1, "another_action") # Key B - print("✓ Registered input mappings") - except Exception as e: - print(f"✗ registerInputAction failed: {e}") - - # Note: In headless mode, we can't easily trigger these actions - # They would normally be triggered by keyboard input - - print("\nAnalysis for Issue #2:") - print("- registerPyAction allows mapping string names to Python callbacks") - print("- registerInputAction maps keyboard codes to action strings") - print("- This creates a two-step indirection: key -> action string -> callback") - print("- Modern approach might be direct key -> callback mapping") - print("- Or use keypressScene() for all keyboard handling") - - # Try to trigger actions programmatically if possible - # This depends on internal implementation - - def check_results(runtime): - print(f"\nAction call counts:") - print(f"- test_action: {action_calls['test_action']}") - print(f"- another_action: {action_calls['another_action']}") - - if action_calls["test_action"] > 0 or action_calls["another_action"] > 0: - print("✓ Actions were triggered") - else: - print("✗ No actions triggered (expected in headless mode)") - - # Take screenshot - timestamp = datetime.now().strftime("%Y%m%d_%H%M%S") - filename = f"test_registerPyAction_issue2_{timestamp}.png" - automation.screenshot(filename) - print(f"Screenshot saved: {filename}") - print("PASS - Test completed, Issue #2 needs review for removal") - - mcrfpy.delTimer("check_results") - - # In headless mode, run synchronously - print("\nAction call counts:") - print(f"- test_action: {action_calls['test_action']}") - print(f"- another_action: {action_calls['another_action']}") - - print("✗ No actions triggered (expected in headless mode)") - print("PASS - Test completed, Issue #2 needs review for removal") - -# Run test directly in headless mode -test_registerPyAction() - -# Exit cleanly -import sys -sys.exit(0) \ No newline at end of file