diff --git a/.gitignore b/.gitignore index 5a3ba36..4e13736 100644 --- a/.gitignore +++ b/.gitignore @@ -40,6 +40,7 @@ __pycache__/ # Distribution / packaging gamestate.txt +game_state.txt python3-vckonline/ .idea/ .Python diff --git a/common.py b/common.py index 992ffe2..95f6ff4 100755 --- a/common.py +++ b/common.py @@ -1,7 +1,6 @@ import json import time from json import JSONEncoder, JSONDecoder -import mysql.connector import random from typing import List, Dict from constants import * @@ -98,6 +97,7 @@ class Player: } return roles_dict + class Starter(Card): def __init__(self, starter_id, name, roll_match1, roll_match2, gold_payout_on_turn, gold_payout_off_turn, strength_payout_on_turn, strength_payout_off_turn, magic_payout_on_turn, magic_payout_off_turn, @@ -106,36 +106,36 @@ class Starter(Card): super().__init__() self.starter_id = starter_id self.name = name - self.rollMatch1 = roll_match1 - self.rollMatch2 = roll_match2 - self.goldPayoutOnTurn = gold_payout_on_turn - self.goldPayoutOffTurn = gold_payout_off_turn - self.strengthPayoutOnTurn = strength_payout_on_turn - self.strengthPayoutOffTurn = strength_payout_off_turn - self.magicPayoutOnTurn = magic_payout_on_turn - self.magicPayoutOffTurn = magic_payout_off_turn - self.hasSpecialPayoutOnTurn = has_special_payout_on_turn - self.hasSpecialPayoutOffTurn = has_special_payout_off_turn - self.specialPayoutOnTurn = special_payout_on_turn - self.specialPayoutOffTurn = special_payout_off_turn + self.roll_match1 = roll_match1 + self.roll_match2 = roll_match2 + self.gold_payout_on_turn = gold_payout_on_turn + self.gold_payout_off_turn = gold_payout_off_turn + self.strength_payout_on_turn = strength_payout_on_turn + self.strength_payout_off_turn = strength_payout_off_turn + self.magic_payout_on_turn = magic_payout_on_turn + self.magic_payout_off_turn = magic_payout_off_turn + self.has_special_payout_on_turn = has_special_payout_on_turn + self.has_special_payout_off_turn = has_special_payout_off_turn + self.special_payout_on_turn = special_payout_on_turn + self.special_payout_off_turn = special_payout_off_turn self.expansion = expansion def to_dict(self): return { "starter_id": self.starter_id, "name": self.name, - "roll_match1": self.rollMatch1, - "roll_match2": self.rollMatch2, - "gold_payout_on_turn": self.goldPayoutOnTurn, - "gold_payout_off_turn": self.goldPayoutOffTurn, - "strength_payout_on_turn": self.strengthPayoutOnTurn, - "strength_payout_off_turn": self.strengthPayoutOffTurn, - "magic_payout_on_turn": self.magicPayoutOnTurn, - "magic_payout_off_turn": self.magicPayoutOffTurn, - "has_special_payout_on_turn": self.hasSpecialPayoutOnTurn, - "has_special_payout_off_turn": self.hasSpecialPayoutOffTurn, - "special_payout_on_turn": self.specialPayoutOnTurn, - "special_payout_off_turn": self.specialPayoutOffTurn, + "roll_match1": self.roll_match1, + "roll_match2": self.roll_match2, + "gold_payout_on_turn": self.gold_payout_on_turn, + "gold_payout_off_turn": self.gold_payout_off_turn, + "strength_payout_on_turn": self.strength_payout_on_turn, + "strength_payout_off_turn": self.strength_payout_off_turn, + "magic_payout_on_turn": self.magic_payout_on_turn, + "magic_payout_off_turn": self.magic_payout_off_turn, + "has_special_payout_on_turn": self.has_special_payout_on_turn, + "has_special_payout_off_turn": self.has_special_payout_off_turn, + "special_payout_on_turn": self.special_payout_on_turn, + "special_payout_off_turn": self.special_payout_off_turn, "expansion": self.expansion } @@ -180,6 +180,7 @@ class Citizen(Card): def get_special_payout_on_turn(self): return self.special_payout_on_turn + def to_dict(self): base_dict = super().to_dict() return {**base_dict, @@ -453,43 +454,99 @@ class Game: def harvest_phase(self): # steal activates first + for starter in self.player_list[0].owned_starters: + if (starter.roll_match1 == self.die_one) or (starter.roll_match1 == self.die_two) or ( + starter.roll_match1 == self.die_sum) or (starter.roll_match2 == self.die_sum): + count = 1 + if starter.roll_match1 == self.die_one == self.die_two: + count = 2 + print(f"Payout for {self.player_list[0].name}: Starter {starter.name}{' x2' if count == 2 else ''}") + for i in range(count): + self.player_list[0].gold_score = self.player_list[0].gold_score + starter.gold_payout_on_turn + self.player_list[0].strength_score = self.player_list[ + 0].strength_score + starter.strength_payout_on_turn + self.player_list[0].magic_score = self.player_list[0].magic_score + starter.magic_payout_on_turn + if starter.has_special_payout_on_turn: + payout = self.execute_special_payout(starter.special_payout_on_turn, + self.player_list[0].player_id) + self.player_list[0].gold_score = self.player_list[0].gold_score + payout[0] + self.player_list[0].strength_score = self.player_list[0].strength_score + payout[1] + self.player_list[0].magic_score = self.player_list[0].magic_score + payout[2] for citizen in self.player_list[0].owned_citizens: if (citizen.roll_match1 == self.die_one) or (citizen.roll_match1 == self.die_two) or ( citizen.roll_match1 == self.die_sum) or (citizen.roll_match2 == self.die_sum): count = 1 - if self.die_one == self.die_two: + if citizen.roll_match1 == self.die_one == self.die_two: count = 2 - print(f"{citizen.name} Payout") + print(f"Payout for {self.player_list[0].name}: Citizen {citizen.name}{' x2' if count == 2 else ''}") for i in range(count): self.player_list[0].gold_score = self.player_list[0].gold_score + citizen.gold_payout_on_turn self.player_list[0].strength_score = self.player_list[ 0].strength_score + citizen.strength_payout_on_turn self.player_list[0].magic_score = self.player_list[0].magic_score + citizen.magic_payout_on_turn if citizen.has_special_payout_on_turn: - payout = self.execute_special_payout(citizen.special_payout_on_turn(), + print(f"Citizen {citizen.name} special payout text: {citizen.special_payout_on_turn}") + payout = self.execute_special_payout(citizen.special_payout_on_turn, self.player_list[0].player_id) + print(f"right after running execute special payout {payout}") + self.player_list[0].gold_score = self.player_list[0].gold_score + payout[0] + self.player_list[0].strength_score = self.player_list[0].strength_score + payout[1] + self.player_list[0].magic_score = self.player_list[0].magic_score + payout[2] list_iterator = iter(self.player_list) # skip first player when paying out the rest of the board next(list_iterator) for player in list_iterator: + for starter in player.owned_starters: + if (starter.roll_match1 == self.die_one) or (starter.roll_match1 == self.die_two) or ( + starter.roll_match1 == self.die_sum) or (starter.roll_match2 == self.die_sum): + count = 1 + if starter.roll_match1 == self.die_one == self.die_two: + count = 2 + print(f"Payout for {player.name}: Starter {starter.name}{' x2' if count == 2 else ''}") + for i in range(count): + player.gold_score = player.gold_score + starter.gold_payout_off_turn + player.strength_score = player.strength_score + starter.strength_payout_off_turn + player.magic_score = player.magic_score + starter.magic_payout_off_turn + if starter.has_special_payout_off_turn: + payout = self.execute_special_payout(starter.special_payout_off_turn, player.player_id) + player.gold_score = player.gold_score + payout[0] + player.strength_score = player.strength_score + payout[1] + player.magic_score = player.magic_score + payout[2] + for citizen in player.owned_citizens: if (citizen.roll_match1 == self.die_one) or (citizen.roll_match1 == self.die_two) or ( citizen.roll_match1 == self.die_sum) or (citizen.roll_match2 == self.die_sum): - print(f"{citizen.name} Payout") - player.gold_score = player.gold_score + citizen.gold_payout_off_turn - player.strength_score = player.strength_score + citizen.strength_payout_off_turn - player.magic_score = player.magic_score + citizen.magic_payout_off_turn + count = 1 + if citizen.roll_match1 == self.die_one == self.die_two: + count = 2 + print(f"Payout for {player.name}: Citizen {citizen.name}{' x2' if count == 2 else ''}") + for i in range(count): + player.gold_score = player.gold_score + citizen.gold_payout_off_turn + player.strength_score = player.strength_score + citizen.strength_payout_off_turn + player.magic_score = player.magic_score + citizen.magic_payout_off_turn + if citizen.has_special_payout_off_turn: + print("special payout off turn triggered") + print(citizen.special_payout_off_turn) + payout = self.execute_special_payout(citizen.special_payout_off_turn, player.player_id) + player.gold_score = player.gold_score + payout[0] + player.strength_score = player.strength_score + payout[1] + player.magic_score = player.magic_score + payout[2] + for player in self.player_list: + print(f"Player {player.name}: {player.gold_score} G, {player.strength_score} S, {player.magic_score} M," + f" {player.victory_score} VP, Monsters: {len(player.owned_monsters)}, " + f"Citizens: {len(player.owned_citizens)}, Domains {len(player.owned_domains)}") def execute_special_payout(self, command, player_id): + print("executing special payout") payout = [0, 0, 0, 0] # gp, sp, mp, vp, todo: citizen, monster, domain split_command = command.split() first_word = split_command[0] second_word = split_command[1] third_word = split_command[2] fourth_word = split_command[3] - fifth_word = split_command[4] match first_word: case "count": + print("Matched count") match second_word: case "owned_shadow": self.update_payout_for_role('shadow_count', player_id, payout, split_command) @@ -498,6 +555,7 @@ class Game: case "owned_soldier": self.update_payout_for_role('soldier_count', player_id, payout, split_command) case "owned_worker": + self.update_payout_for_role('worker_count', player_id, payout, split_command) case "owned_monsters": self.update_payout_for_role('owned_monsters', player_id, payout, split_command) @@ -508,40 +566,44 @@ class Game: case _: payout[0] = -9999 case "exchange": + print("Matched exchange") match second_word: case 'g': - payout[0] = payout[0] - third_word + payout[0] = payout[0] - int(third_word) case 's': - payout[1] = payout[1] - third_word + payout[1] = payout[1] - int(third_word) case 'm': - payout[2] = payout[2] - third_word + payout[2] = payout[2] - int(third_word) case 'v': - payout[3] = payout[3] - third_word + payout[3] = payout[3] - int(third_word) case _: payout[0] = -9999 match fourth_word: case 'g': - payout[0] = payout[0] + fifth_word + payout[0] = payout[0] + int(split_command[4]) case 's': - payout[1] = payout[1] + fifth_word + payout[1] = payout[1] + int(split_command[4]) case 'm': - payout[2] = payout[2] + fifth_word + payout[2] = payout[2] + int(split_command[4]) case 'v': - payout[3] = payout[3] + fifth_word + payout[3] = payout[3] + int(split_command[4]) case _: payout[0] = -9999 case "choose": - # need to pause execution here until we get player input + print("Matched choose") self.action_required['player_id'] = player_id self.action_required['action'] = command + # need to pause execution here until we get player input while self.action_required['player_id'] != self.game_id: time.sleep(1) choice = [] match self.action_required['action']: - case 'choose left': + case 'choose 1': choice = [second_word, third_word] - case 'choose right': + case 'choose 2': choice = [fourth_word, fifth_word] + case 'choose 3': + choice = [split_command[5], split_command[6]] # [sixth_word, seventh_word] case _: payout[0] = -9999 match choice[0]: @@ -557,6 +619,7 @@ class Game: payout[0] = -9999 case _: payout[0] = -9999 + print(payout) return payout def update_payout_for_role(self, role_name, player_id, payout, split_command): @@ -568,28 +631,50 @@ class Game: if role_count > 0: match split_command[2]: case 'g': - payout[0] = split_command[3] * role_count + payout[0] = int(split_command[3]) * role_count case 's': - payout[1] = split_command[3] * role_count + payout[1] = int(split_command[3]) * role_count case 'm': - payout[2] = split_command[3] * role_count + payout[2] = int(split_command[3]) * role_count case 'v': - payout[3] = split_command[3] * role_count + payout[3] = int(split_command[3]) * role_count case _: payout[0] = -9999 else: payout[0] = -9999 - def hire_citizen(self, citizen_id, gp, mp=0): - available_citizens = [] + def hire_citizen(self, player_id, citizen_id, gp, mp=0): for citizen_stack in self.citizen_grid: for citizen in citizen_stack: if citizen.citizen_id == citizen_id and citizen.is_accessible: - self.player_list[0].gold_score = self.player_list[0].gold_score - gp - self.player_list[0].magic_score = self.player_list[0].magic_score - mp - self.player_list[0].owned_citizens.append(citizen_stack.pop(-1)) + for player in self.player_list: + if player.player_id == player_id: + player.gold_score = player.gold_score - gp + player.magic_score = player.magic_score - mp + player.owned_citizens.append(citizen_stack.pop(-1)) citizen_stack[-1].toggle_accessibility(True) + def slay_monster(self, player_id, monster_id, sp, mp=0): + for monster_stack in self.monster_grid: + for monster in monster_stack: + if monster.monster_id == monster_id and monster.is_accessible: + for player in self.player_list: + if player.player_id == player_id: + player.strength_score = player.strength_score - sp + player.magic_score = player.magic_score - mp + player.owned_monsters.append(monster_stack.pop(-1)) + monster_stack[-1].toggle_accessibility(True) + + def buy_domain(self, player_id, domain_id, gp, mp=0): + for domain_stack in self.domain_grid: + for domain in domain_stack: + if domain.domain_id == domain_id and domain.is_accessible: + for player in self.player_list: + if player.player_id == player_id: + player.gold_score = player.gold_score - gp + player.magic_score = player.magic_score - mp + player.owned_domains.append(domain_stack.pop(-1)) + domain_stack[-1].toggle_accessibility(True) def action_phase(self): return diff --git a/gamestate.txt b/gamestate.txt deleted file mode 100644 index 6265890..0000000 --- a/gamestate.txt +++ /dev/null @@ -1,2377 +0,0 @@ -{ - "game_id": "d34d2c8a-3156-44be-9c6f-ca4266ccf2f6", - "player_list": [ - { - "player_id": "EAn98RJrcJHjDyMcqA8dka", - "name": "Player 1", - "owned_starters": [ - 1, - 2 - ], - "owned_citizens": [], - "owned_domains": [], - "owned_dukes": [ - 5, - 7 - ], - "owned_monsters": [], - "gold_score": 2, - "strength_score": 0, - "magic_score": 1, - "victory_score": 0, - "is_first": true, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 0, - "effects": { - "roll_phase": [], - "harvest_phase": [], - "action_phase": [] - } - }, - { - "player_id": "QTjdvnZ36fBMhp8x5eaEQf", - "name": "Player 2", - "owned_starters": [ - 1, - 2 - ], - "owned_citizens": [], - "owned_domains": [], - "owned_dukes": [ - 18, - 14 - ], - "owned_monsters": [], - "gold_score": 2, - "strength_score": 0, - "magic_score": 1, - "victory_score": 0, - "is_first": false, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 0, - "effects": { - "roll_phase": [], - "harvest_phase": [], - "action_phase": [] - } - } - ], - "monster_grid": [ - [ - { - "name": "Troll", - "is_visible": true, - "is_accessible": false, - "monster_id": 28, - "area": "Valley", - "monster_type": "Boss", - "order": 7, - "strength_cost": 12, - "magic_cost": 0, - "vp_reward": 6, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 1, - "special_reward": "count area P.owned_monster 2 m\r\n", - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Satyr Mage", - "is_visible": true, - "is_accessible": false, - "monster_id": 27, - "area": "Valley", - "monster_type": "Warden", - "order": 6, - "strength_cost": 5, - "magic_cost": 5, - "vp_reward": 3, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 1, - "special_reward": "prompt choice 5 g 5 m 5 s", - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Giant", - "is_visible": true, - "is_accessible": false, - "monster_id": 26, - "area": "Valley", - "monster_type": "Titan", - "order": 5, - "strength_cost": 8, - "magic_cost": 0, - "vp_reward": 3, - "gold_reward": 1, - "strength_reward": 0, - "magic_reward": 2, - "has_special_reward": 0, - "special_reward": null, - "has_special_cost": null, - "special_cost": null, - "is_extra": 1, - "expansion": "base1" - }, - { - "name": "Giant", - "is_visible": true, - "is_accessible": false, - "monster_id": 25, - "area": "Valley", - "monster_type": "Titan", - "order": 4, - "strength_cost": 8, - "magic_cost": 0, - "vp_reward": 3, - "gold_reward": 1, - "strength_reward": 0, - "magic_reward": 2, - "has_special_reward": 0, - "special_reward": null, - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Owlbear", - "is_visible": true, - "is_accessible": false, - "monster_id": 24, - "area": "Valley", - "monster_type": "Beast", - "order": 3, - "strength_cost": 4, - "magic_cost": 0, - "vp_reward": 2, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 2, - "has_special_reward": 0, - "special_reward": null, - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Owlbear", - "is_visible": true, - "is_accessible": false, - "monster_id": 23, - "area": "Valley", - "monster_type": "Beast", - "order": 2, - "strength_cost": 4, - "magic_cost": 0, - "vp_reward": 2, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 2, - "has_special_reward": 0, - "special_reward": null, - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Owlbear", - "is_visible": true, - "is_accessible": true, - "monster_id": 22, - "area": "Valley", - "monster_type": "Beast", - "order": 1, - "strength_cost": 4, - "magic_cost": 0, - "vp_reward": 2, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 2, - "has_special_reward": 0, - "special_reward": null, - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - } - ], - [ - { - "name": "Goblin King", - "is_visible": true, - "is_accessible": false, - "monster_id": 6, - "area": "Hills", - "monster_type": "Boss", - "order": 7, - "strength_cost": 6, - "magic_cost": 0, - "vp_reward": 4, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 1, - "special_reward": "count area P.owned_monster 1 g", - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Goblin Bomber", - "is_visible": true, - "is_accessible": false, - "monster_id": 5, - "area": "Hills", - "monster_type": "Warden", - "order": 6, - "strength_cost": 5, - "magic_cost": 0, - "vp_reward": 3, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 1, - "special_reward": "prompt choice 2 g 2 m 2 s", - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Goblin Mage", - "is_visible": true, - "is_accessible": false, - "monster_id": 7, - "area": "Hills", - "monster_type": "Titan", - "order": 5, - "strength_cost": 3, - "magic_cost": 0, - "vp_reward": 2, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 1, - "special_reward": "prompt choice 1 g 1 m", - "has_special_cost": null, - "special_cost": null, - "is_extra": 1, - "expansion": "base1" - }, - { - "name": "Goblin Mage", - "is_visible": true, - "is_accessible": false, - "monster_id": 4, - "area": "Hills", - "monster_type": "Titan", - "order": 4, - "strength_cost": 3, - "magic_cost": 0, - "vp_reward": 2, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 1, - "special_reward": "prompt choice 1 g 1 m", - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Goblin", - "is_visible": true, - "is_accessible": false, - "monster_id": 3, - "area": "Hills", - "monster_type": "Minion", - "order": 3, - "strength_cost": 1, - "magic_cost": 0, - "vp_reward": 1, - "gold_reward": 1, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 0, - "special_reward": null, - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Goblin", - "is_visible": true, - "is_accessible": false, - "monster_id": 2, - "area": "Hills", - "monster_type": "Minion", - "order": 2, - "strength_cost": 1, - "magic_cost": 0, - "vp_reward": 1, - "gold_reward": 1, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 0, - "special_reward": null, - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Goblin", - "is_visible": true, - "is_accessible": true, - "monster_id": 1, - "area": "Hills", - "monster_type": "Minion", - "order": 1, - "strength_cost": 1, - "magic_cost": 0, - "vp_reward": 1, - "gold_reward": 1, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 0, - "special_reward": null, - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - } - ], - [ - { - "name": "Skeleton King", - "is_visible": true, - "is_accessible": false, - "monster_id": 14, - "area": "Ruins", - "monster_type": "Boss", - "order": 7, - "strength_cost": 8, - "magic_cost": 0, - "vp_reward": 4, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 1, - "special_reward": "count area P.owned_monster 2 g", - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Death Knight", - "is_visible": true, - "is_accessible": false, - "monster_id": 13, - "area": "Ruins", - "monster_type": "Warden", - "order": 6, - "strength_cost": 7, - "magic_cost": 0, - "vp_reward": 1, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 5, - "has_special_reward": 0, - "special_reward": null, - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Flaming Skeleton", - "is_visible": true, - "is_accessible": false, - "monster_id": 12, - "area": "Ruins", - "monster_type": "Titan", - "order": 5, - "strength_cost": 5, - "magic_cost": 0, - "vp_reward": 3, - "gold_reward": 1, - "strength_reward": 0, - "magic_reward": 1, - "has_special_reward": 0, - "special_reward": null, - "has_special_cost": null, - "special_cost": null, - "is_extra": 1, - "expansion": "base1" - }, - { - "name": "Flaming Skeleton", - "is_visible": true, - "is_accessible": false, - "monster_id": 11, - "area": "Ruins", - "monster_type": "Titan", - "order": 4, - "strength_cost": 5, - "magic_cost": 0, - "vp_reward": 3, - "gold_reward": 1, - "strength_reward": 0, - "magic_reward": 1, - "has_special_reward": 0, - "special_reward": null, - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Skeleton", - "is_visible": true, - "is_accessible": false, - "monster_id": 10, - "area": "Ruins", - "monster_type": "Minion", - "order": 3, - "strength_cost": 2, - "magic_cost": 0, - "vp_reward": 2, - "gold_reward": 1, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 0, - "special_reward": null, - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Skeleton", - "is_visible": true, - "is_accessible": false, - "monster_id": 9, - "area": "Ruins", - "monster_type": "Minion", - "order": 2, - "strength_cost": 2, - "magic_cost": 0, - "vp_reward": 2, - "gold_reward": 1, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 0, - "special_reward": null, - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Skeleton", - "is_visible": true, - "is_accessible": true, - "monster_id": 8, - "area": "Ruins", - "monster_type": "Minion", - "order": 1, - "strength_cost": 2, - "magic_cost": 0, - "vp_reward": 2, - "gold_reward": 1, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 0, - "special_reward": null, - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - } - ], - [ - { - "name": "Orc Chieftain", - "is_visible": true, - "is_accessible": false, - "monster_id": 35, - "area": "Mountain", - "monster_type": "Boss", - "order": 7, - "strength_cost": 14, - "magic_cost": 0, - "vp_reward": 6, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 1, - "special_reward": "count area P.owned_monster 2 g\r\n", - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Orc Batrider", - "is_visible": true, - "is_accessible": false, - "monster_id": 34, - "area": "Mountain", - "monster_type": "Warden", - "order": 6, - "strength_cost": 12, - "magic_cost": 0, - "vp_reward": 5, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 1, - "special_reward": "prompt choice citizen", - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Orc Warrior", - "is_visible": true, - "is_accessible": false, - "monster_id": 33, - "area": "Mountain", - "monster_type": "Minion", - "order": 5, - "strength_cost": 9, - "magic_cost": 0, - "vp_reward": 3, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 1, - "special_reward": "prompt choice citizen.gold_cost<=3", - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Orc Warrior", - "is_visible": true, - "is_accessible": false, - "monster_id": 32, - "area": "Mountain", - "monster_type": "Minion", - "order": 4, - "strength_cost": 9, - "magic_cost": 0, - "vp_reward": 3, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 1, - "special_reward": "prompt choice citizen.gold_cost<=3", - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Dire Bear", - "is_visible": true, - "is_accessible": false, - "monster_id": 31, - "area": "Mountain", - "monster_type": "Beast", - "order": 3, - "strength_cost": 5, - "magic_cost": 0, - "vp_reward": 3, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 1, - "special_reward": "prompt choice 2 g 2 m", - "has_special_cost": null, - "special_cost": null, - "is_extra": 1, - "expansion": "base1" - }, - { - "name": "Dire Bear", - "is_visible": true, - "is_accessible": false, - "monster_id": 30, - "area": "Mountain", - "monster_type": "Beast", - "order": 2, - "strength_cost": 5, - "magic_cost": 0, - "vp_reward": 3, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 1, - "special_reward": "prompt choice 2 g 2 m", - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Dire Bear", - "is_visible": true, - "is_accessible": true, - "monster_id": 29, - "area": "Mountain", - "monster_type": "Beast", - "order": 1, - "strength_cost": 5, - "magic_cost": 0, - "vp_reward": 3, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 1, - "special_reward": "prompt choice 2 g 2 m", - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - } - ], - [ - { - "name": "Spider Queen", - "is_visible": true, - "is_accessible": false, - "monster_id": 21, - "area": "Forest", - "monster_type": "Boss", - "order": 7, - "strength_cost": 10, - "magic_cost": 3, - "vp_reward": 5, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 1, - "special_reward": "prompt choice count area 2 g citizen and 1 vp", - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Ettercap", - "is_visible": true, - "is_accessible": false, - "monster_id": 20, - "area": "Forest", - "monster_type": "Warden", - "order": 6, - "strength_cost": 3, - "magic_cost": 5, - "vp_reward": 2, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 1, - "special_reward": "prompt choice citizen.gold_cost<=2", - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Bane Spider", - "is_visible": true, - "is_accessible": false, - "monster_id": 19, - "area": "Forest", - "monster_type": "Beast", - "order": 5, - "strength_cost": 6, - "magic_cost": 0, - "vp_reward": 2, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 1, - "special_reward": "prompt choice 3 g 1 Knight", - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Bane Spider", - "is_visible": true, - "is_accessible": false, - "monster_id": 18, - "area": "Forest", - "monster_type": "Beast", - "order": 4, - "strength_cost": 6, - "magic_cost": 0, - "vp_reward": 2, - "gold_reward": 0, - "strength_reward": 0, - "magic_reward": 0, - "has_special_reward": 1, - "special_reward": "prompt choice 3 g 1 Knight", - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Treant", - "is_visible": true, - "is_accessible": false, - "monster_id": 17, - "area": "Forest", - "monster_type": "Minion", - "order": 3, - "strength_cost": 3, - "magic_cost": 0, - "vp_reward": 1, - "gold_reward": 1, - "strength_reward": 0, - "magic_reward": 1, - "has_special_reward": 0, - "special_reward": null, - "has_special_cost": null, - "special_cost": null, - "is_extra": 1, - "expansion": "base1" - }, - { - "name": "Treant", - "is_visible": true, - "is_accessible": false, - "monster_id": 16, - "area": "Forest", - "monster_type": "Minion", - "order": 2, - "strength_cost": 3, - "magic_cost": 0, - "vp_reward": 1, - "gold_reward": 1, - "strength_reward": 0, - "magic_reward": 1, - "has_special_reward": 0, - "special_reward": null, - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - }, - { - "name": "Treant", - "is_visible": true, - "is_accessible": true, - "monster_id": 15, - "area": "Forest", - "monster_type": "Minion", - "order": 1, - "strength_cost": 3, - "magic_cost": 0, - "vp_reward": 1, - "gold_reward": 1, - "strength_reward": 0, - "magic_reward": 1, - "has_special_reward": 0, - "special_reward": null, - "has_special_cost": null, - "special_cost": null, - "is_extra": 0, - "expansion": "base1" - } - ] - ], - "citizen_grid": [ - [ - { - "name": "Cleric", - "is_visible": true, - "is_accessible": false, - "citizen_id": 1, - "gold_cost": 3, - "roll_match1": 1, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 1, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 3, - "magic_payout_off_turn": 1, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Cleric", - "is_visible": true, - "is_accessible": false, - "citizen_id": 1, - "gold_cost": 3, - "roll_match1": 1, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 1, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 3, - "magic_payout_off_turn": 1, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Cleric", - "is_visible": true, - "is_accessible": false, - "citizen_id": 1, - "gold_cost": 3, - "roll_match1": 1, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 1, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 3, - "magic_payout_off_turn": 1, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Cleric", - "is_visible": true, - "is_accessible": false, - "citizen_id": 1, - "gold_cost": 3, - "roll_match1": 1, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 1, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 3, - "magic_payout_off_turn": 1, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Cleric", - "is_visible": true, - "is_accessible": true, - "citizen_id": 1, - "gold_cost": 3, - "roll_match1": 1, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 1, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 3, - "magic_payout_off_turn": 1, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - } - ], - [ - { - "name": "Merchant", - "is_visible": true, - "is_accessible": false, - "citizen_id": 2, - "gold_cost": 2, - "roll_match1": 2, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 1, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 1, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 1, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": "prompt choice 2 g 2 m", - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Merchant", - "is_visible": true, - "is_accessible": false, - "citizen_id": 2, - "gold_cost": 2, - "roll_match1": 2, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 1, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 1, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 1, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": "prompt choice 2 g 2 m", - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Merchant", - "is_visible": true, - "is_accessible": false, - "citizen_id": 2, - "gold_cost": 2, - "roll_match1": 2, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 1, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 1, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 1, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": "prompt choice 2 g 2 m", - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Merchant", - "is_visible": true, - "is_accessible": false, - "citizen_id": 2, - "gold_cost": 2, - "roll_match1": 2, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 1, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 1, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 1, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": "prompt choice 2 g 2 m", - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Merchant", - "is_visible": true, - "is_accessible": true, - "citizen_id": 2, - "gold_cost": 2, - "roll_match1": 2, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 1, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 1, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 1, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": "prompt choice 2 g 2 m", - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - } - ], - [ - { - "name": "Mercenary", - "is_visible": true, - "is_accessible": false, - "citizen_id": 3, - "gold_cost": 3, - "roll_match1": 3, - "roll_match2": 0, - "shadow_count": 1, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 1, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 1, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 1, - "special_payout_on_turn": null, - "special_payout_off_turn": "exchange 1 s 2 g", - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Mercenary", - "is_visible": true, - "is_accessible": false, - "citizen_id": 3, - "gold_cost": 3, - "roll_match1": 3, - "roll_match2": 0, - "shadow_count": 1, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 1, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 1, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 1, - "special_payout_on_turn": null, - "special_payout_off_turn": "exchange 1 s 2 g", - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Mercenary", - "is_visible": true, - "is_accessible": false, - "citizen_id": 3, - "gold_cost": 3, - "roll_match1": 3, - "roll_match2": 0, - "shadow_count": 1, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 1, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 1, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 1, - "special_payout_on_turn": null, - "special_payout_off_turn": "exchange 1 s 2 g", - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Mercenary", - "is_visible": true, - "is_accessible": false, - "citizen_id": 3, - "gold_cost": 3, - "roll_match1": 3, - "roll_match2": 0, - "shadow_count": 1, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 1, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 1, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 1, - "special_payout_on_turn": null, - "special_payout_off_turn": "exchange 1 s 2 g", - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Mercenary", - "is_visible": true, - "is_accessible": true, - "citizen_id": 3, - "gold_cost": 3, - "roll_match1": 3, - "roll_match2": 0, - "shadow_count": 1, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 1, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 1, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 1, - "special_payout_on_turn": null, - "special_payout_off_turn": "exchange 1 s 2 g", - "special_citizen": 0, - "expansion": "base1" - } - ], - [ - { - "name": "Archer", - "is_visible": true, - "is_accessible": false, - "citizen_id": 4, - "gold_cost": 4, - "roll_match1": 4, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 1, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 2, - "strength_payout_off_turn": 1, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Archer", - "is_visible": true, - "is_accessible": false, - "citizen_id": 4, - "gold_cost": 4, - "roll_match1": 4, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 1, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 2, - "strength_payout_off_turn": 1, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Archer", - "is_visible": true, - "is_accessible": false, - "citizen_id": 4, - "gold_cost": 4, - "roll_match1": 4, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 1, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 2, - "strength_payout_off_turn": 1, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Archer", - "is_visible": true, - "is_accessible": false, - "citizen_id": 4, - "gold_cost": 4, - "roll_match1": 4, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 1, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 2, - "strength_payout_off_turn": 1, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Archer", - "is_visible": true, - "is_accessible": true, - "citizen_id": 4, - "gold_cost": 4, - "roll_match1": 4, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 1, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 2, - "strength_payout_off_turn": 1, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - } - ], - [ - { - "name": "Peasant", - "is_visible": true, - "is_accessible": false, - "citizen_id": 5, - "gold_cost": 2, - "roll_match1": 5, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 1, - "gold_payout_on_turn": 1, - "gold_payout_off_turn": 1, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Peasant", - "is_visible": true, - "is_accessible": false, - "citizen_id": 5, - "gold_cost": 2, - "roll_match1": 5, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 1, - "gold_payout_on_turn": 1, - "gold_payout_off_turn": 1, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Peasant", - "is_visible": true, - "is_accessible": false, - "citizen_id": 5, - "gold_cost": 2, - "roll_match1": 5, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 1, - "gold_payout_on_turn": 1, - "gold_payout_off_turn": 1, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Peasant", - "is_visible": true, - "is_accessible": false, - "citizen_id": 5, - "gold_cost": 2, - "roll_match1": 5, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 1, - "gold_payout_on_turn": 1, - "gold_payout_off_turn": 1, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Peasant", - "is_visible": true, - "is_accessible": true, - "citizen_id": 5, - "gold_cost": 2, - "roll_match1": 5, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 1, - "gold_payout_on_turn": 1, - "gold_payout_off_turn": 1, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - } - ], - [ - { - "name": "Knight", - "is_visible": true, - "is_accessible": false, - "citizen_id": 6, - "gold_cost": 2, - "roll_match1": 6, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 1, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 1, - "strength_payout_off_turn": 1, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Knight", - "is_visible": true, - "is_accessible": false, - "citizen_id": 6, - "gold_cost": 2, - "roll_match1": 6, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 1, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 1, - "strength_payout_off_turn": 1, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Knight", - "is_visible": true, - "is_accessible": false, - "citizen_id": 6, - "gold_cost": 2, - "roll_match1": 6, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 1, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 1, - "strength_payout_off_turn": 1, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Knight", - "is_visible": true, - "is_accessible": false, - "citizen_id": 6, - "gold_cost": 2, - "roll_match1": 6, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 1, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 1, - "strength_payout_off_turn": 1, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Knight", - "is_visible": true, - "is_accessible": true, - "citizen_id": 6, - "gold_cost": 2, - "roll_match1": 6, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 1, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 1, - "strength_payout_off_turn": 1, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - } - ], - [ - { - "name": "Rogue", - "is_visible": true, - "is_accessible": false, - "citizen_id": 7, - "gold_cost": 2, - "roll_match1": 7, - "roll_match2": 0, - "shadow_count": 1, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 2, - "gold_payout_off_turn": 1, - "strength_payout_on_turn": 2, - "strength_payout_off_turn": 1, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Rogue", - "is_visible": true, - "is_accessible": false, - "citizen_id": 7, - "gold_cost": 2, - "roll_match1": 7, - "roll_match2": 0, - "shadow_count": 1, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 2, - "gold_payout_off_turn": 1, - "strength_payout_on_turn": 2, - "strength_payout_off_turn": 1, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Rogue", - "is_visible": true, - "is_accessible": false, - "citizen_id": 7, - "gold_cost": 2, - "roll_match1": 7, - "roll_match2": 0, - "shadow_count": 1, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 2, - "gold_payout_off_turn": 1, - "strength_payout_on_turn": 2, - "strength_payout_off_turn": 1, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Rogue", - "is_visible": true, - "is_accessible": false, - "citizen_id": 7, - "gold_cost": 2, - "roll_match1": 7, - "roll_match2": 0, - "shadow_count": 1, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 2, - "gold_payout_off_turn": 1, - "strength_payout_on_turn": 2, - "strength_payout_off_turn": 1, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Rogue", - "is_visible": true, - "is_accessible": true, - "citizen_id": 7, - "gold_cost": 2, - "roll_match1": 7, - "roll_match2": 0, - "shadow_count": 1, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 2, - "gold_payout_off_turn": 1, - "strength_payout_on_turn": 2, - "strength_payout_off_turn": 1, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": null, - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - } - ], - [ - { - "name": "Champion", - "is_visible": true, - "is_accessible": false, - "citizen_id": 8, - "gold_cost": 2, - "roll_match1": 8, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 1, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 4, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 1, - "special_payout_on_turn": null, - "special_payout_off_turn": "exchange 1 g 4 s", - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Champion", - "is_visible": true, - "is_accessible": false, - "citizen_id": 8, - "gold_cost": 2, - "roll_match1": 8, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 1, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 4, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 1, - "special_payout_on_turn": null, - "special_payout_off_turn": "exchange 1 g 4 s", - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Champion", - "is_visible": true, - "is_accessible": false, - "citizen_id": 8, - "gold_cost": 2, - "roll_match1": 8, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 1, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 4, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 1, - "special_payout_on_turn": null, - "special_payout_off_turn": "exchange 1 g 4 s", - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Champion", - "is_visible": true, - "is_accessible": false, - "citizen_id": 8, - "gold_cost": 2, - "roll_match1": 8, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 1, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 4, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 1, - "special_payout_on_turn": null, - "special_payout_off_turn": "exchange 1 g 4 s", - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Champion", - "is_visible": true, - "is_accessible": true, - "citizen_id": 8, - "gold_cost": 2, - "roll_match1": 8, - "roll_match2": 0, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 1, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 4, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 1, - "special_payout_on_turn": null, - "special_payout_off_turn": "exchange 1 g 4 s", - "special_citizen": 0, - "expansion": "base1" - } - ], - [ - { - "name": "Paladin", - "is_visible": true, - "is_accessible": false, - "citizen_id": 9, - "gold_cost": 2, - "roll_match1": 9, - "roll_match2": 10, - "shadow_count": 0, - "holy_count": 1, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 1, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 2, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 1, - "special_payout_on_turn": null, - "special_payout_off_turn": "exchange 1 s 3 m", - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Paladin", - "is_visible": true, - "is_accessible": false, - "citizen_id": 9, - "gold_cost": 2, - "roll_match1": 9, - "roll_match2": 10, - "shadow_count": 0, - "holy_count": 1, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 1, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 2, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 1, - "special_payout_on_turn": null, - "special_payout_off_turn": "exchange 1 s 3 m", - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Paladin", - "is_visible": true, - "is_accessible": false, - "citizen_id": 9, - "gold_cost": 2, - "roll_match1": 9, - "roll_match2": 10, - "shadow_count": 0, - "holy_count": 1, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 1, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 2, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 1, - "special_payout_on_turn": null, - "special_payout_off_turn": "exchange 1 s 3 m", - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Paladin", - "is_visible": true, - "is_accessible": false, - "citizen_id": 9, - "gold_cost": 2, - "roll_match1": 9, - "roll_match2": 10, - "shadow_count": 0, - "holy_count": 1, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 1, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 2, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 1, - "special_payout_on_turn": null, - "special_payout_off_turn": "exchange 1 s 3 m", - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Paladin", - "is_visible": true, - "is_accessible": true, - "citizen_id": 9, - "gold_cost": 2, - "roll_match1": 9, - "roll_match2": 10, - "shadow_count": 0, - "holy_count": 1, - "soldier_count": 0, - "worker_count": 0, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 0, - "strength_payout_on_turn": 1, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 2, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 0, - "has_special_payout_off_turn": 1, - "special_payout_on_turn": null, - "special_payout_off_turn": "exchange 1 s 3 m", - "special_citizen": 0, - "expansion": "base1" - } - ], - [ - { - "name": "Butcher", - "is_visible": true, - "is_accessible": false, - "citizen_id": 10, - "gold_cost": 1, - "roll_match1": 11, - "roll_match2": 12, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 1, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 4, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 1, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": "count P.owned_worker 2 g", - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Butcher", - "is_visible": true, - "is_accessible": false, - "citizen_id": 10, - "gold_cost": 1, - "roll_match1": 11, - "roll_match2": 12, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 1, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 4, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 1, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": "count P.owned_worker 2 g", - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Butcher", - "is_visible": true, - "is_accessible": false, - "citizen_id": 10, - "gold_cost": 1, - "roll_match1": 11, - "roll_match2": 12, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 1, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 4, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 1, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": "count P.owned_worker 2 g", - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Butcher", - "is_visible": true, - "is_accessible": false, - "citizen_id": 10, - "gold_cost": 1, - "roll_match1": 11, - "roll_match2": 12, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 1, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 4, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 1, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": "count P.owned_worker 2 g", - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - }, - { - "name": "Butcher", - "is_visible": true, - "is_accessible": true, - "citizen_id": 10, - "gold_cost": 1, - "roll_match1": 11, - "roll_match2": 12, - "shadow_count": 0, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 1, - "gold_payout_on_turn": 0, - "gold_payout_off_turn": 4, - "strength_payout_on_turn": 0, - "strength_payout_off_turn": 0, - "magic_payout_on_turn": 0, - "magic_payout_off_turn": 0, - "has_special_payout_on_turn": 1, - "has_special_payout_off_turn": 0, - "special_payout_on_turn": "count P.owned_worker 2 g", - "special_payout_off_turn": null, - "special_citizen": 0, - "expansion": "base1" - } - ] - ], - "domain_grid": [ - [ - { - "name": "King Tower", - "is_visible": false, - "is_accessible": false, - "domain_id": 12, - "gold_cost": 12, - "shadow_count": 0, - "holy_count": 1, - "soldier_count": 0, - "worker_count": 2, - "vp_reward": 3, - "has_activation_effect": 0, - "has_passive_effect": 1, - "passive_effect": null, - "activation_effect": null, - "text": "At the end of your Action Phase, pay 1mp to a Player of your choice to gain 1vp.", - "expansion": null - }, - { - "name": "Pretorius Conclave", - "is_visible": false, - "is_accessible": false, - "domain_id": 5, - "gold_cost": 8, - "shadow_count": 1, - "holy_count": 1, - "soldier_count": 1, - "worker_count": 1, - "vp_reward": 2, - "has_activation_effect": 1, - "has_passive_effect": 0, - "passive_effect": null, - "activation_effect": null, - "text": "Immediately gain a Citizen from the center stacks.", - "expansion": null - }, - { - "name": "Cathedral of St Aquila", - "is_visible": true, - "is_accessible": true, - "domain_id": 9, - "gold_cost": 8, - "shadow_count": 0, - "holy_count": 2, - "soldier_count": 0, - "worker_count": 0, - "vp_reward": 3, - "has_activation_effect": 0, - "has_passive_effect": 1, - "passive_effect": null, - "activation_effect": null, - "text": "At the end of your Action phase, take 1gp from a Player of your choice.", - "expansion": null - } - ], - [ - { - "name": "Pratchett's Plateau", - "is_visible": false, - "is_accessible": false, - "domain_id": 7, - "gold_cost": 8, - "shadow_count": 0, - "holy_count": 1, - "soldier_count": 0, - "worker_count": 1, - "vp_reward": 3, - "has_activation_effect": 0, - "has_passive_effect": 1, - "passive_effect": null, - "activation_effect": null, - "text": "During your Action phase, Domains cost you 1gp less to buy.", - "expansion": null - }, - { - "name": "Ancient Tomb", - "is_visible": false, - "is_accessible": false, - "domain_id": 2, - "gold_cost": 7, - "shadow_count": 0, - "holy_count": 1, - "soldier_count": 1, - "worker_count": 1, - "vp_reward": 3, - "has_activation_effect": 1, - "has_passive_effect": 0, - "passive_effect": null, - "activation_effect": null, - "text": "Immediately add 3sp to a Monster Strength value.", - "expansion": null - }, - { - "name": "Wisborg", - "is_visible": true, - "is_accessible": true, - "domain_id": 15, - "gold_cost": 6, - "shadow_count": 1, - "holy_count": 0, - "soldier_count": 0, - "worker_count": 2, - "vp_reward": 3, - "has_activation_effect": 1, - "has_passive_effect": 0, - "passive_effect": null, - "activation_effect": null, - "text": "You may immediately pay 3gp to gain 3vp.", - "expansion": null - } - ], - [ - { - "name": "Emerald Stronghold", - "is_visible": false, - "is_accessible": false, - "domain_id": 6, - "gold_cost": 12, - "shadow_count": 0, - "holy_count": 1, - "soldier_count": 1, - "worker_count": 1, - "vp_reward": 5, - "has_activation_effect": 0, - "has_passive_effect": 1, - "passive_effect": "effect add emraldstronghold", - "activation_effect": null, - "text": "During your Action phase, ignore '+' when buying Citizens.", - "expansion": null - }, - { - "name": "Shelley Commons", - "is_visible": false, - "is_accessible": false, - "domain_id": 8, - "gold_cost": 13, - "shadow_count": 0, - "holy_count": 1, - "soldier_count": 1, - "worker_count": 1, - "vp_reward": 4, - "has_activation_effect": 0, - "has_passive_effect": 1, - "passive_effect": "effect add shelleycommons", - "activation_effect": null, - "text": "At the end of your Action phase, pay 1gp to a Player of your choice to gain 1vp.", - "expansion": null - }, - { - "name": "Foxgrove Palisade", - "is_visible": true, - "is_accessible": true, - "domain_id": 3, - "gold_cost": 9, - "shadow_count": 1, - "holy_count": 0, - "soldier_count": 1, - "worker_count": 0, - "vp_reward": 3, - "has_activation_effect": 0, - "has_passive_effect": 1, - "passive_effect": "effect add P.rollphase foxgrovepalisade", - "activation_effect": null, - "text": "During your Roll Phase, you may pay 2gp to change one die to equal 6.", - "expansion": null - } - ], - [ - { - "name": "The Desert Orchid", - "is_visible": false, - "is_accessible": false, - "domain_id": 4, - "gold_cost": 9, - "shadow_count": 1, - "holy_count": 1, - "soldier_count": 0, - "worker_count": 0, - "vp_reward": 3, - "has_activation_effect": 0, - "has_passive_effect": 1, - "passive_effect": null, - "activation_effect": null, - "text": "During your Roll Phase, you may pay 1gp * owned Holy Citizens to change one die to equal 1.", - "expansion": null - }, - { - "name": "Cloudrider's Camp", - "is_visible": false, - "is_accessible": false, - "domain_id": 13, - "gold_cost": 8, - "shadow_count": 0, - "holy_count": 1, - "soldier_count": 1, - "worker_count": 0, - "vp_reward": 2, - "has_activation_effect": 1, - "has_passive_effect": 0, - "passive_effect": null, - "activation_effect": null, - "text": "Immediately gain 3sp and a Soldier Citizen worth 2gp or less.", - "expansion": null - }, - { - "name": "The Orb of Urdr", - "is_visible": true, - "is_accessible": true, - "domain_id": 14, - "gold_cost": 6, - "shadow_count": 1, - "holy_count": 1, - "soldier_count": 0, - "worker_count": 0, - "vp_reward": 1, - "has_activation_effect": 0, - "has_passive_effect": 1, - "passive_effect": null, - "activation_effect": null, - "text": "At the end of your Action Phase, take 1mp from a Player of your choice.", - "expansion": null - } - ], - [ - { - "name": "Jousting Field", - "is_visible": false, - "is_accessible": false, - "domain_id": 1, - "gold_cost": 13, - "shadow_count": 1, - "holy_count": 0, - "soldier_count": 1, - "worker_count": 1, - "vp_reward": 3, - "has_activation_effect": 0, - "has_passive_effect": 1, - "passive_effect": "effect add P.harvestphase joustingfield", - "activation_effect": null, - "text": "During your Harvest Phase, gain 1gp * Knight you own.", - "expansion": null - }, - { - "name": "Cursed Cavern", - "is_visible": false, - "is_accessible": false, - "domain_id": 10, - "gold_cost": 10, - "shadow_count": 1, - "holy_count": 1, - "soldier_count": 0, - "worker_count": 1, - "vp_reward": 2, - "has_activation_effect": 1, - "has_passive_effect": 0, - "passive_effect": null, - "activation_effect": null, - "text": "All players immediately flip a Citizen and you gain 4mp.", - "expansion": null - }, - { - "name": "Darktide Harbour", - "is_visible": true, - "is_accessible": true, - "domain_id": 11, - "gold_cost": 6, - "shadow_count": 1, - "holy_count": 0, - "soldier_count": 1, - "worker_count": 1, - "vp_reward": 2, - "has_activation_effect": 1, - "has_passive_effect": 0, - "passive_effect": null, - "activation_effect": "effect add darktideharbour", - "text": "Immediately gain a Shadow Citizen from the center stacks.", - "expansion": null - } - ] - ], - "die_one": 6, - "die_two": 6, - "die_sum": 12, - "exhausted_count": 0, - "effects": { - "roll_phase": [], - "harvest_phase": [], - "action_phase": [] - }, - "action_required": { - "player_id": "", - "action": "" - } -} \ No newline at end of file diff --git a/server.py b/server.py index 70f21d8..dc9f6ae 100755 --- a/server.py +++ b/server.py @@ -264,93 +264,94 @@ def load_game_data(game_id, preset, player_list_from_lobby): row['has_special_payout_on_turn'], row['has_special_payout_off_turn'], row['special_payout_on_turn'], row['special_payout_off_turn'], row['expansion']) starter_stack.append(my_starter) - except Exception as e: - print(f"Error: {e}") - finally: my_cursor.close() my_connect.close() - print(f"size of monster stack: {len(monster_stack)}") - print(f"size of citizen stack: {len(citizen_stack)}") - print(f"size of domain stack: {len(domain_stack)}") - print(f"size of duke stack: {len(duke_stack)}") - print(f"size of starter stack: {len(starter_stack)}") + except Exception as e: + print(f"Error: {e}") + # print(f"size of monster stack: {len(monster_stack)}") + # print(f"size of citizen stack: {len(citizen_stack)}") + # print(f"size of domain stack: {len(domain_stack)}") + # print(f"size of duke stack: {len(duke_stack)}") + # print(f"size of starter stack: {len(starter_stack)}") # create players and determine order - for player in player_list_from_lobby: - my_player = Player(player.player_id, player.name) - player_list.append(my_player) - random.shuffle(player_list) - player_list[0].is_first = True - # give players starters and dukes - for player in player_list: - player.owned_starters.append(starter_stack[0]) - player.owned_starters.append(starter_stack[1]) - for i in range(2): - player.owned_dukes.append(duke_stack.pop()) - # deal monsters onto the board - grouped_monsters = {} - for monster in monster_stack: - area = monster.area - if area in grouped_monsters: - grouped_monsters[area].append(monster) - else: - grouped_monsters[area] = [monster] - # Reverse the order of each group by monster_order - for area, monsters in grouped_monsters.items(): - monsters.sort(key=lambda item: item.order, reverse=True) - areas = list(grouped_monsters.keys()) - chosen_areas = random.sample(areas, 5) - for i, area in enumerate(chosen_areas): - monsters = grouped_monsters[area] - monster_grid[i].extend(monsters) - for i, stack in enumerate(monster_grid): - for monster in stack: - monster.toggle_visibility(True) - # Make the last monster in the stack accessible - stack[-1].toggle_accessibility(True) - monster_stack = [] - # deal citizens onto the board - # Create a dictionary to store citizen lists with roll numbers as keys - citizens_by_roll = {roll: [] for roll in [1, 2, 3, 4, 5, 6, 7, 8, 9, 11]} - # Group citizens by roll number - for citizen in citizen_stack: - citizen.toggle_visibility() - citizens_by_roll[citizen.roll_match1].append(citizen) - for roll in citizens_by_roll: - # Map 11 roll to index 9 - index = roll - 1 if roll < 11 else 9 - citizens = citizens_by_roll[roll] - citizen_grid[index].extend(list(citizens)) - # Make the first citizen in each list accessible - citizen_grid[index][-1].toggle_accessibility(True) - citizen_stack = [] - # Deal the domains into the stacks - for i in range(5): - stack = domain_grid[i] - for j in range(3): - if j == 2: # top domain is visible and accessible - domain = domain_stack.pop() - domain.toggle_visibility(True) - domain.toggle_accessibility(True) - stack.append(domain) - else: # other domains are not visible or accessible - domain = domain_stack.pop() - stack.append(domain) - - # Create a dictionary to store all the stacks - game_state = {'game_id': game_id, - 'player_list': player_list, - 'monster_grid': monster_grid, - 'citizen_grid': citizen_grid, - 'domain_grid': domain_grid, - 'die_one': die_one, - 'die_two': die_two, - 'die_sum': die_sum, - 'exhausted_count': exhausted_count, - 'effects': effects, - 'action_required': action_required} + if not all([player_list_from_lobby, starter_query, monster_stack, citizen_stack, domain_stack, duke_stack]): + raise ValueError("One or more required lists are empty.") + else: + for player in player_list_from_lobby: + my_player = Player(player.player_id, player.name) + player_list.append(my_player) + random.shuffle(player_list) + player_list[0].is_first = True + # give players starters and dukes + for player in player_list: + player.owned_starters.append(starter_stack[0]) + player.owned_starters.append(starter_stack[1]) + for i in range(2): + player.owned_dukes.append(duke_stack.pop()) + # deal monsters onto the board + grouped_monsters = {} + for monster in monster_stack: + area = monster.area + if area in grouped_monsters: + grouped_monsters[area].append(monster) + else: + grouped_monsters[area] = [monster] + # Reverse the order of each group by monster_order + for area, monsters in grouped_monsters.items(): + monsters.sort(key=lambda item: item.order, reverse=True) + areas = list(grouped_monsters.keys()) + chosen_areas = random.sample(areas, 5) + for i, area in enumerate(chosen_areas): + monsters = grouped_monsters[area] + monster_grid[i].extend(monsters) + for i, stack in enumerate(monster_grid): + for monster in stack: + monster.toggle_visibility(True) + # Make the last monster in the stack accessible + stack[-1].toggle_accessibility(True) + monster_stack = [] + # deal citizens onto the board + # Create a dictionary to store citizen lists with roll numbers as keys + citizens_by_roll = {roll: [] for roll in [1, 2, 3, 4, 5, 6, 7, 8, 9, 11]} + # Group citizens by roll number + for citizen in citizen_stack: + citizen.toggle_visibility() + citizens_by_roll[citizen.roll_match1].append(citizen) + for roll in citizens_by_roll: + # Map 11 roll to index 9 + index = roll - 1 if roll < 11 else 9 + citizens = citizens_by_roll[roll] + citizen_grid[index].extend(list(citizens)) + # Make the first citizen in each list accessible + citizen_grid[index][-1].toggle_accessibility(True) + citizen_stack = [] + # Deal the domains into the stacks + for i in range(5): + stack = domain_grid[i] + for j in range(3): + if j == 2: # top domain is visible and accessible + domain = domain_stack.pop() + domain.toggle_visibility(True) + domain.toggle_accessibility(True) + stack.append(domain) + else: # other domains are not visible or accessible + domain = domain_stack.pop() + stack.append(domain) + # Create a dictionary to store all the stacks + game_state = {'game_id': game_id, + 'player_list': player_list, + 'monster_grid': monster_grid, + 'citizen_grid': citizen_grid, + 'domain_grid': domain_grid, + 'die_one': die_one, + 'die_two': die_two, + 'die_sum': die_sum, + 'exhausted_count': exhausted_count, + 'effects': effects, + 'action_required': action_required} # Return the dictionary - return game_state + return game_state if __name__ == '__main__': diff --git a/vckonline.py b/vckonline.py index 0713d3b..1db908a 100755 --- a/vckonline.py +++ b/vckonline.py @@ -1,11 +1,34 @@ from common import * from server import load_game_data -player1 = Player(shortuuid.uuid(), "Player 1") -player2 = Player(shortuuid.uuid(), "Player 2") +player1_id = shortuuid.uuid() +player2_id = shortuuid.uuid() +player1 = Player(player1_id, "Player 1") +player2 = Player(player2_id, "Player 2") player_list = [player1, player2] -base1_new_game_state = load_game_data(str(uuid.uuid4()), "base1", player_list) -game_board = Game(base1_new_game_state) -game_board.play_turn() -game_json = json.dumps(game_board, cls=GameObjectEncoder, indent=2) -with open("gamestate.txt", "w") as dump: - dump.write(game_json) \ No newline at end of file +try: + base1_new_game_state = load_game_data(str(uuid.uuid4()), "base1", player_list) + game = Game(base1_new_game_state) + game.hire_citizen(player1_id, 1, 0, 0) + game.hire_citizen(player1_id, 3, 0, 0) + game.hire_citizen(player1_id, 4, 0, 0) + game.hire_citizen(player1_id, 5, 0, 0) + game.hire_citizen(player1_id, 6, 0, 0) + game.hire_citizen(player1_id, 7, 0, 0) + game.hire_citizen(player1_id, 8, 0, 0) + game.hire_citizen(player1_id, 9, 0, 0) + game.hire_citizen(player1_id, 10, 0, 0) + game.hire_citizen(player2_id, 1, 0, 0) + game.hire_citizen(player2_id, 3, 0, 0) + game.hire_citizen(player2_id, 4, 0, 0) + game.hire_citizen(player2_id, 5, 0, 0) + game.hire_citizen(player2_id, 6, 0, 0) + game.hire_citizen(player2_id, 7, 0, 0) + game.hire_citizen(player2_id, 8, 0, 0) + game.hire_citizen(player2_id, 9, 0, 0) + game.hire_citizen(player2_id, 10, 0, 0) + game.play_turn() + game_json = json.dumps(game, cls=GameObjectEncoder, indent=2) + with open("game_state.txt", "w") as dump: + dump.write(game_json) +except ValueError: + print("Error: Failed to load game data")