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 "PythonThingScript.h"
|
|
|
|
|
|
|
|
|
|
#include "Python_API.h"
|
|
|
|
|
|
|
|
|
|
#include "Thing.h"
|
|
|
|
|
|
|
|
|
|
#include <server/WorldRouter.h>
|
|
|
|
|
#include <common/debug.h>
|
|
|
|
|
|
|
|
|
|
using Atlas::Objects::Operation::RootOperation;
|
|
|
|
|
|
|
|
|
|
static const bool debug_flag = false;
|
|
|
|
|
|
|
|
|
|
PythonThingScript::PythonThingScript(PyObject * o, Thing & t) :
|
|
|
|
|
PythonScript(o, t), thing(t)
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PythonThingScript::~PythonThingScript()
|
|
|
|
|
{
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool PythonThingScript::Operation(const string& op_type,const RootOperation& op,
|
|
|
|
|
oplist & ret_list, RootOperation * sub_op)
|
|
|
|
|
{
|
2001-04-11 14:34:15 +00:00
|
|
|
if (scriptObject == NULL) {
|
2001-04-10 19:05:14 +00:00
|
|
|
debug( cout << "No script object asociated" << endl << flush;);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
debug( cout << "Got script object for " << endl << flush;);
|
|
|
|
|
string op_name = op_type+"_operation";
|
|
|
|
|
// Construct apropriate python object thingies from op
|
2001-04-11 14:34:15 +00:00
|
|
|
if (!PyObject_HasAttrString(scriptObject, (char *)(op_name.c_str()))) {
|
2001-04-10 19:05:14 +00:00
|
|
|
debug( cout << "No method to be found for "
|
|
|
|
|
<< "." << op_name << endl << flush;);
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
RootOperationObject * py_op = newAtlasRootOperation(NULL);
|
|
|
|
|
py_op->operation = new RootOperation(op);
|
|
|
|
|
py_op->own = 0;
|
* Renamed Operataion method names throughout so they no longer
all have the name Operation but are now called MoveOperation,
according to the type of operation they handle.
* modules/DateTime.cpp, modules/DataTime.h: Filled in functionality,
allowing initialisation and updating from a time values in seconds.
* modules/Location.h: Modified collision detection code so no
checking is done between two moving objects.
* rulesets/BaseMind.h, rulesets/BaseMind.cpp, rulesets/Entity.h,
rulesets/Entity.cpp: Removed virtual getMap() method and replaced
with a fixed method in BaseMind only. Added time member veriable
to BaseMind so each mind keeps track of time by itself.
* rulesets/Python_API.h, rulesets/Py_Mind.cpp, rulesets/Py_Mind.h:
Added specific python interface for mind objects, because if
increasing differences in the way this must be handled.
* rulesets/Character.h, rulesets/Character.cpp: Added isAlive flag
which is cleared if the character is dead. If this flag is cleared,
operations are no longer sent to the mind.
* rulesets/Movement.h, rulesets/Movement.cpp, rulesets/Pedestrian.h,
rulesets/Pedestrian.cpp: Cleaned up the code, made members more
distinctive, and make interface more general.
* rulesets/Py_Thing.cpp: Removed features used to support mind.
* rulesets/Py_WorldTime.cpp: Added support for comparison of
time with strings, to establish whether it matches descriptions
of time.
* rulesets/Python_API.cpp: Modified creating of scripts so mind
scripts use a slightly different interface from entity scripts,
to support the fact that a mind handles its own timekeeping,
has a memory map, and has no access to the world.
* server/WorldTime.cpp, server/WorldTime.h: Brought WorldTime into
the build. Used to track details of the time. Added support for
checking time descriptions such as "midday", "summer" against
DateTime.
Al Riddoch <alriddoch@zepler.org>
2001-05-28 14:58:24 +00:00
|
|
|
py_op->from = thing.world->getObject(op.GetFrom());
|
|
|
|
|
py_op->to = thing.world->getObject(op.GetTo());
|
2001-04-10 19:05:14 +00:00
|
|
|
PyObject * ret;
|
2001-04-11 14:34:15 +00:00
|
|
|
ret = PyObject_CallMethod(scriptObject, (char *)(op_name.c_str()),
|
2001-04-10 19:05:14 +00:00
|
|
|
"(O)", py_op);
|
|
|
|
|
delete py_op->operation;
|
|
|
|
|
Py_DECREF(py_op);
|
|
|
|
|
if (ret != NULL) {
|
|
|
|
|
debug( cout << "Called python method " << op_name
|
|
|
|
|
<< " for object " << endl << flush;);
|
|
|
|
|
if (PyOperation_Check(ret)) {
|
|
|
|
|
RootOperationObject * op = (RootOperationObject*)ret;
|
|
|
|
|
if (op->operation != NULL) {
|
|
|
|
|
ret_list.push_back(op->operation);
|
|
|
|
|
op->own = 0;
|
|
|
|
|
} else {
|
|
|
|
|
debug( cout << "Method returned invalid operation"
|
|
|
|
|
<< endl << flush;);
|
|
|
|
|
}
|
|
|
|
|
} else if (PyOplist_Check(ret)) {
|
|
|
|
|
OplistObject * op = (OplistObject*)ret;
|
|
|
|
|
if (op->ops != NULL) {
|
|
|
|
|
ret_list = *op->ops;
|
|
|
|
|
} else {
|
|
|
|
|
debug( cout << "Method returned invalid oplist"
|
|
|
|
|
<< endl << flush;);
|
|
|
|
|
}
|
|
|
|
|
} else {
|
|
|
|
|
debug( cout << "Method returned invalid object" << endl << flush;);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
Py_DECREF(ret);
|
|
|
|
|
return true;
|
|
|
|
|
} else {
|
|
|
|
|
if (PyErr_Occurred() == NULL) {
|
|
|
|
|
debug( cout << "No method to be found for " << endl << flush;);
|
|
|
|
|
} else {
|
|
|
|
|
cerr << "Reporting python error for " << endl << flush;
|
|
|
|
|
PyErr_Print();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
return false;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void PythonThingScript::hook(const string &, Entity *)
|
|
|
|
|
{
|
|
|
|
|
}
|