def from_data(cls, data: Dict[str, Any], game_contents: GameContents) -> 'LinkedRecipeDetails': lr = cls() lr.recipe = game_contents.get_recipe(data['id']) lr.chance = int(data['chance']) lr.additional = get(data, 'additional', False, to_bool) return lr
def from_data(cls, data: Dict[str, Any], challenge_cls: Type['LinkedRecipeChallengeRequirement'], game_contents: GameContents) -> 'LinkedRecipeDetails': lr = cls() lr.recipe = game_contents.get_recipe(data['id']) lr.chance = int(data['chance']) if 'chance' in data else 100 lr.additional = get(data, 'additional', False, to_bool) lr.challenges = challenge_cls.from_data(get(data, 'challenges', {}), game_contents) return lr
def from_data(cls, file: File, data: Dict[str, Any], game_contents: GameContents) -> 'Recipe': r = game_contents.get_recipe(data['id']) r.file = file r.label = get(data, 'label', data['id']) r.start_description = get(data, 'startdescription') r.description = get(data, 'description') r.action = game_contents.get_verb(get(data, 'actionId')) r.requirements = RecipeRequirement.from_data( get(data, 'requirements', {}), game_contents) r.effects = RecipeEffect.from_data(get(data, 'effects', {}), game_contents) if 'aspects' in data: # TODO Remove this when fixed if isinstance(data['aspects'], str): logging.error('Invalid value for aspects for recipe {}'.format( data['id'])) else: r.aspects = RecipeAspect.from_data(get(data, 'aspects', {}), game_contents) r.mutation_effects = MutationEffect.from_data( get(data, 'mutations', []), game_contents) r.signal_ending_flavour = EndingFlavour( get(data, 'signalEndingFlavour', 'none').lower()) r.craftable = get(data, 'craftable', False, to_bool) r.hint_only = get(data, 'hintonly', False, to_bool) r.warmup = get(data, 'warmup', 0, int) r.deck_effect = RecipeDeckEffect.from_data(get(data, 'deckeffect', {}), game_contents) r.alternative_recipes = [ RecipeAlternativeRecipeDetails.from_data(lrd, game_contents) for lrd in get(data, 'alternativerecipes', []) ] r.linked_recipes = [ RecipeLinkedRecipeDetails.from_data(lrd, game_contents) for lrd in get(data, 'linked', []) ] r.ending_flag = get(data, 'ending') r.max_executions = get(data, 'maxexecutions', 0, int) r.burn_image = get(data, 'burnimage') r.portal_effect = PortalEffect( get(data, 'portaleffect', 'none').lower()) r.slot_specifications = [ RecipeSlotSpecification.from_data(v, game_contents) for v in get(data, 'slots', []) ] r.signal_important_loop = get(data, 'signalimportantloop', False, to_bool) return r
def from_data(cls, file: File, data: Dict[str, Any], translations: Dict[str, Dict[str, Any]], game_contents: GameContents) -> 'Recipe': r = game_contents.get_recipe(data['id']) r.file = file r.label = get(data, 'label', data['id'], translations=translations) r.start_description = get(data, 'startdescription', translations=translations) r.description = get(data, 'description', translations=translations) r.action = game_contents.get_verb(get(data, 'actionId')) r.requirements = RecipeRequirement.from_data( get(data, 'requirements', {}), game_contents) r.table_requirements = RecipeTableRequirement.from_data( get(data, 'tablereqs', {}), game_contents) r.extant_requirements = RecipeExtantRequirement.from_data( get(data, 'extantreqs', {}), game_contents) r.effects = RecipeEffect.from_data(get(data, 'effects', {}), game_contents) if 'aspects' in data: # TODO Remove this when fixed if isinstance(data['aspects'], str): logging.error('Invalid value for aspects for recipe {}'.format( data['id'])) else: r.aspects = RecipeAspect.from_data(get(data, 'aspects', {}), game_contents) r.mutation_effects = MutationEffect.from_data( get(data, 'mutations', []), game_contents) r.purge = RecipePurge.from_data(get(data, 'purge', {}), game_contents) r.halt_verb = RecipeHaltVerb.from_data(get(data, 'haltverb', {}), game_contents) r.delete_verb = RecipeDeleteVerb.from_data(get(data, 'deleteverb', {}), game_contents) r.signal_ending_flavour = EndingFlavour( get(data, 'signalEndingFlavour', 'None')) r.craftable = get(data, 'craftable', False, to_bool) r.hint_only = get(data, 'hintonly', False, to_bool) r.warmup = get(data, 'warmup', 0, int) r.deck_effect = RecipeDeckEffect.from_data(get(data, 'deckeffect', {}), game_contents) internal_deck = get(data, 'internaldeck') if internal_deck: internal_deck['id'] = "internal:" + r.recipe_id r.internal_deck = Deck.from_data(file, internal_deck, {}, game_contents) alternative_recipes = get(data, 'alternativerecipes', []) if not alternative_recipes: alternative_recipes = get(data, 'alt', []) r.alternative_recipes = [ RecipeAlternativeRecipeDetails.from_data( lrd, RecipeAlternativeRecipeDetailsChallengeRequirement, game_contents) for lrd in alternative_recipes ] r.linked_recipes = [ RecipeLinkedRecipeDetails.from_data( lrd, RecipeLinkedRecipeDetailsChallengeRequirement, game_contents) for lrd in get(data, 'linked', []) ] r.ending_flag = get(data, 'ending') r.max_executions = get(data, 'maxexecutions', 0, int) r.burn_image = get(data, 'burnimage') r.portal_effect = PortalEffect( get(data, 'portaleffect', 'none').lower()) r.slot_specifications = [ RecipeSlotSpecification.from_data( v, { c: c_transformation["slots"][i] for c, c_transformation in translations.items() if "slots" in c_transformation }, game_contents) for i, v in enumerate(get(data, 'slots', [])) ] r.signal_important_loop = get(data, 'signalimportantloop', False, to_bool) r.comments = get(data, 'comments', None) if not r.comments: r.comments = get(data, 'comment', None) return r