///////////////////////////////////////////////////////////////////////////// // // TMemberSnapshotValue // ///////////////////////////////////////////////////////////////////////////// template class TMemberSnapshotValue : public TStaticValue, public EventTargetContainer > { private: typedef StaticType (ObjectClass::*PFNMember)(); TRef m_pobject; PFNMember m_pfn; public: TMemberSnapshotValue(ObjectClass* pobject, PFNMember pfn, IEventSource* peventSource, const StaticType& value) : TStaticValue(value), m_pobject(pobject), m_pfn(pfn) { ZAssert(pobject != NULL); ZAssert(pfn != NULL); AddEventTarget(OnEvent, peventSource); } bool OnEvent() { StaticType value = (m_pobject->*m_pfn)(); if (GetValueInternal() != value) { GetValueInternal() = value; Changed(); } return true; } }; ///////////////////////////////////////////////////////////////////////////// // // TMemberSnapshotValueFactory // ///////////////////////////////////////////////////////////////////////////// template class TMemberSnapshotValueFactory : public IFunction { private: typedef StaticType (ObjectClass::*PFNMember)(); typedef TMemberSnapshotValue MemberSnapshotValue; PFNMember m_pfn; StaticType m_value; public: TMemberSnapshotValueFactory(PFNMember pfn, const StaticType& value) : m_pfn(pfn), m_value(value) { } TRef Apply(ObjectStack& stack) { TRef pobject; CastTo(pobject, (IObject*)stack.Pop()); TRef peventSource; CastTo(peventSource, (IObject*)stack.Pop()); return (TStaticValue*) new MemberSnapshotValue(pobject, m_pfn, peventSource, m_value); } }; ///////////////////////////////////////////////////////////////////////////// // // ModelWrapper // ///////////////////////////////////////////////////////////////////////////// class ModelWrapper : public TrekClientEventSink { protected: TRef m_pmodel; TRef m_peventSourceOnChange; public: ModelWrapper() : m_peventSourceOnChange(new EventSourceImpl()) { } ModelWrapper(ImodelIGC* pmodel) : m_pmodel(pmodel), m_peventSourceOnChange(new EventSourceImpl()) { } ImodelIGC* GetModel() { return m_pmodel; } void SetModel(ImodelIGC* pmodel) { if (m_pmodel == pmodel) return; m_pmodel = pmodel; m_peventSourceOnChange->Trigger(); } void OnModelTerminated(ImodelIGC* pmodel) { if (pmodel == m_pmodel) SetModel(NULL); } void OnTechTreeChanged(SideID sid) { if (m_pmodel && m_pmodel->GetSide() && m_pmodel->GetSide()->GetObjectID() == sid && m_pmodel->GetObjectType() == OT_station) { // this might have been a station upgrade which effected my model m_peventSourceOnChange->Trigger(); } } IEventSource* GetOnChangeEventSource() { return m_peventSourceOnChange; } }; ///////////////////////////////////////////////////////////////////////////// // // ModelData // ///////////////////////////////////////////////////////////////////////////// class ModelData : public ModelWrapper { private: IshipIGC* GetShip() { ZAssert(GetModelTypeInternal() == OT_ship); return ((IshipIGC*)(ImodelIGC*)m_pmodel)->GetSourceShip(); } IstationIGC* GetStation() { ZAssert(GetModelTypeInternal() == OT_station); return (IstationIGC*)(ImodelIGC*)m_pmodel; } IasteroidIGC* GetAsteroid() { ZAssert(GetModelTypeInternal() == OT_asteroid); return (IasteroidIGC*)(ImodelIGC*)m_pmodel; } IprobeIGC* GetProbe() { ZAssert(GetModelTypeInternal() == OT_probe); return (IprobeIGC*)(ImodelIGC*)m_pmodel; } ObjectType GetModelTypeInternal(); public: ModelData(){}; ModelData(ImodelIGC* pmodel) : ModelWrapper(pmodel) {}; ImodelIGC* GetModel(); float GetModelType(); ZString GetModelTypeDesc(); TRef GetModelTypeIcon(); ZString GetName(); ZString GetSectorName(); ZString GetSideName(); Color GetSideColor(); TRef GetSideIcon(); float GetSpeed(); float GetMass(); float GetRange(); float GetPercentHitPoints(); float GetPercentShields(); float GetPercentEnergy(); float GetAmmo(); float GetFuel(); float GetOre(); float GetVectorLock(); float GetCloaking(); float GetSignature(); float GetNumObservers(); float GetRipcordTimeLeft(); float GetEndurance(); float IsCloaked(); float IsEjectPod(); float IsRipcording(); bool IsVisible(); bool IsNotNull(); static void ExportAccessors(INameSpace* pns) { pns->AddMember("GetModelType", new TMemberSnapshotValueFactory(GetModelType, (float)OT_invalid)); pns->AddMember("GetModelTypeDesc", new TMemberSnapshotValueFactory(GetModelTypeDesc, "")); // pns->AddMember("GetModelTypeIcon", new TMemberSnapshotValueFactory >(GetModelTypeIcon)); pns->AddMember("GetName", new TMemberSnapshotValueFactory(GetName, "")); pns->AddMember("GetSectorName", new TMemberSnapshotValueFactory(GetSectorName, "")); pns->AddMember("GetSideName", new TMemberSnapshotValueFactory(GetSideName, "")); pns->AddMember("GetSideColor", new TMemberSnapshotValueFactory(GetSideColor, Color(255,255,255))); // pns->AddMember("GetSideIcon", new TMemberSnapshotValueFactory >(GetSideIcon)); pns->AddMember("GetSpeed", new TMemberSnapshotValueFactory(GetSpeed, 0.0f)); pns->AddMember("GetMass", new TMemberSnapshotValueFactory(GetMass, 0.0f)); pns->AddMember("GetRange", new TMemberSnapshotValueFactory(GetRange, 0.0f)); pns->AddMember("GetPercentHitPoints", new TMemberSnapshotValueFactory(GetPercentHitPoints, 0.0f)); pns->AddMember("GetPercentShields", new TMemberSnapshotValueFactory(GetPercentShields, 0.0f)); pns->AddMember("GetPercentEnergy", new TMemberSnapshotValueFactory(GetPercentEnergy, 0.0f)); pns->AddMember("GetAmmo", new TMemberSnapshotValueFactory(GetAmmo, 0.0f)); pns->AddMember("GetFuel", new TMemberSnapshotValueFactory(GetFuel, 0.0f)); pns->AddMember("GetOre", new TMemberSnapshotValueFactory(GetOre, 0.0f)); pns->AddMember("GetVectorLock", new TMemberSnapshotValueFactory(GetVectorLock, 0.0f)); pns->AddMember("GetCloaking", new TMemberSnapshotValueFactory(GetCloaking, 0.0f)); pns->AddMember("GetNumObservers", new TMemberSnapshotValueFactory(GetNumObservers, 0.0f)); pns->AddMember("GetSignature", new TMemberSnapshotValueFactory(GetSignature, 0.0f)); pns->AddMember("GetRipcordTimeLeft", new TMemberSnapshotValueFactory(GetRipcordTimeLeft, 0.0f)); pns->AddMember("GetEndurance", new TMemberSnapshotValueFactory(GetEndurance, 1.0f)); pns->AddMember("IsCloaked", new TMemberSnapshotValueFactory(IsCloaked, 0.0f)); pns->AddMember("IsEjectPod", new TMemberSnapshotValueFactory(IsEjectPod, 0.0f)); pns->AddMember("IsRipcording", new TMemberSnapshotValueFactory(IsRipcording, 0.0f)); pns->AddMember("IsVisible", new TMemberSnapshotValueFactory(IsVisible, false)); pns->AddMember("IsNotNull", new TMemberSnapshotValueFactory(IsNotNull, false)); } }; ///////////////////////////////////////////////////////////////////////////// // // PartWrapper // ///////////////////////////////////////////////////////////////////////////// class PartWrapper : public IObject { protected: TRef m_ppart; TRef m_peventSourceOnChange; private: public: PartWrapper() : m_peventSourceOnChange(new EventSourceImpl()) { } PartWrapper(IpartIGC* ppart) : m_ppart(ppart), m_peventSourceOnChange(new EventSourceImpl()) { } IpartIGC* GetPart() { return m_ppart; } void SetPart(IpartIGC* ppart) { if (m_ppart == ppart) return; m_ppart = ppart; m_peventSourceOnChange->Trigger(); } IEventSource* GetOnChangeEventSource() { return m_peventSourceOnChange; } ZString GetPartName(); float GetCount(); float GetRange(); float GetDamage(); float GetRate(); float GetAfterburnerFuelConsumption(); float GetAfterburnerFuelLeft(); float GetAfterburnerTopSpeed(); float GetAfterburnerTimeLeft(); float GetMaxShieldStrength(); float GetShieldStrength(); float GetRegenRate(); float GetRechargeTime(); float GetCloakTimeLeft(); float IsEnergyDamage(); float IsShipKiller(); float IsStationKiller(); float IsAsteroidKiller(); float IsSelected(); float IsActive(); float IsOutOfAmmo(); float GetReadyState(); float GetMountedFraction(); float GetArmedFraction(); static void ExportAccessors(INameSpace* pns) { pns->AddMember("GetPartName", new TMemberSnapshotValueFactory(GetPartName, "")); pns->AddMember("GetCount", new TMemberSnapshotValueFactory(GetCount, 1.0f)); pns->AddMember("GetWeaponRange", new TMemberSnapshotValueFactory(GetRange, 0.0f)); pns->AddMember("GetDamage", new TMemberSnapshotValueFactory(GetDamage, 0.0f)); pns->AddMember("GetRate", new TMemberSnapshotValueFactory(GetRate, 0.0f)); pns->AddMember("GetAfterburnerFuelConsumption", new TMemberSnapshotValueFactory(GetAfterburnerFuelConsumption, 0.0f)); pns->AddMember("GetAfterburnerFuelLeft", new TMemberSnapshotValueFactory(GetAfterburnerFuelLeft, 0.0f)); pns->AddMember("GetAfterburnerTopSpeed", new TMemberSnapshotValueFactory(GetAfterburnerTopSpeed, 0.0f)); pns->AddMember("GetAfterburnerTimeLeft", new TMemberSnapshotValueFactory(GetAfterburnerTimeLeft, 0.0f)); pns->AddMember("GetMaxShieldStrength", new TMemberSnapshotValueFactory(GetMaxShieldStrength, 0.0f)); pns->AddMember("GetShieldStrength", new TMemberSnapshotValueFactory(GetShieldStrength, 0.0f)); pns->AddMember("GetRegenRate", new TMemberSnapshotValueFactory(GetRegenRate, 0.0f)); pns->AddMember("GetRechargeTime", new TMemberSnapshotValueFactory(GetRechargeTime, 0.0f)); pns->AddMember("GetCloakTimeLeft", new TMemberSnapshotValueFactory(GetCloakTimeLeft, 0.0f)); pns->AddMember("IsEnergyDamage", new TMemberSnapshotValueFactory(IsEnergyDamage, 0.0f)); pns->AddMember("IsSelected", new TMemberSnapshotValueFactory(IsSelected, 0.0f)); pns->AddMember("IsShipKiller", new TMemberSnapshotValueFactory(IsShipKiller, 0.0f)); pns->AddMember("IsStationKiller", new TMemberSnapshotValueFactory(IsStationKiller, 0.0f)); pns->AddMember("IsAsteroidKiller", new TMemberSnapshotValueFactory(IsAsteroidKiller, 0.0f)); pns->AddMember("IsActive", new TMemberSnapshotValueFactory(IsActive, 0.0f)); pns->AddMember("IsOutOfAmmo", new TMemberSnapshotValueFactory(IsOutOfAmmo, 0.0f)); pns->AddMember("GetReadyState", new TMemberSnapshotValueFactory(GetReadyState, 0.0f)); pns->AddMember("GetMountedFraction", new TMemberSnapshotValueFactory(GetMountedFraction, 0.0f)); pns->AddMember("GetArmedFraction", new TMemberSnapshotValueFactory(GetArmedFraction, 0.0f)); } };