コード例 #1
0
    static void DragFromTo(int fromX, int fromY, int toX, int toY)
    {
        if (!FieldMatrix.Get(fromX, fromY, out var fromBlock))
        {
            return;
        }
        if (FieldMatrix.Get(toX, toY, out var toBlock))
        {
            var bind           = BindMatrix.GetBind(fromBlock, toBlock);
            var newBlockOffset = new Vector2(toX - fromX, toY - fromY);
            if (bind == null)
            {
                BindMatrix.AddBind(fromBlock, toBlock, newBlockOffset, Bind.BlockBindStrength);
                return;
            }

            if (bind.First != fromBlock)
            {
                if (!(fromBlock is RootBlock) && BindMatrix.GetOutBindsCount(fromBlock) == 0)
                {
                    fromBlock.Destroy();
                    return;
                }

                bind.Break();
                BindMatrix.AddBind(fromBlock, toBlock, newBlockOffset, Bind.BlockBindStrength);
                return;
            }
            return;
        }
        NodeBlock.Create(toX, toY, fromBlock);
    }
コード例 #2
0
ファイル: NodeBlock.cs プロジェクト: makscee/prototype-1
    public static NodeBlock Create(int x, int y, Block boundWith)
    {
        var b = Create(x, y, boundWith.rootId);

        BindMatrix.AddBind(boundWith, b, b.logic.Position - boundWith.logic.Position, Bind.BlockBindStrength);
        return(b);
    }
コード例 #3
0
    protected virtual void Update()
    {
        if (!Movable)
        {
            return;
        }
        var maxSpeedChange = MaxAcceleration * Time.deltaTime;

        foreach (var bind in BindMatrix.GetAllAdjacentBinds(this))
        {
            var v = bind.GetTarget(this) - GetPosition();
            var f = v * (bind.Strength * Bind.StrengthMultiplier);

            DesiredVelocity += f;
        }
        if (!IsAnchored)
        {
            const float radius = 0.1f;
            const float speed  = 1f;
            var         t      = Time.time;
            DesiredVelocity += new Vector2(Mathf.Cos(t * speed) * radius, Mathf.Sin(t * speed) * radius);
        }
        Velocity            = Vector2.MoveTowards(Velocity, DesiredVelocity, maxSpeedChange);
        transform.position += (Vector3)Velocity * (Time.deltaTime);
        DesiredVelocity     = Vector2.zero;
    }
コード例 #4
0
ファイル: NodeBlock.cs プロジェクト: makscee/prototype-1
 public void StepNumberChangeNotify()
 {
     foreach (var bind in BindMatrix.GetAllAdjacentBinds(this))
     {
         if (bind.First == this && bind.Second is NodeBlock nodeBlock)
         {
             nodeBlock._stepNumberDirty = true;
         }
     }
 }
コード例 #5
0
ファイル: NodeBlock.cs プロジェクト: makscee/prototype-1
 protected override void StartInit()
 {
     base.StartInit();
     view.SetInitialModel(BlockVisualBase.Model.NodeDeadend);
     view.onRefresh += () =>
     {
         view.VisualBase.Select(BindMatrix.GetOutBindsCount(this) == 0
             ? BlockVisualBase.Model.NodeDeadend
             : BlockVisualBase.Model.NodePipe);
         view.SecondaryPainter.NumInPalette = logic.HasPulse ? 3 : CheckerboardColor;
     };
     view.SetDirty();
 }
コード例 #6
0
ファイル: NodeBlock.cs プロジェクト: makscee/prototype-1
    void OnPulseDeadEnd(Block from)
    {
        if (from == null || BindMatrix.GetOutBindsCount(this) != 0)
        {
            return;
        }
        var dir  = Utils.DirFromCoords(logic.Position - from.logic.Position);
        var root = Roots.Root[rootId].block;

        root.soundsPlayer.Play(dir);
        PixelDriver.Add(PixelRoad.Circle(root.view.PrimaryPainter.palette.GetColor(dir),
                                         2f, 3f, 0.05f, 0.5f, logic.X, logic.Y).SetWeight(0.3f));
    }
コード例 #7
0
    public static RootBlock Create(int x, int y, int rootId = -1)
    {
        rootId = rootId == -1 ? Roots.Count : rootId;
        var b = Instantiate(Prefabs.Instance.rootBlock, Roots.Root[rootId].rootCanvas.transform).GetComponent <RootBlock>();

        b.rootId = rootId;
        b.logic.SetCoords(x, y);
        b.transform.position = b.logic.Position;
        b.StartInit();
        BindMatrix.AddBind(StaticAnchor.Create(b.logic.Position), b, Vector2.zero, Bind.BlockStaticBindStrength);
        b.view.SetDirty();
        return(b);
    }
コード例 #8
0
ファイル: GameSerialized.cs プロジェクト: makscee/prototype-1
    public static GameSerialized Create()
    {
        var result = new GameSerialized
        {
            NodeBlocks    = new List <NodeBlockSerialized>(),
            RootBlocks    = new List <RootBlockSerialized>(),
            Binds         = new List <BindSerialized>(),
            SoundsPlayers = new List <SoundsPlayerSerialized>(),
        };

        foreach (var block in FieldMatrix.GetAllAsList())
        {
            switch (block)
            {
            case NodeBlock nodeBlock:
            {
                if (NodeBlockSerialized.Create(nodeBlock, out var t))
                {
                    result.NodeBlocks.Add(t);
                }
                break;
            }

            case RootBlock rootBlock:
            {
                if (RootBlockSerialized.Create(rootBlock, out var t))
                {
                    result.RootBlocks.Add(t);
                }
                break;
            }
            }
        }
        foreach (var bind in BindMatrix.GetAllAsList())
        {
            if (BindSerialized.Create(bind, out var t))
            {
                result.Binds.Add(t);
            }
        }
        foreach (var root in Roots.Root.Values)
        {
            if (SoundsPlayerSerialized.Create(root.block.soundsPlayer, root.block.rootId, out var t))
            {
                result.SoundsPlayers.Add(t);
            }
        }
        return(result);
    }
コード例 #9
0
ファイル: NodeBlock.cs プロジェクト: makscee/prototype-1
    bool CheckAlone()
    {
        var result = true;

        foreach (var adjacentBind in BindMatrix.GetAllAdjacentBinds(this))
        {
            if (adjacentBind.First is Block && adjacentBind.First != this ||
                adjacentBind.Second is Block && adjacentBind.Second != this)
            {
                result = false;
                break;
            }
        }

        return(result);
    }
コード例 #10
0
ファイル: BlockPhysics.cs プロジェクト: makscee/prototype-1
    void Update()
    {
        var maxSpeedChange = MaxAcceleration * Time.deltaTime;
        // _velocity = Vector2.ClampMagnitude(parent.logic.Position - Position, 50f);
        var bindStrengthDivisor = 1f / BindMatrix.GetBindsCount(parent);

        foreach (var bind in BindMatrix.GetAllAdjacentBinds(parent))
        {
            var v = bind.GetTarget(parent) - Position;
            var f = v * (bind.Strength * bindStrengthDivisor * Bind.StrengthMultiplier);

            _desiredVelocity += f;
        }
        _velocity = Vector2.MoveTowards(_velocity, _desiredVelocity, maxSpeedChange);
        parent.transform.position += (Vector3)_velocity * Time.deltaTime;
        _desiredVelocity           = Vector2.zero;
    }
コード例 #11
0
 protected override void OnEnable()
 {
     logic.onTap += e =>
     {
         if (BindMatrix.GetOutBindsCount(this) == 0)
         {
             var v = logic.Position + Utils.CoordsFromDir(rootId % 4);
             NodeBlock.Create(Mathf.RoundToInt(v.x), Mathf.RoundToInt(v.y), this);
         }
         else
         {
             logic.ReceivePulse();
         }
     };
     view.onRefresh  += () => view.SecondaryPainter.NumInPalette = logic.HasPulse ? 3 : 2;
     logic.stepNumber = 0;
 }
コード例 #12
0
ファイル: Block.cs プロジェクト: makscee/prototype-1
 protected virtual void OnEnable()
 {
     logic.onBeginDrag += eventData =>
     {
         if (eventData.button == PointerEventData.InputButton.Right)
         {
             BindMatrix.AddBind(this, MouseBind.Get(), Vector2.zero, Bind.MouseBindStrength);
         }
     };
     logic.onEndDrag += eventData =>
     {
         if (eventData.button == PointerEventData.InputButton.Right)
         {
             BindMatrix.RemoveBind(this, MouseBind.Get());
         }
     };
 }
コード例 #13
0
ファイル: NodeBlock.cs プロジェクト: makscee/prototype-1
    public static NodeBlock Create(int x, int y, int rootId = 0, float startOffsetClamp = 0f)
    {
        var position      = new Vector2(x, y);
        var startPosition = position + Vector2.ClampMagnitude(Roots.Root[rootId].block.logic.Position - position, startOffsetClamp);
        var b             = Instantiate(Prefabs.Instance.nodeBlock, startPosition, Quaternion.identity, Roots.Root[rootId].rootCanvas.transform).GetComponent <NodeBlock>();

        b.rootId = rootId;
        b.logic.SetCoords(x, y);
        b.StartInit();
        var startModel = b.view.VisualBase.Current;

        Animator.Interpolate(0.4f, 1f, 0.4f)
        .PassValue(v => startModel.transform.localScale = new Vector3(v, v, 1))
        .Type(InterpolationType.InvSquare).NullCheck(startModel.gameObject);
        BindMatrix.AddBind(StaticAnchor.Create(b.logic.Position, false), b, Vector2.zero, Bind.BlockStaticBindStrength);
        Roots.Root[rootId].DeadEndsSetDirty();
        return(b);
    }
コード例 #14
0
ファイル: NodeBlock.cs プロジェクト: makscee/prototype-1
 void UpdateDirs()
 {
     if (!DeadEnd)
     {
         for (var i = 0; i < 4; i++)
         {
             dirs[i] = false;
         }
         return;
     }
     foreach (var bind in BindMatrix.GetAllAdjacentBinds(this))
     {
         if (bind.First is Block block && bind.Second == this)
         {
             dirs[Utils.DirFromCoords(logic.Position - block.logic.Position)] = true;
         }
     }
 }
コード例 #15
0
    public void PulseConnectionUpdate()
    {
        pulseVersionDirty = false;
        pulseVersion++;

        var queue = new Queue <Block>();

        queue.Enqueue(this);
        while (queue.Count > 0)
        {
            var next = queue.Dequeue();
            next.pulseVersion = pulseVersion;
            foreach (var bind in BindMatrix.GetAllAdjacentBinds(next))
            {
                if (bind.First == next && bind.Second is Block block && block.pulseVersion != pulseVersion && block.rootId == rootId)
                {
                    queue.Enqueue(block);
                }
            }
        }
    }
コード例 #16
0
ファイル: NodeBlock.cs プロジェクト: makscee/prototype-1
    public void RefreshStepNumber()
    {
        var t = int.MaxValue / 2;

        if (PulseConnected)
        {
            foreach (var bind in BindMatrix.GetAllAdjacentBinds(this))
            {
                if (bind.Second == this && bind.First is Block block)
                {
                    t = Math.Min(t, block.logic.stepNumber + 1);
                }
            }
        }

        if (t == logic.stepNumber)
        {
            return;
        }
        logic.stepNumber = t;
        view.SetText(logic.stepNumber.ToString());
        StepNumberChangeNotify();
    }
コード例 #17
0
ファイル: GameSerialized.cs プロジェクト: makscee/prototype-1
    public void Deserialize()
    {
        foreach (var rb in RootBlocks)
        {
            rb.Deserialize();
        }
        foreach (var bs in NodeBlocks)
        {
            bs.Deserialize();
        }

        foreach (var bs in Binds)
        {
            FieldMatrix.Get(bs.FirstX, bs.FirstY, out var first);
            FieldMatrix.Get(bs.SecondX, bs.SecondY, out var second);
            var offset = new Vector2(bs.SecondX - bs.FirstX, bs.SecondY - bs.FirstY);
            BindMatrix.AddBind(first, second, offset, bs.Strength);
        }

        foreach (var sps in SoundsPlayers)
        {
            sps.Deserialize();
        }
    }
コード例 #18
0
 protected override void StartInit()
 {
     base.StartInit();
     view.SetInitialModel(BlockVisualBase.Model.Root);
     BindMatrix.AddBind(StaticAnchor.Create(logic.Position), this, Vector2.zero, Bind.BlockBindStrength);
 }
コード例 #19
0
 public void Break()
 {
     BindMatrix.RemoveBind(First, Second);
 }