IAGCShipImpl.h 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. #ifndef __IAGCShipImpl_h__
  2. #define __IAGCShipImpl_h__
  3. /////////////////////////////////////////////////////////////////////////////
  4. // IAGCShipImpl.h : Declaration of the IAGCShipImpl class template.
  5. //
  6. #include "IAGCScannerImpl.h"
  7. #include "resource.h"
  8. #include "AGCChat.h"
  9. /////////////////////////////////////////////////////////////////////////////
  10. // Interface Map Macro
  11. //
  12. // Classes derived from IAGCShipImpl should include this macro in their
  13. // interface maps.
  14. //
  15. #define COM_INTERFACE_ENTRIES_IAGCShipImpl() \
  16. COM_INTERFACE_ENTRY(IAGCShip) \
  17. COM_INTERFACE_ENTRY(IDispatch) \
  18. COM_INTERFACE_ENTRIES_IAGCScannerImpl()
  19. /////////////////////////////////////////////////////////////////////////////
  20. // IAGCShipImpl
  21. //
  22. template <class T, class IGC, class ITF, const GUID* plibid>
  23. class ATL_NO_VTABLE IAGCShipImpl :
  24. public IAGCScannerImpl<T, IGC, ITF, plibid, IshipIGC, IAGCShip>
  25. {
  26. // Types
  27. public:
  28. typedef IAGCShipImpl<T, IGC, ITF, plibid> IAGCShipImplBase;
  29. // IAGCShip Interface Methods
  30. public:
  31. STDMETHODIMP put_Ammo(short Val)
  32. {
  33. // Property is read-only at the AGC level
  34. return AtlReportError(T::GetObjectCLSID(), IDS_E_PROP_READONLY,
  35. __uuidof(ITF), MAKE_HRESULT(1, FACILITY_ITF, IDS_E_PROP_READONLY),
  36. GetAGCGlobal()->GetResourceInstance());
  37. }
  38. STDMETHODIMP get_Ammo(short* pVal)
  39. {
  40. assert(GetIGC());
  41. CLEAROUT(pVal, GetIGC()->GetAmmo());
  42. return S_OK;
  43. }
  44. STDMETHODIMP put_Fuel(float Val)
  45. {
  46. // Property is read-only at the AGC level
  47. return AtlReportError(T::GetObjectCLSID(), IDS_E_PROP_READONLY,
  48. __uuidof(ITF), MAKE_HRESULT(1, FACILITY_ITF, IDS_E_PROP_READONLY),
  49. GetAGCGlobal()->GetResourceInstance());
  50. }
  51. STDMETHODIMP get_Fuel(float* pVal)
  52. {
  53. assert(GetIGC());
  54. CLEAROUT(pVal, GetIGC()->GetFuel());
  55. return S_OK;
  56. }
  57. STDMETHODIMP put_Energy(float Val)
  58. {
  59. // Property is read-only at the AGC level
  60. return AtlReportError(T::GetObjectCLSID(), IDS_E_PROP_READONLY,
  61. __uuidof(ITF), MAKE_HRESULT(1, FACILITY_ITF, IDS_E_PROP_READONLY),
  62. GetAGCGlobal()->GetResourceInstance());
  63. }
  64. STDMETHODIMP get_Energy(float* pVal)
  65. {
  66. assert(GetIGC());
  67. CLEAROUT(pVal, GetIGC()->GetEnergy());
  68. return S_OK;
  69. }
  70. STDMETHODIMP put_WingID(short Val)
  71. {
  72. // Property is read-only at the AGC level
  73. return AtlReportError(T::GetObjectCLSID(), IDS_E_PROP_READONLY,
  74. __uuidof(ITF), MAKE_HRESULT(1, FACILITY_ITF, IDS_E_PROP_READONLY),
  75. GetAGCGlobal()->GetResourceInstance());
  76. }
  77. STDMETHODIMP get_WingID(short* pVal)
  78. {
  79. assert(GetIGC());
  80. CLEAROUT(pVal, GetIGC()->GetWingID());
  81. return S_OK;
  82. }
  83. ///////////////////////////////////////////////////////////////////////////
  84. STDMETHODIMP SendChat(BSTR bstrText, AGCSoundID idSound)
  85. {
  86. assert(GetIGC());
  87. assert(GetIGC()->GetMission()->GetIgcSite());
  88. // Do nothing if string is empty
  89. if (!BSTRLen(bstrText))
  90. return S_FALSE;
  91. // Send the chat
  92. USES_CONVERSION;
  93. GetIGC()->GetMission()->GetIgcSite()->SendChat(NULL, CHAT_INDIVIDUAL,
  94. GetIGC()->GetObjectID(), idSound, OLE2CA(bstrText), c_cidNone, NA, NA, NULL, true);
  95. // Indicate success
  96. return S_OK;
  97. }
  98. ///////////////////////////////////////////////////////////////////////////
  99. STDMETHODIMP SendCommand(BSTR bstrCommand, IAGCModel* pModelTarget,
  100. AGCSoundID idSound)
  101. {
  102. assert(GetIGC());
  103. assert(GetIGC()->GetMission()->GetIgcSite());
  104. // Convert the command string to a command ID
  105. CommandID idCmd;
  106. RETURN_FAILED(FindCommandName(bstrCommand, &idCmd, T::GetObjectCLSID(),
  107. IID_IAGCShip));
  108. // Verify that the specified model supports IAGCPrivate
  109. IAGCPrivatePtr spPrivate(pModelTarget);
  110. if (NULL == spPrivate)
  111. return E_INVALIDARG;
  112. // Get the target's IGC pointer
  113. ImodelIGC* pModel = reinterpret_cast<ImodelIGC*>(spPrivate->GetIGCVoid());
  114. // Send the chat
  115. GetIGC()->GetMission()->GetIgcSite()->SendChat(NULL, CHAT_INDIVIDUAL,
  116. GetIGC()->GetObjectID(), idSound, "", idCmd, pModel->GetObjectType(),
  117. pModel->GetObjectID(), pModel, true);
  118. // Indicate success
  119. return S_OK;
  120. }
  121. ///////////////////////////////////////////////////////////////////////////
  122. STDMETHODIMP put_AutoDonate(IAGCShip* pShip)
  123. {
  124. // Property is read-only at the AGC level
  125. return AtlReportError(T::GetObjectCLSID(), IDS_E_PROP_READONLY,
  126. __uuidof(ITF), MAKE_HRESULT(1, FACILITY_ITF, IDS_E_PROP_READONLY),
  127. GetAGCGlobal()->GetResourceInstance());
  128. }
  129. ///////////////////////////////////////////////////////////////////////////
  130. STDMETHODIMP get_AutoDonate(IAGCShip** ppShip)
  131. {
  132. assert(GetIGC());
  133. if (GetIGC()->GetAutoDonate())
  134. GetAGCGlobal()->GetAGCObject(GetIGC()->GetAutoDonate(), IID_IAGCShip,
  135. (void**)ppShip);
  136. else
  137. CLEAROUT(ppShip, (IAGCShip*)NULL);
  138. return S_OK;
  139. }
  140. ///////////////////////////////////////////////////////////////////////////
  141. STDMETHODIMP put_ShieldFraction(float Val)
  142. {
  143. assert(GetIGC());
  144. IshieldIGC* pshield = (IshieldIGC*)(GetIGC()->GetMountedPart(ET_Shield, 0));
  145. if (pshield)
  146. pshield->SetFraction(Val);
  147. return S_OK;
  148. }
  149. ///////////////////////////////////////////////////////////////////////////
  150. STDMETHODIMP get_ShieldFraction(float* pVal)
  151. {
  152. assert(GetIGC());
  153. IshieldIGC* pshield = (IshieldIGC*)(GetIGC()->GetMountedPart(ET_Shield, 0));
  154. if (pshield)
  155. {
  156. CLEAROUT(pVal, pshield->GetFraction());
  157. }
  158. else
  159. CLEAROUT(pVal, 0.0f);
  160. return S_OK;
  161. }
  162. ///////////////////////////////////////////////////////////////////////////
  163. STDMETHODIMP get_HullType(IAGCHullType** ppHullType)
  164. {
  165. assert(GetIGC());
  166. assert(GetIGC()->GetHullType());
  167. return GetAGCGlobal()->GetAGCObject(GetIGC()->GetHullType(),
  168. IID_IAGCHullType, (void**)ppHullType);
  169. }
  170. ///////////////////////////////////////////////////////////////////////////
  171. STDMETHODIMP get_BaseHullType(IAGCHullType** ppHullType)
  172. {
  173. assert(GetIGC());
  174. if (GetIGC()->GetBaseHullType())
  175. return GetAGCGlobal()->GetAGCObject(GetIGC()->GetBaseHullType(),
  176. IID_IAGCHullType, (void**)ppHullType);
  177. else
  178. return NULL;
  179. }
  180. };
  181. /////////////////////////////////////////////////////////////////////////////
  182. #endif //__IAGCShipImpl_h__