Example #1
0
        private void Add <MachineAction>()
            where MachineAction : MachineActionBase, new()
        {
            var action = new MachineAction();

            _machineActions.Add(action);
        }
Example #2
0
        private static void RaiseTransitionStatusEvent(MachineAction action)
        {
            if (StatusManagerActivtyEvent != null)
            {
                var args = new ActivityEventHandlerArgs();
                args.ThisTransitionState = _currentTransitionState;
                args.ActivityAction = action;
                args.EventRaiseTime = DateTime.UtcNow;

                StatusManagerActivtyEvent.Invoke(null, args);
            }
        }
        public IEnumerable <IEnumerable <ObjectRequest> > Eject(IMachineInformation machineInfo, IEnumerable <ObjectRequest> items, Vector2 outputTile, out MachineAction doEject)
        {
            State state = machineInfo.GetState <State>();

            // Check if not done
            if (!(state.Processing && (SDateTime.Now - state.StartTime).TotalMinutes >= 60))
            {
                doEject = null;
                return(null);
            }

            // If the machine actually ejects something, make sure to update the state of the machine
            doEject = payload => state.Processing = false;

            // Return a new diamond payload
            return(new ObjectRequest(new Object(Vector2.Zero, Objects.Diamond, 1)).Yield().Yield());
        }
        public IEnumerable <IEnumerable <ObjectRequest> > Accept(IMachineInformation machineInfo, IEnumerable <ObjectRequest> items, Vector2 inputTile, out MachineAction doAccept)
        {
            State state = machineInfo.GetState <State>();

            // Check if already processing
            if (state.Processing)
            {
                doAccept = default;
                return(null);
            }

            // Get all available stone
            IEnumerable <ObjectRequest> stone = items.Where(i => i.Item.ParentSheetIndex == Objects.Stone);

            // Create requests for up to 100 stone
            List <ObjectRequest> requests = new List <ObjectRequest>();
            int remaining = 100;

            foreach (ObjectRequest request in stone)
            {
                // Create a new request for stone
                if (request.Quantity <= remaining)
                {
                    // Requests are structs, so it's fine to just pass it around like this
                    requests.Add(request);
                    remaining -= request.Quantity;
                }
                else
                {
                    requests.Add(new ObjectRequest(request.Item, remaining));
                    remaining = 0;
                }

                // Check if reached 100 stone
                if (remaining == 0)
                {
                    // If the machine actually accepts something, make sure to update the state of the machine
                    doAccept = payload => {
                        state.Processing = true;
                        state.StartTime  = SDateTime.Now;
                    };

                    // Return the requested stone as a single payload
                    return(requests.AsEnumerable().Yield());
                }
            }

            // There isn't 100 stone available, so return null
            doAccept = default;
            return(null);
        }
Example #5
0
 public override void OnMachineAction(MachineId machineId, string currentStateName, string actionName)
 {
     base.OnMachineAction(machineId, currentStateName, actionName);
     MachineAction?.Invoke(machineId, currentStateName, actionName);
 }