/// <param name="notification"> /// if client side send he missed his turn, or if it happened because of internal timout /// </param> private async Task RandomUserPlay(RoomUser roomUser, bool notification) { var randomCardIndex = StaticRandom.GetRandom(roomUser.Hand.Count); // await UserPlay(roomUser, randomCardIndex); if (notification) { _serverLoop.CancelTurnTimeout(roomUser); } var throwResult = PlayBase(roomUser, randomCardIndex); if (!roomUser.ActiveUser.IsDisconnected) { await _masterHub.SendOrderedAsync(roomUser.ActiveUser, "ForcePlay", throwResult); } //todo then you have to do the same assertion on this! await SendCurrentOppoThrow(roomUser, throwResult); await NextTurn(roomUser.Room); }
//no test, you can test the "concurrent random" public async Task BotPlay(RoomBot roomBot) { //can happen with logic var randomCardIndex = StaticRandom.GetRandom(roomBot.Hand.Count); var throwResult = PlayBase(roomBot, randomCardIndex); await SendCurrentOppoThrow(roomBot, throwResult); await NextTurn(roomBot.Room); _logger.LogInformation($"bot {roomBot.Id} has played card {randomCardIndex}"); } //no test, you can test the "concurrent random"
/// <summary> /// called by timeout /// </summary> public async Task FillPendingRoomWithBots(Room room) { room.RoomBots = new(); var botsCount = room.Capacity - room.RoomUsers.Count; var botIds = new List <string> { "999", "9999", "99999" }; for (int i = 0; i < botsCount; i++) { var botId = botIds.Cut(StaticRandom.GetRandom(botIds.Count)); room.RoomBots.Add(new RoomBot { Id = botId, Room = room }); } room.RoomActors.AddRange(room.RoomBots); await PrepareRoom(room); }
// Unit functions public void AddUnit(UnitClass unitType, Vector3 addPosition, int unitTeam, bool is_ai, string unitInfoFromServer) { if (unitInfoFromServer == null) { // Instantiate unit and instantiate starting cooldown and player UnitClass newUnit = Instantiate(unitType, new Vector3(addPosition.x, TileArray[(int)addPosition.x, (int)addPosition.z].tile_elevation, addPosition.z), Quaternion.identity); // Point unit at center of map... newUnit.transform.LookAt(new Vector3(5, newUnit.transform.position.y, 5)); newUnit.playerName = PLAYER_NAME; newUnit.playerTeam = unitTeam; // Create unitID and Cooldown newUnit.entityID = GameObjectID.CreateID(PLAYER_NAME); int initRandomCooldown = StaticRandom.GetRandom(1, newUnit.unitCooldownMax); newUnit.unitCooldown = initRandomCooldown; if (is_ai) { newUnit.IS_AI = true; } // Add to local unitList unitList.Add(newUnit); // Add to unit firebase unit list if (GAME_MODE == "multiplayer") { string unitJson = JsonUtility.ToJson(newUnit); gameDatabaseReference.Child("units").Push().SetRawJsonValueAsync(unitJson); turnManager.SendMoveToFirebase(PLAYER_TEAM + "|CADD|" + newUnit.playerName + "|" + newUnit.entityID + "|" + newUnit.entityName + "|" + addPosition.x + "|" + addPosition.z + "|" + newUnit.unitCooldown); } } else { string[] aData = unitInfoFromServer.Split('|'); if (Convert.ToInt32(aData[0]) != PLAYER_TEAM) { string unitName = aData[4].Replace("(Clone)", ""); // Determine unit type switch (unitName) { case "Cloud": unitType = unitCloud; break; case "Black Rook": unitType = unitBlackRook; break; case "Medic": unitType = unitMedic; break; case "Insektobot": unitType = unitInsektobot; break; case "Bad Robut": unitType = unitBadRobut; break; case "Sun Man": unitType = unitSunMan; break; } int xCoord = Convert.ToInt32(aData[5]); int zCoord = Convert.ToInt32(aData[6]); addPosition.x = xCoord; addPosition.y = TileArray[xCoord, zCoord].tile_elevation; addPosition.z = zCoord; // Instantiate unit and instantiate starting cooldown and player UnitClass newUnit = Instantiate(unitType, addPosition, Quaternion.identity); newUnit.playerName = aData[2]; newUnit.playerTeam = Convert.ToInt32(aData[0]); newUnit.entityID = aData[3]; newUnit.unitCooldown = Convert.ToInt32(aData[7]); // Look at center of map... newUnit.transform.LookAt(new Vector3(5, transform.position.y, 5)); // Add to local unitList unitList.Add(newUnit); } } }