public Playfield(Playfield p, int timeShift = 0) { //this.pID = prozis.getPid(); this.ownerIndex = p.ownerIndex; this.BattleTime = p.BattleTime; this.home = p.home; this.ownMana = p.ownMana; this.enemyMana = p.enemyMana; copyCards(p.ownHandCards, p.nextCard, p.prevCard); copyBoardObj(p.ownMinions, this.ownMinions); copyBoardObj(p.enemyMinions, this.enemyMinions); copyBoardObj(p.ownAreaEffects, this.ownAreaEffects); copyBoardObj(p.enemyAreaEffects, this.enemyAreaEffects); copyBoardObj(p.ownBuildings, this.ownBuildings); copyBoardObj(p.enemyBuildings, this.enemyBuildings); copyBoardObj(p.ownTowers, this.ownTowers); copyBoardObj(p.enemyTowers, this.enemyTowers); this.ownKingsTower = new BoardObj(p.ownKingsTower); this.ownPrincessTower1 = new BoardObj(p.ownPrincessTower1); this.ownPrincessTower2 = new BoardObj(p.ownPrincessTower2); this.enemyKingsTower = new BoardObj(p.enemyKingsTower); this.enemyPrincessTower1 = new BoardObj(p.enemyPrincessTower1); this.enemyPrincessTower2 = new BoardObj(p.enemyPrincessTower2); initTowers(); this.ownDeck = p.ownDeck; this.enemyDeck = p.enemyDeck; this.ownGroup = p.ownGroup; this.enemyGroup = p.enemyGroup; //enemyHandCards = prozis.enemyHandCards; if (p.needPrint) { this.needPrint = true; this.pIdHistory.AddRange(p.pIdHistory); this.pIdHistory.Add(pID); } this.nextEntity = p.nextEntity; this.suddenDeath = p.suddenDeath; this.evaluatePenality = p.evaluatePenality; this.ruleWeight = p.ruleWeight; this.rulesUsed = p.rulesUsed; this.playactions.AddRange(p.playactions); if (timeShift != 0) { TimeMachine.Instance.setTimeShift(this, timeShift); } }
public group getGroup(bool own, int lowHPlimit = 70, boPriority priority = boPriority.byTotalNumber, int radius = 3000) { group retval = null; group Group; BoardObj bo; List <BoardObj> listMobs = own ? this.ownMinions : this.enemyMinions; List <BoardObj> listBuildings = own ? this.ownBuildings : this.enemyBuildings; List <BoardObj> listTowers = own ? this.ownTowers : this.enemyTowers; int val = -1; int tmpval = 0; int count = listMobs.Count; for (int i = 0; i < count; i++) { bo = listMobs[i]; Group = new group(own, bo.Position, listMobs, lowHPlimit, false, radius); Group.addToGroup(listBuildings, false); Group.addToGroup(listTowers, true); switch (priority) { case boPriority.byTotalNumber: tmpval = Group.lowHPbo.Count + Group.avgHPbo.Count + Group.hiHPbo.Count; if (tmpval > val) { val = tmpval; retval = Group; } break; case boPriority.byLowHpNumber: tmpval = Group.lowHPbo.Count; if (tmpval > val) { val = tmpval; retval = Group; } break; case boPriority.byAvgHpNumber: tmpval = Group.avgHPbo.Count; if (tmpval > val) { val = tmpval; retval = Group; } break; case boPriority.byHiHpNumber: tmpval = Group.hiHPbo.Count; if (tmpval > val) { val = tmpval; retval = Group; } break; case boPriority.byTotalBuildingsDPS: tmpval = Group.lowHPboBuildingsDPS + Group.avgHPboBuildingsDPS + Group.hiHPboBuildingsDPS; if (tmpval > val) { val = tmpval; retval = Group; } break; case boPriority.byTotalAirDPS: tmpval = Group.lowHPboAirDPS + Group.avgHPboAirDPS + Group.hiHPboAirDPS; if (tmpval > val) { val = tmpval; retval = Group; } break; case boPriority.byTotalAirAreaDPS: tmpval = Group.lowHPboAirAreaDPS + Group.avgHPboAirAreaDPS + Group.hiHPboAirAreaDPS; if (tmpval > val) { val = tmpval; retval = Group; } break; case boPriority.byTotalGroundDPS: tmpval = Group.lowHPboGroundDPS + Group.avgHPboGroundDPS + Group.hiHPboGroundDPS; if (tmpval > val) { val = tmpval; retval = Group; } break; case boPriority.byTotalGroundAreaDPS: tmpval = Group.lowHPboGroundAreaDPS + Group.avgHPboGroundAreaDPS + Group.hiHPboGroundAreaDPS; if (tmpval > val) { val = tmpval; retval = Group; } break; case boPriority.byTotalAirTransport: tmpval = Group.lowHPboAirTransport + Group.avgHPboAirTransport + Group.hiHPboAirTransport; if (tmpval > val) { val = tmpval; retval = Group; } break; } } return(retval); }
public Handcard getOppositeCard(Playfield p, group Group, int canWaitMissingMana = 3, int gangSize = 5) { Handcard bestCard = null; int bestVal = int.MinValue; int tmpVal; foreach (Handcard hc in p.ownHandCards) { if (canWaitMissingMana >= hc.manacost - p.ownMana) { tmpVal = 0; int numAirTransport = Group.lowHPboAirTransport + Group.avgHPboAirTransport + Group.hiHPboAirTransport; int groupSize = Group.lowHPbo.Count + Group.avgHPbo.Count + Group.hiHPbo.Count; if (hc.card.aoeAir) { tmpVal += 3; } if (hc.card.type == boardObjType.MOB) { tmpVal += 2; } if (hc.card.Transport == transportType.AIR) { tmpVal += 3; } if (numAirTransport > 0) { if (hc.card.TargetType == targetType.ALL) { tmpVal += 20; } if (Group.lowHPboAirTransport >= gangSize && hc.card.aoeAir) { tmpVal += 5; } } if (groupSize > numAirTransport) { if (Group.lowHPbo.Count - Group.lowHPboAirTransport >= gangSize) { if (hc.card.aoeAir) { tmpVal += 15; } if (hc.card.aoeGround) { tmpVal += 15; } } if (hc.card.TargetType == targetType.GROUND) { tmpVal += 15; } if (hc.card.TargetType == targetType.ALL) { tmpVal += 15; } } foreach (BoardObj tmp in Group.hiHPbo) { if (OppositeDB.ContainsKey(tmp.card.name)) { var opp = OppositeDB[tmp.card.name]; if (opp.ContainsKey(hc.card.name)) { tmpVal += opp[hc.card.name] / 10; } } } foreach (BoardObj tmp in Group.avgHPbo) { if (OppositeDB.ContainsKey(tmp.card.name)) { var opp = OppositeDB[tmp.card.name]; if (opp.ContainsKey(hc.card.name)) { tmpVal += opp[hc.card.name] / 10; } } } foreach (BoardObj tmp in Group.lowHPbo) { if (OppositeDB.ContainsKey(tmp.card.name)) { var opp = OppositeDB[tmp.card.name]; if (opp.ContainsKey(hc.card.name)) { tmpVal += opp[hc.card.name] / 15; } } } if (bestVal < tmpVal) { bestVal = tmpVal; bestCard = hc; bestCard.val = tmpVal; bestCard.missingMana = hc.manacost - p.ownMana; } } } return(bestCard); }