class Application: def __init__(self): self.main_window = MainWindow() self.main_widget = None self.main_window.directory_signal.connect(self.file_IO) self.main_window.new_sheet.connect(self.new_sheet) self.sheet = None def reset_window(self): self.main_window.clear() self.main_window.create() self.main_widget = self.main_window.window_widget def new_sheet(self, robot=False): self.sheet = Character(robot, version) self.reset_window() self.load_sheet() def load_sheet(self): self.reset_window() alt = self.sheet.is_robot self.main_widget.fill_tab1(self.sheet.character, self.sheet.attributes, self.sheet.skills, self.sheet.armor_names, self.ability_validator, alternative=alt) self.main_widget.fill_tab2(self.sheet.is_robot) self.main_widget.fill_tab3( [a for a in self.sheet.notes if a != "notes_money"]) # Register attributes for attribute in self.main_widget.attribute_dict: att_class = self.main_widget.attribute_dict[attribute] att_class.attribute_changed.connect(self.change_attribute) # Register skills for skill in self.main_widget.skills_dict: skill_class = self.main_widget.skills_dict[skill] if not self.sheet.is_robot and skill in self.sheet.naturals: skill_class.set_natural(True) skill_class.skill_changed.connect(self.change_skill) # Register params for parameter in self.main_widget.params_dict: param_class = self.main_widget.params_dict[parameter] param_class.value_changed.connect(self.change_parameter) # Register notes for notebook in self.main_widget.notes_dict: note_class = self.main_widget.notes_dict[notebook] note_class.text_changed.connect(self.sheet.change_notes) # Register equipment for scroll in self.main_widget.scrolls: self.main_widget.scrolls[scroll].item_equipped.connect( self.equip_item) self.main_widget.scrolls[scroll].item_created.connect( self.create_item) self.main_widget.scrolls[scroll].item_removed.connect( self.remove_item) self.main_widget.scrolls[scroll].item_edited.connect( self.update_form) self.main_widget.equipment_tables.set_items(self.sheet.items) self.main_widget.equipment_tables.item_create.connect(self.create_item) self.main_widget.equipment_tables.item_qty_changed.connect( self.change_item_quantity) self.main_widget.equipment_tables.move_item.connect(self.move_item) self.main_widget.equipment_tables.delete_item.connect(self.remove_item) self.main_widget.current_weapon_widget.shoot_weapon.connect( self.shoot_weapon) self.main_widget.current_weapon_widget.swap_weapon.connect( self.swap_weapon) self.update_form() def shoot_weapon(self, weapon): self.main_window.open_calculator(sheet=self.sheet, weapon=weapon) def swap_weapon(self, direction): weapons = self.sheet.get_equipped_weapons() weapons = sorted(weapons, key=lambda x: x.name) current_weapon = self.main_widget.current_weapon_widget.weapon if current_weapon not in weapons: self.main_widget.current_weapon_widget.set_weapon(weapons[0]) return def file_IO(self, *args): path, action = args if action == "open": self.read_character(path) if action == "save": self.save_character(path) def read_character(self, path): self.sheet = pickle.load(open(path, "rb")) self.sheet = sheet_compatibility_check(self.sheet) self.load_sheet() def save_character(self, path): if self.sheet is None: return pickle.dump(self.sheet, open(path, "wb")) # Attribute Handling def update_attribute(self, attribute): val = self.sheet.attributes[attribute] self.main_widget.attribute_dict[attribute].set_base(val) val = self.sheet.attribute_advancements[attribute] self.main_widget.attribute_dict[attribute].set_advancement(val) val = self.sheet.calculate_attribute(attribute) self.main_widget.attribute_dict[attribute].set_total(val) self.update_skills() self.update_armor_values() self.update_parameters() def update_attributes(self): for attribute in self.sheet.attributes: self.update_attribute(attribute) def change_attribute(self, name, val_type, value): self.sheet.change_attribute(name, val_type, value) self.update_attribute(name) # Skill Handling def update_skill(self, skill): val = self.sheet.skills[skill] self.main_widget.skills_dict[skill].set_advancement(val) self.main_widget.skills_dict[skill].set_enabled(True) bonus_val = self.sheet.get_skill_bonuses(skill) self.main_widget.skills_dict[skill].set_bonus(bonus_val[0], bonus_val[1]) total_val = self.sheet.calculate_skill(skill) if self.sheet.is_robot: if bonus_val[0] == 0 and bonus_val[1] == 0: self.main_widget.skills_dict[skill].set_enabled(False) total_val = 0 self.main_widget.skills_dict[skill].set_total(total_val) def update_skills(self): for skill in self.sheet.skills: self.update_skill(skill) def change_skill(self, name, val_type, value): self.sheet.change_skill(name, val_type, value) self.update_skill(name) # Parameter Handling def update_parameters(self): for parameter in self.sheet.parameters: self.update_parameter(parameter) self.update_parameter("param_encumbrance_current") def update_parameter(self, name): if name == "param_encumbrance_current": value = self.sheet.calculate_current_encumbrance() self.main_widget.params_dict[name].setText(value) return value = self.sheet.parameters[name] if name not in self.main_widget.params_dict: return # TODO use all of params in the sheet self.main_widget.params_dict[name].setText(value) def change_parameter(self, name, value): self.sheet.change_parameter(name, value) self.update_parameters() # Character Handling def update_character_fields(self): for parameter in self.sheet.character: self.update_character_field(parameter) def update_character_field(self, name): value = self.sheet.character[name] self.main_widget.params_dict[name].setText(value) def change_character(self, name, value): self.sheet.change_character(name, value) self.update_character_field(name) # Handle all scrolls items def equip_item(self, name, item, equip): self.sheet.move_item(item, 1 if equip else -1) # item.equipped_quantity = int(equip) self.update_form() def create_item(self, name, item): # Ability if item.type == "ability": self.sheet.add_ability(item) self.update_form() return self.sheet.add_item(item) self.update_form() def remove_item(self, name, item): if item.type == "ability": self.sheet.remove_ability(item) self.update_form() return self.sheet.remove_item(item.equipped_quantity > 0, item) self.update_form() def delete_item(self, equipped, item): self.sheet.remove_item(equipped, item) self.update_items() # Ability Handling def update_abilities(self): self.main_widget.scrolls["abilities"].clear() self.main_widget.scrolls["abilities"].fill(self.sheet.get_abilities()) def add_ability(self, ability): self.sheet.add_ability(ability) self.update_abilities() def remove_ability(self, ability): self.sheet.remove_ability(ability) self.update_abilities() # Weapon Handling def update_weapons(self): self.main_widget.scrolls["weapons"].clear() self.main_widget.scrolls["weapons"].fill(self.sheet.items) def update_armor(self): self.main_widget.scrolls["armor"].clear() self.main_widget.scrolls["armor"].fill(self.sheet.items) self.update_armor_values() def update_armor_values(self): armor_dict = self.sheet.calculate_armor() for armor_slot in armor_dict: self.main_widget.params_dict[armor_slot].setText( str(armor_dict[armor_slot])) def update_modifiers(self): self.main_widget.scrolls["modifiers"].clear() self.main_widget.scrolls["modifiers"].fill(self.sheet.items) if self.sheet.is_robot: self.main_widget.scrolls["modules"].clear() self.main_widget.scrolls["modules"].fill(self.sheet.items) self.main_widget.scrolls["parts"].clear() self.main_widget.scrolls["parts"].fill(self.sheet.items) def update_notes(self): for note_name in self.sheet.notes: text = self.sheet.notes[note_name] self.main_widget.notes_dict[note_name].set_text(text) def change_notes(self, name, value): self.main_widget.notes_dict[name].set_text(str(value)) def update_items(self): self.main_widget.equipment_tables.update_item_tables() def change_item_quantity(self, equipped, _id, value, change): item = self.sheet.find_item_with_id(_id) if item is None: print("No such item!") item.total_quantity += value if item.total_quantity < 0: item.total_quantity = 0 if equipped: item.equipped_quantity += value if item.equipped_quantity < 0: item.equipped_quantity = 0 self.update_items() def move_item(self, item, value): self.sheet.move_item(item, value) self.main_widget.equipment_tables.update_item_tables() def ability_validator(self, ability): already_bought = self.sheet.has_ability(ability.name) requires = [] for requirement in ability.requirements: if "ability_" in requirement: requires.append(int(self.sheet.has_ability(requirement)) - 1) continue if "skill_" in requirement: ski_val = int( self.sheet.calculate_skill(requirement, full=False)[0]) requires.append( int(ski_val >= ability.requirements[requirement]) - 1) continue if "attrib_" in requirement: att_val = self.sheet.calculate_attribute(requirement, full=False) requires.append( int(att_val >= ability.requirements[requirement]) - 1) continue return already_bought, requires def update_form(self): self.main_widget.character = self.sheet # Modifiers self.update_modifiers() # Attributes self.update_attributes() # Skills self.update_skills() # Armor self.update_armor() # Abilities self.update_abilities() # Weapons self.update_weapons() # Items self.update_items() # Armor self.update_armor_values() # Parameters self.update_parameters() # Character self.update_character_fields() # Notes self.update_notes()