Source code for bascenev1lib.mainmenu

# Released under the MIT License. See LICENSE for details.
#
"""Session and Activity for displaying the main menu bg."""

from __future__ import annotations  # Docs-generation hack.

import random
from typing import TYPE_CHECKING, override

from bacommon.locale import LocaleResolved
import bascenev1 as bs
from bascenev1 import _classicassets, _classiccatalogassets
from bascenev1 import _uiv1assets
import bauiv1 as bui

if TYPE_CHECKING:
    from typing import Any

    import bacommon.classic

    from bascenev1lib.actor.spazbot import DemoSpazBotSet






def _preload1() -> None:
    """Pre-load some assets a second or two into the main menu.

    Helps avoid hitches later on. Only meshes and textures belong here:
    one that isn't loaded yet when first drawn gets loaded inline on the
    graphics thread (a visible hitch). Sounds are deliberately left out;
    one that isn't loaded when first played gets loaded inline on the
    audio thread, which costs a few milliseconds of latency on that one
    sound and nothing visible, while preloading all of them here was
    ~250ms of decode work at every launch on a phone (the factories
    load theirs when a game builds them).
    """
    meshes = _classicassets.meshes
    for mesh in [
        meshes.plastic_eyes_transparent,
        meshes.player_lineup1_transparent,
        meshes.player_lineup2_transparent,
        meshes.player_lineup3_transparent,
        meshes.player_lineup4_transparent,
        meshes.angry_computer_transparent,
        meshes.scroll_widget_short,
    ]:
        _ = mesh.get()
    _ = _classiccatalogassets.textures.character_icon_mask.get()
    _ = _classicassets.textures.player_lineup.get()
    _ = _uiv1assets.textures.lock.get()
    _ = _classicassets.textures.icon_runaround.get()
    _ = _classicassets.textures.icon_onslaught.get()
    _ = _classicassets.textures.bg.get()
    bui.apptimer(0.1, _preload2)


def _preload2() -> None:
    # These mirror the meshes and textures the classic factories
    # (PowerupBoxFactory, BombFactory, FlagFactory) load. We don't just
    # instantiate the factories here because they load their sounds too.
    _ = _classicassets.meshes.powerup.get()
    _ = _classicassets.meshes.powerup_simple.get()
    _ = _classicassets.textures.powerup_bomb.get()
    _ = _classicassets.textures.powerup_speed.get()
    _ = _classicassets.textures.powerup_punch.get()
    _ = _classicassets.textures.powerup_ice_bombs.get()
    _ = _classicassets.textures.powerup_sticky_bombs.get()
    _ = _classicassets.textures.powerup_shield.get()
    _ = _classicassets.textures.powerup_impact_bombs.get()
    _ = _classicassets.textures.powerup_health.get()
    _ = _classicassets.textures.powerup_land_mines.get()
    _ = _classicassets.textures.powerup_curse.get()
    bui.apptimer(0.1, _preload3)


def _preload3() -> None:
    _ = _classicassets.meshes.bomb.get()
    _ = _classicassets.meshes.bomb_sticky.get()
    _ = _classicassets.meshes.impact_bomb.get()
    _ = _classicassets.meshes.land_mine.get()
    _ = _classicassets.meshes.tnt.get()
    _ = _classicassets.textures.bomb_color.get()
    _ = _classicassets.textures.bomb_color_ice.get()
    _ = _classicassets.textures.bomb_sticky_color.get()
    _ = _classicassets.textures.impact_bomb_color.get()
    _ = _classicassets.textures.impact_bomb_color_lit.get()
    _ = _classicassets.textures.land_mine.get()
    _ = _classicassets.textures.land_mine_lit.get()
    _ = _classicassets.textures.tnt.get()
    bui.apptimer(0.2, _preload4)


def _preload4() -> None:
    _ = _classicassets.textures.bar.get()
    _ = _classicassets.textures.null.get()
    _ = _classicassets.textures.flag_color.get()
    _ = _classicassets.textures.achievement_outline.get()
    _ = _classicassets.meshes.frame_inset.get()
    _ = _classicassets.meshes.meter_transparent.get()
    _ = _classicassets.meshes.achievement_outline.get()






# Docs-generation hack; import some stuff that we likely only forward-declared
# in our actual source code so that docs tools can find it.
from typing import (Coroutine, Any, Literal, Callable,
  Generator, Awaitable, Sequence, Self, TypeIs)
import asyncio
from concurrent.futures import Future
from pathlib import Path
from enum import Enum