//This exit method is called by players so they will check against flags async Task <IRoomGrain> IRoomGrain.ExitTo(string direction, IGameStateGrain gameState) { var directionObject = State.directions.Where(p => p.Cardinal == direction).FirstOrDefault(); if (directionObject != null) { if (directionObject.Flags.Count == 0) { return(directionObject.Room); } else { bool conditionsFailed = false; foreach (var flag in directionObject.Flags) { if ((await gameState.GetStateForKey(flag.Key)) != flag.Value) { conditionsFailed = true; } } if (conditionsFailed == false) { return(directionObject.Room); } } } return(null); }
async internal static Task <string> GetDescriptorForState(IGameStateGrain gameState, List <Descriptor> descriptors, IPlayerGrain playerGrain) { if (descriptors != null && descriptors.Count > 0) { if (descriptors.Count == 1) { if (descriptors[0].SetFlags != null && descriptors[0].SetFlags.Count > 0) { await gameState.SetGameStateFlags(descriptors[0].SetFlags); } return(descriptors[0].Text); } else { foreach (var descriptor in descriptors) { if (descriptor.IsDefault != true) { bool conditionsFailed = false; foreach (var flag in descriptor.Flags) { var gs = GrainFactory.GetGrain <IGameStateGrain>(playerGrain.GetPrimaryKey()); if ((await gs.GetStateForKey(flag.Key)) != flag.Value) { conditionsFailed = true; } } if (conditionsFailed == false) { if (descriptor.SetFlags != null && descriptor.SetFlags.Count > 0) { await gameState.SetGameStateFlags(descriptor.SetFlags); } return(descriptor.Text); //return descriptor; } } } if (descriptors[0].SetFlags != null && descriptors[0].SetFlags.Count > 0) { try { await gameState.SetGameStateFlags(descriptors[0].SetFlags); } catch (Exception ex) { Trace.TraceError("Error setting game state flags: " + ex.Message); return("error"); } } return(descriptors[0].Text); } } return("No Descriptors"); }
async internal static Task<string> GetDescriptorForState(IGameStateGrain gameState, List<Descriptor> descriptors, IPlayerGrain playerGrain) { if (descriptors != null && descriptors.Count > 0) { if (descriptors.Count == 1) { if (descriptors[0].SetFlags != null && descriptors[0].SetFlags.Count > 0) { await gameState.SetGameStateFlags(descriptors[0].SetFlags); } return descriptors[0].Text; } else { foreach (var descriptor in descriptors) { if (descriptor.IsDefault != true) { bool conditionsFailed = false; foreach (var flag in descriptor.Flags) { var gs = GrainFactory.GetGrain<IGameStateGrain>(playerGrain.GetPrimaryKey()); if ((await gs.GetStateForKey(flag.Key)) != flag.Value) conditionsFailed = true; } if (conditionsFailed == false) { if (descriptor.SetFlags != null && descriptor.SetFlags.Count > 0) { await gameState.SetGameStateFlags(descriptor.SetFlags); } return descriptor.Text; //return descriptor; } } } if (descriptors[0].SetFlags != null && descriptors[0].SetFlags.Count > 0) { try { await gameState.SetGameStateFlags(descriptors[0].SetFlags); } catch (Exception ex) { Trace.TraceError("Error setting game state flags: " + ex.Message); return "error"; } } return descriptors[0].Text; } } return "No Descriptors"; }
async Task <string> IRoomGrain.Description(PlayerInfo whoisAsking, IGameStateGrain gameState) { StringBuilder sb = new StringBuilder(); var playerGrain = GrainFactory.GetGrain <IPlayerGrain>(whoisAsking.Key); sb.AppendLine(await GrainHelper.GetDescriptorForState(gameState, State.descriptors, playerGrain)); if (State.things.Count > 0) { sb.AppendLine("The following things are present:"); foreach (var thing in State.things) { sb.Append(" ").AppendLine(thing.Name); } } if (State.players.Count > 1 || State.monsters.Count > 0 || State.npcs.Count > 0) { sb.AppendLine("Beware! These guys are in the room with you:"); foreach (var player in State.players) { if (player.GetPrimaryKey() != whoisAsking.Key) { sb.Append(" player: ").AppendLine(await player.Name()); } } if (State.monsters.Count > 0) { foreach (var monster in State.monsters) { sb.Append(" monster: ").AppendLine(await monster.Name()); } } if (State.npcs.Count > 0) { foreach (var npc in State.npcs) { sb.Append(" npc: ").AppendLine(await npc.Name()); } } } return(sb.ToString()); }
async Task <string> ICharacterGrain.Response(IGameStateGrain gameState) { var obj = await GrainHelper.GetDescriptorForState(gameState, State.npcInfo.Responses, State.playerGrain); return(this.State.npcInfo.Name + " says\n\t" + obj.ToString()); }
Task <string> ICharacterGrain.Description(IGameStateGrain gameState) { return(GrainHelper.GetDescriptorForState(gameState, State.npcInfo.Descriptors, State.playerGrain)); }