示例#1
0
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'}
示例#2
0
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'
    }
示例#3
0
文件: races.py 项目: elvslv/web_game
	def throwDice(self, game, dice = None):
		return misc_game.throwDice(game, dice)