00001
#ifndef ERIS_WORLD_H
00002
#define ERIS_WORLD_H
00003
00004
#include <Eris/Types.h>
00005
00006
#include <sigc++/object.h>
00007
#include <sigc++/signal.h>
00008
00009
#include <map>
00010
00011
00012
#if defined(__GNUC__) && __GNUC__ < 3
00013
# include <multimap.h>
00014
#endif
00015
00016
namespace Atlas {
00017
namespace Objects {
00018
namespace Entity {
00019
class RootEntity;
00020
class GameEntity;
00021 }
00022
00023
namespace Operation {
00024
class Move;
00025
class Set;
00026
class Sound;
00027
class Talk;
00028
class Look;
00029
class Appearance;
00030
class Disappearance;
00031
class Info;
00032
class Delete;
00033
class Create;
00034
class Sight;
00035 }
00036 }
00037 }
00038
00039
namespace Eris {
00040
00041
00042
class Connection;
00043
class Player;
00044
class Factory;
00045
class InvisibleEntityCache;
00046
class Avatar;
00047
class Entity;
00048
00049
00050
typedef std::map<std::string, Entity*> EntityIDMap;
00051
00053 class World :
virtual public SigC::Object
00054 {
00055
public:
00056
00057
World(
Player *p,
Connection *c);
00058 ~
World();
00059
00061
EntityPtr lookup(
const std::string &
id);
00062
00064
EntityPtr getRootEntity();
00065
00067 Connection*
getConnection()
const
00068
{
return _con; }
00069
00071
Player* getPlayer()
const
00072
{
return _player; }
00073
00078
void tick();
00079
00080
00082
void setFocusedEntity(EntityPtr f);
00085 EntityPtr getFocusedEntity()
00086 {
return _focused; }
00087
00090
const std::string&
getFocusedEntityID();
00091
00092
const std::string& getDispatcherID()
const {
return _igID;}
00093
00094
00097
00098
00099
void registerFactory(Factory *f,
unsigned int priority = 1);
00100
00102
void unregisterFactory(Factory *f);
00103
00105 Avatar* createAvatar(
long refno,
const std::string&
id =
"");
00107 Avatar*
getPrimaryAvatar() {
return _avatar;}
00108
00110 static World*
getPrimary() {
return _theWorld;}
00112 static World*
Instance() {
return _theWorld;}
00113
00114
00116
00118 SigC::Signal1<void, Entity*>
EntityCreate;
00119
00121
00123 SigC::Signal1<void, Entity*>
EntityDelete;
00124
00126 SigC::Signal0<void>
CharacterSuccess;
00127
00129 SigC::Signal1<void, Entity*>
Entered;
00130
00132 SigC::Signal1<void, Entity*>
Appearance;
00133
00135 SigC::Signal1<void, Entity*>
Disappearance;
00136
00141 SigC::Signal1<void, Entity*>
RootEntityChanged;
00142
00143
00144
00147 SigC::Signal0<void>
Destroyed;
00148
00151 SigC::Signal1<void, double>
GotTime;
00152
00153
protected:
00154
friend class Entity;
00155
friend class Avatar;
00156
00157
00158
friend class InvisibleEntityCache;
00159
00160
void look(
const std::string &
id);
00161
EntityPtr create(
const Atlas::Objects::Entity::GameEntity &ge);
00162
00163
bool isPendingInitialSight(
const std::string &
id)
00164 {
return _pendingInitialSight.count(
id); }
00165
00166
void registerCallbacks();
00167
00168
void setRootEntity(
Entity* root);
00169
00174
void markInvisible(
Entity *e);
00175
00178
void markVisible(
Entity *e);
00179
00181
void flush(
Entity *e);
00182
00183
void recvInfoCharacter(
const Atlas::Objects::Operation::Info &ifo,
00184
const Atlas::Objects::Entity::GameEntity &character);
00185
void recvAppear(
const Atlas::Objects::Operation::Appearance &ap);
00186
void recvDisappear(
const Atlas::Objects::Operation::Disappearance &ds);
00187
00188
00189
void recvSightObject(
const Atlas::Objects::Operation::Sight &sight,
00190
const Atlas::Objects::Entity::GameEntity &ent);
00191
00192
void recvSightCreate(
const Atlas::Objects::Operation::Sight& sight,
00193
const Atlas::Objects::Operation::Create &cr,
00194
const Atlas::Objects::Entity::GameEntity &ent);
00195
00196
void recvSightDelete(
const Atlas::Objects::Operation::Delete &del);
00197
void recvSightSet(
const Atlas::Objects::Operation::Sight &sight,
00198
const Atlas::Objects::Operation::Set &set);
00199
void recvSightMove(
const Atlas::Objects::Operation::Sight &sight,
00200
const Atlas::Objects::Operation::Move &mv);
00201
00202
00203
void recvSoundTalk(
const Atlas::Objects::Operation::Sound &snd,
00204
const Atlas::Objects::Operation::Talk &tk);
00205
00206
00207
void recvErrorLook(
const Atlas::Objects::Operation::Look &lk);
00208
00209
void lookupTimeout(std::string
id);
00210
00212
void netConnect();
00213
00215 std::string
_characterID;
00217
00220 std::string
_igID;
00221 Connection*
_con;
00222 Player*
_player;
00223 bool _initialEntry;
00224
00225 EntityIDMap
_lookup;
00226
EntityPtr _root,
00227 _focused;
00228
00229
00230
typedef std::multimap<unsigned int, Factory*> FactoryMap;
00231
00233 FactoryMap
_efactories;
00234
00236 StringSet
_pendingInitialSight;
00237
00239 InvisibleEntityCache*
_ieCache;
00240
00242 Avatar*
_avatar;
00243
00245
static World*
_theWorld;
00246 };
00247
00248 }
00249
#endif