Ticket #4277: reveal-shore-fixv0.patch

File reveal-shore-fixv0.patch, 8.0 KB (added by wraitii, 8 years ago)
  • source/simulation2/components/CCmpPathfinder.cpp

    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)  
    141141    SerializeVector<SerializeShortRequest>()(serialize, "short requests", m_AsyncShortPathRequests);
    142142    serialize.NumberU32_Unbounded("next ticket", m_NextAsyncTicket);
    143143    serialize.NumberU16_Unbounded("same turn moves count", m_SameTurnMovesCount);
     144    serialize.NumberU16_Unbounded("map size", m_MapSize);
    144145}
    145146
    146147void CCmpPathfinder::Deserialize(const CParamNode& paramNode, IDeserializer& deserialize)
    void CCmpPathfinder::Deserialize(const CParamNode& paramNode, IDeserializer& des  
    151152    SerializeVector<SerializeShortRequest>()(deserialize, "short requests", m_AsyncShortPathRequests);
    152153    deserialize.NumberU32_Unbounded("next ticket", m_NextAsyncTicket);
    153154    deserialize.NumberU16_Unbounded("same turn moves count", m_SameTurnMovesCount);
     155    deserialize.NumberU16_Unbounded("map size", m_MapSize);
    154156}
    155157
    156158void CCmpPathfinder::HandleMessage(const CMessage& msg, bool UNUSED(global))
  • source/simulation2/components/CCmpRangeManager.cpp

    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  
    170170 */
    171171struct EntityData
    172172{
    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        { }
    174178    entity_pos_t x, z;
    175179    entity_pos_t visionRange;
    176180    u32 visibilities; // 2-bit visibility, per player
    177181    u32 size;
    178     u8 retainInFog; // boolean
    179182    i8 owner;
     183    u8 retainInFog; // boolean
    180184    u8 inWorld; // boolean
     185    u8 revealShore; // boolean
    181186    u8 flags; // See GetEntityFlagMask
    182187    u8 scriptedVisibility; // boolean, see ComputeLosVisibility
    183188};
    struct SerializeEntityData  
    236241        serialize.NumberFixed_Unbounded("vision", value.visionRange);
    237242        serialize.NumberU32_Unbounded("visibilities", value.visibilities);
    238243        serialize.NumberU32_Unbounded("size", value.size);
    239         serialize.NumberU8("retain in fog", value.retainInFog, 0, 1);
    240244        serialize.NumberI8_Unbounded("owner", value.owner);
     245        serialize.NumberU8("retain in fog", value.retainInFog, 0, 1);
    241246        serialize.NumberU8("in world", value.inWorld, 0, 1);
     247        serialize.NumberU8("reveal shore", value.revealShore, 0, 1);
    242248        serialize.NumberU8_Unbounded("flags", value.flags);
    243         serialize.NumberU8_Unbounded("scripted visibility", value.scriptedVisibility);
     249        serialize.NumberU8("scripted visibility", value.scriptedVisibility, 0, 1);
    244250    }
    245251};
    246252
    public:  
    293299        componentManager.SubscribeGloballyToMessageType(MT_Destroy);
    294300        componentManager.SubscribeGloballyToMessageType(MT_VisionRangeChanged);
    295301
     302        componentManager.SubscribeToMessageType(MT_Deserialized);
     303
    296304        componentManager.SubscribeToMessageType(MT_Update);
    297305
    298306        componentManager.SubscribeToMessageType(MT_RenderSubmit); // for debug overlays
    public:  
    440448        Init(paramNode);
    441449
    442450        SerializeCommon(deserialize);
    443 
    444         // Reinitialise subdivisions and LOS data
    445         m_Deserializing = true;
    446         ResetDerivedData();
    447         m_Deserializing = false;
    448451    }
    449452
    450453    virtual void HandleMessage(const CMessage& msg, bool UNUSED(global))
    451454    {
    452455        switch (msg.GetType())
    453456        {
     457        case MT_Deserialized:
     458        {
     459            // Reinitialise subdivisions and LOS data
     460            m_Deserializing = true;
     461            ResetDerivedData();
     462            m_Deserializing = false;
     463            break;
     464        }
    454465        case MT_Create:
    455466        {
    456467            const CMessageCreate& msgData = static_cast<const CMessageCreate&> (msg);
    public:  
    473484            // Store the LOS data, if any
    474485            CmpPtr<ICmpVision> cmpVision(GetSimContext(), ent);
    475486            if (cmpVision)
     487            {
    476488                entdata.visionRange = cmpVision->GetRange();
     489                entdata.revealShore = cmpVision->GetRevealShore() ? 1 : 0;
     490            }
    477491            CmpPtr<ICmpVisibility> cmpVisibility(GetSimContext(), ent);
    478492            if (cmpVisibility)
    479493                entdata.retainInFog = (cmpVisibility->GetRetainInFog() ? 1 : 0);
    public:  
    561575                CFixedVector2D pos(it->second.x, it->second.z);
    562576                LosRemove(it->second.owner, it->second.visionRange, pos);
    563577                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                }
    564584            }
    565585
    566586            ENSURE(-128 <= msgData.to && msgData.to <= 127);
    public:  
    751771            {
    752772                LosAdd(it->second.owner, it->second.visionRange, CFixedVector2D(it->second.x, it->second.z));
    753773                AddToTile(PosToLosTilesHelper(it->second.x, it->second.z), it->first);
     774
     775                if (it->second.revealShore)
     776                    RevealShore(it->second.owner, true);
    754777            }
    755778        }
    756779
  • source/simulation2/components/CCmpVision.cpp

    diff --git a/source/simulation2/components/CCmpVision.cpp b/source/simulation2/components/CCmpVision.cpp
    index 2bbd8ab..81f6730 100644
    a b public:  
    4040    // Template state:
    4141
    4242    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.
    4346    bool m_RevealShore;
    4447
    4548    static std::string GetSchema()
    public:  
    9093                break;
    9194
    9295            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);
    9996            break;
    10097        }
    10198        case MT_ValueModification:
    public:  
    137134    {
    138135        return m_Range;
    139136    }
     137
     138    virtual bool GetRevealShore()
     139    {
     140        return m_RevealShore;
     141    }
    140142};
    141143
    142144REGISTER_COMPONENT_TYPE(Vision)
  • source/simulation2/components/CCmpWaterManager.cpp

    diff --git a/source/simulation2/components/CCmpWaterManager.cpp b/source/simulation2/components/CCmpWaterManager.cpp
    index 5b25d0f..2704953 100644
    a b public:  
    6767        Init(paramNode);
    6868
    6969        deserialize.NumberFixed_Unbounded("height", m_WaterHeight);
     70        std::cout << "deserialize water" << std::endl;
    7071    }
    7172
    7273    virtual void HandleMessage(const CMessage& msg, bool UNUSED(global))
  • source/simulation2/components/ICmpVision.h

    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.
    22 * This file is part of 0 A.D.
    33 *
    44 * 0 A.D. is free software: you can redistribute it and/or modify
    class ICmpVision : public IComponent  
    2929{
    3030public:
    3131    virtual entity_pos_t GetRange() = 0;
     32    virtual bool GetRevealShore() = 0;
    3233
    3334    DECLARE_INTERFACE_TYPE(Vision)
    3435};
  • source/simulation2/components/tests/test_RangeManager.h

    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.
    22 * This file is part of 0 A.D.
    33 *
    44 * 0 A.D. is free software: you can redistribute it and/or modify
    public:  
    3131    DEFAULT_MOCK_COMPONENT()
    3232
    3333    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; }
    3635};
    3736
    3837class MockPosition : public ICmpPosition
    public:  
    8584        CXeromyces::Terminate();
    8685    }
    8786
     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
    8890    void test_basic()
    8991    {
    9092        ComponentTestHelper test(g_ScriptRuntime);