2001-01-26 16:38:23 +00:00
|
|
|
// This file may be redistributed and modified only under the terms of
|
2001-03-16 11:38:14 +00:00
|
|
|
// the GNU General Public License (See COPYING for details).
|
2001-01-26 16:38:23 +00:00
|
|
|
// Copyright (C) 2000 Alistair Riddoch
|
|
|
|
|
|
2000-11-14 15:52:10 +00:00
|
|
|
#include <stdio.h>
|
|
|
|
|
#include <unistd.h>
|
|
|
|
|
|
|
|
|
|
#include <Python.h>
|
|
|
|
|
|
|
|
|
|
#include "Python_API.h"
|
2001-04-10 19:05:14 +00:00
|
|
|
#include "PythonThingScript.h"
|
|
|
|
|
#include "PythonMindScript.h"
|
* 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
|
|
|
#include "World.h"
|
2000-11-17 00:18:32 +00:00
|
|
|
#include "Thing.h"
|
2001-04-10 19:05:14 +00:00
|
|
|
#include "BaseMind.h"
|
2000-11-21 19:24:29 +00:00
|
|
|
|
2001-04-16 16:26:44 +00:00
|
|
|
#include <Atlas/Objects/Operation/Create.h>
|
|
|
|
|
#include <Atlas/Objects/Operation/Look.h>
|
|
|
|
|
#include <Atlas/Objects/Operation/Move.h>
|
|
|
|
|
#include <Atlas/Objects/Operation/Set.h>
|
2000-12-14 12:03:05 +00:00
|
|
|
#include <Atlas/Objects/Operation/Sight.h>
|
2001-04-16 16:26:44 +00:00
|
|
|
#include <Atlas/Objects/Operation/Talk.h>
|
2000-12-30 23:16:57 +00:00
|
|
|
#include <Atlas/Objects/Operation/Touch.h>
|
2001-05-03 22:04:43 +00:00
|
|
|
#include <Atlas/Objects/Operation/Info.h>
|
2000-12-14 12:03:05 +00:00
|
|
|
|
2000-11-20 20:28:08 +00:00
|
|
|
#include <modules/Location.h>
|
* client/client.cpp,
client/ObserverClient.cpp, client/ObserverClient.h,
client/ClientConnection.cpp, client/ClientConnection.h,
client/define_world.cpp, client define_world.h:
Started re-coding of python client code in C++.
* common/accountbase.h:
Database class used for simply accessing accounts.
* common/OOGThing.cpp, common/OOGThing.h, server/Account.h,
server/Routing.h:
Moved OOGThing class into common as it is not server specific.
* common/BaseWorld.cpp, common/BaseWorld.h,
server/WorldRouter.cpp, server/WorldRouter.h,
rulesets/Entity.h, rulesets/Py_World.cpp,
rulesets/PythonThingScript.cpp, rulesets/Python_API.h,
rulesets/Thing.cpp, rulesets/Thing.h:
Added base class for WorldRouter so that code that previously
used WorldRouter now used the interface defined by this
new class. This means that the code in rulesets no longer
has dependencies on code in server, so can be used in the client.
* server/ExternalMind.cpp, server/ExternalMind.h,
rulesets/Character.h, rulesets/Creator.cpp,
server/Account.cpp:
Moved ExternalMind class into server as it is server specific,
so that there is no dependancy on server in rulesets.
* server/Persistance.cpp. server/Persistance.h,
server/Admin.cpp, server/ServerRouting.cpp, server/server.cpp:
Moved high level server specific persistance class into
server, so there is no dependency on server in common.
* common/database.cpp, common/database.h, server/Admin.cpp,
tools/cydbload.cpp, tools/cyisoload.cpp, tools/cypasswd.cpp:
Increases efficiency of some interfaces by passing Object::MapType
instead of MapType, when the value must be a map.
* modules/WorldTime.cpp, modules/WorldTime.h,
rulesets/Py_WorldTime.cpp, rulesets/Python_API.cpp:
Brought the version of WorldTime in modules up to date, as this is
the version now used.
* rulesets/Character.cpp, server/WorldRouter.cpp, rulesets/Thing.cpp,
server/Admin.cpp:
Made world objects dictionary private.
* rulesets/EntityFactory.cpp, rulesets/EntityFactory.h:
Change newThing parameters so entity factory does not need to
know about WorldRouter.
* server/Lobby.cpp: Added support for people and rooms attributes
of OOG room class.
Al Riddoch <alriddoch@zepler.org>
2001-08-13 17:22:27 +00:00
|
|
|
#include <modules/WorldTime.h>
|
2001-04-10 19:05:14 +00:00
|
|
|
#include <common/globals.h>
|
2000-11-21 19:24:29 +00:00
|
|
|
#include <common/const.h>
|
2000-11-14 15:52:10 +00:00
|
|
|
|
2001-02-26 14:41:10 +00:00
|
|
|
#include <common/Tick.h>
|
|
|
|
|
#include <common/Fire.h>
|
|
|
|
|
#include <common/Chop.h>
|
|
|
|
|
#include <common/Cut.h>
|
|
|
|
|
#include <common/Setup.h>
|
|
|
|
|
#include <common/Eat.h>
|
|
|
|
|
#include <common/Nourish.h>
|
2001-05-22 17:59:43 +00:00
|
|
|
#include <common/Generic.h>
|
2001-02-26 14:41:10 +00:00
|
|
|
|
2000-11-29 18:02:01 +00:00
|
|
|
static void Function_dealloc(FunctionObject * self)
|
|
|
|
|
{
|
|
|
|
|
PyMem_DEL(self);
|
|
|
|
|
}
|
|
|
|
|
|
2000-12-01 00:13:39 +00:00
|
|
|
static PyObject * log_debug(PyObject * self, PyObject * args, PyObject * kwds)
|
2000-11-29 18:02:01 +00:00
|
|
|
{
|
|
|
|
|
Py_INCREF(Py_None);
|
|
|
|
|
return Py_None;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PyTypeObject log_debug_type = {
|
|
|
|
|
PyObject_HEAD_INIT(&PyType_Type)
|
|
|
|
|
0,
|
|
|
|
|
"Function",
|
|
|
|
|
sizeof(FunctionObject),
|
|
|
|
|
0,
|
|
|
|
|
/* methods */
|
|
|
|
|
(destructor)Function_dealloc,
|
|
|
|
|
0, /* tp_print */
|
|
|
|
|
0, /* tp_getattr */
|
|
|
|
|
0, /* tp_setattr */
|
|
|
|
|
0, /* tp_compare */
|
|
|
|
|
0, /* tp_repr */
|
|
|
|
|
0, /* tp_as_number */
|
|
|
|
|
0, /* tp_as_sequence */
|
|
|
|
|
0, /* tp_as_mapping */
|
|
|
|
|
0, /* tp_hash */
|
|
|
|
|
log_debug, /* tp_call */
|
|
|
|
|
};
|
2000-11-19 00:02:29 +00:00
|
|
|
|
2000-12-06 18:21:35 +00:00
|
|
|
static PyObject * dictlist_remove_value(PyObject * self, PyObject * args, PyObject * kwds)
|
|
|
|
|
{
|
2000-12-30 23:16:57 +00:00
|
|
|
PyObject * dict;
|
|
|
|
|
ThingObject * item;
|
2000-12-06 18:21:35 +00:00
|
|
|
long remove_empty_key = 1;
|
|
|
|
|
if (!PyArg_ParseTuple(args, "OO|i", &dict, &item, &remove_empty_key)) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
int flag=0;
|
|
|
|
|
if (!PyDict_Check(dict)) {
|
|
|
|
|
PyErr_SetString(PyExc_TypeError, "Trying to set item in not dictlist");
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
PyObject * keys = PyDict_Keys(dict);
|
|
|
|
|
PyObject * values = PyDict_Values(dict);
|
|
|
|
|
|
|
|
|
|
if ((keys == NULL) || (values == NULL)) {
|
|
|
|
|
PyErr_SetString(PyExc_TypeError, "Error getting keys from dictlist");
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
int i, size = PyList_Size(keys);
|
|
|
|
|
for(i = 0; i < size; i++) {
|
|
|
|
|
PyObject * value = PyList_GetItem(values, i);
|
|
|
|
|
PyObject * key = PyList_GetItem(keys, i);
|
|
|
|
|
int j, lsize = PyList_Size(value);
|
|
|
|
|
for(j = 0; j < lsize; j++) {
|
2000-12-30 23:16:57 +00:00
|
|
|
ThingObject * entry = (ThingObject*)PyList_GetItem(value, j);
|
|
|
|
|
if (entry->m_thing == item->m_thing) {
|
2000-12-06 18:21:35 +00:00
|
|
|
flag = 1;
|
|
|
|
|
PyList_SetSlice(value, j, j+1, NULL);
|
2000-12-30 23:16:57 +00:00
|
|
|
j--; lsize--;
|
2000-12-06 18:21:35 +00:00
|
|
|
if ((remove_empty_key !=0) && (PyList_Size(value) == 0)) {
|
|
|
|
|
PyDict_DelItem(dict, key);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
2000-12-11 13:06:12 +00:00
|
|
|
Py_DECREF(keys);
|
|
|
|
|
Py_DECREF(values);
|
2000-12-06 18:21:35 +00:00
|
|
|
return PyInt_FromLong(flag);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PyTypeObject dictlist_remove_value_type = {
|
|
|
|
|
PyObject_HEAD_INIT(&PyType_Type)
|
|
|
|
|
0,
|
|
|
|
|
"Function",
|
|
|
|
|
sizeof(FunctionObject),
|
|
|
|
|
0,
|
|
|
|
|
/* methods */
|
|
|
|
|
(destructor)Function_dealloc,
|
|
|
|
|
0, /* tp_print */
|
|
|
|
|
0, /* tp_getattr */
|
|
|
|
|
0, /* tp_setattr */
|
|
|
|
|
0, /* tp_compare */
|
|
|
|
|
0, /* tp_repr */
|
|
|
|
|
0, /* tp_as_number */
|
|
|
|
|
0, /* tp_as_sequence */
|
|
|
|
|
0, /* tp_as_mapping */
|
|
|
|
|
0, /* tp_hash */
|
|
|
|
|
dictlist_remove_value, /* tp_call */
|
|
|
|
|
};
|
2000-12-01 00:13:39 +00:00
|
|
|
static PyObject * dictlist_add_value(PyObject * self, PyObject * args, PyObject * kwds)
|
|
|
|
|
{
|
2000-12-30 23:16:57 +00:00
|
|
|
PyObject * dict;
|
|
|
|
|
ThingObject * item;
|
2000-12-01 00:13:39 +00:00
|
|
|
char * key;
|
|
|
|
|
if (!PyArg_ParseTuple(args, "OsO", &dict, &key, &item)) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
if (!PyDict_Check(dict)) {
|
|
|
|
|
PyErr_SetString(PyExc_TypeError, "Dict is not a dictionary");
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
PyObject * list = PyDict_GetItemString(dict, key);
|
|
|
|
|
if (list != NULL) {
|
|
|
|
|
if (!PyList_Check(list)) {
|
|
|
|
|
PyErr_SetString(PyExc_TypeError, "Dict does not contain a list");
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
int i, size = PyList_Size(list);
|
|
|
|
|
for(i = 0; i < size; i++) {
|
2000-12-30 23:16:57 +00:00
|
|
|
ThingObject * entry = (ThingObject*)PyList_GetItem(list,i);
|
|
|
|
|
if (entry->m_thing == item->m_thing) {
|
2000-12-01 00:13:39 +00:00
|
|
|
goto present;
|
|
|
|
|
}
|
|
|
|
|
}
|
2000-12-30 23:16:57 +00:00
|
|
|
PyList_Append(list, (PyObject*)item);
|
2000-12-01 00:13:39 +00:00
|
|
|
} else {
|
2000-12-06 18:21:35 +00:00
|
|
|
list = PyList_New(0);
|
2000-12-30 23:16:57 +00:00
|
|
|
PyList_Append(list, (PyObject*)item);
|
2000-12-01 00:13:39 +00:00
|
|
|
PyDict_SetItemString(dict, key, list);
|
2000-12-03 14:23:26 +00:00
|
|
|
Py_DECREF(list);
|
2000-12-01 00:13:39 +00:00
|
|
|
}
|
|
|
|
|
present:
|
|
|
|
|
Py_INCREF(Py_None);
|
|
|
|
|
return Py_None;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
PyTypeObject dictlist_add_value_type = {
|
|
|
|
|
PyObject_HEAD_INIT(&PyType_Type)
|
|
|
|
|
0,
|
|
|
|
|
"Function",
|
|
|
|
|
sizeof(FunctionObject),
|
|
|
|
|
0,
|
|
|
|
|
/* methods */
|
|
|
|
|
(destructor)Function_dealloc,
|
|
|
|
|
0, /* tp_print */
|
|
|
|
|
0, /* tp_getattr */
|
|
|
|
|
0, /* tp_setattr */
|
|
|
|
|
0, /* tp_compare */
|
|
|
|
|
0, /* tp_repr */
|
|
|
|
|
0, /* tp_as_number */
|
|
|
|
|
0, /* tp_as_sequence */
|
|
|
|
|
0, /* tp_as_mapping */
|
|
|
|
|
0, /* tp_hash */
|
|
|
|
|
dictlist_add_value, /* tp_call */
|
|
|
|
|
};
|
|
|
|
|
|
2001-08-02 14:27:06 +00:00
|
|
|
static PyObject * Get_PyClass(const std::string & package,
|
|
|
|
|
const std::string & _type)
|
2000-11-19 00:02:29 +00:00
|
|
|
{
|
2001-08-02 14:27:06 +00:00
|
|
|
std::string type = _type;
|
2000-12-03 14:23:26 +00:00
|
|
|
type[0] = toupper(type[0]);
|
2000-12-13 12:10:48 +00:00
|
|
|
PyObject * package_name = PyString_FromString((char *)package.c_str());
|
2001-06-22 22:03:59 +00:00
|
|
|
PyObject * mod_dict = PyImport_Import(package_name);
|
|
|
|
|
Py_DECREF(package_name);
|
|
|
|
|
if (mod_dict == NULL) {
|
2001-08-14 17:52:50 +00:00
|
|
|
std::cerr << "Cld no find python module " << package << std::endl
|
|
|
|
|
<< std::flush;
|
|
|
|
|
PyErr_Print();
|
2001-04-10 19:05:14 +00:00
|
|
|
return NULL;
|
2000-11-19 00:02:29 +00:00
|
|
|
}
|
|
|
|
|
PyObject * my_class = PyObject_GetAttrString(mod_dict, (char *)type.c_str());
|
2001-04-10 19:05:14 +00:00
|
|
|
Py_DECREF(mod_dict);
|
2000-11-19 00:02:29 +00:00
|
|
|
if (my_class == NULL) {
|
2001-08-14 17:52:50 +00:00
|
|
|
std::cerr << "Cld not find class " << type << " in module " << package
|
|
|
|
|
<< std::endl << std::flush;
|
2000-12-11 13:06:12 +00:00
|
|
|
PyErr_Print();
|
2001-04-10 19:05:14 +00:00
|
|
|
return NULL;
|
2000-11-19 00:02:29 +00:00
|
|
|
}
|
|
|
|
|
if (PyCallable_Check(my_class) == 0) {
|
2001-08-14 17:52:50 +00:00
|
|
|
std::cerr << "It does not seem to be a class at all" << std::endl
|
|
|
|
|
<< std::flush;
|
2001-06-22 22:03:59 +00:00
|
|
|
Py_DECREF(my_class);
|
2001-04-10 19:05:14 +00:00
|
|
|
return NULL;
|
2000-11-19 00:02:29 +00:00
|
|
|
}
|
* 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
|
|
|
return my_class;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static PyObject * Create_PyScript(PyObject * pyThing, PyObject * pyclass)
|
|
|
|
|
{
|
|
|
|
|
PyObject * pyob = PyEval_CallFunction(pyclass,"(O)", pyThing);
|
|
|
|
|
|
|
|
|
|
if (pyob == NULL) {
|
2000-11-19 00:02:29 +00:00
|
|
|
if (PyErr_Occurred() == NULL) {
|
2001-08-14 17:52:50 +00:00
|
|
|
std::cerr << "Could not get python obj" << std::endl << std::flush;
|
2000-11-19 00:02:29 +00:00
|
|
|
} else {
|
2001-08-14 17:52:50 +00:00
|
|
|
std::cerr << "Reporting python error" << std::endl << std::flush;
|
2000-11-19 00:02:29 +00:00
|
|
|
PyErr_Print();
|
|
|
|
|
}
|
|
|
|
|
}
|
* 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_DECREF(pyclass);
|
2001-10-09 15:39:55 +00:00
|
|
|
Py_DECREF(pyThing);
|
2001-04-10 19:05:14 +00:00
|
|
|
return pyob;
|
|
|
|
|
}
|
|
|
|
|
|
2001-08-02 14:27:06 +00:00
|
|
|
void Create_PyThing(Thing * thing, const std::string & package,
|
|
|
|
|
const std::string & _type)
|
2001-04-10 19:05:14 +00:00
|
|
|
{
|
* 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
|
|
|
PyObject * c = Get_PyClass(package, _type);
|
|
|
|
|
if (c == NULL) { return; }
|
|
|
|
|
ThingObject * pyThing = newThingObject(NULL);
|
|
|
|
|
pyThing->m_thing = thing;
|
|
|
|
|
PyObject * o = Create_PyScript((PyObject *)pyThing, c);
|
2001-04-10 19:05:14 +00:00
|
|
|
if (o != NULL) {
|
2001-04-11 14:34:15 +00:00
|
|
|
thing->setScript(new PythonThingScript(o, *thing));
|
2001-04-10 19:05:14 +00:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2001-08-02 14:27:06 +00:00
|
|
|
void Create_PyMind(BaseMind * mind, const std::string & package,
|
|
|
|
|
const std::string & _type)
|
2001-04-10 19:05:14 +00:00
|
|
|
{
|
* 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
|
|
|
PyObject * c = Get_PyClass(package, _type);
|
|
|
|
|
if (c == NULL) { return; }
|
|
|
|
|
MindObject * pyMind = newMindObject(NULL);
|
|
|
|
|
pyMind->m_mind = mind;
|
|
|
|
|
PyObject * o = Create_PyScript((PyObject *)pyMind, c);
|
|
|
|
|
|
2001-04-10 19:05:14 +00:00
|
|
|
if (o != NULL) {
|
2001-04-11 14:34:15 +00:00
|
|
|
mind->setScript(new PythonMindScript(o, *mind));
|
2001-04-10 19:05:14 +00:00
|
|
|
}
|
2000-11-19 00:02:29 +00:00
|
|
|
}
|
|
|
|
|
|
2000-12-04 20:08:21 +00:00
|
|
|
static PyObject * is_location(PyObject * self, PyObject * args)
|
|
|
|
|
{
|
|
|
|
|
PyObject * loc;
|
|
|
|
|
if (!PyArg_ParseTuple(args, "O", &loc)) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2000-12-16 20:28:06 +00:00
|
|
|
if (PyLocation_Check(loc)) {
|
2000-12-04 20:08:21 +00:00
|
|
|
Py_INCREF(Py_True);
|
|
|
|
|
return Py_True;
|
|
|
|
|
}
|
|
|
|
|
Py_INCREF(Py_False);
|
|
|
|
|
return Py_False;
|
|
|
|
|
}
|
|
|
|
|
|
2000-11-20 20:28:08 +00:00
|
|
|
static PyObject * location_new(PyObject * self, PyObject * args)
|
|
|
|
|
{
|
2000-12-05 14:26:04 +00:00
|
|
|
LocationObject *o;
|
|
|
|
|
// We need to deal with actual args here
|
2001-02-19 06:13:31 +00:00
|
|
|
PyObject * refO, * coordsO = NULL;
|
2001-10-09 14:03:12 +00:00
|
|
|
bool decrefO = false;
|
2001-02-19 06:13:31 +00:00
|
|
|
if (PyArg_ParseTuple(args, "O|O", &refO, &coordsO)) {
|
* 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
|
|
|
if ((!PyThing_Check(refO)) && (!PyWorld_Check(refO)) && (!PyMind_Check(refO))) {
|
2001-02-19 06:13:31 +00:00
|
|
|
if (PyObject_HasAttrString(refO, "cppthing")) {
|
|
|
|
|
refO = PyObject_GetAttrString(refO, "cppthing");
|
2001-10-09 14:03:12 +00:00
|
|
|
decrefO = true;
|
2000-12-07 12:14:35 +00:00
|
|
|
}
|
* 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
|
|
|
if (!PyThing_Check(refO) && !PyMind_Check(refO)) {
|
2001-02-19 06:13:31 +00:00
|
|
|
PyErr_SetString(PyExc_TypeError, "Arg ref required");
|
2001-10-09 14:03:12 +00:00
|
|
|
if (decrefO) { Py_DECREF(refO); }
|
2000-12-07 12:14:35 +00:00
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
}
|
2000-12-16 20:28:06 +00:00
|
|
|
if ((coordsO != NULL) && (!PyVector3D_Check(coordsO))) {
|
2000-12-07 12:14:35 +00:00
|
|
|
PyErr_SetString(PyExc_TypeError, "Arg coords required");
|
2001-10-09 14:03:12 +00:00
|
|
|
if (decrefO) { Py_DECREF(refO); }
|
2000-12-05 14:26:04 +00:00
|
|
|
return NULL;
|
|
|
|
|
}
|
2000-12-13 12:10:48 +00:00
|
|
|
|
2001-04-16 16:26:44 +00:00
|
|
|
Entity * ref_ent;
|
2001-02-19 06:13:31 +00:00
|
|
|
if (PyWorld_Check(refO)) {
|
|
|
|
|
WorldObject * ref = (WorldObject*)refO;
|
|
|
|
|
if (ref->world == NULL) {
|
2000-12-13 12:10:48 +00:00
|
|
|
PyErr_SetString(PyExc_TypeError, "Parent world is invalid");
|
2001-10-09 14:03:12 +00:00
|
|
|
if (decrefO) { Py_DECREF(refO); }
|
2000-12-13 12:10:48 +00:00
|
|
|
return NULL;
|
|
|
|
|
}
|
* 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
|
|
|
ref_ent = &ref->world->gameWorld;
|
|
|
|
|
} else if (PyMind_Check(refO)) {
|
|
|
|
|
MindObject * ref = (MindObject*)refO;
|
|
|
|
|
if (ref->m_mind == NULL) {
|
|
|
|
|
PyErr_SetString(PyExc_TypeError, "Parent mind is invalid");
|
2001-10-09 14:03:12 +00:00
|
|
|
if (decrefO) { Py_DECREF(refO); }
|
* 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
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
ref_ent = ref->m_mind;
|
2000-12-13 12:10:48 +00:00
|
|
|
} else {
|
2001-02-19 06:13:31 +00:00
|
|
|
ThingObject * ref = (ThingObject*)refO;
|
|
|
|
|
if (ref->m_thing == NULL) {
|
2000-12-13 12:10:48 +00:00
|
|
|
PyErr_SetString(PyExc_TypeError, "Parent thing is invalid");
|
2001-10-09 14:03:12 +00:00
|
|
|
if (decrefO) { Py_DECREF(refO); }
|
2000-12-13 12:10:48 +00:00
|
|
|
return NULL;
|
|
|
|
|
}
|
2001-02-19 06:13:31 +00:00
|
|
|
ref_ent = ref->m_thing;
|
2000-12-05 14:26:04 +00:00
|
|
|
}
|
2001-10-09 14:03:12 +00:00
|
|
|
if (decrefO) { Py_DECREF(refO); }
|
2000-12-13 12:10:48 +00:00
|
|
|
Vector3DObject * coords = (Vector3DObject*)coordsO;
|
2000-12-05 14:26:04 +00:00
|
|
|
o = newLocationObject(NULL);
|
|
|
|
|
if ( o == NULL ) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2000-12-11 13:06:12 +00:00
|
|
|
if (coords == NULL) {
|
2001-02-19 06:13:31 +00:00
|
|
|
o->location = new Location(ref_ent, Vector3D());
|
2000-12-11 13:06:12 +00:00
|
|
|
} else {
|
2001-02-19 06:13:31 +00:00
|
|
|
o->location = new Location(ref_ent, coords->coords);
|
2000-12-11 13:06:12 +00:00
|
|
|
}
|
2000-12-08 11:40:32 +00:00
|
|
|
o->own = 1;
|
2000-12-05 14:26:04 +00:00
|
|
|
} else if (PyArg_ParseTuple(args, "")) {
|
|
|
|
|
o = newLocationObject(NULL);
|
|
|
|
|
if ( o == NULL ) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
o->location = new Location;
|
2000-12-08 11:40:32 +00:00
|
|
|
o->own = 1;
|
2000-12-05 14:26:04 +00:00
|
|
|
} else {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
return (PyObject *)o;
|
2000-11-20 20:28:08 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
static PyObject * vector3d_new(PyObject * self, PyObject * args)
|
|
|
|
|
{
|
|
|
|
|
Vector3DObject *o;
|
2000-12-01 00:13:39 +00:00
|
|
|
Vector3D val;
|
2000-11-20 20:28:08 +00:00
|
|
|
// We need to deal with actual args here
|
2000-12-01 00:13:39 +00:00
|
|
|
PyObject * clist;
|
2000-12-15 19:25:19 +00:00
|
|
|
switch (PyTuple_Size(args)) {
|
|
|
|
|
case 0:
|
|
|
|
|
break;
|
|
|
|
|
case 1:
|
|
|
|
|
clist = PyTuple_GetItem(args, 0);
|
|
|
|
|
if ((!PyList_Check(clist)) || (PyList_Size(clist) != 3)) {
|
|
|
|
|
PyErr_SetString(PyExc_TypeError, "Vector3D() from single value must a list 3 long");
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
for(int i = 0; i < 3; i++) {
|
|
|
|
|
PyObject * item = PyList_GetItem(clist, i);
|
|
|
|
|
if (PyInt_Check(item)) {
|
|
|
|
|
val[i] = (double)PyInt_AsLong(item);
|
|
|
|
|
} else if (PyFloat_Check(item)) {
|
|
|
|
|
val[i] = PyFloat_AsDouble(item);
|
|
|
|
|
} else {
|
|
|
|
|
PyErr_SetString(PyExc_TypeError, "Vector3D() must take list of floats, or ints");
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
val.set();
|
|
|
|
|
break;
|
|
|
|
|
case 3:
|
|
|
|
|
for(int i = 0; i < 3; i++) {
|
|
|
|
|
PyObject * item = PyTuple_GetItem(args, i);
|
|
|
|
|
if (PyInt_Check(item)) {
|
|
|
|
|
val[i] = (double)PyInt_AsLong(item);
|
|
|
|
|
} else if (PyFloat_Check(item)) {
|
|
|
|
|
val[i] = PyFloat_AsDouble(item);
|
|
|
|
|
} else {
|
|
|
|
|
PyErr_SetString(PyExc_TypeError, "Vector3D() must take list of floats, or ints");
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
val.set();
|
|
|
|
|
break;
|
|
|
|
|
default:
|
|
|
|
|
PyErr_SetString(PyExc_TypeError, "Vector3D must take list of floats, or ints, 3 ints or 3 floats");
|
2000-12-01 00:13:39 +00:00
|
|
|
return NULL;
|
2000-12-15 19:25:19 +00:00
|
|
|
break;
|
2000-12-01 00:13:39 +00:00
|
|
|
}
|
|
|
|
|
|
2000-11-20 20:28:08 +00:00
|
|
|
o = newVector3DObject(args);
|
|
|
|
|
if ( o == NULL ) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2000-12-01 00:13:39 +00:00
|
|
|
o->coords = val;
|
2000-11-20 20:28:08 +00:00
|
|
|
return (PyObject *)o;
|
|
|
|
|
}
|
|
|
|
|
|
2000-11-29 15:19:36 +00:00
|
|
|
static PyObject * worldtime_new(PyObject * self, PyObject * args)
|
|
|
|
|
{
|
|
|
|
|
WorldTimeObject *o;
|
|
|
|
|
|
|
|
|
|
int seconds;
|
|
|
|
|
if (!PyArg_ParseTuple(args, "i", &seconds)) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
o = newWorldTimeObject(args);
|
|
|
|
|
if ( o == NULL ) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
o->time = new WorldTime(seconds);
|
2001-06-22 22:03:59 +00:00
|
|
|
o->own = true;
|
2000-11-29 15:19:36 +00:00
|
|
|
return (PyObject *)o;
|
|
|
|
|
}
|
|
|
|
|
|
2001-02-26 14:41:10 +00:00
|
|
|
static inline void addToOplist(RootOperationObject * op, OplistObject * o)
|
2000-12-07 12:14:35 +00:00
|
|
|
{
|
|
|
|
|
if (op != NULL) {
|
2000-12-16 20:28:06 +00:00
|
|
|
if (PyOperation_Check(op)) {
|
|
|
|
|
o->ops->push_back(op->operation);
|
|
|
|
|
op->own = 0;
|
|
|
|
|
} else if ((PyObject*)op != Py_None) {
|
2000-12-07 12:14:35 +00:00
|
|
|
PyErr_SetString(PyExc_TypeError, "Argument must be an op");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
2000-11-29 15:19:36 +00:00
|
|
|
static PyObject * oplist_new(PyObject * self, PyObject * args)
|
|
|
|
|
{
|
|
|
|
|
OplistObject *o;
|
|
|
|
|
|
2000-12-16 20:28:06 +00:00
|
|
|
RootOperationObject *op1 = NULL, *op2 = NULL, *op3 = NULL, *op4 = NULL;
|
2000-12-07 12:14:35 +00:00
|
|
|
if (!PyArg_ParseTuple(args, "|OOOO", &op1, &op2, &op3, &op4)) {
|
2000-11-29 15:19:36 +00:00
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
o = newOplistObject(args);
|
|
|
|
|
if ( o == NULL ) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
o->ops = new oplist();
|
2000-12-07 12:14:35 +00:00
|
|
|
addToOplist(op1, o);
|
|
|
|
|
addToOplist(op2, o);
|
|
|
|
|
addToOplist(op3, o);
|
|
|
|
|
addToOplist(op4, o);
|
2000-11-29 15:19:36 +00:00
|
|
|
return (PyObject *)o;
|
|
|
|
|
}
|
|
|
|
|
|
2000-11-17 00:18:32 +00:00
|
|
|
static PyObject * object_new(PyObject * self, PyObject * args)
|
2000-11-16 16:35:03 +00:00
|
|
|
{
|
2000-11-17 00:18:32 +00:00
|
|
|
AtlasObject *o;
|
2000-11-16 16:35:03 +00:00
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, "")) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2000-11-17 00:18:32 +00:00
|
|
|
o = newAtlasObject(args);
|
2000-11-16 16:35:03 +00:00
|
|
|
if ( o == NULL ) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2001-04-20 16:23:34 +00:00
|
|
|
o->m_obj = new Object(Object::MapType());
|
2000-11-16 16:35:03 +00:00
|
|
|
return (PyObject *)o;
|
|
|
|
|
}
|
|
|
|
|
|
2000-12-01 00:13:39 +00:00
|
|
|
static PyObject * entity_new(PyObject * self, PyObject * args, PyObject * kwds)
|
|
|
|
|
{
|
2000-12-30 23:16:57 +00:00
|
|
|
AtlasObject *o;
|
|
|
|
|
char * id = NULL;
|
|
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, "|s", &id)) {
|
* tools/cycmd.cpp: Ensure that login op is flushed after it is sent.
* server/Player.cpp: Arg order of std::string.compare() is
incompatable between recent libstdc++ versions. Switch
back to old version, still in most common use.
* rulesets/Thing.cpp: Set refno on ops handled in game.
* rulesets/Python_API.cpp: Modify Entity() python constructor
so that commonly used attributes from old atlas are translated
to their modern equivalents.
* rulesets/Py_Thing.cpp, rulesets/Py_Mind.cpp: Differentiate
between previously identical error messages in several places.
* rulesets/Py_Object.cpp: Rework conversion of python dict to
Atlas map to be more efficient and clean.
* rulesets/Py_Location.cpp: Rework setting of vector parts of
location so that it can accept vectors from python in more
formats, including lists and tuples.
* rulesets/Creator.h, rulesets/Character.h, common/BaseEntity.h:
Re-order virtual methods declarations to fit a convention.
* common/stringstream.h: Hardcode use of local stringstream class,
as the version provided with older libstdc++ seems to be broken.
* common/database.cpp: Use the common header to pick the right
stringstream implementation.
* common/BaseWorld.cpp, server/Persistance.cpp: Removed unused
stringstream include.
* rulesets/Creator.cpp: Added extra debug output.
* client/define_world.h, client/define_world.cpp, client/CommClient.h:
Use CreatorClient to store Creators mind, instead of BaseMind.
* client/client.cpp,
client/ObserverClient.h, client/ObserverClient.cpp,
client/CreatorClient.h, client/CommClient.h, client/CommClient.cpp:
Modify method names to fit capitalisation conventions.
* client/CreatorClient.cpp: Implement creation of in-game entities,
using creator entity.
* client/CommClient.cpp: Added correct client side monitoring of
creator entity.
* client/ClientConnection.h, client/ClientConnection.cpp: Added
pending method to establish if ops are in the queue. Switched send()
method so we only send ops. Add setting of serialno of sent
ops, starting with an offset of 512.
* client/CharacterClient.h: Removed unused member, opFound.
* client/CharacterClient.cpp: Debugged sendAndWait() method.
Al Riddoch <alriddoch@zepler.org>
2001-08-16 17:39:42 +00:00
|
|
|
return NULL;
|
2000-12-30 23:16:57 +00:00
|
|
|
}
|
* server/server.cpp, server/ServerRouting.h, server/ServerRouting.cpp,
server/CommServer.h: Added support for server "name" which
defaults to the hostname of the server machine, but is
customisable in the config. This can be used in preference to
IP address when doing lookups with the metaserver.
* server/Lobby.h, server/ServerRouting.h, server/Account.h,
server/Account.cpp, rulesets/Stackable.h, rulesets/Stackable.cpp,
rulesets/Python_API.cpp, rulesets/Py_Object.cpp, rulesets/Plant.cpp,
rulesets/Pedestrian.cpp, rulesets/Entity.h, rulesets/Entity.cpp,
rulesets/Character.h, rulesets/Character.cpp, common/BaseEntity.h,
common/BaseEntity.cpp: Modied asObect() and addToObject()
methods to make them more efficient.
* modules/Location.h, modules/Location.cpp: Removed old obsolete
Message::Object based addToObject() method.
* rulesets/Thing.cpp: Optimised apperance/disappearance code.
Al Riddoch <alriddoch@zepler.org>
2001-07-16 17:52:23 +00:00
|
|
|
Object::MapType omap;
|
2000-12-30 23:16:57 +00:00
|
|
|
if (id != NULL) {
|
2001-08-02 14:27:06 +00:00
|
|
|
omap["id"] = std::string(id);
|
2000-12-30 23:16:57 +00:00
|
|
|
}
|
|
|
|
|
if ((kwds != NULL) && (PyDict_Check(kwds))) {
|
2000-12-06 18:21:35 +00:00
|
|
|
PyObject * keys = PyDict_Keys(kwds);
|
|
|
|
|
PyObject * vals = PyDict_Values(kwds);
|
2000-12-01 00:13:39 +00:00
|
|
|
if ((keys == NULL) || (vals == NULL)) {
|
|
|
|
|
PyErr_SetString(PyExc_TypeError, "Error in keywords");
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2000-12-06 18:21:35 +00:00
|
|
|
int i, size=PyList_Size(keys);
|
2000-12-01 00:13:39 +00:00
|
|
|
for(i = 0; i < size; i++) {
|
|
|
|
|
char * key = PyString_AsString(PyList_GetItem(keys, i));
|
|
|
|
|
PyObject * val = PyList_GetItem(vals, i);
|
2000-12-16 20:28:06 +00:00
|
|
|
if ((strcmp(key, "location") == 0) && (PyLocation_Check(val))) {
|
2000-12-01 00:13:39 +00:00
|
|
|
LocationObject * loc = (LocationObject*)val;
|
* server/server.cpp, server/ServerRouting.h, server/ServerRouting.cpp,
server/CommServer.h: Added support for server "name" which
defaults to the hostname of the server machine, but is
customisable in the config. This can be used in preference to
IP address when doing lookups with the metaserver.
* server/Lobby.h, server/ServerRouting.h, server/Account.h,
server/Account.cpp, rulesets/Stackable.h, rulesets/Stackable.cpp,
rulesets/Python_API.cpp, rulesets/Py_Object.cpp, rulesets/Plant.cpp,
rulesets/Pedestrian.cpp, rulesets/Entity.h, rulesets/Entity.cpp,
rulesets/Character.h, rulesets/Character.cpp, common/BaseEntity.h,
common/BaseEntity.cpp: Modied asObect() and addToObject()
methods to make them more efficient.
* modules/Location.h, modules/Location.cpp: Removed old obsolete
Message::Object based addToObject() method.
* rulesets/Thing.cpp: Optimised apperance/disappearance code.
Al Riddoch <alriddoch@zepler.org>
2001-07-16 17:52:23 +00:00
|
|
|
loc->location->addToObject(omap);
|
* tools/cycmd.cpp: Ensure that login op is flushed after it is sent.
* server/Player.cpp: Arg order of std::string.compare() is
incompatable between recent libstdc++ versions. Switch
back to old version, still in most common use.
* rulesets/Thing.cpp: Set refno on ops handled in game.
* rulesets/Python_API.cpp: Modify Entity() python constructor
so that commonly used attributes from old atlas are translated
to their modern equivalents.
* rulesets/Py_Thing.cpp, rulesets/Py_Mind.cpp: Differentiate
between previously identical error messages in several places.
* rulesets/Py_Object.cpp: Rework conversion of python dict to
Atlas map to be more efficient and clean.
* rulesets/Py_Location.cpp: Rework setting of vector parts of
location so that it can accept vectors from python in more
formats, including lists and tuples.
* rulesets/Creator.h, rulesets/Character.h, common/BaseEntity.h:
Re-order virtual methods declarations to fit a convention.
* common/stringstream.h: Hardcode use of local stringstream class,
as the version provided with older libstdc++ seems to be broken.
* common/database.cpp: Use the common header to pick the right
stringstream implementation.
* common/BaseWorld.cpp, server/Persistance.cpp: Removed unused
stringstream include.
* rulesets/Creator.cpp: Added extra debug output.
* client/define_world.h, client/define_world.cpp, client/CommClient.h:
Use CreatorClient to store Creators mind, instead of BaseMind.
* client/client.cpp,
client/ObserverClient.h, client/ObserverClient.cpp,
client/CreatorClient.h, client/CommClient.h, client/CommClient.cpp:
Modify method names to fit capitalisation conventions.
* client/CreatorClient.cpp: Implement creation of in-game entities,
using creator entity.
* client/CommClient.cpp: Added correct client side monitoring of
creator entity.
* client/ClientConnection.h, client/ClientConnection.cpp: Added
pending method to establish if ops are in the queue. Switched send()
method so we only send ops. Add setting of serialno of sent
ops, starting with an offset of 512.
* client/CharacterClient.h: Removed unused member, opFound.
* client/CharacterClient.cpp: Debugged sendAndWait() method.
Al Riddoch <alriddoch@zepler.org>
2001-08-16 17:39:42 +00:00
|
|
|
} else if (strcmp(key, "xyz") == 0) {
|
|
|
|
|
omap["pos"] = PyObject_asObject(val);
|
|
|
|
|
} else if ((strcmp(key, "parent") == 0) && (PyString_Check(val))) {
|
|
|
|
|
omap["loc"] = Object(std::string(PyString_AsString(val)));
|
|
|
|
|
} else if ((strcmp(key, "type") == 0) && (PyString_Check(val))) {
|
|
|
|
|
omap["parents"] = Object::ListType(1,std::string(PyString_AsString(val)));
|
2000-12-01 00:13:39 +00:00
|
|
|
} else {
|
|
|
|
|
Object val_obj = PyObject_asObject(val);
|
|
|
|
|
if (val_obj.GetType() == Object::TYPE_NONE) {
|
2000-12-03 14:23:26 +00:00
|
|
|
fprintf(stderr, "Could not handle %s value in Entity()", key);
|
2000-12-01 00:13:39 +00:00
|
|
|
PyErr_SetString(PyExc_TypeError, "Argument type error to Entity()");
|
2000-12-11 13:06:12 +00:00
|
|
|
Py_DECREF(keys);
|
|
|
|
|
Py_DECREF(vals);
|
2000-12-01 00:13:39 +00:00
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
omap[key] = val_obj;
|
|
|
|
|
}
|
|
|
|
|
}
|
2000-12-11 13:06:12 +00:00
|
|
|
Py_DECREF(keys);
|
|
|
|
|
Py_DECREF(vals);
|
2000-12-30 23:16:57 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
o = newAtlasObject(args);
|
|
|
|
|
if ( o == NULL ) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
* server/server.cpp, server/ServerRouting.h, server/ServerRouting.cpp,
server/CommServer.h: Added support for server "name" which
defaults to the hostname of the server machine, but is
customisable in the config. This can be used in preference to
IP address when doing lookups with the metaserver.
* server/Lobby.h, server/ServerRouting.h, server/Account.h,
server/Account.cpp, rulesets/Stackable.h, rulesets/Stackable.cpp,
rulesets/Python_API.cpp, rulesets/Py_Object.cpp, rulesets/Plant.cpp,
rulesets/Pedestrian.cpp, rulesets/Entity.h, rulesets/Entity.cpp,
rulesets/Character.h, rulesets/Character.cpp, common/BaseEntity.h,
common/BaseEntity.cpp: Modied asObect() and addToObject()
methods to make them more efficient.
* modules/Location.h, modules/Location.cpp: Removed old obsolete
Message::Object based addToObject() method.
* rulesets/Thing.cpp: Optimised apperance/disappearance code.
Al Riddoch <alriddoch@zepler.org>
2001-07-16 17:52:23 +00:00
|
|
|
o->m_obj = new Object(omap);
|
2000-12-30 23:16:57 +00:00
|
|
|
return (PyObject *)o;
|
2000-12-01 00:13:39 +00:00
|
|
|
}
|
|
|
|
|
|
2000-11-17 00:18:32 +00:00
|
|
|
static PyObject * cppthing_new(PyObject * self, PyObject * args)
|
2000-11-16 16:35:03 +00:00
|
|
|
{
|
2000-11-17 00:18:32 +00:00
|
|
|
ThingObject *o;
|
2000-11-16 16:35:03 +00:00
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, "")) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2000-11-17 00:18:32 +00:00
|
|
|
o = newThingObject(args);
|
2000-11-16 16:35:03 +00:00
|
|
|
if ( o == NULL ) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
return (PyObject *)o;
|
|
|
|
|
}
|
|
|
|
|
|
2001-05-20 19:02:41 +00:00
|
|
|
static inline void addToArgs(Object::ListType & args, PyObject * ent)
|
2000-12-03 23:17:52 +00:00
|
|
|
{
|
|
|
|
|
if (ent == NULL) {
|
|
|
|
|
return;
|
|
|
|
|
}
|
2000-12-16 20:28:06 +00:00
|
|
|
if (PyAtlasObject_Check(ent)) {
|
2000-12-03 23:17:52 +00:00
|
|
|
AtlasObject * obj = (AtlasObject*)ent;
|
|
|
|
|
if (obj->m_obj == NULL) {
|
|
|
|
|
fprintf(stderr, "Invalid object in Operation arguments\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
2001-05-20 19:02:41 +00:00
|
|
|
Object o(*obj->m_obj);
|
|
|
|
|
if (o.IsMap() && (obj->Object_attr != NULL)) {
|
|
|
|
|
Object::MapType & ent = o.AsMap();
|
|
|
|
|
Object::MapType ent2 = PyDictObject_asMapType(obj->Object_attr);
|
|
|
|
|
Object::MapType::iterator I = ent2.begin();
|
|
|
|
|
for(; I != ent2.end(); I++) {
|
|
|
|
|
if (ent.find(I->first) != ent.end()) {
|
|
|
|
|
ent[I->first] = I->second;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
args.push_back(o);
|
2000-12-16 20:28:06 +00:00
|
|
|
} else if (PyOperation_Check(ent)) {
|
2000-12-14 12:03:05 +00:00
|
|
|
RootOperationObject * op = (RootOperationObject*)ent;
|
|
|
|
|
if (op->operation == NULL) {
|
|
|
|
|
fprintf(stderr, "Invalid operation in Operation arguments\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
args.push_back(op->operation->AsObject());
|
2000-12-03 23:17:52 +00:00
|
|
|
} else {
|
|
|
|
|
fprintf(stderr, "Non-entity passed as arg to Operation()\n");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
2000-11-21 19:24:29 +00:00
|
|
|
static PyObject * operation_new(PyObject * self, PyObject * args, PyObject * kwds)
|
2000-11-14 15:52:10 +00:00
|
|
|
{
|
2000-11-21 19:24:29 +00:00
|
|
|
RootOperationObject * op;
|
|
|
|
|
|
|
|
|
|
char * type;
|
|
|
|
|
PyObject * arg1 = NULL;
|
|
|
|
|
PyObject * arg2 = NULL;
|
|
|
|
|
PyObject * arg3 = NULL;
|
|
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, "s|OOO", &type, &arg1, &arg2, &arg3)) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
op = newAtlasRootOperation(args);
|
|
|
|
|
if (op == NULL) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
2000-11-26 19:58:36 +00:00
|
|
|
if (strcmp(type, "tick") == 0) {
|
2001-04-12 11:13:06 +00:00
|
|
|
op->operation = new Tick(Tick::Instantiate());
|
2000-12-14 12:03:05 +00:00
|
|
|
} else if (strcmp(type, "sight") == 0) {
|
2001-04-12 11:13:06 +00:00
|
|
|
op->operation = new Sight(Sight::Instantiate());
|
2000-12-14 12:03:05 +00:00
|
|
|
} else if (strcmp(type, "set") == 0) {
|
2001-04-12 11:13:06 +00:00
|
|
|
op->operation = new Set(Set::Instantiate());
|
2000-12-14 12:03:05 +00:00
|
|
|
} else if (strcmp(type, "fire") == 0) {
|
2001-04-12 11:13:06 +00:00
|
|
|
op->operation = new Fire(Fire::Instantiate());
|
2001-05-06 23:51:37 +00:00
|
|
|
} else if (strcmp(type, "action") == 0) {
|
|
|
|
|
op->operation = new Action(Action::Instantiate());
|
2000-12-30 23:16:57 +00:00
|
|
|
} else if (strcmp(type, "chop") == 0) {
|
2001-04-12 11:13:06 +00:00
|
|
|
op->operation = new Chop(Chop::Instantiate());
|
2000-12-30 23:16:57 +00:00
|
|
|
} else if (strcmp(type, "cut") == 0) {
|
2001-04-12 11:13:06 +00:00
|
|
|
op->operation = new Cut(Cut::Instantiate());
|
2000-11-26 19:58:36 +00:00
|
|
|
} else if (strcmp(type, "create") == 0) {
|
2001-04-12 11:13:06 +00:00
|
|
|
op->operation = new Create(Create::Instantiate());
|
2000-11-26 19:58:36 +00:00
|
|
|
} else if (strcmp(type, "setup") == 0) {
|
2001-04-12 11:13:06 +00:00
|
|
|
op->operation = new Setup(Setup::Instantiate());
|
2000-11-26 19:58:36 +00:00
|
|
|
} else if (strcmp(type, "look") == 0) {
|
2001-04-12 11:13:06 +00:00
|
|
|
op->operation = new Look(Look::Instantiate());
|
2000-11-26 19:58:36 +00:00
|
|
|
} else if (strcmp(type, "move") == 0) {
|
2001-04-12 11:13:06 +00:00
|
|
|
op->operation = new Move(Move::Instantiate());
|
2000-11-26 19:58:36 +00:00
|
|
|
} else if (strcmp(type, "talk") == 0) {
|
2001-04-12 11:13:06 +00:00
|
|
|
op->operation = new Talk(Talk::Instantiate());
|
2000-12-30 23:16:57 +00:00
|
|
|
} else if (strcmp(type, "touch") == 0) {
|
2001-04-12 11:13:06 +00:00
|
|
|
op->operation = new Touch(Touch::Instantiate());
|
2000-12-30 23:16:57 +00:00
|
|
|
} else if (strcmp(type, "eat") == 0) {
|
2001-04-12 11:13:06 +00:00
|
|
|
op->operation = new Eat(Eat::Instantiate());
|
2000-12-30 23:16:57 +00:00
|
|
|
} else if (strcmp(type, "nourish") == 0) {
|
2001-04-12 11:13:06 +00:00
|
|
|
op->operation = new Nourish(Nourish::Instantiate());
|
2001-05-03 22:04:43 +00:00
|
|
|
} else if (strcmp(type, "info") == 0) {
|
|
|
|
|
op->operation = new Info(Info::Instantiate());
|
2000-12-14 12:03:05 +00:00
|
|
|
} else if ((strcmp(type,"thought")==0) || (strcmp(type,"goal_info")==0)) {
|
|
|
|
|
Py_DECREF(op);
|
|
|
|
|
Py_INCREF(Py_None);
|
|
|
|
|
return Py_None;
|
2000-11-21 19:24:29 +00:00
|
|
|
} else {
|
2001-05-22 17:59:43 +00:00
|
|
|
op->operation = new RootOperation(Generic::Instantiate(type));
|
* tools/cydbload.cpp: Added parameter handling so any file can
be loaded into the database.
* tools/cycmd.cpp: Cleaned up usage and help functions.
* tools/cyisoload.cpp: Cleaned up usage(), and made sure build
completes okay if libraries are missing, and missing
functionality is reported to the user.
* server/server.cpp: Added config options that specifies that
the contents of the db should loaded on server startup. Cleaned
up some debug code.
* server/WorldTime.cpp, server/WorldRouter.cpp,
server/Connection.cpp, rulesets/Structure.h,
rulesets/Python_API.cpp, rulesets/Py_WorldTime.cpp,
rulesets/Movement.cpp, rulesets/Entity.cpp,
physics/Vector3D.h, common/persistance.cpp,
common/database.h, common/database.cpp: Removed output either
to debug mode, or removed altogether.
* common/BaseEntity.h, common/BaseEntity.cpp: Removed redundant header
includes.
* server/ServerRouting.cpp, common/persistance.h,
common/persistance.cpp: Modified admin account function names it
fit convention.
* module/Location.h: Fixed collision detection so that entities
with velocity set to 0 still get checked.
* rulesets/Entity.cpp, rulesets/Thing.cpp, rulesets/Character.cpp,
rulesets/BaseMind.cpp, rulesets/Creator.cpp,
rulesets/ExternalMind.cpp, rulesets/Food.cpp, rulesets/MemMap.cpp,
rulesets/Movement.cpp, rulesets/Pedestrian.cpp, rulesets/Plant.cpp,
rulesets/Py_Location.cpp, rulesets/Py_*.cpp, rulesets/World.cpp:
Removed unnecessary #includes.
Al Riddoch <alriddoch@zepler.org>
2001-06-04 11:22:27 +00:00
|
|
|
// fprintf(stderr, "NOTICE: Python creating a custom %s op\n", type);
|
2000-12-06 18:21:35 +00:00
|
|
|
//*op->operation = RootOperation::Instantiate();
|
2001-05-22 17:59:43 +00:00
|
|
|
// Py_DECREF(op);
|
|
|
|
|
// Py_INCREF(Py_None);
|
|
|
|
|
// return Py_None;
|
2000-11-21 19:24:29 +00:00
|
|
|
}
|
2000-12-06 18:21:35 +00:00
|
|
|
op->own = 1;
|
2000-11-21 19:24:29 +00:00
|
|
|
if (PyMapping_HasKeyString(kwds, "to")) {
|
2001-10-09 14:03:12 +00:00
|
|
|
PyObject * to = PyMapping_GetItemString(kwds, "to");
|
2000-12-03 16:56:10 +00:00
|
|
|
PyObject * to_id;
|
2000-12-14 12:03:05 +00:00
|
|
|
if (PyString_Check(to)) {
|
|
|
|
|
to_id = to;
|
|
|
|
|
} else if ((to_id = PyObject_GetAttrString(to, "id")) == NULL) {
|
2000-12-03 16:56:10 +00:00
|
|
|
fprintf(stderr, "To was not really an entity, as it had no id\n");
|
2001-10-09 14:03:12 +00:00
|
|
|
Py_DECREF(to);
|
2000-12-03 16:56:10 +00:00
|
|
|
return NULL;
|
2001-10-09 14:03:12 +00:00
|
|
|
} else {
|
|
|
|
|
// to_id == to.getattr("id") and to is finished with
|
|
|
|
|
Py_DECREF(to);
|
2000-12-03 16:56:10 +00:00
|
|
|
}
|
|
|
|
|
if (!PyString_Check(to_id)) {
|
|
|
|
|
fprintf(stderr, "To id is not a string\n");
|
2001-10-09 14:03:12 +00:00
|
|
|
Py_DECREF(to_id);
|
2000-12-03 16:56:10 +00:00
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
op->operation->SetTo(PyString_AsString(to_id));
|
2001-10-09 14:03:12 +00:00
|
|
|
Py_DECREF(to_id);
|
2000-11-21 19:24:29 +00:00
|
|
|
}
|
|
|
|
|
if (PyMapping_HasKeyString(kwds, "from_")) {
|
2001-10-09 14:03:12 +00:00
|
|
|
PyObject * from = PyMapping_GetItemString(kwds, "from_");
|
2000-12-03 16:56:10 +00:00
|
|
|
PyObject * from_id;
|
2000-12-14 12:03:05 +00:00
|
|
|
if (PyString_Check(from)) {
|
|
|
|
|
from_id = from;
|
|
|
|
|
} else if ((from_id = PyObject_GetAttrString(from, "id")) == NULL) {
|
2000-12-03 16:56:10 +00:00
|
|
|
fprintf(stderr, "From was not really an entity, as it had no id\n");
|
2001-10-09 14:03:12 +00:00
|
|
|
Py_DECREF(from);
|
2000-12-03 16:56:10 +00:00
|
|
|
return NULL;
|
2001-10-09 14:03:12 +00:00
|
|
|
} else {
|
|
|
|
|
Py_DECREF(from);
|
2000-12-03 16:56:10 +00:00
|
|
|
}
|
|
|
|
|
if (!PyString_Check(from_id)) {
|
|
|
|
|
fprintf(stderr, "From id is not a string\n");
|
2001-10-09 14:03:12 +00:00
|
|
|
Py_DECREF(from_id);
|
2000-12-03 16:56:10 +00:00
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
op->operation->SetFrom(PyString_AsString(from_id));
|
2001-10-09 14:03:12 +00:00
|
|
|
Py_DECREF(from_id);
|
2000-12-03 14:23:26 +00:00
|
|
|
// FIXME I think I need to actually do something with said value now
|
2000-11-21 19:24:29 +00:00
|
|
|
}
|
2000-12-03 23:17:52 +00:00
|
|
|
Object::ListType args_list;
|
|
|
|
|
addToArgs(args_list, arg1);
|
|
|
|
|
addToArgs(args_list, arg2);
|
|
|
|
|
addToArgs(args_list, arg3);
|
|
|
|
|
op->operation->SetArgs(args_list);
|
2000-11-21 19:24:29 +00:00
|
|
|
return (PyObject *)op;
|
2000-11-14 15:52:10 +00:00
|
|
|
}
|
|
|
|
|
|
2000-11-30 12:51:59 +00:00
|
|
|
static PyObject * set_kw(PyObject * meth_self, PyObject * args)
|
2000-11-24 01:41:06 +00:00
|
|
|
{
|
|
|
|
|
// Takes self, kw, name, default=None
|
2000-11-30 12:51:59 +00:00
|
|
|
PyObject * self;
|
|
|
|
|
PyObject * kw;
|
|
|
|
|
char * name;
|
|
|
|
|
PyObject * def = NULL;
|
|
|
|
|
|
|
|
|
|
if (!PyArg_ParseTuple(args, "OOs|O", &self, &kw, &name, &def)) {
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
PyObject * attr = PyObject_GetAttrString(self, "attributes");
|
|
|
|
|
if (attr == NULL) {
|
|
|
|
|
PyErr_SetString(PyExc_TypeError, "SET_KW: No attributes list");
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
int i = PyList_Size(attr);
|
|
|
|
|
char * entry;
|
|
|
|
|
PyObject * item;
|
|
|
|
|
for(i= 0; i < PyList_Size(attr); i++) {
|
|
|
|
|
item = PyList_GetItem(attr, i);
|
|
|
|
|
if (!PyString_Check(item)) {
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
entry = PyString_AsString(item);
|
|
|
|
|
if (strcmp(entry, name) == 0) {
|
|
|
|
|
goto list_contains_it;
|
|
|
|
|
}
|
|
|
|
|
// Should I free entry at this point?
|
|
|
|
|
}
|
2000-12-03 14:23:26 +00:00
|
|
|
{
|
|
|
|
|
PyObject * namestr = PyString_FromString(name);
|
|
|
|
|
PyList_Append(attr, namestr);
|
|
|
|
|
Py_DECREF(namestr);
|
|
|
|
|
}
|
2000-11-30 12:51:59 +00:00
|
|
|
list_contains_it:
|
2001-10-09 14:03:12 +00:00
|
|
|
Py_DECREF(attr);
|
2000-11-30 12:51:59 +00:00
|
|
|
if (!PyDict_Check(kw)) {
|
|
|
|
|
PyErr_SetString(PyExc_TypeError, "SET_KW: kw not a dict");
|
|
|
|
|
return NULL;
|
|
|
|
|
}
|
|
|
|
|
PyObject * value = NULL;
|
2001-10-09 14:03:12 +00:00
|
|
|
bool decvalue = false;
|
2000-11-30 12:51:59 +00:00
|
|
|
if ((value = PyDict_GetItemString(kw, name)) == NULL) {
|
|
|
|
|
PyObject * copy = PyDict_GetItemString(kw, "copy");
|
|
|
|
|
if ((copy != NULL) && (PyObject_HasAttrString(copy, name))) {
|
|
|
|
|
value = PyObject_GetAttrString(copy, name);
|
2001-10-09 14:03:12 +00:00
|
|
|
decvalue = true;
|
2000-11-30 12:51:59 +00:00
|
|
|
} else {
|
|
|
|
|
value = def;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (value == NULL) {
|
|
|
|
|
Py_INCREF(Py_None);
|
2000-12-03 14:23:26 +00:00
|
|
|
value = Py_None;
|
2000-11-30 12:51:59 +00:00
|
|
|
}
|
|
|
|
|
PyObject_SetAttrString(self, name, value);
|
2001-10-09 14:03:12 +00:00
|
|
|
|
|
|
|
|
if (decvalue) { Py_DECREF(value); }
|
2000-11-30 12:51:59 +00:00
|
|
|
|
2000-12-03 16:56:10 +00:00
|
|
|
Py_INCREF(Py_None);
|
|
|
|
|
return Py_None;
|
2000-11-24 01:41:06 +00:00
|
|
|
}
|
|
|
|
|
|
2000-11-19 00:02:29 +00:00
|
|
|
static PyMethodDef atlas_methods[] = {
|
2000-11-21 19:24:29 +00:00
|
|
|
/* {"system", spam_system, METH_VARARGS}, */
|
|
|
|
|
{"Operation", (PyCFunction)operation_new, METH_VARARGS|METH_KEYWORDS},
|
2000-12-04 20:08:21 +00:00
|
|
|
{"isLocation", is_location, METH_VARARGS},
|
2000-11-21 19:24:29 +00:00
|
|
|
{"Location", location_new, METH_VARARGS},
|
|
|
|
|
{"Object", object_new, METH_VARARGS},
|
2000-12-01 00:13:39 +00:00
|
|
|
{"Entity", (PyCFunction)entity_new, METH_VARARGS|METH_KEYWORDS},
|
2000-11-29 15:19:36 +00:00
|
|
|
{"Message", oplist_new, METH_VARARGS},
|
2000-11-21 19:24:29 +00:00
|
|
|
{"cppThing", cppthing_new, METH_VARARGS},
|
|
|
|
|
{NULL, NULL} /* Sentinel */
|
2000-11-14 15:52:10 +00:00
|
|
|
};
|
|
|
|
|
|
2001-02-26 14:41:10 +00:00
|
|
|
static PyMethodDef vector3d_methods[] = {
|
2000-11-20 20:28:08 +00:00
|
|
|
{"Vector3D", vector3d_new, METH_VARARGS},
|
|
|
|
|
{NULL, NULL} /* Sentinel */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static PyMethodDef server_methods[] = {
|
2000-11-29 15:19:36 +00:00
|
|
|
{"WorldTime", worldtime_new, METH_VARARGS},
|
2000-11-20 20:28:08 +00:00
|
|
|
{NULL, NULL} /* Sentinel */
|
|
|
|
|
};
|
|
|
|
|
|
|
|
|
|
static PyMethodDef common_methods[] = {
|
|
|
|
|
//{"null", null_new, METH_VARARGS},
|
|
|
|
|
{NULL, NULL} /* Sentinel */
|
|
|
|
|
};
|
|
|
|
|
|
2000-11-24 01:41:06 +00:00
|
|
|
static PyMethodDef misc_methods[] = {
|
|
|
|
|
{"set_kw", set_kw, METH_VARARGS},
|
|
|
|
|
{NULL, NULL} /* Sentinel */
|
|
|
|
|
};
|
|
|
|
|
|
2000-11-14 15:52:10 +00:00
|
|
|
void init_python_api()
|
|
|
|
|
{
|
2001-08-02 14:27:06 +00:00
|
|
|
std::string pypath("");
|
2001-08-19 18:37:38 +00:00
|
|
|
std::string importCmd("ruleset_import_hooks.install([");
|
2001-08-02 14:27:06 +00:00
|
|
|
std::list<std::string>::const_iterator I;
|
2000-12-13 12:10:48 +00:00
|
|
|
for(I = rulesets.begin(); I != rulesets.end(); I++) {
|
2001-08-19 18:37:38 +00:00
|
|
|
pypath = pypath + share_directory + "/cyphesis/rulesets/" + *I + ":";
|
|
|
|
|
if (I != rulesets.begin()) {
|
|
|
|
|
importCmd = importCmd + ",";
|
|
|
|
|
}
|
|
|
|
|
importCmd = importCmd + "\"" + *I + "\"";
|
2000-12-13 12:10:48 +00:00
|
|
|
}
|
2001-08-19 18:37:38 +00:00
|
|
|
importCmd = importCmd + "])\n";
|
|
|
|
|
|
2000-12-13 12:10:48 +00:00
|
|
|
setenv("PYTHONPATH", pypath.c_str(), 1);
|
2000-11-14 15:52:10 +00:00
|
|
|
|
2000-12-13 12:10:48 +00:00
|
|
|
Py_Initialize();
|
2000-11-14 15:52:10 +00:00
|
|
|
|
2000-12-13 12:10:48 +00:00
|
|
|
PyRun_SimpleString("from hooks import ruleset_import_hooks\n");
|
2001-08-19 18:37:38 +00:00
|
|
|
PyRun_SimpleString((char *)importCmd.c_str());
|
2000-11-24 01:41:06 +00:00
|
|
|
|
2000-12-13 12:10:48 +00:00
|
|
|
if (Py_InitModule("atlas", atlas_methods) == NULL) {
|
|
|
|
|
fprintf(stderr, "Failed to Create atlas module\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
2000-11-20 20:28:08 +00:00
|
|
|
|
2001-02-26 14:41:10 +00:00
|
|
|
if (Py_InitModule("Vector3D", vector3d_methods) == NULL) {
|
2000-12-13 12:10:48 +00:00
|
|
|
fprintf(stderr, "Failed to Create Vector3D module\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
2000-11-20 20:28:08 +00:00
|
|
|
|
2001-10-08 23:21:18 +00:00
|
|
|
if (Py_InitModule("misc", misc_methods) == NULL) {
|
2000-12-13 12:10:48 +00:00
|
|
|
fprintf(stderr, "Failed to Create misc module\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
2000-11-24 01:41:06 +00:00
|
|
|
|
2000-12-13 12:10:48 +00:00
|
|
|
PyObject * common;
|
|
|
|
|
if ((common = Py_InitModule("common", common_methods)) == NULL) {
|
|
|
|
|
fprintf(stderr, "Failed to Create common module\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
PyObject * _const = PyModule_New("const");
|
|
|
|
|
PyObject * log = PyModule_New("log");
|
2001-10-08 23:21:18 +00:00
|
|
|
PyObject * dict = PyModule_GetDict(common);
|
2000-12-13 12:10:48 +00:00
|
|
|
PyDict_SetItemString(dict, "const", _const);
|
|
|
|
|
PyDict_SetItemString(dict, "log", log);
|
|
|
|
|
PyObject * debug = (PyObject *)PyObject_NEW(FunctionObject, &log_debug_type);
|
|
|
|
|
PyObject_SetAttrString(log, "debug", debug);
|
2001-10-08 23:21:18 +00:00
|
|
|
Py_DECREF(debug);
|
|
|
|
|
Py_DECREF(log);
|
|
|
|
|
PyObject * o;
|
|
|
|
|
o = PyInt_FromLong(0);
|
|
|
|
|
PyObject_SetAttrString(_const, "server_python", o);
|
|
|
|
|
Py_DECREF(o);
|
|
|
|
|
o = PyInt_FromLong(consts::debug_level);
|
|
|
|
|
PyObject_SetAttrString(_const, "debug_level", o);
|
|
|
|
|
Py_DECREF(o);
|
|
|
|
|
o = PyInt_FromLong(consts::debug_thinking);
|
|
|
|
|
PyObject_SetAttrString(_const, "debug_thinking", o);
|
|
|
|
|
Py_DECREF(o);
|
|
|
|
|
|
|
|
|
|
o = PyFloat_FromDouble(consts::time_multiplier);
|
|
|
|
|
PyObject_SetAttrString(_const, "time_multiplier", o);
|
|
|
|
|
Py_DECREF(o);
|
|
|
|
|
o = PyFloat_FromDouble(consts::base_velocity_coefficient);
|
|
|
|
|
PyObject_SetAttrString(_const, "base_velocity_coefficient", o);
|
|
|
|
|
Py_DECREF(o);
|
|
|
|
|
o = PyFloat_FromDouble(consts::base_velocity);
|
|
|
|
|
PyObject_SetAttrString(_const, "base_velocity", o);
|
|
|
|
|
Py_DECREF(o);
|
|
|
|
|
|
|
|
|
|
o = PyFloat_FromDouble(consts::basic_tick);
|
|
|
|
|
PyObject_SetAttrString(_const, "basic_tick", o);
|
|
|
|
|
Py_DECREF(o);
|
|
|
|
|
|
|
|
|
|
o = PyFloat_FromDouble(consts::sight_range);
|
|
|
|
|
PyObject_SetAttrString(_const, "sight_range", o);
|
|
|
|
|
Py_DECREF(o);
|
|
|
|
|
o = PyFloat_FromDouble(consts::hearing_range);
|
|
|
|
|
PyObject_SetAttrString(_const, "hearing_range", o);
|
|
|
|
|
Py_DECREF(o);
|
|
|
|
|
o = PyInt_FromLong(consts::enable_ranges);
|
|
|
|
|
PyObject_SetAttrString(_const, "enable_ranges", o);
|
|
|
|
|
Py_DECREF(o);
|
|
|
|
|
Py_DECREF(_const);
|
2000-12-13 12:10:48 +00:00
|
|
|
|
|
|
|
|
PyObject * server;
|
|
|
|
|
if ((server = Py_InitModule("server", server_methods)) == NULL) {
|
|
|
|
|
fprintf(stderr, "Failed to Create server thing\n");
|
|
|
|
|
return;
|
|
|
|
|
}
|
|
|
|
|
dict = PyModule_GetDict(server);
|
|
|
|
|
PyObject * dictlist = PyModule_New("dictlist");
|
|
|
|
|
PyObject * add_value = (PyObject *)PyObject_NEW(FunctionObject, &dictlist_add_value_type);
|
|
|
|
|
PyObject_SetAttrString(dictlist, "add_value", add_value);
|
2001-10-08 23:21:18 +00:00
|
|
|
Py_DECREF(add_value);
|
2000-12-13 12:10:48 +00:00
|
|
|
PyObject * remove_value = (PyObject *)PyObject_NEW(FunctionObject, &dictlist_remove_value_type);
|
|
|
|
|
PyObject_SetAttrString(dictlist, "remove_value", remove_value);
|
2001-10-08 23:21:18 +00:00
|
|
|
Py_DECREF(remove_value);
|
2000-12-13 12:10:48 +00:00
|
|
|
PyDict_SetItemString(dict, "dictlist", dictlist);
|
2001-10-08 23:21:18 +00:00
|
|
|
Py_DECREF(dictlist);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void shutdown_python_api()
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
Py_Finalize();
|
2000-11-14 15:52:10 +00:00
|
|
|
}
|