diff --git a/source/simulation2/components/CCmpPathfinder.cpp b/source/simulation2/components/CCmpPathfinder.cpp
index 5b6c0f3..944d76e 100644
a
|
b
|
void CCmpPathfinder::Serialize(ISerializer& serialize)
|
141 | 141 | SerializeVector<SerializeShortRequest>()(serialize, "short requests", m_AsyncShortPathRequests); |
142 | 142 | serialize.NumberU32_Unbounded("next ticket", m_NextAsyncTicket); |
143 | 143 | serialize.NumberU16_Unbounded("same turn moves count", m_SameTurnMovesCount); |
| 144 | serialize.NumberU16_Unbounded("map size", m_MapSize); |
144 | 145 | } |
145 | 146 | |
146 | 147 | void CCmpPathfinder::Deserialize(const CParamNode& paramNode, IDeserializer& deserialize) |
… |
… |
void CCmpPathfinder::Deserialize(const CParamNode& paramNode, IDeserializer& des
|
151 | 152 | SerializeVector<SerializeShortRequest>()(deserialize, "short requests", m_AsyncShortPathRequests); |
152 | 153 | deserialize.NumberU32_Unbounded("next ticket", m_NextAsyncTicket); |
153 | 154 | deserialize.NumberU16_Unbounded("same turn moves count", m_SameTurnMovesCount); |
| 155 | deserialize.NumberU16_Unbounded("map size", m_MapSize); |
154 | 156 | } |
155 | 157 | |
156 | 158 | void CCmpPathfinder::HandleMessage(const CMessage& msg, bool UNUSED(global)) |
diff --git a/source/simulation2/components/CCmpRangeManager.cpp b/source/simulation2/components/CCmpRangeManager.cpp
index 69245d1..fda08e3 100644
a
|
b
|
static std::map<entity_id_t, EntityParabolicRangeOutline> ParabolicRangesOutline
|
170 | 170 | */ |
171 | 171 | struct EntityData |
172 | 172 | { |
173 | | EntityData() : visibilities(0), size(0), retainInFog(0), owner(-1), inWorld(0), flags(1), scriptedVisibility(0) { } |
| 173 | EntityData() : |
| 174 | visibilities(0), size(0), |
| 175 | owner(-1), retainInFog(0), inWorld(0), revealShore(0), |
| 176 | flags(1), scriptedVisibility(0) |
| 177 | { } |
174 | 178 | entity_pos_t x, z; |
175 | 179 | entity_pos_t visionRange; |
176 | 180 | u32 visibilities; // 2-bit visibility, per player |
177 | 181 | u32 size; |
178 | | u8 retainInFog; // boolean |
179 | 182 | i8 owner; |
| 183 | u8 retainInFog; // boolean |
180 | 184 | u8 inWorld; // boolean |
| 185 | u8 revealShore; // boolean |
181 | 186 | u8 flags; // See GetEntityFlagMask |
182 | 187 | u8 scriptedVisibility; // boolean, see ComputeLosVisibility |
183 | 188 | }; |
… |
… |
struct SerializeEntityData
|
236 | 241 | serialize.NumberFixed_Unbounded("vision", value.visionRange); |
237 | 242 | serialize.NumberU32_Unbounded("visibilities", value.visibilities); |
238 | 243 | serialize.NumberU32_Unbounded("size", value.size); |
239 | | serialize.NumberU8("retain in fog", value.retainInFog, 0, 1); |
240 | 244 | serialize.NumberI8_Unbounded("owner", value.owner); |
| 245 | serialize.NumberU8("retain in fog", value.retainInFog, 0, 1); |
241 | 246 | serialize.NumberU8("in world", value.inWorld, 0, 1); |
| 247 | serialize.NumberU8("reveal shore", value.revealShore, 0, 1); |
242 | 248 | serialize.NumberU8_Unbounded("flags", value.flags); |
243 | | serialize.NumberU8_Unbounded("scripted visibility", value.scriptedVisibility); |
| 249 | serialize.NumberU8("scripted visibility", value.scriptedVisibility, 0, 1); |
244 | 250 | } |
245 | 251 | }; |
246 | 252 | |
… |
… |
public:
|
293 | 299 | componentManager.SubscribeGloballyToMessageType(MT_Destroy); |
294 | 300 | componentManager.SubscribeGloballyToMessageType(MT_VisionRangeChanged); |
295 | 301 | |
| 302 | componentManager.SubscribeToMessageType(MT_Deserialized); |
| 303 | |
296 | 304 | componentManager.SubscribeToMessageType(MT_Update); |
297 | 305 | |
298 | 306 | componentManager.SubscribeToMessageType(MT_RenderSubmit); // for debug overlays |
… |
… |
public:
|
440 | 448 | Init(paramNode); |
441 | 449 | |
442 | 450 | SerializeCommon(deserialize); |
443 | | |
444 | | // Reinitialise subdivisions and LOS data |
445 | | m_Deserializing = true; |
446 | | ResetDerivedData(); |
447 | | m_Deserializing = false; |
448 | 451 | } |
449 | 452 | |
450 | 453 | virtual void HandleMessage(const CMessage& msg, bool UNUSED(global)) |
451 | 454 | { |
452 | 455 | switch (msg.GetType()) |
453 | 456 | { |
| 457 | case MT_Deserialized: |
| 458 | { |
| 459 | // Reinitialise subdivisions and LOS data |
| 460 | m_Deserializing = true; |
| 461 | ResetDerivedData(); |
| 462 | m_Deserializing = false; |
| 463 | break; |
| 464 | } |
454 | 465 | case MT_Create: |
455 | 466 | { |
456 | 467 | const CMessageCreate& msgData = static_cast<const CMessageCreate&> (msg); |
… |
… |
public:
|
473 | 484 | // Store the LOS data, if any |
474 | 485 | CmpPtr<ICmpVision> cmpVision(GetSimContext(), ent); |
475 | 486 | if (cmpVision) |
| 487 | { |
476 | 488 | entdata.visionRange = cmpVision->GetRange(); |
| 489 | entdata.revealShore = cmpVision->GetRevealShore() ? 1 : 0; |
| 490 | } |
477 | 491 | CmpPtr<ICmpVisibility> cmpVisibility(GetSimContext(), ent); |
478 | 492 | if (cmpVisibility) |
479 | 493 | entdata.retainInFog = (cmpVisibility->GetRetainInFog() ? 1 : 0); |
… |
… |
public:
|
561 | 575 | CFixedVector2D pos(it->second.x, it->second.z); |
562 | 576 | LosRemove(it->second.owner, it->second.visionRange, pos); |
563 | 577 | LosAdd(msgData.to, it->second.visionRange, pos); |
| 578 | |
| 579 | if (it->second.revealShore) |
| 580 | { |
| 581 | RevealShore(it->second.owner, false); |
| 582 | RevealShore(msgData.to, true); |
| 583 | } |
564 | 584 | } |
565 | 585 | |
566 | 586 | ENSURE(-128 <= msgData.to && msgData.to <= 127); |
… |
… |
public:
|
751 | 771 | { |
752 | 772 | LosAdd(it->second.owner, it->second.visionRange, CFixedVector2D(it->second.x, it->second.z)); |
753 | 773 | AddToTile(PosToLosTilesHelper(it->second.x, it->second.z), it->first); |
| 774 | |
| 775 | if (it->second.revealShore) |
| 776 | RevealShore(it->second.owner, true); |
754 | 777 | } |
755 | 778 | } |
756 | 779 | |
diff --git a/source/simulation2/components/CCmpVision.cpp b/source/simulation2/components/CCmpVision.cpp
index 2bbd8ab..81f6730 100644
a
|
b
|
public:
|
40 | 40 | // Template state: |
41 | 41 | |
42 | 42 | entity_pos_t m_Range, m_BaseRange; |
| 43 | |
| 44 | // TODO: The reveal shore system should be replaced by a general |
| 45 | // system of "special" vision methods that are not ranges. |
43 | 46 | bool m_RevealShore; |
44 | 47 | |
45 | 48 | static std::string GetSchema() |
… |
… |
public:
|
90 | 93 | break; |
91 | 94 | |
92 | 95 | ReloadRange(); |
93 | | |
94 | | if (!m_RevealShore) |
95 | | break; |
96 | | CmpPtr<ICmpRangeManager> cmpRangeManager(GetSystemEntity()); |
97 | | cmpRangeManager->RevealShore(msgData.from, false); |
98 | | cmpRangeManager->RevealShore(msgData.to, true); |
99 | 96 | break; |
100 | 97 | } |
101 | 98 | case MT_ValueModification: |
… |
… |
public:
|
137 | 134 | { |
138 | 135 | return m_Range; |
139 | 136 | } |
| 137 | |
| 138 | virtual bool GetRevealShore() |
| 139 | { |
| 140 | return m_RevealShore; |
| 141 | } |
140 | 142 | }; |
141 | 143 | |
142 | 144 | REGISTER_COMPONENT_TYPE(Vision) |
diff --git a/source/simulation2/components/CCmpWaterManager.cpp b/source/simulation2/components/CCmpWaterManager.cpp
index 5b25d0f..2704953 100644
a
|
b
|
public:
|
67 | 67 | Init(paramNode); |
68 | 68 | |
69 | 69 | deserialize.NumberFixed_Unbounded("height", m_WaterHeight); |
| 70 | std::cout << "deserialize water" << std::endl; |
70 | 71 | } |
71 | 72 | |
72 | 73 | virtual void HandleMessage(const CMessage& msg, bool UNUSED(global)) |
diff --git a/source/simulation2/components/ICmpVision.h b/source/simulation2/components/ICmpVision.h
index fed3163..05268fe 100644
a
|
b
|
|
1 | | /* Copyright (C) 2014 Wildfire Games. |
| 1 | /* Copyright (C) 2016 Wildfire Games. |
2 | 2 | * This file is part of 0 A.D. |
3 | 3 | * |
4 | 4 | * 0 A.D. is free software: you can redistribute it and/or modify |
… |
… |
class ICmpVision : public IComponent
|
29 | 29 | { |
30 | 30 | public: |
31 | 31 | virtual entity_pos_t GetRange() = 0; |
| 32 | virtual bool GetRevealShore() = 0; |
32 | 33 | |
33 | 34 | DECLARE_INTERFACE_TYPE(Vision) |
34 | 35 | }; |
diff --git a/source/simulation2/components/tests/test_RangeManager.h b/source/simulation2/components/tests/test_RangeManager.h
index 5e5eaf9..9f97fd2 100644
a
|
b
|
|
1 | | /* Copyright (C) 2015 Wildfire Games. |
| 1 | /* Copyright (C) 2016 Wildfire Games. |
2 | 2 | * This file is part of 0 A.D. |
3 | 3 | * |
4 | 4 | * 0 A.D. is free software: you can redistribute it and/or modify |
… |
… |
public:
|
31 | 31 | DEFAULT_MOCK_COMPONENT() |
32 | 32 | |
33 | 33 | virtual entity_pos_t GetRange() { return entity_pos_t::FromInt(66); } |
34 | | virtual bool GetRetainInFog() { return false; } |
35 | | virtual bool GetAlwaysVisible() { return false; } |
| 34 | virtual bool GetRevealShore() { return false; } |
36 | 35 | }; |
37 | 36 | |
38 | 37 | class MockPosition : public ICmpPosition |
… |
… |
public:
|
85 | 84 | CXeromyces::Terminate(); |
86 | 85 | } |
87 | 86 | |
| 87 | // TODO It would be nice to call Verify() with the shore revealing system |
| 88 | // but that means testing on an actual map, with water and land. |
| 89 | |
88 | 90 | void test_basic() |
89 | 91 | { |
90 | 92 | ComponentTestHelper test(g_ScriptRuntime); |