Ejemplo n.º 1
0
    private void OnEnable()
    {
        G.Engine.Computer(cd, new object[] { isFiring, currentDelay, G.Tick }, () =>
        {
            if (isFiring)
            {
                float tmp = currentDelay - G.Tick.Reduced;
                while (tmp < 0)
                {
                    tmp += delay;
                    fire.Fire(Empty.Instance);
                }
                currentDelay.Write(tmp);
            }
            else
            {
                currentDelay.Write(Mathf.Max(0, currentDelay - G.Tick.Reduced));
            }
        });
        G.Engine.Computer(cd, new object[] { isManualFiring, ai.IsGunFiring }, () =>
        {
            isFiring.Write(isManualFiring || ai.IsGunFiring);
        });

        G.Engine.Reader(cd, new object[] { fire }, () =>
        {
            for (int i = 0, n = fire.Count; i < n; ++i)
            {
                var b = Instantiate(bullet, transform.position, transform.rotation);
                W.Mark(b, "active");
                b.SetActive(true);
            }
        });
    }
Ejemplo n.º 2
0
        public void Setup(CompositeDisposable cd, IEngine engine, State state)
        {
            Scene.Setup(cd, engine, state.SceneStack);

            engine.Worker(cd, Dep.On(Scene.Open, state.Inventory.Items), () =>
            {
                Item openItem;
                if (Scene.Open.TryRead(out openItem))
                {
                    Item.Write(openItem);
                }
                else
                {
                    var item  = Item.Read();
                    var items = state.Inventory.Items.Read();
                    if (item != null && !items.Contains(item))
                    {
                        Item.Write(null);
                    }
                }
            });
            engine.Worker(cd, Dep.On(Scene.State, Item), () =>
            {
                if (Scene.State == SceneState.Opened && Item.Read() == null)
                {
                    Scene.Close.Fire(Empty.Instance);
                }
            });
        }
Ejemplo n.º 3
0
        public void Setup(CompositeDisposable cd, IEngine engine, SceneStack sceneStack)
        {
            Dialog.Setup(cd, engine, sceneStack);

            engine.Worker(cd, Dep.On(Status, Trigger), () =>
            {
                if (Trigger && Status)
                {
                    Dialog.Open.Fire(Empty.Instance);
                }
            });
            engine.Worker(cd, Dep.On(Status, Trigger, Yes, No), () =>
            {
                T value;
                if (!Status || Yes || No)
                {
                    Current.Write(default(T));
                }
                else if (Trigger.TryRead(out value))
                {
                    Current.Write(value);
                }
            });
            engine.Worker(cd, Dep.On(Status, Trigger), () =>
            {
                T value;
                if (Trigger.TryRead(out value) && !Status)
                {
                    Rejected.Fire(value);
                }
            });
            engine.Worker(cd, Dep.On(Status, Dialog.State, Yes, No), () =>
            {
                if (!Status && Dialog.State == SceneState.Opened)
                {
                    Dialog.Close.Fire(Empty.Instance);
                }
                else if (Yes || No)
                {
                    Dialog.Close.Fire(Empty.Instance);
                }
            });

            engine.Worker(cd, Dep.On(Status, Yes), () =>
            {
                if (Yes && !Status)
                {
                    throw new InvalidOperationException();
                }
            });
        }
Ejemplo n.º 4
0
    private void OnEnable()
    {
        G.Engine.Computer(cd, new object[] { G.Tick, G.Restart }, () =>
        {
            var r = rotation.Read();
            if (G.Restart)
            {
                r = Quaternion.identity;
            }
            if (G.Tick)
            {
                r *= Quaternion.Euler(new Vector3(0, 0, 45) * G.Tick.Reduced);
            }
            // Can write directly to transform,
            // just need to to use register listener.
            // But use computer here to demonstrate how to delegate
            // heavy computation to compute thread
            rotation.Write(r);
        });

        G.Engine.Reader(cd, new object[] { rotation }, () =>
        {
            transform.rotation = rotation;
        });
    }
Ejemplo n.º 5
0
    private void Update()
    {
        if (!G.IsGameRunning)
        {
            return;
        }

        bool f = Input.GetButton("Fire1");

        isManualFiring.Write(f);
    }
Ejemplo n.º 6
0
        public void Setup(CompositeDisposable cd, IEngine engine)
        {
            var state = this;

            Home.Setup(cd, engine, state);
            Inventory.Setup(cd, engine, state);
            SimpleLoading.Setup(cd, engine, state.SceneStack);

            SceneStack.Setup(cd, engine);

            engine.Worker(cd, Dep.On(Inventory.UpgradeItem.Yes, Inventory.SellItem.Yes), () =>
            {
                Gold.Write(Gold
                           - 10 * (Inventory.UpgradeItem.Yes ? 1 : 0)
                           + 5 * (Inventory.SellItem.Yes ? 1 : 0)
                           );
            });
            engine.Worker(cd, Dep.On(SimpleLoading.State,
                                     Home.Scene.State, Inventory.Scene.State,
                                     Inventory.UpgradeItem.Dialog.State), () =>
            {
                bool needLoading = Home.Scene.State == SceneState.Opening ||
                                   Inventory.Scene.State == SceneState.Opening ||
                                   Inventory.UpgradeItem.Dialog.State == SceneState.Opening;

                if (SimpleLoading.State == SceneState.Closed && needLoading)
                {
                    SimpleLoading.Open.Fire(Empty.Instance);
                }
                else if (SimpleLoading.State == SceneState.Opened && !needLoading)
                {
                    SimpleLoading.Close.Fire(Empty.Instance);
                }
            });
            engine.Worker(cd, Dep.On(SceneStack.ActiveScenes), () =>
            {
                var active = SceneStack.ActiveScenes.Read();
                ShouldShowBack.Write(active.Count > 1 && active[active.Count - 1].BackAutoClose);
            });
        }
Ejemplo n.º 7
0
        public void Setup(CompositeDisposable cd, IEngine engine, State state)
        {
            Scene.Setup(cd, engine, state.SceneStack);

            engine.Worker(cd, Dep.On(SelectedTab.Raw, state.Inventory.Scene.Open), () =>
            {
                if (state.Inventory.Scene.Open && CanOpenMore)
                {
                    SelectedTab.Write("tab_more");
                }
                else
                {
                    SelectedTab.Write(SelectedTab.Raw);
                }
            });
            engine.Worker(cd, Dep.On(state.Inventory.Scene.Open), () =>
            {
                if (state.Inventory.Scene.Open)
                {
                    CanOpenMore.Write(true);
                }
            });
        }
Ejemplo n.º 8
0
    private void OnEnable()
    {
        Engine.Computer(cd, new object[] { StartGame, Restart }, () =>
        {
            if (StartGame)
            {
                IsGameRunning.Write(true);
            }
            else if (Restart)
            {
                IsGameRunning.Write(false);
            }
        });
        Engine.Computer(cd, new object[] { AddItem }, () =>
        {
            TotalItemCount.Write(TotalItemCount + AddItem.Count);
        });

        Engine.Firer(cd, new object[] { TouchEnemy }, () =>
        {
            if (TouchEnemy && !IsWinning)
            {
                Restart.Fire(Empty.Instance);
            }
        });

        {
            var requested = new List <GameObject>();
            Engine.Guarder(cd,
                           new object[] { Tick, RequestDestroy },
                           () =>
            {
                if (Tick)
                {
                    GameObject stillAlive = null;
                    for (int i = 0, n = requested.Count; i < n; ++i)
                    {
                        if (requested[i])
                        {
                            stillAlive = requested[i];
                            break;
                        }
                    }
                    if (stillAlive)
                    {
                        Debug.LogWarning("Requested to destroy but still alive", stillAlive);
                    }
                    requested.Clear();
                }

                requested.AddRange(RequestDestroy.Read());
            }
                           );
        }
        Engine.Guarder(cd, new object[] { Restart, IsGameRunning }, () =>
        {
            if (Restart && !IsGameRunning)
            {
                throw new InvalidOperationException();
            }
        });
    }
    private void OnEnable()
    {
        G.Engine.Computer(cd, new object[] { G.PickUp, G.Restart }, () =>
        {
            if (G.Restart)
            {
                Score.Write(0);
            }
            else
            {
                Score.Write(Score + G.PickUp.Count);
            }
        });
        G.Engine.Computer(cd, new object[] { Score, G.TotalItemCount }, () =>
        {
            G.IsWinning.Write(Score >= G.TotalItemCount);
        });

        G.Engine.Reader(cd, new object[] { Score, G.TotalItemCount }, () =>
        {
            countText.text = string.Format("Count: {0} / {1}",
                                           Score, G.TotalItemCount);
        });
        G.Engine.Reader(cd, new object[] { Score, G.TotalItemCount }, () =>
        {
            if (Score >= G.TotalItemCount)
            {
                winText.text = "You win!";
            }
            else
            {
                winText.text = "";
            }
        });
        {
            bool      canRestart    = false;
            Coroutine lastCoroutine = null;
            cd.Add(new DisposableAction(() =>
            {
                if (lastCoroutine != null)
                {
                    G.Instance.StopCoroutine(lastCoroutine);
                }
            }));
            G.Engine.Reader(cd, new object[] { Score, G.TotalItemCount }, () =>
            {
                if (Score < G.TotalItemCount)
                {
                    canRestart = true;
                }
                if (Score >= G.TotalItemCount && canRestart)
                {
                    canRestart = false;
                    if (lastCoroutine != null)
                    {
                        G.Instance.StopCoroutine(lastCoroutine);
                    }
                    lastCoroutine = G.Instance.StartCoroutine(WaitThenRestart(G.Restart));
                }
            });
        }

        G.Engine.Writer(cd, new object[] { G.Tick, G.Restart }, () =>
        {
            if (G.Restart)
            {
                transform.position = orgPos;
            }
            Position.Write(transform.position);
        });
        G.Engine.Writer(cd, new object[] { G.Tick, G.IsGameRunning }, () =>
        {
            var v = Vector2.zero;
            if (G.IsGameRunning)
            {
                v.x = Input.GetAxis("Horizontal");
                v.y = Input.GetAxis("Vertical");
            }
            movement.Write(v);
        });
    }
Ejemplo n.º 10
0
        public void Setup(CompositeDisposable cd, IEngine engine)
        {
            if (rawResponse != null)
            {
                engine.Worker(cd, Dep.On(rawResponse), () =>
                {
                    string raw;
                    if (rawResponse.TryRead(out raw))
                    {
                        var res = default(TRes);
                        if (responseParser != null)
                        {
                            res = responseParser(raw);
                        }
                        Response.Fire(res);
                    }
                });
            }
            engine.Worker(cd, Dep.On(Request, Response, Error), () =>
            {
                int result = Requesting - (Response ? 1 : 0) - (Error ? 1 : 0);
                switch (pipe)
                {
                case HttpPipe.Multiple:
                    result += Request ? 1 : 0;
                    break;

                case HttpPipe.SingleFirst:
                case HttpPipe.SingleLast:
                    result += Requesting > 0 ? 0 : Math.Min(1, Request ? 1 : 0);
                    break;
                }
                if (result < 0)
                {
                    throw new NotImplementedException();
                }
                else if (pipe.IsSingle() && result > 1)
                {
                    throw new NotImplementedException();
                }
                Requesting.Write(result);
            });

            engine.Mainer(cd, Dep.On(Request), () =>
            {
                TReq req;
                if (Request.TryRead(out req))
                {
                    if (pipe == HttpPipe.SingleFirst && Requesting > 0)
                    {
                        UnityEngine.Debug.LogWarning("Skip a HTTP request, because of single on: " + url);
                        UnityEngine.Debug.LogWarning("Request: " + req);
                    }
                    else
                    {
                        if (pipe == HttpPipe.SingleLast && Requesting > 0)
                        {
                            UnityEngine.Debug.LogWarning("Stop previous HTTP request, because of single on: " + url);
                            UnityEngine.Debug.LogWarning("New request: " + req);
                            HttpMain.Instance.StopCoroutine(lastExec);
                        }
                        lastExec = HttpMain.Instance.StartCoroutine(Exec(req));
                    }
                }
            });
        }