- Timestamp:
- 06/09/11 21:44:40 (14 years ago)
- Location:
- ps/trunk
- Files:
-
- 4 added
- 15 edited
-
binaries/data/mods/_test.sim/simulation/templates/unit.xml (modified) (1 diff)
-
binaries/data/mods/_test.sim/simulation/templates/unitobstruct.xml (modified) (1 diff)
-
binaries/data/mods/public/maps/scenarios/Flight_demo.pmp (added)
-
binaries/data/mods/public/maps/scenarios/Flight_demo.xml (added)
-
binaries/data/mods/public/simulation/components/UnitAI.js (modified) (1 diff)
-
binaries/data/mods/public/simulation/components/UnitMotionFlying.js (added)
-
binaries/data/mods/public/simulation/templates/other/plane.xml (added)
-
binaries/data/mods/public/simulation/templates/special/actor.xml (modified) (1 diff)
-
binaries/data/mods/public/simulation/templates/special/formation.xml (modified) (1 diff)
-
binaries/data/mods/public/simulation/templates/template_entity_full.xml (modified) (1 diff)
-
binaries/data/mods/public/simulation/templates/template_entity_quasi.xml (modified) (1 diff)
-
source/simulation2/TypeList.h (modified) (1 diff)
-
source/simulation2/components/CCmpPosition.cpp (modified) (11 diffs)
-
source/simulation2/components/CCmpUnitMotion.cpp (modified) (7 diffs)
-
source/simulation2/components/ICmpPosition.cpp (modified) (2 diffs)
-
source/simulation2/components/ICmpPosition.h (modified) (2 diffs)
-
source/simulation2/components/ICmpUnitMotion.cpp (modified) (4 diffs)
-
source/simulation2/components/ICmpUnitMotion.h (modified) (1 diff)
-
source/simulation2/tests/test_CmpTemplateManager.h (modified) (2 diffs)
Legend:
- Unmodified
- Added
- Removed
-
ps/trunk/binaries/data/mods/_test.sim/simulation/templates/unit.xml
r9080 r9605 11 11 <Anchor>upright</Anchor> 12 12 <Floating>false</Floating> 13 <TurnRate>6.0</TurnRate> 13 14 </Position> 14 15 <UnitAI/> -
ps/trunk/binaries/data/mods/_test.sim/simulation/templates/unitobstruct.xml
r9080 r9605 11 11 <Anchor>upright</Anchor> 12 12 <Floating>false</Floating> 13 <TurnRate>6.0</TurnRate> 13 14 </Position> 14 15 <UnitAI/> -
ps/trunk/binaries/data/mods/public/simulation/components/UnitAI.js
r9602 r9605 1830 1830 var cmpUnitMotion = Engine.QueryInterface(this.entity, IID_UnitMotion); 1831 1831 if (cmpUnitMotion) 1832 { 1833 cmpPosition.TurnTo(angle); 1834 } 1832 cmpUnitMotion.FaceTowardsPoint(pos.x, pos.z); 1835 1833 } 1836 1834 } -
ps/trunk/binaries/data/mods/public/simulation/templates/special/actor.xml
r9515 r9605 5 5 <Anchor>upright</Anchor> 6 6 <Floating>false</Floating> 7 <TurnRate>6.0</TurnRate> 7 8 </Position> 8 9 <VisualActor> -
ps/trunk/binaries/data/mods/public/simulation/templates/special/formation.xml
r9010 r9605 5 5 <Anchor>upright</Anchor> 6 6 <Floating>false</Floating> 7 <TurnRate>6.0</TurnRate> 7 8 </Position> 8 9 <Formation/> -
ps/trunk/binaries/data/mods/public/simulation/templates/template_entity_full.xml
r8865 r9605 7 7 <Anchor>upright</Anchor> 8 8 <Floating>false</Floating> 9 <TurnRate>6.0</TurnRate> 9 10 </Position> 10 11 <Selectable/> -
ps/trunk/binaries/data/mods/public/simulation/templates/template_entity_quasi.xml
r8865 r9605 7 7 <Anchor>upright</Anchor> 8 8 <Floating>false</Floating> 9 <TurnRate>6.0</TurnRate> 9 10 </Position> 10 11 </Entity> -
ps/trunk/source/simulation2/TypeList.h
r9443 r9605 128 128 INTERFACE(UnitMotion) 129 129 COMPONENT(UnitMotion) // must be after Obstruction 130 COMPONENT(UnitMotionScripted) 130 131 131 132 INTERFACE(Vision) -
ps/trunk/source/simulation2/components/CCmpPosition.cpp
r8867 r9605 1 /* Copyright (C) 201 0Wildfire Games.1 /* Copyright (C) 2011 Wildfire Games. 2 2 * This file is part of 0 A.D. 3 3 * … … 69 69 entity_pos_t m_X, m_Z, m_LastX, m_LastZ; // these values contain undefined junk if !InWorld 70 70 entity_pos_t m_YOffset; 71 bool m_RelativeToGround; // whether m_YOffset is relative to terrain/water plane, or an absolute height 71 72 72 73 entity_angle_t m_RotX, m_RotY, m_RotZ; … … 81 82 "<Altitude>0.0</Altitude>" 82 83 "<Floating>false</Floating>" 84 "<TurnRate>6.0</TurnRate>" 83 85 "</a:example>" 84 86 "<element name='Anchor' a:help='Automatic rotation to follow the slope of terrain'>" … … 94 96 "<element name='Floating' a:help='Whether the entity floats on water'>" 95 97 "<data type='boolean'/>" 98 "</element>" 99 "<element name='TurnRate' a:help='Maximum graphical rotation speed around Y axis, in radians per second'>" 100 "<ref name='positiveDecimal'/>" 96 101 "</element>"; 97 102 } … … 110 115 111 116 m_YOffset = paramNode.GetChild("Altitude").ToFixed(); 117 m_RelativeToGround = true; 112 118 m_Floating = paramNode.GetChild("Floating").ToBool(); 113 119 114 m_RotYSpeed = 6.f; // TODO: should get from template120 m_RotYSpeed = paramNode.GetChild("TurnRate").ToFixed().ToFloat(); 115 121 116 122 m_RotX = m_RotY = m_RotZ = entity_angle_t::FromInt(0); … … 138 144 serialize.NumberFixed_Unbounded("rot z", m_RotZ); 139 145 serialize.NumberFixed_Unbounded("altitude", m_YOffset); 146 serialize.Bool("relative", m_RelativeToGround); 140 147 141 148 if (serialize.IsDebug()) … … 169 176 deserialize.NumberFixed_Unbounded("rot z", m_RotZ); 170 177 deserialize.NumberFixed_Unbounded("altitude", m_YOffset); 178 deserialize.Bool("relative", m_RelativeToGround); 171 179 // TODO: should there be range checks on all these values? 172 180 … … 213 221 { 214 222 m_YOffset = dy; 223 m_RelativeToGround = true; 215 224 216 225 AdvertisePositionChanges(); … … 220 229 { 221 230 return m_YOffset; 231 } 232 233 virtual void SetHeightFixed(entity_pos_t y) 234 { 235 m_YOffset = y; 236 m_RelativeToGround = false; 222 237 } 223 238 … … 236 251 237 252 entity_pos_t baseY; 238 CmpPtr<ICmpTerrain> cmpTerrain(GetSimContext(), SYSTEM_ENTITY); 239 if (!cmpTerrain.null()) 240 baseY = cmpTerrain->GetGroundLevel(m_X, m_Z); 241 242 if (m_Floating) 243 { 244 CmpPtr<ICmpWaterManager> cmpWaterMan(GetSimContext(), SYSTEM_ENTITY); 245 if (!cmpWaterMan.null()) 246 baseY = std::max(baseY, cmpWaterMan->GetWaterLevel(m_X, m_Z)); 253 if (m_RelativeToGround) 254 { 255 CmpPtr<ICmpTerrain> cmpTerrain(GetSimContext(), SYSTEM_ENTITY); 256 if (!cmpTerrain.null()) 257 baseY = cmpTerrain->GetGroundLevel(m_X, m_Z); 258 259 if (m_Floating) 260 { 261 CmpPtr<ICmpWaterManager> cmpWaterMan(GetSimContext(), SYSTEM_ENTITY); 262 if (!cmpWaterMan.null()) 263 baseY = std::max(baseY, cmpWaterMan->GetWaterLevel(m_X, m_Z)); 264 } 247 265 } 248 266 … … 328 346 329 347 float baseY = 0; 330 CmpPtr<ICmpTerrain> cmpTerrain(GetSimContext(), SYSTEM_ENTITY); 331 if (!cmpTerrain.null()) 332 baseY = cmpTerrain->GetExactGroundLevel(x, z); 333 334 if (m_Floating || forceFloating) 335 { 336 CmpPtr<ICmpWaterManager> cmpWaterMan(GetSimContext(), SYSTEM_ENTITY); 337 if (!cmpWaterMan.null()) 338 baseY = std::max(baseY, cmpWaterMan->GetExactWaterLevel(x, z)); 348 if (m_RelativeToGround) 349 { 350 CmpPtr<ICmpTerrain> cmpTerrain(GetSimContext(), SYSTEM_ENTITY); 351 if (!cmpTerrain.null()) 352 baseY = cmpTerrain->GetExactGroundLevel(x, z); 353 354 if (m_Floating || forceFloating) 355 { 356 CmpPtr<ICmpWaterManager> cmpWaterMan(GetSimContext(), SYSTEM_ENTITY); 357 if (!cmpWaterMan.null()) 358 baseY = std::max(baseY, cmpWaterMan->GetExactWaterLevel(x, z)); 359 } 339 360 } 340 361 -
ps/trunk/source/simulation2/components/CCmpUnitMotion.cpp
r9465 r9605 414 414 virtual void MoveToFormationOffset(entity_id_t target, entity_pos_t x, entity_pos_t z); 415 415 416 virtual void FaceTowardsPoint(entity_pos_t x, entity_pos_t z); 417 416 418 virtual void StopMoving() 417 419 { … … 523 525 * Rotate to face towards the target point, given the current pos 524 526 */ 525 void FaceTowardsPoint (CFixedVector2D pos, entity_pos_t x, entity_pos_t z);527 void FaceTowardsPointFromPos(CFixedVector2D pos, entity_pos_t x, entity_pos_t z); 526 528 527 529 /** … … 902 904 StopMoving(); 903 905 904 FaceTowardsPoint (pos, m_FinalGoal.x, m_FinalGoal.z);906 FaceTowardsPointFromPos(pos, m_FinalGoal.x, m_FinalGoal.z); 905 907 // TODO: if the goal was a square building, we ought to point towards the 906 908 // nearest point on the square, not towards its center … … 1034 1036 } 1035 1037 1036 void CCmpUnitMotion::FaceTowardsPoint(CFixedVector2D pos, entity_pos_t x, entity_pos_t z) 1038 void CCmpUnitMotion::FaceTowardsPoint(entity_pos_t x, entity_pos_t z) 1039 { 1040 CmpPtr<ICmpPosition> cmpPosition(GetSimContext(), GetEntityId()); 1041 if (cmpPosition.null() || !cmpPosition->IsInWorld()) 1042 return; 1043 1044 CFixedVector2D pos = cmpPosition->GetPosition2D(); 1045 FaceTowardsPointFromPos(pos, x, z); 1046 } 1047 1048 void CCmpUnitMotion::FaceTowardsPointFromPos(CFixedVector2D pos, entity_pos_t x, entity_pos_t z) 1037 1049 { 1038 1050 CFixedVector2D target(x, z); … … 1224 1236 { 1225 1237 // We're already in range - no need to move anywhere 1226 FaceTowardsPoint (pos, x, z);1238 FaceTowardsPointFromPos(pos, x, z); 1227 1239 return false; 1228 1240 } … … 1335 1347 { 1336 1348 // We're already in range - no need to move anywhere 1337 FaceTowardsPoint (pos, goal.x, goal.z);1349 FaceTowardsPointFromPos(pos, goal.x, goal.z); 1338 1350 return false; 1339 1351 } … … 1357 1369 { 1358 1370 // We're already in range - no need to move anywhere 1359 FaceTowardsPoint (pos, goal.x, goal.z);1371 FaceTowardsPointFromPos(pos, goal.x, goal.z); 1360 1372 return false; 1361 1373 } -
ps/trunk/source/simulation2/components/ICmpPosition.cpp
r9595 r9605 1 /* Copyright (C) 201 0Wildfire Games.1 /* Copyright (C) 2011 Wildfire Games. 2 2 * This file is part of 0 A.D. 3 3 * … … 29 29 DEFINE_INTERFACE_METHOD_1("SetHeightOffset", void, ICmpPosition, SetHeightOffset, entity_pos_t) 30 30 DEFINE_INTERFACE_METHOD_0("GetHeightOffset", entity_pos_t, ICmpPosition, GetHeightOffset) 31 DEFINE_INTERFACE_METHOD_1("SetHeightFixed", void, ICmpPosition, SetHeightFixed, entity_pos_t) 31 32 DEFINE_INTERFACE_METHOD_0("IsFloating", bool, ICmpPosition, IsFloating) 32 33 DEFINE_INTERFACE_METHOD_0("GetPosition", CFixedVector3D, ICmpPosition, GetPosition) -
ps/trunk/source/simulation2/components/ICmpPosition.h
r8058 r9605 1 /* Copyright (C) 201 0Wildfire Games.1 /* Copyright (C) 2011 Wildfire Games. 2 2 * This file is part of 0 A.D. 3 3 * … … 86 86 87 87 /** 88 * Set the vertical position as a fixed, absolute value. 89 * Will stay at this height until the next call to SetHeightFixed or SetHeightOffset. 90 */ 91 virtual void SetHeightFixed(entity_pos_t y) = 0; 92 93 /** 88 94 * Returns whether the entity floats on water. 89 95 */ -
ps/trunk/source/simulation2/components/ICmpUnitMotion.cpp
r8751 r9605 1 /* Copyright (C) 201 0Wildfire Games.1 /* Copyright (C) 2011 Wildfire Games. 2 2 * This file is part of 0 A.D. 3 3 * … … 21 21 22 22 #include "simulation2/system/InterfaceScripted.h" 23 #include "simulation2/scripting/ScriptComponent.h" 23 24 24 25 BEGIN_INTERFACE_WRAPPER(UnitMotion) … … 27 28 DEFINE_INTERFACE_METHOD_3("MoveToTargetRange", bool, ICmpUnitMotion, MoveToTargetRange, entity_id_t, entity_pos_t, entity_pos_t) 28 29 DEFINE_INTERFACE_METHOD_3("MoveToFormationOffset", void, ICmpUnitMotion, MoveToFormationOffset, entity_id_t, entity_pos_t, entity_pos_t) 30 DEFINE_INTERFACE_METHOD_2("FaceTowardsPoint", void, ICmpUnitMotion, FaceTowardsPoint, entity_pos_t, entity_pos_t) 29 31 DEFINE_INTERFACE_METHOD_0("StopMoving", void, ICmpUnitMotion, StopMoving) 30 32 DEFINE_INTERFACE_METHOD_1("SetSpeed", void, ICmpUnitMotion, SetSpeed, fixed) … … 34 36 DEFINE_INTERFACE_METHOD_1("SetDebugOverlay", void, ICmpUnitMotion, SetDebugOverlay, bool) 35 37 END_INTERFACE_WRAPPER(UnitMotion) 38 39 class CCmpUnitMotionScripted : public ICmpUnitMotion 40 { 41 public: 42 DEFAULT_SCRIPT_WRAPPER(UnitMotionScripted) 43 44 virtual bool MoveToPointRange(entity_pos_t x, entity_pos_t z, entity_pos_t minRange, entity_pos_t maxRange) 45 { 46 return m_Script.Call<bool>("MoveToPointRange", x, z, minRange, maxRange); 47 } 48 49 virtual bool IsInTargetRange(entity_id_t target, entity_pos_t minRange, entity_pos_t maxRange) 50 { 51 return m_Script.Call<bool>("IsInTargetRange", target, minRange, maxRange); 52 } 53 54 virtual bool MoveToTargetRange(entity_id_t target, entity_pos_t minRange, entity_pos_t maxRange) 55 { 56 return m_Script.Call<bool>("MoveToTargetRange", target, minRange, maxRange); 57 } 58 59 virtual void MoveToFormationOffset(entity_id_t target, entity_pos_t x, entity_pos_t z) 60 { 61 m_Script.CallVoid("MoveToFormationOffset", target, x, z); 62 } 63 64 virtual void FaceTowardsPoint(entity_pos_t x, entity_pos_t z) 65 { 66 m_Script.CallVoid("FaceTowardsPoint", x, z); 67 } 68 69 virtual void StopMoving() 70 { 71 m_Script.CallVoid("StopMoving"); 72 } 73 74 virtual void SetSpeed(fixed speed) 75 { 76 m_Script.CallVoid("SetSpeed", speed); 77 } 78 79 virtual fixed GetWalkSpeed() 80 { 81 return m_Script.Call<fixed>("GetWalkSpeed"); 82 } 83 84 virtual fixed GetRunSpeed() 85 { 86 return m_Script.Call<fixed>("GetRunSpeed"); 87 } 88 89 virtual void SetUnitRadius(fixed radius) 90 { 91 m_Script.CallVoid("SetUnitRadius", radius); 92 } 93 94 virtual void SetDebugOverlay(bool enabled) 95 { 96 m_Script.CallVoid("SetDebugOverlay", enabled); 97 } 98 99 }; 100 101 REGISTER_COMPONENT_SCRIPT_WRAPPER(UnitMotionScripted) -
ps/trunk/source/simulation2/components/ICmpUnitMotion.h
r9010 r9605 69 69 70 70 /** 71 * Turn to look towards the given point. 72 */ 73 virtual void FaceTowardsPoint(entity_pos_t x, entity_pos_t z) = 0; 74 75 /** 71 76 * Stop moving immediately. 72 77 */ -
ps/trunk/source/simulation2/tests/test_CmpTemplateManager.h
r9462 r9605 84 84 TS_ASSERT(preview != NULL); 85 85 TS_ASSERT_WSTR_EQUALS(preview->ToXML(), 86 L"<Position><Altitude>0</Altitude><Anchor>upright</Anchor><Floating>false</Floating>< /Position>"86 L"<Position><Altitude>0</Altitude><Anchor>upright</Anchor><Floating>false</Floating><TurnRate>6.0</TurnRate></Position>" 87 87 L"<Vision><AlwaysVisible>true</AlwaysVisible><Range>0</Range><RetainInFog>false</RetainInFog></Vision>" 88 88 L"<VisualActor><Actor>example</Actor><SilhouetteDisplay>false</SilhouetteDisplay><SilhouetteOccluder>false</SilhouetteOccluder></VisualActor>"); … … 98 98 L"<Unit radius=\"4\"></Unit>" 99 99 L"</Obstruction>" 100 L"<Position><Altitude>0</Altitude><Anchor>upright</Anchor><Floating>false</Floating>< /Position>"100 L"<Position><Altitude>0</Altitude><Anchor>upright</Anchor><Floating>false</Floating><TurnRate>6.0</TurnRate></Position>" 101 101 L"<Vision><AlwaysVisible>true</AlwaysVisible><Range>0</Range><RetainInFog>false</RetainInFog></Vision>" 102 102 L"<VisualActor><Actor>example</Actor><SilhouetteDisplay>false</SilhouetteDisplay><SilhouetteOccluder>false</SilhouetteOccluder></VisualActor>");
Note:
See TracChangeset
for help on using the changeset viewer.
