예제 #1
0
        public async Task HandleAtomMessage(NetsyChannel channel, AtomMessage atomMessage)
        {
            //channel can be null
            Guard.NotNull(atomMessage, nameof(atomMessage));

            var netsyMessage = NetsyMessage.FromAtomMessage(atomMessage.Data);
            var package      = this._packageSerializer.Deserialize(netsyMessage.Data);

            switch (netsyMessage.Kind)
            {
            case NetsyMessageKind.SendPackage:
                this._handlerRegistry.HandlePackage(channel, package);
                break;

            case NetsyMessageKind.Request:
                var(success, response) = await this._handlerRegistry.HandleIncomingRequest(channel, package);

                if (success)
                {
                    var responseData = this._packageSerializer.Serialize(response);

                    var responseMessage = NetsyMessage.ResponseFor(responseData, netsyMessage.RequestId);
                    await this.SendMessageAsync(responseMessage);
                }
                break;

            case NetsyMessageKind.Response:
                this._handlerRegistry.HandleResponse(netsyMessage.RequestId, package);
                break;

            default:
                throw new ArgumentOutOfRangeException();
            }
        }
예제 #2
0
 public async Task OnMessageReceivedAsync(AtomMessage message)
 {
     foreach (var plugin in this._plugins)
     {
         await plugin.OnMessageReceivedAsync(message);
     }
 }
예제 #3
0
 public async Task OnChannelMessageReceivedAsync(AtomChannel channel, AtomMessage message)
 {
     foreach (var plugin in this._plugins)
     {
         await plugin.OnChannelMessageReceivedAsync(channel, message);
     }
 }
예제 #4
0
 public async Task OnSendingMessageAsync(AtomMessage message)
 {
     foreach (var plugin in this._plugins)
     {
         await plugin.OnSendingMessageAsync(message);
     }
 }
예제 #5
0
    public void UpdateModel(AtomModel model)
    {
        _model       = model;
        _atomMessage = new AtomMessage(_model.AtomicNumber, 1);

        _model.rMaxStockNextLevel.Subscribe(newValue => UIStockLabel.text = "+" + newValue.ToString()).AddTo(this);
        _model.rMaxStockUpgradePrice.Subscribe(newValue => UISCLabel.text = newValue.ToString()).AddTo(this);

        gameModel.User.rSC.Subscribe(SC => UIButton.interactable = SC >= _model.MaxStockUpgradePrice).AddTo(this);
    }
예제 #6
0
    internal void UpdateModel(AtomModel model)
    {
        _model            = model;
        _startTime        = Time.time;
        _originalMaxStock = _model.MaxStock;

        _atomMessage = new AtomMessage(_model.AtomicNumber, 1);

        AddReactor(timePercent);

        AddReactor
        (
            _model.rHarvestRate
            .Subscribe(rate =>
        {
            _model.Stock    = (int)(((float)_model.Stock / _model.MaxStock) * (_originalMaxStock * _model.HarvestRate));
            _model.MaxStock = (int)(_originalMaxStock * _model.HarvestRate);
            _harvestTime    = _model.AtomicWeight / _model.HarvestRate;
            _startTime      = -(timePercent.Value * _harvestTime) + Time.time;
        })
        );

        AddReactor
        (
            Observable.EveryUpdate()
            .Subscribe(_ => timePercent.Value = (Time.time - _startTime) / _harvestTime)
        );

        AddReactor
        (
            timePercent.Subscribe(percent => UISlider.value = UISlider.maxValue * percent)
        );

        AddReactor
        (
            _model.rStock.Where(_ => _model.Stock <= 0).Subscribe(_ => DestroyReactors())
        );

        AddReactor
        (
            timePercent
            .Where(value => value >= 1f)
            .Subscribe(_ =>
        {
            _startTime    = Time.time;
            _model.Stock -= 1;
            Messenger.Dispatch(AtomMessage.ATOM_HARVEST, _atomMessage);
        })
        );
    }
예제 #7
0
 public virtual Task OnChannelMessageReceivedAsync(AtomChannel channel, AtomMessage message)
 {
     return(Task.CompletedTask);
 }
예제 #8
0
 public virtual Task OnChannelSendingMessageAsync(AtomChannel channel, AtomMessage message)
 {
     return(Task.CompletedTask);
 }
예제 #9
0
 public virtual Task OnMessageReceivedAsync(AtomMessage message)
 {
     return Task.CompletedTask;
 }
예제 #10
0
 public virtual Task OnSendingMessageAsync(AtomMessage message)
 {
     return Task.CompletedTask;
 }
예제 #11
0
    private void SpendAtoms(AbstractMessage msg)
    {
        AtomMessage message = msg as AtomMessage;

        gameModel.AMM.SpendAtoms(message.SC);
    }
예제 #12
0
    private void AtomStockUpgrade(AbstractMessage msg)
    {
        AtomMessage message = msg as AtomMessage;

        gameModel.AMM.UpgradeAtomStock(message.AtomicNumber);
    }
예제 #13
0
    private void AtomHarvested(AbstractMessage message)
    {
        AtomMessage data = message as AtomMessage;

        gameModel.AMM.HarvestAtom(data.AtomicNumber);
    }
예제 #14
0
 public AtomMessage ToAtomMessage()
 {
     return(AtomMessage.FromData(this.GetData()));
 }