public void Interact(Character character) { var newDoorDest = State == DoorState.Opened ? ClosedBounds : OpenBounds; var charactersThatWillTouchNewDest = SpaceTime.CurrentSpaceTime.Elements.WhereAs <Character>().Where(c => c.OverlapPercentage(newDoorDest) > 0).Count(); if (charactersThatWillTouchNewDest == 0) { if (state == DoorState.Locked) { OnPlayerTriedToOpenLockedDoor.Fire(); } else { State = State == DoorState.Closed ? DoorState.Opened : DoorState.Closed; } } }
public Task Interact(Character character) { throttler = throttler ?? new TimeThrottler(() => { var newDoorDest = State == DoorState.Opened ? ClosedBounds : OpenBounds; if (state == DoorState.Locked) { OnPlayerTriedToOpenLockedDoor.Fire(); } else { State = State == DoorState.Closed ? DoorState.Opened : DoorState.Closed; foreach (var c in SpaceTime.CurrentSpaceTime.Elements.WhereAs <Character>().Where(c => c.OverlapPercentage(newDoorDest) > 0)) { c.NudgeFree(optimalAngle: c.Velocity.Angle); } } }, this.Lifetime); throttler.Invoke(); return(Task.CompletedTask); }