From 22c97baf01f95e00331debd4ddeb156818421496 Mon Sep 17 00:00:00 2001 From: indev Date: Wed, 8 Apr 2020 10:02:13 +0300 Subject: [PATCH 1/5] =?UTF-8?q?In=20actors:=20all=20=5Fhandle=5Fmessage=5F?= =?UTF-8?q?sanity=5Fcheck=20called=20only=20if=20=5F=5Fdebug=5F=5F=20In=20?= =?UTF-8?q?games:=20all=20get=5Fteam()=20replaced=20by=20team=20(idk=20why?= =?UTF-8?q?=20=C2=AF\=5F(=E3=83=84)=5F/=C2=AF)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- assets/src/ba_data/python/bastd/actor/bomb.py | 3 ++- assets/src/ba_data/python/bastd/actor/flag.py | 3 ++- assets/src/ba_data/python/bastd/actor/playerspaz.py | 3 ++- assets/src/ba_data/python/bastd/actor/powerupbox.py | 3 ++- assets/src/ba_data/python/bastd/actor/spazbot.py | 3 ++- assets/src/ba_data/python/bastd/game/assault.py | 2 +- assets/src/ba_data/python/bastd/game/capturetheflag.py | 9 +++++---- assets/src/ba_data/python/bastd/game/conquest.py | 8 ++++---- assets/src/ba_data/python/bastd/game/hockey.py | 2 +- assets/src/ba_data/python/bastd/game/race.py | 6 +++--- 10 files changed, 24 insertions(+), 18 deletions(-) diff --git a/assets/src/ba_data/python/bastd/actor/bomb.py b/assets/src/ba_data/python/bastd/actor/bomb.py index 3d520d4a..460d97a9 100644 --- a/assets/src/ba_data/python/bastd/actor/bomb.py +++ b/assets/src/ba_data/python/bastd/actor/bomb.py @@ -594,7 +594,8 @@ class Blast(ba.Actor): ba.timer(0.4, _extra_debris_sound) def handlemessage(self, msg: Any) -> Any: - self._handlemessage_sanity_check() + if __debug__: + self._handlemessage_sanity_check() if isinstance(msg, ba.DieMessage): if self.node: diff --git a/assets/src/ba_data/python/bastd/actor/flag.py b/assets/src/ba_data/python/bastd/actor/flag.py index 6ef08a63..b51d7c91 100644 --- a/assets/src/ba_data/python/bastd/actor/flag.py +++ b/assets/src/ba_data/python/bastd/actor/flag.py @@ -333,7 +333,8 @@ class Flag(ba.Actor): 1.0, ba.WeakCall(self._hide_score_text)) def handlemessage(self, msg: Any) -> Any: - self._handlemessage_sanity_check() + if __debug__: + self._handlemessage_sanity_check() if isinstance(msg, ba.DieMessage): if self.node: self.node.delete() diff --git a/assets/src/ba_data/python/bastd/actor/playerspaz.py b/assets/src/ba_data/python/bastd/actor/playerspaz.py index 1034c17b..789ba434 100644 --- a/assets/src/ba_data/python/bastd/actor/playerspaz.py +++ b/assets/src/ba_data/python/bastd/actor/playerspaz.py @@ -221,7 +221,8 @@ class PlayerSpaz(Spaz): # pylint: disable=too-many-branches # pylint: disable=too-many-statements # pylint: disable=too-many-nested-blocks - self._handlemessage_sanity_check() + if __debug__: + self._handlemessage_sanity_check() # Keep track of if we're being held and by who most recently. if isinstance(msg, ba.PickedUpMessage): diff --git a/assets/src/ba_data/python/bastd/actor/powerupbox.py b/assets/src/ba_data/python/bastd/actor/powerupbox.py index ffd9ef4e..4f701445 100644 --- a/assets/src/ba_data/python/bastd/actor/powerupbox.py +++ b/assets/src/ba_data/python/bastd/actor/powerupbox.py @@ -289,7 +289,8 @@ class PowerupBox(ba.Actor): def handlemessage(self, msg: Any) -> Any: # pylint: disable=too-many-branches - self._handlemessage_sanity_check() + if __debug__: + self._handlemessage_sanity_check() if isinstance(msg, ba.PowerupAcceptMessage): factory = get_factory() diff --git a/assets/src/ba_data/python/bastd/actor/spazbot.py b/assets/src/ba_data/python/bastd/actor/spazbot.py index c3e7e639..ca1a9fc0 100644 --- a/assets/src/ba_data/python/bastd/actor/spazbot.py +++ b/assets/src/ba_data/python/bastd/actor/spazbot.py @@ -513,7 +513,8 @@ class SpazBot(basespaz.Spaz): def handlemessage(self, msg: Any) -> Any: # pylint: disable=too-many-branches - self._handlemessage_sanity_check() + if __debug__: + self._handlemessage_sanity_check() # Keep track of if we're being held and by who most recently. if isinstance(msg, ba.PickedUpMessage): diff --git a/assets/src/ba_data/python/bastd/game/assault.py b/assets/src/ba_data/python/bastd/game/assault.py index 2a3d06f6..4777ffed 100644 --- a/assets/src/ba_data/python/bastd/game/assault.py +++ b/assets/src/ba_data/python/bastd/game/assault.py @@ -176,7 +176,7 @@ class AssaultGame(ba.TeamGameActivity): return # If its another team's player, they scored. - player_team = player.get_team() + player_team = player.team if player_team is not team: # Prevent multiple simultaneous scores. diff --git a/assets/src/ba_data/python/bastd/game/capturetheflag.py b/assets/src/ba_data/python/bastd/game/capturetheflag.py index 8227854b..83530362 100644 --- a/assets/src/ba_data/python/bastd/game/capturetheflag.py +++ b/assets/src/ba_data/python/bastd/game/capturetheflag.py @@ -63,7 +63,8 @@ class CTFFlag(stdflag.Flag): self.touch_return_time = float( self.activity.settings['Flag Touch Return Time']) - def get_team(self) -> ba.Team: + @property + def team(self) -> ba.Team: """return the flag's team.""" return self._team @@ -224,7 +225,7 @@ class CaptureTheFlagGame(ba.TeamGameActivity): flag = ba.get_collision_info("opposing_node").getdelegate() assert isinstance(flag, CTFFlag) - if flag.get_team() is team: + if flag.team is team: team.gamedata['home_flag_at_base'] = True # If the enemy flag is already here, score! @@ -331,7 +332,7 @@ class CaptureTheFlagGame(ba.TeamGameActivity): except Exception: return # Can happen when we kill a flag. - if flag.get_team() is team: + if flag.team is team: # Check times here to prevent too much flashing. if ('last_flag_leave_time' not in team.gamedata @@ -487,7 +488,7 @@ class CaptureTheFlagGame(ba.TeamGameActivity): elif isinstance(msg, stdflag.FlagDeathMessage): assert isinstance(msg.flag, CTFFlag) ba.timer(0.1, - ba.Call(self._spawn_flag_for_team, msg.flag.get_team())) + ba.Call(self._spawn_flag_for_team, msg.flag.team)) elif isinstance(msg, stdflag.FlagPickedUpMessage): # Store the last player to hold the flag for scoring purposes. assert isinstance(msg.flag, CTFFlag) diff --git a/assets/src/ba_data/python/bastd/game/conquest.py b/assets/src/ba_data/python/bastd/game/conquest.py index 9c5fb10f..7509f92e 100644 --- a/assets/src/ba_data/python/bastd/game/conquest.py +++ b/assets/src/ba_data/python/bastd/game/conquest.py @@ -228,10 +228,10 @@ class ConquestGame(ba.TeamGameActivity): except Exception: return # Player may have left and his body hit the flag. - if flag.get_team() is not player.get_team(): - flag.set_team(player.get_team()) - flag.light.color = player.get_team().color - flag.node.color = player.get_team().color + if flag.team is not player.team: + flag.set_team(player.team) + flag.light.color = player.team.color + flag.node.color = player.team.color self.stats.player_scored(player, 10, screenmessage=False) ba.playsound(self._swipsound) self._flash_flag(flag) diff --git a/assets/src/ba_data/python/bastd/game/hockey.py b/assets/src/ba_data/python/bastd/game/hockey.py index 3a778a33..7fae6d79 100644 --- a/assets/src/ba_data/python/bastd/game/hockey.py +++ b/assets/src/ba_data/python/bastd/game/hockey.py @@ -255,7 +255,7 @@ class HockeyGame(ba.TeamGameActivity): except Exception: player = puck = None if player and puck: - puck.last_players_to_touch[player.get_team().get_id()] = player + puck.last_players_to_touch[player.team.get_id()] = player def _kill_puck(self) -> None: self._puck = None diff --git a/assets/src/ba_data/python/bastd/game/race.py b/assets/src/ba_data/python/bastd/game/race.py index f4d1de6f..1169a312 100644 --- a/assets/src/ba_data/python/bastd/game/race.py +++ b/assets/src/ba_data/python/bastd/game/race.py @@ -241,7 +241,7 @@ class RaceGame(ba.TeamGameActivity): player.gamedata['last_region'] = this_region if last_region >= len(self._regions) - 2 and this_region == 0: - team = player.get_team() + team = player.team player.gamedata['lap'] = min(self.settings['Laps'], player.gamedata['lap'] + 1) @@ -283,10 +283,10 @@ class RaceGame(ba.TeamGameActivity): # If the whole team has finished the race. if team.gamedata['lap'] == self.settings['Laps']: ba.playsound(self._score_sound) - player.get_team().gamedata['finished'] = True + player.team.gamedata['finished'] = True assert self._timer is not None self._last_team_time = ( - player.get_team().gamedata['time']) = ( + player.team.gamedata['time']) = ( ba.time() - self._timer.getstarttime()) self._check_end_game() From e109c51bf70f974036dbfc84d09ee4c99aadf11a Mon Sep 17 00:00:00 2001 From: indev Date: Wed, 8 Apr 2020 10:26:39 +0300 Subject: [PATCH 2/5] Tests passed --- assets/src/ba_data/python/bastd/actor/flag.py | 1 + assets/src/ba_data/python/bastd/actor/powerupbox.py | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/assets/src/ba_data/python/bastd/actor/flag.py b/assets/src/ba_data/python/bastd/actor/flag.py index b51d7c91..38051312 100644 --- a/assets/src/ba_data/python/bastd/actor/flag.py +++ b/assets/src/ba_data/python/bastd/actor/flag.py @@ -333,6 +333,7 @@ class Flag(ba.Actor): 1.0, ba.WeakCall(self._hide_score_text)) def handlemessage(self, msg: Any) -> Any: + # pylint: disable=too-many-branches if __debug__: self._handlemessage_sanity_check() if isinstance(msg, ba.DieMessage): diff --git a/assets/src/ba_data/python/bastd/actor/powerupbox.py b/assets/src/ba_data/python/bastd/actor/powerupbox.py index 4f701445..513cfbea 100644 --- a/assets/src/ba_data/python/bastd/actor/powerupbox.py +++ b/assets/src/ba_data/python/bastd/actor/powerupbox.py @@ -290,7 +290,7 @@ class PowerupBox(ba.Actor): def handlemessage(self, msg: Any) -> Any: # pylint: disable=too-many-branches if __debug__: - self._handlemessage_sanity_check() + self._handlemessage_sanity_check() if isinstance(msg, ba.PowerupAcceptMessage): factory = get_factory() From ac7d79c7bfdcaaced8214b6c5d0d83992546ebb3 Mon Sep 17 00:00:00 2001 From: indev Date: Wed, 8 Apr 2020 13:12:52 +0300 Subject: [PATCH 3/5] Temp solution for bots' AI --- assets/src/ba_data/python/bastd/actor/spazbot.py | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/assets/src/ba_data/python/bastd/actor/spazbot.py b/assets/src/ba_data/python/bastd/actor/spazbot.py index ca1a9fc0..8729426f 100644 --- a/assets/src/ba_data/python/bastd/actor/spazbot.py +++ b/assets/src/ba_data/python/bastd/actor/spazbot.py @@ -23,6 +23,7 @@ from __future__ import annotations +import math import random import weakref from typing import TYPE_CHECKING @@ -41,6 +42,13 @@ DEFAULT_BOT_HIGHLIGHT = (0.1, 0.3, 0.1) PRO_BOT_COLOR = (1.0, 0.2, 0.1) PRO_BOT_HIGHLIGHT = (0.6, 0.1, 0.05) +def _my_vec3_dist(vec1: Tuple[float], vec2: Tuple[float]) -> float: + # FIXME - this solution works, + xlen = vec1[0] - vec2[0] + ylen = vec1[1] - vec2[1] + zlen = vec1[2] - vec2[2] + xylen = math.sqrt(xlen**2 + ylen**2) + return math.sqrt(xylen**2 + zlen**2) class SpazBotPunchedMessage: """A message saying a ba.SpazBot got punched. @@ -192,7 +200,7 @@ class SpazBot(basespaz.Spaz): closest = None assert self._player_pts is not None for plpt, plvel in self._player_pts: - dist = (plpt - botpt).length() + dist = _my_vec3_dist((plpt.x, plpt.y, plpt.z), (botpt.x, botpt.y, botpt.z)) # Ignore player-points that are significantly below the bot # (keeps bots from following players off cliffs). @@ -208,7 +216,7 @@ class SpazBot(basespaz.Spaz): ba.Vec3(closest_vel[0], closest_vel[1], closest_vel[2])) return None, None - def set_player_points(self, pts: List[Tuple[ba.Vec3, ba.Vec3]]) -> None: + def set_player_points(self, pts: List[Tuple[ba.Vec3, ba.Vec3]]) -> None: """Provide the spaz-bot with the locations of its enemies.""" self._player_pts = pts @@ -324,7 +332,7 @@ class SpazBot(basespaz.Spaz): target_vel * dist_raw * 0.3 * self._lead_amount) diff = (target_pt - our_pos) - dist = diff.length() + dist = _my_vec3_dist((target_pt.x, target_pt.y, target_pt.z), (our_pos.x, our_pos.y, our_pos.z)) to_target = diff.normalized() if self._mode == 'throw': From defbcd1e55331372f9f69a76e619c6f9856aff04 Mon Sep 17 00:00:00 2001 From: indev Date: Wed, 8 Apr 2020 16:00:00 +0300 Subject: [PATCH 4/5] Fixed bots' AI --- assets/src/ba_data/python/bastd/actor/spazbot.py | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/assets/src/ba_data/python/bastd/actor/spazbot.py b/assets/src/ba_data/python/bastd/actor/spazbot.py index 8729426f..8f3b5d21 100644 --- a/assets/src/ba_data/python/bastd/actor/spazbot.py +++ b/assets/src/ba_data/python/bastd/actor/spazbot.py @@ -42,8 +42,7 @@ DEFAULT_BOT_HIGHLIGHT = (0.1, 0.3, 0.1) PRO_BOT_COLOR = (1.0, 0.2, 0.1) PRO_BOT_HIGHLIGHT = (0.6, 0.1, 0.05) -def _my_vec3_dist(vec1: Tuple[float], vec2: Tuple[float]) -> float: - # FIXME - this solution works, +def distance(vec1: Tuple[float], vec2: Tuple[float]) -> float: xlen = vec1[0] - vec2[0] ylen = vec1[1] - vec2[1] zlen = vec1[2] - vec2[2] @@ -200,7 +199,7 @@ class SpazBot(basespaz.Spaz): closest = None assert self._player_pts is not None for plpt, plvel in self._player_pts: - dist = _my_vec3_dist((plpt.x, plpt.y, plpt.z), (botpt.x, botpt.y, botpt.z)) + dist = distance((plpt.x, plpt.y, plpt.z), (botpt.x, botpt.y, botpt.z)) # Ignore player-points that are significantly below the bot # (keeps bots from following players off cliffs). @@ -264,7 +263,7 @@ class SpazBot(basespaz.Spaz): target_pt_raw = ba.Vec3(*self.target_flag.node.position) diff = (target_pt_raw - our_pos) diff = ba.Vec3(diff[0], 0, diff[2]) # don't care about y - dist = diff.length() + dist = distance((target_pt_raw.x, 0, target_pt_raw.z), (our_pos.x, 0, our_pos.z)) to_target = diff.normalized() # If we're holding some non-flag item, drop it. @@ -332,7 +331,7 @@ class SpazBot(basespaz.Spaz): target_vel * dist_raw * 0.3 * self._lead_amount) diff = (target_pt - our_pos) - dist = _my_vec3_dist((target_pt.x, target_pt.y, target_pt.z), (our_pos.x, our_pos.y, our_pos.z)) + dist = distance((target_pt.x, target_pt.y, target_pt.z), (our_pos.x, our_pos.y, our_pos.z)) to_target = diff.normalized() if self._mode == 'throw': From 51bae338f3b553deb9e3485b2e687ae6f32b1c60 Mon Sep 17 00:00:00 2001 From: indev Date: Wed, 8 Apr 2020 16:21:47 +0300 Subject: [PATCH 5/5] distance (_my_vec3_dist) moved to ba/_gameutils.py Tests passed --- assets/src/ba_data/python/ba/__init__.py | 2 +- assets/src/ba_data/python/ba/_gameutils.py | 11 ++++++++- .../src/ba_data/python/bastd/actor/spazbot.py | 24 +++++++++---------- 3 files changed, 22 insertions(+), 15 deletions(-) diff --git a/assets/src/ba_data/python/ba/__init__.py b/assets/src/ba_data/python/ba/__init__.py index 1f5b4455..9ba8db99 100644 --- a/assets/src/ba_data/python/ba/__init__.py +++ b/assets/src/ba_data/python/ba/__init__.py @@ -69,7 +69,7 @@ from ba._appdelegate import AppDelegate from ba._apputils import is_browser_likely_available from ba._campaign import Campaign from ba._gameutils import (animate, animate_array, show_damage_count, - sharedobj, timestring, cameraflash) + sharedobj, timestring, cameraflash, distance) from ba._general import WeakCall, Call from ba._level import Level from ba._lobby import Lobby, Chooser diff --git a/assets/src/ba_data/python/ba/_gameutils.py b/assets/src/ba_data/python/ba/_gameutils.py index 059eef51..c2691fe5 100644 --- a/assets/src/ba_data/python/ba/_gameutils.py +++ b/assets/src/ba_data/python/ba/_gameutils.py @@ -22,12 +22,13 @@ from __future__ import annotations from typing import TYPE_CHECKING +import math import _ba from ba._enums import TimeType, TimeFormat, SpecialChar if TYPE_CHECKING: - from typing import Any, Dict, Sequence + from typing import Any, Dict, Sequence, Tuple import ba TROPHY_CHARS = { @@ -46,6 +47,14 @@ def get_trophy_string(trophy_id: str) -> str: return _ba.charstr(TROPHY_CHARS[trophy_id]) return '?' +def distance(vec1: Tuple[float, float, float], + vec2: Tuple[float, float, float]) -> float: + """Find distance between two positions""" + xlen = vec1[0] - vec2[0] + ylen = vec1[1] - vec2[1] + zlen = vec1[2] - vec2[2] + xylen = math.sqrt(xlen**2 + ylen**2) + return math.sqrt(xylen**2 + zlen**2) def sharedobj(name: str) -> Any: """Return a predefined object for the current Activity, creating if needed. diff --git a/assets/src/ba_data/python/bastd/actor/spazbot.py b/assets/src/ba_data/python/bastd/actor/spazbot.py index 8f3b5d21..06ea548d 100644 --- a/assets/src/ba_data/python/bastd/actor/spazbot.py +++ b/assets/src/ba_data/python/bastd/actor/spazbot.py @@ -23,12 +23,12 @@ from __future__ import annotations -import math import random import weakref from typing import TYPE_CHECKING import ba +from ba import distance from bastd.actor import spaz as basespaz if TYPE_CHECKING: @@ -42,13 +42,6 @@ DEFAULT_BOT_HIGHLIGHT = (0.1, 0.3, 0.1) PRO_BOT_COLOR = (1.0, 0.2, 0.1) PRO_BOT_HIGHLIGHT = (0.6, 0.1, 0.05) -def distance(vec1: Tuple[float], vec2: Tuple[float]) -> float: - xlen = vec1[0] - vec2[0] - ylen = vec1[1] - vec2[1] - zlen = vec1[2] - vec2[2] - xylen = math.sqrt(xlen**2 + ylen**2) - return math.sqrt(xylen**2 + zlen**2) - class SpazBotPunchedMessage: """A message saying a ba.SpazBot got punched. @@ -199,8 +192,9 @@ class SpazBot(basespaz.Spaz): closest = None assert self._player_pts is not None for plpt, plvel in self._player_pts: - dist = distance((plpt.x, plpt.y, plpt.z), (botpt.x, botpt.y, botpt.z)) - + dist = distance( + (plpt.x, plpt.y, plpt.z), + (botpt.x, botpt.y, botpt.z)) # Ignore player-points that are significantly below the bot # (keeps bots from following players off cliffs). if (closest_dist is None @@ -215,7 +209,7 @@ class SpazBot(basespaz.Spaz): ba.Vec3(closest_vel[0], closest_vel[1], closest_vel[2])) return None, None - def set_player_points(self, pts: List[Tuple[ba.Vec3, ba.Vec3]]) -> None: + def set_player_points(self, pts: List[Tuple[ba.Vec3, ba.Vec3]]) -> None: """Provide the spaz-bot with the locations of its enemies.""" self._player_pts = pts @@ -263,7 +257,9 @@ class SpazBot(basespaz.Spaz): target_pt_raw = ba.Vec3(*self.target_flag.node.position) diff = (target_pt_raw - our_pos) diff = ba.Vec3(diff[0], 0, diff[2]) # don't care about y - dist = distance((target_pt_raw.x, 0, target_pt_raw.z), (our_pos.x, 0, our_pos.z)) + dist = distance( + (target_pt_raw.x, 0, target_pt_raw.z), + (our_pos.x, 0, our_pos.z)) to_target = diff.normalized() # If we're holding some non-flag item, drop it. @@ -331,7 +327,9 @@ class SpazBot(basespaz.Spaz): target_vel * dist_raw * 0.3 * self._lead_amount) diff = (target_pt - our_pos) - dist = distance((target_pt.x, target_pt.y, target_pt.z), (our_pos.x, our_pos.y, our_pos.z)) + dist = distance( + (target_pt.x, target_pt.y, target_pt.z), + (our_pos.x, our_pos.y, our_pos.z)) to_target = diff.normalized() if self._mode == 'throw':