private void Add <MachineAction>() where MachineAction : MachineActionBase, new() { var action = new MachineAction(); _machineActions.Add(action); }
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); }
public override void OnMachineAction(MachineId machineId, string currentStateName, string actionName) { base.OnMachineAction(machineId, currentStateName, actionName); MachineAction?.Invoke(machineId, currentStateName, actionName); }