From 69ad3824599f067145ed989b080b74f6d239ac1a Mon Sep 17 00:00:00 2001 From: Prune Juice <118036786+tylerandari13@users.noreply.github.com> Date: Wed, 16 Aug 2023 04:38:30 -0500 Subject: [PATCH] Add `Tux.set_velocity()` to scripting API. (#2580) * add `Player.set_velocity()` to scripting api * Add doxygen wiki comment. i forgot * Add doxygen params to `player.hpp` [ci skip] --- src/scripting/player.cpp | 7 +++++++ src/scripting/player.hpp | 7 +++++++ src/scripting/wrapper.cpp | 42 +++++++++++++++++++++++++++++++++++++++ 3 files changed, 56 insertions(+) diff --git a/src/scripting/player.cpp b/src/scripting/player.cpp index 14fa2a39354..49bbf425831 100644 --- a/src/scripting/player.cpp +++ b/src/scripting/player.cpp @@ -204,6 +204,13 @@ Player::get_velocity_y() const return object.get_physic().get_velocity_y(); } +void +Player::set_velocity(float x, float y) +{ + SCRIPT_GUARD_VOID; + object.get_physic().set_velocity(x, y); +} + bool Player::has_grabbed(const std::string& name) const { diff --git a/src/scripting/player.hpp b/src/scripting/player.hpp index 4eb12633011..653d9187142 100644 --- a/src/scripting/player.hpp +++ b/src/scripting/player.hpp @@ -193,6 +193,13 @@ class Player final */ float get_velocity_y() const; + /** + * Sets the velocity of the player to a programmable/variable speed. + * @param float $x The speed Tux will move on the x axis. + * @param float $y The speed Tux will move on the y axis. + */ + void set_velocity(float x, float y); + /** * Gets the X coordinate of the player. */ diff --git a/src/scripting/wrapper.cpp b/src/scripting/wrapper.cpp index 22ecbc5e3da..f1ee087643e 100644 --- a/src/scripting/wrapper.cpp +++ b/src/scripting/wrapper.cpp @@ -7409,6 +7409,41 @@ static SQInteger Player_get_velocity_y_wrapper(HSQUIRRELVM vm) } +static SQInteger Player_set_velocity_wrapper(HSQUIRRELVM vm) +{ + SQUserPointer data; + if(SQ_FAILED(sq_getinstanceup(vm, 1, &data, nullptr, SQTrue)) || !data) { + sq_throwerror(vm, _SC("'set_velocity' called without instance")); + return SQ_ERROR; + } + scripting::Player* _this = reinterpret_cast (data); + + SQFloat arg0; + if(SQ_FAILED(sq_getfloat(vm, 2, &arg0))) { + sq_throwerror(vm, _SC("Argument 1 not a float")); + return SQ_ERROR; + } + SQFloat arg1; + if(SQ_FAILED(sq_getfloat(vm, 3, &arg1))) { + sq_throwerror(vm, _SC("Argument 2 not a float")); + return SQ_ERROR; + } + + try { + _this->set_velocity(arg0, arg1); + + return 0; + + } catch(std::exception& e) { + sq_throwerror(vm, e.what()); + return SQ_ERROR; + } catch(...) { + sq_throwerror(vm, _SC("Unexpected exception while executing function 'set_velocity'")); + return SQ_ERROR; + } + +} + static SQInteger Player_get_x_wrapper(HSQUIRRELVM vm) { SQUserPointer data; @@ -15815,6 +15850,13 @@ void register_supertux_wrapper(HSQUIRRELVM v) throw SquirrelError(v, "Couldn't register function 'get_velocity_y'"); } + sq_pushstring(v, "set_velocity", -1); + sq_newclosure(v, &Player_set_velocity_wrapper, 0); + sq_setparamscheck(v, SQ_MATCHTYPEMASKSTRING, ".b|nb|n"); + if(SQ_FAILED(sq_createslot(v, -3))) { + throw SquirrelError(v, "Couldn't register function 'set_velocity'"); + } + sq_pushstring(v, "get_x", -1); sq_newclosure(v, &Player_get_x_wrapper, 0); sq_setparamscheck(v, SQ_MATCHTYPEMASKSTRING, ".");