# Released under the MIT License. See LICENSE for details.
#
"""Appearance functionality for spazzes."""
from __future__ import annotations # Docs-generation hack.
# pylint: disable=too-many-lines
from typing import TYPE_CHECKING, overload
from bacommon.assetspec import TextureSpec
import babase
import bascenev1 as bs
from bascenev1 import classicassets
if TYPE_CHECKING:
from typing import Literal
import bauiv1
from collections.abc import Container, Sequence
def _character_name_table() -> dict[str, babase.LangStr]:
"""Appearance name -> its authored display name.
First-party appearances with an authored name; mirrors the
store-side mapping in bamaster ``storeitem.py`` (``OldLady``/
``Zola`` are internal keys whose display names are Betty/Lucky).
Appearances absent here -- mods', plus the never-translated
Alien/Gladiator/Robot/Warrior/Witch/Wrestler -- show their own
name untranslated.
"""
c = classicassets.strings.characters
return {
'Kronk': c.kronk,
'Zoe': c.zoe,
'Jack Morgan': c.jack_morgan,
'Mel': c.mel,
'Snake Shadow': c.snake_shadow,
'Bones': c.bones,
'Bernard': c.bernard,
'Agent Johnson': c.agent_johnson,
'Frosty': c.frosty,
'Pascal': c.pascal,
'Pixel': c.pixel,
'Grumbledorf': c.grumbledorf,
'B-9000': c.b9000,
'Santa Claus': c.santa_claus,
'Easter Bunny': c.easter_bunny,
'Taobao Mascot': c.taobao_mascot,
'OldLady': c.betty,
'Zola': c.lucky,
'Butch': c.butch,
'Gretel': c.gretel,
'Lee': c.lee,
'Middle-Man': c.middle_man,
'Spaz': c.spaz,
'Todd McBurton': c.todd_mcburton,
}
@overload
def get_appearance_display_name(
name: str, *, langstr: Literal[False] = False
) -> babase.Lstr: ...
@overload
def get_appearance_display_name(
name: str, *, langstr: Literal[True]
) -> babase.LangStr: ...
[docs]
def get_appearance_display_name(
name: str, *, langstr: bool = False
) -> babase.Lstr | babase.LangStr:
"""Return a displayable name for a spaz appearance.
``name`` is an appearance's registered key (see
:func:`get_appearances`). First-party characters resolve to their
authored name; a mod's character (or one we have no entry for) is
shown exactly as its key.
Pass ``langstr=True`` to receive a :class:`~babase.LangStr`. The
legacy :class:`~babase.Lstr` form goes away when api 9 support
ends.
"""
if langstr:
entry = _character_name_table().get(name)
return entry if entry is not None else babase.LangStr.from_text(name)
return babase.Lstr(translate=('characterNames', name))
[docs]
def get_appearances(
include_locked: bool = False,
purchases: Container[str] | None = None,
) -> list[str]:
"""Get the list of available spaz appearances.
If ``purchases`` is None (the default), the local player's
``bs.app.classic.purchases`` set is used. Pass an explicit
``purchases`` container to get the list of characters owned by
some other account (e.g. a remote player's authoritative list
from the master server).
"""
# pylint: disable=too-many-branches
assert bs.app.classic is not None
if purchases is None:
plus = bs.app.plus
assert plus is not None
purchases = bs.app.classic.purchases
disallowed = []
if not include_locked:
# Hmm yeah this'll be tough to hack...
if 'characters.santa' not in purchases:
disallowed.append('Santa Claus')
if 'characters.frosty' not in purchases:
disallowed.append('Frosty')
if 'characters.bones' not in purchases:
disallowed.append('Bones')
if 'characters.bernard' not in purchases:
disallowed.append('Bernard')
if 'characters.pixie' not in purchases:
disallowed.append('Pixel')
if 'characters.pascal' not in purchases:
disallowed.append('Pascal')
if 'characters.actionhero' not in purchases:
disallowed.append('Todd McBurton')
if 'characters.taobaomascot' not in purchases:
disallowed.append('Taobao Mascot')
if 'characters.agent' not in purchases:
disallowed.append('Agent Johnson')
if 'characters.jumpsuit' not in purchases:
disallowed.append('Lee')
if 'characters.assassin' not in purchases:
disallowed.append('Zola')
if 'characters.wizard' not in purchases:
disallowed.append('Grumbledorf')
if 'characters.cowboy' not in purchases:
disallowed.append('Butch')
if 'characters.witch' not in purchases:
disallowed.append('Witch')
if 'characters.warrior' not in purchases:
disallowed.append('Warrior')
if 'characters.superhero' not in purchases:
disallowed.append('Middle-Man')
if 'characters.alien' not in purchases:
disallowed.append('Alien')
if 'characters.oldlady' not in purchases:
disallowed.append('OldLady')
if 'characters.gladiator' not in purchases:
disallowed.append('Gladiator')
if 'characters.wrestler' not in purchases:
disallowed.append('Wrestler')
if 'characters.operasinger' not in purchases:
disallowed.append('Gretel')
if 'characters.robot' not in purchases:
disallowed.append('Robot')
if 'characters.cyborg' not in purchases:
disallowed.append('B-9000')
if 'characters.bunny' not in purchases:
disallowed.append('Easter Bunny')
if 'characters.kronk' not in purchases:
disallowed.append('Kronk')
if 'characters.zoe' not in purchases:
disallowed.append('Zoe')
if 'characters.jackmorgan' not in purchases:
disallowed.append('Jack Morgan')
if 'characters.mel' not in purchases:
disallowed.append('Mel')
if 'characters.snakeshadow' not in purchases:
disallowed.append('Snake Shadow')
return [
s
for s in list(bs.app.classic.spaz_appearances.keys())
if s not in disallowed
]
#: An appearance's texture field. Prefer a verified spec off an
#: asset-package wrapper (``classicassets.textures.zoe_icon``); the bare
#: ``str`` form is the legacy asset name, kept so existing mods keep
#: working, and goes away when api 9 support ends.
type TexVal = str | bs.TextureVerifiedSpec
#: An appearance's mesh field; see :obj:`TexVal`.
type MeshVal = str | bs.MeshVerifiedSpec
#: An entry in one of an appearance's sound lists; see :obj:`TexVal`.
type SoundVal = str | bs.SoundVerifiedSpec
[docs]
def scene_texture(val: TexVal) -> bs.Texture:
"""Load an appearance texture field as a scene texture."""
return (
val.get()
if isinstance(val, bs.TextureVerifiedSpec)
else bs.gettexture(val)
)
[docs]
def scene_mesh(val: MeshVal) -> bs.Mesh:
"""Load an appearance mesh field as a scene mesh."""
return (
val.get() if isinstance(val, bs.MeshVerifiedSpec) else bs.getmesh(val)
)
[docs]
def scene_sound(val: SoundVal) -> bs.Sound:
"""Load an appearance sound entry as a scene sound."""
return (
val.get() if isinstance(val, bs.SoundVerifiedSpec) else bs.getsound(val)
)
[docs]
def ui_texture(val: TexVal) -> bauiv1.Texture:
"""Load an appearance texture field as a ui texture.
Converts a scene verified spec to its ui form (see
:meth:`bascenev1.TextureVerifiedSpec.ui`) -- appearances hold
scene-form refs since they are otherwise scene data.
"""
import bauiv1
return (
val.ui().get()
if isinstance(val, bs.TextureVerifiedSpec)
else bauiv1.gettexture(val)
)
[docs]
def ui_sound(val: SoundVal) -> bauiv1.Sound:
"""Load an appearance sound entry as a ui sound; see :func:`ui_texture`."""
import bauiv1
return (
val.ui().get()
if isinstance(val, bs.SoundVerifiedSpec)
else bauiv1.getsound(val)
)
[docs]
def texture_spec(val: TexVal) -> TextureSpec:
"""An appearance texture field as a plain spec (for the wire/doc-ui).
A verified spec *is* a :class:`~bacommon.assetspec.TextureSpec`, so
this is a passthrough for the modern form, and a legacy *qualified*
(``<apverid>:<name>``) string parses back into one.
A legacy *bare* name (``'neoSpazIcon'``) carries no asset-package
identity on its own -- only the engine's asset-name compat table
knows where it now lives -- so it is resolved through that table
(the same one the loaders use) before being split. A name with no
known home falls back to the default character icon rather than
yielding a malformed spec that would fail its package resolve and
render blank on the far end.
"""
if isinstance(val, bs.TextureVerifiedSpec):
return val
qualified = babase.resolve_legacy_asset_name(val, 'textures')
apverid, sep, name = qualified.partition(':')
if not sep or not name:
return classicassets.textures.neo_spaz_icon
return TextureSpec(apverid, name)
[docs]
class Appearance:
"""Create and fill out one of these suckers to define a spaz appearance."""
def __init__(self, name: str):
assert bs.app.classic is not None
self.name = name
if self.name in bs.app.classic.spaz_appearances:
raise RuntimeError(
f'spaz appearance name "{self.name}" already exists.'
)
bs.app.classic.spaz_appearances[self.name] = self
self.color_texture: TexVal = ''
self.color_mask_texture: TexVal = ''
self.icon_texture: TexVal = ''
self.icon_mask_texture: TexVal = ''
self.head_mesh: MeshVal = ''
self.torso_mesh: MeshVal = ''
self.pelvis_mesh: MeshVal = ''
self.upper_arm_mesh: MeshVal = ''
self.forearm_mesh: MeshVal = ''
self.hand_mesh: MeshVal = ''
self.upper_leg_mesh: MeshVal = ''
self.lower_leg_mesh: MeshVal = ''
self.toes_mesh: MeshVal = ''
self.jump_sounds: Sequence[SoundVal] = []
self.attack_sounds: Sequence[SoundVal] = []
self.impact_sounds: Sequence[SoundVal] = []
self.death_sounds: Sequence[SoundVal] = []
self.pickup_sounds: Sequence[SoundVal] = []
self.fall_sounds: Sequence[SoundVal] = []
self.style = 'spaz'
self.default_color: tuple[float, float, float] | None = None
self.default_highlight: tuple[float, float, float] | None = None
[docs]
def register_appearances() -> None:
# pylint: disable=too-many-statements
"""Register our builtin spaz appearances."""
# A big hand-written table; it wants to be data eventually.
# pylint: disable=too-many-locals
# Shorthands for the wrapper groups; these blocks are almost
# entirely asset assignments and the full paths drown them out.
tex = classicassets.textures
mesh = classicassets.meshes
snd = classicassets.audio
# Spaz #######################################
a = Appearance('Spaz')
a.color_texture = tex.neo_spaz_color
a.color_mask_texture = tex.neo_spaz_color_mask
a.icon_texture = tex.neo_spaz_icon
a.icon_mask_texture = tex.neo_spaz_icon_color_mask
a.head_mesh = mesh.neo_spaz_head
a.torso_mesh = mesh.neo_spaz_torso
a.pelvis_mesh = mesh.neo_spaz_pelvis
a.upper_arm_mesh = mesh.neo_spaz_upper_arm
a.forearm_mesh = mesh.neo_spaz_fore_arm
a.hand_mesh = mesh.neo_spaz_hand
a.upper_leg_mesh = mesh.neo_spaz_upper_leg
a.lower_leg_mesh = mesh.neo_spaz_lower_leg
a.toes_mesh = mesh.neo_spaz_toes
a.jump_sounds = [
snd.spaz_jump01,
snd.spaz_jump02,
snd.spaz_jump03,
snd.spaz_jump04,
]
a.attack_sounds = [
snd.spaz_attack01,
snd.spaz_attack02,
snd.spaz_attack03,
snd.spaz_attack04,
]
a.impact_sounds = [
snd.spaz_impact01,
snd.spaz_impact02,
snd.spaz_impact03,
snd.spaz_impact04,
]
a.death_sounds = [snd.spaz_death01]
a.pickup_sounds = [snd.spaz_pickup01]
a.fall_sounds = [snd.spaz_fall01]
a.style = 'spaz'
# Zoe #####################################
a = Appearance('Zoe')
a.color_texture = tex.zoe_color
a.color_mask_texture = tex.zoe_color_mask
a.icon_texture = tex.zoe_icon
a.icon_mask_texture = tex.zoe_icon_color_mask
a.head_mesh = mesh.zoe_head
a.torso_mesh = mesh.zoe_torso
a.pelvis_mesh = mesh.zoe_pelvis
a.upper_arm_mesh = mesh.zoe_upper_arm
a.forearm_mesh = mesh.zoe_fore_arm
a.hand_mesh = mesh.zoe_hand
a.upper_leg_mesh = mesh.zoe_upper_leg
a.lower_leg_mesh = mesh.zoe_lower_leg
a.toes_mesh = mesh.zoe_toes
a.jump_sounds = [
snd.zoe_jump01,
snd.zoe_jump02,
snd.zoe_jump03,
]
a.attack_sounds = [
snd.zoe_attack01,
snd.zoe_attack02,
snd.zoe_attack03,
snd.zoe_attack04,
]
a.impact_sounds = [
snd.zoe_impact01,
snd.zoe_impact02,
snd.zoe_impact03,
snd.zoe_impact04,
]
a.death_sounds = [snd.zoe_death01]
a.pickup_sounds = [snd.zoe_pickup01]
a.fall_sounds = [snd.zoe_fall01]
a.style = 'female'
a.default_color = (0.6, 0.6, 0.6)
a.default_highlight = (0, 1, 0)
# Ninja ##########################################
a = Appearance('Snake Shadow')
a.color_texture = tex.ninja_color
a.color_mask_texture = tex.ninja_color_mask
a.icon_texture = tex.ninja_icon
a.icon_mask_texture = tex.ninja_icon_color_mask
a.head_mesh = mesh.ninja_head
a.torso_mesh = mesh.ninja_torso
a.pelvis_mesh = mesh.ninja_pelvis
a.upper_arm_mesh = mesh.ninja_upper_arm
a.forearm_mesh = mesh.ninja_fore_arm
a.hand_mesh = mesh.ninja_hand
a.upper_leg_mesh = mesh.ninja_upper_leg
a.lower_leg_mesh = mesh.ninja_lower_leg
a.toes_mesh = mesh.ninja_toes
ninja_attacks = [
snd.ninja_attack1,
snd.ninja_attack2,
snd.ninja_attack3,
snd.ninja_attack4,
snd.ninja_attack5,
snd.ninja_attack6,
snd.ninja_attack7,
]
ninja_hits = [
snd.ninja_hit1,
snd.ninja_hit2,
snd.ninja_hit3,
snd.ninja_hit4,
snd.ninja_hit5,
snd.ninja_hit6,
snd.ninja_hit7,
snd.ninja_hit8,
]
ninja_jumps = [
snd.ninja_attack1,
snd.ninja_attack2,
snd.ninja_attack3,
snd.ninja_attack4,
snd.ninja_attack5,
snd.ninja_attack6,
snd.ninja_attack7,
]
a.jump_sounds = ninja_jumps
a.attack_sounds = ninja_attacks
a.impact_sounds = ninja_hits
a.death_sounds = [snd.ninja_death1]
a.pickup_sounds = ninja_attacks
a.fall_sounds = [snd.ninja_fall1]
a.style = 'ninja'
a.default_color = (1, 1, 1)
a.default_highlight = (0.55, 0.8, 0.55)
# Barbarian #####################################
a = Appearance('Kronk')
a.color_texture = tex.kronk
a.color_mask_texture = tex.kronk_color_mask
a.icon_texture = tex.kronk_icon
a.icon_mask_texture = tex.kronk_icon_color_mask
a.head_mesh = mesh.kronk_head
a.torso_mesh = mesh.kronk_torso
a.pelvis_mesh = mesh.kronk_pelvis
a.upper_arm_mesh = mesh.kronk_upper_arm
a.forearm_mesh = mesh.kronk_fore_arm
a.hand_mesh = mesh.kronk_hand
a.upper_leg_mesh = mesh.kronk_upper_leg
a.lower_leg_mesh = mesh.kronk_lower_leg
a.toes_mesh = mesh.kronk_toes
kronk_sounds = [
snd.kronk1,
snd.kronk2,
snd.kronk3,
snd.kronk4,
snd.kronk5,
snd.kronk6,
snd.kronk7,
snd.kronk8,
snd.kronk9,
snd.kronk10,
]
a.jump_sounds = kronk_sounds
a.attack_sounds = kronk_sounds
a.impact_sounds = kronk_sounds
a.death_sounds = [snd.kronk_death]
a.pickup_sounds = kronk_sounds
a.fall_sounds = [snd.kronk_fall]
a.style = 'kronk'
a.default_color = (0.4, 0.5, 0.4)
a.default_highlight = (1, 0.5, 0.3)
# Chef ###########################################
a = Appearance('Mel')
a.color_texture = tex.mel_color
a.color_mask_texture = tex.mel_color_mask
a.icon_texture = tex.mel_icon
a.icon_mask_texture = tex.mel_icon_color_mask
a.head_mesh = mesh.mel_head
a.torso_mesh = mesh.mel_torso
a.pelvis_mesh = mesh.kronk_pelvis
a.upper_arm_mesh = mesh.mel_upper_arm
a.forearm_mesh = mesh.mel_fore_arm
a.hand_mesh = mesh.mel_hand
a.upper_leg_mesh = mesh.mel_upper_leg
a.lower_leg_mesh = mesh.mel_lower_leg
a.toes_mesh = mesh.mel_toes
mel_sounds = [
snd.mel01,
snd.mel02,
snd.mel03,
snd.mel04,
snd.mel05,
snd.mel06,
snd.mel07,
snd.mel08,
snd.mel09,
snd.mel10,
]
a.jump_sounds = mel_sounds
a.attack_sounds = mel_sounds
a.impact_sounds = mel_sounds
a.death_sounds = [snd.mel_death01]
a.pickup_sounds = mel_sounds
a.fall_sounds = [snd.mel_fall01]
a.style = 'mel'
a.default_color = (1, 1, 1)
a.default_highlight = (0.1, 0.6, 0.1)
# Pirate #######################################
a = Appearance('Jack Morgan')
a.color_texture = tex.jack_color
a.color_mask_texture = tex.jack_color_mask
a.icon_texture = tex.jack_icon
a.icon_mask_texture = tex.jack_icon_color_mask
a.head_mesh = mesh.jack_head
a.torso_mesh = mesh.jack_torso
a.pelvis_mesh = mesh.kronk_pelvis
a.upper_arm_mesh = mesh.jack_upper_arm
a.forearm_mesh = mesh.jack_fore_arm
a.hand_mesh = mesh.jack_hand
a.upper_leg_mesh = mesh.jack_upper_leg
a.lower_leg_mesh = mesh.jack_lower_leg
a.toes_mesh = mesh.jack_toes
hit_sounds = [
snd.jack_hit01,
snd.jack_hit02,
snd.jack_hit03,
snd.jack_hit04,
snd.jack_hit05,
snd.jack_hit06,
snd.jack_hit07,
]
sounds = [
snd.jack01,
snd.jack02,
snd.jack03,
snd.jack04,
snd.jack05,
snd.jack06,
]
a.jump_sounds = sounds
a.attack_sounds = sounds
a.impact_sounds = hit_sounds
a.death_sounds = [snd.jack_death01]
a.pickup_sounds = sounds
a.fall_sounds = [snd.jack_fall01]
a.style = 'pirate'
a.default_color = (1, 0.2, 0.1)
a.default_highlight = (1, 1, 0)
# Santa ######################################
a = Appearance('Santa Claus')
a.color_texture = tex.santa_color
a.color_mask_texture = tex.santa_color_mask
a.icon_texture = tex.santa_icon
a.icon_mask_texture = tex.santa_icon_color_mask
a.head_mesh = mesh.santa_head
a.torso_mesh = mesh.santa_torso
a.pelvis_mesh = mesh.kronk_pelvis
a.upper_arm_mesh = mesh.santa_upper_arm
a.forearm_mesh = mesh.santa_fore_arm
a.hand_mesh = mesh.santa_hand
a.upper_leg_mesh = mesh.santa_upper_leg
a.lower_leg_mesh = mesh.santa_lower_leg
a.toes_mesh = mesh.santa_toes
hit_sounds = [
snd.santa_hit01,
snd.santa_hit02,
snd.santa_hit03,
snd.santa_hit04,
]
sounds = [
snd.santa01,
snd.santa02,
snd.santa03,
snd.santa04,
snd.santa05,
]
a.jump_sounds = sounds
a.attack_sounds = sounds
a.impact_sounds = hit_sounds
a.death_sounds = [snd.santa_death]
a.pickup_sounds = sounds
a.fall_sounds = [snd.santa_fall]
a.style = 'santa'
a.default_color = (1, 0, 0)
a.default_highlight = (1, 1, 1)
# Snowman ###################################
a = Appearance('Frosty')
a.color_texture = tex.frosty_color
a.color_mask_texture = tex.frosty_color_mask
a.icon_texture = tex.frosty_icon
a.icon_mask_texture = tex.frosty_icon_color_mask
a.head_mesh = mesh.frosty_head
a.torso_mesh = mesh.frosty_torso
a.pelvis_mesh = mesh.frosty_pelvis
a.upper_arm_mesh = mesh.frosty_upper_arm
a.forearm_mesh = mesh.frosty_fore_arm
a.hand_mesh = mesh.frosty_hand
a.upper_leg_mesh = mesh.frosty_upper_leg
a.lower_leg_mesh = mesh.frosty_lower_leg
a.toes_mesh = mesh.frosty_toes
frosty_sounds = [
snd.frosty01,
snd.frosty02,
snd.frosty03,
snd.frosty04,
snd.frosty05,
]
frosty_hit_sounds = [
snd.frosty_hit01,
snd.frosty_hit02,
snd.frosty_hit03,
]
a.jump_sounds = frosty_sounds
a.attack_sounds = frosty_sounds
a.impact_sounds = frosty_hit_sounds
a.death_sounds = [snd.frosty_death]
a.pickup_sounds = frosty_sounds
a.fall_sounds = [snd.frosty_fall]
a.style = 'frosty'
a.default_color = (0.5, 0.5, 1)
a.default_highlight = (1, 0.5, 0)
# Skeleton ################################
a = Appearance('Bones')
a.color_texture = tex.bones_color
a.color_mask_texture = tex.bones_color_mask
a.icon_texture = tex.bones_icon
a.icon_mask_texture = tex.bones_icon_color_mask
a.head_mesh = mesh.bones_head
a.torso_mesh = mesh.bones_torso
a.pelvis_mesh = mesh.bones_pelvis
a.upper_arm_mesh = mesh.bones_upper_arm
a.forearm_mesh = mesh.bones_fore_arm
a.hand_mesh = mesh.bones_hand
a.upper_leg_mesh = mesh.bones_upper_leg
a.lower_leg_mesh = mesh.bones_lower_leg
a.toes_mesh = mesh.bones_toes
bones_sounds = [
snd.bones1,
snd.bones2,
snd.bones3,
]
bones_hit_sounds = [
snd.bones1,
snd.bones2,
snd.bones3,
]
a.jump_sounds = bones_sounds
a.attack_sounds = bones_sounds
a.impact_sounds = bones_hit_sounds
a.death_sounds = [snd.bones_death]
a.pickup_sounds = bones_sounds
a.fall_sounds = [snd.bones_fall]
a.style = 'bones'
a.default_color = (0.6, 0.9, 1)
a.default_highlight = (0.6, 0.9, 1)
# Bear ###################################
a = Appearance('Bernard')
a.color_texture = tex.bear_color
a.color_mask_texture = tex.bear_color_mask
a.icon_texture = tex.bear_icon
a.icon_mask_texture = tex.bear_icon_color_mask
a.head_mesh = mesh.bear_head
a.torso_mesh = mesh.bear_torso
a.pelvis_mesh = mesh.bear_pelvis
a.upper_arm_mesh = mesh.bear_upper_arm
a.forearm_mesh = mesh.bear_fore_arm
a.hand_mesh = mesh.bear_hand
a.upper_leg_mesh = mesh.bear_upper_leg
a.lower_leg_mesh = mesh.bear_lower_leg
a.toes_mesh = mesh.bear_toes
bear_sounds = [
snd.bear1,
snd.bear2,
snd.bear3,
snd.bear4,
]
bear_hit_sounds = [
snd.bear_hit1,
snd.bear_hit2,
]
a.jump_sounds = bear_sounds
a.attack_sounds = bear_sounds
a.impact_sounds = bear_hit_sounds
a.death_sounds = [snd.bear_death]
a.pickup_sounds = bear_sounds
a.fall_sounds = [snd.bear_fall]
a.style = 'bear'
a.default_color = (0.7, 0.5, 0.0)
# Penguin ###################################
a = Appearance('Pascal')
a.color_texture = tex.penguin_color
a.color_mask_texture = tex.penguin_color_mask
a.icon_texture = tex.penguin_icon
a.icon_mask_texture = tex.penguin_icon_color_mask
a.head_mesh = mesh.penguin_head
a.torso_mesh = mesh.penguin_torso
a.pelvis_mesh = mesh.penguin_pelvis
a.upper_arm_mesh = mesh.penguin_upper_arm
a.forearm_mesh = mesh.penguin_fore_arm
a.hand_mesh = mesh.penguin_hand
a.upper_leg_mesh = mesh.penguin_upper_leg
a.lower_leg_mesh = mesh.penguin_lower_leg
a.toes_mesh = mesh.penguin_toes
penguin_sounds = [
snd.penguin1,
snd.penguin2,
snd.penguin3,
snd.penguin4,
]
penguin_hit_sounds = [
snd.penguin_hit1,
snd.penguin_hit2,
]
a.jump_sounds = penguin_sounds
a.attack_sounds = penguin_sounds
a.impact_sounds = penguin_hit_sounds
a.death_sounds = [snd.penguin_death]
a.pickup_sounds = penguin_sounds
a.fall_sounds = [snd.penguin_fall]
a.style = 'penguin'
a.default_color = (0.3, 0.5, 0.8)
a.default_highlight = (1, 0, 0)
# Ali ###################################
a = Appearance('Taobao Mascot')
a.color_texture = tex.ali_color
a.color_mask_texture = tex.ali_color_mask
a.icon_texture = tex.ali_icon
a.icon_mask_texture = tex.ali_icon_color_mask
a.head_mesh = mesh.ali_head
a.torso_mesh = mesh.ali_torso
a.pelvis_mesh = mesh.ali_pelvis
a.upper_arm_mesh = mesh.ali_upper_arm
a.forearm_mesh = mesh.ali_fore_arm
a.hand_mesh = mesh.ali_hand
a.upper_leg_mesh = mesh.ali_upper_leg
a.lower_leg_mesh = mesh.ali_lower_leg
a.toes_mesh = mesh.ali_toes
ali_sounds = [
snd.ali1,
snd.ali2,
snd.ali3,
snd.ali4,
]
ali_hit_sounds = [
snd.ali_hit1,
snd.ali_hit2,
]
a.jump_sounds = ali_sounds
a.attack_sounds = ali_sounds
a.impact_sounds = ali_hit_sounds
a.death_sounds = [snd.ali_death]
a.pickup_sounds = ali_sounds
a.fall_sounds = [snd.ali_fall]
a.style = 'ali'
a.default_color = (1, 0.5, 0)
a.default_highlight = (1, 1, 1)
# Cyborg ###################################
a = Appearance('B-9000')
a.color_texture = tex.cyborg_color
a.color_mask_texture = tex.cyborg_color_mask
a.icon_texture = tex.cyborg_icon
a.icon_mask_texture = tex.cyborg_icon_color_mask
a.head_mesh = mesh.cyborg_head
a.torso_mesh = mesh.cyborg_torso
a.pelvis_mesh = mesh.cyborg_pelvis
a.upper_arm_mesh = mesh.cyborg_upper_arm
a.forearm_mesh = mesh.cyborg_fore_arm
a.hand_mesh = mesh.cyborg_hand
a.upper_leg_mesh = mesh.cyborg_upper_leg
a.lower_leg_mesh = mesh.cyborg_lower_leg
a.toes_mesh = mesh.cyborg_toes
cyborg_sounds = [
snd.cyborg1,
snd.cyborg2,
snd.cyborg3,
snd.cyborg4,
]
cyborg_hit_sounds = [
snd.cyborg_hit1,
snd.cyborg_hit2,
]
a.jump_sounds = cyborg_sounds
a.attack_sounds = cyborg_sounds
a.impact_sounds = cyborg_hit_sounds
a.death_sounds = [snd.cyborg_death]
a.pickup_sounds = cyborg_sounds
a.fall_sounds = [snd.cyborg_fall]
a.style = 'cyborg'
a.default_color = (0.5, 0.5, 0.5)
a.default_highlight = (1, 0, 0)
# Agent ###################################
a = Appearance('Agent Johnson')
a.color_texture = tex.agent_color
a.color_mask_texture = tex.agent_color_mask
a.icon_texture = tex.agent_icon
a.icon_mask_texture = tex.agent_icon_color_mask
a.head_mesh = mesh.agent_head
a.torso_mesh = mesh.agent_torso
a.pelvis_mesh = mesh.agent_pelvis
a.upper_arm_mesh = mesh.agent_upper_arm
a.forearm_mesh = mesh.agent_fore_arm
a.hand_mesh = mesh.agent_hand
a.upper_leg_mesh = mesh.agent_upper_leg
a.lower_leg_mesh = mesh.agent_lower_leg
a.toes_mesh = mesh.agent_toes
agent_sounds = [
snd.agent1,
snd.agent2,
snd.agent3,
snd.agent4,
]
agent_hit_sounds = [
snd.agent_hit1,
snd.agent_hit2,
]
a.jump_sounds = agent_sounds
a.attack_sounds = agent_sounds
a.impact_sounds = agent_hit_sounds
a.death_sounds = [snd.agent_death]
a.pickup_sounds = agent_sounds
a.fall_sounds = [snd.agent_fall]
a.style = 'agent'
a.default_color = (0.3, 0.3, 0.33)
a.default_highlight = (1, 0.5, 0.3)
# Jumpsuit ###################################
a = Appearance('Lee')
a.color_texture = tex.jumpsuit_color
a.color_mask_texture = tex.jumpsuit_color_mask
a.icon_texture = tex.jumpsuit_icon
a.icon_mask_texture = tex.jumpsuit_icon_color_mask
a.head_mesh = mesh.jumpsuit_head
a.torso_mesh = mesh.jumpsuit_torso
a.pelvis_mesh = mesh.jumpsuit_pelvis
a.upper_arm_mesh = mesh.jumpsuit_upper_arm
a.forearm_mesh = mesh.jumpsuit_fore_arm
a.hand_mesh = mesh.jumpsuit_hand
a.upper_leg_mesh = mesh.jumpsuit_upper_leg
a.lower_leg_mesh = mesh.jumpsuit_lower_leg
a.toes_mesh = mesh.jumpsuit_toes
jumpsuit_sounds = [
snd.jumpsuit1,
snd.jumpsuit2,
snd.jumpsuit3,
snd.jumpsuit4,
]
jumpsuit_hit_sounds = [
snd.jumpsuit_hit1,
snd.jumpsuit_hit2,
]
a.jump_sounds = jumpsuit_sounds
a.attack_sounds = jumpsuit_sounds
a.impact_sounds = jumpsuit_hit_sounds
a.death_sounds = [snd.jumpsuit_death]
a.pickup_sounds = jumpsuit_sounds
a.fall_sounds = [snd.jumpsuit_fall]
a.style = 'spaz'
a.default_color = (0.3, 0.5, 0.8)
a.default_highlight = (1, 0, 0)
# ActionHero ###################################
a = Appearance('Todd McBurton')
a.color_texture = tex.action_hero_color
a.color_mask_texture = tex.action_hero_color_mask
a.icon_texture = tex.action_hero_icon
a.icon_mask_texture = tex.action_hero_icon_color_mask
a.head_mesh = mesh.action_hero_head
a.torso_mesh = mesh.action_hero_torso
a.pelvis_mesh = mesh.action_hero_pelvis
a.upper_arm_mesh = mesh.action_hero_upper_arm
a.forearm_mesh = mesh.action_hero_fore_arm
a.hand_mesh = mesh.action_hero_hand
a.upper_leg_mesh = mesh.action_hero_upper_leg
a.lower_leg_mesh = mesh.action_hero_lower_leg
a.toes_mesh = mesh.action_hero_toes
action_hero_sounds = [
snd.action_hero1,
snd.action_hero2,
snd.action_hero3,
snd.action_hero4,
]
action_hero_hit_sounds = [
snd.action_hero_hit1,
snd.action_hero_hit2,
]
a.jump_sounds = action_hero_sounds
a.attack_sounds = action_hero_sounds
a.impact_sounds = action_hero_hit_sounds
a.death_sounds = [snd.action_hero_death]
a.pickup_sounds = action_hero_sounds
a.fall_sounds = [snd.action_hero_fall]
a.style = 'spaz'
a.default_color = (0.3, 0.5, 0.8)
a.default_highlight = (1, 0, 0)
# Lucky the Leprechaun ############################
#
# Note: repurposing assassin slot. Lucky is not actually an
# assassin. He is a good and friendly Leprechaun.
a = Appearance('Zola')
a.color_texture = tex.assassin_color
a.color_mask_texture = tex.assassin_color_mask
a.icon_texture = tex.assassin_icon
a.icon_mask_texture = tex.assassin_icon_color_mask
a.head_mesh = mesh.assassin_head
a.torso_mesh = mesh.assassin_torso
a.pelvis_mesh = mesh.assassin_pelvis
a.upper_arm_mesh = mesh.assassin_upper_arm
a.forearm_mesh = mesh.assassin_fore_arm
a.hand_mesh = mesh.assassin_hand
a.upper_leg_mesh = mesh.assassin_upper_leg
a.lower_leg_mesh = mesh.assassin_lower_leg
a.toes_mesh = mesh.assassin_toes
assassin_sounds = [
snd.assassin1,
snd.assassin2,
snd.assassin3,
snd.assassin4,
]
assassin_hit_sounds = [
snd.assassin_hit1,
snd.assassin_hit2,
]
a.jump_sounds = assassin_sounds
a.attack_sounds = assassin_sounds
a.impact_sounds = assassin_hit_sounds
a.death_sounds = [snd.assassin_death]
a.pickup_sounds = assassin_sounds
a.fall_sounds = [snd.assassin_fall]
a.style = 'spaz'
a.default_color = (0.2, 1.0, 0.5)
a.default_highlight = (1.0, 0.3, 0)
# Wizard ###################################
a = Appearance('Grumbledorf')
a.color_texture = tex.wizard_color
a.color_mask_texture = tex.wizard_color_mask
a.icon_texture = tex.wizard_icon
a.icon_mask_texture = tex.wizard_icon_color_mask
a.head_mesh = mesh.wizard_head
a.torso_mesh = mesh.wizard_torso
a.pelvis_mesh = mesh.wizard_pelvis
a.upper_arm_mesh = mesh.wizard_upper_arm
a.forearm_mesh = mesh.wizard_fore_arm
a.hand_mesh = mesh.wizard_hand
a.upper_leg_mesh = mesh.wizard_upper_leg
a.lower_leg_mesh = mesh.wizard_lower_leg
a.toes_mesh = mesh.wizard_toes
wizard_sounds = [
snd.wizard1,
snd.wizard2,
snd.wizard3,
snd.wizard4,
]
wizard_hit_sounds = [
snd.wizard_hit1,
snd.wizard_hit2,
]
a.jump_sounds = wizard_sounds
a.attack_sounds = wizard_sounds
a.impact_sounds = wizard_hit_sounds
a.death_sounds = [snd.wizard_death]
a.pickup_sounds = wizard_sounds
a.fall_sounds = [snd.wizard_fall]
a.style = 'spaz'
a.default_color = (0.2, 0.4, 1.0)
a.default_highlight = (0.06, 0.15, 0.4)
# Cowboy ###################################
a = Appearance('Butch')
a.color_texture = tex.cowboy_color
a.color_mask_texture = tex.cowboy_color_mask
a.icon_texture = tex.cowboy_icon
a.icon_mask_texture = tex.cowboy_icon_color_mask
a.head_mesh = mesh.cowboy_head
a.torso_mesh = mesh.cowboy_torso
a.pelvis_mesh = mesh.cowboy_pelvis
a.upper_arm_mesh = mesh.cowboy_upper_arm
a.forearm_mesh = mesh.cowboy_fore_arm
a.hand_mesh = mesh.cowboy_hand
a.upper_leg_mesh = mesh.cowboy_upper_leg
a.lower_leg_mesh = mesh.cowboy_lower_leg
a.toes_mesh = mesh.cowboy_toes
cowboy_sounds = [
snd.cowboy1,
snd.cowboy2,
snd.cowboy3,
snd.cowboy4,
]
cowboy_hit_sounds = [
snd.cowboy_hit1,
snd.cowboy_hit2,
]
a.jump_sounds = cowboy_sounds
a.attack_sounds = cowboy_sounds
a.impact_sounds = cowboy_hit_sounds
a.death_sounds = [snd.cowboy_death]
a.pickup_sounds = cowboy_sounds
a.fall_sounds = [snd.cowboy_fall]
a.style = 'spaz'
a.default_color = (0.3, 0.5, 0.8)
a.default_highlight = (1, 0, 0)
# Witch ###################################
a = Appearance('Witch')
a.color_texture = tex.witch_color
a.color_mask_texture = tex.witch_color_mask
a.icon_texture = tex.witch_icon
a.icon_mask_texture = tex.witch_icon_color_mask
a.head_mesh = mesh.witch_head
a.torso_mesh = mesh.witch_torso
a.pelvis_mesh = mesh.witch_pelvis
a.upper_arm_mesh = mesh.witch_upper_arm
a.forearm_mesh = mesh.witch_fore_arm
a.hand_mesh = mesh.witch_hand
a.upper_leg_mesh = mesh.witch_upper_leg
a.lower_leg_mesh = mesh.witch_lower_leg
a.toes_mesh = mesh.witch_toes
witch_sounds = [
snd.witch1,
snd.witch2,
snd.witch3,
snd.witch4,
]
witch_hit_sounds = [
snd.witch_hit1,
snd.witch_hit2,
]
a.jump_sounds = witch_sounds
a.attack_sounds = witch_sounds
a.impact_sounds = witch_hit_sounds
a.death_sounds = [snd.witch_death]
a.pickup_sounds = witch_sounds
a.fall_sounds = [snd.witch_fall]
a.style = 'spaz'
a.default_color = (0.3, 0.5, 0.8)
a.default_highlight = (1, 0, 0)
# Warrior ###################################
a = Appearance('Warrior')
a.color_texture = tex.warrior_color
a.color_mask_texture = tex.warrior_color_mask
a.icon_texture = tex.warrior_icon
a.icon_mask_texture = tex.warrior_icon_color_mask
a.head_mesh = mesh.warrior_head
a.torso_mesh = mesh.warrior_torso
a.pelvis_mesh = mesh.warrior_pelvis
a.upper_arm_mesh = mesh.warrior_upper_arm
a.forearm_mesh = mesh.warrior_fore_arm
a.hand_mesh = mesh.warrior_hand
a.upper_leg_mesh = mesh.warrior_upper_leg
a.lower_leg_mesh = mesh.warrior_lower_leg
a.toes_mesh = mesh.warrior_toes
warrior_sounds = [
snd.warrior1,
snd.warrior2,
snd.warrior3,
snd.warrior4,
]
warrior_hit_sounds = [
snd.warrior_hit1,
snd.warrior_hit2,
]
a.jump_sounds = warrior_sounds
a.attack_sounds = warrior_sounds
a.impact_sounds = warrior_hit_sounds
a.death_sounds = [snd.warrior_death]
a.pickup_sounds = warrior_sounds
a.fall_sounds = [snd.warrior_fall]
a.style = 'spaz'
a.default_color = (0.3, 0.5, 0.8)
a.default_highlight = (1, 0, 0)
# Superhero ###################################
a = Appearance('Middle-Man')
a.color_texture = tex.superhero_color
a.color_mask_texture = tex.superhero_color_mask
a.icon_texture = tex.superhero_icon
a.icon_mask_texture = tex.superhero_icon_color_mask
a.head_mesh = mesh.superhero_head
a.torso_mesh = mesh.superhero_torso
a.pelvis_mesh = mesh.superhero_pelvis
a.upper_arm_mesh = mesh.superhero_upper_arm
a.forearm_mesh = mesh.superhero_fore_arm
a.hand_mesh = mesh.superhero_hand
a.upper_leg_mesh = mesh.superhero_upper_leg
a.lower_leg_mesh = mesh.superhero_lower_leg
a.toes_mesh = mesh.superhero_toes
superhero_sounds = [
snd.superhero1,
snd.superhero2,
snd.superhero3,
snd.superhero4,
]
superhero_hit_sounds = [
snd.superhero_hit1,
snd.superhero_hit2,
]
a.jump_sounds = superhero_sounds
a.attack_sounds = superhero_sounds
a.impact_sounds = superhero_hit_sounds
a.death_sounds = [snd.superhero_death]
a.pickup_sounds = superhero_sounds
a.fall_sounds = [snd.superhero_fall]
a.style = 'spaz'
a.default_color = (0.3, 0.5, 0.8)
a.default_highlight = (1, 0, 0)
# Alien ###################################
a = Appearance('Alien')
a.color_texture = tex.alien_color
a.color_mask_texture = tex.alien_color_mask
a.icon_texture = tex.alien_icon
a.icon_mask_texture = tex.alien_icon_color_mask
a.head_mesh = mesh.alien_head
a.torso_mesh = mesh.alien_torso
a.pelvis_mesh = mesh.alien_pelvis
a.upper_arm_mesh = mesh.alien_upper_arm
a.forearm_mesh = mesh.alien_fore_arm
a.hand_mesh = mesh.alien_hand
a.upper_leg_mesh = mesh.alien_upper_leg
a.lower_leg_mesh = mesh.alien_lower_leg
a.toes_mesh = mesh.alien_toes
alien_sounds = [
snd.alien1,
snd.alien2,
snd.alien3,
snd.alien4,
]
alien_hit_sounds = [
snd.alien_hit1,
snd.alien_hit2,
]
a.jump_sounds = alien_sounds
a.attack_sounds = alien_sounds
a.impact_sounds = alien_hit_sounds
a.death_sounds = [snd.alien_death]
a.pickup_sounds = alien_sounds
a.fall_sounds = [snd.alien_fall]
a.style = 'spaz'
a.default_color = (0.3, 0.5, 0.8)
a.default_highlight = (1, 0, 0)
# OldLady ###################################
a = Appearance('OldLady')
a.color_texture = tex.old_lady_color
a.color_mask_texture = tex.old_lady_color_mask
a.icon_texture = tex.old_lady_icon
a.icon_mask_texture = tex.old_lady_icon_color_mask
a.head_mesh = mesh.old_lady_head
a.torso_mesh = mesh.old_lady_torso
a.pelvis_mesh = mesh.old_lady_pelvis
a.upper_arm_mesh = mesh.old_lady_upper_arm
a.forearm_mesh = mesh.old_lady_fore_arm
a.hand_mesh = mesh.old_lady_hand
a.upper_leg_mesh = mesh.old_lady_upper_leg
a.lower_leg_mesh = mesh.old_lady_lower_leg
a.toes_mesh = mesh.old_lady_toes
old_lady_sounds = [
snd.old_lady1,
snd.old_lady2,
snd.old_lady3,
snd.old_lady4,
]
old_lady_hit_sounds = [
snd.old_lady_hit1,
snd.old_lady_hit2,
]
a.jump_sounds = old_lady_sounds
a.attack_sounds = old_lady_sounds
a.impact_sounds = old_lady_hit_sounds
a.death_sounds = [snd.old_lady_death]
a.pickup_sounds = old_lady_sounds
a.fall_sounds = [snd.old_lady_fall]
a.style = 'bones'
a.default_color = (0.2, 1.0, 1.0)
a.default_highlight = (0.5, 0.25, 1.0)
# Gladiator ###################################
a = Appearance('Gladiator')
a.color_texture = tex.gladiator_color
a.color_mask_texture = tex.gladiator_color_mask
a.icon_texture = tex.gladiator_icon
a.icon_mask_texture = tex.gladiator_icon_color_mask
a.head_mesh = mesh.gladiator_head
a.torso_mesh = mesh.gladiator_torso
a.pelvis_mesh = mesh.gladiator_pelvis
a.upper_arm_mesh = mesh.gladiator_upper_arm
a.forearm_mesh = mesh.gladiator_fore_arm
a.hand_mesh = mesh.gladiator_hand
a.upper_leg_mesh = mesh.gladiator_upper_leg
a.lower_leg_mesh = mesh.gladiator_lower_leg
a.toes_mesh = mesh.gladiator_toes
gladiator_sounds = [
snd.gladiator1,
snd.gladiator2,
snd.gladiator3,
snd.gladiator4,
]
gladiator_hit_sounds = [
snd.gladiator_hit1,
snd.gladiator_hit2,
]
a.jump_sounds = gladiator_sounds
a.attack_sounds = gladiator_sounds
a.impact_sounds = gladiator_hit_sounds
a.death_sounds = [snd.gladiator_death]
a.pickup_sounds = gladiator_sounds
a.fall_sounds = [snd.gladiator_fall]
a.style = 'spaz'
a.default_color = (0.3, 0.5, 0.8)
a.default_highlight = (1, 0, 0)
# Wrestler ###################################
a = Appearance('Wrestler')
a.color_texture = tex.wrestler_color
a.color_mask_texture = tex.wrestler_color_mask
a.icon_texture = tex.wrestler_icon
a.icon_mask_texture = tex.wrestler_icon_color_mask
a.head_mesh = mesh.wrestler_head
a.torso_mesh = mesh.wrestler_torso
a.pelvis_mesh = mesh.wrestler_pelvis
a.upper_arm_mesh = mesh.wrestler_upper_arm
a.forearm_mesh = mesh.wrestler_fore_arm
a.hand_mesh = mesh.wrestler_hand
a.upper_leg_mesh = mesh.wrestler_upper_leg
a.lower_leg_mesh = mesh.wrestler_lower_leg
a.toes_mesh = mesh.wrestler_toes
wrestler_sounds = [
snd.wrestler1,
snd.wrestler2,
snd.wrestler3,
snd.wrestler4,
]
wrestler_hit_sounds = [
snd.wrestler_hit1,
snd.wrestler_hit2,
]
a.jump_sounds = wrestler_sounds
a.attack_sounds = wrestler_sounds
a.impact_sounds = wrestler_hit_sounds
a.death_sounds = [snd.wrestler_death]
a.pickup_sounds = wrestler_sounds
a.fall_sounds = [snd.wrestler_fall]
a.style = 'spaz'
a.default_color = (0.3, 0.5, 0.8)
a.default_highlight = (1, 0, 0)
# OperaSinger ###################################
a = Appearance('Gretel')
a.color_texture = tex.opera_singer_color
a.color_mask_texture = tex.opera_singer_color_mask
a.icon_texture = tex.opera_singer_icon
a.icon_mask_texture = tex.opera_singer_icon_color_mask
a.head_mesh = mesh.opera_singer_head
a.torso_mesh = mesh.opera_singer_torso
a.pelvis_mesh = mesh.opera_singer_pelvis
a.upper_arm_mesh = mesh.opera_singer_upper_arm
a.forearm_mesh = mesh.opera_singer_fore_arm
a.hand_mesh = mesh.opera_singer_hand
a.upper_leg_mesh = mesh.opera_singer_upper_leg
a.lower_leg_mesh = mesh.opera_singer_lower_leg
a.toes_mesh = mesh.opera_singer_toes
opera_singer_sounds = [
snd.opera_singer1,
snd.opera_singer2,
snd.opera_singer3,
snd.opera_singer4,
]
opera_singer_hit_sounds = [
snd.opera_singer_hit1,
snd.opera_singer_hit2,
]
a.jump_sounds = opera_singer_sounds
a.attack_sounds = opera_singer_sounds
a.impact_sounds = opera_singer_hit_sounds
a.death_sounds = [snd.opera_singer_death]
a.pickup_sounds = opera_singer_sounds
a.fall_sounds = [snd.opera_singer_fall]
a.style = 'spaz'
a.default_color = (0.3, 0.5, 0.8)
a.default_highlight = (1, 0, 0)
# Pixie ###################################
a = Appearance('Pixel')
a.color_texture = tex.pixie_color
a.color_mask_texture = tex.pixie_color_mask
a.icon_texture = tex.pixie_icon
a.icon_mask_texture = tex.pixie_icon_color_mask
a.head_mesh = mesh.pixie_head
a.torso_mesh = mesh.pixie_torso
a.pelvis_mesh = mesh.pixie_pelvis
a.upper_arm_mesh = mesh.pixie_upper_arm
a.forearm_mesh = mesh.pixie_fore_arm
a.hand_mesh = mesh.pixie_hand
a.upper_leg_mesh = mesh.pixie_upper_leg
a.lower_leg_mesh = mesh.pixie_lower_leg
a.toes_mesh = mesh.pixie_toes
pixie_sounds = [
snd.pixie1,
snd.pixie2,
snd.pixie3,
snd.pixie4,
]
pixie_hit_sounds = [
snd.pixie_hit1,
snd.pixie_hit2,
]
a.jump_sounds = pixie_sounds
a.attack_sounds = pixie_sounds
a.impact_sounds = pixie_hit_sounds
a.death_sounds = [snd.pixie_death]
a.pickup_sounds = pixie_sounds
a.fall_sounds = [snd.pixie_fall]
a.style = 'pixie'
a.default_color = (0, 1, 0.7)
a.default_highlight = (0.65, 0.35, 0.75)
# Robot ###################################
a = Appearance('Robot')
a.color_texture = tex.robot_color
a.color_mask_texture = tex.robot_color_mask
a.icon_texture = tex.robot_icon
a.icon_mask_texture = tex.robot_icon_color_mask
a.head_mesh = mesh.robot_head
a.torso_mesh = mesh.robot_torso
a.pelvis_mesh = mesh.robot_pelvis
a.upper_arm_mesh = mesh.robot_upper_arm
a.forearm_mesh = mesh.robot_fore_arm
a.hand_mesh = mesh.robot_hand
a.upper_leg_mesh = mesh.robot_upper_leg
a.lower_leg_mesh = mesh.robot_lower_leg
a.toes_mesh = mesh.robot_toes
robot_sounds = [
snd.robot1,
snd.robot2,
snd.robot3,
snd.robot4,
]
robot_hit_sounds = [
snd.robot_hit1,
snd.robot_hit2,
]
a.jump_sounds = robot_sounds
a.attack_sounds = robot_sounds
a.impact_sounds = robot_hit_sounds
a.death_sounds = [snd.robot_death]
a.pickup_sounds = robot_sounds
a.fall_sounds = [snd.robot_fall]
a.style = 'spaz'
a.default_color = (0.3, 0.5, 0.8)
a.default_highlight = (1, 0, 0)
# Bunny ###################################
a = Appearance('Easter Bunny')
a.color_texture = tex.bunny_color
a.color_mask_texture = tex.bunny_color_mask
a.icon_texture = tex.bunny_icon
a.icon_mask_texture = tex.bunny_icon_color_mask
a.head_mesh = mesh.bunny_head
a.torso_mesh = mesh.bunny_torso
a.pelvis_mesh = mesh.bunny_pelvis
a.upper_arm_mesh = mesh.bunny_upper_arm
a.forearm_mesh = mesh.bunny_fore_arm
a.hand_mesh = mesh.bunny_hand
a.upper_leg_mesh = mesh.bunny_upper_leg
a.lower_leg_mesh = mesh.bunny_lower_leg
a.toes_mesh = mesh.bunny_toes
bunny_sounds = [
snd.bunny1,
snd.bunny2,
snd.bunny3,
snd.bunny4,
]
bunny_hit_sounds = [
snd.bunny_hit1,
snd.bunny_hit2,
]
a.jump_sounds = [snd.bunny_jump]
a.attack_sounds = bunny_sounds
a.impact_sounds = bunny_hit_sounds
a.death_sounds = [snd.bunny_death]
a.pickup_sounds = bunny_sounds
a.fall_sounds = [snd.bunny_fall]
a.style = 'bunny'
a.default_color = (1, 1, 1)
a.default_highlight = (1, 0.5, 0.5)
# 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)
import asyncio
from concurrent.futures import Future
from pathlib import Path
from enum import Enum