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/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",
"build/prefab/full/linux_x86_64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/b8/eb/280d15f31dcbf3830e6730f9c4be",
"build/prefab/full/linux_x86_64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/b9/b6/7a4d577d71bbce1d0a42d0fa8f0e",
"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/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/e2/4a/c3ab9dfa2eb438e2270c867a0a32",
"build/prefab/full/mac_x86_64/debug/ballisticacore": "https://files.ballistica.net/cache/ba1/75/7d/64dee3a33a9b9df3213789d031ca",
"build/prefab/full/mac_x86_64/release/ballisticacore": "https://files.ballistica.net/cache/ba1/24/4e/0de9a93c5abf5f91efa893c0f657",
"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/release/dist/ballisticacore_headless": "https://files.ballistica.net/cache/ba1/8b/80/59caf9ded1ac2d852f57489049c2",
"build/prefab/full/windows_x86/debug/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/72/b8/b24e6069245d0c3e7c1f049e1386",
"build/prefab/full/windows_x86/release/BallisticaCore.exe": "https://files.ballistica.net/cache/ba1/79/62/ad715d74684b940ce846e7e58d8c",
"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/release/dist/ballisticacore_headless.exe": "https://files.ballistica.net/cache/ba1/bf/aa/1dcfd60aeaec8d42f06adac2156b",
"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/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/7f/3b/af2f0efe5996de7cfc31a112c514",
"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/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/93/88/21434630ae75dfd78e8f1225beaf",
"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/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/12/b2/e0851ca040064fb5c4d953003a10",
"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/release/libballisticacore_internal.a": "https://files.ballistica.net/cache/ba1/b2/7a/5c80fa986d5da7908d7c3c31c61f"
"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/83/9a/4d1f2cd9a7940d99e24d8f0719f4",
"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/a5/5d/3ba7496fb214568d79aa36bc0fa2",
"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/bd/a6/ecf53cf19d15644fe1b072dff936",
"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/c5/82/7313732699d4e1d86fa0c153c046",
"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/5a/b9/94c0e471b1cda37c5e8e8f92192b",
"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/12/a1/06e3f98c545918e81520cd1154eb",
"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/68/c6/61c27c594a5b67abb7cd0a2a0f51",
"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/53/96/32edc65468aa4546f245192238c3",
"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/bb/5f/82a7d3e039af6ad89cf42231b8b7",
"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/4d/ea/ebfd89fab46518a4c3bdf5e57638"
}

View File

@ -1,5 +1,5 @@
<!-- 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,
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>

View File

@ -185,8 +185,10 @@ void AppConfig::SetupEntries() {
bool_entries_[BoolID::kFullscreen] = BoolEntry("Fullscreen", false);
bool_entries_[BoolID::kKickIdlePlayers] =
BoolEntry("Kick Idle Players", false);
// (default to internal keyboard on iircade; not elsewhere)
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::kTVBorder] =
BoolEntry("TV Border", g_platform->IsRunningOnTV());

View File

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

View File

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

View File

@ -178,6 +178,9 @@ auto AppInternalPushPurchaseTransactionCall(const std::string& item,
bool user_initiated) -> void;
auto AppInternalGetPublicAccountID() -> std::string;
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?
auto IsUnmodifiedBlessedBuild() -> bool;

View File

@ -88,7 +88,7 @@ auto FatalError::ReportFatalError(const std::string& message,
if (g_app_globals == nullptr) {
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 (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) {
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

View File

@ -22,12 +22,6 @@ class Logging {
/// on the platform.
static auto Log(const std::string& msg, bool to_stdout = true,
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

View File

@ -12,19 +12,7 @@
namespace ballistica {
CollisionCache::CollisionCache()
: 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() { test_box_ = dCreateBox(nullptr, 1, 1, 1); }
CollisionCache::~CollisionCache() {
if (shadow_ray_) {

View File

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

View File

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

View File

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

View File

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

View File

@ -24,15 +24,15 @@ class Player : public Object {
Player(int id, HostSession* host_session);
~Player() override;
void SetInputDevice(InputDevice* input_device);
void AssignInputCall(InputType type, PyObject* call_obj);
void InputCommand(InputType type, float value = 0.0f);
auto SetInputDevice(InputDevice* input_device) -> void;
auto AssignInputCall(InputType type, PyObject* call_obj) -> void;
auto InputCommand(InputType type, float value = 0.0f) -> void;
void SetName(const std::string& name, const std::string& full_name,
bool real);
auto SetName(const std::string& name, const std::string& full_name, bool real)
-> void;
auto GetName(bool full = false, bool icon = true) const -> std::string;
auto name_is_real() const -> bool { return name_is_real_; }
void ResetInput();
auto ResetInput() -> void;
auto GetHostSession() const -> HostSession*;
auto id() const -> int { return id_; }
@ -41,7 +41,7 @@ class Player : public Object {
auto BorrowPyRef() -> PyObject* { return GetPyRef(false); }
// Set the player node for the current activity.
void set_node(Node* node) {
auto set_node(Node* node) -> void {
assert(InGameThread());
node_ = node;
}
@ -50,43 +50,43 @@ class Player : public Object {
return node_.get();
}
void SetPyTeam(PyObject* team);
auto SetPyTeam(PyObject* team) -> void;
auto GetPyTeam() -> PyObject*; // Returns a borrowed ref.
void SetPyCharacter(PyObject* team);
auto SetPyCharacter(PyObject* team) -> void;
auto GetPyCharacter() -> PyObject*; // Returns a borrowed ref.
void SetPyColor(PyObject* team);
auto SetPyColor(PyObject* team) -> void;
auto GetPyColor() -> PyObject*; // Returns a borrowed ref.
void SetPyHighlight(PyObject* team);
auto SetPyHighlight(PyObject* team) -> void;
auto GetPyHighlight() -> PyObject*; // Returns a borrowed ref.
void SetPyActivityPlayer(PyObject* team);
auto SetPyActivityPlayer(PyObject* team) -> void;
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 GetInputDevice() const -> InputDevice* { return input_device_.get(); }
auto GetAge() const -> millisecs_t { return GetRealTime() - creation_time_; }
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
// certainty for this player, returns it. Otherwise returns
// an empty string.
auto GetPublicAccountID() const -> std::string;
void SetHostActivity(HostActivity* host_activity);
auto SetHostActivity(HostActivity* host_activity) -> void;
auto GetHostActivity() const -> HostActivity*;
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>& tint2_color);
const std::vector<float>& tint2_color) -> void;
auto icon_tex_name() const -> const std::string& {
BA_PRECONDITION(icon_set_);
@ -104,14 +104,14 @@ class Player : public Object {
BA_PRECONDITION(icon_set_);
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_; }
void set_time_out(millisecs_t value) { time_out_ = value; }
void set_have_position(bool value) { have_position_ = value; }
auto set_time_out(millisecs_t value) -> void { time_out_ = value; }
auto set_have_position(bool value) -> void { have_position_ = value; }
private:
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_{};
std::string icon_tex_name_;
std::string icon_tint_tex_name_;

View File

@ -12,7 +12,7 @@
namespace ballistica {
PlayerSpec::PlayerSpec() : account_type_(AccountType::kInvalid) {}
PlayerSpec::PlayerSpec() = default;
PlayerSpec::PlayerSpec(const std::string& s) {
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.
class PlayerSpec {
public:
// inits an invalid player-spec
/// Init an invalid player-spec
PlayerSpec();
auto operator==(const PlayerSpec& spec) const -> bool;
// create a player-spec from a given spec-string.
// in the case of an error, defaults will be used
// (though the error will be reported)
/// Create a player-spec from a given spec-string.
/// In the case of an error, defaults will be used
/// (though the error will be reported).
explicit PlayerSpec(const std::string& s);
// this returns a full display string for the spec,
// which may include the account icon
/// Return a full display string for the spec,
/// which may include the account icon.
auto GetDisplayString() const -> std::string;
// returns a short version of the player's name
// ideal for displaying in-game; this includes
// no icon and may just be the first name
/// Returns a short version of the player's name.
/// Ideal for displaying in-game; this includes
/// no icon and may just be the first name.
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;
// returns a PlayerSpec for the currently logged in account
// if there is no current logged in account, a dummy-spec is created
// using the device name (so this always returns something reasonable)
/// Return a PlayerSpec for the currently logged in account.
/// If there is no current logged in account, a dummy-spec is created
/// using the device name (so this always returns something reasonable).
static auto GetAccountPlayerSpec() -> PlayerSpec;
// returns a 'dummy' PlayerSpec using the given name; can be
// used for non-account player profiles, names for non-logged-in
// party hosts, etc.
/// Return a 'dummy' PlayerSpec using the given name; can be
/// used for non-account player profiles, names for non-logged-in
/// party hosts, etc.
static auto GetDummyPlayerSpec(const std::string& name) -> PlayerSpec;
private:
std::string name_;
std::string short_name_;
AccountType account_type_;
AccountType account_type_{AccountType::kInvalid};
};
} // 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 "
"shouldn't happen");
}
ha->globals_node_ = this;
ha->SetGlobalsNode(this);
// Set some values we always drive even when not the singleton 'current'
// globals (stuff that only affects our activity/scene).

View File

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