mirror of
https://github.com/RYDE-WORK/ballistica.git
synced 2026-02-06 23:59:18 +08:00
Improved type checking on time functionality
This commit is contained in:
parent
06dfa73d01
commit
849bd11795
@ -4132,16 +4132,16 @@
|
|||||||
"assets/build/windows/x64/python.exe": "https://files.ballistica.net/cache/ba1/25/a7/dc87c1be41605eb6fefd0145144c",
|
"assets/build/windows/x64/python.exe": "https://files.ballistica.net/cache/ba1/25/a7/dc87c1be41605eb6fefd0145144c",
|
||||||
"assets/build/windows/x64/python37.dll": "https://files.ballistica.net/cache/ba1/b9/e4/d912f56e42e9991bcbb4c804cfcb",
|
"assets/build/windows/x64/python37.dll": "https://files.ballistica.net/cache/ba1/b9/e4/d912f56e42e9991bcbb4c804cfcb",
|
||||||
"assets/build/windows/x64/pythonw.exe": "https://files.ballistica.net/cache/ba1/6c/bb/b6f52c306aa4e88061510e96cefe",
|
"assets/build/windows/x64/pythonw.exe": "https://files.ballistica.net/cache/ba1/6c/bb/b6f52c306aa4e88061510e96cefe",
|
||||||
"build/prefab/linux-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/a1/97/fd0e5553917019236912a7010d38",
|
"build/prefab/linux-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ba/35/3b6bc5c5609b1dd37bd65c39df45",
|
||||||
"build/prefab/linux-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/43/32/c48a4da7fcc8c17132077da852d7",
|
"build/prefab/linux-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/a6/bc/c2c7231dc6bf085eda15d6198554",
|
||||||
"build/prefab/linux/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/75/13/2bc3ae9026386d1b515ede107e17",
|
"build/prefab/linux/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/6b/fd/020ed9bb0e8c8a18b2d793fee8bd",
|
||||||
"build/prefab/linux/release/ballisticacore": "https://files.ballistica.net/cache/ba1/1f/9a/b112f788f528ec9e3627622698ac",
|
"build/prefab/linux/release/ballisticacore": "https://files.ballistica.net/cache/ba1/43/0b/78c8bacb215abaf50dcb3284eef7",
|
||||||
"build/prefab/mac-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/a1/87/fdb3e925f3be1cc353db94d61c5a",
|
"build/prefab/mac-server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/f8/e1/e0dc64b5c00661cce19530c0e836",
|
||||||
"build/prefab/mac-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/fa/ba/125457c69bc2940850ab84c4cc6a",
|
"build/prefab/mac-server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/e6/74/73a514993d626a6bc75717d185ef",
|
||||||
"build/prefab/mac/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/a1/d4/5efcef1f85b2bfea7bbb81800580",
|
"build/prefab/mac/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/f0/7d/dbd2624759a1fdce2a20d53cab1a",
|
||||||
"build/prefab/mac/release/ballisticacore": "https://files.ballistica.net/cache/ba1/fa/66/75a3a0f27d07131473e804a5b937",
|
"build/prefab/mac/release/ballisticacore": "https://files.ballistica.net/cache/ba1/1c/01/4833ec215cc6c53f7e4ebf850608",
|
||||||
"build/prefab/windows-server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/51/6c/911ba80ba913e6dac1cafa5c8a74",
|
"build/prefab/windows-server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/b1/57/b72500d2a568df5afa36556f89dd",
|
||||||
"build/prefab/windows-server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/01/cc/cf896173a8d5731ada2aace59146",
|
"build/prefab/windows-server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/48/ea/c83f97f44703b16eeec794d29da6",
|
||||||
"build/prefab/windows/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/a2/12/aa1f0ca5506f0b57f93ca9adf7be",
|
"build/prefab/windows/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/a3/16/284b9953c7ef4a841ff907079cbd",
|
||||||
"build/prefab/windows/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/e1/5f/f372d0ba9591b99284b9b50d7cdf"
|
"build/prefab/windows/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/12/43/d0513cf8f8dac0712cbf42d4b94b"
|
||||||
}
|
}
|
||||||
1
.idea/dictionaries/ericf.xml
generated
1
.idea/dictionaries/ericf.xml
generated
@ -1114,6 +1114,7 @@
|
|||||||
<w>mhsh</w>
|
<w>mhsh</w>
|
||||||
<w>microprotocols</w>
|
<w>microprotocols</w>
|
||||||
<w>mikirog</w>
|
<w>mikirog</w>
|
||||||
|
<w>millisecs</w>
|
||||||
<w>mimetypes</w>
|
<w>mimetypes</w>
|
||||||
<w>mimportedby</w>
|
<w>mimportedby</w>
|
||||||
<w>mindepth</w>
|
<w>mindepth</w>
|
||||||
|
|||||||
@ -34,7 +34,7 @@ NOTE: This file was autogenerated by gendummymodule; do not edit by hand.
|
|||||||
"""
|
"""
|
||||||
|
|
||||||
# (hash we can use to see if this file is out of date)
|
# (hash we can use to see if this file is out of date)
|
||||||
# SOURCES_HASH=318889180473540875493180206824864665481
|
# SOURCES_HASH=223083205204988067566025188831386474803
|
||||||
|
|
||||||
# I'm sorry Pylint. I know this file saddens you. Be strong.
|
# I'm sorry Pylint. I know this file saddens you. Be strong.
|
||||||
# pylint: disable=useless-suppression
|
# pylint: disable=useless-suppression
|
||||||
@ -3729,11 +3729,35 @@ def textwidget(edit: Widget = None,
|
|||||||
return Widget()
|
return Widget()
|
||||||
|
|
||||||
|
|
||||||
|
# Overloads to return a type based on requested format.
|
||||||
|
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def time(
|
||||||
|
timetype: ba.TimeType = TimeType.SIM,
|
||||||
|
timeformat: Literal[TimeFormat.SECONDS] = TimeFormat.SECONDS) -> float:
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
# This "*" keyword-only hack lets us accept 1 arg (timeformat=MILLISECS) forms.
|
||||||
|
@overload
|
||||||
def time(timetype: ba.TimeType = TimeType.SIM,
|
def time(timetype: ba.TimeType = TimeType.SIM,
|
||||||
timeformat: ba.TimeFormat = TimeFormat.SECONDS) -> Union[float, int]:
|
*,
|
||||||
|
timeformat: Literal[TimeFormat.MILLISECONDS]) -> int:
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def time(timetype: ba.TimeType,
|
||||||
|
timeformat: Literal[TimeFormat.MILLISECONDS]) -> int:
|
||||||
|
...
|
||||||
|
|
||||||
|
|
||||||
|
def time(timetype: ba.TimeType = TimeType.SIM,
|
||||||
|
timeformat: ba.TimeFormat = TimeFormat.SECONDS) -> Any:
|
||||||
"""time(timetype: ba.TimeType = TimeType.SIM,
|
"""time(timetype: ba.TimeType = TimeType.SIM,
|
||||||
timeformat: ba.TimeFormat = TimeFormat.SECONDS)
|
timeformat: ba.TimeFormat = TimeFormat.SECONDS)
|
||||||
-> Union[float, int]
|
-> <varies>
|
||||||
|
|
||||||
Return the current time.
|
Return the current time.
|
||||||
|
|
||||||
@ -3766,7 +3790,7 @@ def time(timetype: ba.TimeType = TimeType.SIM,
|
|||||||
Note: If you need pure unfiltered clock time, just use the standard
|
Note: If you need pure unfiltered clock time, just use the standard
|
||||||
Python functions such as time.time().
|
Python functions such as time.time().
|
||||||
"""
|
"""
|
||||||
return 0.0
|
return None
|
||||||
|
|
||||||
|
|
||||||
def time_format_check(time_format: ba.TimeFormat, length: Union[float,
|
def time_format_check(time_format: ba.TimeFormat, length: Union[float,
|
||||||
|
|||||||
@ -494,7 +494,7 @@ def get_available_sale_time(tab: str) -> Optional[int]:
|
|||||||
assert app.pro_sale_start_val is not None
|
assert app.pro_sale_start_val is not None
|
||||||
val: Optional[int] = max(
|
val: Optional[int] = max(
|
||||||
0, app.pro_sale_start_val -
|
0, app.pro_sale_start_val -
|
||||||
(int(_ba.time(TimeType.REAL, TimeFormat.MILLISECONDS)) -
|
(_ba.time(TimeType.REAL, TimeFormat.MILLISECONDS) -
|
||||||
app.pro_sale_start_time))
|
app.pro_sale_start_time))
|
||||||
|
|
||||||
# Keep the value in the config up to date. I suppose we should
|
# Keep the value in the config up to date. I suppose we should
|
||||||
|
|||||||
@ -21,12 +21,13 @@
|
|||||||
"""Defines Actor(s)."""
|
"""Defines Actor(s)."""
|
||||||
from __future__ import annotations
|
from __future__ import annotations
|
||||||
|
|
||||||
from typing import TYPE_CHECKING
|
from typing import TYPE_CHECKING, overload
|
||||||
|
|
||||||
import ba
|
import ba
|
||||||
|
|
||||||
if TYPE_CHECKING:
|
if TYPE_CHECKING:
|
||||||
from typing import Optional, Union, Any
|
from typing import Optional, Union, Any
|
||||||
|
from typing_extensions import Literal
|
||||||
|
|
||||||
|
|
||||||
class OnScreenTimer(ba.Actor):
|
class OnScreenTimer(ba.Actor):
|
||||||
@ -39,7 +40,7 @@ class OnScreenTimer(ba.Actor):
|
|||||||
|
|
||||||
def __init__(self) -> None:
|
def __init__(self) -> None:
|
||||||
super().__init__()
|
super().__init__()
|
||||||
self._starttime: Optional[int] = None
|
self._starttime_ms: Optional[int] = None
|
||||||
self.node = ba.newnode('text',
|
self.node = ba.newnode('text',
|
||||||
attrs={
|
attrs={
|
||||||
'v_attach': 'top',
|
'v_attach': 'top',
|
||||||
@ -63,13 +64,13 @@ class OnScreenTimer(ba.Actor):
|
|||||||
"""Start the timer."""
|
"""Start the timer."""
|
||||||
tval = ba.time(timeformat=ba.TimeFormat.MILLISECONDS)
|
tval = ba.time(timeformat=ba.TimeFormat.MILLISECONDS)
|
||||||
assert isinstance(tval, int)
|
assert isinstance(tval, int)
|
||||||
self._starttime = tval
|
self._starttime_ms = tval
|
||||||
self.inputnode.time1 = self._starttime
|
self.inputnode.time1 = self._starttime_ms
|
||||||
ba.sharedobj('globals').connectattr('time', self.inputnode, 'time2')
|
ba.sharedobj('globals').connectattr('time', self.inputnode, 'time2')
|
||||||
|
|
||||||
def has_started(self) -> bool:
|
def has_started(self) -> bool:
|
||||||
"""Return whether this timer has started yet."""
|
"""Return whether this timer has started yet."""
|
||||||
return self._starttime is not None
|
return self._starttime_ms is not None
|
||||||
|
|
||||||
def stop(self,
|
def stop(self,
|
||||||
endtime: Union[int, float] = None,
|
endtime: Union[int, float] = None,
|
||||||
@ -85,7 +86,7 @@ class OnScreenTimer(ba.Actor):
|
|||||||
endtime = ba.time(timeformat=ba.TimeFormat.MILLISECONDS)
|
endtime = ba.time(timeformat=ba.TimeFormat.MILLISECONDS)
|
||||||
timeformat = ba.TimeFormat.MILLISECONDS
|
timeformat = ba.TimeFormat.MILLISECONDS
|
||||||
|
|
||||||
if self._starttime is None:
|
if self._starttime_ms is None:
|
||||||
print('Warning: OnScreenTimer.stop() called without start() first')
|
print('Warning: OnScreenTimer.stop() called without start() first')
|
||||||
else:
|
else:
|
||||||
endtime_ms: int
|
endtime_ms: int
|
||||||
@ -97,7 +98,20 @@ class OnScreenTimer(ba.Actor):
|
|||||||
else:
|
else:
|
||||||
raise ValueError(f'invalid timeformat: {timeformat}')
|
raise ValueError(f'invalid timeformat: {timeformat}')
|
||||||
|
|
||||||
self.inputnode.timemax = endtime_ms - self._starttime
|
self.inputnode.timemax = endtime_ms - self._starttime_ms
|
||||||
|
|
||||||
|
# Overloads so type checker knows our exact return type based in args.
|
||||||
|
@overload
|
||||||
|
def getstarttime(
|
||||||
|
self,
|
||||||
|
timeformat: Literal[ba.TimeFormat.SECONDS] = ba.TimeFormat.SECONDS
|
||||||
|
) -> float:
|
||||||
|
...
|
||||||
|
|
||||||
|
@overload
|
||||||
|
def getstarttime(self,
|
||||||
|
timeformat: Literal[ba.TimeFormat.MILLISECONDS]) -> int:
|
||||||
|
...
|
||||||
|
|
||||||
def getstarttime(
|
def getstarttime(
|
||||||
self,
|
self,
|
||||||
@ -109,11 +123,11 @@ class OnScreenTimer(ba.Actor):
|
|||||||
milliseconds if it is MILLISECONDS.
|
milliseconds if it is MILLISECONDS.
|
||||||
"""
|
"""
|
||||||
val_ms: Any
|
val_ms: Any
|
||||||
if self._starttime is None:
|
if self._starttime_ms is None:
|
||||||
print('WARNING: getstarttime() called on un-started timer')
|
print('WARNING: getstarttime() called on un-started timer')
|
||||||
val_ms = ba.time(timeformat=ba.TimeFormat.MILLISECONDS)
|
val_ms = ba.time(timeformat=ba.TimeFormat.MILLISECONDS)
|
||||||
else:
|
else:
|
||||||
val_ms = self._starttime
|
val_ms = self._starttime_ms
|
||||||
assert isinstance(val_ms, int)
|
assert isinstance(val_ms, int)
|
||||||
if timeformat is ba.TimeFormat.SECONDS:
|
if timeformat is ba.TimeFormat.SECONDS:
|
||||||
return 0.001 * val_ms
|
return 0.001 * val_ms
|
||||||
@ -121,6 +135,11 @@ class OnScreenTimer(ba.Actor):
|
|||||||
return val_ms
|
return val_ms
|
||||||
raise ValueError(f'invalid timeformat: {timeformat}')
|
raise ValueError(f'invalid timeformat: {timeformat}')
|
||||||
|
|
||||||
|
@property
|
||||||
|
def starttime(self) -> float:
|
||||||
|
"""Shortcut for start time in seconds."""
|
||||||
|
return self.getstarttime()
|
||||||
|
|
||||||
def handlemessage(self, msg: Any) -> Any:
|
def handlemessage(self, msg: Any) -> Any:
|
||||||
# if we're asked to die, just kill our node/timer
|
# if we're asked to die, just kill our node/timer
|
||||||
if isinstance(msg, ba.DieMessage):
|
if isinstance(msg, ba.DieMessage):
|
||||||
|
|||||||
@ -77,6 +77,7 @@ class NinjaFightGame(ba.TeamGameActivity[Player, Team]):
|
|||||||
self._won = False
|
self._won = False
|
||||||
self._timer: Optional[OnScreenTimer] = None
|
self._timer: Optional[OnScreenTimer] = None
|
||||||
self._bots = SpazBotSet()
|
self._bots = SpazBotSet()
|
||||||
|
self._preset = str(settings['preset'])
|
||||||
|
|
||||||
# Called when our game is transitioning in but not ready to begin;
|
# Called when our game is transitioning in but not ready to begin;
|
||||||
# we can go ahead and start creating stuff, playing music, etc.
|
# we can go ahead and start creating stuff, playing music, etc.
|
||||||
@ -87,7 +88,7 @@ class NinjaFightGame(ba.TeamGameActivity[Player, Team]):
|
|||||||
# Called when our game actually begins.
|
# Called when our game actually begins.
|
||||||
def on_begin(self) -> None:
|
def on_begin(self) -> None:
|
||||||
super().on_begin()
|
super().on_begin()
|
||||||
is_pro = self.settings_raw.get('preset') == 'pro'
|
is_pro = self._preset == 'pro'
|
||||||
|
|
||||||
# In pro mode there's no powerups.
|
# In pro mode there's no powerups.
|
||||||
if not is_pro:
|
if not is_pro:
|
||||||
@ -156,9 +157,11 @@ class NinjaFightGame(ba.TeamGameActivity[Player, Team]):
|
|||||||
# marked dead yet) ..so lets push a call into the event loop to
|
# marked dead yet) ..so lets push a call into the event loop to
|
||||||
# check once this guy has finished dying.
|
# check once this guy has finished dying.
|
||||||
ba.pushcall(self._check_if_won)
|
ba.pushcall(self._check_if_won)
|
||||||
|
|
||||||
|
# Let the base class handle anything we don't.
|
||||||
else:
|
else:
|
||||||
# Let the base class handle anything we don't.
|
return super().handlemessage(msg)
|
||||||
super().handlemessage(msg)
|
return None
|
||||||
|
|
||||||
# When this is called, we should fill out results and end the game
|
# 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
|
# *regardless* of whether is has been won. (this may be called due
|
||||||
@ -171,17 +174,12 @@ class NinjaFightGame(ba.TeamGameActivity[Player, Team]):
|
|||||||
|
|
||||||
results = ba.TeamGameResults()
|
results = ba.TeamGameResults()
|
||||||
|
|
||||||
# If we won, set our score to the elapsed time
|
# If we won, set our score to the elapsed time in milliseconds.
|
||||||
# (there should just be 1 team here since this is co-op).
|
# (there should just be 1 team here since this is co-op).
|
||||||
# ..if we didn't win, leave scores as default (None) which means
|
# ..if we didn't win, leave scores as default (None) which means
|
||||||
# we lost.
|
# we lost.
|
||||||
if self._won:
|
if self._won:
|
||||||
curtime = ba.time(timeformat=ba.TimeFormat.MILLISECONDS)
|
elapsed_time_ms = int((ba.time() - self._timer.starttime) * 1000.0)
|
||||||
assert isinstance(curtime, int)
|
|
||||||
starttime = self._timer.getstarttime(
|
|
||||||
timeformat=ba.TimeFormat.MILLISECONDS)
|
|
||||||
assert isinstance(starttime, int)
|
|
||||||
elapsed_time_ms = curtime - starttime
|
|
||||||
ba.cameraflash()
|
ba.cameraflash()
|
||||||
ba.playsound(self._winsound)
|
ba.playsound(self._winsound)
|
||||||
for team in self.teams:
|
for team in self.teams:
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<!-- THIS FILE IS AUTO GENERATED; DO NOT EDIT BY HAND -->
|
<!-- THIS FILE IS AUTO GENERATED; DO NOT EDIT BY HAND -->
|
||||||
<h4><em>last updated on 2020-05-25 for Ballistica version 1.5.0 build 20028</em></h4>
|
<h4><em>last updated on 2020-05-25 for Ballistica version 1.5.0 build 20029</em></h4>
|
||||||
<p>This page documents the Python classes and functions in the 'ba' module,
|
<p>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 <a href="mailto:support@froemling.net">let me know</a>. Happy modding!</p>
|
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 <a href="mailto:support@froemling.net">let me know</a>. Happy modding!</p>
|
||||||
<hr>
|
<hr>
|
||||||
@ -6382,7 +6382,7 @@ are applied to the Widget.</p>
|
|||||||
<h2><strong><a name="function_ba_time">ba.time()</a></strong></h3>
|
<h2><strong><a name="function_ba_time">ba.time()</a></strong></h3>
|
||||||
<p><span>time(timetype: <a href="#class_ba_TimeType">ba.TimeType</a> = TimeType.SIM,
|
<p><span>time(timetype: <a href="#class_ba_TimeType">ba.TimeType</a> = TimeType.SIM,
|
||||||
timeformat: <a href="#class_ba_TimeFormat">ba.TimeFormat</a> = TimeFormat.SECONDS)
|
timeformat: <a href="#class_ba_TimeFormat">ba.TimeFormat</a> = TimeFormat.SECONDS)
|
||||||
-> Union[float, int]</span></p>
|
-> <varies></span></p>
|
||||||
|
|
||||||
<p>Return the current time.</p>
|
<p>Return the current time.</p>
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user