mirror of
https://github.com/bombsquad-community/plugin-manager.git
synced 2025-10-08 14:54:36 +00:00
Update hot_potato.py
This commit is contained in:
parent
0d8acc84be
commit
f7ac41b33d
1 changed files with 32 additions and 11 deletions
|
|
@ -2,6 +2,15 @@
|
||||||
|
|
||||||
Hot Potato by TheMikirog#1984
|
Hot Potato by TheMikirog#1984
|
||||||
|
|
||||||
|
A random player(s) gets Marked.
|
||||||
|
They will die if they don't pass the mark to other players.
|
||||||
|
After they die, another random player gets Marked.
|
||||||
|
Last player standing wins!
|
||||||
|
|
||||||
|
Heavily commented for easy modding learning!
|
||||||
|
|
||||||
|
No Rights Reserved
|
||||||
|
|
||||||
"""
|
"""
|
||||||
|
|
||||||
# ba_meta require api 7
|
# ba_meta require api 7
|
||||||
|
|
@ -404,7 +413,7 @@ class PotatoPlayerSpaz(PlayerSpaz):
|
||||||
spread=0.1)
|
spread=0.1)
|
||||||
|
|
||||||
# Briefly flash when hit.
|
# Briefly flash when hit.
|
||||||
# We shouldn't play this if we're dead.
|
# We shouldn't do this if we're dead.
|
||||||
if self.hitpoints > 0:
|
if self.hitpoints > 0:
|
||||||
|
|
||||||
self.node.handlemessage('flash')
|
self.node.handlemessage('flash')
|
||||||
|
|
@ -810,7 +819,7 @@ class HotPotato(ba.TeamGameActivity[Player, ba.Team]):
|
||||||
ba.playsound(sound, 1.0, new_victim.actor.node.position)
|
ba.playsound(sound, 1.0, new_victim.actor.node.position)
|
||||||
self.mark(new_victim)
|
self.mark(new_victim)
|
||||||
|
|
||||||
# This function is called the gamemode first loads.
|
# This function is called when the gamemode first loads.
|
||||||
def on_begin(self) -> None:
|
def on_begin(self) -> None:
|
||||||
super().on_begin() # Do standard gamemode on_begin behavior
|
super().on_begin() # Do standard gamemode on_begin behavior
|
||||||
|
|
||||||
|
|
@ -822,7 +831,7 @@ class HotPotato(ba.TeamGameActivity[Player, ba.Team]):
|
||||||
self.match_placement.append(self.players[0].team)
|
self.match_placement.append(self.players[0].team)
|
||||||
self._round_end_timer = ba.Timer(0.5, self.end_game)
|
self._round_end_timer = ba.Timer(0.5, self.end_game)
|
||||||
else:
|
else:
|
||||||
# Pick a random player(s) to get marked
|
# Pick random player(s) to get marked
|
||||||
self.new_mark_timer = ba.Timer(2.0 if self.slow_motion else 5.2, ba.Call(self.new_mark))
|
self.new_mark_timer = ba.Timer(2.0 if self.slow_motion else 5.2, ba.Call(self.new_mark))
|
||||||
|
|
||||||
self._update_icons() # Create player state icons
|
self._update_icons() # Create player state icons
|
||||||
|
|
@ -861,7 +870,7 @@ class HotPotato(ba.TeamGameActivity[Player, ba.Team]):
|
||||||
tip = tip.text
|
tip = tip.text
|
||||||
assert isinstance(tip, str)
|
assert isinstance(tip, str)
|
||||||
|
|
||||||
# Do a few substitutions.
|
# Do a few replacements.
|
||||||
tip_lstr = Lstr(translate=('tips', tip),
|
tip_lstr = Lstr(translate=('tips', tip),
|
||||||
subs=[('${PICKUP}',
|
subs=[('${PICKUP}',
|
||||||
ba.charstr(SpecialChar.TOP_BUTTON))])
|
ba.charstr(SpecialChar.TOP_BUTTON))])
|
||||||
|
|
@ -955,10 +964,11 @@ class HotPotato(ba.TeamGameActivity[Player, ba.Team]):
|
||||||
|
|
||||||
player.set_state(PlayerState.ELIMINATED)
|
player.set_state(PlayerState.ELIMINATED)
|
||||||
|
|
||||||
|
# This function is called every time a player spawns
|
||||||
def spawn_player(self, player: Player) -> ba.Actor:
|
def spawn_player(self, player: Player) -> ba.Actor:
|
||||||
position = self.map.get_ffa_start_position(self.players)
|
position = self.map.get_ffa_start_position(self.players)
|
||||||
position = (position[0],
|
position = (position[0],
|
||||||
position[1] - 0.3,
|
position[1] - 0.3, # Move the spawn a bit lower
|
||||||
position[2])
|
position[2])
|
||||||
|
|
||||||
name = player.getname()
|
name = player.getname()
|
||||||
|
|
@ -966,18 +976,19 @@ class HotPotato(ba.TeamGameActivity[Player, ba.Team]):
|
||||||
light_color = ba.normalized_color(player.color)
|
light_color = ba.normalized_color(player.color)
|
||||||
display_color = ba.safecolor(player.color, target_intensity=0.75)
|
display_color = ba.safecolor(player.color, target_intensity=0.75)
|
||||||
|
|
||||||
|
# Here we actually crate the player character
|
||||||
spaz = PotatoPlayerSpaz(color=player.color,
|
spaz = PotatoPlayerSpaz(color=player.color,
|
||||||
highlight=player.highlight,
|
highlight=player.highlight,
|
||||||
character=player.character,
|
character=player.character,
|
||||||
player=player)
|
player=player)
|
||||||
spaz.node.invincible = False
|
spaz.node.invincible = False # Immediately turn off invincibility
|
||||||
player.actor = spaz
|
player.actor = spaz # Assign player character to the owner
|
||||||
|
|
||||||
spaz.node.name = name
|
spaz.node.name = name
|
||||||
spaz.node.name_color = display_color
|
spaz.node.name_color = display_color
|
||||||
spaz.connect_controls_to_player()
|
spaz.connect_controls_to_player()
|
||||||
|
|
||||||
# move to the stand position and add a flash of light
|
# Move to the stand position and add a flash of light
|
||||||
spaz.handlemessage(ba.StandMessage(position, random.uniform(0, 360)))
|
spaz.handlemessage(ba.StandMessage(position, random.uniform(0, 360)))
|
||||||
t = ba.time(ba.TimeType.BASE)
|
t = ba.time(ba.TimeType.BASE)
|
||||||
ba.playsound(self._spawn_sound, 1.0, position=spaz.node.position)
|
ba.playsound(self._spawn_sound, 1.0, position=spaz.node.position)
|
||||||
|
|
@ -988,15 +999,17 @@ class HotPotato(ba.TeamGameActivity[Player, ba.Team]):
|
||||||
0.5: 0})
|
0.5: 0})
|
||||||
ba.timer(0.5, light.delete)
|
ba.timer(0.5, light.delete)
|
||||||
|
|
||||||
|
# Game reacts to various events
|
||||||
def handlemessage(self, msg: Any) -> Any:
|
def handlemessage(self, msg: Any) -> Any:
|
||||||
|
# This is called if the player dies.
|
||||||
if isinstance(msg, ba.PlayerDiedMessage):
|
if isinstance(msg, ba.PlayerDiedMessage):
|
||||||
super().handlemessage(msg)
|
super().handlemessage(msg) #
|
||||||
player = msg.getplayer(Player)
|
player = msg.getplayer(Player)
|
||||||
|
|
||||||
# If a player gets eliminated, don't respawn
|
# If a player gets eliminated, don't respawn
|
||||||
if msg.how == 'marked_elimination': return
|
if msg.how == 'marked_elimination': return
|
||||||
|
|
||||||
self.spawn_player(player)
|
self.spawn_player(player) # Spawn a new player character
|
||||||
|
|
||||||
# If a REGULAR player dies, they respawn STUNNED.
|
# If a REGULAR player dies, they respawn STUNNED.
|
||||||
# If a STUNNED player dies, reapply all visual effects.
|
# If a STUNNED player dies, reapply all visual effects.
|
||||||
|
|
@ -1007,11 +1020,19 @@ class HotPotato(ba.TeamGameActivity[Player, ba.Team]):
|
||||||
if player.state == PlayerState.MARKED:
|
if player.state == PlayerState.MARKED:
|
||||||
self.mark(player)
|
self.mark(player)
|
||||||
|
|
||||||
|
# This is called when we want to end the game and announce a victor
|
||||||
def end_game(self) -> None:
|
def end_game(self) -> None:
|
||||||
|
# Proceed only if the game hasn't ended yet.
|
||||||
if self.has_ended():
|
if self.has_ended():
|
||||||
return
|
return
|
||||||
results = ba.GameResults()
|
results = ba.GameResults()
|
||||||
|
# By this point our match placement list should be filled with all players.
|
||||||
|
# Players that died/left earliest should be the first entries.
|
||||||
|
# We're gonna use array indexes to decide match placements.
|
||||||
|
# Because of that, we're gonna flip the order of our array, so the last entries are first.
|
||||||
self.match_placement.reverse()
|
self.match_placement.reverse()
|
||||||
for team in self.teams:
|
for team in self.teams:
|
||||||
|
# Use each player's index in the array for our scoring
|
||||||
|
# 0 is the first index, so we add 1 to the score.
|
||||||
results.set_team_score(team, self.match_placement.index(team) + 1)
|
results.set_team_score(team, self.match_placement.index(team) + 1)
|
||||||
self.end(results=results)
|
self.end(results=results) # Standard game ending behavior
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue