This commit is contained in:
Eric Froemling 2020-10-13 20:42:54 -07:00
parent 469708d4f2
commit 8f102bcf78
19 changed files with 137 additions and 250 deletions

View File

@ -3932,24 +3932,24 @@
"assets/build/windows/Win32/ucrtbased.dll": "https://files.ballistica.net/cache/ba1/b5/85/f8b6d0558ddb87267f34254b1450", "assets/build/windows/Win32/ucrtbased.dll": "https://files.ballistica.net/cache/ba1/b5/85/f8b6d0558ddb87267f34254b1450",
"assets/build/windows/Win32/vc_redist.x86.exe": "https://files.ballistica.net/cache/ba1/1c/e1/4a1a2eddda2f4aebd5f8b64ab08e", "assets/build/windows/Win32/vc_redist.x86.exe": "https://files.ballistica.net/cache/ba1/1c/e1/4a1a2eddda2f4aebd5f8b64ab08e",
"assets/build/windows/Win32/vcruntime140d.dll": "https://files.ballistica.net/cache/ba1/50/8d/bc2600ac9491f1b14d659709451f", "assets/build/windows/Win32/vcruntime140d.dll": "https://files.ballistica.net/cache/ba1/50/8d/bc2600ac9491f1b14d659709451f",
"build/prefab/full/linux_x86_64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/b8/eb/280d15f31dcbf3830e6730f9c4be", "build/prefab/full/linux_x86_64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/e9/48/88db5152fcd7ff38363ce35e2b5c",
"build/prefab/full/linux_x86_64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/b9/b6/7a4d577d71bbce1d0a42d0fa8f0e", "build/prefab/full/linux_x86_64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/83/9a/4d1f2cd9a7940d99e24d8f0719f4",
"build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/64/46/406adb6907d84ab1fbce0238b2f5", "build/prefab/full/linux_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/a3/58/4be1efd666668e078a7a9ca36928",
"build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/e2/4a/c3ab9dfa2eb438e2270c867a0a32", "build/prefab/full/linux_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/a5/5d/3ba7496fb214568d79aa36bc0fa2",
"build/prefab/full/mac_x86_64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/75/7d/64dee3a33a9b9df3213789d031ca", "build/prefab/full/mac_x86_64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/85/4c/8ad6020c7b442306b5729ab7af5c",
"build/prefab/full/mac_x86_64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/24/4e/0de9a93c5abf5f91efa893c0f657", "build/prefab/full/mac_x86_64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/bd/a6/ecf53cf19d15644fe1b072dff936",
"build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/ba/e3/7c54b7b121a73945a334acf2a778", "build/prefab/full/mac_x86_64_server/debug/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/a0/f5/a2688f382c3dc2b3763f83a40b72",
"build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/8b/80/59caf9ded1ac2d852f57489049c2", "build/prefab/full/mac_x86_64_server/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/c5/82/7313732699d4e1d86fa0c153c046",
"build/prefab/full/windows_x86/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/72/b8/b24e6069245d0c3e7c1f049e1386", "build/prefab/full/windows_x86/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/63/42/fc3ff5ea8c9e3b30788ae2adcb89",
"build/prefab/full/windows_x86/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/79/62/ad715d74684b940ce846e7e58d8c", "build/prefab/full/windows_x86/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/5a/b9/94c0e471b1cda37c5e8e8f92192b",
"build/prefab/full/windows_x86_server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/23/41/552a8ffeef5bc10bd0af04c10565", "build/prefab/full/windows_x86_server/debug/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/d5/e8/df64479789b87fa7472162476d52",
"build/prefab/full/windows_x86_server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/bf/aa/1dcfd60aeaec8d42f06adac2156b", "build/prefab/full/windows_x86_server/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/12/a1/06e3f98c545918e81520cd1154eb",
"build/prefab/lib/linux_x86_64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/a5/db/bcc616e930ef02de5f086cc819a1", "build/prefab/lib/linux_x86_64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/2c/b1/c6394b207908dcf10702963d074b",
"build/prefab/lib/linux_x86_64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/7f/3b/af2f0efe5996de7cfc31a112c514", "build/prefab/lib/linux_x86_64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/68/c6/61c27c594a5b67abb7cd0a2a0f51",
"build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/8f/22/e3bb8333289707bba87db62cff1b", "build/prefab/lib/linux_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/96/61/51cb6fd93d32693f297f51bca1e5",
"build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/93/88/21434630ae75dfd78e8f1225beaf", "build/prefab/lib/linux_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/53/96/32edc65468aa4546f245192238c3",
"build/prefab/lib/mac_x86_64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/3c/2c/317eabff84c4b1819aeb78dc984a", "build/prefab/lib/mac_x86_64/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/e2/88/4c3188f4bfa72c23902b3e4c1e56",
"build/prefab/lib/mac_x86_64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/12/b2/e0851ca040064fb5c4d953003a10", "build/prefab/lib/mac_x86_64/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/bb/5f/82a7d3e039af6ad89cf42231b8b7",
"build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/15/88/cfef2301d0ff44a26c411ed11c39", "build/prefab/lib/mac_x86_64_server/debug/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/09/38/1e6625b6e8710aba4c6d1cc18e94",
"build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/b2/7a/5c80fa986d5da7908d7c3c31c61f" "build/prefab/lib/mac_x86_64_server/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/4d/ea/ebfd89fab46518a4c3bdf5e57638"
} }

View File

@ -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-10-13 for Ballistica version 1.5.26 build 20202</em></h4> <h4><em>last updated on 2020-10-13 for Ballistica version 1.5.26 build 20205</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>

View File

@ -185,8 +185,10 @@ void AppConfig::SetupEntries() {
bool_entries_[BoolID::kFullscreen] = BoolEntry("Fullscreen", false); bool_entries_[BoolID::kFullscreen] = BoolEntry("Fullscreen", false);
bool_entries_[BoolID::kKickIdlePlayers] = bool_entries_[BoolID::kKickIdlePlayers] =
BoolEntry("Kick Idle Players", false); BoolEntry("Kick Idle Players", false);
// (default to internal keyboard on iircade; not elsewhere)
bool_entries_[BoolID::kAlwaysUseInternalKeyboard] = bool_entries_[BoolID::kAlwaysUseInternalKeyboard] =
BoolEntry("Always Use Internal Keyboard", false); BoolEntry("Always Use Internal Keyboard", g_buildconfig.iircade_build());
bool_entries_[BoolID::kShowFPS] = BoolEntry("Show FPS", false); bool_entries_[BoolID::kShowFPS] = BoolEntry("Show FPS", false);
bool_entries_[BoolID::kTVBorder] = bool_entries_[BoolID::kTVBorder] =
BoolEntry("TV Border", g_platform->IsRunningOnTV()); BoolEntry("TV Border", g_platform->IsRunningOnTV());

View File

@ -35,7 +35,6 @@ class AppGlobals {
std::map<int, NodeType*> node_types_by_id; std::map<int, NodeType*> node_types_by_id;
std::map<std::string, NodeMessageType> node_message_types; std::map<std::string, NodeMessageType> node_message_types;
std::vector<std::string> node_message_formats; std::vector<std::string> node_message_formats;
std::string calced_blessing_hash;
bool have_mods{}; bool have_mods{};
bool replay_open{}; bool replay_open{};
std::vector<Thread*> pausable_threads; std::vector<Thread*> pausable_threads;

View File

@ -29,7 +29,7 @@
namespace ballistica { namespace ballistica {
// These are set automatically via script; don't change here. // These are set automatically via script; don't change here.
const int kAppBuildNumber = 20203; const int kAppBuildNumber = 20207;
const char* kAppVersion = "1.5.26"; const char* kAppVersion = "1.5.26";
// Our standalone globals. // Our standalone globals.

View File

@ -178,6 +178,9 @@ auto AppInternalPushPurchaseTransactionCall(const std::string& item,
bool user_initiated) -> void; bool user_initiated) -> void;
auto AppInternalGetPublicAccountID() -> std::string; auto AppInternalGetPublicAccountID() -> std::string;
auto AppInternalOnGameThreadPause() -> void; auto AppInternalOnGameThreadPause() -> void;
auto AppInternalDirectSendLogs(const std::string& prefix,
const std::string& suffix, bool instant,
int* result = nullptr) -> void;
/// Does it appear that we are a blessed build with no known user-modifications? /// Does it appear that we are a blessed build with no known user-modifications?
auto IsUnmodifiedBlessedBuild() -> bool; auto IsUnmodifiedBlessedBuild() -> bool;

View File

@ -88,7 +88,7 @@ auto FatalError::ReportFatalError(const std::string& message,
if (g_app_globals == nullptr) { if (g_app_globals == nullptr) {
suffix = logmsg; suffix = logmsg;
} }
Logging::DirectSendLogs(prefix, suffix, true, &result); AppInternalDirectSendLogs(prefix, suffix, true, &result);
// If we're able to show a fatal-error dialog synchronously, do so. // If we're able to show a fatal-error dialog synchronously, do so.
if (g_platform && g_platform->CanShowBlockingFatalErrorDialog()) { if (g_platform && g_platform->CanShowBlockingFatalErrorDialog()) {

View File

@ -104,111 +104,10 @@ void Logging::Log(const std::string& msg, bool to_stdout, bool to_server) {
if (g_app_globals == nullptr) { if (g_app_globals == nullptr) {
logsuffix = msg; logsuffix = msg;
} }
DirectSendLogs(logprefix, logsuffix, false); AppInternalDirectSendLogs(logprefix, logsuffix, false);
} }
} }
} }
} }
auto Logging::DirectSendLogs(const std::string& prefix,
const std::string& suffix, bool instant,
int* result) -> void {
// Use a rough mechanism to restrict log uploads to 1 send per second.
static time_t last_non_instant_send_time{-1};
if (!instant) {
auto curtime = Platform::GetCurrentSeconds();
if (curtime == last_non_instant_send_time) {
return;
}
last_non_instant_send_time = curtime;
}
std::thread t([prefix, suffix, instant, result]() {
// For non-instant sends, sleep for 2 seconds before sending logs;
// this should capture the just-added log as well as any more that
// got added in the subsequent second when we were not launching new
// send threads.
if (!instant) {
Platform::SleepMS(2000);
}
std::string log;
// Send our blessing hash only after we've calculated it; don't use our
// internal one. This means that we'll get false-negatives on whether
// direct-sent logs are blessed, but I think that's better than false
// positives.
std::string calced_blessing_hash;
if (g_app_globals) {
std::lock_guard<std::mutex> lock(g_app_globals->log_mutex);
log = g_app_globals->log;
calced_blessing_hash = g_app_globals->calced_blessing_hash;
} else {
log = "(g_app_globals not yet inited; no global log available)";
}
if (!prefix.empty()) {
log = prefix + "\n" + log;
}
if (!suffix.empty()) {
log = log + "\n" + suffix;
}
// Also send our blessing-calculation state; we may want to distinguish
// between blessing not being calced yet and being confirmed as un-blessed.
// FIXME: should probably do this in python layer log submits too.
std::string bless_calc_state;
if (!AppInternalHasBlessingHash()) {
bless_calc_state = "nointhash";
} else if (g_app_globals == nullptr) {
bless_calc_state = "noglobs";
} else if (g_app_globals->calced_blessing_hash.empty()) {
// Mention we're calculating, but also mention if it is likely that
// the user is mucking with stuff.
if (g_app_globals->user_ran_commands
|| g_platform->using_custom_app_python_dir()) {
bless_calc_state = "calcing_likely_modded";
} else {
bless_calc_state = "calcing_not_modded";
}
} else {
bless_calc_state = "done";
}
std::string path{"/bsLog"};
std::map<std::string, std::string> params{
{"log", log},
{"time", "-1"},
{"userAgentString", g_app_globals ? g_app_globals->user_agent_string
: "(no g_app_globals)"},
{"newsShow", calced_blessing_hash.c_str()},
{"bcs", bless_calc_state.c_str()},
{"build", std::to_string(kAppBuildNumber)}};
try {
Networking::MasterServerPost(path, params);
if (result) {
*result = 1; // SUCCESS!
}
} catch (const std::exception&) {
// Try our fallback master-server address if that didn't work.
try {
params["log"] = prefix + "(FALLBACK-ADDR):\n" + log;
Networking::MasterServerPost(path, params, true);
if (result) {
*result = 1; // SUCCESS!
}
} catch (const std::exception& exc) {
// Well, we tried; make a note to platform log if available
// that we failed.
if (g_platform != nullptr) {
g_platform->HandleLog(std::string("Early log-to-server failed: ")
+ exc.what());
}
if (result) {
*result = -1; // FAIL!!
}
}
}
});
t.detach();
}
} // namespace ballistica } // namespace ballistica

View File

@ -22,12 +22,6 @@ class Logging {
/// on the platform. /// on the platform.
static auto Log(const std::string& msg, bool to_stdout = true, static auto Log(const std::string& msg, bool to_stdout = true,
bool to_server = true) -> void; bool to_server = true) -> void;
/// Ship logs to the master-server in a bg thread. If result is passed,
/// it will be set to 1 on success and -1 on error.
static auto DirectSendLogs(const std::string& prefix,
const std::string& suffix, bool instant,
int* result = nullptr) -> void;
}; };
} // namespace ballistica } // namespace ballistica

View File

@ -12,19 +12,7 @@
namespace ballistica { namespace ballistica {
CollisionCache::CollisionCache() CollisionCache::CollisionCache() { test_box_ = dCreateBox(nullptr, 1, 1, 1); }
: dirty_(true),
shadow_ray_(nullptr),
x_min_(-1),
x_max_(1),
y_min_(-1),
y_max_(1),
z_min_(-1),
z_max_(1) {
grid_width_ = 1;
grid_height_ = 1;
test_box_ = dCreateBox(nullptr, 1, 1, 1);
}
CollisionCache::~CollisionCache() { CollisionCache::~CollisionCache() {
if (shadow_ray_) { if (shadow_ray_) {

View File

@ -38,19 +38,19 @@ class CollisionCache {
}; };
std::vector<Cell> cells_; std::vector<Cell> cells_;
std::vector<uint8_t> glow_; std::vector<uint8_t> glow_;
bool dirty_; bool dirty_{true};
dGeomID shadow_ray_; dGeomID shadow_ray_{};
dGeomID test_box_; dGeomID test_box_{};
int grid_width_; int grid_width_{1};
int grid_height_; int grid_height_{1};
float cell_width_{}; float cell_width_{};
float cell_height_{}; float cell_height_{};
float x_min_; float x_min_{-1.0f};
float x_max_; float x_max_{1.0f};
float y_min_; float y_min_{-1.0f};
float y_max_; float y_max_{1.0f};
float z_min_; float z_min_{-1.0f};
float z_max_; float z_max_{1.0f};
}; };
} // namespace ballistica } // namespace ballistica

View File

@ -32,14 +32,15 @@ class Account {
// An extra value included when passing our account info to the server // An extra value included when passing our account info to the server
// ..(can be used for platform-specific install-signature stuff, etc). // ..(can be used for platform-specific install-signature stuff, etc).
void SetAccountExtra(const std::string& extra); auto SetAccountExtra(const std::string& extra) -> void;
void SetAccountExtra2(const std::string& extra); auto SetAccountExtra2(const std::string& extra) -> void;
void SetAccountToken(const std::string& account_id, const std::string& token); auto SetAccountToken(const std::string& account_id, const std::string& token)
-> void;
void SetAccount(AccountType account_type, AccountState account_state, auto SetAccount(AccountType account_type, AccountState account_state,
const std::string& name, const std::string& id); const std::string& name, const std::string& id) -> void;
void SetProductsPurchased(const std::vector<std::string>& products); auto SetProductsPurchased(const std::vector<std::string>& products) -> void;
auto GetProductPurchased(const std::string& product) -> bool; auto GetProductPurchased(const std::string& product) -> bool;
auto product_purchases_state() const -> int { auto product_purchases_state() const -> int {
return product_purchases_state_; return product_purchases_state_;

View File

@ -7,14 +7,14 @@
namespace ballistica { namespace ballistica {
// An interface for something that can control client-connections. /// An interface for something that can control client-connections
// (such as an output-stream or a replay-client-session) /// (such as an output-stream or a replay-client-session).
// objects can register themselves as the current client-connection-controller /// Objects can register themselves as the current client-connection-controller
// and then they will get control of all existing (and forthcoming) clients /// and then they will get control of all existing (and forthcoming) clients.
class ClientControllerInterface { class ClientControllerInterface {
public: public:
virtual void OnClientConnected(ConnectionToClient* c) = 0; virtual auto OnClientConnected(ConnectionToClient* c) -> void = 0;
virtual void OnClientDisconnected(ConnectionToClient* c) = 0; virtual auto OnClientDisconnected(ConnectionToClient* c) -> void = 0;
}; };
} // namespace ballistica } // namespace ballistica

View File

@ -18,13 +18,13 @@ class HostActivity : public ContextTarget {
explicit HostActivity(HostSession* host_session); explicit HostActivity(HostSession* host_session);
~HostActivity() override; ~HostActivity() override;
auto GetHostSession() -> HostSession* override; auto GetHostSession() -> HostSession* override;
void SetGameSpeed(float speed); auto SetGameSpeed(float speed) -> void;
auto game_speed() const -> float { return game_speed_; } auto game_speed() const -> float { return game_speed_; }
// ContextTarget time/timer support. // ContextTarget time/timer support.
auto NewTimer(TimeType timetype, TimerMedium length, bool repeat, auto NewTimer(TimeType timetype, TimerMedium length, bool repeat,
const Object::Ref<Runnable>& runnable) -> int override; const Object::Ref<Runnable>& runnable) -> int override;
void DeleteTimer(TimeType timetype, int timer_id) override; auto DeleteTimer(TimeType timetype, int timer_id) -> void override;
auto GetTime(TimeType timetype) -> millisecs_t override; auto GetTime(TimeType timetype) -> millisecs_t override;
/// Return a borrowed ref to the python activity; Py_None if nonexistent. /// Return a borrowed ref to the python activity; Py_None if nonexistent.
@ -45,43 +45,49 @@ class HostActivity : public ContextTarget {
assert(scene_.exists()); assert(scene_.exists());
return scene_.get(); return scene_.get();
} }
void start(); auto start() -> void;
// A utility function; faster than dynamic_cast. // A utility function; faster than dynamic_cast.
auto GetAsHostActivity() -> HostActivity* override; auto GetAsHostActivity() -> HostActivity* override;
auto GetMutableScene() -> Scene* override; auto GetMutableScene() -> Scene* override;
void Draw(FrameDef* frame_def); auto Draw(FrameDef* frame_def) -> void;
void ScreenSizeChanged(); auto ScreenSizeChanged() -> void;
void LanguageChanged(); auto LanguageChanged() -> void;
void DebugSpeedMultChanged(); auto DebugSpeedMultChanged() -> void;
void GraphicsQualityChanged(GraphicsQuality q); auto GraphicsQualityChanged(GraphicsQuality q) -> void;
// Used to register python calls created in this context so we can make sure // Used to register python calls created in this context so we can make sure
// they got properly cleaned up. // they got properly cleaned up.
void RegisterCall(PythonContextCall* call); auto RegisterCall(PythonContextCall* call) -> void;
auto shutting_down() const -> bool { return shutting_down_; } auto shutting_down() const -> bool { return shutting_down_; }
auto globals_node() const -> GlobalsNode*; auto globals_node() const -> GlobalsNode*;
void SetPaused(bool val); auto SetPaused(bool val) -> void;
auto paused() const -> bool { return paused_; } auto paused() const -> bool { return paused_; }
void set_allow_kick_idle_players(bool val) { allow_kick_idle_players_ = val; } auto set_allow_kick_idle_players(bool val) -> void {
allow_kick_idle_players_ = val;
}
auto getAllowKickIdlePlayers() const -> bool { auto getAllowKickIdlePlayers() const -> bool {
return allow_kick_idle_players_; return allow_kick_idle_players_;
} }
auto GetGameStream() const -> GameStream*; auto GetGameStream() const -> GameStream*;
void DumpFullState(GameStream* out); auto DumpFullState(GameStream* out) -> void;
auto SetGlobalsNode(GlobalsNode* node) -> void;
auto SetIsForeground(bool val) -> void;
auto RegisterPyActivity(PyObject* pyActivity) -> void;
private: private:
auto HandleOutOfBoundsNodes() -> void;
auto NewSimTimer(millisecs_t length, bool repeat, auto NewSimTimer(millisecs_t length, bool repeat,
const Object::Ref<Runnable>& runnable) -> int; const Object::Ref<Runnable>& runnable) -> int;
void DeleteSimTimer(int timer_id); auto DeleteSimTimer(int timer_id) -> void;
auto NewBaseTimer(millisecs_t length, bool repeat, auto NewBaseTimer(millisecs_t length, bool repeat,
const Object::Ref<Runnable>& runnable) -> int; const Object::Ref<Runnable>& runnable) -> int;
void DeleteBaseTimer(int timer_id); auto DeleteBaseTimer(int timer_id) -> void;
void UpdateStepTimerLength(); auto UpdateStepTimerLength() -> void;
auto StepScene() -> void;
Object::WeakRef<GlobalsNode> globals_node_; Object::WeakRef<GlobalsNode> globals_node_;
void SetIsForeground(bool val);
bool allow_kick_idle_players_ = false; bool allow_kick_idle_players_ = false;
void StepScene();
Timer* step_scene_timer_ = nullptr; Timer* step_scene_timer_ = nullptr;
std::map<std::string, Object::WeakRef<Texture> > textures_; std::map<std::string, Object::WeakRef<Texture> > textures_;
std::map<std::string, Object::WeakRef<Sound> > sounds_; std::map<std::string, Object::WeakRef<Sound> > sounds_;
@ -98,21 +104,17 @@ class HostActivity : public ContextTarget {
millisecs_t next_prune_time_ = 0; millisecs_t next_prune_time_ = 0;
bool _started = false; bool _started = false;
int out_of_bounds_in_a_row_ = 0; int out_of_bounds_in_a_row_ = 0;
void HandleOutOfBoundsNodes();
bool paused_ = false; bool paused_ = false;
float game_speed_ = 0.0f; float game_speed_ = 0.0f;
millisecs_t base_time_ = 0; millisecs_t base_time_ = 0;
Object::Ref<Scene> scene_; Object::Ref<Scene> scene_;
Object::WeakRef<HostSession> host_session_; Object::WeakRef<HostSession> host_session_;
PythonRef py_activity_weak_ref_; PythonRef py_activity_weak_ref_;
void RegisterPyActivity(PyObject* pyActivity);
// Want this at the bottom so it dies first since this may cause python stuff // Want this at the bottom so it dies first since this may cause Python
// to access us. // stuff to access us.
TimerList sim_timers_; TimerList sim_timers_;
TimerList base_timers_; TimerList base_timers_;
friend class HostSession;
friend class GlobalsNode;
}; };
} // namespace ballistica } // namespace ballistica

View File

@ -24,15 +24,15 @@ class Player : public Object {
Player(int id, HostSession* host_session); Player(int id, HostSession* host_session);
~Player() override; ~Player() override;
void SetInputDevice(InputDevice* input_device); auto SetInputDevice(InputDevice* input_device) -> void;
void AssignInputCall(InputType type, PyObject* call_obj); auto AssignInputCall(InputType type, PyObject* call_obj) -> void;
void InputCommand(InputType type, float value = 0.0f); auto InputCommand(InputType type, float value = 0.0f) -> void;
void SetName(const std::string& name, const std::string& full_name, auto SetName(const std::string& name, const std::string& full_name, bool real)
bool real); -> void;
auto GetName(bool full = false, bool icon = true) const -> std::string; auto GetName(bool full = false, bool icon = true) const -> std::string;
auto name_is_real() const -> bool { return name_is_real_; } auto name_is_real() const -> bool { return name_is_real_; }
void ResetInput(); auto ResetInput() -> void;
auto GetHostSession() const -> HostSession*; auto GetHostSession() const -> HostSession*;
auto id() const -> int { return id_; } auto id() const -> int { return id_; }
@ -41,7 +41,7 @@ class Player : public Object {
auto BorrowPyRef() -> PyObject* { return GetPyRef(false); } auto BorrowPyRef() -> PyObject* { return GetPyRef(false); }
// Set the player node for the current activity. // Set the player node for the current activity.
void set_node(Node* node) { auto set_node(Node* node) -> void {
assert(InGameThread()); assert(InGameThread());
node_ = node; node_ = node;
} }
@ -50,43 +50,43 @@ class Player : public Object {
return node_.get(); return node_.get();
} }
void SetPyTeam(PyObject* team); auto SetPyTeam(PyObject* team) -> void;
auto GetPyTeam() -> PyObject*; // Returns a borrowed ref. auto GetPyTeam() -> PyObject*; // Returns a borrowed ref.
void SetPyCharacter(PyObject* team); auto SetPyCharacter(PyObject* team) -> void;
auto GetPyCharacter() -> PyObject*; // Returns a borrowed ref. auto GetPyCharacter() -> PyObject*; // Returns a borrowed ref.
void SetPyColor(PyObject* team); auto SetPyColor(PyObject* team) -> void;
auto GetPyColor() -> PyObject*; // Returns a borrowed ref. auto GetPyColor() -> PyObject*; // Returns a borrowed ref.
void SetPyHighlight(PyObject* team); auto SetPyHighlight(PyObject* team) -> void;
auto GetPyHighlight() -> PyObject*; // Returns a borrowed ref. auto GetPyHighlight() -> PyObject*; // Returns a borrowed ref.
void SetPyActivityPlayer(PyObject* team); auto SetPyActivityPlayer(PyObject* team) -> void;
auto GetPyActivityPlayer() -> PyObject*; // Returns a borrowed ref. auto GetPyActivityPlayer() -> PyObject*; // Returns a borrowed ref.
void set_has_py_data(bool has) { has_py_data_ = has; } auto set_has_py_data(bool has) -> void { has_py_data_ = has; }
auto has_py_data() const -> bool { return has_py_data_; } auto has_py_data() const -> bool { return has_py_data_; }
auto GetInputDevice() const -> InputDevice* { return input_device_.get(); } auto GetInputDevice() const -> InputDevice* { return input_device_.get(); }
auto GetAge() const -> millisecs_t { return GetRealTime() - creation_time_; } auto GetAge() const -> millisecs_t { return GetRealTime() - creation_time_; }
auto accepted() const -> bool { return accepted_; } auto accepted() const -> bool { return accepted_; }
void SetPosition(const Vector3f& position); auto SetPosition(const Vector3f& position) -> void;
// If an public account-id can be determined with relative // If an public account-id can be determined with relative
// certainty for this player, returns it. Otherwise returns // certainty for this player, returns it. Otherwise returns
// an empty string. // an empty string.
auto GetPublicAccountID() const -> std::string; auto GetPublicAccountID() const -> std::string;
void SetHostActivity(HostActivity* host_activity); auto SetHostActivity(HostActivity* host_activity) -> void;
auto GetHostActivity() const -> HostActivity*; auto GetHostActivity() const -> HostActivity*;
auto has_py_ref() -> bool { return (py_ref_ != nullptr); } auto has_py_ref() -> bool { return (py_ref_ != nullptr); }
void SetIcon(const std::string& tex_name, const std::string& tint_tex_name, auto SetIcon(const std::string& tex_name, const std::string& tint_tex_name,
const std::vector<float>& tint_color, const std::vector<float>& tint_color,
const std::vector<float>& tint2_color); const std::vector<float>& tint2_color) -> void;
auto icon_tex_name() const -> const std::string& { auto icon_tex_name() const -> const std::string& {
BA_PRECONDITION(icon_set_); BA_PRECONDITION(icon_set_);
@ -104,14 +104,14 @@ class Player : public Object {
BA_PRECONDITION(icon_set_); BA_PRECONDITION(icon_set_);
return icon_tint2_color_; return icon_tint2_color_;
} }
void set_accepted(bool value) { accepted_ = value; } auto set_accepted(bool value) -> void { accepted_ = value; }
auto time_out() const -> millisecs_t { return time_out_; } auto time_out() const -> millisecs_t { return time_out_; }
void set_time_out(millisecs_t value) { time_out_ = value; } auto set_time_out(millisecs_t value) -> void { time_out_ = value; }
void set_have_position(bool value) { have_position_ = value; } auto set_have_position(bool value) -> void { have_position_ = value; }
private: private:
auto GetPyRef(bool new_ref) -> PyObject*; auto GetPyRef(bool new_ref) -> PyObject*;
void RunInput(InputType type, float value = 0.0f); auto RunInput(InputType type, float value = 0.0f) -> void;
bool icon_set_{}; bool icon_set_{};
std::string icon_tex_name_; std::string icon_tex_name_;
std::string icon_tint_tex_name_; std::string icon_tint_tex_name_;

View File

@ -12,7 +12,7 @@
namespace ballistica { namespace ballistica {
PlayerSpec::PlayerSpec() : account_type_(AccountType::kInvalid) {} PlayerSpec::PlayerSpec() = default;
PlayerSpec::PlayerSpec(const std::string& s) { PlayerSpec::PlayerSpec(const std::string& s) {
cJSON* root_obj = cJSON_Parse(s.c_str()); cJSON* root_obj = cJSON_Parse(s.c_str());

View File

@ -14,41 +14,41 @@ namespace ballistica {
// real account, and can be passed around easily in string form. // real account, and can be passed around easily in string form.
class PlayerSpec { class PlayerSpec {
public: public:
// inits an invalid player-spec /// Init an invalid player-spec
PlayerSpec(); PlayerSpec();
auto operator==(const PlayerSpec& spec) const -> bool; auto operator==(const PlayerSpec& spec) const -> bool;
// create a player-spec from a given spec-string. /// Create a player-spec from a given spec-string.
// in the case of an error, defaults will be used /// In the case of an error, defaults will be used
// (though the error will be reported) /// (though the error will be reported).
explicit PlayerSpec(const std::string& s); explicit PlayerSpec(const std::string& s);
// this returns a full display string for the spec, /// Return a full display string for the spec,
// which may include the account icon /// which may include the account icon.
auto GetDisplayString() const -> std::string; auto GetDisplayString() const -> std::string;
// returns a short version of the player's name /// Returns a short version of the player's name.
// ideal for displaying in-game; this includes /// Ideal for displaying in-game; this includes
// no icon and may just be the first name /// no icon and may just be the first name.
auto GetShortName() const -> std::string; auto GetShortName() const -> std::string;
// return the full string form to be passed around /// Return the full string form to be passed around.
auto GetSpecString() const -> std::string; auto GetSpecString() const -> std::string;
// returns a PlayerSpec for the currently logged in account /// Return a PlayerSpec for the currently logged in account.
// if there is no current logged in account, a dummy-spec is created /// If there is no current logged in account, a dummy-spec is created
// using the device name (so this always returns something reasonable) /// using the device name (so this always returns something reasonable).
static auto GetAccountPlayerSpec() -> PlayerSpec; static auto GetAccountPlayerSpec() -> PlayerSpec;
// returns a 'dummy' PlayerSpec using the given name; can be /// Return a 'dummy' PlayerSpec using the given name; can be
// used for non-account player profiles, names for non-logged-in /// used for non-account player profiles, names for non-logged-in
// party hosts, etc. /// party hosts, etc.
static auto GetDummyPlayerSpec(const std::string& name) -> PlayerSpec; static auto GetDummyPlayerSpec(const std::string& name) -> PlayerSpec;
private: private:
std::string name_; std::string name_;
std::string short_name_; std::string short_name_;
AccountType account_type_; AccountType account_type_{AccountType::kInvalid};
}; };
} // namespace ballistica } // namespace ballistica

View File

@ -105,7 +105,7 @@ GlobalsNode::GlobalsNode(Scene* scene) : Node(scene, node_type) {
Log("WARNING: more than one globals node created in HostActivity; this " Log("WARNING: more than one globals node created in HostActivity; this "
"shouldn't happen"); "shouldn't happen");
} }
ha->globals_node_ = this; ha->SetGlobalsNode(this);
// Set some values we always drive even when not the singleton 'current' // Set some values we always drive even when not the singleton 'current'
// globals (stuff that only affects our activity/scene). // globals (stuff that only affects our activity/scene).

View File

@ -512,25 +512,24 @@ auto TextWidget::GetHeight() -> float {
auto TextWidget::ShouldUseStringEditDialog() const -> bool { auto TextWidget::ShouldUseStringEditDialog() const -> bool {
if (HeadlessMode()) { if (HeadlessMode()) {
return false; return false;
} else { }
if (force_internal_editing_) { if (force_internal_editing_) {
return false; return false;
} }
if (always_use_internal_keyboard_) { if (always_use_internal_keyboard_) {
return true; return true;
} }
// On most platforms we always want to do this. // On most platforms we always want to do this.
// on mac/pc, however, we use inline editing if the current UI input-device // on mac/pc, however, we use inline editing if the current UI input-device
// is the mouse or keyboard // is the mouse or keyboard
if (g_buildconfig.ostype_macos() || g_buildconfig.ostype_windows() if (g_buildconfig.ostype_macos() || g_buildconfig.ostype_windows()
|| g_buildconfig.ostype_linux()) { || g_buildconfig.ostype_linux()) {
InputDevice* ui_input_device = g_ui->GetUIInputDevice(); InputDevice* ui_input_device = g_ui->GetUIInputDevice();
return !(ui_input_device == nullptr return !(ui_input_device == nullptr
|| ui_input_device == g_input->keyboard_input()); || ui_input_device == g_input->keyboard_input());
} else { } else {
return true; return true;
}
} }
} }