bombsquad-plugin-manager/plugins/minigames/lame_fight.py

171 lines
6.6 KiB
Python
Raw Normal View History

2024-01-26 05:00:06 +03:00
# Ported to api 8 by brostos using baport.(https://github.com/bombsquad-community/baport)
# ba_meta require api 8
# (see https://ballistica.net/wiki/meta-tag-system)
from __future__ import annotations
import random
from typing import TYPE_CHECKING
import babase
import bauiv1 as bui
import bascenev1 as bs
from bascenev1lib.actor.spazbot import SpazBotSet, ChargerBot, BrawlerBotProShielded, TriggerBotProShielded, ExplodeyBot, BomberBotProShielded, SpazBotDiedMessage
from bascenev1lib.actor.onscreentimer import OnScreenTimer
if TYPE_CHECKING:
from typing import Any, Type, Dict, List, Optional
2024-01-26 02:02:31 +00:00
2024-01-26 05:00:06 +03:00
def ba_get_api_version():
return 6
2024-01-26 02:02:31 +00:00
2024-01-26 05:00:06 +03:00
def ba_get_levels():
2024-01-26 02:02:31 +00:00
return [babase._level.Level(
'Lame Fight',
gametype=LameFightGame,
settings={},
preview_texture_name='courtyardPreview')]
2024-01-26 05:00:06 +03:00
class Player(bs.Player['Team']):
"""Our player type for this game."""
class Team(bs.Team[Player]):
"""Our team type for this game."""
# ba_meta export bascenev1.GameActivity
2024-01-26 02:02:31 +00:00
2024-01-26 05:00:06 +03:00
class LameFightGame(bs.TeamGameActivity[Player, Team]):
name = "Lame Fight"
description = "Save World With Super Powers"
slow_motion = True
scoreconfig = bs.ScoreConfig(label='Time',
scoretype=bs.ScoreType.MILLISECONDS,
lower_is_better=True)
default_music = bs.MusicType.TO_THE_DEATH
2024-01-26 02:02:31 +00:00
def __init__(self, settings: dict):
2024-01-26 05:00:06 +03:00
settings['map'] = "Courtyard"
super().__init__(settings)
self._timer: Optional[OnScreenTimer] = None
self._winsound = bs.getsound('score')
self._won = False
self._bots = SpazBotSet()
2024-01-26 02:02:31 +00:00
2024-01-26 05:00:06 +03:00
def on_begin(self) -> None:
super().on_begin()
2024-01-26 02:02:31 +00:00
2024-01-26 05:00:06 +03:00
self._timer = OnScreenTimer()
bs.timer(4.0, self._timer.start)
2024-01-26 02:02:31 +00:00
# Bots Hehe
bs.timer(1.0, lambda: self._bots.spawn_bot(ChargerBot, pos=(3, 3, -2), spawn_time=3.0))
bs.timer(1.0, lambda: self._bots.spawn_bot(ChargerBot, pos=(-3, 3, -2), spawn_time=3.0))
bs.timer(1.0, lambda: self._bots.spawn_bot(ChargerBot, pos=(5, 3, -2), spawn_time=3.0))
bs.timer(1.0, lambda: self._bots.spawn_bot(ChargerBot, pos=(-5, 3, -2), spawn_time=3.0))
bs.timer(1.0, lambda: self._bots.spawn_bot(ChargerBot, pos=(0, 3, 1), spawn_time=3.0))
bs.timer(1.0, lambda: self._bots.spawn_bot(ChargerBot, pos=(0, 3, -5), spawn_time=3.0))
bs.timer(9.0, lambda: self._bots.spawn_bot(
BomberBotProShielded, pos=(-7, 5, -7.5), spawn_time=3.0))
bs.timer(9.0, lambda: self._bots.spawn_bot(
BomberBotProShielded, pos=(7, 5, -7.5), spawn_time=3.0))
bs.timer(9.0, lambda: self._bots.spawn_bot(
BomberBotProShielded, pos=(7, 5, 1.5), spawn_time=3.0))
bs.timer(9.0, lambda: self._bots.spawn_bot(
BomberBotProShielded, pos=(-7, 5, 1.5), spawn_time=3.0))
bs.timer(12.0, lambda: self._bots.spawn_bot(
TriggerBotProShielded, pos=(-1, 7, -8), spawn_time=3.0))
bs.timer(12.0, lambda: self._bots.spawn_bot(
TriggerBotProShielded, pos=(1, 7, -8), spawn_time=3.0))
bs.timer(15.0, lambda: self._bots.spawn_bot(ExplodeyBot, pos=(0, 3, -5), spawn_time=3.0))
bs.timer(20.0, lambda: self._bots.spawn_bot(ExplodeyBot, pos=(0, 3, 1), spawn_time=3.0))
bs.timer(20.0, lambda: self._bots.spawn_bot(ExplodeyBot, pos=(-5, 3, -2), spawn_time=3.0))
bs.timer(20.0, lambda: self._bots.spawn_bot(ExplodeyBot, pos=(5, 3, -2), spawn_time=3.0))
bs.timer(30, self.street)
2024-01-26 05:00:06 +03:00
def street(self):
2024-01-26 02:02:31 +00:00
bs.broadcastmessage("Lame Guys Are Here!", color=(1, 0, 0))
for a in range(-1, 2):
for b in range(-3, 0):
self._bots.spawn_bot(BrawlerBotProShielded, pos=(a, 3, b), spawn_time=3.0)
2024-01-26 05:00:06 +03:00
def spawn_player(self, player: Player) -> bs.Actor:
spawn_center = (0, 3, -2)
pos = (spawn_center[0] + random.uniform(-1.5, 1.5), spawn_center[1],
spawn_center[2] + random.uniform(-1.5, 1.5))
2024-01-26 02:02:31 +00:00
spaz = self.spawn_player_spaz(player, position=pos)
p = ["Bigger Blast", "Stronger Punch", "Shield", "Speed"]
2024-01-26 05:00:06 +03:00
Power = random.choice(p)
2024-01-26 02:02:31 +00:00
spaz.bomb_type = random.choice(
["normal", "sticky", "ice", "impact", "normal", "ice", "sticky"])
2024-01-26 05:00:06 +03:00
bs.broadcastmessage(f"Now You Have {Power}")
if Power == p[0]:
spaz.bomb_count = 3
spaz.blast_radius = 2.5
if Power == p[1]:
spaz._punch_cooldown = 350
spaz._punch_power_scale = 2.0
if Power == p[2]:
spaz.equip_shields()
if Power == p[3]:
spaz.node.hockey = True
return spaz
2024-01-26 02:02:31 +00:00
2024-01-26 05:00:06 +03:00
def _check_if_won(self) -> None:
if not self._bots.have_living_bots():
self._won = True
self.end_game()
2024-01-26 02:02:31 +00:00
2024-01-26 05:00:06 +03:00
def handlemessage(self, msg: Any) -> Any:
# A player has died.
if isinstance(msg, bs.PlayerDiedMessage):
super().handlemessage(msg) # Augment standard behavior.
self.respawn_player(msg.getplayer(Player))
# A spaz-bot has died.
elif isinstance(msg, SpazBotDiedMessage):
# Unfortunately the bot-set will always tell us there are living
# bots if we ask here (the currently-dying bot isn't officially
# marked dead yet) ..so lets push a call into the event loop to
# check once this guy has finished dying.
babase.pushcall(self._check_if_won)
# Let the base class handle anything we don't.
else:
return super().handlemessage(msg)
return None
# When this is called, we should fill out results and end the game
# *regardless* of whether is has been won. (this may be called due
# to a tournament ending or other external reason).
def end_game(self) -> None:
# Stop our on-screen timer so players can see what they got.
assert self._timer is not None
self._timer.stop()
results = bs.GameResults()
# If we won, set our score to the elapsed time in milliseconds.
# (there should just be 1 team here since this is co-op).
# ..if we didn't win, leave scores as default (None) which means
# we lost.
if self._won:
elapsed_time_ms = int((bs.time() - self._timer.starttime) * 1000.0)
bs.cameraflash()
self._winsound.play()
for team in self.teams:
for player in team.players:
if player.actor:
player.actor.handlemessage(bs.CelebrateMessage())
results.set_team_score(team, elapsed_time_ms)
# Ends the activity.
self.end(results)