diff --git a/.efrocachemap b/.efrocachemap
index ff706cf7..e5cd40b8 100644
--- a/.efrocachemap
+++ b/.efrocachemap
@@ -1670,6 +1670,10 @@
"assets/build/ba_data/textures/iconRunaround.ktx": "https://files.ballistica.net/cache/ba1/6e/66/c5741e7805801c46c18df2f86c9a",
"assets/build/ba_data/textures/iconRunaround.pvr": "https://files.ballistica.net/cache/ba1/54/e9/55a73bde307c0c7cb386c06837ac",
"assets/build/ba_data/textures/iconRunaround_preview.png": "https://files.ballistica.net/cache/ba1/2b/09/82799554bb223e4ffba1aeb3dc81",
+ "assets/build/ba_data/textures/iircadeLogo.dds": "https://files.ballistica.net/cache/ba1/d1/e3/2f27a82cd5e5c69f78a3bac30ab5",
+ "assets/build/ba_data/textures/iircadeLogo.ktx": "https://files.ballistica.net/cache/ba1/58/b9/848fbac7a1c7ad6a9b2efd758ff1",
+ "assets/build/ba_data/textures/iircadeLogo.pvr": "https://files.ballistica.net/cache/ba1/19/ba/66f832c978d9cf46f991e4811401",
+ "assets/build/ba_data/textures/iircadeLogo_preview.png": "https://files.ballistica.net/cache/ba1/c7/d6/0740136951cbc17907f6192357b2",
"assets/build/ba_data/textures/impactBombColor.dds": "https://files.ballistica.net/cache/ba1/70/54/c210c5ade9e3ba9a39b71631dc24",
"assets/build/ba_data/textures/impactBombColor.ktx": "https://files.ballistica.net/cache/ba1/fc/3b/e1051061b1ed03bcbfdc6b9f8c79",
"assets/build/ba_data/textures/impactBombColor.pvr": "https://files.ballistica.net/cache/ba1/d6/d9/0f81193db5aa44780ee8bb0943b9",
@@ -3930,14 +3934,14 @@
"assets/build/windows/Win32/vcruntime140d.dll": "https://files.ballistica.net/cache/ba1/50/8d/bc2600ac9491f1b14d659709451f",
"build/prefab/linux-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/3f/99/9b94f7d478142a08e02c769b64ba",
"build/prefab/linux-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/0d/f0/aed2b96addcc73e2de400aed2bdf",
- "build/prefab/linux/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/46/36/ebf2770d091219bbccac73d18d96",
- "build/prefab/linux/release/ballisticacore": "https://files.ballistica.net/cache/ba1/ea/78/2b6fa11738eefee4c65900543679",
- "build/prefab/mac-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/11/74/74dcfb32ee1d796230cfac867978",
- "build/prefab/mac-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/db/63/5067f6fae12feecaa181d4f13a4d",
- "build/prefab/mac/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/fe/d7/2abece41eae6a109583d75300528",
- "build/prefab/mac/release/ballisticacore": "https://files.ballistica.net/cache/ba1/ab/15/0ba36634e2d80e8bed3922a63b24",
- "build/prefab/windows-server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/a0/7f/587e6a6d3dece7669d09bd042701",
- "build/prefab/windows-server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/ad/4c/7b78e4c0a2e65a62fee7e38e34e7",
- "build/prefab/windows/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/c4/f8/1f8eee280877672da222c3397429",
- "build/prefab/windows/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/61/a7/7b8d223cef9f48fb58de41607009"
+ "build/prefab/linux/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/95/36/1850f9eda27c27700a928a220d01",
+ "build/prefab/linux/release/ballisticacore": "https://files.ballistica.net/cache/ba1/ec/51/8117cff653fd3d3e5e4f2da28cfb",
+ "build/prefab/mac-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/0b/1b/dc4328caa59881f3c7a18f4b71cd",
+ "build/prefab/mac-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/16/06/ce0ff5f88a22e9fd7daae113b229",
+ "build/prefab/mac/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/63/af/656a2860f87943d534fdb69386bd",
+ "build/prefab/mac/release/ballisticacore": "https://files.ballistica.net/cache/ba1/88/6a/fc189088a19d5b12d624e5b9521a",
+ "build/prefab/windows-server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/c5/9b/597a1666729e0a9ad347f8aab67d",
+ "build/prefab/windows-server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/ba/03/4a8dd4bb42754cdd2bbd23949f25",
+ "build/prefab/windows/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/46/b9/782ed1cea39bc38ae635dc21f4cd",
+ "build/prefab/windows/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/97/1d/9fdaf892813430d8e9b3ef6628a4"
}
\ No newline at end of file
diff --git a/.idea/dictionaries/ericf.xml b/.idea/dictionaries/ericf.xml
index 39f4e51a..5ebd5934 100644
--- a/.idea/dictionaries/ericf.xml
+++ b/.idea/dictionaries/ericf.xml
@@ -29,8 +29,8 @@
achname
achs
acinstance
- ack
ack'ed
+ ack
acked
acks
acnt
@@ -82,6 +82,7 @@
appkit
applescript
appletv
+ appmode
appname
appnameupper
appstate
@@ -150,8 +151,8 @@
bacommon
badguy
bafoundation
- ballistica
ballistica's
+ ballistica
ballisticacore
ballisticacorecb
bamaster
@@ -330,6 +331,7 @@
clionbin
clioncode
clionroot
+ cloudbuild
cloudshell
cloudshellbuild
cloudtool
@@ -791,8 +793,8 @@
gamedata
gameinstance
gamemap
- gamepad
gamepad's
+ gamepad
gamepadadvanced
gamepads
gamepadselect
@@ -949,6 +951,8 @@
idevices
ifeq
ifneq
+ iiarcade
+ iircade
ilang
ilck
ilogput
@@ -958,6 +962,7 @@
imagestacklayer
imagewidget
imaplib
+ imgdelay
imgh
imghdr
imgw
@@ -1172,8 +1177,8 @@
lsqlite
lssl
lstart
- lstr
lstr's
+ lstr
lstrs
lsval
ltex
@@ -1795,8 +1800,8 @@
sessionname
sessionplayer
sessionplayers
- sessionteam
sessionteam's
+ sessionteam
sessionteams
sessiontype
setactivity
@@ -2126,8 +2131,8 @@
txtw
typeargs
typecheck
- typechecker
typechecker's
+ typechecker
typedval
typeshed
typestr
@@ -2249,6 +2254,7 @@
wiimote
wiimotes
willeval
+ winbeast
wincfg
wincount
winempty
@@ -2271,6 +2277,7 @@
wref
writeclasses
writefuncs
+ wslpath
wtcolor
wtflib
wttxt
diff --git a/CHANGELOG.md b/CHANGELOG.md
index 37779695..11717dfc 100644
--- a/CHANGELOG.md
+++ b/CHANGELOG.md
@@ -1,5 +1,5 @@
### 1.5.26 (20178)
-- Simplified licensing header on python scripts.
+- Simplified licensing header on python scripts..
### 1.5.25 (20176)
- Added Venetian language (thanks Federico!)
diff --git a/assets/.asset_manifest_private.json b/assets/.asset_manifest_private.json
index 1bb8aa43..d96286e2 100644
--- a/assets/.asset_manifest_private.json
+++ b/assets/.asset_manifest_private.json
@@ -1688,6 +1688,10 @@
"ba_data/textures/iconRunaround.ktx",
"ba_data/textures/iconRunaround.pvr",
"ba_data/textures/iconRunaround_preview.png",
+ "ba_data/textures/iircadeLogo.dds",
+ "ba_data/textures/iircadeLogo.ktx",
+ "ba_data/textures/iircadeLogo.pvr",
+ "ba_data/textures/iircadeLogo_preview.png",
"ba_data/textures/impactBombColor.dds",
"ba_data/textures/impactBombColor.ktx",
"ba_data/textures/impactBombColor.pvr",
diff --git a/assets/Makefile b/assets/Makefile
index 93161fbf..784b3207 100644
--- a/assets/Makefile
+++ b/assets/Makefile
@@ -5361,6 +5361,7 @@ TEX2D_DDS_TARGETS = \
build/ba_data/textures/hockeyStadiumPreview.dds \
build/ba_data/textures/iconOnslaught.dds \
build/ba_data/textures/iconRunaround.dds \
+ build/ba_data/textures/iircadeLogo.dds \
build/ba_data/textures/impactBombColor.dds \
build/ba_data/textures/impactBombColorLit.dds \
build/ba_data/textures/inventoryIcon.dds \
@@ -5763,6 +5764,7 @@ TEX2D_PVR_TARGETS = \
build/ba_data/textures/hockeyStadiumPreview.pvr \
build/ba_data/textures/iconOnslaught.pvr \
build/ba_data/textures/iconRunaround.pvr \
+ build/ba_data/textures/iircadeLogo.pvr \
build/ba_data/textures/impactBombColor.pvr \
build/ba_data/textures/impactBombColorLit.pvr \
build/ba_data/textures/inventoryIcon.pvr \
@@ -6165,6 +6167,7 @@ TEX2D_KTX_TARGETS = \
build/ba_data/textures/hockeyStadiumPreview.ktx \
build/ba_data/textures/iconOnslaught.ktx \
build/ba_data/textures/iconRunaround.ktx \
+ build/ba_data/textures/iircadeLogo.ktx \
build/ba_data/textures/impactBombColor.ktx \
build/ba_data/textures/impactBombColorLit.ktx \
build/ba_data/textures/inventoryIcon.ktx \
@@ -6567,6 +6570,7 @@ TEX2D_PREVIEW_PNG_TARGETS = \
build/ba_data/textures/hockeyStadium_preview.png \
build/ba_data/textures/iconOnslaught_preview.png \
build/ba_data/textures/iconRunaround_preview.png \
+ build/ba_data/textures/iircadeLogo_preview.png \
build/ba_data/textures/impactBombColorLit_preview.png \
build/ba_data/textures/impactBombColor_preview.png \
build/ba_data/textures/inventoryIcon_preview.png \
@@ -6990,13 +6994,13 @@ build/ba_data/data/languages/%.json : ../.efrocachemap
build/ba_data/data/maps/%.json : ../.efrocachemap
@cd .. && tools/pcommand efrocache_get assets/$@
-src/%.tex2d.png : ../.efrocachemap
+src/ba_data/%.tex2d.png : ../.efrocachemap
@cd .. && tools/pcommand efrocache_get assets/$@
-src/%_+x.tex2d.png : ../.efrocachemap
+src/ba_data/%_+x.tex2d.png : ../.efrocachemap
@cd .. && tools/pcommand efrocache_get assets/$@
-build/%_preview.png : ../.efrocachemap
+build/ba_data/%_preview.png : ../.efrocachemap
@cd .. && tools/pcommand efrocache_get assets/$@
build/%.dds : ../.efrocachemap
diff --git a/assets/src/ba_data/python/ba/_app.py b/assets/src/ba_data/python/ba/_app.py
index 058fd1ac..d3a9936e 100644
--- a/assets/src/ba_data/python/ba/_app.py
+++ b/assets/src/ba_data/python/ba/_app.py
@@ -40,12 +40,14 @@ class App:
This value increases by at least 1 with each release of the game.
It is independent of the human readable ba.App.version string.
"""
- return self._build_number
+ assert isinstance(self._env['build_number'], int)
+ return self._env['build_number']
@property
def config_file_path(self) -> str:
"""Where the game's config file is stored on disk."""
- return self._config_file_path
+ assert isinstance(self._env['config_file_path'], str)
+ return self._env['config_file_path']
@property
def locale(self) -> str:
@@ -55,7 +57,8 @@ class App:
ba.App.language, which is the language the game is using
(which may differ from locale if the user sets a language, etc.)
"""
- return self._locale
+ assert isinstance(self._env['locale'], str)
+ return self._env['locale']
def can_display_language(self, language: str) -> bool:
"""Tell whether we can display a particular language.
@@ -107,7 +110,7 @@ class App:
'hi': 'Hindi'
}
- # Special case for Chinese: specific variations map to traditional.
+ # Special case for Chinese: map specific variations to traditional.
# (otherwise will map to 'Chinese' which is simplified)
if self.locale in ('zh_HANT', 'zh_TW'):
language = 'ChineseTraditional'
@@ -130,7 +133,9 @@ class App:
@property
def user_agent_string(self) -> str:
"""String containing various bits of info about OS/device/etc."""
- return self._user_agent_string
+ # return self._user_agent_string
+ assert isinstance(self._env['user_agent_string'], str)
+ return self._env['user_agent_string']
@property
def version(self) -> str:
@@ -140,7 +145,8 @@ class App:
string elements such as 'alpha', 'beta', 'test', etc.
If a numeric version is needed, use 'ba.App.build_number'.
"""
- return self._version
+ assert isinstance(self._env['version'], str)
+ return self._env['version']
@property
def debug_build(self) -> bool:
@@ -150,7 +156,8 @@ class App:
builds due to compiler optimizations being disabled and extra
checks being run.
"""
- return self._debug_build
+ assert isinstance(self._env['debug_build'], bool)
+ return self._env['debug_build']
@property
def test_build(self) -> bool:
@@ -159,22 +166,27 @@ class App:
Test mode enables extra checks and features that are useful for
release testing but which do not slow the game down significantly.
"""
- return self._test_build
+ assert isinstance(self._env['test_build'], bool)
+ return self._env['test_build']
@property
def python_directory_user(self) -> str:
"""Path where the app looks for custom user scripts."""
- return self._python_directory_user
+ assert isinstance(self._env['python_directory_user'], str)
+ return self._env['python_directory_user']
@property
def python_directory_app(self) -> str:
"""Path where the app looks for its bundled scripts."""
- return self._python_directory_app
+ assert isinstance(self._env['python_directory_app'], str)
+ return self._env['python_directory_app']
+ # return self._python_directory_app
@property
def python_directory_app_site(self) -> str:
"""Path containing pip packages bundled with the app."""
- return self._python_directory_app_site
+ assert isinstance(self._env['python_directory_app_site'], str)
+ return self._env['python_directory_app_site']
@property
def config(self) -> ba.AppConfig:
@@ -188,7 +200,8 @@ class App:
Examples are: 'mac', 'windows', android'.
"""
- return self._platform
+ assert isinstance(self._env['platform'], str)
+ return self._env['platform']
@property
def subplatform(self) -> str:
@@ -197,30 +210,33 @@ class App:
Can be empty. For the 'android' platform, subplatform may
be 'google', 'amazon', etc.
"""
- return self._subplatform
+ assert isinstance(self._env['subplatform'], str)
+ return self._env['subplatform']
@property
def api_version(self) -> int:
"""The game's api version.
- Only python modules and packages associated with the current api
- version will be detected by the game (see the ba_meta tag). This
- value will change whenever backward-incompatible changes are
- introduced to game apis; when that happens, scripts should be updated
- accordingly and set to target the new api.
+ Only Python modules and packages associated with the current API
+ version number will be detected by the game (see the ba_meta tag).
+ This value will change whenever backward-incompatible changes are
+ introduced to game APIs. When that happens, scripts should be updated
+ accordingly and set to target the new API version number.
"""
from ba._meta import CURRENT_API_VERSION
return CURRENT_API_VERSION
@property
def on_tv(self) -> bool:
- """Bool value for if the game is running on a TV."""
- return self._on_tv
+ """Whether the game is currently running on a TV."""
+ assert isinstance(self._env['on_tv'], bool)
+ return self._env['on_tv']
@property
def vr_mode(self) -> bool:
- """Bool value for if the game is running in VR."""
- return self._vr_mode
+ """Whether the game is currently running in VR."""
+ assert isinstance(self._env['vr_mode'], bool)
+ return self._env['vr_mode']
@property
def ui_bounds(self) -> Tuple[float, float, float, float]:
@@ -237,7 +253,7 @@ class App:
the single shared instance.
"""
# pylint: disable=too-many-statements
- from ba._music import MusicController
+ from ba._music import MusicSubsystem
from ba._ui import UI
# Config.
@@ -248,47 +264,19 @@ class App:
# refreshed/etc.
self.fg_state = 0
- # Environment stuff.
- # (pulling these into attrs so we can type-check them and provide docs)
- env = _ba.env()
- self._build_number: int = env['build_number']
- assert isinstance(self._build_number, int)
- self._config_file_path: str = env['config_file_path']
- assert isinstance(self._config_file_path, str)
- self._locale: str = env['locale']
- assert isinstance(self._locale, str)
- self._user_agent_string: str = env['user_agent_string']
- assert isinstance(self._user_agent_string, str)
- self._version: str = env['version']
- assert isinstance(self._version, str)
- self._debug_build: bool = env['debug_build']
- assert isinstance(self._debug_build, bool)
- self._test_build: bool = env['test_build']
- assert isinstance(self._test_build, bool)
- self._python_directory_user: str = env['python_directory_user']
- assert isinstance(self._python_directory_user, str)
- self._python_directory_app: str = env['python_directory_app']
- assert isinstance(self._python_directory_app, str)
- self._python_directory_app_site: str = env['python_directory_app_site']
- assert isinstance(self._python_directory_app_site, str)
- self._platform: str = env['platform']
- assert isinstance(self._platform, str)
- self._subplatform: str = env['subplatform']
- assert isinstance(self._subplatform, str)
- self._on_tv: bool = env['on_tv']
- assert isinstance(self._on_tv, bool)
- self._vr_mode: bool = env['vr_mode']
- assert isinstance(self._vr_mode, bool)
- self.protocol_version: int = env['protocol_version']
+ self._env = _ba.env()
+ self.protocol_version: int = self._env['protocol_version']
assert isinstance(self.protocol_version, int)
- self.toolbar_test: bool = env['toolbar_test']
+ self.toolbar_test: bool = self._env['toolbar_test']
assert isinstance(self.toolbar_test, bool)
- self.demo_mode: bool = env['demo_mode']
+ self.demo_mode: bool = self._env['demo_mode']
assert isinstance(self.demo_mode, bool)
- self.arcade_mode: bool = env['arcade_mode']
+ self.arcade_mode: bool = self._env['arcade_mode']
assert isinstance(self.arcade_mode, bool)
- self.headless_build: bool = env['headless_build']
- assert isinstance(self.headless_build, bool)
+ self.headless_mode: bool = self._env['headless_mode']
+ assert isinstance(self.headless_mode, bool)
+ self.iircade_mode: bool = self._env['iircade_mode']
+ assert isinstance(self.headless_mode, bool)
# Plugins.
self.potential_plugins: List[ba.PotentialPlugin] = []
@@ -335,7 +323,7 @@ class App:
self.attempted_first_ad = False
# Music.
- self.music = MusicController()
+ self.music = MusicSubsystem()
# Language.
self.language_target: Optional[_lang.AttrDict] = None
@@ -493,7 +481,7 @@ class App:
self.special_offer = config['pendingSpecialOffer']['o']
specialoffer.show_offer()
- if not self.headless_build:
+ if not self.headless_mode:
_ba.timer(3.0, check_special_offer, timetype=TimeType.REAL)
# Start scanning for things exposed via ba_meta.
@@ -501,7 +489,7 @@ class App:
# Auto-sign-in to a local account in a moment if we're set to.
def do_auto_sign_in() -> None:
- if self.headless_build or cfg.get('Auto Account State') == 'Local':
+ if self.headless_mode or cfg.get('Auto Account State') == 'Local':
_ba.sign_in('Local')
_ba.pushcall(do_auto_sign_in)
diff --git a/assets/src/ba_data/python/ba/_coopsession.py b/assets/src/ba_data/python/ba/_coopsession.py
index 3b4fc6b5..5e351854 100644
--- a/assets/src/ba_data/python/ba/_coopsession.py
+++ b/assets/src/ba_data/python/ba/_coopsession.py
@@ -25,7 +25,7 @@ class CoopSession(Session):
the computer and include functionality such as
high score lists.
- Attrs:
+ Attributes:
campaign
The ba.Campaign instance this Session represents, or None if
diff --git a/assets/src/ba_data/python/ba/_map.py b/assets/src/ba_data/python/ba/_map.py
index 1cacd8a4..bae3805b 100644
--- a/assets/src/ba_data/python/ba/_map.py
+++ b/assets/src/ba_data/python/ba/_map.py
@@ -108,7 +108,7 @@ def get_unowned_maps() -> List[str]:
"""
from ba import _store
unowned_maps: Set[str] = set()
- if not _ba.app.headless_build:
+ if not _ba.app.headless_mode:
for map_section in _store.get_store_layout()['maps']:
for mapitem in map_section['items']:
if not _ba.get_purchased(mapitem):
diff --git a/assets/src/ba_data/python/ba/_meta.py b/assets/src/ba_data/python/ba/_meta.py
index a09e47a0..40c50187 100644
--- a/assets/src/ba_data/python/ba/_meta.py
+++ b/assets/src/ba_data/python/ba/_meta.py
@@ -381,7 +381,7 @@ def get_unowned_game_types() -> Set[Type[ba.GameActivity]]:
try:
from ba import _store
unowned_games: Set[Type[ba.GameActivity]] = set()
- if not _ba.app.headless_build:
+ if not _ba.app.headless_mode:
for section in _store.get_store_layout()['minigames']:
for mname in section['items']:
if not _ba.get_purchased(mname):
diff --git a/assets/src/ba_data/python/ba/_music.py b/assets/src/ba_data/python/ba/_music.py
index 0e68de04..b60684a6 100644
--- a/assets/src/ba_data/python/ba/_music.py
+++ b/assets/src/ba_data/python/ba/_music.py
@@ -116,8 +116,8 @@ ASSET_SOUNDTRACK_ENTRIES: Dict[MusicType, AssetSoundtrackEntry] = {
}
-class MusicController:
- """Controller for overall music playback in the app.
+class MusicSubsystem:
+ """Subsystem for music playback in the app.
Category: App Classes
"""
diff --git a/assets/src/ba_data/python/ba/_score.py b/assets/src/ba_data/python/ba/_score.py
index be68a8e3..d1cbe52c 100644
--- a/assets/src/ba_data/python/ba/_score.py
+++ b/assets/src/ba_data/python/ba/_score.py
@@ -29,7 +29,7 @@ class ScoreConfig:
Category: Gameplay Classes
- Attrs:
+ Attributes:
label
A label show to the user for scores; 'Score', 'Time Survived', etc.
diff --git a/assets/src/ba_data/python/ba/_session.py b/assets/src/ba_data/python/ba/_session.py
index 2a066f4f..39cca9a7 100644
--- a/assets/src/ba_data/python/ba/_session.py
+++ b/assets/src/ba_data/python/ba/_session.py
@@ -28,7 +28,7 @@ class Session:
ba.Activity instances such as mini-games and score-screens, and for
maintaining state between them (players, teams, score tallies, etc).
- Attrs:
+ Attributes:
sessionteams
All the ba.SessionTeams in the Session. Most things should use the
diff --git a/assets/src/ba_data/python/ba/_stats.py b/assets/src/ba_data/python/ba/_stats.py
index 089f7a5f..47a7ec79 100644
--- a/assets/src/ba_data/python/ba/_stats.py
+++ b/assets/src/ba_data/python/ba/_stats.py
@@ -24,7 +24,7 @@ class PlayerScoredMessage:
Category: Message Classes
- Attrs:
+ Attributes:
score
The score value.
diff --git a/assets/src/ba_data/python/ba/_ui.py b/assets/src/ba_data/python/ba/_ui.py
index f6a16ccc..ac7dfaeb 100644
--- a/assets/src/ba_data/python/ba/_ui.py
+++ b/assets/src/ba_data/python/ba/_ui.py
@@ -1,6 +1,6 @@
# Released under the MIT License. See LICENSE for details.
#
-"""User interface functionality."""
+"""User interface related functionality."""
from __future__ import annotations
@@ -28,7 +28,7 @@ class UI:
self._uiscale: ba.UIScale
- interfacetype = env['interface_type']
+ interfacetype = env['ui_scale']
if interfacetype == 'large':
self._uiscale = UIScale.LARGE
elif interfacetype == 'medium':
@@ -36,7 +36,7 @@ class UI:
elif interfacetype == 'small':
self._uiscale = UIScale.SMALL
else:
- raise RuntimeError('Invalid UIScale value: {interfacetype}')
+ raise RuntimeError(f'Invalid UIScale value: {interfacetype}')
self.window_states: Dict = {} # FIXME: Kill this.
self.main_menu_selection: Optional[str] = None # FIXME: Kill this.
diff --git a/assets/src/ba_data/python/bastd/actor/flag.py b/assets/src/ba_data/python/bastd/actor/flag.py
index f238b29c..417a3d46 100644
--- a/assets/src/ba_data/python/bastd/actor/flag.py
+++ b/assets/src/ba_data/python/bastd/actor/flag.py
@@ -125,7 +125,7 @@ class FlagPickedUpMessage:
category: Message Classes
- Attrs:
+ Attributes:
flag
The ba.Flag that has been picked up.
@@ -143,7 +143,7 @@ class FlagDiedMessage:
category: Message Classes
- Attrs:
+ Attributes:
flag
The ba.Flag that died.
@@ -157,7 +157,7 @@ class FlagDroppedMessage:
category: Message Classes
- Attrs:
+ Attributes:
flag
The ba.Flag that was dropped.
diff --git a/assets/src/ba_data/python/bastd/mainmenu.py b/assets/src/ba_data/python/bastd/mainmenu.py
index d00ccdce..7a976816 100644
--- a/assets/src/ba_data/python/bastd/mainmenu.py
+++ b/assets/src/ba_data/python/bastd/mainmenu.py
@@ -130,6 +130,24 @@ class MainMenuActivity(ba.Activity[ba.Player, ba.Team]):
assert self.version.node
ba.animate(self.version.node, 'opacity', {2.3: 0, 3.0: 1.0})
+ # Show the iircade logo on our iircade build.
+ if app.iircade_mode:
+ img = ba.NodeActor(
+ ba.newnode('image',
+ attrs={
+ 'texture': ba.gettexture('iircadeLogo'),
+ 'attach': 'center',
+ 'scale': (250, 250),
+ 'position': (0, 0),
+ 'tilt_translate': 0.21,
+ 'absolute_scale': True
+ })).autoretain()
+ imgdelay = 0.0 if app.main_menu_did_initial_transition else 1.0
+ ba.animate(img.node, 'opacity', {
+ imgdelay + 1.5: 0.0,
+ imgdelay + 2.5: 1.0
+ })
+
# Throw in test build info.
self.beta_info = self.beta_info_2 = None
if app.test_build and not (app.demo_mode or app.arcade_mode):
diff --git a/docs/ba_module.md b/docs/ba_module.md
index 5ad4eb1a..ff4e81d9 100644
--- a/docs/ba_module.md
+++ b/docs/ba_module.md
@@ -1,5 +1,5 @@
-
last updated on 2020-09-11 for Ballistica version 1.5.25 build 20179
+last updated on 2020-09-17 for Ballistica version 1.5.26 build 20188
This page documents the Python classes and functions in the 'ba' module,
which are the ones most relevant to modding in Ballistica. If you come across something you feel should be included here or could be better explained, please let me know. Happy modding!
@@ -816,11 +816,11 @@ likely result in errors.
int
The game's api version.
- Only python modules and packages associated with the current api
- version will be detected by the game (see the ba_meta tag). This
- value will change whenever backward-incompatible changes are
- introduced to game apis; when that happens, scripts should be updated
- accordingly and set to target the new api.
+ Only Python modules and packages associated with the current API
+ version number will be detected by the game (see the ba_meta tag).
+ This value will change whenever backward-incompatible changes are
+ introduced to game APIs. When that happens, scripts should be updated
+ accordingly and set to target the new API version number.
@@ -869,7 +869,7 @@ likely result in errors.
bool
-Bool value for if the game is running on a TV.
+Whether the game is currently running on a TV.
@@ -933,7 +933,7 @@ likely result in errors.
bool
-Bool value for if the game is running in VR.
+Whether the game is currently running in VR.
diff --git a/tools/bacloud b/tools/bacloud
index 34e2c223..0b7ea780 100755
--- a/tools/bacloud
+++ b/tools/bacloud
@@ -48,7 +48,7 @@ class StateData:
class Response:
"""Response sent from the bacloud server to the client.
- Attrs:
+ Attributes:
message: If present, client should print this message before any other
response processing (including error handling) occurs.
message_end: end arg for message print() call.
diff --git a/tools/batools/build.py b/tools/batools/build.py
index 0cdbea18..259df7f0 100644
--- a/tools/batools/build.py
+++ b/tools/batools/build.py
@@ -33,11 +33,11 @@ PIP_REQUIREMENTS = [
PipRequirement(modulename='mypy', minversion=[0, 782]),
PipRequirement(modulename='yapf', minversion=[0, 30, 0]),
PipRequirement(modulename='cpplint', minversion=[1, 5, 4]),
+ PipRequirement(modulename='pytest', minversion=[6, 0, 2]),
PipRequirement(modulename='typing_extensions'),
PipRequirement(modulename='pytz'),
PipRequirement(modulename='yaml', pipname='PyYAML'),
PipRequirement(modulename='requests'),
- PipRequirement(modulename='pytest'),
]
# Parts of full-tests suite we only run on particular days.
@@ -225,7 +225,7 @@ def archive_old_builds(ssh_server: str, builds_dir: str,
for old_file in [f for f in files if f.startswith(prefix)][1:]:
files_to_archive.add(old_file)
- # Would be faster to package this into a single command but
+ # Would be more efficient to package this into a single command but
# this works.
for fname in sorted(files_to_archive):
print('Archiving ' + fname, file=sys.stderr)
@@ -252,12 +252,27 @@ def gen_fulltest_buildfile_android() -> None:
modes += modes
modes.append('prod')
+ # By default we cycle through build architectures for each flavor.
+ # However, for minor flavor with low risk of platform-dependent breakage
+ # we stick to a single one to keep disk space costs lower. (build files
+ # amount to several gigs per mode per flavor)
+ # UPDATE: Now that we have CPU time to spare, we simply always do 'arm64'
+ # or 'prod' depending on build type; this results in 1 or 4 architectures
+ # worth of build files per flavor instead of 8 (prod + 4 singles) and
+ # keeps our daily runs identical.
+ lightweight_flavors = {'template', 'arcade', 'demo', 'iircade'}
+
lines = []
- for i, flavor in enumerate(
+ for _i, flavor in enumerate(
sorted(os.listdir('ballisticacore-android/BallisticaCore/src'))):
if flavor == 'main' or flavor.startswith('.'):
continue
- mode = modes[(dayoffset + i) % len(modes)]
+
+ if flavor in lightweight_flavors:
+ mode = 'arm64'
+ else:
+ # mode = modes[(dayoffset + i) % len(modes)]
+ mode = 'prod'
lines.append('ANDROID_PLATFORM=' + flavor + ' ANDROID_MODE=' + mode +
' make android-cloud-build')
@@ -314,11 +329,11 @@ def gen_fulltest_buildfile_windows() -> None:
cfg3 = 'Release' if (dayoffset + 2) % 7 == 0 else 'Debug'
lines.append(f'WINDOWS_PROJECT= WINDOWS_PLATFORM={pval1} '
- f'WINDOWS_CONFIGURATION={cfg1} make windows-build')
+ f'WINDOWS_CONFIGURATION={cfg1} make windows-cloud-build')
lines.append(f'WINDOWS_PROJECT=Headless WINDOWS_PLATFORM={pval2} '
- f'WINDOWS_CONFIGURATION={cfg2} make windows-build')
+ f'WINDOWS_CONFIGURATION={cfg2} make windows-cloud-build')
lines.append(f'WINDOWS_PROJECT=Oculus WINDOWS_PLATFORM={pval3} '
- f'WINDOWS_CONFIGURATION={cfg3} make windows-build')
+ f'WINDOWS_CONFIGURATION={cfg3} make windows-cloud-build')
# Now add sparse tests that land on today.
if DO_SPARSE_TEST_BUILDS:
@@ -391,7 +406,7 @@ def gen_fulltest_buildfile_apple() -> None:
if extra == 'mac.package':
lines.append('make mac-package')
elif extra == 'mac.package.server':
- lines.append('make mac-server-package')
+ lines.append('make mac-cloud-server-package')
elif extra == 'mac.pylibs':
lines.append('tools/pcommand python_build_apple mac')
elif extra == 'mac.pylibs.debug':
@@ -510,7 +525,9 @@ def checkenv() -> None:
f'Alternately, "tools/pcommand install_pip_reqs"'
f' will update all pip requirements.')
if minver is not None:
- verlines = results.stdout.decode().splitlines()
+ # Note: some modules such as pytest print their version to stderr,
+ # so grab both.
+ verlines = (results.stdout + results.stderr).decode().splitlines()
if verlines[0].startswith('Cpplint fork'):
verlines = verlines[1:]
ver_line = verlines[0]
@@ -664,6 +681,7 @@ def update_docs_md(check: bool) -> None:
for fname in files:
if any(fname.endswith(ext) for ext in exts):
pysources.append(os.path.join(root, fname))
+ pysources.sort()
curhash = get_files_hash(pysources)
# Extract the current embedded hash.
diff --git a/tools/batools/updateproject.py b/tools/batools/updateproject.py
index 414739a1..eb4907ca 100755
--- a/tools/batools/updateproject.py
+++ b/tools/batools/updateproject.py
@@ -179,7 +179,6 @@ class Updater:
f'All {unchanged_project_count} project files are up to date.')
def _apply_line_changes(self) -> None:
- # pylint: disable=too-many-branches
# Build a flat list of entries that can and can-not be auto applied.
manual_changes: List[Tuple[str, LineChange]] = []
@@ -201,14 +200,6 @@ class Updater:
f'{Clr.RED}{change[0]}:{change[1].line_number + 1}:'
f' Expected line to be:\n {change[1].expected}{Clr.RST}')
- # Make a note on copyright lines that this can be disabled.
- if 'Copyright' in change[1].expected:
- print(f'{Clr.RED}NOTE: You can disable copyright'
- f' checks by adding "license_line_checks": false\n'
- f'to the root dict in config/localconfig.json.\n'
- f'see https://ballistica.net/wiki'
- f'/Knowledge-Nuggets#'
- f'hello-world-creating-a-new-game-type{Clr.RST}')
sys.exit(-1)
# Now, if we've got auto entries, either list or auto-correct them.
@@ -262,7 +253,7 @@ class Updater:
with open(fname) as infile:
lines = infile.read().splitlines()
- # Look for copyright/legal-notice line(s)
+ # Look for license line(s)
if self._license_line_checks:
legal_notice = '// ' + get_legal_notice_private()
lnum = 0
@@ -301,7 +292,7 @@ class Updater:
if self._public:
raise RuntimeError('FIXME: Check for full license.')
- # Look for copyright/legal-notice line(s)
+ # Look for copyright/legal-notice line(s).
line = '// ' + get_legal_notice_private()
lnum = 0
if lines[lnum] != line: