public static Task PurchaseAnimal( [HttpTrigger(AuthorizationLevel.Anonymous, "POST", Route = "game/{gameName}/purchase-animal")] PurchaseAnimalCommand command, [DurableClient] IDurableEntityClient client, string gameName) { var transfer = new AnimalPurchase { AnimalName = command.AnimalName, NewOwnerName = command.OwnerName }; var entityId = new EntityId(nameof(GameSession), gameName); return(client.SignalEntityAsync <IGameSession>(entityId, proxy => proxy.PurchaseAnimalAsync(transfer))); }
public async Task PurchaseAnimalAsync(AnimalPurchase purchase) { var owner = PlayerStates[purchase.NewOwnerName]; var animal = AnimalStates[purchase.AnimalName]; if (animal?.OwnerName == null && animal?.Price <= owner?.Credits) { owner.Credits -= animal.Price; animal.OwnerName = owner.Name; await PublishEventAsync(new AnimalPurchasedEvent { AnimalName = purchase.AnimalName, OwnerName = purchase.NewOwnerName }); await PublishEventAsync(new CreditsChangedEvent { PlayerName = owner.Name, Credits = owner.Credits }); // Key of the animal behavior entity is: // <GameName>:<AnimalName>:<OwnerName> var entityKey = $"{Entity.Current.EntityKey}:{purchase.AnimalName}:{purchase.NewOwnerName}"; var entityId = new EntityId(nameof(AnimalBehavior), entityKey); Entity.Current.SignalEntity <IAnimalBehavior>(entityId, proxy => proxy.Start()); } else { await PublishEventAsync(new AnimalPurchaseFailedEvent { AnimalName = purchase.AnimalName, OwnerName = purchase.NewOwnerName }); } }