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); }
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); }
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; }
public void StepNumberChangeNotify() { foreach (var bind in BindMatrix.GetAllAdjacentBinds(this)) { if (bind.First == this && bind.Second is NodeBlock nodeBlock) { nodeBlock._stepNumberDirty = true; } } }
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(); }
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)); }
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); }
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); }
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); }
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; }
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; }
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()); } }; }
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); }
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; } } }
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); } } } }
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(); }
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(); } }
protected override void StartInit() { base.StartInit(); view.SetInitialModel(BlockVisualBase.Model.Root); BindMatrix.AddBind(StaticAnchor.Create(logic.Position), this, Vector2.zero, Bind.BlockBindStrength); }
public void Break() { BindMatrix.RemoveBind(First, Second); }