Bombsquad-Ballistica-Modded.../dist/ba_root/mods/plugins/elPatronPowerups.py
2023-08-19 22:31:57 +05:30

2659 lines
108 KiB
Python
Raw Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# ba_meta require api 8
from __future__ import annotations
_sp_ = ('\n')
import babase
import bauiv1 as bui
from bauiv1lib.profile import browser
from bascenev1lib.actor import bomb
from bascenev1lib.actor import powerupbox as pupbox
from bascenev1lib.actor.spazbot import SpazBot
from bauiv1lib.popup import (PopupWindow, PopupMenu)
from bascenev1lib.mainmenu import (MainMenuActivity, MainMenuSession)
from bascenev1lib.actor.popuptext import PopupText
from bauiv1lib.confirm import ConfirmWindow
from bascenev1lib.actor.spaz import *
if TYPE_CHECKING:
pass
# === Mod made by @Patron_Modz ===
def getlanguage(text, subs: str = None, almacen: list = []):
if almacen == []: almacen = list(range(1000))
lang = bui.app.lang.language
translate = {"Reset":
{"Spanish": "Reiniciar",
"English": "Reset",
"Portuguese": "Reiniciar"},
"Nothing":
{"Spanish": "Sin potenciadores",
"English": "No powerups",
"Portuguese": "Sem powerups"},
"Action 1":
{"Spanish": "Potenciadores",
"English": "Powerups",
"Portuguese": "Powerups"},
"Action 2":
{"Spanish": "Configuración",
"English": "Settings",
"Portuguese": "Definições"},
"Action 3":
{"Spanish": "Extras",
"English": "Extras",
"Portuguese": "Extras"},
"Action 4":
{"Spanish": "Tienda",
"English": "Store",
"Portuguese": "Loja"},
"Action 5":
{"Spanish": "Canjear código",
"English": "Enter Code",
"Portuguese": "Código promocional"},
"Custom":
{"Spanish": "",
"English": "Customize",
"Portuguese": "Customizar"},
"Impairment Bombs":
{"Spanish": "Bombas menoscabo",
"English": "Hyperactive bombs",
"Portuguese": "Bombas hiperativas"},
"Speed":
{"Spanish": "Velocidad",
"English": "Speed",
"Portuguese": "Velocidade"},
"Fire Bombs":
{"Spanish": "Bombas de fuego",
"English": "Fire Bombs",
"Portuguese": "Bombas de fogo"},
"Ice Man":
{"Spanish": "Hombre de hielo",
"English": "Ice man",
"Portuguese": "Homem de gelo"},
"Fly Bombs":
{"Spanish": "Bombas expansivas",
"English": "Expansive bombs",
"Portuguese": "Bombas expansivas"},
"Goodbye":
{"Spanish": "¡Hasta luego!",
"English": "Goodbye!",
"Portuguese": "Adeus!"},
"Healing Damage":
{"Spanish": "Auto-curación",
"English": "Healing Damage",
"Portuguese": "Auto-cura"},
"Tank Shield":
{"Spanish": "Súper blindaje",
"English": "Reinforced shield",
"Portuguese": "Escudo reforçado"},
"Tank Shield PTG":
{"Spanish": "Porcentaje de disminución",
"English": "Percentage decreased",
"Portuguese": "Percentual reduzido"},
"Healing Damage PTG":
{"Spanish": "Porcentaje de recuperación de salud",
"English": "Percentage of health recovered",
"Portuguese": "Porcentagem de recuperação de saúde"},
"SY: BALL":
{"Spanish": "Esfera",
"English": "Sphere",
"Portuguese": "Esfera"},
"SY: Impact":
{"Spanish": "Especial",
"English": "Special",
"Portuguese": "Especial"},
"SY: Egg":
{"Spanish": "Huevito",
"English": "Egg shape",
"Portuguese": "Ovo"},
"Powerup Scale":
{"Spanish": "Tamaño del potenciador",
"English": "Powerups size",
"Portuguese": "Tamanho de powerups"},
"Powerup With Shield":
{"Spanish": "Potenciadores con escudo",
"English": "Powerups with shield",
"Portuguese": "Powerups com escudo"},
"Powerup Time":
{"Spanish": "Mostrar Temporizador",
"English": "Show end time",
"Portuguese": "Mostrar cronômetro"},
"Powerup Style":
{"Spanish": "Forma de los potenciadores",
"English": "Shape of powerup",
"Portuguese": "Forma de powerup"},
"Powerup Name":
{"Spanish": "Mostrar nombre en los potenciadores",
"English": "Show name on powerups",
"Portuguese": "Mostrar nome em powerups"},
"Percentage":
{"Spanish": "Probabilidad",
"English": "Show percentage",
"Portuguese": "Mostrar porcentagem"},
"Only Items":
{"Spanish": "Sólo Accesorios",
"English": "Only utensils",
"Portuguese": "Apenas utensilios"},
"New":
{"Spanish": "Nuevo",
"English": "New",
"Portuguese": "Novo"},
"Only Bombs":
{"Spanish": "Sólo Bombas",
"English": "Only bombs",
"Portuguese": "Apenas bombas"},
"Coins 0":
{"Spanish": "Monedas Insuficientes",
"English": "Insufficient coins",
"Portuguese": "Moedas insuficientes"},
"Purchase":
{"Spanish": "Compra realizada correctamente",
"English": "Successful purchase",
"Portuguese": "Compra Bem Sucedida"},
"Double Product":
{"Spanish": "Ya has comprado este artículo",
"English": "You've already bought this",
"Portuguese": "Voce ja comprou isto"},
"Bought":
{"Spanish": "Comprado",
"English": "Bought",
"Portuguese": "Comprou"},
"Confirm Purchase":
{
"Spanish": f'Tienes {subs} monedas. {_sp_} ¿Deseas comprar esto?',
"English": f'You have {subs} coins. {_sp_} Do you want to buy this?',
"Portuguese": f'Você tem {subs} moedas. {_sp_} Deseja comprar isto?'},
"FireBombs Store":
{"Spanish": 'Bombas de fuego',
"English": 'Fire bombs',
"Portuguese": 'Bombas de incêndio'},
"Timer Store":
{"Spanish": 'Temporizador',
"English": 'Timer',
"Portuguese": 'Timer'},
"Percentages Store":
{"Spanish": 'Extras',
"English": 'Extras',
"Portuguese": 'Extras'},
"Block Option Store":
{
"Spanish": f"Uuups..{_sp_}Esta opción está bloqueada.{_sp_} Para acceder a ella puedes {_sp_} comprarla en la tienda.{_sp_} Gracias...",
"English": f"Oooops...{_sp_}This option is blocked. {_sp_} To access it you can buy {_sp_} it in the store.{_sp_} Thank you...",
"Portuguese": f"Ooops...{_sp_}Esta opção está bloqueada. {_sp_} Para acessá-lo, você pode {_sp_} comprá-lo na loja.{_sp_} Obrigado..."},
"True Code":
{"Spanish": "¡Código canjeado!",
"English": "Successful code!",
"Portuguese": "¡Código válido!"},
"False Code":
{"Spanish": "Código ya canjeado",
"English": "Expired code",
"Portuguese": "Código expirado"},
"Invalid Code":
{"Spanish": "Código inválido",
"English": "Invalid code",
"Portuguese": "Código inválido"},
"Reward Code":
{"Spanish": f"¡Felicitaciones! ¡Ganaste {subs} monedas!",
"English": f"Congratulations! You've {subs} coins",
"Portuguese": f"Parabéns! Você tem {subs} moedas"},
"Creator":
{"Spanish": "Mod creado por @PatrónModz",
"English": "Mod created by @PatrónModz",
"Portuguese": "Mod creado by @PatrónModz"},
"Mod Info":
{
"Spanish": f"Un mod genial que te permite gestionar {_sp_} los potenciadores a tu antojo. {_sp_} también incluye 8 potenciadores extra{_sp_} dejando 17 en total... ¡Guay!",
"English": f"A cool mod that allows you to manage {_sp_} powerups at your whims. {_sp_} also includes 8 extra powerups{_sp_} leaving 17 in total... Wow!",
"Portuguese": f"Um mod legal que permite que você gerencie os{_sp_} powerups de de acordo com seus caprichos. {_sp_} também inclui 8 powerups extras,{_sp_} deixando 17 no total... Uau!"},
"Coins Message":
{"Spanish": f"Recompensa: {subs} Monedas",
"English": f"Reward: {subs} Coins",
"Portuguese": f"Recompensa: {subs} Moedas"},
"Coins Limit Message":
{
"Spanish": f"Ganaste {almacen[0]} Monedas.{_sp_} Pero has superado el límite de {almacen[1]}",
"English": f"You won {almacen[0]} Coins. {_sp_} But you have exceeded the limit of {almacen[1]}",
"Portuguese": f"Você ganhou {almacen[0]} Moedas. {_sp_} Mas você excedeu o limite de {almacen[1]}"},
}
languages = ['Spanish', 'Portuguese', 'English']
if lang not in languages: lang = 'English'
if text not in translate:
return text
return translate[text][lang]
import setting
settings = setting.get_settings_data()
def settings_distribution():
return settings["elPatronPowerups"]["settings"]
apg = babase.app.config
apg['PPM Settings'] = settings_distribution()
config = apg['PPM Settings']
def default_powerups():
return settings["elPatronPowerups"]["Quantity"]
config['Powerups'] = default_powerups()
powerups = config['Powerups']
# === EXTRAS ===
GLOBAL = {"Tab": 'Action 1',
"Cls Powerup": 0,
"Coins Message": []}
# === STORE ===
def promo_codes():
return {"G-Am54igO42Os": [True, 1100],
"P-tRo8nM8dZ": [True, 2800],
"Y-tU2B3S": [True, 500],
"B-0mB3RYT2z": [True, 910],
"B-Asd14mON9G0D": [True, 910],
"D-rAcK0cJ23": [True, 910],
"E-a27ZO6f3Y": [True, 600],
"E-Am54igO42Os": [True, 600],
"E-M4uN3K34XB": [True, 840],
"PM-731ClcAF": [True, 50000]}
def store_items():
return {"Buy Firebombs": False,
"Buy Option": False,
"Buy Percentage": False}
if apg.get('Bear Coin') is None:
apg['Bear Coin'] = 0
apg.apply_and_commit()
if apg.get('Bear Coin') is not None:
if apg['Bear Coin'] <= 0:
apg['Bear Coin'] = 0
apg['Bear Coin'] = int(apg['Bear Coin'])
if apg.get('Bear Store') is None:
apg['Bear Store'] = {}
for i, j in store_items().items():
store = apg['Bear Store']
if i not in store:
if store.get(i) is None:
store[i] = j
apg.apply_and_commit()
STORE = apg['Bear Store']
if STORE.get('Promo Code') is None:
STORE['Promo Code'] = promo_codes()
for i, x in promo_codes().items():
pmcode = STORE['Promo Code']
if i not in pmcode:
if pmcode.get(i) is None:
pmcode[i] = x
apg.apply_and_commit()
class BearStore:
def __init__(self,
price: int = 1000,
value: str = '',
callback: call = None):
self.price = price
self.value = value
self.store = STORE[value]
self.coins = apg['Bear Coin']
self.callback = callback
def buy(self):
if not self.store:
if self.coins >= (self.price):
def confirm():
STORE[self.value] = True
apg['Bear Coin'] -= int(self.price)
bs.broadcastmessage(getlanguage('Purchase'), (0, 1, 0))
bs.getsound('cashRegister').play()
apg.apply_and_commit()
self.callback()
ConfirmWindow(getlanguage('Confirm Purchase', subs=self.coins),
width=400, height=120, action=confirm,
ok_text=babase.Lstr(resource='okText'))
else:
bs.broadcastmessage(getlanguage('Coins 0'), (1, 0, 0))
bs.getsound('error').play()
else:
bs.broadcastmessage(getlanguage('Double Product'), (1, 0, 0))
bs.getsound('error').play()
def __del__(self):
apg['Bear Coin'] = int(apg['Bear Coin'])
apg.apply_and_commit()
class PromoCode:
def __init__(self, code: str = ''):
self.code = code
self.codes_store = STORE['Promo Code']
if self.code in self.codes_store:
self.code_type = STORE['Promo Code'][code]
self.promo_code_expire = self.code_type[0]
self.promo_code_amount = self.code_type[1]
def __del__(self):
apg['Bear Coin'] = int(apg['Bear Coin'])
apg.apply_and_commit()
def code_confirmation(self):
if self.code != "":
bs.broadcastmessage(
babase.Lstr(resource='submittingPromoCodeText'), (0, 1, 0))
bs.timer(2, babase.Call(self.validate_code))
def validate_code(self):
if self.code in self.codes_store:
if self.promo_code_expire:
bs.timer(1.5, babase.Call(self.successful_code))
bs.broadcastmessage(getlanguage('True Code'), (0, 1, 0))
bs.getsound('cheer').play()
self.code_type[0] = False
else:
bs.broadcastmessage(getlanguage('False Code'), (1, 0, 0))
bs.getsound('error').play()
else:
bs.broadcastmessage(getlanguage('Invalid Code'), (1, 0, 0))
bs.getsound('error').play()
def successful_code(self):
apg['Bear Coin'] += self.promo_code_amount
bs.broadcastmessage(getlanguage('Reward Code',
subs=self.promo_code_amount), (0, 1, 0))
bs.getsound('cashRegister2').play()
MainMenuActivity.super_transition_in = MainMenuActivity.on_transition_in
def new_on_transition_in(self):
self.super_transition_in()
limit = 8400
bear_coin = apg['Bear Coin']
coins_message = GLOBAL['Coins Message']
try:
if not (STORE['Buy Firebombs'] and
STORE['Buy Option'] and
STORE['Buy Percentage']):
if coins_message != []:
result = 0
for i in coins_message:
result += i
if not bear_coin >= (limit - 1):
bs.broadcastmessage(
getlanguage('Coins Message', subs=result), (0, 1, 0))
bs.getsound('cashRegister').play()
else:
bs.broadcastmessage(getlanguage('Coins Limit Message',
almacen=[result, limit]),
(1, 0, 0))
bs.getsound('error').play()
self.bear_coin_message = True
GLOBAL['Coins Message'] = []
except:
pass
SpazBot.super_handlemessage = SpazBot.handlemessage
def bot_handlemessage(self, msg: Any):
self.super_handlemessage(msg)
if isinstance(msg, bs.DieMessage):
if not self.die:
self.die = True
self.limit = 8400
self.free_coins = random.randint(1, 25)
self.bear_coins = apg['Bear Coin']
if not self.bear_coins >= (self.limit):
self.bear_coins += self.free_coins
GLOBAL['Coins Message'].append(self.free_coins)
if self.bear_coins >= (self.limit):
self.bear_coins = self.limit
apg['Bear Coin'] = int(self.bear_coins)
apg.apply_and_commit()
else:
GLOBAL['Coins Message'].append(self.free_coins)
def cls_pow_color():
return [(1, 0.1, 0.1), (0.1, 0.5, 0.9), (0.1, 0.9, 0.9),
(0.1, 0.9, 0.1), (0.1, 1, 0.5), (1, 1, 0.2), (2, 0.5, 0.5),
(1, 0, 6)]
def random_color():
a = random.random() * 3
b = random.random() * 3
c = random.random() * 3
return (a, b, c)
def powerup_dist():
return (('triple_bombs', powerups['Triple']),
('ice_bombs', powerups['Ice Bombs']),
('punch', powerups['Punch']),
('impact_bombs', powerups['Impact Bombs']),
('land_mines', powerups['Mine Bombs']),
('sticky_bombs', powerups['Sticky Bombs']),
('shield', powerups['Shield']),
('health', powerups['Health']),
('curse', powerups['Curse']),
('speed', powerups['Speed']),
('health_damage', powerups['Healing Damage']),
('goodbye', powerups['Goodbye']),
('ice_man', powerups['Ice Man']),
('tank_shield', powerups['Tank Shield']),
('impairment_bombs', powerups['Impairment Bombs']),
('fire_bombs', powerups['Fire Bombs']),
('fly_bombs', powerups['Fly Bombs']))
def percentage_tank_shield():
percentage = config['Tank Shield PTG']
percentage_text = ('0.') + str(percentage)
return float(percentage_text)
def percentage_health_damage():
percentage = config['Healing Damage PTG']
percentage_text = ('0.') + str(percentage)
return float(percentage_text)
# === Modify class ===
class NewProfileBrowserWindow(browser.ProfileBrowserWindow):
def __init__(self,
transition: str = 'in_right',
in_main_menu: bool = True,
selected_profile: str = None,
origin_widget: bui.Widget = None):
super().__init__(transition, in_main_menu, selected_profile,
origin_widget)
self.session = bs.get_foreground_host_session()
uiscale = bui.app.ui_v1.uiscale
width = (100 if uiscale is
babase.UIScale.SMALL else -14)
size = 50
position = (width * 1.65, 300)
if isinstance(self.session, MainMenuSession):
self.button = bui.buttonwidget(parent=self._root_widget,
autoselect=True, position=position,
size=(size, size),
button_type='square',
label='',
on_activate_call=babase.Call(
self.powerupmanager_window))
size = size * 0.60
self.image = bui.imagewidget(parent=self._root_widget,
size=(size, size),
draw_controller=self.button,
position=(
position[0] + 10.5, position[1] + 17),
texture=bs.gettexture('powerupSpeed'))
self.text = bui.textwidget(parent=self._root_widget,
position=(
position[0] + 25, position[1] + 10),
size=(0, 0), scale=0.45,
color=(0.7, 0.9, 0.7, 1.0),
draw_controller=self.button, maxwidth=60,
text=(f"Ultimate Powerup {_sp_}Manager"),
h_align='center', v_align='center')
def powerupmanager_window(self):
bui.containerwidget(edit=self._root_widget, transition='out_left')
PowerupManagerWindow()
class NewPowerupBoxFactory(pupbox.PowerupBoxFactory):
def __init__(self) -> None:
super().__init__()
self.tex_speed = bs.gettexture('powerupSpeed')
self.tex_health_damage = bs.gettexture('heart')
self.tex_goodbye = bs.gettexture('achievementOnslaught')
self.tex_ice_man = bs.gettexture('ouyaUButton')
self.tex_tank_shield = bs.gettexture('achievementSuperPunch')
self.tex_impairment_bombs = bs.gettexture('levelIcon')
self.tex_fire_bombs = bs.gettexture('ouyaOButton')
self.tex_fly_bombs = bs.gettexture('star')
self._powerupdist = []
for powerup, freq in powerup_dist():
for _i in range(int(freq)):
self._powerupdist.append(powerup)
def get_random_powerup_type(self, forcetype=None, excludetypes=None):
try:
self.mapa = bs.getactivity()._map.getname()
except:
self.mapa = None
speed_banned_maps = ['Hockey Stadium', 'Lake Frigid', 'Happy Thoughts']
if self.mapa in speed_banned_maps:
powerup_disable = ['speed']
else:
powerup_disable = []
if excludetypes is None:
excludetypes = []
if forcetype:
ptype = forcetype
else:
if self._lastpoweruptype == 'curse':
ptype = 'health'
else:
while True:
ptype = self._powerupdist[random.randint(
0,
len(self._powerupdist) - 1)]
if ptype not in excludetypes and ptype not in powerup_disable: break
self._lastpoweruptype = ptype
return ptype
def fire_effect(self):
if self.node.exists():
bs.emitfx(position=self.node.position,
scale=3, count=50 * 2, spread=0.3,
chunk_type='sweat')
else:
self.fire_effect_time = None
###########BOMBS
Bomb._pm_old_bomb = Bomb.__init__
def _bomb_init(self,
position: Sequence[float] = (0.0, 1.0, 0.0),
velocity: Sequence[float] = (0.0, 0.0, 0.0),
bomb_type: str = 'normal',
blast_radius: float = 2.0,
bomb_scale: float = 1.0,
source_player: bs.Player = None,
owner: bs.Node = None):
self.bm_type = bomb_type
new_bomb_type = bomb_type
bombs = ['ice_bubble', 'impairment', 'fire', 'fly']
if bomb_type in bombs:
new_bomb_type = 'ice'
self._pm_old_bomb(position, velocity, new_bomb_type, blast_radius,
bomb_scale, source_player, owner)
tex = self.node.color_texture
if self.bm_type == 'ice_bubble':
self.bomb_type = self.bm_type
self.node.mesh = None
self.shield_ice = bs.newnode('shield', owner=self.node,
attrs={'color': (0.5, 1.0, 7.0),
'radius': 0.6})
self.node.connectattr('position', self.shield_ice, 'position')
elif self.bm_type == 'fire':
self.bomb_type = self.bm_type
self.node.mesh = None
self.shield_fire = bs.newnode('shield', owner=self.node,
attrs={'color': (6.5, 6.5, 2.0),
'radius': 0.6})
self.node.connectattr('position', self.shield_fire, 'position')
self.fire_effect_time = bs.Timer(0.1, babase.Call(fire_effect, self),
repeat=True)
elif self.bm_type == 'impairment':
self.bomb_type = self.bm_type
tex = bs.gettexture('eggTex3')
elif self.bm_type == 'fly':
self.bomb_type = self.bm_type
tex = bs.gettexture('eggTex1')
self.node.color_texture = tex
self.hit_subtype = self.bomb_type
if self.bomb_type == 'ice_bubble':
self.blast_radius *= 1.2
elif self.bomb_type == 'fly':
self.blast_radius *= 2.2
def bomb_handlemessage(self, msg: Any) -> Any:
assert not self.expired
if isinstance(msg, bs.DieMessage):
if self.node:
self.node.delete()
elif isinstance(msg, bomb.ExplodeHitMessage):
node = bs.getcollision().opposingnode
assert self.node
nodepos = self.node.position
mag = 2000.0
if self.blast_type in ('ice', 'ice_bubble'):
mag *= 0.5
elif self.blast_type == 'land_mine':
mag *= 2.5
elif self.blast_type == 'tnt':
mag *= 2.0
elif self.blast_type == 'fire':
mag *= 0.6
elif self.blast_type == 'fly':
mag *= 5.5
node.handlemessage(
bs.HitMessage(pos=nodepos,
velocity=(0, 0, 0),
magnitude=mag,
hit_type=self.hit_type,
hit_subtype=self.hit_subtype,
radius=self.radius,
source_player=babase.existing(self._source_player)))
if self.blast_type in ('ice', 'ice_bubble'):
bomb.BombFactory.get().freeze_sound.play(10, position=nodepos)
node.handlemessage(bs.FreezeMessage())
return None
def powerup_translated(self, type: str):
powerups_names = {'triple_bombs': babase.Lstr(
resource='helpWindow.' + 'powerupBombNameText'),
'ice_bombs': babase.Lstr(
resource='helpWindow.' + 'powerupIceBombsNameText'),
'punch': babase.Lstr(
resource='helpWindow.' + 'powerupPunchNameText'),
'impact_bombs': babase.Lstr(
resource='helpWindow.' + 'powerupImpactBombsNameText'),
'land_mines': babase.Lstr(
resource='helpWindow.' + 'powerupLandMinesNameText'),
'sticky_bombs': babase.Lstr(
resource='helpWindow.' + 'powerupStickyBombsNameText'),
'shield': babase.Lstr(
resource='helpWindow.' + 'powerupShieldNameText'),
'health': babase.Lstr(
resource='helpWindow.' + 'powerupHealthNameText'),
'curse': babase.Lstr(
resource='helpWindow.' + 'powerupCurseNameText'),
'speed': getlanguage('Speed'),
'health_damage': getlanguage('Healing Damage'),
'goodbye': getlanguage('Goodbye'),
'ice_man': getlanguage('Ice Man'),
'tank_shield': getlanguage('Tank Shield'),
'impairment_bombs': getlanguage('Impairment Bombs'),
'fire_bombs': getlanguage('Fire Bombs'),
'fly_bombs': getlanguage('Fly Bombs')}
self.texts['Name'].text = powerups_names[type]
###########POWERUP
pupbox.PowerupBox._old_pbx_ = pupbox.PowerupBox.__init__
def _pbx_(self, position: Sequence[float] = (0.0, 1.0, 0.0),
poweruptype: str = 'triple_bombs',
expire: bool = True):
self.news: list = []
for x, i in powerup_dist(): self.news.append(x)
self.box: list = []
self.texts = {}
self.news = self.news[9:]
self.box.append(poweruptype)
self.npowerup = self.box[0]
factory = NewPowerupBoxFactory.get()
if self.npowerup in self.news:
new_poweruptype = 'shield'
else:
new_poweruptype = poweruptype
self._old_pbx_(position, new_poweruptype, expire)
type = new_poweruptype
tex = self.node.color_texture
mesh = self.node.mesh
if self.npowerup == 'speed':
type = self.npowerup
tex = factory.tex_speed
elif self.npowerup == 'health_damage':
type = self.npowerup
tex = factory.tex_health_damage
elif self.npowerup == 'goodbye':
type = self.npowerup
tex = factory.tex_goodbye
elif self.npowerup == 'ice_man':
type = self.npowerup
tex = factory.tex_ice_man
elif self.npowerup == 'tank_shield':
type = self.npowerup
tex = factory.tex_tank_shield
elif self.npowerup == 'impairment_bombs':
type = self.npowerup
tex = factory.tex_impairment_bombs
elif self.npowerup == 'fire_bombs':
type = self.npowerup
tex = factory.tex_fire_bombs
elif self.npowerup == 'fly_bombs':
type = self.npowerup
tex = factory.tex_fly_bombs
self.poweruptype = type
self.node.mesh = mesh
self.node.color_texture = tex
n_scale = config['Powerup Scale']
style = config['Powerup Style']
curve = bs.animate(self.node, 'mesh_scale', {0: 0, 0.14: 1.6, 0.2: n_scale})
bs.timer(0.2, curve.delete)
def util_text(type: str, text: str, scale: float = 1,
color: list = [1, 1, 1],
position: list = [0, 0.7, 0], colors_name: bool = False):
m = bs.newnode('math', owner=self.node, attrs={'input1':
(position[0],
position[1],
position[2]),
'operation': 'add'})
self.node.connectattr('position', m, 'input2')
self.texts[type] = bs.newnode('text', owner=self.node,
attrs={'text': str(text),
'in_world': True,
'scale': 0.02,
'shadow': 0.5,
'flatness': 1.0,
'color': (
color[0], color[1], color[2]),
'h_align': 'center'})
m.connectattr('output', self.texts[type], 'position')
bs.animate(self.texts[type], 'scale',
{0: 0.017, 0.4: 0.017, 0.5: 0.01 * scale})
if colors_name:
bs.animate_array(self.texts[type], 'color', 3,
{0: (1, 0, 0),
0.2: (1, 0.5, 0),
0.4: (1, 1, 0),
0.6: (0, 1, 0),
0.8: (0, 1, 1),
1.0: (1, 0, 1),
1.2: (1, 0, 0)}, True)
def update_time(time):
if self.texts['Time'].exists():
self.texts['Time'].text = str(time)
if config['Powerup Time']:
interval = int(pupbox.DEFAULT_POWERUP_INTERVAL)
time2 = (interval - 1)
time = 1
util_text('Time', time2, scale=1.5, color=(2, 2, 2),
position=[0, 0.9, 0], colors_name=False)
while (interval + 3):
bs.timer(time - 1, babase.Call(update_time, f'{time2}s'))
if time2 == 0:
break
time += 1
time2 -= 1
if config['Powerup With Shield']:
scale = config['Powerup Scale']
self.shield = bs.newnode('shield', owner=self.node,
attrs={'color': (1, 1, 0),
'radius': 1.3 * scale})
self.node.connectattr('position', self.shield, 'position')
bs.animate_array(self.shield, 'color', 3,
{0: (2, 0, 0), 0.5: (0, 2, 0), 1: (0, 1, 6),
1.5: (2, 0, 0)}, True)
if config['Powerup Name']:
util_text('Name', self.poweruptype, scale=1.2,
position=[0, 0.4, 0], colors_name=True)
powerup_translated(self, self.poweruptype)
if style == 'SY: BALL':
self.node.mesh = bs.getmesh('frostyPelvis')
elif style == 'SY: Impact':
self.node.mesh = bs.getmesh('impactBomb')
elif style == 'SY: Egg':
self.node.mesh = bs.getmesh('egg')
###########SPAZ
def _speed_off_flash(self):
if self.node:
factory = NewPowerupBoxFactory.get()
self.node.billboard_texture = factory.tex_speed
self.node.billboard_opacity = 1.0
self.node.billboard_cross_out = True
def _speed_wear_off(self):
if self.node:
self.node.hockey = False
self.node.billboard_opacity = 0.0
bs.getsound('powerdown01').play()
def _ice_man_off_flash(self):
if self.node:
factory = NewPowerupBoxFactory.get()
self.node.billboard_texture = factory.tex_ice_man
self.node.billboard_opacity = 1.0
self.node.billboard_cross_out = True
def _ice_man_wear_off(self):
if self.node:
f = self.color[0]
i = (0, 1, 4)
bomb = self.bmb_color[0]
if bomb != 'ice_bubble':
self.bomb_type = bomb
else:
self.bomb_type = 'normal'
self.freeze_punch = False
self.node.billboard_opacity = 0.0
bs.animate_array(self.node, 'color', 3, {0: f, 0.3: i, 0.6: f})
bs.getsound('powerdown01').play()
Spaz._pm2_spz_old = Spaz.__init__
def _init_spaz_(self, *args, **kwargs):
self._pm2_spz_old(*args, **kwargs)
self.edg_eff = False
self.kill_eff = False
self.freeze_punch = False
self.die = False
self.color: list = []
self.color.append(self.node.color)
self.tankshield = {"Tank": False,
"Reduction": False,
"Shield": None}
Spaz._super_on_punch_press = Spaz.on_punch_press
def spaz_on_punch_press(self) -> None:
self._super_on_punch_press()
if self.tankshield['Tank']:
try:
self.tankshield['Reduction'] = True
shield = bs.newnode('shield', owner=self.node,
attrs={'color': (4, 1, 4), 'radius': 1.3})
self.node.connectattr('position_center', shield, 'position')
self.tankshield['Shield'] = shield
except:
pass
Spaz._super_on_punch_release = Spaz.on_punch_release
def spaz_on_punch_release(self) -> None:
self._super_on_punch_release()
try:
self.tankshield['Shield'].delete()
self.tankshield['Reduction'] = False
except:
pass
def new_get_bomb_type_tex(self):
factory = NewPowerupBoxFactory.get()
if self.bomb_type == 'sticky':
return factory.tex_sticky_bombs
if self.bomb_type == 'ice':
return factory.tex_ice_bombs
if self.bomb_type == 'impact':
return factory.tex_impact_bombs
if self.bomb_type == 'impairment':
return factory.tex_impairment_bombs
if self.bomb_type == 'fire':
return factory.tex_fire_bombs
if self.bomb_type == 'fly':
return factory.tex_fly_bombs
return factory.tex_impact_bombs
# raise ValueError('invalid bomb type')
def new_handlemessage(self, msg: Any) -> Any:
assert not self.expired
if isinstance(msg, bs.PickedUpMessage):
if self.node:
self.node.handlemessage('hurt_sound')
self.node.handlemessage('picked_up')
self._num_times_hit += 1
elif isinstance(msg, bs.ShouldShatterMessage):
bs.timer(0.001, babase.Call(self.shatter))
elif isinstance(msg, bs.ImpactDamageMessage):
bs.timer(0.001, babase.Call(self._hit_self, msg.intensity))
elif isinstance(msg, bs.PowerupMessage):
factory = NewPowerupBoxFactory.get()
if self._dead or not self.node:
return True
if self.pick_up_powerup_callback is not None:
self.pick_up_powerup_callback(self)
if msg.poweruptype == 'triple_bombs':
tex = PowerupBoxFactory.get().tex_bomb
self._flash_billboard(tex)
self.set_bomb_count(3)
if self.powerups_expire:
self.node.mini_billboard_1_texture = tex
t_ms = int(bs.time() * 1000)
assert isinstance(t_ms, int)
self.node.mini_billboard_1_start_time = t_ms
self.node.mini_billboard_1_end_time = (
t_ms + POWERUP_WEAR_OFF_TIME)
self._multi_bomb_wear_off_timer = (bs.Timer(
(POWERUP_WEAR_OFF_TIME - 2000),
babase.Call(self._multi_bomb_wear_off_flash)))
self._multi_bomb_wear_off_timer = (bs.Timer(
POWERUP_WEAR_OFF_TIME,
babase.Call(self._multi_bomb_wear_off)))
elif msg.poweruptype == 'land_mines':
self.set_land_mine_count(min(self.land_mine_count + 3, 3))
elif msg.poweruptype == 'impact_bombs':
self.bomb_type = 'impact'
tex = self._get_bomb_type_tex()
self._flash_billboard(tex)
if self.powerups_expire:
self.node.mini_billboard_2_texture = tex
t_ms = int(bs.time() * 1000)
assert isinstance(t_ms, int)
self.node.mini_billboard_2_start_time = t_ms
self.node.mini_billboard_2_end_time = (
t_ms + POWERUP_WEAR_OFF_TIME)
self._bomb_wear_off_flash_timer = (bs.Timer(
POWERUP_WEAR_OFF_TIME - 2000,
babase.Call(self._bomb_wear_off_flash)))
self._bomb_wear_off_timer = (bs.Timer(
POWERUP_WEAR_OFF_TIME,
babase.Call(self._bomb_wear_off)))
elif msg.poweruptype == 'sticky_bombs':
self.bomb_type = 'sticky'
tex = self._get_bomb_type_tex()
self._flash_billboard(tex)
if self.powerups_expire:
self.node.mini_billboard_2_texture = tex
t_ms = int(bs.time() * 1000)
assert isinstance(t_ms, int)
self.node.mini_billboard_2_start_time = t_ms
self.node.mini_billboard_2_end_time = (
t_ms + POWERUP_WEAR_OFF_TIME)
self._bomb_wear_off_flash_timer = (bs.Timer(
POWERUP_WEAR_OFF_TIME - 2000,
babase.Call(self._bomb_wear_off_flash)))
self._bomb_wear_off_timer = (bs.Timer(
POWERUP_WEAR_OFF_TIME,
babase.Call(self._bomb_wear_off)))
elif msg.poweruptype == 'punch':
self._has_boxing_gloves = True
tex = PowerupBoxFactory.get().tex_punch
self._flash_billboard(tex)
self.equip_boxing_gloves()
if self.powerups_expire:
self.node.boxing_gloves_flashing = False
self.node.mini_billboard_3_texture = tex
t_ms = int(bs.time() * 1000)
assert isinstance(t_ms, int)
self.node.mini_billboard_3_start_time = t_ms
self.node.mini_billboard_3_end_time = (
t_ms + POWERUP_WEAR_OFF_TIME)
self._boxing_gloves_wear_off_flash_timer = (bs.Timer(
POWERUP_WEAR_OFF_TIME - 2000,
bs.WeakCall(self._gloves_wear_off_flash)))
self._boxing_gloves_wear_off_timer = (bs.Timer(
POWERUP_WEAR_OFF_TIME,
bs.WeakCall(self._gloves_wear_off),))
elif msg.poweruptype == 'shield':
factory = SpazFactory.get()
self.equip_shields(decay=factory.shield_decay_rate > 0)
elif msg.poweruptype == 'curse':
self.curse()
elif msg.poweruptype == 'ice_bombs':
self.bomb_type = 'ice'
tex = self._get_bomb_type_tex()
self._flash_billboard(tex)
if self.powerups_expire:
self.node.mini_billboard_2_texture = tex
t_ms = int(bs.time() * 1000)
assert isinstance(t_ms, int)
self.node.mini_billboard_2_start_time = t_ms
self.node.mini_billboard_2_end_time = (
t_ms + POWERUP_WEAR_OFF_TIME)
self._bomb_wear_off_flash_timer = (bs.Timer(
POWERUP_WEAR_OFF_TIME - 2000,
bs.WeakCall(self._bomb_wear_off_flash)))
self._bomb_wear_off_timer = (bs.Timer(
POWERUP_WEAR_OFF_TIME,
bs.WeakCall(self._bomb_wear_off)))
elif msg.poweruptype == 'health':
if self.edg_eff:
f = self.color[0]
r = (2, 0, 0)
g = (0, 2, 0)
bs.animate_array(self.node, 'color', 3, {0: r, 0.6: g, 1.0: f})
self.edg_eff = False
if self._cursed:
self._cursed = False
factory = SpazFactory.get()
for attr in ['materials', 'roller_materials']:
materials = getattr(self.node, attr)
if factory.curse_material in materials:
setattr(
self.node, attr,
tuple(m for m in materials
if m != factory.curse_material))
self.node.curse_death_time = 0
self.hitpoints = self.hitpoints_max
self._flash_billboard(PowerupBoxFactory.get().tex_health)
self.node.hurt = 0
self._last_hit_time = None
self._num_times_hit = 0
elif msg.poweruptype == 'tank_shield':
self.tankshield['Tank'] = True
self.edg_eff = False
tex = factory.tex_tank_shield
self._flash_billboard(tex)
elif msg.poweruptype == 'health_damage':
tex = factory.tex_health_damage
self.edg_eff = True
f = self.color[0]
i = (2, 0.5, 2)
bs.animate_array(self.node, 'color', 3, {0: i, 0.5: i, 0.6: f})
self._flash_billboard(tex)
self.tankshield['Tank'] = False
self.freeze_punch = False
elif msg.poweruptype == 'goodbye':
tex = factory.tex_goodbye
self._flash_billboard(tex)
self.kill_eff = True
elif msg.poweruptype == 'fly_bombs':
self.bomb_type = 'fly'
tex = self._get_bomb_type_tex()
self._flash_billboard(tex)
if self.powerups_expire:
self.node.mini_billboard_2_texture = tex
t_ms = int(bs.time() * 1000)
assert isinstance(t_ms, int)
self.node.mini_billboard_2_start_time = t_ms
self.node.mini_billboard_2_end_time = (
t_ms + POWERUP_WEAR_OFF_TIME)
self._bomb_wear_off_flash_timer = (bs.Timer(
POWERUP_WEAR_OFF_TIME - 2000,
bs.WeakCall(self._bomb_wear_off_flash)))
self._bomb_wear_off_timer = (bs.Timer(
POWERUP_WEAR_OFF_TIME,
bs.WeakCall(self._bomb_wear_off)))
elif msg.poweruptype == 'fire_bombs':
self.bomb_type = 'fire'
tex = self._get_bomb_type_tex()
self._flash_billboard(tex)
if self.powerups_expire:
self.node.mini_billboard_2_texture = tex
t_ms = int(bs.time() * 1000)
assert isinstance(t_ms, int)
self.node.mini_billboard_2_start_time = t_ms
self.node.mini_billboard_2_end_time = (
t_ms + POWERUP_WEAR_OFF_TIME)
self._bomb_wear_off_flash_timer = (bs.Timer(
POWERUP_WEAR_OFF_TIME - 2000,
bs.WeakCall(self._bomb_wear_off_flash)))
self._bomb_wear_off_timer = (bs.Timer(
POWERUP_WEAR_OFF_TIME,
bs.WeakCall(self._bomb_wear_off)))
elif msg.poweruptype == 'impairment_bombs':
self.bomb_type = 'impairment'
tex = self._get_bomb_type_tex()
self._flash_billboard(tex)
if self.powerups_expire:
self.node.mini_billboard_2_texture = tex
t_ms = int(bs.time() * 1000)
assert isinstance(t_ms, int)
self.node.mini_billboard_2_start_time = t_ms
self.node.mini_billboard_2_end_time = (
t_ms + POWERUP_WEAR_OFF_TIME)
self._bomb_wear_off_flash_timer = (bs.Timer(
POWERUP_WEAR_OFF_TIME - 2000,
bs.WeakCall(self._bomb_wear_off_flash)))
self._bomb_wear_off_timer = (bs.Timer(
POWERUP_WEAR_OFF_TIME,
bs.WeakCall(self._bomb_wear_off)))
elif msg.poweruptype == 'ice_man':
tex = factory.tex_ice_man
self.bomb_type = 'ice_bubble'
self.freeze_punch = True
self.edg_eff = False
self.node.color = (0, 1, 4)
self._flash_billboard(tex)
if self.powerups_expire:
ice_man_time = 17000
self.node.mini_billboard_2_texture = tex
t_ms = int(bs.time() * 1000)
assert isinstance(t_ms, int)
self.node.mini_billboard_2_start_time = t_ms
self.node.mini_billboard_2_end_time = (t_ms + ice_man_time)
self.ice_man_flash_timer = (bs.Timer(
ice_man_time - 2000,
babase.Call(_ice_man_off_flash, self)))
self.ice_man_timer = (bs.Timer(ice_man_time,
babase.Call(_ice_man_wear_off,
self)))
elif msg.poweruptype == 'speed':
self.node.hockey = True
tex = factory.tex_speed
self._flash_billboard(tex)
if self.powerups_expire:
speed_time = 15000
self.node.mini_billboard_2_texture = tex
t_ms = int(bs.time() * 1000)
assert isinstance(t_ms, int)
self.node.mini_billboard_2_start_time = t_ms
self.node.mini_billboard_2_end_time = (t_ms + speed_time)
self.speed_flash_timer = (bs.Timer(
speed_time - 2000,
babase.Call(_speed_off_flash, self)))
self.speed_timer = (bs.apptimer(speed_time,
babase.Call(_speed_wear_off,
self)))
self.bmb_color: list = []
self.bmb_color.append(self.bomb_type)
self.node.handlemessage('flash')
if msg.sourcenode:
msg.sourcenode.handlemessage(bs.PowerupAcceptMessage())
return True
elif isinstance(msg, bs.FreezeMessage):
if not self.node:
return None
if self.node.invincible:
SpazFactory.get().block_sound.play(1.0, position=self.node.position)
return None
if self.shield:
return None
if not self.frozen:
self.frozen = True
self.node.frozen = True
bs.timer(5.0, babase.Call(self.handlemessage,
bs.ThawMessage()))
if self.hitpoints <= 0:
self.shatter()
if self.freeze_punch:
self.handlemessage(bs.ThawMessage())
elif isinstance(msg, bs.ThawMessage):
if self.frozen and not self.shattered and self.node:
self.frozen = False
self.node.frozen = False
elif isinstance(msg, bs.HitMessage):
if not self.node:
return None
if self.node.invincible:
SpazFactory.get().block_sound.play(1.0, position=self.node.position)
return True
local_time = int(bs.time() * 1000)
assert isinstance(local_time, int)
if (self._last_hit_time is None
or local_time - self._last_hit_time > 1000):
self._num_times_hit += 1
self._last_hit_time = local_time
mag = msg.magnitude * self.impact_scale
velocity_mag = msg.velocity_magnitude * self.impact_scale
damage_scale = 0.22
def fire_effect():
if not self.shield:
if self.node.exists():
bs.emitfx(position=self.node.position,
scale=3, count=50 * 2, spread=0.3,
chunk_type='sweat')
self.node.handlemessage('celebrate', 560)
else:
self._fire_time = None
else:
self._fire_time = None
def fire(time, damage):
if not self.shield and not self._dead:
self.hitpoints -= damage
bs.show_damage_count(f'-{damage}HP',
self.node.position,
msg.force_direction)
bs.getsound('fuse01').play()
if duration != time:
self._fire_time = bs.Timer(0.1, babase.Call(fire_effect),
repeat=True)
else:
self._fire_time = None
if self.hitpoints < 0:
self.node.handlemessage(bs.DieMessage())
if msg.hit_subtype == 'fly':
damage_scale = 0.0
if self.shield:
self.shield_hitpoints -= 300
if self.shield_hitpoints < 0:
self.shield.delete()
self.shield = None
SpazFactory.get().shield_down_sound.play(1.0,
position=self.node.position)
elif msg.hit_subtype == 'fire':
index = 1
duration = 5
damage = 103
if not self.shield:
for firex in range(duration):
bs.timer(index, babase.Call(fire, index, damage))
self._fire_time = bs.Timer(0.1, babase.Call(fire_effect),
repeat=True)
index += 1
else:
self.shield_hitpoints -= 80
if self.shield_hitpoints < 1:
self.shield.delete()
self.shield = None
SpazFactory.get().shield_down_sound.play(1.0,
position=self.node.position)
elif msg.hit_subtype == 'impairment':
damage_scale = 0
if self.shield:
self.shield.delete()
self.shield = None
SpazFactory.get().shield_down_sound.play(1.0,
position=self.node.position)
else:
hitpoints = int(self.hitpoints * 0.80)
self.hitpoints -= int(hitpoints)
bs.show_damage_count((f'-{int(hitpoints / 10)}%'),
self.node.position,
msg.force_direction)
if self.hitpoints < 0 or hitpoints < 95:
self.node.handlemessage(bs.DieMessage())
if self.shield:
if msg.flat_damage:
damage = msg.flat_damage * self.impact_scale
else:
assert msg.force_direction is not None
self.node.handlemessage(
'impulse', msg.pos[0], msg.pos[1], msg.pos[2],
msg.velocity[0], msg.velocity[1], msg.velocity[2], mag,
velocity_mag, msg.radius, 1, msg.force_direction[0],
msg.force_direction[1], msg.force_direction[2])
damage = damage_scale * self.node.damage
assert self.shield_hitpoints is not None
self.shield_hitpoints -= int(damage)
self.shield.hurt = (
1.0 -
float(self.shield_hitpoints) / self.shield_hitpoints_max)
max_spillover = SpazFactory.get().max_shield_spillover_damage
if self.shield_hitpoints <= 0:
self.shield.delete()
self.shield = None
SpazFactory.get().shield_down_sound.play(1.0,
position=self.node.position)
npos = self.node.position
bs.emitfx(position=(npos[0], npos[1] + 0.9, npos[2]),
velocity=self.node.velocity,
count=random.randrange(20, 30),
scale=1.0,
spread=0.6,
chunk_type='spark')
else:
SpazFactory.get().shield_hit_sound.play(0.5,
position=self.node.position)
assert msg.force_direction is not None
bs.emitfx(position=msg.pos,
velocity=(msg.force_direction[0] * 1.0,
msg.force_direction[1] * 1.0,
msg.force_direction[2] * 1.0),
count=min(30, 5 + int(damage * 0.005)),
scale=0.5,
spread=0.3,
chunk_type='spark')
if self.shield_hitpoints <= -max_spillover:
leftover_damage = -max_spillover - self.shield_hitpoints
shield_leftover_ratio = leftover_damage / damage
mag *= shield_leftover_ratio
velocity_mag *= shield_leftover_ratio
else:
return True
else:
shield_leftover_ratio = 1.0
if msg.flat_damage:
damage = int(msg.flat_damage * self.impact_scale *
shield_leftover_ratio)
else:
assert msg.force_direction is not None
self.node.handlemessage(
'impulse', msg.pos[0], msg.pos[1], msg.pos[2],
msg.velocity[0], msg.velocity[1], msg.velocity[2], mag,
velocity_mag, msg.radius, 0, msg.force_direction[0],
msg.force_direction[1], msg.force_direction[2])
damage = int(damage_scale * self.node.damage)
if self.tankshield['Reduction']:
porcentaje = percentage_tank_shield()
dism = int(damage * porcentaje)
damage = int(damage - dism)
bs.show_damage_count('-' + str(int(damage / 10)) + '%',
msg.pos, msg.force_direction)
self.node.handlemessage('hurt_sound')
if self.edg_eff:
porcentaje = percentage_health_damage()
dmg_dism = int(damage * porcentaje)
self.hitpoints += dmg_dism
PopupText(text=f'+{int(dmg_dism / 10)}%', scale=1.5,
position=self.node.position, color=(0, 1, 0)).autoretain()
bs.animate_array(self.node, 'color', 3,
{0: (0, 1, 0), 0.39: (0, 2, 0),
0.4: self.color[0]})
bs.getsound('healthPowerup').play()
if msg.hit_type == 'punch':
self.on_punched(damage)
try:
if msg.get_source_player(bs.Player).actor.freeze_punch:
self.node.color = (0, 1, 4)
bs.getsound('freeze').play()
self.node.handlemessage(bs.FreezeMessage())
except:
pass
if damage > 350:
assert msg.force_direction is not None
bs.show_damage_count('-' + str(int(damage / 10)) + '%',
msg.pos, msg.force_direction)
if msg.hit_subtype == 'super_punch':
SpazFactory.get().punch_sound_stronger.play(1.0,
position=self.node.position)
if damage > 500:
sounds = SpazFactory.get().punch_sound_strong
sound = sounds[random.randrange(len(sounds))]
else:
sound = SpazFactory.get().punch_sound
sound.play(1.0, position=self.node.position)
assert msg.force_direction is not None
bs.emitfx(position=msg.pos,
velocity=(msg.force_direction[0] * 0.5,
msg.force_direction[1] * 0.5,
msg.force_direction[2] * 0.5),
count=min(10, 1 + int(damage * 0.0025)),
scale=0.3,
spread=0.03)
bs.emitfx(position=msg.pos,
chunk_type='sweat',
velocity=(msg.force_direction[0] * 1.3,
msg.force_direction[1] * 1.3 + 5.0,
msg.force_direction[2] * 1.3),
count=min(30, 1 + int(damage * 0.04)),
scale=0.9,
spread=0.28)
hurtiness = damage * 0.003
punchpos = (msg.pos[0] + msg.force_direction[0] * 0.02,
msg.pos[1] + msg.force_direction[1] * 0.02,
msg.pos[2] + msg.force_direction[2] * 0.02)
flash_color = (1.0, 0.8, 0.4)
light = bs.newnode(
'light',
attrs={
'position': punchpos,
'radius': 0.12 + hurtiness * 0.12,
'intensity': 0.3 * (1.0 + 1.0 * hurtiness),
'height_attenuated': False,
'color': flash_color
})
bs.timer(0.06, light.delete)
flash = bs.newnode('flash',
attrs={
'position': punchpos,
'size': 0.17 + 0.17 * hurtiness,
'color': flash_color
})
bs.timer(0.06, flash.delete)
if msg.hit_type == 'impact':
assert msg.force_direction is not None
bs.emitfx(position=msg.pos,
velocity=(msg.force_direction[0] * 2.0,
msg.force_direction[1] * 2.0,
msg.force_direction[2] * 2.0),
count=min(10, 1 + int(damage * 0.01)),
scale=0.4,
spread=0.1)
if self.hitpoints > 0:
if msg.hit_type == 'impact' and damage > self.hitpoints:
newdamage = max(damage - 200, self.hitpoints - 10)
damage = newdamage
self.node.handlemessage('flash')
if damage > 0.0 and self.node.hold_node:
self.node.hold_node = None
self.hitpoints -= damage
self.node.hurt = 1.0 - float(
self.hitpoints) / self.hitpoints_max
if self._cursed and damage > 0:
bs.timer(
0.05,
babase.Call(self.curse_explode,
msg.get_source_player(bs.Player)))
if self.frozen and (damage > 200 or self.hitpoints <= 0):
self.shatter()
elif self.hitpoints <= 0:
self.node.handlemessage(
bs.DieMessage(how=bs.DeathType.IMPACT))
if self.hitpoints <= 0:
damage_avg = self.node.damage_smoothed * damage_scale
if damage_avg > 1000:
self.shatter()
elif isinstance(msg, BombDiedMessage):
self.bomb_count += 1
elif isinstance(msg, bs.DieMessage):
def drop_bomb():
for xbomb in range(3):
p = self.node.position
pos = (p[0] + xbomb, p[1] + 5, p[2] - xbomb)
ball = bomb.Bomb(position=pos, bomb_type='impact').autoretain()
ball.node.mesh_scale = 0.6
ball.node.mesh = bs.getmesh('egg')
ball.node.gravity_scale = 2
if self.edg_eff:
self.edg_eff = False
wasdead = self._dead
self._dead = True
self.hitpoints = 0
if msg.immediate:
if self.node:
self.node.delete()
elif self.node:
self.node.hurt = 1.0
if self.play_big_death_sound and not wasdead:
SpazFactory.get().single_player_death_sound.play()
self.node.dead = True
bs.timer(2.0, self.node.delete)
t = 0
if self.kill_eff:
for bombs in range(3):
bs.timer(t, babase.Call(drop_bomb))
t += 0.15
self.kill_eff = False
elif isinstance(msg, bs.OutOfBoundsMessage):
self.handlemessage(bs.DieMessage(how=bs.DeathType.FALL))
elif isinstance(msg, bs.StandMessage):
self._last_stand_pos = (msg.position[0], msg.position[1],
msg.position[2])
if self.node:
self.node.handlemessage('stand', msg.position[0],
msg.position[1], msg.position[2],
msg.angle)
elif isinstance(msg, CurseExplodeMessage):
self.curse_explode()
elif isinstance(msg, PunchHitMessage):
if not self.node:
return None
node = bs.getcollision().opposingnode
if node and (node not in self._punched_nodes):
punch_momentum_angular = (self.node.punch_momentum_angular *
self._punch_power_scale)
punch_power = self.node.punch_power * self._punch_power_scale
if node.getnodetype() != 'spaz':
sounds = SpazFactory.get().impact_sounds_medium
sound = sounds[random.randrange(len(sounds))]
sound.play(1.0, position=self.node.position)
ppos = self.node.punch_position
punchdir = self.node.punch_velocity
vel = self.node.punch_momentum_linear
self._punched_nodes.add(node)
node.handlemessage(
bs.HitMessage(
pos=ppos,
velocity=vel,
magnitude=punch_power * punch_momentum_angular * 110.0,
velocity_magnitude=punch_power * 40,
radius=0,
srcnode=self.node,
source_player=self.source_player,
force_direction=punchdir,
hit_type='punch',
hit_subtype=('super_punch' if self._has_boxing_gloves
else 'default')))
mag = -400.0
if self._hockey:
mag *= 0.5
if len(self._punched_nodes) == 1:
self.node.handlemessage('kick_back', ppos[0], ppos[1],
ppos[2], punchdir[0], punchdir[1],
punchdir[2], mag)
elif isinstance(msg, PickupMessage):
if not self.node:
return None
try:
collision = bs.getcollision()
opposingnode = collision.opposingnode
opposingbody = collision.opposingbody
except bs.NotFoundError:
return True
try:
if opposingnode.invincible:
return True
except Exception:
pass
if (opposingnode.getnodetype() == 'spaz'
and not opposingnode.shattered and opposingbody == 4):
opposingbody = 1
held = self.node.hold_node
if held and held.getnodetype() == 'flag':
return True
self.node.hold_body = opposingbody
self.node.hold_node = opposingnode
elif isinstance(msg, bs.CelebrateMessage):
if self.node:
self.node.handlemessage('celebrate', int(msg.duration * 1000))
return None
class PowerupManagerWindow(PopupWindow):
def __init__(self, transition='in_right'):
columns = 2
self._width = width = 800
self._height = height = 500
self._sub_height = 200
self._scroll_width = self._width * 0.90
self._scroll_height = self._height - 180
self._sub_width = self._scroll_width * 0.95
self.tab_buttons: set = {}
self.list_cls_power: list = []
self.default_powerups = default_powerups()
self.default_power_list = list(self.default_powerups)
self.coins = apg['Bear Coin']
self.popup_cls_power = None
if not STORE['Buy Firebombs']:
powerups['Fire Bombs'] = 0
self.default_power_list.remove('Fire Bombs')
self.charstr = [babase.charstr(babase.SpecialChar.LEFT_ARROW),
babase.charstr(babase.SpecialChar.RIGHT_ARROW),
babase.charstr(babase.SpecialChar.UP_ARROW),
babase.charstr(babase.SpecialChar.DOWN_ARROW)]
self.tabdefs = {"Action 1": ['powerupIceBombs', (1, 1, 1)],
"Action 2": ['settingsIcon', (0, 1, 0)],
"Action 3": ['inventoryIcon', (1, 1, 1)],
"Action 4": ['storeIcon', (1, 1, 1)],
"Action 5": ['advancedIcon', (1, 1, 1)],
"About": ['heart', (1.5, 0.3, 0.3)]}
if (STORE['Buy Firebombs'] and
STORE['Buy Option'] and
STORE['Buy Percentage']):
self.tabdefs = {"Action 1": ['powerupIceBombs', (1, 1, 1)],
"Action 2": ['settingsIcon', (0, 1, 0)],
"Action 3": ['inventoryIcon', (1, 1, 1)],
"About": ['heart', (1.5, 0.3, 0.3)]}
self.listdef = list(self.tabdefs)
self.count = len(self.tabdefs)
self._current_tab = GLOBAL['Tab']
app = bui.app.ui_v1
uiscale = app.uiscale
self._root_widget = bui.containerwidget(size=(width + 90, height + 80),
transition=transition,
scale=1.5 if uiscale is babase.UIScale.SMALL else 1.0,
stack_offset=(0,
-30) if uiscale is babase.UIScale.SMALL else (
0, 0))
self._backButton = b = bui.buttonwidget(parent=self._root_widget,
autoselect=True,
position=(
60, self._height - 15),
size=(130, 60),
scale=0.8, text_scale=1.2,
label=babase.Lstr(
resource='backText'),
button_type='back',
on_activate_call=babase.Call(
self._back))
bui.buttonwidget(edit=self._backButton, button_type='backSmall',
size=(60, 60),
label=babase.charstr(babase.SpecialChar.BACK))
bui.containerwidget(edit=self._root_widget, cancel_button=b)
self.titletext = bui.textwidget(parent=self._root_widget,
position=(0, height - 15),
size=(width, 50),
h_align="center",
color=bui.app.ui_v1.title_color,
v_align="center", maxwidth=width * 1.3)
index = 0
for tab in range(self.count):
for tab2 in range(columns):
tag = self.listdef[index]
position = (
620 + (tab2 * 120), self._height - 50 * 2.5 - (tab * 120))
if tag == 'About':
text = babase.Lstr(resource='gatherWindow.aboutText')
elif tab == 'Action 4':
text = babase.Lstr(resource='storeText')
else:
text = getlanguage(tag)
self.tab_buttons[tag] = bui.buttonwidget(
parent=self._root_widget, autoselect=True,
position=position, size=(110, 110),
scale=1, label='', enable_sound=False,
button_type='square',
on_activate_call=babase.Call(self._set_tab, tag,
sound=True))
self.text = bui.textwidget(parent=self._root_widget,
position=(
position[0] + 55, position[1] + 30),
size=(0, 0), scale=1,
color=bui.app.ui_v1.title_color,
draw_controller=self.tab_buttons[
tag], maxwidth=100,
text=text, h_align='center',
v_align='center')
self.image = bui.imagewidget(parent=self._root_widget,
size=(60, 60),
color=self.tabdefs[tag][1],
draw_controller=self.tab_buttons[
tag],
position=(position[0] + 25,
position[1] + 40),
texture=bs.gettexture(
self.tabdefs[tag][0]))
index += 1
if self.count == index:
break
if self.count == index:
break
self._scrollwidget = None
self._tab_container = None
self._set_tab(self._current_tab)
def __del__(self):
apg.apply_and_commit()
def _set_tab(self, tab, sound: bool = False):
self.sound = sound
GLOBAL['Tab'] = tab
apg.apply_and_commit()
if self._tab_container is not None and self._tab_container.exists():
self._tab_container.delete()
if self.sound:
bs.getsound('click01').play()
if self._scrollwidget:
self._scrollwidget.delete()
self._scrollwidget = bui.scrollwidget(parent=self._root_widget,
position=(
self._width * 0.08, 51 * 1.8),
size=(self._sub_width - 140,
self._scroll_height + 60 * 1.2))
if tab == 'Action 4':
if self._scrollwidget:
self._scrollwidget.delete()
self._scrollwidget = bui.hscrollwidget(parent=self._root_widget,
position=(
self._width * 0.08,
51 * 1.8), size=(
self._sub_width - 140, self._scroll_height + 60 * 1.2),
capture_arrows=True,
claims_left_right=True)
bui.textwidget(edit=self.titletext,
text=babase.Lstr(resource='storeText'))
elif tab == 'About':
bui.textwidget(edit=self.titletext,
text=babase.Lstr(resource='gatherWindow.aboutText'))
else:
bui.textwidget(edit=self.titletext, text=getlanguage(tab))
choices = ['Reset', 'Only Bombs', 'Only Items', 'New', 'Nothing']
c_display = []
for display in choices:
choices_display = babase.Lstr(translate=("", getlanguage(display)))
c_display.append(choices_display)
if tab == 'Action 1':
self.popup_cls_power = PopupMenu(
parent=self._root_widget,
position=(130, self._width * 0.61),
button_size=(150, 50), scale=2.5,
choices=choices, width=150,
choices_display=c_display,
current_choice=GLOBAL['Cls Powerup'],
on_value_change_call=self._set_concept)
self.list_cls_power.append(self.popup_cls_power._button)
self.button_cls_power = bui.buttonwidget(parent=self._root_widget,
position=(
500, self._width * 0.61),
size=(50, 50),
autoselect=True,
scale=1, label=('%'),
text_scale=1,
button_type='square',
on_activate_call=self._percentage_window)
self.list_cls_power.append(self.button_cls_power)
rewindow = [self.popup_cls_power._button, self.button_cls_power]
for cls in self.list_cls_power: # this is very important so that pupups don't accumulate
if cls not in rewindow:
cls.delete()
elif tab == 'Action 4':
self.button_coin = bui.buttonwidget(parent=self._root_widget,
icon=bs.gettexture('coin'),
position=(
550, self._width * 0.614),
size=(160, 40),
textcolor=(0, 1, 0),
color=(0, 1, 6),
scale=1,
label=str(apg['Bear Coin']),
text_scale=1, autoselect=True,
on_activate_call=None) # self._percentage_window)
self.list_cls_power.append(self.button_coin)
try:
rewindow.append(self.button_coin)
except:
rewindow = [self.button_coin]
for cls in self.list_cls_power: # this is very important so that pupups don't accumulate
if cls not in rewindow:
cls.delete()
else:
try:
for cls in self.list_cls_power:
cls.delete()
except:
pass
if tab == 'Action 1':
sub_height = len(self.default_power_list) * 90
v = sub_height - 55
width = 300
posi = 0
id_power = list(self.default_powerups)
new_powerups = id_power[9:]
self.listpower = {}
self._tab_container = c = bui.containerwidget(
parent=self._scrollwidget,
size=(self._sub_width, sub_height),
background=False, selection_loops_to_parent=True)
for power in self.default_power_list:
if power == id_power[0]:
text = 'helpWindow.powerupShieldNameText'
tex = bs.gettexture('powerupShield')
elif power == id_power[1]:
text = 'helpWindow.powerupPunchNameText'
tex = bs.gettexture('powerupPunch')
elif power == id_power[2]:
text = 'helpWindow.powerupLandMinesNameText'
tex = bs.gettexture('powerupLandMines')
elif power == id_power[3]:
text = 'helpWindow.powerupImpactBombsNameText'
tex = bs.gettexture('powerupImpactBombs')
elif power == id_power[4]:
text = 'helpWindow.powerupIceBombsNameText'
tex = bs.gettexture('powerupIceBombs')
elif power == id_power[5]:
text = 'helpWindow.powerupBombNameText'
tex = bs.gettexture('powerupBomb')
elif power == id_power[6]:
text = 'helpWindow.powerupStickyBombsNameText'
tex = bs.gettexture('powerupStickyBombs')
elif power == id_power[7]:
text = 'helpWindow.powerupCurseNameText'
tex = bs.gettexture('powerupCurse')
elif power == id_power[8]:
text = 'helpWindow.powerupHealthNameText'
tex = bs.gettexture('powerupHealth')
elif power == id_power[9]:
text = power
tex = bs.gettexture('powerupSpeed')
elif power == id_power[10]:
text = power
tex = bs.gettexture('heart')
elif power == id_power[11]:
text = "Goodbye!"
tex = bs.gettexture('achievementOnslaught')
elif power == id_power[12]:
text = power
tex = bs.gettexture('ouyaUButton')
elif power == id_power[13]:
text = power
tex = bs.gettexture('achievementSuperPunch')
elif power == id_power[14]:
text = power
tex = bs.gettexture('levelIcon')
elif power == id_power[15]:
text = power
tex = bs.gettexture('ouyaOButton')
elif power == id_power[16]:
text = power
tex = bs.gettexture('star')
if power in new_powerups:
label = getlanguage(power)
else:
label = babase.Lstr(resource=text)
apperance = powerups[power]
position = (90, v - posi)
t = bui.textwidget(parent=c, position=(
position[0] - 30, position[1] - 15), size=(width, 50),
h_align="center",
color=(bui.app.ui_v1.title_color),
text=label, v_align="center",
maxwidth=width * 1.3)
self.powprev = bui.imagewidget(parent=c,
position=(position[0] - 70,
position[1] - 10),
size=(50, 50), texture=tex)
dipos = 0
for direc in ['-', '+']:
bui.buttonwidget(parent=c, autoselect=True,
position=(position[0] + 270 + dipos,
position[1] - 10),
size=(100, 100),
scale=0.4, label=direc,
button_type='square', text_scale=4,
on_activate_call=babase.Call(
self.apperance_powerups, power, direc))
dipos += 100
textwidget = bui.textwidget(parent=c, position=(
position[0] + 190, position[1] - 15), size=(width, 50),
h_align="center",
color=cls_pow_color()[apperance],
text=str(apperance),
v_align="center",
maxwidth=width * 1.3)
self.listpower[power] = textwidget
posi += 90
elif tab == 'Action 2':
sub_height = 370 if not STORE['Buy Option'] else 450
v = sub_height - 55
width = 300
self._tab_container = c = bui.containerwidget(
parent=self._scrollwidget,
size=(self._sub_width, sub_height),
background=False, selection_loops_to_parent=True)
position = (40, v - 20)
c_display = []
choices = ['Auto', 'SY: BALL', 'SY: Impact', 'SY: Egg']
for display in choices:
choices_display = babase.Lstr(
translate=("", getlanguage(display)))
c_display.append(choices_display)
popup = PopupMenu(parent=c,
position=(position[0] + 300, position[1]),
button_size=(150, 50), scale=2.5,
choices=choices, width=150,
choices_display=c_display,
current_choice=config['Powerup Style'],
on_value_change_call=babase.Call(self._all_popup,
'Powerup Style'))
text = getlanguage('Powerup Style')
wt = (len(text) * 0.80)
t = bui.textwidget(parent=c,
position=(position[0] - 60 + wt, position[1]),
size=(width, 50), maxwidth=width * 0.9,
scale=1.1, h_align="center",
color=bui.app.ui_v1.title_color,
text=getlanguage('Powerup Style'),
v_align="center")
dipos = 0
for direc in ['-', '+']:
bui.buttonwidget(parent=c, autoselect=True,
position=(
position[0] + 310 + dipos, position[1] - 100),
size=(100, 100),
repeat=True, scale=0.4, label=direc,
button_type='square', text_scale=4,
on_activate_call=babase.Call(
self._powerups_scale, direc))
dipos += 100
txt_scale = config['Powerup Scale']
self.txt_scale = bui.textwidget(parent=c, position=(
position[0] + 230, position[1] - 105), size=(width, 50),
scale=1.1, h_align="center",
color=(0, 1, 0),
text=str(txt_scale),
v_align="center",
maxwidth=width * 1.3)
text = getlanguage('Powerup Scale')
wt = (len(text) * 0.80)
t = bui.textwidget(parent=c, position=(
position[0] - 60 + wt, position[1] - 100), size=(width, 50),
maxwidth=width * 0.9,
scale=1.1, h_align="center",
color=bui.app.ui_v1.title_color, text=text,
v_align="center")
position = (position[0] - 20, position[1] + 40)
self.check = bui.checkboxwidget(parent=c, position=(
position[0] + 30, position[1] - 230), value=config['Powerup Name'],
on_value_change_call=babase.Call(
self._switches, 'Powerup Name'),
maxwidth=self._scroll_width * 0.9,
text=getlanguage('Powerup Name'),
autoselect=True)
self.check = bui.checkboxwidget(parent=c, position=(
position[0] + 30, position[1] - 230 * 1.3),
value=config['Powerup With Shield'],
on_value_change_call=babase.Call(
self._switches,
'Powerup With Shield'),
maxwidth=self._scroll_width * 0.9,
text=getlanguage(
'Powerup With Shield'),
autoselect=True)
if STORE['Buy Option']:
self.check = bui.checkboxwidget(parent=c, position=(
position[0] + 30, position[1] - 230 * 1.6),
value=config['Powerup Time'],
on_value_change_call=babase.Call(
self._switches,
'Powerup Time'),
maxwidth=self._scroll_width * 0.9,
text=getlanguage(
'Powerup Time'),
autoselect=True)
elif tab == 'Action 3':
sub_height = 300
v = sub_height - 55
width = 300
self._tab_container = c = bui.containerwidget(
parent=self._scrollwidget,
size=(self._sub_width, sub_height),
background=False, selection_loops_to_parent=True)
v -= 20
position = (110, v - 45 * 1.72)
if not STORE['Buy Percentage']:
t = bui.textwidget(parent=c, position=(90, v - 100),
size=(30 + width, 50),
h_align="center",
text=getlanguage('Block Option Store'),
color=bui.app.ui_v1.title_color,
v_align="center", maxwidth=width * 1.5,
scale=1.5)
i = bui.imagewidget(parent=c,
position=(
position[0] + 100, position[1] - 205),
size=(80, 80),
texture=bs.gettexture('lock'))
else:
t = bui.textwidget(parent=c, position=(
position[0] - 14, position[1] + 70), size=(30 + width, 50),
h_align="center",
text=f"{getlanguage('Tank Shield PTG')} ({getlanguage('Tank Shield')})",
color=bui.app.ui_v1.title_color,
v_align="center", maxwidth=width * 1.5,
scale=1.5)
b = bui.buttonwidget(parent=c, autoselect=True,
position=position, size=(100, 100),
repeat=True,
scale=0.6, label=self.charstr[3],
button_type='square', text_scale=2,
on_activate_call=babase.Call(
self.tank_shield_percentage,
'Decrement'))
b = bui.buttonwidget(parent=c, autoselect=True, repeat=True,
text_scale=2,
position=(position[0] * 3.2, position[1]),
size=(100, 100),
scale=0.6, label=self.charstr[2],
button_type='square',
on_activate_call=babase.Call(
self.tank_shield_percentage,
'Increment'))
porcentaje = config['Tank Shield PTG']
if porcentaje > 59:
color = (0, 1, 0)
elif porcentaje < 40:
color = (1, 1, 0)
else:
color = (0, 1, 0.8)
self.tank_text = bui.textwidget(parent=c, position=(
position[0] - 14, position[1] + 5),
size=(30 + width, 50),
h_align="center",
text=str(porcentaje) + '%',
color=color,
v_align="center",
maxwidth=width * 1.3, scale=2)
# ----->
position = (110, v - 160 * 1.6)
t = bui.textwidget(parent=c, position=(
position[0] - 14, position[1] + 70), size=(30 + width, 50),
h_align="center",
text=f"{getlanguage('Healing Damage PTG')}{_sp_}({getlanguage('Healing Damage')})",
color=bui.app.ui_v1.title_color,
v_align="center", maxwidth=width * 1.3,
scale=1.4)
b = bui.buttonwidget(parent=c, autoselect=True,
position=position, size=(100, 100),
repeat=True,
scale=0.6, label=self.charstr[3],
button_type='square', text_scale=2,
on_activate_call=babase.Call(
self.health_damage_percentage,
'Decrement'))
b = bui.buttonwidget(parent=c, autoselect=True, repeat=True,
text_scale=2,
position=(position[0] * 3.2, position[1]),
size=(100, 100),
scale=0.6, label=self.charstr[2],
button_type='square',
on_activate_call=babase.Call(
self.health_damage_percentage,
'Increment'))
porcentaje = config['Healing Damage PTG']
if porcentaje > 59:
color = (0, 1, 0)
elif porcentaje < 40:
color = (1, 1, 0)
else:
color = (0, 1, 0.8)
self.hlg_text = bui.textwidget(parent=c, position=(
position[0] - 14, position[1] + 5),
size=(30 + width, 50),
h_align="center",
text=str(porcentaje) + '%',
color=color,
v_align="center",
maxwidth=width * 1.3, scale=2)
elif tab == 'Percentage':
sub_height = len(self.default_power_list) * 90
v = sub_height - 55
width = 300
posi = 0
id_power = list(self.default_powerups)
new_powerups = id_power[9:]
self.listpower = {}
self._tab_container = c = bui.containerwidget(
parent=self._scrollwidget,
size=(self._sub_width, sub_height),
background=False, selection_loops_to_parent=True)
for power in self.default_power_list:
if power == id_power[0]:
text = 'helpWindow.powerupShieldNameText'
tex = bs.gettexture('powerupShield')
elif power == id_power[1]:
text = 'helpWindow.powerupPunchNameText'
tex = bs.gettexture('powerupPunch')
elif power == id_power[2]:
text = 'helpWindow.powerupLandMinesNameText'
tex = bs.gettexture('powerupLandMines')
elif power == id_power[3]:
text = 'helpWindow.powerupImpactBombsNameText'
tex = bs.gettexture('powerupImpactBombs')
elif power == id_power[4]:
text = 'helpWindow.powerupIceBombsNameText'
tex = bs.gettexture('powerupIceBombs')
elif power == id_power[5]:
text = 'helpWindow.powerupBombNameText'
tex = bs.gettexture('powerupBomb')
elif power == id_power[6]:
text = 'helpWindow.powerupStickyBombsNameText'
tex = bs.gettexture('powerupStickyBombs')
elif power == id_power[7]:
text = 'helpWindow.powerupCurseNameText'
tex = bs.gettexture('powerupCurse')
elif power == id_power[8]:
text = 'helpWindow.powerupHealthNameText'
tex = bs.gettexture('powerupHealth')
elif power == id_power[9]:
text = power
tex = bs.gettexture('powerupSpeed')
elif power == id_power[10]:
text = power
tex = bs.gettexture('heart')
elif power == id_power[11]:
text = "Goodbye!"
tex = bs.gettexture('achievementOnslaught')
elif power == id_power[12]:
text = power
tex = bs.gettexture('ouyaUButton')
elif power == id_power[13]:
text = power
tex = bs.gettexture('achievementSuperPunch')
elif power == id_power[14]:
text = power
tex = bs.gettexture('levelIcon')
elif power == id_power[15]:
text = power
tex = bs.gettexture('ouyaOButton')
elif power == id_power[16]:
text = power
tex = bs.gettexture('star')
if power in new_powerups:
label = getlanguage(power)
else:
label = babase.Lstr(resource=text)
apperance = powerups[power]
position = (90, v - posi)
t = bui.textwidget(parent=c, position=(
position[0] - 30, position[1] - 15), size=(width, 50),
h_align="center",
color=(bui.app.ui_v1.title_color),
text=label, v_align="center",
maxwidth=width * 1.3)
self.powprev = bui.imagewidget(parent=c,
position=(position[0] - 70,
position[1] - 10),
size=(50, 50), texture=tex)
ptg = str(self.total_percentage(power))
t = bui.textwidget(parent=c, position=(
position[0] + 170, position[1] - 10), size=(width, 50),
h_align="center", color=(0, 1, 0),
text=(f'{ptg}%'), v_align="center",
maxwidth=width * 1.3)
posi += 90
elif tab == 'Action 4':
sub_height = 370
width = 300
v = sub_height - 55
u = width - 60
self._tab_container = c = bui.containerwidget(
parent=self._scrollwidget,
size=(width + 500, sub_height),
background=False, selection_loops_to_parent=True)
position = (u + 150, v - 250)
n_pos = 0
prices = [7560, 5150, 3360]
str_name = ["FireBombs Store", "Timer Store", "Percentages Store"]
images = ["ouyaOButton", "settingsIcon", "inventoryIcon"]
index = 0
for store in store_items():
p = prices[index]
txt = str_name[index]
label = getlanguage(txt)
tx_pos = len(label) * 1.8
lb_scale = len(label) * 0.20
preview = images[index]
if STORE[store]:
text = getlanguage('Bought')
icon = bs.gettexture('graphicsIcon')
color = (0.52, 0.48, 0.63)
txt_scale = 1.5
else:
text = str(p)
icon = bs.gettexture('coin')
color = (0.5, 0.4, 0.93)
txt_scale = 2
b = bui.buttonwidget(parent=c, autoselect=True, position=(
position[0] + 210 - n_pos, position[1]),
size=(250, 80), scale=0.7, label=text,
text_scale=txt_scale, icon=icon,
color=color,
iconscale=1.7,
on_activate_call=babase.Call(
self._buy_object, store, p))
s = 180
b = bui.buttonwidget(parent=c, autoselect=True, position=(
position[0] + 210 - n_pos, position[1] + 55),
size=(s, s + 30), scale=1, label='',
color=color, button_type='square',
on_activate_call=babase.Call(
self._buy_object, store, p))
s -= 80
i = bui.imagewidget(parent=c, draw_controller=b,
position=(position[0] + 250 - n_pos,
position[1] + 140),
size=(s, s), texture=bs.gettexture(preview))
t = bui.textwidget(parent=c, position=(
position[0] + 270 - n_pos, position[1] + 101),
h_align="center",
color=(bui.app.ui_v1.title_color),
text=label, v_align="center", maxwidth=130)
n_pos += 280
index += 1
elif tab == 'Action 5':
sub_height = 370
v = sub_height - 55
width = 300
self._tab_container = c = bui.containerwidget(
parent=self._scrollwidget,
size=(self._sub_width, sub_height), background=False,
selection_loops_to_parent=True)
position = (0, v - 30)
t = bui.textwidget(parent=c,
position=(position[0] + 80, position[1] - 30),
size=(width + 60, 50), scale=1,
h_align="center",
color=(bui.app.ui_v1.title_color),
text=babase.Lstr(
resource='settingsWindowAdvanced.enterPromoCodeText'),
v_align="center", maxwidth=width * 1.3)
self.promocode_text = bui.textwidget(parent=c, position=(
position[0] + 80, position[1] - 100), size=(width + 60, 50),
scale=1,
editable=True,
h_align="center", color=(
bui.app.ui_v1.title_color), text='', v_align="center",
maxwidth=width * 1.3,
max_chars=30,
description=babase.Lstr(
resource='settingsWindowAdvanced.enterPromoCodeText'))
self.promocode_button = bui.buttonwidget(
parent=c, position=(position[0] + 160, position[1] - 170),
size=(200, 60), scale=1.0,
label=babase.Lstr(resource='submitText'),
on_activate_call=self._promocode)
else:
sub_height = 0
v = sub_height - 55
width = 300
self._tab_container = c = bui.containerwidget(
parent=self._scrollwidget,
size=(self._sub_width, sub_height),
background=False, selection_loops_to_parent=True)
t = bui.textwidget(parent=c, position=(110, v - 20),
size=(width, 50),
scale=1.4, color=(0.2, 1.2, 0.2),
h_align="center", v_align="center",
text=("Ultimate Powerup Manager v1.7"),
maxwidth=width * 30)
t = bui.textwidget(parent=c, position=(110, v - 90),
size=(width, 50),
scale=1, color=(1.3, 0.5, 1.0), h_align="center",
v_align="center",
text=getlanguage('Creator'), maxwidth=width * 30)
t = bui.textwidget(parent=c, position=(110, v - 220),
size=(width, 50),
scale=1, color=(1.0, 1.2, 0.3), h_align="center",
v_align="center",
text=getlanguage('Mod Info'),
maxwidth=width * 30)
for select_tab, button_tab in self.tab_buttons.items():
if select_tab == tab:
bui.buttonwidget(edit=button_tab, color=(0.5, 0.4, 1.5))
else:
bui.buttonwidget(edit=button_tab, color=(0.52, 0.48, 0.63))
def _all_popup(self, tag: str, popup: str) -> None:
config[tag] = popup
apg.apply_and_commit()
def _set_concept(self, concept: str) -> None:
GLOBAL['Cls Powerup'] = concept
if concept == 'Reset':
for power, deflt in default_powerups().items():
powerups[power] = deflt
elif concept == 'Nothing':
for power in default_powerups():
powerups[power] = 0
elif concept == 'Only Bombs':
for power, deflt in default_powerups().items():
if 'Bombs' not in power:
powerups[power] = 0
else:
powerups[power] = 3
elif concept == 'Only Items':
for power, deflt in default_powerups().items():
if 'Bombs' in power:
powerups[power] = 0
else:
powerups[power] = deflt
elif concept == 'New':
default_power = default_powerups()
new_powerups = list(default_power)[9:]
for power, deflt in default_power.items():
if power not in new_powerups:
powerups[power] = 0
else:
powerups[power] = deflt
if not STORE['Buy Firebombs']:
powerups['Fire Bombs'] = 0
self._set_tab('Action 1')
def tank_shield_percentage(self, tag):
max = 96
min = 40
if tag == 'Increment':
config['Tank Shield PTG'] += 1
if config['Tank Shield PTG'] > max:
config['Tank Shield PTG'] = min
elif tag == 'Decrement':
config['Tank Shield PTG'] -= 1
if config['Tank Shield PTG'] < min:
config['Tank Shield PTG'] = max
porcentaje = config['Tank Shield PTG']
if porcentaje > 59:
color = (0, 1, 0)
elif porcentaje < 40:
color = (1, 1, 0)
else:
color = (0, 1, 0.8)
bui.textwidget(edit=self.tank_text,
text=str(porcentaje) + '%', color=color)
def health_damage_percentage(self, tag):
max = 80
min = 35
if tag == 'Increment':
config['Healing Damage PTG'] += 1
if config['Healing Damage PTG'] > max:
config['Healing Damage PTG'] = min
elif tag == 'Decrement':
config['Healing Damage PTG'] -= 1
if config['Healing Damage PTG'] < min:
config['Healing Damage PTG'] = max
porcentaje = config['Healing Damage PTG']
if porcentaje > 59:
color = (0, 1, 0)
elif porcentaje < 40:
color = (1, 1, 0)
else:
color = (0, 1, 0.8)
bui.textwidget(edit=self.hlg_text,
text=str(porcentaje) + '%', color=color)
def apperance_powerups(self, powerup: str, ID: str):
max = 7
if ID == "-":
if powerups[powerup] == 0:
powerups[powerup] = max
else:
powerups[powerup] -= 1
elif ID == "+":
if powerups[powerup] == max:
powerups[powerup] = 0
else:
powerups[powerup] += 1
enum = powerups[powerup]
bui.textwidget(edit=self.listpower[powerup],
text=str(powerups[powerup]),
color=cls_pow_color()[enum])
def _powerups_scale(self, ID: str):
max = 1.5
min = 0.5
sc = 0.1
if ID == "-":
if config['Powerup Scale'] < (min + 0.1):
config['Powerup Scale'] = max
else:
config['Powerup Scale'] -= sc
elif ID == "+":
if config['Powerup Scale'] > (max - 0.1):
config['Powerup Scale'] = min
else:
config['Powerup Scale'] += sc
config['Powerup Scale'] = round(config['Powerup Scale'], 1)
bui.textwidget(edit=self.txt_scale,
text=str(config['Powerup Scale']))
def total_percentage(self, power):
total = 0
pw = powerups[power]
for i, i2 in powerups.items():
total += i2
if total == 0:
return float(total)
else:
ptg = (100 * pw / total)
result = round(ptg, 2)
return result
def store_refresh(self, tag: str):
if tag == 'Buy Firebombs':
powerups['Fire Bombs'] = 3
self.default_power_list.append('Fire Bombs')
self._set_tab('Action 4')
def _buy_object(self, tag: str, price: int):
store = BearStore(value=tag, price=price,
callback=babase.Call(self.store_refresh, tag))
store.buy()
def _promocode(self):
code = bui.textwidget(query=self.promocode_text)
promo = PromoCode(code=code)
promo.code_confirmation()
bui.textwidget(edit=self.promocode_text, text="")
def _switches(self, tag, m):
config[tag] = False if m == 0 else True
apg.apply_and_commit()
def _percentage_window(self):
self._set_tab('Percentage')
def _back(self):
bui.containerwidget(edit=self._root_widget, transition='out_left')
browser.ProfileBrowserWindow()
def enable():
# browser.ProfileBrowserWindow = NewProfileBrowserWindow
pupbox.PowerupBoxFactory = NewPowerupBoxFactory
pupbox.PowerupBox.__init__ = _pbx_
Bomb.__init__ = _bomb_init
SpazBot.handlemessage = bot_handlemessage
Blast.handlemessage = bomb_handlemessage
Spaz.handlemessage = new_handlemessage
Spaz.__init__ = _init_spaz_
Spaz._get_bomb_type_tex = new_get_bomb_type_tex
Spaz.on_punch_press = spaz_on_punch_press
Spaz.on_punch_release = spaz_on_punch_release
MainMenuActivity.on_transition_in = new_on_transition_in