//===========================================================================// // File: entity.hpp // // Project: MUNGA Brick: Entity Manager // // Contents: Interface specification for entity class // //---------------------------------------------------------------------------// // Date Who Modification // // -------- --- ---------------------------------------------------------- // // 11/29/94 JMA Initial coding. // //---------------------------------------------------------------------------// // Copyright (C) 1994-1995, Virtual World Entertainment, Inc. // // All Rights reserved worldwide // // This unpublished sourcecode is PROPRIETARY and CONFIDENTIAL // //===========================================================================// #if !defined(ENTITY_HPP) # define ENTITY_HPP # if !defined(SIMULATE_HPP) # include # endif # if !defined(ORIGIN_HPP) # include # endif # if !defined(LINMTRX_HPP) # include # endif class Player; class NotationFile; class DamageZone; class Damage; class Subsystem; # define ENTITY_CONTINUATION # include //########################################################################## //########################### Entity ################################# //########################################################################## class Entity: public Simulation { friend class Entity__StaticVideoSocketIterator; friend class Entity__DynamicVideoSocketIterator; friend class Entity__AudioSocketIterator; friend class Entity__GaugeSocketIterator; friend class Entity__AudioLocationIterator; //########################################################################## // Shared Data support // public: typedef Entity__SharedData SharedData; SharedData* GetSharedData(); static Derivation ClassDerivations; static SharedData DefaultData; //########################################################################## // Message Support // public: enum { MakeMessageID = Simulation::NextMessageID, MakeReadyMessageID, RemakeEntityMessageID, RemakeReadyMessageID, RemakeCompleteMessageID, RemakeIncompleteMessageID, DestroyEntityMessageID, TransferEntityMessageID, TransferCompleteMessageID, TransferIncompleteMessageID, BecomeInterestingMessageID, BecomeUninterestingMessageID, UpdateMessageID, SubscribeReplicantMessageID, UnsubscribeReplicantMessageID, TakeDamageMessageID, TakeDamageStreamMessageID, PlayerLinkMessageID, NextMessageID }; typedef Entity__Message Message; typedef Entity__MakeMessage MakeMessage; typedef Entity__MakeReadyMessage MakeReadyMessage; typedef Entity__RemakeEntityMessage RemakeEntityMessage; typedef Entity__RemakeReadyMessage RemakeReadyMessage; typedef Entity__RemakeCompleteMessage RemakeCompleteMessage; typedef Entity__RemakeIncompleteMessage RemakeIncompleteMessage; typedef Entity__DestroyEntityMessage DestroyEntityMessage; typedef Entity__TransferEntityMessage TransferEntityMessage; typedef Entity__TransferCompleteMessage TransferCompleteMessage; typedef Entity__TransferIncompleteMessage TransferIncompleteMessage; typedef Entity__BecomeInterestingMessage BecomeInterestingMessage; typedef Entity__BecomeUninterestingMessage BecomeUninterestingMessage; typedef Entity__UpdateMessage UpdateMessage; typedef Entity__SubscribeReplicantMessage SubscribeReplicantMessage; typedef Entity__UnsubscribeReplicantMessage UnsubscribeReplicantMessage; typedef Entity__TakeDamageMessage TakeDamageMessage; typedef Entity__TakeDamageStreamMessage TakeDamageStreamMessage; typedef Entity__PlayerLinkMessage PlayerLinkMessage; typedef Entity__DynamicMessage DynamicMessage; typedef Entity__MakeMapMessage MakeMapMessage; void Receive(Event *event); void LocalDispatch(Message *what) {Receiver::Receive(Cast_Object(Receiver::Message*,what));} void Dispatch(Receiver::Message *what); void DispatchToReplicant( Message *what, HostID host ); void DispatchToReplicants(Message *what); private: static const HandlerEntry MessageHandlerEntries[]; protected: static MessageHandlerSet MessageHandlers; //########################################################################## // Attribute Support // public: enum { LocalToWorldAttributeID = Simulation::NextAttributeID, LocalOriginAttributeID, DamageZoneCountAttributeID, DamageZonesAttributeID, NextAttributeID }; private: static const IndexEntry AttributePointers[]; protected: static AttributeIndexSet AttributeIndex; // // public attribute declarations go here // public: LinearMatrix localToWorld; Origin localOrigin; int damageZoneCount; DamageZone **damageZones; int GetDamageZoneIndex(const CString &damage_zone_name) const; // // virtual access // public: virtual Vector3D GetWorldLinearVelocity() {return Vector3D(0.0f, 0.0f, 0.0f);} virtual Vector3D GetWorldLinearAcceleration() {return Vector3D(0.0f, 0.0f, 0.0f);} //########################################################################## // Model Support // public: UpdateMessage* Execute(const Time &till); Subsystem* GetSubsystem(int index) { Check(this); Verify((unsigned)index < subsystemCount); return subsystemArray[index]; } Simulation* GetSimulation(int index); int GetSubsystemCount() {Check(this); return subsystemCount;} Subsystem* FindSubsystem(const char* name); typedef void (Entity::*Performance)(Scalar time_slice); typedef Entity__UpdateRecord UpdateRecord; void SetPerformance(Performance performance) { Check(this); activePerformance = (Simulation::Performance)performance; } enum { EntitySubsystemID = -1 }; static int FindSubsytemID( const char *model_name, const char *subsystem_name ); public: enum { DamageZoneUpdateModelBit = Simulation::NextUpdateModelBit, NextUpdateModelBit }; enum { DamageZoneUpdateModelFlag = 1 << DamageZoneUpdateModelBit }; Logical DamageZoneUpdateModelFlagSet() {Check(this); return (updateModel & DamageZoneUpdateModelFlag); } protected: void WriteUpdateRecord( Simulation::UpdateRecord *message, int update_model ); void UpdateMessageHandler(UpdateMessage *message); void ReadUpdateRecord(Simulation::UpdateRecord *message); void ReadDamageUpdateRecord(Simulation::UpdateRecord *update_record); void WriteDamageUpdateRecord(Simulation::UpdateRecord *update_record); void PerformAndWatch( const Time &till, MemoryStream *update_stream ); int subsystemCount; Subsystem **subsystemArray; Origin updateOrigin; void TakeDamageStreamMessageHandler(TakeDamageStreamMessage *message); void TakeDamageMessageHandler(TakeDamageMessage *message); void PlayerLinkMessageHandler(PlayerLinkMessage *message); //########################################################################## // Renderer Support // public: void AddStaticVideoComponent(Component *component); void AddDynamicVideoComponent(Component *component); void AddAudioComponent(Component *component); typedef Entity__StaticVideoSocketIterator StaticVideoSocketIterator; typedef Entity__DynamicVideoSocketIterator DynamicVideoSocketIterator; typedef Entity__AudioSocketIterator AudioSocketIterator; virtual Enumeration GetAudioRepresentation(Entity *linked_entity); private: SChainOf staticVideoSocket; SChainOf dynamicVideoSocket; SChainOf audioSocket; //########################################################################## // Flag Support // public: // // MasterInstance - created on owning host, replicated on remote hosts, // sends updates to replicants // ReplicantInstance - created on remote hosts, receives updates from // MasterInstance // IndependantInstance - created on owning host, replicated on remote // hosts, never receives updates from MasterInstance // HermitInstance - created on owning host, is not replicated, does // send updates // enum { InstanceBits = Simulation::NextBit, ValidBit = InstanceBits+2, TransferableBit, InterestBit, InterestLockedBit, DynamicBit, TrappedBit, StatueBit, MapBit, PreRunBit, CondemnedBit, NextBit }; enum Instance { MasterInstance=0, ReplicantInstance=1<entityID = entityID; message->interestZoneID = interestZoneID; message->ownerID = ownerID; } # include # undef ENTITY_CONTINUATION #endif