mirror of
https://github.com/coop-deluxe/sm64coopdx.git
synced 2026-06-13 11:23:01 +00:00
639 lines
18 KiB
C
639 lines
18 KiB
C
#include "sm64.h"
|
|
#include "types.h"
|
|
|
|
#include "data/dynos.c.h"
|
|
#include "game/bettercamera.h"
|
|
#include "game/camera.h"
|
|
#include "game/hardcoded.h"
|
|
#include "game/hud.h"
|
|
#include "pc/lua/smlua.h"
|
|
#include "smlua_misc_utils.h"
|
|
#include "pc/debuglog.h"
|
|
#include "pc/mods/mod.h"
|
|
#include "pc/mods/mods.h"
|
|
#include "pc/mods/mods_utils.h"
|
|
|
|
#include "game/object_list_processor.h"
|
|
#include "game/rendering_graph_node.h"
|
|
#include "game/level_update.h"
|
|
#include "pc/djui/djui_console.h"
|
|
#include "pc/djui/djui_hud_utils.h"
|
|
#include "game/skybox.h"
|
|
#include "pc/gfx/gfx_pc.h"
|
|
#include "include/course_table.h"
|
|
#include "game/level_geo.h"
|
|
#include "game/first_person_cam.h"
|
|
|
|
static struct DateTime sDateTime;
|
|
|
|
///
|
|
|
|
u32 get_network_area_timer(void) {
|
|
return gNetworkAreaTimer;
|
|
}
|
|
|
|
///
|
|
|
|
s32* get_temp_s32_pointer(s32 initialValue) {
|
|
static s32 value = 0;
|
|
value = initialValue;
|
|
return &value;
|
|
}
|
|
|
|
s32 deref_s32_pointer(s32* pointer) {
|
|
if (pointer == NULL) {
|
|
LOG_LUA_LINE("Tried to dereference null pointer!");
|
|
return 0;
|
|
}
|
|
return *pointer;
|
|
}
|
|
|
|
///
|
|
|
|
void djui_popup_create_global(const char* message, int lines) {
|
|
djui_popup_create(message, lines);
|
|
network_send_global_popup(message, lines);
|
|
}
|
|
|
|
struct AllowDjuiPopupOverride {
|
|
bool value;
|
|
bool override;
|
|
};
|
|
|
|
struct AllowDjuiPopupOverride sAllowDjuiPopupOverride;
|
|
|
|
bool djui_is_popup_disabled(void) {
|
|
// return override if there is one, otherwise return the value in the config.
|
|
return sAllowDjuiPopupOverride.override ? sAllowDjuiPopupOverride.value : configDisablePopups;
|
|
}
|
|
|
|
void djui_set_popup_disabled_override(bool value) {
|
|
// enable override
|
|
sAllowDjuiPopupOverride.override = true;
|
|
// set override to value specified in lua mod
|
|
sAllowDjuiPopupOverride.value = value;
|
|
}
|
|
|
|
void djui_reset_popup_disabled_override(void) {
|
|
// disable override
|
|
sAllowDjuiPopupOverride.override = false;
|
|
}
|
|
|
|
///
|
|
|
|
extern s8 gDialogBoxState;
|
|
s8 get_dialog_box_state(void) {
|
|
return gDialogBoxState;
|
|
}
|
|
|
|
///
|
|
|
|
extern u8 gLastCollectedStarOrKey;
|
|
s32 get_last_star_or_key(void) {
|
|
return gLastCollectedStarOrKey;
|
|
}
|
|
|
|
void set_last_star_or_key(u8 value) {
|
|
gLastCollectedStarOrKey = value;
|
|
}
|
|
|
|
extern u8 gLastCompletedCourseNum;
|
|
u8 get_last_completed_course_num(void) {
|
|
return gLastCompletedCourseNum;
|
|
}
|
|
|
|
void set_last_completed_course_num(u8 courseNum) {
|
|
gLastCompletedCourseNum = courseNum;
|
|
}
|
|
|
|
extern u8 gLastCompletedStarNum;
|
|
u8 get_last_completed_star_num(void) {
|
|
return gLastCompletedStarNum;
|
|
}
|
|
|
|
void set_last_completed_star_num(u8 starNum) {
|
|
gLastCompletedStarNum = starNum;
|
|
}
|
|
|
|
extern u8 gGotFileCoinHiScore;
|
|
bool get_got_file_coin_hi_score(void) {
|
|
return gGotFileCoinHiScore;
|
|
}
|
|
|
|
void set_got_file_coin_hi_score(bool value) {
|
|
gGotFileCoinHiScore = value ? TRUE : FALSE;
|
|
}
|
|
|
|
extern s8 gSaveFileModified;
|
|
bool get_save_file_modified(void) {
|
|
return gSaveFileModified;
|
|
}
|
|
|
|
void set_save_file_modified(bool value) {
|
|
gSaveFileModified = value ? TRUE : FALSE;
|
|
}
|
|
|
|
///
|
|
|
|
void hud_hide(void) {
|
|
gOverrideHideHud = TRUE;
|
|
}
|
|
|
|
void hud_show(void) {
|
|
gOverrideHideHud = FALSE;
|
|
}
|
|
|
|
bool hud_is_hidden(void) {
|
|
return gOverrideHideHud;
|
|
}
|
|
|
|
s32 hud_get_value(enum HudDisplayValue type) {
|
|
switch (type) {
|
|
case HUD_DISPLAY_LIVES: return gHudDisplay.lives;
|
|
case HUD_DISPLAY_COINS: return gHudDisplay.coins;
|
|
case HUD_DISPLAY_STARS: return gHudDisplay.stars;
|
|
case HUD_DISPLAY_WEDGES: return gHudDisplay.wedges;
|
|
case HUD_DISPLAY_KEYS: return gHudDisplay.keys;
|
|
case HUD_DISPLAY_FLAGS: return gHudDisplay.flags;
|
|
case HUD_DISPLAY_TIMER: return gHudDisplay.timer;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
void hud_set_value(enum HudDisplayValue type, s32 value) {
|
|
switch (type) {
|
|
case HUD_DISPLAY_LIVES: gHudDisplay.lives = value; break;
|
|
case HUD_DISPLAY_COINS: gHudDisplay.coins = value; break;
|
|
case HUD_DISPLAY_STARS: gHudDisplay.stars = value; break;
|
|
case HUD_DISPLAY_WEDGES: gHudDisplay.wedges = value; break;
|
|
case HUD_DISPLAY_KEYS: gHudDisplay.keys = value; break;
|
|
case HUD_DISPLAY_FLAGS: gHudDisplay.flags = value; break;
|
|
case HUD_DISPLAY_TIMER: gHudDisplay.timer = value; break;
|
|
}
|
|
}
|
|
|
|
void hud_render_power_meter(s32 health, f32 x, f32 y, f32 width, f32 height) {
|
|
extern const u8 texture_power_meter_left_side[];
|
|
extern const u8 texture_power_meter_right_side[];
|
|
extern const u8 texture_power_meter_full[];
|
|
extern const u8 texture_power_meter_seven_segments[];
|
|
extern const u8 texture_power_meter_six_segments[];
|
|
extern const u8 texture_power_meter_five_segments[];
|
|
extern const u8 texture_power_meter_four_segments[];
|
|
extern const u8 texture_power_meter_three_segments[];
|
|
extern const u8 texture_power_meter_two_segments[];
|
|
extern const u8 texture_power_meter_one_segments[];
|
|
static struct TextureInfo sPowerMeterTexturesInfo[] = {
|
|
{ (u8*)texture_power_meter_left_side, 8, 32, 64, "texture_power_meter_left_side" },
|
|
{ (u8*)texture_power_meter_right_side, 8, 32, 64, "texture_power_meter_right_side" },
|
|
{ (u8*)texture_power_meter_one_segments, 8, 32, 32, "texture_power_meter_one_segments" },
|
|
{ (u8*)texture_power_meter_two_segments, 8, 32, 32, "texture_power_meter_two_segments" },
|
|
{ (u8*)texture_power_meter_three_segments, 8, 32, 32, "texture_power_meter_three_segments" },
|
|
{ (u8*)texture_power_meter_four_segments, 8, 32, 32, "texture_power_meter_four_segments" },
|
|
{ (u8*)texture_power_meter_five_segments, 8, 32, 32, "texture_power_meter_five_segments" },
|
|
{ (u8*)texture_power_meter_six_segments, 8, 32, 32, "texture_power_meter_six_segments" },
|
|
{ (u8*)texture_power_meter_seven_segments, 8, 32, 32, "texture_power_meter_seven_segments" },
|
|
{ (u8*)texture_power_meter_full, 8, 32, 32, "texture_power_meter_full" },
|
|
};
|
|
djui_hud_render_texture(&sPowerMeterTexturesInfo[0], x, y, width / 64, height / 64);
|
|
djui_hud_render_texture(&sPowerMeterTexturesInfo[1], x + (width - 2) / 2, y, width / 64, height / 64);
|
|
s32 numWedges = MIN(MAX(health >> 8, 0), 8);
|
|
if (numWedges != 0) {
|
|
djui_hud_render_texture(&sPowerMeterTexturesInfo[numWedges + 1], x + (width - 4) / 4, y + height / 4, width / 64, height / 64);
|
|
}
|
|
}
|
|
|
|
void hud_render_power_meter_interpolated(s32 health, f32 prevX, f32 prevY, f32 prevWidth, f32 prevHeight, f32 x, f32 y, f32 width, f32 height) {
|
|
extern const u8 texture_power_meter_left_side[];
|
|
extern const u8 texture_power_meter_right_side[];
|
|
extern const u8 texture_power_meter_full[];
|
|
extern const u8 texture_power_meter_seven_segments[];
|
|
extern const u8 texture_power_meter_six_segments[];
|
|
extern const u8 texture_power_meter_five_segments[];
|
|
extern const u8 texture_power_meter_four_segments[];
|
|
extern const u8 texture_power_meter_three_segments[];
|
|
extern const u8 texture_power_meter_two_segments[];
|
|
extern const u8 texture_power_meter_one_segments[];
|
|
static struct TextureInfo sPowerMeterTexturesInfo[] = {
|
|
{ (u8*)texture_power_meter_left_side, 8, 32, 64, "texture_power_meter_left_side" },
|
|
{ (u8*)texture_power_meter_right_side, 8, 32, 64, "texture_power_meter_right_side" },
|
|
{ (u8*)texture_power_meter_one_segments, 8, 32, 32, "texture_power_meter_one_segments" },
|
|
{ (u8*)texture_power_meter_two_segments, 8, 32, 32, "texture_power_meter_two_segments" },
|
|
{ (u8*)texture_power_meter_three_segments, 8, 32, 32, "texture_power_meter_three_segments" },
|
|
{ (u8*)texture_power_meter_four_segments, 8, 32, 32, "texture_power_meter_four_segments" },
|
|
{ (u8*)texture_power_meter_five_segments, 8, 32, 32, "texture_power_meter_five_segments" },
|
|
{ (u8*)texture_power_meter_six_segments, 8, 32, 32, "texture_power_meter_six_segments" },
|
|
{ (u8*)texture_power_meter_seven_segments, 8, 32, 32, "texture_power_meter_seven_segments" },
|
|
{ (u8*)texture_power_meter_full, 8, 32, 32, "texture_power_meter_full" },
|
|
};
|
|
|
|
djui_hud_render_texture_interpolated(&sPowerMeterTexturesInfo[0],
|
|
prevX, prevY, prevWidth / 64, prevHeight / 64,
|
|
x, y, width / 64, height / 64);
|
|
|
|
djui_hud_render_texture_interpolated(&sPowerMeterTexturesInfo[1],
|
|
prevX + (prevWidth - 2) / 2, prevY, prevWidth / 64, prevHeight / 64,
|
|
x + (width - 2) / 2, y, width / 64, height / 64);
|
|
|
|
s32 numWedges = MIN(MAX(health >> 8, 0), 8);
|
|
if (numWedges != 0) {
|
|
djui_hud_render_texture_interpolated(&sPowerMeterTexturesInfo[numWedges + 1],
|
|
prevX + (prevWidth - 4) / 4, prevY + prevHeight / 4, prevWidth / 64, prevHeight / 64,
|
|
x + (width - 4) / 4, y + height / 4, width / 64, height / 64);
|
|
}
|
|
}
|
|
|
|
///
|
|
|
|
struct CameraOverride {
|
|
unsigned int value;
|
|
bool override;
|
|
};
|
|
|
|
struct CameraOverride sOverrideCameraXSens = { 0 };
|
|
struct CameraOverride sOverrideCameraYSens = { 0 };
|
|
struct CameraOverride sOverrideCameraAggr = { 0 };
|
|
struct CameraOverride sOverrideCameraPan = { 0 };
|
|
struct CameraOverride sOverrideCameraDegrade = { 0 };
|
|
struct CameraOverride sOverrideCameraInvertX = { 0 };
|
|
struct CameraOverride sOverrideCameraInvertY = { 0 };
|
|
struct CameraOverride sOverrideEnableCamera = { 0 };
|
|
struct CameraOverride sOverrideCameraAnalog = { 0 };
|
|
struct CameraOverride sOverrideCameraMouse = { 0 };
|
|
|
|
void camera_reset_overrides(void) {
|
|
sOverrideCameraXSens.override = false;
|
|
sOverrideCameraYSens.override = false;
|
|
sOverrideCameraAggr.override = false;
|
|
sOverrideCameraPan.override = false;
|
|
sOverrideCameraDegrade.override = false;
|
|
sOverrideCameraInvertX.override = false;
|
|
sOverrideCameraInvertY.override = false;
|
|
sOverrideEnableCamera.override = false;
|
|
sOverrideCameraAnalog.override = false;
|
|
sOverrideCameraMouse.override = false;
|
|
}
|
|
|
|
void camera_freeze(void) {
|
|
gOverrideFreezeCamera = TRUE;
|
|
}
|
|
|
|
void camera_unfreeze(void) {
|
|
gOverrideFreezeCamera = FALSE;
|
|
}
|
|
|
|
bool camera_is_frozen(void) {
|
|
return gOverrideFreezeCamera;
|
|
}
|
|
|
|
void camera_set_romhack_override(enum RomhackCameraOverride rco) {
|
|
gOverrideRomhackCamera = rco;
|
|
}
|
|
|
|
void camera_romhack_allow_centering(u8 allow) {
|
|
gRomhackCameraAllowCentering = allow;
|
|
}
|
|
|
|
void camera_allow_toxic_gas_camera(u8 allow) {
|
|
gOverrideAllowToxicGasCamera = allow;
|
|
}
|
|
|
|
void camera_romhack_allow_dpad_usage(u8 allow) {
|
|
gRomhackCameraAllowDpad = allow;
|
|
}
|
|
|
|
bool camera_config_is_free_cam_enabled(void) {
|
|
return sOverrideEnableCamera.override ? sOverrideEnableCamera.value : configEnableCamera;
|
|
}
|
|
|
|
bool camera_config_is_analog_cam_enabled(void) {
|
|
return sOverrideCameraAnalog.override ? sOverrideCameraAnalog.value : configCameraAnalog;
|
|
}
|
|
|
|
bool camera_config_is_mouse_look_enabled(void) {
|
|
return sOverrideCameraMouse.override ? sOverrideCameraMouse.value : configCameraMouse;
|
|
}
|
|
|
|
bool camera_config_is_x_inverted(void) {
|
|
return sOverrideCameraInvertX.override ? sOverrideCameraInvertX.value : configCameraInvertX;
|
|
}
|
|
|
|
bool camera_config_is_y_inverted(void) {
|
|
return sOverrideCameraInvertY.override ? sOverrideCameraInvertY.value : configCameraInvertY;
|
|
}
|
|
|
|
u32 camera_config_get_x_sensitivity(void) {
|
|
return sOverrideCameraXSens.override ? sOverrideCameraXSens.value : configCameraXSens;
|
|
}
|
|
|
|
u32 camera_config_get_y_sensitivity(void) {
|
|
return sOverrideCameraYSens.override ? sOverrideCameraYSens.value : configCameraYSens;
|
|
}
|
|
|
|
u32 camera_config_get_aggression(void) {
|
|
return sOverrideCameraAggr.override ? sOverrideCameraAggr.value : configCameraAggr;
|
|
}
|
|
|
|
u32 camera_config_get_pan_level(void) {
|
|
return sOverrideCameraPan.override ? sOverrideCameraPan.value : configCameraPan;
|
|
}
|
|
|
|
u32 camera_config_get_deceleration(void) {
|
|
return sOverrideCameraDegrade.override ? sOverrideCameraDegrade.value : configCameraDegrade;
|
|
}
|
|
|
|
void camera_config_enable_free_cam(bool enable) {
|
|
sOverrideEnableCamera.value = enable;
|
|
sOverrideEnableCamera.override = true;
|
|
newcam_init_settings();
|
|
}
|
|
|
|
void camera_config_enable_analog_cam(bool enable) {
|
|
sOverrideCameraAnalog.value = enable;
|
|
sOverrideCameraAnalog.override = true;
|
|
newcam_init_settings();
|
|
}
|
|
|
|
void camera_config_enable_mouse_look(bool enable) {
|
|
sOverrideCameraMouse.value = enable;
|
|
sOverrideCameraMouse.override = true;
|
|
newcam_init_settings();
|
|
}
|
|
|
|
void camera_config_invert_x(bool invert) {
|
|
sOverrideCameraInvertX.value = invert;
|
|
sOverrideCameraInvertX.override = true;
|
|
newcam_init_settings();
|
|
}
|
|
|
|
void camera_config_invert_y(bool invert) {
|
|
sOverrideCameraInvertY.value = invert;
|
|
sOverrideCameraInvertY.override = true;
|
|
newcam_init_settings();
|
|
}
|
|
|
|
void camera_config_set_x_sensitivity(u32 value) {
|
|
sOverrideCameraXSens.value = MIN(MAX(value, 1), 100);
|
|
sOverrideCameraXSens.override = true;
|
|
newcam_init_settings();
|
|
}
|
|
|
|
void camera_config_set_y_sensitivity(u32 value) {
|
|
sOverrideCameraYSens.value = MIN(MAX(value, 1), 100);
|
|
sOverrideCameraYSens.override = true;
|
|
newcam_init_settings();
|
|
}
|
|
|
|
void camera_config_set_aggression(u32 value) {
|
|
sOverrideCameraAggr.value = MIN(MAX(value, 0), 100);
|
|
sOverrideCameraAggr.override = true;
|
|
newcam_init_settings();
|
|
}
|
|
|
|
void camera_config_set_pan_level(u32 value) {
|
|
sOverrideCameraPan.value = MIN(MAX(value, 0), 100);
|
|
sOverrideCameraPan.override = true;
|
|
newcam_init_settings();
|
|
}
|
|
|
|
void camera_config_set_deceleration(u32 value) {
|
|
sOverrideCameraDegrade.value = MIN(MAX(value, 0), 100);
|
|
sOverrideCameraDegrade.override = true;
|
|
newcam_init_settings();
|
|
}
|
|
|
|
///
|
|
|
|
extern s16 gMenuMode;
|
|
bool is_game_paused(void) {
|
|
return gMenuMode != -1;
|
|
}
|
|
|
|
///
|
|
|
|
bool is_transition_playing(void) {
|
|
return sTransitionUpdate != NULL || gWarpTransition.isActive;
|
|
}
|
|
|
|
///
|
|
|
|
u32 allocate_mario_action(u32 actFlags) {
|
|
u32 actGroup = ((actFlags & ACT_GROUP_MASK) >> 6);
|
|
u32 actIndex = gLuaMarioActionIndex[actGroup]++;
|
|
if (actIndex >= ACT_NUM_ACTIONS_PER_GROUP) {
|
|
LOG_LUA("Cannot allocate more actions for group %u", actGroup);
|
|
return 0;
|
|
}
|
|
return (actFlags & ~ACT_INDEX_MASK) | ACT_FLAG_CUSTOM_ACTION | actIndex;
|
|
}
|
|
|
|
///
|
|
|
|
f32 get_hand_foot_pos_x(struct MarioState* m, u8 index) {
|
|
if (!m) { return 0; }
|
|
if (index >= 4) { index = 0; }
|
|
return m->marioBodyState->handFootPos[index][0];
|
|
}
|
|
|
|
f32 get_hand_foot_pos_y(struct MarioState* m, u8 index) {
|
|
if (!m) { return 0; }
|
|
if (index >= 4) { index = 0; }
|
|
return m->marioBodyState->handFootPos[index][1];
|
|
}
|
|
|
|
f32 get_hand_foot_pos_z(struct MarioState* m, u8 index) {
|
|
if (!m) { return 0; }
|
|
if (index >= 4) { index = 0; }
|
|
return m->marioBodyState->handFootPos[index][2];
|
|
}
|
|
|
|
///
|
|
|
|
s16 get_current_save_file_num(void) {
|
|
extern s16 gCurrSaveFileNum;
|
|
return gCurrSaveFileNum;
|
|
}
|
|
|
|
extern u8 gSaveFileUsingBackupSlot;
|
|
bool save_file_get_using_backup_slot(void) {
|
|
return gSaveFileUsingBackupSlot;
|
|
}
|
|
|
|
void save_file_set_using_backup_slot(bool usingBackupSlot) {
|
|
gSaveFileUsingBackupSlot = usingBackupSlot ? TRUE : FALSE;
|
|
}
|
|
|
|
///
|
|
|
|
void movtexqc_register(const char* name, s16 level, s16 area, s16 type) {
|
|
dynos_movtexqc_register(name, level, area, type);
|
|
}
|
|
|
|
///
|
|
|
|
f32 get_environment_region(u8 index) {
|
|
s32 idx = 6 * index;
|
|
if (gEnvironmentRegions != NULL && index > 0 && index <= gEnvironmentRegions[0] && gEnvironmentRegionsLength > idx) {
|
|
return gEnvironmentRegions[idx];
|
|
}
|
|
return gLevelValues.floorLowerLimit;
|
|
}
|
|
|
|
void set_environment_region(u8 index, s32 value) {
|
|
s32 idx = 6 * index;
|
|
if (gEnvironmentRegions != NULL && index > 0 && index <= gEnvironmentRegions[0] && gEnvironmentRegionsLength > idx) {
|
|
gEnvironmentRegions[idx] = value;
|
|
}
|
|
}
|
|
|
|
///
|
|
|
|
void set_override_fov(f32 fov) {
|
|
gOverrideFOV = fov;
|
|
}
|
|
|
|
///
|
|
|
|
void set_override_near(f32 near) {
|
|
gOverrideNear = near;
|
|
}
|
|
|
|
///
|
|
|
|
void set_override_far(f32 far) {
|
|
gOverrideFar = far;
|
|
}
|
|
|
|
///
|
|
|
|
void add_scroll_target(u32 index, const char* name, u32 offset, u32 size) {
|
|
dynos_add_scroll_target(index, name, offset, size);
|
|
}
|
|
|
|
///
|
|
|
|
f32 get_lighting_dir(u8 index) {
|
|
if (index > 2) { return 0; }
|
|
return gLightingDir[index];
|
|
}
|
|
|
|
void set_lighting_dir(u8 index, f32 value) {
|
|
if (index > 2) { return; }
|
|
gLightingDir[index] = value;
|
|
}
|
|
|
|
u8 get_lighting_color(u8 index) {
|
|
if (index > 2) { return 0; }
|
|
return gLightingColor[index];
|
|
}
|
|
|
|
void set_lighting_color(u8 index, u8 value) {
|
|
if (index > 2) { return; }
|
|
gLightingColor[index] = value;
|
|
}
|
|
|
|
///
|
|
|
|
u8 get_vertex_color(u8 index) {
|
|
if (index > 2) { return 0; }
|
|
return gVertexColor[index];
|
|
}
|
|
|
|
void set_vertex_color(u8 index, u8 value) {
|
|
if (index > 2) { return; }
|
|
gVertexColor[index] = value;
|
|
}
|
|
|
|
///
|
|
|
|
u8 get_fog_color(u8 index) {
|
|
if (index > 2) { return 0; }
|
|
return gFogColor[index];
|
|
}
|
|
|
|
void set_fog_color(u8 index, u8 value) {
|
|
if (index > 2) { return; }
|
|
gFogColor[index] = value;
|
|
}
|
|
|
|
f32 get_fog_intensity(void) {
|
|
return gFogIntensity;
|
|
}
|
|
|
|
void set_fog_intensity(f32 intensity) {
|
|
gFogIntensity = intensity;
|
|
}
|
|
|
|
///
|
|
|
|
s8 get_skybox(void) {
|
|
return gReadOnlyBackground;
|
|
}
|
|
|
|
void set_override_skybox(s8 background) {
|
|
gOverrideBackground = background;
|
|
}
|
|
|
|
///
|
|
|
|
bool course_is_main_course(u16 courseNum) {
|
|
return COURSE_IS_MAIN_COURSE(courseNum);
|
|
}
|
|
|
|
///
|
|
|
|
s16 get_ttc_speed_setting(void) {
|
|
return gTTCSpeedSetting;
|
|
}
|
|
|
|
void set_ttc_speed_setting(s16 speed) {
|
|
gTTCSpeedSetting = speed;
|
|
}
|
|
|
|
///
|
|
|
|
s64 get_time(void) {
|
|
return time(NULL);
|
|
}
|
|
|
|
struct DateTime* get_date_and_time(void) {
|
|
time_t currentTime;
|
|
time(¤tTime);
|
|
struct tm *lt = localtime(¤tTime);
|
|
|
|
sDateTime.year = lt->tm_year;
|
|
sDateTime.month = lt->tm_mon;
|
|
sDateTime.day = lt->tm_mday;
|
|
sDateTime.hour = lt->tm_hour;
|
|
sDateTime.minute = lt->tm_min;
|
|
sDateTime.second = lt->tm_sec;
|
|
return &sDateTime;
|
|
}
|
|
|
|
///
|
|
|
|
u16 get_envfx(void) {
|
|
return gReadOnlyEnvFx;
|
|
}
|
|
|
|
void set_override_envfx(s32 envfx) {
|
|
gOverrideEnvFx = envfx;
|
|
}
|
|
|
|
///
|
|
|
|
const char* get_os_name(void) {
|
|
#if defined(_WIN32) || defined(_WIN64)
|
|
return "Windows";
|
|
#elif __APPLE__ || __MACH__
|
|
return "Mac OSX"; // should be macOS
|
|
#elif __linux__
|
|
return "Linux";
|
|
#elif __FreeBSD__
|
|
return "FreeBSD";
|
|
#elif __unix || __unix__
|
|
return "Unix";
|
|
#else
|
|
return "Unknown";
|
|
#endif
|
|
}
|