Advertisement
Guest User

Untitled

a guest
Jun 1st, 2013
108
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C# 10.12 KB | None | 0 0
  1. public class EncounterSession : IEncounterTransitionHandler
  2.     {
  3.         // Dependencies
  4.         public IResourceGenerator ResourceGeneratorExtension { get; set; }
  5.  
  6.         // Privates
  7.         private TransitioningStateNavigator navigator;
  8.         private TransitioningGraph encounterStateGraph;
  9.  
  10.         // Properties
  11.  
  12.         private readonly Encounter _encounter;
  13.         public Encounter Encounter
  14.         {
  15.             get { return _encounter; }
  16.         }
  17.  
  18.         private readonly IList<Supply> _supplies;
  19.         public IList<Supply> Supplies
  20.         {
  21.             get { return _supplies; }
  22.         }
  23.  
  24.         private IReadOnlyCollection<Resource> _resources;
  25.         public IReadOnlyCollection<Resource> Resources
  26.         {
  27.             get { return _resources; }
  28.             private set { _resources = value; }
  29.         }
  30.  
  31.         private IList<Task> _resolvedTasks;
  32.         public IList<Task> ResolvedTasks
  33.         {
  34.             get { return _resolvedTasks; }
  35.         }
  36.  
  37.         // Meta - Properties
  38.         public IEnumerable<Task> RemainingTasks
  39.         {
  40.             get { return Encounter.Tasks.Except(ResolvedTasks); }
  41.         }
  42.  
  43.         public string CurrentState
  44.         {
  45.             get
  46.             {
  47.                 return navigator.CurrentState.ToString();
  48.             }
  49.         }
  50.  
  51.         public EncounterSession(Encounter encounter, IList<Supply> supplies)
  52.             : base()
  53.         {
  54.             _encounter = encounter;
  55.             _supplies = supplies;
  56.  
  57.             _resolvedTasks = new List<Task>();
  58.  
  59.             encounterStateGraph = new EncounterGraph(this);
  60.             navigator = new TransitioningStateNavigator(encounterStateGraph);
  61.         }
  62.  
  63.         protected EncounterSession()
  64.         {
  65.             _resolvedTasks = new List<Task>();
  66.         }
  67.  
  68.         public bool RollAllowed(State beginState, State endState)
  69.         {
  70.             return (Supplies.Count == 0 || !ResolvedTasks.OrderBy(t => t).SequenceEqual(Encounter.Tasks.OrderBy(t => t)));
  71.         }
  72.  
  73.         public void Roll()
  74.         {
  75.             Contract.Requires(ResourceGeneratorExtension != null);
  76.  
  77.             Resources = ResourceGeneratorExtension.GenerateResourcesFromSupplySet(Supplies);
  78.             foreach (Resource r in Resources)
  79.                 Debug.WriteLine(r.ToString());
  80.         }
  81.  
  82.         public bool AnyTaskCanBeResolved(State beginState, State endState)
  83.         {
  84.             return RemainingTasks.Any(t => TaskCanBeResolved(t));
  85.         }
  86.  
  87.         public void ResolveTask()
  88.         {
  89.             throw new NotImplementedException();
  90.         }
  91.  
  92.         public bool DiscardAllowed(State beginState, State endState)
  93.         {
  94.             throw new NotImplementedException();
  95.         }
  96.  
  97.         public void ResolveDiscard()
  98.         {
  99.             throw new NotImplementedException();
  100.         }
  101.  
  102.         public bool EncounterEligableForCompletion(State beginState, State endState)
  103.         {
  104.             throw new NotImplementedException();
  105.         }
  106.  
  107.         public void CompleteEncounter()
  108.         {
  109.             throw new NotImplementedException();
  110.         }
  111.  
  112.         public bool FailureIsEnsured(State beginState, State endState)
  113.         {
  114.             throw new NotImplementedException();
  115.         }
  116.  
  117.         public void FailEncounter()
  118.         {
  119.             throw new NotImplementedException();
  120.         }
  121.  
  122.         public bool EncounterOutcomeIsSatisfied(State beginState, State endState)
  123.         {
  124.             throw new NotImplementedException();
  125.         }
  126.  
  127.         public void CleanupEncounter()
  128.         {
  129.             throw new NotImplementedException();
  130.         }
  131.  
  132.         private bool TaskCanBeResolved(Task t)
  133.         {
  134.             IEnumerable<Glyph> requirements = t.Objectives.Cast<Glyph>().OrderBy(k => k.Name);
  135.             IEnumerable<Glyph> candidates = Resources.Cast<Glyph>().OrderBy(k => k.Name);
  136.  
  137.             IEnumerable<Glyph> zeroCountCandidates = candidates.Where(c => c.Count == 0);
  138.             IEnumerable<Glyph> zeroCountRequirements = requirements.Where(r => r.Count == 0);
  139.  
  140.             List<Glyph> remainingCandidates = zeroCountCandidates.ToList();
  141.  
  142.             if (zeroCountCandidates.Count() < zeroCountRequirements.Count())
  143.             {
  144.                 return false;
  145.             }
  146.  
  147.             foreach (var r in zeroCountRequirements)
  148.             {
  149.                 if (!remainingCandidates.Contains(r))
  150.                 {
  151.                     return false;
  152.                 }
  153.                 else
  154.                 {
  155.                     remainingCandidates.Remove(r);
  156.                 }
  157.             }
  158.  
  159.             IEnumerable<Glyph> nonZeroCountCandidates = candidates.Where(c => c.Count > 0);
  160.             IEnumerable<Glyph> nonZeroCountRequirements = requirements.Where(r => r.Count > 0);
  161.  
  162.             var perms = nonZeroCountCandidates.Permutations();
  163.  
  164.             foreach (var perm in perms)
  165.             {
  166.                 bool isViableSolution = true;
  167.  
  168.                 remainingCandidates = perm.ToList();
  169.  
  170.                 foreach (var requirement in nonZeroCountRequirements)
  171.                 {
  172.                     int countThreshold = requirement.Count;
  173.                     while (countThreshold > 0)
  174.                     {
  175.                         if (remainingCandidates.Count() == 0)
  176.                         {
  177.                             isViableSolution = false;
  178.                             break;
  179.                         }
  180.  
  181.                         var c = remainingCandidates[0];
  182.                         countThreshold -= c.Count;
  183.  
  184.                         remainingCandidates.Remove(c);
  185.                     }
  186.                 }
  187.  
  188.                 if (isViableSolution)
  189.                 {
  190.                     return true;
  191.                 }
  192.             }
  193.  
  194.             return false;
  195.         }
  196.  
  197.  
  198.     }
  199.  
  200.  
  201.  public class EncounterGraph : TransitioningGraph
  202.     {
  203.         private static State preRoll;
  204.         private static State rolled;
  205.         private static State taskResolved;
  206.         private static State discarded;
  207.         private static State resolved;
  208.         private static State failed;
  209.         private static State completed;
  210.  
  211.         static EncounterGraph()
  212.         {
  213.             preRoll = new State("Waiting for roll");
  214.             rolled = new State("Rolled");
  215.             taskResolved = new State("Task completed");
  216.             discarded = new State("Discarded");
  217.             resolved = new State("Encounter resolved");
  218.             failed = new State("Encounter failed");
  219.             completed = new State("Encounter completed");
  220.         }
  221.  
  222.  
  223.         public EncounterGraph(IEncounterTransitionHandler handler)
  224.             : base(
  225.             states: new State[]
  226.                 {
  227.                     preRoll,
  228.                     rolled,
  229.                     taskResolved,
  230.                     discarded,
  231.                     resolved,
  232.                     failed,
  233.                     completed
  234.                 },
  235.             edges: new TransitionEdge[]
  236.                 {
  237.                     new TransitionEdge(
  238.                         beginState:    preRoll,
  239.                         endState:      rolled,
  240.                         canTransition: handler.RollAllowed,
  241.                         transition:    handler.Roll ),
  242.                     new TransitionEdge(
  243.                         beginState:    rolled,
  244.                         endState:      taskResolved,
  245.                         canTransition: handler.AnyTaskCanBeResolved,
  246.                         transition:    handler.ResolveTask),
  247.                     new TransitionEdge(
  248.                         beginState:    rolled,
  249.                         endState:      discarded,
  250.                         canTransition: handler.DiscardAllowed,
  251.                         transition:    handler.ResolveDiscard),
  252.                     new TransitionEdge(
  253.                         beginState:    taskResolved,
  254.                         endState:      resolved,
  255.                         canTransition: handler.EncounterEligableForCompletion,
  256.                         transition:    handler.CompleteEncounter),
  257.                     new TransitionEdge(
  258.                         beginState:    discarded,
  259.                         endState:      failed,
  260.                         canTransition: handler.FailureIsEnsured,
  261.                         transition:    handler.FailEncounter),
  262.                     new TransitionEdge(
  263.                         beginState:    taskResolved,
  264.                         endState:      rolled,
  265.                         canTransition: handler.RollAllowed,
  266.                         transition:    handler.Roll),
  267.                     new TransitionEdge(
  268.                         beginState:    discarded,
  269.                         endState:      rolled,
  270.                         canTransition: handler.RollAllowed,
  271.                         transition:    handler.Roll),
  272.                     new TransitionEdge(
  273.                         beginState:    resolved,
  274.                         endState:      completed,
  275.                         canTransition: handler.EncounterOutcomeIsSatisfied,
  276.                         transition:    handler.CleanupEncounter),
  277.                     new TransitionEdge(
  278.                         beginState:    failed,
  279.                         endState:      completed,
  280.                         canTransition: handler.EncounterOutcomeIsSatisfied,
  281.                         transition:    handler.CleanupEncounter),
  282.                 },
  283.             start: preRoll) { }
  284.     }
  285.  
  286.  
  287.     public interface IEncounterTransitionHandler
  288.     {
  289.         bool RollAllowed(State beginState, State endState);
  290.         void Roll();
  291.  
  292.         bool AnyTaskCanBeResolved(State beginState, State endState);
  293.         void ResolveTask();
  294.  
  295.         bool DiscardAllowed(State beginState, State endState);
  296.         void ResolveDiscard();
  297.  
  298.         bool EncounterEligableForCompletion(State beginState, State endState);
  299.         void CompleteEncounter();
  300.  
  301.         bool FailureIsEnsured(State beginState, State endState);
  302.         void FailEncounter();
  303.  
  304.         bool EncounterOutcomeIsSatisfied(State beginState, State endState);
  305.         void CleanupEncounter();
  306.     }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement