There's no reason to use the hacked in "contains" feature for creating
inventory. Instead we can rely on the Archtype features. Any entity
declaration for which we also want inventory created should use an
archetype.
The change is that the "contains" and "character_types" attributes are
removed. Instead there's a "entities" attribute, which is a map. The
keys are the names of the entities as seen to the client, and the values
are the entity specifications.
The "respawning" property makes an entity respawn instead of being
deleted. It intercepts the Delete op and instead of deleting the entity
it moves it to the specified spawn point.
A typical use case of this is to place the property on any user
controlled entity, thus making sure that it's never deleted and istead
respawned when killed or defeated.
An archetype is used for creating new entities. It contains one or many
definitions for entities, along with relationship between them. It also
contains any extra data needed for a world simultion, such as thoughts
and knowledge.
Archetypes should be seen as blueprints for entity types, as they
describe how new one should be composed. They are created just as
regular entities, using the existing Create op functionality.
As an example, there should be one "human" entity type, with archetypes
such as "settler", "merchant", "soldier" etc. This differs from the
current setup where each of these are separate entity types.
While in suspended state all "Tick" ops will be placed in a special queue
and not delivered until the world is resumed.
This is of most use for world authors who want to edit the world and
not worry about entities being altered.
All IG code should use the interface of LocatedEntity when dealing
with any entity, rather than sometimes requiring Entity. Add virtual
functions to the interface where required, and modify all other interfaces
to stop them using Entity. This makes the code way cleaner, and much better
de-coupled.
* data/basic.xml, data/characters.xml, data/mason.xml: Add tick
properties to a bunch of entity classes so they no longer need
a setup operation to get them going.
* rulesets/mason/world/objects/Weather.py,
rulesets/mason/world/objects/elements/Fire.py,
rulesets/mason/world/objects/plants/seeds/Apple.py: Remove setup
handlers from a bunch of scripts as it is now handled by
properties.
* data/buildings.xml: Add setup property to entity classes which
really need a setup op at startup.
* client/BaseClient.cpp: Send a look when creating the avatar, so
that notifications get back without the need for a special case.
* common/op_switch.h, rulesets/Creator.cpp, rulesets/Entity.cpp,
rulesets/Entity.h, server/WorldRouter.cpp:
Remove the setup operation sent to all entities on startup by
default. Get rid of some special cases that depended on it.
* rulesets/InternalProperties.cpp, rulesets/InternalProperties.h:
Make the tick property schedule the operation on apply(), and
use the property value as the time to schedule it.
* common/Monitors.cpp, common/Monitors.h: Add dynamic variable
monitor functionality, allowing arbitrary variables to appear
in the monitors output.
* server/ServerRouting.cpp: Use the new monitor functionality for
variables prebviously pushed to monitors once.
* server/WorldRouter.cpp, server/WorldRouter.h: Add a count of
in-game entities. Expose it to the monitors.
* common/Monitors.cpp, common/Monitors.h: Add a new class to handle
storing key value pairs useful in monitoring the state of a server.
* server/HttpCache.cpp, server/HttpCache.h: Add a function argument
to allow the content type to be controlled in the header.
Expose the Monitors class under /monitors URL.
* common/BaseWorld.h: Modify the addEntity() function so we no longer
need to specify whether it needs to be set up, as nowhere was ever
specifying.
* server/WorldRouter.cpp, server/WorldRouter.h: Implement the modified
BaseWorld API, and ensure all entities are sent Setup operations
for now.
* tests/TestWorld.h: Update test world so it implements the interface
correctly.
* rulesets/LocatedEntity.h: Add onUpdated() virtual method to be
called when the attributes of an Entity are changed.
* rulesets/Entity.cpp, rulesets/Entity.h, rulesets/LocatedEntity.cpp,
rulesets/Thing.cpp, server/WorldRouter.cpp: Implement onUpdated()
to emit the updated signal on Entity, and change all code to
call onUpdated instead of emiting the signal.
* rulesets/LocatedEntity.cpp, rulesets/LocatedEntity.h:
Don't allocated storage for m_contains by default, only
on demand. Add a convenience method which checks, and
allocates the storage if required. Set up the ID property
on this base class rather then Entity.
* rulesets/Py_Thing.cpp: Remove special handling of ID attribute
as it is now handled by the property.
* rulesets/Character.cpp, rulesets/Entity.cpp, rulesets/MemMap.cpp,
rulesets/Motion.cpp, rulesets/Py_Mind.cpp, rulesets/Py_Thing.cpp,
rulesets/Thing.cpp, rulesets/World.cpp, server/WorldRouter.cpp:
Make sure all parts of the code where contains is used have
the right checks, as it could be null.
* rulesets/Character.cpp, rulesets/Entity.cpp,
rulesets/LocatedEntity.cpp, rulesets/LocatedEntity.h,
rulesets/MemMap.cpp, rulesets/Motion.cpp, rulesets/Py_Mind.cpp,
rulesets/Py_Thing.cpp, rulesets/Thing.cpp, rulesets/World.cpp,
server/WorldRouter.cpp: Change LocatedEntity::m_contains into
a pointer so that the majority of entities that can not contain
anything don't waste the storage.
* common/TypeNode.h, common/TypeNode.cpp: Move TypeNode into
its own files.
* common/Makefile.am, common/inheritance.cpp, common/inheritance.h:
Add the new files to the build and remove the old implementation.
* client/Py_CreatorClient.cpp, rulesets/Character.cpp,
rulesets/Entity.cpp, rulesets/MemMap.cpp,
rulesets/MindFactory.cpp, rulesets/Py_Mind.cpp,
rulesets/Py_Thing.cpp, rulesets/Stackable.cpp,
server/WorldRouter.cpp: Fix up the includes for all code that
uses TypeNode.