def act_conquer(data): user = dbi.getXbyY('User', 'sid', data['sid']) game = user.game if not (game and user.inGame): raise BadFieldException('notInGame') if not user.currentTokenBadge or not user.tokensInHand: raise BadFieldException('badStage') checkStage(GAME_CONQUER, user) region = game.map.getRegion(data['regionId']) regState = region.getState(game.id) victimTokenBadge = regState.tokenBadge owner = regState.owner if owner == user and not regState.inDecline: raise BadFieldException('badRegion') tokenBadge = user.currentTokenBadge raceId, specialPowerId = tokenBadge.raceId, tokenBadge.specPowId if not regState.inDecline: user.checkForFriends(owner) f1 = callRaceMethod(raceId, 'canConquer', region, tokenBadge) f2 = callSpecialPowerMethod(specialPowerId, 'canConquer', region, tokenBadge) if not (f1 and f2): raise BadFieldException('badRegion') regState.checkIfImmune() attackedRace = None attackedSpecialPower = None if regState.tokenBadge: attackedRace = regState.tokenBadge.raceId attackedSpecialPower = regState.tokenBadge.specPowId enemyDefenseBonus = 0 if attackedRace: enemyDefenseBonus = callRaceMethod(attackedRace, 'defenseBonus') defense = regState.tokensNum unitPrice = max(misc.BASIC_CONQUER_COST + defense + region.mountain + regState.encampment + regState.fortified + enemyDefenseBonus + callRaceMethod(raceId, 'attackBonus', region, tokenBadge) + callSpecialPowerMethod(specialPowerId, 'attackBonus', region, tokenBadge) , 1) unitsNum = user.tokensInHand if unitsNum + 3 < unitPrice: raise BadFieldException('badTokensNum') t = user.game.getLastState() == misc.GAME_THROW_DICE dice = t and user.game.history[-1].dice if not dice and unitsNum < unitPrice : dice = misc_game.throwDice(game) unitPrice -= (dice or 0) unitPrice = max(unitPrice, 1) if unitsNum < unitPrice: dbi.updateHistory(user, GAME_UNSUCCESSFULL_CONQUER, user.currentTokenBadge.id) tokenBadge.totalTokensNum += callRaceMethod(tokenBadge.raceId, 'turnEndReinforcements', user) return {'result': 'badTokensNum', 'dice': dice} clearFromRace(regState) # Not sure if it's necessary victimBadgeId = regState.tokenBadgeId regState.owner = user regState.tokenBadge = user.currentTokenBadge regState.inDecline = False regState.tokensNum = unitPrice if victimTokenBadge: callRaceMethod(victimTokenBadge.raceId, 'sufferCasualties', victimTokenBadge) owner.tokensInHand += defense - callRaceMethod(victimTokenBadge.raceId, 'getCasualties') callRaceMethod(raceId, 'conquered', regState, tokenBadge) dbi.updateWarHistory(user, victimBadgeId, tokenBadge.id, dice, region.id, defense, ATTACK_CONQUER) user.tokensInHand -= unitPrice dbi.updateGameHistory(game, data) return {'result': 'ok', 'dice': dice} if (dice and not t) else {'result': 'ok'}
def act_conquer(data): user = dbi.getXbyY('User', 'sid', data['sid']) game = user.game if not (game and user.inGame): raise BadFieldException('notInGame') if not user.currentTokenBadge or not user.tokensInHand: raise BadFieldException('badStage') checkStage(GAME_CONQUER, user) region = game.map.getRegion(data['regionId']) regState = region.getState(game.id) victimTokenBadge = regState.tokenBadge owner = regState.owner if owner == user and not regState.inDecline: raise BadFieldException('badRegion') tokenBadge = user.currentTokenBadge raceId, specialPowerId = tokenBadge.raceId, tokenBadge.specPowId if not regState.inDecline: user.checkForFriends(owner) f1 = callRaceMethod(raceId, 'canConquer', region, tokenBadge) f2 = callSpecialPowerMethod(specialPowerId, 'canConquer', region, tokenBadge) if not (f1 and f2): raise BadFieldException('badRegion') regState.checkIfImmune() attackedRace = None attackedSpecialPower = None if regState.tokenBadge: attackedRace = regState.tokenBadge.raceId attackedSpecialPower = regState.tokenBadge.specPowId enemyDefenseBonus = 0 if attackedRace: enemyDefenseBonus = callRaceMethod(attackedRace, 'defenseBonus') defense = regState.tokensNum unitPrice = max( misc.BASIC_CONQUER_COST + defense + region.mountain + regState.encampment + regState.fortified + enemyDefenseBonus + callRaceMethod(raceId, 'attackBonus', region, tokenBadge) + callSpecialPowerMethod(specialPowerId, 'attackBonus', region, tokenBadge), 1) unitsNum = user.tokensInHand if unitsNum + 3 < unitPrice: raise BadFieldException('badTokensNum') t = user.game.getLastState() == misc.GAME_THROW_DICE dice = t and user.game.history[-1].dice if not dice and unitsNum < unitPrice: dice = misc_game.throwDice(game) unitPrice -= (dice or 0) unitPrice = max(unitPrice, 1) if unitsNum < unitPrice: dbi.updateHistory(user, GAME_UNSUCCESSFULL_CONQUER, user.currentTokenBadge.id) tokenBadge.totalTokensNum += callRaceMethod(tokenBadge.raceId, 'turnEndReinforcements', user) return {'result': 'badTokensNum', 'dice': dice} clearFromRace(regState) # Not sure if it's necessary victimBadgeId = regState.tokenBadgeId regState.owner = user regState.tokenBadge = user.currentTokenBadge regState.inDecline = False regState.tokensNum = unitPrice if victimTokenBadge: callRaceMethod(victimTokenBadge.raceId, 'sufferCasualties', victimTokenBadge) owner.tokensInHand += defense - callRaceMethod(victimTokenBadge.raceId, 'getCasualties') callRaceMethod(raceId, 'conquered', regState, tokenBadge) dbi.updateWarHistory(user, victimBadgeId, tokenBadge.id, dice, region.id, defense, ATTACK_CONQUER) user.tokensInHand -= unitPrice dbi.updateGameHistory(game, data) return { 'result': 'ok', 'dice': dice } if (dice and not t) else { 'result': 'ok' }
def throwDice(self, game, dice = None): return misc_game.throwDice(game, dice)