static void Map(
            this Dictionary <InstanceID, InstanceID> map,
            SegmentRecord segmentData,
            ushort nodeID,
            bool startNode,
            ushort targetSegmentID)
        {
            // node maps to it self.
            InstanceID instanceID = new InstanceID {
                NetNode = nodeID
            };

            map[instanceID] = instanceID;

            // map segment.
            InstanceID sourceSegment = new InstanceID {
                NetSegment = segmentData.SegmentID
            };
            InstanceID targetSegment = new InstanceID {
                NetSegment = targetSegmentID
            };

            map[sourceSegment] = targetSegment;

            // map segment end.
            InstanceID sourceInstanceID = InstanceIDExtension.SegmentEnd(segmentData.SegmentID, startNode);
            bool       targetStartNode  = targetSegmentID.ToSegment().IsStartNode(nodeID);
            InstanceID targetInstanceID = InstanceIDExtension.SegmentEnd(targetSegmentID, targetStartNode);

            map[sourceInstanceID] = targetInstanceID;
        }
Пример #2
0
    /**
     * Called from a pellet when we've eaten it.
     */
    protected void addSegment()
    {
        // duplicate the last segment but 1 unit behind it
        GameObject lastSegment;
        int        index;
        float      addDistance = 0;

        if (_segments.Count == 0)
        {
            snapshotTarget();
            lastSegment = gameObject;
            index       = _targets.Count - 1;
        }
        else
        {
            var seggy = _segments[_segments.Count - 1];
            lastSegment = seggy.gameObject;
            index       = seggy.targetIndex;
            addDistance = seggy.waitDistance;
        }
        var newGameObject = Instantiate(segment, lastSegment.transform.position,
                                        lastSegment.transform.rotation);

        newGameObject.transform.localScale = _scale;
        // copy our ID to the segment
        newGameObject.AddComponent <WormIdentity>().id = _id;
        var newSeg = new SegmentRecord(newGameObject);

        newSeg.waitDistance += addDistance;
        newSeg.targetIndex   = index;
        _segments.Add(newSeg);
    }
        /// <param name="node">output node</param>
        public static void Postfix(ref ushort node)
        {
            if (!InSimulationThread())
            {
                return;
            }
            if (SegmentData == null)
            {
                Log.Debug($"MoveMiddleNode.Postfix()\n" + Environment.StackTrace, false);

                if (node == NodeID)
                {
                    // scenario 1: node did not move
                    // do nothing.
                }
                else if (node == NodeID2)
                {
                    // scenario 3: node merged
                    if (SplitSegmentPatch.SegmentData2 == null)
                    {
                        SplitSegmentPatch.SegmentData2 = SegmentData;
                    }
                    else
                    {
                        SplitSegmentPatch.SegmentData3 = SegmentData;
                    }
                }
                else
                {
                    // scenario 2: node moved.
                }
            }
            SegmentData = null;
        }
 public static void Prefix(ushort segment)
 {
     if (!InSimulationThread())
     {
         return;
     }
     Log.Info($"SplitSegment.Prefix() segment:{segment}" /*\n" + Environment.StackTrace*/, true);
     SegmentData = SegmentRecord.Create(segment, man_);
 }
 // pastes segment ends that:
 // 1- not nullnot null and
 // 2- its nodeID matches input start/end nodeID.
 static void PasteSegment(
     SegmentRecord segmentData, ushort nodeID1, ushort nodeID2, ushort targetSegmentID)
 {
     if (segmentData == null)
     {
         return;
     }
     PasteSegmentEnd(segmentData.SegmenStart, segmentData.StartNodeID, nodeID1, nodeID2, targetSegmentID);
     PasteSegmentEnd(segmentData.SegmenEnd, segmentData.EndNodeID, nodeID1, nodeID2, targetSegmentID);
 }
        /// <summary>
        /// scenario 1: no change - returns the input node.
        /// scenario 2: move node : segment is released and a smaller segment is created - returns the moved node.
        /// scenario 3: merge node: segment is released and the other node is returned.
        ///
        /// How to handle:
        /// 1: skip (DONE)
        /// 2: copy segment end for the node that didn't move (moved node cannot have customisations) (DONE)
        /// 3: when split-segment creates a new segment, that copy segment end to it.
        /// </summary>
        /// <param name="node">input/output node</param>
        public static void Prefix(ref ushort node) // TODO remove ref when in lates harmony.
        {
            if (!InSimulationThread())
            {
                return;
            }
            NodeID = node;
            AssertEqual(NodeID.ToNode().CountSegments(), 1, "CountSegments");
            ushort segmentID = NetUtil.GetFirstSegment(NodeID);

            Log.Info($"MoveMiddleNode.Prefix() node:{NodeID} segment:{segmentID}" /*+"\n" + Environment.StackTrace*/, true);
            SegmentData = SegmentRecord.Create(segmentID, man_);
            NodeID2     = segmentID.ToSegment().GetOtherNode(NodeID);
        }
 static void Map(
     this Dictionary <InstanceID, InstanceID> map,
     SegmentRecord segmentData,
     ushort nodeID,
     ushort targetSegmentID)
 {
     if (segmentData.StartNodeID == nodeID)
     {
         map.Map(segmentData, nodeID, true, targetSegmentID);
     }
     else if (segmentData.EndNodeID == nodeID)
     {
         map.Map(segmentData, nodeID, false, targetSegmentID);
     }
 }
 public static void Prefix(ushort segment)
 {
     if (UpgradingSegmentData != null)
     {
         KianCommons.Log.Error("Unexpected UpgradingSegmentData != null");
         UpgradingSegmentData = null;
     }
     if (m_upgrading)
     {
         UpgradingSegmentData = SegmentRecord.Create(segment, man_);
     }
     Log.Debug($"ReleaseSegment.Prefix({segment})\n" + Environment.StackTrace);
     if (man_ is IReleaser releaser)
     {
         releaser.Release(new InstanceID {
             NetSegment = segment
         });
         releaser.Release(InstanceIDExtension.SegmentEnd(segment, true));
         releaser.Release(InstanceIDExtension.SegmentEnd(segment, false));
     }
 }
Пример #9
0
        public bool Purchase(MsgInformationEx MsgDTO)
        {
            var segment = SegmentRecord.Get(MsgDTO.FromQQ);

            if (string.IsNullOrEmpty(segment.Segment))
            {
                MsgSender.PushMsg(MsgDTO, "你尚未持有任何宝藏碎片!");
                return(false);
            }

            if (segment.IsRare)
            {
                MsgSender.PushMsg(MsgDTO, "你的宝藏碎片已经是稀有碎片了!");
                return(false);
            }

            segment.IsRare = true;
            segment.Update();
            MsgSender.PushMsg(MsgDTO, "升级成功!");
            return(true);
        }