def embed(state: IdViewState): m = state.monster fields = [ EmbedField( '/'.join(['{}'.format(t.name) for t in m.types]), Box( IdView.all_awakenings_row(m), IdView.killers_row(m, state.transform_base) ) ), EmbedField( 'Inheritable' if m.is_inheritable else 'Not inheritable', IdView.misc_info(m, state.true_evo_type_raw, state.acquire_raw, state.base_rarity), inline=True ), EmbedField( IdView.stats_header(m).to_markdown(), IdView.stats(m), inline=True ), EmbedField( IdView.active_skill_header(m).to_markdown(), Text(m.active_skill.desc if m.active_skill else 'None') ), EmbedField( IdView.leader_skill_header(m).to_markdown(), Text(m.leader_skill.desc if m.leader_skill else 'None') ), EmbedField( "Alternate Evos", HighlightableLinks( links=[LinkedText(str(m.monster_no_na), puzzledragonx(m)) for m in state.alt_monsters], highlighted=next(i for i, mon in enumerate(state.alt_monsters) if m.monster_id == mon.monster_id) ) ) ] return EmbedView( EmbedMain( color=state.color, title=MonsterHeader.long_v2(m).to_markdown(), url=puzzledragonx(m)), embed_thumbnail=EmbedThumbnail(MonsterImage.icon(m)), embed_footer=pad_info_footer_with_state(state), embed_fields=fields)
def embed(cls, state: PicViewState): url = MonsterImage.picture(state.monster.monster_id) animated = state.monster.has_animation fields = [EmbedField( 'Extra Links', Box( Box( Text('Animation:'), LinkedText('(MP4)', MonsterImage.video(state.monster.monster_no_jp)), Text('|'), LinkedText('(GIF)', MonsterImage.gif(state.monster.monster_no_jp)), delimiter=' ' ) if animated else None, Box( Text('Orb Skin:'), LinkedText('Regular', MonsterImage.orb_skin(state.monster.orb_skin_id)), Text('|'), LinkedText('Color Blind', MonsterImage.orb_skin_colorblind(state.monster.orb_skin_id)), delimiter=' ' ) if state.monster.orb_skin_id else None, ) ), cls.evos_embed_field(state) ] return EmbedView( EmbedMain( color=state.query_settings.embedcolor, title=MonsterHeader.menu_title(state.monster, is_tsubaki=state.alt_monsters[0].monster.monster_id == cls.TSUBAKI, is_jp_buffed=state.is_jp_buffed).to_markdown(), url=MonsterLink.header_link(state.monster, state.query_settings) ), embed_footer=embed_footer_with_state(state), embed_fields=fields, embed_body_image=EmbedBodyImage(url), )
def embed(state: OtherInfoViewState): m = state.monster return EmbedView( EmbedMain(color=state.color, title=MonsterHeader.long_v2(m).to_markdown(), url=puzzledragonx(m)), embed_footer=pad_info_footer_with_state(state), embed_fields=[ EmbedField( "Stats at +297:", Box( Text(statsbox(m)), LabeledText("JP Name", m.name_ja), LinksView.linksbox(m), LabeledText("History", m.history_us) if m.history_us else None, LabeledText("Series", m.series.name_en), Box(LabeledText("Sell MP", '{:,}'.format(m.sell_mp)), LabeledText("Buy MP", '{:,}'.format(m.buy_mp)) if m.buy_mp else None, delimiter=' '), Box(LabeledText( "XP to Max", '{:.1f}'.format(m.exp / 1000000).rstrip('0').rstrip('.') + 'M' if m.exp >= 1000000 else '{:,}'.format(m.exp)), LabeledText("Max Level", str(m.level)), delimiter=' '), Box(LabeledText("Weighted Stats", str(m.stats()[3])), Text('LB {} (+{}%)'.format( m.stats(lv=110)[3], m.limit_mult)) if m.limit_mult > 0 else None, delimiter=' | '), LabeledText("Fodder EXP", '{:,}'.format(m.fodder_exp)), Box(LabeledText("Rarity", str(m.rarity)), LabeledText("Cost", str(m.cost)), delimiter=' '))) ])
def embed(cls, state: PicViewState): url = MonsterImage.picture(state.monster) animated = state.monster.has_animation fields = [EmbedField( 'Extra Links', Box( Box( Text('Animation:'), LinkedText('(MP4)', MonsterImage.video(state.monster)), Text('|'), LinkedText('(GIF)', MonsterImage.gif(state.monster)), delimiter=' ' ) if animated else None, Box( Text('Orb Skin:'), LinkedText('Regular', MonsterImage.orb_skin(state.monster)), Text('|'), LinkedText('Color Blind', MonsterImage.orb_skin_colorblind(state.monster)), delimiter=' ' ) if state.monster.orb_skin_id else None, ) ), evos_embed_field(state) ] return EmbedView( EmbedMain( color=state.color, title=MonsterHeader.long_maybe_tsubaki(state.monster, state.alt_monsters[0].monster.monster_id == cls.TSUBAKI ).to_markdown(), url=puzzledragonx(state.monster)), embed_footer=embed_footer_with_state(state), embed_fields=fields, embed_body_image=EmbedBodyImage(url), )
def evos_embed_field(state: EvoScrollViewState): field_text = "**Evos**" help_text = "" # this isn't used right now, but maybe later if discord changes the api for embed titles...? _help_link = "https://github.com/TsubakiBotPad/pad-cogs/wiki/Evolutions-mini-view" legend_parts = [] if any(not alt_evo.evolution.reversible for alt_evo in state.alt_monsters if alt_evo.evolution): legend_parts.append("⌊Irreversible⌋") if any(alt_evo.monster.is_equip for alt_evo in state.alt_monsters): legend_parts.append("⌈Equip⌉") if legend_parts: help_text = ' – Help: {}'.format(" ".join(legend_parts)) return EmbedField( field_text + help_text, HighlightableLinks( links=[ LinkedText(EvoScrollView.alt_fmt(evo), puzzledragonx(evo.monster)) for evo in state.alt_monsters ], highlighted=next( i for i, me in enumerate(state.alt_monsters) if state.monster.monster_id == me.monster.monster_id)))
def embed(cls, state: ButtonInfoViewState): is_coop = state.display_options.players == ButtonInfoOptions.coop is_desktop = state.display_options.device == ButtonInfoOptions.desktop max_110 = state.display_options.max_level == ButtonInfoOptions.limit_break monster = state.monster info = state.info fields = [ EmbedField( # this block does not change if the lv110/lv120 toggle is clicked ButtonInfoView.get_max_level_text(monster, True), Box( Text('Without Latents'), # avoid whitespace after code block Box( get_stat_block(info.coop if is_coop else info.solo), Text('With Latents (Atk+)'), delimiter='' ), get_stat_block(info.coop_latent if is_coop else info.solo_latent) ), inline=True ), EmbedField( 'Lv. 120', Box( Text('Without Latents'), # avoid whitespace after code block Box( get_stat_block(info.coop_slb if is_coop else info.solo_slb), Text('With Latents (Atk++)'), delimiter='' ), get_stat_block(info.coop_slb_latent if is_coop else info.solo_slb_latent) ), inline=True ) if monster.limit_mult != 0 else None, EmbedField( ButtonInfoView.get_common_buttons_title_text(monster, max_110), Box( Text('*Inherits are assumed to be the max possible level (up to 110) and +297.*'), # janky, but python gives DeprecationWarnings when using \* in a regular string Text(r'*\* = on-color stat bonus applied*'), Text('Card Button Damage'), # done this way to not have the whitespace after code block Box( BlockText(info.get_card_btn_str(is_coop, max_110)), Text('Team Button Contribution'), delimiter='' ), BlockText(info.get_team_btn_str(is_coop, max_110)) ) ) if is_desktop else None, EmbedField( ButtonInfoView.get_common_buttons_title_text(monster, max_110), Box( Text('*Inherits are assumed to be the max possible level (up to 110) and +297.*'), # janky, but python gives DeprecationWarnings when using \* in a regular string Text(r'*\* = on-color stat bonus applied*') ) ) if not is_desktop else None, EmbedField( 'Card Button Damage', BlockText(get_mobile_btn_str(info.get_card_btn_str(is_coop, max_110))), inline=True ) if not is_desktop else None, EmbedField( 'Team Button Contribution', BlockText(get_mobile_btn_str(info.get_team_btn_str(is_coop, max_110))), inline=True ) if not is_desktop else None, cls.evos_embed_field(state) ] return EmbedView( EmbedMain( color=state.color, description='(Co-op mode)' if is_coop else '(Singleplayer mode)' ), embed_author=EmbedAuthor( MonsterHeader.long_v2(monster).to_markdown(), puzzledragonx(monster), MonsterImage.icon(monster) ), embed_footer=embed_footer_with_state(state), embed_fields=fields )
def embed(state, props: ExperienceCurveViewProps): regular = get_normal_exp_difference(props.monster, props.low, props.high, props.offset) lb = get_lb_exp_difference(props.monster, props.low, props.high, props.offset) slb = get_slb_exp_difference(props.monster, props.low, props.high, props.offset) is_light = props.monster.full_damage_attr.value == 3 return EmbedView( EmbedMain( color=state.color, title=MonsterHeader.fmt_id_header(props.monster, use_emoji=True), url=puzzledragonx(props.monster), description=Text(f'lv{props.low} -> lv{props.high} (' + (trunc_humanize(props.monster.exp_curve) if props.monster.exp_curve else "no") + f' curve)'), ), embed_thumbnail=EmbedThumbnail(MonsterImage.icon(props.monster)), embed_fields=[ EmbedField(title='Exact', body=Box( LabeledText("Reg", humanize_number(regular)), LabeledText("LB", humanize_number(lb)), LabeledText("SLB", humanize_number(slb)), LabeledText("Net", humanize_number(regular + lb + slb))), inline=True), EmbedField(title='Approx', body=Box( LabeledText("Reg", trunc_humanize(regular)), LabeledText("LB", trunc_humanize(lb)), LabeledText("SLB", trunc_humanize(slb)), LabeledText("Net", trunc_humanize(regular + lb + slb))), inline=True), EmbedField( title='Resources', body=Box( LabeledText( "Globes " + emoji_cache.get_emoji( f'orb_{props.monster.full_damage_attr.name.lower()}' ), str( get_total_needed( props.monster, props.low, props.high, props.offset, ceil(1.5 * GLOBE_EXP[ props.monster.full_damage_attr.value]), is_light))), LabeledText( "TA2", str( get_total_needed(props.monster, props.low, props.high, props.offset, TA2_EXP, is_light))), LabeledText( "TA3", str( get_total_needed(props.monster, props.low, props.high, props.offset, TA3_EXP, is_light))), ), inline=True) ], embed_footer=embed_footer_with_state(state))