2001-04-10 19:05:14 +00:00
// This file may be redistributed and modified only under the terms of
// the GNU General Public License (See COPYING for details).
2001-04-16 16:26:44 +00:00
// Copyright (C) 2000,2001 Alistair Riddoch
2001-04-10 19:05:14 +00:00
# include "PythonMindScript.h"
* client/ClientConnection.cpp, client/ClientConnection.h,
tools/cycmd.cpp: Switched to using skstream to completely handle
client socket connections.
* client/ClientConnection.cpp, client/ClientConnection.h,
common/log.cpp, rulesets/EntityFactory.h, rulesets/MemMap.h,
server/server.cpp, tools/cycmd.cpp: Removed unused includes.
* client/Py_CreatorClient.cpp, client/client.cpp,
client/define_world.cpp, rulesets/Py_Location.cpp,
rulesets/Py_Location.h, rulesets/Py_Map.cpp,
rulesets/Py_Map.h, rulesets/Py_Mind.cpp, rulesets/Py_Mind.h,
rulesets/Py_Object.cpp, rulesets/Py_Object.h,
rulesets/Py_Operation.cpp, rulesets/Py_Operation.h,
rulesets/Py_Oplist.cpp, rulesets/Py_Oplist.h,
rulesets/Py_Optime.cpp, rulesets/Py_Optime.h,
rulesets/Py_Thing.cpp, rulesets/Py_Thing.h,
rulesets/Py_Vector3D.cpp, rulesets/Py_Vector3D.h,
rulesets/Py_World.cpp, rulesets/Py_World.h,
rulesets/Py_WorldTime.cpp, rulesets/Py_WorldTime.h,
rulesets/PythonMindScript.cpp, rulesets/PythonThingScript.cpp,
rulesets/PythonThingScript.h, rulesets/Python_API.cpp,
rulesets/Python_API.h, server/server.cpp:
Reorganised python header files so that each header includes
all the code relevant for a particular type. Tidied up
the type implementations. Added prototypes to init_python_api()
to the Python_API.h header, and removed other dependencies from
it.
Al Riddoch <alriddoch@zepler.org>
2001-10-19 11:35:07 +00:00
# include "Py_Operation.h"
# include "Py_Oplist.h"
# include "Py_Thing.h"
2001-04-10 19:05:14 +00:00
# include "Entity.h"
# include "BaseMind.h"
2003-09-08 Al Riddoch <alriddoch@zepler.org>
* client/Py_CreatorClient.cpp, client/Py_CreatorClient.h,
rulesets/Py_BBox.cpp, rulesets/Py_BBox.h, rulesets/Py_Location.cpp,
rulesets/Py_Location.h, rulesets/Py_Map.cpp, rulesets/Py_Map.h,
rulesets/Py_Mind.cpp, rulesets/Py_Mind.h, rulesets/Py_Object.cpp,
rulesets/Py_Object.h, rulesets/Py_Operation.cpp,
rulesets/Py_Operation.h, rulesets/Py_Oplist.cpp,
rulesets/Py_Oplist.h, rulesets/Py_Optime.cpp, rulesets/Py_Optime.h,
rulesets/Py_Quaternion.cpp, rulesets/Py_Quaternion.h,
rulesets/Py_Thing.cpp, rulesets/Py_Thing.h, rulesets/Py_Vector3D.cpp,
rulesets/Py_Vector3D.h, rulesets/Py_World.cpp, rulesets/Py_World.h,
rulesets/Py_WorldTime.cpp, rulesets/Py_WorldTime.h,
rulesets/PythonMindScript.cpp, rulesets/PythonThingScript.cpp,
rulesets/Python_API.cpp:
Clean up python API code, with decent names for types,
decent error reporting, and making the more paranoid checks
only present in debug build.
* common/BaseEntity.cpp, common/BaseEntity.h, server/Account.cpp:
Remove pointless method setRefnoOp, and put it in the body as
an inline method.
* common/BaseEntity.h, common/BaseWorld.cpp, common/Setup.h,
common/Tick.h, common/operations.h, common/custom.cpp,
common/types.h, common/utility.cpp, common/utility.h,
modules/Location.h, physics/Vector3D.h, rulesets/BaseMind.cpp,
rulesets/Script.h, server/EntityFactory.h:
Clean up the dependency trees using more forward declarations.
* common/inheritance.cpp, common/inheritance.h:
Move most of the implementation into the .cpp file as its
not suited to inlining.
* rulesets/MemMap.cpp, rulesets/MemMap.h, rulesets/MemMap_methods.h:
Move contents of MemMap_methods.h into the .cpp file, as it is
not suited to inlining, and remove the file from the build.
2003-09-07 23:38:32 +00:00
# include "MemMap.h"
2001-04-10 19:05:14 +00:00
2003-03-07 00:22:12 +00:00
# include "common/log.h"
# include "common/debug.h"
2005-12-10 00:29:35 +00:00
# include "common/compose.hpp"
2002-07-14 21:04:50 +00:00
2005-08-27 14:52:12 +00:00
# include <Atlas/Objects/RootOperation.h>
2003-09-08 Al Riddoch <alriddoch@zepler.org>
* client/Py_CreatorClient.cpp, client/Py_CreatorClient.h,
rulesets/Py_BBox.cpp, rulesets/Py_BBox.h, rulesets/Py_Location.cpp,
rulesets/Py_Location.h, rulesets/Py_Map.cpp, rulesets/Py_Map.h,
rulesets/Py_Mind.cpp, rulesets/Py_Mind.h, rulesets/Py_Object.cpp,
rulesets/Py_Object.h, rulesets/Py_Operation.cpp,
rulesets/Py_Operation.h, rulesets/Py_Oplist.cpp,
rulesets/Py_Oplist.h, rulesets/Py_Optime.cpp, rulesets/Py_Optime.h,
rulesets/Py_Quaternion.cpp, rulesets/Py_Quaternion.h,
rulesets/Py_Thing.cpp, rulesets/Py_Thing.h, rulesets/Py_Vector3D.cpp,
rulesets/Py_Vector3D.h, rulesets/Py_World.cpp, rulesets/Py_World.h,
rulesets/Py_WorldTime.cpp, rulesets/Py_WorldTime.h,
rulesets/PythonMindScript.cpp, rulesets/PythonThingScript.cpp,
rulesets/Python_API.cpp:
Clean up python API code, with decent names for types,
decent error reporting, and making the more paranoid checks
only present in debug build.
* common/BaseEntity.cpp, common/BaseEntity.h, server/Account.cpp:
Remove pointless method setRefnoOp, and put it in the body as
an inline method.
* common/BaseEntity.h, common/BaseWorld.cpp, common/Setup.h,
common/Tick.h, common/operations.h, common/custom.cpp,
common/types.h, common/utility.cpp, common/utility.h,
modules/Location.h, physics/Vector3D.h, rulesets/BaseMind.cpp,
rulesets/Script.h, server/EntityFactory.h:
Clean up the dependency trees using more forward declarations.
* common/inheritance.cpp, common/inheritance.h:
Move most of the implementation into the .cpp file as its
not suited to inlining.
* rulesets/MemMap.cpp, rulesets/MemMap.h, rulesets/MemMap_methods.h:
Move contents of MemMap_methods.h into the .cpp file, as it is
not suited to inlining, and remove the file from the build.
2003-09-07 23:38:32 +00:00
static const bool debug_flag = false ;
2005-12-11 20:33:43 +00:00
PythonMindScript : : PythonMindScript ( PyObject * o , PyObject * w , BaseMind & m ) :
PythonScript ( o , w ) , mind ( m )
2001-04-10 19:05:14 +00:00
{
}
PythonMindScript : : ~ PythonMindScript ( )
{
}
2005-09-18 Al Riddoch <alriddoch@zepler.org>
* rulesets/PythonMindScript.cpp, rulesets/PythonMindScript.h,
rulesets/PythonThingScript.cpp, rulesets/PythonThingScript.h
rulesets/PythonScript.h, rulesets/Script.cpp, rulesets/Script.h:
Clean up script API.
* rulesets/BaseMind.cpp, rulesets/Character.cpp, rulesets/Entity.cpp,
rulesets/Food.cpp, rulesets/Plant.cpp, rulesets/Stackable.cpp,
rulesets/Thing.cpp: Modify script calls to new API.
* rulesets/BaseMind.cpp, rulesets/BaseMind.h: All sub_op calls now
take const ref for sub_op argument.
2005-09-18 00:55:58 +00:00
bool PythonMindScript : : operation ( const std : : string & op_type ,
const Operation & op ,
2004-12-06 Al Riddoch <alriddoch@zepler.org>
* client/BaseClient.cpp, client/BaseClient.h, client/CreatorClient.cpp,
client/CreatorClient.h, common/BaseEntity.cpp, common/BaseEntity.h,
common/BaseWorld.h, common/OOGThing.cpp, common/OOGThing.h,
common/op_switch.h, common/refno.h, common/types.h,
rulesets/BaseMind.cpp, rulesets/BaseMind.h, rulesets/Character.cpp,
rulesets/Character.h, rulesets/Creator.cpp, rulesets/Creator.h,
rulesets/Entity.cpp, rulesets/Entity.h, rulesets/Food.cpp,
rulesets/Food.h, rulesets/MemMap.cpp, rulesets/Plant.cpp,
rulesets/Plant.h, rulesets/Py_Map.cpp, rulesets/PythonMindScript.cpp,
rulesets/PythonThingScript.cpp, rulesets/Stackable.cpp,
rulesets/Stackable.h, rulesets/Thing.cpp, rulesets/Thing.h,
rulesets/World.cpp, rulesets/World.h, server/Account.cpp,
server/Account.h, server/Admin.cpp, server/Admin.h,
server/CommClient.cpp, server/Connection.cpp, server/Connection.h,
server/Connection_methods.h, server/ExternalMind.cpp,
server/ExternalMind.h, server/Lobby.cpp, server/Lobby.h,
server/Player.cpp, server/Player.h, server/WorldRouter.cpp,
server/WorldRouter.h, tests/Creatortest.cpp, tests/Worldtest.cpp:
Add a new Operation typedef to clean up headers, and get round
limitation in doxygen.
2004-12-06 16:35:44 +00:00
OpVector & ret_list ,
2005-09-18 Al Riddoch <alriddoch@zepler.org>
* rulesets/PythonMindScript.cpp, rulesets/PythonMindScript.h,
rulesets/PythonThingScript.cpp, rulesets/PythonThingScript.h
rulesets/PythonScript.h, rulesets/Script.cpp, rulesets/Script.h:
Clean up script API.
* rulesets/BaseMind.cpp, rulesets/Character.cpp, rulesets/Entity.cpp,
rulesets/Food.cpp, rulesets/Plant.cpp, rulesets/Stackable.cpp,
rulesets/Thing.cpp: Modify script calls to new API.
* rulesets/BaseMind.cpp, rulesets/BaseMind.h: All sub_op calls now
take const ref for sub_op argument.
2005-09-18 00:55:58 +00:00
const Operation * sub_op_ptr )
2001-04-10 19:05:14 +00:00
{
2005-12-10 00:29:35 +00:00
assert ( scriptObject ! = NULL ) ;
2004-07-21 02:08:05 +00:00
std : : string op_name = op_type + " _operation " ;
debug ( std : : cout < < " Got script object for " < < op_name < < std : : endl
< < std : : flush ; ) ;
2005-12-10 00:29:35 +00:00
// This check isn't really necessary, except it saves the conversion
// time.
2001-05-14 17:25:32 +00:00
if ( ! PyObject_HasAttrString ( scriptObject , ( char * ) ( op_name . c_str ( ) ) ) ) {
2005-12-10 00:29:35 +00:00
debug ( std : : cout < < " No method to be found for " < < op_name
< < std : : endl < < std : : flush ; ) ;
2001-05-14 17:25:32 +00:00
return false ;
}
2005-12-10 00:29:35 +00:00
// Construct apropriate python object thingies from op
2003-09-08 Al Riddoch <alriddoch@zepler.org>
* client/Py_CreatorClient.cpp, client/Py_CreatorClient.h,
rulesets/Py_BBox.cpp, rulesets/Py_BBox.h, rulesets/Py_Location.cpp,
rulesets/Py_Location.h, rulesets/Py_Map.cpp, rulesets/Py_Map.h,
rulesets/Py_Mind.cpp, rulesets/Py_Mind.h, rulesets/Py_Object.cpp,
rulesets/Py_Object.h, rulesets/Py_Operation.cpp,
rulesets/Py_Operation.h, rulesets/Py_Oplist.cpp,
rulesets/Py_Oplist.h, rulesets/Py_Optime.cpp, rulesets/Py_Optime.h,
rulesets/Py_Quaternion.cpp, rulesets/Py_Quaternion.h,
rulesets/Py_Thing.cpp, rulesets/Py_Thing.h, rulesets/Py_Vector3D.cpp,
rulesets/Py_Vector3D.h, rulesets/Py_World.cpp, rulesets/Py_World.h,
rulesets/Py_WorldTime.cpp, rulesets/Py_WorldTime.h,
rulesets/PythonMindScript.cpp, rulesets/PythonThingScript.cpp,
rulesets/Python_API.cpp:
Clean up python API code, with decent names for types,
decent error reporting, and making the more paranoid checks
only present in debug build.
* common/BaseEntity.cpp, common/BaseEntity.h, server/Account.cpp:
Remove pointless method setRefnoOp, and put it in the body as
an inline method.
* common/BaseEntity.h, common/BaseWorld.cpp, common/Setup.h,
common/Tick.h, common/operations.h, common/custom.cpp,
common/types.h, common/utility.cpp, common/utility.h,
modules/Location.h, physics/Vector3D.h, rulesets/BaseMind.cpp,
rulesets/Script.h, server/EntityFactory.h:
Clean up the dependency trees using more forward declarations.
* common/inheritance.cpp, common/inheritance.h:
Move most of the implementation into the .cpp file as its
not suited to inlining.
* rulesets/MemMap.cpp, rulesets/MemMap.h, rulesets/MemMap_methods.h:
Move contents of MemMap_methods.h into the .cpp file, as it is
not suited to inlining, and remove the file from the build.
2003-09-07 23:38:32 +00:00
PyConstOperation * py_op = newPyConstOperation ( ) ;
2005-08-27 14:52:12 +00:00
py_op - > operation = op ;
2001-05-14 17:25:32 +00:00
PyObject * ret ;
2005-08-27 14:52:12 +00:00
if ( sub_op_ptr = = NULL ) {
2001-05-14 17:25:32 +00:00
ret = PyObject_CallMethod ( scriptObject , ( char * ) ( op_name . c_str ( ) ) ,
" (O) " , py_op ) ;
} else {
2005-09-18 Al Riddoch <alriddoch@zepler.org>
* rulesets/PythonMindScript.cpp, rulesets/PythonMindScript.h,
rulesets/PythonThingScript.cpp, rulesets/PythonThingScript.h
rulesets/PythonScript.h, rulesets/Script.cpp, rulesets/Script.h:
Clean up script API.
* rulesets/BaseMind.cpp, rulesets/Character.cpp, rulesets/Entity.cpp,
rulesets/Food.cpp, rulesets/Plant.cpp, rulesets/Stackable.cpp,
rulesets/Thing.cpp: Modify script calls to new API.
* rulesets/BaseMind.cpp, rulesets/BaseMind.h: All sub_op calls now
take const ref for sub_op argument.
2005-09-18 00:55:58 +00:00
const Operation & sub_op = * sub_op_ptr ;
2003-09-08 Al Riddoch <alriddoch@zepler.org>
* client/Py_CreatorClient.cpp, client/Py_CreatorClient.h,
rulesets/Py_BBox.cpp, rulesets/Py_BBox.h, rulesets/Py_Location.cpp,
rulesets/Py_Location.h, rulesets/Py_Map.cpp, rulesets/Py_Map.h,
rulesets/Py_Mind.cpp, rulesets/Py_Mind.h, rulesets/Py_Object.cpp,
rulesets/Py_Object.h, rulesets/Py_Operation.cpp,
rulesets/Py_Operation.h, rulesets/Py_Oplist.cpp,
rulesets/Py_Oplist.h, rulesets/Py_Optime.cpp, rulesets/Py_Optime.h,
rulesets/Py_Quaternion.cpp, rulesets/Py_Quaternion.h,
rulesets/Py_Thing.cpp, rulesets/Py_Thing.h, rulesets/Py_Vector3D.cpp,
rulesets/Py_Vector3D.h, rulesets/Py_World.cpp, rulesets/Py_World.h,
rulesets/Py_WorldTime.cpp, rulesets/Py_WorldTime.h,
rulesets/PythonMindScript.cpp, rulesets/PythonThingScript.cpp,
rulesets/Python_API.cpp:
Clean up python API code, with decent names for types,
decent error reporting, and making the more paranoid checks
only present in debug build.
* common/BaseEntity.cpp, common/BaseEntity.h, server/Account.cpp:
Remove pointless method setRefnoOp, and put it in the body as
an inline method.
* common/BaseEntity.h, common/BaseWorld.cpp, common/Setup.h,
common/Tick.h, common/operations.h, common/custom.cpp,
common/types.h, common/utility.cpp, common/utility.h,
modules/Location.h, physics/Vector3D.h, rulesets/BaseMind.cpp,
rulesets/Script.h, server/EntityFactory.h:
Clean up the dependency trees using more forward declarations.
* common/inheritance.cpp, common/inheritance.h:
Move most of the implementation into the .cpp file as its
not suited to inlining.
* rulesets/MemMap.cpp, rulesets/MemMap.h, rulesets/MemMap_methods.h:
Move contents of MemMap_methods.h into the .cpp file, as it is
not suited to inlining, and remove the file from the build.
2003-09-07 23:38:32 +00:00
PyOperation * py_sub_op = newPyOperation ( ) ;
2001-05-14 17:25:32 +00:00
py_sub_op - > operation = sub_op ;
ret = PyObject_CallMethod ( scriptObject , ( char * ) ( op_name . c_str ( ) ) ,
" (OO) " , py_op , py_sub_op ) ;
Py_DECREF ( py_sub_op ) ;
}
Py_DECREF ( py_op ) ;
2005-12-10 00:29:35 +00:00
if ( ret = = NULL ) {
2001-05-14 17:25:32 +00:00
if ( PyErr_Occurred ( ) = = NULL ) {
2001-08-14 17:52:50 +00:00
debug ( std : : cout < < " No method to be found for " < < std : : endl
< < std : : flush ; ) ;
2001-05-14 17:25:32 +00:00
} else {
2002-07-14 21:04:50 +00:00
log ( ERROR , " Reporting python error " ) ;
2001-05-14 17:25:32 +00:00
PyErr_Print ( ) ;
2002-09-05 11:21:48 +00:00
if ( op_type = = " tick " ) {
std : : string msg = std : : string ( " Mind script for " ) + mind . getId ( ) + " , named " + mind . getName ( ) + " has reported an error processing a tick operation. This NPC is probably now inactive. " ;
log ( ERROR , msg . c_str ( ) ) ;
}
2001-05-14 17:25:32 +00:00
}
2005-12-10 00:29:35 +00:00
return false ;
}
debug ( std : : cout < < " Called python method " < < op_name
< < std : : endl < < std : : flush ; ) ;
if ( ret = = Py_None ) {
debug ( std : : cout < < " Returned none " < < std : : endl < < std : : flush ; ) ;
} else if ( PyOperation_Check ( ret ) ) {
PyOperation * op = ( PyOperation * ) ret ;
assert ( op - > operation . isValid ( ) ) ;
ret_list . push_back ( op - > operation ) ;
} else if ( PyOplist_Check ( ret ) ) {
PyOplist * op = ( PyOplist * ) ret ;
assert ( op - > ops ! = NULL ) ;
const OpVector & o = * op - > ops ;
OpVector : : const_iterator Iend = o . end ( ) ;
for ( OpVector : : const_iterator I = o . begin ( ) ; I ! = Iend ; + + I ) {
ret_list . push_back ( * I ) ;
}
} else {
log ( ERROR , String : : compose ( " Python script \" %1 \" returned an invalid result " , op_name ) . c_str ( ) ) ;
2001-04-10 19:05:14 +00:00
}
2005-12-10 00:29:35 +00:00
Py_DECREF ( ret ) ;
return true ;
2001-04-10 19:05:14 +00:00
}
2005-12-12 23:27:41 +00:00
void PythonMindScript : : hook ( const std : : string & method , Entity * entity )
2001-04-10 19:05:14 +00:00
{
2005-12-12 23:27:41 +00:00
PyObject * wrapper = wrapEntity ( entity ) ;
if ( wrapper = = NULL ) {
return ;
}
PyObject * ret = PyObject_CallMethod ( scriptObject , ( char * ) ( method . c_str ( ) ) , " (O) " , wrapper ) ;
// FIXME We should perhaps report an error here.
Py_XDECREF ( ret ) ;
Py_DECREF ( wrapper ) ;
2001-04-10 19:05:14 +00:00
}