summaryrefslogtreecommitdiffstats
path: root/libkdegames/kgame/kgameproperty.h
diff options
context:
space:
mode:
authorTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-11-06 15:56:37 -0600
committerTimothy Pearson <kb9vqf@pearsoncomputing.net>2011-11-06 15:56:37 -0600
commit14c49c4f56792a934bcdc4efceebbd429d858571 (patch)
tree2f302410d5a5d678bf3ff10edead70d348be6644 /libkdegames/kgame/kgameproperty.h
parentab0981b9689e4d3ad88e9572bfa4b4a5e36c51ae (diff)
downloadtdegames-14c49c4f56792a934bcdc4efceebbd429d858571.tar.gz
tdegames-14c49c4f56792a934bcdc4efceebbd429d858571.zip
Actually move the kde files that were renamed in the last commit
Diffstat (limited to 'libkdegames/kgame/kgameproperty.h')
-rw-r--r--libkdegames/kgame/kgameproperty.h848
1 files changed, 0 insertions, 848 deletions
diff --git a/libkdegames/kgame/kgameproperty.h b/libkdegames/kgame/kgameproperty.h
deleted file mode 100644
index f02c4db0..00000000
--- a/libkdegames/kgame/kgameproperty.h
+++ /dev/null
@@ -1,848 +0,0 @@
-/*
- This file is part of the KDE games library
- Copyright (C) 2001 Andreas Beckermann (b_mann@gmx.de)
- Copyright (C) 2001 Martin Heni (martin@heni-online.de)
-
- This library is free software; you can redistribute it and/or
- modify it under the terms of the GNU Library General Public
- License version 2 as published by the Free Software Foundation.
-
- This library is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
- Library General Public License for more details.
-
- You should have received a copy of the GNU Library General Public License
- along with this library; see the file COPYING.LIB. If not, write to
- the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
- Boston, MA 02110-1301, USA.
-*/
-
-#ifndef __KGAMEPROPERTY_H_
-#define __KGAMEPROPERTY_H_
-
-#include <tqdatastream.h>
-
-#include <kdebug.h>
-#include <typeinfo>
-#include <kdemacros.h>
-class KGame;
-class KPlayer;
-class KGamePropertyHandler;
-using namespace std;
-
-/**
- * @short Base class of KGameProperty
- *
- * The KGamePropertyBase class is the base class of KGameProperty. See
- * KGameProperty for further information.
- *
- * @author Andreas Beckermann <b_mann@gmx.de>
- **/
-class KDE_EXPORT KGamePropertyBase
-{
-public:
- enum PropertyDataIds { // these belong to KPlayer/KGame!
- //KPlayer
- IdGroup=1,
- IdUserId=2,
- IdAsyncInput=3,
- IdTurn=4,
- IdName=5,
-
- //KGame
- IdGametqStatus=6,
- IdMaxPlayer=7,
- IdMinPlayer=8,
-
- // Input Grabbing
- IdGrabInput=16,
- IdReleaseInput=17,
-
- IdCommand, // Reserved for internal use
- IdUser=256,
-
- IdAutomatic=0x7000 // Id's from here on are automatically given (16bit)
- };
-
- /**
- * Commands for advanced properties (TQ_INT8)
- **/
- enum PropertyCommandIds
- {
- // General
- CmdLock=1,
-
- // Array
- CmdAt=51,
- CmdResize=52,
- CmdFill=53,
- CmdSort=54,
- // List (could be the same id's actually)
- CmdInsert=61,
- CmdAppend=62,
- CmdRemove=63,
- CmdClear=64
- };
-
- /**
- * The policy of the property. This can be PolicyClean (setValue uses
- * send), PolicyDirty (setValue uses changeValue) or
- * PolicyLocal (setValue uses setLocal).
- *
- * A "clean" policy means that the property is always the same on every
- * client. This is achieved by calling send which actually changes
- * the value only when the message from the MessageServer is received.
- *
- * A "dirty" policy means that as soon as setValue is called the
- * property is changed immediately. And additionally sent over network.
- * This can sometimes lead to bugs as the other clients do not
- * immediately have the same value. For more information see
- * changeValue.
- *
- * PolicyLocal means that a KGameProperty behaves like ever
- * "normal" variable. Whenever setValue is called (e.g. using "=")
- * the value of the property is changes immediately without sending it
- * over network. You might want to use this if you are sure that all
- * clients set the property at the same time.
- **/
- enum PropertyPolicy
- {
- PolicyUndefined = 0,
- PolicyClean = 1,
- PolicyDirty = 2,
- PolicyLocal = 3
- };
-
-
- /**
- * Constructs a KGamePropertyBase object and calls registerData.
- * @param id The id of this property. MUST be UNITQUE! Used to send and
- * receive changes in the property of the playere automatically via
- * network.
- * @param owner The owner of the object. Must be a KGamePropertyHandler which manages
- * the changes made to this object, i.e. which will send the new data
- **/
- KGamePropertyBase(int id, KGamePropertyHandler* owner);
-
- KGamePropertyBase(int id, KGame* parent);
- KGamePropertyBase(int id, KPlayer* parent);
-
- /**
- * Creates a KGamePropertyBase object without an owner. Remember to call
- * registerData!
- **/
- KGamePropertyBase();
-
- virtual ~KGamePropertyBase();
-
- /**
- * Changes the consistency policy of a property. The
- * PropertyPolicy is one of PolicyClean (defaulz), PolicyDirty or PolicyLocal.
- *
- * It is up to you to decide how you want to work.
- **/
- void setPolicy(PropertyPolicy p) { mFlags.bits.policy = p; }
-
- /**
- * @return The default policy of the property
- **/
- PropertyPolicy policy() const { return (PropertyPolicy)mFlags.bits.policy; }
-
- /**
- * Sets this property to emit a signal on value changed.
- * As the proerties do not inehrit TQObject for optimisation
- * this signal is emited via the KPlayer or KGame object
- **/
- void setEmittingSignal(bool p) { mFlags.bits.emitsignal=p; }
-
- /**
- * See also setEmittingSignal
- * @return Whether this property emits a signal on value change
- **/
- bool isEmittingSignal() const { return mFlags.bits.emitsignal; }
-
- /**
- * Sets this property to try to optimize signal and network handling
- * by not sending it out when the property value is not changed.
- **/
- void setOptimized(bool p) { mFlags.bits.optimize = p ; }
-
- /**
- * See also setOptimize
- * @return Whether the property optimizes access (signals,network traffic)
- **/
- bool isOptimized() const { return mFlags.bits.optimize; }
-
- /**
- * @return Whether this property is "dirty". See also setDirty
- **/
- bool isDirty() const { return mFlags.bits.dirty; }
-
- /**
- * A locked property can only be changed by the player who has set the
- * lock. See also setLocked
- * @return Whether this property is currently locked.
- **/
- bool isLocked() const { return mFlags.bits.locked; }
-
- /**
- * A locked property can only be changed by the player who has set the
- * lock.
- *
- * You can only call this if isLocked is false. A message is sent
- * over network so that the property is locked for all players except
- * you.
- *
- * @return returns false if the property can not be locked, i.e. it is already locked
- *
- **/
- bool lock();
-
- /**
- * A locked property can only be changed by the player who has set the
- * lock.
- *
- * You can only call this if isLocked is false. A message is sent
- * over network so that the property is locked for all players except
- * you.
- *
- * @return returns false if the property can not be locked, i.e. it is already locked
- *
- **/
- bool unlock(bool force=false);
-
- /**
- * This will read the value of this property from the stream. You MUST
- * overwrite this method in order to use this class
- * @param s The stream to read from
- **/
- virtual void load(TQDataStream& s) = 0;
-
- /**
- * Write the value into a stream. MUST be overwritten
- **/
- virtual void save(TQDataStream& s) = 0;
-
- /**
- * send a command to advanced properties like arrays
- * @param stream The stream containing the data of the comand
- * @param msgid The ID of the command - see PropertyCommandIds
- * @param isSender whether this client is also the sender of the command
- **/
- virtual void command(TQDataStream &stream, int msgid, bool isSender=false);
-
- /**
- * @return The id of this property
- **/
- int id() const { return mId; }
-
- /**
- * @return a type_info of the data this property contains. This is used
- * e.g. by KGameDebugDialog
- **/
- virtual const type_info* typeinfo() { return &typeid(this); }
-
- /**
- * You have to register a KGamePropertyBase before you can use it.
- *
- * You MUST call this before you can use KGamePropertyBase!
- *
- * @param id the id of this KGamePropertyBase object. The id MUST be
- * unique, i.e. you cannot have two properties with the same id for one
- * player, although (currently) nothing prevents you from doing so. But
- * you will get strange results!
- *
- * @param owner The owner of this data. This will send the data
- * using KPropertyHandler::sendProperty whenever you call send
- *
- * @param p If not 0 you can set the policy of the property here
- *
- * @param name if not 0 you can assign a name to this property
- *
- **/
- int registerData(int id, KGamePropertyHandler* owner,PropertyPolicy p, TQString name=0);
-
- /**
- * This is an overloaded member function, provided for convenience.
- * It differs from the above function only in what argument(s) it accepts.
- **/
- int registerData(int id, KGamePropertyHandler* owner, TQString name=0);
-
- /**
- * This is an overloaded member function, provided for convenience.
- * It differs from the above function only in what argument(s) it accepts.
- **/
- int registerData(int id, KGame* owner, TQString name=0);
-
- /**
- * This is an overloaded member function, provided for convenience.
- * It differs from the above function only in what argument(s) it accepts.
- **/
- int registerData(int id, KPlayer* owner, TQString name=0);
-
- /**
- * This is an overloaded member function, provided for convenience.
- * It differs from the above function only in what argument(s) it accepts.
- * In particular you can use this function to create properties which
- * will have an automatic id assigned. The new id is returned.
- **/
- int registerData(KGamePropertyHandler* owner,PropertyPolicy p=PolicyUndefined, TQString name=0);
-
- void unregisterData();
-
-
-protected:
- /**
- * A locked property can only be changed by the player who has set the
- * lock.
- *
- * You can only call this if isLocked is false. A message is sent
- * over network so that the property is locked for all players except
- * you.
- * Usually you use lock and unlock to access this property
- *
- **/
- void setLock(bool l);
-
- /**
- * Sets the "dirty" flag of the property. If a property is "dirty" i.e.
- * KGameProperty::setLocal has been called there is no guarantee
- * that all clients share the same value. You have to ensure this
- * yourself e.g. by calling KGameProperty::setLocal on every
- * client. You can also ignore the dirty flag and continue working withe
- * the property depending on your situation.
- **/
- void setDirty(bool d) { mFlags.bits.dirty = d ; }
-
- /**
- * Forward the data to the owner of this property which then sends it
- * over network. save is used to store the data into a stream so
- * you have to make sure that function is working properly if you
- * implement your own property!
- *
- * Note: this sends the <em>current</em> property!
- *
- * Might be obsolete - KGamePropertyArray still uses it. Is this a bug
- * or correct?
- **/
- bool sendProperty();
-
- /**
- * Forward the data to the owner of this property which then sends it
- * over network. save is used to store the data into a stream so
- * you have to make sure that function is working properly if you
- * implement your own property!
- *
- * This function is used by send to send the data over network.
- * This does <em>not</em> send the current value but the explicitly
- * given value.
- *
- * @return TRUE if the message could be sent successfully, otherwise
- * FALSE
- **/
- bool sendProperty(const TQByteArray& b);
-
- /**
- * Causes the parent object to emit a signal on value change
- **/
- void emitSignal();
-
-protected:
- KGamePropertyHandler* mOwner;
-
- // Having this as a union of the bitfield and the char
- // allows us to stream this quantity easily (if we need to)
- // At the moment it is not yet transmitted
- union Flags {
- char flag;
- struct {
- // unsigned char dosave : 1; // do save this property
- // unsigned char delaytransmit : 1; // do not send immediately on
- // change but a KPlayer:TQTimer
- // sends it later on - fast
- // changing variables
- unsigned char emitsignal : 1; // KPlayer notifies on variable change (true)
- //unsigned char readonly : 1; // whether the property can be changed (false)
- unsigned char optimize : 1; // whether the property tries to optimize send/emit (false)
- unsigned char dirty: 1; // whether the property dirty (setLocal() was used)
- unsigned char policy : 2; // whether the property is always consistent (see PropertyPolicy)
- unsigned char locked: 1; // whether the property is locked (true)
- } bits;
- } mFlags;
-
-private:
- friend class KGamePropertyHandler;
- void init();
-
-private:
- int mId;
-
-};
-
-/**
- * @short A class for network transparent games
- *
- * Note: The entire API documentation is obsolete!
- *
- * The class KGameProperty can store any form of data and will transmit it via
- * network whenver you call send. This makes network transparent games
- * very easy. You first have to register the data to a KGamePropertyHandler
- * using KGamePropertyBase::registerData (which is called by the
- * constructor). For the KGamePropertyHandler you can use
- * KGame::dataHandler or KPlayer::dataHandler but you can also create your
- * own data handler.
- *
- * There are several concepts you can follow when writing network games. These
- * concepts differ completely from the way how data is transferred so you should
- * decide which one to use. You can also mix these concepts for a single
- * property but we do not recommend this. The concepts:
- * <ul>
- * <li> Always Consistent (clean)
- * <li> Not Always Consistent (dirty)
- * <li> A Mixture (very dirty)
- * </ul>
- * I repeat: we do <em>not</em> recommend the third option ("a mixture"). Unless
- * you have a good reason for this you will probably introduce some hard to find
- * (and to fix) bugs.
- *
- * @section Always consistent (clean):
- *
- * This "policy" is default. Whenever you create a KGameProperty it is always
- * consistent. This means that consistency is the most important thing for the
- * property. This is achieved by using send to change the value of the
- * property. send needs a running KMessageServer and therefore
- * <em>MUST</em> be plugged into a KGamePropertyHandler using either
- * registerData or the constructor. The parent of the dataHandler must be able
- * to send messages (see above: the message server must be running). If you use
- * send to change the value of a property you won't see the effect
- * immediately: The new value is first transferred to the message server which
- * queues the message. As soon as <em>all</em> messages in the message server
- * which are before the changed property have been transferred the message
- * server delivers the new value of the KGameProperty to all clients. A
- * TQTimer::singleShot is used to queue the messages inside the
- * KMessageServer.
- *
- * This means that if you do the following:
- * \code
- * KGamePropertyInt myProperty(id, dataHandler());
- * myProperty.initData(0);
- * myProperty = 10;
- * int value = myProperty.value();
- * \endcode
- * then "value" will be "0". initData is used to initialize the property
- * (e.g. when the KMessageServer is not yet running or can not yet be
- * reached). This is because "myProperty = 10" or "myProperty.send(10)" send a
- * message to the KMessageServer which uses TQTimer::singleShot to
- * queue the message. The game first has to go back into the event loop where
- * the message is received. The KGamePropertyHandler receives the new value
- * sets the property. So if you need the new value you need to store it in a
- * different variable (see setLocal which creates one for you until the
- * message is received). The KGamePropertyHandler emits a signal (unless
- * you called setEmitSignal with false) when the new value is received:
- * KGamePropertyHandler::signalPropertyChanged. You can use this to react
- * to a changed property.
- *
- * This may look quite confusing but it has a <em>big</em> advantage: all
- * KGameProperty objects are ensured to have the same value on all clients in
- * the game at every time. This way you will save you a lot of trouble as
- * debugging can be very difficult if the value of a property changes
- * immediately on client A but only after one or two additianal messages
- * (function calls, status changes, ...) on client B.
- *
- * The only disadvantage of this (clean) concept is that you cannot use a
- * changed variable immediately but have to wait for the KMessageServer to
- * change it. You probably want to use
- * KGamePropertyHandler::signalPropertyChanged for this.
- *
- * @section Not Always Consistent (dirty):
- *
- * There are a lot of people who don't want to use the (sometimes quite complex)
- * "clean" way. You can use setAlwaysConsistent to change the default
- * behaviour of the KGameProperty. If a property is not always consistent
- * it will use changeValue to send the property. changeValue also uses
- * send to send the new value over network but it also uses
- * setLocal to create a local copy of the property. This copy is created
- * dynamically and is deleted again as soon as the next message from the network
- * is received. To use the example above again:
- * \code
- * KGamePropertyInt myProperty(id, dataHandler());
- * myProperty.setAlwaysConsistent(false);
- * myProperty.initData(0);
- * myProperty = 10;
- * int value = myProperty.value();
- * \endcode
- * Now this example will "work" so value now is 10. Additionally the
- * KMessageServer receives a message from the local client (just as explained
- * above in "Always Consistent"). As soon as the message returns to the local
- * client again the local value is deleted, as the "network value" has the same
- * value as the local one. So you won't lose the ability to use the always
- * consistent "clean" value of the property if you use the "dirty" way. Just use
- * networkValue to access the value which is consistent among all clients.
- *
- * The advantage of this concept is clear: you can use a KGameProperty as
- * every other variable as the changes value takes immediate effect.
- * Additionally you can be sure that the value is transferred to all clients.
- * You will usually not experience serious bugs just because you use the "dirty"
- * way. Several events have to happen at once to get these "strange errors"
- * which result in inconsistent properties (like "game running" on client A but
- * "game ended/paused" on client B). But note that there is a very good reason
- * for the existence of these different concepts of KGameProperty. I have
- * myself experienced such a "strange error" and it took me several days to find
- * the reason until I could fix it. So I personally recommend the "clean" way.
- * On the other hand if you want to port a non-network game to a network game
- * you will probably start with "dirty" properties as it is you will not have to
- * change that much code...
- *
- * @section A Mixture (very dirty):
- *
- * You can also mix the concepts above. Note that we really don't recommend
- * this. With a mixture I mean something like this:
- * \code
- * KGamePropertyInt myProperty(id, dataHandler());
- * myProperty.setAlwaysConsistent(false);
- * myProperty.initData(0);
- * myProperty = 10;
- * myProperty.setAlwaysConsistent(true);
- * myProperty = 20;
- * \endcode
- * (totally senseless example, btw) I.e. I am speaking of mixing both concepts
- * for a single property. Things like
- * \code
- * KGamePropertyInt myProperty1(id1, dataHandler());
- * KGamePropertyInt myProperty2(id2, dataHandler());
- * myProperty1.initData(0);
- * myProperty2.initData(0);
- * myProperty1.setAlwaysConsistent(false);
- * myProperty2.setAlwaysConsistent(true);
- * myProperty1 = 10;
- * myProperty2 = 20;
- * \endcode
- * are ok. But mixing the concepts for a single property will make it nearly
- * impossible to you to debug your game.
- *
- * So the right thing to do(tm) is to decide in the constructor whether you want
- * a "clean" or "dirty" property.
- *
- * Even if you have decided for one of the concepts you still can manually
- * follow another concept than the "policy" of your property. So if you use an
- * always consistent KGameProperty you still can manually call
- * changeValue as if it was not always consistent. Note that although this is
- * also kind of a "mixture" as described above this is very useful sometimes. In
- * contrast to the "mixture" above you don't have the problem that you don't
- * exactly know which concept you are currently following because you used the
- * function of the other concept only once.
- *
- * @section Custom classes:
- *
- * If you want to use a custum class with KGameProperty you have to implement the
- * operators << and >> for TQDataStream:
- * \code
- * class Card
- * {
- * public:
- * int type;
- * int suite;
- * };
- * TQDataStream& operator<<(TQDataStream& stream, Card& card)
- * {
- * TQ_INT16 type = card.type;
- * TQ_INT16 suite = card.suite;
- * s << type;
- * s << suite;
- * return s;
- * }
- * TQDataStream& operator>>(TQDataStream& stream, Card& card)
- * {
- * TQ_INT16 type;
- * TQ_INT16 suite;
- * s >> type;
- * s >> suite;
- * card.type = (int)type;
- * card.suite = (int)suite;
- * return s;
- * }
- *
- * class Player : KPlayer
- * {
- * [...]
- * KGameProperty<Card> mCards;
- * };
- * \endcode
- *
- * Note: unlike most QT classes KGameProperty objects are *not* deleted
- * automatically! So if you create an object using e.g. KGameProperty<int>* data =
- * new KGameProperty(id, dataHandler()) you have to put a delete data into your
- * destructor!
- *
- * @author Andreas Beckermann <b_mann@gmx.de>
- **/
-template<class type>
-class KGameProperty : public KGamePropertyBase
-{
-public:
- /**
- * Constructs a KGameProperty object. A KGameProperty object will transmit
- * any changes to the KMessageServer and then to all clients in the
- * game (including the one that has sent the new value)
- * @param id The id of this property. <em>MUST be UNITQUE</em>! Used to send and
- * receive changes in the property of the playere automatically via
- * network.
- * @param owner The parent of the object. Must be a KGame which manages
- * the changes made to this object, i.e. which will send the new data.
- * Note that in contrast to most KDE/QT classes KGameProperty objects
- * are <em>not</em> deleted automatically!
- **/
-// TODO: ID: Very ugly - better use something like parent()->propertyId() or so which assigns a free id automatically.
- KGameProperty(int id, KGamePropertyHandler* owner) : KGamePropertyBase(id, owner) { init(); }
-
- /**
- * This constructor does nothing. You have to call
- * KGamePropertyBase::registerData
- * yourself before using the KGameProperty object.
- **/
- KGameProperty() : KGamePropertyBase() { init(); }
-
- virtual ~KGameProperty() {}
-
- /**
- * Set the value depending on the current policy (see
- * setConsistent). By default KGameProperty just uses send to set
- * the value of a property. This behaviour can be changed by using
- * setConsistent.
- * @param v The new value of the property
- **/
- void setValue(type v)
- {
- switch (policy()) {
- case PolicyClean:
- send(v);
- break;
- case PolicyDirty:
- changeValue(v);
- break;
- case PolicyLocal:
- setLocal(v);
- break;
- default: // NEVER!
- kdError(11001) << "Undefined Policy in property " << id() << endl;
- return;
- }
- }
-
-
- /**
- * This function sends a new value over network.
- *
- * Note that the value DOES NOT change when you call this function. This
- * function saves the value into a TQDataStream and calls
- * sendProperty where it gets forwarded to the owner and finally the
- * value is sent over network. The KMessageServer now sends the
- * value to ALL clients - even the one who called this function. As soon
- * as the value from the message server is received load is called
- * and _then_ the value of the KGameProperty has been set.
- *
- * This ensures that a KGameProperty has _always_ the same value on
- * _every_ client in the network. Note that this means you can NOT do
- * something like
- * \code
- * myProperty.send(1);
- * doSomething(myProperty);
- * \endcode
- * as myProperty has not yet been set when doSomething is being called.
- *
- * You are informed about a value change by a singal from the parent of
- * the property which can be deactivated by setEmittingSignal because of
- * performance (you probably don't have to deactivate it - except you
- * want to write a real-time game like Command&Conquer with a lot of
- * acitvity). See emitSignal
- *
- * Note that if there is no KMessageServer accessible - before
- * the property has been registered to the KGamePropertyHandler (as
- * it is the case e.g. before a KPlayer has been plugged into the
- * KGame object) the property is *not* sent but set *locally* (see
- * setLocal)!
- *
- * @param v The new value of the property
- * @return whether the property could be sent successfully
- * @see setValue setLocal changeValue value
- **/
- bool send(type v)
- {
- if (isOptimized() && mData == v) {
- return true;
- }
- if (isLocked()) {
- return false;
- }
- TQByteArray b;
- TQDataStream stream(b, IO_WriteOnly);
- stream << v;
- if (!sendProperty(b)) {
- setLocal(v);
- return false;
- }
- return true;
- }
-
- /**
- * This function sets the value of the property directly, i.e. it
- * doesn't send it to the network.
- *
- * Int contrast to @see you change _only_ the local value when using
- * this function. You do _not_ change the value of any other client. You
- * probably don't want to use this if you are using a dedicated server
- * (which is the only "client" which is allowed to change a value) but
- * rather want to use send().
- *
- * But if you use your clients as servers (i.e. all clients receive a
- * players turn and then calculate the reaction of the game theirselves)
- * then you probably want to use setLocal as you can do things like
- * \code
- * myProperty.setLocal(1);
- * doSomething(myProperty);
- * \endcode
- * on every client.
- *
- * If you want to set the value locally AND send it over network you
- * want to call changeValue!
- *
- * You can also use setPolicy to set the default policy to
- * PolicyLocal.
- *
- * @see setValue send changeValue value
- **/
- bool setLocal(type v)
- {
- if (isOptimized() && mData == v) {
- return false;
- }
- if (isLocked()) {
- return false;
- }
- mData = v;
- setDirty(true);
- if (isEmittingSignal()) {
- emitSignal();
- }
- return true;
- }
-
- /**
- * This function does both, change the local value and change the
- * network value. The value is sent over network first, then changed
- * locally.
- *
- * This function is a convenience function and just calls send
- * followed by setLocal
- *
- * Note that emitSignal is also called twice: once after
- * setLocal and once when the value from send is received
- *
- * @see send setLocal setValue value
- **/
- void changeValue(type v)
- {
- send(v);
- setLocal(v);
- }
-
- /**
- * Saves the object to a stream.
- * @param stream The stream to save to
- **/
- virtual void save(TQDataStream &stream)
- {
- stream << mData;
- }
-
- /**
- * @return The local value (see setLocal) if it is existing,
- * otherwise the network value which is always consistent on every
- * client.
- **/
- const type& value() const
- {
- return mData;
- }
-
- /**
- * Reads from a stream and assigns the read value to this object.
- *
- * This function is called automatically when a new value is received
- * over network (i.e. it has been sent using send on this or any
- * other client) or when a game is loaded (and maybe on some other
- * events).
- *
- * Also calls emitSignal if isEmittingSignal is TRUE.
- * @param s The stream to read from
- **/
- virtual void load(TQDataStream& s)
- {
- s >> mData;
- setDirty(false);
- if (isEmittingSignal()) {
- emitSignal();
- }
- }
-
- /**
- * This calls setValue to change the value of the property. Note
- * that depending on the policy (see setAlwaysConsistent) the
- * returned value might be different from the assigned value!!
- *
- * So if you use setPolicy(PolicyClean):
- * \code
- * int a, b = 10;
- * myProperty = b;
- * a = myProperty.value();
- * \endcode
- * Here a and b would differ!
- * The value is actually set as soon as it is received from the
- * KMessageServer which forwards it to ALL clients in the network.
- *
- * If you use a clean policy (see setPolicy) then
- * the returned value is the assigned value
- **/
- const type& operator=(const type& t)
- {
- setValue(t);
- return value();
- }
-
- /**
- * This copies the data of property to the KGameProperty object.
- *
- * Equivalent to setValue(property.value());
- **/
- const type& operator=(const KGameProperty& property)
- {
- setValue(property.value());
- return value();
- }
-
- /**
- * Yeah, you can do it!
- * \code
- * int a = myGamePropertyInt;
- * \endcode
- * If you don't see it: you don't have to use integerData.value()
- **/
- operator type() const { return value(); }
-
- virtual const type_info* typeinfo() { return &typeid(type); }
-
-private:
- void init() { }
-
-private:
- type mData;
-};
-
-
-typedef KGameProperty<int> KGamePropertyInt;
-typedef KGameProperty<unsigned int> KGamePropertyUInt;
-typedef KGameProperty<TQString> KGamePropertyTQString;
-typedef KGameProperty<TQ_INT8> KGamePropertyBool;
-
-#endif