This commit is contained in:
Rikko 2022-10-05 22:30:12 +05:30
parent 9041d5cbf7
commit 6bdc35eda4
2 changed files with 491 additions and 503 deletions

View file

@ -34,7 +34,8 @@ from __future__ import annotations
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
import ba,_ba import ba
import _ba
from bastd.actor.playerspaz import PlayerSpaz from bastd.actor.playerspaz import PlayerSpaz
@ -46,12 +47,14 @@ from ba._profile import get_player_profile_colors
if TYPE_CHECKING: if TYPE_CHECKING:
from typing import Any, Type, List, Dict, Tuple, Union, Sequence, Optional from typing import Any, Type, List, Dict, Tuple, Union, Sequence, Optional
import weakref import weakref
import os,json import os
import json
from ba import _lobby from ba import _lobby
from bastd.actor.spazappearance import * from bastd.actor.spazappearance import *
from ba._lobby import ChangeMessage from ba._lobby import ChangeMessage
from ba._lobby import PlayerReadyMessage from ba._lobby import PlayerReadyMessage
def __init__(self, vpos: float, sessionplayer: _ba.SessionPlayer, def __init__(self, vpos: float, sessionplayer: _ba.SessionPlayer,
lobby: 'Lobby') -> None: lobby: 'Lobby') -> None:
self._deek_sound = _ba.getsound('deek') self._deek_sound = _ba.getsound('deek')
@ -75,7 +78,8 @@ def __init__(self, vpos: float, sessionplayer: _ba.SessionPlayer,
app = _ba.app app = _ba.app
self.bakwas_chars=["Lee","Todd McBurton","Zola","Butch","Witch","warrior","Middle-Man","Alien","OldLady","Gladiator","Wrestler","Gretel","Robot"] self.bakwas_chars = ["Lee", "Todd McBurton", "Zola", "Butch", "Witch", "warrior",
"Middle-Man", "Alien", "OldLady", "Gladiator", "Wrestler", "Gretel", "Robot"]
# Load available player profiles either from the local config or # Load available player profiles either from the local config or
# from the remote device. # from the remote device.
@ -139,7 +143,7 @@ def __init__(self, vpos: float, sessionplayer: _ba.SessionPlayer,
self._character_index = self._random_character_index self._character_index = self._random_character_index
self._color = self._random_color self._color = self._random_color
self._highlight = self._random_highlight self._highlight = self._random_highlight
self.characterchooser=False self.characterchooser = False
self.update_from_profile() self.update_from_profile()
self.update_position() self.update_position()
self._inited = True self._inited = True
@ -147,8 +151,6 @@ def __init__(self, vpos: float, sessionplayer: _ba.SessionPlayer,
self._set_ready(False) self._set_ready(False)
def _set_ready(self, ready: bool) -> None: def _set_ready(self, ready: bool) -> None:
# pylint: disable=cyclic-import # pylint: disable=cyclic-import
@ -166,7 +168,7 @@ def _set_ready(self, ready: bool) -> None:
_ba.set_ui_input_device(self._sessionplayer.inputdevice) _ba.set_ui_input_device(self._sessionplayer.inputdevice)
return return
if ready==False: if ready == False:
self._sessionplayer.assigninput( self._sessionplayer.assigninput(
InputType.LEFT_PRESS, InputType.LEFT_PRESS,
Call(self.handlemessage, ChangeMessage('team', -1))) Call(self.handlemessage, ChangeMessage('team', -1)))
@ -190,21 +192,21 @@ def _set_ready(self, ready: bool) -> None:
self._update_text() self._update_text()
self._sessionplayer.setname('untitled', real=False) self._sessionplayer.setname('untitled', real=False)
elif ready == True: elif ready == True:
self.characterchooser=True self.characterchooser = True
self._sessionplayer.assigninput( self._sessionplayer.assigninput(
(InputType.LEFT_PRESS, InputType.RIGHT_PRESS, (InputType.LEFT_PRESS, InputType.RIGHT_PRESS,
InputType.UP_PRESS, InputType.DOWN_PRESS, InputType.UP_PRESS, InputType.DOWN_PRESS,
InputType.JUMP_PRESS, InputType.BOMB_PRESS, InputType.JUMP_PRESS, InputType.BOMB_PRESS,
InputType.PICK_UP_PRESS), self._do_nothing) InputType.PICK_UP_PRESS), self._do_nothing)
self._sessionplayer.assigninput( self._sessionplayer.assigninput(
(InputType.UP_PRESS),Call(self.handlemessage,ChangeMessage('characterchooser',-1))) (InputType.UP_PRESS), Call(self.handlemessage, ChangeMessage('characterchooser', -1)))
self._sessionplayer.assigninput( self._sessionplayer.assigninput(
(InputType.DOWN_PRESS),Call(self.handlemessage,ChangeMessage('characterchooser',1))) (InputType.DOWN_PRESS), Call(self.handlemessage, ChangeMessage('characterchooser', 1)))
self._sessionplayer.assigninput( self._sessionplayer.assigninput(
(InputType.BOMB_PRESS),Call(self.handlemessage,ChangeMessage('ready',0))) (InputType.BOMB_PRESS), Call(self.handlemessage, ChangeMessage('ready', 0)))
self._sessionplayer.assigninput( self._sessionplayer.assigninput(
(InputType.JUMP_PRESS,InputType.PICK_UP_PRESS, InputType.PUNCH_PRESS), (InputType.JUMP_PRESS, InputType.PICK_UP_PRESS, InputType.PUNCH_PRESS),
Call(self.handlemessage, ChangeMessage('ready', 2))) Call(self.handlemessage, ChangeMessage('ready', 2)))
# Store the last profile picked by this input for reuse. # Store the last profile picked by this input for reuse.
@ -237,8 +239,6 @@ def _set_ready(self, ready: bool) -> None:
self._update_text() self._update_text()
else: else:
# Inform the session that this player is ready. # Inform the session that this player is ready.
_ba.getsession().handlemessage(PlayerReadyMessage(self)) _ba.getsession().handlemessage(PlayerReadyMessage(self))
@ -257,7 +257,7 @@ def handlemessage(self, msg: Any) -> Any:
if not self._text_node: if not self._text_node:
print_error('got ChangeMessage after nodes died') print_error('got ChangeMessage after nodes died')
return return
if msg.what=='characterchooser': if msg.what == 'characterchooser':
_ba.playsound(self._click_sound) _ba.playsound(self._click_sound)
# update our index in our local list of characters # update our index in our local list of characters
self._character_index = ((self._character_index + msg.value) % self._character_index = ((self._character_index + msg.value) %
@ -293,7 +293,7 @@ def handlemessage(self, msg: Any) -> Any:
elif msg.what == 'character': elif msg.what == 'character':
_ba.playsound(self._click_sound) _ba.playsound(self._click_sound)
self.characterchooser=True self.characterchooser = True
# update our index in our local list of characters # update our index in our local list of characters
self._character_index = ((self._character_index + msg.value) % self._character_index = ((self._character_index + msg.value) %
len(self._character_names)) len(self._character_names))
@ -303,6 +303,7 @@ def handlemessage(self, msg: Any) -> Any:
elif msg.what == 'ready': elif msg.what == 'ready':
self._handle_ready_msg(msg.value) self._handle_ready_msg(msg.value)
def _update_text(self) -> None: def _update_text(self) -> None:
assert self._text_node is not None assert self._text_node is not None
if self._ready: if self._ready:
@ -314,14 +315,14 @@ def _update_text(self) -> None:
text = Lstr(value='${A}\n${B}', text = Lstr(value='${A}\n${B}',
subs=[('${A}', text), subs=[('${A}', text),
('${B}', Lstr(value=""+self._character_names[self._character_index]))]) ('${B}', Lstr(value=""+self._character_names[self._character_index]))])
self._text_node.scale=0.8 self._text_node.scale = 0.8
else: else:
text = Lstr(value='${A} (${B})', text = Lstr(value='${A} (${B})',
subs=[('${A}', text), subs=[('${A}', text),
('${B}', Lstr(resource='readyText'))]) ('${B}', Lstr(resource='readyText'))])
else: else:
text = Lstr(value=self._getname(full=True)) text = Lstr(value=self._getname(full=True))
self._text_node.scale=1.0 self._text_node.scale = 1.0
can_switch_teams = len(self.lobby.sessionteams) > 1 can_switch_teams = len(self.lobby.sessionteams) > 1
@ -347,14 +348,13 @@ def _update_text(self) -> None:
self._text_node.text = text self._text_node.text = text
# ba_meta export plugin # ba_meta export plugin
class HeySmoothy(ba.Plugin): class HeySmoothy(ba.Plugin):
def __init__(self): def __init__(self):
_lobby.Chooser.__init__=__init__ _lobby.Chooser.__init__ = __init__
_lobby.Chooser._set_ready=_set_ready _lobby.Chooser._set_ready = _set_ready
_lobby.Chooser._update_text=_update_text
_lobby.Chooser.handlemessage=handlemessage
_lobby.Chooser._update_text = _update_text
_lobby.Chooser.handlemessage = handlemessage

View file

@ -50,38 +50,41 @@ from __future__ import annotations
from typing import TYPE_CHECKING from typing import TYPE_CHECKING
import ba,_ba import ba
import _ba
from bastd.actor.playerspaz import PlayerSpaz from bastd.actor.playerspaz import PlayerSpaz
from bastd.actor.scoreboard import Scoreboard from bastd.actor.scoreboard import Scoreboard
if TYPE_CHECKING: if TYPE_CHECKING:
from typing import Any, Type, List, Dict, Tuple, Union, Sequence, Optional from typing import Any, Type, List, Dict, Tuple, Union, Sequence, Optional
import os,json import os
import json
from bastd.actor.spazappearance import * from bastd.actor.spazappearance import *
spazoutfit={ spazoutfit = {
"color_mask":"neoSpazColorMask", "color_mask": "neoSpazColorMask",
"color_texture":"neoSpazColor", "color_texture": "neoSpazColor",
"head":"neoSpazHead", "head": "neoSpazHead",
"hand":"neoSpazHand", "hand": "neoSpazHand",
"torso":"neoSpazTorso", "torso": "neoSpazTorso",
"pelvis":"neoSpazTorso", "pelvis": "neoSpazTorso",
"upper_arm":"neoSpazUpperArm", "upper_arm": "neoSpazUpperArm",
"forearm":"neoSpazForeArm", "forearm": "neoSpazForeArm",
"upper_leg":"neoSpazUpperLeg", "upper_leg": "neoSpazUpperLeg",
"lower_leg":"neoSpazLowerLeg", "lower_leg": "neoSpazLowerLeg",
"toes_model":"neoSpazToes", "toes_model": "neoSpazToes",
"jump_sounds":['spazJump01', 'spazJump02', 'spazJump03', 'spazJump04'], "jump_sounds": ['spazJump01', 'spazJump02', 'spazJump03', 'spazJump04'],
"attack_sounds":['spazAttack01', 'spazAttack02', 'spazAttack03', 'spazAttack04'], "attack_sounds": ['spazAttack01', 'spazAttack02', 'spazAttack03', 'spazAttack04'],
"impact_sounds":['spazImpact01', 'spazImpact02', 'spazImpact03', 'spazImpact04'], "impact_sounds": ['spazImpact01', 'spazImpact02', 'spazImpact03', 'spazImpact04'],
"death_sounds":['spazDeath01'], "death_sounds": ['spazDeath01'],
"pickup_sounds":['spazPickup01'], "pickup_sounds": ['spazPickup01'],
"fall_sounds":['spazFall01'], "fall_sounds": ['spazFall01'],
"icon_texture":"neoSpazIcon", "icon_texture": "neoSpazIcon",
"icon_mask_texture":"neoSpazIconColorMask", "icon_mask_texture": "neoSpazIconColorMask",
"style":"spaz" "style": "spaz"
} }
character=None character = None
class Player(ba.Player['Team']): class Player(ba.Player['Team']):
"""Our player type for this game.""" """Our player type for this game."""
@ -140,7 +143,6 @@ class CharacterBuilder(ba.TeamGameActivity[Player, Team]):
ba.BoolSetting('Epic Mode', default=False), ba.BoolSetting('Epic Mode', default=False),
] ]
if issubclass(sessiontype, ba.FreeForAllSession): if issubclass(sessiontype, ba.FreeForAllSession):
settings.append( settings.append(
ba.BoolSetting('Allow Negative Scores', default=False)) ba.BoolSetting('Allow Negative Scores', default=False))
@ -158,7 +160,6 @@ class CharacterBuilder(ba.TeamGameActivity[Player, Team]):
def __init__(self, settings: dict): def __init__(self, settings: dict):
super().__init__(settings) super().__init__(settings)
self.initdic() self.initdic()
@ -171,9 +172,9 @@ class CharacterBuilder(ba.TeamGameActivity[Player, Team]):
self._time_limit = float(settings['Time Limit']) self._time_limit = float(settings['Time Limit'])
self._allow_negative_scores = bool( self._allow_negative_scores = bool(
settings.get('Allow Negative Scores', False)) settings.get('Allow Negative Scores', False))
self.bodyindex=0 self.bodyindex = 0
self.modelindex=0 self.modelindex = 0
self.youtube= ba.newnode( self.youtube = ba.newnode(
'text', 'text',
attrs={ attrs={
'text': "youtube.com/c/HeySmoothy", 'text': "youtube.com/c/HeySmoothy",
@ -181,9 +182,9 @@ class CharacterBuilder(ba.TeamGameActivity[Player, Team]):
'scale': 0.02, 'scale': 0.02,
'color': (1, 0, 0, 0.4), 'color': (1, 0, 0, 0.4),
'h_align': 'center', 'h_align': 'center',
'position': (0,4,-1.9) 'position': (0, 4, -1.9)
}) })
self.discordservere= ba.newnode( self.discordservere = ba.newnode(
'text', 'text',
attrs={ attrs={
'text': "discord.gg/ucyaesh", 'text': "discord.gg/ucyaesh",
@ -191,7 +192,7 @@ class CharacterBuilder(ba.TeamGameActivity[Player, Team]):
'scale': 0.02, 'scale': 0.02,
'color': (0.12, 0.3, 0.6, 0.4), 'color': (0.12, 0.3, 0.6, 0.4),
'h_align': 'center', 'h_align': 'center',
'position': (-3,2.7,-1.9) 'position': (-3, 2.7, -1.9)
}) })
# self.discord= ba.newnode( # self.discord= ba.newnode(
# 'text', # 'text',
@ -204,7 +205,7 @@ class CharacterBuilder(ba.TeamGameActivity[Player, Team]):
# 'position': (4,2.7,-1.9) # 'position': (4,2.7,-1.9)
# }) # })
# Base class overrides. # Base class overrides.
self.bodypart= ba.newnode( self.bodypart = ba.newnode(
'text', 'text',
attrs={ attrs={
'text': "<Choose Body Part>", 'text': "<Choose Body Part>",
@ -212,7 +213,7 @@ class CharacterBuilder(ba.TeamGameActivity[Player, Team]):
'scale': 0.02, 'scale': 0.02,
'color': (1, 1, 0, 1), 'color': (1, 1, 0, 1),
'h_align': 'center', 'h_align': 'center',
'position': (-4,6,-4) 'position': (-4, 6, -4)
}) })
self.newmodel = ba.newnode( self.newmodel = ba.newnode(
'text', 'text',
@ -222,7 +223,7 @@ class CharacterBuilder(ba.TeamGameActivity[Player, Team]):
'scale': 0.02, 'scale': 0.02,
'color': (1, 1, 0, 1), 'color': (1, 1, 0, 1),
'h_align': 'center', 'h_align': 'center',
'position': (6,6,-4) 'position': (6, 6, -4)
}) })
self.slow_motion = self._epic_mode self.slow_motion = self._epic_mode
self.default_music = (ba.MusicType.EPIC if self._epic_mode else self.default_music = (ba.MusicType.EPIC if self._epic_mode else
@ -241,12 +242,11 @@ class CharacterBuilder(ba.TeamGameActivity[Player, Team]):
def on_begin(self) -> None: def on_begin(self) -> None:
super().on_begin() super().on_begin()
def nextBodyPart(self): def nextBodyPart(self):
self.bodyindex =(self.bodyindex+1)%len(self.dic.keys()) self.bodyindex = (self.bodyindex+1) % len(self.dic.keys())
self.bodypart.delete() self.bodypart.delete()
PART=list(self.dic.keys())[self.bodyindex] PART = list(self.dic.keys())[self.bodyindex]
self.bodypart=ba.newnode( self.bodypart = ba.newnode(
'text', 'text',
attrs={ attrs={
'text': PART, 'text': PART,
@ -254,16 +254,14 @@ class CharacterBuilder(ba.TeamGameActivity[Player, Team]):
'scale': 0.02, 'scale': 0.02,
'color': (1, 1, 1, 1), 'color': (1, 1, 1, 1),
'h_align': 'center', 'h_align': 'center',
'position': (-4,6,-4) 'position': (-4, 6, -4)
}) })
def prevBodyPart(self): def prevBodyPart(self):
self.bodyindex =(self.bodyindex-1)%len(self.dic.keys()) self.bodyindex = (self.bodyindex-1) % len(self.dic.keys())
self.bodypart.delete() self.bodypart.delete()
PART=list(self.dic.keys())[self.bodyindex] PART = list(self.dic.keys())[self.bodyindex]
self.bodypart=ba.newnode( self.bodypart = ba.newnode(
'text', 'text',
attrs={ attrs={
'text': PART, 'text': PART,
@ -271,16 +269,16 @@ class CharacterBuilder(ba.TeamGameActivity[Player, Team]):
'scale': 0.02, 'scale': 0.02,
'color': (1, 1, 1, 1), 'color': (1, 1, 1, 1),
'h_align': 'center', 'h_align': 'center',
'position': (-4,6,-4) 'position': (-4, 6, -4)
}) })
def nextModel(self): def nextModel(self):
self.newmodel.delete() self.newmodel.delete()
PART=list(self.dic.keys())[self.bodyindex] PART = list(self.dic.keys())[self.bodyindex]
self.modelindex =(self.modelindex+1)%len(self.dic[PART]) self.modelindex = (self.modelindex+1) % len(self.dic[PART])
model=self.dic[PART][self.modelindex] model = self.dic[PART][self.modelindex]
self.newmodel=ba.newnode( self.newmodel = ba.newnode(
'text', 'text',
attrs={ attrs={
'text': model, 'text': model,
@ -288,18 +286,18 @@ class CharacterBuilder(ba.TeamGameActivity[Player, Team]):
'scale': 0.02, 'scale': 0.02,
'color': (1, 1, 1, 1), 'color': (1, 1, 1, 1),
'h_align': 'center', 'h_align': 'center',
'position': (6,6,-4) 'position': (6, 6, -4)
}) })
self.setModel(PART,model) self.setModel(PART, model)
def prevModel(self): def prevModel(self):
self.newmodel.delete() self.newmodel.delete()
PART=list(self.dic.keys())[self.bodyindex] PART = list(self.dic.keys())[self.bodyindex]
self.modelindex =(self.modelindex-1)%len(self.dic[PART]) self.modelindex = (self.modelindex-1) % len(self.dic[PART])
model=self.dic[PART][self.modelindex] model = self.dic[PART][self.modelindex]
self.newmodel=ba.newnode( self.newmodel = ba.newnode(
'text', 'text',
attrs={ attrs={
'text': model, 'text': model,
@ -307,43 +305,43 @@ class CharacterBuilder(ba.TeamGameActivity[Player, Team]):
'scale': 0.02, 'scale': 0.02,
'color': (1, 1, 1, 1), 'color': (1, 1, 1, 1),
'h_align': 'center', 'h_align': 'center',
'position': (6,6,-4) 'position': (6, 6, -4)
}) })
self.setModel(PART,model) self.setModel(PART, model)
def setModel(self,bodypart,modelname): def setModel(self, bodypart, modelname):
global spazoutfit global spazoutfit
body=_ba.get_foreground_host_activity().players[0].actor.node body = _ba.get_foreground_host_activity().players[0].actor.node
if bodypart=='head': if bodypart == 'head':
body.head_model=ba.getmodel(modelname) body.head_model = ba.getmodel(modelname)
elif bodypart=='torso': elif bodypart == 'torso':
body.torso_model=ba.getmodel(modelname) body.torso_model = ba.getmodel(modelname)
elif bodypart=='pelvis': elif bodypart == 'pelvis':
body.pelvis_model=ba.getmodel(modelname) body.pelvis_model = ba.getmodel(modelname)
elif bodypart=='upper_arm': elif bodypart == 'upper_arm':
body.upper_arm_model=ba.getmodel(modelname) body.upper_arm_model = ba.getmodel(modelname)
elif bodypart=='forearm': elif bodypart == 'forearm':
body.forearm_model=ba.getmodel(modelname) body.forearm_model = ba.getmodel(modelname)
elif bodypart=='hand': elif bodypart == 'hand':
body.hand_model=ba.getmodel(modelname) body.hand_model = ba.getmodel(modelname)
elif bodypart=='upper_leg': elif bodypart == 'upper_leg':
body.upper_leg_model=ba.getmodel(modelname) body.upper_leg_model = ba.getmodel(modelname)
elif bodypart=='lower_leg': elif bodypart == 'lower_leg':
body.lower_leg_model=ba.getmodel(modelname) body.lower_leg_model = ba.getmodel(modelname)
elif bodypart=='toes_model': elif bodypart == 'toes_model':
body.toes_model=ba.getmodel(modelname) body.toes_model = ba.getmodel(modelname)
elif bodypart=='style': elif bodypart == 'style':
body.style=modelname body.style = modelname
elif bodypart=='color_texture': elif bodypart == 'color_texture':
body.color_texture=ba.gettexture(modelname) body.color_texture = ba.gettexture(modelname)
elif bodypart=='color_mask': elif bodypart == 'color_mask':
body.color_mask_texture=ba.gettexture(modelname) body.color_mask_texture = ba.gettexture(modelname)
spazoutfit[bodypart]=modelname spazoutfit[bodypart] = modelname
def spawn_player(self, player: Player) -> ba.Actor: def spawn_player(self, player: Player) -> ba.Actor:
global character global character
if character!=None: if character != None:
player.character=character player.character = character
self.setcurrentcharacter(player.character) self.setcurrentcharacter(player.character)
@ -374,31 +372,25 @@ class CharacterBuilder(ba.TeamGameActivity[Player, Team]):
player = msg.getplayer(Player) player = msg.getplayer(Player)
self.respawn_player(player) self.respawn_player(player)
else: else:
return super().handlemessage(msg) return super().handlemessage(msg)
return None return None
def setcurrentcharacter(self,charname):
global spazoutfit
char=ba.app.spaz_appearances[charname]
spazoutfit['head']=char.head_model
spazoutfit['hand']=char.hand_model
spazoutfit['torso']=char.torso_model
spazoutfit['pelvis']=char.pelvis_model
spazoutfit['upper_arm']=char.upper_arm_model
spazoutfit['forearm']=char.forearm_model
spazoutfit['upper_leg']=char.upper_leg_model
spazoutfit['lower_leg']=char.lower_leg_model
spazoutfit['toes_model']=char.toes_model
spazoutfit['style']=char.style
spazoutfit['color_mask']=char.color_mask_texture
spazoutfit['color_texture']=char.color_texture
def setcurrentcharacter(self, charname):
global spazoutfit
char = ba.app.spaz_appearances[charname]
spazoutfit['head'] = char.head_model
spazoutfit['hand'] = char.hand_model
spazoutfit['torso'] = char.torso_model
spazoutfit['pelvis'] = char.pelvis_model
spazoutfit['upper_arm'] = char.upper_arm_model
spazoutfit['forearm'] = char.forearm_model
spazoutfit['upper_leg'] = char.upper_leg_model
spazoutfit['lower_leg'] = char.lower_leg_model
spazoutfit['toes_model'] = char.toes_model
spazoutfit['style'] = char.style
spazoutfit['color_mask'] = char.color_mask_texture
spazoutfit['color_texture'] = char.color_texture
def _update_scoreboard(self) -> None: def _update_scoreboard(self) -> None:
for team in self.teams: for team in self.teams:
@ -410,27 +402,29 @@ class CharacterBuilder(ba.TeamGameActivity[Player, Team]):
for team in self.teams: for team in self.teams:
results.set_team_score(team, team.score) results.set_team_score(team, team.score)
self.end(results=results) self.end(results=results)
def initdic(self): def initdic(self):
self.dic={"head":["bomb","landMine","trees","wing","eyeLid","impactBomb"], self.dic = {"head": ["bomb", "landMine", "trees", "wing", "eyeLid", "impactBomb"],
"hand":["hairTuft3","bomb","powerup"], "hand": ["hairTuft3", "bomb", "powerup"],
"torso":["bomb","landMine","bomb"], "torso": ["bomb", "landMine", "bomb"],
"pelvis":["hairTuft4","bomb"], "pelvis": ["hairTuft4", "bomb"],
"upper_arm":["wing","locator","bomb"], "upper_arm": ["wing", "locator", "bomb"],
"forearm":["flagPole","bomb"], "forearm": ["flagPole", "bomb"],
"upper_leg":["bomb"], "upper_leg": ["bomb"],
"lower_leg":["bomb"], "lower_leg": ["bomb"],
"toes_model":["bomb"], "toes_model": ["bomb"],
"style":["spaz","female","ninja","kronk","mel","pirate","santa","frosty","bones","bear","penguin","ali","cyborg","agent","pixie","bunny"], "style": ["spaz", "female", "ninja", "kronk", "mel", "pirate", "santa", "frosty", "bones", "bear", "penguin", "ali", "cyborg", "agent", "pixie", "bunny"],
"color_texture":["kronk","egg1","egg2","egg3","achievementGotTheMoves","bombColor","crossOut","explosion","rgbStripes","powerupCurse","powerupHealth","impactBombColorLit"], "color_texture": ["kronk", "egg1", "egg2", "egg3", "achievementGotTheMoves", "bombColor", "crossOut", "explosion", "rgbStripes", "powerupCurse", "powerupHealth", "impactBombColorLit"],
"color_mask":["egg1","egg2","egg3","bombColor","crossOutMask","fontExtras3"] "color_mask": ["egg1", "egg2", "egg3", "bombColor", "crossOutMask", "fontExtras3"]
} }
chars=["neoSpaz","zoe","ninja","kronk","mel","jack","santa","frosty","bones","bear","penguin","ali","cyborg","agent","wizard","pixie","bunny"] chars = ["neoSpaz", "zoe", "ninja", "kronk", "mel", "jack", "santa", "frosty",
"bones", "bear", "penguin", "ali", "cyborg", "agent", "wizard", "pixie", "bunny"]
for char in chars: for char in chars:
self.dic["head"].append(char+"Head") self.dic["head"].append(char+"Head")
self.dic["hand"].append(char+"Hand") self.dic["hand"].append(char+"Hand")
self.dic["torso"].append(char+"Torso") self.dic["torso"].append(char+"Torso")
if char not in ['mel',"jack","santa"]: if char not in ['mel', "jack", "santa"]:
self.dic["pelvis"].append(char+"Pelvis") self.dic["pelvis"].append(char+"Pelvis")
self.dic["upper_arm"].append(char+"UpperArm") self.dic["upper_arm"].append(char+"UpperArm")
self.dic["forearm"].append(char+"ForeArm") self.dic["forearm"].append(char+"ForeArm")
@ -438,56 +432,59 @@ class CharacterBuilder(ba.TeamGameActivity[Player, Team]):
self.dic["lower_leg"].append(char+"LowerLeg") self.dic["lower_leg"].append(char+"LowerLeg")
self.dic["toes_model"].append(char+"Toes") self.dic["toes_model"].append(char+"Toes")
self.dic["color_mask"].append(char+"ColorMask") self.dic["color_mask"].append(char+"ColorMask")
if char !="kronk": if char != "kronk":
self.dic["color_texture"].append(char+"Color") self.dic["color_texture"].append(char+"Color")
cm=_ba.chatmessage cm = _ba.chatmessage
def _new_chatmessage(msg): def _new_chatmessage(msg):
if msg.split(" ")[0]=="export": if msg.split(" ")[0] == "export":
if len(msg.split(" "))>1: if len(msg.split(" ")) > 1:
savecharacter(msg.split(" ")[1]) savecharacter(msg.split(" ")[1])
else: else:
_ba.screenmessage("Enter name of character") _ba.screenmessage("Enter name of character")
elif msg.split(" ")[0]=="import": elif msg.split(" ")[0] == "import":
importcharacter(msg[7:]) importcharacter(msg[7:])
else: else:
cm(msg) cm(msg)
_ba.chatmessage=_new_chatmessage
_ba.chatmessage = _new_chatmessage
def savecharacter(name): def savecharacter(name):
path=os.path.join(_ba.env()["python_directory_user"],"CustomCharacters" + os.sep) path = os.path.join(_ba.env()["python_directory_user"], "CustomCharacters" + os.sep)
if not os.path.isdir(path): if not os.path.isdir(path):
os.makedirs(path) os.makedirs(path)
if _ba.get_foreground_host_activity()!=None: if _ba.get_foreground_host_activity() != None:
with open(path+name+".json",'w') as f: with open(path+name+".json", 'w') as f:
json.dump(spazoutfit,f,indent=4) json.dump(spazoutfit, f, indent=4)
registercharacter(name,spazoutfit) registercharacter(name, spazoutfit)
ba.playsound(ba.getsound("gunCocking")) ba.playsound(ba.getsound("gunCocking"))
_ba.screenmessage("Character Saved") _ba.screenmessage("Character Saved")
else: else:
_ba.screenmessage("Works offline with Character Maker") _ba.screenmessage("Works offline with Character Maker")
def importcharacter(name): def importcharacter(name):
if name in ba.app.spaz_appearances: if name in ba.app.spaz_appearances:
global character global character
character=name character = name
try: try:
_ba.get_foreground_host_activity().players[0].actor.node.handlemessage(ba.DieMessage()) _ba.get_foreground_host_activity().players[0].actor.node.handlemessage(ba.DieMessage())
_ba.screenmessage("Imported") _ba.screenmessage("Imported")
except: except:
_ba.screenmessage("works offline with character maker") _ba.screenmessage("works offline with character maker")
else: else:
_ba.screenmessage("invalid name check typo \n name is case sensitive") _ba.screenmessage("invalid name check typo \n name is case sensitive")
def registercharacter(name,char): def registercharacter(name, char):
t = Appearance(name.split(".")[0]) t = Appearance(name.split(".")[0])
t.color_texture = char['color_texture'] t.color_texture = char['color_texture']
t.color_mask_texture = char['color_mask'] t.color_mask_texture = char['color_mask']
@ -513,26 +510,17 @@ def registercharacter(name,char):
t.style = char['style'] t.style = char['style']
# ba_meta export plugin # ba_meta export plugin
class HeySmoothy(ba.Plugin): class HeySmoothy(ba.Plugin):
def __init__(self): def __init__(self):
_ba.set_party_icon_always_visible(True) _ba.set_party_icon_always_visible(True)
path=os.path.join(_ba.env()["python_directory_user"],"CustomCharacters" + os.sep) path = os.path.join(_ba.env()["python_directory_user"], "CustomCharacters" + os.sep)
if not os.path.isdir(path): if not os.path.isdir(path):
os.makedirs(path) os.makedirs(path)
files=os.listdir(path) files = os.listdir(path)
for file in files: for file in files:
with open(path+file, 'r') as f: with open(path+file, 'r') as f:
character = json.load(f) character = json.load(f)
registercharacter(file,character) registercharacter(file, character)