/** * Constructor of an extension declares everything the extension contains: objects, actions, conditions and expressions. */ TextObjectJsExtension() { DeclareTextObjectExtension(*this); GetObjectMetadata("TextObject::Text") .SetIncludeFile("TextObject/textruntimeobject.js") .AddIncludeFile("TextObject/textruntimeobject-pixi-renderer.js") .AddIncludeFile("TextObject/textruntimeobject-cocos-renderer.js"); GetAllActionsForObject("TextObject::Text")["TextObject::String"].SetFunctionName("setString").SetGetter("getString").SetIncludeFile("TextObject/textruntimeobject.js"); GetAllConditionsForObject("TextObject::Text")["TextObject::String"].SetFunctionName("getString").SetIncludeFile("TextObject/textruntimeobject.js"); GetAllActionsForObject("TextObject::Text")["TextObject::Size"].SetFunctionName("setCharacterSize").SetGetter("getCharacterSize").SetIncludeFile("TextObject/textruntimeobject.js"); GetAllConditionsForObject("TextObject::Text")["TextObject::Size"].SetFunctionName("getCharacterSize").SetIncludeFile("TextObject/textruntimeobject.js"); GetAllActionsForObject("TextObject::Text")["TextObject::Angle"].SetFunctionName("setAngle").SetGetter("getAngle").SetIncludeFile("TextObject/textruntimeobject.js"); GetAllConditionsForObject("TextObject::Text")["TextObject::Angle"].SetFunctionName("getAngle").SetIncludeFile("TextObject/textruntimeobject.js"); GetAllActionsForObject("TextObject::Text")["TextObject::Opacity"].SetFunctionName("setOpacity").SetGetter("getOpacity").SetIncludeFile("TextObject/textruntimeobject.js"); GetAllConditionsForObject("TextObject::Text")["TextObject::Opacity"].SetFunctionName("getOpacity").SetIncludeFile("TextObject/textruntimeobject.js"); GetAllActionsForObject("TextObject::Text")["TextObject::SetBold"].SetFunctionName("setBold").SetIncludeFile("TextObject/textruntimeobject.js"); GetAllConditionsForObject("TextObject::Text")["TextObject::IsBold"].SetFunctionName("isBold").SetIncludeFile("TextObject/textruntimeobject.js"); GetAllActionsForObject("TextObject::Text")["TextObject::SetItalic"].SetFunctionName("setItalic").SetIncludeFile("TextObject/textruntimeobject.js"); GetAllConditionsForObject("TextObject::Text")["TextObject::IsItalic"].SetFunctionName("isItalic").SetIncludeFile("TextObject/textruntimeobject.js"); GetAllExpressionsForObject("TextObject::Text")["Opacity"].SetFunctionName("getOpacity").SetIncludeFile("TextObject/textruntimeobject.js"); GetAllExpressionsForObject("TextObject::Text")["Angle"].SetFunctionName("getAngle").SetIncludeFile("TextObject/textruntimeobject.js"); GetAllStrExpressionsForObject("TextObject::Text")["String"].SetFunctionName("getString").SetIncludeFile("TextObject/textruntimeobject.js"); GetAllActionsForObject("TextObject::Text")["TextObject::ChangeColor"].SetFunctionName("setColor").SetIncludeFile("TextObject/textruntimeobject.js"); //Unimplemented actions and conditions: GetAllActionsForObject("TextObject::Text")["TextObject::Font"].SetFunctionName(""); GetAllActionsForObject("TextObject::Text")["TextObject::SetUnderlined"].SetFunctionName(""); GetAllConditionsForObject("TextObject::Text")["TextObject::IsUnderlined"].SetFunctionName(""); StripUnimplementedInstructionsAndExpressions(); GD_COMPLETE_EXTENSION_COMPILATION_INFORMATION(); };
BaseObjectExtension::BaseObjectExtension() { gd::BuiltinExtensionsImplementer::ImplementsBaseObjectExtension(*this); gd::ObjectMetadata & obj = GetObjectMetadata(""); AddRuntimeObject(obj, "", &CreateBaseRuntimeObject); #if defined(GD_IDE_ONLY) std::map<gd::String, gd::InstructionMetadata > & objectActions = GetAllActionsForObject(""); std::map<gd::String, gd::InstructionMetadata > & objectConditions = GetAllConditionsForObject(""); std::map<gd::String, gd::ExpressionMetadata > & objectExpressions = GetAllExpressionsForObject(""); std::map<gd::String, gd::ExpressionMetadata > & objectStrExpressions = GetAllStrExpressionsForObject(""); objectConditions["PosX"].SetFunctionName("GetX").SetManipulatedType("number"); objectActions["MettreX"].SetFunctionName("SetX").SetManipulatedType("number").SetGetter("GetX"); objectConditions["PosY"].SetFunctionName("GetY").SetManipulatedType("number"); objectActions["MettreY"].SetFunctionName("SetY").SetManipulatedType("number").SetGetter("GetY"); objectActions["MettreXY"].SetFunctionName("SetXY"); objectConditions["Angle"].SetFunctionName("GetAngle"); objectActions["SetAngle"].SetFunctionName("SetAngle").SetManipulatedType("number").SetGetter("GetAngle"); objectActions["Rotate"].SetFunctionName("Rotate"); objectActions["RotateTowardAngle"].SetFunctionName("RotateTowardAngle"); objectActions["RotateTowardPosition"].SetFunctionName("RotateTowardPosition"); objectActions["MettreAutourPos"].SetFunctionName("PutAroundAPosition"); objectActions["AddForceXY"].SetFunctionName("AddForce"); objectActions["AddForceAL"].SetFunctionName("AddForceUsingPolarCoordinates"); objectActions["AddForceVersPos"].SetFunctionName("AddForceTowardPosition"); objectActions["AddForceTournePos"].SetFunctionName("AddForceToMoveAround"); objectActions["Arreter"].SetFunctionName("ClearForce"); objectActions["Delete"].SetFunctionName("DeleteFromScene"); objectActions["ChangePlan"].SetFunctionName("SetZOrder").SetGetter("GetZOrder").SetManipulatedType("number"); objectActions["ChangeLayer"].SetFunctionName("SetLayer"); objectActions["ModVarObjet"].SetFunctionName("ReturnVariable").SetManipulatedType("number"); objectActions["ModVarObjetTxt"].SetFunctionName("ReturnVariable").SetManipulatedType("string"); objectConditions["ObjectVariableChildExists"].SetFunctionName("VariableChildExists"); objectActions["ObjectVariableRemoveChild"].SetFunctionName("VariableRemoveChild"); objectActions["Cache"].SetFunctionName("SetHidden"); objectActions["Montre"].SetFunctionName("SetHidden"); objectConditions["Plan"].SetFunctionName("GetZOrder").SetManipulatedType("number"); objectConditions["Layer"].SetFunctionName("IsOnLayer"); objectConditions["Visible"].SetFunctionName("IsVisible"); objectConditions["Invisible"].SetFunctionName("IsHidden"); objectConditions["Arret"].SetFunctionName("IsStopped"); objectConditions["Vitesse"].SetFunctionName("TotalForceLength").SetManipulatedType("number"); objectConditions["AngleOfDisplacement"].SetFunctionName("TestAngleOfDisplacement"); objectConditions["VarObjet"].SetFunctionName("ReturnVariable").SetManipulatedType("number"); objectConditions["VarObjetTxt"].SetFunctionName("ReturnVariable").SetManipulatedType("string"); objectConditions["VarObjetDef"].SetFunctionName("VariableExists"); objectConditions["BehaviorActivated"].SetFunctionName("BehaviorActivated"); objectActions["ActivateBehavior"].SetFunctionName("ActivateBehavior"); objectActions["AddForceVers"].SetFunctionName("AddForceTowardObject").SetIncludeFile("GDCpp/BuiltinExtensions/ObjectTools.h"); objectActions["AddForceTourne"].SetFunctionName("AddForceToMoveAroundObject").SetIncludeFile("GDCpp/BuiltinExtensions/ObjectTools.h"); objectActions["MettreAutour"].SetFunctionName("PutAroundObject").SetIncludeFile("GDCpp/BuiltinExtensions/ObjectTools.h"); objectActions["Rebondir"].SetFunctionName("SeparateObjectsWithForces").SetIncludeFile("GDCpp/BuiltinExtensions/ObjectTools.h"); objectActions["Ecarter"].SetFunctionName("SeparateObjectsWithoutForces").SetIncludeFile("GDCpp/BuiltinExtensions/ObjectTools.h"); objectActions["SeparateFromObjects"].SetFunctionName("SeparateFromObjects").SetIncludeFile("GDCpp/BuiltinExtensions/ObjectTools.h"); objectExpressions["X"].SetFunctionName("GetX"); objectExpressions["Y"].SetFunctionName("GetY"); objectExpressions["ForceX"].SetFunctionName("TotalForceX"); objectExpressions["ForceY"].SetFunctionName("TotalForceY"); objectExpressions["ForceAngle"].SetFunctionName("TotalForceAngle"); objectExpressions["Angle"].SetFunctionName("GetAngle"); objectExpressions["ForceLength"].SetFunctionName("TotalForceLength"); objectExpressions["Longueur"].SetFunctionName("TotalForceLength"); objectExpressions["Width"].SetFunctionName("GetWidth"); objectExpressions["Largeur"].SetFunctionName("GetWidth"); objectExpressions["Height"].SetFunctionName("GetHeight"); objectExpressions["Hauteur"].SetFunctionName("GetHeight"); objectExpressions["ZOrder"].SetFunctionName("GetZOrder"); objectExpressions["Plan"].SetFunctionName("GetZOrder"); objectExpressions["Distance"].SetFunctionName("GetDistanceWithObject"); objectExpressions["SqDistance"].SetFunctionName("GetSqDistanceWithObject"); objectExpressions["Variable"].SetFunctionName("GetVariableValue").SetStatic(); objectStrExpressions["VariableString"].SetFunctionName("GetVariableString").SetStatic(); GetAllActions()["Create"].SetFunctionName("CreateObjectOnScene").SetIncludeFile("GDCpp/BuiltinExtensions/RuntimeSceneTools.h"); GetAllActions()["CreateByName"].SetFunctionName("CreateObjectFromGroupOnScene").SetIncludeFile("GDCpp/BuiltinExtensions/RuntimeSceneTools.h"); GetAllActions()["AjoutObjConcern"].SetFunctionName("PickAllObjects").SetIncludeFile("GDCpp/BuiltinExtensions/RuntimeSceneTools.h"); GetAllActions()["AjoutHasard"].SetFunctionName("PickRandomObject").SetIncludeFile("GDCpp/BuiltinExtensions/RuntimeSceneTools.h"); GetAllActions()["MoveObjects"].SetFunctionName("MoveObjects").SetIncludeFile("GDCpp/BuiltinExtensions/RuntimeSceneTools.h"); GetAllConditions()["SeDirige"].SetFunctionName("MovesToward").SetIncludeFile("GDCpp/BuiltinExtensions/ObjectTools.h"); GetAllConditions()["Distance"].SetFunctionName("DistanceBetweenObjects").SetIncludeFile("GDCpp/BuiltinExtensions/ObjectTools.h"); GetAllConditions()["AjoutObjConcern"].SetFunctionName("PickAllObjects").SetIncludeFile("GDCpp/BuiltinExtensions/RuntimeSceneTools.h"); GetAllConditions()["AjoutHasard"].SetFunctionName("PickRandomObject").SetIncludeFile("GDCpp/BuiltinExtensions/RuntimeSceneTools.h"); GetAllConditions()["PickNearest"].SetFunctionName("PickNearestObject").SetIncludeFile("GDCpp/BuiltinExtensions/RuntimeSceneTools.h"); GetAllConditions()["NbObjet"].SetFunctionName("PickedObjectsCount").SetManipulatedType("number").SetIncludeFile("GDCpp/BuiltinExtensions/ObjectTools.h"); GetAllConditions()["CollisionNP"].SetFunctionName("HitBoxesCollision").SetIncludeFile("GDCpp/BuiltinExtensions/ObjectTools.h"); GetAllConditions()["EstTourne"].SetFunctionName("ObjectsTurnedToward").SetIncludeFile("GDCpp/BuiltinExtensions/ObjectTools.h"); GetAllExpressions()["Count"].SetFunctionName("PickedObjectsCount").SetIncludeFile("GDCpp/BuiltinExtensions/ObjectTools.h"); #endif }
BaseObjectExtension::BaseObjectExtension() { SetExtensionInformation("BuiltinObject", _("Base object"), _("Base object"), "Florian Rival", "Open source ( LGPL )"); CloneExtension("Game Develop C++ platform", "BuiltinObject"); std::map<std::string, gd::InstructionMetadata > & objectActions = GetAllActionsForObject(""); std::map<std::string, gd::InstructionMetadata > & objectConditions = GetAllConditionsForObject(""); std::map<std::string, gd::ExpressionMetadata > & objectExpressions = GetAllExpressionsForObject(""); std::map<std::string, gd::StrExpressionMetadata > & objectStrExpressions = GetAllStrExpressionsForObject(""); objectActions["MettreX"].codeExtraInformation .SetFunctionName("setX").SetAssociatedGetter("getX").SetIncludeFile("runtimeobject.js"); objectActions["MettreY"].codeExtraInformation .SetFunctionName("setY").SetAssociatedGetter("getY").SetIncludeFile("runtimeobject.js"); objectConditions["PosX"].codeExtraInformation .SetFunctionName("getX").SetIncludeFile("runtimeobject.js"); objectConditions["PosY"].codeExtraInformation .SetFunctionName("getY").SetIncludeFile("runtimeobject.js"); objectActions["ChangeLayer"].codeExtraInformation .SetFunctionName("setLayer").SetIncludeFile("runtimeobject.js"); objectConditions["Layer"].codeExtraInformation .SetFunctionName("isOnLayer").SetIncludeFile("runtimeobject.js"); objectActions["ChangePlan"].codeExtraInformation .SetFunctionName("setZOrder").SetAssociatedGetter("getZOrder").SetIncludeFile("runtimeobject.js"); objectConditions["Plan"].codeExtraInformation .SetFunctionName("getZOrder").SetIncludeFile("runtimeobject.js"); objectActions["Cache"].codeExtraInformation .SetFunctionName("hide").SetIncludeFile("runtimeobject.js"); objectActions["Montre"].codeExtraInformation .SetFunctionName("hide").SetIncludeFile("runtimeobject.js"); objectConditions["Visible"].codeExtraInformation .SetFunctionName("isVisible").SetIncludeFile("runtimeobject.js"); objectConditions["Invisible"].codeExtraInformation .SetFunctionName("isHidden").SetIncludeFile("runtimeobject.js"); objectActions["Delete"].codeExtraInformation .SetFunctionName("deleteFromScene"); objectActions["MettreAutourPos"].codeExtraInformation .SetFunctionName("putAround"); objectActions["MettreAutour"].codeExtraInformation .SetFunctionName("putAroundObject").SetIncludeFile("runtimeobject.js"); objectConditions["VarObjet"].codeExtraInformation .SetFunctionName("getVariableNumber").SetIncludeFile("runtimeobject.js"); objectConditions["VarObjetTxt"].codeExtraInformation .SetFunctionName("getVariableString").SetIncludeFile("runtimeobject.js"); objectConditions["VarObjetDef"].codeExtraInformation .SetFunctionName("hasVariable").SetIncludeFile("runtimeobject.js"); objectActions["ModVarObjet"].codeExtraInformation .SetFunctionName("setVariableNumber").SetAssociatedGetter("getVariableNumber").SetIncludeFile("runtimeobject.js"); objectActions["ModVarObjetTxt"].codeExtraInformation .SetFunctionName("setVariableString").SetAssociatedGetter("getVariableString").SetIncludeFile("runtimeobject.js"); objectActions["AddForceXY"].codeExtraInformation .SetFunctionName("addForce").SetIncludeFile("runtimeobject.js"); objectActions["AddForceAL"].codeExtraInformation .SetFunctionName("addPolarForce").SetIncludeFile("runtimeobject.js"); objectActions["AddForceVersPos"].codeExtraInformation .SetFunctionName("addForceTowardPosition").SetIncludeFile("runtimeobject.js"); objectActions["AddForceVers"].codeExtraInformation .SetFunctionName("addForceTowardObject").SetIncludeFile("runtimeobject.js"); objectActions["Arreter"].codeExtraInformation .SetFunctionName("clearForces").SetIncludeFile("runtimeobject.js"); objectConditions["Arret"].codeExtraInformation .SetFunctionName("hasNoForces").SetIncludeFile("runtimeobject.js"); objectConditions["Vitesse"].codeExtraInformation .SetFunctionName("getAverageForce().getLength").SetIncludeFile("runtimeobject.js"); objectConditions["AngleOfDisplacement"].codeExtraInformation .SetFunctionName("averageForceAngleIs").SetIncludeFile("runtimeobject.js"); objectActions["SeparateFromObjects"].codeExtraInformation .SetFunctionName("separateFromObjects").SetIncludeFile("runtimeobject.js"); objectActions["Ecarter"].codeExtraInformation //Deprecated .SetFunctionName("separateObjectsWithoutForces").SetIncludeFile("runtimeobject.js"); objectActions["Rebondir"].codeExtraInformation //Deprecated .SetFunctionName("separateObjectsWithForces").SetIncludeFile("runtimeobject.js"); objectConditions["AutomatismActivated"].codeExtraInformation .SetFunctionName("automatismActivated").SetIncludeFile("runtimeobject.js"); objectActions["ActivateAutomatism"].codeExtraInformation .SetFunctionName("activateAutomatism").SetIncludeFile("runtimeobject.js"); objectConditions["ObjectVariableChildExists"].codeExtraInformation .SetFunctionName("variableChildExists").SetIncludeFile("runtimeobject.js"); objectActions["ObjectVariableRemoveChild"].codeExtraInformation .SetFunctionName("variableRemoveChild").SetIncludeFile("runtimeobject.js"); objectExpressions["X"].codeExtraInformation.SetFunctionName("getX"); objectExpressions["Y"].codeExtraInformation.SetFunctionName("getY"); objectExpressions["ZOrder"].codeExtraInformation.SetFunctionName("getZOrder"); objectExpressions["Plan"].codeExtraInformation.SetFunctionName("getZOrder"); objectExpressions["Width"].codeExtraInformation.SetFunctionName("getWidth"); objectExpressions["Height"].codeExtraInformation.SetFunctionName("getHeight"); objectExpressions["Largeur"].codeExtraInformation.SetFunctionName("getWidth"); //Deprecated objectExpressions["Hauteur"].codeExtraInformation.SetFunctionName("getHeight"); //Deprecated objectExpressions["Variable"].codeExtraInformation.SetFunctionName("gdjs.RuntimeObject.getVariableNumber").SetStatic(); objectStrExpressions["VariableString"].codeExtraInformation.SetFunctionName("gdjs.RuntimeObject.getVariableString").SetStatic(); objectExpressions["ForceX"].codeExtraInformation.SetFunctionName("getAverageForce().getX"); objectExpressions["ForceY"].codeExtraInformation.SetFunctionName("getAverageForce().getY"); objectExpressions["ForceAngle"].codeExtraInformation.SetFunctionName("getAverageForce().getAngle"); objectExpressions["Angle"].codeExtraInformation.SetFunctionName("getAverageForce().getAngle"); //Deprecated objectExpressions["ForceLength"].codeExtraInformation.SetFunctionName("getAverageForce().getLength"); objectExpressions["Longueur"].codeExtraInformation.SetFunctionName("getAverageForce().getLength"); //Deprecated objectExpressions["Distance"].codeExtraInformation.SetFunctionName("getDistanceFrom"); objectExpressions["SqDistance"].codeExtraInformation.SetFunctionName("getSqDistanceFrom"); GetAllActions()["Create"].codeExtraInformation .SetFunctionName("gdjs.evtTools.object.createObjectOnScene"); GetAllActions()["CreateByName"].codeExtraInformation .SetFunctionName("gdjs.evtTools.object.createObjectFromGroupOnScene"); GetAllExpressions()["Count"].codeExtraInformation .SetFunctionName("gdjs.evtTools.object.pickedObjectsCount"); GetAllConditions()["NbObjet"].codeExtraInformation .SetFunctionName("gdjs.evtTools.object.pickedObjectsCount"); GetAllConditions()["CollisionNP"] .AddCodeOnlyParameter("currentScene", "") //We need an extra parameter pointing to the scene. .codeExtraInformation .SetFunctionName("gdjs.evtTools.object.hitBoxesCollisionTest"); GetAllConditions()["Distance"].codeExtraInformation .SetFunctionName("gdjs.evtTools.object.distanceTest"); GetAllConditions()["SeDirige"].codeExtraInformation .SetFunctionName("gdjs.evtTools.object.movesTowardTest"); GetAllConditions()["EstTourne"].codeExtraInformation .SetFunctionName("gdjs.evtTools.object.turnedTowardTest"); GetAllActions()["AjoutObjConcern"].codeExtraInformation .SetFunctionName("gdjs.evtTools.object.pickAllObjects"); GetAllConditions()["AjoutObjConcern"].codeExtraInformation .SetFunctionName("gdjs.evtTools.object.pickAllObjects"); GetAllActions()["AjoutHasard"].codeExtraInformation .SetFunctionName("gdjs.evtTools.object.pickRandomObject"); GetAllConditions()["AjoutHasard"].codeExtraInformation .SetFunctionName("gdjs.evtTools.object.pickRandomObject"); { class CodeGenerator : public gd::InstructionMetadata::ExtraInformation::CustomCodeGenerator { public: virtual std::string GenerateCode(gd::Instruction &, gd::EventsCodeGenerator &, gd::EventsCodeGenerationContext &) { return "runtimeScene.updateObjectsForces();"; }; }; gd::InstructionMetadata::ExtraInformation::CustomCodeGenerator * codeGen = new CodeGenerator; GetAllActions()["MoveObjects"].codeExtraInformation .SetCustomCodeGenerator(boost::shared_ptr<gd::InstructionMetadata::ExtraInformation::CustomCodeGenerator>(codeGen)); } { class CodeGenerator : public gd::InstructionMetadata::ExtraInformation::CustomCodeGenerator { public: virtual std::string GenerateCode(gd::Instruction & instruction, gd::EventsCodeGenerator & codeGenerator, gd::EventsCodeGenerationContext & context) { std::string outputCode; std::vector<std::string> realObjects = codeGenerator.ExpandObjectsName(instruction.GetParameter(0).GetPlainString(), context); for (unsigned int i = 0;i<realObjects.size();++i) { context.SetCurrentObject(realObjects[i]); context.ObjectsListNeeded(realObjects[i]); std::string newX, newY; std::string expression1Code; { gd::CallbacksForGeneratingExpressionCode callbacks(expression1Code, codeGenerator, context); gd::ExpressionParser parser(instruction.GetParameters()[2].GetPlainString()); if (!parser.ParseMathExpression(codeGenerator.GetPlatform(), codeGenerator.GetProject(), codeGenerator.GetLayout(), callbacks) || expression1Code.empty()) expression1Code = "0"; } std::string expression2Code; { gd::CallbacksForGeneratingExpressionCode callbacks(expression2Code, codeGenerator, context); gd::ExpressionParser parser(instruction.GetParameters()[4].GetPlainString()); if (!parser.ParseMathExpression(codeGenerator.GetPlatform(), codeGenerator.GetProject(), codeGenerator.GetLayout(), callbacks) || expression2Code.empty()) expression2Code = "0"; } std::string op1 = instruction.GetParameter(1).GetPlainString(); if ( op1 == "=" || op1.empty() ) newX = expression1Code; else if ( op1 == "/" || op1 == "*" || op1 == "-" || op1 == "+" ) newX = codeGenerator.GetObjectListName(realObjects[i], context)+"[i].getX() "+op1 + expression1Code; else return ""; std::string op2 = instruction.GetParameter(3).GetPlainString(); if ( op2 == "=" || op2.empty() ) newY = expression2Code; else if ( op2 == "/" || op2 == "*" || op2 == "-" || op2 == "+" ) newY = codeGenerator.GetObjectListName(realObjects[i], context)+"[i].getY() "+op2 + expression2Code; else return ""; std::string call = codeGenerator.GetObjectListName(realObjects[i], context)+"[i].setPosition("+newX+","+newY+")"; outputCode += "for(var i = 0, len = "+codeGenerator.GetObjectListName(realObjects[i], context)+".length ;i < len;++i) {\n"; outputCode += " "+call+";\n"; outputCode += "}\n"; context.SetNoCurrentObject(); } return outputCode; }; }; gd::InstructionMetadata::ExtraInformation::CustomCodeGenerator * codeGen = new CodeGenerator; objectActions["MettreXY"].codeExtraInformation .SetCustomCodeGenerator(boost::shared_ptr<gd::InstructionMetadata::ExtraInformation::CustomCodeGenerator>(codeGen)); } StripUnimplementedInstructionsAndExpressions(); //Unimplemented things are listed here: /* obj.AddAction("AddForceTournePos", _("Add a force so as to move around a position"), _("Add a force to an object so as it rotates toward a position.\nNote that the moving is not precise, especially if the speed is high.\nTo position an object around a position more precisly, use the actions in the category \"Position\"."), _("Rotate _PARAM0_ around _PARAM1_;_PARAM2_ with _PARAM3_�/sec and _PARAM4_ pixels away"), _("Displacement"), "res/actions/forceTourne24.png", "res/actions/forceTourne.png") .AddParameter("object", _("Object")) .AddParameter("expression", _("X position of the center")) .AddParameter("expression", _("Y position of the center")) .AddParameter("expression", _("Speed ( in Degrees per seconds )")) .AddParameter("expression", _("Distance ( in pixels )")) .AddParameter("expression", _("Damping ( Default : 0 )")) .codeExtraInformation.SetFunctionName("AddForceToMoveAround"); obj.AddAction("AddForceTourne", _("Add a force so as to move around an object"), _("Add a force to an object so as it rotates around another.\nNote that the moving is not precise, especially if the speed is high.\nTo position an object around a position more precisly, use the actions in the category \"Position\"."), _("Rotate _PARAM0_ around _PARAM1_ with _PARAM2_�/sec and _PARAM3_ pixels away"), _("Displacement"), "res/actions/forceTourne24.png", "res/actions/forceTourne.png") .AddParameter("object", _("Object")) .AddParameter("objectPtr", _("Rotate around this object")) .AddParameter("expression", _("Speed ( Degrees per second )")) .AddParameter("expression", _("Distance ( in pixel )")) .AddParameter("expression", _("Damping ( Default : 0 )")) .codeExtraInformation.SetFunctionName("AddForceToMoveAroundObject").SetIncludeFile("GDCpp/BuiltinExtensions/ObjectTools.h"); */ }