From 9661c3d25fec6d3bfe3f7c644318b3c8f29d940a Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:20:15 -0300 Subject: [PATCH 001/103] chore(config): PSRAM ext-BSS, USB-MSC, image decoders, -O2 build Enable the build/config toggles the rest of this work depends on: CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY (large static .bss -> PSRAM), CONFIG_TINYUSB_MSC_* (expose the SD as a USB drive), the LVGL image decoders (GIF/TJPGD/lodepng), and CONFIG_COMPILER_OPTIMIZATION_PERF (-O2) for the CPU-bound software renderer. -O2 + IDF's -Werror=all turns a few pre-existing patterns into hard errors, so demote just the noisy -O2 analysis classes (stringop-truncation/-overflow, format-truncation, array-bounds, maybe-uninitialized) to warnings in the top CMakeLists. idf_component.yml gains the esp_tinyusb dependency for MSC. Co-Authored-By: Claude Opus 4.8 --- firmware_p4/CMakeLists.txt | 14 ++++++++++++++ firmware_p4/main/idf_component.yml | 2 ++ firmware_p4/sdkconfig.defaults | 17 +++++++++++++++++ 3 files changed, 33 insertions(+) diff --git a/firmware_p4/CMakeLists.txt b/firmware_p4/CMakeLists.txt index 54191944d..b04c7ad86 100644 --- a/firmware_p4/CMakeLists.txt +++ b/firmware_p4/CMakeLists.txt @@ -10,6 +10,20 @@ set(IDF_TARGET "esp32p4") include($ENV{IDF_PATH}/tools/cmake/project.cmake) +# The -O2 perf build (CONFIG_COMPILER_OPTIMIZATION_PERF) makes GCC run the flow +# analysis behind -Wstringop-truncation / -Wformat-truncation / -Wstringop-overflow +# / -Warray-bounds / -Wmaybe-uninitialized. With the IDF default -Werror=all these +# turn a cascade of pre-existing warnings across unrelated code into hard errors. +# Keep -O2 and -Werror everywhere else; demote just these noisy -O2 analysis +# classes to warnings (appended after IDF's flags so they win). NOTE: some of the +# stringop-overflow / array-bounds hits (LoRa mesh varint/resp buffers) are REAL +# undersized-buffer bugs, not false positives — track them for a dedicated fix. +idf_build_set_property(COMPILE_OPTIONS "-Wno-error=stringop-truncation" APPEND) +idf_build_set_property(COMPILE_OPTIONS "-Wno-error=format-truncation" APPEND) +idf_build_set_property(COMPILE_OPTIONS "-Wno-error=stringop-overflow" APPEND) +idf_build_set_property(COMPILE_OPTIONS "-Wno-error=array-bounds" APPEND) +idf_build_set_property(COMPILE_OPTIONS "-Wno-error=maybe-uninitialized" APPEND) + project(TentacleOS_P4) if(CMAKE_HOST_SYSTEM_NAME STREQUAL "Windows") diff --git a/firmware_p4/main/idf_component.yml b/firmware_p4/main/idf_component.yml index 44ac1ff3f..59138166a 100644 --- a/firmware_p4/main/idf_component.yml +++ b/firmware_p4/main/idf_component.yml @@ -14,3 +14,5 @@ dependencies: # compile. Revisit when upstream fixes the guard or we move to IDF 6. espressif/esp_lvgl_port: '>=2.0.0,<2.9.0' espressif/esp-dsp: ^1.5.0 + # Helix fixed-point MP3 decoder (classic MP3* API via mp3dec.h) for the player. + chmorgan/esp-libhelix-mp3: "^1.0.3" diff --git a/firmware_p4/sdkconfig.defaults b/firmware_p4/sdkconfig.defaults index 96015997a..603856d6a 100644 --- a/firmware_p4/sdkconfig.defaults +++ b/firmware_p4/sdkconfig.defaults @@ -22,6 +22,13 @@ CONFIG_ESP32P4_REV_MIN_100=y # CPU 360MHz (P4 maximum) CONFIG_ESP_DEFAULT_CPU_FREQ_MHZ_360=y +# Build the whole app + IDF at -O2 (perf) instead of the -Og default. The LVGL +# software renderer is fully CPU-bound, so this is the biggest transparent speed +# win (identical output). Assertions stay on (ASSERTIONS_ENABLE) for safety. +# Trade-off: harder step-debugging; flip back to _DEBUG for interactive debug. +CONFIG_COMPILER_OPTIMIZATION_PERF=y +# CONFIG_COMPILER_OPTIMIZATION_DEBUG is not set + # PSRAM hex-octal mode, 200MHz - P4 specific (V3 prototype has PSRAM populated) CONFIG_SPIRAM=y CONFIG_SPIRAM_MODE_HEX=y @@ -29,6 +36,11 @@ CONFIG_SPIRAM_SPEED_200M=y CONFIG_SPIRAM_USE_MALLOC=y CONFIG_SPIRAM_MALLOC_ALWAYSINTERNAL=2048 CONFIG_SPIRAM_MALLOC_RESERVE_INTERNAL=32768 +# Allow static .bss to live in PSRAM (via EXT_RAM_BSS_ATTR). The UI screens keep +# large static list buffers (image_viewer file list, gb paths, ir/wav lists, ...) +# that were pinning ~200-300 KB of the scarce internal DRAM; moving them to PSRAM +# with EXT_RAM_BSS_ATTR is what needs this on. +CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y # Larger stack for kernel_init CONFIG_ESP_MAIN_TASK_STACK_SIZE=8192 @@ -45,6 +57,8 @@ CONFIG_TINYUSB_MODE_DMA=y # TinyUSB CDC-ACM — companion host link (composite alongside the HID) CONFIG_TINYUSB_CDC_ENABLED=y CONFIG_TINYUSB_CDC_COUNT=1 +CONFIG_TINYUSB_MSC_ENABLED=y +CONFIG_TINYUSB_MSC_BUFSIZE=4096 # Required for sys_monitor (uxTaskGetSystemState / vTaskList) CONFIG_FREERTOS_USE_TRACE_FACILITY=y @@ -80,6 +94,9 @@ CONFIG_MBEDTLS_HKDF_C=y # LVGL QR code widget — companion pairing screen renders the PSK as a QR CONFIG_LV_USE_QRCODE=y +CONFIG_LV_USE_LODEPNG=y +CONFIG_LV_USE_GIF=y +CONFIG_LV_USE_TJPGD=y # LVGL snapshot — NFC card-emulation screen snapshots a panel to animate it CONFIG_LV_USE_SNAPSHOT=y From c87c6e9ee84b4a381898baf13a1bbe656610be08 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:20:29 -0300 Subject: [PATCH 002/103] fix(mesh): stop the Meshtastic/MeshCore phone-app connect crashes Memory-safety + concurrency fixes in the P4 phoneapis (BLE runs on the C5; the P4 bridges frames over SPI on RADIO-core tasks). MeshCore: DEVICE_INFO response buffer resp[80] -> resp[82] (payload is exactly 82 bytes, written out of bounds on every connect); mutex around the offline queue (mutated by 3 RADIO-core tasks); clamp the phone-supplied out_path_len before the fixed-buffer copy. Meshtastic: encode the protobuf field tag as a varint (a 1-byte tag is malformed for field numbers >=16, desyncing the handshake); add an FSM mutex across the two RADIO-core tasks; notify_task stack 4096 -> 8192. Co-Authored-By: Claude Opus 4.8 --- .../LoRa/meshcore/meshcore_phoneapi.c | 48 ++++++++++++++++--- .../LoRa/meshtastic/meshtastic_phone_bridge.c | 2 +- .../LoRa/meshtastic/meshtastic_phoneapi.c | 48 ++++++++++++++----- 3 files changed, 78 insertions(+), 20 deletions(-) diff --git a/firmware_p4/components/Applications/LoRa/meshcore/meshcore_phoneapi.c b/firmware_p4/components/Applications/LoRa/meshcore/meshcore_phoneapi.c index 33bad58f8..a89542dd5 100644 --- a/firmware_p4/components/Applications/LoRa/meshcore/meshcore_phoneapi.c +++ b/firmware_p4/components/Applications/LoRa/meshcore/meshcore_phoneapi.c @@ -15,6 +15,8 @@ #include "meshcore_phoneapi.h" +#include "esp_attr.h" + #include #include #include @@ -22,6 +24,8 @@ #include "esp_err.h" #include "esp_log.h" #include "esp_random.h" +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" #include "meshcore.h" #include "meshcore_internal.h" @@ -105,6 +109,7 @@ static const char *TAG = "MC_PHONEAPI"; #define MC_OFFLINE_QUEUE_SIZE 16 #define MC_OFFLINE_FRAME_MAX 240 +#define MC_QUEUE_MUTEX_TIMEOUT_MS 100 #define MC_NVS_KEY_BLE_PIN "ble_pin" #define MC_NVS_KEY_AUTOADD "autoadd" @@ -136,8 +141,9 @@ static uint8_t s_autoadd_max_hops = MC_AUTOADD_DEFAULT_MAX_HOPS; static meshcore_phoneapi_outbound_cb_t s_outbound_cb = NULL; static void *s_outbound_ctx = NULL; -static mc_queued_frame_t s_offline_queue[MC_OFFLINE_QUEUE_SIZE]; +EXT_RAM_BSS_ATTR static mc_queued_frame_t s_offline_queue[MC_OFFLINE_QUEUE_SIZE]; static uint8_t s_offline_queue_len = 0; +static SemaphoreHandle_t s_queue_mutex = NULL; static void send_resp(const uint8_t *buf, uint16_t len); static void send_err(uint8_t sub); @@ -193,6 +199,12 @@ esp_err_t meshcore_phoneapi_init(void) { s_offline_queue_len = 0; s_outbound_cb = NULL; s_outbound_ctx = NULL; + if (s_queue_mutex == NULL) { + s_queue_mutex = xSemaphoreCreateMutex(); + if (s_queue_mutex == NULL) { + return ESP_ERR_NO_MEM; + } + } s_is_initialized = true; ESP_LOGI(TAG, "Initialized — PIN=%lu", (unsigned long)s_ble_pin); return ESP_OK; @@ -209,7 +221,11 @@ uint32_t meshcore_phoneapi_get_pin(void) { void meshcore_phoneapi_on_disconnect(void) { s_app_target_ver = 0; + if (s_queue_mutex != NULL) + xSemaphoreTake(s_queue_mutex, portMAX_DELAY); s_offline_queue_len = 0; + if (s_queue_mutex != NULL) + xSemaphoreGive(s_queue_mutex); } void meshcore_phoneapi_on_inbound(const uint8_t *buf, uint16_t len) { @@ -460,6 +476,10 @@ static uint32_t load_or_generate_ble_pin(void) { static void offline_queue_push(const uint8_t *frame, uint16_t len) { if (len == 0 || len > MC_OFFLINE_FRAME_MAX) return; + if (s_queue_mutex != NULL && + xSemaphoreTake(s_queue_mutex, pdMS_TO_TICKS(MC_QUEUE_MUTEX_TIMEOUT_MS)) != pdTRUE) { + return; + } if (s_offline_queue_len >= MC_OFFLINE_QUEUE_SIZE) { for (int i = 0; i < MC_OFFLINE_QUEUE_SIZE - 1; i++) { s_offline_queue[i] = s_offline_queue[i + 1]; @@ -469,17 +489,28 @@ static void offline_queue_push(const uint8_t *frame, uint16_t len) { s_offline_queue[s_offline_queue_len].len = len; memcpy(s_offline_queue[s_offline_queue_len].buf, frame, len); s_offline_queue_len++; + if (s_queue_mutex != NULL) + xSemaphoreGive(s_queue_mutex); } static bool offline_queue_pop(uint8_t *out, uint16_t *out_len) { - if (s_offline_queue_len == 0) + if (s_queue_mutex != NULL && + xSemaphoreTake(s_queue_mutex, pdMS_TO_TICKS(MC_QUEUE_MUTEX_TIMEOUT_MS)) != pdTRUE) { + return false; + } + if (s_offline_queue_len == 0) { + if (s_queue_mutex != NULL) + xSemaphoreGive(s_queue_mutex); return false; + } *out_len = s_offline_queue[0].len; memcpy(out, s_offline_queue[0].buf, *out_len); for (int i = 0; i < s_offline_queue_len - 1; i++) { s_offline_queue[i] = s_offline_queue[i + 1]; } s_offline_queue_len--; + if (s_queue_mutex != NULL) + xSemaphoreGive(s_queue_mutex); return true; } @@ -514,6 +545,8 @@ static void deserialize_contact(meshcore_contact_t *c, const uint8_t in[], size_ c->type = in[o++]; c->flags = in[o++]; c->out_path_len = in[o++]; + if (c->out_path_len != MESHCORE_OUT_PATH_UNKNOWN && c->out_path_len > MESHCORE_MAX_PATH) + c->out_path_len = MESHCORE_MAX_PATH; memcpy(c->out_path, &in[o], MESHCORE_MAX_PATH); o += MESHCORE_MAX_PATH; char tmp[MESHCORE_NAME_MAX + 1] = {0}; @@ -545,7 +578,7 @@ static void handle_device_query(const uint8_t *p, uint16_t len) { s_app_target_ver = p[1]; ESP_LOGI(TAG, "app_target_ver = %u", s_app_target_ver); } - uint8_t resp[80]; + uint8_t resp[82]; uint16_t o = 0; resp[o++] = RESP_CODE_DEVICE_INFO; resp[o++] = FIRMWARE_VER_CODE; @@ -925,9 +958,12 @@ static void handle_get_advert_path(const uint8_t *p, uint16_t len) { if (c == NULL || c->out_path_len == MESHCORE_OUT_PATH_UNKNOWN) { resp[o++] = 0; } else { - resp[o++] = c->out_path_len; - memcpy(&resp[o], c->out_path, c->out_path_len); - o += c->out_path_len; + uint8_t plen = c->out_path_len; + if (plen > MESHCORE_MAX_PATH) + plen = MESHCORE_MAX_PATH; + resp[o++] = plen; + memcpy(&resp[o], c->out_path, plen); + o += plen; } send_resp(resp, o); } diff --git a/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_phone_bridge.c b/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_phone_bridge.c index a1f1726d4..f2d95b64f 100644 --- a/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_phone_bridge.c +++ b/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_phone_bridge.c @@ -31,7 +31,7 @@ static const char *TAG = "MESH_BRIDGE"; -#define BRIDGE_NOTIFY_TASK_STACK 4096 +#define BRIDGE_NOTIFY_TASK_STACK 8192 #define BRIDGE_NOTIFY_TASK_PRIO SYS_PRIO_SERVICE_HI #define BRIDGE_NOTIFY_TICK_MS 100 #define BRIDGE_SPI_TIMEOUT_MS 1000 diff --git a/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_phoneapi.c b/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_phoneapi.c index 38da59a6b..e6aefdf11 100644 --- a/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_phoneapi.c +++ b/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_phoneapi.c @@ -50,10 +50,11 @@ typedef struct { uint8_t buf[PA_MAX_FRAME_SIZE]; } pa_frame_t; -static pa_frame_t s_queue[PA_FROMRADIO_QUEUE_SZ]; +EXT_RAM_BSS_ATTR static pa_frame_t s_queue[PA_FROMRADIO_QUEUE_SZ]; static uint8_t s_queue_head = 0; static uint8_t s_queue_tail = 0; static SemaphoreHandle_t s_queue_mutex = NULL; +static SemaphoreHandle_t s_fsm_mutex = NULL; static uint32_t s_node_num = 0; static phoneapi_state_t s_state = PA_STATE_IDLE; @@ -74,25 +75,25 @@ static uint16_t enc_varint(uint8_t *buf, uint64_t value) { } static uint16_t enc_field_varint(uint8_t *buf, uint8_t field_num, uint64_t value) { - buf[0] = (field_num << 3) | 0; - return 1 + enc_varint(&buf[1], value); + uint16_t pos = enc_varint(buf, ((uint64_t)field_num << 3) | 0); + return pos + enc_varint(&buf[pos], value); } static uint16_t enc_field_bytes(uint8_t *buf, uint8_t field_num, const uint8_t *data, uint16_t len) { - buf[0] = (field_num << 3) | 2; - uint16_t pos = 1 + enc_varint(&buf[1], len); + uint16_t pos = enc_varint(buf, ((uint64_t)field_num << 3) | 2); + pos += enc_varint(&buf[pos], len); memcpy(&buf[pos], data, len); return pos + len; } static uint16_t enc_field_fixed32(uint8_t *buf, uint8_t field_num, uint32_t value) { - buf[0] = (field_num << 3) | 5; - buf[1] = (uint8_t)(value & 0xFF); - buf[2] = (uint8_t)((value >> 8) & 0xFF); - buf[3] = (uint8_t)((value >> 16) & 0xFF); - buf[4] = (uint8_t)((value >> 24) & 0xFF); - return 5; + uint16_t pos = enc_varint(buf, ((uint64_t)field_num << 3) | 5); + buf[pos++] = (uint8_t)(value & 0xFF); + buf[pos++] = (uint8_t)((value >> 8) & 0xFF); + buf[pos++] = (uint8_t)((value >> 16) & 0xFF); + buf[pos++] = (uint8_t)((value >> 24) & 0xFF); + return pos; } static uint64_t dec_varint(const uint8_t *buf, uint16_t max_len, uint16_t *out_used) { @@ -272,7 +273,7 @@ static uint16_t build_config_empty(uint8_t *out, uint32_t rid, uint8_t cfg_type) static uint16_t build_moduleconfig_empty(uint8_t *out, uint32_t rid, uint8_t mc_type) { uint8_t mc[8]; uint16_t mc_len = 0; - mc[mc_len++] = (mc_type << 3) | 2; + mc_len += enc_varint(&mc[mc_len], ((uint64_t)mc_type << 3) | 2); mc[mc_len++] = 0; uint16_t pos = 0; @@ -576,6 +577,11 @@ esp_err_t phoneapi_init(uint32_t node_num) { if (s_queue_mutex == NULL) return ESP_ERR_NO_MEM; } + if (s_fsm_mutex == NULL) { + s_fsm_mutex = xSemaphoreCreateMutex(); + if (s_fsm_mutex == NULL) + return ESP_ERR_NO_MEM; + } ESP_LOGI( TAG, "Initialized - node=0x%08lX, queue=%d", (unsigned long)node_num, PA_FROMRADIO_QUEUE_SZ); @@ -620,6 +626,8 @@ esp_err_t phoneapi_on_toradio(const uint8_t *pb_data, uint16_t pb_len) { uint64_t value = dec_varint(&pb_data[i], pb_len - i, &vused); i += vused; if (field == 3) { + if (s_fsm_mutex != NULL) + xSemaphoreTake(s_fsm_mutex, portMAX_DELAY); s_want_config_nonce = (uint32_t)value; ESP_LOGI(TAG, "ToRadio.want_config_id = %lu", (unsigned long)value); if (s_want_config_nonce == PA_NONCE_ONLY_NODES) { @@ -633,6 +641,8 @@ esp_err_t phoneapi_on_toradio(const uint8_t *pb_data, uint16_t pb_len) { k++) { advance_fsm(); } + if (s_fsm_mutex != NULL) + xSemaphoreGive(s_fsm_mutex); } } else if (wire_type == 5) { i += 4; @@ -644,9 +654,13 @@ esp_err_t phoneapi_on_toradio(const uint8_t *pb_data, uint16_t pb_len) { } uint16_t phoneapi_poll_fromradio(uint8_t *out_buf, uint16_t max_len) { + if (s_fsm_mutex != NULL) + xSemaphoreTake(s_fsm_mutex, portMAX_DELAY); while (!queue_has_data() && s_state != PA_STATE_SEND_PACKETS && s_state != PA_STATE_IDLE) { advance_fsm(); } + if (s_fsm_mutex != NULL) + xSemaphoreGive(s_fsm_mutex); return queue_pop(out_buf, max_len); } @@ -669,7 +683,15 @@ void phoneapi_push_packet(const uint8_t *mp_bytes, uint16_t mp_len) { void phoneapi_disconnect(void) { ESP_LOGI(TAG, "Transporte desconectado - resetando FSM"); + if (s_fsm_mutex != NULL) + xSemaphoreTake(s_fsm_mutex, portMAX_DELAY); s_state = PA_STATE_IDLE; - s_queue_head = s_queue_tail; s_config_iter = 0; + if (s_fsm_mutex != NULL) + xSemaphoreGive(s_fsm_mutex); + if (s_queue_mutex != NULL) + xSemaphoreTake(s_queue_mutex, portMAX_DELAY); + s_queue_head = s_queue_tail; + if (s_queue_mutex != NULL) + xSemaphoreGive(s_queue_mutex); } From a2de5483b8eeac1ee01711b293c5ca0ca3c91f8a Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:20:42 -0300 Subject: [PATCH 003/103] perf(mem): move large static UI/app buffers to PSRAM (EXT_RAM_BSS_ATTR) Internal DRAM was critically low (~19 KB free at boot; OOM restarts): libApplications.a .bss pinned the scarce internal heap with per-screen static list/DB buffers reserved even with their screen closed. Prefix the big CPU-only string/list/DB arrays with EXT_RAM_BSS_ATTR so they live in PSRAM (200 MHz octal) instead of internal DMA RAM. NFC card-emulation buffers are deliberately kept internal (timing-critical RF response path). Co-Authored-By: Claude Opus 4.8 --- .../Applications/LoRa/meshcore/meshcore_db.c | 4 +++- .../LoRa/meshtastic/meshtastic_nodedb.c | 2 +- .../Applications/LoRa/session/lora_session.c | 2 +- .../components/Applications/nfc/nfc_reader.c | 4 +++- .../nfc/protocols/mifare/mf_key_cache.c | 4 +++- .../Applications/ui/screens/badusb/badusb_menu_ui.c | 10 +++++----- .../Applications/ui/screens/infrared/ir_burst_ui.c | 13 +++++++------ .../Applications/ui/screens/infrared/ir_send_ui.c | 13 +++++++------ 8 files changed, 30 insertions(+), 22 deletions(-) diff --git a/firmware_p4/components/Applications/LoRa/meshcore/meshcore_db.c b/firmware_p4/components/Applications/LoRa/meshcore/meshcore_db.c index 1818c6306..20264b754 100644 --- a/firmware_p4/components/Applications/LoRa/meshcore/meshcore_db.c +++ b/firmware_p4/components/Applications/LoRa/meshcore/meshcore_db.c @@ -15,6 +15,8 @@ #include "meshcore_internal.h" +#include "esp_attr.h" + #include #include @@ -60,7 +62,7 @@ typedef struct { } mc_pending_t; static meshcore_channel_t s_channels[MESHCORE_MAX_CHANNELS]; -static meshcore_contact_t s_contacts[MESHCORE_MAX_CONTACTS]; +EXT_RAM_BSS_ATTR static meshcore_contact_t s_contacts[MESHCORE_MAX_CONTACTS]; static mc_dedup_entry_t s_dedup[MC_DEDUP_SIZE]; static uint16_t s_dedup_idx = 0; diff --git a/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_nodedb.c b/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_nodedb.c index c1cd02761..8adac8efc 100644 --- a/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_nodedb.c +++ b/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_nodedb.c @@ -28,7 +28,7 @@ static const char *TAG = "MT_NODEDB"; #define MT_NODEDB_NVS_KEY "nodedb" -static mt_node_entry_t s_nodes[MT_NODEDB_MAX_NODES]; +EXT_RAM_BSS_ATTR static mt_node_entry_t s_nodes[MT_NODEDB_MAX_NODES]; static uint16_t s_count = 0; static uint64_t dec_varint(const uint8_t *buf, uint16_t max_len, uint16_t *out_used) { diff --git a/firmware_p4/components/Applications/LoRa/session/lora_session.c b/firmware_p4/components/Applications/LoRa/session/lora_session.c index a36488d95..612220388 100644 --- a/firmware_p4/components/Applications/LoRa/session/lora_session.c +++ b/firmware_p4/components/Applications/LoRa/session/lora_session.c @@ -39,7 +39,7 @@ static const char *TAG = "LORA_SESSION"; static lora_proto_t s_proto = LORA_PROTO_NONE; -static lora_msg_t s_msgs[MSG_RING]; +EXT_RAM_BSS_ATTR static lora_msg_t s_msgs[MSG_RING]; static uint16_t s_head = 0; static uint16_t s_count = 0; static uint32_t s_total = 0; diff --git a/firmware_p4/components/Applications/nfc/nfc_reader.c b/firmware_p4/components/Applications/nfc/nfc_reader.c index f09963a28..1b53a45a2 100644 --- a/firmware_p4/components/Applications/nfc/nfc_reader.c +++ b/firmware_p4/components/Applications/nfc/nfc_reader.c @@ -14,6 +14,8 @@ // along with TentacleOS. If not, see . #include "nfc_reader.h" +#include "esp_attr.h" + #include #include @@ -441,7 +443,7 @@ void mf_classic_read_full(nfc_iso14443a_data_t *card) { mf_classic_key_t nested_src_key; mf_key_type_t nested_src_type = MF_KEY_A; - static sector_result_t results[40]; + EXT_RAM_BSS_ATTR static sector_result_t results[40]; memset(results, 0, sizeof(results)); for (int sect = 0; sect < nsect; sect++) { diff --git a/firmware_p4/components/Applications/nfc/protocols/mifare/mf_key_cache.c b/firmware_p4/components/Applications/nfc/protocols/mifare/mf_key_cache.c index 5ac526d28..11adf3b2c 100644 --- a/firmware_p4/components/Applications/nfc/protocols/mifare/mf_key_cache.c +++ b/firmware_p4/components/Applications/nfc/protocols/mifare/mf_key_cache.c @@ -15,6 +15,8 @@ #include "mf_key_cache.h" +#include "esp_attr.h" + #include #include "esp_log.h" @@ -30,7 +32,7 @@ static const char *TAG = "NFC_MF_KEY_CACHE"; #define NVS_ENTRY_NAME_SIZE 16 #define MF_KEY_SIZE 6 -static mf_key_cache_entry_t s_cache[MF_KEY_CACHE_MAX_CARDS]; +EXT_RAM_BSS_ATTR static mf_key_cache_entry_t s_cache[MF_KEY_CACHE_MAX_CARDS]; static int s_count = 0; static int find_entry(const uint8_t *uid, uint8_t uid_len) { diff --git a/firmware_p4/components/Applications/ui/screens/badusb/badusb_menu_ui.c b/firmware_p4/components/Applications/ui/screens/badusb/badusb_menu_ui.c index 671f25ed2..a16cd2889 100644 --- a/firmware_p4/components/Applications/ui/screens/badusb/badusb_menu_ui.c +++ b/firmware_p4/components/Applications/ui/screens/badusb/badusb_menu_ui.c @@ -40,6 +40,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #include "waves_ui.h" @@ -48,7 +49,6 @@ static const char *TAG = "BADUSB_UI"; #define TERM_GREEN 0x00E676 #define TERM_DIM_GREEN 0x1F7A52 #define DARK_PANEL_COLOR 0x05090A -#define SIG_GREEN 0x00E676 #define ERR_RED 0xFF5252 #define WARN_AMBER 0xFFB300 @@ -212,7 +212,7 @@ static view_t s_view = VIEW_LIST; static int s_payload_sel = 0; static int s_layout_active = 0; -static char s_pl_path[MAX_PAYLOADS][PL_PATH_LEN]; +EXT_RAM_BSS_ATTR static char s_pl_path[MAX_PAYLOADS][PL_PATH_LEN]; static char s_pl_name[MAX_PAYLOADS][PL_NAME_LEN]; static bool s_pl_is_asset[MAX_PAYLOADS]; static int s_pl_count = 0; @@ -899,7 +899,7 @@ static void build_layout(void) { for (int i = 0; i < LAYOUT_COUNT; i++) { menu_component_add_item(&s_menu, "/assets/icons/keyboard.bin", LAYOUTS[i].label); if (i == s_layout_active) - menu_component_set_item_label_color(&s_menu, i, lv_color_hex(SIG_GREEN)); + menu_component_set_item_label_color(&s_menu, i, lv_color_hex(UI_COL_SUCCESS)); } menu_component_select(&s_menu, s_layout_active); fade_in(s_menu.items_cont, FADE_MS); @@ -916,7 +916,7 @@ static void status_row(lv_obj_t *panel, int index, const badusb_status_row_t *ro lv_obj_t *val = lv_label_create(panel); lv_label_set_text(val, row->value); lv_obj_set_style_text_color( - val, row->is_accent ? lv_color_hex(SIG_GREEN) : current_theme.text_main, 0); + val, row->is_accent ? lv_color_hex(UI_COL_SUCCESS) : current_theme.text_main, 0); lv_obj_set_style_text_font(val, &lv_font_montserrat_12, 0); lv_obj_align(val, LV_ALIGN_TOP_RIGHT, -INFO_LABEL_X, INFO_FIRST_ROW_Y + index * INFO_ROW_GAP); } @@ -1121,7 +1121,7 @@ static void input_view_layout(const input_event_t *ev, bool press, bool nav) { if (sel >= 0 && sel < LAYOUT_COUNT && sel != s_layout_active) { menu_component_set_item_label_color(&s_menu, s_layout_active, current_theme.text_main); s_layout_active = sel; - menu_component_set_item_label_color(&s_menu, s_layout_active, lv_color_hex(SIG_GREEN)); + menu_component_set_item_label_color(&s_menu, s_layout_active, lv_color_hex(UI_COL_SUCCESS)); ESP_LOGI(TAG, "layout set: %s", LAYOUTS[s_layout_active].label); } } diff --git a/firmware_p4/components/Applications/ui/screens/infrared/ir_burst_ui.c b/firmware_p4/components/Applications/ui/screens/infrared/ir_burst_ui.c index 33218c523..53f2523e7 100644 --- a/firmware_p4/components/Applications/ui/screens/infrared/ir_burst_ui.c +++ b/firmware_p4/components/Applications/ui/screens/infrared/ir_burst_ui.c @@ -15,6 +15,8 @@ #include "ir_burst_ui.h" +#include "esp_attr.h" + #include #include "esp_log.h" @@ -26,12 +28,11 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" static const char *TAG = "IR_BURST_UI"; -#define SIG_GREEN 0x00E676 -#define COL_DIM 0x8A8594 #define BAR_TRACK 0x202028 #define IR_BURST_ICON "/assets/icons/bolt.bin" @@ -71,7 +72,7 @@ static lv_obj_t *s_log_label = NULL; static lv_obj_t *s_footer = NULL; static int s_sent = 0; -static ir_store_entry_t s_entries[IR_STORE_MAX_ENTRIES]; +EXT_RAM_BSS_ATTR static ir_store_entry_t s_entries[IR_STORE_MAX_ENTRIES]; static int s_total = 0; static void ir_burst_input(const input_event_t *ev, void *ctx); @@ -157,7 +158,7 @@ void ui_ir_burst_open(void) { s_count_label = lv_label_create(s_screen); lv_label_set_text_fmt(s_count_label, "0 / %d files", s_total); - lv_obj_set_style_text_color(s_count_label, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_count_label, current_theme.text_secondary, 0); lv_obj_set_style_text_font(s_count_label, &lv_font_montserrat_12, 0); lv_obj_set_style_text_align(s_count_label, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(s_count_label, LV_ALIGN_TOP_MID, 0, COUNT_Y); @@ -189,7 +190,7 @@ void ui_ir_burst_open(void) { s_log_label = lv_label_create(s_screen); lv_label_set_text(s_log_label, s_total > 0 ? "" : "Capture signals in Learn first"); - lv_obj_set_style_text_color(s_log_label, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_log_label, current_theme.text_secondary, 0); lv_obj_set_style_text_font(s_log_label, &lv_font_montserrat_12, 0); lv_obj_set_style_text_align(s_log_label, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(s_log_label, LV_ALIGN_BOTTOM_MID, 0, LOG_Y); @@ -237,7 +238,7 @@ static void burst_tick_cb(lv_timer_t *timer) { if (s_sent >= s_total) { lv_label_set_text(s_status_label, STATUS_DONE); - lv_obj_set_style_text_color(s_status_label, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_text_color(s_status_label, lv_color_hex(UI_COL_SUCCESS), 0); lv_label_set_text_fmt(s_count_label, "%d / %d files", s_total, s_total); if (s_footer) ui_chrome_footer_set_text(s_footer, HINT_DONE); diff --git a/firmware_p4/components/Applications/ui/screens/infrared/ir_send_ui.c b/firmware_p4/components/Applications/ui/screens/infrared/ir_send_ui.c index 644ccab18..2d6d3f928 100644 --- a/firmware_p4/components/Applications/ui/screens/infrared/ir_send_ui.c +++ b/firmware_p4/components/Applications/ui/screens/infrared/ir_send_ui.c @@ -15,6 +15,8 @@ #include "ir_send_ui.h" +#include "esp_attr.h" + #include #include "esp_log.h" @@ -29,13 +31,12 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" static const char *TAG = "IR_SEND_UI"; -#define SIG_GREEN 0x00E676 -#define COL_DIM 0x8A8594 -#define IR_ICON "/assets/icons/podcasts.bin" +#define IR_ICON "/assets/icons/podcasts.bin" #define TICK_MS 50 #define SENDING_MS 1600 @@ -55,7 +56,7 @@ static const char *TAG = "IR_SEND_UI"; #define HINT_SENT "BACK = Exit" #define HINT_OPTIONS "UP/DOWN choose OK do BACK exit" -#define EMPTY_NAME "No signals — use Learn" +#define EMPTY_NAME "No signals - use Learn" typedef enum { VIEW_LIST = 0, @@ -68,7 +69,7 @@ static menu_component_t s_menu; static send_view_t s_view = VIEW_LIST; static int s_sel = 0; -static ir_store_entry_t s_entries[IR_STORE_MAX_ENTRIES]; +EXT_RAM_BSS_ATTR static ir_store_entry_t s_entries[IR_STORE_MAX_ENTRIES]; static int s_count = 0; static lv_timer_t *s_tick_timer = NULL; @@ -151,7 +152,7 @@ static void set_status(const char *text, bool success) { return; lv_label_set_text(s_status_label, text); lv_obj_set_style_text_color( - s_status_label, success ? lv_color_hex(SIG_GREEN) : current_theme.text_main, 0); + s_status_label, success ? lv_color_hex(UI_COL_SUCCESS) : current_theme.text_main, 0); } static void set_hint(const char *text) { From 645203b5a92aeff6191112aecd81ca15b2cb6e1d Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:20:54 -0300 Subject: [PATCH 004/103] perf(render): double buffering + larger strip + full-screen takeover hook Re-enable .double_buffer and a 1/4-screen strip (freed now that static buffers moved to PSRAM) so a full redraw lands as one smooth top-to-bottom sweep instead of stepped strips. Add the lvgl_glue_direct_* trans-done semaphore path so a full-screen app (the Game Boy emulator) can drive the panel directly without corrupting frames; the shared color-trans-done ISR replicates esp_lvgl_port's flush-ready in normal mode. Co-Authored-By: Claude Opus 4.8 --- .../Service/lvgl/include/lvgl_glue.h | 21 +++++++++ .../components/Service/lvgl/lvgl_glue.c | 46 ++++++++++++++++++- 2 files changed, 65 insertions(+), 2 deletions(-) diff --git a/firmware_p4/components/Service/lvgl/include/lvgl_glue.h b/firmware_p4/components/Service/lvgl/include/lvgl_glue.h index b84df61d2..26dab043e 100644 --- a/firmware_p4/components/Service/lvgl/include/lvgl_glue.h +++ b/firmware_p4/components/Service/lvgl/include/lvgl_glue.h @@ -61,6 +61,27 @@ bool lvgl_glue_lock(int timeout_ms); */ void lvgl_glue_unlock(void); +/** + * @brief Direct-draw (panel takeover) support for a full-screen app — e.g. the + * Game Boy emulator — that holds the LVGL lock and drives the ST7789 itself via + * raw esp_lcd_panel_draw_bitmap() calls. + * + * The ST7789 SPI is async: draw_bitmap queues the transfer and returns, so + * reusing a single blit buffer for the next strip while the previous strip's DMA + * is still reading it corrupts the image (horizontal noise). Between _begin() and + * _end(), the shared color-transfer-done ISR raises a semaphore instead of + * signalling LVGL's flush-ready; the app calls lvgl_glue_wait_flush() after each + * draw to block until that strip's DMA has finished, making single-buffer reuse + * safe. Call _begin() right after taking the LVGL lock and _end() before + * releasing it. Outside this window the ISR drives LVGL exactly as before. + */ +void lvgl_glue_direct_begin(void); +void lvgl_glue_direct_end(void); + +/** Block until the most recent esp_lcd color transfer's DMA completes (or the + * timeout elapses). Only meaningful between lvgl_glue_direct_begin/_end(). */ +void lvgl_glue_wait_flush(uint32_t timeout_ms); + /** * @brief Toggle between portrait (LV_DISPLAY_ROTATION_0) and landscape- * left (LV_DISPLAY_ROTATION_90). diff --git a/firmware_p4/components/Service/lvgl/lvgl_glue.c b/firmware_p4/components/Service/lvgl/lvgl_glue.c index 7e5573b97..942bace2c 100644 --- a/firmware_p4/components/Service/lvgl/lvgl_glue.c +++ b/firmware_p4/components/Service/lvgl/lvgl_glue.c @@ -8,7 +8,11 @@ #include "lvgl_glue.h" +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" + #include "esp_heap_caps.h" +#include "esp_lcd_panel_io.h" #include "esp_lvgl_port.h" #include "esp_log.h" @@ -18,10 +22,10 @@ static const char *TAG = "LVGL_GLUE"; #define LVGL_PORT_TASK_PRIORITY SYS_PRIO_RENDER -#define LVGL_PORT_TASK_STACK (8 * 1024) +#define LVGL_PORT_TASK_STACK (16 * 1024) #define LVGL_PORT_MAX_SLEEP_MS 500 #define LVGL_PORT_TIMER_PERIOD_MS 5 -#define LVGL_BUF_LINES (LCD_PANEL_H / 8) +#define LVGL_BUF_LINES (LCD_PANEL_H / 4) #define ROTATION_LOCK_TIMEOUT_MS 2000 static bool s_ready = false; @@ -29,6 +33,23 @@ static bool s_landscape = false; static lv_display_t *s_disp = NULL; static volatile lvgl_glue_strip_cb_t s_capture_cb = NULL; +static SemaphoreHandle_t s_trans_done = NULL; +static volatile bool s_direct_mode = false; + +static bool trans_done_cb(esp_lcd_panel_io_handle_t io, + esp_lcd_panel_io_event_data_t *ed, void *ctx) { + (void)io; + (void)ed; + BaseType_t hp = pdFALSE; + if (s_direct_mode) { + if (s_trans_done != NULL) + xSemaphoreGiveFromISR(s_trans_done, &hp); + } else { + lv_display_flush_ready((lv_display_t *)ctx); + } + return hp == pdTRUE; +} + static void capture_flush_start_cb(lv_event_t *e) { lvgl_glue_strip_cb_t cb = s_capture_cb; if (cb == NULL) { @@ -93,6 +114,12 @@ esp_err_t lvgl_glue_init(void) { } lv_display_add_event_cb(s_disp, capture_flush_start_cb, LV_EVENT_FLUSH_START, NULL); + s_trans_done = xSemaphoreCreateBinary(); + const esp_lcd_panel_io_callbacks_t io_cbs = { + .on_color_trans_done = trans_done_cb, + }; + esp_lcd_panel_io_register_event_callbacks(io_handle, &io_cbs, s_disp); + ESP_LOGI(TAG, "LVGL up — %dx%d, partial double buffer (%d lines) in internal DMA RAM", LCD_PANEL_W, @@ -114,6 +141,21 @@ void lvgl_glue_capture_end(void) { s_capture_cb = NULL; } +void lvgl_glue_direct_begin(void) { + if (s_trans_done != NULL) + xSemaphoreTake(s_trans_done, 0); + s_direct_mode = true; +} + +void lvgl_glue_direct_end(void) { + s_direct_mode = false; +} + +void lvgl_glue_wait_flush(uint32_t timeout_ms) { + if (s_trans_done != NULL) + xSemaphoreTake(s_trans_done, pdMS_TO_TICKS(timeout_ms)); +} + bool lvgl_glue_lock(int timeout_ms) { return lvgl_port_lock(timeout_ms); } From abc3591e6f38f7f2cf02d732be50191ee4e92913 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:20:54 -0300 Subject: [PATCH 005/103] refactor(assets): make the image decoder color-format agnostic Read the color format from the .bin header and load via the LVGL draw-buf layout, so both ARGB8888 and RGB565A8 assets decode correctly (strict no-op for the current ARGB8888 assets). Removes the hardcoded ARGB8888 assumption. Co-Authored-By: Claude Opus 4.8 --- .../Applications/ui/assets_manager.c | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/firmware_p4/components/Applications/ui/assets_manager.c b/firmware_p4/components/Applications/ui/assets_manager.c index 695539ca5..6a3c4e02f 100644 --- a/firmware_p4/components/Applications/ui/assets_manager.c +++ b/firmware_p4/components/Applications/ui/assets_manager.c @@ -30,8 +30,6 @@ static const char *TAG = "ASSETS_MANAGER"; -#define ARGB8888_BYTES_PER_PIXEL 4 - typedef struct __attribute__((packed)) { uint32_t magic_cf; uint16_t w; @@ -104,7 +102,7 @@ static lv_result_t asset_decoder_open(lv_image_decoder_t *decoder, lv_image_deco const uint32_t w = node->dsc.header.w; const uint32_t h = node->dsc.header.h; - lv_draw_buf_t *buf = lv_draw_buf_create(w, h, LV_COLOR_FORMAT_ARGB8888, LV_STRIDE_AUTO); + lv_draw_buf_t *buf = lv_draw_buf_create(w, h, node->dsc.header.cf, LV_STRIDE_AUTO); if (buf == NULL) { ESP_LOGE(TAG, "draw buf alloc failed for %s (%lux%lu)", @@ -122,16 +120,12 @@ static lv_result_t asset_decoder_open(lv_image_decoder_t *decoder, lv_image_deco return LV_RESULT_INVALID; } - const uint32_t row_bytes = w * ARGB8888_BYTES_PER_PIXEL; - bool ok = true; - for (uint32_t y = 0; y < h && ok; y++) { - uint8_t *row = buf->data + (size_t)y * buf->header.stride; - ok = fread(row, 1, row_bytes, f) == row_bytes; - } + size_t got = fread(buf->data, 1, buf->data_size, f); fclose(f); - if (!ok) { - ESP_LOGE(TAG, "pixel read failed for %s", node->path); + if (got != buf->data_size) { + ESP_LOGE(TAG, "pixel read failed for %s (%u/%u)", node->path, (unsigned)got, + (unsigned)buf->data_size); lv_draw_buf_destroy(buf); return LV_RESULT_INVALID; } @@ -229,13 +223,21 @@ lv_image_dsc_t *assets_get(const char *path) { return NULL; } + lv_color_format_t cf = LV_COLOR_FORMAT_ARGB8888; + if ((hdr.magic_cf & 0xFF) == LV_IMAGE_HEADER_MAGIC) + cf = (lv_color_format_t)((hdr.magic_cf >> 8) & 0xFF); + uint32_t stride = lv_draw_buf_width_to_stride(hdr.w, cf); + uint32_t data_size = stride * hdr.h; + if (cf == LV_COLOR_FORMAT_RGB565A8) + data_size += (stride / 2) * hdr.h; + node->dsc.header.magic = LV_IMAGE_HEADER_MAGIC; - node->dsc.header.cf = LV_COLOR_FORMAT_ARGB8888; + node->dsc.header.cf = cf; node->dsc.header.w = hdr.w; node->dsc.header.h = hdr.h; - node->dsc.header.stride = hdr.w * ARGB8888_BYTES_PER_PIXEL; + node->dsc.header.stride = stride; node->dsc.header.flags = 0; - node->dsc.data_size = (uint32_t)hdr.w * hdr.h * ARGB8888_BYTES_PER_PIXEL; + node->dsc.data_size = data_size; node->dsc.data = (const uint8_t *)node->path; node->next = s_assets_head; From 6dc2066f0ea1b506184bd44233b9b54507b0b173 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:21:12 -0300 Subject: [PATCH 006/103] feat(games): Game Boy (DMG) emulator + ROM picker Peanut-GB core + HighBoy platform layer: recursive SD ROM discovery, fullscreen landscape blit over an internal DMA strip (waits on the LVGL trans-done semaphore so single-buffer reuse is safe), 60 Hz pacing with video frame-drop, battery .sav persistence, audio via minigb_apu, and a graceful BACK-hold exit that tears down and returns to the games menu without a reboot. peanut_gb.h / minigb_apu.* are vendored 3rd-party. Co-Authored-By: Claude Opus 4.8 --- .../Applications/ui/include/ui_liveness.h | 11 + .../ui/screens/games/games_menu_ui.c | 4 +- .../Applications/ui/screens/games/gb_ui.c | 191 + .../ui/screens/games/include/gb_ui.h | 36 + firmware_p4/components/gameboy/CMakeLists.txt | 33 + firmware_p4/components/gameboy/gb_highboy.c | 446 ++ .../components/gameboy/include/gb_highboy.h | 56 + firmware_p4/components/gameboy/minigb_apu.c | 542 +++ firmware_p4/components/gameboy/minigb_apu.h | 149 + firmware_p4/components/gameboy/peanut_gb.h | 4044 +++++++++++++++++ 10 files changed, 5509 insertions(+), 3 deletions(-) create mode 100644 firmware_p4/components/Applications/ui/screens/games/gb_ui.c create mode 100644 firmware_p4/components/Applications/ui/screens/games/include/gb_ui.h create mode 100644 firmware_p4/components/gameboy/CMakeLists.txt create mode 100644 firmware_p4/components/gameboy/gb_highboy.c create mode 100644 firmware_p4/components/gameboy/include/gb_highboy.h create mode 100644 firmware_p4/components/gameboy/minigb_apu.c create mode 100644 firmware_p4/components/gameboy/minigb_apu.h create mode 100644 firmware_p4/components/gameboy/peanut_gb.h diff --git a/firmware_p4/components/Applications/ui/include/ui_liveness.h b/firmware_p4/components/Applications/ui/include/ui_liveness.h index 8515bb18d..6c45614f6 100644 --- a/firmware_p4/components/Applications/ui/include/ui_liveness.h +++ b/firmware_p4/components/Applications/ui/include/ui_liveness.h @@ -37,6 +37,17 @@ extern "C" { */ uint32_t ui_render_beat(void); +/** + * @brief Advance the render heartbeat from a full-screen takeover renderer. + * + * A full-screen app that takes the panel and drives it directly (e.g. the Game + * Boy emulator, which holds the LVGL lock and blits itself) prevents the internal + * lv_timer from bumping the beat. Such an app must call this once per rendered + * frame so the system monitor sees the display is still alive. If the app truly + * hangs, the beat stalls and the monitor performs its normal controlled restart. + */ +void ui_render_beat_kick(void); + #ifdef __cplusplus } #endif diff --git a/firmware_p4/components/Applications/ui/screens/games/games_menu_ui.c b/firmware_p4/components/Applications/ui/screens/games/games_menu_ui.c index cf243bc62..dcf6a6e72 100644 --- a/firmware_p4/components/Applications/ui/screens/games/games_menu_ui.c +++ b/firmware_p4/components/Applications/ui/screens/games/games_menu_ui.c @@ -40,11 +40,9 @@ typedef struct { } game_t; static const game_t GAMES[] = { - {"Octo Pet", "/assets/icons/game_pet.bin", 0x834EC6, false, SCREEN_GAME_OCTOPET}, - {"Octo Flap", "/assets/icons/game_flap.bin", 0x00E5D0, true, SCREEN_GAME_FLAPPY}, {"Snake", "/assets/icons/game_snake.bin", 0x00E676, true, SCREEN_GAME_SNAKE}, {"Breakout", "/assets/icons/game_brk.bin", 0xFFB020, true, SCREEN_GAME_BREAKOUT}, - {"Motion / Level", "/assets/icons/sensors.bin", 0x22D3EE, true, SCREEN_MOTION}, + {"Game Boy", "/assets/icons/game_gb.bin", 0x9BBC0F, true, SCREEN_GAME_GB}, {"Coming Soon", "/assets/icons/timer.bin", 0x5E12A0, false, TARGET_STUB}, }; #define GAME_COUNT ((int)(sizeof(GAMES) / sizeof(GAMES[0]))) diff --git a/firmware_p4/components/Applications/ui/screens/games/gb_ui.c b/firmware_p4/components/Applications/ui/screens/games/gb_ui.c new file mode 100644 index 000000000..5322818c5 --- /dev/null +++ b/firmware_p4/components/Applications/ui/screens/games/gb_ui.c @@ -0,0 +1,191 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#include "gb_ui.h" + +#include +#include +#include + +#include "esp_attr.h" + +#include "lvgl.h" + +#include "buttons_gpio.h" +#include "gb_highboy.h" +#include "st7789.h" +#include "storage_init.h" +#include "ui_manager.h" +#include "ui_theme.h" + +#define MAX_ROMS 64 +#define NAV_MS 80 +#define SD_ROOT "/sdcard" +#define MAX_DEPTH 3 +#define ROM_PATH_LEN 300 +#define ROM_NAME_LEN 256 +#define EXT_GB_LEN 3 +#define EXT_GBC_LEN 4 +#define COLOR_NO_ROMS 0xDD4444 +#define LIST_TOP_OFFSET 26 +#define LIST_HEIGHT_TRIM 60 + +EXT_RAM_BSS_ATTR static char s_paths[MAX_ROMS][ROM_PATH_LEN]; +EXT_RAM_BSS_ATTR static char s_names[MAX_ROMS][ROM_NAME_LEN]; +static int s_count = 0; +static int s_sel = 0; +static bool s_launched = false; + +static lv_obj_t *s_scr = NULL; +static lv_obj_t *s_list = NULL; +static lv_obj_t *s_items[MAX_ROMS]; +static lv_timer_t *s_nav = NULL; +static bool s_up_last, s_dn_last, s_ok_last, s_bk_last, s_lf_last; + +static bool is_rom(const char *name) { + size_t n = strlen(name); + return (n >= EXT_GB_LEN && strcasecmp(name + n - EXT_GB_LEN, ".gb") == 0) || + (n >= EXT_GBC_LEN && strcasecmp(name + n - EXT_GBC_LEN, ".gbc") == 0); +} + +static void scan_dir(const char *dir, int depth) { + if (depth > MAX_DEPTH || s_count >= MAX_ROMS) + return; + DIR *d = opendir(dir); + if (d == NULL) + return; + struct dirent *e; + while ((e = readdir(d)) != NULL && s_count < MAX_ROMS) { + const char *dn = e->d_name; + if (dn[0] == '.') + continue; + if (strlen(dir) + 1 + strlen(dn) >= sizeof(s_paths[0])) + continue; + char full[sizeof(s_paths[0])]; + strlcpy(full, dir, sizeof(full)); + strlcat(full, "/", sizeof(full)); + strlcat(full, dn, sizeof(full)); + if (e->d_type == DT_DIR) { + scan_dir(full, depth + 1); + } else if (is_rom(dn)) { + strlcpy(s_paths[s_count], full, sizeof(s_paths[0])); + strlcpy(s_names[s_count], dn, sizeof(s_names[0])); + s_count++; + } + } + closedir(d); +} + +static void scan_roms(void) { + s_count = 0; + scan_dir(SD_ROOT, 0); +} + +static void draw_sel(void) { + for (int i = 0; i < s_count; i++) { + bool sel = (i == s_sel); + lv_label_set_text_fmt(s_items[i], "%s %s", sel ? ">" : " ", s_names[i]); + lv_obj_set_style_text_color(s_items[i], sel ? ui_theme_get_accent() : current_theme.text_main, 0); + } + if (s_count > 0) lv_obj_scroll_to_view(s_items[s_sel], LV_ANIM_OFF); +} + +static void nav_tick(lv_timer_t *t) { + if (lv_screen_active() != s_scr) { + lv_timer_delete(t); + s_nav = NULL; + return; + } + if (s_launched) { + if (highboy_gb_finished()) { + s_launched = false; + lcd_set_rotation(lcd_get_rotation()); + ui_switch_screen(SCREEN_GAMES_MENU); + } + return; + } + if (ui_input_is_locked()) return; + + bool up = ui_btn_up(), dn = ui_btn_down(), lf = ui_btn_left(); + bool ok = ok_button_is_down(), bk = back_button_is_down(); + + if (s_count > 0) { + if (dn && !s_dn_last) { s_sel = (s_sel + 1) % s_count; draw_sel(); } + if (up && !s_up_last) { s_sel = (s_sel - 1 + s_count) % s_count; draw_sel(); } + if (ok && !s_ok_last) { + s_launched = true; + highboy_gb_start(s_paths[s_sel]); + } + } + if ((bk && !s_bk_last) || (lf && !s_lf_last)) ui_switch_screen(SCREEN_GAMES_MENU); + + s_up_last = up; s_dn_last = dn; s_ok_last = ok; s_bk_last = bk; s_lf_last = lf; +} + +void ui_gb_open(void) { + s_sel = 0; + s_launched = false; + s_up_last = s_dn_last = s_ok_last = s_bk_last = s_lf_last = false; + s_nav = NULL; + + if (!storage_is_mounted()) storage_init(); + scan_roms(); + + s_scr = lv_obj_create(NULL); + lv_obj_set_style_bg_color(s_scr, current_theme.screen_base, 0); + lv_obj_set_style_bg_opa(s_scr, LV_OPA_COVER, 0); + lv_obj_remove_flag(s_scr, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_style_pad_all(s_scr, 6, 0); + + lv_obj_t *title = lv_label_create(s_scr); + lv_label_set_text(title, "GAME BOY - ROMs"); + lv_obj_set_style_text_color(title, current_theme.text_main, 0); + lv_obj_set_style_text_font(title, &lv_font_montserrat_16, 0); + lv_obj_align(title, LV_ALIGN_TOP_MID, 0, 0); + + if (s_count == 0) { + lv_obj_t *m = lv_label_create(s_scr); + lv_label_set_text(m, "No .gb / .gbc ROMs found.\n\nCopy games anywhere on the\nSD card and reopen."); + lv_obj_set_style_text_color(m, lv_color_hex(COLOR_NO_ROMS), 0); + lv_obj_set_style_text_align(m, LV_TEXT_ALIGN_CENTER, 0); + lv_obj_center(m); + } else { + int vres = lv_display_get_vertical_resolution(NULL); + s_list = lv_obj_create(s_scr); + lv_obj_set_style_bg_opa(s_list, LV_OPA_TRANSP, 0); + lv_obj_set_style_border_width(s_list, 0, 0); + lv_obj_set_style_pad_all(s_list, 2, 0); + lv_obj_set_size(s_list, LV_PCT(100), vres - LIST_HEIGHT_TRIM); + lv_obj_align(s_list, LV_ALIGN_TOP_MID, 0, LIST_TOP_OFFSET); + lv_obj_set_flex_flow(s_list, LV_FLEX_FLOW_COLUMN); + lv_obj_set_scroll_dir(s_list, LV_DIR_VER); + for (int i = 0; i < s_count; i++) { + s_items[i] = lv_label_create(s_list); + lv_obj_set_style_text_font(s_items[i], &lv_font_montserrat_14, 0); + lv_obj_set_width(s_items[i], LV_PCT(100)); + lv_label_set_long_mode(s_items[i], LV_LABEL_LONG_DOT); + } + draw_sel(); + } + + lv_obj_t *hint = lv_label_create(s_scr); + lv_label_set_text(hint, s_count > 0 ? "UP/DN pick OK play BACK exit" : "BACK exit"); + lv_obj_set_style_text_color(hint, current_theme.text_main, 0); + lv_obj_set_style_text_font(hint, &lv_font_montserrat_12, 0); + lv_obj_align(hint, LV_ALIGN_BOTTOM_MID, 0, 0); + + s_nav = lv_timer_create(nav_tick, NAV_MS, NULL); + ui_screen_load(s_scr); +} diff --git a/firmware_p4/components/Applications/ui/screens/games/include/gb_ui.h b/firmware_p4/components/Applications/ui/screens/games/include/gb_ui.h new file mode 100644 index 000000000..90770e498 --- /dev/null +++ b/firmware_p4/components/Applications/ui/screens/games/include/gb_ui.h @@ -0,0 +1,36 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#ifndef GB_UI_H +#define GB_UI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Open the Game Boy ROM picker screen. + * + * Recursively lists every .gb/.gbc ROM on the SD card and lets the user choose + * one; OK hands the chosen ROM to the emulator (components/gameboy), which takes + * over the display. Returns to the games menu on BACK or when the emulator exits. + */ +void ui_gb_open(void); + +#ifdef __cplusplus +} +#endif + +#endif // GB_UI_H diff --git a/firmware_p4/components/gameboy/CMakeLists.txt b/firmware_p4/components/gameboy/CMakeLists.txt new file mode 100644 index 000000000..ed3d549d0 --- /dev/null +++ b/firmware_p4/components/gameboy/CMakeLists.txt @@ -0,0 +1,33 @@ +# Copyright (c) 2025 HIGH CODE LLC +# +# TentacleOS is free software: you can redistribute it and/or modify +# it under the terms of the GNU General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# TentacleOS is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with TentacleOS. If not, see . + +# Game Boy (DMG) emulator — Peanut-GB core + HighBoy platform layer. +file(GLOB GB_SRCS "*.c") # gb_highboy.c + minigb_apu.c +idf_component_register( + SRCS ${GB_SRCS} + INCLUDE_DIRS "include" + PRIV_INCLUDE_DIRS "." # peanut_gb.h (single-header core) + REQUIRES Drivers Service lvgl esp_lcd esp_timer esp_system driver +) + +# Sound: enable Peanut-GB audio hooks (gb_highboy.c) and the minigb_apu 16-bit +# sample format (both gb_highboy.c and minigb_apu.c must see the format macro). +target_compile_definitions(${COMPONENT_LIB} PRIVATE + ENABLE_SOUND=1 + MINIGB_APU_AUDIO_FORMAT_S16SYS +) + +# Peanut-GB is performance-critical and warns a lot; optimize + silence. +target_compile_options(${COMPONENT_LIB} PRIVATE -O2 -w) diff --git a/firmware_p4/components/gameboy/gb_highboy.c b/firmware_p4/components/gameboy/gb_highboy.c new file mode 100644 index 000000000..8ba614342 --- /dev/null +++ b/firmware_p4/components/gameboy/gb_highboy.c @@ -0,0 +1,446 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#include "gb_highboy.h" + +#include +#include +#include +#include +#include + +#include "esp_heap_caps.h" +#include "esp_lcd_panel_ops.h" +#include "esp_log.h" +#include "esp_system.h" +#include "esp_timer.h" +#include "freertos/FreeRTOS.h" +#include "freertos/idf_additions.h" +#include "freertos/task.h" + +#include "audio_i2s.h" +#include "buttons_gpio.h" +#include "lvgl_glue.h" +#include "st7789.h" +#include "storage_init.h" +#include "sys_prio.h" + +void ui_render_beat_kick(void); + +#define GB_OPEN_BUS 0xFF + +#define ENABLE_LCD 1 +#include "minigb_apu.h" +static struct minigb_apu_ctx *s_apu = NULL; +uint8_t audio_read(const uint16_t addr) { + return s_apu ? minigb_apu_audio_read(s_apu, addr) : GB_OPEN_BUS; +} +void audio_write(const uint16_t addr, const uint8_t val) { + if (s_apu) minigb_apu_audio_write(s_apu, addr, val); +} +#include "peanut_gb.h" + +static const char *TAG = "GB"; + +#define GB_JOYPAD_IDLE 0xFF + +#define GB_DST_W 320 +#define GB_DST_H 240 +#define GB_X_OFF ((320 - GB_DST_W) / 2) +#define GB_Y_OFF ((240 - GB_DST_H) / 2) +#define GB_STRIP_ROWS 24 + +#define GB_ROM_PATH_LEN 300 +#define GB_MAIN_STACK 32768 +#define GB_AUDIO_STACK 4096 + +#define GB_STARTUP_DELAY_MS 150 +#define GB_EXIT_HOLD_MS 1200 +#define GB_AUTOSAVE_MS 3000 +#define GB_FLUSH_WAIT_MS 100 +#define GB_DMA_DRAIN_MS 30 +#define GB_HALT_DELAY_MS 2000 +#define GB_AUDIO_POLL_MS 10 +#define GB_AUDIO_STOP_TRIES 100 + +#define GB_FRAME_US (1000000 / 60) +#define GB_RESYNC_US 250000 + +static const uint32_t GB_DMG_PALETTE[] = {0xE0F8D0, 0x88C070, 0x346856, 0x081820}; +#define GB_DMG_PALETTE_COUNT (sizeof(GB_DMG_PALETTE) / sizeof(GB_DMG_PALETTE[0])) + +static struct gb_s *s_gb; +static uint8_t *s_rom; +static size_t s_rom_size; +static uint8_t *s_cram; +static size_t s_cram_size; +static uint8_t *s_shade; +static uint16_t *s_strip; +static uint16_t s_pal[GB_DMG_PALETTE_COUNT]; +static uint8_t s_sx[GB_DST_W], s_sy[GB_DST_H]; + +static char s_rompath[GB_ROM_PATH_LEN]; +static char s_savepath[GB_ROM_PATH_LEN]; +static bool s_has_save = false; +static volatile bool s_cram_dirty = false; +static int64_t s_cram_dirty_ms = 0; + +static volatile bool s_exit_req = false; +static volatile bool s_finished = false; +static volatile bool s_audio_run = true; +static volatile bool s_audio_done = false; + +bool highboy_gb_finished(void) { + return s_finished; +} + +static uint8_t rom_read(struct gb_s *gb, const uint_fast32_t addr) { + (void)gb; + return addr < s_rom_size ? s_rom[addr] : GB_OPEN_BUS; +} + +static uint8_t cram_read(struct gb_s *gb, const uint_fast32_t addr) { + (void)gb; + return (s_cram && addr < s_cram_size) ? s_cram[addr] : GB_OPEN_BUS; +} + +static void cram_write(struct gb_s *gb, const uint_fast32_t addr, const uint8_t v) { + (void)gb; + if (s_cram && addr < s_cram_size) { + s_cram[addr] = v; + s_cram_dirty = true; + s_cram_dirty_ms = esp_timer_get_time() / 1000; + } +} + +static void gb_err(struct gb_s *gb, const enum gb_error_e e, const uint16_t addr) { + (void)gb; + ESP_LOGE(TAG, "gb_error %d @ 0x%04X", (int)e, addr); +} + +static void lcd_line(struct gb_s *gb, const uint8_t *pixels, const uint_fast8_t line) { + (void)gb; + if (line >= LCD_HEIGHT) return; + uint8_t *dst = s_shade + (size_t)line * LCD_WIDTH; + for (int x = 0; x < LCD_WIDTH; x++) dst[x] = pixels[x] & LCD_COLOUR; +} + +static inline uint16_t to565be(uint32_t rgb) { + uint8_t r = (rgb >> 16) & 0xFF, g = (rgb >> 8) & 0xFF, b = rgb & 0xFF; + uint16_t c = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); + return (uint16_t)((c >> 8) | (c << 8)); +} + +static bool find_gb_rom(char *out, size_t outsz) { + const char *dirs[] = {"/sdcard", "/sdcard/gb", "/sdcard/roms", NULL}; + for (int d = 0; dirs[d]; d++) { + DIR *dir = opendir(dirs[d]); + if (!dir) continue; + struct dirent *e; + while ((e = readdir(dir)) != NULL) { + size_t n = strlen(e->d_name); + bool gb = (n >= 3 && strcasecmp(e->d_name + n - 3, ".gb") == 0); + bool gbc = (n >= 4 && strcasecmp(e->d_name + n - 4, ".gbc") == 0); + if (gb || gbc) { + snprintf(out, outsz, "%s/%s", dirs[d], e->d_name); + closedir(dir); + return true; + } + } + closedir(dir); + } + return false; +} + +static void derive_savepath(void) { + strncpy(s_savepath, s_rompath, sizeof(s_savepath) - 1); + s_savepath[sizeof(s_savepath) - 1] = '\0'; + char *dot = strrchr(s_savepath, '.'); + char *slash = strrchr(s_savepath, '/'); + if (dot && (!slash || dot > slash)) + *dot = '\0'; + strncat(s_savepath, ".sav", sizeof(s_savepath) - strlen(s_savepath) - 1); +} + +static void load_cram(void) { + if (!s_has_save || !s_cram) return; + FILE *f = fopen(s_savepath, "rb"); + if (!f) { ESP_LOGW(TAG, "no save file yet (%s)", s_savepath); return; } + fseek(f, 0, SEEK_END); + long sz = ftell(f); + fseek(f, 0, SEEK_SET); + if ((size_t)sz == s_cram_size) { + size_t rd = fread(s_cram, 1, s_cram_size, f); + ESP_LOGW(TAG, "save loaded (%u B) from %s", (unsigned)rd, s_savepath); + } else { + ESP_LOGW(TAG, "save size mismatch (%ld vs %u) - ignoring", sz, (unsigned)s_cram_size); + } + fclose(f); +} + +static void save_cram(void) { + if (!s_has_save || !s_cram || s_cram_size <= 1) return; + FILE *f = fopen(s_savepath, "wb"); + if (!f) { ESP_LOGE(TAG, "save open failed (%s)", s_savepath); return; } + size_t w = fwrite(s_cram, 1, s_cram_size, f); + fclose(f); + s_cram_dirty = false; + ESP_LOGW(TAG, "save written (%u B) -> %s", (unsigned)w, s_savepath); +} + +static void poll_input(void) { + bool up = up_button_is_down(), dn = down_button_is_down(); + bool l = left_button_is_down(), r = right_button_is_down(); + bool ok = ok_button_is_down(), bk = back_button_is_down(); + uint8_t jp = GB_JOYPAD_IDLE; + if (r) jp &= ~JOYPAD_UP; + if (l) jp &= ~JOYPAD_DOWN; + if (up) jp &= ~JOYPAD_LEFT; + if (dn) jp &= ~JOYPAD_RIGHT; + + static int64_t bk_since = 0; + if (ok && bk) { + jp &= ~JOYPAD_START; + bk_since = 0; + } else { + if (ok) jp &= ~JOYPAD_A; + if (bk) { + jp &= ~JOYPAD_B; + int64_t now = esp_timer_get_time() / 1000; + if (bk_since == 0) bk_since = now; + else if (now - bk_since >= GB_EXIT_HOLD_MS) { + s_exit_req = true; + } + } else { + bk_since = 0; + } + } + s_gb->direct.joypad = jp; +} + +static void blit_frame(void) { + for (int y0 = 0; y0 < GB_DST_H; y0 += GB_STRIP_ROWS) { + int rows = (y0 + GB_STRIP_ROWS <= GB_DST_H) ? GB_STRIP_ROWS : (GB_DST_H - y0); + for (int j = 0; j < rows; j++) { + const uint8_t *srow = s_shade + (size_t)s_sy[y0 + j] * LCD_WIDTH; + uint16_t *orow = s_strip + (size_t)j * GB_DST_W; + for (int x = 0; x < GB_DST_W; x++) orow[x] = s_pal[srow[s_sx[x]]]; + } + esp_lcd_panel_draw_bitmap(panel_handle, GB_X_OFF, GB_Y_OFF + y0, GB_X_OFF + GB_DST_W, + GB_Y_OFF + y0 + rows, s_strip); + lvgl_glue_wait_flush(GB_FLUSH_WAIT_MS); + } +} + +static void panel_clear_black(void) { + memset(s_strip, 0, (size_t)GB_DST_W * GB_STRIP_ROWS * sizeof(uint16_t)); + for (int y = 0; y < GB_DST_H; y += GB_STRIP_ROWS) { + int rows = (y + GB_STRIP_ROWS <= GB_DST_H) ? GB_STRIP_ROWS : (GB_DST_H - y); + esp_lcd_panel_draw_bitmap(panel_handle, 0, y, GB_DST_W, y + rows, s_strip); + lvgl_glue_wait_flush(GB_FLUSH_WAIT_MS); + } + vTaskDelay(pdMS_TO_TICKS(GB_DMA_DRAIN_MS)); +} + +static void gb_audio_task(void *arg) { + (void)arg; + if (audio_i2s_stream_start(AUDIO_SAMPLE_RATE) != ESP_OK) { + ESP_LOGE(TAG, "audio stream start failed - no sound"); + s_audio_done = true; + vTaskDeleteWithCaps(NULL); + return; + } + int16_t *st = heap_caps_malloc(AUDIO_SAMPLES_TOTAL * sizeof(int16_t), MALLOC_CAP_SPIRAM); + int16_t *mo = heap_caps_malloc(AUDIO_SAMPLES * sizeof(int16_t), MALLOC_CAP_SPIRAM); + if (st == NULL || mo == NULL) { + ESP_LOGE(TAG, "audio buf alloc failed"); + free(st); + free(mo); + s_audio_done = true; + vTaskDeleteWithCaps(NULL); + return; + } + ESP_LOGW(TAG, "audio task running @ %d Hz", AUDIO_SAMPLE_RATE); + while (s_audio_run) { + if (s_apu == NULL) { vTaskDelay(pdMS_TO_TICKS(GB_AUDIO_POLL_MS)); continue; } + minigb_apu_audio_callback(s_apu, st); + for (unsigned i = 0; i < AUDIO_SAMPLES; i++) + mo[i] = (int16_t)(((int)st[2 * i] + (int)st[2 * i + 1]) >> 1); + audio_i2s_stream_write(mo, AUDIO_SAMPLES); + } + free(st); + free(mo); + s_audio_done = true; + vTaskDeleteWithCaps(NULL); +} + +static void gb_main_task(void *arg) { + (void)arg; + ESP_LOGW(TAG, "gb_main_task: enter (free int=%u psram=%u)", + (unsigned)heap_caps_get_free_size(MALLOC_CAP_INTERNAL), + (unsigned)heap_caps_get_free_size(MALLOC_CAP_SPIRAM)); + vTaskDelay(pdMS_TO_TICKS(GB_STARTUP_DELAY_MS)); + + if (!storage_is_mounted()) storage_init(); + if (!storage_is_mounted()) { + ESP_LOGE(TAG, "SD not mounted. Halting."); + for (;;) vTaskDelay(pdMS_TO_TICKS(GB_HALT_DELAY_MS)); + } + + if (s_rompath[0] == '\0' && !find_gb_rom(s_rompath, sizeof(s_rompath))) { + ESP_LOGE(TAG, "No .gb/.gbc ROM found on SD."); + for (;;) vTaskDelay(pdMS_TO_TICKS(GB_HALT_DELAY_MS)); + } + ESP_LOGW(TAG, "loading ROM: %s", s_rompath); + FILE *f = fopen(s_rompath, "rb"); + if (f == NULL) { ESP_LOGE(TAG, "fopen failed"); for (;;) vTaskDelay(pdMS_TO_TICKS(GB_HALT_DELAY_MS)); } + fseek(f, 0, SEEK_END); + s_rom_size = ftell(f); + fseek(f, 0, SEEK_SET); + s_rom = heap_caps_malloc(s_rom_size, MALLOC_CAP_SPIRAM); + if (s_rom == NULL) { ESP_LOGE(TAG, "ROM alloc %u failed", (unsigned)s_rom_size); for (;;) vTaskDelay(pdMS_TO_TICKS(GB_HALT_DELAY_MS)); } + size_t rd = fread(s_rom, 1, s_rom_size, f); + fclose(f); + ESP_LOGW(TAG, "ROM %u bytes read (%u)", (unsigned)rd, (unsigned)s_rom_size); + + s_gb = heap_caps_malloc(sizeof(struct gb_s), MALLOC_CAP_SPIRAM); + s_shade = heap_caps_malloc((size_t)LCD_WIDTH * LCD_HEIGHT, MALLOC_CAP_SPIRAM); + s_strip = heap_caps_malloc((size_t)GB_DST_W * GB_STRIP_ROWS * sizeof(uint16_t), + MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL); + if (s_gb == NULL || s_shade == NULL || s_strip == NULL) { + ESP_LOGE(TAG, "buffer alloc failed (int free=%u) - returning to launcher", + (unsigned)heap_caps_get_free_size(MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL)); + vTaskDelay(pdMS_TO_TICKS(50)); + esp_restart(); + } + memset(s_shade, 0, (size_t)LCD_WIDTH * LCD_HEIGHT); + + enum gb_init_error_e ie = gb_init(s_gb, rom_read, cram_read, cram_write, gb_err, NULL); + ESP_LOGW(TAG, "gb_init -> %d", (int)ie); + if (ie != GB_INIT_NO_ERROR) { + ESP_LOGE(TAG, "gb_init failed (%d) - unsupported cart?", (int)ie); + for (;;) vTaskDelay(pdMS_TO_TICKS(GB_HALT_DELAY_MS)); + } + + size_t ram = 0; + gb_get_save_size_s(s_gb, &ram); + s_has_save = (ram > 0); + s_cram_size = ram ? ram : 1; + s_cram = heap_caps_malloc(s_cram_size, MALLOC_CAP_SPIRAM); + if (s_cram) memset(s_cram, 0, s_cram_size); + gb_init_lcd(s_gb, lcd_line); + + derive_savepath(); + load_cram(); + s_cram_dirty = false; + + s_apu = heap_caps_malloc(sizeof(struct minigb_apu_ctx), MALLOC_CAP_SPIRAM); + if (s_apu) { + minigb_apu_audio_init(s_apu); + xTaskCreatePinnedToCoreWithCaps(gb_audio_task, "gb_audio", GB_AUDIO_STACK, NULL, + SYS_PRIO_SERVICE_HI, NULL, SYS_CORE_RADIO, + MALLOC_CAP_SPIRAM); + } else { + ESP_LOGW(TAG, "APU alloc failed - running without sound"); + s_audio_done = true; + } + + for (size_t i = 0; i < GB_DMG_PALETTE_COUNT; i++) s_pal[i] = to565be(GB_DMG_PALETTE[i]); + for (int x = 0; x < GB_DST_W; x++) s_sx[x] = (uint8_t)(x * LCD_WIDTH / GB_DST_W); + for (int y = 0; y < GB_DST_H; y++) s_sy[y] = (uint8_t)(y * LCD_HEIGHT / GB_DST_H); + + lvgl_glue_lock(-1); + lvgl_glue_direct_begin(); + esp_lcd_panel_swap_xy(panel_handle, true); + esp_lcd_panel_mirror(panel_handle, true, false); + panel_clear_black(); + ESP_LOGW(TAG, "running. D-pad, OK=A, BACK=B, OK+BACK=START, hold BACK ~1.2s=exit."); + + int64_t start = esp_timer_get_time(); + uint64_t frame = 0; + int64_t last_blit = 0; + for (;;) { + poll_input(); + if (s_exit_req) break; + + int64_t now = esp_timer_get_time(); + int64_t due = start + (int64_t)frame * GB_FRAME_US; + bool behind = (now > due + GB_FRAME_US); + bool want_blit = !behind && (now - last_blit >= 2 * GB_FRAME_US); + s_gb->direct.frame_skip = !want_blit; + + gb_run_frame(s_gb); + frame++; + + if (want_blit) { + blit_frame(); + last_blit = esp_timer_get_time(); + } + ui_render_beat_kick(); + + if (s_cram_dirty) { + int64_t ms = esp_timer_get_time() / 1000; + if (ms - s_cram_dirty_ms >= GB_AUTOSAVE_MS) save_cram(); + } + + now = esp_timer_get_time(); + due = start + (int64_t)frame * GB_FRAME_US; + if (due > now) { + int64_t d_ms = (due - now) / 1000; + if (d_ms >= 1) vTaskDelay(pdMS_TO_TICKS(d_ms)); + } else if (now - due > GB_RESYNC_US) { + start = now - (int64_t)frame * GB_FRAME_US; + } + } + + ESP_LOGW(TAG, "exit requested -> save + teardown"); + save_cram(); + + s_audio_run = false; + for (int i = 0; i < GB_AUDIO_STOP_TRIES && !s_audio_done; i++) + vTaskDelay(pdMS_TO_TICKS(GB_AUDIO_POLL_MS)); + audio_i2s_stream_stop(); + + vTaskDelay(pdMS_TO_TICKS(GB_DMA_DRAIN_MS)); + + if (s_apu) { free(s_apu); s_apu = NULL; } + if (s_cram) { free(s_cram); s_cram = NULL; } + if (s_strip) { free(s_strip); s_strip = NULL; } + if (s_shade) { free(s_shade); s_shade = NULL; } + if (s_gb) { free(s_gb); s_gb = NULL; } + if (s_rom) { free(s_rom); s_rom = NULL; } + + lvgl_glue_direct_end(); + s_finished = true; + lvgl_glue_unlock(); + vTaskDeleteWithCaps(NULL); +} + +void highboy_gb_start(const char *rompath) { + s_exit_req = false; + s_finished = false; + s_audio_run = true; + s_audio_done = false; + if (rompath && rompath[0]) { + strncpy(s_rompath, rompath, sizeof(s_rompath) - 1); + s_rompath[sizeof(s_rompath) - 1] = '\0'; + } else { + s_rompath[0] = '\0'; + } + BaseType_t ok = xTaskCreatePinnedToCoreWithCaps( + gb_main_task, "gameboy", GB_MAIN_STACK, NULL, + SYS_PRIO_SERVICE_HI, NULL, SYS_CORE_UI, MALLOC_CAP_SPIRAM); + ESP_LOGW(TAG, "highboy_gb_start: task create -> %s", ok == pdPASS ? "OK" : "FAILED"); +} diff --git a/firmware_p4/components/gameboy/include/gb_highboy.h b/firmware_p4/components/gameboy/include/gb_highboy.h new file mode 100644 index 000000000..17e3e869d --- /dev/null +++ b/firmware_p4/components/gameboy/include/gb_highboy.h @@ -0,0 +1,56 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#ifndef GB_HIGHBOY_H +#define GB_HIGHBOY_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Launch the Game Boy (DMG) emulator (Peanut-GB core) in its own task. + * + * The emulator takes over the ST7789 (landscape, stretched to full screen) and + * runs until the user holds BACK for ~1.2 s. Battery-backed cartridge RAM is + * persisted to .sav next to the ROM on the SD card. + * + * On exit the task tears itself down (stops audio, frees its buffers, releases + * the LVGL lock) and reports highboy_gb_finished(); the ROM picker then restores + * the panel orientation and returns to the games menu without a firmware reboot. + * + * @param rompath Full SD path of the .gb/.gbc ROM to run, or NULL/"" to + * auto-discover the first ROM on the SD card. + */ +void highboy_gb_start(const char *rompath); + +/** + * @brief Whether the emulator task has fully torn down. + * + * Polled by the ROM picker's navigation timer (LVGL task) so it can restore the + * panel and switch to the games menu once the emulator has released the panel. + * Reset to false by the next highboy_gb_start(). + * + * @return true once teardown is complete, false while the emulator is running. + */ +bool highboy_gb_finished(void); + +#ifdef __cplusplus +} +#endif + +#endif // GB_HIGHBOY_H diff --git a/firmware_p4/components/gameboy/minigb_apu.c b/firmware_p4/components/gameboy/minigb_apu.c new file mode 100644 index 000000000..a9671e181 --- /dev/null +++ b/firmware_p4/components/gameboy/minigb_apu.c @@ -0,0 +1,542 @@ +/** + * Game Boy APU emulator. + * Copyright (c) 2019 Mahyar Koshkouei + * Copyright (c) 2017 Alex Baines + * minigb_apu is released under the terms of the MIT license. + * + * minigb_apu emulates the audio processing unit (APU) of the Game Boy. This + * project is based on MiniGBS by Alex Baines: https://github.com/baines/MiniGBS + */ + +#include +#include +#include + +#include "minigb_apu.h" + +#define DMG_CLOCK_FREQ_U ((unsigned)DMG_CLOCK_FREQ) +#define AUDIO_NSAMPLES (AUDIO_SAMPLES_TOTAL) + +#define MAX(a, b) ( a > b ? a : b ) +#define MIN(a, b) ( a <= b ? a : b ) + +/* Factor in which values are multiplied to compensate for fixed-point + * arithmetic. Some hard-coded values in this project must be recreated. */ +#ifndef FREQ_INC_MULT +# define FREQ_INC_MULT 105 +#endif +/* Handles time keeping for sound generation. + * FREQ_INC_REF must be equal to, or larger than AUDIO_SAMPLE_RATE in order + * to avoid a division by zero error. + * Using a square of 2 simplifies calculations. */ +#define FREQ_INC_REF (AUDIO_SAMPLE_RATE * FREQ_INC_MULT) + +#define MAX_CHAN_VOLUME 15 + +static void set_note_freq(struct chan *c) +{ + /* Lowest expected value of freq is 64. */ + uint32_t freq = (DMG_CLOCK_FREQ_U / 4) / (2048 - c->freq); + c->freq_inc = freq * (uint32_t)(FREQ_INC_REF / AUDIO_SAMPLE_RATE); +} + +static void chan_enable(struct minigb_apu_ctx *ctx, + const uint_fast8_t i, const bool enable) +{ + uint8_t val; + + ctx->chans[i].enabled = enable; + val = (ctx->audio_mem[0xFF26 - AUDIO_ADDR_COMPENSATION] & 0x80) | + (ctx->chans[3].enabled << 3) | (ctx->chans[2].enabled << 2) | + (ctx->chans[1].enabled << 1) | (ctx->chans[0].enabled << 0); + + ctx->audio_mem[0xFF26 - AUDIO_ADDR_COMPENSATION] = val; +} + +static void update_env(struct chan *c) +{ + c->env.counter += c->env.inc; + + while (c->env.counter > FREQ_INC_REF) { + if (c->env.step) { + c->volume += c->env.up ? 1 : -1; + if (c->volume == 0 || c->volume == MAX_CHAN_VOLUME) { + c->env.inc = 0; + } + c->volume = MAX(0, MIN(MAX_CHAN_VOLUME, c->volume)); + } + c->env.counter -= FREQ_INC_REF; + } +} + +static void update_len(struct minigb_apu_ctx *ctx, struct chan *c) +{ + if (!c->len.enabled) + return; + + c->len.counter += c->len.inc; + if (c->len.counter > FREQ_INC_REF) { + chan_enable(ctx, c - ctx->chans, 0); + c->len.counter = 0; + } +} + +static bool update_freq(struct chan *c, uint32_t *pos) +{ + uint32_t inc = c->freq_inc - *pos; + c->freq_counter += inc; + + if (c->freq_counter > FREQ_INC_REF) { + *pos = c->freq_inc - (c->freq_counter - FREQ_INC_REF); + c->freq_counter = 0; + return true; + } else { + *pos = c->freq_inc; + return false; + } +} + +static void update_sweep(struct chan *c) +{ + c->sweep.counter += c->sweep.inc; + + while (c->sweep.counter > FREQ_INC_REF) { + if (c->sweep.shift) { + uint16_t inc = (c->sweep.freq >> c->sweep.shift); + if (c->sweep.down) + inc *= -1; + + c->freq = c->sweep.freq + inc; + if (c->freq > 2047) { + c->enabled = 0; + } else { + set_note_freq(c); + c->sweep.freq = c->freq; + } + } else if (c->sweep.rate) { + c->enabled = 0; + } + c->sweep.counter -= FREQ_INC_REF; + } +} + +static void update_square(struct minigb_apu_ctx *ctx, audio_sample_t *samples, + const bool ch2) +{ + struct chan *c = &ctx->chans[ch2]; + + if (!c->powered || !c->enabled) + return; + + set_note_freq(c); + + for (uint_fast16_t i = 0; i < AUDIO_NSAMPLES; i += 2) { + update_len(ctx, c); + if (!c->enabled) + return; + + update_env(c); + if (!c->volume) + continue; + + if (!ch2) + update_sweep(c); + + uint32_t pos = 0; + uint32_t prev_pos = 0; + int32_t sample = 0; + + while (update_freq(c, &pos)) { + c->square.duty_counter = (c->square.duty_counter + 1) & 7; + sample += ((pos - prev_pos) / c->freq_inc) * c->val; + c->val = (c->square.duty & (1 << c->square.duty_counter)) ? + VOL_INIT_MAX / MAX_CHAN_VOLUME : + VOL_INIT_MIN / MAX_CHAN_VOLUME; + prev_pos = pos; + } + + sample += c->val; + sample *= c->volume; + sample /= 4; + + samples[i + 0] += sample * c->on_left * ctx->vol_l; + samples[i + 1] += sample * c->on_right * ctx->vol_r; + } +} + +static uint8_t wave_sample(struct minigb_apu_ctx *ctx, + const unsigned int pos, const unsigned int volume) +{ + uint8_t sample; + + sample = ctx->audio_mem[(0xFF30 + pos / 2) - AUDIO_ADDR_COMPENSATION]; + if (pos & 1) { + sample &= 0xF; + } else { + sample >>= 4; + } + return volume ? (sample >> (volume - 1)) : 0; +} + +static void update_wave(struct minigb_apu_ctx *ctx, audio_sample_t *samples) +{ + struct chan *c = &ctx->chans[2]; + + if (!c->powered || !c->enabled || !c->volume) + return; + + set_note_freq(c); + c->freq_inc *= 2; + + for (uint_fast16_t i = 0; i < AUDIO_NSAMPLES; i += 2) { + update_len(ctx, c); + if (!c->enabled) + return; + + uint32_t pos = 0; + uint32_t prev_pos = 0; + audio_sample_t sample = 0; + + c->wave.sample = wave_sample(ctx, c->val, c->volume); + + while (update_freq(c, &pos)) { + c->val = (c->val + 1) & 31; + sample += ((pos - prev_pos) / c->freq_inc) * + ((audio_sample_t)c->wave.sample - 8) * + (AUDIO_SAMPLE_MAX/64); + c->wave.sample = wave_sample(ctx, c->val, c->volume); + prev_pos = pos; + } + + sample += ((audio_sample_t)c->wave.sample - 8) * + (audio_sample_t)(AUDIO_SAMPLE_MAX/64); + { + /* First element is unused. */ + audio_sample_t div[] = { AUDIO_SAMPLE_MAX, 1, 2, 4 }; + sample = sample / (div[c->volume]); + } + + sample /= 4; + samples[i + 0] += sample * c->on_left * ctx->vol_l; + samples[i + 1] += sample * c->on_right * ctx->vol_r; + } +} + +static void update_noise(struct minigb_apu_ctx *ctx, audio_sample_t *samples) +{ + struct chan *c = &ctx->chans[3]; + + if (c->freq >= 14) + c->enabled = 0; + + if (!c->powered || !c->enabled) + return; + + { + const uint32_t lfsr_div_lut[] = { + 8, 16, 32, 48, 64, 80, 96, 112 + }; + uint32_t freq; + + freq = DMG_CLOCK_FREQ_U / (lfsr_div_lut[c->noise.lfsr_div] << c->freq); + c->freq_inc = freq * (uint32_t)(FREQ_INC_REF / AUDIO_SAMPLE_RATE); + } + + for (uint_fast16_t i = 0; i < AUDIO_NSAMPLES; i += 2) { + update_len(ctx, c); + if (!c->enabled) + return; + + update_env(c); + if (!c->volume) + continue; + + uint32_t pos = 0; + uint32_t prev_pos = 0; + int32_t sample = 0; + + while (update_freq(c, &pos)) { + c->noise.lfsr_reg = (c->noise.lfsr_reg << 1) | + (c->val >= VOL_INIT_MAX/MAX_CHAN_VOLUME); + + if (c->noise.lfsr_wide) { + c->val = !(((c->noise.lfsr_reg >> 14) & 1) ^ + ((c->noise.lfsr_reg >> 13) & 1)) ? + VOL_INIT_MAX / MAX_CHAN_VOLUME : + VOL_INIT_MIN / MAX_CHAN_VOLUME; + } else { + c->val = !(((c->noise.lfsr_reg >> 6) & 1) ^ + ((c->noise.lfsr_reg >> 5) & 1)) ? + VOL_INIT_MAX / MAX_CHAN_VOLUME : + VOL_INIT_MIN / MAX_CHAN_VOLUME; + } + + sample += ((pos - prev_pos) / c->freq_inc) * c->val; + prev_pos = pos; + } + + sample += c->val; + sample *= c->volume; + sample /= 4; + + samples[i + 0] += sample * c->on_left * ctx->vol_l; + samples[i + 1] += sample * c->on_right * ctx->vol_r; + } +} + +/** + * SDL2 style audio callback function. + */ +void minigb_apu_audio_callback(struct minigb_apu_ctx *ctx, + audio_sample_t *stream) +{ + memset(stream, 0, AUDIO_SAMPLES_TOTAL * sizeof(audio_sample_t)); + update_square(ctx, stream, 0); + update_square(ctx, stream, 1); + update_wave(ctx, stream); + update_noise(ctx, stream); +} + +static void chan_trigger(struct minigb_apu_ctx *ctx, uint_fast8_t i) +{ + struct chan *c = &ctx->chans[i]; + + chan_enable(ctx, i, 1); + c->volume = c->volume_init; + + // volume envelope + { + /* LUT created in Julia with: + * `(FREQ_INC_MULT * 64)./vcat(8, 1:7)` + * Must be recreated when FREQ_INC_MULT modified. + */ + const uint32_t inc_lut[8] = { +#if FREQ_INC_MULT == 16 + 128, 1024, 512, 341, + 256, 205, 171, 146 +#elif FREQ_INC_MULT == 64 + 512, 4096, 2048, 1365, + 1024, 819, 683, 585 +#elif FREQ_INC_MULT == 105 + /* Multiples of 105 provide integer values. */ + 840, 6720, 3360, 2240, + 1680, 1344, 1120, 960 +#else +#error "LUT not calculated for this value of FREQ_INC_MULT" +#endif + }; + uint8_t val; + + val = ctx->audio_mem[(0xFF12 + (i * 5)) - AUDIO_ADDR_COMPENSATION]; + + c->env.step = val & 0x7; + c->env.up = val & 0x8; + c->env.inc = inc_lut[c->env.step]; + c->env.counter = 0; + } + + // freq sweep + if (i == 0) { + uint8_t val = ctx->audio_mem[0xFF10 - AUDIO_ADDR_COMPENSATION]; + + c->sweep.freq = c->freq; + c->sweep.rate = (val >> 4) & 0x07; + c->sweep.down = (val & 0x08); + c->sweep.shift = (val & 0x07); + c->sweep.inc = c->sweep.rate ? + ((128u * FREQ_INC_REF) / (c->sweep.rate * AUDIO_SAMPLE_RATE)) : 0; + c->sweep.counter = FREQ_INC_REF; + } + + int len_max = 64; + + if (i == 2) { // wave + len_max = 256; + c->val = 0; + } else if (i == 3) { // noise + c->noise.lfsr_reg = 0xFFFF; + c->val = VOL_INIT_MIN / MAX_CHAN_VOLUME; + } + + c->len.inc = (256u * FREQ_INC_REF) / (AUDIO_SAMPLE_RATE * (len_max - c->len.load)); + c->len.counter = 0; +} + +/** + * Read audio register. + * \param addr Address of audio register. Must be 0xFF10 <= addr <= 0xFF3F. + * This is not checked in this function. + * \return Byte at address. + */ +uint8_t minigb_apu_audio_read(struct minigb_apu_ctx *ctx, const uint16_t addr) +{ + static const uint8_t ortab[] = { + 0x80, 0x3f, 0x00, 0xff, 0xbf, + 0xff, 0x3f, 0x00, 0xff, 0xbf, + 0x7f, 0xff, 0x9f, 0xff, 0xbf, + 0xff, 0xff, 0x00, 0x00, 0xbf, + 0x00, 0x00, 0x70, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + + return ctx->audio_mem[addr - AUDIO_ADDR_COMPENSATION] | + ortab[addr - AUDIO_ADDR_COMPENSATION]; +} + +/** + * Write audio register. + * \param addr Address of audio register. Must be 0xFF10 <= addr <= 0xFF3F. + * This is not checked in this function. + * \param val Byte to write at address. + */ +void minigb_apu_audio_write(struct minigb_apu_ctx *ctx, + const uint16_t addr, const uint8_t val) +{ + /* Find sound channel corresponding to register address. */ + uint_fast8_t i; + + if(addr == 0xFF26) + { + ctx->audio_mem[addr - AUDIO_ADDR_COMPENSATION] = val & 0x80; + /* On APU power off, clear all registers apart from wave + * RAM. */ + if((val & 0x80) == 0) + { + memset(ctx->audio_mem, + 0x00, 0xFF26 - AUDIO_ADDR_COMPENSATION); + ctx->chans[0].enabled = false; + ctx->chans[1].enabled = false; + ctx->chans[2].enabled = false; + ctx->chans[3].enabled = false; + } + + return; + } + + /* Ignore register writes if APU powered off. */ + if(ctx->audio_mem[0xFF26 - AUDIO_ADDR_COMPENSATION] == 0x00) + return; + + ctx->audio_mem[addr - AUDIO_ADDR_COMPENSATION] = val; + i = (addr - AUDIO_ADDR_COMPENSATION) / 5; + + switch (addr) { + case 0xFF12: + case 0xFF17: + case 0xFF21: { + ctx->chans[i].volume_init = val >> 4; + ctx->chans[i].powered = (val >> 3) != 0; + + // "zombie mode" stuff, needed for Prehistorik Man and probably + // others + if (ctx->chans[i].powered && ctx->chans[i].enabled) { + if ((ctx->chans[i].env.step == 0 && ctx->chans[i].env.inc != 0)) { + if (val & 0x08) { + ctx->chans[i].volume++; + } else { + ctx->chans[i].volume += 2; + } + } else { + ctx->chans[i].volume = 16 - ctx->chans[i].volume; + } + + ctx->chans[i].volume &= 0x0F; + ctx->chans[i].env.step = val & 0x07; + } + } break; + + case 0xFF1C: + ctx->chans[i].volume = ctx->chans[i].volume_init = (val >> 5) & 0x03; + break; + + case 0xFF11: + case 0xFF16: + case 0xFF20: { + const uint8_t duty_lookup[] = { 0x10, 0x30, 0x3C, 0xCF }; + ctx->chans[i].len.load = val & 0x3f; + ctx->chans[i].square.duty = duty_lookup[val >> 6]; + break; + } + + case 0xFF1B: + ctx->chans[i].len.load = val; + break; + + case 0xFF13: + case 0xFF18: + case 0xFF1D: + ctx->chans[i].freq &= 0xFF00; + ctx->chans[i].freq |= val; + break; + + case 0xFF1A: + ctx->chans[i].powered = (val & 0x80) != 0; + chan_enable(ctx, i, val & 0x80); + break; + + case 0xFF14: + case 0xFF19: + case 0xFF1E: + ctx->chans[i].freq &= 0x00FF; + ctx->chans[i].freq |= ((val & 0x07) << 8); + /* Intentional fall-through. */ + case 0xFF23: + ctx->chans[i].len.enabled = val & 0x40; + if (val & 0x80) + chan_trigger(ctx, i); + + break; + + case 0xFF22: + ctx->chans[3].freq = val >> 4; + ctx->chans[3].noise.lfsr_wide = !(val & 0x08); + ctx->chans[3].noise.lfsr_div = val & 0x07; + break; + + case 0xFF24: + { + ctx->vol_l = ((val >> 4) & 0x07); + ctx->vol_r = (val & 0x07); + break; + } + + case 0xFF25: + for (uint_fast8_t j = 0; j < 4; j++) { + ctx->chans[j].on_left = (val >> (4 + j)) & 1; + ctx->chans[j].on_right = (val >> j) & 1; + } + break; + } +} + +void minigb_apu_audio_init(struct minigb_apu_ctx *ctx) +{ + /* Initialise channels and samples. */ + memset(ctx->chans, 0, sizeof(ctx->chans)); + ctx->chans[0].val = ctx->chans[1].val = -1; + + /* Initialise IO registers. */ + { + const uint8_t regs_init[] = { 0x80, 0xBF, 0xF3, 0xFF, 0x3F, + 0xFF, 0x3F, 0x00, 0xFF, 0x3F, + 0x7F, 0xFF, 0x9F, 0xFF, 0x3F, + 0xFF, 0xFF, 0x00, 0x00, 0x3F, + 0x77, 0xF3, 0xF1 }; + + for(uint_fast8_t i = 0; i < sizeof(regs_init); ++i) + minigb_apu_audio_write(ctx, 0xFF10 + i, regs_init[i]); + } + + /* Initialise Wave Pattern RAM. */ + { + const uint8_t wave_init[] = { 0xac, 0xdd, 0xda, 0x48, + 0x36, 0x02, 0xcf, 0x16, + 0x2c, 0x04, 0xe5, 0x2c, + 0xac, 0xdd, 0xda, 0x48 }; + + for(uint_fast8_t i = 0; i < sizeof(wave_init); ++i) + minigb_apu_audio_write(ctx, 0xFF30 + i, wave_init[i]); + } +} diff --git a/firmware_p4/components/gameboy/minigb_apu.h b/firmware_p4/components/gameboy/minigb_apu.h new file mode 100644 index 000000000..5aa154378 --- /dev/null +++ b/firmware_p4/components/gameboy/minigb_apu.h @@ -0,0 +1,149 @@ +/** + * minigb_apu is released under the terms listed within the LICENSE file. + * + * minigb_apu emulates the audio processing unit (APU) of the Game Boy. This + * project is based on MiniGBS by Alex Baines: https://github.com/baines/MiniGBS + */ + +#pragma once + +#include + +#ifndef AUDIO_SAMPLE_RATE +# define AUDIO_SAMPLE_RATE 32768 +#endif + +/* The audio output format is in platform native endian. */ +#if defined(MINIGB_APU_AUDIO_FORMAT_S16SYS) +typedef int16_t audio_sample_t; +# define AUDIO_SAMPLE_MAX INT16_MAX +# define AUDIO_SAMPLE_MIN INT16_MIN +# define VOL_INIT_MAX (AUDIO_SAMPLE_MAX/8) +# define VOL_INIT_MIN (AUDIO_SAMPLE_MIN/8) +#elif defined(MINIGB_APU_AUDIO_FORMAT_S32SYS) +typedef int32_t audio_sample_t; +# define AUDIO_SAMPLE_MAX INT32_MAX +# define AUDIO_SAMPLE_MIN INT32_MIN +# define VOL_INIT_MAX (INT32_MAX/8) +# define VOL_INIT_MIN (INT32_MIN/8) +#else +#error MiniGB APU: Invalid or unsupported audio format selected +#endif + +#define DMG_CLOCK_FREQ 4194304.0 +#define SCREEN_REFRESH_CYCLES 70224.0 +#define VERTICAL_SYNC (DMG_CLOCK_FREQ/SCREEN_REFRESH_CYCLES) + +/* Number of audio samples in each channel. */ +#define AUDIO_SAMPLES ((unsigned)(AUDIO_SAMPLE_RATE / VERTICAL_SYNC)) +/* Number of audio channels. The audio output is in interleaved stereo format.*/ +#define AUDIO_CHANNELS 2 +/* Number of audio samples output in each audio_callback call. */ +#define AUDIO_SAMPLES_TOTAL (AUDIO_SAMPLES * 2) + +#define AUDIO_MEM_SIZE (0xFF3F - 0xFF10 + 1) +#define AUDIO_ADDR_COMPENSATION 0xFF10 + +struct chan_len_ctr { + uint8_t load; + uint8_t enabled; + uint32_t counter; + uint32_t inc; +}; + +struct chan_vol_env { + uint8_t step; + uint8_t up; + uint32_t counter; + uint32_t inc; +}; + +struct chan_freq_sweep { + uint8_t rate; + uint8_t shift; + uint8_t down; + uint16_t freq; + uint32_t counter; + uint32_t inc; +}; + +struct chan { + uint8_t enabled; + uint8_t powered; + uint8_t on_left; + uint8_t on_right; + + uint8_t volume; + uint8_t volume_init; + + uint16_t freq; + uint32_t freq_counter; + uint32_t freq_inc; + + int32_t val; + + struct chan_len_ctr len; + struct chan_vol_env env; + struct chan_freq_sweep sweep; + + union { + struct { + uint8_t duty; + uint8_t duty_counter; + } square; + struct { + uint16_t lfsr_reg; + uint8_t lfsr_wide; + uint8_t lfsr_div; + } noise; + struct { + uint8_t sample; + } wave; + }; +}; + +struct minigb_apu_ctx { + struct chan chans[4]; + int32_t vol_l, vol_r; + + /** + * Memory holding audio registers between 0xFF10 and 0xFF3F inclusive. + */ + uint8_t audio_mem[AUDIO_MEM_SIZE]; +}; + +/** + * Fill allocated buffer "stream" with AUDIO_SAMPLES_TOTAL number of 16-bit + * signed samples (native endian order) in stereo interleaved format. + * Each call corresponds to the time taken for each VSYNC in the Game Boy. + * + * \param ctx Library context. Must be initialised with audio_init(). + * \param stream Allocated pointer to store audio samples. Must be at least + * AUDIO_SAMPLES_TOTAL in size. + */ +void minigb_apu_audio_callback(struct minigb_apu_ctx *ctx, + audio_sample_t *stream); + +/** + * Read audio register at given address "addr". + * \param ctx Library context. Must be initialised with audio_init(). + * \param addr Address of registers to read. Must be within 0xFF10 and 0xFF3F, + * inclusive. + */ +uint8_t minigb_apu_audio_read(struct minigb_apu_ctx *ctx, const uint16_t addr); + +/** + * Write "val" to audio register at given address "addr". + * \param ctx Library context. Must be initialised with audio_init(). + * \param addr Address of registers to read. Must be within 0xFF10 and 0xFF3F, + * inclusive. + * \param val Value to write to address. + */ +void minigb_apu_audio_write(struct minigb_apu_ctx *ctx, + const uint16_t addr, const uint8_t val); + +/** + * Initialise audio driver. + * \param ctx Library context. + */ +void minigb_apu_audio_init(struct minigb_apu_ctx *ctx); diff --git a/firmware_p4/components/gameboy/peanut_gb.h b/firmware_p4/components/gameboy/peanut_gb.h new file mode 100644 index 000000000..c9c6f6e73 --- /dev/null +++ b/firmware_p4/components/gameboy/peanut_gb.h @@ -0,0 +1,4044 @@ +/** + * MIT License + * + * Copyright (c) 2018-2023 Mahyar Koshkouei + * + * Permission is hereby granted, free of charge, to any person obtaining a copy + * of this software and associated documentation files (the "Software"), to + * deal in the Software without restriction, including without limitation the + * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or + * sell copies of the Software, and to permit persons to whom the Software is + * furnished to do so, subject to the following conditions: + * + * The above copyright notice and this permission notice shall be included in + * all copies or substantial portions of the Software. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR + * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, + * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE + * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER + * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS + * IN THE SOFTWARE. + * + * Please note that at least two parts of source code within this project was + * taken from the SameBoy project at https://github.com/LIJI32/SameBoy/ which at + * the time of this writing is released under the MIT License. Occurrences of + * this code is marked as being taken from SameBoy with a comment. + * SameBoy, and code marked as being taken from SameBoy, + * is Copyright (c) 2015-2019 Lior Halphon. + */ + +#ifndef PEANUT_GB_H +#define PEANUT_GB_H + +#if defined(__has_include) +# if __has_include("version.all") +# include "version.all" /* Version information */ +# endif +#else +/* Stub __has_include for later. */ +# define __has_include(x) 0 +#endif + +#include /* Required for abort */ +#include /* Required for bool types */ +#include /* Required for int types */ +#include /* Required for memset */ +#include /* Required for tm struct */ + +/** +* If PEANUT_GB_IS_LITTLE_ENDIAN is positive, then Peanut-GB will be configured +* for a little endian platform. If 0, then big endian. +*/ +#if !defined(PEANUT_GB_IS_LITTLE_ENDIAN) +/* If endian is not defined, then attempt to detect it. */ +# if defined(__BYTE_ORDER__) +# if __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__ +/* Building for a big endian platform. */ +# define PEANUT_GB_IS_LITTLE_ENDIAN 0 +# else +# define PEANUT_GB_IS_LITTLE_ENDIAN 1 +# endif /* __BYTE_ORDER__ != __ORDER_LITTLE_ENDIAN__ */ +# elif defined(_WIN32) +/* We assume that Windows is always little endian by default. */ +# define PEANUT_GB_IS_LITTLE_ENDIAN 1 +# elif !defined(PEANUT_GB_IS_LITTLE_ENDIAN) +# error "Could not detect target platform endian. Please define PEANUT_GB_IS_LITTLE_ENDIAN" +# endif +#endif /* !defined(PEANUT_GB_IS_LITTLE_ENDIAN) */ + +#if PEANUT_GB_IS_LITTLE_ENDIAN == 0 +# error "Peanut-GB only supports little endian targets" +/* This is because the logic has been written with assumption of little + * endian byte order. */ +#endif + +/** Definitions for compile-time setting of features. **/ +/** + * Sound support must be provided by an external library. When audio_read() and + * audio_write() functions are provided, define ENABLE_SOUND to a non-zero value + * before including peanut_gb.h in order for these functions to be used. + */ +#ifndef ENABLE_SOUND +# define ENABLE_SOUND 0 +#endif + +/* Enable LCD drawing. On by default. May be turned off for testing purposes. */ +#ifndef ENABLE_LCD +# define ENABLE_LCD 1 +#endif + +/* Enable 16 bit colour palette. If disabled, only four colour shades are set in + * pixel data. */ +#ifndef PEANUT_GB_12_COLOUR +# define PEANUT_GB_12_COLOUR 1 +#endif + +/* Adds more code to improve LCD rendering accuracy. */ +#ifndef PEANUT_GB_HIGH_LCD_ACCURACY +# define PEANUT_GB_HIGH_LCD_ACCURACY 1 +#endif + +/* Use intrinsic functions. This may produce smaller and faster code. */ +#ifndef PEANUT_GB_USE_INTRINSICS +# define PEANUT_GB_USE_INTRINSICS 1 +#endif + +/* Only include function prototypes. At least one file must *not* have this + * defined. */ +// #define PEANUT_GB_HEADER_ONLY + +/** Internal source code. **/ +/* Interrupt masks */ +#define VBLANK_INTR 0x01 +#define LCDC_INTR 0x02 +#define TIMER_INTR 0x04 +#define SERIAL_INTR 0x08 +#define CONTROL_INTR 0x10 +#define ANY_INTR 0x1F + +/* Memory section sizes for DMG */ +#define WRAM_SIZE 0x2000 +#define VRAM_SIZE 0x2000 +#define HRAM_IO_SIZE 0x0100 +#define OAM_SIZE 0x00A0 + +/* Memory addresses */ +#define ROM_0_ADDR 0x0000 +#define ROM_N_ADDR 0x4000 +#define VRAM_ADDR 0x8000 +#define CART_RAM_ADDR 0xA000 +#define WRAM_0_ADDR 0xC000 +#define WRAM_1_ADDR 0xD000 +#define ECHO_ADDR 0xE000 +#define OAM_ADDR 0xFE00 +#define UNUSED_ADDR 0xFEA0 +#define IO_ADDR 0xFF00 +#define HRAM_ADDR 0xFF80 +#define INTR_EN_ADDR 0xFFFF + +/* Cart section sizes */ +#define ROM_BANK_SIZE 0x4000 +#define WRAM_BANK_SIZE 0x1000 +#define CRAM_BANK_SIZE 0x2000 +#define VRAM_BANK_SIZE 0x2000 + +/* DIV Register is incremented at rate of 16384Hz. + * 4194304 / 16384 = 256 clock cycles for one increment. */ +#define DIV_CYCLES 256 + +/* Serial clock locked to 8192Hz on DMG. + * 4194304 / (8192 / 8) = 4096 clock cycles for sending 1 byte. */ +#define SERIAL_CYCLES 4096 + +/* Calculating VSYNC. */ +#define DMG_CLOCK_FREQ 4194304.0 +#define SCREEN_REFRESH_CYCLES 70224.0 +#define VERTICAL_SYNC (DMG_CLOCK_FREQ/SCREEN_REFRESH_CYCLES) + +/* Real Time Clock is locked to 1Hz. */ +#define RTC_CYCLES ((uint_fast32_t)DMG_CLOCK_FREQ) + +/* SERIAL SC register masks. */ +#define SERIAL_SC_TX_START 0x80 +#define SERIAL_SC_CLOCK_SRC 0x01 + +/* STAT register masks */ +#define STAT_LYC_INTR 0x40 +#define STAT_MODE_2_INTR 0x20 +#define STAT_MODE_1_INTR 0x10 +#define STAT_MODE_0_INTR 0x08 +#define STAT_LYC_COINC 0x04 +#define STAT_MODE 0x03 +#define STAT_USER_BITS 0xF8 + +/* LCDC control masks */ +#define LCDC_ENABLE 0x80 +#define LCDC_WINDOW_MAP 0x40 +#define LCDC_WINDOW_ENABLE 0x20 +#define LCDC_TILE_SELECT 0x10 +#define LCDC_BG_MAP 0x08 +#define LCDC_OBJ_SIZE 0x04 +#define LCDC_OBJ_ENABLE 0x02 +#define LCDC_BG_ENABLE 0x01 + +/** LCD characteristics **/ +/* There are 154 scanlines. LY < 154. */ +#define LCD_VERT_LINES 154 +#define LCD_WIDTH 160 +#define LCD_HEIGHT 144 +/* PPU cycles through modes every 456 cycles. */ +#define LCD_LINE_CYCLES 456 +#define LCD_MODE0_HBLANK_MAX_DRUATION 204 +#define LCD_MODE0_HBLANK_MIN_DRUATION 87 +#define LCD_MODE2_OAM_SCAN_DURATION 80 +#define LCD_MODE3_LCD_DRAW_MIN_DURATION 172 +#define LCD_MODE3_LCD_DRAW_MAX_DURATION 289 +#define LCD_MODE1_VBLANK_DURATION (LCD_LINE_CYCLES * (LCD_VERT_LINES - LCD_HEIGHT)) +#define LCD_FRAME_CYCLES (LCD_LINE_CYCLES * LCD_VERT_LINES) +/* The following assumes that Hblank starts on cycle 0. */ +/* Mode 2 (OAM Scan) starts on cycle 204 (although this is dependent on the + * duration of Mode 3 (LCD Draw). */ +#define LCD_MODE_2_CYCLES LCD_MODE0_HBLANK_MAX_DRUATION +/* Mode 3 starts on cycle 284. */ +#define LCD_MODE_3_CYCLES (LCD_MODE_2_CYCLES + LCD_MODE2_OAM_SCAN_DURATION) +/* Mode 0 starts on cycle 376. */ +#define LCD_MODE_0_CYCLES (LCD_MODE_3_CYCLES + LCD_MODE3_LCD_DRAW_MIN_DURATION) + +#define LCD_MODE2_OAM_SCAN_START 0 +#define LCD_MODE2_OAM_SCAN_END (LCD_MODE2_OAM_SCAN_DURATION) +#define LCD_MODE3_LCD_DRAW_END (LCD_MODE2_OAM_SCAN_END + LCD_MODE3_LCD_DRAW_MIN_DURATION) +#define LCD_MODE0_HBLANK_END (LCD_MODE3_LCD_DRAW_END + LCD_MODE0_HBLANK_MAX_DRUATION) +#if LCD_MODE0_HBLANK_END != LCD_LINE_CYCLES +#error "LCD length not equal" +#endif + +/* VRAM Locations */ +#define VRAM_TILES_1 (0x8000 - VRAM_ADDR) +#define VRAM_TILES_2 (0x8800 - VRAM_ADDR) +#define VRAM_BMAP_1 (0x9800 - VRAM_ADDR) +#define VRAM_BMAP_2 (0x9C00 - VRAM_ADDR) +#define VRAM_TILES_3 (0x8000 - VRAM_ADDR + VRAM_BANK_SIZE) +#define VRAM_TILES_4 (0x8800 - VRAM_ADDR + VRAM_BANK_SIZE) + +/* Interrupt jump addresses */ +#define VBLANK_INTR_ADDR 0x0040 +#define LCDC_INTR_ADDR 0x0048 +#define TIMER_INTR_ADDR 0x0050 +#define SERIAL_INTR_ADDR 0x0058 +#define CONTROL_INTR_ADDR 0x0060 + +/* SPRITE controls */ +#define NUM_SPRITES 0x28 +#define MAX_SPRITES_LINE 0x0A +#define OBJ_PRIORITY 0x80 +#define OBJ_FLIP_Y 0x40 +#define OBJ_FLIP_X 0x20 +#define OBJ_PALETTE 0x10 + +/* Joypad buttons */ +#define JOYPAD_A 0x01 +#define JOYPAD_B 0x02 +#define JOYPAD_SELECT 0x04 +#define JOYPAD_START 0x08 +#define JOYPAD_RIGHT 0x10 +#define JOYPAD_LEFT 0x20 +#define JOYPAD_UP 0x40 +#define JOYPAD_DOWN 0x80 + +#define ROM_HEADER_CHECKSUM_LOC 0x014D + +/* Local macros. */ +#ifndef MIN +# define MIN(a, b) ((a) < (b) ? (a) : (b)) +#endif + +#define PEANUT_GB_ARRAYSIZE(array) (sizeof(array)/sizeof(array[0])) + +/** Allow setting deprecated functions and variables. */ +#if (defined(__GNUC__) && __GNUC__ >= 6) || (defined(__clang__) && __clang_major__ >= 4) +# define PGB_DEPRECATED(msg) __attribute__((deprecated(msg))) +#else +# define PGB_DEPRECATED(msg) +#endif + +#if !defined(__has_builtin) +/* Stub __has_builtin if it isn't available. */ +# define __has_builtin(x) 0 +#endif + +/* The PGB_UNREACHABLE() macro tells the compiler that the code path will never + * be reached, allowing for further optimisation. */ +#if !defined(PGB_UNREACHABLE) +# if __has_builtin(__builtin_unreachable) +# define PGB_UNREACHABLE() __builtin_unreachable() +# elif defined(_MSC_VER) && _MSC_VER >= 1200 +# /* __assume is not available before VC6. */ +# define PGB_UNREACHABLE() __assume(0) +# else +# define PGB_UNREACHABLE() abort() +# endif +#endif /* !defined(PGB_UNREACHABLE) */ + +#if !defined(PGB_UNLIKELY) +# if __has_builtin(__builtin_expect) +# define PGB_UNLIKELY(expr) __builtin_expect(!!(expr), 0) +# else +# define PGB_UNLIKELY(expr) (expr) +# endif +#endif /* !defined(PGB_UNLIKELY) */ +#if !defined(PGB_LIKELY) +# if __has_builtin(__builtin_expect) +# define PGB_LIKELY(expr) __builtin_expect(!!(expr), 1) +# else +# define PGB_LIKELY(expr) (expr) +# endif +#endif /* !defined(PGB_LIKELY) */ + +#if PEANUT_GB_USE_INTRINSICS +/* If using MSVC, only enable intrinsics for x86 platforms*/ +# if defined(_MSC_VER) && __has_include("intrin.h") && \ + (defined(_M_IX86_FP) || defined(_M_AMD64) || defined(_M_X64)) +/* Define intrinsic functions for MSVC. */ +# include +# define PGB_INTRIN_SBC(x,y,cin,res) _subborrow_u8(cin,x,y,&res) +# define PGB_INTRIN_ADC(x,y,cin,res) _addcarry_u8(cin,x,y,&res) +# endif /* MSVC */ + +/* Check for intrinsic functions in GCC and Clang. */ +# if __has_builtin(__builtin_sub_overflow) +# define PGB_INTRIN_SBC(x,y,cin,res) __builtin_sub_overflow(x,y+cin,&res) +# define PGB_INTRIN_ADC(x,y,cin,res) __builtin_add_overflow(x,y+cin,&res) +# endif +#endif /* PEANUT_GB_USE_INTRINSICS */ + +#if defined(PGB_INTRIN_SBC) +# define PGB_INSTR_SBC_R8(r,cin) \ + { \ + uint8_t temp; \ + gb->cpu_reg.f.f_bits.c = PGB_INTRIN_SBC(gb->cpu_reg.a,r,cin,temp);\ + gb->cpu_reg.f.f_bits.h = ((gb->cpu_reg.a ^ r ^ temp) & 0x10) > 0;\ + gb->cpu_reg.f.f_bits.n = 1; \ + gb->cpu_reg.f.f_bits.z = (temp == 0x00); \ + gb->cpu_reg.a = temp; \ + } + +# define PGB_INSTR_CP_R8(r) \ + { \ + uint8_t temp; \ + gb->cpu_reg.f.f_bits.c = PGB_INTRIN_SBC(gb->cpu_reg.a,r,0,temp);\ + gb->cpu_reg.f.f_bits.h = ((gb->cpu_reg.a ^ r ^ temp) & 0x10) > 0;\ + gb->cpu_reg.f.f_bits.n = 1; \ + gb->cpu_reg.f.f_bits.z = (temp == 0x00); \ + } +#else +# define PGB_INSTR_SBC_R8(r,cin) \ + { \ + uint16_t temp = gb->cpu_reg.a - (r + cin); \ + gb->cpu_reg.f.f_bits.c = (temp & 0xFF00) ? 1 : 0; \ + gb->cpu_reg.f.f_bits.h = ((gb->cpu_reg.a ^ r ^ temp) & 0x10) > 0; \ + gb->cpu_reg.f.f_bits.n = 1; \ + gb->cpu_reg.f.f_bits.z = ((temp & 0xFF) == 0x00); \ + gb->cpu_reg.a = (temp & 0xFF); \ + } + +# define PGB_INSTR_CP_R8(r) \ + { \ + uint16_t temp = gb->cpu_reg.a - r; \ + gb->cpu_reg.f.f_bits.c = (temp & 0xFF00) ? 1 : 0; \ + gb->cpu_reg.f.f_bits.h = ((gb->cpu_reg.a ^ r ^ temp) & 0x10) > 0; \ + gb->cpu_reg.f.f_bits.n = 1; \ + gb->cpu_reg.f.f_bits.z = ((temp & 0xFF) == 0x00); \ + } +#endif /* PGB_INTRIN_SBC */ + +#if defined(PGB_INTRIN_ADC) +# define PGB_INSTR_ADC_R8(r,cin) \ + { \ + uint8_t temp; \ + gb->cpu_reg.f.f_bits.c = PGB_INTRIN_ADC(gb->cpu_reg.a,r,cin,temp);\ + gb->cpu_reg.f.f_bits.h = ((gb->cpu_reg.a ^ r ^ temp) & 0x10) > 0; \ + gb->cpu_reg.f.f_bits.n = 0; \ + gb->cpu_reg.f.f_bits.z = (temp == 0x00); \ + gb->cpu_reg.a = temp; \ + } +#else +# define PGB_INSTR_ADC_R8(r,cin) \ + { \ + uint16_t temp = gb->cpu_reg.a + r + cin; \ + gb->cpu_reg.f.f_bits.c = (temp & 0xFF00) ? 1 : 0; \ + gb->cpu_reg.f.f_bits.h = ((gb->cpu_reg.a ^ r ^ temp) & 0x10) > 0; \ + gb->cpu_reg.f.f_bits.n = 0; \ + gb->cpu_reg.f.f_bits.z = ((temp & 0xFF) == 0x00); \ + gb->cpu_reg.a = (temp & 0xFF); \ + } +#endif /* PGB_INTRIN_ADC */ + +#define PGB_INSTR_INC_R8(r) \ + r++; \ + gb->cpu_reg.f.f_bits.h = ((r & 0x0F) == 0x00); \ + gb->cpu_reg.f.f_bits.n = 0; \ + gb->cpu_reg.f.f_bits.z = (r == 0x00) + +#define PGB_INSTR_DEC_R8(r) \ + r--; \ + gb->cpu_reg.f.f_bits.h = ((r & 0x0F) == 0x0F); \ + gb->cpu_reg.f.f_bits.n = 1; \ + gb->cpu_reg.f.f_bits.z = (r == 0x00) + +#define PGB_INSTR_XOR_R8(r) \ + gb->cpu_reg.a ^= r; \ + gb->cpu_reg.f.reg = 0; \ + gb->cpu_reg.f.f_bits.z = (gb->cpu_reg.a == 0x00) + +#define PGB_INSTR_OR_R8(r) \ + gb->cpu_reg.a |= r; \ + gb->cpu_reg.f.reg = 0; \ + gb->cpu_reg.f.f_bits.z = (gb->cpu_reg.a == 0x00) + +#define PGB_INSTR_AND_R8(r) \ + gb->cpu_reg.a &= r; \ + gb->cpu_reg.f.reg = 0; \ + gb->cpu_reg.f.f_bits.z = (gb->cpu_reg.a == 0x00); \ + gb->cpu_reg.f.f_bits.h = 1 + +#if PEANUT_GB_IS_LITTLE_ENDIAN +# define PEANUT_GB_GET_LSB16(x) (x & 0xFF) +# define PEANUT_GB_GET_MSB16(x) (x >> 8) +# define PEANUT_GB_GET_MSN16(x) (x >> 12) +# define PEANUT_GB_U8_TO_U16(h,l) ((l) | ((h) << 8)) +#else +# define PEANUT_GB_GET_LSB16(x) (x >> 8) +# define PEANUT_GB_GET_MSB16(x) (x & 0xFF) +# define PEANUT_GB_GET_MSN16(x) ((x & 0xF0) >> 4) +# define PEANUT_GB_U8_TO_U16(h,l) ((h) | ((l) << 8)) +#endif + +struct cpu_registers_s +{ +/* Change register order if big endian. + * Macro receives registers in little endian order. */ +#if PEANUT_GB_IS_LITTLE_ENDIAN +# define PEANUT_GB_LE_REG(x,y) x,y +#else +# define PEANUT_GB_LE_REG(x,y) y,x +#endif + /* Define specific bits of Flag register. */ + union { + struct { + uint8_t : 4; /* Unused. */ + uint8_t c: 1; /* Carry flag. */ + uint8_t h: 1; /* Half carry flag. */ + uint8_t n: 1; /* Add/sub flag. */ + uint8_t z: 1; /* Zero flag. */ + } f_bits; + uint8_t reg; + } f; + uint8_t a; + + union + { + struct + { + uint8_t PEANUT_GB_LE_REG(c,b); + } bytes; + uint16_t reg; + } bc; + + union + { + struct + { + uint8_t PEANUT_GB_LE_REG(e,d); + } bytes; + uint16_t reg; + } de; + + union + { + struct + { + uint8_t PEANUT_GB_LE_REG(l,h); + } bytes; + uint16_t reg; + } hl; + + /* Stack pointer */ + union + { + struct + { + uint8_t PEANUT_GB_LE_REG(p, s); + } bytes; + uint16_t reg; + } sp; + + /* Program counter */ + union + { + struct + { + uint8_t PEANUT_GB_LE_REG(c, p); + } bytes; + uint16_t reg; + } pc; +#undef PEANUT_GB_LE_REG +}; + +struct count_s +{ + uint_fast16_t lcd_count; /* LCD Timing */ + uint_fast16_t div_count; /* Divider Register Counter */ + uint_fast16_t tima_count; /* Timer Counter */ + uint_fast16_t serial_count; /* Serial Counter */ + uint_fast32_t rtc_count; /* RTC Counter */ + uint_fast32_t lcd_off_count; /* Cycles LCD has been disabled */ +}; + +#if ENABLE_LCD + /* Bit mask for the shade of pixel to display */ + #define LCD_COLOUR 0x03 + +# if PEANUT_GB_12_COLOUR + /** + * Bit mask for whether a pixel is OBJ0, OBJ1, or BG. Each may have a different + * palette when playing a DMG game on CGB. + */ + #define LCD_PALETTE_OBJ 0x10 + #define LCD_PALETTE_BG 0x20 + /** + * Bit mask for the two bits listed above. + * LCD_PALETTE_ALL == 0b00 --> OBJ0 + * LCD_PALETTE_ALL == 0b01 --> OBJ1 + * LCD_PALETTE_ALL == 0b10 --> BG + * LCD_PALETTE_ALL == 0b11 --> NOT POSSIBLE + */ + #define LCD_PALETTE_ALL 0x30 +# endif +#endif + +/** + * Errors that may occur during emulation. + */ +enum gb_error_e +{ + GB_UNKNOWN_ERROR = 0, + GB_INVALID_OPCODE = 1, + GB_INVALID_READ = 2, + GB_INVALID_WRITE = 3, + + /* GB_HALT_FOREVER is deprecated and will no longer be issued as an + * error by Peanut-GB. */ + GB_HALT_FOREVER PGB_DEPRECATED("Error no longer issued by Peanut-GB") = 4, + + GB_INVALID_MAX = 5 +}; + +/** + * Errors that may occur during library initialisation. + */ +enum gb_init_error_e +{ + GB_INIT_NO_ERROR = 0, + GB_INIT_CARTRIDGE_UNSUPPORTED, + GB_INIT_INVALID_CHECKSUM, + + GB_INIT_INVALID_MAX +}; + +/** + * Return codes for serial receive function, mainly for clarity. + */ +enum gb_serial_rx_ret_e +{ + GB_SERIAL_RX_SUCCESS = 0, + GB_SERIAL_RX_NO_CONNECTION = 1 +}; + +union cart_rtc +{ + struct + { + uint8_t sec; + uint8_t min; + uint8_t hour; + uint8_t yday; + uint8_t high; + } reg; + uint8_t bytes[5]; +}; + +/** + * Emulator context. + * + * Only values within the `direct` struct may be modified directly by the + * front-end implementation. Other variables must not be modified. + */ +struct gb_s +{ + /** + * Return byte from ROM at given address. + * + * \param gb_s emulator context + * \param addr address + * \return byte at address in ROM + */ + uint8_t (*gb_rom_read)(struct gb_s*, const uint_fast32_t addr); + + /** + * Return byte from cart RAM at given address. + * + * \param gb_s emulator context + * \param addr address + * \return byte at address in RAM + */ + uint8_t (*gb_cart_ram_read)(struct gb_s*, const uint_fast32_t addr); + + /** + * Write byte to cart RAM at given address. + * + * \param gb_s emulator context + * \param addr address + * \param val value to write to address in RAM + */ + void (*gb_cart_ram_write)(struct gb_s*, const uint_fast32_t addr, + const uint8_t val); + + /** + * Notify front-end of error. + * + * \param gb_s emulator context + * \param gb_error_e error code + * \param addr address of where error occurred + */ + void (*gb_error)(struct gb_s*, const enum gb_error_e, const uint16_t addr); + + /* Transmit one byte and return the received byte. */ + void (*gb_serial_tx)(struct gb_s*, const uint8_t tx); + enum gb_serial_rx_ret_e (*gb_serial_rx)(struct gb_s*, uint8_t* rx); + + /* Read byte from boot ROM at given address. */ + uint8_t (*gb_bootrom_read)(struct gb_s*, const uint_fast16_t addr); + + struct + { + bool gb_halt : 1; + bool gb_ime : 1; + /* gb_frame is set when 0.016742706298828125 seconds have + * passed. It is likely that a new frame has been drawn since + * then, but it is possible that the LCD was switched off and + * nothing was drawn. */ + bool gb_frame : 1; + bool lcd_blank : 1; + /* Set if MBC3O cart is used. */ + bool cart_is_mbc3O : 1; + }; + + /* Cartridge information: + * Memory Bank Controller (MBC) type. */ + int8_t mbc; + /* Whether the MBC has internal RAM. */ + uint8_t cart_ram; + /* Number of ROM banks in cartridge. */ + uint16_t num_rom_banks_mask; + /* Number of RAM banks in cartridge. Ignore for MBC2. */ + uint8_t num_ram_banks; + + uint16_t selected_rom_bank; + /* WRAM and VRAM bank selection not available. */ + uint8_t cart_ram_bank; + uint8_t enable_cart_ram; + /* Cartridge ROM/RAM mode select. */ + uint8_t cart_mode_select; + + union cart_rtc rtc_latched, rtc_real; + + struct cpu_registers_s cpu_reg; + //struct gb_registers_s gb_reg; + struct count_s counter; + + /* TODO: Allow implementation to allocate WRAM, VRAM and Frame Buffer. */ + uint8_t wram[WRAM_SIZE]; + uint8_t vram[VRAM_SIZE]; + uint8_t oam[OAM_SIZE]; + uint8_t hram_io[HRAM_IO_SIZE]; + + struct + { + /** + * Draw line on screen. + * + * \param gb_s emulator context + * \param pixels The 160 pixels to draw. + * Bits 1-0 are the colour to draw. + * Bits 5-4 are the palette, where: + * OBJ0 = 0b00, + * OBJ1 = 0b01, + * BG = 0b10 + * Other bits are undefined. + * Bits 5-4 are only required by front-ends + * which want to use a different colour for + * different object palettes. This is what + * the Game Boy Color (CGB) does to DMG + * games. + * \param line Line to draw pixels on. This is + * guaranteed to be between 0-144 inclusive. + */ + void (*lcd_draw_line)(struct gb_s *gb, + const uint8_t *pixels, + const uint_fast8_t line); + + /* Palettes */ + uint8_t bg_palette[4]; + uint8_t sp_palette[8]; + + uint8_t window_clear; + uint8_t WY; + + /* Only support 30fps frame skip. */ + bool frame_skip_count : 1; + bool interlace_count : 1; + } display; + + /** + * Variables that may be modified directly by the front-end. + * This method seems to be easier and possibly less overhead than + * calling a function to modify these variables each time. + * + * None of this is thread-safe. + */ + struct + { + /* Set to enable interlacing. Interlacing will start immediately + * (at the next line drawing). + */ + bool interlace : 1; + bool frame_skip : 1; + + union + { + struct + { + /* Using this bitfield is deprecated due to + * portability concerns. It is recommended to + * use the JOYPAD_* defines instead. + */ + bool a : 1; + bool b : 1; + bool select : 1; + bool start : 1; + bool right : 1; + bool left : 1; + bool up : 1; + bool down : 1; + } joypad_bits; + uint8_t joypad; + }; + + /* Implementation defined data. Set to NULL if not required. */ + void *priv; + } direct; +}; + +#ifndef PEANUT_GB_HEADER_ONLY + +#define IO_JOYP 0x00 +#define IO_SB 0x01 +#define IO_SC 0x02 +#define IO_DIV 0x04 +#define IO_TIMA 0x05 +#define IO_TMA 0x06 +#define IO_TAC 0x07 +#define IO_IF 0x0F +#define IO_LCDC 0x40 +#define IO_STAT 0x41 +#define IO_SCY 0x42 +#define IO_SCX 0x43 +#define IO_LY 0x44 +#define IO_LYC 0x45 +#define IO_DMA 0x46 +#define IO_BGP 0x47 +#define IO_OBP0 0x48 +#define IO_OBP1 0x49 +#define IO_WY 0x4A +#define IO_WX 0x4B +#define IO_BOOT 0x50 +#define IO_IE 0xFF + +#define IO_TAC_RATE_MASK 0x3 +#define IO_TAC_ENABLE_MASK 0x4 + +/* LCD Mode defines. */ +#define IO_STAT_MODE_HBLANK 0 +#define IO_STAT_MODE_VBLANK 1 +#define IO_STAT_MODE_OAM_SCAN 2 +#define IO_STAT_MODE_LCD_DRAW 3 +#define IO_STAT_MODE_VBLANK_OR_TRANSFER_MASK 0x1 + +/** + * Internal function used to read bytes. + * addr is host platform endian. + */ +uint8_t __gb_read(struct gb_s *gb, uint16_t addr) +{ + switch(PEANUT_GB_GET_MSN16(addr)) + { + case 0x0: + /* IO_BOOT is only set to 1 if gb->gb_bootrom_read was not NULL + * on reset. */ + if(gb->hram_io[IO_BOOT] == 0 && addr < 0x0100) + { + return gb->gb_bootrom_read(gb, addr); + } + + /* Fallthrough */ + case 0x1: + case 0x2: + case 0x3: + return gb->gb_rom_read(gb, addr); + + case 0x4: + case 0x5: + case 0x6: + case 0x7: + if(gb->mbc == 1 && gb->cart_mode_select) + return gb->gb_rom_read(gb, + addr + ((gb->selected_rom_bank & 0x1F) - 1) * ROM_BANK_SIZE); + else + return gb->gb_rom_read(gb, addr + (gb->selected_rom_bank - 1) * ROM_BANK_SIZE); + + case 0x8: + case 0x9: + return gb->vram[addr - VRAM_ADDR]; + + case 0xA: + case 0xB: + if(gb->mbc == 3 && gb->cart_ram_bank >= 0x08) + { + return gb->rtc_latched.bytes[gb->cart_ram_bank - 0x08]; + } + else if(gb->cart_ram && gb->enable_cart_ram) + { + if(gb->mbc == 2) + { + /* Only 9 bits are available in address. */ + addr &= 0x1FF; + return gb->gb_cart_ram_read(gb, addr); + } + else if((gb->cart_mode_select || gb->mbc != 1) && + gb->cart_ram_bank < gb->num_ram_banks) + { + return gb->gb_cart_ram_read(gb, addr - CART_RAM_ADDR + + (gb->cart_ram_bank * CRAM_BANK_SIZE)); + } + else + return gb->gb_cart_ram_read(gb, addr - CART_RAM_ADDR); + } + + return 0xFF; + + case 0xC: + case 0xD: + return gb->wram[addr - WRAM_0_ADDR]; + + case 0xE: + return gb->wram[addr - ECHO_ADDR]; + + case 0xF: + if(addr < OAM_ADDR) + return gb->wram[addr - ECHO_ADDR]; + + if(addr < UNUSED_ADDR) + return gb->oam[addr - OAM_ADDR]; + + /* Unusable memory area. Reading from this area returns 0xFF.*/ + if(addr < IO_ADDR) + return 0xFF; + + /* APU registers. */ + if((addr >= 0xFF10) && (addr <= 0xFF3F)) + { +#if ENABLE_SOUND + return audio_read(addr); +#else + static const uint8_t ortab[] = { + 0x80, 0x3f, 0x00, 0xff, 0xbf, + 0xff, 0x3f, 0x00, 0xff, 0xbf, + 0x7f, 0xff, 0x9f, 0xff, 0xbf, + 0xff, 0xff, 0x00, 0x00, 0xbf, + 0x00, 0x00, 0x70, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, + 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00 + }; + return gb->hram_io[addr - IO_ADDR] | ortab[addr - IO_ADDR]; +#endif + } + + /* HRAM */ + if(addr >= IO_ADDR) + return gb->hram_io[addr - IO_ADDR]; + } + + + /* Return address that caused read error. */ + (gb->gb_error)(gb, GB_INVALID_READ, addr); + PGB_UNREACHABLE(); +} + +/** + * Internal function used to write bytes. + */ +void __gb_write(struct gb_s *gb, uint_fast16_t addr, uint8_t val) +{ + switch(PEANUT_GB_GET_MSN16(addr)) + { + case 0x0: + case 0x1: + /* Set RAM enable bit. MBC2 is handled in fall-through. */ + if (gb->mbc > 0 && gb->mbc != 2) + { + if (gb->cart_ram) + gb->enable_cart_ram = ((val & 0x0F) == 0x0A); + return; + } + + /* Intentional fall through. */ + case 0x2: + if (gb->mbc == 5) + { + gb->selected_rom_bank = + (gb->selected_rom_bank & 0x100) | val; + gb->selected_rom_bank = + gb->selected_rom_bank & gb->num_rom_banks_mask; + return; + } + + /* Intentional fall through. */ + case 0x3: + if(gb->mbc == 1) + { + //selected_rom_bank = val & 0x7; + gb->selected_rom_bank = (val & 0x1F) | (gb->selected_rom_bank & 0x60); + + if((gb->selected_rom_bank & 0x1F) == 0x00) + gb->selected_rom_bank++; + } + else if(gb->mbc == 2) + { + /* If bit 8 is 1, then set ROM bank number. */ + if(addr & 0x100) + { + gb->selected_rom_bank = val & 0x0F; + /* Setting ROM bank to 0, sets it to 1. */ + if(!gb->selected_rom_bank) + gb->selected_rom_bank++; + } + /* Otherwise set whether RAM is enabled or not. */ + else + { + gb->enable_cart_ram = ((val & 0x0F) == 0x0A); + return; + } + } + else if(gb->mbc == 3) + { + gb->selected_rom_bank = val; + if(!gb->cart_is_mbc3O) + gb->selected_rom_bank = val & 0x7F; + + if(!gb->selected_rom_bank) + gb->selected_rom_bank++; + } + else if(gb->mbc == 5) + gb->selected_rom_bank = (val & 0x01) << 8 | (gb->selected_rom_bank & 0xFF); + + gb->selected_rom_bank = gb->selected_rom_bank & gb->num_rom_banks_mask; + return; + + case 0x4: + case 0x5: + if(gb->mbc == 1) + { + gb->cart_ram_bank = (val & 3); + gb->selected_rom_bank = ((val & 3) << 5) | (gb->selected_rom_bank & 0x1F); + gb->selected_rom_bank = gb->selected_rom_bank & gb->num_rom_banks_mask; + } + else if(gb->mbc == 3) + { + gb->cart_ram_bank = val; + /* If not using MBC3, only the first 4 cart RAM banks are useable. + * If cart RAM bank 0x8-0xC are selected, then the corresponding + * RTC register is selected instead of cart RAM. */ + if(!gb->cart_is_mbc3O && gb->cart_ram_bank < 0x8) + gb->cart_ram_bank &= 0x3; + } + + else if(gb->mbc == 5) + gb->cart_ram_bank = (val & 0x0F); + + return; + + case 0x6: + case 0x7: + val &= 1; + if(gb->mbc == 3 && val && gb->cart_mode_select == 0) + memcpy(&gb->rtc_latched.bytes, &gb->rtc_real.bytes, sizeof(gb->rtc_latched.bytes)); + + /* Set banking mode select. */ + gb->cart_mode_select = val; + return; + + case 0x8: + case 0x9: + gb->vram[addr - VRAM_ADDR] = val; + return; + + case 0xA: + case 0xB: + if(gb->mbc == 3 && gb->cart_ram_bank >= 0x08) + { + const uint8_t rtc_reg_mask[5] = { + 0x3F, 0x3F, 0x1F, 0xFF, 0xC1 + }; + uint8_t reg = gb->cart_ram_bank - 0x08; + //if(reg == 0) gb->counter.rtc_count = 0; + + gb->rtc_real.bytes[reg] = val & rtc_reg_mask[reg]; + } + /* Do not write to RAM if unavailable or disabled. */ + else if(gb->cart_ram && gb->enable_cart_ram) + { + if(gb->mbc == 2) + { + /* Only 9 bits are available in address. */ + addr &= 0x1FF; + /* Data is only 4 bits wide in MBC2 RAM. */ + val &= 0x0F; + /* Upper nibble is set to high. */ + val |= 0xF0; + gb->gb_cart_ram_write(gb, addr, val); + } + /* If cart has RAM, use this. If MBC1, only the first + * RAM bank can be written to if the advanced banking + * mode is selected. */ + else if(((gb->mbc == 1 && gb->cart_mode_select) || gb->mbc != 1) && + gb->cart_ram_bank < gb->num_ram_banks) + { + gb->gb_cart_ram_write(gb, + addr - CART_RAM_ADDR + (gb->cart_ram_bank * CRAM_BANK_SIZE), val); + } + else if(gb->num_ram_banks) + gb->gb_cart_ram_write(gb, addr - CART_RAM_ADDR, val); + } + + return; + + case 0xC: + gb->wram[addr - WRAM_0_ADDR] = val; + return; + + case 0xD: + gb->wram[addr - WRAM_1_ADDR + WRAM_BANK_SIZE] = val; + return; + + case 0xE: + gb->wram[addr - ECHO_ADDR] = val; + return; + + case 0xF: + if(addr < OAM_ADDR) + { + gb->wram[addr - ECHO_ADDR] = val; + return; + } + + if(addr < UNUSED_ADDR) + { + gb->oam[addr - OAM_ADDR] = val; + return; + } + + /* Unusable memory area. */ + if(addr < IO_ADDR) + return; + + if(HRAM_ADDR <= addr && addr < INTR_EN_ADDR) + { + gb->hram_io[addr - IO_ADDR] = val; + return; + } + + if((addr >= 0xFF10) && (addr <= 0xFF3F)) + { +#if ENABLE_SOUND + audio_write(addr, val); +#else + gb->hram_io[addr - IO_ADDR] = val; +#endif + return; + } + + /* IO and Interrupts. */ + switch(PEANUT_GB_GET_LSB16(addr)) + { + /* Joypad */ + case 0x00: + /* Only bits 5 and 4 are R/W. + * The lower bits are overwritten later, and the two most + * significant bits are unused. */ + gb->hram_io[IO_JOYP] = val; + + /* Direction keys selected */ + if((gb->hram_io[IO_JOYP] & 0x10) == 0) + gb->hram_io[IO_JOYP] |= (gb->direct.joypad >> 4); + /* Button keys selected */ + else + gb->hram_io[IO_JOYP] |= (gb->direct.joypad & 0x0F); + + return; + + /* Serial */ + case 0x01: + gb->hram_io[IO_SB] = val; + return; + + case 0x02: + gb->hram_io[IO_SC] = val; + return; + + /* Timer Registers */ + case 0x04: + gb->hram_io[IO_DIV] = 0x00; + return; + + case 0x05: + gb->hram_io[IO_TIMA] = val; + return; + + case 0x06: + gb->hram_io[IO_TMA] = val; + return; + + case 0x07: + gb->hram_io[IO_TAC] = val; + return; + + /* Interrupt Flag Register */ + case 0x0F: + gb->hram_io[IO_IF] = (val | 0xE0); + return; + + /* LCD Registers */ + case 0x40: + { + uint8_t lcd_enabled; + + /* Check if LCD is already enabled. */ + lcd_enabled = (gb->hram_io[IO_LCDC] & LCDC_ENABLE); + + gb->hram_io[IO_LCDC] = val; + + /* Check if LCD is going to be switched on. */ + if (!lcd_enabled && (val & LCDC_ENABLE)) + { + gb->lcd_blank = true; + } + /* Check if LCD is being switched off. */ + else if (lcd_enabled && !(val & LCDC_ENABLE)) + { + /* Peanut-GB will happily turn off LCD outside + * of VBLANK even though this damages real + * hardware. */ + + /* Set LCD to Mode 0. */ + gb->hram_io[IO_STAT] = + (gb->hram_io[IO_STAT] & ~STAT_MODE) | + IO_STAT_MODE_HBLANK; + /* LY fixed to 0 when LCD turned off. */ + gb->hram_io[IO_LY] = 0; + /* Keep track of lcd_count to correctly track + * passing time. */ + gb->counter.lcd_off_count += gb->counter.lcd_count; + /* Reset LCD timer, since the LCD starts from + * the beginning on power on. */ + gb->counter.lcd_count = 0; + } + return; + } + + case 0x41: + gb->hram_io[IO_STAT] = (val & STAT_USER_BITS) | (gb->hram_io[IO_STAT] & STAT_MODE) | 0x80; + return; + + case 0x42: + gb->hram_io[IO_SCY] = val; + return; + + case 0x43: + gb->hram_io[IO_SCX] = val; + return; + + /* LY (0xFF44) is read only. */ + case 0x45: + gb->hram_io[IO_LYC] = val; + return; + + /* DMA Register */ + case 0x46: + { + uint16_t dma_addr; + uint16_t i; + + dma_addr = (uint_fast16_t)val << 8; + gb->hram_io[IO_DMA] = val; + + for(i = 0; i < OAM_SIZE; i++) + { + gb->oam[i] = __gb_read(gb, dma_addr + i); + } + + return; + } + + /* DMG Palette Registers */ + case 0x47: + gb->hram_io[IO_BGP] = val; + gb->display.bg_palette[0] = (gb->hram_io[IO_BGP] & 0x03); + gb->display.bg_palette[1] = (gb->hram_io[IO_BGP] >> 2) & 0x03; + gb->display.bg_palette[2] = (gb->hram_io[IO_BGP] >> 4) & 0x03; + gb->display.bg_palette[3] = (gb->hram_io[IO_BGP] >> 6) & 0x03; + return; + + case 0x48: + gb->hram_io[IO_OBP0] = val; + gb->display.sp_palette[0] = (gb->hram_io[IO_OBP0] & 0x03); + gb->display.sp_palette[1] = (gb->hram_io[IO_OBP0] >> 2) & 0x03; + gb->display.sp_palette[2] = (gb->hram_io[IO_OBP0] >> 4) & 0x03; + gb->display.sp_palette[3] = (gb->hram_io[IO_OBP0] >> 6) & 0x03; + return; + + case 0x49: + gb->hram_io[IO_OBP1] = val; + gb->display.sp_palette[4] = (gb->hram_io[IO_OBP1] & 0x03); + gb->display.sp_palette[5] = (gb->hram_io[IO_OBP1] >> 2) & 0x03; + gb->display.sp_palette[6] = (gb->hram_io[IO_OBP1] >> 4) & 0x03; + gb->display.sp_palette[7] = (gb->hram_io[IO_OBP1] >> 6) & 0x03; + return; + + /* Window Position Registers */ + case 0x4A: + gb->hram_io[IO_WY] = val; + return; + + case 0x4B: + gb->hram_io[IO_WX] = val; + return; + + /* Turn off boot ROM */ + case 0x50: + gb->hram_io[IO_BOOT] = 0x01; + return; + + /* Interrupt Enable Register */ + case 0xFF: + gb->hram_io[IO_IE] = val; + return; + } + } + + /* Invalid writes are ignored. */ + return; +} + +uint8_t __gb_execute_cb(struct gb_s *gb) +{ + uint8_t inst_cycles; + uint8_t cbop = __gb_read(gb, gb->cpu_reg.pc.reg++); + uint8_t r = (cbop & 0x7); + uint8_t b = (cbop >> 3) & 0x7; + uint8_t d = (cbop >> 3) & 0x1; + uint8_t val; + uint8_t writeback = 1; + + inst_cycles = 8; + /* Add an additional 8 cycles to these sets of instructions. */ + switch(cbop & 0xC7) + { + case 0x06: + case 0x86: + case 0xC6: + inst_cycles += 8; + break; + case 0x46: + inst_cycles += 4; + break; + } + + switch(r) + { + case 0: + val = gb->cpu_reg.bc.bytes.b; + break; + + case 1: + val = gb->cpu_reg.bc.bytes.c; + break; + + case 2: + val = gb->cpu_reg.de.bytes.d; + break; + + case 3: + val = gb->cpu_reg.de.bytes.e; + break; + + case 4: + val = gb->cpu_reg.hl.bytes.h; + break; + + case 5: + val = gb->cpu_reg.hl.bytes.l; + break; + + case 6: + val = __gb_read(gb, gb->cpu_reg.hl.reg); + break; + + /* Only values 0-7 are possible here, so we make the final case + * default to satisfy -Wmaybe-uninitialized warning. */ + default: + val = gb->cpu_reg.a; + break; + } + + switch(cbop >> 6) + { + case 0x0: + cbop = (cbop >> 4) & 0x3; + + switch(cbop) + { + case 0x0: /* RdC R */ + case 0x1: /* Rd R */ + if(d) /* RRC R / RR R */ + { + uint8_t temp = val; + val = (val >> 1); + val |= cbop ? (gb->cpu_reg.f.f_bits.c << 7) : (temp << 7); + gb->cpu_reg.f.reg = 0; + gb->cpu_reg.f.f_bits.z = (val == 0x00); + gb->cpu_reg.f.f_bits.c = (temp & 0x01); + } + else /* RLC R / RL R */ + { + uint8_t temp = val; + val = (val << 1); + val |= cbop ? gb->cpu_reg.f.f_bits.c : (temp >> 7); + gb->cpu_reg.f.reg = 0; + gb->cpu_reg.f.f_bits.z = (val == 0x00); + gb->cpu_reg.f.f_bits.c = (temp >> 7); + } + + break; + + case 0x2: + if(d) /* SRA R */ + { + gb->cpu_reg.f.reg = 0; + gb->cpu_reg.f.f_bits.c = val & 0x01; + val = (val >> 1) | (val & 0x80); + gb->cpu_reg.f.f_bits.z = (val == 0x00); + } + else /* SLA R */ + { + gb->cpu_reg.f.reg = 0; + gb->cpu_reg.f.f_bits.c = (val >> 7); + val = val << 1; + gb->cpu_reg.f.f_bits.z = (val == 0x00); + } + + break; + + case 0x3: + if(d) /* SRL R */ + { + gb->cpu_reg.f.reg = 0; + gb->cpu_reg.f.f_bits.c = val & 0x01; + val = val >> 1; + gb->cpu_reg.f.f_bits.z = (val == 0x00); + } + else /* SWAP R */ + { + uint8_t temp = (val >> 4) & 0x0F; + temp |= (val << 4) & 0xF0; + val = temp; + gb->cpu_reg.f.reg = 0; + gb->cpu_reg.f.f_bits.z = (val == 0x00); + } + + break; + } + + break; + + case 0x1: /* BIT B, R */ + gb->cpu_reg.f.f_bits.z = !((val >> b) & 0x1); + gb->cpu_reg.f.f_bits.n = 0; + gb->cpu_reg.f.f_bits.h = 1; + writeback = 0; + break; + + case 0x2: /* RES B, R */ + val &= (0xFE << b) | (0xFF >> (8 - b)); + break; + + case 0x3: /* SET B, R */ + val |= (0x1 << b); + break; + } + + if(writeback) + { + switch(r) + { + case 0: + gb->cpu_reg.bc.bytes.b = val; + break; + + case 1: + gb->cpu_reg.bc.bytes.c = val; + break; + + case 2: + gb->cpu_reg.de.bytes.d = val; + break; + + case 3: + gb->cpu_reg.de.bytes.e = val; + break; + + case 4: + gb->cpu_reg.hl.bytes.h = val; + break; + + case 5: + gb->cpu_reg.hl.bytes.l = val; + break; + + case 6: + __gb_write(gb, gb->cpu_reg.hl.reg, val); + break; + + case 7: + gb->cpu_reg.a = val; + break; + } + } + return inst_cycles; +} + +#if ENABLE_LCD +struct sprite_data { + uint8_t sprite_number; + uint8_t x; +}; + +#if PEANUT_GB_HIGH_LCD_ACCURACY +static int compare_sprites(const struct sprite_data *const sd1, const struct sprite_data *const sd2) +{ + int x_res; + + x_res = (int)sd1->x - (int)sd2->x; + if(x_res != 0) + return x_res; + + return (int)sd1->sprite_number - (int)sd2->sprite_number; +} +#endif + +void __gb_draw_line(struct gb_s *gb) +{ + uint8_t pixels[160] = {0}; + + /* If LCD not initialised by front-end, don't render anything. */ + if(gb->display.lcd_draw_line == NULL) + return; + + if(gb->direct.frame_skip && !gb->display.frame_skip_count) + return; + + /* If interlaced mode is activated, check if we need to draw the current + * line. */ + if(gb->direct.interlace) + { + if((!gb->display.interlace_count + && (gb->hram_io[IO_LY] & 1) == 0) + || (gb->display.interlace_count + && (gb->hram_io[IO_LY] & 1) == 1)) + { + /* Compensate for missing window draw if required. */ + if(gb->hram_io[IO_LCDC] & LCDC_WINDOW_ENABLE + && gb->hram_io[IO_LY] >= gb->display.WY + && gb->hram_io[IO_WX] <= 166) + gb->display.window_clear++; + + return; + } + } + + /* If background is enabled, draw it. */ + if(gb->hram_io[IO_LCDC] & LCDC_BG_ENABLE) + { + uint8_t bg_y, disp_x, bg_x, idx, py, px, t1, t2; + uint16_t bg_map, tile; + + /* Calculate current background line to draw. Constant because + * this function draws only this one line each time it is + * called. */ + bg_y = gb->hram_io[IO_LY] + gb->hram_io[IO_SCY]; + + /* Get selected background map address for first tile + * corresponding to current line. + * 0x20 (32) is the width of a background tile, and the bit + * shift is to calculate the address. */ + bg_map = + ((gb->hram_io[IO_LCDC] & LCDC_BG_MAP) ? + VRAM_BMAP_2 : VRAM_BMAP_1) + + (bg_y >> 3) * 0x20; + + /* The displays (what the player sees) X coordinate, drawn right + * to left. */ + disp_x = LCD_WIDTH - 1; + + /* The X coordinate to begin drawing the background at. */ + bg_x = disp_x + gb->hram_io[IO_SCX]; + + /* Get tile index for current background tile. */ + idx = gb->vram[bg_map + (bg_x >> 3)]; + /* Y coordinate of tile pixel to draw. */ + py = (bg_y & 0x07); + /* X coordinate of tile pixel to draw. */ + px = 7 - (bg_x & 0x07); + + /* Select addressing mode. */ + if(gb->hram_io[IO_LCDC] & LCDC_TILE_SELECT) + tile = VRAM_TILES_1 + idx * 0x10; + else + tile = VRAM_TILES_2 + ((idx + 0x80) % 0x100) * 0x10; + + tile += 2 * py; + + /* fetch first tile */ + t1 = gb->vram[tile] >> px; + t2 = gb->vram[tile + 1] >> px; + + for(; disp_x != 0xFF; disp_x--) + { + uint8_t c; + + if(px == 8) + { + /* fetch next tile */ + px = 0; + bg_x = disp_x + gb->hram_io[IO_SCX]; + idx = gb->vram[bg_map + (bg_x >> 3)]; + + if(gb->hram_io[IO_LCDC] & LCDC_TILE_SELECT) + tile = VRAM_TILES_1 + idx * 0x10; + else + tile = VRAM_TILES_2 + ((idx + 0x80) % 0x100) * 0x10; + + tile += 2 * py; + t1 = gb->vram[tile]; + t2 = gb->vram[tile + 1]; + } + + /* copy background */ + c = (t1 & 0x1) | ((t2 & 0x1) << 1); + pixels[disp_x] = gb->display.bg_palette[c]; +#if PEANUT_GB_12_COLOUR + pixels[disp_x] |= LCD_PALETTE_BG; +#endif + t1 = t1 >> 1; + t2 = t2 >> 1; + px++; + } + } + + /* draw window */ + if(gb->hram_io[IO_LCDC] & LCDC_WINDOW_ENABLE + && gb->hram_io[IO_LY] >= gb->display.WY + && gb->hram_io[IO_WX] <= 166) + { + uint16_t win_line, tile; + uint8_t disp_x, win_x, py, px, idx, t1, t2, end; + + /* Calculate Window Map Address. */ + win_line = (gb->hram_io[IO_LCDC] & LCDC_WINDOW_MAP) ? + VRAM_BMAP_2 : VRAM_BMAP_1; + win_line += (gb->display.window_clear >> 3) * 0x20; + + disp_x = LCD_WIDTH - 1; + win_x = disp_x - gb->hram_io[IO_WX] + 7; + + // look up tile + py = gb->display.window_clear & 0x07; + px = 7 - (win_x & 0x07); + idx = gb->vram[win_line + (win_x >> 3)]; + + if(gb->hram_io[IO_LCDC] & LCDC_TILE_SELECT) + tile = VRAM_TILES_1 + idx * 0x10; + else + tile = VRAM_TILES_2 + ((idx + 0x80) % 0x100) * 0x10; + + tile += 2 * py; + + // fetch first tile + t1 = gb->vram[tile] >> px; + t2 = gb->vram[tile + 1] >> px; + + // loop & copy window + end = (gb->hram_io[IO_WX] < 7 ? 0 : gb->hram_io[IO_WX] - 7) - 1; + + for(; disp_x != end; disp_x--) + { + uint8_t c; + + if(px == 8) + { + // fetch next tile + px = 0; + win_x = disp_x - gb->hram_io[IO_WX] + 7; + idx = gb->vram[win_line + (win_x >> 3)]; + + if(gb->hram_io[IO_LCDC] & LCDC_TILE_SELECT) + tile = VRAM_TILES_1 + idx * 0x10; + else + tile = VRAM_TILES_2 + ((idx + 0x80) % 0x100) * 0x10; + + tile += 2 * py; + t1 = gb->vram[tile]; + t2 = gb->vram[tile + 1]; + } + + // copy window + c = (t1 & 0x1) | ((t2 & 0x1) << 1); + pixels[disp_x] = gb->display.bg_palette[c]; +#if PEANUT_GB_12_COLOUR + pixels[disp_x] |= LCD_PALETTE_BG; +#endif + t1 = t1 >> 1; + t2 = t2 >> 1; + px++; + } + + gb->display.window_clear++; // advance window line + } + + // draw sprites + if(gb->hram_io[IO_LCDC] & LCDC_OBJ_ENABLE) + { + uint8_t sprite_number; +#if PEANUT_GB_HIGH_LCD_ACCURACY + uint8_t number_of_sprites = 0; + + struct sprite_data sprites_to_render[MAX_SPRITES_LINE]; + + /* Record number of sprites on the line being rendered, limited + * to the maximum number sprites that the Game Boy is able to + * render on each line (10 sprites). */ + for(sprite_number = 0; + sprite_number < NUM_SPRITES; + sprite_number++) + { + /* Sprite Y position. */ + uint8_t OY = gb->oam[4 * sprite_number + 0]; + /* Sprite X position. */ + uint8_t OX = gb->oam[4 * sprite_number + 1]; + + /* If sprite isn't on this line, continue. */ + if (gb->hram_io[IO_LY] + + (gb->hram_io[IO_LCDC] & LCDC_OBJ_SIZE ? 0 : 8) >= OY + || gb->hram_io[IO_LY] + 16 < OY) + continue; + + struct sprite_data current; + + current.sprite_number = sprite_number; + current.x = OX; + + uint8_t place; + for (place = number_of_sprites; place != 0; place--) + { + if(compare_sprites(&sprites_to_render[place - 1], ¤t) < 0) + break; + } + if(place >= MAX_SPRITES_LINE) + continue; + for (uint8_t i = number_of_sprites; i > place; --i) { + sprites_to_render[i] = sprites_to_render[i - 1]; + } + if(number_of_sprites < MAX_SPRITES_LINE) + number_of_sprites++; + sprites_to_render[place] = current; + } +#endif + + /* Render each sprite, from low priority to high priority. */ +#if PEANUT_GB_HIGH_LCD_ACCURACY + /* Render the top ten prioritised sprites on this scanline. */ + for(sprite_number = number_of_sprites - 1; + sprite_number != 0xFF; + sprite_number--) + { + uint8_t s = sprites_to_render[sprite_number].sprite_number; +#else + for (sprite_number = NUM_SPRITES - 1; + sprite_number != 0xFF; + sprite_number--) + { + uint8_t s = sprite_number; +#endif + uint8_t py, t1, t2, dir, start, end, shift, disp_x; + /* Sprite Y position. */ + uint8_t OY = gb->oam[4 * s + 0]; + /* Sprite X position. */ + uint8_t OX = gb->oam[4 * s + 1]; + /* Sprite Tile/Pattern Number. */ + uint8_t OT = gb->oam[4 * s + 2] + & (gb->hram_io[IO_LCDC] & LCDC_OBJ_SIZE ? 0xFE : 0xFF); + /* Additional attributes. */ + uint8_t OF = gb->oam[4 * s + 3]; + +#if !PEANUT_GB_HIGH_LCD_ACCURACY + /* If sprite isn't on this line, continue. */ + if(gb->hram_io[IO_LY] + + (gb->hram_io[IO_LCDC] & LCDC_OBJ_SIZE ? 0 : 8) >= OY || + gb->hram_io[IO_LY] + 16 < OY) + continue; +#endif + + /* Continue if sprite not visible. */ + if(OX == 0 || OX >= 168) + continue; + + // y flip + py = gb->hram_io[IO_LY] - OY + 16; + + if(OF & OBJ_FLIP_Y) + py = (gb->hram_io[IO_LCDC] & LCDC_OBJ_SIZE ? 15 : 7) - py; + + // fetch the tile + t1 = gb->vram[VRAM_TILES_1 + OT * 0x10 + 2 * py]; + t2 = gb->vram[VRAM_TILES_1 + OT * 0x10 + 2 * py + 1]; + + // handle x flip + if(OF & OBJ_FLIP_X) + { + dir = 1; + start = (OX < 8 ? 0 : OX - 8); + end = MIN(OX, LCD_WIDTH); + shift = 8 - OX + start; + } + else + { + dir = (uint8_t)-1; + start = MIN(OX, LCD_WIDTH) - 1; + end = (OX < 8 ? 0 : OX - 8) - 1; + shift = OX - (start + 1); + } + + // copy tile + t1 >>= shift; + t2 >>= shift; + + /* TODO: Put for loop within the to if statements + * because the BG priority bit will be the same for + * all the pixels in the tile. */ + for(disp_x = start; disp_x != end; disp_x += dir) + { + uint8_t c = (t1 & 0x1) | ((t2 & 0x1) << 1); + // check transparency / sprite overlap / background overlap + + if(c && !(OF & OBJ_PRIORITY && !((pixels[disp_x] & 0x3) == gb->display.bg_palette[0]))) + { + /* Set pixel colour. */ + pixels[disp_x] = (OF & OBJ_PALETTE) + ? gb->display.sp_palette[c + 4] + : gb->display.sp_palette[c]; +#if PEANUT_GB_12_COLOUR + /* Set pixel palette (OBJ0 or OBJ1). */ + pixels[disp_x] |= (OF & OBJ_PALETTE); +#endif + } + + t1 = t1 >> 1; + t2 = t2 >> 1; + } + } + } + + gb->display.lcd_draw_line(gb, pixels, gb->hram_io[IO_LY]); +} +#endif + +/** + * Internal function used to step the CPU. + */ +void __gb_step_cpu(struct gb_s *gb) +{ + uint8_t opcode; + uint_fast16_t inst_cycles; + static const uint8_t op_cycles[0x100] = + { + /* *INDENT-OFF* */ + /*0 1 2 3 4 5 6 7 8 9 A B C D E F */ + 4,12, 8, 8, 4, 4, 8, 4,20, 8, 8, 8, 4, 4, 8, 4, /* 0x00 */ + 4,12, 8, 8, 4, 4, 8, 4,12, 8, 8, 8, 4, 4, 8, 4, /* 0x10 */ + 8,12, 8, 8, 4, 4, 8, 4, 8, 8, 8, 8, 4, 4, 8, 4, /* 0x20 */ + 8,12, 8, 8,12,12,12, 4, 8, 8, 8, 8, 4, 4, 8, 4, /* 0x30 */ + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, /* 0x40 */ + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, /* 0x50 */ + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, /* 0x60 */ + 8, 8, 8, 8, 8, 8, 4, 8, 4, 4, 4, 4, 4, 4, 8, 4, /* 0x70 */ + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, /* 0x80 */ + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, /* 0x90 */ + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, /* 0xA0 */ + 4, 4, 4, 4, 4, 4, 8, 4, 4, 4, 4, 4, 4, 4, 8, 4, /* 0xB0 */ + 8,12,12,16,12,16, 8,16, 8,16,12, 8,12,24, 8,16, /* 0xC0 */ + 8,12,12, 0,12,16, 8,16, 8,16,12, 0,12, 0, 8,16, /* 0xD0 */ + 12,12,8, 0, 0,16, 8,16,16, 4,16, 0, 0, 0, 8,16, /* 0xE0 */ + 12,12,8, 4, 0,16, 8,16,12, 8,16, 4, 0, 0, 8,16 /* 0xF0 */ + /* *INDENT-ON* */ + }; + static const uint_fast16_t TAC_CYCLES[4] = {1024, 16, 64, 256}; + + /* Handle interrupts */ + /* If gb_halt is positive, then an interrupt must have occurred by the + * time we reach here, because on HALT, we jump to the next interrupt + * immediately. */ + while(gb->gb_halt || (gb->gb_ime && + gb->hram_io[IO_IF] & gb->hram_io[IO_IE] & ANY_INTR)) + { + gb->gb_halt = false; + + if(!gb->gb_ime) + break; + + /* Disable interrupts */ + gb->gb_ime = false; + + /* Push Program Counter */ + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.p); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.c); + + /* Call interrupt handler if required. */ + if(gb->hram_io[IO_IF] & gb->hram_io[IO_IE] & VBLANK_INTR) + { + gb->cpu_reg.pc.reg = VBLANK_INTR_ADDR; + gb->hram_io[IO_IF] ^= VBLANK_INTR; + } + else if(gb->hram_io[IO_IF] & gb->hram_io[IO_IE] & LCDC_INTR) + { + gb->cpu_reg.pc.reg = LCDC_INTR_ADDR; + gb->hram_io[IO_IF] ^= LCDC_INTR; + } + else if(gb->hram_io[IO_IF] & gb->hram_io[IO_IE] & TIMER_INTR) + { + gb->cpu_reg.pc.reg = TIMER_INTR_ADDR; + gb->hram_io[IO_IF] ^= TIMER_INTR; + } + else if(gb->hram_io[IO_IF] & gb->hram_io[IO_IE] & SERIAL_INTR) + { + gb->cpu_reg.pc.reg = SERIAL_INTR_ADDR; + gb->hram_io[IO_IF] ^= SERIAL_INTR; + } + else if(gb->hram_io[IO_IF] & gb->hram_io[IO_IE] & CONTROL_INTR) + { + gb->cpu_reg.pc.reg = CONTROL_INTR_ADDR; + gb->hram_io[IO_IF] ^= CONTROL_INTR; + } + + break; + } + + /* Obtain opcode */ + opcode = __gb_read(gb, gb->cpu_reg.pc.reg++); + inst_cycles = op_cycles[opcode]; + + /* Execute opcode */ + switch(opcode) + { + case 0x00: /* NOP */ + break; + + case 0x01: /* LD BC, imm */ + gb->cpu_reg.bc.bytes.c = __gb_read(gb, gb->cpu_reg.pc.reg++); + gb->cpu_reg.bc.bytes.b = __gb_read(gb, gb->cpu_reg.pc.reg++); + break; + + case 0x02: /* LD (BC), A */ + __gb_write(gb, gb->cpu_reg.bc.reg, gb->cpu_reg.a); + break; + + case 0x03: /* INC BC */ + gb->cpu_reg.bc.reg++; + break; + + case 0x04: /* INC B */ + PGB_INSTR_INC_R8(gb->cpu_reg.bc.bytes.b); + break; + + case 0x05: /* DEC B */ + PGB_INSTR_DEC_R8(gb->cpu_reg.bc.bytes.b); + break; + + case 0x06: /* LD B, imm */ + gb->cpu_reg.bc.bytes.b = __gb_read(gb, gb->cpu_reg.pc.reg++); + break; + + case 0x07: /* RLCA */ + gb->cpu_reg.a = (gb->cpu_reg.a << 1) | (gb->cpu_reg.a >> 7); + gb->cpu_reg.f.reg = 0; + gb->cpu_reg.f.f_bits.c = (gb->cpu_reg.a & 0x01); + break; + + case 0x08: /* LD (imm), SP */ + { + uint8_t h, l; + uint16_t temp; + l = __gb_read(gb, gb->cpu_reg.pc.reg++); + h = __gb_read(gb, gb->cpu_reg.pc.reg++); + temp = PEANUT_GB_U8_TO_U16(h,l); + __gb_write(gb, temp++, gb->cpu_reg.sp.bytes.p); + __gb_write(gb, temp, gb->cpu_reg.sp.bytes.s); + break; + } + + case 0x09: /* ADD HL, BC */ + { + uint_fast32_t temp = gb->cpu_reg.hl.reg + gb->cpu_reg.bc.reg; + gb->cpu_reg.f.f_bits.n = 0; + gb->cpu_reg.f.f_bits.h = + (temp ^ gb->cpu_reg.hl.reg ^ gb->cpu_reg.bc.reg) & 0x1000 ? 1 : 0; + gb->cpu_reg.f.f_bits.c = (temp & 0xFFFF0000) ? 1 : 0; + gb->cpu_reg.hl.reg = (temp & 0x0000FFFF); + break; + } + + case 0x0A: /* LD A, (BC) */ + gb->cpu_reg.a = __gb_read(gb, gb->cpu_reg.bc.reg); + break; + + case 0x0B: /* DEC BC */ + gb->cpu_reg.bc.reg--; + break; + + case 0x0C: /* INC C */ + PGB_INSTR_INC_R8(gb->cpu_reg.bc.bytes.c); + break; + + case 0x0D: /* DEC C */ + PGB_INSTR_DEC_R8(gb->cpu_reg.bc.bytes.c); + break; + + case 0x0E: /* LD C, imm */ + gb->cpu_reg.bc.bytes.c = __gb_read(gb, gb->cpu_reg.pc.reg++); + break; + + case 0x0F: /* RRCA */ + gb->cpu_reg.f.reg = 0; + gb->cpu_reg.f.f_bits.c = gb->cpu_reg.a & 0x01; + gb->cpu_reg.a = (gb->cpu_reg.a >> 1) | (gb->cpu_reg.a << 7); + break; + + case 0x10: /* STOP */ + //gb->gb_halt = true; + break; + + case 0x11: /* LD DE, imm */ + gb->cpu_reg.de.bytes.e = __gb_read(gb, gb->cpu_reg.pc.reg++); + gb->cpu_reg.de.bytes.d = __gb_read(gb, gb->cpu_reg.pc.reg++); + break; + + case 0x12: /* LD (DE), A */ + __gb_write(gb, gb->cpu_reg.de.reg, gb->cpu_reg.a); + break; + + case 0x13: /* INC DE */ + gb->cpu_reg.de.reg++; + break; + + case 0x14: /* INC D */ + PGB_INSTR_INC_R8(gb->cpu_reg.de.bytes.d); + break; + + case 0x15: /* DEC D */ + PGB_INSTR_DEC_R8(gb->cpu_reg.de.bytes.d); + break; + + case 0x16: /* LD D, imm */ + gb->cpu_reg.de.bytes.d = __gb_read(gb, gb->cpu_reg.pc.reg++); + break; + + case 0x17: /* RLA */ + { + uint8_t temp = gb->cpu_reg.a; + gb->cpu_reg.a = (gb->cpu_reg.a << 1) | gb->cpu_reg.f.f_bits.c; + gb->cpu_reg.f.reg = 0; + gb->cpu_reg.f.f_bits.c = (temp >> 7) & 0x01; + break; + } + + case 0x18: /* JR imm */ + { + int8_t temp = (int8_t) __gb_read(gb, gb->cpu_reg.pc.reg++); + gb->cpu_reg.pc.reg += temp; + break; + } + + case 0x19: /* ADD HL, DE */ + { + uint_fast32_t temp = gb->cpu_reg.hl.reg + gb->cpu_reg.de.reg; + gb->cpu_reg.f.f_bits.n = 0; + gb->cpu_reg.f.f_bits.h = + (temp ^ gb->cpu_reg.hl.reg ^ gb->cpu_reg.de.reg) & 0x1000 ? 1 : 0; + gb->cpu_reg.f.f_bits.c = (temp & 0xFFFF0000) ? 1 : 0; + gb->cpu_reg.hl.reg = (temp & 0x0000FFFF); + break; + } + + case 0x1A: /* LD A, (DE) */ + gb->cpu_reg.a = __gb_read(gb, gb->cpu_reg.de.reg); + break; + + case 0x1B: /* DEC DE */ + gb->cpu_reg.de.reg--; + break; + + case 0x1C: /* INC E */ + PGB_INSTR_INC_R8(gb->cpu_reg.de.bytes.e); + break; + + case 0x1D: /* DEC E */ + PGB_INSTR_DEC_R8(gb->cpu_reg.de.bytes.e); + break; + + case 0x1E: /* LD E, imm */ + gb->cpu_reg.de.bytes.e = __gb_read(gb, gb->cpu_reg.pc.reg++); + break; + + case 0x1F: /* RRA */ + { + uint8_t temp = gb->cpu_reg.a; + gb->cpu_reg.a = gb->cpu_reg.a >> 1 | (gb->cpu_reg.f.f_bits.c << 7); + gb->cpu_reg.f.reg = 0; + gb->cpu_reg.f.f_bits.c = temp & 0x1; + break; + } + + case 0x20: /* JR NZ, imm */ + if(!gb->cpu_reg.f.f_bits.z) + { + int8_t temp = (int8_t) __gb_read(gb, gb->cpu_reg.pc.reg++); + gb->cpu_reg.pc.reg += temp; + inst_cycles += 4; + } + else + gb->cpu_reg.pc.reg++; + + break; + + case 0x21: /* LD HL, imm */ + gb->cpu_reg.hl.bytes.l = __gb_read(gb, gb->cpu_reg.pc.reg++); + gb->cpu_reg.hl.bytes.h = __gb_read(gb, gb->cpu_reg.pc.reg++); + break; + + case 0x22: /* LDI (HL), A */ + __gb_write(gb, gb->cpu_reg.hl.reg, gb->cpu_reg.a); + gb->cpu_reg.hl.reg++; + break; + + case 0x23: /* INC HL */ + gb->cpu_reg.hl.reg++; + break; + + case 0x24: /* INC H */ + PGB_INSTR_INC_R8(gb->cpu_reg.hl.bytes.h); + break; + + case 0x25: /* DEC H */ + PGB_INSTR_DEC_R8(gb->cpu_reg.hl.bytes.h); + break; + + case 0x26: /* LD H, imm */ + gb->cpu_reg.hl.bytes.h = __gb_read(gb, gb->cpu_reg.pc.reg++); + break; + + case 0x27: /* DAA */ + { + /* The following is from SameBoy. MIT License. */ + int16_t a = gb->cpu_reg.a; + + if(gb->cpu_reg.f.f_bits.n) + { + if(gb->cpu_reg.f.f_bits.h) + a = (a - 0x06) & 0xFF; + + if(gb->cpu_reg.f.f_bits.c) + a -= 0x60; + } + else + { + if(gb->cpu_reg.f.f_bits.h || (a & 0x0F) > 9) + a += 0x06; + + if(gb->cpu_reg.f.f_bits.c || a > 0x9F) + a += 0x60; + } + + if((a & 0x100) == 0x100) + gb->cpu_reg.f.f_bits.c = 1; + + gb->cpu_reg.a = a; + gb->cpu_reg.f.f_bits.z = (gb->cpu_reg.a == 0); + gb->cpu_reg.f.f_bits.h = 0; + + break; + } + + case 0x28: /* JR Z, imm */ + if(gb->cpu_reg.f.f_bits.z) + { + int8_t temp = (int8_t) __gb_read(gb, gb->cpu_reg.pc.reg++); + gb->cpu_reg.pc.reg += temp; + inst_cycles += 4; + } + else + gb->cpu_reg.pc.reg++; + + break; + + case 0x29: /* ADD HL, HL */ + { + gb->cpu_reg.f.f_bits.c = (gb->cpu_reg.hl.reg & 0x8000) > 0; + gb->cpu_reg.hl.reg <<= 1; + gb->cpu_reg.f.f_bits.n = 0; + gb->cpu_reg.f.f_bits.h = (gb->cpu_reg.hl.reg & 0x1000) > 0; + break; + } + + case 0x2A: /* LD A, (HL+) */ + gb->cpu_reg.a = __gb_read(gb, gb->cpu_reg.hl.reg++); + break; + + case 0x2B: /* DEC HL */ + gb->cpu_reg.hl.reg--; + break; + + case 0x2C: /* INC L */ + PGB_INSTR_INC_R8(gb->cpu_reg.hl.bytes.l); + break; + + case 0x2D: /* DEC L */ + PGB_INSTR_DEC_R8(gb->cpu_reg.hl.bytes.l); + break; + + case 0x2E: /* LD L, imm */ + gb->cpu_reg.hl.bytes.l = __gb_read(gb, gb->cpu_reg.pc.reg++); + break; + + case 0x2F: /* CPL */ + gb->cpu_reg.a = ~gb->cpu_reg.a; + gb->cpu_reg.f.f_bits.n = 1; + gb->cpu_reg.f.f_bits.h = 1; + break; + + case 0x30: /* JR NC, imm */ + if(!gb->cpu_reg.f.f_bits.c) + { + int8_t temp = (int8_t) __gb_read(gb, gb->cpu_reg.pc.reg++); + gb->cpu_reg.pc.reg += temp; + inst_cycles += 4; + } + else + gb->cpu_reg.pc.reg++; + + break; + + case 0x31: /* LD SP, imm */ + gb->cpu_reg.sp.bytes.p = __gb_read(gb, gb->cpu_reg.pc.reg++); + gb->cpu_reg.sp.bytes.s = __gb_read(gb, gb->cpu_reg.pc.reg++); + break; + + case 0x32: /* LD (HL), A */ + __gb_write(gb, gb->cpu_reg.hl.reg, gb->cpu_reg.a); + gb->cpu_reg.hl.reg--; + break; + + case 0x33: /* INC SP */ + gb->cpu_reg.sp.reg++; + break; + + case 0x34: /* INC (HL) */ + { + uint8_t temp = __gb_read(gb, gb->cpu_reg.hl.reg); + PGB_INSTR_INC_R8(temp); + __gb_write(gb, gb->cpu_reg.hl.reg, temp); + break; + } + + case 0x35: /* DEC (HL) */ + { + uint8_t temp = __gb_read(gb, gb->cpu_reg.hl.reg); + PGB_INSTR_DEC_R8(temp); + __gb_write(gb, gb->cpu_reg.hl.reg, temp); + break; + } + + case 0x36: /* LD (HL), imm */ + __gb_write(gb, gb->cpu_reg.hl.reg, __gb_read(gb, gb->cpu_reg.pc.reg++)); + break; + + case 0x37: /* SCF */ + gb->cpu_reg.f.f_bits.n = 0; + gb->cpu_reg.f.f_bits.h = 0; + gb->cpu_reg.f.f_bits.c = 1; + break; + + case 0x38: /* JR C, imm */ + if(gb->cpu_reg.f.f_bits.c) + { + int8_t temp = (int8_t) __gb_read(gb, gb->cpu_reg.pc.reg++); + gb->cpu_reg.pc.reg += temp; + inst_cycles += 4; + } + else + gb->cpu_reg.pc.reg++; + + break; + + case 0x39: /* ADD HL, SP */ + { + uint_fast32_t temp = gb->cpu_reg.hl.reg + gb->cpu_reg.sp.reg; + gb->cpu_reg.f.f_bits.n = 0; + gb->cpu_reg.f.f_bits.h = + ((gb->cpu_reg.hl.reg & 0xFFF) + (gb->cpu_reg.sp.reg & 0xFFF)) & 0x1000 ? 1 : 0; + gb->cpu_reg.f.f_bits.c = temp & 0x10000 ? 1 : 0; + gb->cpu_reg.hl.reg = (uint16_t)temp; + break; + } + + case 0x3A: /* LD A, (HL) */ + gb->cpu_reg.a = __gb_read(gb, gb->cpu_reg.hl.reg--); + break; + + case 0x3B: /* DEC SP */ + gb->cpu_reg.sp.reg--; + break; + + case 0x3C: /* INC A */ + PGB_INSTR_INC_R8(gb->cpu_reg.a); + break; + + case 0x3D: /* DEC A */ + PGB_INSTR_DEC_R8(gb->cpu_reg.a); + break; + + case 0x3E: /* LD A, imm */ + gb->cpu_reg.a = __gb_read(gb, gb->cpu_reg.pc.reg++); + break; + + case 0x3F: /* CCF */ + gb->cpu_reg.f.f_bits.n = 0; + gb->cpu_reg.f.f_bits.h = 0; + gb->cpu_reg.f.f_bits.c = ~gb->cpu_reg.f.f_bits.c; + break; + + case 0x40: /* LD B, B */ + break; + + case 0x41: /* LD B, C */ + gb->cpu_reg.bc.bytes.b = gb->cpu_reg.bc.bytes.c; + break; + + case 0x42: /* LD B, D */ + gb->cpu_reg.bc.bytes.b = gb->cpu_reg.de.bytes.d; + break; + + case 0x43: /* LD B, E */ + gb->cpu_reg.bc.bytes.b = gb->cpu_reg.de.bytes.e; + break; + + case 0x44: /* LD B, H */ + gb->cpu_reg.bc.bytes.b = gb->cpu_reg.hl.bytes.h; + break; + + case 0x45: /* LD B, L */ + gb->cpu_reg.bc.bytes.b = gb->cpu_reg.hl.bytes.l; + break; + + case 0x46: /* LD B, (HL) */ + gb->cpu_reg.bc.bytes.b = __gb_read(gb, gb->cpu_reg.hl.reg); + break; + + case 0x47: /* LD B, A */ + gb->cpu_reg.bc.bytes.b = gb->cpu_reg.a; + break; + + case 0x48: /* LD C, B */ + gb->cpu_reg.bc.bytes.c = gb->cpu_reg.bc.bytes.b; + break; + + case 0x49: /* LD C, C */ + break; + + case 0x4A: /* LD C, D */ + gb->cpu_reg.bc.bytes.c = gb->cpu_reg.de.bytes.d; + break; + + case 0x4B: /* LD C, E */ + gb->cpu_reg.bc.bytes.c = gb->cpu_reg.de.bytes.e; + break; + + case 0x4C: /* LD C, H */ + gb->cpu_reg.bc.bytes.c = gb->cpu_reg.hl.bytes.h; + break; + + case 0x4D: /* LD C, L */ + gb->cpu_reg.bc.bytes.c = gb->cpu_reg.hl.bytes.l; + break; + + case 0x4E: /* LD C, (HL) */ + gb->cpu_reg.bc.bytes.c = __gb_read(gb, gb->cpu_reg.hl.reg); + break; + + case 0x4F: /* LD C, A */ + gb->cpu_reg.bc.bytes.c = gb->cpu_reg.a; + break; + + case 0x50: /* LD D, B */ + gb->cpu_reg.de.bytes.d = gb->cpu_reg.bc.bytes.b; + break; + + case 0x51: /* LD D, C */ + gb->cpu_reg.de.bytes.d = gb->cpu_reg.bc.bytes.c; + break; + + case 0x52: /* LD D, D */ + break; + + case 0x53: /* LD D, E */ + gb->cpu_reg.de.bytes.d = gb->cpu_reg.de.bytes.e; + break; + + case 0x54: /* LD D, H */ + gb->cpu_reg.de.bytes.d = gb->cpu_reg.hl.bytes.h; + break; + + case 0x55: /* LD D, L */ + gb->cpu_reg.de.bytes.d = gb->cpu_reg.hl.bytes.l; + break; + + case 0x56: /* LD D, (HL) */ + gb->cpu_reg.de.bytes.d = __gb_read(gb, gb->cpu_reg.hl.reg); + break; + + case 0x57: /* LD D, A */ + gb->cpu_reg.de.bytes.d = gb->cpu_reg.a; + break; + + case 0x58: /* LD E, B */ + gb->cpu_reg.de.bytes.e = gb->cpu_reg.bc.bytes.b; + break; + + case 0x59: /* LD E, C */ + gb->cpu_reg.de.bytes.e = gb->cpu_reg.bc.bytes.c; + break; + + case 0x5A: /* LD E, D */ + gb->cpu_reg.de.bytes.e = gb->cpu_reg.de.bytes.d; + break; + + case 0x5B: /* LD E, E */ + break; + + case 0x5C: /* LD E, H */ + gb->cpu_reg.de.bytes.e = gb->cpu_reg.hl.bytes.h; + break; + + case 0x5D: /* LD E, L */ + gb->cpu_reg.de.bytes.e = gb->cpu_reg.hl.bytes.l; + break; + + case 0x5E: /* LD E, (HL) */ + gb->cpu_reg.de.bytes.e = __gb_read(gb, gb->cpu_reg.hl.reg); + break; + + case 0x5F: /* LD E, A */ + gb->cpu_reg.de.bytes.e = gb->cpu_reg.a; + break; + + case 0x60: /* LD H, B */ + gb->cpu_reg.hl.bytes.h = gb->cpu_reg.bc.bytes.b; + break; + + case 0x61: /* LD H, C */ + gb->cpu_reg.hl.bytes.h = gb->cpu_reg.bc.bytes.c; + break; + + case 0x62: /* LD H, D */ + gb->cpu_reg.hl.bytes.h = gb->cpu_reg.de.bytes.d; + break; + + case 0x63: /* LD H, E */ + gb->cpu_reg.hl.bytes.h = gb->cpu_reg.de.bytes.e; + break; + + case 0x64: /* LD H, H */ + break; + + case 0x65: /* LD H, L */ + gb->cpu_reg.hl.bytes.h = gb->cpu_reg.hl.bytes.l; + break; + + case 0x66: /* LD H, (HL) */ + gb->cpu_reg.hl.bytes.h = __gb_read(gb, gb->cpu_reg.hl.reg); + break; + + case 0x67: /* LD H, A */ + gb->cpu_reg.hl.bytes.h = gb->cpu_reg.a; + break; + + case 0x68: /* LD L, B */ + gb->cpu_reg.hl.bytes.l = gb->cpu_reg.bc.bytes.b; + break; + + case 0x69: /* LD L, C */ + gb->cpu_reg.hl.bytes.l = gb->cpu_reg.bc.bytes.c; + break; + + case 0x6A: /* LD L, D */ + gb->cpu_reg.hl.bytes.l = gb->cpu_reg.de.bytes.d; + break; + + case 0x6B: /* LD L, E */ + gb->cpu_reg.hl.bytes.l = gb->cpu_reg.de.bytes.e; + break; + + case 0x6C: /* LD L, H */ + gb->cpu_reg.hl.bytes.l = gb->cpu_reg.hl.bytes.h; + break; + + case 0x6D: /* LD L, L */ + break; + + case 0x6E: /* LD L, (HL) */ + gb->cpu_reg.hl.bytes.l = __gb_read(gb, gb->cpu_reg.hl.reg); + break; + + case 0x6F: /* LD L, A */ + gb->cpu_reg.hl.bytes.l = gb->cpu_reg.a; + break; + + case 0x70: /* LD (HL), B */ + __gb_write(gb, gb->cpu_reg.hl.reg, gb->cpu_reg.bc.bytes.b); + break; + + case 0x71: /* LD (HL), C */ + __gb_write(gb, gb->cpu_reg.hl.reg, gb->cpu_reg.bc.bytes.c); + break; + + case 0x72: /* LD (HL), D */ + __gb_write(gb, gb->cpu_reg.hl.reg, gb->cpu_reg.de.bytes.d); + break; + + case 0x73: /* LD (HL), E */ + __gb_write(gb, gb->cpu_reg.hl.reg, gb->cpu_reg.de.bytes.e); + break; + + case 0x74: /* LD (HL), H */ + __gb_write(gb, gb->cpu_reg.hl.reg, gb->cpu_reg.hl.bytes.h); + break; + + case 0x75: /* LD (HL), L */ + __gb_write(gb, gb->cpu_reg.hl.reg, gb->cpu_reg.hl.bytes.l); + break; + + case 0x76: /* HALT */ + { + int_fast16_t halt_cycles = INT_FAST16_MAX; + + /* TODO: Emulate HALT bug? */ + gb->gb_halt = true; + + if(gb->hram_io[IO_SC] & SERIAL_SC_TX_START) + { + int serial_cycles = SERIAL_CYCLES - + gb->counter.serial_count; + + if(serial_cycles < halt_cycles) + halt_cycles = serial_cycles; + } + + if(gb->hram_io[IO_TAC] & IO_TAC_ENABLE_MASK) + { + int tac_cycles = TAC_CYCLES[gb->hram_io[IO_TAC] & IO_TAC_RATE_MASK] - + gb->counter.tima_count; + + if(tac_cycles < halt_cycles) + halt_cycles = tac_cycles; + } + + if((gb->hram_io[IO_LCDC] & LCDC_ENABLE)) + { + int lcd_cycles; + + /* If LCD is in HBlank, calculate the number of cycles + * until the end of HBlank and the start of mode 2 or + * mode 1. */ + if((gb->hram_io[IO_STAT] & STAT_MODE) == IO_STAT_MODE_HBLANK) + { + lcd_cycles = LCD_MODE0_HBLANK_MAX_DRUATION - gb->counter.lcd_count; + } + else if((gb->hram_io[IO_STAT] & STAT_MODE) == IO_STAT_MODE_OAM_SCAN) + { + lcd_cycles = LCD_MODE3_LCD_DRAW_MIN_DURATION - gb->counter.lcd_count; + } + else if((gb->hram_io[IO_STAT] & STAT_MODE) == IO_STAT_MODE_LCD_DRAW) + { + lcd_cycles = LCD_MODE0_HBLANK_MAX_DRUATION - gb->counter.lcd_count; + } + else + { + /* VBlank */ + lcd_cycles = LCD_LINE_CYCLES - gb->counter.lcd_count; + } + + if(lcd_cycles < halt_cycles) + halt_cycles = lcd_cycles; + } + + /* Some halt cycles may already be very high, so make sure we + * don't underflow here. */ + if(halt_cycles <= 0) + halt_cycles = 4; + + inst_cycles = (uint_fast16_t)halt_cycles; + break; + } + + case 0x77: /* LD (HL), A */ + __gb_write(gb, gb->cpu_reg.hl.reg, gb->cpu_reg.a); + break; + + case 0x78: /* LD A, B */ + gb->cpu_reg.a = gb->cpu_reg.bc.bytes.b; + break; + + case 0x79: /* LD A, C */ + gb->cpu_reg.a = gb->cpu_reg.bc.bytes.c; + break; + + case 0x7A: /* LD A, D */ + gb->cpu_reg.a = gb->cpu_reg.de.bytes.d; + break; + + case 0x7B: /* LD A, E */ + gb->cpu_reg.a = gb->cpu_reg.de.bytes.e; + break; + + case 0x7C: /* LD A, H */ + gb->cpu_reg.a = gb->cpu_reg.hl.bytes.h; + break; + + case 0x7D: /* LD A, L */ + gb->cpu_reg.a = gb->cpu_reg.hl.bytes.l; + break; + + case 0x7E: /* LD A, (HL) */ + gb->cpu_reg.a = __gb_read(gb, gb->cpu_reg.hl.reg); + break; + + case 0x7F: /* LD A, A */ + break; + + case 0x80: /* ADD A, B */ + PGB_INSTR_ADC_R8(gb->cpu_reg.bc.bytes.b, 0); + break; + + case 0x81: /* ADD A, C */ + PGB_INSTR_ADC_R8(gb->cpu_reg.bc.bytes.c, 0); + break; + + case 0x82: /* ADD A, D */ + PGB_INSTR_ADC_R8(gb->cpu_reg.de.bytes.d, 0); + break; + + case 0x83: /* ADD A, E */ + PGB_INSTR_ADC_R8(gb->cpu_reg.de.bytes.e, 0); + break; + + case 0x84: /* ADD A, H */ + PGB_INSTR_ADC_R8(gb->cpu_reg.hl.bytes.h, 0); + break; + + case 0x85: /* ADD A, L */ + PGB_INSTR_ADC_R8(gb->cpu_reg.hl.bytes.l, 0); + break; + + case 0x86: /* ADD A, (HL) */ + PGB_INSTR_ADC_R8(__gb_read(gb, gb->cpu_reg.hl.reg), 0); + break; + + case 0x87: /* ADD A, A */ + PGB_INSTR_ADC_R8(gb->cpu_reg.a, 0); + break; + + case 0x88: /* ADC A, B */ + PGB_INSTR_ADC_R8(gb->cpu_reg.bc.bytes.b, gb->cpu_reg.f.f_bits.c); + break; + + case 0x89: /* ADC A, C */ + PGB_INSTR_ADC_R8(gb->cpu_reg.bc.bytes.c, gb->cpu_reg.f.f_bits.c); + break; + + case 0x8A: /* ADC A, D */ + PGB_INSTR_ADC_R8(gb->cpu_reg.de.bytes.d, gb->cpu_reg.f.f_bits.c); + break; + + case 0x8B: /* ADC A, E */ + PGB_INSTR_ADC_R8(gb->cpu_reg.de.bytes.e, gb->cpu_reg.f.f_bits.c); + break; + + case 0x8C: /* ADC A, H */ + PGB_INSTR_ADC_R8(gb->cpu_reg.hl.bytes.h, gb->cpu_reg.f.f_bits.c); + break; + + case 0x8D: /* ADC A, L */ + PGB_INSTR_ADC_R8(gb->cpu_reg.hl.bytes.l, gb->cpu_reg.f.f_bits.c); + break; + + case 0x8E: /* ADC A, (HL) */ + PGB_INSTR_ADC_R8(__gb_read(gb, gb->cpu_reg.hl.reg), gb->cpu_reg.f.f_bits.c); + break; + + case 0x8F: /* ADC A, A */ + PGB_INSTR_ADC_R8(gb->cpu_reg.a, gb->cpu_reg.f.f_bits.c); + break; + + case 0x90: /* SUB B */ + PGB_INSTR_SBC_R8(gb->cpu_reg.bc.bytes.b, 0); + break; + + case 0x91: /* SUB C */ + PGB_INSTR_SBC_R8(gb->cpu_reg.bc.bytes.c, 0); + break; + + case 0x92: /* SUB D */ + PGB_INSTR_SBC_R8(gb->cpu_reg.de.bytes.d, 0); + break; + + case 0x93: /* SUB E */ + PGB_INSTR_SBC_R8(gb->cpu_reg.de.bytes.e, 0); + break; + + case 0x94: /* SUB H */ + PGB_INSTR_SBC_R8(gb->cpu_reg.hl.bytes.h, 0); + break; + + case 0x95: /* SUB L */ + PGB_INSTR_SBC_R8(gb->cpu_reg.hl.bytes.l, 0); + break; + + case 0x96: /* SUB (HL) */ + PGB_INSTR_SBC_R8(__gb_read(gb, gb->cpu_reg.hl.reg), 0); + break; + + case 0x97: /* SUB A */ + gb->cpu_reg.a = 0; + gb->cpu_reg.f.reg = 0; + gb->cpu_reg.f.f_bits.z = 1; + gb->cpu_reg.f.f_bits.n = 1; + break; + + case 0x98: /* SBC A, B */ + PGB_INSTR_SBC_R8(gb->cpu_reg.bc.bytes.b, gb->cpu_reg.f.f_bits.c); + break; + + case 0x99: /* SBC A, C */ + PGB_INSTR_SBC_R8(gb->cpu_reg.bc.bytes.c, gb->cpu_reg.f.f_bits.c); + break; + + case 0x9A: /* SBC A, D */ + PGB_INSTR_SBC_R8(gb->cpu_reg.de.bytes.d, gb->cpu_reg.f.f_bits.c); + break; + + case 0x9B: /* SBC A, E */ + PGB_INSTR_SBC_R8(gb->cpu_reg.de.bytes.e, gb->cpu_reg.f.f_bits.c); + break; + + case 0x9C: /* SBC A, H */ + PGB_INSTR_SBC_R8(gb->cpu_reg.hl.bytes.h, gb->cpu_reg.f.f_bits.c); + break; + + case 0x9D: /* SBC A, L */ + PGB_INSTR_SBC_R8(gb->cpu_reg.hl.bytes.l, gb->cpu_reg.f.f_bits.c); + break; + + case 0x9E: /* SBC A, (HL) */ + PGB_INSTR_SBC_R8(__gb_read(gb, gb->cpu_reg.hl.reg), gb->cpu_reg.f.f_bits.c); + break; + + case 0x9F: /* SBC A, A */ + gb->cpu_reg.a = gb->cpu_reg.f.f_bits.c ? 0xFF : 0x00; + gb->cpu_reg.f.f_bits.z = !gb->cpu_reg.f.f_bits.c; + gb->cpu_reg.f.f_bits.n = 1; + gb->cpu_reg.f.f_bits.h = gb->cpu_reg.f.f_bits.c; + break; + + case 0xA0: /* AND B */ + PGB_INSTR_AND_R8(gb->cpu_reg.bc.bytes.b); + break; + + case 0xA1: /* AND C */ + PGB_INSTR_AND_R8(gb->cpu_reg.bc.bytes.c); + break; + + case 0xA2: /* AND D */ + PGB_INSTR_AND_R8(gb->cpu_reg.de.bytes.d); + break; + + case 0xA3: /* AND E */ + PGB_INSTR_AND_R8(gb->cpu_reg.de.bytes.e); + break; + + case 0xA4: /* AND H */ + PGB_INSTR_AND_R8(gb->cpu_reg.hl.bytes.h); + break; + + case 0xA5: /* AND L */ + PGB_INSTR_AND_R8(gb->cpu_reg.hl.bytes.l); + break; + + case 0xA6: /* AND (HL) */ + PGB_INSTR_AND_R8(__gb_read(gb, gb->cpu_reg.hl.reg)); + break; + + case 0xA7: /* AND A */ + PGB_INSTR_AND_R8(gb->cpu_reg.a); + break; + + case 0xA8: /* XOR B */ + PGB_INSTR_XOR_R8(gb->cpu_reg.bc.bytes.b); + break; + + case 0xA9: /* XOR C */ + PGB_INSTR_XOR_R8(gb->cpu_reg.bc.bytes.c); + break; + + case 0xAA: /* XOR D */ + PGB_INSTR_XOR_R8(gb->cpu_reg.de.bytes.d); + break; + + case 0xAB: /* XOR E */ + PGB_INSTR_XOR_R8(gb->cpu_reg.de.bytes.e); + break; + + case 0xAC: /* XOR H */ + PGB_INSTR_XOR_R8(gb->cpu_reg.hl.bytes.h); + break; + + case 0xAD: /* XOR L */ + PGB_INSTR_XOR_R8(gb->cpu_reg.hl.bytes.l); + break; + + case 0xAE: /* XOR (HL) */ + PGB_INSTR_XOR_R8(__gb_read(gb, gb->cpu_reg.hl.reg)); + break; + + case 0xAF: /* XOR A */ + PGB_INSTR_XOR_R8(gb->cpu_reg.a); + break; + + case 0xB0: /* OR B */ + PGB_INSTR_OR_R8(gb->cpu_reg.bc.bytes.b); + break; + + case 0xB1: /* OR C */ + PGB_INSTR_OR_R8(gb->cpu_reg.bc.bytes.c); + break; + + case 0xB2: /* OR D */ + PGB_INSTR_OR_R8(gb->cpu_reg.de.bytes.d); + break; + + case 0xB3: /* OR E */ + PGB_INSTR_OR_R8(gb->cpu_reg.de.bytes.e); + break; + + case 0xB4: /* OR H */ + PGB_INSTR_OR_R8(gb->cpu_reg.hl.bytes.h); + break; + + case 0xB5: /* OR L */ + PGB_INSTR_OR_R8(gb->cpu_reg.hl.bytes.l); + break; + + case 0xB6: /* OR (HL) */ + PGB_INSTR_OR_R8(__gb_read(gb, gb->cpu_reg.hl.reg)); + break; + + case 0xB7: /* OR A */ + PGB_INSTR_OR_R8(gb->cpu_reg.a); + break; + + case 0xB8: /* CP B */ + PGB_INSTR_CP_R8(gb->cpu_reg.bc.bytes.b); + break; + + case 0xB9: /* CP C */ + PGB_INSTR_CP_R8(gb->cpu_reg.bc.bytes.c); + break; + + case 0xBA: /* CP D */ + PGB_INSTR_CP_R8(gb->cpu_reg.de.bytes.d); + break; + + case 0xBB: /* CP E */ + PGB_INSTR_CP_R8(gb->cpu_reg.de.bytes.e); + break; + + case 0xBC: /* CP H */ + PGB_INSTR_CP_R8(gb->cpu_reg.hl.bytes.h); + break; + + case 0xBD: /* CP L */ + PGB_INSTR_CP_R8(gb->cpu_reg.hl.bytes.l); + break; + + case 0xBE: /* CP (HL) */ + PGB_INSTR_CP_R8(__gb_read(gb, gb->cpu_reg.hl.reg)); + break; + + case 0xBF: /* CP A */ + gb->cpu_reg.f.reg = 0; + gb->cpu_reg.f.f_bits.z = 1; + gb->cpu_reg.f.f_bits.n = 1; + break; + + case 0xC0: /* RET NZ */ + if(!gb->cpu_reg.f.f_bits.z) + { + gb->cpu_reg.pc.bytes.c = __gb_read(gb, gb->cpu_reg.sp.reg++); + gb->cpu_reg.pc.bytes.p = __gb_read(gb, gb->cpu_reg.sp.reg++); + inst_cycles += 12; + } + + break; + + case 0xC1: /* POP BC */ + gb->cpu_reg.bc.bytes.c = __gb_read(gb, gb->cpu_reg.sp.reg++); + gb->cpu_reg.bc.bytes.b = __gb_read(gb, gb->cpu_reg.sp.reg++); + break; + + case 0xC2: /* JP NZ, imm */ + if(!gb->cpu_reg.f.f_bits.z) + { + uint8_t p, c; + c = __gb_read(gb, gb->cpu_reg.pc.reg++); + p = __gb_read(gb, gb->cpu_reg.pc.reg); + gb->cpu_reg.pc.bytes.c = c; + gb->cpu_reg.pc.bytes.p = p; + inst_cycles += 4; + } + else + gb->cpu_reg.pc.reg += 2; + + break; + + case 0xC3: /* JP imm */ + { + uint8_t p, c; + c = __gb_read(gb, gb->cpu_reg.pc.reg++); + p = __gb_read(gb, gb->cpu_reg.pc.reg); + gb->cpu_reg.pc.bytes.c = c; + gb->cpu_reg.pc.bytes.p = p; + break; + } + + case 0xC4: /* CALL NZ imm */ + if(!gb->cpu_reg.f.f_bits.z) + { + uint8_t p, c; + c = __gb_read(gb, gb->cpu_reg.pc.reg++); + p = __gb_read(gb, gb->cpu_reg.pc.reg++); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.p); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.c); + gb->cpu_reg.pc.bytes.c = c; + gb->cpu_reg.pc.bytes.p = p; + inst_cycles += 12; + } + else + gb->cpu_reg.pc.reg += 2; + + break; + + case 0xC5: /* PUSH BC */ + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.bc.bytes.b); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.bc.bytes.c); + break; + + case 0xC6: /* ADD A, imm */ + { + uint8_t val = __gb_read(gb, gb->cpu_reg.pc.reg++); + PGB_INSTR_ADC_R8(val, 0); + break; + } + + case 0xC7: /* RST 0x0000 */ + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.p); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.c); + gb->cpu_reg.pc.reg = 0x0000; + break; + + case 0xC8: /* RET Z */ + if(gb->cpu_reg.f.f_bits.z) + { + gb->cpu_reg.pc.bytes.c = __gb_read(gb, gb->cpu_reg.sp.reg++); + gb->cpu_reg.pc.bytes.p = __gb_read(gb, gb->cpu_reg.sp.reg++); + inst_cycles += 12; + } + break; + + case 0xC9: /* RET */ + { + gb->cpu_reg.pc.bytes.c = __gb_read(gb, gb->cpu_reg.sp.reg++); + gb->cpu_reg.pc.bytes.p = __gb_read(gb, gb->cpu_reg.sp.reg++); + break; + } + + case 0xCA: /* JP Z, imm */ + if(gb->cpu_reg.f.f_bits.z) + { + uint8_t p, c; + c = __gb_read(gb, gb->cpu_reg.pc.reg++); + p = __gb_read(gb, gb->cpu_reg.pc.reg); + gb->cpu_reg.pc.bytes.c = c; + gb->cpu_reg.pc.bytes.p = p; + inst_cycles += 4; + } + else + gb->cpu_reg.pc.reg += 2; + + break; + + case 0xCB: /* CB INST */ + inst_cycles = __gb_execute_cb(gb); + break; + + case 0xCC: /* CALL Z, imm */ + if(gb->cpu_reg.f.f_bits.z) + { + uint8_t p, c; + c = __gb_read(gb, gb->cpu_reg.pc.reg++); + p = __gb_read(gb, gb->cpu_reg.pc.reg++); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.p); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.c); + gb->cpu_reg.pc.bytes.c = c; + gb->cpu_reg.pc.bytes.p = p; + inst_cycles += 12; + } + else + gb->cpu_reg.pc.reg += 2; + + break; + + case 0xCD: /* CALL imm */ + { + uint8_t p, c; + c = __gb_read(gb, gb->cpu_reg.pc.reg++); + p = __gb_read(gb, gb->cpu_reg.pc.reg++); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.p); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.c); + gb->cpu_reg.pc.bytes.c = c; + gb->cpu_reg.pc.bytes.p = p; + } + break; + + case 0xCE: /* ADC A, imm */ + { + uint8_t val = __gb_read(gb, gb->cpu_reg.pc.reg++); + PGB_INSTR_ADC_R8(val, gb->cpu_reg.f.f_bits.c); + break; + } + + case 0xCF: /* RST 0x0008 */ + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.p); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.c); + gb->cpu_reg.pc.reg = 0x0008; + break; + + case 0xD0: /* RET NC */ + if(!gb->cpu_reg.f.f_bits.c) + { + gb->cpu_reg.pc.bytes.c = __gb_read(gb, gb->cpu_reg.sp.reg++); + gb->cpu_reg.pc.bytes.p = __gb_read(gb, gb->cpu_reg.sp.reg++); + inst_cycles += 12; + } + + break; + + case 0xD1: /* POP DE */ + gb->cpu_reg.de.bytes.e = __gb_read(gb, gb->cpu_reg.sp.reg++); + gb->cpu_reg.de.bytes.d = __gb_read(gb, gb->cpu_reg.sp.reg++); + break; + + case 0xD2: /* JP NC, imm */ + if(!gb->cpu_reg.f.f_bits.c) + { + uint8_t p, c; + c = __gb_read(gb, gb->cpu_reg.pc.reg++); + p = __gb_read(gb, gb->cpu_reg.pc.reg); + gb->cpu_reg.pc.bytes.c = c; + gb->cpu_reg.pc.bytes.p = p; + inst_cycles += 4; + } + else + gb->cpu_reg.pc.reg += 2; + + break; + + case 0xD4: /* CALL NC, imm */ + if(!gb->cpu_reg.f.f_bits.c) + { + uint8_t p, c; + c = __gb_read(gb, gb->cpu_reg.pc.reg++); + p = __gb_read(gb, gb->cpu_reg.pc.reg++); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.p); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.c); + gb->cpu_reg.pc.bytes.c = c; + gb->cpu_reg.pc.bytes.p = p; + inst_cycles += 12; + } + else + gb->cpu_reg.pc.reg += 2; + + break; + + case 0xD5: /* PUSH DE */ + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.de.bytes.d); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.de.bytes.e); + break; + + case 0xD6: /* SUB imm */ + { + uint8_t val = __gb_read(gb, gb->cpu_reg.pc.reg++); + uint16_t temp = gb->cpu_reg.a - val; + gb->cpu_reg.f.f_bits.z = ((temp & 0xFF) == 0x00); + gb->cpu_reg.f.f_bits.n = 1; + gb->cpu_reg.f.f_bits.h = + (gb->cpu_reg.a ^ val ^ temp) & 0x10 ? 1 : 0; + gb->cpu_reg.f.f_bits.c = (temp & 0xFF00) ? 1 : 0; + gb->cpu_reg.a = (temp & 0xFF); + break; + } + + case 0xD7: /* RST 0x0010 */ + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.p); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.c); + gb->cpu_reg.pc.reg = 0x0010; + break; + + case 0xD8: /* RET C */ + if(gb->cpu_reg.f.f_bits.c) + { + gb->cpu_reg.pc.bytes.c = __gb_read(gb, gb->cpu_reg.sp.reg++); + gb->cpu_reg.pc.bytes.p = __gb_read(gb, gb->cpu_reg.sp.reg++); + inst_cycles += 12; + } + + break; + + case 0xD9: /* RETI */ + { + gb->cpu_reg.pc.bytes.c = __gb_read(gb, gb->cpu_reg.sp.reg++); + gb->cpu_reg.pc.bytes.p = __gb_read(gb, gb->cpu_reg.sp.reg++); + gb->gb_ime = true; + } + break; + + case 0xDA: /* JP C, imm */ + if(gb->cpu_reg.f.f_bits.c) + { + uint8_t p, c; + c = __gb_read(gb, gb->cpu_reg.pc.reg++); + p = __gb_read(gb, gb->cpu_reg.pc.reg); + gb->cpu_reg.pc.bytes.c = c; + gb->cpu_reg.pc.bytes.p = p; + inst_cycles += 4; + } + else + gb->cpu_reg.pc.reg += 2; + + break; + + case 0xDC: /* CALL C, imm */ + if(gb->cpu_reg.f.f_bits.c) + { + uint8_t p, c; + c = __gb_read(gb, gb->cpu_reg.pc.reg++); + p = __gb_read(gb, gb->cpu_reg.pc.reg++); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.p); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.c); + gb->cpu_reg.pc.bytes.c = c; + gb->cpu_reg.pc.bytes.p = p; + inst_cycles += 12; + } + else + gb->cpu_reg.pc.reg += 2; + + break; + + case 0xDE: /* SBC A, imm */ + { + uint8_t val = __gb_read(gb, gb->cpu_reg.pc.reg++); + PGB_INSTR_SBC_R8(val, gb->cpu_reg.f.f_bits.c); + break; + } + + case 0xDF: /* RST 0x0018 */ + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.p); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.c); + gb->cpu_reg.pc.reg = 0x0018; + break; + + case 0xE0: /* LD (0xFF00+imm), A */ + __gb_write(gb, 0xFF00 | __gb_read(gb, gb->cpu_reg.pc.reg++), + gb->cpu_reg.a); + break; + + case 0xE1: /* POP HL */ + gb->cpu_reg.hl.bytes.l = __gb_read(gb, gb->cpu_reg.sp.reg++); + gb->cpu_reg.hl.bytes.h = __gb_read(gb, gb->cpu_reg.sp.reg++); + break; + + case 0xE2: /* LD (C), A */ + __gb_write(gb, 0xFF00 | gb->cpu_reg.bc.bytes.c, gb->cpu_reg.a); + break; + + case 0xE5: /* PUSH HL */ + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.hl.bytes.h); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.hl.bytes.l); + break; + + case 0xE6: /* AND imm */ + { + uint8_t temp = __gb_read(gb, gb->cpu_reg.pc.reg++); + PGB_INSTR_AND_R8(temp); + break; + } + + case 0xE7: /* RST 0x0020 */ + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.p); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.c); + gb->cpu_reg.pc.reg = 0x0020; + break; + + case 0xE8: /* ADD SP, imm */ + { + int8_t offset = (int8_t) __gb_read(gb, gb->cpu_reg.pc.reg++); + gb->cpu_reg.f.reg = 0; + gb->cpu_reg.f.f_bits.h = ((gb->cpu_reg.sp.reg & 0xF) + (offset & 0xF) > 0xF) ? 1 : 0; + gb->cpu_reg.f.f_bits.c = ((gb->cpu_reg.sp.reg & 0xFF) + (offset & 0xFF) > 0xFF); + gb->cpu_reg.sp.reg += offset; + break; + } + + case 0xE9: /* JP (HL) */ + gb->cpu_reg.pc.reg = gb->cpu_reg.hl.reg; + break; + + case 0xEA: /* LD (imm), A */ + { + uint8_t h, l; + uint16_t addr; + l = __gb_read(gb, gb->cpu_reg.pc.reg++); + h = __gb_read(gb, gb->cpu_reg.pc.reg++); + addr = PEANUT_GB_U8_TO_U16(h, l); + __gb_write(gb, addr, gb->cpu_reg.a); + break; + } + + case 0xEE: /* XOR imm */ + PGB_INSTR_XOR_R8(__gb_read(gb, gb->cpu_reg.pc.reg++)); + break; + + case 0xEF: /* RST 0x0028 */ + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.p); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.c); + gb->cpu_reg.pc.reg = 0x0028; + break; + + case 0xF0: /* LD A, (0xFF00+imm) */ + gb->cpu_reg.a = + __gb_read(gb, 0xFF00 | __gb_read(gb, gb->cpu_reg.pc.reg++)); + break; + + case 0xF1: /* POP AF */ + { + uint8_t temp_8 = __gb_read(gb, gb->cpu_reg.sp.reg++); + gb->cpu_reg.f.f_bits.z = (temp_8 >> 7) & 1; + gb->cpu_reg.f.f_bits.n = (temp_8 >> 6) & 1; + gb->cpu_reg.f.f_bits.h = (temp_8 >> 5) & 1; + gb->cpu_reg.f.f_bits.c = (temp_8 >> 4) & 1; + gb->cpu_reg.a = __gb_read(gb, gb->cpu_reg.sp.reg++); + break; + } + + case 0xF2: /* LD A, (C) */ + gb->cpu_reg.a = __gb_read(gb, 0xFF00 | gb->cpu_reg.bc.bytes.c); + break; + + case 0xF3: /* DI */ + gb->gb_ime = false; + break; + + case 0xF5: /* PUSH AF */ + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.a); + __gb_write(gb, --gb->cpu_reg.sp.reg, + gb->cpu_reg.f.f_bits.z << 7 | gb->cpu_reg.f.f_bits.n << 6 | + gb->cpu_reg.f.f_bits.h << 5 | gb->cpu_reg.f.f_bits.c << 4); + break; + + case 0xF6: /* OR imm */ + PGB_INSTR_OR_R8(__gb_read(gb, gb->cpu_reg.pc.reg++)); + break; + + case 0xF7: /* PUSH AF */ + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.p); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.c); + gb->cpu_reg.pc.reg = 0x0030; + break; + + case 0xF8: /* LD HL, SP+/-imm */ + { + /* Taken from SameBoy, which is released under MIT Licence. */ + int8_t offset = (int8_t) __gb_read(gb, gb->cpu_reg.pc.reg++); + gb->cpu_reg.hl.reg = gb->cpu_reg.sp.reg + offset; + gb->cpu_reg.f.reg = 0; + gb->cpu_reg.f.f_bits.h = ((gb->cpu_reg.sp.reg & 0xF) + (offset & 0xF) > 0xF) ? 1 : 0; + gb->cpu_reg.f.f_bits.c = ((gb->cpu_reg.sp.reg & 0xFF) + (offset & 0xFF) > 0xFF) ? 1 : 0; + break; + } + + case 0xF9: /* LD SP, HL */ + gb->cpu_reg.sp.reg = gb->cpu_reg.hl.reg; + break; + + case 0xFA: /* LD A, (imm) */ + { + uint8_t h, l; + uint16_t addr; + l = __gb_read(gb, gb->cpu_reg.pc.reg++); + h = __gb_read(gb, gb->cpu_reg.pc.reg++); + addr = PEANUT_GB_U8_TO_U16(h, l); + gb->cpu_reg.a = __gb_read(gb, addr); + break; + } + + case 0xFB: /* EI */ + gb->gb_ime = true; + break; + + case 0xFE: /* CP imm */ + { + uint8_t val = __gb_read(gb, gb->cpu_reg.pc.reg++); + PGB_INSTR_CP_R8(val); + break; + } + + case 0xFF: /* RST 0x0038 */ + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.p); + __gb_write(gb, --gb->cpu_reg.sp.reg, gb->cpu_reg.pc.bytes.c); + gb->cpu_reg.pc.reg = 0x0038; + break; + + default: + /* Return address where invalid opcode that was read. */ + (gb->gb_error)(gb, GB_INVALID_OPCODE, gb->cpu_reg.pc.reg - 1); + PGB_UNREACHABLE(); + } + + do + { + /* DIV register timing */ + gb->counter.div_count += inst_cycles; + while(gb->counter.div_count >= DIV_CYCLES) + { + gb->hram_io[IO_DIV]++; + gb->counter.div_count -= DIV_CYCLES; + } + + /* Check for RTC tick. */ + if(gb->mbc == 3 && (gb->rtc_real.reg.high & 0x40) == 0) + { + gb->counter.rtc_count += inst_cycles; + while(PGB_UNLIKELY(gb->counter.rtc_count >= RTC_CYCLES)) + { + gb->counter.rtc_count -= RTC_CYCLES; + + /* Detect invalid rollover. */ + if(PGB_UNLIKELY(gb->rtc_real.reg.sec == 63)) + { + gb->rtc_real.reg.sec = 0; + continue; + } + + if(++gb->rtc_real.reg.sec != 60) + continue; + + gb->rtc_real.reg.sec = 0; + if(gb->rtc_real.reg.min == 63) + { + gb->rtc_real.reg.min = 0; + continue; + } + if(++gb->rtc_real.reg.min != 60) + continue; + + gb->rtc_real.reg.min = 0; + if(gb->rtc_real.reg.hour == 31) + { + gb->rtc_real.reg.hour = 0; + continue; + } + if(++gb->rtc_real.reg.hour != 24) + continue; + + gb->rtc_real.reg.hour = 0; + if(++gb->rtc_real.reg.yday != 0) + continue; + + if(gb->rtc_real.reg.high & 1) /* Bit 8 of days*/ + gb->rtc_real.reg.high |= 0x80; /* Overflow bit */ + + gb->rtc_real.reg.high ^= 1; + } + } + + /* Check serial transmission. */ + if(gb->hram_io[IO_SC] & SERIAL_SC_TX_START) + { + /* If new transfer, call TX function. */ + if(gb->counter.serial_count == 0 && + gb->gb_serial_tx != NULL) + (gb->gb_serial_tx)(gb, gb->hram_io[IO_SB]); + + gb->counter.serial_count += inst_cycles; + + /* If it's time to receive byte, call RX function. */ + if(gb->counter.serial_count >= SERIAL_CYCLES) + { + /* If RX can be done, do it. */ + /* If RX failed, do not change SB if using external + * clock, or set to 0xFF if using internal clock. */ + uint8_t rx; + + if(gb->gb_serial_rx != NULL && + (gb->gb_serial_rx(gb, &rx) == + GB_SERIAL_RX_SUCCESS)) + { + gb->hram_io[IO_SB] = rx; + + /* Inform game of serial TX/RX completion. */ + gb->hram_io[IO_SC] &= 0x01; + gb->hram_io[IO_IF] |= SERIAL_INTR; + } + else if(gb->hram_io[IO_SC] & SERIAL_SC_CLOCK_SRC) + { + /* If using internal clock, and console is not + * attached to any external peripheral, shifted + * bits are replaced with logic 1. */ + gb->hram_io[IO_SB] = 0xFF; + + /* Inform game of serial TX/RX completion. */ + gb->hram_io[IO_SC] &= 0x01; + gb->hram_io[IO_IF] |= SERIAL_INTR; + } + else + { + /* If using external clock, and console is not + * attached to any external peripheral, bits are + * not shifted, so SB is not modified. */ + } + + gb->counter.serial_count = 0; + } + } + + /* TIMA register timing */ + /* TODO: Change tac_enable to struct of TAC timer control bits. */ + if(gb->hram_io[IO_TAC] & IO_TAC_ENABLE_MASK) + { + gb->counter.tima_count += inst_cycles; + + while(gb->counter.tima_count >= + TAC_CYCLES[gb->hram_io[IO_TAC] & IO_TAC_RATE_MASK]) + { + gb->counter.tima_count -= + TAC_CYCLES[gb->hram_io[IO_TAC] & IO_TAC_RATE_MASK]; + + if(++gb->hram_io[IO_TIMA] == 0) + { + gb->hram_io[IO_IF] |= TIMER_INTR; + /* On overflow, set TMA to TIMA. */ + gb->hram_io[IO_TIMA] = gb->hram_io[IO_TMA]; + } + } + } + + /* If LCD is off, don't update LCD state or increase the LCD + * ticks. Instead, keep track of the amount of time that is + * being passed. */ + if(!(gb->hram_io[IO_LCDC] & LCDC_ENABLE)) + { + gb->counter.lcd_off_count += inst_cycles; + if(gb->counter.lcd_off_count >= LCD_FRAME_CYCLES) + { + gb->counter.lcd_off_count -= LCD_FRAME_CYCLES; + gb->gb_frame = true; + } + continue; + } + + /* LCD Timing */ + gb->counter.lcd_count += inst_cycles; + + /* New Scanline. HBlank -> VBlank or OAM Scan */ + if(gb->counter.lcd_count >= LCD_LINE_CYCLES) + { + gb->counter.lcd_count -= LCD_LINE_CYCLES; + + /* Next line */ + gb->hram_io[IO_LY] = gb->hram_io[IO_LY] + 1; + if (gb->hram_io[IO_LY] == LCD_VERT_LINES) + gb->hram_io[IO_LY] = 0; + + /* LYC Update */ + if(gb->hram_io[IO_LY] == gb->hram_io[IO_LYC]) + { + gb->hram_io[IO_STAT] |= STAT_LYC_COINC; + + if(gb->hram_io[IO_STAT] & STAT_LYC_INTR) + gb->hram_io[IO_IF] |= LCDC_INTR; + } + else + gb->hram_io[IO_STAT] &= 0xFB; + + /* Check if LCD should be in Mode 1 (VBLANK) state */ + if(gb->hram_io[IO_LY] == LCD_HEIGHT) + { + gb->hram_io[IO_STAT] = + (gb->hram_io[IO_STAT] & ~STAT_MODE) | IO_STAT_MODE_VBLANK; + gb->gb_frame = true; + gb->hram_io[IO_IF] |= VBLANK_INTR; + gb->lcd_blank = false; + + if(gb->hram_io[IO_STAT] & STAT_MODE_1_INTR) + gb->hram_io[IO_IF] |= LCDC_INTR; + +#if ENABLE_LCD + /* If frame skip is activated, check if we need to draw + * the frame or skip it. */ + if(gb->direct.frame_skip) + { + gb->display.frame_skip_count = + !gb->display.frame_skip_count; + } + + /* If interlaced is activated, change which lines get + * updated. Also, only update lines on frames that are + * actually drawn when frame skip is enabled. */ + if(gb->direct.interlace && + (!gb->direct.frame_skip || + gb->display.frame_skip_count)) + { + gb->display.interlace_count = + !gb->display.interlace_count; + } +#endif + /* If halted forever, then return on VBLANK. */ + if(gb->gb_halt && !gb->hram_io[IO_IE]) + break; + } + /* Start of normal Line (not in VBLANK) */ + else if(gb->hram_io[IO_LY] < LCD_HEIGHT) + { + if(gb->hram_io[IO_LY] == 0) + { + /* Clear Screen */ + gb->display.WY = gb->hram_io[IO_WY]; + gb->display.window_clear = 0; + } + + /* OAM Search occurs at the start of the line. */ + gb->hram_io[IO_STAT] = (gb->hram_io[IO_STAT] & ~STAT_MODE) | IO_STAT_MODE_OAM_SCAN; + gb->counter.lcd_count = 0; + + if(gb->hram_io[IO_STAT] & STAT_MODE_2_INTR) + gb->hram_io[IO_IF] |= LCDC_INTR; + + /* If halted immediately jump to next LCD mode. + * From OAM Search to LCD Draw. */ + //if(gb->counter.lcd_count < LCD_MODE2_OAM_SCAN_END) + // inst_cycles = LCD_MODE2_OAM_SCAN_END - gb->counter.lcd_count; + inst_cycles = LCD_MODE2_OAM_SCAN_DURATION; + } + } + /* Go from Mode 3 (LCD Draw) to Mode 0 (HBLANK). */ + else if((gb->hram_io[IO_STAT] & STAT_MODE) == IO_STAT_MODE_LCD_DRAW && + gb->counter.lcd_count >= LCD_MODE3_LCD_DRAW_END) + { + gb->hram_io[IO_STAT] = (gb->hram_io[IO_STAT] & ~STAT_MODE) | IO_STAT_MODE_HBLANK; + + if(gb->hram_io[IO_STAT] & STAT_MODE_0_INTR) + gb->hram_io[IO_IF] |= LCDC_INTR; + + /* If halted immediately, jump from OAM Scan to LCD Draw. */ + if (gb->counter.lcd_count < LCD_MODE0_HBLANK_MAX_DRUATION) + inst_cycles = LCD_MODE0_HBLANK_MAX_DRUATION - gb->counter.lcd_count; + } + /* Go from Mode 2 (OAM Scan) to Mode 3 (LCD Draw). */ + else if((gb->hram_io[IO_STAT] & STAT_MODE) == IO_STAT_MODE_OAM_SCAN && + gb->counter.lcd_count >= LCD_MODE2_OAM_SCAN_END) + { + gb->hram_io[IO_STAT] = (gb->hram_io[IO_STAT] & ~STAT_MODE) | IO_STAT_MODE_LCD_DRAW; +#if ENABLE_LCD + if(!gb->lcd_blank) + __gb_draw_line(gb); +#endif + /* If halted immediately jump to next LCD mode. */ + if (gb->counter.lcd_count < LCD_MODE3_LCD_DRAW_MIN_DURATION) + inst_cycles = LCD_MODE3_LCD_DRAW_MIN_DURATION - gb->counter.lcd_count; + } + } while(gb->gb_halt && (gb->hram_io[IO_IF] & gb->hram_io[IO_IE]) == 0); + /* If halted, loop until an interrupt occurs. */ +} + +void gb_run_frame(struct gb_s *gb) +{ + gb->gb_frame = false; + + while(!gb->gb_frame) + __gb_step_cpu(gb); +} + +int gb_get_save_size_s(struct gb_s *gb, size_t *ram_size) +{ + const uint_fast16_t ram_size_location = 0x0149; + const uint_fast32_t ram_sizes[] = + { + /* 0, 2KiB, 8KiB, 32KiB, 128KiB, 64KiB */ + 0x00, 0x800, 0x2000, 0x8000, 0x20000, 0x10000 + }; + uint8_t ram_size_code = gb->gb_rom_read(gb, ram_size_location); + + /* MBC2 always has 512 half-bytes of cart RAM. + * This assumes that only the lower nibble of each byte is used; the + * nibbles are not packed. */ + if(gb->mbc == 2) + { + *ram_size = 0x200; + return 0; + } + + /* Return -1 on invalid or unsupported RAM size. */ + if(ram_size_code >= PEANUT_GB_ARRAYSIZE(ram_sizes)) + return -1; + + *ram_size = ram_sizes[ram_size_code]; + return 0; +} + +PGB_DEPRECATED("Does not return error code. Use gb_get_save_size_s instead.") +uint_fast32_t gb_get_save_size(struct gb_s *gb) +{ + const uint_fast16_t ram_size_location = 0x0149; + const uint_fast32_t ram_sizes[] = + { + /* 0, 2KiB, 8KiB, 32KiB, 128KiB, 64KiB */ + 0x00, 0x800, 0x2000, 0x8000, 0x20000, 0x10000 + }; + uint8_t ram_size_code = gb->gb_rom_read(gb, ram_size_location); + + /* MBC2 always has 512 half-bytes of cart RAM. + * This assumes that only the lower nibble of each byte is used; the + * nibbles are not packed. */ + if(gb->mbc == 2) + return 0x200; + + /* Return 0 on invalid or unsupported RAM size. */ + if(ram_size_code >= PEANUT_GB_ARRAYSIZE(ram_sizes)) + return 0; + + return ram_sizes[ram_size_code]; +} + +void gb_init_serial(struct gb_s *gb, + void (*gb_serial_tx)(struct gb_s*, const uint8_t), + enum gb_serial_rx_ret_e (*gb_serial_rx)(struct gb_s*, + uint8_t*)) +{ + gb->gb_serial_tx = gb_serial_tx; + gb->gb_serial_rx = gb_serial_rx; +} + +uint8_t gb_colour_hash(struct gb_s *gb) +{ +#define ROM_TITLE_START_ADDR 0x0134 +#define ROM_TITLE_END_ADDR 0x0143 + + uint8_t x = 0; + uint16_t i; + + for(i = ROM_TITLE_START_ADDR; i <= ROM_TITLE_END_ADDR; i++) + x += gb->gb_rom_read(gb, i); + + return x; +} + +/** + * Resets the context, and initialises startup values for a DMG console. + */ +void gb_reset(struct gb_s *gb) +{ + gb->gb_halt = false; + gb->gb_ime = true; + + /* Initialise MBC values. */ + gb->selected_rom_bank = 1; + gb->cart_ram_bank = 0; + gb->enable_cart_ram = 0; + gb->cart_mode_select = 0; + + /* Use values as though the boot ROM was already executed. */ + if(gb->gb_bootrom_read == NULL) + { + uint8_t hdr_chk; + hdr_chk = gb->gb_rom_read(gb, ROM_HEADER_CHECKSUM_LOC) != 0; + + gb->cpu_reg.a = 0x01; + gb->cpu_reg.f.f_bits.z = 1; + gb->cpu_reg.f.f_bits.n = 0; + gb->cpu_reg.f.f_bits.h = hdr_chk; + gb->cpu_reg.f.f_bits.c = hdr_chk; + gb->cpu_reg.bc.reg = 0x0013; + gb->cpu_reg.de.reg = 0x00D8; + gb->cpu_reg.hl.reg = 0x014D; + gb->cpu_reg.sp.reg = 0xFFFE; + gb->cpu_reg.pc.reg = 0x0100; + + gb->hram_io[IO_DIV ] = 0xAB; + gb->hram_io[IO_LCDC] = 0x91; + gb->hram_io[IO_STAT] = 0x85; + gb->hram_io[IO_BOOT] = 0x01; + + __gb_write(gb, 0xFF26, 0xF1); + + memset(gb->vram, 0x00, VRAM_SIZE); + } + else + { + /* Set value as though the console was just switched on. + * CPU registers are uninitialised. */ + gb->cpu_reg.pc.reg = 0x0000; + gb->hram_io[IO_DIV ] = 0x00; + gb->hram_io[IO_LCDC] = 0x00; + gb->hram_io[IO_STAT] = 0x84; + gb->hram_io[IO_BOOT] = 0x00; + } + + gb->counter.lcd_count = 0; + gb->counter.div_count = 0; + gb->counter.tima_count = 0; + gb->counter.serial_count = 0; + gb->counter.rtc_count = 0; + gb->counter.lcd_off_count = 0; + + gb->direct.joypad = 0xFF; + gb->hram_io[IO_JOYP] = 0xCF; + gb->hram_io[IO_SB ] = 0x00; + gb->hram_io[IO_SC ] = 0x7E; + /* DIV */ + gb->hram_io[IO_TIMA] = 0x00; + gb->hram_io[IO_TMA ] = 0x00; + gb->hram_io[IO_TAC ] = 0xF8; + gb->hram_io[IO_IF ] = 0xE1; + + /* LCDC */ + /* STAT */ + gb->hram_io[IO_SCY ] = 0x00; + gb->hram_io[IO_SCX ] = 0x00; + gb->hram_io[IO_LY ] = 0x00; + gb->hram_io[IO_LYC ] = 0x00; + __gb_write(gb, 0xFF47, 0xFC); // BGP + __gb_write(gb, 0xFF48, 0xFF); // OBJP0 + __gb_write(gb, 0xFF49, 0xFF); // OBJP1 + gb->hram_io[IO_WY] = 0x00; + gb->hram_io[IO_WX] = 0x00; + gb->hram_io[IO_IE] = 0x00; + gb->hram_io[IO_IF] = 0xE1; +} + +enum gb_init_error_e gb_init(struct gb_s *gb, + uint8_t (*gb_rom_read)(struct gb_s*, const uint_fast32_t), + uint8_t (*gb_cart_ram_read)(struct gb_s*, const uint_fast32_t), + void (*gb_cart_ram_write)(struct gb_s*, const uint_fast32_t, const uint8_t), + void (*gb_error)(struct gb_s*, const enum gb_error_e, const uint16_t), + void *priv) +{ + const uint16_t mbc_location = 0x0147; + const uint16_t bank_count_location = 0x0148; + const uint16_t ram_size_location = 0x0149; + /** + * Table for cartridge type (MBC). -1 if invalid. + * TODO: MMM01 is untested. + * TODO: MBC6 is untested. + * TODO: MBC7 is unsupported. + * TODO: POCKET CAMERA is unsupported. + * TODO: BANDAI TAMA5 is unsupported. + * TODO: HuC3 is unsupported. + * TODO: HuC1 is unsupported. + **/ + const int8_t cart_mbc[] = + { + 0, 1, 1, 1, -1, 2, 2, -1, 0, 0, -1, 0, 0, 0, -1, 3, + 3, 3, 3, 3, -1, -1, -1, -1, -1, 5, 5, 5, 5, 5, 5, -1 + }; + /* Whether cart has RAM. */ + const uint8_t cart_ram[] = + { + 0, 0, 1, 1, 0, 1, 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, + 1, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0 + }; + /* How large the ROM is in banks of 16 KiB. */ + const uint16_t num_rom_banks_mask[] = + { + 2, 4, 8, 16, 32, 64, 128, 256, 512 + }; + /* How large the cart RAM is in banks of 8 KiB. Code $01 is unused, but + * some early homebrew ROMs supposedly may use this value. */ + const uint8_t num_ram_banks[] = { 0, 1, 1, 4, 16, 8 }; + + gb->gb_rom_read = gb_rom_read; + gb->gb_cart_ram_read = gb_cart_ram_read; + gb->gb_cart_ram_write = gb_cart_ram_write; + gb->gb_error = gb_error; + gb->direct.priv = priv; + + /* Initialise serial transfer function to NULL. If the front-end does + * not provide serial support, Peanut-GB will emulate no cable connected + * automatically. */ + gb->gb_serial_tx = NULL; + gb->gb_serial_rx = NULL; + + gb->gb_bootrom_read = NULL; + + /* Check valid ROM using checksum value. */ + { + uint8_t x = 0; + uint16_t i; + + for(i = 0x0134; i <= 0x014C; i++) + x = x - gb->gb_rom_read(gb, i) - 1; + + if(x != gb->gb_rom_read(gb, ROM_HEADER_CHECKSUM_LOC)) + return GB_INIT_INVALID_CHECKSUM; + } + + /* Check if cartridge type is supported, and set MBC type. */ + { + const uint8_t mbc_value = gb->gb_rom_read(gb, mbc_location); + + if(mbc_value > sizeof(cart_mbc) - 1 || + (gb->mbc = cart_mbc[mbc_value]) == -1) + return GB_INIT_CARTRIDGE_UNSUPPORTED; + } + + gb->num_rom_banks_mask = num_rom_banks_mask[gb->gb_rom_read(gb, bank_count_location)] - 1; + gb->cart_ram = cart_ram[gb->gb_rom_read(gb, mbc_location)]; + gb->num_ram_banks = num_ram_banks[gb->gb_rom_read(gb, ram_size_location)]; + + /* If the ROM says that it support RAM, but has 0 RAM banks, then + * disable RAM reads from the cartridge. */ + if(gb->cart_ram == 0 || gb->num_ram_banks == 0) + { + gb->cart_ram = 0; + gb->num_ram_banks = 0; + } + + /* If MBC3 and number of ROM or RAM banks are larger than 128 or 8, + * respectively, then select MBC3O mode. */ + if(gb->mbc == 3) + gb->cart_is_mbc3O = gb->num_rom_banks_mask > 128 || gb->num_ram_banks > 4; + + /* Note that MBC2 will appear to have no RAM banks, but it actually + * always has 512 half-bytes of RAM. Hence, gb->num_ram_banks must be + * ignored for MBC2. */ + + gb->lcd_blank = false; + gb->display.lcd_draw_line = NULL; + + gb_reset(gb); + + return GB_INIT_NO_ERROR; +} + +const char* gb_get_rom_name(struct gb_s* gb, char *title_str) +{ + uint_fast16_t title_loc = 0x134; + /* End of title may be 0x13E for newer games. */ + const uint_fast16_t title_end = 0x143; + const char* title_start = title_str; + + for(; title_loc <= title_end; title_loc++) + { + const char title_char = gb->gb_rom_read(gb, title_loc); + + if(title_char >= ' ' && title_char <= '_') + { + *title_str = title_char; + title_str++; + } + else + break; + } + + *title_str = '\0'; + return title_start; +} + +#if ENABLE_LCD +void gb_init_lcd(struct gb_s *gb, + void (*lcd_draw_line)(struct gb_s *gb, + const uint8_t *pixels, + const uint_fast8_t line)) +{ + gb->display.lcd_draw_line = lcd_draw_line; + + gb->direct.interlace = false; + gb->display.interlace_count = false; + gb->direct.frame_skip = false; + gb->display.frame_skip_count = false; + + gb->display.window_clear = 0; + gb->display.WY = 0; + + return; +} +#endif + +void gb_set_bootrom(struct gb_s *gb, + uint8_t (*gb_bootrom_read)(struct gb_s*, const uint_fast16_t)) +{ + gb->gb_bootrom_read = gb_bootrom_read; +} + +/** + * Deprecated. Will be removed in the next major version. + */ +PGB_DEPRECATED("RTC is now ticked internally; this function has no effect") +void gb_tick_rtc(struct gb_s *gb) +{ + (void) gb; + return; +} + +void gb_set_rtc(struct gb_s *gb, const struct tm * const time) +{ + gb->rtc_real.bytes[0] = time->tm_sec; + gb->rtc_real.bytes[1] = time->tm_min; + gb->rtc_real.bytes[2] = time->tm_hour; + gb->rtc_real.bytes[3] = time->tm_yday & 0xFF; /* Low 8 bits of day counter. */ + gb->rtc_real.bytes[4] = time->tm_yday >> 8; /* High 1 bit of day counter. */ +} +#endif // PEANUT_GB_HEADER_ONLY + +/** Function prototypes: Required functions **/ +/** + * Initialises the emulator context to a known state. Call this before calling + * any other peanut-gb function. + * To reset the emulator, you can call gb_reset() instead. + * + * \param gb Allocated emulator context. Must not be NULL. + * \param gb_rom_read Pointer to function that reads ROM data. ROM banking is + * already handled by Peanut-GB. Must not be NULL. + * \param gb_cart_ram_read Pointer to function that reads Cart RAM. Must not be + * NULL. + * \param gb_cart_ram_write Pointer to function to writes to Cart RAM. Must not + * be NULL. + * \param gb_error Pointer to function that is called when an unrecoverable + * error occurs. Must not be NULL. Returning from this + * function is undefined and will result in SIGABRT. + * \param priv Private data that is stored within the emulator context. Set to + * NULL if unused. + * \returns 0 on success or an enum that describes the error. + */ +enum gb_init_error_e gb_init(struct gb_s *gb, + uint8_t (*gb_rom_read)(struct gb_s*, const uint_fast32_t), + uint8_t (*gb_cart_ram_read)(struct gb_s*, const uint_fast32_t), + void (*gb_cart_ram_write)(struct gb_s*, const uint_fast32_t, const uint8_t), + void (*gb_error)(struct gb_s*, const enum gb_error_e, const uint16_t), + void *priv); + +/** + * Executes the emulator and runs for the duration of time equal to one frame. + * + * \param An initialised emulator context. Must not be NULL. + */ +void gb_run_frame(struct gb_s *gb); + +/** + * Internal function used to step the CPU. Used mainly for testing. + * Use gb_run_frame() instead. + * + * \param An initialised emulator context. Must not be NULL. + */ +void __gb_step_cpu(struct gb_s *gb); + +/** Function prototypes: Optional Functions **/ +/** + * Reset the emulator, like turning the Game Boy off and on again. + * This function can be called at any time. + * + * \param An initialised emulator context. Must not be NULL. + */ +void gb_reset(struct gb_s *gb); + +/** + * Initialises the display context of the emulator. Only available when + * ENABLE_LCD is defined to a non-zero value. + * The pixel data sent to lcd_draw_line comes with both shade and layer data. + * The first two least significant bits are the shade data (black, dark, light, + * white). Bits 4 and 5 are layer data (OBJ0, OBJ1, BG), which can be used to + * add more colours to the game in the same way that the Game Boy Color does to + * older Game Boy games. + * This function can be called at any time. + * + * \param gb An initialised emulator context. Must not be NULL. + * \param lcd_draw_line Pointer to function that draws the 2-bit pixel data on the line + * "line". Must not be NULL. + */ +#if ENABLE_LCD +void gb_init_lcd(struct gb_s *gb, + void (*lcd_draw_line)(struct gb_s *gb, + const uint8_t *pixels, + const uint_fast8_t line)); +#endif + +/** + * Initialises the serial connection of the emulator. This function is optional, + * and if not called, the emulator will assume that no link cable is connected + * to the game. + * + * \param gb An initialised emulator context. Must not be NULL. + * \param gb_serial_tx Pointer to function that transmits a byte of data over + * the serial connection. Must not be NULL. + * \param gb_serial_rx Pointer to function that receives a byte of data over the + * serial connection. If no byte is received, + * return GB_SERIAL_RX_NO_CONNECTION. Must not be NULL. + */ +void gb_init_serial(struct gb_s *gb, + void (*gb_serial_tx)(struct gb_s*, const uint8_t), + enum gb_serial_rx_ret_e (*gb_serial_rx)(struct gb_s*, + uint8_t*)); + +/** + * Obtains the save size of the game (size of the Cart RAM). Required by the + * frontend to allocate enough memory for the Cart RAM. + * + * \param gb An initialised emulator context. Must not be NULL. + * \param ram_size Pointer to size_t variable that will be set to the size of + * the Cart RAM in bytes. Must not be NULL. + * If the Cart RAM is not battery backed, this will be set to 0. + * If the Cart RAM size is invalid or unknown, this will not be + * set. + * \returns 0 on success, or -1 if the RAM size is invalid or unknown. + */ +int gb_get_save_size_s(struct gb_s *gb, size_t *ram_size); + +/** + * Deprecated. Use gb_get_save_size_s() instead. + * Obtains the save size of the game (size of the Cart RAM). Required by the + * frontend to allocate enough memory for the Cart RAM. + * + * \param gb An initialised emulator context. Must not be NULL. + * \returns Size of the Cart RAM in bytes. 0 if Cartridge has not battery + * backed RAM. + * 0 is also returned on invalid or unknown RAM size. + */ +uint_fast32_t gb_get_save_size(struct gb_s *gb); + +/** + * Calculates and returns a hash of the game header in the same way the Game + * Boy Color does for colourising old Game Boy games. The frontend can use this + * hash to automatically set a colour palette. + * + * \param gb An initialised emulator context. Must not be NULL. + * \returns Hash of the game header. + */ +uint8_t gb_colour_hash(struct gb_s *gb); + +/** + * Returns the title of ROM. + * + * \param gb An initialised emulator context. Must not be NULL. + * \param title_str Allocated string at least 16 characters. + * \returns Pointer to start of string, null terminated. + */ +const char* gb_get_rom_name(struct gb_s* gb, char *title_str); + +/** + * Deprecated. Will be removed in the next major version. + * RTC is ticked internally and this function has no effect. + */ +void gb_tick_rtc(struct gb_s *gb); + +/** + * Set initial values in RTC. + * Should be called after gb_init(). + * + * \param gb An initialised emulator context. Must not be NULL. + * \param time Time structure with date and time. + */ +void gb_set_rtc(struct gb_s *gb, const struct tm * const time); + +/** + * Use boot ROM on reset. gb_reset() must be called for this to take affect. + * \param gb An initialised emulator context. Must not be NULL. + * \param gb_bootrom_read Function pointer to read boot ROM binary. + */ +void gb_set_bootrom(struct gb_s *gb, + uint8_t (*gb_bootrom_read)(struct gb_s*, const uint_fast16_t)); + +/* Undefine CPU Flag helper functions. */ +#undef PEANUT_GB_CPUFLAG_MASK_CARRY +#undef PEANUT_GB_CPUFLAG_MASK_HALFC +#undef PEANUT_GB_CPUFLAG_MASK_ARITH +#undef PEANUT_GB_CPUFLAG_MASK_ZERO +#undef PEANUT_GB_CPUFLAG_BIT_CARRY +#undef PEANUT_GB_CPUFLAG_BIT_HALFC +#undef PEANUT_GB_CPUFLAG_BIT_ARITH +#undef PEANUT_GB_CPUFLAG_BIT_ZERO +#undef PGB_SET_CARRY +#undef PGB_SET_HALFC +#undef PGB_SET_ARITH +#undef PGB_SET_ZERO +#undef PGB_GET_CARRY +#undef PGB_GET_HALFC +#undef PGB_GET_ARITH +#undef PGB_GET_ZERO +#endif //PEANUT_GB_H From e91d0dabbb1a39dc85a4b1a7a3438f3ee825f622 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:21:23 -0300 Subject: [PATCH 007/103] feat(images): immersive image / GIF viewer Fullscreen image viewer with a slim header/footer: JPEG via TJPGD (file path), PNG via lodepng, GIF via lv_gif; fit-to-screen without upscaling small media. Launched from the Files browser (files_ui routing). Co-Authored-By: Claude Opus 4.8 --- .../components/Applications/CMakeLists.txt | 11 +- .../Applications/ui/screens/files/files_ui.c | 69 +++- .../ui/screens/images/image_viewer_ui.c | 352 ++++++++++++++++++ .../screens/images/include/image_viewer_ui.h | 57 +++ 4 files changed, 479 insertions(+), 10 deletions(-) create mode 100644 firmware_p4/components/Applications/ui/screens/images/image_viewer_ui.c create mode 100644 firmware_p4/components/Applications/ui/screens/images/include/image_viewer_ui.h diff --git a/firmware_p4/components/Applications/CMakeLists.txt b/firmware_p4/components/Applications/CMakeLists.txt index c9f7e1884..fe8fdafb1 100644 --- a/firmware_p4/components/Applications/CMakeLists.txt +++ b/firmware_p4/components/Applications/CMakeLists.txt @@ -18,16 +18,14 @@ # ui_manager.c and assets_manager.c at the ui/ root) — new screens compile # automatically. INCLUDE_DIRS is the only hand-maintained part; add a screen's # include/ dir there when a new screen area is introduced. +# Globs every ui/**/*.c (e.g. screens/files/usb_storage_ui.c). NOTE: adding a new +# .c under ui/ needs a CMake reconfigure to re-run this glob. file(GLOB_RECURSE UI_SRCS "ui/*.c") list(REMOVE_ITEM UI_SRCS - "${CMAKE_CURRENT_SOURCE_DIR}/ui/screens/games/games_menu_ui.c" "${CMAKE_CURRENT_SOURCE_DIR}/ui/screens/games/flappy_ui.c" - "${CMAKE_CURRENT_SOURCE_DIR}/ui/screens/games/snake_ui.c" - "${CMAKE_CURRENT_SOURCE_DIR}/ui/screens/games/breakout_ui.c" "${CMAKE_CURRENT_SOURCE_DIR}/ui/screens/games/octopet_ui.c" "${CMAKE_CURRENT_SOURCE_DIR}/ui/screens/games/motion_ui.c" - "${CMAKE_CURRENT_SOURCE_DIR}/ui/screens/games/game_fx.c" ) # Application (non-UI) sources — the real drivers/services stay in the build. @@ -83,6 +81,8 @@ idf_component_register(SRCS "ui/include" # --- ui screens (mirrors firmware_p4_prototype) --- "ui/screens/audio/include" + "ui/screens/video/include" + "ui/screens/images/include" "ui/screens/badusb/include" "ui/screens/bluetooth/include" "ui/screens/boot/include" @@ -139,8 +139,10 @@ idf_component_register(SRCS REQUIRES driver esp_driver_tsens + esp_driver_jpeg Drivers Service + gameboy esp_common esp_wifi esp_tinyusb @@ -151,6 +153,7 @@ idf_component_register(SRCS joltwallet__littlefs nvs_flash espressif__esp-dsp + chmorgan__esp-libhelix-mp3 ) target_link_libraries(${COMPONENT_LIB} -Wl,-zmuldefs) target_compile_definitions(${COMPONENT_LIB} PRIVATE MESH_HEADLESS=0) diff --git a/firmware_p4/components/Applications/ui/screens/files/files_ui.c b/firmware_p4/components/Applications/ui/screens/files/files_ui.c index 733ea7313..8ab545d7d 100644 --- a/firmware_p4/components/Applications/ui/screens/files/files_ui.c +++ b/firmware_p4/components/Applications/ui/screens/files/files_ui.c @@ -30,6 +30,9 @@ #include "storage_assets.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "image_viewer_ui.h" +#include "mp3_player_ui.h" +#include "mp4_player_ui.h" #include "wav_player_ui.h" #include "text_viewer_ui.h" #include "ui_theme.h" @@ -60,7 +63,6 @@ static const char *TAG = "FILES_UI"; #define SCROLL_STEP 36 #define COL_RAISE 0x170A28 -#define COL_DIM 0x8A8594 #define COL_DIRNM 0xF0E6FF #define MAX_ENTRIES 96 @@ -93,6 +95,7 @@ static const char *const VOL_LABELS[] = {"Assets", "SD Card"}; static const char *const VOL_PATHS[] = {ASSETS_ROOT, SDCARD_ROOT}; #define VOL_COUNT 2 #define VOL_SD 1 +#define ENTRY_USB_MSC 99 static const char *ICON_OF[] = { [FT_DIR] = "/assets/icons/folder.bin", @@ -235,6 +238,8 @@ static uint8_t type_from_ext(const char *name) { static const char *entry_icon(int idx) { if (s_depth == 0) { + if (s_vol_idx[idx] == ENTRY_USB_MSC) + return "/assets/icons/usb.bin"; return (s_vol_idx[idx] == VOL_SD) ? "/assets/icons/sd_card.bin" : "/assets/icons/folder.bin"; } return ICON_OF[s_entries[idx].type]; @@ -242,6 +247,8 @@ static const char *entry_icon(int idx) { static lv_color_t entry_color(int idx) { if (s_depth == 0) { + if (s_vol_idx[idx] == ENTRY_USB_MSC) + return lv_color_hex(0x00E676); return (s_vol_idx[idx] == VOL_SD) ? lv_color_hex(0x00BCD4) : lv_color_hex(0xFFC400); } return color_of(s_entries[idx].type); @@ -277,6 +284,15 @@ static void scan_dir(void) { s_vol_idx[s_count] = k; s_count++; } + if (vfs_sdcard_is_mounted() && s_count < MAX_ENTRIES) { + entry_t *e = &s_entries[s_count]; + snprintf(e->name, sizeof(e->name), "USB Storage"); + e->is_dir = true; + e->size = 0; + e->type = FT_DIR; + s_vol_idx[s_count] = ENTRY_USB_MSC; + s_count++; + } return; } @@ -351,10 +367,14 @@ static void fill_peek(int idx) { lv_obj_set_style_border_color(s_pk_tag, c, 0); if (e->is_dir) { - lv_label_set_text(s_pk_meta, s_depth == 0 ? "Storage volume" : "Folder"); - if (s_depth == 0) { + if (s_depth == 0 && s_vol_idx[idx] == ENTRY_USB_MSC) { + lv_label_set_text(s_pk_meta, "USB drive"); + lv_label_set_text(s_pk_snip, "Share SD with a PC"); + } else if (s_depth == 0) { + lv_label_set_text(s_pk_meta, "Storage volume"); lv_label_set_text(s_pk_snip, s_vol_idx[idx] == VOL_SD ? "SD card" : "Internal flash"); } else { + lv_label_set_text(s_pk_meta, "Folder"); lv_label_set_text(s_pk_snip, ""); } } else { @@ -414,7 +434,7 @@ static void populate_row(int j) { char sz[16]; fmt_size(sz, sizeof(sz), e->size); lv_label_set_text(s_row_right[j], sz); - lv_obj_set_style_text_color(s_row_right[j], lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_row_right[j], current_theme.text_secondary, 0); } style_item(row, entry_color(idx), idx == s_sel); } @@ -581,7 +601,7 @@ static void build_pathbar(void) { lv_label_set_text(lbl, s_depth == 0 ? "root" : s_cwd); lv_label_set_long_mode(lbl, LV_LABEL_LONG_DOT); lv_obj_set_style_text_font(lbl, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(lbl, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(lbl, current_theme.text_secondary, 0); lv_obj_set_flex_grow(lbl, 1); lv_obj_t *dots = plain(bar); @@ -775,7 +795,7 @@ static void build_peek(void) { lv_label_set_long_mode(s_pk_meta, LV_LABEL_LONG_DOT); lv_obj_set_width(s_pk_meta, lv_pct(100)); lv_obj_set_style_text_font(s_pk_meta, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(s_pk_meta, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_pk_meta, current_theme.text_secondary, 0); s_pk_snip = lv_label_create(pk); lv_label_set_long_mode(s_pk_snip, LV_LABEL_LONG_DOT); @@ -992,6 +1012,11 @@ static void do_enter(void) { return; } if (s_depth == 0) { + if (s_vol_idx[s_sel] == ENTRY_USB_MSC) { + ui_feedback(UI_FB_SELECT); + ui_switch_screen(SCREEN_USB_STORAGE); + return; + } enter_dir(VOL_PATHS[s_vol_idx[s_sel]], true); return; } @@ -1011,6 +1036,38 @@ static void do_enter(void) { ui_switch_screen(SCREEN_WAV_PLAYER); return; } + if (dot != NULL && (strcasecmp(dot, ".mp4") == 0 || strcasecmp(dot, ".m4v") == 0 || + strcasecmp(dot, ".mov") == 0)) { + char full[FULL_PATH]; + snprintf(full, sizeof(full), "%s/%s", s_cwd, e->name); + ui_feedback(UI_FB_SELECT); + s_resume = true; + ui_mp4_player_set_path(full); + ui_mp4_player_set_return(SCREEN_FILES); + ui_switch_screen(SCREEN_MP4_PLAYER); + return; + } + if (dot != NULL && strcasecmp(dot, ".mp3") == 0) { + char full[FULL_PATH]; + snprintf(full, sizeof(full), "%s/%s", s_cwd, e->name); + ui_feedback(UI_FB_SELECT); + s_resume = true; + ui_mp3_player_set_path(full); + ui_mp3_player_set_return(SCREEN_FILES); + ui_switch_screen(SCREEN_MP3_PLAYER); + return; + } + if (dot != NULL && (strcasecmp(dot, ".jpg") == 0 || strcasecmp(dot, ".jpeg") == 0 || + strcasecmp(dot, ".png") == 0 || strcasecmp(dot, ".gif") == 0)) { + char full[FULL_PATH]; + snprintf(full, sizeof(full), "%s/%s", s_cwd, e->name); + ui_feedback(UI_FB_SELECT); + s_resume = true; + ui_image_viewer_set_path(full); + ui_image_viewer_set_return(SCREEN_FILES); + ui_switch_screen(SCREEN_IMAGE_VIEWER); + return; + } s_in_viewer = true; ui_feedback(UI_FB_SELECT); build_screen(); diff --git a/firmware_p4/components/Applications/ui/screens/images/image_viewer_ui.c b/firmware_p4/components/Applications/ui/screens/images/image_viewer_ui.c new file mode 100644 index 000000000..0b0868d18 --- /dev/null +++ b/firmware_p4/components/Applications/ui/screens/images/image_viewer_ui.c @@ -0,0 +1,352 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#include "image_viewer_ui.h" + +#include "esp_attr.h" + +#include +#include +#include +#include +#include + +#include "esp_heap_caps.h" +#include "esp_log.h" + +#include "lvgl.h" +#include "st7789.h" +#include "ui_feedback.h" +#include "ui_manager.h" + +static const char *TAG = "IMG_VIEWER"; + +#define VIEW_W LCD_H_RES +#define VIEW_H LCD_V_RES +#define HDR_H 26 +#define FTR_H 24 +#define IMG_AREA_H (VIEW_H - HDR_H - FTR_H) +#define MAX_IMAGES 256 +#define PATH_LEN 288 +#define FOOTER_TXT_LEN 48 +#define LVGL_PATH_PREFIX_MAX 4 + +typedef enum { IMG_NONE, IMG_JPEG, IMG_PNG, IMG_GIF } img_fmt_t; + +static char s_path[PATH_LEN]; +static screen_id_t s_return = SCREEN_FILES; + +static lv_obj_t *s_screen = NULL; +static lv_obj_t *s_area = NULL; +static lv_obj_t *s_hdr = NULL; +static lv_obj_t *s_ftr = NULL; + +static uint8_t *s_blob = NULL; +static lv_image_dsc_t s_raw_dsc; + +EXT_RAM_BSS_ATTR static char s_list[MAX_IMAGES][PATH_LEN]; +static int s_count = 0; +static int s_idx = 0; + +static img_fmt_t fmt_of(const char *name) { + const char *dot = strrchr(name, '.'); + if (dot == NULL) + return IMG_NONE; + if (strcasecmp(dot, ".jpg") == 0 || strcasecmp(dot, ".jpeg") == 0) + return IMG_JPEG; + if (strcasecmp(dot, ".png") == 0) + return IMG_PNG; + if (strcasecmp(dot, ".gif") == 0) + return IMG_GIF; + return IMG_NONE; +} + +static bool is_image(const char *name) { + return fmt_of(name) != IMG_NONE; +} + +static void free_media(void) { + if (s_blob != NULL) { + free(s_blob); + s_blob = NULL; + } + memset(&s_raw_dsc, 0, sizeof(s_raw_dsc)); +} + +static uint8_t *read_file(const char *path, size_t *out_len) { + FILE *f = fopen(path, "rb"); + if (f == NULL) + return NULL; + fseek(f, 0, SEEK_END); + long sz = ftell(f); + fseek(f, 0, SEEK_SET); + if (sz <= 0) { + fclose(f); + return NULL; + } + uint8_t *buf = heap_caps_malloc((size_t)sz, MALLOC_CAP_SPIRAM); + if (buf == NULL) { + fclose(f); + ESP_LOGE(TAG, "OOM reading %s (%ld bytes)", path, sz); + return NULL; + } + size_t rd = fread(buf, 1, (size_t)sz, f); + fclose(f); + if (rd != (size_t)sz) { + free(buf); + return NULL; + } + *out_len = (size_t)sz; + return buf; +} + +static void scan_folder(void) { + s_count = 0; + s_idx = 0; + + char dir[PATH_LEN]; + strncpy(dir, s_path, sizeof(dir) - 1); + dir[sizeof(dir) - 1] = '\0'; + const char *base = s_path; + char *slash = strrchr(dir, '/'); + if (slash != NULL) { + *slash = '\0'; + base = slash + 1; + } else { + strcpy(dir, "."); + } + + DIR *d = opendir(dir); + if (d != NULL) { + struct dirent *ent; + while ((ent = readdir(d)) != NULL && s_count < MAX_IMAGES) { + if (ent->d_name[0] == '.') + continue; + if (ent->d_type == DT_DIR) + continue; + if (!is_image(ent->d_name)) + continue; + if (strlen(dir) + 1 + strlen(ent->d_name) >= PATH_LEN) + continue; + strlcpy(s_list[s_count], dir, PATH_LEN); + strlcat(s_list[s_count], "/", PATH_LEN); + strlcat(s_list[s_count], ent->d_name, PATH_LEN); + if (strcmp(ent->d_name, base) == 0) + s_idx = s_count; + s_count++; + } + closedir(d); + } + + if (s_count == 0) { + strncpy(s_list[0], s_path, PATH_LEN - 1); + s_list[0][PATH_LEN - 1] = '\0'; + s_count = 1; + s_idx = 0; + } +} + +static void fit_image(lv_obj_t *w, int32_t iw, int32_t ih) { + lv_obj_set_size(w, VIEW_W, IMG_AREA_H); + bool fits = (iw > 0 && ih > 0 && iw <= VIEW_W && ih <= IMG_AREA_H); + lv_image_set_inner_align(w, fits ? LV_IMAGE_ALIGN_CENTER : LV_IMAGE_ALIGN_CONTAIN); + lv_image_set_antialias(w, !fits); + lv_obj_center(w); +} + +static void load_current(void) { + if (s_area == NULL) + return; + lv_obj_clean(s_area); + free_media(); + + if (s_count <= 0) + return; + + const char *path = s_list[s_idx]; + const char *name = strrchr(path, '/'); + name = (name != NULL) ? name + 1 : path; + + if (s_hdr != NULL) + lv_label_set_text(s_hdr, name); + if (s_ftr != NULL) { + char f[FOOTER_TXT_LEN]; + snprintf(f, sizeof(f), "%d/%d " LV_SYMBOL_LEFT " " LV_SYMBOL_RIGHT, s_idx + 1, s_count); + lv_label_set_text(s_ftr, f); + } + + img_fmt_t fmt = fmt_of(name); + size_t len = 0; + lv_obj_t *w = NULL; + int32_t iw = 0, ih = 0; + + if (fmt == IMG_JPEG) { + char lp[PATH_LEN + LVGL_PATH_PREFIX_MAX]; + strlcpy(lp, "A:", sizeof(lp)); + strlcat(lp, (path[0] == '/') ? path + 1 : path, sizeof(lp)); + w = lv_image_create(s_area); + lv_image_set_src(w, lp); + lv_image_header_t h; + memset(&h, 0, sizeof(h)); + if (lv_image_decoder_get_info(lp, &h) == LV_RESULT_OK) { + iw = h.w; + ih = h.h; + } + } else if (fmt == IMG_PNG) { + s_blob = read_file(path, &len); + if (s_blob != NULL) { + memset(&s_raw_dsc, 0, sizeof(s_raw_dsc)); + s_raw_dsc.header.magic = LV_IMAGE_HEADER_MAGIC; + s_raw_dsc.header.cf = LV_COLOR_FORMAT_RAW; + s_raw_dsc.data = s_blob; + s_raw_dsc.data_size = (uint32_t)len; + w = lv_image_create(s_area); + lv_image_set_src(w, &s_raw_dsc); + lv_image_header_t h; + memset(&h, 0, sizeof(h)); + if (lv_image_decoder_get_info(&s_raw_dsc, &h) == LV_RESULT_OK) { + iw = h.w; + ih = h.h; + } + } + } else if (fmt == IMG_GIF) { +#if LV_USE_GIF + s_blob = read_file(path, &len); + if (s_blob != NULL) { + if (len >= 10) { + iw = s_blob[6] | (s_blob[7] << 8); + ih = s_blob[8] | (s_blob[9] << 8); + } + ESP_LOGI(TAG, "GIF '%s': %u bytes, %dx%d", name, (unsigned)len, (int)iw, (int)ih); + memset(&s_raw_dsc, 0, sizeof(s_raw_dsc)); + s_raw_dsc.header.magic = LV_IMAGE_HEADER_MAGIC; + s_raw_dsc.header.cf = LV_COLOR_FORMAT_RAW; + s_raw_dsc.data = s_blob; + s_raw_dsc.data_size = (uint32_t)len; + w = lv_gif_create(s_area); + lv_gif_set_color_format(w, LV_COLOR_FORMAT_RGB565); + lv_gif_set_src(w, &s_raw_dsc); + } +#endif + } + + if (w == NULL) { + lv_obj_t *ph = lv_label_create(s_area); + lv_label_set_text(ph, LV_SYMBOL_WARNING " cannot display"); + lv_obj_set_style_text_color(ph, lv_color_hex(0xFF5252), 0); + lv_obj_set_style_text_font(ph, &lv_font_montserrat_14, 0); + lv_obj_center(ph); + return; + } + + fit_image(w, iw, ih); +} + +static void go_relative(int dir) { + if (s_count <= 1) + return; + s_idx = (s_idx + dir + s_count) % s_count; + load_current(); + ui_feedback(UI_FB_NAV); +} + +static void image_viewer_input(const input_event_t *ev, void *ctx) { + (void)ctx; + if (ev->action != INPUT_ACTION_PRESS && ev->action != INPUT_ACTION_REPEAT) + return; + const bool press = (ev->action == INPUT_ACTION_PRESS); + switch (ev->button) { + case INPUT_BTN_BACK: + if (press) + ui_switch_screen(s_return); + break; + case INPUT_BTN_RIGHT: + case INPUT_BTN_DOWN: + go_relative(+1); + break; + case INPUT_BTN_LEFT: + case INPUT_BTN_UP: + go_relative(-1); + break; + default: + break; + } +} + +void ui_image_viewer_set_path(const char *path) { + if (path == NULL) { + s_path[0] = '\0'; + return; + } + strncpy(s_path, path, sizeof(s_path) - 1); + s_path[sizeof(s_path) - 1] = '\0'; +} + +void ui_image_viewer_set_return(int screen) { + s_return = (screen_id_t)screen; +} + +void ui_image_viewer_stop(void) { + if (s_area != NULL) + lv_obj_clean(s_area); + free_media(); + s_count = 0; + s_area = NULL; + s_hdr = NULL; + s_ftr = NULL; +} + +void ui_image_viewer_open(void) { + if (s_screen != NULL) { + lv_obj_del(s_screen); + s_screen = NULL; + } + + s_screen = lv_obj_create(NULL); + lv_obj_remove_flag(s_screen, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_style_bg_color(s_screen, lv_color_black(), 0); + lv_obj_set_style_bg_opa(s_screen, LV_OPA_COVER, 0); + lv_obj_set_style_pad_all(s_screen, 0, 0); + lv_obj_set_style_border_width(s_screen, 0, 0); + + s_hdr = lv_label_create(s_screen); + lv_obj_set_width(s_hdr, VIEW_W - 16); + lv_label_set_long_mode(s_hdr, LV_LABEL_LONG_DOT); + lv_obj_set_style_text_align(s_hdr, LV_TEXT_ALIGN_CENTER, 0); + lv_obj_set_style_text_font(s_hdr, &lv_font_montserrat_14, 0); + lv_obj_set_style_text_color(s_hdr, lv_color_hex(0xFFFFFF), 0); + lv_obj_align(s_hdr, LV_ALIGN_TOP_MID, 0, 5); + + s_area = lv_obj_create(s_screen); + lv_obj_remove_flag(s_area, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_size(s_area, VIEW_W, IMG_AREA_H); + lv_obj_align(s_area, LV_ALIGN_TOP_MID, 0, HDR_H); + lv_obj_set_style_bg_color(s_area, lv_color_black(), 0); + lv_obj_set_style_bg_opa(s_area, LV_OPA_COVER, 0); + lv_obj_set_style_pad_all(s_area, 0, 0); + lv_obj_set_style_border_width(s_area, 0, 0); + lv_obj_set_style_radius(s_area, 0, 0); + + s_ftr = lv_label_create(s_screen); + lv_obj_set_style_text_font(s_ftr, &lv_font_montserrat_12, 0); + lv_obj_set_style_text_color(s_ftr, lv_color_hex(0x9AA0A6), 0); + lv_obj_align(s_ftr, LV_ALIGN_BOTTOM_MID, 0, -5); + + scan_folder(); + load_current(); + + ui_input_set_screen_handler(image_viewer_input, NULL); + ui_screen_load_owned(&s_screen, s_screen); +} diff --git a/firmware_p4/components/Applications/ui/screens/images/include/image_viewer_ui.h b/firmware_p4/components/Applications/ui/screens/images/include/image_viewer_ui.h new file mode 100644 index 000000000..61276c7e1 --- /dev/null +++ b/firmware_p4/components/Applications/ui/screens/images/include/image_viewer_ui.h @@ -0,0 +1,57 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#ifndef IMAGE_VIEWER_UI_H +#define IMAGE_VIEWER_UI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Set the image/GIF file to view. Call BEFORE switching to + * SCREEN_IMAGE_VIEWER (e.g. from the Files screen). The string is copied. + * On open the viewer also scans that file's folder for sibling images so + * LEFT/RIGHT flip through them. + * + * @param path Absolute path to the image/GIF file to display. + */ +void ui_image_viewer_set_path(const char *path); + +/** + * @brief Set the screen to return to on BACK. + * + * @param screen Screen to load on BACK, as a screen_id_t value. + */ +void ui_image_viewer_set_return(int screen); + +/** + * @brief Open the immersive viewer: fills the screen with the image (JPEG via + * the LVGL software decoder, PNG via lodepng, animated GIF via lv_gif), + * with a slim filename header and a position/hint footer. + */ +void ui_image_viewer_open(void); + +/** + * @brief Free the decode buffers held for the current image. Registered as the + * screen close hook so navigating away releases PSRAM cleanly. + */ +void ui_image_viewer_stop(void); + +#ifdef __cplusplus +} +#endif + +#endif // IMAGE_VIEWER_UI_H From 590c21e5154490d414cc47f2f32ae619340c0a1f Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:21:23 -0300 Subject: [PATCH 008/103] feat(video): MP4 player + media thumbnails MP4 player screen, an ISO-BMFF metadata parser (codec/cover art), and a shared media thumbnail decoder. Co-Authored-By: Claude Opus 4.8 --- .../ui/screens/video/include/media_thumb.h | 58 ++++ .../ui/screens/video/include/mp4_meta.h | 82 +++++ .../ui/screens/video/include/mp4_player_ui.h | 42 +++ .../ui/screens/video/media_thumb.c | 127 ++++++++ .../Applications/ui/screens/video/mp4_meta.c | 305 ++++++++++++++++++ .../ui/screens/video/mp4_player_ui.c | 285 ++++++++++++++++ 6 files changed, 899 insertions(+) create mode 100644 firmware_p4/components/Applications/ui/screens/video/include/media_thumb.h create mode 100644 firmware_p4/components/Applications/ui/screens/video/include/mp4_meta.h create mode 100644 firmware_p4/components/Applications/ui/screens/video/include/mp4_player_ui.h create mode 100644 firmware_p4/components/Applications/ui/screens/video/media_thumb.c create mode 100644 firmware_p4/components/Applications/ui/screens/video/mp4_meta.c create mode 100644 firmware_p4/components/Applications/ui/screens/video/mp4_player_ui.c diff --git a/firmware_p4/components/Applications/ui/screens/video/include/media_thumb.h b/firmware_p4/components/Applications/ui/screens/video/include/media_thumb.h new file mode 100644 index 000000000..98f16878c --- /dev/null +++ b/firmware_p4/components/Applications/ui/screens/video/include/media_thumb.h @@ -0,0 +1,58 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#ifndef MEDIA_THUMB_H +#define MEDIA_THUMB_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include +#include + +#include "lvgl.h" + +/** + * @brief A decoded RGB565 image ready to hand to an lv_image. Its `dsc.data` + * buffer is owned by this struct; release it with media_thumb_free(). + */ +typedef struct { + lv_image_dsc_t dsc; + void *buf; ///< backing pixel buffer (freed by media_thumb_free) + uint16_t w; + uint16_t h; +} media_thumb_t; + +/** + * @brief Decode a baseline-JPEG blob (e.g. the MP4 'covr' artwork) to an + * RGB565 lv_image using the ESP32-P4 hardware JPEG engine. Progressive + * JPEG and PNG are NOT supported (returns false) — the caller should + * fall back to a placeholder glyph. Run this OFF the LVGL thread. + * + * @return true on success (out is filled, free with media_thumb_free), false + * on any error (unsupported format, decode failure, OOM). + */ +bool media_thumb_decode_jpeg(const uint8_t *jpeg, size_t len, media_thumb_t *out); + +/** @brief Release a media_thumb_t produced by media_thumb_decode_jpeg. */ +void media_thumb_free(media_thumb_t *t); + +#ifdef __cplusplus +} +#endif + +#endif // MEDIA_THUMB_H diff --git a/firmware_p4/components/Applications/ui/screens/video/include/mp4_meta.h b/firmware_p4/components/Applications/ui/screens/video/include/mp4_meta.h new file mode 100644 index 000000000..56b8be370 --- /dev/null +++ b/firmware_p4/components/Applications/ui/screens/video/include/mp4_meta.h @@ -0,0 +1,82 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#ifndef MP4_META_H +#define MP4_META_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/** @brief Video codec of the first video track, detected from the sample-entry fourcc. */ +typedef enum { + MP4_VCODEC_NONE = 0, ///< no video track + MP4_VCODEC_H264, ///< avc1 / avc3 — NOT decodable in realtime on ESP32-P4 (no HW decoder) + MP4_VCODEC_MJPEG, ///< mjpa / jpeg / MJPG — decodable via the HW JPEG engine + MP4_VCODEC_MPEG4, ///< mp4v — not supported + MP4_VCODEC_OTHER, +} mp4_vcodec_t; + +/** @brief Cover-art image format (from the iTunes 'covr' data-atom type flag). */ +typedef enum { + MP4_COVER_NONE = 0, + MP4_COVER_JPEG, ///< covr data type 13 + MP4_COVER_PNG, ///< covr data type 14 +} mp4_cover_fmt_t; + +/** @brief Parsed MP4 metadata. Strings are always NUL-terminated (empty if absent). */ +typedef struct { + char title[64]; ///< ilst \xA9nam + char artist[64]; ///< ilst \xA9ART + char album[64]; ///< ilst \xA9alb + char year[8]; ///< ilst \xA9day (first 4 chars) + + uint32_t duration_sec; ///< from mvhd (duration / timescale) + uint16_t width; ///< first video track sample-entry width + uint16_t height; ///< first video track sample-entry height + mp4_vcodec_t vcodec; + bool has_audio; ///< an 'soun' handler track is present + + mp4_cover_fmt_t cover_fmt; ///< embedded cover art (from 'covr'); read via mp4_meta_read_cover() + long cover_off; ///< absolute file offset of the image bytes (0 if none) + uint32_t cover_size; ///< size of the image blob in bytes +} mp4_meta_t; + +/** + * @brief Parse the metadata of an .mp4 / .m4v / .mov file. Reads only the box + * tree (moov/udta/ilst + track sample entries), never the media data. + * Self-contained, no decoder needed. Returns false if the file is not a + * readable ISO-BMFF container. + */ +bool mp4_meta_parse(const char *path, mp4_meta_t *out); + +/** + * @brief Read the embedded cover-art blob into a freshly malloc'd buffer that + * the caller must free(). Returns NULL if there is no cover or on error; + * on success *out_size holds the byte count. + */ +uint8_t *mp4_meta_read_cover(const char *path, const mp4_meta_t *m, uint32_t *out_size); + +/** @brief Human-readable codec name for the status line. */ +const char *mp4_vcodec_name(mp4_vcodec_t c); + +#ifdef __cplusplus +} +#endif + +#endif // MP4_META_H diff --git a/firmware_p4/components/Applications/ui/screens/video/include/mp4_player_ui.h b/firmware_p4/components/Applications/ui/screens/video/include/mp4_player_ui.h new file mode 100644 index 000000000..c940538db --- /dev/null +++ b/firmware_p4/components/Applications/ui/screens/video/include/mp4_player_ui.h @@ -0,0 +1,42 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#ifndef MP4_PLAYER_UI_H +#define MP4_PLAYER_UI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Set the .mp4 / .m4v / .mov file to open. Call BEFORE switching to + * SCREEN_MP4_PLAYER (e.g. from the Files screen). The string is copied. + */ +void ui_mp4_player_set_path(const char *path); + +/** + * @brief Set the screen to return to on BACK (as a screen_id_t value). + * Defaults to the Files screen. + */ +void ui_mp4_player_set_return(int screen); + +/** @brief Open the MP4 player screen: parses metadata + cover and shows them. */ +void ui_mp4_player_open(void); + +#ifdef __cplusplus +} +#endif + +#endif // MP4_PLAYER_UI_H diff --git a/firmware_p4/components/Applications/ui/screens/video/media_thumb.c b/firmware_p4/components/Applications/ui/screens/video/media_thumb.c new file mode 100644 index 000000000..b767ad625 --- /dev/null +++ b/firmware_p4/components/Applications/ui/screens/video/media_thumb.c @@ -0,0 +1,127 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#include "media_thumb.h" + +#include +#include + +#include "esp_heap_caps.h" +#include "esp_log.h" + +#include "driver/jpeg_decode.h" + +static const char *TAG = "MEDIA_THUMB"; + +#define THUMB_MAX_DIM 2048 +#define JPEG_DECODE_TIMEOUT_MS 70 + +bool media_thumb_decode_jpeg(const uint8_t *jpeg, size_t len, media_thumb_t *out) { + if (jpeg == NULL || len < 4 || out == NULL) + return false; + memset(out, 0, sizeof(*out)); + + if (jpeg[0] != 0xFF || jpeg[1] != 0xD8) + return false; + + jpeg_decoder_handle_t jpgd = NULL; + jpeg_decode_engine_cfg_t engine_cfg = { + .timeout_ms = JPEG_DECODE_TIMEOUT_MS, + }; + if (jpeg_new_decoder_engine(&engine_cfg, &jpgd) != ESP_OK) { + ESP_LOGW(TAG, "jpeg_new_decoder_engine failed"); + return false; + } + + bool ok = false; + uint8_t *in_buf = NULL; + uint8_t *out_buf = NULL; + jpeg_decode_picture_info_t info = {0}; + size_t out_buf_size = 0; + size_t in_buf_size = 0; + uint32_t decoded = 0; + jpeg_decode_cfg_t decode_cfg = { + .output_format = JPEG_DECODE_OUT_FORMAT_RGB565, + .rgb_order = JPEG_DEC_RGB_ELEMENT_ORDER_BGR, + .conv_std = JPEG_YUV_RGB_CONV_STD_BT601, + }; + jpeg_decode_memory_alloc_cfg_t out_mem_cfg = { + .buffer_direction = JPEG_DEC_ALLOC_OUTPUT_BUFFER, + }; + jpeg_decode_memory_alloc_cfg_t in_mem_cfg = { + .buffer_direction = JPEG_DEC_ALLOC_INPUT_BUFFER, + }; + + in_buf = (uint8_t *)jpeg_alloc_decoder_mem(len, &in_mem_cfg, &in_buf_size); + if (in_buf == NULL) { + ESP_LOGW(TAG, "input mem alloc failed (%u bytes)", (unsigned)len); + goto done; + } + memcpy(in_buf, jpeg, len); + + if (jpeg_decoder_get_info(in_buf, (uint32_t)len, &info) != ESP_OK) { + ESP_LOGW(TAG, "get_info failed (progressive JPEG?)"); + goto done; + } + ESP_LOGI(TAG, "cover %ux%u, %u bytes", (unsigned)info.width, (unsigned)info.height, (unsigned)len); + if (info.width == 0 || info.height == 0 || info.width > THUMB_MAX_DIM || + info.height > THUMB_MAX_DIM) { + ESP_LOGW(TAG, "bad cover dims %ux%u", (unsigned)info.width, (unsigned)info.height); + goto done; + } + + out_buf = (uint8_t *)jpeg_alloc_decoder_mem( + (size_t)info.width * info.height * 2, &out_mem_cfg, &out_buf_size); + if (out_buf == NULL) { + ESP_LOGW(TAG, "decoder mem alloc failed (%u bytes)", (unsigned)(info.width * info.height * 2)); + goto done; + } + + if (jpeg_decoder_process(jpgd, &decode_cfg, in_buf, (uint32_t)len, out_buf, out_buf_size, + &decoded) != ESP_OK) { + ESP_LOGW(TAG, "jpeg_decoder_process failed"); + goto done; + } + + out->buf = out_buf; + out->w = info.width; + out->h = info.height; + out->dsc.header.magic = LV_IMAGE_HEADER_MAGIC; + out->dsc.header.cf = LV_COLOR_FORMAT_RGB565; + out->dsc.header.w = info.width; + out->dsc.header.h = info.height; + out->dsc.header.stride = (uint32_t)info.width * 2; + out->dsc.data = out_buf; + out->dsc.data_size = (uint32_t)info.width * info.height * 2; + out_buf = NULL; + ok = true; + +done: + if (in_buf != NULL) + free(in_buf); + if (out_buf != NULL) + free(out_buf); + if (jpgd != NULL) + jpeg_del_decoder_engine(jpgd); + return ok; +} + +void media_thumb_free(media_thumb_t *t) { + if (t == NULL) + return; + if (t->buf != NULL) + free(t->buf); + memset(t, 0, sizeof(*t)); +} diff --git a/firmware_p4/components/Applications/ui/screens/video/mp4_meta.c b/firmware_p4/components/Applications/ui/screens/video/mp4_meta.c new file mode 100644 index 000000000..c766bc724 --- /dev/null +++ b/firmware_p4/components/Applications/ui/screens/video/mp4_meta.c @@ -0,0 +1,305 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#include "mp4_meta.h" + +#include +#include +#include + +static const char *TAG = "MP4_META"; + +#define MP4_MAX_DEPTH 8 +#define MP4_MAX_BOXES 4096 +#define ILST_STR_MAX 128 +#define MP4_MAX_COVER_BYTES (4u * 1024u * 1024u) + +typedef struct { + mp4_meta_t *m; + uint32_t timescale; + uint64_t duration; + int cur_hdlr; + int boxes_seen; +} mp4_ctx_t; + +static uint32_t be32(const uint8_t *p) { + return ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16) | ((uint32_t)p[2] << 8) | (uint32_t)p[3]; +} +static uint16_t be16(const uint8_t *p) { + return (uint16_t)(((uint16_t)p[0] << 8) | (uint16_t)p[1]); +} +static uint64_t be64(const uint8_t *p) { + return ((uint64_t)be32(p) << 32) | (uint64_t)be32(p + 4); +} + +static bool read_at(FILE *f, long off, void *buf, size_t len) { + if (fseek(f, off, SEEK_SET) != 0) + return false; + return fread(buf, 1, len, f) == len; +} + +static void str_copy_trunc(char *dst, size_t dstcap, const char *src, size_t srclen) { + if (dstcap == 0) + return; + size_t k = srclen < dstcap - 1 ? srclen : dstcap - 1; + memcpy(dst, src, k); + dst[k] = '\0'; +} + +static void handle_ilst_data(FILE *f, const uint8_t *key, long payload_off, long payload_end, + mp4_ctx_t *c) { + uint8_t hd[8]; + if (payload_end - payload_off < 8 || !read_at(f, payload_off, hd, 8)) + return; + uint32_t type_class = be32(hd) & 0x00FFFFFF; + long val_off = payload_off + 8; + long val_len = payload_end - val_off; + if (val_len <= 0) + return; + + const uint8_t nam[4] = {0xA9, 'n', 'a', 'm'}; + const uint8_t art[4] = {0xA9, 'A', 'R', 'T'}; + const uint8_t alb[4] = {0xA9, 'a', 'l', 'b'}; + const uint8_t day[4] = {0xA9, 'd', 'a', 'y'}; + + char *dst = NULL; + size_t dstcap = 0; + if (memcmp(key, nam, 4) == 0) { + dst = c->m->title; + dstcap = sizeof(c->m->title); + } else if (memcmp(key, art, 4) == 0) { + dst = c->m->artist; + dstcap = sizeof(c->m->artist); + } else if (memcmp(key, alb, 4) == 0) { + dst = c->m->album; + dstcap = sizeof(c->m->album); + } else if (memcmp(key, day, 4) == 0) { + dst = c->m->year; + dstcap = sizeof(c->m->year); + } else if (memcmp(key, "covr", 4) == 0) { + uint8_t t = (uint8_t)(type_class & 0xFF); + if (t == 13) + c->m->cover_fmt = MP4_COVER_JPEG; + else if (t == 14) + c->m->cover_fmt = MP4_COVER_PNG; + else + c->m->cover_fmt = MP4_COVER_JPEG; + c->m->cover_off = val_off; + c->m->cover_size = (uint32_t)val_len; + return; + } + + if (dst != NULL && dstcap > 0) { + char tmp[ILST_STR_MAX]; + size_t rd = (size_t)val_len < sizeof(tmp) ? (size_t)val_len : sizeof(tmp); + if (read_at(f, val_off, tmp, rd)) + str_copy_trunc(dst, dstcap, tmp, rd); + } +} + +static void handle_stsd(FILE *f, long payload_off, long payload_end, mp4_ctx_t *c) { + uint8_t h[8]; + if (payload_end - payload_off < 8 || !read_at(f, payload_off, h, 8)) + return; + long entry_off = payload_off + 8; + uint8_t se[36]; + long avail = payload_end - entry_off; + size_t rd = avail < (long)sizeof(se) ? (size_t)avail : sizeof(se); + if (rd < 8 || !read_at(f, entry_off, se, rd)) + return; + const uint8_t *fourcc = se + 4; + + if (c->cur_hdlr == 'v' && c->m->vcodec == MP4_VCODEC_NONE) { + if (memcmp(fourcc, "avc1", 4) == 0 || memcmp(fourcc, "avc3", 4) == 0) + c->m->vcodec = MP4_VCODEC_H264; + else if (memcmp(fourcc, "mjpa", 4) == 0 || memcmp(fourcc, "jpeg", 4) == 0 || + memcmp(fourcc, "MJPG", 4) == 0 || memcmp(fourcc, "mjpg", 4) == 0) + c->m->vcodec = MP4_VCODEC_MJPEG; + else if (memcmp(fourcc, "mp4v", 4) == 0) + c->m->vcodec = MP4_VCODEC_MPEG4; + else + c->m->vcodec = MP4_VCODEC_OTHER; + if (rd >= 28) { + c->m->width = be16(se + 24); + c->m->height = be16(se + 26); + } + } +} + +static void walk(FILE *f, long start, long end, int depth, const uint8_t *ilst_key, mp4_ctx_t *c) { + if (depth > MP4_MAX_DEPTH) + return; + long pos = start; + while (pos + 8 <= end && c->boxes_seen < MP4_MAX_BOXES) { + uint8_t hdr[8]; + if (!read_at(f, pos, hdr, 8)) + return; + c->boxes_seen++; + uint64_t size = be32(hdr); + const uint8_t *type = hdr + 4; + long header = 8; + if (size == 1) { + uint8_t big[8]; + if (!read_at(f, pos + 8, big, 8)) + return; + size = be64(big); + header = 16; + } else if (size == 0) { + size = (uint64_t)(end - pos); + } + if (size < (uint64_t)header) + return; + long box_end = pos + (long)size; + if (box_end > end || box_end <= pos) + box_end = end; + long payload = pos + header; + + if (ilst_key != NULL) { + if (memcmp(type, "data", 4) == 0) + handle_ilst_data(f, ilst_key, payload, box_end, c); + } else if (memcmp(type, "moov", 4) == 0 || memcmp(type, "trak", 4) == 0 || + memcmp(type, "mdia", 4) == 0 || memcmp(type, "minf", 4) == 0 || + memcmp(type, "stbl", 4) == 0 || memcmp(type, "udta", 4) == 0) { + if (memcmp(type, "trak", 4) == 0) + c->cur_hdlr = 0; + walk(f, payload, box_end, depth + 1, NULL, c); + } else if (memcmp(type, "meta", 4) == 0) { + walk(f, payload + 4, box_end, depth + 1, NULL, c); + } else if (memcmp(type, "ilst", 4) == 0) { + long ip = payload; + while (ip + 8 <= box_end && c->boxes_seen < MP4_MAX_BOXES) { + uint8_t ih[8]; + if (!read_at(f, ip, ih, 8)) + break; + c->boxes_seen++; + uint64_t isz = be32(ih); + if (isz < 8) + break; + long iend = ip + (long)isz; + if (iend > box_end || iend <= ip) + break; + walk(f, ip + 8, iend, depth + 1, ih + 4, c); + ip = iend; + } + } else if (memcmp(type, "mvhd", 4) == 0) { + uint8_t mv[24]; + if (read_at(f, payload, mv, sizeof(mv))) { + if (mv[0] == 0) { + c->timescale = be32(mv + 12); + c->duration = be32(mv + 16); + } else { + c->timescale = be32(mv + 20); + uint8_t d8[8]; + if (read_at(f, payload + 24, d8, 8)) + c->duration = be64(d8); + } + } + } else if (memcmp(type, "hdlr", 4) == 0) { + uint8_t hb[12]; + if (read_at(f, payload, hb, sizeof(hb))) { + if (memcmp(hb + 8, "vide", 4) == 0) + c->cur_hdlr = 'v'; + else if (memcmp(hb + 8, "soun", 4) == 0) { + c->cur_hdlr = 's'; + c->m->has_audio = true; + } + } + } else if (memcmp(type, "stsd", 4) == 0) { + handle_stsd(f, payload, box_end, c); + } + + pos = box_end; + } +} + +bool mp4_meta_parse(const char *path, mp4_meta_t *out) { + if (path == NULL || out == NULL) + return false; + memset(out, 0, sizeof(*out)); + out->vcodec = MP4_VCODEC_NONE; + out->cover_fmt = MP4_COVER_NONE; + + FILE *f = fopen(path, "rb"); + if (f == NULL) + return false; + + if (fseek(f, 0, SEEK_END) != 0) { + fclose(f); + return false; + } + long fsize = ftell(f); + if (fsize < 16) { + fclose(f); + return false; + } + + uint8_t top[8]; + if (!read_at(f, 0, top, 8) || + (memcmp(top + 4, "ftyp", 4) != 0 && memcmp(top + 4, "moov", 4) != 0 && + memcmp(top + 4, "free", 4) != 0 && memcmp(top + 4, "wide", 4) != 0 && + memcmp(top + 4, "mdat", 4) != 0 && memcmp(top + 4, "skip", 4) != 0)) { + fclose(f); + return false; + } + + mp4_ctx_t c = {.m = out}; + walk(f, 0, fsize, 0, NULL, &c); + fclose(f); + + if (c.timescale > 0) + out->duration_sec = (uint32_t)(c.duration / c.timescale); + + return true; +} + +uint8_t *mp4_meta_read_cover(const char *path, const mp4_meta_t *m, uint32_t *out_size) { + if (path == NULL || m == NULL || m->cover_fmt == MP4_COVER_NONE || m->cover_size == 0) + return NULL; + if (m->cover_size > MP4_MAX_COVER_BYTES) + return NULL; + + FILE *f = fopen(path, "rb"); + if (f == NULL) + return NULL; + uint8_t *buf = malloc(m->cover_size); + if (buf == NULL) { + fclose(f); + return NULL; + } + if (!read_at(f, m->cover_off, buf, m->cover_size)) { + free(buf); + fclose(f); + return NULL; + } + fclose(f); + if (out_size) + *out_size = m->cover_size; + return buf; +} + +const char *mp4_vcodec_name(mp4_vcodec_t c) { + switch (c) { + case MP4_VCODEC_H264: + return "H.264"; + case MP4_VCODEC_MJPEG: + return "MJPEG"; + case MP4_VCODEC_MPEG4: + return "MPEG-4"; + case MP4_VCODEC_OTHER: + return "video"; + default: + return "no video"; + } +} diff --git a/firmware_p4/components/Applications/ui/screens/video/mp4_player_ui.c b/firmware_p4/components/Applications/ui/screens/video/mp4_player_ui.c new file mode 100644 index 000000000..1dab67d54 --- /dev/null +++ b/firmware_p4/components/Applications/ui/screens/video/mp4_player_ui.c @@ -0,0 +1,285 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#include "mp4_player_ui.h" + +#include +#include +#include + +#include "st7789.h" + +#include "media_thumb.h" +#include "mp4_meta.h" +#include "ui_chrome.h" +#include "ui_feedback.h" +#include "ui_manager.h" +#include "ui_theme.h" + +static const char *TAG = "MP4_PLAYER"; + +#define PATH_MAX_LEN 256 +#define REFRESH_TIMER_MS 120 +#define COVER_BOX 118 +#define META_LINE_LEN 96 +#define DUR_BUF_LEN 16 +#define ACC1 0x7A52D6 +#define ACC2 0xB89AFF + +static char s_path[PATH_MAX_LEN]; +static screen_id_t s_return = SCREEN_FILES; + +static lv_obj_t *s_screen = NULL; +static lv_timer_t *s_refresh_timer = NULL; +static lv_obj_t *s_status = NULL; +static media_thumb_t s_thumb; +static bool s_thumb_valid = false; +static uint8_t *s_png_blob = NULL; +static lv_image_dsc_t s_png_dsc; +static bool s_png_valid = false; +static mp4_meta_t s_meta; + +void ui_mp4_player_set_path(const char *path) { + if (path == NULL) { + s_path[0] = '\0'; + return; + } + strncpy(s_path, path, sizeof(s_path) - 1); + s_path[sizeof(s_path) - 1] = '\0'; +} + +void ui_mp4_player_set_return(int screen) { + s_return = (screen_id_t)screen; +} + +static void free_thumb(void) { + if (s_thumb_valid) { + media_thumb_free(&s_thumb); + s_thumb_valid = false; + } + if (s_png_blob != NULL) { + free(s_png_blob); + s_png_blob = NULL; + } + s_png_valid = false; +} + +static void load_cover(void) { + free_thumb(); + if (s_meta.cover_fmt == MP4_COVER_NONE || s_meta.cover_size == 0) + return; + uint32_t blob_len = 0; + uint8_t *blob = mp4_meta_read_cover(s_path, &s_meta, &blob_len); + if (blob == NULL) + return; + if (s_meta.cover_fmt == MP4_COVER_JPEG) { + s_thumb_valid = media_thumb_decode_jpeg(blob, blob_len, &s_thumb); + free(blob); + } else { + s_png_blob = blob; + memset(&s_png_dsc, 0, sizeof(s_png_dsc)); + s_png_dsc.header.magic = LV_IMAGE_HEADER_MAGIC; + s_png_dsc.header.cf = LV_COLOR_FORMAT_RAW; + s_png_dsc.data = s_png_blob; + s_png_dsc.data_size = blob_len; + s_png_valid = true; + } +} + +static void fmt_duration(char *out, size_t n, uint32_t sec) { + if (sec >= 3600) + snprintf(out, n, "%u:%02u:%02u", (unsigned)(sec / 3600), (unsigned)((sec / 60) % 60), + (unsigned)(sec % 60)); + else + snprintf(out, n, "%u:%02u", (unsigned)(sec / 60), (unsigned)(sec % 60)); +} + +static void mp4_player_input(const input_event_t *ev, void *ctx) { + (void)ctx; + if (ev->action != INPUT_ACTION_PRESS) + return; + switch (ev->button) { + case INPUT_BTN_BACK: + ui_switch_screen(s_return); + break; + case INPUT_BTN_OK: + ui_feedback(UI_FB_SELECT); + if (s_status != NULL) { + if (s_meta.vcodec == MP4_VCODEC_H264) + lv_label_set_text(s_status, "H.264 video can't play on\nthis chip - transcode to MJPEG"); + else if (s_meta.vcodec == MP4_VCODEC_MJPEG) + lv_label_set_text(s_status, "MJPEG playback pipeline\nis the next build stage"); + else + lv_label_set_text(s_status, "Audio decode is the next\nbuild stage"); + } + break; + default: + ui_feedback(UI_FB_NAV); + break; + } +} + +static void refresh_timer_cb(lv_timer_t *t) { + if (lv_screen_active() != s_screen) { + lv_timer_delete(t); + s_refresh_timer = NULL; + } +} + +static lv_obj_t *make_label(lv_obj_t *parent, const char *txt, const lv_font_t *font, lv_color_t col, + int width) { + lv_obj_t *l = lv_label_create(parent); + lv_label_set_text(l, txt); + lv_obj_set_style_text_font(l, font, 0); + lv_obj_set_style_text_color(l, col, 0); + if (width > 0) { + lv_obj_set_width(l, width); + lv_label_set_long_mode(l, LV_LABEL_LONG_DOT); + lv_obj_set_style_text_align(l, LV_TEXT_ALIGN_CENTER, 0); + } + return l; +} + +void ui_mp4_player_open(void) { + if (s_screen != NULL) { + lv_obj_del(s_screen); + s_screen = NULL; + } + + bool parsed = mp4_meta_parse(s_path, &s_meta); + if (!parsed) + memset(&s_meta, 0, sizeof(s_meta)); + load_cover(); + + s_screen = lv_obj_create(NULL); + lv_obj_set_style_bg_color(s_screen, current_theme.screen_base, 0); + lv_obj_set_style_bg_opa(s_screen, LV_OPA_COVER, 0); + lv_obj_remove_flag(s_screen, LV_OBJ_FLAG_SCROLLABLE); + + ui_chrome_header(s_screen, "VIDEO", "/assets/icons/description.bin"); + ui_chrome_footer(s_screen, "OK info BACK exit"); + + lv_obj_t *body = lv_obj_create(s_screen); + lv_obj_remove_style_all(body); + lv_obj_set_size(body, 224, LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); + lv_obj_align(body, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); + lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_flex_flow(body, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_align(body, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_set_style_pad_all(body, 4, 0); + + lv_obj_t *cover = lv_obj_create(body); + lv_obj_remove_style_all(cover); + lv_obj_set_size(cover, COVER_BOX, COVER_BOX); + lv_obj_remove_flag(cover, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_style_radius(cover, 10, 0); + lv_obj_set_style_clip_corner(cover, true, 0); + lv_obj_set_style_bg_color(cover, current_theme.bg_secondary, 0); + lv_obj_set_style_bg_opa(cover, LV_OPA_COVER, 0); + lv_obj_set_style_border_width(cover, 1, 0); + lv_obj_set_style_border_color(cover, current_theme.border_inactive, 0); + lv_obj_set_style_shadow_width(cover, 12, 0); + lv_obj_set_style_shadow_color(cover, lv_color_hex(ACC1), 0); + lv_obj_set_style_shadow_opa(cover, LV_OPA_30, 0); + + const lv_image_dsc_t *cover_src = NULL; + int cw = 0, ch = 0; + if (s_thumb_valid && s_thumb.w > 0 && s_thumb.h > 0) { + cover_src = &s_thumb.dsc; + cw = s_thumb.w; + ch = s_thumb.h; + } else if (s_png_valid) { + cover_src = &s_png_dsc; + lv_image_header_t hdr = {0}; + if (lv_image_decoder_get_info(&s_png_dsc, &hdr) == LV_RESULT_OK) { + cw = hdr.w; + ch = hdr.h; + } + } + if (cover_src != NULL) { + lv_obj_t *img = lv_image_create(cover); + lv_image_set_src(img, cover_src); + lv_obj_center(img); + int longest = cw > ch ? cw : ch; + if (longest > 0) { + int zoom = (COVER_BOX * 256) / longest; + if (zoom < 1) + zoom = 1; + lv_image_set_scale(img, (uint16_t)zoom); + } + } else { + lv_obj_t *ph = lv_label_create(cover); + lv_label_set_text(ph, LV_SYMBOL_VIDEO); + lv_obj_set_style_text_font(ph, &lv_font_montserrat_14, 0); + lv_obj_set_style_text_color(ph, current_theme.text_secondary, 0); + lv_obj_center(ph); + } + + const char *slash = strrchr(s_path, '/'); + const char *fallback = s_path[0] ? (slash ? slash + 1 : s_path) : "no file"; + const char *title = s_meta.title[0] ? s_meta.title : fallback; + make_label(body, title, &lv_font_montserrat_14, current_theme.text_main, 210); + + if (s_meta.artist[0]) + make_label(body, s_meta.artist, &lv_font_montserrat_12, current_theme.border_accent, 210); + + if (s_meta.album[0] || s_meta.year[0]) { + char line[META_LINE_LEN]; + if (s_meta.album[0] && s_meta.year[0]) + snprintf(line, sizeof(line), "%s | %s", s_meta.album, s_meta.year); + else + snprintf(line, sizeof(line), "%s", s_meta.album[0] ? s_meta.album : s_meta.year); + make_label(body, line, &lv_font_montserrat_12, current_theme.text_secondary, 210); + } + + char meta_line[META_LINE_LEN]; + char dur[DUR_BUF_LEN] = ""; + if (s_meta.duration_sec > 0) + fmt_duration(dur, sizeof(dur), s_meta.duration_sec); + if (s_meta.width > 0 && s_meta.height > 0) + snprintf(meta_line, sizeof(meta_line), "%s | %ux%u%s%s", mp4_vcodec_name(s_meta.vcodec), + (unsigned)s_meta.width, (unsigned)s_meta.height, dur[0] ? " | " : "", dur); + else + snprintf(meta_line, sizeof(meta_line), "%s%s%s", mp4_vcodec_name(s_meta.vcodec), + dur[0] ? " | " : "", dur); + make_label(body, meta_line, &lv_font_montserrat_12, lv_color_hex(0x00E5D0), 210); + + s_status = lv_label_create(body); + lv_obj_set_width(s_status, 210); + lv_label_set_long_mode(s_status, LV_LABEL_LONG_WRAP); + lv_obj_set_style_text_align(s_status, LV_TEXT_ALIGN_CENTER, 0); + lv_obj_set_style_text_font(s_status, &lv_font_montserrat_12, 0); + if (!parsed) + lv_obj_set_style_text_color(s_status, lv_color_hex(0xFF5252), 0); + else + lv_obj_set_style_text_color(s_status, current_theme.text_secondary, 0); + + if (!parsed) + lv_label_set_text(s_status, "Not a readable MP4"); + else if (s_meta.vcodec == MP4_VCODEC_H264) + lv_label_set_text(s_status, "H.264 - transcode to MJPEG to play"); + else if (s_meta.vcodec == MP4_VCODEC_MJPEG) + lv_label_set_text(s_status, "MJPEG - playback: next build stage"); + else if (s_meta.has_audio) + lv_label_set_text(s_status, "Audio - playback: next build stage"); + else + lv_label_set_text(s_status, "Metadata only"); + + ui_input_set_screen_handler(mp4_player_input, NULL); + if (s_refresh_timer == NULL) + s_refresh_timer = lv_timer_create(refresh_timer_cb, REFRESH_TIMER_MS, NULL); + + ui_screen_load_owned(&s_screen, s_screen); +} From 1277d12b111fb66b6a5d18a33134c239459e910e Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:21:37 -0300 Subject: [PATCH 009/103] feat(audio): MP3 player + ID3 metadata; cross-player playlist nav New MP3 decode/playback screen and an ID3v2 (v2.2/2.3/2.4) tag parser (title/artist/album/year + embedded cover). The library lists WAV and MP3 together and routes prev/next + auto-advance across both players. Players seed and persist the firmware master volume. Co-Authored-By: Claude Opus 4.8 --- .../Applications/ui/screens/audio/id3_meta.c | 249 +++++++ .../ui/screens/audio/include/id3_meta.h | 68 ++ .../ui/screens/audio/include/mp3_player_ui.h | 52 ++ .../ui/screens/audio/include/wav_library_ui.h | 15 +- .../ui/screens/audio/include/wav_player_ui.h | 7 + .../ui/screens/audio/mp3_player_ui.c | 666 ++++++++++++++++++ .../ui/screens/audio/wav_library_ui.c | 66 +- .../ui/screens/audio/wav_player_ui.c | 57 +- 8 files changed, 1128 insertions(+), 52 deletions(-) create mode 100644 firmware_p4/components/Applications/ui/screens/audio/id3_meta.c create mode 100644 firmware_p4/components/Applications/ui/screens/audio/include/id3_meta.h create mode 100644 firmware_p4/components/Applications/ui/screens/audio/include/mp3_player_ui.h create mode 100644 firmware_p4/components/Applications/ui/screens/audio/mp3_player_ui.c diff --git a/firmware_p4/components/Applications/ui/screens/audio/id3_meta.c b/firmware_p4/components/Applications/ui/screens/audio/id3_meta.c new file mode 100644 index 000000000..2780c33f8 --- /dev/null +++ b/firmware_p4/components/Applications/ui/screens/audio/id3_meta.c @@ -0,0 +1,249 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#include "id3_meta.h" + +#include +#include +#include + +#define ID3_MAX_TAG (2u * 1024u * 1024u) +#define ID3_MAX_COVER (4u * 1024u * 1024u) + +static uint32_t syncsafe32(const uint8_t *p) { + return ((uint32_t)(p[0] & 0x7f) << 21) | ((uint32_t)(p[1] & 0x7f) << 14) | + ((uint32_t)(p[2] & 0x7f) << 7) | (uint32_t)(p[3] & 0x7f); +} +static uint32_t be32(const uint8_t *p) { + return ((uint32_t)p[0] << 24) | ((uint32_t)p[1] << 16) | ((uint32_t)p[2] << 8) | (uint32_t)p[3]; +} +static uint32_t be24(const uint8_t *p) { + return ((uint32_t)p[0] << 16) | ((uint32_t)p[1] << 8) | (uint32_t)p[2]; +} + +static void copy_text(char *dst, size_t dstcap, const uint8_t *data, uint32_t len) { + if (dstcap == 0 || len < 1) + return; + uint8_t enc = data[0]; + const uint8_t *s = data + 1; + uint32_t n = len - 1; + size_t o = 0; + if (enc == 1 || enc == 2) { + for (uint32_t i = 0; i + 1 <= n && o < dstcap - 1; i += 2) { + uint8_t lo = s[i]; + uint8_t hi = (i + 1 < n) ? s[i + 1] : 0; + if (lo == 0xFF || lo == 0xFE) + continue; + if (hi == 0 && lo >= 0x20 && lo < 0x7F) + dst[o++] = (char)lo; + } + } else { + for (uint32_t i = 0; i < n && o < dstcap - 1; i++) { + if (s[i] == 0) + break; + dst[o++] = (char)s[i]; + } + } + dst[o] = '\0'; +} + +static void handle_pic(const uint8_t *frame_data, uint32_t len, long file_base, bool v22, + id3_meta_t *out) { + if (len < 4) + return; + uint8_t enc = frame_data[0]; + uint32_t i = 1; + id3_cover_fmt_t fmt = ID3_COVER_JPEG; + + if (v22) { + if (len < 1 + 3 + 1) + return; + if (memcmp(frame_data + 1, "PNG", 3) == 0) + fmt = ID3_COVER_PNG; + else + fmt = ID3_COVER_JPEG; + i = 1 + 3; + } else { + uint32_t m = i; + while (m < len && frame_data[m] != 0) + m++; + if (m >= len) + return; + if ((m - i) >= 9 && memcmp(frame_data + i, "image/png", 9) == 0) + fmt = ID3_COVER_PNG; + else + fmt = ID3_COVER_JPEG; + i = m + 1; + } + + if (i >= len) + return; + i += 1; + + if (enc == 1 || enc == 2) { + while (i + 1 < len && !(frame_data[i] == 0 && frame_data[i + 1] == 0)) + i += 2; + i += 2; + } else { + while (i < len && frame_data[i] != 0) + i++; + i += 1; + } + if (i >= len) + return; + + out->cover_fmt = fmt; + out->cover_off = file_base + (long)i; + out->cover_size = len - i; +} + +bool id3_meta_parse(const char *path, id3_meta_t *out) { + if (path == NULL || out == NULL) + return false; + memset(out, 0, sizeof(*out)); + out->cover_fmt = ID3_COVER_NONE; + + FILE *f = fopen(path, "rb"); + if (f == NULL) + return false; + + uint8_t h[10]; + if (fread(h, 1, 10, f) != 10) { + fclose(f); + return false; + } + if (memcmp(h, "ID3", 3) != 0 || h[3] == 0xFF || h[4] == 0xFF) { + fclose(f); + out->audio_off = 0; + return true; + } + + int major = h[3]; + uint8_t flags = h[5]; + uint32_t tag_size = syncsafe32(h + 6); + out->audio_off = 10 + (long)tag_size + ((flags & 0x10) ? 10 : 0); + + if (tag_size == 0 || tag_size > ID3_MAX_TAG) { + fclose(f); + return true; + } + + uint8_t *buf = malloc(tag_size); + if (buf == NULL) { + fclose(f); + return true; + } + if (fread(buf, 1, tag_size, f) != tag_size) { + free(buf); + fclose(f); + return true; + } + fclose(f); + + uint32_t p = 0; + if (flags & 0x40) { + if (major == 4) { + if (tag_size >= 4) + p += syncsafe32(buf); + } else if (major == 3) { + if (tag_size >= 4) + p += 4 + be32(buf); + } + if (p >= tag_size) { + free(buf); + return true; + } + } + + bool v22 = (major == 2); + uint32_t id_len = v22 ? 3 : 4; + uint32_t sz_len = v22 ? 3 : 4; + uint32_t hdr_len = v22 ? 6 : 10; + + while (p + hdr_len <= tag_size) { + const uint8_t *id = buf + p; + if (id[0] == 0) + break; + + uint32_t fsize; + if (v22) + fsize = be24(buf + p + id_len); + else if (major == 4) + fsize = syncsafe32(buf + p + id_len); + else + fsize = be32(buf + p + id_len); + + uint32_t data_off = p + hdr_len; + if (fsize == 0 || data_off + fsize > tag_size) + break; + const uint8_t *data = buf + data_off; + long file_base = 10 + (long)data_off; + + if (v22) { + if (memcmp(id, "TT2", 3) == 0) + copy_text(out->title, sizeof(out->title), data, fsize); + else if (memcmp(id, "TP1", 3) == 0) + copy_text(out->artist, sizeof(out->artist), data, fsize); + else if (memcmp(id, "TAL", 3) == 0) + copy_text(out->album, sizeof(out->album), data, fsize); + else if (memcmp(id, "TYE", 3) == 0) + copy_text(out->year, sizeof(out->year), data, fsize); + else if (memcmp(id, "PIC", 3) == 0) + handle_pic(data, fsize, file_base, true, out); + } else { + if (memcmp(id, "TIT2", 4) == 0) + copy_text(out->title, sizeof(out->title), data, fsize); + else if (memcmp(id, "TPE1", 4) == 0) + copy_text(out->artist, sizeof(out->artist), data, fsize); + else if (memcmp(id, "TALB", 4) == 0) + copy_text(out->album, sizeof(out->album), data, fsize); + else if (memcmp(id, "TYER", 4) == 0 || memcmp(id, "TDRC", 4) == 0) + copy_text(out->year, sizeof(out->year), data, fsize); + else if (memcmp(id, "APIC", 4) == 0) + handle_pic(data, fsize, file_base, false, out); + } + + p = data_off + fsize; + (void)sz_len; + } + + free(buf); + return true; +} + +uint8_t *id3_meta_read_cover(const char *path, const id3_meta_t *m, uint32_t *out_size) { + if (path == NULL || m == NULL || m->cover_fmt == ID3_COVER_NONE || m->cover_size == 0) + return NULL; + if (m->cover_size > ID3_MAX_COVER) + return NULL; + + FILE *f = fopen(path, "rb"); + if (f == NULL) + return NULL; + uint8_t *buf = malloc(m->cover_size); + if (buf == NULL) { + fclose(f); + return NULL; + } + if (fseek(f, m->cover_off, SEEK_SET) != 0 || fread(buf, 1, m->cover_size, f) != m->cover_size) { + free(buf); + fclose(f); + return NULL; + } + fclose(f); + if (out_size) + *out_size = m->cover_size; + return buf; +} diff --git a/firmware_p4/components/Applications/ui/screens/audio/include/id3_meta.h b/firmware_p4/components/Applications/ui/screens/audio/include/id3_meta.h new file mode 100644 index 000000000..cfb496e3a --- /dev/null +++ b/firmware_p4/components/Applications/ui/screens/audio/include/id3_meta.h @@ -0,0 +1,68 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#ifndef ID3_META_H +#define ID3_META_H + +#ifdef __cplusplus +extern "C" { +#endif + +#include +#include + +/** + * @brief Embedded cover-art image format. + */ +typedef enum { + ID3_COVER_NONE = 0, + ID3_COVER_JPEG, + ID3_COVER_PNG, +} id3_cover_fmt_t; + +/** + * @brief Parsed ID3v2 tag. Strings are always NUL-terminated (empty if absent). + */ +typedef struct { + char title[64]; /**< TIT2 / TT2 */ + char artist[64]; /**< TPE1 / TP1 */ + char album[64]; /**< TALB / TAL */ + char year[8]; /**< TYER / TDRC / TYE */ + + id3_cover_fmt_t cover_fmt; /**< Embedded cover-art format (APIC / PIC). Read with id3_meta_read_cover(). */ + long cover_off; /**< Absolute file offset of the image bytes (0 if none). */ + uint32_t cover_size; /**< Size of the image blob in bytes. */ + + long audio_off; /**< File offset where audio begins, right after the ID3v2 tag; a decoder should fseek here before searching for the first MP3 frame sync word. */ +} id3_meta_t; + +/** + * @brief Parse the ID3v2 tag at the head of an .mp3 file. Reads only the tag + * (bounded), never the audio. Self-contained, no library. On a file with + * no ID3v2 tag it still succeeds with empty strings and audio_off = 0. + */ +bool id3_meta_parse(const char *path, id3_meta_t *out); + +/** + * @brief Read the embedded cover-art blob into a freshly malloc'd buffer that + * the caller must free(). NULL if there is no cover or on error. + */ +uint8_t *id3_meta_read_cover(const char *path, const id3_meta_t *m, uint32_t *out_size); + +#ifdef __cplusplus +} +#endif + +#endif // ID3_META_H diff --git a/firmware_p4/components/Applications/ui/screens/audio/include/mp3_player_ui.h b/firmware_p4/components/Applications/ui/screens/audio/include/mp3_player_ui.h new file mode 100644 index 000000000..1d02f02b9 --- /dev/null +++ b/firmware_p4/components/Applications/ui/screens/audio/include/mp3_player_ui.h @@ -0,0 +1,52 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#ifndef MP3_PLAYER_UI_H +#define MP3_PLAYER_UI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Set the .mp3 file to play. Call BEFORE switching to SCREEN_MP3_PLAYER + * (e.g. from the Files screen). The string is copied. + */ +void ui_mp3_player_set_path(const char *path); + +/** @brief Set the screen to return to on BACK (as a screen_id_t value). */ +void ui_mp3_player_set_return(int screen); + +/** + * @brief Bind to the Player library at index @p index (playlist mode) so + * prev/next and auto-advance navigate the shared wav+mp3 list. Call AFTER + * ui_mp3_player_set_path() (which resets to standalone) and before opening. + */ +void ui_mp3_player_set_index(int index); + +/** @brief Open the MP3 player: parses ID3 + cover, shows them, starts playback. */ +void ui_mp3_player_open(void); + +/** + * @brief Stop playback and release the I2S channel, waiting for the decode task + * to exit. Registered as the screen close hook for clean navigation/handoff. + */ +void ui_mp3_player_stop(void); + +#ifdef __cplusplus +} +#endif + +#endif // MP3_PLAYER_UI_H diff --git a/firmware_p4/components/Applications/ui/screens/audio/include/wav_library_ui.h b/firmware_p4/components/Applications/ui/screens/audio/include/wav_library_ui.h index 098bbb1eb..832558b64 100644 --- a/firmware_p4/components/Applications/ui/screens/audio/include/wav_library_ui.h +++ b/firmware_p4/components/Applications/ui/screens/audio/include/wav_library_ui.h @@ -20,9 +20,22 @@ extern "C" { #endif -/** @brief Open the audio player library: lists every .wav on the SD card. */ +#include + +/** @brief Open the audio player library: lists every .wav / .mp3 on the SD card. */ void ui_wav_library_open(void); +/** @brief True if track @p i is an .mp3 (else it is a .wav). */ +bool ui_wav_library_is_mp3(int i); + +/** + * @brief Play library track @p i in the correct player (wav or mp3), wrapping + * the index. Used by both players for prev/next and auto-advance so + * navigation flows seamlessly across a mixed wav+mp3 list. @p return_screen + * is a screen_id_t value the opened player returns to on BACK. + */ +void ui_player_play_index(int i, int return_screen); + /** @brief Number of .wav tracks found on the last scan. */ int ui_wav_library_count(void); diff --git a/firmware_p4/components/Applications/ui/screens/audio/include/wav_player_ui.h b/firmware_p4/components/Applications/ui/screens/audio/include/wav_player_ui.h index b3597e339..f6e42a33e 100644 --- a/firmware_p4/components/Applications/ui/screens/audio/include/wav_player_ui.h +++ b/firmware_p4/components/Applications/ui/screens/audio/include/wav_player_ui.h @@ -46,6 +46,13 @@ void ui_wav_player_set_return(int screen); /** @brief Open the WAV player screen and start streaming the set path. */ void ui_wav_player_open(void); +/** + * @brief Stop playback and release the I2S channel, waiting for the decode task + * to exit. Registered as the screen close hook so navigating away (or + * handing off to the MP3 player) tears down cleanly with no audio clash. + */ +void ui_wav_player_stop(void); + #ifdef __cplusplus } #endif diff --git a/firmware_p4/components/Applications/ui/screens/audio/mp3_player_ui.c b/firmware_p4/components/Applications/ui/screens/audio/mp3_player_ui.c new file mode 100644 index 000000000..d435d0c45 --- /dev/null +++ b/firmware_p4/components/Applications/ui/screens/audio/mp3_player_ui.c @@ -0,0 +1,666 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#ifndef MP3_AUDIO_DECODE +#define MP3_AUDIO_DECODE 1 +#endif + +#include "mp3_player_ui.h" + +#include +#include +#include +#include + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "sys_prio.h" + +#include "esp_log.h" +#include "st7789.h" + +#include "audio_i2s.h" +#include "tos_config.h" +#include "tos_storage_paths.h" +#include "id3_meta.h" +#include "media_thumb.h" +#include "wav_library_ui.h" +#include "ui_chrome.h" +#include "ui_feedback.h" +#include "ui_manager.h" +#include "ui_theme.h" + +#if MP3_AUDIO_DECODE +#include "mp3dec.h" +#endif + +#define PATH_MAX_LEN 256 +#define REFRESH_TIMER_MS 60 +#define N_BARS 12 +#define BAR_W 9 +#define SPEC_H 58 +#define COVER_BOX 118 +#define READBUF_SZ 4096 +#define MP3_MAXFRAME 2304 +#define VOL_STEP 10 +#define VOL_DEFAULT 80 +#define ACC1 0x7A52D6 +#define ACC2 0xB89AFF + +#define PLAYER_TASK_STACK 12288 +#define PLAYER_TASK_PRIO SYS_PRIO_SERVICE_HI + +#define MP3_DEFAULT_RATE_HZ 44100 +#define MP3_SILENCE_SAMPLES 256 +#define MP3_STOP_WAIT_ITERS 80 +#define MP3_STOP_POLL_MS 10 + +static const char *TAG = "MP3_PLAYER"; + +static char s_path[PATH_MAX_LEN]; +static screen_id_t s_return = SCREEN_FILES; +static int s_index = -1; + +static lv_obj_t *s_screen = NULL; +static lv_obj_t *s_bars[N_BARS]; +static lv_obj_t *s_pfill = NULL; +static lv_obj_t *s_t_cur = NULL; +static lv_obj_t *s_t_tot = NULL; +static lv_obj_t *s_play_ic = NULL; +static lv_obj_t *s_fmt = NULL; +static lv_timer_t *s_refresh_timer = NULL; + +static media_thumb_t s_thumb; +static bool s_thumb_valid = false; +static uint8_t *s_png_blob = NULL; +static lv_image_dsc_t s_png_dsc; +static bool s_png_valid = false; +static id3_meta_t s_meta; + +static TaskHandle_t s_task = NULL; +static volatile bool s_task_run = false; +static volatile bool s_stop_req = false; +static volatile bool s_exit_req = false; +static volatile bool s_playing = false; +static volatile bool s_err = false; +static volatile bool s_finished = false; +static volatile int s_pos_sec = 0; +static volatile int s_total_sec = 0; +static volatile int s_level[N_BARS]; +static int s_vol = VOL_DEFAULT; +static bool s_vol_dirty = false; + +static void free_thumb(void) { + if (s_thumb_valid) { + media_thumb_free(&s_thumb); + s_thumb_valid = false; + } + if (s_png_blob != NULL) { + free(s_png_blob); + s_png_blob = NULL; + } + s_png_valid = false; +} + +static void load_cover(void) { + free_thumb(); + ESP_LOGI(TAG, "ID3 cover fmt=%d size=%u (1=JPEG 2=PNG 0=none)", (int)s_meta.cover_fmt, + (unsigned)s_meta.cover_size); + if (s_meta.cover_fmt == ID3_COVER_NONE || s_meta.cover_size == 0) + return; + uint32_t blob_len = 0; + uint8_t *blob = id3_meta_read_cover(s_path, &s_meta, &blob_len); + if (blob == NULL) + return; + if (s_meta.cover_fmt == ID3_COVER_JPEG) { + s_thumb_valid = media_thumb_decode_jpeg(blob, blob_len, &s_thumb); + ESP_LOGI(TAG, "JPEG cover decode %s", s_thumb_valid ? "OK" : "FAILED"); + free(blob); + } else { + s_png_blob = blob; + memset(&s_png_dsc, 0, sizeof(s_png_dsc)); + s_png_dsc.header.magic = LV_IMAGE_HEADER_MAGIC; + s_png_dsc.header.cf = LV_COLOR_FORMAT_RAW; + s_png_dsc.data = s_png_blob; + s_png_dsc.data_size = blob_len; + s_png_valid = true; + ESP_LOGI(TAG, "PNG cover queued (%u bytes)", (unsigned)blob_len); + } +} + +static void fmt_time(char *out, size_t n, int sec) { + if (sec < 0) + sec = 0; + snprintf(out, n, "%d:%02d", sec / 60, sec % 60); +} + +#if MP3_AUDIO_DECODE +static void compute_bars(const int16_t *mono, int n) { + if (n <= 0) + return; + for (int b = 0; b < N_BARS; b++) { + int a = (b * n) / N_BARS; + int z = ((b + 1) * n) / N_BARS; + if (z <= a) { + s_level[b] = 0; + continue; + } + uint64_t sumsq = 0; + for (int i = a; i < z; i++) { + int32_t v = mono[i]; + sumsq += (uint64_t)(v * v); + } + int rms = (int)sqrt((double)(sumsq / (z - a))); + int pct = (rms * 130) / 32768; + if (pct > 100) + pct = 100; + s_level[b] = pct; + } +} +#endif + +static void exit_cb(void *p) { + (void)p; + ui_switch_screen(s_return); +} + +static void player_task(void *arg) { + (void)arg; +#if MP3_AUDIO_DECODE + FILE *f = fopen(s_path, "rb"); + HMP3Decoder dec = NULL; + uint8_t *readbuf = malloc(READBUF_SZ); + int16_t *pcm = malloc(MP3_MAXFRAME * sizeof(int16_t)); + int16_t *mono = malloc((MP3_MAXFRAME / 2 + 4) * sizeof(int16_t)); + if (f != NULL) + dec = MP3InitDecoder(); + if (f == NULL || dec == NULL || readbuf == NULL || pcm == NULL || mono == NULL) { + if (dec) + MP3FreeDecoder(dec); + free(readbuf); + free(pcm); + free(mono); + if (f) + fclose(f); + s_err = true; + s_task_run = false; + s_task = NULL; + vTaskDelete(NULL); + return; + } + + long audio_off = s_meta.audio_off > 0 ? s_meta.audio_off : 0; + fseek(f, 0, SEEK_END); + long fsize = ftell(f); + fseek(f, audio_off, SEEK_SET); + + uint8_t *rp = readbuf; + int left = 0; + bool started = false; + bool eof = false; + uint32_t rate = MP3_DEFAULT_RATE_HZ; + long samples_played = 0; + + while (!s_stop_req) { + if (!s_playing) { + if (started) { + memset(mono, 0, MP3_SILENCE_SAMPLES * sizeof(int16_t)); + audio_i2s_stream_write(mono, MP3_SILENCE_SAMPLES); + } else { + vTaskDelay(pdMS_TO_TICKS(20)); + } + continue; + } + + if (left < 2 * 512) { + if (rp != readbuf && left > 0) + memmove(readbuf, rp, left); + rp = readbuf; + size_t got = fread(readbuf + left, 1, READBUF_SZ - left, f); + left += (int)got; + if (got == 0) + eof = true; + if (eof && left < 4) + break; + } + + int off = MP3FindSyncWord(rp, left); + if (off < 0) { + if (eof) + break; + left = 0; + continue; + } + rp += off; + left -= off; + + int err = MP3Decode(dec, &rp, &left, pcm, 0); + if (err != 0) { + if (err == ERR_MP3_INDATA_UNDERFLOW || err == ERR_MP3_MAINDATA_UNDERFLOW) { + if (eof) + break; + if (left > 0) { + memmove(readbuf, rp, left); + rp = readbuf; + } + continue; + } + if (left > 0) { + rp++; + left--; + } + continue; + } + + MP3FrameInfo fi; + MP3GetLastFrameInfo(dec, &fi); + if (fi.samprate <= 0 || fi.nChans <= 0 || fi.outputSamps <= 0) + continue; + + if (!started) { + rate = (uint32_t)fi.samprate; + if (audio_i2s_stream_start(rate) != ESP_OK) { + s_err = true; + break; + } + started = true; + if (fi.bitrate > 0) + s_total_sec = (int)(((int64_t)(fsize - audio_off) * 8) / fi.bitrate); + } + + int frames = fi.outputSamps / fi.nChans; + if (frames > MP3_MAXFRAME / 2) + frames = MP3_MAXFRAME / 2; + if (fi.nChans == 2) { + for (int i = 0; i < frames; i++) { + int l = pcm[2 * i]; + int r = pcm[2 * i + 1]; + mono[i] = (int16_t)((l + r) / 2); + } + } else { + for (int i = 0; i < frames; i++) + mono[i] = pcm[i]; + } + compute_bars(mono, frames); + audio_i2s_stream_write(mono, frames); + samples_played += frames; + s_pos_sec = (int)(samples_played / (rate > 0 ? rate : MP3_DEFAULT_RATE_HZ)); + } + + if (started) + audio_i2s_stream_stop(); + MP3FreeDecoder(dec); + free(readbuf); + free(pcm); + free(mono); + fclose(f); +#else + s_err = true; +#endif + + for (int i = 0; i < N_BARS; i++) + s_level[i] = 0; + if (!s_stop_req) + s_finished = true; + s_playing = false; + s_task_run = false; + s_task = NULL; + if (s_exit_req) { + s_exit_req = false; + ui_async_call(exit_cb, NULL); + } + vTaskDelete(NULL); +} + +static void start_playback(void) { + if (s_task_run) + return; + s_stop_req = false; + s_finished = false; + s_err = false; + s_pos_sec = 0; + s_playing = true; + for (int i = 0; i < N_BARS; i++) + s_level[i] = 0; + s_task_run = true; + if (xTaskCreatePinnedToCore(player_task, "mp3_play", PLAYER_TASK_STACK, NULL, + PLAYER_TASK_PRIO, &s_task, SYS_CORE_UI) != pdPASS) { + s_task_run = false; + s_err = true; + } +} + +static void mp3_input(const input_event_t *ev, void *ctx) { + (void)ctx; + if (ev->action != INPUT_ACTION_PRESS && ev->action != INPUT_ACTION_REPEAT) + return; + const bool press = (ev->action == INPUT_ACTION_PRESS); + + switch (ev->button) { + case INPUT_BTN_BACK: + if (press) + ui_switch_screen(s_return); + break; + case INPUT_BTN_RIGHT: + if (press && s_index >= 0) + ui_player_play_index(s_index + 1, s_return); + break; + case INPUT_BTN_LEFT: + if (press && s_index >= 0) + ui_player_play_index(s_index - 1, s_return); + break; + case INPUT_BTN_OK: + if (press) { + if (!s_task_run || s_finished) + start_playback(); + else + s_playing = !s_playing; + ui_feedback(UI_FB_SELECT); + } + break; + case INPUT_BTN_DOWN: + s_vol = (s_vol > VOL_STEP) ? s_vol - VOL_STEP : 0; + s_vol_dirty = true; + audio_i2s_set_volume((uint8_t)s_vol); + ui_feedback(UI_FB_NAV); + break; + case INPUT_BTN_UP: + s_vol = (s_vol + VOL_STEP < 100) ? s_vol + VOL_STEP : 100; + s_vol_dirty = true; + audio_i2s_set_volume((uint8_t)s_vol); + ui_feedback(UI_FB_NAV); + break; + default: + break; + } +} + +static void refresh_cb(lv_timer_t *t) { + if (lv_screen_active() != s_screen) { + lv_timer_delete(t); + s_refresh_timer = NULL; + return; + } + if (s_finished) { + s_finished = false; + if (s_index >= 0) + ui_player_play_index(s_index + 1, s_return); + else + start_playback(); + return; + } + for (int i = 0; i < N_BARS; i++) { + if (s_bars[i]) + lv_obj_set_height(s_bars[i], lv_pct(s_level[i] < 3 ? 3 : s_level[i])); + } + int tot = s_total_sec > 0 ? s_total_sec : 1; + int pct = (s_pos_sec * 100) / tot; + if (pct > 100) + pct = 100; + if (s_pfill) + lv_obj_set_width(s_pfill, lv_pct(pct)); + char b[12]; + fmt_time(b, sizeof(b), s_pos_sec); + lv_label_set_text(s_t_cur, b); + fmt_time(b, sizeof(b), s_total_sec); + lv_label_set_text(s_t_tot, b); + if (s_play_ic) + lv_label_set_text(s_play_ic, (s_playing && !s_finished) ? LV_SYMBOL_PAUSE : LV_SYMBOL_PLAY); + if (s_fmt && s_err) { + lv_label_set_text(s_fmt, MP3_AUDIO_DECODE ? "decode error" : "playback: enable esp-audio-libs"); + lv_obj_set_style_text_color(s_fmt, lv_color_hex(0xFF5252), 0); + } +} + +void ui_mp3_player_set_path(const char *path) { + s_index = -1; + if (path == NULL) { + s_path[0] = '\0'; + return; + } + strncpy(s_path, path, sizeof(s_path) - 1); + s_path[sizeof(s_path) - 1] = '\0'; +} + +void ui_mp3_player_set_return(int screen) { + s_return = (screen_id_t)screen; +} + +void ui_mp3_player_set_index(int index) { + s_index = index; +} + +void ui_mp3_player_stop(void) { + if (s_task_run) { + s_stop_req = true; + for (int i = 0; i < MP3_STOP_WAIT_ITERS && s_task_run; i++) + vTaskDelay(pdMS_TO_TICKS(MP3_STOP_POLL_MS)); + } + if (s_vol_dirty) { + g_config_system.volume = s_vol; + tos_config_save(TOS_PATH_CONFIG_SYSTEM, "system"); + s_vol_dirty = false; + } +} + +static lv_obj_t *mk_label(lv_obj_t *parent, const char *txt, const lv_font_t *font, lv_color_t col, + int width) { + lv_obj_t *l = lv_label_create(parent); + lv_label_set_text(l, txt); + lv_obj_set_style_text_font(l, font, 0); + lv_obj_set_style_text_color(l, col, 0); + if (width > 0) { + lv_obj_set_width(l, width); + lv_label_set_long_mode(l, LV_LABEL_LONG_DOT); + lv_obj_set_style_text_align(l, LV_TEXT_ALIGN_CENTER, 0); + } + return l; +} + +static lv_obj_t *transport_btn(lv_obj_t *parent, const char *sym, bool primary) { + lv_obj_t *b = lv_obj_create(parent); + int d = primary ? 46 : 32; + lv_obj_set_size(b, d, d); + lv_obj_remove_flag(b, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_style_radius(b, LV_RADIUS_CIRCLE, 0); + lv_obj_set_style_border_width(b, 0, 0); + lv_obj_set_style_pad_all(b, 0, 0); + if (primary) { + lv_obj_set_style_bg_color(b, lv_color_hex(ACC2), 0); + lv_obj_set_style_bg_grad_color(b, lv_color_hex(ACC1), 0); + lv_obj_set_style_bg_grad_dir(b, LV_GRAD_DIR_VER, 0); + lv_obj_set_style_bg_opa(b, LV_OPA_COVER, 0); + lv_obj_set_style_shadow_width(b, 14, 0); + lv_obj_set_style_shadow_color(b, lv_color_hex(ACC1), 0); + lv_obj_set_style_shadow_opa(b, LV_OPA_40, 0); + } else { + lv_obj_set_style_bg_opa(b, LV_OPA_TRANSP, 0); + lv_obj_set_style_shadow_width(b, 0, 0); + } + lv_obj_t *l = lv_label_create(b); + lv_label_set_text(l, sym); + lv_obj_set_style_text_font(l, &lv_font_montserrat_14, 0); + lv_obj_set_style_text_color(l, primary ? lv_color_hex(0x0A0220) : current_theme.text_secondary, 0); + lv_obj_center(l); + return l; +} + +void ui_mp3_player_open(void) { + if (s_screen != NULL) { + lv_obj_del(s_screen); + s_screen = NULL; + } + + if (s_index >= 0) { + const char *p = ui_wav_library_path(s_index); + if (p != NULL) { + strncpy(s_path, p, sizeof(s_path) - 1); + s_path[sizeof(s_path) - 1] = '\0'; + ui_wav_library_set_selected(s_index); + } else { + s_index = -1; + } + } + + memset(&s_meta, 0, sizeof(s_meta)); + id3_meta_parse(s_path, &s_meta); + load_cover(); + + s_screen = lv_obj_create(NULL); + lv_obj_set_style_bg_color(s_screen, current_theme.screen_base, 0); + lv_obj_set_style_bg_opa(s_screen, LV_OPA_COVER, 0); + lv_obj_remove_flag(s_screen, LV_OBJ_FLAG_SCROLLABLE); + + ui_chrome_header(s_screen, "PLAYING", "/assets/icons/music_note.bin"); + ui_chrome_footer(s_screen, LV_SYMBOL_UP LV_SYMBOL_DOWN " vol OK play BACK exit"); + + lv_obj_t *body = lv_obj_create(s_screen); + lv_obj_remove_style_all(body); + lv_obj_set_size(body, 224, LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); + lv_obj_align(body, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); + lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_flex_flow(body, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_align(body, LV_FLEX_ALIGN_SPACE_EVENLY, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_set_style_pad_hor(body, 6, 0); + lv_obj_set_style_pad_ver(body, 6, 0); + + lv_obj_t *cover = lv_obj_create(body); + lv_obj_remove_style_all(cover); + lv_obj_set_size(cover, COVER_BOX, COVER_BOX); + lv_obj_remove_flag(cover, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_style_radius(cover, 14, 0); + lv_obj_set_style_clip_corner(cover, true, 0); + lv_obj_set_style_bg_color(cover, current_theme.bg_secondary, 0); + lv_obj_set_style_bg_opa(cover, LV_OPA_COVER, 0); + lv_obj_set_style_border_width(cover, 1, 0); + lv_obj_set_style_border_color(cover, current_theme.border_inactive, 0); + lv_obj_set_style_shadow_width(cover, 26, 0); + lv_obj_set_style_shadow_color(cover, lv_color_hex(ACC1), 0); + lv_obj_set_style_shadow_opa(cover, LV_OPA_40, 0); + const lv_image_dsc_t *cover_src = NULL; + int cw = 0, ch = 0; + if (s_thumb_valid && s_thumb.w > 0 && s_thumb.h > 0) { + cover_src = &s_thumb.dsc; + cw = s_thumb.w; + ch = s_thumb.h; + } else if (s_png_valid) { + cover_src = &s_png_dsc; + lv_image_header_t hdr = {0}; + if (lv_image_decoder_get_info(&s_png_dsc, &hdr) == LV_RESULT_OK) { + cw = hdr.w; + ch = hdr.h; + } + } + if (cover_src != NULL) { + lv_obj_t *img = lv_image_create(cover); + lv_image_set_src(img, cover_src); + lv_obj_center(img); + int longest = cw > ch ? cw : ch; + if (longest > 0) { + int zoom = (COVER_BOX * 256) / longest; + if (zoom < 1) + zoom = 1; + lv_image_set_scale(img, (uint16_t)zoom); + } + } else { + lv_obj_t *ph = lv_label_create(cover); + lv_label_set_text(ph, LV_SYMBOL_AUDIO); + lv_obj_set_style_text_font(ph, &lv_font_montserrat_14, 0); + lv_obj_set_style_text_color(ph, current_theme.text_secondary, 0); + lv_obj_center(ph); + } + + const char *slash = strrchr(s_path, '/'); + const char *fallback = s_path[0] ? (slash ? slash + 1 : s_path) : "no file"; + lv_obj_t *fname = lv_label_create(body); + lv_label_set_text(fname, s_meta.title[0] ? s_meta.title : fallback); + lv_label_set_long_mode(fname, LV_LABEL_LONG_DOT); + lv_obj_set_width(fname, 204); + lv_obj_set_style_text_align(fname, LV_TEXT_ALIGN_CENTER, 0); + lv_obj_set_style_text_font(fname, &lv_font_montserrat_14, 0); + lv_obj_set_style_text_color(fname, current_theme.text_main, 0); + + char info[128] = ""; + if (s_meta.artist[0]) + snprintf(info, sizeof(info), "%s", s_meta.artist); + if (s_meta.album[0]) { + size_t k = strlen(info); + snprintf(info + k, sizeof(info) - k, "%s%s", info[0] ? " | " : "", s_meta.album); + } + if (s_meta.year[0]) { + size_t k = strlen(info); + snprintf(info + k, sizeof(info) - k, "%s%s", info[0] ? " | " : "", s_meta.year); + } + s_fmt = lv_label_create(body); + lv_label_set_text(s_fmt, info[0] ? info : "MP3"); + lv_label_set_long_mode(s_fmt, LV_LABEL_LONG_DOT); + lv_obj_set_width(s_fmt, 204); + lv_obj_set_style_text_align(s_fmt, LV_TEXT_ALIGN_CENTER, 0); + lv_obj_set_style_text_font(s_fmt, &lv_font_montserrat_12, 0); + lv_obj_set_style_text_color(s_fmt, lv_color_hex(0x00E5D0), 0); + + lv_obj_t *prog = lv_obj_create(body); + lv_obj_remove_style_all(prog); + lv_obj_set_size(prog, 200, LV_SIZE_CONTENT); + lv_obj_remove_flag(prog, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_flex_flow(prog, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_align(prog, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_set_style_pad_row(prog, 3, 0); + lv_obj_t *track = lv_obj_create(prog); + lv_obj_remove_style_all(track); + lv_obj_set_size(track, 200, 5); + lv_obj_set_style_radius(track, 3, 0); + lv_obj_set_style_bg_color(track, current_theme.border_inactive, 0); + lv_obj_set_style_bg_opa(track, LV_OPA_COVER, 0); + s_pfill = lv_obj_create(track); + lv_obj_remove_style_all(s_pfill); + lv_obj_set_height(s_pfill, lv_pct(100)); + lv_obj_set_width(s_pfill, lv_pct(0)); + lv_obj_align(s_pfill, LV_ALIGN_LEFT_MID, 0, 0); + lv_obj_set_style_radius(s_pfill, 3, 0); + lv_obj_set_style_bg_color(s_pfill, lv_color_hex(ACC1), 0); + lv_obj_set_style_bg_grad_color(s_pfill, lv_color_hex(ACC2), 0); + lv_obj_set_style_bg_grad_dir(s_pfill, LV_GRAD_DIR_HOR, 0); + lv_obj_set_style_bg_opa(s_pfill, LV_OPA_COVER, 0); + lv_obj_t *trow = lv_obj_create(prog); + lv_obj_remove_style_all(trow); + lv_obj_set_size(trow, 200, LV_SIZE_CONTENT); + lv_obj_set_flex_flow(trow, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(trow, LV_FLEX_ALIGN_SPACE_BETWEEN, LV_FLEX_ALIGN_CENTER, + LV_FLEX_ALIGN_CENTER); + s_t_cur = mk_label(trow, "0:00", &lv_font_montserrat_12, current_theme.text_main, 0); + s_t_tot = mk_label(trow, "0:00", &lv_font_montserrat_12, current_theme.text_main, 0); + + lv_obj_t *ctrls = lv_obj_create(body); + lv_obj_remove_style_all(ctrls); + lv_obj_set_size(ctrls, 180, 50); + lv_obj_remove_flag(ctrls, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_flex_flow(ctrls, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(ctrls, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_set_style_pad_column(ctrls, 20, 0); + transport_btn(ctrls, LV_SYMBOL_PREV, false); + s_play_ic = transport_btn(ctrls, LV_SYMBOL_PAUSE, true); + transport_btn(ctrls, LV_SYMBOL_NEXT, false); + + s_vol = g_config_system.volume; + s_vol_dirty = false; + audio_i2s_set_volume((uint8_t)s_vol); + ui_input_set_screen_handler(mp3_input, NULL); + if (s_refresh_timer == NULL) + s_refresh_timer = lv_timer_create(refresh_cb, REFRESH_TIMER_MS, NULL); + + start_playback(); + ui_screen_load_owned(&s_screen, s_screen); +} diff --git a/firmware_p4/components/Applications/ui/screens/audio/wav_library_ui.c b/firmware_p4/components/Applications/ui/screens/audio/wav_library_ui.c index 74320062a..956e70285 100644 --- a/firmware_p4/components/Applications/ui/screens/audio/wav_library_ui.c +++ b/firmware_p4/components/Applications/ui/screens/audio/wav_library_ui.c @@ -15,6 +15,8 @@ #include "wav_library_ui.h" +#include "esp_attr.h" + #include #include #include @@ -25,11 +27,13 @@ #include "assets_manager.h" #include "ui_chrome.h" #include "ui_feedback.h" +#include "mp3_player_ui.h" #include "ui_manager.h" #include "ui_theme.h" #include "wav_player_ui.h" #define SDCARD_ROOT "/sdcard" +#define ASSETS_ROOT "/assets" #define MAX_TRACKS 64 #define PATH_LEN 192 #define NAME_LEN 56 @@ -38,13 +42,12 @@ #define ROW_ICON "/assets/icons/music_note.bin" #define EMPTY_ICON "/assets/icons/sd_card.bin" -#define EMPTY_MSG "No .wav on SD card" +#define EMPTY_MSG "No music on SD card" #define EMPTY_SUB "Add tracks and reopen" #define CARD_W 200 #define CARD_H 132 #define BADGE_PX 56 #define ICON_PX 34 -#define DIM_COLOR 0x8A8594 #define LIST_PAD_SIDE 8 #define LIST_PAD_ROW 6 @@ -84,16 +87,21 @@ static int s_eq_phase = 0; static const uint8_t EQ_PAT[8] = {3, 7, 11, 15, 16, 12, 8, 4}; -static char s_paths[MAX_TRACKS][PATH_LEN]; -static char s_names[MAX_TRACKS][NAME_LEN]; +EXT_RAM_BSS_ATTR static char s_paths[MAX_TRACKS][PATH_LEN]; +EXT_RAM_BSS_ATTR static char s_names[MAX_TRACKS][NAME_LEN]; static int s_count = 0; static int s_sel = 0; static bool s_resume = false; static bool s_empty = false; -static bool is_wav(const char *name) { +static bool is_playable(const char *name) { const char *dot = strrchr(name, '.'); - return dot != NULL && strcasecmp(dot, ".wav") == 0; + return dot != NULL && (strcasecmp(dot, ".wav") == 0 || strcasecmp(dot, ".mp3") == 0); +} + +static bool name_is_mp3(const char *name) { + const char *dot = strrchr(name, '.'); + return dot != NULL && strcasecmp(dot, ".mp3") == 0; } static void scan_dir(const char *dir, int depth) { @@ -115,7 +123,7 @@ static void scan_dir(const char *dir, int depth) { strlcat(full, dn, sizeof(full)); if (ent->d_type == DT_DIR) { scan_dir(full, depth + 1); - } else if (is_wav(dn)) { + } else if (is_playable(dn)) { strncpy(s_paths[s_count], full, PATH_LEN - 1); s_paths[s_count][PATH_LEN - 1] = '\0'; strncpy(s_names[s_count], dn, NAME_LEN - 1); @@ -129,6 +137,7 @@ static void scan_dir(const char *dir, int depth) { static void scan_wavs(void) { s_count = 0; scan_dir(SDCARD_ROOT, 0); + scan_dir(ASSETS_ROOT, 0); } int ui_wav_library_count(void) { @@ -152,6 +161,31 @@ void ui_wav_library_set_selected(int i) { s_sel = i; } +bool ui_wav_library_is_mp3(int i) { + if (i < 0 || i >= s_count) + return false; + return name_is_mp3(s_paths[i]); +} + +void ui_player_play_index(int i, int return_screen) { + if (s_count <= 0) + return; + i = ((i % s_count) + s_count) % s_count; + s_sel = i; + s_resume = true; + if (name_is_mp3(s_paths[i])) { + ui_mp3_player_set_path(s_paths[i]); + ui_mp3_player_set_index(i); + ui_mp3_player_set_return(return_screen); + ui_switch_screen(SCREEN_MP3_PLAYER); + } else { + ui_wav_player_set_path(s_paths[i]); + ui_wav_player_set_index(i); + ui_wav_player_set_return(return_screen); + ui_switch_screen(SCREEN_WAV_PLAYER); + } +} + static void track_duration(int i, char *out, size_t n) { int total = DUR_BASE_S + i * DUR_STEP_S; snprintf(out, n, "%d:%02d", total / 60, total % 60); @@ -201,7 +235,7 @@ static void build_empty_card(void) { lv_obj_t *sub = lv_label_create(card); lv_label_set_text(sub, EMPTY_SUB); lv_obj_set_style_text_font(sub, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(sub, lv_color_hex(DIM_COLOR), 0); + lv_obj_set_style_text_color(sub, current_theme.text_secondary, 0); } static void split_name(const char *full, char *base, size_t bn, char *ext, size_t en) { @@ -274,8 +308,8 @@ static void style_row(int i, bool sel) { lv_obj_set_style_border_color(row, current_theme.border_inactive, 0); lv_obj_set_style_shadow_width(row, 0, 0); lv_obj_set_style_shadow_opa(row, LV_OPA_TRANSP, 0); - lv_obj_set_style_text_color(s_row_name[i], lv_color_hex(DIM_COLOR), 0); - lv_obj_set_style_text_color(s_row_val[i], lv_color_hex(DIM_COLOR), 0); + lv_obj_set_style_text_color(s_row_name[i], current_theme.text_secondary, 0); + lv_obj_set_style_text_color(s_row_val[i], current_theme.text_secondary, 0); } } @@ -401,7 +435,7 @@ static void build_list(void) { lv_obj_t *extl = lv_label_create(col); lv_label_set_text(extl, ext); lv_obj_set_style_text_font(extl, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(extl, lv_color_hex(DIM_COLOR), 0); + lv_obj_set_style_text_color(extl, current_theme.text_secondary, 0); char dur[DUR_BUF]; track_duration(i, dur, sizeof(dur)); @@ -418,16 +452,10 @@ static void build_list(void) { } static void play_selected(void) { - if (s_count <= 0) - return; - if (s_sel < 0 || s_sel >= s_count) + if (s_count <= 0 || s_sel < 0 || s_sel >= s_count) return; - s_resume = true; ui_feedback(UI_FB_SELECT); - ui_wav_player_set_path(s_paths[s_sel]); - ui_wav_player_set_index(s_sel); - ui_wav_player_set_return(SCREEN_PLAYER); - ui_switch_screen(SCREEN_WAV_PLAYER); + ui_player_play_index(s_sel, SCREEN_PLAYER); } static void wav_library_input(const input_event_t *ev, void *ctx) { diff --git a/firmware_p4/components/Applications/ui/screens/audio/wav_player_ui.c b/firmware_p4/components/Applications/ui/screens/audio/wav_player_ui.c index 275166a44..bb4d0fd4c 100644 --- a/firmware_p4/components/Applications/ui/screens/audio/wav_player_ui.c +++ b/firmware_p4/components/Applications/ui/screens/audio/wav_player_ui.c @@ -27,6 +27,8 @@ #include "st7789.h" #include "audio_i2s.h" +#include "tos_config.h" +#include "tos_storage_paths.h" #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" @@ -92,6 +94,7 @@ static volatile int s_i_rate = 0; static volatile int s_i_ch = 0; static volatile int s_i_bits = 0; static int s_vol = VOL_DEFAULT; +static bool s_vol_dirty = false; static uint32_t rd_u32(const uint8_t *p) { return (uint32_t)p[0] | ((uint32_t)p[1] << 8) | ((uint32_t)p[2] << 16) | ((uint32_t)p[3] << 24); @@ -264,7 +267,7 @@ static void player_task(void *arg) { s_task = NULL; if (s_exit_req) { s_exit_req = false; - lv_async_call(exit_to_files_cb, NULL); + ui_async_call(exit_to_files_cb, NULL); } vTaskDelete(NULL); } @@ -338,27 +341,6 @@ static void refresh_track_labels(void) { } } -static void play_index(int i) { - if (s_index >= 0) { - int n = ui_wav_library_count(); - if (n > 0) { - if (i < 0) - i = n - 1; - if (i >= n) - i = 0; - s_index = i; - const char *p = ui_wav_library_path(i); - if (p != NULL) { - strncpy(s_path, p, sizeof(s_path) - 1); - s_path[sizeof(s_path) - 1] = '\0'; - } - ui_wav_library_set_selected(i); - } - } - refresh_track_labels(); - start_playback(); -} - static void go_relative(int dir) { int n = pl_count(); if (n <= 1 || s_index < 0) { @@ -366,7 +348,7 @@ static void go_relative(int dir) { start_playback(); return; } - play_index((s_index + dir + n) % n); + ui_player_play_index(s_index + dir, s_return); } static void fmt_time(char *out, size_t n, int sec) { @@ -432,15 +414,8 @@ static void wav_player_input(const input_event_t *ev, void *ctx) { switch (ev->button) { case INPUT_BTN_BACK: - if (press) { - s_pending_play = false; - if (s_task_run) { - s_stop_req = true; - s_exit_req = true; - } else { - ui_switch_screen(s_return); - } - } + if (press) + ui_switch_screen(s_return); break; case INPUT_BTN_OK: if (press) { @@ -480,6 +455,7 @@ static void wav_player_input(const input_event_t *ev, void *ctx) { case INPUT_BTN_DOWN: if (nav) { s_vol = (s_vol > VOL_STEP) ? s_vol - VOL_STEP : 0; + s_vol_dirty = true; audio_i2s_set_volume((uint8_t)s_vol); ui_feedback(UI_FB_NAV); } @@ -487,6 +463,7 @@ static void wav_player_input(const input_event_t *ev, void *ctx) { case INPUT_BTN_UP: if (nav) { s_vol = (s_vol + VOL_STEP < 100) ? s_vol + VOL_STEP : 100; + s_vol_dirty = true; audio_i2s_set_volume((uint8_t)s_vol); ui_feedback(UI_FB_NAV); } @@ -540,6 +517,20 @@ void ui_wav_player_set_index(int index) { s_index = index; } +void ui_wav_player_stop(void) { + s_pending_play = false; + if (s_task_run) { + s_stop_req = true; + for (int i = 0; i < 80 && s_task_run; i++) + vTaskDelay(pdMS_TO_TICKS(10)); + } + if (s_vol_dirty) { + g_config_system.volume = s_vol; + tos_config_save(TOS_PATH_CONFIG_SYSTEM, "system"); + s_vol_dirty = false; + } +} + void ui_wav_player_open(void) { if (s_screen != NULL) { lv_obj_del(s_screen); @@ -699,6 +690,8 @@ void ui_wav_player_open(void) { refresh_track_labels(); + s_vol = g_config_system.volume; + s_vol_dirty = false; audio_i2s_set_volume((uint8_t)s_vol); start_playback(); From e29f52d1c4bd0b7c2083ad2e16c483282bfb2277 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:21:50 -0300 Subject: [PATCH 010/103] =?UTF-8?q?feat(storage):=20USB=20Mass=20Storage?= =?UTF-8?q?=20=E2=80=94=20expose=20the=20SD=20as=20a=20USB=20drive?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Turn the device into a USB drive to drop firmware/media onto the SD without a card reader: detach the app FAT -> expose the raw card over TinyUSB MSC (added to the native USB composite descriptor) -> restore on exit (graceful, no forced reboot). New screen under the Files menu. Co-Authored-By: Claude Opus 4.8 --- .../ui/screens/files/include/usb_storage_ui.h | 38 ++++ .../ui/screens/files/usb_storage_ui.c | 198 ++++++++++++++++++ .../Drivers/tusb_desc/include/tusb_desc.h | 9 + .../components/Drivers/tusb_desc/tusb_desc.c | 20 +- firmware_p4/components/Service/CMakeLists.txt | 2 + .../Service/storage_api/storage_impl.c | 2 +- .../Service/storage_vfs/include/usb_msc.h | 73 +++++++ .../Service/storage_vfs/include/vfs_sdcard.h | 17 ++ .../components/Service/storage_vfs/usb_msc.c | 89 ++++++++ .../Service/storage_vfs/vfs_sdcard.c | 65 ++++++ 10 files changed, 510 insertions(+), 3 deletions(-) create mode 100644 firmware_p4/components/Applications/ui/screens/files/include/usb_storage_ui.h create mode 100644 firmware_p4/components/Applications/ui/screens/files/usb_storage_ui.c create mode 100644 firmware_p4/components/Service/storage_vfs/include/usb_msc.h create mode 100644 firmware_p4/components/Service/storage_vfs/usb_msc.c diff --git a/firmware_p4/components/Applications/ui/screens/files/include/usb_storage_ui.h b/firmware_p4/components/Applications/ui/screens/files/include/usb_storage_ui.h new file mode 100644 index 000000000..71c32b401 --- /dev/null +++ b/firmware_p4/components/Applications/ui/screens/files/include/usb_storage_ui.h @@ -0,0 +1,38 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#ifndef USB_STORAGE_UI_H +#define USB_STORAGE_UI_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Open the USB Storage screen: exposes the microSD to a host PC as a USB + * drive. Reached from the Files root. BACK ejects and returns to Files + * WITHOUT rebooting. + */ +void ui_usb_storage_open(void); + +/** @brief Screen close hook: reboots only if it is torn down while the card is + * still exposed to the host (defensive; normal exit needs no reboot). */ +void ui_usb_storage_stop(void); + +#ifdef __cplusplus +} +#endif + +#endif // USB_STORAGE_UI_H diff --git a/firmware_p4/components/Applications/ui/screens/files/usb_storage_ui.c b/firmware_p4/components/Applications/ui/screens/files/usb_storage_ui.c new file mode 100644 index 000000000..71c64cd3f --- /dev/null +++ b/firmware_p4/components/Applications/ui/screens/files/usb_storage_ui.c @@ -0,0 +1,198 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#include "usb_storage_ui.h" + +#include "esp_log.h" +#include "esp_system.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +#include "lvgl.h" +#include "st7789.h" + +#include "assets_manager.h" +#include "sys_prio.h" +#include "ui_feedback.h" +#include "ui_manager.h" +#include "ui_theme.h" +#include "usb_msc.h" + +static const char *TAG = "USB_STORAGE_UI"; + +#define VIEW_W LCD_PANEL_W +#define VIEW_H LCD_PANEL_H + +#define COL_READY lv_color_hex(0x00BCD4) +#define COL_CONNECTED lv_color_hex(0x00E676) +#define COL_ERROR lv_color_hex(0xFF5252) + +#define USB_MSC_TASK_STACK 8192 +#define REFRESH_PERIOD_MS 200 + +static lv_obj_t *s_screen = NULL; +static lv_obj_t *s_status = NULL; +static lv_obj_t *s_hint = NULL; +static lv_timer_t *s_timer = NULL; +static volatile bool s_exit_requested = false; + +static void enter_task(void *a) { + (void)a; + usb_msc_enter(); + vTaskDelete(NULL); +} +static void exit_task(void *a) { + (void)a; + usb_msc_exit(); + vTaskDelete(NULL); +} + +static void set_texts(const char *status, lv_color_t col, const char *hint) { + if (s_status) { + lv_label_set_text(s_status, status); + lv_obj_set_style_text_color(s_status, col, 0); + } + if (s_hint) + lv_label_set_text(s_hint, hint); +} + +static void refresh_cb(lv_timer_t *t) { + if (lv_screen_active() != s_screen) { + lv_timer_delete(t); + s_timer = NULL; + return; + } + switch (usb_msc_get_state()) { + case USB_MSC_ACTIVE: + if (usb_msc_host_connected()) + set_texts("Connected", COL_CONNECTED, "Copy your files, then press BACK to eject."); + else + set_texts("Ready", COL_READY, "Open the drive on your PC.\nBACK ejects and returns."); + break; + case USB_MSC_ERROR: + set_texts("Couldn't start USB storage", COL_ERROR, "Press BACK to return."); + break; + case USB_MSC_EXITING: + set_texts("Ejecting...", current_theme.text_secondary, "Restoring the card."); + break; + case USB_MSC_IDLE: + if (s_exit_requested) + ui_switch_screen(SCREEN_FILES); + else + set_texts("Starting...", current_theme.text_secondary, "Preparing the USB drive."); + break; + case USB_MSC_ENTERING: + default: + set_texts("Starting...", current_theme.text_secondary, "Preparing the USB drive."); + break; + } +} + +static void usb_storage_input(const input_event_t *ev, void *ctx) { + (void)ctx; + if (ev->action != INPUT_ACTION_PRESS || ev->button != INPUT_BTN_BACK) + return; + switch (usb_msc_get_state()) { + case USB_MSC_ACTIVE: + s_exit_requested = true; + set_texts("Ejecting...", current_theme.text_secondary, "Restoring the card."); + ui_feedback(UI_FB_SELECT); + xTaskCreatePinnedToCore(exit_task, "usb_msc_x", USB_MSC_TASK_STACK, NULL, SYS_PRIO_SERVICE_HI, NULL, + SYS_CORE_RADIO); + break; + case USB_MSC_ERROR: + case USB_MSC_IDLE: + ui_switch_screen(SCREEN_FILES); + break; + default: + break; + } +} + +void ui_usb_storage_open(void) { + if (s_screen != NULL) { + lv_obj_del(s_screen); + s_screen = NULL; + } + s_exit_requested = false; + + s_screen = lv_obj_create(NULL); + lv_obj_remove_flag(s_screen, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_style_bg_color(s_screen, current_theme.bg_primary, 0); + lv_obj_set_style_bg_opa(s_screen, LV_OPA_COVER, 0); + lv_obj_set_style_pad_all(s_screen, 0, 0); + lv_obj_set_style_border_width(s_screen, 0, 0); + + lv_obj_t *card = lv_obj_create(s_screen); + lv_obj_remove_flag(card, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_size(card, VIEW_W - 36, 236); + lv_obj_center(card); + lv_obj_set_style_bg_color(card, current_theme.bg_secondary, 0); + lv_obj_set_style_bg_opa(card, LV_OPA_COVER, 0); + lv_obj_set_style_radius(card, 18, 0); + lv_obj_set_style_border_width(card, 1, 0); + lv_obj_set_style_border_color(card, current_theme.border_accent, 0); + lv_obj_set_style_shadow_width(card, 24, 0); + lv_obj_set_style_shadow_opa(card, LV_OPA_30, 0); + lv_obj_set_style_shadow_color(card, lv_color_black(), 0); + lv_obj_set_style_pad_all(card, 16, 0); + lv_obj_set_flex_flow(card, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_align(card, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_set_style_pad_row(card, 10, 0); + + lv_image_dsc_t *ic = assets_get("/assets/icons/usb.bin"); + if (ic != NULL) { + lv_obj_t *img = lv_image_create(card); + lv_image_set_src(img, ic); + lv_image_set_scale(img, 384); + } + + lv_obj_t *title = lv_label_create(card); + lv_label_set_text(title, "USB Storage"); + lv_obj_set_style_text_font(title, &lv_font_montserrat_16, 0); + lv_obj_set_style_text_color(title, current_theme.text_main, 0); + + s_status = lv_label_create(card); + lv_obj_set_width(s_status, VIEW_W - 80); + lv_label_set_long_mode(s_status, LV_LABEL_LONG_WRAP); + lv_obj_set_style_text_align(s_status, LV_TEXT_ALIGN_CENTER, 0); + lv_obj_set_style_text_font(s_status, &lv_font_montserrat_14, 0); + lv_label_set_text(s_status, "Starting..."); + lv_obj_set_style_text_color(s_status, current_theme.text_secondary, 0); + + s_hint = lv_label_create(card); + lv_obj_set_width(s_hint, VIEW_W - 72); + lv_label_set_long_mode(s_hint, LV_LABEL_LONG_WRAP); + lv_obj_set_style_text_align(s_hint, LV_TEXT_ALIGN_CENTER, 0); + lv_obj_set_style_text_font(s_hint, &lv_font_montserrat_12, 0); + lv_label_set_text(s_hint, "Preparing the USB drive."); + lv_obj_set_style_text_color(s_hint, current_theme.text_secondary, 0); + + ui_input_set_screen_handler(usb_storage_input, NULL); + s_timer = lv_timer_create(refresh_cb, REFRESH_PERIOD_MS, NULL); + ui_screen_load_owned(&s_screen, s_screen); + + xTaskCreatePinnedToCore(enter_task, "usb_msc_e", USB_MSC_TASK_STACK, NULL, SYS_PRIO_SERVICE_HI, NULL, + SYS_CORE_RADIO); +} + +void ui_usb_storage_stop(void) { + s_status = NULL; + s_hint = NULL; + if (usb_msc_get_state() == USB_MSC_ACTIVE) { + ESP_LOGW(TAG, "closed while active - rebooting to restore /sdcard"); + esp_restart(); + } +} diff --git a/firmware_p4/components/Drivers/tusb_desc/include/tusb_desc.h b/firmware_p4/components/Drivers/tusb_desc/include/tusb_desc.h index c4966e7b5..7fe64e6c0 100644 --- a/firmware_p4/components/Drivers/tusb_desc/include/tusb_desc.h +++ b/firmware_p4/components/Drivers/tusb_desc/include/tusb_desc.h @@ -29,13 +29,22 @@ extern "C" { // CDC uses two interfaces (comm + data), so the data interface is CDC+1. #define TUSB_DESC_ITF_NUM_HID 0 #define TUSB_DESC_ITF_NUM_CDC 1 // comm; data interface = 2 +#if CFG_TUD_MSC +#define TUSB_DESC_ITF_NUM_MSC 3 // mass storage (SD as USB drive), after CDC data (2) +#define TUSB_DESC_ITF_NUM_TOTAL 4 +#else #define TUSB_DESC_ITF_NUM_TOTAL 3 +#endif // Endpoint addresses #define TUSB_DESC_EP_HID_IN 0x81 #define TUSB_DESC_EP_CDC_NOTIF 0x82 #define TUSB_DESC_EP_CDC_OUT 0x03 #define TUSB_DESC_EP_CDC_IN 0x83 +#if CFG_TUD_MSC +#define TUSB_DESC_EP_MSC_OUT 0x04 +#define TUSB_DESC_EP_MSC_IN 0x84 +#endif /** * @brief Initialize the TinyUSB driver with HID composite descriptors. diff --git a/firmware_p4/components/Drivers/tusb_desc/tusb_desc.c b/firmware_p4/components/Drivers/tusb_desc/tusb_desc.c index db6153e94..f0df321e8 100644 --- a/firmware_p4/components/Drivers/tusb_desc/tusb_desc.c +++ b/firmware_p4/components/Drivers/tusb_desc/tusb_desc.c @@ -45,8 +45,20 @@ static const char *TAG = "TUSB_DESC"; #define STR_IDX_PRODUCT 2 #define STR_IDX_SERIAL 3 #define STR_IDX_CDC 4 - +#if CFG_TUD_MSC +#define STR_IDX_MSC 5 +#endif + +#if CFG_TUD_MSC +#define CONFIG_TOTAL_LEN \ + (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN + TUD_CDC_DESC_LEN + TUD_MSC_DESC_LEN) +#define MSC_DESCRIPTOR(ep_size) \ + , TUD_MSC_DESCRIPTOR(TUSB_DESC_ITF_NUM_MSC, STR_IDX_MSC, \ + TUSB_DESC_EP_MSC_OUT, TUSB_DESC_EP_MSC_IN, (ep_size)) +#else #define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN + TUD_CDC_DESC_LEN) +#define MSC_DESCRIPTOR(ep_size) +#endif // CDC data (bulk) endpoint max packet size is speed-dependent: USB requires it // to be EXACTLY 512 at High Speed and 8/16/32/64 at Full Speed. The P4 USB is @@ -103,7 +115,8 @@ static const uint8_t s_desc_hid_report[] = { 8, \ TUSB_DESC_EP_CDC_OUT, \ TUSB_DESC_EP_CDC_IN, \ - (cdc_ep_size)) + (cdc_ep_size)) \ + MSC_DESCRIPTOR(cdc_ep_size) static const uint8_t s_desc_configuration_hs[] = {CONFIG_DESCRIPTOR(CDC_EP_SIZE_HS)}; static const uint8_t s_desc_configuration_fs[] = {CONFIG_DESCRIPTOR(CDC_EP_SIZE_FS)}; @@ -115,6 +128,9 @@ static const char *s_string_desc_arr[] = { "BadUSB Device", // Product "123456", // Serial Number "TentacleOS Companion", // CDC interface (host link) +#if CFG_TUD_MSC + "TentacleOS SD", +#endif }; #define STRING_DESC_COUNT (sizeof(s_string_desc_arr) / sizeof(s_string_desc_arr[0])) diff --git a/firmware_p4/components/Service/CMakeLists.txt b/firmware_p4/components/Service/CMakeLists.txt index ebcec3859..943cb25b0 100644 --- a/firmware_p4/components/Service/CMakeLists.txt +++ b/firmware_p4/components/Service/CMakeLists.txt @@ -32,6 +32,8 @@ file(GLOB_RECURSE BRIDGE_MANAGER_SRCS "bridge_manager/*.c") file(GLOB_RECURSE BT_SERVICE_SRCS "bluetooth/*.c") file(GLOB_RECURSE HOST_LINK_SRCS "host_link/*.c") file(GLOB_RECURSE STORAGE_API_SRCS "storage_api/*.c") +# storage_vfs/*.c includes usb_msc.c (expose the SD as a USB drive). NOTE: adding +# a new .c under storage_vfs requires a CMake reconfigure to re-run this glob. file(GLOB_RECURSE STORAGE_VFS_SRCS "storage_vfs/*.c") file(GLOB_RECURSE STORAGE_ASSETS_SRCS "storage_assets/*.c") diff --git a/firmware_p4/components/Service/storage_api/storage_impl.c b/firmware_p4/components/Service/storage_api/storage_impl.c index cff9db4fe..f4ae3a031 100644 --- a/firmware_p4/components/Service/storage_api/storage_impl.c +++ b/firmware_p4/components/Service/storage_api/storage_impl.c @@ -68,7 +68,7 @@ esp_err_t storage_file_get_info(const char *path, storage_file_info_t *info) { return ret; } - strncpy(info->path, full_path, sizeof(info->path) - 1); + snprintf(info->path, sizeof(info->path), "%s", full_path); info->size = st.size; info->modified_time = st.mtime; info->created_time = st.ctime; diff --git a/firmware_p4/components/Service/storage_vfs/include/usb_msc.h b/firmware_p4/components/Service/storage_vfs/include/usb_msc.h new file mode 100644 index 000000000..ccdfdefbb --- /dev/null +++ b/firmware_p4/components/Service/storage_vfs/include/usb_msc.h @@ -0,0 +1,73 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +/** + * @file usb_msc.h + * @brief USB Mass Storage mode: expose the microSD to a host PC as a USB drive. + */ +#ifndef USB_MSC_H +#define USB_MSC_H + +#include + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief USB Mass Storage mode state. + */ +typedef enum { + USB_MSC_IDLE = 0, /**< Not in USB-storage mode. */ + USB_MSC_ENTERING, /**< Detaching SD / bringing USB up. */ + USB_MSC_ACTIVE, /**< SD exposed to the host as a USB drive. */ + USB_MSC_ERROR, /**< Could not enter (SD restored, safe to leave). */ + USB_MSC_EXITING, /**< Tearing down / remounting SD. */ +} usb_msc_state_t; + +/** + * @brief Get the current USB Mass Storage mode state (poll this from the UI). + * + * @return The current ::usb_msc_state_t value. + */ +usb_msc_state_t usb_msc_get_state(void); + +/** + * @brief Check whether the host PC currently has the drive mounted. + * + * @return true while the host PC has the drive mounted, false otherwise. + */ +bool usb_msc_host_connected(void); + +/** + * @brief Enter USB Mass Storage mode: detach the app's /sdcard FAT, expose the + * raw card to the host, and switch the USB mux to native. On failure the + * SD is restored. Blocking — run on a worker task, NEVER the LVGL thread. + */ +void usb_msc_enter(void); + +/** + * @brief Leave USB Mass Storage mode and RESUME normal operation (no reboot): + * stop exposing the card, remount /sdcard for the app, and route the USB + * connector back to the UART bridge. Only if the remount fails does it + * reboot to recover. Blocking — run on a worker task. + */ +void usb_msc_exit(void); + +#ifdef __cplusplus +} +#endif + +#endif // USB_MSC_H diff --git a/firmware_p4/components/Service/storage_vfs/include/vfs_sdcard.h b/firmware_p4/components/Service/storage_vfs/include/vfs_sdcard.h index 5e17b2809..bfe1d03c9 100644 --- a/firmware_p4/components/Service/storage_vfs/include/vfs_sdcard.h +++ b/firmware_p4/components/Service/storage_vfs/include/vfs_sdcard.h @@ -47,6 +47,23 @@ esp_err_t vfs_sdcard_format(void); esp_err_t vfs_register_sd_backend(void); esp_err_t vfs_unregister_sd_backend(void); +/** + * @brief Give up the app's FAT mount and hand back the SD as a RAW, still-powered + * block device for USB Mass Storage. The card is re-initialized (never + * formatted). There is no restore path — exit USB-MSC mode via reboot. + * @param out_card receives an @c sdmmc_card_t* (as @c void*) on success. + * @return ESP_OK, or an error (the app FAT mount is left detached on failure). + */ +esp_err_t vfs_sdcard_detach_for_msc(void **out_card); + +/** + * @brief Undo vfs_sdcard_detach_for_msc(): release the raw SDMMC card+host that + * was handed to USB MSC and remount the app FAT at /sdcard. Call AFTER the + * MSC storage layer is torn down. Lets the firmware resume without a reboot. + * @param card the handle returned by vfs_sdcard_detach_for_msc() (may be NULL). + */ +esp_err_t vfs_sdcard_reattach_after_msc(void *card); + #ifdef __cplusplus } #endif diff --git a/firmware_p4/components/Service/storage_vfs/usb_msc.c b/firmware_p4/components/Service/storage_vfs/usb_msc.c new file mode 100644 index 000000000..e8046da2d --- /dev/null +++ b/firmware_p4/components/Service/storage_vfs/usb_msc.c @@ -0,0 +1,89 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#include "usb_msc.h" + +#include "esp_log.h" +#include "esp_system.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "sdmmc_cmd.h" +#include "tusb_msc_storage.h" + +#include "tusb_desc.h" +#include "vfs_sdcard.h" + +static const char *TAG = "USB_MSC"; + +#define USB_MSC_DETACH_FAIL_DELAY_MS 800 +#define USB_MSC_REMOUNT_FAIL_DELAY_MS 500 + +static volatile usb_msc_state_t s_state = USB_MSC_IDLE; +static void *s_card = NULL; + +usb_msc_state_t usb_msc_get_state(void) { + return s_state; +} + +bool usb_msc_host_connected(void) { + return (s_state == USB_MSC_ACTIVE) && tinyusb_msc_storage_in_use_by_usb_host(); +} + +void usb_msc_enter(void) { + s_state = USB_MSC_ENTERING; + + void *raw = NULL; + if (vfs_sdcard_detach_for_msc(&raw) != ESP_OK || raw == NULL) { + ESP_LOGE(TAG, "SD detach failed - rebooting to recover"); + vTaskDelay(pdMS_TO_TICKS(USB_MSC_DETACH_FAIL_DELAY_MS)); + esp_restart(); + } + s_card = raw; + + const tinyusb_msc_sdmmc_config_t msc_cfg = {.card = (sdmmc_card_t *)raw}; + if (tinyusb_msc_storage_init_sdmmc(&msc_cfg) != ESP_OK) { + ESP_LOGE(TAG, "MSC storage init failed - restoring SD"); + (void)vfs_sdcard_reattach_after_msc(s_card); + s_card = NULL; + s_state = USB_MSC_ERROR; + return; + } + + usb_mux_set_native(true); + s_state = USB_MSC_ACTIVE; + ESP_LOGI(TAG, "USB drive live"); +} + +void usb_msc_exit(void) { + if (s_state != USB_MSC_ACTIVE) { + s_state = USB_MSC_IDLE; + return; + } + s_state = USB_MSC_EXITING; + + tinyusb_msc_storage_deinit(); + usb_mux_set_native(false); + + esp_err_t r = vfs_sdcard_reattach_after_msc(s_card); + s_card = NULL; + if (r != ESP_OK) { + ESP_LOGE(TAG, "SD remount failed (%s) - rebooting to recover", esp_err_to_name(r)); + vTaskDelay(pdMS_TO_TICKS(USB_MSC_REMOUNT_FAIL_DELAY_MS)); + esp_restart(); + } + + s_state = USB_MSC_IDLE; + ESP_LOGI(TAG, "Left USB storage mode; /sdcard restored"); +} diff --git a/firmware_p4/components/Service/storage_vfs/vfs_sdcard.c b/firmware_p4/components/Service/storage_vfs/vfs_sdcard.c index db959ce4f..02fa87770 100644 --- a/firmware_p4/components/Service/storage_vfs/vfs_sdcard.c +++ b/firmware_p4/components/Service/storage_vfs/vfs_sdcard.c @@ -18,6 +18,7 @@ #include #include #include +#include #include #include #include @@ -344,4 +345,68 @@ esp_err_t vfs_sdcard_format(void) { return vfs_sdcard_init(); } +esp_err_t vfs_sdcard_detach_for_msc(void **out_card) { + if (out_card == NULL) { + return ESP_ERR_INVALID_ARG; + } + *out_card = NULL; + + if (s_sdcard.mounted) { + esp_err_t r = vfs_sdcard_deinit(); + if (r != ESP_OK) { + ESP_LOGE(TAG, "detach: unmount failed: %s", esp_err_to_name(r)); + return r; + } + } + + sdmmc_host_t host = SDMMC_HOST_DEFAULT(); + host.max_freq_khz = SDMMC_FREQ_HIGHSPEED; + + sdmmc_slot_config_t slot_config = SDMMC_SLOT_CONFIG_DEFAULT(); + slot_config.width = 4; + slot_config.clk = GPIO_SDMMC_CLK_PIN; + slot_config.cmd = GPIO_SDMMC_CMD_PIN; + slot_config.d0 = GPIO_SDMMC_D0_PIN; + slot_config.d1 = GPIO_SDMMC_D1_PIN; + slot_config.d2 = GPIO_SDMMC_D2_PIN; + slot_config.d3 = GPIO_SDMMC_D3_PIN; + slot_config.flags |= SDMMC_SLOT_FLAG_INTERNAL_PULLUP; + + esp_err_t r = sdmmc_host_init(); + if (r != ESP_OK) { + ESP_LOGE(TAG, "detach: host init: %s", esp_err_to_name(r)); + return r; + } + r = sdmmc_host_init_slot(host.slot, &slot_config); + if (r != ESP_OK) { + ESP_LOGE(TAG, "detach: slot init: %s", esp_err_to_name(r)); + sdmmc_host_deinit(); + return r; + } + sdmmc_card_t *card = calloc(1, sizeof(sdmmc_card_t)); + if (card == NULL) { + sdmmc_host_deinit(); + return ESP_ERR_NO_MEM; + } + r = sdmmc_card_init(&host, card); + if (r != ESP_OK) { + ESP_LOGE(TAG, "detach: card init: %s", esp_err_to_name(r)); + free(card); + sdmmc_host_deinit(); + return r; + } + + *out_card = card; + ESP_LOGI(TAG, "SD detached from app FAT and handed to USB MSC (raw)"); + return ESP_OK; +} + +esp_err_t vfs_sdcard_reattach_after_msc(void *card) { + (void)sdmmc_host_deinit(); + if (card != NULL) { + free(card); + } + return vfs_sdcard_init(); +} + #endif From 1adc348b6f372402d1a825aee2f34833f1989bbf Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:22:03 -0300 Subject: [PATCH 011/103] feat(ui): Home/menu navigation affordances Make DOWN consistently descend, move favorite onto a labelled hold gesture, and add on-screen hints (down = Apps, hold = Config) with adjusted spacing so the hint no longer overlaps the app icons. Home's idle float animation is retained. Co-Authored-By: Claude Opus 4.8 --- .../Applications/ui/screens/home/home_ui.c | 13 +++-- .../Applications/ui/screens/menu/menu_ui.c | 52 +++++++++++++------ 2 files changed, 47 insertions(+), 18 deletions(-) diff --git a/firmware_p4/components/Applications/ui/screens/home/home_ui.c b/firmware_p4/components/Applications/ui/screens/home/home_ui.c index 53dcfe3bd..c6dd4f31b 100644 --- a/firmware_p4/components/Applications/ui/screens/home/home_ui.c +++ b/firmware_p4/components/Applications/ui/screens/home/home_ui.c @@ -335,9 +335,9 @@ void ui_home_open(void) { lv_obj_set_style_border_width(content, 0, 0); lv_obj_set_style_pad_left(content, HOME_PAD, 0); lv_obj_set_style_pad_right(content, HOME_PAD, 0); - lv_obj_set_style_pad_top(content, 8, 0); - lv_obj_set_style_pad_bottom(content, HOME_PAD, 0); - lv_obj_set_style_pad_row(content, HOME_ROW_GAP, 0); + lv_obj_set_style_pad_top(content, 4, 0); + lv_obj_set_style_pad_bottom(content, HOME_PAD + 18, 0); + lv_obj_set_style_pad_row(content, HOME_ROW_GAP - 4, 0); lv_obj_set_flex_flow(content, LV_FLEX_FLOW_COLUMN); lv_obj_set_flex_align(content, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); @@ -345,6 +345,13 @@ void ui_home_open(void) { build_octobit(content); build_favorites(content); + lv_obj_t *hint = lv_label_create(s_screen_home); + lv_label_set_text(hint, LV_SYMBOL_DOWN " Apps " LV_SYMBOL_UP " hold: Config"); + lv_obj_set_style_text_font(hint, &lv_font_montserrat_12, 0); + lv_obj_set_style_text_color(hint, current_theme.text_secondary, 0); + lv_obj_set_style_bg_opa(hint, LV_OPA_TRANSP, 0); + lv_obj_align(hint, LV_ALIGN_BOTTOM_MID, 0, -3); + lv_obj_add_event_cb(s_screen_home, home_event_cb, LV_EVENT_KEY, NULL); if (main_group != NULL) { diff --git a/firmware_p4/components/Applications/ui/screens/menu/menu_ui.c b/firmware_p4/components/Applications/ui/screens/menu/menu_ui.c index ca9d07d84..f6264408e 100644 --- a/firmware_p4/components/Applications/ui/screens/menu/menu_ui.c +++ b/firmware_p4/components/Applications/ui/screens/menu/menu_ui.c @@ -165,6 +165,14 @@ static menu_ui_item_t s_menu_data[] = { {NULL}, {NULL}, SCREEN_FILES}, + {"APPS", + {"/assets/frames/apps_frame_0.bin", + "/assets/frames/apps_frame_1.bin", + "/assets/frames/apps_frame_2.bin"}, + BASE_FRAMES, + {NULL}, + {NULL}, + SCREEN_GAMES_MENU}, {"PLAYER", {"/assets/frames/player_glyph.bin", "/assets/frames/player_glyph.bin", @@ -201,7 +209,7 @@ static void place_item(size_t item_idx, bool anim); static void fix_z_order(void); static void update_view(bool anim); static void on_anim_done(lv_anim_t *a); -static void on_key_event(lv_event_t *e); +static void menu_event_cb(lv_event_t *e); static int32_t carousel_slot(size_t item_idx) { int32_t n = (int32_t)MENU_ITEM_COUNT; @@ -354,8 +362,9 @@ static void update_view(bool anim) { if (s_fav_badge != NULL) { bool fav = favorites_is(s_menu_data[s_selected].target); - lv_label_set_text(s_fav_badge, fav ? LV_SYMBOL_OK " FAVORITED" : ""); - lv_obj_set_style_text_color(s_fav_badge, lv_color_hex(FAV_ACCENT), 0); + lv_label_set_text(s_fav_badge, fav ? LV_SYMBOL_OK " FAVORITED" : "hold OK to favorite"); + lv_obj_set_style_text_color( + s_fav_badge, fav ? lv_color_hex(FAV_ACCENT) : current_theme.text_secondary, 0); } if (anim) { @@ -405,8 +414,26 @@ static void ensure_radio_on(screen_id_t target) { } } -static void on_key_event(lv_event_t *e) { - if (lv_event_get_code(e) != LV_EVENT_KEY) +static void menu_open_selected(void) { + screen_id_t target = s_menu_data[s_selected].target; + ensure_radio_on(target); + ui_switch_screen(target); +} + +static void menu_event_cb(lv_event_t *e) { + const lv_event_code_t code = lv_event_get_code(e); + + if (code == LV_EVENT_SHORT_CLICKED) { + menu_open_selected(); + return; + } + if (code == LV_EVENT_LONG_PRESSED) { + favorites_toggle(s_menu_data[s_selected].target); + ui_feedback(UI_FB_SELECT); + update_view(false); + return; + } + if (code != LV_EVENT_KEY) return; uint32_t k = lv_event_get_key(e); @@ -428,9 +455,7 @@ static void on_key_event(lv_event_t *e) { } if (k == LV_KEY_DOWN) { - favorites_toggle(s_menu_data[s_selected].target); - ui_feedback(UI_FB_SELECT); - update_view(false); + menu_open_selected(); return; } @@ -438,12 +463,6 @@ static void on_key_event(lv_event_t *e) { ui_switch_screen(SCREEN_HOME); return; } - - if (k == LV_KEY_ENTER) { - screen_id_t target = s_menu_data[s_selected].target; - ensure_radio_on(target); - ui_switch_screen(target); - } } int menu_catalog_count(void) { @@ -512,7 +531,10 @@ void ui_menu_open(void) { update_view(false); - lv_obj_add_event_cb(s_screen, on_key_event, LV_EVENT_KEY, NULL); + lv_obj_add_flag(s_screen, LV_OBJ_FLAG_CLICKABLE); + lv_obj_add_event_cb(s_screen, menu_event_cb, LV_EVENT_KEY, NULL); + lv_obj_add_event_cb(s_screen, menu_event_cb, LV_EVENT_SHORT_CLICKED, NULL); + lv_obj_add_event_cb(s_screen, menu_event_cb, LV_EVENT_LONG_PRESSED, NULL); if (main_group != NULL) { lv_group_add_obj(main_group, s_screen); From c3d294d741c5f875a123c4c1612f99a96dd169fe Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:22:19 -0300 Subject: [PATCH 012/103] refactor(ui): thread-safe cross-thread async scheduling (ui_async_call) Radio/worker tasks on SYS_CORE_RADIO called lv_async_call directly; under LV_OS_NONE that creates an lv_timer while the render thread runs lv_timer_handler, racing LVGL's global timer list -> corruption / visual glitches under radio traffic. Add ui_async_call() (recursive UI mutex + lv_async_call + release), safe from any thread and serialized against the renderer, and route the cross-thread call sites through it (drops the update only if the lock times out; no behaviour change). Co-Authored-By: Claude Opus 4.8 --- .../ui/components/header/header_ui.c | 5 +- .../Applications/ui/include/ui_manager.h | 19 +++++++ .../Applications/ui/screens/audio/micrec_ui.c | 2 +- .../ui/screens/audio/speaker_ui.c | 2 +- .../ui/screens/bluetooth/ble_scan_ui.c | 9 ++-- .../ui/screens/bluetooth/ble_spam_names_ui.c | 4 +- .../ui/screens/connect_wifi/connect_wifi_ui.c | 7 ++- .../ui/screens/infrared/ir_saved_ui.c | 15 +++--- .../ui/screens/nfc/nfc_saved_ui.c | 5 +- .../ui/screens/settings/settings_ui.c | 4 +- .../ui/screens/settings/storage_settings_ui.c | 3 +- .../ui/screens/subghz/subghz_menu_ui.c | 9 ++-- .../ui/screens/wifi/wifi_attack_ui.c | 4 +- .../ui/screens/wifi/wifi_channel_ui.c | 7 ++- .../ui/screens/wifi/wifi_client_ui.c | 5 +- .../ui/screens/wifi/wifi_deauth_detector_ui.c | 9 ++-- .../ui/screens/wifi/wifi_evil_twin_ui.c | 4 +- .../ui/screens/wifi/wifi_handshake_ui.c | 32 ++++++------ .../ui/screens/wifi/wifi_names_ui.c | 2 +- .../ui/screens/wifi/wifi_packets_ui.c | 2 +- .../ui/screens/wifi/wifi_port_scan_ui.c | 2 +- .../ui/screens/wifi/wifi_probe_mon_ui.c | 2 +- .../ui/screens/wifi/wifi_scan_ui.c | 2 +- .../ui/screens/wifi/wifi_signal_locator_ui.c | 11 ++--- .../ui/screens/wifi/wifi_target_clients_ui.c | 6 +-- .../components/Applications/ui/ui_manager.c | 49 ++++++++++++++++++- 26 files changed, 139 insertions(+), 82 deletions(-) diff --git a/firmware_p4/components/Applications/ui/components/header/header_ui.c b/firmware_p4/components/Applications/ui/components/header/header_ui.c index 57ab4543d..2e2b93ffc 100644 --- a/firmware_p4/components/Applications/ui/components/header/header_ui.c +++ b/firmware_p4/components/Applications/ui/components/header/header_ui.c @@ -37,6 +37,7 @@ #include "pin_def.h" #include "sys_time.h" #include "ui_feedback.h" +#include "ui_manager.h" #include "ui_theme.h" #include "vfs_config.h" #include "vfs_core.h" @@ -262,7 +263,7 @@ static void sd_cd_task(void *arg) { if (present) { if (sd_try_mount()) { - lv_async_call(sd_apply_mounted, (void *)(intptr_t)(boot || force)); + ui_async_call(sd_apply_mounted, (void *)(intptr_t)(boot || force)); } else if (vfs_sdcard_is_mounted()) { vfs_sdcard_deinit(); } @@ -271,7 +272,7 @@ static void sd_cd_task(void *arg) { if (vfs_sdcard_is_mounted()) { vfs_sdcard_deinit(); } - lv_async_call(sd_apply_removed, NULL); + ui_async_call(sd_apply_removed, NULL); } boot = false; diff --git a/firmware_p4/components/Applications/ui/include/ui_manager.h b/firmware_p4/components/Applications/ui/include/ui_manager.h index 632decc78..9ff07544a 100644 --- a/firmware_p4/components/Applications/ui/include/ui_manager.h +++ b/firmware_p4/components/Applications/ui/include/ui_manager.h @@ -86,11 +86,17 @@ typedef enum { SCREEN_IR_BURST, SCREEN_OCTOBIT_STATUS, SCREEN_DEV_MENU, + SCREEN_GAMES_MENU, + SCREEN_GAME_SNAKE, + SCREEN_GAME_BREAKOUT, + SCREEN_GAME_GB, SCREEN_GPIO, SCREEN_HAPTIC, SCREEN_SPEAKER, SCREEN_MIC_REC, SCREEN_WAV_PLAYER, + SCREEN_MP4_PLAYER, + SCREEN_MP3_PLAYER, SCREEN_PLAYER, SCREEN_SUBGHZ_MENU, SCREEN_SUBGHZ_READ, @@ -164,6 +170,8 @@ typedef enum { SCREEN_SD_HEALTH, SCREEN_USB_MOUSE, SCREEN_TIME, + SCREEN_IMAGE_VIEWER, + SCREEN_USB_STORAGE, SCREEN_COUNT } screen_id_t; @@ -186,6 +194,17 @@ bool ui_acquire(void); /** @brief Release the UI mutex. */ void ui_release(void); +/** + * @brief Schedule an lv_async_call safely from any thread. + * + * lv_async_call() creates an lv_timer under the hood, mutating LVGL's global + * timer list. Called from a non-LVGL thread (radio/bridge worker tasks) it races + * lv_timer_handler on the render thread. This wrapper takes the (recursive) UI + * mutex first, so it is safe to call from any context; it silently drops the + * call only if the lock cannot be taken within the UI timeout. + */ +void ui_async_call(lv_async_cb_t cb, void *user_data); + /** @brief Switch to a new screen by identifier. */ void ui_switch_screen(screen_id_t new_screen); diff --git a/firmware_p4/components/Applications/ui/screens/audio/micrec_ui.c b/firmware_p4/components/Applications/ui/screens/audio/micrec_ui.c index 6ec63be10..d99ff24e2 100644 --- a/firmware_p4/components/Applications/ui/screens/audio/micrec_ui.c +++ b/firmware_p4/components/Applications/ui/screens/audio/micrec_ui.c @@ -377,7 +377,7 @@ static void op_done_cb(void *unused) { static void finish(const char *done_text) { strncpy(s_done_text, done_text, sizeof(s_done_text) - 1); s_done_text[sizeof(s_done_text) - 1] = '\0'; - lv_async_call(op_done_cb, NULL); + ui_async_call(op_done_cb, NULL); } static void mic_level_cb(int peak, int rms, void *ctx) { diff --git a/firmware_p4/components/Applications/ui/screens/audio/speaker_ui.c b/firmware_p4/components/Applications/ui/screens/audio/speaker_ui.c index 255145147..55737343d 100644 --- a/firmware_p4/components/Applications/ui/screens/audio/speaker_ui.c +++ b/firmware_p4/components/Applications/ui/screens/audio/speaker_ui.c @@ -477,7 +477,7 @@ static void rebuild_async(void *p) { static void cycle_category(int dir) { s_category = (s_category + dir + NUM_CATS) % NUM_CATS; - lv_async_call(rebuild_async, NULL); + ui_async_call(rebuild_async, NULL); } static void speaker_input(const input_event_t *ev, void *ctx) { diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_scan_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_scan_ui.c index 9b908888c..a9d5c0953 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_scan_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_scan_ui.c @@ -40,7 +40,6 @@ static const char *TAG = "BLE_SCAN_UI"; #define STATUS_TICK_MS 50 #define DOT_CYCLE_MS 350 #define SCAN_RESULT_COLOR_HEX 0x00E676 -#define COL_DIM 0x8A8594 #define BLE_MAX_DEVS 12 #define SCAN_POLL_MS 150 #define SCAN_TIMEOUT_MS 15000 @@ -227,7 +226,7 @@ static void build_empty_hero(const char *title, const char *sub) { lv_obj_t *s = lv_label_create(card); lv_label_set_text(s, sub); lv_obj_set_style_text_font(s, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(s, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s, current_theme.text_secondary, 0); lv_obj_set_style_text_align(s, LV_TEXT_ALIGN_CENTER, 0); ui_chrome_footer(s_screen, "RIGHT Rescan BACK Back"); @@ -313,7 +312,7 @@ static void build_radar(void) { s_chip_meta = lv_label_create(s_chip); lv_obj_set_style_text_font(s_chip_meta, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(s_chip_meta, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_chip_meta, current_theme.text_secondary, 0); lv_obj_align(s_chip_meta, LV_ALIGN_BOTTOM_LEFT, 0, 0); s_chip_rssi = lv_label_create(s_chip); @@ -433,7 +432,7 @@ static void ble_scan_task(void *arg) { s_dev_count = 0; s_scan_state = SCAN_FAIL; s_scanning = false; - lv_async_call(scan_done_cb, NULL); + ui_async_call(scan_done_cb, NULL); vTaskDelete(NULL); return; } @@ -455,7 +454,7 @@ static void ble_scan_task(void *arg) { } s_scanning = false; - lv_async_call(scan_done_cb, NULL); + ui_async_call(scan_done_cb, NULL); vTaskDelete(NULL); } diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_spam_names_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_spam_names_ui.c index bd77163ef..96789334a 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_spam_names_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_spam_names_ui.c @@ -121,7 +121,7 @@ static void on_kb_submit(const char *text, void *ud) { ui_feedback(UI_FB_WRITE); notify(NOTIFY_SAVED, "Name added"); } - lv_async_call(rebuild_async, NULL); + ui_async_call(rebuild_async, NULL); } static void on_delete_confirm(bool confirm) { @@ -134,7 +134,7 @@ static void on_delete_confirm(bool confirm) { notify(NOTIFY_INFO, "Name deleted"); } s_del_index = -1; - lv_async_call(rebuild_async, NULL); + ui_async_call(rebuild_async, NULL); } static void ble_spam_names_input(const input_event_t *ev, void *ctx) { diff --git a/firmware_p4/components/Applications/ui/screens/connect_wifi/connect_wifi_ui.c b/firmware_p4/components/Applications/ui/screens/connect_wifi/connect_wifi_ui.c index 4ca554a85..dc6ac8b92 100644 --- a/firmware_p4/components/Applications/ui/screens/connect_wifi/connect_wifi_ui.c +++ b/firmware_p4/components/Applications/ui/screens/connect_wifi/connect_wifi_ui.c @@ -52,7 +52,6 @@ static const char *TAG = "CONNECT_WIFI_UI"; #define COLOR_OPEN_HEX 0x00E676 #define COLOR_LOCK_HEX 0xF5B13D -#define COLOR_DIM_HEX 0x8A8594 #define NET_BODY_H (LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) #define NET_ROW_H 46 @@ -159,7 +158,7 @@ static void wifi_connect_task(void *arg) { s_connect_ip[2] = 1; s_connect_ip[3] = 42; s_connecting = false; - lv_async_call(connect_done_cb, NULL); + ui_async_call(connect_done_cb, NULL); vTaskDelete(NULL); } @@ -280,7 +279,7 @@ static void build_join_list(void) { lv_obj_t *sec = lv_label_create(card); lv_label_set_text_fmt(sec, "%s ch %d", s_aps[i].open ? "Open" : "WPA2", s_aps[i].channel); - lv_obj_set_style_text_color(sec, lv_color_hex(COLOR_DIM_HEX), 0); + lv_obj_set_style_text_color(sec, current_theme.text_secondary, 0); lv_obj_set_style_text_font(sec, &lv_font_montserrat_12, 0); lv_obj_align(sec, LV_ALIGN_BOTTOM_LEFT, NET_TEXT_X, -6); @@ -372,7 +371,7 @@ static void wifi_scan_task(void *arg) { s_ap_count = count; s_scan_state = SCAN_DONE; s_scanning = false; - lv_async_call(scan_done_cb, NULL); + ui_async_call(scan_done_cb, NULL); vTaskDelete(NULL); } diff --git a/firmware_p4/components/Applications/ui/screens/infrared/ir_saved_ui.c b/firmware_p4/components/Applications/ui/screens/infrared/ir_saved_ui.c index 0a37c8654..43e7683db 100644 --- a/firmware_p4/components/Applications/ui/screens/infrared/ir_saved_ui.c +++ b/firmware_p4/components/Applications/ui/screens/infrared/ir_saved_ui.c @@ -15,6 +15,8 @@ #include "ir_saved_ui.h" +#include "esp_attr.h" + #include #include @@ -43,7 +45,6 @@ static const char *TAG = "IR_SAVED_UI"; #define IR_SIGNAL_ICON "/assets/icons/settings_remote.bin" #define IR_CARRIER "38 kHz" -#define FILES_COL_DIM 0x8A8594 #define IRC_LEFT 6 #define IRC_GUTTER 16 #define IRC_TOP_Y 46 @@ -76,12 +77,12 @@ static bool s_saved = false; // Real data: every .ir under /sdcard/ir, the distinct protocols across them, // and the files filtered to the currently-open protocol. -static ir_store_entry_t s_all[IR_STORE_MAX_ENTRIES]; +EXT_RAM_BSS_ATTR static ir_store_entry_t s_all[IR_STORE_MAX_ENTRIES]; static int s_all_count = 0; static char s_protos[MAX_PROTOS][16]; static int s_proto_count = 0; static char s_proto_name[16] = {0}; -static ir_store_entry_t s_files[MAX_FILES]; +EXT_RAM_BSS_ATTR static ir_store_entry_t s_files[MAX_FILES]; static int s_file_count = 0; static lv_obj_t *s_file_list = NULL; @@ -178,7 +179,7 @@ static void on_rename_submit(const char *text, void *ud) { filter_for_proto(s_proto_name); if (s_file_count == 0) s_level = LEVEL_PROTOCOLS; - lv_async_call(rebuild_async, NULL); + ui_async_call(rebuild_async, NULL); } static void on_delete_confirm(bool confirm) { @@ -190,7 +191,7 @@ static void on_delete_confirm(bool confirm) { reload_all(); filter_for_proto(s_proto_name); s_level = (s_file_count > 0) ? LEVEL_FILES : LEVEL_PROTOCOLS; - lv_async_call(rebuild_async, NULL); + ui_async_call(rebuild_async, NULL); } static void move_file_thumb(void) { @@ -223,7 +224,7 @@ static void style_file_row(int i, bool sel) { lv_obj_set_style_border_opa(card, LV_OPA_60, 0); lv_obj_set_style_shadow_width(card, 0, 0); lv_obj_set_style_shadow_opa(card, LV_OPA_TRANSP, 0); - lv_obj_set_style_text_color(s_file_values[i], lv_color_hex(FILES_COL_DIM), 0); + lv_obj_set_style_text_color(s_file_values[i], current_theme.text_secondary, 0); } } @@ -300,7 +301,7 @@ static void build_files_list(void) { lv_label_set_long_mode(proto, LV_LABEL_LONG_DOT); lv_label_set_text(proto, s_files[i].proto); lv_obj_set_style_text_font(proto, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(proto, lv_color_hex(FILES_COL_DIM), 0); + lv_obj_set_style_text_color(proto, current_theme.text_secondary, 0); lv_obj_align(proto, LV_ALIGN_TOP_LEFT, 0, 20); lv_obj_t *pulse = lv_line_create(card); diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_saved_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_saved_ui.c index e9c652468..a75016ca8 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_saved_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_saved_ui.c @@ -36,7 +36,6 @@ #define TICK_MS 50 #define CARD_H 122 #define PEEK 60 -#define COL_DIM 0x8A8594 #define SAVED_ICON "/assets/icons/bookmarks.bin" #define CARD_ICON "/assets/icons/nfc.bin" #define CARD_REVEAL_MS 1100 @@ -109,7 +108,7 @@ static void build_empty(void) { lv_obj_t *s = lv_label_create(card); lv_label_set_text(s, "Read a tag first"); lv_obj_set_style_text_font(s, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(s, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s, current_theme.text_secondary, 0); } static void relayout(void) { @@ -227,7 +226,7 @@ static void on_del_confirm(bool confirm) { ui_feedback(UI_FB_WRITE); notify(NOTIFY_INFO, "Card deleted"); overlay_close(); - lv_async_call(rebuild_async, NULL); + ui_async_call(rebuild_async, NULL); } static void nfc_saved_tick_cb(lv_timer_t *t) { diff --git a/firmware_p4/components/Applications/ui/screens/settings/settings_ui.c b/firmware_p4/components/Applications/ui/screens/settings/settings_ui.c index 52717a0b6..5cf030f59 100644 --- a/firmware_p4/components/Applications/ui/screens/settings/settings_ui.c +++ b/firmware_p4/components/Applications/ui/screens/settings/settings_ui.c @@ -270,7 +270,7 @@ static void c5_flash_task(void *arg) { esp_err_t r = (init_r != ESP_OK) ? init_r : c5_flasher_update(NULL, 0, SPI_OTA_TRANSPORT_SPI); ESP_LOGI(TAG, "c5_flasher result: %s", esp_err_to_name(r)); - lv_async_call(c5_flash_done_on_lvgl, (void *)(intptr_t)r); + ui_async_call(c5_flash_done_on_lvgl, (void *)(intptr_t)r); vTaskDelete(NULL); } @@ -308,7 +308,7 @@ static void c5_rom_flash_task(void *arg) { (void)arg; esp_err_t r = c5_flasher_rom_flash(); ESP_LOGI(TAG, "c5_rom_flash result: %s", esp_err_to_name(r)); - lv_async_call(c5_flash_done_on_lvgl, (void *)(intptr_t)r); + ui_async_call(c5_flash_done_on_lvgl, (void *)(intptr_t)r); vTaskDelete(NULL); } diff --git a/firmware_p4/components/Applications/ui/screens/settings/storage_settings_ui.c b/firmware_p4/components/Applications/ui/screens/settings/storage_settings_ui.c index 06436881d..f65ac7b40 100644 --- a/firmware_p4/components/Applications/ui/screens/settings/storage_settings_ui.c +++ b/firmware_p4/components/Applications/ui/screens/settings/storage_settings_ui.c @@ -43,7 +43,6 @@ static const char *TAG = "STORAGE_UI"; #define G1 0x7A52D6 #define G2 0xB89AFF #define CYAN 0x00E5D0 -#define OK_COLOR 0x00E676 #define DANGER_COLOR 0xFF5470 #define ACT_EJECT 0 #define ACT_FORMAT 1 @@ -307,7 +306,7 @@ static void format_task(void *arg) { esp_err_t r = vfs_sdcard_format(); if (r == ESP_OK && !vfs_sdcard_is_mounted()) vfs_sdcard_init(); - lv_async_call(format_done_cb, (void *)(intptr_t)r); + ui_async_call(format_done_cb, (void *)(intptr_t)r); vTaskDelete(NULL); } diff --git a/firmware_p4/components/Applications/ui/screens/subghz/subghz_menu_ui.c b/firmware_p4/components/Applications/ui/screens/subghz/subghz_menu_ui.c index 4a3ff0c00..54228d90e 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/subghz_menu_ui.c +++ b/firmware_p4/components/Applications/ui/screens/subghz/subghz_menu_ui.c @@ -86,7 +86,6 @@ static const char *TAG = "SUBGHZ_UI"; #define SGC_THUMB_H 45 #define SGC_THUMB_ICON "/assets/icons/drag_indicator.bin" -#define COL_DIM 0x8A8594 #define COL_RAISE 0x170A28 #define HINT_SAVED "UP/DOWN choose OK open BACK exit" @@ -344,7 +343,7 @@ static void style_sig_row(int i, bool sel) { lv_obj_set_style_border_opa(card, LV_OPA_60, 0); lv_obj_set_style_shadow_width(card, 0, 0); lv_obj_set_style_shadow_opa(card, LV_OPA_TRANSP, 0); - lv_obj_set_style_text_color(s_sig_val[i], lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_sig_val[i], current_theme.text_secondary, 0); } } @@ -420,7 +419,7 @@ static void build_saved_list(void) { lv_label_set_long_mode(proto, LV_LABEL_LONG_DOT); lv_label_set_text(proto, SAVED_SIGS[i].proto); lv_obj_set_style_text_font(proto, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(proto, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(proto, current_theme.text_secondary, 0); lv_obj_align(proto, LV_ALIGN_TOP_LEFT, 0, 20); lv_obj_t *bars = lv_obj_create(card); @@ -500,7 +499,7 @@ static void style_info_row(int idx, bool sel) { lv_obj_set_style_border_opa(row, LV_OPA_COVER, 0); lv_obj_set_style_shadow_width(row, 0, 0); lv_obj_set_style_shadow_opa(row, LV_OPA_TRANSP, 0); - lv_obj_set_style_text_color(s_info_icons[idx], lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_info_icons[idx], current_theme.text_secondary, 0); lv_obj_set_style_text_color(s_info_labels[idx], current_theme.text_main, 0); } } @@ -615,7 +614,7 @@ static void info_del_confirm(bool confirm) { ui_feedback(UI_FB_WRITE); notify(NOTIFY_INFO, "Signal deleted"); s_view = VIEW_SAVED; - lv_async_call(rebuild_async, NULL); + ui_async_call(rebuild_async, NULL); } static void build_screen(void) { diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_attack_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_attack_ui.c index 64556f0da..992a90fde 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_attack_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_attack_ui.c @@ -340,7 +340,7 @@ static void attack_start_task(void *arg) { } s_is_attack_started = ok; s_is_attack_starting = false; - lv_async_call(attack_started_cb, NULL); + ui_async_call(attack_started_cb, NULL); vTaskDelete(NULL); } @@ -428,7 +428,7 @@ static void ap_pick_task(void *arg) { s_ap_count = n; s_is_pick_scanning = false; - lv_async_call(ap_pick_done_cb, NULL); + ui_async_call(ap_pick_done_cb, NULL); vTaskDelete(NULL); } diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_channel_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_channel_ui.c index 5aeb3fcd7..d63de185d 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_channel_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_channel_ui.c @@ -41,7 +41,6 @@ static const char *TAG = "WIFI_CHAN_UI"; #define COLOR_QUIET_HEX 0x00E676 #define COLOR_BUSY_HEX 0xFFC107 #define COLOR_CROWDED_HEX 0xF44336 -#define COLOR_DIM_HEX 0x8A8594 #define OCCUPANCY_FULL_APS 6 @@ -217,7 +216,7 @@ static void build_spectrum(void) { lv_obj_t *hint = lv_label_create(s_screen); lv_label_set_text_fmt( hint, "Ch %d crowded %d AP pick Ch %d", s_row_channel[cr], s_row_ap_count[cr], rec); - lv_obj_set_style_text_color(hint, lv_color_hex(COLOR_DIM_HEX), 0); + lv_obj_set_style_text_color(hint, current_theme.text_secondary, 0); lv_obj_set_style_text_font(hint, &lv_font_montserrat_12, 0); lv_obj_set_style_text_align(hint, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(hint, LV_ALIGN_TOP_MID, 0, SPEC_HINT_Y); @@ -286,7 +285,7 @@ static void wifi_channel_task(void *arg) { s_row_count = 0; s_scan_state = SCAN_FAIL; s_scanning = false; - lv_async_call(scan_done_cb, NULL); + ui_async_call(scan_done_cb, NULL); vTaskDelete(NULL); return; } @@ -324,7 +323,7 @@ static void wifi_channel_task(void *arg) { s_row_count = rows; s_scan_state = SCAN_DONE; s_scanning = false; - lv_async_call(scan_done_cb, NULL); + ui_async_call(scan_done_cb, NULL); vTaskDelete(NULL); } diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_client_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_client_ui.c index d03151d31..c4b0599f6 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_client_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_client_ui.c @@ -44,7 +44,6 @@ static const char *TAG = "WIFI_CLI_UI"; #define COLOR_STRONG_HEX 0x00E676 #define COLOR_WEAK_HEX 0xF5B13D -#define COLOR_DIM_HEX 0x8A8594 #define RSSI_STRONG_DBM -60 #define SCAN_WAVES_Y_OFS -6 @@ -142,7 +141,7 @@ add_card_text(lv_obj_t *card, const char *title, lv_color_t title_color, const c lv_obj_t *s = lv_label_create(card); lv_label_set_text(s, sub); - lv_obj_set_style_text_color(s, lv_color_hex(COLOR_DIM_HEX), 0); + lv_obj_set_style_text_color(s, current_theme.text_secondary, 0); lv_obj_set_style_text_font(s, &lv_font_montserrat_12, 0); lv_obj_align(s, LV_ALIGN_BOTTOM_MID, 0, -4); } @@ -324,7 +323,7 @@ static void wifi_client_task(void *arg) { derive_aps(); s_scan_state = SCAN_DONE; s_scanning = false; - lv_async_call(scan_done_cb, NULL); + ui_async_call(scan_done_cb, NULL); vTaskDelete(NULL); } diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_deauth_detector_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_deauth_detector_ui.c index 7aa72f382..bb9ffe1de 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_deauth_detector_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_deauth_detector_ui.c @@ -55,7 +55,6 @@ static const char *TAG = "WIFI_DEAUTH_DET_UI"; #define ALERT_COLOR 0xE53935 #define CALM_COLOR 0x00E676 -#define DIM_COLOR 0x8A8594 #define POLL_INTERVAL_MS 1000 #define TASK_STACK_SIZE 8192 @@ -108,7 +107,7 @@ static void apply_state(bool alert) { if (s_status_label != NULL) { lv_label_set_text(s_status_label, alert ? "Deauth flood detected" : "Monitoring..."); lv_obj_set_style_text_color( - s_status_label, alert ? lv_color_hex(ALERT_COLOR) : lv_color_hex(DIM_COLOR), 0); + s_status_label, alert ? lv_color_hex(ALERT_COLOR) : current_theme.text_secondary, 0); } if (s_banner != NULL) { @@ -149,7 +148,7 @@ static void detector_worker(void *arg) { while (s_is_poll_running) { uint32_t count = deauther_detector_get_count(); - lv_async_call(count_ready_cb, (void *)(uintptr_t)count); + ui_async_call(count_ready_cb, (void *)(uintptr_t)count); vTaskDelay(pdMS_TO_TICKS(POLL_INTERVAL_MS)); } @@ -234,12 +233,12 @@ void ui_wifi_deauth_detector_open(void) { lv_obj_t *caption = lv_label_create(s_card); lv_label_set_text(caption, "DEAUTH FRAMES"); lv_obj_set_style_text_font(caption, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(caption, lv_color_hex(DIM_COLOR), 0); + lv_obj_set_style_text_color(caption, current_theme.text_secondary, 0); lv_obj_t *info = lv_label_create(s_screen); lv_label_set_text(info, "Watching channels 1-13"); lv_obj_set_style_text_font(info, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(info, lv_color_hex(DIM_COLOR), 0); + lv_obj_set_style_text_color(info, current_theme.text_secondary, 0); lv_obj_set_style_text_align(info, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align_to(info, s_card, LV_ALIGN_OUT_BOTTOM_MID, 0, 14); diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_evil_twin_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_evil_twin_ui.c index 14e8ebb82..af0c2334f 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_evil_twin_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_evil_twin_ui.c @@ -181,7 +181,7 @@ static void ap_scan_task(void *arg) { s_ap_count = n; s_is_scanning = false; - lv_async_call(scan_done_cb, NULL); + ui_async_call(scan_done_cb, NULL); vTaskDelete(NULL); } @@ -210,7 +210,7 @@ static void attack_task(void *arg) { evil_twin_get_last_password(s_password, sizeof(s_password)); s_is_captured = true; captured = true; - lv_async_call(password_ready_cb, NULL); + ui_async_call(password_ready_cb, NULL); } vTaskDelay(pdMS_TO_TICKS(ET_POLL_MS)); } diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_handshake_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_handshake_ui.c index ac355caaf..2ca64f634 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_handshake_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_handshake_ui.c @@ -28,6 +28,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #include "wifi_service.h" #include "wifi_sniffer.h" @@ -85,9 +86,6 @@ static const char *TAG = "WIFI_HANDSHAKE_UI"; #define SAVED_GAP 6 #define DOT_SIZE 9 -#define COL_OK 0x00E676 -#define COL_DIM 0x8A8594 - #define AP_NAME "Monitor" #define AP_CHAN "HOP" #define LBL_BSSID "BSSID" @@ -140,7 +138,7 @@ static const lv_point_precise_t WAVE_PTS[] = { #define WAVE_PT_COUNT ((int)(sizeof(WAVE_PTS) / sizeof(WAVE_PTS[0]))) static void style_badge(int i, bool lit) { - lv_color_t c = lit ? lv_color_hex(COL_OK) : lv_color_hex(COL_DIM); + lv_color_t c = lit ? lv_color_hex(UI_COL_SUCCESS) : current_theme.text_secondary; lv_obj_set_style_text_color(s_badge[i], c, 0); lv_obj_set_style_border_color(s_badge_box[i], c, 0); lv_obj_set_style_border_opa(s_badge_box[i], lit ? LV_OPA_40 : LV_OPA_20, 0); @@ -152,9 +150,9 @@ static void set_progress(int lit) { bool done = (lit >= BADGE_COUNT); lv_label_set_text(s_status, done ? TXT_COMPLETE : TXT_CAPTURING); - lv_obj_set_style_text_color(s_status, done ? lv_color_hex(COL_OK) : lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_status, done ? lv_color_hex(UI_COL_SUCCESS) : current_theme.text_secondary, 0); - lv_obj_set_style_bg_color(s_saved_dot, done ? lv_color_hex(COL_OK) : lv_color_hex(COL_DIM), 0); + lv_obj_set_style_bg_color(s_saved_dot, done ? lv_color_hex(UI_COL_SUCCESS) : current_theme.text_secondary, 0); lv_label_set_text(s_saved_txt, done ? TXT_CAPTURED : TXT_CAPTURING); } @@ -195,7 +193,7 @@ static void state_ready_cb(void *param) { lv_obj_set_style_text_color(s_pmkid_val, current_theme.border_accent, 0); } else { lv_label_set_text(s_pmkid_val, VAL_NONE); - lv_obj_set_style_text_color(s_pmkid_val, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_pmkid_val, current_theme.text_secondary, 0); } } } @@ -217,7 +215,7 @@ static void poll_worker(void *arg) { flags |= FLAG_PMKID; wifi_sniffer_get_pmkid_bssid(s_pm_bssid); } - lv_async_call(state_ready_cb, (void *)(uintptr_t)flags); + ui_async_call(state_ready_cb, (void *)(uintptr_t)flags); vTaskDelay(pdMS_TO_TICKS(POLL_INTERVAL_MS)); } @@ -284,12 +282,12 @@ static void build_info_card(lv_obj_t *parent) { lv_obj_t *chip_l = make_label(chip, AP_CHAN, &lv_font_montserrat_12, current_theme.border_accent); lv_obj_center(chip_l); - lv_obj_t *b_tag = make_label(card, LBL_BSSID, &lv_font_montserrat_12, lv_color_hex(COL_DIM)); + lv_obj_t *b_tag = make_label(card, LBL_BSSID, &lv_font_montserrat_12, current_theme.text_secondary); lv_obj_align(b_tag, LV_ALIGN_TOP_LEFT, 0, BSSID_Y); s_bssid_val = make_label(card, BSSID_NONE, &lv_font_montserrat_12, current_theme.text_main); lv_obj_align(s_bssid_val, LV_ALIGN_TOP_RIGHT, 0, BSSID_Y); - lv_obj_t *s_tag = make_label(card, LBL_STA, &lv_font_montserrat_12, lv_color_hex(COL_DIM)); + lv_obj_t *s_tag = make_label(card, LBL_STA, &lv_font_montserrat_12, current_theme.text_secondary); lv_obj_align(s_tag, LV_ALIGN_TOP_LEFT, 0, STA_Y); lv_obj_t *s_val = make_label(card, VAL_NONE, &lv_font_montserrat_12, current_theme.text_main); lv_obj_align(s_val, LV_ALIGN_TOP_RIGHT, 0, STA_Y); @@ -307,10 +305,10 @@ static void build_eapol_card(lv_obj_t *parent) { lv_obj_set_style_border_width(card, 1, 0); lv_obj_set_style_pad_all(card, CARD2_PAD, 0); - lv_obj_t *lbl = make_label(card, LBL_EAPOL, &lv_font_montserrat_12, lv_color_hex(COL_DIM)); + lv_obj_t *lbl = make_label(card, LBL_EAPOL, &lv_font_montserrat_12, current_theme.text_secondary); lv_obj_align(lbl, LV_ALIGN_TOP_LEFT, 0, EAPOL_LBL_Y); - s_status = make_label(card, TXT_CAPTURING, &lv_font_montserrat_12, lv_color_hex(COL_DIM)); + s_status = make_label(card, TXT_CAPTURING, &lv_font_montserrat_12, current_theme.text_secondary); lv_obj_align(s_status, LV_ALIGN_TOP_RIGHT, 0, EAPOL_LBL_Y); lv_obj_t *wave = lv_line_create(card); @@ -345,7 +343,7 @@ static void build_eapol_card(lv_obj_t *parent) { lv_obj_set_style_bg_opa(b, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(b, 1, 0); lv_obj_set_style_pad_all(b, 0, 0); - lv_obj_t *bl = make_label(b, BADGE_TXT[i], &lv_font_montserrat_12, lv_color_hex(COL_DIM)); + lv_obj_t *bl = make_label(b, BADGE_TXT[i], &lv_font_montserrat_12, current_theme.text_secondary); lv_obj_center(bl); s_badge[i] = bl; s_badge_box[i] = b; @@ -354,9 +352,9 @@ static void build_eapol_card(lv_obj_t *parent) { static void build_pmkid_row(lv_obj_t *parent) { lv_obj_t *row = make_row(parent, PMKID_ROW_H); - lv_obj_t *tag = make_label(row, LBL_PMKID, &lv_font_montserrat_12, lv_color_hex(COL_DIM)); + lv_obj_t *tag = make_label(row, LBL_PMKID, &lv_font_montserrat_12, current_theme.text_secondary); lv_obj_align(tag, LV_ALIGN_LEFT_MID, 0, 0); - s_pmkid_val = make_label(row, VAL_NONE, &lv_font_montserrat_12, lv_color_hex(COL_DIM)); + s_pmkid_val = make_label(row, VAL_NONE, &lv_font_montserrat_12, current_theme.text_secondary); lv_obj_align(s_pmkid_val, LV_ALIGN_RIGHT_MID, 0, 0); } @@ -372,9 +370,9 @@ static void build_saved_row(lv_obj_t *parent) { lv_obj_set_style_radius(s_saved_dot, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_border_width(s_saved_dot, 0, 0); lv_obj_set_style_bg_opa(s_saved_dot, LV_OPA_COVER, 0); - lv_obj_set_style_bg_color(s_saved_dot, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_bg_color(s_saved_dot, current_theme.text_secondary, 0); - s_saved_txt = make_label(row, TXT_CAPTURING, &lv_font_montserrat_12, lv_color_hex(COL_DIM)); + s_saved_txt = make_label(row, TXT_CAPTURING, &lv_font_montserrat_12, current_theme.text_secondary); } static void wifi_handshake_input(const input_event_t *ev, void *ctx) { diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_names_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_names_ui.c index 22da54185..be72f6d3c 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_names_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_names_ui.c @@ -80,7 +80,7 @@ static void on_kb_submit(const char *text, void *ud) { wifi_names_remove(s_edit_index); } s_edit_index = -1; - lv_async_call(rebuild_async, NULL); + ui_async_call(rebuild_async, NULL); } static void wifi_names_input(const input_event_t *ev, void *ctx) { diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_packets_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_packets_ui.c index c01b7555a..fd22da05a 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_packets_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_packets_ui.c @@ -145,7 +145,7 @@ static void packets_worker(void *arg) { hs = wifi_sniffer_handshake_captured(); s_pkt_count = count; s_hs_captured = hs; - lv_async_call(packets_update_cb, NULL); + ui_async_call(packets_update_cb, NULL); vTaskDelay(pdMS_TO_TICKS(PACKETS_POLL_MS)); } diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_port_scan_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_port_scan_ui.c index d71accd05..10d0ff284 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_port_scan_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_port_scan_ui.c @@ -139,7 +139,7 @@ static void scan_task(void *arg) { s_count = n; s_state = SCAN_DONE; s_scanning = false; - lv_async_call(scan_done_cb, NULL); + ui_async_call(scan_done_cb, NULL); vTaskDelete(NULL); } diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_probe_mon_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_probe_mon_ui.c index 4ec12fd8b..c5782e888 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_probe_mon_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_probe_mon_ui.c @@ -130,7 +130,7 @@ static void probe_worker(void *arg) { probe_monitor_free_results(); s_ui_count = (uint16_t)copied; s_seen_total = n; - lv_async_call(probe_refresh_cb, NULL); + ui_async_call(probe_refresh_cb, NULL); vTaskDelay(pdMS_TO_TICKS(POLL_INTERVAL_MS)); } diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_scan_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_scan_ui.c index ed1152566..50e119d60 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_scan_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_scan_ui.c @@ -175,7 +175,7 @@ static void wifi_scan_task(void *arg) { s_ap_count = n; s_scan_state = SCAN_DONE; s_scanning = false; - lv_async_call(scan_done_cb, NULL); + ui_async_call(scan_done_cb, NULL); vTaskDelete(NULL); } diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_signal_locator_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_signal_locator_ui.c index 199938529..72a0b7c21 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_signal_locator_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_signal_locator_ui.c @@ -75,7 +75,6 @@ static const char *TAG = "WIFI_SIG_LOC_UI"; #define NEAR_COLOR 0x00E676 #define WARM_COLOR 0x00E676 #define COLD_COLOR 0x29B6F6 -#define DIM_COLOR 0x8A8594 typedef enum { SL_PICK_SCANNING, SL_PICK_LIST, SL_LOCATING } sl_state_t; @@ -182,7 +181,7 @@ static void apply_signal(int prev_rssi) { hc = lv_color_hex(COLD_COLOR); ht = LV_SYMBOL_DOWN " COLDER"; } else { - hc = lv_color_hex(DIM_COLOR); + hc = current_theme.text_secondary; ht = LV_SYMBOL_MINUS " HOLD"; } lv_label_set_text(s_hint, ht); @@ -304,7 +303,7 @@ static void build_locator(void) { lv_obj_t *unit = lv_label_create(s_screen); lv_label_set_text(unit, "dBm"); lv_obj_set_style_text_font(unit, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(unit, lv_color_hex(DIM_COLOR), 0); + lv_obj_set_style_text_color(unit, current_theme.text_secondary, 0); lv_obj_align_to(unit, s_arc, LV_ALIGN_CENTER, 0, 16); s_hint = lv_label_create(s_screen); @@ -320,7 +319,7 @@ static void build_locator(void) { s_prox_label = lv_label_create(s_screen); lv_label_set_text(s_prox_label, proximity_text(rssi_to_pct(s_rssi))); lv_obj_set_style_text_font(s_prox_label, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(s_prox_label, lv_color_hex(DIM_COLOR), 0); + lv_obj_set_style_text_color(s_prox_label, current_theme.text_secondary, 0); lv_obj_set_style_text_align(s_prox_label, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(s_prox_label, LV_ALIGN_TOP_MID, 0, PROX_Y); @@ -357,7 +356,7 @@ static void signal_worker(void *arg) { while (s_poll_run && !s_restart_pending) { s_shared_rssi = signal_monitor_get_rssi(); - lv_async_call(signal_update_cb, NULL); + ui_async_call(signal_update_cb, NULL); vTaskDelay(pdMS_TO_TICKS(SIGNAL_POLL_MS)); } @@ -421,7 +420,7 @@ static void ap_pick_task(void *arg) { s_ap_count = n; s_pick_scanning = false; - lv_async_call(ap_pick_done_cb, NULL); + ui_async_call(ap_pick_done_cb, NULL); vTaskDelete(NULL); } diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_target_clients_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_target_clients_ui.c index 6d8bbc5b7..60f0288df 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_target_clients_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_target_clients_ui.c @@ -202,7 +202,7 @@ static void client_worker(void *arg) { bool started = target_scanner_start(bssid, channel); s_client_count = 0; s_client_active = started; - lv_async_call(client_update_cb, NULL); + ui_async_call(client_update_cb, NULL); bool scanning = started; while (started && s_poll_run && !s_restart_pending && scanning) { @@ -223,7 +223,7 @@ static void client_worker(void *arg) { s_client_count = n; scanning = is_scanning; s_client_active = is_scanning; - lv_async_call(client_update_cb, NULL); + ui_async_call(client_update_cb, NULL); } target_scanner_free_results(); @@ -296,7 +296,7 @@ static void ap_pick_task(void *arg) { s_ap_count = n; s_pick_scanning = false; - lv_async_call(ap_pick_done_cb, NULL); + ui_async_call(ap_pick_done_cb, NULL); vTaskDelete(NULL); } diff --git a/firmware_p4/components/Applications/ui/ui_manager.c b/firmware_p4/components/Applications/ui/ui_manager.c index fda621bd9..bba011fda 100644 --- a/firmware_p4/components/Applications/ui/ui_manager.c +++ b/firmware_p4/components/Applications/ui/ui_manager.c @@ -78,10 +78,18 @@ #include "haptic_ui.h" #include "speaker_ui.h" #include "micrec_ui.h" +#include "mp3_player_ui.h" +#include "mp4_player_ui.h" #include "wav_player_ui.h" +#include "image_viewer_ui.h" +#include "usb_storage_ui.h" #include "wav_library_ui.h" #include "spectrum_ui.h" #include "lora_chat_ui.h" +#include "games_menu_ui.h" +#include "snake_ui.h" +#include "breakout_ui.h" +#include "gb_ui.h" #include "octobit_status_ui.h" #include "dev_menu_ui.h" #include "subghz_menu_ui.h" @@ -182,6 +190,10 @@ static void render_beat_cb(lv_timer_t *t) { s_render_beat++; } +void ui_render_beat_kick(void) { + s_render_beat++; +} + // Event-driven input. One pump (created in ui_init) drains input_manager events // and dispatches them to the active screen's handler, replacing the ~110 // per-screen polling lv_timers. Input is swallowed while a transition lock is @@ -354,6 +366,14 @@ static ui_close_fn_t screen_close_fn(screen_id_t s) { case SCREEN_NFC_READ: case SCREEN_NFC_EMULATE: return nfc_manager_stop; + case SCREEN_WAV_PLAYER: + return ui_wav_player_stop; + case SCREEN_MP3_PLAYER: + return ui_mp3_player_stop; + case SCREEN_IMAGE_VIEWER: + return ui_image_viewer_stop; + case SCREEN_USB_STORAGE: + return ui_usb_storage_stop; default: return NULL; } @@ -431,12 +451,28 @@ static ui_open_fn_t screen_open_fn(screen_id_t s) { return ui_micrec_open; case SCREEN_WAV_PLAYER: return ui_wav_player_open; + case SCREEN_MP4_PLAYER: + return ui_mp4_player_open; + case SCREEN_MP3_PLAYER: + return ui_mp3_player_open; case SCREEN_PLAYER: return ui_wav_library_open; + case SCREEN_IMAGE_VIEWER: + return ui_image_viewer_open; + case SCREEN_USB_STORAGE: + return ui_usb_storage_open; case SCREEN_SPECTRUM: return ui_spectrum_open; case SCREEN_LORA_CHAT: return ui_lora_chat_open; + case SCREEN_GAMES_MENU: + return ui_games_menu_open; + case SCREEN_GAME_SNAKE: + return ui_snake_open; + case SCREEN_GAME_BREAKOUT: + return ui_breakout_open; + case SCREEN_GAME_GB: + return ui_gb_open; case SCREEN_OCTOBIT_STATUS: return ui_octobit_status_open; case SCREEN_DEV_MENU: @@ -635,6 +671,10 @@ bool ui_screen_shows_chrome(screen_id_t s) { case SCREEN_SUBGHZ_BRUTE: // --- Audio / LoRa / sensors: play / record / live monitor --- case SCREEN_WAV_PLAYER: + case SCREEN_MP4_PLAYER: + case SCREEN_MP3_PLAYER: + case SCREEN_IMAGE_VIEWER: + case SCREEN_USB_STORAGE: case SCREEN_SPECTRUM: case SCREEN_MIC_REC: case SCREEN_LORA_RNODE: @@ -681,7 +721,7 @@ void ui_switch_screen(screen_id_t new_screen) { ui_chrome_set_status_enabled(ui_screen_shows_chrome(new_screen)); open_fn(); current_screen_id = new_screen; - if (outgoing != NULL && outgoing != lv_screen_active()) + if (outgoing != NULL && outgoing != lv_screen_active() && lv_obj_is_valid(outgoing)) lv_obj_del_async(outgoing); screen_tips_hook(new_screen); ui_release(); @@ -702,6 +742,13 @@ void ui_release(void) { lvgl_glue_unlock(); } +void ui_async_call(lv_async_cb_t cb, void *user_data) { + if (ui_acquire()) { + lv_async_call(cb, user_data); + ui_release(); + } +} + void ui_screen_load(lv_obj_t *scr) { lv_screen_load(scr); } From a897595ecff533dfe29f680f84b428e1d7596c95 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:23:26 -0300 Subject: [PATCH 013/103] fix(radio): demote SX1262 RX-error hot-path logs; stop needless RX re-arm MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Under RF noise on 915 MHz the SX1262 fires continuous CRC/Header-error RxDone events; each was logged at I/W and re-armed RX, saturating the log tee (forwarded over BLE/SPI on SYS_CORE_RADIO) and the SPI3 bus shared with the ST7789 display -> renderer stall / SPI-collision. Demote the per-noise-packet logs I/W -> D (compile out at INFO), and drop the redundant sx1262_receive_continuous() re-arm on CRC/Header errors in Meshtastic on_rx_done (the chip stays in RX-continuous anyway, matching MeshCore). Note: the structural fix — a shared SPI3 bus lock between the SX1262 HAL and the ST7789 panel so a radio transfer never overlaps a display flush — is still pending. Co-Authored-By: Claude Opus 4.8 --- .../components/Applications/LoRa/meshcore/meshcore_router.c | 2 +- .../Applications/LoRa/meshtastic/meshtastic_mesh.c | 5 +---- firmware_p4/components/Drivers/sx1262/sx1262_irq.c | 6 +++--- firmware_p4/components/Drivers/sx1262/sx1262_radio.c | 2 +- 4 files changed, 6 insertions(+), 9 deletions(-) diff --git a/firmware_p4/components/Applications/LoRa/meshcore/meshcore_router.c b/firmware_p4/components/Applications/LoRa/meshcore/meshcore_router.c index bbb874a40..4ea34f170 100644 --- a/firmware_p4/components/Applications/LoRa/meshcore/meshcore_router.c +++ b/firmware_p4/components/Applications/LoRa/meshcore/meshcore_router.c @@ -659,7 +659,7 @@ static void on_rx_done(const sx1262_packet_t *pkt, void *ctx) { if (pkt == NULL) return; if (pkt->has_crc_error || pkt->has_header_error) { - ESP_LOGW(TAG, "RX HW error -- skip"); + ESP_LOGD(TAG, "RX HW error -- skip"); return; } diff --git a/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_mesh.c b/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_mesh.c index 18d386b20..79f948bf6 100644 --- a/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_mesh.c +++ b/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_mesh.c @@ -1181,10 +1181,7 @@ static void on_rx_done(const sx1262_packet_t *pkt, void *ctx) { if (pkt == NULL) return; if (pkt->has_crc_error || pkt->has_header_error) { - ESP_LOGW(TAG, "RX: erro HW, ignoring"); - - if (s_is_running) - sx1262_receive_continuous(); + ESP_LOGD(TAG, "RX: erro HW, ignoring"); return; } diff --git a/firmware_p4/components/Drivers/sx1262/sx1262_irq.c b/firmware_p4/components/Drivers/sx1262/sx1262_irq.c index e463311c4..dca40c9ce 100644 --- a/firmware_p4/components/Drivers/sx1262/sx1262_irq.c +++ b/firmware_p4/components/Drivers/sx1262/sx1262_irq.c @@ -102,7 +102,7 @@ esp_err_t sx1262_irq_process(void) { uint8_t next_head = (s_rx_head + 1) % SX1262_RX_RING_SIZE; if (next_head == s_rx_tail) { s_hal->exit_critical(s_hal->ctx); - ESP_LOGW(TAG, "Ring buffer full — packet discarded"); + ESP_LOGD(TAG, "Ring buffer full — packet discarded"); } else { memcpy(&s_rx_ring[s_rx_head], &pkt, sizeof(sx1262_packet_t)); s_rx_head = next_head; @@ -128,13 +128,13 @@ esp_err_t sx1262_irq_process(void) { } if ((irq_flags & SX1262_IRQ_CRC_ERR) && !(irq_flags & SX1262_IRQ_RX_DONE)) { - ESP_LOGW(TAG, "IRQ: CRC error (standalone)"); + ESP_LOGD(TAG, "IRQ: CRC error (standalone)"); if (s_cbs.on_error != NULL) { s_cbs.on_error(ESP_ERR_INVALID_CRC, s_cbs.cb_ctx); } } if ((irq_flags & SX1262_IRQ_HEADER_ERR) && !(irq_flags & SX1262_IRQ_RX_DONE)) { - ESP_LOGW(TAG, "IRQ: Header error (standalone)"); + ESP_LOGD(TAG, "IRQ: Header error (standalone)"); if (s_cbs.on_error != NULL) { s_cbs.on_error(ESP_FAIL, s_cbs.cb_ctx); } diff --git a/firmware_p4/components/Drivers/sx1262/sx1262_radio.c b/firmware_p4/components/Drivers/sx1262/sx1262_radio.c index 40bcb9e43..0341532f0 100644 --- a/firmware_p4/components/Drivers/sx1262/sx1262_radio.c +++ b/firmware_p4/components/Drivers/sx1262/sx1262_radio.c @@ -209,7 +209,7 @@ esp_err_t sx1262_radio_receive_continuous(void) { return ret; } - ESP_LOGI(TAG, "RX continuous started"); + ESP_LOGD(TAG, "RX continuous started"); return ESP_OK; } From 694ca59f794c5f182463b85a255e94812d6e51f2 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 13:23:52 -0300 Subject: [PATCH 014/103] refactor(ui): semantic theme colors Replace hardcoded hex colors across the screens with current_theme.* / UI_COL_* semantic tokens; add the shared token header (ui_semantic.h) and the theme text-secondary field so screens follow the active theme instead of baked-in colors. Co-Authored-By: Claude Opus 4.8 --- .../capture_result/capture_result_ui.c | 5 +- .../Applications/ui/include/ui_semantic.h | 56 +++++++++++++++++++ .../Applications/ui/include/ui_theme.h | 1 + .../ui/screens/badusb/usb_mouse_ui.c | 15 +++-- .../ui/screens/bluetooth/ble_beacon_ui.c | 6 +- .../ui/screens/bluetooth/ble_companion_ui.c | 12 ++-- .../ui/screens/bluetooth/ble_exposure_ui.c | 3 - .../ui/screens/bluetooth/ble_flood_ui.c | 6 +- .../ui/screens/bluetooth/ble_keyboard_ui.c | 10 ++-- .../ui/screens/bluetooth/ble_mouse_ui.c | 4 +- .../ui/screens/bluetooth/ble_radio_ui.c | 3 +- .../ui/screens/bluetooth/ble_skimmer_ui.c | 5 +- .../ui/screens/bluetooth/ble_sniffer_ui.c | 2 - .../ui/screens/bluetooth/ble_spam_ui.c | 7 +-- .../screens/bluetooth/ble_track_device_ui.c | 7 +-- .../ui/screens/bluetooth/ble_tracker_ui.c | 5 +- .../ui/screens/boot_report/boot_map_ui.c | 4 +- .../Applications/ui/screens/dev/dev_diag_ui.c | 15 +++-- .../Applications/ui/screens/dev/scripts_ui.c | 11 ++-- .../ui/screens/games/imu_monitor_ui.c | 7 +-- .../Applications/ui/screens/games/motion_ui.c | 7 +-- .../ui/screens/infrared/ir_controller_ui.c | 8 +-- .../ui/screens/infrared/ir_raw_ui.c | 20 +++---- .../ui/screens/infrared/ir_receive_ui.c | 5 +- .../ui/screens/lora/lora_channels_ui.c | 7 +-- .../ui/screens/lora/lora_chat_ui.c | 41 +++++++------- .../ui/screens/lora/lora_mqtt_ui.c | 8 +-- .../ui/screens/lora/lora_position_ui.c | 15 +++-- .../ui/screens/lora/lora_rnode_ui.c | 10 ++-- .../ui/screens/lora/lora_securedm_ui.c | 23 ++++---- .../ui/screens/lora/lora_telemetry_ui.c | 21 ++++--- .../ui/screens/lora/lora_traceroute_ui.c | 8 +-- .../ui/screens/nfc/nfc_bankcard_ui.c | 3 +- .../ui/screens/nfc/nfc_config_ui.c | 2 +- .../ui/screens/nfc/nfc_desfire_ui.c | 9 ++- .../ui/screens/nfc/nfc_emulate_ui.c | 9 ++- .../ui/screens/nfc/nfc_felica_ui.c | 5 +- .../ui/screens/nfc/nfc_iso15693_ui.c | 7 +-- .../ui/screens/nfc/nfc_keydict_ui.c | 6 +- .../Applications/ui/screens/nfc/nfc_ndef_ui.c | 10 ++-- .../Applications/ui/screens/nfc/nfc_p2p_ui.c | 17 +++--- .../Applications/ui/screens/nfc/nfc_read_ui.c | 3 +- .../Applications/ui/screens/nfc/nfc_scan_ui.c | 23 ++++---- .../ui/screens/nfc/nfc_ultralight_ui.c | 3 +- .../ui/screens/nfc/nfc_write_ui.c | 11 ++-- .../ui/screens/octobit/octobit_status_ui.c | 11 ++-- .../Applications/ui/screens/power/power_ui.c | 13 ++--- .../ui/screens/rfid/rfid_menu_ui.c | 35 ++++++------ .../ui/screens/settings/battery_settings_ui.c | 12 ++-- .../ui/screens/settings/c5_status_ui.c | 9 ++- .../ui/screens/settings/led_ctrl_ui.c | 3 +- .../ui/screens/settings/sd_health_ui.c | 15 +++-- .../ui/screens/settings/system_update_ui.c | 13 ++--- .../ui/screens/subghz/subghz_brute_ui.c | 5 +- .../ui/screens/subghz/subghz_config_ui.c | 9 ++- .../ui/screens/subghz/subghz_read_ui.c | 5 +- .../ui/screens/subghz/subghz_send_ui.c | 9 ++- .../ui/screens/wifi/wifi_hotspot_ui.c | 23 ++++---- .../components/Applications/ui/ui_theme.c | 9 +++ 59 files changed, 318 insertions(+), 318 deletions(-) create mode 100644 firmware_p4/components/Applications/ui/include/ui_semantic.h diff --git a/firmware_p4/components/Applications/ui/components/capture_result/capture_result_ui.c b/firmware_p4/components/Applications/ui/components/capture_result/capture_result_ui.c index 27b5cae63..5bea94807 100644 --- a/firmware_p4/components/Applications/ui/components/capture_result/capture_result_ui.c +++ b/firmware_p4/components/Applications/ui/components/capture_result/capture_result_ui.c @@ -21,7 +21,6 @@ #include "ui_chrome.h" #include "ui_theme.h" -#define COL_DIM 0x8A8594 #define COL_RAISE 0x170A28 #define CR_TOP UI_CHROME_HEADER_H @@ -58,7 +57,7 @@ static void style_row(capture_result_t *cr, int i, bool sel) { lv_obj_set_style_shadow_color(cr->rows[i], cr->accent, 0); lv_obj_set_style_shadow_spread(cr->rows[i], sel ? -3 : 0, 0); if (!(cr->saved && i == CAP_ACT_SAVE)) - lv_obj_set_style_text_color(cr->icons[i], sel ? cr->accent : lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(cr->icons[i], sel ? cr->accent : current_theme.text_secondary, 0); } static void refresh(capture_result_t *cr) { @@ -127,7 +126,7 @@ static void make_card(capture_result_t *cr, lv_obj_t *root, const capture_result lv_label_set_long_mode(sub, LV_LABEL_LONG_DOT); lv_label_set_text(sub, cfg->card_sub); lv_obj_set_style_text_font(sub, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(sub, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(sub, current_theme.text_secondary, 0); } if (cfg->card_value) { lv_obj_t *val = lv_label_create(col); diff --git a/firmware_p4/components/Applications/ui/include/ui_semantic.h b/firmware_p4/components/Applications/ui/include/ui_semantic.h new file mode 100644 index 000000000..2fd548e18 --- /dev/null +++ b/firmware_p4/components/Applications/ui/include/ui_semantic.h @@ -0,0 +1,56 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#ifndef UI_SEMANTIC_H +#define UI_SEMANTIC_H + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @file ui_semantic.h + * @brief Semantic UI colors — meaning-bound, not theme-bound. + * + * These express a fixed meaning ("this is good", "this is dangerous") that must + * read the same in every theme, so they are deliberately hardcoded rather than + * pulled from current_theme. Use them with lv_color_hex(UI_COL_*). + * + * Rule of thumb: + * - Structural color (background, border, primary/secondary text): use current_theme.*. + * - Meaning color (success/danger/warning): use one of these. + * - Screen-specific art (game sprites, data-series palette): keep it local; it is neither. + */ + +/** @brief Good / connected / on / signal-present (green). */ +#define UI_COL_SUCCESS 0x00E676 + +/** @brief Bad / threat / stop / failure (red). */ +#define UI_COL_DANGER 0xFF5252 + +/** @brief Caution / pending / degraded (amber). */ +#define UI_COL_WARNING 0xFFB300 + +/** @brief Max-contrast text/fill, absolute by intent. */ +#define UI_COL_WHITE 0xFFFFFF + +/** @brief Absolute black, absolute by intent. */ +#define UI_COL_BLACK 0x000000 + +#ifdef __cplusplus +} +#endif + +#endif // UI_SEMANTIC_H diff --git a/firmware_p4/components/Applications/ui/include/ui_theme.h b/firmware_p4/components/Applications/ui/include/ui_theme.h index cd6b499ea..50909ca38 100644 --- a/firmware_p4/components/Applications/ui/include/ui_theme.h +++ b/firmware_p4/components/Applications/ui/include/ui_theme.h @@ -34,6 +34,7 @@ typedef struct { lv_color_t border_interface; lv_color_t border_inactive; lv_color_t text_main; + lv_color_t text_secondary; lv_color_t screen_base; lv_color_t protocol_nfc; diff --git a/firmware_p4/components/Applications/ui/screens/badusb/usb_mouse_ui.c b/firmware_p4/components/Applications/ui/screens/badusb/usb_mouse_ui.c index e88a7e520..f58c53b37 100644 --- a/firmware_p4/components/Applications/ui/screens/badusb/usb_mouse_ui.c +++ b/firmware_p4/components/Applications/ui/screens/badusb/usb_mouse_ui.c @@ -20,6 +20,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #define MOVE_TICK_MS 50 @@ -34,8 +35,6 @@ #define MX 8 #define CONTENT_W (240 - 2 * MX) -#define COL_DIM 0x8A8594 -#define COL_SUCCESS 0x00E676 #define COL_ACC2 0xB89AFF #define STATUS_Y 48 @@ -103,7 +102,7 @@ static void refresh_chip(void) { } if (s_chip_lbl) lv_obj_set_style_text_color( - s_chip_lbl, s_jiggle ? current_theme.screen_base : lv_color_hex(COL_DIM), 0); + s_chip_lbl, s_jiggle ? current_theme.screen_base : current_theme.text_secondary, 0); } static void build_status(void) { @@ -113,7 +112,7 @@ static void build_status(void) { lv_obj_align(dot, LV_ALIGN_TOP_LEFT, MX, STATUS_Y + 5); lv_obj_set_style_radius(dot, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_border_width(dot, 0, 0); - lv_obj_set_style_bg_color(dot, lv_color_hex(COL_SUCCESS), 0); + lv_obj_set_style_bg_color(dot, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_set_style_bg_opa(dot, LV_OPA_COVER, 0); lv_obj_t *lbl = lv_label_create(s_screen); @@ -176,7 +175,7 @@ static void build_trackpad(void) { lv_obj_t *tag = lv_label_create(pad); lv_label_set_text(tag, "trackpad"); lv_obj_set_style_text_font(tag, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(tag, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(tag, current_theme.text_secondary, 0); lv_obj_align(tag, LV_ALIGN_BOTTOM_LEFT, 6, -4); } @@ -190,7 +189,7 @@ static void build_rail(void) { lv_obj_set_style_pad_hor(rail, 0, 0); lv_obj_set_style_bg_color(rail, current_theme.bg_primary, 0); lv_obj_set_style_bg_opa(rail, LV_OPA_COVER, 0); - lv_obj_set_style_border_color(rail, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_border_color(rail, current_theme.text_secondary, 0); lv_obj_set_style_border_opa(rail, LV_OPA_40, 0); lv_obj_set_style_border_width(rail, 1, 0); lv_obj_set_flex_flow(rail, LV_FLEX_FLOW_COLUMN); @@ -205,7 +204,7 @@ static void build_rail(void) { lv_obj_t *scr = lv_label_create(rail); lv_label_set_text(scr, "SCR"); lv_obj_set_style_text_font(scr, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(scr, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(scr, current_theme.text_secondary, 0); lv_obj_t *down = lv_label_create(rail); lv_label_set_text(down, LV_SYMBOL_DOWN); @@ -236,7 +235,7 @@ static void build_click(int x, const char *text, bool selected) { lv_label_set_text(lbl, text); lv_obj_set_style_text_font(lbl, &lv_font_montserrat_14, 0); lv_obj_set_style_text_color( - lbl, selected ? current_theme.border_accent : lv_color_hex(COL_DIM), 0); + lbl, selected ? current_theme.border_accent : current_theme.text_secondary, 0); lv_obj_center(lbl); } diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_beacon_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_beacon_ui.c index fe21279c3..95b9fdefb 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_beacon_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_beacon_ui.c @@ -32,8 +32,6 @@ #define CARD_W 160 #define CARD_H 54 -#define COL_DIM 0x8A8594 - typedef struct { const char *kind; const char *uuid; @@ -136,7 +134,7 @@ void ui_beacon_spam_open(void) { lv_obj_t *type = lv_label_create(body); lv_label_set_text(type, "Type: Mixed"); - lv_obj_set_style_text_color(type, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(type, current_theme.text_secondary, 0); lv_obj_set_style_text_font(type, &lv_font_montserrat_12, 0); lv_obj_set_style_text_align(type, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(type, LV_ALIGN_TOP_MID, 0, 78); @@ -153,7 +151,7 @@ void ui_beacon_spam_open(void) { s_uuid_label = lv_label_create(body); lv_label_set_text_fmt(s_uuid_label, "%s %s", BEACONS[0].kind, BEACONS[0].uuid); - lv_obj_set_style_text_color(s_uuid_label, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_uuid_label, current_theme.text_secondary, 0); lv_obj_set_style_text_font(s_uuid_label, &lv_font_montserrat_12, 0); lv_obj_set_style_text_align(s_uuid_label, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(s_uuid_label, LV_ALIGN_TOP_MID, 0, 166); diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_companion_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_companion_ui.c index 4f34daa43..7818261fa 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_companion_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_companion_ui.c @@ -24,6 +24,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #include "waves_ui.h" @@ -32,9 +33,6 @@ static const char *TAG = "BLE_COMPANION_UI"; #define CONN_POLL_MS 500 #define COMPANION_ICON "/assets/icons/app_shortcut.bin" -#define SIG_GREEN 0x00E676 -#define COL_DIM 0x8A8594 - static lv_obj_t *s_screen = NULL; static lv_obj_t *s_body = NULL; static lv_obj_t *s_footer = NULL; @@ -113,7 +111,7 @@ static void build_pairing(void) { lv_obj_t *caption = lv_label_create(s_body); lv_label_set_text(caption, "Pairing key (PSK):"); - lv_obj_set_style_text_color(caption, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(caption, current_theme.text_secondary, 0); lv_obj_set_style_text_font(caption, &lv_font_montserrat_12, 0); lv_obj_align(caption, LV_ALIGN_CENTER, 0, 78); @@ -154,7 +152,7 @@ static void show_success(void) { lv_obj_t *seal = lv_obj_create(seal_slot); lv_obj_remove_flag(seal, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_style_radius(seal, LV_RADIUS_CIRCLE, 0); - lv_obj_set_style_bg_color(seal, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_bg_color(seal, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_set_style_bg_opa(seal, LV_OPA_COVER, 0); lv_obj_set_style_border_width(seal, 0, 0); lv_obj_set_style_pad_all(seal, 0, 0); @@ -169,7 +167,7 @@ static void show_success(void) { lv_obj_t *status = lv_label_create(s_body); lv_label_set_text(status, "Companion linked!"); - lv_obj_set_style_text_color(status, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_text_color(status, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_set_style_text_font(status, &lv_font_montserrat_14, 0); lv_obj_set_style_text_align(status, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(status, LV_ALIGN_CENTER, 0, 42); @@ -188,7 +186,7 @@ static void show_success(void) { lv_obj_t *ver = lv_label_create(badge); lv_label_set_text(ver, "v1.2 - Companion v1.0"); - lv_obj_set_style_text_color(ver, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(ver, current_theme.text_secondary, 0); lv_obj_set_style_text_font(ver, &lv_font_montserrat_12, 0); pop_in(seal, 30, 360); diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_exposure_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_exposure_ui.c index 4a71dbb3e..26481790a 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_exposure_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_exposure_ui.c @@ -36,9 +36,6 @@ static const char *TAG = "BLE_EXPOSURE_UI"; #define ROW_LEN 36 #define LIST_BUF_LEN (MAX_ADV * ROW_LEN) -#define COL_DIM 0x8A8594 -#define COL_SUCCESS 0x00E676 - #define EXPO_ICON "/assets/icons/broadcast_on_personal.bin" #define COUNT_CARD_W 190 diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_flood_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_flood_ui.c index 14e094895..da526fe1a 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_flood_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_flood_ui.c @@ -42,8 +42,6 @@ static const char *TAG = "BLE_FLOOD_UI"; #define BLE_ADDR_LEN 6 -#define COL_DIM 0x8A8594 - #define CARD_W 172 #define CARD_H 54 @@ -164,7 +162,7 @@ void ui_ble_flood_open(void) { s_target_label = lv_label_create(body); lv_label_set_text(s_target_label, ""); - lv_obj_set_style_text_color(s_target_label, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_target_label, current_theme.text_secondary, 0); lv_obj_set_style_text_font(s_target_label, &lv_font_montserrat_12, 0); lv_obj_align(s_target_label, LV_ALIGN_TOP_MID, 0, 38); @@ -185,7 +183,7 @@ void ui_ble_flood_open(void) { s_rate_label = lv_label_create(body); lv_label_set_text(s_rate_label, ""); - lv_obj_set_style_text_color(s_rate_label, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_rate_label, current_theme.text_secondary, 0); lv_obj_set_style_text_font(s_rate_label, &lv_font_montserrat_12, 0); lv_obj_align(s_rate_label, LV_ALIGN_TOP_MID, 0, 178); diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_keyboard_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_keyboard_ui.c index 03ffa2214..2066467cb 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_keyboard_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_keyboard_ui.c @@ -26,6 +26,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #include "waves_ui.h" @@ -41,9 +42,6 @@ static const char *TAG = "BLE_KEYBOARD_UI"; #define KB_ICON "/assets/icons/keyboard.bin" -#define SIG_GREEN 0x00E676 -#define COL_DIM 0x8A8594 - #define CONSOLE_W 212 #define CONSOLE_H 150 #define TYPED_MAX 160 @@ -113,7 +111,7 @@ static void build_pairing(void) { lv_obj_t *hint = lv_label_create(s_body); lv_label_set_text(hint, "Accept on Target-PC"); - lv_obj_set_style_text_color(hint, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(hint, current_theme.text_secondary, 0); lv_obj_set_style_text_font(hint, &lv_font_montserrat_12, 0); lv_obj_set_style_text_align(hint, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(hint, LV_ALIGN_CENTER, 0, 82); @@ -140,7 +138,7 @@ static void build_console(void) { lv_obj_t *status = lv_label_create(s_body); lv_label_set_text(status, LV_SYMBOL_OK " Connected"); - lv_obj_set_style_text_color(status, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_text_color(status, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_set_style_text_font(status, &lv_font_montserrat_14, 0); lv_obj_set_style_text_align(status, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(status, LV_ALIGN_TOP_MID, 0, 10); @@ -151,7 +149,7 @@ static void build_console(void) { s_term_label = lv_label_create(card); lv_label_set_long_mode(s_term_label, LV_LABEL_LONG_WRAP); lv_obj_set_width(s_term_label, CONSOLE_W - 20); - lv_obj_set_style_text_color(s_term_label, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_text_color(s_term_label, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_set_style_text_font(s_term_label, &lv_font_montserrat_14, 0); lv_obj_align(s_term_label, LV_ALIGN_TOP_LEFT, 0, 0); update_terminal(); diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_mouse_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_mouse_ui.c index dde30f53e..f7fe43c91 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_mouse_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_mouse_ui.c @@ -24,6 +24,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #include "waves_ui.h" @@ -34,7 +35,6 @@ static const char *TAG = "BLE_MOUSE_UI"; #define FOUND_DWELL_US 600000 #define DOT_CYCLE_US 350000 -#define SIG_GREEN 0x00E676 #define COL_RAISE 0x170A28 static void opa_cb(void *var, int32_t v) { @@ -85,7 +85,7 @@ static void pair_reveal(void) { s_pair_waves = waves_create(s_pair_screen, LV_ALIGN_CENTER, 0, -24, LV_SYMBOL_OK, NULL); lv_label_set_text(s_pair_status, "Connected!"); - lv_obj_set_style_text_color(s_pair_status, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_text_color(s_pair_status, lv_color_hex(UI_COL_SUCCESS), 0); ui_feedback(UI_FB_EMULATE); } diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_radio_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_radio_ui.c index 87d941dba..39a565410 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_radio_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_radio_ui.c @@ -40,7 +40,6 @@ #define ROW_GAP 8 #define ROW_STEP (ROW_H + ROW_GAP) -#define COL_DIM 0x8A8594 #define COL_RAISE 0x170A28 enum { @@ -104,7 +103,7 @@ static void update_values(void) { static void refresh_selection(void) { const lv_color_t accent = current_theme.border_accent; - const lv_color_t dim = lv_color_hex(COL_DIM); + const lv_color_t dim = current_theme.text_secondary; for (int i = 0; i < R_COUNT; i++) { bool sel = (i == s_sel); lv_obj_set_style_border_color(s_row[i], sel ? accent : current_theme.border_inactive, 0); diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_skimmer_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_skimmer_ui.c index 9f38f562a..6becf5f8e 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_skimmer_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_skimmer_ui.c @@ -37,7 +37,6 @@ static const char *TAG = "BLE_SKIMMER_UI"; #define DETAIL_LEN 48 #define SUSPECTS_SHOWN 3 -#define COL_DIM 0x8A8594 #define COL_THREAT 0xFFB300 #define SKIM_ICON "/assets/icons/warning.bin" @@ -119,7 +118,7 @@ static void make_suspect_card(lv_obj_t *parent, const char *name, const char *ma char buf[DETAIL_LEN]; snprintf(buf, sizeof(buf), "%s %d dBm", mac, rssi); lv_label_set_text(detail, buf); - lv_obj_set_style_text_color(detail, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(detail, current_theme.text_secondary, 0); lv_obj_set_style_text_font(detail, &lv_font_montserrat_12, 0); lv_obj_align(detail, LV_ALIGN_TOP_LEFT, 0, DETAIL_Y); } @@ -141,7 +140,7 @@ static void build_scanning_view(void) { lv_obj_t *sub = lv_label_create(s_screen); lv_label_set_text(sub, "Looking for HC / RNBT chips"); - lv_obj_set_style_text_color(sub, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(sub, current_theme.text_secondary, 0); lv_obj_set_style_text_font(sub, &lv_font_montserrat_12, 0); lv_obj_set_style_text_align(sub, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(sub, LV_ALIGN_CENTER, 0, SUB_Y_OFS); diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_sniffer_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_sniffer_ui.c index bc1fc6336..4d364c740 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_sniffer_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_sniffer_ui.c @@ -36,8 +36,6 @@ static const char *TAG = "BLE_SNIFFER_UI"; #define ROW_LEN 40 #define FEED_BUF_LEN (MAX_ROWS * ROW_LEN) -#define COL_DIM 0x8A8594 - #define SNIFF_ICON "/assets/icons/monitoring.bin" #define STATUS_Y 48 diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_spam_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_spam_ui.c index 4b7050658..d10040978 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_spam_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_spam_ui.c @@ -33,7 +33,6 @@ static const char *TAG = "BLE_SPAM_UI"; #define RUN_TICK_MS 250 -#define COL_DIM 0x8A8594 #define SPAM_ICON "/assets/icons/broadcast_on_personal.bin" #define SPAM_GRID_PAD 8 @@ -116,7 +115,7 @@ static lv_obj_t *build_spam_card( lv_obj_t *d = lv_label_create(c); lv_label_set_text(d, effect); lv_obj_set_style_text_font(d, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(d, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(d, current_theme.text_secondary, 0); return c; } @@ -288,7 +287,7 @@ void ui_ble_spam_open(void) { const canned_spam_type_t *mt = spam_get_attack_type(s_spam_mode); lv_obj_t *mode = lv_label_create(body); lv_label_set_text_fmt(mode, "Mode: %s", (mt != NULL && mt->name) ? mt->name : "?"); - lv_obj_set_style_text_color(mode, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(mode, current_theme.text_secondary, 0); lv_obj_set_style_text_font(mode, &lv_font_montserrat_12, 0); lv_obj_align(mode, LV_ALIGN_TOP_MID, 0, 34); @@ -306,7 +305,7 @@ void ui_ble_spam_open(void) { s_run_rate_label = lv_label_create(body); lv_label_set_text(s_run_rate_label, "Broadcasting"); - lv_obj_set_style_text_color(s_run_rate_label, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_run_rate_label, current_theme.text_secondary, 0); lv_obj_set_style_text_font(s_run_rate_label, &lv_font_montserrat_12, 0); lv_obj_align(s_run_rate_label, LV_ALIGN_TOP_MID, 0, 180); diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_track_device_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_track_device_ui.c index 3e528882f..cdc3d8c86 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_track_device_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_track_device_ui.c @@ -52,7 +52,6 @@ static const char *TAG = "BLE_TRACK_DEV"; #define COL_COLD 0x2A6FDB #define COL_WARM 0xFFB300 #define COL_HOT 0x00E676 -#define COL_DIM 0x8A8594 typedef enum { PHASE_SCAN, PHASE_TRACK, PHASE_NOTGT } track_phase_t; @@ -118,7 +117,7 @@ static void apply_reading(int trend) { lv_obj_set_style_text_color(s_caption, lv_color_hex(COL_COLD), 0); } else { lv_label_set_text(s_caption, "Hold steady"); - lv_obj_set_style_text_color(s_caption, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_caption, current_theme.text_secondary, 0); } } } @@ -179,12 +178,12 @@ void ui_ble_track_device_open(void) { lv_obj_t *tip = lv_label_create(s_screen); lv_label_set_text(tip, "Move around to home in"); lv_obj_set_style_text_font(tip, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(tip, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(tip, current_theme.text_secondary, 0); lv_obj_align(tip, LV_ALIGN_BOTTOM_MID, 0, -(UI_CHROME_FOOTER_H + 14)); if (s_caption != NULL) { lv_label_set_text(s_caption, "Finding devices..."); - lv_obj_set_style_text_color(s_caption, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_caption, current_theme.text_secondary, 0); } lv_obj_fade_in(s_screen, 240, 0); diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_tracker_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_tracker_ui.c index 36bb03ad0..5c67893b4 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_tracker_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_tracker_ui.c @@ -36,7 +36,6 @@ static const char *TAG = "BLE_TRACKER_UI"; #define DETAIL_LEN 48 #define TRACKERS_SHOWN 3 -#define COL_DIM 0x8A8594 #define COL_ALERT 0xFF5252 #define TRACK_ICON "/assets/icons/troubleshoot.bin" @@ -125,7 +124,7 @@ static void make_tracker_card(lv_obj_t *parent, const char *type, const char *ma char buf[DETAIL_LEN]; snprintf(buf, sizeof(buf), "%s %d dBm", mac, rssi); lv_label_set_text(detail, buf); - lv_obj_set_style_text_color(detail, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(detail, current_theme.text_secondary, 0); lv_obj_set_style_text_font(detail, &lv_font_montserrat_12, 0); lv_obj_align(detail, LV_ALIGN_TOP_LEFT, 0, DETAIL_Y); } @@ -147,7 +146,7 @@ static void build_scanning_view(void) { lv_obj_t *sub = lv_label_create(s_screen); lv_label_set_text(sub, "Hold still while we listen"); - lv_obj_set_style_text_color(sub, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(sub, current_theme.text_secondary, 0); lv_obj_set_style_text_font(sub, &lv_font_montserrat_12, 0); lv_obj_set_style_text_align(sub, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(sub, LV_ALIGN_CENTER, 0, SUB_Y_OFS); diff --git a/firmware_p4/components/Applications/ui/screens/boot_report/boot_map_ui.c b/firmware_p4/components/Applications/ui/screens/boot_report/boot_map_ui.c index 13200c22c..5277c586d 100644 --- a/firmware_p4/components/Applications/ui/screens/boot_report/boot_map_ui.c +++ b/firmware_p4/components/Applications/ui/screens/boot_report/boot_map_ui.c @@ -19,13 +19,13 @@ #include "boot_report.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #define TITLE "BOOT MAP" #define ICON "/assets/icons/troubleshoot.bin" #define HINT "BACK exit" -#define OK_COLOR 0x00E676 #define FAIL_COLOR 0xFF5252 #define SKIP_COLOR 0x8A8594 @@ -54,7 +54,7 @@ static void add_row(lv_obj_t *list, const boot_stage_t *st) { uint32_t color; if (st->result == ESP_OK) { state = "OK"; - color = OK_COLOR; + color = UI_COL_SUCCESS; } else if (st->result == ESP_ERR_NOT_FOUND) { state = "skip"; color = SKIP_COLOR; diff --git a/firmware_p4/components/Applications/ui/screens/dev/dev_diag_ui.c b/firmware_p4/components/Applications/ui/screens/dev/dev_diag_ui.c index e3ed8949d..d6a68f79c 100644 --- a/firmware_p4/components/Applications/ui/screens/dev/dev_diag_ui.c +++ b/firmware_p4/components/Applications/ui/screens/dev/dev_diag_ui.c @@ -25,6 +25,7 @@ #include "sys_metrics.h" #include "ui_chrome.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #define TICK_MS 260 @@ -33,10 +34,8 @@ #define ICON "/assets/icons/troubleshoot.bin" #define FOOTER_HINT LV_SYMBOL_LEFT " BACK exit" -#define OK_COLOR 0x00E676 #define WARN_COLOR 0xFFC23D #define CYAN_COLOR 0x37E0A8 -#define DIM_COLOR 0x8A8594 #define GRID_COLOR 0x241F31 #define PANEL_PAD 8 @@ -95,7 +94,7 @@ make_value_label(lv_obj_t *panel, const char *title, uint32_t color, const char lv_obj_t *t = lv_label_create(head); lv_label_set_text(t, title); - lv_obj_set_style_text_color(t, lv_color_hex(DIM_COLOR), 0); + lv_obj_set_style_text_color(t, current_theme.text_secondary, 0); lv_obj_set_style_text_font(t, &lv_font_montserrat_12, 0); lv_obj_t *v = lv_label_create(head); @@ -145,7 +144,7 @@ static lv_obj_t *make_stat(lv_obj_t *row, const char *key, const char *val, uint lv_obj_t *k = lv_label_create(c); lv_label_set_text(k, key); - lv_obj_set_style_text_color(k, lv_color_hex(DIM_COLOR), 0); + lv_obj_set_style_text_color(k, current_theme.text_secondary, 0); lv_obj_set_style_text_font(k, &lv_font_montserrat_12, 0); lv_obj_t *v = lv_label_create(c); @@ -193,7 +192,7 @@ static void tick_cb(lv_timer_t *t) { if (battery_service_get(&b) && b.valid) { snprintf(buf, sizeof(buf), "%d%%", b.soc); lv_obj_set_style_text_color( - s_batt_val, lv_color_hex(b.soc <= BATT_LOW_PCT ? WARN_COLOR : OK_COLOR), 0); + s_batt_val, lv_color_hex(b.soc <= BATT_LOW_PCT ? WARN_COLOR : UI_COL_SUCCESS), 0); } else { snprintf(buf, sizeof(buf), "--"); } @@ -217,7 +216,7 @@ static void tick_cb(lv_timer_t *t) { if (s_c5_val != NULL) { bool alive = spi_bridge_is_alive(); lv_label_set_text(s_c5_val, alive ? "OK" : "OFF"); - lv_obj_set_style_text_color(s_c5_val, lv_color_hex(alive ? OK_COLOR : WARN_COLOR), 0); + lv_obj_set_style_text_color(s_c5_val, lv_color_hex(alive ? UI_COL_SUCCESS : WARN_COLOR), 0); } } @@ -289,9 +288,9 @@ static void build_screen(void) { lv_obj_set_flex_flow(stats, LV_FLEX_FLOW_ROW); lv_obj_set_flex_align( stats, LV_FLEX_ALIGN_SPACE_BETWEEN, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); - s_batt_val = make_stat(stats, "Batt", "--", OK_COLOR); + s_batt_val = make_stat(stats, "Batt", "--", UI_COL_SUCCESS); s_temp_val = make_stat(stats, "Temp", "--", CYAN_COLOR); - s_c5_val = make_stat(stats, "C5", "--", DIM_COLOR); + s_c5_val = make_stat(stats, "C5", "--", 0x8A8594); // TODO: not themed (raw hex arg) ui_input_set_screen_handler(dev_diag_input, NULL); diff --git a/firmware_p4/components/Applications/ui/screens/dev/scripts_ui.c b/firmware_p4/components/Applications/ui/screens/dev/scripts_ui.c index fd156812f..905fd62de 100644 --- a/firmware_p4/components/Applications/ui/screens/dev/scripts_ui.c +++ b/firmware_p4/components/Applications/ui/screens/dev/scripts_ui.c @@ -30,6 +30,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" static const char *TAG = "SCRIPTS_UI"; @@ -40,9 +41,7 @@ static const char *TAG = "SCRIPTS_UI"; #define TERM_GREEN 0x00E676 #define TERM_DIM_GREEN 0x1F7A52 #define DARK_PANEL_COLOR 0x05090A -#define DIM_COLOR 0x8A8594 #define DANGER_COLOR 0xFF5252 -#define SUCCESS_COLOR 0x00E676 #define HEADER_TITLE "SCRIPTS" #define HEADER_ICON "/assets/icons/description.bin" @@ -340,7 +339,7 @@ static bool script_needs_permission(const script_t *s) { static void build_badge(lv_obj_t *parent, cap_t c) { bool avail = CAPS[c].available; - lv_color_t color = avail ? current_theme.border_accent : lv_color_hex(DIM_COLOR); + lv_color_t color = avail ? current_theme.border_accent : current_theme.text_secondary; lv_obj_t *badge = lv_obj_create(parent); lv_obj_remove_flag(badge, LV_OBJ_FLAG_SCROLLABLE); @@ -431,7 +430,7 @@ static void build_empty(void) { lv_obj_t *t2 = lv_label_create(card); lv_label_set_text(t2, "Copy .js to /apps/scripts"); lv_obj_set_style_text_font(t2, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(t2, lv_color_hex(DIM_COLOR), 0); + lv_obj_set_style_text_color(t2, current_theme.text_secondary, 0); fade_in(card, FADE_MS); } @@ -490,7 +489,7 @@ static void build_browser(void) { lv_obj_t *chev = lv_label_create(row); lv_label_set_text(chev, CHEVRON_TEXT); - lv_obj_set_style_text_color(chev, lv_color_hex(DIM_COLOR), 0); + lv_obj_set_style_text_color(chev, current_theme.text_secondary, 0); lv_obj_set_style_text_font(chev, &lv_font_montserrat_12, 0); s_rows[i] = row; @@ -610,7 +609,7 @@ static void show_done(void) { char buf[80]; snprintf(buf, sizeof(buf), LV_SYMBOL_OK " %s", s->result); lv_label_set_text(result, buf); - lv_obj_set_style_text_color(result, lv_color_hex(SUCCESS_COLOR), 0); + lv_obj_set_style_text_color(result, lv_color_hex(UI_COL_SUCCESS), 0); ui_feedback(UI_FB_WRITE); ESP_LOGI(TAG, "mock script done: %s", s->name); } diff --git a/firmware_p4/components/Applications/ui/screens/games/imu_monitor_ui.c b/firmware_p4/components/Applications/ui/screens/games/imu_monitor_ui.c index ecc20a9b9..9c377cd95 100644 --- a/firmware_p4/components/Applications/ui/screens/games/imu_monitor_ui.c +++ b/firmware_p4/components/Applications/ui/screens/games/imu_monitor_ui.c @@ -32,7 +32,6 @@ #define MX 8 #define CONTENT_W (240 - 2 * MX) -#define COL_DIM 0x8A8594 #define COL_CYAN 0x37E0A8 #define COL_WARN 0xFFC23D #define COL_ACC2 0xB89AFF @@ -217,7 +216,7 @@ static void build_scope_card(void) { fill_traces(); - lv_obj_t *xval = make_mono_label(card, "X -0.01", COL_DIM, 0, VAL_ROW_Y); + lv_obj_t *xval = make_mono_label(card, "X -0.01", 0x8A8594, 0, VAL_ROW_Y); // TODO: not themed (raw hex arg) lv_obj_set_style_text_color(xval, current_theme.border_accent, 0); make_mono_label(card, "Y +0.05", COL_CYAN, 80, VAL_ROW_Y); make_mono_label(card, "Z +1.00", COL_WARN, 158, VAL_ROW_Y); @@ -233,7 +232,7 @@ static void build_gyro_card(void) { lv_obj_t *lbl = lv_label_create(card); lv_label_set_text(lbl, GYRO_ROWS[i].label); lv_obj_set_style_text_font(lbl, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(lbl, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(lbl, current_theme.text_secondary, 0); lv_obj_align(lbl, LV_ALIGN_TOP_LEFT, 0, row_y); lv_obj_t *track = lv_obj_create(card); @@ -244,7 +243,7 @@ static void build_gyro_card(void) { lv_obj_set_style_pad_all(track, 0, 0); lv_obj_set_style_bg_color(track, current_theme.bg_primary, 0); lv_obj_set_style_bg_opa(track, LV_OPA_COVER, 0); - lv_obj_set_style_border_color(track, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_border_color(track, current_theme.text_secondary, 0); lv_obj_set_style_border_opa(track, LV_OPA_40, 0); lv_obj_set_style_border_width(track, 1, 0); lv_obj_set_style_clip_corner(track, true, 0); diff --git a/firmware_p4/components/Applications/ui/screens/games/motion_ui.c b/firmware_p4/components/Applications/ui/screens/games/motion_ui.c index f642ab5bb..da1b309b9 100644 --- a/firmware_p4/components/Applications/ui/screens/games/motion_ui.c +++ b/firmware_p4/components/Applications/ui/screens/games/motion_ui.c @@ -37,7 +37,6 @@ #define DECAY 0.94f #define COL_LEVEL 0x00E676 -#define COL_DIM 0x8A8594 #define HDR_ICON "/assets/icons/sensors.bin" #define HDR_TITLE "BUBBLE LEVEL" @@ -89,7 +88,7 @@ static void build_level(void) { lv_obj_center(ring); lv_obj_set_style_radius(ring, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_bg_opa(ring, LV_OPA_TRANSP, 0); - lv_obj_set_style_border_color(ring, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_border_color(ring, current_theme.text_secondary, 0); lv_obj_set_style_border_width(ring, 2, 0); lv_obj_set_style_pad_all(ring, 0, 0); @@ -109,7 +108,7 @@ static void build_level(void) { s_status = lv_label_create(s_screen); lv_label_set_text(s_status, "TILTED"); lv_obj_set_style_text_font(s_status, &lv_font_montserrat_14, 0); - lv_obj_set_style_text_color(s_status, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_status, current_theme.text_secondary, 0); lv_obj_align(s_status, LV_ALIGN_BOTTOM_MID, 0, -52); s_read = lv_label_create(s_screen); @@ -144,7 +143,7 @@ static void update_physics(void) { if (s_status) { lv_label_set_text(s_status, level ? "LEVEL" : "TILTED"); lv_obj_set_style_text_color( - s_status, level ? lv_color_hex(COL_LEVEL) : lv_color_hex(COL_DIM), 0); + s_status, level ? lv_color_hex(COL_LEVEL) : current_theme.text_secondary, 0); } if (s_read) lv_label_set_text_fmt(s_read, "Pitch %d deg Roll %d deg", (int)s_pitch, (int)s_roll); diff --git a/firmware_p4/components/Applications/ui/screens/infrared/ir_controller_ui.c b/firmware_p4/components/Applications/ui/screens/infrared/ir_controller_ui.c index f3c18bb98..dcb8315a4 100644 --- a/firmware_p4/components/Applications/ui/screens/infrared/ir_controller_ui.c +++ b/firmware_p4/components/Applications/ui/screens/infrared/ir_controller_ui.c @@ -29,8 +29,6 @@ static const char *TAG = "IR_CTRL_UI"; -#define COL_DIM 0x8A8594 - #define MAX_BTNS 16 #define KEYPAD_W 232 @@ -267,7 +265,7 @@ static void apply_focus_style(lv_obj_t *btn, bool focused) { lv_obj_set_style_shadow_width(btn, 0, 0); lv_obj_set_style_shadow_opa(btn, LV_OPA_TRANSP, 0); if (lbl) - lv_obj_set_style_text_color(lbl, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(lbl, current_theme.text_secondary, 0); } } @@ -300,7 +298,7 @@ static void ac_apply_row_style(lv_obj_t *row, bool focused) { lv_obj_set_style_shadow_width(row, 0, 0); lv_obj_set_style_shadow_opa(row, LV_OPA_TRANSP, 0); if (name) - lv_obj_set_style_text_color(name, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(name, current_theme.text_secondary, 0); } } @@ -313,7 +311,7 @@ static void ac_update_values(void) { lv_label_set_text(s_ac_vals[AC_F_FAN], AC_FANS[s_ac_fan]); lv_color_t active = current_theme.border_accent; - lv_color_t idle = lv_color_hex(COL_DIM); + lv_color_t idle = current_theme.text_secondary; lv_color_t body = s_ac_power ? active : idle; lv_obj_set_style_text_color( s_ac_vals[AC_F_POWER], s_ac_power ? lv_color_hex(AC_ON_COLOR) : idle, 0); diff --git a/firmware_p4/components/Applications/ui/screens/infrared/ir_raw_ui.c b/firmware_p4/components/Applications/ui/screens/infrared/ir_raw_ui.c index 7823fcc0c..5b8728caa 100644 --- a/firmware_p4/components/Applications/ui/screens/infrared/ir_raw_ui.c +++ b/firmware_p4/components/Applications/ui/screens/infrared/ir_raw_ui.c @@ -26,6 +26,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #define HDR_TITLE "RAW SIGNAL" @@ -61,9 +62,6 @@ #define CHIP_RAD 8 #define KV_Y (CHIP_Y + CHIP_H + 8) -#define COL_DIM 0x8A8594 -#define COL_OK 0x00E676 - #define CARRIER_COUNT 4 #define CHIP_TXT_LEN 10 @@ -143,7 +141,7 @@ static void build_scope_card(void) { lv_obj_t *hdr = lv_label_create(card); lv_label_set_text(hdr, "PULSE TRAIN"); lv_obj_set_style_text_font(hdr, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(hdr, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(hdr, current_theme.text_secondary, 0); lv_obj_align(hdr, LV_ALIGN_TOP_LEFT, CARD_PAD_X, CARD_HDR_Y); lv_obj_t *cap_grp = lv_obj_create(card); @@ -163,13 +161,13 @@ static void build_scope_card(void) { lv_obj_set_style_radius(dot, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_border_width(dot, 0, 0); lv_obj_set_style_pad_all(dot, 0, 0); - lv_obj_set_style_bg_color(dot, lv_color_hex(has ? COL_OK : COL_DIM), 0); + lv_obj_set_style_bg_color(dot, (has ? lv_color_hex(UI_COL_SUCCESS) : current_theme.text_secondary), 0); lv_obj_set_style_bg_opa(dot, LV_OPA_COVER, 0); lv_obj_t *cap_lbl = lv_label_create(cap_grp); lv_label_set_text(cap_lbl, has ? "CAPTURED" : "EMPTY"); lv_obj_set_style_text_font(cap_lbl, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(cap_lbl, lv_color_hex(has ? COL_OK : COL_DIM), 0); + lv_obj_set_style_text_color(cap_lbl, (has ? lv_color_hex(UI_COL_SUCCESS) : current_theme.text_secondary), 0); lv_obj_t *scope = lv_line_create(card); lv_line_set_points(scope, PULSE_PTS, PULSE_PT_COUNT); @@ -196,7 +194,7 @@ static void build_stat_tile(int i) { lv_obj_t *cap = lv_label_create(tile); lv_label_set_text(cap, STATS[i].cap); lv_obj_set_style_text_font(cap, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(cap, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(cap, current_theme.text_secondary, 0); lv_obj_align(cap, LV_ALIGN_TOP_LEFT, G_TILE_PAD, G_CAP_Y); lv_obj_t *grp = lv_obj_create(tile); @@ -219,7 +217,7 @@ static void build_stat_tile(int i) { lv_obj_t *unit = lv_label_create(grp); lv_label_set_text(unit, STATS[i].unit); lv_obj_set_style_text_font(unit, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(unit, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(unit, current_theme.text_secondary, 0); } } @@ -237,7 +235,7 @@ static void style_chip(int i, bool sel) { lv_obj_set_style_bg_color(s_chip[i], current_theme.bg_primary, 0); lv_obj_set_style_bg_opa(s_chip[i], LV_OPA_COVER, 0); lv_obj_set_style_border_color(s_chip[i], current_theme.border_inactive, 0); - lv_obj_set_style_text_color(s_chip_lbl[i], lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_chip_lbl[i], current_theme.text_secondary, 0); } } @@ -245,7 +243,7 @@ static void build_carrier(void) { lv_obj_t *lbl = lv_label_create(s_screen); lv_label_set_text(lbl, "CARRIER FREQUENCY"); lv_obj_set_style_text_font(lbl, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(lbl, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(lbl, current_theme.text_secondary, 0); lv_obj_align(lbl, LV_ALIGN_TOP_LEFT, MX, CAR_LBL_Y); lv_obj_t *row = lv_obj_create(s_screen); @@ -283,7 +281,7 @@ static void build_saved_row(void) { lv_obj_t *tag = lv_label_create(s_screen); lv_label_set_text(tag, "Last capture"); lv_obj_set_style_text_font(tag, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(tag, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(tag, current_theme.text_secondary, 0); lv_obj_align(tag, LV_ALIGN_TOP_LEFT, MX, KV_Y); lv_obj_t *name = lv_label_create(s_screen); diff --git a/firmware_p4/components/Applications/ui/screens/infrared/ir_receive_ui.c b/firmware_p4/components/Applications/ui/screens/infrared/ir_receive_ui.c index 4eaa9e5b3..7ee04ef1c 100644 --- a/firmware_p4/components/Applications/ui/screens/infrared/ir_receive_ui.c +++ b/firmware_p4/components/Applications/ui/screens/infrared/ir_receive_ui.c @@ -27,13 +27,12 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #include "waves_ui.h" static const char *TAG = "IR_RX_UI"; -#define SIG_GREEN 0x00E676 - #define HEADER_TITLE_Y 10 #define HEADER_RULE_Y 32 #define HEADER_RULE_W 70 @@ -119,7 +118,7 @@ static void set_status(const char *text, bool success) { return; lv_label_set_text(s_status_label, text); lv_obj_set_style_text_color( - s_status_label, success ? lv_color_hex(SIG_GREEN) : current_theme.text_main, 0); + s_status_label, success ? lv_color_hex(UI_COL_SUCCESS) : current_theme.text_main, 0); } static void set_hint(const char *text) { diff --git a/firmware_p4/components/Applications/ui/screens/lora/lora_channels_ui.c b/firmware_p4/components/Applications/ui/screens/lora/lora_channels_ui.c index ac530b28a..0ed65ba58 100644 --- a/firmware_p4/components/Applications/ui/screens/lora/lora_channels_ui.c +++ b/firmware_p4/components/Applications/ui/screens/lora/lora_channels_ui.c @@ -70,7 +70,6 @@ #define COL_ACC2 0xB89AFF #define COL_CYAN 0x37E0A8 -#define COL_DIM 0x8A8594 #define COL_SLOT 0x4A4556 typedef struct { @@ -170,7 +169,7 @@ static void build_filled_tile(lv_obj_t *tile, int i) { lv_label_set_text_fmt(idx, "%d", i); lv_obj_set_style_text_font(idx, &lv_font_montserrat_12, 0); lv_obj_set_style_text_color( - idx, primary ? current_theme.border_accent : lv_color_hex(COL_DIM), 0); + idx, primary ? current_theme.border_accent : current_theme.text_secondary, 0); lv_obj_t *d = lv_obj_create(head); lv_obj_remove_flag(d, LV_OBJ_FLAG_SCROLLABLE); @@ -206,7 +205,7 @@ static void build_filled_tile(lv_obj_t *tile, int i) { lv_obj_t *stub = lv_label_create(tile); lv_label_set_text(stub, s_slot[i].role); lv_obj_set_style_text_font(stub, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(stub, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(stub, current_theme.text_secondary, 0); lv_obj_t *bars = bare_box(tile, lv_pct(100), BAR_MAX_H); lv_obj_set_flex_flow(bars, LV_FLEX_FLOW_ROW); @@ -299,7 +298,7 @@ static void build_grid_content(void) { lv_obj_add_flag(s_empty_msg, LV_OBJ_FLAG_FLOATING); lv_label_set_text(s_empty_msg, "Start a protocol first"); lv_obj_set_style_text_font(s_empty_msg, &lv_font_montserrat_14, 0); - lv_obj_set_style_text_color(s_empty_msg, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_empty_msg, current_theme.text_secondary, 0); lv_obj_center(s_empty_msg); return; } diff --git a/firmware_p4/components/Applications/ui/screens/lora/lora_chat_ui.c b/firmware_p4/components/Applications/ui/screens/lora/lora_chat_ui.c index d4a65826d..e3b63fb32 100644 --- a/firmware_p4/components/Applications/ui/screens/lora/lora_chat_ui.c +++ b/firmware_p4/components/Applications/ui/screens/lora/lora_chat_ui.c @@ -36,6 +36,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #include "waves_ui.h" @@ -45,8 +46,6 @@ static const char *TAG = "LORA_MESH"; #define CHAT_POLL_MS 500 #define CHAT_BATCH 8 #define LORA_START_TASK_STACK 12288 -#define SIG_GREEN 0x00E676 -#define COL_DIM 0x8A8594 #define ENTRY_MS 220 #define BADGE_SIZE 28 @@ -319,7 +318,7 @@ static void build_home_view(void) { menu_component_add_item(&s_menu, "/assets/icons/lan.bin", "Traceroute"); if (s_linked) - menu_component_set_item_label_color(&s_menu, 0, lv_color_hex(SIG_GREEN)); + menu_component_set_item_label_color(&s_menu, 0, lv_color_hex(UI_COL_SUCCESS)); menu_component_select(&s_menu, s_home_sel); menu_component_set_hint(&s_menu, @@ -328,15 +327,15 @@ static void build_home_view(void) { static void link_style(int i, lv_color_t *col, int *w, bool *dashed) { if (!s_nodes[i].strong) { - *col = lv_color_hex(COL_DIM); + *col = current_theme.text_secondary; *w = 1; *dashed = true; } else if (s_nodes[i].rssi >= RSSI_STRONG) { - *col = lv_color_hex(SIG_GREEN); + *col = lv_color_hex(UI_COL_SUCCESS); *w = 3; *dashed = false; } else if (s_nodes[i].rssi >= RSSI_GOOD) { - *col = lv_color_hex(SIG_GREEN); + *col = lv_color_hex(UI_COL_SUCCESS); *w = 2; *dashed = false; } else { @@ -352,7 +351,7 @@ static void node_style_pin(int i, bool selected) { return; bool online = s_nodes[i].strong; lv_color_t edge = selected ? current_theme.border_accent - : (online ? lv_color_hex(SIG_GREEN) : lv_color_hex(COL_DIM)); + : (online ? lv_color_hex(UI_COL_SUCCESS) : current_theme.text_secondary); lv_obj_set_style_border_color(pin, edge, 0); lv_obj_set_style_border_width(pin, selected ? 2 : 1, 0); lv_obj_set_style_opa(pin, (online || selected) ? LV_OPA_COVER : LV_OPA_50, 0); @@ -369,7 +368,7 @@ static void node_style_pin(int i, bool selected) { lv_obj_set_style_text_color(s_node_names[i], selected ? current_theme.border_accent - : (online ? current_theme.text_main : lv_color_hex(COL_DIM)), + : (online ? current_theme.text_main : current_theme.text_secondary), 0); } @@ -380,7 +379,7 @@ static void node_update_info(int i) { if (s_info_name != NULL) { lv_label_set_text(s_info_name, s_nodes[i].name); lv_obj_set_style_text_color( - s_info_name, online ? current_theme.text_main : lv_color_hex(COL_DIM), 0); + s_info_name, online ? current_theme.text_main : current_theme.text_secondary, 0); } if (s_info_meta != NULL) { char meta[40]; @@ -389,7 +388,7 @@ static void node_update_info(int i) { snprintf(meta, sizeof(meta), "%s \xC2\xB7 %s", rssi_s, online ? "ONLINE" : "OFFLINE"); lv_label_set_text(s_info_meta, meta); lv_obj_set_style_text_color( - s_info_meta, online ? lv_color_hex(SIG_GREEN) : lv_color_hex(COL_DIM), 0); + s_info_meta, online ? lv_color_hex(UI_COL_SUCCESS) : current_theme.text_secondary, 0); } if (s_info_bar != NULL) { int pct = (s_nodes[i].rssi - SNR_RSSI_FLOOR) * 100 / SNR_RSSI_SPAN; @@ -429,10 +428,10 @@ static void node_style_row(int i, bool selected) { } if (s_list_name[i] != NULL) lv_obj_set_style_text_color( - s_list_name[i], selected ? current_theme.text_main : lv_color_hex(COL_DIM), 0); + s_list_name[i], selected ? current_theme.text_main : current_theme.text_secondary, 0); if (s_list_val[i] != NULL) lv_obj_set_style_text_color( - s_list_val[i], selected ? current_theme.border_accent : lv_color_hex(COL_DIM), 0); + s_list_val[i], selected ? current_theme.border_accent : current_theme.text_secondary, 0); } static void node_select(int sel) { @@ -477,13 +476,13 @@ static void build_nodes_list(void) { lv_obj_t *cap = lv_label_create(s_node_list); lv_label_set_text_fmt(cap, "%d / %d s_nodes ONLINE", online, s_rnode_count); - lv_obj_set_style_text_color(cap, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(cap, current_theme.text_secondary, 0); lv_obj_set_style_text_font(cap, &lv_font_montserrat_12, 0); if (s_rnode_count == 0) { lv_obj_t *empty = lv_label_create(s_node_list); lv_label_set_text(empty, "Listening for nodes..."); - lv_obj_set_style_text_color(empty, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(empty, current_theme.text_secondary, 0); lv_obj_set_style_text_font(empty, &lv_font_montserrat_14, 0); } @@ -517,10 +516,10 @@ static void build_nodes_list(void) { lv_obj_set_style_radius(dot, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_border_width(dot, 0, 0); lv_obj_set_style_bg_color( - dot, node_online ? lv_color_hex(SIG_GREEN) : lv_color_hex(COL_DIM), 0); + dot, node_online ? lv_color_hex(UI_COL_SUCCESS) : current_theme.text_secondary, 0); lv_obj_set_style_bg_opa(dot, LV_OPA_COVER, 0); if (node_online) { - lv_obj_set_style_shadow_color(dot, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_shadow_color(dot, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_set_style_shadow_width(dot, LIST_DOT_GLOW_W, 0); lv_obj_set_style_shadow_opa(dot, LV_OPA_50, 0); } @@ -569,7 +568,7 @@ static void build_nodes_view(void) { online++; lv_obj_t *cap = lv_label_create(s_screen); lv_label_set_text_fmt(cap, "%d / %d s_nodes ONLINE", online, s_rnode_count); - lv_obj_set_style_text_color(cap, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(cap, current_theme.text_secondary, 0); lv_obj_set_style_text_font(cap, &lv_font_montserrat_12, 0); lv_obj_align(cap, LV_ALIGN_TOP_MID, 0, MESH_CAP_Y); @@ -697,7 +696,7 @@ static void build_configs_view(void) { } static lv_obj_t *make_companion_card(lv_obj_t *parent, bool linked, lv_color_t accent) { - lv_color_t edge = linked ? lv_color_hex(SIG_GREEN) : accent; + lv_color_t edge = linked ? lv_color_hex(UI_COL_SUCCESS) : accent; lv_obj_t *card = lit_panel(parent, 200, 60, edge); lv_obj_set_style_pad_all(card, 8, 0); lv_obj_set_flex_flow(card, LV_FLEX_FLOW_ROW); @@ -722,13 +721,13 @@ static lv_obj_t *make_companion_card(lv_obj_t *parent, bool linked, lv_color_t a lv_obj_t *sub = lv_label_create(txt); lv_label_set_text(sub, linked ? "Linked \xC2\xB7 BLE" : "v1.2 \xC2\xB7 BLE"); - lv_obj_set_style_text_color(sub, linked ? lv_color_hex(SIG_GREEN) : lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(sub, linked ? lv_color_hex(UI_COL_SUCCESS) : current_theme.text_secondary, 0); lv_obj_set_style_text_font(sub, &lv_font_montserrat_12, 0); if (linked) { lv_obj_t *chk = lv_label_create(card); lv_label_set_text(chk, LV_SYMBOL_OK); - lv_obj_set_style_text_color(chk, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_text_color(chk, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_set_style_text_font(chk, &lv_font_montserrat_14, 0); } return card; @@ -800,7 +799,7 @@ static void build_connect(void) { } else { lv_obj_t *st = lv_label_create(s_screen); lv_label_set_text(st, "Companion linked!"); - lv_obj_set_style_text_color(st, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_text_color(st, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_set_style_text_font(st, &lv_font_montserrat_14, 0); lv_obj_align(st, LV_ALIGN_TOP_MID, 0, 52); lv_obj_fade_in(st, ENTRY_MS, 0); diff --git a/firmware_p4/components/Applications/ui/screens/lora/lora_mqtt_ui.c b/firmware_p4/components/Applications/ui/screens/lora/lora_mqtt_ui.c index d765b98e9..0d7187dc3 100644 --- a/firmware_p4/components/Applications/ui/screens/lora/lora_mqtt_ui.c +++ b/firmware_p4/components/Applications/ui/screens/lora/lora_mqtt_ui.c @@ -24,13 +24,11 @@ #include "notify_ui.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" static const char *TAG = "LORA_MQTT"; -#define SIG_GREEN 0x00E676 -#define COL_DIM 0x8A8594 - #define FIELD_MAX 40 #define PASS_MASK "******" #define PASS_UNSET "(unset)" @@ -89,9 +87,9 @@ static void apply_status(void) { &s_menu, ROW_STATUS, s_connected ? "Connected" : "Disconnected"); menu_component_set_selector_value(&s_menu, ROW_ACTION, s_connected ? "Disconnect" : "Connect"); menu_component_set_item_label_color( - &s_menu, ROW_STATUS, s_connected ? lv_color_hex(SIG_GREEN) : lv_color_hex(COL_DIM)); + &s_menu, ROW_STATUS, s_connected ? lv_color_hex(UI_COL_SUCCESS) : current_theme.text_secondary); menu_component_set_item_label_color( - &s_menu, ROW_ACTION, s_connected ? lv_color_hex(SIG_GREEN) : current_theme.text_main); + &s_menu, ROW_ACTION, s_connected ? lv_color_hex(UI_COL_SUCCESS) : current_theme.text_main); } static void toggle_connect(void) { diff --git a/firmware_p4/components/Applications/ui/screens/lora/lora_position_ui.c b/firmware_p4/components/Applications/ui/screens/lora/lora_position_ui.c index 93a40805c..0b7581757 100644 --- a/firmware_p4/components/Applications/ui/screens/lora/lora_position_ui.c +++ b/firmware_p4/components/Applications/ui/screens/lora/lora_position_ui.c @@ -31,6 +31,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #define HDR_TITLE "POSITION" @@ -60,8 +61,6 @@ #define BC_RAD 8 #define BC_PAD_H 9 -#define COL_DIM 0x8A8594 -#define COL_OK 0x00E676 #define COL_BC_BORDER 0x234A3E #define LAT_E7_LIMIT 900000000 @@ -226,7 +225,7 @@ static void refresh_fields(void) { lv_obj_set_style_shadow_width(s_row[i], act ? GLOW_W : 0, 0); lv_obj_set_style_shadow_opa(s_row[i], act ? LV_OPA_30 : LV_OPA_TRANSP, 0); lv_obj_set_style_text_color( - s_tag[i], act ? current_theme.border_accent : lv_color_hex(COL_DIM), 0); + s_tag[i], act ? current_theme.border_accent : current_theme.text_secondary, 0); if (act) lv_obj_remove_flag(s_caret[i], LV_OBJ_FLAG_HIDDEN); else @@ -255,11 +254,11 @@ static void refresh_broadcast(void) { return; if (s_bcast) { lv_label_set_text(s_bc_val, "ON"); - lv_obj_set_style_text_color(s_bc_val, lv_color_hex(COL_OK), 0); + lv_obj_set_style_text_color(s_bc_val, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_set_style_border_color(s_bc_row, lv_color_hex(COL_BC_BORDER), 0); } else { lv_label_set_text(s_bc_val, "OFF"); - lv_obj_set_style_text_color(s_bc_val, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_bc_val, current_theme.text_secondary, 0); lv_obj_set_style_border_color(s_bc_row, current_theme.border_inactive, 0); } } @@ -365,7 +364,7 @@ static void build_placeholder(void) { lv_obj_set_width(msg, LCD_H_RES - 2 * ROOT_PAD); lv_label_set_text(msg, "Start a protocol first"); lv_obj_set_style_text_font(msg, &lv_font_montserrat_14, 0); - lv_obj_set_style_text_color(msg, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(msg, current_theme.text_secondary, 0); lv_obj_set_style_text_align(msg, LV_TEXT_ALIGN_CENTER, 0); lv_obj_center(msg); @@ -443,7 +442,7 @@ void ui_lora_position_open(void) { lv_obj_t *cap = lv_label_create(card); lv_label_set_text(cap, "FIXED POSITION"); lv_obj_set_style_text_font(cap, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(cap, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(cap, current_theme.text_secondary, 0); for (int i = 0; i < FIELD_CNT; i++) make_field(card, i); @@ -483,7 +482,7 @@ void ui_lora_position_open(void) { ? "manual fix (no GPS) \xE2\x80\xA2 rebroadcast every 15 min" : "manual fix (no GPS) \xE2\x80\xA2 sent in each advert"); lv_obj_set_style_text_font(cap2, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(cap2, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(cap2, current_theme.text_secondary, 0); lv_obj_set_style_text_align(cap2, LV_TEXT_ALIGN_CENTER, 0); refresh_fields(); diff --git a/firmware_p4/components/Applications/ui/screens/lora/lora_rnode_ui.c b/firmware_p4/components/Applications/ui/screens/lora/lora_rnode_ui.c index 8b1709923..44a790e4c 100644 --- a/firmware_p4/components/Applications/ui/screens/lora/lora_rnode_ui.c +++ b/firmware_p4/components/Applications/ui/screens/lora/lora_rnode_ui.c @@ -22,6 +22,7 @@ #include "ui_chrome.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" static const char *TAG = "LORA_RNODE"; @@ -29,9 +30,6 @@ static const char *TAG = "LORA_RNODE"; #define DATA_TICK_MS 700 #define ENTRY_MS 220 -#define SIG_GREEN 0x00E676 -#define COL_DIM 0x8A8594 - #define CARD_W 216 #define CFG_CARD_H 110 #define CNT_CARD_H 82 @@ -122,7 +120,7 @@ static void build_config_card(lv_obj_t *parent, lv_color_t accent) { lv_obj_set_size(dot, DOT_SIZE, DOT_SIZE); lv_obj_set_style_radius(dot, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_border_width(dot, 0, 0); - lv_obj_set_style_bg_color(dot, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_bg_color(dot, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_set_style_bg_opa(dot, LV_OPA_COVER, 0); lv_anim_t a; @@ -152,13 +150,13 @@ static void build_counter_card(lv_obj_t *parent, lv_color_t accent) { s_counter_lbl = lv_label_create(card); lv_label_set_text_fmt(s_counter_lbl, "RX %lu TX %lu", s_rx, s_tx); - lv_obj_set_style_text_color(s_counter_lbl, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_text_color(s_counter_lbl, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_set_style_text_font(s_counter_lbl, &lv_font_montserrat_14, 0); s_last_lbl = lv_label_create(card); lv_label_set_text_fmt( s_last_lbl, "Last: RSSI %d SNR %d.%d", s_last_rssi, s_last_snr / 10, s_last_snr % 10); - lv_obj_set_style_text_color(s_last_lbl, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_last_lbl, current_theme.text_secondary, 0); lv_obj_set_style_text_font(s_last_lbl, &lv_font_montserrat_12, 0); } diff --git a/firmware_p4/components/Applications/ui/screens/lora/lora_securedm_ui.c b/firmware_p4/components/Applications/ui/screens/lora/lora_securedm_ui.c index 59a63eee0..b2275999e 100644 --- a/firmware_p4/components/Applications/ui/screens/lora/lora_securedm_ui.c +++ b/firmware_p4/components/Applications/ui/screens/lora/lora_securedm_ui.c @@ -32,6 +32,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #define HDR_TITLE "SECURE DM" @@ -78,8 +79,6 @@ #define DM_MAX_CONTACTS 32 -#define COL_DIM 0x8A8594 -#define COL_OK 0x00E676 #define COL_OUTTX 0xF2EEFF #define COL_OUTGR 0x2A1F52 @@ -238,7 +237,7 @@ static lv_obj_t *make_seal(lv_obj_t *parent, lv_color_t col) { } static void build_banner(lv_obj_t *parent, const char *name, const char *sub, bool secure) { - lv_color_t acc = secure ? lv_color_hex(COL_OK) : lv_color_hex(COL_DIM); + lv_color_t acc = secure ? lv_color_hex(UI_COL_SUCCESS) : current_theme.text_secondary; lv_obj_t *banner = lv_obj_create(parent); lv_obj_remove_flag(banner, LV_OBJ_FLAG_SCROLLABLE); @@ -335,7 +334,7 @@ static void add_bubble(lv_obj_t *list, bool outgoing, const char *text, const ch if (outgoing) { lv_obj_set_flex_align(meta, LV_FLEX_ALIGN_END, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); } else { - make_seal(meta, lv_color_hex(COL_OK)); + make_seal(meta, lv_color_hex(UI_COL_SUCCESS)); } lv_obj_t *tlbl = lv_label_create(meta); @@ -347,7 +346,7 @@ static void add_bubble(lv_obj_t *list, bool outgoing, const char *text, const ch lv_obj_set_style_text_opa(tlbl, LV_OPA_70, 0); } else { lv_label_set_text(tlbl, ts); - lv_obj_set_style_text_color(tlbl, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(tlbl, current_theme.text_secondary, 0); } lv_obj_set_style_text_font(tlbl, &lv_font_montserrat_12, 0); @@ -379,7 +378,7 @@ static void add_placeholder(lv_obj_t *list, const char *txt) { lv_label_set_long_mode(l, LV_LABEL_LONG_WRAP); lv_label_set_text(l, txt); lv_obj_set_style_text_align(l, LV_TEXT_ALIGN_CENTER, 0); - lv_obj_set_style_text_color(l, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(l, current_theme.text_secondary, 0); lv_obj_set_style_text_font(l, &lv_font_montserrat_14, 0); } @@ -400,7 +399,7 @@ static void make_contact_row(lv_obj_t *list, int i, const dm_contact_t *c) { lv_obj_set_flex_flow(row, LV_FLEX_FLOW_ROW); lv_obj_set_flex_align(row, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); - make_lock(row, lv_color_hex(COL_OK)); + make_lock(row, lv_color_hex(UI_COL_SUCCESS)); lv_obj_t *col = bare_box(row, LV_SIZE_CONTENT, LV_SIZE_CONTENT); lv_obj_set_flex_flow(col, LV_FLEX_FLOW_COLUMN); @@ -413,14 +412,14 @@ static void make_contact_row(lv_obj_t *list, int i, const dm_contact_t *c) { lv_obj_set_width(nm, lv_pct(100)); lv_label_set_text(nm, c->name); lv_obj_set_style_text_font(nm, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(nm, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(nm, current_theme.text_secondary, 0); lv_obj_t *fp = lv_label_create(col); char sub[24]; lv_snprintf(sub, sizeof(sub), "key %s", c->fp); lv_label_set_text(fp, sub); lv_obj_set_style_text_font(fp, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(fp, lv_color_hex(COL_OK), 0); + lv_obj_set_style_text_color(fp, lv_color_hex(UI_COL_SUCCESS), 0); s_rows[i] = row; s_row_name[i] = nm; @@ -446,7 +445,7 @@ static void row_style(int i, bool selected) { } if (s_row_name[i] != NULL) lv_obj_set_style_text_color( - s_row_name[i], selected ? current_theme.text_main : lv_color_hex(COL_DIM), 0); + s_row_name[i], selected ? current_theme.text_main : current_theme.text_secondary, 0); } static void select_contact(int sel) { @@ -501,7 +500,7 @@ static void build_input(lv_obj_t *parent, const char *placeholder) { lv_obj_set_flex_flow(strip, LV_FLEX_FLOW_ROW); lv_obj_set_flex_align(strip, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); - make_lock(strip, lv_color_hex(COL_OK)); + make_lock(strip, lv_color_hex(UI_COL_SUCCESS)); lv_obj_t *pill = lv_obj_create(strip); lv_obj_remove_flag(pill, LV_OBJ_FLAG_SCROLLABLE); @@ -520,7 +519,7 @@ static void build_input(lv_obj_t *parent, const char *placeholder) { lv_obj_t *ph = lv_label_create(pill); lv_label_set_text(ph, placeholder); lv_obj_set_style_text_font(ph, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(ph, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(ph, current_theme.text_secondary, 0); } static void on_kb_submit(const char *text, void *user_data) { diff --git a/firmware_p4/components/Applications/ui/screens/lora/lora_telemetry_ui.c b/firmware_p4/components/Applications/ui/screens/lora/lora_telemetry_ui.c index 0205b03b7..82f0f0be3 100644 --- a/firmware_p4/components/Applications/ui/screens/lora/lora_telemetry_ui.c +++ b/firmware_p4/components/Applications/ui/screens/lora/lora_telemetry_ui.c @@ -26,6 +26,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #define SPARK_MS 700 @@ -73,8 +74,6 @@ #define COL_ACC2 0xB89AFF #define COL_CYAN 0x37E0A8 -#define COL_DIM 0x8A8594 -#define COL_OK 0x00E676 #define COL_WARN 0xFFC23D #define COL_BAD 0xFF5470 #define COL_TRACK 0x241F31 @@ -210,7 +209,7 @@ static uint32_t nb_fill(const lora_node_t *nd, char *buf, size_t n) { int at = (t < 0) ? -t : t; snprintf(buf, n, "%c%d.%d", sign, at / 10, at % 10); if (nd->snr >= SNR_OK_DB) - return COL_OK; + return UI_COL_SUCCESS; if (nd->snr >= SNR_WARN_DB) return COL_WARN; return COL_BAD; @@ -218,13 +217,13 @@ static uint32_t nb_fill(const lora_node_t *nd, char *buf, size_t n) { if (nd->rssi != 0) { snprintf(buf, n, "%d", nd->rssi); if (nd->rssi >= RSSI_OK_DBM) - return COL_OK; + return UI_COL_SUCCESS; if (nd->rssi >= RSSI_WARN_DBM) return COL_WARN; return COL_BAD; } snprintf(buf, n, "--"); - return COL_DIM; + return 0x8A8594; // TODO: not themed (raw hex arg) } static void refresh_chips(void) { @@ -240,7 +239,7 @@ static void refresh_chips(void) { lv_obj_set_style_shadow_opa(s_chips[i], sel ? LV_OPA_40 : LV_OPA_TRANSP, 0); lv_obj_set_style_shadow_spread(s_chips[i], sel ? -2 : 0, 0); lv_obj_set_style_text_color( - s_chip_name[i], sel ? current_theme.text_main : lv_color_hex(COL_DIM), 0); + s_chip_name[i], sel ? current_theme.text_main : current_theme.text_secondary, 0); } } @@ -344,7 +343,7 @@ static lv_obj_t *make_panel(lv_obj_t *root, lv_obj_t *cap = lv_label_create(head); lv_label_set_text(cap, title); lv_obj_set_style_text_font(cap, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(cap, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(cap, current_theme.text_secondary, 0); lv_obj_t *val = lv_label_create(head); lv_label_set_text(val, "--"); @@ -495,12 +494,12 @@ void ui_lora_telemetry_open(void) { s_link_sub = lv_label_create(batt); lv_label_set_text(s_link_sub, "--"); lv_obj_set_style_text_font(s_link_sub, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(s_link_sub, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_link_sub, current_theme.text_secondary, 0); lv_obj_t *nlbl = lv_label_create(root); lv_label_set_text(nlbl, "NEIGHBORS"); lv_obj_set_style_text_font(nlbl, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(nlbl, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(nlbl, current_theme.text_secondary, 0); lv_obj_t *chips = lv_obj_create(root); lv_obj_remove_flag(chips, LV_OBJ_FLAG_SCROLLABLE); @@ -536,7 +535,7 @@ void ui_lora_telemetry_open(void) { lv_obj_t *sv = lv_label_create(chip); lv_label_set_text(sv, "--"); lv_obj_set_style_text_font(sv, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(sv, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(sv, current_theme.text_secondary, 0); s_chip_val[i] = sv; s_chips[i] = chip; @@ -545,7 +544,7 @@ void ui_lora_telemetry_open(void) { s_nb_empty = lv_label_create(chips); lv_label_set_text(s_nb_empty, "Listening for nodes..."); lv_obj_set_style_text_font(s_nb_empty, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(s_nb_empty, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_nb_empty, current_theme.text_secondary, 0); lv_obj_add_flag(s_nb_empty, LV_OBJ_FLAG_HIDDEN); rebuild_points(); diff --git a/firmware_p4/components/Applications/ui/screens/lora/lora_traceroute_ui.c b/firmware_p4/components/Applications/ui/screens/lora/lora_traceroute_ui.c index def47b2ee..8a0d03b2f 100644 --- a/firmware_p4/components/Applications/ui/screens/lora/lora_traceroute_ui.c +++ b/firmware_p4/components/Applications/ui/screens/lora/lora_traceroute_ui.c @@ -39,8 +39,6 @@ static const char *TAG = "LORA_TRACERT"; #define ENTRY_MS 220 #define ROW_STAGGER_MS 90 -#define COL_DIM 0x8A8594 - #define BODY_TOP_Y 46 #define HOP_LIST_W 228 #define HOP_ROW_W 214 @@ -229,7 +227,7 @@ static void make_hop_row(lv_obj_t *parent, int idx, int count, lv_color_t accent lv_obj_t *sub = lv_label_create(txt); lv_label_set_text(sub, hop_role(idx, count)); - lv_obj_set_style_text_color(sub, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(sub, current_theme.text_secondary, 0); lv_obj_set_style_text_font(sub, &lv_font_montserrat_12, 0); } @@ -277,7 +275,7 @@ static void pick_style_row(int i, bool selected) { } if (s_pick_names[i] != NULL) lv_obj_set_style_text_color( - s_pick_names[i], selected ? current_theme.text_main : lv_color_hex(COL_DIM), 0); + s_pick_names[i], selected ? current_theme.text_main : current_theme.text_secondary, 0); } static void pick_select(int sel) { @@ -292,7 +290,7 @@ static void pick_select(int sel) { static void centered_note(const char *text) { lv_obj_t *msg = lv_label_create(s_screen); lv_label_set_text(msg, text); - lv_obj_set_style_text_color(msg, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(msg, current_theme.text_secondary, 0); lv_obj_set_style_text_font(msg, &lv_font_montserrat_14, 0); lv_obj_center(msg); } diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_bankcard_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_bankcard_ui.c index fb8ad8b1b..825e3dde3 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_bankcard_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_bankcard_ui.c @@ -41,7 +41,6 @@ #define VISA_Y 12 #define EDGE_Y (-12) -#define COL_DIM 0x8A8594 #define COL_WHITE 0xFFFFFF #define COL_GOLD 0xD9A521 #define CARD_TOP 0x3A2F6A @@ -81,7 +80,7 @@ static void make_kv(lv_obj_t *parent, const char *k, const char *v, lv_color_t v lv_obj_t *kl = lv_label_create(row); lv_label_set_text(kl, k); lv_obj_set_style_text_font(kl, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(kl, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(kl, current_theme.text_secondary, 0); lv_obj_t *vl = lv_label_create(row); lv_label_set_text(vl, v); diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_config_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_config_ui.c index bac33f478..8e3bc168a 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_config_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_config_ui.c @@ -75,7 +75,7 @@ static void nfc_config_input(const input_event_t *ev, void *ctx) { } else if (sel == CFG_DIAG) { msgbox_open( LV_SYMBOL_WARNING, - "ST25R3916: no reply\nSPI3 MISO blocked\n(GPIO36 jumper) —\nrunning simulated", + "ST25R3916: no reply\nSPI3 MISO blocked\n(GPIO36 jumper) -\nrunning simulated", NULL, NULL, NULL); diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_desfire_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_desfire_ui.c index 271fa82da..cb05949ed 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_desfire_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_desfire_ui.c @@ -20,6 +20,7 @@ #include "ui_chrome.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #define MX 8 @@ -38,8 +39,6 @@ #define DUMP_RAD 8 #define DUMP_PAD 8 -#define COL_DIM 0x8A8594 -#define COL_OK 0x00E676 #define COL_CYAN 0x37E0A8 #define COL_PANEL2 0x1A1626 #define COL_LINE 0x2A2636 @@ -85,7 +84,7 @@ static void make_kv(lv_obj_t *parent, const char *k, const char *v) { lv_obj_t *kl = lv_label_create(row); lv_label_set_text(kl, k); lv_obj_set_style_text_font(kl, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(kl, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(kl, current_theme.text_secondary, 0); lv_obj_t *vl = lv_label_create(row); lv_label_set_text(vl, v); @@ -121,7 +120,7 @@ static void build_auth_card(lv_obj_t *parent) { lv_obj_t *ok = lv_label_create(top); lv_label_set_text(ok, LV_SYMBOL_OK " " TXT_AUTH); lv_obj_set_style_text_font(ok, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(ok, lv_color_hex(COL_OK), 0); + lv_obj_set_style_text_color(ok, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_t *spacer = lv_obj_create(top); lv_obj_remove_flag(spacer, LV_OBJ_FLAG_SCROLLABLE); @@ -154,7 +153,7 @@ static void build_dump(lv_obj_t *parent) { lv_obj_t *lbl = lv_label_create(parent); lv_label_set_text(lbl, TXT_FILE); lv_obj_set_style_text_font(lbl, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(lbl, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(lbl, current_theme.text_secondary, 0); lv_obj_t *box = lv_obj_create(parent); lv_obj_remove_flag(box, LV_OBJ_FLAG_SCROLLABLE); diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_emulate_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_emulate_ui.c index c1e432b00..4541bef5f 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_emulate_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_emulate_ui.c @@ -28,12 +28,11 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #define TICK_MS 33 #define CARD_ICON "/assets/icons/contactless.bin" -#define COL_DIM 0x8A8594 -#define SIG_GREEN 0x00E676 #define TX_DOTS 3 #define CARD_Y_OFS (-24) #define FIELD_BOX_W 210 @@ -136,7 +135,7 @@ static void build_empty(const char *icon, const char *title, const char *sub) { lv_obj_t *s = lv_label_create(card); lv_label_set_text(s, sub); lv_obj_set_style_text_font(s, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(s, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s, current_theme.text_secondary, 0); } static lv_obj_t * @@ -209,14 +208,14 @@ static void wallet_build(void) { lv_obj_set_size(dot, 8, 8); lv_obj_set_style_radius(dot, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_border_width(dot, 0, 0); - lv_obj_set_style_bg_color(dot, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_bg_color(dot, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_set_style_bg_opa(dot, LV_OPA_COVER, 0); blink_loop(dot, 900, 0); lv_obj_t *txt = lv_label_create(tap); lv_label_set_text(txt, "tap to broadcast"); lv_obj_set_style_text_font(txt, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(txt, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_text_color(txt, lv_color_hex(UI_COL_SUCCESS), 0); s_dots = page_dots_create(s_body, s_count, LV_ALIGN_BOTTOM_MID, 0, -4); page_dots_set(&s_dots, s_sel); diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_felica_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_felica_ui.c index e952cd4eb..3cbbd9f7d 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_felica_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_felica_ui.c @@ -39,7 +39,6 @@ #define DUMP_RAD 8 #define DUMP_PAD 8 -#define COL_DIM 0x8A8594 #define COL_CYAN 0x37E0A8 #define COL_LINE 0x2A2636 #define COL_PANEL2 0x1A1626 @@ -88,7 +87,7 @@ static void make_chip(lv_obj_t *parent, const char *txt, bool sel) { lv_obj_t *l = lv_label_create(chip); lv_label_set_text(l, txt); lv_obj_set_style_text_font(l, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(l, sel ? current_theme.border_accent : lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(l, sel ? current_theme.border_accent : current_theme.text_secondary, 0); lv_obj_center(l); } @@ -118,7 +117,7 @@ static lv_obj_t *make_row(lv_obj_t *parent, int i) { lv_obj_t *desc = lv_label_create(row); lv_label_set_text(desc, SVCS[i].desc); lv_obj_set_style_text_font(desc, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(desc, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(desc, current_theme.text_secondary, 0); s_code[i] = code; return row; diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_iso15693_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_iso15693_ui.c index 6a8125f70..20ea23886 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_iso15693_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_iso15693_ui.c @@ -45,7 +45,6 @@ #define CHIP_RAD 8 #define CHIP_PAD 6 -#define COL_DIM 0x8A8594 #define COL_GOLD 0xD9A521 #define COL_LINE 0x2A2636 #define COL_PANEL2 0x1A1626 @@ -92,7 +91,7 @@ static lv_obj_t *make_chip(lv_obj_t *parent, const char *txt, bool sel) { lv_obj_t *l = lv_label_create(chip); lv_label_set_text(l, txt); lv_obj_set_style_text_font(l, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(l, sel ? current_theme.border_accent : lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(l, sel ? current_theme.border_accent : current_theme.text_secondary, 0); lv_obj_center(l); return chip; } @@ -106,7 +105,7 @@ static void restyle_cells(void) { : lv_color_hex(COL_LINE); lv_color_t txt = sel ? current_theme.text_main : locked ? lv_color_hex(COL_GOLD) - : lv_color_hex(COL_DIM); + : current_theme.text_secondary; lv_obj_set_style_border_color(s_cell[i], border, 0); lv_obj_set_style_bg_color( s_cell[i], sel ? current_theme.bg_primary : lv_color_hex(COL_PANEL2), 0); @@ -190,7 +189,7 @@ static void build_body(lv_obj_t *parent) { kv, LV_FLEX_ALIGN_SPACE_BETWEEN, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); s_block_key = lv_label_create(kv); lv_obj_set_style_text_font(s_block_key, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(s_block_key, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_block_key, current_theme.text_secondary, 0); s_block_val = lv_label_create(kv); lv_obj_set_style_text_font(s_block_val, &lv_font_montserrat_12, 0); lv_obj_set_style_text_color(s_block_val, current_theme.text_main, 0); diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_keydict_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_keydict_ui.c index de8bcfc9a..7493f3e87 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_keydict_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_keydict_ui.c @@ -38,8 +38,6 @@ #define TAG_H 14 #define TAG_PAD 5 -#define COL_DIM 0x8A8594 - #define HDR_TITLE "KEY DICTIONARY" #define HDR_ICON "/assets/icons/nfc.bin" #define FOOTER_HINT "OK load UP/DOWN key +/- edit" @@ -86,7 +84,7 @@ static void make_chip(lv_obj_t *parent, const char *txt, bool sel) { lv_obj_t *l = lv_label_create(chip); lv_label_set_text(l, txt); lv_obj_set_style_text_font(l, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(l, sel ? current_theme.border_accent : lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(l, sel ? current_theme.border_accent : current_theme.text_secondary, 0); lv_obj_center(l); } @@ -133,7 +131,7 @@ static lv_obj_t *make_row(lv_obj_t *parent, int i) { lv_obj_t *tag = lv_label_create(row); lv_label_set_text(tag, KEYS[i].tag); lv_obj_set_style_text_font(tag, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(tag, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(tag, current_theme.text_secondary, 0); } s_hex[i] = hex; diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_ndef_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_ndef_ui.c index e9dd7a4b9..f90600ec3 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_ndef_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_ndef_ui.c @@ -37,8 +37,6 @@ #define CHIP_RAD 8 #define CHIP_PAD 6 -#define COL_DIM 0x8A8594 - #define HDR_TITLE "NDEF" #define HDR_ICON "/assets/icons/nfc.bin" #define FOOTER_HINT "OK edit UP/DOWN record BACK" @@ -82,7 +80,7 @@ static void make_chip(lv_obj_t *parent, const char *txt, bool sel) { lv_obj_t *l = lv_label_create(chip); lv_label_set_text(l, txt); lv_obj_set_style_text_font(l, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(l, sel ? current_theme.border_accent : lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(l, sel ? current_theme.border_accent : current_theme.text_secondary, 0); lv_obj_center(l); } @@ -127,7 +125,7 @@ static lv_obj_t *make_row(lv_obj_t *parent, int i) { lv_obj_t *sub = lv_label_create(col); lv_label_set_text(sub, RECS[i].sub); lv_obj_set_style_text_font(sub, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(sub, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(sub, current_theme.text_secondary, 0); s_icon[i] = ic; s_title[i] = title; @@ -146,9 +144,9 @@ static void refresh_selection(void) { lv_obj_set_style_shadow_color(s_row[i], current_theme.border_accent, 0); lv_obj_set_style_shadow_spread(s_row[i], sel ? -3 : 0, 0); lv_obj_set_style_text_color( - s_icon[i], sel ? current_theme.border_accent : lv_color_hex(COL_DIM), 0); + s_icon[i], sel ? current_theme.border_accent : current_theme.text_secondary, 0); lv_obj_set_style_text_color( - s_title[i], sel ? current_theme.text_main : lv_color_hex(COL_DIM), 0); + s_title[i], sel ? current_theme.text_main : current_theme.text_secondary, 0); } } diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_p2p_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_p2p_ui.c index 059907e3e..147c18931 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_p2p_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_p2p_ui.c @@ -23,6 +23,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #define MX 8 @@ -49,8 +50,6 @@ #define STREAM_STEP 4 #define STREAM_MAX 100 -#define COL_DIM 0x8A8594 -#define COL_OK 0x00E676 #define COL_CYAN 0x37E0A8 #define COL_LINE 0x2A2636 @@ -111,7 +110,7 @@ static lv_obj_t *make_device(lv_obj_t *parent, const char *glyph, const char *na lv_obj_t *nm = lv_label_create(col); lv_label_set_text(nm, name); lv_obj_set_style_text_font(nm, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(nm, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(nm, current_theme.text_secondary, 0); return col; } @@ -205,9 +204,9 @@ static void stream_cb(lv_timer_t *t) { if (s_pct >= STREAM_MAX) { s_pct = STREAM_MAX; lv_label_set_text(s_put_mark, LV_SYMBOL_OK); - lv_obj_set_style_text_color(s_put_mark, lv_color_hex(COL_OK), 0); + lv_obj_set_style_text_color(s_put_mark, lv_color_hex(UI_COL_SUCCESS), 0); lv_label_set_text(s_put_pct, STEP_DONE); - lv_obj_set_style_text_color(s_put_pct, lv_color_hex(COL_OK), 0); + lv_obj_set_style_text_color(s_put_pct, lv_color_hex(UI_COL_SUCCESS), 0); lv_timer_delete(t); s_stream_timer = NULL; return; @@ -243,18 +242,18 @@ static void build_body(lv_obj_t *parent) { make_step(steps, LV_SYMBOL_OK, - lv_color_hex(COL_OK), + lv_color_hex(UI_COL_SUCCESS), STEP1_TXT, STEP1_META, - lv_color_hex(COL_DIM), + current_theme.text_secondary, NULL, NULL); make_step(steps, LV_SYMBOL_OK, - lv_color_hex(COL_OK), + lv_color_hex(UI_COL_SUCCESS), STEP2_TXT, STEP2_META, - lv_color_hex(COL_DIM), + current_theme.text_secondary, NULL, NULL); make_step(steps, diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_read_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_read_ui.c index f196474a1..92f73dce3 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_read_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_read_ui.c @@ -33,7 +33,6 @@ #define REFRESH_MS 33 #define REVEAL_MS 3000 -#define COL_DIM 0x8A8594 #define DUMP_W 214 #define DUMP_Y 102 #define DUMP_ROW_GAP 2 @@ -107,7 +106,7 @@ static void build_dump(void) { for (int i = 0; i < DUMP_LINE_COUNT; i++) { lv_obj_t *ln = lv_label_create(s_dump); lv_label_set_text(ln, DUMP_LINES[i]); - lv_obj_set_style_text_color(ln, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(ln, current_theme.text_secondary, 0); lv_obj_set_style_text_font(ln, &lv_font_montserrat_12, 0); } } diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_scan_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_scan_ui.c index 49c96a18d..1c2fed39c 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_scan_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_scan_ui.c @@ -23,12 +23,11 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #define NFC_ICON "/assets/icons/contactless.bin" -#define SIG_GREEN 0x00E676 -#define COL_DIM 0x8A8594 #define COL_RAISE 0x170A28 #define SCAN_STEP_MS 480 @@ -127,8 +126,8 @@ static void set_row_state(int i, row_state_t state) { if (s_dot[i] == NULL || s_value[i] == NULL || s_row[i] == NULL) return; - lv_color_t dot_color = lv_color_hex(COL_DIM); - lv_color_t txt_color = lv_color_hex(COL_DIM); + lv_color_t dot_color = current_theme.text_secondary; + lv_color_t txt_color = current_theme.text_secondary; const char *txt = VAL_QUEUED; bool raise = false; @@ -140,13 +139,13 @@ static void set_row_state(int i, row_state_t state) { raise = true; break; case ROW_PRESENT: - dot_color = lv_color_hex(SIG_GREEN); - txt_color = lv_color_hex(SIG_GREEN); + dot_color = lv_color_hex(UI_COL_SUCCESS); + txt_color = lv_color_hex(UI_COL_SUCCESS); txt = s_present_value; break; case ROW_ABSENT: - dot_color = lv_color_hex(COL_DIM); - txt_color = lv_color_hex(COL_DIM); + dot_color = current_theme.text_secondary; + txt_color = current_theme.text_secondary; txt = VAL_ABSENT; break; case ROW_PENDING: @@ -217,7 +216,7 @@ static void build_card(void) { lv_obj_set_style_radius(dot, DOT_RADIUS, 0); lv_obj_set_style_border_width(dot, 0, 0); lv_obj_set_style_bg_opa(dot, LV_OPA_COVER, 0); - lv_obj_set_style_bg_color(dot, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_bg_color(dot, current_theme.text_secondary, 0); lv_obj_t *tech = lv_label_create(group); lv_label_set_text(tech, TECHS[i].tech); @@ -229,7 +228,7 @@ static void build_card(void) { lv_label_set_long_mode(value, LV_LABEL_LONG_DOT); lv_obj_set_flex_grow(value, 1); lv_label_set_text(value, VAL_QUEUED); - lv_obj_set_style_text_color(value, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(value, current_theme.text_secondary, 0); lv_obj_set_style_text_font(value, &lv_font_montserrat_12, 0); lv_obj_set_style_text_align(value, LV_TEXT_ALIGN_RIGHT, 0); } @@ -260,11 +259,11 @@ static void finish_scan(void) { snprintf(buf, sizeof(buf), "%d of %d present", present, TECH_COUNT); lv_label_set_text(s_summary, buf); lv_obj_set_style_text_color( - s_summary, present > 0 ? lv_color_hex(SIG_GREEN) : lv_color_hex(COL_DIM), 0); + s_summary, present > 0 ? lv_color_hex(UI_COL_SUCCESS) : current_theme.text_secondary, 0); } if (s_status != NULL) { lv_label_set_text(s_status, STATUS_DONE); - lv_obj_set_style_text_color(s_status, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_text_color(s_status, lv_color_hex(UI_COL_SUCCESS), 0); } if (s_hint != NULL) ui_chrome_footer_set_text(s_hint, HINT_DONE); diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_ultralight_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_ultralight_ui.c index 0f2ef09fd..0e62992ee 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_ultralight_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_ultralight_ui.c @@ -35,7 +35,6 @@ #define DUMP_PAD 8 #define DUMP_LGAP 3 -#define COL_DIM 0x8A8594 #define COL_LINE 0x2A2636 #define COL_PANEL2 0x1A1626 @@ -82,7 +81,7 @@ static void make_chip(lv_obj_t *parent, const char *txt, bool sel) { lv_obj_t *l = lv_label_create(chip); lv_label_set_text(l, txt); lv_obj_set_style_text_font(l, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(l, sel ? current_theme.border_accent : lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(l, sel ? current_theme.border_accent : current_theme.text_secondary, 0); lv_obj_center(l); } diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_write_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_write_ui.c index bffbe8a46..097738efd 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_write_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_write_ui.c @@ -30,11 +30,10 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #define WR_TICK_MS 33 -#define SIG_GREEN 0x00E676 -#define COL_DIM 0x8A8594 #define WRITE_ICON "/assets/icons/edit.bin" #define MAX_CARDS 10 @@ -127,7 +126,7 @@ static void build_empty(const char *icon, const char *title, const char *sub) { lv_obj_t *s = lv_label_create(card); lv_label_set_text(s, sub); lv_obj_set_style_text_font(s, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(s, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s, current_theme.text_secondary, 0); } static lv_obj_t *dash_line(lv_obj_t *parent, lv_point_precise_t *pts, int x, int y) { @@ -282,18 +281,18 @@ static void begin_writing(void) { } static void finish_write(void) { - lv_obj_set_style_text_color(s_ov_status, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_text_color(s_ov_status, lv_color_hex(UI_COL_SUCCESS), 0); lv_label_set_text(s_ov_status, "Written!"); if (s_ov_bar) { lv_bar_set_value(s_ov_bar, 100, LV_ANIM_OFF); - lv_obj_set_style_bg_color(s_ov_bar, lv_color_hex(SIG_GREEN), LV_PART_INDICATOR); + lv_obj_set_style_bg_color(s_ov_bar, lv_color_hex(UI_COL_SUCCESS), LV_PART_INDICATOR); } if (s_ov_card) { s_ov_ok = lv_obj_create(s_ov); lv_obj_remove_flag(s_ov_ok, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_size(s_ov_ok, 30, 30); lv_obj_set_style_radius(s_ov_ok, LV_RADIUS_CIRCLE, 0); - lv_obj_set_style_bg_color(s_ov_ok, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_bg_color(s_ov_ok, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_set_style_bg_opa(s_ov_ok, LV_OPA_COVER, 0); lv_obj_set_style_border_width(s_ov_ok, 0, 0); lv_obj_align_to(s_ov_ok, s_ov_card, LV_ALIGN_TOP_RIGHT, -8, 8); diff --git a/firmware_p4/components/Applications/ui/screens/octobit/octobit_status_ui.c b/firmware_p4/components/Applications/ui/screens/octobit/octobit_status_ui.c index 34e2390e4..0195edcb5 100644 --- a/firmware_p4/components/Applications/ui/screens/octobit/octobit_status_ui.c +++ b/firmware_p4/components/Applications/ui/screens/octobit/octobit_status_ui.c @@ -52,7 +52,6 @@ #define OCTO_XP_MAX 2000 #define COL_RAISE 0x170A28 -#define COL_DIM 0x8A8594 #define REFRESH_MS 1000 @@ -156,7 +155,7 @@ static void refresh_values(void) { static void refresh_selection(void) { const lv_color_t accent = current_theme.border_accent; - const lv_color_t dim = lv_color_hex(COL_DIM); + const lv_color_t dim = current_theme.text_secondary; for (int i = 0; i < ST_COUNT; i++) { bool sel = (i == s_sel); lv_obj_set_style_border_color(s_row[i], sel ? accent : current_theme.border_inactive, 0); @@ -277,13 +276,13 @@ static void build_top_card(void) { lv_obj_t *xp_tag = lv_label_create(card); lv_label_set_text(xp_tag, "XP"); lv_obj_set_style_text_font(xp_tag, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(xp_tag, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(xp_tag, current_theme.text_secondary, 0); lv_obj_align(xp_tag, LV_ALIGN_LEFT_MID, col_x, -12); lv_obj_t *xp_val = lv_label_create(card); lv_label_set_text_fmt(xp_val, "%d / %d", OCTO_XP, OCTO_XP_MAX); lv_obj_set_style_text_font(xp_val, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(xp_val, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(xp_val, current_theme.text_secondary, 0); lv_obj_set_width(xp_val, col_w); lv_obj_set_style_text_align(xp_val, LV_TEXT_ALIGN_RIGHT, 0); lv_obj_align(xp_val, LV_ALIGN_LEFT_MID, col_x, -12); @@ -319,13 +318,13 @@ static void build_selector(void) { lv_obj_t *tag = lv_label_create(s_screen); lv_label_set_text(tag, "STATISTICS"); lv_obj_set_style_text_font(tag, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(tag, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(tag, current_theme.text_secondary, 0); lv_obj_align(tag, LV_ALIGN_TOP_LEFT, MX + 4, SELHD_Y); s_counter = lv_label_create(s_screen); lv_label_set_text(s_counter, "1/8"); lv_obj_set_style_text_font(s_counter, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(s_counter, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_counter, current_theme.text_secondary, 0); lv_obj_align(s_counter, LV_ALIGN_TOP_RIGHT, -(MX + 4), SELHD_Y); lv_obj_t *wrap = lv_obj_create(s_screen); diff --git a/firmware_p4/components/Applications/ui/screens/power/power_ui.c b/firmware_p4/components/Applications/ui/screens/power/power_ui.c index 17f11dead..23758561c 100644 --- a/firmware_p4/components/Applications/ui/screens/power/power_ui.c +++ b/firmware_p4/components/Applications/ui/screens/power/power_ui.c @@ -24,6 +24,7 @@ #include "msgbox_ui.h" #include "ui_chrome.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #define REFRESH_MS 700 @@ -59,8 +60,6 @@ #define ICON_W 20 #define NAME_PAD_L 9 -#define SUCCESS_COLOR 0x00E676 -#define COL_DIM 0x8A8594 #define COL_RAISE 0x170A28 enum { ACT_CHARGE, ACT_SCAN, ACT_REGS, ACT_OFF, ACT_COUNT }; @@ -108,12 +107,12 @@ static const char *vbus_name(bq25896_vbus_status_t s) { static void style_state_chip(bool charging) { if (charging) { - lv_obj_set_style_text_color(s_state, lv_color_hex(SUCCESS_COLOR), 0); - lv_obj_set_style_bg_color(s_state, lv_color_hex(SUCCESS_COLOR), 0); + lv_obj_set_style_text_color(s_state, lv_color_hex(UI_COL_SUCCESS), 0); + lv_obj_set_style_bg_color(s_state, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_set_style_bg_opa(s_state, LV_OPA_20, 0); lv_obj_set_style_border_width(s_state, 0, 0); } else { - lv_obj_set_style_text_color(s_state, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_state, current_theme.text_secondary, 0); lv_obj_set_style_bg_color(s_state, current_theme.bg_secondary, 0); lv_obj_set_style_bg_opa(s_state, LV_OPA_COVER, 0); lv_obj_set_style_border_width(s_state, CHIP_BORDER_W, 0); @@ -180,7 +179,7 @@ static void refresh_telem(void) { static void refresh_selection(void) { const lv_color_t accent = current_theme.border_accent; - const lv_color_t dim = lv_color_hex(COL_DIM); + const lv_color_t dim = current_theme.text_secondary; for (int i = 0; i < ACT_COUNT; i++) { bool sel = (i == s_sel); lv_obj_set_style_border_color(s_row[i], sel ? accent : current_theme.border_inactive, 0); @@ -235,7 +234,7 @@ static void build_hero(void) { s_src = lv_label_create(card); lv_label_set_text(s_src, ""); lv_obj_set_style_text_font(s_src, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(s_src, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_src, current_theme.text_secondary, 0); lv_obj_align(s_src, LV_ALIGN_RIGHT_MID, SRC_X, SRC_Y); } diff --git a/firmware_p4/components/Applications/ui/screens/rfid/rfid_menu_ui.c b/firmware_p4/components/Applications/ui/screens/rfid/rfid_menu_ui.c index 365a1d478..7a90b9d31 100644 --- a/firmware_p4/components/Applications/ui/screens/rfid/rfid_menu_ui.c +++ b/firmware_p4/components/Applications/ui/screens/rfid/rfid_menu_ui.c @@ -33,6 +33,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #include "waves_ui.h" @@ -41,8 +42,6 @@ static const char *TAG = "RFID_UI"; #define TICK_MS 50 #define REVEAL_MS 3000 -#define SIG_GREEN 0x00E676 -#define COL_DIM 0x8A8594 #define COL_DANGER 0xFF5470 #define LIST_TITLE_ICON "/assets/icons/contactless.bin" @@ -176,7 +175,7 @@ static const char *TAG = "RFID_UI"; #define CARD_TITLE "EM4100" #define CARD_SUBTITLE "Low-Frequency 125 kHz" #define CARD_LINE "UID 1A 2B 3C 4D 55" -#define CARD_META "64-bit · Read-only" +#define CARD_META "64-bit | Read-only" static const char *const WIEGAND_LINES[] = { "Format: HID 26-bit", @@ -210,10 +209,10 @@ typedef struct { } rfid_card_t; static const rfid_card_t SAVED_CARDS[] = { - {"Office_Badge", "EM4100", "1A 2B 3C 4D 55", "64-bit · Read-only"}, - {"Garage_Fob", "HIDProx", "20 06 EC 0C 86", "44-bit · Read-only"}, - {"Gym_Tag", "Indala", "A0 00 1C FE 49", "64-bit · Read-only"}, - {"Locker_03", "EM4100", "09 FB 2D 77 11", "64-bit · Read-only"}, + {"Office_Badge", "EM4100", "1A 2B 3C 4D 55", "64-bit | Read-only"}, + {"Garage_Fob", "HIDProx", "20 06 EC 0C 86", "44-bit | Read-only"}, + {"Gym_Tag", "Indala", "A0 00 1C FE 49", "64-bit | Read-only"}, + {"Locker_03", "EM4100", "09 FB 2D 77 11", "64-bit | Read-only"}, }; #define SAVED_CARD_COUNT ((int)(sizeof(SAVED_CARDS) / sizeof(SAVED_CARDS[0]))) #define RFID_MAX_CARDS 16 @@ -587,7 +586,7 @@ static void reveal_captured_card(void) { lv_anim_delete(s_status_lbl, opa_cb); lv_obj_set_style_opa(s_status_lbl, LV_OPA_COVER, 0); lv_label_set_text(s_status_lbl, "Tag detected!"); - lv_obj_set_style_text_color(s_status_lbl, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_text_color(s_status_lbl, lv_color_hex(UI_COL_SUCCESS), 0); } lv_obj_t *card = @@ -676,7 +675,7 @@ static void build_saved_empty(void) { lv_obj_t *s = lv_label_create(card); lv_label_set_text(s, "Read or add a tag first"); lv_obj_set_style_text_font(s, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(s, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s, current_theme.text_secondary, 0); s_hint = ui_chrome_footer(s_screen, HINT_SHOW); } @@ -703,7 +702,7 @@ static void saved_row_detail(const rfid_card_t *c, char *out, size_t n) { int fc = 0; int cn = 0; uid_wiegand(c->uid, &fc, &cn); - snprintf(out, n, "%s · FC %d CN %d", c->proto, fc, cn); + snprintf(out, n, "%s | FC %d CN %d", c->proto, fc, cn); } static void saved_apply_selection(void) { @@ -900,7 +899,7 @@ static void seed_emulate_default(void) { snprintf(s_emu_sub, sizeof(s_emu_sub), "%s", CARD_SUBTITLE); snprintf(s_emu_line, sizeof(s_emu_line), "%s", CARD_LINE); snprintf(s_emu_meta, sizeof(s_emu_meta), "%s", CARD_META); - snprintf(s_emu_freq, sizeof(s_emu_freq), "EM4100 · 125 kHz LF"); + snprintf(s_emu_freq, sizeof(s_emu_freq), "EM4100 | 125 kHz LF"); } static void seed_emulate_from_card(const rfid_card_t *c) { @@ -908,7 +907,7 @@ static void seed_emulate_from_card(const rfid_card_t *c) { snprintf(s_emu_sub, sizeof(s_emu_sub), "%s", c->proto); snprintf(s_emu_line, sizeof(s_emu_line), "UID %s", c->uid); snprintf(s_emu_meta, sizeof(s_emu_meta), "%s", c->bits); - snprintf(s_emu_freq, sizeof(s_emu_freq), "%s · 125 kHz LF", c->proto); + snprintf(s_emu_freq, sizeof(s_emu_freq), "%s | 125 kHz LF", c->proto); } static void emu_tick(void) { @@ -924,7 +923,7 @@ static void build_emulate(void) { s_status_lbl = lv_label_create(s_screen); lv_label_set_text(s_status_lbl, "Emulating"); - lv_obj_set_style_text_color(s_status_lbl, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_text_color(s_status_lbl, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_set_style_text_font(s_status_lbl, &lv_font_montserrat_14, 0); lv_obj_align(s_status_lbl, LV_ALIGN_TOP_MID, 0, STATUS_Y); @@ -1066,7 +1065,7 @@ static void clone_tick(void) { } if (s_status_lbl != NULL) { lv_label_set_text(s_status_lbl, "Source captured!"); - lv_obj_set_style_text_color(s_status_lbl, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_text_color(s_status_lbl, lv_color_hex(UI_COL_SUCCESS), 0); } s_clone_card = build_data_card(s_screen, CARD_TITLE, CARD_SUBTITLE, CARD_LINE, CARD_META, true, false); @@ -1089,7 +1088,7 @@ static void clone_tick(void) { if (el >= CLONE_WRITE_MS) { if (s_status_lbl != NULL) { lv_label_set_text(s_status_lbl, "Cloned!"); - lv_obj_set_style_text_color(s_status_lbl, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_text_color(s_status_lbl, lv_color_hex(UI_COL_SUCCESS), 0); } ui_feedback(UI_FB_WRITE); ESP_LOGI(TAG, "mock rfid clone written: %s", CARD_TITLE); @@ -1134,13 +1133,13 @@ static void format_uid(const char *text, char *out, size_t n) { static void add_uid_submit(const char *text, void *ud) { (void)ud; format_uid(text, s_add_uid, sizeof(s_add_uid)); - menu_component_set_selector_value(&s_menu, 1, s_add_uid[0] ? s_add_uid : "—"); + menu_component_set_selector_value(&s_menu, 1, s_add_uid[0] ? s_add_uid : "-"); } static void build_add_manual(void) { s_menu = menu_component_create(s_screen, "ADD MANUALLY", WRITE_ICON); menu_component_add_selector(&s_menu, CARD_ICON, "Protocol", ADD_PROTOS[s_add_proto]); - menu_component_add_selector(&s_menu, COPY_ICON, "UID", s_add_uid[0] ? s_add_uid : "—"); + menu_component_add_selector(&s_menu, COPY_ICON, "UID", s_add_uid[0] ? s_add_uid : "-"); menu_component_add_selector(&s_menu, FILE_ICON, "Bits", ADD_BITS[s_add_bits]); menu_component_add_item(&s_menu, SAVED_ICON, "Save card"); menu_component_set_hint(&s_menu, HINT_ADD); @@ -1163,7 +1162,7 @@ static void add_manual_commit(void) { snprintf(c->name, sizeof(c->name), "Manual_%02d", s_card_count + 1); snprintf(c->proto, sizeof(c->proto), "%s", ADD_PROTOS[s_add_proto]); snprintf(c->uid, sizeof(c->uid), "%s", s_add_uid); - snprintf(c->bits, sizeof(c->bits), "%s · Read-only", ADD_BITS[s_add_bits]); + snprintf(c->bits, sizeof(c->bits), "%s | Read-only", ADD_BITS[s_add_bits]); s_saved_sel = s_card_count; s_card_count++; diff --git a/firmware_p4/components/Applications/ui/screens/settings/battery_settings_ui.c b/firmware_p4/components/Applications/ui/screens/settings/battery_settings_ui.c index 0e40cdaac..0c0948a32 100644 --- a/firmware_p4/components/Applications/ui/screens/settings/battery_settings_ui.c +++ b/firmware_p4/components/Applications/ui/screens/settings/battery_settings_ui.c @@ -20,6 +20,7 @@ #include "battery_service.h" #include "ui_chrome.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" static const char *TAG = "BATTERY_SETTINGS_UI"; @@ -34,7 +35,6 @@ static const char *TAG = "BATTERY_SETTINGS_UI"; #define STAT_CARD_H 46 #define LOW_COLOR 0xE53935 #define MID_COLOR 0xFFB300 -#define OK_COLOR 0x00E676 #define TITLE_FONT "A:assets/fonts/Inter.bin" static lv_obj_t *s_screen = NULL; @@ -46,7 +46,7 @@ static lv_color_t level_color(int pct) { return lv_color_hex(LOW_COLOR); if (pct < 60) return lv_color_hex(MID_COLOR); - return lv_color_hex(OK_COLOR); + return lv_color_hex(UI_COL_SUCCESS); } static void arc_anim_exec_cb(void *obj, int32_t v) { @@ -158,7 +158,7 @@ void ui_battery_settings_open(void) { uint32_t chip_color; if (charging) { lv_label_set_text(chg, LV_SYMBOL_CHARGE " CHARGING"); - chip_color = OK_COLOR; + chip_color = UI_COL_SUCCESS; } else if (on_usb) { lv_label_set_text(chg, LV_SYMBOL_CHARGE " ON USB"); chip_color = MID_COLOR; @@ -190,16 +190,16 @@ void ui_battery_settings_open(void) { add_stat_card(stats, on_usb ? "USB" : "BATT", "SOURCE", - on_usb ? lv_color_hex(OK_COLOR) : current_theme.text_main); + on_usb ? lv_color_hex(UI_COL_SUCCESS) : current_theme.text_main); const char *st = "IDLE"; lv_color_t st_col = current_theme.border_accent; if (charging) { st = (bs.chg == CHARGE_STATUS_PRECHARGE) ? "PRE" : "FAST"; - st_col = lv_color_hex(OK_COLOR); + st_col = lv_color_hex(UI_COL_SUCCESS); } else if (bs.chg == CHARGE_STATUS_CHARGE_DONE) { st = "FULL"; - st_col = lv_color_hex(OK_COLOR); + st_col = lv_color_hex(UI_COL_SUCCESS); } add_stat_card(stats, st, "STATUS", st_col); diff --git a/firmware_p4/components/Applications/ui/screens/settings/c5_status_ui.c b/firmware_p4/components/Applications/ui/screens/settings/c5_status_ui.c index a958eff71..88cd110e3 100644 --- a/firmware_p4/components/Applications/ui/screens/settings/c5_status_ui.c +++ b/firmware_p4/components/Applications/ui/screens/settings/c5_status_ui.c @@ -27,6 +27,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #define MX 8 @@ -39,8 +40,6 @@ #define ROW_GAP 6 #define ROW_STEP (ROW_H + ROW_GAP) -#define COL_SUCCESS 0x00E676 -#define COL_DIM 0x8A8594 #define COL_RAISE 0x170A28 #define HDR_ICON "/assets/icons/developer_board.bin" @@ -86,7 +85,7 @@ static lv_obj_t *info_row(lv_obj_t *card, int index, const char *tag_txt, const lv_obj_t *val = lv_label_create(card); lv_label_set_text(val, val_txt); lv_obj_set_style_text_font(val, &lv_font_montserrat_14, 0); - lv_obj_set_style_text_color(val, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(val, current_theme.text_secondary, 0); lv_obj_align(val, LV_ALIGN_TOP_RIGHT, 0, index * INFO_ROW_GAP); return val; } @@ -122,7 +121,7 @@ static void build_info_card(void) { lv_obj_t *link_val = info_row(card, 0, "Link", alive ? "ALIVE" : "DOWN"); if (alive) - lv_obj_set_style_text_color(link_val, lv_color_hex(COL_SUCCESS), 0); + lv_obj_set_style_text_color(link_val, lv_color_hex(UI_COL_SUCCESS), 0); info_row(card, 1, "C5 FW", cver); info_row(card, 2, "Expected", FIRMWARE_VERSION); } @@ -163,7 +162,7 @@ static lv_obj_t *make_action_row(lv_obj_t *parent, int i) { static void refresh_selection(void) { const lv_color_t accent = current_theme.border_accent; - const lv_color_t dim = lv_color_hex(COL_DIM); + const lv_color_t dim = current_theme.text_secondary; for (int i = 0; i < ACT_COUNT; i++) { bool sel = (i == s_sel); lv_obj_set_style_border_color(s_act_row[i], sel ? accent : current_theme.border_inactive, 0); diff --git a/firmware_p4/components/Applications/ui/screens/settings/led_ctrl_ui.c b/firmware_p4/components/Applications/ui/screens/settings/led_ctrl_ui.c index 83122465d..c44dc8d36 100644 --- a/firmware_p4/components/Applications/ui/screens/settings/led_ctrl_ui.c +++ b/firmware_p4/components/Applications/ui/screens/settings/led_ctrl_ui.c @@ -47,7 +47,6 @@ #define BRIGHT_STEP 5 #define BRIGHT_DEFAULT 80 -#define COL_DIM 0x8A8594 #define COL_OFF 0x101018 #define COL_TRACK 0x202028 @@ -193,7 +192,7 @@ static lv_obj_t *make_ctrl_card(lv_obj_t *parent, const char *label, int h) { lv_obj_t *lbl = lv_label_create(card); lv_label_set_text(lbl, label); lv_obj_set_style_text_font(lbl, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(lbl, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(lbl, current_theme.text_secondary, 0); lv_obj_set_width(lbl, CARD_LABEL_W); return card; } diff --git a/firmware_p4/components/Applications/ui/screens/settings/sd_health_ui.c b/firmware_p4/components/Applications/ui/screens/settings/sd_health_ui.c index e22782ed2..44e46fbda 100644 --- a/firmware_p4/components/Applications/ui/screens/settings/sd_health_ui.c +++ b/firmware_p4/components/Applications/ui/screens/settings/sd_health_ui.c @@ -25,6 +25,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #include "vfs_core.h" #include "vfs_sdcard.h" @@ -39,8 +40,6 @@ #define MX 8 #define CONTENT_W (240 - 2 * MX) -#define COL_DIM 0x8A8594 -#define COL_SUCCESS 0x00E676 #define COL_ACC2 0xB89AFF #define HERO_Y 48 @@ -156,7 +155,7 @@ static void build_hero(void) { lv_obj_t *spec = lv_label_create(card); lv_label_set_text(spec, mounted ? "FAT32" : "Not mounted"); lv_obj_set_style_text_font(spec, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(spec, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(spec, current_theme.text_secondary, 0); lv_obj_align(spec, LV_ALIGN_TOP_LEFT, INFO_X, 26); lv_obj_t *chip = lv_obj_create(card); @@ -182,7 +181,7 @@ static void build_hero(void) { lv_obj_set_style_radius(bar, 5, LV_PART_MAIN); lv_obj_set_style_bg_color(bar, current_theme.bg_primary, LV_PART_MAIN); lv_obj_set_style_bg_opa(bar, LV_OPA_COVER, LV_PART_MAIN); - lv_obj_set_style_border_color(bar, lv_color_hex(COL_DIM), LV_PART_MAIN); + lv_obj_set_style_border_color(bar, current_theme.text_secondary, LV_PART_MAIN); lv_obj_set_style_border_opa(bar, LV_OPA_40, LV_PART_MAIN); lv_obj_set_style_border_width(bar, 1, LV_PART_MAIN); lv_obj_set_style_radius(bar, 5, LV_PART_INDICATOR); @@ -194,7 +193,7 @@ static void build_hero(void) { lv_obj_t *used = lv_label_create(card); lv_label_set_text(used, usedbuf); lv_obj_set_style_text_font(used, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(used, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(used, current_theme.text_secondary, 0); lv_obj_align(used, LV_ALIGN_TOP_LEFT, 0, KV_Y); lv_obj_t *free_lbl = lv_label_create(card); @@ -216,17 +215,17 @@ build_tile(int x, const char *caption, const char *value, lv_obj_t **val_out, lv lv_obj_t *cap = lv_label_create(card); lv_label_set_text(cap, caption); lv_obj_set_style_text_font(cap, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(cap, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(cap, current_theme.text_secondary, 0); lv_obj_t *val = lv_label_create(card); lv_label_set_text(val, value); lv_obj_set_style_text_font(val, &lv_font_montserrat_16, 0); - lv_obj_set_style_text_color(val, lv_color_hex(COL_SUCCESS), 0); + lv_obj_set_style_text_color(val, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_t *sub = lv_label_create(card); lv_label_set_text(sub, UNIT_OK); lv_obj_set_style_text_font(sub, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(sub, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(sub, current_theme.text_secondary, 0); *val_out = val; *sub_out = sub; diff --git a/firmware_p4/components/Applications/ui/screens/settings/system_update_ui.c b/firmware_p4/components/Applications/ui/screens/settings/system_update_ui.c index 8052ec319..128e6fc66 100644 --- a/firmware_p4/components/Applications/ui/screens/settings/system_update_ui.c +++ b/firmware_p4/components/Applications/ui/screens/settings/system_update_ui.c @@ -23,6 +23,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #include "waves_ui.h" @@ -76,8 +77,6 @@ #define PH_ERASE_MAX 42 #define PH_WRITE_MAX 96 -#define COL_SUCCESS 0x00E676 -#define COL_DIM 0x8A8594 #define COL_TRACK 0x202028 #define NEW_VERSION "v2.1.0" @@ -280,7 +279,7 @@ static void build_found(void) { lv_obj_t *cap = lv_label_create(card); lv_label_set_text(cap, CAPTION_NEW); lv_obj_set_style_text_font(cap, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(cap, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(cap, current_theme.text_secondary, 0); lv_obj_align(cap, LV_ALIGN_CENTER, 0, -20); lv_obj_t *pill = lv_obj_create(card); @@ -303,7 +302,7 @@ static void build_found(void) { lv_obj_t *inst = lv_label_create(card); lv_label_set_text(inst, INSTALLED_ROW); lv_obj_set_style_text_font(inst, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(inst, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(inst, current_theme.text_secondary, 0); lv_obj_align(inst, LV_ALIGN_BOTTOM_MID, 0, 0); } @@ -320,10 +319,10 @@ static void set_step_label(void) { char buf[STEP_BUF_LEN]; snprintf(buf, sizeof(buf), STEP_WRITE_FMT, s_pct); lv_label_set_text(s_step_lbl, buf); - lv_obj_set_style_text_color(s_step_lbl, lv_color_hex(COL_SUCCESS), 0); + lv_obj_set_style_text_color(s_step_lbl, lv_color_hex(UI_COL_SUCCESS), 0); } else { lv_label_set_text(s_step_lbl, STEP_FINALIZE); - lv_obj_set_style_text_color(s_step_lbl, lv_color_hex(COL_SUCCESS), 0); + lv_obj_set_style_text_color(s_step_lbl, lv_color_hex(UI_COL_SUCCESS), 0); } } @@ -381,7 +380,7 @@ static void build_applying(void) { lv_obj_set_style_bg_opa(s_bar, LV_OPA_COVER, LV_PART_MAIN); lv_obj_set_style_radius(s_bar, BAR_RAD, LV_PART_MAIN); lv_obj_set_style_bg_color(s_bar, current_theme.border_accent, LV_PART_INDICATOR); - lv_obj_set_style_bg_grad_color(s_bar, lv_color_hex(COL_SUCCESS), LV_PART_INDICATOR); + lv_obj_set_style_bg_grad_color(s_bar, lv_color_hex(UI_COL_SUCCESS), LV_PART_INDICATOR); lv_obj_set_style_bg_grad_dir(s_bar, LV_GRAD_DIR_HOR, LV_PART_INDICATOR); lv_obj_set_style_bg_opa(s_bar, LV_OPA_COVER, LV_PART_INDICATOR); lv_obj_set_style_radius(s_bar, BAR_RAD, LV_PART_INDICATOR); diff --git a/firmware_p4/components/Applications/ui/screens/subghz/subghz_brute_ui.c b/firmware_p4/components/Applications/ui/screens/subghz/subghz_brute_ui.c index 395490e66..2041ccf65 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/subghz_brute_ui.c +++ b/firmware_p4/components/Applications/ui/screens/subghz/subghz_brute_ui.c @@ -26,6 +26,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" static const char *TAG = "SUBGHZ_BF"; @@ -36,8 +37,6 @@ static const char *TAG = "SUBGHZ_BF"; #define SCOPE_TICK_MS 38 #define DOT_CYCLE_MS 350 -#define SIG_GREEN 0x00E676 - #define STATUS_Y 48 #define FREQ_Y 68 @@ -299,7 +298,7 @@ static void resolve(void) { lv_obj_remove_flag(s_hit, LV_OBJ_FLAG_HIDDEN); if (s_status != NULL) { lv_label_set_text(s_status, "Code found!"); - lv_obj_set_style_text_color(s_status, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_text_color(s_status, lv_color_hex(UI_COL_SUCCESS), 0); } if (s_hint != NULL) ui_chrome_footer_set_text(s_hint, HINT_SHOW); diff --git a/firmware_p4/components/Applications/ui/screens/subghz/subghz_config_ui.c b/firmware_p4/components/Applications/ui/screens/subghz/subghz_config_ui.c index fee85d7cd..02172e070 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/subghz_config_ui.c +++ b/firmware_p4/components/Applications/ui/screens/subghz/subghz_config_ui.c @@ -64,7 +64,6 @@ #define TILE_VAL_Y 25 #define TILE_GLOW_W 12 -#define COL_DIM 0x8A8594 #define COL_BAND_A 0x221F2E #define COL_BAND_B 0x3A2F55 @@ -120,7 +119,7 @@ static void build_freq_card(void) { lv_obj_t *cap = lv_label_create(card); lv_label_set_text(cap, "TUNED FREQUENCY"); lv_obj_set_style_text_font(cap, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(cap, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(cap, current_theme.text_secondary, 0); lv_obj_align(cap, LV_ALIGN_TOP_MID, 0, FREQ_CAP_Y); lv_obj_t *grp = lv_obj_create(card); @@ -183,7 +182,7 @@ static void build_freq_card(void) { lv_obj_t *lbl = lv_label_create(scale); lv_label_set_text(lbl, SCALE_LABELS[i]); lv_obj_set_style_text_font(lbl, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(lbl, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(lbl, current_theme.text_secondary, 0); } } @@ -201,7 +200,7 @@ static lv_obj_t *build_tile(int i) { lv_obj_t *cap = lv_label_create(tile); lv_label_set_text(cap, FIELDS[i].name); lv_obj_set_style_text_font(cap, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(cap, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(cap, current_theme.text_secondary, 0); lv_obj_align(cap, LV_ALIGN_TOP_LEFT, TILE_PAD_L, TILE_CAP_Y); lv_obj_t *grp = lv_obj_create(tile); @@ -225,7 +224,7 @@ static lv_obj_t *build_tile(int i) { lv_obj_t *unit = lv_label_create(grp); lv_label_set_text(unit, FIELDS[i].unit); lv_obj_set_style_text_font(unit, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(unit, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(unit, current_theme.text_secondary, 0); } return tile; diff --git a/firmware_p4/components/Applications/ui/screens/subghz/subghz_read_ui.c b/firmware_p4/components/Applications/ui/screens/subghz/subghz_read_ui.c index 4d9b25635..fbe014750 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/subghz_read_ui.c +++ b/firmware_p4/components/Applications/ui/screens/subghz/subghz_read_ui.c @@ -28,6 +28,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" static const char *TAG = "SUBGHZ_RD"; @@ -42,8 +43,6 @@ static const char *TAG = "SUBGHZ_RD"; #define SCOPE_TICK_MS 38 #define DOT_CYCLE_MS 350 -#define SIG_GREEN 0x00E676 - #define HEADER_TITLE_Y 10 #define HEADER_RULE_Y 32 #define HEADER_RULE_W 70 @@ -453,7 +452,7 @@ static void scan_done_cb(lv_timer_t *t) { if (s_status) { lv_label_set_text(s_status, "Signal locked!"); - lv_obj_set_style_text_color(s_status, lv_color_hex(SIG_GREEN), 0); + lv_obj_set_style_text_color(s_status, lv_color_hex(UI_COL_SUCCESS), 0); } if (s_freq) lv_label_set_text(s_freq, SIG_LOCK_FREQ); diff --git a/firmware_p4/components/Applications/ui/screens/subghz/subghz_send_ui.c b/firmware_p4/components/Applications/ui/screens/subghz/subghz_send_ui.c index 1863deba9..7309ce47a 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/subghz_send_ui.c +++ b/firmware_p4/components/Applications/ui/screens/subghz/subghz_send_ui.c @@ -28,11 +28,11 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" static const char *TAG = "SUBGHZ_SEND_UI"; -#define SIG_GREEN 0x00E676 #define ANTENNA_ICON "/assets/icons/settings_input_antenna.bin" #define SIGNAL_ICON "/assets/icons/graphic_eq.bin" @@ -46,7 +46,6 @@ static const char *TAG = "SUBGHZ_SEND_UI"; #define SCOPE_Y_OFS -8 #define WAVES_ICON "/assets/icons/waves.bin" -#define DIM_COLOR 0x8A8594 #define LIST_PAD_SIDE 8 #define LIST_PAD_ROW 6 @@ -135,7 +134,7 @@ static void set_status(const char *text, bool success) { return; lv_label_set_text(s_status_label, text); lv_obj_set_style_text_color( - s_status_label, success ? lv_color_hex(SIG_GREEN) : current_theme.text_main, 0); + s_status_label, success ? lv_color_hex(UI_COL_SUCCESS) : current_theme.text_main, 0); } static void set_hint(const char *text) { @@ -160,8 +159,8 @@ static void style_row(int i, bool sel) { lv_obj_set_style_bg_color(r, current_theme.bg_primary, 0); lv_obj_set_style_border_color(r, current_theme.border_inactive, 0); lv_obj_set_style_shadow_width(r, 0, 0); - lv_obj_set_style_text_color(s_row_name[i], lv_color_hex(DIM_COLOR), 0); - lv_obj_set_style_text_color(s_row_val[i], lv_color_hex(DIM_COLOR), 0); + lv_obj_set_style_text_color(s_row_name[i], current_theme.text_secondary, 0); + lv_obj_set_style_text_color(s_row_val[i], current_theme.text_secondary, 0); } } diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_hotspot_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_hotspot_ui.c index 5dfe604db..adb163ccf 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_hotspot_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_hotspot_ui.c @@ -26,6 +26,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_semantic.h" #include "ui_theme.h" #include "wifi_service.h" @@ -70,8 +71,6 @@ #define TILE_GAP 6 #define RCOL_GAP 6 -#define COL_OK 0x00E676 -#define COL_DIM 0x8A8594 #define COL_CYAN 0x37E0A8 #define COL_ACC2 0xB89AFF @@ -166,7 +165,7 @@ static lv_obj_t *make_tile( lv_obj_set_flex_align(tile, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_START); lv_obj_set_style_pad_row(tile, 1, 0); - make_label(tile, lbl, &lv_font_montserrat_12, lv_color_hex(COL_DIM)); + make_label(tile, lbl, &lv_font_montserrat_12, current_theme.text_secondary); make_label(tile, val, vfont, vcol); return tile; } @@ -178,15 +177,15 @@ static void update_uptime_label(void) { char buf[UPTIME_BUF]; snprintf(buf, sizeof(buf), UPTIME_ONLINE_FMT, s_secs / 60, s_secs % 60); lv_label_set_text(s_uptime, buf); - lv_obj_set_style_text_color(s_uptime, lv_color_hex(COL_OK), 0); + lv_obj_set_style_text_color(s_uptime, lv_color_hex(UI_COL_SUCCESS), 0); } else { lv_label_set_text(s_uptime, TXT_OFFLINE); - lv_obj_set_style_text_color(s_uptime, lv_color_hex(COL_DIM), 0); + lv_obj_set_style_text_color(s_uptime, current_theme.text_secondary, 0); } } static void apply_online(void) { - lv_color_t c = s_online ? lv_color_hex(COL_OK) : lv_color_hex(COL_DIM); + lv_color_t c = s_online ? lv_color_hex(UI_COL_SUCCESS) : current_theme.text_secondary; if (s_dot != NULL) lv_obj_set_style_bg_color(s_dot, c, 0); @@ -249,7 +248,7 @@ static void build_status_card(lv_obj_t *parent) { lv_obj_set_style_radius(s_dot, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_border_width(s_dot, 0, 0); lv_obj_set_style_bg_opa(s_dot, LV_OPA_COVER, 0); - lv_obj_set_style_bg_color(s_dot, lv_color_hex(COL_OK), 0); + lv_obj_set_style_bg_color(s_dot, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_t *txt = lv_obj_create(card); lv_obj_remove_flag(txt, LV_OBJ_FLAG_SCROLLABLE); @@ -264,7 +263,7 @@ static void build_status_card(lv_obj_t *parent) { lv_obj_set_style_pad_row(txt, 2, 0); make_label(txt, AP_NAME, &lv_font_montserrat_14, current_theme.text_main); - s_uptime = make_label(txt, "", &lv_font_montserrat_12, lv_color_hex(COL_OK)); + s_uptime = make_label(txt, "", &lv_font_montserrat_12, lv_color_hex(UI_COL_SUCCESS)); s_toggle = lv_obj_create(card); lv_obj_remove_flag(s_toggle, LV_OBJ_FLAG_SCROLLABLE); @@ -272,9 +271,9 @@ static void build_status_card(lv_obj_t *parent) { lv_obj_set_size(s_toggle, TOGGLE_W, TOGGLE_H); lv_obj_set_style_radius(s_toggle, TOGGLE_RADIUS, 0); lv_obj_set_style_pad_all(s_toggle, 0, 0); - lv_obj_set_style_bg_color(s_toggle, lv_color_hex(COL_OK), 0); + lv_obj_set_style_bg_color(s_toggle, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_set_style_bg_opa(s_toggle, LV_OPA_20, 0); - lv_obj_set_style_border_color(s_toggle, lv_color_hex(COL_OK), 0); + lv_obj_set_style_border_color(s_toggle, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_set_style_border_width(s_toggle, 1, 0); s_knob = lv_obj_create(s_toggle); @@ -283,7 +282,7 @@ static void build_status_card(lv_obj_t *parent) { lv_obj_set_style_radius(s_knob, LV_RADIUS_CIRCLE, 0); lv_obj_set_style_border_width(s_knob, 0, 0); lv_obj_set_style_bg_opa(s_knob, LV_OPA_COVER, 0); - lv_obj_set_style_bg_color(s_knob, lv_color_hex(COL_OK), 0); + lv_obj_set_style_bg_color(s_knob, lv_color_hex(UI_COL_SUCCESS), 0); lv_obj_align(s_knob, LV_ALIGN_RIGHT_MID, -KNOB_INSET, 0); } @@ -304,7 +303,7 @@ static void build_arc(lv_obj_t *parent) { lv_obj_t *center = make_label(arc, ARC_CENTER, &lv_font_montserrat_14, current_theme.text_main); lv_obj_align(center, LV_ALIGN_CENTER, 0, -6); - lv_obj_t *sub = make_label(arc, ARC_SUB, &lv_font_montserrat_12, lv_color_hex(COL_DIM)); + lv_obj_t *sub = make_label(arc, ARC_SUB, &lv_font_montserrat_12, current_theme.text_secondary); lv_obj_align(sub, LV_ALIGN_CENTER, 0, 11); } diff --git a/firmware_p4/components/Applications/ui/ui_theme.c b/firmware_p4/components/Applications/ui/ui_theme.c index cfe286dfd..95a34677e 100644 --- a/firmware_p4/components/Applications/ui/ui_theme.c +++ b/firmware_p4/components/Applications/ui/ui_theme.c @@ -101,6 +101,7 @@ void ui_theme_load_idx(int color_idx) { current_theme.border_interface = lv_color_hex(0xBF00FF); current_theme.border_inactive = lv_color_hex(0x2A2A2A); current_theme.text_main = lv_color_hex(0xFFFFFF); + current_theme.text_secondary = lv_color_hex(0x8A8594); current_theme.screen_base = lv_color_hex(0x000000); current_theme.protocol_nfc = lv_color_hex(0xCC00FF); current_theme.protocol_wifi = lv_color_hex(0xBF00FF); @@ -150,6 +151,9 @@ void ui_theme_load_idx(int color_idx) { lv_color_hex(hex_to_int(cJSON_GetObjectItem(theme_node, "screen_base")->valuestring)); cJSON *v; + v = cJSON_GetObjectItem(theme_node, "text_secondary"); + current_theme.text_secondary = + v ? lv_color_hex(hex_to_int(v->valuestring)) : lv_color_hex(0x8A8594); v = cJSON_GetObjectItem(theme_node, "protocol_nfc"); current_theme.protocol_nfc = v ? lv_color_hex(hex_to_int(v->valuestring)) : lv_color_hex(0x2196F3); @@ -198,6 +202,8 @@ static void apply_conf_color(const char *key, const char *value, int section) { current_theme.border_inactive = color; else if (strcmp(key, "text_main") == 0) current_theme.text_main = color; + else if (strcmp(key, "text_secondary") == 0) + current_theme.text_secondary = color; else if (strcmp(key, "screen_base") == 0) current_theme.screen_base = color; } else if (section == CONF_SECTION_PROTOCOL) { @@ -311,6 +317,9 @@ static void parse_theme_json(const char *data) { v = cJSON_GetObjectItem(colors, "text_main"); if (v) current_theme.text_main = lv_color_hex(hex_to_int(v->valuestring)); + v = cJSON_GetObjectItem(colors, "text_secondary"); + if (v) + current_theme.text_secondary = lv_color_hex(hex_to_int(v->valuestring)); v = cJSON_GetObjectItem(colors, "screen_base"); if (v) current_theme.screen_base = lv_color_hex(hex_to_int(v->valuestring)); From 1bf4b3c7e0a699732336abd218c438e805c3d850 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 14:02:30 -0300 Subject: [PATCH 015/103] fix(radio): shared SPI3 bus lock between SX1262 and ST7789 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit SPI3 is shared by the LoRa radio (SX1262, manual-CS + spi_device_acquire_bus) and the display (ST7789, esp_lcd queued/DMA). Under sustained RX the radio could starve the display flush -> LVGL renderer stall -> controlled restart. Add a shared SPI3 bus lock (binary semaphore, ISR-giveable) in the spi component: the radio HAL takes/gives it around its transactions and the LVGL flush holds it from FLUSH_START to the color-trans-done ISR. The flush take is bounded (50 ms) so a busy radio can never stall the renderer — on timeout it draws anyway, since the ESP-IDF per-bus lock still serializes the transfer. max_transfer_sz raised to 49152 so each flush is a single transaction (one completion per flush, balanced take/give). --- .../components/Drivers/spi/include/spi.h | 37 ++++++++++++++++++- firmware_p4/components/Drivers/spi/spi.c | 31 +++++++++++++++- .../components/Drivers/sx1262/sx1262_hal.c | 10 +++++ .../components/Service/lvgl/lvgl_glue.c | 10 +++++ 4 files changed, 85 insertions(+), 3 deletions(-) diff --git a/firmware_p4/components/Drivers/spi/include/spi.h b/firmware_p4/components/Drivers/spi/include/spi.h index 31234da99..90140709b 100644 --- a/firmware_p4/components/Drivers/spi/include/spi.h +++ b/firmware_p4/components/Drivers/spi/include/spi.h @@ -20,11 +20,14 @@ extern "C" { #endif -#include +#include #include +#include -#include "esp_err.h" #include "driver/spi_master.h" +#include "esp_err.h" +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" /** * @brief Registered SPI device identifiers. @@ -123,6 +126,36 @@ esp_err_t spi_transmit(spi_device_id_t id, const uint8_t *data, size_t len); */ esp_err_t spi_bus_deinit(spi_host_device_t host); +/** + * @brief Take the shared SPI3 bus lock. + * + * SPI3 is shared by the ST7789 display and the SX1262 LoRa radio. Both must + * hold this lock around their transactions so a radio transfer never overlaps + * or starves a display flush (which would stall the LVGL renderer). Callers use + * a bounded timeout and proceed on failure: the ESP-IDF per-bus lock still + * serializes the actual transfers, so a timeout only loses fairness, never + * correctness. The lock is created lazily by spi_bus_init(SPI3_HOST); before + * that this is a no-op returning true. + * + * @param timeout_ms Milliseconds to wait for the lock. + * @return true if the lock was taken (caller must give it), false on timeout. + */ +bool spi_bus_lock_take(uint32_t timeout_ms); + +/** + * @brief Release the shared SPI3 bus lock from task context. + */ +void spi_bus_lock_give(void); + +/** + * @brief Release the shared SPI3 bus lock from an ISR (e.g. the LCD + * color-transfer-done callback). + * + * @param hpw Set to pdTRUE if a higher-priority task was woken; pass to + * portYIELD_FROM_ISR() at the end of the ISR. May be NULL. + */ +void spi_bus_lock_give_from_isr(BaseType_t *hpw); + #ifdef __cplusplus } #endif diff --git a/firmware_p4/components/Drivers/spi/spi.c b/firmware_p4/components/Drivers/spi/spi.c index bcd7aecae..84c7ecfd3 100644 --- a/firmware_p4/components/Drivers/spi/spi.c +++ b/firmware_p4/components/Drivers/spi/spi.c @@ -23,11 +23,13 @@ static const char *TAG = "SPI_BUS"; -#define SPI_MAX_TRANSFER_SIZE 32768 +#define SPI_MAX_TRANSFER_SIZE 49152 static spi_device_handle_t s_device_handles[SPI_DEVICE_MAX] = {NULL}; static bool s_bus_active[SOC_SPI_PERIPH_NUM] = {false}; +static SemaphoreHandle_t s_spi3_lock = NULL; + esp_err_t spi_bus_init(spi_host_device_t host, int mosi, int miso, int sclk) { if (host >= SOC_SPI_PERIPH_NUM) { return ESP_ERR_INVALID_ARG; @@ -49,11 +51,38 @@ esp_err_t spi_bus_init(spi_host_device_t host, int mosi, int miso, int sclk) { if (ret == ESP_OK) { s_bus_active[host] = true; ESP_LOGI(TAG, "Bus host %d initialized", host); + if (host == SPI3_HOST && s_spi3_lock == NULL) { + s_spi3_lock = xSemaphoreCreateBinary(); + if (s_spi3_lock != NULL) { + xSemaphoreGive(s_spi3_lock); + } else { + ESP_LOGE(TAG, "Failed to create SPI3 bus lock"); + } + } } return ret; } +bool spi_bus_lock_take(uint32_t timeout_ms) { + if (s_spi3_lock == NULL) { + return true; + } + return xSemaphoreTake(s_spi3_lock, pdMS_TO_TICKS(timeout_ms)) == pdTRUE; +} + +void spi_bus_lock_give(void) { + if (s_spi3_lock != NULL) { + xSemaphoreGive(s_spi3_lock); + } +} + +void spi_bus_lock_give_from_isr(BaseType_t *hpw) { + if (s_spi3_lock != NULL) { + xSemaphoreGiveFromISR(s_spi3_lock, hpw); + } +} + esp_err_t spi_init(void) { return spi_bus_init(SPI3_HOST, GPIO_SPI_MOSI_PIN, GPIO_SPI_MISO_PIN, GPIO_SPI_SCLK_PIN); } diff --git a/firmware_p4/components/Drivers/sx1262/sx1262_hal.c b/firmware_p4/components/Drivers/sx1262/sx1262_hal.c index a3960c873..59c408f22 100644 --- a/firmware_p4/components/Drivers/sx1262/sx1262_hal.c +++ b/firmware_p4/components/Drivers/sx1262/sx1262_hal.c @@ -25,8 +25,11 @@ #include "freertos/semphr.h" #include "pin_def.h" +#include "spi.h" #include "sx1262_regs.h" +#define SPI3_BUS_LOCK_TIMEOUT_MS 1000 + #define PIN_SCK GPIO_LORA_SCLK_PIN #define PIN_MOSI GPIO_LORA_MOSI_PIN #define PIN_MISO GPIO_LORA_MISO_PIN @@ -48,6 +51,7 @@ typedef struct { SemaphoreHandle_t spi_mutex; portMUX_TYPE critical_mux; bool is_initialized; + bool took_bus_lock; } hal_esp32_ctx_t; static hal_esp32_ctx_t s_ctx = { @@ -55,6 +59,7 @@ static hal_esp32_ctx_t s_ctx = { .spi_mutex = NULL, .critical_mux = portMUX_INITIALIZER_UNLOCKED, .is_initialized = false, + .took_bus_lock = false, }; static int hal_spi_transfer(void *ctx, const uint8_t *tx, uint8_t *rx, size_t len) { @@ -106,12 +111,17 @@ static uint32_t hal_get_tick_ms(void *ctx) { static void hal_lock(void *ctx) { hal_esp32_ctx_t *c = (hal_esp32_ctx_t *)ctx; xSemaphoreTake(c->spi_mutex, portMAX_DELAY); + c->took_bus_lock = spi_bus_lock_take(SPI3_BUS_LOCK_TIMEOUT_MS); spi_device_acquire_bus(c->spi, portMAX_DELAY); } static void hal_unlock(void *ctx) { hal_esp32_ctx_t *c = (hal_esp32_ctx_t *)ctx; spi_device_release_bus(c->spi); + if (c->took_bus_lock) { + spi_bus_lock_give(); + c->took_bus_lock = false; + } xSemaphoreGive(c->spi_mutex); } diff --git a/firmware_p4/components/Service/lvgl/lvgl_glue.c b/firmware_p4/components/Service/lvgl/lvgl_glue.c index 942bace2c..d721989f1 100644 --- a/firmware_p4/components/Service/lvgl/lvgl_glue.c +++ b/firmware_p4/components/Service/lvgl/lvgl_glue.c @@ -16,11 +16,14 @@ #include "esp_lvgl_port.h" #include "esp_log.h" +#include "spi.h" #include "st7789.h" #include "sys_prio.h" static const char *TAG = "LVGL_GLUE"; +#define SPI3_FLUSH_TIMEOUT_MS 50 + #define LVGL_PORT_TASK_PRIORITY SYS_PRIO_RENDER #define LVGL_PORT_TASK_STACK (16 * 1024) #define LVGL_PORT_MAX_SLEEP_MS 500 @@ -35,6 +38,7 @@ static volatile lvgl_glue_strip_cb_t s_capture_cb = NULL; static SemaphoreHandle_t s_trans_done = NULL; static volatile bool s_direct_mode = false; +static volatile bool s_flush_took_bus = false; static bool trans_done_cb(esp_lcd_panel_io_handle_t io, esp_lcd_panel_io_event_data_t *ed, void *ctx) { @@ -46,11 +50,17 @@ static bool trans_done_cb(esp_lcd_panel_io_handle_t io, xSemaphoreGiveFromISR(s_trans_done, &hp); } else { lv_display_flush_ready((lv_display_t *)ctx); + if (s_flush_took_bus) { + s_flush_took_bus = false; + spi_bus_lock_give_from_isr(&hp); + } } return hp == pdTRUE; } static void capture_flush_start_cb(lv_event_t *e) { + s_flush_took_bus = spi_bus_lock_take(SPI3_FLUSH_TIMEOUT_MS); + lvgl_glue_strip_cb_t cb = s_capture_cb; if (cb == NULL) { return; From 43ccd75d54bbe6adeea15aa0c2635d066314db4a Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 14:02:41 -0300 Subject: [PATCH 016/103] fix(mesh): show BLE pairing PIN and gate "linked" on subscribe MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit The companion connect screen flipped to "linked" on the raw BLE link (ble_connected), which happens before pairing — so it claimed connected the moment the PIN would appear, and the PIN was never shown. Add _is_subscribed() to both phone bridges (reads ble_subscribed, set after encryption + the app subscribing) and point the UI-only lora_session_app_connected() at it, leaving the internal _is_connected() untouched. Show the MeshCore pairing PIN on the "Waiting for app" screen (the P4 owns that PIN). Meshtastic's passkey is random on the C5 and not yet bridged, so no PIN is shown there. --- .../LoRa/meshcore/include/meshcore_phone_bridge.h | 10 ++++++++++ .../LoRa/meshcore/meshcore_phone_bridge.c | 12 ++++++++++++ .../meshtastic/include/meshtastic_phone_bridge.h | 7 +++++++ .../LoRa/meshtastic/meshtastic_phone_bridge.c | 12 ++++++++++++ .../Applications/LoRa/session/lora_session.c | 4 ++-- .../Applications/ui/screens/lora/lora_chat_ui.c | 10 ++++++++++ 6 files changed, 53 insertions(+), 2 deletions(-) diff --git a/firmware_p4/components/Applications/LoRa/meshcore/include/meshcore_phone_bridge.h b/firmware_p4/components/Applications/LoRa/meshcore/include/meshcore_phone_bridge.h index 592874304..6906a41bf 100644 --- a/firmware_p4/components/Applications/LoRa/meshcore/include/meshcore_phone_bridge.h +++ b/firmware_p4/components/Applications/LoRa/meshcore/include/meshcore_phone_bridge.h @@ -81,6 +81,16 @@ esp_err_t meshcore_phone_bridge_ble_stop(void); */ bool meshcore_phone_bridge_is_connected(void); +/** + * @brief Whether the connected phone has subscribed to notifications, i.e. the + * companion app is actually paired and ready (not just BLE-linked). + * + * Use this for the "linked" UI state: ble_connected goes true at the raw BLE + * link (before the pairing PIN even shows), while ble_subscribed only goes true + * after encryption + the app subscribing. + */ +bool meshcore_phone_bridge_is_subscribed(void); + #ifdef __cplusplus } #endif diff --git a/firmware_p4/components/Applications/LoRa/meshcore/meshcore_phone_bridge.c b/firmware_p4/components/Applications/LoRa/meshcore/meshcore_phone_bridge.c index bcc906a74..02d74e1b1 100644 --- a/firmware_p4/components/Applications/LoRa/meshcore/meshcore_phone_bridge.c +++ b/firmware_p4/components/Applications/LoRa/meshcore/meshcore_phone_bridge.c @@ -163,6 +163,18 @@ bool meshcore_phone_bridge_is_connected(void) { return is_connected; } +bool meshcore_phone_bridge_is_subscribed(void) { + bool is_subscribed = false; + if (s_status_mutex == NULL) { + return false; + } + if (xSemaphoreTake(s_status_mutex, pdMS_TO_TICKS(BRIDGE_STATUS_TICK_MS)) == pdTRUE) { + is_subscribed = (s_cached_status.ble_subscribed != 0); + xSemaphoreGive(s_status_mutex); + } + return is_subscribed; +} + static void status_task(void *pvParameters) { (void)pvParameters; diff --git a/firmware_p4/components/Applications/LoRa/meshtastic/include/meshtastic_phone_bridge.h b/firmware_p4/components/Applications/LoRa/meshtastic/include/meshtastic_phone_bridge.h index 0dc955158..867c9789d 100644 --- a/firmware_p4/components/Applications/LoRa/meshtastic/include/meshtastic_phone_bridge.h +++ b/firmware_p4/components/Applications/LoRa/meshtastic/include/meshtastic_phone_bridge.h @@ -94,6 +94,13 @@ esp_err_t meshtastic_phone_bridge_wifi_stop(void); */ bool meshtastic_phone_bridge_is_connected(void); +/** + * @brief Whether the phone app is actually paired and ready: BLE subscribed + * (after encryption) or a TCP client is attached — not just BLE-linked. + * Use this for the "linked" UI state. + */ +bool meshtastic_phone_bridge_is_subscribed(void); + #ifdef __cplusplus } #endif diff --git a/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_phone_bridge.c b/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_phone_bridge.c index f2d95b64f..8776d7671 100644 --- a/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_phone_bridge.c +++ b/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_phone_bridge.c @@ -184,6 +184,18 @@ bool meshtastic_phone_bridge_is_connected(void) { return is_connected; } +bool meshtastic_phone_bridge_is_subscribed(void) { + bool is_subscribed = false; + if (s_status_mutex == NULL) { + return false; + } + if (xSemaphoreTake(s_status_mutex, pdMS_TO_TICKS(BRIDGE_NOTIFY_TICK_MS)) == pdTRUE) { + is_subscribed = (s_cached_status.ble_subscribed != 0) || (s_cached_status.tcp_clients != 0); + xSemaphoreGive(s_status_mutex); + } + return is_subscribed; +} + static void notify_task(void *pvParameters) { (void)pvParameters; uint8_t frame_buf[BRIDGE_FROMRADIO_BUF_SIZE]; diff --git a/firmware_p4/components/Applications/LoRa/session/lora_session.c b/firmware_p4/components/Applications/LoRa/session/lora_session.c index 612220388..ec31af3f1 100644 --- a/firmware_p4/components/Applications/LoRa/session/lora_session.c +++ b/firmware_p4/components/Applications/LoRa/session/lora_session.c @@ -219,9 +219,9 @@ void lora_session_on_rx_text(const char *who, const char *text) { bool lora_session_app_connected(void) { switch (s_proto) { case LORA_PROTO_MESHTASTIC: - return meshtastic_phone_bridge_is_connected(); + return meshtastic_phone_bridge_is_subscribed(); case LORA_PROTO_MESHCORE: - return meshcore_phone_bridge_is_connected(); + return meshcore_phone_bridge_is_subscribed(); default: return false; } diff --git a/firmware_p4/components/Applications/ui/screens/lora/lora_chat_ui.c b/firmware_p4/components/Applications/ui/screens/lora/lora_chat_ui.c index e3b63fb32..79e11da9b 100644 --- a/firmware_p4/components/Applications/ui/screens/lora/lora_chat_ui.c +++ b/firmware_p4/components/Applications/ui/screens/lora/lora_chat_ui.c @@ -26,6 +26,7 @@ #include "assets_manager.h" #include "keyboard_ui.h" #include "lora_session.h" +#include "meshcore_phoneapi.h" #include "menu_component_ui.h" #include "meshtastic_presets.h" #include "meshtastic_regions.h" @@ -778,6 +779,15 @@ static void build_connect(void) { lv_obj_set_style_text_font(s_status_label, &lv_font_montserrat_14, 0); lv_obj_align(s_status_label, LV_ALIGN_TOP_MID, 0, 52); + if (proto_for_sel(s_proto) == LORA_PROTO_MESHCORE) { + lv_obj_t *pin_lbl = lv_label_create(s_screen); + lv_label_set_text_fmt(pin_lbl, "Pairing PIN %06lu", + (unsigned long)meshcore_phoneapi_get_pin()); + lv_obj_set_style_text_color(pin_lbl, accent, 0); + lv_obj_set_style_text_font(pin_lbl, &lv_font_montserrat_16, 0); + lv_obj_align(pin_lbl, LV_ALIGN_TOP_MID, 0, 76); + } + lv_anim_t ad; lv_anim_init(&ad); lv_anim_set_var(&ad, s_status_label); From 4e8285b7de682437b6d0d3bc050a34c135868cfb Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 14:07:27 -0300 Subject: [PATCH 017/103] chore(assets): add game menu icons (breakout, flappy, gameboy, pet, snake) --- firmware_p4/assets/icons/game_brk.png | Bin 0 -> 371 bytes firmware_p4/assets/icons/game_flap.png | Bin 0 -> 511 bytes firmware_p4/assets/icons/game_gb.png | Bin 0 -> 2241 bytes firmware_p4/assets/icons/game_pet.png | Bin 0 -> 796 bytes firmware_p4/assets/icons/game_snake.png | Bin 0 -> 401 bytes 5 files changed, 0 insertions(+), 0 deletions(-) create mode 100644 firmware_p4/assets/icons/game_brk.png create mode 100644 firmware_p4/assets/icons/game_flap.png create mode 100644 firmware_p4/assets/icons/game_gb.png create mode 100644 firmware_p4/assets/icons/game_pet.png create mode 100644 firmware_p4/assets/icons/game_snake.png diff --git a/firmware_p4/assets/icons/game_brk.png b/firmware_p4/assets/icons/game_brk.png new file mode 100644 index 0000000000000000000000000000000000000000..5e4a14ddc108d20b1c380bace3405feeb4bea3e2 GIT binary patch literal 371 zcmV-(0gV2MP)? ziQ5?AJto@ZmUzZo(>?B3_%e$lr`<%JPuos4KXB=0U+Z!>i&@;E%jSZo3_$T^? zetL2|vxf0DVW-U(%+$=B8qg-3F>bKT)H(>qj3t&C5neHaX&m+tPxSrX_RNUBs3EPw zhhPYIMsS!5^}tBA8-LNRnR_t|f^fmu3*n&e4Em6VZmO_fJW~L{;X~6~_zMrfV;?HI R;o<-Q002ovPDHLkV1lE~s+#}+ literal 0 HcmV?d00001 diff --git a/firmware_p4/assets/icons/game_flap.png b/firmware_p4/assets/icons/game_flap.png new file mode 100644 index 0000000000000000000000000000000000000000..677683541f689d87b7a95e7546929973811f4324 GIT binary patch literal 511 zcmVo?$5Jm5T;yhHW;)1BGEGjCj3yUiMfr|<|Wo0!fj`IakVNn%U7Uc`-&>)3nCcrs6 zvSP)SWMwAf5TBVdm%QDpXIZ9aVqd&7_QgA6U%WFOUA$N0NDnVFrCgE1Tg zg@HK5MD1iaHnWo4%AjION5nA(thqqv5NmGm6XhA%OK&lSf%t|KtntE>$y~g9@lc#UBOhRR4+|nm=NPcbHKr`c z$X1w*iP!iG53oszZvz_<7w zombX)+CG?%B>hL{5B|fF`6+qNMsW=bCd5y4J~Eh*TVZZQoTBrExhc6pUvW&Fqcd0a zj!Lo76oFi)xWgBv8~;L zb1~tip3Wu4oGZyz40~BF&9y3bN-WTcF<^~J?~G?Fz5}fcj~{$hlL!C+002ovPDHLkV1iKn B;6nfa literal 0 HcmV?d00001 diff --git a/firmware_p4/assets/icons/game_gb.png b/firmware_p4/assets/icons/game_gb.png new file mode 100644 index 0000000000000000000000000000000000000000..106c3c75dd53f42af944b53b7f7322e3503492d1 GIT binary patch literal 2241 zcmV;y2tN0TP)A(1ap|G^NF~RezwMv=R;qF9QY}Qy({1@tFe)cx;mlx{gc-z60FcakkXj1G|UnLX8?&Y07M|5N04ll27HMG&ABuj z|H)brA8BLc5+el!Bpe$=EGFBXgC{1rf+ z0RgRu%8!ajj1~ZsL5PP5@v-~L%*ucX(4W$mJq^x+Rpx;q+e6^y?Vy4V?-DgNWcK*Z+awti8l#OqXk$ZW(b4UiKHlb0?VAW673C zCx9c_Fe}+3>ifr6GgSvSr#9}jd%nxR*$Ji8k=}k#+QTRJH*|yxq(MFxI1U(fG0{sN z?ob|q)_MgKlFVi4hn5+t>Psf$B_Vlepu=@BI!+Zoxo%7@sN9_sMu)c=(pWJN6%gU^ zM6#cMR2kXOLxnmQIl@8K69IWRo=nCAMoCp7n|M-c5|4#~79r{rPrVSiE243?)B9Djreo z;!&t;5*mq4x_Qv3@zG+PrR%n8tujDHK#-U;*zKsh2>}#g1^;gU`q*G&cGWQ92qLXp z)43cVQkB%GN9VmXXi~krsphL%s;Q~pi_(acFr@_qqOxdQ zBlID+lqMe-YQfKtznTgU<*B&qX4vi+6Oq^#7`Dx)K|eYG&Il-tlrGnU5fB1tM9^9d z>S&FEff0x3^iE6j9wNat?v}y=PZd(sGP7AQ@$z!DniDWAjf5Ajz&@8{i7vNXDP5V* zXMq$Y2A$D5qLG0yS;(9-M6uC9=SG>r0@TncN#iBU2=kFXtRoXMI4@>npKN?Lvg#d<*+?E!8C+^NErV#?v>Y7Btv)ngI z>u(pD>zF_MP+jdBuKwxG-uCA-=>tX1)(Yo_tx=i~uDDjNjb(2}uZ0L{W+s>AR9`E= z4W!Lq4zg|3_^=>@ki>sX)bg`rx@QF-eSh1UTNBsC#@@7TM+`*BhTmsZrcnmRt{YE; zN-VQ4ssFWp*VHV36JzNC?$lJej}(gk4h)f>Asa|Cr&m5(KVEq_zdzk0NYind&n7<4 zUH9tH0eUsc z+OPd%!l5RAS+3?=fpYyTDJWwc)1Ep=tCkRvgyS#L4RXW@K^7{9tZ1EW-lr`T; zBs<$eR>l44oV$xXtof?Y5F^0`Qf~6Ia6jWFbvJbMTzf|$`uD5oOpcZW+u%$Q=!URW zSrt!pUUenz@wq!1C8McH=q=A)js|3DBiqV*8RzAF55$TM_5UKjlXE;y9QEd9mu<@o za%uSZTKwYPsfVKjmyf|)$g4lQuw(nm9(rT>4cc6Paq#M6&pm0fmv;vu$?5fP9&-yf z4_<8J_2t)T`^sK=rT+ZxVOWJ^vC+C{lZ-+Xz7Ag89|~43@pKNfau0d=%!{$6Z(JL^ zbI%2%W*kt{01vWG%PkOa%E1^EX5C)eI>AJ>#grw>EHeZdH}UbfP~XD#iE}h}IG1u* z6#Oo@{e^h?QbRxl*I9v5$mIH3iD0KG-NsD^XZp9zyGFj~+$1AlE(R2fBZef({=-E*ug3kj`y&(e+ zg{%rd(%|U~cslPZ8`6ScpbUhN48{k?B@(zVn~J~x+fN_4$#pNx^gaH<3}3}rn+QVrC}}uyuI( P00000NkvXXu0mjfsn0r1 literal 0 HcmV?d00001 diff --git a/firmware_p4/assets/icons/game_pet.png b/firmware_p4/assets/icons/game_pet.png new file mode 100644 index 0000000000000000000000000000000000000000..18f05611bec15b42c6775e734da4d7cbdf16633d GIT binary patch literal 796 zcmV+%1LOROP)VHIk4LOkNoRmO#g`g!Hrn2*JoH8IZHEp#@|HaV8U9G#we6@h7MUtO3{#$ zSg8Sxf(gCGVwD4nJfoQK8~h}%1{3;#bpdlGA>Zh(!ElQ7r8 zOBkwz1=g6eWH`XRc7=)W_t>6do$o2uMqV?lL}ih|09zpEhS>qNSot*^S$3_f>eMED zzDCXkwG=<1E;y2Oi=4ih-BC*53n(EdJImf1$>?&r%Nrx zy*I$7$l27Xb@}{&oFTOdeneexC~1bAk+FSx1I)+Dx4&a%i3(H(I}EQeXKrSp-T7U%msLfQ^8$qcb$HtHj6ytwJ>vrt(3n&ddy7m z5~qSgU#@$3CJ%e$e*`-$UO@`BO2n!n?rG9-1TNXXEI&=V!c1CwAZrKA@#duF5Xg)8PiI%aaMZj^BF+~5~tA)ZURLdVF=3U#o_@I=xbI!3m`@SI7|ab{+vItYe2 z@RT`69|>lv*Rdq}``L>(yb3q&2*X&T*i4mYBsv9fl1EPnjEZykjmu z3n#%+JuqxQ_>CE;eslv4{a`nWVFSVyL(<#wH9<~+^aR~2>y@kI4dFyK*4rM+G00000NkvXXu0mjfO)anW literal 0 HcmV?d00001 From 2f1b81915f8bb72aa0cdc097e0998e610716fdf2 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 14:37:56 -0300 Subject: [PATCH 018/103] refactor(gameboy): move the emulator component under Applications Relocate components/gameboy -> components/Applications/gameboy so the emulator lives with the other apps. It stays its own component (keeps its -O2 -w / ENABLE_SOUND build flags and peanut_gb.h private include); since IDF only auto-discovers components one level under components/, point EXTRA_COMPONENT_DIRS at components/Applications so it is still registered. Only gameboy/ there has a CMakeLists.txt, so no other Applications subdir is affected. --- firmware_p4/CMakeLists.txt | 6 ++++++ .../components/{ => Applications}/gameboy/CMakeLists.txt | 0 .../components/{ => Applications}/gameboy/gb_highboy.c | 0 .../{ => Applications}/gameboy/include/gb_highboy.h | 0 .../components/{ => Applications}/gameboy/minigb_apu.c | 0 .../components/{ => Applications}/gameboy/minigb_apu.h | 0 .../components/{ => Applications}/gameboy/peanut_gb.h | 0 7 files changed, 6 insertions(+) rename firmware_p4/components/{ => Applications}/gameboy/CMakeLists.txt (100%) rename firmware_p4/components/{ => Applications}/gameboy/gb_highboy.c (100%) rename firmware_p4/components/{ => Applications}/gameboy/include/gb_highboy.h (100%) rename firmware_p4/components/{ => Applications}/gameboy/minigb_apu.c (100%) rename firmware_p4/components/{ => Applications}/gameboy/minigb_apu.h (100%) rename firmware_p4/components/{ => Applications}/gameboy/peanut_gb.h (100%) diff --git a/firmware_p4/CMakeLists.txt b/firmware_p4/CMakeLists.txt index b04c7ad86..1332225c5 100644 --- a/firmware_p4/CMakeLists.txt +++ b/firmware_p4/CMakeLists.txt @@ -8,6 +8,12 @@ cmake_minimum_required(VERSION 3.16) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(IDF_TARGET "esp32p4") +# The gameboy emulator lives under components/Applications/ (it belongs with the +# other apps) but is still its own component with its own build flags, so point +# the component manager at that dir to discover it (only gameboy/ there has a +# CMakeLists.txt; the sibling app subdirs are part of the Applications umbrella). +set(EXTRA_COMPONENT_DIRS "${CMAKE_CURRENT_LIST_DIR}/components/Applications") + include($ENV{IDF_PATH}/tools/cmake/project.cmake) # The -O2 perf build (CONFIG_COMPILER_OPTIMIZATION_PERF) makes GCC run the flow diff --git a/firmware_p4/components/gameboy/CMakeLists.txt b/firmware_p4/components/Applications/gameboy/CMakeLists.txt similarity index 100% rename from firmware_p4/components/gameboy/CMakeLists.txt rename to firmware_p4/components/Applications/gameboy/CMakeLists.txt diff --git a/firmware_p4/components/gameboy/gb_highboy.c b/firmware_p4/components/Applications/gameboy/gb_highboy.c similarity index 100% rename from firmware_p4/components/gameboy/gb_highboy.c rename to firmware_p4/components/Applications/gameboy/gb_highboy.c diff --git a/firmware_p4/components/gameboy/include/gb_highboy.h b/firmware_p4/components/Applications/gameboy/include/gb_highboy.h similarity index 100% rename from firmware_p4/components/gameboy/include/gb_highboy.h rename to firmware_p4/components/Applications/gameboy/include/gb_highboy.h diff --git a/firmware_p4/components/gameboy/minigb_apu.c b/firmware_p4/components/Applications/gameboy/minigb_apu.c similarity index 100% rename from firmware_p4/components/gameboy/minigb_apu.c rename to firmware_p4/components/Applications/gameboy/minigb_apu.c diff --git a/firmware_p4/components/gameboy/minigb_apu.h b/firmware_p4/components/Applications/gameboy/minigb_apu.h similarity index 100% rename from firmware_p4/components/gameboy/minigb_apu.h rename to firmware_p4/components/Applications/gameboy/minigb_apu.h diff --git a/firmware_p4/components/gameboy/peanut_gb.h b/firmware_p4/components/Applications/gameboy/peanut_gb.h similarity index 100% rename from firmware_p4/components/gameboy/peanut_gb.h rename to firmware_p4/components/Applications/gameboy/peanut_gb.h From 56472979eeee399061067c6cf3a4e0f590ad0d08 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Tue, 18 Aug 2026 23:59:30 -0300 Subject: [PATCH 019/103] fix(storage): create parent dir for SD writes, not the file path --- .../Service/storage_api/storage_write.c | 48 +++++++++++++++---- 1 file changed, 40 insertions(+), 8 deletions(-) diff --git a/firmware_p4/components/Service/storage_api/storage_write.c b/firmware_p4/components/Service/storage_api/storage_write.c index d119987de..667f872d6 100644 --- a/firmware_p4/components/Service/storage_api/storage_write.c +++ b/firmware_p4/components/Service/storage_api/storage_write.c @@ -19,6 +19,8 @@ #include #include #include +#include +#include #include "esp_log.h" @@ -31,6 +33,36 @@ static const char *TAG = "STORAGE_WRITE"; #define FORMAT_BUF_SIZE 512 +static esp_err_t ensure_parent_dir(const char *full_path) { + char dir[VFS_MAX_PATH]; + strncpy(dir, full_path, sizeof(dir) - 1); + dir[sizeof(dir) - 1] = '\0'; + + char *slash = strrchr(dir, '/'); + if (slash == NULL || slash == dir) { + return ESP_OK; + } + *slash = '\0'; + + esp_err_t ret = storage_mkdir_recursive(dir); + if (ret != ESP_OK) { + return ret; + } + + // An earlier bug created directories where files should be. Remove such a + // stale directory so the write can open the path as a file. + struct stat st; + if (stat(full_path, &st) == 0 && S_ISDIR(st.st_mode)) { + ESP_LOGW(TAG, "Removing stale directory in place of file: %s", full_path); + if (rmdir(full_path) != 0) { + ESP_LOGE(TAG, "Failed to remove stale directory: %s", full_path); + return ESP_FAIL; + } + } + + return ESP_OK; +} + esp_err_t storage_write_string(const char *path, const char *data) { if (!storage_is_mounted() || path == NULL || data == NULL) { return !storage_is_mounted() ? ESP_ERR_INVALID_STATE : ESP_ERR_INVALID_ARG; @@ -39,7 +71,7 @@ esp_err_t storage_write_string(const char *path, const char *data) { char full_path[VFS_MAX_PATH]; storage_resolve_path(path, full_path, sizeof(full_path)); - esp_err_t ret = storage_mkdir_recursive(full_path); + esp_err_t ret = ensure_parent_dir(full_path); if (ret != ESP_OK) { return ret; } @@ -60,7 +92,7 @@ esp_err_t storage_append_string(const char *path, const char *data) { char full_path[VFS_MAX_PATH]; storage_resolve_path(path, full_path, sizeof(full_path)); - esp_err_t ret = storage_mkdir_recursive(full_path); + esp_err_t ret = ensure_parent_dir(full_path); if (ret != ESP_OK) { return ret; } @@ -81,7 +113,7 @@ esp_err_t storage_write_binary(const char *path, const void *data, size_t size) char full_path[VFS_MAX_PATH]; storage_resolve_path(path, full_path, sizeof(full_path)); - esp_err_t ret = storage_mkdir_recursive(full_path); + esp_err_t ret = ensure_parent_dir(full_path); if (ret != ESP_OK) { return ret; } @@ -102,7 +134,7 @@ esp_err_t storage_append_binary(const char *path, const void *data, size_t size) char full_path[VFS_MAX_PATH]; storage_resolve_path(path, full_path, sizeof(full_path)); - esp_err_t ret = storage_mkdir_recursive(full_path); + esp_err_t ret = ensure_parent_dir(full_path); if (ret != ESP_OK) { return ret; } @@ -143,7 +175,7 @@ esp_err_t storage_write_formatted(const char *path, const char *format, ...) { char full_path[VFS_MAX_PATH]; storage_resolve_path(path, full_path, sizeof(full_path)); - esp_err_t ret = storage_mkdir_recursive(full_path); + esp_err_t ret = ensure_parent_dir(full_path); if (ret != ESP_OK) { return ret; } @@ -179,7 +211,7 @@ esp_err_t storage_append_formatted(const char *path, const char *format, ...) { char full_path[VFS_MAX_PATH]; storage_resolve_path(path, full_path, sizeof(full_path)); - esp_err_t ret = storage_mkdir_recursive(full_path); + esp_err_t ret = ensure_parent_dir(full_path); if (ret != ESP_OK) { return ret; } @@ -235,7 +267,7 @@ esp_err_t storage_write_csv_row(const char *path, const char **columns, size_t n char full_path[VFS_MAX_PATH]; storage_resolve_path(path, full_path, sizeof(full_path)); - esp_err_t ret = storage_mkdir_recursive(full_path); + esp_err_t ret = ensure_parent_dir(full_path); if (ret != ESP_OK) { return ret; } @@ -265,7 +297,7 @@ esp_err_t storage_append_csv_row(const char *path, const char **columns, size_t char full_path[VFS_MAX_PATH]; storage_resolve_path(path, full_path, sizeof(full_path)); - esp_err_t ret = storage_mkdir_recursive(full_path); + esp_err_t ret = ensure_parent_dir(full_path); if (ret != ESP_OK) { return ret; } From a9bac7fbc2929c3936e8dd8cfeb074506bfe980a Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Tue, 18 Aug 2026 23:59:36 -0300 Subject: [PATCH 020/103] refactor(wifi): route ap_scanner through wifi_service for clean SSIDs --- .../ui/screens/wifi/wifi_evil_twin_ui.c | 3 +- .../components/Applications/wifi/ap_scanner.c | 70 ++++++------------- 2 files changed, 24 insertions(+), 49 deletions(-) diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_evil_twin_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_evil_twin_ui.c index af0c2334f..7e32221e7 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_evil_twin_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_evil_twin_ui.c @@ -169,7 +169,8 @@ static void ap_scan_task(void *arg) { wifi_ap_record_t *recs = ap_scanner_get_results(&count); if (recs != NULL) { for (uint16_t i = 0; i < count && n < ET_AP_MAX; i++) { - if (recs[i].ssid[0] == '\0') + // Cloning is by SSID, so skip hidden networks (masked as a placeholder). + if (recs[i].ssid[0] == '\0' || strcmp((const char *)recs[i].ssid, "[rede oculta]") == 0) continue; strncpy(s_ap_ssids[n], (const char *)recs[i].ssid, ET_SSID_LEN - 1); s_ap_ssids[n][ET_SSID_LEN - 1] = '\0'; diff --git a/firmware_p4/components/Applications/wifi/ap_scanner.c b/firmware_p4/components/Applications/wifi/ap_scanner.c index f3e33ac10..37bc34782 100644 --- a/firmware_p4/components/Applications/wifi/ap_scanner.c +++ b/firmware_p4/components/Applications/wifi/ap_scanner.c @@ -23,9 +23,9 @@ #include "cJSON.h" #include "led_control.h" -#include "spi_bridge.h" #include "storage_write.h" #include "tos_storage_paths.h" +#include "wifi_service.h" static const char *TAG = "AP_SCANNER"; @@ -38,73 +38,47 @@ static uint16_t s_cached_count = 0; static bool s_is_scan_ready = false; static wifi_ap_record_t s_empty_record; -static bool fetch_results(void) { - spi_header_t resp; - uint8_t payload[2]; - uint16_t magic_count = SPI_DATA_INDEX_COUNT; +bool ap_scanner_start(void) { + ap_scanner_free_results(); - if (spi_bridge_send_command( - SPI_ID_SYSTEM_DATA, (uint8_t *)&magic_count, 2, &resp, payload, sizeof(payload), 1000) != - ESP_OK) { + wifi_service_start(); + if (wifi_service_scan() != ESP_OK) { + ESP_LOGW(TAG, "AP scan failed"); + led_signal_error(); return false; } - uint16_t count = 0; - memcpy(&count, payload, 2); - - if (s_cached_results != NULL) { - free(s_cached_results); - s_cached_results = NULL; - } - s_cached_count = 0; - + uint16_t count = wifi_service_get_ap_count(); if (count == 0) { s_is_scan_ready = true; + led_signal_warning(); return true; } s_cached_results = (wifi_ap_record_t *)malloc(count * sizeof(wifi_ap_record_t)); if (s_cached_results == NULL) { ESP_LOGW(TAG, "Failed to allocate AP results buffer"); + led_signal_error(); return false; } + uint16_t n = 0; for (uint16_t i = 0; i < count; i++) { - if (spi_bridge_send_command(SPI_ID_SYSTEM_DATA, - (uint8_t *)&i, - 2, - &resp, - (uint8_t *)&s_cached_results[i], - sizeof(s_cached_results[i]), - 1000) != ESP_OK) { - free(s_cached_results); - s_cached_results = NULL; - return false; - } + // wifi_service sanitizes each record (printable SSID, hidden -> placeholder) + // and returns a pointer to a shared buffer, so copy it into our cache. + wifi_ap_record_t *rec = wifi_service_get_ap_record(i); + if (rec == NULL) + continue; + s_cached_results[n++] = *rec; } - s_cached_count = count; + s_cached_count = n; s_is_scan_ready = true; - return true; -} -bool ap_scanner_start(void) { - ap_scanner_free_results(); - esp_err_t err = spi_bridge_run_scan(SPI_ID_WIFI_APP_SCAN_AP, SPI_ID_WIFI_SCAN_STATUS, NULL, 0); - if (err != ESP_OK) { - ESP_LOGW(TAG, "AP scan failed over SPI"); - led_signal_error(); - return false; - } - bool ok = fetch_results(); - if (ok) { - // Auto-persist to SD when a card is present; a no-op otherwise (SD-only). - ap_scanner_save_results_to_sd_card(); - s_cached_count > 0 ? led_signal_info() : led_signal_warning(); - } else { - led_signal_error(); - } - return ok; + // Auto-persist to SD when a card is present; a no-op otherwise (SD-only). + ap_scanner_save_results_to_sd_card(); + s_cached_count > 0 ? led_signal_info() : led_signal_warning(); + return true; } wifi_ap_record_t *ap_scanner_get_results(uint16_t *out_count) { From f1511d822b83c7bc9c3fd276c105f7e957af6043 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Tue, 18 Aug 2026 23:59:42 -0300 Subject: [PATCH 021/103] feat(sniffer): save fragmented pcap with radiotap to SD card --- .../Applications/wifi/wifi_sniffer.c | 41 ++-- .../Service/spi_bridge/include/spi_protocol.h | 30 ++- .../wifi/include/pcap_serializer.h | 9 +- .../Applications/wifi/wifi_sniffer.c | 182 +++++++++++++++++- .../Service/spi_bridge/include/spi_protocol.h | 30 ++- 5 files changed, 258 insertions(+), 34 deletions(-) diff --git a/firmware_c5/components/Applications/wifi/wifi_sniffer.c b/firmware_c5/components/Applications/wifi/wifi_sniffer.c index ad3b4b9b4..3d2b6216b 100644 --- a/firmware_c5/components/Applications/wifi/wifi_sniffer.c +++ b/firmware_c5/components/Applications/wifi/wifi_sniffer.c @@ -793,19 +793,36 @@ static void sniffer_callback(void *buf, wifi_promiscuous_pkt_type_t type) { } if (is_save && spi_bridge_stream_is_enabled(SPI_ID_WIFI_APP_SNIFFER)) { + uint16_t total_len = ppkt->rx_ctrl.sig_len; + if (total_len > SPI_WIFI_SNIFFER_FRAME_MAX) + total_len = SPI_WIFI_SNIFFER_FRAME_MAX; // bounded by the P4 reassembly buffer + uint8_t stream_buf[SPI_MAX_PAYLOAD]; - spi_wifi_sniffer_frame_t *stream = (spi_wifi_sniffer_frame_t *)stream_buf; - uint16_t raw_len = ppkt->rx_ctrl.sig_len; - if (raw_len > SPI_WIFI_SNIFFER_MAX_DATA) - raw_len = SPI_WIFI_SNIFFER_MAX_DATA; - stream->rssi = ppkt->rx_ctrl.rssi; - stream->channel = ppkt->rx_ctrl.channel; - stream->len = (uint8_t)raw_len; - memcpy(stream->data, ppkt->payload, raw_len); - if (s_session_id != SPI_SESSION_INVALID_ID) { - session_manager_try_emit(s_session_id, stream_buf, (uint8_t)(raw_len + 3)); - } else { - spi_bridge_stream_push(SPI_ID_WIFI_APP_SNIFFER, stream_buf, (uint8_t)(raw_len + 3)); + spi_wifi_sniffer_frame_t *frag = (spi_wifi_sniffer_frame_t *)stream_buf; + + // Split the frame into ordered fragments; the P4 reassembles them. A frame + // that fits in one transfer is just a single fragment (offset 0, no MORE). + for (uint16_t off = 0; off < total_len;) { + uint16_t chunk = total_len - off; + if (chunk > SPI_WIFI_SNIFFER_FRAG_DATA_MAX) + chunk = SPI_WIFI_SNIFFER_FRAG_DATA_MAX; + + frag->rssi = ppkt->rx_ctrl.rssi; + frag->channel = ppkt->rx_ctrl.channel; + frag->total_len = total_len; + frag->frag_off = off; + frag->frag_len = (uint8_t)chunk; + frag->flags = ((off + chunk) < total_len) ? SPI_WIFI_SNIFFER_FRAG_MORE : 0; + memcpy(frag->data, ppkt->payload + off, chunk); + + uint8_t buf_len = (uint8_t)(sizeof(spi_wifi_sniffer_frame_t) + chunk); + bool ok = (s_session_id != SPI_SESSION_INVALID_ID) + ? (session_manager_try_emit(s_session_id, stream_buf, buf_len) == ESP_OK) + : spi_bridge_stream_push(SPI_ID_WIFI_APP_SNIFFER, stream_buf, buf_len); + if (!ok) + break; // backpressure: drop the rest; the P4 discards the partial frame + + off += chunk; } } diff --git a/firmware_c5/components/Service/spi_bridge/include/spi_protocol.h b/firmware_c5/components/Service/spi_bridge/include/spi_protocol.h index 707abeab0..02c4c350e 100644 --- a/firmware_c5/components/Service/spi_bridge/include/spi_protocol.h +++ b/firmware_c5/components/Service/spi_bridge/include/spi_protocol.h @@ -575,15 +575,37 @@ typedef struct { } __attribute__((packed)) spi_wifi_scan_record_t; /** - * @brief WiFi sniffer stream frame. + * @brief WiFi sniffer stream fragment. + * + * A single 802.11 frame can exceed one SPI transfer (payload capped at + * SPI_MAX_PAYLOAD), so the C5 splits large frames into ordered fragments and + * the P4 reassembles them. rssi/channel/total_len are repeated on every + * fragment so the P4 can validate cheaply. frag_off is this fragment's byte + * offset within the full frame; SPI_WIFI_SNIFFER_FRAG_MORE is set on every + * fragment except the last. A frame that fits in one transfer is a single + * fragment with frag_off == 0 and the MORE bit clear. + * + * Max data bytes per fragment = SPI_MAX_PAYLOAD - sizeof(spi_stream_meta_t) + * - sizeof(spi_wifi_sniffer_frame_t). */ typedef struct { - int8_t rssi; - uint8_t channel; - uint8_t len; + int8_t rssi; // dBm signal of the frame + uint8_t channel; // primary channel + uint16_t total_len; // full 802.11 frame length across all fragments + uint16_t frag_off; // byte offset of this fragment within the frame + uint8_t frag_len; // data bytes carried by this fragment + uint8_t flags; // SPI_WIFI_SNIFFER_FRAG_* bits uint8_t data[0]; } __attribute__((packed)) spi_wifi_sniffer_frame_t; +#define SPI_WIFI_SNIFFER_FRAG_MORE 0x01u // more fragments follow this one +#define SPI_WIFI_SNIFFER_FRAME_MAX 2346 // max reassembled 802.11 frame (bytes) + +// Max frame bytes carried by a single fragment (transfer cap minus the stream +// meta prepended by the session layer minus this fragment header). +#define SPI_WIFI_SNIFFER_FRAG_DATA_MAX \ + ((int)(SPI_MAX_PAYLOAD - sizeof(spi_stream_meta_t) - sizeof(spi_wifi_sniffer_frame_t))) + /** * @brief BLE sniffer stream frame. */ diff --git a/firmware_p4/components/Applications/wifi/include/pcap_serializer.h b/firmware_p4/components/Applications/wifi/include/pcap_serializer.h index a568b21f3..cd6a68d37 100644 --- a/firmware_p4/components/Applications/wifi/include/pcap_serializer.h +++ b/firmware_p4/components/Applications/wifi/include/pcap_serializer.h @@ -22,10 +22,11 @@ extern "C" { #include -#define PCAP_MAGIC_NUMBER 0xa1b2c3d4 -#define PCAP_VERSION_MAJOR 2 -#define PCAP_VERSION_MINOR 4 -#define PCAP_LINK_TYPE_802_11 105 +#define PCAP_MAGIC_NUMBER 0xa1b2c3d4 +#define PCAP_VERSION_MAJOR 2 +#define PCAP_VERSION_MINOR 4 +#define PCAP_LINK_TYPE_802_11 105 +#define PCAP_LINK_TYPE_802_11_RADIOTAP 127 /** * @brief PCAP global file header. diff --git a/firmware_p4/components/Applications/wifi/wifi_sniffer.c b/firmware_p4/components/Applications/wifi/wifi_sniffer.c index ec41382fb..4bd18afe5 100644 --- a/firmware_p4/components/Applications/wifi/wifi_sniffer.c +++ b/firmware_p4/components/Applications/wifi/wifi_sniffer.c @@ -18,41 +18,174 @@ #include "led_control.h" #include +#include #include "esp_log.h" +#include "pcap_serializer.h" #include "spi_bridge.h" #include "spi_session.h" +#include "storage_mkdir.h" #include "storage_stream.h" +#include "tos_loot.h" +#include "tos_storage_paths.h" static const char *TAG = "WIFI_SNIFFER"; -#define WIFI_SNIFFER_MIN_FRAME_LEN 3 +#define WIFI_SNIFFER_PATH_MAX 256 +#define WIFI_SNIFFER_PCAP_SNAPLEN 65535 + +#define RADIOTAP_PRESENT_FLAGS (1u << 1) +#define RADIOTAP_PRESENT_CHANNEL (1u << 3) +#define RADIOTAP_PRESENT_DBM (1u << 5) +#define RADIOTAP_F_FCS 0x10 // frame data ends with a 4-byte FCS +#define RADIOTAP_CHAN_2GHZ 0x0080 // channel flags: 2 GHz band +#define RADIOTAP_CHAN_5GHZ 0x0100 // channel flags: 5 GHz band + +// Little-endian on-wire layout; pad_channel keeps chan_freq 2-byte aligned. +typedef struct { + uint8_t version; + uint8_t pad; + uint16_t len; + uint32_t present; + uint8_t flags; + uint8_t pad_channel; + uint16_t chan_freq; + uint16_t chan_flags; + int8_t dbm_signal; +} __attribute__((packed)) radiotap_header_t; + +static uint16_t channel_to_freq(uint8_t channel) { + if (channel >= 1 && channel <= 13) + return 2407 + channel * 5; + if (channel == 14) + return 2484; + if (channel >= 32) + return 5000 + channel * 5; + return 0; +} static spi_sniffer_stats_t s_cached_stats; static wifi_sniffer_cb_t s_stream_cb = NULL; static storage_stream_t s_capture_stream = NULL; static uint32_t s_session_id = SPI_SESSION_INVALID_ID; +static uint8_t s_reasm_buf[SPI_WIFI_SNIFFER_FRAME_MAX]; +static uint16_t s_reasm_total; +static uint16_t s_reasm_have; +static int8_t s_reasm_rssi; +static uint8_t s_reasm_channel; +static bool s_reasm_active; + bool wifi_sniffer_stop_capture(void); -static void session_stream_cb(const uint8_t *payload, uint8_t len) { - if (payload == NULL || len < WIFI_SNIFFER_MIN_FRAME_LEN) - return; - const spi_wifi_sniffer_frame_t *frame = (const spi_wifi_sniffer_frame_t *)payload; - uint16_t data_len = frame->len; - if (data_len > (len - WIFI_SNIFFER_MIN_FRAME_LEN)) - data_len = (len - WIFI_SNIFFER_MIN_FRAME_LEN); +static void ensure_parent_dir(const char *path) { + char dir[WIFI_SNIFFER_PATH_MAX]; + strncpy(dir, path, sizeof(dir) - 1); + dir[sizeof(dir) - 1] = '\0'; + char *slash = strrchr(dir, '/'); + if (slash != NULL && slash != dir) { + *slash = '\0'; + storage_mkdir_recursive(dir); + } +} + +static void +auto_capture_path(wifi_sniffer_type_t type, bool monitor_mode, char *out, size_t out_size) { + const char *dir = TOS_PATH_WIFI_LOOT_PCAPS; + const char *prefix = "raw"; + if (monitor_mode || type == WIFI_SNIFFER_TYPE_EAPOL) { + dir = TOS_PATH_WIFI_LOOT_HS; + prefix = "handshake"; + } else if (type == WIFI_SNIFFER_TYPE_BEACON) { + prefix = "beacon"; + } else if (type == WIFI_SNIFFER_TYPE_PROBE) { + prefix = "probe"; + } else if (type == WIFI_SNIFFER_TYPE_PMKID) { + prefix = "pmkid"; + } + tos_loot_generate_path(dir, prefix, "pcap", out, out_size, NULL, 0); +} + +static void reasm_reset(void) { + s_reasm_active = false; + s_reasm_total = 0; + s_reasm_have = 0; +} +static void emit_frame(const uint8_t *data, uint16_t len, int8_t rssi, uint8_t channel) { if (s_capture_stream != NULL) { - storage_stream_write(s_capture_stream, frame->data, data_len); + const radiotap_header_t radiotap = { + .version = 0, + .pad = 0, + .len = sizeof(radiotap_header_t), + .present = RADIOTAP_PRESENT_FLAGS | RADIOTAP_PRESENT_CHANNEL | RADIOTAP_PRESENT_DBM, + .flags = RADIOTAP_F_FCS, + .pad_channel = 0, + .chan_freq = channel_to_freq(channel), + .chan_flags = (channel >= 32) ? RADIOTAP_CHAN_5GHZ : RADIOTAP_CHAN_2GHZ, + .dbm_signal = rssi, + }; + + struct timeval tv; + gettimeofday(&tv, NULL); + uint32_t total_len = sizeof(radiotap) + len; + const pcap_packet_header_t rec = { + .ts_sec = (uint32_t)tv.tv_sec, + .ts_usec = (uint32_t)tv.tv_usec, + .incl_len = total_len, + .orig_len = total_len, + }; + storage_stream_write(s_capture_stream, &rec, sizeof(rec)); + storage_stream_write(s_capture_stream, &radiotap, sizeof(radiotap)); + storage_stream_write(s_capture_stream, data, len); } if (s_stream_cb != NULL) { - s_stream_cb(frame->data, data_len, frame->rssi, frame->channel); + s_stream_cb(data, len, rssi, channel); } } +static void session_stream_cb(const uint8_t *payload, uint8_t len) { + if (payload == NULL || len < sizeof(spi_wifi_sniffer_frame_t)) + return; + const spi_wifi_sniffer_frame_t *frag = (const spi_wifi_sniffer_frame_t *)payload; + + uint16_t avail = (uint16_t)(len - sizeof(spi_wifi_sniffer_frame_t)); + uint16_t frag_len = frag->frag_len; + if (frag_len > avail) + frag_len = avail; // never read past what actually arrived + + if (frag->frag_off == 0) { + // Start of a new frame; abandon any partial one still in the buffer. + reasm_reset(); + if (frag->total_len == 0 || frag->total_len > sizeof(s_reasm_buf)) + return; // implausible or larger than we can hold + s_reasm_total = frag->total_len; + s_reasm_rssi = frag->rssi; + s_reasm_channel = frag->channel; + s_reasm_active = true; + } else if (!s_reasm_active || frag->total_len != s_reasm_total || + frag->frag_off != s_reasm_have) { + reasm_reset(); // gap, reorder, or mismatched frame: unrecoverable + return; + } + + if ((uint32_t)s_reasm_have + frag_len > s_reasm_total) { + reasm_reset(); // more data than the frame declared + return; + } + memcpy(s_reasm_buf + s_reasm_have, frag->data, frag_len); + s_reasm_have = (uint16_t)(s_reasm_have + frag_len); + + if (frag->flags & SPI_WIFI_SNIFFER_FRAG_MORE) + return; // wait for the rest + + if (s_reasm_have == s_reasm_total) + emit_frame(s_reasm_buf, s_reasm_have, s_reasm_rssi, s_reasm_channel); + reasm_reset(); +} + static void session_lost_cb(uint32_t session_id, spi_id_t op_id) { (void)op_id; if (session_id == s_session_id) { @@ -82,9 +215,23 @@ start_internal(wifi_sniffer_type_t type, uint8_t channel, bool monitor_mode, wif payload[2] = monitor_mode ? 1 : 0; memset(&s_cached_stats, 0, sizeof(s_cached_stats)); s_stream_cb = cb; + reasm_reset(); + + // Ask the C5 for the whole frame; fragments are reassembled on our side. + wifi_sniffer_set_snaplen(SPI_WIFI_SNIFFER_FRAME_MAX); + + // Persist to the SD card by default, whoever starts the sniffer (UI, console, + // ...). A caller that already opened an explicit file keeps its own path. + if (s_capture_stream == NULL) { + char path[WIFI_SNIFFER_PATH_MAX]; + auto_capture_path(type, monitor_mode, path, sizeof(path)); + wifi_sniffer_start_capture(path); + } + s_session_id = spi_session_start( SPI_ID_WIFI_APP_SNIFFER, payload, sizeof(payload), session_stream_cb, session_lost_cb); if (s_session_id == SPI_SESSION_INVALID_ID) { + wifi_sniffer_stop_capture(); s_stream_cb = NULL; led_signal_error(); return false; @@ -111,6 +258,7 @@ void wifi_sniffer_stop(void) { s_session_id = SPI_SESSION_INVALID_ID; } wifi_sniffer_stop_capture(); + reasm_reset(); s_stream_cb = NULL; } @@ -142,11 +290,25 @@ bool wifi_sniffer_start_capture(const char *path) { storage_stream_close(s_capture_stream); s_capture_stream = NULL; } + ensure_parent_dir(path); + s_capture_stream = storage_stream_open(path, "wb"); if (s_capture_stream == NULL) { ESP_LOGE(TAG, "Failed to open capture file: %s", path); return false; } + + const pcap_global_header_t header = { + .magic_number = PCAP_MAGIC_NUMBER, + .version_major = PCAP_VERSION_MAJOR, + .version_minor = PCAP_VERSION_MINOR, + .thiszone = 0, + .sigfigs = 0, + .snaplen = WIFI_SNIFFER_PCAP_SNAPLEN, + .network = PCAP_LINK_TYPE_802_11_RADIOTAP, + }; + storage_stream_write(s_capture_stream, &header, sizeof(header)); + ESP_LOGI(TAG, "Capture started: %s", path); return true; } diff --git a/firmware_p4/components/Service/spi_bridge/include/spi_protocol.h b/firmware_p4/components/Service/spi_bridge/include/spi_protocol.h index 707abeab0..02c4c350e 100644 --- a/firmware_p4/components/Service/spi_bridge/include/spi_protocol.h +++ b/firmware_p4/components/Service/spi_bridge/include/spi_protocol.h @@ -575,15 +575,37 @@ typedef struct { } __attribute__((packed)) spi_wifi_scan_record_t; /** - * @brief WiFi sniffer stream frame. + * @brief WiFi sniffer stream fragment. + * + * A single 802.11 frame can exceed one SPI transfer (payload capped at + * SPI_MAX_PAYLOAD), so the C5 splits large frames into ordered fragments and + * the P4 reassembles them. rssi/channel/total_len are repeated on every + * fragment so the P4 can validate cheaply. frag_off is this fragment's byte + * offset within the full frame; SPI_WIFI_SNIFFER_FRAG_MORE is set on every + * fragment except the last. A frame that fits in one transfer is a single + * fragment with frag_off == 0 and the MORE bit clear. + * + * Max data bytes per fragment = SPI_MAX_PAYLOAD - sizeof(spi_stream_meta_t) + * - sizeof(spi_wifi_sniffer_frame_t). */ typedef struct { - int8_t rssi; - uint8_t channel; - uint8_t len; + int8_t rssi; // dBm signal of the frame + uint8_t channel; // primary channel + uint16_t total_len; // full 802.11 frame length across all fragments + uint16_t frag_off; // byte offset of this fragment within the frame + uint8_t frag_len; // data bytes carried by this fragment + uint8_t flags; // SPI_WIFI_SNIFFER_FRAG_* bits uint8_t data[0]; } __attribute__((packed)) spi_wifi_sniffer_frame_t; +#define SPI_WIFI_SNIFFER_FRAG_MORE 0x01u // more fragments follow this one +#define SPI_WIFI_SNIFFER_FRAME_MAX 2346 // max reassembled 802.11 frame (bytes) + +// Max frame bytes carried by a single fragment (transfer cap minus the stream +// meta prepended by the session layer minus this fragment header). +#define SPI_WIFI_SNIFFER_FRAG_DATA_MAX \ + ((int)(SPI_MAX_PAYLOAD - sizeof(spi_stream_meta_t) - sizeof(spi_wifi_sniffer_frame_t))) + /** * @brief BLE sniffer stream frame. */ From 130533a104408d837fea8ee84bc6061bbdc9564f Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:42:45 -0300 Subject: [PATCH 022/103] fix(bridge): give the BLE lifecycle commands enough SPI timeout --- .../Service/spi_bridge/include/spi_timeouts.h | 8 ++++++++ .../components/Service/spi_bridge/spi_bridge.c | 12 +++++++++++- 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/firmware_p4/components/Service/spi_bridge/include/spi_timeouts.h b/firmware_p4/components/Service/spi_bridge/include/spi_timeouts.h index bd04f3279..c14c516df 100644 --- a/firmware_p4/components/Service/spi_bridge/include/spi_timeouts.h +++ b/firmware_p4/components/Service/spi_bridge/include/spi_timeouts.h @@ -35,6 +35,14 @@ extern "C" { // ~30 s. Keep the master's wait above that or the command times out mid-scan and // the late response desyncs the bridge. #define SPI_TIMEOUT_WIFI_MS 40000 +// The *_BLE_INIT / *_BLE_STOP commands run the full NimBLE lifecycle on the C5 +// (tear down the other GATT services via a blocking nimble_port_stop, then +// nimble_port_init + service add) synchronously on the single SPI bridge task of +// a single-core chip, so bring-up regularly overruns the 1 s default. When it +// does, the late response desyncs the bridge and the P4 keeps retrying (which +// tears the just-started service back down). Give these commands enough headroom +// to complete on the first try. +#define SPI_TIMEOUT_BLE_LIFECYCLE_MS 5000 #ifdef __cplusplus } diff --git a/firmware_p4/components/Service/spi_bridge/spi_bridge.c b/firmware_p4/components/Service/spi_bridge/spi_bridge.c index aa713016c..601d07baf 100644 --- a/firmware_p4/components/Service/spi_bridge/spi_bridge.c +++ b/firmware_p4/components/Service/spi_bridge/spi_bridge.c @@ -254,7 +254,17 @@ uint32_t spi_bridge_get_timeout(spi_id_t id) { if (id >= SPI_ID_WIFI_SCAN && id <= SPI_ID_WIFI_APP_PROBE_MON) { return SPI_TIMEOUT_WIFI_MS; } - return SPI_TIMEOUT_DEFAULT_MS; + switch (id) { + case SPI_ID_MESH_BLE_INIT: + case SPI_ID_MESH_BLE_STOP: + case SPI_ID_MCORE_BLE_INIT: + case SPI_ID_MCORE_BLE_STOP: + case SPI_ID_HOST_BLE_INIT: + case SPI_ID_HOST_BLE_STOP: + return SPI_TIMEOUT_BLE_LIFECYCLE_MS; + default: + return SPI_TIMEOUT_DEFAULT_MS; + } } #define SCAN_STATUS_POLL_MS 250 From 5b0546747aa502b8e7639c838ca0a3a93f9e7c7a Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:42:45 -0300 Subject: [PATCH 023/103] fix(radio): harden SX1262 RX against errored packets and flaky SPI3 --- .../components/Applications/LoRa/meshcore/meshcore_router.c | 2 ++ .../Applications/LoRa/meshtastic/meshtastic_mesh.c | 3 +++ firmware_p4/components/Drivers/sx1262/sx1262_hal.c | 2 +- firmware_p4/components/Drivers/sx1262/sx1262_irq.c | 6 ++++-- 4 files changed, 10 insertions(+), 3 deletions(-) diff --git a/firmware_p4/components/Applications/LoRa/meshcore/meshcore_router.c b/firmware_p4/components/Applications/LoRa/meshcore/meshcore_router.c index 4ea34f170..1da437a6f 100644 --- a/firmware_p4/components/Applications/LoRa/meshcore/meshcore_router.c +++ b/firmware_p4/components/Applications/LoRa/meshcore/meshcore_router.c @@ -658,6 +658,8 @@ static void on_rx_done(const sx1262_packet_t *pkt, void *ctx) { (void)ctx; if (pkt == NULL) return; + ESP_LOGI(TAG, "RX diag: %u bytes rssi=%d snr=%d crc_err=%d hdr_err=%d", pkt->len, + pkt->rssi_pkt_dbm, pkt->snr_pkt_db, (int)pkt->has_crc_error, (int)pkt->has_header_error); if (pkt->has_crc_error || pkt->has_header_error) { ESP_LOGD(TAG, "RX HW error -- skip"); return; diff --git a/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_mesh.c b/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_mesh.c index 79f948bf6..75318b933 100644 --- a/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_mesh.c +++ b/firmware_p4/components/Applications/LoRa/meshtastic/meshtastic_mesh.c @@ -1182,6 +1182,9 @@ static void on_rx_done(const sx1262_packet_t *pkt, void *ctx) { return; if (pkt->has_crc_error || pkt->has_header_error) { ESP_LOGD(TAG, "RX: erro HW, ignoring"); + + if (s_is_running) + sx1262_receive_continuous(); return; } diff --git a/firmware_p4/components/Drivers/sx1262/sx1262_hal.c b/firmware_p4/components/Drivers/sx1262/sx1262_hal.c index 59c408f22..1fc259bd7 100644 --- a/firmware_p4/components/Drivers/sx1262/sx1262_hal.c +++ b/firmware_p4/components/Drivers/sx1262/sx1262_hal.c @@ -41,7 +41,7 @@ #define PIN_RXEN GPIO_LORA_RXEN_PIN #define SPI_HOST_ID SPI3_HOST -#define SPI_FREQ_HZ 8000000 +#define SPI_FREQ_HZ 4000000 #define SPI_MAX_TRANSFER 264 static const char *TAG = "SX1262_HAL_ESP32"; diff --git a/firmware_p4/components/Drivers/sx1262/sx1262_irq.c b/firmware_p4/components/Drivers/sx1262/sx1262_irq.c index dca40c9ce..1b643cb4e 100644 --- a/firmware_p4/components/Drivers/sx1262/sx1262_irq.c +++ b/firmware_p4/components/Drivers/sx1262/sx1262_irq.c @@ -187,6 +187,8 @@ bool sx1262_irq_has_packet(void) { } static esp_err_t read_rx_packet(sx1262_packet_t *out_pkt, uint16_t irq_flags) { + bool errored = (irq_flags & (SX1262_IRQ_CRC_ERR | SX1262_IRQ_HEADER_ERR)) != 0; + uint8_t rx_buf_status[2] = {0}; esp_err_t ret = sx1262_cmd_read(s_hal, SX1262_OP_GET_RX_BUFFER_STATUS, rx_buf_status, 2); if (ret != ESP_OK) { @@ -204,7 +206,7 @@ static esp_err_t read_rx_packet(sx1262_packet_t *out_pkt, uint16_t irq_flags) { return ret; } - if (payload_len > 0) { + if (payload_len > 0 && !errored) { ret = sx1262_cmd_read_buffer(s_hal, buf_offset, out_pkt->buf, payload_len); if (ret != ESP_OK) { ESP_LOGE(TAG, "ReadBuffer failed"); @@ -212,7 +214,7 @@ static esp_err_t read_rx_packet(sx1262_packet_t *out_pkt, uint16_t irq_flags) { } } - out_pkt->len = payload_len; + out_pkt->len = errored ? 0 : payload_len; out_pkt->rssi_pkt_dbm = -(int16_t)(pkt_status[0] / 2); out_pkt->snr_pkt_db = (int8_t)pkt_status[1] / 4; out_pkt->signal_rssi_dbm = -(int16_t)(pkt_status[2] / 2); From 9433574483a9a2c116e15ff9b129d45790b820bd Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:42:45 -0300 Subject: [PATCH 024/103] fix(ui): async-delete the keyboard to avoid a self-delete use-after-free --- .../Applications/ui/components/keyboard/keyboard_ui.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware_p4/components/Applications/ui/components/keyboard/keyboard_ui.c b/firmware_p4/components/Applications/ui/components/keyboard/keyboard_ui.c index da8c9301e..f5adc4b73 100644 --- a/firmware_p4/components/Applications/ui/components/keyboard/keyboard_ui.c +++ b/firmware_p4/components/Applications/ui/components/keyboard/keyboard_ui.c @@ -199,7 +199,7 @@ void keyboard_close(void) { lv_group_set_editing(main_group, false); lv_group_remove_all_objs(main_group); } - lv_obj_del(kb_screen); + lv_obj_del_async(kb_screen); kb_screen = NULL; kb_obj = NULL; kb_ta = NULL; From c3863eb01afcd53694841a1be5fb28883293a8f3 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:42:45 -0300 Subject: [PATCH 025/103] chore(build): track dependencies.lock for reproducible builds --- .gitignore | 4 +- firmware_c5/dependencies.lock | 72 +++++++++++ firmware_p4/dependencies.lock | 225 ++++++++++++++++++++++++++++++++++ 3 files changed, 299 insertions(+), 2 deletions(-) create mode 100644 firmware_c5/dependencies.lock create mode 100644 firmware_p4/dependencies.lock diff --git a/.gitignore b/.gitignore index 4985256c1..ef8f972ee 100644 --- a/.gitignore +++ b/.gitignore @@ -1044,8 +1044,8 @@ size_info_*.txt # pytest-embedded log folder pytest_embedded_log/ -# idf-component-manager output -dependencies.lock +# idf-component-manager lock: TRACKED for reproducible builds (pins the exact +# managed-component versions so every clone resolves the same deps). !assets/ !assets/** diff --git a/firmware_c5/dependencies.lock b/firmware_c5/dependencies.lock new file mode 100644 index 000000000..14e39f39d --- /dev/null +++ b/firmware_c5/dependencies.lock @@ -0,0 +1,72 @@ +dependencies: + espressif/argtable3: + component_hash: a502202e644f6d446f28b906f90e657d0bda1939faa17c122446cc64f6e4e0be + dependencies: + - name: idf + require: private + version: '>=5.1' + source: + registry_url: https://components.espressif.com/ + type: service + version: 3.3.1~1 + espressif/cjson: + component_hash: e788323270d90738662d66fffa910bfe1fba019bba087f01557e70c40485b469 + dependencies: + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.7.19~2 + espressif/led_strip: + component_hash: 28c6509a727ef74925b372ed404772aeedf11cce10b78c3f69b3c66799095e2d + dependencies: + - name: idf + require: private + version: '>=4.4' + source: + registry_url: https://components.espressif.com/ + type: service + version: 2.5.5 + espressif/mdns: + component_hash: 8bcf12e37c58c1d584aef32a02b92548124c7a3a9fcf548d3235c844a035e0f0 + dependencies: + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.11.1 + idf: + source: + type: idf + version: 5.5.3 + joltwallet/littlefs: + component_hash: 01faa388c6305fe77fd6962cda6171e753033458f24f8fae9e9d932e3d817a4c + dependencies: + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.22.1 + lvgl/lvgl: + component_hash: 17e68bfd21f0edf4c3ee838e2273da840bf3930e5dbc3bfa6c1190c3aed41f9f + dependencies: [] + source: + registry_url: https://components.espressif.com/ + type: service + version: 9.4.0 +direct_dependencies: +- espressif/argtable3 +- espressif/cjson +- espressif/led_strip +- espressif/mdns +- joltwallet/littlefs +- lvgl/lvgl +manifest_hash: f2922f1fef1e351cee9d14449b7846708d8164b3dd9a3b8a53230c29e72e15f0 +target: esp32c5 +version: 2.0.0 diff --git a/firmware_p4/dependencies.lock b/firmware_p4/dependencies.lock new file mode 100644 index 000000000..e785b4910 --- /dev/null +++ b/firmware_p4/dependencies.lock @@ -0,0 +1,225 @@ +dependencies: + chmorgan/esp-libhelix-mp3: + component_hash: cbb76089dc2c5749f7b470e2e70aedc44c9da519e04eb9a67d4c7ec275229e53 + dependencies: + - name: idf + require: private + version: '>=4.1.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.0.3 + espressif/argtable3: + component_hash: a502202e644f6d446f28b906f90e657d0bda1939faa17c122446cc64f6e4e0be + dependencies: + - name: idf + require: private + version: '>=5.1' + source: + registry_url: https://components.espressif.com/ + type: service + version: 3.3.1~1 + espressif/cjson: + component_hash: e788323270d90738662d66fffa910bfe1fba019bba087f01557e70c40485b469 + dependencies: + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.7.19~2 + espressif/esp-dsp: + component_hash: ed9ac175b14e0414399a2b33c525579414b5bad19a2a67b12ea212def96f9a98 + dependencies: + - name: idf + require: private + version: '>=4.2' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.8.2 + espressif/esp-serial-flasher: + component_hash: c86fdf9b4a353782da86870efe922e6c9b4b733a54e009e74c5f74b920bf4062 + dependencies: + - name: espressif/usb_host_cdc_acm + registry_url: https://components.espressif.com + require: private + rules: + - if: target in [esp32s2, esp32s3, esp32p4] + version: ^2 + - name: espressif/usb_host_ch34x_vcp + registry_url: https://components.espressif.com + require: private + rules: + - if: target in [esp32s2, esp32s3, esp32p4] + version: ^2.2 + - name: espressif/usb_host_cp210x_vcp + registry_url: https://components.espressif.com + require: private + rules: + - if: target in [esp32s2, esp32s3, esp32p4] + version: ^2.2 + source: + registry_url: https://components.espressif.com/ + type: service + version: 2.0.0 + espressif/esp_lvgl_port: + component_hash: fb6c1fdfe70d4ca39a035d63ca394a35f17ec84ce16ff98ecb13a54155d75da4 + dependencies: + - name: idf + require: private + version: '>=5.2' + - name: lvgl/lvgl + registry_url: https://components.espressif.com + require: public + version: '>=8,<10' + source: + registry_url: https://components.espressif.com/ + type: service + version: 2.8.0~1 + espressif/esp_tinyusb: + component_hash: 8e57a14ac14d8e4d4588b5b9222977b96475323bcebae3c838919bb4e8587887 + dependencies: + - name: idf + require: private + version: '>=5.0' + - name: espressif/tinyusb + registry_url: https://components.espressif.com + require: public + version: '>=0.17.0~2' + source: + registry_url: https://components.espressif.com/ + type: service + targets: + - esp32s2 + - esp32s3 + - esp32p4 + - esp32h4 + - esp32s31 + version: 2.2.0 + espressif/led_strip: + component_hash: 28c6509a727ef74925b372ed404772aeedf11cce10b78c3f69b3c66799095e2d + dependencies: + - name: idf + require: private + version: '>=4.4' + source: + registry_url: https://components.espressif.com/ + type: service + version: 2.5.5 + espressif/libsodium: + component_hash: d4066b373fc6d4c5196db42aeea7faef4ac7f3080af96c2b74e2476c08b78dc1 + dependencies: + - name: idf + require: private + version: '>=4.2' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.0.22~1 + espressif/tinyusb: + component_hash: a40b7f67df6ac254a4afd96c6401cc56f2059ae747d6d7e66b568bca53ad0edc + dependencies: + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + targets: + - esp32s2 + - esp32s3 + - esp32p4 + - esp32h4 + - esp32s31 + version: 0.19.0~3 + espressif/usb_host_cdc_acm: + component_hash: f3893a5e117c65f3c4d90d282bbb43624a2fec4144532e5c72223e69bd1b00e9 + dependencies: + - name: idf + require: private + version: '>=5.0' + - name: espressif/usb + registry_url: https://components.espressif.com + require: public + rules: + - if: idf_version >=6.0 + - if: target not in ["linux"] + version: ^1.0.0 + source: + registry_url: https://components.espressif.com + type: service + targets: + - esp32s2 + - esp32s3 + - esp32p4 + - esp32h4 + - esp32s31 + - linux + version: 2.4.0 + espressif/usb_host_ch34x_vcp: + component_hash: cc6f17936a11aa0ba460e716bd9b70fcd445824bcc7882afbe3ede3513f80c59 + dependencies: + - name: idf + require: private + version: '>=4.4' + - name: espressif/usb_host_cdc_acm + registry_url: https://components.espressif.com + require: public + version: ^2.1.0 + source: + registry_url: https://components.espressif.com + type: service + version: 2.2.0 + espressif/usb_host_cp210x_vcp: + component_hash: c0404c598e2620fe88c35b5bf24d8e3b3ded41d9946fc865843be7f2f75da40e + dependencies: + - name: espressif/usb_host_cdc_acm + registry_url: https://components.espressif.com + require: public + version: ^2.1.0 + - name: idf + require: private + version: '>=4.4' + source: + registry_url: https://components.espressif.com + type: service + version: 2.2.0 + idf: + source: + type: idf + version: 5.5.3 + joltwallet/littlefs: + component_hash: 01faa388c6305fe77fd6962cda6171e753033458f24f8fae9e9d932e3d817a4c + dependencies: + - name: idf + require: private + version: '>=5.0' + source: + registry_url: https://components.espressif.com/ + type: service + version: 1.22.1 + lvgl/lvgl: + component_hash: 17e68bfd21f0edf4c3ee838e2273da840bf3930e5dbc3bfa6c1190c3aed41f9f + dependencies: [] + source: + registry_url: https://components.espressif.com/ + type: service + version: 9.4.0 +direct_dependencies: +- chmorgan/esp-libhelix-mp3 +- espressif/argtable3 +- espressif/cjson +- espressif/esp-dsp +- espressif/esp-serial-flasher +- espressif/esp_lvgl_port +- espressif/esp_tinyusb +- espressif/led_strip +- espressif/libsodium +- espressif/tinyusb +- joltwallet/littlefs +- lvgl/lvgl +manifest_hash: 9af126a7b8d12e169ffd2b9a8a08877886bfff58cb7f8b7af570a9a67b5ba854 +target: esp32p4 +version: 2.0.0 From 6876fc4013bd2d7a2ce3491de13648b4069ce5e2 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:42:45 -0300 Subject: [PATCH 026/103] fix(radio): retry the SX1262 bring-up until it lands in STDBY_RC --- .../components/Drivers/sx1262/sx1262.c | 56 +++++++++++++++---- 1 file changed, 45 insertions(+), 11 deletions(-) diff --git a/firmware_p4/components/Drivers/sx1262/sx1262.c b/firmware_p4/components/Drivers/sx1262/sx1262.c index 5eaf18aef..0127b0791 100644 --- a/firmware_p4/components/Drivers/sx1262/sx1262.c +++ b/firmware_p4/components/Drivers/sx1262/sx1262.c @@ -41,6 +41,9 @@ static TaskHandle_t s_stop_caller_handle = NULL; #define SX1262_IRQ_TASK_PRIO SYS_PRIO_REALTIME #define SX1262_IRQ_TASK_CORE SYS_CORE_RADIO +#define SX1262_INIT_MAX_ATTEMPTS 3 + +static esp_err_t sx1262_hw_bringup(const sx1262_config_t *config); static esp_err_t validate_hal(const sx1262_hal_t *hal); static esp_err_t validate_config(const sx1262_config_t *config); static esp_err_t hw_reset(sx1262_hal_t *hal); @@ -67,9 +70,42 @@ esp_err_t sx1262_init(const sx1262_config_t *config) { } memcpy(&s_config, config, sizeof(sx1262_config_t)); + + ret = ESP_ERR_INVALID_STATE; + for (int attempt = 1; attempt <= SX1262_INIT_MAX_ATTEMPTS; attempt++) { + ret = sx1262_hw_bringup(config); + if (ret == ESP_OK) { + break; + } + ESP_LOGW(TAG, + "Init attempt %d/%d failed (%s) — retrying", + attempt, + SX1262_INIT_MAX_ATTEMPTS, + esp_err_to_name(ret)); + } + if (ret != ESP_OK) { + ESP_LOGE(TAG, "Init failed after %d attempts", SX1262_INIT_MAX_ATTEMPTS); + return ret; + } + + sx1262_irq_init(&s_config.hal, &s_config, &s_callbacks); + + sx1262_radio_init(&s_config.hal, &s_config); + + ESP_LOGI(TAG, + "Initialized — freq: %lu, sf: %d, bw: 0x%02X, power: %d dBm", + (unsigned long)config->frequency_hz, + config->sf, + config->bw, + config->tx_power_dbm); + + return ESP_OK; +} + +static esp_err_t sx1262_hw_bringup(const sx1262_config_t *config) { sx1262_hal_t *hal = &s_config.hal; - ret = hw_reset(hal); + esp_err_t ret = hw_reset(hal); if (ret != ESP_OK) { return ret; } @@ -149,10 +185,6 @@ esp_err_t sx1262_init(const sx1262_config_t *config) { return ret; } - sx1262_irq_init(hal, &s_config, &s_callbacks); - - sx1262_radio_init(hal, &s_config); - uint8_t status = 0; ret = sx1262_get_status(&status); if (ret != ESP_OK) { @@ -160,18 +192,20 @@ esp_err_t sx1262_init(const sx1262_config_t *config) { } uint8_t chip_mode = (status & SX1262_STATUS_CHIP_MODE_MASK) >> SX1262_STATUS_CHIP_MODE_SHIFT; + if (chip_mode != SX1262_CHIP_MODE_STDBY_RC) { + ESP_LOGW(TAG, + "Bring-up left chip in bad state: status=0x%02X chip_mode=%d (want %d)", + status, + chip_mode, + SX1262_CHIP_MODE_STDBY_RC); + return ESP_ERR_INVALID_STATE; + } ESP_LOGI(TAG, "Init OK — status: 0x%02X, chip_mode: %d (STDBY_RC=%d)", status, chip_mode, SX1262_CHIP_MODE_STDBY_RC); - ESP_LOGI(TAG, - "Initialized — freq: %lu, sf: %d, bw: 0x%02X, power: %d dBm", - (unsigned long)config->frequency_hz, - config->sf, - config->bw, - config->tx_power_dbm); return ESP_OK; } From 420ae41f298963e7a323745401b24fcdd9f8e192 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 18:56:25 -0300 Subject: [PATCH 027/103] fix(ui): stop coverflow opacity animation from leaking local styles (WDT) --- .../Applications/ui/screens/menu/menu_ui.c | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/firmware_p4/components/Applications/ui/screens/menu/menu_ui.c b/firmware_p4/components/Applications/ui/screens/menu/menu_ui.c index f6264408e..ad44af5ac 100644 --- a/firmware_p4/components/Applications/ui/screens/menu/menu_ui.c +++ b/firmware_p4/components/Applications/ui/screens/menu/menu_ui.c @@ -225,6 +225,14 @@ static void on_anim_done(lv_anim_t *a) { s_is_animating = false; } +// lv_obj_set_style_opa takes a third (selector) argument, so it cannot be used +// directly as a 2-arg animation exec callback: the selector would be an +// uninitialized register. Under -O2 that garbage selector made each frame add a +// fresh local-style entry, growing the style list until taskLVGL stalled (WDT). +static void anim_set_opa_cb(void *var, int32_t v) { + lv_obj_set_style_opa((lv_obj_t *)var, (lv_opa_t)v, 0); +} + static void load_item_frame(size_t item_idx, int frame) { if (s_menu_data[item_idx].icon_frames[frame] != NULL && s_menu_data[item_idx].icon_dscs[frame] == NULL) @@ -306,7 +314,7 @@ static void place_item(size_t item_idx, bool anim) { lv_anim_set_var(&a, s_base_imgs[item_idx]); lv_anim_set_values(&a, lv_obj_get_style_opa(s_base_imgs[item_idx], 0), to); - lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_style_opa); + lv_anim_set_exec_cb(&a, anim_set_opa_cb); lv_anim_start(&a); lv_anim_set_var(&a, s_icon_imgs[item_idx]); @@ -373,7 +381,7 @@ static void update_view(bool anim) { lv_anim_set_var(&a, s_label); lv_anim_set_values(&a, LV_OPA_0, LV_OPA_COVER); lv_anim_set_duration(&a, LABEL_FADE_MS); - lv_anim_set_exec_cb(&a, (lv_anim_exec_xcb_t)lv_obj_set_style_opa); + lv_anim_set_exec_cb(&a, anim_set_opa_cb); lv_anim_start(&a); } From 84e23bc89e8a73a9665de656e17a98051f337b0f Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 19:58:44 -0300 Subject: [PATCH 028/103] fix(display): drive SPI3 SCLK/MOSI harder to stop radio-EMI garbling --- firmware_p4/components/Drivers/st7789/include/st7789.h | 10 ++++++++++ firmware_p4/components/Drivers/st7789/st7789.c | 7 +++++++ 2 files changed, 17 insertions(+) diff --git a/firmware_p4/components/Drivers/st7789/include/st7789.h b/firmware_p4/components/Drivers/st7789/include/st7789.h index 8b3f9c1b6..cb40865df 100644 --- a/firmware_p4/components/Drivers/st7789/include/st7789.h +++ b/firmware_p4/components/Drivers/st7789/include/st7789.h @@ -34,6 +34,16 @@ extern "C" { * (garbled/white images) above 20 MHz. */ #define LCD_PIXEL_CLOCK_HZ (20 * 1000 * 1000) + +/** + * @brief Drive strength for the SPI3 SCLK/MOSI pins that feed the display FFC. + * The FFC is long/capacitive and unterminated: at the IDF default the + * edges barely settle at 20 MHz, so a radio's EMI corrupts the still- + * settling edge and garbles long transfers. Strongest drive (CAP_3) makes + * the edges settle faster for more timing margin. (A weaker cap starves + * the FFC so hard the panel will not even init, so do not lower this.) + */ +#define LCD_SPI_DRIVE_CAP GPIO_DRIVE_CAP_3 #define LCD_H_RES 240 #define LCD_V_RES 320 /** diff --git a/firmware_p4/components/Drivers/st7789/st7789.c b/firmware_p4/components/Drivers/st7789/st7789.c index b2e3615d5..cae51473f 100644 --- a/firmware_p4/components/Drivers/st7789/st7789.c +++ b/firmware_p4/components/Drivers/st7789/st7789.c @@ -20,6 +20,7 @@ #include #include "esp_log.h" +#include "driver/gpio.h" #include "driver/ledc.h" #include "freertos/FreeRTOS.h" #include "freertos/task.h" @@ -265,6 +266,12 @@ esp_err_t st7789_init(void) { return ret; } + // Drive the SCLK/MOSI edges harder on the long, unterminated display FFC so + // they settle within the 20 MHz bit period; at the default cap the edge is + // still settling when a radio's EMI hits it and long transfers garble. + gpio_set_drive_capability(GPIO_SPI_SCLK_PIN, LCD_SPI_DRIVE_CAP); + gpio_set_drive_capability(GPIO_SPI_MOSI_PIN, LCD_SPI_DRIVE_CAP); + esp_lcd_panel_dev_config_t panel_config = { .reset_gpio_num = GPIO_ST7789_RST_PIN, .rgb_ele_order = LCD_RGB_ELEMENT_ORDER_RGB, From 9582ecf34d9b99abd8dffc0a1d733923090597e0 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 20:40:23 -0300 Subject: [PATCH 029/103] fix(ui): make the shared chrome, menu and modal rotation-aware --- .../ui/components/chrome/ui_chrome.c | 7 ++-- .../menu_component/menu_component_ui.c | 13 +++--- .../ui/components/message_box/msgbox_ui.c | 27 ++++++------ .../Applications/ui/include/ui_metrics.h | 41 +++++++++++++++++++ 4 files changed, 66 insertions(+), 22 deletions(-) create mode 100644 firmware_p4/components/Applications/ui/include/ui_metrics.h diff --git a/firmware_p4/components/Applications/ui/components/chrome/ui_chrome.c b/firmware_p4/components/Applications/ui/components/chrome/ui_chrome.c index 60691f7f1..d64678909 100644 --- a/firmware_p4/components/Applications/ui/components/chrome/ui_chrome.c +++ b/firmware_p4/components/Applications/ui/components/chrome/ui_chrome.c @@ -20,6 +20,7 @@ #include "st7789.h" #include "header_ui.h" +#include "ui_metrics.h" #include "ui_theme.h" // Whether the next chrome header shows the breadcrumb letreiro. Set per screen by @@ -72,7 +73,7 @@ lv_obj_t *ui_chrome_light_title(lv_obj_t *container, const char *title) { lv_obj_set_style_text_opa(lbl, LV_OPA_80, 0); lv_obj_set_style_text_font(lbl, &lv_font_montserrat_12, 0); lv_label_set_long_mode(lbl, LV_LABEL_LONG_DOT); - lv_obj_set_width(lbl, LCD_H_RES - 24); + lv_obj_set_width(lbl, ui_screen_w() - 24); lv_obj_align(lbl, LV_ALIGN_BOTTOM_LEFT, 12, -1); return lbl; } @@ -81,7 +82,7 @@ lv_obj_t *ui_chrome_light_title(lv_obj_t *container, const char *title) { // still starts at UI_CHROME_HEADER_H and no per-screen layout changes are needed. static lv_obj_t *make_header_container(lv_obj_t *parent) { lv_obj_t *hdr = lv_obj_create(parent); - lv_obj_set_size(hdr, LCD_H_RES, UI_CHROME_HEADER_H); + lv_obj_set_size(hdr, lv_pct(100), UI_CHROME_HEADER_H); lv_obj_align(hdr, LV_ALIGN_TOP_LEFT, 0, 0); lv_obj_remove_flag(hdr, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(hdr, LV_OBJ_FLAG_CLICKABLE); @@ -114,7 +115,7 @@ lv_obj_t *ui_chrome_header_overlay(lv_obj_t *parent, const char *title, const ch lv_obj_t *ui_chrome_footer(lv_obj_t *parent, const char *hint) { lv_obj_t *ft = lv_obj_create(parent); - lv_obj_set_size(ft, LCD_H_RES, UI_CHROME_FOOTER_H); + lv_obj_set_size(ft, lv_pct(100), UI_CHROME_FOOTER_H); lv_obj_align(ft, LV_ALIGN_BOTTOM_LEFT, 0, 0); lv_obj_remove_flag(ft, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(ft, LV_OBJ_FLAG_CLICKABLE); diff --git a/firmware_p4/components/Applications/ui/components/menu_component/menu_component_ui.c b/firmware_p4/components/Applications/ui/components/menu_component/menu_component_ui.c index 4aea79cad..ac1218a3c 100644 --- a/firmware_p4/components/Applications/ui/components/menu_component/menu_component_ui.c +++ b/firmware_p4/components/Applications/ui/components/menu_component/menu_component_ui.c @@ -21,6 +21,7 @@ #include "assets_manager.h" #include "ui_chrome.h" #include "ui_feedback.h" +#include "ui_metrics.h" #include "ui_theme.h" #define HEADER_BG current_theme.bg_secondary @@ -139,7 +140,7 @@ menu_component_create(lv_obj_t *parent, const char *title, const char *title_ico (void)title_icon_path; // the shared status header carries its own icons now m.screen = lv_obj_create(parent); - lv_obj_set_size(m.screen, LCD_H_RES, LCD_V_RES); + lv_obj_set_size(m.screen, lv_pct(100), lv_pct(100)); lv_obj_align(m.screen, LV_ALIGN_TOP_LEFT, 0, 0); lv_obj_remove_flag(m.screen, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_style_bg_color(m.screen, current_theme.screen_base, 0); @@ -153,7 +154,7 @@ menu_component_create(lv_obj_t *parent, const char *title, const char *title_ico // alone). Kept in title_bar (transparent) so callers that fade_in(title_bar) // still animate the whole area. m.title_bar = lv_obj_create(m.screen); - lv_obj_set_size(m.title_bar, LCD_H_RES, HEADER_H); + lv_obj_set_size(m.title_bar, lv_pct(100), HEADER_H); lv_obj_align(m.title_bar, LV_ALIGN_TOP_LEFT, 0, 0); lv_obj_remove_flag(m.title_bar, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(m.title_bar, LV_OBJ_FLAG_CLICKABLE); @@ -163,12 +164,12 @@ menu_component_create(lv_obj_t *parent, const char *title, const char *title_ico lv_obj_set_style_radius(m.title_bar, 0, 0); m.title_label = ui_chrome_light_title(m.title_bar, title); - int items_h = LCD_V_RES - ITEMS_Y - FOOTER_H - 4; + int items_h = ui_screen_h() - ITEMS_Y - FOOTER_H - 4; if (items_h < ITEM_H) items_h = ITEM_H; m.items_cont = lv_obj_create(m.screen); - lv_obj_set_size(m.items_cont, LCD_H_RES - LEFT_MARGIN - RIGHT_GUTTER, items_h); + lv_obj_set_size(m.items_cont, ui_screen_w() - LEFT_MARGIN - RIGHT_GUTTER, items_h); lv_obj_align(m.items_cont, LV_ALIGN_TOP_LEFT, LEFT_MARGIN, ITEMS_Y); lv_obj_set_style_bg_opa(m.items_cont, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(m.items_cont, 0, 0); @@ -178,7 +179,7 @@ menu_component_create(lv_obj_t *parent, const char *title, const char *title_ico lv_obj_set_scrollbar_mode(m.items_cont, LV_SCROLLBAR_MODE_OFF); lv_obj_set_scroll_snap_y(m.items_cont, LV_SCROLL_SNAP_NONE); - int track_x = LCD_H_RES - OUTER_BORDER - 9; + int track_x = ui_screen_w() - OUTER_BORDER - 9; m.track_y_start = ITEMS_Y + 8; m.track_h = items_h - 16; if (m.track_h < 0) @@ -210,7 +211,7 @@ menu_component_create(lv_obj_t *parent, const char *title, const char *title_ico lv_obj_move_foreground(m.scroll_bar); m.footer = lv_obj_create(m.screen); - lv_obj_set_size(m.footer, LCD_H_RES, FOOTER_H); + lv_obj_set_size(m.footer, lv_pct(100), FOOTER_H); lv_obj_align(m.footer, LV_ALIGN_BOTTOM_LEFT, 0, 0); lv_obj_remove_flag(m.footer, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(m.footer, LV_OBJ_FLAG_CLICKABLE); diff --git a/firmware_p4/components/Applications/ui/components/message_box/msgbox_ui.c b/firmware_p4/components/Applications/ui/components/message_box/msgbox_ui.c index 2249fdf98..9a58a33f6 100644 --- a/firmware_p4/components/Applications/ui/components/message_box/msgbox_ui.c +++ b/firmware_p4/components/Applications/ui/components/message_box/msgbox_ui.c @@ -19,9 +19,10 @@ #include "assets_manager.h" #include "buttons_gpio.h" +#include "ui_metrics.h" #include "ui_theme.h" -#define MSGBOX_H ((LCD_V_RES * 45) / 100) +#define MSGBOX_H ((ui_screen_h() * 45) / 100) #define ANIM_TIME 300 #define BORDER_COLOR current_theme.border_accent #define GRAD_TOP current_theme.border_interface @@ -103,7 +104,7 @@ static void do_close(bool confirm) { lv_anim_t a; lv_anim_init(&a); lv_anim_set_var(&a, closing); - lv_anim_set_values(&a, lv_obj_get_y(closing), LCD_V_RES); + lv_anim_set_values(&a, lv_obj_get_y(closing), ui_screen_h()); lv_anim_set_duration(&a, ANIM_TIME); lv_anim_set_path_cb(&a, lv_anim_path_ease_in_out); lv_anim_set_exec_cb(&a, slide_anim_cb); @@ -208,8 +209,8 @@ void msgbox_open( lv_obj_t *scr = lv_screen_active(); panel = lv_obj_create(scr); - lv_obj_set_size(panel, LCD_H_RES, MSGBOX_H); - lv_obj_set_pos(panel, 0, LCD_V_RES); + lv_obj_set_size(panel, ui_screen_w(), MSGBOX_H); + lv_obj_set_pos(panel, 0, ui_screen_h()); lv_obj_remove_flag(panel, LV_OBJ_FLAG_SCROLLABLE); lv_obj_add_event_cb(panel, panel_deleted_cb, LV_EVENT_DELETE, NULL); @@ -250,7 +251,7 @@ void msgbox_open( lv_obj_set_style_text_font(msg_lbl, &lv_font_montserrat_12, 0); lv_obj_set_style_text_align(msg_lbl, LV_TEXT_ALIGN_CENTER, 0); lv_label_set_long_mode(msg_lbl, LV_LABEL_LONG_WRAP); - lv_obj_set_width(msg_lbl, LCD_H_RES - 40); + lv_obj_set_width(msg_lbl, ui_screen_w() - 40); lv_obj_t *btn_row = lv_obj_create(content); lv_obj_set_size(btn_row, LV_SIZE_CONTENT, LV_SIZE_CONTENT); @@ -279,11 +280,11 @@ void msgbox_open( update_btn_selection(); - int target_y = LCD_V_RES - MSGBOX_H; + int target_y = ui_screen_h() - MSGBOX_H; lv_anim_t a; lv_anim_init(&a); lv_anim_set_var(&a, panel); - lv_anim_set_values(&a, LCD_V_RES, target_y); + lv_anim_set_values(&a, ui_screen_h(), target_y); lv_anim_set_duration(&a, ANIM_TIME); lv_anim_set_path_cb(&a, lv_anim_path_ease_in_out); lv_anim_set_exec_cb(&a, slide_anim_cb); @@ -328,7 +329,7 @@ void msgbox_open_sd_info(const char *name, const char *size, const char *free, c lv_obj_t *scr = lv_screen_active(); panel = lv_obj_create(scr); lv_obj_set_size(panel, SD_MODAL_W, SD_MODAL_H); - lv_obj_set_pos(panel, (LCD_H_RES - SD_MODAL_W) / 2, LCD_V_RES); + lv_obj_set_pos(panel, (ui_screen_w() - SD_MODAL_W) / 2, ui_screen_h()); lv_obj_remove_flag(panel, LV_OBJ_FLAG_SCROLLABLE); lv_obj_add_event_cb(panel, panel_deleted_cb, LV_EVENT_DELETE, NULL); @@ -392,11 +393,11 @@ void msgbox_open_sd_info(const char *name, const char *size, const char *free, c btn_sel = 0; update_btn_selection(); - int target_y = (LCD_V_RES - SD_MODAL_H) / 2; + int target_y = (ui_screen_h() - SD_MODAL_H) / 2; lv_anim_t a; lv_anim_init(&a); lv_anim_set_var(&a, panel); - lv_anim_set_values(&a, LCD_V_RES, target_y); + lv_anim_set_values(&a, ui_screen_h(), target_y); lv_anim_set_duration(&a, ANIM_TIME); lv_anim_set_path_cb(&a, lv_anim_path_ease_in_out); lv_anim_set_exec_cb(&a, slide_anim_cb); @@ -421,7 +422,7 @@ void msgbox_open_info(const char *icon_path, lv_obj_t *scr = lv_screen_active(); panel = lv_obj_create(scr); lv_obj_set_size(panel, SD_MODAL_W, SD_MODAL_H); - lv_obj_set_pos(panel, (LCD_H_RES - SD_MODAL_W) / 2, LCD_V_RES); + lv_obj_set_pos(panel, (ui_screen_w() - SD_MODAL_W) / 2, ui_screen_h()); lv_obj_remove_flag(panel, LV_OBJ_FLAG_SCROLLABLE); lv_obj_add_event_cb(panel, panel_deleted_cb, LV_EVENT_DELETE, NULL); @@ -483,11 +484,11 @@ void msgbox_open_info(const char *icon_path, btn_sel = 0; update_btn_selection(); - int target_y = (LCD_V_RES - SD_MODAL_H) / 2; + int target_y = (ui_screen_h() - SD_MODAL_H) / 2; lv_anim_t a; lv_anim_init(&a); lv_anim_set_var(&a, panel); - lv_anim_set_values(&a, LCD_V_RES, target_y); + lv_anim_set_values(&a, ui_screen_h(), target_y); lv_anim_set_duration(&a, ANIM_TIME); lv_anim_set_path_cb(&a, lv_anim_path_ease_in_out); lv_anim_set_exec_cb(&a, slide_anim_cb); diff --git a/firmware_p4/components/Applications/ui/include/ui_metrics.h b/firmware_p4/components/Applications/ui/include/ui_metrics.h new file mode 100644 index 000000000..1c83784a7 --- /dev/null +++ b/firmware_p4/components/Applications/ui/include/ui_metrics.h @@ -0,0 +1,41 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#ifndef UI_METRICS_H +#define UI_METRICS_H + +#include "lvgl.h" + +#ifdef __cplusplus +extern "C" { +#endif + +// Live logical screen size. Unlike the LCD_H_RES / LCD_V_RES panel constants +// (fixed 240 x 320), these follow lv_display_set_rotation: in landscape (270) +// they return 320 x 240. Use them for layout that must survive rotation; the +// panel constants stay for DMA buffer sizing only. +static inline int32_t ui_screen_w(void) { + return lv_display_get_horizontal_resolution(NULL); +} + +static inline int32_t ui_screen_h(void) { + return lv_display_get_vertical_resolution(NULL); +} + +#ifdef __cplusplus +} +#endif + +#endif // UI_METRICS_H From 5274998215d0d0d7721bc586b14ab9de6fb66fc9 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 20:45:21 -0300 Subject: [PATCH 030/103] feat(ui): apply screen rotation live by rebuilding the active screen --- .../Applications/ui/include/ui_manager.h | 6 +++++ .../ui/screens/settings/display_settings_ui.c | 26 +++++++++++++++++-- .../components/Applications/ui/ui_manager.c | 8 ++++++ 3 files changed, 38 insertions(+), 2 deletions(-) diff --git a/firmware_p4/components/Applications/ui/include/ui_manager.h b/firmware_p4/components/Applications/ui/include/ui_manager.h index 9ff07544a..e3a684f7a 100644 --- a/firmware_p4/components/Applications/ui/include/ui_manager.h +++ b/firmware_p4/components/Applications/ui/include/ui_manager.h @@ -229,6 +229,12 @@ void ui_screen_load_owned(lv_obj_t **slot, lv_obj_t *scr); /** @brief Returns the currently active screen id. */ screen_id_t ui_current_screen(void); +/** + * @brief Rebuild the active screen so it re-lays-out at the current logical + * resolution. Call after a rotation change to reflow it immediately. + */ +void ui_relayout_current_screen(void); + /** * @brief Whether a screen shows the global chrome (status bar + dropdown). * diff --git a/firmware_p4/components/Applications/ui/screens/settings/display_settings_ui.c b/firmware_p4/components/Applications/ui/screens/settings/display_settings_ui.c index ccec15e81..e8c6f6cf4 100644 --- a/firmware_p4/components/Applications/ui/screens/settings/display_settings_ui.c +++ b/firmware_p4/components/Applications/ui/screens/settings/display_settings_ui.c @@ -61,14 +61,31 @@ static menu_component_t s_menu; static bool s_changed = false; +// Menu row to re-focus after a rotation-triggered rebuild, so toggling rotation +// does not bounce the selection back to the top row. -1 = nothing pending. +static int s_pending_row = -1; + static void cycle_selector(int sel, int dir) { if (sel == ROW_ROTATION) { s_rotation_idx = (s_rotation_idx + dir + ROTATION_COUNT) % ROTATION_COUNT; - menu_component_set_selector_value(&s_menu, sel, ROTATION_OPTS[s_rotation_idx]); bool want_landscape = (s_rotation_idx == 1); if (want_landscape != lvgl_glue_is_landscape()) lvgl_glue_toggle_rotation(); - s_changed = true; + // The rebuild re-reads state from g_config_screen and resets s_changed, so + // capture every pending setting first, persist, then rebuild. This keeps the + // new orientation live and reflows this screen (and all screens opened after) + // at the new logical resolution without dropping a pending brightness/timeout + // edit made before the toggle. + g_config_screen.brightness = + menu_component_get_intensity(&s_menu, ROW_BRIGHTNESS) * BRIGHTNESS_STEP_PCT; + g_config_screen.rotation = want_landscape ? 2 : 1; + g_config_screen.auto_lock_seconds = TIMEOUT_SECS[s_timeout_idx]; + g_config_screen.auto_dim = menu_component_get_toggle(&s_menu, ROW_AUTODIM); + if (ui_sd_ready()) + tos_config_save(TOS_PATH_CONFIG_SCREEN, "screen"); + s_pending_row = ROW_ROTATION; + ui_relayout_current_screen(); + return; } else if (sel == ROW_TIMEOUT) { s_timeout_idx = (s_timeout_idx + dir + TIMEOUT_COUNT) % TIMEOUT_COUNT; menu_component_set_selector_value(&s_menu, sel, TIMEOUT_OPTS[s_timeout_idx]); @@ -184,6 +201,11 @@ void ui_display_settings_open(void) { &s_menu, "/assets/icons/brightness_auto.bin", "Auto-dim", g_config_screen.auto_dim); menu_component_add_toggle(&s_menu, "/assets/icons/invert_colors.bin", "Invert", false); + if (s_pending_row >= 0) { + menu_component_select(&s_menu, s_pending_row); + s_pending_row = -1; + } + if (s_menu.items_cont != NULL) lv_obj_fade_in(s_menu.items_cont, ENTRY_FADE_MS, 0); diff --git a/firmware_p4/components/Applications/ui/ui_manager.c b/firmware_p4/components/Applications/ui/ui_manager.c index bba011fda..c2e320df8 100644 --- a/firmware_p4/components/Applications/ui/ui_manager.c +++ b/firmware_p4/components/Applications/ui/ui_manager.c @@ -770,6 +770,14 @@ screen_id_t ui_current_screen(void) { return current_screen_id; } +void ui_relayout_current_screen(void) { + // Rebuild the active screen through its normal open path so it re-runs its + // layout at the current logical resolution. Used after a rotation change so the + // on-screen layout reflows immediately instead of only on the next navigation. + if (current_screen_id != SCREEN_NONE) + ui_switch_screen(current_screen_id); +} + void ui_manager_relayout_current(void) {} bool ui_btn_up(void) { From 0d2ac8a2654e041910a30489e56cd818aad395cc Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 21:00:11 -0300 Subject: [PATCH 031/103] feat(ui): rotate d-pad input to match the screen in landscape --- .../components/Applications/ui/ui_manager.c | 24 +++++++++++++++++++ 1 file changed, 24 insertions(+) diff --git a/firmware_p4/components/Applications/ui/ui_manager.c b/firmware_p4/components/Applications/ui/ui_manager.c index c2e320df8..37799f4b2 100644 --- a/firmware_p4/components/Applications/ui/ui_manager.c +++ b/firmware_p4/components/Applications/ui/ui_manager.c @@ -221,10 +221,34 @@ static bool input_dispatch_blocked(void) { return ui_input_is_locked() || msgbox_is_open() || keyboard_is_open() || power_policy_is_asleep(); } +// Landscape is LV_DISPLAY_ROTATION_270 — the panel content is turned a quarter +// turn, so a physical d-pad press must be turned the same quarter turn for +// navigation to point the way it looks on screen. Applied centrally so every +// screen handler keeps using plain UP/DOWN/LEFT/RIGHT and adapts for free. +// OK/BACK are direction-agnostic. (If a direction reads inverted on hardware, +// reverse this cycle.) +static input_button_t input_remap_for_rotation(input_button_t b) { + if (!lvgl_glue_is_landscape()) + return b; + switch (b) { + case INPUT_BTN_UP: + return INPUT_BTN_RIGHT; + case INPUT_BTN_RIGHT: + return INPUT_BTN_DOWN; + case INPUT_BTN_DOWN: + return INPUT_BTN_LEFT; + case INPUT_BTN_LEFT: + return INPUT_BTN_UP; + default: + return b; + } +} + static void ui_input_pump(lv_timer_t *t) { (void)t; input_event_t ev; while (input_get_event(&ev, 0)) { + ev.button = input_remap_for_rotation(ev.button); if (screen_tips_active()) { screen_tips_handle_input(&ev); continue; From 24d39fe6f56314d631470b54a45ba2ad6c40cc24 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 21:07:59 -0300 Subject: [PATCH 032/103] fix(ui): make per-screen layouts rotation-aware (phase 3-4) --- .../ui/screens/audio/mp3_player_ui.c | 3 ++- .../ui/screens/audio/spectrum_ui.c | 3 ++- .../ui/screens/audio/wav_library_ui.c | 3 ++- .../ui/screens/audio/wav_player_ui.c | 3 ++- .../ui/screens/bluetooth/ble_beacon_ui.c | 3 ++- .../ui/screens/bluetooth/ble_companion_ui.c | 3 ++- .../ui/screens/bluetooth/ble_flood_ui.c | 3 ++- .../ui/screens/bluetooth/ble_keyboard_ui.c | 3 ++- .../ui/screens/bluetooth/ble_mouse_ui.c | 3 ++- .../ui/screens/bluetooth/ble_radio_ui.c | 3 ++- .../ui/screens/bluetooth/ble_skimmer_ui.c | 3 ++- .../ui/screens/bluetooth/ble_spam_ui.c | 5 +++-- .../ui/screens/bluetooth/ble_tracker_ui.c | 3 ++- .../ui/screens/connect_wifi/connect_wifi_ui.c | 5 +++-- .../ui/screens/dev/dev_console_ui.c | 17 +++++++++------ .../Applications/ui/screens/dev/scripts_ui.c | 17 +++++++++------ .../Applications/ui/screens/files/files_ui.c | 21 ++++++++++--------- .../ui/screens/files/usb_storage_ui.c | 5 +++-- .../Applications/ui/screens/home/home_ui.c | 10 +++++---- .../ui/screens/images/image_viewer_ui.c | 5 +++-- .../ui/screens/infrared/ir_raw_ui.c | 3 ++- .../ui/screens/infrared/ir_saved_ui.c | 3 ++- .../ui/screens/lora/lora_channels_ui.c | 5 +++-- .../ui/screens/lora/lora_chat_ui.c | 9 ++++---- .../ui/screens/lora/lora_position_ui.c | 7 ++++--- .../ui/screens/lora/lora_securedm_ui.c | 9 ++++---- .../ui/screens/lora/lora_telemetry_ui.c | 5 +++-- .../ui/screens/lora/lora_traceroute_ui.c | 3 ++- .../Applications/ui/screens/nfc/card_emu_ui.c | 3 ++- .../ui/screens/nfc/nfc_bankcard_ui.c | 7 ++++--- .../ui/screens/nfc/nfc_desfire_ui.c | 7 ++++--- .../ui/screens/nfc/nfc_emulate_ui.c | 3 ++- .../ui/screens/nfc/nfc_felica_ui.c | 7 ++++--- .../ui/screens/nfc/nfc_iso15693_ui.c | 7 ++++--- .../ui/screens/nfc/nfc_keydict_ui.c | 7 ++++--- .../Applications/ui/screens/nfc/nfc_ndef_ui.c | 7 ++++--- .../Applications/ui/screens/nfc/nfc_p2p_ui.c | 7 ++++--- .../ui/screens/nfc/nfc_saved_ui.c | 3 ++- .../ui/screens/nfc/nfc_ultralight_ui.c | 7 ++++--- .../ui/screens/nfc/nfc_write_ui.c | 5 +++-- .../ui/screens/settings/battery_settings_ui.c | 3 ++- .../ui/screens/settings/c5_status_ui.c | 3 ++- .../ui/screens/settings/led_ctrl_ui.c | 3 ++- .../ui/screens/settings/sd_health_ui.c | 3 ++- .../ui/screens/settings/storage_settings_ui.c | 11 +++++----- .../ui/screens/subghz/subghz_config_ui.c | 3 ++- .../ui/screens/subghz/subghz_menu_ui.c | 5 +++-- .../ui/screens/subghz/subghz_send_ui.c | 3 ++- .../ui/screens/video/mp4_player_ui.c | 3 ++- .../ui/screens/wifi/wifi_channel_ui.c | 3 ++- .../ui/screens/wifi/wifi_client_ui.c | 5 +++-- .../ui/screens/wifi/wifi_handshake_ui.c | 5 +++-- .../ui/screens/wifi/wifi_hotspot_ui.c | 5 +++-- 53 files changed, 176 insertions(+), 114 deletions(-) diff --git a/firmware_p4/components/Applications/ui/screens/audio/mp3_player_ui.c b/firmware_p4/components/Applications/ui/screens/audio/mp3_player_ui.c index d435d0c45..6481a1de7 100644 --- a/firmware_p4/components/Applications/ui/screens/audio/mp3_player_ui.c +++ b/firmware_p4/components/Applications/ui/screens/audio/mp3_player_ui.c @@ -40,6 +40,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #if MP3_AUDIO_DECODE @@ -528,7 +529,7 @@ void ui_mp3_player_open(void) { lv_obj_t *body = lv_obj_create(s_screen); lv_obj_remove_style_all(body); - lv_obj_set_size(body, 224, LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); + lv_obj_set_size(body, 224, ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); lv_obj_align(body, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_flex_flow(body, LV_FLEX_FLOW_COLUMN); diff --git a/firmware_p4/components/Applications/ui/screens/audio/spectrum_ui.c b/firmware_p4/components/Applications/ui/screens/audio/spectrum_ui.c index d408475e3..171147a36 100644 --- a/firmware_p4/components/Applications/ui/screens/audio/spectrum_ui.c +++ b/firmware_p4/components/Applications/ui/screens/audio/spectrum_ui.c @@ -29,6 +29,7 @@ #include "audio_i2s.h" #include "ui_chrome.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" static const char *TAG = "SPECTRUM_UI"; @@ -269,7 +270,7 @@ void ui_spectrum_open(void) { int band_top = UI_CHROME_HEADER_H; int plot_top = band_top + PLOT_TOP_OFS; - int plot_h = LCD_V_RES - UI_CHROME_FOOTER_H - AXIS_H - PLOT_BOTTOM_PAD - plot_top; + int plot_h = ui_screen_h() - UI_CHROME_FOOTER_H - AXIS_H - PLOT_BOTTOM_PAD - plot_top; if (plot_h < PLOT_MIN_H) plot_h = PLOT_MIN_H; diff --git a/firmware_p4/components/Applications/ui/screens/audio/wav_library_ui.c b/firmware_p4/components/Applications/ui/screens/audio/wav_library_ui.c index 956e70285..590b86155 100644 --- a/firmware_p4/components/Applications/ui/screens/audio/wav_library_ui.c +++ b/firmware_p4/components/Applications/ui/screens/audio/wav_library_ui.c @@ -29,6 +29,7 @@ #include "ui_feedback.h" #include "mp3_player_ui.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #include "wav_player_ui.h" @@ -327,7 +328,7 @@ static void build_list(void) { lv_obj_t *cont = lv_obj_create(s_screen); s_list = cont; - lv_obj_set_size(cont, lv_pct(100), LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); + lv_obj_set_size(cont, lv_pct(100), ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); lv_obj_align(cont, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(cont, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(cont, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/audio/wav_player_ui.c b/firmware_p4/components/Applications/ui/screens/audio/wav_player_ui.c index bb4d0fd4c..1240722d5 100644 --- a/firmware_p4/components/Applications/ui/screens/audio/wav_player_ui.c +++ b/firmware_p4/components/Applications/ui/screens/audio/wav_player_ui.c @@ -32,6 +32,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #include "wav_library_ui.h" @@ -559,7 +560,7 @@ void ui_wav_player_open(void) { lv_obj_t *body = lv_obj_create(s_screen); lv_obj_remove_style_all(body); - lv_obj_set_size(body, 216, LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); + lv_obj_set_size(body, 216, ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); lv_obj_align(body, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_flex_flow(body, LV_FLEX_FLOW_COLUMN); diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_beacon_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_beacon_ui.c index 95b9fdefb..cf84a3b15 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_beacon_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_beacon_ui.c @@ -22,6 +22,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #define SPAM_TICK_MS 120 @@ -117,7 +118,7 @@ void ui_beacon_spam_open(void) { ui_chrome_footer(s_screen, "BACK Stop"); lv_obj_t *body = lv_obj_create(s_screen); - lv_obj_set_size(body, BODY_W, BODY_H); + lv_obj_set_size(body, lv_pct(100), ui_screen_h() - UI_CHROME_HEADER_H); lv_obj_align(body, LV_ALIGN_TOP_LEFT, 0, UI_CHROME_HEADER_H); lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_style_bg_opa(body, LV_OPA_TRANSP, 0); diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_companion_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_companion_ui.c index 7818261fa..5211a8dee 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_companion_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_companion_ui.c @@ -24,6 +24,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" #include "waves_ui.h" @@ -91,7 +92,7 @@ static void pop_in(lv_obj_t *obj, int target_px, uint32_t ms) { static lv_obj_t *make_body(lv_obj_t *parent) { lv_obj_t *b = lv_obj_create(parent); lv_obj_remove_flag(b, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_set_size(b, LCD_H_RES, LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); + lv_obj_set_size(b, lv_pct(100), ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); lv_obj_align(b, LV_ALIGN_TOP_LEFT, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(b, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(b, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_flood_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_flood_ui.c index da526fe1a..deaca7656 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_flood_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_flood_ui.c @@ -30,6 +30,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" static const char *TAG = "BLE_FLOOD_UI"; @@ -148,7 +149,7 @@ void ui_ble_flood_open(void) { lv_obj_t *body = lv_obj_create(s_screen); lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_set_size(body, LCD_H_RES, LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); + lv_obj_set_size(body, lv_pct(100), ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); lv_obj_align(body, LV_ALIGN_TOP_LEFT, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(body, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(body, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_keyboard_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_keyboard_ui.c index 2066467cb..4254ae67d 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_keyboard_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_keyboard_ui.c @@ -26,6 +26,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" #include "waves_ui.h" @@ -91,7 +92,7 @@ static lv_obj_t *lit_panel(lv_obj_t *parent, int w, int h) { static lv_obj_t *make_body(lv_obj_t *parent) { lv_obj_t *b = lv_obj_create(parent); lv_obj_remove_flag(b, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_set_size(b, LCD_H_RES, LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); + lv_obj_set_size(b, lv_pct(100), ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); lv_obj_align(b, LV_ALIGN_TOP_LEFT, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(b, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(b, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_mouse_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_mouse_ui.c index f7fe43c91..725f46d66 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_mouse_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_mouse_ui.c @@ -24,6 +24,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" #include "waves_ui.h" @@ -294,7 +295,7 @@ void ui_ble_mouse_open(void) { lv_obj_t *body = lv_obj_create(s_mouse_screen); lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_set_size(body, LCD_H_RES, LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); + lv_obj_set_size(body, lv_pct(100), ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); lv_obj_align(body, LV_ALIGN_TOP_LEFT, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(body, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(body, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_radio_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_radio_ui.c index 39a565410..587b0665b 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_radio_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_radio_ui.c @@ -25,6 +25,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #define RADIO_ICON "/assets/icons/bluetooth.bin" @@ -32,7 +33,7 @@ #define BLE_ADDR_LEN 6 #define MX 10 -#define CONTENT_W (LCD_H_RES - 2 * MX) +#define CONTENT_W (ui_screen_w() - 2 * MX) #define CARD_Y 50 #define CARD_H 58 #define ROWS_Y 124 diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_skimmer_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_skimmer_ui.c index 6becf5f8e..f44bef926 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_skimmer_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_skimmer_ui.c @@ -25,6 +25,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #include "waves_ui.h" @@ -73,7 +74,7 @@ static void stop_detector(void) { static lv_obj_t *body_container(void) { lv_obj_t *body = lv_obj_create(s_screen); - lv_obj_set_size(body, BODY_W, BODY_H); + lv_obj_set_size(body, lv_pct(100), ui_screen_h() - UI_CHROME_HEADER_H); lv_obj_align(body, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_style_bg_opa(body, LV_OPA_TRANSP, 0); diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_spam_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_spam_ui.c index d10040978..9eb834ded 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_spam_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_spam_ui.c @@ -28,6 +28,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" static const char *TAG = "BLE_SPAM_UI"; @@ -160,7 +161,7 @@ void ui_ble_spam_select_open(void) { lv_obj_t *grid = lv_obj_create(s_select_screen); lv_obj_remove_flag(grid, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_set_size(grid, LCD_H_RES, LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); + lv_obj_set_size(grid, lv_pct(100), ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); lv_obj_align(grid, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(grid, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(grid, 0, 0); @@ -272,7 +273,7 @@ void ui_ble_spam_open(void) { lv_obj_t *body = lv_obj_create(s_run_screen); lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_set_size(body, LCD_H_RES, LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); + lv_obj_set_size(body, lv_pct(100), ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); lv_obj_align(body, LV_ALIGN_TOP_LEFT, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(body, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(body, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_tracker_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_tracker_ui.c index 5c67893b4..69cf3e96f 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_tracker_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_tracker_ui.c @@ -25,6 +25,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #include "waves_ui.h" @@ -79,7 +80,7 @@ static void clear_screen_children(void) { static lv_obj_t *body_container(void) { lv_obj_t *body = lv_obj_create(s_screen); - lv_obj_set_size(body, BODY_W, BODY_H); + lv_obj_set_size(body, lv_pct(100), ui_screen_h() - UI_CHROME_HEADER_H); lv_obj_align(body, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_style_bg_opa(body, LV_OPA_TRANSP, 0); diff --git a/firmware_p4/components/Applications/ui/screens/connect_wifi/connect_wifi_ui.c b/firmware_p4/components/Applications/ui/screens/connect_wifi/connect_wifi_ui.c index dc6ac8b92..aeb9e925c 100644 --- a/firmware_p4/components/Applications/ui/screens/connect_wifi/connect_wifi_ui.c +++ b/firmware_p4/components/Applications/ui/screens/connect_wifi/connect_wifi_ui.c @@ -30,6 +30,7 @@ #include "msgbox_ui.h" #include "ui_chrome.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #include "waves_ui.h" @@ -53,7 +54,7 @@ static const char *TAG = "CONNECT_WIFI_UI"; #define COLOR_OPEN_HEX 0x00E676 #define COLOR_LOCK_HEX 0xF5B13D -#define NET_BODY_H (LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) +#define NET_BODY_H (ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) #define NET_ROW_H 46 #define NET_ROW_GAP 6 #define NET_SIDE_PAD 8 @@ -247,7 +248,7 @@ static void build_join_list(void) { ui_chrome_header(s_screen, "Networks", "/assets/icons/wifi_find.bin"); lv_obj_t *col = lv_obj_create(s_screen); - lv_obj_set_size(col, LCD_H_RES, NET_BODY_H); + lv_obj_set_size(col, ui_screen_w(), NET_BODY_H); lv_obj_align(col, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(col, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(col, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/dev/dev_console_ui.c b/firmware_p4/components/Applications/ui/screens/dev/dev_console_ui.c index cdfe436ba..4b00a3971 100644 --- a/firmware_p4/components/Applications/ui/screens/dev/dev_console_ui.c +++ b/firmware_p4/components/Applications/ui/screens/dev/dev_console_ui.c @@ -29,6 +29,7 @@ #include "terminal_ui.h" #include "ui_chrome.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #include "wifi_service.h" @@ -45,15 +46,15 @@ #define BODY_BOTTOM_PAD 4 #define RIGHT_GUTTER 16 #define BODY_Y (UI_CHROME_HEADER_H + BODY_TOP_PAD) -#define TERM_W (LCD_H_RES - BODY_X - RIGHT_GUTTER) -#define TERM_H (LCD_V_RES - BODY_Y - UI_CHROME_FOOTER_H - BODY_BOTTOM_PAD) +#define TERM_W (ui_screen_w() - BODY_X - RIGHT_GUTTER) +#define TERM_H (ui_screen_h() - BODY_Y - UI_CHROME_FOOTER_H - BODY_BOTTOM_PAD) -#define SCROLL_TRACK_X 227 +#define SCROLL_TRACK_X (ui_screen_w() - 13) #define SCROLL_TRACK_Y 54 -#define SCROLL_TRACK_LEN 232 +#define SCROLL_TRACK_LEN (ui_screen_h() - SCROLL_TRACK_Y - 34) #define SCROLL_LINE_W 3 #define SCROLL_DASH 4 -#define SCROLL_THUMB_X 223 +#define SCROLL_THUMB_X (ui_screen_w() - 17) #define SCROLL_THUMB_H 45 #define LINE_STEP 24 @@ -262,7 +263,11 @@ static void build_screen(void) { lv_obj_set_style_bg_opa(s_term, LV_OPA_TRANSP, LV_PART_CURSOR); lv_obj_set_style_border_width(s_term, 0, LV_PART_CURSOR); - static lv_point_precise_t track_pts[2] = {{0, 0}, {0, SCROLL_TRACK_LEN}}; + static lv_point_precise_t track_pts[2]; + track_pts[0].x = 0; + track_pts[0].y = 0; + track_pts[1].x = 0; + track_pts[1].y = SCROLL_TRACK_LEN; lv_obj_t *track = lv_line_create(s_screen); lv_line_set_points(track, track_pts, 2); lv_obj_set_pos(track, SCROLL_TRACK_X, SCROLL_TRACK_Y); diff --git a/firmware_p4/components/Applications/ui/screens/dev/scripts_ui.c b/firmware_p4/components/Applications/ui/screens/dev/scripts_ui.c index 905fd62de..3c8642d4f 100644 --- a/firmware_p4/components/Applications/ui/screens/dev/scripts_ui.c +++ b/firmware_p4/components/Applications/ui/screens/dev/scripts_ui.c @@ -30,6 +30,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" @@ -55,8 +56,8 @@ static const char *TAG = "SCRIPTS_UI"; #define LIST_X 6 #define LIST_Y 46 #define LIST_GUTTER 16 -#define LIST_W (LCD_H_RES - LIST_X - LIST_GUTTER) -#define LIST_BODY_H (LCD_V_RES - LIST_Y - UI_CHROME_FOOTER_H - 4) +#define LIST_W (ui_screen_w() - LIST_X - LIST_GUTTER) +#define LIST_BODY_H (ui_screen_h() - LIST_Y - UI_CHROME_FOOTER_H - 4) #define ROW_H 26 #define ROW_GAP 4 #define ROW_RADIUS 8 @@ -69,12 +70,12 @@ static const char *TAG = "SCRIPTS_UI"; #define BADGE_PAD_VER 1 #define BADGE_TINT_OPA LV_OPA_20 -#define SCROLL_TRACK_X 227 +#define SCROLL_TRACK_X (ui_screen_w() - 13) #define SCROLL_TRACK_Y 54 -#define SCROLL_TRACK_LEN 232 +#define SCROLL_TRACK_LEN (ui_screen_h() - SCROLL_TRACK_Y - 34) #define SCROLL_TRACK_WIDTH 3 #define SCROLL_DASH 4 -#define SCROLL_THUMB_X 223 +#define SCROLL_THUMB_X (ui_screen_w() - 17) #define SCROLL_THUMB_FALLBACK_H 45 #define SCROLL_THUMB_SRC "/assets/icons/drag_indicator.bin" @@ -495,7 +496,11 @@ static void build_browser(void) { s_rows[i] = row; } - static lv_point_precise_t scroll_pts[2] = {{0, 0}, {0, SCROLL_TRACK_LEN}}; + static lv_point_precise_t scroll_pts[2]; + scroll_pts[0].x = 0; + scroll_pts[0].y = 0; + scroll_pts[1].x = 0; + scroll_pts[1].y = SCROLL_TRACK_LEN; lv_obj_t *track = lv_line_create(s_screen); lv_line_set_points(track, scroll_pts, 2); lv_obj_set_pos(track, SCROLL_TRACK_X, SCROLL_TRACK_Y); diff --git a/firmware_p4/components/Applications/ui/screens/files/files_ui.c b/firmware_p4/components/Applications/ui/screens/files/files_ui.c index 8ab545d7d..faa19bc6d 100644 --- a/firmware_p4/components/Applications/ui/screens/files/files_ui.c +++ b/firmware_p4/components/Applications/ui/screens/files/files_ui.c @@ -30,6 +30,7 @@ #include "storage_assets.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "image_viewer_ui.h" #include "mp3_player_ui.h" #include "mp4_player_ui.h" @@ -53,7 +54,7 @@ static const char *TAG = "FILES_UI"; #define TILE_H 64 #define GLABEL_H 28 -#define ROW_CONTENT_W (LCD_H_RES - 16) +#define ROW_CONTENT_W (ui_screen_w() - 16) #define ROW_NAME_X 36 #define ROW_NAME_W_FILE (ROW_CONTENT_W - ROW_NAME_X - 52) #define ROW_NAME_W_DIR (ROW_CONTENT_W - ROW_NAME_X - 24) @@ -542,7 +543,7 @@ static void build_header(void) { lv_obj_t *hdr = lv_obj_create(s_screen); lv_obj_remove_flag(hdr, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(hdr, LV_OBJ_FLAG_CLICKABLE); - lv_obj_set_size(hdr, LCD_H_RES, HEADER_H); + lv_obj_set_size(hdr, ui_screen_w(), HEADER_H); lv_obj_align(hdr, LV_ALIGN_TOP_LEFT, 0, 0); lv_obj_set_style_radius(hdr, 0, 0); lv_obj_set_style_bg_color(hdr, current_theme.bg_secondary, 0); @@ -586,7 +587,7 @@ static void build_pathbar(void) { lv_obj_t *bar = lv_obj_create(s_screen); lv_obj_remove_flag(bar, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(bar, LV_OBJ_FLAG_CLICKABLE); - lv_obj_set_size(bar, LCD_H_RES, PATH_H); + lv_obj_set_size(bar, ui_screen_w(), PATH_H); lv_obj_align(bar, LV_ALIGN_TOP_LEFT, 0, HEADER_H); lv_obj_set_style_radius(bar, 0, 0); lv_obj_set_style_bg_color(bar, lv_color_hex(0x0A0710), 0); @@ -657,12 +658,12 @@ static lv_obj_t *make_row_pool(lv_obj_t *parent, int j) { } static void build_list(void) { - int list_h = LCD_V_RES - CONTENT_Y - FOOTER_H - PEEK_H - 8; + int list_h = ui_screen_h() - CONTENT_Y - FOOTER_H - PEEK_H - 8; lv_obj_t *wrap = lv_obj_create(s_screen); lv_obj_remove_flag(wrap, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(wrap, LV_OBJ_FLAG_CLICKABLE); - lv_obj_set_size(wrap, LCD_H_RES, list_h); + lv_obj_set_size(wrap, ui_screen_w(), list_h); lv_obj_align(wrap, LV_ALIGN_TOP_LEFT, 0, CONTENT_Y); lv_obj_set_style_bg_opa(wrap, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(wrap, 0, 0); @@ -702,12 +703,12 @@ static lv_obj_t *make_tile_pool(lv_obj_t *parent, int j) { } static void build_grid(void) { - int grid_h = LCD_V_RES - CONTENT_Y - FOOTER_H - GLABEL_H; + int grid_h = ui_screen_h() - CONTENT_Y - FOOTER_H - GLABEL_H; lv_obj_t *g = lv_obj_create(s_screen); lv_obj_remove_flag(g, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(g, LV_OBJ_FLAG_CLICKABLE); - lv_obj_set_size(g, LCD_H_RES, grid_h); + lv_obj_set_size(g, ui_screen_w(), grid_h); lv_obj_align(g, LV_ALIGN_TOP_LEFT, 0, CONTENT_Y); lv_obj_set_style_bg_opa(g, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(g, 0, 0); @@ -725,7 +726,7 @@ static void build_grid(void) { lv_obj_t *gl = lv_obj_create(s_screen); lv_obj_remove_flag(gl, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(gl, LV_OBJ_FLAG_CLICKABLE); - lv_obj_set_size(gl, LCD_H_RES, GLABEL_H); + lv_obj_set_size(gl, ui_screen_w(), GLABEL_H); lv_obj_align(gl, LV_ALIGN_BOTTOM_LEFT, 0, -FOOTER_H); lv_obj_set_style_radius(gl, 0, 0); lv_obj_set_style_bg_opa(gl, LV_OPA_TRANSP, 0); @@ -754,7 +755,7 @@ static void build_peek(void) { lv_obj_t *pk = lv_obj_create(s_screen); lv_obj_remove_flag(pk, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(pk, LV_OBJ_FLAG_CLICKABLE); - lv_obj_set_size(pk, LCD_H_RES - 16, PEEK_H); + lv_obj_set_size(pk, ui_screen_w() - 16, PEEK_H); lv_obj_align(pk, LV_ALIGN_BOTTOM_MID, 0, -(FOOTER_H + 4)); lv_obj_set_style_radius(pk, 11, 0); lv_obj_set_style_bg_color(pk, lv_color_hex(COL_RAISE), 0); @@ -809,7 +810,7 @@ static void build_footer(const char *hint) { lv_obj_t *ft = lv_obj_create(s_screen); lv_obj_remove_flag(ft, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(ft, LV_OBJ_FLAG_CLICKABLE); - lv_obj_set_size(ft, LCD_H_RES, FOOTER_H); + lv_obj_set_size(ft, ui_screen_w(), FOOTER_H); lv_obj_align(ft, LV_ALIGN_BOTTOM_LEFT, 0, 0); lv_obj_set_style_radius(ft, 0, 0); lv_obj_set_style_bg_color(ft, current_theme.bg_secondary, 0); diff --git a/firmware_p4/components/Applications/ui/screens/files/usb_storage_ui.c b/firmware_p4/components/Applications/ui/screens/files/usb_storage_ui.c index 71c64cd3f..30fa72c97 100644 --- a/firmware_p4/components/Applications/ui/screens/files/usb_storage_ui.c +++ b/firmware_p4/components/Applications/ui/screens/files/usb_storage_ui.c @@ -27,13 +27,14 @@ #include "sys_prio.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #include "usb_msc.h" static const char *TAG = "USB_STORAGE_UI"; -#define VIEW_W LCD_PANEL_W -#define VIEW_H LCD_PANEL_H +#define VIEW_W ui_screen_w() +#define VIEW_H ui_screen_h() #define COL_READY lv_color_hex(0x00BCD4) #define COL_CONNECTED lv_color_hex(0x00E676) diff --git a/firmware_p4/components/Applications/ui/screens/home/home_ui.c b/firmware_p4/components/Applications/ui/screens/home/home_ui.c index c6dd4f31b..038d1ff8a 100644 --- a/firmware_p4/components/Applications/ui/screens/home/home_ui.c +++ b/firmware_p4/components/Applications/ui/screens/home/home_ui.c @@ -30,20 +30,21 @@ #include "menu_ui.h" #include "sys_time.h" #include "ui_feedback.h" +#include "ui_metrics.h" #include "ui_manager.h" #include "ui_theme.h" static const char *TAG = "HOME_UI"; #define HOME_HEADER_HEIGHT_PCT 9 -#define HOME_HEADER_HEIGHT ((LCD_V_RES * HOME_HEADER_HEIGHT_PCT) / 100) +#define HOME_HEADER_HEIGHT ((ui_screen_h() * HOME_HEADER_HEIGHT_PCT) / 100) #define HOME_ART_ASSET "/assets/img/image.bin" #define HOME_DATE_FONT "A:assets/fonts/Inter.bin" #define HOME_PAD 10 #define HOME_ROW_GAP 8 -#define HOME_INNER_W (LCD_H_RES - 2 * HOME_PAD) +#define HOME_INNER_W (ui_screen_w() - 2 * HOME_PAD) #define HOME_ART_MAX_W 210 #define HOME_ART_MAX_H 132 #define HOME_FLOAT_AMP 5 @@ -328,8 +329,9 @@ void ui_home_open(void) { header_ui_create(s_screen_home); lv_obj_t *content = lv_obj_create(s_screen_home); - lv_obj_set_size(content, LCD_H_RES, LCD_V_RES - HOME_HEADER_HEIGHT); - lv_obj_align(content, LV_ALIGN_TOP_MID, 0, HOME_HEADER_HEIGHT); + int32_t header_h = HOME_HEADER_HEIGHT; + lv_obj_set_size(content, ui_screen_w(), ui_screen_h() - header_h); + lv_obj_align(content, LV_ALIGN_TOP_MID, 0, header_h); lv_obj_remove_flag(content, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_style_bg_opa(content, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(content, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/images/image_viewer_ui.c b/firmware_p4/components/Applications/ui/screens/images/image_viewer_ui.c index 0b0868d18..b6d2893a6 100644 --- a/firmware_p4/components/Applications/ui/screens/images/image_viewer_ui.c +++ b/firmware_p4/components/Applications/ui/screens/images/image_viewer_ui.c @@ -30,11 +30,12 @@ #include "st7789.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" static const char *TAG = "IMG_VIEWER"; -#define VIEW_W LCD_H_RES -#define VIEW_H LCD_V_RES +#define VIEW_W ui_screen_w() +#define VIEW_H ui_screen_h() #define HDR_H 26 #define FTR_H 24 #define IMG_AREA_H (VIEW_H - HDR_H - FTR_H) diff --git a/firmware_p4/components/Applications/ui/screens/infrared/ir_raw_ui.c b/firmware_p4/components/Applications/ui/screens/infrared/ir_raw_ui.c index 5b8728caa..72bdcb13c 100644 --- a/firmware_p4/components/Applications/ui/screens/infrared/ir_raw_ui.c +++ b/firmware_p4/components/Applications/ui/screens/infrared/ir_raw_ui.c @@ -26,6 +26,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" @@ -34,7 +35,7 @@ #define FOOTER "OK replay BACK exit" #define MX 8 -#define CONTENT_W (LCD_H_RES - 2 * MX) +#define CONTENT_W (ui_screen_w() - 2 * MX) #define CARD1_Y 50 #define CARD1_H 76 diff --git a/firmware_p4/components/Applications/ui/screens/infrared/ir_saved_ui.c b/firmware_p4/components/Applications/ui/screens/infrared/ir_saved_ui.c index 43e7683db..a0d4dcc36 100644 --- a/firmware_p4/components/Applications/ui/screens/infrared/ir_saved_ui.c +++ b/firmware_p4/components/Applications/ui/screens/infrared/ir_saved_ui.c @@ -34,6 +34,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" static const char *TAG = "IR_SAVED_UI"; @@ -249,7 +250,7 @@ static void build_files_list(void) { lv_obj_t *cont = lv_obj_create(s_screen); s_file_list = cont; lv_obj_set_size( - cont, LCD_H_RES - IRC_LEFT - IRC_GUTTER, LCD_V_RES - IRC_TOP_Y - UI_CHROME_FOOTER_H - 4); + cont, ui_screen_w() - IRC_LEFT - IRC_GUTTER, ui_screen_h() - IRC_TOP_Y - UI_CHROME_FOOTER_H - 4); lv_obj_align(cont, LV_ALIGN_TOP_LEFT, IRC_LEFT, IRC_TOP_Y); lv_obj_set_style_bg_opa(cont, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(cont, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/lora/lora_channels_ui.c b/firmware_p4/components/Applications/ui/screens/lora/lora_channels_ui.c index 0ed65ba58..c78643597 100644 --- a/firmware_p4/components/Applications/ui/screens/lora/lora_channels_ui.c +++ b/firmware_p4/components/Applications/ui/screens/lora/lora_channels_ui.c @@ -32,6 +32,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #define HDR_TITLE "CHANNELS" @@ -39,7 +40,7 @@ #define FOOTER_HINT "UP/DN OK RENAME RIGHT OFF BACK" #define BODY_TOP UI_CHROME_HEADER_H -#define BODY_H (LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) +#define BODY_H (ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) #define GRID_PAD 7 #define GRID_GAP 6 @@ -437,7 +438,7 @@ void ui_lora_channels_open(void) { ui_chrome_header(s_screen, HDR_TITLE, HDR_ICON); lv_obj_t *grid = lv_obj_create(s_screen); - lv_obj_set_size(grid, LCD_H_RES, BODY_H); + lv_obj_set_size(grid, ui_screen_w(), BODY_H); lv_obj_align(grid, LV_ALIGN_TOP_MID, 0, BODY_TOP); lv_obj_set_style_bg_opa(grid, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(grid, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/lora/lora_chat_ui.c b/firmware_p4/components/Applications/ui/screens/lora/lora_chat_ui.c index 79e11da9b..4b050ea48 100644 --- a/firmware_p4/components/Applications/ui/screens/lora/lora_chat_ui.c +++ b/firmware_p4/components/Applications/ui/screens/lora/lora_chat_ui.c @@ -37,6 +37,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" #include "waves_ui.h" @@ -457,7 +458,7 @@ static void build_nodes_list(void) { online++; s_node_list = lv_obj_create(s_screen); - lv_obj_set_size(s_node_list, lv_pct(100), LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); + lv_obj_set_size(s_node_list, lv_pct(100), ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); lv_obj_align(s_node_list, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(s_node_list, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(s_node_list, 0, 0); @@ -602,7 +603,7 @@ static void build_nodes_view(void) { lv_obj_set_flex_flow(wrap, LV_FLEX_FLOW_COLUMN); lv_obj_set_flex_align(wrap, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); lv_obj_align( - wrap, LV_ALIGN_CENTER, NODE_POS[i].x - LCD_H_RES / 2, NODE_POS[i].y - LCD_V_RES / 2); + wrap, LV_ALIGN_CENTER, NODE_POS[i].x - ui_screen_w() / 2, NODE_POS[i].y - ui_screen_h() / 2); s_node_pins[i] = make_badge(wrap, "/assets/icons/settings_input_antenna.bin", accent); @@ -624,7 +625,7 @@ static void build_nodes_view(void) { lv_obj_set_flex_flow(you_wrap, LV_FLEX_FLOW_COLUMN); lv_obj_set_flex_align(you_wrap, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); lv_obj_align( - you_wrap, LV_ALIGN_CENTER, MAP_CENTER_X - LCD_H_RES / 2, MAP_CENTER_Y - LCD_V_RES / 2); + you_wrap, LV_ALIGN_CENTER, MAP_CENTER_X - ui_screen_w() / 2, MAP_CENTER_Y - ui_screen_h() / 2); lv_obj_t *you_pin = make_badge(you_wrap, "/assets/icons/hub.bin", accent); lv_obj_set_size(you_pin, YOU_PIN_SZ, YOU_PIN_SZ); @@ -927,7 +928,7 @@ static void build_chat(void) { s_hint = ui_chrome_footer(s_screen, LV_SYMBOL_KEYBOARD " OK write BACK nodes"); s_chat_list = lv_obj_create(s_screen); - lv_obj_set_size(s_chat_list, LCD_H_RES, LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); + lv_obj_set_size(s_chat_list, ui_screen_w(), ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); lv_obj_align(s_chat_list, LV_ALIGN_TOP_LEFT, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(s_chat_list, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(s_chat_list, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/lora/lora_position_ui.c b/firmware_p4/components/Applications/ui/screens/lora/lora_position_ui.c index 0b7581757..36c161d80 100644 --- a/firmware_p4/components/Applications/ui/screens/lora/lora_position_ui.c +++ b/firmware_p4/components/Applications/ui/screens/lora/lora_position_ui.c @@ -31,6 +31,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" @@ -39,7 +40,7 @@ #define FOOTER_HINT "MOVE " LV_SYMBOL_RIGHT " EDIT OK BCAST BACK" #define BODY_TOP UI_CHROME_HEADER_H -#define BODY_H (LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) +#define BODY_H (ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) #define ROOT_PAD 8 #define ROOT_GAP 7 @@ -361,7 +362,7 @@ static void build_placeholder(void) { lv_obj_t *msg = lv_label_create(s_screen); lv_label_set_long_mode(msg, LV_LABEL_LONG_WRAP); - lv_obj_set_width(msg, LCD_H_RES - 2 * ROOT_PAD); + lv_obj_set_width(msg, ui_screen_w() - 2 * ROOT_PAD); lv_label_set_text(msg, "Start a protocol first"); lv_obj_set_style_text_font(msg, &lv_font_montserrat_14, 0); lv_obj_set_style_text_color(msg, current_theme.text_secondary, 0); @@ -417,7 +418,7 @@ void ui_lora_position_open(void) { lv_obj_t *root = lv_obj_create(s_screen); lv_obj_remove_flag(root, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_set_size(root, LCD_H_RES, BODY_H); + lv_obj_set_size(root, ui_screen_w(), BODY_H); lv_obj_align(root, LV_ALIGN_TOP_MID, 0, BODY_TOP); lv_obj_set_style_bg_opa(root, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(root, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/lora/lora_securedm_ui.c b/firmware_p4/components/Applications/ui/screens/lora/lora_securedm_ui.c index b2275999e..3ea447258 100644 --- a/firmware_p4/components/Applications/ui/screens/lora/lora_securedm_ui.c +++ b/firmware_p4/components/Applications/ui/screens/lora/lora_securedm_ui.c @@ -32,6 +32,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" @@ -41,7 +42,7 @@ #define FOOTER_CHAT "OK WRITE UP/DOWN SCROLL BACK" #define BODY_TOP UI_CHROME_HEADER_H -#define BODY_BOT (LCD_V_RES - UI_CHROME_FOOTER_H) +#define BODY_BOT (ui_screen_h() - UI_CHROME_FOOTER_H) #define BANNER_H 36 #define INPUT_H 32 @@ -241,7 +242,7 @@ static void build_banner(lv_obj_t *parent, const char *name, const char *sub, bo lv_obj_t *banner = lv_obj_create(parent); lv_obj_remove_flag(banner, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_set_size(banner, LCD_H_RES, BANNER_H); + lv_obj_set_size(banner, ui_screen_w(), BANNER_H); lv_obj_align(banner, LV_ALIGN_TOP_MID, 0, BODY_TOP); lv_obj_set_style_radius(banner, 0, 0); lv_obj_set_style_bg_color(banner, acc, 0); @@ -355,7 +356,7 @@ static void add_bubble(lv_obj_t *list, bool outgoing, const char *text, const ch static void build_list_container(lv_obj_t *parent) { s_list = lv_obj_create(parent); - lv_obj_set_size(s_list, LCD_H_RES, BODY_BOT - INPUT_H - (BODY_TOP + BANNER_H)); + lv_obj_set_size(s_list, ui_screen_w(), BODY_BOT - INPUT_H - (BODY_TOP + BANNER_H)); lv_obj_align(s_list, LV_ALIGN_TOP_MID, 0, BODY_TOP + BANNER_H); lv_obj_set_style_bg_opa(s_list, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(s_list, 0, 0); @@ -487,7 +488,7 @@ static void build_thread_list(lv_obj_t *parent) { static void build_input(lv_obj_t *parent, const char *placeholder) { lv_obj_t *strip = lv_obj_create(parent); lv_obj_remove_flag(strip, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_set_size(strip, LCD_H_RES, INPUT_H); + lv_obj_set_size(strip, ui_screen_w(), INPUT_H); lv_obj_align(strip, LV_ALIGN_TOP_MID, 0, BODY_BOT - INPUT_H); lv_obj_set_style_radius(strip, 0, 0); lv_obj_set_style_bg_opa(strip, LV_OPA_TRANSP, 0); diff --git a/firmware_p4/components/Applications/ui/screens/lora/lora_telemetry_ui.c b/firmware_p4/components/Applications/ui/screens/lora/lora_telemetry_ui.c index 82f0f0be3..474a7408d 100644 --- a/firmware_p4/components/Applications/ui/screens/lora/lora_telemetry_ui.c +++ b/firmware_p4/components/Applications/ui/screens/lora/lora_telemetry_ui.c @@ -26,6 +26,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" @@ -36,7 +37,7 @@ #define FOOTER_HINT "UP/DOWN OK NODE BACK" #define BODY_TOP UI_CHROME_HEADER_H -#define BODY_H (LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) +#define BODY_H (ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) #define ROOT_PAD 8 #define ROOT_GAP 7 @@ -445,7 +446,7 @@ void ui_lora_telemetry_open(void) { lv_obj_t *root = lv_obj_create(s_screen); lv_obj_remove_flag(root, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_set_size(root, LCD_H_RES, BODY_H); + lv_obj_set_size(root, ui_screen_w(), BODY_H); lv_obj_align(root, LV_ALIGN_TOP_MID, 0, BODY_TOP); lv_obj_set_style_bg_opa(root, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(root, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/lora/lora_traceroute_ui.c b/firmware_p4/components/Applications/ui/screens/lora/lora_traceroute_ui.c index 8a0d03b2f..2eede22bb 100644 --- a/firmware_p4/components/Applications/ui/screens/lora/lora_traceroute_ui.c +++ b/firmware_p4/components/Applications/ui/screens/lora/lora_traceroute_ui.c @@ -28,6 +28,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #include "waves_ui.h" @@ -312,7 +313,7 @@ static void build_picker(void) { } s_pick_list = lv_obj_create(s_screen); - lv_obj_set_size(s_pick_list, LCD_H_RES, LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); + lv_obj_set_size(s_pick_list, ui_screen_w(), ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); lv_obj_align(s_pick_list, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(s_pick_list, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(s_pick_list, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/nfc/card_emu_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/card_emu_ui.c index ca5f24970..7b8605e0e 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/card_emu_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/card_emu_ui.c @@ -24,6 +24,7 @@ #include "page_dots_ui.h" #include "ui_chrome.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #define REFRESH_MS 33 @@ -238,7 +239,7 @@ static void emulate_start(const nfc_sim_card_t *card) { int H = lv_display_get_vertical_resolution(NULL); if (H < 200) - H = 320; + H = ui_screen_h(); int top_y = H * 8 / 100; if (top_y < 4) top_y = 4; diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_bankcard_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_bankcard_ui.c index 825e3dde3..286d68d22 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_bankcard_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_bankcard_ui.c @@ -20,11 +20,12 @@ #include "ui_chrome.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #define MX 8 -#define BODY_H (LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) -#define CONTENT_W (LCD_H_RES - 2 * MX) +#define BODY_H (ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) +#define CONTENT_W (ui_screen_w() - 2 * MX) #define ROW_GAP 6 #define CARD_H 120 @@ -174,7 +175,7 @@ void ui_nfc_bankcard_open(void) { lv_obj_t *body = lv_obj_create(s_screen); lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(body, LV_OBJ_FLAG_CLICKABLE); - lv_obj_set_size(body, LCD_H_RES, BODY_H); + lv_obj_set_size(body, ui_screen_w(), BODY_H); lv_obj_align(body, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(body, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(body, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_desfire_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_desfire_ui.c index cb05949ed..d38a37e1e 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_desfire_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_desfire_ui.c @@ -20,12 +20,13 @@ #include "ui_chrome.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" #define MX 8 -#define BODY_H (LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) -#define CONTENT_W (LCD_H_RES - 2 * MX) +#define BODY_H (ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) +#define CONTENT_W (ui_screen_w() - 2 * MX) #define ROW_GAP 6 #define CARD_H 74 @@ -211,7 +212,7 @@ void ui_nfc_desfire_open(void) { lv_obj_t *body = lv_obj_create(s_screen); lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(body, LV_OBJ_FLAG_CLICKABLE); - lv_obj_set_size(body, LCD_H_RES, BODY_H); + lv_obj_set_size(body, ui_screen_w(), BODY_H); lv_obj_align(body, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(body, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(body, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_emulate_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_emulate_ui.c index 4541bef5f..9e544de74 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_emulate_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_emulate_ui.c @@ -28,6 +28,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" @@ -168,7 +169,7 @@ static void wallet_build(void) { s_body = lv_obj_create(s_screen); lv_obj_remove_flag(s_body, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(s_body, LV_OBJ_FLAG_CLICKABLE); - lv_obj_set_size(s_body, lv_pct(100), LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); + lv_obj_set_size(s_body, lv_pct(100), ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); lv_obj_align(s_body, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(s_body, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(s_body, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_felica_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_felica_ui.c index 3cbbd9f7d..fb8417caa 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_felica_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_felica_ui.c @@ -21,11 +21,12 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #define MX 8 -#define BODY_H (LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) -#define CONTENT_W (LCD_H_RES - 2 * MX) +#define BODY_H (ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) +#define CONTENT_W (ui_screen_w() - 2 * MX) #define ROW_GAP 6 #define SVC_COUNT 3 @@ -238,7 +239,7 @@ void ui_nfc_felica_open(void) { lv_obj_t *body = lv_obj_create(s_screen); lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(body, LV_OBJ_FLAG_CLICKABLE); - lv_obj_set_size(body, LCD_H_RES, BODY_H); + lv_obj_set_size(body, ui_screen_w(), BODY_H); lv_obj_align(body, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(body, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(body, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_iso15693_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_iso15693_ui.c index 20ea23886..7875f65c5 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_iso15693_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_iso15693_ui.c @@ -23,11 +23,12 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #define MX 8 -#define BODY_H (LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) -#define CONTENT_W (LCD_H_RES - 2 * MX) +#define BODY_H (ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) +#define CONTENT_W (ui_screen_w() - 2 * MX) #define ROW_GAP 7 #define BLOCK_COUNT 28 @@ -267,7 +268,7 @@ void ui_nfc_iso15693_open(void) { lv_obj_t *body = lv_obj_create(s_screen); lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(body, LV_OBJ_FLAG_CLICKABLE); - lv_obj_set_size(body, LCD_H_RES, BODY_H); + lv_obj_set_size(body, ui_screen_w(), BODY_H); lv_obj_align(body, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(body, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(body, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_keydict_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_keydict_ui.c index 7493f3e87..7308d3a1d 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_keydict_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_keydict_ui.c @@ -21,11 +21,12 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #define MX 8 -#define BODY_H (LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) -#define CONTENT_W (LCD_H_RES - 2 * MX) +#define BODY_H (ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) +#define CONTENT_W (ui_screen_w() - 2 * MX) #define ROW_GAP 5 #define KEY_COUNT 4 @@ -239,7 +240,7 @@ void ui_nfc_keydict_open(void) { lv_obj_t *body = lv_obj_create(s_screen); lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(body, LV_OBJ_FLAG_CLICKABLE); - lv_obj_set_size(body, LCD_H_RES, BODY_H); + lv_obj_set_size(body, ui_screen_w(), BODY_H); lv_obj_align(body, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(body, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(body, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_ndef_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_ndef_ui.c index f90600ec3..f7da9d1fa 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_ndef_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_ndef_ui.c @@ -21,11 +21,12 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #define MX 8 -#define BODY_H (LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) -#define CONTENT_W (LCD_H_RES - 2 * MX) +#define BODY_H (ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) +#define CONTENT_W (ui_screen_w() - 2 * MX) #define ROW_GAP 6 #define REC_COUNT 3 @@ -223,7 +224,7 @@ void ui_nfc_ndef_open(void) { lv_obj_t *body = lv_obj_create(s_screen); lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(body, LV_OBJ_FLAG_CLICKABLE); - lv_obj_set_size(body, LCD_H_RES, BODY_H); + lv_obj_set_size(body, ui_screen_w(), BODY_H); lv_obj_align(body, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(body, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(body, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_p2p_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_p2p_ui.c index 147c18931..f3538c52d 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_p2p_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_p2p_ui.c @@ -23,12 +23,13 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" #define MX 8 -#define BODY_H (LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) -#define CONTENT_W (LCD_H_RES - 2 * MX) +#define BODY_H (ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) +#define CONTENT_W (ui_screen_w() - 2 * MX) #define ROW_GAP 8 #define DEV_ROW_H 62 @@ -309,7 +310,7 @@ void ui_nfc_p2p_open(void) { lv_obj_t *body = lv_obj_create(s_screen); lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(body, LV_OBJ_FLAG_CLICKABLE); - lv_obj_set_size(body, LCD_H_RES, BODY_H); + lv_obj_set_size(body, ui_screen_w(), BODY_H); lv_obj_align(body, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(body, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(body, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_saved_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_saved_ui.c index a75016ca8..b1c1a62f4 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_saved_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_saved_ui.c @@ -31,6 +31,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #define TICK_MS 50 @@ -356,7 +357,7 @@ void ui_nfc_saved_open(void) { ui_chrome_footer(s_screen, "BACK Back"); } else { s_cont = lv_obj_create(s_screen); - lv_obj_set_size(s_cont, lv_pct(100), LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); + lv_obj_set_size(s_cont, lv_pct(100), ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); lv_obj_align(s_cont, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(s_cont, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(s_cont, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_ultralight_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_ultralight_ui.c index 0e62992ee..da253687c 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_ultralight_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_ultralight_ui.c @@ -20,11 +20,12 @@ #include "ui_chrome.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #define MX 8 -#define BODY_H (LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) -#define CONTENT_W (LCD_H_RES - 2 * MX) +#define BODY_H (ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) +#define CONTENT_W (ui_screen_w() - 2 * MX) #define ROW_GAP 5 #define CHIP_H 16 @@ -156,7 +157,7 @@ void ui_nfc_ultralight_open(void) { lv_obj_t *body = lv_obj_create(s_screen); lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(body, LV_OBJ_FLAG_CLICKABLE); - lv_obj_set_size(body, LCD_H_RES, BODY_H); + lv_obj_set_size(body, ui_screen_w(), BODY_H); lv_obj_align(body, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(body, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(body, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_write_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_write_ui.c index 097738efd..31faa436d 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_write_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_write_ui.c @@ -30,6 +30,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" @@ -43,7 +44,7 @@ #define SLOT_W 150 #define SLOT_H 72 #define SLOT_Y (ARROW_Y + 26) -#define SLOT_X ((LCD_H_RES - SLOT_W) / 2) +#define SLOT_X ((ui_screen_w() - SLOT_W) / 2) enum { WR_NONE, WR_PLACE, WR_WRITING, WR_DONE }; #define T_PLACE 1300 @@ -152,7 +153,7 @@ static void bench_build(void) { s_body = lv_obj_create(s_screen); lv_obj_remove_flag(s_body, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(s_body, LV_OBJ_FLAG_CLICKABLE); - lv_obj_set_size(s_body, lv_pct(100), LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); + lv_obj_set_size(s_body, lv_pct(100), ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); lv_obj_align(s_body, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(s_body, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(s_body, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/settings/battery_settings_ui.c b/firmware_p4/components/Applications/ui/screens/settings/battery_settings_ui.c index 0c0948a32..af8385faf 100644 --- a/firmware_p4/components/Applications/ui/screens/settings/battery_settings_ui.c +++ b/firmware_p4/components/Applications/ui/screens/settings/battery_settings_ui.c @@ -20,6 +20,7 @@ #include "battery_service.h" #include "ui_chrome.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" @@ -177,7 +178,7 @@ void ui_battery_settings_open(void) { lv_obj_t *stats = lv_obj_create(s_screen); lv_obj_remove_style_all(stats); - lv_obj_set_size(stats, 216, LV_SIZE_CONTENT); + lv_obj_set_size(stats, ui_screen_w() - 24, LV_SIZE_CONTENT); lv_obj_align(stats, LV_ALIGN_TOP_MID, 0, ARC_TOP_Y + ARC_SIZE + 16); lv_obj_remove_flag(stats, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_flex_flow(stats, LV_FLEX_FLOW_ROW); diff --git a/firmware_p4/components/Applications/ui/screens/settings/c5_status_ui.c b/firmware_p4/components/Applications/ui/screens/settings/c5_status_ui.c index 88cd110e3..df28d726d 100644 --- a/firmware_p4/components/Applications/ui/screens/settings/c5_status_ui.c +++ b/firmware_p4/components/Applications/ui/screens/settings/c5_status_ui.c @@ -27,11 +27,12 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" #define MX 8 -#define CONTENT_W (LCD_H_RES - 2 * MX) +#define CONTENT_W (ui_screen_w() - 2 * MX) #define INFO_Y 50 #define INFO_H 98 #define INFO_ROW_GAP 26 diff --git a/firmware_p4/components/Applications/ui/screens/settings/led_ctrl_ui.c b/firmware_p4/components/Applications/ui/screens/settings/led_ctrl_ui.c index c44dc8d36..d89e544ab 100644 --- a/firmware_p4/components/Applications/ui/screens/settings/led_ctrl_ui.c +++ b/firmware_p4/components/Applications/ui/screens/settings/led_ctrl_ui.c @@ -24,10 +24,11 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #define MX 8 -#define CONTENT_W (LCD_H_RES - 2 * MX) +#define CONTENT_W (ui_screen_w() - 2 * MX) #define PREVIEW_Y 50 #define PREVIEW_D 72 diff --git a/firmware_p4/components/Applications/ui/screens/settings/sd_health_ui.c b/firmware_p4/components/Applications/ui/screens/settings/sd_health_ui.c index 44e46fbda..0204ff75b 100644 --- a/firmware_p4/components/Applications/ui/screens/settings/sd_health_ui.c +++ b/firmware_p4/components/Applications/ui/screens/settings/sd_health_ui.c @@ -25,6 +25,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" #include "vfs_core.h" @@ -38,7 +39,7 @@ #define FOOTER_TXT "OK REMOUNT R RETEST BACK" #define MX 8 -#define CONTENT_W (240 - 2 * MX) +#define CONTENT_W (ui_screen_w() - 2 * MX) #define COL_ACC2 0xB89AFF diff --git a/firmware_p4/components/Applications/ui/screens/settings/storage_settings_ui.c b/firmware_p4/components/Applications/ui/screens/settings/storage_settings_ui.c index f65ac7b40..7070bbe6d 100644 --- a/firmware_p4/components/Applications/ui/screens/settings/storage_settings_ui.c +++ b/firmware_p4/components/Applications/ui/screens/settings/storage_settings_ui.c @@ -29,6 +29,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #include "vfs_core.h" #include "vfs_sdcard.h" @@ -38,7 +39,7 @@ static const char *TAG = "STORAGE_UI"; #define SD_PATH "/sdcard" #define ASSETS_LABEL "assets" #define DATA_LABEL "storage" -#define CONTENT_W 204 +#define CONTENT_W (LIST_W - 14) #define BAR_H 9 #define G1 0x7A52D6 #define G2 0xB89AFF @@ -53,11 +54,11 @@ static const char *TAG = "STORAGE_UI"; #define LIST_LEFT 6 #define LIST_TOP_Y 46 -#define LIST_W 218 -#define LIST_H 248 -#define SB_TRACK_X 227 +#define LIST_W (ui_screen_w() - LIST_LEFT - 16) +#define LIST_H (ui_screen_h() - LIST_TOP_Y - 26) +#define SB_TRACK_X (ui_screen_w() - 13) #define SB_TRACK_Y 54 -#define SB_TRACK_LEN 232 +#define SB_TRACK_LEN (ui_screen_h() - SB_TRACK_Y - 34) #define SB_THUMB_H 45 #define SB_THUMB_ICON "/assets/icons/drag_indicator.bin" diff --git a/firmware_p4/components/Applications/ui/screens/subghz/subghz_config_ui.c b/firmware_p4/components/Applications/ui/screens/subghz/subghz_config_ui.c index 02172e070..8baca9cda 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/subghz_config_ui.c +++ b/firmware_p4/components/Applications/ui/screens/subghz/subghz_config_ui.c @@ -22,6 +22,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #define HDR_TITLE "RADIO CONFIG" @@ -29,7 +30,7 @@ #define FOOTER "UP/DN pick L/R adjust OK set" #define MX 8 -#define CONTENT_W (LCD_H_RES - 2 * MX) +#define CONTENT_W (ui_screen_w() - 2 * MX) #define CARD1_Y 50 #define CARD1_H 84 diff --git a/firmware_p4/components/Applications/ui/screens/subghz/subghz_menu_ui.c b/firmware_p4/components/Applications/ui/screens/subghz/subghz_menu_ui.c index 54228d90e..bfb5c315c 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/subghz_menu_ui.c +++ b/firmware_p4/components/Applications/ui/screens/subghz/subghz_menu_ui.c @@ -31,6 +31,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" static const char *TAG = "SUBGHZ_UI"; @@ -251,7 +252,7 @@ static void build_analyzer(void) { lv_obj_align(s_freq_lbl, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H + 14); int total_w = BAR_COUNT * BAR_W + (BAR_COUNT - 1) * BAR_GAP; - int x0 = (LCD_H_RES - total_w) / 2; + int x0 = (ui_screen_w() - total_w) / 2; static lv_point_precise_t base_pts[2]; base_pts[0].x = 0; @@ -372,7 +373,7 @@ static void build_saved_list(void) { lv_obj_t *cont = lv_obj_create(s_screen); s_sig_cont = cont; lv_obj_set_size( - cont, LCD_H_RES - SGC_LEFT - SGC_GUTTER, LCD_V_RES - SGC_TOP_Y - UI_CHROME_FOOTER_H - 4); + cont, ui_screen_w() - SGC_LEFT - SGC_GUTTER, ui_screen_h() - SGC_TOP_Y - UI_CHROME_FOOTER_H - 4); lv_obj_align(cont, LV_ALIGN_TOP_LEFT, SGC_LEFT, SGC_TOP_Y); lv_obj_set_style_bg_opa(cont, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(cont, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/subghz/subghz_send_ui.c b/firmware_p4/components/Applications/ui/screens/subghz/subghz_send_ui.c index 7309ce47a..84fcc61d4 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/subghz_send_ui.c +++ b/firmware_p4/components/Applications/ui/screens/subghz/subghz_send_ui.c @@ -28,6 +28,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" @@ -197,7 +198,7 @@ static void build_list(void) { lv_obj_t *cont = lv_obj_create(s_screen); s_list = cont; - lv_obj_set_size(cont, lv_pct(100), LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); + lv_obj_set_size(cont, lv_pct(100), ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); lv_obj_align(cont, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_set_style_bg_opa(cont, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(cont, 0, 0); diff --git a/firmware_p4/components/Applications/ui/screens/video/mp4_player_ui.c b/firmware_p4/components/Applications/ui/screens/video/mp4_player_ui.c index 1dab67d54..df4d040a7 100644 --- a/firmware_p4/components/Applications/ui/screens/video/mp4_player_ui.c +++ b/firmware_p4/components/Applications/ui/screens/video/mp4_player_ui.c @@ -26,6 +26,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" static const char *TAG = "MP4_PLAYER"; @@ -173,7 +174,7 @@ void ui_mp4_player_open(void) { lv_obj_t *body = lv_obj_create(s_screen); lv_obj_remove_style_all(body); - lv_obj_set_size(body, 224, LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); + lv_obj_set_size(body, 224, ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); lv_obj_align(body, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_flex_flow(body, LV_FLEX_FLOW_COLUMN); diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_channel_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_channel_ui.c index d63de185d..c5aa3868b 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_channel_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_channel_ui.c @@ -27,6 +27,7 @@ #include "menu_component_ui.h" #include "ui_chrome.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #include "waves_ui.h" #include "wifi_service.h" @@ -49,7 +50,7 @@ static const char *TAG = "WIFI_CHAN_UI"; #define SPEC_PANEL_TOP (UI_CHROME_HEADER_H + 8) #define SPEC_PANEL_MARGIN 8 -#define SPEC_PANEL_W (LCD_H_RES - SPEC_PANEL_MARGIN * 2) +#define SPEC_PANEL_W (ui_screen_w() - SPEC_PANEL_MARGIN * 2) #define SPEC_PANEL_H 210 #define SPEC_PANEL_PAD 8 #define SPEC_PANEL_RADIUS 10 diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_client_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_client_ui.c index c4b0599f6..44fee0d7a 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_client_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_client_ui.c @@ -30,6 +30,7 @@ #include "msgbox_ui.h" #include "ui_chrome.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #include "waves_ui.h" #include "wifi_service.h" @@ -49,7 +50,7 @@ static const char *TAG = "WIFI_CLI_UI"; #define SCAN_WAVES_Y_OFS -6 #define SCAN_CAPTION_Y_OFS 78 -#define MAP_BODY_H (LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) +#define MAP_BODY_H (ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) #define MAP_PAD 10 #define MAP_AP_X 8 #define MAP_AP_W 96 @@ -181,7 +182,7 @@ static void build_map(void) { ui_chrome_header(s_screen, "Clients", CLI_HEADER_ICON); lv_obj_t *body = lv_obj_create(s_screen); - lv_obj_set_size(body, LCD_H_RES, MAP_BODY_H); + lv_obj_set_size(body, ui_screen_w(), MAP_BODY_H); lv_obj_align(body, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H); lv_obj_remove_flag(body, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_style_bg_opa(body, LV_OPA_TRANSP, 0); diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_handshake_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_handshake_ui.c index 2ca64f634..5ae0d6c5f 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_handshake_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_handshake_ui.c @@ -28,6 +28,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" #include "wifi_service.h" @@ -50,9 +51,9 @@ static const char *TAG = "WIFI_HANDSHAKE_UI"; #define FOOTER_HINT "BACK: Exit" #define MX 8 -#define CONTENT_W (LCD_H_RES - 2 * MX) +#define CONTENT_W (ui_screen_w() - 2 * MX) #define BODY_TOP UI_CHROME_HEADER_H -#define BODY_H (LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) +#define BODY_H (ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) #define STACK_GAP 7 #define CARD1_H 76 diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_hotspot_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_hotspot_ui.c index adb163ccf..a21a2ad05 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_hotspot_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_hotspot_ui.c @@ -26,6 +26,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" #include "wifi_service.h" @@ -37,9 +38,9 @@ #define FOOTER_HINT "UP/DOWN OK TOGGLE BACK" #define MX 8 -#define CONTENT_W (LCD_H_RES - 2 * MX) +#define CONTENT_W (ui_screen_w() - 2 * MX) #define BODY_TOP UI_CHROME_HEADER_H -#define BODY_H (LCD_V_RES - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) +#define BODY_H (ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) #define STACK_GAP 9 #define STATUS_H 54 From fef7fc2d858dc38981a0ed3ee13ea7897777ec10 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 21:17:11 -0300 Subject: [PATCH 033/103] fix(ui): flip the landscape d-pad remap direction --- firmware_p4/components/Applications/ui/ui_manager.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/firmware_p4/components/Applications/ui/ui_manager.c b/firmware_p4/components/Applications/ui/ui_manager.c index 37799f4b2..eb14fe6ea 100644 --- a/firmware_p4/components/Applications/ui/ui_manager.c +++ b/firmware_p4/components/Applications/ui/ui_manager.c @@ -232,12 +232,12 @@ static input_button_t input_remap_for_rotation(input_button_t b) { return b; switch (b) { case INPUT_BTN_UP: - return INPUT_BTN_RIGHT; - case INPUT_BTN_RIGHT: - return INPUT_BTN_DOWN; - case INPUT_BTN_DOWN: return INPUT_BTN_LEFT; case INPUT_BTN_LEFT: + return INPUT_BTN_DOWN; + case INPUT_BTN_DOWN: + return INPUT_BTN_RIGHT; + case INPUT_BTN_RIGHT: return INPUT_BTN_UP; default: return b; From 5c43a3af2ff6ac3d23c9ae6245133dd180b7a3ba Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 21:17:11 -0300 Subject: [PATCH 034/103] fix(ui): make the onboarding wizard rotation-aware --- .../Applications/ui/components/tutorial/tutorial_ui.c | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/firmware_p4/components/Applications/ui/components/tutorial/tutorial_ui.c b/firmware_p4/components/Applications/ui/components/tutorial/tutorial_ui.c index 7b4393f46..84bd5577b 100644 --- a/firmware_p4/components/Applications/ui/components/tutorial/tutorial_ui.c +++ b/firmware_p4/components/Applications/ui/components/tutorial/tutorial_ui.c @@ -32,6 +32,7 @@ #include "tos_config.h" #include "tos_storage_paths.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" static const char *TAG = "TUTORIAL"; @@ -46,10 +47,10 @@ static const char *const WIZ_THEME_NAMES[] = {"default", "cyber_blue"}; #define WIZ_MARGIN 16 #define WIZ_STEP_Y 6 #define WIZ_PROG_Y 24 -#define WIZ_PROG_W (LCD_H_RES - 2 * WIZ_MARGIN) +#define WIZ_PROG_W (ui_screen_w() - 2 * WIZ_MARGIN) #define WIZ_PROG_H 4 #define WIZ_CONTENT_Y 36 -#define WIZ_CONTENT_H 252 +#define WIZ_CONTENT_H (ui_screen_h() - WIZ_CONTENT_Y - 32) #define WIZ_FOOT_Y -8 #define WIZ_GAP 9 #define WIZ_TEXT_W 206 @@ -704,7 +705,7 @@ void tutorial_start(void) { s_content = lv_obj_create(root); lv_obj_remove_style_all(s_content); lv_obj_remove_flag(s_content, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_set_size(s_content, LCD_H_RES, WIZ_CONTENT_H); + lv_obj_set_size(s_content, ui_screen_w(), WIZ_CONTENT_H); lv_obj_align(s_content, LV_ALIGN_TOP_MID, 0, WIZ_CONTENT_Y); lv_obj_set_flex_flow(s_content, LV_FLEX_FLOW_COLUMN); lv_obj_set_flex_align( From 61907301012303c86d7a295aab1da766ded4cdec Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 21:36:54 -0300 Subject: [PATCH 035/103] fix(ui): make the dropdown rotation-aware (nav + height) --- .../ui/components/dropdown/dropdown_ui.c | 9 ++++--- .../Applications/ui/include/ui_manager.h | 7 +++++ .../components/Applications/ui/ui_manager.c | 27 +++++++++++++++++++ 3 files changed, 39 insertions(+), 4 deletions(-) diff --git a/firmware_p4/components/Applications/ui/components/dropdown/dropdown_ui.c b/firmware_p4/components/Applications/ui/components/dropdown/dropdown_ui.c index 4d8c6c950..ef2151b72 100644 --- a/firmware_p4/components/Applications/ui/components/dropdown/dropdown_ui.c +++ b/firmware_p4/components/Applications/ui/components/dropdown/dropdown_ui.c @@ -37,6 +37,7 @@ #include "tos_storage_paths.h" #include "tutorial_ui.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #include "vfs_sdcard.h" #include "wifi_service.h" @@ -361,8 +362,8 @@ static void slide_btn_timer_cb(lv_timer_t *timer) { slide_btn_timer = NULL; return; } - bool up = up_button_is_down(), down = down_button_is_down(); - bool left = left_button_is_down(), right = right_button_is_down(); + bool up = ui_nav_pressed(INPUT_BTN_UP), down = ui_nav_pressed(INPUT_BTN_DOWN); + bool left = ui_nav_pressed(INPUT_BTN_LEFT), right = ui_nav_pressed(INPUT_BTN_RIGHT); bool ok = ok_button_is_down(), back = back_button_is_down(); uint32_t nowt = lv_tick_get(); @@ -795,8 +796,8 @@ void dropdown_ui_create(lv_obj_t *parent) { lv_obj_update_layout(slide_panel); s_panel_h = lv_obj_get_height(slide_panel); - if (s_panel_h < 40 || s_panel_h > LCD_V_RES) - s_panel_h = (LCD_V_RES * 85) / 100; + if (s_panel_h < 40 || s_panel_h > ui_screen_h()) + s_panel_h = (ui_screen_h() * 85) / 100; lv_obj_set_y(slide_panel, -s_panel_h); if (slide_btn_timer == NULL) diff --git a/firmware_p4/components/Applications/ui/include/ui_manager.h b/firmware_p4/components/Applications/ui/include/ui_manager.h index e3a684f7a..c7459d33e 100644 --- a/firmware_p4/components/Applications/ui/include/ui_manager.h +++ b/firmware_p4/components/Applications/ui/include/ui_manager.h @@ -235,6 +235,13 @@ screen_id_t ui_current_screen(void); */ void ui_relayout_current_screen(void); +/** + * @brief Is the given LOGICAL direction button currently held? Accounts for the + * landscape d-pad rotation. Use in components that poll button levels + * directly (dropdown, modals) so they navigate like the rotated screens. + */ +bool ui_nav_pressed(input_button_t logical); + /** * @brief Whether a screen shows the global chrome (status bar + dropdown). * diff --git a/firmware_p4/components/Applications/ui/ui_manager.c b/firmware_p4/components/Applications/ui/ui_manager.c index eb14fe6ea..737b868de 100644 --- a/firmware_p4/components/Applications/ui/ui_manager.c +++ b/firmware_p4/components/Applications/ui/ui_manager.c @@ -244,6 +244,33 @@ static input_button_t input_remap_for_rotation(input_button_t b) { } } +bool ui_nav_pressed(input_button_t logical) { + if (!lvgl_glue_is_landscape()) + return input_is_down(logical); + // Inverse of input_remap_for_rotation: the physical button that maps to this + // logical direction in landscape. For components that poll button levels + // directly (dropdown, modals) instead of going through the remapped pump. + // Keep in sync with input_remap_for_rotation. + input_button_t phys = logical; + switch (logical) { + case INPUT_BTN_UP: + phys = INPUT_BTN_RIGHT; + break; + case INPUT_BTN_DOWN: + phys = INPUT_BTN_LEFT; + break; + case INPUT_BTN_LEFT: + phys = INPUT_BTN_UP; + break; + case INPUT_BTN_RIGHT: + phys = INPUT_BTN_DOWN; + break; + default: + break; + } + return input_is_down(phys); +} + static void ui_input_pump(lv_timer_t *t) { (void)t; input_event_t ev; From b0e9c5d954f645a5df9ea7de29bd1b88f74b7000 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Tue, 18 Aug 2026 21:38:34 -0300 Subject: [PATCH 036/103] fix(ui): fit the wifi channel-analysis spectrum to landscape --- .../Applications/ui/screens/wifi/wifi_channel_ui.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_channel_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_channel_ui.c index c5aa3868b..4ce5a08e0 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_channel_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_channel_ui.c @@ -51,7 +51,10 @@ static const char *TAG = "WIFI_CHAN_UI"; #define SPEC_PANEL_TOP (UI_CHROME_HEADER_H + 8) #define SPEC_PANEL_MARGIN 8 #define SPEC_PANEL_W (ui_screen_w() - SPEC_PANEL_MARGIN * 2) -#define SPEC_PANEL_H 210 +// Fit the spectrum panel to the live height (leaving room for the footer and the +// hint below) so it does not overflow the shorter landscape screen. In portrait +// this resolves to ~212, matching the previous fixed 210. +#define SPEC_PANEL_H (ui_screen_h() - SPEC_PANEL_TOP - UI_CHROME_FOOTER_H - 30) #define SPEC_PANEL_PAD 8 #define SPEC_PANEL_RADIUS 10 #define SPEC_PANEL_BG_HEX 0x0A0614 @@ -67,7 +70,7 @@ static const char *TAG = "WIFI_CHAN_UI"; #define SPEC_LABEL_W 30 #define SPEC_LABEL_Y_OFS 4 #define SPEC_GLOW_W 14 -#define SPEC_HINT_Y 266 +#define SPEC_HINT_Y (SPEC_PANEL_TOP + SPEC_PANEL_H + 6) #define REC_CANDIDATE_SPAN 2 From fc3ce61a75c31aded95892c9e3a5201fa7e884fa Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 01:05:56 -0300 Subject: [PATCH 037/103] fix(ui): clamp per-screen layouts to landscape --- firmware_c5/dependencies.lock | 72 ------ .../ui/screens/bluetooth/ble_beacon_ui.c | 5 +- .../ui/screens/bluetooth/ble_exposure_ui.c | 3 +- .../ui/screens/bluetooth/ble_radio_ui.c | 2 +- .../ui/screens/bluetooth/ble_scan_ui.c | 3 +- .../ui/screens/bluetooth/ble_skimmer_ui.c | 2 +- .../ui/screens/bluetooth/ble_sniffer_ui.c | 3 +- .../screens/bluetooth/ble_track_device_ui.c | 3 +- .../ui/screens/bluetooth/ble_tracker_ui.c | 2 +- .../Applications/ui/screens/dev/scripts_ui.c | 11 +- .../ui/screens/infrared/ir_controller_ui.c | 20 +- .../ui/screens/infrared/ir_raw_ui.c | 3 +- .../ui/screens/infrared/ir_saved_ui.c | 9 +- .../ui/screens/lora/lora_rnode_ui.c | 4 +- .../ui/screens/lora/lora_traceroute_ui.c | 6 +- .../ui/screens/nfc/nfc_emulate_ui.c | 3 +- .../ui/screens/nfc/nfc_write_ui.c | 16 +- .../ui/screens/settings/battery_settings_ui.c | 4 +- .../ui/screens/settings/c5_status_ui.c | 5 +- .../ui/screens/settings/sd_health_ui.c | 6 +- .../ui/screens/subghz/subghz_brute_ui.c | 9 +- .../ui/screens/subghz/subghz_config_ui.c | 8 +- .../ui/screens/subghz/subghz_menu_ui.c | 8 +- .../ui/screens/subghz/subghz_read_ui.c | 3 +- .../ui/screens/wifi/wifi_hotspot_ui.c | 4 +- .../ui/screens/wifi/wifi_signal_locator_ui.c | 12 +- firmware_p4/dependencies.lock | 225 ------------------ 27 files changed, 89 insertions(+), 362 deletions(-) delete mode 100644 firmware_c5/dependencies.lock delete mode 100644 firmware_p4/dependencies.lock diff --git a/firmware_c5/dependencies.lock b/firmware_c5/dependencies.lock deleted file mode 100644 index 14e39f39d..000000000 --- a/firmware_c5/dependencies.lock +++ /dev/null @@ -1,72 +0,0 @@ -dependencies: - espressif/argtable3: - component_hash: a502202e644f6d446f28b906f90e657d0bda1939faa17c122446cc64f6e4e0be - dependencies: - - name: idf - require: private - version: '>=5.1' - source: - registry_url: https://components.espressif.com/ - type: service - version: 3.3.1~1 - espressif/cjson: - component_hash: e788323270d90738662d66fffa910bfe1fba019bba087f01557e70c40485b469 - dependencies: - - name: idf - require: private - version: '>=5.0' - source: - registry_url: https://components.espressif.com/ - type: service - version: 1.7.19~2 - espressif/led_strip: - component_hash: 28c6509a727ef74925b372ed404772aeedf11cce10b78c3f69b3c66799095e2d - dependencies: - - name: idf - require: private - version: '>=4.4' - source: - registry_url: https://components.espressif.com/ - type: service - version: 2.5.5 - espressif/mdns: - component_hash: 8bcf12e37c58c1d584aef32a02b92548124c7a3a9fcf548d3235c844a035e0f0 - dependencies: - - name: idf - require: private - version: '>=5.0' - source: - registry_url: https://components.espressif.com/ - type: service - version: 1.11.1 - idf: - source: - type: idf - version: 5.5.3 - joltwallet/littlefs: - component_hash: 01faa388c6305fe77fd6962cda6171e753033458f24f8fae9e9d932e3d817a4c - dependencies: - - name: idf - require: private - version: '>=5.0' - source: - registry_url: https://components.espressif.com/ - type: service - version: 1.22.1 - lvgl/lvgl: - component_hash: 17e68bfd21f0edf4c3ee838e2273da840bf3930e5dbc3bfa6c1190c3aed41f9f - dependencies: [] - source: - registry_url: https://components.espressif.com/ - type: service - version: 9.4.0 -direct_dependencies: -- espressif/argtable3 -- espressif/cjson -- espressif/led_strip -- espressif/mdns -- joltwallet/littlefs -- lvgl/lvgl -manifest_hash: f2922f1fef1e351cee9d14449b7846708d8164b3dd9a3b8a53230c29e72e15f0 -target: esp32c5 -version: 2.0.0 diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_beacon_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_beacon_ui.c index cf84a3b15..07205f4da 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_beacon_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_beacon_ui.c @@ -29,7 +29,7 @@ #define BEACON_CYCLE_MS 400 #define BODY_W 240 -#define BODY_H 256 +#define BODY_H LV_MIN(256, ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) #define CARD_W 160 #define CARD_H 54 @@ -155,7 +155,8 @@ void ui_beacon_spam_open(void) { lv_obj_set_style_text_color(s_uuid_label, current_theme.text_secondary, 0); lv_obj_set_style_text_font(s_uuid_label, &lv_font_montserrat_12, 0); lv_obj_set_style_text_align(s_uuid_label, LV_TEXT_ALIGN_CENTER, 0); - lv_obj_align(s_uuid_label, LV_ALIGN_TOP_MID, 0, 166); + lv_obj_align(s_uuid_label, LV_ALIGN_TOP_MID, 0, + LV_MIN(166, ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H - 14)); fade_in(header, 200); fade_in(status, 200); diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_exposure_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_exposure_ui.c index 26481790a..e0bc67e2d 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_exposure_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_exposure_ui.c @@ -25,6 +25,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" static const char *TAG = "BLE_EXPOSURE_UI"; @@ -42,7 +43,7 @@ static const char *TAG = "BLE_EXPOSURE_UI"; #define COUNT_CARD_H 34 #define COUNT_CARD_Y 50 #define LIST_PANEL_W 224 -#define LIST_PANEL_H 190 +#define LIST_PANEL_H LV_MIN(190, ui_screen_h() - LIST_PANEL_Y - UI_CHROME_FOOTER_H) #define LIST_PANEL_Y 94 #define LIST_PAD 8 diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_radio_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_radio_ui.c index 587b0665b..32f9794a9 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_radio_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_radio_ui.c @@ -36,7 +36,7 @@ #define CONTENT_W (ui_screen_w() - 2 * MX) #define CARD_Y 50 #define CARD_H 58 -#define ROWS_Y 124 +#define ROWS_Y LV_MIN(124, ui_screen_h() - UI_CHROME_FOOTER_H - (R_COUNT - 1) * ROW_STEP - ROW_H) #define ROW_H 42 #define ROW_GAP 8 #define ROW_STEP (ROW_H + ROW_GAP) diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_scan_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_scan_ui.c index a9d5c0953..dec002f46 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_scan_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_scan_ui.c @@ -32,6 +32,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #include "waves_ui.h" @@ -50,7 +51,7 @@ static const char *TAG = "BLE_SCAN_UI"; #define HERO_CARD_W 200 #define HERO_CARD_H 108 -#define RADAR_BOX 190 +#define RADAR_BOX LV_MIN(190, ui_screen_h() - RADAR_TOP_Y - (CHIP_H + 10) - UI_CHROME_FOOTER_H) #define RADAR_TOP_Y (UI_CHROME_HEADER_H + 4) #define RADAR_RING_1 28 #define RADAR_RING_2 55 diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_skimmer_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_skimmer_ui.c index f44bef926..59b31e8e3 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_skimmer_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_skimmer_ui.c @@ -43,7 +43,7 @@ static const char *TAG = "BLE_SKIMMER_UI"; #define SKIM_ICON "/assets/icons/warning.bin" #define BODY_W 240 -#define BODY_H 256 +#define BODY_H LV_MIN(256, ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) #define BODY_PAD 10 #define BODY_GAP 8 #define CARD_W 220 diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_sniffer_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_sniffer_ui.c index 4d364c740..979c68f31 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_sniffer_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_sniffer_ui.c @@ -26,6 +26,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" static const char *TAG = "BLE_SNIFFER_UI"; @@ -43,7 +44,7 @@ static const char *TAG = "BLE_SNIFFER_UI"; #define FRAMES_CARD_H 34 #define FRAMES_CARD_Y 70 #define HEX_PANEL_W 224 -#define HEX_PANEL_H 150 +#define HEX_PANEL_H LV_MIN(150, ui_screen_h() - HEX_PANEL_Y - UI_CHROME_FOOTER_H) #define HEX_PANEL_Y 112 #define HEX_PANEL_PAD 8 diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_track_device_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_track_device_ui.c index cdc3d8c86..06068d66b 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_track_device_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_track_device_ui.c @@ -26,6 +26,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" static const char *TAG = "BLE_TRACK_DEV"; @@ -39,7 +40,7 @@ static const char *TAG = "BLE_TRACK_DEV"; #define TRACK_ICON "/assets/icons/bluetooth_searching.bin" -#define ARC_SIZE 140 +#define ARC_SIZE LV_MIN(140, ui_screen_h() - (ARC_TOP_Y + 20) - UI_CHROME_FOOTER_H - 20) #define ARC_WIDTH 15 #define ARC_ROTATION 270 #define ARC_TOP_Y 50 diff --git a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_tracker_ui.c b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_tracker_ui.c index 69cf3e96f..fdf577bf3 100644 --- a/firmware_p4/components/Applications/ui/screens/bluetooth/ble_tracker_ui.c +++ b/firmware_p4/components/Applications/ui/screens/bluetooth/ble_tracker_ui.c @@ -42,7 +42,7 @@ static const char *TAG = "BLE_TRACKER_UI"; #define TRACK_ICON "/assets/icons/troubleshoot.bin" #define BODY_W 240 -#define BODY_H 256 +#define BODY_H LV_MIN(256, ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H) #define BODY_PAD 10 #define BODY_GAP 8 #define CARD_W 220 diff --git a/firmware_p4/components/Applications/ui/screens/dev/scripts_ui.c b/firmware_p4/components/Applications/ui/screens/dev/scripts_ui.c index 3c8642d4f..a45c1a82e 100644 --- a/firmware_p4/components/Applications/ui/screens/dev/scripts_ui.c +++ b/firmware_p4/components/Applications/ui/screens/dev/scripts_ui.c @@ -557,11 +557,14 @@ static void build_terminal(void) { lv_label_set_text(s_pct_lbl, PCT_TEXT " 0%"); lv_obj_set_style_text_color(s_pct_lbl, lv_color_hex(TERM_GREEN), 0); lv_obj_set_style_text_font(s_pct_lbl, &lv_font_montserrat_12, 0); - lv_obj_align(s_pct_lbl, LV_ALIGN_TOP_MID, 0, PCT_Y); + lv_obj_align(s_pct_lbl, LV_ALIGN_TOP_MID, 0, + LV_MIN(PCT_Y, ui_screen_h() - UI_CHROME_FOOTER_H - 56)); s_progress = lv_bar_create(s_screen); lv_obj_set_size(s_progress, PROGRESS_W, PROGRESS_H); - lv_obj_align(s_progress, LV_ALIGN_TOP_MID, 0, PROGRESS_Y); + lv_obj_align(s_progress, LV_ALIGN_TOP_MID, 0, + LV_MIN(PCT_Y, ui_screen_h() - UI_CHROME_FOOTER_H - 56) + + (PROGRESS_Y - PCT_Y)); lv_bar_set_range(s_progress, 0, 100); lv_bar_set_value(s_progress, 0, LV_ANIM_OFF); lv_obj_set_style_bg_color(s_progress, lv_color_hex(PROGRESS_TRACK_COLOR), LV_PART_MAIN); @@ -622,7 +625,9 @@ static void show_done(void) { lv_label_set_long_mode(result, LV_LABEL_LONG_WRAP); lv_obj_set_style_text_align(result, LV_TEXT_ALIGN_CENTER, 0); lv_obj_set_style_text_font(result, &lv_font_montserrat_14, 0); - lv_obj_align(result, LV_ALIGN_TOP_MID, 0, RESULT_Y); + lv_obj_align(result, LV_ALIGN_TOP_MID, 0, + LV_MIN(PCT_Y, ui_screen_h() - UI_CHROME_FOOTER_H - 56) + + (RESULT_Y - PCT_Y)); fade_in(result, FADE_MS); if (s_footer != NULL) diff --git a/firmware_p4/components/Applications/ui/screens/infrared/ir_controller_ui.c b/firmware_p4/components/Applications/ui/screens/infrared/ir_controller_ui.c index dcb8315a4..026e3b513 100644 --- a/firmware_p4/components/Applications/ui/screens/infrared/ir_controller_ui.c +++ b/firmware_p4/components/Applications/ui/screens/infrared/ir_controller_ui.c @@ -25,6 +25,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" static const char *TAG = "IR_CTRL_UI"; @@ -32,8 +33,8 @@ static const char *TAG = "IR_CTRL_UI"; #define MAX_BTNS 16 #define KEYPAD_W 232 -#define KEYPAD_H 250 #define KEYPAD_Y 44 +#define KEYPAD_H LV_MIN(250, ui_screen_h() - KEYPAD_Y - UI_CHROME_FOOTER_H) #define FLASH_MS 150 @@ -61,7 +62,7 @@ static const char *TAG = "IR_CTRL_UI"; typedef struct { const char *text; int dx, dy, w, h; - const char *sig; // universal-remote signal name in the .ir file, or NULL if none + const char *sig; } rc_btn_t; typedef struct { @@ -99,7 +100,6 @@ static const rc_btn_t SOUND_BTNS[] = { {"MODE", 58, 194, 58, 34, NULL}, }; -// AC uses the state panel (build_ac_panel), not these buttons — sig stays NULL. static const rc_btn_t AC_BTNS[] = { {LV_SYMBOL_POWER, -58, 14, 58, 34, NULL}, {"MODE", 58, 14, 58, 34, NULL}, @@ -147,8 +147,6 @@ static int s_ac_fan = AC_FAN_DEFAULT; static void ir_controller_input(const input_event_t *ev, void *ctx); -// --- Universal remote: send codes sourced from Flipper .ir files on the SD --- - static const char *const UNIVERSAL_FILE[] = { [IR_DEV_TV] = "/sdcard/ir/tv.ir", [IR_DEV_SOUND] = "/sdcard/ir/audio.ir", @@ -166,9 +164,6 @@ static void load_universal(ir_device_t dev) { lv_timer_delete(s_send_timer); s_send_timer = NULL; } - // Free unconditionally: a prior ir_store_load() can partially allocate signals[] - // and then fail (leaving s_uni_loaded false but memory live). ir_file_free is safe - // on a zeroed file, so this covers both the loaded and partial-failure cases. ir_file_free(&s_uni); s_uni_loaded = false; ir_file_init(&s_uni); @@ -188,8 +183,6 @@ static int uni_count(const char *name) { return c; } -// Transmit one matching code per tick — a universal button can map to many -// brand codes, and sending them all inline would stall the UI. static void uni_send_tick(lv_timer_t *t) { if (lv_screen_active() != s_screen) { lv_timer_delete(t); @@ -223,18 +216,17 @@ static void uni_send(const char *name) { s_send_timer = lv_timer_create(uni_send_tick, 90, NULL); } -// Map the AC panel state onto the universal ac.ir signal names. static const char *ac_universal_name(void) { if (!s_ac_power) return "Off"; bool hi = s_ac_temp >= 24; switch (s_ac_mode) { case 0: - return hi ? "Cool_hi" : "Cool_lo"; // Cool + return hi ? "Cool_hi" : "Cool_lo"; case 1: - return hi ? "Heat_hi" : "Heat_lo"; // Heat + return hi ? "Heat_hi" : "Heat_lo"; case 2: - return "Dh"; // Fan / dehumidify + return "Dh"; default: return hi ? "Cool_hi" : "Cool_lo"; } diff --git a/firmware_p4/components/Applications/ui/screens/infrared/ir_raw_ui.c b/firmware_p4/components/Applications/ui/screens/infrared/ir_raw_ui.c index 72bdcb13c..599a6ec31 100644 --- a/firmware_p4/components/Applications/ui/screens/infrared/ir_raw_ui.c +++ b/firmware_p4/components/Applications/ui/screens/infrared/ir_raw_ui.c @@ -55,7 +55,7 @@ #define G_VAL_Y 22 #define G_RADIUS 8 -#define CAR_LBL_Y (GRID_Y + G_TILE_H + 8) +#define CAR_LBL_Y LV_MIN(GRID_Y + G_TILE_H + 8, ui_screen_h() - UI_CHROME_FOOTER_H - 66) #define CHIP_Y (CAR_LBL_Y + 20) #define CHIP_H 24 #define CHIP_GAP 6 @@ -99,7 +99,6 @@ static int s_sel = 2; static rmt_symbol_word_t s_raw[IR_MAX_SYMBOLS]; static size_t s_raw_count = 0; -// Pull the last frame the RMT RX captured and derive real scope stats from it. static void compute_stats(void) { s_raw_count = 0; if (ir_rx_init() == ESP_OK) diff --git a/firmware_p4/components/Applications/ui/screens/infrared/ir_saved_ui.c b/firmware_p4/components/Applications/ui/screens/infrared/ir_saved_ui.c index a0d4dcc36..22d009c54 100644 --- a/firmware_p4/components/Applications/ui/screens/infrared/ir_saved_ui.c +++ b/firmware_p4/components/Applications/ui/screens/infrared/ir_saved_ui.c @@ -55,9 +55,9 @@ static const char *TAG = "IR_SAVED_UI"; #define IRC_CARD_RADIUS 12 #define IRC_CARD_PAD 10 #define IRC_GLOW_W 14 -#define IRC_TRACK_X 227 +#define IRC_TRACK_X (ui_screen_w() - 13) #define IRC_TRACK_Y 54 -#define IRC_TRACK_LEN 232 +#define IRC_TRACK_LEN LV_MIN(232, ui_screen_h() - UI_CHROME_FOOTER_H - IRC_TRACK_Y) #define IRC_THUMB_H 45 #define IRC_THUMB_ICON "/assets/icons/drag_indicator.bin" @@ -76,8 +76,6 @@ static int s_proto = 0; static int s_file = 0; static bool s_saved = false; -// Real data: every .ir under /sdcard/ir, the distinct protocols across them, -// and the files filtered to the currently-open protocol. EXT_RAM_BSS_ATTR static ir_store_entry_t s_all[IR_STORE_MAX_ENTRIES]; static int s_all_count = 0; static char s_protos[MAX_PROTOS][16]; @@ -95,7 +93,6 @@ static lv_obj_t *s_file_thumb = NULL; static void build_screen(void); static void ir_saved_input(const input_event_t *ev, void *ctx); -// Re-scan /sdcard/ir and rebuild the distinct-protocol bucket list. static void reload_all(void) { s_all_count = ir_store_list(s_all, IR_STORE_MAX_ENTRIES); if (s_all_count < 0) @@ -117,7 +114,6 @@ static void reload_all(void) { } } -// Filter the flat file list down to the files of one protocol. static void filter_for_proto(const char *proto) { s_file_count = 0; for (int i = 0; i < s_all_count && s_file_count < MAX_FILES; i++) { @@ -130,7 +126,6 @@ static void filter_for_proto(const char *proto) { s_file = 0; } -// Load the selected file and format its first signal's command for display. static void selected_value(char *buf, size_t cap) { buf[0] = '\0'; ir_file_t f; diff --git a/firmware_p4/components/Applications/ui/screens/lora/lora_rnode_ui.c b/firmware_p4/components/Applications/ui/screens/lora/lora_rnode_ui.c index 44a790e4c..cef84ed9d 100644 --- a/firmware_p4/components/Applications/ui/screens/lora/lora_rnode_ui.c +++ b/firmware_p4/components/Applications/ui/screens/lora/lora_rnode_ui.c @@ -22,6 +22,7 @@ #include "ui_chrome.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" @@ -32,7 +33,8 @@ static const char *TAG = "LORA_RNODE"; #define CARD_W 216 #define CFG_CARD_H 110 -#define CNT_CARD_H 82 +#define CNT_CARD_H \ + LV_MIN(82, ui_screen_h() - (BODY_TOP_Y + CFG_CARD_H + CARD_GAP) - UI_CHROME_FOOTER_H) #define CARD_RADIUS 13 #define CARD_PAD 12 #define CARD_GAP 12 diff --git a/firmware_p4/components/Applications/ui/screens/lora/lora_traceroute_ui.c b/firmware_p4/components/Applications/ui/screens/lora/lora_traceroute_ui.c index 2eede22bb..1ef859447 100644 --- a/firmware_p4/components/Applications/ui/screens/lora/lora_traceroute_ui.c +++ b/firmware_p4/components/Applications/ui/screens/lora/lora_traceroute_ui.c @@ -385,8 +385,7 @@ static void build_result(void) { } lv_obj_t *list = lv_obj_create(s_screen); - lv_obj_remove_flag(list, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_set_size(list, HOP_LIST_W, LV_SIZE_CONTENT); + lv_obj_set_size(list, HOP_LIST_W, ui_screen_h() - BODY_TOP_Y - UI_CHROME_FOOTER_H); lv_obj_align(list, LV_ALIGN_TOP_MID, 0, BODY_TOP_Y); lv_obj_set_style_bg_opa(list, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(list, 0, 0); @@ -394,6 +393,9 @@ static void build_result(void) { lv_obj_set_style_pad_row(list, HOP_ROW_GAP, 0); lv_obj_set_flex_flow(list, LV_FLEX_FLOW_COLUMN); lv_obj_set_flex_align(list, LV_FLEX_ALIGN_START, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_set_scroll_dir(list, LV_DIR_VER); + lv_obj_set_scrollbar_mode(list, LV_SCROLLBAR_MODE_AUTO); + lv_obj_remove_flag(list, LV_OBJ_FLAG_SCROLL_ELASTIC | LV_OBJ_FLAG_SCROLL_MOMENTUM); lv_color_t accent = ui_theme_get_accent(); for (int i = 0; i < n; i++) diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_emulate_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_emulate_ui.c index 9e544de74..1857e1d40 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_emulate_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_emulate_ui.c @@ -202,7 +202,8 @@ static void wallet_build(void) { lv_obj_set_style_pad_column(tap, 7, 0); lv_obj_set_flex_flow(tap, LV_FLEX_FLOW_ROW); lv_obj_set_flex_align(tap, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); - lv_obj_align(tap, LV_ALIGN_CENTER, 0, WALLET_TAP_Y); + const int emu_body_h = ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H; + lv_obj_align(tap, LV_ALIGN_CENTER, 0, LV_MIN(WALLET_TAP_Y, emu_body_h / 2 - 7)); lv_obj_t *dot = lv_obj_create(tap); lv_obj_remove_flag(dot, LV_OBJ_FLAG_SCROLLABLE); diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_write_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_write_ui.c index 31faa436d..ad9de0817 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_write_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_write_ui.c @@ -159,6 +159,10 @@ static void bench_build(void) { lv_obj_set_style_border_width(s_body, 0, 0); lv_obj_set_style_pad_all(s_body, 0, 0); + const int body_h = ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H; + const int slot_y = LV_MIN(SLOT_Y, body_h - SLOT_H); + const int arrow_y = LV_MIN(ARROW_Y, slot_y - 26); + lv_obj_t *src = nfc_ui_card_panel(s_body, nfc_sim_saved_get(s_sel)); lv_obj_align(src, LV_ALIGN_TOP_MID, 0, SRC_Y); card_rise(src); @@ -167,7 +171,7 @@ static void bench_build(void) { lv_label_set_text(arrow, LV_SYMBOL_DOWN); lv_obj_set_style_text_font(arrow, &lv_font_montserrat_14, 0); lv_obj_set_style_text_color(arrow, current_theme.border_accent, 0); - lv_obj_align(arrow, LV_ALIGN_TOP_MID, 0, ARROW_Y); + lv_obj_align(arrow, LV_ALIGN_TOP_MID, 0, arrow_y); top_pts[0].x = 0; top_pts[0].y = 0; @@ -185,17 +189,17 @@ static void bench_build(void) { rgt_pts[0].y = 0; rgt_pts[1].x = 0; rgt_pts[1].y = SLOT_H; - dash_line(s_body, top_pts, SLOT_X, SLOT_Y); - dash_line(s_body, bot_pts, SLOT_X, SLOT_Y + SLOT_H); - dash_line(s_body, lft_pts, SLOT_X, SLOT_Y); - dash_line(s_body, rgt_pts, SLOT_X + SLOT_W, SLOT_Y); + dash_line(s_body, top_pts, SLOT_X, slot_y); + dash_line(s_body, bot_pts, SLOT_X, slot_y + SLOT_H); + dash_line(s_body, lft_pts, SLOT_X, slot_y); + dash_line(s_body, rgt_pts, SLOT_X + SLOT_W, slot_y); lv_obj_t *slot_lbl = lv_label_create(s_body); lv_label_set_text(slot_lbl, "place blank tag\nto write"); lv_obj_set_style_text_align(slot_lbl, LV_TEXT_ALIGN_CENTER, 0); lv_obj_set_style_text_font(slot_lbl, &lv_font_montserrat_12, 0); lv_obj_set_style_text_color(slot_lbl, current_theme.border_accent, 0); - lv_obj_align(slot_lbl, LV_ALIGN_TOP_MID, 0, SLOT_Y + 20); + lv_obj_align(slot_lbl, LV_ALIGN_TOP_MID, 0, slot_y + 20); s_dots = page_dots_create(s_body, s_count, LV_ALIGN_BOTTOM_MID, 0, -2); page_dots_set(&s_dots, s_sel); diff --git a/firmware_p4/components/Applications/ui/screens/settings/battery_settings_ui.c b/firmware_p4/components/Applications/ui/screens/settings/battery_settings_ui.c index af8385faf..be799a156 100644 --- a/firmware_p4/components/Applications/ui/screens/settings/battery_settings_ui.c +++ b/firmware_p4/components/Applications/ui/screens/settings/battery_settings_ui.c @@ -179,7 +179,9 @@ void ui_battery_settings_open(void) { lv_obj_t *stats = lv_obj_create(s_screen); lv_obj_remove_style_all(stats); lv_obj_set_size(stats, ui_screen_w() - 24, LV_SIZE_CONTENT); - lv_obj_align(stats, LV_ALIGN_TOP_MID, 0, ARC_TOP_Y + ARC_SIZE + 16); + lv_obj_align(stats, LV_ALIGN_TOP_MID, 0, + LV_MIN(ARC_TOP_Y + ARC_SIZE + 16, + ui_screen_h() - UI_CHROME_FOOTER_H - STAT_CARD_H)); lv_obj_remove_flag(stats, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_flex_flow(stats, LV_FLEX_FLOW_ROW); lv_obj_set_flex_align(stats, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); diff --git a/firmware_p4/components/Applications/ui/screens/settings/c5_status_ui.c b/firmware_p4/components/Applications/ui/screens/settings/c5_status_ui.c index df28d726d..9e08a4ff4 100644 --- a/firmware_p4/components/Applications/ui/screens/settings/c5_status_ui.c +++ b/firmware_p4/components/Applications/ui/screens/settings/c5_status_ui.c @@ -132,7 +132,10 @@ static lv_obj_t *make_action_row(lv_obj_t *parent, int i) { lv_obj_remove_flag(row, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(row, LV_OBJ_FLAG_CLICKABLE); lv_obj_set_size(row, CONTENT_W, ROW_H); - lv_obj_align(row, LV_ALIGN_TOP_MID, 0, ACT_Y + i * ROW_STEP); + lv_obj_align(row, LV_ALIGN_TOP_MID, 0, + LV_MIN(ACT_Y, ui_screen_h() - UI_CHROME_FOOTER_H - + ((ACT_COUNT - 1) * ROW_STEP + ROW_H)) + + i * ROW_STEP); lv_obj_set_style_radius(row, 9, 0); lv_obj_set_style_bg_color(row, current_theme.bg_secondary, 0); lv_obj_set_style_bg_opa(row, LV_OPA_COVER, 0); diff --git a/firmware_p4/components/Applications/ui/screens/settings/sd_health_ui.c b/firmware_p4/components/Applications/ui/screens/settings/sd_health_ui.c index 0204ff75b..fcb1fac00 100644 --- a/firmware_p4/components/Applications/ui/screens/settings/sd_health_ui.c +++ b/firmware_p4/components/Applications/ui/screens/settings/sd_health_ui.c @@ -207,7 +207,8 @@ static void build_hero(void) { static void build_tile(int x, const char *caption, const char *value, lv_obj_t **val_out, lv_obj_t **sub_out) { lv_obj_t *card = make_card(s_screen, TILE_W, TILE_H); - lv_obj_align(card, LV_ALIGN_TOP_LEFT, x, TILE_Y); + lv_obj_align(card, LV_ALIGN_TOP_LEFT, x, + LV_MIN(TILE_Y, ui_screen_h() - UI_CHROME_FOOTER_H - TILE_H)); lv_obj_set_style_pad_ver(card, 4, 0); lv_obj_set_style_pad_row(card, 0, 0); lv_obj_set_flex_flow(card, LV_FLEX_FLOW_COLUMN); @@ -236,7 +237,8 @@ static void build_cta(void) { lv_obj_t *row = lv_obj_create(s_screen); lv_obj_remove_flag(row, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_size(row, CONTENT_W, CTA_H); - lv_obj_align(row, LV_ALIGN_TOP_MID, 0, CTA_Y); + lv_obj_align(row, LV_ALIGN_TOP_MID, 0, + LV_MIN(CTA_Y, ui_screen_h() - UI_CHROME_FOOTER_H - CTA_H)); lv_obj_set_style_radius(row, 9, 0); lv_obj_set_style_pad_all(row, 0, 0); lv_obj_set_style_bg_color(row, current_theme.bg_secondary, 0); diff --git a/firmware_p4/components/Applications/ui/screens/subghz/subghz_brute_ui.c b/firmware_p4/components/Applications/ui/screens/subghz/subghz_brute_ui.c index 2041ccf65..95ac327c3 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/subghz_brute_ui.c +++ b/firmware_p4/components/Applications/ui/screens/subghz/subghz_brute_ui.c @@ -26,6 +26,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" @@ -73,14 +74,14 @@ static const char *TAG = "SUBGHZ_BF"; #define BAR_W 192 #define BAR_H 8 -#define BAR_Y 210 -#define CODES_Y 234 -#define HIT_Y 258 +#define BAR_Y (CARD_Y + 20) +#define CODES_Y (CARD_Y + 44) +#define HIT_Y (CARD_Y + 68) #define TRACK_COL 0x202028 #define CARD_W 210 #define CARD_H 96 -#define CARD_Y 190 +#define CARD_Y LV_MIN(190, ui_screen_h() - UI_CHROME_FOOTER_H - CARD_H) #define CARD_RADIUS 12 #define CARD_SHADOW_W 14 #define CARD_SHADOW_SPREAD -3 diff --git a/firmware_p4/components/Applications/ui/screens/subghz/subghz_config_ui.c b/firmware_p4/components/Applications/ui/screens/subghz/subghz_config_ui.c index 8baca9cda..9f87a7b21 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/subghz_config_ui.c +++ b/firmware_p4/components/Applications/ui/screens/subghz/subghz_config_ui.c @@ -51,12 +51,12 @@ #define MARKER_GLOW 8 #define SCALE_Y 62 -#define GRID_Y (CARD1_Y + CARD1_H + 8) #define TILE_W 108 #define TILE_H 52 #define TILE_GAP 8 #define TILE_X_L MX #define TILE_X_R (MX + TILE_W + TILE_GAP) +#define GRID_Y LV_MIN(CARD1_Y + CARD1_H + 8, ui_screen_h() - UI_CHROME_FOOTER_H - 2 * TILE_H - 8) #define ROW2_Y (GRID_Y + TILE_H + 8) #define TILE_RADIUS 9 @@ -90,7 +90,7 @@ static const rf_field_t FIELDS[FIELD_COUNT] = { }; static const int TILE_X[FIELD_COUNT] = {TILE_X_L, TILE_X_R, TILE_X_L, TILE_X_R}; -static const int TILE_Y[FIELD_COUNT] = {GRID_Y, GRID_Y, ROW2_Y, ROW2_Y}; +static int TILE_Y[FIELD_COUNT]; static const char *SCALE_LABELS[4] = {"300", "433", "700", "928"}; @@ -306,6 +306,10 @@ void ui_subghz_config_open(void) { s_screen = NULL; } s_sel = 0; + TILE_Y[0] = GRID_Y; + TILE_Y[1] = GRID_Y; + TILE_Y[2] = ROW2_Y; + TILE_Y[3] = ROW2_Y; for (int i = 0; i < FIELD_COUNT; i++) s_val_idx[i] = FIELDS[i].def; diff --git a/firmware_p4/components/Applications/ui/screens/subghz/subghz_menu_ui.c b/firmware_p4/components/Applications/ui/screens/subghz/subghz_menu_ui.c index bfb5c315c..d8429a395 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/subghz_menu_ui.c +++ b/firmware_p4/components/Applications/ui/screens/subghz/subghz_menu_ui.c @@ -51,7 +51,7 @@ static const char *TAG = "SUBGHZ_UI"; #define BAR_GAP 4 #define BAR_MIN_H 6 #define BAR_MAX_H 200 -#define BAR_BASELINE_Y 288 +#define BAR_BASELINE_Y (ui_screen_h() - UI_CHROME_FOOTER_H - 10) #define FREQ_CYCLE_MS 400 #define CARD_W 200 @@ -81,9 +81,9 @@ static const char *TAG = "SUBGHZ_UI"; #define SGC_BAR_W 6 #define SGC_BAR_MIN 3 #define SGC_BAR_SPAN 12 -#define SGC_TRACK_X 227 +#define SGC_TRACK_X (ui_screen_w() - 13) #define SGC_TRACK_Y 54 -#define SGC_TRACK_LEN 232 +#define SGC_TRACK_LEN LV_MIN(232, ui_screen_h() - UI_CHROME_FOOTER_H - SGC_TRACK_Y) #define SGC_THUMB_H 45 #define SGC_THUMB_ICON "/assets/icons/drag_indicator.bin" @@ -711,8 +711,6 @@ static void start_saved_send(void) { lv_obj_set_style_border_width(s_send_overlay, 0, 0); lv_obj_set_style_pad_all(s_send_overlay, 0, 0); - // Transient transmit overlay: snapshot header (no rebind) so freeing it never - // dangles the live parent screen's dynamic header. ui_chrome_header_overlay(s_send_overlay, "SEND", "/assets/icons/settings_input_antenna.bin"); s_send_status = lv_label_create(s_send_overlay); diff --git a/firmware_p4/components/Applications/ui/screens/subghz/subghz_read_ui.c b/firmware_p4/components/Applications/ui/screens/subghz/subghz_read_ui.c index fbe014750..368430ec3 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/subghz_read_ui.c +++ b/firmware_p4/components/Applications/ui/screens/subghz/subghz_read_ui.c @@ -28,6 +28,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_semantic.h" #include "ui_theme.h" @@ -83,7 +84,7 @@ static const char *TAG = "SUBGHZ_RD"; #define GRID_OPA LV_OPA_20 #define READOUT_W 192 -#define READOUT_Y 198 +#define READOUT_Y LV_MIN(198, ui_screen_h() - UI_CHROME_FOOTER_H - 70) #define READOUT_ROW_GAP 5 #define READOUT_FADE_MS 240 #define READOUT_STAGGER 70 diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_hotspot_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_hotspot_ui.c index a21a2ad05..5e1b48077 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_hotspot_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_hotspot_ui.c @@ -413,7 +413,9 @@ void ui_wifi_hotspot_open(void) { ui_chrome_footer(s_screen, FOOTER_HINT); lv_obj_t *stack = lv_obj_create(s_screen); - lv_obj_remove_flag(stack, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_add_flag(stack, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_scroll_dir(stack, LV_DIR_VER); + lv_obj_set_scrollbar_mode(stack, LV_SCROLLBAR_MODE_AUTO); lv_obj_remove_flag(stack, LV_OBJ_FLAG_CLICKABLE); lv_obj_set_size(stack, CONTENT_W, BODY_H); lv_obj_align(stack, LV_ALIGN_TOP_MID, 0, BODY_TOP); diff --git a/firmware_p4/components/Applications/ui/screens/wifi/wifi_signal_locator_ui.c b/firmware_p4/components/Applications/ui/screens/wifi/wifi_signal_locator_ui.c index 72a0b7c21..d0807803b 100644 --- a/firmware_p4/components/Applications/ui/screens/wifi/wifi_signal_locator_ui.c +++ b/firmware_p4/components/Applications/ui/screens/wifi/wifi_signal_locator_ui.c @@ -28,6 +28,7 @@ #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #include "waves_ui.h" @@ -278,9 +279,14 @@ static void build_locator(void) { lv_obj_set_style_pad_ver(target, 3, 0); lv_obj_align(target, LV_ALIGN_TOP_MID, 0, TARGET_Y); + const int arc_stack_h = ARC_SIZE + 10 + 32 + 18; + int arc_top_y = LV_MIN(ARC_TOP_Y, ui_screen_h() - UI_CHROME_FOOTER_H - arc_stack_h); + int pill_y = arc_top_y + ARC_SIZE + 10; + int prox_y = pill_y + 32; + s_arc = lv_arc_create(s_screen); lv_obj_set_size(s_arc, ARC_SIZE, ARC_SIZE); - lv_obj_align(s_arc, LV_ALIGN_TOP_MID, 0, ARC_TOP_Y); + lv_obj_align(s_arc, LV_ALIGN_TOP_MID, 0, arc_top_y); lv_arc_set_rotation(s_arc, ARC_ROTATION); lv_arc_set_bg_angles(s_arc, 0, 360); lv_arc_set_range(s_arc, RANGE_MIN, RANGE_MAX); @@ -314,14 +320,14 @@ static void build_locator(void) { lv_obj_set_style_border_width(s_hint, 1, 0); lv_obj_set_style_pad_hor(s_hint, 12, 0); lv_obj_set_style_pad_ver(s_hint, 3, 0); - lv_obj_align(s_hint, LV_ALIGN_TOP_MID, 0, PILL_Y); + lv_obj_align(s_hint, LV_ALIGN_TOP_MID, 0, pill_y); s_prox_label = lv_label_create(s_screen); lv_label_set_text(s_prox_label, proximity_text(rssi_to_pct(s_rssi))); lv_obj_set_style_text_font(s_prox_label, &lv_font_montserrat_12, 0); lv_obj_set_style_text_color(s_prox_label, current_theme.text_secondary, 0); lv_obj_set_style_text_align(s_prox_label, LV_TEXT_ALIGN_CENTER, 0); - lv_obj_align(s_prox_label, LV_ALIGN_TOP_MID, 0, PROX_Y); + lv_obj_align(s_prox_label, LV_ALIGN_TOP_MID, 0, prox_y); apply_signal(s_rssi); diff --git a/firmware_p4/dependencies.lock b/firmware_p4/dependencies.lock deleted file mode 100644 index e785b4910..000000000 --- a/firmware_p4/dependencies.lock +++ /dev/null @@ -1,225 +0,0 @@ -dependencies: - chmorgan/esp-libhelix-mp3: - component_hash: cbb76089dc2c5749f7b470e2e70aedc44c9da519e04eb9a67d4c7ec275229e53 - dependencies: - - name: idf - require: private - version: '>=4.1.0' - source: - registry_url: https://components.espressif.com/ - type: service - version: 1.0.3 - espressif/argtable3: - component_hash: a502202e644f6d446f28b906f90e657d0bda1939faa17c122446cc64f6e4e0be - dependencies: - - name: idf - require: private - version: '>=5.1' - source: - registry_url: https://components.espressif.com/ - type: service - version: 3.3.1~1 - espressif/cjson: - component_hash: e788323270d90738662d66fffa910bfe1fba019bba087f01557e70c40485b469 - dependencies: - - name: idf - require: private - version: '>=5.0' - source: - registry_url: https://components.espressif.com/ - type: service - version: 1.7.19~2 - espressif/esp-dsp: - component_hash: ed9ac175b14e0414399a2b33c525579414b5bad19a2a67b12ea212def96f9a98 - dependencies: - - name: idf - require: private - version: '>=4.2' - source: - registry_url: https://components.espressif.com/ - type: service - version: 1.8.2 - espressif/esp-serial-flasher: - component_hash: c86fdf9b4a353782da86870efe922e6c9b4b733a54e009e74c5f74b920bf4062 - dependencies: - - name: espressif/usb_host_cdc_acm - registry_url: https://components.espressif.com - require: private - rules: - - if: target in [esp32s2, esp32s3, esp32p4] - version: ^2 - - name: espressif/usb_host_ch34x_vcp - registry_url: https://components.espressif.com - require: private - rules: - - if: target in [esp32s2, esp32s3, esp32p4] - version: ^2.2 - - name: espressif/usb_host_cp210x_vcp - registry_url: https://components.espressif.com - require: private - rules: - - if: target in [esp32s2, esp32s3, esp32p4] - version: ^2.2 - source: - registry_url: https://components.espressif.com/ - type: service - version: 2.0.0 - espressif/esp_lvgl_port: - component_hash: fb6c1fdfe70d4ca39a035d63ca394a35f17ec84ce16ff98ecb13a54155d75da4 - dependencies: - - name: idf - require: private - version: '>=5.2' - - name: lvgl/lvgl - registry_url: https://components.espressif.com - require: public - version: '>=8,<10' - source: - registry_url: https://components.espressif.com/ - type: service - version: 2.8.0~1 - espressif/esp_tinyusb: - component_hash: 8e57a14ac14d8e4d4588b5b9222977b96475323bcebae3c838919bb4e8587887 - dependencies: - - name: idf - require: private - version: '>=5.0' - - name: espressif/tinyusb - registry_url: https://components.espressif.com - require: public - version: '>=0.17.0~2' - source: - registry_url: https://components.espressif.com/ - type: service - targets: - - esp32s2 - - esp32s3 - - esp32p4 - - esp32h4 - - esp32s31 - version: 2.2.0 - espressif/led_strip: - component_hash: 28c6509a727ef74925b372ed404772aeedf11cce10b78c3f69b3c66799095e2d - dependencies: - - name: idf - require: private - version: '>=4.4' - source: - registry_url: https://components.espressif.com/ - type: service - version: 2.5.5 - espressif/libsodium: - component_hash: d4066b373fc6d4c5196db42aeea7faef4ac7f3080af96c2b74e2476c08b78dc1 - dependencies: - - name: idf - require: private - version: '>=4.2' - source: - registry_url: https://components.espressif.com/ - type: service - version: 1.0.22~1 - espressif/tinyusb: - component_hash: a40b7f67df6ac254a4afd96c6401cc56f2059ae747d6d7e66b568bca53ad0edc - dependencies: - - name: idf - require: private - version: '>=5.0' - source: - registry_url: https://components.espressif.com/ - type: service - targets: - - esp32s2 - - esp32s3 - - esp32p4 - - esp32h4 - - esp32s31 - version: 0.19.0~3 - espressif/usb_host_cdc_acm: - component_hash: f3893a5e117c65f3c4d90d282bbb43624a2fec4144532e5c72223e69bd1b00e9 - dependencies: - - name: idf - require: private - version: '>=5.0' - - name: espressif/usb - registry_url: https://components.espressif.com - require: public - rules: - - if: idf_version >=6.0 - - if: target not in ["linux"] - version: ^1.0.0 - source: - registry_url: https://components.espressif.com - type: service - targets: - - esp32s2 - - esp32s3 - - esp32p4 - - esp32h4 - - esp32s31 - - linux - version: 2.4.0 - espressif/usb_host_ch34x_vcp: - component_hash: cc6f17936a11aa0ba460e716bd9b70fcd445824bcc7882afbe3ede3513f80c59 - dependencies: - - name: idf - require: private - version: '>=4.4' - - name: espressif/usb_host_cdc_acm - registry_url: https://components.espressif.com - require: public - version: ^2.1.0 - source: - registry_url: https://components.espressif.com - type: service - version: 2.2.0 - espressif/usb_host_cp210x_vcp: - component_hash: c0404c598e2620fe88c35b5bf24d8e3b3ded41d9946fc865843be7f2f75da40e - dependencies: - - name: espressif/usb_host_cdc_acm - registry_url: https://components.espressif.com - require: public - version: ^2.1.0 - - name: idf - require: private - version: '>=4.4' - source: - registry_url: https://components.espressif.com - type: service - version: 2.2.0 - idf: - source: - type: idf - version: 5.5.3 - joltwallet/littlefs: - component_hash: 01faa388c6305fe77fd6962cda6171e753033458f24f8fae9e9d932e3d817a4c - dependencies: - - name: idf - require: private - version: '>=5.0' - source: - registry_url: https://components.espressif.com/ - type: service - version: 1.22.1 - lvgl/lvgl: - component_hash: 17e68bfd21f0edf4c3ee838e2273da840bf3930e5dbc3bfa6c1190c3aed41f9f - dependencies: [] - source: - registry_url: https://components.espressif.com/ - type: service - version: 9.4.0 -direct_dependencies: -- chmorgan/esp-libhelix-mp3 -- espressif/argtable3 -- espressif/cjson -- espressif/esp-dsp -- espressif/esp-serial-flasher -- espressif/esp_lvgl_port -- espressif/esp_tinyusb -- espressif/led_strip -- espressif/libsodium -- espressif/tinyusb -- joltwallet/littlefs -- lvgl/lvgl -manifest_hash: 9af126a7b8d12e169ffd2b9a8a08877886bfff58cb7f8b7af570a9a67b5ba854 -target: esp32p4 -version: 2.0.0 From 80715fb6921f6d066dc21659f51033f9e0fddecf Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 01:05:56 -0300 Subject: [PATCH 038/103] fix(ui): image viewer loading card, fit-to-screen and psram decode --- .../ui/screens/images/image_viewer_ui.c | 123 ++++++++++++++---- .../components/Service/lvgl/lvgl_glue.c | 26 ++++ 2 files changed, 122 insertions(+), 27 deletions(-) diff --git a/firmware_p4/components/Applications/ui/screens/images/image_viewer_ui.c b/firmware_p4/components/Applications/ui/screens/images/image_viewer_ui.c index b6d2893a6..dd6748f73 100644 --- a/firmware_p4/components/Applications/ui/screens/images/image_viewer_ui.c +++ b/firmware_p4/components/Applications/ui/screens/images/image_viewer_ui.c @@ -57,6 +57,9 @@ static lv_obj_t *s_ftr = NULL; static uint8_t *s_blob = NULL; static lv_image_dsc_t s_raw_dsc; +static lv_obj_t *s_loading = NULL; +static lv_timer_t *s_decode_timer = NULL; + EXT_RAM_BSS_ATTR static char s_list[MAX_IMAGES][PATH_LEN]; static int s_count = 0; static int s_idx = 0; @@ -161,33 +164,31 @@ static void scan_folder(void) { static void fit_image(lv_obj_t *w, int32_t iw, int32_t ih) { lv_obj_set_size(w, VIEW_W, IMG_AREA_H); - bool fits = (iw > 0 && ih > 0 && iw <= VIEW_W && ih <= IMG_AREA_H); - lv_image_set_inner_align(w, fits ? LV_IMAGE_ALIGN_CENTER : LV_IMAGE_ALIGN_CONTAIN); - lv_image_set_antialias(w, !fits); + lv_image_set_inner_align(w, LV_IMAGE_ALIGN_CENTER); + + bool oversize = (iw > 0 && ih > 0 && (iw > VIEW_W || ih > IMG_AREA_H)); + if (oversize) { + int32_t sw = (int32_t)((int64_t)VIEW_W * LV_SCALE_NONE / iw); + int32_t sh = (int32_t)((int64_t)IMG_AREA_H * LV_SCALE_NONE / ih); + int32_t s = sw < sh ? sw : sh; + lv_image_set_scale(w, (uint32_t)(s < 1 ? 1 : s)); + } else { + lv_image_set_scale(w, LV_SCALE_NONE); + } + lv_image_set_antialias(w, oversize); lv_obj_center(w); } -static void load_current(void) { - if (s_area == NULL) - return; - lv_obj_clean(s_area); - free_media(); - - if (s_count <= 0) +static void decode_now(lv_timer_t *t) { + (void)t; + s_decode_timer = NULL; + if (s_area == NULL || s_count <= 0) return; const char *path = s_list[s_idx]; const char *name = strrchr(path, '/'); name = (name != NULL) ? name + 1 : path; - if (s_hdr != NULL) - lv_label_set_text(s_hdr, name); - if (s_ftr != NULL) { - char f[FOOTER_TXT_LEN]; - snprintf(f, sizeof(f), "%d/%d " LV_SYMBOL_LEFT " " LV_SYMBOL_RIGHT, s_idx + 1, s_count); - lv_label_set_text(s_ftr, f); - } - img_fmt_t fmt = fmt_of(name); size_t len = 0; lv_obj_t *w = NULL; @@ -197,30 +198,37 @@ static void load_current(void) { char lp[PATH_LEN + LVGL_PATH_PREFIX_MAX]; strlcpy(lp, "A:", sizeof(lp)); strlcat(lp, (path[0] == '/') ? path + 1 : path, sizeof(lp)); - w = lv_image_create(s_area); - lv_image_set_src(w, lp); lv_image_header_t h; memset(&h, 0, sizeof(h)); - if (lv_image_decoder_get_info(lp, &h) == LV_RESULT_OK) { + lv_result_t r = lv_image_decoder_get_info(lp, &h); + ESP_LOGI(TAG, "JPEG '%s': src='%s' get_info=%s %dx%d cf=%d", name, lp, + r == LV_RESULT_OK ? "OK" : "FAIL", (int)h.w, (int)h.h, (int)h.cf); + if (r == LV_RESULT_OK) { iw = h.w; ih = h.h; } + w = lv_image_create(s_area); + lv_image_set_src(w, lp); } else if (fmt == IMG_PNG) { s_blob = read_file(path, &len); + ESP_LOGI(TAG, "PNG '%s': read=%u bytes", name, (unsigned)len); if (s_blob != NULL) { memset(&s_raw_dsc, 0, sizeof(s_raw_dsc)); s_raw_dsc.header.magic = LV_IMAGE_HEADER_MAGIC; s_raw_dsc.header.cf = LV_COLOR_FORMAT_RAW; s_raw_dsc.data = s_blob; s_raw_dsc.data_size = (uint32_t)len; - w = lv_image_create(s_area); - lv_image_set_src(w, &s_raw_dsc); lv_image_header_t h; memset(&h, 0, sizeof(h)); - if (lv_image_decoder_get_info(&s_raw_dsc, &h) == LV_RESULT_OK) { + lv_result_t r = lv_image_decoder_get_info(&s_raw_dsc, &h); + ESP_LOGI(TAG, "PNG '%s': get_info=%s %dx%d cf=%d", name, + r == LV_RESULT_OK ? "OK" : "FAIL", (int)h.w, (int)h.h, (int)h.cf); + if (r == LV_RESULT_OK) { iw = h.w; ih = h.h; } + w = lv_image_create(s_area); + lv_image_set_src(w, &s_raw_dsc); } } else if (fmt == IMG_GIF) { #if LV_USE_GIF @@ -243,11 +251,17 @@ static void load_current(void) { #endif } + if (s_loading != NULL) { + lv_obj_del(s_loading); + s_loading = NULL; + } + if (w == NULL) { lv_obj_t *ph = lv_label_create(s_area); lv_label_set_text(ph, LV_SYMBOL_WARNING " cannot display"); lv_obj_set_style_text_color(ph, lv_color_hex(0xFF5252), 0); lv_obj_set_style_text_font(ph, &lv_font_montserrat_14, 0); + lv_obj_set_style_text_align(ph, LV_TEXT_ALIGN_CENTER, 0); lv_obj_center(ph); return; } @@ -255,6 +269,42 @@ static void load_current(void) { fit_image(w, iw, ih); } +static void load_current(void) { + if (s_decode_timer != NULL) { + lv_timer_del(s_decode_timer); + s_decode_timer = NULL; + } + if (s_area == NULL) + return; + lv_obj_clean(s_area); + s_loading = NULL; + free_media(); + + if (s_count <= 0) + return; + + const char *path = s_list[s_idx]; + const char *name = strrchr(path, '/'); + name = (name != NULL) ? name + 1 : path; + + if (s_hdr != NULL) + lv_label_set_text(s_hdr, name); + if (s_ftr != NULL) { + char f[FOOTER_TXT_LEN]; + snprintf(f, sizeof(f), "%d/%d " LV_SYMBOL_LEFT " " LV_SYMBOL_RIGHT, s_idx + 1, s_count); + lv_label_set_text(s_ftr, f); + } + + s_loading = lv_label_create(s_area); + lv_label_set_text(s_loading, LV_SYMBOL_REFRESH " Loading..."); + lv_obj_set_style_text_color(s_loading, lv_color_hex(0x8A8594), 0); + lv_obj_set_style_text_font(s_loading, &lv_font_montserrat_14, 0); + lv_obj_center(s_loading); + + s_decode_timer = lv_timer_create(decode_now, 40, NULL); + lv_timer_set_repeat_count(s_decode_timer, 1); +} + static void go_relative(int dir) { if (s_count <= 1) return; @@ -300,13 +350,31 @@ void ui_image_viewer_set_return(int screen) { } void ui_image_viewer_stop(void) { + if (s_decode_timer != NULL) { + lv_timer_del(s_decode_timer); + s_decode_timer = NULL; + } if (s_area != NULL) lv_obj_clean(s_area); free_media(); s_count = 0; + s_loading = NULL; + s_area = NULL; + s_hdr = NULL; + s_ftr = NULL; +} + +static void on_screen_delete(lv_event_t *e) { + (void)e; + if (s_decode_timer != NULL) { + lv_timer_del(s_decode_timer); + s_decode_timer = NULL; + } + s_loading = NULL; s_area = NULL; s_hdr = NULL; s_ftr = NULL; + free_media(); } void ui_image_viewer_open(void) { @@ -316,6 +384,7 @@ void ui_image_viewer_open(void) { } s_screen = lv_obj_create(NULL); + lv_obj_add_event_cb(s_screen, on_screen_delete, LV_EVENT_DELETE, NULL); lv_obj_remove_flag(s_screen, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_style_bg_color(s_screen, lv_color_black(), 0); lv_obj_set_style_bg_opa(s_screen, LV_OPA_COVER, 0); @@ -345,9 +414,9 @@ void ui_image_viewer_open(void) { lv_obj_set_style_text_color(s_ftr, lv_color_hex(0x9AA0A6), 0); lv_obj_align(s_ftr, LV_ALIGN_BOTTOM_MID, 0, -5); - scan_folder(); - load_current(); - ui_input_set_screen_handler(image_viewer_input, NULL); ui_screen_load_owned(&s_screen, s_screen); + + scan_folder(); + load_current(); } diff --git a/firmware_p4/components/Service/lvgl/lvgl_glue.c b/firmware_p4/components/Service/lvgl/lvgl_glue.c index d721989f1..65bf62b65 100644 --- a/firmware_p4/components/Service/lvgl/lvgl_glue.c +++ b/firmware_p4/components/Service/lvgl/lvgl_glue.c @@ -16,6 +16,8 @@ #include "esp_lvgl_port.h" #include "esp_log.h" +#include "draw/lv_draw_buf_private.h" + #include "spi.h" #include "st7789.h" #include "sys_prio.h" @@ -40,6 +42,23 @@ static SemaphoreHandle_t s_trans_done = NULL; static volatile bool s_direct_mode = false; static volatile bool s_flush_took_bus = false; +#define DRAWBUF_PSRAM_THRESHOLD (48 * 1024) + +static void *draw_buf_psram_malloc(size_t size, lv_color_format_t cf) { + (void)cf; + size += LV_DRAW_BUF_ALIGN - 1; + void *p = NULL; + if (size > DRAWBUF_PSRAM_THRESHOLD) + p = heap_caps_malloc(size, MALLOC_CAP_SPIRAM | MALLOC_CAP_8BIT); + if (p == NULL) + p = heap_caps_malloc(size, MALLOC_CAP_DEFAULT); + return p; +} + +static void draw_buf_free(void *buf) { + heap_caps_free(buf); +} + static bool trans_done_cb(esp_lcd_panel_io_handle_t io, esp_lcd_panel_io_event_data_t *ed, void *ctx) { (void)io; @@ -122,6 +141,13 @@ esp_err_t lvgl_glue_init(void) { ESP_LOGE(TAG, "lvgl_port_add_disp returned NULL"); return ESP_FAIL; } + + lv_draw_buf_handlers_t *dbh = lv_draw_buf_get_handlers(); + dbh->buf_malloc_cb = draw_buf_psram_malloc; + dbh->buf_free_cb = draw_buf_free; + lv_draw_buf_handlers_t *idbh = lv_draw_buf_get_image_handlers(); + idbh->buf_malloc_cb = draw_buf_psram_malloc; + idbh->buf_free_cb = draw_buf_free; lv_display_add_event_cb(s_disp, capture_flush_start_cb, LV_EVENT_FLUSH_START, NULL); s_trans_done = xSemaphoreCreateBinary(); From 5caa38f5d07aa535ec02f54016730f6a1623260b Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 01:05:57 -0300 Subject: [PATCH 039/103] fix(ui): remove home wallpaper --- .../Applications/ui/screens/files/files_ui.c | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/firmware_p4/components/Applications/ui/screens/files/files_ui.c b/firmware_p4/components/Applications/ui/screens/files/files_ui.c index faa19bc6d..19dba74cb 100644 --- a/firmware_p4/components/Applications/ui/screens/files/files_ui.c +++ b/firmware_p4/components/Applications/ui/screens/files/files_ui.c @@ -74,9 +74,9 @@ static const char *TAG = "FILES_UI"; #define GUTTER_MAX 512 #define FULL_PATH (MAX_PATH + MAX_NAME) #define ROW_POOL LIST_VIS -#define GRID_COLS 2 -#define GRID_ROWS 3 -#define GRID_POOL (GRID_COLS * GRID_ROWS) +#define GRID_COLS_MAX 4 +#define GRID_ROWS_MAX 3 +#define GRID_POOL (GRID_COLS_MAX * GRID_ROWS_MAX) #define ASSETS_ROOT "/assets" #define SDCARD_ROOT "/sdcard" @@ -165,6 +165,9 @@ static lv_obj_t *s_screen = NULL; static lv_timer_t *s_timer = NULL; static view_t s_view = VIEW_LIST; +static int s_grid_cols = 2; +static int s_grid_rows = 3; + static lv_obj_t *s_row[ROW_POOL]; static lv_obj_t *s_row_icon[ROW_POOL]; static lv_obj_t *s_row_name[ROW_POOL]; @@ -443,7 +446,7 @@ static void populate_row(int j) { static void populate_tile(int j) { int idx = s_top + j; lv_obj_t *tile = s_tile[j]; - if (idx >= s_count) { + if (j >= s_grid_cols * s_grid_rows || idx >= s_count) { hide_obj(tile); return; } @@ -502,18 +505,18 @@ static void refresh_selection(void) { } fill_peek(s_sel); } else { - int row = s_sel / GRID_COLS; - int toprow = s_top / GRID_COLS; + int row = s_sel / s_grid_cols; + int toprow = s_top / s_grid_cols; if (row < toprow) { toprow = row; } - if (row >= toprow + GRID_ROWS) { - toprow = row - GRID_ROWS + 1; + if (row >= toprow + s_grid_rows) { + toprow = row - s_grid_rows + 1; } if (toprow < 0) { toprow = 0; } - s_top = toprow * GRID_COLS; + s_top = toprow * s_grid_cols; for (int j = 0; j < GRID_POOL; j++) { populate_tile(j); } @@ -705,6 +708,11 @@ static lv_obj_t *make_tile_pool(lv_obj_t *parent, int j) { static void build_grid(void) { int grid_h = ui_screen_h() - CONTENT_Y - FOOTER_H - GLABEL_H; + s_grid_cols = (ui_screen_w() - 16 + 6) / (TILE_W + 6); + s_grid_cols = LV_CLAMP(1, s_grid_cols, GRID_COLS_MAX); + s_grid_rows = (grid_h - 16 + 6) / (TILE_H + 6); + s_grid_rows = LV_CLAMP(1, s_grid_rows, GRID_ROWS_MAX); + lv_obj_t *g = lv_obj_create(s_screen); lv_obj_remove_flag(g, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(g, LV_OBJ_FLAG_CLICKABLE); @@ -843,7 +851,6 @@ static void load_preview(const char *path) { total = (long)n; } - // Classify: a NUL byte or lots of non-printables means it's a binary file. int nonprint = 0; bool binary = false; for (size_t i = 0; i < n; i++) { @@ -861,7 +868,6 @@ static void load_preview(const char *path) { } if (!binary) { - // Text: keep it, replacing any stray control byte with a dot. s_vbuf[n] = '\0'; for (size_t i = 0; i < n; i++) { unsigned char c = (unsigned char)s_vbuf[i]; @@ -875,7 +881,6 @@ static void load_preview(const char *path) { return; } - // Binary: give it a real hex preview (offset + bytes) so it still opens. unsigned char raw[256]; size_t hn = n < sizeof(raw) ? n : sizeof(raw); for (size_t i = 0; i < hn; i++) { @@ -900,9 +905,6 @@ static void build_viewer(void) { snprintf(full, sizeof(full), "%s/%s", s_cwd, e->name); load_preview(full); - // Use the shared text_viewer component (wrapped text, line/byte meta, scroll - // bar). It builds a full-screen viewer under s_screen; keep its scroll area in - // s_vbody so the nav timer's UP/DOWN can scroll it. s_tv = text_viewer_create(s_screen, e->name); text_viewer_set_text(&s_tv, s_vbuf); s_vbody = s_tv.text_area; @@ -973,11 +975,11 @@ static void move_grid(int dx, int dy) { s--; } if (dy > 0) { - int t = s + GRID_COLS; + int t = s + s_grid_cols; s = (t < s_count) ? t : s_count - 1; } if (dy < 0) { - int t = s - GRID_COLS; + int t = s - s_grid_cols; if (t >= 0) { s = t; } @@ -1147,8 +1149,6 @@ static void files_input(const input_event_t *ev, void *ctx) { const bool nav = press || (ev->action == INPUT_ACTION_REPEAT); if (s_in_viewer) { - // _bounded clamps the scroll to the content — plain lv_obj_scroll_by() ignores - // the content bounds (and SCROLL_ELASTIC/MOMENTUM), which let it scroll forever. switch (ev->button) { case INPUT_BTN_DOWN: if (nav && s_vbody) From 01ddba6ebf3f57afa424b0d60b8a969e73b1a2c2 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 01:05:57 -0300 Subject: [PATCH 040/103] fix(lora): sx1262 and meshcore rx robustness --- .../LoRa/meshcore/meshcore_router.c | 4 +-- .../components/Drivers/sx1262/sx1262.c | 31 +++++++++++++++++-- 2 files changed, 31 insertions(+), 4 deletions(-) diff --git a/firmware_p4/components/Applications/LoRa/meshcore/meshcore_router.c b/firmware_p4/components/Applications/LoRa/meshcore/meshcore_router.c index 1da437a6f..8b363a11a 100644 --- a/firmware_p4/components/Applications/LoRa/meshcore/meshcore_router.c +++ b/firmware_p4/components/Applications/LoRa/meshcore/meshcore_router.c @@ -658,7 +658,7 @@ static void on_rx_done(const sx1262_packet_t *pkt, void *ctx) { (void)ctx; if (pkt == NULL) return; - ESP_LOGI(TAG, "RX diag: %u bytes rssi=%d snr=%d crc_err=%d hdr_err=%d", pkt->len, + ESP_LOGD(TAG, "RX diag: %u bytes rssi=%d snr=%d crc_err=%d hdr_err=%d", pkt->len, pkt->rssi_pkt_dbm, pkt->snr_pkt_db, (int)pkt->has_crc_error, (int)pkt->has_header_error); if (pkt->has_crc_error || pkt->has_header_error) { ESP_LOGD(TAG, "RX HW error -- skip"); @@ -667,7 +667,7 @@ static void on_rx_done(const sx1262_packet_t *pkt, void *ctx) { meshcore_packet_view_t view; if (!meshcore_packet_parse(pkt->buf, pkt->len, &view)) { - ESP_LOGW(TAG, "RX parse failed (%d bytes)", pkt->len); + ESP_LOGD(TAG, "RX parse failed (%d bytes)", pkt->len); return; } view.rssi_dbm = pkt->rssi_pkt_dbm; diff --git a/firmware_p4/components/Drivers/sx1262/sx1262.c b/firmware_p4/components/Drivers/sx1262/sx1262.c index 0127b0791..4277e5555 100644 --- a/firmware_p4/components/Drivers/sx1262/sx1262.c +++ b/firmware_p4/components/Drivers/sx1262/sx1262.c @@ -42,6 +42,7 @@ static TaskHandle_t s_stop_caller_handle = NULL; #define SX1262_IRQ_TASK_CORE SYS_CORE_RADIO #define SX1262_INIT_MAX_ATTEMPTS 3 +#define SX1262_IRQ_FAIL_RECOVER 5 static esp_err_t sx1262_hw_bringup(const sx1262_config_t *config); static esp_err_t validate_hal(const sx1262_hal_t *hal); @@ -478,10 +479,16 @@ esp_err_t sx1262_receive_single(uint32_t timeout_ms) { } esp_err_t sx1262_receive_continuous(void) { + if (!s_is_running) { + return ESP_ERR_INVALID_STATE; + } return sx1262_radio_receive_continuous(); } void sx1262_stop_rx(void) { + if (!s_is_running) { + return; + } sx1262_radio_stop_rx(); } esp_err_t sx1262_cad_start(void) { @@ -499,14 +506,34 @@ esp_err_t sx1262_set_rx_duty_cycle(uint32_t rx_ms, uint32_t sleep_ms) { return sx1262_radio_set_rx_duty_cycle(rx_ms, sleep_ms); } +static void sx1262_recover(void) { + ESP_LOGW(TAG, "SX1262 wedged — hardware reset + reconfigure"); + if (sx1262_hw_bringup(&s_config) != ESP_OK) { + ESP_LOGE(TAG, "recover: bring-up failed"); + return; + } + sx1262_irq_init(&s_config.hal, &s_config, &s_callbacks); + sx1262_radio_init(&s_config.hal, &s_config); + (void)sx1262_receive_continuous(); + ESP_LOGI(TAG, "SX1262 recovered"); +} + static void irq_task(void *arg) { (void)arg; sx1262_hal_t *hal = &s_config.hal; + int fail_streak = 0; ESP_LOGI(TAG, "IRQ task running"); while (s_is_running) { - sx1262_irq_process(); + if (sx1262_irq_process() != ESP_OK) { + if (++fail_streak >= SX1262_IRQ_FAIL_RECOVER) { + sx1262_recover(); + fail_streak = 0; + } + } else { + fail_streak = 0; + } hal->delay_ms(hal->ctx, 10); } @@ -644,7 +671,7 @@ static esp_err_t apply_workaround_w2(sx1262_hal_t *hal) { return ret; } - val |= 0x1E; /* Set bits 4:1 to 1111 */ + val |= 0x1E; ret = sx1262_cmd_write_register(hal, SX1262_REG_TX_CLAMP_CONFIG, &val, 1); if (ret != ESP_OK) { From e2426898c4bab50a8b6b38c1b72648ffa8153c59 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 01:05:57 -0300 Subject: [PATCH 041/103] fix(wifi): drop blocking led in c5 deauther and evil-twin hot paths --- .../Applications/wifi/wifi_deauther.c | 9 ++------ .../components/Service/wifi/wifi_service.c | 21 +------------------ 2 files changed, 3 insertions(+), 27 deletions(-) diff --git a/firmware_c5/components/Applications/wifi/wifi_deauther.c b/firmware_c5/components/Applications/wifi/wifi_deauther.c index dd1906df4..a1dcd463b 100644 --- a/firmware_c5/components/Applications/wifi/wifi_deauther.c +++ b/firmware_c5/components/Applications/wifi/wifi_deauther.c @@ -64,12 +64,8 @@ static void deauth_task(void *pvParameters); void wifi_deauther_send_raw_frame(const uint8_t *frame_buffer, int size) { esp_err_t ret = esp_wifi_80211_tx(WIFI_IF_AP, frame_buffer, size, false); - if (ret != ESP_OK) { + if (ret != ESP_OK) ESP_LOGD(TAG, "TX Fail: 0x%x", ret); - led_blink_red(); - } else { - led_blink_green(); - } } void wifi_deauther_send_deauth_frame(const wifi_ap_record_t *ap_record, @@ -159,7 +155,6 @@ bool wifi_deauther_start(const wifi_ap_record_t *ap_record, if (ap_record == NULL) return false; - // Clean up previous task memory if it wasn't freed if (s_deauth_task_stack != NULL) { free(s_deauth_task_stack); s_deauth_task_stack = NULL; @@ -262,7 +257,6 @@ bool wifi_deauther_start_targeted(const wifi_ap_record_t *ap_record, void wifi_deauther_stop(void) { if (s_is_running) { s_is_running = false; - // Give task time to finish loop and delete itself vTaskDelay(pdMS_TO_TICKS(DEAUTHER_DELAY_MS + DEAUTHER_STOP_MARGIN_MS)); } } @@ -290,6 +284,7 @@ static const uint8_t *get_deauth_frame_template(wifi_deauther_frame_type_t type) static void deauth_task(void *pvParameters) { ESP_LOGI(TAG, "Deauther Task Started"); + led_blink_green(); const uint8_t *frame_template = get_deauth_frame_template(s_type); uint8_t frame[DEAUTH_FRAME_LEN]; diff --git a/firmware_c5/components/Service/wifi/wifi_service.c b/firmware_c5/components/Service/wifi/wifi_service.c index 1d865b5fd..2d709c898 100644 --- a/firmware_c5/components/Service/wifi/wifi_service.c +++ b/firmware_c5/components/Service/wifi/wifi_service.c @@ -76,8 +76,6 @@ static void get_config_defaults(char *out_ssid, char *out_ip_addr, bool *out_enabled); -// Public function implementations - void wifi_service_init(void) { esp_err_t err; @@ -114,8 +112,6 @@ void wifi_service_init(void) { ESP_ERROR_CHECK(esp_wifi_set_mode(WIFI_MODE_APSTA)); - // Dual-band (2.4 + 5 GHz) BEFORE configuring the AP: a stale 5G-only band mode - // persisted in NVS otherwise rejects the 2.4 GHz AP channel and aborts set_config. esp_err_t band_err = esp_wifi_set_band_mode(WIFI_BAND_MODE_AUTO); if (band_err != ESP_OK) { ESP_LOGW(TAG, "Could not enable dual-band: %s", esp_err_to_name(band_err)); @@ -166,10 +162,6 @@ void wifi_service_init(void) { if (is_enabled) { ESP_ERROR_CHECK(esp_wifi_start()); s_is_active = true; - // Enable modem sleep explicitly. It only takes effect for an idle, connected - // STA (radio wakes per DTIM); AP mode and promiscuous sniffing keep the radio - // in continuous RX regardless. The real idle savings need the P4 to signal - // low-power over the bridge so the C5 can drop the radio (see power state API). esp_wifi_set_ps(WIFI_PS_MIN_MODEM); ESP_LOGI(TAG, "Wi-Fi AP started with SSID: %s", target_ssid); } else { @@ -565,14 +557,10 @@ void wifi_service_promiscuous_stop(void) { } bool wifi_service_is_busy(void) { - // A capture is in flight (sniffer / deauth detector / handshake). Do not drop - // the radio for power saving while this is true. return s_promiscuous_active; } void wifi_service_set_power_save(bool deep) { - // deep = screen dimmed (MAX_MODEM, longer beacon skips); otherwise MIN_MODEM. - // Only meaningful for an idle connected STA; harmless otherwise. esp_wifi_set_ps(deep ? WIFI_PS_MAX_MODEM : WIFI_PS_MIN_MODEM); } @@ -637,31 +625,24 @@ void wifi_service_stop_channel_hopping(void) { ESP_LOGI(TAG, "Channel hopping stopped"); } -// Static function implementations - static void event_handler(void *arg, esp_event_base_t event_base, int32_t event_id, void *event_data) { if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_STACONNECTED) { wifi_event_ap_staconnected_t *event = (wifi_event_ap_staconnected_t *)event_data; ESP_LOGI(TAG, "Station connected to AP, MAC: " MACSTR, MAC2STR(event->mac)); - led_blink_green(); } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_AP_STADISCONNECTED) { - led_blink_red(); + ESP_LOGI(TAG, "Station disconnected from AP"); } else if (event_base == WIFI_EVENT && event_id == WIFI_EVENT_STA_DISCONNECTED) { ESP_LOGI(TAG, "Disconnected from AP"); s_is_connected = false; } else if (event_base == IP_EVENT && event_id == IP_EVENT_AP_STAIPASSIGNED) { ESP_LOGI(TAG, "IP assigned to station connected to AP"); - led_blink_green(); } else if (event_base == IP_EVENT && event_id == IP_EVENT_STA_GOT_IP) { ESP_LOGI(TAG, "Got IP address, Wi-Fi connected"); s_is_connected = true; } } -// 2.4 GHz (1-13) plus the common non-DFS 5 GHz channels (UNII-1 + UNII-3). DFS -// channels (52-144) need radar detection and aren't usable for passive hopping, -// so they're left out. esp_wifi_set_channel picks the band from the number. static const uint8_t HOP_CHANNELS[] = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 36, 40, 44, 48, 149, 153, 157, 161, 165}; #define HOP_CHANNEL_COUNT (sizeof(HOP_CHANNELS) / sizeof(HOP_CHANNELS[0])) From f97b30b4216509a4423977f4952727e5cffd2c42 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 01:05:57 -0300 Subject: [PATCH 042/103] fix(ui): prevent tutorial double-click passthrough --- .../ui/components/tutorial/screen_tips.c | 58 +++-- .../ui/components/tutorial/tutorial_ui.c | 219 +++++++++++++----- 2 files changed, 205 insertions(+), 72 deletions(-) diff --git a/firmware_p4/components/Applications/ui/components/tutorial/screen_tips.c b/firmware_p4/components/Applications/ui/components/tutorial/screen_tips.c index 82dcab0d0..f06c0c328 100644 --- a/firmware_p4/components/Applications/ui/components/tutorial/screen_tips.c +++ b/firmware_p4/components/Applications/ui/components/tutorial/screen_tips.c @@ -30,8 +30,8 @@ #define TIP_NVS_KEY_SKIP "skip" #define TIP_WORDS ((SCREEN_COUNT + 31) / 32) -#define TIP_SCRIM_OPA 232 // how dark the screen behind gets -#define TIP_ARM_MS 500 // ignore input while the intro plays +#define TIP_SCRIM_OPA 232 +#define TIP_ARM_MS 500 #define TIP_TEXT_W 182 #define TIP_ART "/assets/img/image.bin" @@ -108,7 +108,8 @@ static const tip_entry_t TIPS[] = { {SCREEN_NFC_MENU, "NFC", - "The whole 13.56 MHz NFC world: read tags, write, emulate and store your cards."}, + "The whole 13.56 MHz NFC world: read tags, write, emulate and store your cards. Heads-up: " + "mocked for now due to a hardware issue."}, {SCREEN_CARD_EMU, "CARD EMULATION", "Build a card from scratch or pick a saved one, and the High Boy broadcasts it as the real " @@ -144,7 +145,8 @@ static const tip_entry_t TIPS[] = { {SCREEN_SUBGHZ_MENU, "SUB-GHZ", - "The Sub-GHz radio: capture, analyze and replay remote signals on 433, 868 and 315 MHz."}, + "The Sub-GHz radio: capture, analyze and replay remote signals on 433, 868 and 315 MHz. " + "Heads-up: mocked for now due to a hardware issue."}, {SCREEN_SUBGHZ_BRUTE, "CODE BRUTE FORCE", "Brute Force fires thousands of codes across a range until one pops the gate - no key " @@ -155,8 +157,8 @@ static const tip_entry_t TIPS[] = { "rate and key."}, {SCREEN_RFID_MENU, "RFID 125 kHz", - "RFID reads LF 125 kHz tags: read, emulate, add one by hand, even clone a whole access " - "badge."}, + "RFID reads LF 125 kHz tags: read, emulate, add one by hand, even clone a whole access badge. " + "Heads-up: mocked for now due to a hardware issue."}, {SCREEN_SUBGHZ_CONFIG, "RADIO CONFIG", "For the tough ones, Radio Config tunes modulation, bandwidth, data rate and preset before " @@ -184,7 +186,7 @@ static const tip_entry_t TIPS[] = { {SCREEN_LORA_CHAT, "LORA MESH", "Step into the LoRa mesh: pick MeshCore or Meshtastic, see the nodes on the map and chat " - "off-grid."}, + "off-grid. Heads-up: mocked for now due to a hardware issue."}, {SCREEN_LORA_SECURE_DM, "ENCRYPTED DM", "Direct messages with per-contact X25519 keys. Compare fingerprints to be sure who is on the " @@ -288,6 +290,7 @@ static uint32_t s_seen[TIP_WORDS]; static lv_obj_t *s_scrim = NULL; static lv_obj_t *s_prev_focus = NULL; static uint32_t s_open_tick = 0; +static bool s_armed = false; static const tip_entry_t *tip_for(screen_id_t screen) { for (int i = 0; i < TIP_COUNT; i++) { @@ -368,7 +371,7 @@ static void dismiss(void) { static void scrim_key_cb(lv_event_t *e) { if (lv_event_get_code(e) != LV_EVENT_KEY) return; - if (lv_tick_get() - s_open_tick < TIP_ARM_MS) + if (!s_armed || lv_tick_get() - s_open_tick < TIP_ARM_MS) return; uint32_t key = lv_event_get_key(e); if (key == LV_KEY_ENTER || key == LV_KEY_ESC || key == LV_KEY_RIGHT) @@ -378,9 +381,13 @@ static void scrim_key_cb(lv_event_t *e) { void screen_tips_handle_input(const input_event_t *ev) { if (!s_active || ev == NULL) return; + if (ev->action == INPUT_ACTION_RELEASE) { + s_armed = true; + return; + } if (ev->action != INPUT_ACTION_PRESS) return; - if (lv_tick_get() - s_open_tick < TIP_ARM_MS) + if (!s_armed || lv_tick_get() - s_open_tick < TIP_ARM_MS) return; if (ev->button == INPUT_BTN_OK || ev->button == INPUT_BTN_BACK || ev->button == INPUT_BTN_RIGHT) dismiss(); @@ -396,7 +403,6 @@ static void tip_ty_cb(void *o, int32_t v) { lv_obj_set_style_translate_y((lv_obj_t *)o, v, 0); } -// Fade an element in from transparent, after `delay` ms. static void tip_fade(lv_obj_t *o, uint32_t delay) { lv_obj_set_style_opa(o, LV_OPA_TRANSP, 0); lv_anim_t a; @@ -410,7 +416,6 @@ static void tip_fade(lv_obj_t *o, uint32_t delay) { lv_anim_start(&a); } -// Gentle continuous float for the mascot. static void tip_bob(lv_obj_t *o) { lv_anim_t a; lv_anim_init(&a); @@ -431,14 +436,13 @@ static void build_overlay(const tip_entry_t *entry) { lv_obj_remove_flag(scrim, LV_OBJ_FLAG_SCROLLABLE); lv_obj_add_flag(scrim, LV_OBJ_FLAG_CLICKABLE); lv_obj_set_style_bg_color(scrim, lv_color_black(), 0); - lv_obj_set_style_bg_opa(scrim, LV_OPA_TRANSP, 0); // fades in — the screen darkens + lv_obj_set_style_bg_opa(scrim, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(scrim, 0, 0); lv_obj_set_style_radius(scrim, 0, 0); lv_obj_set_style_pad_all(scrim, 0, 0); lv_obj_add_event_cb(scrim, scrim_key_cb, LV_EVENT_KEY, NULL); s_scrim = scrim; - // The screen behind darkens first. lv_anim_t a; lv_anim_init(&a); lv_anim_set_var(&a, scrim); @@ -448,7 +452,6 @@ static void build_overlay(const tip_entry_t *entry) { lv_anim_set_path_cb(&a, lv_anim_path_ease_out); lv_anim_start(&a); - // No boxed window: octobit on top, the explanation below it, centered on the scrim. lv_obj_t *col = lv_obj_create(scrim); lv_obj_remove_style_all(col); lv_obj_remove_flag(col, LV_OBJ_FLAG_SCROLLABLE); @@ -463,18 +466,36 @@ static void build_overlay(const tip_entry_t *entry) { if (dsc != NULL) { lv_obj_t *img = lv_image_create(col); lv_image_set_src(img, dsc); - lv_image_set_scale(img, 168); // ~66% so it leaves room for the text + lv_image_set_scale(img, 168); tip_fade(img, 130); tip_bob(img); } - lv_obj_t *title = lv_label_create(col); + lv_obj_t *card = lv_obj_create(col); + lv_obj_remove_style_all(card); + lv_obj_remove_flag(card, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_width(card, LV_SIZE_CONTENT); + lv_obj_set_height(card, LV_SIZE_CONTENT); + lv_obj_set_flex_flow(card, LV_FLEX_FLOW_COLUMN); + lv_obj_set_flex_align(card, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_set_style_pad_hor(card, 18, 0); + lv_obj_set_style_pad_ver(card, 14, 0); + lv_obj_set_style_pad_row(card, 8, 0); + lv_obj_set_style_bg_opa(card, LV_OPA_COVER, 0); + lv_obj_set_style_bg_color(card, current_theme.bg_primary, 0); + lv_obj_set_style_radius(card, 16, 0); + lv_obj_set_style_border_width(card, 1, 0); + lv_obj_set_style_border_color(card, current_theme.border_accent, 0); + lv_obj_set_style_border_opa(card, 110, 0); + tip_fade(card, 200); + + lv_obj_t *title = lv_label_create(card); lv_label_set_text(title, entry->title); lv_obj_set_style_text_font(title, &lv_font_montserrat_16, 0); lv_obj_set_style_text_color(title, current_theme.border_accent, 0); tip_fade(title, 300); - lv_obj_t *tip = lv_label_create(col); + lv_obj_t *tip = lv_label_create(card); lv_label_set_long_mode(tip, LV_LABEL_LONG_WRAP); lv_obj_set_width(tip, TIP_TEXT_W); lv_label_set_text(tip, entry->tip); @@ -483,7 +504,7 @@ static void build_overlay(const tip_entry_t *entry) { lv_obj_set_style_text_align(tip, LV_TEXT_ALIGN_CENTER, 0); tip_fade(tip, 380); - lv_obj_t *hint = lv_label_create(col); + lv_obj_t *hint = lv_label_create(card); lv_label_set_text(hint, LV_SYMBOL_OK " OK"); lv_obj_set_style_text_font(hint, &lv_font_montserrat_12, 0); lv_obj_set_style_text_color(hint, current_theme.border_accent, 0); @@ -491,6 +512,7 @@ static void build_overlay(const tip_entry_t *entry) { tip_fade(hint, 460); s_open_tick = lv_tick_get(); + s_armed = false; s_active = true; hijack_input(); } diff --git a/firmware_p4/components/Applications/ui/components/tutorial/tutorial_ui.c b/firmware_p4/components/Applications/ui/components/tutorial/tutorial_ui.c index 84bd5577b..4808e26c7 100644 --- a/firmware_p4/components/Applications/ui/components/tutorial/tutorial_ui.c +++ b/firmware_p4/components/Applications/ui/components/tutorial/tutorial_ui.c @@ -28,6 +28,8 @@ #include "host_link_sec.h" #include "storage_assets.h" #include "storage_init.h" +#include + #include "sys_time.h" #include "tos_config.h" #include "tos_storage_paths.h" @@ -59,19 +61,17 @@ static const char *const WIZ_THEME_NAMES[] = {"default", "cyber_blue"}; #define WIZ_SUB_OPA 180 #define WIZ_SWATCH 24 -// Animation timing (slow + cinematic; affordable now that PSRAM keeps frames resident). #define FADE_OUT_MS 180 #define FADE_IN_MS 320 #define PROG_MS 460 -#define STAGGER_MS 110 // gap between elements fading in one after another -#define MASCOT_FADE 420 // octobit fade-in -#define MASCOT_ENTER 640 // when the text starts fading in (after octobit is established) -#define BOB_MS 1800 // octobit float period (slow, gentle) +#define STAGGER_MS 110 +#define MASCOT_FADE 420 +#define MASCOT_ENTER 640 +#define BOB_MS 1800 #define BOB_PX 6 -#define WOBBLE_MS 560 // arrow idle horizontal swing period +#define WOBBLE_MS 560 #define WOBBLE_PX 5 -// Vertical chooser geometry. #define CH_ROW_H 30 #define CH_ARROW_W 22 #define CH_LIST_W 190 @@ -80,7 +80,7 @@ static const char *const WIZ_THEME_NAMES[] = {"default", "cyber_blue"}; extern lv_group_t *main_group; static bool s_active = false; -static bool s_busy = false; // mid page-transition: swallow input +static bool s_busy = false; static int s_page = 0; static int s_pending = 0; static uint32_t s_open_tick = 0; @@ -90,9 +90,8 @@ static lv_obj_t *s_content = NULL; static lv_obj_t *s_prog_fill = NULL; static lv_obj_t *s_step = NULL; static lv_obj_t *s_foot = NULL; -static lv_obj_t *s_mascot = NULL; // octobit on the current page (NULL if none) +static lv_obj_t *s_mascot = NULL; -// Active chooser (rebuilt per page; count==0 means the page is not a chooser). static lv_obj_t *s_ch_rows[CH_MAX] = {NULL}; static lv_obj_t *s_ch_arrow = NULL; static int s_ch_count = 0; @@ -102,8 +101,6 @@ static int *s_ch_selp = NULL; static int s_lang_sel = 0; static int s_theme_sel = 0; -// ---- small animation helpers ------------------------------------------------ - static void anim_opa_cb(void *obj, int32_t v) { lv_obj_set_style_opa((lv_obj_t *)obj, (lv_opa_t)v, 0); } @@ -135,8 +132,6 @@ static void fade(lv_obj_t *o, lv_anim_start(&a); } -// ---- reusable page widgets -------------------------------------------------- - static lv_obj_t *wiz_heading(lv_obj_t *p, const char *text) { lv_obj_t *l = lv_label_create(p); lv_label_set_text(l, text); @@ -200,7 +195,6 @@ static void wiz_chip(lv_obj_t *p, const char *text, lv_color_t accent) { lv_obj_set_style_pad_ver(k, 4, 0); } -// A small octobit that gently bobs, added to the top of a guide page's content. static void wiz_mascot(lv_obj_t *p, int zoom) { lv_image_dsc_t *dsc = assets_get(WIZ_ART_ASSET); if (dsc == NULL) @@ -209,8 +203,7 @@ static void wiz_mascot(lv_obj_t *p, int zoom) { lv_image_set_src(img, dsc); if (zoom != 256) lv_image_set_scale(img, zoom); - s_mascot = img; // build_page_now choreographs its entrance (fade + glide in) - // Gentle continuous float (translate-y; independent of the entrance translate-x). + s_mascot = img; lv_anim_t a; lv_anim_init(&a); lv_anim_set_var(&a, img); @@ -223,8 +216,6 @@ static void wiz_mascot(lv_obj_t *p, int zoom) { lv_anim_start(&a); } -// ---- animated vertical chooser (the "setinha" selector) --------------------- - static void ch_restyle(void) { for (int i = 0; i < s_ch_count; i++) { lv_obj_t *row = s_ch_rows[i]; @@ -241,8 +232,6 @@ static void ch_restyle(void) { } } -// Vertical alignment is INSTANT — the arrow snaps to the selected row; the only -// motion it keeps is the idle horizontal swing (started in build_chooser). static void ch_arrow_to(int idx) { if (!s_ch_arrow) return; @@ -298,7 +287,6 @@ build_chooser(lv_obj_t *c, const char **items, const uint32_t *colors, int count ch_restyle(); ch_arrow_to(s_ch_sel); - // Idle swing so it reads as "point here, use UP/DOWN". lv_anim_t a; lv_anim_init(&a); lv_anim_set_var(&a, s_ch_arrow); @@ -322,8 +310,6 @@ static void chooser_move(int delta) { ch_arrow_to(n); } -// ---- pages ------------------------------------------------------------------ - static void page_language(lv_obj_t *c) { wiz_heading(c, "Language"); wiz_sub(c, "Pick your language. UP / DOWN to choose."); @@ -331,27 +317,116 @@ static void page_language(lv_obj_t *c) { build_chooser(c, langs, NULL, 4, &s_lang_sel); } +static struct tm s_dt; +static int s_dt_field = 0; +static bool s_dt_active = false; +static lv_obj_t *s_dt_lbl[5] = {0}; + +static int dt_days_in_month(int year, int mon0) { + static const int base[12] = {31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}; + if (mon0 == 1) { + bool leap = (year % 4 == 0 && (year % 100 != 0 || year % 400 == 0)); + return leap ? 29 : 28; + } + return base[mon0]; +} + +static void dt_refresh(void) { + char b[8]; + snprintf(b, sizeof(b), "%04d", s_dt.tm_year + 1900); + if (s_dt_lbl[0]) lv_label_set_text(s_dt_lbl[0], b); + snprintf(b, sizeof(b), "%02d", s_dt.tm_mon + 1); + if (s_dt_lbl[1]) lv_label_set_text(s_dt_lbl[1], b); + snprintf(b, sizeof(b), "%02d", s_dt.tm_mday); + if (s_dt_lbl[2]) lv_label_set_text(s_dt_lbl[2], b); + snprintf(b, sizeof(b), "%02d", s_dt.tm_hour); + if (s_dt_lbl[3]) lv_label_set_text(s_dt_lbl[3], b); + snprintf(b, sizeof(b), "%02d", s_dt.tm_min); + if (s_dt_lbl[4]) lv_label_set_text(s_dt_lbl[4], b); + for (int i = 0; i < 5; i++) + if (s_dt_lbl[i]) + lv_obj_set_style_text_color( + s_dt_lbl[i], i == s_dt_field ? current_theme.border_accent : current_theme.text_main, 0); +} + +static void dt_adjust(int d) { + switch (s_dt_field) { + case 0: { + int y = s_dt.tm_year + 1900 + d; + if (y < 2020) y = 2099; + if (y > 2099) y = 2020; + s_dt.tm_year = y - 1900; + break; + } + case 1: + s_dt.tm_mon = (s_dt.tm_mon + d + 12) % 12; + break; + case 2: { + int dim = dt_days_in_month(s_dt.tm_year + 1900, s_dt.tm_mon); + s_dt.tm_mday += d; + if (s_dt.tm_mday < 1) s_dt.tm_mday = dim; + if (s_dt.tm_mday > dim) s_dt.tm_mday = 1; + break; + } + case 3: + s_dt.tm_hour = (s_dt.tm_hour + d + 24) % 24; + break; + case 4: + s_dt.tm_min = (s_dt.tm_min + d + 60) % 60; + break; + default: + break; + } + int dim = dt_days_in_month(s_dt.tm_year + 1900, s_dt.tm_mon); + if (s_dt.tm_mday > dim) s_dt.tm_mday = dim; + dt_refresh(); +} + +static void dt_save(void) { + struct tm t = s_dt; + t.tm_sec = 0; + t.tm_isdst = 0; + time_t epoch = mktime(&t); + if (epoch != (time_t)-1) + sys_time_set(epoch, SYS_TIME_SOURCE_MANUAL); +} + static void page_datetime(lv_obj_t *c) { wiz_heading(c, "Date & Time"); - lv_obj_t *clk = lv_label_create(c); - char clkbuf[16]; - if (!sys_time_format(clkbuf, sizeof(clkbuf), "%H:%M")) - snprintf(clkbuf, sizeof(clkbuf), "--:--"); - lv_label_set_text(clk, clkbuf); - lv_obj_set_style_text_font(clk, &lv_font_montserrat_16, 0); - lv_obj_set_style_text_color(clk, current_theme.border_accent, 0); - wiz_sub(c, "High Boy timestamps every capture and log. Sync the clock from the companion app."); - lv_obj_t *pill = lv_label_create(c); - lv_label_set_text(pill, LV_SYMBOL_REFRESH " Sync from companion"); - lv_obj_set_style_text_font(pill, &lv_font_montserrat_12, 0); - lv_obj_set_style_text_color(pill, current_theme.border_accent, 0); - lv_obj_set_style_bg_opa(pill, LV_OPA_COVER, 0); - lv_obj_set_style_bg_color(pill, current_theme.bg_secondary, 0); - lv_obj_set_style_border_width(pill, 1, 0); - lv_obj_set_style_border_color(pill, current_theme.border_accent, 0); - lv_obj_set_style_radius(pill, 8, 0); - lv_obj_set_style_pad_hor(pill, 9, 0); - lv_obj_set_style_pad_ver(pill, 4, 0); + wiz_sub(c, "High Boy timestamps every capture and log. Set the clock now."); + + time_t now = sys_time_now(); + localtime_r(&now, &s_dt); + s_dt_field = 0; + + lv_obj_t *row = lv_obj_create(c); + lv_obj_remove_style_all(row); + lv_obj_remove_flag(row, LV_OBJ_FLAG_SCROLLABLE); + lv_obj_set_size(row, LV_SIZE_CONTENT, LV_SIZE_CONTENT); + lv_obj_set_flex_flow(row, LV_FLEX_FLOW_ROW); + lv_obj_set_flex_align(row, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); + lv_obj_set_style_pad_column(row, 3, 0); + + static const char *const SEP[5] = {NULL, "-", "-", " ", ":"}; + for (int i = 0; i < 5; i++) { + if (SEP[i]) { + lv_obj_t *sep = lv_label_create(row); + lv_label_set_text(sep, SEP[i]); + lv_obj_set_style_text_font(sep, &lv_font_montserrat_16, 0); + lv_obj_set_style_text_color(sep, current_theme.text_secondary, 0); + } + s_dt_lbl[i] = lv_label_create(row); + lv_obj_set_style_text_font(s_dt_lbl[i], &lv_font_montserrat_16, 0); + } + dt_refresh(); + s_dt_active = true; + + lv_obj_t *hint = lv_label_create(c); + lv_label_set_text(hint, + LV_SYMBOL_UP LV_SYMBOL_DOWN " edit " LV_SYMBOL_LEFT LV_SYMBOL_RIGHT + " field " LV_SYMBOL_OK " set"); + lv_obj_set_style_text_font(hint, &lv_font_montserrat_12, 0); + lv_obj_set_style_text_color(hint, current_theme.text_secondary, 0); } static void wiz_status_row(lv_obj_t *list, const char *name, const char *value) { @@ -388,7 +463,7 @@ static void page_storage(lv_obj_t *c) { static void page_companion(lv_obj_t *c) { wiz_heading(c, "Companion App"); - wiz_sub(c, "Pair the phone app for time sync, file transfer and remote control."); + wiz_sub(c, "Pair the phone app for file transfer and remote control."); lv_obj_t *box = lv_label_create(c); char psk[HOST_LINK_PSK_HEX_SIZE]; if (host_link_sec_get_psk_hex(psk, sizeof(psk)) == ESP_OK) { @@ -493,6 +568,8 @@ static void page_ready(lv_obj_t *c) { wiz_mascot(c, 256); wiz_heading(c, "You're all set!"); wiz_sub(c, "Tips will nudge you as you go. Let's dive in."); + wiz_sub(c, "The High Boy is an early prototype: a few tools are still simulated while the " + "hardware matures. You're getting a first look at something that's growing fast."); } typedef void (*wiz_build_fn)(lv_obj_t *); @@ -500,12 +577,12 @@ typedef void (*wiz_build_fn)(lv_obj_t *); typedef struct { wiz_build_fn build; const char *foot; - bool mascot; // keep the persistent guide visible from here on + bool mascot; } wiz_page_t; static const wiz_page_t PAGES[] = { {page_language, "UP/DOWN Pick OK Next", false}, - {page_datetime, "OK Next BACK Back", false}, + {page_datetime, "OK Set BACK Back", false}, {page_storage, "OK Next BACK Back", false}, {page_companion, "OK Next BACK Back", false}, {page_terms, "OK Accept BACK Back", false}, @@ -527,17 +604,19 @@ static void arm_done(lv_anim_t *a) { } static void build_page_now(int idx) { - s_busy = true; // cleared by arm_done() when the fade-in finishes + s_busy = true; s_page = idx; s_ch_count = 0; s_ch_arrow = NULL; - s_mascot = NULL; // set by wiz_mascot() during the build if this page has one + s_mascot = NULL; + s_dt_active = false; + for (int i = 0; i < 5; i++) + s_dt_lbl[i] = NULL; lv_obj_clean(s_content); PAGES[idx].build(s_content); lv_label_set_text(s_foot, PAGES[idx].foot); lv_label_set_text_fmt(s_step, "%d / %d", idx + 1, PAGE_COUNT); - // Progress bar eases to the new fraction. lv_anim_t a; lv_anim_init(&a); lv_anim_set_var(&a, s_prog_fill); @@ -547,13 +626,10 @@ static void build_page_now(int idx) { lv_anim_set_path_cb(&a, lv_anim_path_ease_out); lv_anim_start(&a); - // Compose the page in on the dark canvas: octobit fades in and glides from the - // side first, THEN the text fades in below it, element by element. lv_obj_set_style_opa(s_content, LV_OPA_COVER, 0); uint32_t base = 0; if (s_mascot) { - // Octobit simply fades in and floats in place (no slide); the text waits for it. fade(s_mascot, LV_OPA_TRANSP, LV_OPA_COVER, MASCOT_FADE, 0, lv_anim_path_ease_out, NULL); base = MASCOT_ENTER; } @@ -574,7 +650,6 @@ static void build_page_now(int idx) { step++; } - // Arm input once the whole sequence has settled (a no-op timing anim). uint32_t settle = base + (step > 0 ? (uint32_t)(step - 1) * STAGGER_MS : 0) + FADE_IN_MS; fade(s_content, LV_OPA_COVER, LV_OPA_COVER, settle, 0, lv_anim_path_linear, arm_done); } @@ -642,7 +717,43 @@ static void key_cb(lv_event_t *e) { return; uint32_t key = lv_event_get_key(e); - // On a chooser page UP/DOWN move the selection (arrow slides to it). + if (s_dt_active) { + if (key == LV_KEY_UP) { + dt_adjust(+1); + return; + } + if (key == LV_KEY_DOWN) { + dt_adjust(-1); + return; + } + if (key == LV_KEY_RIGHT) { + s_dt_field = (s_dt_field + 1) % 5; + dt_refresh(); + return; + } + if (key == LV_KEY_LEFT) { + s_dt_field = (s_dt_field + 4) % 5; + dt_refresh(); + return; + } + if (key == LV_KEY_ENTER) { + dt_save(); + s_dt_active = false; + if (s_page + 1 < PAGE_COUNT) + go_page(s_page + 1); + else + finish(); + return; + } + if (key == LV_KEY_ESC) { + s_dt_active = false; + if (s_page > 0) + go_page(s_page - 1); + return; + } + return; + } + if (s_ch_count > 0) { if (key == LV_KEY_UP) { chooser_move(-1); From e05afb04c9c43d23b23dc9f855132b973040cdcb Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 01:05:57 -0300 Subject: [PATCH 043/103] fix(ui): drop wifi toggle and mock networks from connection settings --- .../connection_settings_ui.c | 74 +------------------ 1 file changed, 4 insertions(+), 70 deletions(-) diff --git a/firmware_p4/components/Applications/ui/screens/connection_settings/connection_settings_ui.c b/firmware_p4/components/Applications/ui/screens/connection_settings/connection_settings_ui.c index 7b2c60c94..069ab56bd 100644 --- a/firmware_p4/components/Applications/ui/screens/connection_settings/connection_settings_ui.c +++ b/firmware_p4/components/Applications/ui/screens/connection_settings/connection_settings_ui.c @@ -15,39 +15,21 @@ #include "connection_settings_ui.h" -#include "esp_log.h" -#include "esp_timer.h" - #include "host_link.h" #include "lv_port_indev.h" #include "menu_component_ui.h" -#include "msgbox_ui.h" #include "notify_ui.h" #include "power_manager.h" #include "tusb_desc.h" #include "ui_manager.h" #include "ui_theme.h" -#include "wifi_service.h" - -static const char *TAG = "CONN_UI"; -#define IDX_WIFI 0 -#define IDX_NETWORKS 1 -#define IDX_USB_NATIVE 2 -#define WIFI_LOADING_TIMER_INTERVAL_MS 100 -#define WIFI_LOADING_MIN_US 1500000 -#define WIFI_LOADING_MAX_US 5000000 -#define MSGBOX_DEBOUNCE_US 300000 +#define IDX_USB_NATIVE 0 static lv_obj_t *s_screen_conn = NULL; static menu_component_t s_menu; -static lv_timer_t *s_wifi_loading_timer = NULL; -static int64_t s_wifi_loading_start_time = 0; -static int64_t s_msgbox_open_time = 0; static bool s_usb_no_sleep_held = false; -static void wifi_loading_timer_cb(lv_timer_t *timer); -static void show_wifi_loading(void); static void connection_settings_input(const input_event_t *ev, void *ctx); void ui_connection_settings_open(void) { @@ -56,17 +38,12 @@ void ui_connection_settings_open(void) { s_screen_conn = NULL; } - bool is_wifi_active = wifi_service_is_active(); - s_screen_conn = lv_obj_create(NULL); lv_obj_set_style_bg_color(s_screen_conn, current_theme.screen_base, 0); lv_obj_set_style_bg_opa(s_screen_conn, LV_OPA_COVER, 0); lv_obj_remove_flag(s_screen_conn, LV_OBJ_FLAG_SCROLLABLE); s_menu = menu_component_create(s_screen_conn, "CONNECTION", "/assets/icons/hub.bin"); - menu_component_add_toggle(&s_menu, "/assets/icons/wifi.bin", "WI-FI", is_wifi_active); - menu_component_add_item(&s_menu, "/assets/icons/wifi_find.bin", "NETWORKS"); - // USB-C data mux: OFF = UART bridge (serial/flash, default), ON = native P4 USB. menu_component_add_toggle(&s_menu, "/assets/icons/usb.bin", "USB NATIVE", usb_mux_is_native()); ui_input_set_screen_handler(connection_settings_input, NULL); @@ -74,42 +51,8 @@ void ui_connection_settings_open(void) { ui_screen_load_owned(&s_screen_conn, s_screen_conn); } -static void wifi_loading_timer_cb(lv_timer_t *timer) { - int64_t elapsed = esp_timer_get_time() - s_wifi_loading_start_time; - bool is_ready = (wifi_service_is_active() && elapsed >= WIFI_LOADING_MIN_US) || - elapsed >= WIFI_LOADING_MAX_US; - if (!is_ready) - return; - - lv_timer_del(timer); - s_wifi_loading_timer = NULL; - msgbox_close(); - notify(NOTIFY_INFO, "Wi-Fi on"); -} - -static void show_wifi_loading(void) { - if (s_wifi_loading_timer != NULL) - lv_timer_del(s_wifi_loading_timer); - - s_wifi_loading_start_time = esp_timer_get_time(); - msgbox_open(LV_SYMBOL_WIFI, "LIGANDO WIFI...", NULL, NULL, NULL); - s_wifi_loading_timer = - lv_timer_create(wifi_loading_timer_cb, WIFI_LOADING_TIMER_INTERVAL_MS, NULL); -} - static void conn_toggle(int sel) { - if (sel == IDX_WIFI) { - menu_component_toggle_item(&s_menu, IDX_WIFI); - bool is_new_state = menu_component_get_toggle(&s_menu, IDX_WIFI); - wifi_service_set_enabled(is_new_state); - - if (is_new_state) { - show_wifi_loading(); - } else { - msgbox_close(); - notify(NOTIFY_INFO, "Wi-Fi off"); - } - } else if (sel == IDX_USB_NATIVE) { + if (sel == IDX_USB_NATIVE) { menu_component_toggle_item(&s_menu, IDX_USB_NATIVE); bool native = menu_component_get_toggle(&s_menu, IDX_USB_NATIVE); usb_mux_set_native(native); @@ -147,19 +90,10 @@ static void connection_settings_input(const input_event_t *ev, void *ctx) { ui_switch_screen(SCREEN_SETTINGS); break; case INPUT_BTN_LEFT: - if (press) - conn_toggle(sel); - break; case INPUT_BTN_RIGHT: - if (press) { - conn_toggle(sel); - if (sel == IDX_NETWORKS) - ui_switch_screen(SCREEN_CONNECT_WIFI); - } - break; case INPUT_BTN_OK: - if (press && sel == IDX_NETWORKS) - ui_switch_screen(SCREEN_CONNECT_WIFI); + if (press) + conn_toggle(sel); break; default: break; From 05e3df428816eb2cf66b1622f35c7ba59f4aee59 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 01:05:57 -0300 Subject: [PATCH 044/103] feat(ui): c5 update progress modal and imu entry --- .../ui/screens/settings/settings_ui.c | 19 ++++--------------- 1 file changed, 4 insertions(+), 15 deletions(-) diff --git a/firmware_p4/components/Applications/ui/screens/settings/settings_ui.c b/firmware_p4/components/Applications/ui/screens/settings/settings_ui.c index 5cf030f59..d1d044cae 100644 --- a/firmware_p4/components/Applications/ui/screens/settings/settings_ui.c +++ b/firmware_p4/components/Applications/ui/screens/settings/settings_ui.c @@ -49,7 +49,6 @@ static const char *TAG = "SETTINGS_UI"; #define C5_PASSTHROUGH_TASK_PRIO SYS_PRIO_SERVICE_HI #define REBOOT_DELAY_MS 80 -#define ACTION_TOGGLE_ROTATION (-1) #define ACTION_FLASH_C5 (-2) #define ACTION_C5_PASSTHROUGH (-3) #define ACTION_REBOOT_P4 (-4) @@ -84,7 +83,6 @@ static const settings_item_t MAIN_ITEMS[] = { {"DISPLAY", "/assets/icons/display_settings.bin", SCREEN_DISPLAY_SETTINGS}, {"INTERFACE", "/assets/icons/tune.bin", SCREEN_INTERFACE_SETTINGS}, {"THEME", "/assets/icons/palette.bin", SCREEN_THEME_SELECTOR}, - {"ROTATE SCREEN", "/assets/icons/screen_rotation.bin", ACTION_TOGGLE_ROTATION}, {"SOUND", "/assets/icons/volume_up.bin", SCREEN_SOUND_SETTINGS}, {"AUDIO & HAPTICS", "/assets/icons/graphic_eq.bin", GOTO_LAB}, {"BATTERY", "/assets/icons/battery_full.bin", SCREEN_BATTERY_SETTINGS}, @@ -174,11 +172,6 @@ view_table(settings_view_t view, int *count, const char **title, const char **ic } } -static void rotation_confirm_cb(bool confirm) { - if (confirm) - ui_manager_relayout_current(); -} - static void show_c5_progress(const char *msg) { if (s_c5_overlay == NULL) { s_c5_overlay = lv_obj_create(s_screen); @@ -295,6 +288,10 @@ static void start_c5_flash(void) { if (s_c5_prog_timer == NULL) s_c5_prog_timer = lv_timer_create(c5_progress_tick, C5_PROGRESS_TICK_MS, NULL); + if (s_c5_overlay) + lv_obj_move_foreground(s_c5_overlay); + lv_refr_now(NULL); + xTaskCreatePinnedToCore(c5_flash_task, "c5_flash", C5_FLASH_TASK_STACK, @@ -413,14 +410,6 @@ static void start_reboot_p4(void) { static bool run_action(int target) { switch (target) { - case ACTION_TOGGLE_ROTATION: - - msgbox_open("/assets/icons/screen_rotation.bin", - "Switch portrait/landscape now?", - "YES", - "NO", - rotation_confirm_cb); - return true; case ACTION_FLASH_C5: start_c5_flash(); From 6f97fc5181f236fe2810a50a7cac93575142edb9 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 01:05:57 -0300 Subject: [PATCH 045/103] fix(ui): led notify config --- .../ui/screens/settings/led_ctrl_ui.c | 28 +++++++------------ 1 file changed, 10 insertions(+), 18 deletions(-) diff --git a/firmware_p4/components/Applications/ui/screens/settings/led_ctrl_ui.c b/firmware_p4/components/Applications/ui/screens/settings/led_ctrl_ui.c index d89e544ab..09dfd7739 100644 --- a/firmware_p4/components/Applications/ui/screens/settings/led_ctrl_ui.c +++ b/firmware_p4/components/Applications/ui/screens/settings/led_ctrl_ui.c @@ -43,7 +43,7 @@ #define PILL_W 52 #define PILL_H 24 -#define BRIGHT_MIN 5 // lowest level the LED still lights at +#define BRIGHT_MIN 5 #define BRIGHT_MAX 100 #define BRIGHT_STEP 5 #define BRIGHT_DEFAULT 80 @@ -54,14 +54,13 @@ #define HDR_ICON "/assets/icons/palette.bin" #define HDR_TITLE "LED SIGNALS" -// The three semantic signals whose color is being configured. enum { SIG_INFO = 0, SIG_WARNING, SIG_ERROR, SIG_COUNT }; static const char *SIG_NAMES[SIG_COUNT] = {"INFO", "WARNING", "ERROR"}; enum { - FOCUS_SIGNAL = 0, // which signal to edit (info / warning / error) - FOCUS_COLOR, // color assigned to the selected signal - FOCUS_BRIGHT, // global intensity (one value for all signals) + FOCUS_SIGNAL = 0, + FOCUS_COLOR, + FOCUS_BRIGHT, FOCUS_COUNT, }; @@ -70,9 +69,6 @@ typedef struct { uint32_t hex; } preset_t; -// Saturated primaries: these drive a physical RGB LED, so pale/pastel values -// (lots of all three channels) wash out to white. Keep the channels pure. The -// three signal defaults (purple/yellow/red) are all present so they map back. static const preset_t PRESETS[] = { {"Red", 0xFF0000}, {"Orange", 0xFF6000}, @@ -93,12 +89,10 @@ static lv_obj_t *s_sig_val = NULL; static int s_focus = FOCUS_SIGNAL; static int s_signal = SIG_INFO; -static int s_color_idx[SIG_COUNT]; // selected preset index per signal +static int s_color_idx[SIG_COUNT]; static int s_bright = BRIGHT_DEFAULT; static bool s_changed = false; -// Scale one 8-bit channel by a percentage, clamped to [0, 255] so an out-of-range -// percentage can never overflow the byte and wrap the color to a wrong hue. static uint8_t scale_channel(uint8_t chan, int pct) { if (pct < 0) pct = 0; @@ -129,8 +123,6 @@ static void update_preview(void) { lv_obj_set_style_shadow_color(s_preview, lv_color_hex(hex), 0); lv_obj_set_style_shadow_opa(s_preview, LV_OPA_60, 0); - // Drive the physical RGB LED (LP5816) to match the preview: selected signal's - // color scaled by the brightness percentage. led_set_color(scale_channel((hex >> 16) & 0xFF, s_bright), scale_channel((hex >> 8) & 0xFF, s_bright), scale_channel(hex & 0xFF, s_bright)); @@ -292,7 +284,10 @@ static void build_controls(void) { lv_obj_remove_flag(col, LV_OBJ_FLAG_SCROLLABLE); lv_obj_remove_flag(col, LV_OBJ_FLAG_CLICKABLE); lv_obj_set_size(col, CONTENT_W, LV_SIZE_CONTENT); - lv_obj_align(col, LV_ALIGN_TOP_MID, 0, CTRL_Y); + lv_obj_align(col, LV_ALIGN_TOP_MID, 0, + LV_MIN(CTRL_Y, ui_screen_h() - UI_CHROME_FOOTER_H - + (SWATCH_CARD_H + BRIGHT_CARD_H + STEALTH_CARD_H + + 2 * CTRL_GAP))); lv_obj_set_style_bg_opa(col, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(col, 0, 0); lv_obj_set_style_pad_all(col, 0, 0); @@ -310,7 +305,7 @@ static int preset_index_of(uint32_t hex) { if (PRESETS[i].hex == (hex & 0xFFFFFF)) return i; } - return 0; // custom/unknown color falls back to the first preset + return 0; } static void save_config(void) { @@ -319,14 +314,11 @@ static void save_config(void) { g_config_led.warning_color = PRESETS[s_color_idx[SIG_WARNING]].hex; g_config_led.error_color = PRESETS[s_color_idx[SIG_ERROR]].hex; - // Apply live so subsequent signals use the new colors/brightness immediately. led_set_signal_config(g_config_led.info_color, g_config_led.warning_color, g_config_led.error_color, g_config_led.brightness); - // Persist to SD only (matches the storage policy: no SD -> keep in RAM for this - // session but do not write anything). if (tos_config_save(TOS_PATH_CONFIG_LED, "led") == ESP_OK) { notify(NOTIFY_SAVED, "LED settings saved"); } else { From 24b2051e33e6ebdad4d0fe0c45b01c48f2315f5e Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 01:05:58 -0300 Subject: [PATCH 046/103] fix(console): firstboot arms next-reset flag without wiping --- .../components/Service/console/commands/cmd_system.c | 7 +++---- 1 file changed, 3 insertions(+), 4 deletions(-) diff --git a/firmware_p4/components/Service/console/commands/cmd_system.c b/firmware_p4/components/Service/console/commands/cmd_system.c index 5594b2264..de9991a67 100644 --- a/firmware_p4/components/Service/console/commands/cmd_system.c +++ b/firmware_p4/components/Service/console/commands/cmd_system.c @@ -59,7 +59,7 @@ static int cmd_c5(int argc, char **argv) { return 1; } if (transport == SPI_OTA_TRANSPORT_UART) { - c5_flasher_init(); // UART1 is only needed when the bytes travel over UART + c5_flasher_init(); } esp_err_t r = c5_flasher_update(NULL, 0, transport); printf("C5 OTA (%s): %s\n", @@ -145,8 +145,7 @@ static int cmd_firstboot(int argc, char **argv) { nvs_commit(h); nvs_close(h); } - printf("First-boot wizard + screen tips cleared. Restarting...\n"); - esp_restart(); + printf("First-boot wizard + screen tips cleared. Will run on the next reset.\n"); return 0; } @@ -432,7 +431,7 @@ void register_system_commands(void) { const esp_console_cmd_t cmd_firstboot_def = { .command = "firstboot", - .help = "Clear the first-boot onboarding flag and restart to run it again", + .help = "Clear the first-boot onboarding flag so it runs on the next reset", .hint = NULL, .func = &cmd_firstboot, }; From c3cb8a41ebdc76d180dbf69c15002fb1de059c55 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 01:05:58 -0300 Subject: [PATCH 047/103] fix(ui): resolve theme by name and central input pump --- .../components/Applications/ui/ui_manager.c | 96 ++++++------------- .../components/Applications/ui/ui_theme.c | 11 ++- 2 files changed, 37 insertions(+), 70 deletions(-) diff --git a/firmware_p4/components/Applications/ui/ui_manager.c b/firmware_p4/components/Applications/ui/ui_manager.c index 737b868de..194d1c3c7 100644 --- a/firmware_p4/components/Applications/ui/ui_manager.c +++ b/firmware_p4/components/Applications/ui/ui_manager.c @@ -182,9 +182,6 @@ uint32_t ui_render_beat(void) { return s_render_beat; } -// Bumped by an lv_timer inside the LVGL port task, so it advances only while -// that task is servicing timers. It stalls on a frozen renderer (lock deadlock, -// runaway screen callback, or a dead/suspended task); sys_monitor polls it. static void render_beat_cb(lv_timer_t *t) { (void)t; s_render_beat++; @@ -194,12 +191,6 @@ void ui_render_beat_kick(void) { s_render_beat++; } -// Event-driven input. One pump (created in ui_init) drains input_manager events -// and dispatches them to the active screen's handler, replacing the ~110 -// per-screen polling lv_timers. Input is swallowed while a transition lock is -// active or a modal overlay (msgbox/keyboard) is up, matching the old per-screen -// guards; the dropdown refreshes the transition lock while open, so it is covered -// too. static ui_input_handler_t s_screen_handler = NULL; static void *s_screen_handler_ctx = NULL; @@ -216,17 +207,9 @@ bool ui_sd_ready(void) { } static bool input_dispatch_blocked(void) { - // While the screen is asleep, swallow input: the press that wakes it (tracked - // by input_manager, which wakes the power policy) must not also act on the UI. return ui_input_is_locked() || msgbox_is_open() || keyboard_is_open() || power_policy_is_asleep(); } -// Landscape is LV_DISPLAY_ROTATION_270 — the panel content is turned a quarter -// turn, so a physical d-pad press must be turned the same quarter turn for -// navigation to point the way it looks on screen. Applied centrally so every -// screen handler keeps using plain UP/DOWN/LEFT/RIGHT and adapts for free. -// OK/BACK are direction-agnostic. (If a direction reads inverted on hardware, -// reverse this cycle.) static input_button_t input_remap_for_rotation(input_button_t b) { if (!lvgl_glue_is_landscape()) return b; @@ -247,10 +230,6 @@ static input_button_t input_remap_for_rotation(input_button_t b) { bool ui_nav_pressed(input_button_t logical) { if (!lvgl_glue_is_landscape()) return input_is_down(logical); - // Inverse of input_remap_for_rotation: the physical button that maps to this - // logical direction in landscape. For components that poll button levels - // directly (dropdown, modals) instead of going through the remapped pump. - // Keep in sync with input_remap_for_rotation. input_button_t phys = logical; switch (logical) { case INPUT_BTN_UP: @@ -281,12 +260,10 @@ static void ui_input_pump(lv_timer_t *t) { continue; } if (s_screen_handler == NULL || input_dispatch_blocked()) { - continue; // drain and discard so stale events do not fire once unblocked + continue; } ui_input_handler_t handler = s_screen_handler; handler(&ev, s_screen_handler_ctx); - // If the handler switched screens, stop draining: remaining events belong to - // the transition (and are flushed by the input lock ui_switch_screen sets). if (s_screen_handler != handler) { break; } @@ -302,26 +279,14 @@ void ui_init(void) { ui_feedback_init(); - // Global power policy (display sleep + low-battery) and the global quick- - // settings dropdown. Both live on the top layer so they survive screen - // switches; created under the LVGL lock. The display is already registered - // (lvgl_glue_init ran before ui_init), so lv_layer_top() is valid here. if (ui_acquire()) { power_policy_init(); dropdown_ui_global_init(); - // Render-progress heartbeat: this lv_timer runs inside the LVGL port task, - // so it advances only while that task is servicing timers. sys_monitor polls - // ui_render_beat() to detect a frozen renderer. See ui_liveness.h. lv_timer_create(render_beat_cb, RENDER_BEAT_MS, NULL); - // Single input pump for all event-driven screens (replaces per-screen timers). lv_timer_create(ui_input_pump, UI_INPUT_PUMP_MS, NULL); ui_release(); } - // Boot orchestration runs once in a transient task (it needs the 5 s splash - // delay and a deep stack for screen construction), then deletes itself. There - // is no perpetual UI task: rendering lives in the LVGL port task and each - // screen's lv_timers, and liveness is supervised by sys_monitor. xTaskCreatePinnedToCore(ui_boot_task, "ui_boot", UI_BOOT_TASK_STACK_SIZE, @@ -340,9 +305,6 @@ void ui_init_safe_mode(void) { ui_theme_init(); ui_feedback_init(); - // Minimal LVGL infra: render heartbeat (so sys_monitor still sees liveness) - // and the shared input pump. No power policy (screen stays on), no dropdown, - // no boot animation, no home. Just the recovery screen. if (ui_acquire()) { lv_timer_create(render_beat_cb, RENDER_BEAT_MS, NULL); lv_timer_create(ui_input_pump, UI_INPUT_PUMP_MS, NULL); @@ -376,21 +338,16 @@ static void ui_boot_task(void *pvParameter) { ui_release(); } - vTaskDelete(NULL); // boot done; nothing to loop on + vTaskDelete(NULL); } static void clear_current_screen(void) { - // Drop the outgoing screen's input handler; a migrated screen re-registers its - // own in its open function. Non-migrated screens leave it NULL and keep using - // their own polling timer. ui_input_set_screen_handler(NULL, NULL); if (main_group != NULL) { lv_group_remove_all_objs(main_group); } } -// Tick-safe comparisons: lv_tick_get() is a uint32_t ms counter that wraps every -// ~49.7 days, so compare signed deltas instead of the raw values. bool ui_input_is_locked(void) { return (int32_t)(lv_tick_get() - input_lock_until) < 0; } @@ -404,12 +361,6 @@ void ui_input_lock(uint32_t ms) { typedef void (*ui_open_fn_t)(void); typedef void (*ui_close_fn_t)(void); -// Lifecycle contract (item 13): the close fn a screen registers to release the -// hardware / stop the task it started. ui_switch_screen() calls it on the -// outgoing screen before opening the next, so a radio/capture never keeps running -// after the user leaves its screen. Only screens that own hardware or a task need -// one; every other screen returns NULL (its widgets are freed by the screen -// swap). New hardware screens: add a public *_stop and a case here. static ui_close_fn_t screen_close_fn(screen_id_t s) { switch (s) { case SCREEN_SUBGHZ_READ: @@ -674,10 +625,9 @@ static ui_open_fn_t screen_open_fn(screen_id_t s) { } bool ui_screen_shows_chrome(screen_id_t s) { - if (s == SCREEN_NONE) // boot splash / no screen yet: no chrome, no dropdown + if (s == SCREEN_NONE) return false; switch (s) { - // --- Wi-Fi: live scan / attack / capture / monitor --- case SCREEN_WIFI_SCAN_MENU: case SCREEN_WIFI_CHANNELS: case SCREEN_WIFI_CLIENTS: @@ -691,7 +641,6 @@ bool ui_screen_shows_chrome(screen_id_t s) { case SCREEN_WIFI_SIGNAL_LOCATOR: case SCREEN_WIFI_HANDSHAKE: case SCREEN_WIFI_HOTSPOT: - // --- BLE: live scan / spam / sniff / emulate --- case SCREEN_BLE_SCAN: case SCREEN_BLE_SPAM: case SCREEN_BLE_BEACON_SPAM: @@ -703,24 +652,20 @@ bool ui_screen_shows_chrome(screen_id_t s) { case SCREEN_BLE_TRACK_DEVICE: case SCREEN_BLE_KEYBOARD: case SCREEN_BLE_MOUSE: - // --- NFC: live read / write / emulate / scan --- case SCREEN_NFC_READ: case SCREEN_NFC_WRITE: case SCREEN_NFC_EMULATE: case SCREEN_CARD_EMU: case SCREEN_NFC_SCAN: case SCREEN_NFC_P2P: - // --- IR: transmit / capture --- case SCREEN_IR_RECEIVE: case SCREEN_IR_SEND: case SCREEN_IR_BURST: case SCREEN_IR_CONTROLLER: case SCREEN_IR_RAW: - // --- SubGHz: read / send / brute --- case SCREEN_SUBGHZ_READ: case SCREEN_SUBGHZ_SEND: case SCREEN_SUBGHZ_BRUTE: - // --- Audio / LoRa / sensors: play / record / live monitor --- case SCREEN_WAV_PLAYER: case SCREEN_MP4_PLAYER: case SCREEN_MP3_PLAYER: @@ -732,7 +677,6 @@ bool ui_screen_shows_chrome(screen_id_t s) { case SCREEN_LORA_TELEMETRY: case SCREEN_USB_MOUSE: case SCREEN_IMU_MONITOR: - // --- Dev / system: live terminal / running payload / update --- case SCREEN_DEV_CONSOLE: case SCREEN_DEV_DIAG: case SCREEN_BOOT_MAP: @@ -746,6 +690,25 @@ bool ui_screen_shows_chrome(screen_id_t s) { } } +void sx1262_stop_rx(void); +esp_err_t sx1262_receive_continuous(void); + +static bool is_lora_screen(screen_id_t s) { + switch (s) { + case SCREEN_LORA_CHAT: + case SCREEN_LORA_TRACEROUTE: + case SCREEN_LORA_RNODE: + case SCREEN_LORA_MQTT: + case SCREEN_LORA_CHANNELS: + case SCREEN_LORA_POSITION: + case SCREEN_LORA_TELEMETRY: + case SCREEN_LORA_SECURE_DM: + return true; + default: + return false; + } +} + void ui_switch_screen(screen_id_t new_screen) { ui_open_fn_t open_fn = screen_open_fn(new_screen); if (open_fn == NULL) { @@ -756,22 +719,22 @@ void ui_switch_screen(screen_id_t new_screen) { input_lock_until = lv_tick_get() + INPUT_LOCK_MS; if (ui_acquire()) { + screen_id_t from = current_screen_id; lv_obj_t *outgoing = lv_screen_active(); - // Lifecycle: stop the outgoing screen's hardware/task before tearing it down. ui_close_fn_t close_fn = screen_close_fn(current_screen_id); if (close_fn != NULL) { close_fn(); } clear_current_screen(); - // Returning to the top level clears the breadcrumb root so a stale category - // ("NFC") never prefixes a fresh navigation. Category menus re-set it on open. if (new_screen == SCREEN_HOME || new_screen == SCREEN_MENU) ui_chrome_set_breadcrumb_root(""); - // Tell the chrome header whether to carry the shared status cluster before - // the screen builds it (current_screen_id only updates after open_fn()). ui_chrome_set_status_enabled(ui_screen_shows_chrome(new_screen)); open_fn(); current_screen_id = new_screen; + if (is_lora_screen(from) && !is_lora_screen(new_screen)) + sx1262_stop_rx(); + else if (!is_lora_screen(from) && is_lora_screen(new_screen)) + (void)sx1262_receive_continuous(); if (outgoing != NULL && outgoing != lv_screen_active() && lv_obj_is_valid(outgoing)) lv_obj_del_async(outgoing); screen_tips_hook(new_screen); @@ -780,8 +743,6 @@ void ui_switch_screen(screen_id_t new_screen) { } bool ui_acquire(void) { - // Finite timeout so a task that never releases the lock can no longer freeze - // every other UI caller forever. Callers already treat false as "skip". if (!lvgl_glue_lock(UI_LOCK_TIMEOUT_MS)) { ESP_LOGW(TAG, "ui_acquire timed out after %d ms; UI lock held elsewhere", UI_LOCK_TIMEOUT_MS); return false; @@ -822,9 +783,6 @@ screen_id_t ui_current_screen(void) { } void ui_relayout_current_screen(void) { - // Rebuild the active screen through its normal open path so it re-runs its - // layout at the current logical resolution. Used after a rotation change so the - // on-screen layout reflows immediately instead of only on the next navigation. if (current_screen_id != SCREEN_NONE) ui_switch_screen(current_screen_id); } diff --git a/firmware_p4/components/Applications/ui/ui_theme.c b/firmware_p4/components/Applications/ui/ui_theme.c index 95a34677e..ce8bcc4f8 100644 --- a/firmware_p4/components/Applications/ui/ui_theme.c +++ b/firmware_p4/components/Applications/ui/ui_theme.c @@ -90,6 +90,8 @@ void ui_theme_load_idx(int color_idx) { if (color_idx < 0 || color_idx > (THEME_COUNT - 1)) color_idx = 0; + theme_idx = color_idx; + FILE *f = fopen(THEME_CONFIG_PATH, "r"); if (f == NULL) { ESP_LOGW(TAG, "Theme file not found, using built-in default palette"); @@ -412,6 +414,13 @@ void ui_theme_load_from_name(const char *theme_name) { free(data); + for (int i = 0; i < THEME_COUNT; i++) { + if (strcmp(theme_name, theme_names[i]) == 0) { + theme_idx = i; + break; + } + } + assets_unload_sd(); char asset_dir[ASSET_DIR_PATH_MAX]; @@ -481,4 +490,4 @@ void ui_theme_init(void) { ui_theme_load_settings(); ui_theme_load_idx(theme_idx); ESP_LOGI(TAG, "Theme initialized: %s", theme_names[theme_idx]); -} \ No newline at end of file +} From 7523634754e26599d64f85b82ac9e2336ed3e3e4 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 01:05:58 -0300 Subject: [PATCH 048/103] fix(lora): chat ui --- .../ui/screens/lora/lora_chat_ui.c | 41 +++++++++++++++---- 1 file changed, 33 insertions(+), 8 deletions(-) diff --git a/firmware_p4/components/Applications/ui/screens/lora/lora_chat_ui.c b/firmware_p4/components/Applications/ui/screens/lora/lora_chat_ui.c index 4b050ea48..faa2e5328 100644 --- a/firmware_p4/components/Applications/ui/screens/lora/lora_chat_ui.c +++ b/firmware_p4/components/Applications/ui/screens/lora/lora_chat_ui.c @@ -546,6 +546,26 @@ static void build_nodes_list(void) { node_select(s_node); } +#define MAP_DESIGN_CX 120 +#define MAP_DESIGN_CY 150 +#define MAP_MAX_OFFY 84 + +static int map_scale_num(void) { + int cy = ui_screen_h() / 2; + int room_up = cy - UI_CHROME_HEADER_H - 22; + int room_dn = ui_screen_h() - MESH_INFO_BOT - MESH_INFO_H - cy - 8; + int room = LV_MIN(room_up, room_dn); + if (room < 20) + room = 20; + return LV_MIN(room, MAP_MAX_OFFY); +} + +static void map_xy(int nx, int ny, int *px, int *py) { + int num = map_scale_num(); + *px = ui_screen_w() / 2 + (nx - MAP_DESIGN_CX) * num / MAP_MAX_OFFY; + *py = ui_screen_h() / 2 + (ny - MAP_DESIGN_CY) * num / MAP_MAX_OFFY; +} + static void build_nodes_view(void) { lv_color_t accent = ui_theme_get_accent(); ui_chrome_header(s_screen, "s_nodes", "/assets/icons/hub.bin"); @@ -579,10 +599,13 @@ static void build_nodes_view(void) { int w; bool dashed; link_style(i, &col, &w, &dashed); - s_link_pts[i][0].x = MAP_CENTER_X; - s_link_pts[i][0].y = MAP_CENTER_Y; - s_link_pts[i][1].x = NODE_POS[i].x; - s_link_pts[i][1].y = NODE_POS[i].y; + int cx, cy, nx, ny; + map_xy(MAP_CENTER_X, MAP_CENTER_Y, &cx, &cy); + map_xy(NODE_POS[i].x, NODE_POS[i].y, &nx, &ny); + s_link_pts[i][0].x = cx; + s_link_pts[i][0].y = cy; + s_link_pts[i][1].x = nx; + s_link_pts[i][1].y = ny; lv_obj_t *ln = lv_line_create(s_screen); lv_obj_align(ln, LV_ALIGN_TOP_LEFT, 0, 0); lv_line_set_points(ln, s_link_pts[i], 2); @@ -602,8 +625,9 @@ static void build_nodes_view(void) { lv_obj_set_style_pad_row(wrap, 1, 0); lv_obj_set_flex_flow(wrap, LV_FLEX_FLOW_COLUMN); lv_obj_set_flex_align(wrap, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); - lv_obj_align( - wrap, LV_ALIGN_CENTER, NODE_POS[i].x - ui_screen_w() / 2, NODE_POS[i].y - ui_screen_h() / 2); + int nx, ny; + map_xy(NODE_POS[i].x, NODE_POS[i].y, &nx, &ny); + lv_obj_align(wrap, LV_ALIGN_CENTER, nx - ui_screen_w() / 2, ny - ui_screen_h() / 2); s_node_pins[i] = make_badge(wrap, "/assets/icons/settings_input_antenna.bin", accent); @@ -624,8 +648,9 @@ static void build_nodes_view(void) { lv_obj_set_style_pad_row(you_wrap, 1, 0); lv_obj_set_flex_flow(you_wrap, LV_FLEX_FLOW_COLUMN); lv_obj_set_flex_align(you_wrap, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); - lv_obj_align( - you_wrap, LV_ALIGN_CENTER, MAP_CENTER_X - ui_screen_w() / 2, MAP_CENTER_Y - ui_screen_h() / 2); + int you_x, you_y; + map_xy(MAP_CENTER_X, MAP_CENTER_Y, &you_x, &you_y); + lv_obj_align(you_wrap, LV_ALIGN_CENTER, you_x - ui_screen_w() / 2, you_y - ui_screen_h() / 2); lv_obj_t *you_pin = make_badge(you_wrap, "/assets/icons/hub.bin", accent); lv_obj_set_size(you_pin, YOU_PIN_SZ, YOU_PIN_SZ); From 34b30e39f8bc96785975d93a907ce3c08ba3c8fa Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 01:05:58 -0300 Subject: [PATCH 049/103] chore(time): sys_time adjustment --- firmware_p4/components/Service/sys_time/sys_time.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware_p4/components/Service/sys_time/sys_time.c b/firmware_p4/components/Service/sys_time/sys_time.c index 62eca32c3..7fe3e6960 100644 --- a/firmware_p4/components/Service/sys_time/sys_time.c +++ b/firmware_p4/components/Service/sys_time/sys_time.c @@ -85,7 +85,7 @@ void sys_time_init(void) { time_t baseline = sys_time_build_epoch(); time_t saved = sys_time_saved_epoch(); - if (saved > baseline) { + if (saved >= SYS_TIME_EPOCH_MIN) { baseline = saved; } From d2f622c03ac324b4b46fc12d0943015bc2e23cd3 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 01:05:58 -0300 Subject: [PATCH 050/103] fix(nfc): nfc read ui --- .../components/Applications/ui/screens/nfc/nfc_read_ui.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/firmware_p4/components/Applications/ui/screens/nfc/nfc_read_ui.c b/firmware_p4/components/Applications/ui/screens/nfc/nfc_read_ui.c index 92f73dce3..42383825a 100644 --- a/firmware_p4/components/Applications/ui/screens/nfc/nfc_read_ui.c +++ b/firmware_p4/components/Applications/ui/screens/nfc/nfc_read_ui.c @@ -28,6 +28,7 @@ #include "nfc_ui_common.h" #include "ui_chrome.h" #include "ui_manager.h" +#include "ui_metrics.h" #include "ui_theme.h" #define REFRESH_MS 33 @@ -97,7 +98,10 @@ static void build_dump(void) { lv_obj_remove_flag(s_dump, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_width(s_dump, DUMP_W); lv_obj_set_height(s_dump, LV_SIZE_CONTENT); - lv_obj_align(s_dump, LV_ALIGN_CENTER, 0, DUMP_Y); + const int dumpH = DUMP_LINE_COUNT * 14 + (DUMP_LINE_COUNT - 1) * DUMP_ROW_GAP; + const int dump_y = + LV_MIN(DUMP_Y, (ui_screen_h() - UI_CHROME_FOOTER_H) - ui_screen_h() / 2 - dumpH / 2); + lv_obj_align(s_dump, LV_ALIGN_CENTER, 0, dump_y); lv_obj_set_style_bg_opa(s_dump, LV_OPA_TRANSP, 0); lv_obj_set_style_border_width(s_dump, 0, 0); lv_obj_set_style_pad_all(s_dump, 0, 0); From adefb20a6e046c4b6c2c3a2a75076f3ede8615e9 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 01:27:26 -0300 Subject: [PATCH 051/103] chore(build): add gameboy --- firmware_p4/CMakeLists.txt | 6 +----- 1 file changed, 1 insertion(+), 5 deletions(-) diff --git a/firmware_p4/CMakeLists.txt b/firmware_p4/CMakeLists.txt index 1332225c5..fb272b7ae 100644 --- a/firmware_p4/CMakeLists.txt +++ b/firmware_p4/CMakeLists.txt @@ -8,11 +8,7 @@ cmake_minimum_required(VERSION 3.16) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(IDF_TARGET "esp32p4") -# The gameboy emulator lives under components/Applications/ (it belongs with the -# other apps) but is still its own component with its own build flags, so point -# the component manager at that dir to discover it (only gameboy/ there has a -# CMakeLists.txt; the sibling app subdirs are part of the Applications umbrella). -set(EXTRA_COMPONENT_DIRS "${CMAKE_CURRENT_LIST_DIR}/components/Applications") +set(EXTRA_COMPONENT_DIRS "${CMAKE_CURRENT_LIST_DIR}/components/Applications/gameboy") include($ENV{IDF_PATH}/tools/cmake/project.cmake) From 07c16ddba6a6c6097b895f13a9e987861ac6808a Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 15:11:01 -0300 Subject: [PATCH 052/103] fix(usb): advertise MSC only in mass-storage mode to stop TinyUSB crash on native USB --- .../Drivers/tusb_desc/include/tusb_desc.h | 12 +++ .../components/Drivers/tusb_desc/tusb_desc.c | 88 +++++++++++++++---- .../components/Service/storage_vfs/usb_msc.c | 4 + 3 files changed, 85 insertions(+), 19 deletions(-) diff --git a/firmware_p4/components/Drivers/tusb_desc/include/tusb_desc.h b/firmware_p4/components/Drivers/tusb_desc/include/tusb_desc.h index 7fe64e6c0..5c011061c 100644 --- a/firmware_p4/components/Drivers/tusb_desc/include/tusb_desc.h +++ b/firmware_p4/components/Drivers/tusb_desc/include/tusb_desc.h @@ -61,6 +61,18 @@ extern "C" { */ esp_err_t busb_init(void); +/** + * @brief Advertise (or hide) the mass-storage interface on the composite. + * + * MSC must only be exposed while the SD is actually handed to the USB host, + * because the storage-backed SCSI callbacks assume an initialized handle. Off by + * default; enter/exit mass-storage mode via this before/after switching the mux. + * If TinyUSB is already up, the host is re-enumerated so it re-reads the config. + * + * @param exposed true while mass-storage mode is active; false otherwise. + */ +void busb_set_msc_exposed(bool exposed); + /** * @brief Configure the USB-C data mux (TS3USB221) and default it to the UART * bridge. diff --git a/firmware_p4/components/Drivers/tusb_desc/tusb_desc.c b/firmware_p4/components/Drivers/tusb_desc/tusb_desc.c index f0df321e8..1d4b52c1a 100644 --- a/firmware_p4/components/Drivers/tusb_desc/tusb_desc.c +++ b/firmware_p4/components/Drivers/tusb_desc/tusb_desc.c @@ -19,6 +19,8 @@ #include "esp_log.h" #include "driver/gpio.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" #include "pin_def.h" #include "soc/usb_dwc_struct.h" #include "tinyusb.h" @@ -38,6 +40,7 @@ static const char *TAG = "TUSB_DESC"; // USB Configuration #define USB_MAX_POWER_MA 100 #define USB_HID_POLL_INTERVAL_MS 1 +#define BUSB_REENUM_DELAY_MS 100 // detach window so the host notices the re-enumeration // String descriptor indices #define STR_IDX_LANGID 0 @@ -49,16 +52,15 @@ static const char *TAG = "TUSB_DESC"; #define STR_IDX_MSC 5 #endif -#if CFG_TUD_MSC -#define CONFIG_TOTAL_LEN \ - (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN + TUD_CDC_DESC_LEN + TUD_MSC_DESC_LEN) -#define MSC_DESCRIPTOR(ep_size) \ - , TUD_MSC_DESCRIPTOR(TUSB_DESC_ITF_NUM_MSC, STR_IDX_MSC, \ - TUSB_DESC_EP_MSC_OUT, TUSB_DESC_EP_MSC_IN, (ep_size)) -#else -#define CONFIG_TOTAL_LEN (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN + TUD_CDC_DESC_LEN) -#define MSC_DESCRIPTOR(ep_size) -#endif +// The MSC interface is advertised only while the SD is actually handed to the +// USB host (mass-storage mode). The esp_tinyusb MSC callbacks dereference a +// storage handle that only exists after tinyusb_msc_storage_init_sdmmc(); if the +// composite exposes MSC on a plain native-USB bring-up (the USB-NATIVE toggle or +// BadUSB), the host's first SCSI command hits a NULL handle and panics the +// TinyUSB task. So HID+CDC is the base config and MSC is a separate variant, +// selected at runtime (see busb_set_msc_exposed / tud_descriptor_configuration_cb). +#define ITF_NUM_BASE 3 // HID + CDC (comm + data) +#define CONFIG_LEN_BASE (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN + TUD_CDC_DESC_LEN) // CDC data (bulk) endpoint max packet size is speed-dependent: USB requires it // to be EXACTLY 512 at High Speed and 8/16/32/64 at Full Speed. The P4 USB is @@ -95,11 +97,11 @@ static const uint8_t s_desc_hid_report[] = { // Configuration Descriptor — composite: HID (BadUSB) + CDC-ACM (companion link). // Identical for both speeds except the CDC bulk endpoint size (see above). -#define CONFIG_DESCRIPTOR(cdc_ep_size) \ +#define HID_CDC_BLOCK(itf_total, total_len, cdc_ep_size) \ TUD_CONFIG_DESCRIPTOR(1, \ - TUSB_DESC_ITF_NUM_TOTAL, \ + (itf_total), \ 0, \ - CONFIG_TOTAL_LEN, \ + (total_len), \ TUSB_DESC_CONFIG_ATT_REMOTE_WAKEUP, \ USB_MAX_POWER_MA), \ TUD_HID_DESCRIPTOR(TUSB_DESC_ITF_NUM_HID, \ @@ -115,11 +117,27 @@ static const uint8_t s_desc_hid_report[] = { 8, \ TUSB_DESC_EP_CDC_OUT, \ TUSB_DESC_EP_CDC_IN, \ - (cdc_ep_size)) \ - MSC_DESCRIPTOR(cdc_ep_size) + (cdc_ep_size)) -static const uint8_t s_desc_configuration_hs[] = {CONFIG_DESCRIPTOR(CDC_EP_SIZE_HS)}; -static const uint8_t s_desc_configuration_fs[] = {CONFIG_DESCRIPTOR(CDC_EP_SIZE_FS)}; +static const uint8_t s_desc_configuration_hs[] = { + HID_CDC_BLOCK(ITF_NUM_BASE, CONFIG_LEN_BASE, CDC_EP_SIZE_HS)}; +static const uint8_t s_desc_configuration_fs[] = { + HID_CDC_BLOCK(ITF_NUM_BASE, CONFIG_LEN_BASE, CDC_EP_SIZE_FS)}; + +#if CFG_TUD_MSC +#define ITF_NUM_MSC_TOTAL 4 +#define CONFIG_LEN_MSC (CONFIG_LEN_BASE + TUD_MSC_DESC_LEN) +#define MSC_INTERFACE(ep_size) \ + TUD_MSC_DESCRIPTOR(TUSB_DESC_ITF_NUM_MSC, STR_IDX_MSC, \ + TUSB_DESC_EP_MSC_OUT, TUSB_DESC_EP_MSC_IN, (ep_size)) + +static const uint8_t s_desc_configuration_msc_hs[] = { + HID_CDC_BLOCK(ITF_NUM_MSC_TOTAL, CONFIG_LEN_MSC, CDC_EP_SIZE_HS), + MSC_INTERFACE(CDC_EP_SIZE_HS)}; +static const uint8_t s_desc_configuration_msc_fs[] = { + HID_CDC_BLOCK(ITF_NUM_MSC_TOTAL, CONFIG_LEN_MSC, CDC_EP_SIZE_FS), + MSC_INTERFACE(CDC_EP_SIZE_FS)}; +#endif // String Descriptors static const char *s_string_desc_arr[] = { @@ -137,6 +155,10 @@ static const char *s_string_desc_arr[] = { static uint16_t s_desc_str_buf[32]; +// Whether the composite currently advertises the MSC interface (mass-storage +// mode). Off by default so plain native-USB bring-ups stay HID+CDC only. +static volatile bool s_msc_exposed = false; + // TinyUSB Descriptor Callbacks const uint8_t *tud_descriptor_device_cb(void) { @@ -147,7 +169,13 @@ const uint8_t *tud_descriptor_configuration_cb(uint8_t index) { (void)index; // Serve the descriptor whose CDC bulk endpoint size matches the negotiated // link speed (512 at HS, 64 at FS), so tu_edpt_validate accepts the config. - return (tud_speed_get() == TUSB_SPEED_HIGH) ? s_desc_configuration_hs : s_desc_configuration_fs; + bool high_speed = (tud_speed_get() == TUSB_SPEED_HIGH); +#if CFG_TUD_MSC + if (s_msc_exposed) { + return high_speed ? s_desc_configuration_msc_hs : s_desc_configuration_msc_fs; + } +#endif + return high_speed ? s_desc_configuration_hs : s_desc_configuration_fs; } const uint16_t *tud_descriptor_string_cb(uint8_t index, uint16_t langid) { @@ -211,10 +239,11 @@ static void force_hs_otg_session_valid(void) { USB_DWC_HS.gotgctl_reg = otg; } +static bool s_installed = false; + esp_err_t busb_init(void) { // HID (BadUSB) and CDC (companion) share one TinyUSB install — whoever calls // first brings the composite up; later calls are no-ops. - static bool s_installed = false; if (s_installed) { return ESP_OK; } @@ -264,6 +293,27 @@ esp_err_t busb_init(void) { return ESP_OK; } +void busb_set_msc_exposed(bool exposed) { +#if CFG_TUD_MSC + if (s_msc_exposed == exposed) { + return; + } + // Not up yet: the flag alone decides what the first enumeration advertises. + if (!s_installed) { + s_msc_exposed = exposed; + return; + } + // Already enumerated with the other layout; drop off the bus, swap the + // advertised config, and re-attach so the host re-reads the descriptor. + tud_disconnect(); + vTaskDelay(pdMS_TO_TICKS(BUSB_REENUM_DELAY_MS)); + s_msc_exposed = exposed; + tud_connect(); +#else + (void)exposed; +#endif +} + // USB-C data mux (TS3USB221) on GPIO_USB_MUX_SEL_PIN. LOW routes the single // Type-C to the CP2105 USB-UART bridge (serial console / flashing); HIGH routes // it to the P4 native USB PHY (TinyUSB HID + CDC). The two share one connector, diff --git a/firmware_p4/components/Service/storage_vfs/usb_msc.c b/firmware_p4/components/Service/storage_vfs/usb_msc.c index e8046da2d..acbe3878d 100644 --- a/firmware_p4/components/Service/storage_vfs/usb_msc.c +++ b/firmware_p4/components/Service/storage_vfs/usb_msc.c @@ -61,6 +61,7 @@ void usb_msc_enter(void) { return; } + busb_set_msc_exposed(true); usb_mux_set_native(true); s_state = USB_MSC_ACTIVE; ESP_LOGI(TAG, "USB drive live"); @@ -73,6 +74,9 @@ void usb_msc_exit(void) { } s_state = USB_MSC_EXITING; + // Hide MSC (re-enumerating the host) while the storage handle is still valid, + // so no SCSI command lands on a deinitialized backend. + busb_set_msc_exposed(false); tinyusb_msc_storage_deinit(); usb_mux_set_native(false); From c39f18e25751bd1ec3f0a8a758eeb95dfa29ee8c Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 15:12:48 -0300 Subject: [PATCH 053/103] chore: ignore ESP-IDF dependencies.lock --- .gitignore | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitignore b/.gitignore index ef8f972ee..f1290f11f 100644 --- a/.gitignore +++ b/.gitignore @@ -1,6 +1,8 @@ # ESP-IDF auto generated by build sdkconfig sdkconfig.old +dependencies.lock +**/dependencies.lock # compiled output /build/ From 2e7b397f10cc1956cecba56986fb5ccc64c887d8 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 15:22:40 -0300 Subject: [PATCH 054/103] perf(badusb): pace HID reports by tud_hid_ready for max drop-free typing speed --- .../components/Applications/bad_usb/bad_usb.c | 12 ++++- .../components/Applications/bad_usb/hid_hal.c | 54 +++++++++++++------ .../Applications/bad_usb/include/hid_hal.h | 14 ++++- 3 files changed, 60 insertions(+), 20 deletions(-) diff --git a/firmware_p4/components/Applications/bad_usb/bad_usb.c b/firmware_p4/components/Applications/bad_usb/bad_usb.c index afea66022..720386faf 100644 --- a/firmware_p4/components/Applications/bad_usb/bad_usb.c +++ b/firmware_p4/components/Applications/bad_usb/bad_usb.c @@ -38,6 +38,7 @@ static bool s_is_initialized = false; static void send_keyboard_report(uint8_t keycode, uint8_t modifier); static void send_mouse_report(int8_t x, int8_t y, uint8_t buttons, int8_t wheel); +static bool hid_report_ready(void); esp_err_t bad_usb_init(void) { if (s_is_initialized) { @@ -51,7 +52,10 @@ esp_err_t bad_usb_init(void) { return err; } - hid_hal_register_callback(send_keyboard_report, send_mouse_report, bad_usb_wait_for_connection); + hid_hal_register_callback(send_keyboard_report, + send_mouse_report, + bad_usb_wait_for_connection, + hid_report_ready); s_is_initialized = true; ESP_LOGI(TAG, "Initialized"); @@ -65,7 +69,7 @@ esp_err_t bad_usb_deinit(void) { } ESP_LOGI(TAG, "Deinitializing..."); - hid_hal_register_callback(NULL, NULL, NULL); + hid_hal_register_callback(NULL, NULL, NULL, NULL); esp_err_t err = tinyusb_driver_uninstall(); if (err != ESP_OK) { @@ -117,3 +121,7 @@ static void send_keyboard_report(uint8_t keycode, uint8_t modifier) { static void send_mouse_report(int8_t x, int8_t y, uint8_t buttons, int8_t wheel) { tud_hid_mouse_report(HID_REPORT_ID_MOUSE, buttons, x, y, wheel, 0); } + +static bool hid_report_ready(void) { + return tud_hid_ready(); +} diff --git a/firmware_p4/components/Applications/bad_usb/hid_hal.c b/firmware_p4/components/Applications/bad_usb/hid_hal.c index d7170c050..55b73240c 100644 --- a/firmware_p4/components/Applications/bad_usb/hid_hal.c +++ b/firmware_p4/components/Applications/bad_usb/hid_hal.c @@ -24,21 +24,43 @@ static const char *TAG = "HID_HAL"; -#define KEY_PRESS_DELAY_US 5000 -#define KEY_RELEASE_DELAY_US 5000 -#define MOUSE_MOVE_DELAY_US 2000 -#define MOUSE_CLICK_DELAY_US 5000 +// Fallback pacing used only when no readiness source is registered. +#define FALLBACK_KEY_DELAY_US 5000 +#define FALLBACK_MOUSE_DELAY_US 2000 +// Host stopped draining reports (unplugged mid-run): stop waiting instead of +// spinning the ducky task forever. +#define REPORT_READY_TIMEOUT_MS 50 static hid_send_cb_t s_send_cb = NULL; static hid_mouse_cb_t s_mouse_cb = NULL; static hid_wait_cb_t s_wait_cb = NULL; +static hid_ready_cb_t s_ready_cb = NULL; void hid_hal_register_callback(hid_send_cb_t send_cb, hid_mouse_cb_t mouse_cb, - hid_wait_cb_t wait_cb) { + hid_wait_cb_t wait_cb, + hid_ready_cb_t ready_cb) { s_send_cb = send_cb; s_mouse_cb = mouse_cb; s_wait_cb = wait_cb; + s_ready_cb = ready_cb; +} + +// Block until the transport has delivered the previous report, so the next one +// never overwrites a report the host has not polled yet (which drops keys). This +// paces sending to the host's poll rate (~1ms), the fastest loss-free rate. The +// 1ms wait matches the 1kHz tick, and yielding feeds lower-priority tasks + WDT. +static void wait_report_ready(uint32_t fallback_us) { + if (s_ready_cb == NULL) { + ets_delay_us(fallback_us); + return; + } + for (uint32_t waited_ms = 0; !s_ready_cb(); waited_ms++) { + if (waited_ms >= REPORT_READY_TIMEOUT_MS) { + return; + } + vTaskDelay(pdMS_TO_TICKS(1)); + } } void hid_hal_press_key(uint8_t keycode, uint8_t modifiers) { @@ -46,13 +68,11 @@ void hid_hal_press_key(uint8_t keycode, uint8_t modifiers) { return; } + wait_report_ready(FALLBACK_KEY_DELAY_US); s_send_cb(keycode, modifiers); - ets_delay_us(KEY_PRESS_DELAY_US); - + wait_report_ready(FALLBACK_KEY_DELAY_US); s_send_cb(0, 0); - ets_delay_us(KEY_RELEASE_DELAY_US); - - vTaskDelay(0); // Yield to prevent WDT starvation + wait_report_ready(FALLBACK_KEY_DELAY_US); } void hid_hal_mouse_move(int8_t x, int8_t y) { @@ -60,9 +80,9 @@ void hid_hal_mouse_move(int8_t x, int8_t y) { return; } + wait_report_ready(FALLBACK_MOUSE_DELAY_US); s_mouse_cb(x, y, 0, 0); - ets_delay_us(MOUSE_MOVE_DELAY_US); - vTaskDelay(0); + wait_report_ready(FALLBACK_MOUSE_DELAY_US); } void hid_hal_mouse_click(uint8_t buttons) { @@ -70,11 +90,11 @@ void hid_hal_mouse_click(uint8_t buttons) { return; } + wait_report_ready(FALLBACK_MOUSE_DELAY_US); s_mouse_cb(0, 0, buttons, 0); // Press - ets_delay_us(MOUSE_CLICK_DELAY_US); + wait_report_ready(FALLBACK_MOUSE_DELAY_US); s_mouse_cb(0, 0, 0, 0); // Release - ets_delay_us(MOUSE_CLICK_DELAY_US); - vTaskDelay(0); + wait_report_ready(FALLBACK_MOUSE_DELAY_US); } void hid_hal_mouse_scroll(int8_t wheel) { @@ -82,9 +102,9 @@ void hid_hal_mouse_scroll(int8_t wheel) { return; } + wait_report_ready(FALLBACK_MOUSE_DELAY_US); s_mouse_cb(0, 0, 0, wheel); - ets_delay_us(MOUSE_MOVE_DELAY_US); - vTaskDelay(0); + wait_report_ready(FALLBACK_MOUSE_DELAY_US); } void hid_hal_wait_for_connection(void) { diff --git a/firmware_p4/components/Applications/bad_usb/include/hid_hal.h b/firmware_p4/components/Applications/bad_usb/include/hid_hal.h index 2598af055..2ad15ef8f 100644 --- a/firmware_p4/components/Applications/bad_usb/include/hid_hal.h +++ b/firmware_p4/components/Applications/bad_usb/include/hid_hal.h @@ -20,6 +20,7 @@ extern "C" { #endif +#include #include /** @@ -45,6 +46,15 @@ typedef void (*hid_mouse_cb_t)(int8_t x, int8_t y, uint8_t buttons, int8_t wheel */ typedef void (*hid_wait_cb_t)(void); +/** + * @brief Callback type reporting whether the transport can accept a new report. + * + * Returns true once the previous report has been delivered to the host. The HAL + * gates on this to send at the host's poll rate without overwriting a report the + * host has not read yet (which would drop keys). + */ +typedef bool (*hid_ready_cb_t)(void); + /** * @brief Register the transport driver callbacks. * @@ -54,10 +64,12 @@ typedef void (*hid_wait_cb_t)(void); * @param send_cb Keyboard report callback. * @param mouse_cb Mouse report callback. * @param wait_cb Connection wait callback. + * @param ready_cb Report-readiness callback (NULL falls back to fixed delays). */ void hid_hal_register_callback(hid_send_cb_t send_cb, hid_mouse_cb_t mouse_cb, - hid_wait_cb_t wait_cb); + hid_wait_cb_t wait_cb, + hid_ready_cb_t ready_cb); /** * @brief Press and release a key. From 2052ff58dd695553b443424553f80d8b4af5c345 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 15:37:19 -0300 Subject: [PATCH 055/103] feat(badusb): add Amiga ASCII art payload; map grave/backslash/apostrophe/pipe in US layout --- .../assets/storage/bad_usb_scripts/amiga.txt | 103 ++++++++++++++++++ .../Applications/bad_usb/hid_layouts.c | 13 +++ 2 files changed, 116 insertions(+) create mode 100644 firmware_p4/assets/storage/bad_usb_scripts/amiga.txt diff --git a/firmware_p4/assets/storage/bad_usb_scripts/amiga.txt b/firmware_p4/assets/storage/bad_usb_scripts/amiga.txt new file mode 100644 index 000000000..027664bf0 --- /dev/null +++ b/firmware_p4/assets/storage/bad_usb_scripts/amiga.txt @@ -0,0 +1,103 @@ +REM Amiga ASCII art (LGB) - types the art into the focused window +REM Focus a text editor before running; HOME after each line defeats auto-indent +DELAY 1000 +HOME +STRING ___..-.---.---.--..___ +ENTER +HOME +STRING _..-- `.`. `. `. `. --.._ +ENTER +HOME +STRING / ___________\ \ \______ \ +ENTER +HOME +STRING | |.-----------`. `. `.---.| | +ENTER +HOME +STRING |`. |' \`. \ \ \ '| | +ENTER +HOME +STRING |`. |' \ `-._ `. `. `.'| | +ENTER +HOME +STRING /| |' `-._o)\ /(o\ \ \| |\ +ENTER +HOME +STRING .' | |' `. .' '. `. `. `. | `. +ENTER +HOME +STRING / .| |' `. (_.==._) \ \ \ |. \ _.--. +ENTER +HOME +STRING .' .' | |' _.-======-._ `. `. `. `. `. _.-_.-'\\ +ENTER +HOME +STRING / / | |' .' |_||_| `. \ \ \ \ \ .'_.' || +ENTER +HOME +STRING / .' |`. |' /_.-'========`-._\ `. `-._`._`. \(.__ :| +ENTER +HOME +STRING ( ' |`. |'.______________________.'\ _.) ` )`-._`-._/ / +ENTER +HOME +STRING \\ | '.------------------------.'`-._-' // `-._.' +ENTER +HOME +STRING _\\_ \ | AMIGA O O O O * * `.`.| ' // +ENTER +HOME +STRING (_ _) '-._|________________________|_.-'| _//_ +ENTER +HOME +STRING / / /`-._ |`-._ / / / | (_ _) +ENTER +HOME +STRING .' \ |`-._ `-._ `-._`-._/ / / | \ \ +ENTER +HOME +STRING / `. | `-._ `-._ `-._|/ / | / `. +ENTER +HOME +STRING / / / /. ) | `-._ `-._ `-._ / / .' \ +ENTER +HOME +STRING | | | \ \|/ | `-._`-._ `-._ `-._ / /. ( .\ \ \ \ +ENTER +HOME +STRING \ \ \ \/ | `-._`-._`-._ `-._ `-._/ / \ \|/ / | | | +ENTER +HOME +STRING `.\_\/ `-._ `-._`-._`-._ `-._/| /| \ \/ / / / +ENTER +HOME +STRING / `-._ `-._`-._`-._ || / | \ \/_/.' +ENTER +HOME +STRING .' `-._ `-._`-._ || / | \ +ENTER +HOME +STRING LGB / / . `-._ `-._ || / | \ +ENTER +HOME +STRING '\ / / `-._ ||/'._.' \ +ENTER +HOME +STRING \`. .' / `-._|/ \ +ENTER +HOME +STRING `.`-._.' .' \ .' +ENTER +HOME +STRING `-.__\/ `\ .' ' +ENTER +HOME +STRING \`. _.' .' +ENTER +HOME +STRING `.`-._.-' _.' +ENTER +HOME +STRING `-.__.-' +ENTER +HOME diff --git a/firmware_p4/components/Applications/bad_usb/hid_layouts.c b/firmware_p4/components/Applications/bad_usb/hid_layouts.c index 01c5ff61d..61784771b 100644 --- a/firmware_p4/components/Applications/bad_usb/hid_layouts.c +++ b/firmware_p4/components/Applications/bad_usb/hid_layouts.c @@ -144,6 +144,19 @@ void hid_layouts_type_string_us(const char *str) { case ';': keycode = HID_KEY_SEMICOLON; break; + case '\'': + keycode = HID_KEY_APOSTROPHE; + break; + case '`': + keycode = HID_KEY_GRAVE; + break; + case '\\': + keycode = HID_KEY_BACKSLASH; + break; + case '|': + modifier = KEYBOARD_MODIFIER_LEFTSHIFT; + keycode = HID_KEY_BACKSLASH; + break; default: break; } From ebf99fa611ab84d67a6c1dd6fea06786b41d6d71 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 16:20:08 -0300 Subject: [PATCH 056/103] fix(badusb): correct ABNT2 apostrophe and add backtick so ASCII art renders on BR hosts --- .../components/Applications/bad_usb/hid_layouts.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/firmware_p4/components/Applications/bad_usb/hid_layouts.c b/firmware_p4/components/Applications/bad_usb/hid_layouts.c index 61784771b..223cc96af 100644 --- a/firmware_p4/components/Applications/bad_usb/hid_layouts.c +++ b/firmware_p4/components/Applications/bad_usb/hid_layouts.c @@ -173,16 +173,20 @@ void hid_layouts_type_string_abnt2(const char *str) { uint8_t c1 = (uint8_t)str[i]; uint8_t c2 = (uint8_t)str[i + 1]; - // Single quote -> dead key acute + space + // Apostrophe and double quote sit on the key left of '1' (US grave position). if (c1 == '\'') { - hid_hal_press_key(HID_KEY_BRACKET_LEFT, 0); - hid_hal_press_key(HID_KEY_SPACE, 0); + hid_hal_press_key(HID_KEY_GRAVE, 0); continue; } - - // Double quote -> dead key acute + shift if (c1 == '"') { + hid_hal_press_key(HID_KEY_GRAVE, KEYBOARD_MODIFIER_LEFTSHIFT); + continue; + } + + // Backtick is the grave dead key (Shift + acute key); space emits the literal. + if (c1 == '`') { hid_hal_press_key(HID_KEY_BRACKET_LEFT, KEYBOARD_MODIFIER_LEFTSHIFT); + hid_hal_press_key(HID_KEY_SPACE, 0); continue; } From f2f2bd22e0e7ff61f574ecbbfb0c58dbafbb662e Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 16:56:35 -0300 Subject: [PATCH 057/103] docs: require short pertinent comments in CLAUDE.md and trim verbose ones --- firmware_p4/components/Applications/bad_usb/hid_hal.c | 6 ++---- firmware_p4/components/Drivers/tusb_desc/tusb_desc.c | 9 ++------- 2 files changed, 4 insertions(+), 11 deletions(-) diff --git a/firmware_p4/components/Applications/bad_usb/hid_hal.c b/firmware_p4/components/Applications/bad_usb/hid_hal.c index 55b73240c..b48ee85da 100644 --- a/firmware_p4/components/Applications/bad_usb/hid_hal.c +++ b/firmware_p4/components/Applications/bad_usb/hid_hal.c @@ -46,10 +46,8 @@ void hid_hal_register_callback(hid_send_cb_t send_cb, s_ready_cb = ready_cb; } -// Block until the transport has delivered the previous report, so the next one -// never overwrites a report the host has not polled yet (which drops keys). This -// paces sending to the host's poll rate (~1ms), the fastest loss-free rate. The -// 1ms wait matches the 1kHz tick, and yielding feeds lower-priority tasks + WDT. +// Wait until the previous report was delivered before sending the next, so we +// never overwrite an unpolled report (dropped keys). Paces to the host's ~1ms poll. static void wait_report_ready(uint32_t fallback_us) { if (s_ready_cb == NULL) { ets_delay_us(fallback_us); diff --git a/firmware_p4/components/Drivers/tusb_desc/tusb_desc.c b/firmware_p4/components/Drivers/tusb_desc/tusb_desc.c index 1d4b52c1a..f388534d2 100644 --- a/firmware_p4/components/Drivers/tusb_desc/tusb_desc.c +++ b/firmware_p4/components/Drivers/tusb_desc/tusb_desc.c @@ -52,13 +52,8 @@ static const char *TAG = "TUSB_DESC"; #define STR_IDX_MSC 5 #endif -// The MSC interface is advertised only while the SD is actually handed to the -// USB host (mass-storage mode). The esp_tinyusb MSC callbacks dereference a -// storage handle that only exists after tinyusb_msc_storage_init_sdmmc(); if the -// composite exposes MSC on a plain native-USB bring-up (the USB-NATIVE toggle or -// BadUSB), the host's first SCSI command hits a NULL handle and panics the -// TinyUSB task. So HID+CDC is the base config and MSC is a separate variant, -// selected at runtime (see busb_set_msc_exposed / tud_descriptor_configuration_cb). +// MSC is a runtime-selected variant, exposed only in mass-storage mode: an +// unbacked MSC LUN crashes the TinyUSB task on the host's first SCSI command. #define ITF_NUM_BASE 3 // HID + CDC (comm + data) #define CONFIG_LEN_BASE (TUD_CONFIG_DESC_LEN + TUD_HID_DESC_LEN + TUD_CDC_DESC_LEN) From ca37977f08764ef66430fdc464eb46c51a286da5 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 17:05:19 -0300 Subject: [PATCH 058/103] fix(badusb): raise HID ready timeout to survive host stalls so HOME is not dropped --- firmware_p4/components/Applications/bad_usb/hid_hal.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/firmware_p4/components/Applications/bad_usb/hid_hal.c b/firmware_p4/components/Applications/bad_usb/hid_hal.c index b48ee85da..1e23ed169 100644 --- a/firmware_p4/components/Applications/bad_usb/hid_hal.c +++ b/firmware_p4/components/Applications/bad_usb/hid_hal.c @@ -27,9 +27,9 @@ static const char *TAG = "HID_HAL"; // Fallback pacing used only when no readiness source is registered. #define FALLBACK_KEY_DELAY_US 5000 #define FALLBACK_MOUSE_DELAY_US 2000 -// Host stopped draining reports (unplugged mid-run): stop waiting instead of -// spinning the ducky task forever. -#define REPORT_READY_TIMEOUT_MS 50 +// Must exceed how long a busy host/editor can stall HID polling, else a report +// is sent into a busy endpoint and dropped. Only a real disconnect should hit it. +#define REPORT_READY_TIMEOUT_MS 1000 static hid_send_cb_t s_send_cb = NULL; static hid_mouse_cb_t s_mouse_cb = NULL; From 43dcd2ba853f733f36d40180cc10d0a440636be9 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 17:16:17 -0300 Subject: [PATCH 059/103] fix(badusb): END before ENTER in amiga payload to stop auto-indent accumulation --- .../assets/storage/bad_usb_scripts/amiga.txt | 36 ++++++++++++++++++- 1 file changed, 35 insertions(+), 1 deletion(-) diff --git a/firmware_p4/assets/storage/bad_usb_scripts/amiga.txt b/firmware_p4/assets/storage/bad_usb_scripts/amiga.txt index 027664bf0..6f400b1c3 100644 --- a/firmware_p4/assets/storage/bad_usb_scripts/amiga.txt +++ b/firmware_p4/assets/storage/bad_usb_scripts/amiga.txt @@ -1,103 +1,137 @@ REM Amiga ASCII art (LGB) - types the art into the focused window -REM Focus a text editor before running; HOME after each line defeats auto-indent +REM Focus a text editor first. END before ENTER stops the editor auto-indent +REM from accumulating; HOME returns to column 0 for the next line. DELAY 1000 HOME STRING ___..-.---.---.--..___ +END ENTER HOME STRING _..-- `.`. `. `. `. --.._ +END ENTER HOME STRING / ___________\ \ \______ \ +END ENTER HOME STRING | |.-----------`. `. `.---.| | +END ENTER HOME STRING |`. |' \`. \ \ \ '| | +END ENTER HOME STRING |`. |' \ `-._ `. `. `.'| | +END ENTER HOME STRING /| |' `-._o)\ /(o\ \ \| |\ +END ENTER HOME STRING .' | |' `. .' '. `. `. `. | `. +END ENTER HOME STRING / .| |' `. (_.==._) \ \ \ |. \ _.--. +END ENTER HOME STRING .' .' | |' _.-======-._ `. `. `. `. `. _.-_.-'\\ +END ENTER HOME STRING / / | |' .' |_||_| `. \ \ \ \ \ .'_.' || +END ENTER HOME STRING / .' |`. |' /_.-'========`-._\ `. `-._`._`. \(.__ :| +END ENTER HOME STRING ( ' |`. |'.______________________.'\ _.) ` )`-._`-._/ / +END ENTER HOME STRING \\ | '.------------------------.'`-._-' // `-._.' +END ENTER HOME STRING _\\_ \ | AMIGA O O O O * * `.`.| ' // +END ENTER HOME STRING (_ _) '-._|________________________|_.-'| _//_ +END ENTER HOME STRING / / /`-._ |`-._ / / / | (_ _) +END ENTER HOME STRING .' \ |`-._ `-._ `-._`-._/ / / | \ \ +END ENTER HOME STRING / `. | `-._ `-._ `-._|/ / | / `. +END ENTER HOME STRING / / / /. ) | `-._ `-._ `-._ / / .' \ +END ENTER HOME STRING | | | \ \|/ | `-._`-._ `-._ `-._ / /. ( .\ \ \ \ +END ENTER HOME STRING \ \ \ \/ | `-._`-._`-._ `-._ `-._/ / \ \|/ / | | | +END ENTER HOME STRING `.\_\/ `-._ `-._`-._`-._ `-._/| /| \ \/ / / / +END ENTER HOME STRING / `-._ `-._`-._`-._ || / | \ \/_/.' +END ENTER HOME STRING .' `-._ `-._`-._ || / | \ +END ENTER HOME STRING LGB / / . `-._ `-._ || / | \ +END ENTER HOME STRING '\ / / `-._ ||/'._.' \ +END ENTER HOME STRING \`. .' / `-._|/ \ +END ENTER HOME STRING `.`-._.' .' \ .' +END ENTER HOME STRING `-.__\/ `\ .' ' +END ENTER HOME STRING \`. _.' .' +END ENTER HOME STRING `.`-._.-' _.' +END ENTER HOME STRING `-.__.-' +END ENTER HOME From d30ea2847e3e07cf7c944e0e631bbc5382c25aea Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 17:35:08 -0300 Subject: [PATCH 060/103] feat(badusb): scan SD payload subfolders recursively, list all in one view --- .../ui/screens/badusb/badusb_menu_ui.c | 29 ++++++++++++++----- 1 file changed, 22 insertions(+), 7 deletions(-) diff --git a/firmware_p4/components/Applications/ui/screens/badusb/badusb_menu_ui.c b/firmware_p4/components/Applications/ui/screens/badusb/badusb_menu_ui.c index a16cd2889..f38cc6cb6 100644 --- a/firmware_p4/components/Applications/ui/screens/badusb/badusb_menu_ui.c +++ b/firmware_p4/components/Applications/ui/screens/badusb/badusb_menu_ui.c @@ -135,8 +135,9 @@ static const char *TAG = "BADUSB_UI"; #define PAY_BODY_BUF_LEN 200 #define PREVIEW_MAX_LINES 4 -#define BADUSB_SCRIPT_DIR TOS_PATH_BADUSB -#define BADUSB_ASSET_DIR FLASH_STORAGE_BADUSB +#define BADUSB_SCRIPT_DIR TOS_PATH_BADUSB +#define BADUSB_ASSET_DIR FLASH_STORAGE_BADUSB +#define BADUSB_SCAN_MAX_DEPTH 3 #define ASSETS_PREFIX_LEN (sizeof(FLASH_MOUNT "/") - 1) #define MAX_PAYLOADS 24 #define PL_PATH_LEN 192 @@ -279,21 +280,31 @@ static bool is_ducky_script(const char *name) { strcasecmp(dot, ".duck") == 0 || strcasecmp(dot, ".ducky") == 0; } -static void scan_dir_into(const char *dir, bool is_asset) { +// Recurses into subfolders so payloads organised in /badusb// still +// show. Depth is bounded and subdirs are visited while their parent DIR is open, +// so at most BADUSB_SCAN_MAX_DEPTH handles are held (under VFS_MAX_FILES). +static void scan_dir_into_depth(const char *dir, bool is_asset, int depth) { DIR *d = opendir(dir); if (d == NULL) { - ESP_LOGW(TAG, "No script dir: %s", dir); + if (depth == 0) + ESP_LOGW(TAG, "No script dir: %s", dir); return; } struct dirent *ent; while ((ent = readdir(d)) != NULL && s_pl_count < MAX_PAYLOADS) { if (ent->d_name[0] == '.') continue; - if (ent->d_type == DT_DIR) + if (strlen(dir) + 1 + strlen(ent->d_name) >= PL_PATH_LEN) continue; - if (!is_ducky_script(ent->d_name)) + if (ent->d_type == DT_DIR) { + if (depth + 1 < BADUSB_SCAN_MAX_DEPTH) { + char sub[PL_PATH_LEN]; + snprintf(sub, sizeof(sub), "%s/%s", dir, ent->d_name); + scan_dir_into_depth(sub, is_asset, depth + 1); + } continue; - if (strlen(dir) + 1 + strlen(ent->d_name) >= PL_PATH_LEN) + } + if (!is_ducky_script(ent->d_name)) continue; strlcpy(s_pl_path[s_pl_count], dir, PL_PATH_LEN); strlcat(s_pl_path[s_pl_count], "/", PL_PATH_LEN); @@ -305,6 +316,10 @@ static void scan_dir_into(const char *dir, bool is_asset) { closedir(d); } +static void scan_dir_into(const char *dir, bool is_asset) { + scan_dir_into_depth(dir, is_asset, 0); +} + static void scan_payloads(void) { s_pl_count = 0; scan_dir_into(BADUSB_SCRIPT_DIR, false); From 63fc41293d58922a6b944526724d5a315861cce6 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 19:18:54 -0300 Subject: [PATCH 061/103] feat(badusb): complete ABNT2 coverage with missing symbols and full accent table --- .../Applications/bad_usb/hid_layouts.c | 195 ++++++++++-------- 1 file changed, 106 insertions(+), 89 deletions(-) diff --git a/firmware_p4/components/Applications/bad_usb/hid_layouts.c b/firmware_p4/components/Applications/bad_usb/hid_layouts.c index 223cc96af..cec3e3609 100644 --- a/firmware_p4/components/Applications/bad_usb/hid_layouts.c +++ b/firmware_p4/components/Applications/bad_usb/hid_layouts.c @@ -32,22 +32,6 @@ static const char *TAG = "HID_LAYOUTS"; #define HID_KEY_NON_US_BACKSLASH 0x64 #endif -// ABNT2 UTF-8 byte pairs for accented characters -#define UTF8_LOWER_C_CEDILLA_B2 0xA7 // c = 0xC3 0xA7 -#define UTF8_UPPER_C_CEDILLA_B2 0x87 // C = 0xC3 0x87 -#define UTF8_LOWER_A_ACUTE_B2 0xA1 // a = 0xC3 0xA1 -#define UTF8_LOWER_E_ACUTE_B2 0xA9 // e = 0xC3 0xA9 -#define UTF8_LOWER_I_ACUTE_B2 0xAD // i = 0xC3 0xAD -#define UTF8_LOWER_O_ACUTE_B2 0xB3 // o = 0xC3 0xB3 -#define UTF8_LOWER_U_ACUTE_B2 0xBA // u = 0xC3 0xBA -#define UTF8_LOWER_A_CIRCUM_B2 0xA2 // a = 0xC3 0xA2 -#define UTF8_LOWER_E_CIRCUM_B2 0xAA // e = 0xC3 0xAA -#define UTF8_LOWER_O_CIRCUM_B2 0xB4 // o = 0xC3 0xB4 -#define UTF8_LOWER_A_TILDE_B2 0xA3 // a = 0xC3 0xA3 -#define UTF8_LOWER_O_TILDE_B2 0xB5 // o = 0xC3 0xB5 -#define UTF8_LOWER_A_GRAVE_B2 0xA0 // a = 0xC3 0xA0 -#define UTF8_2BYTE_LEAD 0xC3 - static bool try_decode_abnt2_utf8(uint8_t c1, uint8_t c2); void hid_layouts_type_string_us(const char *str) { @@ -190,6 +174,18 @@ void hid_layouts_type_string_abnt2(const char *str) { continue; } + // Circumflex/tilde are dead keys; a trailing space emits the literal char. + if (c1 == '^') { + hid_hal_press_key(HID_KEY_APOSTROPHE, KEYBOARD_MODIFIER_LEFTSHIFT); + hid_hal_press_key(HID_KEY_SPACE, 0); + continue; + } + if (c1 == '~') { + hid_hal_press_key(HID_KEY_APOSTROPHE, 0); + hid_hal_press_key(HID_KEY_SPACE, 0); + continue; + } + // Try UTF-8 two-byte sequences (accented characters) if ((c1 & 0xE0) == 0xC0 && c2 != '\0') { if (try_decode_abnt2_utf8(c1, c2)) { @@ -277,6 +273,14 @@ void hid_layouts_type_string_abnt2(const char *str) { case ',': keycode = HID_KEY_COMMA; break; + case '<': + modifier = KEYBOARD_MODIFIER_LEFTSHIFT; + keycode = HID_KEY_COMMA; + break; + case '>': + modifier = KEYBOARD_MODIFIER_LEFTSHIFT; + keycode = HID_KEY_PERIOD; + break; case ';': keycode = HID_KEY_SLASH; break; @@ -325,83 +329,96 @@ void hid_layouts_type_string_abnt2(const char *str) { } } -static bool try_decode_abnt2_utf8(uint8_t c1, uint8_t c2) { - if (c1 != UTF8_2BYTE_LEAD) { - return false; - } +typedef struct { + uint8_t c1; // UTF-8 lead byte (0xC2 or 0xC3) + uint8_t c2; // UTF-8 continuation byte + uint8_t k1; // dead key or direct key + uint8_t m1; // modifier for k1 + uint8_t k2; // base letter, 0 for a single keypress + uint8_t m2; // modifier for k2 (shift = uppercase) +} abnt2_utf8_entry_t; - // Cedilla - if (c2 == UTF8_LOWER_C_CEDILLA_B2) { - hid_hal_press_key(HID_KEY_SEMICOLON, 0); - return true; - } - if (c2 == UTF8_UPPER_C_CEDILLA_B2) { - hid_hal_press_key(HID_KEY_SEMICOLON, KEYBOARD_MODIFIER_LEFTSHIFT); - return true; - } - - // Acute accent (dead key = BRACKET_LEFT) - if (c2 == UTF8_LOWER_A_ACUTE_B2) { - hid_hal_press_key(HID_KEY_BRACKET_LEFT, 0); - hid_hal_press_key(HID_KEY_A, 0); - return true; - } - if (c2 == UTF8_LOWER_E_ACUTE_B2) { - hid_hal_press_key(HID_KEY_BRACKET_LEFT, 0); - hid_hal_press_key(HID_KEY_E, 0); - return true; - } - if (c2 == UTF8_LOWER_I_ACUTE_B2) { - hid_hal_press_key(HID_KEY_BRACKET_LEFT, 0); - hid_hal_press_key(HID_KEY_I, 0); - return true; - } - if (c2 == UTF8_LOWER_O_ACUTE_B2) { - hid_hal_press_key(HID_KEY_BRACKET_LEFT, 0); - hid_hal_press_key(HID_KEY_O, 0); - return true; - } - if (c2 == UTF8_LOWER_U_ACUTE_B2) { - hid_hal_press_key(HID_KEY_BRACKET_LEFT, 0); - hid_hal_press_key(HID_KEY_U, 0); - return true; - } +// ABNT2 dead-key prefix (key, modifier) pressed before the base letter. +#define DK_ACUTE HID_KEY_BRACKET_LEFT, 0 +#define DK_GRAVE HID_KEY_BRACKET_LEFT, KEYBOARD_MODIFIER_LEFTSHIFT +#define DK_CIRCUM HID_KEY_APOSTROPHE, KEYBOARD_MODIFIER_LEFTSHIFT +#define DK_TILDE HID_KEY_APOSTROPHE, 0 +#define DK_DIAER HID_KEY_6, KEYBOARD_MODIFIER_LEFTSHIFT - // Circumflex accent (dead key = APOSTROPHE + SHIFT) - if (c2 == UTF8_LOWER_A_CIRCUM_B2) { - hid_hal_press_key(HID_KEY_APOSTROPHE, KEYBOARD_MODIFIER_LEFTSHIFT); - hid_hal_press_key(HID_KEY_A, 0); - return true; - } - if (c2 == UTF8_LOWER_E_CIRCUM_B2) { - hid_hal_press_key(HID_KEY_APOSTROPHE, KEYBOARD_MODIFIER_LEFTSHIFT); - hid_hal_press_key(HID_KEY_E, 0); - return true; - } - if (c2 == UTF8_LOWER_O_CIRCUM_B2) { - hid_hal_press_key(HID_KEY_APOSTROPHE, KEYBOARD_MODIFIER_LEFTSHIFT); - hid_hal_press_key(HID_KEY_O, 0); - return true; - } +static const abnt2_utf8_entry_t ABNT2_UTF8_MAP[] = { + {0xC3, 0xA7, HID_KEY_SEMICOLON, 0, 0, 0}, // ç + {0xC3, 0x87, HID_KEY_SEMICOLON, KEYBOARD_MODIFIER_LEFTSHIFT, 0, 0}, // Ç + {0xC3, 0xA0, DK_GRAVE, HID_KEY_A, 0}, // à + {0xC3, 0xA1, DK_ACUTE, HID_KEY_A, 0}, // á + {0xC3, 0xA2, DK_CIRCUM, HID_KEY_A, 0}, // â + {0xC3, 0xA3, DK_TILDE, HID_KEY_A, 0}, // ã + {0xC3, 0xA4, DK_DIAER, HID_KEY_A, 0}, // ä + {0xC3, 0xA8, DK_GRAVE, HID_KEY_E, 0}, // è + {0xC3, 0xA9, DK_ACUTE, HID_KEY_E, 0}, // é + {0xC3, 0xAA, DK_CIRCUM, HID_KEY_E, 0}, // ê + {0xC3, 0xAB, DK_DIAER, HID_KEY_E, 0}, // ë + {0xC3, 0xAC, DK_GRAVE, HID_KEY_I, 0}, // ì + {0xC3, 0xAD, DK_ACUTE, HID_KEY_I, 0}, // í + {0xC3, 0xAE, DK_CIRCUM, HID_KEY_I, 0}, // î + {0xC3, 0xAF, DK_DIAER, HID_KEY_I, 0}, // ï + {0xC3, 0xB1, DK_TILDE, HID_KEY_N, 0}, // ñ + {0xC3, 0xB2, DK_GRAVE, HID_KEY_O, 0}, // ò + {0xC3, 0xB3, DK_ACUTE, HID_KEY_O, 0}, // ó + {0xC3, 0xB4, DK_CIRCUM, HID_KEY_O, 0}, // ô + {0xC3, 0xB5, DK_TILDE, HID_KEY_O, 0}, // õ + {0xC3, 0xB6, DK_DIAER, HID_KEY_O, 0}, // ö + {0xC3, 0xB9, DK_GRAVE, HID_KEY_U, 0}, // ù + {0xC3, 0xBA, DK_ACUTE, HID_KEY_U, 0}, // ú + {0xC3, 0xBB, DK_CIRCUM, HID_KEY_U, 0}, // û + {0xC3, 0xBC, DK_DIAER, HID_KEY_U, 0}, // ü + {0xC3, 0x80, DK_GRAVE, HID_KEY_A, KEYBOARD_MODIFIER_LEFTSHIFT}, // À + {0xC3, 0x81, DK_ACUTE, HID_KEY_A, KEYBOARD_MODIFIER_LEFTSHIFT}, // Á + {0xC3, 0x82, DK_CIRCUM, HID_KEY_A, KEYBOARD_MODIFIER_LEFTSHIFT}, // Â + {0xC3, 0x83, DK_TILDE, HID_KEY_A, KEYBOARD_MODIFIER_LEFTSHIFT}, // Ã + {0xC3, 0x84, DK_DIAER, HID_KEY_A, KEYBOARD_MODIFIER_LEFTSHIFT}, // Ä + {0xC3, 0x88, DK_GRAVE, HID_KEY_E, KEYBOARD_MODIFIER_LEFTSHIFT}, // È + {0xC3, 0x89, DK_ACUTE, HID_KEY_E, KEYBOARD_MODIFIER_LEFTSHIFT}, // É + {0xC3, 0x8A, DK_CIRCUM, HID_KEY_E, KEYBOARD_MODIFIER_LEFTSHIFT}, // Ê + {0xC3, 0x8B, DK_DIAER, HID_KEY_E, KEYBOARD_MODIFIER_LEFTSHIFT}, // Ë + {0xC3, 0x8C, DK_GRAVE, HID_KEY_I, KEYBOARD_MODIFIER_LEFTSHIFT}, // Ì + {0xC3, 0x8D, DK_ACUTE, HID_KEY_I, KEYBOARD_MODIFIER_LEFTSHIFT}, // Í + {0xC3, 0x8E, DK_CIRCUM, HID_KEY_I, KEYBOARD_MODIFIER_LEFTSHIFT}, // Î + {0xC3, 0x8F, DK_DIAER, HID_KEY_I, KEYBOARD_MODIFIER_LEFTSHIFT}, // Ï + {0xC3, 0x91, DK_TILDE, HID_KEY_N, KEYBOARD_MODIFIER_LEFTSHIFT}, // Ñ + {0xC3, 0x92, DK_GRAVE, HID_KEY_O, KEYBOARD_MODIFIER_LEFTSHIFT}, // Ò + {0xC3, 0x93, DK_ACUTE, HID_KEY_O, KEYBOARD_MODIFIER_LEFTSHIFT}, // Ó + {0xC3, 0x94, DK_CIRCUM, HID_KEY_O, KEYBOARD_MODIFIER_LEFTSHIFT}, // Ô + {0xC3, 0x95, DK_TILDE, HID_KEY_O, KEYBOARD_MODIFIER_LEFTSHIFT}, // Õ + {0xC3, 0x96, DK_DIAER, HID_KEY_O, KEYBOARD_MODIFIER_LEFTSHIFT}, // Ö + {0xC3, 0x99, DK_GRAVE, HID_KEY_U, KEYBOARD_MODIFIER_LEFTSHIFT}, // Ù + {0xC3, 0x9A, DK_ACUTE, HID_KEY_U, KEYBOARD_MODIFIER_LEFTSHIFT}, // Ú + {0xC3, 0x9B, DK_CIRCUM, HID_KEY_U, KEYBOARD_MODIFIER_LEFTSHIFT}, // Û + {0xC3, 0x9C, DK_DIAER, HID_KEY_U, KEYBOARD_MODIFIER_LEFTSHIFT}, // Ü + {0xC2, 0xA2, HID_KEY_5, KEYBOARD_MODIFIER_RIGHTALT, 0, 0}, // ¢ + {0xC2, 0xA3, HID_KEY_4, KEYBOARD_MODIFIER_RIGHTALT, 0, 0}, // £ + {0xC2, 0xA7, HID_KEY_EQUAL, KEYBOARD_MODIFIER_RIGHTALT, 0, 0}, // § + {0xC2, 0xAC, HID_KEY_6, KEYBOARD_MODIFIER_RIGHTALT, 0, 0}, // ¬ + {0xC2, 0xB2, HID_KEY_2, KEYBOARD_MODIFIER_RIGHTALT, 0, 0}, // ² + {0xC2, 0xB3, HID_KEY_3, KEYBOARD_MODIFIER_RIGHTALT, 0, 0}, // ³ + {0xC2, 0xB9, HID_KEY_1, KEYBOARD_MODIFIER_RIGHTALT, 0, 0}, // ¹ +}; - // Tilde (dead key = APOSTROPHE) - if (c2 == UTF8_LOWER_A_TILDE_B2) { - hid_hal_press_key(HID_KEY_APOSTROPHE, 0); - hid_hal_press_key(HID_KEY_A, 0); - return true; - } - if (c2 == UTF8_LOWER_O_TILDE_B2) { - hid_hal_press_key(HID_KEY_APOSTROPHE, 0); - hid_hal_press_key(HID_KEY_O, 0); - return true; - } +#undef DK_ACUTE +#undef DK_GRAVE +#undef DK_CIRCUM +#undef DK_TILDE +#undef DK_DIAER - // Grave accent (dead key = BRACKET_LEFT + SHIFT) - if (c2 == UTF8_LOWER_A_GRAVE_B2) { - hid_hal_press_key(HID_KEY_BRACKET_LEFT, KEYBOARD_MODIFIER_LEFTSHIFT); - hid_hal_press_key(HID_KEY_A, 0); - return true; +static bool try_decode_abnt2_utf8(uint8_t c1, uint8_t c2) { + for (size_t i = 0; i < sizeof(ABNT2_UTF8_MAP) / sizeof(ABNT2_UTF8_MAP[0]); ++i) { + const abnt2_utf8_entry_t *e = &ABNT2_UTF8_MAP[i]; + if (e->c1 == c1 && e->c2 == c2) { + hid_hal_press_key(e->k1, e->m1); + if (e->k2 != 0) { + hid_hal_press_key(e->k2, e->m2); + } + return true; + } } - return false; } From f74f5c548365098547a0f3bce39f07f76e06d6a4 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 19:18:54 -0300 Subject: [PATCH 062/103] feat(badusb): accept SUPER as an alias for the GUI modifier --- firmware_p4/components/Applications/bad_usb/ducky_parser.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware_p4/components/Applications/bad_usb/ducky_parser.c b/firmware_p4/components/Applications/bad_usb/ducky_parser.c index 8fbbc84d5..48baaf8dd 100644 --- a/firmware_p4/components/Applications/bad_usb/ducky_parser.c +++ b/firmware_p4/components/Applications/bad_usb/ducky_parser.c @@ -259,7 +259,7 @@ static bool is_modifier(const char *word, uint8_t *out_mod) { return true; } if (strcasecmp(word, "GUI") == 0 || strcasecmp(word, "WINDOWS") == 0 || - strcasecmp(word, "COMMAND") == 0) { + strcasecmp(word, "SUPER") == 0 || strcasecmp(word, "COMMAND") == 0) { *out_mod |= KEYBOARD_MODIFIER_LEFTGUI; return true; } From 0503aefe25e483047c71ec209608d5131b4a46a9 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:35 -0300 Subject: [PATCH 063/103] docs(spi_bridge): document 7-byte CRC framing, protocol v2, screen category, async scan and power state --- docs/spi_bridge/README.md | 239 +++++++++++++++++++++++++++++++------- 1 file changed, 198 insertions(+), 41 deletions(-) diff --git a/docs/spi_bridge/README.md b/docs/spi_bridge/README.md index f2daa92b6..de3fa5740 100644 --- a/docs/spi_bridge/README.md +++ b/docs/spi_bridge/README.md @@ -74,20 +74,47 @@ The P4 flashes the C5's firmware over a separate UART link using the official ## 3. Frame format -Every packet on the SPI bus starts with a fixed **5-byte header**: +Every packet on the SPI bus starts with a fixed **7-byte header** (5 bytes of +framing + a 2-byte CRC-16): ```c -typedef struct { +typedef struct __attribute__((packed)) { uint8_t sync; // 0xAA uint8_t type; // 0x01 CMD, 0x02 RESP, 0x03 STREAM uint8_t category; // spi_cat_t - subsystem uint8_t op; // operation within the category uint8_t length; // payload bytes that follow (0-255) + uint16_t crc; // CRC-16 over [type,category,op,length] + data } spi_header_t; ``` -`SPI_FRAME_SIZE` = header + 256 B payload, **rounded up to a multiple of 4** for -DMA = **264 B**. The command/response path always transfers `SPI_FRAME_SIZE`. +`SPI_MAX_PAYLOAD` is **255** (not 256): the header's `length` is a `uint8_t`, so +256 was never representable. For a RESP, `length` also counts the status byte, so +its data maxes at 254. + +`SPI_FRAME_SIZE` = header + `SPI_MAX_PAYLOAD`, **rounded up to a multiple of 4** +for DMA = **264 B** (unchanged: the header grew by 2 and the payload cap shrank by +1). The command/response path always transfers `SPI_FRAME_SIZE`. + +### Frame-integrity CRC (SPI-1) + +Every frame carries a **CRC-16/CCITT** (the ESP-ROM `esp_rom_crc16_le` +implementation) over the header's `[type,category,op,length]` plus the data bytes. +The `sync` byte (framing marker) and the `crc` field itself are excluded. Inline +helpers in `spi_protocol.h`: + +```c +uint16_t spi_frame_crc(const spi_header_t *h, uint16_t data_len); // compute +void spi_frame_seal(const spi_header_t *h, uint16_t data_len); // stamp into a fresh frame +bool spi_frame_valid(const spi_header_t *h, uint16_t data_len);// verify on receive +``` + +`data_len` is `header.length` for CMD/RESP frames, or `2 + batch_len` for STREAM +frames (whose `header.length` is 0 and whose real size lives in the leading `u16` +of the payload). The receiver drops any frame that fails `spi_frame_valid` - a +mismatch means the bus corrupted it. The CRC catches bus corruption; it does +**not** catch a drifted `spi_protocol.h` (intact bytes, different meaning) - that +is the job of the proto-version check (SPI-2, §8). ### Command identifier = `category` + `op` @@ -104,6 +131,7 @@ alone; `op` selects the operation within it. | `SPI_CAT_MESH` | `0x04` | meshtastic (split BLE/WiFi transport) | | `SPI_CAT_MCORE` | `0x05` | meshcore → `bt_dispatcher` | | `SPI_CAT_HOST` | `0x06` | companion host-link BLE relay → `bt_dispatcher` | +| `SPI_CAT_SCREEN` | `0x07` | P4-native screen sharing over the USB host link (handled locally, never relayed) | | `SPI_CAT_SESSION` | `0xFF` | inline session handlers | In C, the `SPI_ID_*` constants stay single named values (e.g. @@ -142,6 +170,24 @@ P4 (master) C5 (slave) - A per-command **mutex** on the P4 serialises commands; long radio ops get longer timeouts (`SPI_TIMEOUT_WIFI_MS = 20 s`, default `1 s`). +### Handshake modes: IRQ vs POLL + +The handshake is a physical-layer choice (`spi_bridge_mode_t`); the wire protocol +is identical either way. Both ends must be initialized in the **same** mode. + +- **`SPI_BRIDGE_MODE_IRQ`** (default) - the C5 pulses the IRQ GPIO when a + response/stream frame is armed; the P4 catches the rising edge. Needs the IRQ + trace wired. +- **`SPI_BRIDGE_MODE_POLL`** - no IRQ line, so the P4 re-clocks the bus until the + slave answers with a valid frame. Used on boards without an IRQ trace (the + HighBoy V2 PCB has `GPIO_BRIDGE_IRQ_PIN == -1`, so `bridge_manager` initializes + the master in POLL mode). + +```c +esp_err_t spi_bridge_master_init(void); // == IRQ mode +esp_err_t spi_bridge_master_init_mode(spi_bridge_mode_t mode); // pick IRQ or POLL +``` + --- ## 5. Generic data pipe (pulling lists) @@ -174,7 +220,7 @@ transfer** (`SPI_STREAM_FRAME_SIZE = 2048 B`) instead of one record per round-trip: ``` -STREAM frame payload (after the 5-byte header, type = STREAM): +STREAM frame payload (after the 7-byte header, type = STREAM): [u16 batch_len][record][record]... record = [u16 op][u8 len][len bytes] ``` @@ -218,14 +264,76 @@ running into the void if the P4 crashes or stops listening: --- +## Async scans (non-blocking) + +A radio scan can take seconds. Rather than hold the per-command bridge mutex for +its whole duration, a scan is run **asynchronously**: fire the scan command (the +C5 starts it and returns immediately), then poll a lightweight status id until it +reports the scan finished. Results are fetched afterwards through the generic data +pipe as usual. + +```c +esp_err_t spi_bridge_run_scan(spi_id_t scan_id, spi_id_t status_id, + const uint8_t *payload, uint8_t len); +``` + +Returns `ESP_OK` when the status id reports done, or `ESP_ERR_TIMEOUT` if it never +cleared. The status ids are `SPI_ID_WIFI_SCAN_STATUS` (`0x0150`) and +`SPI_ID_BT_SCAN_STATUS` (`0x027F`) - each responds `1` while its scan is running. + +--- + +## Power management + +The P4 tells the C5 its power state so the co-processor can drop its radio when +the P4 is idle or asleep instead of running full RX all the time. It sends +`SPI_ID_SYSTEM_POWER_STATE` (op `0x4A`) with a one-byte `spi_power_state_t`: + +| State | Value | Meaning | +|-------|-------|---------| +| `SPI_POWER_ACTIVE` | 0 | Normal operation: full radio. | +| `SPI_POWER_IDLE` | 1 | Screen dimmed: deeper modem sleep (MAX_MODEM). | +| `SPI_POWER_SLEEP` | 2 | Device asleep: drop the radio (unless a capture is running). | + +--- + ## 8. Firmware versioning & flashing -The C5 firmware is **embedded in the P4 firmware** at build time (bootloader + -partition table + app). On boot, `bridge_manager` queries the C5's version -(`SPI_ID_SYSTEM_VERSION`) and compares it against the P4's expected version -(`FIRMWARE_VERSION`, currently **1.3.0**). On mismatch (or no response) the P4 -re-flashes the C5 over the UART link using `esp-serial-flasher`, writing the -full image: +Two independent checks run at boot in `bridge_manager`, both **detection-only** - +the P4 never auto-flashes (the user updates explicitly with the `c5` console +command): + +- **App version.** Query the C5's version (`SPI_ID_SYSTEM_VERSION`) and compare it + against the P4's expected `FIRMWARE_VERSION` (generated from + `common/metadata/version_info.txt`, currently **1.4.0**). A mismatch logs + "update available"; a silent C5 marks the bridge down. +- **Wire-protocol version (SPI-2).** Read the C5's `SPI_ID_SYSTEM_PROTO_VERSION` + (op `0x0D`) and compare it against `SPI_PROTOCOL_VERSION` (**2**). This catches a + drifted `spi_protocol.h` that the per-frame CRC cannot (intact bytes, different + meaning). A mismatch logs loudly and lights the error LED but keeps the bridge + up. Bump `SPI_PROTOCOL_VERSION` in **both** copies of `spi_protocol.h` on any + change to the contract (an id, a struct, or the header layout). + +### Update path + +The everyday update is an **app OTA**: the C5 keeps running its app and receives a +new image into its inactive OTA slot. The image is **streamed from the SD card** +(`/sdcard/c5/TentacleOS_C5.bin`) - it is no longer embedded in the P4 binary for +this path. The OTA control plane (begin / status / per-chunk acks) always rides +this SPI bridge: + +| Op | `spi_id_t` | Purpose | +|----|------------|---------| +| `SPI_ID_SYSTEM_OTA_BEGIN` | `0x0009` | begin OTA; payload `spi_ota_begin_t { size, transport }` | +| `SPI_ID_SYSTEM_OTA_STATUS` | `0x000A` | poll `spi_ota_status_t { state, bytes_written }` | +| `SPI_ID_SYSTEM_OTA_DATA` | `0x000B` | one firmware chunk (SPI transport) | + +The image bytes travel over the transport chosen in `spi_ota_begin_t.transport` +(`spi_ota_transport_t`): `SPI_OTA_TRANSPORT_SPI` (as `OTA_DATA` chunks) or +`SPI_OTA_TRANSPORT_UART` (raw over UART). For a blank/bricked C5 that has no +running app, the P4 first sends `SPI_ID_SYSTEM_ENTER_DOWNLOAD` (op `0x08`) to boot +the C5 into ROM download mode, then reflashes over UART with `esp-serial-flasher` +using the **embedded** images (the fallback path): | Image | C5 flash offset | |-------|-----------------| @@ -233,9 +341,8 @@ full image: | partition table | `0x8000` | | app | `0x10000` | -Any breaking change to the wire format must bump **both** versions -(`FIRMWARE_VERSION` on the P4 and `SPI_FW_VERSION_STRING` on the C5) to the same -new value, forcing a re-sync. +Full detail: [`../c5_flasher/README.md`](../c5_flasher/README.md) and +[`../bridge_manager/README.md`](../bridge_manager/README.md). --- @@ -245,8 +352,10 @@ new value, forcing a re-sync. - `components/Service/spi_bridge/` - `spi_bridge.c` (send command, stream task), `spi_session.c` (session/heartbeat), `spi_protocol.h` (shared contract) - `components/Drivers/spi_bridge_phy/` - SPI master PHY + IRQ edge ISR -- `components/Service/bridge_manager/` - version check + C5 recovery -- `components/Service/c5_flasher/` - `esp-serial-flasher` wrapper +- `components/Service/bridge_manager/` - bridge lifecycle, app + proto-version + checks, C5 link monitor, OTA trigger +- `components/Service/c5_flasher/` - app OTA (SD image over SPI/UART) + + `esp-serial-flasher` ROM fallback **C5 (slave)** - `components/Service/spi_bridge/` - `spi_bridge.c` (`bridge_task` routing + @@ -280,17 +389,18 @@ This component manages the high-speed communication link between the **ESP32-P4 The P4 acts as the **SPI Master**. It is responsible for: 1. Generating the SCLK and managing the CS line. 2. Initiating all command transfers. -3. Handling the **IRQ (Handshake)** signal from the C5 to know when response data is ready. -4. Managing the C5 lifecycle (Reset, Boot mode, and Firmware Updates via UART). +3. Handling the **IRQ (Handshake)** signal from the C5 to know when response data is ready (or re-clocking the bus in POLL mode on boards without an IRQ trace). +4. Managing the C5 lifecycle: reset/boot control, the app OTA (streamed from the SD image over the SPI bridge), and ROM serial-flash recovery over UART. ## Protocol Specification -Every packet follows a 5-byte fixed header: +Every packet follows a 7-byte fixed header (5 framing bytes + a 2-byte CRC-16): - `Sync (0xAA)`: Packet synchronization. - `Type`: `0x01` (Command), `0x02` (Response), `0x03` (Stream). - `Category`: Subsystem selector (`spi_cat_t`: WiFi `0x01`, BT `0x02`, …). The C5 routes a command to a dispatcher by this byte alone. - `Op`: Operation within the category. -- `Length`: Size of the following payload (0-255 bytes). +- `Length`: Size of the following payload (0-255 bytes; `SPI_MAX_PAYLOAD = 255`). +- `CRC`: CRC-16 over `[type,category,op,length]` + data (see §3, Frame-integrity CRC). `Category` + `Op` together form the packed command identifier (`spi_id_t`), built via `SPI_CMD(cat, op)`. Use `spi_header_cmd()` / `spi_header_set_cmd()` to @@ -311,10 +421,29 @@ Every command's `spi_id_t` packs `Category` (high byte) and `Op` (low byte) via | `SPI_ID_SYSTEM_DATA` | `0x05` | `0x0005` | | `SPI_ID_SYSTEM_STREAM` | `0x06` | `0x0006` | | `SPI_ID_SYSTEM_LOG` | `0x07` | `0x0007` | +| `SPI_ID_SYSTEM_ENTER_DOWNLOAD` | `0x08` | `0x0008` | +| `SPI_ID_SYSTEM_OTA_BEGIN` | `0x09` | `0x0009` | +| `SPI_ID_SYSTEM_OTA_STATUS` | `0x0A` | `0x000A` | +| `SPI_ID_SYSTEM_OTA_DATA` | `0x0B` | `0x000B` | +| `SPI_ID_SYSTEM_INFO` | `0x0C` | `0x000C` | +| `SPI_ID_SYSTEM_PROTO_VERSION` | `0x0D` | `0x000D` | +| `SPI_ID_SYSTEM_POWER_STATE` | `0x4A` | `0x004A` | `SPI_ID_SYSTEM_LOG` is a C5→P4 stream carrying log lines (`[level u8][utf-8]`) for the companion's C5 console (see the host-link docs). +- `ENTER_DOWNLOAD` (`0x08`): P4→C5 - reboot into ROM serial-download mode for + serial-flash recovery. +- `OTA_BEGIN` / `OTA_STATUS` / `OTA_DATA` (`0x09`-`0x0B`): P4→C5 app-OTA control + plane (§8). BEGIN payload `spi_ota_begin_t { u32 size, u8 transport }`; STATUS + response `spi_ota_status_t { u8 state, u32 bytes_written }`; DATA carries one + firmware chunk on the SPI transport. +- `SYSTEM_INFO` (`0x0C`): P4→C5 - read chip identity (`spi_sys_info_t`: + model / revision / MAC / free heap). +- `PROTO_VERSION` (`0x0D`): P4→C5 - read the C5's `SPI_PROTOCOL_VERSION` (u16). + Checked at bridge init (§8). +- `POWER_STATE` (`0x4A`): P4→C5 - device power state (see Power management below). + System ops `0x40`-`0x49` (`FILE_*`, `SYSTEM_DEVICE_STATE`, `SYSTEM_CONSOLE_EXEC`, `SYSTEM_GET_SETTINGS`, `SYSTEM_SET_SETTINGS`) are **P4-local host-link commands**: they share the `spi_id_t` space so the companion app and P4 agree, but they are @@ -326,6 +455,7 @@ in [`../host_link/protocol.md`](../host_link/protocol.md). | Command | Op | `spi_id_t` | |---------|----|------------| | `SPI_ID_WIFI_SCAN` | `0x10` | `0x0110` | +| `SPI_ID_WIFI_SCAN_STATUS` | `0x50` | `0x0150` | | `SPI_ID_WIFI_CONNECT` | `0x11` | `0x0111` | | `SPI_ID_WIFI_DISCONNECT` | `0x12` | `0x0112` | | `SPI_ID_WIFI_GET_STA_INFO` | `0x13` | `0x0113` | @@ -396,6 +526,7 @@ in [`../host_link/protocol.md`](../host_link/protocol.md). | Command | Op | `spi_id_t` | |---------|----|------------| | `SPI_ID_BT_SCAN` | `0x50` | `0x0250` | +| `SPI_ID_BT_SCAN_STATUS` | `0x7F` | `0x027F` | | `SPI_ID_BT_CONNECT` | `0x51` | `0x0251` | | `SPI_ID_BT_DISCONNECT` | `0x52` | `0x0252` | | `SPI_ID_BT_GET_INFO` | `0x53` | `0x0253` | @@ -475,6 +606,27 @@ this category to `bt_dispatcher`. See [`../host_link/`](../host_link/README.md). | `SPI_ID_HOST_RX` | `0xA3` | `0x06A3` | C5→P4 stream: app→device (BLE write) | | `SPI_ID_HOST_STATUS` | `0xA4` | `0x06A4` | P4→C5 cmd: poll BLE connection state | +### Screen (`0x07`) + +P4-native screen sharing over the USB host link. These are **handled locally on +the P4 and never relayed to the C5**; they share the `spi_id_t` space so the +companion app and P4 agree on the ids. `START`/`STOP`/`KEY` are app→device +commands; `FRAME` is a device→app STREAM. + +| Command | Op | `spi_id_t` | Direction | +|---------|----|------------|-----------| +| `SPI_ID_SCREEN_START` | `0x01` | `0x0701` | app→device: start streaming the live screen | +| `SPI_ID_SCREEN_STOP` | `0x02` | `0x0702` | app→device: stop streaming | +| `SPI_ID_SCREEN_KEY` | `0x03` | `0x0703` | app→device: inject a key (`spi_screen_key_t`) | +| `SPI_ID_SCREEN_FRAME` | `0x04` | `0x0704` | device→app STREAM: RGB565 row-strip | + +- `spi_screen_key_t`: `UP` (0), `DOWN` (1), `LEFT` (2), `RIGHT` (3), `OK` (4), + `BACK` (5) - mapped to the LVGL keypad. +- `SPI_ID_SCREEN_FRAME` payload starts with `spi_screen_strip_t { u16 y, u16 rows, + u16 width }`, followed by `rows * width` little-endian RGB565 pixels. The screen + is streamed as horizontal row-strips; `y == 0` marks the first strip of a new + frame. + ### Session (`0xFF`) | Command | Op | `spi_id_t` | @@ -485,15 +637,17 @@ this category to `bt_dispatcher`. See [`../host_link/`](../host_link/README.md). ## Frame Example -The 5-byte header maps directly to `spi_header_t`: +The 7-byte header maps directly to `spi_header_t` (`cc cc` below is the little- +endian CRC-16, computed over `[type,category,op,length]` + data - see §3): ```c -typedef struct { +typedef struct __attribute__((packed)) { uint8_t sync; // 0xAA uint8_t type; // spi_type_t: CMD 0x01 / RESP 0x02 / STREAM 0x03 uint8_t category; // spi_cat_t uint8_t op; // operation within the category uint8_t length; // payload bytes that follow (0-255) + uint16_t crc; // CRC-16 over [type,category,op,length] + data } spi_header_t; ``` @@ -501,23 +655,25 @@ typedef struct { ``` P4 -> C5 (command) - AA 01 01 10 00 - ^ ^ ^ ^ ^ - | | | | +-- length = 0 - | | | +----- op = 0x10 - | | +-------- category = 0x01 (WiFi) - | +----------- type = 0x01 (CMD) - +-------------- sync = 0xAA - -C5 -> P4 (response, after raising IRQ) - payload byte 0 is the status - AA 02 01 10 01 00 - ^ ^ ^ ^ ^ ^ - | | | | | +-- status = 0x00 (SPI_STATUS_OK) - | | | | +----- length = 1 - | | | +-------- op = 0x10 - | | +----------- category = 0x01 - | +-------------- type = 0x02 (RESP) - +----------------- sync = 0xAA + AA 01 01 10 00 cc cc + ^ ^ ^ ^ ^ ^--^ + | | | | | +-- crc = CRC-16 (little-endian) + | | | | +------- length = 0 + | | | +---------- op = 0x10 + | | +------------- category = 0x01 (WiFi) + | +---------------- type = 0x01 (CMD) + +------------------- sync = 0xAA + +C5 -> P4 (response, after the handshake) - payload byte 0 is the status + AA 02 01 10 01 cc cc 00 + ^ ^ ^ ^ ^ ^--^ ^ + | | | | | | +-- status = 0x00 (SPI_STATUS_OK) [payload byte 0] + | | | | | +------- crc = CRC-16 (little-endian) + | | | | +---------- length = 1 + | | | +------------- op = 0x10 + | | +---------------- category = 0x01 + | +------------------- type = 0x02 (RESP) + +---------------------- sync = 0xAA ``` Scan results are then pulled item-by-item through the **Generic Data Pipe** (`SPI_ID_SYSTEM_DATA`) described below. @@ -538,7 +694,7 @@ per round-trip: - The C5 buffers records in a ring (depth `SPI_STREAM_QUEUE_LEN = 64`). On a `SPI_ID_SYSTEM_STREAM` poll it packs as many as fit into a single large frame of `SPI_STREAM_FRAME_SIZE` (2048 B) and the P4 always clocks that fixed size. -- Stream frame layout (after the 5-byte header, `type = STREAM`): +- Stream frame layout (after the 7-byte header, `type = STREAM`): `[u16 batch_len]` then `batch_len` bytes of records, each `[u16 op][u8 len][len bytes]`. `batch_len = 0` means "no data" → the P4 backs off and polls again later. @@ -805,7 +961,8 @@ This component transforms the **ESP32-C5** into a high-performance radio co-proc ## How it Works The C5 runs a background task (`spi_bridge_task`) that stays in a blocked state waiting for the P4 to send SPI bytes. -1. **Reception**: When bytes arrive, the task validates the `0xAA` sync byte. +1. **Reception**: When bytes arrive, the task validates the `0xAA` sync byte and + the frame CRC-16 (`spi_frame_valid`), dropping any corrupted frame. 2. **Routing**: It switches on the `Category` byte and routes the payload to the appropriate **Dispatcher** (WiFi or Bluetooth); the `Op` byte selects the operation within that dispatcher. 3. **Execution**: The Dispatcher executes the radio command (e.g., starts a scan). 4. **Notification**: Once the command is done (or results are ready), the C5 raises the **IRQ (Handshake)** pin. From 21f7e205bd45cab65b0d11f2ff40c293b2382640 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:35 -0300 Subject: [PATCH 064/103] docs(c5_flasher): document transport selector, SD streaming and ROM download path --- docs/c5_flasher/README.md | 108 +++++++++++++++++++++++++++++++++----- 1 file changed, 95 insertions(+), 13 deletions(-) diff --git a/docs/c5_flasher/README.md b/docs/c5_flasher/README.md index dfa9fc968..436d673b6 100644 --- a/docs/c5_flasher/README.md +++ b/docs/c5_flasher/README.md @@ -1,21 +1,103 @@ # C5 Flasher Service - P4 Master -This service allows the ESP32-P4 to update the firmware of the ESP32-C5 using an embedded binary image. +Lets the ESP32-P4 update or recover the ESP32-C5 firmware. There are two paths: -## Features -- **Embedded Binary**: The C5 firmware is embedded directly into the P4 executable during the build process. -- **Bootloader Control**: Automatically puts the C5 into serial bootloader mode using the BOOT and RESET pins. -- **Serial Protocol**: Implements the Espressif Serial Protocol (SLIP framing) to write blocks to the C5 flash. +- **App OTA (primary):** the C5 keeps running its app; the P4 hands it a new + image, which it writes to its inactive OTA slot and boots. The control plane + (begin / status / per-chunk acks) always rides the SPI bridge; the image bytes + travel over the transport the caller selects. The image is normally **streamed + from the SD card** (`/sdcard/c5/TentacleOS_C5.bin`), so it is no longer embedded + in the P4 binary for the everyday update. +- **ROM serial-flash (fallback / bricked C5):** the P4 speaks the ROM + serial-bootloader protocol over UART itself (via `esp-serial-flasher`) to a C5 + that is in ROM download mode. Only this path uses the **embedded** C5 images + (`c5_rom_flasher.c`, guarded by `C5_ROM_IMAGES_EMBEDDED`). -## Usage -1. **Initial Sync**: On boot, the `bridge_manager` checks the C5 version. -2. **Auto-Update**: If the C5 is unresponsive or outdated, `c5_flasher_update(NULL, 0)` is called. -3. **Execution**: The P4 stops the SPI bridge, initializes the Flasher UART, pulses the Reset pin with Boot LOW, and starts streaming the binary. +## App OTA + +```c +esp_err_t c5_flasher_update(const uint8_t *bin_data, uint32_t bin_size, uint8_t transport); +``` + +- `bin_data == NULL` -> the image is streamed from `/sdcard/c5/TentacleOS_C5.bin` + (`bin_size` is taken from the file). Otherwise the caller's buffer is used. +- `transport` is a `spi_ota_transport_t` selector: + - `SPI_OTA_TRANSPORT_SPI` - image bytes arrive as `SPI_ID_SYSTEM_OTA_DATA` + chunks (240 firmware bytes per chunk). No UART wiring needed. + - `SPI_OTA_TRANSPORT_UART` - image bytes arrive raw over UART1 -> C5 UART0 + (needs `c5_flasher_init()`). **Non-functional on the HighBoy V2** (no direct + P4<->C5 UART on that board); use SPI there. + +Flow (`c5_flasher_update`): +1. Send `SPI_ID_SYSTEM_OTA_BEGIN` with `spi_ota_begin_t { size, transport }`. The + BEGIN ack often coincides with the C5's erase and is lost, so the P4 confirms + the C5 actually started by polling `SPI_ID_SYSTEM_OTA_STATUS` + (`spi_ota_status_t { state, bytes_written }`) instead of trusting the ack. +2. Poll `OTA_STATUS` until the C5 reaches `SPI_OTA_STATE_READY` (erase done). +3. Stream the image in blocks (SPI: 240 B `OTA_DATA` chunks; UART: 4 KB blocks), + advancing the live progress counters read by `c5_flasher_progress()`. +4. The C5 validates, sets the new slot to boot and reboots. A failed transfer is + harmless: the old slot still boots. + +`spi_ota_state_t` progression: `IDLE -> ERASING -> READY -> RECEIVING -> DONE` +(or `ERROR`). + +## ROM download entry points + +For a blank or bricked C5 (no working app / bridge), reflash over the ROM +bootloader: + +```c +esp_err_t c5_flasher_enter_download(void); // ask the running C5 to reboot into ROM download mode +esp_err_t c5_flasher_rom_flash(void); // reflash from embedded images +void c5_passthrough_run(void); // forward host esptool <-> C5 ROM (never returns) +``` + +- `c5_flasher_enter_download()` sends `SPI_ID_SYSTEM_ENTER_DOWNLOAD` over the SPI + bridge; the C5 acks and reboots into ROM serial-download mode. After this the + C5 is no longer running its app (the OTA receiver is gone), so recovery must + continue via `c5_flasher_rom_flash()` or passthrough. +- `c5_flasher_rom_flash()` writes bootloader + partition table + otadata + app - + all embedded in the P4 - and MD5-verifies each region. **Precondition:** the C5 + must already be in ROM download mode (strap it manually, or call + `c5_flasher_enter_download()` first). Returns `ESP_ERR_NOT_FOUND` unless + `C5_ROM_IMAGES_EMBEDDED` is set. +- `c5_passthrough_run()` bridges the P4's console UART (host PC USB-serial) to the + C5 UART0 so the host can run `esptool` directly against the C5 ROM bootloader. + Kills the REPL, disables UART logs and never returns; reboot the P4 (or press + BACK) to exit. + +## UART helpers + +```c +esp_err_t c5_flasher_init(void); // bring up UART1 (only needed for the UART OTA transport) +void c5_flasher_release_uart(void); // delete UART1 + tri-state the C5-UART pins for an external programmer +``` + +## Bridge / status helpers + +```c +esp_err_t c5_flasher_ping(void); // SPI_ID_SYSTEM_PING +esp_err_t c5_flasher_info(void); // SPI_ID_SYSTEM_INFO -> chip model / rev / MAC / free heap +esp_err_t c5_flasher_sync(void); // re-probe the C5 and mark the bridge alive iff it answers a ping +void c5_flasher_progress(uint32_t *sent, uint32_t *total); // live OTA progress for the UI bar +``` + +## Callers + +`bridge_manager` triggers the app OTA (`bridge_manager_force_update()` calls +`c5_flasher_update(NULL, 0, SPI_OTA_TRANSPORT_SPI)`). Version mismatch is +**detection-only** - the user starts the update explicitly (the `c5` console +command); the P4 never auto-flashes. See +[`../bridge_manager/README.md`](../bridge_manager/README.md). ## Symbols -The embedded binary is accessed via: -- `_binary_firmware_c5_bin_start` -- `_binary_firmware_c5_bin_end` + +The ROM-flash fallback references the embedded C5 app image via: +- `_binary_TentacleOS_C5_bin_start` +- `_binary_TentacleOS_C5_bin_end` ## Build Automation -Use the `./tools/build_and_flash.sh` script to ensure the C5 binary is updated and embedded correctly before flashing the P4. + +Use `./tools/build_and_flash.sh` to keep the C5 binary current (SD image and, for +the ROM fallback, the embedded copy) before flashing the P4. From 3c0af064b60fae00936089c32061f1b29be827e5 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:35 -0300 Subject: [PATCH 065/103] docs(spi): add SPI_DEVICE_BRIDGE and note legacy CC1101 label --- docs/spi/README.md | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/docs/spi/README.md b/docs/spi/README.md index d234b6341..f2f5ac577 100644 --- a/docs/spi/README.md +++ b/docs/spi/README.md @@ -12,8 +12,11 @@ This component acts as a central manager for the SPI bus, allowing multiple devi ## Supported Devices (`spi_device_id_t`) 1. **SPI_DEVICE_ST7789:** Display Driver -2. **SPI_DEVICE_CC1101:** Sub-GHz Radio +2. **SPI_DEVICE_CC1101:** Sub-GHz radio. The enum name is **legacy**: the SPI3 + radio is now the **SX1262 LoRa** part, which shares the SPI3 bus with the + ST7789 display behind a bus lock (see `spi_bus_lock_take` / `spi_bus_lock_give`). 3. **SPI_DEVICE_SD_CARD:** Storage +4. **SPI_DEVICE_BRIDGE:** The P4->C5 SPI bridge device (P4 only). ## API Reference @@ -69,7 +72,7 @@ This component acts as a central manager for the SPI bus, allowing multiple devi ## Supported Devices (`spi_device_id_t`) 1. **SPI_DEVICE_ST7789:** Display Driver -2. **SPI_DEVICE_CC1101:** Sub-GHz Radio +2. **SPI_DEVICE_CC1101:** Sub-GHz radio (legacy enum name for the LoRa part). 3. **SPI_DEVICE_SD_CARD:** Storage ## API Reference From ef1a3825af15661227f8a1e38905597fe5705217 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:35 -0300 Subject: [PATCH 066/103] docs(bridge_manager): add link-manager and version-check documentation --- docs/bridge_manager/README.md | 71 +++++++++++++++++++ .../Service/bridge_manager/README.md | 7 ++ 2 files changed, 78 insertions(+) create mode 100644 docs/bridge_manager/README.md create mode 100644 firmware_p4/components/Service/bridge_manager/README.md diff --git a/docs/bridge_manager/README.md b/docs/bridge_manager/README.md new file mode 100644 index 000000000..2b866512d --- /dev/null +++ b/docs/bridge_manager/README.md @@ -0,0 +1,71 @@ +# Bridge Manager - P4 + +The **P4-side lifecycle / link manager for the P4<->C5 SPI bridge**. It brings the +bridge up in the right handshake mode, checks that the two chips agree on the wire +contract, keeps the link status honest while the C5 comes and goes, and is the +entry point that triggers a C5 firmware update. + +- Location: `firmware_p4/components/Service/bridge_manager/` +- Transport it drives: [`../spi_bridge/README.md`](../spi_bridge/README.md) +- Update path it triggers: [`../c5_flasher/README.md`](../c5_flasher/README.md) + +## API + +```c +esp_err_t bridge_manager_init(void); // bring up the bridge + run the boot checks +esp_err_t bridge_manager_force_update(void); // push a C5 app OTA (SD image, SPI transport) +``` + +## What `bridge_manager_init()` does + +1. **Bridge init (POLL mode).** The HighBoy V2 PCB has no bridge IRQ trace + (`GPIO_BRIDGE_IRQ_PIN == -1`), so the master polls the bus instead of waiting + on an IRQ: `spi_bridge_master_init_mode(SPI_BRIDGE_MODE_POLL)`. The C5 slave + must be initialized in the matching mode. +2. **App-version check.** Reads the C5 firmware version (`SPI_ID_SYSTEM_VERSION`) + and compares it against the P4's expected `FIRMWARE_VERSION` (generated from + `common/metadata/version_info.txt`, currently **1.4.0**). This is + **detection-only**: a mismatch just logs "update available" and a silent C5 + marks the bridge down - the P4 never auto-flashes. The user updates explicitly + with the `c5` console command. +3. **Proto-version match check (SPI-2).** `check_c5_protocol()` reads the C5's + `SPI_ID_SYSTEM_PROTO_VERSION` and compares it against `SPI_PROTOCOL_VERSION` + (**2**). This is the second integrity layer, distinct from the per-frame CRC + (SPI-1): a drifted `spi_protocol.h` leaves the bytes intact but makes the two + ends assign them different meaning, which the CRC cannot catch. On mismatch + (or an older C5 that answers `UNSUPPORTED`) it logs loudly and calls + `led_signal_error()`, but keeps the bridge up - detection, not enforcement. +4. **Starts the C5 link monitor task** (below). + +## C5 link monitor + +A background task (`c5_link_monitor`), pinned to `SYS_CORE_RADIO` at +`SYS_PRIO_SERVICE_LO`, that re-detects a C5 which booted late or rebooted after an +OTA: + +- Idles while `spi_bridge_is_alive()` - it never pokes the bus once the link is up. +- While the bridge is dead, every ~1.5 s it optimistically probes + `SPI_ID_SYSTEM_VERSION` (500 ms timeout). On success it marks the bridge alive, + calls `led_signal_info()` to clear the degraded indicator, and re-runs + `check_c5_protocol()`. On failure it drops back to dead and retries later. + +## C5-link LED signalling + +The manager reflects bridge health on the status LED via `led_control`: + +- `led_signal_error()` on a proto-version mismatch / unavailable (headers out of + sync - reflash both). +- `led_signal_info()` when the link is (re)established, clearing the warning state. + +## OTA triggering + +`bridge_manager_force_update()` runs `c5_flasher_init()` then +`c5_flasher_update(NULL, 0, SPI_OTA_TRANSPORT_SPI)` - i.e. the C5 app OTA streamed +from the SD image over the SPI transport (control always on the bridge). See the +c5_flasher doc for the OTA flow. + +## Safe reads (out_capacity clamp) + +Every `spi_bridge_send_command()` call passes an explicit `out_capacity` equal to +the receiving buffer's `sizeof`, so a slave that announces (or a corrupted length +that inflates) more bytes than the buffer holds is clamped and cannot overflow it. diff --git a/firmware_p4/components/Service/bridge_manager/README.md b/firmware_p4/components/Service/bridge_manager/README.md new file mode 100644 index 000000000..6bc1e4815 --- /dev/null +++ b/firmware_p4/components/Service/bridge_manager/README.md @@ -0,0 +1,7 @@ +# Bridge Manager - P4 (SPI bridge lifecycle / link manager) + +Documentation for this component lives in the project docs hub (single source of truth): + +- [docs/bridge_manager/README.md](../../../../docs/bridge_manager/README.md) + +This file is only a pointer: edit the docs there to keep things from drifting. From 8c91229cd7fb2637cabfcbd2f8dc9629c721d5c7 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:35 -0300 Subject: [PATCH 067/103] docs(wifi): rewrite P4 as SPI-bridge proxy and add C5 busy/power-save APIs --- docs/wifi/README.md | 331 ++++++++++++++++++++++---------------------- 1 file changed, 169 insertions(+), 162 deletions(-) diff --git a/docs/wifi/README.md b/docs/wifi/README.md index 26fa45a1e..7ef61361f 100644 --- a/docs/wifi/README.md +++ b/docs/wifi/README.md @@ -1,19 +1,41 @@ +# Wi-Fi service + +Split across **both firmwares**. The **C5 owns the real radio** (the full esp-idf +Wi-Fi stack, AP/STA, scanning, promiscuous capture, config persistence). The **P4 +is a pure proxy**: every public call forwards to the C5 over the SPI bridge. Keep +this split in mind - the two `wifi_service` APIs look almost identical, but the +P4 one has no local Wi-Fi stack behind it. + +Both headers share the same file-path defines: + +```c +#define WIFI_AP_CONFIG_FILE "config/wifi/wifi_ap.conf" +#define WIFI_KNOWN_NETWORKS_FILE "storage/wifi/know_networks.json" +``` + +Both are relative paths handed to the `storage_assets` API; the actual files +live on the C5 (it owns storage for Wi-Fi state). + +--- + # P4 -This component manages Wi-Fi functionalities including Access Point (AP) mode, Station (STA) mode, scanning, and configuration persistence using JSON files. +`firmware_p4/components/Service/wifi/` - a **thin SPI-bridge proxy** to the C5. +There is **no local esp-idf Wi-Fi stack on the P4**: no APSTA mode, no NVS init, +no default event loop, no netif / static IP / DHCP server, no `cJSON`, no local +channel-hop task, and no LED signalling in this module. Every operation is a +`spi_bridge_send_command` (or `spi_bridge_run_scan`) to the C5. -## Functionality Overview +## How state is read without blocking the UI -The service handles: -- **Initialization/Deinitialization:** Setup of NVS, Netif, Event Loops, and Wi-Fi drivers. -- **Access Point (AP):** Configurable SSID, password, max connections, and custom IP address. -- **Scanning:** Active scanning for nearby networks. -- **Station (STA):** Connecting to external Wi-Fi networks. -- **Hotspot Management:** Dynamic switching of AP configuration. -- **Promiscuous Mode:** Low-level packet sniffing and environment monitoring. -- **Channel Hopping:** Automated cycling through Wi-Fi channels for environment monitoring. -- **Configuration Persistence:** AP/client settings loaded via `tos_config_load_all()` from SD (`config/wifi.conf`) with flash fallback (`/assets/config/wifi/wifi_ap.conf`). -- **Known Networks:** Automatically saves connected network credentials to `wifi/` on SD card. +The header getters (`wifi_service_is_active` / `wifi_service_is_connected`) are +polled from an `lv_timer` on the LVGL thread. Doing a blocking SPI RPC there +froze the renderer whenever the bridge was busy (e.g. during a scan, which holds +the bridge mutex for seconds). So a background `status_poll_task` (pinned to +`SYS_CORE_RADIO`, priority `SYS_PRIO_BACKGROUND`) polls `SPI_ID_SYSTEM_STATUS` +once per second and caches `wifi_active` / `wifi_connected` into volatile flags; +the getters just read those flags. The same poll also feeds +`bluetooth_service_set_running_cached`. ## API Functions @@ -23,51 +45,51 @@ The service handles: ```c void wifi_service_init(void); ``` -Initializes the Wi-Fi stack in `APSTA` mode. -- Initializes NVS (performing erase if necessary). -- Sets up the default event loop and registers handlers. -- Loads AP configuration from storage (or uses defaults "Darth Maul"/"MyPassword123"). -- Configures the static IP (default: 192.168.4.1) and starts the DHCP server. +Spawns the background `status_poll_task` (once). It does **not** bring up any +radio - the C5 owns that. #### `wifi_service_deinit` ```c void wifi_service_deinit(void); ``` -Completely shuts down the Wi-Fi service. -- Stops the Wi-Fi driver. -- Unregisters event handlers. -- Deinitializes the driver. -- Frees synchronization primitives (mutexes) and clears static data. +Sends `SPI_ID_WIFI_STOP` to the C5 (functionally identical to +`wifi_service_stop`; there is no local stack to tear down). #### `wifi_service_start` / `wifi_service_stop` ```c void wifi_service_start(void); void wifi_service_stop(void); ``` -Simple wrappers to start or stop the Wi-Fi driver without full deinitialization. `wifi_service_stop` also clears stored scan results. +Forward `SPI_ID_WIFI_START` / `SPI_ID_WIFI_STOP` to the C5. ### Scanning #### `wifi_service_scan` ```c -void wifi_service_scan(void); +esp_err_t wifi_service_scan(void); ``` -Performs an active Wi-Fi scan. -- Uses a mutex to ensure thread safety. -- Stores up to `WIFI_SCAN_LIST_SIZE` results internally. -- Provides visual feedback via LEDs (Green for AP connection, Red for failures, Blue for scan success). +**Async, proxied.** The C5 runs the scan. This calls +`spi_bridge_run_scan(SPI_ID_WIFI_SCAN, SPI_ID_WIFI_SCAN_STATUS, NULL, 0)`, which +kicks the scan and polls the scan-status id **without holding the bridge mutex** +(so the UI and other peripherals stay free), returning once the C5 reports +completion. Returns `esp_err_t`. #### `wifi_service_get_ap_count` ```c uint16_t wifi_service_get_ap_count(void); ``` -Returns the number of networks found in the last scan. +Fetches the last-scan count from the C5 via `SPI_ID_SYSTEM_DATA` (with the +`SPI_DATA_INDEX_COUNT` magic index). Returns 0 on bridge failure. #### `wifi_service_get_ap_record` ```c -wifi_ap_record_t* wifi_service_get_ap_record(uint16_t index); +wifi_ap_record_t *wifi_service_get_ap_record(uint16_t index); ``` -Retrieves a pointer to a specific scan result record. Returns `NULL` if the index is invalid. +Fetches one scan record from the C5 (`SPI_ID_SYSTEM_DATA`, indexed) into a static +cache and returns a pointer to it, or `NULL` on failure. Sanitizes the SSID at +this single point for every consumer (console + UI): non-printable / non-ASCII +bytes become `?` (they hang LVGL's text renderer), and an empty SSID (hidden +network) is replaced with the placeholder `[rede oculta]`. ### Connection & Management @@ -75,132 +97,105 @@ Retrieves a pointer to a specific scan result record. Returns `NULL` if the inde ```c esp_err_t wifi_service_connect_to_ap(const char *ssid, const char *password); ``` -Connects the device (as a station) to an external Access Point. -- Configures authentication mode based on the presence of a password (WPA2_PSK or OPEN). -- Disconnects any existing connection before attempting a new one. -- **Persistence:** Automatically saves the SSID and password to `assets/storage/wifi/know_networks.json`. If the network already exists, the password is updated. +Packs the SSID/password into `spi_wifi_connect_t` and forwards +`SPI_ID_WIFI_CONNECT` to the C5. The C5 performs the actual join and known-network +persistence. #### `wifi_service_is_connected` ```c bool wifi_service_is_connected(void); ``` -Returns `true` if the device is currently connected to an external Wi-Fi network and has an IP address. +Returns the cached `wifi_connected` flag (refreshed by `status_poll_task`). Does +**not** hit the bridge. #### `wifi_service_is_active` ```c bool wifi_service_is_active(void); ``` -Returns `true` if the Wi-Fi service is started (driver initialized and interface up). +Returns the cached `wifi_active` flag (refreshed by `status_poll_task`). Does +**not** hit the bridge. #### `wifi_service_get_connected_ssid` ```c -const char* wifi_service_get_connected_ssid(void); +const char *wifi_service_get_connected_ssid(void); ``` -Returns the SSID of the currently connected network. Returns `NULL` if not connected. +Fetches the STA SSID from the C5 via `SPI_ID_WIFI_GET_STA_INFO` into a static +buffer; returns it (NUL-terminated) or `NULL` on failure. #### `wifi_service_change_to_hotspot` ```c void wifi_service_change_to_hotspot(const char *new_ssid); ``` -Dynamically reconfigures the device's Access Point to an **Open** network with the specified SSID. -- Stops the Wi-Fi driver briefly to apply changes. -- Sets `authmode` to `WIFI_AUTH_OPEN`. -- Restarts Wi-Fi with the new configuration. +On the P4 this is just a wrapper around `wifi_service_set_ap_ssid(new_ssid)`. ### Promiscuous Mode -#### `wifi_service_promiscuous_start` +#### `wifi_service_promiscuous_start` / `wifi_service_promiscuous_stop` ```c void wifi_service_promiscuous_start(wifi_promiscuous_cb_t cb, wifi_promiscuous_filter_t *filter); -``` -Enables promiscuous mode (sniffer) with a custom callback and filter. -- `cb`: Function to handle captured packets. -- `filter`: Filter mask (e.g., `WIFI_PROMIS_FILTER_MASK_MGMT`). - -#### `wifi_service_promiscuous_stop` -```c void wifi_service_promiscuous_stop(void); ``` -Disables promiscuous mode and clears the callback. +Forward `SPI_ID_WIFI_PROMISC_START` / `SPI_ID_WIFI_PROMISC_STOP`. The `cb` and +`filter` arguments are **ignored** on the P4 (the capture and its callback run on +the C5); the signature is kept for source compatibility. If the C5 replies +`ESP_ERR_NOT_SUPPORTED`, a warning is logged. ### Channel Hopping -#### `wifi_service_start_channel_hopping` +#### `wifi_service_start_channel_hopping` / `wifi_service_stop_channel_hopping` ```c void wifi_service_start_channel_hopping(void); -``` -Starts a background task that cycles the Wi-Fi interface through channels 1 to 13. -- Useful for promiscuous mode applications (e.g., deauth detection). -- Task memory is allocated in PSRAM if available. - -#### `wifi_service_stop_channel_hopping` -```c void wifi_service_stop_channel_hopping(void); ``` -Stops the channel hopping task and frees associated memory resources. +Forward `SPI_ID_WIFI_CH_HOP_START` / `SPI_ID_WIFI_CH_HOP_STOP`. The hopping task +itself lives on the C5. ### Configuration Storage +All setters forward to the C5, which persists to `WIFI_AP_CONFIG_FILE` and +applies any radio state change. + #### `wifi_service_save_ap_config` ```c -esp_err_t wifi_service_save_ap_config(const char *ssid, const char *password, uint8_t max_conn, const char *ip_addr, bool enabled); +esp_err_t wifi_service_save_ap_config( + const char *ssid, const char *password, uint8_t max_conn, const char *ip_addr, bool enabled); ``` -Saves the AP configuration to a JSON file (`/assets/config/wifi/wifi_ap.conf`). -- Uses `cJSON` to serialize settings. -- Persists data using the storage API. -- **State Management:** If `enabled` is `true` and Wi-Fi is inactive, it calls `wifi_service_start()`. If `enabled` is `false` and Wi-Fi is active, it calls `wifi_service_stop()`. +Packs the fields into `spi_wifi_ap_config_t` and forwards +`SPI_ID_WIFI_SAVE_AP_CONFIG`. Returns `ESP_ERR_INVALID_ARG` if `ssid` is NULL. #### Individual Setters -Helper functions to update a single configuration parameter while preserving others. They automatically save the config and trigger state changes if `enabled` is toggled. - ```c -esp_err_t wifi_service_set_enabled(bool enabled); -esp_err_t wifi_service_set_ap_ssid(const char *ssid); -esp_err_t wifi_service_set_ap_password(const char *password); -esp_err_t wifi_service_set_ap_max_conn(uint8_t max_conn); -esp_err_t wifi_service_set_ap_ip(const char *ip_addr); +esp_err_t wifi_service_set_enabled(bool enabled); // SPI_ID_WIFI_SET_ENABLED +esp_err_t wifi_service_set_ap_ssid(const char *ssid); // SPI_ID_WIFI_SET_AP +esp_err_t wifi_service_set_ap_password(const char *p); // SPI_ID_WIFI_SET_AP_PASSWORD +esp_err_t wifi_service_set_ap_max_conn(uint8_t n); // SPI_ID_WIFI_SET_AP_MAX_CONN +esp_err_t wifi_service_set_ap_ip(const char *ip_addr); // SPI_ID_WIFI_SET_AP_IP ``` - -**Internal Loader:** `wifi_service_load_ap_config` is called during initialization to read these settings. If `enabled` is found to be `false` in the config, `wifi_service_init` will initialize the driver but **not** start the radio. - -## Internal Implementation Details - -### Event Handling -A static `wifi_event_handler` manages Wi-Fi and IP events: -- **WIFI_EVENT_AP_STACONNECTED:** Logs the MAC of the connected station and blinks Green. -- **WIFI_EVENT_AP_STADISCONNECTED:** Blinks Red. -- **IP_EVENT_AP_STAIPASSIGNED:** Logs IP assignment and blinks Green. - -### Thread Safety -A `wifi_mutex` (Semaphore) is used to protect the scanning process (`wifi_service_scan`), preventing concurrent scan requests which could lead to resource conflicts. - -### Channel Hopping Task -The channel hopping feature runs as a static FreeRTOS task. It uses `esp_wifi_set_channel` to switch channels every 250ms. To optimize internal RAM usage, both the task stack and the Task Control Block (TCB) are allocated in **PSRAM** using the `SPIRAM` capability. - -### Castings & Memory Management -- **cJSON:** Used extensively for parsing and generating configuration files. -- **PSRAM Allocation:** Critical tasks and large buffers are allocated in PSRAM to preserve internal memory. -- **Type Casting:** `event_data` is cast to specific event structures (e.g., `wifi_event_ap_staconnected_t*`) within handlers. -- **String Handling:** `strncpy` is used safely with explicit null-termination to prevent buffer overflows when handling SSIDs and passwords. +Each forwards one SPI command. `wifi_service_set_ap_password` / +`wifi_service_set_ap_ip` return `ESP_ERR_INVALID_ARG` on a NULL argument. --- # C5 -This component manages Wi-Fi functionalities including Access Point (AP) mode, Station (STA) mode, scanning, and configuration persistence using JSON files. +`firmware_c5/components/Service/wifi/` - this is where the **real Wi-Fi stack +lives**. It manages AP mode, STA mode, scanning, promiscuous capture, channel +hopping, and JSON config persistence directly on the esp-idf Wi-Fi driver. ## Functionality Overview -The service handles: -- **Initialization/Deinitialization:** Setup of NVS, Netif, Event Loops, and Wi-Fi drivers. -- **Access Point (AP):** Configurable SSID, password, max connections, and custom IP address. -- **Scanning:** Active scanning for nearby networks. -- **Station (STA):** Connecting to external Wi-Fi networks. -- **Hotspot Management:** Dynamic switching of AP configuration. -- **Promiscuous Mode:** Low-level packet sniffing and environment monitoring. -- **Channel Hopping:** Automated cycling through Wi-Fi channels for environment monitoring. -- **Configuration Persistence:** Loading and saving AP settings to/from `assets/config/wifi/wifi_ap.conf`. -- **Known Networks:** Automatically saves connected network credentials to `assets/storage/wifi/know_networks.json`. +- **Initialization/Deinitialization:** NVS, Netif, default event loop + handlers, + and the Wi-Fi driver, brought up in `WIFI_MODE_APSTA`. +- **Access Point (AP):** Configurable SSID, password, max connections, custom + static IP (default `192.168.4.1`), DHCP server. +- **Scanning:** Active scan storing up to `WIFI_SCAN_LIST_SIZE` results. +- **Station (STA):** Joins external networks. +- **Promiscuous Mode / Channel Hopping:** Low-level capture plus a background task + cycling channels for environment monitoring. +- **Configuration Persistence:** AP settings to/from `WIFI_AP_CONFIG_FILE` + (`config/wifi/wifi_ap.conf`) via `storage_assets`. +- **Known Networks:** Connected credentials saved to `WIFI_KNOWN_NETWORKS_FILE` + (`storage/wifi/know_networks.json`). ## API Functions @@ -210,28 +205,38 @@ The service handles: ```c void wifi_service_init(void); ``` -Initializes the Wi-Fi stack in `APSTA` mode. -- Initializes NVS (performing erase if necessary). -- Sets up the default event loop and registers handlers. -- Loads AP configuration from storage (or uses defaults "Darth Maul"/"MyPassword123"). -- Configures the static IP (default: 192.168.4.1) and starts the DHCP server. +Initializes the Wi-Fi stack in `APSTA` mode: NVS (erase if needed), default event +loop + handlers, AP config load (defaults `Darth Maul` / `MyPassword123`), static +IP and DHCP server. If the loaded config has `enabled == false`, the driver is +initialized but the radio is **not** started. #### `wifi_service_deinit` ```c void wifi_service_deinit(void); ``` -Completely shuts down the Wi-Fi service. -- Stops the Wi-Fi driver. -- Unregisters event handlers. -- Deinitializes the driver. -- Frees synchronization primitives (mutexes) and clears static data. +Fully shuts down the service: stops the driver, unregisters handlers, deinits the +driver, frees mutexes, and clears static state. #### `wifi_service_start` / `wifi_service_stop` ```c void wifi_service_start(void); void wifi_service_stop(void); ``` -Simple wrappers to start or stop the Wi-Fi driver without full deinitialization. `wifi_service_stop` also clears stored scan results. +Start or stop the driver without full deinit. `wifi_service_stop` also clears +stored scan results. + +#### `wifi_service_is_busy` +```c +bool wifi_service_is_busy(void); +``` +Returns `true` while a capture (promiscuous sniffer) is running. + +#### `wifi_service_set_power_save` +```c +void wifi_service_set_power_save(bool deep); +``` +Sets the Wi-Fi modem-sleep depth via `esp_wifi_set_ps`: `deep == true` selects +`WIFI_PS_MAX_MODEM`, otherwise `WIFI_PS_MIN_MODEM`. ### Scanning @@ -239,10 +244,9 @@ Simple wrappers to start or stop the Wi-Fi driver without full deinitialization. ```c void wifi_service_scan(void); ``` -Performs an active Wi-Fi scan. -- Uses a mutex to ensure thread safety. -- Stores up to `WIFI_SCAN_LIST_SIZE` results internally. -- Provides visual feedback via LEDs (Green for AP connection, Red for failures, Blue for scan success). +Performs an active Wi-Fi scan (mutex-guarded, stops channel hopping first). Stores +up to `WIFI_SCAN_LIST_SIZE` results and gives LED feedback (red on failure, blue +on success). #### `wifi_service_get_ap_count` ```c @@ -252,9 +256,9 @@ Returns the number of networks found in the last scan. #### `wifi_service_get_ap_record` ```c -wifi_ap_record_t* wifi_service_get_ap_record(uint16_t index); +wifi_ap_record_t *wifi_service_get_ap_record(uint16_t index); ``` -Retrieves a pointer to a specific scan result record. Returns `NULL` if the index is invalid. +Returns a pointer to a specific scan result, or `NULL` if the index is invalid. ### Connection & Management @@ -262,37 +266,36 @@ Retrieves a pointer to a specific scan result record. Returns `NULL` if the inde ```c esp_err_t wifi_service_connect_to_ap(const char *ssid, const char *password); ``` -Connects the device (as a station) to an external Access Point. -- Configures authentication mode based on the presence of a password (WPA2_PSK or OPEN). -- Disconnects any existing connection before attempting a new one. -- **Persistence:** Automatically saves the SSID and password to `assets/storage/wifi/know_networks.json`. If the network already exists, the password is updated. +Connects (as STA) to an external AP. +- Auth mode chosen by password presence (WPA2_PSK or OPEN). +- Disconnects any existing connection first. +- **Persistence:** saves SSID/password to `WIFI_KNOWN_NETWORKS_FILE`, updating the + password if the network already exists. #### `wifi_service_is_connected` ```c bool wifi_service_is_connected(void); ``` -Returns `true` if the device is currently connected to an external Wi-Fi network and has an IP address. +Returns `true` if connected to an external network and holding an IP. #### `wifi_service_is_active` ```c bool wifi_service_is_active(void); ``` -Returns `true` if the Wi-Fi service is started (driver initialized and interface up). +Returns `true` if the service is started (driver up, interface up). #### `wifi_service_get_connected_ssid` ```c -const char* wifi_service_get_connected_ssid(void); +const char *wifi_service_get_connected_ssid(void); ``` -Returns the SSID of the currently connected network. Returns `NULL` if not connected. +Returns the connected SSID, or `NULL` if not connected. #### `wifi_service_change_to_hotspot` ```c void wifi_service_change_to_hotspot(const char *new_ssid); ``` -Dynamically reconfigures the device's Access Point to an **Open** network with the specified SSID. -- Stops the Wi-Fi driver briefly to apply changes. -- Sets `authmode` to `WIFI_AUTH_OPEN`. -- Restarts Wi-Fi with the new configuration. +Reconfigures the AP to an **Open** network with the given SSID: briefly stops the +driver, sets `authmode` to `WIFI_AUTH_OPEN`, restarts with the new config. ### Promiscuous Mode @@ -300,9 +303,8 @@ Dynamically reconfigures the device's Access Point to an **Open** network with t ```c void wifi_service_promiscuous_start(wifi_promiscuous_cb_t cb, wifi_promiscuous_filter_t *filter); ``` -Enables promiscuous mode (sniffer) with a custom callback and filter. -- `cb`: Function to handle captured packets. -- `filter`: Filter mask (e.g., `WIFI_PROMIS_FILTER_MASK_MGMT`). +Enables promiscuous (sniffer) mode with the given packet callback and filter mask +(e.g. `WIFI_PROMIS_FILTER_MASK_MGMT`; `NULL` for no filter). #### `wifi_service_promiscuous_stop` ```c @@ -316,30 +318,32 @@ Disables promiscuous mode and clears the callback. ```c void wifi_service_start_channel_hopping(void); ``` -Starts a background task that cycles the Wi-Fi interface through channels 1 to 13. -- Useful for promiscuous mode applications (e.g., deauth detection). -- Task memory is allocated in PSRAM if available. +Starts a background task cycling channels 1..13 (250 ms cadence via +`esp_wifi_set_channel`), useful for promiscuous applications (e.g. deauth +detection). Both the task stack and TCB are allocated in **PSRAM** (`SPIRAM`) to +spare internal RAM. #### `wifi_service_stop_channel_hopping` ```c void wifi_service_stop_channel_hopping(void); ``` -Stops the channel hopping task and frees associated memory resources. +Stops the channel-hopping task and frees its resources. ### Configuration Storage #### `wifi_service_save_ap_config` ```c -esp_err_t wifi_service_save_ap_config(const char *ssid, const char *password, uint8_t max_conn, const char *ip_addr, bool enabled); +esp_err_t wifi_service_save_ap_config( + const char *ssid, const char *password, uint8_t max_conn, const char *ip_addr, bool enabled); ``` -Saves the AP configuration to a JSON file (`/assets/config/wifi/wifi_ap.conf`). -- Uses `cJSON` to serialize settings. -- Persists data using the storage API. -- **State Management:** If `enabled` is `true` and Wi-Fi is inactive, it calls `wifi_service_start()`. If `enabled` is `false` and Wi-Fi is active, it calls `wifi_service_stop()`. +Serializes the settings with `cJSON` and writes them to `WIFI_AP_CONFIG_FILE`. +**State management:** if `enabled` is `true` and Wi-Fi is inactive it calls +`wifi_service_start()`; if `enabled` is `false` and Wi-Fi is active it calls +`wifi_service_stop()`. #### Individual Setters -Helper functions to update a single configuration parameter while preserving others. They automatically save the config and trigger state changes if `enabled` is toggled. - +Helpers that update a single parameter while preserving the rest, auto-saving and +triggering state changes when `enabled` toggles. ```c esp_err_t wifi_service_set_enabled(bool enabled); esp_err_t wifi_service_set_ap_ssid(const char *ssid); @@ -348,24 +352,27 @@ esp_err_t wifi_service_set_ap_max_conn(uint8_t max_conn); esp_err_t wifi_service_set_ap_ip(const char *ip_addr); ``` -**Internal Loader:** `wifi_service_load_ap_config` is called during initialization to read these settings. If `enabled` is found to be `false` in the config, `wifi_service_init` will initialize the driver but **not** start the radio. +**Internal loader:** an internal `load_ap_config` runs during init. If `enabled` +is `false` in the config, `wifi_service_init` brings the driver up but does **not** +start the radio. ## Internal Implementation Details ### Event Handling -A static `wifi_event_handler` manages Wi-Fi and IP events: -- **WIFI_EVENT_AP_STACONNECTED:** Logs the MAC of the connected station and blinks Green. -- **WIFI_EVENT_AP_STADISCONNECTED:** Blinks Red. -- **IP_EVENT_AP_STAIPASSIGNED:** Logs IP assignment and blinks Green. +A static `event_handler` (registered for `WIFI_EVENT` and `IP_EVENT`) manages +station connect/disconnect and IP-assignment events, logging and driving LED +feedback (green on connect / IP, red on disconnect). ### Thread Safety -A `wifi_mutex` (Semaphore) is used to protect the scanning process (`wifi_service_scan`), preventing concurrent scan requests which could lead to resource conflicts. +A mutex protects the scan path (`wifi_service_scan`) against concurrent scan +requests. ### Channel Hopping Task -The channel hopping feature runs as a static FreeRTOS task. It uses `esp_wifi_set_channel` to switch channels every 250ms. To optimize internal RAM usage, both the task stack and the Task Control Block (TCB) are allocated in **PSRAM** using the `SPIRAM` capability. - -### Castings & Memory Management -- **cJSON:** Used extensively for parsing and generating configuration files. -- **PSRAM Allocation:** Critical tasks and large buffers are allocated in PSRAM to preserve internal memory. -- **Type Casting:** `event_data` is cast to specific event structures (e.g., `wifi_event_ap_staconnected_t*`) within handlers. -- **String Handling:** `strncpy` is used safely with explicit null-termination to prevent buffer overflows when handling SSIDs and passwords. +Runs as a static FreeRTOS task; stack and TCB are placed in **PSRAM** (`SPIRAM`) +to preserve internal RAM. + +### Memory & String Handling +`cJSON` is used for config parse/serialize; SSIDs/passwords are copied with +`strncpy` plus explicit NUL-termination. + + From 054da1aabdc6842775b61e25813bd25d14dd09dd Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:35 -0300 Subject: [PATCH 068/103] docs(bluetooth): document sniffer, tracker and connect APIs --- docs/bluetooth/README.md | 39 +++++++++++++++++++++++++++++++++++++++ 1 file changed, 39 insertions(+) diff --git a/docs/bluetooth/README.md b/docs/bluetooth/README.md index 249e7f91c..3ae42d66f 100644 --- a/docs/bluetooth/README.md +++ b/docs/bluetooth/README.md @@ -59,6 +59,37 @@ Performs a blocking discovery procedure for the specified duration. Results are - `bluetooth_service_get_scan_count()`: Returns the number of unique devices found. - `bluetooth_service_get_scan_result(uint16_t index)`: Returns a pointer to a `bluetooth_service_scan_result_t` structure containing name, RSSI, and MAC address. +### Sniffer & Tracker + +#### `bluetooth_service_start_sniffer` +```c +typedef void (*bluetooth_service_sniffer_cb_t)( + const uint8_t *addr, uint8_t addr_type, int rssi, const uint8_t *data, uint16_t len); + +esp_err_t bluetooth_service_start_sniffer(bluetooth_service_sniffer_cb_t cb); +``` +Starts a passive BLE sniffer (raw advertisement capture). `cb` is invoked for each received advertisement with the advertiser address, address type, RSSI, and the raw advertisement bytes. + +#### `bluetooth_service_stop_sniffer` +```c +void bluetooth_service_stop_sniffer(void); +``` +Stops the BLE sniffer. + +#### `bluetooth_service_start_tracker` +```c +typedef void (*bluetooth_service_tracker_cb_t)(int rssi); + +esp_err_t bluetooth_service_start_tracker(const uint8_t *addr, bluetooth_service_tracker_cb_t cb); +``` +Starts RSSI tracking for a specific BLE device (6-byte `addr`). `cb` is invoked with the RSSI of the tracked device on each update. + +#### `bluetooth_service_stop_tracker` +```c +void bluetooth_service_stop_tracker(void); +``` +Stops the RSSI tracker. + ### Advertising Management #### `bluetooth_service_start_advertising` / `stop_advertising` @@ -66,6 +97,14 @@ Standard connectable advertising using the configured device name. Advertising a ### Connection Management +#### `bluetooth_service_connect` +```c +esp_err_t bluetooth_service_connect(const uint8_t *addr, + uint8_t addr_type, + int (*cb)(struct ble_gap_event *event, void *arg)); +``` +Initiates a BLE connection to a remote device. `addr` is the 6-byte target address, `addr_type` its address type, and `cb` a GAP event callback that receives connection events for this link. + #### `bluetooth_service_disconnect_all` ```c void bluetooth_service_disconnect_all(void); From 3cf8dea408cde74f3ddb117a42b572804b9df9df Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:35 -0300 Subject: [PATCH 069/103] docs(tusb_desc): document HID+CDC+MSC composite and runtime MSC exposure --- docs/tusb_desc/README.md | 67 ++++++++++++++++++++++++++++++++++------ 1 file changed, 58 insertions(+), 9 deletions(-) diff --git a/docs/tusb_desc/README.md b/docs/tusb_desc/README.md index 580cd0735..cc8918e46 100644 --- a/docs/tusb_desc/README.md +++ b/docs/tusb_desc/README.md @@ -1,6 +1,6 @@ -# TinyUSB Descriptors (HID Composite) +# TinyUSB Descriptors (HID + CDC + optional MSC Composite) -This component defines the USB descriptors required to enumerate the ESP32-P4 as a USB HID Composite Device (Keyboard + Mouse) and provides the initialization routine for the TinyUSB driver. +This component defines the USB descriptors required to enumerate the ESP32-P4 as a USB composite device and provides the initialization routine for the TinyUSB driver. The composite is HID (Keyboard + Mouse, for BadUSB) plus a CDC-ACM interface (the companion host link), with an optional mass-storage (MSC) interface exposed only while the SD card is handed to the host. ## Overview @@ -15,20 +15,39 @@ This component defines the USB descriptors required to enumerate the ESP32-P4 as | Field | Value | |-------|-------| -| USB Version | 2.0 | +| USB Version | 2.0 (`bcdUSB` `0x0200`) | | Vendor ID | `0xCAFE` | | Product ID | `0x4001` | -| Device Class | Defined at interface level | +| Device Class | Miscellaneous / Common / IAD (`TUSB_CLASS_MISC`) - required so the host groups the CDC interfaces | | Configurations | 1 | ### Configuration Descriptor +The config is runtime-selected. `tud_descriptor_configuration_cb` picks a variant +by both link speed and whether MSC is currently exposed, all built from a single +`HID_CDC_BLOCK` macro (optionally followed by an `MSC_INTERFACE`). + | Field | Value | |-------|-------| -| Interfaces | 1 (HID) | +| Interfaces | 3 (HID + CDC comm + CDC data), or 4 with MSC (`TUSB_DESC_ITF_NUM_TOTAL`) | | Max Power | 100 mA | | Attributes | Remote Wakeup | +The CDC bulk (data) endpoint size is speed-dependent: USB requires exactly 512 +bytes at High Speed and 64 at Full Speed. The P4 USB is High Speed, but two +descriptor variants are built per mode (HS/FS) and the matching one is served so +`tu_edpt_validate` accepts the config. A wrong size fails `SET_CONFIGURATION`, +which would also take the HID keyboard down. + +### Interfaces and Endpoints + +| Interface | Number | Endpoint(s) | +|-----------|--------|-------------| +| HID (keyboard + mouse) | 0 | IN `0x81` | +| CDC-ACM comm | 1 | notification IN `0x82` | +| CDC-ACM data | 2 | OUT `0x03`, IN `0x83` | +| MSC (optional) | 3 | OUT `0x04`, IN `0x84` | + ### HID Report Descriptor Single HID interface with two reports using Report IDs: @@ -46,6 +65,8 @@ Single HID interface with two reports using Report IDs: | 1 | Manufacturer: "HighCode" | | 2 | Product: "BadUSB Device" | | 3 | Serial: "123456" | +| 4 | CDC interface: "TentacleOS Companion" | +| 5 | MSC interface: "TentacleOS SD" (only present when MSC is compiled in) | ## API Reference @@ -60,7 +81,30 @@ Initializes the TinyUSB driver with the defined descriptors. Must be called before any HID report transmission. It does **not** touch the USB-C data mux (see below) - installing the driver and routing the connector are -separate steps. +separate steps. The HID (BadUSB) and CDC (companion) sides share one TinyUSB +install: whichever calls first brings the composite up, later calls are no-ops. + +### `busb_set_msc_exposed` +```c +void busb_set_msc_exposed(bool exposed); +``` +Advertises (or hides) the mass-storage interface on the composite at runtime. + +MSC is off by default, so plain native-USB bring-ups enumerate as HID + CDC only. +`tud_descriptor_configuration_cb` reads `s_msc_exposed` at request time and serves +the 4-interface (MSC) config variant only while the flag is set. Behavior: + +- If TinyUSB is not up yet, the call just latches the flag so the first + enumeration advertises the right layout. +- If it is already up, the device detaches (`tud_disconnect`), waits + `BUSB_REENUM_DELAY_MS` (100 ms) so the host notices, swaps the advertised + config, and re-attaches (`tud_connect`) so the host re-reads the descriptor. + +**Rationale:** an MSC LUN that is advertised but not backed by an initialized +storage handle crashes the TinyUSB task on the host's first SCSI command. MSC is +therefore exposed only while the SD is actually handed to the host (mass-storage +mode) and hidden again on exit. Only compiled in when `CFG_TUD_MSC` is set; a +no-op otherwise. ### `usb_mux_init` ```c @@ -115,9 +159,14 @@ The component implements the required TinyUSB callbacks to serve descriptors to | Callback | Purpose | |----------|---------| -| `tud_descriptor_device_cb` | Returns the device descriptor | -| `tud_descriptor_configuration_cb` | Returns the configuration descriptor | -| `tud_descriptor_string_cb` | Returns string descriptors (manufacturer, product, serial) | +| `tud_descriptor_device_cb` | Returns the composite device descriptor | +| `tud_descriptor_configuration_cb` | Returns the configuration descriptor, selecting the variant by link speed (HS/FS) and whether MSC is currently exposed | +| `tud_descriptor_string_cb` | Returns string descriptors (manufacturer, product, serial, CDC, MSC) | | `tud_hid_descriptor_report_cb` | Returns the HID report descriptor | | `tud_hid_get_report_cb` | Handles GET_REPORT requests (stub) | | `tud_hid_set_report_cb` | Handles SET_REPORT requests (stub) | + +The CDC-ACM and MSC class callbacks are not implemented here: they live in the +components that own those interfaces (the companion host link for CDC, and the +SD/mass-storage feature for MSC). This component only defines the shared +descriptors and the descriptor-serving callbacks above. From 8f15d99607c922ea466f5eb61964f1af7c4e42e7 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:35 -0300 Subject: [PATCH 070/103] docs(bad_usb): document SUPER alias, HID-ready pacing and full ABNT2 coverage --- docs/bad_usb/README.md | 41 ++++++++++++++++++++++++++++++----------- 1 file changed, 30 insertions(+), 11 deletions(-) diff --git a/docs/bad_usb/README.md b/docs/bad_usb/README.md index b89fc7086..c4a58fc9a 100644 --- a/docs/bad_usb/README.md +++ b/docs/bad_usb/README.md @@ -51,26 +51,29 @@ This component implements a modular HID injection tool capable of emulating keyb esp_err_t bad_usb_init(void); esp_err_t bad_usb_deinit(void); void bad_usb_wait_for_connection(void); +bool bad_usb_wait_for_connection_ex(bad_usb_abort_cb_t should_abort); ``` -- `bad_usb_init` initializes TinyUSB and registers USB HID callbacks into the HAL. +- `bad_usb_init` initializes TinyUSB (via `busb_init`) and registers USB HID callbacks (keyboard, mouse, wait, report-ready) into the HAL. - `bad_usb_deinit` unregisters callbacks and uninstalls the TinyUSB driver. -- `bad_usb_wait_for_connection` blocks until the USB host mounts the device, then waits 2 seconds for enumeration. +- `bad_usb_wait_for_connection` blocks until the USB host mounts the device, then waits 2 seconds (`USB_SETTLE_DELAY_MS`) for the host OS to enumerate. +- `bad_usb_wait_for_connection_ex` is the abortable variant. It polls `tud_mounted()` with an **8 second mount timeout** (`USB_MOUNT_TIMEOUT_MS`), calling `should_abort` (a `bad_usb_abort_cb_t`) between polls and during the post-mount settle. It returns `true` if the host mounted and settled, `false` if the timeout elapsed or the abort predicate fired. `bad_usb_wait_for_connection` is just `_ex(NULL)`, which never times out on the abort path but still stops after the mount timeout. Use `_ex` so a run waiting for a host that never arrives can be cancelled. ### HID HAL (`hid_hal.h`) ```c void hid_hal_register_callback(hid_send_cb_t send_cb, hid_mouse_cb_t mouse_cb, - hid_wait_cb_t wait_cb); + hid_wait_cb_t wait_cb, + hid_ready_cb_t ready_cb); void hid_hal_press_key(uint8_t keycode, uint8_t modifiers); void hid_hal_mouse_move(int8_t x, int8_t y); void hid_hal_mouse_click(uint8_t buttons); void hid_hal_mouse_scroll(int8_t wheel); void hid_hal_wait_for_connection(void); ``` -- `hid_hal_press_key` sends a key-down + key-up report with ~5 ms per phase. -- Mouse functions use ~2 ms delay for moves and ~5 ms for clicks. -- All functions yield to the scheduler (`vTaskDelay(0)`) to prevent WDT starvation. +- Reports are paced by a report-readiness callback (`ready_cb`), not fixed delays. Before and after each report the HAL calls `wait_report_ready`, which spins on `tud_hid_ready()` (yielding with `vTaskDelay(1)` between checks) until the previous report has been delivered to the host, so an unpolled report is never overwritten (which would drop keys). This paces output to the host's ~1 ms poll rate. +- The wait is capped by `REPORT_READY_TIMEOUT_MS` (1000 ms): it must exceed how long a busy host/editor can stall HID polling, so only a real disconnect hits it. Raising it to 1 s is what keeps keys (e.g. a leading `HOME`) from being dropped when the host stalls. +- If no `ready_cb` is registered, the HAL falls back to fixed `ets_delay_us` delays (`FALLBACK_KEY_DELAY_US` = 5000 us for keys, `FALLBACK_MOUSE_DELAY_US` = 2000 us for mouse). ### Keyboard Layouts (`hid_layouts.h`) @@ -79,7 +82,12 @@ void hid_layouts_type_string_us(const char *str); void hid_layouts_type_string_abnt2(const char *str); ``` - `hid_layouts_type_string_us` maps ASCII characters to US keyboard HID keycodes. -- `hid_layouts_type_string_abnt2` handles Brazilian Portuguese layout including UTF-8 dead-key sequences for accented characters (e.g. a, e, c, a, o). +- `hid_layouts_type_string_abnt2` types the Brazilian Portuguese (ABNT2) layout with full accented-character coverage, not just a few dead-key accents. It decodes UTF-8 two-byte sequences via a lookup table (`ABNT2_UTF8_MAP`) that covers: + - Accented vowels **a e i o u**, lowercase and uppercase, in all five diacritics: acute, grave, circumflex, tilde, and diaeresis (each emitted as the ABNT2 dead key + base letter, with Shift for uppercase). + - **c-cedilha** (c) and **n-tilde** (n), both lowercase and uppercase. + - AltGr (RightAlt) symbols: cent, pound, section, not-sign, and superscripts 1 / 2 / 3. + - Bracket/brace/backslash/pipe (`[ ] { } \ |`) via RightAlt (with Shift for the brace/pipe forms). + - The symbols that a naive US mapping gets wrong on ABNT2 hardware are fixed: `^` and `~` are typed as dead key + space to emit the literal, and `<` / `>` use the correct ABNT2 keys. Apostrophe / double-quote / backtick are also remapped to their ABNT2 positions. ### DuckyScript Parser (`ducky_parser.h`) @@ -106,18 +114,20 @@ void ducky_abort(void); | `DELAY` | [ms] | Pause execution for N milliseconds | | `STRING` | [text] | Type text using the active keyboard layout | | `ENTER` / `RETURN` | - | Press Enter | -| `GUI` / `WINDOWS` / `COMMAND` | [key] | Windows/Command key (optionally with a key) | +| `GUI` / `WINDOWS` / `SUPER` / `COMMAND` | [key] | GUI (Windows/Command/Super) modifier, optionally with a key | | `CTRL` / `CONTROL` | [key] | Control + key | | `SHIFT` | [key] | Shift + key | | `ALT` | [key] | Alt + key | | `TAB` | - | Tab key | | `ESC` / `ESCAPE` | - | Escape key | +| `SPACE` | - | Space bar | +| `BACKSPACE` | - | Backspace | | `F1` - `F12` | - | Function keys | -| `UP` / `DOWN` / `LEFT` / `RIGHT` | - | Arrow keys | +| `UP` / `DOWN` / `LEFT` / `RIGHT` (and `UPARROW` / `DOWNARROW` / `LEFTARROW` / `RIGHTARROW`) | - | Arrow keys | | `HOME` / `END` / `INSERT` / `DELETE` | - | Navigation keys | | `PAGEUP` / `PAGEDOWN` | - | Page navigation | | `CAPSLOCK` / `NUMLOCK` / `SCROLLLOCK` | - | Lock keys | -| `PRINTSCREEN` / `PAUSE` / `APP` / `MENU` | - | Special system keys | +| `PRINTSCREEN` / `PAUSE` / `APP` / `MENU` | - | Special system keys (`APP` and `MENU` both map to the Application key) | | `MOUSE_MOVE` | [x] [y] | Move mouse relative (-127 to 127) | | `MOUSE_CLICK` / `LCLICK` | - | Left mouse click | | `MOUSE_RIGHT_CLICK` / `RCLICK` | - | Right mouse click | @@ -130,5 +140,14 @@ Modifier keys can be combined: `CTRL SHIFT ESC`, `GUI r`, `ALT F4`. | Layout | Enum | Notes | |--------|------|-------| | US (QWERTY) | `DUCKY_LAYOUT_US` | Default. Standard ASCII mapping. | -| ABNT2 (Brazil) | `DUCKY_LAYOUT_ABNT2` | Dead-key accent support, remapped punctuation. | +| ABNT2 (Brazil) | `DUCKY_LAYOUT_ABNT2` | Full accented-character coverage (see the layouts API above), remapped punctuation, AltGr symbols. | + +## Payload Sources + +Scripts run either from the internal flash asset partition (`ducky_run_from_assets`) or from the SD card (`ducky_run_from_sdcard`, max 8 KB per script). In the UI menu, SD payloads are scanned **recursively across subfolders** and listed together in a single view, so scripts organised into folders on the card are all discoverable. + +Example payloads ship in the asset partition under `firmware_p4/assets/storage/bad_usb_scripts/`: + +- `rickroll.txt` +- `amiga.txt` From c14f72ba248d46d51c5ea22fabc2ec0e656f9116 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:35 -0300 Subject: [PATCH 071/103] docs(console): document all registered commands --- docs/console/README.md | 75 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 72 insertions(+), 3 deletions(-) diff --git a/docs/console/README.md b/docs/console/README.md index 25203d31b..4afffafa6 100644 --- a/docs/console/README.md +++ b/docs/console/README.md @@ -21,10 +21,14 @@ The prompt `highboy>` indicates the system is ready. | Command | Description | Usage | | :--- | :--- | :--- | | `help` | Lists all available commands. | `help [command]` | -| `free` | Displays available internal and PSRAM memory. | `free` | -| `tasks` | Lists running FreeRTOS tasks and stack usage. | `tasks` | +| `free` | Displays free internal and PSRAM (SPIRAM) memory, current and minimum. | `free` | +| `tasks` | Lists running FreeRTOS tasks (state, priority, stack high-water, num). | `tasks` | +| `stack` | Stack budget report: allocated vs high-water free per task, with reclaim/low flags. | `stack` | +| `date` | Shows the UTC wall-clock (with sync state and source), or sets it. | `date [ ]` | +| `ip` | Shows current network interfaces (IP, Mask, GW, MAC) for STA and AP. | `ip` | | `restart` | Reboots the system. | `restart` | -| `ip` | Shows current network interfaces (IP, Mask, GW, MAC). | `ip` | +| `firstboot` | Clears the first-boot onboarding + screen-tips flags so they run on the next reset. | `firstboot` | +| `capprep` | Skips onboarding (wizard + tips) and restarts clean, for screen capture. | `capprep` | ### File System Commands @@ -55,6 +59,71 @@ The `wifi` command is a wrapper for all wireless functions. | `portscan`| Scans TCP/UDP ports on target. | `-i `: Target IP
`-min`: Start Port
`-max`: End Port | `wifi portscan -i 192.168.1.1` | | `status` | Shows active attacks and state. | None | `wifi status` | +### BadUSB Commands (`badusb`) + +HID injection via DuckyScript. Hint: `badusb ...`. + +| Subcommand | Description | Arguments | Example | +| :--- | :--- | :--- | :--- | +| `run` | Runs a DuckyScript. | `-a `: internal asset (under `bad_usb_scripts/`)
`-f `: script from SD card | `badusb run -a rickroll.txt` | +| `type` | Types a literal string over HID. | `` | `badusb type hello world` | +| `layout` | Sets the keyboard layout. | `` | `badusb layout abnt2` | +| `stop` | Aborts the running script (stops at the next line). | None | `badusb stop` | +| `status` | Shows whether the USB host has mounted the device. | None | `badusb status` | + +### Host Link Commands (`hostlink`) + +Companion (BLE) host-link pairing and status. + +| Subcommand | Description | Arguments | Example | +| :--- | :--- | :--- | :--- | +| `psk` | Shows the pairing PSK to provision the companion app. | None | `hostlink psk` | +| `regen` | Generates a new PSK (invalidates existing pairings), then prints it. | None | `hostlink regen` | +| `ble` | Turns companion BLE advertising on/off. | `` | `hostlink ble on` | +| `status` | Shows the companion session (authenticated) and BLE connection state. | None | `hostlink status` | + +### C5 Co-processor Commands (`c5`) + +Manages the C5 radio co-processor over the SPI bridge (and UART for recovery). + +| Subcommand | Description | Example | +| :--- | :--- | :--- | +| `ota ` | Pushes the C5 image; control on SPI, image bytes over SPI (default) or UART. | `c5 ota spi` | +| `ping` | Pings the running C5 over the SPI bridge. | `c5 ping` | +| `info` | Reads the C5 chip info over the SPI bridge. | `c5 info` | +| `sync` | Re-probes and reconnects the bridge (e.g. after a C5 reboot). | `c5 sync` | +| `download` | Asks the running C5 to enter ROM download mode (over SPI). | `c5 download` | +| `rom` | Serial-flashes a C5 already in download mode (recovery). | `c5 rom` | +| `passthrough` | Bridges host `esptool` to the C5 (never returns; reboot/BACK exits). | `c5 passthrough` | +| `release` | Tri-states the C5 UART lines for an external programmer. | `c5 release` | + +### Infrared Commands (`ir`) + +RMT-backed IR receive/transmit. The `rx`/`send` channels are brought up on demand and released after each operation; `flash` stays on until turned off. + +| Subcommand | Description | Arguments | Example | +| :--- | :--- | :--- | :--- | +| `rx` | Waits for one IR frame and decodes it. | `[timeout_ms]` (default 5000) | `ir rx 10000` | +| `send` | Transmits a code (address/command accept `0x` hex). | ` [repeat]` | `ir send NEC 0x00 0x45` | +| `flash` | Drives the IR emitter at full power (torch) / off. | `` | `ir flash on` | + +### Hardware / Diagnostics + +| Command | Description | Usage | +| :--- | :--- | :--- | +| `battery` | Shows battery/charger (BQ25896) status: SoC (raw + smoothed), voltage, charge state, VBUS source and limits, faults. | `battery` | +| `i2cscan` | Scans the I2C bus (`0x08`-`0x77`) and lists responding addresses. | `i2cscan` | + +### UI / Screen Commands + +Debug/capture helpers registered as top-level commands (from the screen command group). Used for automated screenshotting and UI navigation. + +| Command | Description | Usage | +| :--- | :--- | :--- | +| `goto` | Switches the UI to a screen by enum id. | `goto ` (1..`SCREEN_COUNT`-1) | +| `key` | Injects a simulated button press. | `key [-t ]`
idx: 0=UP 1=DOWN 2=LEFT 3=RIGHT 4=OK 5=BACK; hold default 120 ms | +| `screenshot` | Captures the active screen as base64 RGB565 strips. | `screenshot [id]` (optionally switch to `id` first) | + ## Developing New Commands To add a new command to the console, follow these steps: From a54dc234f49c0eda948eebe2c348e7f1416d8dd7 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:48 -0300 Subject: [PATCH 072/103] docs(storage): fix partition layout and add USB MSC, VFS raw handoff and atomic writes --- docs/storage_api/README.md | 32 +++++++++ docs/storage_assets/README.md | 120 ++++++++++++++++++++++++++-------- docs/storage_vfs/README.md | 71 ++++++++++++++++++++ 3 files changed, 195 insertions(+), 28 deletions(-) diff --git a/docs/storage_api/README.md b/docs/storage_api/README.md index 4bfe5897d..d7a77c689 100644 --- a/docs/storage_api/README.md +++ b/docs/storage_api/README.md @@ -291,6 +291,38 @@ storage_append_csv_row("/data/sensors.csv", row, 3); --- +## Atomic Writes + +Header: `storage_atomic.h` + +For config files where a crash mid-write must never leave a half-written file, +use the atomic replace. It writes to `.tmp`, flushes and fsyncs it, then +renames it over the destination. On FAT (where rename cannot replace an existing +target) it unlinks the target first and retries. The original file is untouched +on any failure before the rename, and if power is lost between the unlink and the +rename the complete `.tmp` survives for the loader to recover. Works on both +FAT (SD) and LittleFS (flash) mounts. + +```c +#include "storage_atomic.h" + +esp_err_t storage_write_atomic(const char *path, const void *data, size_t len); +``` + +| Return | Meaning | +|--------|---------| +| `ESP_OK` | File replaced atomically | +| `ESP_ERR_INVALID_ARG` | Bad arguments (`path` NULL, or `data` NULL with non-zero `len`) | +| `ESP_ERR_INVALID_SIZE` | The temp path does not fit | +| `ESP_FAIL` | I/O failure (destination preserved unless recovery applies) | + +```c +// Replace a config file so a crash never leaves it half-written +storage_write_atomic(TOS_PATH_CONFIG_SYSTEM, json, strlen(json)); +``` + +--- + ## Stream I/O Header: `storage_stream.h` diff --git a/docs/storage_assets/README.md b/docs/storage_assets/README.md index 0d84294fc..66d3b9bef 100644 --- a/docs/storage_assets/README.md +++ b/docs/storage_assets/README.md @@ -32,20 +32,52 @@ This component provides read-only access to a dedicated LittleFS partition for s ### Partition Table -The assets partition must be defined in your partition table (`partitions.csv`): +The assets partition is defined in the firmware partition table +(`firmware_p4/partitions.csv` and `firmware_c5/partitions.csv`). The layout is +OTA-based: there is no `factory` app partition and no separate `storage` data +partition. Two app slots (`ota_0` / `ota_1`) hold the A/B firmware images, a +`coredump` partition captures crash dumps, and `assets` is a read-only LittleFS +image. The P4 and C5 differ in slot sizes and ordering. + +**P4 (`firmware_p4/partitions.csv`):** ```csv -# Name, Type, SubType, Offset, Size, Flags -nvs, data, nvs, 0x9000, 0x6000, -phy_init, data, phy, 0xf000, 0x1000, -factory, app, factory, 0x10000, 1M, -assets, data, spiffs, 0x110000, 512K, -storage, data, spiffs, 0x190000, 1M, +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 24K, +otadata, data, ota, 0xf000, 8K, +phy_init, data, phy, 0x11000, 4K, +ota_0, app, ota_0, 0x20000, 0x270000, +ota_1, app, ota_1, 0x290000, 0x270000, +coredump, data, coredump, 0x500000, 64K, +assets, data, littlefs, 0x510000, 0x2E0000, ``` +`assets` is `0x2E0000` bytes (~2.9 MB) at offset `0x510000`. + +**C5 (`firmware_c5/partitions.csv`):** + +```csv +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 24K, +otadata, data, ota, 0xf000, 8K, +phy_init, data, phy, 0x11000, 4K, +ota_0, app, ota_0, 0x20000, 2M, +ota_1, app, ota_1, 0x220000, 2M, +assets, data, littlefs, 0x420000, 0x1E0000, +coredump, data, coredump, 0x600000, 64K, +``` + +`assets` is `0x1E0000` bytes (~1.9 MB) at offset `0x420000`. Note the ordering +differs from the P4: on the C5, `assets` comes before `coredump`. + **Important Notes:** -- The SubType must be `spiffs` (even though we use LittleFS - this is an ESP-IDF quirk). -- Size should be sufficient for all your assets (adjust as needed). +- The SubType is `littlefs` (the image is mounted with esp_littlefs). This + project uses the native `littlefs` subtype, not the older `spiffs`-subtype + workaround. +- A `coredump` partition (64K) is reserved for crash dumps; it is separate from + the assets and app storage. +- There is no `factory` app partition and no separate `storage` data partition; + firmware lives in the `ota_0` / `ota_1` slots. - The partition must be flashed before use. ### Constants @@ -102,7 +134,7 @@ void app_main(void) { ``` I (1234) storage_assets: Initializing LittleFS for assets partition I (1245) storage_assets: Assets ready at /assets -I (1246) storage_assets: Partition size: 524288 bytes, used: 12345 bytes +I (1246) storage_assets: Partition size: 3014656 bytes, used: 12345 bytes I (1247) storage_assets: === Files in assets partition === I (1248) storage_assets: [1] logo.bin (1200 bytes) I (1249) storage_assets: [DIR] fonts/ @@ -304,10 +336,10 @@ Prints detailed information about the assets partition to the console. I (1234) storage_assets: === Assets Partition Info === I (1235) storage_assets: Mount point: /assets I (1236) storage_assets: Partition: assets -I (1237) storage_assets: Total size: 524288 bytes (512.00 KB) +I (1237) storage_assets: Total size: 3014656 bytes (2944.00 KB) I (1238) storage_assets: Used: 98765 bytes (96.45 KB) -I (1239) storage_assets: Free: 425523 bytes (415.55 KB) -I (1240) storage_assets: Usage: 18.8% +I (1239) storage_assets: Free: 2915891 bytes (2847.55 KB) +I (1240) storage_assets: Usage: 3.3% ``` **Usage:** @@ -548,7 +580,7 @@ project/ **Solution:** 1. Add partition to `partitions.csv`: ```csv - assets, data, spiffs, 0x110000, 512K, + assets, data, littlefs, 0x510000, 0x2E0000, ``` 2. Set partition table in `sdkconfig`: ``` @@ -655,20 +687,52 @@ This component provides read-only access to a dedicated LittleFS partition for s ### Partition Table -The assets partition must be defined in your partition table (`partitions.csv`): +The assets partition is defined in the firmware partition table +(`firmware_p4/partitions.csv` and `firmware_c5/partitions.csv`). The layout is +OTA-based: there is no `factory` app partition and no separate `storage` data +partition. Two app slots (`ota_0` / `ota_1`) hold the A/B firmware images, a +`coredump` partition captures crash dumps, and `assets` is a read-only LittleFS +image. The P4 and C5 differ in slot sizes and ordering. + +**P4 (`firmware_p4/partitions.csv`):** ```csv -# Name, Type, SubType, Offset, Size, Flags -nvs, data, nvs, 0x9000, 0x6000, -phy_init, data, phy, 0xf000, 0x1000, -factory, app, factory, 0x10000, 1M, -assets, data, spiffs, 0x110000, 512K, -storage, data, spiffs, 0x190000, 1M, +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 24K, +otadata, data, ota, 0xf000, 8K, +phy_init, data, phy, 0x11000, 4K, +ota_0, app, ota_0, 0x20000, 0x270000, +ota_1, app, ota_1, 0x290000, 0x270000, +coredump, data, coredump, 0x500000, 64K, +assets, data, littlefs, 0x510000, 0x2E0000, ``` +`assets` is `0x2E0000` bytes (~2.9 MB) at offset `0x510000`. + +**C5 (`firmware_c5/partitions.csv`):** + +```csv +# Name, Type, SubType, Offset, Size, Flags +nvs, data, nvs, 0x9000, 24K, +otadata, data, ota, 0xf000, 8K, +phy_init, data, phy, 0x11000, 4K, +ota_0, app, ota_0, 0x20000, 2M, +ota_1, app, ota_1, 0x220000, 2M, +assets, data, littlefs, 0x420000, 0x1E0000, +coredump, data, coredump, 0x600000, 64K, +``` + +`assets` is `0x1E0000` bytes (~1.9 MB) at offset `0x420000`. Note the ordering +differs from the P4: on the C5, `assets` comes before `coredump`. + **Important Notes:** -- The SubType must be `spiffs` (even though we use LittleFS - this is an ESP-IDF quirk). -- Size should be sufficient for all your assets (adjust as needed). +- The SubType is `littlefs` (the image is mounted with esp_littlefs). This + project uses the native `littlefs` subtype, not the older `spiffs`-subtype + workaround. +- A `coredump` partition (64K) is reserved for crash dumps; it is separate from + the assets and app storage. +- There is no `factory` app partition and no separate `storage` data partition; + firmware lives in the `ota_0` / `ota_1` slots. - The partition must be flashed before use. ### Constants @@ -725,7 +789,7 @@ void app_main(void) { ``` I (1234) storage_assets: Initializing LittleFS for assets partition I (1245) storage_assets: Assets ready at /assets -I (1246) storage_assets: Partition size: 524288 bytes, used: 12345 bytes +I (1246) storage_assets: Partition size: 3014656 bytes, used: 12345 bytes I (1247) storage_assets: === Files in assets partition === I (1248) storage_assets: [1] logo.bin (1200 bytes) I (1249) storage_assets: [DIR] fonts/ @@ -927,10 +991,10 @@ Prints detailed information about the assets partition to the console. I (1234) storage_assets: === Assets Partition Info === I (1235) storage_assets: Mount point: /assets I (1236) storage_assets: Partition: assets -I (1237) storage_assets: Total size: 524288 bytes (512.00 KB) +I (1237) storage_assets: Total size: 3014656 bytes (2944.00 KB) I (1238) storage_assets: Used: 98765 bytes (96.45 KB) -I (1239) storage_assets: Free: 425523 bytes (415.55 KB) -I (1240) storage_assets: Usage: 18.8% +I (1239) storage_assets: Free: 2915891 bytes (2847.55 KB) +I (1240) storage_assets: Usage: 3.3% ``` **Usage:** @@ -1171,7 +1235,7 @@ project/ **Solution:** 1. Add partition to `partitions.csv`: ```csv - assets, data, spiffs, 0x110000, 512K, + assets, data, littlefs, 0x510000, 0x2E0000, ``` 2. Set partition table in `sdkconfig`: ``` diff --git a/docs/storage_vfs/README.md b/docs/storage_vfs/README.md index 68faedef5..401b17ab3 100644 --- a/docs/storage_vfs/README.md +++ b/docs/storage_vfs/README.md @@ -504,7 +504,14 @@ esp_err_t vfs_sdcard_init(void); esp_err_t vfs_sdcard_deinit(void); bool vfs_sdcard_is_mounted(void); void vfs_sdcard_print_info(void); +bool vfs_sdcard_get_name(char *out, size_t n); esp_err_t vfs_sdcard_format(void); +esp_err_t vfs_register_sd_backend(void); +esp_err_t vfs_unregister_sd_backend(void); + +// Raw handoff for USB Mass Storage (see "USB Mass Storage (MSC)" below) +esp_err_t vfs_sdcard_detach_for_msc(void **out_card); +esp_err_t vfs_sdcard_reattach_after_msc(void *card); ``` ### LittleFS Backend @@ -521,6 +528,70 @@ esp_err_t vfs_littlefs_format(void); --- +## USB Mass Storage (MSC) + +> P4 only. The MSC path lives in `storage_vfs` +> (`usb_msc.c` / `vfs_sdcard.c`, headers `include/usb_msc.h` and +> `include/vfs_sdcard.h`). The C5 has no USB connector or SD card and does not +> build these. + +USB Mass Storage mode exposes the microSD directly to a host PC as a USB drive. +Because a host filesystem and the firmware's FAT mount cannot own the card at +the same time, entering MSC hands the raw block device over to the USB stack and +tears down the app's `/sdcard` mount; leaving MSC does the reverse and resumes +normal operation **without a reboot** (it only reboots if the remount fails). + +### Control API (`usb_msc.h`) + +```c +#include "usb_msc.h" + +typedef enum { + USB_MSC_IDLE = 0, // Not in USB-storage mode + USB_MSC_ENTERING, // Detaching SD / bringing USB up + USB_MSC_ACTIVE, // SD exposed to the host as a USB drive + USB_MSC_ERROR, // Could not enter (SD restored, safe to leave) + USB_MSC_EXITING, // Tearing down / remounting SD +} usb_msc_state_t; + +usb_msc_state_t usb_msc_get_state(void); // poll from the UI +bool usb_msc_host_connected(void); // true while the host has it mounted +void usb_msc_enter(void); // blocking - run on a worker task +void usb_msc_exit(void); // blocking - run on a worker task +``` + +- `usb_msc_enter()` detaches the app's `/sdcard` FAT, exposes the raw card to the + host, and switches the USB mux to native. On failure the SD is restored and the + state goes to `USB_MSC_ERROR`. +- `usb_msc_exit()` stops exposing the card, remounts `/sdcard`, and routes the USB + connector back to the UART bridge. It resumes without a reboot; only a failed + remount forces a reboot to recover. +- Both `usb_msc_enter()` and `usb_msc_exit()` are **blocking** - never call them + from the LVGL thread; drive them from a worker task and poll `usb_msc_get_state()`. + +### Raw SD handoff (`vfs_sdcard.h`) + +MSC is implemented on top of two raw-handoff helpers in the SD backend that give +up and reclaim the physical card around the USB stack: + +```c +// Give up the app's FAT mount and hand back the SD as a RAW, still-powered block +// device for USB MSC. The card is re-initialized (never formatted). +// out_card receives an sdmmc_card_t* (as void*) on success. +esp_err_t vfs_sdcard_detach_for_msc(void **out_card); + +// Undo the detach: release the raw SDMMC card+host handed to MSC and remount the +// app FAT at /sdcard. Call AFTER the MSC storage layer is torn down. Lets the +// firmware resume without a reboot. `card` is the handle from the detach call. +esp_err_t vfs_sdcard_reattach_after_msc(void *card); +``` + +`vfs_sdcard_detach_for_msc()` leaves the app FAT mount detached on failure; +`vfs_sdcard_reattach_after_msc()` performs the remount that returns the card to +the firmware. + +--- + ## Switching Backends To switch between storage backends, edit `vfs_config.h`: From 1b282245f19b8fb15d6d6ae3506b88e84c98df72 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:48 -0300 Subject: [PATCH 073/103] docs(ota): document C5 OTA over the SPI bridge and the build-time version source --- docs/ota/README.md | 62 +++++++++++++++++++++++++++++++++++++++++++--- 1 file changed, 59 insertions(+), 3 deletions(-) diff --git a/docs/ota/README.md b/docs/ota/README.md index 8c7438411..539bda9b6 100644 --- a/docs/ota/README.md +++ b/docs/ota/README.md @@ -4,9 +4,20 @@ Handles firmware updates for TentacleOS via MicroSD card. Uses A/B OTA partition ## How It Works -The C5 firmware is embedded inside the P4 binary at build time. A single `.bin` file updates both chips. +The P4 and C5 update through **two separate flows**: -### Update Flow +- **P4 self-OTA** - the P4 flashes its own inactive OTA slot from an image on the + SD card, then reboots and self-validates (this document's main subject). +- **C5 app OTA** - a separate flow (`c5_flasher`) reads + `/sdcard/c5/TentacleOS_C5.bin` and pushes it to the C5 over the SPI bridge; the + C5 writes its own inactive slot and reboots. See [C5 App OTA](#c5-app-ota-over-the-spi-bridge). + +> **Note:** embedding the C5 firmware inside the P4 binary now applies **only** to +> the ROM-download recovery path (used to reflash a bricked/blank C5 over UART/ROM); +> the normal C5 app update is the separate SPI-bridge flow above, not a single +> combined `.bin`. + +### Update Flow (P4 self-OTA) 1. Place firmware at `/sdcard/update/tentacleos.bin` 2. Trigger `ota_start_update()` from UI or console @@ -45,6 +56,37 @@ Scenarios: fails, P4 does not confirm, bootloader rolls back - **Healthy new image** - confirmed within a few seconds of boot +### C5 App OTA (over the SPI bridge) + +The normal C5 firmware update is independent of the P4 self-OTA above. It is +driven from the P4 by `c5_flasher` (`components/Service/c5_flasher/c5_flasher.c`): + +1. The image is read from `/sdcard/c5/TentacleOS_C5.bin` (not embedded in the P4 + binary). +2. The P4 sends `SPI_ID_SYSTEM_OTA_BEGIN` (size + transport) over the SPI bridge. + The C5 erases its inactive OTA slot asynchronously and reports `READY` via + `SPI_ID_SYSTEM_OTA_STATUS`. +3. The P4 streams the image as `SPI_ID_SYSTEM_OTA_DATA` chunks; the C5 writes each + sequentially and acks. `bytes_written` (from the STATUS poll) is the resync + point if a chunk ack is lost. +4. When the last chunk lands, the C5 finalizes, sets the boot slot to `DONE`, and + reboots into the new firmware. The P4 marks the bridge link down so the link + monitor re-probes and reconnects the new C5. + +> On the HighBoy V2 the transport is **SPI** (`SPI_OTA_TRANSPORT_SPI`); the UART +> transport path in `c5_flasher` is kept for a future board that routes a real +> P4->C5 UART and does not work on V2. + +**C5-side rollback (validated by P4 bridge health).** On the C5, after a fresh OTA +image boots, `ota_post_boot_check()` +(`firmware_c5/components/Service/ota/include/ota_service.h`) sees the running +partition is pending verification and **waits for the P4 to reach it over the +bridge** before marking the app valid; if the P4 does not establish the link +within the validation window, the C5 does not confirm and the bootloader rolls +back to the previous C5 image. It must be called after the C5's `kernel_init` so +the bridge slave is already listening. This is the inverse of the P4 side, whose +confirmation depends only on **local** health (see below) and never on the C5. + ### Partition Table See [boot_report](../boot_report/README.md) for the full current layout (the OTA @@ -59,7 +101,21 @@ slots were resized to `0x270000` to make room for a `coredump` partition). ### Versioning -Version is read from `assets/config/OTA/firmware.json`. Both P4 and C5 share the same version string. The C5 responds its version via `SPI_ID_SYSTEM_VERSION` (0x04). +The build-time version string is `common/metadata/version_info.txt` (a single +line, e.g. `1.4.0`). `firmware_p4/components/Service/CMakeLists.txt` reads it and +configures `common/metadata/ota_version.h.in` into a generated `ota_version.h` +that defines `FIRMWARE_VERSION`, which `ota_service.c` compiles in and returns +from `ota_get_current_version()`. (The header is generated at build time from +`version_info.txt`; there is no checked-in `ota_version.h`.) + +`assets/config/OTA/firmware.json` is **only the runtime/synced copy**, not the +source of truth: `firmware_p4/CMakeLists.txt` stamps the same `version_info.txt` +value into the assets image at build time, and at boot `ota_sync_version_to_assets()` +(called from `ota_post_boot_check()`) rewrites `firmware.json` to the running +`FIRMWARE_VERSION` if they differ. + +The C5 reports its own version over the SPI bridge via `SPI_ID_SYSTEM_VERSION` +(SYSTEM subcommand `0x04`). ## API From 6f7830e74409b7aef2f907e7bd51c898494c8180 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:48 -0300 Subject: [PATCH 074/103] docs(sys_monitor): document heap, SD and I2C health checks and stall tolerance --- docs/sys_monitor/README.md | 37 ++++++++++++++++++++++++++++--------- 1 file changed, 28 insertions(+), 9 deletions(-) diff --git a/docs/sys_monitor/README.md b/docs/sys_monitor/README.md index bd813037e..1c23bd983 100644 --- a/docs/sys_monitor/README.md +++ b/docs/sys_monitor/README.md @@ -22,12 +22,29 @@ kills tasks. (`esp_restart()`), preceded by a log, a UI alert and a short grace delay. 5. Tasks that recover or exit drop out of the table, so a fresh dip starts a new streak instead of inheriting a stale one. -6. It is also the **Task Watchdog heartbeat** (`esp_task_wdt_add`/`reset` each +6. **Heap watch** (`check_heap()`): reads internal free and the largest + contiguous internal block. When either drops low + (`HEAP_WARN_FREE_B` / `HEAP_WARN_LARGEST_B`) it warns once, evicts the image + cache via `assets_manager_evict_cache()` to reclaim RAM, then shows one UI + alert. If total internal free stays under `HEAP_CRIT_FREE_B` for + `HEAP_CRIT_CYCLES` consecutive cycles it does a controlled restart. Both the + warn latch and the critical streak reset once free RAM recovers. +7. **SD health watch** (`check_storage_health()`, every `STORAGE_CHECK_CYCLES` + cycles ~= 60 s): when the SD is mounted and `storage_check_health()` fails, it + requests a remount via `header_ui_request_sd_remount()`. +8. **I2C recovery watch** (`check_i2c_health()`): polls `i2c_recover_count()` and + logs when the bus recovery count advances (the I2C driver self-recovered a + stuck bus). Observe-and-report only; no escalation. +9. It is also the **Task Watchdog heartbeat** (`esp_task_wdt_add`/`reset` each cycle) and the **UI render supervisor**: it polls `ui_render_beat()` (a beat - bumped by an `lv_timer` inside the LVGL task) and, if the beat stalls for a - couple of cycles, does the same controlled restart. This replaces the old - "watch a task called `UI Task` by name" logic - it watches the renderer's - actual progress, not a task name. + bumped by an `lv_timer` inside the LVGL task) and, if the beat does not move + for `UI_STALL_ESCALATE_CYCLES` cycles (8, ~16 s), does the same controlled + restart. The tolerance is intentionally generous: a legitimately slow but + blocking op on the UI thread (e.g. a multi-second `wifi scan` run under the + LVGL lock) freezes the renderer for a few seconds without being deadlocked, so + only a genuinely stuck UI should reboot. This replaces the old "watch a task + called `UI Task` by name" logic - it watches the renderer's actual progress, + not a task name. `usStackHighWaterMark` is monotonic (it records the lowest free stack ever seen, and never rises again), so a sustained streak means the task is alive and running @@ -56,12 +73,14 @@ escalation is the controlled restart above. | `CRITICAL_STACK_THRESHOLD` | 256 | Free-stack floor (bytes) that flags a task | | `STACK_ESCALATE_CYCLES` | 5 | Consecutive critical cycles before a controlled restart | | `STACK_WATCH_MAX` | 8 | Distinct critical tasks tracked for persistence | +| `UI_STALL_ESCALATE_CYCLES` | 8 | Cycles with no render-beat progress (~16 s) before a controlled restart | +| `HEAP_WARN_FREE_B` | 24576 | Internal free below this warns once | +| `HEAP_WARN_LARGEST_B` | 12288 | Largest contiguous internal block below this warns once | +| `HEAP_CRIT_FREE_B` | 8192 | Internal free below this (sustained) escalates | +| `HEAP_CRIT_CYCLES` | 3 | Consecutive critical-heap cycles before a controlled restart | +| `STORAGE_CHECK_CYCLES` | 30 | SD-health probe cadence (cycles, ~60 s) | | `REBOOT_GRACE_MS` | 1500 | Delay after the alert so it renders / logs flush | -> The controlled restart has a `TODO(item 31)` hook: once the graceful shutdown -> path exists it should run there so the filesystem and radios flush their state -> before `esp_restart()`. - --- ## ESP32-C5 (`firmware_c5`) From 3d704ee16bac31c75ef0c577205d8893c1a043f4 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:48 -0300 Subject: [PATCH 075/103] docs(st7789): fix init return type, resolution and rotation API --- docs/st7789/README.md | 50 ++++++++++++++++++++++++++++++++----------- 1 file changed, 37 insertions(+), 13 deletions(-) diff --git a/docs/st7789/README.md b/docs/st7789/README.md index 3e3af18c3..877477baa 100644 --- a/docs/st7789/README.md +++ b/docs/st7789/README.md @@ -9,28 +9,38 @@ This component initializes and manages the ST7789 LCD controller using the ESP-I - **Dependencies:** `esp_lcd`, `driver/gpio`, `driver/ledc`, `spi` ## Hardware Configuration -- **Resolution:** 240x240 +- **Resolution:** 240x320 (`LCD_H_RES` 240 / `LCD_V_RES` 320; `LCD_PANEL_W`/`LCD_PANEL_H` match). - **Color Depth:** 16-bit (RGB565) -- **Interface:** SPI (via `spi` component driver) +- **Interface:** SPI on `SPI3_HOST`, 20 MHz pixel clock (`LCD_PIXEL_CLOCK_HZ`). + +## SPI drive-strength hardening +`st7789_init` bumps the SPI3 `SCLK`/`MOSI` pins to `LCD_SPI_DRIVE_CAP` +(`GPIO_DRIVE_CAP_3`, the strongest) via `gpio_set_drive_capability`. The display +FFC is long, capacitive and unterminated: at the IDF default the 20 MHz edges +barely settle, so a radio's EMI corrupts the still-settling edge and garbles long +transfers. Do not lower this - a weaker cap starves the FFC so hard the panel +will not even init. ## Internal Backlight Control -Although a separate `backlight` component exists, this driver currently includes its own internal PWM initialization (`init_backlight_pwm`) and control logic using `LEDC_TIMER_0` / `LEDC_CHANNEL_0`. -*Note: This overlaps with the standalone `backlight` component. Verify project integration to avoid timer conflicts.* +This driver owns its own PWM backlight init (`init_backlight_pwm`) and control +logic using `LEDC_TIMER_0` / `LEDC_CHANNEL_0`, 13-bit resolution at 5 kHz on +`GPIO_ST7789_BL_PIN`. ## API Reference ### `st7789_init` ```c -void st7789_init(void); +esp_err_t st7789_init(void); ``` -Initializes the display. -1. Creates the SPI device interface on `SPI3_HOST`. -2. Configures the ST7789 panel (Reset pin, RGB order, etc.). -3. Resets and initializes the panel. -4. Inverts colors (standard for many ST7789 IPS panels). -5. Turns the display ON. -6. Initializes the backlight PWM and **applies** (does not re-save) the saved - brightness/rotation. +Initializes the display. Returns `ESP_OK`, or the failing `esp_err_t` from the +panel IO / panel create / reset / init step (cleaning up any handles it created). +1. Creates the SPI panel IO on `SPI3_HOST`. +2. Hardens the SPI3 `SCLK`/`MOSI` drive strength (see above). +3. Configures the ST7789 panel (Reset pin, RGB order, etc.). +4. Resets and initializes the panel. +5. Inverts colors (standard for many ST7789 IPS panels). +6. Turns the display ON. +7. Initializes the backlight PWM and applies the saved brightness/rotation. ### `lcd_apply_brightness` ```c @@ -54,6 +64,20 @@ uint8_t lcd_get_brightness(void); ``` Reads the persisted brightness back from the config file. +### `lcd_set_rotation` +```c +void lcd_set_rotation(uint8_t rotation); +``` +Sets the panel rotation (index `1`-`4`, clamped). Applies the matching +mirror / swap-xy / gap for the 240x320 panel and persists the value. Rotations +3 and 4 apply a `ROTATION_GAP_OFFSET` (80) to line the visible window up. + +### `lcd_get_rotation` +```c +uint8_t lcd_get_rotation(void); +``` +Reads the persisted rotation index (1-4) back from the config file. + ### `lcd_display_sleep` ```c void lcd_display_sleep(bool sleep); From 2fb34cf3bca97fb2c16d711ba42107705b87a38a Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:48 -0300 Subject: [PATCH 076/103] docs(lvgl): document PSRAM draw buffers, direct-draw and capture APIs --- docs/lvgl/README.md | 40 ++++++++++++++++++++++++++++++++++++++-- 1 file changed, 38 insertions(+), 2 deletions(-) diff --git a/docs/lvgl/README.md b/docs/lvgl/README.md index b5c7a68a3..004213a65 100644 --- a/docs/lvgl/README.md +++ b/docs/lvgl/README.md @@ -53,8 +53,15 @@ esp_err_t lvgl_glue_init(void); are not ready. 2. **`lvgl_port_init`:** starts the managed LVGL task (calls `lv_init` internally), the periodic tick, and a recursive mutex (the lock). -3. **`lvgl_port_add_disp`:** registers the display - DMA double buffering (20 - lines), RGB565 with byte swap, internal RAM (no PSRAM). +3. **`lvgl_port_add_disp`:** registers the display - a partial DMA double buffer + of `LVGL_BUF_LINES` (`LCD_PANEL_H / 4` = 80) lines in internal DMA-capable + RAM, RGB565 with byte swap. +4. **PSRAM draw buffers:** overrides LVGL's draw and image buffer handlers with + `draw_buf_psram_malloc`, which routes allocations larger than + `DRAWBUF_PSRAM_THRESHOLD` (48 KB) to PSRAM (`MALLOC_CAP_SPIRAM`) and falls + back to the default heap otherwise. This keeps big off-screen / image buffers + off the scarce internal heap. The DMA render double buffer above stays in + internal DMA RAM (PSRAM is not DMA-reachable by the LCD). ### Thread safety ```c @@ -81,6 +88,35 @@ wrap it. > run inside the LVGL task already under the lock. See > [ui: long-running work](../ui/README.md#long-running-work-and-the-watchdog). +### Direct draw (panel takeover) +```c +void lvgl_glue_direct_begin(void); +void lvgl_glue_direct_end(void); +void lvgl_glue_wait_flush(uint32_t timeout_ms); +``` +For a full-screen app (e.g. the Game Boy emulator) that holds the LVGL lock and +drives the ST7789 itself with raw `esp_lcd_panel_draw_bitmap()` calls. The panel +SPI is async - `draw_bitmap` queues the transfer and returns - so reusing one +blit buffer for the next strip while the previous DMA is still reading it +corrupts the image. Between `_begin()` and `_end()` the shared +color-transfer-done ISR raises a semaphore instead of signalling LVGL flush-ready; +the app calls `lvgl_glue_wait_flush()` after each draw to block until that +strip's DMA finished, making single-buffer reuse safe. Call `_begin()` right +after taking the lock and `_end()` before releasing it; outside this window the +ISR drives LVGL exactly as before. + +### Screenshot capture +```c +typedef void (*lvgl_glue_strip_cb_t)( + int32_t x1, int32_t y1, int32_t x2, int32_t y2, const uint8_t *data, int32_t stride); +void lvgl_glue_capture_begin(lvgl_glue_strip_cb_t cb); +void lvgl_glue_capture_end(void); +``` +Tees each rendered strip to `cb` from the LVGL flush path, handing over the +strip's area plus the active buffer in native RGB565 (pre byte-swap). +`_capture_begin(cb)` starts the tee (pass `NULL` to disable); `_capture_end()` +stops it. + ### Rotation ```c bool lvgl_glue_toggle_rotation(void); // returns true if now landscape From c535e0e33c6c3227a0d369566b11ed6becbb819f Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:48 -0300 Subject: [PATCH 077/103] docs(boot_report): document new boot stages and boot-count API --- docs/boot_report/README.md | 20 ++++++++++++++------ 1 file changed, 14 insertions(+), 6 deletions(-) diff --git a/docs/boot_report/README.md b/docs/boot_report/README.md index a7ee0c0d4..1ff3a35cb 100644 --- a/docs/boot_report/README.md +++ b/docs/boot_report/README.md @@ -26,9 +26,12 @@ const boot_stage_t *boot_report_stages(int *out_count); bool boot_report_all_required_ok(void); ``` -Recorded stages with their real return codes: `sd-storage` (optional, absent SD -is fine), `assets` (required), `battery` (optional), `display` (required), -`nvs` (required). A **required** failure makes `kernel_init` drop into +Recorded stages with their real return codes, in the order `kernel_init` runs +them: `nvs` (required), `i2c` (optional, degrades charger/haptic/LED only), +`sd-storage` (optional, absent SD is fine), `sd-health` (optional, recorded only +when the SD is mounted), `assets` (required), `battery` (optional), `audio` +(optional), `display` (required), `lvgl` (required, recorded only when the panel +came up). A **required** failure makes `kernel_init` drop into [safe mode](../recovery/README.md) instead of booting blind, and the function returns `ESP_FAIL`. @@ -95,6 +98,7 @@ void boot_report_track_bootloop(void); // FIRST thing in app_main bool boot_report_in_bootloop(void); uint32_t boot_report_abnormal_boots(void); uint32_t boot_report_panic_total(void); +uint32_t boot_report_boot_count(void); void boot_report_mark_stable(void); ``` @@ -113,9 +117,13 @@ void boot_report_mark_stable(void); [safe mode](../recovery/README.md) - the degraded target (no radios, no SD theme, minimal UI). The safe-mode footer shows the reset reason, and the crash viewer shows `Panics total` and `Abnormal boots N/3`. -- Only a **summary** is persisted to NVS (namespace `boot_report`: last reason + - running panic total), written on abnormal boots only, so flash wear is - negligible. The RTC counter carries the loop state itself. +- A **summary** is persisted to NVS (namespace `boot_report`). A real + **total boot count** (`boot_total`, exposed via `boot_report_boot_count()`) is + bumped once every boot from `boot_report_capture_crash` - one small write per + boot. The **last reason** + running **panic total** (`boot_report_panic_total()`) + are written only on abnormal boots, so panic-path flash wear stays negligible. + The RTC counter carries the consecutive-loop state itself; NVS holds the + lifetime totals. ## Follow-ups From 809ee8217d9a8abf01fb4d6644132ea178fb9cc9 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:48 -0300 Subject: [PATCH 078/103] docs(ui): update input-migration status and rewrite the add-a-screen guide --- docs/ui/README.md | 319 +++++++++++++++++++++---------------- docs/ui/input-migration.md | 33 ++-- 2 files changed, 202 insertions(+), 150 deletions(-) diff --git a/docs/ui/README.md b/docs/ui/README.md index eb3b0d408..663dcd686 100644 --- a/docs/ui/README.md +++ b/docs/ui/README.md @@ -1,13 +1,17 @@ # ui_manager -step-by-step process for adding a new screen (feature) to the HighBoy system using the ui_manager architecture. -**Example** used: We'll create a fictional **Bluetooth (BLE)** screen. +Step-by-step process for adding a new screen (feature) to TentacleOS using the +`ui_manager` architecture. Source of truth: `ui/ui_manager.c`, +`ui/include/ui_manager.h`, `ui/include/ui_metrics.h`, `ui/include/ui_theme.h`, +and the screens under `ui/screens/`. -### 1. Register the screen in the UI ui_manager -The `ui_manager` needs to know about the new screen to handle navigation. +**Example** used: a fictional **Bluetooth (BLE)** menu screen. -**File:** `ui/ui_manager.h` -1. Add a new identifier to the `enum`: +### 1. Add a screen id +The `ui_manager` identifies every screen by an enum value. + +**File:** `ui/include/ui_manager.h` +Add a new identifier to `screen_id_t`: ```c typedef enum { SCREEN_NONE, @@ -15,163 +19,202 @@ typedef enum { SCREEN_MENU, SCREEN_WIFI_MENU, // ... - SCREEN_BLE_MENU, // <--- NEW ID ADDED + SCREEN_BLE_MENU, // <--- NEW ID } screen_id_t; ``` -### 2. Configure routing and Power Management -Define how the ui_manager should open the screen and handle any required hardware power states. +### 2. Register the open function in the dispatch table +Routing is a dispatch table, not a `switch` inside `ui_switch_screen`. +`screen_open_fn(screen_id_t)` maps an id to the function that builds and loads +the screen; `ui_switch_screen` looks the id up there. If it returns `NULL` the +screen is treated as unavailable and the manager stays put. **File:** `ui/ui_manager.c` -1. Include de header for the new screen (created in Step 3): +1. Include the screen header (created in Step 4): ```c -#include "screens/bluetooth/ui_ble_menu.h" +#include "ui_ble_menu.h" ``` -2. (Optional) Power Management: If the screen uses a radio (Wi-Fi, BLE, RF), add logic to automatically enable/disable the hardware. +2. Add a `case` to `screen_open_fn()`: ```c -static bool is_ble_screen(screen_id_t screen) { - switch (screen) { - case SCREEN_BLE_MENU: - case SCREEN_BLE_SCAN: // Future sub-screens - return true; - default: - return false; - } +static ui_open_fn_t screen_open_fn(screen_id_t s) { + switch (s) { + // ... other cases ... + case SCREEN_BLE_MENU: + return ui_ble_menu_open; // <--- NEW ROUTE + default: + return NULL; + } } ``` -Update `ui_switch_screen` to call `ble_init()` / `ble_deinit()` based on this flag (similar to how Wi-Fi is handled). +### 3. If the screen owns hardware or a task, register a stop hook +Screens that start a radio, a worker task, or a media player must register a +stop function in `screen_close_fn()`. `ui_switch_screen` calls it on the +outgoing screen before tearing it down, so the resource is always released on +navigation. Current examples: `SCREEN_SUBGHZ_READ` -> `subghz_receiver_stop`, +`SCREEN_NFC_READ` / `SCREEN_NFC_EMULATE` -> `nfc_manager_stop`, +`SCREEN_WAV_PLAYER` -> `ui_wav_player_stop`, `SCREEN_MP3_PLAYER` -> +`ui_mp3_player_stop`, `SCREEN_IMAGE_VIEWER` -> `ui_image_viewer_stop`, +`SCREEN_USB_STORAGE` -> `ui_usb_storage_stop`. -3. Add the case to the main switch statement: ```c -void ui_switch_screen(screen_id_t new_screen) { - if (ui_acquire()) { - // ... init/deinit logic ... - clear_current_screen(); - - switch (new_screen) { - // ... other cases ... - - case SCREEN_BLE_MENU: // <--- NEW ROUTE - ui_ble_menu_open(); - break; - } - // ... - } +static ui_close_fn_t screen_close_fn(screen_id_t s) { + switch (s) { + // ... other cases ... + case SCREEN_BLE_READ: + return ble_scanner_stop; // <--- release the radio/task on leave + default: + return NULL; + } } ``` -### 3. Create the New Screen UI -Create the folder and files for the new feature: `ui/screens/bluetooth/` +This supersedes the old advice of calling `ble_init()` / `ble_deinit()` inside +`ui_switch_screen`. A plain menu that owns no hardware needs no close hook. + +Enabling a radio for a whole area is done at the menu, not here: `menu_ui.c`'s +`ensure_radio_on()` powers Wi-Fi / BLE on when the user opens that area's menu. + +### 4. Create the screen source +Create the files under `ui/screens/bluetooth/`. -**Header File:** `ui_ble_menu.h` +**Header:** `ui/screens/bluetooth/include/ui_ble_menu.h` ```c #ifndef UI_BLE_MENU_H #define UI_BLE_MENU_H -#include "lvgl.h" -void ui_ble_menu_open(void); // Public function +void ui_ble_menu_open(void); #endif ``` -**Source File:** `ui_ble_menu.c` -Standard template from any Highboy screen: +**Source:** `ui/screens/bluetooth/ui_ble_menu.c`. The current template: ```c #include "ui_ble_menu.h" -#include "ui_manager.h" -#include "lv_port_indev.h" // Access to main_group + #include "esp_log.h" -static const char *TAG = "UI_BLE"; -static lv_obj_t * screen_ble = NULL; - -// 1. Event Callback (Navigation) -static void ble_event_cb(lv_event_t * e) { - lv_event_code_t code = lv_event_get_code(e); - - if (code == LV_EVENT_KEY) { - uint32_t key = lv_event_get_key(e); - // BACK BUTTON (ESC/LEFT) - if (key == LV_KEY_ESC || key == LV_KEY_LEFT) { - ESP_LOGI(TAG, "Returning to Main Menu"); - // Destroy current screen and open Menu - ui_switch_screen(SCREEN_MENU); - } - } +#include "menu_component_ui.h" +#include "ui_manager.h" +#include "ui_metrics.h" +#include "ui_theme.h" + +static const char *TAG = "UI_BLE_MENU"; + +static lv_obj_t *s_screen = NULL; +static menu_component_t s_menu; + +// Event-driven input: one debounced event at a time. The central pump only +// calls this while input is unlocked and no modal overlay is up. UP/DOWN also +// act on REPEAT for held auto-scroll; actions use PRESS only. +static void ble_menu_input(const input_event_t *ev, void *ctx) { + (void)ctx; + const bool press = (ev->action == INPUT_ACTION_PRESS); + const bool nav = press || (ev->action == INPUT_ACTION_REPEAT); + switch (ev->button) { + case INPUT_BTN_DOWN: + if (nav) menu_component_next(&s_menu); + break; + case INPUT_BTN_UP: + if (nav) menu_component_prev(&s_menu); + break; + case INPUT_BTN_BACK: + case INPUT_BTN_LEFT: + if (press) ui_switch_screen(SCREEN_MENU); + break; + case INPUT_BTN_OK: + case INPUT_BTN_RIGHT: + if (press) { /* enter the selected item */ } + break; + default: + break; + } } -// 2. Screen Build Function void ui_ble_menu_open(void) { - // Safety cleanup - if (screen_ble) { - lv_obj_del(screen_ble); - screen_ble = NULL; - } - - // A. Create Base Screen - screen_ble = lv_obj_create(NULL); - lv_obj_set_style_bg_color(screen_ble, lv_color_black(), 0); - - // B. Add Content (e.g., Title) - lv_obj_t * label = lv_label_create(screen_ble); - lv_label_set_text(label, "Bluetooth Menu"); - lv_obj_set_style_text_color(label, lv_color_white(), 0); - lv_obj_align(label, LV_ALIGN_CENTER, 0, 0); - - // C. Setup Navigation - lv_obj_add_event_cb(screen_ble, ble_event_cb, LV_EVENT_KEY, NULL); - - // Add to Input Group (Essential!) - if (main_group) { - lv_group_add_obj(main_group, screen_ble); - lv_group_focus_obj(screen_ble); - } - - // D. Load Screen - lv_screen_load(screen_ble); + if (s_screen != NULL) { + lv_obj_del(s_screen); + s_screen = NULL; + } + + s_screen = lv_obj_create(NULL); + lv_obj_set_style_bg_color(s_screen, current_theme.screen_base, 0); + lv_obj_set_style_bg_opa(s_screen, LV_OPA_COVER, 0); + lv_obj_remove_flag(s_screen, LV_OBJ_FLAG_SCROLLABLE); + + s_menu = menu_component_create(s_screen, "BLUETOOTH", "/assets/icons/bluetooth.bin"); + // ... add items ... + + ui_input_set_screen_handler(ble_menu_input, NULL); + + ui_screen_load_owned(&s_screen, s_screen); } ``` -### 4. Link from the main Menu -Add a button/entru in the main menu to access the new screen - -**File:** `ui/screens/menu/ui_menu.c` -1. In the `menu_event_cb` callback, locate the corresponding item ID case and add/uncomment the call: +Points that differ from older screens - all required for new screens: + +- **Input is event-driven.** Register a handler with + `ui_input_set_screen_handler(handler, ctx)`; it receives an `input_event_t` + (`ev->button` in `INPUT_BTN_UP..BACK`, `ev->action` in + `INPUT_ACTION_PRESS` / `RELEASE` / `LONG_PRESS` / `REPEAT`, both from + `input_manager.h`). No `LV_EVENT_KEY` callback, no `lv_event_get_key`, no + manual `main_group` focus, no `s_*_last` edge bookkeeping. The handler is + cleared for you on the next screen switch. See + [input-migration.md](input-migration.md) for the full pattern and gotchas. +- **Load the screen owned.** Use `ui_screen_load_owned(&s_screen, scr)` instead + of raw `lv_screen_load`. When the object is freed on navigation, the slot is + set back to `NULL`, so the screen never double-frees or dereferences a stale + pointer. Do not manually `lv_obj_del` the previous screen in the open + function beyond the guarded self-cleanup shown above. +- **Be rotation-aware.** Never hardcode `LCD_H_RES` / `LCD_V_RES` for layout; + those are fixed panel constants. Use `ui_screen_w()` / `ui_screen_h()` from + `ui_metrics.h` (they follow the live rotation). If the screen must reflow + after a rotation change, call `ui_relayout_current_screen()`. When a component + polls button levels directly, use `ui_nav_pressed(logical)` so it navigates + correctly in landscape. +- **Schedule onto the UI thread from workers.** Any worker/radio task that + needs to touch LVGL must marshal through `ui_async_call()` (the required + wrapper around `lv_async_call`; it takes the UI lock first). Never call LVGL + directly from another task. +- **Styling uses the theme.** Pull colors from `current_theme` in + `ui_theme.h` (`screen_base`, `bg_primary`, `text_main`, `border_accent`, + ...). For a protocol screen, set the active protocol with + `ui_theme_set_protocol(PROTOCOL_BLE)` and read the accent with + `ui_theme_get_accent()`, or use the per-protocol fields directly + (`current_theme.protocol_ble`, `protocol_nfc`, `protocol_wifi`, + `protocol_subghz`, `protocol_rfid`, `protocol_ir`, `protocol_lora`). Do not + hardcode `lv_color_black()` / `lv_color_white()`. + +### 5. Link from the main menu +The main menu (`ui/screens/menu/menu_ui.c`) is a data table: each +`menu_ui_item_t` carries a `target` of type `screen_id_t`. Add (or point) an +entry at the new id: ```c -case MENU_ID_BLUETOOTH: - ui_switch_screen(SCREEN_BLE_MENU); // <--- Routes to the new screen - break; +{"BLUETOOTH", + { /* icon frames */ }, + BASE_FRAMES, {NULL}, {NULL}, + SCREEN_BLE_MENU}, // <--- target ``` -(Note: If the MENU_ID_BLUETOOTH entry doesn't exist yet in menu_item_id_t, create it.) +Selecting the item calls `ensure_radio_on(target)` and then +`ui_switch_screen(target)`; you do not write a per-item `case`. + +### 6. Build system (CMake) +**File:** `components/Applications/CMakeLists.txt` (this is the `Applications` +component; there is no separate CMakeLists under `ui/`). -### 5. Update Build System (CMake) -Commom error: forgettint to register the new source files. +Sources are picked up automatically: `file(GLOB_RECURSE UI_SRCS "ui/*.c")` +globs every `.c` under `ui/`, so a new screen source compiles without editing +the SRCS list. Because it is a glob, **adding a new `.c` needs a reconfigure** +(`idf.py reconfigure`, or a clean build) to re-run it. -**File:** `CMakeLists.txt` (UI component) -1. Add the new sources files and include directory: +The only hand-maintained part is `INCLUDE_DIRS`: when you introduce a brand-new +screen *area* (a new folder with its own `include/`), add its include dir: ```cmake -file(GLOB_RECURSE HOME_UI_SRCS "ui/screens/home/*.c") -file(GLOB_RECURSE MENU_UI_SRCS "ui/screens/menu/*.c") -file(GLOB_RECURSE WIFI_UI_SRCS "ui/screens/wifi/*.c") -file(GLOB_RECURSE BLE_UI_SRCS "ui/screens/ble/*.c") # <---- Add srcs here - -idf_component_register(SRCS - "ui/ui_manager.c" - ${HOME_UI_SRCS} - ${MENU_UI_SRCS} - ${WIFI_UI_SRCS} - ${BLE_UI_SRCS} # <----- and call it here - - INCLUDE_DIRS - "ui/include" - "ui/screens/home/include" - "ui/screens/menu/include" - "ui/screens/wifi/include" - "ui/screens/ble/include" # <----- dont forget include files -) + # --- ui screens --- + "ui/screens/bluetooth/include" # note: screens/bluetooth/, there is no screens/ble/ ``` -2. Recommended: Run `idf.py reconfigure` in the terminal after saving +An existing area (like `bluetooth`) already has its include dir listed, so a +new screen inside it needs nothing here. --- @@ -224,9 +267,10 @@ That is all: no timer to create or delete, no `ui_input_is_locked()` / you on the next screen switch. Use `REPEAT` for held auto-scroll and `input_is_down(button)` when you need a continuous held state (games). -See `nfc_menu_ui.c` for the reference migration, and -[input-migration.md](input-migration.md) for the step-by-step guide to convert -the remaining ~91 screens off their polling timers (with the gotchas). +See `nfc_menu_ui.c` for the reference handler, and +[input-migration.md](input-migration.md) for the full pattern and gotchas. Every +screen already uses this model; the lone exception is `games/octopet_ui.c`, +which keeps a poll timer on purpose for continuous held-direction movement. ## Screen power policy (auto-dim / sleep) @@ -249,16 +293,19 @@ lock. It reads `input_last_activity_ms()` (from `input_manager`) and the The display settings screen writes `auto_lock_seconds` / `auto_dim` / brightness through `tos_config`, which is the sole writer of the `screen` config file. -## Execution Flow Sumamary -1. User selects **Bluetooth** from the Main Menu. -2. Menu callback calls `ui_switch_screen(SCREEN_BLE_MENU)`. -3. `ui_manager`: - - Handles hardware power (enables BLE if needed). - - Clears previous screen. - - Calls `ui_ble_menu_open()`. +## Execution flow summary +1. User selects **Bluetooth** in the main menu. +2. The menu resolves the item's `target` (`SCREEN_BLE_MENU`), calls + `ensure_radio_on(target)` (powers BLE on for the area), then + `ui_switch_screen(SCREEN_BLE_MENU)`. +3. `ui_switch_screen`: + - Looks the id up in `screen_open_fn()`; stays put if it is `NULL`. + - Calls the outgoing screen's `screen_close_fn()` stop hook, if any. + - Clears the previous screen (and the old input handler). + - Calls the resolved open function, `ui_ble_menu_open()`. 4. `ui_ble_menu_open`: - - Creates visual objects. - - Adds objects to `main_group`. - - Loads the screen. + - Builds the screen objects (theme colors, rotation-aware layout). + - Registers its input handler with `ui_input_set_screen_handler()`. + - Loads the screen with `ui_screen_load_owned(&s_screen, scr)`. -**Done! The new screen is fully integrated, safe and navigable.** +**Done: the new screen is integrated, safe and navigable.** diff --git a/docs/ui/input-migration.md b/docs/ui/input-migration.md index cdd29a624..8e4d5ecb1 100644 --- a/docs/ui/input-migration.md +++ b/docs/ui/input-migration.md @@ -1,18 +1,25 @@ # Screen input migration guide -How to convert one screen from the old per-screen polling `lv_timer` to the -central event-driven input. Background: [input_manager](../input_manager/README.md), +How a screen wires up input: the central event-driven model, and how it was +converted from the old per-screen polling `lv_timer`. Background: +[input_manager](../input_manager/README.md), [ui: event-driven handlers](README.md#input-event-driven-handlers). -**Status:** 7 screens migrated (see [Reference examples](#reference-examples)); -~91 still use `nav_timer_cb`. Find the remaining ones with: +**Status: migration complete (historical reference).** Every screen now +registers an input handler with `ui_input_set_screen_handler` (~110 screen +files). The single remaining `nav_timer_cb` is in `games/octopet_ui.c`, a +deliberate continuous-held-state case (see the games gotcha below), not a +pending TODO. Confirm with: ```sh -grep -rln "nav_timer_cb\|nav_cb\b" firmware_p4/components/Applications/ui/screens --include='*.c' +grep -rln "ui_input_set_screen_handler" firmware_p4/components/Applications/ui/screens --include='*.c' | wc -l +grep -rln "nav_timer_cb" firmware_p4/components/Applications/ui/screens --include='*.c' ``` -Nothing is broken in the meantime: unmigrated screens keep working through the -`buttons_gpio` shim. Migrate opportunistically, build after each batch. +This document is kept as a reference: the recipe and gotchas below describe the +current handler pattern, so use it when adding a new screen or if you ever find +a stray polling timer. The reference-examples table still points at real, +representative screens. ## What you are replacing @@ -110,14 +117,12 @@ Copy the closest match: | `bluetooth/ui_ble_menu.c` | Forward decl + `MENU_ITEMS` target dispatch | | `games/games_menu_ui.c` | Carousel: LEFT/UP and RIGHT/DOWN cycle an index with REPEAT | -## Remaining work (~91 screens) +## The one intentional exception -By area (run the grep above for the live list): bluetooth 15, wifi 14, nfc 13, -settings 11, lora 8, infrared 7, subghz 5, audio 4, dev 3, games 2, badusb 2, -and one each in theme, rfid, haptic, gpio, files, connect_wifi, -connection_settings. The simple area menus (settings, submenus) are quickest; -the games and multi-view NFC/RFID screens need the continuous-state / multi-view -handling above. +`games/octopet_ui.c` keeps a `nav_timer_cb` on purpose: the pet moves while a +direction is held, which is a continuous-held-state case (see the games gotcha +above), not something a pure press/edge handler models well. It reads button +levels from its own tick timer. This is by design; do not "migrate" it. ## Verify From 7112d9049b92c98b1b9b3dabfa34c874e0cbfb76 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:48 -0300 Subject: [PATCH 079/103] docs(sx1262): add driver doc covering shared SPI3 bus and RX hardening --- docs/sx1262/README.md | 164 ++++++++++++++++++ .../components/Drivers/sx1262/README.md | 7 + 2 files changed, 171 insertions(+) create mode 100644 docs/sx1262/README.md create mode 100644 firmware_p4/components/Drivers/sx1262/README.md diff --git a/docs/sx1262/README.md b/docs/sx1262/README.md new file mode 100644 index 000000000..cabf359df --- /dev/null +++ b/docs/sx1262/README.md @@ -0,0 +1,164 @@ +# SX1262 LoRa Transceiver Driver + +This component provides a driver for the Semtech SX1262 sub-GHz LoRa transceiver. It handles the full SX1262 command set over SPI, LoRa modulation/packet configuration, TX/RX (single, continuous, and duty-cycle), Channel Activity Detection (CAD), sleep/wake power management, and interrupt-driven packet reception with a ring buffer. + +The driver core is platform-agnostic: all hardware access is delegated through a HAL callback struct (`sx1262_hal_t`), and the ESP32 port lives in a single file. This keeps the register/command logic portable and testable. + +## Overview + +- **Location:** `components/Drivers/sx1262/` +- **Public header:** `include/sx1262.h` (types in `include/sx1262_types.h`) +- **Dependencies:** `spi`, `pins` (`pin_def.h`), `sys_prio`, `driver/spi_master`, `driver/gpio`, `freertos`, `esp_log` +- **Interface:** SPI3_HOST at 4 MHz, SPI mode 0 (shared bus - see below) +- **Reference:** register/opcode comments cite the SX1262 datasheet (DS) sections + +## File Layout + +| File | Responsibility | +|------|----------------| +| `sx1262.c` | Public API, init/bring-up sequence, config, IRQ task, recovery | +| `sx1262_cmd.c` | Low-level SPI opcode/register/buffer access and BUSY-pin waiting | +| `sx1262_fsm.c` | Radio state machine (tracks `sx1262_state_t`) | +| `sx1262_hal.c` | ESP32 HAL port: SPI device, GPIO, mutex, bus lock, antenna switch | +| `sx1262_irq.c` | IRQ dispatch, RX packet read, RX ring buffer | +| `sx1262_radio.c` | TX/RX/CAD/sleep/wake/duty-cycle operations | +| `sx1262_regs.h` | Opcodes, register addresses, LoRa parameter constants | + +## Shared SPI3 Bus Contract (important) + +The SX1262 sits on **SPI3_HOST**, the same bus as the **ST7789 display**. Because two independent drivers share one bus, every SX1262 transaction is serialized through a layered lock in the HAL (`hal_lock` / `hal_unlock` in `sx1262_hal.c`): + +1. Take the SX1262 device mutex (`spi_mutex`, `portMAX_DELAY`). +2. Take the shared SPI3 bus lock via `spi_bus_lock_take(SPI3_BUS_LOCK_TIMEOUT_MS)` (1000 ms) - this is the cross-component handshake with the display driver. +3. `spi_device_acquire_bus()` for the duration of the transaction. + +Unlock reverses the order (`release_bus` -> `spi_bus_give` -> give mutex). The bus lock is taken/released per transaction so the display is never starved. + +Bus lifecycle: + +- `sx1262_hal_create()` calls `spi_bus_initialize(SPI3_HOST, ...)`. If the bus is **already initialized** by another driver (the ST7789 display, via the kernel `spi_init`), the returned `ESP_ERR_INVALID_STATE` is treated as success - the SX1262 simply adds itself as a second device. +- `sx1262_hal_destroy()` removes only the SX1262 device and deletes the device mutex. **It never frees the SPI3 bus**, because the display still needs it. `sx1262_deinit()` -> `sx1262_hal_destroy()` therefore leaves the display fully functional. + +## RX Robustness / Hardening + +The RX path is hardened against errored packets and a flaky/contended SPI3 bus: + +- **Retry bring-up until STDBY_RC.** `sx1262_init()` runs `sx1262_hw_bringup()` up to `SX1262_INIT_MAX_ATTEMPTS` (3) times. Bring-up performs reset -> standby -> DCDC regulator -> full calibration -> image calibration -> workarounds -> LoRa config, then reads the chip status and **only succeeds if the chip actually landed in STDBY_RC** (`chip_mode == STDBY_RC`). Any device error reported after calibration also fails the attempt, triggering a retry. +- **IRQ-task self-recovery.** The IRQ task (`irq_task`) counts consecutive `sx1262_irq_process()` failures; after `SX1262_IRQ_FAIL_RECOVER` (5) in a row it calls `sx1262_recover()`, which does a hardware reset + full reconfigure (`sx1262_hw_bringup`) and resumes continuous RX. A single success resets the streak. +- **Errored packets do not read the FIFO.** In `read_rx_packet()`, if the RxDone IRQ arrives with CRC-error or header-error flags set, the payload buffer is **not** read (`len = 0`), avoiding acting on corrupt FIFO contents. RSSI/SNR and the `has_crc_error` / `has_header_error` flags are still populated so the caller can observe the failure. Standalone CRC/header errors (no RxDone) are surfaced through the `on_error` callback. +- **Demoted RX-error hot-path logs.** RxDone, CRC error, header error, timeout, CAD, and ring-buffer-full messages log at `ESP_LOGD` (debug), not error/warning. This keeps the hot path quiet under noisy conditions instead of flooding the console on every errored packet. +- **Bounded RX ring buffer.** Received packets are pushed into a fixed ring of `SX1262_RX_RING_SIZE` (8) entries; a full ring drops the newest packet (debug log). Ring access is guarded by the HAL critical section, so `sx1262_get_packet()` is safe against the IRQ task. + +## Radio Parameters (`sx1262_config_t`) + +```c +typedef struct { + sx1262_hal_t hal; // Platform HAL - all callbacks + uint32_t frequency_hz; // 150_000_000 .. 960_000_000 Hz + uint8_t sf; // SF5 .. SF12 + uint8_t bw; // BW_7 .. BW_500 + uint8_t cr; // CR_4_5 .. CR_4_8 + int8_t tx_power_dbm; // -9 .. +22 dBm + uint16_t preamble_len; // preamble symbols (min 2, 12+ recommended) + bool is_crc_on; + bool is_inverted_iq; // true = LoRaWAN downlink (activates workaround W4) + bool is_implicit_hdr; // true = implicit header (activates W3); SF6 requires this + bool is_public_network; // sync word 0x3444 (public) vs 0x1424 (private/Meshtastic) +} sx1262_config_t; +``` + +Validation (`validate_config`) rejects out-of-range values before any SPI transaction. Notable rules: `BW_500` requires `SF >= 6`, and `SF6` requires implicit-header mode. LDRO (low data rate optimize) is derived automatically for `SF11/SF12` at `BW <= 125 kHz`. + +## Pin / Hardware Configuration + +Pins come from `pin_def.h` (`components/Drivers/pins`): + +| Signal | Macro | GPIO | +|--------|-------|------| +| SCLK | `GPIO_LORA_SCLK_PIN` | 21 | +| MOSI | `GPIO_LORA_MOSI_PIN` | 22 | +| MISO | `GPIO_LORA_MISO_PIN` | 23 | +| NSS/CS | `GPIO_LORA_CS_PIN` | 26 | +| BUSY | `GPIO_LORA_BUSY_PIN` | 4 | +| DIO1 | `GPIO_LORA_DIO1_PIN` | 5 | +| NRESET | `GPIO_LORA_RESET_PIN` | -1 (not wired) | +| TXEN | `GPIO_LORA_TXEN_PIN` | -1 (not wired) | +| RXEN | `GPIO_LORA_RXEN_PIN` | -1 (not wired) | + +`-1` pins are skipped by the HAL. With no discrete TX/RX antenna-switch pins, the RF switch is driven by the chip itself via **DIO2 as RF switch** (`SetDIO2AsRfSwitch`, enabled during bring-up). NSS is toggled in software (the SPI device is configured with `spics_io_num = -1`). BUSY and DIO1 are inputs; DIO1 signals IRQs. Reset/wait timings: `SX1262_RESET_HOLD_MS` (2), `SX1262_RESET_WAIT_MS` (20); BUSY polling caps at `SX1262_WAIT_BUSY_TIMEOUT_MS` (100). + +## HAL Contract (`sx1262_hal_t`) + +The driver core never includes platform headers. Porting means implementing the callback struct: `spi_transfer`, `cs_low` / `cs_high`, `reset_write`, `busy_read`, `delay_ms`, `get_tick_ms`, `lock` / `unlock`, `enter_critical` / `exit_critical`, `set_antenna`, and an opaque `ctx`. `sx1262_hal_create()` populates it for the ESP32; a different platform supplies its own file. + +## API Reference + +### Lifecycle + +```c +esp_err_t sx1262_init(const sx1262_config_t *config); +esp_err_t sx1262_deinit(void); +esp_err_t sx1262_start(void); +void sx1262_stop(void); +esp_err_t sx1262_config_lora(const sx1262_config_t *config); +esp_err_t sx1262_set_callbacks(const sx1262_callbacks_t *cbs); +bool sx1262_is_running(void); +``` + +- `sx1262_init` validates HAL + config, then runs the retrying bring-up (see hardening). Returns `ESP_ERR_INVALID_ARG` on bad config/HAL, or the last bring-up error after all attempts fail. +- `sx1262_start` creates the DIO1 IRQ processing task (stack 4096, `SYS_PRIO_REALTIME`, `SYS_CORE_RADIO` = core 0). `ESP_ERR_INVALID_STATE` if already running or not initialized; `ESP_ERR_NO_MEM` on task-create failure. +- `sx1262_stop` signals the IRQ task and waits (up to 500 ms) for it to exit via task notification, then turns the antenna switch off. +- `sx1262_config_lora` reconfigures LoRa parameters at runtime; re-applies workaround W4 (IQ polarity) every call. The stored HAL is preserved across the config copy. + +### Callbacks (`sx1262_callbacks_t`) + +```c +esp_err_t sx1262_set_callbacks(const sx1262_callbacks_t *cbs); +``` + +Registers `on_tx_done`, `on_rx_done`, `on_cad_done`, `on_timeout`, `on_error` (each may be NULL) plus a shared `cb_ctx`. Callbacks fire from the IRQ task, not an ISR. + +### TX / RX + +```c +esp_err_t sx1262_transmit(const uint8_t *data, uint8_t len, uint32_t timeout_ms); +esp_err_t sx1262_receive_single(uint32_t timeout_ms); +esp_err_t sx1262_receive_continuous(void); +void sx1262_stop_rx(void); +esp_err_t sx1262_get_packet(sx1262_packet_t *out_packet); +``` + +- `sx1262_transmit` is non-blocking (payload 1..255 bytes); completion arrives via `on_tx_done`. Applies workaround W1 (BW500 sensitivity) before each TX. +- `sx1262_receive_single` returns to STDBY after one packet or timeout (`timeout_ms = 0` = wait forever); `sx1262_receive_continuous` stays in RX until `sx1262_stop_rx()`. +- `sx1262_get_packet` dequeues from the RX ring; `ESP_ERR_NOT_FOUND` when empty. + +Received packet (`sx1262_packet_t`) carries `buf[256]`, `len`, `rssi_pkt_dbm`, `snr_pkt_db`, `signal_rssi_dbm`, `has_crc_error`, and `has_header_error`. + +### CAD & Power + +```c +esp_err_t sx1262_cad_start(void); +esp_err_t sx1262_sleep(bool is_warm); +esp_err_t sx1262_wakeup(void); +esp_err_t sx1262_set_rx_duty_cycle(uint32_t rx_ms, uint32_t sleep_ms); +``` + +- `sx1262_sleep(false)` (cold start) marks the driver as needing re-init before the next TX/RX; `true` is a warm start that retains config. +- `sx1262_set_rx_duty_cycle` runs wake-on-radio (RX window then sleep window, repeating in hardware). + +### Status / Diagnostics + +```c +sx1262_state_t sx1262_get_state(void); +esp_err_t sx1262_get_status(uint8_t *out_status); +esp_err_t sx1262_get_device_errors(uint16_t *out_errors); +esp_err_t sx1262_get_rssi_inst(int16_t *out_rssi_dbm); +esp_err_t sx1262_get_stats(sx1262_stats_t *out_stats); +esp_err_t sx1262_process_irq(void); +``` + +`sx1262_get_stats` returns cumulative counters (`nb_pkt_received`, `nb_crc_error`, `nb_header_error`). `sx1262_process_irq` is called by the IRQ task when DIO1 rises; it is not for direct ISR use. + +## Chip Workarounds + +The driver applies the datasheet errata workarounds automatically: **W1** (BW500 sensitivity, before each TX), **W2** (TX clamp config, during bring-up), **W3** (implicit-header RX, when `is_implicit_hdr`), and **W4** (IQ polarity, on every `config_lora`). diff --git a/firmware_p4/components/Drivers/sx1262/README.md b/firmware_p4/components/Drivers/sx1262/README.md new file mode 100644 index 000000000..eb25d406e --- /dev/null +++ b/firmware_p4/components/Drivers/sx1262/README.md @@ -0,0 +1,7 @@ +# SX1262 LoRa Transceiver Driver + +Documentation for this component lives in the project docs hub (single source of truth): + +- [docs/sx1262/README.md](../../../../docs/sx1262/README.md) + +This file is only a pointer: edit the docs there to keep things from drifting. From 76a2b713ac54696201de6a8cf25865013347e56c Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:48 -0300 Subject: [PATCH 080/103] docs(lora): add app doc for mesh session manager, Meshtastic and MeshCore --- docs/LoRa/README.md | 244 ++++++++++++++++++ .../components/Applications/LoRa/README.md | 7 + 2 files changed, 251 insertions(+) create mode 100644 docs/LoRa/README.md create mode 100644 firmware_p4/components/Applications/LoRa/README.md diff --git a/docs/LoRa/README.md b/docs/LoRa/README.md new file mode 100644 index 000000000..a88038d35 --- /dev/null +++ b/docs/LoRa/README.md @@ -0,0 +1,244 @@ +# LoRa Application + +This component implements the LoRa mesh application layer on top of the `sx1262` driver. It hosts two full mesh protocol stacks - **Meshtastic** and **MeshCore** - behind a unified session manager, plus an **RNode**-compatible KISS modem. It also bridges a companion phone app over BLE and drives the on-device chat UI. + +## Overview + +- **Location:** `components/Applications/LoRa/` +- **Sub-modules:** `session/`, `meshtastic/`, `meshcore/`, `rnode/` +- **Radio:** single SX1262 (see `docs/sx1262/README.md`) +- **UI screens:** `components/Applications/ui/screens/lora/` +- **BLE / Wi-Fi:** terminated on the **C5 co-processor**, reached over the SPI bridge + +## Single-Owner Radio + +The SX1262 is a single-owner resource. Meshtastic, MeshCore, and RNode each register their own radio callbacks and cannot run at the same time; whichever stack starts first owns the radio. **Switching protocols requires a reboot** - there is no clean whole-stack teardown. The session manager enforces this: once a protocol is running, starting a different one is refused. + +## Split-Chip Architecture (P4 + C5) + +The design is consistent across both mesh stacks: + +- **The P4** owns the protocol logic, the radio, and the PhoneAPI/command state. +- **The C5** owns NimBLE (GATT service, pairing, CCCD subscribe) and the Wi-Fi/TCP server. + +The two communicate over the **SPI bridge**. Each mesh stack has a "phone bridge" on the P4 that: + +- Reassembles chunked StreamAPI/companion frames (`spi_mesh_chunk_hdr_t`: seq / chunk_idx / total_chunks / flags) arriving from the C5 and forwards them to the P4 PhoneAPI. +- Fragments outbound frames and pushes them to the C5. +- Polls a cached C5 status struct (`spi_mesh_status_t` / `spi_mcore_status_t`: `ble_connected`, `ble_subscribed`, `tcp_clients`, `logradio_subscribed`). +- Runs a **want-vs-actual reconcile loop** so BLE re-arms automatically after a C5 reboot. + +**"Connected" vs "linked":** `ble_connected` is the raw BLE link (true before the pairing PIN is even shown). The UI/session truth is **"linked" = subscribed after encryption** - the phone has enabled notifications on the notify characteristic (a CCCD subscribe on the C5). The session and UI gate on the *subscribed* predicate, not the *connected* one. + +## Session Manager (`session/`) + +`lora_session` is a thin, protocol-agnostic facade the chat hub reads. It never calls the SX1262 directly - each stack's `app_start` brings the radio up. The session layer: + +- Tracks which protocol owns the radio. +- Holds a **local chat ring** of 24 messages (in PSRAM), guarded by a mutex, with a monotonic sequence used by a cursor-based read API. +- Maps a unified node/contact list onto either Meshtastic's nodedb or MeshCore's contacts. +- Fronts the phone-bridge connect/subscribe state. + +### Types + +```c +typedef enum { LORA_PROTO_NONE = 0, LORA_PROTO_MESHTASTIC, LORA_PROTO_MESHCORE } lora_proto_t; +typedef struct { bool outgoing; char who[24]; char text[160]; } lora_msg_t; +typedef struct { char name[32]; int16_t rssi; float snr; } lora_node_t; +``` + +### API + +```c +esp_err_t lora_session_start(lora_proto_t proto); +lora_proto_t lora_session_active(void); +esp_err_t lora_session_send_text(const char *text); +uint16_t lora_session_msg_count(void); +uint16_t lora_session_msg_since(uint32_t *io_seq, lora_msg_t *out, uint16_t max); +uint16_t lora_session_node_count(void); +bool lora_session_node_get(uint16_t idx, lora_node_t *out); +void lora_session_on_rx_text(const char *who, const char *text); +bool lora_session_app_connected(void); +esp_err_t lora_session_app_connect(void); +``` + +- `lora_session_start` is idempotent for the same protocol; a request for a different protocol while one is running returns `ESP_ERR_INVALID_STATE`. +- `lora_session_send_text` sends a broadcast/public-channel text on the active stack (Meshtastic `0xFFFFFFFF`, MeshCore public channel `0`) and, on success, appends it to the ring as outgoing ("me"). +- `lora_session_msg_since` copies messages newer than a caller-held cursor under a single lock; passing `*io_seq == 0` snaps to the oldest retained message. +- `lora_session_on_rx_text` is called by the backend RX taps from the mesh poll task (not the LVGL thread). +- `lora_session_app_connected` maps to the active stack's **`_is_subscribed()`** predicate (linked, not merely connected). `lora_session_app_connect` maps to `_phone_bridge_ble_start()`. + +## Meshtastic Stack (`meshtastic/`) + +Entry point: `esp_err_t meshtastic_app_start(void)` (call **after** `bridge_manager_init()`). + +Bring-up derives `node_num` from the MAC, loads persisted preset/region (default LONG_FAST + US), brings up the SX1262 (region center frequency, preset SF/BW/CR), starts the IRQ task, initializes PKI (X25519 / Curve25519 via mbedTLS), the nodedb, the module hub, the mesh core, the PhoneAPI, and the phone bridge, then starts a poll task (mesh poll at 50 ms, module tick at 1 Hz) and requests C5 BLE advertising. + +### Mesh core (`meshtastic_mesh`) + +```c +esp_err_t meshtastic_mesh_init(uint32_t node_num); +esp_err_t meshtastic_mesh_start(void); +void meshtastic_mesh_stop(void); +esp_err_t meshtastic_mesh_send(const uint8_t *pb_data, uint16_t pb_len); +void meshtastic_mesh_poll(void); +esp_err_t meshtastic_mesh_send_nodeinfo(void); +esp_err_t meshtastic_mesh_send_text(const char *text, uint32_t to); +esp_err_t meshtastic_mesh_send_data(uint32_t to, uint8_t channel, uint8_t hop_limit, + uint8_t portnum, const uint8_t *payload, uint16_t plen, + uint32_t request_id, bool want_ack, bool want_response); +bool meshtastic_mesh_retry_ack(uint32_t pkt_id, bool is_implicit); +``` + +### Modules (`mt_modules` + `mt_mod_*`) + +The module hub dispatches decoded packets by portnum. Modules present: Admin, NodeInfo, Position, Text, Routing, TraceRoute, Telemetry, KeyVerify, NeighborInfo. Each exposes `_init(node_num)` and `_on_received(meta, payload, len)`; timer-driven ones add a tick. + +```c +esp_err_t mt_modules_init(uint32_t node_num); +void mt_modules_dispatch(const mt_packet_meta_t *meta, const uint8_t *data, uint16_t len); +void mt_modules_tick(void); // 1 Hz +bool mt_parse_data(const uint8_t *data, uint16_t len, uint32_t *out_portnum, + const uint8_t **out_payload, uint16_t *out_payload_len, + uint32_t *out_request_id); +``` + +Per-packet metadata (`mt_packet_meta_t`) carries `from`, `to`, `id`, `channel`, `hop_limit`, `hop_start`, `rssi_dbm`, `snr_db`, `want_ack`, `want_response`, `request_id`. + +Supporting modules: `meshtastic_nodedb` (node database, favorites/ignore/mute, next-hop learning), `meshtastic_channels` (channel PSKs and hashes), `meshtastic_pki` / `meshtastic_crypto_pki` (Curve25519 encrypt/decrypt), `meshtastic_pkt_history` (dedup / relayer tracking), `meshtastic_mqtt`, `meshtastic_wifi`, `meshtastic_regions`, `meshtastic_presets`, `meshtastic_roles`, plus vendored `unishox2` text compression. + +### Traceroute (`mt_mod_traceroute`) + +A traceroute request is a zero-payload Data packet on the TraceRoute port with `want_response` set. + +```c +#define MT_TRACE_MAX_HOPS 8 +void mt_mod_traceroute_init(uint32_t node_num); +void mt_mod_traceroute_on_received(const mt_packet_meta_t *meta, const uint8_t *payload, uint16_t len); +void mt_mod_traceroute_start(uint32_t to); +bool mt_mod_traceroute_is_pending(void); +bool mt_mod_traceroute_get_result(uint32_t *out_hops, int *out_count, uint32_t *out_target); +``` + +- `mt_mod_traceroute_start(to)` marks a pending request, clears any prior result, and sends the request via `meshtastic_mesh_send_data(...)`. +- `mt_mod_traceroute_on_received` decodes the `RouteDiscovery` protobuf hop list. If it matches the pending request (reply addressed to us, from the target), the hops are captured into module-static state and `_get_result` reports them. If this node is itself the request destination, it appends its own node number to the route and sends the reply. Non-terminal hop forwarding relies on the mesh core's flood rebroadcast. +- There is no dedicated result struct; results are returned through the out-parameters of `mt_mod_traceroute_get_result` and held internally until the next request. The traceroute screen is `lora_traceroute_ui`. + +### PhoneAPI (`meshtastic_phoneapi`) + +Implements the official PhoneAPI handshake as a state machine (`phoneapi_state_t`: MyInfo -> Metadata -> DeviceUIConfig -> Channels -> Config -> ModuleConfig -> FileManifest -> own NodeInfo -> other NodeInfos -> complete-id -> packets). + +```c +esp_err_t phoneapi_init(uint32_t node_num); +esp_err_t phoneapi_on_toradio(const uint8_t *pb_data, uint16_t pb_len); +uint16_t phoneapi_poll_fromradio(uint8_t *out_buf, uint16_t max_len); +bool phoneapi_has_data(void); +void phoneapi_push_packet(const uint8_t *mp_bytes, uint16_t mp_len); +void phoneapi_disconnect(void); +``` + +### BLE phone-app connectivity + +On the P4, `meshtastic_ble` is a thin shim forwarding to `meshtastic_phone_bridge`; the real NimBLE host and GATT service run on the C5. + +```c +esp_err_t meshtastic_phone_bridge_init(void); +esp_err_t meshtastic_phone_bridge_ble_start(void); +esp_err_t meshtastic_phone_bridge_ble_stop(void); +bool meshtastic_phone_bridge_is_connected(void); // ble_connected || tcp_clients +bool meshtastic_phone_bridge_is_subscribed(void); // ble_subscribed || tcp_clients +``` + +- **NimBLE arbitration:** the P4 never owns NimBLE. `_ble_start()` sends a BLE-init request to the C5 over the SPI bridge; a notify task reconciles desired vs actual C5 state (re-arming BLE after a C5 reboot) and polls status. Because only one LoRa stack runs at a time, only one bridge ever issues BLE-init; cross-app BLE arbitration (mesh vs host-link vs HID) lives on the C5, which avoids tearing NimBLE out from under an active app. +- **Pairing PIN:** for Meshtastic the passkey is generated randomly on the C5 per pairing (display-only IO capability, MITM + bonding) and logged there. It is **not** shown on the P4 chat screen. +- **Linked-on-subscribe gating:** `_is_connected()` is true at the raw BLE link; `_is_subscribed()` is true only after the phone subscribes (CCCD notify enabled on the FromNum characteristic, after encryption). Fromradio data is only pushed to the phone while a BLE client is connected or a TCP client is present. + +Other module surfaces (used by the UI/config screens): `meshtastic_mqtt` (`_init/_publish/_is_connected`), `meshtastic_wifi`, region/preset/role selection (`mt_region_*`, `mt_preset_*`, `mt_role_*` with `MT_ROLE_ROUTER` / `MT_ROLE_CLIENT`). + +## MeshCore Stack (`meshcore/`) + +Entry point: `esp_err_t meshcore_app_start(void)` (call **after** `bridge_manager_init()`). + +Bring-up initializes libsodium, brings up the SX1262 with MeshCore defaults (915 MHz, SF10, BW 250 kHz, CR 4/5, +20 dBm, preamble 8), loads or creates an Ed25519 identity (32-byte seed persisted in NVS, default node name "Highboy"), initializes the core with five router callbacks, the companion PhoneAPI, and the phone bridge, then starts a poll task (50 ms) and requests C5 BLE advertising. + +The five router callbacks bridge radio events to both the phone and the local ring: new advert, group text (`lora_session_on_rx_text("ch%u", ...)`), direct message (`lora_session_on_rx_text(contact-name or "dm", ...)`), ACK confirmation, and path update. + +### Core (`meshcore`) + +Constants include `MESHCORE_MAX_CONTACTS 32`, `MESHCORE_MAX_CHANNELS 8`, `MESHCORE_PUBLIC_CHANNEL 0`, `MESHCORE_TEXT_MAX 160`. Key surface used by the app/session: + +- `meshcore_init`, `meshcore_start` / `_stop` / `_poll` +- `meshcore_set_node_name`, `meshcore_set_advert_latlon`, `meshcore_send_advert` / `_throttled` (10 s cooldown) +- `meshcore_channel_get` / `_set`, `meshcore_send_grp_txt(channel_idx, text)` +- Contacts: `meshcore_contacts_array`, `meshcore_contacts_count`, `meshcore_contact_find` / `_find_by_hash` / `_upsert` / `_remove` / `_reset_path` +- `meshcore_send_direct_msg(peer_pub_key, text, timestamp, attempt, out_expected_ack)` - X25519 ECDH + AES-128 + HMAC-SHA256 +- `meshcore_set_radio_params` / `_get_radio_prefs`, `meshcore_set_unix_time` / `_get_unix_time`, `meshcore_set_relay` / `_get_relay` + +Identity/contact/channel structs (`meshcore_identity_t`, `meshcore_contact_t`, `meshcore_channel_t`) are defined in `meshcore.h`. + +### Companion PhoneAPI (`meshcore_phoneapi`) + +Unlike Meshtastic's FSM, the outbound path is a **registered callback** invoked synchronously from command handlers and push helpers. + +```c +esp_err_t meshcore_phoneapi_init(void); // loads/generates the 6-digit PIN from NVS +void meshcore_phoneapi_set_outbound(meshcore_phoneapi_outbound_cb_t cb, void *ctx); +uint32_t meshcore_phoneapi_get_pin(void); // 6-digit BLE pairing PIN +void meshcore_phoneapi_on_disconnect(void); +void meshcore_phoneapi_on_inbound(const uint8_t *buf, uint16_t len); // dispatches CMD_* opcodes +void meshcore_phoneapi_push_new_advert(const meshcore_contact_t *contact); +void meshcore_phoneapi_push_channel_msg(uint8_t ch, uint8_t path_len, uint32_t ts, int8_t snr, const char *text); +void meshcore_phoneapi_push_contact_msg(const uint8_t peer_pub_key[32], uint8_t path_len, + uint8_t txt_type, uint32_t ts, int8_t snr, const char *text); +void meshcore_phoneapi_push_send_confirmed(uint32_t ack_crc, uint8_t snr); +void meshcore_phoneapi_push_path_updated(const meshcore_contact_t *contact); +``` + +### Phone bridge (`meshcore_phone_bridge`) + +```c +esp_err_t meshcore_phone_bridge_init(const char *name_prefix); // NULL -> "Highboy-MC" +void meshcore_phone_bridge_stop(void); +esp_err_t meshcore_phone_bridge_ble_start(void); +esp_err_t meshcore_phone_bridge_ble_stop(void); +bool meshcore_phone_bridge_is_connected(void); // ble_connected +bool meshcore_phone_bridge_is_subscribed(void); // ble_subscribed +``` + +Same C5-terminated model as Meshtastic (chunked reassembly, status polling task, reconcile loop that survives C5 reboots). Two differences worth noting: + +- **Pairing PIN:** MeshCore uses a **fixed, device-persisted 6-digit PIN** (from `meshcore_phoneapi_get_pin()`), passed to the C5 at BLE-init and injected on the passkey-display event. This PIN **is** rendered on the P4 chat connect screen. +- **Linked-on-subscribe gating:** `ble_connected` flips at the raw link; `ble_subscribed` flips only after encryption and the app subscribing to the notify characteristic (CCCD subscribe on the TX characteristic, on the C5). + +## Chat UI (`ui/screens/lora/`) + +`lora_chat_ui` is a single-screen state machine. + +```c +void ui_lora_chat_open(void); // opens on the protocol picker +void ui_lora_chat_open_chat(void); // opens directly on the chat conversation +``` + +Views: **Protocol picker** (MeshCore / Meshtastic) -> **Home** -> { Connect App, Nodes, Chat, Configs }. Home also links out to the sibling screens: Channels, Position, Telemetry, Secure DM, Traceroute (each its own screen under `ui/screens/lora/`). + +- **Home** shows region + preset (Meshtastic only) and a status banner driven by the linked state. +- **Nodes** shows either a radial "map" of node pins with RSSI-colored links or a scrolling list, both fed by `lora_session_node_count()` / `lora_session_node_get()`. +- **Chat** renders message bubbles ("MESH BROADCAST" for Meshtastic, "PUBLIC CHANNEL" for MeshCore). An LVGL timer drains new messages every 500 ms via `lora_session_msg_since(...)`; the on-screen keyboard submits through `lora_session_send_text(...)`. +- **Configs** (Meshtastic only) offers Region / Preset selectors and a Router-mode toggle. +- **Connect** calls `lora_session_app_connect()`, polls `lora_session_app_connected()` every second, and shows the pairing PIN (MeshCore only). + +Starting a protocol runs `lora_session_start(proto)` on a background task pinned to the radio core; if a different protocol already owns the radio the UI prompts to reboot to switch. + +## RNode Modem (`rnode/`) + +`rnode/` shares the SX1262 driver but is **not** a mesh protocol - it is an **RNode-compatible KISS/serial modem** (Reticulum RNode firmware emulation, reporting v1.52). A host running Reticulum drives the radio over KISS-framed serial. It is mutually exclusive with the mesh stacks (same single-owner radio), but it is started independently of `lora_session` (it is not one of the `lora_proto_t` values). + +```c +esp_err_t rnode_init(const sx1262_hal_t *hal); // KISS engine + serial + SX1262 hookup +esp_err_t rnode_start(void); // IRQ task + continuous RX +void rnode_poll(void); // drains serial, runs KISS decoder, dispatches +const rnode_radio_cfg_t *rnode_get_radio_cfg(void); +const rnode_stats_t *rnode_get_stats(void); +``` + +Defaults: 915 MHz, BW 125 kHz, SF8, CR 4/5, +17 dBm. The on-device screen is `lora_rnode_ui`. diff --git a/firmware_p4/components/Applications/LoRa/README.md b/firmware_p4/components/Applications/LoRa/README.md new file mode 100644 index 000000000..67f10556a --- /dev/null +++ b/firmware_p4/components/Applications/LoRa/README.md @@ -0,0 +1,7 @@ +# LoRa Application + +Documentation for this component lives in the project docs hub (single source of truth): + +- [docs/LoRa/README.md](../../../../docs/LoRa/README.md) + +This file is only a pointer: edit the docs there to keep things from drifting. From c9d706c389e542c09d51e05fd01708f25fcccdeb Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:48 -0300 Subject: [PATCH 081/103] docs(subghz): fix spectrum task priority and note RX LED signalling --- docs/SubGhz/README.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/docs/SubGhz/README.md b/docs/SubGhz/README.md index e8b2c7376..87535b93b 100644 --- a/docs/SubGhz/README.md +++ b/docs/SubGhz/README.md @@ -60,6 +60,8 @@ Captures RF signals via the CC1101 GDO0 pin routed to the ESP32 RMT RX periphera 4. **SCAN mode:** Protocol registry tries all decoders -> Analyzer for unknowns 5. **RAW mode:** Direct save to storage +**LED feedback:** The RX pipeline drives the status LED as it processes signals: `led_signal_info()` fires when a known protocol is decoded, and `led_signal_warning()` fires when RF is captured but no registered protocol matches. + #### API ```c @@ -120,7 +122,7 @@ void subghz_spectrum_start(uint32_t center_freq, uint32_t span_hz); void subghz_spectrum_stop(void); bool subghz_spectrum_get_line(subghz_spectrum_line_t *out_line); ``` -- Task stack: 4096 bytes, priority 1, Core 1. +- Task stack: 4096 bytes, Core 1. Priority comes from `sys_prio.h`: the `SYS_PRIO_BACKGROUND_LO` band (lowest non-idle background work), so the sweep never contends with the renderer or latency-sensitive services. - Thread-safe reads via `subghz_spectrum_get_line`. ### Signal Analyzer (`subghz_analyzer`) From 127e8796ff1422e2a96f2c91d981dd9807490e4e Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:48 -0300 Subject: [PATCH 082/103] docs(gameboy): add Game Boy emulator and ROM picker documentation --- docs/gameboy/README.md | 166 ++++++++++++++++++ .../components/Applications/gameboy/README.md | 7 + 2 files changed, 173 insertions(+) create mode 100644 docs/gameboy/README.md create mode 100644 firmware_p4/components/Applications/gameboy/README.md diff --git a/docs/gameboy/README.md b/docs/gameboy/README.md new file mode 100644 index 000000000..33337bb9e --- /dev/null +++ b/docs/gameboy/README.md @@ -0,0 +1,166 @@ +# Game Boy Emulator Application + +This component is a Game Boy (DMG) emulator built on the single-header +[Peanut-GB](https://github.com/deltabeard/Peanut-GB) core plus a HighBoy +platform layer. It runs `.gb` / `.gbc` ROMs from the SD card, takes over the +ST7789 panel in landscape, plays audio through the I2S codec, and persists +battery-backed cartridge RAM back to the SD card. It is reached from the games +menu through a ROM picker screen. + +## Overview + +- **Emulator location:** `components/Applications/gameboy/` +- **ROM picker location:** `components/Applications/ui/screens/games/gb_ui.c` +- **Core:** Peanut-GB (`peanut_gb.h`, single-header) + `minigb_apu` (APU) +- **Dependencies:** `Drivers`, `Service`, `lvgl`, `esp_lcd`, `esp_timer`, `esp_system`, `driver` +- **Build flags:** `ENABLE_SOUND=1`, `MINIGB_APU_AUDIO_FORMAT_S16SYS`, compiled `-O2 -w` +- **Native GB resolution:** 160 x 144 (`LCD_WIDTH` x `LCD_HEIGHT`) +- **Output resolution:** 320 x 240 (full screen, landscape) + +## Architecture + +``` +┌──────────────────────────────────────────────────────────┐ +│ ROM Picker (gb_ui.c) │ +│ Scans SD recursively, lists ROMs, launches emulator, │ +│ polls highboy_gb_finished(), restores panel + returns │ +└───────────────────────────┬──────────────────────────────┘ + │ highboy_gb_start(path) + ▼ +┌──────────────────────────────────────────────────────────┐ +│ HighBoy Platform (gb_highboy.c) │ +│ │ +│ ┌────────────┐ ┌──────────────┐ ┌────────────────┐ │ +│ │ gb_main │ │ Peanut-GB │ │ gb_audio │ │ +│ │ task │──▶│ core │ │ task │ │ +│ │ (SYS_CORE_ │ │ (peanut_gb.h)│ │ (SYS_CORE_ │ │ +│ │ UI) │ └──────┬───────┘ │ RADIO) │ │ +│ └─────┬──────┘ │ └───────┬────────┘ │ +│ │ rom/cram callbacks │ │ +│ ▼ ▼ ▼ │ +│ ┌──────────┐ ┌────────────────┐ ┌────────────────┐ │ +│ │ scale + │ │ CRAM save/load │ │ minigb_apu │ │ +│ │ blit │ │ .sav (SD) │ │ 32768 Hz stereo│ │ +│ │ (strips) │ └────────────────┘ │ -> mono I2S │ │ +│ └────┬─────┘ └────────────────┘ │ +└───────┼──────────────────────────────────────────────────┘ + ▼ + ST7789 panel (esp_lcd_panel_draw_bitmap, under LVGL lock) +``` + +## ROM Picker (`gb_ui.c`) + +`ui_gb_open()` builds an LVGL list of the ROMs found on the SD card. + +- **Where ROMs come from:** `scan_dir()` walks `/sdcard` recursively to a depth + of `MAX_DEPTH` (3), collecting up to `MAX_ROMS` (64) files whose name ends in + `.gb` or `.gbc` (case-insensitive). Dot-files are skipped. Path and name + tables live in PSRAM (`EXT_RAM_BSS_ATTR`). +- **Navigation:** a repeating LVGL timer (`NAV_MS` = 80 ms) reads buttons. UP / + DOWN move the selection, OK launches the highlighted ROM, BACK / LEFT return + to `SCREEN_GAMES_MENU`. With no ROMs found, the screen shows a "copy games + anywhere on the SD card" message. +- **Launch / return handshake:** OK calls `highboy_gb_start(path)` and sets a + `launched` flag. The nav timer then polls `highboy_gb_finished()`; once the + emulator has torn down it restores the panel orientation + (`lcd_set_rotation(lcd_get_rotation())`) and switches back to the games menu - + no firmware reboot. + +## Emulator Core (`gb_highboy.c`) + +### Public API (`gb_highboy.h`) + +```c +void highboy_gb_start(const char *rompath); +bool highboy_gb_finished(void); +``` + +- `highboy_gb_start` resets state and spawns the emulator task. `rompath` is the + full SD path of the ROM, or `NULL`/`""` to auto-discover the first ROM. +- `highboy_gb_finished` returns `true` only once the task has fully torn down and + released the panel; it is polled by the ROM picker. + +### Tasks + +| Task | Stack | Priority | Core | +|------|-------|----------|------| +| `gameboy` (main loop) | 32768 | `SYS_PRIO_SERVICE_HI` | `SYS_CORE_UI` | +| `gb_audio` | 4096 | `SYS_PRIO_SERVICE_HI` | `SYS_CORE_RADIO` | + +Both tasks and their buffers are created with `MALLOC_CAP_SPIRAM` caps. + +### ROM loading and save RAM + +- If no path was supplied, `find_gb_rom()` scans `/sdcard`, `/sdcard/gb`, and + `/sdcard/roms` for the first `.gb`/`.gbc` file. +- The full ROM is read into PSRAM. `gb_init()` wires the `rom_read` / `cram_read` + / `cram_write` callbacks. +- Cartridge RAM size comes from `gb_get_save_size_s()`. The save file path is the + ROM path with its extension replaced by `.sav`, next to the ROM on the SD card. + CRAM is loaded on start (size must match or it is ignored) and written back + whenever it has been dirty for `GB_AUTOSAVE_MS` (3 s), plus once more on exit. + +### Display integration + +- The GB frame is written by the core into an 8-bit shade buffer + (160 x 144, PSRAM). The DMG palette is four classic greens + (`0xE0F8D0`, `0x88C070`, `0x346856`, `0x081820`) converted to big-endian + RGB565 (`to565be`). +- Scaling to 320 x 240 is nearest-neighbor via precomputed `s_sx` / `s_sy` + lookup tables (no interpolation). +- Output is pushed in 24-row strips (`GB_STRIP_ROWS`) through + `esp_lcd_panel_draw_bitmap()`, each strip followed by `lvgl_glue_wait_flush()`. +- The emulator takes exclusive control of the panel: it holds the LVGL lock + (`lvgl_glue_lock(-1)`), enters direct-draw mode (`lvgl_glue_direct_begin()`), + and rotates to landscape with `esp_lcd_panel_swap_xy(true)` + + `esp_lcd_panel_mirror(true, false)`. The strip DMA buffer is the only buffer in + internal DMA RAM (`MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL`). +- `ui_render_beat_kick()` is called every loop iteration so `sys_monitor` sees + the render path as alive while the standard LVGL render loop is suspended. + +### Audio integration + +- `minigb_apu` renders at `AUDIO_SAMPLE_RATE` (32768 Hz). The `gb_audio` task + pulls stereo interleaved samples, downmixes to mono, and writes them to the + I2S stream (`audio_i2s_stream_*`). Sample buffers are allocated in PSRAM. +- If the APU or its buffers cannot be allocated, the emulator runs silently. + +### Frame pacing + +The loop targets 60 fps (`GB_FRAME_US`). When it falls behind it sets the core's +`frame_skip` and skips the blit; a blit happens at most once every two frames +(so the panel refresh is capped near 30 fps). If it drifts more than +`GB_RESYNC_US` (250 ms) behind, the frame clock is resynced. + +### Controls / input mapping + +Input is polled from the GPIO buttons each frame. Because the panel is rotated +to landscape, the D-pad is remapped accordingly: + +| Physical button | Game Boy input | +|-----------------|----------------| +| RIGHT | D-pad UP | +| LEFT | D-pad DOWN | +| UP | D-pad LEFT | +| DOWN | D-pad RIGHT | +| OK | A | +| BACK | B | +| OK + BACK | START | +| hold BACK ~1.2 s | exit emulator | + +### Teardown + +On exit the task saves CRAM, stops the audio task and I2S stream, drains DMA, +frees all buffers, leaves direct-draw mode, sets the finished flag, releases the +LVGL lock, and deletes itself. If the core buffers cannot be allocated at start, +the task calls `esp_restart()` rather than continuing. + +## Performance / PSRAM notes + +- ROM image, the `gb_s` state struct, the shade framebuffer, the APU context, and + cartridge RAM all live in PSRAM (`MALLOC_CAP_SPIRAM`); only the 320 x 24 strip + buffer is in internal DMA RAM. +- The core is performance-critical, so the whole component is built at `-O2` with + warnings silenced (`-w`). +- The main task uses a large 32 KB stack; the emulator pins to the UI core and + the audio task to the radio core (see `sys_prio.h`). diff --git a/firmware_p4/components/Applications/gameboy/README.md b/firmware_p4/components/Applications/gameboy/README.md new file mode 100644 index 000000000..f76616af1 --- /dev/null +++ b/firmware_p4/components/Applications/gameboy/README.md @@ -0,0 +1,7 @@ +# Game Boy Emulator Application + +Documentation for this component lives in the project docs hub (single source of truth): + +- [docs/gameboy/README.md](../../../../docs/gameboy/README.md) + +This file is only a pointer: edit the docs there to keep things from drifting. From e50b61010a8fceadfaab4d90574fe0c3fe064b98 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:42:48 -0300 Subject: [PATCH 083/103] docs(nfc): add NFC app doc covering the stack and the simulation UI --- docs/nfc/README.md | 209 ++++++++++++++++++ .../components/Applications/nfc/README.md | 7 + 2 files changed, 216 insertions(+) create mode 100644 docs/nfc/README.md create mode 100644 firmware_p4/components/Applications/nfc/README.md diff --git a/docs/nfc/README.md b/docs/nfc/README.md new file mode 100644 index 000000000..2f620115d --- /dev/null +++ b/docs/nfc/README.md @@ -0,0 +1,209 @@ +# NFC Application + +The NFC feature has two halves in the tree: + +1. A complete ST25R3916-based NFC stack under + `components/Applications/nfc/` (manager, scanner, reader, listener, device / + store persistence, and a full protocol tree), talking to the + `st25r3916` driver (`components/Drivers/st25r3916/`, "HighBoy NFC"). +2. An on-device UI suite under `components/Applications/ui/screens/nfc/`. + +**Important:** the shipping UI currently runs as a **simulation**. As documented +in `nfc_sim.h`, the ST25R3916 shares the SPI3 bus whose MISO line is tied to +LCD-RST by a board jumper and cannot be read reliably, so the NFC screens use a +faithful simulation model (`nfc_sim`) instead of driving the radio. The protocol +stack and driver are compiled and complete, but the current screens do not call +them (the only wiring is a defensive `nfc_manager_stop` close-hook registered in +`ui_manager.c`). + +## Overview + +- **App location:** `components/Applications/nfc/` +- **UI location:** `components/Applications/ui/screens/nfc/` +- **Driver:** `components/Drivers/st25r3916/` (`highboy_nfc_*`) +- **Target IC:** ST25R3916 / ST25R3916B (SPI mode 1, clock <= 6 MHz) +- **Simulation model:** `ui/screens/nfc/nfc_sim.c` (saved library persisted in NVS) + +## Architecture + +``` +┌──────────────────────────────────────────────────────────┐ +│ UI suite (ui/screens/nfc/*) │ +│ Menu + Read / Identify / Emulate / Write / Saved / │ +│ Config / per-family detail screens │ +│ event-driven input, rotation-aware layout │ +│ │ │ +│ ▼ (currently) nfc_sim model + NVS │ +│ ┌───────────────────────────┐ │ +│ │ nfc_sim: card model + │ │ +│ │ saved library (NVS) │ │ +│ └───────────────────────────┘ │ +└──────────────────────────────────────────────────────────┘ + · · · · · · (not wired in current UI) · · · · · · · · · +┌──────────────────────────────────────────────────────────┐ +│ NFC stack (Applications/nfc/) │ +│ manager (state machine + scan task) │ +│ scanner · reader · listener (emulation) │ +│ device / store (NVS card profiles + entries) │ +│ protocols/ (see table below) │ +└───────────────────────────┬──────────────────────────────┘ + ▼ +┌──────────────────────────────────────────────────────────┐ +│ st25r3916 driver (highboy_nfc, SPI2/SPI3) │ +│ core · fifo · irq · aat + HAL (gpio / spi / timer) │ +└──────────────────────────────────────────────────────────┘ +``` + +## UI Suite (`ui/screens/nfc/`) + +`ui_nfc_menu_open()` (`nfc_menu_ui.c`) builds the NFC menu. Selecting an item +switches to the matching screen via the `screen_id_t` enum in `ui_manager.h`. + +| Menu item | Screen | File | +|-----------|--------|------| +| READ TAGS | `SCREEN_NFC_READ` | `nfc_read_ui.c` | +| SCAN / IDENTIFY | `SCREEN_NFC_SCAN` | `nfc_scan_ui.c` | +| EMULATE | `SCREEN_CARD_EMU` | `card_emu_ui.c` | +| WRITE | `SCREEN_NFC_WRITE` | `nfc_write_ui.c` | +| CONFIGURATIONS | `SCREEN_NFC_CONFIG` | `nfc_config_ui.c` | +| SAVED | `SCREEN_NFC_SAVED` | `nfc_saved_ui.c` | +| BANK CARD | `SCREEN_NFC_BANKCARD` | `nfc_bankcard_ui.c` | +| DESFIRE | `SCREEN_NFC_DESFIRE` | `nfc_desfire_ui.c` | +| NFC-V / 15693 | `SCREEN_NFC_ISO15693` | `nfc_iso15693_ui.c` | +| ULTRALIGHT/NTAG | `SCREEN_NFC_ULTRALIGHT` | `nfc_ultralight_ui.c` | +| NDEF | `SCREEN_NFC_NDEF` | `nfc_ndef_ui.c` | +| FELICA | `SCREEN_NFC_FELICA` | `nfc_felica_ui.c` | +| SHARE (P2P) | `SCREEN_NFC_P2P` | `nfc_p2p_ui.c` | +| KEY DICTIONARY | `SCREEN_NFC_KEYDICT` | `nfc_keydict_ui.c` | + +There is also a dedicated emulate screen (`nfc_emulate_ui.c`, +`SCREEN_NFC_EMULATE`) reached from the read flow. All of these screens are driven +by the `nfc_sim` model and LVGL animations; none currently drive the ST25R3916. + +### Event-driven input + +Each screen registers a handler with `ui_input_set_screen_handler()` and reacts +to `input_event_t` events (`INPUT_ACTION_PRESS` / `INPUT_ACTION_REPEAT` for +`INPUT_BTN_UP/DOWN/LEFT/RIGHT/OK/BACK`). The central input pump only calls a +handler while input is unlocked and no modal overlay is up, so screens carry no +per-frame edge-detection of their own. Held UP/DOWN auto-scroll via the REPEAT +action. + +### Rotation-aware layout + +Screens size and place elements with the live logical dimensions from +`ui_metrics.h` (`ui_screen_w()` / `ui_screen_h()`), which follow +`lv_display_set_rotation` rather than the fixed 240 x 320 panel constants, so the +layout survives rotation (e.g. the read screen clamps its dump-list Y against +`ui_screen_h()` and the footer height). + +### Shared visual kit (`nfc_ui_common`) + +`nfc_ui_common.h` provides the common look used by Read / Saved / Write / +Emulate: an accent header + underline (`nfc_ui_header`), a credit-card-style +panel that renders a card (`nfc_ui_card_panel`), an expanding concentric-ring +"broadcasting field" animation (`nfc_ui_field_create` / `nfc_ui_field_tick`), and +fire-and-forget speaker cues (`nfc_ui_play_sound`: a rising blip on tag found, a +tick on save). The Identify screen animates a per-technology checklist +(NFC-A / NFC-B / NFC-F / NFC-V). + +### Simulation model (`nfc_sim`) + +`nfc_sim.c` is the shared card record (`nfc_sim_card_t`: name, type, UID, ATQA, +SAK) plus a saved "library" (up to `NFC_SIM_MAX_SAVED` = 16 cards) persisted in +NVS and seeded with presets on first run. It can synthesize a random discovered +tag (`nfc_sim_random_card`), build a card from a specific template +(`nfc_sim_make_card`), and format UIDs as `DE:AD:BE:EF`. + +## NFC Stack (`Applications/nfc/`) + +The stack is a full reader/emulator implementation that targets the ST25R3916. + +### Manager (`nfc_manager`) + +A scan-task state machine over the driver: + +```c +typedef enum { + NFC_MANAGER_STATE_IDLE, NFC_MANAGER_STATE_SCANNING, + NFC_MANAGER_STATE_READING, NFC_MANAGER_STATE_EMULATING, + NFC_MANAGER_STATE_ERROR, NFC_MANAGER_STATE_COUNT +} nfc_manager_state_t; + +hb_nfc_err_t nfc_manager_start(nfc_manager_card_found_cb_t cb, void *ctx); +void nfc_manager_stop(void); +nfc_manager_state_t nfc_manager_get_state(void); +``` + +Hardware must be pre-initialized with `highboy_nfc_init()`. The card-found +callback delivers an `hb_nfc_card_data_t`. + +### Scanner / Reader / Listener + +- `nfc_scanner` (`nfc_scanner_alloc/start/stop`) polls the field and reports the + detected protocol list (`nfc_scanner_event_t`, up to + `NFC_SCANNER_MAX_PROTOCOLS` = 4). +- `nfc_reader` implements the concrete read/write flows: + `mf_classic_read_full()` (dumps all sectors into the global emulation card + `s_emu_card`), `mf_classic_write_all()` (writes data blocks back, trailers + guarded), `mfp_probe_and_dump()` (MIFARE Plus), `mful_dump_card()` + (Ultralight), and `t4t_dump_ndef()` (Type 4 NDEF). +- `nfc_listener` starts card emulation from generic card data + (`nfc_listener_start`) or from a pre-loaded MIFARE Classic dump + (`nfc_listener_start_emu`). + +### Persistence (`nfc_device`, `nfc_store`) + +- `nfc_device` stores MIFARE Classic card profiles (with keys) in NVS namespace + `nfc_cards`, up to `NFC_DEVICE_MAX_PROFILES` (8), with an active-profile + selector for emulation and legacy generic-card wrappers. +- `nfc_store` stores generic card entries (name, protocol, UID, ATQA, SAK, and a + protocol-specific payload up to `NFC_STORE_PAYLOAD_MAX` = 2048 B) in NVS, up to + `NFC_STORE_MAX_ENTRIES` (16), plus NTAG/Ultralight pack/unpack helpers. + +### Card families / protocols (`protocols/`) + +| Family | Directory | Notes | +|--------|-----------|-------| +| Common | `common/` | APDU, crypto, RF, tag, ISO-DEP TCL layer | +| ISO 14443-A | `iso14443a/` | anti-collision, ISO-DEP, poller, NDEF, T4T + T4T emulation | +| ISO 14443-B | `iso14443b/` | reader + emulation | +| ISO 15693 (NFC-V) | `iso15693/` | reader + emulation | +| FeliCa (NFC-F) | `felica/` | reader + emulation | +| EMV | `emv/` | bank card / payment applications | +| LLCP / SNEP | `llcp/` | NFC P2P link + SNEP exchange | +| MIFARE | `mifare/` | Classic (+ emu, + writer), Ultralight, Plus, DESFire (+ emu), crypto1, nested attack (`mf_nested`), `mfkey`, key cache, key dictionary loader, known cards | +| Topaz / Type 1 | `t1t/` | Type 1 tag | +| Type 2 | `t2t/` | Type 2 tag emulation | + +The supported protocol identifiers are enumerated in +`highboy_nfc_protocol_t` (`highboy_nfc_types.h`): ISO14443-3A/-3B/-4A/-4B, +FeliCa, ISO15693, MIFARE Classic / Ultralight / Plus / DESFire, ST25TB, and SLIX. + +### Key dictionaries (`assets/nfc/dict/`) + +MIFARE key dictionaries shipped as assets and loaded by `nfc_dict_loader`: +`mf_classic_default.dic`, `mf_classic_user.dic` (Classic key A/B lists) and +`mf_ulc_default.dic` (Ultralight-C keys). + +## Driver: HighBoy NFC (`st25r3916`) + +`highboy_nfc.h` is the driver front end for the ST25R3916 / ST25R3916B: + +```c +esp_err_t highboy_nfc_init(const highboy_nfc_config_t *config); +void highboy_nfc_deinit(void); +esp_err_t highboy_nfc_ping(uint8_t *out_chip_id); +esp_err_t highboy_nfc_field_on(void); +esp_err_t highboy_nfc_field_off(void); +uint8_t highboy_nfc_measure_amplitude(void); +bool highboy_nfc_field_detected(uint8_t *out_aux_display); +``` + +- Configuration is a `highboy_nfc_config_t` (SPI pins, host, mode 1, clock). + `HIGHBOY_NFC_CONFIG_DEFAULT()` provides the ESP32-P4 reference wiring. +- The driver is split into `st25r3916_core.c`, `st25r3916_fifo.c`, + `st25r3916_irq.c`, `st25r3916_aat.c` (antenna auto-tuning) and a HAL layer + (`hal/hb_nfc_gpio.c`, `hb_nfc_spi.c`, `hb_nfc_timer.c`). +- Capacity constants live in `highboy_nfc_types.h` (UID up to 10 bytes for + triple cascade, ATS up to 64 bytes, 512-byte hardware FIFO). diff --git a/firmware_p4/components/Applications/nfc/README.md b/firmware_p4/components/Applications/nfc/README.md new file mode 100644 index 000000000..1e4fb31e7 --- /dev/null +++ b/firmware_p4/components/Applications/nfc/README.md @@ -0,0 +1,7 @@ +# NFC Application + +Documentation for this component lives in the project docs hub (single source of truth): + +- [docs/nfc/README.md](../../../../docs/nfc/README.md) + +This file is only a pointer: edit the docs there to keep things from drifting. From 05407be28608c2fd9016895d3bb8d4bbba6648db Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:43:04 -0300 Subject: [PATCH 084/103] docs(drivers): add docs for bq25896, led, i2c_init, pins, drv2605l, audio_i2s and ys_rfid2 --- docs/audio_i2s/README.md | 151 ++++++++++++ docs/bq25896/README.md | 172 +++++++++++++ docs/drv2605l/README.md | 84 +++++++ docs/i2c_init/README.md | 107 +++++++++ docs/led/README.md | 158 ++++++++++++ docs/pins/README.md | 128 ++++++++++ docs/ys_rfid2/README.md | 227 ++++++++++++++++++ .../components/Drivers/i2c_init/README.md | 7 + firmware_c5/components/Drivers/led/README.md | 7 + firmware_c5/components/Drivers/pins/README.md | 7 + .../components/Drivers/audio_i2s/README.md | 7 + .../components/Drivers/bq25896/README.md | 7 + .../components/Drivers/drv2605l/README.md | 7 + .../components/Drivers/i2c_init/README.md | 7 + firmware_p4/components/Drivers/led/README.md | 7 + firmware_p4/components/Drivers/pins/README.md | 7 + .../components/Drivers/ys_rfid2/README.md | 7 + 17 files changed, 1097 insertions(+) create mode 100644 docs/audio_i2s/README.md create mode 100644 docs/bq25896/README.md create mode 100644 docs/drv2605l/README.md create mode 100644 docs/i2c_init/README.md create mode 100644 docs/led/README.md create mode 100644 docs/pins/README.md create mode 100644 docs/ys_rfid2/README.md create mode 100644 firmware_c5/components/Drivers/i2c_init/README.md create mode 100644 firmware_c5/components/Drivers/led/README.md create mode 100644 firmware_c5/components/Drivers/pins/README.md create mode 100644 firmware_p4/components/Drivers/audio_i2s/README.md create mode 100644 firmware_p4/components/Drivers/bq25896/README.md create mode 100644 firmware_p4/components/Drivers/drv2605l/README.md create mode 100644 firmware_p4/components/Drivers/i2c_init/README.md create mode 100644 firmware_p4/components/Drivers/led/README.md create mode 100644 firmware_p4/components/Drivers/pins/README.md create mode 100644 firmware_p4/components/Drivers/ys_rfid2/README.md diff --git a/docs/audio_i2s/README.md b/docs/audio_i2s/README.md new file mode 100644 index 000000000..fdc309311 --- /dev/null +++ b/docs/audio_i2s/README.md @@ -0,0 +1,151 @@ +# Audio I2S Driver (P4) + +This component drives the on-board audio path of the HighBoy V2 (ESP32-P4 firmware only): a class-D speaker amplifier for playback (TX) and a PDM microphone for capture (RX), both on a single I2S port. It owns one persistent TX channel used for UI chimes, tones, melodies, raw PCM and continuous streaming, and opens independent PDM-RX channels for mic recording and live streaming. + +## Overview + +- **Location:** `firmware_p4/components/Drivers/audio_i2s/` +- **Header:** `include/audio_i2s.h` +- **Firmware:** `firmware_p4` only (no C5 counterpart) +- **Dependencies:** `driver/i2s_std`, `driver/i2s_pdm`, `driver/gpio`, `freertos`, `pin_def`, `sys_prio` +- **I2S port:** `I2S_NUM_0` (master role). The single TX channel and the PDM-RX channels share this one port. + +> **Part naming note:** the public header docstrings refer to a **MAX98357A** amplifier, while the driver source (`audio_i2s.c`) and the pin map (`pin_def.h`) name an **NS4168** amp and an **MSM261** PDM mic. The code and pin comments are the authoritative wiring reference; the amplifier is enabled by taking its shutdown pin high, and its hardware gain is fixed, so volume is applied digitally. + +## Signal Path + +### TX (speaker / amplifier) + +- **Mode:** I2S standard (Philips) slot format, **16-bit**, **mono**, master. +- **Default sample rate:** `44100` Hz (`SAMPLE_RATE_HZ`). PCM and stream calls may pass any rate; the driver reconfigures the TX clock only when the requested rate actually changes. +- **One persistent channel:** `I2S_NUM_0` has exactly one TX channel. It is created once at init and never deleted; playback only enables/disables it and reconfigures its clock. Creating/deleting a channel per sound churned internal DMA RAM and stuttered the UI, so that is avoided. +- **DMA depth:** `AUDIO_DMA_DESC_NUM` = 8 descriptors x `AUDIO_DMA_FRAME_NUM` = 256 frames (~46 ms, ~8 KB internal RAM), deeper than the IDF default for underrun slack. +- **Underrun behaviour:** `auto_clear = true`, so a starved channel emits zeros instead of looping the stale buffer. +- **Anti-click:** each note gets a raised-cosine attack (`ENV_ATTACK_MS` = 4 ms) / release (`ENV_RELEASE_MS` = 8 ms) envelope, and playback brackets sounds with short silence; melodies use a continuous phase accumulator for gapless rendering. +- **Amp enable:** `GPIO_AUDIO_EN_PIN` is driven high (out of shutdown) at init; idempotent. + +### RX (PDM microphone) + +- **Mode:** PDM RX, **16-bit**, **mono**, master. +- **Filtering:** high-pass filter enabled with a 50 Hz cut-off (`hp_cut_off_freq_hz`), digital gain `amplify_num = 3`. A ~120 ms settle delay is applied after enable to let the HP filter converge. +- **Channels:** the mic uses its own RX channel on `I2S_NUM_0`, independent of the TX side. `audio_i2s_mic_record()` opens/closes a channel per call; the streaming API keeps a persistent RX channel (`s_rx_stream`). + +## Concurrency + +- Playback runs on a pinned task `"audio_i2s"`: stack `AUDIO_TASK_STACK_SIZE` = 4096, priority `SYS_PRIO_SERVICE_LO`, core `SYS_CORE_RADIO`. It is deliberately **not** on the UI core, because the LVGL renderer at `SYS_PRIO_RENDER` would starve the I2S DMA during a full-frame redraw. +- A single mutex (`s_tx_mux`) guards the shared TX channel. Callers from the LVGL thread use finite timeouts and drop the sound rather than stall the UI: + - `TX_LOCK_WAIT_MS` = 250 ms for blocking playback / stream claims. + - `FX_TX_WAIT_MS` = 0 for queued UI effects (never wait behind a melody). +- Queued UI effects (`audio_play_chime`, `audio_click`) post `fx_t` entries to a depth-4 queue (`QUEUE_DEPTH`); overflow is dropped so button mashing never piles up. +- While a TX stream is active (`s_streaming`), one-shot playback calls become no-ops so they do not fight the stream. + +## Pins (from `pin_def.h`) + +| Signal | Define | GPIO | +| :--- | :--- | :--- | +| Amp enable / shutdown | `GPIO_AUDIO_EN_PIN` | 49 | +| I2S bit clock (BCLK) | `GPIO_AUDIO_BCLK_PIN` | 28 | +| I2S word select (LRCLK / WS) | `GPIO_AUDIO_LRCLK_PIN` | 29 | +| I2S data out (DOUT) | `GPIO_AUDIO_DIN_PIN` | 27 | +| Mic PDM clock | `GPIO_MIC_PDM_CLK_PIN` | 54 | +| Mic PDM data | `GPIO_MIC_PDM_DATA_PIN` | 53 | + +MCLK and the TX-side DIN are `I2S_GPIO_UNUSED`. + +## API Reference + +### Initialization + +#### `audio_i2s_init` +```c +esp_err_t audio_i2s_init(void); +``` +Brings up `I2S_NUM_0` on the amp pins, allocates the DMA chunk buffer, mutex and effect queue, and starts the playback task. Idempotent; safe to call multiple times. + +#### `audio_i2s_set_volume` +```c +void audio_i2s_set_volume(uint8_t pct); +``` +Sets global output volume (0..100), clamped. Applied as a perceptual (square-law) digital scale on top of each sound's own amplitude, because the amplifier's hardware gain is fixed. + +### Tones and Melodies + +#### `audio_i2s_play_tone` +```c +esp_err_t audio_i2s_play_tone(float freq_hz, int dur_ms, float amp); +``` +Plays a single blocking sine tone at 44.1 kHz mono. `amp` is in [0..1]. Returns `ESP_ERR_TIMEOUT` if the channel is busy (sound dropped), `ESP_OK` otherwise (also when not ready or a stream is active). + +#### `audio_i2s_play_song` / `audio_i2s_play_song_cb` +```c +esp_err_t audio_i2s_play_song(const audio_note_t *notes, int count, float amp); +esp_err_t audio_i2s_play_song_cb(const audio_note_t *notes, int count, float amp, + audio_song_progress_cb_t cb, void *ctx); +``` +Plays a melody blocking and gapless: opens the channel once, renders all notes back-to-back with per-note anti-click envelopes and a continuous phase accumulator, then ends. The `_cb` variant invokes `cb` before each note (in the worker thread) with the note index, total count and frequency; returning `false` cancels playback cooperatively after the current note. Pass `cb = NULL` for plain playback. + +`audio_note_t` is `{ uint16_t freq_hz; uint16_t dur_ms; }`; `freq_hz == 0` is a rest (silence). + +`audio_song_progress_cb_t`: +```c +typedef bool (*audio_song_progress_cb_t)(int note_index, int note_count, + uint16_t freq_hz, void *ctx); +``` +Must be trivial (touch only volatile scalars); never call `lv_*` from it. + +### Raw PCM Playback + +#### `audio_i2s_play_pcm` +```c +esp_err_t audio_i2s_play_pcm(const int16_t *pcm, size_t n_samples, uint32_t sample_rate); +``` +Plays a raw 16-bit mono PCM buffer (blocking) at `sample_rate`. Reconfigures the TX clock to the given rate and appends a short tail-silence. + +### Continuous TX Streaming + +#### `audio_i2s_stream_start` / `audio_i2s_stream_write` / `audio_i2s_stream_stop` +```c +esp_err_t audio_i2s_stream_start(uint32_t sample_rate); +int audio_i2s_stream_write(const int16_t *pcm, int n_samples); +void audio_i2s_stream_stop(void); +``` +Begins a continuous 16-bit mono TX stream (e.g. WAV playback), reusing the shared TX channel and suppressing UI chimes/clicks for its duration. `stream_write` applies global volume, blocks and paces to real time via the I2S DMA, and returns samples written (or -1 if the stream is not active). `stream_stop` drains the DMA, restores the default clock and re-enables UI sounds; safe when not started. + +### PDM Microphone Capture + +#### `audio_i2s_mic_record` +```c +esp_err_t audio_i2s_mic_record(int16_t *out, size_t max_samples, uint32_t sample_rate, + size_t *out_captured, audio_mic_level_cb_t cb, void *ctx); +``` +Captures up to `max_samples` of 16-bit mono PCM from the PDM mic (blocking): opens a PDM-RX channel, lets the HP filter settle (~120 ms), fills `out`, then closes. `*out_captured` receives the real sample count. If `cb` is non-NULL it is invoked after each chunk with that chunk's peak and RMS level for a live VU meter. + +`audio_mic_level_cb_t`: +```c +typedef void (*audio_mic_level_cb_t)(int peak, int rms, void *ctx); +``` +`peak` is max |sample| (0..32767) of the last chunk. Runs in the recording task's context; keep it trivial. + +#### `audio_i2s_mic_stream_start` / `audio_i2s_mic_stream_read` / `audio_i2s_mic_stream_stop` +```c +esp_err_t audio_i2s_mic_stream_start(uint32_t sample_rate); +int audio_i2s_mic_stream_read(int16_t *buf, int max_samples); +void audio_i2s_mic_stream_stop(void); +``` +Opens a persistent PDM-RX stream at `sample_rate` (idempotent). `mic_stream_read` reads up to `max_samples` 16-bit mono samples, returning the count read (0 on error/timeout/not-started). `mic_stream_stop` stops and frees the RX channel; safe when not started. + +### UI Sound Effects + +#### `audio_play_chime` +```c +void audio_play_chime(void); +``` +Queues a 3-note boot chime (C5 -> E5 -> G5, ~130-180 ms each). Non-blocking; dropped if the queue is full. + +#### `audio_click` +```c +void audio_click(void); +``` +Queues a short click (~30 ms, ~2 kHz). Non-blocking; dropped if the queue already holds pending entries so rapid button presses never pile up. + + diff --git a/docs/bq25896/README.md b/docs/bq25896/README.md new file mode 100644 index 000000000..8e8711de9 --- /dev/null +++ b/docs/bq25896/README.md @@ -0,0 +1,172 @@ +# BQ25896 Charger / PMIC Driver + +This component drives the Texas Instruments BQ25896 single-cell battery charger and power-path IC over I2C. It exposes battery voltage, charge and VBUS status, charge enable control, and a real ship-mode power-off. A thin `battery_service` layer sits on top and publishes a single smoothed snapshot that the UI reads instead of polling the charger directly. + +## Overview + +- **Location:** `components/Drivers/bq25896/` (firmware_p4 only) +- **Headers:** `include/bq25896.h`, `include/battery_service.h` +- **Sources:** `bq25896.c` (register I/O + controls), `bq25896_ext.c` (telemetry aggregator), `battery_service.c` (poll task + smoothing) +- **Dependencies:** `i2c_init`, `pins` (`pin_def.h`), `sys_prio`, `driver/gpio`, `freertos` +- **Interface:** I2C master bus `I2C_NUM_0` (via `i2c_init`, shared), 100 kHz standard-mode +- **I2C address:** `0x6B` (`BQ25896_I2C_ADDR`, 7-bit) +- **CE pin:** `GPIO_CHARGER_CE_PIN` (GPIO33), active-low charge enable, driven at init + +## Charge Status (`bq25896_charge_status_t`) + +| Value | Meaning | +|-------|---------| +| `CHARGE_STATUS_NOT_CHARGING` | Not charging | +| `CHARGE_STATUS_PRECHARGE` | Pre-charge phase | +| `CHARGE_STATUS_FAST_CHARGE` | Fast-charge phase | +| `CHARGE_STATUS_CHARGE_DONE` | Charge complete | + +## VBUS Status (`bq25896_vbus_status_t`) + +| Value | Meaning | +|-------|---------| +| `VBUS_STATUS_UNKNOWN` | No/unknown VBUS source | +| `VBUS_STATUS_USB_HOST` | USB host (SDP) input | +| `VBUS_STATUS_ADAPTER_PORT` | Dedicated adapter input | +| `VBUS_STATUS_OTG` | OTG (boost) output | + +## BQ25896 API Reference + +### Initialization + +#### `bq25896_init` +```c +esp_err_t bq25896_init(void); +``` +Adds the charger to the shared I2C bus, probes it (REG14), and marks the chip present. Drives CE (GPIO33) low to enable charging, disables the charge watchdog and sets `JEITA_ISET=0` (REG07), lowers `SYS_MIN` to 3.0 V (REG03) so the battery ADC keeps converting down to the 3.0 V knee, and enables the continuous ADC (REG02). Returns `ESP_OK` on success, or the failing `esp_err_t`. + +#### `bq25896_is_present` +```c +bool bq25896_is_present(void); +``` +True once the charger has answered on I2C at init. + +### Battery State + +#### `bq25896_get_battery_voltage` +```c +uint16_t bq25896_get_battery_voltage(void); +``` +Battery voltage in mV from REG0E (base 2304 mV, 20 mV/step), or 0 on read failure. + +#### `bq25896_get_battery_percentage` +```c +int bq25896_get_battery_percentage(uint16_t voltage_mv); +``` +Linear voltage-to-percent estimate (0-100) between 3200 mV and 4200 mV. + +#### `bq25896_get_charge_status` / `bq25896_get_vbus_status` +```c +bq25896_charge_status_t bq25896_get_charge_status(void); +bq25896_vbus_status_t bq25896_get_vbus_status(void); +``` +Decode the CHG_STAT and VBUS_STAT fields of the status register (REG0B). + +#### `bq25896_is_charging` +```c +bool bq25896_is_charging(void); +``` +True while pre-charging or fast charging. + +#### `bq25896_get_fault` +```c +uint8_t bq25896_get_fault(void); +``` +Raw fault register (REG0C): `CHRG_FAULT[5:4]`, `BAT_FAULT[3]`, `NTC_FAULT[2:0]`. + +### Charge Control + +#### `bq25896_get_charge_enable` +```c +bool bq25896_get_charge_enable(void); +``` +Reads REG03 `CHG_CONFIG` (bit 4). + +#### `bq25896_set_charge_enable` +```c +esp_err_t bq25896_set_charge_enable(bool enable); +``` +Drives both gates: the active-low CE pin (GPIO33) and REG03 `CHG_CONFIG`, so the state is unambiguous. + +### Ship Mode / Power Off + +#### `bq25896_power_off` +```c +esp_err_t bq25896_power_off(void); +``` +Real power-off: sets `BATFET_DIS` (REG09 bit 5) to disconnect the battery. Also sets `BATFET_DLY` (bit 3) so the MCU finishes the I2C write before the rail collapses, and clears `BATFET_RST_EN` (bit 2) to disarm the /QON auto-reset. Without disarming, a /QON pulse (the BACK button on this board) would cycle BATFET back on and cold-boot the device a few seconds later. Has no effect while VBUS (USB) is present: the part keeps the system powered from USB. + +### Telemetry + +#### `bq25896_read_telemetry` +```c +esp_err_t bq25896_read_telemetry(bq25896_telem_t *out); +``` +Fills a `bq25896_telem_t` snapshot. Battery voltage/percent/charge/VBUS/fault fields are real; the `vsys_mv`, `vbus_mv`, `ichg_ma`, and `iinlim_ma` diagnostic fields are currently 0 (approximate/unpopulated). Returns `ESP_ERR_INVALID_ARG` if `out` is NULL. + +`bq25896_telem_t` fields: `vbat_mv`, `vsys_mv`, `vbus_mv`, `ichg_ma`, `iinlim_ma`, `fault`, `soc`, `chg`, `vbus`, `charging`, `power_good`. + +#### `bq25896_reg_raw` +```c +uint8_t bq25896_reg_raw(uint8_t reg); +``` +Raw single-register read, or 0 on failure. + +## Battery Service API Reference + +A background poll task (`battery_svc`, core `SYS_CORE_RADIO`, priority `SYS_PRIO_BACKGROUND`) keeps a mutex-guarded smoothed snapshot so screens do not each poll the charger. + +#### `battery_service_init` +```c +void battery_service_init(void); +``` +Idempotent. Requires `bq25896_init()` first. Takes one synchronous reading so the first UI paint has real data, then polls in the background. + +#### `battery_service_get` +```c +bool battery_service_get(battery_snapshot_t *out); +``` +Copies the latest snapshot into `out`. Returns true if a valid reading is available. + +#### `battery_service_soc` / `battery_service_is_low` +```c +int battery_service_soc(void); +bool battery_service_is_low(void); +``` +Convenience accessors: smoothed SoC (0-100, or -1 if no valid reading yet) and the latched low-battery flag. + +`battery_snapshot_t` fields: `soc`, `vbat_mv`, `present`, `charging`, `vbus_present`, `low`, `valid`, `chg`. + +### Filtered SoC and Smoothing + +The raw voltage-derived SoC is filtered before it reaches the UI: + +- **EMA:** `ema = (ema*3 + raw) / 4` (`SOC_EMA_DEN = 4`) rejects the transient voltage sag when a radio transmits. +- **Slew limit:** at most `SOC_STEP_MAX = 3` % change applied per poll. +- **Monotonic on battery:** off external power, SoC never climbs (a recovering voltage after a load sag would otherwise bounce it up); it only rises while charging or on external power. +- **Low-battery hysteresis:** latches `low` at/below `LOW_ENTER_PCT = 15`, releases at/above `LOW_EXIT_PCT = 20`; never low while charging or on VBUS. +- **Charging debounce:** turns the charging indicator on immediately, off immediately when unplugged, but requires `CHG_OFF_DEBOUNCE = 3` consecutive not-charging polls to drop it while still on external power. + +## Key Config / Tunables + +| Macro | Location | Value | Meaning | +|-------|----------|-------|---------| +| `BQ25896_I2C_ADDR` | `bq25896.h` | `0x6B` | I2C 7-bit address | +| `I2C_TIMEOUT_MS` | `bq25896.c` | 100 | Per-transfer timeout | +| `I2C_FAIL_RECOVER` | `bq25896.c` | 3 | Consecutive failures before `i2c_bus_recover()` | +| `BATV_BASE_MV` / `BATV_STEP_MV` | `bq25896.c` | 2304 / 20 | REG0E voltage decode | +| `BATTERY_MIN_MV` / `BATTERY_MAX_MV` | `bq25896.c` | 3200 / 4200 | Percent-estimate endpoints | +| `POLL_INTERVAL_MS` | `battery_service.c` | 1000 | Steady poll cadence (first sample at ~1200 ms) | +| `SOC_STEP_MAX` | `battery_service.c` | 3 | Max SoC delta per poll | +| `SOC_EMA_DEN` | `battery_service.c` | 4 | EMA denominator | +| `LOW_ENTER_PCT` / `LOW_EXIT_PCT` | `battery_service.c` | 15 / 20 | Low-battery hysteresis | +| `CHG_OFF_DEBOUNCE` | `battery_service.c` | 3 | Not-charging polls before clearing the indicator | + +### Bus Recovery + +Reads and writes track a failure streak; after `I2C_FAIL_RECOVER` consecutive failures the driver calls `i2c_bus_recover()` (from `i2c_init`) to clock out a slave that has wedged the bus, so the charger does not stay unreadable for the rest of the session. diff --git a/docs/drv2605l/README.md b/docs/drv2605l/README.md new file mode 100644 index 000000000..f476de210 --- /dev/null +++ b/docs/drv2605l/README.md @@ -0,0 +1,84 @@ +# DRV2605L Haptic Driver + +This component is a minimal driver for the Texas Instruments DRV2605L haptic motor driver over I2C. It uses the chip's internal ROM waveform library for named effects and exposes RTP (real-time playback) for variable-intensity feedback. The driver is tuned for an ERM (eccentric rotating mass) actuator. + +## Overview + +- **Location:** `components/Drivers/drv2605l/` (firmware_p4 only) +- **Header:** `include/drv2605l.h` +- **Source:** `drv2605l.c` +- **Dependencies:** `i2c_init`, `pins` (`pin_def.h`), `driver/gpio`, `freertos` +- **Interface:** I2C master bus `I2C_NUM_0` (via `i2c_init`, shared), 100 kHz standard-mode +- **I2C address:** `0x5A` (`DRV2605L_I2C_ADDR`, 7-bit) +- **Enable line:** per the header, EN is on GPIO37 (the driver itself does not toggle it) +- **Effect library:** internal ROM library `TS2200 Library A` (`LIB_SEL = 0x01`) + +## Configuration Applied at Init + +`drv2605l_init()` adds the device to the shared bus, reads the status register (deriving `DEVICE_ID` from bits [7:5]), and programs: + +- Mode: internal-trigger (`0x00`) +- Library select: TS2200 Library A (`0x01`) +- Rated voltage: `0x90` (ERM), overdrive clamp: `0xCC` (ERM) +- Feedback control `0x35`, Control1 `0x93`, Control2 `0xF5`, Control3 `0xA0` + +Auto-calibration is not run at boot (it is opt-in via `drv2605l_autocal()`) so it never regresses the working manual tune. + +## API Reference + +### Initialization + +#### `drv2605l_init` +```c +esp_err_t drv2605l_init(void); +``` +Initializes the driver as described above. Returns `ESP_OK` on success, otherwise the failing `esp_err_t`. Marks the driver ready; all other calls return `ESP_ERR_INVALID_STATE` until it succeeds. + +#### `drv2605l_device_id` +```c +uint8_t drv2605l_device_id(void); +``` +Last-read `DEVICE_ID` register value (0 if not yet probed). + +### Playback + +#### `drv2605l_play_effect` +```c +esp_err_t drv2605l_play_effect(uint8_t effect); +``` +Plays a single ROM library waveform effect (1..123) once. Leaves RTP mode first if active, writes the effect into waveform-sequence slot 0 with a terminator in slot 1 (skipping the write when the effect is unchanged from the last call), then strobes GO. + +#### `drv2605l_stop` +```c +esp_err_t drv2605l_stop(void); +``` +Stops any currently-playing waveform (clears GO). + +#### `drv2605l_set_rtp` +```c +esp_err_t drv2605l_set_rtp(uint8_t intensity); +``` +Enters RTP mode and applies an intensity value (useful range 0..127 for forward drive). + +### Calibration + +#### `drv2605l_autocal` +```c +esp_err_t drv2605l_autocal(void); +``` +Runs ERM auto-calibration (MODE `0x07`) against the actuator, using the rated/overdrive/feedback registers already programmed at init, then returns to internal-trigger mode. Blocks up to ~1.5 s while polling GO. Returns `ESP_OK` if `DIAG_RESULT` passed (status bit 3 clear), else `ESP_FAIL`. Opt-in; not run at boot. + +## Key Config / Tunables + +| Macro | Location | Value | Meaning | +|-------|----------|-------|---------| +| `DRV2605L_I2C_ADDR` | `drv2605l.h` | `0x5A` | I2C 7-bit address | +| `MODE_INTERNAL_TRIG` | `drv2605l.c` | `0x00` | Internal-trigger playback mode | +| `MODE_AUTO_CAL` | `drv2605l.c` | `0x07` | Auto-calibration mode | +| `MODE_RTP` | `drv2605l.c` | `0x05` | Real-time playback mode | +| `LIB_TS2200_A` | `drv2605l.c` | `0x01` | TS2200 Library A (ERM) | +| `RATED_V_ERM` | `drv2605l.c` | `0x90` | Rated voltage (ERM) | +| `OD_CLAMP_ERM` | `drv2605l.c` | `0xCC` | Overdrive clamp (ERM) | +| `I2C_TIMEOUT_MS` | `drv2605l.c` | 50 | Per-transfer timeout | +| `AUTOCAL_POLL_INTERVAL_MS` | `drv2605l.c` | 10 | Auto-cal GO poll interval | +| `AUTOCAL_POLL_MAX` | `drv2605l.c` | 150 | Max auto-cal poll iterations (~1.5 s) | diff --git a/docs/i2c_init/README.md b/docs/i2c_init/README.md new file mode 100644 index 000000000..04957ed50 --- /dev/null +++ b/docs/i2c_init/README.md @@ -0,0 +1,107 @@ +# I2C Master Bus Init + +This component brings up the shared I2C master bus used by every on-board I2C +device (charger, haptic, LED, etc.). The two firmwares are at different stages of +the ESP-IDF I2C driver migration: P4 uses the new `driver/i2c_master.h` bus-object +API and adds stuck-bus recovery (at init and reactively at runtime), while C5 still +uses the legacy `driver/i2c.h` driver with a simpler init and no recovery. + +# P4 + +Shared I2C master bus on the new `i2c_master.h` driver, with stuck-bus recovery. + +## Overview + +- **Location:** `components/Drivers/i2c_init/` +- **Header:** `include/i2c_init.h` +- **Driver:** `driver/i2c_master.h` (new bus-object API) +- **Port:** `I2C_NUM_0` +- **Pins:** SDA `GPIO_I2C_SDA_PIN` (GPIO 31), SCL `GPIO_I2C_SCL_PIN` (GPIO 30), from `pin_def.h` +- **Speed:** `I2C_MASTER_FREQ_HZ` = 100 kHz (standard mode) +- **Dependencies:** `pins`, `driver/gpio`, `esp_rom_sys` + +## Bus / Hardware Notes + +The bus runs at 100 kHz standard mode because the V2 board pulls SDA/SCL up with +10k (R12/R13/R14 to 3.3VF) plus 22R series (R9/R10): too weak for 400 kHz +fast-mode (rise time can't reach VIH in a bit period), which is why the BQ25896 +NACKs at 400 kHz. Bus config uses `I2C_CLK_SRC_DEFAULT`, `glitch_ignore_cnt = 7`, +and internal pull-ups enabled. + +## Recovery Mechanisms + +**Stuck-bus recovery at init.** Before the I2C driver claims the pins, `init_i2c()` +runs `bus_recover()`: it drives SCL as open-drain and reads SDA. If a slave is +holding SDA low (stuck mid-transfer after a partial reset or power glitch), it +bit-bangs up to `I2C_RECOVER_CLOCKS` (9) SCL pulses at ~100 kHz +(`I2C_RECOVER_HALF_US` = 5 us half period) to walk the slave past its ACK, then +issues a STOP (SDA rising while SCL is high). It is a no-op when SDA is already +released. This keeps a stuck bus from leaving the charger/haptic/LED unreachable +for the whole session. + +**Reactive recovery at runtime.** Consumers that see repeated transfer failures +call `i2c_bus_recover()`, which calls `i2c_master_bus_reset()` on the shared bus +and increments the recovery counter. `i2c_recover_count()` exposes that counter +for `sys_monitor` health reporting. + +## API Reference + +#### `init_i2c` +```c +esp_err_t init_i2c(void); +``` +Runs the init-time stuck-bus recovery sequence, then creates the I2C master bus on +`I2C_NUM_0`. Returns `ESP_OK`, or the failing `esp_err_t`. + +#### `i2c_get_bus` +```c +i2c_master_bus_handle_t i2c_get_bus(void); +``` +Returns the shared master bus handle; each device driver adds itself to it via +`i2c_master_bus_add_device()`. + +#### `i2c_bus_recover` +```c +esp_err_t i2c_bus_recover(void); +``` +Resets a wedged bus at runtime (reactive recovery) and increments the recovery +counter. Returns `ESP_ERR_INVALID_STATE` if the bus is not initialized, otherwise +the result of `i2c_master_bus_reset()`. + +#### `i2c_recover_count` +```c +uint32_t i2c_recover_count(void); +``` +Number of runtime bus recoveries performed since boot, for `sys_monitor` health. + +--- + +# C5 + +Shared I2C master bus on the legacy `driver/i2c.h` driver. No bus recovery and no +recovery counter; the bus handle is not exposed. + +## Overview + +- **Location:** `components/Drivers/i2c_init/` +- **Header:** `include/i2c_init.h` +- **Driver:** `driver/i2c.h` (legacy driver) +- **Port:** `I2C_NUM_0` +- **Pins:** SDA `GPIO_I2C_SDA_PIN` (GPIO 8), SCL `GPIO_I2C_SCL_PIN` (GPIO 9), from `pin_def.h` +- **Speed:** `I2C_MASTER_FREQ_HZ` = 400 kHz (fast mode) +- **Dependencies:** `pins`, `driver/i2c` + +## Configuration + +Configured as `I2C_MODE_MASTER` with SDA/SCL internal pull-ups enabled and a +400 kHz clock. Init calls `i2c_param_config()` then `i2c_driver_install()` with no +RX/TX buffers. + +## API Reference + +#### `init_i2c` +```c +void init_i2c(void); +``` +Configures and installs the legacy I2C master driver on `I2C_NUM_0`. Logs and +returns early on failure; no value is returned. diff --git a/docs/led/README.md b/docs/led/README.md new file mode 100644 index 000000000..a7c061e8a --- /dev/null +++ b/docs/led/README.md @@ -0,0 +1,158 @@ +# LED Status Driver + +This component drives the single RGB status LED. The two firmwares use different +hardware, so the driver differs between them: on P4 the LED is a Texas Instruments +**LP5816** I2C current-sink driver, while on C5 it is an addressable RMT LED strip +(single pixel). The P4 build additionally exposes a semantic signal API +(`led_signal_info/warning/error`) with a dedicated blink-off task; the C5 build +only exposes the fixed-color blink helpers. + +# P4 + +RGB status LED backed by the LP5816 4-channel I2C current-sink driver. + +## Overview + +- **Location:** `components/Drivers/led/` +- **Header:** `include/led_control.h` +- **Chip:** Texas Instruments LP5816 (U22), 4-channel I2C current-sink LED driver +- **Interface:** I2C (shared bus via the `i2c_init` component, `i2c_get_bus()`) +- **I2C address:** `0x2C` (7-bit) +- **I2C speed:** `I2C_MASTER_FREQ_HZ` (100 kHz, from `i2c_init.h`) +- **I2C timeout:** 50 ms per transfer +- **Dependencies:** `i2c_init`, `sys_prio`, `esp_timer`, `freertos` + +## Hardware + +The LEDs are common-anode (anode to 3.3V); the LP5816 sinks each cathode. Channel +map (schematic sheet 6): + +| Channel | Color | LED | +| :--- | :--- | :--- | +| OUT0 | Red | D10.1 | +| OUT1 | Green | D10.2 | +| OUT2 | Blue | D10.3 | +| OUT3 | (unused) | D11 | + +Only OUT0..OUT2 (RGB) are enabled. Channels run in manual 8-bit PWM mode with the +dot-current ceiling set to full scale (25.5 mA MAX_CURRENT) for saturated color; +fade and exponential dimming are disabled so PWM updates take effect immediately. + +## Configuration / Tunables + +- `LP5816_ADDR` = `0x2C`: I2C target address. +- `I2C_TIMEOUT_MS` = `50`: per-transfer timeout. +- `OUT_ENABLE_RGB` = `0x07`: enables OUT0..OUT2. +- `LED_DC_LEVEL` = `0xFF`: per-channel dot-current ceiling (full scale). +- `SIGNAL_BLINK_US` = `250000`: semantic-signal flash duration (250 ms). +- Signal defaults: info `0xFF00FF`, warning `0xFFFF00`, error `0xFF0000`, + brightness `10`. These are overridden via `led_set_signal_config()`. + +## Blink-off Task + +Turning the LED off is a blocking I2C write, so it does not run in an +`esp_timer` callback (that task has a ~3.5 KB stack the I2C path overflows, and +blocking there stalls other timers). Instead, the first semantic signal lazily +creates a dedicated task `led_sig` (3072-byte stack, `SYS_PRIO_BACKGROUND`, +pinned to `SYS_CORE_RADIO`). Each signal sets the color and an off-deadline, then +notifies the task; the task sleeps until the (possibly re-armed) deadline and then +clears the LED once. The flash itself is therefore non-blocking to the caller. + +## API Reference + +### Initialization + +#### `led_rgb_init` +```c +esp_err_t led_rgb_init(void); +``` +Assumes the shared I2C bus is already up. Adds the LP5816 to the bus, resets it, +enables the RGB channels in manual PWM mode, and starts with the LED off. Returns +`ESP_OK`, or an `esp_err_t` if the LP5816 does not respond on I2C. + +### Direct Color Control + +```c +void led_set_color(uint8_t r, uint8_t g, uint8_t b); +void led_clear(void); +void led_blink(uint8_t r, uint8_t g, uint8_t b, int duration_ms); +``` +- `led_set_color`: sets the RGB PWM duty (0-255 per channel). +- `led_clear`: turns the LED off (all channels to 0). +- `led_blink`: sets the color, blocks for `duration_ms`, then clears. + +### Fixed-color Blink Helpers + +```c +void led_blink_red(void); // 255,0,0 for 500 ms (error) +void led_blink_green(void); // 0,150,0 for 220 ms (success) +void led_blink_blue(void); // 0,0,255 for 500 ms (info) +void led_blink_purple(void); // 200,0,220 for 500 ms (info) +``` +Each blocks for its duration. + +### Semantic Signal API + +```c +void led_set_signal_config(uint32_t info, uint32_t warning, uint32_t error, int brightness); +void led_signal_info(void); +void led_signal_warning(void); +void led_signal_error(void); +``` +- `led_set_signal_config`: pushes the signal colors (0xRRGGBB) and global + brightness (0-100) in from the Service layer, so the driver never depends on the + config module. The brightness scales each channel before it is written. +- `led_signal_info` / `led_signal_warning` / `led_signal_error`: flash the status + LED once in the configured color, then turn it off. Non-blocking; the off runs on + the dedicated `led_sig` task described above. + +--- + +# C5 + +RGB status LED backed by an addressable RMT LED strip (single pixel), driven +through the `led_strip` component. This is not the LP5816 used on P4, and there is +no I2C, signal API, or dedicated off task. + +## Overview + +- **Location:** `components/Drivers/led/` +- **Header:** `include/led_control.h` +- **Interface:** RMT (single-pixel addressable LED via the `led_strip` component) +- **Data pin:** `GPIO_LED_RGB_PIN` (GPIO 27, from `pin_def.h`) +- **Dependencies:** `led_strip`, `pin_def`, `freertos` + +## Configuration / Tunables + +- `RMT_RESOLUTION_HZ` = `10 MHz`: RMT channel resolution. +- Strip: `max_leds = 1`, `RMT_CLK_SRC_DEFAULT`, DMA disabled. +- Blink colors/durations: + +| Helper | RGB | Duration | +| :--- | :--- | :--- | +| `led_blink_red` | 255,0,0 | 500 ms | +| `led_blink_green` | 0,150,0 | 220 ms | +| `led_blink_blue` | 0,0,255 | 500 ms | +| `led_blink_purple` | 200,0,220 | 500 ms | + +## API Reference + +### Initialization + +#### `led_rgb_init` +```c +void led_rgb_init(void); +``` +Creates the single-pixel RMT LED strip device on `GPIO_LED_RGB_PIN` and clears it. +Uses `ESP_ERROR_CHECK`, so a failure aborts. + +### Fixed-color Blink Helpers + +```c +void led_blink_red(void); +void led_blink_green(void); +void led_blink_blue(void); +void led_blink_purple(void); +``` +Each sets the pixel to its color, refreshes, blocks for the color's duration, then +clears and refreshes. No-op if the strip is not initialized. diff --git a/docs/pins/README.md b/docs/pins/README.md new file mode 100644 index 000000000..206e0defd --- /dev/null +++ b/docs/pins/README.md @@ -0,0 +1,128 @@ +# Pins (Board GPIO Map) + +`pin_def.h` is the central, header-only map of every GPIO assignment for a board. No driver should hardcode a GPIO number: all of them include this header and use the defines. The P4 and C5 firmwares each ship their own `pin_def.h` with different pin numbers and different peripheral sets, so the two are documented as separate sections below. + +## Overview + +- **Location:** `components/Drivers/pins/include/pin_def.h` (per firmware) +- **Header only:** no `.c` file; pure `#define`s inside an `extern "C"` guard. +- **Rule:** hardware pin numbers live here and only here. + +A `-1` value marks a signal that is not wired on the board (or is driven by something other than that MCU), and `LED_COUNT` gives the addressable-LED count. + +--- + +# P4 (ESP32-P4, HighBoy V2) + +Header: `firmware_p4/components/Drivers/pins/include/pin_def.h` + +## Pin Groups + +### Shared SPI bus +One SPI bus is shared by the display, CC1101, NFC, IMU and LoRa. + +| Signal | Define | GPIO | +| :--- | :--- | :--- | +| MOSI | `GPIO_SPI_MOSI_PIN` | 22 | +| SCLK | `GPIO_SPI_SCLK_PIN` | 21 | +| MISO | `GPIO_SPI_MISO_PIN` | 23 | + +The SX1262 LoRa reuses these same lines: `GPIO_LORA_SCLK_PIN` (21), `GPIO_LORA_MOSI_PIN` (22) and `GPIO_LORA_MISO_PIN` (23) alias the shared bus, with its own `GPIO_LORA_CS_PIN` (26), `GPIO_LORA_BUSY_PIN` (4) and `GPIO_LORA_DIO1_PIN` (5). `GPIO_LORA_RESET_PIN`, `GPIO_LORA_TXEN_PIN` and `GPIO_LORA_RXEN_PIN` are `-1` (not wired). + +### I2C bus +Charger, fuel gauge, LED driver and haptic share one I2C bus: `GPIO_I2C_SDA_PIN` (31), `GPIO_I2C_SCL_PIN` (30). + +### Chip selects and IRQs on the shared SPI bus + +| Peripheral | Signal | Define | GPIO | +| :--- | :--- | :--- | :--- | +| CC1101 | CS | `GPIO_CC1101_CS_PIN` | 20 | +| CC1101 | GDO0 | `GPIO_CC1101_GDO0_PIN` | 8 | +| CC1101 | GDO2 | `GPIO_CC1101_GDO2_PIN` | 9 | +| ST7789 | CS / DC / RST / BL | `GPIO_ST7789_CS_PIN` / `_DC_PIN` / `_RST_PIN` / `_BL_PIN` | 51 / 50 / 52 / 14 | +| IMU QMI8658 | CS | `GPIO_QMI8658A_CS_PIN` | 36 | +| NFC ST25R3916 | CS / IRQ | `GPIO_NFC_CS_PIN` / `GPIO_NFC_IRQ_PIN` | 24 / 10 | + +### Sub-GHz antenna switch (PE613050) +`GPIO_RF_SW_V1_PIN` (17), `GPIO_RF_SW_V2_PIN` (18). + +### Buttons (active-low) + +| Button | Define | GPIO | +| :--- | :--- | :--- | +| LEFT | `GPIO_BTN_LEFT_PIN` | 35 | +| RIGHT | `GPIO_BTN_RIGHT_PIN` | 13 | +| UP | `GPIO_BTN_UP_PIN` | 3 | +| DOWN | `GPIO_BTN_DOWN_PIN` | 7 | +| OK | `GPIO_BTN_OK_PIN` | 25 | +| BACK | `GPIO_BTN_BACK_PIN` | 6 | + +**BACK / LEFT are on the hardware power path.** As documented in `power_policy.c`, BACK and LEFT are wired to the charger `/QON` and the P4 `CHIP_PU` respectively, so holding **BACK + LEFT** together resets the P4 in hardware before firmware can react. Because of this the graceful power-off combo is deliberately **OK + LEFT** (OK is not on that path), letting firmware stay alive to issue the ship-mode command. Keep this in mind when picking or documenting button combos. + +Note also that `GPIO_BTN_LEFT_PIN` (35) is the same pin as the P4 boot strap `GPIO_P4_BOOT_PIN` (35, "button B5"), so LEFT doubles as a boot-strapping pin. + +### 125 kHz LF RFID +`GPIO_RFID_LF_CARRIER_PIN` (15), `GPIO_RFID_LF_DATA_PIN` (16), `GPIO_RFID_LF_MOD_PIN` (11), `GPIO_RFID_LF_COIL_PIN` (2). + +### IR +`GPIO_IR_TX_PIN` (0), `GPIO_IR_RX_PIN` (1) (TSOP receiver + LED). + +### SDMMC (4-bit SDIO) +`GPIO_SDMMC_CLK_PIN` (43), `GPIO_SDMMC_CMD_PIN` (44), `GPIO_SDMMC_D0_PIN` (39), `GPIO_SDMMC_D1_PIN` (40), `GPIO_SDMMC_D2_PIN` (41), `GPIO_SDMMC_D3_PIN` (42), card-detect `GPIO_SD_CD_PIN` (34). + +### P4 to C5 bridge (SPI master) +`GPIO_BRIDGE_SCLK_PIN` (45), `GPIO_BRIDGE_MOSI_PIN` (46), `GPIO_BRIDGE_MISO_PIN` (47), `GPIO_BRIDGE_CS_PIN` (48). `GPIO_BRIDGE_IRQ_PIN` is `-1`. C5 reset/boot (`GPIO_C5_RESET_PIN`, `GPIO_C5_BOOT_PIN`) are `-1` because the CP2105, not the P4, drives them. + +### Audio (I2S) and mic (PDM) +`GPIO_AUDIO_EN_PIN` (49), `GPIO_AUDIO_LRCLK_PIN` (29), `GPIO_AUDIO_BCLK_PIN` (28), `GPIO_AUDIO_DIN_PIN` (27) for the amp (commented NS4168); `GPIO_MIC_PDM_CLK_PIN` (54), `GPIO_MIC_PDM_DATA_PIN` (53) for the PDM mic (commented MSM261). See [docs/audio_i2s/README.md](../audio_i2s/README.md). + +### Miscellaneous +`GPIO_HAPTIC_TRIG_PIN` (32, AW8623 trigger), `GPIO_CHARGER_CE_PIN` (33, BQ25896 OTG/CE), `GPIO_USB_MUX_SEL_PIN` (19, TS3USB221 D+/D- mux), console UART0 `GPIO_P4_UART0_RX_PIN` (37) / `GPIO_P4_UART0_TX_PIN` (38) to the CP2105 SCI, and `GPIO_LED_RGB_PIN` `-1` with `LED_COUNT` 1 (the LP5816 RGB LED is I2C-driven in V2, no data pin). + +### No direct P4 to C5 UART +On the HighBoy V2 there is **no** direct P4 to C5 UART. The schematic routes the P4 UART0 (GPIO37/38) and the C5 UART0 (GPIO11/12) to two **separate** channels of the CP2105 USB bridge; they never meet. `GPIO38` is the P4's own console TX to the CP2105 (SCI), not a wire to the C5. The legacy defines `GPIO_C5_UART_TX_PIN` (38), `GPIO_C5_UART_RX_PIN` (39), `GPIO_RFID_UART_TX_PIN` (24) and `GPIO_RFID_UART_RX_PIN` (25) are kept only so unported V1 drivers still build. Consequently a "C5 OTA over UART" path cannot reach the C5 (it just writes to the P4's USB serial); the only P4 to C5 data path is the SPI bridge. + +--- + +# C5 (ESP32-C5) + +Header: `firmware_c5/components/Drivers/pins/include/pin_def.h` + +The C5 carries a smaller peripheral set than the P4 and uses entirely different GPIO numbers. + +## Pin Groups + +### SPI bus +`GPIO_SPI_MOSI_PIN` (11), `GPIO_SPI_SCLK_PIN` (12), `GPIO_SPI_MISO_PIN` (13). + +### CC1101 Sub-GHz radio +`GPIO_CC1101_CS_PIN` (3), `GPIO_CC1101_GDO0_PIN` (8), `GPIO_CC1101_GDO2_PIN` (9). + +### SD card (SPI mode) +`GPIO_SD_CARD_CS_PIN` (14). Unlike the P4 (4-bit SDIO), the C5 uses SPI-mode SD. + +### ST7789 display +`GPIO_ST7789_CS_PIN` (48), `GPIO_ST7789_DC_PIN` (47), `GPIO_ST7789_RST_PIN` (21), `GPIO_ST7789_BL_PIN` (38). + +### Buttons + +| Button | Define | GPIO | +| :--- | :--- | :--- | +| LEFT | `GPIO_BTN_LEFT_PIN` | 5 | +| BACK | `GPIO_BTN_BACK_PIN` | 7 | +| UP | `GPIO_BTN_UP_PIN` | 15 | +| DOWN | `GPIO_BTN_DOWN_PIN` | 6 | +| OK | `GPIO_BTN_OK_PIN` | 4 | +| RIGHT | `GPIO_BTN_RIGHT_PIN` | 16 | + +The C5 button pins are independent GPIOs and are not tied to the charger `/QON` or `CHIP_PU` power path that the P4's BACK/LEFT are on. + +### I2C bus +`GPIO_I2C_SDA_PIN` (8), `GPIO_I2C_SCL_PIN` (9). These share the same GPIO numbers as the CC1101 GDO0/GDO2 defines above. + +### RGB LED +`GPIO_LED_RGB_PIN` (27), `LED_COUNT` 1 (WS2812 / SK6812). Unlike the P4, the C5 has a real addressable-LED data pin. + +### P4 to C5 bridge (SPI slave) +The C5 side of the bridge is the SPI **slave**: `GPIO_BRIDGE_SCLK_PIN` (26), `GPIO_BRIDGE_MOSI_PIN` (25), `GPIO_BRIDGE_MISO_PIN` (24), `GPIO_BRIDGE_CS_PIN` (23), `GPIO_BRIDGE_IRQ_PIN` (3). As noted on the P4 side, this SPI bridge is the only data path between the two chips; there is no direct P4 to C5 UART on the V2 board. + diff --git a/docs/ys_rfid2/README.md b/docs/ys_rfid2/README.md new file mode 100644 index 000000000..f78a39017 --- /dev/null +++ b/docs/ys_rfid2/README.md @@ -0,0 +1,227 @@ +# YS-RFID2 UART RFID Reader Driver + +This component drives the YS-RFID2 serial RFID reader module. It reads the module's ASCII output over UART, parses the "card number" frames into card IDs, and delivers card-detected / card-removed events to the application through a callback. It is `firmware_p4` only. + +## Overview + +- **Location:** `firmware_p4/components/Drivers/ys_rfid2/` +- **Header:** `include/ys_rfid2.h` +- **Dependencies:** `pin_def`, `sys_prio`, `driver/uart`, `esp_timer`, `freertos` +- **Interface:** UART (via the ESP-IDF `driver/uart` layer, wrapped by the local HAL) +- **UART port:** `UART_NUM_2` (default) +- **Baud rate:** 9600 8N1, no flow control (default) +- **Pins:** TX = GPIO 24 (`GPIO_RFID_UART_TX_PIN`), RX = GPIO 25 (`GPIO_RFID_UART_RX_PIN`) + +## Module Structure + +The driver is split into three layers: + +| Layer | Files | Responsibility | +|--------|-------|----------------| +| Core | `ys_rfid2_core.c`, `include/ys_rfid2.h`, `include/ys_rfid2_types.h` | Public API, state machine, background reader task, debounce and removal logic, event dispatch. | +| Parser | `ys_rfid2_parser.c`, `include/ys_rfid2_parser.h` | Byte-by-byte frame accumulation, card ID extraction and validation, decimal-to-bytes conversion. | +| HAL | `hal/ys_rfid2_hal_uart.c`, `hal/include/ys_rfid2_hal_uart.h` | Thin UART wrapper: install/config/pins, read, write, flush. | + +Data flow: HAL UART reads raw bytes -> core reader task feeds each byte to the parser -> a completed valid frame becomes a `YS_RFID2_EVENT_CARD_DETECTED` event delivered to the user callback. + +## Frame Format and Parsing + +The module emits ASCII lines of the form: + +``` +card number: xxxxxxxxxx@ +``` + +The parser (`ys_rfid2_parser_feed`) accumulates bytes into a 64-byte line buffer until it sees the `@` delimiter. On the delimiter it searches the buffer for the `"card number: "` prefix (13 chars) followed by exactly 10 decimal digits (`YS_RFID2_CARD_ID_LEN`). If found and all 10 characters are digits `0-9`, it: + +- Copies the 10-digit ASCII string into `id_str` (NUL-terminated). +- Converts the decimal string to 5 big-endian raw bytes (40 bits) in `data`. +- Sets `bit_count` to 40. + +Any byte that overflows the line buffer resets the accumulator. The parser holds a single static line buffer, so it is not reentrant. + +## Data Types (`ys_rfid2_types.h`) + +Constants: + +| Constant | Value | Meaning | +|----------|-------|---------| +| `YS_RFID2_CARD_ID_LEN` | 10 | Card ID string length (decimal digits) | +| `YS_RFID2_RAW_DATA_LEN` | 5 | Raw byte count (40 bits) | + +### `ys_rfid2_state_t` + +`YS_RFID2_STATE_UNINITIALIZED`, `YS_RFID2_STATE_IDLE`, `YS_RFID2_STATE_SCANNING`, `YS_RFID2_STATE_ERROR`, `YS_RFID2_STATE_COUNT`. + +### `ys_rfid2_event_type_t` + +`YS_RFID2_EVENT_CARD_DETECTED`, `YS_RFID2_EVENT_CARD_REMOVED`, `YS_RFID2_EVENT_COUNT`. + +### `ys_rfid2_raw_data_t` +```c +typedef struct { + char id_str[YS_RFID2_CARD_ID_LEN + 1]; // 10-digit ID + NUL + uint8_t data[YS_RFID2_RAW_DATA_LEN]; // 5 raw bytes (40 bits, big-endian) + uint8_t bit_count; // 40 for a parsed card +} ys_rfid2_raw_data_t; +``` + +### `ys_rfid2_event_t` +```c +typedef struct { + ys_rfid2_event_type_t type; + ys_rfid2_raw_data_t raw; + int64_t timestamp_ms; // esp_timer time in ms at detection +} ys_rfid2_event_t; +``` + +### `ys_rfid2_event_cb_t` +```c +typedef void (*ys_rfid2_event_cb_t)(const ys_rfid2_event_t *event, void *ctx); +``` +Invoked from the reader task context. Must not block for extended periods. The `event` pointer is valid only during the callback. + +### `ys_rfid2_config_t` +```c +typedef struct { + int uart_port; + int baud_rate; + int tx_pin; + int rx_pin; + uint32_t debounce_ms; + uint32_t removal_timeout_ms; +} ys_rfid2_config_t; +``` + +## Configuration and Tunables + +`ys_rfid2_default_config()` returns: + +| Field | Default | Source | +|-------|---------|--------| +| `uart_port` | `UART_NUM_2` | fixed default | +| `baud_rate` | 9600 | `RFID_DEFAULT_BAUD` | +| `tx_pin` | GPIO 24 | `GPIO_RFID_UART_TX_PIN` (pin_def.h) | +| `rx_pin` | GPIO 25 | `GPIO_RFID_UART_RX_PIN` (pin_def.h) | +| `debounce_ms` | 1000 | `RFID_DEFAULT_DEBOUNCE_MS` | +| `removal_timeout_ms` | 2000 | `RFID_DEFAULT_REMOVAL_MS` | + +- **debounce_ms:** while the same card ID keeps being read, repeat detections within this window are suppressed (the timer is refreshed on each read). A different card ID fires immediately. +- **removal_timeout_ms:** if no byte is read for longer than this after the last detection, a `YS_RFID2_EVENT_CARD_REMOVED` event fires for the last card. + +Other internal constants (`ys_rfid2_core.c`): reader task stack 4096 bytes, priority `SYS_PRIO_SERVICE_HI`, UART read timeout 100 ms. The task is pinned to `SYS_CORE_RADIO` (core 0) via `xTaskCreatePinnedToCore`. + +## API Reference + +### Configuration + +#### `ys_rfid2_default_config` +```c +ys_rfid2_config_t ys_rfid2_default_config(void); +``` +Returns the default configuration described above. + +### Lifecycle + +#### `ys_rfid2_init` +```c +esp_err_t ys_rfid2_init(const ys_rfid2_config_t *config); +``` +Creates the driver mutex and initializes the UART via the HAL. Does NOT start scanning. Pass `NULL` to use the default config. Returns `ESP_OK`, `ESP_ERR_INVALID_STATE` if already initialized, `ESP_ERR_NO_MEM` if mutex creation fails, or a propagated HAL error. + +#### `ys_rfid2_deinit` +```c +esp_err_t ys_rfid2_deinit(void); +``` +Stops scanning if active, tears down the UART, and deletes the mutex. Returns `ESP_OK`, or `ESP_ERR_INVALID_STATE` if not initialized. + +### Scanning + +#### `ys_rfid2_start` +```c +esp_err_t ys_rfid2_start(ys_rfid2_event_cb_t cb, void *ctx); +``` +Resets the parser, flushes the UART input, and creates the background reader task that delivers events via `cb`. `cb` must not be NULL. Returns `ESP_OK`, `ESP_ERR_INVALID_ARG` if `cb` is NULL, `ESP_ERR_INVALID_STATE` if not initialized (state must be IDLE), or `ESP_ERR_NO_MEM` if task creation fails. + +#### `ys_rfid2_stop` +```c +void ys_rfid2_stop(void); +``` +Signals the reader task to stop and blocks until it has exited, then clears the callback. + +### State and Query + +#### `ys_rfid2_get_state` +```c +ys_rfid2_state_t ys_rfid2_get_state(void); +``` +Returns the current driver state. + +#### `ys_rfid2_get_last_card` +```c +esp_err_t ys_rfid2_get_last_card(ys_rfid2_event_t *out_event); +``` +Copies the last detected card event into `out_event` (mutex-guarded, 100 ms take timeout). Returns `ESP_OK` if a card was previously detected, `ESP_ERR_NOT_FOUND` if none yet, `ESP_ERR_INVALID_ARG` if `out_event` is NULL, or `ESP_ERR_TIMEOUT` if the mutex could not be taken. + +## HAL UART Layer (`ys_rfid2_hal_uart.h`) + +A thin wrapper over ESP-IDF `driver/uart`. It installs the driver with a 256-byte RX buffer, configures 8N1 with no flow control and `UART_SCLK_DEFAULT`, and sets TX/RX pins (no RTS/CTS). It holds a single static port, so only one instance is supported at a time. + +#### `ys_rfid2_hal_uart_config_t` +```c +typedef struct { + int port; + int baud_rate; + int tx_pin; + int rx_pin; +} ys_rfid2_hal_uart_config_t; +``` + +#### API +```c +esp_err_t ys_rfid2_hal_uart_init(const ys_rfid2_hal_uart_config_t *config); +void ys_rfid2_hal_uart_deinit(void); +int ys_rfid2_hal_uart_read(uint8_t *out_data, size_t len, uint32_t timeout_ms); +esp_err_t ys_rfid2_hal_uart_write(const uint8_t *data, size_t len); +void ys_rfid2_hal_uart_flush(void); +``` + +- `ys_rfid2_hal_uart_init`: returns `ESP_OK`, `ESP_ERR_INVALID_ARG` if `config` is NULL, `ESP_ERR_INVALID_STATE` if already initialized, or a propagated `uart_*` error. +- `ys_rfid2_hal_uart_read`: wraps `uart_read_bytes`. Returns the number of bytes read, or -1 on error / not initialized. +- `ys_rfid2_hal_uart_write`: wraps `uart_write_bytes`. Returns `ESP_OK`, `ESP_ERR_INVALID_STATE` if not initialized or `data` is NULL, or `ESP_FAIL` on write error. +- `ys_rfid2_hal_uart_flush`: flushes the UART input buffer. + +## Parser Layer (`ys_rfid2_parser.h`) + +#### `ys_rfid2_parser_reset` +```c +void ys_rfid2_parser_reset(void); +``` +Discards accumulated bytes and resets the line position. + +#### `ys_rfid2_parser_feed` +```c +bool ys_rfid2_parser_feed(uint8_t byte, ys_rfid2_raw_data_t *out_raw); +``` +Feeds one byte. Returns `true` and fills `out_raw` when a complete, valid `"card number: xxxxxxxxxx@"` frame is parsed; otherwise `false`. + +## Usage Example + +```c +static void on_card(const ys_rfid2_event_t *ev, void *ctx) { + if (ev->type == YS_RFID2_EVENT_CARD_DETECTED) { + ESP_LOGI("APP", "Card: %s", ev->raw.id_str); + } else { + ESP_LOGI("APP", "Card removed"); + } +} + +void app(void) { + ys_rfid2_config_t cfg = ys_rfid2_default_config(); + ESP_ERROR_CHECK(ys_rfid2_init(&cfg)); + ESP_ERROR_CHECK(ys_rfid2_start(on_card, NULL)); + // ... + ys_rfid2_stop(); + ys_rfid2_deinit(); +} +``` diff --git a/firmware_c5/components/Drivers/i2c_init/README.md b/firmware_c5/components/Drivers/i2c_init/README.md new file mode 100644 index 000000000..f1b430fe9 --- /dev/null +++ b/firmware_c5/components/Drivers/i2c_init/README.md @@ -0,0 +1,7 @@ +# I2C Init - C5 + +Documentation for this component lives in the project docs hub (single source of truth): + +- [docs/i2c_init/README.md](../../../../docs/i2c_init/README.md) + +This file is only a pointer: edit the docs there to keep things from drifting. diff --git a/firmware_c5/components/Drivers/led/README.md b/firmware_c5/components/Drivers/led/README.md new file mode 100644 index 000000000..11dd3207b --- /dev/null +++ b/firmware_c5/components/Drivers/led/README.md @@ -0,0 +1,7 @@ +# LED - C5 (LP5816 status LED) + +Documentation for this component lives in the project docs hub (single source of truth): + +- [docs/led/README.md](../../../../docs/led/README.md) + +This file is only a pointer: edit the docs there to keep things from drifting. diff --git a/firmware_c5/components/Drivers/pins/README.md b/firmware_c5/components/Drivers/pins/README.md new file mode 100644 index 000000000..6a3242d82 --- /dev/null +++ b/firmware_c5/components/Drivers/pins/README.md @@ -0,0 +1,7 @@ +# Pins - C5 (GPIO map) + +Documentation for this component lives in the project docs hub (single source of truth): + +- [docs/pins/README.md](../../../../docs/pins/README.md) + +This file is only a pointer: edit the docs there to keep things from drifting. diff --git a/firmware_p4/components/Drivers/audio_i2s/README.md b/firmware_p4/components/Drivers/audio_i2s/README.md new file mode 100644 index 000000000..1f15ad60c --- /dev/null +++ b/firmware_p4/components/Drivers/audio_i2s/README.md @@ -0,0 +1,7 @@ +# Audio I2S - P4 (MAX98357 + PDM mic) + +Documentation for this component lives in the project docs hub (single source of truth): + +- [docs/audio_i2s/README.md](../../../../docs/audio_i2s/README.md) + +This file is only a pointer: edit the docs there to keep things from drifting. diff --git a/firmware_p4/components/Drivers/bq25896/README.md b/firmware_p4/components/Drivers/bq25896/README.md new file mode 100644 index 000000000..174bd8f00 --- /dev/null +++ b/firmware_p4/components/Drivers/bq25896/README.md @@ -0,0 +1,7 @@ +# BQ25896 - P4 (charger / PMIC) + +Documentation for this component lives in the project docs hub (single source of truth): + +- [docs/bq25896/README.md](../../../../docs/bq25896/README.md) + +This file is only a pointer: edit the docs there to keep things from drifting. diff --git a/firmware_p4/components/Drivers/drv2605l/README.md b/firmware_p4/components/Drivers/drv2605l/README.md new file mode 100644 index 000000000..bba71fdbd --- /dev/null +++ b/firmware_p4/components/Drivers/drv2605l/README.md @@ -0,0 +1,7 @@ +# DRV2605L - P4 (haptic driver) + +Documentation for this component lives in the project docs hub (single source of truth): + +- [docs/drv2605l/README.md](../../../../docs/drv2605l/README.md) + +This file is only a pointer: edit the docs there to keep things from drifting. diff --git a/firmware_p4/components/Drivers/i2c_init/README.md b/firmware_p4/components/Drivers/i2c_init/README.md new file mode 100644 index 000000000..822267d8b --- /dev/null +++ b/firmware_p4/components/Drivers/i2c_init/README.md @@ -0,0 +1,7 @@ +# I2C Init - P4 + +Documentation for this component lives in the project docs hub (single source of truth): + +- [docs/i2c_init/README.md](../../../../docs/i2c_init/README.md) + +This file is only a pointer: edit the docs there to keep things from drifting. diff --git a/firmware_p4/components/Drivers/led/README.md b/firmware_p4/components/Drivers/led/README.md new file mode 100644 index 000000000..45215fb1e --- /dev/null +++ b/firmware_p4/components/Drivers/led/README.md @@ -0,0 +1,7 @@ +# LED - P4 (LP5816 status LED) + +Documentation for this component lives in the project docs hub (single source of truth): + +- [docs/led/README.md](../../../../docs/led/README.md) + +This file is only a pointer: edit the docs there to keep things from drifting. diff --git a/firmware_p4/components/Drivers/pins/README.md b/firmware_p4/components/Drivers/pins/README.md new file mode 100644 index 000000000..a66dbef0f --- /dev/null +++ b/firmware_p4/components/Drivers/pins/README.md @@ -0,0 +1,7 @@ +# Pins - P4 (GPIO map) + +Documentation for this component lives in the project docs hub (single source of truth): + +- [docs/pins/README.md](../../../../docs/pins/README.md) + +This file is only a pointer: edit the docs there to keep things from drifting. diff --git a/firmware_p4/components/Drivers/ys_rfid2/README.md b/firmware_p4/components/Drivers/ys_rfid2/README.md new file mode 100644 index 000000000..1de11f4f5 --- /dev/null +++ b/firmware_p4/components/Drivers/ys_rfid2/README.md @@ -0,0 +1,7 @@ +# YS-RFID2 - P4 (UART RFID reader) + +Documentation for this component lives in the project docs hub (single source of truth): + +- [docs/ys_rfid2/README.md](../../../../docs/ys_rfid2/README.md) + +This file is only a pointer: edit the docs there to keep things from drifting. From 7e20fb1816a11bca8d335d80066da22ccfedac0b Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:43:04 -0300 Subject: [PATCH 085/103] docs(services): add docs for power_manager, ir and sys_time --- docs/ir/README.md | 223 ++++++++++++++++++ docs/power_manager/README.md | 79 +++++++ docs/sys_time/README.md | 92 ++++++++ firmware_p4/components/Service/ir/README.md | 7 + .../Service/power_manager/README.md | 7 + .../components/Service/sys_time/README.md | 7 + 6 files changed, 415 insertions(+) create mode 100644 docs/ir/README.md create mode 100644 docs/power_manager/README.md create mode 100644 docs/sys_time/README.md create mode 100644 firmware_p4/components/Service/ir/README.md create mode 100644 firmware_p4/components/Service/power_manager/README.md create mode 100644 firmware_p4/components/Service/sys_time/README.md diff --git a/docs/ir/README.md b/docs/ir/README.md new file mode 100644 index 000000000..fcf3dfea7 --- /dev/null +++ b/docs/ir/README.md @@ -0,0 +1,223 @@ +# IR TX/RX Service + +This component provides the infrared transmit/receive service for TentacleOS on the ESP32-P4. It drives the IR emitter and detector through the RMT peripheral, ships a full protocol decode/encode library (consumer remotes and air-conditioner state frames), a Flipper-Zero-compatible file format, a console command, and a full-power torch (flashlight) mode. + +## Overview + +- **Location:** `firmware_p4/components/Service/ir/` +- **Target:** `firmware_p4` only (ESP32-P4) +- **Main header:** `include/ir.h` +- **Companion headers:** `include/ir_protocol.h` (remote protocols), `include/ir_ac.h` (air-conditioner protocols), `include/ir_file.h` (Flipper IR file format) +- **Dependencies:** `pin_def`, `led_control`, `driver/rmt_tx`, `driver/rmt_rx`, `driver/rmt_encoder`, `driver/gpio`, `freertos` +- **Peripheral:** RMT (one RX channel + one TX channel), non-DMA +- **Console command:** `ir` (registered in `Service/console/commands/cmd_ir.c`) + +The service is brought up lazily - there is no boot-time init. Callers init the RX or TX channel on demand and release it when done, so RMT channels are not held for the whole session. + +## Hardware / Bus + +| Item | Value | Source | +|------|-------|--------| +| TX pin | `GPIO_IR_TX_PIN` = GPIO 0 | `pin_def.h` | +| RX pin | `GPIO_IR_RX_PIN` = GPIO 1 | `pin_def.h` | +| RMT resolution | 1 MHz (1 tick = 1 us) | `IR_RMT_RESOLUTION_HZ` | +| TX carrier duty | 0.33 | `IR_CARRIER_DUTY_CYCLE` | +| Default carrier | 38 kHz (protocol-dependent) | `ir_carrier_freq()` | + +The emitter is infrared and invisible to the eye: verify output with a phone camera. The TX pin rests low via an external pull-down (R90). + +### RMT tuning constants (`ir.h`) + +| Constant | Value | Meaning | +|----------|-------|---------| +| `IR_RMT_MEM_SYMBOLS` | 128 | Encode buffer size for a single frame | +| `IR_MAX_SYMBOLS` | 512 | User RX/last-frame buffer depth | +| `IR_RX_MEM_BLOCK_SYMBOLS` | 96 | Non-DMA RX FIFO depth (2x the P4 48-word block) | +| `IR_TX_MEM_BLOCK_SYMBOLS` | 64 | TX channel FIFO (2 P4 channels) | +| `IR_RX_MIN_NS` / `IR_RX_MAX_NS` | 1250 / 12000000 | RX glitch/timeout window | +| `IR_TX_QUEUE_DEPTH` | 4 | TX transaction queue depth | +| `IR_TX_WAIT_MS` | 1000 | Blocking wait for a transmit to finish | +| `IR_PRINT_MAX_SYMBOLS` | 40 | Cap on symbols logged by `ir_print_raw` | + +RX and TX are non-DMA on this board: DMA-backed `rmt_receive()` failed here, so the RX channel uses a ping-ponged FIFO into the `IR_MAX_SYMBOLS` user buffer. + +## API Reference + +### Channel lifecycle + +#### `ir_rx_init` / `ir_rx_deinit` +```c +esp_err_t ir_rx_init(void); +void ir_rx_deinit(void); +``` +`ir_rx_init` creates the RMT RX channel on `GPIO_IR_RX_PIN`, its event queue and callback, enables it, and arms a one-shot receive. Returns `ESP_OK` (idempotent if already inited), `ESP_ERR_NO_MEM` on mutex/queue failure, or an RMT error. `ir_rx_deinit` disables and deletes the channel and queue (no-op if RX was never inited). + +#### `ir_rx_prime` +```c +void ir_rx_prime(void); +``` +Resets the RX queue (drops a stale/ambient frame) and re-arms the one-shot receive if a prior frame left it idle. Call at the start of every capture: a one-shot `rmt_receive()` is consumed by every frame, including NEC repeat frames, so without priming the next `ir_receive()` could wait forever. + +#### `ir_tx_init` / `ir_tx_deinit` +```c +esp_err_t ir_tx_init(void); +void ir_tx_deinit(void); +``` +`ir_tx_init` creates the RMT TX channel on `GPIO_IR_TX_PIN`, a copy encoder, and enables the channel. Returns `ESP_OK` (idempotent) or an RMT error. `ir_tx_deinit` disables and deletes the channel and encoder and resets the cached carrier (no-op if TX was never inited). + +### Receive / decode + +#### `ir_receive` +```c +esp_err_t ir_receive(ir_data_t *out_data, uint32_t timeout_ms); +``` +Waits up to `timeout_ms` for a frame, snapshots the raw symbols (for `ir_get_last_raw`), decodes with `ir_decode`, and re-arms the channel. Signals the RGB LED (info on decode, warning on timeout/undecoded). Returns `ESP_OK` on decode, `ESP_ERR_TIMEOUT` if nothing arrived, `ESP_ERR_NOT_FOUND` if a frame arrived but did not decode, or an RMT error. + +#### `ir_get_last_raw` +```c +esp_err_t ir_get_last_raw(rmt_symbol_word_t *out_buf, size_t buf_max, size_t *out_count); +``` +Copies the raw RMT symbols from the most recent received frame (mutex-guarded). `out_count` may be NULL. Returns `ESP_ERR_INVALID_ARG` on a NULL/zero buffer, `ESP_ERR_TIMEOUT` if the mutex could not be taken. + +### Transmit / encode + +#### `ir_send` +```c +esp_err_t ir_send(const ir_data_t *data); +``` +Encodes `data` with `ir_encode` and transmits it at the protocol's carrier frequency. Requires `ir_tx_init`. Returns `ESP_ERR_INVALID_ARG` if encoding produced no symbols, else the transmit result. + +#### `ir_send_raw` +```c +esp_err_t ir_send_raw(const rmt_symbol_word_t *symbols, size_t count, uint32_t carrier_hz); +``` +Transmits a raw symbol array. Pass `carrier_hz = 0` to disable the carrier. Returns `ESP_ERR_INVALID_ARG` on a NULL/empty array. + +### Torch / flashlight + +#### `ir_flash_on` / `ir_flash_off` +```c +esp_err_t ir_flash_on(void); +esp_err_t ir_flash_off(void); +``` +`ir_flash_on` drives the emitter fully on as DC with no carrier: it releases the RMT TX channel (`ir_tx_deinit`) so it does not fight for the pin, reconfigures `GPIO_IR_TX_PIN` as a plain output, and holds it high at full power. This is continuous full-power drive - use it for tests or short bursts, do not leave it on long. `ir_flash_off` drives the pin low again (a later `ir_tx_init` re-routes it back to RMT). Both return `ESP_OK` or a GPIO driver error. + +### Logging helpers + +```c +void ir_print_raw(const rmt_symbol_word_t *symbols, size_t count); // DEBUG level, capped at IR_PRINT_MAX_SYMBOLS +void ir_print_data(const ir_data_t *data); // INFO level: protocol, address, command, repeat +``` + +## Decoded Frame (`ir_data_t`) + +```c +typedef struct { + ir_protocol_t protocol; + uint32_t address; + uint32_t command; + bool repeat; +} ir_data_t; +``` + +## Protocol Library (`ir_protocol.h`) + +The library decodes and encodes consumer-remote protocols. `ir_decode` tries all known protocols against a symbol buffer; `ir_encode` produces symbols for a given `ir_data_t`. Pulse matching uses `IR_TOLERANCE` (25%) with a strict `IR_TOLERANCE_STRICT` (6%) for protocols whose preambles are close (Pioneer vs NEC). + +| Protocol (`ir_protocol_t`) | Source | Carrier | +|----------------------------|--------|---------| +| `IR_PROTO_NEC` | `ir_protocol_nec.c` | 38 kHz | +| `IR_PROTO_NEC42` | `ir_protocol_nec42.c` | 38 kHz | +| `IR_PROTO_SAMSUNG` | `ir_protocol_samsung.c` | 38 kHz | +| `IR_PROTO_SONY` | `ir_protocol_sony.c` | 40 kHz | +| `IR_PROTO_RC5` | `ir_protocol_rc5.c` | 36 kHz | +| `IR_PROTO_RC6` | `ir_protocol_rc6.c` | 36 kHz | +| `IR_PROTO_RCA` | `ir_protocol_rca.c` | 38 kHz | +| `IR_PROTO_JVC` | `ir_protocol_jvc.c` | 38 kHz | +| `IR_PROTO_LG` | `ir_protocol_lg.c` | 38 kHz | +| `IR_PROTO_DENON` | `ir_protocol_denon.c` | 38 kHz | +| `IR_PROTO_PANASONIC` | `ir_protocol_panasonic.c` | 37 kHz | +| `IR_PROTO_PIONEER` | `ir_protocol_pioneer.c` | 40 kHz | + +Carrier constants: `IR_CARRIER_HZ_DEFAULT` (38 kHz - NEC, Samsung, LG, JVC, Denon and others), `IR_CARRIER_HZ_RC5_RC6` (36 kHz), `IR_CARRIER_HZ_SONY` (40 kHz), `IR_CARRIER_HZ_PANASONIC` (37 kHz), `IR_CARRIER_HZ_PIONEER` (40 kHz). Use `ir_carrier_freq(proto)` to resolve a protocol's carrier and `ir_protocol_name(proto)` for its display name. + +### Low-level codec building blocks + +The pulse-distance and pulse-width primitives that the per-protocol files build on are also public: + +```c +uint64_t ir_decode_pulse_distance(const rmt_symbol_word_t *symbols, size_t offset, + size_t num_bits, const ir_pulse_distance_cfg_t *cfg); +uint64_t ir_decode_pulse_width(const rmt_symbol_word_t *symbols, size_t offset, + size_t num_bits, const ir_pulse_width_cfg_t *cfg); +size_t ir_encode_pulse_distance(rmt_symbol_word_t *symbols, uint64_t data, + size_t num_bits, const ir_encode_distance_cfg_t *cfg); +size_t ir_encode_pulse_width(rmt_symbol_word_t *symbols, uint64_t data, + size_t num_bits, const ir_encode_width_cfg_t *cfg); +bool ir_match(uint32_t measured_us, uint32_t expected_us); +bool ir_match_tol(uint32_t measured_us, uint32_t expected_us, uint32_t tol_percent); +``` + +## Air-Conditioner Library (`ir_ac.h`) + +Unlike remote protocols, each AC frame carries the full appliance state (power, mode, temperature, fan) rather than a single command. The full state is captured in `ir_ac_state_t`: + +```c +typedef struct { + ir_ac_protocol_t protocol; + bool power; + ir_ac_mode_t mode; // AUTO, COOL, DRY, HEAT, FAN + uint8_t temp_c; // clamped to the target protocol's range at encode time + ir_ac_fan_t fan; // AUTO, LOW, MED, HIGH +} ir_ac_state_t; +``` + +| AC protocol (`ir_ac_protocol_t`) | Source | +|----------------------------------|--------| +| `IR_AC_PROTO_COOLIX` | `ir_ac_coolix.c` | +| `IR_AC_PROTO_GREE` | `ir_ac_gree.c` | +| `IR_AC_PROTO_LG` | `ir_ac_lg.c` | +| `IR_AC_PROTO_MIDEA` | `ir_ac_midea.c` | +| `IR_AC_PROTO_TOSHIBA` | `ir_ac_toshiba.c` | +| `IR_AC_PROTO_HAIER` | `ir_ac_haier.c` | + +```c +size_t ir_ac_encode(const ir_ac_state_t *state, rmt_symbol_word_t *symbols, size_t max); +esp_err_t ir_ac_send(const ir_ac_state_t *state); // requires ir_tx_init() +bool ir_ac_decode(const rmt_symbol_word_t *symbols, size_t count, ir_ac_state_t *out_state); +const char *ir_ac_protocol_name(ir_ac_protocol_t proto); +const char *ir_ac_mode_name(ir_ac_mode_t mode); +const char *ir_ac_fan_name(ir_ac_fan_t fan); +uint32_t ir_ac_carrier_freq(ir_ac_protocol_t proto); +``` + +## Flipper IR File Format (`ir_file.h`) + +Parses and serializes Flipper Zero `.ir` files. A file (`ir_file_t`) holds a grown-on-demand array of `ir_signal_t`, each either a decoded `ir_data_t` or a raw symbol/timing sequence. + +```c +void ir_file_init(ir_file_t *file); +void ir_file_free(ir_file_t *file); +esp_err_t ir_file_parse(const char *content, ir_file_t *file); // append parsed signals +size_t ir_file_to_string(const ir_file_t *file, char *buf, size_t buf_size); +ir_signal_t *ir_file_find(const ir_file_t *file, const char *name); +esp_err_t ir_file_send(const ir_signal_t *signal); // dispatches ir_send_raw / ir_send +esp_err_t ir_file_add_parsed(ir_file_t *file, const char *name, const ir_data_t *data); +esp_err_t ir_file_add_raw(ir_file_t *file, const ir_file_add_raw_cfg_t *cfg); +``` + +Buffer ownership: `ir_file_parse` and `ir_file_add_raw` allocate the raw buffers, and `ir_file_free` releases everything. Limits: `IR_FILE_NAME_MAX` (32), `IR_FILE_PROTO_NAME_MAX` (32), `IR_FILE_LINE_BUF_SIZE` (1024), `IR_FILE_INITIAL_CAP` (8). + +## Console Command + +Registered by `register_ir_commands()` in `Service/console/commands/cmd_ir.c`. The `rx` and `send` subcommands are one-shot: they init the RMT channel on demand and release it when done. `flash` is the exception - it stays on until `flash off`. + +``` +ir rx [timeout_ms] wait for one frame and decode it (default 5000 ms) +ir send [repeat] transmit a code (addr/cmd accept 0x hex) +ir flash drive the emitter at full power (torch) / off +``` + +- `ir rx` calls `ir_rx_init` + `ir_rx_prime`, waits for a frame, prints protocol/address/command (and `[repeat]`), then `ir_rx_deinit`. Reports timeout and undecoded-frame cases distinctly. +- `ir send` resolves the protocol name (case-insensitive), parses `addr`/`cmd` (0x hex accepted), inits TX, sends, then deinits TX. +- `ir flash on` drives the emitter to full power (`ir_flash_on`); `ir flash off` turns it off. The output is infrared - check with a phone camera. diff --git a/docs/power_manager/README.md b/docs/power_manager/README.md new file mode 100644 index 000000000..eafc618a9 --- /dev/null +++ b/docs/power_manager/README.md @@ -0,0 +1,79 @@ +# Power Manager - P4 (esp_pm DFS / light-sleep) + +System power manager for `firmware_p4`. It owns `esp_pm` and drives automatic light sleep gated by a shared `NO_LIGHT_SLEEP` lock, so the CPU only powers off when the device is genuinely idle (screen off, no active resource, not plugged in). + +## Overview + +- **Location:** `firmware_p4/components/Service/power_manager/` +- **Header:** `include/power_manager.h` +- **Sources:** `power_manager.c` (esp_pm setup + lock), `power_manager_usb.c` (TinyUSB bus callbacks) +- **Dependencies:** `esp_pm`, `esp_log`, `esp_err`, `tusb` (for the USB callbacks) +- **Gated by:** `CONFIG_PM_ENABLE`. When PM is off, all entry points are inert no-ops (USB state is still tracked); the CPU stays at a fixed frequency and never sleeps. +- **Why Service (not Core):** `power_policy` lives in Applications, which cannot depend on Core (Core already REQUIRES Applications, so that edge would be a cycle). Both Core (transitively) and Applications reach Service. + +## Power model + +- **Frequency is pinned:** `esp_pm_configure` is called with `min_freq_mhz == max_freq_mhz == 360`, so there is **no DFS**. DFS would scale the APB clock and break the console UART baud (the IDF UART driver excludes the console UART from PM). The power win here is light sleep (CPU fully off when idle), not frequency scaling. +- **Light sleep** (`light_sleep_enable = true`) engages only when nobody holds the shared `ESP_PM_NO_LIGHT_SLEEP` lock **and** all tasks are blocked. +- **The `NO_LIGHT_SLEEP` lock** is created once at init and is not held by the manager itself. Resource owners that need the CPU awake acquire it and release it themselves (screen on, active radio, host-link/OTA session, ...). It is ref-counted: while the count is `> 0` the system never light-sleeps. + +## USB / external-power gating (item 41) + +Two independent inputs feed a single internal wake hold: + +- **VBUS / external power** from the charger (battery service) via `power_manager_set_external_power`. +- **USB bus lifecycle** via `power_manager_set_usb_suspended`. + +The internal rule is `want = external_power && !usb_suspended`. When that transitions true the manager takes one `NO_LIGHT_SLEEP` hold; when it transitions false it releases it. So the device never light-sleeps while plugged in and the host has not suspended the bus (mid charge, host-link, or OTA session). + +`power_manager_usb.c` provides the strong TinyUSB bus-lifecycle callbacks (TinyUSB declares them weak). They only fire when native P4 USB is up (mux switched to native); on the default UART-bridge path TinyUSB is not installed and plugged-in state comes solely from VBUS. Mapping: + +| TinyUSB callback | USB suspended input | Effect | +|------------------|---------------------|--------| +| `tud_mount_cb` / `tud_resume_cb` | not suspended | hold wake lock (if external power) | +| `tud_umount_cb` / `tud_suspend_cb` | suspended | release wake lock | + +## API Reference + +### `power_manager_init` +```c +void power_manager_init(void); +``` +Call once early in boot. Configures `esp_pm` (pinned frequency + light sleep) and creates the shared `NO_LIGHT_SLEEP` lock. Does not acquire the lock. No-op when `CONFIG_PM_ENABLE` is off. + +### `power_manager_no_sleep_acquire` +```c +esp_err_t power_manager_no_sleep_acquire(void); +``` +Hold the CPU out of light sleep. Ref-counted: every acquire needs a matching release. Returns `ESP_ERR_INVALID_STATE` if the lock was never created; `ESP_OK` otherwise (also `ESP_OK` as a no-op when PM is disabled). + +### `power_manager_no_sleep_release` +```c +esp_err_t power_manager_no_sleep_release(void); +``` +Release one hold taken with `power_manager_no_sleep_acquire`. Same return contract as acquire. + +### `power_manager_set_external_power` +```c +void power_manager_set_external_power(bool present); +``` +Report external power (USB/charger VBUS) presence. Idempotent; recomputes the internal USB wake hold. + +### `power_manager_set_usb_suspended` +```c +void power_manager_set_usb_suspended(bool suspended); +``` +Report USB bus suspend state (from `tud_suspend`/`tud_resume`, and treated as suspended on umount). A suspended host drops the plugged-in hold. Idempotent. + +### `power_manager_external_power` +```c +bool power_manager_external_power(void); +``` +True while external power (VBUS) is present. Always valid regardless of `CONFIG_PM_ENABLE`, for battery-vs-plugged policy decisions. + +## Tunables + +| Symbol | Location | Value | Meaning | +|--------|----------|-------|---------| +| `PM_FREQ_MHZ` | `power_manager.c` | `360` | Pinned CPU frequency (min == max, no DFS). | +| `CONFIG_PM_ENABLE` | sdkconfig | - | Master gate. Off: all calls are inert no-ops. | diff --git a/docs/sys_time/README.md b/docs/sys_time/README.md new file mode 100644 index 000000000..520447564 --- /dev/null +++ b/docs/sys_time/README.md @@ -0,0 +1,92 @@ +# System Time - P4 + +Central wall-clock owner for `firmware_p4`. The HighBoy V2 has no battery-backed RTC, so wall-clock time is volatile across power cycles: the P4's internal RTC timer runs while powered but resets on power-off. Time must be injected from an external source every power cycle (console, companion app over `host_link`, or SNTP via the C5) and is maintained by the internal timer until the next power loss. The whole system runs in UTC. + +## Overview + +- **Location:** `firmware_p4/components/Service/sys_time/` +- **Header:** `include/sys_time.h` +- **Source:** `sys_time.c` +- **Dependencies:** `esp_log`, `nvs`, `esp_err`, libc `` / `` +- **Persistence:** NVS namespace `systime` (keys `last_epoch`, `last_src`) + +## Build-date baseline + +So nothing is ever dated to 1970, `sys_time_init` seeds the clock with a baseline instead of leaving it at epoch 0: + +1. It derives a build-date epoch from the compiler `__DATE__` / `__TIME__` macros (`sys_time_build_epoch`). The device cannot predate its own image, so the build date is a safe floor. If parsing the macros fails, it falls back to `SYS_TIME_EPOCH_MIN`. +2. It reads the last-known time persisted in NVS (`sys_time_saved_epoch`). +3. The baseline is raised to the NVS value **only if** the saved epoch is `>= SYS_TIME_EPOCH_MIN`, otherwise the build-date floor stands. +4. The timezone is fixed to `UTC0`, `settimeofday` applies the baseline, and the state is left at `SYS_TIME_STATE_ESTIMATED` with source `SYS_TIME_SOURCE_NONE`. + +The clock stays `ESTIMATED` (a floor, not a real time) until a real source calls `sys_time_set`, which promotes it to `SYS_TIME_STATE_SYNCED`. + +## The `SYS_TIME_EPOCH_MIN` guard + +`SYS_TIME_EPOCH_MIN` is `1735689600` (2025-01-01 00:00:00 UTC). It is used in two places: + +- **Baseline selection:** a persisted NVS epoch below the guard is treated as garbage and ignored, keeping the build-date floor. +- **Rejecting bad sets:** `sys_time_set` returns `ESP_ERR_INVALID_ARG` for any `epoch < SYS_TIME_EPOCH_MIN`, so an implausibly early value can never sync the clock. + +## API Reference + +### States and sources + +```c +typedef enum { + SYS_TIME_STATE_ESTIMATED = 0, // baseline (build date or last-known NVS); a floor + SYS_TIME_STATE_SYNCED, // set from a real external source; time() trustworthy +} sys_time_state_t; + +typedef enum { + SYS_TIME_SOURCE_NONE = 0, + SYS_TIME_SOURCE_MANUAL, // console `date` command + SYS_TIME_SOURCE_HOST, // companion app over host_link + SYS_TIME_SOURCE_SNTP, // NTP over WiFi (via the C5) +} sys_time_source_t; +``` + +### `sys_time_init` +```c +void sys_time_init(void); +``` +Fixes the timezone to UTC and seeds the clock to the later of the firmware build date and the last-known NVS time, leaving state at `SYS_TIME_STATE_ESTIMATED`. Call once at boot. + +### `sys_time_set` +```c +esp_err_t sys_time_set(time_t epoch, sys_time_source_t source); +``` +Apply a wall-clock time from a real source. Sets the clock, marks it `SYNCED`, records `source`, and persists the value to NVS. Returns `ESP_ERR_INVALID_ARG` if `epoch` is below `SYS_TIME_EPOCH_MIN`, `ESP_FAIL` if `settimeofday` fails, `ESP_OK` on success. + +### `sys_time_state` +```c +sys_time_state_t sys_time_state(void); +``` +Current trust level of the clock. + +### `sys_time_source` +```c +sys_time_source_t sys_time_source(void); +``` +Source of the last successful sync. + +### `sys_time_now` +```c +time_t sys_time_now(void); +``` +Current wall-clock (UTC); at least the boot baseline. + +### `sys_time_format` +```c +bool sys_time_format(char *out, size_t out_size, const char *fmt); +``` +Format the current time with `strftime` (UTC fields) into `out`. Sets `out` to `""` on error. Returns `false` on a bad argument or if nothing was written. + +## Tunables + +| Symbol | Value | Meaning | +|--------|-------|---------| +| `SYS_TIME_EPOCH_MIN` | `1735689600` | Plausibility floor (2025-01-01 UTC): rejects early sets and stale NVS baselines. | +| `SYS_TIME_NVS_NS` | `"systime"` | NVS namespace for last-known time. | +| `SYS_TIME_NVS_KEY_EPOCH` | `"last_epoch"` | NVS key: last synced epoch (`u64`). | +| `SYS_TIME_NVS_KEY_SRC` | `"last_src"` | NVS key: last sync source (`u8`). | diff --git a/firmware_p4/components/Service/ir/README.md b/firmware_p4/components/Service/ir/README.md new file mode 100644 index 000000000..df11c9f6f --- /dev/null +++ b/firmware_p4/components/Service/ir/README.md @@ -0,0 +1,7 @@ +# IR - P4 (infrared TX/RX) + +Documentation for this component lives in the project docs hub (single source of truth): + +- [docs/ir/README.md](../../../../docs/ir/README.md) + +This file is only a pointer: edit the docs there to keep things from drifting. diff --git a/firmware_p4/components/Service/power_manager/README.md b/firmware_p4/components/Service/power_manager/README.md new file mode 100644 index 000000000..79f7f5849 --- /dev/null +++ b/firmware_p4/components/Service/power_manager/README.md @@ -0,0 +1,7 @@ +# Power Manager - P4 (esp_pm DFS / light-sleep) + +Documentation for this component lives in the project docs hub (single source of truth): + +- [docs/power_manager/README.md](../../../../docs/power_manager/README.md) + +This file is only a pointer: edit the docs there to keep things from drifting. diff --git a/firmware_p4/components/Service/sys_time/README.md b/firmware_p4/components/Service/sys_time/README.md new file mode 100644 index 000000000..2316cb21d --- /dev/null +++ b/firmware_p4/components/Service/sys_time/README.md @@ -0,0 +1,7 @@ +# System Time - P4 + +Documentation for this component lives in the project docs hub (single source of truth): + +- [docs/sys_time/README.md](../../../../docs/sys_time/README.md) + +This file is only a pointer: edit the docs there to keep things from drifting. From c3bbb3d60090db8737819d4a8cc81bdadcc80e0b Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:43:04 -0300 Subject: [PATCH 086/103] docs: fix index link, add new component rows and correct supported-target references --- AGENTS.md | 2 +- README.md | 2 +- README.pt.md | 2 +- docs/README.md | 17 ++++++++++++++++- 4 files changed, 19 insertions(+), 4 deletions(-) diff --git a/AGENTS.md b/AGENTS.md index d2f416f06..41a5214aa 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -61,7 +61,7 @@ firmware_p4/ # ESP32-P4 master firmware (embeds C5 binary) Drivers/ # Hardware drivers (SPI, buttons, display, radio, USB) Service/ # Support services (OTA, WiFi, console, storage, SPI bridge) Core/ # System core and main managers - Applications/ # User-facing apps (UI, bad_usb, SubGhz) + Applications/ # User-facing apps (UI, bad_usb, SubGhz, gameboy, nfc) Drivers/spi_bridge_phy/ # SPI bridge physical layer (P4 side) main/main.c # Entry point common/metadata/ # Shared metadata diff --git a/README.md b/README.md index 36f6cb9b8..6d18624cb 100644 --- a/README.md +++ b/README.md @@ -45,7 +45,7 @@ See the general project architecture: ## How to use this project -We recommend that this project serves as a basis for custom projects with ESP32-S3. +We recommend that this project serves as a basis for custom projects with the ESP32-P4 and ESP32-C5. To start a new project with ESP-IDF, follow the official guide: [ESP-IDF Documentation - Create a new project](https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html#start-a-new-project) diff --git a/README.pt.md b/README.pt.md index a98a519b0..42ebee6be 100644 --- a/README.pt.md +++ b/README.pt.md @@ -47,7 +47,7 @@ Veja a arquitetura geral do projeto: ## Como utilizar este projeto -Recomendamos que este projeto sirva como base para projetos personalizados com ESP32-S3. +Recomendamos que este projeto sirva como base para projetos personalizados com o ESP32-P4 e o ESP32-C5. Para começar um novo projeto com ESP-IDF, siga o guia oficial: [Documentação ESP-IDF - Criar novo projeto](https://docs.espressif.com/projects/esp-idf/en/latest/api-guides/build-system.html#start-a-new-project) diff --git a/docs/README.md b/docs/README.md index 4a7f1569d..28434744a 100644 --- a/docs/README.md +++ b/docs/README.md @@ -14,21 +14,33 @@ README.md, separated by `---`. | Component | Docs | |-----------|------| +| `audio_i2s` | [README.md](audio_i2s/README.md) - I2S audio output driver | | `bad_usb` | [README.md](bad_usb/README.md) | | `bluetooth` | [README.md](bluetooth/README.md) | | `boot_report` | [README.md](boot_report/README.md) | +| `bq25896` | [README.md](bq25896/README.md) - TI BQ25896 battery charger / PMIC driver | +| `bridge_manager` | [README.md](bridge_manager/README.md) - P4<->C5 bridge lifecycle and coordination service | | `buttons_gpio` | [README.md](buttons_gpio/README.md) | | `c5_flasher` | [README.md](c5_flasher/README.md) | | `cc1101` | [README.md](cc1101/README.md) | | `console` | [README.md](console/README.md) | | `dns_server` | [README.md](dns_server/README.md) | +| `drv2605l` | [README.md](drv2605l/README.md) - TI DRV2605L haptic motor driver | | `esp_now` | [README.md](esp_now/README.md) | | `espnow_chat` | [README.md](espnow_chat/README.md) | +| `gameboy` | [README.md](gameboy/README.md) - Game Boy emulator application | | `host_link` | [app-guide.md](host_link/app-guide.md) [protocol.md](host_link/protocol.md) [README.md](host_link/README.md) | | `http_server` | [README.md](http_server/README.md) | +| `i2c_init` | [README.md](i2c_init/README.md) - shared I2C bus initialization driver | | `input_manager` | [README.md](input_manager/README.md) | -| `lvgl_port` | [README.md](lvgl_port/README.md) | +| `ir` | [README.md](ir/README.md) - infrared transmit/receive service | +| `led` | [README.md](led/README.md) - status/RGB LED driver | +| `LoRa` | [README.md](LoRa/README.md) - LoRa messaging application | +| `lvgl` | [README.md](lvgl/README.md) | +| `nfc` | [README.md](nfc/README.md) - NFC read/write application | | `ota` | [README.md](ota/README.md) | +| `pins` | [README.md](pins/README.md) - board pin assignment definitions | +| `power_manager` | [README.md](power_manager/README.md) - battery and power-state management service | | `recovery` | [README.md](recovery/README.md) | | `sd_card` | [README.md](sd_card/README.md) | | `spi` | [README.md](spi/README.md) | @@ -38,8 +50,11 @@ README.md, separated by `---`. | `storage_assets` | [README.md](storage_assets/README.md) | | `storage_vfs` | [README.md](storage_vfs/README.md) | | `SubGhz` | [README.md](SubGhz/README.md) | +| `sx1262` | [README.md](sx1262/README.md) - Semtech SX1262 LoRa radio transceiver driver | | `sys_monitor` | [README.md](sys_monitor/README.md) | | `sys_prio` | [README.md](sys_prio/README.md) | +| `sys_time` | [README.md](sys_time/README.md) - system clock / RTC time service | | `tusb_desc` | [README.md](tusb_desc/README.md) | | `ui` | [README.md](ui/README.md) [input-migration.md](ui/input-migration.md) | | `wifi` | [README.md](wifi/README.md) | +| `ys_rfid2` | [README.md](ys_rfid2/README.md) - YS-RFID2 125 kHz RFID reader driver | From a84e9b132208e5f1f7d71c7632c94b18976dccfe Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Wed, 19 Aug 2026 20:52:44 -0300 Subject: [PATCH 087/103] refactor(storage_api): remove dead tos_log SD tee and its stale stack-table entry --- .../Service/console/commands/cmd_system.c | 1 - .../Service/storage_api/include/tos_log.h | 55 --- .../components/Service/storage_api/tos_log.c | 342 ------------------ 3 files changed, 398 deletions(-) delete mode 100644 firmware_p4/components/Service/storage_api/include/tos_log.h delete mode 100644 firmware_p4/components/Service/storage_api/tos_log.c diff --git a/firmware_p4/components/Service/console/commands/cmd_system.c b/firmware_p4/components/Service/console/commands/cmd_system.c index de9991a67..84f997143 100644 --- a/firmware_p4/components/Service/console/commands/cmd_system.c +++ b/firmware_p4/components/Service/console/commands/cmd_system.c @@ -253,7 +253,6 @@ static const stack_alloc_t STACK_ALLOC[] = { {"hl_log", 6144}, {"SysMonitor", 4096}, {"wifi_status", 4096}, - {"tos_log", 4096}, {"hl_ble", 4096}, }; #define STACK_ALLOC_COUNT (sizeof(STACK_ALLOC) / sizeof(STACK_ALLOC[0])) diff --git a/firmware_p4/components/Service/storage_api/include/tos_log.h b/firmware_p4/components/Service/storage_api/include/tos_log.h deleted file mode 100644 index c6c9acaf8..000000000 --- a/firmware_p4/components/Service/storage_api/include/tos_log.h +++ /dev/null @@ -1,55 +0,0 @@ -// Copyright (c) 2025 HIGH CODE LLC -// -// TentacleOS is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TentacleOS is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with TentacleOS. If not, see . - -#ifndef TOS_LOG_H -#define TOS_LOG_H - -#ifdef __cplusplus -extern "C" { -#endif - -#include "esp_err.h" - -/** - * @brief Initialize the persistent log system. - * - * Redirects all ESP_LOGx output to a file on the SD card via - * esp_log_set_vprintf. Logs are written to both serial and file - * simultaneously. - * - * Log files are rotated automatically: - * - sys.1.log (current) -> sys.2.log -> ... -> sys.5.log - * - Maximum 5 files, total limited to 10 MB - * - When sys.1.log exceeds 2 MB, rotation occurs - * - * @return - * - ESP_OK on success - * - ESP_FAIL if the log file cannot be opened - */ -esp_err_t tos_log_init(void); - -/** - * @brief Flush and close the log file. - * - * Restores the default ESP_LOG vprintf handler. Call this before - * unmounting the SD card. - */ -void tos_log_deinit(void); - -#ifdef __cplusplus -} -#endif - -#endif // TOS_LOG_H diff --git a/firmware_p4/components/Service/storage_api/tos_log.c b/firmware_p4/components/Service/storage_api/tos_log.c deleted file mode 100644 index bea5369cc..000000000 --- a/firmware_p4/components/Service/storage_api/tos_log.c +++ /dev/null @@ -1,342 +0,0 @@ -// Copyright (c) 2025 HIGH CODE LLC -// -// TentacleOS is free software: you can redistribute it and/or modify -// it under the terms of the GNU General Public License as published by -// the Free Software Foundation, either version 3 of the License, or -// (at your option) any later version. -// -// TentacleOS is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU General Public License for more details. -// -// You should have received a copy of the GNU General Public License -// along with TentacleOS. If not, see . - -#include "tos_log.h" - -#include -#include -#include -#include - -#include "esp_log.h" -#include "freertos/FreeRTOS.h" -#include "freertos/semphr.h" -#include "freertos/task.h" -#include "sys_prio.h" - -#include "storage_init.h" -#include "tos_storage_paths.h" - -static const char *TAG = "TOS_LOG"; - -#define LOG_DIR TOS_PATH_LOGS -#define LOG_FILE_FMT LOG_DIR "/sys.%d.log" -#define LOG_MAX_FILES 5 -#define LOG_MAX_SIZE (2 * 1024 * 1024) // 2 MB per file (total max = 10 MB) -#define LOG_PATH_LEN 64 - -// The log hook runs in the context of whichever task called ESP_LOGx, so it may -// never touch the filesystem: doing so put a flash write (cache disabled, non-IRAM -// interrupts masked) on the hot path of radio/UI tasks. Instead it formats the -// line and appends it to a RAM buffer under a mutex; a dedicated task drains the -// buffer to flash in batches, off the logging tasks' critical paths, and is the -// only code that opens, writes, flushes, or rotates the file. -#define LOG_BUF_SIZE 2048 // RAM buffer, double-buffered on flush -#define LOG_LINE_MAX 256 // max bytes captured from one log line -#define LOG_FLUSH_MS 1000 // periodic drain interval -#define LOG_HIGH_WATER (LOG_BUF_SIZE * 3 / 4) // early-drain threshold for bursts -#define LOG_LOCK_WAIT_MS 50 // append gives up rather than block -#define LOG_TASK_STACK 4096 -#define LOG_TASK_PRIO SYS_PRIO_BACKGROUND -#define LOG_STOP_WAIT_MS 2000 - -static FILE *s_log_file = NULL; -static vprintf_like_t s_original_vprintf = NULL; - -static SemaphoreHandle_t s_lock = NULL; // guards s_buf, s_buf_len, s_dropped -static SemaphoreHandle_t s_stop_done = NULL; // flush task signals teardown complete -static TaskHandle_t s_flush_task = NULL; -static volatile bool s_ready = false; -static volatile bool s_stop = false; - -static uint8_t s_buf[LOG_BUF_SIZE]; // accumulation buffer (append path) -static uint8_t s_scratch[LOG_BUF_SIZE]; // drain buffer (flush task only) -static size_t s_buf_len = 0; -static size_t s_dropped = 0; // bytes dropped while buffer was full - -static void build_path(char *out_path, int index) { - snprintf(out_path, LOG_PATH_LEN, LOG_FILE_FMT, index); -} - -static long get_file_size(const char *path) { - struct stat st; - if (stat(path, &st) != 0) { - return 0; - } - return st.st_size; -} - -/** - * Rotate log files (flush task / init only, never the append path): - * sys.5.log -> deleted - * sys.4.log -> sys.5.log - * sys.3.log -> sys.4.log - * sys.2.log -> sys.3.log - * sys.1.log -> sys.2.log - * (new sys.1.log created) - */ -static void rotate_logs(void) { - if (s_log_file != NULL) { - fclose(s_log_file); - s_log_file = NULL; - } - - char old_path[LOG_PATH_LEN]; - char new_path[LOG_PATH_LEN]; - - build_path(old_path, LOG_MAX_FILES); - remove(old_path); - - for (int i = LOG_MAX_FILES - 1; i >= 1; i--) { - build_path(old_path, i); - build_path(new_path, i + 1); - rename(old_path, new_path); - } - - build_path(old_path, 1); - s_log_file = fopen(old_path, "w"); -} - -// Move the accumulated buffer to flash. Holds the lock only for the swap so -// logging tasks never wait on flash. All file I/O and rotation happen here. -static void flush_once(void) { - if (s_log_file == NULL) { - return; - } - - size_t len = 0; - size_t dropped = 0; - - if (xSemaphoreTake(s_lock, portMAX_DELAY) == pdTRUE) { - if (s_buf_len > 0) { - memcpy(s_scratch, s_buf, s_buf_len); - len = s_buf_len; - s_buf_len = 0; - } - dropped = s_dropped; - s_dropped = 0; - xSemaphoreGive(s_lock); - } - - if (len == 0 && dropped == 0) { - return; - } - - if (len > 0) { - fwrite(s_scratch, 1, len, s_log_file); - } - if (dropped > 0) { - fprintf(s_log_file, "\n[TOS_LOG] %u bytes dropped (buffer full)\n", (unsigned)dropped); - } - fflush(s_log_file); - - if (ftell(s_log_file) >= LOG_MAX_SIZE) { - rotate_logs(); - } -} - -static void flush_task(void *pvParameters) { - (void)pvParameters; - - while (!s_stop) { - // Wake on the periodic tick or on an early-drain notification from a burst. - ulTaskNotifyTake(pdTRUE, pdMS_TO_TICKS(LOG_FLUSH_MS)); - flush_once(); - } - - flush_once(); // final drain on teardown - xSemaphoreGive(s_stop_done); - vTaskDelete(NULL); -} - -static int log_to_file(const char *fmt, va_list args) { - // Re-entrancy guard: this IS the global vprintf hook, so if anything in the - // serial-print path below logs (e.g. a UART/PM driver warning during a DFS - // frequency switch), it would re-enter here and recurse until the stack - // overflows. Break that: while we are inside our own s_original_vprintf on this - // core, drop any nested log line. Per-core (not global) so the two cores never - // clobber each other's guard; the recursion we care about is synchronous on - // one core. - static volatile bool s_in_vprintf[portNUM_PROCESSORS]; - BaseType_t core = xPortGetCoreID(); - if (s_in_vprintf[core]) { - return 0; // nested log from within the print path: drop to stop recursion - } - - s_in_vprintf[core] = true; - int ret = s_original_vprintf(fmt, args); - s_in_vprintf[core] = false; - - if (!s_ready || !storage_is_mounted()) { - return ret; - } - - // This is the global vprintf hook, so it runs on whatever task is logging - - // keep it off the caller's stack. Take the lock first, then format into a - // shared static buffer (guarded by the same lock) instead of a stack temp. - if (xSemaphoreTake(s_lock, pdMS_TO_TICKS(LOG_LOCK_WAIT_MS)) != pdTRUE) { - return ret; // contended: skip file copy, serial already has the line - } - - // vsnprintf returns the length it would have written; clamp to what fits - // (drops the trailing NUL and any overflow of an unusually long line). - static char line[LOG_LINE_MAX]; - va_list ap; - va_copy(ap, args); - int n = vsnprintf(line, sizeof(line), fmt, ap); - va_end(ap); - if (n <= 0) { - xSemaphoreGive(s_lock); - return ret; - } - size_t wlen = (n >= (int)sizeof(line)) ? (sizeof(line) - 1) : (size_t)n; - - bool over_high_water = false; - if (s_buf_len + wlen > LOG_BUF_SIZE) { - // Drop the whole line so the file never holds a torn record. - s_dropped += wlen; - } else { - memcpy(s_buf + s_buf_len, line, wlen); - s_buf_len += wlen; - over_high_water = (s_buf_len >= LOG_HIGH_WATER); - } - xSemaphoreGive(s_lock); - - if (over_high_water && s_flush_task != NULL) { - xTaskNotifyGive(s_flush_task); - } - - return ret; -} - -esp_err_t tos_log_init(void) { - if (s_ready) { - return ESP_ERR_INVALID_STATE; - } - - if (!storage_is_mounted()) { - return ESP_ERR_INVALID_STATE; - } - - esp_err_t err = ESP_OK; - - // Open current log file (append to existing sys.1.log). - char path[LOG_PATH_LEN]; - build_path(path, 1); - s_log_file = fopen(path, "a"); - if (s_log_file == NULL) { - ESP_LOGE(TAG, "Failed to open log file: %s", path); - return ESP_FAIL; - } - - // Rotate on startup if the current file is already full (single-threaded here, - // before the hook and flush task exist). - if (get_file_size(path) >= LOG_MAX_SIZE) { - rotate_logs(); - if (s_log_file == NULL) { - ESP_LOGE(TAG, "Failed to reopen log file after startup rotation"); - return ESP_FAIL; - } - } - - s_lock = xSemaphoreCreateMutex(); - s_stop_done = xSemaphoreCreateBinary(); - if (s_lock == NULL || s_stop_done == NULL) { - err = ESP_ERR_NO_MEM; - goto cleanup; - } - - s_buf_len = 0; - s_dropped = 0; - s_stop = false; - - if (xTaskCreatePinnedToCore(flush_task, - "tos_log", - LOG_TASK_STACK, - NULL, - LOG_TASK_PRIO, - &s_flush_task, - SYS_CORE_RADIO) != pdPASS) { - ESP_LOGE(TAG, "Failed to create log flush task"); - err = ESP_FAIL; - goto cleanup; - } - - // Install the hook last, once the buffer and drain task are ready to receive. - s_ready = true; - s_original_vprintf = esp_log_set_vprintf(log_to_file); - - ESP_LOGI(TAG, - "Log system initialized (file: %s, %d files x %d MB, buffer %d B, flush %d ms)", - path, - LOG_MAX_FILES, - LOG_MAX_SIZE / (1024 * 1024), - LOG_BUF_SIZE, - LOG_FLUSH_MS); - - return ESP_OK; - -cleanup: - if (s_flush_task != NULL) { - s_flush_task = NULL; - } - if (s_stop_done != NULL) { - vSemaphoreDelete(s_stop_done); - s_stop_done = NULL; - } - if (s_lock != NULL) { - vSemaphoreDelete(s_lock); - s_lock = NULL; - } - if (s_log_file != NULL) { - fclose(s_log_file); - s_log_file = NULL; - } - return err; -} - -void tos_log_deinit(void) { - // Restore the default handler first so no new lines are buffered during teardown. - if (s_original_vprintf != NULL) { - esp_log_set_vprintf(s_original_vprintf); - s_original_vprintf = NULL; - } - s_ready = false; - - // Stop the flush task and let it drain what is left. - if (s_flush_task != NULL) { - s_stop = true; - xTaskNotifyGive(s_flush_task); - if (s_stop_done != NULL) { - xSemaphoreTake(s_stop_done, pdMS_TO_TICKS(LOG_STOP_WAIT_MS)); - } - s_flush_task = NULL; - } - - if (s_log_file != NULL) { - fclose(s_log_file); - s_log_file = NULL; - } - if (s_stop_done != NULL) { - vSemaphoreDelete(s_stop_done); - s_stop_done = NULL; - } - if (s_lock != NULL) { - vSemaphoreDelete(s_lock); - s_lock = NULL; - } - - ESP_LOGI(TAG, "Log system deinitialized"); -} From 94b12df90d5a2f1b9182400e2070f82f3b6b3984 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 21:14:23 -0300 Subject: [PATCH 088/103] fix(cc1101): serialize spi3 transactions through the shared bus lock --- .../components/Drivers/cc1101/cc1101.c | 19 ++++++++++++++----- 1 file changed, 14 insertions(+), 5 deletions(-) diff --git a/firmware_p4/components/Drivers/cc1101/cc1101.c b/firmware_p4/components/Drivers/cc1101/cc1101.c index ea77ff09f..47d1b0f7a 100644 --- a/firmware_p4/components/Drivers/cc1101/cc1101.c +++ b/firmware_p4/components/Drivers/cc1101/cc1101.c @@ -49,6 +49,8 @@ #define CC1101_MOD_4FSK 3 #define CC1101_MOD_MSK 4 +#define CC1101_BUS_LOCK_TIMEOUT_MS 1000 + static const char *TAG = "CC1101_DRIVER"; static spi_device_handle_t s_cc1101_spi = NULL; @@ -133,6 +135,13 @@ static void cc1101_enable_sniffer_mode(uint32_t freq_hz, uint8_t modulation) { cc1101_strobe(CC1101_SRX); } +static void cc1101_txn(spi_transaction_t *t) { + bool locked = spi_bus_lock_take(CC1101_BUS_LOCK_TIMEOUT_MS); + spi_device_transmit(s_cc1101_spi, t); + if (locked) + spi_bus_lock_give(); +} + void cc1101_write_burst(uint8_t reg, const uint8_t *buf, uint8_t len) { if (s_cc1101_spi == NULL) return; @@ -150,7 +159,7 @@ void cc1101_write_burst(uint8_t reg, const uint8_t *buf, uint8_t len) { t.tx_buffer = tx_buf; t.rx_buffer = NULL; - spi_device_transmit(s_cc1101_spi, &t); + cc1101_txn(&t); free(tx_buf); } @@ -164,7 +173,7 @@ void cc1101_write_reg(uint8_t reg, uint8_t val) { t.flags = SPI_TRANS_USE_TXDATA; t.tx_data[0] = reg; t.tx_data[1] = val; - spi_device_transmit(s_cc1101_spi, &t); + cc1101_txn(&t); } uint8_t cc1101_read_reg(uint8_t reg) { @@ -176,7 +185,7 @@ uint8_t cc1101_read_reg(uint8_t reg) { t.flags = SPI_TRANS_USE_TXDATA | SPI_TRANS_USE_RXDATA; t.tx_data[0] = 0x80 | reg; // Read bit t.tx_data[1] = 0x00; - spi_device_transmit(s_cc1101_spi, &t); + cc1101_txn(&t); return t.rx_data[1]; } @@ -203,7 +212,7 @@ void cc1101_read_burst(uint8_t reg, uint8_t *buf, uint8_t len) { t.tx_buffer = tx_buf; t.rx_buffer = rx_buf; - spi_device_transmit(s_cc1101_spi, &t); + cc1101_txn(&t); memcpy(buf, &rx_buf[1], len); @@ -219,7 +228,7 @@ void cc1101_strobe(uint8_t cmd) { t.length = 8; t.flags = SPI_TRANS_USE_TXDATA; t.tx_data[0] = cmd; - spi_device_transmit(s_cc1101_spi, &t); + cc1101_txn(&t); } void cc1101_calibrate(void) { From 4395e6821e45c82df2640a0accdb0ae81bfd1371 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 21:14:23 -0300 Subject: [PATCH 089/103] fix(subghz): transmit on gdo0 to match the async rx pin --- firmware_p4/components/Applications/SubGhz/subghz_transmitter.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/firmware_p4/components/Applications/SubGhz/subghz_transmitter.c b/firmware_p4/components/Applications/SubGhz/subghz_transmitter.c index ce4765028..bb72836ce 100644 --- a/firmware_p4/components/Applications/SubGhz/subghz_transmitter.c +++ b/firmware_p4/components/Applications/SubGhz/subghz_transmitter.c @@ -156,7 +156,7 @@ esp_err_t subghz_tx_init(void) { .resolution_hz = RMT_RESOLUTION_HZ, .mem_block_symbols = RMT_MEM_BLOCK_SYMBOLS, .trans_queue_depth = RMT_TRANS_QUEUE_DEPTH, - .gpio_num = GPIO_CC1101_GDO2_PIN, + .gpio_num = GPIO_CC1101_GDO0_PIN, .flags.invert_out = false, }; esp_err_t err = rmt_new_tx_channel(&tx_channel_cfg, &s_tx_channel); From 8b6710bdb66f882cf1c0f0aa010a16423bbaaec9 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 21:14:23 -0300 Subject: [PATCH 090/103] fix(subghz): pace the analyzer sweep to release the spi bus --- firmware_p4/components/Applications/SubGhz/subghz_spectrum.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/firmware_p4/components/Applications/SubGhz/subghz_spectrum.c b/firmware_p4/components/Applications/SubGhz/subghz_spectrum.c index 7e6f8cfd5..dd70fea10 100644 --- a/firmware_p4/components/Applications/SubGhz/subghz_spectrum.c +++ b/firmware_p4/components/Applications/SubGhz/subghz_spectrum.c @@ -33,8 +33,8 @@ static const char *TAG = "SUBGHZ_SPECTRUM"; #define RSSI_SAMPLE_DELAY_US 20 #define RSSI_SAMPLE_COUNT 3 #define RSSI_MIN_DBM (-130.0f) -#define YIELD_INTERVAL 16 -#define SWEEP_DELAY_MS 5 +#define YIELD_INTERVAL 1 +#define SWEEP_DELAY_MS 15 #define MUTEX_TIMEOUT_MS 10 #define GET_LINE_TIMEOUT_MS 5 #define SPECTRUM_TASK_STACK 4096 From cb838fa2a7f7df6d07086e1ebb29abf43fb53060 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 21:14:23 -0300 Subject: [PATCH 091/103] feat(subghz): store captures as real sub files on the sd card --- .../SubGhz/include/subghz_storage.h | 39 +++++ .../Applications/SubGhz/subghz_storage.c | 163 ++++++++++++++++-- 2 files changed, 185 insertions(+), 17 deletions(-) diff --git a/firmware_p4/components/Applications/SubGhz/include/subghz_storage.h b/firmware_p4/components/Applications/SubGhz/include/subghz_storage.h index 21460af30..bdbe380d7 100644 --- a/firmware_p4/components/Applications/SubGhz/include/subghz_storage.h +++ b/firmware_p4/components/Applications/SubGhz/include/subghz_storage.h @@ -27,6 +27,18 @@ extern "C" { #endif +#define SUBGHZ_STORAGE_NAME_MAX 40 +#define SUBGHZ_STORAGE_PROTO_MAX 24 + +/** + * @brief Metadata for one saved Sub-GHz capture (parsed from its .sub header). + */ +typedef struct { + char name[SUBGHZ_STORAGE_NAME_MAX]; /**< @brief File name without the .sub suffix. */ + char protocol[SUBGHZ_STORAGE_PROTO_MAX]; /**< @brief Protocol label ("RAW" for raw captures). */ + uint32_t frequency; /**< @brief Center frequency in Hz. */ +} subghz_storage_entry_t; + /** * @brief Initialize the Sub-GHz storage subsystem. * @@ -34,6 +46,33 @@ extern "C" { */ esp_err_t subghz_storage_init(void); +/** + * @brief List saved captures on the SD card. + * + * @param out Destination array. + * @param max_entries Capacity of the destination array. + * @return Number of entries written, or -1 on error. + */ +int subghz_storage_list(subghz_storage_entry_t *out, int max_entries); + +/** + * @brief Read a saved capture's raw .sub text. + * + * @param name Capture name (without .sub). + * @param out_buf Destination buffer (null-terminated on success). + * @param out_size Size of the destination buffer. + * @return Number of bytes read, or -1 on error. + */ +int subghz_storage_read(const char *name, char *out_buf, size_t out_size); + +/** + * @brief Delete a saved capture. + * + * @param name Capture name (without .sub). + * @return esp_err_t ESP_OK on success, or an error code on failure. + */ +esp_err_t subghz_storage_delete(const char *name); + /** * @brief Save a decoded signal to persistent storage. * diff --git a/firmware_p4/components/Applications/SubGhz/subghz_storage.c b/firmware_p4/components/Applications/SubGhz/subghz_storage.c index ac6652d89..d892558a7 100644 --- a/firmware_p4/components/Applications/SubGhz/subghz_storage.c +++ b/firmware_p4/components/Applications/SubGhz/subghz_storage.c @@ -15,23 +15,63 @@ #include "subghz_storage.h" +#include #include #include +#include #include "esp_log.h" +#include "storage_mkdir.h" #include "subghz_protocol_serializer.h" +#include "tos_storage_paths.h" static const char *TAG = "SUBGHZ_STORAGE"; #define DECODED_BUF_SIZE 1024 -#define RAW_BUF_SIZE 4096 +#define RAW_BUF_SIZE 8192 +#define STORAGE_DIR TOS_PATH_SUBGHZ +#define PATH_BUF_SIZE 128 +#define HEADER_PEEK_SIZE 256 +#define SUB_EXT ".sub" + +static void build_path(char *out, size_t out_size, const char *name) { + snprintf(out, out_size, "%s/%s%s", STORAGE_DIR, name, SUB_EXT); +} -esp_err_t subghz_storage_init(void) { - ESP_LOGI(TAG, "Storage API Initialized (Placeholder Mode)"); +static esp_err_t write_file(const char *name, const char *content, size_t len) { + if (name == NULL || content == NULL || len == 0) + return ESP_ERR_INVALID_ARG; + + storage_mkdir_recursive(STORAGE_DIR); + + char path[PATH_BUF_SIZE]; + build_path(path, sizeof(path), name); + + FILE *f = fopen(path, "wb"); + if (f == NULL) { + ESP_LOGE(TAG, "open for write failed: %s", path); + return ESP_FAIL; + } + + size_t written = fwrite(content, 1, len, f); + fclose(f); + + if (written != len) { + ESP_LOGE(TAG, "short write: %s (%u/%u)", path, (unsigned)written, (unsigned)len); + return ESP_FAIL; + } + + ESP_LOGI(TAG, "saved %s (%u bytes)", path, (unsigned)len); return ESP_OK; } +esp_err_t subghz_storage_init(void) { + esp_err_t err = storage_mkdir_recursive(STORAGE_DIR); + ESP_LOGI(TAG, "storage ready at %s", STORAGE_DIR); + return err; +} + esp_err_t subghz_storage_save_decoded(const char *name, const subghz_data_t *data, uint32_t frequency, @@ -42,18 +82,14 @@ esp_err_t subghz_storage_save_decoded(const char *name, } char *buf = malloc(DECODED_BUF_SIZE); - if (buf == NULL) { - ESP_LOGE(TAG, "Failed to allocate decoded buffer"); + if (buf == NULL) return ESP_ERR_NO_MEM; - } - - subghz_protocol_serialize_decoded(data, frequency, te, buf, DECODED_BUF_SIZE); - ESP_LOGI(TAG, "Saving Decoded Signal to %s...", name); - ESP_LOGI(TAG, "\n--- FILE CONTENT START (%s) ---\n%s--- FILE CONTENT END ---\n", name, buf); + size_t len = subghz_protocol_serialize_decoded(data, frequency, te, buf, DECODED_BUF_SIZE); + esp_err_t err = write_file(name, buf, len); free(buf); - return ESP_OK; + return err; } esp_err_t @@ -64,16 +100,109 @@ subghz_storage_save_raw(const char *name, const int32_t *pulses, size_t count, u } char *buf = malloc(RAW_BUF_SIZE); - if (buf == NULL) { - ESP_LOGE(TAG, "Failed to allocate raw buffer"); + if (buf == NULL) return ESP_ERR_NO_MEM; + + size_t len = subghz_protocol_serialize_raw(pulses, count, frequency, buf, RAW_BUF_SIZE); + esp_err_t err = write_file(name, buf, len); + + free(buf); + return err; +} + +int subghz_storage_read(const char *name, char *out_buf, size_t out_size) { + if (name == NULL || out_buf == NULL || out_size == 0) + return -1; + + char path[PATH_BUF_SIZE]; + build_path(path, sizeof(path), name); + + FILE *f = fopen(path, "rb"); + if (f == NULL) + return -1; + + size_t rd = fread(out_buf, 1, out_size - 1, f); + fclose(f); + out_buf[rd] = '\0'; + return (int)rd; +} + +static void parse_header(const char *content, + char *proto_out, + size_t proto_size, + uint32_t *freq_out) { + proto_out[0] = '\0'; + *freq_out = 0; + + const char *fp = strstr(content, "Frequency: "); + if (fp != NULL) + *freq_out = (uint32_t)strtoul(fp + strlen("Frequency: "), NULL, 10); + + const char *pp = strstr(content, "Protocol: "); + if (pp != NULL) { + pp += strlen("Protocol: "); + size_t i = 0; + while (pp[i] != '\0' && pp[i] != '\n' && pp[i] != '\r' && i < proto_size - 1) { + proto_out[i] = pp[i]; + i++; + } + proto_out[i] = '\0'; } +} - subghz_protocol_serialize_raw(pulses, count, frequency, buf, RAW_BUF_SIZE); +int subghz_storage_list(subghz_storage_entry_t *out, int max_entries) { + if (out == NULL || max_entries <= 0) + return -1; + + DIR *d = opendir(STORAGE_DIR); + if (d == NULL) + return 0; + + int count = 0; + struct dirent *ent; + char content[HEADER_PEEK_SIZE]; + + while ((ent = readdir(d)) != NULL && count < max_entries) { + if (ent->d_name[0] == '.') + continue; + const char *dot = strrchr(ent->d_name, '.'); + if (dot == NULL || strcmp(dot, SUB_EXT) != 0) + continue; + + size_t base_len = (size_t)(dot - ent->d_name); + if (base_len == 0 || base_len >= SUBGHZ_STORAGE_NAME_MAX) + continue; + + subghz_storage_entry_t *e = &out[count]; + memcpy(e->name, ent->d_name, base_len); + e->name[base_len] = '\0'; + e->protocol[0] = '\0'; + e->frequency = 0; + + int rd = subghz_storage_read(e->name, content, sizeof(content)); + if (rd > 0) + parse_header(content, e->protocol, sizeof(e->protocol), &e->frequency); + if (e->protocol[0] == '\0') + strlcpy(e->protocol, "RAW", sizeof(e->protocol)); + + count++; + } - ESP_LOGI(TAG, "Saving RAW Signal to %s...", name); - ESP_LOGI(TAG, "\n--- FILE CONTENT START (%s) ---\n%s--- FILE CONTENT END ---\n", name, buf); + closedir(d); + return count; +} - free(buf); +esp_err_t subghz_storage_delete(const char *name) { + if (name == NULL) + return ESP_ERR_INVALID_ARG; + + char path[PATH_BUF_SIZE]; + build_path(path, sizeof(path), name); + + if (remove(path) != 0) { + ESP_LOGE(TAG, "delete failed: %s", path); + return ESP_FAIL; + } + ESP_LOGI(TAG, "deleted %s", path); return ESP_OK; } From df706b27876cc3893269b89b7bc9f3498d5557ed Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 21:14:24 -0300 Subject: [PATCH 092/103] feat(subghz): publish decoded captures through a poll api --- .../SubGhz/include/subghz_receiver.h | 23 ++++++ .../Applications/SubGhz/subghz_receiver.c | 77 +++++++++++++++++++ 2 files changed, 100 insertions(+) diff --git a/firmware_p4/components/Applications/SubGhz/include/subghz_receiver.h b/firmware_p4/components/Applications/SubGhz/include/subghz_receiver.h index 8f0da732a..08d05c149 100644 --- a/firmware_p4/components/Applications/SubGhz/include/subghz_receiver.h +++ b/firmware_p4/components/Applications/SubGhz/include/subghz_receiver.h @@ -23,6 +23,8 @@ #include "esp_err.h" #include "cc1101.h" +#include "subghz_analyzer.h" +#include "subghz_types.h" #ifdef __cplusplus extern "C" { @@ -37,6 +39,27 @@ typedef enum { SUBGHZ_MODE_COUNT /**< @brief Number of receiver modes (sentinel). */ } subghz_mode_t; +/** + * @brief Latest capture published by the receiver task for UI consumers. + */ +typedef struct { + uint32_t seq; /**< @brief Capture counter; 0 means nothing captured yet. */ + bool decoded; /**< @brief true if a known protocol was decoded. */ + subghz_data_t data; /**< @brief Decoded fields; protocol_name points to name_buf. */ + char name_buf[32]; /**< @brief Backing storage for data.protocol_name. */ + char save_name[40]; /**< @brief File name the capture was auto-saved under. */ + uint32_t freq; /**< @brief Frequency in Hz at the moment of capture. */ + subghz_analyzer_result_t analysis; /**< @brief Timing/modulation analysis of the capture. */ +} subghz_rx_result_t; + +/** + * @brief Copy the most recent capture published by the receiver task. + * + * @param out Destination buffer. + * @return true if a capture is available (out is filled), false otherwise. + */ +bool subghz_receiver_get_result(subghz_rx_result_t *out); + /** * @brief Start the Sub-GHz receiver. * diff --git a/firmware_p4/components/Applications/SubGhz/subghz_receiver.c b/firmware_p4/components/Applications/SubGhz/subghz_receiver.c index d34bd4ab6..46f587fd1 100644 --- a/firmware_p4/components/Applications/SubGhz/subghz_receiver.c +++ b/firmware_p4/components/Applications/SubGhz/subghz_receiver.c @@ -15,6 +15,8 @@ #include "subghz_receiver.h" +#include + #include "driver/gpio.h" #include "driver/rmt_rx.h" #include "driver/rmt_encoder.h" @@ -23,6 +25,7 @@ #include "freertos/task.h" #include "sys_prio.h" #include "freertos/queue.h" +#include "freertos/semphr.h" #include "cc1101.h" #include "pin_def.h" @@ -30,6 +33,7 @@ #include "subghz_protocol_registry.h" #include "subghz_analyzer.h" #include "subghz_storage.h" +#include "subghz_transmitter.h" static const char *TAG = "SUBGHZ_RX"; @@ -79,6 +83,49 @@ static uint32_t s_capture_count = 0; static rmt_channel_handle_t s_rx_channel = NULL; static QueueHandle_t s_rx_queue = NULL; +#define RESULT_LOCK_TIMEOUT_MS 20 +static SemaphoreHandle_t s_result_mutex = NULL; +static subghz_rx_result_t s_latest; +static uint32_t s_result_seq = 0; + +static void publish_rx_result(bool decoded, + const subghz_data_t *data, + const subghz_analyzer_result_t *analysis, + const char *save_name) { + if (s_result_mutex == NULL) + return; + if (xSemaphoreTake(s_result_mutex, pdMS_TO_TICKS(RESULT_LOCK_TIMEOUT_MS)) != pdTRUE) + return; + + s_result_seq++; + s_latest.seq = s_result_seq; + s_latest.decoded = decoded; + s_latest.freq = s_rx_freq; + if (save_name != NULL) + strlcpy(s_latest.save_name, save_name, sizeof(s_latest.save_name)); + else + s_latest.save_name[0] = '\0'; + + if (data != NULL) { + s_latest.data = *data; + if (data->protocol_name != NULL) + strlcpy(s_latest.name_buf, data->protocol_name, sizeof(s_latest.name_buf)); + else + s_latest.name_buf[0] = '\0'; + } else { + memset(&s_latest.data, 0, sizeof(s_latest.data)); + s_latest.name_buf[0] = '\0'; + } + s_latest.data.protocol_name = s_latest.name_buf; + + if (analysis != NULL) + s_latest.analysis = *analysis; + else + memset(&s_latest.analysis, 0, sizeof(s_latest.analysis)); + + xSemaphoreGive(s_result_mutex); +} + static void get_dynamic_filename(char *out_name, size_t out_size, const char *prefix) { s_capture_count++; snprintf(out_name, out_size, "%s_%03lu", prefix, (unsigned long)s_capture_count); @@ -121,6 +168,7 @@ static void handle_raw_mode(const int32_t *decode_buffer, size_t decode_idx) { ESP_LOGD(TAG, "RAW: received %d pulses", (int)decode_idx); get_dynamic_filename(filename, sizeof(filename), "RAW"); subghz_storage_save_raw(filename, decode_buffer, decode_idx, s_rx_freq); + publish_rx_result(false, NULL, NULL, filename); } static void log_recovered_bitstream(const subghz_analyzer_result_t *analysis) { @@ -165,6 +213,7 @@ static void handle_scan_mode(const int32_t *decode_buffer, size_t decode_idx) { subghz_analyzer_process(decode_buffer, decode_idx, &analysis); get_dynamic_filename(filename, sizeof(filename), "DEC"); subghz_storage_save_decoded(filename, &decoded, s_rx_freq, analysis.estimated_te); + publish_rx_result(true, &decoded, &analysis, filename); led_signal_info(); // decoded a known protocol return; } @@ -180,6 +229,7 @@ static void handle_scan_mode(const int32_t *decode_buffer, size_t decode_idx) { get_dynamic_filename(filename, sizeof(filename), "UNK"); subghz_storage_save_raw(filename, decode_buffer, decode_idx, s_rx_freq); + publish_rx_result(false, NULL, &analysis, filename); log_recovered_bitstream(&analysis); led_signal_warning(); // captured RF but no known protocol matched } @@ -350,9 +400,21 @@ esp_err_t subghz_receiver_start(subghz_mode_t mode, cc1101_preset_t preset, uint if (s_is_running) { return ESP_ERR_INVALID_STATE; } + + subghz_tx_stop(); + s_rx_mode = mode; s_rx_preset = preset; + if (s_result_mutex == NULL) + s_result_mutex = xSemaphoreCreateMutex(); + if (s_result_mutex != NULL && + xSemaphoreTake(s_result_mutex, pdMS_TO_TICKS(RESULT_LOCK_TIMEOUT_MS)) == pdTRUE) { + s_result_seq = 0; + memset(&s_latest, 0, sizeof(s_latest)); + xSemaphoreGive(s_result_mutex); + } + if (freq == 0) { s_is_hopping_active = true; s_hop_idx = 0; @@ -384,3 +446,18 @@ void subghz_receiver_stop(void) { bool subghz_receiver_is_running(void) { return s_is_running; } + +bool subghz_receiver_get_result(subghz_rx_result_t *out) { + if (out == NULL || s_result_mutex == NULL) + return false; + if (xSemaphoreTake(s_result_mutex, pdMS_TO_TICKS(RESULT_LOCK_TIMEOUT_MS)) != pdTRUE) + return false; + + bool has = (s_latest.seq != 0); + if (has) { + *out = s_latest; + out->data.protocol_name = out->name_buf; + } + xSemaphoreGive(s_result_mutex); + return has; +} From e96118ff122250ec55adba86dd2b2b3b822c43e2 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 21:14:24 -0300 Subject: [PATCH 093/103] feat(subghz): share rx preset and frequency across screens --- .../SubGhz/include/subghz_settings.h | 55 +++++++++++++++++++ .../Applications/SubGhz/subghz_settings.c | 33 +++++++++++ 2 files changed, 88 insertions(+) create mode 100644 firmware_p4/components/Applications/SubGhz/include/subghz_settings.h create mode 100644 firmware_p4/components/Applications/SubGhz/subghz_settings.c diff --git a/firmware_p4/components/Applications/SubGhz/include/subghz_settings.h b/firmware_p4/components/Applications/SubGhz/include/subghz_settings.h new file mode 100644 index 000000000..1e79c5fb6 --- /dev/null +++ b/firmware_p4/components/Applications/SubGhz/include/subghz_settings.h @@ -0,0 +1,55 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#ifndef SUBGHZ_SETTINGS_H +#define SUBGHZ_SETTINGS_H + +#include + +#include "cc1101.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Shared Sub-GHz radio settings chosen in the Radio Config screen and + * consumed by the Read/scan screen. + */ +typedef struct { + cc1101_preset_t preset; /**< @brief CC1101 preset used when starting RX. */ + uint32_t freq; /**< @brief RX frequency in Hz; 0 means frequency hopping. */ +} subghz_settings_t; + +/** + * @brief Get the current shared Sub-GHz settings. + */ +subghz_settings_t subghz_settings_get(void); + +/** + * @brief Set the preset used when starting RX. + */ +void subghz_settings_set_preset(cc1101_preset_t preset); + +/** + * @brief Set the RX frequency in Hz (0 = frequency hopping). + */ +void subghz_settings_set_freq(uint32_t freq); + +#ifdef __cplusplus +} +#endif + +#endif // SUBGHZ_SETTINGS_H diff --git a/firmware_p4/components/Applications/SubGhz/subghz_settings.c b/firmware_p4/components/Applications/SubGhz/subghz_settings.c new file mode 100644 index 000000000..22d3ed905 --- /dev/null +++ b/firmware_p4/components/Applications/SubGhz/subghz_settings.c @@ -0,0 +1,33 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#include "subghz_settings.h" + +static subghz_settings_t s_settings = { + .preset = CC1101_PRESET_OOK_800KHZ, + .freq = 0, +}; + +subghz_settings_t subghz_settings_get(void) { + return s_settings; +} + +void subghz_settings_set_preset(cc1101_preset_t preset) { + s_settings.preset = preset; +} + +void subghz_settings_set_freq(uint32_t freq) { + s_settings.freq = freq; +} From 0073f6a49f94854a343da2c19c25dd933a9cd650 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 21:14:24 -0300 Subject: [PATCH 094/103] feat(subghz): add a came brute force sweep --- .../SubGhz/include/subghz_brute.h | 69 ++++++++ .../Applications/SubGhz/subghz_brute.c | 159 ++++++++++++++++++ 2 files changed, 228 insertions(+) create mode 100644 firmware_p4/components/Applications/SubGhz/include/subghz_brute.h create mode 100644 firmware_p4/components/Applications/SubGhz/subghz_brute.c diff --git a/firmware_p4/components/Applications/SubGhz/include/subghz_brute.h b/firmware_p4/components/Applications/SubGhz/include/subghz_brute.h new file mode 100644 index 000000000..6a0343de0 --- /dev/null +++ b/firmware_p4/components/Applications/SubGhz/include/subghz_brute.h @@ -0,0 +1,69 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#ifndef SUBGHZ_BRUTE_H +#define SUBGHZ_BRUTE_H + +#include +#include + +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Progress of a running brute-force sweep. + */ +typedef struct { + uint32_t sent; /**< @brief Codes transmitted so far. */ + uint32_t total; /**< @brief Total codes in the sweep. */ + bool running; /**< @brief true while the sweep is active. */ + bool done; /**< @brief true once the sweep finished (or was stopped). */ +} subghz_brute_status_t; + +/** + * @brief Start a real brute-force sweep: transmit every code for a protocol. + * + * Stops the receiver, initializes the transmitter, tunes to @p freq, then + * transmits each candidate code. There is no "hit" detection on fixed-code + * remotes — the sweep simply completes. + * + * @param protocol Protocol name (must have an encoder: e.g. "CAME", "RCSwitch"). + * @param bit_count Code width in bits (sweep size is capped internally). + * @param freq Transmit frequency in Hz. + * @return ESP_OK if the sweep started, or an error code on failure. + */ +esp_err_t subghz_brute_start(const char *protocol, uint8_t bit_count, uint32_t freq); + +/** + * @brief Stop a running brute-force sweep. + */ +void subghz_brute_stop(void); + +/** + * @brief Copy the current sweep progress. + * + * @param out Destination. + * @return true if a sweep has been started (out is filled), false otherwise. + */ +bool subghz_brute_get_status(subghz_brute_status_t *out); + +#ifdef __cplusplus +} +#endif + +#endif // SUBGHZ_BRUTE_H diff --git a/firmware_p4/components/Applications/SubGhz/subghz_brute.c b/firmware_p4/components/Applications/SubGhz/subghz_brute.c new file mode 100644 index 000000000..a8e07bb5a --- /dev/null +++ b/firmware_p4/components/Applications/SubGhz/subghz_brute.c @@ -0,0 +1,159 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#include "subghz_brute.h" + +#include +#include + +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/semphr.h" +#include "freertos/task.h" +#include "sys_prio.h" + +#include "cc1101.h" +#include "subghz_protocol_decoder.h" +#include "subghz_protocol_registry.h" +#include "subghz_receiver.h" +#include "subghz_transmitter.h" +#include "subghz_types.h" + +static const char *TAG = "SUBGHZ_BRUTE"; + +#define BRUTE_MAX_CODES 65536 +#define BRUTE_MAX_PULSES 2048 +#define BRUTE_PACING_MS 100 +#define BRUTE_RX_DRAIN_MS 150 +#define BRUTE_TASK_STACK 4096 +#define BRUTE_TASK_PRIORITY SYS_PRIO_SERVICE_HI +#define BRUTE_TASK_CORE SYS_CORE_RADIO +#define BRUTE_LOCK_MS 20 + +static const subghz_protocol_t *s_proto = NULL; +static uint8_t s_bit_count = 0; +static volatile bool s_run = false; +static TaskHandle_t s_task = NULL; +static SemaphoreHandle_t s_mutex = NULL; +static subghz_brute_status_t s_status; + +static void set_status(uint32_t sent, uint32_t total, bool running, bool done) { + if (s_mutex == NULL) + return; + if (xSemaphoreTake(s_mutex, pdMS_TO_TICKS(BRUTE_LOCK_MS)) != pdTRUE) + return; + s_status.sent = sent; + s_status.total = total; + s_status.running = running; + s_status.done = done; + xSemaphoreGive(s_mutex); +} + +static void brute_task(void *arg) { + (void)arg; + uint32_t total = s_status.total; + int32_t *pulses = malloc(BRUTE_MAX_PULSES * sizeof(int32_t)); + + if (pulses == NULL || s_proto == NULL || s_proto->encode == NULL) { + if (pulses != NULL) + free(pulses); + set_status(0, total, false, true); + s_run = false; + s_task = NULL; + vTaskDelete(NULL); + return; + } + + for (uint32_t code = 0; code < total && s_run; code++) { + subghz_data_t data = {0}; + data.protocol_name = s_proto->name; + data.bit_count = s_bit_count; + data.raw_value = code; + data.serial = code; + + size_t n = s_proto->encode(&data, pulses, BRUTE_MAX_PULSES); + if (n > 0) + subghz_tx_send_raw(pulses, n); + + set_status(code + 1, total, true, false); + vTaskDelay(pdMS_TO_TICKS(BRUTE_PACING_MS)); + } + + free(pulses); + ESP_LOGI(TAG, "sweep complete (%lu codes)", (unsigned long)total); + set_status(s_status.sent, total, false, true); + s_run = false; + s_task = NULL; + vTaskDelete(NULL); +} + +esp_err_t subghz_brute_start(const char *protocol, uint8_t bit_count, uint32_t freq) { + if (protocol == NULL || bit_count == 0 || s_run) + return ESP_ERR_INVALID_STATE; + + const subghz_protocol_t *p = subghz_protocol_registry_get_by_name(protocol); + if (p == NULL || p->encode == NULL) { + ESP_LOGW(TAG, "protocol '%s' has no encoder", protocol); + return ESP_ERR_NOT_SUPPORTED; + } + + uint32_t total = (bit_count >= 32) ? 0xFFFFFFFFu : (1u << bit_count); + if (total == 0 || total > BRUTE_MAX_CODES) + total = BRUTE_MAX_CODES; + + if (s_mutex == NULL) + s_mutex = xSemaphoreCreateMutex(); + + s_proto = p; + s_bit_count = bit_count; + set_status(0, total, true, false); + + if (subghz_receiver_is_running()) { + subghz_receiver_stop(); + vTaskDelay(pdMS_TO_TICKS(BRUTE_RX_DRAIN_MS)); + } + + esp_err_t err = subghz_tx_init(); + if (err != ESP_OK) { + set_status(0, total, false, true); + return err; + } + if (freq != 0) + cc1101_set_frequency(freq); + + s_run = true; + BaseType_t ret = xTaskCreatePinnedToCore( + brute_task, "subghz_brute", BRUTE_TASK_STACK, NULL, BRUTE_TASK_PRIORITY, &s_task, BRUTE_TASK_CORE); + if (ret != pdPASS) { + s_run = false; + set_status(0, total, false, true); + return ESP_ERR_NO_MEM; + } + return ESP_OK; +} + +void subghz_brute_stop(void) { + s_run = false; +} + +bool subghz_brute_get_status(subghz_brute_status_t *out) { + if (out == NULL || s_mutex == NULL) + return false; + if (xSemaphoreTake(s_mutex, pdMS_TO_TICKS(BRUTE_LOCK_MS)) != pdTRUE) + return false; + *out = s_status; + xSemaphoreGive(s_mutex); + return true; +} From 0f623fa818be1f32cebacfddd1ae82d697ab05fb Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 21:14:24 -0300 Subject: [PATCH 095/103] feat(subghz): replay saved captures over the air --- .../SubGhz/include/subghz_replay.h | 43 +++++ .../Applications/SubGhz/subghz_replay.c | 177 ++++++++++++++++++ 2 files changed, 220 insertions(+) create mode 100644 firmware_p4/components/Applications/SubGhz/include/subghz_replay.h create mode 100644 firmware_p4/components/Applications/SubGhz/subghz_replay.c diff --git a/firmware_p4/components/Applications/SubGhz/include/subghz_replay.h b/firmware_p4/components/Applications/SubGhz/include/subghz_replay.h new file mode 100644 index 000000000..4b0a8da46 --- /dev/null +++ b/firmware_p4/components/Applications/SubGhz/include/subghz_replay.h @@ -0,0 +1,43 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#ifndef SUBGHZ_REPLAY_H +#define SUBGHZ_REPLAY_H + +#include "esp_err.h" + +#ifdef __cplusplus +extern "C" { +#endif + +/** + * @brief Load a saved capture and transmit it over the CC1101. + * + * Stops the receiver if running, initializes the transmitter, tunes to the + * saved frequency, and replays the signal: RAW captures are sent pulse-for-pulse; + * decoded captures are re-encoded via the protocol registry (only protocols with + * an encoder are supported). + * + * @param name Saved capture name (without .sub). + * @return ESP_OK if the transmit was queued, ESP_ERR_NOT_SUPPORTED if the + * protocol cannot be re-encoded, or another error code on failure. + */ +esp_err_t subghz_replay_file(const char *name); + +#ifdef __cplusplus +} +#endif + +#endif // SUBGHZ_REPLAY_H diff --git a/firmware_p4/components/Applications/SubGhz/subghz_replay.c b/firmware_p4/components/Applications/SubGhz/subghz_replay.c new file mode 100644 index 000000000..d663cd1cd --- /dev/null +++ b/firmware_p4/components/Applications/SubGhz/subghz_replay.c @@ -0,0 +1,177 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#include "subghz_replay.h" + +#include +#include +#include + +#include "esp_log.h" +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" + +#include "cc1101.h" +#include "subghz_protocol_decoder.h" +#include "subghz_protocol_registry.h" +#include "subghz_protocol_serializer.h" +#include "subghz_receiver.h" +#include "subghz_storage.h" +#include "subghz_transmitter.h" +#include "subghz_types.h" + +static const char *TAG = "SUBGHZ_REPLAY"; + +#define REPLAY_FILE_BUF 8192 +#define REPLAY_MAX_PULSES 2048 +#define REPLAY_RX_DRAIN_MS 150 +#define REPLAY_PROTO_MAX 24 + +static uint32_t parse_u32_after(const char *content, const char *key) { + const char *p = strstr(content, key); + if (p == NULL) + return 0; + return (uint32_t)strtoul(p + strlen(key), NULL, 10); +} + +static void parse_protocol(const char *content, char *out, size_t out_size) { + out[0] = '\0'; + const char *p = strstr(content, "Protocol: "); + if (p == NULL) + return; + p += strlen("Protocol: "); + size_t i = 0; + while (p[i] != '\0' && p[i] != '\n' && p[i] != '\r' && i < out_size - 1) { + out[i] = p[i]; + i++; + } + out[i] = '\0'; +} + +static uint32_t parse_key_value(const char *content) { + const char *p = strstr(content, "Key: "); + if (p == NULL) + return 0; + unsigned b[8] = {0}; + int n = sscanf(p + strlen("Key: "), + "%x %x %x %x %x %x %x %x", + &b[0], &b[1], &b[2], &b[3], &b[4], &b[5], &b[6], &b[7]); + if (n < 8) + return 0; + return ((uint32_t)b[4] << 24) | ((uint32_t)b[5] << 16) | ((uint32_t)b[6] << 8) | (uint32_t)b[7]; +} + +static const subghz_protocol_t *lookup_protocol(const char *proto) { + const subghz_protocol_t *p = subghz_protocol_registry_get_by_name(proto); + if (p != NULL) + return p; + + char first[REPLAY_PROTO_MAX]; + size_t i = 0; + while (proto[i] != '\0' && proto[i] != ' ' && i < sizeof(first) - 1) { + first[i] = proto[i]; + i++; + } + first[i] = '\0'; + if (i == 0) + return NULL; + return subghz_protocol_registry_get_by_name(first); +} + +static esp_err_t replay_raw(const char *content) { + int32_t *pulses = malloc(REPLAY_MAX_PULSES * sizeof(int32_t)); + if (pulses == NULL) + return ESP_ERR_NO_MEM; + + uint32_t freq = 0; + uint8_t preset = 0; + size_t n = subghz_protocol_parse_raw(content, pulses, REPLAY_MAX_PULSES, &freq, &preset); + if (n == 0) { + free(pulses); + return ESP_FAIL; + } + + if (freq != 0) + cc1101_set_frequency(freq); + esp_err_t err = subghz_tx_send_raw(pulses, n); + free(pulses); + return err; +} + +static esp_err_t replay_decoded(const char *content) { + uint32_t freq = parse_u32_after(content, "Frequency: "); + char proto[REPLAY_PROTO_MAX]; + parse_protocol(content, proto, sizeof(proto)); + + const subghz_protocol_t *p = lookup_protocol(proto); + if (p == NULL || p->encode == NULL) { + ESP_LOGW(TAG, "replay unsupported for protocol '%s'", proto); + return ESP_ERR_NOT_SUPPORTED; + } + + subghz_data_t data = {0}; + data.protocol_name = proto; + data.bit_count = (uint8_t)parse_u32_after(content, "Bit: "); + data.raw_value = parse_key_value(content); + data.serial = data.raw_value; + + int32_t *pulses = malloc(REPLAY_MAX_PULSES * sizeof(int32_t)); + if (pulses == NULL) + return ESP_ERR_NO_MEM; + + size_t n = p->encode(&data, pulses, REPLAY_MAX_PULSES); + if (n == 0) { + free(pulses); + return ESP_FAIL; + } + + if (freq != 0) + cc1101_set_frequency(freq); + esp_err_t err = subghz_tx_send_raw(pulses, n); + free(pulses); + return err; +} + +esp_err_t subghz_replay_file(const char *name) { + if (name == NULL) + return ESP_ERR_INVALID_ARG; + + char *content = malloc(REPLAY_FILE_BUF); + if (content == NULL) + return ESP_ERR_NO_MEM; + + int rd = subghz_storage_read(name, content, REPLAY_FILE_BUF); + if (rd <= 0) { + free(content); + return ESP_ERR_NOT_FOUND; + } + + if (subghz_receiver_is_running()) { + subghz_receiver_stop(); + vTaskDelay(pdMS_TO_TICKS(REPLAY_RX_DRAIN_MS)); + } + + esp_err_t err = subghz_tx_init(); + if (err != ESP_OK) { + free(content); + return err; + } + + bool is_raw = (strstr(content, "RAW_Data:") != NULL); + err = is_raw ? replay_raw(content) : replay_decoded(content); + + free(content); + return err; +} From 2ae98d0382fefbe82a15e4908c76520d6428fc56 Mon Sep 17 00:00:00 2001 From: luis_thiago <95657866+lthiagovs@users.noreply.github.com> Date: Wed, 19 Aug 2026 21:14:24 -0300 Subject: [PATCH 096/103] feat(ui): drive the subghz screens from the real radio --- .../screens/subghz/include/subghz_config_ui.h | 2 +- .../screens/subghz/include/subghz_menu_ui.h | 7 +- .../screens/subghz/include/subghz_send_ui.h | 5 +- .../ui/screens/subghz/subghz_brute_ui.c | 223 +++++----------- .../ui/screens/subghz/subghz_config_ui.c | 27 ++ .../ui/screens/subghz/subghz_menu_ui.c | 242 +++++++++++------- .../ui/screens/subghz/subghz_read_ui.c | 228 +++++++++-------- .../ui/screens/subghz/subghz_send_ui.c | 97 ++++--- 8 files changed, 431 insertions(+), 400 deletions(-) diff --git a/firmware_p4/components/Applications/ui/screens/subghz/include/subghz_config_ui.h b/firmware_p4/components/Applications/ui/screens/subghz/include/subghz_config_ui.h index d96324d90..2c723b78c 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/include/subghz_config_ui.h +++ b/firmware_p4/components/Applications/ui/screens/subghz/include/subghz_config_ui.h @@ -20,7 +20,7 @@ extern "C" { #endif -/** @brief Open the Sub-GHz radio configuration screen (tuner dashboard mock). */ +/** @brief Open the Sub-GHz radio configuration screen; applies preset/modulation to the CC1101. */ void ui_subghz_config_open(void); #ifdef __cplusplus diff --git a/firmware_p4/components/Applications/ui/screens/subghz/include/subghz_menu_ui.h b/firmware_p4/components/Applications/ui/screens/subghz/include/subghz_menu_ui.h index 4405ffabb..668618f75 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/include/subghz_menu_ui.h +++ b/firmware_p4/components/Applications/ui/screens/subghz/include/subghz_menu_ui.h @@ -20,13 +20,12 @@ extern "C" { #endif -/** @brief Open the Sub-GHz menu screen (MOCK): Read / Read RAW / Analyzer / Brute / Saved. No - * radio. */ +/** @brief Open the Sub-GHz menu screen: Read / Read RAW / Analyzer / Brute / Saved / Send. */ void ui_subghz_menu_open(void); /** - * @brief Open the Sub-GHz "Read" capture screen (MOCK): scanning waves -> canned - * captured signal -> save prompt. No radio. + * @brief Open the Sub-GHz "Read" capture screen: runs the CC1101 receiver, shows the + * decoded protocol/frequency/key, and can replay or persist the capture. */ void ui_subghz_read_open(void); diff --git a/firmware_p4/components/Applications/ui/screens/subghz/include/subghz_send_ui.h b/firmware_p4/components/Applications/ui/screens/subghz/include/subghz_send_ui.h index 6c42ca243..3f5adeb74 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/include/subghz_send_ui.h +++ b/firmware_p4/components/Applications/ui/screens/subghz/include/subghz_send_ui.h @@ -21,9 +21,8 @@ extern "C" { #endif /** - * @brief Open the Sub-GHz "Send" screen (MOCK): pick a saved signal from a list, - * then a pulse-train transmit animation that auto-confirms "Sent!". No - * radio. + * @brief Open the Sub-GHz "Send" screen: pick a saved capture from the SD library + * and replay it over the CC1101 transmitter. */ void ui_subghz_send_open(void); diff --git a/firmware_p4/components/Applications/ui/screens/subghz/subghz_brute_ui.c b/firmware_p4/components/Applications/ui/screens/subghz/subghz_brute_ui.c index 95ac327c3..1b1612f5b 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/subghz_brute_ui.c +++ b/firmware_p4/components/Applications/ui/screens/subghz/subghz_brute_ui.c @@ -20,9 +20,8 @@ #include "esp_log.h" #include "lvgl.h" -#include "capture_result_ui.h" -#include "msgbox_ui.h" #include "notify_ui.h" +#include "subghz_brute.h" #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" @@ -32,9 +31,7 @@ static const char *TAG = "SUBGHZ_BF"; -#define TICK_MS 33 -#define REVEAL_MS 3000 -#define BRUTE_MS 4200 +#define TICK_MS 120 #define SCOPE_TICK_MS 38 #define DOT_CYCLE_MS 350 @@ -75,8 +72,7 @@ static const char *TAG = "SUBGHZ_BF"; #define BAR_W 192 #define BAR_H 8 #define BAR_Y (CARD_Y + 20) -#define CODES_Y (CARD_Y + 44) -#define HIT_Y (CARD_Y + 68) +#define CODES_Y (CARD_Y + 46) #define TRACK_COL 0x202028 #define CARD_W 210 @@ -89,13 +85,12 @@ static const char *TAG = "SUBGHZ_BF"; #define STATUS_RUN "Transmitting" #define HINT_RUN "BACK to stop" #define HINT_SHOW "BACK = Exit" -#define HINT_MENU "UP/DOWN choose OK do BACK exit" -#define BRUTE_PROTO "Princeton" -#define BRUTE_FREQ "433.92 MHz" -#define BRUTE_HIT "0x1A2B3C" -#define BRUTE_TOTAL 4096 -#define BRUTE_HIT_N (BRUTE_TOTAL / 3) +#define BRUTE_PROTO_NAME "CAME" +#define BRUTE_BITS 12 +#define BRUTE_FREQ_HZ 433920000 +#define BRUTE_TOTAL (1 << BRUTE_BITS) +#define BRUTE_FREQ_STR "433.92 MHz" static const uint8_t OOK_BITS[] = {0, 0, 0, 1, 1, 0}; #define OOK_BIT_COUNT ((int)(sizeof(OOK_BITS) / sizeof(OOK_BITS[0]))) @@ -111,20 +106,14 @@ static lv_obj_t *s_wave = NULL; static lv_obj_t *s_card = NULL; static lv_obj_t *s_bar = NULL; static lv_obj_t *s_codes = NULL; -static lv_obj_t *s_hit = NULL; static lv_obj_t *s_hint = NULL; -static capture_result_t s_cr = {0}; static lv_point_precise_t s_wave_pts[WAVE_POINTS]; static lv_point_precise_t s_ook_pts[OOK_MAX_PTS]; static int s_phase = 0; static int s_mod = 0; -static int s_code_count = 0; static uint32_t s_run_start = 0; -static uint32_t s_locked_at = 0; static bool s_locked = false; -static bool s_options = false; -static bool s_saved = false; static void brute_tick_cb(lv_timer_t *t); static void scope_tick_cb(lv_timer_t *t); @@ -270,88 +259,36 @@ static void build_readout(void) { lv_bar_set_value(s_bar, 0, LV_ANIM_OFF); s_codes = lv_label_create(s_screen); - lv_label_set_text_fmt(s_codes, "Codes 0 / %d", BRUTE_TOTAL); + lv_label_set_text_fmt(s_codes, "Sent 0 / %d", BRUTE_TOTAL); lv_obj_set_style_text_color(s_codes, current_theme.border_accent, 0); lv_obj_set_style_text_font(s_codes, &lv_font_montserrat_12, 0); lv_obj_align(s_codes, LV_ALIGN_TOP_MID, 0, CODES_Y); - - s_hit = lv_label_create(s_screen); - lv_label_set_text(s_hit, BRUTE_PROTO " " BRUTE_HIT); - lv_obj_set_style_text_color(s_hit, current_theme.text_main, 0); - lv_obj_set_style_text_font(s_hit, &lv_font_montserrat_12, 0); - lv_obj_align(s_hit, LV_ALIGN_TOP_MID, 0, HIT_Y); - lv_obj_add_flag(s_hit, LV_OBJ_FLAG_HIDDEN); } -static void resolve(void) { +static void finish_sweep(void) { s_locked = true; stop_timer(&s_scope_timer); if (s_wave != NULL) lv_obj_set_style_line_rounded(s_wave, false, 0); fill_ook(); - s_code_count = BRUTE_HIT_N; if (s_bar != NULL) - lv_bar_set_value(s_bar, s_code_count, LV_ANIM_OFF); + lv_bar_set_value(s_bar, BRUTE_TOTAL, LV_ANIM_OFF); if (s_codes != NULL) - lv_label_set_text_fmt(s_codes, "Hit at code %d", s_code_count); - if (s_hit != NULL) - lv_obj_remove_flag(s_hit, LV_OBJ_FLAG_HIDDEN); + lv_label_set_text_fmt(s_codes, "Sent %d / %d", BRUTE_TOTAL, BRUTE_TOTAL); if (s_status != NULL) { - lv_label_set_text(s_status, "Code found!"); + lv_label_set_text(s_status, "Sweep complete"); lv_obj_set_style_text_color(s_status, lv_color_hex(UI_COL_SUCCESS), 0); } if (s_hint != NULL) ui_chrome_footer_set_text(s_hint, HINT_SHOW); - s_locked_at = lv_tick_get(); - ESP_LOGI(TAG, "mock subghz brute hit: %s %s", BRUTE_PROTO, BRUTE_HIT); + ESP_LOGI(TAG, "brute sweep complete (%d codes)", BRUTE_TOTAL); ui_feedback(UI_FB_WRITE); } -static void show_options(void) { - if (s_scope != NULL) { - lv_obj_del(s_scope); - s_scope = NULL; - s_wave = NULL; - } - if (s_bar != NULL) { - lv_obj_del(s_bar); - s_bar = NULL; - } - if (s_codes != NULL) { - lv_obj_del(s_codes); - s_codes = NULL; - } - if (s_hit != NULL) { - lv_obj_del(s_hit); - s_hit = NULL; - } - if (s_card != NULL) { - lv_obj_del(s_card); - s_card = NULL; - } - if (s_status != NULL) - lv_obj_add_flag(s_status, LV_OBJ_FLAG_HIDDEN); - if (s_freq != NULL) - lv_obj_add_flag(s_freq, LV_OBJ_FLAG_HIDDEN); - - capture_result_cfg_t cfg = { - .accent = current_theme.border_accent, - .card_icon = "/assets/icons/bolt.bin", - .card_title = "Code found", - .card_sub = BRUTE_PROTO " (OOK)", - .card_value = BRUTE_HIT, - .primary_label = "Send", - .again_label = "Run again", - }; - s_cr = capture_result_create(s_screen, &cfg); - s_options = true; - if (s_hint != NULL) - ui_chrome_footer_set_text(s_hint, HINT_MENU); -} - void ui_subghz_brute_open(void) { + subghz_brute_stop(); stop_timer(&s_scope_timer); stop_timer(&s_tick_timer); if (s_screen != NULL) { @@ -365,16 +302,10 @@ void ui_subghz_brute_open(void) { s_card = NULL; s_bar = NULL; s_codes = NULL; - s_hit = NULL; s_hint = NULL; - s_cr = (capture_result_t){0}; s_phase = 0; s_mod = 0; - s_code_count = 0; s_locked = false; - s_options = false; - s_saved = false; - s_locked_at = 0; s_screen = lv_obj_create(NULL); lv_obj_set_style_bg_color(s_screen, current_theme.screen_base, 0); @@ -392,7 +323,7 @@ void ui_subghz_brute_open(void) { lv_obj_align(s_status, LV_ALIGN_TOP_MID, 0, STATUS_Y); s_freq = lv_label_create(s_screen); - lv_label_set_text(s_freq, BRUTE_FREQ); + lv_label_set_text(s_freq, BRUTE_PROTO_NAME " " BRUTE_FREQ_STR); lv_obj_set_style_text_color(s_freq, current_theme.border_accent, 0); lv_obj_set_style_text_font(s_freq, &lv_font_montserrat_12, 0); lv_obj_align(s_freq, LV_ALIGN_TOP_MID, 0, FREQ_Y); @@ -408,6 +339,19 @@ void ui_subghz_brute_open(void) { ui_input_set_screen_handler(subghz_brute_input, NULL); + esp_err_t berr = subghz_brute_start(BRUTE_PROTO_NAME, BRUTE_BITS, BRUTE_FREQ_HZ); + if (berr != ESP_OK) { + s_locked = true; + stop_timer(&s_scope_timer); + if (s_status != NULL) { + lv_label_set_text(s_status, "Unavailable"); + lv_obj_set_style_text_color(s_status, current_theme.text_secondary, 0); + } + if (s_hint != NULL) + ui_chrome_footer_set_text(s_hint, HINT_SHOW); + notify(NOTIFY_WARNING, "Brute unavailable"); + } + ui_screen_load_owned(&s_screen, s_screen); } @@ -428,96 +372,49 @@ static void brute_tick_cb(lv_timer_t *t) { s_tick_timer = NULL; return; } + if (s_locked) + return; - if (!s_locked) { - uint32_t el = lv_tick_get() - s_run_start; - if (s_status != NULL) { - int dots = (el / DOT_CYCLE_MS) % 4; - char buf[24]; - snprintf(buf, - sizeof(buf), - "%s%s", - STATUS_RUN, - dots == 1 ? "." - : dots == 2 ? ".." - : dots == 3 ? "..." - : ""); - lv_label_set_text(s_status, buf); - } - int count = (int)((uint64_t)el * BRUTE_TOTAL / BRUTE_MS); - if (count > BRUTE_TOTAL) - count = BRUTE_TOTAL; - s_code_count = count; - if (s_bar != NULL) - lv_bar_set_value(s_bar, count, LV_ANIM_OFF); - if (s_codes != NULL) - lv_label_set_text_fmt(s_codes, "Codes %d / %d", count, BRUTE_TOTAL); + if (s_status != NULL) { + int dots = ((lv_tick_get() - s_run_start) / DOT_CYCLE_MS) % 4; + char buf[24]; + snprintf(buf, + sizeof(buf), + "%s%s", + STATUS_RUN, + dots == 1 ? "." + : dots == 2 ? ".." + : dots == 3 ? "..." + : ""); + lv_label_set_text(s_status, buf); } - if (!s_locked) { - if (lv_tick_get() - s_run_start >= BRUTE_MS) - resolve(); - } else if (!s_options) { - if (lv_tick_get() - s_locked_at >= REVEAL_MS) - show_options(); + subghz_brute_status_t st; + if (!subghz_brute_get_status(&st)) + return; + + int total = st.total ? (int)st.total : BRUTE_TOTAL; + int sent = (int)st.sent; + if (s_bar != NULL) { + lv_bar_set_range(s_bar, 0, total); + lv_bar_set_value(s_bar, sent, LV_ANIM_OFF); } + if (s_codes != NULL) + lv_label_set_text_fmt(s_codes, "Sent %d / %d", sent, total); + + if (st.done) + finish_sweep(); } static void subghz_brute_input(const input_event_t *ev, void *ctx) { (void)ctx; const bool press = (ev->action == INPUT_ACTION_PRESS); - const bool nav = press || (ev->action == INPUT_ACTION_REPEAT); if (ev->button == INPUT_BTN_BACK) { - if (press) + if (press) { + subghz_brute_stop(); ui_switch_screen(SCREEN_SUBGHZ_MENU); + } return; } - - if (!s_options) - return; - - switch (ev->button) { - case INPUT_BTN_DOWN: - if (nav) { - capture_result_next(&s_cr); - ui_feedback(UI_FB_NAV); - } - break; - case INPUT_BTN_UP: - if (nav) { - capture_result_prev(&s_cr); - ui_feedback(UI_FB_NAV); - } - break; - case INPUT_BTN_OK: - if (press) { - switch (capture_result_selected(&s_cr)) { - case CAP_ACT_PRIMARY: - ui_feedback(UI_FB_EMULATE); - notify(NOTIFY_INFO, BRUTE_FREQ " sent"); - break; - case CAP_ACT_SAVE: - if (!s_saved) { - s_saved = true; - capture_result_mark_saved(&s_cr); - ESP_LOGI(TAG, "mock subghz brute saved: %s", BRUTE_HIT); - ui_feedback(UI_FB_WRITE); - notify(NOTIFY_SAVED, "Sub-GHz code saved"); - } - break; - case CAP_ACT_AGAIN: - ui_subghz_brute_open(); - return; - case CAP_ACT_DISCARD: - ui_switch_screen(SCREEN_SUBGHZ_MENU); - return; - default: - break; - } - } - break; - default: - break; - } } diff --git a/firmware_p4/components/Applications/ui/screens/subghz/subghz_config_ui.c b/firmware_p4/components/Applications/ui/screens/subghz/subghz_config_ui.c index 9f87a7b21..8c1daf280 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/subghz_config_ui.c +++ b/firmware_p4/components/Applications/ui/screens/subghz/subghz_config_ui.c @@ -15,10 +15,14 @@ #include "subghz_config_ui.h" +#include + #include "lvgl.h" #include "st7789.h" +#include "cc1101.h" #include "notify_ui.h" +#include "subghz_settings.h" #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" @@ -253,6 +257,28 @@ static void adjust_value(int dir) { lv_label_set_text(s_tile_num[s_sel], FIELDS[s_sel].values[s_val_idx[s_sel]]); } +#define CONFIG_FREQ_HZ 433920000 + +static const uint8_t MOD_MAP[4] = {0, 2, 1, 3}; +static const cc1101_preset_t PRESET_MAP[4] = { + CC1101_PRESET_2FSK_47KHZ, + CC1101_PRESET_2FSK_95KHZ, + CC1101_PRESET_OOK_270KHZ, + CC1101_PRESET_OOK_650KHZ, +}; + +static void apply_config(void) { + cc1101_preset_t preset = PRESET_MAP[s_val_idx[3]]; + cc1101_set_preset(preset, CONFIG_FREQ_HZ); + cc1101_set_modulation(MOD_MAP[s_val_idx[0]]); + cc1101_set_rx_bandwidth((float)atof(FIELDS[1].values[s_val_idx[1]])); + cc1101_set_data_rate((float)atof(FIELDS[2].values[s_val_idx[2]]) * 1000.0f); + cc1101_set_frequency(CONFIG_FREQ_HZ); + + subghz_settings_set_preset(preset); + subghz_settings_set_freq(CONFIG_FREQ_HZ); +} + static void subghz_config_input(const input_event_t *ev, void *ctx) { (void)ctx; const bool press = (ev->action == INPUT_ACTION_PRESS); @@ -291,6 +317,7 @@ static void subghz_config_input(const input_event_t *ev, void *ctx) { break; case INPUT_BTN_OK: if (press) { + apply_config(); notify(NOTIFY_SAVED, "Radio config applied"); ui_feedback(UI_FB_SELECT); } diff --git a/firmware_p4/components/Applications/ui/screens/subghz/subghz_menu_ui.c b/firmware_p4/components/Applications/ui/screens/subghz/subghz_menu_ui.c index d8429a395..10dd47c5d 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/subghz_menu_ui.c +++ b/firmware_p4/components/Applications/ui/screens/subghz/subghz_menu_ui.c @@ -16,6 +16,7 @@ #include "subghz_menu_ui.h" #include +#include #include "esp_log.h" #include "lvgl.h" @@ -27,15 +28,17 @@ #include "notify_ui.h" #include "octobit_ui.h" #include "sigwave_ui.h" +#include "subghz_receiver.h" +#include "subghz_replay.h" #include "subghz_scope_ui.h" +#include "subghz_spectrum.h" +#include "subghz_storage.h" #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" #include "ui_metrics.h" #include "ui_theme.h" -static const char *TAG = "SUBGHZ_UI"; - #define FADE_MS 200 #define OUTER_BORDER 4 @@ -119,33 +122,26 @@ static const struct { #define IDX_SEND 5 #define IDX_CONFIG 6 -static const struct { - const char *name; - const char *freq; - const char *proto; -} SAVED_SIGS[] = { - {"Gate_433", "433.92 MHz", "Princeton"}, - {"Doorbell", "433.92 MHz", "CAME"}, - {"TPMS_FL", "315.00 MHz", "FSK TPMS"}, - {"Garage", "868.30 MHz", "Nice FLO"}, - {"Car_Fob", "433.92 MHz", "KeeLoq"}, - {"Barrier", "868.30 MHz", "BFT Mitto"}, - {"Weather", "433.92 MHz", "Oregon v3"}, - {"Remote_2", "315.00 MHz", "Holtek"}, - {"Sensor_A", "433.92 MHz", "Princeton"}, - {"Gate_868", "868.30 MHz", "Nice FLO"}, -}; -#define SAVED_COUNT ((int)(sizeof(SAVED_SIGS) / sizeof(SAVED_SIGS[0]))) +#define SAVED_MAX 64 +static subghz_storage_entry_t s_saved[SAVED_MAX]; +static int s_saved_count = 0; -static const struct { - const char *label; - const char *value; -} DETAIL_ROWS[] = { - {"Protocol", "Princeton"}, - {"Key", "0x1A2B3C"}, - {"Frequency", "433.92 MHz"}, -}; -#define DETAIL_ROW_COUNT ((int)(sizeof(DETAIL_ROWS) / sizeof(DETAIL_ROWS[0]))) +static void fmt_mhz(uint32_t hz, char *out, size_t n) { + if (hz == 0) { + snprintf(out, n, "-- MHz"); + return; + } + snprintf(out, + n, + "%lu.%02lu MHz", + (unsigned long)(hz / 1000000UL), + (unsigned long)((hz % 1000000UL) / 10000UL)); +} + +static void load_saved(void) { + int n = subghz_storage_list(s_saved, SAVED_MAX); + s_saved_count = (n < 0) ? 0 : n; +} static const struct { const char *icon; @@ -156,8 +152,11 @@ static const struct { }; #define INFO_ACTION_COUNT ((int)(sizeof(INFO_ACTIONS) / sizeof(INFO_ACTIONS[0]))) -static const char *ANALYZER_FREQS[] = {"433.92 MHz", "868.30 MHz", "315.00 MHz"}; -#define ANALYZER_FREQ_COUNT ((int)(sizeof(ANALYZER_FREQS) / sizeof(ANALYZER_FREQS[0]))) +#define ANALYZER_CENTER_HZ 433920000 +#define ANALYZER_SPAN_HZ 2000000 +#define ANALYZER_POLL_MS 140 +#define ANALYZER_DBM_FLOOR -110 +#define ANALYZER_DBM_CEIL -20 typedef enum { VIEW_LIST = 0, @@ -173,7 +172,6 @@ static view_t s_view = VIEW_LIST; static int s_saved_sel = 0; static lv_obj_t *s_freq_lbl = NULL; -static int s_freq_idx = 0; static lv_obj_t *s_info_rows[INFO_ACTION_COUNT]; static lv_obj_t *s_info_icons[INFO_ACTION_COUNT]; @@ -181,10 +179,11 @@ static lv_obj_t *s_info_labels[INFO_ACTION_COUNT]; static int s_info_sel = 0; static lv_obj_t *s_sig_cont = NULL; -static lv_obj_t *s_sig_row[SAVED_COUNT]; -static lv_obj_t *s_sig_name[SAVED_COUNT]; -static lv_obj_t *s_sig_val[SAVED_COUNT]; +static lv_obj_t *s_sig_row[SAVED_MAX]; +static lv_obj_t *s_sig_name[SAVED_MAX]; +static lv_obj_t *s_sig_val[SAVED_MAX]; static lv_obj_t *s_sig_thumb = NULL; +static lv_obj_t *s_spec_bars[BAR_COUNT]; static lv_obj_t *s_send_overlay = NULL; static lv_obj_t *s_send_status = NULL; @@ -222,31 +221,66 @@ static void fade_in(lv_obj_t *obj, uint32_t duration_ms) { lv_anim_start(&a); } -static void bar_height_cb(void *var, int32_t v) { - lv_obj_t *bar = (lv_obj_t *)var; - lv_obj_set_height(bar, v); - lv_obj_set_y(bar, BAR_BASELINE_Y - v); -} +#define SIGNAL_STRONG_COLOR 0x00E676 -static void freq_cycle_cb(lv_timer_t *t) { +static void spectrum_poll_cb(lv_timer_t *t) { if (lv_screen_active() != s_screen || s_view != VIEW_ANALYZER) { lv_timer_delete(t); s_freq_timer = NULL; return; } - s_freq_idx = (s_freq_idx + 1) % ANALYZER_FREQ_COUNT; - if (s_freq_lbl) - lv_label_set_text(s_freq_lbl, ANALYZER_FREQS[s_freq_idx]); -} -#define SIGNAL_STRONG_COLOR 0x00E676 + subghz_spectrum_line_t line; + if (!subghz_spectrum_get_line(&line)) + return; + + int per = SPECTRUM_SAMPLES / BAR_COUNT; + if (per < 1) + per = 1; + + for (int i = 0; i < BAR_COUNT; i++) { + float sum = 0.0f; + int cnt = 0; + for (int k = 0; k < per; k++) { + int idx = i * per + k; + if (idx < SPECTRUM_SAMPLES) { + sum += line.dbm_values[idx]; + cnt++; + } + } + float dbm = cnt ? (sum / (float)cnt) : (float)ANALYZER_DBM_FLOOR; + + int h = (int)(((dbm - ANALYZER_DBM_FLOOR) * (BAR_MAX_H - BAR_MIN_H)) / + (ANALYZER_DBM_CEIL - ANALYZER_DBM_FLOOR)) + + BAR_MIN_H; + if (h < BAR_MIN_H) + h = BAR_MIN_H; + if (h > BAR_MAX_H) + h = BAR_MAX_H; + + if (s_spec_bars[i] == NULL) + continue; + lv_obj_set_height(s_spec_bars[i], h); + lv_obj_set_y(s_spec_bars[i], BAR_BASELINE_Y - h); + + lv_color_t c; + if (dbm >= -45.0f) + c = lv_color_hex(SIGNAL_STRONG_COLOR); + else if (dbm >= -75.0f) + c = current_theme.border_accent; + else + c = current_theme.border_inactive; + lv_obj_set_style_bg_color(s_spec_bars[i], c, 0); + } +} static void build_analyzer(void) { ui_chrome_header(s_screen, "ANALYZER", "/assets/icons/graphic_eq.bin"); - s_freq_idx = 0; + char freq_str[16]; + fmt_mhz(ANALYZER_CENTER_HZ, freq_str, sizeof(freq_str)); s_freq_lbl = lv_label_create(s_screen); - lv_label_set_text(s_freq_lbl, ANALYZER_FREQS[0]); + lv_label_set_text(s_freq_lbl, freq_str); lv_obj_set_style_text_color(s_freq_lbl, current_theme.border_accent, 0); lv_obj_set_style_text_font(s_freq_lbl, &lv_font_montserrat_14, 0); lv_obj_align(s_freq_lbl, LV_ALIGN_TOP_MID, 0, UI_CHROME_HEADER_H + 14); @@ -269,43 +303,25 @@ static void build_analyzer(void) { lv_obj_set_style_line_dash_gap(baseline, 4, 0); for (int i = 0; i < BAR_COUNT; i++) { - int peak = BAR_MAX_H - (i % 5) * 12; - lv_obj_t *bar = lv_obj_create(s_screen); + s_spec_bars[i] = bar; lv_obj_remove_flag(bar, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_size(bar, BAR_W, BAR_MIN_H); lv_obj_set_style_radius(bar, 2, 0); lv_obj_set_style_bg_opa(bar, LV_OPA_COVER, 0); - - lv_color_t bar_color; - if (peak >= (BAR_MAX_H - 12)) - bar_color = lv_color_hex(SIGNAL_STRONG_COLOR); - else if (peak >= (BAR_MAX_H - 36)) - bar_color = current_theme.border_accent; - else - bar_color = current_theme.border_inactive; - lv_obj_set_style_bg_color(bar, bar_color, 0); + lv_obj_set_style_bg_color(bar, current_theme.border_inactive, 0); lv_obj_set_style_bg_grad_color(bar, current_theme.bg_secondary, 0); lv_obj_set_style_bg_grad_dir(bar, LV_GRAD_DIR_VER, 0); lv_obj_set_style_border_width(bar, 0, 0); - lv_obj_set_pos(bar, x0 + i * (BAR_W + BAR_GAP), BAR_BASELINE_Y - BAR_MIN_H); - - lv_anim_t a; - lv_anim_init(&a); - lv_anim_set_var(&a, bar); - lv_anim_set_exec_cb(&a, bar_height_cb); - lv_anim_set_values(&a, BAR_MIN_H, peak); - lv_anim_set_duration(&a, 420 + (i % 4) * 90); - lv_anim_set_playback_duration(&a, 420 + (i % 3) * 80); - lv_anim_set_delay(&a, i * 55); - lv_anim_set_repeat_count(&a, LV_ANIM_REPEAT_INFINITE); - lv_anim_set_path_cb(&a, lv_anim_path_ease_in_out); - lv_anim_start(&a); } fade_in(s_freq_lbl, FADE_MS); - s_freq_timer = lv_timer_create(freq_cycle_cb, FREQ_CYCLE_MS, NULL); + + if (subghz_receiver_is_running()) + subghz_receiver_stop(); + subghz_spectrum_start(ANALYZER_CENTER_HZ, ANALYZER_SPAN_HZ); + s_freq_timer = lv_timer_create(spectrum_poll_cb, ANALYZER_POLL_MS, NULL); ui_chrome_footer(s_screen, HINT_ANALYZER); } @@ -317,7 +333,7 @@ static void build_saved_empty(void) { } static void move_sig_thumb(void) { - if (s_sig_thumb == NULL || SAVED_COUNT <= 1) + if (s_sig_thumb == NULL || s_saved_count <= 1) return; int thumb_h = lv_obj_get_height(s_sig_thumb); if (thumb_h <= 0) @@ -325,7 +341,7 @@ static void move_sig_thumb(void) { int travel = SGC_TRACK_LEN - thumb_h; if (travel < 0) travel = 0; - int pos = SGC_TRACK_Y + (s_saved_sel * travel) / (SAVED_COUNT - 1); + int pos = SGC_TRACK_Y + (s_saved_sel * travel) / (s_saved_count - 1); lv_obj_set_y(s_sig_thumb, pos); } @@ -349,7 +365,7 @@ static void style_sig_row(int i, bool sel) { } static void update_sig_selection(void) { - for (int i = 0; i < SAVED_COUNT; i++) + for (int i = 0; i < s_saved_count; i++) style_sig_row(i, i == s_saved_sel); if (s_sig_cont != NULL && s_sig_row[s_saved_sel] != NULL) { lv_obj_update_layout(s_sig_cont); @@ -359,7 +375,8 @@ static void update_sig_selection(void) { } static void build_saved_list(void) { - if (SAVED_COUNT == 0) { + load_saved(); + if (s_saved_count == 0) { build_saved_empty(); return; } @@ -367,8 +384,8 @@ static void build_saved_list(void) { if (s_saved_sel < 0) s_saved_sel = 0; - if (s_saved_sel >= SAVED_COUNT) - s_saved_sel = SAVED_COUNT - 1; + if (s_saved_sel >= s_saved_count) + s_saved_sel = s_saved_count - 1; lv_obj_t *cont = lv_obj_create(s_screen); s_sig_cont = cont; @@ -385,7 +402,7 @@ static void build_saved_list(void) { lv_obj_set_scrollbar_mode(cont, LV_SCROLLBAR_MODE_OFF); lv_obj_clear_flag(cont, LV_OBJ_FLAG_SCROLL_ELASTIC | LV_OBJ_FLAG_SCROLL_MOMENTUM); - for (int i = 0; i < SAVED_COUNT; i++) { + for (int i = 0; i < s_saved_count; i++) { lv_obj_t *card = lv_obj_create(cont); s_sig_row[i] = card; lv_obj_remove_flag(card, LV_OBJ_FLAG_SCROLLABLE); @@ -403,14 +420,16 @@ static void build_saved_list(void) { s_sig_name[i] = name; lv_obj_set_width(name, lv_pct(68)); lv_label_set_long_mode(name, LV_LABEL_LONG_DOT); - lv_label_set_text(name, SAVED_SIGS[i].name); + lv_label_set_text(name, s_saved[i].name); lv_obj_set_style_text_font(name, &lv_font_montserrat_14, 0); lv_obj_set_style_text_color(name, current_theme.text_main, 0); lv_obj_align(name, LV_ALIGN_TOP_LEFT, 0, 0); + char fbuf[16]; + fmt_mhz(s_saved[i].frequency, fbuf, sizeof(fbuf)); lv_obj_t *val = lv_label_create(card); s_sig_val[i] = val; - lv_label_set_text(val, SAVED_SIGS[i].freq); + lv_label_set_text(val, fbuf); lv_obj_set_style_text_font(val, &lv_font_montserrat_12, 0); lv_obj_set_style_text_color(val, current_theme.border_accent, 0); lv_obj_align(val, LV_ALIGN_TOP_RIGHT, 0, 2); @@ -418,7 +437,7 @@ static void build_saved_list(void) { lv_obj_t *proto = lv_label_create(card); lv_obj_set_width(proto, lv_pct(100)); lv_label_set_long_mode(proto, LV_LABEL_LONG_DOT); - lv_label_set_text(proto, SAVED_SIGS[i].proto); + lv_label_set_text(proto, s_saved[i].protocol); lv_obj_set_style_text_font(proto, &lv_font_montserrat_12, 0); lv_obj_set_style_text_color(proto, current_theme.text_secondary, 0); lv_obj_align(proto, LV_ALIGN_TOP_LEFT, 0, 20); @@ -532,11 +551,39 @@ static void build_saved_info(void) { lv_obj_set_style_pad_row(card, 4, 0); lv_obj_t *name = lv_label_create(card); - lv_label_set_text(name, SAVED_SIGS[s_saved_sel].name); + lv_label_set_text(name, s_saved[s_saved_sel].name); lv_obj_set_style_text_color(name, current_theme.text_main, 0); lv_obj_set_style_text_font(name, &lv_font_montserrat_14, 0); - for (int i = 0; i < DETAIL_ROW_COUNT; i++) { + char freq_str[16]; + fmt_mhz(s_saved[s_saved_sel].frequency, freq_str, sizeof(freq_str)); + + char key_str[24]; + strlcpy(key_str, "RAW", sizeof(key_str)); + char content[512]; + if (subghz_storage_read(s_saved[s_saved_sel].name, content, sizeof(content)) > 0) { + const char *kp = strstr(content, "Key: "); + if (kp != NULL) { + unsigned b[8] = {0}; + if (sscanf(kp + 5, "%x %x %x %x %x %x %x %x", &b[0], &b[1], &b[2], &b[3], &b[4], &b[5], + &b[6], &b[7]) >= 8) { + uint32_t v = + ((uint32_t)b[4] << 24) | ((uint32_t)b[5] << 16) | ((uint32_t)b[6] << 8) | (uint32_t)b[7]; + snprintf(key_str, sizeof(key_str), "0x%lX", (unsigned long)v); + } + } + } + + const struct { + const char *label; + const char *value; + } rows[] = { + {"Protocol", s_saved[s_saved_sel].protocol}, + {"Key", key_str}, + {"Frequency", freq_str}, + }; + + for (int i = 0; i < (int)(sizeof(rows) / sizeof(rows[0])); i++) { lv_obj_t *row = lv_obj_create(card); lv_obj_remove_flag(row, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_width(row, lv_pct(100)); @@ -549,12 +596,12 @@ static void build_saved_info(void) { row, LV_FLEX_ALIGN_SPACE_BETWEEN, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); lv_obj_t *label = lv_label_create(row); - lv_label_set_text(label, DETAIL_ROWS[i].label); + lv_label_set_text(label, rows[i].label); lv_obj_set_style_text_color(label, current_theme.border_inactive, 0); lv_obj_set_style_text_font(label, &lv_font_montserrat_12, 0); lv_obj_t *value = lv_label_create(row); - lv_label_set_text(value, DETAIL_ROWS[i].value); + lv_label_set_text(value, rows[i].value); lv_obj_set_style_text_color(value, current_theme.border_accent, 0); lv_obj_set_style_text_font(value, &lv_font_montserrat_12, 0); } @@ -611,15 +658,17 @@ static void build_saved_info(void) { static void info_del_confirm(bool confirm) { if (!confirm) return; - ESP_LOGI(TAG, "mock saved delete: %s", SAVED_SIGS[s_saved_sel].name); + esp_err_t err = subghz_storage_delete(s_saved[s_saved_sel].name); ui_feedback(UI_FB_WRITE); - notify(NOTIFY_INFO, "Signal deleted"); + notify(err == ESP_OK ? NOTIFY_INFO : NOTIFY_WARNING, + err == ESP_OK ? "Signal deleted" : "Delete failed"); s_view = VIEW_SAVED; ui_async_call(rebuild_async, NULL); } static void build_screen(void) { stop_freq_timer(); + subghz_spectrum_stop(); if (s_screen != NULL) { lv_obj_del(s_screen); s_screen = NULL; @@ -702,6 +751,16 @@ static void send_lock_cb(lv_timer_t *t) { } static void start_saved_send(void) { + esp_err_t rerr = subghz_replay_file(s_saved[s_saved_sel].name); + if (rerr == ESP_ERR_NOT_SUPPORTED) { + notify(NOTIFY_WARNING, "Replay not supported"); + return; + } + if (rerr != ESP_OK) { + notify(NOTIFY_WARNING, "Send failed"); + return; + } + s_send_overlay = lv_obj_create(s_screen); lv_obj_set_size(s_send_overlay, lv_pct(100), lv_pct(100)); lv_obj_center(s_send_overlay); @@ -719,8 +778,10 @@ static void start_saved_send(void) { lv_obj_set_style_text_font(s_send_status, &lv_font_montserrat_14, 0); lv_obj_align(s_send_status, LV_ALIGN_TOP_MID, 0, SEND_STATUS_Y); + char freq_str[16]; + fmt_mhz(s_saved[s_saved_sel].frequency, freq_str, sizeof(freq_str)); lv_obj_t *freq = lv_label_create(s_send_overlay); - lv_label_set_text(freq, SAVED_SIGS[s_saved_sel].freq); + lv_label_set_text(freq, freq_str); lv_obj_set_style_text_color(freq, current_theme.border_accent, 0); lv_obj_set_style_text_font(freq, &lv_font_montserrat_12, 0); lv_obj_align(freq, LV_ALIGN_TOP_MID, 0, SEND_FREQ_Y); @@ -798,7 +859,7 @@ static void subghz_menu_input(const input_event_t *ev, void *ctx) { case VIEW_SAVED: switch (ev->button) { case INPUT_BTN_DOWN: - if (nav && s_saved_sel < SAVED_COUNT - 1) { + if (nav && s_saved_sel < s_saved_count - 1) { s_saved_sel++; update_sig_selection(); ui_feedback(UI_FB_NAV); @@ -813,7 +874,6 @@ static void subghz_menu_input(const input_event_t *ev, void *ctx) { break; case INPUT_BTN_OK: if (press) { - ESP_LOGI(TAG, "mock saved open: %s", SAVED_SIGS[s_saved_sel].name); s_view = VIEW_SAVED_INFO; build_screen(); } diff --git a/firmware_p4/components/Applications/ui/screens/subghz/subghz_read_ui.c b/firmware_p4/components/Applications/ui/screens/subghz/subghz_read_ui.c index 368430ec3..6b903d707 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/subghz_read_ui.c +++ b/firmware_p4/components/Applications/ui/screens/subghz/subghz_read_ui.c @@ -25,6 +25,8 @@ #include "msgbox_ui.h" #include "notify_ui.h" #include "subghz_receiver.h" +#include "subghz_replay.h" +#include "subghz_settings.h" #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" @@ -34,13 +36,9 @@ static const char *TAG = "SUBGHZ_RD"; -#define RX_PRESET CC1101_PRESET_OOK_800KHZ -#define RX_FREQ_HOPPING 0 - #define TICK_MS 33 -#define REVEAL_MS 3000 -#define SCAN_MS 2600 -#define FREQ_CYCLE_MS 420 +#define REVEAL_MS 1600 +#define POLL_MS 120 #define SCOPE_TICK_MS 38 #define DOT_CYCLE_MS 350 @@ -96,35 +94,18 @@ static const char *TAG = "SUBGHZ_RD"; #define HINT_SHOW "BACK = Exit" #define HINT_MENU "UP/DOWN choose OK do BACK exit" -#define SIG_PROTO "Princeton" -#define SIG_LOCK_FREQ "433.92 MHz" - -static const char *SCAN_FREQS[] = { - "433.92 MHz", - "868.30 MHz", - "315.00 MHz", - "915.00 MHz", -}; -#define SCAN_FREQ_COUNT ((int)(sizeof(SCAN_FREQS) / sizeof(SCAN_FREQS[0]))) - -static const struct { - const char *label; - const char *value; -} SIG_ROWS[] = { - {"Protocol", SIG_PROTO}, - {"Modulation", "OOK"}, - {"Bitrate", "4.8 kb/s"}, - {"Key", "0x1A2B3C"}, -}; -#define SIG_ROW_COUNT ((int)(sizeof(SIG_ROWS) / sizeof(SIG_ROWS[0]))) +#define ROW_MAX 4 + +typedef struct { + char label[16]; + char value[24]; +} readout_row_t; static const uint8_t OOK_BITS[] = {0, 0, 0, 1, 1, 0}; #define OOK_BIT_COUNT ((int)(sizeof(OOK_BITS) / sizeof(OOK_BITS[0]))) static lv_obj_t *s_screen = NULL; static lv_timer_t *s_tick_timer = NULL; -static lv_timer_t *s_scan_timer = NULL; -static lv_timer_t *s_freq_timer = NULL; static lv_timer_t *s_scope_timer = NULL; static lv_obj_t *s_status = NULL; @@ -141,14 +122,19 @@ static lv_point_precise_t s_wave_pts[WAVE_POINTS]; static lv_point_precise_t s_ook_pts[OOK_MAX_PTS]; static int s_phase = 0; static int s_mod = 0; -static int s_freq_idx = 0; static uint32_t s_scan_start = 0; static bool s_locked = false; static bool s_saved = false; +static subghz_rx_result_t s_result; +static readout_row_t s_rows[ROW_MAX]; +static int s_row_count = 0; +static char s_freq_str[16]; +static char s_proto_str[24]; +static char s_mod_str[16]; +static char s_card_sub[40]; + static void read_tick_cb(lv_timer_t *t); -static void scan_done_cb(lv_timer_t *t); -static void freq_cycle_cb(lv_timer_t *t); static void scope_tick_cb(lv_timer_t *t); static void subghz_read_input(const input_event_t *ev, void *ctx); @@ -164,6 +150,18 @@ static void stop_rx(void) { subghz_receiver_stop(); } +static void fmt_mhz(uint32_t hz, char *out, size_t n) { + if (hz == 0) { + snprintf(out, n, "Hopping"); + return; + } + snprintf(out, + n, + "%lu.%02lu MHz", + (unsigned long)(hz / 1000000UL), + (unsigned long)((hz % 1000000UL) / 10000UL)); +} + static void opa_cb(void *var, int32_t v) { lv_obj_set_style_opa((lv_obj_t *)var, (lv_opa_t)v, 0); } @@ -181,34 +179,6 @@ static void fade_in(lv_obj_t *obj, uint32_t duration_ms, uint32_t delay_ms) { lv_anim_start(&a); } -static void build_header(const char *text) { - lv_obj_t *title = lv_label_create(s_screen); - lv_label_set_text(title, text); - lv_obj_set_style_text_color(title, current_theme.border_accent, 0); - lv_obj_set_style_text_font(title, &lv_font_montserrat_14, 0); - lv_obj_align(title, LV_ALIGN_TOP_MID, 0, HEADER_TITLE_Y); - - lv_obj_t *rule = lv_obj_create(s_screen); - lv_obj_remove_flag(rule, LV_OBJ_FLAG_SCROLLABLE); - lv_obj_remove_flag(rule, LV_OBJ_FLAG_CLICKABLE); - lv_obj_set_size(rule, lv_pct(HEADER_RULE_W), HEADER_RULE_H); - lv_obj_align(rule, LV_ALIGN_TOP_MID, 0, HEADER_RULE_Y); - lv_obj_set_style_border_width(rule, 0, 0); - lv_obj_set_style_radius(rule, 1, 0); - lv_obj_set_style_bg_color(rule, current_theme.border_accent, 0); - lv_obj_set_style_bg_opa(rule, LV_OPA_40, 0); -} - -static lv_obj_t *make_hint(const char *text) { - lv_obj_t *hint = lv_label_create(s_screen); - lv_label_set_text(hint, text); - lv_obj_set_style_text_color(hint, current_theme.text_main, 0); - lv_obj_set_style_text_opa(hint, LV_OPA_60, 0); - lv_obj_set_style_text_font(hint, &lv_font_montserrat_12, 0); - lv_obj_align(hint, LV_ALIGN_BOTTOM_MID, 0, HINT_Y_OFS); - return hint; -} - static int clamp_y(int y) { if (y < 0) return 0; @@ -314,8 +284,6 @@ static void build_scope(void) { void ui_subghz_read_open(void) { stop_rx(); - stop_timer(&s_scan_timer); - stop_timer(&s_freq_timer); stop_timer(&s_scope_timer); stop_timer(&s_tick_timer); if (s_screen != NULL) { @@ -331,9 +299,11 @@ void ui_subghz_read_open(void) { s_cr = (capture_result_t){0}; s_options = false; s_locked_at = 0; - s_freq_idx = 0; s_locked = false; s_saved = false; + s_row_count = 0; + + subghz_settings_t cfg = subghz_settings_get(); s_screen = lv_obj_create(NULL); lv_obj_set_style_bg_color(s_screen, current_theme.screen_base, 0); @@ -350,8 +320,9 @@ void ui_subghz_read_open(void) { lv_obj_set_style_text_font(s_status, &lv_font_montserrat_14, 0); lv_obj_align(s_status, LV_ALIGN_TOP_MID, 0, STATUS_Y); + fmt_mhz(cfg.freq, s_freq_str, sizeof(s_freq_str)); s_freq = lv_label_create(s_screen); - lv_label_set_text(s_freq, SCAN_FREQS[0]); + lv_label_set_text(s_freq, s_freq_str); lv_obj_set_style_text_color(s_freq, current_theme.border_accent, 0); lv_obj_set_style_text_font(s_freq, &lv_font_montserrat_12, 0); lv_obj_align(s_freq, LV_ALIGN_TOP_MID, 0, FREQ_Y); @@ -361,15 +332,12 @@ void ui_subghz_read_open(void) { s_hint = ui_chrome_footer(s_screen, HINT_SCAN); s_scan_start = lv_tick_get(); - s_scan_timer = lv_timer_create(scan_done_cb, SCAN_MS, NULL); - lv_timer_set_repeat_count(s_scan_timer, 1); - s_freq_timer = lv_timer_create(freq_cycle_cb, FREQ_CYCLE_MS, NULL); s_scope_timer = lv_timer_create(scope_tick_cb, SCOPE_TICK_MS, NULL); s_tick_timer = lv_timer_create(read_tick_cb, TICK_MS, NULL); ui_input_set_screen_handler(subghz_read_input, NULL); - esp_err_t rx = subghz_receiver_start(SUBGHZ_MODE_SCAN, RX_PRESET, RX_FREQ_HOPPING); + esp_err_t rx = subghz_receiver_start(SUBGHZ_MODE_SCAN, cfg.preset, cfg.freq); if (rx != ESP_OK) ESP_LOGE(TAG, "subghz_receiver_start failed: %s", esp_err_to_name(rx)); @@ -387,17 +355,6 @@ static void scope_tick_cb(lv_timer_t *t) { fill_wave(true); } -static void freq_cycle_cb(lv_timer_t *t) { - if (lv_screen_active() != s_screen) { - lv_timer_delete(t); - s_freq_timer = NULL; - return; - } - s_freq_idx = (s_freq_idx + 1) % SCAN_FREQ_COUNT; - if (s_freq) - lv_label_set_text(s_freq, SCAN_FREQS[s_freq_idx]); -} - static void build_signal_readout(void) { lv_obj_t *col = lv_obj_create(s_screen); s_readout = col; @@ -411,7 +368,7 @@ static void build_signal_readout(void) { lv_obj_set_flex_flow(col, LV_FLEX_FLOW_COLUMN); lv_obj_set_style_pad_row(col, READOUT_ROW_GAP, 0); - for (int i = 0; i < SIG_ROW_COUNT; i++) { + for (int i = 0; i < s_row_count; i++) { lv_obj_t *row = lv_obj_create(col); lv_obj_remove_flag(row, LV_OBJ_FLAG_SCROLLABLE); lv_obj_set_width(row, lv_pct(100)); @@ -424,12 +381,12 @@ static void build_signal_readout(void) { row, LV_FLEX_ALIGN_SPACE_BETWEEN, LV_FLEX_ALIGN_CENTER, LV_FLEX_ALIGN_CENTER); lv_obj_t *label = lv_label_create(row); - lv_label_set_text(label, SIG_ROWS[i].label); + lv_label_set_text(label, s_rows[i].label); lv_obj_set_style_text_color(label, current_theme.border_inactive, 0); lv_obj_set_style_text_font(label, &lv_font_montserrat_12, 0); lv_obj_t *value = lv_label_create(row); - lv_label_set_text(value, SIG_ROWS[i].value); + lv_label_set_text(value, s_rows[i].value); lv_obj_set_style_text_color(value, current_theme.border_accent, 0); lv_obj_set_style_text_font(value, &lv_font_montserrat_12, 0); @@ -437,10 +394,45 @@ static void build_signal_readout(void) { } } -static void scan_done_cb(lv_timer_t *t) { - (void)t; - s_scan_timer = NULL; - stop_timer(&s_freq_timer); +static void add_row(const char *label, const char *value) { + if (s_row_count >= ROW_MAX) + return; + snprintf(s_rows[s_row_count].label, sizeof(s_rows[s_row_count].label), "%s", label); + snprintf(s_rows[s_row_count].value, sizeof(s_rows[s_row_count].value), "%s", value); + s_row_count++; +} + +static void build_rows_from_result(void) { + s_row_count = 0; + + const char *mod = (s_result.analysis.modulation_hint != NULL && + s_result.analysis.modulation_hint[0] != '\0') + ? s_result.analysis.modulation_hint + : "OOK"; + snprintf(s_mod_str, sizeof(s_mod_str), "%s", mod); + + if (s_result.decoded) { + snprintf(s_proto_str, sizeof(s_proto_str), "%s", s_result.data.protocol_name); + char key[24]; + snprintf(key, sizeof(key), "0x%lX", (unsigned long)s_result.data.raw_value); + char bits[16]; + snprintf(bits, sizeof(bits), "%u bits", (unsigned)s_result.data.bit_count); + add_row("Protocol", s_proto_str); + add_row("Modulation", s_mod_str); + add_row("Bits", bits); + add_row("Key", key); + } else { + snprintf(s_proto_str, sizeof(s_proto_str), "Unknown"); + char te[20]; + snprintf(te, sizeof(te), "%lu us", (unsigned long)s_result.analysis.estimated_te); + add_row("Protocol", s_proto_str); + add_row("Modulation", s_mod_str); + add_row("TE", te); + add_row("Saved", "RAW"); + } +} + +static void do_lock(void) { stop_timer(&s_scope_timer); stop_rx(); if (lv_screen_active() != s_screen) @@ -451,12 +443,15 @@ static void scan_done_cb(lv_timer_t *t) { lv_obj_set_style_line_rounded(s_wave, false, 0); fill_ook(); + fmt_mhz(s_result.freq, s_freq_str, sizeof(s_freq_str)); + build_rows_from_result(); + if (s_status) { lv_label_set_text(s_status, "Signal locked!"); lv_obj_set_style_text_color(s_status, lv_color_hex(UI_COL_SUCCESS), 0); } if (s_freq) - lv_label_set_text(s_freq, SIG_LOCK_FREQ); + lv_label_set_text(s_freq, s_freq_str); build_signal_readout(); @@ -464,7 +459,7 @@ static void scan_done_cb(lv_timer_t *t) { ui_chrome_footer_set_text(s_hint, HINT_SHOW); s_locked_at = lv_tick_get(); - ESP_LOGI(TAG, "mock subghz capture: %s %s", SIG_PROTO, SIG_LOCK_FREQ); + ESP_LOGI(TAG, "captured: %s %s", s_proto_str, s_freq_str); ui_feedback(UI_FB_READ); } @@ -483,12 +478,14 @@ static void show_options(void) { if (s_freq) lv_obj_add_flag(s_freq, LV_OBJ_FLAG_HIDDEN); + snprintf(s_card_sub, sizeof(s_card_sub), "%s (%s)", s_proto_str, s_mod_str); + capture_result_cfg_t cfg = { .accent = current_theme.border_accent, .card_icon = "/assets/icons/graphic_eq.bin", .card_title = "Signal captured", - .card_sub = SIG_PROTO " (OOK)", - .card_value = SIG_LOCK_FREQ, + .card_sub = s_card_sub, + .card_value = s_freq_str, .primary_label = "Send", .again_label = "Capture again", }; @@ -505,18 +502,24 @@ static void read_tick_cb(lv_timer_t *t) { return; } - if (!s_locked && s_status != NULL) { - int dots = ((lv_tick_get() - s_scan_start) / DOT_CYCLE_MS) % 4; - char buf[20]; - snprintf(buf, - sizeof(buf), - "%s%s", - STATUS_SCAN, - dots == 1 ? "." - : dots == 2 ? ".." - : dots == 3 ? "..." - : ""); - lv_label_set_text(s_status, buf); + if (!s_locked) { + if (s_status != NULL) { + int dots = ((lv_tick_get() - s_scan_start) / DOT_CYCLE_MS) % 4; + char buf[20]; + snprintf(buf, + sizeof(buf), + "%s%s", + STATUS_SCAN, + dots == 1 ? "." + : dots == 2 ? ".." + : dots == 3 ? "..." + : ""); + lv_label_set_text(s_status, buf); + } + + if (subghz_receiver_get_result(&s_result)) + do_lock(); + return; } if (s_locked && !s_options) { @@ -525,6 +528,21 @@ static void read_tick_cb(lv_timer_t *t) { } } +static void send_current(void) { + ui_feedback(UI_FB_EMULATE); + if (s_result.save_name[0] == '\0') { + notify(NOTIFY_WARNING, "Nothing to send"); + return; + } + esp_err_t err = subghz_replay_file(s_result.save_name); + if (err == ESP_OK) + notify(NOTIFY_INFO, "Signal sent"); + else if (err == ESP_ERR_NOT_SUPPORTED) + notify(NOTIFY_WARNING, "Replay not supported"); + else + notify(NOTIFY_WARNING, "Send failed"); +} + static void subghz_read_input(const input_event_t *ev, void *ctx) { (void)ctx; const bool press = (ev->action == INPUT_ACTION_PRESS); @@ -558,16 +576,14 @@ static void subghz_read_input(const input_event_t *ev, void *ctx) { if (press) { switch (capture_result_selected(&s_cr)) { case CAP_ACT_PRIMARY: - ui_feedback(UI_FB_EMULATE); - notify(NOTIFY_INFO, SIG_LOCK_FREQ " sent"); + send_current(); break; case CAP_ACT_SAVE: if (!s_saved) { s_saved = true; capture_result_mark_saved(&s_cr); - ESP_LOGI(TAG, "mock subghz saved: %s", SIG_PROTO); ui_feedback(UI_FB_WRITE); - notify(NOTIFY_SAVED, "Sub-GHz signal saved"); + notify(NOTIFY_SAVED, "Saved to SD"); } break; case CAP_ACT_AGAIN: diff --git a/firmware_p4/components/Applications/ui/screens/subghz/subghz_send_ui.c b/firmware_p4/components/Applications/ui/screens/subghz/subghz_send_ui.c index 84fcc61d4..2e48aa817 100644 --- a/firmware_p4/components/Applications/ui/screens/subghz/subghz_send_ui.c +++ b/firmware_p4/components/Applications/ui/screens/subghz/subghz_send_ui.c @@ -16,6 +16,7 @@ #include "subghz_send_ui.h" #include +#include #include "esp_log.h" #include "lvgl.h" @@ -24,7 +25,10 @@ #include "assets_manager.h" #include "capture_result_ui.h" #include "notify_ui.h" +#include "octobit_ui.h" +#include "subghz_replay.h" #include "subghz_scope_ui.h" +#include "subghz_storage.h" #include "ui_chrome.h" #include "ui_feedback.h" #include "ui_manager.h" @@ -32,8 +36,6 @@ #include "ui_semantic.h" #include "ui_theme.h" -static const char *TAG = "SUBGHZ_SEND_UI"; - #define ANTENNA_ICON "/assets/icons/settings_input_antenna.bin" #define SIGNAL_ICON "/assets/icons/graphic_eq.bin" @@ -68,17 +70,27 @@ static const char *TAG = "SUBGHZ_SEND_UI"; #define HINT_LIST "UP/DOWN choose OK send BACK exit" #define HINT_OPTIONS "UP/DOWN choose OK do BACK exit" -static const struct { - const char *name; - const char *freq; - const char *proto; -} SIGNALS[] = { - {"Gate_433", "433.92 MHz", "Princeton"}, - {"Doorbell", "433.92 MHz", "CAME"}, - {"TPMS_FL", "315.00 MHz", "TPMS"}, - {"Garage", "868.30 MHz", "Nice FLO"}, -}; -#define SIGNAL_COUNT ((int)(sizeof(SIGNALS) / sizeof(SIGNALS[0]))) +#define SIGNAL_MAX 64 +static subghz_storage_entry_t s_sigs[SIGNAL_MAX]; +static int s_sig_count = 0; +static char s_card_freq[16]; + +static void fmt_mhz(uint32_t hz, char *out, size_t n) { + if (hz == 0) { + snprintf(out, n, "-- MHz"); + return; + } + snprintf(out, + n, + "%lu.%02lu MHz", + (unsigned long)(hz / 1000000UL), + (unsigned long)((hz % 1000000UL) / 10000UL)); +} + +static void load_signals(void) { + int n = subghz_storage_list(s_sigs, SIGNAL_MAX); + s_sig_count = (n < 0) ? 0 : n; +} typedef enum { VIEW_LIST = 0, @@ -88,9 +100,9 @@ typedef enum { static lv_obj_t *s_screen = NULL; static lv_obj_t *s_list = NULL; -static lv_obj_t *s_rows[SIGNAL_COUNT]; -static lv_obj_t *s_row_name[SIGNAL_COUNT]; -static lv_obj_t *s_row_val[SIGNAL_COUNT]; +static lv_obj_t *s_rows[SIGNAL_MAX]; +static lv_obj_t *s_row_name[SIGNAL_MAX]; +static lv_obj_t *s_row_val[SIGNAL_MAX]; static send_view_t s_view = VIEW_LIST; static int s_sel = 0; @@ -166,7 +178,7 @@ static void style_row(int i, bool sel) { } static void update_selection(void) { - for (int i = 0; i < SIGNAL_COUNT; i++) + for (int i = 0; i < s_sig_count; i++) style_row(i, i == s_sel); if (s_list != NULL && s_rows[s_sel] != NULL) { lv_obj_update_layout(s_list); @@ -188,14 +200,23 @@ static void build_list(void) { s_cr = (capture_result_t){0}; s_options = false; - if (s_sel < 0) - s_sel = 0; - if (s_sel >= SIGNAL_COUNT) - s_sel = SIGNAL_COUNT - 1; + load_signals(); s_screen = new_screen(); ui_chrome_header(s_screen, "SEND", ANTENNA_ICON); + if (s_sig_count == 0) { + octobit_create(s_screen, "No saved signals yet"); + s_hint_label = ui_chrome_footer(s_screen, "BACK exit"); + ui_screen_load_owned(&s_screen, s_screen); + return; + } + + if (s_sel < 0) + s_sel = 0; + if (s_sel >= s_sig_count) + s_sel = s_sig_count - 1; + lv_obj_t *cont = lv_obj_create(s_screen); s_list = cont; lv_obj_set_size(cont, lv_pct(100), ui_screen_h() - UI_CHROME_HEADER_H - UI_CHROME_FOOTER_H); @@ -216,7 +237,7 @@ static void build_list(void) { lv_obj_set_style_width(cont, LIST_SB_W, LV_PART_SCROLLBAR); lv_obj_set_style_radius(cont, LIST_SB_RADIUS, LV_PART_SCROLLBAR); - for (int i = 0; i < SIGNAL_COUNT; i++) { + for (int i = 0; i < s_sig_count; i++) { lv_obj_t *r = lv_obj_create(cont); s_rows[i] = r; lv_obj_remove_flag(r, LV_OBJ_FLAG_SCROLLABLE); @@ -254,12 +275,14 @@ static void build_list(void) { s_row_name[i] = name; lv_label_set_long_mode(name, LV_LABEL_LONG_SCROLL_CIRCULAR); lv_obj_set_flex_grow(name, 1); - lv_label_set_text(name, SIGNALS[i].name); + lv_label_set_text(name, s_sigs[i].name); lv_obj_set_style_text_font(name, &lv_font_montserrat_14, 0); + char fbuf[16]; + fmt_mhz(s_sigs[i].frequency, fbuf, sizeof(fbuf)); lv_obj_t *val = lv_label_create(r); s_row_val[i] = val; - lv_label_set_text(val, SIGNALS[i].freq); + lv_label_set_text(val, fbuf); lv_obj_set_style_text_font(val, &lv_font_montserrat_12, 0); } @@ -289,8 +312,10 @@ static void build_sending(void) { lv_obj_set_style_text_align(s_status_label, LV_TEXT_ALIGN_CENTER, 0); lv_obj_align(s_status_label, LV_ALIGN_TOP_MID, 0, STATUS_Y); + char freq_str[16]; + fmt_mhz(s_sigs[s_sel].frequency, freq_str, sizeof(freq_str)); s_freq_label = lv_label_create(s_screen); - lv_label_set_text(s_freq_label, SIGNALS[s_sel].freq); + lv_label_set_text(s_freq_label, freq_str); lv_obj_set_style_text_color(s_freq_label, current_theme.border_accent, 0); lv_obj_set_style_text_font(s_freq_label, &lv_font_montserrat_12, 0); lv_obj_align(s_freq_label, LV_ALIGN_TOP_MID, 0, FREQ_Y); @@ -313,12 +338,13 @@ static void show_options(void) { if (s_freq_label != NULL) lv_obj_add_flag(s_freq_label, LV_OBJ_FLAG_HIDDEN); + fmt_mhz(s_sigs[s_sel].frequency, s_card_freq, sizeof(s_card_freq)); capture_result_cfg_t cfg = { .accent = current_theme.border_accent, .card_icon = SIGNAL_ICON, - .card_title = SIGNALS[s_sel].name, - .card_sub = SIGNALS[s_sel].proto, - .card_value = SIGNALS[s_sel].freq, + .card_title = s_sigs[s_sel].name, + .card_sub = s_sigs[s_sel].protocol, + .card_value = s_card_freq, .primary_label = "Send again", .again_label = "Pick another", }; @@ -329,10 +355,18 @@ static void show_options(void) { } static void start_send(void) { + esp_err_t err = subghz_replay_file(s_sigs[s_sel].name); + if (err == ESP_ERR_NOT_SUPPORTED) { + notify(NOTIFY_WARNING, "Replay not supported"); + return; + } + if (err != ESP_OK) { + notify(NOTIFY_WARNING, "Send failed"); + return; + } stop_send_timer(); s_view = VIEW_SENDING; s_send_start = lv_tick_get(); - ESP_LOGI(TAG, "mock send: %s %s", SIGNALS[s_sel].name, SIGNALS[s_sel].freq); build_sending(); ui_feedback(UI_FB_SELECT); s_send_timer = lv_timer_create(send_done_cb, SENDING_MS, NULL); @@ -396,7 +430,7 @@ static void subghz_send_input(const input_event_t *ev, void *ctx) { case VIEW_LIST: switch (ev->button) { case INPUT_BTN_DOWN: - if (nav && s_sel < SIGNAL_COUNT - 1) { + if (nav && s_sel < s_sig_count - 1) { s_sel++; update_selection(); ui_feedback(UI_FB_NAV); @@ -474,9 +508,8 @@ static void subghz_send_input(const input_event_t *ev, void *ctx) { if (!s_saved) { s_saved = true; capture_result_mark_saved(&s_cr); - ESP_LOGI(TAG, "mock signal saved: %s", SIGNALS[s_sel].name); ui_feedback(UI_FB_WRITE); - notify(NOTIFY_SAVED, "Sub-GHz signal saved"); + notify(NOTIFY_INFO, "Already on SD"); } break; case CAP_ACT_AGAIN: From bcc47a0547a6ebe2a800608e6e9bee61ff49e537 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Thu, 20 Aug 2026 16:48:28 -0300 Subject: [PATCH 097/103] feat(doom): port doomgeneric as an Applications component with HighBoy platform layer --- firmware_p4/CMakeLists.txt | 4 +- .../Applications/doom/CMakeLists.txt | 23 + .../components/Applications/doom/am_map.c | 1355 +++++ .../components/Applications/doom/am_map.h | 49 + .../components/Applications/doom/config.h | 100 + .../components/Applications/doom/d_englsh.h | 693 +++ .../components/Applications/doom/d_event.c | 63 + .../components/Applications/doom/d_event.h | 137 + .../components/Applications/doom/d_items.c | 128 + .../components/Applications/doom/d_items.h | 41 + .../components/Applications/doom/d_iwad.c | 848 +++ .../components/Applications/doom/d_iwad.h | 52 + .../components/Applications/doom/d_loop.c | 826 +++ .../components/Applications/doom/d_loop.h | 81 + .../components/Applications/doom/d_main.c | 1845 +++++++ .../components/Applications/doom/d_main.h | 50 + .../components/Applications/doom/d_mode.c | 209 + .../components/Applications/doom/d_mode.h | 98 + .../components/Applications/doom/d_net.c | 281 + .../components/Applications/doom/d_player.h | 209 + .../components/Applications/doom/d_textur.h | 43 + .../components/Applications/doom/d_think.h | 68 + .../components/Applications/doom/d_ticcmd.h | 56 + .../components/Applications/doom/deh_main.h | 48 + .../components/Applications/doom/deh_misc.h | 83 + .../components/Applications/doom/deh_str.h | 47 + .../components/Applications/doom/doom.h | 42 + .../Applications/doom/doom_sound_highboy.c | 158 + .../components/Applications/doom/doomdata.h | 213 + .../components/Applications/doom/doomdef.c | 28 + .../components/Applications/doom/doomdef.h | 168 + .../Applications/doom/doomfeatures.h | 40 + .../Applications/doom/doomgeneric.c | 27 + .../Applications/doom/doomgeneric.h | 49 + .../Applications/doom/doomgeneric_highboy.c | 312 ++ .../components/Applications/doom/doomkeys.h | 97 + .../components/Applications/doom/doomstat.c | 35 + .../components/Applications/doom/doomstat.h | 281 + .../components/Applications/doom/doomtype.h | 104 + .../components/Applications/doom/dstrings.c | 73 + .../components/Applications/doom/dstrings.h | 41 + .../components/Applications/doom/dummy.c | 53 + .../components/Applications/doom/f_finale.c | 718 +++ .../components/Applications/doom/f_finale.h | 45 + .../components/Applications/doom/f_wipe.c | 294 ++ .../components/Applications/doom/f_wipe.h | 63 + .../components/Applications/doom/g_game.c | 2303 ++++++++ .../components/Applications/doom/g_game.h | 80 + .../components/Applications/doom/gusconf.c | 271 + .../components/Applications/doom/gusconf.h | 29 + .../components/Applications/doom/hu_lib.c | 347 ++ .../components/Applications/doom/hu_lib.h | 182 + .../components/Applications/doom/hu_stuff.c | 641 +++ .../components/Applications/doom/hu_stuff.h | 59 + .../components/Applications/doom/i_cdmus.c | 243 + .../components/Applications/doom/i_cdmus.h | 41 + .../components/Applications/doom/i_endoom.c | 101 + .../components/Applications/doom/i_endoom.h | 29 + .../components/Applications/doom/i_input.c | 341 ++ .../components/Applications/doom/i_joystick.c | 359 ++ .../components/Applications/doom/i_joystick.h | 70 + .../components/Applications/doom/i_scale.c | 1452 +++++ .../components/Applications/doom/i_scale.h | 53 + .../components/Applications/doom/i_sound.c | 419 ++ .../components/Applications/doom/i_sound.h | 256 + .../components/Applications/doom/i_swap.h | 73 + .../components/Applications/doom/i_system.c | 578 ++ .../components/Applications/doom/i_system.h | 84 + .../components/Applications/doom/i_timer.c | 96 + .../components/Applications/doom/i_timer.h | 42 + .../components/Applications/doom/i_video.c | 495 ++ .../components/Applications/doom/i_video.h | 175 + .../components/Applications/doom/icon.c | 262 + .../Applications/doom/include/doom_highboy.h | 22 + .../components/Applications/doom/info.c | 4662 +++++++++++++++++ .../components/Applications/doom/info.h | 1331 +++++ .../components/Applications/doom/linker.lf | 22 + .../components/Applications/doom/m_argv.c | 265 + .../components/Applications/doom/m_argv.h | 49 + .../components/Applications/doom/m_bbox.c | 54 + .../components/Applications/doom/m_bbox.h | 47 + .../components/Applications/doom/m_cheat.c | 89 + .../components/Applications/doom/m_cheat.h | 62 + .../components/Applications/doom/m_config.c | 2128 ++++++++ .../components/Applications/doom/m_config.h | 39 + .../components/Applications/doom/m_controls.c | 398 ++ .../components/Applications/doom/m_controls.h | 168 + .../components/Applications/doom/m_fixed.c | 62 + .../components/Applications/doom/m_fixed.h | 39 + .../components/Applications/doom/m_menu.c | 2125 ++++++++ .../components/Applications/doom/m_menu.h | 61 + .../components/Applications/doom/m_misc.c | 536 ++ .../components/Applications/doom/m_misc.h | 51 + .../components/Applications/doom/m_random.c | 65 + .../components/Applications/doom/m_random.h | 39 + .../components/Applications/doom/memio.c | 197 + .../components/Applications/doom/memio.h | 38 + .../components/Applications/doom/mus2mid.c | 737 +++ .../components/Applications/doom/mus2mid.h | 9 + .../components/Applications/doom/net_client.h | 52 + .../Applications/doom/net_dedicated.h | 25 + .../components/Applications/doom/net_defs.h | 248 + .../components/Applications/doom/net_gui.h | 29 + .../components/Applications/doom/net_io.h | 36 + .../components/Applications/doom/net_loop.h | 27 + .../components/Applications/doom/net_packet.h | 44 + .../components/Applications/doom/net_query.h | 44 + .../components/Applications/doom/net_sdl.h | 26 + .../components/Applications/doom/net_server.h | 42 + .../components/Applications/doom/p_ceilng.c | 324 ++ .../components/Applications/doom/p_doors.c | 778 +++ .../components/Applications/doom/p_enemy.c | 2006 +++++++ .../components/Applications/doom/p_floor.c | 546 ++ .../components/Applications/doom/p_inter.c | 922 ++++ .../components/Applications/doom/p_inter.h | 30 + .../components/Applications/doom/p_lights.c | 350 ++ .../components/Applications/doom/p_local.h | 297 ++ .../components/Applications/doom/p_map.c | 1448 +++++ .../components/Applications/doom/p_maputl.c | 1001 ++++ .../components/Applications/doom/p_mobj.c | 1049 ++++ .../components/Applications/doom/p_mobj.h | 284 + .../components/Applications/doom/p_plats.c | 304 ++ .../components/Applications/doom/p_pspr.c | 888 ++++ .../components/Applications/doom/p_pspr.h | 71 + .../components/Applications/doom/p_saveg.c | 1891 +++++++ .../components/Applications/doom/p_saveg.h | 62 + .../components/Applications/doom/p_setup.c | 855 +++ .../components/Applications/doom/p_setup.h | 37 + .../components/Applications/doom/p_sight.c | 350 ++ .../components/Applications/doom/p_spec.c | 1489 ++++++ .../components/Applications/doom/p_spec.h | 637 +++ .../components/Applications/doom/p_switch.c | 648 +++ .../components/Applications/doom/p_telept.c | 133 + .../components/Applications/doom/p_tick.c | 151 + .../components/Applications/doom/p_tick.h | 33 + .../components/Applications/doom/p_user.c | 379 ++ .../components/Applications/doom/r_bsp.c | 573 ++ .../components/Applications/doom/r_bsp.h | 61 + .../components/Applications/doom/r_data.c | 912 ++++ .../components/Applications/doom/r_data.h | 51 + .../components/Applications/doom/r_defs.h | 448 ++ .../components/Applications/doom/r_draw.c | 975 ++++ .../components/Applications/doom/r_draw.h | 104 + .../components/Applications/doom/r_local.h | 45 + .../components/Applications/doom/r_main.c | 891 ++++ .../components/Applications/doom/r_main.h | 160 + .../components/Applications/doom/r_plane.c | 446 ++ .../components/Applications/doom/r_plane.h | 76 + .../components/Applications/doom/r_segs.c | 743 +++ .../components/Applications/doom/r_segs.h | 33 + .../components/Applications/doom/r_sky.c | 52 + .../components/Applications/doom/r_sky.h | 37 + .../components/Applications/doom/r_state.h | 127 + .../components/Applications/doom/r_things.c | 982 ++++ .../components/Applications/doom/r_things.h | 65 + .../components/Applications/doom/s_sound.c | 670 +++ .../components/Applications/doom/s_sound.h | 89 + .../components/Applications/doom/sha1.c | 319 ++ .../components/Applications/doom/sha1.h | 40 + .../components/Applications/doom/sounds.c | 229 + .../components/Applications/doom/sounds.h | 227 + .../components/Applications/doom/st_lib.c | 284 + .../components/Applications/doom/st_lib.h | 209 + .../components/Applications/doom/st_stuff.c | 1416 +++++ .../components/Applications/doom/st_stuff.h | 89 + .../components/Applications/doom/statdump.c | 392 ++ .../components/Applications/doom/statdump.h | 23 + .../components/Applications/doom/tables.c | 2227 ++++++++ .../components/Applications/doom/tables.h | 96 + .../components/Applications/doom/v_patch.h | 50 + .../components/Applications/doom/v_video.c | 932 ++++ .../components/Applications/doom/v_video.h | 108 + .../components/Applications/doom/w_checksum.c | 87 + .../components/Applications/doom/w_checksum.h | 27 + .../components/Applications/doom/w_file.c | 95 + .../components/Applications/doom/w_file.h | 78 + .../Applications/doom/w_file_stdc.c | 96 + .../components/Applications/doom/w_main.c | 198 + .../components/Applications/doom/w_main.h | 24 + .../components/Applications/doom/w_merge.h | 44 + .../components/Applications/doom/w_wad.c | 612 +++ .../components/Applications/doom/w_wad.h | 78 + .../components/Applications/doom/wi_stuff.c | 1829 +++++++ .../components/Applications/doom/wi_stuff.h | 48 + .../components/Applications/doom/z_zone.c | 488 ++ .../components/Applications/doom/z_zone.h | 73 + 186 files changed, 68147 insertions(+), 1 deletion(-) create mode 100644 firmware_p4/components/Applications/doom/CMakeLists.txt create mode 100644 firmware_p4/components/Applications/doom/am_map.c create mode 100644 firmware_p4/components/Applications/doom/am_map.h create mode 100644 firmware_p4/components/Applications/doom/config.h create mode 100644 firmware_p4/components/Applications/doom/d_englsh.h create mode 100644 firmware_p4/components/Applications/doom/d_event.c create mode 100644 firmware_p4/components/Applications/doom/d_event.h create mode 100644 firmware_p4/components/Applications/doom/d_items.c create mode 100644 firmware_p4/components/Applications/doom/d_items.h create mode 100644 firmware_p4/components/Applications/doom/d_iwad.c create mode 100644 firmware_p4/components/Applications/doom/d_iwad.h create mode 100644 firmware_p4/components/Applications/doom/d_loop.c create mode 100644 firmware_p4/components/Applications/doom/d_loop.h create mode 100644 firmware_p4/components/Applications/doom/d_main.c create mode 100644 firmware_p4/components/Applications/doom/d_main.h create mode 100644 firmware_p4/components/Applications/doom/d_mode.c create mode 100644 firmware_p4/components/Applications/doom/d_mode.h create mode 100644 firmware_p4/components/Applications/doom/d_net.c create mode 100644 firmware_p4/components/Applications/doom/d_player.h create mode 100644 firmware_p4/components/Applications/doom/d_textur.h create mode 100644 firmware_p4/components/Applications/doom/d_think.h create mode 100644 firmware_p4/components/Applications/doom/d_ticcmd.h create mode 100644 firmware_p4/components/Applications/doom/deh_main.h create mode 100644 firmware_p4/components/Applications/doom/deh_misc.h create mode 100644 firmware_p4/components/Applications/doom/deh_str.h create mode 100644 firmware_p4/components/Applications/doom/doom.h create mode 100644 firmware_p4/components/Applications/doom/doom_sound_highboy.c create mode 100644 firmware_p4/components/Applications/doom/doomdata.h create mode 100644 firmware_p4/components/Applications/doom/doomdef.c create mode 100644 firmware_p4/components/Applications/doom/doomdef.h create mode 100644 firmware_p4/components/Applications/doom/doomfeatures.h create mode 100644 firmware_p4/components/Applications/doom/doomgeneric.c create mode 100644 firmware_p4/components/Applications/doom/doomgeneric.h create mode 100644 firmware_p4/components/Applications/doom/doomgeneric_highboy.c create mode 100644 firmware_p4/components/Applications/doom/doomkeys.h create mode 100644 firmware_p4/components/Applications/doom/doomstat.c create mode 100644 firmware_p4/components/Applications/doom/doomstat.h create mode 100644 firmware_p4/components/Applications/doom/doomtype.h create mode 100644 firmware_p4/components/Applications/doom/dstrings.c create mode 100644 firmware_p4/components/Applications/doom/dstrings.h create mode 100644 firmware_p4/components/Applications/doom/dummy.c create mode 100644 firmware_p4/components/Applications/doom/f_finale.c create mode 100644 firmware_p4/components/Applications/doom/f_finale.h create mode 100644 firmware_p4/components/Applications/doom/f_wipe.c create mode 100644 firmware_p4/components/Applications/doom/f_wipe.h create mode 100644 firmware_p4/components/Applications/doom/g_game.c create mode 100644 firmware_p4/components/Applications/doom/g_game.h create mode 100644 firmware_p4/components/Applications/doom/gusconf.c create mode 100644 firmware_p4/components/Applications/doom/gusconf.h create mode 100644 firmware_p4/components/Applications/doom/hu_lib.c create mode 100644 firmware_p4/components/Applications/doom/hu_lib.h create mode 100644 firmware_p4/components/Applications/doom/hu_stuff.c create mode 100644 firmware_p4/components/Applications/doom/hu_stuff.h create mode 100644 firmware_p4/components/Applications/doom/i_cdmus.c create mode 100644 firmware_p4/components/Applications/doom/i_cdmus.h create mode 100644 firmware_p4/components/Applications/doom/i_endoom.c create mode 100644 firmware_p4/components/Applications/doom/i_endoom.h create mode 100644 firmware_p4/components/Applications/doom/i_input.c create mode 100644 firmware_p4/components/Applications/doom/i_joystick.c create mode 100644 firmware_p4/components/Applications/doom/i_joystick.h create mode 100644 firmware_p4/components/Applications/doom/i_scale.c create mode 100644 firmware_p4/components/Applications/doom/i_scale.h create mode 100644 firmware_p4/components/Applications/doom/i_sound.c create mode 100644 firmware_p4/components/Applications/doom/i_sound.h create mode 100644 firmware_p4/components/Applications/doom/i_swap.h create mode 100644 firmware_p4/components/Applications/doom/i_system.c create mode 100644 firmware_p4/components/Applications/doom/i_system.h create mode 100644 firmware_p4/components/Applications/doom/i_timer.c create mode 100644 firmware_p4/components/Applications/doom/i_timer.h create mode 100644 firmware_p4/components/Applications/doom/i_video.c create mode 100644 firmware_p4/components/Applications/doom/i_video.h create mode 100644 firmware_p4/components/Applications/doom/icon.c create mode 100644 firmware_p4/components/Applications/doom/include/doom_highboy.h create mode 100644 firmware_p4/components/Applications/doom/info.c create mode 100644 firmware_p4/components/Applications/doom/info.h create mode 100644 firmware_p4/components/Applications/doom/linker.lf create mode 100644 firmware_p4/components/Applications/doom/m_argv.c create mode 100644 firmware_p4/components/Applications/doom/m_argv.h create mode 100644 firmware_p4/components/Applications/doom/m_bbox.c create mode 100644 firmware_p4/components/Applications/doom/m_bbox.h create mode 100644 firmware_p4/components/Applications/doom/m_cheat.c create mode 100644 firmware_p4/components/Applications/doom/m_cheat.h create mode 100644 firmware_p4/components/Applications/doom/m_config.c create mode 100644 firmware_p4/components/Applications/doom/m_config.h create mode 100644 firmware_p4/components/Applications/doom/m_controls.c create mode 100644 firmware_p4/components/Applications/doom/m_controls.h create mode 100644 firmware_p4/components/Applications/doom/m_fixed.c create mode 100644 firmware_p4/components/Applications/doom/m_fixed.h create mode 100644 firmware_p4/components/Applications/doom/m_menu.c create mode 100644 firmware_p4/components/Applications/doom/m_menu.h create mode 100644 firmware_p4/components/Applications/doom/m_misc.c create mode 100644 firmware_p4/components/Applications/doom/m_misc.h create mode 100644 firmware_p4/components/Applications/doom/m_random.c create mode 100644 firmware_p4/components/Applications/doom/m_random.h create mode 100644 firmware_p4/components/Applications/doom/memio.c create mode 100644 firmware_p4/components/Applications/doom/memio.h create mode 100644 firmware_p4/components/Applications/doom/mus2mid.c create mode 100644 firmware_p4/components/Applications/doom/mus2mid.h create mode 100644 firmware_p4/components/Applications/doom/net_client.h create mode 100644 firmware_p4/components/Applications/doom/net_dedicated.h create mode 100644 firmware_p4/components/Applications/doom/net_defs.h create mode 100644 firmware_p4/components/Applications/doom/net_gui.h create mode 100644 firmware_p4/components/Applications/doom/net_io.h create mode 100644 firmware_p4/components/Applications/doom/net_loop.h create mode 100644 firmware_p4/components/Applications/doom/net_packet.h create mode 100644 firmware_p4/components/Applications/doom/net_query.h create mode 100644 firmware_p4/components/Applications/doom/net_sdl.h create mode 100644 firmware_p4/components/Applications/doom/net_server.h create mode 100644 firmware_p4/components/Applications/doom/p_ceilng.c create mode 100644 firmware_p4/components/Applications/doom/p_doors.c create mode 100644 firmware_p4/components/Applications/doom/p_enemy.c create mode 100644 firmware_p4/components/Applications/doom/p_floor.c create mode 100644 firmware_p4/components/Applications/doom/p_inter.c create mode 100644 firmware_p4/components/Applications/doom/p_inter.h create mode 100644 firmware_p4/components/Applications/doom/p_lights.c create mode 100644 firmware_p4/components/Applications/doom/p_local.h create mode 100644 firmware_p4/components/Applications/doom/p_map.c create mode 100644 firmware_p4/components/Applications/doom/p_maputl.c create mode 100644 firmware_p4/components/Applications/doom/p_mobj.c create mode 100644 firmware_p4/components/Applications/doom/p_mobj.h create mode 100644 firmware_p4/components/Applications/doom/p_plats.c create mode 100644 firmware_p4/components/Applications/doom/p_pspr.c create mode 100644 firmware_p4/components/Applications/doom/p_pspr.h create mode 100644 firmware_p4/components/Applications/doom/p_saveg.c create mode 100644 firmware_p4/components/Applications/doom/p_saveg.h create mode 100644 firmware_p4/components/Applications/doom/p_setup.c create mode 100644 firmware_p4/components/Applications/doom/p_setup.h create mode 100644 firmware_p4/components/Applications/doom/p_sight.c create mode 100644 firmware_p4/components/Applications/doom/p_spec.c create mode 100644 firmware_p4/components/Applications/doom/p_spec.h create mode 100644 firmware_p4/components/Applications/doom/p_switch.c create mode 100644 firmware_p4/components/Applications/doom/p_telept.c create mode 100644 firmware_p4/components/Applications/doom/p_tick.c create mode 100644 firmware_p4/components/Applications/doom/p_tick.h create mode 100644 firmware_p4/components/Applications/doom/p_user.c create mode 100644 firmware_p4/components/Applications/doom/r_bsp.c create mode 100644 firmware_p4/components/Applications/doom/r_bsp.h create mode 100644 firmware_p4/components/Applications/doom/r_data.c create mode 100644 firmware_p4/components/Applications/doom/r_data.h create mode 100644 firmware_p4/components/Applications/doom/r_defs.h create mode 100644 firmware_p4/components/Applications/doom/r_draw.c create mode 100644 firmware_p4/components/Applications/doom/r_draw.h create mode 100644 firmware_p4/components/Applications/doom/r_local.h create mode 100644 firmware_p4/components/Applications/doom/r_main.c create mode 100644 firmware_p4/components/Applications/doom/r_main.h create mode 100644 firmware_p4/components/Applications/doom/r_plane.c create mode 100644 firmware_p4/components/Applications/doom/r_plane.h create mode 100644 firmware_p4/components/Applications/doom/r_segs.c create mode 100644 firmware_p4/components/Applications/doom/r_segs.h create mode 100644 firmware_p4/components/Applications/doom/r_sky.c create mode 100644 firmware_p4/components/Applications/doom/r_sky.h create mode 100644 firmware_p4/components/Applications/doom/r_state.h create mode 100644 firmware_p4/components/Applications/doom/r_things.c create mode 100644 firmware_p4/components/Applications/doom/r_things.h create mode 100644 firmware_p4/components/Applications/doom/s_sound.c create mode 100644 firmware_p4/components/Applications/doom/s_sound.h create mode 100644 firmware_p4/components/Applications/doom/sha1.c create mode 100644 firmware_p4/components/Applications/doom/sha1.h create mode 100644 firmware_p4/components/Applications/doom/sounds.c create mode 100644 firmware_p4/components/Applications/doom/sounds.h create mode 100644 firmware_p4/components/Applications/doom/st_lib.c create mode 100644 firmware_p4/components/Applications/doom/st_lib.h create mode 100644 firmware_p4/components/Applications/doom/st_stuff.c create mode 100644 firmware_p4/components/Applications/doom/st_stuff.h create mode 100644 firmware_p4/components/Applications/doom/statdump.c create mode 100644 firmware_p4/components/Applications/doom/statdump.h create mode 100644 firmware_p4/components/Applications/doom/tables.c create mode 100644 firmware_p4/components/Applications/doom/tables.h create mode 100644 firmware_p4/components/Applications/doom/v_patch.h create mode 100644 firmware_p4/components/Applications/doom/v_video.c create mode 100644 firmware_p4/components/Applications/doom/v_video.h create mode 100644 firmware_p4/components/Applications/doom/w_checksum.c create mode 100644 firmware_p4/components/Applications/doom/w_checksum.h create mode 100644 firmware_p4/components/Applications/doom/w_file.c create mode 100644 firmware_p4/components/Applications/doom/w_file.h create mode 100644 firmware_p4/components/Applications/doom/w_file_stdc.c create mode 100644 firmware_p4/components/Applications/doom/w_main.c create mode 100644 firmware_p4/components/Applications/doom/w_main.h create mode 100644 firmware_p4/components/Applications/doom/w_merge.h create mode 100644 firmware_p4/components/Applications/doom/w_wad.c create mode 100644 firmware_p4/components/Applications/doom/w_wad.h create mode 100644 firmware_p4/components/Applications/doom/wi_stuff.c create mode 100644 firmware_p4/components/Applications/doom/wi_stuff.h create mode 100644 firmware_p4/components/Applications/doom/z_zone.c create mode 100644 firmware_p4/components/Applications/doom/z_zone.h diff --git a/firmware_p4/CMakeLists.txt b/firmware_p4/CMakeLists.txt index fb272b7ae..68ad194c1 100644 --- a/firmware_p4/CMakeLists.txt +++ b/firmware_p4/CMakeLists.txt @@ -8,7 +8,9 @@ cmake_minimum_required(VERSION 3.16) set(CMAKE_EXPORT_COMPILE_COMMANDS ON) set(IDF_TARGET "esp32p4") -set(EXTRA_COMPONENT_DIRS "${CMAKE_CURRENT_LIST_DIR}/components/Applications/gameboy") +set(EXTRA_COMPONENT_DIRS + "${CMAKE_CURRENT_LIST_DIR}/components/Applications/gameboy" + "${CMAKE_CURRENT_LIST_DIR}/components/Applications/doom") include($ENV{IDF_PATH}/tools/cmake/project.cmake) diff --git a/firmware_p4/components/Applications/doom/CMakeLists.txt b/firmware_p4/components/Applications/doom/CMakeLists.txt new file mode 100644 index 000000000..39b6b4e47 --- /dev/null +++ b/firmware_p4/components/Applications/doom/CMakeLists.txt @@ -0,0 +1,23 @@ +# Official DOOM (doomgeneric) as an ESP-IDF component for the HighBoy P4. +# All engine sources + doomgeneric.c + the HighBoy platform layer compile here. +file(GLOB DOOM_SRCS "*.c") + +idf_component_register( + SRCS ${DOOM_SRCS} + INCLUDE_DIRS "include" # public: only doom_highboy.h (launcher entry) + PRIV_INCLUDE_DIRS "." # private: doomgeneric internal headers (config.h, etc.) + REQUIRES Drivers Service esp_lcd esp_timer esp_system driver + LDFRAGMENTS "linker.lf" # park DOOM's ~300 KB static .bss in PSRAM +) + +# Render at DOOM's native internal resolution (no upscale). ALL sources must +# agree, so define it component-wide. +target_compile_definitions(${COMPONENT_LIB} PRIVATE + DOOMGENERIC_RESX=320 + DOOMGENERIC_RESY=200 + FEATURE_SOUND=1 # enable SFX (DG_sound_module in doom_sound_highboy.c) +) + +# Legacy id-Software C: silence its many warnings and optimize for framerate +# (the project default is -Og; DOOM needs -O2 to be playable). +target_compile_options(${COMPONENT_LIB} PRIVATE -O2 -w) diff --git a/firmware_p4/components/Applications/doom/am_map.c b/firmware_p4/components/Applications/doom/am_map.c new file mode 100644 index 000000000..d3d504e32 --- /dev/null +++ b/firmware_p4/components/Applications/doom/am_map.c @@ -0,0 +1,1355 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// +// DESCRIPTION: the automap code +// + + +#include + +#include "deh_main.h" + +#include "z_zone.h" +#include "doomkeys.h" +#include "doomdef.h" +#include "st_stuff.h" +#include "p_local.h" +#include "w_wad.h" + +#include "m_cheat.h" +#include "m_controls.h" +#include "m_misc.h" +#include "i_system.h" + +// Needs access to LFB. +#include "v_video.h" + +// State. +#include "doomstat.h" +#include "r_state.h" + +// Data. +#include "dstrings.h" + +#include "am_map.h" + + +// For use if I do walls with outsides/insides +#define REDS (256-5*16) +#define REDRANGE 16 +#define BLUES (256-4*16+8) +#define BLUERANGE 8 +#define GREENS (7*16) +#define GREENRANGE 16 +#define GRAYS (6*16) +#define GRAYSRANGE 16 +#define BROWNS (4*16) +#define BROWNRANGE 16 +#define YELLOWS (256-32+7) +#define YELLOWRANGE 1 +#define BLACK 0 +#define WHITE (256-47) + +// Automap colors +#define BACKGROUND BLACK +#define YOURCOLORS WHITE +#define YOURRANGE 0 +#define WALLCOLORS REDS +#define WALLRANGE REDRANGE +#define TSWALLCOLORS GRAYS +#define TSWALLRANGE GRAYSRANGE +#define FDWALLCOLORS BROWNS +#define FDWALLRANGE BROWNRANGE +#define CDWALLCOLORS YELLOWS +#define CDWALLRANGE YELLOWRANGE +#define THINGCOLORS GREENS +#define THINGRANGE GREENRANGE +#define SECRETWALLCOLORS WALLCOLORS +#define SECRETWALLRANGE WALLRANGE +#define GRIDCOLORS (GRAYS + GRAYSRANGE/2) +#define GRIDRANGE 0 +#define XHAIRCOLORS GRAYS + +// drawing stuff + +#define AM_NUMMARKPOINTS 10 + +// scale on entry +#define INITSCALEMTOF (.2*FRACUNIT) +// how much the automap moves window per tic in frame-buffer coordinates +// moves 140 pixels in 1 second +#define F_PANINC 4 +// how much zoom-in per tic +// goes to 2x in 1 second +#define M_ZOOMIN ((int) (1.02*FRACUNIT)) +// how much zoom-out per tic +// pulls out to 0.5x in 1 second +#define M_ZOOMOUT ((int) (FRACUNIT/1.02)) + +// translates between frame-buffer and map distances +#define FTOM(x) FixedMul(((x)<<16),scale_ftom) +#define MTOF(x) (FixedMul((x),scale_mtof)>>16) +// translates between frame-buffer and map coordinates +#define CXMTOF(x) (f_x + MTOF((x)-m_x)) +#define CYMTOF(y) (f_y + (f_h - MTOF((y)-m_y))) + +// the following is crap +#define LINE_NEVERSEE ML_DONTDRAW + +typedef struct +{ + int x, y; +} fpoint_t; + +typedef struct +{ + fpoint_t a, b; +} fline_t; + +typedef struct +{ + fixed_t x,y; +} mpoint_t; + +typedef struct +{ + mpoint_t a, b; +} mline_t; + +typedef struct +{ + fixed_t slp, islp; +} islope_t; + + + +// +// The vector graphics for the automap. +// A line drawing of the player pointing right, +// starting from the middle. +// +#define R ((8*PLAYERRADIUS)/7) +mline_t player_arrow[] = { + { { -R+R/8, 0 }, { R, 0 } }, // ----- + { { R, 0 }, { R-R/2, R/4 } }, // -----> + { { R, 0 }, { R-R/2, -R/4 } }, + { { -R+R/8, 0 }, { -R-R/8, R/4 } }, // >----> + { { -R+R/8, 0 }, { -R-R/8, -R/4 } }, + { { -R+3*R/8, 0 }, { -R+R/8, R/4 } }, // >>---> + { { -R+3*R/8, 0 }, { -R+R/8, -R/4 } } +}; +#undef R + +#define R ((8*PLAYERRADIUS)/7) +mline_t cheat_player_arrow[] = { + { { -R+R/8, 0 }, { R, 0 } }, // ----- + { { R, 0 }, { R-R/2, R/6 } }, // -----> + { { R, 0 }, { R-R/2, -R/6 } }, + { { -R+R/8, 0 }, { -R-R/8, R/6 } }, // >-----> + { { -R+R/8, 0 }, { -R-R/8, -R/6 } }, + { { -R+3*R/8, 0 }, { -R+R/8, R/6 } }, // >>-----> + { { -R+3*R/8, 0 }, { -R+R/8, -R/6 } }, + { { -R/2, 0 }, { -R/2, -R/6 } }, // >>-d---> + { { -R/2, -R/6 }, { -R/2+R/6, -R/6 } }, + { { -R/2+R/6, -R/6 }, { -R/2+R/6, R/4 } }, + { { -R/6, 0 }, { -R/6, -R/6 } }, // >>-dd--> + { { -R/6, -R/6 }, { 0, -R/6 } }, + { { 0, -R/6 }, { 0, R/4 } }, + { { R/6, R/4 }, { R/6, -R/7 } }, // >>-ddt-> + { { R/6, -R/7 }, { R/6+R/32, -R/7-R/32 } }, + { { R/6+R/32, -R/7-R/32 }, { R/6+R/10, -R/7 } } +}; +#undef R + +#define R (FRACUNIT) +mline_t triangle_guy[] = { + { { (fixed_t)(-.867*R), (fixed_t)(-.5*R) }, { (fixed_t)(.867*R ), (fixed_t)(-.5*R) } }, + { { (fixed_t)(.867*R ), (fixed_t)(-.5*R) }, { (fixed_t)(0 ), (fixed_t)(R ) } }, + { { (fixed_t)(0 ), (fixed_t)(R ) }, { (fixed_t)(-.867*R), (fixed_t)(-.5*R) } } +}; +#undef R + +#define R (FRACUNIT) +mline_t thintriangle_guy[] = { + { { (fixed_t)(-.5*R), (fixed_t)(-.7*R) }, { (fixed_t)(R ), (fixed_t)(0 ) } }, + { { (fixed_t)(R ), (fixed_t)(0 ) }, { (fixed_t)(-.5*R), (fixed_t)(.7*R ) } }, + { { (fixed_t)(-.5*R), (fixed_t)(.7*R ) }, { (fixed_t)(-.5*R), (fixed_t)(-.7*R) } } +}; +#undef R + + + + +static int cheating = 0; +static int grid = 0; + +static int leveljuststarted = 1; // kluge until AM_LevelInit() is called + +boolean automapactive = false; +static int finit_width = SCREENWIDTH; +static int finit_height = SCREENHEIGHT - 32; + +// location of window on screen +static int f_x; +static int f_y; + +// size of window on screen +static int f_w; +static int f_h; + +static int lightlev; // used for funky strobing effect +static byte* fb; // pseudo-frame buffer +static int amclock; + +static mpoint_t m_paninc; // how far the window pans each tic (map coords) +static fixed_t mtof_zoommul; // how far the window zooms in each tic (map coords) +static fixed_t ftom_zoommul; // how far the window zooms in each tic (fb coords) + +static fixed_t m_x, m_y; // LL x,y where the window is on the map (map coords) +static fixed_t m_x2, m_y2; // UR x,y where the window is on the map (map coords) + +// +// width/height of window on map (map coords) +// +static fixed_t m_w; +static fixed_t m_h; + +// based on level size +static fixed_t min_x; +static fixed_t min_y; +static fixed_t max_x; +static fixed_t max_y; + +static fixed_t max_w; // max_x-min_x, +static fixed_t max_h; // max_y-min_y + +// based on player size +static fixed_t min_w; +static fixed_t min_h; + + +static fixed_t min_scale_mtof; // used to tell when to stop zooming out +static fixed_t max_scale_mtof; // used to tell when to stop zooming in + +// old stuff for recovery later +static fixed_t old_m_w, old_m_h; +static fixed_t old_m_x, old_m_y; + +// old location used by the Follower routine +static mpoint_t f_oldloc; + +// used by MTOF to scale from map-to-frame-buffer coords +static fixed_t scale_mtof = (fixed_t)INITSCALEMTOF; +// used by FTOM to scale from frame-buffer-to-map coords (=1/scale_mtof) +static fixed_t scale_ftom; + +static player_t *plr; // the player represented by an arrow + +static patch_t *marknums[10]; // numbers used for marking by the automap +static mpoint_t markpoints[AM_NUMMARKPOINTS]; // where the points are +static int markpointnum = 0; // next point to be assigned + +static int followplayer = 1; // specifies whether to follow the player around + +cheatseq_t cheat_amap = CHEAT("iddt", 0); + +static boolean stopped = true; + +// Calculates the slope and slope according to the x-axis of a line +// segment in map coordinates (with the upright y-axis n' all) so +// that it can be used with the brain-dead drawing stuff. + +void +AM_getIslope +( mline_t* ml, + islope_t* is ) +{ + int dx, dy; + + dy = ml->a.y - ml->b.y; + dx = ml->b.x - ml->a.x; + if (!dy) is->islp = (dx<0?-INT_MAX:INT_MAX); + else is->islp = FixedDiv(dx, dy); + if (!dx) is->slp = (dy<0?-INT_MAX:INT_MAX); + else is->slp = FixedDiv(dy, dx); + +} + +// +// +// +void AM_activateNewScale(void) +{ + m_x += m_w/2; + m_y += m_h/2; + m_w = FTOM(f_w); + m_h = FTOM(f_h); + m_x -= m_w/2; + m_y -= m_h/2; + m_x2 = m_x + m_w; + m_y2 = m_y + m_h; +} + +// +// +// +void AM_saveScaleAndLoc(void) +{ + old_m_x = m_x; + old_m_y = m_y; + old_m_w = m_w; + old_m_h = m_h; +} + +// +// +// +void AM_restoreScaleAndLoc(void) +{ + + m_w = old_m_w; + m_h = old_m_h; + if (!followplayer) + { + m_x = old_m_x; + m_y = old_m_y; + } else { + m_x = plr->mo->x - m_w/2; + m_y = plr->mo->y - m_h/2; + } + m_x2 = m_x + m_w; + m_y2 = m_y + m_h; + + // Change the scaling multipliers + scale_mtof = FixedDiv(f_w< max_x) + max_x = vertexes[i].x; + + if (vertexes[i].y < min_y) + min_y = vertexes[i].y; + else if (vertexes[i].y > max_y) + max_y = vertexes[i].y; + } + + max_w = max_x - min_x; + max_h = max_y - min_y; + + min_w = 2*PLAYERRADIUS; // const? never changed? + min_h = 2*PLAYERRADIUS; + + a = FixedDiv(f_w< max_x) + m_x = max_x - m_w/2; + else if (m_x + m_w/2 < min_x) + m_x = min_x - m_w/2; + + if (m_y + m_h/2 > max_y) + m_y = max_y - m_h/2; + else if (m_y + m_h/2 < min_y) + m_y = min_y - m_h/2; + + m_x2 = m_x + m_w; + m_y2 = m_y + m_h; +} + + +// +// +// +void AM_initVariables(void) +{ + int pnum; + static event_t st_notify = { ev_keyup, AM_MSGENTERED, 0, 0 }; + + automapactive = true; + fb = I_VideoBuffer; + + f_oldloc.x = INT_MAX; + amclock = 0; + lightlev = 0; + + m_paninc.x = m_paninc.y = 0; + ftom_zoommul = FRACUNIT; + mtof_zoommul = FRACUNIT; + + m_w = FTOM(f_w); + m_h = FTOM(f_h); + + // find player to center on initially + if (playeringame[consoleplayer]) + { + plr = &players[consoleplayer]; + } + else + { + plr = &players[0]; + + for (pnum=0;pnummo->x - m_w/2; + m_y = plr->mo->y - m_h/2; + AM_changeWindowLoc(); + + // for saving & restoring + old_m_x = m_x; + old_m_y = m_y; + old_m_w = m_w; + old_m_h = m_h; + + // inform the status bar of the change + ST_Responder(&st_notify); + +} + +// +// +// +void AM_loadPics(void) +{ + int i; + char namebuf[9]; + + for (i=0;i<10;i++) + { + DEH_snprintf(namebuf, 9, "AMMNUM%d", i); + marknums[i] = W_CacheLumpName(namebuf, PU_STATIC); + } + +} + +void AM_unloadPics(void) +{ + int i; + char namebuf[9]; + + for (i=0;i<10;i++) + { + DEH_snprintf(namebuf, 9, "AMMNUM%d", i); + W_ReleaseLumpName(namebuf); + } +} + +void AM_clearMarks(void) +{ + int i; + + for (i=0;i max_scale_mtof) + scale_mtof = min_scale_mtof; + scale_ftom = FixedDiv(FRACUNIT, scale_mtof); +} + + + + +// +// +// +void AM_Stop (void) +{ + static event_t st_notify = { 0, ev_keyup, AM_MSGEXITED, 0 }; + + AM_unloadPics(); + automapactive = false; + ST_Responder(&st_notify); + stopped = true; +} + +// +// +// +void AM_Start (void) +{ + static int lastlevel = -1, lastepisode = -1; + + if (!stopped) AM_Stop(); + stopped = false; + if (lastlevel != gamemap || lastepisode != gameepisode) + { + AM_LevelInit(); + lastlevel = gamemap; + lastepisode = gameepisode; + } + AM_initVariables(); + AM_loadPics(); +} + +// +// set the window scale to the maximum size +// +void AM_minOutWindowScale(void) +{ + scale_mtof = min_scale_mtof; + scale_ftom = FixedDiv(FRACUNIT, scale_mtof); + AM_activateNewScale(); +} + +// +// set the window scale to the minimum size +// +void AM_maxOutWindowScale(void) +{ + scale_mtof = max_scale_mtof; + scale_ftom = FixedDiv(FRACUNIT, scale_mtof); + AM_activateNewScale(); +} + + +// +// Handle events (user inputs) in automap mode +// +boolean +AM_Responder +( event_t* ev ) +{ + + int rc; + static int bigstate=0; + static char buffer[20]; + int key; + + rc = false; + + if (!automapactive) + { + if (ev->type == ev_keydown && ev->data1 == key_map_toggle) + { + AM_Start (); + viewactive = false; + rc = true; + } + } + else if (ev->type == ev_keydown) + { + rc = true; + key = ev->data1; + + if (key == key_map_east) // pan right + { + if (!followplayer) m_paninc.x = FTOM(F_PANINC); + else rc = false; + } + else if (key == key_map_west) // pan left + { + if (!followplayer) m_paninc.x = -FTOM(F_PANINC); + else rc = false; + } + else if (key == key_map_north) // pan up + { + if (!followplayer) m_paninc.y = FTOM(F_PANINC); + else rc = false; + } + else if (key == key_map_south) // pan down + { + if (!followplayer) m_paninc.y = -FTOM(F_PANINC); + else rc = false; + } + else if (key == key_map_zoomout) // zoom out + { + mtof_zoommul = M_ZOOMOUT; + ftom_zoommul = M_ZOOMIN; + } + else if (key == key_map_zoomin) // zoom in + { + mtof_zoommul = M_ZOOMIN; + ftom_zoommul = M_ZOOMOUT; + } + else if (key == key_map_toggle) + { + bigstate = 0; + viewactive = true; + AM_Stop (); + } + else if (key == key_map_maxzoom) + { + bigstate = !bigstate; + if (bigstate) + { + AM_saveScaleAndLoc(); + AM_minOutWindowScale(); + } + else AM_restoreScaleAndLoc(); + } + else if (key == key_map_follow) + { + followplayer = !followplayer; + f_oldloc.x = INT_MAX; + if (followplayer) + plr->message = DEH_String(AMSTR_FOLLOWON); + else + plr->message = DEH_String(AMSTR_FOLLOWOFF); + } + else if (key == key_map_grid) + { + grid = !grid; + if (grid) + plr->message = DEH_String(AMSTR_GRIDON); + else + plr->message = DEH_String(AMSTR_GRIDOFF); + } + else if (key == key_map_mark) + { + M_snprintf(buffer, sizeof(buffer), "%s %d", + DEH_String(AMSTR_MARKEDSPOT), markpointnum); + plr->message = buffer; + AM_addMark(); + } + else if (key == key_map_clearmark) + { + AM_clearMarks(); + plr->message = DEH_String(AMSTR_MARKSCLEARED); + } + else + { + rc = false; + } + + if (!deathmatch && cht_CheckCheat(&cheat_amap, ev->data2)) + { + rc = false; + cheating = (cheating+1) % 3; + } + } + else if (ev->type == ev_keyup) + { + rc = false; + key = ev->data1; + + if (key == key_map_east) + { + if (!followplayer) m_paninc.x = 0; + } + else if (key == key_map_west) + { + if (!followplayer) m_paninc.x = 0; + } + else if (key == key_map_north) + { + if (!followplayer) m_paninc.y = 0; + } + else if (key == key_map_south) + { + if (!followplayer) m_paninc.y = 0; + } + else if (key == key_map_zoomout || key == key_map_zoomin) + { + mtof_zoommul = FRACUNIT; + ftom_zoommul = FRACUNIT; + } + } + + return rc; + +} + + +// +// Zooming +// +void AM_changeWindowScale(void) +{ + + // Change the scaling multipliers + scale_mtof = FixedMul(scale_mtof, mtof_zoommul); + scale_ftom = FixedDiv(FRACUNIT, scale_mtof); + + if (scale_mtof < min_scale_mtof) + AM_minOutWindowScale(); + else if (scale_mtof > max_scale_mtof) + AM_maxOutWindowScale(); + else + AM_activateNewScale(); +} + + +// +// +// +void AM_doFollowPlayer(void) +{ + + if (f_oldloc.x != plr->mo->x || f_oldloc.y != plr->mo->y) + { + m_x = FTOM(MTOF(plr->mo->x)) - m_w/2; + m_y = FTOM(MTOF(plr->mo->y)) - m_h/2; + m_x2 = m_x + m_w; + m_y2 = m_y + m_h; + f_oldloc.x = plr->mo->x; + f_oldloc.y = plr->mo->y; + + // m_x = FTOM(MTOF(plr->mo->x - m_w/2)); + // m_y = FTOM(MTOF(plr->mo->y - m_h/2)); + // m_x = plr->mo->x - m_w/2; + // m_y = plr->mo->y - m_h/2; + + } + +} + +// +// +// +void AM_updateLightLev(void) +{ + static int nexttic = 0; + //static int litelevels[] = { 0, 3, 5, 6, 6, 7, 7, 7 }; + static int litelevels[] = { 0, 4, 7, 10, 12, 14, 15, 15 }; + static int litelevelscnt = 0; + + // Change light level + if (amclock>nexttic) + { + lightlev = litelevels[litelevelscnt++]; + if (litelevelscnt == arrlen(litelevels)) litelevelscnt = 0; + nexttic = amclock + 6 - (amclock % 6); + } + +} + + +// +// Updates on Game Tick +// +void AM_Ticker (void) +{ + + if (!automapactive) + return; + + amclock++; + + if (followplayer) + AM_doFollowPlayer(); + + // Change the zoom if necessary + if (ftom_zoommul != FRACUNIT) + AM_changeWindowScale(); + + // Change x,y location + if (m_paninc.x || m_paninc.y) + AM_changeWindowLoc(); + + // Update light level + // AM_updateLightLev(); + +} + + +// +// Clear automap frame buffer. +// +void AM_clearFB(int color) +{ + memset(fb, color, f_w*f_h); +} + + +// +// Automap clipping of lines. +// +// Based on Cohen-Sutherland clipping algorithm but with a slightly +// faster reject and precalculated slopes. If the speed is needed, +// use a hash algorithm to handle the common cases. +// +boolean +AM_clipMline +( mline_t* ml, + fline_t* fl ) +{ + enum + { + LEFT =1, + RIGHT =2, + BOTTOM =4, + TOP =8 + }; + + register int outcode1 = 0; + register int outcode2 = 0; + register int outside; + + fpoint_t tmp; + int dx; + int dy; + + +#define DOOUTCODE(oc, mx, my) \ + (oc) = 0; \ + if ((my) < 0) (oc) |= TOP; \ + else if ((my) >= f_h) (oc) |= BOTTOM; \ + if ((mx) < 0) (oc) |= LEFT; \ + else if ((mx) >= f_w) (oc) |= RIGHT; + + + // do trivial rejects and outcodes + if (ml->a.y > m_y2) + outcode1 = TOP; + else if (ml->a.y < m_y) + outcode1 = BOTTOM; + + if (ml->b.y > m_y2) + outcode2 = TOP; + else if (ml->b.y < m_y) + outcode2 = BOTTOM; + + if (outcode1 & outcode2) + return false; // trivially outside + + if (ml->a.x < m_x) + outcode1 |= LEFT; + else if (ml->a.x > m_x2) + outcode1 |= RIGHT; + + if (ml->b.x < m_x) + outcode2 |= LEFT; + else if (ml->b.x > m_x2) + outcode2 |= RIGHT; + + if (outcode1 & outcode2) + return false; // trivially outside + + // transform to frame-buffer coordinates. + fl->a.x = CXMTOF(ml->a.x); + fl->a.y = CYMTOF(ml->a.y); + fl->b.x = CXMTOF(ml->b.x); + fl->b.y = CYMTOF(ml->b.y); + + DOOUTCODE(outcode1, fl->a.x, fl->a.y); + DOOUTCODE(outcode2, fl->b.x, fl->b.y); + + if (outcode1 & outcode2) + return false; + + while (outcode1 | outcode2) + { + // may be partially inside box + // find an outside point + if (outcode1) + outside = outcode1; + else + outside = outcode2; + + // clip to each side + if (outside & TOP) + { + dy = fl->a.y - fl->b.y; + dx = fl->b.x - fl->a.x; + tmp.x = fl->a.x + (dx*(fl->a.y))/dy; + tmp.y = 0; + } + else if (outside & BOTTOM) + { + dy = fl->a.y - fl->b.y; + dx = fl->b.x - fl->a.x; + tmp.x = fl->a.x + (dx*(fl->a.y-f_h))/dy; + tmp.y = f_h-1; + } + else if (outside & RIGHT) + { + dy = fl->b.y - fl->a.y; + dx = fl->b.x - fl->a.x; + tmp.y = fl->a.y + (dy*(f_w-1 - fl->a.x))/dx; + tmp.x = f_w-1; + } + else if (outside & LEFT) + { + dy = fl->b.y - fl->a.y; + dx = fl->b.x - fl->a.x; + tmp.y = fl->a.y + (dy*(-fl->a.x))/dx; + tmp.x = 0; + } + else + { + tmp.x = 0; + tmp.y = 0; + } + + if (outside == outcode1) + { + fl->a = tmp; + DOOUTCODE(outcode1, fl->a.x, fl->a.y); + } + else + { + fl->b = tmp; + DOOUTCODE(outcode2, fl->b.x, fl->b.y); + } + + if (outcode1 & outcode2) + return false; // trivially outside + } + + return true; +} +#undef DOOUTCODE + + +// +// Classic Bresenham w/ whatever optimizations needed for speed +// +void +AM_drawFline +( fline_t* fl, + int color ) +{ + register int x; + register int y; + register int dx; + register int dy; + register int sx; + register int sy; + register int ax; + register int ay; + register int d; + + static int fuck = 0; + + // For debugging only + if ( fl->a.x < 0 || fl->a.x >= f_w + || fl->a.y < 0 || fl->a.y >= f_h + || fl->b.x < 0 || fl->b.x >= f_w + || fl->b.y < 0 || fl->b.y >= f_h) + { + DEH_fprintf(stderr, "fuck %d \r", fuck++); + return; + } + +#define PUTDOT(xx,yy,cc) fb[(yy)*f_w+(xx)]=(cc) + + dx = fl->b.x - fl->a.x; + ax = 2 * (dx<0 ? -dx : dx); + sx = dx<0 ? -1 : 1; + + dy = fl->b.y - fl->a.y; + ay = 2 * (dy<0 ? -dy : dy); + sy = dy<0 ? -1 : 1; + + x = fl->a.x; + y = fl->a.y; + + if (ax > ay) + { + d = ay - ax/2; + while (1) + { + PUTDOT(x,y,color); + if (x == fl->b.x) return; + if (d>=0) + { + y += sy; + d -= ax; + } + x += sx; + d += ay; + } + } + else + { + d = ax - ay/2; + while (1) + { + PUTDOT(x, y, color); + if (y == fl->b.y) return; + if (d >= 0) + { + x += sx; + d -= ay; + } + y += sy; + d += ax; + } + } +} + + +// +// Clip lines, draw visible part sof lines. +// +void +AM_drawMline +( mline_t* ml, + int color ) +{ + static fline_t fl; + + if (AM_clipMline(ml, &fl)) + AM_drawFline(&fl, color); // draws it on frame buffer using fb coords +} + + + +// +// Draws flat (floor/ceiling tile) aligned grid lines. +// +void AM_drawGrid(int color) +{ + fixed_t x, y; + fixed_t start, end; + mline_t ml; + + // Figure out start of vertical gridlines + start = m_x; + if ((start-bmaporgx)%(MAPBLOCKUNITS<x; + l.a.y = lines[i].v1->y; + l.b.x = lines[i].v2->x; + l.b.y = lines[i].v2->y; + if (cheating || (lines[i].flags & ML_MAPPED)) + { + if ((lines[i].flags & LINE_NEVERSEE) && !cheating) + continue; + if (!lines[i].backsector) + { + AM_drawMline(&l, WALLCOLORS+lightlev); + } + else + { + if (lines[i].special == 39) + { // teleporters + AM_drawMline(&l, WALLCOLORS+WALLRANGE/2); + } + else if (lines[i].flags & ML_SECRET) // secret door + { + if (cheating) AM_drawMline(&l, SECRETWALLCOLORS + lightlev); + else AM_drawMline(&l, WALLCOLORS+lightlev); + } + else if (lines[i].backsector->floorheight + != lines[i].frontsector->floorheight) { + AM_drawMline(&l, FDWALLCOLORS + lightlev); // floor level change + } + else if (lines[i].backsector->ceilingheight + != lines[i].frontsector->ceilingheight) { + AM_drawMline(&l, CDWALLCOLORS+lightlev); // ceiling level change + } + else if (cheating) { + AM_drawMline(&l, TSWALLCOLORS+lightlev); + } + } + } + else if (plr->powers[pw_allmap]) + { + if (!(lines[i].flags & LINE_NEVERSEE)) AM_drawMline(&l, GRAYS+3); + } + } +} + + +// +// Rotation in 2D. +// Used to rotate player arrow line character. +// +void +AM_rotate +( fixed_t* x, + fixed_t* y, + angle_t a ) +{ + fixed_t tmpx; + + tmpx = + FixedMul(*x,finecosine[a>>ANGLETOFINESHIFT]) + - FixedMul(*y,finesine[a>>ANGLETOFINESHIFT]); + + *y = + FixedMul(*x,finesine[a>>ANGLETOFINESHIFT]) + + FixedMul(*y,finecosine[a>>ANGLETOFINESHIFT]); + + *x = tmpx; +} + +void +AM_drawLineCharacter +( mline_t* lineguy, + int lineguylines, + fixed_t scale, + angle_t angle, + int color, + fixed_t x, + fixed_t y ) +{ + int i; + mline_t l; + + for (i=0;imo->angle, WHITE, plr->mo->x, plr->mo->y); + else + AM_drawLineCharacter + (player_arrow, arrlen(player_arrow), 0, plr->mo->angle, + WHITE, plr->mo->x, plr->mo->y); + return; + } + + for (i=0;ipowers[pw_invisibility]) + color = 246; // *close* to black + else + color = their_colors[their_color]; + + AM_drawLineCharacter + (player_arrow, arrlen(player_arrow), 0, p->mo->angle, + color, p->mo->x, p->mo->y); + } + +} + +void +AM_drawThings +( int colors, + int colorrange) +{ + int i; + mobj_t* t; + + for (i=0;iangle, colors+lightlev, t->x, t->y); + t = t->snext; + } + } +} + +void AM_drawMarks(void) +{ + int i, fx, fy, w, h; + + for (i=0;iwidth); + // h = SHORT(marknums[i]->height); + w = 5; // because something's wrong with the wad, i guess + h = 6; // because something's wrong with the wad, i guess + fx = CXMTOF(markpoints[i].x); + fy = CYMTOF(markpoints[i].y); + if (fx >= f_x && fx <= f_w - w && fy >= f_y && fy <= f_h - h) + V_DrawPatch(fx, fy, marknums[i]); + } + } + +} + +void AM_drawCrosshair(int color) +{ + fb[(f_w*(f_h+1))/2] = color; // single point for now + +} + +void AM_Drawer (void) +{ + if (!automapactive) return; + + AM_clearFB(BACKGROUND); + if (grid) + AM_drawGrid(GRIDCOLORS); + AM_drawWalls(); + AM_drawPlayers(); + if (cheating==2) + AM_drawThings(THINGCOLORS, THINGRANGE); + AM_drawCrosshair(XHAIRCOLORS); + + AM_drawMarks(); + + V_MarkRect(f_x, f_y, f_w, f_h); + +} diff --git a/firmware_p4/components/Applications/doom/am_map.h b/firmware_p4/components/Applications/doom/am_map.h new file mode 100644 index 000000000..572d2389b --- /dev/null +++ b/firmware_p4/components/Applications/doom/am_map.h @@ -0,0 +1,49 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// AutoMap module. +// + +#ifndef __AMMAP_H__ +#define __AMMAP_H__ + +#include "d_event.h" +#include "m_cheat.h" + +// Used by ST StatusBar stuff. +#define AM_MSGHEADER (('a'<<24)+('m'<<16)) +#define AM_MSGENTERED (AM_MSGHEADER | ('e'<<8)) +#define AM_MSGEXITED (AM_MSGHEADER | ('x'<<8)) + + +// Called by main loop. +boolean AM_Responder (event_t* ev); + +// Called by main loop. +void AM_Ticker (void); + +// Called by main loop, +// called instead of view drawer if automap active. +void AM_Drawer (void); + +// Called to force the automap to quit +// if the level is completed while it is up. +void AM_Stop (void); + + +extern cheatseq_t cheat_amap; + + +#endif diff --git a/firmware_p4/components/Applications/doom/config.h b/firmware_p4/components/Applications/doom/config.h new file mode 100644 index 000000000..7e05102e0 --- /dev/null +++ b/firmware_p4/components/Applications/doom/config.h @@ -0,0 +1,100 @@ +/* config.hin. Generated from configure.ac by autoheader. */ + +/* Define to 1 if you have the header file. */ +#undef HAVE_DEV_ISA_SPKRIO_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_DEV_SPEAKER_SPEAKER_H + +/* Define to 1 if you have the header file. */ +#define HAVE_INTTYPES_H 1 + +/* Define to 1 if you have the `ioperm' function. */ +#undef HAVE_IOPERM + +/* Define to 1 if you have the `amd64' library (-lamd64). */ +#undef HAVE_LIBAMD64 + +/* Define to 1 if you have the `i386' library (-li386). */ +#undef HAVE_LIBI386 + +/* Define to 1 if you have the `m' library (-lm). */ +#undef HAVE_LIBM + +/* Define to 1 if you have the `png' library (-lpng). */ +#undef HAVE_LIBPNG + +/* Define to 1 if you have the `samplerate' library (-lsamplerate). */ +#undef HAVE_LIBSAMPLERATE + +/* Define to 1 if you have the `z' library (-lz). */ +#undef HAVE_LIBZ + +/* Define to 1 if you have the header file. */ +#undef HAVE_LINUX_KD_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Define to 1 if you have the `mmap' function. */ +#undef HAVE_MMAP + +/* Define to 1 if you have the `sched_setaffinity' function. */ +#undef HAVE_SCHED_SETAFFINITY + +/* Define to 1 if you have the header file. */ +#define HAVE_STDINT_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STDLIB_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRINGS_H 1 + +/* Define to 1 if you have the header file. */ +#define HAVE_STRING_H 1 + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#define HAVE_SYS_TYPES_H 1 + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Name of package */ +#define PACKAGE "Doom" + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#define PACKAGE_NAME "Doom Generic" + +/* Define to the full name and version of this package. */ +#define PACKAGE_STRING "Doom Generic 0.1" + +/* Define to the one symbol short name of this package. */ +#define PACKAGE_TARNAME "doomgeneric.tar" + +/* Define to the home page for this package. */ +#define PACKAGE_URL "" + +/* Define to the version of this package. */ +#define PACKAGE_VERSION 0.1 + +/* Change this when you create your awesome forked version */ +#define PROGRAM_PREFIX "doomgeneric" + +/* Define to 1 if you have the ANSI C header files. */ +#define STDC_HEADERS 1 + +/* Version number of package */ +#define VERSION 0.1 + +/* Define to 1 if you want to compile the unmodified code */ +#undef ORIGCODE + +/* Define to the directory where all game files are located */ +#define FILES_DIR "." diff --git a/firmware_p4/components/Applications/doom/d_englsh.h b/firmware_p4/components/Applications/doom/d_englsh.h new file mode 100644 index 000000000..cfb05722c --- /dev/null +++ b/firmware_p4/components/Applications/doom/d_englsh.h @@ -0,0 +1,693 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Printed strings for translation. +// English language support (default). +// + +#ifndef __D_ENGLSH__ +#define __D_ENGLSH__ + +// +// Printed strings for translation +// + +// +// D_Main.C +// +#define D_DEVSTR "Development mode ON.\n" +#define D_CDROM "CD-ROM Version: default.cfg from c:\\doomdata\n" + +// +// M_Menu.C +// +#define PRESSKEY "press a key." +#define PRESSYN "press y or n." +#define QUITMSG "are you sure you want to\nquit this great game?" +#define LOADNET "you can't do load while in a net game!\n\n"PRESSKEY +#define QLOADNET "you can't quickload during a netgame!\n\n"PRESSKEY +#define QSAVESPOT "you haven't picked a quicksave slot yet!\n\n"PRESSKEY +#define SAVEDEAD "you can't save if you aren't playing!\n\n"PRESSKEY +#define QSPROMPT "quicksave over your game named\n\n'%s'?\n\n"PRESSYN +#define QLPROMPT "do you want to quickload the game named\n\n'%s'?\n\n"PRESSYN + +#define NEWGAME \ +"you can't start a new game\n"\ +"while in a network game.\n\n"PRESSKEY + +#define NIGHTMARE \ +"are you sure? this skill level\n"\ +"isn't even remotely fair.\n\n"PRESSYN + +#define SWSTRING \ +"this is the shareware version of doom.\n\n"\ +"you need to order the entire trilogy.\n\n"PRESSKEY + +#define MSGOFF "Messages OFF" +#define MSGON "Messages ON" +#define NETEND "you can't end a netgame!\n\n"PRESSKEY +#define ENDGAME "are you sure you want to end the game?\n\n"PRESSYN + +#define DOSY "(press y to quit to dos.)" + +#define DETAILHI "High detail" +#define DETAILLO "Low detail" +#define GAMMALVL0 "Gamma correction OFF" +#define GAMMALVL1 "Gamma correction level 1" +#define GAMMALVL2 "Gamma correction level 2" +#define GAMMALVL3 "Gamma correction level 3" +#define GAMMALVL4 "Gamma correction level 4" +#define EMPTYSTRING "empty slot" + +// +// P_inter.C +// +#define GOTARMOR "Picked up the armor." +#define GOTMEGA "Picked up the MegaArmor!" +#define GOTHTHBONUS "Picked up a health bonus." +#define GOTARMBONUS "Picked up an armor bonus." +#define GOTSTIM "Picked up a stimpack." +#define GOTMEDINEED "Picked up a medikit that you REALLY need!" +#define GOTMEDIKIT "Picked up a medikit." +#define GOTSUPER "Supercharge!" + +#define GOTBLUECARD "Picked up a blue keycard." +#define GOTYELWCARD "Picked up a yellow keycard." +#define GOTREDCARD "Picked up a red keycard." +#define GOTBLUESKUL "Picked up a blue skull key." +#define GOTYELWSKUL "Picked up a yellow skull key." +#define GOTREDSKULL "Picked up a red skull key." + +#define GOTINVUL "Invulnerability!" +#define GOTBERSERK "Berserk!" +#define GOTINVIS "Partial Invisibility" +#define GOTSUIT "Radiation Shielding Suit" +#define GOTMAP "Computer Area Map" +#define GOTVISOR "Light Amplification Visor" +#define GOTMSPHERE "MegaSphere!" + +#define GOTCLIP "Picked up a clip." +#define GOTCLIPBOX "Picked up a box of bullets." +#define GOTROCKET "Picked up a rocket." +#define GOTROCKBOX "Picked up a box of rockets." +#define GOTCELL "Picked up an energy cell." +#define GOTCELLBOX "Picked up an energy cell pack." +#define GOTSHELLS "Picked up 4 shotgun shells." +#define GOTSHELLBOX "Picked up a box of shotgun shells." +#define GOTBACKPACK "Picked up a backpack full of ammo!" + +#define GOTBFG9000 "You got the BFG9000! Oh, yes." +#define GOTCHAINGUN "You got the chaingun!" +#define GOTCHAINSAW "A chainsaw! Find some meat!" +#define GOTLAUNCHER "You got the rocket launcher!" +#define GOTPLASMA "You got the plasma gun!" +#define GOTSHOTGUN "You got the shotgun!" +#define GOTSHOTGUN2 "You got the super shotgun!" + +// +// P_Doors.C +// +#define PD_BLUEO "You need a blue key to activate this object" +#define PD_REDO "You need a red key to activate this object" +#define PD_YELLOWO "You need a yellow key to activate this object" +#define PD_BLUEK "You need a blue key to open this door" +#define PD_REDK "You need a red key to open this door" +#define PD_YELLOWK "You need a yellow key to open this door" + +// +// G_game.C +// +#define GGSAVED "game saved." + +// +// HU_stuff.C +// +#define HUSTR_MSGU "[Message unsent]" + +#define HUSTR_E1M1 "E1M1: Hangar" +#define HUSTR_E1M2 "E1M2: Nuclear Plant" +#define HUSTR_E1M3 "E1M3: Toxin Refinery" +#define HUSTR_E1M4 "E1M4: Command Control" +#define HUSTR_E1M5 "E1M5: Phobos Lab" +#define HUSTR_E1M6 "E1M6: Central Processing" +#define HUSTR_E1M7 "E1M7: Computer Station" +#define HUSTR_E1M8 "E1M8: Phobos Anomaly" +#define HUSTR_E1M9 "E1M9: Military Base" + +#define HUSTR_E2M1 "E2M1: Deimos Anomaly" +#define HUSTR_E2M2 "E2M2: Containment Area" +#define HUSTR_E2M3 "E2M3: Refinery" +#define HUSTR_E2M4 "E2M4: Deimos Lab" +#define HUSTR_E2M5 "E2M5: Command Center" +#define HUSTR_E2M6 "E2M6: Halls of the Damned" +#define HUSTR_E2M7 "E2M7: Spawning Vats" +#define HUSTR_E2M8 "E2M8: Tower of Babel" +#define HUSTR_E2M9 "E2M9: Fortress of Mystery" + +#define HUSTR_E3M1 "E3M1: Hell Keep" +#define HUSTR_E3M2 "E3M2: Slough of Despair" +#define HUSTR_E3M3 "E3M3: Pandemonium" +#define HUSTR_E3M4 "E3M4: House of Pain" +#define HUSTR_E3M5 "E3M5: Unholy Cathedral" +#define HUSTR_E3M6 "E3M6: Mt. Erebus" +#define HUSTR_E3M7 "E3M7: Limbo" +#define HUSTR_E3M8 "E3M8: Dis" +#define HUSTR_E3M9 "E3M9: Warrens" + +#define HUSTR_E4M1 "E4M1: Hell Beneath" +#define HUSTR_E4M2 "E4M2: Perfect Hatred" +#define HUSTR_E4M3 "E4M3: Sever The Wicked" +#define HUSTR_E4M4 "E4M4: Unruly Evil" +#define HUSTR_E4M5 "E4M5: They Will Repent" +#define HUSTR_E4M6 "E4M6: Against Thee Wickedly" +#define HUSTR_E4M7 "E4M7: And Hell Followed" +#define HUSTR_E4M8 "E4M8: Unto The Cruel" +#define HUSTR_E4M9 "E4M9: Fear" + +#define HUSTR_1 "level 1: entryway" +#define HUSTR_2 "level 2: underhalls" +#define HUSTR_3 "level 3: the gantlet" +#define HUSTR_4 "level 4: the focus" +#define HUSTR_5 "level 5: the waste tunnels" +#define HUSTR_6 "level 6: the crusher" +#define HUSTR_7 "level 7: dead simple" +#define HUSTR_8 "level 8: tricks and traps" +#define HUSTR_9 "level 9: the pit" +#define HUSTR_10 "level 10: refueling base" +#define HUSTR_11 "level 11: 'o' of destruction!" + +#define HUSTR_12 "level 12: the factory" +#define HUSTR_13 "level 13: downtown" +#define HUSTR_14 "level 14: the inmost dens" +#define HUSTR_15 "level 15: industrial zone" +#define HUSTR_16 "level 16: suburbs" +#define HUSTR_17 "level 17: tenements" +#define HUSTR_18 "level 18: the courtyard" +#define HUSTR_19 "level 19: the citadel" +#define HUSTR_20 "level 20: gotcha!" + +#define HUSTR_21 "level 21: nirvana" +#define HUSTR_22 "level 22: the catacombs" +#define HUSTR_23 "level 23: barrels o' fun" +#define HUSTR_24 "level 24: the chasm" +#define HUSTR_25 "level 25: bloodfalls" +#define HUSTR_26 "level 26: the abandoned mines" +#define HUSTR_27 "level 27: monster condo" +#define HUSTR_28 "level 28: the spirit world" +#define HUSTR_29 "level 29: the living end" +#define HUSTR_30 "level 30: icon of sin" + +#define HUSTR_31 "level 31: wolfenstein" +#define HUSTR_32 "level 32: grosse" + +#define PHUSTR_1 "level 1: congo" +#define PHUSTR_2 "level 2: well of souls" +#define PHUSTR_3 "level 3: aztec" +#define PHUSTR_4 "level 4: caged" +#define PHUSTR_5 "level 5: ghost town" +#define PHUSTR_6 "level 6: baron's lair" +#define PHUSTR_7 "level 7: caughtyard" +#define PHUSTR_8 "level 8: realm" +#define PHUSTR_9 "level 9: abattoire" +#define PHUSTR_10 "level 10: onslaught" +#define PHUSTR_11 "level 11: hunted" + +#define PHUSTR_12 "level 12: speed" +#define PHUSTR_13 "level 13: the crypt" +#define PHUSTR_14 "level 14: genesis" +#define PHUSTR_15 "level 15: the twilight" +#define PHUSTR_16 "level 16: the omen" +#define PHUSTR_17 "level 17: compound" +#define PHUSTR_18 "level 18: neurosphere" +#define PHUSTR_19 "level 19: nme" +#define PHUSTR_20 "level 20: the death domain" + +#define PHUSTR_21 "level 21: slayer" +#define PHUSTR_22 "level 22: impossible mission" +#define PHUSTR_23 "level 23: tombstone" +#define PHUSTR_24 "level 24: the final frontier" +#define PHUSTR_25 "level 25: the temple of darkness" +#define PHUSTR_26 "level 26: bunker" +#define PHUSTR_27 "level 27: anti-christ" +#define PHUSTR_28 "level 28: the sewers" +#define PHUSTR_29 "level 29: odyssey of noises" +#define PHUSTR_30 "level 30: the gateway of hell" + +#define PHUSTR_31 "level 31: cyberden" +#define PHUSTR_32 "level 32: go 2 it" + +#define THUSTR_1 "level 1: system control" +#define THUSTR_2 "level 2: human bbq" +#define THUSTR_3 "level 3: power control" +#define THUSTR_4 "level 4: wormhole" +#define THUSTR_5 "level 5: hanger" +#define THUSTR_6 "level 6: open season" +#define THUSTR_7 "level 7: prison" +#define THUSTR_8 "level 8: metal" +#define THUSTR_9 "level 9: stronghold" +#define THUSTR_10 "level 10: redemption" +#define THUSTR_11 "level 11: storage facility" + +#define THUSTR_12 "level 12: crater" +#define THUSTR_13 "level 13: nukage processing" +#define THUSTR_14 "level 14: steel works" +#define THUSTR_15 "level 15: dead zone" +#define THUSTR_16 "level 16: deepest reaches" +#define THUSTR_17 "level 17: processing area" +#define THUSTR_18 "level 18: mill" +#define THUSTR_19 "level 19: shipping/respawning" +#define THUSTR_20 "level 20: central processing" + +#define THUSTR_21 "level 21: administration center" +#define THUSTR_22 "level 22: habitat" +#define THUSTR_23 "level 23: lunar mining project" +#define THUSTR_24 "level 24: quarry" +#define THUSTR_25 "level 25: baron's den" +#define THUSTR_26 "level 26: ballistyx" +#define THUSTR_27 "level 27: mount pain" +#define THUSTR_28 "level 28: heck" +#define THUSTR_29 "level 29: river styx" +#define THUSTR_30 "level 30: last call" + +#define THUSTR_31 "level 31: pharaoh" +#define THUSTR_32 "level 32: caribbean" + +#define HUSTR_CHATMACRO1 "I'm ready to kick butt!" +#define HUSTR_CHATMACRO2 "I'm OK." +#define HUSTR_CHATMACRO3 "I'm not looking too good!" +#define HUSTR_CHATMACRO4 "Help!" +#define HUSTR_CHATMACRO5 "You suck!" +#define HUSTR_CHATMACRO6 "Next time, scumbag..." +#define HUSTR_CHATMACRO7 "Come here!" +#define HUSTR_CHATMACRO8 "I'll take care of it." +#define HUSTR_CHATMACRO9 "Yes" +#define HUSTR_CHATMACRO0 "No" + +#define HUSTR_TALKTOSELF1 "You mumble to yourself" +#define HUSTR_TALKTOSELF2 "Who's there?" +#define HUSTR_TALKTOSELF3 "You scare yourself" +#define HUSTR_TALKTOSELF4 "You start to rave" +#define HUSTR_TALKTOSELF5 "You've lost it..." + +#define HUSTR_MESSAGESENT "[Message Sent]" + +// The following should NOT be changed unless it seems +// just AWFULLY necessary + +#define HUSTR_PLRGREEN "Green: " +#define HUSTR_PLRINDIGO "Indigo: " +#define HUSTR_PLRBROWN "Brown: " +#define HUSTR_PLRRED "Red: " + +#define HUSTR_KEYGREEN 'g' +#define HUSTR_KEYINDIGO 'i' +#define HUSTR_KEYBROWN 'b' +#define HUSTR_KEYRED 'r' + +// +// AM_map.C +// + +#define AMSTR_FOLLOWON "Follow Mode ON" +#define AMSTR_FOLLOWOFF "Follow Mode OFF" + +#define AMSTR_GRIDON "Grid ON" +#define AMSTR_GRIDOFF "Grid OFF" + +#define AMSTR_MARKEDSPOT "Marked Spot" +#define AMSTR_MARKSCLEARED "All Marks Cleared" + +// +// ST_stuff.C +// + +#define STSTR_MUS "Music Change" +#define STSTR_NOMUS "IMPOSSIBLE SELECTION" +#define STSTR_DQDON "Degreelessness Mode On" +#define STSTR_DQDOFF "Degreelessness Mode Off" + +#define STSTR_KFAADDED "Very Happy Ammo Added" +#define STSTR_FAADDED "Ammo (no keys) Added" + +#define STSTR_NCON "No Clipping Mode ON" +#define STSTR_NCOFF "No Clipping Mode OFF" + +#define STSTR_BEHOLD "inVuln, Str, Inviso, Rad, Allmap, or Lite-amp" +#define STSTR_BEHOLDX "Power-up Toggled" + +#define STSTR_CHOPPERS "... doesn't suck - GM" +#define STSTR_CLEV "Changing Level..." + +// +// F_Finale.C +// +#define E1TEXT \ +"Once you beat the big badasses and\n"\ +"clean out the moon base you're supposed\n"\ +"to win, aren't you? Aren't you? Where's\n"\ +"your fat reward and ticket home? What\n"\ +"the hell is this? It's not supposed to\n"\ +"end this way!\n"\ +"\n" \ +"It stinks like rotten meat, but looks\n"\ +"like the lost Deimos base. Looks like\n"\ +"you're stuck on The Shores of Hell.\n"\ +"The only way out is through.\n"\ +"\n"\ +"To continue the DOOM experience, play\n"\ +"The Shores of Hell and its amazing\n"\ +"sequel, Inferno!\n" + + +#define E2TEXT \ +"You've done it! The hideous cyber-\n"\ +"demon lord that ruled the lost Deimos\n"\ +"moon base has been slain and you\n"\ +"are triumphant! But ... where are\n"\ +"you? You clamber to the edge of the\n"\ +"moon and look down to see the awful\n"\ +"truth.\n" \ +"\n"\ +"Deimos floats above Hell itself!\n"\ +"You've never heard of anyone escaping\n"\ +"from Hell, but you'll make the bastards\n"\ +"sorry they ever heard of you! Quickly,\n"\ +"you rappel down to the surface of\n"\ +"Hell.\n"\ +"\n" \ +"Now, it's on to the final chapter of\n"\ +"DOOM! -- Inferno." + + +#define E3TEXT \ +"The loathsome spiderdemon that\n"\ +"masterminded the invasion of the moon\n"\ +"bases and caused so much death has had\n"\ +"its ass kicked for all time.\n"\ +"\n"\ +"A hidden doorway opens and you enter.\n"\ +"You've proven too tough for Hell to\n"\ +"contain, and now Hell at last plays\n"\ +"fair -- for you emerge from the door\n"\ +"to see the green fields of Earth!\n"\ +"Home at last.\n" \ +"\n"\ +"You wonder what's been happening on\n"\ +"Earth while you were battling evil\n"\ +"unleashed. It's good that no Hell-\n"\ +"spawn could have come through that\n"\ +"door with you ..." + + +#define E4TEXT \ +"the spider mastermind must have sent forth\n"\ +"its legions of hellspawn before your\n"\ +"final confrontation with that terrible\n"\ +"beast from hell. but you stepped forward\n"\ +"and brought forth eternal damnation and\n"\ +"suffering upon the horde as a true hero\n"\ +"would in the face of something so evil.\n"\ +"\n"\ +"besides, someone was gonna pay for what\n"\ +"happened to daisy, your pet rabbit.\n"\ +"\n"\ +"but now, you see spread before you more\n"\ +"potential pain and gibbitude as a nation\n"\ +"of demons run amok among our cities.\n"\ +"\n"\ +"next stop, hell on earth!" + + +// after level 6, put this: + +#define C1TEXT \ +"YOU HAVE ENTERED DEEPLY INTO THE INFESTED\n" \ +"STARPORT. BUT SOMETHING IS WRONG. THE\n" \ +"MONSTERS HAVE BROUGHT THEIR OWN REALITY\n" \ +"WITH THEM, AND THE STARPORT'S TECHNOLOGY\n" \ +"IS BEING SUBVERTED BY THEIR PRESENCE.\n" \ +"\n"\ +"AHEAD, YOU SEE AN OUTPOST OF HELL, A\n" \ +"FORTIFIED ZONE. IF YOU CAN GET PAST IT,\n" \ +"YOU CAN PENETRATE INTO THE HAUNTED HEART\n" \ +"OF THE STARBASE AND FIND THE CONTROLLING\n" \ +"SWITCH WHICH HOLDS EARTH'S POPULATION\n" \ +"HOSTAGE." + +// After level 11, put this: + +#define C2TEXT \ +"YOU HAVE WON! YOUR VICTORY HAS ENABLED\n" \ +"HUMANKIND TO EVACUATE EARTH AND ESCAPE\n"\ +"THE NIGHTMARE. NOW YOU ARE THE ONLY\n"\ +"HUMAN LEFT ON THE FACE OF THE PLANET.\n"\ +"CANNIBAL MUTATIONS, CARNIVOROUS ALIENS,\n"\ +"AND EVIL SPIRITS ARE YOUR ONLY NEIGHBORS.\n"\ +"YOU SIT BACK AND WAIT FOR DEATH, CONTENT\n"\ +"THAT YOU HAVE SAVED YOUR SPECIES.\n"\ +"\n"\ +"BUT THEN, EARTH CONTROL BEAMS DOWN A\n"\ +"MESSAGE FROM SPACE: \"SENSORS HAVE LOCATED\n"\ +"THE SOURCE OF THE ALIEN INVASION. IF YOU\n"\ +"GO THERE, YOU MAY BE ABLE TO BLOCK THEIR\n"\ +"ENTRY. THE ALIEN BASE IS IN THE HEART OF\n"\ +"YOUR OWN HOME CITY, NOT FAR FROM THE\n"\ +"STARPORT.\" SLOWLY AND PAINFULLY YOU GET\n"\ +"UP AND RETURN TO THE FRAY." + + +// After level 20, put this: + +#define C3TEXT \ +"YOU ARE AT THE CORRUPT HEART OF THE CITY,\n"\ +"SURROUNDED BY THE CORPSES OF YOUR ENEMIES.\n"\ +"YOU SEE NO WAY TO DESTROY THE CREATURES'\n"\ +"ENTRYWAY ON THIS SIDE, SO YOU CLENCH YOUR\n"\ +"TEETH AND PLUNGE THROUGH IT.\n"\ +"\n"\ +"THERE MUST BE A WAY TO CLOSE IT ON THE\n"\ +"OTHER SIDE. WHAT DO YOU CARE IF YOU'VE\n"\ +"GOT TO GO THROUGH HELL TO GET TO IT?" + + +// After level 29, put this: + +#define C4TEXT \ +"THE HORRENDOUS VISAGE OF THE BIGGEST\n"\ +"DEMON YOU'VE EVER SEEN CRUMBLES BEFORE\n"\ +"YOU, AFTER YOU PUMP YOUR ROCKETS INTO\n"\ +"HIS EXPOSED BRAIN. THE MONSTER SHRIVELS\n"\ +"UP AND DIES, ITS THRASHING LIMBS\n"\ +"DEVASTATING UNTOLD MILES OF HELL'S\n"\ +"SURFACE.\n"\ +"\n"\ +"YOU'VE DONE IT. THE INVASION IS OVER.\n"\ +"EARTH IS SAVED. HELL IS A WRECK. YOU\n"\ +"WONDER WHERE BAD FOLKS WILL GO WHEN THEY\n"\ +"DIE, NOW. WIPING THE SWEAT FROM YOUR\n"\ +"FOREHEAD YOU BEGIN THE LONG TREK BACK\n"\ +"HOME. REBUILDING EARTH OUGHT TO BE A\n"\ +"LOT MORE FUN THAN RUINING IT WAS.\n" + + + +// Before level 31, put this: + +#define C5TEXT \ +"CONGRATULATIONS, YOU'VE FOUND THE SECRET\n"\ +"LEVEL! LOOKS LIKE IT'S BEEN BUILT BY\n"\ +"HUMANS, RATHER THAN DEMONS. YOU WONDER\n"\ +"WHO THE INMATES OF THIS CORNER OF HELL\n"\ +"WILL BE." + + +// Before level 32, put this: + +#define C6TEXT \ +"CONGRATULATIONS, YOU'VE FOUND THE\n"\ +"SUPER SECRET LEVEL! YOU'D BETTER\n"\ +"BLAZE THROUGH THIS ONE!\n" + + +// after map 06 + +#define P1TEXT \ +"You gloat over the steaming carcass of the\n"\ +"Guardian. With its death, you've wrested\n"\ +"the Accelerator from the stinking claws\n"\ +"of Hell. You relax and glance around the\n"\ +"room. Damn! There was supposed to be at\n"\ +"least one working prototype, but you can't\n"\ +"see it. The demons must have taken it.\n"\ +"\n"\ +"You must find the prototype, or all your\n"\ +"struggles will have been wasted. Keep\n"\ +"moving, keep fighting, keep killing.\n"\ +"Oh yes, keep living, too." + + +// after map 11 + +#define P2TEXT \ +"Even the deadly Arch-Vile labyrinth could\n"\ +"not stop you, and you've gotten to the\n"\ +"prototype Accelerator which is soon\n"\ +"efficiently and permanently deactivated.\n"\ +"\n"\ +"You're good at that kind of thing." + + +// after map 20 + +#define P3TEXT \ +"You've bashed and battered your way into\n"\ +"the heart of the devil-hive. Time for a\n"\ +"Search-and-Destroy mission, aimed at the\n"\ +"Gatekeeper, whose foul offspring is\n"\ +"cascading to Earth. Yeah, he's bad. But\n"\ +"you know who's worse!\n"\ +"\n"\ +"Grinning evilly, you check your gear, and\n"\ +"get ready to give the bastard a little Hell\n"\ +"of your own making!" + +// after map 30 + +#define P4TEXT \ +"The Gatekeeper's evil face is splattered\n"\ +"all over the place. As its tattered corpse\n"\ +"collapses, an inverted Gate forms and\n"\ +"sucks down the shards of the last\n"\ +"prototype Accelerator, not to mention the\n"\ +"few remaining demons. You're done. Hell\n"\ +"has gone back to pounding bad dead folks \n"\ +"instead of good live ones. Remember to\n"\ +"tell your grandkids to put a rocket\n"\ +"launcher in your coffin. If you go to Hell\n"\ +"when you die, you'll need it for some\n"\ +"final cleaning-up ..." + +// before map 31 + +#define P5TEXT \ +"You've found the second-hardest level we\n"\ +"got. Hope you have a saved game a level or\n"\ +"two previous. If not, be prepared to die\n"\ +"aplenty. For master marines only." + +// before map 32 + +#define P6TEXT \ +"Betcha wondered just what WAS the hardest\n"\ +"level we had ready for ya? Now you know.\n"\ +"No one gets out alive." + + +#define T1TEXT \ +"You've fought your way out of the infested\n"\ +"experimental labs. It seems that UAC has\n"\ +"once again gulped it down. With their\n"\ +"high turnover, it must be hard for poor\n"\ +"old UAC to buy corporate health insurance\n"\ +"nowadays..\n"\ +"\n"\ +"Ahead lies the military complex, now\n"\ +"swarming with diseased horrors hot to get\n"\ +"their teeth into you. With luck, the\n"\ +"complex still has some warlike ordnance\n"\ +"laying around." + + +#define T2TEXT \ +"You hear the grinding of heavy machinery\n"\ +"ahead. You sure hope they're not stamping\n"\ +"out new hellspawn, but you're ready to\n"\ +"ream out a whole herd if you have to.\n"\ +"They might be planning a blood feast, but\n"\ +"you feel about as mean as two thousand\n"\ +"maniacs packed into one mad killer.\n"\ +"\n"\ +"You don't plan to go down easy." + + +#define T3TEXT \ +"The vista opening ahead looks real damn\n"\ +"familiar. Smells familiar, too -- like\n"\ +"fried excrement. You didn't like this\n"\ +"place before, and you sure as hell ain't\n"\ +"planning to like it now. The more you\n"\ +"brood on it, the madder you get.\n"\ +"Hefting your gun, an evil grin trickles\n"\ +"onto your face. Time to take some names." + +#define T4TEXT \ +"Suddenly, all is silent, from one horizon\n"\ +"to the other. The agonizing echo of Hell\n"\ +"fades away, the nightmare sky turns to\n"\ +"blue, the heaps of monster corpses start \n"\ +"to evaporate along with the evil stench \n"\ +"that filled the air. Jeeze, maybe you've\n"\ +"done it. Have you really won?\n"\ +"\n"\ +"Something rumbles in the distance.\n"\ +"A blue light begins to glow inside the\n"\ +"ruined skull of the demon-spitter." + + +#define T5TEXT \ +"What now? Looks totally different. Kind\n"\ +"of like King Tut's condo. Well,\n"\ +"whatever's here can't be any worse\n"\ +"than usual. Can it? Or maybe it's best\n"\ +"to let sleeping gods lie.." + + +#define T6TEXT \ +"Time for a vacation. You've burst the\n"\ +"bowels of hell and by golly you're ready\n"\ +"for a break. You mutter to yourself,\n"\ +"Maybe someone else can kick Hell's ass\n"\ +"next time around. Ahead lies a quiet town,\n"\ +"with peaceful flowing water, quaint\n"\ +"buildings, and presumably no Hellspawn.\n"\ +"\n"\ +"As you step off the transport, you hear\n"\ +"the stomp of a cyberdemon's iron shoe." + + + +// +// Character cast strings F_FINALE.C +// +#define CC_ZOMBIE "ZOMBIEMAN" +#define CC_SHOTGUN "SHOTGUN GUY" +#define CC_HEAVY "HEAVY WEAPON DUDE" +#define CC_IMP "IMP" +#define CC_DEMON "DEMON" +#define CC_LOST "LOST SOUL" +#define CC_CACO "CACODEMON" +#define CC_HELL "HELL KNIGHT" +#define CC_BARON "BARON OF HELL" +#define CC_ARACH "ARACHNOTRON" +#define CC_PAIN "PAIN ELEMENTAL" +#define CC_REVEN "REVENANT" +#define CC_MANCU "MANCUBUS" +#define CC_ARCH "ARCH-VILE" +#define CC_SPIDER "THE SPIDER MASTERMIND" +#define CC_CYBER "THE CYBERDEMON" +#define CC_HERO "OUR HERO" + + +#endif diff --git a/firmware_p4/components/Applications/doom/d_event.c b/firmware_p4/components/Applications/doom/d_event.c new file mode 100644 index 000000000..3eef57282 --- /dev/null +++ b/firmware_p4/components/Applications/doom/d_event.c @@ -0,0 +1,63 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// +// DESCRIPTION: Event handling. +// +// Events are asynchronous inputs generally generated by the game user. +// Events can be discarded if no responder claims them +// + +#include +#include "d_event.h" + +#define MAXEVENTS 64 + +static event_t events[MAXEVENTS]; +static int eventhead; +static int eventtail; + +// +// D_PostEvent +// Called by the I/O functions when input is detected +// +void D_PostEvent (event_t* ev) +{ + events[eventhead] = *ev; + eventhead = (eventhead + 1) % MAXEVENTS; +} + +// Read an event from the queue. + +event_t *D_PopEvent(void) +{ + event_t *result; + + // No more events waiting. + + if (eventtail == eventhead) + { + return NULL; + } + + result = &events[eventtail]; + + // Advance to the next event in the queue. + + eventtail = (eventtail + 1) % MAXEVENTS; + + return result; +} + + diff --git a/firmware_p4/components/Applications/doom/d_event.h b/firmware_p4/components/Applications/doom/d_event.h new file mode 100644 index 000000000..c9374b296 --- /dev/null +++ b/firmware_p4/components/Applications/doom/d_event.h @@ -0,0 +1,137 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// +// + + +#ifndef __D_EVENT__ +#define __D_EVENT__ + + +#include "doomtype.h" + + +// +// Event handling. +// + +// Input event types. +typedef enum +{ + ev_keydown, + ev_keyup, + ev_mouse, + ev_joystick, + ev_quit +} evtype_t; + +// Event structure. +typedef struct +{ + evtype_t type; + + // Event-related data that depends on the type of event: + // + // ev_keydown/ev_keyup: + // data1: Key code (from doomkeys.h) of the key that was + // pressed or released. + // data2: Ascii text of the character that was pressed, + // shifted appropriately (eg. '$' if 4 was pressed + // while shift was held). + // + // ev_mouse: + // data1: Bitfield of buttons currently held down. + // (bit 0 = left; bit 1 = right; bit 2 = middle). + // data2: X axis mouse movement (turn). + // data3: Y axis mouse movement (forward/backward). + // + // ev_joystick: + // data1: Bitfield of buttons currently pressed. + // data2: X axis mouse movement (turn). + // data3: Y axis mouse movement (forward/backward). + // data4: Third axis mouse movement (strafe). + + int data1, data2, data3, data4; +} event_t; + + +// +// Button/action code definitions. +// +typedef enum +{ + // Press "Fire". + BT_ATTACK = 1, + // Use button, to open doors, activate switches. + BT_USE = 2, + + // Flag: game events, not really buttons. + BT_SPECIAL = 128, + BT_SPECIALMASK = 3, + + // Flag, weapon change pending. + // If true, the next 3 bits hold weapon num. + BT_CHANGE = 4, + // The 3bit weapon mask and shift, convenience. + BT_WEAPONMASK = (8+16+32), + BT_WEAPONSHIFT = 3, + + // Pause the game. + BTS_PAUSE = 1, + // Save the game at each console. + BTS_SAVEGAME = 2, + + // Savegame slot numbers + // occupy the second byte of buttons. + BTS_SAVEMASK = (4+8+16), + BTS_SAVESHIFT = 2, + +} buttoncode_t; + +// villsa [STRIFE] Strife specific buttons +// TODO - not finished +typedef enum +{ + // Player view look up + BT2_LOOKUP = 1, + // Player view look down + BT2_LOOKDOWN = 2, + // Center player's view + BT2_CENTERVIEW = 4, + // Use inventory item + BT2_INVUSE = 8, + // Drop inventory item + BT2_INVDROP = 16, + // Jump up and down + BT2_JUMP = 32, + // Use medkit + BT2_HEALTH = 128, + +} buttoncode2_t; + + + + +// Called by IO functions when input is detected. +void D_PostEvent (event_t *ev); + +// Read an event from the event queue + +event_t *D_PopEvent(void); + + +#endif + diff --git a/firmware_p4/components/Applications/doom/d_items.c b/firmware_p4/components/Applications/doom/d_items.c new file mode 100644 index 000000000..33f310c63 --- /dev/null +++ b/firmware_p4/components/Applications/doom/d_items.c @@ -0,0 +1,128 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// + + +// We are referring to sprite numbers. +#include "info.h" + +#include "d_items.h" + + +// +// PSPRITE ACTIONS for waepons. +// This struct controls the weapon animations. +// +// Each entry is: +// ammo/amunition type +// upstate +// downstate +// readystate +// atkstate, i.e. attack/fire/hit frame +// flashstate, muzzle flash +// +weaponinfo_t weaponinfo[NUMWEAPONS] = +{ + { + // fist + am_noammo, + S_PUNCHUP, + S_PUNCHDOWN, + S_PUNCH, + S_PUNCH1, + S_NULL + }, + { + // pistol + am_clip, + S_PISTOLUP, + S_PISTOLDOWN, + S_PISTOL, + S_PISTOL1, + S_PISTOLFLASH + }, + { + // shotgun + am_shell, + S_SGUNUP, + S_SGUNDOWN, + S_SGUN, + S_SGUN1, + S_SGUNFLASH1 + }, + { + // chaingun + am_clip, + S_CHAINUP, + S_CHAINDOWN, + S_CHAIN, + S_CHAIN1, + S_CHAINFLASH1 + }, + { + // missile launcher + am_misl, + S_MISSILEUP, + S_MISSILEDOWN, + S_MISSILE, + S_MISSILE1, + S_MISSILEFLASH1 + }, + { + // plasma rifle + am_cell, + S_PLASMAUP, + S_PLASMADOWN, + S_PLASMA, + S_PLASMA1, + S_PLASMAFLASH1 + }, + { + // bfg 9000 + am_cell, + S_BFGUP, + S_BFGDOWN, + S_BFG, + S_BFG1, + S_BFGFLASH1 + }, + { + // chainsaw + am_noammo, + S_SAWUP, + S_SAWDOWN, + S_SAW, + S_SAW1, + S_NULL + }, + { + // super shotgun + am_shell, + S_DSGUNUP, + S_DSGUNDOWN, + S_DSGUN, + S_DSGUN1, + S_DSGUNFLASH1 + }, +}; + + + + + + + + diff --git a/firmware_p4/components/Applications/doom/d_items.h b/firmware_p4/components/Applications/doom/d_items.h new file mode 100644 index 000000000..3d22a0630 --- /dev/null +++ b/firmware_p4/components/Applications/doom/d_items.h @@ -0,0 +1,41 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Items: key cards, artifacts, weapon, ammunition. +// + + +#ifndef __D_ITEMS__ +#define __D_ITEMS__ + +#include "doomdef.h" + + + +// Weapon info: sprite frames, ammunition use. +typedef struct +{ + ammotype_t ammo; + int upstate; + int downstate; + int readystate; + int atkstate; + int flashstate; + +} weaponinfo_t; + +extern weaponinfo_t weaponinfo[NUMWEAPONS]; + +#endif diff --git a/firmware_p4/components/Applications/doom/d_iwad.c b/firmware_p4/components/Applications/doom/d_iwad.c new file mode 100644 index 000000000..508cc6188 --- /dev/null +++ b/firmware_p4/components/Applications/doom/d_iwad.c @@ -0,0 +1,848 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Search for and locate an IWAD file, and initialize according +// to the IWAD type. +// + +#include +#include +#include +#include + +#include "config.h" +#include "deh_str.h" +#include "doomkeys.h" +#include "d_iwad.h" +#include "i_system.h" +#include "m_argv.h" +#include "m_config.h" +#include "m_misc.h" +#include "w_wad.h" +#include "z_zone.h" + +static const iwad_t iwads[] = +{ + { "doom2.wad", doom2, commercial, "Doom II" }, + { "plutonia.wad", pack_plut, commercial, "Final Doom: Plutonia Experiment" }, + { "tnt.wad", pack_tnt, commercial, "Final Doom: TNT: Evilution" }, + { "doom.wad", doom, retail, "Doom" }, + { "doom1.wad", doom, shareware, "Doom Shareware" }, + { "chex.wad", pack_chex, shareware, "Chex Quest" }, + { "hacx.wad", pack_hacx, commercial, "Hacx" }, + { "freedm.wad", doom2, commercial, "FreeDM" }, + { "freedoom2.wad", doom2, commercial, "Freedoom: Phase 2" }, + { "freedoom1.wad", doom, retail, "Freedoom: Phase 1" }, + { "heretic.wad", heretic, retail, "Heretic" }, + { "heretic1.wad", heretic, shareware, "Heretic Shareware" }, + { "hexen.wad", hexen, commercial, "Hexen" }, + //{ "strife0.wad", strife, commercial, "Strife" }, // haleyjd: STRIFE-FIXME + { "strife1.wad", strife, commercial, "Strife" }, +}; + +// Array of locations to search for IWAD files +// +// "128 IWAD search directories should be enough for anybody". + +#define MAX_IWAD_DIRS 128 + +static boolean iwad_dirs_built = false; +static char *iwad_dirs[MAX_IWAD_DIRS]; +static int num_iwad_dirs = 0; + +static void AddIWADDir(char *dir) +{ + if (num_iwad_dirs < MAX_IWAD_DIRS) + { + iwad_dirs[num_iwad_dirs] = dir; + ++num_iwad_dirs; + } +} + +// This is Windows-specific code that automatically finds the location +// of installed IWAD files. The registry is inspected to find special +// keys installed by the Windows installers for various CD versions +// of Doom. From these keys we can deduce where to find an IWAD. + +#if defined(_WIN32) && !defined(_WIN32_WCE) + +#define WIN32_LEAN_AND_MEAN +#include + +typedef struct +{ + HKEY root; + char *path; + char *value; +} registry_value_t; + +#define UNINSTALLER_STRING "\\uninstl.exe /S " + +// Keys installed by the various CD editions. These are actually the +// commands to invoke the uninstaller and look like this: +// +// C:\Program Files\Path\uninstl.exe /S C:\Program Files\Path +// +// With some munging we can find where Doom was installed. + +// [AlexMax] From the persepctive of a 64-bit executable, 32-bit registry +// keys are located in a different spot. +#if _WIN64 +#define SOFTWARE_KEY "Software\\Wow6432Node" +#else +#define SOFTWARE_KEY "Software" +#endif + +static registry_value_t uninstall_values[] = +{ + // Ultimate Doom, CD version (Depths of Doom trilogy) + + { + HKEY_LOCAL_MACHINE, + SOFTWARE_KEY "\\Microsoft\\Windows\\CurrentVersion\\" + "Uninstall\\Ultimate Doom for Windows 95", + "UninstallString", + }, + + // Doom II, CD version (Depths of Doom trilogy) + + { + HKEY_LOCAL_MACHINE, + SOFTWARE_KEY "\\Microsoft\\Windows\\CurrentVersion\\" + "Uninstall\\Doom II for Windows 95", + "UninstallString", + }, + + // Final Doom + + { + HKEY_LOCAL_MACHINE, + SOFTWARE_KEY "\\Microsoft\\Windows\\CurrentVersion\\" + "Uninstall\\Final Doom for Windows 95", + "UninstallString", + }, + + // Shareware version + + { + HKEY_LOCAL_MACHINE, + SOFTWARE_KEY "\\Microsoft\\Windows\\CurrentVersion\\" + "Uninstall\\Doom Shareware for Windows 95", + "UninstallString", + }, +}; + +// Value installed by the Collector's Edition when it is installed + +static registry_value_t collectors_edition_value = +{ + HKEY_LOCAL_MACHINE, + SOFTWARE_KEY "\\Activision\\DOOM Collector's Edition\\v1.0", + "INSTALLPATH", +}; + +// Subdirectories of the above install path, where IWADs are installed. + +static char *collectors_edition_subdirs[] = +{ + "Doom2", + "Final Doom", + "Ultimate Doom", +}; + +// Location where Steam is installed + +static registry_value_t steam_install_location = +{ + HKEY_LOCAL_MACHINE, + SOFTWARE_KEY "\\Valve\\Steam", + "InstallPath", +}; + +// Subdirs of the steam install directory where IWADs are found + +static char *steam_install_subdirs[] = +{ + "steamapps\\common\\doom 2\\base", + "steamapps\\common\\final doom\\base", + "steamapps\\common\\ultimate doom\\base", + "steamapps\\common\\heretic shadow of the serpent riders\\base", + "steamapps\\common\\hexen\\base", + "steamapps\\common\\hexen deathkings of the dark citadel\\base", + + // From Doom 3: BFG Edition: + + "steamapps\\common\\DOOM 3 BFG Edition\\base\\wads", +}; + +#define STEAM_BFG_GUS_PATCHES \ + "steamapps\\common\\DOOM 3 BFG Edition\\base\\classicmusic\\instruments" + +static char *GetRegistryString(registry_value_t *reg_val) +{ + HKEY key; + DWORD len; + DWORD valtype; + char *result; + + // Open the key (directory where the value is stored) + + if (RegOpenKeyEx(reg_val->root, reg_val->path, + 0, KEY_READ, &key) != ERROR_SUCCESS) + { + return NULL; + } + + result = NULL; + + // Find the type and length of the string, and only accept strings. + + if (RegQueryValueEx(key, reg_val->value, + NULL, &valtype, NULL, &len) == ERROR_SUCCESS + && valtype == REG_SZ) + { + // Allocate a buffer for the value and read the value + + result = malloc(len); + + if (RegQueryValueEx(key, reg_val->value, NULL, &valtype, + (unsigned char *) result, &len) != ERROR_SUCCESS) + { + free(result); + result = NULL; + } + } + + // Close the key + + RegCloseKey(key); + + return result; +} + +// Check for the uninstall strings from the CD versions + +static void CheckUninstallStrings(void) +{ + unsigned int i; + + for (i=0; i 0) + { + return; + } + + install_path = GetRegistryString(&steam_install_location); + + if (install_path == NULL) + { + return; + } + + len = strlen(install_path) + strlen(STEAM_BFG_GUS_PATCHES) + 20; + patch_path = malloc(len); + M_snprintf(patch_path, len, "%s\\%s\\ACBASS.PAT", + install_path, STEAM_BFG_GUS_PATCHES); + + // Does acbass.pat exist? If so, then set gus_patch_path. + if (M_FileExists(patch_path)) + { + M_snprintf(patch_path, len, "%s\\%s", + install_path, STEAM_BFG_GUS_PATCHES); + M_SetVariable("gus_patch_path", patch_path); + } + + free(patch_path); + free(install_path); +} + +// Default install directories for DOS Doom + +static void CheckDOSDefaults(void) +{ + // These are the default install directories used by the deice + // installer program: + + AddIWADDir("\\doom2"); // Doom II + AddIWADDir("\\plutonia"); // Final Doom + AddIWADDir("\\tnt"); + AddIWADDir("\\doom_se"); // Ultimate Doom + AddIWADDir("\\doom"); // Shareware / Registered Doom + AddIWADDir("\\dooms"); // Shareware versions + AddIWADDir("\\doomsw"); + + AddIWADDir("\\heretic"); // Heretic + AddIWADDir("\\hrtic_se"); // Heretic Shareware from Quake disc + + AddIWADDir("\\hexen"); // Hexen + AddIWADDir("\\hexendk"); // Hexen Deathkings of the Dark Citadel + + AddIWADDir("\\strife"); // Strife +} + +#endif + +// Returns true if the specified path is a path to a file +// of the specified name. + +static boolean DirIsFile(char *path, char *filename) +{ + size_t path_len; + size_t filename_len; + + path_len = strlen(path); + filename_len = strlen(filename); + + return path_len >= filename_len + 1 + && path[path_len - filename_len - 1] == DIR_SEPARATOR + && !strcasecmp(&path[path_len - filename_len], filename); +} + +// Check if the specified directory contains the specified IWAD +// file, returning the full path to the IWAD if found, or NULL +// if not found. + +static char *CheckDirectoryHasIWAD(char *dir, char *iwadname) +{ + char *filename; + + // As a special case, the "directory" may refer directly to an + // IWAD file if the path comes from DOOMWADDIR or DOOMWADPATH. + + if (DirIsFile(dir, iwadname) && M_FileExists(dir)) + { + return strdup(dir); + } + + // Construct the full path to the IWAD if it is located in + // this directory, and check if it exists. + + if (!strcmp(dir, ".")) + { + filename = strdup(iwadname); + } + else + { + filename = M_StringJoin(dir, DIR_SEPARATOR_S, iwadname, NULL); + } + + printf("Trying IWAD file:%s\n", filename); + + if (M_FileExists(filename)) + { + return filename; + } + + free(filename); + + return NULL; +} + +// Search a directory to try to find an IWAD +// Returns the location of the IWAD if found, otherwise NULL. + +static char *SearchDirectoryForIWAD(char *dir, int mask, GameMission_t *mission) +{ + char *filename; + size_t i; + + for (i=0; i + // + + iwadparm = M_CheckParmWithArgs("-iwad", 1); + + if (iwadparm) + { + // Search through IWAD dirs for an IWAD with the given name. + + iwadfile = myargv[iwadparm + 1]; + + result = D_FindWADByName(iwadfile); + + if (result == NULL) + { + I_Error("IWAD file '%s' not found!", iwadfile); + } + + *mission = IdentifyIWADByName(result, mask); + } + else + { + // Search through the list and look for an IWAD + + printf("-iwad not specified, trying a few iwad names\n"); + + result = NULL; + + BuildIWADDirList(); + + for (i=0; result == NULL && i +#include + +#include "doomfeatures.h" + +#include "d_event.h" +#include "d_loop.h" +#include "d_ticcmd.h" + +#include "i_system.h" +#include "i_timer.h" +#include "i_video.h" + +#include "m_argv.h" +#include "m_fixed.h" + +#include "net_client.h" +#include "net_gui.h" +#include "net_io.h" +#include "net_query.h" +#include "net_server.h" +#include "net_sdl.h" +#include "net_loop.h" + +// The complete set of data for a particular tic. + +typedef struct +{ + ticcmd_t cmds[NET_MAXPLAYERS]; + boolean ingame[NET_MAXPLAYERS]; +} ticcmd_set_t; + +// +// gametic is the tic about to (or currently being) run +// maketic is the tic that hasn't had control made for it yet +// recvtic is the latest tic received from the server. +// +// a gametic cannot be run until ticcmds are received for it +// from all players. +// + +static ticcmd_set_t ticdata[BACKUPTICS]; + +// The index of the next tic to be made (with a call to BuildTiccmd). + +static int maketic; + +// The number of complete tics received from the server so far. + +static int recvtic; + +// The number of tics that have been run (using RunTic) so far. + +int gametic; + +// When set to true, a single tic is run each time TryRunTics() is called. +// This is used for -timedemo mode. + +boolean singletics = false; + +// Index of the local player. + +static int localplayer; + +// Used for original sync code. + +static int skiptics = 0; + +// Reduce the bandwidth needed by sampling game input less and transmitting +// less. If ticdup is 2, sample half normal, 3 = one third normal, etc. + +int ticdup; + +// Amount to offset the timer for game sync. + +fixed_t offsetms; + +// Use new client syncronisation code + +static boolean new_sync = true; + +// Callback functions for loop code. + +static loop_interface_t *loop_interface = NULL; + +// Current players in the multiplayer game. +// This is distinct from playeringame[] used by the game code, which may +// modify playeringame[] when playing back multiplayer demos. + +static boolean local_playeringame[NET_MAXPLAYERS]; + +// Requested player class "sent" to the server on connect. +// If we are only doing a single player game then this needs to be remembered +// and saved in the game settings. + +static int player_class; + + +// 35 fps clock adjusted by offsetms milliseconds + +static int GetAdjustedTime(void) +{ + int time_ms; + + time_ms = I_GetTimeMS(); + + if (new_sync) + { + // Use the adjustments from net_client.c only if we are + // using the new sync mode. + + time_ms += (offsetms / FRACUNIT); + } + + return (time_ms * TICRATE) / 1000; +} + +static boolean BuildNewTic(void) +{ + int gameticdiv; + ticcmd_t cmd; + + gameticdiv = gametic/ticdup; + + I_StartTic (); + loop_interface->ProcessEvents(); + + // Always run the menu + + loop_interface->RunMenu(); + + if (drone) + { + // In drone mode, do not generate any ticcmds. + + return false; + } + + if (new_sync) + { + // If playing single player, do not allow tics to buffer + // up very far + + if (!net_client_connected && maketic - gameticdiv > 2) + return false; + + // Never go more than ~200ms ahead + + if (maketic - gameticdiv > 8) + return false; + } + else + { + if (maketic - gameticdiv >= 5) + return false; + } + + //printf ("mk:%i ",maketic); + memset(&cmd, 0, sizeof(ticcmd_t)); + loop_interface->BuildTiccmd(&cmd, maketic); + +#ifdef FEATURE_MULTIPLAYER + + if (net_client_connected) + { + NET_CL_SendTiccmd(&cmd, maketic); + } + +#endif + ticdata[maketic % BACKUPTICS].cmds[localplayer] = cmd; + ticdata[maketic % BACKUPTICS].ingame[localplayer] = true; + + ++maketic; + + return true; +} + +// +// NetUpdate +// Builds ticcmds for console player, +// sends out a packet +// +int lasttime; + +void NetUpdate (void) +{ + int nowtime; + int newtics; + int i; + + // If we are running with singletics (timing a demo), this + // is all done separately. + + if (singletics) + return; + +#ifdef FEATURE_MULTIPLAYER + + // Run network subsystems + + NET_CL_Run(); + NET_SV_Run(); + +#endif + + // check time + nowtime = GetAdjustedTime() / ticdup; + newtics = nowtime - lasttime; + + lasttime = nowtime; + + if (skiptics <= newtics) + { + newtics -= skiptics; + skiptics = 0; + } + else + { + skiptics -= newtics; + newtics = 0; + } + + // build new ticcmds for console player + + for (i=0 ; iconsoleplayer = 0; + settings->num_players = 1; + settings->player_classes[0] = player_class; + + //! + // @category net + // + // Use new network client sync code rather than the classic + // sync code. This is currently disabled by default because it + // has some bugs. + // + if (M_CheckParm("-newsync") > 0) + settings->new_sync = 1; + else + settings->new_sync = 0; + + // TODO: New sync code is not enabled by default because it's + // currently broken. + //if (M_CheckParm("-oldsync") > 0) + // settings->new_sync = 0; + //else + // settings->new_sync = 1; + + //! + // @category net + // @arg + // + // Send n extra tics in every packet as insurance against dropped + // packets. + // + + i = M_CheckParmWithArgs("-extratics", 1); + + if (i > 0) + settings->extratics = atoi(myargv[i+1]); + else + settings->extratics = 1; + + //! + // @category net + // @arg + // + // Reduce the resolution of the game by a factor of n, reducing + // the amount of network bandwidth needed. + // + + i = M_CheckParmWithArgs("-dup", 1); + + if (i > 0) + settings->ticdup = atoi(myargv[i+1]); + else + settings->ticdup = 1; + + if (net_client_connected) + { + // Send our game settings and block until game start is received + // from the server. + + NET_CL_StartGame(settings); + BlockUntilStart(settings, callback); + + // Read the game settings that were received. + + NET_CL_GetSettings(settings); + } + + if (drone) + { + settings->consoleplayer = 0; + } + + // Set the local player and playeringame[] values. + + localplayer = settings->consoleplayer; + + for (i = 0; i < NET_MAXPLAYERS; ++i) + { + local_playeringame[i] = i < settings->num_players; + } + + // Copy settings to global variables. + + ticdup = settings->ticdup; + new_sync = settings->new_sync; + + // TODO: Message disabled until we fix new_sync. + //if (!new_sync) + //{ + // printf("Syncing netgames like Vanilla Doom.\n"); + //} +#else + settings->consoleplayer = 0; + settings->num_players = 1; + settings->player_classes[0] = player_class; + settings->new_sync = 0; + settings->extratics = 1; + settings->ticdup = 1; + + ticdup = settings->ticdup; + new_sync = settings->new_sync; +#endif +} + +boolean D_InitNetGame(net_connect_data_t *connect_data) +{ + boolean result = false; +#ifdef FEATURE_MULTIPLAYER + net_addr_t *addr = NULL; + int i; +#endif + + // Call D_QuitNetGame on exit: + + I_AtExit(D_QuitNetGame, true); + + player_class = connect_data->player_class; + +#ifdef FEATURE_MULTIPLAYER + + //! + // @category net + // + // Start a multiplayer server, listening for connections. + // + + if (M_CheckParm("-server") > 0 + || M_CheckParm("-privateserver") > 0) + { + NET_SV_Init(); + NET_SV_AddModule(&net_loop_server_module); + NET_SV_AddModule(&net_sdl_module); + NET_SV_RegisterWithMaster(); + + net_loop_client_module.InitClient(); + addr = net_loop_client_module.ResolveAddress(NULL); + } + else + { + //! + // @category net + // + // Automatically search the local LAN for a multiplayer + // server and join it. + // + + i = M_CheckParm("-autojoin"); + + if (i > 0) + { + addr = NET_FindLANServer(); + + if (addr == NULL) + { + I_Error("No server found on local LAN"); + } + } + + //! + // @arg
+ // @category net + // + // Connect to a multiplayer server running on the given + // address. + // + + i = M_CheckParmWithArgs("-connect", 1); + + if (i > 0) + { + net_sdl_module.InitClient(); + addr = net_sdl_module.ResolveAddress(myargv[i+1]); + + if (addr == NULL) + { + I_Error("Unable to resolve '%s'\n", myargv[i+1]); + } + } + } + + if (addr != NULL) + { + if (M_CheckParm("-drone") > 0) + { + connect_data->drone = true; + } + + if (!NET_CL_Connect(addr, connect_data)) + { + I_Error("D_InitNetGame: Failed to connect to %s\n", + NET_AddrToString(addr)); + } + + printf("D_InitNetGame: Connected to %s\n", NET_AddrToString(addr)); + + // Wait for launch message received from server. + + NET_WaitForLaunch(); + + result = true; + } +#endif + + return result; +} + + +// +// D_QuitNetGame +// Called before quitting to leave a net game +// without hanging the other players +// +void D_QuitNetGame (void) +{ +#ifdef FEATURE_MULTIPLAYER + NET_SV_Shutdown(); + NET_CL_Disconnect(); +#endif +} + +static int GetLowTic(void) +{ + int lowtic; + + lowtic = maketic; + +#ifdef FEATURE_MULTIPLAYER + if (net_client_connected) + { + if (drone || recvtic < lowtic) + { + lowtic = recvtic; + } + } +#endif + + return lowtic; +} + +static int frameon; +static int frameskip[4]; +static int oldnettics; + +static void OldNetSync(void) +{ + unsigned int i; + int keyplayer = -1; + + frameon++; + + // ideally maketic should be 1 - 3 tics above lowtic + // if we are consistantly slower, speed up time + + for (i=0 ; i recvtic; + oldnettics = maketic; + + if (frameskip[0] && frameskip[1] && frameskip[2] && frameskip[3]) + { + skiptics = 1; + // printf ("+"); + } + } +} + +// Returns true if there are players in the game: + +static boolean PlayersInGame(void) +{ + boolean result = false; + unsigned int i; + + // If we are connected to a server, check if there are any players + // in the game. + + if (net_client_connected) + { + for (i = 0; i < NET_MAXPLAYERS; ++i) + { + result = result || local_playeringame[i]; + } + } + + // Whether single or multi-player, unless we are running as a drone, + // we are in the game. + + if (!drone) + { + result = true; + } + + return result; +} + +// When using ticdup, certain values must be cleared out when running +// the duplicate ticcmds. + +static void TicdupSquash(ticcmd_set_t *set) +{ + ticcmd_t *cmd; + unsigned int i; + + for (i = 0; i < NET_MAXPLAYERS ; ++i) + { + cmd = &set->cmds[i]; + cmd->chatchar = 0; + if (cmd->buttons & BT_SPECIAL) + cmd->buttons = 0; + } +} + +// When running in single player mode, clear all the ingame[] array +// except the local player. + +static void SinglePlayerClear(ticcmd_set_t *set) +{ + unsigned int i; + + for (i = 0; i < NET_MAXPLAYERS; ++i) + { + if (i != localplayer) + { + set->ingame[i] = false; + } + } +} + +// +// TryRunTics +// + +void TryRunTics (void) +{ + int i; + int lowtic; + int entertic; + static int oldentertics; + int realtics; + int availabletics; + int counts; + + // get real tics + entertic = I_GetTime() / ticdup; + realtics = entertic - oldentertics; + oldentertics = entertic; + + // in singletics mode, run a single tic every time this function + // is called. + + if (singletics) + { + BuildNewTic(); + } + else + { + NetUpdate (); + } + + lowtic = GetLowTic(); + + availabletics = lowtic - gametic/ticdup; + + // decide how many tics to run + + if (new_sync) + { + counts = availabletics; + } + else + { + // decide how many tics to run + if (realtics < availabletics-1) + counts = realtics+1; + else if (realtics < availabletics) + counts = realtics; + else + counts = availabletics; + + if (counts < 1) + counts = 1; + + if (net_client_connected) + { + OldNetSync(); + } + } + + if (counts < 1) + counts = 1; + + // wait for new tics if needed + + while (!PlayersInGame() || lowtic < gametic/ticdup + counts) + { + NetUpdate (); + + lowtic = GetLowTic(); + + if (lowtic < gametic/ticdup) + I_Error ("TryRunTics: lowtic < gametic"); + + // Don't stay in this loop forever. The menu is still running, + // so return to update the screen + + if (I_GetTime() / ticdup - entertic > 0) + { + return; + } + + I_Sleep(1); + } + + // run the count * ticdup dics + while (counts--) + { + ticcmd_set_t *set; + + if (!PlayersInGame()) + { + return; + } + + set = &ticdata[(gametic / ticdup) % BACKUPTICS]; + + if (!net_client_connected) + { + SinglePlayerClear(set); + } + + for (i=0 ; i lowtic) + I_Error ("gametic>lowtic"); + + memcpy(local_playeringame, set->ingame, sizeof(local_playeringame)); + + loop_interface->RunTic(set->cmds, set->ingame); + gametic++; + + // modify command for duplicated tics + + TicdupSquash(set); + } + + NetUpdate (); // check for new console commands + } +} + +void D_RegisterLoopCallbacks(loop_interface_t *i) +{ + loop_interface = i; +} diff --git a/firmware_p4/components/Applications/doom/d_loop.h b/firmware_p4/components/Applications/doom/d_loop.h new file mode 100644 index 000000000..eb87d8488 --- /dev/null +++ b/firmware_p4/components/Applications/doom/d_loop.h @@ -0,0 +1,81 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Main loop stuff. +// + +#ifndef __D_LOOP__ +#define __D_LOOP__ + +#include "net_defs.h" + +// Callback function invoked while waiting for the netgame to start. +// The callback is invoked when new players are ready. The callback +// should return true, or return false to abort startup. + +typedef boolean (*netgame_startup_callback_t)(int ready_players, + int num_players); + +typedef struct +{ + // Read events from the event queue, and process them. + + void (*ProcessEvents)(); + + // Given the current input state, fill in the fields of the specified + // ticcmd_t structure with data for a new tic. + + void (*BuildTiccmd)(ticcmd_t *cmd, int maketic); + + // Advance the game forward one tic, using the specified player input. + + void (*RunTic)(ticcmd_t *cmds, boolean *ingame); + + // Run the menu (runs independently of the game). + + void (*RunMenu)(); +} loop_interface_t; + +// Register callback functions for the main loop code to use. +void D_RegisterLoopCallbacks(loop_interface_t *i); + +// Create any new ticcmds and broadcast to other players. +void NetUpdate (void); + +// Broadcasts special packets to other players +// to notify of game exit +void D_QuitNetGame (void); + +//? how many ticks to run? +void TryRunTics (void); + +// Called at start of game loop to initialize timers +void D_StartGameLoop(void); + +// Initialize networking code and connect to server. + +boolean D_InitNetGame(net_connect_data_t *connect_data); + +// Start game with specified settings. The structure will be updated +// with the actual settings for the game. + +void D_StartNetGame(net_gamesettings_t *settings, + netgame_startup_callback_t callback); + +extern boolean singletics; +extern int gametic, ticdup; + +#endif + diff --git a/firmware_p4/components/Applications/doom/d_main.c b/firmware_p4/components/Applications/doom/d_main.c new file mode 100644 index 000000000..9012e5f54 --- /dev/null +++ b/firmware_p4/components/Applications/doom/d_main.c @@ -0,0 +1,1845 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// DOOM main program (D_DoomMain) and game loop (D_DoomLoop), +// plus functions to determine game mode (shareware, registered), +// parse command line parameters, configure game parameters (turbo), +// and call the startup functions. +// + + +#include +#include +#include +#include + +#include "config.h" +#include "deh_main.h" +#include "doomdef.h" +#include "doomstat.h" + +#include "dstrings.h" +#include "doomfeatures.h" +#include "sounds.h" + +#include "d_iwad.h" + +#include "z_zone.h" +#include "w_main.h" +#include "w_wad.h" +#include "s_sound.h" +#include "v_video.h" + +#include "f_finale.h" +#include "f_wipe.h" + +#include "m_argv.h" +#include "m_config.h" +#include "m_controls.h" +#include "m_misc.h" +#include "m_menu.h" +#include "p_saveg.h" + +#include "i_endoom.h" +#include "i_joystick.h" +#include "i_system.h" +#include "i_timer.h" +#include "i_video.h" + +#include "g_game.h" + +#include "hu_stuff.h" +#include "wi_stuff.h" +#include "st_stuff.h" +#include "am_map.h" +#include "net_client.h" +#include "net_dedicated.h" +#include "net_query.h" + +#include "p_setup.h" +#include "r_local.h" +#include "statdump.h" + +#include "d_main.h" + +// +// D-DoomLoop() +// Not a globally visible function, +// just included for source reference, +// called by D_DoomMain, never exits. +// Manages timing and IO, +// calls all ?_Responder, ?_Ticker, and ?_Drawer, +// calls I_GetTime, I_StartFrame, and I_StartTic +// +void D_DoomLoop (void); + +// Location where savegames are stored + +char * savegamedir; + +// location of IWAD and WAD files + +char * iwadfile; + + +boolean devparm; // started game with -devparm +boolean nomonsters; // checkparm of -nomonsters +boolean respawnparm; // checkparm of -respawn +boolean fastparm; // checkparm of -fast + +//extern int soundVolume; +//extern int sfxVolume; +//extern int musicVolume; + +extern boolean inhelpscreens; + +skill_t startskill; +int startepisode; +int startmap; +boolean autostart; +int startloadgame; + +boolean advancedemo; + +// Store demo, do not accept any inputs +boolean storedemo; + +// "BFG Edition" version of doom2.wad does not include TITLEPIC. +boolean bfgedition; + +// If true, the main game loop has started. +boolean main_loop_started = false; + +char wadfile[1024]; // primary wad file +char mapdir[1024]; // directory of development maps + +int show_endoom = 1; + + +void D_ConnectNetGame(void); +void D_CheckNetGame(void); + + +// +// D_ProcessEvents +// Send all the events of the given timestamp down the responder chain +// +void D_ProcessEvents (void) +{ + event_t* ev; + + // IF STORE DEMO, DO NOT ACCEPT INPUT + if (storedemo) + return; + + while ((ev = D_PopEvent()) != NULL) + { + if (M_Responder (ev)) + continue; // menu ate the event + G_Responder (ev); + } +} + + + + +// +// D_Display +// draw current display, possibly wiping it from the previous +// + +// wipegamestate can be set to -1 to force a wipe on the next draw +gamestate_t wipegamestate = GS_DEMOSCREEN; +extern boolean setsizeneeded; +extern int showMessages; +void R_ExecuteSetViewSize (void); + +void D_Display (void) +{ + static boolean viewactivestate = false; + static boolean menuactivestate = false; + static boolean inhelpscreensstate = false; + static boolean fullscreen = false; + static gamestate_t oldgamestate = -1; + static int borderdrawcount; + int nowtime; + int tics; + int wipestart; + int y; + boolean done; + boolean wipe; + boolean redrawsbar; + + if (nodrawers) + return; // for comparative timing / profiling + + redrawsbar = false; + + // change the view size if needed + if (setsizeneeded) + { + R_ExecuteSetViewSize (); + oldgamestate = -1; // force background redraw + borderdrawcount = 3; + } + + // save the current screen if about to wipe + if (gamestate != wipegamestate) + { + wipe = true; + wipe_StartScreen(0, 0, SCREENWIDTH, SCREENHEIGHT); + } + else + wipe = false; + + if (gamestate == GS_LEVEL && gametic) + HU_Erase(); + + // do buffered drawing + switch (gamestate) + { + case GS_LEVEL: + if (!gametic) + break; + if (automapactive) + AM_Drawer (); + if (wipe || (viewheight != 200 && fullscreen) ) + redrawsbar = true; + if (inhelpscreensstate && !inhelpscreens) + redrawsbar = true; // just put away the help screen + ST_Drawer (viewheight == 200, redrawsbar ); + fullscreen = viewheight == 200; + break; + + case GS_INTERMISSION: + WI_Drawer (); + break; + + case GS_FINALE: + F_Drawer (); + break; + + case GS_DEMOSCREEN: + D_PageDrawer (); + break; + } + + // draw buffered stuff to screen + I_UpdateNoBlit (); + + // draw the view directly + if (gamestate == GS_LEVEL && !automapactive && gametic) + R_RenderPlayerView (&players[displayplayer]); + + if (gamestate == GS_LEVEL && gametic) + HU_Drawer (); + + // clean up border stuff + if (gamestate != oldgamestate && gamestate != GS_LEVEL) + I_SetPalette (W_CacheLumpName (DEH_String("PLAYPAL"),PU_CACHE)); + + // see if the border needs to be initially drawn + if (gamestate == GS_LEVEL && oldgamestate != GS_LEVEL) + { + viewactivestate = false; // view was not active + R_FillBackScreen (); // draw the pattern into the back screen + } + + // see if the border needs to be updated to the screen + if (gamestate == GS_LEVEL && !automapactive && scaledviewwidth != 320) + { + if (menuactive || menuactivestate || !viewactivestate) + borderdrawcount = 3; + if (borderdrawcount) + { + R_DrawViewBorder (); // erase old menu stuff + borderdrawcount--; + } + } + + if (testcontrols) + { + // Box showing current mouse speed + + V_DrawMouseSpeedBox(testcontrols_mousespeed); + } + + menuactivestate = menuactive; + viewactivestate = viewactive; + inhelpscreensstate = inhelpscreens; + oldgamestate = wipegamestate = gamestate; + + // draw pause pic + if (paused) + { + if (automapactive) + y = 4; + else + y = viewwindowy+4; + V_DrawPatchDirect(viewwindowx + (scaledviewwidth - 68) / 2, y, + W_CacheLumpName (DEH_String("M_PAUSE"), PU_CACHE)); + } + + + // menus go directly to the screen + M_Drawer (); // menu is drawn even on top of everything + NetUpdate (); // send out any new accumulation + + + // normal update + if (!wipe) + { + I_FinishUpdate (); // page flip or blit buffer + return; + } + + // wipe update + wipe_EndScreen(0, 0, SCREENWIDTH, SCREENHEIGHT); + + wipestart = I_GetTime () - 1; + + do + { + do + { + nowtime = I_GetTime (); + tics = nowtime - wipestart; + I_Sleep(1); + } while (tics <= 0); + + wipestart = nowtime; + done = wipe_ScreenWipe(wipe_Melt + , 0, 0, SCREENWIDTH, SCREENHEIGHT, tics); + I_UpdateNoBlit (); + M_Drawer (); // menu is drawn even on top of wipes + I_FinishUpdate (); // page flip or blit buffer + } while (!done); +} + +// +// Add configuration file variable bindings. +// + +void D_BindVariables(void) +{ + int i; + + M_ApplyPlatformDefaults(); + + I_BindVideoVariables(); + I_BindJoystickVariables(); + I_BindSoundVariables(); + + M_BindBaseControls(); + M_BindWeaponControls(); + M_BindMapControls(); + M_BindMenuControls(); + M_BindChatControls(MAXPLAYERS); + + key_multi_msgplayer[0] = HUSTR_KEYGREEN; + key_multi_msgplayer[1] = HUSTR_KEYINDIGO; + key_multi_msgplayer[2] = HUSTR_KEYBROWN; + key_multi_msgplayer[3] = HUSTR_KEYRED; + +#ifdef FEATURE_MULTIPLAYER + NET_BindVariables(); +#endif + + M_BindVariable("mouse_sensitivity", &mouseSensitivity); + M_BindVariable("sfx_volume", &sfxVolume); + M_BindVariable("music_volume", &musicVolume); + M_BindVariable("show_messages", &showMessages); + M_BindVariable("screenblocks", &screenblocks); + M_BindVariable("detaillevel", &detailLevel); + M_BindVariable("snd_channels", &snd_channels); + M_BindVariable("vanilla_savegame_limit", &vanilla_savegame_limit); + M_BindVariable("vanilla_demo_limit", &vanilla_demo_limit); + M_BindVariable("show_endoom", &show_endoom); + + // Multiplayer chat macros + + for (i=0; i<10; ++i) + { + char buf[12]; + + M_snprintf(buf, sizeof(buf), "chatmacro%i", i); + M_BindVariable(buf, &chat_macros[i]); + } +} + +// +// D_GrabMouseCallback +// +// Called to determine whether to grab the mouse pointer +// + +boolean D_GrabMouseCallback(void) +{ + // Drone players don't need mouse focus + + if (drone) + return false; + + // when menu is active or game is paused, release the mouse + + if (menuactive || paused) + return false; + + // only grab mouse when playing levels (but not demos) + + return (gamestate == GS_LEVEL) && !demoplayback && !advancedemo; +} + +void doomgeneric_Tick() +{ + // frame syncronous IO operations + I_StartFrame (); + + TryRunTics (); // will run at least one tic + + S_UpdateSounds (players[consoleplayer].mo);// move positional sounds + + // Update display, next frame, with current state. + if (screenvisible) + { + D_Display (); + } +} + +// +// D_DoomLoop +// +void D_DoomLoop (void) +{ + if (bfgedition && + (demorecording || (gameaction == ga_playdemo) || netgame)) + { + printf(" WARNING: You are playing using one of the Doom Classic\n" + " IWAD files shipped with the Doom 3: BFG Edition. These are\n" + " known to be incompatible with the regular IWAD files and\n" + " may cause demos and network games to get out of sync.\n"); + } + + if (demorecording) + G_BeginRecording (); + + main_loop_started = true; + + TryRunTics(); + + I_SetWindowTitle(gamedescription); + I_GraphicsCheckCommandLine(); + I_SetGrabMouseCallback(D_GrabMouseCallback); + I_InitGraphics(); + I_EnableLoadingDisk(); + + V_RestoreBuffer(); + R_ExecuteSetViewSize(); + + D_StartGameLoop(); + + if (testcontrols) + { + wipegamestate = gamestate; + } + + doomgeneric_Tick(); +} + + + +// +// DEMO LOOP +// +int demosequence; +int pagetic; +char *pagename; + + +// +// D_PageTicker +// Handles timing for warped projection +// +void D_PageTicker (void) +{ + if (--pagetic < 0) + D_AdvanceDemo (); +} + + + +// +// D_PageDrawer +// +void D_PageDrawer (void) +{ + V_DrawPatch (0, 0, W_CacheLumpName(pagename, PU_CACHE)); +} + + +// +// D_AdvanceDemo +// Called after each demo or intro demosequence finishes +// +void D_AdvanceDemo (void) +{ + advancedemo = true; +} + + +// +// This cycles through the demo sequences. +// FIXME - version dependend demo numbers? +// +void D_DoAdvanceDemo (void) +{ + players[consoleplayer].playerstate = PST_LIVE; // not reborn + advancedemo = false; + usergame = false; // no save / end game here + paused = false; + gameaction = ga_nothing; + + // The Ultimate Doom executable changed the demo sequence to add + // a DEMO4 demo. Final Doom was based on Ultimate, so also + // includes this change; however, the Final Doom IWADs do not + // include a DEMO4 lump, so the game bombs out with an error + // when it reaches this point in the demo sequence. + + // However! There is an alternate version of Final Doom that + // includes a fixed executable. + + if (gameversion == exe_ultimate || gameversion == exe_final) + demosequence = (demosequence+1)%7; + else + demosequence = (demosequence+1)%6; + + switch (demosequence) + { + case 0: + if ( gamemode == commercial ) + pagetic = TICRATE * 11; + else + pagetic = 170; + gamestate = GS_DEMOSCREEN; + pagename = DEH_String("TITLEPIC"); + if ( gamemode == commercial ) + S_StartMusic(mus_dm2ttl); + else + S_StartMusic (mus_intro); + break; + case 1: + G_DeferedPlayDemo(DEH_String("demo1")); + break; + case 2: + pagetic = 200; + gamestate = GS_DEMOSCREEN; + pagename = DEH_String("CREDIT"); + break; + case 3: + G_DeferedPlayDemo(DEH_String("demo2")); + break; + case 4: + gamestate = GS_DEMOSCREEN; + if ( gamemode == commercial) + { + pagetic = TICRATE * 11; + pagename = DEH_String("TITLEPIC"); + S_StartMusic(mus_dm2ttl); + } + else + { + pagetic = 200; + + if ( gamemode == retail ) + pagename = DEH_String("CREDIT"); + else + pagename = DEH_String("HELP2"); + } + break; + case 5: + G_DeferedPlayDemo(DEH_String("demo3")); + break; + // THE DEFINITIVE DOOM Special Edition demo + case 6: + G_DeferedPlayDemo(DEH_String("demo4")); + break; + } + + // The Doom 3: BFG Edition version of doom2.wad does not have a + // TITLETPIC lump. Use INTERPIC instead as a workaround. + if (bfgedition && !strcasecmp(pagename, "TITLEPIC") + && W_CheckNumForName("titlepic") < 0) + { + pagename = DEH_String("INTERPIC"); + } +} + + + +// +// D_StartTitle +// +void D_StartTitle (void) +{ + gameaction = ga_nothing; + demosequence = -1; + D_AdvanceDemo (); +} + +// Strings for dehacked replacements of the startup banner +// +// These are from the original source: some of them are perhaps +// not used in any dehacked patches + +static char *banners[] = +{ + // doom2.wad + " " + "DOOM 2: Hell on Earth v%i.%i" + " ", + // doom1.wad + " " + "DOOM Shareware Startup v%i.%i" + " ", + // doom.wad + " " + "DOOM Registered Startup v%i.%i" + " ", + // Registered DOOM uses this + " " + "DOOM System Startup v%i.%i" + " ", + // doom.wad (Ultimate DOOM) + " " + "The Ultimate DOOM Startup v%i.%i" + " ", + // tnt.wad + " " + "DOOM 2: TNT - Evilution v%i.%i" + " ", + // plutonia.wad + " " + "DOOM 2: Plutonia Experiment v%i.%i" + " ", +}; + +// +// Get game name: if the startup banner has been replaced, use that. +// Otherwise, use the name given +// + +static char *GetGameName(char *gamename) +{ + size_t i; + char *deh_sub; + + for (i=0; i 0) + { + // Ultimate Doom + + gamemode = retail; + } + else if (W_CheckNumForName("E3M1") > 0) + { + gamemode = registered; + } + else + { + gamemode = shareware; + } + } + else + { + int p; + + // Doom 2 of some kind. + gamemode = commercial; + + // We can manually override the gamemission that we got from the + // IWAD detection code. This allows us to eg. play Plutonia 2 + // with Freedoom and get the right level names. + + //! + // @arg + // + // Explicitly specify a Doom II "mission pack" to run as, instead of + // detecting it based on the filename. Valid values are: "doom2", + // "tnt" and "plutonia". + // + p = M_CheckParmWithArgs("-pack", 1); + if (p > 0) + { + SetMissionForPackName(myargv[p + 1]); + } + } +} + +// Set the gamedescription string + +void D_SetGameDescription(void) +{ + boolean is_freedoom = W_CheckNumForName("FREEDOOM") >= 0, + is_freedm = W_CheckNumForName("FREEDM") >= 0; + + gamedescription = "Unknown"; + + if (logical_gamemission == doom) + { + // Doom 1. But which version? + + if (is_freedoom) + { + gamedescription = GetGameName("Freedoom: Phase 1"); + } + else if (gamemode == retail) + { + // Ultimate Doom + + gamedescription = GetGameName("The Ultimate DOOM"); + } + else if (gamemode == registered) + { + gamedescription = GetGameName("DOOM Registered"); + } + else if (gamemode == shareware) + { + gamedescription = GetGameName("DOOM Shareware"); + } + } + else + { + // Doom 2 of some kind. But which mission? + + if (is_freedoom) + { + if (is_freedm) + { + gamedescription = GetGameName("FreeDM"); + } + else + { + gamedescription = GetGameName("Freedoom: Phase 2"); + } + } + else if (logical_gamemission == doom2) + { + gamedescription = GetGameName("DOOM 2: Hell on Earth"); + } + else if (logical_gamemission == pack_plut) + { + gamedescription = GetGameName("DOOM 2: Plutonia Experiment"); + } + else if (logical_gamemission == pack_tnt) + { + gamedescription = GetGameName("DOOM 2: TNT - Evilution"); + } + } +} + +// print title for every printed line +char title[128]; + +static boolean D_AddFile(char *filename) +{ + wad_file_t *handle; + + printf(" adding %s\n", filename); + handle = W_AddFile(filename); + + return handle != NULL; +} + +// Copyright message banners +// Some dehacked mods replace these. These are only displayed if they are +// replaced by dehacked. + +static char *copyright_banners[] = +{ + "===========================================================================\n" + "ATTENTION: This version of DOOM has been modified. If you would like to\n" + "get a copy of the original game, call 1-800-IDGAMES or see the readme file.\n" + " You will not receive technical support for modified games.\n" + " press enter to continue\n" + "===========================================================================\n", + + "===========================================================================\n" + " Commercial product - do not distribute!\n" + " Please report software piracy to the SPA: 1-800-388-PIR8\n" + "===========================================================================\n", + + "===========================================================================\n" + " Shareware!\n" + "===========================================================================\n" +}; + +// Prints a message only if it has been modified by dehacked. + +void PrintDehackedBanners(void) +{ + size_t i; + + for (i=0; i + // @category compat + // + // Emulate a specific version of Doom. Valid values are "1.9", + // "ultimate", "final", "final2", "hacx" and "chex". + // + + p = M_CheckParmWithArgs("-gameversion", 1); + + if (p) + { + for (i=0; gameversions[i].description != NULL; ++i) + { + if (!strcmp(myargv[p+1], gameversions[i].cmdline)) + { + gameversion = gameversions[i].version; + break; + } + } + + if (gameversions[i].description == NULL) + { + printf("Supported game versions:\n"); + + for (i=0; gameversions[i].description != NULL; ++i) + { + printf("\t%s (%s)\n", gameversions[i].cmdline, + gameversions[i].description); + } + + I_Error("Unknown game version '%s'", myargv[p+1]); + } + } + else + { + // Determine automatically + + if (gamemission == pack_chex) + { + // chex.exe - identified by iwad filename + + gameversion = exe_chex; + } + else if (gamemission == pack_hacx) + { + // hacx.exe: identified by iwad filename + + gameversion = exe_hacx; + } + else if (gamemode == shareware || gamemode == registered) + { + // original + + gameversion = exe_doom_1_9; + + // TODO: Detect IWADs earlier than Doom v1.9. + } + else if (gamemode == retail) + { + gameversion = exe_ultimate; + } + else if (gamemode == commercial) + { + if (gamemission == doom2) + { + gameversion = exe_doom_1_9; + } + else + { + // Final Doom: tnt or plutonia + // Defaults to emulating the first Final Doom executable, + // which has the crash in the demo loop; however, having + // this as the default should mean that it plays back + // most demos correctly. + + gameversion = exe_final; + } + } + } + + // The original exe does not support retail - 4th episode not supported + + if (gameversion < exe_ultimate && gamemode == retail) + { + gamemode = registered; + } + + // EXEs prior to the Final Doom exes do not support Final Doom. + + if (gameversion < exe_final && gamemode == commercial + && (gamemission == pack_tnt || gamemission == pack_plut)) + { + gamemission = doom2; + } +} + +void PrintGameVersion(void) +{ + int i; + + for (i=0; gameversions[i].description != NULL; ++i) + { + if (gameversions[i].version == gameversion) + { + printf("Emulating the behavior of the " + "'%s' executable.\n", gameversions[i].description); + break; + } + } +} + +// Function called at exit to display the ENDOOM screen + +static void D_Endoom(void) +{ + byte *endoom; + + // Don't show ENDOOM if we have it disabled, or we're running + // in screensaver or control test mode. Only show it once the + // game has actually started. + + if (!show_endoom || !main_loop_started + || screensaver_mode || M_CheckParm("-testcontrols") > 0) + { + return; + } + + endoom = W_CacheLumpName(DEH_String("ENDOOM"), PU_STATIC); + + I_Endoom(endoom); + + exit(0); +} + +#if ORIGCODE +// Load dehacked patches needed for certain IWADs. +static void LoadIwadDeh(void) +{ + // The Freedoom IWADs have DEHACKED lumps that must be loaded. + if (W_CheckNumForName("FREEDOOM") >= 0) + { + // Old versions of Freedoom (before 2014-09) did not have technically + // valid DEHACKED lumps, so ignore errors and just continue if this + // is an old IWAD. + DEH_LoadLumpByName("DEHACKED", false, true); + } + + // If this is the HACX IWAD, we need to load the DEHACKED lump. + if (gameversion == exe_hacx) + { + if (!DEH_LoadLumpByName("DEHACKED", true, false)) + { + I_Error("DEHACKED lump not found. Please check that this is the " + "Hacx v1.2 IWAD."); + } + } + + // Chex Quest needs a separate Dehacked patch which must be downloaded + // and installed next to the IWAD. + if (gameversion == exe_chex) + { + char *chex_deh = NULL; + char *sep; + + // Look for chex.deh in the same directory as the IWAD file. + sep = strrchr(iwadfile, DIR_SEPARATOR); + + if (sep != NULL) + { + size_t chex_deh_len = strlen(iwadfile) + 9; + chex_deh = malloc(chex_deh_len); + M_StringCopy(chex_deh, iwadfile, chex_deh_len); + chex_deh[sep - iwadfile + 1] = '\0'; + M_StringConcat(chex_deh, "chex.deh", chex_deh_len); + } + else + { + chex_deh = strdup("chex.deh"); + } + + // If the dehacked patch isn't found, try searching the WAD + // search path instead. We might find it... + if (!M_FileExists(chex_deh)) + { + free(chex_deh); + chex_deh = D_FindWADByName("chex.deh"); + } + + // Still not found? + if (chex_deh == NULL) + { + I_Error("Unable to find Chex Quest dehacked file (chex.deh).\n" + "The dehacked file is required in order to emulate\n" + "chex.exe correctly. It can be found in your nearest\n" + "/idgames repository mirror at:\n\n" + " utils/exe_edit/patches/chexdeh.zip"); + } + + if (!DEH_LoadFile(chex_deh)) + { + I_Error("Failed to load chex.deh needed for emulating chex.exe."); + } + } +} +#endif + +// +// D_DoomMain +// +void D_DoomMain (void) +{ + int p; + char file[256]; + char demolumpname[9]; +#if ORIGCODE + int numiwadlumps; +#endif + + I_AtExit(D_Endoom, false); + + // print banner + + I_PrintBanner(PACKAGE_STRING); + + DEH_printf("Z_Init: Init zone memory allocation daemon. \n"); + Z_Init (); + +#ifdef FEATURE_MULTIPLAYER + //! + // @category net + // + // Start a dedicated server, routing packets but not participating + // in the game itself. + // + + if (M_CheckParm("-dedicated") > 0) + { + printf("Dedicated server mode.\n"); + NET_DedicatedServer(); + + // Never returns + } + + //! + // @category net + // + // Query the Internet master server for a global list of active + // servers. + // + + if (M_CheckParm("-search")) + { + NET_MasterQuery(); + exit(0); + } + + //! + // @arg
+ // @category net + // + // Query the status of the server running on the given IP + // address. + // + + p = M_CheckParmWithArgs("-query", 1); + + if (p) + { + NET_QueryAddress(myargv[p+1]); + exit(0); + } + + //! + // @category net + // + // Search the local LAN for running servers. + // + + if (M_CheckParm("-localsearch")) + { + NET_LANQuery(); + exit(0); + } + +#endif + + //! + // @vanilla + // + // Disable monsters. + // + + nomonsters = M_CheckParm ("-nomonsters"); + + //! + // @vanilla + // + // Monsters respawn after being killed. + // + + respawnparm = M_CheckParm ("-respawn"); + + //! + // @vanilla + // + // Monsters move faster. + // + + fastparm = M_CheckParm ("-fast"); + + //! + // @vanilla + // + // Developer mode. F1 saves a screenshot in the current working + // directory. + // + + devparm = M_CheckParm ("-devparm"); + + I_DisplayFPSDots(devparm); + + //! + // @category net + // @vanilla + // + // Start a deathmatch game. + // + + if (M_CheckParm ("-deathmatch")) + deathmatch = 1; + + //! + // @category net + // @vanilla + // + // Start a deathmatch 2.0 game. Weapons do not stay in place and + // all items respawn after 30 seconds. + // + + if (M_CheckParm ("-altdeath")) + deathmatch = 2; + + if (devparm) + DEH_printf(D_DEVSTR); + + // find which dir to use for config files + +#ifdef _WIN32 + + //! + // @platform windows + // @vanilla + // + // Save configuration data and savegames in c:\doomdata, + // allowing play from CD. + // + + if (M_ParmExists("-cdrom")) + { + printf(D_CDROM); + + M_SetConfigDir("c:\\doomdata\\"); + } + else +#endif + { + // Auto-detect the configuration dir. + + M_SetConfigDir(NULL); + } + + //! + // @arg + // @vanilla + // + // Turbo mode. The player's speed is multiplied by x%. If unspecified, + // x defaults to 200. Values are rounded up to 10 and down to 400. + // + + if ( (p=M_CheckParm ("-turbo")) ) + { + int scale = 200; + extern int forwardmove[2]; + extern int sidemove[2]; + + if (p 400) + scale = 400; + DEH_printf("turbo scale: %i%%\n", scale); + forwardmove[0] = forwardmove[0]*scale/100; + forwardmove[1] = forwardmove[1]*scale/100; + sidemove[0] = sidemove[0]*scale/100; + sidemove[1] = sidemove[1]*scale/100; + } + + // init subsystems + DEH_printf("V_Init: allocate screens.\n"); + V_Init (); + + // Load configuration files before initialising other subsystems. + DEH_printf("M_LoadDefaults: Load system defaults.\n"); + M_SetConfigFilenames("default.cfg", PROGRAM_PREFIX "doom.cfg"); + D_BindVariables(); + M_LoadDefaults(); + + // Save configuration at exit. + I_AtExit(M_SaveDefaults, false); + + // Find main IWAD file and load it. + iwadfile = D_FindIWAD(IWAD_MASK_DOOM, &gamemission); + + // None found? + + if (iwadfile == NULL) + { + I_Error("Game mode indeterminate. No IWAD file was found. Try\n" + "specifying one with the '-iwad' command line parameter.\n"); + } + + modifiedgame = false; + + DEH_printf("W_Init: Init WADfiles.\n"); + D_AddFile(iwadfile); +#if ORIGCODE + numiwadlumps = numlumps; +#endif + + W_CheckCorrectIWAD(doom); + + // Now that we've loaded the IWAD, we can figure out what gamemission + // we're playing and which version of Vanilla Doom we need to emulate. + D_IdentifyVersion(); + InitGameVersion(); + +#if ORIGCODE + //! + // @category mod + // + // Disable automatic loading of Dehacked patches for certain + // IWAD files. + // + if (!M_ParmExists("-nodeh")) + { + // Some IWADs have dehacked patches that need to be loaded for + // them to be played properly. + LoadIwadDeh(); + } +#endif + + // Doom 3: BFG Edition includes modified versions of the classic + // IWADs which can be identified by an additional DMENUPIC lump. + // Furthermore, the M_GDHIGH lumps have been modified in a way that + // makes them incompatible to Vanilla Doom and the modified version + // of doom2.wad is missing the TITLEPIC lump. + // We specifically check for DMENUPIC here, before PWADs have been + // loaded which could probably include a lump of that name. + + if (W_CheckNumForName("dmenupic") >= 0) + { + printf("BFG Edition: Using workarounds as needed.\n"); + bfgedition = true; + + // BFG Edition changes the names of the secret levels to + // censor the Wolfenstein references. It also has an extra + // secret level (MAP33). In Vanilla Doom (meaning the DOS + // version), MAP33 overflows into the Plutonia level names + // array, so HUSTR_33 is actually PHUSTR_1. + + DEH_AddStringReplacement(HUSTR_31, "level 31: idkfa"); + DEH_AddStringReplacement(HUSTR_32, "level 32: keen"); + DEH_AddStringReplacement(PHUSTR_1, "level 33: betray"); + + // The BFG edition doesn't have the "low detail" menu option (fair + // enough). But bizarrely, it reuses the M_GDHIGH patch as a label + // for the options menu (says "Fullscreen:"). Why the perpetrators + // couldn't just add a new graphic lump and had to reuse this one, + // I don't know. + // + // The end result is that M_GDHIGH is too wide and causes the game + // to crash. As a workaround to get a minimum level of support for + // the BFG edition IWADs, use the "ON"/"OFF" graphics instead. + + DEH_AddStringReplacement("M_GDHIGH", "M_MSGON"); + DEH_AddStringReplacement("M_GDLOW", "M_MSGOFF"); + } + +#ifdef FEATURE_DEHACKED + // Load Dehacked patches specified on the command line with -deh. + // Note that there's a very careful and deliberate ordering to how + // Dehacked patches are loaded. The order we use is: + // 1. IWAD dehacked patches. + // 2. Command line dehacked patches specified with -deh. + // 3. PWAD dehacked patches in DEHACKED lumps. + DEH_ParseCommandLine(); +#endif + + // Load PWAD files. + modifiedgame = W_ParseCommandLine(); + + // Debug: +// W_PrintDirectory(); + + //! + // @arg + // @category demo + // @vanilla + // + // Play back the demo named demo.lmp. + // + + p = M_CheckParmWithArgs ("-playdemo", 1); + + if (!p) + { + //! + // @arg + // @category demo + // @vanilla + // + // Play back the demo named demo.lmp, determining the framerate + // of the screen. + // + p = M_CheckParmWithArgs("-timedemo", 1); + + } + + if (p) + { + // With Vanilla you have to specify the file without extension, + // but make that optional. + if (M_StringEndsWith(myargv[p + 1], ".lmp")) + { + M_StringCopy(file, myargv[p + 1], sizeof(file)); + } + else + { + DEH_snprintf(file, sizeof(file), "%s.lmp", myargv[p+1]); + } + + if (D_AddFile(file)) + { + M_StringCopy(demolumpname, lumpinfo[numlumps - 1].name, + sizeof(demolumpname)); + } + else + { + // If file failed to load, still continue trying to play + // the demo in the same way as Vanilla Doom. This makes + // tricks like "-playdemo demo1" possible. + + M_StringCopy(demolumpname, myargv[p + 1], sizeof(demolumpname)); + } + + printf("Playing demo %s.\n", file); + } + + I_AtExit((atexit_func_t) G_CheckDemoStatus, true); + + // Generate the WAD hash table. Speed things up a bit. + W_GenerateHashTable(); + + // Load DEHACKED lumps from WAD files - but only if we give the right + // command line parameter. + +#if ORIGCODE + //! + // @category mod + // + // Load Dehacked patches from DEHACKED lumps contained in one of the + // loaded PWAD files. + // + if (M_ParmExists("-dehlump")) + { + int i, loaded = 0; + + for (i = numiwadlumps; i < numlumps; ++i) + { + if (!strncmp(lumpinfo[i].name, "DEHACKED", 8)) + { + DEH_LoadLump(i, false, false); + loaded++; + } + } + + printf(" loaded %i DEHACKED lumps from PWAD files.\n", loaded); + } +#endif + + // Set the gamedescription string. This is only possible now that + // we've finished loading Dehacked patches. + D_SetGameDescription(); + +#ifdef _WIN32 + // In -cdrom mode, we write savegames to c:\doomdata as well as configs. + if (M_ParmExists("-cdrom")) + { + savegamedir = configdir; + } + else +#endif + { + savegamedir = M_GetSaveGameDir(D_SaveGameIWADName(gamemission)); + } + + // Check for -file in shareware + if (modifiedgame) + { + // These are the lumps that will be checked in IWAD, + // if any one is not present, execution will be aborted. + char name[23][8]= + { + "e2m1","e2m2","e2m3","e2m4","e2m5","e2m6","e2m7","e2m8","e2m9", + "e3m1","e3m3","e3m3","e3m4","e3m5","e3m6","e3m7","e3m8","e3m9", + "dphoof","bfgga0","heada1","cybra1","spida1d1" + }; + int i; + + if ( gamemode == shareware) + I_Error(DEH_String("\nYou cannot -file with the shareware " + "version. Register!")); + + // Check for fake IWAD with right name, + // but w/o all the lumps of the registered version. + if (gamemode == registered) + for (i = 0;i < 23; i++) + if (W_CheckNumForName(name[i])<0) + I_Error(DEH_String("\nThis is not the registered version.")); + } + + if (W_CheckNumForName("SS_START") >= 0 + || W_CheckNumForName("FF_END") >= 0) + { + I_PrintDivider(); + printf(" WARNING: The loaded WAD file contains modified sprites or\n" + " floor textures. You may want to use the '-merge' command\n" + " line option instead of '-file'.\n"); + } + + I_PrintStartupBanner(gamedescription); + PrintDehackedBanners(); + + // Freedoom's IWADs are Boom-compatible, which means they usually + // don't work in Vanilla (though FreeDM is okay). Show a warning + // message and give a link to the website. + if (W_CheckNumForName("FREEDOOM") >= 0 && W_CheckNumForName("FREEDM") < 0) + { + printf(" WARNING: You are playing using one of the Freedoom IWAD\n" + " files, which might not work in this port. See this page\n" + " for more information on how to play using Freedoom:\n" + " http://www.chocolate-doom.org/wiki/index.php/Freedoom\n"); + I_PrintDivider(); + } + + DEH_printf("I_Init: Setting up machine state.\n"); + I_CheckIsScreensaver(); + I_InitTimer(); + I_InitJoystick(); + I_InitSound(true); + I_InitMusic(); + +#ifdef FEATURE_MULTIPLAYER + printf ("NET_Init: Init network subsystem.\n"); + NET_Init (); +#endif + + // Initial netgame startup. Connect to server etc. + D_ConnectNetGame(); + + // get skill / episode / map from parms + startskill = sk_medium; + startepisode = 1; + startmap = 1; + autostart = false; + + //! + // @arg + // @vanilla + // + // Set the game skill, 1-5 (1: easiest, 5: hardest). A skill of + // 0 disables all monsters. + // + + p = M_CheckParmWithArgs("-skill", 1); + + if (p) + { + startskill = myargv[p+1][0]-'1'; + autostart = true; + } + + //! + // @arg + // @vanilla + // + // Start playing on episode n (1-4) + // + + p = M_CheckParmWithArgs("-episode", 1); + + if (p) + { + startepisode = myargv[p+1][0]-'0'; + startmap = 1; + autostart = true; + } + + timelimit = 0; + + //! + // @arg + // @category net + // @vanilla + // + // For multiplayer games: exit each level after n minutes. + // + + p = M_CheckParmWithArgs("-timer", 1); + + if (p) + { + timelimit = atoi(myargv[p+1]); + } + + //! + // @category net + // @vanilla + // + // Austin Virtual Gaming: end levels after 20 minutes. + // + + p = M_CheckParm ("-avg"); + + if (p) + { + timelimit = 20; + } + + //! + // @arg [ | ] + // @vanilla + // + // Start a game immediately, warping to ExMy (Doom 1) or MAPxy + // (Doom 2) + // + + p = M_CheckParmWithArgs("-warp", 1); + + if (p) + { + if (gamemode == commercial) + startmap = atoi (myargv[p+1]); + else + { + startepisode = myargv[p+1][0]-'0'; + + if (p + 2 < myargc) + { + startmap = myargv[p+2][0]-'0'; + } + else + { + startmap = 1; + } + } + autostart = true; + } + + // Undocumented: + // Invoked by setup to test the controls. + + p = M_CheckParm("-testcontrols"); + + if (p > 0) + { + startepisode = 1; + startmap = 1; + autostart = true; + testcontrols = true; + } + + // Check for load game parameter + // We do this here and save the slot number, so that the network code + // can override it or send the load slot to other players. + + //! + // @arg + // @vanilla + // + // Load the game in slot s. + // + + p = M_CheckParmWithArgs("-loadgame", 1); + + if (p) + { + startloadgame = atoi(myargv[p+1]); + } + else + { + // Not loading a game + startloadgame = -1; + } + + DEH_printf("M_Init: Init miscellaneous info.\n"); + M_Init (); + + DEH_printf("R_Init: Init DOOM refresh daemon - "); + R_Init (); + + DEH_printf("\nP_Init: Init Playloop state.\n"); + P_Init (); + + DEH_printf("S_Init: Setting up sound.\n"); + S_Init (sfxVolume * 8, musicVolume * 8); + + DEH_printf("D_CheckNetGame: Checking network game status.\n"); + D_CheckNetGame (); + + PrintGameVersion(); + + DEH_printf("HU_Init: Setting up heads up display.\n"); + HU_Init (); + + DEH_printf("ST_Init: Init status bar.\n"); + ST_Init (); + + // If Doom II without a MAP01 lump, this is a store demo. + // Moved this here so that MAP01 isn't constantly looked up + // in the main loop. + + if (gamemode == commercial && W_CheckNumForName("map01") < 0) + storedemo = true; + + if (M_CheckParmWithArgs("-statdump", 1)) + { + I_AtExit(StatDump, true); + DEH_printf("External statistics registered.\n"); + } + + //! + // @arg + // @category demo + // @vanilla + // + // Record a demo named x.lmp. + // + + p = M_CheckParmWithArgs("-record", 1); + + if (p) + { + G_RecordDemo (myargv[p+1]); + autostart = true; + } + + p = M_CheckParmWithArgs("-playdemo", 1); + if (p) + { + singledemo = true; // quit after one demo + G_DeferedPlayDemo (demolumpname); + D_DoomLoop (); + return; + } + + p = M_CheckParmWithArgs("-timedemo", 1); + if (p) + { + G_TimeDemo (demolumpname); + D_DoomLoop (); + return; + } + + if (startloadgame >= 0) + { + M_StringCopy(file, P_SaveGameFile(startloadgame), sizeof(file)); + G_LoadGame(file); + } + + if (gameaction != ga_loadgame ) + { + if (autostart || netgame) + G_InitNew (startskill, startepisode, startmap); + else + D_StartTitle (); // start up intro loop + } + + D_DoomLoop (); +} + diff --git a/firmware_p4/components/Applications/doom/d_main.h b/firmware_p4/components/Applications/doom/d_main.h new file mode 100644 index 000000000..0fe9547b3 --- /dev/null +++ b/firmware_p4/components/Applications/doom/d_main.h @@ -0,0 +1,50 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// System specific interface stuff. +// + + +#ifndef __D_MAIN__ +#define __D_MAIN__ + +#include "doomdef.h" + + + + +// Read events from all input devices + +void D_ProcessEvents (void); + + +// +// BASE LEVEL +// +void D_PageTicker (void); +void D_PageDrawer (void); +void D_AdvanceDemo (void); +void D_DoAdvanceDemo (void); +void D_StartTitle (void); + +// +// GLOBAL VARIABLES +// + +extern gameaction_t gameaction; + + +#endif + diff --git a/firmware_p4/components/Applications/doom/d_mode.c b/firmware_p4/components/Applications/doom/d_mode.c new file mode 100644 index 000000000..afd84acb3 --- /dev/null +++ b/firmware_p4/components/Applications/doom/d_mode.c @@ -0,0 +1,209 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// +// DESCRIPTION: +// Functions and definitions relating to the game type and operational +// mode. +// + +#include "doomtype.h" +#include "d_mode.h" + +// Valid game mode/mission combinations, with the number of +// episodes/maps for each. + +static struct +{ + GameMission_t mission; + GameMode_t mode; + int episode; + int map; +} valid_modes[] = { + { pack_chex, shareware, 1, 5 }, + { doom, shareware, 1, 9 }, + { doom, registered, 3, 9 }, + { doom, retail, 4, 9 }, + { doom2, commercial, 1, 32 }, + { pack_tnt, commercial, 1, 32 }, + { pack_plut, commercial, 1, 32 }, + { pack_hacx, commercial, 1, 32 }, + { heretic, shareware, 1, 9 }, + { heretic, registered, 3, 9 }, + { heretic, retail, 5, 9 }, + { hexen, commercial, 1, 60 }, + { strife, commercial, 1, 34 }, +}; + +// Check that a gamemode+gamemission received over the network is valid. + +boolean D_ValidGameMode(GameMission_t mission, GameMode_t mode) +{ + int i; + + for (i=0; i= 1 && map <= 3; + } + else if (mode == registered && episode == 4) + { + return map == 1; + } + } + + // Find the table entry for this mission/mode combination. + + for (i=0; i= 1 && episode <= valid_modes[i].episode + && map >= 1 && map <= valid_modes[i].map; + } + } + + // Unknown mode/mission combination + + return false; +} + +// Get the number of valid episodes for the specified mission/mode. + +int D_GetNumEpisodes(GameMission_t mission, GameMode_t mode) +{ + int episode; + + episode = 1; + + while (D_ValidEpisodeMap(mission, mode, episode, 1)) + { + ++episode; + } + + return episode - 1; +} + +// Table of valid versions + +static struct { + GameMission_t mission; + GameVersion_t version; +} valid_versions[] = { + { doom, exe_doom_1_9 }, + { doom, exe_hacx }, + { doom, exe_ultimate }, + { doom, exe_final }, + { doom, exe_final2 }, + { doom, exe_chex }, + { heretic, exe_heretic_1_3 }, + { hexen, exe_hexen_1_1 }, + { strife, exe_strife_1_2 }, + { strife, exe_strife_1_31 }, +}; + +boolean D_ValidGameVersion(GameMission_t mission, GameVersion_t version) +{ + int i; + + // All Doom variants can use the Doom versions. + + if (mission == doom2 || mission == pack_plut || mission == pack_tnt + || mission == pack_hacx || mission == pack_chex) + { + mission = doom; + } + + for (i=0; i + +#include "doomfeatures.h" + +#include "d_main.h" +#include "m_argv.h" +#include "m_menu.h" +#include "m_misc.h" +#include "i_system.h" +#include "i_timer.h" +#include "i_video.h" +#include "g_game.h" +#include "doomdef.h" +#include "doomstat.h" +#include "w_checksum.h" +#include "w_wad.h" + +#include "deh_main.h" + +#include "d_loop.h" + +ticcmd_t *netcmds; + +// Called when a player leaves the game + +static void PlayerQuitGame(player_t *player) +{ + static char exitmsg[80]; + unsigned int player_num; + + player_num = player - players; + + // Do this the same way as Vanilla Doom does, to allow dehacked + // replacements of this message + + M_StringCopy(exitmsg, DEH_String("Player 1 left the game"), + sizeof(exitmsg)); + + exitmsg[7] += player_num; + + playeringame[player_num] = false; + players[consoleplayer].message = exitmsg; + + // TODO: check if it is sensible to do this: + + if (demorecording) + { + G_CheckDemoStatus (); + } +} + +static void RunTic(ticcmd_t *cmds, boolean *ingame) +{ + extern boolean advancedemo; + unsigned int i; + + // Check for player quits. + + for (i = 0; i < MAXPLAYERS; ++i) + { + if (!demoplayback && playeringame[i] && !ingame[i]) + { + PlayerQuitGame(&players[i]); + } + } + + netcmds = cmds; + + // check that there are players in the game. if not, we cannot + // run a tic. + + if (advancedemo) + D_DoAdvanceDemo (); + + G_Ticker (); +} + +static loop_interface_t doom_loop_interface = { + D_ProcessEvents, + G_BuildTiccmd, + RunTic, + M_Ticker +}; + + +// Load game settings from the specified structure and +// set global variables. + +static void LoadGameSettings(net_gamesettings_t *settings) +{ + unsigned int i; + + deathmatch = settings->deathmatch; + startepisode = settings->episode; + startmap = settings->map; + startskill = settings->skill; + startloadgame = settings->loadgame; + lowres_turn = settings->lowres_turn; + nomonsters = settings->nomonsters; + fastparm = settings->fast_monsters; + respawnparm = settings->respawn_monsters; + timelimit = settings->timelimit; + consoleplayer = settings->consoleplayer; + + if (lowres_turn) + { + printf("NOTE: Turning resolution is reduced; this is probably " + "because there is a client recording a Vanilla demo.\n"); + } + + for (i = 0; i < MAXPLAYERS; ++i) + { + playeringame[i] = i < settings->num_players; + } +} + +// Save the game settings from global variables to the specified +// game settings structure. + +static void SaveGameSettings(net_gamesettings_t *settings) +{ + // Fill in game settings structure with appropriate parameters + // for the new game + + settings->deathmatch = deathmatch; + settings->episode = startepisode; + settings->map = startmap; + settings->skill = startskill; + settings->loadgame = startloadgame; + settings->gameversion = gameversion; + settings->nomonsters = nomonsters; + settings->fast_monsters = fastparm; + settings->respawn_monsters = respawnparm; + settings->timelimit = timelimit; + + settings->lowres_turn = M_CheckParm("-record") > 0 + && M_CheckParm("-longtics") == 0; +} + +static void InitConnectData(net_connect_data_t *connect_data) +{ + connect_data->max_players = MAXPLAYERS; + connect_data->drone = false; + + //! + // @category net + // + // Run as the left screen in three screen mode. + // + + if (M_CheckParm("-left") > 0) + { + viewangleoffset = ANG90; + connect_data->drone = true; + } + + //! + // @category net + // + // Run as the right screen in three screen mode. + // + + if (M_CheckParm("-right") > 0) + { + viewangleoffset = ANG270; + connect_data->drone = true; + } + + // + // Connect data + // + + // Game type fields: + + connect_data->gamemode = gamemode; + connect_data->gamemission = gamemission; + + // Are we recording a demo? Possibly set lowres turn mode + + connect_data->lowres_turn = M_CheckParm("-record") > 0 + && M_CheckParm("-longtics") == 0; + + // Read checksums of our WAD directory and dehacked information + + W_Checksum(connect_data->wad_sha1sum); + +#if ORIGCODE + DEH_Checksum(connect_data->deh_sha1sum); +#endif + + // Are we playing with the Freedoom IWAD? + + connect_data->is_freedoom = W_CheckNumForName("FREEDOOM") >= 0; +} + +void D_ConnectNetGame(void) +{ + net_connect_data_t connect_data; + + InitConnectData(&connect_data); + netgame = D_InitNetGame(&connect_data); + + //! + // @category net + // + // Start the game playing as though in a netgame with a single + // player. This can also be used to play back single player netgame + // demos. + // + + if (M_CheckParm("-solo-net") > 0) + { + netgame = true; + } +} + +// +// D_CheckNetGame +// Works out player numbers among the net participants +// +void D_CheckNetGame (void) +{ + net_gamesettings_t settings; + + if (netgame) + { + autostart = true; + } + + D_RegisterLoopCallbacks(&doom_loop_interface); + + SaveGameSettings(&settings); + D_StartNetGame(&settings, NULL); + LoadGameSettings(&settings); + + DEH_printf("startskill %i deathmatch: %i startmap: %i startepisode: %i\n", + startskill, deathmatch, startmap, startepisode); + + DEH_printf("player %i of %i (%i nodes)\n", + consoleplayer+1, settings.num_players, settings.num_players); + + // Show players here; the server might have specified a time limit + + if (timelimit > 0 && deathmatch) + { + // Gross hack to work like Vanilla: + + if (timelimit == 20 && M_CheckParm("-avg")) + { + DEH_printf("Austin Virtual Gaming: Levels will end " + "after 20 minutes\n"); + } + else + { + DEH_printf("Levels will end after %d minute", timelimit); + if (timelimit > 1) + printf("s"); + printf(".\n"); + } + } +} + diff --git a/firmware_p4/components/Applications/doom/d_player.h b/firmware_p4/components/Applications/doom/d_player.h new file mode 100644 index 000000000..a72c2f5f1 --- /dev/null +++ b/firmware_p4/components/Applications/doom/d_player.h @@ -0,0 +1,209 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// +// + + +#ifndef __D_PLAYER__ +#define __D_PLAYER__ + + +// The player data structure depends on a number +// of other structs: items (internal inventory), +// animation states (closely tied to the sprites +// used to represent them, unfortunately). +#include "d_items.h" +#include "p_pspr.h" + +// In addition, the player is just a special +// case of the generic moving object/actor. +#include "p_mobj.h" + +// Finally, for odd reasons, the player input +// is buffered within the player data struct, +// as commands per game tick. +#include "d_ticcmd.h" + +#include "net_defs.h" + + + + +// +// Player states. +// +typedef enum +{ + // Playing or camping. + PST_LIVE, + // Dead on the ground, view follows killer. + PST_DEAD, + // Ready to restart/respawn??? + PST_REBORN + +} playerstate_t; + + +// +// Player internal flags, for cheats and debug. +// +typedef enum +{ + // No clipping, walk through barriers. + CF_NOCLIP = 1, + // No damage, no health loss. + CF_GODMODE = 2, + // Not really a cheat, just a debug aid. + CF_NOMOMENTUM = 4 + +} cheat_t; + + +// +// Extended player object info: player_t +// +typedef struct player_s +{ + mobj_t* mo; + playerstate_t playerstate; + ticcmd_t cmd; + + // Determine POV, + // including viewpoint bobbing during movement. + // Focal origin above r.z + fixed_t viewz; + // Base height above floor for viewz. + fixed_t viewheight; + // Bob/squat speed. + fixed_t deltaviewheight; + // bounded/scaled total momentum. + fixed_t bob; + + // This is only used between levels, + // mo->health is used during levels. + int health; + int armorpoints; + // Armor type is 0-2. + int armortype; + + // Power ups. invinc and invis are tic counters. + int powers[NUMPOWERS]; + boolean cards[NUMCARDS]; + boolean backpack; + + // Frags, kills of other players. + int frags[MAXPLAYERS]; + weapontype_t readyweapon; + + // Is wp_nochange if not changing. + weapontype_t pendingweapon; + + boolean weaponowned[NUMWEAPONS]; + int ammo[NUMAMMO]; + int maxammo[NUMAMMO]; + + // True if button down last tic. + int attackdown; + int usedown; + + // Bit flags, for cheats and debug. + // See cheat_t, above. + int cheats; + + // Refired shots are less accurate. + int refire; + + // For intermission stats. + int killcount; + int itemcount; + int secretcount; + + // Hint messages. + char* message; + + // For screen flashing (red or bright). + int damagecount; + int bonuscount; + + // Who did damage (NULL for floors/ceilings). + mobj_t* attacker; + + // So gun flashes light up areas. + int extralight; + + // Current PLAYPAL, ??? + // can be set to REDCOLORMAP for pain, etc. + int fixedcolormap; + + // Player skin colorshift, + // 0-3 for which color to draw player. + int colormap; + + // Overlay view sprites (gun, etc). + pspdef_t psprites[NUMPSPRITES]; + + // True if secret level has been done. + boolean didsecret; + +} player_t; + + +// +// INTERMISSION +// Structure passed e.g. to WI_Start(wb) +// +typedef struct +{ + boolean in; // whether the player is in game + + // Player stats, kills, collected items etc. + int skills; + int sitems; + int ssecret; + int stime; + int frags[4]; + int score; // current score on entry, modified on return + +} wbplayerstruct_t; + +typedef struct +{ + int epsd; // episode # (0-2) + + // if true, splash the secret level + boolean didsecret; + + // previous and next levels, origin 0 + int last; + int next; + + int maxkills; + int maxitems; + int maxsecret; + int maxfrags; + + // the par time + int partime; + + // index of this player in game + int pnum; + + wbplayerstruct_t plyr[MAXPLAYERS]; + +} wbstartstruct_t; + + +#endif diff --git a/firmware_p4/components/Applications/doom/d_textur.h b/firmware_p4/components/Applications/doom/d_textur.h new file mode 100644 index 000000000..1afe040eb --- /dev/null +++ b/firmware_p4/components/Applications/doom/d_textur.h @@ -0,0 +1,43 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Typedefs related to to textures etc., +// isolated here to make it easier separating modules. +// + + +#ifndef __D_TEXTUR__ +#define __D_TEXTUR__ + +#include "doomtype.h" + + + + +// +// Flats? +// +// a pic is an unmasked block of pixels +typedef struct +{ + byte width; + byte height; + byte data; +} pic_t; + + + + +#endif diff --git a/firmware_p4/components/Applications/doom/d_think.h b/firmware_p4/components/Applications/doom/d_think.h new file mode 100644 index 000000000..0966ad960 --- /dev/null +++ b/firmware_p4/components/Applications/doom/d_think.h @@ -0,0 +1,68 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// MapObj data. Map Objects or mobjs are actors, entities, +// thinker, take-your-pick... anything that moves, acts, or +// suffers state changes of more or less violent nature. +// + + +#ifndef __D_THINK__ +#define __D_THINK__ + + + + + +// +// Experimental stuff. +// To compile this as "ANSI C with classes" +// we will need to handle the various +// action functions cleanly. +// +typedef void (*actionf_v)(); +typedef void (*actionf_p1)( void* ); +typedef void (*actionf_p2)( void*, void* ); + +typedef union +{ + actionf_v acv; + actionf_p1 acp1; + actionf_p2 acp2; + +} actionf_t; + + + + + +// Historically, "think_t" is yet another +// function pointer to a routine to handle +// an actor. +typedef actionf_t think_t; + + +// Doubly linked list of actors. +typedef struct thinker_s +{ + struct thinker_s* prev; + struct thinker_s* next; + think_t function; + +} thinker_t; + + + +#endif diff --git a/firmware_p4/components/Applications/doom/d_ticcmd.h b/firmware_p4/components/Applications/doom/d_ticcmd.h new file mode 100644 index 000000000..daf0da318 --- /dev/null +++ b/firmware_p4/components/Applications/doom/d_ticcmd.h @@ -0,0 +1,56 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 1993-2008 Raven Software +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// System specific interface stuff. +// + + +#ifndef __D_TICCMD__ +#define __D_TICCMD__ + +#include "doomtype.h" + + +// The data sampled per tick (single player) +// and transmitted to other peers (multiplayer). +// Mainly movements/button commands per game tick, +// plus a checksum for internal state consistency. + +typedef struct +{ + signed char forwardmove; // *2048 for move + signed char sidemove; // *2048 for move + short angleturn; // <<16 for angle delta + byte chatchar; + byte buttons; + // villsa [STRIFE] according to the asm, + // consistancy is a short, not a byte + byte consistancy; // checks for net game + + // villsa - Strife specific: + + byte buttons2; + int inventory; + + // Heretic/Hexen specific: + + byte lookfly; // look/fly up/down/centering + byte arti; // artitype_t to use +} ticcmd_t; + + + +#endif diff --git a/firmware_p4/components/Applications/doom/deh_main.h b/firmware_p4/components/Applications/doom/deh_main.h new file mode 100644 index 000000000..10ac2360e --- /dev/null +++ b/firmware_p4/components/Applications/doom/deh_main.h @@ -0,0 +1,48 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// +// Dehacked entrypoint and common code +// + +#ifndef DEH_MAIN_H +#define DEH_MAIN_H + +#include "doomtype.h" +#include "doomfeatures.h" +#include "deh_str.h" +#include "sha1.h" + +// These are the limits that dehacked uses (from dheinit.h in the dehacked +// source). If these limits are exceeded, it does not generate an error, but +// a warning is displayed. + +#define DEH_VANILLA_NUMSTATES 966 +#define DEH_VANILLA_NUMSFX 107 + +void DEH_ParseCommandLine(void); +int DEH_LoadFile(char *filename); +int DEH_LoadLump(int lumpnum, boolean allow_long, boolean allow_error); +int DEH_LoadLumpByName(char *name, boolean allow_long, boolean allow_error); + +boolean DEH_ParseAssignment(char *line, char **variable_name, char **value); + +void DEH_Checksum(sha1_digest_t digest); + +extern boolean deh_allow_extended_strings; +extern boolean deh_allow_long_strings; +extern boolean deh_allow_long_cheats; +extern boolean deh_apply_cheats; + +#endif /* #ifndef DEH_MAIN_H */ + diff --git a/firmware_p4/components/Applications/doom/deh_misc.h b/firmware_p4/components/Applications/doom/deh_misc.h new file mode 100644 index 000000000..319a1451a --- /dev/null +++ b/firmware_p4/components/Applications/doom/deh_misc.h @@ -0,0 +1,83 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// +// Parses "Misc" sections in dehacked files +// + +#ifndef DEH_MISC_H +#define DEH_MISC_H + +#include "doomfeatures.h" + +#define DEH_DEFAULT_INITIAL_HEALTH 100 +#define DEH_DEFAULT_INITIAL_BULLETS 50 +#define DEH_DEFAULT_MAX_HEALTH 200 +#define DEH_DEFAULT_MAX_ARMOR 200 +#define DEH_DEFAULT_GREEN_ARMOR_CLASS 1 +#define DEH_DEFAULT_BLUE_ARMOR_CLASS 2 +#define DEH_DEFAULT_MAX_SOULSPHERE 200 +#define DEH_DEFAULT_SOULSPHERE_HEALTH 100 +#define DEH_DEFAULT_MEGASPHERE_HEALTH 200 +#define DEH_DEFAULT_GOD_MODE_HEALTH 100 +#define DEH_DEFAULT_IDFA_ARMOR 200 +#define DEH_DEFAULT_IDFA_ARMOR_CLASS 2 +#define DEH_DEFAULT_IDKFA_ARMOR 200 +#define DEH_DEFAULT_IDKFA_ARMOR_CLASS 2 +#define DEH_DEFAULT_BFG_CELLS_PER_SHOT 40 +#define DEH_DEFAULT_SPECIES_INFIGHTING 0 + +#ifdef FEATURE_DEHACKED + +extern int deh_initial_health; +extern int deh_initial_bullets; +extern int deh_max_health; +extern int deh_max_armor; +extern int deh_green_armor_class; +extern int deh_blue_armor_class; +extern int deh_max_soulsphere; +extern int deh_soulsphere_health; +extern int deh_megasphere_health; +extern int deh_god_mode_health; +extern int deh_idfa_armor; +extern int deh_idfa_armor_class; +extern int deh_idkfa_armor; +extern int deh_idkfa_armor_class; +extern int deh_bfg_cells_per_shot; +extern int deh_species_infighting; + +#else + +// If dehacked is disabled, hard coded values + +#define deh_initial_health DEH_DEFAULT_INITIAL_HEALTH +#define deh_initial_bullets DEH_DEFAULT_INITIAL_BULLETS +#define deh_max_health DEH_DEFAULT_MAX_HEALTH +#define deh_max_armor DEH_DEFAULT_MAX_ARMOR +#define deh_green_armor_class DEH_DEFAULT_GREEN_ARMOR_CLASS +#define deh_blue_armor_class DEH_DEFAULT_BLUE_ARMOR_CLASS +#define deh_max_soulsphere DEH_DEFAULT_MAX_SOULSPHERE +#define deh_soulsphere_health DEH_DEFAULT_SOULSPHERE_HEALTH +#define deh_megasphere_health DEH_DEFAULT_MEGASPHERE_HEALTH +#define deh_god_mode_health DEH_DEFAULT_GOD_MODE_HEALTH +#define deh_idfa_armor DEH_DEFAULT_IDFA_ARMOR +#define deh_idfa_armor_class DEH_DEFAULT_IDFA_ARMOR_CLASS +#define deh_idkfa_armor DEH_DEFAULT_IDKFA_ARMOR +#define deh_idkfa_armor_class DEH_DEFAULT_IDKFA_ARMOR_CLASS +#define deh_bfg_cells_per_shot DEH_DEFAULT_BFG_CELLS_PER_SHOT +#define deh_species_infighting DEH_DEFAULT_SPECIES_INFIGHTING + +#endif + +#endif /* #ifndef DEH_MISC_H */ + diff --git a/firmware_p4/components/Applications/doom/deh_str.h b/firmware_p4/components/Applications/doom/deh_str.h new file mode 100644 index 000000000..cdecaf0e5 --- /dev/null +++ b/firmware_p4/components/Applications/doom/deh_str.h @@ -0,0 +1,47 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// +// Dehacked string replacements +// + +#ifndef DEH_STR_H +#define DEH_STR_H + +#include + +#include "doomfeatures.h" + +// Used to do dehacked text substitutions throughout the program + +#ifdef FEATURE_DEHACKED + +char *DEH_String(char *s); +void DEH_printf(char *fmt, ...); +void DEH_fprintf(FILE *fstream, char *fmt, ...); +void DEH_snprintf(char *buffer, size_t len, char *fmt, ...); +void DEH_AddStringReplacement(char *from_text, char *to_text); + + +#else + +#define DEH_String(x) (x) +#define DEH_printf printf +#define DEH_fprintf fprintf +#define DEH_snprintf snprintf +#define DEH_AddStringReplacement(x, y) + +#endif + +#endif /* #ifndef DEH_STR_H */ + diff --git a/firmware_p4/components/Applications/doom/doom.h b/firmware_p4/components/Applications/doom/doom.h new file mode 100644 index 000000000..3c0d0be74 --- /dev/null +++ b/firmware_p4/components/Applications/doom/doom.h @@ -0,0 +1,42 @@ +/* + * doom.h + * + * Created on: 18.02.2015 + * Author: Florian + */ + + +#ifndef SRC_CHOCDOOM_DOOM_H_ +#define SRC_CHOCDOOM_DOOM_H_ + +/*---------------------------------------------------------------------* + * additional includes * + *---------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------* + * global definitions * + *---------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------* + * type declarations * + *---------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------* + * function prototypes * + *---------------------------------------------------------------------*/ + +void D_DoomMain (void); + +/*---------------------------------------------------------------------* + * global data * + *---------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------* + * inline functions and function-like macros * + *---------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------* + * eof * + *---------------------------------------------------------------------*/ + +#endif /* SRC_CHOCDOOM_DOOM_H_ */ diff --git a/firmware_p4/components/Applications/doom/doom_sound_highboy.c b/firmware_p4/components/Applications/doom/doom_sound_highboy.c new file mode 100644 index 000000000..fd1c52572 --- /dev/null +++ b/firmware_p4/components/Applications/doom/doom_sound_highboy.c @@ -0,0 +1,158 @@ +// HighBoy DOOM sound backend (replaces the SDL_mixer module). Provides the +// DG_sound_module (SFX) + DG_music_module (no-op) that i_sound.c references when +// FEATURE_SOUND is defined. SFX are DMX lumps (8-bit unsigned PCM); a mixer task +// sums the active channels and streams mono 16-bit PCM to the NS4168 via I2S. +// Music (MIDI/MUS) is not synthesised — the music module is a silent stub. + +#include +#include +#include + +#include "doomtype.h" +#include "i_sound.h" +#include "w_wad.h" +#include "z_zone.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/idf_additions.h" +#include "esp_heap_caps.h" +#include "esp_log.h" +#include "audio_i2s.h" + +#define ARRLEN(a) ((int)(sizeof(a) / sizeof((a)[0]))) +#define NUM_CH 16 // matches DOOM's max sfx channels +#define OUT_RATE 11025 // DOOM sfx native rate; per-channel resample handles others + +typedef struct { + const uint8_t *pcm; // 8-bit unsigned PCM (into the cached WAD lump) + uint32_t len; // sample count + volatile uint32_t pos; // 16.16 fixed-point read position + uint32_t step; // 16.16 increment = src_rate / OUT_RATE + volatile int vol; // 0..127 + volatile bool active; +} sfxchan_t; + +static sfxchan_t s_ch[NUM_CH]; +static bool s_use_prefix; +static bool s_started; + +// Config vars that i_sound.c's I_BindSoundVariables() references (were defined +// in the excluded i_sdlsound.c). We don't use libsamplerate, but must provide them. +int use_libsamplerate = 0; +float libsamplerate_scale = 0.65f; + +static snddevice_t sfx_devices[] = { + SNDDEVICE_SB, SNDDEVICE_PAS, SNDDEVICE_GUS, + SNDDEVICE_WAVEBLASTER, SNDDEVICE_SOUNDCANVAS, SNDDEVICE_AWE32, +}; + +static void mixer_task(void *arg) { + (void)arg; + if (audio_i2s_stream_start(OUT_RATE) != ESP_OK) { + ESP_LOGE("DOOM_SND", "stream start failed — no sound"); + for (;;) vTaskDelay(pdMS_TO_TICKS(1000)); + } + const int N = 512; + int16_t *out = heap_caps_malloc(N * sizeof(int16_t), MALLOC_CAP_SPIRAM); + if (!out) { for (;;) vTaskDelay(pdMS_TO_TICKS(1000)); } + for (;;) { + for (int i = 0; i < N; i++) { + int acc = 0; + for (int c = 0; c < NUM_CH; c++) { + sfxchan_t *ch = &s_ch[c]; + if (!ch->active) continue; + uint32_t idx = ch->pos >> 16; + if (idx >= ch->len) { ch->active = false; continue; } + int s = (int)ch->pcm[idx] - 128; // 8-bit unsigned -> signed + acc += s * ch->vol; // vol 0..127 + ch->pos += ch->step; + } + if (acc > 32767) acc = 32767; + else if (acc < -32768) acc = -32768; + out[i] = (int16_t)acc; + } + audio_i2s_stream_write(out, N); + } +} + +static boolean I_HB_InitSound(boolean use_sfx_prefix) { + s_use_prefix = use_sfx_prefix; + memset(s_ch, 0, sizeof(s_ch)); + if (!s_started) { + xTaskCreatePinnedToCoreWithCaps(mixer_task, "doom_snd", 4096, NULL, 6, NULL, 0, + MALLOC_CAP_SPIRAM); + s_started = true; + } + return true; +} +static void I_HB_ShutdownSound(void) {} + +static int I_HB_GetSfxLumpNum(sfxinfo_t *sfx) { + char nm[16]; + if (s_use_prefix) snprintf(nm, sizeof(nm), "ds%s", sfx->name); + else snprintf(nm, sizeof(nm), "%s", sfx->name); + return W_CheckNumForName(nm); +} + +static int I_HB_StartSound(sfxinfo_t *sfx, int channel, int vol, int sep) { + (void)sep; + if (channel < 0 || channel >= NUM_CH) return channel; + int lump = sfx->lumpnum; + if (lump < 0) lump = I_HB_GetSfxLumpNum(sfx); + if (lump < 0) return channel; + const uint8_t *data = W_CacheLumpNum(lump, PU_STATIC); + int lumplen = W_LumpLength(lump); + if (!data || lumplen < 8) return channel; + uint16_t rate = (uint16_t)(data[2] | (data[3] << 8)); + uint32_t plen = (uint32_t)data[4] | ((uint32_t)data[5] << 8) | + ((uint32_t)data[6] << 16) | ((uint32_t)data[7] << 24); + if (rate == 0) rate = OUT_RATE; + if (plen + 8 > (uint32_t)lumplen) plen = (uint32_t)lumplen - 8; + + s_ch[channel].active = false; // retire any old sound first + s_ch[channel].pcm = data + 8; // skip 8-byte DMX header + s_ch[channel].len = plen; + s_ch[channel].pos = 0; + s_ch[channel].step = (uint32_t)(((uint64_t)rate << 16) / OUT_RATE); + s_ch[channel].vol = vol; + s_ch[channel].active = true; + return channel; +} +static void I_HB_StopSound(int ch) { if (ch >= 0 && ch < NUM_CH) s_ch[ch].active = false; } +static boolean I_HB_SoundIsPlaying(int ch) { return (ch >= 0 && ch < NUM_CH) && s_ch[ch].active; } +static void I_HB_UpdateSoundParams(int ch, int vol, int sep) { + (void)sep; + if (ch >= 0 && ch < NUM_CH) s_ch[ch].vol = vol; +} +static void I_HB_Update(void) {} +static void I_HB_CacheSounds(sfxinfo_t *sounds, int num) { (void)sounds; (void)num; } + +sound_module_t DG_sound_module = { + sfx_devices, ARRLEN(sfx_devices), + I_HB_InitSound, I_HB_ShutdownSound, I_HB_GetSfxLumpNum, I_HB_Update, + I_HB_UpdateSoundParams, I_HB_StartSound, I_HB_StopSound, I_HB_SoundIsPlaying, + I_HB_CacheSounds, +}; + +// --- music: silent stub ----------------------------------------------------- +static snddevice_t mus_devices[] = { + SNDDEVICE_GENMIDI, SNDDEVICE_ADLIB, SNDDEVICE_SB, SNDDEVICE_PAS, SNDDEVICE_GUS, +}; +static boolean M_Init(void) { return true; } +static void M_Shutdown(void) {} +static void M_SetVol(int v) { (void)v; } +static void M_Pause(void) {} +static void M_Resume(void) {} +static void *M_Register(void *d, int l) { (void)d; (void)l; return NULL; } +static void M_Unregister(void *h) { (void)h; } +static void M_Play(void *h, boolean loop) { (void)h; (void)loop; } +static void M_Stop(void) {} +static boolean M_IsPlaying(void) { return false; } +static void M_Poll(void) {} + +music_module_t DG_music_module = { + mus_devices, ARRLEN(mus_devices), + M_Init, M_Shutdown, M_SetVol, M_Pause, M_Resume, + M_Register, M_Unregister, M_Play, M_Stop, M_IsPlaying, M_Poll, +}; diff --git a/firmware_p4/components/Applications/doom/doomdata.h b/firmware_p4/components/Applications/doom/doomdata.h new file mode 100644 index 000000000..46b3e11b6 --- /dev/null +++ b/firmware_p4/components/Applications/doom/doomdata.h @@ -0,0 +1,213 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// all external data is defined here +// most of the data is loaded into different structures at run time +// some internal structures shared by many modules are here +// + +#ifndef __DOOMDATA__ +#define __DOOMDATA__ + +// The most basic types we use, portability. +#include "doomtype.h" + +// Some global defines, that configure the game. +#include "doomdef.h" + + + +// +// Map level types. +// The following data structures define the persistent format +// used in the lumps of the WAD files. +// + +// Lump order in a map WAD: each map needs a couple of lumps +// to provide a complete scene geometry description. +enum +{ + ML_LABEL, // A separator, name, ExMx or MAPxx + ML_THINGS, // Monsters, items.. + ML_LINEDEFS, // LineDefs, from editing + ML_SIDEDEFS, // SideDefs, from editing + ML_VERTEXES, // Vertices, edited and BSP splits generated + ML_SEGS, // LineSegs, from LineDefs split by BSP + ML_SSECTORS, // SubSectors, list of LineSegs + ML_NODES, // BSP nodes + ML_SECTORS, // Sectors, from editing + ML_REJECT, // LUT, sector-sector visibility + ML_BLOCKMAP // LUT, motion clipping, walls/grid element +}; + + +// A single Vertex. +typedef struct +{ + short x; + short y; +} PACKEDATTR mapvertex_t; + + +// A SideDef, defining the visual appearance of a wall, +// by setting textures and offsets. +typedef struct +{ + short textureoffset; + short rowoffset; + char toptexture[8]; + char bottomtexture[8]; + char midtexture[8]; + // Front sector, towards viewer. + short sector; +} PACKEDATTR mapsidedef_t; + + + +// A LineDef, as used for editing, and as input +// to the BSP builder. +typedef struct +{ + short v1; + short v2; + short flags; + short special; + short tag; + // sidenum[1] will be -1 if one sided + short sidenum[2]; +} PACKEDATTR maplinedef_t; + + +// +// LineDef attributes. +// + +// Solid, is an obstacle. +#define ML_BLOCKING 1 + +// Blocks monsters only. +#define ML_BLOCKMONSTERS 2 + +// Backside will not be present at all +// if not two sided. +#define ML_TWOSIDED 4 + +// If a texture is pegged, the texture will have +// the end exposed to air held constant at the +// top or bottom of the texture (stairs or pulled +// down things) and will move with a height change +// of one of the neighbor sectors. +// Unpegged textures allways have the first row of +// the texture at the top pixel of the line for both +// top and bottom textures (use next to windows). + +// upper texture unpegged +#define ML_DONTPEGTOP 8 + +// lower texture unpegged +#define ML_DONTPEGBOTTOM 16 + +// In AutoMap: don't map as two sided: IT'S A SECRET! +#define ML_SECRET 32 + +// Sound rendering: don't let sound cross two of these. +#define ML_SOUNDBLOCK 64 + +// Don't draw on the automap at all. +#define ML_DONTDRAW 128 + +// Set if already seen, thus drawn in automap. +#define ML_MAPPED 256 + + + + +// Sector definition, from editing. +typedef struct +{ + short floorheight; + short ceilingheight; + char floorpic[8]; + char ceilingpic[8]; + short lightlevel; + short special; + short tag; +} PACKEDATTR mapsector_t; + +// SubSector, as generated by BSP. +typedef struct +{ + short numsegs; + // Index of first one, segs are stored sequentially. + short firstseg; +} PACKEDATTR mapsubsector_t; + + +// LineSeg, generated by splitting LineDefs +// using partition lines selected by BSP builder. +typedef struct +{ + short v1; + short v2; + short angle; + short linedef; + short side; + short offset; +} PACKEDATTR mapseg_t; + + + +// BSP node structure. + +// Indicate a leaf. +#define NF_SUBSECTOR 0x8000 + +typedef struct +{ + // Partition line from (x,y) to x+dx,y+dy) + short x; + short y; + short dx; + short dy; + + // Bounding box for each child, + // clip against view frustum. + short bbox[2][4]; + + // If NF_SUBSECTOR its a subsector, + // else it's a node of another subtree. + unsigned short children[2]; + +} PACKEDATTR mapnode_t; + + + + +// Thing definition, position, orientation and type, +// plus skill/visibility flags and attributes. +typedef struct +{ + short x; + short y; + short angle; + short type; + short options; +} PACKEDATTR mapthing_t; + + + + + +#endif // __DOOMDATA__ diff --git a/firmware_p4/components/Applications/doom/doomdef.c b/firmware_p4/components/Applications/doom/doomdef.c new file mode 100644 index 000000000..d31f3efa2 --- /dev/null +++ b/firmware_p4/components/Applications/doom/doomdef.c @@ -0,0 +1,28 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// DoomDef - basic defines for DOOM, e.g. Version, game mode +// and skill level, and display parameters. +// + + + +#include "doomdef.h" + +// Location for any defines turned variables. + +// None. + + diff --git a/firmware_p4/components/Applications/doom/doomdef.h b/firmware_p4/components/Applications/doom/doomdef.h new file mode 100644 index 000000000..62d729ddb --- /dev/null +++ b/firmware_p4/components/Applications/doom/doomdef.h @@ -0,0 +1,168 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Internally used data structures for virtually everything, +// lots of other stuff. +// + +#ifndef __DOOMDEF__ +#define __DOOMDEF__ + +#include +#include + +#include "doomtype.h" +#include "i_timer.h" +#include "d_mode.h" + +// +// Global parameters/defines. +// +// DOOM version +#define DOOM_VERSION 109 + +// Version code for cph's longtics hack ("v1.91") +#define DOOM_191_VERSION 111 + + +// If rangecheck is undefined, +// most parameter validation debugging code will not be compiled +#define RANGECHECK + +// The maximum number of players, multiplayer/networking. +#define MAXPLAYERS 4 + +// The current state of the game: whether we are +// playing, gazing at the intermission screen, +// the game final animation, or a demo. +typedef enum +{ + GS_LEVEL, + GS_INTERMISSION, + GS_FINALE, + GS_DEMOSCREEN, +} gamestate_t; + +typedef enum +{ + ga_nothing, + ga_loadlevel, + ga_newgame, + ga_loadgame, + ga_savegame, + ga_playdemo, + ga_completed, + ga_victory, + ga_worlddone, + ga_screenshot +} gameaction_t; + +// +// Difficulty/skill settings/filters. +// + +// Skill flags. +#define MTF_EASY 1 +#define MTF_NORMAL 2 +#define MTF_HARD 4 + +// Deaf monsters/do not react to sound. +#define MTF_AMBUSH 8 + + +// +// Key cards. +// +typedef enum +{ + it_bluecard, + it_yellowcard, + it_redcard, + it_blueskull, + it_yellowskull, + it_redskull, + + NUMCARDS + +} card_t; + + + +// The defined weapons, +// including a marker indicating +// user has not changed weapon. +typedef enum +{ + wp_fist, + wp_pistol, + wp_shotgun, + wp_chaingun, + wp_missile, + wp_plasma, + wp_bfg, + wp_chainsaw, + wp_supershotgun, + + NUMWEAPONS, + + // No pending weapon change. + wp_nochange + +} weapontype_t; + + +// Ammunition types defined. +typedef enum +{ + am_clip, // Pistol / chaingun ammo. + am_shell, // Shotgun / double barreled shotgun. + am_cell, // Plasma rifle, BFG. + am_misl, // Missile launcher. + NUMAMMO, + am_noammo // Unlimited for chainsaw / fist. + +} ammotype_t; + + +// Power up artifacts. +typedef enum +{ + pw_invulnerability, + pw_strength, + pw_invisibility, + pw_ironfeet, + pw_allmap, + pw_infrared, + NUMPOWERS + +} powertype_t; + + + +// +// Power up durations, +// how many seconds till expiration, +// assuming TICRATE is 35 ticks/second. +// +typedef enum +{ + INVULNTICS = (30*TICRATE), + INVISTICS = (60*TICRATE), + INFRATICS = (120*TICRATE), + IRONTICS = (60*TICRATE) + +} powerduration_t; + +#endif // __DOOMDEF__ diff --git a/firmware_p4/components/Applications/doom/doomfeatures.h b/firmware_p4/components/Applications/doom/doomfeatures.h new file mode 100644 index 000000000..dff693611 --- /dev/null +++ b/firmware_p4/components/Applications/doom/doomfeatures.h @@ -0,0 +1,40 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// List of features which can be enabled/disabled to slim down the +// program. +// + +#ifndef DOOM_FEATURES_H +#define DOOM_FEATURES_H + +// Enables wad merging (the '-merge' command line parameter) + +#undef FEATURE_WAD_MERGE + +// Enables dehacked support ('-deh') + +#undef FEATURE_DEHACKED + +// Enables multiplayer support (network games) + +#undef FEATURE_MULTIPLAYER + +// Enables sound output + +//#undef FEATURE_SOUND + +#endif /* #ifndef DOOM_FEATURES_H */ + + diff --git a/firmware_p4/components/Applications/doom/doomgeneric.c b/firmware_p4/components/Applications/doom/doomgeneric.c new file mode 100644 index 000000000..881d70077 --- /dev/null +++ b/firmware_p4/components/Applications/doom/doomgeneric.c @@ -0,0 +1,27 @@ +#include + +#include "m_argv.h" + +#include "doomgeneric.h" + +pixel_t* DG_ScreenBuffer = NULL; + +void M_FindResponseFile(void); +void D_DoomMain (void); + + +void doomgeneric_Create(int argc, char **argv) +{ + // save arguments + myargc = argc; + myargv = argv; + + M_FindResponseFile(); + + DG_ScreenBuffer = malloc(DOOMGENERIC_RESX * DOOMGENERIC_RESY * 4); + + DG_Init(); + + D_DoomMain (); +} + diff --git a/firmware_p4/components/Applications/doom/doomgeneric.h b/firmware_p4/components/Applications/doom/doomgeneric.h new file mode 100644 index 000000000..fd8708f42 --- /dev/null +++ b/firmware_p4/components/Applications/doom/doomgeneric.h @@ -0,0 +1,49 @@ +#ifndef DOOM_GENERIC +#define DOOM_GENERIC + +#include +#include + +#ifndef DOOMGENERIC_RESX +#define DOOMGENERIC_RESX 640 +#endif // DOOMGENERIC_RESX + +#ifndef DOOMGENERIC_RESY +#define DOOMGENERIC_RESY 400 +#endif // DOOMGENERIC_RESY + + +#ifdef CMAP256 + +typedef uint8_t pixel_t; + +#else // CMAP256 + +typedef uint32_t pixel_t; + +#endif // CMAP256 + + +extern pixel_t* DG_ScreenBuffer; + +#ifdef __cplusplus +extern "C" { +#endif + +void doomgeneric_Create(int argc, char **argv); +void doomgeneric_Tick(); + + +//Implement below functions for your platform +void DG_Init(); +void DG_DrawFrame(); +void DG_SleepMs(uint32_t ms); +uint32_t DG_GetTicksMs(); +int DG_GetKey(int* pressed, unsigned char* key); +void DG_SetWindowTitle(const char * title); + +#ifdef __cplusplus +} +#endif + +#endif //DOOM_GENERIC diff --git a/firmware_p4/components/Applications/doom/doomgeneric_highboy.c b/firmware_p4/components/Applications/doom/doomgeneric_highboy.c new file mode 100644 index 000000000..79286d75b --- /dev/null +++ b/firmware_p4/components/Applications/doom/doomgeneric_highboy.c @@ -0,0 +1,312 @@ +// HighBoy (ESP32-P4) platform layer for doomgeneric. +// +// Implements the six DG_* hooks + a launcher that runs DOOM in its own task: +// - DG_DrawFrame : DG_ScreenBuffer (ARGB8888, DOOMGENERIC_RESX x RESY) -> RGB565 +// big-endian, blitted directly to the ST7789 (bypassing LVGL) +// in landscape (320x240), letterboxed to DOOM's 320x200. +// - DG_GetKey : drained from a ring buffer filled by a polling input task that +// maps the 6 physical buttons (D-pad + OK + BACK) to DOOM keys, +// with an OK+BACK chord = ESC (menu) and hold-both ~2s = quit. +// - timing : esp_timer / FreeRTOS ticks. +// The WAD is streamed from /sdcard/doom1.wad. Zone memory comes from PSRAM +// automatically (CONFIG_SPIRAM_USE_MALLOC: large mallocs land in PSRAM). +// +// Exit model: doomgeneric_Create() runs DOOM's own infinite loop and never +// returns, so "quit to launcher" = esp_restart() (clean reboot into the UI). + +#include +#include +#include +#include +#include +#include +#include + +#include "doomgeneric.h" +#include "doomkeys.h" +#include "doom_highboy.h" + +#include "freertos/FreeRTOS.h" +#include "freertos/task.h" +#include "freertos/idf_additions.h" // xTaskCreatePinnedToCoreWithCaps +#include "esp_timer.h" +#include "esp_log.h" +#include "esp_system.h" +#include "esp_heap_caps.h" +#include "esp_lcd_panel_ops.h" + +#include "st7789.h" // extern panel_handle +#include "buttons_gpio.h" // *_button_is_down() +#include "lvgl_glue.h" // lvgl_glue_direct_begin() +#include "storage_init.h" // storage_is_mounted(), storage_init() + +static const char *TAG = "DOOM"; + +// ---- geometry ------------------------------------------------------------- +#define DG_W DOOMGENERIC_RESX // 320 +#define DG_H DOOMGENERIC_RESY // 200 +#define PANEL_W 320 // ST7789 in landscape (swap_xy) +#define PANEL_H 240 +#define Y_OFF ((PANEL_H - DG_H) / 2) // 20px letterbox top/bottom +#define STRIP 20 // blit height per SPI burst (avoid corruption) + +static uint16_t *s_fb[2]; // double-buffered RGB565 (big-endian) frames +static int s_fb_sel; + +// Pulsed once per frame to keep the sys_monitor render-liveness beat alive while +// DOOM owns the panel and the LVGL task is parked (see doom_main_task). +static void (*s_beat_kick)(void); + +// ---- timing --------------------------------------------------------------- +uint32_t DG_GetTicksMs(void) { return (uint32_t)(esp_timer_get_time() / 1000); } +void DG_SleepMs(uint32_t ms) { vTaskDelay(pdMS_TO_TICKS(ms ? ms : 1)); } +void DG_SetWindowTitle(const char *title) { (void)title; } + +// ---- input ring buffer (filled by doom_input_task, drained by DG_GetKey) -- +#define KQ 64 +static volatile struct { int pressed; unsigned char key; } s_kq[KQ]; +static volatile int s_kq_head, s_kq_tail; + +static void kq_push(int pressed, unsigned char key) { + int n = (s_kq_head + 1) % KQ; + if (n == s_kq_tail) return; // full: drop + s_kq[s_kq_head].pressed = pressed; + s_kq[s_kq_head].key = key; + s_kq_head = n; +} + +int DG_GetKey(int *pressed, unsigned char *key) { + if (s_kq_tail == s_kq_head) return 0; + *pressed = s_kq[s_kq_tail].pressed; + *key = s_kq[s_kq_tail].key; + s_kq_tail = (s_kq_tail + 1) % KQ; + return 1; +} + +// Simple edge helper for the D-pad (one-shot press/release into the ring). +static void edge(bool now, bool *prev, unsigned char key) { + if (now && !*prev) { kq_push(1, key); *prev = true; } + else if (!now && *prev) { kq_push(0, key); *prev = false; } +} + +// Poll the 6 buttons and translate to DOOM keys. Mapping: +// D-pad -> arrows, ROTATED 90° for landscape (UP->LEFT DOWN->RIGHT RIGHT->UP LEFT->DOWN) +// OK -> FIRE (+ENTER so it also selects in menus) +// BACK -> USE (open doors/switches) +// OK+BACK pressed together (within ~250ms) -> ESCAPE (open/close menu) +// OK+BACK held together ~2s -> quit to launcher (esp_restart) +static void doom_input_task(void *arg) { + (void)arg; + bool p_up = 0, p_dn = 0, p_l = 0, p_r = 0; + bool ok_c = 0, bk_c = 0; // OK / BACK committed as their own key + bool ok_sw = 0, bk_sw = 0; // swallow until physical release (post-chord) + bool chord = 0; // ESC chord active + int64_t t_ok = 0, t_bk = 0, t_chord = 0; + + for (;;) { + bool up = up_button_is_down(), dn = down_button_is_down(); + bool l = left_button_is_down(), r = right_button_is_down(); + bool ok = ok_button_is_down(), bk = back_button_is_down(); + int64_t now = esp_timer_get_time() / 1000; + + // D-pad rotated 90° for landscape play (device held sideways): + edge(up, &p_up, KEY_LEFTARROW); // physical UP -> game LEFT + edge(dn, &p_dn, KEY_RIGHTARROW); // physical DOWN -> game RIGHT + edge(r, &p_r, KEY_UPARROW); // physical RIGHT -> game UP + edge(l, &p_l, KEY_DOWNARROW); // physical LEFT -> game DOWN + + // Track when OK / BACK physically went down (for the chord window). + static bool pok = 0, pbk = 0; + if (ok && !pok) t_ok = now; + if (bk && !pbk) t_bk = now; + + if (chord) { + if (ok && bk) { + if (now - t_chord >= 2000) { // hold both ~2s -> quit to launcher + ESP_LOGW(TAG, "quit gesture -> esp_restart()"); + vTaskDelay(pdMS_TO_TICKS(50)); + esp_restart(); + } + } else { // one released -> close chord + kq_push(0, KEY_ESCAPE); + chord = 0; + ok_sw = ok; // swallow whatever is still held + bk_sw = bk; + } + } else if (ok && bk && !ok_sw && !bk_sw && + (t_ok > t_bk ? t_ok - t_bk : t_bk - t_ok) <= 250) { + // enter chord: retract any single-key commits, send ESC down + if (ok_c) { kq_push(0, KEY_FIRE); kq_push(0, KEY_ENTER); ok_c = 0; } + if (bk_c) { kq_push(0, KEY_USE); bk_c = 0; } + kq_push(1, KEY_ESCAPE); + chord = 1; + t_chord = now; + } else { + // normal handling; honor swallow-until-release + if (ok_sw && !ok) ok_sw = 0; + if (bk_sw && !bk) bk_sw = 0; + bool ok_eff = ok && !ok_sw; + bool bk_eff = bk && !bk_sw; + if (ok_eff && !ok_c) { kq_push(1, KEY_FIRE); kq_push(1, KEY_ENTER); ok_c = 1; } + else if (!ok_eff && ok_c) { kq_push(0, KEY_FIRE); kq_push(0, KEY_ENTER); ok_c = 0; } + if (bk_eff && !bk_c) { kq_push(1, KEY_USE); bk_c = 1; } + else if (!bk_eff && bk_c) { kq_push(0, KEY_USE); bk_c = 0; } + } + + pok = ok; pbk = bk; + vTaskDelay(pdMS_TO_TICKS(15)); + } +} + +// ---- framebuffer ---------------------------------------------------------- +static inline uint16_t argb_to_565be(uint32_t p) { + uint8_t r = (p >> 16) & 0xFF, g = (p >> 8) & 0xFF, b = p & 0xFF; + uint16_t c = ((r & 0xF8) << 8) | ((g & 0xFC) << 3) | (b >> 3); + return (uint16_t)((c >> 8) | (c << 8)); // ST7789 wants big-endian RGB565 +} + +static void panel_clear_black(void) { + // Fill the whole 320x240 landscape panel black once (letterbox stays black). + uint16_t *row = heap_caps_malloc(PANEL_W * STRIP * sizeof(uint16_t), + MALLOC_CAP_DMA | MALLOC_CAP_INTERNAL); + if (!row) return; + memset(row, 0, PANEL_W * STRIP * sizeof(uint16_t)); + for (int y = 0; y < PANEL_H; y += STRIP) { + int rows = (y + STRIP <= PANEL_H) ? STRIP : (PANEL_H - y); + esp_lcd_panel_draw_bitmap(panel_handle, 0, y, PANEL_W, y + rows, row); + } + vTaskDelay(pdMS_TO_TICKS(30)); // let the blits drain before freeing + heap_caps_free(row); +} + +void DG_Init(void) { + for (int i = 0; i < 2; i++) + s_fb[i] = heap_caps_malloc(DG_W * DG_H * sizeof(uint16_t), MALLOC_CAP_SPIRAM); + ESP_LOGW(TAG, "DG_Init: fb0=%p fb1=%p (%d bytes each)", s_fb[0], s_fb[1], + DG_W * DG_H * (int)sizeof(uint16_t)); + // Input runs in its own task (DOOM's loop blocks this task via Create()). + // Stack in PSRAM — internal RAM is scarce (~30 KB free after full boot). + xTaskCreatePinnedToCoreWithCaps(doom_input_task, "doom_in", 4096, NULL, 6, NULL, 0, + MALLOC_CAP_SPIRAM); +} + +void DG_DrawFrame(void) { + uint16_t *fb = s_fb[s_fb_sel]; + if (!fb) return; + s_fb_sel ^= 1; // ping-pong so the previous frame's DMA can still be in flight + + const uint32_t *src = (const uint32_t *)DG_ScreenBuffer; + const int n = DG_W * DG_H; + for (int i = 0; i < n; i++) fb[i] = argb_to_565be(src[i]); + + for (int y = 0; y < DG_H; y += STRIP) { + int rows = (y + STRIP <= DG_H) ? STRIP : (DG_H - y); + esp_lcd_panel_draw_bitmap(panel_handle, 0, Y_OFF + y, DG_W, Y_OFF + y + rows, + &fb[y * DG_W]); + } +} + +// ---- WAD discovery -------------------------------------------------------- +static bool ends_with_wad(const char *name) { + size_t n = strlen(name); + return n >= 4 && strcasecmp(name + n - 4, ".wad") == 0; +} + +// List a directory to the log and return the first *.wad found (full path). +static bool scan_dir_for_wad(const char *dir, char *out, size_t outsz) { + DIR *d = opendir(dir); + if (!d) return false; + ESP_LOGW(TAG, "listing %s:", dir); + bool found = false; + struct dirent *e; + while ((e = readdir(d)) != NULL) { + ESP_LOGI(TAG, " %s", e->d_name); + if (!found && ends_with_wad(e->d_name)) { + snprintf(out, outsz, "%s/%s", dir, e->d_name); + found = true; + } + } + closedir(d); + return found; +} + +// Find a WAD: try common exact paths, then scan the SD root and /sdcard/doom +// for any *.wad. Robust to subfolders and name/case differences. +static bool find_wad(char *out, size_t outsz) { + static const char *cands[] = { + "/sdcard/doom1.wad", "/sdcard/doom.wad", + "/sdcard/DOOM1.WAD", "/sdcard/DOOM.WAD", + "/sdcard/doom/doom1.wad", "/sdcard/doom/doom.wad", NULL}; + for (int i = 0; cands[i]; i++) { + FILE *f = fopen(cands[i], "rb"); + if (f) { fclose(f); snprintf(out, outsz, "%s", cands[i]); return true; } + } + if (scan_dir_for_wad("/sdcard", out, outsz)) return true; + if (scan_dir_for_wad("/sdcard/doom", out, outsz)) return true; + return false; +} + +// ---- launcher ------------------------------------------------------------- +static void doom_main_task(void *arg) { + (void)arg; + ESP_LOGW(TAG, "doom_main_task: enter (free int=%u psram=%u)", + (unsigned)heap_caps_get_free_size(MALLOC_CAP_INTERNAL), + (unsigned)heap_caps_get_free_size(MALLOC_CAP_SPIRAM)); + vTaskDelay(pdMS_TO_TICKS(150)); // let the UI screen switch settle + + // Own the display exclusively: direct-draw routes the panel's DMA-done callback + // to DOOM (not LVGL), and holding the LVGL lock forever parks the LVGL task so + // it never flushes or fights DOOM for the SPI3 bus. The sys_monitor render beat + // is fed by s_beat_kick() in the loop instead of by LVGL. Quitting reboots, so + // the lock is never released. + lvgl_glue_direct_begin(); + lvgl_glue_lock(-1); + ESP_LOGW(TAG, "doom_main_task: panel owned (LVGL parked)"); + + // Landscape 320x240 so DOOM's 320-wide frame fits (portrait is only 240 wide). + esp_lcd_panel_swap_xy(panel_handle, true); + esp_lcd_panel_mirror(panel_handle, true, false); + panel_clear_black(); + ESP_LOGW(TAG, "doom_main_task: panel landscape + cleared"); + + if (!storage_is_mounted()) { + ESP_LOGW(TAG, "SD not mounted, mounting..."); + storage_init(); + } + // Locate a WAD (lists the SD so you can see what's there). Fail loudly rather + // than hang inside DOOM's I_Error if none is present. + static char wadpath[128]; + if (!find_wad(wadpath, sizeof(wadpath))) { + ESP_LOGE(TAG, "No .wad found on SD (checked /sdcard and /sdcard/doom)."); + ESP_LOGE(TAG, "Copy doom1.wad to the SD root, then reboot."); + for (;;) vTaskDelay(pdMS_TO_TICKS(2000)); + } + chdir("/sdcard"); // DOOM writes config/saves relative to CWD (SD mount point) + + ESP_LOGW(TAG, "starting DOOM (wad=%s). Quit = hold OK+BACK ~2s.", wadpath); + static char *argv[] = {"doom", "-iwad", wadpath, NULL}; + doomgeneric_Create(3, argv); // init only (D_DoomMain/D_DoomLoop return after 1 tick) + + // doomgeneric's design: the platform drives the game loop by calling + // doomgeneric_Tick() repeatedly (D_DoomLoop runs ONE tick then returns). + for (;;) { + doomgeneric_Tick(); + // LVGL is parked, so feed the render-liveness beat ourselves. + if (s_beat_kick != NULL) + s_beat_kick(); + // Yield 1 tick (1ms @1kHz) so core 1's IDLE task runs and resets the task + // watchdog; doomgeneric's tic loop never blocks on its own. + vTaskDelay(1); + } +} + +void highboy_doom_start(void (*render_beat_kick)(void)) { + s_beat_kick = render_beat_kick; + // 48 KB stack in PSRAM: DOOM recurses deeply (R_RenderBSPNode) and internal + // RAM is nearly exhausted after boot (~30 KB), so an internal stack can't be + // allocated. WithCaps puts the stack in the ample 32 MB PSRAM. + BaseType_t ok = xTaskCreatePinnedToCoreWithCaps( + doom_main_task, "doom", 49152, NULL, 5, NULL, 1, MALLOC_CAP_SPIRAM); + ESP_LOGW(TAG, "highboy_doom_start: task create -> %s", + ok == pdPASS ? "OK" : "FAILED"); +} diff --git a/firmware_p4/components/Applications/doom/doomkeys.h b/firmware_p4/components/Applications/doom/doomkeys.h new file mode 100644 index 000000000..2dfc431b9 --- /dev/null +++ b/firmware_p4/components/Applications/doom/doomkeys.h @@ -0,0 +1,97 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Key definitions +// + +#ifndef __DOOMKEYS__ +#define __DOOMKEYS__ + +// +// DOOM keyboard definition. +// This is the stuff configured by Setup.Exe. +// Most key data are simple ascii (uppercased). +// +#define KEY_RIGHTARROW 0xae +#define KEY_LEFTARROW 0xac +#define KEY_UPARROW 0xad +#define KEY_DOWNARROW 0xaf +#define KEY_STRAFE_L 0xa0 +#define KEY_STRAFE_R 0xa1 +#define KEY_USE 0xa2 +#define KEY_FIRE 0xa3 +#define KEY_ESCAPE 27 +#define KEY_ENTER 13 +#define KEY_TAB 9 +#define KEY_F1 (0x80+0x3b) +#define KEY_F2 (0x80+0x3c) +#define KEY_F3 (0x80+0x3d) +#define KEY_F4 (0x80+0x3e) +#define KEY_F5 (0x80+0x3f) +#define KEY_F6 (0x80+0x40) +#define KEY_F7 (0x80+0x41) +#define KEY_F8 (0x80+0x42) +#define KEY_F9 (0x80+0x43) +#define KEY_F10 (0x80+0x44) +#define KEY_F11 (0x80+0x57) +#define KEY_F12 (0x80+0x58) + +#define KEY_BACKSPACE 0x7f +#define KEY_PAUSE 0xff + +#define KEY_EQUALS 0x3d +#define KEY_MINUS 0x2d + +#define KEY_RSHIFT (0x80+0x36) +#define KEY_RCTRL (0x80+0x1d) +#define KEY_RALT (0x80+0x38) + +#define KEY_LALT KEY_RALT + +// new keys: + +#define KEY_CAPSLOCK (0x80+0x3a) +#define KEY_NUMLOCK (0x80+0x45) +#define KEY_SCRLCK (0x80+0x46) +#define KEY_PRTSCR (0x80+0x59) + +#define KEY_HOME (0x80+0x47) +#define KEY_END (0x80+0x4f) +#define KEY_PGUP (0x80+0x49) +#define KEY_PGDN (0x80+0x51) +#define KEY_INS (0x80+0x52) +#define KEY_DEL (0x80+0x53) + +#define KEYP_0 0 +#define KEYP_1 KEY_END +#define KEYP_2 KEY_DOWNARROW +#define KEYP_3 KEY_PGDN +#define KEYP_4 KEY_LEFTARROW +#define KEYP_5 '5' +#define KEYP_6 KEY_RIGHTARROW +#define KEYP_7 KEY_HOME +#define KEYP_8 KEY_UPARROW +#define KEYP_9 KEY_PGUP + +#define KEYP_DIVIDE '/' +#define KEYP_PLUS '+' +#define KEYP_MINUS '-' +#define KEYP_MULTIPLY '*' +#define KEYP_PERIOD 0 +#define KEYP_EQUALS KEY_EQUALS +#define KEYP_ENTER KEY_ENTER + +#endif // __DOOMKEYS__ + diff --git a/firmware_p4/components/Applications/doom/doomstat.c b/firmware_p4/components/Applications/doom/doomstat.c new file mode 100644 index 000000000..ed4c6ccc3 --- /dev/null +++ b/firmware_p4/components/Applications/doom/doomstat.c @@ -0,0 +1,35 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Put all global tate variables here. +// + +#include + +#include "doomstat.h" + + +// Game Mode - identify IWAD as shareware, retail etc. +GameMode_t gamemode = indetermined; +GameMission_t gamemission = doom; +GameVersion_t gameversion = exe_final2; +char *gamedescription; + +// Set if homebrew PWAD stuff has been added. +boolean modifiedgame; + + + + diff --git a/firmware_p4/components/Applications/doom/doomstat.h b/firmware_p4/components/Applications/doom/doomstat.h new file mode 100644 index 000000000..acd65dcca --- /dev/null +++ b/firmware_p4/components/Applications/doom/doomstat.h @@ -0,0 +1,281 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// All the global variables that store the internal state. +// Theoretically speaking, the internal state of the engine +// should be found by looking at the variables collected +// here, and every relevant module will have to include +// this header file. +// In practice, things are a bit messy. +// + + +#ifndef __D_STATE__ +#define __D_STATE__ + +// We need globally shared data structures, +// for defining the global state variables. +#include "doomdata.h" +#include "d_loop.h" + +// We need the playr data structure as well. +#include "d_player.h" + +// Game mode/mission +#include "d_mode.h" + +#include "net_defs.h" + + + +// ------------------------ +// Command line parameters. +// +extern boolean nomonsters; // checkparm of -nomonsters +extern boolean respawnparm; // checkparm of -respawn +extern boolean fastparm; // checkparm of -fast + +extern boolean devparm; // DEBUG: launched with -devparm + + +// ----------------------------------------------------- +// Game Mode - identify IWAD as shareware, retail etc. +// +extern GameMode_t gamemode; +extern GameMission_t gamemission; +extern GameVersion_t gameversion; +extern char *gamedescription; + +// If true, we're using one of the mangled BFG edition IWADs. +extern boolean bfgedition; + +// Convenience macro. +// 'gamemission' can be equal to pack_chex or pack_hacx, but these are +// just modified versions of doom and doom2, and should be interpreted +// as the same most of the time. + +#define logical_gamemission \ + (gamemission == pack_chex ? doom : \ + gamemission == pack_hacx ? doom2 : gamemission) + +// Set if homebrew PWAD stuff has been added. +extern boolean modifiedgame; + + +// ------------------------------------------- +// Selected skill type, map etc. +// + +// Defaults for menu, methinks. +extern skill_t startskill; +extern int startepisode; +extern int startmap; + +// Savegame slot to load on startup. This is the value provided to +// the -loadgame option. If this has not been provided, this is -1. + +extern int startloadgame; + +extern boolean autostart; + +// Selected by user. +extern skill_t gameskill; +extern int gameepisode; +extern int gamemap; + +// If non-zero, exit the level after this number of minutes +extern int timelimit; + +// Nightmare mode flag, single player. +extern boolean respawnmonsters; + +// Netgame? Only true if >1 player. +extern boolean netgame; + +// 0=Cooperative; 1=Deathmatch; 2=Altdeath +extern int deathmatch; + +// ------------------------- +// Internal parameters for sound rendering. +// These have been taken from the DOS version, +// but are not (yet) supported with Linux +// (e.g. no sound volume adjustment with menu. + +// From m_menu.c: +// Sound FX volume has default, 0 - 15 +// Music volume has default, 0 - 15 +// These are multiplied by 8. +extern int sfxVolume; +extern int musicVolume; + +// Current music/sfx card - index useless +// w/o a reference LUT in a sound module. +// Ideally, this would use indices found +// in: /usr/include/linux/soundcard.h +extern int snd_MusicDevice; +extern int snd_SfxDevice; +// Config file? Same disclaimer as above. +extern int snd_DesiredMusicDevice; +extern int snd_DesiredSfxDevice; + + +// ------------------------- +// Status flags for refresh. +// + +// Depending on view size - no status bar? +// Note that there is no way to disable the +// status bar explicitely. +extern boolean statusbaractive; + +extern boolean automapactive; // In AutoMap mode? +extern boolean menuactive; // Menu overlayed? +extern boolean paused; // Game Pause? + + +extern boolean viewactive; + +extern boolean nodrawers; + + +extern boolean testcontrols; +extern int testcontrols_mousespeed; + + + + +// This one is related to the 3-screen display mode. +// ANG90 = left side, ANG270 = right +extern int viewangleoffset; + +// Player taking events, and displaying. +extern int consoleplayer; +extern int displayplayer; + + +// ------------------------------------- +// Scores, rating. +// Statistics on a given map, for intermission. +// +extern int totalkills; +extern int totalitems; +extern int totalsecret; + +// Timer, for scores. +extern int levelstarttic; // gametic at level start +extern int leveltime; // tics in game play for par + + + +// -------------------------------------- +// DEMO playback/recording related stuff. +// No demo, there is a human player in charge? +// Disable save/end game? +extern boolean usergame; + +//? +extern boolean demoplayback; +extern boolean demorecording; + +// Round angleturn in ticcmds to the nearest 256. This is used when +// recording Vanilla demos in netgames. + +extern boolean lowres_turn; + +// Quit after playing a demo from cmdline. +extern boolean singledemo; + + + + +//? +extern gamestate_t gamestate; + + + + + + +//----------------------------- +// Internal parameters, fixed. +// These are set by the engine, and not changed +// according to user inputs. Partly load from +// WAD, partly set at startup time. + + + +// Bookkeeping on players - state. +extern player_t players[MAXPLAYERS]; + +// Alive? Disconnected? +extern boolean playeringame[MAXPLAYERS]; + + +// Player spawn spots for deathmatch. +#define MAX_DM_STARTS 10 +extern mapthing_t deathmatchstarts[MAX_DM_STARTS]; +extern mapthing_t* deathmatch_p; + +// Player spawn spots. +extern mapthing_t playerstarts[MAXPLAYERS]; + +// Intermission stats. +// Parameters for world map / intermission. +extern wbstartstruct_t wminfo; + + + + + + + +//----------------------------------------- +// Internal parameters, used for engine. +// + +// File handling stuff. +extern char * savegamedir; +extern char basedefault[1024]; + +// if true, load all graphics at level load +extern boolean precache; + + +// wipegamestate can be set to -1 +// to force a wipe on the next draw +extern gamestate_t wipegamestate; + +extern int mouseSensitivity; + +extern int bodyqueslot; + + + +// Needed to store the number of the dummy sky flat. +// Used for rendering, +// as well as tracking projectiles etc. +extern int skyflatnum; + + + +// Netgame stuff (buffers and pointers, i.e. indices). + + +extern int rndindex; + +extern ticcmd_t *netcmds; + + +#endif diff --git a/firmware_p4/components/Applications/doom/doomtype.h b/firmware_p4/components/Applications/doom/doomtype.h new file mode 100644 index 000000000..dc14bc5da --- /dev/null +++ b/firmware_p4/components/Applications/doom/doomtype.h @@ -0,0 +1,104 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Simple basic typedefs, isolated here to make it easier +// separating modules. +// + + +#ifndef __DOOMTYPE__ +#define __DOOMTYPE__ + +// #define macros to provide functions missing in Windows. +// Outside Windows, we use strings.h for str[n]casecmp. + + +#ifdef _WIN32 + +#define strcasecmp _stricmp +#define strncasecmp _strnicmp + +#else + +#include +#include +#endif + + +// +// The packed attribute forces structures to be packed into the minimum +// space necessary. If this is not done, the compiler may align structure +// fields differently to optimize memory access, inflating the overall +// structure size. It is important to use the packed attribute on certain +// structures where alignment is important, particularly data read/written +// to disk. +// + +#ifdef __GNUC__ +#define PACKEDATTR __attribute__((packed)) +#else +#define PACKEDATTR +#endif + +// C99 integer types; with gcc we just use this. Other compilers +// should add conditional statements that define the C99 types. + +// What is really wanted here is stdint.h; however, some old versions +// of Solaris don't have stdint.h and only have inttypes.h (the +// pre-standardisation version). inttypes.h is also in the C99 +// standard and defined to include stdint.h, so include this. + +#include + +#if defined(__cplusplus) || defined(__bool_true_false_are_defined) + +//boolean is cast to int* in doom. so to keep size the same, make boolean an int. +typedef unsigned int boolean; + +#else + +#ifndef __bool_true_false_are_defined +typedef enum +{ + false = 0, + true = 1, + undef = 0xFFFFFFFF +} boolean; +#endif + +#endif + +typedef uint8_t byte; + +#include + +#if defined(_WIN32) || defined(__DJGPP__) + +#define DIR_SEPARATOR '\\' +#define DIR_SEPARATOR_S "\\" +#define PATH_SEPARATOR ';' + +#else + +#define DIR_SEPARATOR '/' +#define DIR_SEPARATOR_S "/" +#define PATH_SEPARATOR ':' + +#endif + +#define arrlen(array) (sizeof(array) / sizeof(*array)) + +#endif + diff --git a/firmware_p4/components/Applications/doom/dstrings.c b/firmware_p4/components/Applications/doom/dstrings.c new file mode 100644 index 000000000..b87f198b3 --- /dev/null +++ b/firmware_p4/components/Applications/doom/dstrings.c @@ -0,0 +1,73 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Globally defined strings. +// + + + +#include "dstrings.h" + +char *doom1_endmsg[] = +{ + "are you sure you want to\nquit this great game?", + "please don't leave, there's more\ndemons to toast!", + "let's beat it -- this is turning\ninto a bloodbath!", + "i wouldn't leave if i were you.\ndos is much worse.", + "you're trying to say you like dos\nbetter than me, right?", + "don't leave yet -- there's a\ndemon around that corner!", + "ya know, next time you come in here\ni'm gonna toast ya.", + "go ahead and leave. see if i care.", +}; + +char *doom2_endmsg[] = +{ + // QuitDOOM II messages + "are you sure you want to\nquit this great game?", + "you want to quit?\nthen, thou hast lost an eighth!", + "don't go now, there's a \ndimensional shambler waiting\nat the dos prompt!", + "get outta here and go back\nto your boring programs.", + "if i were your boss, i'd \n deathmatch ya in a minute!", + "look, bud. you leave now\nand you forfeit your body count!", + "just leave. when you come\nback, i'll be waiting with a bat.", + "you're lucky i don't smack\nyou for thinking about leaving.", +}; + +#if 0 + +// UNUSED messages included in the source release + +char* endmsg[] = +{ + // DOOM1 + QUITMSG, + // FinalDOOM? + "fuck you, pussy!\nget the fuck out!", + "you quit and i'll jizz\nin your cystholes!", + "if you leave, i'll make\nthe lord drink my jizz.", + "hey, ron! can we say\n'fuck' in the game?", + "i'd leave: this is just\nmore monsters and levels.\nwhat a load.", + "suck it down, asshole!\nyou're a fucking wimp!", + "don't quit now! we're \nstill spending your money!", + + // Internal debug. Different style, too. + "THIS IS NO MESSAGE!\nPage intentionally left blank." +}; + +#endif + + + + diff --git a/firmware_p4/components/Applications/doom/dstrings.h b/firmware_p4/components/Applications/doom/dstrings.h new file mode 100644 index 000000000..d3240b499 --- /dev/null +++ b/firmware_p4/components/Applications/doom/dstrings.h @@ -0,0 +1,41 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// +// DESCRIPTION: +// DOOM strings, by language. +// + + +#ifndef __DSTRINGS__ +#define __DSTRINGS__ + + +// All important printed strings. + +#include "d_englsh.h" + +// Misc. other strings. +#define SAVEGAMENAME "doomsav" + + +// QuitDOOM messages +// 8 per each game type +#define NUM_QUITMESSAGES 8 + +extern char *doom1_endmsg[]; +extern char *doom2_endmsg[]; + + +#endif diff --git a/firmware_p4/components/Applications/doom/dummy.c b/firmware_p4/components/Applications/doom/dummy.c new file mode 100644 index 000000000..d78816b8c --- /dev/null +++ b/firmware_p4/components/Applications/doom/dummy.c @@ -0,0 +1,53 @@ +/* + * dummy.c + * + * Created on: 16.02.2015 + * Author: Florian + */ + + +/*---------------------------------------------------------------------* + * include files * + *---------------------------------------------------------------------*/ + +#include "doomtype.h" + +/*---------------------------------------------------------------------* + * local definitions * + *---------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------* + * external declarations * + *---------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------* + * public data * + *---------------------------------------------------------------------*/ + +boolean net_client_connected = false; + +boolean drone = false; + +/*---------------------------------------------------------------------* + * private data * + *---------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------* + * private functions * + *---------------------------------------------------------------------*/ + +/*---------------------------------------------------------------------* + * public functions * + *---------------------------------------------------------------------*/ + +#ifndef FEATURE_SOUND + +void I_InitTimidityConfig(void) +{ +} + +#endif + +/*---------------------------------------------------------------------* + * eof * + *---------------------------------------------------------------------*/ diff --git a/firmware_p4/components/Applications/doom/f_finale.c b/firmware_p4/components/Applications/doom/f_finale.c new file mode 100644 index 000000000..ca6775ef8 --- /dev/null +++ b/firmware_p4/components/Applications/doom/f_finale.c @@ -0,0 +1,718 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Game completion, final screen animation. +// + + +#include +#include + +// Functions. +#include "deh_main.h" +#include "i_system.h" +#include "i_swap.h" +#include "z_zone.h" +#include "v_video.h" +#include "w_wad.h" +#include "s_sound.h" + +// Data. +#include "d_main.h" +#include "dstrings.h" +#include "sounds.h" + +#include "doomstat.h" +#include "r_state.h" + +typedef enum +{ + F_STAGE_TEXT, + F_STAGE_ARTSCREEN, + F_STAGE_CAST, +} finalestage_t; + +// ? +//#include "doomstat.h" +//#include "r_local.h" +//#include "f_finale.h" + +// Stage of animation: +finalestage_t finalestage; + +unsigned int finalecount; + +#define TEXTSPEED 3 +#define TEXTWAIT 250 + +typedef struct +{ + GameMission_t mission; + int episode, level; + char *background; + char *text; +} textscreen_t; + +static textscreen_t textscreens[] = +{ + { doom, 1, 8, "FLOOR4_8", E1TEXT}, + { doom, 2, 8, "SFLR6_1", E2TEXT}, + { doom, 3, 8, "MFLR8_4", E3TEXT}, + { doom, 4, 8, "MFLR8_3", E4TEXT}, + + { doom2, 1, 6, "SLIME16", C1TEXT}, + { doom2, 1, 11, "RROCK14", C2TEXT}, + { doom2, 1, 20, "RROCK07", C3TEXT}, + { doom2, 1, 30, "RROCK17", C4TEXT}, + { doom2, 1, 15, "RROCK13", C5TEXT}, + { doom2, 1, 31, "RROCK19", C6TEXT}, + + { pack_tnt, 1, 6, "SLIME16", T1TEXT}, + { pack_tnt, 1, 11, "RROCK14", T2TEXT}, + { pack_tnt, 1, 20, "RROCK07", T3TEXT}, + { pack_tnt, 1, 30, "RROCK17", T4TEXT}, + { pack_tnt, 1, 15, "RROCK13", T5TEXT}, + { pack_tnt, 1, 31, "RROCK19", T6TEXT}, + + { pack_plut, 1, 6, "SLIME16", P1TEXT}, + { pack_plut, 1, 11, "RROCK14", P2TEXT}, + { pack_plut, 1, 20, "RROCK07", P3TEXT}, + { pack_plut, 1, 30, "RROCK17", P4TEXT}, + { pack_plut, 1, 15, "RROCK13", P5TEXT}, + { pack_plut, 1, 31, "RROCK19", P6TEXT}, +}; + +char* finaletext; +char* finaleflat; + +void F_StartCast (void); +void F_CastTicker (void); +boolean F_CastResponder (event_t *ev); +void F_CastDrawer (void); + +// +// F_StartFinale +// +void F_StartFinale (void) +{ + size_t i; + + gameaction = ga_nothing; + gamestate = GS_FINALE; + viewactive = false; + automapactive = false; + + if (logical_gamemission == doom) + { + S_ChangeMusic(mus_victor, true); + } + else + { + S_ChangeMusic(mus_read_m, true); + } + + // Find the right screen and set the text and background + + for (i=0; imission == doom) + { + screen->level = 5; + } + + if (logical_gamemission == screen->mission + && (logical_gamemission != doom || gameepisode == screen->episode) + && gamemap == screen->level) + { + finaletext = screen->text; + finaleflat = screen->background; + } + } + + // Do dehacked substitutions of strings + + finaletext = DEH_String(finaletext); + finaleflat = DEH_String(finaleflat); + + finalestage = F_STAGE_TEXT; + finalecount = 0; + +} + + + +boolean F_Responder (event_t *event) +{ + if (finalestage == F_STAGE_CAST) + return F_CastResponder (event); + + return false; +} + + +// +// F_Ticker +// +void F_Ticker (void) +{ + size_t i; + + // check for skipping + if ( (gamemode == commercial) + && ( finalecount > 50) ) + { + // go on to the next level + for (i=0 ; istrlen (finaletext)*TEXTSPEED + TEXTWAIT) + { + finalecount = 0; + finalestage = F_STAGE_ARTSCREEN; + wipegamestate = -1; // force a wipe + if (gameepisode == 3) + S_StartMusic (mus_bunny); + } +} + + + +// +// F_TextWrite +// + +#include "hu_stuff.h" +extern patch_t *hu_font[HU_FONTSIZE]; + + +void F_TextWrite (void) +{ + byte* src; + byte* dest; + + int x,y,w; + signed int count; + char* ch; + int c; + int cx; + int cy; + + // erase the entire screen to a tiled background + src = W_CacheLumpName ( finaleflat , PU_CACHE); + dest = I_VideoBuffer; + + for (y=0 ; y HU_FONTSIZE) + { + cx += 4; + continue; + } + + w = SHORT (hu_font[c]->width); + if (cx+w > SCREENWIDTH) + break; + V_DrawPatch(cx, cy, hu_font[c]); + cx+=w; + } + +} + +// +// Final DOOM 2 animation +// Casting by id Software. +// in order of appearance +// +typedef struct +{ + char *name; + mobjtype_t type; +} castinfo_t; + +castinfo_t castorder[] = { + {CC_ZOMBIE, MT_POSSESSED}, + {CC_SHOTGUN, MT_SHOTGUY}, + {CC_HEAVY, MT_CHAINGUY}, + {CC_IMP, MT_TROOP}, + {CC_DEMON, MT_SERGEANT}, + {CC_LOST, MT_SKULL}, + {CC_CACO, MT_HEAD}, + {CC_HELL, MT_KNIGHT}, + {CC_BARON, MT_BRUISER}, + {CC_ARACH, MT_BABY}, + {CC_PAIN, MT_PAIN}, + {CC_REVEN, MT_UNDEAD}, + {CC_MANCU, MT_FATSO}, + {CC_ARCH, MT_VILE}, + {CC_SPIDER, MT_SPIDER}, + {CC_CYBER, MT_CYBORG}, + {CC_HERO, MT_PLAYER}, + + {NULL,0} +}; + +int castnum; +int casttics; +state_t* caststate; +boolean castdeath; +int castframes; +int castonmelee; +boolean castattacking; + + +// +// F_StartCast +// +void F_StartCast (void) +{ + wipegamestate = -1; // force a screen wipe + castnum = 0; + caststate = &states[mobjinfo[castorder[castnum].type].seestate]; + casttics = caststate->tics; + castdeath = false; + finalestage = F_STAGE_CAST; + castframes = 0; + castonmelee = 0; + castattacking = false; + S_ChangeMusic(mus_evil, true); +} + + +// +// F_CastTicker +// +void F_CastTicker (void) +{ + int st; + int sfx; + + if (--casttics > 0) + return; // not time to change state yet + + if (caststate->tics == -1 || caststate->nextstate == S_NULL) + { + // switch from deathstate to next monster + castnum++; + castdeath = false; + if (castorder[castnum].name == NULL) + castnum = 0; + if (mobjinfo[castorder[castnum].type].seesound) + S_StartSound (NULL, mobjinfo[castorder[castnum].type].seesound); + caststate = &states[mobjinfo[castorder[castnum].type].seestate]; + castframes = 0; + } + else + { + // just advance to next state in animation + if (caststate == &states[S_PLAY_ATK1]) + goto stopattack; // Oh, gross hack! + st = caststate->nextstate; + caststate = &states[st]; + castframes++; + + // sound hacks.... + switch (st) + { + case S_PLAY_ATK1: sfx = sfx_dshtgn; break; + case S_POSS_ATK2: sfx = sfx_pistol; break; + case S_SPOS_ATK2: sfx = sfx_shotgn; break; + case S_VILE_ATK2: sfx = sfx_vilatk; break; + case S_SKEL_FIST2: sfx = sfx_skeswg; break; + case S_SKEL_FIST4: sfx = sfx_skepch; break; + case S_SKEL_MISS2: sfx = sfx_skeatk; break; + case S_FATT_ATK8: + case S_FATT_ATK5: + case S_FATT_ATK2: sfx = sfx_firsht; break; + case S_CPOS_ATK2: + case S_CPOS_ATK3: + case S_CPOS_ATK4: sfx = sfx_shotgn; break; + case S_TROO_ATK3: sfx = sfx_claw; break; + case S_SARG_ATK2: sfx = sfx_sgtatk; break; + case S_BOSS_ATK2: + case S_BOS2_ATK2: + case S_HEAD_ATK2: sfx = sfx_firsht; break; + case S_SKULL_ATK2: sfx = sfx_sklatk; break; + case S_SPID_ATK2: + case S_SPID_ATK3: sfx = sfx_shotgn; break; + case S_BSPI_ATK2: sfx = sfx_plasma; break; + case S_CYBER_ATK2: + case S_CYBER_ATK4: + case S_CYBER_ATK6: sfx = sfx_rlaunc; break; + case S_PAIN_ATK3: sfx = sfx_sklatk; break; + default: sfx = 0; break; + } + + if (sfx) + S_StartSound (NULL, sfx); + } + + if (castframes == 12) + { + // go into attack frame + castattacking = true; + if (castonmelee) + caststate=&states[mobjinfo[castorder[castnum].type].meleestate]; + else + caststate=&states[mobjinfo[castorder[castnum].type].missilestate]; + castonmelee ^= 1; + if (caststate == &states[S_NULL]) + { + if (castonmelee) + caststate= + &states[mobjinfo[castorder[castnum].type].meleestate]; + else + caststate= + &states[mobjinfo[castorder[castnum].type].missilestate]; + } + } + + if (castattacking) + { + if (castframes == 24 + || caststate == &states[mobjinfo[castorder[castnum].type].seestate] ) + { + stopattack: + castattacking = false; + castframes = 0; + caststate = &states[mobjinfo[castorder[castnum].type].seestate]; + } + } + + casttics = caststate->tics; + if (casttics == -1) + casttics = 15; +} + + +// +// F_CastResponder +// + +boolean F_CastResponder (event_t* ev) +{ + if (ev->type != ev_keydown) + return false; + + if (castdeath) + return true; // already in dying frames + + // go into death frame + castdeath = true; + caststate = &states[mobjinfo[castorder[castnum].type].deathstate]; + casttics = caststate->tics; + castframes = 0; + castattacking = false; + if (mobjinfo[castorder[castnum].type].deathsound) + S_StartSound (NULL, mobjinfo[castorder[castnum].type].deathsound); + + return true; +} + + +void F_CastPrint (char* text) +{ + char* ch; + int c; + int cx; + int w; + int width; + + // find width + ch = text; + width = 0; + + while (ch) + { + c = *ch++; + if (!c) + break; + c = toupper(c) - HU_FONTSTART; + if (c < 0 || c> HU_FONTSIZE) + { + width += 4; + continue; + } + + w = SHORT (hu_font[c]->width); + width += w; + } + + // draw it + cx = 160-width/2; + ch = text; + while (ch) + { + c = *ch++; + if (!c) + break; + c = toupper(c) - HU_FONTSTART; + if (c < 0 || c> HU_FONTSIZE) + { + cx += 4; + continue; + } + + w = SHORT (hu_font[c]->width); + V_DrawPatch(cx, 180, hu_font[c]); + cx+=w; + } + +} + + +// +// F_CastDrawer +// + +void F_CastDrawer (void) +{ + spritedef_t* sprdef; + spriteframe_t* sprframe; + int lump; + boolean flip; + patch_t* patch; + + // erase the entire screen to a background + V_DrawPatch (0, 0, W_CacheLumpName (DEH_String("BOSSBACK"), PU_CACHE)); + + F_CastPrint (DEH_String(castorder[castnum].name)); + + // draw the current frame in the middle of the screen + sprdef = &sprites[caststate->sprite]; + sprframe = &sprdef->spriteframes[ caststate->frame & FF_FRAMEMASK]; + lump = sprframe->lump[0]; + flip = (boolean)sprframe->flip[0]; + + patch = W_CacheLumpNum (lump+firstspritelump, PU_CACHE); + if (flip) + V_DrawPatchFlipped(160, 170, patch); + else + V_DrawPatch(160, 170, patch); +} + + +// +// F_DrawPatchCol +// +void +F_DrawPatchCol +( int x, + patch_t* patch, + int col ) +{ + column_t* column; + byte* source; + byte* dest; + byte* desttop; + int count; + + column = (column_t *)((byte *)patch + LONG(patch->columnofs[col])); + desttop = I_VideoBuffer + x; + + // step through the posts in a column + while (column->topdelta != 0xff ) + { + source = (byte *)column + 3; + dest = desttop + column->topdelta*SCREENWIDTH; + count = column->length; + + while (count--) + { + *dest = *source++; + dest += SCREENWIDTH; + } + column = (column_t *)( (byte *)column + column->length + 4 ); + } +} + + +// +// F_BunnyScroll +// +void F_BunnyScroll (void) +{ + signed int scrolled; + int x; + patch_t* p1; + patch_t* p2; + char name[10]; + int stage; + static int laststage; + + p1 = W_CacheLumpName (DEH_String("PFUB2"), PU_LEVEL); + p2 = W_CacheLumpName (DEH_String("PFUB1"), PU_LEVEL); + + V_MarkRect (0, 0, SCREENWIDTH, SCREENHEIGHT); + + scrolled = (320 - ((signed int) finalecount-230)/2); + if (scrolled > 320) + scrolled = 320; + if (scrolled < 0) + scrolled = 0; + + for ( x=0 ; x 6) + stage = 6; + if (stage > laststage) + { + S_StartSound (NULL, sfx_pistol); + laststage = stage; + } + + DEH_snprintf(name, 10, "END%i", stage); + V_DrawPatch((SCREENWIDTH - 13 * 8) / 2, + (SCREENHEIGHT - 8 * 8) / 2, + W_CacheLumpName (name,PU_CACHE)); +} + +static void F_ArtScreenDrawer(void) +{ + char *lumpname; + + if (gameepisode == 3) + { + F_BunnyScroll(); + } + else + { + switch (gameepisode) + { + case 1: + if (gamemode == retail) + { + lumpname = "CREDIT"; + } + else + { + lumpname = "HELP2"; + } + break; + case 2: + lumpname = "VICTORY2"; + break; + case 4: + lumpname = "ENDPIC"; + break; + default: + return; + } + + lumpname = DEH_String(lumpname); + + V_DrawPatch (0, 0, W_CacheLumpName(lumpname, PU_CACHE)); + } +} + +// +// F_Drawer +// +void F_Drawer (void) +{ + switch (finalestage) + { + case F_STAGE_CAST: + F_CastDrawer(); + break; + case F_STAGE_TEXT: + F_TextWrite(); + break; + case F_STAGE_ARTSCREEN: + F_ArtScreenDrawer(); + break; + } +} + + diff --git a/firmware_p4/components/Applications/doom/f_finale.h b/firmware_p4/components/Applications/doom/f_finale.h new file mode 100644 index 000000000..daa71c32a --- /dev/null +++ b/firmware_p4/components/Applications/doom/f_finale.h @@ -0,0 +1,45 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// +// + + +#ifndef __F_FINALE__ +#define __F_FINALE__ + + +#include "doomtype.h" +#include "d_event.h" +// +// FINALE +// + +// Called by main loop. +boolean F_Responder (event_t* ev); + +// Called by main loop. +void F_Ticker (void); + +// Called by main loop. +void F_Drawer (void); + + +void F_StartFinale (void); + + + + +#endif diff --git a/firmware_p4/components/Applications/doom/f_wipe.c b/firmware_p4/components/Applications/doom/f_wipe.c new file mode 100644 index 000000000..05852fd20 --- /dev/null +++ b/firmware_p4/components/Applications/doom/f_wipe.c @@ -0,0 +1,294 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Mission begin melt/wipe screen special effect. +// + +#include + +#include "z_zone.h" +#include "i_video.h" +#include "v_video.h" +#include "m_random.h" + +#include "doomtype.h" + +#include "f_wipe.h" + +// +// SCREEN WIPE PACKAGE +// + +// when zero, stop the wipe +static boolean go = 0; + +static byte* wipe_scr_start; +static byte* wipe_scr_end; +static byte* wipe_scr; + + +void +wipe_shittyColMajorXform +( short* array, + int width, + int height ) +{ + int x; + int y; + short* dest; + + dest = (short*) Z_Malloc(width*height*2, PU_STATIC, 0); + + for(y=0;y *e) + { + newval = *w - ticks; + if (newval < *e) + *w = *e; + else + *w = newval; + changed = true; + } + else if (*w < *e) + { + newval = *w + ticks; + if (newval > *e) + *w = *e; + else + *w = newval; + changed = true; + } + } + w++; + e++; + } + + return !changed; + +} + +int +wipe_exitColorXForm +( int width, + int height, + int ticks ) +{ + return 0; +} + + +static int* y; + +int +wipe_initMelt +( int width, + int height, + int ticks ) +{ + int i, r; + + // copy start screen to main screen + memcpy(wipe_scr, wipe_scr_start, width*height); + + // makes this wipe faster (in theory) + // to have stuff in column-major format + wipe_shittyColMajorXform((short*)wipe_scr_start, width/2, height); + wipe_shittyColMajorXform((short*)wipe_scr_end, width/2, height); + + // setup initial column positions + // (y<0 => not ready to scroll yet) + y = (int *) Z_Malloc(width*sizeof(int), PU_STATIC, 0); + y[0] = -(M_Random()%16); + for (i=1;i 0) y[i] = 0; + else if (y[i] == -16) y[i] = -15; + } + + return 0; +} + +int +wipe_doMelt +( int width, + int height, + int ticks ) +{ + int i; + int j; + int dy; + int idx; + + short* s; + short* d; + boolean done = true; + + width/=2; + + while (ticks--) + { + for (i=0;i= height) dy = height - y[i]; + s = &((short *)wipe_scr_end)[i*height+y[i]]; + d = &((short *)wipe_scr)[y[i]*width+i]; + idx = 0; + for (j=dy;j;j--) + { + d[idx] = *(s++); + idx += width; + } + y[i] += dy; + s = &((short *)wipe_scr_start)[i*height]; + d = &((short *)wipe_scr)[y[i]*width+i]; + idx = 0; + for (j=height-y[i];j;j--) + { + d[idx] = *(s++); + idx += width; + } + done = false; + } + } + } + + return done; + +} + +int +wipe_exitMelt +( int width, + int height, + int ticks ) +{ + Z_Free(y); + Z_Free(wipe_scr_start); + Z_Free(wipe_scr_end); + return 0; +} + +int +wipe_StartScreen +( int x, + int y, + int width, + int height ) +{ + wipe_scr_start = Z_Malloc(SCREENWIDTH * SCREENHEIGHT, PU_STATIC, NULL); + I_ReadScreen(wipe_scr_start); + return 0; +} + +int +wipe_EndScreen +( int x, + int y, + int width, + int height ) +{ + wipe_scr_end = Z_Malloc(SCREENWIDTH * SCREENHEIGHT, PU_STATIC, NULL); + I_ReadScreen(wipe_scr_end); + V_DrawBlock(x, y, width, height, wipe_scr_start); // restore start scr. + return 0; +} + +int +wipe_ScreenWipe +( int wipeno, + int x, + int y, + int width, + int height, + int ticks ) +{ + int rc; + static int (*wipes[])(int, int, int) = + { + wipe_initColorXForm, wipe_doColorXForm, wipe_exitColorXForm, + wipe_initMelt, wipe_doMelt, wipe_exitMelt + }; + + // initial stuff + if (!go) + { + go = 1; + // wipe_scr = (byte *) Z_Malloc(width*height, PU_STATIC, 0); // DEBUG + wipe_scr = I_VideoBuffer; + (*wipes[wipeno*3])(width, height, ticks); + } + + // do a piece of wipe-in + V_MarkRect(0, 0, width, height); + rc = (*wipes[wipeno*3+1])(width, height, ticks); + // V_DrawBlock(x, y, 0, width, height, wipe_scr); // DEBUG + + // final stuff + if (rc) + { + go = 0; + (*wipes[wipeno*3+2])(width, height, ticks); + } + + return !go; +} + diff --git a/firmware_p4/components/Applications/doom/f_wipe.h b/firmware_p4/components/Applications/doom/f_wipe.h new file mode 100644 index 000000000..f48a9ca65 --- /dev/null +++ b/firmware_p4/components/Applications/doom/f_wipe.h @@ -0,0 +1,63 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Mission start screen wipe/melt, special effects. +// + + +#ifndef __F_WIPE_H__ +#define __F_WIPE_H__ + +// +// SCREEN WIPE PACKAGE +// + +enum +{ + // simple gradual pixel change for 8-bit only + wipe_ColorXForm, + + // weird screen melt + wipe_Melt, + + wipe_NUMWIPES +}; + +int +wipe_StartScreen +( int x, + int y, + int width, + int height ); + + +int +wipe_EndScreen +( int x, + int y, + int width, + int height ); + + +int +wipe_ScreenWipe +( int wipeno, + int x, + int y, + int width, + int height, + int ticks ); + +#endif diff --git a/firmware_p4/components/Applications/doom/g_game.c b/firmware_p4/components/Applications/doom/g_game.c new file mode 100644 index 000000000..9954d7890 --- /dev/null +++ b/firmware_p4/components/Applications/doom/g_game.c @@ -0,0 +1,2303 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: none +// + + + +#include +#include +#include + +#include "doomdef.h" +#include "doomkeys.h" +#include "doomstat.h" + +#include "deh_main.h" +#include "deh_misc.h" + +#include "z_zone.h" +#include "f_finale.h" +#include "m_argv.h" +#include "m_controls.h" +#include "m_misc.h" +#include "m_menu.h" +#include "m_random.h" +#include "i_system.h" +#include "i_timer.h" +#include "i_video.h" + +#include "p_setup.h" +#include "p_saveg.h" +#include "p_tick.h" + +#include "d_main.h" + +#include "wi_stuff.h" +#include "hu_stuff.h" +#include "st_stuff.h" +#include "am_map.h" +#include "statdump.h" + +// Needs access to LFB. +#include "v_video.h" + +#include "w_wad.h" + +#include "p_local.h" + +#include "s_sound.h" + +// Data. +#include "dstrings.h" +#include "sounds.h" + +// SKY handling - still the wrong place. +#include "r_data.h" +#include "r_sky.h" + + + +#include "g_game.h" + + +#define SAVEGAMESIZE 0x2c000 + +void G_ReadDemoTiccmd (ticcmd_t* cmd); +void G_WriteDemoTiccmd (ticcmd_t* cmd); +void G_PlayerReborn (int player); + +void G_DoReborn (int playernum); + +void G_DoLoadLevel (void); +void G_DoNewGame (void); +void G_DoPlayDemo (void); +void G_DoCompleted (void); +void G_DoVictory (void); +void G_DoWorldDone (void); +void G_DoSaveGame (void); + +// Gamestate the last time G_Ticker was called. + +gamestate_t oldgamestate; + +gameaction_t gameaction; +gamestate_t gamestate; +skill_t gameskill; +boolean respawnmonsters; +int gameepisode; +int gamemap; + +// If non-zero, exit the level after this number of minutes. + +int timelimit; + +boolean paused; +boolean sendpause; // send a pause event next tic +boolean sendsave; // send a save event next tic +boolean usergame; // ok to save / end game + +boolean timingdemo; // if true, exit with report on completion +boolean nodrawers; // for comparative timing purposes +int starttime; // for comparative timing purposes + +boolean viewactive; + +int deathmatch; // only if started as net death +boolean netgame; // only true if packets are broadcast +boolean playeringame[MAXPLAYERS]; +player_t players[MAXPLAYERS]; + +boolean turbodetected[MAXPLAYERS]; + +int consoleplayer; // player taking events and displaying +int displayplayer; // view being displayed +int levelstarttic; // gametic at level start +int totalkills, totalitems, totalsecret; // for intermission + +char *demoname; +boolean demorecording; +boolean longtics; // cph's doom 1.91 longtics hack +boolean lowres_turn; // low resolution turning for longtics +boolean demoplayback; +boolean netdemo; +byte* demobuffer; +byte* demo_p; +byte* demoend; +boolean singledemo; // quit after playing a demo from cmdline + +boolean precache = true; // if true, load all graphics at start + +boolean testcontrols = false; // Invoked by setup to test controls +int testcontrols_mousespeed; + + + +wbstartstruct_t wminfo; // parms for world map / intermission + +byte consistancy[MAXPLAYERS][BACKUPTICS]; + +#define MAXPLMOVE (forwardmove[1]) + +#define TURBOTHRESHOLD 0x32 + +fixed_t forwardmove[2] = {0x19, 0x32}; +fixed_t sidemove[2] = {0x18, 0x28}; +fixed_t angleturn[3] = {640, 1280, 320}; // + slow turn + +static int *weapon_keys[] = { + &key_weapon1, + &key_weapon2, + &key_weapon3, + &key_weapon4, + &key_weapon5, + &key_weapon6, + &key_weapon7, + &key_weapon8 +}; + +// Set to -1 or +1 to switch to the previous or next weapon. + +static int next_weapon = 0; + +// Used for prev/next weapon keys. + +static const struct +{ + weapontype_t weapon; + weapontype_t weapon_num; +} weapon_order_table[] = { + { wp_fist, wp_fist }, + { wp_chainsaw, wp_fist }, + { wp_pistol, wp_pistol }, + { wp_shotgun, wp_shotgun }, + { wp_supershotgun, wp_shotgun }, + { wp_chaingun, wp_chaingun }, + { wp_missile, wp_missile }, + { wp_plasma, wp_plasma }, + { wp_bfg, wp_bfg } +}; + +#define SLOWTURNTICS 6 + +#define NUMKEYS 256 +#define MAX_JOY_BUTTONS 20 + +static boolean gamekeydown[NUMKEYS]; +static int turnheld; // for accelerative turning + +static boolean mousearray[MAX_MOUSE_BUTTONS + 1]; +static boolean *mousebuttons = &mousearray[1]; // allow [-1] + +// mouse values are used once +int mousex; +int mousey; + +static int dclicktime; +static boolean dclickstate; +static int dclicks; +static int dclicktime2; +static boolean dclickstate2; +static int dclicks2; + +// joystick values are repeated +static int joyxmove; +static int joyymove; +static int joystrafemove; +static boolean joyarray[MAX_JOY_BUTTONS + 1]; +static boolean *joybuttons = &joyarray[1]; // allow [-1] + +static int savegameslot; +static char savedescription[32]; + +#define BODYQUESIZE 32 + +mobj_t* bodyque[BODYQUESIZE]; +int bodyqueslot; + +int vanilla_savegame_limit = 1; +int vanilla_demo_limit = 1; + +int G_CmdChecksum (ticcmd_t* cmd) +{ + size_t i; + int sum = 0; + + for (i=0 ; i< sizeof(*cmd)/4 - 1 ; i++) + sum += ((int *)cmd)[i]; + + return sum; +} + +static boolean WeaponSelectable(weapontype_t weapon) +{ + // Can't select the super shotgun in Doom 1. + + if (weapon == wp_supershotgun && logical_gamemission == doom) + { + return false; + } + + // These weapons aren't available in shareware. + + if ((weapon == wp_plasma || weapon == wp_bfg) + && gamemission == doom && gamemode == shareware) + { + return false; + } + + // Can't select a weapon if we don't own it. + + if (!players[consoleplayer].weaponowned[weapon]) + { + return false; + } + + // Can't select the fist if we have the chainsaw, unless + // we also have the berserk pack. + + if (weapon == wp_fist + && players[consoleplayer].weaponowned[wp_chainsaw] + && !players[consoleplayer].powers[pw_strength]) + { + return false; + } + + return true; +} + +static int G_NextWeapon(int direction) +{ + weapontype_t weapon; + int start_i, i; + + // Find index in the table. + + if (players[consoleplayer].pendingweapon == wp_nochange) + { + weapon = players[consoleplayer].readyweapon; + } + else + { + weapon = players[consoleplayer].pendingweapon; + } + + for (i=0; iconsistancy = + consistancy[consoleplayer][maketic%BACKUPTICS]; + + strafe = gamekeydown[key_strafe] || mousebuttons[mousebstrafe] + || joybuttons[joybstrafe]; + + // fraggle: support the old "joyb_speed = 31" hack which + // allowed an autorun effect + + speed = key_speed >= NUMKEYS + || joybspeed >= MAX_JOY_BUTTONS + || gamekeydown[key_speed] + || joybuttons[joybspeed]; + + forward = side = 0; + + // use two stage accelerative turning + // on the keyboard and joystick + if (joyxmove < 0 + || joyxmove > 0 + || gamekeydown[key_right] + || gamekeydown[key_left]) + turnheld += ticdup; + else + turnheld = 0; + + if (turnheld < SLOWTURNTICS) + tspeed = 2; // slow turn + else + tspeed = speed; + + // let movement keys cancel each other out + if (strafe) + { + if (gamekeydown[key_right]) + { + // fprintf(stderr, "strafe right\n"); + side += sidemove[speed]; + } + if (gamekeydown[key_left]) + { + // fprintf(stderr, "strafe left\n"); + side -= sidemove[speed]; + } + if (joyxmove > 0) + side += sidemove[speed]; + if (joyxmove < 0) + side -= sidemove[speed]; + + } + else + { + if (gamekeydown[key_right]) + cmd->angleturn -= angleturn[tspeed]; + if (gamekeydown[key_left]) + cmd->angleturn += angleturn[tspeed]; + if (joyxmove > 0) + cmd->angleturn -= angleturn[tspeed]; + if (joyxmove < 0) + cmd->angleturn += angleturn[tspeed]; + } + + if (gamekeydown[key_up]) + { + // fprintf(stderr, "up\n"); + forward += forwardmove[speed]; + } + if (gamekeydown[key_down]) + { + // fprintf(stderr, "down\n"); + forward -= forwardmove[speed]; + } + + if (joyymove < 0) + forward += forwardmove[speed]; + if (joyymove > 0) + forward -= forwardmove[speed]; + + if (gamekeydown[key_strafeleft] + || joybuttons[joybstrafeleft] + || mousebuttons[mousebstrafeleft] + || joystrafemove < 0) + { + side -= sidemove[speed]; + } + + if (gamekeydown[key_straferight] + || joybuttons[joybstraferight] + || mousebuttons[mousebstraferight] + || joystrafemove > 0) + { + side += sidemove[speed]; + } + + // buttons + cmd->chatchar = HU_dequeueChatChar(); + + if (gamekeydown[key_fire] || mousebuttons[mousebfire] + || joybuttons[joybfire]) + cmd->buttons |= BT_ATTACK; + + if (gamekeydown[key_use] + || joybuttons[joybuse] + || mousebuttons[mousebuse]) + { + cmd->buttons |= BT_USE; + // clear double clicks if hit use button + dclicks = 0; + } + + // If the previous or next weapon button is pressed, the + // next_weapon variable is set to change weapons when + // we generate a ticcmd. Choose a new weapon. + + if (gamestate == GS_LEVEL && next_weapon != 0) + { + i = G_NextWeapon(next_weapon); + cmd->buttons |= BT_CHANGE; + cmd->buttons |= i << BT_WEAPONSHIFT; + } + else + { + // Check weapon keys. + + for (i=0; ibuttons |= BT_CHANGE; + cmd->buttons |= i< 1 ) + { + dclickstate = mousebuttons[mousebforward]; + if (dclickstate) + dclicks++; + if (dclicks == 2) + { + cmd->buttons |= BT_USE; + dclicks = 0; + } + else + dclicktime = 0; + } + else + { + dclicktime += ticdup; + if (dclicktime > 20) + { + dclicks = 0; + dclickstate = 0; + } + } + + // strafe double click + bstrafe = + mousebuttons[mousebstrafe] + || joybuttons[joybstrafe]; + if (bstrafe != dclickstate2 && dclicktime2 > 1 ) + { + dclickstate2 = bstrafe; + if (dclickstate2) + dclicks2++; + if (dclicks2 == 2) + { + cmd->buttons |= BT_USE; + dclicks2 = 0; + } + else + dclicktime2 = 0; + } + else + { + dclicktime2 += ticdup; + if (dclicktime2 > 20) + { + dclicks2 = 0; + dclickstate2 = 0; + } + } + } + + forward += mousey; + + if (strafe) + side += mousex*2; + else + cmd->angleturn -= mousex*0x8; + + if (mousex == 0) + { + // No movement in the previous frame + + testcontrols_mousespeed = 0; + } + + mousex = mousey = 0; + + if (forward > MAXPLMOVE) + forward = MAXPLMOVE; + else if (forward < -MAXPLMOVE) + forward = -MAXPLMOVE; + if (side > MAXPLMOVE) + side = MAXPLMOVE; + else if (side < -MAXPLMOVE) + side = -MAXPLMOVE; + + cmd->forwardmove += forward; + cmd->sidemove += side; + + // special buttons + if (sendpause) + { + sendpause = false; + cmd->buttons = BT_SPECIAL | BTS_PAUSE; + } + + if (sendsave) + { + sendsave = false; + cmd->buttons = BT_SPECIAL | BTS_SAVEGAME | (savegameslot<angleturn + carry; + + // round angleturn to the nearest 256 unit boundary + // for recording demos with single byte values for turn + + cmd->angleturn = (desired_angleturn + 128) & 0xff00; + + // Carry forward the error from the reduced resolution to the + // next tic, so that successive small movements can accumulate. + + carry = desired_angleturn - cmd->angleturn; + } +} + + +// +// G_DoLoadLevel +// +void G_DoLoadLevel (void) +{ + int i; + + // Set the sky map. + // First thing, we have a dummy sky texture name, + // a flat. The data is in the WAD only because + // we look for an actual index, instead of simply + // setting one. + + skyflatnum = R_FlatNumForName(DEH_String(SKYFLATNAME)); + + // The "Sky never changes in Doom II" bug was fixed in + // the id Anthology version of doom2.exe for Final Doom. + if ((gamemode == commercial) + && (gameversion == exe_final2 || gameversion == exe_chex)) + { + char *skytexturename; + + if (gamemap < 12) + { + skytexturename = "SKY1"; + } + else if (gamemap < 21) + { + skytexturename = "SKY2"; + } + else + { + skytexturename = "SKY3"; + } + + skytexturename = DEH_String(skytexturename); + + skytexture = R_TextureNumForName(skytexturename); + } + + levelstarttic = gametic; // for time calculation + + if (wipegamestate == GS_LEVEL) + wipegamestate = -1; // force a wipe + + gamestate = GS_LEVEL; + + for (i=0 ; itype == ev_keydown + && ev->data1 == key_spy && (singledemo || !deathmatch) ) + { + // spy mode + do + { + displayplayer++; + if (displayplayer == MAXPLAYERS) + displayplayer = 0; + } while (!playeringame[displayplayer] && displayplayer != consoleplayer); + return true; + } + + // any other key pops up menu if in demos + if (gameaction == ga_nothing && !singledemo && + (demoplayback || gamestate == GS_DEMOSCREEN) + ) + { + if (ev->type == ev_keydown || + (ev->type == ev_mouse && ev->data1) || + (ev->type == ev_joystick && ev->data1) ) + { + M_StartControlPanel (); + return true; + } + return false; + } + + if (gamestate == GS_LEVEL) + { +#if 0 + if (devparm && ev->type == ev_keydown && ev->data1 == ';') + { + G_DeathMatchSpawnPlayer (0); + return true; + } +#endif + if (HU_Responder (ev)) + return true; // chat ate the event + if (ST_Responder (ev)) + return true; // status window ate it + if (AM_Responder (ev)) + return true; // automap ate it + } + + if (gamestate == GS_FINALE) + { + if (F_Responder (ev)) + return true; // finale ate the event + } + + if (testcontrols && ev->type == ev_mouse) + { + // If we are invoked by setup to test the controls, save the + // mouse speed so that we can display it on-screen. + // Perform a low pass filter on this so that the thermometer + // appears to move smoothly. + + testcontrols_mousespeed = abs(ev->data2); + } + + // If the next/previous weapon keys are pressed, set the next_weapon + // variable to change weapons when the next ticcmd is generated. + + if (ev->type == ev_keydown && ev->data1 == key_prevweapon) + { + next_weapon = -1; + } + else if (ev->type == ev_keydown && ev->data1 == key_nextweapon) + { + next_weapon = 1; + } + + switch (ev->type) + { + case ev_keydown: + if (ev->data1 == key_pause) + { + sendpause = true; + } + else if (ev->data1 data1] = true; + } + + return true; // eat key down events + + case ev_keyup: + if (ev->data1 data1] = false; + return false; // always let key up events filter down + + case ev_mouse: + SetMouseButtons(ev->data1); + mousex = ev->data2*(mouseSensitivity+5)/10; + mousey = ev->data3*(mouseSensitivity+5)/10; + return true; // eat events + + case ev_joystick: + SetJoyButtons(ev->data1); + joyxmove = ev->data2; + joyymove = ev->data3; + joystrafemove = ev->data4; + return true; // eat events + + default: + break; + } + + return false; +} + + + +// +// G_Ticker +// Make ticcmd_ts for the players. +// +void G_Ticker (void) +{ + int i; + int buf; + ticcmd_t* cmd; + + // do player reborns if needed + for (i=0 ; iforwardmove > TURBOTHRESHOLD) + { + turbodetected[i] = true; + } + + if ((gametic & 31) == 0 + && ((gametic >> 5) % MAXPLAYERS) == i + && turbodetected[i]) + { + static char turbomessage[80]; + extern char *player_names[4]; + M_snprintf(turbomessage, sizeof(turbomessage), + "%s is turbo!", player_names[i]); + players[consoleplayer].message = turbomessage; + turbodetected[i] = false; + } + + if (netgame && !netdemo && !(gametic%ticdup) ) + { + if (gametic > BACKUPTICS + && consistancy[i][buf] != cmd->consistancy) + { + I_Error ("consistency failure (%i should be %i)", + cmd->consistancy, consistancy[i][buf]); + } + if (players[i].mo) + consistancy[i][buf] = players[i].mo->x; + else + consistancy[i][buf] = rndindex; + } + } + } + + // check for special buttons + for (i=0 ; i>BTS_SAVESHIFT; + gameaction = ga_savegame; + break; + } + } + } + } + + // Have we just finished displaying an intermission screen? + + if (oldgamestate == GS_INTERMISSION && gamestate != GS_INTERMISSION) + { + WI_End(); + } + + oldgamestate = gamestate; + + // do main actions + switch (gamestate) + { + case GS_LEVEL: + P_Ticker (); + ST_Ticker (); + AM_Ticker (); + HU_Ticker (); + break; + + case GS_INTERMISSION: + WI_Ticker (); + break; + + case GS_FINALE: + F_Ticker (); + break; + + case GS_DEMOSCREEN: + D_PageTicker (); + break; + } +} + + +// +// PLAYER STRUCTURE FUNCTIONS +// also see P_SpawnPlayer in P_Things +// + +// +// G_InitPlayer +// Called at the start. +// Called by the game initialization functions. +// +void G_InitPlayer (int player) +{ + // clear everything else to defaults + G_PlayerReborn (player); +} + + + +// +// G_PlayerFinishLevel +// Can when a player completes a level. +// +void G_PlayerFinishLevel (int player) +{ + player_t* p; + + p = &players[player]; + + memset (p->powers, 0, sizeof (p->powers)); + memset (p->cards, 0, sizeof (p->cards)); + p->mo->flags &= ~MF_SHADOW; // cancel invisibility + p->extralight = 0; // cancel gun flashes + p->fixedcolormap = 0; // cancel ir gogles + p->damagecount = 0; // no palette changes + p->bonuscount = 0; +} + + +// +// G_PlayerReborn +// Called after a player dies +// almost everything is cleared and initialized +// +void G_PlayerReborn (int player) +{ + player_t* p; + int i; + int frags[MAXPLAYERS]; + int killcount; + int itemcount; + int secretcount; + + memcpy (frags,players[player].frags,sizeof(frags)); + killcount = players[player].killcount; + itemcount = players[player].itemcount; + secretcount = players[player].secretcount; + + p = &players[player]; + memset (p, 0, sizeof(*p)); + + memcpy (players[player].frags, frags, sizeof(players[player].frags)); + players[player].killcount = killcount; + players[player].itemcount = itemcount; + players[player].secretcount = secretcount; + + p->usedown = p->attackdown = true; // don't do anything immediately + p->playerstate = PST_LIVE; + p->health = deh_initial_health; // Use dehacked value + p->readyweapon = p->pendingweapon = wp_pistol; + p->weaponowned[wp_fist] = true; + p->weaponowned[wp_pistol] = true; + p->ammo[am_clip] = deh_initial_bullets; + + for (i=0 ; imaxammo[i] = maxammo[i]; + +} + +// +// G_CheckSpot +// Returns false if the player cannot be respawned +// at the given mapthing_t spot +// because something is occupying it +// +void P_SpawnPlayer (mapthing_t* mthing); + +boolean +G_CheckSpot +( int playernum, + mapthing_t* mthing ) +{ + fixed_t x; + fixed_t y; + subsector_t* ss; + mobj_t* mo; + int i; + + if (!players[playernum].mo) + { + // first spawn of level, before corpses + for (i=0 ; ix == mthing->x << FRACBITS + && players[i].mo->y == mthing->y << FRACBITS) + return false; + return true; + } + + x = mthing->x << FRACBITS; + y = mthing->y << FRACBITS; + + if (!P_CheckPosition (players[playernum].mo, x, y) ) + return false; + + // flush an old corpse if needed + if (bodyqueslot >= BODYQUESIZE) + P_RemoveMobj (bodyque[bodyqueslot%BODYQUESIZE]); + bodyque[bodyqueslot%BODYQUESIZE] = players[playernum].mo; + bodyqueslot++; + + // spawn a teleport fog + ss = R_PointInSubsector (x,y); + + + // The code in the released source looks like this: + // + // an = ( ANG45 * (((unsigned int) mthing->angle)/45) ) + // >> ANGLETOFINESHIFT; + // mo = P_SpawnMobj (x+20*finecosine[an], y+20*finesine[an] + // , ss->sector->floorheight + // , MT_TFOG); + // + // But 'an' can be a signed value in the DOS version. This means that + // we get a negative index and the lookups into finecosine/finesine + // end up dereferencing values in finetangent[]. + // A player spawning on a deathmatch start facing directly west spawns + // "silently" with no spawn fog. Emulate this. + // + // This code is imported from PrBoom+. + + { + fixed_t xa, ya; + signed int an; + + // This calculation overflows in Vanilla Doom, but here we deliberately + // avoid integer overflow as it is undefined behavior, so the value of + // 'an' will always be positive. + an = (ANG45 >> ANGLETOFINESHIFT) * ((signed int) mthing->angle / 45); + + switch (an) + { + case 4096: // -4096: + xa = finetangent[2048]; // finecosine[-4096] + ya = finetangent[0]; // finesine[-4096] + break; + case 5120: // -3072: + xa = finetangent[3072]; // finecosine[-3072] + ya = finetangent[1024]; // finesine[-3072] + break; + case 6144: // -2048: + xa = finesine[0]; // finecosine[-2048] + ya = finetangent[2048]; // finesine[-2048] + break; + case 7168: // -1024: + xa = finesine[1024]; // finecosine[-1024] + ya = finetangent[3072]; // finesine[-1024] + break; + case 0: + case 1024: + case 2048: + case 3072: + xa = finecosine[an]; + ya = finesine[an]; + break; + default: + I_Error("G_CheckSpot: unexpected angle %d\n", an); + xa = ya = 0; + break; + } + mo = P_SpawnMobj(x + 20 * xa, y + 20 * ya, + ss->sector->floorheight, MT_TFOG); + } + + if (players[consoleplayer].viewz != 1) + S_StartSound (mo, sfx_telept); // don't start sound on first frame + + return true; +} + + +// +// G_DeathMatchSpawnPlayer +// Spawns a player at one of the random death match spots +// called at level load and each death +// +void G_DeathMatchSpawnPlayer (int playernum) +{ + int i,j; + int selections; + + selections = deathmatch_p - deathmatchstarts; + if (selections < 4) + I_Error ("Only %i deathmatch spots, 4 required", selections); + + for (j=0 ; j<20 ; j++) + { + i = P_Random() % selections; + if (G_CheckSpot (playernum, &deathmatchstarts[i]) ) + { + deathmatchstarts[i].type = playernum+1; + P_SpawnPlayer (&deathmatchstarts[i]); + return; + } + } + + // no good spot, so the player will probably get stuck + P_SpawnPlayer (&playerstarts[playernum]); +} + +// +// G_DoReborn +// +void G_DoReborn (int playernum) +{ + int i; + + if (!netgame) + { + // reload the level from scratch + gameaction = ga_loadlevel; + } + else + { + // respawn at the start + + // first dissasociate the corpse + players[playernum].mo->player = NULL; + + // spawn at random spot if in death match + if (deathmatch) + { + G_DeathMatchSpawnPlayer (playernum); + return; + } + + if (G_CheckSpot (playernum, &playerstarts[playernum]) ) + { + P_SpawnPlayer (&playerstarts[playernum]); + return; + } + + // try to spawn at one of the other players spots + for (i=0 ; i SAVEGAMESIZE) + { + I_Error ("Savegame buffer overrun"); + } + + // Finish up, close the savegame file. + + fclose(save_stream); + + if (recovery_savegame_file != NULL) + { + // We failed to save to the normal location, but we wrote a + // recovery file to the temp directory. Now we can bomb out + // with an error. + I_Error("Failed to open savegame file '%s' for writing.\n" + "But your game has been saved to '%s' for recovery.", + temp_savegame_file, recovery_savegame_file); + } + + // Now rename the temporary savegame file to the actual savegame + // file, overwriting the old savegame if there was one there. + + remove(savegame_file); + rename(temp_savegame_file, savegame_file); + + gameaction = ga_nothing; + M_StringCopy(savedescription, "", sizeof(savedescription)); + + players[consoleplayer].message = DEH_String(GGSAVED); + + // draw the pattern into the back screen + R_FillBackScreen (); +} + + +// +// G_InitNew +// Can be called by the startup code or the menu task, +// consoleplayer, displayplayer, playeringame[] should be set. +// +skill_t d_skill; +int d_episode; +int d_map; + +void +G_DeferedInitNew +( skill_t skill, + int episode, + int map) +{ + d_skill = skill; + d_episode = episode; + d_map = map; + gameaction = ga_newgame; +} + + +void G_DoNewGame (void) +{ + demoplayback = false; + netdemo = false; + netgame = false; + deathmatch = false; + playeringame[1] = playeringame[2] = playeringame[3] = 0; + respawnparm = false; + fastparm = false; + nomonsters = false; + consoleplayer = 0; + G_InitNew (d_skill, d_episode, d_map); + gameaction = ga_nothing; +} + + +void +G_InitNew +( skill_t skill, + int episode, + int map ) +{ + char *skytexturename; + int i; + + if (paused) + { + paused = false; + S_ResumeSound (); + } + + /* + // Note: This commented-out block of code was added at some point + // between the DOS version(s) and the Doom source release. It isn't + // found in disassemblies of the DOS version and causes IDCLEV and + // the -warp command line parameter to behave differently. + // This is left here for posterity. + + // This was quite messy with SPECIAL and commented parts. + // Supposedly hacks to make the latest edition work. + // It might not work properly. + if (episode < 1) + episode = 1; + + if ( gamemode == retail ) + { + if (episode > 4) + episode = 4; + } + else if ( gamemode == shareware ) + { + if (episode > 1) + episode = 1; // only start episode 1 on shareware + } + else + { + if (episode > 3) + episode = 3; + } + */ + + if (skill > sk_nightmare) + skill = sk_nightmare; + + if (gameversion >= exe_ultimate) + { + if (episode == 0) + { + episode = 4; + } + } + else + { + if (episode < 1) + { + episode = 1; + } + if (episode > 3) + { + episode = 3; + } + } + + if (episode > 1 && gamemode == shareware) + { + episode = 1; + } + + if (map < 1) + map = 1; + + if ( (map > 9) + && ( gamemode != commercial) ) + map = 9; + + M_ClearRandom (); + + if (skill == sk_nightmare || respawnparm ) + respawnmonsters = true; + else + respawnmonsters = false; + + if (fastparm || (skill == sk_nightmare && gameskill != sk_nightmare) ) + { + for (i=S_SARG_RUN1 ; i<=S_SARG_PAIN2 ; i++) + states[i].tics >>= 1; + mobjinfo[MT_BRUISERSHOT].speed = 20*FRACUNIT; + mobjinfo[MT_HEADSHOT].speed = 20*FRACUNIT; + mobjinfo[MT_TROOPSHOT].speed = 20*FRACUNIT; + } + else if (skill != sk_nightmare && gameskill == sk_nightmare) + { + for (i=S_SARG_RUN1 ; i<=S_SARG_PAIN2 ; i++) + states[i].tics <<= 1; + mobjinfo[MT_BRUISERSHOT].speed = 15*FRACUNIT; + mobjinfo[MT_HEADSHOT].speed = 10*FRACUNIT; + mobjinfo[MT_TROOPSHOT].speed = 10*FRACUNIT; + } + + // force players to be initialized upon first level load + for (i=0 ; iforwardmove = ((signed char)*demo_p++); + cmd->sidemove = ((signed char)*demo_p++); + + // If this is a longtics demo, read back in higher resolution + + if (longtics) + { + cmd->angleturn = *demo_p++; + cmd->angleturn |= (*demo_p++) << 8; + } + else + { + cmd->angleturn = ((unsigned char) *demo_p++)<<8; + } + + cmd->buttons = (unsigned char)*demo_p++; +} + +// Increase the size of the demo buffer to allow unlimited demos + +static void IncreaseDemoBuffer(void) +{ + int current_length; + byte *new_demobuffer; + byte *new_demop; + int new_length; + + // Find the current size + + current_length = demoend - demobuffer; + + // Generate a new buffer twice the size + new_length = current_length * 2; + + new_demobuffer = Z_Malloc(new_length, PU_STATIC, 0); + new_demop = new_demobuffer + (demo_p - demobuffer); + + // Copy over the old data + + memcpy(new_demobuffer, demobuffer, current_length); + + // Free the old buffer and point the demo pointers at the new buffer. + + Z_Free(demobuffer); + + demobuffer = new_demobuffer; + demo_p = new_demop; + demoend = demobuffer + new_length; +} + +void G_WriteDemoTiccmd (ticcmd_t* cmd) +{ + byte *demo_start; + + if (gamekeydown[key_demo_quit]) // press q to end demo recording + G_CheckDemoStatus (); + + demo_start = demo_p; + + *demo_p++ = cmd->forwardmove; + *demo_p++ = cmd->sidemove; + + // If this is a longtics demo, record in higher resolution + + if (longtics) + { + *demo_p++ = (cmd->angleturn & 0xff); + *demo_p++ = (cmd->angleturn >> 8) & 0xff; + } + else + { + *demo_p++ = cmd->angleturn >> 8; + } + + *demo_p++ = cmd->buttons; + + // reset demo pointer back + demo_p = demo_start; + + if (demo_p > demoend - 16) + { + if (vanilla_demo_limit) + { + // no more space + G_CheckDemoStatus (); + return; + } + else + { + // Vanilla demo limit disabled: unlimited + // demo lengths! + + IncreaseDemoBuffer(); + } + } + + G_ReadDemoTiccmd (cmd); // make SURE it is exactly the same +} + + + +// +// G_RecordDemo +// +void G_RecordDemo (char *name) +{ + size_t demoname_size; + int i; + int maxsize; + + usergame = false; + demoname_size = strlen(name) + 5; + demoname = Z_Malloc(demoname_size, PU_STATIC, NULL); + M_snprintf(demoname, demoname_size, "%s.lmp", name); + maxsize = 0x20000; + + //! + // @arg + // @category demo + // @vanilla + // + // Specify the demo buffer size (KiB) + // + + i = M_CheckParmWithArgs("-maxdemo", 1); + if (i) + maxsize = atoi(myargv[i+1])*1024; + demobuffer = Z_Malloc (maxsize,PU_STATIC,NULL); + demoend = demobuffer + maxsize; + + demorecording = true; +} + +// Get the demo version code appropriate for the version set in gameversion. +int G_VanillaVersionCode(void) +{ + switch (gameversion) + { + case exe_doom_1_2: + I_Error("Doom 1.2 does not have a version code!"); + case exe_doom_1_666: + return 106; + case exe_doom_1_7: + return 107; + case exe_doom_1_8: + return 108; + case exe_doom_1_9: + default: // All other versions are variants on v1.9: + return 109; + } +} + +void G_BeginRecording (void) +{ + int i; + + //! + // @category demo + // + // Record a high resolution "Doom 1.91" demo. + // + + longtics = M_CheckParm("-longtics") != 0; + + // If not recording a longtics demo, record in low res + + lowres_turn = !longtics; + + demo_p = demobuffer; + + // Save the right version code for this demo + + if (longtics) + { + *demo_p++ = DOOM_191_VERSION; + } + else + { + *demo_p++ = G_VanillaVersionCode(); + } + + *demo_p++ = gameskill; + *demo_p++ = gameepisode; + *demo_p++ = gamemap; + *demo_p++ = deathmatch; + *demo_p++ = respawnparm; + *demo_p++ = fastparm; + *demo_p++ = nomonsters; + *demo_p++ = consoleplayer; + + for (i=0 ; i= 0 && version <= 4) + { + return "v1.0/v1.1/v1.2"; + } + else + { + M_snprintf(resultbuf, sizeof(resultbuf), + "%i.%i (unknown)", version / 100, version % 100); + return resultbuf; + } +} + +void G_DoPlayDemo (void) +{ + skill_t skill; + int i, episode, map; + int demoversion; + + gameaction = ga_nothing; + demobuffer = demo_p = W_CacheLumpName (defdemoname, PU_STATIC); + + demoversion = *demo_p++; + + if (demoversion == G_VanillaVersionCode()) + { + longtics = false; + } + else if (demoversion == DOOM_191_VERSION) + { + // demo recorded with cph's modified "v1.91" doom exe + longtics = true; + } + else + { + char *message = "Demo is from a different game version!\n" + "(read %i, should be %i)\n" + "\n" + "*** You may need to upgrade your version " + "of Doom to v1.9. ***\n" + " See: https://www.doomworld.com/classicdoom" + "/info/patches.php\n" + " This appears to be %s."; + + //I_Error(message, demoversion, G_VanillaVersionCode(), + printf(message, demoversion, G_VanillaVersionCode(), + DemoVersionDescription(demoversion)); + } + + skill = *demo_p++; + episode = *demo_p++; + map = *demo_p++; + deathmatch = *demo_p++; + respawnparm = *demo_p++; + fastparm = *demo_p++; + nomonsters = *demo_p++; + consoleplayer = *demo_p++; + + for (i=0 ; i 0 + || M_CheckParm("-netdemo") > 0) + { + netgame = true; + netdemo = true; + } + + // don't spend a lot of time in loadlevel + precache = false; + G_InitNew (skill, episode, map); + precache = true; + starttime = I_GetTime (); + + usergame = false; + demoplayback = true; +} + +// +// G_TimeDemo +// +void G_TimeDemo (char* name) +{ + //! + // @vanilla + // + // Disable rendering the screen entirely. + // + + nodrawers = M_CheckParm ("-nodraw"); + + timingdemo = true; + singletics = true; + + defdemoname = name; + gameaction = ga_playdemo; +} + + +/* +=================== += += G_CheckDemoStatus += += Called after a death or level completion to allow demos to be cleaned up += Returns true if a new demo loop action will take place +=================== +*/ + +boolean G_CheckDemoStatus (void) +{ + int endtime; + + if (timingdemo) + { + float fps; + int realtics; + + endtime = I_GetTime (); + realtics = endtime - starttime; + fps = ((float) gametic * TICRATE) / realtics; + + // Prevent recursive calls + timingdemo = false; + demoplayback = false; + + I_Error ("timed %i gametics in %i realtics (%f fps)", + gametic, realtics, fps); + } + + if (demoplayback) + { + W_ReleaseLumpName(defdemoname); + demoplayback = false; + netdemo = false; + netgame = false; + deathmatch = false; + playeringame[1] = playeringame[2] = playeringame[3] = 0; + respawnparm = false; + fastparm = false; + nomonsters = false; + consoleplayer = 0; + + if (singledemo) + I_Quit (); + else + D_AdvanceDemo (); + + return true; + } + + if (demorecording) + { + *demo_p++ = DEMOMARKER; + M_WriteFile (demoname, demobuffer, demo_p - demobuffer); + Z_Free (demobuffer); + demorecording = false; + I_Error ("Demo %s recorded",demoname); + } + + return false; +} + + + diff --git a/firmware_p4/components/Applications/doom/g_game.h b/firmware_p4/components/Applications/doom/g_game.h new file mode 100644 index 000000000..da0df39b1 --- /dev/null +++ b/firmware_p4/components/Applications/doom/g_game.h @@ -0,0 +1,80 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Duh. +// + + +#ifndef __G_GAME__ +#define __G_GAME__ + +#include "doomdef.h" +#include "d_event.h" +#include "d_ticcmd.h" + + +// +// GAME +// +void G_DeathMatchSpawnPlayer (int playernum); + +void G_InitNew (skill_t skill, int episode, int map); + +// Can be called by the startup code or M_Responder. +// A normal game starts at map 1, +// but a warp test can start elsewhere +void G_DeferedInitNew (skill_t skill, int episode, int map); + +void G_DeferedPlayDemo (char* demo); + +// Can be called by the startup code or M_Responder, +// calls P_SetupLevel or W_EnterWorld. +void G_LoadGame (char* name); + +void G_DoLoadGame (void); + +// Called by M_Responder. +void G_SaveGame (int slot, char* description); + +// Only called by startup code. +void G_RecordDemo (char* name); + +void G_BeginRecording (void); + +void G_PlayDemo (char* name); +void G_TimeDemo (char* name); +boolean G_CheckDemoStatus (void); + +void G_ExitLevel (void); +void G_SecretExitLevel (void); + +void G_WorldDone (void); + +// Read current data from inputs and build a player movement command. + +void G_BuildTiccmd (ticcmd_t *cmd, int maketic); + +void G_Ticker (void); +boolean G_Responder (event_t* ev); + +void G_ScreenShot (void); + +void G_DrawMouseSpeedBox(void); +int G_VanillaVersionCode(void); + +extern int vanilla_savegame_limit; +extern int vanilla_demo_limit; +#endif + diff --git a/firmware_p4/components/Applications/doom/gusconf.c b/firmware_p4/components/Applications/doom/gusconf.c new file mode 100644 index 000000000..70cdd87c7 --- /dev/null +++ b/firmware_p4/components/Applications/doom/gusconf.c @@ -0,0 +1,271 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// GUS emulation code. +// +// Actually emulating a GUS is far too much work; fortunately +// GUS "emulation" already exists in the form of Timidity, which +// supports GUS patch files. This code therefore converts Doom's +// DMXGUS lump into an equivalent Timidity configuration file. +// + + +#include +#include +#include +#include + +#include "w_wad.h" +#include "z_zone.h" + +#define MAX_INSTRUMENTS 256 + +typedef struct +{ + char *patch_names[MAX_INSTRUMENTS]; + int mapping[MAX_INSTRUMENTS]; +} gus_config_t; + +char *gus_patch_path = ""; +unsigned int gus_ram_kb = 1024; + +static unsigned int MappingIndex(void) +{ + unsigned int result = gus_ram_kb / 256; + + if (result < 1) + { + return 1; + } + else if (result > 4) + { + return 4; + } + else + { + return result; + } +} + +static int SplitLine(char *line, char **fields, unsigned int max_fields) +{ + unsigned int num_fields; + char *p; + + fields[0] = line; + num_fields = 1; + + for (p = line; *p != '\0'; ++p) + { + if (*p == ',') + { + *p = '\0'; + + // Skip spaces following the comma. + do + { + ++p; + } while (*p != '\0' && isspace(*p)); + + fields[num_fields] = p; + ++num_fields; + --p; + + if (num_fields >= max_fields) + { + break; + } + } + else if (*p == '#') + { + *p = '\0'; + break; + } + } + + // Strip off trailing whitespace from the end of the line. + p = fields[num_fields - 1] + strlen(fields[num_fields - 1]); + while (p > fields[num_fields - 1] && isspace(*(p - 1))) + { + --p; + *p = '\0'; + } + + return num_fields; +} + +static void ParseLine(gus_config_t *config, char *line) +{ + char *fields[6]; + unsigned int num_fields; + unsigned int instr_id, mapped_id; + + num_fields = SplitLine(line, fields, 6); + + if (num_fields < 6) + { + return; + } + + instr_id = atoi(fields[0]); + mapped_id = atoi(fields[MappingIndex()]); + + free(config->patch_names[instr_id]); + config->patch_names[instr_id] = strdup(fields[5]); + config->mapping[instr_id] = mapped_id; +} + +static void ParseDMXConfig(char *dmxconf, gus_config_t *config) +{ + char *p, *newline; + unsigned int i; + + memset(config, 0, sizeof(gus_config_t)); + + for (i = 0; i < MAX_INSTRUMENTS; ++i) + { + config->mapping[i] = -1; + } + + p = dmxconf; + + for (;;) + { + newline = strchr(p, '\n'); + + if (newline != NULL) + { + *newline = '\0'; + } + + ParseLine(config, p); + + if (newline == NULL) + { + break; + } + else + { + p = newline + 1; + } + } +} + +static void FreeDMXConfig(gus_config_t *config) +{ + unsigned int i; + + for (i = 0; i < MAX_INSTRUMENTS; ++i) + { + free(config->patch_names[i]); + } +} + +static char *ReadDMXConfig(void) +{ + int lumpnum; + unsigned int len; + char *data; + + // TODO: This should be chosen based on gamemode == commercial: + + lumpnum = W_CheckNumForName("DMXGUS"); + + if (lumpnum < 0) + { + lumpnum = W_GetNumForName("DMXGUSC"); + } + + len = W_LumpLength(lumpnum); + data = Z_Malloc(len + 1, PU_STATIC, NULL); + W_ReadLump(lumpnum, data); + + return data; +} + +static boolean WriteTimidityConfig(char *path, gus_config_t *config) +{ + FILE *fstream; + unsigned int i; + + fstream = fopen(path, "w"); + + if (fstream == NULL) + { + return false; + } + + fprintf(fstream, "# Autogenerated Timidity config.\n\n"); + + fprintf(fstream, "dir %s\n", gus_patch_path); + + fprintf(fstream, "\nbank 0\n\n"); + + for (i = 0; i < 128; ++i) + { + if (config->mapping[i] >= 0 && config->mapping[i] < MAX_INSTRUMENTS + && config->patch_names[config->mapping[i]] != NULL) + { + fprintf(fstream, "%i %s\n", + i, config->patch_names[config->mapping[i]]); + } + } + + fprintf(fstream, "\ndrumset 0\n\n"); + + for (i = 128 + 25; i < MAX_INSTRUMENTS; ++i) + { + if (config->mapping[i] >= 0 && config->mapping[i] < MAX_INSTRUMENTS + && config->patch_names[config->mapping[i]] != NULL) + { + fprintf(fstream, "%i %s\n", + i - 128, config->patch_names[config->mapping[i]]); + } + } + + fprintf(fstream, "\n"); + + fclose(fstream); + + return true; +} + +boolean GUS_WriteConfig(char *path) +{ + boolean result; + char *dmxconf; + gus_config_t config; + + if (!strcmp(gus_patch_path, "")) + { + printf("You haven't configured gus_patch_path.\n"); + printf("gus_patch_path needs to point to the location of " + "your GUS patch set.\n" + "To get a copy of the \"standard\" GUS patches, " + "download a copy of dgguspat.zip.\n"); + + return false; + } + + dmxconf = ReadDMXConfig(); + ParseDMXConfig(dmxconf, &config); + + result = WriteTimidityConfig(path, &config); + + FreeDMXConfig(&config); + Z_Free(dmxconf); + + return result; +} + diff --git a/firmware_p4/components/Applications/doom/gusconf.h b/firmware_p4/components/Applications/doom/gusconf.h new file mode 100644 index 000000000..e0124266e --- /dev/null +++ b/firmware_p4/components/Applications/doom/gusconf.h @@ -0,0 +1,29 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// GUS emulation code. +// + +#ifndef __GUSCONF_H__ +#define __GUSCONF_H__ + +#include "doomtype.h" + +extern char *gus_patch_path; +extern unsigned int gus_ram_kb; + +boolean GUS_WriteConfig(char *path); + +#endif /* #ifndef __GUSCONF_H__ */ + diff --git a/firmware_p4/components/Applications/doom/hu_lib.c b/firmware_p4/components/Applications/doom/hu_lib.c new file mode 100644 index 000000000..47038a043 --- /dev/null +++ b/firmware_p4/components/Applications/doom/hu_lib.c @@ -0,0 +1,347 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: heads-up text and input code +// + + +#include + +#include "doomdef.h" +#include "doomkeys.h" + +#include "v_video.h" +#include "i_swap.h" + +#include "hu_lib.h" +#include "r_local.h" +#include "r_draw.h" + +// boolean : whether the screen is always erased +#define noterased viewwindowx + +extern boolean automapactive; // in AM_map.c + +void HUlib_init(void) +{ +} + +void HUlib_clearTextLine(hu_textline_t* t) +{ + t->len = 0; + t->l[0] = 0; + t->needsupdate = true; +} + +void +HUlib_initTextLine +( hu_textline_t* t, + int x, + int y, + patch_t** f, + int sc ) +{ + t->x = x; + t->y = y; + t->f = f; + t->sc = sc; + HUlib_clearTextLine(t); +} + +boolean +HUlib_addCharToTextLine +( hu_textline_t* t, + char ch ) +{ + + if (t->len == HU_MAXLINELENGTH) + return false; + else + { + t->l[t->len++] = ch; + t->l[t->len] = 0; + t->needsupdate = 4; + return true; + } + +} + +boolean HUlib_delCharFromTextLine(hu_textline_t* t) +{ + + if (!t->len) return false; + else + { + t->l[--t->len] = 0; + t->needsupdate = 4; + return true; + } + +} + +void +HUlib_drawTextLine +( hu_textline_t* l, + boolean drawcursor ) +{ + + int i; + int w; + int x; + unsigned char c; + + // draw the new stuff + x = l->x; + for (i=0;ilen;i++) + { + c = toupper((int)l->l[i]); + if (c != ' ' + && c >= l->sc + && c <= '_') + { + w = SHORT(l->f[c - l->sc]->width); + if (x+w > SCREENWIDTH) + break; + V_DrawPatchDirect(x, l->y, l->f[c - l->sc]); + x += w; + } + else + { + x += 4; + if (x >= SCREENWIDTH) + break; + } + } + + // draw the cursor if requested + if (drawcursor + && x + SHORT(l->f['_' - l->sc]->width) <= SCREENWIDTH) + { + V_DrawPatchDirect(x, l->y, l->f['_' - l->sc]); + } +} + + +// sorta called by HU_Erase and just better darn get things straight +void HUlib_eraseTextLine(hu_textline_t* l) +{ + int lh; + int y; + int yoffset; + + // Only erases when NOT in automap and the screen is reduced, + // and the text must either need updating or refreshing + // (because of a recent change back from the automap) + + if (!automapactive && + viewwindowx && l->needsupdate) + { + lh = SHORT(l->f[0]->height) + 1; + for (y=l->y,yoffset=y*SCREENWIDTH ; yy+lh ; y++,yoffset+=SCREENWIDTH) + { + if (y < viewwindowy || y >= viewwindowy + viewheight) + R_VideoErase(yoffset, SCREENWIDTH); // erase entire line + else + { + R_VideoErase(yoffset, viewwindowx); // erase left border + R_VideoErase(yoffset + viewwindowx + viewwidth, viewwindowx); + // erase right border + } + } + } + + if (l->needsupdate) l->needsupdate--; + +} + +void +HUlib_initSText +( hu_stext_t* s, + int x, + int y, + int h, + patch_t** font, + int startchar, + boolean* on ) +{ + + int i; + + s->h = h; + s->on = on; + s->laston = true; + s->cl = 0; + for (i=0;il[i], + x, y - i*(SHORT(font[0]->height)+1), + font, startchar); + +} + +void HUlib_addLineToSText(hu_stext_t* s) +{ + + int i; + + // add a clear line + if (++s->cl == s->h) + s->cl = 0; + HUlib_clearTextLine(&s->l[s->cl]); + + // everything needs updating + for (i=0 ; ih ; i++) + s->l[i].needsupdate = 4; + +} + +void +HUlib_addMessageToSText +( hu_stext_t* s, + char* prefix, + char* msg ) +{ + HUlib_addLineToSText(s); + if (prefix) + while (*prefix) + HUlib_addCharToTextLine(&s->l[s->cl], *(prefix++)); + + while (*msg) + HUlib_addCharToTextLine(&s->l[s->cl], *(msg++)); +} + +void HUlib_drawSText(hu_stext_t* s) +{ + int i, idx; + hu_textline_t *l; + + if (!*s->on) + return; // if not on, don't draw + + // draw everything + for (i=0 ; ih ; i++) + { + idx = s->cl - i; + if (idx < 0) + idx += s->h; // handle queue of lines + + l = &s->l[idx]; + + // need a decision made here on whether to skip the draw + HUlib_drawTextLine(l, false); // no cursor, please + } + +} + +void HUlib_eraseSText(hu_stext_t* s) +{ + + int i; + + for (i=0 ; ih ; i++) + { + if (s->laston && !*s->on) + s->l[i].needsupdate = 4; + HUlib_eraseTextLine(&s->l[i]); + } + s->laston = *s->on; + +} + +void +HUlib_initIText +( hu_itext_t* it, + int x, + int y, + patch_t** font, + int startchar, + boolean* on ) +{ + it->lm = 0; // default left margin is start of text + it->on = on; + it->laston = true; + HUlib_initTextLine(&it->l, x, y, font, startchar); +} + + +// The following deletion routines adhere to the left margin restriction +void HUlib_delCharFromIText(hu_itext_t* it) +{ + if (it->l.len != it->lm) + HUlib_delCharFromTextLine(&it->l); +} + +void HUlib_eraseLineFromIText(hu_itext_t* it) +{ + while (it->lm != it->l.len) + HUlib_delCharFromTextLine(&it->l); +} + +// Resets left margin as well +void HUlib_resetIText(hu_itext_t* it) +{ + it->lm = 0; + HUlib_clearTextLine(&it->l); +} + +void +HUlib_addPrefixToIText +( hu_itext_t* it, + char* str ) +{ + while (*str) + HUlib_addCharToTextLine(&it->l, *(str++)); + it->lm = it->l.len; +} + +// wrapper function for handling general keyed input. +// returns true if it ate the key +boolean +HUlib_keyInIText +( hu_itext_t* it, + unsigned char ch ) +{ + ch = toupper(ch); + + if (ch >= ' ' && ch <= '_') + HUlib_addCharToTextLine(&it->l, (char) ch); + else + if (ch == KEY_BACKSPACE) + HUlib_delCharFromIText(it); + else + if (ch != KEY_ENTER) + return false; // did not eat key + + return true; // ate the key + +} + +void HUlib_drawIText(hu_itext_t* it) +{ + + hu_textline_t *l = &it->l; + + if (!*it->on) + return; + HUlib_drawTextLine(l, true); // draw the line w/ cursor + +} + +void HUlib_eraseIText(hu_itext_t* it) +{ + if (it->laston && !*it->on) + it->l.needsupdate = 4; + HUlib_eraseTextLine(&it->l); + it->laston = *it->on; +} + diff --git a/firmware_p4/components/Applications/doom/hu_lib.h b/firmware_p4/components/Applications/doom/hu_lib.h new file mode 100644 index 000000000..8f0994e60 --- /dev/null +++ b/firmware_p4/components/Applications/doom/hu_lib.h @@ -0,0 +1,182 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: none +// + +#ifndef __HULIB__ +#define __HULIB__ + +// We are referring to patches. +#include "r_defs.h" + +// font stuff +#define HU_CHARERASE KEY_BACKSPACE + +#define HU_MAXLINES 4 +#define HU_MAXLINELENGTH 80 + +// +// Typedefs of widgets +// + +// Text Line widget +// (parent of Scrolling Text and Input Text widgets) +typedef struct +{ + // left-justified position of scrolling text window + int x; + int y; + + patch_t** f; // font + int sc; // start character + char l[HU_MAXLINELENGTH+1]; // line of text + int len; // current line length + + // whether this line needs to be udpated + int needsupdate; + +} hu_textline_t; + + + +// Scrolling Text window widget +// (child of Text Line widget) +typedef struct +{ + hu_textline_t l[HU_MAXLINES]; // text lines to draw + int h; // height in lines + int cl; // current line number + + // pointer to boolean stating whether to update window + boolean* on; + boolean laston; // last value of *->on. + +} hu_stext_t; + + + +// Input Text Line widget +// (child of Text Line widget) +typedef struct +{ + hu_textline_t l; // text line to input on + + // left margin past which I am not to delete characters + int lm; + + // pointer to boolean stating whether to update window + boolean* on; + boolean laston; // last value of *->on; + +} hu_itext_t; + + +// +// Widget creation, access, and update routines +// + +// initializes heads-up widget library +void HUlib_init(void); + +// +// textline code +// + +// clear a line of text +void HUlib_clearTextLine(hu_textline_t *t); + +void HUlib_initTextLine(hu_textline_t *t, int x, int y, patch_t **f, int sc); + +// returns success +boolean HUlib_addCharToTextLine(hu_textline_t *t, char ch); + +// returns success +boolean HUlib_delCharFromTextLine(hu_textline_t *t); + +// draws tline +void HUlib_drawTextLine(hu_textline_t *l, boolean drawcursor); + +// erases text line +void HUlib_eraseTextLine(hu_textline_t *l); + + +// +// Scrolling Text window widget routines +// + +// ? +void +HUlib_initSText +( hu_stext_t* s, + int x, + int y, + int h, + patch_t** font, + int startchar, + boolean* on ); + +// add a new line +void HUlib_addLineToSText(hu_stext_t* s); + +// ? +void +HUlib_addMessageToSText +( hu_stext_t* s, + char* prefix, + char* msg ); + +// draws stext +void HUlib_drawSText(hu_stext_t* s); + +// erases all stext lines +void HUlib_eraseSText(hu_stext_t* s); + +// Input Text Line widget routines +void +HUlib_initIText +( hu_itext_t* it, + int x, + int y, + patch_t** font, + int startchar, + boolean* on ); + +// enforces left margin +void HUlib_delCharFromIText(hu_itext_t* it); + +// enforces left margin +void HUlib_eraseLineFromIText(hu_itext_t* it); + +// resets line and left margin +void HUlib_resetIText(hu_itext_t* it); + +// left of left-margin +void +HUlib_addPrefixToIText +( hu_itext_t* it, + char* str ); + +// whether eaten +boolean +HUlib_keyInIText +( hu_itext_t* it, + unsigned char ch ); + +void HUlib_drawIText(hu_itext_t* it); + +// erases all itext lines +void HUlib_eraseIText(hu_itext_t* it); + +#endif diff --git a/firmware_p4/components/Applications/doom/hu_stuff.c b/firmware_p4/components/Applications/doom/hu_stuff.c new file mode 100644 index 000000000..b63cac765 --- /dev/null +++ b/firmware_p4/components/Applications/doom/hu_stuff.c @@ -0,0 +1,641 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: Heads-up displays +// + + +#include + +#include "doomdef.h" +#include "doomkeys.h" + +#include "z_zone.h" + +#include "deh_main.h" +#include "i_swap.h" +#include "i_video.h" + +#include "hu_stuff.h" +#include "hu_lib.h" +#include "m_controls.h" +#include "m_misc.h" +#include "w_wad.h" + +#include "s_sound.h" + +#include "doomstat.h" + +// Data. +#include "dstrings.h" +#include "sounds.h" + +// +// Locally used constants, shortcuts. +// +#define HU_TITLE (mapnames[(gameepisode-1)*9+gamemap-1]) +#define HU_TITLE2 (mapnames_commercial[gamemap-1]) +#define HU_TITLEP (mapnames_commercial[gamemap-1 + 32]) +#define HU_TITLET (mapnames_commercial[gamemap-1 + 64]) +#define HU_TITLE_CHEX (mapnames[gamemap - 1]) +#define HU_TITLEHEIGHT 1 +#define HU_TITLEX 0 +#define HU_TITLEY (167 - SHORT(hu_font[0]->height)) + +#define HU_INPUTTOGGLE 't' +#define HU_INPUTX HU_MSGX +#define HU_INPUTY (HU_MSGY + HU_MSGHEIGHT*(SHORT(hu_font[0]->height) +1)) +#define HU_INPUTWIDTH 64 +#define HU_INPUTHEIGHT 1 + + + +char *chat_macros[10] = +{ + HUSTR_CHATMACRO0, + HUSTR_CHATMACRO1, + HUSTR_CHATMACRO2, + HUSTR_CHATMACRO3, + HUSTR_CHATMACRO4, + HUSTR_CHATMACRO5, + HUSTR_CHATMACRO6, + HUSTR_CHATMACRO7, + HUSTR_CHATMACRO8, + HUSTR_CHATMACRO9 +}; + +char* player_names[] = +{ + HUSTR_PLRGREEN, + HUSTR_PLRINDIGO, + HUSTR_PLRBROWN, + HUSTR_PLRRED +}; + +char chat_char; // remove later. +static player_t* plr; +patch_t* hu_font[HU_FONTSIZE]; +static hu_textline_t w_title; +boolean chat_on; +static hu_itext_t w_chat; +static boolean always_off = false; +static char chat_dest[MAXPLAYERS]; +static hu_itext_t w_inputbuffer[MAXPLAYERS]; + +static boolean message_on; +boolean message_dontfuckwithme; +static boolean message_nottobefuckedwith; + +static hu_stext_t w_message; +static int message_counter; + +extern int showMessages; + +static boolean headsupactive = false; + +// +// Builtin map names. +// The actual names can be found in DStrings.h. +// + +char* mapnames[] = // DOOM shareware/registered/retail (Ultimate) names. +{ + + HUSTR_E1M1, + HUSTR_E1M2, + HUSTR_E1M3, + HUSTR_E1M4, + HUSTR_E1M5, + HUSTR_E1M6, + HUSTR_E1M7, + HUSTR_E1M8, + HUSTR_E1M9, + + HUSTR_E2M1, + HUSTR_E2M2, + HUSTR_E2M3, + HUSTR_E2M4, + HUSTR_E2M5, + HUSTR_E2M6, + HUSTR_E2M7, + HUSTR_E2M8, + HUSTR_E2M9, + + HUSTR_E3M1, + HUSTR_E3M2, + HUSTR_E3M3, + HUSTR_E3M4, + HUSTR_E3M5, + HUSTR_E3M6, + HUSTR_E3M7, + HUSTR_E3M8, + HUSTR_E3M9, + + HUSTR_E4M1, + HUSTR_E4M2, + HUSTR_E4M3, + HUSTR_E4M4, + HUSTR_E4M5, + HUSTR_E4M6, + HUSTR_E4M7, + HUSTR_E4M8, + HUSTR_E4M9, + + "NEWLEVEL", + "NEWLEVEL", + "NEWLEVEL", + "NEWLEVEL", + "NEWLEVEL", + "NEWLEVEL", + "NEWLEVEL", + "NEWLEVEL", + "NEWLEVEL" +}; + +// List of names for levels in commercial IWADs +// (doom2.wad, plutonia.wad, tnt.wad). These are stored in a +// single large array; WADs like pl2.wad have a MAP33, and rely on +// the layout in the Vanilla executable, where it is possible to +// overflow the end of one array into the next. + +char *mapnames_commercial[] = +{ + // DOOM 2 map names. + + HUSTR_1, + HUSTR_2, + HUSTR_3, + HUSTR_4, + HUSTR_5, + HUSTR_6, + HUSTR_7, + HUSTR_8, + HUSTR_9, + HUSTR_10, + HUSTR_11, + + HUSTR_12, + HUSTR_13, + HUSTR_14, + HUSTR_15, + HUSTR_16, + HUSTR_17, + HUSTR_18, + HUSTR_19, + HUSTR_20, + + HUSTR_21, + HUSTR_22, + HUSTR_23, + HUSTR_24, + HUSTR_25, + HUSTR_26, + HUSTR_27, + HUSTR_28, + HUSTR_29, + HUSTR_30, + HUSTR_31, + HUSTR_32, + + // Plutonia WAD map names. + + PHUSTR_1, + PHUSTR_2, + PHUSTR_3, + PHUSTR_4, + PHUSTR_5, + PHUSTR_6, + PHUSTR_7, + PHUSTR_8, + PHUSTR_9, + PHUSTR_10, + PHUSTR_11, + + PHUSTR_12, + PHUSTR_13, + PHUSTR_14, + PHUSTR_15, + PHUSTR_16, + PHUSTR_17, + PHUSTR_18, + PHUSTR_19, + PHUSTR_20, + + PHUSTR_21, + PHUSTR_22, + PHUSTR_23, + PHUSTR_24, + PHUSTR_25, + PHUSTR_26, + PHUSTR_27, + PHUSTR_28, + PHUSTR_29, + PHUSTR_30, + PHUSTR_31, + PHUSTR_32, + + // TNT WAD map names. + + THUSTR_1, + THUSTR_2, + THUSTR_3, + THUSTR_4, + THUSTR_5, + THUSTR_6, + THUSTR_7, + THUSTR_8, + THUSTR_9, + THUSTR_10, + THUSTR_11, + + THUSTR_12, + THUSTR_13, + THUSTR_14, + THUSTR_15, + THUSTR_16, + THUSTR_17, + THUSTR_18, + THUSTR_19, + THUSTR_20, + + THUSTR_21, + THUSTR_22, + THUSTR_23, + THUSTR_24, + THUSTR_25, + THUSTR_26, + THUSTR_27, + THUSTR_28, + THUSTR_29, + THUSTR_30, + THUSTR_31, + THUSTR_32 +}; + +void HU_Init(void) +{ + + int i; + int j; + char buffer[9]; + + // load the heads-up font + j = HU_FONTSTART; + for (i=0;imessage && !message_nottobefuckedwith) + || (plr->message && message_dontfuckwithme)) + { + HUlib_addMessageToSText(&w_message, 0, plr->message); + plr->message = 0; + message_on = true; + message_counter = HU_MSGTIMEOUT; + message_nottobefuckedwith = message_dontfuckwithme; + message_dontfuckwithme = 0; + } + + } // else message_on = false; + + // check for incoming chat characters + if (netgame) + { + for (i=0 ; imessage = DEH_String(HUSTR_MSGU); + } + else + { + chatchars[head] = c; + head = (head + 1) & (QUEUESIZE-1); + } +} + +char HU_dequeueChatChar(void) +{ + char c; + + if (head != tail) + { + c = chatchars[tail]; + tail = (tail + 1) & (QUEUESIZE-1); + } + else + { + c = 0; + } + + return c; +} + +boolean HU_Responder(event_t *ev) +{ + + static char lastmessage[HU_MAXLINELENGTH+1]; + char* macromessage; + boolean eatkey = false; + static boolean altdown = false; + unsigned char c; + int i; + int numplayers; + + static int num_nobrainers = 0; + + numplayers = 0; + for (i=0 ; idata1 == KEY_RSHIFT) + { + return false; + } + else if (ev->data1 == KEY_RALT || ev->data1 == KEY_LALT) + { + altdown = ev->type == ev_keydown; + return false; + } + + if (ev->type != ev_keydown) + return false; + + if (!chat_on) + { + if (ev->data1 == key_message_refresh) + { + message_on = true; + message_counter = HU_MSGTIMEOUT; + eatkey = true; + } + else if (netgame && ev->data2 == key_multi_msg) + { + eatkey = chat_on = true; + HUlib_resetIText(&w_chat); + HU_queueChatChar(HU_BROADCAST); + } + else if (netgame && numplayers > 2) + { + for (i=0; idata2 == key_multi_msgplayer[i]) + { + if (playeringame[i] && i!=consoleplayer) + { + eatkey = chat_on = true; + HUlib_resetIText(&w_chat); + HU_queueChatChar(i+1); + break; + } + else if (i == consoleplayer) + { + num_nobrainers++; + if (num_nobrainers < 3) + plr->message = DEH_String(HUSTR_TALKTOSELF1); + else if (num_nobrainers < 6) + plr->message = DEH_String(HUSTR_TALKTOSELF2); + else if (num_nobrainers < 9) + plr->message = DEH_String(HUSTR_TALKTOSELF3); + else if (num_nobrainers < 32) + plr->message = DEH_String(HUSTR_TALKTOSELF4); + else + plr->message = DEH_String(HUSTR_TALKTOSELF5); + } + } + } + } + } + else + { + // send a macro + if (altdown) + { + c = ev->data1 - '0'; + if (c > 9) + return false; + // fprintf(stderr, "got here\n"); + macromessage = chat_macros[c]; + + // kill last message with a '\n' + HU_queueChatChar(KEY_ENTER); // DEBUG!!! + + // send the macro message + while (*macromessage) + HU_queueChatChar(*macromessage++); + HU_queueChatChar(KEY_ENTER); + + // leave chat mode and notify that it was sent + chat_on = false; + M_StringCopy(lastmessage, chat_macros[c], sizeof(lastmessage)); + plr->message = lastmessage; + eatkey = true; + } + else + { + c = ev->data2; + + eatkey = HUlib_keyInIText(&w_chat, c); + if (eatkey) + { + // static unsigned char buf[20]; // DEBUG + HU_queueChatChar(c); + + // M_snprintf(buf, sizeof(buf), "KEY: %d => %d", ev->data1, c); + // plr->message = buf; + } + if (c == KEY_ENTER) + { + chat_on = false; + if (w_chat.l.len) + { + M_StringCopy(lastmessage, w_chat.l.l, sizeof(lastmessage)); + plr->message = lastmessage; + } + } + else if (c == KEY_ESCAPE) + chat_on = false; + } + } + + return eatkey; + +} diff --git a/firmware_p4/components/Applications/doom/hu_stuff.h b/firmware_p4/components/Applications/doom/hu_stuff.h new file mode 100644 index 000000000..a3affc5b9 --- /dev/null +++ b/firmware_p4/components/Applications/doom/hu_stuff.h @@ -0,0 +1,59 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: Head up display +// + +#ifndef __HU_STUFF_H__ +#define __HU_STUFF_H__ + +#include "d_event.h" + + +// +// Globally visible constants. +// +#define HU_FONTSTART '!' // the first font characters +#define HU_FONTEND '_' // the last font characters + +// Calculate # of glyphs in font. +#define HU_FONTSIZE (HU_FONTEND - HU_FONTSTART + 1) + +#define HU_BROADCAST 5 + +#define HU_MSGX 0 +#define HU_MSGY 0 +#define HU_MSGWIDTH 64 // in characters +#define HU_MSGHEIGHT 1 // in lines + +#define HU_MSGTIMEOUT (4*TICRATE) + +// +// HEADS UP TEXT +// + +void HU_Init(void); +void HU_Start(void); + +boolean HU_Responder(event_t* ev); + +void HU_Ticker(void); +void HU_Drawer(void); +char HU_dequeueChatChar(void); +void HU_Erase(void); + +extern char *chat_macros[10]; + +#endif + diff --git a/firmware_p4/components/Applications/doom/i_cdmus.c b/firmware_p4/components/Applications/doom/i_cdmus.c new file mode 100644 index 000000000..12a815cfa --- /dev/null +++ b/firmware_p4/components/Applications/doom/i_cdmus.c @@ -0,0 +1,243 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 1993-2008 Raven Software +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// +// SDL implementation of the Hexen CD interface. +// + +#include + +#ifdef ORIGCODE +#include "SDL2/SDL.h" +#include "SDL2/SDL_cdrom.h" +#endif + +#include "doomtype.h" + +#include "i_cdmus.h" + +#ifdef ORIGCODE +static SDL_CD *cd_handle = NULL; +static char *startup_error = NULL; +static const char *cd_name = NULL; +#endif + +int cd_Error; + +int I_CDMusInit(void) +{ +#ifdef ORIGCODE + int drive_num = 0; + + // The initialize function is re-invoked when the CD track play cheat + // is used, so use the opportunity to call SDL_CDStatus() to update + // the status of the drive. + + if (cd_handle == NULL) + { + if (SDL_Init(SDL_INIT_CDROM) < 0) + { + startup_error = "Failed to init CD subsystem."; + cd_Error = 1; + return -1; + } + + // TODO: config variable to control CDROM to use. + + cd_handle = SDL_CDOpen(drive_num); + + if (cd_handle == NULL) + { + startup_error = "Failed to open CD-ROM drive."; + cd_Error = 1; + return -1; + } + + cd_name = SDL_CDName(drive_num); + } + + if (SDL_CDStatus(cd_handle) == CD_ERROR) + { + startup_error = "Failed to read CD status."; + cd_Error = 1; + return -1; + } + + if (!CD_INDRIVE(cd_handle->status)) + { + startup_error = "No CD in drive."; + cd_Error = 1; + return -1; + } + + cd_Error = 0; +#endif + return 0; +} + +// We cannot print status messages inline during startup, they must +// be deferred until after I_CDMusInit has returned. + +void I_CDMusPrintStartup(void) +{ +#ifdef ORIGCODE + if (cd_name != NULL) + { + printf("I_CDMusInit: Using CD-ROM drive: %s\n", cd_name); + } + + if (startup_error != NULL) + { + fprintf(stderr, "I_CDMusInit: %s\n", startup_error); + } +#endif +} + +int I_CDMusPlay(int track) +{ +#ifdef ORIGCODE + int result; + + if (cd_handle == NULL) + { + cd_Error = 1; + return -1; + } + + // Play one track + // Track is indexed from 1. + + result = SDL_CDPlayTracks(cd_handle, track - 1, 0, 1, 0); + + cd_Error = 0; + return result; +#else + return 0; +#endif +} + +int I_CDMusStop(void) +{ +#ifdef ORIGCODE + int result; + + result = SDL_CDStop(cd_handle); + + cd_Error = 0; + + return result; +#else + return 0; +#endif +} + +int I_CDMusResume(void) +{ +#ifdef ORIGCODE + int result; + + result = SDL_CDResume(cd_handle); + + cd_Error = 0; + + return result; +#else + return 0; +#endif +} + +int I_CDMusSetVolume(int volume) +{ + /* Not supported yet */ + + cd_Error = 0; + + return 0; +} + +int I_CDMusFirstTrack(void) +{ +#ifdef ORIGCODE + int i; + + if (cd_handle == NULL) + { + cd_Error = 1; + return -1; + } + + // Find the first audio track. + + for (i=0; inumtracks; ++i) + { + if (cd_handle->track[i].type == SDL_AUDIO_TRACK) + { + cd_Error = 0; + + // Tracks are indexed from 1. + return i + 1; + } + } + + // Don't know? + cd_Error = 1; + + return -1; +#else + return 0; +#endif +} + +int I_CDMusLastTrack(void) +{ +#ifdef ORIGCODE + if (cd_handle == NULL) + { + cd_Error = 1; + return -1; + } + + cd_Error = 0; + + return cd_handle->numtracks; +#else + return 0; +#endif +} + +int I_CDMusTrackLength(int track_num) +{ +#ifdef ORIGCODE + SDL_CDtrack *track; + + if (cd_handle == NULL || track_num < 1 || track_num > cd_handle->numtracks) + { + cd_Error = 1; + return -1; + } + + // Track number is indexed from 1. + + track = &cd_handle->track[track_num - 1]; + + // Round up to the next second + + cd_Error = 0; + + return (track->length + CD_FPS - 1) / CD_FPS; +#else + return 0; +#endif +} + diff --git a/firmware_p4/components/Applications/doom/i_cdmus.h b/firmware_p4/components/Applications/doom/i_cdmus.h new file mode 100644 index 000000000..31db2a659 --- /dev/null +++ b/firmware_p4/components/Applications/doom/i_cdmus.h @@ -0,0 +1,41 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 1993-2008 Raven Software +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// + +// i_cdmus.h + +#ifndef __ICDMUS__ +#define __ICDMUS__ + +#define CDERR_NOTINSTALLED 10 // MSCDEX not installed +#define CDERR_NOAUDIOSUPPORT 11 // CD-ROM Doesn't support audio +#define CDERR_NOAUDIOTRACKS 12 // Current CD has no audio tracks +#define CDERR_BADDRIVE 20 // Bad drive number +#define CDERR_BADTRACK 21 // Bad track number +#define CDERR_IOCTLBUFFMEM 22 // Not enough low memory for IOCTL +#define CDERR_DEVREQBASE 100 // DevReq errors + +extern int cd_Error; + +int I_CDMusInit(void); +void I_CDMusPrintStartup(void); +int I_CDMusPlay(int track); +int I_CDMusStop(void); +int I_CDMusResume(void); +int I_CDMusSetVolume(int volume); +int I_CDMusFirstTrack(void); +int I_CDMusLastTrack(void); +int I_CDMusTrackLength(int track); + +#endif diff --git a/firmware_p4/components/Applications/doom/i_endoom.c b/firmware_p4/components/Applications/doom/i_endoom.c new file mode 100644 index 000000000..6de261bb1 --- /dev/null +++ b/firmware_p4/components/Applications/doom/i_endoom.c @@ -0,0 +1,101 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Exit text-mode ENDOOM screen. +// + +#include +#include + +#include "config.h" +#include "doomtype.h" +#include "i_video.h" + +#ifdef ORIGCODE +#include "txt_main.h" +#endif + + +#ifdef __DJGPP__ +#include +#endif // __DJGPP__ + + +#define ENDOOM_W 80 +#define ENDOOM_H 25 + +// +// Displays the text mode ending screen after the game quits +// + +void I_Endoom(byte *endoom_data) +{ +#ifdef ORIGCODE + unsigned char *screendata; + int y; + int indent; + + // Set up text mode screen + + TXT_Init(); + I_InitWindowTitle(); + I_InitWindowIcon(); + + // Write the data to the screen memory + + screendata = TXT_GetScreenData(); + + indent = (ENDOOM_W - TXT_SCREEN_W) / 2; + + for (y=0; y 0) + { + break; + } + + TXT_Sleep(0); + } + + // Shut down text mode screen + + TXT_Shutdown(); + +#elif defined(__DJGPP__) + + int y; + + // move cursor to bottom + // there's a direct call for moving cursor somewhere but this is simpler to write + for (y = 0; y < ENDOOM_H; y++) { + puts("\n"); + } + + // allegro exit should have been run already and so we should be in text mode again + movedata(_my_ds(), (unsigned) endoom_data, _dos_ds, 0xB8000UL, ENDOOM_W * ENDOOM_H * 2); + +#endif +} + diff --git a/firmware_p4/components/Applications/doom/i_endoom.h b/firmware_p4/components/Applications/doom/i_endoom.h new file mode 100644 index 000000000..8c8ff457f --- /dev/null +++ b/firmware_p4/components/Applications/doom/i_endoom.h @@ -0,0 +1,29 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Exit text-mode ENDOOM screen. +// + + +#ifndef __I_ENDOOM__ +#define __I_ENDOOM__ + +// Display the Endoom screen on shutdown. Pass a pointer to the +// ENDOOM lump. + +void I_Endoom(byte *data); + +#endif + diff --git a/firmware_p4/components/Applications/doom/i_input.c b/firmware_p4/components/Applications/doom/i_input.c new file mode 100644 index 000000000..7ec4b63dd --- /dev/null +++ b/firmware_p4/components/Applications/doom/i_input.c @@ -0,0 +1,341 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// + + +#include +#include +#include +#include +#include +#include + +#include "config.h" +#include "deh_str.h" +#include "doomtype.h" +#include "doomkeys.h" +#include "i_joystick.h" +#include "i_system.h" +#include "i_swap.h" +#include "i_timer.h" +#include "i_video.h" +#include "i_scale.h" +#include "m_argv.h" +#include "m_config.h" +#include "m_misc.h" +#include "tables.h" +#include "v_video.h" +#include "w_wad.h" +#include "z_zone.h" + +#include "doomgeneric.h" + +int vanilla_keyboard_mapping = 1; + +// Is the shift key currently down? + +static int shiftdown = 0; + +// Lookup table for mapping AT keycodes to their doom keycode +static const char at_to_doom[] = +{ + /* 0x00 */ 0x00, + /* 0x01 */ KEY_ESCAPE, + /* 0x02 */ '1', + /* 0x03 */ '2', + /* 0x04 */ '3', + /* 0x05 */ '4', + /* 0x06 */ '5', + /* 0x07 */ '6', + /* 0x08 */ '7', + /* 0x09 */ '8', + /* 0x0a */ '9', + /* 0x0b */ '0', + /* 0x0c */ '-', + /* 0x0d */ '=', + /* 0x0e */ KEY_BACKSPACE, + /* 0x0f */ KEY_TAB, + /* 0x10 */ 'q', + /* 0x11 */ 'w', + /* 0x12 */ 'e', + /* 0x13 */ 'r', + /* 0x14 */ 't', + /* 0x15 */ 'y', + /* 0x16 */ 'u', + /* 0x17 */ 'i', + /* 0x18 */ 'o', + /* 0x19 */ 'p', + /* 0x1a */ '[', + /* 0x1b */ ']', + /* 0x1c */ KEY_ENTER, + /* 0x1d */ KEY_FIRE, /* KEY_RCTRL, */ + /* 0x1e */ 'a', + /* 0x1f */ 's', + /* 0x20 */ 'd', + /* 0x21 */ 'f', + /* 0x22 */ 'g', + /* 0x23 */ 'h', + /* 0x24 */ 'j', + /* 0x25 */ 'k', + /* 0x26 */ 'l', + /* 0x27 */ ';', + /* 0x28 */ '\'', + /* 0x29 */ '`', + /* 0x2a */ KEY_RSHIFT, + /* 0x2b */ '\\', + /* 0x2c */ 'z', + /* 0x2d */ 'x', + /* 0x2e */ 'c', + /* 0x2f */ 'v', + /* 0x30 */ 'b', + /* 0x31 */ 'n', + /* 0x32 */ 'm', + /* 0x33 */ ',', + /* 0x34 */ '.', + /* 0x35 */ '/', + /* 0x36 */ KEY_RSHIFT, + /* 0x37 */ KEYP_MULTIPLY, + /* 0x38 */ KEY_LALT, + /* 0x39 */ KEY_USE, + /* 0x3a */ KEY_CAPSLOCK, + /* 0x3b */ KEY_F1, + /* 0x3c */ KEY_F2, + /* 0x3d */ KEY_F3, + /* 0x3e */ KEY_F4, + /* 0x3f */ KEY_F5, + /* 0x40 */ KEY_F6, + /* 0x41 */ KEY_F7, + /* 0x42 */ KEY_F8, + /* 0x43 */ KEY_F9, + /* 0x44 */ KEY_F10, + /* 0x45 */ KEY_NUMLOCK, + /* 0x46 */ 0x0, + /* 0x47 */ 0x0, /* 47 (Keypad-7/Home) */ + /* 0x48 */ 0x0, /* 48 (Keypad-8/Up) */ + /* 0x49 */ 0x0, /* 49 (Keypad-9/PgUp) */ + /* 0x4a */ 0x0, /* 4a (Keypad--) */ + /* 0x4b */ 0x0, /* 4b (Keypad-4/Left) */ + /* 0x4c */ 0x0, /* 4c (Keypad-5) */ + /* 0x4d */ 0x0, /* 4d (Keypad-6/Right) */ + /* 0x4e */ 0x0, /* 4e (Keypad-+) */ + /* 0x4f */ 0x0, /* 4f (Keypad-1/End) */ + /* 0x50 */ 0x0, /* 50 (Keypad-2/Down) */ + /* 0x51 */ 0x0, /* 51 (Keypad-3/PgDn) */ + /* 0x52 */ 0x0, /* 52 (Keypad-0/Ins) */ + /* 0x53 */ 0x0, /* 53 (Keypad-./Del) */ + /* 0x54 */ 0x0, /* 54 (Alt-SysRq) on a 84+ key keyboard */ + /* 0x55 */ 0x0, + /* 0x56 */ 0x0, + /* 0x57 */ 0x0, + /* 0x58 */ 0x0, + /* 0x59 */ 0x0, + /* 0x5a */ 0x0, + /* 0x5b */ 0x0, + /* 0x5c */ 0x0, + /* 0x5d */ 0x0, + /* 0x5e */ 0x0, + /* 0x5f */ 0x0, + /* 0x60 */ 0x0, + /* 0x61 */ 0x0, + /* 0x62 */ 0x0, + /* 0x63 */ 0x0, + /* 0x64 */ 0x0, + /* 0x65 */ 0x0, + /* 0x66 */ 0x0, + /* 0x67 */ KEY_UPARROW, + /* 0x68 */ 0x0, + /* 0x69 */ KEY_LEFTARROW, + /* 0x6a */ KEY_RIGHTARROW, + /* 0x6b */ 0x0, + /* 0x6c */ KEY_DOWNARROW, + /* 0x6d */ 0x0, + /* 0x6e */ 0x0, + /* 0x6f */ 0x0, + /* 0x70 */ 0x0, + /* 0x71 */ 0x0, + /* 0x72 */ 0x0, + /* 0x73 */ 0x0, + /* 0x74 */ 0x0, + /* 0x75 */ 0x0, + /* 0x76 */ 0x0, + /* 0x77 */ 0x0, + /* 0x78 */ 0x0, + /* 0x79 */ 0x0, + /* 0x7a */ 0x0, + /* 0x7b */ 0x0, + /* 0x7c */ 0x0, + /* 0x7d */ 0x0, + /* 0x7e */ 0x0, + /* 0x7f */ KEY_FIRE, //KEY_RCTRL, +}; + +// Lookup table for mapping ASCII characters to their equivalent when +// shift is pressed on an American layout keyboard: +static const char shiftxform[] = +{ + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, + 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, + 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, ' ', '!', '"', '#', '$', '%', '&', + '"', // shift-' + '(', ')', '*', '+', + '<', // shift-, + '_', // shift-- + '>', // shift-. + '?', // shift-/ + ')', // shift-0 + '!', // shift-1 + '@', // shift-2 + '#', // shift-3 + '$', // shift-4 + '%', // shift-5 + '^', // shift-6 + '&', // shift-7 + '*', // shift-8 + '(', // shift-9 + ':', + ':', // shift-; + '<', + '+', // shift-= + '>', '?', '@', + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + '[', // shift-[ + '!', // shift-backslash - OH MY GOD DOES WATCOM SUCK + ']', // shift-] + '"', '_', + '\'', // shift-` + 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', + 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', + '{', '|', '}', '~', 127 +}; + + +static unsigned char TranslateKey(unsigned char key) +{ + return key; + + /* + if (key < sizeof(at_to_doom)) + return at_to_doom[key]; + else + return 0x0; + */ + + //default: + // return tolower(key); +} + +// Get the equivalent ASCII (Unicode?) character for a keypress. + +static unsigned char GetTypedChar(unsigned char key) +{ + key = TranslateKey(key); + + // Is shift held down? If so, perform a translation. + + if (shiftdown > 0) + { + if (key >= 0 && key < arrlen(shiftxform)) + { + key = shiftxform[key]; + } + else + { + key = 0; + } + } + + return key; +} + +static void UpdateShiftStatus(int pressed, unsigned char key) +{ + int change; + + if (pressed) { + change = 1; + } else { + change = -1; + } + + if (key == KEY_RSHIFT) { + shiftdown += change; + } +} + + +void I_GetEvent(void) +{ + event_t event; + int pressed; + unsigned char key; + + + while (DG_GetKey(&pressed, &key)) + { + UpdateShiftStatus(pressed, key); + + // process event + + if (pressed) + { + // data1 has the key pressed, data2 has the character + // (shift-translated, etc) + event.type = ev_keydown; + event.data1 = TranslateKey(key); + event.data2 = GetTypedChar(key); + + if (event.data1 != 0) + { + D_PostEvent(&event); + } + } + else + { + event.type = ev_keyup; + event.data1 = TranslateKey(key); + + // data2 is just initialized to zero for ev_keyup. + // For ev_keydown it's the shifted Unicode character + // that was typed, but if something wants to detect + // key releases it should do so based on data1 + // (key ID), not the printable char. + + event.data2 = 0; + + if (event.data1 != 0) + { + D_PostEvent(&event); + } + break; + } + } + + + /* + case SDL_MOUSEMOTION: + event.type = ev_mouse; + event.data1 = mouse_button_state; + event.data2 = AccelerateMouse(sdlevent.motion.xrel); + event.data3 = -AccelerateMouse(sdlevent.motion.yrel); + D_PostEvent(&event); + break; + */ +} + +void I_InitInput(void) +{ +} + diff --git a/firmware_p4/components/Applications/doom/i_joystick.c b/firmware_p4/components/Applications/doom/i_joystick.c new file mode 100644 index 000000000..755aec3d3 --- /dev/null +++ b/firmware_p4/components/Applications/doom/i_joystick.c @@ -0,0 +1,359 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// SDL Joystick code. +// + +#ifdef ORIGCODE +#include "SDL.h" +#include "SDL_joystick.h" +#endif + +#include +#include +#include + +#include "doomtype.h" +#include "d_event.h" +#include "i_joystick.h" +#include "i_system.h" + +#include "m_config.h" +#include "m_misc.h" + +// When an axis is within the dead zone, it is set to zero. +// This is 5% of the full range: + +#define DEAD_ZONE (32768 / 3) + +#ifdef ORIGCODE +static SDL_Joystick *joystick = NULL; +#endif + +// Configuration variables: + +// Standard default.cfg Joystick enable/disable + +static int usejoystick = 0; + +// Joystick to use, as an SDL joystick index: + +static int joystick_index = -1; + +// Which joystick axis to use for horizontal movement, and whether to +// invert the direction: + +static int joystick_x_axis = 0; +static int joystick_x_invert = 0; + +// Which joystick axis to use for vertical movement, and whether to +// invert the direction: + +static int joystick_y_axis = 1; +static int joystick_y_invert = 0; + +// Which joystick axis to use for strafing? + +static int joystick_strafe_axis = -1; +static int joystick_strafe_invert = 0; + +// Virtual to physical button joystick button mapping. By default this +// is a straight mapping. +static int joystick_physical_buttons[NUM_VIRTUAL_BUTTONS] = { + 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 +}; + +void I_ShutdownJoystick(void) +{ +#ifdef ORIGCODE + if (joystick != NULL) + { + SDL_JoystickClose(joystick); + joystick = NULL; + SDL_QuitSubSystem(SDL_INIT_JOYSTICK); + } +#endif +} + +#ifdef ORIGCODE +static boolean IsValidAxis(int axis) +{ + int num_axes; + + if (axis < 0) + { + return true; + } + + if (IS_BUTTON_AXIS(axis)) + { + return true; + } + + if (IS_HAT_AXIS(axis)) + { + return HAT_AXIS_HAT(axis) < SDL_JoystickNumHats(joystick); + } + + num_axes = SDL_JoystickNumAxes(joystick); + + return axis < num_axes; +} +#endif + +void I_InitJoystick(void) +{ +#ifdef ORIGCODE + if (!usejoystick) + { + return; + } + + if (SDL_Init(SDL_INIT_JOYSTICK) < 0) + { + return; + } + + if (joystick_index < 0 || joystick_index >= SDL_NumJoysticks()) + { + printf("I_InitJoystick: Invalid joystick ID: %i\n", joystick_index); + SDL_QuitSubSystem(SDL_INIT_JOYSTICK); + return; + } + + // Open the joystick + + joystick = SDL_JoystickOpen(joystick_index); + + if (joystick == NULL) + { + printf("I_InitJoystick: Failed to open joystick #%i\n", + joystick_index); + SDL_QuitSubSystem(SDL_INIT_JOYSTICK); + return; + } + + if (!IsValidAxis(joystick_x_axis) + || !IsValidAxis(joystick_y_axis) + || !IsValidAxis(joystick_strafe_axis)) + { + printf("I_InitJoystick: Invalid joystick axis for joystick #%i " + "(run joystick setup again)\n", + joystick_index); + + SDL_JoystickClose(joystick); + joystick = NULL; + SDL_QuitSubSystem(SDL_INIT_JOYSTICK); + } + + SDL_JoystickEventState(SDL_ENABLE); + + // Initialized okay! + + printf("I_InitJoystick: %s\n", SDL_JoystickName(joystick_index)); + + I_AtExit(I_ShutdownJoystick, true); +#endif +} + +#ifdef ORIGCODE +static boolean IsAxisButton(int physbutton) +{ + if (IS_BUTTON_AXIS(joystick_x_axis)) + { + if (physbutton == BUTTON_AXIS_NEG(joystick_x_axis) + || physbutton == BUTTON_AXIS_POS(joystick_x_axis)) + { + return true; + } + } + if (IS_BUTTON_AXIS(joystick_y_axis)) + { + if (physbutton == BUTTON_AXIS_NEG(joystick_y_axis) + || physbutton == BUTTON_AXIS_POS(joystick_y_axis)) + { + return true; + } + } + if (IS_BUTTON_AXIS(joystick_strafe_axis)) + { + if (physbutton == BUTTON_AXIS_NEG(joystick_strafe_axis) + || physbutton == BUTTON_AXIS_POS(joystick_strafe_axis)) + { + return true; + } + } + + return false; +} + +// Get the state of the given virtual button. + +static int ReadButtonState(int vbutton) +{ + int physbutton; + + // Map from virtual button to physical (SDL) button. + if (vbutton < NUM_VIRTUAL_BUTTONS) + { + physbutton = joystick_physical_buttons[vbutton]; + } + else + { + physbutton = vbutton; + } + + // Never read axis buttons as buttons. + if (IsAxisButton(physbutton)) + { + return 0; + } + + return SDL_JoystickGetButton(joystick, physbutton); +} + +// Get a bitmask of all currently-pressed buttons + +static int GetButtonsState(void) +{ + int i; + int result; + + result = 0; + + for (i = 0; i < 20; ++i) + { + if (ReadButtonState(i)) + { + result |= 1 << i; + } + } + + return result; +} + +// Read the state of an axis, inverting if necessary. + +static int GetAxisState(int axis, int invert) +{ + int result; + + // Axis -1 means disabled. + + if (axis < 0) + { + return 0; + } + + // Is this a button axis, or a hat axis? + // If so, we need to handle it specially. + + result = 0; + + if (IS_BUTTON_AXIS(axis)) + { + if (SDL_JoystickGetButton(joystick, BUTTON_AXIS_NEG(axis))) + { + result -= 32767; + } + if (SDL_JoystickGetButton(joystick, BUTTON_AXIS_POS(axis))) + { + result += 32767; + } + } + else if (IS_HAT_AXIS(axis)) + { + int direction = HAT_AXIS_DIRECTION(axis); + int hatval = SDL_JoystickGetHat(joystick, HAT_AXIS_HAT(axis)); + + if (direction == HAT_AXIS_HORIZONTAL) + { + if ((hatval & SDL_HAT_LEFT) != 0) + { + result -= 32767; + } + else if ((hatval & SDL_HAT_RIGHT) != 0) + { + result += 32767; + } + } + else if (direction == HAT_AXIS_VERTICAL) + { + if ((hatval & SDL_HAT_UP) != 0) + { + result -= 32767; + } + else if ((hatval & SDL_HAT_DOWN) != 0) + { + result += 32767; + } + } + } + else + { + result = SDL_JoystickGetAxis(joystick, axis); + + if (result < DEAD_ZONE && result > -DEAD_ZONE) + { + result = 0; + } + } + + if (invert) + { + result = -result; + } + + return result; +} +#endif +void I_UpdateJoystick(void) +{ +#ifdef ORIGCODE + if (joystick != NULL) + { + event_t ev; + + ev.type = ev_joystick; + ev.data1 = GetButtonsState(); + ev.data2 = GetAxisState(joystick_x_axis, joystick_x_invert); + ev.data3 = GetAxisState(joystick_y_axis, joystick_y_invert); + ev.data4 = GetAxisState(joystick_strafe_axis, joystick_strafe_invert); + + D_PostEvent(&ev); + } +#endif +} + +void I_BindJoystickVariables(void) +{ + int i; + + M_BindVariable("use_joystick", &usejoystick); + M_BindVariable("joystick_index", &joystick_index); + M_BindVariable("joystick_x_axis", &joystick_x_axis); + M_BindVariable("joystick_y_axis", &joystick_y_axis); + M_BindVariable("joystick_strafe_axis", &joystick_strafe_axis); + M_BindVariable("joystick_x_invert", &joystick_x_invert); + M_BindVariable("joystick_y_invert", &joystick_y_invert); + M_BindVariable("joystick_strafe_invert",&joystick_strafe_invert); + + for (i = 0; i < NUM_VIRTUAL_BUTTONS; ++i) + { + char name[32]; + M_snprintf(name, sizeof(name), "joystick_physical_button%i", i); + M_BindVariable(name, &joystick_physical_buttons[i]); + } +} + diff --git a/firmware_p4/components/Applications/doom/i_joystick.h b/firmware_p4/components/Applications/doom/i_joystick.h new file mode 100644 index 000000000..b8815e215 --- /dev/null +++ b/firmware_p4/components/Applications/doom/i_joystick.h @@ -0,0 +1,70 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// System-specific joystick interface. +// + + +#ifndef __I_JOYSTICK__ +#define __I_JOYSTICK__ + +// Number of "virtual" joystick buttons defined in configuration files. +// This needs to be at least as large as the number of different key +// bindings supported by the higher-level game code (joyb* variables). +#define NUM_VIRTUAL_BUTTONS 10 + +// If this bit is set in a configuration file axis value, the axis is +// not actually a joystick axis, but instead is a "button axis". This +// means that instead of reading an SDL joystick axis, we read the +// state of two buttons to get the axis value. This is needed for eg. +// the PS3 SIXAXIS controller, where the D-pad buttons register as +// buttons, not as two axes. +#define BUTTON_AXIS 0x10000 + +// Query whether a given axis value describes a button axis. +#define IS_BUTTON_AXIS(axis) ((axis) >= 0 && ((axis) & BUTTON_AXIS) != 0) + +// Get the individual buttons from a button axis value. +#define BUTTON_AXIS_NEG(axis) ((axis) & 0xff) +#define BUTTON_AXIS_POS(axis) (((axis) >> 8) & 0xff) + +// Create a button axis value from two button values. +#define CREATE_BUTTON_AXIS(neg, pos) (BUTTON_AXIS | (neg) | ((pos) << 8)) + +// If this bit is set in an axis value, the axis is not actually a +// joystick axis, but is a "hat" axis. This means that we read (one of) +// the hats on the joystick. +#define HAT_AXIS 0x20000 + +#define IS_HAT_AXIS(axis) ((axis) >= 0 && ((axis) & HAT_AXIS) != 0) + +// Get the hat number from a hat axis value. +#define HAT_AXIS_HAT(axis) ((axis) & 0xff) +// Which axis of the hat? (horizonal or vertical) +#define HAT_AXIS_DIRECTION(axis) (((axis) >> 8) & 0xff) + +#define CREATE_HAT_AXIS(hat, direction) \ + (HAT_AXIS | (hat) | ((direction) << 8)) + +#define HAT_AXIS_HORIZONTAL 1 +#define HAT_AXIS_VERTICAL 2 + +void I_InitJoystick(void); +void I_ShutdownJoystick(void); +void I_UpdateJoystick(void); + +void I_BindJoystickVariables(void); + +#endif /* #ifndef __I_JOYSTICK__ */ + diff --git a/firmware_p4/components/Applications/doom/i_scale.c b/firmware_p4/components/Applications/doom/i_scale.c new file mode 100644 index 000000000..f88c69449 --- /dev/null +++ b/firmware_p4/components/Applications/doom/i_scale.c @@ -0,0 +1,1452 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Screen scale-up code: +// 1x,2x,3x,4x pixel doubling +// Aspect ratio-correcting stretch functions +// + +#include +#include +#include + +#include "doomtype.h" + +#include "i_video.h" +#include "m_argv.h" +#include "z_zone.h" + +#if defined(_MSC_VER) && !defined(__cplusplus) +#define inline __inline +#endif + +// Should be I_VideoBuffer + +static byte *src_buffer; + +// Destination buffer, ie. screen->pixels. + +static byte *dest_buffer; + +// Pitch of destination buffer, ie. screen->pitch. + +static int dest_pitch; + +// Lookup tables used for aspect ratio correction stretching code. +// stretch_tables[0] : 20% / 80% +// stretch_tables[1] : 40% / 60% +// All other combinations can be reached from these two tables. + +static byte *stretch_tables[2] = { NULL, NULL }; + +// 50%/50% stretch table, for 800x600 squash mode + +static byte *half_stretch_table = NULL; + +// Called to set the source and destination buffers before doing the +// scale. + +void I_InitScale(byte *_src_buffer, byte *_dest_buffer, int _dest_pitch) +{ + src_buffer = _src_buffer; + dest_buffer = _dest_buffer; + dest_pitch = _dest_pitch; +} + +// +// Pixel doubling scale-up functions. +// + +// 1x scale doesn't really do any scaling: it just copies the buffer +// a line at a time for when pitch != SCREENWIDTH (!native_surface) + +static boolean I_Scale1x(int x1, int y1, int x2, int y2) +{ + byte *bufp, *screenp; + int y; + int w = x2 - x1; + + // Need to byte-copy from buffer into the screen buffer + + bufp = src_buffer + y1 * SCREENWIDTH + x1; + screenp = (byte *) dest_buffer + y1 * dest_pitch + x1; + + for (y=y1; y 240) + + for (y=0; y 480) + + for (y=0; y 720) + + for (y=0; y 960) + + for (y=0; y 1200) + + for (y=0; y 0) + { + screenp = (byte *) dest_buffer + 2 * dest_pitch; + + for (y=0; y<1198; y += 3) + { + memset(screenp, 0, 1600); + + screenp += dest_pitch * 3; + } + } + + return true; +} + +screen_mode_t mode_stretch_5x = { + SCREENWIDTH * 5, SCREENHEIGHT_4_3 * 5, + I_InitStretchTables, + I_Stretch5x, + false, +}; + +// +// Aspect ratio correcting "squash" functions. +// +// These do the opposite of the "stretch" functions above: while the +// stretch functions increase the vertical dimensions, the squash +// functions decrease the horizontal dimensions for the same result. +// +// The same blend tables from the stretch functions are reused; as +// a result, the dimensions are *slightly* wrong (eg. 320x200 should +// squash to 266x200, but actually squashes to 256x200). +// + +// +// 1x squashed scale (256x200) +// + +static inline void WriteSquashedLine1x(byte *dest, byte *src) +{ + int x; + + for (x=0; x multiples of 320x240) + +extern screen_mode_t mode_stretch_1x; +extern screen_mode_t mode_stretch_2x; +extern screen_mode_t mode_stretch_3x; +extern screen_mode_t mode_stretch_4x; +extern screen_mode_t mode_stretch_5x; + +// Horizontally squashed modes (320x200 -> multiples of 256x200) + +extern screen_mode_t mode_squash_1x; +extern screen_mode_t mode_squash_2x; +extern screen_mode_t mode_squash_3x; +extern screen_mode_t mode_squash_4x; +extern screen_mode_t mode_squash_5x; + +#endif /* #ifndef __I_SCALE__ */ + diff --git a/firmware_p4/components/Applications/doom/i_sound.c b/firmware_p4/components/Applications/doom/i_sound.c new file mode 100644 index 000000000..c93e9ace4 --- /dev/null +++ b/firmware_p4/components/Applications/doom/i_sound.c @@ -0,0 +1,419 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: none +// + +#include +#include + +// HighBoy: SDL_mixer is not used — the DG_sound_module/DG_music_module backend +// lives in doom_sound_highboy.c. (i_sound.c itself uses no SDL symbols.) + +#include "config.h" +#include "doomfeatures.h" +#include "doomtype.h" + +#ifdef ORIGCODE +#include "gusconf.h" +#endif +#include "i_sound.h" +#include "i_video.h" +#include "m_argv.h" +#include "m_config.h" + +// Sound sample rate to use for digital output (Hz) + +int snd_samplerate = 44100; + +// Maximum number of bytes to dedicate to allocated sound effects. +// (Default: 64MB) + +int snd_cachesize = 64 * 1024 * 1024; + +// Config variable that controls the sound buffer size. +// We default to 28ms (1000 / 35fps = 1 buffer per tic). + +int snd_maxslicetime_ms = 28; + +// External command to invoke to play back music. + +char *snd_musiccmd = ""; + +// Low-level sound and music modules we are using + +static sound_module_t *sound_module = NULL; +static music_module_t *music_module = NULL; + +int snd_musicdevice = SNDDEVICE_SB; +int snd_sfxdevice = SNDDEVICE_SB; + +// DOS-specific options: These are unused but should be maintained +// so that the config file can be shared between chocolate +// doom and doom.exe + +static int snd_sbport = 0; +static int snd_sbirq = 0; +static int snd_sbdma = 0; +static int snd_mport = 0; + +// Compiled-in sound modules: + +static sound_module_t *sound_modules[] = +{ + #ifdef FEATURE_SOUND + &DG_sound_module, + #endif + NULL, +}; + +// Check if a sound device is in the given list of devices + +static boolean SndDeviceInList(snddevice_t device, snddevice_t *list, + int len) +{ + int i; + + for (i=0; isound_devices, + sound_modules[i]->num_sound_devices)) + { + // Initialize the module + + if (sound_modules[i]->Init(use_sfx_prefix)) + { + sound_module = sound_modules[i]; + return; + } + } + } +} + +// Initialize music according to snd_musicdevice. + +static void InitMusicModule(void) +{ +#ifdef FEATURE_SOUND + music_module = &DG_music_module; +#endif /* FEATURE_SOUND */ +} + +// +// Initializes sound stuff, including volume +// Sets channels, SFX and music volume, +// allocates channel buffer, sets S_sfx lookup. +// + +void I_InitSound(boolean use_sfx_prefix) +{ + boolean nosound, nosfx, nomusic; + + //! + // @vanilla + // + // Disable all sound output. + // + + nosound = M_CheckParm("-nosound") > 0; + + //! + // @vanilla + // + // Disable sound effects. + // + + nosfx = M_CheckParm("-nosfx") > 0; + + //! + // @vanilla + // + // Disable music. + // + + nomusic = M_CheckParm("-nomusic") > 0; + + // Initialize the sound and music subsystems. + + if (!nosound && !screensaver_mode) + { + // This is kind of a hack. If native MIDI is enabled, set up + // the TIMIDITY_CFG environment variable here before SDL_mixer + // is opened. + + if (!nomusic + && (snd_musicdevice == SNDDEVICE_GENMIDI + || snd_musicdevice == SNDDEVICE_GUS)) + { + //I_InitTimidityConfig(); + } + + if (!nosfx) + { + InitSfxModule(use_sfx_prefix); + } + + if (!nomusic) + { + InitMusicModule(); + } + } + +} + +void I_ShutdownSound(void) +{ + if (sound_module != NULL) + { + sound_module->Shutdown(); + } + + if (music_module != NULL) + { + music_module->Shutdown(); + } +} + +int I_GetSfxLumpNum(sfxinfo_t *sfxinfo) +{ + if (sound_module != NULL) + { + return sound_module->GetSfxLumpNum(sfxinfo); + } + else + { + return 0; + } +} + +void I_UpdateSound(void) +{ + if (sound_module != NULL) + { + sound_module->Update(); + } + + if (music_module != NULL && music_module->Poll != NULL) + { + music_module->Poll(); + } +} + +static void CheckVolumeSeparation(int *vol, int *sep) +{ + if (*sep < 0) + { + *sep = 0; + } + else if (*sep > 254) + { + *sep = 254; + } + + if (*vol < 0) + { + *vol = 0; + } + else if (*vol > 127) + { + *vol = 127; + } +} + +void I_UpdateSoundParams(int channel, int vol, int sep) +{ + if (sound_module != NULL) + { + CheckVolumeSeparation(&vol, &sep); + sound_module->UpdateSoundParams(channel, vol, sep); + } +} + +int I_StartSound(sfxinfo_t *sfxinfo, int channel, int vol, int sep) +{ + if (sound_module != NULL) + { + CheckVolumeSeparation(&vol, &sep); + return sound_module->StartSound(sfxinfo, channel, vol, sep); + } + else + { + return 0; + } +} + +void I_StopSound(int channel) +{ + if (sound_module != NULL) + { + sound_module->StopSound(channel); + } +} + +boolean I_SoundIsPlaying(int channel) +{ + if (sound_module != NULL) + { + return sound_module->SoundIsPlaying(channel); + } + else + { + return false; + } +} + +void I_PrecacheSounds(sfxinfo_t *sounds, int num_sounds) +{ + if (sound_module != NULL && sound_module->CacheSounds != NULL) + { + sound_module->CacheSounds(sounds, num_sounds); + } +} + +void I_InitMusic(void) +{ + if(music_module != NULL) + { + music_module->Init(); + } +} + +void I_ShutdownMusic(void) +{ + +} + +void I_SetMusicVolume(int volume) +{ + if (music_module != NULL) + { + music_module->SetMusicVolume(volume); + } +} + +void I_PauseSong(void) +{ + if (music_module != NULL) + { + music_module->PauseMusic(); + } +} + +void I_ResumeSong(void) +{ + if (music_module != NULL) + { + music_module->ResumeMusic(); + } +} + +void *I_RegisterSong(void *data, int len) +{ + if (music_module != NULL) + { + return music_module->RegisterSong(data, len); + } + else + { + return NULL; + } +} + +void I_UnRegisterSong(void *handle) +{ + if (music_module != NULL) + { + music_module->UnRegisterSong(handle); + } +} + +void I_PlaySong(void *handle, boolean looping) +{ + if (music_module != NULL) + { + music_module->PlaySong(handle, looping); + } +} + +void I_StopSong(void) +{ + if (music_module != NULL) + { + music_module->StopSong(); + } +} + +boolean I_MusicIsPlaying(void) +{ + if (music_module != NULL) + { + return music_module->MusicIsPlaying(); + } + else + { + return false; + } + +} + +void I_BindSoundVariables(void) +{ + extern int use_libsamplerate; + extern float libsamplerate_scale; + + M_BindVariable("snd_musicdevice", &snd_musicdevice); + M_BindVariable("snd_sfxdevice", &snd_sfxdevice); + M_BindVariable("snd_sbport", &snd_sbport); + M_BindVariable("snd_sbirq", &snd_sbirq); + M_BindVariable("snd_sbdma", &snd_sbdma); + M_BindVariable("snd_mport", &snd_mport); + M_BindVariable("snd_maxslicetime_ms", &snd_maxslicetime_ms); + M_BindVariable("snd_musiccmd", &snd_musiccmd); + M_BindVariable("snd_samplerate", &snd_samplerate); + M_BindVariable("snd_cachesize", &snd_cachesize); + +#ifdef FEATURE_SOUND + M_BindVariable("use_libsamplerate", &use_libsamplerate); + M_BindVariable("libsamplerate_scale", &libsamplerate_scale); +#endif + + // Before SDL_mixer version 1.2.11, MIDI music caused the game + // to crash when it looped. If this is an old SDL_mixer version, + // disable MIDI. +} + diff --git a/firmware_p4/components/Applications/doom/i_sound.h b/firmware_p4/components/Applications/doom/i_sound.h new file mode 100644 index 000000000..e31b5e58e --- /dev/null +++ b/firmware_p4/components/Applications/doom/i_sound.h @@ -0,0 +1,256 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// The not so system specific sound interface. +// + + +#ifndef __I_SOUND__ +#define __I_SOUND__ + +#include "doomtype.h" + + +// +// SoundFX struct. +// +typedef struct sfxinfo_struct sfxinfo_t; + +struct sfxinfo_struct +{ + // tag name, used for hexen. + char *tagname; + + // lump name. If we are running with use_sfx_prefix=true, a + // 'DS' (or 'DP' for PC speaker sounds) is prepended to this. + + char name[9]; + + // Sfx priority + int priority; + + // referenced sound if a link + sfxinfo_t *link; + + // pitch if a link + int pitch; + + // volume if a link + int volume; + + // this is checked every second to see if sound + // can be thrown out (if 0, then decrement, if -1, + // then throw out, if > 0, then it is in use) + int usefulness; + + // lump number of sfx + int lumpnum; + + // Maximum number of channels that the sound can be played on + // (Heretic) + int numchannels; + + // data used by the low level code + void *driver_data; +}; + +// +// MusicInfo struct. +// +typedef struct +{ + // up to 6-character name + char *name; + + // lump number of music + int lumpnum; + + // music data + void *data; + + // music handle once registered + void *handle; + +} musicinfo_t; + +typedef enum +{ + SNDDEVICE_NONE = 0, + SNDDEVICE_PCSPEAKER = 1, + SNDDEVICE_ADLIB = 2, + SNDDEVICE_SB = 3, + SNDDEVICE_PAS = 4, + SNDDEVICE_GUS = 5, + SNDDEVICE_WAVEBLASTER = 6, + SNDDEVICE_SOUNDCANVAS = 7, + SNDDEVICE_GENMIDI = 8, + SNDDEVICE_AWE32 = 9, + SNDDEVICE_CD = 10, +} snddevice_t; + +// Interface for sound modules + +typedef struct +{ + // List of sound devices that this sound module is used for. + + snddevice_t *sound_devices; + int num_sound_devices; + + // Initialise sound module + // Returns true if successfully initialised + + boolean (*Init)(boolean use_sfx_prefix); + + // Shutdown sound module + + void (*Shutdown)(void); + + // Returns the lump index of the given sound. + + int (*GetSfxLumpNum)(sfxinfo_t *sfxinfo); + + // Called periodically to update the subsystem. + + void (*Update)(void); + + // Update the sound settings on the given channel. + + void (*UpdateSoundParams)(int channel, int vol, int sep); + + // Start a sound on a given channel. Returns the channel id + // or -1 on failure. + + int (*StartSound)(sfxinfo_t *sfxinfo, int channel, int vol, int sep); + + // Stop the sound playing on the given channel. + + void (*StopSound)(int channel); + + // Query if a sound is playing on the given channel + + boolean (*SoundIsPlaying)(int channel); + + // Called on startup to precache sound effects (if necessary) + + void (*CacheSounds)(sfxinfo_t *sounds, int num_sounds); + +} sound_module_t; + +void I_InitSound(boolean use_sfx_prefix); +void I_ShutdownSound(void); +int I_GetSfxLumpNum(sfxinfo_t *sfxinfo); +void I_UpdateSound(void); +void I_UpdateSoundParams(int channel, int vol, int sep); +int I_StartSound(sfxinfo_t *sfxinfo, int channel, int vol, int sep); +void I_StopSound(int channel); +boolean I_SoundIsPlaying(int channel); +void I_PrecacheSounds(sfxinfo_t *sounds, int num_sounds); + +// Interface for music modules + +typedef struct +{ + // List of sound devices that this music module is used for. + + snddevice_t *sound_devices; + int num_sound_devices; + + // Initialise the music subsystem + + boolean (*Init)(void); + + // Shutdown the music subsystem + + void (*Shutdown)(void); + + // Set music volume - range 0-127 + + void (*SetMusicVolume)(int volume); + + // Pause music + + void (*PauseMusic)(void); + + // Un-pause music + + void (*ResumeMusic)(void); + + // Register a song handle from data + // Returns a handle that can be used to play the song + + void *(*RegisterSong)(void *data, int len); + + // Un-register (free) song data + + void (*UnRegisterSong)(void *handle); + + // Play the song + + void (*PlaySong)(void *handle, boolean looping); + + // Stop playing the current song. + + void (*StopSong)(void); + + // Query if music is playing. + + boolean (*MusicIsPlaying)(void); + + // Invoked periodically to poll. + + void (*Poll)(void); +} music_module_t; + +void I_InitMusic(void); +void I_ShutdownMusic(void); +void I_SetMusicVolume(int volume); +void I_PauseSong(void); +void I_ResumeSong(void); +void *I_RegisterSong(void *data, int len); +void I_UnRegisterSong(void *handle); +void I_PlaySong(void *handle, boolean looping); +void I_StopSong(void); +boolean I_MusicIsPlaying(void); + +extern int snd_sfxdevice; +extern int snd_musicdevice; +extern int snd_samplerate; +extern int snd_cachesize; +extern int snd_maxslicetime_ms; +extern char *snd_musiccmd; + +void I_BindSoundVariables(void); + +// Sound modules + +void I_InitTimidityConfig(void); +#ifdef FEATURE_SOUND +extern sound_module_t DG_sound_module; +extern music_module_t DG_music_module; +#endif +extern sound_module_t sound_pcsound_module; +extern music_module_t music_opl_module; + +// For OPL module: + +extern int opl_io_port; + +// For native music module: + +extern char *timidity_cfg_path; + +#endif + diff --git a/firmware_p4/components/Applications/doom/i_swap.h b/firmware_p4/components/Applications/doom/i_swap.h new file mode 100644 index 000000000..fa45d4c91 --- /dev/null +++ b/firmware_p4/components/Applications/doom/i_swap.h @@ -0,0 +1,73 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Endianess handling, swapping 16bit and 32bit. +// + + +#ifndef __I_SWAP__ +#define __I_SWAP__ + +#ifdef __DJGPP__ + + +#define SHORT(x) ((signed short) (x)) +#define LONG(x) ((signed int) (x)) + +#define SYS_LITTLE_ENDIAN + + +#else // __DJGPP__ + + +#if ( __BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__ ) +#define SYS_LITTLE_ENDIAN +#define SHORT(x) ((signed short) (x)) +#define LONG(x) ((signed int) (x)) +#elif ( __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ) +#define SYS_BIG_ENDIAN + +static inline unsigned short swapLE16(unsigned short val) { + return ((val << 8) | (val >> 8)); +} + +static inline unsigned long swapLE32(unsigned long val) { + return ((val << 24) | ((val << 8) & 0x00FF0000) | ((val >> 8) & 0x0000FF00) | (val >> 24)); +} + +#define SHORT(x) ((signed short) swapLE16(x)) +#define LONG(x) ((signed int) swapLE32(x)) +#else +#error "Unknown byte order" +#endif + + +// cosmito from lsdldoom +#define doom_swap_s(x) \ + ((short int)((((unsigned short int)(x) & 0x00ff) << 8) | \ + (((unsigned short int)(x) & 0xff00) >> 8))) + +#if ( __BYTE_ORDER__ == __ORDER_BIG_ENDIAN__ ) +#define doom_wtohs(x) doom_swap_s(x) +#else +#define doom_wtohs(x) (short int)(x) +#endif + + +#endif // __DJGPP__ + + +#endif + diff --git a/firmware_p4/components/Applications/doom/i_system.c b/firmware_p4/components/Applications/doom/i_system.c new file mode 100644 index 000000000..53ab2c945 --- /dev/null +++ b/firmware_p4/components/Applications/doom/i_system.c @@ -0,0 +1,578 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// + + + +#include +#include +#include + +#include + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include +#else +#include +#endif + +#ifdef ORIGCODE +#include "SDL.h" +#endif + +#include "config.h" + +#include "deh_str.h" +#include "doomtype.h" +#include "m_argv.h" +#include "m_config.h" +#include "m_misc.h" +#include "i_joystick.h" +#include "i_sound.h" +#include "i_timer.h" +#include "i_video.h" + +#include "i_system.h" + +#include "w_wad.h" +#include "z_zone.h" + +#ifdef __MACOSX__ +#include +#endif + +#define DEFAULT_RAM 6 /* MiB */ +#define MIN_RAM 6 /* MiB */ + + +typedef struct atexit_listentry_s atexit_listentry_t; + +struct atexit_listentry_s +{ + atexit_func_t func; + boolean run_on_error; + atexit_listentry_t *next; +}; + +static atexit_listentry_t *exit_funcs = NULL; + +void I_AtExit(atexit_func_t func, boolean run_on_error) +{ + atexit_listentry_t *entry; + + entry = malloc(sizeof(*entry)); + + entry->func = func; + entry->run_on_error = run_on_error; + entry->next = exit_funcs; + exit_funcs = entry; +} + +// Tactile feedback function, probably used for the Logitech Cyberman + +void I_Tactile(int on, int off, int total) +{ +} + +// Zone memory auto-allocation function that allocates the zone size +// by trying progressively smaller zone sizes until one is found that +// works. + +static byte *AutoAllocMemory(int *size, int default_ram, int min_ram) +{ + byte *zonemem; + + // Allocate the zone memory. This loop tries progressively smaller + // zone sizes until a size is found that can be allocated. + // If we used the -mb command line parameter, only the parameter + // provided is accepted. + + zonemem = NULL; + + while (zonemem == NULL) + { + // We need a reasonable minimum amount of RAM to start. + + if (default_ram < min_ram) + { + I_Error("Unable to allocate %i MiB of RAM for zone", default_ram); + } + + // Try to allocate the zone memory. + + *size = default_ram * 1024 * 1024; + + zonemem = malloc(*size); + + // Failed to allocate? Reduce zone size until we reach a size + // that is acceptable. + + if (zonemem == NULL) + { + default_ram -= 1; + } + } + + return zonemem; +} + +byte *I_ZoneBase (int *size) +{ + byte *zonemem; + int min_ram, default_ram; + int p; + + //! + // @arg + // + // Specify the heap size, in MiB (default 16). + // + + p = M_CheckParmWithArgs("-mb", 1); + + if (p > 0) + { + default_ram = atoi(myargv[p+1]); + min_ram = default_ram; + } + else + { + default_ram = DEFAULT_RAM; + min_ram = MIN_RAM; + } + + zonemem = AutoAllocMemory(size, default_ram, min_ram); + + printf("zone memory: %p, %x allocated for zone\n", + zonemem, *size); + + return zonemem; +} + +void I_PrintBanner(char *msg) +{ + int i; + int spaces = 35 - (strlen(msg) / 2); + + for (i=0; ifunc(); + entry = entry->next; + } + +#if ORIGCODE + SDL_Quit(); + + exit(0); +#endif +} + +#if !defined(_WIN32) && !defined(__MACOSX__) && !defined(__DJGPP__) +#define ZENITY_BINARY "/usr/bin/zenity" + +// returns non-zero if zenity is available + +static int ZenityAvailable(void) +{ + return system(ZENITY_BINARY " --help >/dev/null 2>&1") == 0; +} + +// Escape special characters in the given string so that they can be +// safely enclosed in shell quotes. + +static char *EscapeShellString(char *string) +{ + char *result; + char *r, *s; + + // In the worst case, every character might be escaped. + result = malloc(strlen(string) * 2 + 3); + r = result; + + // Enclosing quotes. + *r = '"'; + ++r; + + for (s = string; *s != '\0'; ++s) + { + // From the bash manual: + // + // "Enclosing characters in double quotes preserves the literal + // value of all characters within the quotes, with the exception + // of $, `, \, and, when history expansion is enabled, !." + // + // Therefore, escape these characters by prefixing with a backslash. + + if (strchr("$`\\!", *s) != NULL) + { + *r = '\\'; + ++r; + } + + *r = *s; + ++r; + } + + // Enclosing quotes. + *r = '"'; + ++r; + *r = '\0'; + + return result; +} + +// Open a native error box with a message using zenity + +static int ZenityErrorBox(char *message) +{ + int result; + char *escaped_message; + char *errorboxpath; + static size_t errorboxpath_size; + + if (!ZenityAvailable()) + { + return 0; + } + + escaped_message = EscapeShellString(message); + + errorboxpath_size = strlen(ZENITY_BINARY) + strlen(escaped_message) + 19; + errorboxpath = malloc(errorboxpath_size); + M_snprintf(errorboxpath, errorboxpath_size, "%s --error --text=%s", + ZENITY_BINARY, escaped_message); + + result = system(errorboxpath); + + free(errorboxpath); + free(escaped_message); + + return result; +} + +#endif /* !defined(_WIN32) && !defined(__MACOSX__) && !defined(__DJGPP__) */ + + +// +// I_Error +// + +static boolean already_quitting = false; + +void I_Error (char *error, ...) +{ + char msgbuf[512]; + va_list argptr; + atexit_listentry_t *entry; + boolean exit_gui_popup; + + if (already_quitting) + { + fprintf(stderr, "Warning: recursive call to I_Error detected.\n"); +#if ORIGCODE + exit(-1); +#endif + } + else + { + already_quitting = true; + } + + // Message first. + va_start(argptr, error); + //fprintf(stderr, "\nError: "); + vfprintf(stderr, error, argptr); + fprintf(stderr, "\n\n"); + va_end(argptr); + fflush(stderr); + + // Write a copy of the message into buffer. + va_start(argptr, error); + memset(msgbuf, 0, sizeof(msgbuf)); + M_vsnprintf(msgbuf, sizeof(msgbuf), error, argptr); + va_end(argptr); + + // Shutdown. Here might be other errors. + + entry = exit_funcs; + + while (entry != NULL) + { + if (entry->run_on_error) + { + entry->func(); + } + + entry = entry->next; + } + + exit_gui_popup = !M_ParmExists("-nogui"); + + // Pop up a GUI dialog box to show the error message, if the + // game was not run from the console (and the user will + // therefore be unable to otherwise see the message). + if (exit_gui_popup && !I_ConsoleStdout()) +#ifdef _WIN32 + { + wchar_t wmsgbuf[512]; + + MultiByteToWideChar(CP_ACP, 0, + msgbuf, strlen(msgbuf) + 1, + wmsgbuf, sizeof(wmsgbuf)); + + MessageBoxW(NULL, wmsgbuf, L"", MB_OK); + } +#elif defined(__MACOSX__) + { + CFStringRef message; + int i; + + // The CoreFoundation message box wraps text lines, so replace + // newline characters with spaces so that multiline messages + // are continuous. + + for (i = 0; msgbuf[i] != '\0'; ++i) + { + if (msgbuf[i] == '\n') + { + msgbuf[i] = ' '; + } + } + + message = CFStringCreateWithCString(NULL, msgbuf, + kCFStringEncodingUTF8); + + CFUserNotificationDisplayNotice(0, + kCFUserNotificationCautionAlertLevel, + NULL, + NULL, + NULL, + CFSTR(PACKAGE_STRING), + message, + NULL); + } +#elif defined(__DJGPP__) + { + printf("%s\n", msgbuf); + exit(-1); + } + +#else + { + ZenityErrorBox(msgbuf); + } +#endif + + // abort(); +#if ORIGCODE + SDL_Quit(); + + exit(-1); +#else + exit(-1); +#endif +} + +// +// Read Access Violation emulation. +// +// From PrBoom+, by entryway. +// + +// C:\>debug +// -d 0:0 +// +// DOS 6.22: +// 0000:0000 (57 92 19 00) F4 06 70 00-(16 00) +// DOS 7.1: +// 0000:0000 (9E 0F C9 00) 65 04 70 00-(16 00) +// Win98: +// 0000:0000 (9E 0F C9 00) 65 04 70 00-(16 00) +// DOSBox under XP: +// 0000:0000 (00 00 00 F1) ?? ?? ?? 00-(07 00) + +#define DOS_MEM_DUMP_SIZE 10 + +static const unsigned char mem_dump_dos622[DOS_MEM_DUMP_SIZE] = { + 0x57, 0x92, 0x19, 0x00, 0xF4, 0x06, 0x70, 0x00, 0x16, 0x00}; +static const unsigned char mem_dump_win98[DOS_MEM_DUMP_SIZE] = { + 0x9E, 0x0F, 0xC9, 0x00, 0x65, 0x04, 0x70, 0x00, 0x16, 0x00}; +static const unsigned char mem_dump_dosbox[DOS_MEM_DUMP_SIZE] = { + 0x00, 0x00, 0x00, 0xF1, 0x00, 0x00, 0x00, 0x00, 0x07, 0x00}; +static unsigned char mem_dump_custom[DOS_MEM_DUMP_SIZE]; + +static const unsigned char *dos_mem_dump = mem_dump_dos622; + +boolean I_GetMemoryValue(unsigned int offset, void *value, int size) +{ + static boolean firsttime = true; + + if (firsttime) + { + int p, i, val; + + firsttime = false; + i = 0; + + //! + // @category compat + // @arg + // + // Specify DOS version to emulate for NULL pointer dereference + // emulation. Supported versions are: dos622, dos71, dosbox. + // The default is to emulate DOS 7.1 (Windows 98). + // + + p = M_CheckParmWithArgs("-setmem", 1); + + if (p > 0) + { + if (!strcasecmp(myargv[p + 1], "dos622")) + { + dos_mem_dump = mem_dump_dos622; + } + if (!strcasecmp(myargv[p + 1], "dos71")) + { + dos_mem_dump = mem_dump_win98; + } + else if (!strcasecmp(myargv[p + 1], "dosbox")) + { + dos_mem_dump = mem_dump_dosbox; + } + else + { + for (i = 0; i < DOS_MEM_DUMP_SIZE; ++i) + { + ++p; + + if (p >= myargc || myargv[p][0] == '-') + { + break; + } + + M_StrToInt(myargv[p], &val); + mem_dump_custom[i++] = (unsigned char) val; + } + + dos_mem_dump = mem_dump_custom; + } + } + } + + switch (size) + { + case 1: + *((unsigned char *) value) = dos_mem_dump[offset]; + return true; + case 2: + *((unsigned short *) value) = dos_mem_dump[offset] + | (dos_mem_dump[offset + 1] << 8); + return true; + case 4: + *((unsigned int *) value) = dos_mem_dump[offset] + | (dos_mem_dump[offset + 1] << 8) + | (dos_mem_dump[offset + 2] << 16) + | (dos_mem_dump[offset + 3] << 24); + return true; + } + + return false; +} + diff --git a/firmware_p4/components/Applications/doom/i_system.h b/firmware_p4/components/Applications/doom/i_system.h new file mode 100644 index 000000000..b65daff00 --- /dev/null +++ b/firmware_p4/components/Applications/doom/i_system.h @@ -0,0 +1,84 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// System specific interface stuff. +// + + +#ifndef __I_SYSTEM__ +#define __I_SYSTEM__ + +#include "d_ticcmd.h" +#include "d_event.h" + + +typedef void (*atexit_func_t)(void); + +// Called by DoomMain. +void I_Init (void); + +// Called by startup code +// to get the ammount of memory to malloc +// for the zone management. +byte* I_ZoneBase (int *size); + +boolean I_ConsoleStdout(void); + + +// Asynchronous interrupt functions should maintain private queues +// that are read by the synchronous functions +// to be converted into events. + +// Either returns a null ticcmd, +// or calls a loadable driver to build it. +// This ticcmd will then be modified by the gameloop +// for normal input. +ticcmd_t* I_BaseTiccmd (void); + + +// Called by M_Responder when quit is selected. +// Clean exit, displays sell blurb. +void I_Quit (void); + +void I_Error (char *error, ...); + +void I_Tactile (int on, int off, int total); + +boolean I_GetMemoryValue(unsigned int offset, void *value, int size); + +// Schedule a function to be called when the program exits. +// If run_if_error is true, the function is called if the exit +// is due to an error (I_Error) + +void I_AtExit(atexit_func_t func, boolean run_if_error); + +// Add all system-specific config file variable bindings. + +void I_BindVariables(void); + +// Print startup banner copyright message. + +void I_PrintStartupBanner(char *gamedescription); + +// Print a centered text banner displaying the given string. + +void I_PrintBanner(char *text); + +// Print a dividing line for startup banners. + +void I_PrintDivider(void); + +#endif + diff --git a/firmware_p4/components/Applications/doom/i_timer.c b/firmware_p4/components/Applications/doom/i_timer.c new file mode 100644 index 000000000..0a85c722b --- /dev/null +++ b/firmware_p4/components/Applications/doom/i_timer.c @@ -0,0 +1,96 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Timer functions. +// + +#include "i_timer.h" +#include "doomtype.h" + +#include "doomgeneric.h" + +#include + +//#include +//#include + + +// +// I_GetTime +// returns time in 1/35th second tics +// + +static uint32_t basetime = 0; + + +int I_GetTicks(void) +{ + return DG_GetTicksMs(); +} + +int I_GetTime (void) +{ + uint32_t ticks; + + ticks = I_GetTicks(); + + if (basetime == 0) + basetime = ticks; + + ticks -= basetime; + + return (ticks * TICRATE) / 1000; +} + + +// +// Same as I_GetTime, but returns time in milliseconds +// + +int I_GetTimeMS(void) +{ + uint32_t ticks; + + ticks = I_GetTicks(); + + if (basetime == 0) + basetime = ticks; + + return ticks - basetime; +} + +// Sleep for a specified number of ms + +void I_Sleep(int ms) +{ + //SDL_Delay(ms); + //usleep (ms * 1000); + + DG_SleepMs(ms); +} + +void I_WaitVBL(int count) +{ + //I_Sleep((count * 1000) / 70); +} + + +void I_InitTimer(void) +{ + // initialize timer + + //SDL_Init(SDL_INIT_TIMER); +} + diff --git a/firmware_p4/components/Applications/doom/i_timer.h b/firmware_p4/components/Applications/doom/i_timer.h new file mode 100644 index 000000000..9b3dbb8d1 --- /dev/null +++ b/firmware_p4/components/Applications/doom/i_timer.h @@ -0,0 +1,42 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// System-specific timer interface +// + + +#ifndef __I_TIMER__ +#define __I_TIMER__ + +#define TICRATE 35 + +// Called by D_DoomLoop, +// returns current time in tics. +int I_GetTime (void); + +// returns current time in ms +int I_GetTimeMS (void); + +// Pause for a specified number of ms +void I_Sleep(int ms); + +// Initialize timer +void I_InitTimer(void); + +// Wait for vertical retrace or pause a bit. +void I_WaitVBL(int count); + +#endif + diff --git a/firmware_p4/components/Applications/doom/i_video.c b/firmware_p4/components/Applications/doom/i_video.c new file mode 100644 index 000000000..84bebdeb6 --- /dev/null +++ b/firmware_p4/components/Applications/doom/i_video.c @@ -0,0 +1,495 @@ +// Emacs style mode select -*- C++ -*- +//----------------------------------------------------------------------------- +// +// $Id:$ +// +// Copyright (C) 1993-1996 by id Software, Inc. +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// $Log:$ +// +// DESCRIPTION: +// DOOM graphics stuff for X11, UNIX. +// +//----------------------------------------------------------------------------- + +static const char +rcsid[] = "$Id: i_x.c,v 1.6 1997/02/03 22:45:10 b1 Exp $"; + +#include "config.h" +#include "v_video.h" +#include "m_argv.h" +#include "d_event.h" +#include "d_main.h" +#include "i_video.h" +#include "i_system.h" +#include "z_zone.h" + +#include "tables.h" +#include "doomkeys.h" + +#include "doomgeneric.h" + +#include +#include + +#include + +#include + +#include + +//#define CMAP256 + +struct FB_BitField +{ + uint32_t offset; /* beginning of bitfield */ + uint32_t length; /* length of bitfield */ +}; + +struct FB_ScreenInfo +{ + uint32_t xres; /* visible resolution */ + uint32_t yres; + uint32_t xres_virtual; /* virtual resolution */ + uint32_t yres_virtual; + + uint32_t bits_per_pixel; /* guess what */ + + /* >1 = FOURCC */ + struct FB_BitField red; /* bitfield in s_Fb mem if true color, */ + struct FB_BitField green; /* else only length is significant */ + struct FB_BitField blue; + struct FB_BitField transp; /* transparency */ +}; + +static struct FB_ScreenInfo s_Fb; +int fb_scaling = 1; +int usemouse = 0; + + +#ifdef CMAP256 + +boolean palette_changed; +struct color colors[256]; + +#else // CMAP256 + +static struct color colors[256]; + + +#endif // CMAP256 + + +void I_GetEvent(void); + +// The screen buffer; this is modified to draw things to the screen + +byte *I_VideoBuffer = NULL; + +// If true, game is running as a screensaver + +boolean screensaver_mode = false; + +// Flag indicating whether the screen is currently visible: +// when the screen isnt visible, don't render the screen + +boolean screenvisible; + +// Mouse acceleration +// +// This emulates some of the behavior of DOS mouse drivers by increasing +// the speed when the mouse is moved fast. +// +// The mouse input values are input directly to the game, but when +// the values exceed the value of mouse_threshold, they are multiplied +// by mouse_acceleration to increase the speed. + +float mouse_acceleration = 2.0; +int mouse_threshold = 10; + +// Gamma correction level to use + +int usegamma = 0; + +typedef struct +{ + byte r; + byte g; + byte b; +} col_t; + +// Palette converted to RGB565 + +static uint16_t rgb565_palette[256]; + +void cmap_to_rgb565(uint16_t * out, uint8_t * in, int in_pixels) +{ + int i, j; + struct color c; + uint16_t r, g, b; + + for (i = 0; i < in_pixels; i++) + { + c = colors[*in]; + r = ((uint16_t)(c.r >> 3)) << 11; + g = ((uint16_t)(c.g >> 2)) << 5; + b = ((uint16_t)(c.b >> 3)) << 0; + *out = (r | g | b); + + in++; + for (j = 0; j < fb_scaling; j++) { + out++; + } + } +} + +void cmap_to_fb(uint8_t *out, uint8_t *in, int in_pixels) +{ + int i, k; + struct color c; + uint32_t pix; + + for (i = 0; i < in_pixels; i++) + { + c = colors[*in]; // R:8 G:8 B:8 + + if (s_Fb.bits_per_pixel == 16) + { + // RGB565 packing + uint16_t p = ((c.r & 0xF8) << 8) | + ((c.g & 0xFC) << 3) | + (c.b >> 3); + +#ifdef SYS_BIG_ENDIAN + p = swapeLE16(p); // can't use SHORT() because this needs to stay unsigned +#endif + for (k = 0; k < fb_scaling; k++) { + *(uint16_t *)out = p; + out += 2; + } + } + else if (s_Fb.bits_per_pixel == 32) + { + // Assuming RGBA8888 + pix = (c.r << s_Fb.red.offset) | + (c.g << s_Fb.green.offset) | + (c.b << s_Fb.blue.offset); + +#ifdef SYS_BIG_ENDIAN + pix = swapLE32(pix); +#endif + for (k = 0; k < fb_scaling; k++) { + *(uint32_t *)out = pix; + out += 4; + } + } + else { + // no clue how to convert this + I_Error("No idea how to convert %d bpp pixels", s_Fb.bits_per_pixel); + } + + in++; + } +} + +void I_InitGraphics (void) +{ + int i, gfxmodeparm; + char *mode; + + memset(&s_Fb, 0, sizeof(struct FB_ScreenInfo)); + s_Fb.xres = DOOMGENERIC_RESX; + s_Fb.yres = DOOMGENERIC_RESY; + s_Fb.xres_virtual = s_Fb.xres; + s_Fb.yres_virtual = s_Fb.yres; + +#ifdef CMAP256 + + s_Fb.bits_per_pixel = 8; + +#else // CMAP256 + + gfxmodeparm = M_CheckParmWithArgs("-gfxmode", 1); + + if (gfxmodeparm) { + mode = myargv[gfxmodeparm + 1]; + } + else { + // default to rgba8888 like the old behavior, for compatibility + // maybe could warn here? + mode = "rgba8888"; + } + + if (strcmp(mode, "rgba8888") == 0) { + // default mode + s_Fb.bits_per_pixel = 32; + + s_Fb.blue.length = 8; + s_Fb.green.length = 8; + s_Fb.red.length = 8; + s_Fb.transp.length = 8; + + s_Fb.blue.offset = 0; + s_Fb.green.offset = 8; + s_Fb.red.offset = 16; + s_Fb.transp.offset = 24; + } + + else if (strcmp(mode, "rgb565") == 0) { + s_Fb.bits_per_pixel = 16; + + s_Fb.blue.length = 5; + s_Fb.green.length = 6; + s_Fb.red.length = 5; + s_Fb.transp.length = 0; + + s_Fb.blue.offset = 11; + s_Fb.green.offset = 5; + s_Fb.red.offset = 0; + s_Fb.transp.offset = 16; + } + else + I_Error("Unknown gfxmode value: %s\n", mode); + + +#endif // CMAP256 + + printf("I_InitGraphics: framebuffer: x_res: %d, y_res: %d, x_virtual: %d, y_virtual: %d, bpp: %d\n", + s_Fb.xres, s_Fb.yres, s_Fb.xres_virtual, s_Fb.yres_virtual, s_Fb.bits_per_pixel); + + printf("I_InitGraphics: framebuffer: RGBA: %d%d%d%d, red_off: %d, green_off: %d, blue_off: %d, transp_off: %d\n", + s_Fb.red.length, s_Fb.green.length, s_Fb.blue.length, s_Fb.transp.length, s_Fb.red.offset, s_Fb.green.offset, s_Fb.blue.offset, s_Fb.transp.offset); + + printf("I_InitGraphics: DOOM screen size: w x h: %d x %d\n", SCREENWIDTH, SCREENHEIGHT); + + + i = M_CheckParmWithArgs("-scaling", 1); + if (i > 0) { + i = atoi(myargv[i + 1]); + fb_scaling = i; + printf("I_InitGraphics: Scaling factor: %d\n", fb_scaling); + } else { + fb_scaling = s_Fb.xres / SCREENWIDTH; + if (s_Fb.yres / SCREENHEIGHT < fb_scaling) + fb_scaling = s_Fb.yres / SCREENHEIGHT; + printf("I_InitGraphics: Auto-scaling factor: %d\n", fb_scaling); + } + + + /* Allocate screen to draw to */ + I_VideoBuffer = (byte*)Z_Malloc (SCREENWIDTH * SCREENHEIGHT, PU_STATIC, NULL); // For DOOM to draw on + + screenvisible = true; + + extern void I_InitInput(void); + I_InitInput(); +} + +void I_ShutdownGraphics (void) +{ + Z_Free (I_VideoBuffer); +} + +void I_StartFrame (void) +{ + +} + +void I_StartTic (void) +{ + I_GetEvent(); +} + +void I_UpdateNoBlit (void) +{ +} + +// +// I_FinishUpdate +// + +void I_FinishUpdate (void) +{ + int y; + int x_offset, y_offset, x_offset_end; + unsigned char *line_in, *line_out; + + /* Offsets in case FB is bigger than DOOM */ + /* 600 = s_Fb heigt, 200 screenheight */ + /* 600 = s_Fb heigt, 200 screenheight */ + /* 2048 =s_Fb width, 320 screenwidth */ + y_offset = (((s_Fb.yres - (SCREENHEIGHT * fb_scaling)) * s_Fb.bits_per_pixel/8)) / 2; + x_offset = (((s_Fb.xres - (SCREENWIDTH * fb_scaling)) * s_Fb.bits_per_pixel/8)) / 2; // XXX: siglent FB hack: /4 instead of /2, since it seems to handle the resolution in a funny way + //x_offset = 0; + x_offset_end = ((s_Fb.xres - (SCREENWIDTH * fb_scaling)) * s_Fb.bits_per_pixel/8) - x_offset; + + /* DRAW SCREEN */ + line_in = (unsigned char *) I_VideoBuffer; + line_out = (unsigned char *) DG_ScreenBuffer; + + y = SCREENHEIGHT; + + while (y--) + { + int i; + for (i = 0; i < fb_scaling; i++) { + line_out += x_offset; +#ifdef CMAP256 + if (fb_scaling == 1) { + memcpy(line_out, line_in, SCREENWIDTH); /* fb_width is bigger than Doom SCREENWIDTH... */ + } else { + int j; + + for (j = 0; j < SCREENWIDTH; j++) { + int k; + for (k = 0; k < fb_scaling; k++) { + line_out[j * fb_scaling + k] = line_in[j]; + } + } + } +#else + //cmap_to_rgb565((void*)line_out, (void*)line_in, SCREENWIDTH); + cmap_to_fb((void*)line_out, (void*)line_in, SCREENWIDTH); +#endif + line_out += (SCREENWIDTH * fb_scaling * (s_Fb.bits_per_pixel/8)) + x_offset_end; + } + line_in += SCREENWIDTH; + } + + DG_DrawFrame(); +} + +// +// I_ReadScreen +// +void I_ReadScreen (byte* scr) +{ + memcpy (scr, I_VideoBuffer, SCREENWIDTH * SCREENHEIGHT); +} + +// +// I_SetPalette +// +#define GFX_RGB565(r, g, b) ((((r & 0xF8) >> 3) << 11) | (((g & 0xFC) >> 2) << 5) | ((b & 0xF8) >> 3)) +#define GFX_RGB565_R(color) ((0xF800 & color) >> 11) +#define GFX_RGB565_G(color) ((0x07E0 & color) >> 5) +#define GFX_RGB565_B(color) (0x001F & color) + +void I_SetPalette (byte* palette) +{ + int i; + //col_t* c; + + //for (i = 0; i < 256; i++) + //{ + // c = (col_t*)palette; + + // rgb565_palette[i] = GFX_RGB565(gammatable[usegamma][c->r], + // gammatable[usegamma][c->g], + // gammatable[usegamma][c->b]); + + // palette += 3; + //} + + + /* performance boost: + * map to the right pixel format over here! */ + + for (i=0; i<256; ++i ) { + colors[i].a = 0; + colors[i].r = gammatable[usegamma][*palette++]; + colors[i].g = gammatable[usegamma][*palette++]; + colors[i].b = gammatable[usegamma][*palette++]; + } + +#ifdef CMAP256 + + palette_changed = true; + +#endif // CMAP256 +} + +// Given an RGB value, find the closest matching palette index. + +int I_GetPaletteIndex (int r, int g, int b) +{ + int best, best_diff, diff; + int i; + col_t color; + + printf("I_GetPaletteIndex\n"); + + best = 0; + best_diff = INT_MAX; + + for (i = 0; i < 256; ++i) + { + color.r = GFX_RGB565_R(rgb565_palette[i]); + color.g = GFX_RGB565_G(rgb565_palette[i]); + color.b = GFX_RGB565_B(rgb565_palette[i]); + + diff = (r - color.r) * (r - color.r) + + (g - color.g) * (g - color.g) + + (b - color.b) * (b - color.b); + + if (diff < best_diff) + { + best = i; + best_diff = diff; + } + + if (diff == 0) + { + break; + } + } + + return best; +} + +void I_BeginRead (void) +{ +} + +void I_EndRead (void) +{ +} + +void I_SetWindowTitle (char *title) +{ + DG_SetWindowTitle(title); +} + +void I_GraphicsCheckCommandLine (void) +{ +} + +void I_SetGrabMouseCallback (grabmouse_callback_t func) +{ +} + +void I_EnableLoadingDisk(void) +{ +} + +void I_BindVideoVariables (void) +{ +} + +void I_DisplayFPSDots (boolean dots_on) +{ +} + +void I_CheckIsScreensaver (void) +{ +} diff --git a/firmware_p4/components/Applications/doom/i_video.h b/firmware_p4/components/Applications/doom/i_video.h new file mode 100644 index 000000000..c8565f419 --- /dev/null +++ b/firmware_p4/components/Applications/doom/i_video.h @@ -0,0 +1,175 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// System specific interface stuff. +// + + +#ifndef __I_VIDEO__ +#define __I_VIDEO__ + +#include "doomtype.h" + +// Screen width and height. + +#define SCREENWIDTH 320 +#define SCREENHEIGHT 200 + +// Screen width used for "squash" scale functions + +#define SCREENWIDTH_4_3 256 + +// Screen height used for "stretch" scale functions. + +#define SCREENHEIGHT_4_3 240 + +#define MAX_MOUSE_BUTTONS 8 + +typedef struct +{ + // Screen width and height + + int width; + int height; + + // Initialisation function to call when using this mode. + // Called with a pointer to the Doom palette. + // + // If NULL, no init function is called. + + void (*InitMode)(byte *palette); + + // Function to call to draw the screen from the source buffer. + // Return true if draw was successful. + + boolean (*DrawScreen)(int x1, int y1, int x2, int y2); + + // If true, this is a "poor quality" mode. The autoadjust + // code should always attempt to use a different mode to this + // mode in fullscreen. + // + // Some notes about what "poor quality" means in this context: + // + // The aspect ratio correction works by scaling up to the larger + // screen size and then drawing pixels on the edges between the + // "virtual" pixels so that an authentic blocky look-and-feel is + // achieved. + // + // For a mode like 640x480, you can imagine the grid of the + // "original" pixels spaced out, with extra "blurry" pixels added + // in the space between them to fill it out. However, when you're + // running at a resolution like 320x240, this is not the case. In + // the small screen case, every single pixel has to be a blurry + // interpolation of two pixels from the original image. + // + // If you run in 320x240 and put your face up close to the screen + // you can see this: it's particularly visible in the small yellow + // status bar numbers for example. Overall it still looks "okay" + // but there's an obvious - albeit small - deterioration in + // quality. + // + // Once you get to 640x480, all the original pixels are there at + // least once and it's okay (the higher the resolution, the more + // accurate it is). When I first wrote the code I was expecting + // that even higher resolutions would be needed before it would + // look acceptable, but it turned out to be okay even at 640x480. + + boolean poor_quality; +} screen_mode_t; + +typedef boolean (*grabmouse_callback_t)(void); + +// Called by D_DoomMain, +// determines the hardware configuration +// and sets up the video mode +void I_InitGraphics (void); + +void I_GraphicsCheckCommandLine(void); + +void I_ShutdownGraphics(void); + +// Takes full 8 bit values. +void I_SetPalette (byte* palette); +int I_GetPaletteIndex(int r, int g, int b); + +void I_UpdateNoBlit (void); +void I_FinishUpdate (void); + +void I_ReadScreen (byte* scr); + +void I_BeginRead (void); + +void I_SetWindowTitle(char *title); + +void I_CheckIsScreensaver(void); +void I_SetGrabMouseCallback(grabmouse_callback_t func); + +void I_DisplayFPSDots(boolean dots_on); +void I_BindVideoVariables(void); + +void I_InitWindowTitle(void); +void I_InitWindowIcon(void); + +// Called before processing any tics in a frame (just after displaying a frame). +// Time consuming syncronous operations are performed here (joystick reading). + +void I_StartFrame (void); + +// Called before processing each tic in a frame. +// Quick syncronous operations are performed here. + +void I_StartTic (void); + +// Enable the loading disk image displayed when reading from disk. + +void I_EnableLoadingDisk(void); + +void I_EndRead (void); + +struct color { + uint32_t b:8; + uint32_t g:8; + uint32_t r:8; + uint32_t a:8; +}; + + +extern char *video_driver; +extern boolean screenvisible; + +extern float mouse_acceleration; +extern int mouse_threshold; +extern int vanilla_keyboard_mapping; +extern boolean screensaver_mode; +extern int usegamma; +extern byte *I_VideoBuffer; + +extern int screen_width; +extern int screen_height; +extern int screen_bpp; +extern int fullscreen; +extern int aspect_ratio_correct; + +extern int show_diskicon; +extern int diskicon_readbytes; + +#ifdef CMAP256 + +extern boolean palette_changed; +extern struct color colors[256]; + +#endif // CMAP256 + +#endif diff --git a/firmware_p4/components/Applications/doom/icon.c b/firmware_p4/components/Applications/doom/icon.c new file mode 100644 index 000000000..14c607c23 --- /dev/null +++ b/firmware_p4/components/Applications/doom/icon.c @@ -0,0 +1,262 @@ +static int icon_w = 32; +static int icon_h = 32; + +static unsigned char icon_data[] = { + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xa2,0x86,0x73, + 0xa9,0x8d,0x7a, 0xbd,0xa0,0x8c, 0xda,0xba,0xa0, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0xbd,0x8d,0x67, 0xd7,0xb9,0xa5, 0xeb,0xd8,0xcd, 0xd3,0xbf,0xae, + 0xbd,0xa0,0x8c, 0xeb,0xd8,0xcd, 0xc2,0x9d,0x86, 0x95,0x5d,0x38, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x9b,0x7e,0x66, + 0xc5,0x9e,0x81, 0xd3,0xb3,0x99, 0xd4,0xac,0x8e, 0xee,0xdc,0xd1, + 0xb9,0x93,0x76, 0xad,0x71,0x45, 0xd4,0xac,0x8e, 0xb9,0x93,0x76, + 0xa3,0x77,0x58, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x39,0x1d,0x2d, 0x55,0x20,0x22, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0xda,0xb4,0x9c, 0xd3,0xa3,0x83, + 0xaf,0x91,0x78, 0xa7,0x83,0x6d, 0xc4,0xa7,0x93, 0xee,0xe2,0xd5, + 0xeb,0xd8,0xcd, 0x8c,0x60,0x3d, 0x9b,0x7e,0x66, 0xce,0x9f,0x7e, + 0x84,0x54,0x33, 0xba,0x83,0x5b, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x24,0x1c,0x35, 0x00,0x0f,0x32, 0x29,0x18,0x2e, 0x55,0x20,0x22, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0xd3,0xb3,0x99, 0xca,0x93,0x6f, 0xc4,0x94,0x6e, + 0x98,0x66,0x45, 0x78,0x50,0x2d, 0xd7,0xb9,0xa5, 0xee,0xdc,0xd1, + 0xc4,0x9b,0x79, 0xa1,0x6d,0x45, 0x66,0x40,0x24, 0xb8,0x7a,0x4f, + 0xcf,0xa6,0x83, 0x98,0x6d,0x4e, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x30,0x1c,0x2f, 0x08,0x13,0x30, 0x00,0x0f,0x32, 0x00,0x0f,0x32, + 0x39,0x1d,0x2d, 0x52,0x1c,0x1a, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x9e,0x7b,0x65, 0xb9,0x89,0x64, 0xaa,0x7d,0x5e, 0x9e,0x72,0x53, + 0x88,0x5e,0x40, 0xc4,0xa7,0x93, 0xb9,0x89,0x64, 0x90,0x6c,0x51, + 0x7f,0x50,0x2f, 0x90,0x5e,0x37, 0x75,0x4d,0x30, 0x7f,0x50,0x2f, + 0xd3,0xa3,0x83, 0xd4,0xac,0x8e, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x29,0x18,0x2e, 0x08,0x13,0x30, 0x08,0x13,0x30, 0x08,0x13,0x30, + 0x00,0x0f,0x32, 0x08,0x13,0x30, 0x49,0x1e,0x2b, 0x49,0x1a,0x16, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xda,0xba,0xa0, + 0xd4,0xac,0x8e, 0xc4,0x9b,0x79, 0xaa,0x7d,0x5e, 0xaa,0x7d,0x5e, + 0xbd,0xa0,0x8c, 0x8c,0x60,0x3d, 0x70,0x49,0x2c, 0x89,0x60,0x42, + 0x57,0x38,0x20, 0x6c,0x45,0x29, 0x66,0x40,0x24, 0x51,0x35,0x21, + 0x7e,0x55,0x38, 0xce,0x9f,0x7e, 0xc2,0x8a,0x61, 0x00,0x00,0x00, + 0x30,0x1c,0x2f, 0x00,0x0f,0x32, 0x00,0x0f,0x32, 0x08,0x13,0x30, + 0x00,0x0f,0x32, 0x00,0x0f,0x32, 0x08,0x13,0x30, 0x08,0x13,0x30, + 0x59,0x25,0x2b, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xcb,0x9a,0x74, + 0xb7,0x81,0x58, 0x8c,0x60,0x3d, 0x79,0x4b,0x2b, 0x89,0x58,0x31, + 0x89,0x58,0x31, 0x7f,0x50,0x2f, 0x9e,0x64,0x39, 0x75,0x4c,0x2a, + 0x51,0x35,0x21, 0x84,0x54,0x33, 0x54,0x36,0x1d, 0x98,0x6d,0x4e, + 0xb4,0x7f,0x5c, 0xba,0x83,0x5b, 0xb8,0x7a,0x4f, 0x00,0x00,0x00, + 0x3e,0x28,0x36, 0x08,0x13,0x30, 0x00,0x0f,0x32, 0x08,0x13,0x30, + 0x00,0x0f,0x32, 0x00,0x0f,0x32, 0x00,0x0f,0x32, 0x08,0x13,0x30, + 0x20,0x1f,0x36, 0x35,0x19,0x12, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xc2,0x8a,0x61, + 0x89,0x60,0x42, 0x84,0x54,0x33, 0x7f,0x50,0x2f, 0x86,0x56,0x35, + 0x8d,0x5b,0x35, 0x75,0x4c,0x2a, 0x8d,0x5b,0x35, 0x5c,0x38,0x22, + 0x5e,0x3f,0x27, 0x75,0x4d,0x30, 0x9d,0x64,0x3f, 0x75,0x4c,0x2a, + 0x78,0x50,0x2d, 0x7f,0x50,0x2f, 0xb7,0x81,0x58, 0x00,0x00,0x00, + 0x46,0x35,0x42, 0x04,0x18,0x3a, 0x08,0x13,0x30, 0x5d,0x30,0x28, + 0x20,0x1f,0x36, 0x08,0x13,0x30, 0x08,0x13,0x30, 0x04,0x18,0x3a, + 0x19,0x1c,0x37, 0x3a,0x1d,0x16, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x91,0x5f,0x3e, + 0x84,0x54,0x33, 0x89,0x58,0x31, 0x7e,0x6e,0x64, 0xc4,0x94,0x6e, + 0x78,0x50,0x2d, 0x92,0x6f,0x59, 0xa1,0x7c,0x60, 0x9c,0x6f,0x4b, + 0x8d,0x5b,0x35, 0xbc,0x7f,0x53, 0xad,0x71,0x45, 0x75,0x4d,0x30, + 0x51,0x35,0x21, 0x4b,0x2f,0x1c, 0x70,0x49,0x2c, 0x00,0x00,0x00, + 0x59,0x44,0x4d, 0x1e,0x28,0x42, 0x1e,0x28,0x42, 0x48,0x19,0x10, + 0x42,0x19,0x12, 0x53,0x2b,0x30, 0x0c,0x26,0x48, 0x1e,0x28,0x42, + 0x24,0x2d,0x48, 0x5f,0x2c,0x1d, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x89,0x58,0x31, + 0xa1,0x84,0x6c, 0xc4,0x94,0x6e, 0x88,0x64,0x44, 0xb5,0x8f,0x73, + 0x9e,0x72,0x53, 0xa1,0x6d,0x45, 0x93,0x60,0x3a, 0xad,0x71,0x45, + 0xb4,0x7f,0x5c, 0xbd,0x8d,0x67, 0xc2,0x8a,0x61, 0xb3,0x76,0x4b, + 0xb8,0x7a,0x4f, 0x88,0x64,0x44, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x61,0x50,0x52, 0x1c,0x34,0x52, 0x1c,0x34,0x52, 0x54,0x27,0x16, + 0x29,0x17,0x09, 0x5d,0x30,0x28, 0x1c,0x34,0x52, 0x1c,0x34,0x52, + 0x24,0x35,0x4f, 0x69,0x34,0x24, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xa7,0x83,0x6d, + 0xac,0x86,0x6a, 0x74,0x47,0x2d, 0x84,0x54,0x33, 0x5c,0x38,0x22, + 0x54,0x36,0x1d, 0x6c,0x45,0x29, 0x96,0x63,0x3c, 0xa3,0x6e,0x41, + 0xb3,0x76,0x4b, 0xb3,0x76,0x4b, 0xa2,0x68,0x3d, 0x7c,0x4e,0x2d, + 0x63,0x3e,0x27, 0x96,0x63,0x3c, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x6b,0x5d,0x59, 0x22,0x42,0x5f, 0x22,0x42,0x5f, 0x5d,0x34,0x1a, + 0x38,0x23,0x0f, 0x5c,0x38,0x22, 0x22,0x42,0x5f, 0x22,0x42,0x5f, + 0x2c,0x45,0x5e, 0x6f,0x3e,0x2b, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xb7,0x81,0x58, + 0x98,0x74,0x59, 0x6c,0x45,0x29, 0x4b,0x35,0x25, 0x78,0x50,0x2d, + 0x78,0x50,0x2d, 0x78,0x50,0x2d, 0x7f,0x50,0x2f, 0x84,0x54,0x33, + 0x8d,0x5b,0x35, 0x96,0x63,0x3c, 0x74,0x47,0x2d, 0x65,0x45,0x26, + 0x65,0x45,0x26, 0x7c,0x4e,0x2d, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x77,0x69,0x64, 0x30,0x4e,0x6d, 0x32,0x52,0x6b, 0x69,0x42,0x26, + 0x49,0x31,0x11, 0x6c,0x47,0x2f, 0x27,0x4f,0x6d, 0x27,0x4f,0x6d, + 0x32,0x52,0x6b, 0x70,0x49,0x2c, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xb7,0x81,0x58, + 0x8a,0x5a,0x39, 0x8a,0x5a,0x39, 0x91,0x5f,0x3e, 0x5e,0x3f,0x27, + 0x5c,0x38,0x22, 0x89,0x58,0x31, 0x89,0x58,0x31, 0x95,0x5d,0x38, + 0x9d,0x64,0x3f, 0x65,0x45,0x26, 0x4b,0x2f,0x1c, 0x7f,0x50,0x2f, + 0x78,0x50,0x2d, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x77,0x69,0x64, 0x36,0x5c,0x7a, 0x3e,0x5e,0x78, 0x76,0x52,0x2e, + 0x5d,0x42,0x22, 0x75,0x4d,0x30, 0x36,0x5c,0x7a, 0x36,0x5c,0x7a, + 0x3e,0x5e,0x78, 0x74,0x47,0x2d, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x89,0x58,0x31, 0x63,0x3e,0x27, 0xa8,0x6d,0x42, 0x4b,0x2f,0x1c, + 0x65,0x45,0x26, 0x70,0x49,0x2c, 0x51,0x35,0x21, 0x78,0x50,0x2d, + 0x42,0x30,0x14, 0x49,0x31,0x11, 0x59,0x44,0x22, 0x7c,0x5c,0x2a, + 0x8a,0x71,0x27, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x71,0x67,0x5c, 0x37,0x52,0x66, 0x3f,0x55,0x64, 0x80,0x55,0x27, + 0x64,0x4c,0x1f, 0x7e,0x59,0x2e, 0x37,0x52,0x66, 0x37,0x52,0x66, + 0x3f,0x55,0x64, 0x6c,0x47,0x2f, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x70,0x49,0x2c, 0x65,0x45,0x26, 0x65,0x45,0x26, 0x63,0x3e,0x27, + 0x76,0x4d,0x25, 0x5d,0x42,0x22, 0x5e,0x3f,0x27, 0x4e,0x43,0x18, + 0x4e,0x43,0x18, 0x6a,0x5b,0x1c, 0x4e,0x43,0x18, 0x5f,0x51,0x19, + 0x8a,0x76,0x2a, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x63,0x38,0x19, 0x34,0x11,0x04, 0x32,0x0f,0x00, 0x86,0x58,0x1e, + 0x74,0x59,0x25, 0x86,0x58,0x1e, 0x34,0x15,0x00, 0x32,0x0f,0x00, + 0x34,0x15,0x00, 0x4e,0x31,0x18, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x7e,0x6c,0x27, 0x5a,0x4d,0x1c, + 0x4d,0x3e,0x15, 0x67,0x58,0x21, 0x5a,0x4d,0x1c, 0x57,0x4b,0x1a, + 0x5f,0x51,0x19, 0x64,0x55,0x1e, 0x5a,0x4d,0x1c, 0x8a,0x71,0x27, + 0x8e,0x79,0x26, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x63,0x38,0x19, 0x34,0x11,0x04, 0x32,0x0f,0x00, 0x8d,0x63,0x1f, + 0x83,0x66,0x2c, 0x8d,0x63,0x1f, 0x32,0x0f,0x00, 0x35,0x19,0x12, + 0x34,0x11,0x04, 0x53,0x3a,0x20, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0xac,0x93,0x39, 0x76,0x65,0x20, + 0x6a,0x5b,0x1c, 0x6a,0x5b,0x1c, 0x67,0x58,0x21, 0x4e,0x43,0x18, + 0x4e,0x43,0x18, 0x9b,0x85,0x32, 0xb8,0x9e,0x3c, 0xb1,0x8d,0x36, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x63,0x38,0x19, 0x34,0x15,0x00, 0x32,0x0f,0x00, 0x8d,0x63,0x1f, + 0x83,0x66,0x2c, 0x8d,0x63,0x1f, 0x32,0x0f,0x00, 0x32,0x0f,0x00, + 0x34,0x15,0x00, 0x53,0x3a,0x20, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0xb0,0x96,0x34, 0x76,0x65,0x20, + 0x7e,0x66,0x23, 0x8e,0x79,0x26, 0x8a,0x71,0x27, 0x7e,0x6c,0x27, + 0x8a,0x71,0x27, 0x8a,0x71,0x27, 0xb0,0x96,0x34, 0x98,0x82,0x2f, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x75,0x4c,0x2a, 0x38,0x19,0x05, 0x38,0x19,0x05, 0x99,0x6d,0x22, + 0x96,0x70,0x2a, 0x99,0x6d,0x22, 0x38,0x19,0x05, 0x38,0x19,0x05, + 0x38,0x19,0x05, 0x59,0x3f,0x25, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0xac,0x93,0x39, 0x8a,0x76,0x2a, + 0x7e,0x66,0x23, 0x76,0x65,0x20, 0x93,0x7d,0x2a, 0x82,0x6f,0x23, + 0x9f,0x88,0x35, 0xb8,0xa0,0x4c, 0xb8,0xa0,0x4c, 0xc4,0xa8,0x3f, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x7c,0x5c,0x2a, 0x52,0x2e,0x0d, 0x52,0x2e,0x0d, 0xa4,0x7b,0x27, + 0xa1,0x80,0x37, 0x9f,0x77,0x1a, 0x52,0x2e,0x0d, 0x52,0x2e,0x0d, + 0x52,0x2e,0x0d, 0x5f,0x4e,0x2a, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x86,0x72,0x26, + 0xac,0x93,0x39, 0x97,0x82,0x36, 0xb1,0x8d,0x36, 0xac,0x93,0x39, + 0x97,0x82,0x36, 0xa4,0x8c,0x32, 0xbd,0xa2,0x41, 0x8a,0x71,0x27, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x8b,0x6d,0x32, 0x66,0x44,0x14, 0x6d,0x4a,0x20, 0xab,0x86,0x29, + 0xb1,0x8d,0x36, 0xa4,0x7b,0x27, 0x66,0x44,0x14, 0x66,0x44,0x14, + 0x66,0x44,0x14, 0x69,0x56,0x2c, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xac,0x93,0x31, + 0x7e,0x6c,0x27, 0x9f,0x88,0x35, 0x97,0x82,0x36, 0x7e,0x66,0x23, + 0x7e,0x66,0x23, 0xb2,0x99,0x3f, 0xbd,0xa2,0x41, 0x8a,0x76,0x2a, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x99,0x7a,0x38, 0x86,0x58,0x1e, 0x7f,0x59,0x22, 0xb2,0x8b,0x1c, + 0x94,0x6e,0x21, 0x7f,0x59,0x22, 0x7f,0x59,0x22, 0x7f,0x59,0x22, + 0x7f,0x59,0x22, 0x69,0x56,0x2c, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xac,0x93,0x39, + 0x8a,0x71,0x27, 0xb4,0x9c,0x48, 0x7e,0x66,0x23, 0xac,0x93,0x39, + 0x9c,0x87,0x3a, 0x9c,0x87,0x3a, 0xbd,0xa2,0x41, 0x8e,0x79,0x26, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0xa8,0x86,0x3d, 0x96,0x70,0x2a, 0x96,0x70,0x2a, 0x96,0x70,0x2a, + 0x96,0x70,0x2a, 0x96,0x70,0x2a, 0x96,0x70,0x2a, 0x96,0x70,0x2a, + 0xa1,0x80,0x37, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0xb4,0x9c,0x48, + 0xac,0x93,0x31, 0x93,0x7d,0x2a, 0xbd,0xa3,0x48, 0x93,0x7d,0x2a, + 0xb8,0xa0,0x4c, 0xb4,0x9c,0x48, 0xcc,0xa5,0x4e, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0xa8,0x86,0x3d, 0xaf,0x85,0x31, 0xaf,0x85,0x31, 0xaf,0x85,0x31, + 0xaf,0x85,0x31, 0xaf,0x85,0x31, 0xaf,0x85,0x31, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x97,0x82,0x36, 0xb4,0x9c,0x48, 0xb2,0x99,0x3f, 0xb4,0x9c,0x48, + 0xb0,0x96,0x34, 0xc1,0xa7,0x4c, 0x9b,0x84,0x2a, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0xbd,0x9e,0x4c, 0xc7,0x9a,0x3f, 0xc7,0x9a,0x3f, 0xc7,0x9a,0x3f, + 0xc7,0x9a,0x3f, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x9b,0x85,0x32, 0xa7,0x8e,0x2c, 0xac,0x93,0x39, 0xb5,0x91,0x41, + 0x76,0x65,0x20, 0xa7,0x8e,0x2c, 0xb4,0x9a,0x38, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0xcc,0xa5,0x4e, 0xe0,0xaf,0x45, 0xe0,0xaf,0x45, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0xa4,0x8c,0x32, 0xb8,0x9e,0x44, 0x86,0x72,0x26, 0x9f,0x88,0x35, + 0xbd,0xa3,0x48, 0x9b,0x85,0x32, 0xa3,0x81,0x32, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0xd1,0xae,0x4e, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0xb0,0x97,0x3c, 0xb4,0x9a,0x38, 0xac,0x94,0x41, 0xb2,0x99,0x3f, + 0xb4,0x9a,0x38, 0xb8,0x9e,0x3c, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0xcc,0xa5,0x4e, 0xa6,0x8f,0x3c, 0xb2,0x99,0x3f, 0xb4,0x9c,0x48, + 0xa8,0x90,0x36, 0x9f,0x88,0x35, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, 0x00,0x00,0x00, + +}; diff --git a/firmware_p4/components/Applications/doom/include/doom_highboy.h b/firmware_p4/components/Applications/doom/include/doom_highboy.h new file mode 100644 index 000000000..34ab48c2a --- /dev/null +++ b/firmware_p4/components/Applications/doom/include/doom_highboy.h @@ -0,0 +1,22 @@ +#ifndef DOOM_HIGHBOY_H +#define DOOM_HIGHBOY_H + +#ifdef __cplusplus +extern "C" { +#endif + +// Launch official DOOM (doomgeneric) in its own FreeRTOS task. Takes over the +// ST7789 (landscape, bypassing LVGL) and streams /sdcard/doom1.wad. Call from +// the games-menu screen open handler. Quitting DOOM reboots the device +// (hold OK+BACK ~2s), so this does not return control to the caller's UI. +// +// render_beat_kick: optional callback pulsed once per frame while DOOM owns the +// panel (LVGL is parked). Pass ui_render_beat_kick so the render-liveness +// watchdog (sys_monitor) sees progress; NULL disables it. +void highboy_doom_start(void (*render_beat_kick)(void)); + +#ifdef __cplusplus +} +#endif + +#endif // DOOM_HIGHBOY_H diff --git a/firmware_p4/components/Applications/doom/info.c b/firmware_p4/components/Applications/doom/info.c new file mode 100644 index 000000000..9389e84f0 --- /dev/null +++ b/firmware_p4/components/Applications/doom/info.c @@ -0,0 +1,4662 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Thing frame/state LUT, +// generated by multigen utilitiy. +// This one is the original DOOM version, preserved. +// + +#include +#include + +// Data. +#include "sounds.h" +#include "m_fixed.h" + +#include "info.h" + +#include "p_mobj.h" + +char *sprnames[] = { + "TROO","SHTG","PUNG","PISG","PISF","SHTF","SHT2","CHGG","CHGF","MISG", + "MISF","SAWG","PLSG","PLSF","BFGG","BFGF","BLUD","PUFF","BAL1","BAL2", + "PLSS","PLSE","MISL","BFS1","BFE1","BFE2","TFOG","IFOG","PLAY","POSS", + "SPOS","VILE","FIRE","FATB","FBXP","SKEL","MANF","FATT","CPOS","SARG", + "HEAD","BAL7","BOSS","BOS2","SKUL","SPID","BSPI","APLS","APBX","CYBR", + "PAIN","SSWV","KEEN","BBRN","BOSF","ARM1","ARM2","BAR1","BEXP","FCAN", + "BON1","BON2","BKEY","RKEY","YKEY","BSKU","RSKU","YSKU","STIM","MEDI", + "SOUL","PINV","PSTR","PINS","MEGA","SUIT","PMAP","PVIS","CLIP","AMMO", + "ROCK","BROK","CELL","CELP","SHEL","SBOX","BPAK","BFUG","MGUN","CSAW", + "LAUN","PLAS","SHOT","SGN2","COLU","SMT2","GOR1","POL2","POL5","POL4", + "POL3","POL1","POL6","GOR2","GOR3","GOR4","GOR5","SMIT","COL1","COL2", + "COL3","COL4","CAND","CBRA","COL6","TRE1","TRE2","ELEC","CEYE","FSKU", + "COL5","TBLU","TGRN","TRED","SMBT","SMGT","SMRT","HDB1","HDB2","HDB3", + "HDB4","HDB5","HDB6","POB1","POB2","BRS1","TLMP","TLP2", NULL +}; + + +// Doesn't work with g++, needs actionf_p1 +void A_Light0(); +void A_WeaponReady(); +void A_Lower(); +void A_Raise(); +void A_Punch(); +void A_ReFire(); +void A_FirePistol(); +void A_Light1(); +void A_FireShotgun(); +void A_Light2(); +void A_FireShotgun2(); +void A_CheckReload(); +void A_OpenShotgun2(); +void A_LoadShotgun2(); +void A_CloseShotgun2(); +void A_FireCGun(); +void A_GunFlash(); +void A_FireMissile(); +void A_Saw(); +void A_FirePlasma(); +void A_BFGsound(); +void A_FireBFG(); +void A_BFGSpray(); +void A_Explode(); +void A_Pain(); +void A_PlayerScream(); +void A_Fall(); +void A_XScream(); +void A_Look(); +void A_Chase(); +void A_FaceTarget(); +void A_PosAttack(); +void A_Scream(); +void A_SPosAttack(); +void A_VileChase(); +void A_VileStart(); +void A_VileTarget(); +void A_VileAttack(); +void A_StartFire(); +void A_Fire(); +void A_FireCrackle(); +void A_Tracer(); +void A_SkelWhoosh(); +void A_SkelFist(); +void A_SkelMissile(); +void A_FatRaise(); +void A_FatAttack1(); +void A_FatAttack2(); +void A_FatAttack3(); +void A_BossDeath(); +void A_CPosAttack(); +void A_CPosRefire(); +void A_TroopAttack(); +void A_SargAttack(); +void A_HeadAttack(); +void A_BruisAttack(); +void A_SkullAttack(); +void A_Metal(); +void A_SpidRefire(); +void A_BabyMetal(); +void A_BspiAttack(); +void A_Hoof(); +void A_CyberAttack(); +void A_PainAttack(); +void A_PainDie(); +void A_KeenDie(); +void A_BrainPain(); +void A_BrainScream(); +void A_BrainDie(); +void A_BrainAwake(); +void A_BrainSpit(); +void A_SpawnSound(); +void A_SpawnFly(); +void A_BrainExplode(); + + +state_t states[NUMSTATES] = { + {SPR_TROO,0,-1,{NULL},S_NULL,0,0}, // S_NULL + {SPR_SHTG,4,0,{A_Light0},S_NULL,0,0}, // S_LIGHTDONE + {SPR_PUNG,0,1,{A_WeaponReady},S_PUNCH,0,0}, // S_PUNCH + {SPR_PUNG,0,1,{A_Lower},S_PUNCHDOWN,0,0}, // S_PUNCHDOWN + {SPR_PUNG,0,1,{A_Raise},S_PUNCHUP,0,0}, // S_PUNCHUP + {SPR_PUNG,1,4,{NULL},S_PUNCH2,0,0}, // S_PUNCH1 + {SPR_PUNG,2,4,{A_Punch},S_PUNCH3,0,0}, // S_PUNCH2 + {SPR_PUNG,3,5,{NULL},S_PUNCH4,0,0}, // S_PUNCH3 + {SPR_PUNG,2,4,{NULL},S_PUNCH5,0,0}, // S_PUNCH4 + {SPR_PUNG,1,5,{A_ReFire},S_PUNCH,0,0}, // S_PUNCH5 + {SPR_PISG,0,1,{A_WeaponReady},S_PISTOL,0,0},// S_PISTOL + {SPR_PISG,0,1,{A_Lower},S_PISTOLDOWN,0,0}, // S_PISTOLDOWN + {SPR_PISG,0,1,{A_Raise},S_PISTOLUP,0,0}, // S_PISTOLUP + {SPR_PISG,0,4,{NULL},S_PISTOL2,0,0}, // S_PISTOL1 + {SPR_PISG,1,6,{A_FirePistol},S_PISTOL3,0,0},// S_PISTOL2 + {SPR_PISG,2,4,{NULL},S_PISTOL4,0,0}, // S_PISTOL3 + {SPR_PISG,1,5,{A_ReFire},S_PISTOL,0,0}, // S_PISTOL4 + {SPR_PISF,32768,7,{A_Light1},S_LIGHTDONE,0,0}, // S_PISTOLFLASH + {SPR_SHTG,0,1,{A_WeaponReady},S_SGUN,0,0}, // S_SGUN + {SPR_SHTG,0,1,{A_Lower},S_SGUNDOWN,0,0}, // S_SGUNDOWN + {SPR_SHTG,0,1,{A_Raise},S_SGUNUP,0,0}, // S_SGUNUP + {SPR_SHTG,0,3,{NULL},S_SGUN2,0,0}, // S_SGUN1 + {SPR_SHTG,0,7,{A_FireShotgun},S_SGUN3,0,0}, // S_SGUN2 + {SPR_SHTG,1,5,{NULL},S_SGUN4,0,0}, // S_SGUN3 + {SPR_SHTG,2,5,{NULL},S_SGUN5,0,0}, // S_SGUN4 + {SPR_SHTG,3,4,{NULL},S_SGUN6,0,0}, // S_SGUN5 + {SPR_SHTG,2,5,{NULL},S_SGUN7,0,0}, // S_SGUN6 + {SPR_SHTG,1,5,{NULL},S_SGUN8,0,0}, // S_SGUN7 + {SPR_SHTG,0,3,{NULL},S_SGUN9,0,0}, // S_SGUN8 + {SPR_SHTG,0,7,{A_ReFire},S_SGUN,0,0}, // S_SGUN9 + {SPR_SHTF,32768,4,{A_Light1},S_SGUNFLASH2,0,0}, // S_SGUNFLASH1 + {SPR_SHTF,32769,3,{A_Light2},S_LIGHTDONE,0,0}, // S_SGUNFLASH2 + {SPR_SHT2,0,1,{A_WeaponReady},S_DSGUN,0,0}, // S_DSGUN + {SPR_SHT2,0,1,{A_Lower},S_DSGUNDOWN,0,0}, // S_DSGUNDOWN + {SPR_SHT2,0,1,{A_Raise},S_DSGUNUP,0,0}, // S_DSGUNUP + {SPR_SHT2,0,3,{NULL},S_DSGUN2,0,0}, // S_DSGUN1 + {SPR_SHT2,0,7,{A_FireShotgun2},S_DSGUN3,0,0}, // S_DSGUN2 + {SPR_SHT2,1,7,{NULL},S_DSGUN4,0,0}, // S_DSGUN3 + {SPR_SHT2,2,7,{A_CheckReload},S_DSGUN5,0,0}, // S_DSGUN4 + {SPR_SHT2,3,7,{A_OpenShotgun2},S_DSGUN6,0,0}, // S_DSGUN5 + {SPR_SHT2,4,7,{NULL},S_DSGUN7,0,0}, // S_DSGUN6 + {SPR_SHT2,5,7,{A_LoadShotgun2},S_DSGUN8,0,0}, // S_DSGUN7 + {SPR_SHT2,6,6,{NULL},S_DSGUN9,0,0}, // S_DSGUN8 + {SPR_SHT2,7,6,{A_CloseShotgun2},S_DSGUN10,0,0}, // S_DSGUN9 + {SPR_SHT2,0,5,{A_ReFire},S_DSGUN,0,0}, // S_DSGUN10 + {SPR_SHT2,1,7,{NULL},S_DSNR2,0,0}, // S_DSNR1 + {SPR_SHT2,0,3,{NULL},S_DSGUNDOWN,0,0}, // S_DSNR2 + {SPR_SHT2,32776,5,{A_Light1},S_DSGUNFLASH2,0,0}, // S_DSGUNFLASH1 + {SPR_SHT2,32777,4,{A_Light2},S_LIGHTDONE,0,0}, // S_DSGUNFLASH2 + {SPR_CHGG,0,1,{A_WeaponReady},S_CHAIN,0,0}, // S_CHAIN + {SPR_CHGG,0,1,{A_Lower},S_CHAINDOWN,0,0}, // S_CHAINDOWN + {SPR_CHGG,0,1,{A_Raise},S_CHAINUP,0,0}, // S_CHAINUP + {SPR_CHGG,0,4,{A_FireCGun},S_CHAIN2,0,0}, // S_CHAIN1 + {SPR_CHGG,1,4,{A_FireCGun},S_CHAIN3,0,0}, // S_CHAIN2 + {SPR_CHGG,1,0,{A_ReFire},S_CHAIN,0,0}, // S_CHAIN3 + {SPR_CHGF,32768,5,{A_Light1},S_LIGHTDONE,0,0}, // S_CHAINFLASH1 + {SPR_CHGF,32769,5,{A_Light2},S_LIGHTDONE,0,0}, // S_CHAINFLASH2 + {SPR_MISG,0,1,{A_WeaponReady},S_MISSILE,0,0}, // S_MISSILE + {SPR_MISG,0,1,{A_Lower},S_MISSILEDOWN,0,0}, // S_MISSILEDOWN + {SPR_MISG,0,1,{A_Raise},S_MISSILEUP,0,0}, // S_MISSILEUP + {SPR_MISG,1,8,{A_GunFlash},S_MISSILE2,0,0}, // S_MISSILE1 + {SPR_MISG,1,12,{A_FireMissile},S_MISSILE3,0,0}, // S_MISSILE2 + {SPR_MISG,1,0,{A_ReFire},S_MISSILE,0,0}, // S_MISSILE3 + {SPR_MISF,32768,3,{A_Light1},S_MISSILEFLASH2,0,0}, // S_MISSILEFLASH1 + {SPR_MISF,32769,4,{NULL},S_MISSILEFLASH3,0,0}, // S_MISSILEFLASH2 + {SPR_MISF,32770,4,{A_Light2},S_MISSILEFLASH4,0,0}, // S_MISSILEFLASH3 + {SPR_MISF,32771,4,{A_Light2},S_LIGHTDONE,0,0}, // S_MISSILEFLASH4 + {SPR_SAWG,2,4,{A_WeaponReady},S_SAWB,0,0}, // S_SAW + {SPR_SAWG,3,4,{A_WeaponReady},S_SAW,0,0}, // S_SAWB + {SPR_SAWG,2,1,{A_Lower},S_SAWDOWN,0,0}, // S_SAWDOWN + {SPR_SAWG,2,1,{A_Raise},S_SAWUP,0,0}, // S_SAWUP + {SPR_SAWG,0,4,{A_Saw},S_SAW2,0,0}, // S_SAW1 + {SPR_SAWG,1,4,{A_Saw},S_SAW3,0,0}, // S_SAW2 + {SPR_SAWG,1,0,{A_ReFire},S_SAW,0,0}, // S_SAW3 + {SPR_PLSG,0,1,{A_WeaponReady},S_PLASMA,0,0}, // S_PLASMA + {SPR_PLSG,0,1,{A_Lower},S_PLASMADOWN,0,0}, // S_PLASMADOWN + {SPR_PLSG,0,1,{A_Raise},S_PLASMAUP,0,0}, // S_PLASMAUP + {SPR_PLSG,0,3,{A_FirePlasma},S_PLASMA2,0,0}, // S_PLASMA1 + {SPR_PLSG,1,20,{A_ReFire},S_PLASMA,0,0}, // S_PLASMA2 + {SPR_PLSF,32768,4,{A_Light1},S_LIGHTDONE,0,0}, // S_PLASMAFLASH1 + {SPR_PLSF,32769,4,{A_Light1},S_LIGHTDONE,0,0}, // S_PLASMAFLASH2 + {SPR_BFGG,0,1,{A_WeaponReady},S_BFG,0,0}, // S_BFG + {SPR_BFGG,0,1,{A_Lower},S_BFGDOWN,0,0}, // S_BFGDOWN + {SPR_BFGG,0,1,{A_Raise},S_BFGUP,0,0}, // S_BFGUP + {SPR_BFGG,0,20,{A_BFGsound},S_BFG2,0,0}, // S_BFG1 + {SPR_BFGG,1,10,{A_GunFlash},S_BFG3,0,0}, // S_BFG2 + {SPR_BFGG,1,10,{A_FireBFG},S_BFG4,0,0}, // S_BFG3 + {SPR_BFGG,1,20,{A_ReFire},S_BFG,0,0}, // S_BFG4 + {SPR_BFGF,32768,11,{A_Light1},S_BFGFLASH2,0,0}, // S_BFGFLASH1 + {SPR_BFGF,32769,6,{A_Light2},S_LIGHTDONE,0,0}, // S_BFGFLASH2 + {SPR_BLUD,2,8,{NULL},S_BLOOD2,0,0}, // S_BLOOD1 + {SPR_BLUD,1,8,{NULL},S_BLOOD3,0,0}, // S_BLOOD2 + {SPR_BLUD,0,8,{NULL},S_NULL,0,0}, // S_BLOOD3 + {SPR_PUFF,32768,4,{NULL},S_PUFF2,0,0}, // S_PUFF1 + {SPR_PUFF,1,4,{NULL},S_PUFF3,0,0}, // S_PUFF2 + {SPR_PUFF,2,4,{NULL},S_PUFF4,0,0}, // S_PUFF3 + {SPR_PUFF,3,4,{NULL},S_NULL,0,0}, // S_PUFF4 + {SPR_BAL1,32768,4,{NULL},S_TBALL2,0,0}, // S_TBALL1 + {SPR_BAL1,32769,4,{NULL},S_TBALL1,0,0}, // S_TBALL2 + {SPR_BAL1,32770,6,{NULL},S_TBALLX2,0,0}, // S_TBALLX1 + {SPR_BAL1,32771,6,{NULL},S_TBALLX3,0,0}, // S_TBALLX2 + {SPR_BAL1,32772,6,{NULL},S_NULL,0,0}, // S_TBALLX3 + {SPR_BAL2,32768,4,{NULL},S_RBALL2,0,0}, // S_RBALL1 + {SPR_BAL2,32769,4,{NULL},S_RBALL1,0,0}, // S_RBALL2 + {SPR_BAL2,32770,6,{NULL},S_RBALLX2,0,0}, // S_RBALLX1 + {SPR_BAL2,32771,6,{NULL},S_RBALLX3,0,0}, // S_RBALLX2 + {SPR_BAL2,32772,6,{NULL},S_NULL,0,0}, // S_RBALLX3 + {SPR_PLSS,32768,6,{NULL},S_PLASBALL2,0,0}, // S_PLASBALL + {SPR_PLSS,32769,6,{NULL},S_PLASBALL,0,0}, // S_PLASBALL2 + {SPR_PLSE,32768,4,{NULL},S_PLASEXP2,0,0}, // S_PLASEXP + {SPR_PLSE,32769,4,{NULL},S_PLASEXP3,0,0}, // S_PLASEXP2 + {SPR_PLSE,32770,4,{NULL},S_PLASEXP4,0,0}, // S_PLASEXP3 + {SPR_PLSE,32771,4,{NULL},S_PLASEXP5,0,0}, // S_PLASEXP4 + {SPR_PLSE,32772,4,{NULL},S_NULL,0,0}, // S_PLASEXP5 + {SPR_MISL,32768,1,{NULL},S_ROCKET,0,0}, // S_ROCKET + {SPR_BFS1,32768,4,{NULL},S_BFGSHOT2,0,0}, // S_BFGSHOT + {SPR_BFS1,32769,4,{NULL},S_BFGSHOT,0,0}, // S_BFGSHOT2 + {SPR_BFE1,32768,8,{NULL},S_BFGLAND2,0,0}, // S_BFGLAND + {SPR_BFE1,32769,8,{NULL},S_BFGLAND3,0,0}, // S_BFGLAND2 + {SPR_BFE1,32770,8,{A_BFGSpray},S_BFGLAND4,0,0}, // S_BFGLAND3 + {SPR_BFE1,32771,8,{NULL},S_BFGLAND5,0,0}, // S_BFGLAND4 + {SPR_BFE1,32772,8,{NULL},S_BFGLAND6,0,0}, // S_BFGLAND5 + {SPR_BFE1,32773,8,{NULL},S_NULL,0,0}, // S_BFGLAND6 + {SPR_BFE2,32768,8,{NULL},S_BFGEXP2,0,0}, // S_BFGEXP + {SPR_BFE2,32769,8,{NULL},S_BFGEXP3,0,0}, // S_BFGEXP2 + {SPR_BFE2,32770,8,{NULL},S_BFGEXP4,0,0}, // S_BFGEXP3 + {SPR_BFE2,32771,8,{NULL},S_NULL,0,0}, // S_BFGEXP4 + {SPR_MISL,32769,8,{A_Explode},S_EXPLODE2,0,0}, // S_EXPLODE1 + {SPR_MISL,32770,6,{NULL},S_EXPLODE3,0,0}, // S_EXPLODE2 + {SPR_MISL,32771,4,{NULL},S_NULL,0,0}, // S_EXPLODE3 + {SPR_TFOG,32768,6,{NULL},S_TFOG01,0,0}, // S_TFOG + {SPR_TFOG,32769,6,{NULL},S_TFOG02,0,0}, // S_TFOG01 + {SPR_TFOG,32768,6,{NULL},S_TFOG2,0,0}, // S_TFOG02 + {SPR_TFOG,32769,6,{NULL},S_TFOG3,0,0}, // S_TFOG2 + {SPR_TFOG,32770,6,{NULL},S_TFOG4,0,0}, // S_TFOG3 + {SPR_TFOG,32771,6,{NULL},S_TFOG5,0,0}, // S_TFOG4 + {SPR_TFOG,32772,6,{NULL},S_TFOG6,0,0}, // S_TFOG5 + {SPR_TFOG,32773,6,{NULL},S_TFOG7,0,0}, // S_TFOG6 + {SPR_TFOG,32774,6,{NULL},S_TFOG8,0,0}, // S_TFOG7 + {SPR_TFOG,32775,6,{NULL},S_TFOG9,0,0}, // S_TFOG8 + {SPR_TFOG,32776,6,{NULL},S_TFOG10,0,0}, // S_TFOG9 + {SPR_TFOG,32777,6,{NULL},S_NULL,0,0}, // S_TFOG10 + {SPR_IFOG,32768,6,{NULL},S_IFOG01,0,0}, // S_IFOG + {SPR_IFOG,32769,6,{NULL},S_IFOG02,0,0}, // S_IFOG01 + {SPR_IFOG,32768,6,{NULL},S_IFOG2,0,0}, // S_IFOG02 + {SPR_IFOG,32769,6,{NULL},S_IFOG3,0,0}, // S_IFOG2 + {SPR_IFOG,32770,6,{NULL},S_IFOG4,0,0}, // S_IFOG3 + {SPR_IFOG,32771,6,{NULL},S_IFOG5,0,0}, // S_IFOG4 + {SPR_IFOG,32772,6,{NULL},S_NULL,0,0}, // S_IFOG5 + {SPR_PLAY,0,-1,{NULL},S_NULL,0,0}, // S_PLAY + {SPR_PLAY,0,4,{NULL},S_PLAY_RUN2,0,0}, // S_PLAY_RUN1 + {SPR_PLAY,1,4,{NULL},S_PLAY_RUN3,0,0}, // S_PLAY_RUN2 + {SPR_PLAY,2,4,{NULL},S_PLAY_RUN4,0,0}, // S_PLAY_RUN3 + {SPR_PLAY,3,4,{NULL},S_PLAY_RUN1,0,0}, // S_PLAY_RUN4 + {SPR_PLAY,4,12,{NULL},S_PLAY,0,0}, // S_PLAY_ATK1 + {SPR_PLAY,32773,6,{NULL},S_PLAY_ATK1,0,0}, // S_PLAY_ATK2 + {SPR_PLAY,6,4,{NULL},S_PLAY_PAIN2,0,0}, // S_PLAY_PAIN + {SPR_PLAY,6,4,{A_Pain},S_PLAY,0,0}, // S_PLAY_PAIN2 + {SPR_PLAY,7,10,{NULL},S_PLAY_DIE2,0,0}, // S_PLAY_DIE1 + {SPR_PLAY,8,10,{A_PlayerScream},S_PLAY_DIE3,0,0}, // S_PLAY_DIE2 + {SPR_PLAY,9,10,{A_Fall},S_PLAY_DIE4,0,0}, // S_PLAY_DIE3 + {SPR_PLAY,10,10,{NULL},S_PLAY_DIE5,0,0}, // S_PLAY_DIE4 + {SPR_PLAY,11,10,{NULL},S_PLAY_DIE6,0,0}, // S_PLAY_DIE5 + {SPR_PLAY,12,10,{NULL},S_PLAY_DIE7,0,0}, // S_PLAY_DIE6 + {SPR_PLAY,13,-1,{NULL},S_NULL,0,0}, // S_PLAY_DIE7 + {SPR_PLAY,14,5,{NULL},S_PLAY_XDIE2,0,0}, // S_PLAY_XDIE1 + {SPR_PLAY,15,5,{A_XScream},S_PLAY_XDIE3,0,0}, // S_PLAY_XDIE2 + {SPR_PLAY,16,5,{A_Fall},S_PLAY_XDIE4,0,0}, // S_PLAY_XDIE3 + {SPR_PLAY,17,5,{NULL},S_PLAY_XDIE5,0,0}, // S_PLAY_XDIE4 + {SPR_PLAY,18,5,{NULL},S_PLAY_XDIE6,0,0}, // S_PLAY_XDIE5 + {SPR_PLAY,19,5,{NULL},S_PLAY_XDIE7,0,0}, // S_PLAY_XDIE6 + {SPR_PLAY,20,5,{NULL},S_PLAY_XDIE8,0,0}, // S_PLAY_XDIE7 + {SPR_PLAY,21,5,{NULL},S_PLAY_XDIE9,0,0}, // S_PLAY_XDIE8 + {SPR_PLAY,22,-1,{NULL},S_NULL,0,0}, // S_PLAY_XDIE9 + {SPR_POSS,0,10,{A_Look},S_POSS_STND2,0,0}, // S_POSS_STND + {SPR_POSS,1,10,{A_Look},S_POSS_STND,0,0}, // S_POSS_STND2 + {SPR_POSS,0,4,{A_Chase},S_POSS_RUN2,0,0}, // S_POSS_RUN1 + {SPR_POSS,0,4,{A_Chase},S_POSS_RUN3,0,0}, // S_POSS_RUN2 + {SPR_POSS,1,4,{A_Chase},S_POSS_RUN4,0,0}, // S_POSS_RUN3 + {SPR_POSS,1,4,{A_Chase},S_POSS_RUN5,0,0}, // S_POSS_RUN4 + {SPR_POSS,2,4,{A_Chase},S_POSS_RUN6,0,0}, // S_POSS_RUN5 + {SPR_POSS,2,4,{A_Chase},S_POSS_RUN7,0,0}, // S_POSS_RUN6 + {SPR_POSS,3,4,{A_Chase},S_POSS_RUN8,0,0}, // S_POSS_RUN7 + {SPR_POSS,3,4,{A_Chase},S_POSS_RUN1,0,0}, // S_POSS_RUN8 + {SPR_POSS,4,10,{A_FaceTarget},S_POSS_ATK2,0,0}, // S_POSS_ATK1 + {SPR_POSS,5,8,{A_PosAttack},S_POSS_ATK3,0,0}, // S_POSS_ATK2 + {SPR_POSS,4,8,{NULL},S_POSS_RUN1,0,0}, // S_POSS_ATK3 + {SPR_POSS,6,3,{NULL},S_POSS_PAIN2,0,0}, // S_POSS_PAIN + {SPR_POSS,6,3,{A_Pain},S_POSS_RUN1,0,0}, // S_POSS_PAIN2 + {SPR_POSS,7,5,{NULL},S_POSS_DIE2,0,0}, // S_POSS_DIE1 + {SPR_POSS,8,5,{A_Scream},S_POSS_DIE3,0,0}, // S_POSS_DIE2 + {SPR_POSS,9,5,{A_Fall},S_POSS_DIE4,0,0}, // S_POSS_DIE3 + {SPR_POSS,10,5,{NULL},S_POSS_DIE5,0,0}, // S_POSS_DIE4 + {SPR_POSS,11,-1,{NULL},S_NULL,0,0}, // S_POSS_DIE5 + {SPR_POSS,12,5,{NULL},S_POSS_XDIE2,0,0}, // S_POSS_XDIE1 + {SPR_POSS,13,5,{A_XScream},S_POSS_XDIE3,0,0}, // S_POSS_XDIE2 + {SPR_POSS,14,5,{A_Fall},S_POSS_XDIE4,0,0}, // S_POSS_XDIE3 + {SPR_POSS,15,5,{NULL},S_POSS_XDIE5,0,0}, // S_POSS_XDIE4 + {SPR_POSS,16,5,{NULL},S_POSS_XDIE6,0,0}, // S_POSS_XDIE5 + {SPR_POSS,17,5,{NULL},S_POSS_XDIE7,0,0}, // S_POSS_XDIE6 + {SPR_POSS,18,5,{NULL},S_POSS_XDIE8,0,0}, // S_POSS_XDIE7 + {SPR_POSS,19,5,{NULL},S_POSS_XDIE9,0,0}, // S_POSS_XDIE8 + {SPR_POSS,20,-1,{NULL},S_NULL,0,0}, // S_POSS_XDIE9 + {SPR_POSS,10,5,{NULL},S_POSS_RAISE2,0,0}, // S_POSS_RAISE1 + {SPR_POSS,9,5,{NULL},S_POSS_RAISE3,0,0}, // S_POSS_RAISE2 + {SPR_POSS,8,5,{NULL},S_POSS_RAISE4,0,0}, // S_POSS_RAISE3 + {SPR_POSS,7,5,{NULL},S_POSS_RUN1,0,0}, // S_POSS_RAISE4 + {SPR_SPOS,0,10,{A_Look},S_SPOS_STND2,0,0}, // S_SPOS_STND + {SPR_SPOS,1,10,{A_Look},S_SPOS_STND,0,0}, // S_SPOS_STND2 + {SPR_SPOS,0,3,{A_Chase},S_SPOS_RUN2,0,0}, // S_SPOS_RUN1 + {SPR_SPOS,0,3,{A_Chase},S_SPOS_RUN3,0,0}, // S_SPOS_RUN2 + {SPR_SPOS,1,3,{A_Chase},S_SPOS_RUN4,0,0}, // S_SPOS_RUN3 + {SPR_SPOS,1,3,{A_Chase},S_SPOS_RUN5,0,0}, // S_SPOS_RUN4 + {SPR_SPOS,2,3,{A_Chase},S_SPOS_RUN6,0,0}, // S_SPOS_RUN5 + {SPR_SPOS,2,3,{A_Chase},S_SPOS_RUN7,0,0}, // S_SPOS_RUN6 + {SPR_SPOS,3,3,{A_Chase},S_SPOS_RUN8,0,0}, // S_SPOS_RUN7 + {SPR_SPOS,3,3,{A_Chase},S_SPOS_RUN1,0,0}, // S_SPOS_RUN8 + {SPR_SPOS,4,10,{A_FaceTarget},S_SPOS_ATK2,0,0}, // S_SPOS_ATK1 + {SPR_SPOS,32773,10,{A_SPosAttack},S_SPOS_ATK3,0,0}, // S_SPOS_ATK2 + {SPR_SPOS,4,10,{NULL},S_SPOS_RUN1,0,0}, // S_SPOS_ATK3 + {SPR_SPOS,6,3,{NULL},S_SPOS_PAIN2,0,0}, // S_SPOS_PAIN + {SPR_SPOS,6,3,{A_Pain},S_SPOS_RUN1,0,0}, // S_SPOS_PAIN2 + {SPR_SPOS,7,5,{NULL},S_SPOS_DIE2,0,0}, // S_SPOS_DIE1 + {SPR_SPOS,8,5,{A_Scream},S_SPOS_DIE3,0,0}, // S_SPOS_DIE2 + {SPR_SPOS,9,5,{A_Fall},S_SPOS_DIE4,0,0}, // S_SPOS_DIE3 + {SPR_SPOS,10,5,{NULL},S_SPOS_DIE5,0,0}, // S_SPOS_DIE4 + {SPR_SPOS,11,-1,{NULL},S_NULL,0,0}, // S_SPOS_DIE5 + {SPR_SPOS,12,5,{NULL},S_SPOS_XDIE2,0,0}, // S_SPOS_XDIE1 + {SPR_SPOS,13,5,{A_XScream},S_SPOS_XDIE3,0,0}, // S_SPOS_XDIE2 + {SPR_SPOS,14,5,{A_Fall},S_SPOS_XDIE4,0,0}, // S_SPOS_XDIE3 + {SPR_SPOS,15,5,{NULL},S_SPOS_XDIE5,0,0}, // S_SPOS_XDIE4 + {SPR_SPOS,16,5,{NULL},S_SPOS_XDIE6,0,0}, // S_SPOS_XDIE5 + {SPR_SPOS,17,5,{NULL},S_SPOS_XDIE7,0,0}, // S_SPOS_XDIE6 + {SPR_SPOS,18,5,{NULL},S_SPOS_XDIE8,0,0}, // S_SPOS_XDIE7 + {SPR_SPOS,19,5,{NULL},S_SPOS_XDIE9,0,0}, // S_SPOS_XDIE8 + {SPR_SPOS,20,-1,{NULL},S_NULL,0,0}, // S_SPOS_XDIE9 + {SPR_SPOS,11,5,{NULL},S_SPOS_RAISE2,0,0}, // S_SPOS_RAISE1 + {SPR_SPOS,10,5,{NULL},S_SPOS_RAISE3,0,0}, // S_SPOS_RAISE2 + {SPR_SPOS,9,5,{NULL},S_SPOS_RAISE4,0,0}, // S_SPOS_RAISE3 + {SPR_SPOS,8,5,{NULL},S_SPOS_RAISE5,0,0}, // S_SPOS_RAISE4 + {SPR_SPOS,7,5,{NULL},S_SPOS_RUN1,0,0}, // S_SPOS_RAISE5 + {SPR_VILE,0,10,{A_Look},S_VILE_STND2,0,0}, // S_VILE_STND + {SPR_VILE,1,10,{A_Look},S_VILE_STND,0,0}, // S_VILE_STND2 + {SPR_VILE,0,2,{A_VileChase},S_VILE_RUN2,0,0}, // S_VILE_RUN1 + {SPR_VILE,0,2,{A_VileChase},S_VILE_RUN3,0,0}, // S_VILE_RUN2 + {SPR_VILE,1,2,{A_VileChase},S_VILE_RUN4,0,0}, // S_VILE_RUN3 + {SPR_VILE,1,2,{A_VileChase},S_VILE_RUN5,0,0}, // S_VILE_RUN4 + {SPR_VILE,2,2,{A_VileChase},S_VILE_RUN6,0,0}, // S_VILE_RUN5 + {SPR_VILE,2,2,{A_VileChase},S_VILE_RUN7,0,0}, // S_VILE_RUN6 + {SPR_VILE,3,2,{A_VileChase},S_VILE_RUN8,0,0}, // S_VILE_RUN7 + {SPR_VILE,3,2,{A_VileChase},S_VILE_RUN9,0,0}, // S_VILE_RUN8 + {SPR_VILE,4,2,{A_VileChase},S_VILE_RUN10,0,0}, // S_VILE_RUN9 + {SPR_VILE,4,2,{A_VileChase},S_VILE_RUN11,0,0}, // S_VILE_RUN10 + {SPR_VILE,5,2,{A_VileChase},S_VILE_RUN12,0,0}, // S_VILE_RUN11 + {SPR_VILE,5,2,{A_VileChase},S_VILE_RUN1,0,0}, // S_VILE_RUN12 + {SPR_VILE,32774,0,{A_VileStart},S_VILE_ATK2,0,0}, // S_VILE_ATK1 + {SPR_VILE,32774,10,{A_FaceTarget},S_VILE_ATK3,0,0}, // S_VILE_ATK2 + {SPR_VILE,32775,8,{A_VileTarget},S_VILE_ATK4,0,0}, // S_VILE_ATK3 + {SPR_VILE,32776,8,{A_FaceTarget},S_VILE_ATK5,0,0}, // S_VILE_ATK4 + {SPR_VILE,32777,8,{A_FaceTarget},S_VILE_ATK6,0,0}, // S_VILE_ATK5 + {SPR_VILE,32778,8,{A_FaceTarget},S_VILE_ATK7,0,0}, // S_VILE_ATK6 + {SPR_VILE,32779,8,{A_FaceTarget},S_VILE_ATK8,0,0}, // S_VILE_ATK7 + {SPR_VILE,32780,8,{A_FaceTarget},S_VILE_ATK9,0,0}, // S_VILE_ATK8 + {SPR_VILE,32781,8,{A_FaceTarget},S_VILE_ATK10,0,0}, // S_VILE_ATK9 + {SPR_VILE,32782,8,{A_VileAttack},S_VILE_ATK11,0,0}, // S_VILE_ATK10 + {SPR_VILE,32783,20,{NULL},S_VILE_RUN1,0,0}, // S_VILE_ATK11 + {SPR_VILE,32794,10,{NULL},S_VILE_HEAL2,0,0}, // S_VILE_HEAL1 + {SPR_VILE,32795,10,{NULL},S_VILE_HEAL3,0,0}, // S_VILE_HEAL2 + {SPR_VILE,32796,10,{NULL},S_VILE_RUN1,0,0}, // S_VILE_HEAL3 + {SPR_VILE,16,5,{NULL},S_VILE_PAIN2,0,0}, // S_VILE_PAIN + {SPR_VILE,16,5,{A_Pain},S_VILE_RUN1,0,0}, // S_VILE_PAIN2 + {SPR_VILE,16,7,{NULL},S_VILE_DIE2,0,0}, // S_VILE_DIE1 + {SPR_VILE,17,7,{A_Scream},S_VILE_DIE3,0,0}, // S_VILE_DIE2 + {SPR_VILE,18,7,{A_Fall},S_VILE_DIE4,0,0}, // S_VILE_DIE3 + {SPR_VILE,19,7,{NULL},S_VILE_DIE5,0,0}, // S_VILE_DIE4 + {SPR_VILE,20,7,{NULL},S_VILE_DIE6,0,0}, // S_VILE_DIE5 + {SPR_VILE,21,7,{NULL},S_VILE_DIE7,0,0}, // S_VILE_DIE6 + {SPR_VILE,22,7,{NULL},S_VILE_DIE8,0,0}, // S_VILE_DIE7 + {SPR_VILE,23,5,{NULL},S_VILE_DIE9,0,0}, // S_VILE_DIE8 + {SPR_VILE,24,5,{NULL},S_VILE_DIE10,0,0}, // S_VILE_DIE9 + {SPR_VILE,25,-1,{NULL},S_NULL,0,0}, // S_VILE_DIE10 + {SPR_FIRE,32768,2,{A_StartFire},S_FIRE2,0,0}, // S_FIRE1 + {SPR_FIRE,32769,2,{A_Fire},S_FIRE3,0,0}, // S_FIRE2 + {SPR_FIRE,32768,2,{A_Fire},S_FIRE4,0,0}, // S_FIRE3 + {SPR_FIRE,32769,2,{A_Fire},S_FIRE5,0,0}, // S_FIRE4 + {SPR_FIRE,32770,2,{A_FireCrackle},S_FIRE6,0,0}, // S_FIRE5 + {SPR_FIRE,32769,2,{A_Fire},S_FIRE7,0,0}, // S_FIRE6 + {SPR_FIRE,32770,2,{A_Fire},S_FIRE8,0,0}, // S_FIRE7 + {SPR_FIRE,32769,2,{A_Fire},S_FIRE9,0,0}, // S_FIRE8 + {SPR_FIRE,32770,2,{A_Fire},S_FIRE10,0,0}, // S_FIRE9 + {SPR_FIRE,32771,2,{A_Fire},S_FIRE11,0,0}, // S_FIRE10 + {SPR_FIRE,32770,2,{A_Fire},S_FIRE12,0,0}, // S_FIRE11 + {SPR_FIRE,32771,2,{A_Fire},S_FIRE13,0,0}, // S_FIRE12 + {SPR_FIRE,32770,2,{A_Fire},S_FIRE14,0,0}, // S_FIRE13 + {SPR_FIRE,32771,2,{A_Fire},S_FIRE15,0,0}, // S_FIRE14 + {SPR_FIRE,32772,2,{A_Fire},S_FIRE16,0,0}, // S_FIRE15 + {SPR_FIRE,32771,2,{A_Fire},S_FIRE17,0,0}, // S_FIRE16 + {SPR_FIRE,32772,2,{A_Fire},S_FIRE18,0,0}, // S_FIRE17 + {SPR_FIRE,32771,2,{A_Fire},S_FIRE19,0,0}, // S_FIRE18 + {SPR_FIRE,32772,2,{A_FireCrackle},S_FIRE20,0,0}, // S_FIRE19 + {SPR_FIRE,32773,2,{A_Fire},S_FIRE21,0,0}, // S_FIRE20 + {SPR_FIRE,32772,2,{A_Fire},S_FIRE22,0,0}, // S_FIRE21 + {SPR_FIRE,32773,2,{A_Fire},S_FIRE23,0,0}, // S_FIRE22 + {SPR_FIRE,32772,2,{A_Fire},S_FIRE24,0,0}, // S_FIRE23 + {SPR_FIRE,32773,2,{A_Fire},S_FIRE25,0,0}, // S_FIRE24 + {SPR_FIRE,32774,2,{A_Fire},S_FIRE26,0,0}, // S_FIRE25 + {SPR_FIRE,32775,2,{A_Fire},S_FIRE27,0,0}, // S_FIRE26 + {SPR_FIRE,32774,2,{A_Fire},S_FIRE28,0,0}, // S_FIRE27 + {SPR_FIRE,32775,2,{A_Fire},S_FIRE29,0,0}, // S_FIRE28 + {SPR_FIRE,32774,2,{A_Fire},S_FIRE30,0,0}, // S_FIRE29 + {SPR_FIRE,32775,2,{A_Fire},S_NULL,0,0}, // S_FIRE30 + {SPR_PUFF,1,4,{NULL},S_SMOKE2,0,0}, // S_SMOKE1 + {SPR_PUFF,2,4,{NULL},S_SMOKE3,0,0}, // S_SMOKE2 + {SPR_PUFF,1,4,{NULL},S_SMOKE4,0,0}, // S_SMOKE3 + {SPR_PUFF,2,4,{NULL},S_SMOKE5,0,0}, // S_SMOKE4 + {SPR_PUFF,3,4,{NULL},S_NULL,0,0}, // S_SMOKE5 + {SPR_FATB,32768,2,{A_Tracer},S_TRACER2,0,0}, // S_TRACER + {SPR_FATB,32769,2,{A_Tracer},S_TRACER,0,0}, // S_TRACER2 + {SPR_FBXP,32768,8,{NULL},S_TRACEEXP2,0,0}, // S_TRACEEXP1 + {SPR_FBXP,32769,6,{NULL},S_TRACEEXP3,0,0}, // S_TRACEEXP2 + {SPR_FBXP,32770,4,{NULL},S_NULL,0,0}, // S_TRACEEXP3 + {SPR_SKEL,0,10,{A_Look},S_SKEL_STND2,0,0}, // S_SKEL_STND + {SPR_SKEL,1,10,{A_Look},S_SKEL_STND,0,0}, // S_SKEL_STND2 + {SPR_SKEL,0,2,{A_Chase},S_SKEL_RUN2,0,0}, // S_SKEL_RUN1 + {SPR_SKEL,0,2,{A_Chase},S_SKEL_RUN3,0,0}, // S_SKEL_RUN2 + {SPR_SKEL,1,2,{A_Chase},S_SKEL_RUN4,0,0}, // S_SKEL_RUN3 + {SPR_SKEL,1,2,{A_Chase},S_SKEL_RUN5,0,0}, // S_SKEL_RUN4 + {SPR_SKEL,2,2,{A_Chase},S_SKEL_RUN6,0,0}, // S_SKEL_RUN5 + {SPR_SKEL,2,2,{A_Chase},S_SKEL_RUN7,0,0}, // S_SKEL_RUN6 + {SPR_SKEL,3,2,{A_Chase},S_SKEL_RUN8,0,0}, // S_SKEL_RUN7 + {SPR_SKEL,3,2,{A_Chase},S_SKEL_RUN9,0,0}, // S_SKEL_RUN8 + {SPR_SKEL,4,2,{A_Chase},S_SKEL_RUN10,0,0}, // S_SKEL_RUN9 + {SPR_SKEL,4,2,{A_Chase},S_SKEL_RUN11,0,0}, // S_SKEL_RUN10 + {SPR_SKEL,5,2,{A_Chase},S_SKEL_RUN12,0,0}, // S_SKEL_RUN11 + {SPR_SKEL,5,2,{A_Chase},S_SKEL_RUN1,0,0}, // S_SKEL_RUN12 + {SPR_SKEL,6,0,{A_FaceTarget},S_SKEL_FIST2,0,0}, // S_SKEL_FIST1 + {SPR_SKEL,6,6,{A_SkelWhoosh},S_SKEL_FIST3,0,0}, // S_SKEL_FIST2 + {SPR_SKEL,7,6,{A_FaceTarget},S_SKEL_FIST4,0,0}, // S_SKEL_FIST3 + {SPR_SKEL,8,6,{A_SkelFist},S_SKEL_RUN1,0,0}, // S_SKEL_FIST4 + {SPR_SKEL,32777,0,{A_FaceTarget},S_SKEL_MISS2,0,0}, // S_SKEL_MISS1 + {SPR_SKEL,32777,10,{A_FaceTarget},S_SKEL_MISS3,0,0}, // S_SKEL_MISS2 + {SPR_SKEL,10,10,{A_SkelMissile},S_SKEL_MISS4,0,0}, // S_SKEL_MISS3 + {SPR_SKEL,10,10,{A_FaceTarget},S_SKEL_RUN1,0,0}, // S_SKEL_MISS4 + {SPR_SKEL,11,5,{NULL},S_SKEL_PAIN2,0,0}, // S_SKEL_PAIN + {SPR_SKEL,11,5,{A_Pain},S_SKEL_RUN1,0,0}, // S_SKEL_PAIN2 + {SPR_SKEL,11,7,{NULL},S_SKEL_DIE2,0,0}, // S_SKEL_DIE1 + {SPR_SKEL,12,7,{NULL},S_SKEL_DIE3,0,0}, // S_SKEL_DIE2 + {SPR_SKEL,13,7,{A_Scream},S_SKEL_DIE4,0,0}, // S_SKEL_DIE3 + {SPR_SKEL,14,7,{A_Fall},S_SKEL_DIE5,0,0}, // S_SKEL_DIE4 + {SPR_SKEL,15,7,{NULL},S_SKEL_DIE6,0,0}, // S_SKEL_DIE5 + {SPR_SKEL,16,-1,{NULL},S_NULL,0,0}, // S_SKEL_DIE6 + {SPR_SKEL,16,5,{NULL},S_SKEL_RAISE2,0,0}, // S_SKEL_RAISE1 + {SPR_SKEL,15,5,{NULL},S_SKEL_RAISE3,0,0}, // S_SKEL_RAISE2 + {SPR_SKEL,14,5,{NULL},S_SKEL_RAISE4,0,0}, // S_SKEL_RAISE3 + {SPR_SKEL,13,5,{NULL},S_SKEL_RAISE5,0,0}, // S_SKEL_RAISE4 + {SPR_SKEL,12,5,{NULL},S_SKEL_RAISE6,0,0}, // S_SKEL_RAISE5 + {SPR_SKEL,11,5,{NULL},S_SKEL_RUN1,0,0}, // S_SKEL_RAISE6 + {SPR_MANF,32768,4,{NULL},S_FATSHOT2,0,0}, // S_FATSHOT1 + {SPR_MANF,32769,4,{NULL},S_FATSHOT1,0,0}, // S_FATSHOT2 + {SPR_MISL,32769,8,{NULL},S_FATSHOTX2,0,0}, // S_FATSHOTX1 + {SPR_MISL,32770,6,{NULL},S_FATSHOTX3,0,0}, // S_FATSHOTX2 + {SPR_MISL,32771,4,{NULL},S_NULL,0,0}, // S_FATSHOTX3 + {SPR_FATT,0,15,{A_Look},S_FATT_STND2,0,0}, // S_FATT_STND + {SPR_FATT,1,15,{A_Look},S_FATT_STND,0,0}, // S_FATT_STND2 + {SPR_FATT,0,4,{A_Chase},S_FATT_RUN2,0,0}, // S_FATT_RUN1 + {SPR_FATT,0,4,{A_Chase},S_FATT_RUN3,0,0}, // S_FATT_RUN2 + {SPR_FATT,1,4,{A_Chase},S_FATT_RUN4,0,0}, // S_FATT_RUN3 + {SPR_FATT,1,4,{A_Chase},S_FATT_RUN5,0,0}, // S_FATT_RUN4 + {SPR_FATT,2,4,{A_Chase},S_FATT_RUN6,0,0}, // S_FATT_RUN5 + {SPR_FATT,2,4,{A_Chase},S_FATT_RUN7,0,0}, // S_FATT_RUN6 + {SPR_FATT,3,4,{A_Chase},S_FATT_RUN8,0,0}, // S_FATT_RUN7 + {SPR_FATT,3,4,{A_Chase},S_FATT_RUN9,0,0}, // S_FATT_RUN8 + {SPR_FATT,4,4,{A_Chase},S_FATT_RUN10,0,0}, // S_FATT_RUN9 + {SPR_FATT,4,4,{A_Chase},S_FATT_RUN11,0,0}, // S_FATT_RUN10 + {SPR_FATT,5,4,{A_Chase},S_FATT_RUN12,0,0}, // S_FATT_RUN11 + {SPR_FATT,5,4,{A_Chase},S_FATT_RUN1,0,0}, // S_FATT_RUN12 + {SPR_FATT,6,20,{A_FatRaise},S_FATT_ATK2,0,0}, // S_FATT_ATK1 + {SPR_FATT,32775,10,{A_FatAttack1},S_FATT_ATK3,0,0}, // S_FATT_ATK2 + {SPR_FATT,8,5,{A_FaceTarget},S_FATT_ATK4,0,0}, // S_FATT_ATK3 + {SPR_FATT,6,5,{A_FaceTarget},S_FATT_ATK5,0,0}, // S_FATT_ATK4 + {SPR_FATT,32775,10,{A_FatAttack2},S_FATT_ATK6,0,0}, // S_FATT_ATK5 + {SPR_FATT,8,5,{A_FaceTarget},S_FATT_ATK7,0,0}, // S_FATT_ATK6 + {SPR_FATT,6,5,{A_FaceTarget},S_FATT_ATK8,0,0}, // S_FATT_ATK7 + {SPR_FATT,32775,10,{A_FatAttack3},S_FATT_ATK9,0,0}, // S_FATT_ATK8 + {SPR_FATT,8,5,{A_FaceTarget},S_FATT_ATK10,0,0}, // S_FATT_ATK9 + {SPR_FATT,6,5,{A_FaceTarget},S_FATT_RUN1,0,0}, // S_FATT_ATK10 + {SPR_FATT,9,3,{NULL},S_FATT_PAIN2,0,0}, // S_FATT_PAIN + {SPR_FATT,9,3,{A_Pain},S_FATT_RUN1,0,0}, // S_FATT_PAIN2 + {SPR_FATT,10,6,{NULL},S_FATT_DIE2,0,0}, // S_FATT_DIE1 + {SPR_FATT,11,6,{A_Scream},S_FATT_DIE3,0,0}, // S_FATT_DIE2 + {SPR_FATT,12,6,{A_Fall},S_FATT_DIE4,0,0}, // S_FATT_DIE3 + {SPR_FATT,13,6,{NULL},S_FATT_DIE5,0,0}, // S_FATT_DIE4 + {SPR_FATT,14,6,{NULL},S_FATT_DIE6,0,0}, // S_FATT_DIE5 + {SPR_FATT,15,6,{NULL},S_FATT_DIE7,0,0}, // S_FATT_DIE6 + {SPR_FATT,16,6,{NULL},S_FATT_DIE8,0,0}, // S_FATT_DIE7 + {SPR_FATT,17,6,{NULL},S_FATT_DIE9,0,0}, // S_FATT_DIE8 + {SPR_FATT,18,6,{NULL},S_FATT_DIE10,0,0}, // S_FATT_DIE9 + {SPR_FATT,19,-1,{A_BossDeath},S_NULL,0,0}, // S_FATT_DIE10 + {SPR_FATT,17,5,{NULL},S_FATT_RAISE2,0,0}, // S_FATT_RAISE1 + {SPR_FATT,16,5,{NULL},S_FATT_RAISE3,0,0}, // S_FATT_RAISE2 + {SPR_FATT,15,5,{NULL},S_FATT_RAISE4,0,0}, // S_FATT_RAISE3 + {SPR_FATT,14,5,{NULL},S_FATT_RAISE5,0,0}, // S_FATT_RAISE4 + {SPR_FATT,13,5,{NULL},S_FATT_RAISE6,0,0}, // S_FATT_RAISE5 + {SPR_FATT,12,5,{NULL},S_FATT_RAISE7,0,0}, // S_FATT_RAISE6 + {SPR_FATT,11,5,{NULL},S_FATT_RAISE8,0,0}, // S_FATT_RAISE7 + {SPR_FATT,10,5,{NULL},S_FATT_RUN1,0,0}, // S_FATT_RAISE8 + {SPR_CPOS,0,10,{A_Look},S_CPOS_STND2,0,0}, // S_CPOS_STND + {SPR_CPOS,1,10,{A_Look},S_CPOS_STND,0,0}, // S_CPOS_STND2 + {SPR_CPOS,0,3,{A_Chase},S_CPOS_RUN2,0,0}, // S_CPOS_RUN1 + {SPR_CPOS,0,3,{A_Chase},S_CPOS_RUN3,0,0}, // S_CPOS_RUN2 + {SPR_CPOS,1,3,{A_Chase},S_CPOS_RUN4,0,0}, // S_CPOS_RUN3 + {SPR_CPOS,1,3,{A_Chase},S_CPOS_RUN5,0,0}, // S_CPOS_RUN4 + {SPR_CPOS,2,3,{A_Chase},S_CPOS_RUN6,0,0}, // S_CPOS_RUN5 + {SPR_CPOS,2,3,{A_Chase},S_CPOS_RUN7,0,0}, // S_CPOS_RUN6 + {SPR_CPOS,3,3,{A_Chase},S_CPOS_RUN8,0,0}, // S_CPOS_RUN7 + {SPR_CPOS,3,3,{A_Chase},S_CPOS_RUN1,0,0}, // S_CPOS_RUN8 + {SPR_CPOS,4,10,{A_FaceTarget},S_CPOS_ATK2,0,0}, // S_CPOS_ATK1 + {SPR_CPOS,32773,4,{A_CPosAttack},S_CPOS_ATK3,0,0}, // S_CPOS_ATK2 + {SPR_CPOS,32772,4,{A_CPosAttack},S_CPOS_ATK4,0,0}, // S_CPOS_ATK3 + {SPR_CPOS,5,1,{A_CPosRefire},S_CPOS_ATK2,0,0}, // S_CPOS_ATK4 + {SPR_CPOS,6,3,{NULL},S_CPOS_PAIN2,0,0}, // S_CPOS_PAIN + {SPR_CPOS,6,3,{A_Pain},S_CPOS_RUN1,0,0}, // S_CPOS_PAIN2 + {SPR_CPOS,7,5,{NULL},S_CPOS_DIE2,0,0}, // S_CPOS_DIE1 + {SPR_CPOS,8,5,{A_Scream},S_CPOS_DIE3,0,0}, // S_CPOS_DIE2 + {SPR_CPOS,9,5,{A_Fall},S_CPOS_DIE4,0,0}, // S_CPOS_DIE3 + {SPR_CPOS,10,5,{NULL},S_CPOS_DIE5,0,0}, // S_CPOS_DIE4 + {SPR_CPOS,11,5,{NULL},S_CPOS_DIE6,0,0}, // S_CPOS_DIE5 + {SPR_CPOS,12,5,{NULL},S_CPOS_DIE7,0,0}, // S_CPOS_DIE6 + {SPR_CPOS,13,-1,{NULL},S_NULL,0,0}, // S_CPOS_DIE7 + {SPR_CPOS,14,5,{NULL},S_CPOS_XDIE2,0,0}, // S_CPOS_XDIE1 + {SPR_CPOS,15,5,{A_XScream},S_CPOS_XDIE3,0,0}, // S_CPOS_XDIE2 + {SPR_CPOS,16,5,{A_Fall},S_CPOS_XDIE4,0,0}, // S_CPOS_XDIE3 + {SPR_CPOS,17,5,{NULL},S_CPOS_XDIE5,0,0}, // S_CPOS_XDIE4 + {SPR_CPOS,18,5,{NULL},S_CPOS_XDIE6,0,0}, // S_CPOS_XDIE5 + {SPR_CPOS,19,-1,{NULL},S_NULL,0,0}, // S_CPOS_XDIE6 + {SPR_CPOS,13,5,{NULL},S_CPOS_RAISE2,0,0}, // S_CPOS_RAISE1 + {SPR_CPOS,12,5,{NULL},S_CPOS_RAISE3,0,0}, // S_CPOS_RAISE2 + {SPR_CPOS,11,5,{NULL},S_CPOS_RAISE4,0,0}, // S_CPOS_RAISE3 + {SPR_CPOS,10,5,{NULL},S_CPOS_RAISE5,0,0}, // S_CPOS_RAISE4 + {SPR_CPOS,9,5,{NULL},S_CPOS_RAISE6,0,0}, // S_CPOS_RAISE5 + {SPR_CPOS,8,5,{NULL},S_CPOS_RAISE7,0,0}, // S_CPOS_RAISE6 + {SPR_CPOS,7,5,{NULL},S_CPOS_RUN1,0,0}, // S_CPOS_RAISE7 + {SPR_TROO,0,10,{A_Look},S_TROO_STND2,0,0}, // S_TROO_STND + {SPR_TROO,1,10,{A_Look},S_TROO_STND,0,0}, // S_TROO_STND2 + {SPR_TROO,0,3,{A_Chase},S_TROO_RUN2,0,0}, // S_TROO_RUN1 + {SPR_TROO,0,3,{A_Chase},S_TROO_RUN3,0,0}, // S_TROO_RUN2 + {SPR_TROO,1,3,{A_Chase},S_TROO_RUN4,0,0}, // S_TROO_RUN3 + {SPR_TROO,1,3,{A_Chase},S_TROO_RUN5,0,0}, // S_TROO_RUN4 + {SPR_TROO,2,3,{A_Chase},S_TROO_RUN6,0,0}, // S_TROO_RUN5 + {SPR_TROO,2,3,{A_Chase},S_TROO_RUN7,0,0}, // S_TROO_RUN6 + {SPR_TROO,3,3,{A_Chase},S_TROO_RUN8,0,0}, // S_TROO_RUN7 + {SPR_TROO,3,3,{A_Chase},S_TROO_RUN1,0,0}, // S_TROO_RUN8 + {SPR_TROO,4,8,{A_FaceTarget},S_TROO_ATK2,0,0}, // S_TROO_ATK1 + {SPR_TROO,5,8,{A_FaceTarget},S_TROO_ATK3,0,0}, // S_TROO_ATK2 + {SPR_TROO,6,6,{A_TroopAttack},S_TROO_RUN1,0,0}, // S_TROO_ATK3 + {SPR_TROO,7,2,{NULL},S_TROO_PAIN2,0,0}, // S_TROO_PAIN + {SPR_TROO,7,2,{A_Pain},S_TROO_RUN1,0,0}, // S_TROO_PAIN2 + {SPR_TROO,8,8,{NULL},S_TROO_DIE2,0,0}, // S_TROO_DIE1 + {SPR_TROO,9,8,{A_Scream},S_TROO_DIE3,0,0}, // S_TROO_DIE2 + {SPR_TROO,10,6,{NULL},S_TROO_DIE4,0,0}, // S_TROO_DIE3 + {SPR_TROO,11,6,{A_Fall},S_TROO_DIE5,0,0}, // S_TROO_DIE4 + {SPR_TROO,12,-1,{NULL},S_NULL,0,0}, // S_TROO_DIE5 + {SPR_TROO,13,5,{NULL},S_TROO_XDIE2,0,0}, // S_TROO_XDIE1 + {SPR_TROO,14,5,{A_XScream},S_TROO_XDIE3,0,0}, // S_TROO_XDIE2 + {SPR_TROO,15,5,{NULL},S_TROO_XDIE4,0,0}, // S_TROO_XDIE3 + {SPR_TROO,16,5,{A_Fall},S_TROO_XDIE5,0,0}, // S_TROO_XDIE4 + {SPR_TROO,17,5,{NULL},S_TROO_XDIE6,0,0}, // S_TROO_XDIE5 + {SPR_TROO,18,5,{NULL},S_TROO_XDIE7,0,0}, // S_TROO_XDIE6 + {SPR_TROO,19,5,{NULL},S_TROO_XDIE8,0,0}, // S_TROO_XDIE7 + {SPR_TROO,20,-1,{NULL},S_NULL,0,0}, // S_TROO_XDIE8 + {SPR_TROO,12,8,{NULL},S_TROO_RAISE2,0,0}, // S_TROO_RAISE1 + {SPR_TROO,11,8,{NULL},S_TROO_RAISE3,0,0}, // S_TROO_RAISE2 + {SPR_TROO,10,6,{NULL},S_TROO_RAISE4,0,0}, // S_TROO_RAISE3 + {SPR_TROO,9,6,{NULL},S_TROO_RAISE5,0,0}, // S_TROO_RAISE4 + {SPR_TROO,8,6,{NULL},S_TROO_RUN1,0,0}, // S_TROO_RAISE5 + {SPR_SARG,0,10,{A_Look},S_SARG_STND2,0,0}, // S_SARG_STND + {SPR_SARG,1,10,{A_Look},S_SARG_STND,0,0}, // S_SARG_STND2 + {SPR_SARG,0,2,{A_Chase},S_SARG_RUN2,0,0}, // S_SARG_RUN1 + {SPR_SARG,0,2,{A_Chase},S_SARG_RUN3,0,0}, // S_SARG_RUN2 + {SPR_SARG,1,2,{A_Chase},S_SARG_RUN4,0,0}, // S_SARG_RUN3 + {SPR_SARG,1,2,{A_Chase},S_SARG_RUN5,0,0}, // S_SARG_RUN4 + {SPR_SARG,2,2,{A_Chase},S_SARG_RUN6,0,0}, // S_SARG_RUN5 + {SPR_SARG,2,2,{A_Chase},S_SARG_RUN7,0,0}, // S_SARG_RUN6 + {SPR_SARG,3,2,{A_Chase},S_SARG_RUN8,0,0}, // S_SARG_RUN7 + {SPR_SARG,3,2,{A_Chase},S_SARG_RUN1,0,0}, // S_SARG_RUN8 + {SPR_SARG,4,8,{A_FaceTarget},S_SARG_ATK2,0,0}, // S_SARG_ATK1 + {SPR_SARG,5,8,{A_FaceTarget},S_SARG_ATK3,0,0}, // S_SARG_ATK2 + {SPR_SARG,6,8,{A_SargAttack},S_SARG_RUN1,0,0}, // S_SARG_ATK3 + {SPR_SARG,7,2,{NULL},S_SARG_PAIN2,0,0}, // S_SARG_PAIN + {SPR_SARG,7,2,{A_Pain},S_SARG_RUN1,0,0}, // S_SARG_PAIN2 + {SPR_SARG,8,8,{NULL},S_SARG_DIE2,0,0}, // S_SARG_DIE1 + {SPR_SARG,9,8,{A_Scream},S_SARG_DIE3,0,0}, // S_SARG_DIE2 + {SPR_SARG,10,4,{NULL},S_SARG_DIE4,0,0}, // S_SARG_DIE3 + {SPR_SARG,11,4,{A_Fall},S_SARG_DIE5,0,0}, // S_SARG_DIE4 + {SPR_SARG,12,4,{NULL},S_SARG_DIE6,0,0}, // S_SARG_DIE5 + {SPR_SARG,13,-1,{NULL},S_NULL,0,0}, // S_SARG_DIE6 + {SPR_SARG,13,5,{NULL},S_SARG_RAISE2,0,0}, // S_SARG_RAISE1 + {SPR_SARG,12,5,{NULL},S_SARG_RAISE3,0,0}, // S_SARG_RAISE2 + {SPR_SARG,11,5,{NULL},S_SARG_RAISE4,0,0}, // S_SARG_RAISE3 + {SPR_SARG,10,5,{NULL},S_SARG_RAISE5,0,0}, // S_SARG_RAISE4 + {SPR_SARG,9,5,{NULL},S_SARG_RAISE6,0,0}, // S_SARG_RAISE5 + {SPR_SARG,8,5,{NULL},S_SARG_RUN1,0,0}, // S_SARG_RAISE6 + {SPR_HEAD,0,10,{A_Look},S_HEAD_STND,0,0}, // S_HEAD_STND + {SPR_HEAD,0,3,{A_Chase},S_HEAD_RUN1,0,0}, // S_HEAD_RUN1 + {SPR_HEAD,1,5,{A_FaceTarget},S_HEAD_ATK2,0,0}, // S_HEAD_ATK1 + {SPR_HEAD,2,5,{A_FaceTarget},S_HEAD_ATK3,0,0}, // S_HEAD_ATK2 + {SPR_HEAD,32771,5,{A_HeadAttack},S_HEAD_RUN1,0,0}, // S_HEAD_ATK3 + {SPR_HEAD,4,3,{NULL},S_HEAD_PAIN2,0,0}, // S_HEAD_PAIN + {SPR_HEAD,4,3,{A_Pain},S_HEAD_PAIN3,0,0}, // S_HEAD_PAIN2 + {SPR_HEAD,5,6,{NULL},S_HEAD_RUN1,0,0}, // S_HEAD_PAIN3 + {SPR_HEAD,6,8,{NULL},S_HEAD_DIE2,0,0}, // S_HEAD_DIE1 + {SPR_HEAD,7,8,{A_Scream},S_HEAD_DIE3,0,0}, // S_HEAD_DIE2 + {SPR_HEAD,8,8,{NULL},S_HEAD_DIE4,0,0}, // S_HEAD_DIE3 + {SPR_HEAD,9,8,{NULL},S_HEAD_DIE5,0,0}, // S_HEAD_DIE4 + {SPR_HEAD,10,8,{A_Fall},S_HEAD_DIE6,0,0}, // S_HEAD_DIE5 + {SPR_HEAD,11,-1,{NULL},S_NULL,0,0}, // S_HEAD_DIE6 + {SPR_HEAD,11,8,{NULL},S_HEAD_RAISE2,0,0}, // S_HEAD_RAISE1 + {SPR_HEAD,10,8,{NULL},S_HEAD_RAISE3,0,0}, // S_HEAD_RAISE2 + {SPR_HEAD,9,8,{NULL},S_HEAD_RAISE4,0,0}, // S_HEAD_RAISE3 + {SPR_HEAD,8,8,{NULL},S_HEAD_RAISE5,0,0}, // S_HEAD_RAISE4 + {SPR_HEAD,7,8,{NULL},S_HEAD_RAISE6,0,0}, // S_HEAD_RAISE5 + {SPR_HEAD,6,8,{NULL},S_HEAD_RUN1,0,0}, // S_HEAD_RAISE6 + {SPR_BAL7,32768,4,{NULL},S_BRBALL2,0,0}, // S_BRBALL1 + {SPR_BAL7,32769,4,{NULL},S_BRBALL1,0,0}, // S_BRBALL2 + {SPR_BAL7,32770,6,{NULL},S_BRBALLX2,0,0}, // S_BRBALLX1 + {SPR_BAL7,32771,6,{NULL},S_BRBALLX3,0,0}, // S_BRBALLX2 + {SPR_BAL7,32772,6,{NULL},S_NULL,0,0}, // S_BRBALLX3 + {SPR_BOSS,0,10,{A_Look},S_BOSS_STND2,0,0}, // S_BOSS_STND + {SPR_BOSS,1,10,{A_Look},S_BOSS_STND,0,0}, // S_BOSS_STND2 + {SPR_BOSS,0,3,{A_Chase},S_BOSS_RUN2,0,0}, // S_BOSS_RUN1 + {SPR_BOSS,0,3,{A_Chase},S_BOSS_RUN3,0,0}, // S_BOSS_RUN2 + {SPR_BOSS,1,3,{A_Chase},S_BOSS_RUN4,0,0}, // S_BOSS_RUN3 + {SPR_BOSS,1,3,{A_Chase},S_BOSS_RUN5,0,0}, // S_BOSS_RUN4 + {SPR_BOSS,2,3,{A_Chase},S_BOSS_RUN6,0,0}, // S_BOSS_RUN5 + {SPR_BOSS,2,3,{A_Chase},S_BOSS_RUN7,0,0}, // S_BOSS_RUN6 + {SPR_BOSS,3,3,{A_Chase},S_BOSS_RUN8,0,0}, // S_BOSS_RUN7 + {SPR_BOSS,3,3,{A_Chase},S_BOSS_RUN1,0,0}, // S_BOSS_RUN8 + {SPR_BOSS,4,8,{A_FaceTarget},S_BOSS_ATK2,0,0}, // S_BOSS_ATK1 + {SPR_BOSS,5,8,{A_FaceTarget},S_BOSS_ATK3,0,0}, // S_BOSS_ATK2 + {SPR_BOSS,6,8,{A_BruisAttack},S_BOSS_RUN1,0,0}, // S_BOSS_ATK3 + {SPR_BOSS,7,2,{NULL},S_BOSS_PAIN2,0,0}, // S_BOSS_PAIN + {SPR_BOSS,7,2,{A_Pain},S_BOSS_RUN1,0,0}, // S_BOSS_PAIN2 + {SPR_BOSS,8,8,{NULL},S_BOSS_DIE2,0,0}, // S_BOSS_DIE1 + {SPR_BOSS,9,8,{A_Scream},S_BOSS_DIE3,0,0}, // S_BOSS_DIE2 + {SPR_BOSS,10,8,{NULL},S_BOSS_DIE4,0,0}, // S_BOSS_DIE3 + {SPR_BOSS,11,8,{A_Fall},S_BOSS_DIE5,0,0}, // S_BOSS_DIE4 + {SPR_BOSS,12,8,{NULL},S_BOSS_DIE6,0,0}, // S_BOSS_DIE5 + {SPR_BOSS,13,8,{NULL},S_BOSS_DIE7,0,0}, // S_BOSS_DIE6 + {SPR_BOSS,14,-1,{A_BossDeath},S_NULL,0,0}, // S_BOSS_DIE7 + {SPR_BOSS,14,8,{NULL},S_BOSS_RAISE2,0,0}, // S_BOSS_RAISE1 + {SPR_BOSS,13,8,{NULL},S_BOSS_RAISE3,0,0}, // S_BOSS_RAISE2 + {SPR_BOSS,12,8,{NULL},S_BOSS_RAISE4,0,0}, // S_BOSS_RAISE3 + {SPR_BOSS,11,8,{NULL},S_BOSS_RAISE5,0,0}, // S_BOSS_RAISE4 + {SPR_BOSS,10,8,{NULL},S_BOSS_RAISE6,0,0}, // S_BOSS_RAISE5 + {SPR_BOSS,9,8,{NULL},S_BOSS_RAISE7,0,0}, // S_BOSS_RAISE6 + {SPR_BOSS,8,8,{NULL},S_BOSS_RUN1,0,0}, // S_BOSS_RAISE7 + {SPR_BOS2,0,10,{A_Look},S_BOS2_STND2,0,0}, // S_BOS2_STND + {SPR_BOS2,1,10,{A_Look},S_BOS2_STND,0,0}, // S_BOS2_STND2 + {SPR_BOS2,0,3,{A_Chase},S_BOS2_RUN2,0,0}, // S_BOS2_RUN1 + {SPR_BOS2,0,3,{A_Chase},S_BOS2_RUN3,0,0}, // S_BOS2_RUN2 + {SPR_BOS2,1,3,{A_Chase},S_BOS2_RUN4,0,0}, // S_BOS2_RUN3 + {SPR_BOS2,1,3,{A_Chase},S_BOS2_RUN5,0,0}, // S_BOS2_RUN4 + {SPR_BOS2,2,3,{A_Chase},S_BOS2_RUN6,0,0}, // S_BOS2_RUN5 + {SPR_BOS2,2,3,{A_Chase},S_BOS2_RUN7,0,0}, // S_BOS2_RUN6 + {SPR_BOS2,3,3,{A_Chase},S_BOS2_RUN8,0,0}, // S_BOS2_RUN7 + {SPR_BOS2,3,3,{A_Chase},S_BOS2_RUN1,0,0}, // S_BOS2_RUN8 + {SPR_BOS2,4,8,{A_FaceTarget},S_BOS2_ATK2,0,0}, // S_BOS2_ATK1 + {SPR_BOS2,5,8,{A_FaceTarget},S_BOS2_ATK3,0,0}, // S_BOS2_ATK2 + {SPR_BOS2,6,8,{A_BruisAttack},S_BOS2_RUN1,0,0}, // S_BOS2_ATK3 + {SPR_BOS2,7,2,{NULL},S_BOS2_PAIN2,0,0}, // S_BOS2_PAIN + {SPR_BOS2,7,2,{A_Pain},S_BOS2_RUN1,0,0}, // S_BOS2_PAIN2 + {SPR_BOS2,8,8,{NULL},S_BOS2_DIE2,0,0}, // S_BOS2_DIE1 + {SPR_BOS2,9,8,{A_Scream},S_BOS2_DIE3,0,0}, // S_BOS2_DIE2 + {SPR_BOS2,10,8,{NULL},S_BOS2_DIE4,0,0}, // S_BOS2_DIE3 + {SPR_BOS2,11,8,{A_Fall},S_BOS2_DIE5,0,0}, // S_BOS2_DIE4 + {SPR_BOS2,12,8,{NULL},S_BOS2_DIE6,0,0}, // S_BOS2_DIE5 + {SPR_BOS2,13,8,{NULL},S_BOS2_DIE7,0,0}, // S_BOS2_DIE6 + {SPR_BOS2,14,-1,{NULL},S_NULL,0,0}, // S_BOS2_DIE7 + {SPR_BOS2,14,8,{NULL},S_BOS2_RAISE2,0,0}, // S_BOS2_RAISE1 + {SPR_BOS2,13,8,{NULL},S_BOS2_RAISE3,0,0}, // S_BOS2_RAISE2 + {SPR_BOS2,12,8,{NULL},S_BOS2_RAISE4,0,0}, // S_BOS2_RAISE3 + {SPR_BOS2,11,8,{NULL},S_BOS2_RAISE5,0,0}, // S_BOS2_RAISE4 + {SPR_BOS2,10,8,{NULL},S_BOS2_RAISE6,0,0}, // S_BOS2_RAISE5 + {SPR_BOS2,9,8,{NULL},S_BOS2_RAISE7,0,0}, // S_BOS2_RAISE6 + {SPR_BOS2,8,8,{NULL},S_BOS2_RUN1,0,0}, // S_BOS2_RAISE7 + {SPR_SKUL,32768,10,{A_Look},S_SKULL_STND2,0,0}, // S_SKULL_STND + {SPR_SKUL,32769,10,{A_Look},S_SKULL_STND,0,0}, // S_SKULL_STND2 + {SPR_SKUL,32768,6,{A_Chase},S_SKULL_RUN2,0,0}, // S_SKULL_RUN1 + {SPR_SKUL,32769,6,{A_Chase},S_SKULL_RUN1,0,0}, // S_SKULL_RUN2 + {SPR_SKUL,32770,10,{A_FaceTarget},S_SKULL_ATK2,0,0}, // S_SKULL_ATK1 + {SPR_SKUL,32771,4,{A_SkullAttack},S_SKULL_ATK3,0,0}, // S_SKULL_ATK2 + {SPR_SKUL,32770,4,{NULL},S_SKULL_ATK4,0,0}, // S_SKULL_ATK3 + {SPR_SKUL,32771,4,{NULL},S_SKULL_ATK3,0,0}, // S_SKULL_ATK4 + {SPR_SKUL,32772,3,{NULL},S_SKULL_PAIN2,0,0}, // S_SKULL_PAIN + {SPR_SKUL,32772,3,{A_Pain},S_SKULL_RUN1,0,0}, // S_SKULL_PAIN2 + {SPR_SKUL,32773,6,{NULL},S_SKULL_DIE2,0,0}, // S_SKULL_DIE1 + {SPR_SKUL,32774,6,{A_Scream},S_SKULL_DIE3,0,0}, // S_SKULL_DIE2 + {SPR_SKUL,32775,6,{NULL},S_SKULL_DIE4,0,0}, // S_SKULL_DIE3 + {SPR_SKUL,32776,6,{A_Fall},S_SKULL_DIE5,0,0}, // S_SKULL_DIE4 + {SPR_SKUL,9,6,{NULL},S_SKULL_DIE6,0,0}, // S_SKULL_DIE5 + {SPR_SKUL,10,6,{NULL},S_NULL,0,0}, // S_SKULL_DIE6 + {SPR_SPID,0,10,{A_Look},S_SPID_STND2,0,0}, // S_SPID_STND + {SPR_SPID,1,10,{A_Look},S_SPID_STND,0,0}, // S_SPID_STND2 + {SPR_SPID,0,3,{A_Metal},S_SPID_RUN2,0,0}, // S_SPID_RUN1 + {SPR_SPID,0,3,{A_Chase},S_SPID_RUN3,0,0}, // S_SPID_RUN2 + {SPR_SPID,1,3,{A_Chase},S_SPID_RUN4,0,0}, // S_SPID_RUN3 + {SPR_SPID,1,3,{A_Chase},S_SPID_RUN5,0,0}, // S_SPID_RUN4 + {SPR_SPID,2,3,{A_Metal},S_SPID_RUN6,0,0}, // S_SPID_RUN5 + {SPR_SPID,2,3,{A_Chase},S_SPID_RUN7,0,0}, // S_SPID_RUN6 + {SPR_SPID,3,3,{A_Chase},S_SPID_RUN8,0,0}, // S_SPID_RUN7 + {SPR_SPID,3,3,{A_Chase},S_SPID_RUN9,0,0}, // S_SPID_RUN8 + {SPR_SPID,4,3,{A_Metal},S_SPID_RUN10,0,0}, // S_SPID_RUN9 + {SPR_SPID,4,3,{A_Chase},S_SPID_RUN11,0,0}, // S_SPID_RUN10 + {SPR_SPID,5,3,{A_Chase},S_SPID_RUN12,0,0}, // S_SPID_RUN11 + {SPR_SPID,5,3,{A_Chase},S_SPID_RUN1,0,0}, // S_SPID_RUN12 + {SPR_SPID,32768,20,{A_FaceTarget},S_SPID_ATK2,0,0}, // S_SPID_ATK1 + {SPR_SPID,32774,4,{A_SPosAttack},S_SPID_ATK3,0,0}, // S_SPID_ATK2 + {SPR_SPID,32775,4,{A_SPosAttack},S_SPID_ATK4,0,0}, // S_SPID_ATK3 + {SPR_SPID,32775,1,{A_SpidRefire},S_SPID_ATK2,0,0}, // S_SPID_ATK4 + {SPR_SPID,8,3,{NULL},S_SPID_PAIN2,0,0}, // S_SPID_PAIN + {SPR_SPID,8,3,{A_Pain},S_SPID_RUN1,0,0}, // S_SPID_PAIN2 + {SPR_SPID,9,20,{A_Scream},S_SPID_DIE2,0,0}, // S_SPID_DIE1 + {SPR_SPID,10,10,{A_Fall},S_SPID_DIE3,0,0}, // S_SPID_DIE2 + {SPR_SPID,11,10,{NULL},S_SPID_DIE4,0,0}, // S_SPID_DIE3 + {SPR_SPID,12,10,{NULL},S_SPID_DIE5,0,0}, // S_SPID_DIE4 + {SPR_SPID,13,10,{NULL},S_SPID_DIE6,0,0}, // S_SPID_DIE5 + {SPR_SPID,14,10,{NULL},S_SPID_DIE7,0,0}, // S_SPID_DIE6 + {SPR_SPID,15,10,{NULL},S_SPID_DIE8,0,0}, // S_SPID_DIE7 + {SPR_SPID,16,10,{NULL},S_SPID_DIE9,0,0}, // S_SPID_DIE8 + {SPR_SPID,17,10,{NULL},S_SPID_DIE10,0,0}, // S_SPID_DIE9 + {SPR_SPID,18,30,{NULL},S_SPID_DIE11,0,0}, // S_SPID_DIE10 + {SPR_SPID,18,-1,{A_BossDeath},S_NULL,0,0}, // S_SPID_DIE11 + {SPR_BSPI,0,10,{A_Look},S_BSPI_STND2,0,0}, // S_BSPI_STND + {SPR_BSPI,1,10,{A_Look},S_BSPI_STND,0,0}, // S_BSPI_STND2 + {SPR_BSPI,0,20,{NULL},S_BSPI_RUN1,0,0}, // S_BSPI_SIGHT + {SPR_BSPI,0,3,{A_BabyMetal},S_BSPI_RUN2,0,0}, // S_BSPI_RUN1 + {SPR_BSPI,0,3,{A_Chase},S_BSPI_RUN3,0,0}, // S_BSPI_RUN2 + {SPR_BSPI,1,3,{A_Chase},S_BSPI_RUN4,0,0}, // S_BSPI_RUN3 + {SPR_BSPI,1,3,{A_Chase},S_BSPI_RUN5,0,0}, // S_BSPI_RUN4 + {SPR_BSPI,2,3,{A_Chase},S_BSPI_RUN6,0,0}, // S_BSPI_RUN5 + {SPR_BSPI,2,3,{A_Chase},S_BSPI_RUN7,0,0}, // S_BSPI_RUN6 + {SPR_BSPI,3,3,{A_BabyMetal},S_BSPI_RUN8,0,0}, // S_BSPI_RUN7 + {SPR_BSPI,3,3,{A_Chase},S_BSPI_RUN9,0,0}, // S_BSPI_RUN8 + {SPR_BSPI,4,3,{A_Chase},S_BSPI_RUN10,0,0}, // S_BSPI_RUN9 + {SPR_BSPI,4,3,{A_Chase},S_BSPI_RUN11,0,0}, // S_BSPI_RUN10 + {SPR_BSPI,5,3,{A_Chase},S_BSPI_RUN12,0,0}, // S_BSPI_RUN11 + {SPR_BSPI,5,3,{A_Chase},S_BSPI_RUN1,0,0}, // S_BSPI_RUN12 + {SPR_BSPI,32768,20,{A_FaceTarget},S_BSPI_ATK2,0,0}, // S_BSPI_ATK1 + {SPR_BSPI,32774,4,{A_BspiAttack},S_BSPI_ATK3,0,0}, // S_BSPI_ATK2 + {SPR_BSPI,32775,4,{NULL},S_BSPI_ATK4,0,0}, // S_BSPI_ATK3 + {SPR_BSPI,32775,1,{A_SpidRefire},S_BSPI_ATK2,0,0}, // S_BSPI_ATK4 + {SPR_BSPI,8,3,{NULL},S_BSPI_PAIN2,0,0}, // S_BSPI_PAIN + {SPR_BSPI,8,3,{A_Pain},S_BSPI_RUN1,0,0}, // S_BSPI_PAIN2 + {SPR_BSPI,9,20,{A_Scream},S_BSPI_DIE2,0,0}, // S_BSPI_DIE1 + {SPR_BSPI,10,7,{A_Fall},S_BSPI_DIE3,0,0}, // S_BSPI_DIE2 + {SPR_BSPI,11,7,{NULL},S_BSPI_DIE4,0,0}, // S_BSPI_DIE3 + {SPR_BSPI,12,7,{NULL},S_BSPI_DIE5,0,0}, // S_BSPI_DIE4 + {SPR_BSPI,13,7,{NULL},S_BSPI_DIE6,0,0}, // S_BSPI_DIE5 + {SPR_BSPI,14,7,{NULL},S_BSPI_DIE7,0,0}, // S_BSPI_DIE6 + {SPR_BSPI,15,-1,{A_BossDeath},S_NULL,0,0}, // S_BSPI_DIE7 + {SPR_BSPI,15,5,{NULL},S_BSPI_RAISE2,0,0}, // S_BSPI_RAISE1 + {SPR_BSPI,14,5,{NULL},S_BSPI_RAISE3,0,0}, // S_BSPI_RAISE2 + {SPR_BSPI,13,5,{NULL},S_BSPI_RAISE4,0,0}, // S_BSPI_RAISE3 + {SPR_BSPI,12,5,{NULL},S_BSPI_RAISE5,0,0}, // S_BSPI_RAISE4 + {SPR_BSPI,11,5,{NULL},S_BSPI_RAISE6,0,0}, // S_BSPI_RAISE5 + {SPR_BSPI,10,5,{NULL},S_BSPI_RAISE7,0,0}, // S_BSPI_RAISE6 + {SPR_BSPI,9,5,{NULL},S_BSPI_RUN1,0,0}, // S_BSPI_RAISE7 + {SPR_APLS,32768,5,{NULL},S_ARACH_PLAZ2,0,0}, // S_ARACH_PLAZ + {SPR_APLS,32769,5,{NULL},S_ARACH_PLAZ,0,0}, // S_ARACH_PLAZ2 + {SPR_APBX,32768,5,{NULL},S_ARACH_PLEX2,0,0}, // S_ARACH_PLEX + {SPR_APBX,32769,5,{NULL},S_ARACH_PLEX3,0,0}, // S_ARACH_PLEX2 + {SPR_APBX,32770,5,{NULL},S_ARACH_PLEX4,0,0}, // S_ARACH_PLEX3 + {SPR_APBX,32771,5,{NULL},S_ARACH_PLEX5,0,0}, // S_ARACH_PLEX4 + {SPR_APBX,32772,5,{NULL},S_NULL,0,0}, // S_ARACH_PLEX5 + {SPR_CYBR,0,10,{A_Look},S_CYBER_STND2,0,0}, // S_CYBER_STND + {SPR_CYBR,1,10,{A_Look},S_CYBER_STND,0,0}, // S_CYBER_STND2 + {SPR_CYBR,0,3,{A_Hoof},S_CYBER_RUN2,0,0}, // S_CYBER_RUN1 + {SPR_CYBR,0,3,{A_Chase},S_CYBER_RUN3,0,0}, // S_CYBER_RUN2 + {SPR_CYBR,1,3,{A_Chase},S_CYBER_RUN4,0,0}, // S_CYBER_RUN3 + {SPR_CYBR,1,3,{A_Chase},S_CYBER_RUN5,0,0}, // S_CYBER_RUN4 + {SPR_CYBR,2,3,{A_Chase},S_CYBER_RUN6,0,0}, // S_CYBER_RUN5 + {SPR_CYBR,2,3,{A_Chase},S_CYBER_RUN7,0,0}, // S_CYBER_RUN6 + {SPR_CYBR,3,3,{A_Metal},S_CYBER_RUN8,0,0}, // S_CYBER_RUN7 + {SPR_CYBR,3,3,{A_Chase},S_CYBER_RUN1,0,0}, // S_CYBER_RUN8 + {SPR_CYBR,4,6,{A_FaceTarget},S_CYBER_ATK2,0,0}, // S_CYBER_ATK1 + {SPR_CYBR,5,12,{A_CyberAttack},S_CYBER_ATK3,0,0}, // S_CYBER_ATK2 + {SPR_CYBR,4,12,{A_FaceTarget},S_CYBER_ATK4,0,0}, // S_CYBER_ATK3 + {SPR_CYBR,5,12,{A_CyberAttack},S_CYBER_ATK5,0,0}, // S_CYBER_ATK4 + {SPR_CYBR,4,12,{A_FaceTarget},S_CYBER_ATK6,0,0}, // S_CYBER_ATK5 + {SPR_CYBR,5,12,{A_CyberAttack},S_CYBER_RUN1,0,0}, // S_CYBER_ATK6 + {SPR_CYBR,6,10,{A_Pain},S_CYBER_RUN1,0,0}, // S_CYBER_PAIN + {SPR_CYBR,7,10,{NULL},S_CYBER_DIE2,0,0}, // S_CYBER_DIE1 + {SPR_CYBR,8,10,{A_Scream},S_CYBER_DIE3,0,0}, // S_CYBER_DIE2 + {SPR_CYBR,9,10,{NULL},S_CYBER_DIE4,0,0}, // S_CYBER_DIE3 + {SPR_CYBR,10,10,{NULL},S_CYBER_DIE5,0,0}, // S_CYBER_DIE4 + {SPR_CYBR,11,10,{NULL},S_CYBER_DIE6,0,0}, // S_CYBER_DIE5 + {SPR_CYBR,12,10,{A_Fall},S_CYBER_DIE7,0,0}, // S_CYBER_DIE6 + {SPR_CYBR,13,10,{NULL},S_CYBER_DIE8,0,0}, // S_CYBER_DIE7 + {SPR_CYBR,14,10,{NULL},S_CYBER_DIE9,0,0}, // S_CYBER_DIE8 + {SPR_CYBR,15,30,{NULL},S_CYBER_DIE10,0,0}, // S_CYBER_DIE9 + {SPR_CYBR,15,-1,{A_BossDeath},S_NULL,0,0}, // S_CYBER_DIE10 + {SPR_PAIN,0,10,{A_Look},S_PAIN_STND,0,0}, // S_PAIN_STND + {SPR_PAIN,0,3,{A_Chase},S_PAIN_RUN2,0,0}, // S_PAIN_RUN1 + {SPR_PAIN,0,3,{A_Chase},S_PAIN_RUN3,0,0}, // S_PAIN_RUN2 + {SPR_PAIN,1,3,{A_Chase},S_PAIN_RUN4,0,0}, // S_PAIN_RUN3 + {SPR_PAIN,1,3,{A_Chase},S_PAIN_RUN5,0,0}, // S_PAIN_RUN4 + {SPR_PAIN,2,3,{A_Chase},S_PAIN_RUN6,0,0}, // S_PAIN_RUN5 + {SPR_PAIN,2,3,{A_Chase},S_PAIN_RUN1,0,0}, // S_PAIN_RUN6 + {SPR_PAIN,3,5,{A_FaceTarget},S_PAIN_ATK2,0,0}, // S_PAIN_ATK1 + {SPR_PAIN,4,5,{A_FaceTarget},S_PAIN_ATK3,0,0}, // S_PAIN_ATK2 + {SPR_PAIN,32773,5,{A_FaceTarget},S_PAIN_ATK4,0,0}, // S_PAIN_ATK3 + {SPR_PAIN,32773,0,{A_PainAttack},S_PAIN_RUN1,0,0}, // S_PAIN_ATK4 + {SPR_PAIN,6,6,{NULL},S_PAIN_PAIN2,0,0}, // S_PAIN_PAIN + {SPR_PAIN,6,6,{A_Pain},S_PAIN_RUN1,0,0}, // S_PAIN_PAIN2 + {SPR_PAIN,32775,8,{NULL},S_PAIN_DIE2,0,0}, // S_PAIN_DIE1 + {SPR_PAIN,32776,8,{A_Scream},S_PAIN_DIE3,0,0}, // S_PAIN_DIE2 + {SPR_PAIN,32777,8,{NULL},S_PAIN_DIE4,0,0}, // S_PAIN_DIE3 + {SPR_PAIN,32778,8,{NULL},S_PAIN_DIE5,0,0}, // S_PAIN_DIE4 + {SPR_PAIN,32779,8,{A_PainDie},S_PAIN_DIE6,0,0}, // S_PAIN_DIE5 + {SPR_PAIN,32780,8,{NULL},S_NULL,0,0}, // S_PAIN_DIE6 + {SPR_PAIN,12,8,{NULL},S_PAIN_RAISE2,0,0}, // S_PAIN_RAISE1 + {SPR_PAIN,11,8,{NULL},S_PAIN_RAISE3,0,0}, // S_PAIN_RAISE2 + {SPR_PAIN,10,8,{NULL},S_PAIN_RAISE4,0,0}, // S_PAIN_RAISE3 + {SPR_PAIN,9,8,{NULL},S_PAIN_RAISE5,0,0}, // S_PAIN_RAISE4 + {SPR_PAIN,8,8,{NULL},S_PAIN_RAISE6,0,0}, // S_PAIN_RAISE5 + {SPR_PAIN,7,8,{NULL},S_PAIN_RUN1,0,0}, // S_PAIN_RAISE6 + {SPR_SSWV,0,10,{A_Look},S_SSWV_STND2,0,0}, // S_SSWV_STND + {SPR_SSWV,1,10,{A_Look},S_SSWV_STND,0,0}, // S_SSWV_STND2 + {SPR_SSWV,0,3,{A_Chase},S_SSWV_RUN2,0,0}, // S_SSWV_RUN1 + {SPR_SSWV,0,3,{A_Chase},S_SSWV_RUN3,0,0}, // S_SSWV_RUN2 + {SPR_SSWV,1,3,{A_Chase},S_SSWV_RUN4,0,0}, // S_SSWV_RUN3 + {SPR_SSWV,1,3,{A_Chase},S_SSWV_RUN5,0,0}, // S_SSWV_RUN4 + {SPR_SSWV,2,3,{A_Chase},S_SSWV_RUN6,0,0}, // S_SSWV_RUN5 + {SPR_SSWV,2,3,{A_Chase},S_SSWV_RUN7,0,0}, // S_SSWV_RUN6 + {SPR_SSWV,3,3,{A_Chase},S_SSWV_RUN8,0,0}, // S_SSWV_RUN7 + {SPR_SSWV,3,3,{A_Chase},S_SSWV_RUN1,0,0}, // S_SSWV_RUN8 + {SPR_SSWV,4,10,{A_FaceTarget},S_SSWV_ATK2,0,0}, // S_SSWV_ATK1 + {SPR_SSWV,5,10,{A_FaceTarget},S_SSWV_ATK3,0,0}, // S_SSWV_ATK2 + {SPR_SSWV,32774,4,{A_CPosAttack},S_SSWV_ATK4,0,0}, // S_SSWV_ATK3 + {SPR_SSWV,5,6,{A_FaceTarget},S_SSWV_ATK5,0,0}, // S_SSWV_ATK4 + {SPR_SSWV,32774,4,{A_CPosAttack},S_SSWV_ATK6,0,0}, // S_SSWV_ATK5 + {SPR_SSWV,5,1,{A_CPosRefire},S_SSWV_ATK2,0,0}, // S_SSWV_ATK6 + {SPR_SSWV,7,3,{NULL},S_SSWV_PAIN2,0,0}, // S_SSWV_PAIN + {SPR_SSWV,7,3,{A_Pain},S_SSWV_RUN1,0,0}, // S_SSWV_PAIN2 + {SPR_SSWV,8,5,{NULL},S_SSWV_DIE2,0,0}, // S_SSWV_DIE1 + {SPR_SSWV,9,5,{A_Scream},S_SSWV_DIE3,0,0}, // S_SSWV_DIE2 + {SPR_SSWV,10,5,{A_Fall},S_SSWV_DIE4,0,0}, // S_SSWV_DIE3 + {SPR_SSWV,11,5,{NULL},S_SSWV_DIE5,0,0}, // S_SSWV_DIE4 + {SPR_SSWV,12,-1,{NULL},S_NULL,0,0}, // S_SSWV_DIE5 + {SPR_SSWV,13,5,{NULL},S_SSWV_XDIE2,0,0}, // S_SSWV_XDIE1 + {SPR_SSWV,14,5,{A_XScream},S_SSWV_XDIE3,0,0}, // S_SSWV_XDIE2 + {SPR_SSWV,15,5,{A_Fall},S_SSWV_XDIE4,0,0}, // S_SSWV_XDIE3 + {SPR_SSWV,16,5,{NULL},S_SSWV_XDIE5,0,0}, // S_SSWV_XDIE4 + {SPR_SSWV,17,5,{NULL},S_SSWV_XDIE6,0,0}, // S_SSWV_XDIE5 + {SPR_SSWV,18,5,{NULL},S_SSWV_XDIE7,0,0}, // S_SSWV_XDIE6 + {SPR_SSWV,19,5,{NULL},S_SSWV_XDIE8,0,0}, // S_SSWV_XDIE7 + {SPR_SSWV,20,5,{NULL},S_SSWV_XDIE9,0,0}, // S_SSWV_XDIE8 + {SPR_SSWV,21,-1,{NULL},S_NULL,0,0}, // S_SSWV_XDIE9 + {SPR_SSWV,12,5,{NULL},S_SSWV_RAISE2,0,0}, // S_SSWV_RAISE1 + {SPR_SSWV,11,5,{NULL},S_SSWV_RAISE3,0,0}, // S_SSWV_RAISE2 + {SPR_SSWV,10,5,{NULL},S_SSWV_RAISE4,0,0}, // S_SSWV_RAISE3 + {SPR_SSWV,9,5,{NULL},S_SSWV_RAISE5,0,0}, // S_SSWV_RAISE4 + {SPR_SSWV,8,5,{NULL},S_SSWV_RUN1,0,0}, // S_SSWV_RAISE5 + {SPR_KEEN,0,-1,{NULL},S_KEENSTND,0,0}, // S_KEENSTND + {SPR_KEEN,0,6,{NULL},S_COMMKEEN2,0,0}, // S_COMMKEEN + {SPR_KEEN,1,6,{NULL},S_COMMKEEN3,0,0}, // S_COMMKEEN2 + {SPR_KEEN,2,6,{A_Scream},S_COMMKEEN4,0,0}, // S_COMMKEEN3 + {SPR_KEEN,3,6,{NULL},S_COMMKEEN5,0,0}, // S_COMMKEEN4 + {SPR_KEEN,4,6,{NULL},S_COMMKEEN6,0,0}, // S_COMMKEEN5 + {SPR_KEEN,5,6,{NULL},S_COMMKEEN7,0,0}, // S_COMMKEEN6 + {SPR_KEEN,6,6,{NULL},S_COMMKEEN8,0,0}, // S_COMMKEEN7 + {SPR_KEEN,7,6,{NULL},S_COMMKEEN9,0,0}, // S_COMMKEEN8 + {SPR_KEEN,8,6,{NULL},S_COMMKEEN10,0,0}, // S_COMMKEEN9 + {SPR_KEEN,9,6,{NULL},S_COMMKEEN11,0,0}, // S_COMMKEEN10 + {SPR_KEEN,10,6,{A_KeenDie},S_COMMKEEN12,0,0},// S_COMMKEEN11 + {SPR_KEEN,11,-1,{NULL},S_NULL,0,0}, // S_COMMKEEN12 + {SPR_KEEN,12,4,{NULL},S_KEENPAIN2,0,0}, // S_KEENPAIN + {SPR_KEEN,12,8,{A_Pain},S_KEENSTND,0,0}, // S_KEENPAIN2 + {SPR_BBRN,0,-1,{NULL},S_NULL,0,0}, // S_BRAIN + {SPR_BBRN,1,36,{A_BrainPain},S_BRAIN,0,0}, // S_BRAIN_PAIN + {SPR_BBRN,0,100,{A_BrainScream},S_BRAIN_DIE2,0,0}, // S_BRAIN_DIE1 + {SPR_BBRN,0,10,{NULL},S_BRAIN_DIE3,0,0}, // S_BRAIN_DIE2 + {SPR_BBRN,0,10,{NULL},S_BRAIN_DIE4,0,0}, // S_BRAIN_DIE3 + {SPR_BBRN,0,-1,{A_BrainDie},S_NULL,0,0}, // S_BRAIN_DIE4 + {SPR_SSWV,0,10,{A_Look},S_BRAINEYE,0,0}, // S_BRAINEYE + {SPR_SSWV,0,181,{A_BrainAwake},S_BRAINEYE1,0,0}, // S_BRAINEYESEE + {SPR_SSWV,0,150,{A_BrainSpit},S_BRAINEYE1,0,0}, // S_BRAINEYE1 + {SPR_BOSF,32768,3,{A_SpawnSound},S_SPAWN2,0,0}, // S_SPAWN1 + {SPR_BOSF,32769,3,{A_SpawnFly},S_SPAWN3,0,0}, // S_SPAWN2 + {SPR_BOSF,32770,3,{A_SpawnFly},S_SPAWN4,0,0}, // S_SPAWN3 + {SPR_BOSF,32771,3,{A_SpawnFly},S_SPAWN1,0,0}, // S_SPAWN4 + {SPR_FIRE,32768,4,{A_Fire},S_SPAWNFIRE2,0,0}, // S_SPAWNFIRE1 + {SPR_FIRE,32769,4,{A_Fire},S_SPAWNFIRE3,0,0}, // S_SPAWNFIRE2 + {SPR_FIRE,32770,4,{A_Fire},S_SPAWNFIRE4,0,0}, // S_SPAWNFIRE3 + {SPR_FIRE,32771,4,{A_Fire},S_SPAWNFIRE5,0,0}, // S_SPAWNFIRE4 + {SPR_FIRE,32772,4,{A_Fire},S_SPAWNFIRE6,0,0}, // S_SPAWNFIRE5 + {SPR_FIRE,32773,4,{A_Fire},S_SPAWNFIRE7,0,0}, // S_SPAWNFIRE6 + {SPR_FIRE,32774,4,{A_Fire},S_SPAWNFIRE8,0,0}, // S_SPAWNFIRE7 + {SPR_FIRE,32775,4,{A_Fire},S_NULL,0,0}, // S_SPAWNFIRE8 + {SPR_MISL,32769,10,{NULL},S_BRAINEXPLODE2,0,0}, // S_BRAINEXPLODE1 + {SPR_MISL,32770,10,{NULL},S_BRAINEXPLODE3,0,0}, // S_BRAINEXPLODE2 + {SPR_MISL,32771,10,{A_BrainExplode},S_NULL,0,0}, // S_BRAINEXPLODE3 + {SPR_ARM1,0,6,{NULL},S_ARM1A,0,0}, // S_ARM1 + {SPR_ARM1,32769,7,{NULL},S_ARM1,0,0}, // S_ARM1A + {SPR_ARM2,0,6,{NULL},S_ARM2A,0,0}, // S_ARM2 + {SPR_ARM2,32769,6,{NULL},S_ARM2,0,0}, // S_ARM2A + {SPR_BAR1,0,6,{NULL},S_BAR2,0,0}, // S_BAR1 + {SPR_BAR1,1,6,{NULL},S_BAR1,0,0}, // S_BAR2 + {SPR_BEXP,32768,5,{NULL},S_BEXP2,0,0}, // S_BEXP + {SPR_BEXP,32769,5,{A_Scream},S_BEXP3,0,0}, // S_BEXP2 + {SPR_BEXP,32770,5,{NULL},S_BEXP4,0,0}, // S_BEXP3 + {SPR_BEXP,32771,10,{A_Explode},S_BEXP5,0,0}, // S_BEXP4 + {SPR_BEXP,32772,10,{NULL},S_NULL,0,0}, // S_BEXP5 + {SPR_FCAN,32768,4,{NULL},S_BBAR2,0,0}, // S_BBAR1 + {SPR_FCAN,32769,4,{NULL},S_BBAR3,0,0}, // S_BBAR2 + {SPR_FCAN,32770,4,{NULL},S_BBAR1,0,0}, // S_BBAR3 + {SPR_BON1,0,6,{NULL},S_BON1A,0,0}, // S_BON1 + {SPR_BON1,1,6,{NULL},S_BON1B,0,0}, // S_BON1A + {SPR_BON1,2,6,{NULL},S_BON1C,0,0}, // S_BON1B + {SPR_BON1,3,6,{NULL},S_BON1D,0,0}, // S_BON1C + {SPR_BON1,2,6,{NULL},S_BON1E,0,0}, // S_BON1D + {SPR_BON1,1,6,{NULL},S_BON1,0,0}, // S_BON1E + {SPR_BON2,0,6,{NULL},S_BON2A,0,0}, // S_BON2 + {SPR_BON2,1,6,{NULL},S_BON2B,0,0}, // S_BON2A + {SPR_BON2,2,6,{NULL},S_BON2C,0,0}, // S_BON2B + {SPR_BON2,3,6,{NULL},S_BON2D,0,0}, // S_BON2C + {SPR_BON2,2,6,{NULL},S_BON2E,0,0}, // S_BON2D + {SPR_BON2,1,6,{NULL},S_BON2,0,0}, // S_BON2E + {SPR_BKEY,0,10,{NULL},S_BKEY2,0,0}, // S_BKEY + {SPR_BKEY,32769,10,{NULL},S_BKEY,0,0}, // S_BKEY2 + {SPR_RKEY,0,10,{NULL},S_RKEY2,0,0}, // S_RKEY + {SPR_RKEY,32769,10,{NULL},S_RKEY,0,0}, // S_RKEY2 + {SPR_YKEY,0,10,{NULL},S_YKEY2,0,0}, // S_YKEY + {SPR_YKEY,32769,10,{NULL},S_YKEY,0,0}, // S_YKEY2 + {SPR_BSKU,0,10,{NULL},S_BSKULL2,0,0}, // S_BSKULL + {SPR_BSKU,32769,10,{NULL},S_BSKULL,0,0}, // S_BSKULL2 + {SPR_RSKU,0,10,{NULL},S_RSKULL2,0,0}, // S_RSKULL + {SPR_RSKU,32769,10,{NULL},S_RSKULL,0,0}, // S_RSKULL2 + {SPR_YSKU,0,10,{NULL},S_YSKULL2,0,0}, // S_YSKULL + {SPR_YSKU,32769,10,{NULL},S_YSKULL,0,0}, // S_YSKULL2 + {SPR_STIM,0,-1,{NULL},S_NULL,0,0}, // S_STIM + {SPR_MEDI,0,-1,{NULL},S_NULL,0,0}, // S_MEDI + {SPR_SOUL,32768,6,{NULL},S_SOUL2,0,0}, // S_SOUL + {SPR_SOUL,32769,6,{NULL},S_SOUL3,0,0}, // S_SOUL2 + {SPR_SOUL,32770,6,{NULL},S_SOUL4,0,0}, // S_SOUL3 + {SPR_SOUL,32771,6,{NULL},S_SOUL5,0,0}, // S_SOUL4 + {SPR_SOUL,32770,6,{NULL},S_SOUL6,0,0}, // S_SOUL5 + {SPR_SOUL,32769,6,{NULL},S_SOUL,0,0}, // S_SOUL6 + {SPR_PINV,32768,6,{NULL},S_PINV2,0,0}, // S_PINV + {SPR_PINV,32769,6,{NULL},S_PINV3,0,0}, // S_PINV2 + {SPR_PINV,32770,6,{NULL},S_PINV4,0,0}, // S_PINV3 + {SPR_PINV,32771,6,{NULL},S_PINV,0,0}, // S_PINV4 + {SPR_PSTR,32768,-1,{NULL},S_NULL,0,0}, // S_PSTR + {SPR_PINS,32768,6,{NULL},S_PINS2,0,0}, // S_PINS + {SPR_PINS,32769,6,{NULL},S_PINS3,0,0}, // S_PINS2 + {SPR_PINS,32770,6,{NULL},S_PINS4,0,0}, // S_PINS3 + {SPR_PINS,32771,6,{NULL},S_PINS,0,0}, // S_PINS4 + {SPR_MEGA,32768,6,{NULL},S_MEGA2,0,0}, // S_MEGA + {SPR_MEGA,32769,6,{NULL},S_MEGA3,0,0}, // S_MEGA2 + {SPR_MEGA,32770,6,{NULL},S_MEGA4,0,0}, // S_MEGA3 + {SPR_MEGA,32771,6,{NULL},S_MEGA,0,0}, // S_MEGA4 + {SPR_SUIT,32768,-1,{NULL},S_NULL,0,0}, // S_SUIT + {SPR_PMAP,32768,6,{NULL},S_PMAP2,0,0}, // S_PMAP + {SPR_PMAP,32769,6,{NULL},S_PMAP3,0,0}, // S_PMAP2 + {SPR_PMAP,32770,6,{NULL},S_PMAP4,0,0}, // S_PMAP3 + {SPR_PMAP,32771,6,{NULL},S_PMAP5,0,0}, // S_PMAP4 + {SPR_PMAP,32770,6,{NULL},S_PMAP6,0,0}, // S_PMAP5 + {SPR_PMAP,32769,6,{NULL},S_PMAP,0,0}, // S_PMAP6 + {SPR_PVIS,32768,6,{NULL},S_PVIS2,0,0}, // S_PVIS + {SPR_PVIS,1,6,{NULL},S_PVIS,0,0}, // S_PVIS2 + {SPR_CLIP,0,-1,{NULL},S_NULL,0,0}, // S_CLIP + {SPR_AMMO,0,-1,{NULL},S_NULL,0,0}, // S_AMMO + {SPR_ROCK,0,-1,{NULL},S_NULL,0,0}, // S_ROCK + {SPR_BROK,0,-1,{NULL},S_NULL,0,0}, // S_BROK + {SPR_CELL,0,-1,{NULL},S_NULL,0,0}, // S_CELL + {SPR_CELP,0,-1,{NULL},S_NULL,0,0}, // S_CELP + {SPR_SHEL,0,-1,{NULL},S_NULL,0,0}, // S_SHEL + {SPR_SBOX,0,-1,{NULL},S_NULL,0,0}, // S_SBOX + {SPR_BPAK,0,-1,{NULL},S_NULL,0,0}, // S_BPAK + {SPR_BFUG,0,-1,{NULL},S_NULL,0,0}, // S_BFUG + {SPR_MGUN,0,-1,{NULL},S_NULL,0,0}, // S_MGUN + {SPR_CSAW,0,-1,{NULL},S_NULL,0,0}, // S_CSAW + {SPR_LAUN,0,-1,{NULL},S_NULL,0,0}, // S_LAUN + {SPR_PLAS,0,-1,{NULL},S_NULL,0,0}, // S_PLAS + {SPR_SHOT,0,-1,{NULL},S_NULL,0,0}, // S_SHOT + {SPR_SGN2,0,-1,{NULL},S_NULL,0,0}, // S_SHOT2 + {SPR_COLU,32768,-1,{NULL},S_NULL,0,0}, // S_COLU + {SPR_SMT2,0,-1,{NULL},S_NULL,0,0}, // S_STALAG + {SPR_GOR1,0,10,{NULL},S_BLOODYTWITCH2,0,0}, // S_BLOODYTWITCH + {SPR_GOR1,1,15,{NULL},S_BLOODYTWITCH3,0,0}, // S_BLOODYTWITCH2 + {SPR_GOR1,2,8,{NULL},S_BLOODYTWITCH4,0,0}, // S_BLOODYTWITCH3 + {SPR_GOR1,1,6,{NULL},S_BLOODYTWITCH,0,0}, // S_BLOODYTWITCH4 + {SPR_PLAY,13,-1,{NULL},S_NULL,0,0}, // S_DEADTORSO + {SPR_PLAY,18,-1,{NULL},S_NULL,0,0}, // S_DEADBOTTOM + {SPR_POL2,0,-1,{NULL},S_NULL,0,0}, // S_HEADSONSTICK + {SPR_POL5,0,-1,{NULL},S_NULL,0,0}, // S_GIBS + {SPR_POL4,0,-1,{NULL},S_NULL,0,0}, // S_HEADONASTICK + {SPR_POL3,32768,6,{NULL},S_HEADCANDLES2,0,0}, // S_HEADCANDLES + {SPR_POL3,32769,6,{NULL},S_HEADCANDLES,0,0}, // S_HEADCANDLES2 + {SPR_POL1,0,-1,{NULL},S_NULL,0,0}, // S_DEADSTICK + {SPR_POL6,0,6,{NULL},S_LIVESTICK2,0,0}, // S_LIVESTICK + {SPR_POL6,1,8,{NULL},S_LIVESTICK,0,0}, // S_LIVESTICK2 + {SPR_GOR2,0,-1,{NULL},S_NULL,0,0}, // S_MEAT2 + {SPR_GOR3,0,-1,{NULL},S_NULL,0,0}, // S_MEAT3 + {SPR_GOR4,0,-1,{NULL},S_NULL,0,0}, // S_MEAT4 + {SPR_GOR5,0,-1,{NULL},S_NULL,0,0}, // S_MEAT5 + {SPR_SMIT,0,-1,{NULL},S_NULL,0,0}, // S_STALAGTITE + {SPR_COL1,0,-1,{NULL},S_NULL,0,0}, // S_TALLGRNCOL + {SPR_COL2,0,-1,{NULL},S_NULL,0,0}, // S_SHRTGRNCOL + {SPR_COL3,0,-1,{NULL},S_NULL,0,0}, // S_TALLREDCOL + {SPR_COL4,0,-1,{NULL},S_NULL,0,0}, // S_SHRTREDCOL + {SPR_CAND,32768,-1,{NULL},S_NULL,0,0}, // S_CANDLESTIK + {SPR_CBRA,32768,-1,{NULL},S_NULL,0,0}, // S_CANDELABRA + {SPR_COL6,0,-1,{NULL},S_NULL,0,0}, // S_SKULLCOL + {SPR_TRE1,0,-1,{NULL},S_NULL,0,0}, // S_TORCHTREE + {SPR_TRE2,0,-1,{NULL},S_NULL,0,0}, // S_BIGTREE + {SPR_ELEC,0,-1,{NULL},S_NULL,0,0}, // S_TECHPILLAR + {SPR_CEYE,32768,6,{NULL},S_EVILEYE2,0,0}, // S_EVILEYE + {SPR_CEYE,32769,6,{NULL},S_EVILEYE3,0,0}, // S_EVILEYE2 + {SPR_CEYE,32770,6,{NULL},S_EVILEYE4,0,0}, // S_EVILEYE3 + {SPR_CEYE,32769,6,{NULL},S_EVILEYE,0,0}, // S_EVILEYE4 + {SPR_FSKU,32768,6,{NULL},S_FLOATSKULL2,0,0}, // S_FLOATSKULL + {SPR_FSKU,32769,6,{NULL},S_FLOATSKULL3,0,0}, // S_FLOATSKULL2 + {SPR_FSKU,32770,6,{NULL},S_FLOATSKULL,0,0}, // S_FLOATSKULL3 + {SPR_COL5,0,14,{NULL},S_HEARTCOL2,0,0}, // S_HEARTCOL + {SPR_COL5,1,14,{NULL},S_HEARTCOL,0,0}, // S_HEARTCOL2 + {SPR_TBLU,32768,4,{NULL},S_BLUETORCH2,0,0}, // S_BLUETORCH + {SPR_TBLU,32769,4,{NULL},S_BLUETORCH3,0,0}, // S_BLUETORCH2 + {SPR_TBLU,32770,4,{NULL},S_BLUETORCH4,0,0}, // S_BLUETORCH3 + {SPR_TBLU,32771,4,{NULL},S_BLUETORCH,0,0}, // S_BLUETORCH4 + {SPR_TGRN,32768,4,{NULL},S_GREENTORCH2,0,0}, // S_GREENTORCH + {SPR_TGRN,32769,4,{NULL},S_GREENTORCH3,0,0}, // S_GREENTORCH2 + {SPR_TGRN,32770,4,{NULL},S_GREENTORCH4,0,0}, // S_GREENTORCH3 + {SPR_TGRN,32771,4,{NULL},S_GREENTORCH,0,0}, // S_GREENTORCH4 + {SPR_TRED,32768,4,{NULL},S_REDTORCH2,0,0}, // S_REDTORCH + {SPR_TRED,32769,4,{NULL},S_REDTORCH3,0,0}, // S_REDTORCH2 + {SPR_TRED,32770,4,{NULL},S_REDTORCH4,0,0}, // S_REDTORCH3 + {SPR_TRED,32771,4,{NULL},S_REDTORCH,0,0}, // S_REDTORCH4 + {SPR_SMBT,32768,4,{NULL},S_BTORCHSHRT2,0,0}, // S_BTORCHSHRT + {SPR_SMBT,32769,4,{NULL},S_BTORCHSHRT3,0,0}, // S_BTORCHSHRT2 + {SPR_SMBT,32770,4,{NULL},S_BTORCHSHRT4,0,0}, // S_BTORCHSHRT3 + {SPR_SMBT,32771,4,{NULL},S_BTORCHSHRT,0,0}, // S_BTORCHSHRT4 + {SPR_SMGT,32768,4,{NULL},S_GTORCHSHRT2,0,0}, // S_GTORCHSHRT + {SPR_SMGT,32769,4,{NULL},S_GTORCHSHRT3,0,0}, // S_GTORCHSHRT2 + {SPR_SMGT,32770,4,{NULL},S_GTORCHSHRT4,0,0}, // S_GTORCHSHRT3 + {SPR_SMGT,32771,4,{NULL},S_GTORCHSHRT,0,0}, // S_GTORCHSHRT4 + {SPR_SMRT,32768,4,{NULL},S_RTORCHSHRT2,0,0}, // S_RTORCHSHRT + {SPR_SMRT,32769,4,{NULL},S_RTORCHSHRT3,0,0}, // S_RTORCHSHRT2 + {SPR_SMRT,32770,4,{NULL},S_RTORCHSHRT4,0,0}, // S_RTORCHSHRT3 + {SPR_SMRT,32771,4,{NULL},S_RTORCHSHRT,0,0}, // S_RTORCHSHRT4 + {SPR_HDB1,0,-1,{NULL},S_NULL,0,0}, // S_HANGNOGUTS + {SPR_HDB2,0,-1,{NULL},S_NULL,0,0}, // S_HANGBNOBRAIN + {SPR_HDB3,0,-1,{NULL},S_NULL,0,0}, // S_HANGTLOOKDN + {SPR_HDB4,0,-1,{NULL},S_NULL,0,0}, // S_HANGTSKULL + {SPR_HDB5,0,-1,{NULL},S_NULL,0,0}, // S_HANGTLOOKUP + {SPR_HDB6,0,-1,{NULL},S_NULL,0,0}, // S_HANGTNOBRAIN + {SPR_POB1,0,-1,{NULL},S_NULL,0,0}, // S_COLONGIBS + {SPR_POB2,0,-1,{NULL},S_NULL,0,0}, // S_SMALLPOOL + {SPR_BRS1,0,-1,{NULL},S_NULL,0,0}, // S_BRAINSTEM + {SPR_TLMP,32768,4,{NULL},S_TECHLAMP2,0,0}, // S_TECHLAMP + {SPR_TLMP,32769,4,{NULL},S_TECHLAMP3,0,0}, // S_TECHLAMP2 + {SPR_TLMP,32770,4,{NULL},S_TECHLAMP4,0,0}, // S_TECHLAMP3 + {SPR_TLMP,32771,4,{NULL},S_TECHLAMP,0,0}, // S_TECHLAMP4 + {SPR_TLP2,32768,4,{NULL},S_TECH2LAMP2,0,0}, // S_TECH2LAMP + {SPR_TLP2,32769,4,{NULL},S_TECH2LAMP3,0,0}, // S_TECH2LAMP2 + {SPR_TLP2,32770,4,{NULL},S_TECH2LAMP4,0,0}, // S_TECH2LAMP3 + {SPR_TLP2,32771,4,{NULL},S_TECH2LAMP,0,0} // S_TECH2LAMP4 +}; + + +mobjinfo_t mobjinfo[NUMMOBJTYPES] = { + + { // MT_PLAYER + -1, // doomednum + S_PLAY, // spawnstate + 100, // spawnhealth + S_PLAY_RUN1, // seestate + sfx_None, // seesound + 0, // reactiontime + sfx_None, // attacksound + S_PLAY_PAIN, // painstate + 255, // painchance + sfx_plpain, // painsound + S_NULL, // meleestate + S_PLAY_ATK1, // missilestate + S_PLAY_DIE1, // deathstate + S_PLAY_XDIE1, // xdeathstate + sfx_pldeth, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 56*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SHOOTABLE|MF_DROPOFF|MF_PICKUP|MF_NOTDMATCH, // flags + S_NULL // raisestate + }, + + { // MT_POSSESSED + 3004, // doomednum + S_POSS_STND, // spawnstate + 20, // spawnhealth + S_POSS_RUN1, // seestate + sfx_posit1, // seesound + 8, // reactiontime + sfx_pistol, // attacksound + S_POSS_PAIN, // painstate + 200, // painchance + sfx_popain, // painsound + 0, // meleestate + S_POSS_ATK1, // missilestate + S_POSS_DIE1, // deathstate + S_POSS_XDIE1, // xdeathstate + sfx_podth1, // deathsound + 8, // speed + 20*FRACUNIT, // radius + 56*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_posact, // activesound + MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags + S_POSS_RAISE1 // raisestate + }, + + { // MT_SHOTGUY + 9, // doomednum + S_SPOS_STND, // spawnstate + 30, // spawnhealth + S_SPOS_RUN1, // seestate + sfx_posit2, // seesound + 8, // reactiontime + 0, // attacksound + S_SPOS_PAIN, // painstate + 170, // painchance + sfx_popain, // painsound + 0, // meleestate + S_SPOS_ATK1, // missilestate + S_SPOS_DIE1, // deathstate + S_SPOS_XDIE1, // xdeathstate + sfx_podth2, // deathsound + 8, // speed + 20*FRACUNIT, // radius + 56*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_posact, // activesound + MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags + S_SPOS_RAISE1 // raisestate + }, + + { // MT_VILE + 64, // doomednum + S_VILE_STND, // spawnstate + 700, // spawnhealth + S_VILE_RUN1, // seestate + sfx_vilsit, // seesound + 8, // reactiontime + 0, // attacksound + S_VILE_PAIN, // painstate + 10, // painchance + sfx_vipain, // painsound + 0, // meleestate + S_VILE_ATK1, // missilestate + S_VILE_DIE1, // deathstate + S_NULL, // xdeathstate + sfx_vildth, // deathsound + 15, // speed + 20*FRACUNIT, // radius + 56*FRACUNIT, // height + 500, // mass + 0, // damage + sfx_vilact, // activesound + MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags + S_NULL // raisestate + }, + + { // MT_FIRE + -1, // doomednum + S_FIRE1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_UNDEAD + 66, // doomednum + S_SKEL_STND, // spawnstate + 300, // spawnhealth + S_SKEL_RUN1, // seestate + sfx_skesit, // seesound + 8, // reactiontime + 0, // attacksound + S_SKEL_PAIN, // painstate + 100, // painchance + sfx_popain, // painsound + S_SKEL_FIST1, // meleestate + S_SKEL_MISS1, // missilestate + S_SKEL_DIE1, // deathstate + S_NULL, // xdeathstate + sfx_skedth, // deathsound + 10, // speed + 20*FRACUNIT, // radius + 56*FRACUNIT, // height + 500, // mass + 0, // damage + sfx_skeact, // activesound + MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags + S_SKEL_RAISE1 // raisestate + }, + + { // MT_TRACER + -1, // doomednum + S_TRACER, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_skeatk, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_TRACEEXP1, // deathstate + S_NULL, // xdeathstate + sfx_barexp, // deathsound + 10*FRACUNIT, // speed + 11*FRACUNIT, // radius + 8*FRACUNIT, // height + 100, // mass + 10, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_SMOKE + -1, // doomednum + S_SMOKE1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_FATSO + 67, // doomednum + S_FATT_STND, // spawnstate + 600, // spawnhealth + S_FATT_RUN1, // seestate + sfx_mansit, // seesound + 8, // reactiontime + 0, // attacksound + S_FATT_PAIN, // painstate + 80, // painchance + sfx_mnpain, // painsound + 0, // meleestate + S_FATT_ATK1, // missilestate + S_FATT_DIE1, // deathstate + S_NULL, // xdeathstate + sfx_mandth, // deathsound + 8, // speed + 48*FRACUNIT, // radius + 64*FRACUNIT, // height + 1000, // mass + 0, // damage + sfx_posact, // activesound + MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags + S_FATT_RAISE1 // raisestate + }, + + { // MT_FATSHOT + -1, // doomednum + S_FATSHOT1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_firsht, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_FATSHOTX1, // deathstate + S_NULL, // xdeathstate + sfx_firxpl, // deathsound + 20*FRACUNIT, // speed + 6*FRACUNIT, // radius + 8*FRACUNIT, // height + 100, // mass + 8, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_CHAINGUY + 65, // doomednum + S_CPOS_STND, // spawnstate + 70, // spawnhealth + S_CPOS_RUN1, // seestate + sfx_posit2, // seesound + 8, // reactiontime + 0, // attacksound + S_CPOS_PAIN, // painstate + 170, // painchance + sfx_popain, // painsound + 0, // meleestate + S_CPOS_ATK1, // missilestate + S_CPOS_DIE1, // deathstate + S_CPOS_XDIE1, // xdeathstate + sfx_podth2, // deathsound + 8, // speed + 20*FRACUNIT, // radius + 56*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_posact, // activesound + MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags + S_CPOS_RAISE1 // raisestate + }, + + { // MT_TROOP + 3001, // doomednum + S_TROO_STND, // spawnstate + 60, // spawnhealth + S_TROO_RUN1, // seestate + sfx_bgsit1, // seesound + 8, // reactiontime + 0, // attacksound + S_TROO_PAIN, // painstate + 200, // painchance + sfx_popain, // painsound + S_TROO_ATK1, // meleestate + S_TROO_ATK1, // missilestate + S_TROO_DIE1, // deathstate + S_TROO_XDIE1, // xdeathstate + sfx_bgdth1, // deathsound + 8, // speed + 20*FRACUNIT, // radius + 56*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_bgact, // activesound + MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags + S_TROO_RAISE1 // raisestate + }, + + { // MT_SERGEANT + 3002, // doomednum + S_SARG_STND, // spawnstate + 150, // spawnhealth + S_SARG_RUN1, // seestate + sfx_sgtsit, // seesound + 8, // reactiontime + sfx_sgtatk, // attacksound + S_SARG_PAIN, // painstate + 180, // painchance + sfx_dmpain, // painsound + S_SARG_ATK1, // meleestate + 0, // missilestate + S_SARG_DIE1, // deathstate + S_NULL, // xdeathstate + sfx_sgtdth, // deathsound + 10, // speed + 30*FRACUNIT, // radius + 56*FRACUNIT, // height + 400, // mass + 0, // damage + sfx_dmact, // activesound + MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags + S_SARG_RAISE1 // raisestate + }, + + { // MT_SHADOWS + 58, // doomednum + S_SARG_STND, // spawnstate + 150, // spawnhealth + S_SARG_RUN1, // seestate + sfx_sgtsit, // seesound + 8, // reactiontime + sfx_sgtatk, // attacksound + S_SARG_PAIN, // painstate + 180, // painchance + sfx_dmpain, // painsound + S_SARG_ATK1, // meleestate + 0, // missilestate + S_SARG_DIE1, // deathstate + S_NULL, // xdeathstate + sfx_sgtdth, // deathsound + 10, // speed + 30*FRACUNIT, // radius + 56*FRACUNIT, // height + 400, // mass + 0, // damage + sfx_dmact, // activesound + MF_SOLID|MF_SHOOTABLE|MF_SHADOW|MF_COUNTKILL, // flags + S_SARG_RAISE1 // raisestate + }, + + { // MT_HEAD + 3005, // doomednum + S_HEAD_STND, // spawnstate + 400, // spawnhealth + S_HEAD_RUN1, // seestate + sfx_cacsit, // seesound + 8, // reactiontime + 0, // attacksound + S_HEAD_PAIN, // painstate + 128, // painchance + sfx_dmpain, // painsound + 0, // meleestate + S_HEAD_ATK1, // missilestate + S_HEAD_DIE1, // deathstate + S_NULL, // xdeathstate + sfx_cacdth, // deathsound + 8, // speed + 31*FRACUNIT, // radius + 56*FRACUNIT, // height + 400, // mass + 0, // damage + sfx_dmact, // activesound + MF_SOLID|MF_SHOOTABLE|MF_FLOAT|MF_NOGRAVITY|MF_COUNTKILL, // flags + S_HEAD_RAISE1 // raisestate + }, + + { // MT_BRUISER + 3003, // doomednum + S_BOSS_STND, // spawnstate + 1000, // spawnhealth + S_BOSS_RUN1, // seestate + sfx_brssit, // seesound + 8, // reactiontime + 0, // attacksound + S_BOSS_PAIN, // painstate + 50, // painchance + sfx_dmpain, // painsound + S_BOSS_ATK1, // meleestate + S_BOSS_ATK1, // missilestate + S_BOSS_DIE1, // deathstate + S_NULL, // xdeathstate + sfx_brsdth, // deathsound + 8, // speed + 24*FRACUNIT, // radius + 64*FRACUNIT, // height + 1000, // mass + 0, // damage + sfx_dmact, // activesound + MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags + S_BOSS_RAISE1 // raisestate + }, + + { // MT_BRUISERSHOT + -1, // doomednum + S_BRBALL1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_firsht, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_BRBALLX1, // deathstate + S_NULL, // xdeathstate + sfx_firxpl, // deathsound + 15*FRACUNIT, // speed + 6*FRACUNIT, // radius + 8*FRACUNIT, // height + 100, // mass + 8, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_KNIGHT + 69, // doomednum + S_BOS2_STND, // spawnstate + 500, // spawnhealth + S_BOS2_RUN1, // seestate + sfx_kntsit, // seesound + 8, // reactiontime + 0, // attacksound + S_BOS2_PAIN, // painstate + 50, // painchance + sfx_dmpain, // painsound + S_BOS2_ATK1, // meleestate + S_BOS2_ATK1, // missilestate + S_BOS2_DIE1, // deathstate + S_NULL, // xdeathstate + sfx_kntdth, // deathsound + 8, // speed + 24*FRACUNIT, // radius + 64*FRACUNIT, // height + 1000, // mass + 0, // damage + sfx_dmact, // activesound + MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags + S_BOS2_RAISE1 // raisestate + }, + + { // MT_SKULL + 3006, // doomednum + S_SKULL_STND, // spawnstate + 100, // spawnhealth + S_SKULL_RUN1, // seestate + 0, // seesound + 8, // reactiontime + sfx_sklatk, // attacksound + S_SKULL_PAIN, // painstate + 256, // painchance + sfx_dmpain, // painsound + 0, // meleestate + S_SKULL_ATK1, // missilestate + S_SKULL_DIE1, // deathstate + S_NULL, // xdeathstate + sfx_firxpl, // deathsound + 8, // speed + 16*FRACUNIT, // radius + 56*FRACUNIT, // height + 50, // mass + 3, // damage + sfx_dmact, // activesound + MF_SOLID|MF_SHOOTABLE|MF_FLOAT|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_SPIDER + 7, // doomednum + S_SPID_STND, // spawnstate + 3000, // spawnhealth + S_SPID_RUN1, // seestate + sfx_spisit, // seesound + 8, // reactiontime + sfx_shotgn, // attacksound + S_SPID_PAIN, // painstate + 40, // painchance + sfx_dmpain, // painsound + 0, // meleestate + S_SPID_ATK1, // missilestate + S_SPID_DIE1, // deathstate + S_NULL, // xdeathstate + sfx_spidth, // deathsound + 12, // speed + 128*FRACUNIT, // radius + 100*FRACUNIT, // height + 1000, // mass + 0, // damage + sfx_dmact, // activesound + MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags + S_NULL // raisestate + }, + + { // MT_BABY + 68, // doomednum + S_BSPI_STND, // spawnstate + 500, // spawnhealth + S_BSPI_SIGHT, // seestate + sfx_bspsit, // seesound + 8, // reactiontime + 0, // attacksound + S_BSPI_PAIN, // painstate + 128, // painchance + sfx_dmpain, // painsound + 0, // meleestate + S_BSPI_ATK1, // missilestate + S_BSPI_DIE1, // deathstate + S_NULL, // xdeathstate + sfx_bspdth, // deathsound + 12, // speed + 64*FRACUNIT, // radius + 64*FRACUNIT, // height + 600, // mass + 0, // damage + sfx_bspact, // activesound + MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags + S_BSPI_RAISE1 // raisestate + }, + + { // MT_CYBORG + 16, // doomednum + S_CYBER_STND, // spawnstate + 4000, // spawnhealth + S_CYBER_RUN1, // seestate + sfx_cybsit, // seesound + 8, // reactiontime + 0, // attacksound + S_CYBER_PAIN, // painstate + 20, // painchance + sfx_dmpain, // painsound + 0, // meleestate + S_CYBER_ATK1, // missilestate + S_CYBER_DIE1, // deathstate + S_NULL, // xdeathstate + sfx_cybdth, // deathsound + 16, // speed + 40*FRACUNIT, // radius + 110*FRACUNIT, // height + 1000, // mass + 0, // damage + sfx_dmact, // activesound + MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags + S_NULL // raisestate + }, + + { // MT_PAIN + 71, // doomednum + S_PAIN_STND, // spawnstate + 400, // spawnhealth + S_PAIN_RUN1, // seestate + sfx_pesit, // seesound + 8, // reactiontime + 0, // attacksound + S_PAIN_PAIN, // painstate + 128, // painchance + sfx_pepain, // painsound + 0, // meleestate + S_PAIN_ATK1, // missilestate + S_PAIN_DIE1, // deathstate + S_NULL, // xdeathstate + sfx_pedth, // deathsound + 8, // speed + 31*FRACUNIT, // radius + 56*FRACUNIT, // height + 400, // mass + 0, // damage + sfx_dmact, // activesound + MF_SOLID|MF_SHOOTABLE|MF_FLOAT|MF_NOGRAVITY|MF_COUNTKILL, // flags + S_PAIN_RAISE1 // raisestate + }, + + { // MT_WOLFSS + 84, // doomednum + S_SSWV_STND, // spawnstate + 50, // spawnhealth + S_SSWV_RUN1, // seestate + sfx_sssit, // seesound + 8, // reactiontime + 0, // attacksound + S_SSWV_PAIN, // painstate + 170, // painchance + sfx_popain, // painsound + 0, // meleestate + S_SSWV_ATK1, // missilestate + S_SSWV_DIE1, // deathstate + S_SSWV_XDIE1, // xdeathstate + sfx_ssdth, // deathsound + 8, // speed + 20*FRACUNIT, // radius + 56*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_posact, // activesound + MF_SOLID|MF_SHOOTABLE|MF_COUNTKILL, // flags + S_SSWV_RAISE1 // raisestate + }, + + { // MT_KEEN + 72, // doomednum + S_KEENSTND, // spawnstate + 100, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_KEENPAIN, // painstate + 256, // painchance + sfx_keenpn, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_COMMKEEN, // deathstate + S_NULL, // xdeathstate + sfx_keendt, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 72*FRACUNIT, // height + 10000000, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY|MF_SHOOTABLE|MF_COUNTKILL, // flags + S_NULL // raisestate + }, + + { // MT_BOSSBRAIN + 88, // doomednum + S_BRAIN, // spawnstate + 250, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_BRAIN_PAIN, // painstate + 255, // painchance + sfx_bospn, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_BRAIN_DIE1, // deathstate + S_NULL, // xdeathstate + sfx_bosdth, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 10000000, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SHOOTABLE, // flags + S_NULL // raisestate + }, + + { // MT_BOSSSPIT + 89, // doomednum + S_BRAINEYE, // spawnstate + 1000, // spawnhealth + S_BRAINEYESEE, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 32*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOSECTOR, // flags + S_NULL // raisestate + }, + + { // MT_BOSSTARGET + 87, // doomednum + S_NULL, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 32*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOSECTOR, // flags + S_NULL // raisestate + }, + + { // MT_SPAWNSHOT + -1, // doomednum + S_SPAWN1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_bospit, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_firxpl, // deathsound + 10*FRACUNIT, // speed + 6*FRACUNIT, // radius + 32*FRACUNIT, // height + 100, // mass + 3, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY|MF_NOCLIP, // flags + S_NULL // raisestate + }, + + { // MT_SPAWNFIRE + -1, // doomednum + S_SPAWNFIRE1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_BARREL + 2035, // doomednum + S_BAR1, // spawnstate + 20, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_BEXP, // deathstate + S_NULL, // xdeathstate + sfx_barexp, // deathsound + 0, // speed + 10*FRACUNIT, // radius + 42*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SHOOTABLE|MF_NOBLOOD, // flags + S_NULL // raisestate + }, + + { // MT_TROOPSHOT + -1, // doomednum + S_TBALL1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_firsht, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_TBALLX1, // deathstate + S_NULL, // xdeathstate + sfx_firxpl, // deathsound + 10*FRACUNIT, // speed + 6*FRACUNIT, // radius + 8*FRACUNIT, // height + 100, // mass + 3, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_HEADSHOT + -1, // doomednum + S_RBALL1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_firsht, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_RBALLX1, // deathstate + S_NULL, // xdeathstate + sfx_firxpl, // deathsound + 10*FRACUNIT, // speed + 6*FRACUNIT, // radius + 8*FRACUNIT, // height + 100, // mass + 5, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_ROCKET + -1, // doomednum + S_ROCKET, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_rlaunc, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_EXPLODE1, // deathstate + S_NULL, // xdeathstate + sfx_barexp, // deathsound + 20*FRACUNIT, // speed + 11*FRACUNIT, // radius + 8*FRACUNIT, // height + 100, // mass + 20, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_PLASMA + -1, // doomednum + S_PLASBALL, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_plasma, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_PLASEXP, // deathstate + S_NULL, // xdeathstate + sfx_firxpl, // deathsound + 25*FRACUNIT, // speed + 13*FRACUNIT, // radius + 8*FRACUNIT, // height + 100, // mass + 5, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_BFG + -1, // doomednum + S_BFGSHOT, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + 0, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_BFGLAND, // deathstate + S_NULL, // xdeathstate + sfx_rxplod, // deathsound + 25*FRACUNIT, // speed + 13*FRACUNIT, // radius + 8*FRACUNIT, // height + 100, // mass + 100, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_ARACHPLAZ + -1, // doomednum + S_ARACH_PLAZ, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_plasma, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_ARACH_PLEX, // deathstate + S_NULL, // xdeathstate + sfx_firxpl, // deathsound + 25*FRACUNIT, // speed + 13*FRACUNIT, // radius + 8*FRACUNIT, // height + 100, // mass + 5, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_MISSILE|MF_DROPOFF|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_PUFF + -1, // doomednum + S_PUFF1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_BLOOD + -1, // doomednum + S_BLOOD1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP, // flags + S_NULL // raisestate + }, + + { // MT_TFOG + -1, // doomednum + S_TFOG, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_IFOG + -1, // doomednum + S_IFOG, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_TELEPORTMAN + 14, // doomednum + S_NULL, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOSECTOR, // flags + S_NULL // raisestate + }, + + { // MT_EXTRABFG + -1, // doomednum + S_BFGEXP, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_MISC0 + 2018, // doomednum + S_ARM1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_MISC1 + 2019, // doomednum + S_ARM2, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_MISC2 + 2014, // doomednum + S_BON1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL|MF_COUNTITEM, // flags + S_NULL // raisestate + }, + + { // MT_MISC3 + 2015, // doomednum + S_BON2, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL|MF_COUNTITEM, // flags + S_NULL // raisestate + }, + + { // MT_MISC4 + 5, // doomednum + S_BKEY, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL|MF_NOTDMATCH, // flags + S_NULL // raisestate + }, + + { // MT_MISC5 + 13, // doomednum + S_RKEY, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL|MF_NOTDMATCH, // flags + S_NULL // raisestate + }, + + { // MT_MISC6 + 6, // doomednum + S_YKEY, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL|MF_NOTDMATCH, // flags + S_NULL // raisestate + }, + + { // MT_MISC7 + 39, // doomednum + S_YSKULL, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL|MF_NOTDMATCH, // flags + S_NULL // raisestate + }, + + { // MT_MISC8 + 38, // doomednum + S_RSKULL, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL|MF_NOTDMATCH, // flags + S_NULL // raisestate + }, + + { // MT_MISC9 + 40, // doomednum + S_BSKULL, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL|MF_NOTDMATCH, // flags + S_NULL // raisestate + }, + + { // MT_MISC10 + 2011, // doomednum + S_STIM, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_MISC11 + 2012, // doomednum + S_MEDI, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_MISC12 + 2013, // doomednum + S_SOUL, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL|MF_COUNTITEM, // flags + S_NULL // raisestate + }, + + { // MT_INV + 2022, // doomednum + S_PINV, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL|MF_COUNTITEM, // flags + S_NULL // raisestate + }, + + { // MT_MISC13 + 2023, // doomednum + S_PSTR, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL|MF_COUNTITEM, // flags + S_NULL // raisestate + }, + + { // MT_INS + 2024, // doomednum + S_PINS, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL|MF_COUNTITEM, // flags + S_NULL // raisestate + }, + + { // MT_MISC14 + 2025, // doomednum + S_SUIT, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_MISC15 + 2026, // doomednum + S_PMAP, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL|MF_COUNTITEM, // flags + S_NULL // raisestate + }, + + { // MT_MISC16 + 2045, // doomednum + S_PVIS, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL|MF_COUNTITEM, // flags + S_NULL // raisestate + }, + + { // MT_MEGA + 83, // doomednum + S_MEGA, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL|MF_COUNTITEM, // flags + S_NULL // raisestate + }, + + { // MT_CLIP + 2007, // doomednum + S_CLIP, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_MISC17 + 2048, // doomednum + S_AMMO, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_MISC18 + 2010, // doomednum + S_ROCK, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_MISC19 + 2046, // doomednum + S_BROK, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_MISC20 + 2047, // doomednum + S_CELL, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_MISC21 + 17, // doomednum + S_CELP, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_MISC22 + 2008, // doomednum + S_SHEL, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_MISC23 + 2049, // doomednum + S_SBOX, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_MISC24 + 8, // doomednum + S_BPAK, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_MISC25 + 2006, // doomednum + S_BFUG, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_CHAINGUN + 2002, // doomednum + S_MGUN, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_MISC26 + 2005, // doomednum + S_CSAW, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_MISC27 + 2003, // doomednum + S_LAUN, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_MISC28 + 2004, // doomednum + S_PLAS, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_SHOTGUN + 2001, // doomednum + S_SHOT, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_SUPERSHOTGUN + 82, // doomednum + S_SHOT2, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPECIAL, // flags + S_NULL // raisestate + }, + + { // MT_MISC29 + 85, // doomednum + S_TECHLAMP, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC30 + 86, // doomednum + S_TECH2LAMP, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC31 + 2028, // doomednum + S_COLU, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC32 + 30, // doomednum + S_TALLGRNCOL, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC33 + 31, // doomednum + S_SHRTGRNCOL, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC34 + 32, // doomednum + S_TALLREDCOL, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC35 + 33, // doomednum + S_SHRTREDCOL, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC36 + 37, // doomednum + S_SKULLCOL, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC37 + 36, // doomednum + S_HEARTCOL, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC38 + 41, // doomednum + S_EVILEYE, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC39 + 42, // doomednum + S_FLOATSKULL, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC40 + 43, // doomednum + S_TORCHTREE, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC41 + 44, // doomednum + S_BLUETORCH, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC42 + 45, // doomednum + S_GREENTORCH, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC43 + 46, // doomednum + S_REDTORCH, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC44 + 55, // doomednum + S_BTORCHSHRT, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC45 + 56, // doomednum + S_GTORCHSHRT, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC46 + 57, // doomednum + S_RTORCHSHRT, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC47 + 47, // doomednum + S_STALAGTITE, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC48 + 48, // doomednum + S_TECHPILLAR, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC49 + 34, // doomednum + S_CANDLESTIK, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + 0, // flags + S_NULL // raisestate + }, + + { // MT_MISC50 + 35, // doomednum + S_CANDELABRA, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC51 + 49, // doomednum + S_BLOODYTWITCH, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 68*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_MISC52 + 50, // doomednum + S_MEAT2, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 84*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_MISC53 + 51, // doomednum + S_MEAT3, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 84*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_MISC54 + 52, // doomednum + S_MEAT4, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 68*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_MISC55 + 53, // doomednum + S_MEAT5, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 52*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_MISC56 + 59, // doomednum + S_MEAT2, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 84*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPAWNCEILING|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_MISC57 + 60, // doomednum + S_MEAT4, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 68*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPAWNCEILING|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_MISC58 + 61, // doomednum + S_MEAT3, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 52*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPAWNCEILING|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_MISC59 + 62, // doomednum + S_MEAT5, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 52*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPAWNCEILING|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_MISC60 + 63, // doomednum + S_BLOODYTWITCH, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 68*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SPAWNCEILING|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_MISC61 + 22, // doomednum + S_HEAD_DIE6, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + 0, // flags + S_NULL // raisestate + }, + + { // MT_MISC62 + 15, // doomednum + S_PLAY_DIE7, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + 0, // flags + S_NULL // raisestate + }, + + { // MT_MISC63 + 18, // doomednum + S_POSS_DIE5, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + 0, // flags + S_NULL // raisestate + }, + + { // MT_MISC64 + 21, // doomednum + S_SARG_DIE6, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + 0, // flags + S_NULL // raisestate + }, + + { // MT_MISC65 + 23, // doomednum + S_SKULL_DIE6, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + 0, // flags + S_NULL // raisestate + }, + + { // MT_MISC66 + 20, // doomednum + S_TROO_DIE5, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + 0, // flags + S_NULL // raisestate + }, + + { // MT_MISC67 + 19, // doomednum + S_SPOS_DIE5, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + 0, // flags + S_NULL // raisestate + }, + + { // MT_MISC68 + 10, // doomednum + S_PLAY_XDIE9, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + 0, // flags + S_NULL // raisestate + }, + + { // MT_MISC69 + 12, // doomednum + S_PLAY_XDIE9, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + 0, // flags + S_NULL // raisestate + }, + + { // MT_MISC70 + 28, // doomednum + S_HEADSONSTICK, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC71 + 24, // doomednum + S_GIBS, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + 0, // flags + S_NULL // raisestate + }, + + { // MT_MISC72 + 27, // doomednum + S_HEADONASTICK, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC73 + 29, // doomednum + S_HEADCANDLES, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC74 + 25, // doomednum + S_DEADSTICK, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC75 + 26, // doomednum + S_LIVESTICK, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC76 + 54, // doomednum + S_BIGTREE, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 32*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC77 + 70, // doomednum + S_BBAR1, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID, // flags + S_NULL // raisestate + }, + + { // MT_MISC78 + 73, // doomednum + S_HANGNOGUTS, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 88*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_MISC79 + 74, // doomednum + S_HANGBNOBRAIN, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 88*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_MISC80 + 75, // doomednum + S_HANGTLOOKDN, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 64*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_MISC81 + 76, // doomednum + S_HANGTSKULL, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 64*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_MISC82 + 77, // doomednum + S_HANGTLOOKUP, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 64*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_MISC83 + 78, // doomednum + S_HANGTNOBRAIN, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 16*FRACUNIT, // radius + 64*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_SOLID|MF_SPAWNCEILING|MF_NOGRAVITY, // flags + S_NULL // raisestate + }, + + { // MT_MISC84 + 79, // doomednum + S_COLONGIBS, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP, // flags + S_NULL // raisestate + }, + + { // MT_MISC85 + 80, // doomednum + S_SMALLPOOL, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP, // flags + S_NULL // raisestate + }, + + { // MT_MISC86 + 81, // doomednum + S_BRAINSTEM, // spawnstate + 1000, // spawnhealth + S_NULL, // seestate + sfx_None, // seesound + 8, // reactiontime + sfx_None, // attacksound + S_NULL, // painstate + 0, // painchance + sfx_None, // painsound + S_NULL, // meleestate + S_NULL, // missilestate + S_NULL, // deathstate + S_NULL, // xdeathstate + sfx_None, // deathsound + 0, // speed + 20*FRACUNIT, // radius + 16*FRACUNIT, // height + 100, // mass + 0, // damage + sfx_None, // activesound + MF_NOBLOCKMAP, // flags + S_NULL // raisestate + } +}; + diff --git a/firmware_p4/components/Applications/doom/info.h b/firmware_p4/components/Applications/doom/info.h new file mode 100644 index 000000000..648b51888 --- /dev/null +++ b/firmware_p4/components/Applications/doom/info.h @@ -0,0 +1,1331 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Thing frame/state LUT, +// generated by multigen utilitiy. +// This one is the original DOOM version, preserved. +// + +#ifndef __INFO__ +#define __INFO__ + +// Needed for action function pointer handling. +#include "d_think.h" + +typedef enum +{ + SPR_TROO, + SPR_SHTG, + SPR_PUNG, + SPR_PISG, + SPR_PISF, + SPR_SHTF, + SPR_SHT2, + SPR_CHGG, + SPR_CHGF, + SPR_MISG, + SPR_MISF, + SPR_SAWG, + SPR_PLSG, + SPR_PLSF, + SPR_BFGG, + SPR_BFGF, + SPR_BLUD, + SPR_PUFF, + SPR_BAL1, + SPR_BAL2, + SPR_PLSS, + SPR_PLSE, + SPR_MISL, + SPR_BFS1, + SPR_BFE1, + SPR_BFE2, + SPR_TFOG, + SPR_IFOG, + SPR_PLAY, + SPR_POSS, + SPR_SPOS, + SPR_VILE, + SPR_FIRE, + SPR_FATB, + SPR_FBXP, + SPR_SKEL, + SPR_MANF, + SPR_FATT, + SPR_CPOS, + SPR_SARG, + SPR_HEAD, + SPR_BAL7, + SPR_BOSS, + SPR_BOS2, + SPR_SKUL, + SPR_SPID, + SPR_BSPI, + SPR_APLS, + SPR_APBX, + SPR_CYBR, + SPR_PAIN, + SPR_SSWV, + SPR_KEEN, + SPR_BBRN, + SPR_BOSF, + SPR_ARM1, + SPR_ARM2, + SPR_BAR1, + SPR_BEXP, + SPR_FCAN, + SPR_BON1, + SPR_BON2, + SPR_BKEY, + SPR_RKEY, + SPR_YKEY, + SPR_BSKU, + SPR_RSKU, + SPR_YSKU, + SPR_STIM, + SPR_MEDI, + SPR_SOUL, + SPR_PINV, + SPR_PSTR, + SPR_PINS, + SPR_MEGA, + SPR_SUIT, + SPR_PMAP, + SPR_PVIS, + SPR_CLIP, + SPR_AMMO, + SPR_ROCK, + SPR_BROK, + SPR_CELL, + SPR_CELP, + SPR_SHEL, + SPR_SBOX, + SPR_BPAK, + SPR_BFUG, + SPR_MGUN, + SPR_CSAW, + SPR_LAUN, + SPR_PLAS, + SPR_SHOT, + SPR_SGN2, + SPR_COLU, + SPR_SMT2, + SPR_GOR1, + SPR_POL2, + SPR_POL5, + SPR_POL4, + SPR_POL3, + SPR_POL1, + SPR_POL6, + SPR_GOR2, + SPR_GOR3, + SPR_GOR4, + SPR_GOR5, + SPR_SMIT, + SPR_COL1, + SPR_COL2, + SPR_COL3, + SPR_COL4, + SPR_CAND, + SPR_CBRA, + SPR_COL6, + SPR_TRE1, + SPR_TRE2, + SPR_ELEC, + SPR_CEYE, + SPR_FSKU, + SPR_COL5, + SPR_TBLU, + SPR_TGRN, + SPR_TRED, + SPR_SMBT, + SPR_SMGT, + SPR_SMRT, + SPR_HDB1, + SPR_HDB2, + SPR_HDB3, + SPR_HDB4, + SPR_HDB5, + SPR_HDB6, + SPR_POB1, + SPR_POB2, + SPR_BRS1, + SPR_TLMP, + SPR_TLP2, + NUMSPRITES + +} spritenum_t; + +typedef enum +{ + S_NULL, + S_LIGHTDONE, + S_PUNCH, + S_PUNCHDOWN, + S_PUNCHUP, + S_PUNCH1, + S_PUNCH2, + S_PUNCH3, + S_PUNCH4, + S_PUNCH5, + S_PISTOL, + S_PISTOLDOWN, + S_PISTOLUP, + S_PISTOL1, + S_PISTOL2, + S_PISTOL3, + S_PISTOL4, + S_PISTOLFLASH, + S_SGUN, + S_SGUNDOWN, + S_SGUNUP, + S_SGUN1, + S_SGUN2, + S_SGUN3, + S_SGUN4, + S_SGUN5, + S_SGUN6, + S_SGUN7, + S_SGUN8, + S_SGUN9, + S_SGUNFLASH1, + S_SGUNFLASH2, + S_DSGUN, + S_DSGUNDOWN, + S_DSGUNUP, + S_DSGUN1, + S_DSGUN2, + S_DSGUN3, + S_DSGUN4, + S_DSGUN5, + S_DSGUN6, + S_DSGUN7, + S_DSGUN8, + S_DSGUN9, + S_DSGUN10, + S_DSNR1, + S_DSNR2, + S_DSGUNFLASH1, + S_DSGUNFLASH2, + S_CHAIN, + S_CHAINDOWN, + S_CHAINUP, + S_CHAIN1, + S_CHAIN2, + S_CHAIN3, + S_CHAINFLASH1, + S_CHAINFLASH2, + S_MISSILE, + S_MISSILEDOWN, + S_MISSILEUP, + S_MISSILE1, + S_MISSILE2, + S_MISSILE3, + S_MISSILEFLASH1, + S_MISSILEFLASH2, + S_MISSILEFLASH3, + S_MISSILEFLASH4, + S_SAW, + S_SAWB, + S_SAWDOWN, + S_SAWUP, + S_SAW1, + S_SAW2, + S_SAW3, + S_PLASMA, + S_PLASMADOWN, + S_PLASMAUP, + S_PLASMA1, + S_PLASMA2, + S_PLASMAFLASH1, + S_PLASMAFLASH2, + S_BFG, + S_BFGDOWN, + S_BFGUP, + S_BFG1, + S_BFG2, + S_BFG3, + S_BFG4, + S_BFGFLASH1, + S_BFGFLASH2, + S_BLOOD1, + S_BLOOD2, + S_BLOOD3, + S_PUFF1, + S_PUFF2, + S_PUFF3, + S_PUFF4, + S_TBALL1, + S_TBALL2, + S_TBALLX1, + S_TBALLX2, + S_TBALLX3, + S_RBALL1, + S_RBALL2, + S_RBALLX1, + S_RBALLX2, + S_RBALLX3, + S_PLASBALL, + S_PLASBALL2, + S_PLASEXP, + S_PLASEXP2, + S_PLASEXP3, + S_PLASEXP4, + S_PLASEXP5, + S_ROCKET, + S_BFGSHOT, + S_BFGSHOT2, + S_BFGLAND, + S_BFGLAND2, + S_BFGLAND3, + S_BFGLAND4, + S_BFGLAND5, + S_BFGLAND6, + S_BFGEXP, + S_BFGEXP2, + S_BFGEXP3, + S_BFGEXP4, + S_EXPLODE1, + S_EXPLODE2, + S_EXPLODE3, + S_TFOG, + S_TFOG01, + S_TFOG02, + S_TFOG2, + S_TFOG3, + S_TFOG4, + S_TFOG5, + S_TFOG6, + S_TFOG7, + S_TFOG8, + S_TFOG9, + S_TFOG10, + S_IFOG, + S_IFOG01, + S_IFOG02, + S_IFOG2, + S_IFOG3, + S_IFOG4, + S_IFOG5, + S_PLAY, + S_PLAY_RUN1, + S_PLAY_RUN2, + S_PLAY_RUN3, + S_PLAY_RUN4, + S_PLAY_ATK1, + S_PLAY_ATK2, + S_PLAY_PAIN, + S_PLAY_PAIN2, + S_PLAY_DIE1, + S_PLAY_DIE2, + S_PLAY_DIE3, + S_PLAY_DIE4, + S_PLAY_DIE5, + S_PLAY_DIE6, + S_PLAY_DIE7, + S_PLAY_XDIE1, + S_PLAY_XDIE2, + S_PLAY_XDIE3, + S_PLAY_XDIE4, + S_PLAY_XDIE5, + S_PLAY_XDIE6, + S_PLAY_XDIE7, + S_PLAY_XDIE8, + S_PLAY_XDIE9, + S_POSS_STND, + S_POSS_STND2, + S_POSS_RUN1, + S_POSS_RUN2, + S_POSS_RUN3, + S_POSS_RUN4, + S_POSS_RUN5, + S_POSS_RUN6, + S_POSS_RUN7, + S_POSS_RUN8, + S_POSS_ATK1, + S_POSS_ATK2, + S_POSS_ATK3, + S_POSS_PAIN, + S_POSS_PAIN2, + S_POSS_DIE1, + S_POSS_DIE2, + S_POSS_DIE3, + S_POSS_DIE4, + S_POSS_DIE5, + S_POSS_XDIE1, + S_POSS_XDIE2, + S_POSS_XDIE3, + S_POSS_XDIE4, + S_POSS_XDIE5, + S_POSS_XDIE6, + S_POSS_XDIE7, + S_POSS_XDIE8, + S_POSS_XDIE9, + S_POSS_RAISE1, + S_POSS_RAISE2, + S_POSS_RAISE3, + S_POSS_RAISE4, + S_SPOS_STND, + S_SPOS_STND2, + S_SPOS_RUN1, + S_SPOS_RUN2, + S_SPOS_RUN3, + S_SPOS_RUN4, + S_SPOS_RUN5, + S_SPOS_RUN6, + S_SPOS_RUN7, + S_SPOS_RUN8, + S_SPOS_ATK1, + S_SPOS_ATK2, + S_SPOS_ATK3, + S_SPOS_PAIN, + S_SPOS_PAIN2, + S_SPOS_DIE1, + S_SPOS_DIE2, + S_SPOS_DIE3, + S_SPOS_DIE4, + S_SPOS_DIE5, + S_SPOS_XDIE1, + S_SPOS_XDIE2, + S_SPOS_XDIE3, + S_SPOS_XDIE4, + S_SPOS_XDIE5, + S_SPOS_XDIE6, + S_SPOS_XDIE7, + S_SPOS_XDIE8, + S_SPOS_XDIE9, + S_SPOS_RAISE1, + S_SPOS_RAISE2, + S_SPOS_RAISE3, + S_SPOS_RAISE4, + S_SPOS_RAISE5, + S_VILE_STND, + S_VILE_STND2, + S_VILE_RUN1, + S_VILE_RUN2, + S_VILE_RUN3, + S_VILE_RUN4, + S_VILE_RUN5, + S_VILE_RUN6, + S_VILE_RUN7, + S_VILE_RUN8, + S_VILE_RUN9, + S_VILE_RUN10, + S_VILE_RUN11, + S_VILE_RUN12, + S_VILE_ATK1, + S_VILE_ATK2, + S_VILE_ATK3, + S_VILE_ATK4, + S_VILE_ATK5, + S_VILE_ATK6, + S_VILE_ATK7, + S_VILE_ATK8, + S_VILE_ATK9, + S_VILE_ATK10, + S_VILE_ATK11, + S_VILE_HEAL1, + S_VILE_HEAL2, + S_VILE_HEAL3, + S_VILE_PAIN, + S_VILE_PAIN2, + S_VILE_DIE1, + S_VILE_DIE2, + S_VILE_DIE3, + S_VILE_DIE4, + S_VILE_DIE5, + S_VILE_DIE6, + S_VILE_DIE7, + S_VILE_DIE8, + S_VILE_DIE9, + S_VILE_DIE10, + S_FIRE1, + S_FIRE2, + S_FIRE3, + S_FIRE4, + S_FIRE5, + S_FIRE6, + S_FIRE7, + S_FIRE8, + S_FIRE9, + S_FIRE10, + S_FIRE11, + S_FIRE12, + S_FIRE13, + S_FIRE14, + S_FIRE15, + S_FIRE16, + S_FIRE17, + S_FIRE18, + S_FIRE19, + S_FIRE20, + S_FIRE21, + S_FIRE22, + S_FIRE23, + S_FIRE24, + S_FIRE25, + S_FIRE26, + S_FIRE27, + S_FIRE28, + S_FIRE29, + S_FIRE30, + S_SMOKE1, + S_SMOKE2, + S_SMOKE3, + S_SMOKE4, + S_SMOKE5, + S_TRACER, + S_TRACER2, + S_TRACEEXP1, + S_TRACEEXP2, + S_TRACEEXP3, + S_SKEL_STND, + S_SKEL_STND2, + S_SKEL_RUN1, + S_SKEL_RUN2, + S_SKEL_RUN3, + S_SKEL_RUN4, + S_SKEL_RUN5, + S_SKEL_RUN6, + S_SKEL_RUN7, + S_SKEL_RUN8, + S_SKEL_RUN9, + S_SKEL_RUN10, + S_SKEL_RUN11, + S_SKEL_RUN12, + S_SKEL_FIST1, + S_SKEL_FIST2, + S_SKEL_FIST3, + S_SKEL_FIST4, + S_SKEL_MISS1, + S_SKEL_MISS2, + S_SKEL_MISS3, + S_SKEL_MISS4, + S_SKEL_PAIN, + S_SKEL_PAIN2, + S_SKEL_DIE1, + S_SKEL_DIE2, + S_SKEL_DIE3, + S_SKEL_DIE4, + S_SKEL_DIE5, + S_SKEL_DIE6, + S_SKEL_RAISE1, + S_SKEL_RAISE2, + S_SKEL_RAISE3, + S_SKEL_RAISE4, + S_SKEL_RAISE5, + S_SKEL_RAISE6, + S_FATSHOT1, + S_FATSHOT2, + S_FATSHOTX1, + S_FATSHOTX2, + S_FATSHOTX3, + S_FATT_STND, + S_FATT_STND2, + S_FATT_RUN1, + S_FATT_RUN2, + S_FATT_RUN3, + S_FATT_RUN4, + S_FATT_RUN5, + S_FATT_RUN6, + S_FATT_RUN7, + S_FATT_RUN8, + S_FATT_RUN9, + S_FATT_RUN10, + S_FATT_RUN11, + S_FATT_RUN12, + S_FATT_ATK1, + S_FATT_ATK2, + S_FATT_ATK3, + S_FATT_ATK4, + S_FATT_ATK5, + S_FATT_ATK6, + S_FATT_ATK7, + S_FATT_ATK8, + S_FATT_ATK9, + S_FATT_ATK10, + S_FATT_PAIN, + S_FATT_PAIN2, + S_FATT_DIE1, + S_FATT_DIE2, + S_FATT_DIE3, + S_FATT_DIE4, + S_FATT_DIE5, + S_FATT_DIE6, + S_FATT_DIE7, + S_FATT_DIE8, + S_FATT_DIE9, + S_FATT_DIE10, + S_FATT_RAISE1, + S_FATT_RAISE2, + S_FATT_RAISE3, + S_FATT_RAISE4, + S_FATT_RAISE5, + S_FATT_RAISE6, + S_FATT_RAISE7, + S_FATT_RAISE8, + S_CPOS_STND, + S_CPOS_STND2, + S_CPOS_RUN1, + S_CPOS_RUN2, + S_CPOS_RUN3, + S_CPOS_RUN4, + S_CPOS_RUN5, + S_CPOS_RUN6, + S_CPOS_RUN7, + S_CPOS_RUN8, + S_CPOS_ATK1, + S_CPOS_ATK2, + S_CPOS_ATK3, + S_CPOS_ATK4, + S_CPOS_PAIN, + S_CPOS_PAIN2, + S_CPOS_DIE1, + S_CPOS_DIE2, + S_CPOS_DIE3, + S_CPOS_DIE4, + S_CPOS_DIE5, + S_CPOS_DIE6, + S_CPOS_DIE7, + S_CPOS_XDIE1, + S_CPOS_XDIE2, + S_CPOS_XDIE3, + S_CPOS_XDIE4, + S_CPOS_XDIE5, + S_CPOS_XDIE6, + S_CPOS_RAISE1, + S_CPOS_RAISE2, + S_CPOS_RAISE3, + S_CPOS_RAISE4, + S_CPOS_RAISE5, + S_CPOS_RAISE6, + S_CPOS_RAISE7, + S_TROO_STND, + S_TROO_STND2, + S_TROO_RUN1, + S_TROO_RUN2, + S_TROO_RUN3, + S_TROO_RUN4, + S_TROO_RUN5, + S_TROO_RUN6, + S_TROO_RUN7, + S_TROO_RUN8, + S_TROO_ATK1, + S_TROO_ATK2, + S_TROO_ATK3, + S_TROO_PAIN, + S_TROO_PAIN2, + S_TROO_DIE1, + S_TROO_DIE2, + S_TROO_DIE3, + S_TROO_DIE4, + S_TROO_DIE5, + S_TROO_XDIE1, + S_TROO_XDIE2, + S_TROO_XDIE3, + S_TROO_XDIE4, + S_TROO_XDIE5, + S_TROO_XDIE6, + S_TROO_XDIE7, + S_TROO_XDIE8, + S_TROO_RAISE1, + S_TROO_RAISE2, + S_TROO_RAISE3, + S_TROO_RAISE4, + S_TROO_RAISE5, + S_SARG_STND, + S_SARG_STND2, + S_SARG_RUN1, + S_SARG_RUN2, + S_SARG_RUN3, + S_SARG_RUN4, + S_SARG_RUN5, + S_SARG_RUN6, + S_SARG_RUN7, + S_SARG_RUN8, + S_SARG_ATK1, + S_SARG_ATK2, + S_SARG_ATK3, + S_SARG_PAIN, + S_SARG_PAIN2, + S_SARG_DIE1, + S_SARG_DIE2, + S_SARG_DIE3, + S_SARG_DIE4, + S_SARG_DIE5, + S_SARG_DIE6, + S_SARG_RAISE1, + S_SARG_RAISE2, + S_SARG_RAISE3, + S_SARG_RAISE4, + S_SARG_RAISE5, + S_SARG_RAISE6, + S_HEAD_STND, + S_HEAD_RUN1, + S_HEAD_ATK1, + S_HEAD_ATK2, + S_HEAD_ATK3, + S_HEAD_PAIN, + S_HEAD_PAIN2, + S_HEAD_PAIN3, + S_HEAD_DIE1, + S_HEAD_DIE2, + S_HEAD_DIE3, + S_HEAD_DIE4, + S_HEAD_DIE5, + S_HEAD_DIE6, + S_HEAD_RAISE1, + S_HEAD_RAISE2, + S_HEAD_RAISE3, + S_HEAD_RAISE4, + S_HEAD_RAISE5, + S_HEAD_RAISE6, + S_BRBALL1, + S_BRBALL2, + S_BRBALLX1, + S_BRBALLX2, + S_BRBALLX3, + S_BOSS_STND, + S_BOSS_STND2, + S_BOSS_RUN1, + S_BOSS_RUN2, + S_BOSS_RUN3, + S_BOSS_RUN4, + S_BOSS_RUN5, + S_BOSS_RUN6, + S_BOSS_RUN7, + S_BOSS_RUN8, + S_BOSS_ATK1, + S_BOSS_ATK2, + S_BOSS_ATK3, + S_BOSS_PAIN, + S_BOSS_PAIN2, + S_BOSS_DIE1, + S_BOSS_DIE2, + S_BOSS_DIE3, + S_BOSS_DIE4, + S_BOSS_DIE5, + S_BOSS_DIE6, + S_BOSS_DIE7, + S_BOSS_RAISE1, + S_BOSS_RAISE2, + S_BOSS_RAISE3, + S_BOSS_RAISE4, + S_BOSS_RAISE5, + S_BOSS_RAISE6, + S_BOSS_RAISE7, + S_BOS2_STND, + S_BOS2_STND2, + S_BOS2_RUN1, + S_BOS2_RUN2, + S_BOS2_RUN3, + S_BOS2_RUN4, + S_BOS2_RUN5, + S_BOS2_RUN6, + S_BOS2_RUN7, + S_BOS2_RUN8, + S_BOS2_ATK1, + S_BOS2_ATK2, + S_BOS2_ATK3, + S_BOS2_PAIN, + S_BOS2_PAIN2, + S_BOS2_DIE1, + S_BOS2_DIE2, + S_BOS2_DIE3, + S_BOS2_DIE4, + S_BOS2_DIE5, + S_BOS2_DIE6, + S_BOS2_DIE7, + S_BOS2_RAISE1, + S_BOS2_RAISE2, + S_BOS2_RAISE3, + S_BOS2_RAISE4, + S_BOS2_RAISE5, + S_BOS2_RAISE6, + S_BOS2_RAISE7, + S_SKULL_STND, + S_SKULL_STND2, + S_SKULL_RUN1, + S_SKULL_RUN2, + S_SKULL_ATK1, + S_SKULL_ATK2, + S_SKULL_ATK3, + S_SKULL_ATK4, + S_SKULL_PAIN, + S_SKULL_PAIN2, + S_SKULL_DIE1, + S_SKULL_DIE2, + S_SKULL_DIE3, + S_SKULL_DIE4, + S_SKULL_DIE5, + S_SKULL_DIE6, + S_SPID_STND, + S_SPID_STND2, + S_SPID_RUN1, + S_SPID_RUN2, + S_SPID_RUN3, + S_SPID_RUN4, + S_SPID_RUN5, + S_SPID_RUN6, + S_SPID_RUN7, + S_SPID_RUN8, + S_SPID_RUN9, + S_SPID_RUN10, + S_SPID_RUN11, + S_SPID_RUN12, + S_SPID_ATK1, + S_SPID_ATK2, + S_SPID_ATK3, + S_SPID_ATK4, + S_SPID_PAIN, + S_SPID_PAIN2, + S_SPID_DIE1, + S_SPID_DIE2, + S_SPID_DIE3, + S_SPID_DIE4, + S_SPID_DIE5, + S_SPID_DIE6, + S_SPID_DIE7, + S_SPID_DIE8, + S_SPID_DIE9, + S_SPID_DIE10, + S_SPID_DIE11, + S_BSPI_STND, + S_BSPI_STND2, + S_BSPI_SIGHT, + S_BSPI_RUN1, + S_BSPI_RUN2, + S_BSPI_RUN3, + S_BSPI_RUN4, + S_BSPI_RUN5, + S_BSPI_RUN6, + S_BSPI_RUN7, + S_BSPI_RUN8, + S_BSPI_RUN9, + S_BSPI_RUN10, + S_BSPI_RUN11, + S_BSPI_RUN12, + S_BSPI_ATK1, + S_BSPI_ATK2, + S_BSPI_ATK3, + S_BSPI_ATK4, + S_BSPI_PAIN, + S_BSPI_PAIN2, + S_BSPI_DIE1, + S_BSPI_DIE2, + S_BSPI_DIE3, + S_BSPI_DIE4, + S_BSPI_DIE5, + S_BSPI_DIE6, + S_BSPI_DIE7, + S_BSPI_RAISE1, + S_BSPI_RAISE2, + S_BSPI_RAISE3, + S_BSPI_RAISE4, + S_BSPI_RAISE5, + S_BSPI_RAISE6, + S_BSPI_RAISE7, + S_ARACH_PLAZ, + S_ARACH_PLAZ2, + S_ARACH_PLEX, + S_ARACH_PLEX2, + S_ARACH_PLEX3, + S_ARACH_PLEX4, + S_ARACH_PLEX5, + S_CYBER_STND, + S_CYBER_STND2, + S_CYBER_RUN1, + S_CYBER_RUN2, + S_CYBER_RUN3, + S_CYBER_RUN4, + S_CYBER_RUN5, + S_CYBER_RUN6, + S_CYBER_RUN7, + S_CYBER_RUN8, + S_CYBER_ATK1, + S_CYBER_ATK2, + S_CYBER_ATK3, + S_CYBER_ATK4, + S_CYBER_ATK5, + S_CYBER_ATK6, + S_CYBER_PAIN, + S_CYBER_DIE1, + S_CYBER_DIE2, + S_CYBER_DIE3, + S_CYBER_DIE4, + S_CYBER_DIE5, + S_CYBER_DIE6, + S_CYBER_DIE7, + S_CYBER_DIE8, + S_CYBER_DIE9, + S_CYBER_DIE10, + S_PAIN_STND, + S_PAIN_RUN1, + S_PAIN_RUN2, + S_PAIN_RUN3, + S_PAIN_RUN4, + S_PAIN_RUN5, + S_PAIN_RUN6, + S_PAIN_ATK1, + S_PAIN_ATK2, + S_PAIN_ATK3, + S_PAIN_ATK4, + S_PAIN_PAIN, + S_PAIN_PAIN2, + S_PAIN_DIE1, + S_PAIN_DIE2, + S_PAIN_DIE3, + S_PAIN_DIE4, + S_PAIN_DIE5, + S_PAIN_DIE6, + S_PAIN_RAISE1, + S_PAIN_RAISE2, + S_PAIN_RAISE3, + S_PAIN_RAISE4, + S_PAIN_RAISE5, + S_PAIN_RAISE6, + S_SSWV_STND, + S_SSWV_STND2, + S_SSWV_RUN1, + S_SSWV_RUN2, + S_SSWV_RUN3, + S_SSWV_RUN4, + S_SSWV_RUN5, + S_SSWV_RUN6, + S_SSWV_RUN7, + S_SSWV_RUN8, + S_SSWV_ATK1, + S_SSWV_ATK2, + S_SSWV_ATK3, + S_SSWV_ATK4, + S_SSWV_ATK5, + S_SSWV_ATK6, + S_SSWV_PAIN, + S_SSWV_PAIN2, + S_SSWV_DIE1, + S_SSWV_DIE2, + S_SSWV_DIE3, + S_SSWV_DIE4, + S_SSWV_DIE5, + S_SSWV_XDIE1, + S_SSWV_XDIE2, + S_SSWV_XDIE3, + S_SSWV_XDIE4, + S_SSWV_XDIE5, + S_SSWV_XDIE6, + S_SSWV_XDIE7, + S_SSWV_XDIE8, + S_SSWV_XDIE9, + S_SSWV_RAISE1, + S_SSWV_RAISE2, + S_SSWV_RAISE3, + S_SSWV_RAISE4, + S_SSWV_RAISE5, + S_KEENSTND, + S_COMMKEEN, + S_COMMKEEN2, + S_COMMKEEN3, + S_COMMKEEN4, + S_COMMKEEN5, + S_COMMKEEN6, + S_COMMKEEN7, + S_COMMKEEN8, + S_COMMKEEN9, + S_COMMKEEN10, + S_COMMKEEN11, + S_COMMKEEN12, + S_KEENPAIN, + S_KEENPAIN2, + S_BRAIN, + S_BRAIN_PAIN, + S_BRAIN_DIE1, + S_BRAIN_DIE2, + S_BRAIN_DIE3, + S_BRAIN_DIE4, + S_BRAINEYE, + S_BRAINEYESEE, + S_BRAINEYE1, + S_SPAWN1, + S_SPAWN2, + S_SPAWN3, + S_SPAWN4, + S_SPAWNFIRE1, + S_SPAWNFIRE2, + S_SPAWNFIRE3, + S_SPAWNFIRE4, + S_SPAWNFIRE5, + S_SPAWNFIRE6, + S_SPAWNFIRE7, + S_SPAWNFIRE8, + S_BRAINEXPLODE1, + S_BRAINEXPLODE2, + S_BRAINEXPLODE3, + S_ARM1, + S_ARM1A, + S_ARM2, + S_ARM2A, + S_BAR1, + S_BAR2, + S_BEXP, + S_BEXP2, + S_BEXP3, + S_BEXP4, + S_BEXP5, + S_BBAR1, + S_BBAR2, + S_BBAR3, + S_BON1, + S_BON1A, + S_BON1B, + S_BON1C, + S_BON1D, + S_BON1E, + S_BON2, + S_BON2A, + S_BON2B, + S_BON2C, + S_BON2D, + S_BON2E, + S_BKEY, + S_BKEY2, + S_RKEY, + S_RKEY2, + S_YKEY, + S_YKEY2, + S_BSKULL, + S_BSKULL2, + S_RSKULL, + S_RSKULL2, + S_YSKULL, + S_YSKULL2, + S_STIM, + S_MEDI, + S_SOUL, + S_SOUL2, + S_SOUL3, + S_SOUL4, + S_SOUL5, + S_SOUL6, + S_PINV, + S_PINV2, + S_PINV3, + S_PINV4, + S_PSTR, + S_PINS, + S_PINS2, + S_PINS3, + S_PINS4, + S_MEGA, + S_MEGA2, + S_MEGA3, + S_MEGA4, + S_SUIT, + S_PMAP, + S_PMAP2, + S_PMAP3, + S_PMAP4, + S_PMAP5, + S_PMAP6, + S_PVIS, + S_PVIS2, + S_CLIP, + S_AMMO, + S_ROCK, + S_BROK, + S_CELL, + S_CELP, + S_SHEL, + S_SBOX, + S_BPAK, + S_BFUG, + S_MGUN, + S_CSAW, + S_LAUN, + S_PLAS, + S_SHOT, + S_SHOT2, + S_COLU, + S_STALAG, + S_BLOODYTWITCH, + S_BLOODYTWITCH2, + S_BLOODYTWITCH3, + S_BLOODYTWITCH4, + S_DEADTORSO, + S_DEADBOTTOM, + S_HEADSONSTICK, + S_GIBS, + S_HEADONASTICK, + S_HEADCANDLES, + S_HEADCANDLES2, + S_DEADSTICK, + S_LIVESTICK, + S_LIVESTICK2, + S_MEAT2, + S_MEAT3, + S_MEAT4, + S_MEAT5, + S_STALAGTITE, + S_TALLGRNCOL, + S_SHRTGRNCOL, + S_TALLREDCOL, + S_SHRTREDCOL, + S_CANDLESTIK, + S_CANDELABRA, + S_SKULLCOL, + S_TORCHTREE, + S_BIGTREE, + S_TECHPILLAR, + S_EVILEYE, + S_EVILEYE2, + S_EVILEYE3, + S_EVILEYE4, + S_FLOATSKULL, + S_FLOATSKULL2, + S_FLOATSKULL3, + S_HEARTCOL, + S_HEARTCOL2, + S_BLUETORCH, + S_BLUETORCH2, + S_BLUETORCH3, + S_BLUETORCH4, + S_GREENTORCH, + S_GREENTORCH2, + S_GREENTORCH3, + S_GREENTORCH4, + S_REDTORCH, + S_REDTORCH2, + S_REDTORCH3, + S_REDTORCH4, + S_BTORCHSHRT, + S_BTORCHSHRT2, + S_BTORCHSHRT3, + S_BTORCHSHRT4, + S_GTORCHSHRT, + S_GTORCHSHRT2, + S_GTORCHSHRT3, + S_GTORCHSHRT4, + S_RTORCHSHRT, + S_RTORCHSHRT2, + S_RTORCHSHRT3, + S_RTORCHSHRT4, + S_HANGNOGUTS, + S_HANGBNOBRAIN, + S_HANGTLOOKDN, + S_HANGTSKULL, + S_HANGTLOOKUP, + S_HANGTNOBRAIN, + S_COLONGIBS, + S_SMALLPOOL, + S_BRAINSTEM, + S_TECHLAMP, + S_TECHLAMP2, + S_TECHLAMP3, + S_TECHLAMP4, + S_TECH2LAMP, + S_TECH2LAMP2, + S_TECH2LAMP3, + S_TECH2LAMP4, + NUMSTATES +} statenum_t; + + +typedef struct +{ + spritenum_t sprite; + int frame; + int tics; + // void (*action) (); + actionf_t action; + statenum_t nextstate; + int misc1; + int misc2; +} state_t; + +extern state_t states[NUMSTATES]; +extern char *sprnames[]; + +typedef enum { + MT_PLAYER, + MT_POSSESSED, + MT_SHOTGUY, + MT_VILE, + MT_FIRE, + MT_UNDEAD, + MT_TRACER, + MT_SMOKE, + MT_FATSO, + MT_FATSHOT, + MT_CHAINGUY, + MT_TROOP, + MT_SERGEANT, + MT_SHADOWS, + MT_HEAD, + MT_BRUISER, + MT_BRUISERSHOT, + MT_KNIGHT, + MT_SKULL, + MT_SPIDER, + MT_BABY, + MT_CYBORG, + MT_PAIN, + MT_WOLFSS, + MT_KEEN, + MT_BOSSBRAIN, + MT_BOSSSPIT, + MT_BOSSTARGET, + MT_SPAWNSHOT, + MT_SPAWNFIRE, + MT_BARREL, + MT_TROOPSHOT, + MT_HEADSHOT, + MT_ROCKET, + MT_PLASMA, + MT_BFG, + MT_ARACHPLAZ, + MT_PUFF, + MT_BLOOD, + MT_TFOG, + MT_IFOG, + MT_TELEPORTMAN, + MT_EXTRABFG, + MT_MISC0, + MT_MISC1, + MT_MISC2, + MT_MISC3, + MT_MISC4, + MT_MISC5, + MT_MISC6, + MT_MISC7, + MT_MISC8, + MT_MISC9, + MT_MISC10, + MT_MISC11, + MT_MISC12, + MT_INV, + MT_MISC13, + MT_INS, + MT_MISC14, + MT_MISC15, + MT_MISC16, + MT_MEGA, + MT_CLIP, + MT_MISC17, + MT_MISC18, + MT_MISC19, + MT_MISC20, + MT_MISC21, + MT_MISC22, + MT_MISC23, + MT_MISC24, + MT_MISC25, + MT_CHAINGUN, + MT_MISC26, + MT_MISC27, + MT_MISC28, + MT_SHOTGUN, + MT_SUPERSHOTGUN, + MT_MISC29, + MT_MISC30, + MT_MISC31, + MT_MISC32, + MT_MISC33, + MT_MISC34, + MT_MISC35, + MT_MISC36, + MT_MISC37, + MT_MISC38, + MT_MISC39, + MT_MISC40, + MT_MISC41, + MT_MISC42, + MT_MISC43, + MT_MISC44, + MT_MISC45, + MT_MISC46, + MT_MISC47, + MT_MISC48, + MT_MISC49, + MT_MISC50, + MT_MISC51, + MT_MISC52, + MT_MISC53, + MT_MISC54, + MT_MISC55, + MT_MISC56, + MT_MISC57, + MT_MISC58, + MT_MISC59, + MT_MISC60, + MT_MISC61, + MT_MISC62, + MT_MISC63, + MT_MISC64, + MT_MISC65, + MT_MISC66, + MT_MISC67, + MT_MISC68, + MT_MISC69, + MT_MISC70, + MT_MISC71, + MT_MISC72, + MT_MISC73, + MT_MISC74, + MT_MISC75, + MT_MISC76, + MT_MISC77, + MT_MISC78, + MT_MISC79, + MT_MISC80, + MT_MISC81, + MT_MISC82, + MT_MISC83, + MT_MISC84, + MT_MISC85, + MT_MISC86, + NUMMOBJTYPES + +} mobjtype_t; + +typedef struct +{ + int doomednum; + int spawnstate; + int spawnhealth; + int seestate; + int seesound; + int reactiontime; + int attacksound; + int painstate; + int painchance; + int painsound; + int meleestate; + int missilestate; + int deathstate; + int xdeathstate; + int deathsound; + int speed; + int radius; + int height; + int mass; + int damage; + int activesound; + int flags; + int raisestate; + +} mobjinfo_t; + +extern mobjinfo_t mobjinfo[NUMMOBJTYPES]; + +#endif diff --git a/firmware_p4/components/Applications/doom/linker.lf b/firmware_p4/components/Applications/doom/linker.lf new file mode 100644 index 000000000..1562f4de9 --- /dev/null +++ b/firmware_p4/components/Applications/doom/linker.lf @@ -0,0 +1,22 @@ +# Move the DOOM engine's large static .bss/.common out of scarce internal SRAM +# and into PSRAM. libdoom.a parks ~300 KB in internal RAM at link time (visplanes +# ~85 KB, openings ~41 KB, ticdata, viewangletox, drawsegs, zlight, vissprites, +# ...), which starves the whole system to ~14 KB free internal — so entering DOOM +# fails to get the ST7789 SPI-DMA bounce buffer ("Failed to allocate priv TX +# buffer") and every blit dies. +# +# These are CPU-only renderer scratch buffers (the real double framebuffer is +# malloc'd in PSRAM already), so PSRAM placement is safe — no DMA touches them. +# Only .bss/.common move; initialized .data (states, mobjinfo, S_sfx) stays +# internal. Requires CONFIG_SPIRAM_ALLOW_BSS_SEG_EXTERNAL_MEMORY=y for the +# extern_ram region to exist. + +[scheme:doom_extram] +entries: + bss -> extern_ram + common -> extern_ram + +[mapping:doom] +archive: libdoom.a +entries: + * (doom_extram) diff --git a/firmware_p4/components/Applications/doom/m_argv.c b/firmware_p4/components/Applications/doom/m_argv.c new file mode 100644 index 000000000..1582450fe --- /dev/null +++ b/firmware_p4/components/Applications/doom/m_argv.c @@ -0,0 +1,265 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// + + +#include +#include +#include +#include + +#include "doomtype.h" +#include "i_system.h" +#include "m_misc.h" +#include "m_argv.h" // haleyjd 20110212: warning fix + +int myargc; +char** myargv; + + + + +// +// M_CheckParm +// Checks for the given parameter +// in the program's command line arguments. +// Returns the argument number (1 to argc-1) +// or 0 if not present +// + +int M_CheckParmWithArgs(char *check, int num_args) +{ + int i; + + for (i = 1; i < myargc - num_args; i++) + { + if (!strcasecmp(check, myargv[i])) + return i; + } + + return 0; +} + +// +// M_ParmExists +// +// Returns true if the given parameter exists in the program's command +// line arguments, false if not. +// + +boolean M_ParmExists(char *check) +{ + return M_CheckParm(check) != 0; +} + +int M_CheckParm(char *check) +{ + return M_CheckParmWithArgs(check, 0); +} + +#define MAXARGVS 100 + +static void LoadResponseFile(int argv_index) +{ +#if ORIGCODE + FILE *handle; + int size; + char *infile; + char *file; + char *response_filename; + char **newargv; + int newargc; + int i, k; + + response_filename = myargv[argv_index] + 1; + + // Read the response file into memory + handle = fopen(response_filename, "rb"); + + if (handle == NULL) + { + printf ("\nNo such response file!"); +#if ORIGCODE + exit(1); +#endif + } + + printf("Found response file %s!\n", response_filename); + + size = M_FileLength(handle); + + // Read in the entire file + // Allocate one byte extra - this is in case there is an argument + // at the end of the response file, in which case a '\0' will be + // needed. + + file = malloc(size + 1); + + i = 0; + + while (i < size) + { + k = fread(file + i, 1, size - i, handle); + + if (k < 0) + { + I_Error("Failed to read full contents of '%s'", response_filename); + } + + i += k; + } + + fclose(handle); + + // Create new arguments list array + + newargv = malloc(sizeof(char *) * MAXARGVS); + newargc = 0; + memset(newargv, 0, sizeof(char *) * MAXARGVS); + + // Copy all the arguments in the list up to the response file + + for (i=0; i= size) + { + break; + } + + // If the next argument is enclosed in quote marks, treat + // the contents as a single argument. This allows long filenames + // to be specified. + + if (infile[k] == '\"') + { + // Skip the first character(") + ++k; + + newargv[newargc++] = &infile[k]; + + // Read all characters between quotes + + while (k < size && infile[k] != '\"' && infile[k] != '\n') + { + ++k; + } + + if (k >= size || infile[k] == '\n') + { + I_Error("Quotes unclosed in response file '%s'", + response_filename); + } + + // Cut off the string at the closing quote + + infile[k] = '\0'; + ++k; + } + else + { + // Read in the next argument until a space is reached + + newargv[newargc++] = &infile[k]; + + while(k < size && !isspace((int)infile[k])) + { + ++k; + } + + // Cut off the end of the argument at the first space + + infile[k] = '\0'; + + ++k; + } + } + + // Add arguments following the response file argument + + for (i=argv_index + 1; ibox[BOXRIGHT]) + box[BOXRIGHT] = x; + if (ybox[BOXTOP]) + box[BOXTOP] = y; +} + + + + + diff --git a/firmware_p4/components/Applications/doom/m_bbox.h b/firmware_p4/components/Applications/doom/m_bbox.h new file mode 100644 index 000000000..5a7af57c4 --- /dev/null +++ b/firmware_p4/components/Applications/doom/m_bbox.h @@ -0,0 +1,47 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Nil. +// + + +#ifndef __M_BBOX__ +#define __M_BBOX__ + +#include + +#include "m_fixed.h" + + +// Bounding box coordinate storage. +enum +{ + BOXTOP, + BOXBOTTOM, + BOXLEFT, + BOXRIGHT +}; // bbox coordinates + +// Bounding box functions. +void M_ClearBox (fixed_t* box); + +void +M_AddToBox +( fixed_t* box, + fixed_t x, + fixed_t y ); + + +#endif diff --git a/firmware_p4/components/Applications/doom/m_cheat.c b/firmware_p4/components/Applications/doom/m_cheat.c new file mode 100644 index 000000000..1565f9ef5 --- /dev/null +++ b/firmware_p4/components/Applications/doom/m_cheat.c @@ -0,0 +1,89 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Cheat sequence checking. +// + + + +#include + +#include "doomtype.h" +#include "m_cheat.h" + +// +// CHEAT SEQUENCE PACKAGE +// + +// +// Called in st_stuff module, which handles the input. +// Returns a 1 if the cheat was successful, 0 if failed. +// +int +cht_CheckCheat +( cheatseq_t* cht, + char key ) +{ + // if we make a short sequence on a cheat with parameters, this + // will not work in vanilla doom. behave the same. + + if (cht->parameter_chars > 0 && strlen(cht->sequence) < cht->sequence_len) + return false; + + if (cht->chars_read < strlen(cht->sequence)) + { + // still reading characters from the cheat code + // and verifying. reset back to the beginning + // if a key is wrong + + if (key == cht->sequence[cht->chars_read]) + ++cht->chars_read; + else + cht->chars_read = 0; + + cht->param_chars_read = 0; + } + else if (cht->param_chars_read < cht->parameter_chars) + { + // we have passed the end of the cheat sequence and are + // entering parameters now + + cht->parameter_buf[cht->param_chars_read] = key; + + ++cht->param_chars_read; + } + + if (cht->chars_read >= strlen(cht->sequence) + && cht->param_chars_read >= cht->parameter_chars) + { + cht->chars_read = cht->param_chars_read = 0; + + return true; + } + + // cheat not matched yet + + return false; +} + +void +cht_GetParam +( cheatseq_t* cht, + char* buffer ) +{ + memcpy(buffer, cht->parameter_buf, cht->parameter_chars); +} + + diff --git a/firmware_p4/components/Applications/doom/m_cheat.h b/firmware_p4/components/Applications/doom/m_cheat.h new file mode 100644 index 000000000..6775e709e --- /dev/null +++ b/firmware_p4/components/Applications/doom/m_cheat.h @@ -0,0 +1,62 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Cheat code checking. +// + + +#ifndef __M_CHEAT__ +#define __M_CHEAT__ + +// +// CHEAT SEQUENCE PACKAGE +// + +// declaring a cheat + +#define CHEAT(value, parameters) \ + { value, sizeof(value) - 1, parameters, 0, 0, "" } + +#define MAX_CHEAT_LEN 25 +#define MAX_CHEAT_PARAMS 5 + +typedef struct +{ + // settings for this cheat + + char sequence[MAX_CHEAT_LEN]; + size_t sequence_len; + int parameter_chars; + + // state used during the game + + size_t chars_read; + int param_chars_read; + char parameter_buf[MAX_CHEAT_PARAMS]; +} cheatseq_t; + +int +cht_CheckCheat +( cheatseq_t* cht, + char key ); + + +void +cht_GetParam +( cheatseq_t* cht, + char* buffer ); + + +#endif diff --git a/firmware_p4/components/Applications/doom/m_config.c b/firmware_p4/components/Applications/doom/m_config.c new file mode 100644 index 000000000..865e16842 --- /dev/null +++ b/firmware_p4/components/Applications/doom/m_config.c @@ -0,0 +1,2128 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 1993-2008 Raven Software +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Configuration file interface. +// + + +#include +#include +#include +#include +#include + +#include "config.h" + +#include "doomtype.h" +#include "doomkeys.h" +#include "doomfeatures.h" +#include "i_system.h" +#include "m_argv.h" +#include "m_misc.h" + +#include "z_zone.h" + +// +// DEFAULTS +// + +// Location where all configuration data is stored - +// default.cfg, savegames, etc. + +char *configdir; + +// Default filenames for configuration files. + +static char *default_main_config; +static char *default_extra_config; + +typedef enum +{ + DEFAULT_INT, + DEFAULT_INT_HEX, + DEFAULT_STRING, + DEFAULT_FLOAT, + DEFAULT_KEY, +} default_type_t; + +typedef struct +{ + // Name of the variable + char *name; + + // Pointer to the location in memory of the variable + void *location; + + // Type of the variable + default_type_t type; + + // If this is a key value, the original integer scancode we read from + // the config file before translating it to the internal key value. + // If zero, we didn't read this value from a config file. + int untranslated; + + // The value we translated the scancode into when we read the + // config file on startup. If the variable value is different from + // this, it has been changed and needs to be converted; otherwise, + // use the 'untranslated' value. + int original_translated; + + // If true, this config variable has been bound to a variable + // and is being used. + boolean bound; +} default_t; + +typedef struct +{ + default_t *defaults; + int numdefaults; + char *filename; +} default_collection_t; + +#define CONFIG_VARIABLE_GENERIC(name, type) \ + { #name, NULL, type, 0, 0, false } + +#define CONFIG_VARIABLE_KEY(name) \ + CONFIG_VARIABLE_GENERIC(name, DEFAULT_KEY) +#define CONFIG_VARIABLE_INT(name) \ + CONFIG_VARIABLE_GENERIC(name, DEFAULT_INT) +#define CONFIG_VARIABLE_INT_HEX(name) \ + CONFIG_VARIABLE_GENERIC(name, DEFAULT_INT_HEX) +#define CONFIG_VARIABLE_FLOAT(name) \ + CONFIG_VARIABLE_GENERIC(name, DEFAULT_FLOAT) +#define CONFIG_VARIABLE_STRING(name) \ + CONFIG_VARIABLE_GENERIC(name, DEFAULT_STRING) + +//! @begin_config_file default + +static default_t doom_defaults_list[] = +{ + //! + // Mouse sensitivity. This value is used to multiply input mouse + // movement to control the effect of moving the mouse. + // + // The "normal" maximum value available for this through the + // in-game options menu is 9. A value of 31 or greater will cause + // the game to crash when entering the options menu. + // + + CONFIG_VARIABLE_INT(mouse_sensitivity), + + //! + // Volume of sound effects, range 0-15. + // + + CONFIG_VARIABLE_INT(sfx_volume), + + //! + // Volume of in-game music, range 0-15. + // + + CONFIG_VARIABLE_INT(music_volume), + + //! + // @game strife + // + // If non-zero, dialogue text is displayed over characters' pictures + // when engaging actors who have voices. + // + + CONFIG_VARIABLE_INT(show_talk), + + //! + // @game strife + // + // Volume of voice sound effects, range 0-15. + // + + CONFIG_VARIABLE_INT(voice_volume), + + //! + // @game doom + // + // If non-zero, messages are displayed on the heads-up display + // in the game ("picked up a clip", etc). If zero, these messages + // are not displayed. + // + + CONFIG_VARIABLE_INT(show_messages), + + //! + // Keyboard key to turn right. + // + + CONFIG_VARIABLE_KEY(key_right), + + //! + // Keyboard key to turn left. + // + + CONFIG_VARIABLE_KEY(key_left), + + //! + // Keyboard key to move forward. + // + + CONFIG_VARIABLE_KEY(key_up), + + //! + // Keyboard key to move backward. + // + + CONFIG_VARIABLE_KEY(key_down), + + //! + // Keyboard key to strafe left. + // + + CONFIG_VARIABLE_KEY(key_strafeleft), + + //! + // Keyboard key to strafe right. + // + + CONFIG_VARIABLE_KEY(key_straferight), + + //! + // @game strife + // + // Keyboard key to use health. + // + + CONFIG_VARIABLE_KEY(key_useHealth), + + //! + // @game hexen + // + // Keyboard key to jump. + // + + CONFIG_VARIABLE_KEY(key_jump), + + //! + // @game heretic hexen + // + // Keyboard key to fly upward. + // + + CONFIG_VARIABLE_KEY(key_flyup), + + //! + // @game heretic hexen + // + // Keyboard key to fly downwards. + // + + CONFIG_VARIABLE_KEY(key_flydown), + + //! + // @game heretic hexen + // + // Keyboard key to center flying. + // + + CONFIG_VARIABLE_KEY(key_flycenter), + + //! + // @game heretic hexen + // + // Keyboard key to look up. + // + + CONFIG_VARIABLE_KEY(key_lookup), + + //! + // @game heretic hexen + // + // Keyboard key to look down. + // + + CONFIG_VARIABLE_KEY(key_lookdown), + + //! + // @game heretic hexen + // + // Keyboard key to center the view. + // + + CONFIG_VARIABLE_KEY(key_lookcenter), + + //! + // @game strife + // + // Keyboard key to query inventory. + // + + CONFIG_VARIABLE_KEY(key_invquery), + + //! + // @game strife + // + // Keyboard key to display mission objective. + // + + CONFIG_VARIABLE_KEY(key_mission), + + //! + // @game strife + // + // Keyboard key to display inventory popup. + // + + CONFIG_VARIABLE_KEY(key_invPop), + + //! + // @game strife + // + // Keyboard key to display keys popup. + // + + CONFIG_VARIABLE_KEY(key_invKey), + + //! + // @game strife + // + // Keyboard key to jump to start of inventory. + // + + CONFIG_VARIABLE_KEY(key_invHome), + + //! + // @game strife + // + // Keyboard key to jump to end of inventory. + // + + CONFIG_VARIABLE_KEY(key_invEnd), + + //! + // @game heretic hexen + // + // Keyboard key to scroll left in the inventory. + // + + CONFIG_VARIABLE_KEY(key_invleft), + + //! + // @game heretic hexen + // + // Keyboard key to scroll right in the inventory. + // + + CONFIG_VARIABLE_KEY(key_invright), + + //! + // @game strife + // + // Keyboard key to scroll left in the inventory. + // + + CONFIG_VARIABLE_KEY(key_invLeft), + + //! + // @game strife + // + // Keyboard key to scroll right in the inventory. + // + + CONFIG_VARIABLE_KEY(key_invRight), + + //! + // @game heretic hexen + // + // Keyboard key to use the current item in the inventory. + // + + CONFIG_VARIABLE_KEY(key_useartifact), + + //! + // @game strife + // + // Keyboard key to use inventory item. + // + + CONFIG_VARIABLE_KEY(key_invUse), + + //! + // @game strife + // + // Keyboard key to drop an inventory item. + // + + CONFIG_VARIABLE_KEY(key_invDrop), + + //! + // @game strife + // + // Keyboard key to look up. + // + + CONFIG_VARIABLE_KEY(key_lookUp), + + //! + // @game strife + // + // Keyboard key to look down. + // + + CONFIG_VARIABLE_KEY(key_lookDown), + + //! + // Keyboard key to fire the currently selected weapon. + // + + CONFIG_VARIABLE_KEY(key_fire), + + //! + // Keyboard key to "use" an object, eg. a door or switch. + // + + CONFIG_VARIABLE_KEY(key_use), + + //! + // Keyboard key to turn on strafing. When held down, pressing the + // key to turn left or right causes the player to strafe left or + // right instead. + // + + CONFIG_VARIABLE_KEY(key_strafe), + + //! + // Keyboard key to make the player run. + // + + CONFIG_VARIABLE_KEY(key_speed), + + //! + // If non-zero, mouse input is enabled. If zero, mouse input is + // disabled. + // + + CONFIG_VARIABLE_INT(use_mouse), + + //! + // Mouse button to fire the currently selected weapon. + // + + CONFIG_VARIABLE_INT(mouseb_fire), + + //! + // Mouse button to turn on strafing. When held down, the player + // will strafe left and right instead of turning left and right. + // + + CONFIG_VARIABLE_INT(mouseb_strafe), + + //! + // Mouse button to move forward. + // + + CONFIG_VARIABLE_INT(mouseb_forward), + + //! + // @game hexen strife + // + // Mouse button to jump. + // + + CONFIG_VARIABLE_INT(mouseb_jump), + + //! + // If non-zero, joystick input is enabled. + // + + CONFIG_VARIABLE_INT(use_joystick), + + //! + // Joystick virtual button that fires the current weapon. + // + + CONFIG_VARIABLE_INT(joyb_fire), + + //! + // Joystick virtual button that makes the player strafe while + // held down. + // + + CONFIG_VARIABLE_INT(joyb_strafe), + + //! + // Joystick virtual button to "use" an object, eg. a door or switch. + // + + CONFIG_VARIABLE_INT(joyb_use), + + //! + // Joystick virtual button that makes the player run while held + // down. + // + // If this has a value of 20 or greater, the player will always run, + // even if use_joystick is 0. + // + + CONFIG_VARIABLE_INT(joyb_speed), + + //! + // @game hexen strife + // + // Joystick virtual button that makes the player jump. + // + + CONFIG_VARIABLE_INT(joyb_jump), + + //! + // @game doom heretic hexen + // + // Screen size, range 3-11. + // + // A value of 11 gives a full-screen view with the status bar not + // displayed. A value of 10 gives a full-screen view with the + // status bar displayed. + // + + CONFIG_VARIABLE_INT(screenblocks), + + //! + // @game strife + // + // Screen size, range 3-11. + // + // A value of 11 gives a full-screen view with the status bar not + // displayed. A value of 10 gives a full-screen view with the + // status bar displayed. + // + + CONFIG_VARIABLE_INT(screensize), + + //! + // @game doom + // + // Screen detail. Zero gives normal "high detail" mode, while + // a non-zero value gives "low detail" mode. + // + + CONFIG_VARIABLE_INT(detaillevel), + + //! + // Number of sounds that will be played simultaneously. + // + + CONFIG_VARIABLE_INT(snd_channels), + + //! + // Music output device. A non-zero value gives MIDI sound output, + // while a value of zero disables music. + // + + CONFIG_VARIABLE_INT(snd_musicdevice), + + //! + // Sound effects device. A value of zero disables in-game sound + // effects, a value of 1 enables PC speaker sound effects, while + // a value in the range 2-9 enables the "normal" digital sound + // effects. + // + + CONFIG_VARIABLE_INT(snd_sfxdevice), + + //! + // SoundBlaster I/O port. Unused. + // + + CONFIG_VARIABLE_INT(snd_sbport), + + //! + // SoundBlaster IRQ. Unused. + // + + CONFIG_VARIABLE_INT(snd_sbirq), + + //! + // SoundBlaster DMA channel. Unused. + // + + CONFIG_VARIABLE_INT(snd_sbdma), + + //! + // Output port to use for OPL MIDI playback. Unused. + // + + CONFIG_VARIABLE_INT(snd_mport), + + //! + // Gamma correction level. A value of zero disables gamma + // correction, while a value in the range 1-4 gives increasing + // levels of gamma correction. + // + + CONFIG_VARIABLE_INT(usegamma), + + //! + // @game hexen + // + // Directory in which to store savegames. + // + + CONFIG_VARIABLE_STRING(savedir), + + //! + // @game hexen + // + // Controls whether messages are displayed in the heads-up display. + // If this has a non-zero value, messages are displayed. + // + + CONFIG_VARIABLE_INT(messageson), + + //! + // @game strife + // + // Name of background flat used by view border. + // + + CONFIG_VARIABLE_STRING(back_flat), + + //! + // @game strife + // + // Multiplayer nickname (?). + // + + CONFIG_VARIABLE_STRING(nickname), + + //! + // Multiplayer chat macro: message to send when alt+0 is pressed. + // + + CONFIG_VARIABLE_STRING(chatmacro0), + + //! + // Multiplayer chat macro: message to send when alt+1 is pressed. + // + + CONFIG_VARIABLE_STRING(chatmacro1), + + //! + // Multiplayer chat macro: message to send when alt+2 is pressed. + // + + CONFIG_VARIABLE_STRING(chatmacro2), + + //! + // Multiplayer chat macro: message to send when alt+3 is pressed. + // + + CONFIG_VARIABLE_STRING(chatmacro3), + + //! + // Multiplayer chat macro: message to send when alt+4 is pressed. + // + + CONFIG_VARIABLE_STRING(chatmacro4), + + //! + // Multiplayer chat macro: message to send when alt+5 is pressed. + // + + CONFIG_VARIABLE_STRING(chatmacro5), + + //! + // Multiplayer chat macro: message to send when alt+6 is pressed. + // + + CONFIG_VARIABLE_STRING(chatmacro6), + + //! + // Multiplayer chat macro: message to send when alt+7 is pressed. + // + + CONFIG_VARIABLE_STRING(chatmacro7), + + //! + // Multiplayer chat macro: message to send when alt+8 is pressed. + // + + CONFIG_VARIABLE_STRING(chatmacro8), + + //! + // Multiplayer chat macro: message to send when alt+9 is pressed. + // + + CONFIG_VARIABLE_STRING(chatmacro9), + + //! + // @game strife + // + // Serial port number to use for SERSETUP.EXE (unused). + // + + CONFIG_VARIABLE_INT(comport), +}; + +static default_collection_t doom_defaults = +{ + doom_defaults_list, + arrlen(doom_defaults_list), + NULL, +}; + +//! @begin_config_file extended + +static default_t extra_defaults_list[] = +{ + //! + // @game heretic hexen strife + // + // If non-zero, display the graphical startup screen. + // + + CONFIG_VARIABLE_INT(graphical_startup), + + //! + // If non-zero, video settings will be autoadjusted to a valid + // configuration when the screen_width and screen_height variables + // do not match any valid configuration. + // + + CONFIG_VARIABLE_INT(autoadjust_video_settings), + + //! + // If non-zero, the game will run in full screen mode. If zero, + // the game will run in a window. + // + + CONFIG_VARIABLE_INT(fullscreen), + + //! + // If non-zero, the screen will be stretched vertically to display + // correctly on a square pixel video mode. + // + + CONFIG_VARIABLE_INT(aspect_ratio_correct), + + //! + // Number of milliseconds to wait on startup after the video mode + // has been set, before the game will start. This allows the + // screen to settle on some monitors that do not display an image + // for a brief interval after changing video modes. + // + + CONFIG_VARIABLE_INT(startup_delay), + + //! + // Screen width in pixels. If running in full screen mode, this is + // the X dimension of the video mode to use. If running in + // windowed mode, this is the width of the window in which the game + // will run. + // + + CONFIG_VARIABLE_INT(screen_width), + + //! + // Screen height in pixels. If running in full screen mode, this is + // the Y dimension of the video mode to use. If running in + // windowed mode, this is the height of the window in which the game + // will run. + // + + CONFIG_VARIABLE_INT(screen_height), + + //! + // Color depth of the screen, in bits. + // If this is set to zero, the color depth will be automatically set + // on startup to the machine's default/native color depth. + // + + CONFIG_VARIABLE_INT(screen_bpp), + + //! + // If this is non-zero, the mouse will be "grabbed" when running + // in windowed mode so that it can be used as an input device. + // When running full screen, this has no effect. + // + + CONFIG_VARIABLE_INT(grabmouse), + + //! + // If non-zero, all vertical mouse movement is ignored. This + // emulates the behavior of the "novert" tool available under DOS + // that performs the same function. + // + + CONFIG_VARIABLE_INT(novert), + + //! + // Mouse acceleration factor. When the speed of mouse movement + // exceeds the threshold value (mouse_threshold), the speed is + // multiplied by this value. + // + + CONFIG_VARIABLE_FLOAT(mouse_acceleration), + + //! + // Mouse acceleration threshold. When the speed of mouse movement + // exceeds this threshold value, the speed is multiplied by an + // acceleration factor (mouse_acceleration). + // + + CONFIG_VARIABLE_INT(mouse_threshold), + + //! + // Sound output sample rate, in Hz. Typical values to use are + // 11025, 22050, 44100 and 48000. + // + + CONFIG_VARIABLE_INT(snd_samplerate), + + //! + // Maximum number of bytes to allocate for caching converted sound + // effects in memory. If set to zero, there is no limit applied. + // + + CONFIG_VARIABLE_INT(snd_cachesize), + + //! + // Maximum size of the output sound buffer size in milliseconds. + // Sound output is generated periodically in slices. Higher values + // might be more efficient but will introduce latency to the + // sound output. The default is 28ms (one slice per tic with the + // 35fps timer). + + CONFIG_VARIABLE_INT(snd_maxslicetime_ms), + + //! + // External command to invoke to perform MIDI playback. If set to + // the empty string, SDL_mixer's internal MIDI playback is used. + // This only has any effect when snd_musicdevice is set to General + // MIDI output. + + CONFIG_VARIABLE_STRING(snd_musiccmd), + + //! + // The I/O port to use to access the OPL chip. Only relevant when + // using native OPL music playback. + // + + CONFIG_VARIABLE_INT_HEX(opl_io_port), + + //! + // @game doom heretic strife + // + // If non-zero, the ENDOOM text screen is displayed when exiting the + // game. If zero, the ENDOOM screen is not displayed. + // + + CONFIG_VARIABLE_INT(show_endoom), + + //! + // If non-zero, save screenshots in PNG format. + // + + CONFIG_VARIABLE_INT(png_screenshots), + + //! + // @game doom strife + // + // If non-zero, the Vanilla savegame limit is enforced; if the + // savegame exceeds 180224 bytes in size, the game will exit with + // an error. If this has a value of zero, there is no limit to + // the size of savegames. + // + + CONFIG_VARIABLE_INT(vanilla_savegame_limit), + + //! + // @game doom strife + // + // If non-zero, the Vanilla demo size limit is enforced; the game + // exits with an error when a demo exceeds the demo size limit + // (128KiB by default). If this has a value of zero, there is no + // limit to the size of demos. + // + + CONFIG_VARIABLE_INT(vanilla_demo_limit), + + //! + // If non-zero, the game behaves like Vanilla Doom, always assuming + // an American keyboard mapping. If this has a value of zero, the + // native keyboard mapping of the keyboard is used. + // + + CONFIG_VARIABLE_INT(vanilla_keyboard_mapping), + + //! + // Name of the SDL video driver to use. If this is an empty string, + // the default video driver is used. + // + + CONFIG_VARIABLE_STRING(video_driver), + + //! + // Position of the window on the screen when running in windowed + // mode. Accepted values are: "" (empty string) - don't care, + // "center" - place window at center of screen, "x,y" - place + // window at the specified coordinates. + + CONFIG_VARIABLE_STRING(window_position), + +#ifdef FEATURE_MULTIPLAYER + + //! + // Name to use in network games for identification. This is only + // used on the "waiting" screen while waiting for the game to start. + // + + CONFIG_VARIABLE_STRING(player_name), + +#endif + + //! + // Joystick number to use; '0' is the first joystick. A negative + // value ('-1') indicates that no joystick is configured. + // + + CONFIG_VARIABLE_INT(joystick_index), + + //! + // Joystick axis to use to for horizontal (X) movement. + // + + CONFIG_VARIABLE_INT(joystick_x_axis), + + //! + // If non-zero, movement on the horizontal joystick axis is inverted. + // + + CONFIG_VARIABLE_INT(joystick_x_invert), + + //! + // Joystick axis to use to for vertical (Y) movement. + // + + CONFIG_VARIABLE_INT(joystick_y_axis), + + //! + // If non-zero, movement on the vertical joystick axis is inverted. + // + + CONFIG_VARIABLE_INT(joystick_y_invert), + + //! + // Joystick axis to use to for strafing movement. + // + + CONFIG_VARIABLE_INT(joystick_strafe_axis), + + //! + // If non-zero, movement on the joystick axis used for strafing + // is inverted. + // + + CONFIG_VARIABLE_INT(joystick_strafe_invert), + + //! + // The physical joystick button that corresponds to joystick + // virtual button #0. + // + + CONFIG_VARIABLE_INT(joystick_physical_button0), + + //! + // The physical joystick button that corresponds to joystick + // virtual button #1. + // + + CONFIG_VARIABLE_INT(joystick_physical_button1), + + //! + // The physical joystick button that corresponds to joystick + // virtual button #2. + // + + CONFIG_VARIABLE_INT(joystick_physical_button2), + + //! + // The physical joystick button that corresponds to joystick + // virtual button #3. + // + + CONFIG_VARIABLE_INT(joystick_physical_button3), + + //! + // The physical joystick button that corresponds to joystick + // virtual button #4. + // + + CONFIG_VARIABLE_INT(joystick_physical_button4), + + //! + // The physical joystick button that corresponds to joystick + // virtual button #5. + // + + CONFIG_VARIABLE_INT(joystick_physical_button5), + + //! + // The physical joystick button that corresponds to joystick + // virtual button #6. + // + + CONFIG_VARIABLE_INT(joystick_physical_button6), + + //! + // The physical joystick button that corresponds to joystick + // virtual button #7. + // + + CONFIG_VARIABLE_INT(joystick_physical_button7), + + //! + // The physical joystick button that corresponds to joystick + // virtual button #8. + // + + CONFIG_VARIABLE_INT(joystick_physical_button8), + + //! + // The physical joystick button that corresponds to joystick + // virtual button #9. + // + + CONFIG_VARIABLE_INT(joystick_physical_button9), + + //! + // Joystick virtual button to make the player strafe left. + // + + CONFIG_VARIABLE_INT(joyb_strafeleft), + + //! + // Joystick virtual button to make the player strafe right. + // + + CONFIG_VARIABLE_INT(joyb_straferight), + + //! + // Joystick virtual button to activate the menu. + // + + CONFIG_VARIABLE_INT(joyb_menu_activate), + + //! + // Joystick virtual button that cycles to the previous weapon. + // + + CONFIG_VARIABLE_INT(joyb_prevweapon), + + //! + // Joystick virtual button that cycles to the next weapon. + // + + CONFIG_VARIABLE_INT(joyb_nextweapon), + + //! + // Mouse button to strafe left. + // + + CONFIG_VARIABLE_INT(mouseb_strafeleft), + + //! + // Mouse button to strafe right. + // + + CONFIG_VARIABLE_INT(mouseb_straferight), + + //! + // Mouse button to "use" an object, eg. a door or switch. + // + + CONFIG_VARIABLE_INT(mouseb_use), + + //! + // Mouse button to move backwards. + // + + CONFIG_VARIABLE_INT(mouseb_backward), + + //! + // Mouse button to cycle to the previous weapon. + // + + CONFIG_VARIABLE_INT(mouseb_prevweapon), + + //! + // Mouse button to cycle to the next weapon. + // + + CONFIG_VARIABLE_INT(mouseb_nextweapon), + + //! + // If non-zero, double-clicking a mouse button acts like pressing + // the "use" key to use an object in-game, eg. a door or switch. + // + + CONFIG_VARIABLE_INT(dclick_use), + +#ifdef FEATURE_SOUND + + //! + // Controls whether libsamplerate support is used for performing + // sample rate conversions of sound effects. Support for this + // must be compiled into the program. + // + // If zero, libsamplerate support is disabled. If non-zero, + // libsamplerate is enabled. Increasing values roughly correspond + // to higher quality conversion; the higher the quality, the + // slower the conversion process. Linear conversion = 1; + // Zero order hold = 2; Fast Sinc filter = 3; Medium quality + // Sinc filter = 4; High quality Sinc filter = 5. + // + + CONFIG_VARIABLE_INT(use_libsamplerate), + + //! + // Scaling factor used by libsamplerate. This is used when converting + // sounds internally back into integer form; normally it should not + // be necessary to change it from the default value. The only time + // it might be needed is if a PWAD file is loaded that contains very + // loud sounds, in which case the conversion may cause sound clipping + // and the scale factor should be reduced. The lower the value, the + // quieter the sound effects become, so it should be set as high as is + // possible without clipping occurring. + + CONFIG_VARIABLE_FLOAT(libsamplerate_scale), + + //! + // Full path to a Timidity configuration file to use for MIDI + // playback. The file will be evaluated from the directory where + // it is evaluated, so there is no need to add "dir" commands + // into it. + // + + CONFIG_VARIABLE_STRING(timidity_cfg_path), + + //! + // Path to GUS patch files to use when operating in GUS emulation + // mode. + // + + CONFIG_VARIABLE_STRING(gus_patch_path), + + //! + // Number of kilobytes of RAM to use in GUS emulation mode. Valid + // values are 256, 512, 768 or 1024. + // + + CONFIG_VARIABLE_INT(gus_ram_kb), + +#endif + + //! + // Key to pause or unpause the game. + // + + CONFIG_VARIABLE_KEY(key_pause), + + //! + // Key that activates the menu when pressed. + // + + CONFIG_VARIABLE_KEY(key_menu_activate), + + //! + // Key that moves the cursor up on the menu. + // + + CONFIG_VARIABLE_KEY(key_menu_up), + + //! + // Key that moves the cursor down on the menu. + // + + CONFIG_VARIABLE_KEY(key_menu_down), + + //! + // Key that moves the currently selected slider on the menu left. + // + + CONFIG_VARIABLE_KEY(key_menu_left), + + //! + // Key that moves the currently selected slider on the menu right. + // + + CONFIG_VARIABLE_KEY(key_menu_right), + + //! + // Key to go back to the previous menu. + // + + CONFIG_VARIABLE_KEY(key_menu_back), + + //! + // Key to activate the currently selected menu item. + // + + CONFIG_VARIABLE_KEY(key_menu_forward), + + //! + // Key to answer 'yes' to a question in the menu. + // + + CONFIG_VARIABLE_KEY(key_menu_confirm), + + //! + // Key to answer 'no' to a question in the menu. + // + + CONFIG_VARIABLE_KEY(key_menu_abort), + + //! + // Keyboard shortcut to bring up the help screen. + // + + CONFIG_VARIABLE_KEY(key_menu_help), + + //! + // Keyboard shortcut to bring up the save game menu. + // + + CONFIG_VARIABLE_KEY(key_menu_save), + + //! + // Keyboard shortcut to bring up the load game menu. + // + + CONFIG_VARIABLE_KEY(key_menu_load), + + //! + // Keyboard shortcut to bring up the sound volume menu. + // + + CONFIG_VARIABLE_KEY(key_menu_volume), + + //! + // Keyboard shortcut to toggle the detail level. + // + + CONFIG_VARIABLE_KEY(key_menu_detail), + + //! + // Keyboard shortcut to quicksave the current game. + // + + CONFIG_VARIABLE_KEY(key_menu_qsave), + + //! + // Keyboard shortcut to end the game. + // + + CONFIG_VARIABLE_KEY(key_menu_endgame), + + //! + // Keyboard shortcut to toggle heads-up messages. + // + + CONFIG_VARIABLE_KEY(key_menu_messages), + + //! + // Keyboard shortcut to load the last quicksave. + // + + CONFIG_VARIABLE_KEY(key_menu_qload), + + //! + // Keyboard shortcut to quit the game. + // + + CONFIG_VARIABLE_KEY(key_menu_quit), + + //! + // Keyboard shortcut to toggle the gamma correction level. + // + + CONFIG_VARIABLE_KEY(key_menu_gamma), + + //! + // Keyboard shortcut to switch view in multiplayer. + // + + CONFIG_VARIABLE_KEY(key_spy), + + //! + // Keyboard shortcut to increase the screen size. + // + + CONFIG_VARIABLE_KEY(key_menu_incscreen), + + //! + // Keyboard shortcut to decrease the screen size. + // + + CONFIG_VARIABLE_KEY(key_menu_decscreen), + + //! + // Keyboard shortcut to save a screenshot. + // + + CONFIG_VARIABLE_KEY(key_menu_screenshot), + + //! + // Key to toggle the map view. + // + + CONFIG_VARIABLE_KEY(key_map_toggle), + + //! + // Key to pan north when in the map view. + // + + CONFIG_VARIABLE_KEY(key_map_north), + + //! + // Key to pan south when in the map view. + // + + CONFIG_VARIABLE_KEY(key_map_south), + + //! + // Key to pan east when in the map view. + // + + CONFIG_VARIABLE_KEY(key_map_east), + + //! + // Key to pan west when in the map view. + // + + CONFIG_VARIABLE_KEY(key_map_west), + + //! + // Key to zoom in when in the map view. + // + + CONFIG_VARIABLE_KEY(key_map_zoomin), + + //! + // Key to zoom out when in the map view. + // + + CONFIG_VARIABLE_KEY(key_map_zoomout), + + //! + // Key to zoom out the maximum amount when in the map view. + // + + CONFIG_VARIABLE_KEY(key_map_maxzoom), + + //! + // Key to toggle follow mode when in the map view. + // + + CONFIG_VARIABLE_KEY(key_map_follow), + + //! + // Key to toggle the grid display when in the map view. + // + + CONFIG_VARIABLE_KEY(key_map_grid), + + //! + // Key to set a mark when in the map view. + // + + CONFIG_VARIABLE_KEY(key_map_mark), + + //! + // Key to clear all marks when in the map view. + // + + CONFIG_VARIABLE_KEY(key_map_clearmark), + + //! + // Key to select weapon 1. + // + + CONFIG_VARIABLE_KEY(key_weapon1), + + //! + // Key to select weapon 2. + // + + CONFIG_VARIABLE_KEY(key_weapon2), + + //! + // Key to select weapon 3. + // + + CONFIG_VARIABLE_KEY(key_weapon3), + + //! + // Key to select weapon 4. + // + + CONFIG_VARIABLE_KEY(key_weapon4), + + //! + // Key to select weapon 5. + // + + CONFIG_VARIABLE_KEY(key_weapon5), + + //! + // Key to select weapon 6. + // + + CONFIG_VARIABLE_KEY(key_weapon6), + + //! + // Key to select weapon 7. + // + + CONFIG_VARIABLE_KEY(key_weapon7), + + //! + // Key to select weapon 8. + // + + CONFIG_VARIABLE_KEY(key_weapon8), + + //! + // Key to cycle to the previous weapon. + // + + CONFIG_VARIABLE_KEY(key_prevweapon), + + //! + // Key to cycle to the next weapon. + // + + CONFIG_VARIABLE_KEY(key_nextweapon), + + //! + // @game hexen + // + // Key to use one of each artifact. + // + + CONFIG_VARIABLE_KEY(key_arti_all), + + //! + // @game hexen + // + // Key to use "quartz flask" artifact. + // + + CONFIG_VARIABLE_KEY(key_arti_health), + + //! + // @game hexen + // + // Key to use "flechette" artifact. + // + + CONFIG_VARIABLE_KEY(key_arti_poisonbag), + + //! + // @game hexen + // + // Key to use "disc of repulsion" artifact. + // + + CONFIG_VARIABLE_KEY(key_arti_blastradius), + + //! + // @game hexen + // + // Key to use "chaos device" artifact. + // + + CONFIG_VARIABLE_KEY(key_arti_teleport), + + //! + // @game hexen + // + // Key to use "banishment device" artifact. + // + + CONFIG_VARIABLE_KEY(key_arti_teleportother), + + //! + // @game hexen + // + // Key to use "porkalator" artifact. + // + + CONFIG_VARIABLE_KEY(key_arti_egg), + + //! + // @game hexen + // + // Key to use "icon of the defender" artifact. + // + + CONFIG_VARIABLE_KEY(key_arti_invulnerability), + + //! + // Key to re-display last message. + // + + CONFIG_VARIABLE_KEY(key_message_refresh), + + //! + // Key to quit the game when recording a demo. + // + + CONFIG_VARIABLE_KEY(key_demo_quit), + + //! + // Key to send a message during multiplayer games. + // + + CONFIG_VARIABLE_KEY(key_multi_msg), + + //! + // Key to send a message to player 1 during multiplayer games. + // + + CONFIG_VARIABLE_KEY(key_multi_msgplayer1), + + //! + // Key to send a message to player 2 during multiplayer games. + // + + CONFIG_VARIABLE_KEY(key_multi_msgplayer2), + + //! + // Key to send a message to player 3 during multiplayer games. + // + + CONFIG_VARIABLE_KEY(key_multi_msgplayer3), + + //! + // Key to send a message to player 4 during multiplayer games. + // + + CONFIG_VARIABLE_KEY(key_multi_msgplayer4), + + //! + // @game hexen strife + // + // Key to send a message to player 5 during multiplayer games. + // + + CONFIG_VARIABLE_KEY(key_multi_msgplayer5), + + //! + // @game hexen strife + // + // Key to send a message to player 6 during multiplayer games. + // + + CONFIG_VARIABLE_KEY(key_multi_msgplayer6), + + //! + // @game hexen strife + // + // Key to send a message to player 7 during multiplayer games. + // + + CONFIG_VARIABLE_KEY(key_multi_msgplayer7), + + //! + // @game hexen strife + // + // Key to send a message to player 8 during multiplayer games. + // + + CONFIG_VARIABLE_KEY(key_multi_msgplayer8), +}; + +static default_collection_t extra_defaults = +{ + extra_defaults_list, + arrlen(extra_defaults_list), + NULL, +}; + +// Search a collection for a variable + +static default_t *SearchCollection(default_collection_t *collection, char *name) +{ + int i; + + for (i=0; inumdefaults; ++i) + { + if (!strcmp(name, collection->defaults[i].name)) + { + return &collection->defaults[i]; + } + } + + return NULL; +} + +// Mapping from DOS keyboard scan code to internal key code (as defined +// in doomkey.h). I think I (fraggle) reused this from somewhere else +// but I can't find where. Anyway, notes: +// * KEY_PAUSE is wrong - it's in the KEY_NUMLOCK spot. This shouldn't +// matter in terms of Vanilla compatibility because neither of +// those were valid for key bindings. +// * There is no proper scan code for PrintScreen (on DOS machines it +// sends an interrupt). So I added a fake scan code of 126 for it. +// The presence of this is important so we can bind PrintScreen as +// a screenshot key. +static const int scantokey[128] = +{ + 0 , 27, '1', '2', '3', '4', '5', '6', + '7', '8', '9', '0', '-', '=', KEY_BACKSPACE, 9, + 'q', 'w', 'e', 'r', 't', 'y', 'u', 'i', + 'o', 'p', '[', ']', 13, KEY_RCTRL, 'a', 's', + 'd', 'f', 'g', 'h', 'j', 'k', 'l', ';', + '\'', '`', KEY_RSHIFT,'\\', 'z', 'x', 'c', 'v', + 'b', 'n', 'm', ',', '.', '/', KEY_RSHIFT,KEYP_MULTIPLY, + KEY_RALT, ' ', KEY_CAPSLOCK,KEY_F1, KEY_F2, KEY_F3, KEY_F4, KEY_F5, + KEY_F6, KEY_F7, KEY_F8, KEY_F9, KEY_F10, /*KEY_NUMLOCK?*/KEY_PAUSE,KEY_SCRLCK,KEY_HOME, + KEY_UPARROW,KEY_PGUP,KEY_MINUS,KEY_LEFTARROW,KEYP_5,KEY_RIGHTARROW,KEYP_PLUS,KEY_END, + KEY_DOWNARROW,KEY_PGDN,KEY_INS,KEY_DEL,0, 0, 0, KEY_F11, + KEY_F12, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, KEY_PRTSCR, 0 +}; + + +static void SaveDefaultCollection(default_collection_t *collection) +{ +#if ORIGCODE + default_t *defaults; + int i, v; + FILE *f; + + f = fopen (collection->filename, "w"); + if (!f) + return; // can't write the file, but don't complain + + defaults = collection->defaults; + + for (i=0 ; inumdefaults ; i++) + { + int chars_written; + + // Ignore unbound variables + + if (!defaults[i].bound) + { + continue; + } + + // Print the name and line up all values at 30 characters + + chars_written = fprintf(f, "%s ", defaults[i].name); + + for (; chars_written < 30; ++chars_written) + fprintf(f, " "); + + // Print the value + + switch (defaults[i].type) + { + case DEFAULT_KEY: + + // use the untranslated version if we can, to reduce + // the possibility of screwing up the user's config + // file + + v = * (int *) defaults[i].location; + + if (v == KEY_RSHIFT) + { + // Special case: for shift, force scan code for + // right shift, as this is what Vanilla uses. + // This overrides the change check below, to fix + // configuration files made by old versions that + // mistakenly used the scan code for left shift. + + v = 54; + } + else if (defaults[i].untranslated + && v == defaults[i].original_translated) + { + // Has not been changed since the last time we + // read the config file. + + v = defaults[i].untranslated; + } + else + { + // search for a reverse mapping back to a scancode + // in the scantokey table + + int s; + + for (s=0; s<128; ++s) + { + if (scantokey[s] == v) + { + v = s; + break; + } + } + } + + fprintf(f, "%i", v); + break; + + case DEFAULT_INT: + fprintf(f, "%i", * (int *) defaults[i].location); + break; + + case DEFAULT_INT_HEX: + fprintf(f, "0x%x", * (int *) defaults[i].location); + break; + + case DEFAULT_FLOAT: + fprintf(f, "%f", * (float *) defaults[i].location); + break; + + case DEFAULT_STRING: + fprintf(f,"\"%s\"", * (char **) (defaults[i].location)); + break; + } + + fprintf(f, "\n"); + } + + fclose (f); +#endif +} + +// Parses integer values in the configuration file + +static int ParseIntParameter(char *strparm) +{ + int parm; + + if (strparm[0] == '0' && strparm[1] == 'x') + sscanf(strparm+2, "%x", &parm); + else + sscanf(strparm, "%i", &parm); + + return parm; +} + +static void SetVariable(default_t *def, char *value) +{ + int intparm; + + // parameter found + + switch (def->type) + { + case DEFAULT_STRING: + * (char **) def->location = strdup(value); + break; + + case DEFAULT_INT: + case DEFAULT_INT_HEX: + * (int *) def->location = ParseIntParameter(value); + break; + + case DEFAULT_KEY: + + // translate scancodes read from config + // file (save the old value in untranslated) + + intparm = ParseIntParameter(value); + def->untranslated = intparm; + if (intparm >= 0 && intparm < 128) + { + intparm = scantokey[intparm]; + } + else + { + intparm = 0; + } + + def->original_translated = intparm; + * (int *) def->location = intparm; + break; + + case DEFAULT_FLOAT: + * (float *) def->location = (float) atof(value); + break; + } +} + +static void LoadDefaultCollection(default_collection_t *collection) +{ +#if ORIGCODE + FILE *f; + default_t *def; + char defname[80]; + char strparm[100]; + + // read the file in, overriding any set defaults + f = fopen(collection->filename, "r"); + + if (f == NULL) + { + // File not opened, but don't complain. + // It's probably just the first time they ran the game. + + return; + } + + while (!feof(f)) + { + if (fscanf(f, "%79s %99[^\n]\n", defname, strparm) != 2) + { + // This line doesn't match + + continue; + } + + // Find the setting in the list + + def = SearchCollection(collection, defname); + + if (def == NULL || !def->bound) + { + // Unknown variable? Unbound variables are also treated + // as unknown. + + continue; + } + + // Strip off trailing non-printable characters (\r characters + // from DOS text files) + + while (strlen(strparm) > 0 && !isprint(strparm[strlen(strparm)-1])) + { + strparm[strlen(strparm)-1] = '\0'; + } + + // Surrounded by quotes? If so, remove them. + if (strlen(strparm) >= 2 + && strparm[0] == '"' && strparm[strlen(strparm) - 1] == '"') + { + strparm[strlen(strparm) - 1] = '\0'; + memmove(strparm, strparm + 1, sizeof(strparm) - 1); + } + + SetVariable(def, strparm); + } + + fclose (f); +#endif +} + +// Set the default filenames to use for configuration files. + +void M_SetConfigFilenames(char *main_config, char *extra_config) +{ + default_main_config = main_config; + default_extra_config = extra_config; +} + +// +// M_SaveDefaults +// + +void M_SaveDefaults (void) +{ + SaveDefaultCollection(&doom_defaults); + SaveDefaultCollection(&extra_defaults); +} + +// +// Save defaults to alternate filenames +// + +void M_SaveDefaultsAlternate(char *main, char *extra) +{ + char *orig_main; + char *orig_extra; + + // Temporarily change the filenames + + orig_main = doom_defaults.filename; + orig_extra = extra_defaults.filename; + + doom_defaults.filename = main; + extra_defaults.filename = extra; + + M_SaveDefaults(); + + // Restore normal filenames + + doom_defaults.filename = orig_main; + extra_defaults.filename = orig_extra; +} + +// +// M_LoadDefaults +// + +void M_LoadDefaults (void) +{ + int i; + + // check for a custom default file + + //! + // @arg + // @vanilla + // + // Load main configuration from the specified file, instead of the + // default. + // + + i = M_CheckParmWithArgs("-config", 1); + + if (i) + { + doom_defaults.filename = myargv[i+1]; + printf (" default file: %s\n",doom_defaults.filename); + } + else + { + doom_defaults.filename + = M_StringJoin(configdir, default_main_config, NULL); + } + + printf("saving config in %s\n", doom_defaults.filename); + + //! + // @arg + // + // Load additional configuration from the specified file, instead of + // the default. + // + + i = M_CheckParmWithArgs("-extraconfig", 1); + + if (i) + { + extra_defaults.filename = myargv[i+1]; + printf(" extra configuration file: %s\n", + extra_defaults.filename); + } + else + { + extra_defaults.filename + = M_StringJoin(configdir, default_extra_config, NULL); + } + + LoadDefaultCollection(&doom_defaults); + LoadDefaultCollection(&extra_defaults); +} + +// Get a configuration file variable by its name + +static default_t *GetDefaultForName(char *name) +{ + default_t *result; + + // Try the main list and the extras + + result = SearchCollection(&doom_defaults, name); + + if (result == NULL) + { + result = SearchCollection(&extra_defaults, name); + } + + // Not found? Internal error. + + if (result == NULL) + { + I_Error("Unknown configuration variable: '%s'", name); + } + + return result; +} + +// +// Bind a variable to a given configuration file variable, by name. +// + +void M_BindVariable(char *name, void *location) +{ + default_t *variable; + + variable = GetDefaultForName(name); + + variable->location = location; + variable->bound = true; +} + +// Set the value of a particular variable; an API function for other +// parts of the program to assign values to config variables by name. + +boolean M_SetVariable(char *name, char *value) +{ + default_t *variable; + + variable = GetDefaultForName(name); + + if (variable == NULL || !variable->bound) + { + return false; + } + + SetVariable(variable, value); + + return true; +} + +// Get the value of a variable. + +int M_GetIntVariable(char *name) +{ + default_t *variable; + + variable = GetDefaultForName(name); + + if (variable == NULL || !variable->bound + || (variable->type != DEFAULT_INT && variable->type != DEFAULT_INT_HEX)) + { + return 0; + } + + return *((int *) variable->location); +} + +const char *M_GetStrVariable(char *name) +{ + default_t *variable; + + variable = GetDefaultForName(name); + + if (variable == NULL || !variable->bound + || variable->type != DEFAULT_STRING) + { + return NULL; + } + + return *((const char **) variable->location); +} + +float M_GetFloatVariable(char *name) +{ + default_t *variable; + + variable = GetDefaultForName(name); + + if (variable == NULL || !variable->bound + || variable->type != DEFAULT_FLOAT) + { + return 0; + } + + return *((float *) variable->location); +} + +// Get the path to the default configuration dir to use, if NULL +// is passed to M_SetConfigDir. + +static char *GetDefaultConfigDir(void) +{ + char *result = (char *)malloc(2); + result[0] = '.'; + result[1] = '\0'; + + return result; +} + +// +// SetConfigDir: +// +// Sets the location of the configuration directory, where configuration +// files are stored - default.cfg, chocolate-doom.cfg, savegames, etc. +// + +void M_SetConfigDir(char *dir) +{ + // Use the directory that was passed, or find the default. + + if (dir != NULL) + { + configdir = dir; + } + else + { + configdir = GetDefaultConfigDir(); + } + + if (strcmp(configdir, "") != 0) + { + printf("Using %s for configuration and saves\n", configdir); + } + + // Make the directory if it doesn't already exist: + + M_MakeDirectory(configdir); +} + +// +// Calculate the path to the directory to use to store save games. +// Creates the directory as necessary. +// + +char *M_GetSaveGameDir(char *iwadname) +{ + char *savegamedir; +#if ORIGCODE + char *topdir; +#endif + + // If not "doing" a configuration directory (Windows), don't "do" + // a savegame directory, either. + + if (!strcmp(configdir, "")) + { + savegamedir = strdup(""); + } + else + { +#if ORIGCODE + // ~/.chocolate-doom/savegames + + topdir = M_StringJoin(configdir, "savegame", NULL); + M_MakeDirectory(topdir); + + // eg. ~/.chocolate-doom/savegames/doom2.wad/ + + savegamedir = M_StringJoin(topdir, DIR_SEPARATOR_S, iwadname, + DIR_SEPARATOR_S, NULL); + + M_MakeDirectory(savegamedir); + + free(topdir); +#else + savegamedir = M_StringJoin(configdir, DIR_SEPARATOR_S, ".savegame/", NULL); + + M_MakeDirectory(savegamedir); + + printf ("Using %s for savegames\n", savegamedir); +#endif + } + + return savegamedir; +} + diff --git a/firmware_p4/components/Applications/doom/m_config.h b/firmware_p4/components/Applications/doom/m_config.h new file mode 100644 index 000000000..a17de2b45 --- /dev/null +++ b/firmware_p4/components/Applications/doom/m_config.h @@ -0,0 +1,39 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Configuration file interface. +// + + +#ifndef __M_CONFIG__ +#define __M_CONFIG__ + +#include "doomtype.h" + +void M_LoadDefaults(void); +void M_SaveDefaults(void); +void M_SaveDefaultsAlternate(char *main, char *extra); +void M_SetConfigDir(char *dir); +void M_BindVariable(char *name, void *variable); +boolean M_SetVariable(char *name, char *value); +int M_GetIntVariable(char *name); +const char *M_GetStrVariable(char *name); +float M_GetFloatVariable(char *name); +void M_SetConfigFilenames(char *main_config, char *extra_config); +char *M_GetSaveGameDir(char *iwadname); + +extern char *configdir; + +#endif diff --git a/firmware_p4/components/Applications/doom/m_controls.c b/firmware_p4/components/Applications/doom/m_controls.c new file mode 100644 index 000000000..f0ffa0157 --- /dev/null +++ b/firmware_p4/components/Applications/doom/m_controls.c @@ -0,0 +1,398 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 1993-2008 Raven Software +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// + +#include + +#include "doomtype.h" +#include "doomkeys.h" + +#include "m_config.h" +#include "m_misc.h" + +// +// Keyboard controls +// + +int key_right = KEY_RIGHTARROW; +int key_left = KEY_LEFTARROW; +int key_up = KEY_UPARROW; +int key_down = KEY_DOWNARROW; +int key_strafeleft = KEY_STRAFE_L; +int key_straferight = KEY_STRAFE_R; +int key_fire = KEY_FIRE; +int key_use = KEY_USE; +int key_strafe = KEY_RALT; +int key_speed = KEY_RSHIFT; + +// +// Heretic keyboard controls +// + +int key_flyup = KEY_PGUP; +int key_flydown = KEY_INS; +int key_flycenter = KEY_HOME; + +int key_lookup = KEY_PGDN; +int key_lookdown = KEY_DEL; +int key_lookcenter = KEY_END; + +int key_invleft = '['; +int key_invright = ']'; +int key_useartifact = KEY_ENTER; + +// +// Hexen key controls +// + +int key_jump = '/'; + +int key_arti_all = KEY_BACKSPACE; +int key_arti_health = '\\'; +int key_arti_poisonbag = '0'; +int key_arti_blastradius = '9'; +int key_arti_teleport = '8'; +int key_arti_teleportother = '7'; +int key_arti_egg = '6'; +int key_arti_invulnerability = '5'; + +// +// Strife key controls +// +// haleyjd 09/01/10 +// + +// Note: Strife also uses key_invleft, key_invright, key_jump, key_lookup, and +// key_lookdown, but with different default values. + +int key_usehealth = 'h'; +int key_invquery = 'q'; +int key_mission = 'w'; +int key_invpop = 'z'; +int key_invkey = 'k'; +int key_invhome = KEY_HOME; +int key_invend = KEY_END; +int key_invuse = KEY_ENTER; +int key_invdrop = KEY_BACKSPACE; + + +// +// Mouse controls +// + +int mousebfire = 0; +int mousebstrafe = 1; +int mousebforward = 2; + +int mousebjump = -1; + +int mousebstrafeleft = -1; +int mousebstraferight = -1; +int mousebbackward = -1; +int mousebuse = -1; + +int mousebprevweapon = -1; +int mousebnextweapon = -1; + + +int key_message_refresh = KEY_ENTER; +int key_pause = KEY_PAUSE; +int key_demo_quit = 'q'; +int key_spy = KEY_F12; + +// Multiplayer chat keys: + +int key_multi_msg = 't'; +int key_multi_msgplayer[8]; + +// Weapon selection keys: + +int key_weapon1 = '1'; +int key_weapon2 = '2'; +int key_weapon3 = '3'; +int key_weapon4 = '4'; +int key_weapon5 = '5'; +int key_weapon6 = '6'; +int key_weapon7 = '7'; +int key_weapon8 = '8'; +int key_prevweapon = 0; +int key_nextweapon = 0; + +// Map control keys: + +int key_map_north = KEY_UPARROW; +int key_map_south = KEY_DOWNARROW; +int key_map_east = KEY_RIGHTARROW; +int key_map_west = KEY_LEFTARROW; +int key_map_zoomin = '='; +int key_map_zoomout = '-'; +int key_map_toggle = KEY_TAB; +int key_map_maxzoom = '0'; +int key_map_follow = 'f'; +int key_map_grid = 'g'; +int key_map_mark = 'm'; +int key_map_clearmark = 'c'; + +// menu keys: + +int key_menu_activate = KEY_ESCAPE; +int key_menu_up = KEY_UPARROW; +int key_menu_down = KEY_DOWNARROW; +int key_menu_left = KEY_LEFTARROW; +int key_menu_right = KEY_RIGHTARROW; +int key_menu_back = KEY_BACKSPACE; +int key_menu_forward = KEY_ENTER; +int key_menu_confirm = 'y'; +int key_menu_abort = 'n'; + +int key_menu_help = KEY_F1; +int key_menu_save = KEY_F2; +int key_menu_load = KEY_F3; +int key_menu_volume = KEY_F4; +int key_menu_detail = KEY_F5; +int key_menu_qsave = KEY_F6; +int key_menu_endgame = KEY_F7; +int key_menu_messages = KEY_F8; +int key_menu_qload = KEY_F9; +int key_menu_quit = KEY_F10; +int key_menu_gamma = KEY_F11; + +int key_menu_incscreen = KEY_EQUALS; +int key_menu_decscreen = KEY_MINUS; +int key_menu_screenshot = 0; + +// +// Joystick controls +// + +int joybfire = 0; +int joybstrafe = 1; +int joybuse = 3; +int joybspeed = 2; + +int joybstrafeleft = -1; +int joybstraferight = -1; + +int joybjump = -1; + +int joybprevweapon = -1; +int joybnextweapon = -1; + +int joybmenu = -1; + +// Control whether if a mouse button is double clicked, it acts like +// "use" has been pressed + +int dclick_use = 1; + +// +// Bind all of the common controls used by Doom and all other games. +// + +void M_BindBaseControls(void) +{ + M_BindVariable("key_right", &key_right); + M_BindVariable("key_left", &key_left); + M_BindVariable("key_up", &key_up); + M_BindVariable("key_down", &key_down); + M_BindVariable("key_strafeleft", &key_strafeleft); + M_BindVariable("key_straferight", &key_straferight); + M_BindVariable("key_fire", &key_fire); + M_BindVariable("key_use", &key_use); + M_BindVariable("key_strafe", &key_strafe); + M_BindVariable("key_speed", &key_speed); + + M_BindVariable("mouseb_fire", &mousebfire); + M_BindVariable("mouseb_strafe", &mousebstrafe); + M_BindVariable("mouseb_forward", &mousebforward); + + M_BindVariable("joyb_fire", &joybfire); + M_BindVariable("joyb_strafe", &joybstrafe); + M_BindVariable("joyb_use", &joybuse); + M_BindVariable("joyb_speed", &joybspeed); + + M_BindVariable("joyb_menu_activate", &joybmenu); + + // Extra controls that are not in the Vanilla versions: + + M_BindVariable("joyb_strafeleft", &joybstrafeleft); + M_BindVariable("joyb_straferight", &joybstraferight); + M_BindVariable("mouseb_strafeleft", &mousebstrafeleft); + M_BindVariable("mouseb_straferight", &mousebstraferight); + M_BindVariable("mouseb_use", &mousebuse); + M_BindVariable("mouseb_backward", &mousebbackward); + M_BindVariable("dclick_use", &dclick_use); + M_BindVariable("key_pause", &key_pause); + M_BindVariable("key_message_refresh", &key_message_refresh); +} + +void M_BindHereticControls(void) +{ + M_BindVariable("key_flyup", &key_flyup); + M_BindVariable("key_flydown", &key_flydown); + M_BindVariable("key_flycenter", &key_flycenter); + + M_BindVariable("key_lookup", &key_lookup); + M_BindVariable("key_lookdown", &key_lookdown); + M_BindVariable("key_lookcenter", &key_lookcenter); + + M_BindVariable("key_invleft", &key_invleft); + M_BindVariable("key_invright", &key_invright); + M_BindVariable("key_useartifact", &key_useartifact); +} + +void M_BindHexenControls(void) +{ + M_BindVariable("key_jump", &key_jump); + M_BindVariable("mouseb_jump", &mousebjump); + M_BindVariable("joyb_jump", &joybjump); + + M_BindVariable("key_arti_all", &key_arti_all); + M_BindVariable("key_arti_health", &key_arti_health); + M_BindVariable("key_arti_poisonbag", &key_arti_poisonbag); + M_BindVariable("key_arti_blastradius", &key_arti_blastradius); + M_BindVariable("key_arti_teleport", &key_arti_teleport); + M_BindVariable("key_arti_teleportother", &key_arti_teleportother); + M_BindVariable("key_arti_egg", &key_arti_egg); + M_BindVariable("key_arti_invulnerability", &key_arti_invulnerability); +} + +void M_BindStrifeControls(void) +{ + // These are shared with all games, but have different defaults: + key_message_refresh = '/'; + + // These keys are shared with Heretic/Hexen but have different defaults: + key_jump = 'a'; + key_lookup = KEY_PGUP; + key_lookdown = KEY_PGDN; + key_invleft = KEY_INS; + key_invright = KEY_DEL; + + M_BindVariable("key_jump", &key_jump); + M_BindVariable("key_lookUp", &key_lookup); + M_BindVariable("key_lookDown", &key_lookdown); + M_BindVariable("key_invLeft", &key_invleft); + M_BindVariable("key_invRight", &key_invright); + + // Custom Strife-only Keys: + M_BindVariable("key_useHealth", &key_usehealth); + M_BindVariable("key_invquery", &key_invquery); + M_BindVariable("key_mission", &key_mission); + M_BindVariable("key_invPop", &key_invpop); + M_BindVariable("key_invKey", &key_invkey); + M_BindVariable("key_invHome", &key_invhome); + M_BindVariable("key_invEnd", &key_invend); + M_BindVariable("key_invUse", &key_invuse); + M_BindVariable("key_invDrop", &key_invdrop); + + // Strife also supports jump on mouse and joystick, and in the exact same + // manner as Hexen! + M_BindVariable("mouseb_jump", &mousebjump); + M_BindVariable("joyb_jump", &joybjump); +} + +void M_BindWeaponControls(void) +{ + M_BindVariable("key_weapon1", &key_weapon1); + M_BindVariable("key_weapon2", &key_weapon2); + M_BindVariable("key_weapon3", &key_weapon3); + M_BindVariable("key_weapon4", &key_weapon4); + M_BindVariable("key_weapon5", &key_weapon5); + M_BindVariable("key_weapon6", &key_weapon6); + M_BindVariable("key_weapon7", &key_weapon7); + M_BindVariable("key_weapon8", &key_weapon8); + + M_BindVariable("key_prevweapon", &key_prevweapon); + M_BindVariable("key_nextweapon", &key_nextweapon); + + M_BindVariable("joyb_prevweapon", &joybprevweapon); + M_BindVariable("joyb_nextweapon", &joybnextweapon); + + M_BindVariable("mouseb_prevweapon", &mousebprevweapon); + M_BindVariable("mouseb_nextweapon", &mousebnextweapon); +} + +void M_BindMapControls(void) +{ + M_BindVariable("key_map_north", &key_map_north); + M_BindVariable("key_map_south", &key_map_south); + M_BindVariable("key_map_east", &key_map_east); + M_BindVariable("key_map_west", &key_map_west); + M_BindVariable("key_map_zoomin", &key_map_zoomin); + M_BindVariable("key_map_zoomout", &key_map_zoomout); + M_BindVariable("key_map_toggle", &key_map_toggle); + M_BindVariable("key_map_maxzoom", &key_map_maxzoom); + M_BindVariable("key_map_follow", &key_map_follow); + M_BindVariable("key_map_grid", &key_map_grid); + M_BindVariable("key_map_mark", &key_map_mark); + M_BindVariable("key_map_clearmark", &key_map_clearmark); +} + +void M_BindMenuControls(void) +{ + M_BindVariable("key_menu_activate", &key_menu_activate); + M_BindVariable("key_menu_up", &key_menu_up); + M_BindVariable("key_menu_down", &key_menu_down); + M_BindVariable("key_menu_left", &key_menu_left); + M_BindVariable("key_menu_right", &key_menu_right); + M_BindVariable("key_menu_back", &key_menu_back); + M_BindVariable("key_menu_forward", &key_menu_forward); + M_BindVariable("key_menu_confirm", &key_menu_confirm); + M_BindVariable("key_menu_abort", &key_menu_abort); + + M_BindVariable("key_menu_help", &key_menu_help); + M_BindVariable("key_menu_save", &key_menu_save); + M_BindVariable("key_menu_load", &key_menu_load); + M_BindVariable("key_menu_volume", &key_menu_volume); + M_BindVariable("key_menu_detail", &key_menu_detail); + M_BindVariable("key_menu_qsave", &key_menu_qsave); + M_BindVariable("key_menu_endgame", &key_menu_endgame); + M_BindVariable("key_menu_messages", &key_menu_messages); + M_BindVariable("key_menu_qload", &key_menu_qload); + M_BindVariable("key_menu_quit", &key_menu_quit); + M_BindVariable("key_menu_gamma", &key_menu_gamma); + + M_BindVariable("key_menu_incscreen", &key_menu_incscreen); + M_BindVariable("key_menu_decscreen", &key_menu_decscreen); + M_BindVariable("key_menu_screenshot",&key_menu_screenshot); + M_BindVariable("key_demo_quit", &key_demo_quit); + M_BindVariable("key_spy", &key_spy); +} + +void M_BindChatControls(unsigned int num_players) +{ + char name[32]; // haleyjd: 20 not large enough - Thank you, come again! + unsigned int i; // haleyjd: signedness conflict + + M_BindVariable("key_multi_msg", &key_multi_msg); + + for (i=0; i> FRACBITS; +} + + + +// +// FixedDiv, C version. +// + +fixed_t FixedDiv(fixed_t a, fixed_t b) +{ + if ((abs(a) >> 14) >= abs(b)) + { + return (a^b) < 0 ? INT_MIN : INT_MAX; + } + else + { + int64_t result; + + result = ((int64_t) a << 16) / b; + + return (fixed_t) result; + } +} + diff --git a/firmware_p4/components/Applications/doom/m_fixed.h b/firmware_p4/components/Applications/doom/m_fixed.h new file mode 100644 index 000000000..733b2901c --- /dev/null +++ b/firmware_p4/components/Applications/doom/m_fixed.h @@ -0,0 +1,39 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Fixed point arithemtics, implementation. +// + + +#ifndef __M_FIXED__ +#define __M_FIXED__ + + + + +// +// Fixed point, 32bit as 16.16. +// +#define FRACBITS 16 +#define FRACUNIT (1< +#include + + +#include "doomdef.h" +#include "doomkeys.h" +#include "dstrings.h" + +#include "d_main.h" +#include "deh_main.h" + +#include "i_swap.h" +#include "i_system.h" +#include "i_timer.h" +#include "i_video.h" +#include "m_misc.h" +#include "v_video.h" +#include "w_wad.h" +#include "z_zone.h" + +#include "r_local.h" + + +#include "hu_stuff.h" + +#include "g_game.h" + +#include "m_argv.h" +#include "m_controls.h" +#include "p_saveg.h" + +#include "s_sound.h" + +#include "doomstat.h" + +// Data. +#include "sounds.h" + +#include "m_menu.h" + + +extern patch_t* hu_font[HU_FONTSIZE]; +extern boolean message_dontfuckwithme; + +extern boolean chat_on; // in heads-up code + +// +// defaulted values +// +int mouseSensitivity = 5; + +// Show messages has default, 0 = off, 1 = on +int showMessages = 1; + + +// Blocky mode, has default, 0 = high, 1 = normal +int detailLevel = 0; +int screenblocks = 10; + +// temp for screenblocks (0-9) +int screenSize; + +// -1 = no quicksave slot picked! +int quickSaveSlot; + + // 1 = message to be printed +int messageToPrint; +// ...and here is the message string! +char* messageString; + +// message x & y +int messx; +int messy; +int messageLastMenuActive; + +// timed message = no input from user +boolean messageNeedsInput; + +void (*messageRoutine)(int response); + +char gammamsg[5][26] = +{ + GAMMALVL0, + GAMMALVL1, + GAMMALVL2, + GAMMALVL3, + GAMMALVL4 +}; + +// we are going to be entering a savegame string +int saveStringEnter; +int saveSlot; // which slot to save in +int saveCharIndex; // which char we're editing +// old save description before edit +char saveOldString[SAVESTRINGSIZE]; + +boolean inhelpscreens; +boolean menuactive; + +#define SKULLXOFF -32 +#define LINEHEIGHT 16 + +extern boolean sendpause; +char savegamestrings[10][SAVESTRINGSIZE]; + +char endstring[160]; + +//static boolean opldev; + +// +// MENU TYPEDEFS +// +typedef struct +{ + // 0 = no cursor here, 1 = ok, 2 = arrows ok + short status; + + char name[10]; + + // choice = menu item #. + // if status = 2, + // choice=0:leftarrow,1:rightarrow + void (*routine)(int choice); + + // hotkey in menu + char alphaKey; +} menuitem_t; + + + +typedef struct menu_s +{ + short numitems; // # of menu items + struct menu_s* prevMenu; // previous menu + menuitem_t* menuitems; // menu items + void (*routine)(); // draw routine + short x; + short y; // x,y of menu + short lastOn; // last item user was on in menu +} menu_t; + +short itemOn; // menu item skull is on +short skullAnimCounter; // skull animation counter +short whichSkull; // which skull to draw + +// graphic name of skulls +// warning: initializer-string for array of chars is too long +char *skullName[2] = {"M_SKULL1","M_SKULL2"}; + +// current menudef +menu_t* currentMenu; + +// +// PROTOTYPES +// +void M_NewGame(int choice); +void M_Episode(int choice); +void M_ChooseSkill(int choice); +void M_LoadGame(int choice); +void M_SaveGame(int choice); +void M_Options(int choice); +void M_EndGame(int choice); +void M_ReadThis(int choice); +void M_ReadThis2(int choice); +void M_QuitDOOM(int choice); + +void M_ChangeMessages(int choice); +void M_ChangeSensitivity(int choice); +void M_SfxVol(int choice); +void M_MusicVol(int choice); +void M_ChangeDetail(int choice); +void M_SizeDisplay(int choice); +void M_StartGame(int choice); +void M_Sound(int choice); + +void M_FinishReadThis(int choice); +void M_LoadSelect(int choice); +void M_SaveSelect(int choice); +void M_ReadSaveStrings(void); +void M_QuickSave(void); +void M_QuickLoad(void); + +void M_DrawMainMenu(void); +void M_DrawReadThis1(void); +void M_DrawReadThis2(void); +void M_DrawNewGame(void); +void M_DrawEpisode(void); +void M_DrawOptions(void); +void M_DrawSound(void); +void M_DrawLoad(void); +void M_DrawSave(void); + +void M_DrawSaveLoadBorder(int x,int y); +void M_SetupNextMenu(menu_t *menudef); +void M_DrawThermo(int x,int y,int thermWidth,int thermDot); +void M_DrawEmptyCell(menu_t *menu,int item); +void M_DrawSelCell(menu_t *menu,int item); +void M_WriteText(int x, int y, char *string); +int M_StringWidth(char *string); +int M_StringHeight(char *string); +void M_StartMessage(char *string,void *routine,boolean input); +void M_StopMessage(void); +void M_ClearMenus (void); + + + + +// +// DOOM MENU +// +enum +{ + newgame = 0, + options, + loadgame, + savegame, + readthis, + quitdoom, + main_end +} main_e; + +menuitem_t MainMenu[]= +{ + {1,"M_NGAME",M_NewGame,'n'}, + {1,"M_OPTION",M_Options,'o'}, + {1,"M_LOADG",M_LoadGame,'l'}, + {1,"M_SAVEG",M_SaveGame,'s'}, + // Another hickup with Special edition. + {1,"M_RDTHIS",M_ReadThis,'r'}, + {1,"M_QUITG",M_QuitDOOM,'q'} +}; + +menu_t MainDef = +{ + main_end, + NULL, + MainMenu, + M_DrawMainMenu, + 97,64, + 0 +}; + + +// +// EPISODE SELECT +// +enum +{ + ep1, + ep2, + ep3, + ep4, + ep_end +} episodes_e; + +menuitem_t EpisodeMenu[]= +{ + {1,"M_EPI1", M_Episode,'k'}, + {1,"M_EPI2", M_Episode,'t'}, + {1,"M_EPI3", M_Episode,'i'}, + {1,"M_EPI4", M_Episode,'t'} +}; + +menu_t EpiDef = +{ + ep_end, // # of menu items + &MainDef, // previous menu + EpisodeMenu, // menuitem_t -> + M_DrawEpisode, // drawing routine -> + 48,63, // x,y + ep1 // lastOn +}; + +// +// NEW GAME +// +enum +{ + killthings, + toorough, + hurtme, + violence, + nightmare, + newg_end +} newgame_e; + +menuitem_t NewGameMenu[]= +{ + {1,"M_JKILL", M_ChooseSkill, 'i'}, + {1,"M_ROUGH", M_ChooseSkill, 'h'}, + {1,"M_HURT", M_ChooseSkill, 'h'}, + {1,"M_ULTRA", M_ChooseSkill, 'u'}, + {1,"M_NMARE", M_ChooseSkill, 'n'} +}; + +menu_t NewDef = +{ + newg_end, // # of menu items + &EpiDef, // previous menu + NewGameMenu, // menuitem_t -> + M_DrawNewGame, // drawing routine -> + 48,63, // x,y + hurtme // lastOn +}; + + + +// +// OPTIONS MENU +// +enum +{ + endgame, + messages, + detail, + scrnsize, + option_empty1, + mousesens, + option_empty2, + soundvol, + opt_end +} options_e; + +menuitem_t OptionsMenu[]= +{ + {1,"M_ENDGAM", M_EndGame,'e'}, + {1,"M_MESSG", M_ChangeMessages,'m'}, + {1,"M_DETAIL", M_ChangeDetail,'g'}, + {2,"M_SCRNSZ", M_SizeDisplay,'s'}, + {-1,"",0,'\0'}, + {2,"M_MSENS", M_ChangeSensitivity,'m'}, + {-1,"",0,'\0'}, + {1,"M_SVOL", M_Sound,'s'} +}; + +menu_t OptionsDef = +{ + opt_end, + &MainDef, + OptionsMenu, + M_DrawOptions, + 60,37, + 0 +}; + +// +// Read This! MENU 1 & 2 +// +enum +{ + rdthsempty1, + read1_end +} read_e; + +menuitem_t ReadMenu1[] = +{ + {1,"",M_ReadThis2,0} +}; + +menu_t ReadDef1 = +{ + read1_end, + &MainDef, + ReadMenu1, + M_DrawReadThis1, + 280,185, + 0 +}; + +enum +{ + rdthsempty2, + read2_end +} read_e2; + +menuitem_t ReadMenu2[]= +{ + {1,"",M_FinishReadThis,0} +}; + +menu_t ReadDef2 = +{ + read2_end, + &ReadDef1, + ReadMenu2, + M_DrawReadThis2, + 330,175, + 0 +}; + +// +// SOUND VOLUME MENU +// +enum +{ + sfx_vol, + sfx_empty1, + music_vol, + sfx_empty2, + sound_end +} sound_e; + +menuitem_t SoundMenu[]= +{ + {2,"M_SFXVOL",M_SfxVol,'s'}, + {-1,"",0,'\0'}, + {2,"M_MUSVOL",M_MusicVol,'m'}, + {-1,"",0,'\0'} +}; + +menu_t SoundDef = +{ + sound_end, + &OptionsDef, + SoundMenu, + M_DrawSound, + 80,64, + 0 +}; + +// +// LOAD GAME MENU +// +enum +{ + load1, + load2, + load3, + load4, + load5, + load6, + load_end +} load_e; + +menuitem_t LoadMenu[]= +{ + {1,"", M_LoadSelect,'1'}, + {1,"", M_LoadSelect,'2'}, + {1,"", M_LoadSelect,'3'}, + {1,"", M_LoadSelect,'4'}, + {1,"", M_LoadSelect,'5'}, + {1,"", M_LoadSelect,'6'} +}; + +menu_t LoadDef = +{ + load_end, + &MainDef, + LoadMenu, + M_DrawLoad, + 80,54, + 0 +}; + +// +// SAVE GAME MENU +// +menuitem_t SaveMenu[]= +{ + {1,"", M_SaveSelect,'1'}, + {1,"", M_SaveSelect,'2'}, + {1,"", M_SaveSelect,'3'}, + {1,"", M_SaveSelect,'4'}, + {1,"", M_SaveSelect,'5'}, + {1,"", M_SaveSelect,'6'} +}; + +menu_t SaveDef = +{ + load_end, + &MainDef, + SaveMenu, + M_DrawSave, + 80,54, + 0 +}; + + +// +// M_ReadSaveStrings +// read the strings from the savegame files +// +void M_ReadSaveStrings(void) +{ + FILE *handle; + int i; + char name[256]; + + for (i = 0;i < load_end;i++) + { + M_StringCopy(name, P_SaveGameFile(i), sizeof(name)); + + handle = fopen(name, "rb"); + if (handle == NULL) + { + M_StringCopy(savegamestrings[i], EMPTYSTRING, SAVESTRINGSIZE); + LoadMenu[i].status = 0; + continue; + } + fread(&savegamestrings[i], 1, SAVESTRINGSIZE, handle); + fclose(handle); + LoadMenu[i].status = 1; + } +} + + +// +// M_LoadGame & Cie. +// +void M_DrawLoad(void) +{ + int i; + + V_DrawPatchDirect(72, 28, + W_CacheLumpName(DEH_String("M_LOADG"), PU_CACHE)); + + for (i = 0;i < load_end; i++) + { + M_DrawSaveLoadBorder(LoadDef.x,LoadDef.y+LINEHEIGHT*i); + M_WriteText(LoadDef.x,LoadDef.y+LINEHEIGHT*i,savegamestrings[i]); + } +} + + + +// +// Draw border for the savegame description +// +void M_DrawSaveLoadBorder(int x,int y) +{ + int i; + + V_DrawPatchDirect(x - 8, y + 7, + W_CacheLumpName(DEH_String("M_LSLEFT"), PU_CACHE)); + + for (i = 0;i < 24;i++) + { + V_DrawPatchDirect(x, y + 7, + W_CacheLumpName(DEH_String("M_LSCNTR"), PU_CACHE)); + x += 8; + } + + V_DrawPatchDirect(x, y + 7, + W_CacheLumpName(DEH_String("M_LSRGHT"), PU_CACHE)); +} + + + +// +// User wants to load this game +// +void M_LoadSelect(int choice) +{ + char name[256]; + + M_StringCopy(name, P_SaveGameFile(choice), sizeof(name)); + + G_LoadGame (name); + M_ClearMenus (); +} + +// +// Selected from DOOM menu +// +void M_LoadGame (int choice) +{ + if (netgame) + { + M_StartMessage(DEH_String(LOADNET),NULL,false); + return; + } + + M_SetupNextMenu(&LoadDef); + M_ReadSaveStrings(); +} + + +// +// M_SaveGame & Cie. +// +void M_DrawSave(void) +{ + int i; + + V_DrawPatchDirect(72, 28, W_CacheLumpName(DEH_String("M_SAVEG"), PU_CACHE)); + for (i = 0;i < load_end; i++) + { + M_DrawSaveLoadBorder(LoadDef.x,LoadDef.y+LINEHEIGHT*i); + M_WriteText(LoadDef.x,LoadDef.y+LINEHEIGHT*i,savegamestrings[i]); + } + + if (saveStringEnter) + { + i = M_StringWidth(savegamestrings[saveSlot]); + M_WriteText(LoadDef.x + i,LoadDef.y+LINEHEIGHT*saveSlot,"_"); + } +} + +// +// M_Responder calls this when user is finished +// +void M_DoSave(int slot) +{ + G_SaveGame (slot,savegamestrings[slot]); + M_ClearMenus (); + + // PICK QUICKSAVE SLOT YET? + if (quickSaveSlot == -2) + quickSaveSlot = slot; +} + +// +// User wants to save. Start string input for M_Responder +// +void M_SaveSelect(int choice) +{ + // we are going to be intercepting all chars + saveStringEnter = 1; + + saveSlot = choice; + M_StringCopy(saveOldString,savegamestrings[choice], SAVESTRINGSIZE); + if (!strcmp(savegamestrings[choice], EMPTYSTRING)) + savegamestrings[choice][0] = 0; + saveCharIndex = strlen(savegamestrings[choice]); +} + +// +// Selected from DOOM menu +// +void M_SaveGame (int choice) +{ + if (!usergame) + { + M_StartMessage(DEH_String(SAVEDEAD),NULL,false); + return; + } + + if (gamestate != GS_LEVEL) + return; + + M_SetupNextMenu(&SaveDef); + M_ReadSaveStrings(); +} + + + +// +// M_QuickSave +// +char tempstring[80]; + +void M_QuickSaveResponse(int key) +{ + if (key == key_menu_confirm) + { + M_DoSave(quickSaveSlot); + S_StartSound(NULL,sfx_swtchx); + } +} + +void M_QuickSave(void) +{ + if (!usergame) + { + S_StartSound(NULL,sfx_oof); + return; + } + + if (gamestate != GS_LEVEL) + return; + + if (quickSaveSlot < 0) + { + M_StartControlPanel(); + M_ReadSaveStrings(); + M_SetupNextMenu(&SaveDef); + quickSaveSlot = -2; // means to pick a slot now + return; + } + DEH_snprintf(tempstring, 80, QSPROMPT, savegamestrings[quickSaveSlot]); + M_StartMessage(tempstring,M_QuickSaveResponse,true); +} + + + +// +// M_QuickLoad +// +void M_QuickLoadResponse(int key) +{ + if (key == key_menu_confirm) + { + M_LoadSelect(quickSaveSlot); + S_StartSound(NULL,sfx_swtchx); + } +} + + +void M_QuickLoad(void) +{ + if (netgame) + { + M_StartMessage(DEH_String(QLOADNET),NULL,false); + return; + } + + if (quickSaveSlot < 0) + { + M_StartMessage(DEH_String(QSAVESPOT),NULL,false); + return; + } + DEH_snprintf(tempstring, 80, QLPROMPT, savegamestrings[quickSaveSlot]); + M_StartMessage(tempstring,M_QuickLoadResponse,true); +} + + + + +// +// Read This Menus +// Had a "quick hack to fix romero bug" +// +void M_DrawReadThis1(void) +{ + char *lumpname = "CREDIT"; + int skullx = 330, skully = 175; + + inhelpscreens = true; + + // Different versions of Doom 1.9 work differently + + switch (gameversion) + { + case exe_doom_1_666: + case exe_doom_1_7: + case exe_doom_1_8: + case exe_doom_1_9: + case exe_hacx: + + if (gamemode == commercial) + { + // Doom 2 + + lumpname = "HELP"; + + skullx = 330; + skully = 165; + } + else + { + // Doom 1 + // HELP2 is the first screen shown in Doom 1 + + lumpname = "HELP2"; + + skullx = 280; + skully = 185; + } + break; + + case exe_ultimate: + case exe_chex: + + // Ultimate Doom always displays "HELP1". + + // Chex Quest version also uses "HELP1", even though it is based + // on Final Doom. + + lumpname = "HELP1"; + + break; + + case exe_final: + case exe_final2: + + // Final Doom always displays "HELP". + + lumpname = "HELP"; + + break; + + default: + I_Error("Unhandled game version"); + break; + } + + lumpname = DEH_String(lumpname); + + V_DrawPatchDirect (0, 0, W_CacheLumpName(lumpname, PU_CACHE)); + + ReadDef1.x = skullx; + ReadDef1.y = skully; +} + + + +// +// Read This Menus - optional second page. +// +void M_DrawReadThis2(void) +{ + inhelpscreens = true; + + // We only ever draw the second page if this is + // gameversion == exe_doom_1_9 and gamemode == registered + + V_DrawPatchDirect(0, 0, W_CacheLumpName(DEH_String("HELP1"), PU_CACHE)); +} + + +// +// Change Sfx & Music volumes +// +void M_DrawSound(void) +{ + V_DrawPatchDirect (60, 38, W_CacheLumpName(DEH_String("M_SVOL"), PU_CACHE)); + + M_DrawThermo(SoundDef.x,SoundDef.y+LINEHEIGHT*(sfx_vol+1), + 16,sfxVolume); + + M_DrawThermo(SoundDef.x,SoundDef.y+LINEHEIGHT*(music_vol+1), + 16,musicVolume); +} + +void M_Sound(int choice) +{ + M_SetupNextMenu(&SoundDef); +} + +void M_SfxVol(int choice) +{ + switch(choice) + { + case 0: + if (sfxVolume) + sfxVolume--; + break; + case 1: + if (sfxVolume < 15) + sfxVolume++; + break; + } + + S_SetSfxVolume(sfxVolume * 8); +} + +void M_MusicVol(int choice) +{ + switch(choice) + { + case 0: + if (musicVolume) + musicVolume--; + break; + case 1: + if (musicVolume < 15) + musicVolume++; + break; + } + + S_SetMusicVolume(musicVolume * 8); +} + + + + +// +// M_DrawMainMenu +// +void M_DrawMainMenu(void) +{ + V_DrawPatchDirect(94, 2, + W_CacheLumpName(DEH_String("M_DOOM"), PU_CACHE)); +} + + + + +// +// M_NewGame +// +void M_DrawNewGame(void) +{ + V_DrawPatchDirect(96, 14, W_CacheLumpName(DEH_String("M_NEWG"), PU_CACHE)); + V_DrawPatchDirect(54, 38, W_CacheLumpName(DEH_String("M_SKILL"), PU_CACHE)); +} + +void M_NewGame(int choice) +{ + if (netgame && !demoplayback) + { + M_StartMessage(DEH_String(NEWGAME),NULL,false); + return; + } + + // Chex Quest disabled the episode select screen, as did Doom II. + + if (gamemode == commercial || gameversion == exe_chex) + M_SetupNextMenu(&NewDef); + else + M_SetupNextMenu(&EpiDef); +} + + +// +// M_Episode +// +int epi; + +void M_DrawEpisode(void) +{ + V_DrawPatchDirect(54, 38, W_CacheLumpName(DEH_String("M_EPISOD"), PU_CACHE)); +} + +void M_VerifyNightmare(int key) +{ + if (key != key_menu_confirm) + return; + + G_DeferedInitNew(nightmare,epi+1,1); + M_ClearMenus (); +} + +void M_ChooseSkill(int choice) +{ + if (choice == nightmare) + { + M_StartMessage(DEH_String(NIGHTMARE),M_VerifyNightmare,true); + return; + } + + G_DeferedInitNew(choice,epi+1,1); + M_ClearMenus (); +} + +void M_Episode(int choice) +{ + if ( (gamemode == shareware) + && choice) + { + M_StartMessage(DEH_String(SWSTRING),NULL,false); + M_SetupNextMenu(&ReadDef1); + return; + } + + // Yet another hack... + if ( (gamemode == registered) + && (choice > 2)) + { + fprintf( stderr, + "M_Episode: 4th episode requires UltimateDOOM\n"); + choice = 0; + } + + epi = choice; + M_SetupNextMenu(&NewDef); +} + + + +// +// M_Options +// +static char *detailNames[2] = {"M_GDHIGH","M_GDLOW"}; +static char *msgNames[2] = {"M_MSGOFF","M_MSGON"}; + +void M_DrawOptions(void) +{ + V_DrawPatchDirect(108, 15, W_CacheLumpName(DEH_String("M_OPTTTL"), + PU_CACHE)); + + V_DrawPatchDirect(OptionsDef.x + 175, OptionsDef.y + LINEHEIGHT * detail, + W_CacheLumpName(DEH_String(detailNames[detailLevel]), + PU_CACHE)); + + V_DrawPatchDirect(OptionsDef.x + 120, OptionsDef.y + LINEHEIGHT * messages, + W_CacheLumpName(DEH_String(msgNames[showMessages]), + PU_CACHE)); + + M_DrawThermo(OptionsDef.x, OptionsDef.y + LINEHEIGHT * (mousesens + 1), + 10, mouseSensitivity); + + M_DrawThermo(OptionsDef.x,OptionsDef.y+LINEHEIGHT*(scrnsize+1), + 9,screenSize); +} + +void M_Options(int choice) +{ + M_SetupNextMenu(&OptionsDef); +} + + + +// +// Toggle messages on/off +// +void M_ChangeMessages(int choice) +{ + // warning: unused parameter `int choice' + choice = 0; + showMessages = 1 - showMessages; + + if (!showMessages) + players[consoleplayer].message = DEH_String(MSGOFF); + else + players[consoleplayer].message = DEH_String(MSGON); + + message_dontfuckwithme = true; +} + + +// +// M_EndGame +// +void M_EndGameResponse(int key) +{ + if (key != key_menu_confirm) + return; + + currentMenu->lastOn = itemOn; + M_ClearMenus (); + D_StartTitle (); +} + +void M_EndGame(int choice) +{ + choice = 0; + if (!usergame) + { + S_StartSound(NULL,sfx_oof); + return; + } + + if (netgame) + { + M_StartMessage(DEH_String(NETEND),NULL,false); + return; + } + + M_StartMessage(DEH_String(ENDGAME),M_EndGameResponse,true); +} + + + + +// +// M_ReadThis +// +void M_ReadThis(int choice) +{ + choice = 0; + M_SetupNextMenu(&ReadDef1); +} + +void M_ReadThis2(int choice) +{ + // Doom 1.9 had two menus when playing Doom 1 + // All others had only one + + if (gameversion <= exe_doom_1_9 && gamemode != commercial) + { + choice = 0; + M_SetupNextMenu(&ReadDef2); + } + else + { + // Close the menu + + M_FinishReadThis(0); + } +} + +void M_FinishReadThis(int choice) +{ + choice = 0; + M_SetupNextMenu(&MainDef); +} + + + + +// +// M_QuitDOOM +// +int quitsounds[8] = +{ + sfx_pldeth, + sfx_dmpain, + sfx_popain, + sfx_slop, + sfx_telept, + sfx_posit1, + sfx_posit3, + sfx_sgtatk +}; + +int quitsounds2[8] = +{ + sfx_vilact, + sfx_getpow, + sfx_boscub, + sfx_slop, + sfx_skeswg, + sfx_kntdth, + sfx_bspact, + sfx_sgtatk +}; + + + +void M_QuitResponse(int key) +{ + if (key != key_menu_confirm) + return; + if (!netgame) + { + if (gamemode == commercial) + S_StartSound(NULL,quitsounds2[(gametic>>2)&7]); + else + S_StartSound(NULL,quitsounds[(gametic>>2)&7]); + I_WaitVBL(105); + } + I_Quit (); +} + + +static char *M_SelectEndMessage(void) +{ + char **endmsg; + + if (logical_gamemission == doom) + { + // Doom 1 + + endmsg = doom1_endmsg; + } + else + { + // Doom 2 + + endmsg = doom2_endmsg; + } + + return endmsg[gametic % NUM_QUITMESSAGES]; +} + + +void M_QuitDOOM(int choice) +{ + DEH_snprintf(endstring, sizeof(endstring), "%s\n\n" DOSY, + DEH_String(M_SelectEndMessage())); + + M_StartMessage(endstring,M_QuitResponse,true); +} + + + + +void M_ChangeSensitivity(int choice) +{ + switch(choice) + { + case 0: + if (mouseSensitivity) + mouseSensitivity--; + break; + case 1: + if (mouseSensitivity < 9) + mouseSensitivity++; + break; + } +} + + + + +void M_ChangeDetail(int choice) +{ + choice = 0; + detailLevel = 1 - detailLevel; + + R_SetViewSize (screenblocks, detailLevel); + + if (!detailLevel) + players[consoleplayer].message = DEH_String(DETAILHI); + else + players[consoleplayer].message = DEH_String(DETAILLO); +} + + + + +void M_SizeDisplay(int choice) +{ + switch(choice) + { + case 0: + if (screenSize > 0) + { + screenblocks--; + screenSize--; + } + break; + case 1: + if (screenSize < 8) + { + screenblocks++; + screenSize++; + } + break; + } + + + R_SetViewSize (screenblocks, detailLevel); +} + + + + +// +// Menu Functions +// +void +M_DrawThermo +( int x, + int y, + int thermWidth, + int thermDot ) +{ + int xx; + int i; + + xx = x; + V_DrawPatchDirect(xx, y, W_CacheLumpName(DEH_String("M_THERML"), PU_CACHE)); + xx += 8; + for (i=0;ix - 10, menu->y + item * LINEHEIGHT - 1, + W_CacheLumpName(DEH_String("M_CELL1"), PU_CACHE)); +} + +void +M_DrawSelCell +( menu_t* menu, + int item ) +{ + V_DrawPatchDirect(menu->x - 10, menu->y + item * LINEHEIGHT - 1, + W_CacheLumpName(DEH_String("M_CELL2"), PU_CACHE)); +} + + +void +M_StartMessage +( char* string, + void* routine, + boolean input ) +{ + messageLastMenuActive = menuactive; + messageToPrint = 1; + messageString = string; + messageRoutine = routine; + messageNeedsInput = input; + menuactive = true; + return; +} + + +void M_StopMessage(void) +{ + menuactive = messageLastMenuActive; + messageToPrint = 0; +} + + + +// +// Find string width from hu_font chars +// +int M_StringWidth(char* string) +{ + size_t i; + int w = 0; + int c; + + for (i = 0;i < strlen(string);i++) + { + c = toupper(string[i]) - HU_FONTSTART; + if (c < 0 || c >= HU_FONTSIZE) + w += 4; + else + w += SHORT (hu_font[c]->width); + } + + return w; +} + + + +// +// Find string height from hu_font chars +// +int M_StringHeight(char* string) +{ + size_t i; + int h; + int height = SHORT(hu_font[0]->height); + + h = height; + for (i = 0;i < strlen(string);i++) + if (string[i] == '\n') + h += height; + + return h; +} + + +// +// Write a string using the hu_font +// +void +M_WriteText +( int x, + int y, + char* string) +{ + int w; + char* ch; + int c; + int cx; + int cy; + + + ch = string; + cx = x; + cy = y; + + while(1) + { + c = *ch++; + if (!c) + break; + if (c == '\n') + { + cx = x; + cy += 12; + continue; + } + + c = toupper(c) - HU_FONTSTART; + if (c < 0 || c>= HU_FONTSIZE) + { + cx += 4; + continue; + } + + w = SHORT (hu_font[c]->width); + if (cx+w > SCREENWIDTH) + break; + V_DrawPatchDirect(cx, cy, hu_font[c]); + cx+=w; + } +} + +// These keys evaluate to a "null" key in Vanilla Doom that allows weird +// jumping in the menus. Preserve this behavior for accuracy. + +static boolean IsNullKey(int key) +{ + return key == KEY_PAUSE || key == KEY_CAPSLOCK + || key == KEY_SCRLCK || key == KEY_NUMLOCK; +} + +// +// CONTROL PANEL +// + +// +// M_Responder +// +boolean M_Responder (event_t* ev) +{ + int ch; + int key; + int i; + static int joywait = 0; + static int mousewait = 0; + static int mousey = 0; + static int lasty = 0; + static int mousex = 0; + static int lastx = 0; + + // In testcontrols mode, none of the function keys should do anything + // - the only key is escape to quit. + + if (testcontrols) + { + if (ev->type == ev_quit + || (ev->type == ev_keydown + && (ev->data1 == key_menu_activate || ev->data1 == key_menu_quit))) + { + I_Quit(); + return true; + } + + return false; + } + + // "close" button pressed on window? + if (ev->type == ev_quit) + { + // First click on close button = bring up quit confirm message. + // Second click on close button = confirm quit + + if (menuactive && messageToPrint && messageRoutine == M_QuitResponse) + { + M_QuitResponse(key_menu_confirm); + } + else + { + S_StartSound(NULL,sfx_swtchn); + M_QuitDOOM(0); + } + + return true; + } + + // key is the key pressed, ch is the actual character typed + + ch = 0; + key = -1; + + if (ev->type == ev_joystick && joywait < I_GetTime()) + { + if (ev->data3 < 0) + { + key = key_menu_up; + joywait = I_GetTime() + 5; + } + else if (ev->data3 > 0) + { + key = key_menu_down; + joywait = I_GetTime() + 5; + } + + if (ev->data2 < 0) + { + key = key_menu_left; + joywait = I_GetTime() + 2; + } + else if (ev->data2 > 0) + { + key = key_menu_right; + joywait = I_GetTime() + 2; + } + + if (ev->data1&1) + { + key = key_menu_forward; + joywait = I_GetTime() + 5; + } + if (ev->data1&2) + { + key = key_menu_back; + joywait = I_GetTime() + 5; + } + if (joybmenu >= 0 && (ev->data1 & (1 << joybmenu)) != 0) + { + key = key_menu_activate; + joywait = I_GetTime() + 5; + } + } + else + { + if (ev->type == ev_mouse && mousewait < I_GetTime()) + { + mousey += ev->data3; + if (mousey < lasty-30) + { + key = key_menu_down; + mousewait = I_GetTime() + 5; + mousey = lasty -= 30; + } + else if (mousey > lasty+30) + { + key = key_menu_up; + mousewait = I_GetTime() + 5; + mousey = lasty += 30; + } + + mousex += ev->data2; + if (mousex < lastx-30) + { + key = key_menu_left; + mousewait = I_GetTime() + 5; + mousex = lastx -= 30; + } + else if (mousex > lastx+30) + { + key = key_menu_right; + mousewait = I_GetTime() + 5; + mousex = lastx += 30; + } + + if (ev->data1&1) + { + key = key_menu_forward; + mousewait = I_GetTime() + 15; + } + + if (ev->data1&2) + { + key = key_menu_back; + mousewait = I_GetTime() + 15; + } + } + else + { + if (ev->type == ev_keydown) + { + key = ev->data1; + ch = ev->data2; + } + } + } + + if (key == -1) + return false; + + // Save Game string input + if (saveStringEnter) + { + switch(key) + { + case KEY_BACKSPACE: + if (saveCharIndex > 0) + { + saveCharIndex--; + savegamestrings[saveSlot][saveCharIndex] = 0; + } + break; + + case KEY_ESCAPE: + saveStringEnter = 0; + M_StringCopy(savegamestrings[saveSlot], saveOldString, + SAVESTRINGSIZE); + break; + + case KEY_ENTER: + saveStringEnter = 0; + if (savegamestrings[saveSlot][0]) + M_DoSave(saveSlot); + break; + + default: + // This is complicated. + // Vanilla has a bug where the shift key is ignored when entering + // a savegame name. If vanilla_keyboard_mapping is on, we want + // to emulate this bug by using 'data1'. But if it's turned off, + // it implies the user doesn't care about Vanilla emulation: just + // use the correct 'data2'. + + if (vanilla_keyboard_mapping) + { + ch = key; + } + + ch = toupper(ch); + + if (ch != ' ' + && (ch - HU_FONTSTART < 0 || ch - HU_FONTSTART >= HU_FONTSIZE)) + { + break; + } + + if (ch >= 32 && ch <= 127 && + saveCharIndex < SAVESTRINGSIZE-1 && + M_StringWidth(savegamestrings[saveSlot]) < + (SAVESTRINGSIZE-2)*8) + { + savegamestrings[saveSlot][saveCharIndex++] = ch; + savegamestrings[saveSlot][saveCharIndex] = 0; + } + break; + } + return true; + } + + // Take care of any messages that need input + if (messageToPrint) + { + if (messageNeedsInput) + { + if (key != ' ' && key != KEY_ESCAPE + && key != key_menu_confirm && key != key_menu_abort) + { + return false; + } + } + + menuactive = messageLastMenuActive; + messageToPrint = 0; + if (messageRoutine) + messageRoutine(key); + + menuactive = false; + S_StartSound(NULL,sfx_swtchx); + return true; + } + + if ((devparm && key == key_menu_help) || + (key != 0 && key == key_menu_screenshot)) + { + G_ScreenShot (); + return true; + } + + // F-Keys + if (!menuactive) + { + if (key == key_menu_decscreen) // Screen size down + { + if (automapactive || chat_on) + return false; + M_SizeDisplay(0); + S_StartSound(NULL,sfx_stnmov); + return true; + } + else if (key == key_menu_incscreen) // Screen size up + { + if (automapactive || chat_on) + return false; + M_SizeDisplay(1); + S_StartSound(NULL,sfx_stnmov); + return true; + } + else if (key == key_menu_help) // Help key + { + M_StartControlPanel (); + + if ( gamemode == retail ) + currentMenu = &ReadDef2; + else + currentMenu = &ReadDef1; + + itemOn = 0; + S_StartSound(NULL,sfx_swtchn); + return true; + } + else if (key == key_menu_save) // Save + { + M_StartControlPanel(); + S_StartSound(NULL,sfx_swtchn); + M_SaveGame(0); + return true; + } + else if (key == key_menu_load) // Load + { + M_StartControlPanel(); + S_StartSound(NULL,sfx_swtchn); + M_LoadGame(0); + return true; + } + else if (key == key_menu_volume) // Sound Volume + { + M_StartControlPanel (); + currentMenu = &SoundDef; + itemOn = sfx_vol; + S_StartSound(NULL,sfx_swtchn); + return true; + } + else if (key == key_menu_detail) // Detail toggle + { + M_ChangeDetail(0); + S_StartSound(NULL,sfx_swtchn); + return true; + } + else if (key == key_menu_qsave) // Quicksave + { + S_StartSound(NULL,sfx_swtchn); + M_QuickSave(); + return true; + } + else if (key == key_menu_endgame) // End game + { + S_StartSound(NULL,sfx_swtchn); + M_EndGame(0); + return true; + } + else if (key == key_menu_messages) // Toggle messages + { + M_ChangeMessages(0); + S_StartSound(NULL,sfx_swtchn); + return true; + } + else if (key == key_menu_qload) // Quickload + { + S_StartSound(NULL,sfx_swtchn); + M_QuickLoad(); + return true; + } + else if (key == key_menu_quit) // Quit DOOM + { + S_StartSound(NULL,sfx_swtchn); + M_QuitDOOM(0); + return true; + } + else if (key == key_menu_gamma) // gamma toggle + { + usegamma++; + if (usegamma > 4) + usegamma = 0; + players[consoleplayer].message = DEH_String(gammamsg[usegamma]); + I_SetPalette (W_CacheLumpName (DEH_String("PLAYPAL"),PU_CACHE)); + return true; + } + } + + // Pop-up menu? + if (!menuactive) + { + if (key == key_menu_activate) + { + M_StartControlPanel (); + S_StartSound(NULL,sfx_swtchn); + return true; + } + return false; + } + + // Keys usable within menu + + if (key == key_menu_down) + { + // Move down to next item + + do + { + if (itemOn+1 > currentMenu->numitems-1) + itemOn = 0; + else itemOn++; + S_StartSound(NULL,sfx_pstop); + } while(currentMenu->menuitems[itemOn].status==-1); + + return true; + } + else if (key == key_menu_up) + { + // Move back up to previous item + + do + { + if (!itemOn) + itemOn = currentMenu->numitems-1; + else itemOn--; + S_StartSound(NULL,sfx_pstop); + } while(currentMenu->menuitems[itemOn].status==-1); + + return true; + } + else if (key == key_menu_left) + { + // Slide slider left + + if (currentMenu->menuitems[itemOn].routine && + currentMenu->menuitems[itemOn].status == 2) + { + S_StartSound(NULL,sfx_stnmov); + currentMenu->menuitems[itemOn].routine(0); + } + return true; + } + else if (key == key_menu_right) + { + // Slide slider right + + if (currentMenu->menuitems[itemOn].routine && + currentMenu->menuitems[itemOn].status == 2) + { + S_StartSound(NULL,sfx_stnmov); + currentMenu->menuitems[itemOn].routine(1); + } + return true; + } + else if (key == key_menu_forward) + { + // Activate menu item + + if (currentMenu->menuitems[itemOn].routine && + currentMenu->menuitems[itemOn].status) + { + currentMenu->lastOn = itemOn; + if (currentMenu->menuitems[itemOn].status == 2) + { + currentMenu->menuitems[itemOn].routine(1); // right arrow + S_StartSound(NULL,sfx_stnmov); + } + else + { + currentMenu->menuitems[itemOn].routine(itemOn); + S_StartSound(NULL,sfx_pistol); + } + } + return true; + } + else if (key == key_menu_activate) + { + // Deactivate menu + + currentMenu->lastOn = itemOn; + M_ClearMenus (); + S_StartSound(NULL,sfx_swtchx); + return true; + } + else if (key == key_menu_back) + { + // Go back to previous menu + + currentMenu->lastOn = itemOn; + if (currentMenu->prevMenu) + { + currentMenu = currentMenu->prevMenu; + itemOn = currentMenu->lastOn; + S_StartSound(NULL,sfx_swtchn); + } + return true; + } + + // Keyboard shortcut? + // Vanilla Doom has a weird behavior where it jumps to the scroll bars + // when the certain keys are pressed, so emulate this. + + else if (ch != 0 || IsNullKey(key)) + { + for (i = itemOn+1;i < currentMenu->numitems;i++) + { + if (currentMenu->menuitems[i].alphaKey == ch) + { + itemOn = i; + S_StartSound(NULL,sfx_pstop); + return true; + } + } + + for (i = 0;i <= itemOn;i++) + { + if (currentMenu->menuitems[i].alphaKey == ch) + { + itemOn = i; + S_StartSound(NULL,sfx_pstop); + return true; + } + } + } + + return false; +} + + + +// +// M_StartControlPanel +// +void M_StartControlPanel (void) +{ + // intro might call this repeatedly + if (menuactive) + return; + + menuactive = 1; + currentMenu = &MainDef; // JDC + itemOn = currentMenu->lastOn; // JDC +} + +// Display OPL debug messages - hack for GENMIDI development. + +#if 0 +static void M_DrawOPLDev(void) +{ + extern void I_OPL_DevMessages(char *, size_t); + char debug[1024]; + char *curr, *p; + int line; + + //XXX I_OPL_DevMessages(debug, sizeof(debug)); + curr = debug; + line = 0; + + for (;;) + { + p = strchr(curr, '\n'); + + if (p != NULL) + { + *p = '\0'; + } + + M_WriteText(0, line * 8, curr); + ++line; + + if (p == NULL) + { + break; + } + + curr = p + 1; + } +} +#endif + +// +// M_Drawer +// Called after the view has been rendered, +// but before it has been blitted. +// +void M_Drawer (void) +{ + static short x; + static short y; + unsigned int i; + unsigned int max; + char string[80]; + char *name; + int start; + + inhelpscreens = false; + + // Horiz. & Vertically center string and print it. + if (messageToPrint) + { + start = 0; + y = SCREENHEIGHT/2 - M_StringHeight(messageString) / 2; + while (messageString[start] != '\0') + { + int foundnewline = 0; + + for (i = 0; i < strlen(messageString + start); i++) + { + if (messageString[start + i] == '\n') + { + M_StringCopy(string, messageString + start, + sizeof(string)); + if (i < sizeof(string)) + { + string[i] = '\0'; + } + + foundnewline = 1; + start += i + 1; + break; + } + } + + if (!foundnewline) + { + M_StringCopy(string, messageString + start, sizeof(string)); + start += strlen(string); + } + + x = SCREENWIDTH/2 - M_StringWidth(string) / 2; + M_WriteText(x, y, string); + y += SHORT(hu_font[0]->height); + } + + return; + } + + //if (opldev) + //{ + // M_DrawOPLDev(); + //} + + if (!menuactive) + return; + + if (currentMenu->routine) + currentMenu->routine(); // call Draw routine + + // DRAW MENU + x = currentMenu->x; + y = currentMenu->y; + max = currentMenu->numitems; + + for (i=0;imenuitems[i].name); + + if (name[0]) + { + V_DrawPatchDirect (x, y, W_CacheLumpName(name, PU_CACHE)); + } + y += LINEHEIGHT; + } + + + // DRAW SKULL + V_DrawPatchDirect(x + SKULLXOFF, currentMenu->y - 5 + itemOn*LINEHEIGHT, + W_CacheLumpName(DEH_String(skullName[whichSkull]), + PU_CACHE)); +} + + +// +// M_ClearMenus +// +void M_ClearMenus (void) +{ + menuactive = 0; + // if (!netgame && usergame && paused) + // sendpause = true; +} + + + + +// +// M_SetupNextMenu +// +void M_SetupNextMenu(menu_t *menudef) +{ + currentMenu = menudef; + itemOn = currentMenu->lastOn; +} + + +// +// M_Ticker +// +void M_Ticker (void) +{ + if (--skullAnimCounter <= 0) + { + whichSkull ^= 1; + skullAnimCounter = 8; + } +} + + +// +// M_Init +// +void M_Init (void) +{ + currentMenu = &MainDef; + menuactive = 0; + itemOn = currentMenu->lastOn; + whichSkull = 0; + skullAnimCounter = 10; + screenSize = screenblocks - 3; + messageToPrint = 0; + messageString = NULL; + messageLastMenuActive = menuactive; + quickSaveSlot = -1; + + // Here we could catch other version dependencies, + // like HELP1/2, and four episodes. + + + switch ( gamemode ) + { + case commercial: + // Commercial has no "read this" entry. + MainMenu[readthis] = MainMenu[quitdoom]; + MainDef.numitems--; + MainDef.y += 8; + NewDef.prevMenu = &MainDef; + break; + case shareware: + // Episode 2 and 3 are handled, + // branching to an ad screen. + case registered: + break; + case retail: + // We are fine. + default: + break; + } + + // Versions of doom.exe before the Ultimate Doom release only had + // three episodes; if we're emulating one of those then don't try + // to show episode four. If we are, then do show episode four + // (should crash if missing). + if (gameversion < exe_ultimate) + { + EpiDef.numitems--; + } + + //opldev = M_CheckParm("-opldev") > 0; +} + diff --git a/firmware_p4/components/Applications/doom/m_menu.h b/firmware_p4/components/Applications/doom/m_menu.h new file mode 100644 index 000000000..ce41db39a --- /dev/null +++ b/firmware_p4/components/Applications/doom/m_menu.h @@ -0,0 +1,61 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Menu widget stuff, episode selection and such. +// + + +#ifndef __M_MENU__ +#define __M_MENU__ + + + +#include "d_event.h" + +// +// MENUS +// +// Called by main loop, +// saves config file and calls I_Quit when user exits. +// Even when the menu is not displayed, +// this can resize the view and change game parameters. +// Does all the real work of the menu interaction. +boolean M_Responder (event_t *ev); + + +// Called by main loop, +// only used for menu (skull cursor) animation. +void M_Ticker (void); + +// Called by main loop, +// draws the menus directly into the screen buffer. +void M_Drawer (void); + +// Called by D_DoomMain, +// loads the config file. +void M_Init (void); + +// Called by intro code to force menu up upon a keypress, +// does nothing if menu is already up. +void M_StartControlPanel (void); + + + +extern int detailLevel; +extern int screenblocks; + + + +#endif diff --git a/firmware_p4/components/Applications/doom/m_misc.c b/firmware_p4/components/Applications/doom/m_misc.c new file mode 100644 index 000000000..54b261344 --- /dev/null +++ b/firmware_p4/components/Applications/doom/m_misc.c @@ -0,0 +1,536 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 1993-2008 Raven Software +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Miscellaneous. +// + + +#include +#include +#include +#include +#include + +#ifdef _WIN32 +#define WIN32_LEAN_AND_MEAN +#include +#include +#ifdef _MSC_VER +#include +#endif +#else +#include +#include +#endif + +#include "doomtype.h" + +#include "deh_str.h" + +#include "i_swap.h" +#include "i_system.h" +#include "i_video.h" +#include "m_misc.h" +#include "v_video.h" +#include "w_wad.h" +#include "z_zone.h" + +// +// Create a directory +// + +void M_MakeDirectory(char *path) +{ +#ifdef _WIN32 + mkdir(path); +#else + mkdir(path, 0755); +#endif +} + +// Check if a file exists + +boolean M_FileExists(char *filename) +{ + FILE *fstream; + + fstream = fopen(filename, "r"); + + if (fstream != NULL) + { + fclose(fstream); + return true; + } + else + { + // If we can't open because the file is a directory, the + // "file" exists at least! + + return errno == EISDIR; + } +} + +// +// Determine the length of an open file. +// + +long M_FileLength(FILE *handle) +{ + long savedpos; + long length; + + // save the current position in the file + savedpos = ftell(handle); + + // jump to the end and find the length + fseek(handle, 0, SEEK_END); + length = ftell(handle); + + // go back to the old location + fseek(handle, savedpos, SEEK_SET); + + return length; +} + +// +// M_WriteFile +// + +boolean M_WriteFile(char *name, void *source, int length) +{ + FILE *handle; + int count; + + handle = fopen(name, "wb"); + + if (handle == NULL) + return false; + + count = fwrite(source, 1, length, handle); + fclose(handle); + + if (count < length) + return false; + + return true; +} + + +// +// M_ReadFile +// + +int M_ReadFile(char *name, byte **buffer) +{ + FILE *handle; + int count, length; + byte *buf; + + handle = fopen(name, "rb"); + if (handle == NULL) + I_Error ("Couldn't read file %s", name); + + // find the size of the file by seeking to the end and + // reading the current position + + length = M_FileLength(handle); + + buf = Z_Malloc (length, PU_STATIC, NULL); + count = fread(buf, 1, length, handle); + fclose (handle); + + if (count < length) + I_Error ("Couldn't read file %s", name); + + *buffer = buf; + return length; +} + +// Returns the path to a temporary file of the given name, stored +// inside the system temporary directory. +// +// The returned value must be freed with Z_Free after use. + +char *M_TempFile(char *s) +{ + char *tempdir; + +#if defined(_WIN32) || defined(__DJGPP__) + + // Check the TEMP environment variable to find the location. + + tempdir = getenv("TEMP"); + + if (tempdir == NULL) + { + tempdir = "."; + } +#else + // In Unix, just use /tmp. + + tempdir = "/tmp"; +#endif + + return M_StringJoin(tempdir, DIR_SEPARATOR_S, s, NULL); +} + +boolean M_StrToInt(const char *str, int *result) +{ + return sscanf(str, " 0x%x", result) == 1 + || sscanf(str, " 0X%x", result) == 1 + || sscanf(str, " 0%o", result) == 1 + || sscanf(str, " %d", result) == 1; +} + +void M_ExtractFileBase(char *path, char *dest) +{ + char *src; + char *filename; + int length; + + src = path + strlen(path) - 1; + + // back up until a \ or the start + while (src != path && *(src - 1) != DIR_SEPARATOR) + { + src--; + } + + filename = src; + + // Copy up to eight characters + // Note: Vanilla Doom exits with an error if a filename is specified + // with a base of more than eight characters. To remove the 8.3 + // filename limit, instead we simply truncate the name. + + length = 0; + memset(dest, 0, 8); + + while (*src != '\0' && *src != '.') + { + if (length >= 8) + { + printf("Warning: Truncated '%s' lump name to '%.8s'.\n", + filename, dest); + break; + } + + dest[length++] = toupper((int)*src++); + } +} + +//--------------------------------------------------------------------------- +// +// PROC M_ForceUppercase +// +// Change string to uppercase. +// +//--------------------------------------------------------------------------- + +void M_ForceUppercase(char *text) +{ + char *p; + + for (p = text; *p != '\0'; ++p) + { + *p = toupper(*p); + } +} + +// +// M_StrCaseStr +// +// Case-insensitive version of strstr() +// + +char *M_StrCaseStr(char *haystack, char *needle) +{ + unsigned int haystack_len; + unsigned int needle_len; + unsigned int len; + unsigned int i; + + haystack_len = strlen(haystack); + needle_len = strlen(needle); + + if (haystack_len < needle_len) + { + return NULL; + } + + len = haystack_len - needle_len; + + for (i = 0; i <= len; ++i) + { + if (!strncasecmp(haystack + i, needle, needle_len)) + { + return haystack + i; + } + } + + return NULL; +} + +// +// Safe version of strdup() that checks the string was successfully +// allocated. +// + +char *M_StringDuplicate(const char *orig) +{ + char *result; + + result = strdup(orig); + + if (result == NULL) + { + I_Error("Failed to duplicate string (length %i)\n", + strlen(orig)); + } + + return result; +} + +// +// String replace function. +// + +char *M_StringReplace(const char *haystack, const char *needle, + const char *replacement) +{ + char *result, *dst; + const char *p; + size_t needle_len = strlen(needle); + size_t result_len, dst_len; + + // Iterate through occurrences of 'needle' and calculate the size of + // the new string. + result_len = strlen(haystack) + 1; + p = haystack; + + for (;;) + { + p = strstr(p, needle); + if (p == NULL) + { + break; + } + + p += needle_len; + result_len += strlen(replacement) - needle_len; + } + + // Construct new string. + + result = malloc(result_len); + if (result == NULL) + { + I_Error("M_StringReplace: Failed to allocate new string"); + return NULL; + } + + dst = result; dst_len = result_len; + p = haystack; + + while (*p != '\0') + { + if (!strncmp(p, needle, needle_len)) + { + M_StringCopy(dst, replacement, dst_len); + p += needle_len; + dst += strlen(replacement); + dst_len -= strlen(replacement); + } + else + { + *dst = *p; + ++dst; --dst_len; + ++p; + } + } + + *dst = '\0'; + + return result; +} + +// Safe string copy function that works like OpenBSD's strlcpy(). +// Returns true if the string was not truncated. + +boolean M_StringCopy(char *dest, const char *src, size_t dest_size) +{ + size_t len; + + if (dest_size >= 1) + { + dest[dest_size - 1] = '\0'; + strncpy(dest, src, dest_size - 1); + } + else + { + return false; + } + + len = strlen(dest); + return src[len] == '\0'; +} + +// Safe string concat function that works like OpenBSD's strlcat(). +// Returns true if string not truncated. + +boolean M_StringConcat(char *dest, const char *src, size_t dest_size) +{ + size_t offset; + + offset = strlen(dest); + if (offset > dest_size) + { + offset = dest_size; + } + + return M_StringCopy(dest + offset, src, dest_size - offset); +} + +// Returns true if 's' begins with the specified prefix. + +boolean M_StringStartsWith(const char *s, const char *prefix) +{ + return strlen(s) > strlen(prefix) + && strncmp(s, prefix, strlen(prefix)) == 0; +} + +// Returns true if 's' ends with the specified suffix. + +boolean M_StringEndsWith(const char *s, const char *suffix) +{ + return strlen(s) >= strlen(suffix) + && strcmp(s + strlen(s) - strlen(suffix), suffix) == 0; +} + +// Return a newly-malloced string with all the strings given as arguments +// concatenated together. + +char *M_StringJoin(const char *s, ...) +{ + char *result; + const char *v; + va_list args; + size_t result_len; + + result_len = strlen(s) + 1; + + va_start(args, s); + for (;;) + { + v = va_arg(args, const char *); + if (v == NULL) + { + break; + } + + result_len += strlen(v); + } + va_end(args); + + result = malloc(result_len); + + if (result == NULL) + { + I_Error("M_StringJoin: Failed to allocate new string."); + return NULL; + } + + M_StringCopy(result, s, result_len); + + va_start(args, s); + for (;;) + { + v = va_arg(args, const char *); + if (v == NULL) + { + break; + } + + M_StringConcat(result, v, result_len); + } + va_end(args); + + return result; +} + +// On Windows, vsnprintf() is _vsnprintf(). +#ifdef _WIN32 +#if _MSC_VER < 1400 /* not needed for Visual Studio 2008 */ +#define vsnprintf _vsnprintf +#endif +#endif + +// Safe, portable vsnprintf(). +int M_vsnprintf(char *buf, size_t buf_len, const char *s, va_list args) +{ + int result; + + if (buf_len < 1) + { + return 0; + } + + // Windows (and other OSes?) has a vsnprintf() that doesn't always + // append a trailing \0. So we must do it, and write into a buffer + // that is one byte shorter; otherwise this function is unsafe. + result = vsnprintf(buf, buf_len, s, args); + + // If truncated, change the final char in the buffer to a \0. + // A negative result indicates a truncated buffer on Windows. + if (result < 0 || result >= buf_len) + { + buf[buf_len - 1] = '\0'; + result = buf_len - 1; + } + + return result; +} + +// Safe, portable snprintf(). +int M_snprintf(char *buf, size_t buf_len, const char *s, ...) +{ + va_list args; + int result; + va_start(args, s); + result = M_vsnprintf(buf, buf_len, s, args); + va_end(args); + return result; +} + +#ifdef _WIN32 + +char *M_OEMToUTF8(const char *oem) +{ + unsigned int len = strlen(oem) + 1; + wchar_t *tmp; + char *result; + + tmp = malloc(len * sizeof(wchar_t)); + MultiByteToWideChar(CP_OEMCP, 0, oem, len, tmp, len); + result = malloc(len * 4); + WideCharToMultiByte(CP_UTF8, 0, tmp, len, result, len * 4, NULL, NULL); + free(tmp); + + return result; +} + +#endif + diff --git a/firmware_p4/components/Applications/doom/m_misc.h b/firmware_p4/components/Applications/doom/m_misc.h new file mode 100644 index 000000000..844b48595 --- /dev/null +++ b/firmware_p4/components/Applications/doom/m_misc.h @@ -0,0 +1,51 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Miscellaneous. +// + + +#ifndef __M_MISC__ +#define __M_MISC__ + +#include +#include + +#include "doomtype.h" + +boolean M_WriteFile(char *name, void *source, int length); +int M_ReadFile(char *name, byte **buffer); +void M_MakeDirectory(char *dir); +char *M_TempFile(char *s); +boolean M_FileExists(char *file); +long M_FileLength(FILE *handle); +boolean M_StrToInt(const char *str, int *result); +void M_ExtractFileBase(char *path, char *dest); +void M_ForceUppercase(char *text); +char *M_StrCaseStr(char *haystack, char *needle); +char *M_StringDuplicate(const char *orig); +boolean M_StringCopy(char *dest, const char *src, size_t dest_size); +boolean M_StringConcat(char *dest, const char *src, size_t dest_size); +char *M_StringReplace(const char *haystack, const char *needle, + const char *replacement); +char *M_StringJoin(const char *s, ...); +boolean M_StringStartsWith(const char *s, const char *prefix); +boolean M_StringEndsWith(const char *s, const char *suffix); +int M_vsnprintf(char *buf, size_t buf_len, const char *s, va_list args); +int M_snprintf(char *buf, size_t buf_len, const char *s, ...); +char *M_OEMToUTF8(const char *ansi); + +#endif + diff --git a/firmware_p4/components/Applications/doom/m_random.c b/firmware_p4/components/Applications/doom/m_random.c new file mode 100644 index 000000000..8e3b4e189 --- /dev/null +++ b/firmware_p4/components/Applications/doom/m_random.c @@ -0,0 +1,65 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Random number LUT. +// + +// +// M_Random +// Returns a 0-255 number +// + +static const unsigned char rndtable[256] = { + 0, 8, 109, 220, 222, 241, 149, 107, 75, 248, 254, 140, 16, 66 , + 74, 21, 211, 47, 80, 242, 154, 27, 205, 128, 161, 89, 77, 36 , + 95, 110, 85, 48, 212, 140, 211, 249, 22, 79, 200, 50, 28, 188 , + 52, 140, 202, 120, 68, 145, 62, 70, 184, 190, 91, 197, 152, 224 , + 149, 104, 25, 178, 252, 182, 202, 182, 141, 197, 4, 81, 181, 242 , + 145, 42, 39, 227, 156, 198, 225, 193, 219, 93, 122, 175, 249, 0 , + 175, 143, 70, 239, 46, 246, 163, 53, 163, 109, 168, 135, 2, 235 , + 25, 92, 20, 145, 138, 77, 69, 166, 78, 176, 173, 212, 166, 113 , + 94, 161, 41, 50, 239, 49, 111, 164, 70, 60, 2, 37, 171, 75 , + 136, 156, 11, 56, 42, 146, 138, 229, 73, 146, 77, 61, 98, 196 , + 135, 106, 63, 197, 195, 86, 96, 203, 113, 101, 170, 247, 181, 113 , + 80, 250, 108, 7, 255, 237, 129, 226, 79, 107, 112, 166, 103, 241 , + 24, 223, 239, 120, 198, 58, 60, 82, 128, 3, 184, 66, 143, 224 , + 145, 224, 81, 206, 163, 45, 63, 90, 168, 114, 59, 33, 159, 95 , + 28, 139, 123, 98, 125, 196, 15, 70, 194, 253, 54, 14, 109, 226 , + 71, 17, 161, 93, 186, 87, 244, 138, 20, 52, 123, 251, 26, 36 , + 17, 46, 52, 231, 232, 76, 31, 221, 84, 37, 216, 165, 212, 106 , + 197, 242, 98, 43, 39, 175, 254, 145, 190, 84, 118, 222, 187, 136 , + 120, 163, 236, 249 +}; + +int rndindex = 0; +int prndindex = 0; + +// Which one is deterministic? +int P_Random (void) +{ + prndindex = (prndindex+1)&0xff; + return rndtable[prndindex]; +} + +int M_Random (void) +{ + rndindex = (rndindex+1)&0xff; + return rndtable[rndindex]; +} + +void M_ClearRandom (void) +{ + rndindex = prndindex = 0; +} diff --git a/firmware_p4/components/Applications/doom/m_random.h b/firmware_p4/components/Applications/doom/m_random.h new file mode 100644 index 000000000..aa6291ae9 --- /dev/null +++ b/firmware_p4/components/Applications/doom/m_random.h @@ -0,0 +1,39 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// +// + + +#ifndef __M_RANDOM__ +#define __M_RANDOM__ + + +#include "doomtype.h" + + + +// Returns a number from 0 to 255, +// from a lookup table. +int M_Random (void); + +// As M_Random, but used only by the play simulation. +int P_Random (void); + +// Fix randoms for demos. +void M_ClearRandom (void); + + +#endif diff --git a/firmware_p4/components/Applications/doom/memio.c b/firmware_p4/components/Applications/doom/memio.c new file mode 100644 index 000000000..3cc769a35 --- /dev/null +++ b/firmware_p4/components/Applications/doom/memio.c @@ -0,0 +1,197 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// Emulates the IO functions in C stdio.h reading and writing to +// memory. +// + +#include +#include +#include + +#include "memio.h" + +#include "z_zone.h" + +typedef enum { + MODE_READ, + MODE_WRITE, +} memfile_mode_t; + +struct _MEMFILE { + unsigned char *buf; + size_t buflen; + size_t alloced; + unsigned int position; + memfile_mode_t mode; +}; + +// Open a memory area for reading + +MEMFILE *mem_fopen_read(void *buf, size_t buflen) +{ + MEMFILE *file; + + file = Z_Malloc(sizeof(MEMFILE), PU_STATIC, 0); + + file->buf = (unsigned char *) buf; + file->buflen = buflen; + file->position = 0; + file->mode = MODE_READ; + + return file; +} + +// Read bytes + +size_t mem_fread(void *buf, size_t size, size_t nmemb, MEMFILE *stream) +{ + size_t items; + + if (stream->mode != MODE_READ) + { + printf("not a read stream\n"); + return -1; + } + + // Trying to read more bytes than we have left? + + items = nmemb; + + if (items * size > stream->buflen - stream->position) + { + items = (stream->buflen - stream->position) / size; + } + + // Copy bytes to buffer + + memcpy(buf, stream->buf + stream->position, items * size); + + // Update position + + stream->position += items * size; + + return items; +} + +// Open a memory area for writing + +MEMFILE *mem_fopen_write(void) +{ + MEMFILE *file; + + file = Z_Malloc(sizeof(MEMFILE), PU_STATIC, 0); + + file->alloced = 1024; + file->buf = Z_Malloc(file->alloced, PU_STATIC, 0); + file->buflen = 0; + file->position = 0; + file->mode = MODE_WRITE; + + return file; +} + +// Write bytes to stream + +size_t mem_fwrite(const void *ptr, size_t size, size_t nmemb, MEMFILE *stream) +{ + size_t bytes; + + if (stream->mode != MODE_WRITE) + { + return -1; + } + + // More bytes than can fit in the buffer? + // If so, reallocate bigger. + + bytes = size * nmemb; + + while (bytes > stream->alloced - stream->position) + { + unsigned char *newbuf; + + newbuf = Z_Malloc(stream->alloced * 2, PU_STATIC, 0); + memcpy(newbuf, stream->buf, stream->alloced); + Z_Free(stream->buf); + stream->buf = newbuf; + stream->alloced *= 2; + } + + // Copy into buffer + + memcpy(stream->buf + stream->position, ptr, bytes); + stream->position += bytes; + + if (stream->position > stream->buflen) + stream->buflen = stream->position; + + return nmemb; +} + +void mem_get_buf(MEMFILE *stream, void **buf, size_t *buflen) +{ + *buf = stream->buf; + *buflen = stream->buflen; +} + +void mem_fclose(MEMFILE *stream) +{ + if (stream->mode == MODE_WRITE) + { + Z_Free(stream->buf); + } + + Z_Free(stream); +} + +long mem_ftell(MEMFILE *stream) +{ + return stream->position; +} + +int mem_fseek(MEMFILE *stream, signed long position, mem_rel_t whence) +{ + unsigned int newpos; + + switch (whence) + { + case MEM_SEEK_SET: + newpos = (int) position; + break; + + case MEM_SEEK_CUR: + newpos = (int) (stream->position + position); + break; + + case MEM_SEEK_END: + newpos = (int) (stream->buflen + position); + break; + default: + return -1; + } + + if (newpos < stream->buflen) + { + stream->position = newpos; + return 0; + } + else + { + printf("Error seeking to %i\n", newpos); + return -1; + } +} + + diff --git a/firmware_p4/components/Applications/doom/memio.h b/firmware_p4/components/Applications/doom/memio.h new file mode 100644 index 000000000..03706a317 --- /dev/null +++ b/firmware_p4/components/Applications/doom/memio.h @@ -0,0 +1,38 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// + +#ifndef MEMIO_H +#define MEMIO_H + +typedef struct _MEMFILE MEMFILE; + +typedef enum +{ + MEM_SEEK_SET, + MEM_SEEK_CUR, + MEM_SEEK_END, +} mem_rel_t; + +MEMFILE *mem_fopen_read(void *buf, size_t buflen); +size_t mem_fread(void *buf, size_t size, size_t nmemb, MEMFILE *stream); +MEMFILE *mem_fopen_write(void); +size_t mem_fwrite(const void *ptr, size_t size, size_t nmemb, MEMFILE *stream); +void mem_get_buf(MEMFILE *stream, void **buf, size_t *buflen); +void mem_fclose(MEMFILE *stream); +long mem_ftell(MEMFILE *stream); +int mem_fseek(MEMFILE *stream, signed long offset, mem_rel_t whence); + +#endif /* #ifndef MEMIO_H */ + diff --git a/firmware_p4/components/Applications/doom/mus2mid.c b/firmware_p4/components/Applications/doom/mus2mid.c new file mode 100644 index 000000000..bcbeb00c0 --- /dev/null +++ b/firmware_p4/components/Applications/doom/mus2mid.c @@ -0,0 +1,737 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// Copyright(C) 2006 Ben Ryves 2006 +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// mus2mid.c - Ben Ryves 2006 - http://benryves.com - benryves@benryves.com +// Use to convert a MUS file into a single track, type 0 MIDI file. + +#include + +#include "doomtype.h" +#include "i_swap.h" + +#include "memio.h" +#include "mus2mid.h" + +#define NUM_CHANNELS 16 + +#define MIDI_PERCUSSION_CHAN 9 +#define MUS_PERCUSSION_CHAN 15 + +// MUS event codes +typedef enum +{ + mus_releasekey = 0x00, + mus_presskey = 0x10, + mus_pitchwheel = 0x20, + mus_systemevent = 0x30, + mus_changecontroller = 0x40, + mus_scoreend = 0x60 +} musevent; + +// MIDI event codes +typedef enum +{ + midi_releasekey = 0x80, + midi_presskey = 0x90, + midi_aftertouchkey = 0xA0, + midi_changecontroller = 0xB0, + midi_changepatch = 0xC0, + midi_aftertouchchannel = 0xD0, + midi_pitchwheel = 0xE0 +} midievent; + +// Structure to hold MUS file header +typedef struct +{ + byte id[4]; + unsigned short scorelength; + unsigned short scorestart; + unsigned short primarychannels; + unsigned short secondarychannels; + unsigned short instrumentcount; +} musheader; + +// Standard MIDI type 0 header + track header +static const byte midiheader[] = +{ + 'M', 'T', 'h', 'd', // Main header + 0x00, 0x00, 0x00, 0x06, // Header size + 0x00, 0x00, // MIDI type (0) + 0x00, 0x01, // Number of tracks + 0x00, 0x46, // Resolution + 'M', 'T', 'r', 'k', // Start of track + 0x00, 0x00, 0x00, 0x00 // Placeholder for track length +}; + +// Cached channel velocities +static byte channelvelocities[] = +{ + 127, 127, 127, 127, 127, 127, 127, 127, + 127, 127, 127, 127, 127, 127, 127, 127 +}; + +// Timestamps between sequences of MUS events + +static unsigned int queuedtime = 0; + +// Counter for the length of the track + +static unsigned int tracksize; + +static const byte controller_map[] = +{ + 0x00, 0x20, 0x01, 0x07, 0x0A, 0x0B, 0x5B, 0x5D, + 0x40, 0x43, 0x78, 0x7B, 0x7E, 0x7F, 0x79 +}; + +static int channel_map[NUM_CHANNELS]; + +// Write timestamp to a MIDI file. + +static boolean WriteTime(unsigned int time, MEMFILE *midioutput) +{ + unsigned int buffer = time & 0x7F; + byte writeval; + + while ((time >>= 7) != 0) + { + buffer <<= 8; + buffer |= ((time & 0x7F) | 0x80); + } + + for (;;) + { + writeval = (byte)(buffer & 0xFF); + + if (mem_fwrite(&writeval, 1, 1, midioutput) != 1) + { + return true; + } + + ++tracksize; + + if ((buffer & 0x80) != 0) + { + buffer >>= 8; + } + else + { + queuedtime = 0; + return false; + } + } +} + + +// Write the end of track marker +static boolean WriteEndTrack(MEMFILE *midioutput) +{ + byte endtrack[] = {0xFF, 0x2F, 0x00}; + + if (WriteTime(queuedtime, midioutput)) + { + return true; + } + + if (mem_fwrite(endtrack, 1, 3, midioutput) != 3) + { + return true; + } + + tracksize += 3; + return false; +} + +// Write a key press event +static boolean WritePressKey(byte channel, byte key, + byte velocity, MEMFILE *midioutput) +{ + byte working = midi_presskey | channel; + + if (WriteTime(queuedtime, midioutput)) + { + return true; + } + + if (mem_fwrite(&working, 1, 1, midioutput) != 1) + { + return true; + } + + working = key & 0x7F; + + if (mem_fwrite(&working, 1, 1, midioutput) != 1) + { + return true; + } + + working = velocity & 0x7F; + + if (mem_fwrite(&working, 1, 1, midioutput) != 1) + { + return true; + } + + tracksize += 3; + + return false; +} + +// Write a key release event +static boolean WriteReleaseKey(byte channel, byte key, + MEMFILE *midioutput) +{ + byte working = midi_releasekey | channel; + + if (WriteTime(queuedtime, midioutput)) + { + return true; + } + + if (mem_fwrite(&working, 1, 1, midioutput) != 1) + { + return true; + } + + working = key & 0x7F; + + if (mem_fwrite(&working, 1, 1, midioutput) != 1) + { + return true; + } + + working = 0; + + if (mem_fwrite(&working, 1, 1, midioutput) != 1) + { + return true; + } + + tracksize += 3; + + return false; +} + +// Write a pitch wheel/bend event +static boolean WritePitchWheel(byte channel, short wheel, + MEMFILE *midioutput) +{ + byte working = midi_pitchwheel | channel; + + if (WriteTime(queuedtime, midioutput)) + { + return true; + } + + if (mem_fwrite(&working, 1, 1, midioutput) != 1) + { + return true; + } + + working = wheel & 0x7F; + + if (mem_fwrite(&working, 1, 1, midioutput) != 1) + { + return true; + } + + working = (wheel >> 7) & 0x7F; + + if (mem_fwrite(&working, 1, 1, midioutput) != 1) + { + return true; + } + + tracksize += 3; + return false; +} + +// Write a patch change event +static boolean WriteChangePatch(byte channel, byte patch, + MEMFILE *midioutput) +{ + byte working = midi_changepatch | channel; + + if (WriteTime(queuedtime, midioutput)) + { + return true; + } + + if (mem_fwrite(&working, 1, 1, midioutput) != 1) + { + return true; + } + + working = patch & 0x7F; + + if (mem_fwrite(&working, 1, 1, midioutput) != 1) + { + return true; + } + + tracksize += 2; + + return false; +} + +// Write a valued controller change event + +static boolean WriteChangeController_Valued(byte channel, + byte control, + byte value, + MEMFILE *midioutput) +{ + byte working = midi_changecontroller | channel; + + if (WriteTime(queuedtime, midioutput)) + { + return true; + } + + if (mem_fwrite(&working, 1, 1, midioutput) != 1) + { + return true; + } + + working = control & 0x7F; + + if (mem_fwrite(&working, 1, 1, midioutput) != 1) + { + return true; + } + + // Quirk in vanilla DOOM? MUS controller values should be + // 7-bit, not 8-bit. + + working = value;// & 0x7F; + + // Fix on said quirk to stop MIDI players from complaining that + // the value is out of range: + + if (working & 0x80) + { + working = 0x7F; + } + + if (mem_fwrite(&working, 1, 1, midioutput) != 1) + { + return true; + } + + tracksize += 3; + + return false; +} + +// Write a valueless controller change event +static boolean WriteChangeController_Valueless(byte channel, + byte control, + MEMFILE *midioutput) +{ + return WriteChangeController_Valued(channel, control, 0, + midioutput); +} + +// Allocate a free MIDI channel. + +static int AllocateMIDIChannel(void) +{ + int result; + int max; + int i; + + // Find the current highest-allocated channel. + + max = -1; + + for (i=0; i max) + { + max = channel_map[i]; + } + } + + // max is now equal to the highest-allocated MIDI channel. We can + // now allocate the next available channel. This also works if + // no channels are currently allocated (max=-1) + + result = max + 1; + + // Don't allocate the MIDI percussion channel! + + if (result == MIDI_PERCUSSION_CHAN) + { + ++result; + } + + return result; +} + +// Given a MUS channel number, get the MIDI channel number to use +// in the outputted file. + +static int GetMIDIChannel(int mus_channel, MEMFILE *midioutput) +{ + // Find the MIDI channel to use for this MUS channel. + // MUS channel 15 is the percusssion channel. + + if (mus_channel == MUS_PERCUSSION_CHAN) + { + return MIDI_PERCUSSION_CHAN; + } + else + { + // If a MIDI channel hasn't been allocated for this MUS channel + // yet, allocate the next free MIDI channel. + + if (channel_map[mus_channel] == -1) + { + channel_map[mus_channel] = AllocateMIDIChannel(); + + // First time using the channel, send an "all notes off" + // event. This fixes "The D_DDTBLU disease" described here: + // https://www.doomworld.com/vb/source-ports/66802-the + WriteChangeController_Valueless(channel_map[mus_channel], 0x7b, + midioutput); + } + + return channel_map[mus_channel]; + } +} + +static boolean ReadMusHeader(MEMFILE *file, musheader *header) +{ + boolean result; + + result = mem_fread(&header->id, sizeof(byte), 4, file) == 4 + && mem_fread(&header->scorelength, sizeof(short), 1, file) == 1 + && mem_fread(&header->scorestart, sizeof(short), 1, file) == 1 + && mem_fread(&header->primarychannels, sizeof(short), 1, file) == 1 + && mem_fread(&header->secondarychannels, sizeof(short), 1, file) == 1 + && mem_fread(&header->instrumentcount, sizeof(short), 1, file) == 1; + + if (result) + { + header->scorelength = SHORT(header->scorelength); + header->scorestart = SHORT(header->scorestart); + header->primarychannels = SHORT(header->primarychannels); + header->secondarychannels = SHORT(header->secondarychannels); + header->instrumentcount = SHORT(header->instrumentcount); + } + + return result; +} + + +// Read a MUS file from a stream (musinput) and output a MIDI file to +// a stream (midioutput). +// +// Returns 0 on success or 1 on failure. + +boolean mus2mid(MEMFILE *musinput, MEMFILE *midioutput) +{ + // Header for the MUS file + musheader musfileheader; + + // Descriptor for the current MUS event + byte eventdescriptor; + int channel; // Channel number + musevent event; + + + // Bunch of vars read from MUS lump + byte key; + byte controllernumber; + byte controllervalue; + + // Buffer used for MIDI track size record + byte tracksizebuffer[4]; + + // Flag for when the score end marker is hit. + int hitscoreend = 0; + + // Temp working byte + byte working; + // Used in building up time delays + unsigned int timedelay; + + // Initialise channel map to mark all channels as unused. + + for (channel=0; channel 14) + { + return true; + } + + if (WriteChangeController_Valueless(channel, + controller_map[controllernumber], + midioutput)) + { + return true; + } + + break; + + case mus_changecontroller: + if (mem_fread(&controllernumber, 1, 1, musinput) != 1) + { + return true; + } + + if (mem_fread(&controllervalue, 1, 1, musinput) != 1) + { + return true; + } + + if (controllernumber == 0) + { + if (WriteChangePatch(channel, controllervalue, + midioutput)) + { + return true; + } + } + else + { + if (controllernumber < 1 || controllernumber > 9) + { + return true; + } + + if (WriteChangeController_Valued(channel, + controller_map[controllernumber], + controllervalue, + midioutput)) + { + return true; + } + } + + break; + + case mus_scoreend: + hitscoreend = 1; + break; + + default: + return true; + break; + } + + if (eventdescriptor & 0x80) + { + break; + } + } + // Now we need to read the time code: + if (!hitscoreend) + { + timedelay = 0; + for (;;) + { + if (mem_fread(&working, 1, 1, musinput) != 1) + { + return true; + } + + timedelay = timedelay * 128 + (working & 0x7F); + if ((working & 0x80) == 0) + { + break; + } + } + queuedtime += timedelay; + } + } + + // End of track + if (WriteEndTrack(midioutput)) + { + return true; + } + + // Write the track size into the stream + if (mem_fseek(midioutput, 18, MEM_SEEK_SET)) + { + return true; + } + + tracksizebuffer[0] = (tracksize >> 24) & 0xff; + tracksizebuffer[1] = (tracksize >> 16) & 0xff; + tracksizebuffer[2] = (tracksize >> 8) & 0xff; + tracksizebuffer[3] = tracksize & 0xff; + + if (mem_fwrite(tracksizebuffer, 1, 4, midioutput) != 4) + { + return true; + } + + return false; +} + +#ifdef STANDALONE + +#include "m_misc.h" +#include "z_zone.h" + +int main(int argc, char *argv[]) +{ + MEMFILE *src, *dst; + byte *infile; + long infile_len; + void *outfile; + size_t outfile_len; + + if (argc != 3) + { + printf("Usage: %s \n", argv[0]); + exit(-1); + } + + Z_Init(); + + infile_len = M_ReadFile(argv[1], &infile); + + src = mem_fopen_read(infile, infile_len); + dst = mem_fopen_write(); + + if (mus2mid(src, dst)) + { + fprintf(stderr, "mus2mid() failed\n"); + exit(-1); + } + + // Write result to output file: + + mem_get_buf(dst, &outfile, &outfile_len); + + M_WriteFile(argv[2], outfile, outfile_len); + + return 0; +} + +#endif + diff --git a/firmware_p4/components/Applications/doom/mus2mid.h b/firmware_p4/components/Applications/doom/mus2mid.h new file mode 100644 index 000000000..d21516c70 --- /dev/null +++ b/firmware_p4/components/Applications/doom/mus2mid.h @@ -0,0 +1,9 @@ +#ifndef MUS2MID_H +#define MUS2MID_H + +#include "doomtype.h" +#include "memio.h" + +boolean mus2mid(MEMFILE *musinput, MEMFILE *midioutput); + +#endif /* #ifndef MUS2MID_H */ \ No newline at end of file diff --git a/firmware_p4/components/Applications/doom/net_client.h b/firmware_p4/components/Applications/doom/net_client.h new file mode 100644 index 000000000..31dc9e4af --- /dev/null +++ b/firmware_p4/components/Applications/doom/net_client.h @@ -0,0 +1,52 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// Network client code +// + +#ifndef NET_CLIENT_H +#define NET_CLIENT_H + +#include "doomtype.h" +#include "d_ticcmd.h" +#include "sha1.h" +#include "net_defs.h" + +boolean NET_CL_Connect(net_addr_t *addr, net_connect_data_t *data); +void NET_CL_Disconnect(void); +void NET_CL_Run(void); +void NET_CL_Init(void); +void NET_CL_LaunchGame(void); +void NET_CL_StartGame(net_gamesettings_t *settings); +void NET_CL_SendTiccmd(ticcmd_t *ticcmd, int maketic); +boolean NET_CL_GetSettings(net_gamesettings_t *_settings); +void NET_Init(void); + +void NET_BindVariables(void); + +extern boolean net_client_connected; +extern boolean net_client_received_wait_data; +extern net_waitdata_t net_client_wait_data; +extern boolean net_waiting_for_launch; +extern char *net_player_name; + +extern sha1_digest_t net_server_wad_sha1sum; +extern sha1_digest_t net_server_deh_sha1sum; +extern unsigned int net_server_is_freedoom; +extern sha1_digest_t net_local_wad_sha1sum; +extern sha1_digest_t net_local_deh_sha1sum; +extern unsigned int net_local_is_freedoom; + +extern boolean drone; + +#endif /* #ifndef NET_CLIENT_H */ diff --git a/firmware_p4/components/Applications/doom/net_dedicated.h b/firmware_p4/components/Applications/doom/net_dedicated.h new file mode 100644 index 000000000..3d7387b57 --- /dev/null +++ b/firmware_p4/components/Applications/doom/net_dedicated.h @@ -0,0 +1,25 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// +// Dedicated server code. +// + +#ifndef NET_DEDICATED_H +#define NET_DEDICATED_H + +void NET_DedicatedServer(void); + +#endif /* #ifndef NET_DEDICATED_H */ + + diff --git a/firmware_p4/components/Applications/doom/net_defs.h b/firmware_p4/components/Applications/doom/net_defs.h new file mode 100644 index 000000000..bedfb95b9 --- /dev/null +++ b/firmware_p4/components/Applications/doom/net_defs.h @@ -0,0 +1,248 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Definitions for use in networking code. +// + +#ifndef NET_DEFS_H +#define NET_DEFS_H + +#include + +#include "doomtype.h" +#include "d_ticcmd.h" +#include "sha1.h" + +// Absolute maximum number of "nodes" in the game. This is different to +// NET_MAXPLAYERS, as there may be observers that are not participating +// (eg. left/right monitors) + +#define MAXNETNODES 16 + +// The maximum number of players, multiplayer/networking. +// This is the maximum supported by the networking code; individual games +// have their own values for MAXPLAYERS that can be smaller. + +#define NET_MAXPLAYERS 8 + +// Maximum length of a player's name. + +#define MAXPLAYERNAME 30 + +// Networking and tick handling related. + +#define BACKUPTICS 128 + +typedef struct _net_module_s net_module_t; +typedef struct _net_packet_s net_packet_t; +typedef struct _net_addr_s net_addr_t; +typedef struct _net_context_s net_context_t; + +struct _net_packet_s +{ + byte *data; + size_t len; + size_t alloced; + unsigned int pos; +}; + +struct _net_module_s +{ + // Initialize this module for use as a client + + boolean (*InitClient)(void); + + // Initialize this module for use as a server + + boolean (*InitServer)(void); + + // Send a packet + + void (*SendPacket)(net_addr_t *addr, net_packet_t *packet); + + // Check for new packets to receive + // + // Returns true if packet received + + boolean (*RecvPacket)(net_addr_t **addr, net_packet_t **packet); + + // Converts an address to a string + + void (*AddrToString)(net_addr_t *addr, char *buffer, int buffer_len); + + // Free back an address when no longer in use + + void (*FreeAddress)(net_addr_t *addr); + + // Try to resolve a name to an address + + net_addr_t *(*ResolveAddress)(char *addr); +}; + +// net_addr_t + +struct _net_addr_s +{ + net_module_t *module; + void *handle; +}; + +// magic number sent when connecting to check this is a valid client + +#define NET_MAGIC_NUMBER 3436803284U + +// header field value indicating that the packet is a reliable packet + +#define NET_RELIABLE_PACKET (1 << 15) + +// packet types + +typedef enum +{ + NET_PACKET_TYPE_SYN, + NET_PACKET_TYPE_ACK, + NET_PACKET_TYPE_REJECTED, + NET_PACKET_TYPE_KEEPALIVE, + NET_PACKET_TYPE_WAITING_DATA, + NET_PACKET_TYPE_GAMESTART, + NET_PACKET_TYPE_GAMEDATA, + NET_PACKET_TYPE_GAMEDATA_ACK, + NET_PACKET_TYPE_DISCONNECT, + NET_PACKET_TYPE_DISCONNECT_ACK, + NET_PACKET_TYPE_RELIABLE_ACK, + NET_PACKET_TYPE_GAMEDATA_RESEND, + NET_PACKET_TYPE_CONSOLE_MESSAGE, + NET_PACKET_TYPE_QUERY, + NET_PACKET_TYPE_QUERY_RESPONSE, + NET_PACKET_TYPE_LAUNCH, +} net_packet_type_t; + +typedef enum +{ + NET_MASTER_PACKET_TYPE_ADD, + NET_MASTER_PACKET_TYPE_ADD_RESPONSE, + NET_MASTER_PACKET_TYPE_QUERY, + NET_MASTER_PACKET_TYPE_QUERY_RESPONSE, + NET_MASTER_PACKET_TYPE_GET_METADATA, + NET_MASTER_PACKET_TYPE_GET_METADATA_RESPONSE, + NET_MASTER_PACKET_TYPE_SIGN_START, + NET_MASTER_PACKET_TYPE_SIGN_START_RESPONSE, + NET_MASTER_PACKET_TYPE_SIGN_END, + NET_MASTER_PACKET_TYPE_SIGN_END_RESPONSE, +} net_master_packet_type_t; + +// Settings specified when the client connects to the server. + +typedef struct +{ + int gamemode; + int gamemission; + int lowres_turn; + int drone; + int max_players; + int is_freedoom; + sha1_digest_t wad_sha1sum; + sha1_digest_t deh_sha1sum; + int player_class; +} net_connect_data_t; + +// Game settings sent by client to server when initiating game start, +// and received from the server by clients when the game starts. + +typedef struct +{ + int ticdup; + int extratics; + int deathmatch; + int episode; + int nomonsters; + int fast_monsters; + int respawn_monsters; + int map; + int skill; + int gameversion; + int lowres_turn; + int new_sync; + int timelimit; + int loadgame; + int random; // [Strife only] + + // These fields are only used by the server when sending a game + // start message: + + int num_players; + int consoleplayer; + + // Hexen player classes: + + int player_classes[NET_MAXPLAYERS]; + +} net_gamesettings_t; + +#define NET_TICDIFF_FORWARD (1 << 0) +#define NET_TICDIFF_SIDE (1 << 1) +#define NET_TICDIFF_TURN (1 << 2) +#define NET_TICDIFF_BUTTONS (1 << 3) +#define NET_TICDIFF_CONSISTANCY (1 << 4) +#define NET_TICDIFF_CHATCHAR (1 << 5) +#define NET_TICDIFF_RAVEN (1 << 6) +#define NET_TICDIFF_STRIFE (1 << 7) + +typedef struct +{ + unsigned int diff; + ticcmd_t cmd; +} net_ticdiff_t; + +// Complete set of ticcmds from all players + +typedef struct +{ + signed int latency; + unsigned int seq; + boolean playeringame[NET_MAXPLAYERS]; + net_ticdiff_t cmds[NET_MAXPLAYERS]; +} net_full_ticcmd_t; + +// Data sent in response to server queries + +typedef struct +{ + char *version; + int server_state; + int num_players; + int max_players; + int gamemode; + int gamemission; + char *description; +} net_querydata_t; + +// Data sent by the server while waiting for the game to start. + +typedef struct +{ + int num_players; + int num_drones; + int ready_players; + int max_players; + int is_controller; + int consoleplayer; + char player_names[NET_MAXPLAYERS][MAXPLAYERNAME]; + char player_addrs[NET_MAXPLAYERS][MAXPLAYERNAME]; + sha1_digest_t wad_sha1sum; + sha1_digest_t deh_sha1sum; + int is_freedoom; +} net_waitdata_t; + +#endif /* #ifndef NET_DEFS_H */ diff --git a/firmware_p4/components/Applications/doom/net_gui.h b/firmware_p4/components/Applications/doom/net_gui.h new file mode 100644 index 000000000..4f4198b60 --- /dev/null +++ b/firmware_p4/components/Applications/doom/net_gui.h @@ -0,0 +1,29 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// Graphical stuff related to the networking code: +// +// * The client waiting screen when we are waiting for the server to +// start the game. +// + + +#ifndef NET_GUI_H +#define NET_GUI_H + +#include "doomtype.h" + +extern void NET_WaitForLaunch(void); + +#endif /* #ifndef NET_GUI_H */ + diff --git a/firmware_p4/components/Applications/doom/net_io.h b/firmware_p4/components/Applications/doom/net_io.h new file mode 100644 index 000000000..535022230 --- /dev/null +++ b/firmware_p4/components/Applications/doom/net_io.h @@ -0,0 +1,36 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Network packet manipulation (net_packet_t) +// + +#ifndef NET_IO_H +#define NET_IO_H + +#include "net_defs.h" + +extern net_addr_t net_broadcast_addr; + +net_context_t *NET_NewContext(void); +void NET_AddModule(net_context_t *context, net_module_t *module); +void NET_SendPacket(net_addr_t *addr, net_packet_t *packet); +void NET_SendBroadcast(net_context_t *context, net_packet_t *packet); +boolean NET_RecvPacket(net_context_t *context, net_addr_t **addr, + net_packet_t **packet); +char *NET_AddrToString(net_addr_t *addr); +void NET_FreeAddress(net_addr_t *addr); +net_addr_t *NET_ResolveAddress(net_context_t *context, char *address); + +#endif /* #ifndef NET_IO_H */ + diff --git a/firmware_p4/components/Applications/doom/net_loop.h b/firmware_p4/components/Applications/doom/net_loop.h new file mode 100644 index 000000000..5a2e58ee1 --- /dev/null +++ b/firmware_p4/components/Applications/doom/net_loop.h @@ -0,0 +1,27 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Loopback network module for server compiled into the client +// + +#ifndef NET_LOOP_H +#define NET_LOOP_H + +#include "net_defs.h" + +extern net_module_t net_loop_client_module; +extern net_module_t net_loop_server_module; + +#endif /* #ifndef NET_LOOP_H */ + diff --git a/firmware_p4/components/Applications/doom/net_packet.h b/firmware_p4/components/Applications/doom/net_packet.h new file mode 100644 index 000000000..ced4e4358 --- /dev/null +++ b/firmware_p4/components/Applications/doom/net_packet.h @@ -0,0 +1,44 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Definitions for use in networking code. +// + +#ifndef NET_PACKET_H +#define NET_PACKET_H + +#include "net_defs.h" + +net_packet_t *NET_NewPacket(int initial_size); +net_packet_t *NET_PacketDup(net_packet_t *packet); +void NET_FreePacket(net_packet_t *packet); + +boolean NET_ReadInt8(net_packet_t *packet, unsigned int *data); +boolean NET_ReadInt16(net_packet_t *packet, unsigned int *data); +boolean NET_ReadInt32(net_packet_t *packet, unsigned int *data); + +boolean NET_ReadSInt8(net_packet_t *packet, signed int *data); +boolean NET_ReadSInt16(net_packet_t *packet, signed int *data); +boolean NET_ReadSInt32(net_packet_t *packet, signed int *data); + +char *NET_ReadString(net_packet_t *packet); + +void NET_WriteInt8(net_packet_t *packet, unsigned int i); +void NET_WriteInt16(net_packet_t *packet, unsigned int i); +void NET_WriteInt32(net_packet_t *packet, unsigned int i); + +void NET_WriteString(net_packet_t *packet, char *string); + +#endif /* #ifndef NET_PACKET_H */ + diff --git a/firmware_p4/components/Applications/doom/net_query.h b/firmware_p4/components/Applications/doom/net_query.h new file mode 100644 index 000000000..563a055b9 --- /dev/null +++ b/firmware_p4/components/Applications/doom/net_query.h @@ -0,0 +1,44 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Querying servers to find their current status. +// + +#ifndef NET_QUERY_H +#define NET_QUERY_H + +#include "net_defs.h" + +typedef void (*net_query_callback_t)(net_addr_t *addr, + net_querydata_t *querydata, + unsigned int ping_time, + void *user_data); + +extern int NET_StartLANQuery(void); +extern int NET_StartMasterQuery(void); + +extern void NET_LANQuery(void); +extern void NET_MasterQuery(void); +extern void NET_QueryAddress(char *addr); +extern net_addr_t *NET_FindLANServer(void); + +extern int NET_Query_Poll(net_query_callback_t callback, void *user_data); + +extern net_addr_t *NET_Query_ResolveMaster(net_context_t *context); +extern void NET_Query_AddToMaster(net_addr_t *master_addr); +extern boolean NET_Query_CheckAddedToMaster(boolean *result); +extern void NET_Query_MasterResponse(net_packet_t *packet); + +#endif /* #ifndef NET_QUERY_H */ + diff --git a/firmware_p4/components/Applications/doom/net_sdl.h b/firmware_p4/components/Applications/doom/net_sdl.h new file mode 100644 index 000000000..c249de1c4 --- /dev/null +++ b/firmware_p4/components/Applications/doom/net_sdl.h @@ -0,0 +1,26 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Networking module which uses SDL_net +// + +#ifndef NET_SDL_H +#define NET_SDL_H + +#include "net_defs.h" + +extern net_module_t net_sdl_module; + +#endif /* #ifndef NET_SDL_H */ + diff --git a/firmware_p4/components/Applications/doom/net_server.h b/firmware_p4/components/Applications/doom/net_server.h new file mode 100644 index 000000000..b9de7456e --- /dev/null +++ b/firmware_p4/components/Applications/doom/net_server.h @@ -0,0 +1,42 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// Network server code +// + +#ifndef NET_SERVER_H +#define NET_SERVER_H + +// initialize server and wait for connections + +void NET_SV_Init(void); + +// run server: check for new packets received etc. + +void NET_SV_Run(void); + +// Shut down the server +// Blocks until all clients disconnect, or until a 5 second timeout + +void NET_SV_Shutdown(void); + +// Add a network module to the context used by the server + +void NET_SV_AddModule(net_module_t *module); + +// Register server with master server. + +void NET_SV_RegisterWithMaster(void); + +#endif /* #ifndef NET_SERVER_H */ + diff --git a/firmware_p4/components/Applications/doom/p_ceilng.c b/firmware_p4/components/Applications/doom/p_ceilng.c new file mode 100644 index 000000000..d1e61c898 --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_ceilng.c @@ -0,0 +1,324 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: Ceiling aninmation (lowering, crushing, raising) +// + + + +#include "z_zone.h" +#include "doomdef.h" +#include "p_local.h" + +#include "s_sound.h" + +// State. +#include "doomstat.h" +#include "r_state.h" + +// Data. +#include "sounds.h" + +// +// CEILINGS +// + + +ceiling_t* activeceilings[MAXCEILINGS]; + + +// +// T_MoveCeiling +// + +void T_MoveCeiling (ceiling_t* ceiling) +{ + result_e res; + + switch(ceiling->direction) + { + case 0: + // IN STASIS + break; + case 1: + // UP + res = T_MovePlane(ceiling->sector, + ceiling->speed, + ceiling->topheight, + false,1,ceiling->direction); + + if (!(leveltime&7)) + { + switch(ceiling->type) + { + case silentCrushAndRaise: + break; + default: + S_StartSound(&ceiling->sector->soundorg, sfx_stnmov); + // ? + break; + } + } + + if (res == pastdest) + { + switch(ceiling->type) + { + case raiseToHighest: + P_RemoveActiveCeiling(ceiling); + break; + + case silentCrushAndRaise: + S_StartSound(&ceiling->sector->soundorg, sfx_pstop); + case fastCrushAndRaise: + case crushAndRaise: + ceiling->direction = -1; + break; + + default: + break; + } + + } + break; + + case -1: + // DOWN + res = T_MovePlane(ceiling->sector, + ceiling->speed, + ceiling->bottomheight, + ceiling->crush,1,ceiling->direction); + + if (!(leveltime&7)) + { + switch(ceiling->type) + { + case silentCrushAndRaise: break; + default: + S_StartSound(&ceiling->sector->soundorg, sfx_stnmov); + } + } + + if (res == pastdest) + { + switch(ceiling->type) + { + case silentCrushAndRaise: + S_StartSound(&ceiling->sector->soundorg, sfx_pstop); + case crushAndRaise: + ceiling->speed = CEILSPEED; + case fastCrushAndRaise: + ceiling->direction = 1; + break; + + case lowerAndCrush: + case lowerToFloor: + P_RemoveActiveCeiling(ceiling); + break; + + default: + break; + } + } + else // ( res != pastdest ) + { + if (res == crushed) + { + switch(ceiling->type) + { + case silentCrushAndRaise: + case crushAndRaise: + case lowerAndCrush: + ceiling->speed = CEILSPEED / 8; + break; + + default: + break; + } + } + } + break; + } +} + + +// +// EV_DoCeiling +// Move a ceiling up/down and all around! +// +int +EV_DoCeiling +( line_t* line, + ceiling_e type ) +{ + int secnum; + int rtn; + sector_t* sec; + ceiling_t* ceiling; + + secnum = -1; + rtn = 0; + + // Reactivate in-stasis ceilings...for certain types. + switch(type) + { + case fastCrushAndRaise: + case silentCrushAndRaise: + case crushAndRaise: + P_ActivateInStasisCeiling(line); + default: + break; + } + + while ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0) + { + sec = §ors[secnum]; + if (sec->specialdata) + continue; + + // new door thinker + rtn = 1; + ceiling = Z_Malloc (sizeof(*ceiling), PU_LEVSPEC, 0); + P_AddThinker (&ceiling->thinker); + sec->specialdata = ceiling; + ceiling->thinker.function.acp1 = (actionf_p1)T_MoveCeiling; + ceiling->sector = sec; + ceiling->crush = false; + + switch(type) + { + case fastCrushAndRaise: + ceiling->crush = true; + ceiling->topheight = sec->ceilingheight; + ceiling->bottomheight = sec->floorheight + (8*FRACUNIT); + ceiling->direction = -1; + ceiling->speed = CEILSPEED * 2; + break; + + case silentCrushAndRaise: + case crushAndRaise: + ceiling->crush = true; + ceiling->topheight = sec->ceilingheight; + case lowerAndCrush: + case lowerToFloor: + ceiling->bottomheight = sec->floorheight; + if (type != lowerToFloor) + ceiling->bottomheight += 8*FRACUNIT; + ceiling->direction = -1; + ceiling->speed = CEILSPEED; + break; + + case raiseToHighest: + ceiling->topheight = P_FindHighestCeilingSurrounding(sec); + ceiling->direction = 1; + ceiling->speed = CEILSPEED; + break; + } + + ceiling->tag = sec->tag; + ceiling->type = type; + P_AddActiveCeiling(ceiling); + } + return rtn; +} + + +// +// Add an active ceiling +// +void P_AddActiveCeiling(ceiling_t* c) +{ + int i; + + for (i = 0; i < MAXCEILINGS;i++) + { + if (activeceilings[i] == NULL) + { + activeceilings[i] = c; + return; + } + } +} + + + +// +// Remove a ceiling's thinker +// +void P_RemoveActiveCeiling(ceiling_t* c) +{ + int i; + + for (i = 0;i < MAXCEILINGS;i++) + { + if (activeceilings[i] == c) + { + activeceilings[i]->sector->specialdata = NULL; + P_RemoveThinker (&activeceilings[i]->thinker); + activeceilings[i] = NULL; + break; + } + } +} + + + +// +// Restart a ceiling that's in-stasis +// +void P_ActivateInStasisCeiling(line_t* line) +{ + int i; + + for (i = 0;i < MAXCEILINGS;i++) + { + if (activeceilings[i] + && (activeceilings[i]->tag == line->tag) + && (activeceilings[i]->direction == 0)) + { + activeceilings[i]->direction = activeceilings[i]->olddirection; + activeceilings[i]->thinker.function.acp1 + = (actionf_p1)T_MoveCeiling; + } + } +} + + + +// +// EV_CeilingCrushStop +// Stop a ceiling from crushing! +// +int EV_CeilingCrushStop(line_t *line) +{ + int i; + int rtn; + + rtn = 0; + for (i = 0;i < MAXCEILINGS;i++) + { + if (activeceilings[i] + && (activeceilings[i]->tag == line->tag) + && (activeceilings[i]->direction != 0)) + { + activeceilings[i]->olddirection = activeceilings[i]->direction; + activeceilings[i]->thinker.function.acv = (actionf_v)NULL; + activeceilings[i]->direction = 0; // in-stasis + rtn = 1; + } + } + + + return rtn; +} diff --git a/firmware_p4/components/Applications/doom/p_doors.c b/firmware_p4/components/Applications/doom/p_doors.c new file mode 100644 index 000000000..cafab0f43 --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_doors.c @@ -0,0 +1,778 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: Door animation code (opening/closing) +// + + + +#include "z_zone.h" +#include "doomdef.h" +#include "deh_main.h" +#include "p_local.h" + +#include "s_sound.h" + + +// State. +#include "doomstat.h" +#include "r_state.h" + +// Data. +#include "dstrings.h" +#include "sounds.h" + +#if 0 +// +// Sliding door frame information +// +slidename_t slideFrameNames[MAXSLIDEDOORS] = +{ + {"GDOORF1","GDOORF2","GDOORF3","GDOORF4", // front + "GDOORB1","GDOORB2","GDOORB3","GDOORB4"}, // back + + {"\0","\0","\0","\0"} +}; +#endif + + +// +// VERTICAL DOORS +// + +// +// T_VerticalDoor +// +void T_VerticalDoor (vldoor_t* door) +{ + result_e res; + + switch(door->direction) + { + case 0: + // WAITING + if (!--door->topcountdown) + { + switch(door->type) + { + case vld_blazeRaise: + door->direction = -1; // time to go back down + S_StartSound(&door->sector->soundorg, sfx_bdcls); + break; + + case vld_normal: + door->direction = -1; // time to go back down + S_StartSound(&door->sector->soundorg, sfx_dorcls); + break; + + case vld_close30ThenOpen: + door->direction = 1; + S_StartSound(&door->sector->soundorg, sfx_doropn); + break; + + default: + break; + } + } + break; + + case 2: + // INITIAL WAIT + if (!--door->topcountdown) + { + switch(door->type) + { + case vld_raiseIn5Mins: + door->direction = 1; + door->type = vld_normal; + S_StartSound(&door->sector->soundorg, sfx_doropn); + break; + + default: + break; + } + } + break; + + case -1: + // DOWN + res = T_MovePlane(door->sector, + door->speed, + door->sector->floorheight, + false,1,door->direction); + if (res == pastdest) + { + switch(door->type) + { + case vld_blazeRaise: + case vld_blazeClose: + door->sector->specialdata = NULL; + P_RemoveThinker (&door->thinker); // unlink and free + S_StartSound(&door->sector->soundorg, sfx_bdcls); + break; + + case vld_normal: + case vld_close: + door->sector->specialdata = NULL; + P_RemoveThinker (&door->thinker); // unlink and free + break; + + case vld_close30ThenOpen: + door->direction = 0; + door->topcountdown = TICRATE*30; + break; + + default: + break; + } + } + else if (res == crushed) + { + switch(door->type) + { + case vld_blazeClose: + case vld_close: // DO NOT GO BACK UP! + break; + + default: + door->direction = 1; + S_StartSound(&door->sector->soundorg, sfx_doropn); + break; + } + } + break; + + case 1: + // UP + res = T_MovePlane(door->sector, + door->speed, + door->topheight, + false,1,door->direction); + + if (res == pastdest) + { + switch(door->type) + { + case vld_blazeRaise: + case vld_normal: + door->direction = 0; // wait at top + door->topcountdown = door->topwait; + break; + + case vld_close30ThenOpen: + case vld_blazeOpen: + case vld_open: + door->sector->specialdata = NULL; + P_RemoveThinker (&door->thinker); // unlink and free + break; + + default: + break; + } + } + break; + } +} + + +// +// EV_DoLockedDoor +// Move a locked door up/down +// + +int +EV_DoLockedDoor +( line_t* line, + vldoor_e type, + mobj_t* thing ) +{ + player_t* p; + + p = thing->player; + + if (!p) + return 0; + + switch(line->special) + { + case 99: // Blue Lock + case 133: + if ( !p ) + return 0; + if (!p->cards[it_bluecard] && !p->cards[it_blueskull]) + { + p->message = DEH_String(PD_BLUEO); + S_StartSound(NULL,sfx_oof); + return 0; + } + break; + + case 134: // Red Lock + case 135: + if ( !p ) + return 0; + if (!p->cards[it_redcard] && !p->cards[it_redskull]) + { + p->message = DEH_String(PD_REDO); + S_StartSound(NULL,sfx_oof); + return 0; + } + break; + + case 136: // Yellow Lock + case 137: + if ( !p ) + return 0; + if (!p->cards[it_yellowcard] && + !p->cards[it_yellowskull]) + { + p->message = DEH_String(PD_YELLOWO); + S_StartSound(NULL,sfx_oof); + return 0; + } + break; + } + + return EV_DoDoor(line,type); +} + + +int +EV_DoDoor +( line_t* line, + vldoor_e type ) +{ + int secnum,rtn; + sector_t* sec; + vldoor_t* door; + + secnum = -1; + rtn = 0; + + while ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0) + { + sec = §ors[secnum]; + if (sec->specialdata) + continue; + + + // new door thinker + rtn = 1; + door = Z_Malloc (sizeof(*door), PU_LEVSPEC, 0); + P_AddThinker (&door->thinker); + sec->specialdata = door; + + door->thinker.function.acp1 = (actionf_p1) T_VerticalDoor; + door->sector = sec; + door->type = type; + door->topwait = VDOORWAIT; + door->speed = VDOORSPEED; + + switch(type) + { + case vld_blazeClose: + door->topheight = P_FindLowestCeilingSurrounding(sec); + door->topheight -= 4*FRACUNIT; + door->direction = -1; + door->speed = VDOORSPEED * 4; + S_StartSound(&door->sector->soundorg, sfx_bdcls); + break; + + case vld_close: + door->topheight = P_FindLowestCeilingSurrounding(sec); + door->topheight -= 4*FRACUNIT; + door->direction = -1; + S_StartSound(&door->sector->soundorg, sfx_dorcls); + break; + + case vld_close30ThenOpen: + door->topheight = sec->ceilingheight; + door->direction = -1; + S_StartSound(&door->sector->soundorg, sfx_dorcls); + break; + + case vld_blazeRaise: + case vld_blazeOpen: + door->direction = 1; + door->topheight = P_FindLowestCeilingSurrounding(sec); + door->topheight -= 4*FRACUNIT; + door->speed = VDOORSPEED * 4; + if (door->topheight != sec->ceilingheight) + S_StartSound(&door->sector->soundorg, sfx_bdopn); + break; + + case vld_normal: + case vld_open: + door->direction = 1; + door->topheight = P_FindLowestCeilingSurrounding(sec); + door->topheight -= 4*FRACUNIT; + if (door->topheight != sec->ceilingheight) + S_StartSound(&door->sector->soundorg, sfx_doropn); + break; + + default: + break; + } + + } + return rtn; +} + + +// +// EV_VerticalDoor : open a door manually, no tag value +// +void +EV_VerticalDoor +( line_t* line, + mobj_t* thing ) +{ + player_t* player; + sector_t* sec; + vldoor_t* door; + int side; + + side = 0; // only front sides can be used + + // Check for locks + player = thing->player; + + switch(line->special) + { + case 26: // Blue Lock + case 32: + if ( !player ) + return; + + if (!player->cards[it_bluecard] && !player->cards[it_blueskull]) + { + player->message = DEH_String(PD_BLUEK); + S_StartSound(NULL,sfx_oof); + return; + } + break; + + case 27: // Yellow Lock + case 34: + if ( !player ) + return; + + if (!player->cards[it_yellowcard] && + !player->cards[it_yellowskull]) + { + player->message = DEH_String(PD_YELLOWK); + S_StartSound(NULL,sfx_oof); + return; + } + break; + + case 28: // Red Lock + case 33: + if ( !player ) + return; + + if (!player->cards[it_redcard] && !player->cards[it_redskull]) + { + player->message = DEH_String(PD_REDK); + S_StartSound(NULL,sfx_oof); + return; + } + break; + } + + // if the sector has an active thinker, use it + sec = sides[ line->sidenum[side^1]] .sector; + + if (sec->specialdata) + { + door = sec->specialdata; + switch(line->special) + { + case 1: // ONLY FOR "RAISE" DOORS, NOT "OPEN"s + case 26: + case 27: + case 28: + case 117: + if (door->direction == -1) + door->direction = 1; // go back up + else + { + if (!thing->player) + return; // JDC: bad guys never close doors + + // When is a door not a door? + // In Vanilla, door->direction is set, even though + // "specialdata" might not actually point at a door. + + if (door->thinker.function.acp1 == (actionf_p1) T_VerticalDoor) + { + door->direction = -1; // start going down immediately + } + else if (door->thinker.function.acp1 == (actionf_p1) T_PlatRaise) + { + // Erm, this is a plat, not a door. + // This notably causes a problem in ep1-0500.lmp where + // a plat and a door are cross-referenced; the door + // doesn't open on 64-bit. + // The direction field in vldoor_t corresponds to the wait + // field in plat_t. Let's set that to -1 instead. + + plat_t *plat; + + plat = (plat_t *) door; + plat->wait = -1; + } + else + { + // This isn't a door OR a plat. Now we're in trouble. + + fprintf(stderr, "EV_VerticalDoor: Tried to close " + "something that wasn't a door.\n"); + + // Try closing it anyway. At least it will work on 32-bit + // machines. + + door->direction = -1; + } + } + return; + } + } + + // for proper sound + switch(line->special) + { + case 117: // BLAZING DOOR RAISE + case 118: // BLAZING DOOR OPEN + S_StartSound(&sec->soundorg,sfx_bdopn); + break; + + case 1: // NORMAL DOOR SOUND + case 31: + S_StartSound(&sec->soundorg,sfx_doropn); + break; + + default: // LOCKED DOOR SOUND + S_StartSound(&sec->soundorg,sfx_doropn); + break; + } + + + // new door thinker + door = Z_Malloc (sizeof(*door), PU_LEVSPEC, 0); + P_AddThinker (&door->thinker); + sec->specialdata = door; + door->thinker.function.acp1 = (actionf_p1) T_VerticalDoor; + door->sector = sec; + door->direction = 1; + door->speed = VDOORSPEED; + door->topwait = VDOORWAIT; + + switch(line->special) + { + case 1: + case 26: + case 27: + case 28: + door->type = vld_normal; + break; + + case 31: + case 32: + case 33: + case 34: + door->type = vld_open; + line->special = 0; + break; + + case 117: // blazing door raise + door->type = vld_blazeRaise; + door->speed = VDOORSPEED*4; + break; + case 118: // blazing door open + door->type = vld_blazeOpen; + line->special = 0; + door->speed = VDOORSPEED*4; + break; + } + + // find the top and bottom of the movement range + door->topheight = P_FindLowestCeilingSurrounding(sec); + door->topheight -= 4*FRACUNIT; +} + + +// +// Spawn a door that closes after 30 seconds +// +void P_SpawnDoorCloseIn30 (sector_t* sec) +{ + vldoor_t* door; + + door = Z_Malloc ( sizeof(*door), PU_LEVSPEC, 0); + + P_AddThinker (&door->thinker); + + sec->specialdata = door; + sec->special = 0; + + door->thinker.function.acp1 = (actionf_p1)T_VerticalDoor; + door->sector = sec; + door->direction = 0; + door->type = vld_normal; + door->speed = VDOORSPEED; + door->topcountdown = 30 * TICRATE; +} + +// +// Spawn a door that opens after 5 minutes +// +void +P_SpawnDoorRaiseIn5Mins +( sector_t* sec, + int secnum ) +{ + vldoor_t* door; + + door = Z_Malloc ( sizeof(*door), PU_LEVSPEC, 0); + + P_AddThinker (&door->thinker); + + sec->specialdata = door; + sec->special = 0; + + door->thinker.function.acp1 = (actionf_p1)T_VerticalDoor; + door->sector = sec; + door->direction = 2; + door->type = vld_raiseIn5Mins; + door->speed = VDOORSPEED; + door->topheight = P_FindLowestCeilingSurrounding(sec); + door->topheight -= 4*FRACUNIT; + door->topwait = VDOORWAIT; + door->topcountdown = 5 * 60 * TICRATE; +} + + + +// UNUSED +// Separate into p_slidoor.c? + +#if 0 // ABANDONED TO THE MISTS OF TIME!!! +// +// EV_SlidingDoor : slide a door horizontally +// (animate midtexture, then set noblocking line) +// + + +slideframe_t slideFrames[MAXSLIDEDOORS]; + +void P_InitSlidingDoorFrames(void) +{ + int i; + int f1; + int f2; + int f3; + int f4; + + // DOOM II ONLY... + if ( gamemode != commercial) + return; + + for (i = 0;i < MAXSLIDEDOORS; i++) + { + if (!slideFrameNames[i].frontFrame1[0]) + break; + + f1 = R_TextureNumForName(slideFrameNames[i].frontFrame1); + f2 = R_TextureNumForName(slideFrameNames[i].frontFrame2); + f3 = R_TextureNumForName(slideFrameNames[i].frontFrame3); + f4 = R_TextureNumForName(slideFrameNames[i].frontFrame4); + + slideFrames[i].frontFrames[0] = f1; + slideFrames[i].frontFrames[1] = f2; + slideFrames[i].frontFrames[2] = f3; + slideFrames[i].frontFrames[3] = f4; + + f1 = R_TextureNumForName(slideFrameNames[i].backFrame1); + f2 = R_TextureNumForName(slideFrameNames[i].backFrame2); + f3 = R_TextureNumForName(slideFrameNames[i].backFrame3); + f4 = R_TextureNumForName(slideFrameNames[i].backFrame4); + + slideFrames[i].backFrames[0] = f1; + slideFrames[i].backFrames[1] = f2; + slideFrames[i].backFrames[2] = f3; + slideFrames[i].backFrames[3] = f4; + } +} + + +// +// Return index into "slideFrames" array +// for which door type to use +// +int P_FindSlidingDoorType(line_t* line) +{ + int i; + int val; + + for (i = 0;i < MAXSLIDEDOORS;i++) + { + val = sides[line->sidenum[0]].midtexture; + if (val == slideFrames[i].frontFrames[0]) + return i; + } + + return -1; +} + +void T_SlidingDoor (slidedoor_t* door) +{ + switch(door->status) + { + case sd_opening: + if (!door->timer--) + { + if (++door->frame == SNUMFRAMES) + { + // IF DOOR IS DONE OPENING... + sides[door->line->sidenum[0]].midtexture = 0; + sides[door->line->sidenum[1]].midtexture = 0; + door->line->flags &= ML_BLOCKING^0xff; + + if (door->type == sdt_openOnly) + { + door->frontsector->specialdata = NULL; + P_RemoveThinker (&door->thinker); + break; + } + + door->timer = SDOORWAIT; + door->status = sd_waiting; + } + else + { + // IF DOOR NEEDS TO ANIMATE TO NEXT FRAME... + door->timer = SWAITTICS; + + sides[door->line->sidenum[0]].midtexture = + slideFrames[door->whichDoorIndex]. + frontFrames[door->frame]; + sides[door->line->sidenum[1]].midtexture = + slideFrames[door->whichDoorIndex]. + backFrames[door->frame]; + } + } + break; + + case sd_waiting: + // IF DOOR IS DONE WAITING... + if (!door->timer--) + { + // CAN DOOR CLOSE? + if (door->frontsector->thinglist != NULL || + door->backsector->thinglist != NULL) + { + door->timer = SDOORWAIT; + break; + } + + //door->frame = SNUMFRAMES-1; + door->status = sd_closing; + door->timer = SWAITTICS; + } + break; + + case sd_closing: + if (!door->timer--) + { + if (--door->frame < 0) + { + // IF DOOR IS DONE CLOSING... + door->line->flags |= ML_BLOCKING; + door->frontsector->specialdata = NULL; + P_RemoveThinker (&door->thinker); + break; + } + else + { + // IF DOOR NEEDS TO ANIMATE TO NEXT FRAME... + door->timer = SWAITTICS; + + sides[door->line->sidenum[0]].midtexture = + slideFrames[door->whichDoorIndex]. + frontFrames[door->frame]; + sides[door->line->sidenum[1]].midtexture = + slideFrames[door->whichDoorIndex]. + backFrames[door->frame]; + } + } + break; + } +} + + + +void +EV_SlidingDoor +( line_t* line, + mobj_t* thing ) +{ + sector_t* sec; + slidedoor_t* door; + + // DOOM II ONLY... + if (gamemode != commercial) + return; + + // Make sure door isn't already being animated + sec = line->frontsector; + door = NULL; + if (sec->specialdata) + { + if (!thing->player) + return; + + door = sec->specialdata; + if (door->type == sdt_openAndClose) + { + if (door->status == sd_waiting) + door->status = sd_closing; + } + else + return; + } + + // Init sliding door vars + if (!door) + { + door = Z_Malloc (sizeof(*door), PU_LEVSPEC, 0); + P_AddThinker (&door->thinker); + sec->specialdata = door; + + door->type = sdt_openAndClose; + door->status = sd_opening; + door->whichDoorIndex = P_FindSlidingDoorType(line); + + if (door->whichDoorIndex < 0) + I_Error("EV_SlidingDoor: Can't use texture for sliding door!"); + + door->frontsector = sec; + door->backsector = line->backsector; + door->thinker.function = T_SlidingDoor; + door->timer = SWAITTICS; + door->frame = 0; + door->line = line; + } +} +#endif diff --git a/firmware_p4/components/Applications/doom/p_enemy.c b/firmware_p4/components/Applications/doom/p_enemy.c new file mode 100644 index 000000000..f2b44d139 --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_enemy.c @@ -0,0 +1,2006 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Enemy thinking, AI. +// Action Pointer Functions +// that are associated with states/frames. +// + +#include +#include + +#include "m_random.h" +#include "i_system.h" + +#include "doomdef.h" +#include "p_local.h" + +#include "s_sound.h" + +#include "g_game.h" + +// State. +#include "doomstat.h" +#include "r_state.h" + +// Data. +#include "sounds.h" + + + + +typedef enum +{ + DI_EAST, + DI_NORTHEAST, + DI_NORTH, + DI_NORTHWEST, + DI_WEST, + DI_SOUTHWEST, + DI_SOUTH, + DI_SOUTHEAST, + DI_NODIR, + NUMDIRS + +} dirtype_t; + + +// +// P_NewChaseDir related LUT. +// +dirtype_t opposite[] = +{ + DI_WEST, DI_SOUTHWEST, DI_SOUTH, DI_SOUTHEAST, + DI_EAST, DI_NORTHEAST, DI_NORTH, DI_NORTHWEST, DI_NODIR +}; + +dirtype_t diags[] = +{ + DI_NORTHWEST, DI_NORTHEAST, DI_SOUTHWEST, DI_SOUTHEAST +}; + + + + + +void A_Fall (mobj_t *actor); + + +// +// ENEMY THINKING +// Enemies are allways spawned +// with targetplayer = -1, threshold = 0 +// Most monsters are spawned unaware of all players, +// but some can be made preaware +// + + +// +// Called by P_NoiseAlert. +// Recursively traverse adjacent sectors, +// sound blocking lines cut off traversal. +// + +mobj_t* soundtarget; + +void +P_RecursiveSound +( sector_t* sec, + int soundblocks ) +{ + int i; + line_t* check; + sector_t* other; + + // wake up all monsters in this sector + if (sec->validcount == validcount + && sec->soundtraversed <= soundblocks+1) + { + return; // already flooded + } + + sec->validcount = validcount; + sec->soundtraversed = soundblocks+1; + sec->soundtarget = soundtarget; + + for (i=0 ;ilinecount ; i++) + { + check = sec->lines[i]; + if (! (check->flags & ML_TWOSIDED) ) + continue; + + P_LineOpening (check); + + if (openrange <= 0) + continue; // closed door + + if ( sides[ check->sidenum[0] ].sector == sec) + other = sides[ check->sidenum[1] ] .sector; + else + other = sides[ check->sidenum[0] ].sector; + + if (check->flags & ML_SOUNDBLOCK) + { + if (!soundblocks) + P_RecursiveSound (other, 1); + } + else + P_RecursiveSound (other, soundblocks); + } +} + + + +// +// P_NoiseAlert +// If a monster yells at a player, +// it will alert other monsters to the player. +// +void +P_NoiseAlert +( mobj_t* target, + mobj_t* emmiter ) +{ + soundtarget = target; + validcount++; + P_RecursiveSound (emmiter->subsector->sector, 0); +} + + + + +// +// P_CheckMeleeRange +// +boolean P_CheckMeleeRange (mobj_t* actor) +{ + mobj_t* pl; + fixed_t dist; + + if (!actor->target) + return false; + + pl = actor->target; + dist = P_AproxDistance (pl->x-actor->x, pl->y-actor->y); + + if (dist >= MELEERANGE-20*FRACUNIT+pl->info->radius) + return false; + + if (! P_CheckSight (actor, actor->target) ) + return false; + + return true; +} + +// +// P_CheckMissileRange +// +boolean P_CheckMissileRange (mobj_t* actor) +{ + fixed_t dist; + + if (! P_CheckSight (actor, actor->target) ) + return false; + + if ( actor->flags & MF_JUSTHIT ) + { + // the target just hit the enemy, + // so fight back! + actor->flags &= ~MF_JUSTHIT; + return true; + } + + if (actor->reactiontime) + return false; // do not attack yet + + // OPTIMIZE: get this from a global checksight + dist = P_AproxDistance ( actor->x-actor->target->x, + actor->y-actor->target->y) - 64*FRACUNIT; + + if (!actor->info->meleestate) + dist -= 128*FRACUNIT; // no melee attack, so fire more + + dist >>= 16; + + if (actor->type == MT_VILE) + { + if (dist > 14*64) + return false; // too far away + } + + + if (actor->type == MT_UNDEAD) + { + if (dist < 196) + return false; // close for fist attack + dist >>= 1; + } + + + if (actor->type == MT_CYBORG + || actor->type == MT_SPIDER + || actor->type == MT_SKULL) + { + dist >>= 1; + } + + if (dist > 200) + dist = 200; + + if (actor->type == MT_CYBORG && dist > 160) + dist = 160; + + if (P_Random () < dist) + return false; + + return true; +} + + +// +// P_Move +// Move in the current direction, +// returns false if the move is blocked. +// +fixed_t xspeed[8] = {FRACUNIT,47000,0,-47000,-FRACUNIT,-47000,0,47000}; +fixed_t yspeed[8] = {0,47000,FRACUNIT,47000,0,-47000,-FRACUNIT,-47000}; + +boolean P_Move (mobj_t* actor) +{ + fixed_t tryx; + fixed_t tryy; + + line_t* ld; + + // warning: 'catch', 'throw', and 'try' + // are all C++ reserved words + boolean try_ok; + boolean good; + + if (actor->movedir == DI_NODIR) + return false; + + if ((unsigned)actor->movedir >= 8) + I_Error ("Weird actor->movedir!"); + + tryx = actor->x + actor->info->speed*xspeed[actor->movedir]; + tryy = actor->y + actor->info->speed*yspeed[actor->movedir]; + + try_ok = P_TryMove (actor, tryx, tryy); + + if (!try_ok) + { + // open any specials + if (actor->flags & MF_FLOAT && floatok) + { + // must adjust height + if (actor->z < tmfloorz) + actor->z += FLOATSPEED; + else + actor->z -= FLOATSPEED; + + actor->flags |= MF_INFLOAT; + return true; + } + + if (!numspechit) + return false; + + actor->movedir = DI_NODIR; + good = false; + while (numspechit--) + { + ld = spechit[numspechit]; + // if the special is not a door + // that can be opened, + // return false + if (P_UseSpecialLine (actor, ld,0)) + good = true; + } + return good; + } + else + { + actor->flags &= ~MF_INFLOAT; + } + + + if (! (actor->flags & MF_FLOAT) ) + actor->z = actor->floorz; + return true; +} + + +// +// TryWalk +// Attempts to move actor on +// in its current (ob->moveangle) direction. +// If blocked by either a wall or an actor +// returns FALSE +// If move is either clear or blocked only by a door, +// returns TRUE and sets... +// If a door is in the way, +// an OpenDoor call is made to start it opening. +// +boolean P_TryWalk (mobj_t* actor) +{ + if (!P_Move (actor)) + { + return false; + } + + actor->movecount = P_Random()&15; + return true; +} + + + + +void P_NewChaseDir (mobj_t* actor) +{ + fixed_t deltax; + fixed_t deltay; + + dirtype_t d[3]; + + int tdir; + dirtype_t olddir; + + dirtype_t turnaround; + + if (!actor->target) + I_Error ("P_NewChaseDir: called with no target"); + + olddir = actor->movedir; + turnaround=opposite[olddir]; + + deltax = actor->target->x - actor->x; + deltay = actor->target->y - actor->y; + + if (deltax>10*FRACUNIT) + d[1]= DI_EAST; + else if (deltax<-10*FRACUNIT) + d[1]= DI_WEST; + else + d[1]=DI_NODIR; + + if (deltay<-10*FRACUNIT) + d[2]= DI_SOUTH; + else if (deltay>10*FRACUNIT) + d[2]= DI_NORTH; + else + d[2]=DI_NODIR; + + // try direct route + if (d[1] != DI_NODIR + && d[2] != DI_NODIR) + { + actor->movedir = diags[((deltay<0)<<1)+(deltax>0)]; + if (actor->movedir != (int) turnaround && P_TryWalk(actor)) + return; + } + + // try other directions + if (P_Random() > 200 + || abs(deltay)>abs(deltax)) + { + tdir=d[1]; + d[1]=d[2]; + d[2]=tdir; + } + + if (d[1]==turnaround) + d[1]=DI_NODIR; + if (d[2]==turnaround) + d[2]=DI_NODIR; + + if (d[1]!=DI_NODIR) + { + actor->movedir = d[1]; + if (P_TryWalk(actor)) + { + // either moved forward or attacked + return; + } + } + + if (d[2]!=DI_NODIR) + { + actor->movedir =d[2]; + + if (P_TryWalk(actor)) + return; + } + + // there is no direct path to the player, + // so pick another direction. + if (olddir!=DI_NODIR) + { + actor->movedir =olddir; + + if (P_TryWalk(actor)) + return; + } + + // randomly determine direction of search + if (P_Random()&1) + { + for ( tdir=DI_EAST; + tdir<=DI_SOUTHEAST; + tdir++ ) + { + if (tdir != (int) turnaround) + { + actor->movedir =tdir; + + if ( P_TryWalk(actor) ) + return; + } + } + } + else + { + for ( tdir=DI_SOUTHEAST; + tdir != (DI_EAST-1); + tdir-- ) + { + if (tdir != (int) turnaround) + { + actor->movedir = tdir; + + if ( P_TryWalk(actor) ) + return; + } + } + } + + if (turnaround != DI_NODIR) + { + actor->movedir =turnaround; + if ( P_TryWalk(actor) ) + return; + } + + actor->movedir = DI_NODIR; // can not move +} + + + +// +// P_LookForPlayers +// If allaround is false, only look 180 degrees in front. +// Returns true if a player is targeted. +// +boolean +P_LookForPlayers +( mobj_t* actor, + boolean allaround ) +{ + int c; + int stop; + player_t* player; + angle_t an; + fixed_t dist; + + c = 0; + stop = (actor->lastlook-1)&3; + + for ( ; ; actor->lastlook = (actor->lastlook+1)&3 ) + { + if (!playeringame[actor->lastlook]) + continue; + + if (c++ == 2 + || actor->lastlook == stop) + { + // done looking + return false; + } + + player = &players[actor->lastlook]; + + if (player->health <= 0) + continue; // dead + + if (!P_CheckSight (actor, player->mo)) + continue; // out of sight + + if (!allaround) + { + an = R_PointToAngle2 (actor->x, + actor->y, + player->mo->x, + player->mo->y) + - actor->angle; + + if (an > ANG90 && an < ANG270) + { + dist = P_AproxDistance (player->mo->x - actor->x, + player->mo->y - actor->y); + // if real close, react anyway + if (dist > MELEERANGE) + continue; // behind back + } + } + + actor->target = player->mo; + return true; + } + + return false; +} + + +// +// A_KeenDie +// DOOM II special, map 32. +// Uses special tag 666. +// +void A_KeenDie (mobj_t* mo) +{ + thinker_t* th; + mobj_t* mo2; + line_t junk; + + A_Fall (mo); + + // scan the remaining thinkers + // to see if all Keens are dead + for (th = thinkercap.next ; th != &thinkercap ; th=th->next) + { + if (th->function.acp1 != (actionf_p1)P_MobjThinker) + continue; + + mo2 = (mobj_t *)th; + if (mo2 != mo + && mo2->type == mo->type + && mo2->health > 0) + { + // other Keen not dead + return; + } + } + + junk.tag = 666; + EV_DoDoor(&junk, vld_open); +} + + +// +// ACTION ROUTINES +// + +// +// A_Look +// Stay in state until a player is sighted. +// +void A_Look (mobj_t* actor) +{ + mobj_t* targ; + + actor->threshold = 0; // any shot will wake up + targ = actor->subsector->sector->soundtarget; + + if (targ + && (targ->flags & MF_SHOOTABLE) ) + { + actor->target = targ; + + if ( actor->flags & MF_AMBUSH ) + { + if (P_CheckSight (actor, actor->target)) + goto seeyou; + } + else + goto seeyou; + } + + + if (!P_LookForPlayers (actor, false) ) + return; + + // go into chase state + seeyou: + if (actor->info->seesound) + { + int sound; + + switch (actor->info->seesound) + { + case sfx_posit1: + case sfx_posit2: + case sfx_posit3: + sound = sfx_posit1+P_Random()%3; + break; + + case sfx_bgsit1: + case sfx_bgsit2: + sound = sfx_bgsit1+P_Random()%2; + break; + + default: + sound = actor->info->seesound; + break; + } + + if (actor->type==MT_SPIDER + || actor->type == MT_CYBORG) + { + // full volume + S_StartSound (NULL, sound); + } + else + S_StartSound (actor, sound); + } + + P_SetMobjState (actor, actor->info->seestate); +} + + +// +// A_Chase +// Actor has a melee attack, +// so it tries to close as fast as possible +// +void A_Chase (mobj_t* actor) +{ + int delta; + + if (actor->reactiontime) + actor->reactiontime--; + + + // modify target threshold + if (actor->threshold) + { + if (!actor->target + || actor->target->health <= 0) + { + actor->threshold = 0; + } + else + actor->threshold--; + } + + // turn towards movement direction if not there yet + if (actor->movedir < 8) + { + actor->angle &= (7<<29); + delta = actor->angle - (actor->movedir << 29); + + if (delta > 0) + actor->angle -= ANG90/2; + else if (delta < 0) + actor->angle += ANG90/2; + } + + if (!actor->target + || !(actor->target->flags&MF_SHOOTABLE)) + { + // look for a new target + if (P_LookForPlayers(actor,true)) + return; // got a new target + + P_SetMobjState (actor, actor->info->spawnstate); + return; + } + + // do not attack twice in a row + if (actor->flags & MF_JUSTATTACKED) + { + actor->flags &= ~MF_JUSTATTACKED; + if (gameskill != sk_nightmare && !fastparm) + P_NewChaseDir (actor); + return; + } + + // check for melee attack + if (actor->info->meleestate + && P_CheckMeleeRange (actor)) + { + if (actor->info->attacksound) + S_StartSound (actor, actor->info->attacksound); + + P_SetMobjState (actor, actor->info->meleestate); + return; + } + + // check for missile attack + if (actor->info->missilestate) + { + if (gameskill < sk_nightmare + && !fastparm && actor->movecount) + { + goto nomissile; + } + + if (!P_CheckMissileRange (actor)) + goto nomissile; + + P_SetMobjState (actor, actor->info->missilestate); + actor->flags |= MF_JUSTATTACKED; + return; + } + + // ? + nomissile: + // possibly choose another target + if (netgame + && !actor->threshold + && !P_CheckSight (actor, actor->target) ) + { + if (P_LookForPlayers(actor,true)) + return; // got a new target + } + + // chase towards player + if (--actor->movecount<0 + || !P_Move (actor)) + { + P_NewChaseDir (actor); + } + + // make active sound + if (actor->info->activesound + && P_Random () < 3) + { + S_StartSound (actor, actor->info->activesound); + } +} + + +// +// A_FaceTarget +// +void A_FaceTarget (mobj_t* actor) +{ + if (!actor->target) + return; + + actor->flags &= ~MF_AMBUSH; + + actor->angle = R_PointToAngle2 (actor->x, + actor->y, + actor->target->x, + actor->target->y); + + if (actor->target->flags & MF_SHADOW) + actor->angle += (P_Random()-P_Random())<<21; +} + + +// +// A_PosAttack +// +void A_PosAttack (mobj_t* actor) +{ + int angle; + int damage; + int slope; + + if (!actor->target) + return; + + A_FaceTarget (actor); + angle = actor->angle; + slope = P_AimLineAttack (actor, angle, MISSILERANGE); + + S_StartSound (actor, sfx_pistol); + angle += (P_Random()-P_Random())<<20; + damage = ((P_Random()%5)+1)*3; + P_LineAttack (actor, angle, MISSILERANGE, slope, damage); +} + +void A_SPosAttack (mobj_t* actor) +{ + int i; + int angle; + int bangle; + int damage; + int slope; + + if (!actor->target) + return; + + S_StartSound (actor, sfx_shotgn); + A_FaceTarget (actor); + bangle = actor->angle; + slope = P_AimLineAttack (actor, bangle, MISSILERANGE); + + for (i=0 ; i<3 ; i++) + { + angle = bangle + ((P_Random()-P_Random())<<20); + damage = ((P_Random()%5)+1)*3; + P_LineAttack (actor, angle, MISSILERANGE, slope, damage); + } +} + +void A_CPosAttack (mobj_t* actor) +{ + int angle; + int bangle; + int damage; + int slope; + + if (!actor->target) + return; + + S_StartSound (actor, sfx_shotgn); + A_FaceTarget (actor); + bangle = actor->angle; + slope = P_AimLineAttack (actor, bangle, MISSILERANGE); + + angle = bangle + ((P_Random()-P_Random())<<20); + damage = ((P_Random()%5)+1)*3; + P_LineAttack (actor, angle, MISSILERANGE, slope, damage); +} + +void A_CPosRefire (mobj_t* actor) +{ + // keep firing unless target got out of sight + A_FaceTarget (actor); + + if (P_Random () < 40) + return; + + if (!actor->target + || actor->target->health <= 0 + || !P_CheckSight (actor, actor->target) ) + { + P_SetMobjState (actor, actor->info->seestate); + } +} + + +void A_SpidRefire (mobj_t* actor) +{ + // keep firing unless target got out of sight + A_FaceTarget (actor); + + if (P_Random () < 10) + return; + + if (!actor->target + || actor->target->health <= 0 + || !P_CheckSight (actor, actor->target) ) + { + P_SetMobjState (actor, actor->info->seestate); + } +} + +void A_BspiAttack (mobj_t *actor) +{ + if (!actor->target) + return; + + A_FaceTarget (actor); + + // launch a missile + P_SpawnMissile (actor, actor->target, MT_ARACHPLAZ); +} + + +// +// A_TroopAttack +// +void A_TroopAttack (mobj_t* actor) +{ + int damage; + + if (!actor->target) + return; + + A_FaceTarget (actor); + if (P_CheckMeleeRange (actor)) + { + S_StartSound (actor, sfx_claw); + damage = (P_Random()%8+1)*3; + P_DamageMobj (actor->target, actor, actor, damage); + return; + } + + + // launch a missile + P_SpawnMissile (actor, actor->target, MT_TROOPSHOT); +} + + +void A_SargAttack (mobj_t* actor) +{ + int damage; + + if (!actor->target) + return; + + A_FaceTarget (actor); + if (P_CheckMeleeRange (actor)) + { + damage = ((P_Random()%10)+1)*4; + P_DamageMobj (actor->target, actor, actor, damage); + } +} + +void A_HeadAttack (mobj_t* actor) +{ + int damage; + + if (!actor->target) + return; + + A_FaceTarget (actor); + if (P_CheckMeleeRange (actor)) + { + damage = (P_Random()%6+1)*10; + P_DamageMobj (actor->target, actor, actor, damage); + return; + } + + // launch a missile + P_SpawnMissile (actor, actor->target, MT_HEADSHOT); +} + +void A_CyberAttack (mobj_t* actor) +{ + if (!actor->target) + return; + + A_FaceTarget (actor); + P_SpawnMissile (actor, actor->target, MT_ROCKET); +} + + +void A_BruisAttack (mobj_t* actor) +{ + int damage; + + if (!actor->target) + return; + + if (P_CheckMeleeRange (actor)) + { + S_StartSound (actor, sfx_claw); + damage = (P_Random()%8+1)*10; + P_DamageMobj (actor->target, actor, actor, damage); + return; + } + + // launch a missile + P_SpawnMissile (actor, actor->target, MT_BRUISERSHOT); +} + + +// +// A_SkelMissile +// +void A_SkelMissile (mobj_t* actor) +{ + mobj_t* mo; + + if (!actor->target) + return; + + A_FaceTarget (actor); + actor->z += 16*FRACUNIT; // so missile spawns higher + mo = P_SpawnMissile (actor, actor->target, MT_TRACER); + actor->z -= 16*FRACUNIT; // back to normal + + mo->x += mo->momx; + mo->y += mo->momy; + mo->tracer = actor->target; +} + +int TRACEANGLE = 0xc000000; + +void A_Tracer (mobj_t* actor) +{ + angle_t exact; + fixed_t dist; + fixed_t slope; + mobj_t* dest; + mobj_t* th; + + if (gametic & 3) + return; + + // spawn a puff of smoke behind the rocket + P_SpawnPuff (actor->x, actor->y, actor->z); + + th = P_SpawnMobj (actor->x-actor->momx, + actor->y-actor->momy, + actor->z, MT_SMOKE); + + th->momz = FRACUNIT; + th->tics -= P_Random()&3; + if (th->tics < 1) + th->tics = 1; + + // adjust direction + dest = actor->tracer; + + if (!dest || dest->health <= 0) + return; + + // change angle + exact = R_PointToAngle2 (actor->x, + actor->y, + dest->x, + dest->y); + + if (exact != actor->angle) + { + if (exact - actor->angle > 0x80000000) + { + actor->angle -= TRACEANGLE; + if (exact - actor->angle < 0x80000000) + actor->angle = exact; + } + else + { + actor->angle += TRACEANGLE; + if (exact - actor->angle > 0x80000000) + actor->angle = exact; + } + } + + exact = actor->angle>>ANGLETOFINESHIFT; + actor->momx = FixedMul (actor->info->speed, finecosine[exact]); + actor->momy = FixedMul (actor->info->speed, finesine[exact]); + + // change slope + dist = P_AproxDistance (dest->x - actor->x, + dest->y - actor->y); + + dist = dist / actor->info->speed; + + if (dist < 1) + dist = 1; + slope = (dest->z+40*FRACUNIT - actor->z) / dist; + + if (slope < actor->momz) + actor->momz -= FRACUNIT/8; + else + actor->momz += FRACUNIT/8; +} + + +void A_SkelWhoosh (mobj_t* actor) +{ + if (!actor->target) + return; + A_FaceTarget (actor); + S_StartSound (actor,sfx_skeswg); +} + +void A_SkelFist (mobj_t* actor) +{ + int damage; + + if (!actor->target) + return; + + A_FaceTarget (actor); + + if (P_CheckMeleeRange (actor)) + { + damage = ((P_Random()%10)+1)*6; + S_StartSound (actor, sfx_skepch); + P_DamageMobj (actor->target, actor, actor, damage); + } +} + + + +// +// PIT_VileCheck +// Detect a corpse that could be raised. +// +mobj_t* corpsehit; +mobj_t* vileobj; +fixed_t viletryx; +fixed_t viletryy; + +boolean PIT_VileCheck (mobj_t* thing) +{ + int maxdist; + boolean check; + + if (!(thing->flags & MF_CORPSE) ) + return true; // not a monster + + if (thing->tics != -1) + return true; // not lying still yet + + if (thing->info->raisestate == S_NULL) + return true; // monster doesn't have a raise state + + maxdist = thing->info->radius + mobjinfo[MT_VILE].radius; + + if ( abs(thing->x - viletryx) > maxdist + || abs(thing->y - viletryy) > maxdist ) + return true; // not actually touching + + corpsehit = thing; + corpsehit->momx = corpsehit->momy = 0; + corpsehit->height <<= 2; + check = P_CheckPosition (corpsehit, corpsehit->x, corpsehit->y); + corpsehit->height >>= 2; + + if (!check) + return true; // doesn't fit here + + return false; // got one, so stop checking +} + + + +// +// A_VileChase +// Check for ressurecting a body +// +void A_VileChase (mobj_t* actor) +{ + int xl; + int xh; + int yl; + int yh; + + int bx; + int by; + + mobjinfo_t* info; + mobj_t* temp; + + if (actor->movedir != DI_NODIR) + { + // check for corpses to raise + viletryx = + actor->x + actor->info->speed*xspeed[actor->movedir]; + viletryy = + actor->y + actor->info->speed*yspeed[actor->movedir]; + + xl = (viletryx - bmaporgx - MAXRADIUS*2)>>MAPBLOCKSHIFT; + xh = (viletryx - bmaporgx + MAXRADIUS*2)>>MAPBLOCKSHIFT; + yl = (viletryy - bmaporgy - MAXRADIUS*2)>>MAPBLOCKSHIFT; + yh = (viletryy - bmaporgy + MAXRADIUS*2)>>MAPBLOCKSHIFT; + + vileobj = actor; + for (bx=xl ; bx<=xh ; bx++) + { + for (by=yl ; by<=yh ; by++) + { + // Call PIT_VileCheck to check + // whether object is a corpse + // that canbe raised. + if (!P_BlockThingsIterator(bx,by,PIT_VileCheck)) + { + // got one! + temp = actor->target; + actor->target = corpsehit; + A_FaceTarget (actor); + actor->target = temp; + + P_SetMobjState (actor, S_VILE_HEAL1); + S_StartSound (corpsehit, sfx_slop); + info = corpsehit->info; + + P_SetMobjState (corpsehit,info->raisestate); + corpsehit->height <<= 2; + corpsehit->flags = info->flags; + corpsehit->health = info->spawnhealth; + corpsehit->target = NULL; + + return; + } + } + } + } + + // Return to normal attack. + A_Chase (actor); +} + + +// +// A_VileStart +// +void A_VileStart (mobj_t* actor) +{ + S_StartSound (actor, sfx_vilatk); +} + + +// +// A_Fire +// Keep fire in front of player unless out of sight +// +void A_Fire (mobj_t* actor); + +void A_StartFire (mobj_t* actor) +{ + S_StartSound(actor,sfx_flamst); + A_Fire(actor); +} + +void A_FireCrackle (mobj_t* actor) +{ + S_StartSound(actor,sfx_flame); + A_Fire(actor); +} + +void A_Fire (mobj_t* actor) +{ + mobj_t* dest; + mobj_t* target; + unsigned an; + + dest = actor->tracer; + if (!dest) + return; + + target = P_SubstNullMobj(actor->target); + + // don't move it if the vile lost sight + if (!P_CheckSight (target, dest) ) + return; + + an = dest->angle >> ANGLETOFINESHIFT; + + P_UnsetThingPosition (actor); + actor->x = dest->x + FixedMul (24*FRACUNIT, finecosine[an]); + actor->y = dest->y + FixedMul (24*FRACUNIT, finesine[an]); + actor->z = dest->z; + P_SetThingPosition (actor); +} + + + +// +// A_VileTarget +// Spawn the hellfire +// +void A_VileTarget (mobj_t* actor) +{ + mobj_t* fog; + + if (!actor->target) + return; + + A_FaceTarget (actor); + + fog = P_SpawnMobj (actor->target->x, + actor->target->x, + actor->target->z, MT_FIRE); + + actor->tracer = fog; + fog->target = actor; + fog->tracer = actor->target; + A_Fire (fog); +} + + + + +// +// A_VileAttack +// +void A_VileAttack (mobj_t* actor) +{ + mobj_t* fire; + int an; + + if (!actor->target) + return; + + A_FaceTarget (actor); + + if (!P_CheckSight (actor, actor->target) ) + return; + + S_StartSound (actor, sfx_barexp); + P_DamageMobj (actor->target, actor, actor, 20); + actor->target->momz = 1000*FRACUNIT/actor->target->info->mass; + + an = actor->angle >> ANGLETOFINESHIFT; + + fire = actor->tracer; + + if (!fire) + return; + + // move the fire between the vile and the player + fire->x = actor->target->x - FixedMul (24*FRACUNIT, finecosine[an]); + fire->y = actor->target->y - FixedMul (24*FRACUNIT, finesine[an]); + P_RadiusAttack (fire, actor, 70 ); +} + + + + +// +// Mancubus attack, +// firing three missiles (bruisers) +// in three different directions? +// Doesn't look like it. +// +#define FATSPREAD (ANG90/8) + +void A_FatRaise (mobj_t *actor) +{ + A_FaceTarget (actor); + S_StartSound (actor, sfx_manatk); +} + + +void A_FatAttack1 (mobj_t* actor) +{ + mobj_t* mo; + mobj_t* target; + int an; + + A_FaceTarget (actor); + + // Change direction to ... + actor->angle += FATSPREAD; + target = P_SubstNullMobj(actor->target); + P_SpawnMissile (actor, target, MT_FATSHOT); + + mo = P_SpawnMissile (actor, target, MT_FATSHOT); + mo->angle += FATSPREAD; + an = mo->angle >> ANGLETOFINESHIFT; + mo->momx = FixedMul (mo->info->speed, finecosine[an]); + mo->momy = FixedMul (mo->info->speed, finesine[an]); +} + +void A_FatAttack2 (mobj_t* actor) +{ + mobj_t* mo; + mobj_t* target; + int an; + + A_FaceTarget (actor); + // Now here choose opposite deviation. + actor->angle -= FATSPREAD; + target = P_SubstNullMobj(actor->target); + P_SpawnMissile (actor, target, MT_FATSHOT); + + mo = P_SpawnMissile (actor, target, MT_FATSHOT); + mo->angle -= FATSPREAD*2; + an = mo->angle >> ANGLETOFINESHIFT; + mo->momx = FixedMul (mo->info->speed, finecosine[an]); + mo->momy = FixedMul (mo->info->speed, finesine[an]); +} + +void A_FatAttack3 (mobj_t* actor) +{ + mobj_t* mo; + mobj_t* target; + int an; + + A_FaceTarget (actor); + + target = P_SubstNullMobj(actor->target); + + mo = P_SpawnMissile (actor, target, MT_FATSHOT); + mo->angle -= FATSPREAD/2; + an = mo->angle >> ANGLETOFINESHIFT; + mo->momx = FixedMul (mo->info->speed, finecosine[an]); + mo->momy = FixedMul (mo->info->speed, finesine[an]); + + mo = P_SpawnMissile (actor, target, MT_FATSHOT); + mo->angle += FATSPREAD/2; + an = mo->angle >> ANGLETOFINESHIFT; + mo->momx = FixedMul (mo->info->speed, finecosine[an]); + mo->momy = FixedMul (mo->info->speed, finesine[an]); +} + + +// +// SkullAttack +// Fly at the player like a missile. +// +#define SKULLSPEED (20*FRACUNIT) + +void A_SkullAttack (mobj_t* actor) +{ + mobj_t* dest; + angle_t an; + int dist; + + if (!actor->target) + return; + + dest = actor->target; + actor->flags |= MF_SKULLFLY; + + S_StartSound (actor, actor->info->attacksound); + A_FaceTarget (actor); + an = actor->angle >> ANGLETOFINESHIFT; + actor->momx = FixedMul (SKULLSPEED, finecosine[an]); + actor->momy = FixedMul (SKULLSPEED, finesine[an]); + dist = P_AproxDistance (dest->x - actor->x, dest->y - actor->y); + dist = dist / SKULLSPEED; + + if (dist < 1) + dist = 1; + actor->momz = (dest->z+(dest->height>>1) - actor->z) / dist; +} + + +// +// A_PainShootSkull +// Spawn a lost soul and launch it at the target +// +void +A_PainShootSkull +( mobj_t* actor, + angle_t angle ) +{ + fixed_t x; + fixed_t y; + fixed_t z; + + mobj_t* newmobj; + angle_t an; + int prestep; + int count; + thinker_t* currentthinker; + + // count total number of skull currently on the level + count = 0; + + currentthinker = thinkercap.next; + while (currentthinker != &thinkercap) + { + if ( (currentthinker->function.acp1 == (actionf_p1)P_MobjThinker) + && ((mobj_t *)currentthinker)->type == MT_SKULL) + count++; + currentthinker = currentthinker->next; + } + + // if there are allready 20 skulls on the level, + // don't spit another one + if (count > 20) + return; + + + // okay, there's playe for another one + an = angle >> ANGLETOFINESHIFT; + + prestep = + 4*FRACUNIT + + 3*(actor->info->radius + mobjinfo[MT_SKULL].radius)/2; + + x = actor->x + FixedMul (prestep, finecosine[an]); + y = actor->y + FixedMul (prestep, finesine[an]); + z = actor->z + 8*FRACUNIT; + + newmobj = P_SpawnMobj (x , y, z, MT_SKULL); + + // Check for movements. + if (!P_TryMove (newmobj, newmobj->x, newmobj->y)) + { + // kill it immediately + P_DamageMobj (newmobj,actor,actor,10000); + return; + } + + newmobj->target = actor->target; + A_SkullAttack (newmobj); +} + + +// +// A_PainAttack +// Spawn a lost soul and launch it at the target +// +void A_PainAttack (mobj_t* actor) +{ + if (!actor->target) + return; + + A_FaceTarget (actor); + A_PainShootSkull (actor, actor->angle); +} + + +void A_PainDie (mobj_t* actor) +{ + A_Fall (actor); + A_PainShootSkull (actor, actor->angle+ANG90); + A_PainShootSkull (actor, actor->angle+ANG180); + A_PainShootSkull (actor, actor->angle+ANG270); +} + + + + + + +void A_Scream (mobj_t* actor) +{ + int sound; + + switch (actor->info->deathsound) + { + case 0: + return; + + case sfx_podth1: + case sfx_podth2: + case sfx_podth3: + sound = sfx_podth1 + P_Random ()%3; + break; + + case sfx_bgdth1: + case sfx_bgdth2: + sound = sfx_bgdth1 + P_Random ()%2; + break; + + default: + sound = actor->info->deathsound; + break; + } + + // Check for bosses. + if (actor->type==MT_SPIDER + || actor->type == MT_CYBORG) + { + // full volume + S_StartSound (NULL, sound); + } + else + S_StartSound (actor, sound); +} + + +void A_XScream (mobj_t* actor) +{ + S_StartSound (actor, sfx_slop); +} + +void A_Pain (mobj_t* actor) +{ + if (actor->info->painsound) + S_StartSound (actor, actor->info->painsound); +} + + + +void A_Fall (mobj_t *actor) +{ + // actor is on ground, it can be walked over + actor->flags &= ~MF_SOLID; + + // So change this if corpse objects + // are meant to be obstacles. +} + + +// +// A_Explode +// +void A_Explode (mobj_t* thingy) +{ + P_RadiusAttack(thingy, thingy->target, 128); +} + +// Check whether the death of the specified monster type is allowed +// to trigger the end of episode special action. +// +// This behavior changed in v1.9, the most notable effect of which +// was to break uac_dead.wad + +static boolean CheckBossEnd(mobjtype_t motype) +{ + if (gameversion < exe_ultimate) + { + if (gamemap != 8) + { + return false; + } + + // Baron death on later episodes is nothing special. + + if (motype == MT_BRUISER && gameepisode != 1) + { + return false; + } + + return true; + } + else + { + // New logic that appeared in Ultimate Doom. + // Looks like the logic was overhauled while adding in the + // episode 4 support. Now bosses only trigger on their + // specific episode. + + switch(gameepisode) + { + case 1: + return gamemap == 8 && motype == MT_BRUISER; + + case 2: + return gamemap == 8 && motype == MT_CYBORG; + + case 3: + return gamemap == 8 && motype == MT_SPIDER; + + case 4: + return (gamemap == 6 && motype == MT_CYBORG) + || (gamemap == 8 && motype == MT_SPIDER); + + default: + return gamemap == 8; + } + } +} + +// +// A_BossDeath +// Possibly trigger special effects +// if on first boss level +// +void A_BossDeath (mobj_t* mo) +{ + thinker_t* th; + mobj_t* mo2; + line_t junk; + int i; + + if ( gamemode == commercial) + { + if (gamemap != 7) + return; + + if ((mo->type != MT_FATSO) + && (mo->type != MT_BABY)) + return; + } + else + { + if (!CheckBossEnd(mo->type)) + { + return; + } + } + + // make sure there is a player alive for victory + for (i=0 ; i 0) + break; + + if (i==MAXPLAYERS) + return; // no one left alive, so do not end game + + // scan the remaining thinkers to see + // if all bosses are dead + for (th = thinkercap.next ; th != &thinkercap ; th=th->next) + { + if (th->function.acp1 != (actionf_p1)P_MobjThinker) + continue; + + mo2 = (mobj_t *)th; + if (mo2 != mo + && mo2->type == mo->type + && mo2->health > 0) + { + // other boss not dead + return; + } + } + + // victory! + if ( gamemode == commercial) + { + if (gamemap == 7) + { + if (mo->type == MT_FATSO) + { + junk.tag = 666; + EV_DoFloor(&junk,lowerFloorToLowest); + return; + } + + if (mo->type == MT_BABY) + { + junk.tag = 667; + EV_DoFloor(&junk,raiseToTexture); + return; + } + } + } + else + { + switch(gameepisode) + { + case 1: + junk.tag = 666; + EV_DoFloor (&junk, lowerFloorToLowest); + return; + break; + + case 4: + switch(gamemap) + { + case 6: + junk.tag = 666; + EV_DoDoor (&junk, vld_blazeOpen); + return; + break; + + case 8: + junk.tag = 666; + EV_DoFloor (&junk, lowerFloorToLowest); + return; + break; + } + } + } + + G_ExitLevel (); +} + + +void A_Hoof (mobj_t* mo) +{ + S_StartSound (mo, sfx_hoof); + A_Chase (mo); +} + +void A_Metal (mobj_t* mo) +{ + S_StartSound (mo, sfx_metal); + A_Chase (mo); +} + +void A_BabyMetal (mobj_t* mo) +{ + S_StartSound (mo, sfx_bspwlk); + A_Chase (mo); +} + +void +A_OpenShotgun2 +( player_t* player, + pspdef_t* psp ) +{ + S_StartSound (player->mo, sfx_dbopn); +} + +void +A_LoadShotgun2 +( player_t* player, + pspdef_t* psp ) +{ + S_StartSound (player->mo, sfx_dbload); +} + +void +A_ReFire +( player_t* player, + pspdef_t* psp ); + +void +A_CloseShotgun2 +( player_t* player, + pspdef_t* psp ) +{ + S_StartSound (player->mo, sfx_dbcls); + A_ReFire(player,psp); +} + + + +mobj_t* braintargets[32]; +int numbraintargets; +int braintargeton = 0; + +void A_BrainAwake (mobj_t* mo) +{ + thinker_t* thinker; + mobj_t* m; + + // find all the target spots + numbraintargets = 0; + braintargeton = 0; + + thinker = thinkercap.next; + for (thinker = thinkercap.next ; + thinker != &thinkercap ; + thinker = thinker->next) + { + if (thinker->function.acp1 != (actionf_p1)P_MobjThinker) + continue; // not a mobj + + m = (mobj_t *)thinker; + + if (m->type == MT_BOSSTARGET ) + { + braintargets[numbraintargets] = m; + numbraintargets++; + } + } + + S_StartSound (NULL,sfx_bossit); +} + + +void A_BrainPain (mobj_t* mo) +{ + S_StartSound (NULL,sfx_bospn); +} + + +void A_BrainScream (mobj_t* mo) +{ + int x; + int y; + int z; + mobj_t* th; + + for (x=mo->x - 196*FRACUNIT ; x< mo->x + 320*FRACUNIT ; x+= FRACUNIT*8) + { + y = mo->y - 320*FRACUNIT; + z = 128 + P_Random()*2*FRACUNIT; + th = P_SpawnMobj (x,y,z, MT_ROCKET); + th->momz = P_Random()*512; + + P_SetMobjState (th, S_BRAINEXPLODE1); + + th->tics -= P_Random()&7; + if (th->tics < 1) + th->tics = 1; + } + + S_StartSound (NULL,sfx_bosdth); +} + + + +void A_BrainExplode (mobj_t* mo) +{ + int x; + int y; + int z; + mobj_t* th; + + x = mo->x + (P_Random () - P_Random ())*2048; + y = mo->y; + z = 128 + P_Random()*2*FRACUNIT; + th = P_SpawnMobj (x,y,z, MT_ROCKET); + th->momz = P_Random()*512; + + P_SetMobjState (th, S_BRAINEXPLODE1); + + th->tics -= P_Random()&7; + if (th->tics < 1) + th->tics = 1; +} + + +void A_BrainDie (mobj_t* mo) +{ + G_ExitLevel (); +} + +void A_BrainSpit (mobj_t* mo) +{ + mobj_t* targ; + mobj_t* newmobj; + + static int easy = 0; + + easy ^= 1; + if (gameskill <= sk_easy && (!easy)) + return; + + // shoot a cube at current target + targ = braintargets[braintargeton]; + braintargeton = (braintargeton+1)%numbraintargets; + + // spawn brain missile + newmobj = P_SpawnMissile (mo, targ, MT_SPAWNSHOT); + newmobj->target = targ; + newmobj->reactiontime = + ((targ->y - mo->y)/newmobj->momy) / newmobj->state->tics; + + S_StartSound(NULL, sfx_bospit); +} + + + +void A_SpawnFly (mobj_t* mo); + +// travelling cube sound +void A_SpawnSound (mobj_t* mo) +{ + S_StartSound (mo,sfx_boscub); + A_SpawnFly(mo); +} + +void A_SpawnFly (mobj_t* mo) +{ + mobj_t* newmobj; + mobj_t* fog; + mobj_t* targ; + int r; + mobjtype_t type; + + if (--mo->reactiontime) + return; // still flying + + targ = P_SubstNullMobj(mo->target); + + // First spawn teleport fog. + fog = P_SpawnMobj (targ->x, targ->y, targ->z, MT_SPAWNFIRE); + S_StartSound (fog, sfx_telept); + + // Randomly select monster to spawn. + r = P_Random (); + + // Probability distribution (kind of :), + // decreasing likelihood. + if ( r<50 ) + type = MT_TROOP; + else if (r<90) + type = MT_SERGEANT; + else if (r<120) + type = MT_SHADOWS; + else if (r<130) + type = MT_PAIN; + else if (r<160) + type = MT_HEAD; + else if (r<162) + type = MT_VILE; + else if (r<172) + type = MT_UNDEAD; + else if (r<192) + type = MT_BABY; + else if (r<222) + type = MT_FATSO; + else if (r<246) + type = MT_KNIGHT; + else + type = MT_BRUISER; + + newmobj = P_SpawnMobj (targ->x, targ->y, targ->z, type); + if (P_LookForPlayers (newmobj, true) ) + P_SetMobjState (newmobj, newmobj->info->seestate); + + // telefrag anything in this spot + P_TeleportMove (newmobj, newmobj->x, newmobj->y); + + // remove self (i.e., cube). + P_RemoveMobj (mo); +} + + + +void A_PlayerScream (mobj_t* mo) +{ + // Default death sound. + int sound = sfx_pldeth; + + if ( (gamemode == commercial) + && (mo->health < -50)) + { + // IF THE PLAYER DIES + // LESS THAN -50% WITHOUT GIBBING + sound = sfx_pdiehi; + } + + S_StartSound (mo, sound); +} diff --git a/firmware_p4/components/Applications/doom/p_floor.c b/firmware_p4/components/Applications/doom/p_floor.c new file mode 100644 index 000000000..1384ee6b4 --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_floor.c @@ -0,0 +1,546 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Floor animation: raising stairs. +// + + + +#include "z_zone.h" +#include "doomdef.h" +#include "p_local.h" + +#include "s_sound.h" + +// State. +#include "doomstat.h" +#include "r_state.h" +// Data. +#include "sounds.h" + + +// +// FLOORS +// + +// +// Move a plane (floor or ceiling) and check for crushing +// +result_e +T_MovePlane +( sector_t* sector, + fixed_t speed, + fixed_t dest, + boolean crush, + int floorOrCeiling, + int direction ) +{ + boolean flag; + fixed_t lastpos; + + switch(floorOrCeiling) + { + case 0: + // FLOOR + switch(direction) + { + case -1: + // DOWN + if (sector->floorheight - speed < dest) + { + lastpos = sector->floorheight; + sector->floorheight = dest; + flag = P_ChangeSector(sector,crush); + if (flag == true) + { + sector->floorheight =lastpos; + P_ChangeSector(sector,crush); + //return crushed; + } + return pastdest; + } + else + { + lastpos = sector->floorheight; + sector->floorheight -= speed; + flag = P_ChangeSector(sector,crush); + if (flag == true) + { + sector->floorheight = lastpos; + P_ChangeSector(sector,crush); + return crushed; + } + } + break; + + case 1: + // UP + if (sector->floorheight + speed > dest) + { + lastpos = sector->floorheight; + sector->floorheight = dest; + flag = P_ChangeSector(sector,crush); + if (flag == true) + { + sector->floorheight = lastpos; + P_ChangeSector(sector,crush); + //return crushed; + } + return pastdest; + } + else + { + // COULD GET CRUSHED + lastpos = sector->floorheight; + sector->floorheight += speed; + flag = P_ChangeSector(sector,crush); + if (flag == true) + { + if (crush == true) + return crushed; + sector->floorheight = lastpos; + P_ChangeSector(sector,crush); + return crushed; + } + } + break; + } + break; + + case 1: + // CEILING + switch(direction) + { + case -1: + // DOWN + if (sector->ceilingheight - speed < dest) + { + lastpos = sector->ceilingheight; + sector->ceilingheight = dest; + flag = P_ChangeSector(sector,crush); + + if (flag == true) + { + sector->ceilingheight = lastpos; + P_ChangeSector(sector,crush); + //return crushed; + } + return pastdest; + } + else + { + // COULD GET CRUSHED + lastpos = sector->ceilingheight; + sector->ceilingheight -= speed; + flag = P_ChangeSector(sector,crush); + + if (flag == true) + { + if (crush == true) + return crushed; + sector->ceilingheight = lastpos; + P_ChangeSector(sector,crush); + return crushed; + } + } + break; + + case 1: + // UP + if (sector->ceilingheight + speed > dest) + { + lastpos = sector->ceilingheight; + sector->ceilingheight = dest; + flag = P_ChangeSector(sector,crush); + if (flag == true) + { + sector->ceilingheight = lastpos; + P_ChangeSector(sector,crush); + //return crushed; + } + return pastdest; + } + else + { + lastpos = sector->ceilingheight; + sector->ceilingheight += speed; + flag = P_ChangeSector(sector,crush); +// UNUSED +#if 0 + if (flag == true) + { + sector->ceilingheight = lastpos; + P_ChangeSector(sector,crush); + return crushed; + } +#endif + } + break; + } + break; + + } + return ok; +} + + +// +// MOVE A FLOOR TO IT'S DESTINATION (UP OR DOWN) +// +void T_MoveFloor(floormove_t* floor) +{ + result_e res; + + res = T_MovePlane(floor->sector, + floor->speed, + floor->floordestheight, + floor->crush,0,floor->direction); + + if (!(leveltime&7)) + S_StartSound(&floor->sector->soundorg, sfx_stnmov); + + if (res == pastdest) + { + floor->sector->specialdata = NULL; + + if (floor->direction == 1) + { + switch(floor->type) + { + case donutRaise: + floor->sector->special = floor->newspecial; + floor->sector->floorpic = floor->texture; + default: + break; + } + } + else if (floor->direction == -1) + { + switch(floor->type) + { + case lowerAndChange: + floor->sector->special = floor->newspecial; + floor->sector->floorpic = floor->texture; + default: + break; + } + } + P_RemoveThinker(&floor->thinker); + + S_StartSound(&floor->sector->soundorg, sfx_pstop); + } + +} + +// +// HANDLE FLOOR TYPES +// +int +EV_DoFloor +( line_t* line, + floor_e floortype ) +{ + int secnum; + int rtn; + int i; + sector_t* sec; + floormove_t* floor; + + secnum = -1; + rtn = 0; + while ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0) + { + sec = §ors[secnum]; + + // ALREADY MOVING? IF SO, KEEP GOING... + if (sec->specialdata) + continue; + + // new floor thinker + rtn = 1; + floor = Z_Malloc (sizeof(*floor), PU_LEVSPEC, 0); + P_AddThinker (&floor->thinker); + sec->specialdata = floor; + floor->thinker.function.acp1 = (actionf_p1) T_MoveFloor; + floor->type = floortype; + floor->crush = false; + + switch(floortype) + { + case lowerFloor: + floor->direction = -1; + floor->sector = sec; + floor->speed = FLOORSPEED; + floor->floordestheight = + P_FindHighestFloorSurrounding(sec); + break; + + case lowerFloorToLowest: + floor->direction = -1; + floor->sector = sec; + floor->speed = FLOORSPEED; + floor->floordestheight = + P_FindLowestFloorSurrounding(sec); + break; + + case turboLower: + floor->direction = -1; + floor->sector = sec; + floor->speed = FLOORSPEED * 4; + floor->floordestheight = + P_FindHighestFloorSurrounding(sec); + if (floor->floordestheight != sec->floorheight) + floor->floordestheight += 8*FRACUNIT; + break; + + case raiseFloorCrush: + floor->crush = true; + case raiseFloor: + floor->direction = 1; + floor->sector = sec; + floor->speed = FLOORSPEED; + floor->floordestheight = + P_FindLowestCeilingSurrounding(sec); + if (floor->floordestheight > sec->ceilingheight) + floor->floordestheight = sec->ceilingheight; + floor->floordestheight -= (8*FRACUNIT)* + (floortype == raiseFloorCrush); + break; + + case raiseFloorTurbo: + floor->direction = 1; + floor->sector = sec; + floor->speed = FLOORSPEED*4; + floor->floordestheight = + P_FindNextHighestFloor(sec,sec->floorheight); + break; + + case raiseFloorToNearest: + floor->direction = 1; + floor->sector = sec; + floor->speed = FLOORSPEED; + floor->floordestheight = + P_FindNextHighestFloor(sec,sec->floorheight); + break; + + case raiseFloor24: + floor->direction = 1; + floor->sector = sec; + floor->speed = FLOORSPEED; + floor->floordestheight = floor->sector->floorheight + + 24 * FRACUNIT; + break; + case raiseFloor512: + floor->direction = 1; + floor->sector = sec; + floor->speed = FLOORSPEED; + floor->floordestheight = floor->sector->floorheight + + 512 * FRACUNIT; + break; + + case raiseFloor24AndChange: + floor->direction = 1; + floor->sector = sec; + floor->speed = FLOORSPEED; + floor->floordestheight = floor->sector->floorheight + + 24 * FRACUNIT; + sec->floorpic = line->frontsector->floorpic; + sec->special = line->frontsector->special; + break; + + case raiseToTexture: + { + int minsize = INT_MAX; + side_t* side; + + floor->direction = 1; + floor->sector = sec; + floor->speed = FLOORSPEED; + for (i = 0; i < sec->linecount; i++) + { + if (twoSided (secnum, i) ) + { + side = getSide(secnum,i,0); + if (side->bottomtexture >= 0) + if (textureheight[side->bottomtexture] < + minsize) + minsize = + textureheight[side->bottomtexture]; + side = getSide(secnum,i,1); + if (side->bottomtexture >= 0) + if (textureheight[side->bottomtexture] < + minsize) + minsize = + textureheight[side->bottomtexture]; + } + } + floor->floordestheight = + floor->sector->floorheight + minsize; + } + break; + + case lowerAndChange: + floor->direction = -1; + floor->sector = sec; + floor->speed = FLOORSPEED; + floor->floordestheight = + P_FindLowestFloorSurrounding(sec); + floor->texture = sec->floorpic; + + for (i = 0; i < sec->linecount; i++) + { + if ( twoSided(secnum, i) ) + { + if (getSide(secnum,i,0)->sector-sectors == secnum) + { + sec = getSector(secnum,i,1); + + if (sec->floorheight == floor->floordestheight) + { + floor->texture = sec->floorpic; + floor->newspecial = sec->special; + break; + } + } + else + { + sec = getSector(secnum,i,0); + + if (sec->floorheight == floor->floordestheight) + { + floor->texture = sec->floorpic; + floor->newspecial = sec->special; + break; + } + } + } + } + default: + break; + } + } + return rtn; +} + + + + +// +// BUILD A STAIRCASE! +// +int +EV_BuildStairs +( line_t* line, + stair_e type ) +{ + int secnum; + int height; + int i; + int newsecnum; + int texture; + int ok; + int rtn; + + sector_t* sec; + sector_t* tsec; + + floormove_t* floor; + + fixed_t stairsize = 0; + fixed_t speed = 0; + + secnum = -1; + rtn = 0; + while ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0) + { + sec = §ors[secnum]; + + // ALREADY MOVING? IF SO, KEEP GOING... + if (sec->specialdata) + continue; + + // new floor thinker + rtn = 1; + floor = Z_Malloc (sizeof(*floor), PU_LEVSPEC, 0); + P_AddThinker (&floor->thinker); + sec->specialdata = floor; + floor->thinker.function.acp1 = (actionf_p1) T_MoveFloor; + floor->direction = 1; + floor->sector = sec; + switch(type) + { + case build8: + speed = FLOORSPEED/4; + stairsize = 8*FRACUNIT; + break; + case turbo16: + speed = FLOORSPEED*4; + stairsize = 16*FRACUNIT; + break; + } + floor->speed = speed; + height = sec->floorheight + stairsize; + floor->floordestheight = height; + + texture = sec->floorpic; + + // Find next sector to raise + // 1. Find 2-sided line with same sector side[0] + // 2. Other side is the next sector to raise + do + { + ok = 0; + for (i = 0;i < sec->linecount;i++) + { + if ( !((sec->lines[i])->flags & ML_TWOSIDED) ) + continue; + + tsec = (sec->lines[i])->frontsector; + newsecnum = tsec-sectors; + + if (secnum != newsecnum) + continue; + + tsec = (sec->lines[i])->backsector; + newsecnum = tsec - sectors; + + if (tsec->floorpic != texture) + continue; + + height += stairsize; + + if (tsec->specialdata) + continue; + + sec = tsec; + secnum = newsecnum; + floor = Z_Malloc (sizeof(*floor), PU_LEVSPEC, 0); + + P_AddThinker (&floor->thinker); + + sec->specialdata = floor; + floor->thinker.function.acp1 = (actionf_p1) T_MoveFloor; + floor->direction = 1; + floor->sector = sec; + floor->speed = speed; + floor->floordestheight = height; + ok = 1; + break; + } + } while(ok); + } + return rtn; +} + diff --git a/firmware_p4/components/Applications/doom/p_inter.c b/firmware_p4/components/Applications/doom/p_inter.c new file mode 100644 index 000000000..1eb58cfca --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_inter.c @@ -0,0 +1,922 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Handling interactions (i.e., collisions). +// + + + + +// Data. +#include "doomdef.h" +#include "dstrings.h" +#include "sounds.h" + +#include "deh_main.h" +#include "deh_misc.h" +#include "doomstat.h" + +#include "m_random.h" +#include "i_system.h" + +#include "am_map.h" + +#include "p_local.h" + +#include "s_sound.h" + +#include "p_inter.h" + + +#define BONUSADD 6 + + + + +// a weapon is found with two clip loads, +// a big item has five clip loads +int maxammo[NUMAMMO] = {200, 50, 300, 50}; +int clipammo[NUMAMMO] = {10, 4, 20, 1}; + + +// +// GET STUFF +// + +// +// P_GiveAmmo +// Num is the number of clip loads, +// not the individual count (0= 1/2 clip). +// Returns false if the ammo can't be picked up at all +// + +boolean +P_GiveAmmo +( player_t* player, + ammotype_t ammo, + int num ) +{ + int oldammo; + + if (ammo == am_noammo) + return false; + + if (ammo > NUMAMMO) + I_Error ("P_GiveAmmo: bad type %i", ammo); + + if ( player->ammo[ammo] == player->maxammo[ammo] ) + return false; + + if (num) + num *= clipammo[ammo]; + else + num = clipammo[ammo]/2; + + if (gameskill == sk_baby + || gameskill == sk_nightmare) + { + // give double ammo in trainer mode, + // you'll need in nightmare + num <<= 1; + } + + + oldammo = player->ammo[ammo]; + player->ammo[ammo] += num; + + if (player->ammo[ammo] > player->maxammo[ammo]) + player->ammo[ammo] = player->maxammo[ammo]; + + // If non zero ammo, + // don't change up weapons, + // player was lower on purpose. + if (oldammo) + return true; + + // We were down to zero, + // so select a new weapon. + // Preferences are not user selectable. + switch (ammo) + { + case am_clip: + if (player->readyweapon == wp_fist) + { + if (player->weaponowned[wp_chaingun]) + player->pendingweapon = wp_chaingun; + else + player->pendingweapon = wp_pistol; + } + break; + + case am_shell: + if (player->readyweapon == wp_fist + || player->readyweapon == wp_pistol) + { + if (player->weaponowned[wp_shotgun]) + player->pendingweapon = wp_shotgun; + } + break; + + case am_cell: + if (player->readyweapon == wp_fist + || player->readyweapon == wp_pistol) + { + if (player->weaponowned[wp_plasma]) + player->pendingweapon = wp_plasma; + } + break; + + case am_misl: + if (player->readyweapon == wp_fist) + { + if (player->weaponowned[wp_missile]) + player->pendingweapon = wp_missile; + } + default: + break; + } + + return true; +} + + +// +// P_GiveWeapon +// The weapon name may have a MF_DROPPED flag ored in. +// +boolean +P_GiveWeapon +( player_t* player, + weapontype_t weapon, + boolean dropped ) +{ + boolean gaveammo; + boolean gaveweapon; + + if (netgame && (deathmatch!=2) && !dropped ) + { + // leave placed weapons forever on net games + if (player->weaponowned[weapon]) + return false; + + player->bonuscount += BONUSADD; + player->weaponowned[weapon] = true; + + if (deathmatch) + P_GiveAmmo (player, weaponinfo[weapon].ammo, 5); + else + P_GiveAmmo (player, weaponinfo[weapon].ammo, 2); + player->pendingweapon = weapon; + + if (player == &players[consoleplayer]) + S_StartSound (NULL, sfx_wpnup); + return false; + } + + if (weaponinfo[weapon].ammo != am_noammo) + { + // give one clip with a dropped weapon, + // two clips with a found weapon + if (dropped) + gaveammo = P_GiveAmmo (player, weaponinfo[weapon].ammo, 1); + else + gaveammo = P_GiveAmmo (player, weaponinfo[weapon].ammo, 2); + } + else + { + gaveammo = false; + } + + if (player->weaponowned[weapon]) + { + gaveweapon = false; + } + else + { + gaveweapon = true; + player->weaponowned[weapon] = true; + player->pendingweapon = weapon; + } + + return (gaveweapon || gaveammo); +} + + + +// +// P_GiveBody +// Returns false if the body isn't needed at all +// +boolean +P_GiveBody +( player_t* player, + int num ) +{ + if (player->health >= MAXHEALTH) + return false; + + player->health += num; + if (player->health > MAXHEALTH) + player->health = MAXHEALTH; + player->mo->health = player->health; + + return true; +} + + + +// +// P_GiveArmor +// Returns false if the armor is worse +// than the current armor. +// +boolean +P_GiveArmor +( player_t* player, + int armortype ) +{ + int hits; + + hits = armortype*100; + if (player->armorpoints >= hits) + return false; // don't pick up + + player->armortype = armortype; + player->armorpoints = hits; + + return true; +} + + + +// +// P_GiveCard +// +void +P_GiveCard +( player_t* player, + card_t card ) +{ + if (player->cards[card]) + return; + + player->bonuscount = BONUSADD; + player->cards[card] = 1; +} + + +// +// P_GivePower +// +boolean +P_GivePower +( player_t* player, + int /*powertype_t*/ power ) +{ + if (power == pw_invulnerability) + { + player->powers[power] = INVULNTICS; + return true; + } + + if (power == pw_invisibility) + { + player->powers[power] = INVISTICS; + player->mo->flags |= MF_SHADOW; + return true; + } + + if (power == pw_infrared) + { + player->powers[power] = INFRATICS; + return true; + } + + if (power == pw_ironfeet) + { + player->powers[power] = IRONTICS; + return true; + } + + if (power == pw_strength) + { + P_GiveBody (player, 100); + player->powers[power] = 1; + return true; + } + + if (player->powers[power]) + return false; // already got it + + player->powers[power] = 1; + return true; +} + + + +// +// P_TouchSpecialThing +// +void +P_TouchSpecialThing +( mobj_t* special, + mobj_t* toucher ) +{ + player_t* player; + int i; + fixed_t delta; + int sound; + + delta = special->z - toucher->z; + + if (delta > toucher->height + || delta < -8*FRACUNIT) + { + // out of reach + return; + } + + + sound = sfx_itemup; + player = toucher->player; + + // Dead thing touching. + // Can happen with a sliding player corpse. + if (toucher->health <= 0) + return; + + // Identify by sprite. + switch (special->sprite) + { + // armor + case SPR_ARM1: + if (!P_GiveArmor (player, deh_green_armor_class)) + return; + player->message = DEH_String(GOTARMOR); + break; + + case SPR_ARM2: + if (!P_GiveArmor (player, deh_blue_armor_class)) + return; + player->message = DEH_String(GOTMEGA); + break; + + // bonus items + case SPR_BON1: + player->health++; // can go over 100% + if (player->health > deh_max_health) + player->health = deh_max_health; + player->mo->health = player->health; + player->message = DEH_String(GOTHTHBONUS); + break; + + case SPR_BON2: + player->armorpoints++; // can go over 100% + if (player->armorpoints > deh_max_armor) + player->armorpoints = deh_max_armor; + // deh_green_armor_class only applies to the green armor shirt; + // for the armor helmets, armortype 1 is always used. + if (!player->armortype) + player->armortype = 1; + player->message = DEH_String(GOTARMBONUS); + break; + + case SPR_SOUL: + player->health += deh_soulsphere_health; + if (player->health > deh_max_soulsphere) + player->health = deh_max_soulsphere; + player->mo->health = player->health; + player->message = DEH_String(GOTSUPER); + sound = sfx_getpow; + break; + + case SPR_MEGA: + if (gamemode != commercial) + return; + player->health = deh_megasphere_health; + player->mo->health = player->health; + // We always give armor type 2 for the megasphere; dehacked only + // affects the MegaArmor. + P_GiveArmor (player, 2); + player->message = DEH_String(GOTMSPHERE); + sound = sfx_getpow; + break; + + // cards + // leave cards for everyone + case SPR_BKEY: + if (!player->cards[it_bluecard]) + player->message = DEH_String(GOTBLUECARD); + P_GiveCard (player, it_bluecard); + if (!netgame) + break; + return; + + case SPR_YKEY: + if (!player->cards[it_yellowcard]) + player->message = DEH_String(GOTYELWCARD); + P_GiveCard (player, it_yellowcard); + if (!netgame) + break; + return; + + case SPR_RKEY: + if (!player->cards[it_redcard]) + player->message = DEH_String(GOTREDCARD); + P_GiveCard (player, it_redcard); + if (!netgame) + break; + return; + + case SPR_BSKU: + if (!player->cards[it_blueskull]) + player->message = DEH_String(GOTBLUESKUL); + P_GiveCard (player, it_blueskull); + if (!netgame) + break; + return; + + case SPR_YSKU: + if (!player->cards[it_yellowskull]) + player->message = DEH_String(GOTYELWSKUL); + P_GiveCard (player, it_yellowskull); + if (!netgame) + break; + return; + + case SPR_RSKU: + if (!player->cards[it_redskull]) + player->message = DEH_String(GOTREDSKULL); + P_GiveCard (player, it_redskull); + if (!netgame) + break; + return; + + // medikits, heals + case SPR_STIM: + if (!P_GiveBody (player, 10)) + return; + player->message = DEH_String(GOTSTIM); + break; + + case SPR_MEDI: + if (!P_GiveBody (player, 25)) + return; + + if (player->health < 25) + player->message = DEH_String(GOTMEDINEED); + else + player->message = DEH_String(GOTMEDIKIT); + break; + + + // power ups + case SPR_PINV: + if (!P_GivePower (player, pw_invulnerability)) + return; + player->message = DEH_String(GOTINVUL); + sound = sfx_getpow; + break; + + case SPR_PSTR: + if (!P_GivePower (player, pw_strength)) + return; + player->message = DEH_String(GOTBERSERK); + if (player->readyweapon != wp_fist) + player->pendingweapon = wp_fist; + sound = sfx_getpow; + break; + + case SPR_PINS: + if (!P_GivePower (player, pw_invisibility)) + return; + player->message = DEH_String(GOTINVIS); + sound = sfx_getpow; + break; + + case SPR_SUIT: + if (!P_GivePower (player, pw_ironfeet)) + return; + player->message = DEH_String(GOTSUIT); + sound = sfx_getpow; + break; + + case SPR_PMAP: + if (!P_GivePower (player, pw_allmap)) + return; + player->message = DEH_String(GOTMAP); + sound = sfx_getpow; + break; + + case SPR_PVIS: + if (!P_GivePower (player, pw_infrared)) + return; + player->message = DEH_String(GOTVISOR); + sound = sfx_getpow; + break; + + // ammo + case SPR_CLIP: + if (special->flags & MF_DROPPED) + { + if (!P_GiveAmmo (player,am_clip,0)) + return; + } + else + { + if (!P_GiveAmmo (player,am_clip,1)) + return; + } + player->message = DEH_String(GOTCLIP); + break; + + case SPR_AMMO: + if (!P_GiveAmmo (player, am_clip,5)) + return; + player->message = DEH_String(GOTCLIPBOX); + break; + + case SPR_ROCK: + if (!P_GiveAmmo (player, am_misl,1)) + return; + player->message = DEH_String(GOTROCKET); + break; + + case SPR_BROK: + if (!P_GiveAmmo (player, am_misl,5)) + return; + player->message = DEH_String(GOTROCKBOX); + break; + + case SPR_CELL: + if (!P_GiveAmmo (player, am_cell,1)) + return; + player->message = DEH_String(GOTCELL); + break; + + case SPR_CELP: + if (!P_GiveAmmo (player, am_cell,5)) + return; + player->message = DEH_String(GOTCELLBOX); + break; + + case SPR_SHEL: + if (!P_GiveAmmo (player, am_shell,1)) + return; + player->message = DEH_String(GOTSHELLS); + break; + + case SPR_SBOX: + if (!P_GiveAmmo (player, am_shell,5)) + return; + player->message = DEH_String(GOTSHELLBOX); + break; + + case SPR_BPAK: + if (!player->backpack) + { + for (i=0 ; imaxammo[i] *= 2; + player->backpack = true; + } + for (i=0 ; imessage = DEH_String(GOTBACKPACK); + break; + + // weapons + case SPR_BFUG: + if (!P_GiveWeapon (player, wp_bfg, false) ) + return; + player->message = DEH_String(GOTBFG9000); + sound = sfx_wpnup; + break; + + case SPR_MGUN: + if (!P_GiveWeapon (player, wp_chaingun, (special->flags&MF_DROPPED) != 0) ) + return; + player->message = DEH_String(GOTCHAINGUN); + sound = sfx_wpnup; + break; + + case SPR_CSAW: + if (!P_GiveWeapon (player, wp_chainsaw, false) ) + return; + player->message = DEH_String(GOTCHAINSAW); + sound = sfx_wpnup; + break; + + case SPR_LAUN: + if (!P_GiveWeapon (player, wp_missile, false) ) + return; + player->message = DEH_String(GOTLAUNCHER); + sound = sfx_wpnup; + break; + + case SPR_PLAS: + if (!P_GiveWeapon (player, wp_plasma, false) ) + return; + player->message = DEH_String(GOTPLASMA); + sound = sfx_wpnup; + break; + + case SPR_SHOT: + if (!P_GiveWeapon (player, wp_shotgun, (special->flags&MF_DROPPED) != 0 ) ) + return; + player->message = DEH_String(GOTSHOTGUN); + sound = sfx_wpnup; + break; + + case SPR_SGN2: + if (!P_GiveWeapon (player, wp_supershotgun, (special->flags&MF_DROPPED) != 0 ) ) + return; + player->message = DEH_String(GOTSHOTGUN2); + sound = sfx_wpnup; + break; + + default: + I_Error ("P_SpecialThing: Unknown gettable thing"); + } + + if (special->flags & MF_COUNTITEM) + player->itemcount++; + P_RemoveMobj (special); + player->bonuscount += BONUSADD; + if (player == &players[consoleplayer]) + S_StartSound (NULL, sound); +} + + +// +// KillMobj +// +void +P_KillMobj +( mobj_t* source, + mobj_t* target ) +{ + mobjtype_t item; + mobj_t* mo; + + target->flags &= ~(MF_SHOOTABLE|MF_FLOAT|MF_SKULLFLY); + + if (target->type != MT_SKULL) + target->flags &= ~MF_NOGRAVITY; + + target->flags |= MF_CORPSE|MF_DROPOFF; + target->height >>= 2; + + if (source && source->player) + { + // count for intermission + if (target->flags & MF_COUNTKILL) + source->player->killcount++; + + if (target->player) + source->player->frags[target->player-players]++; + } + else if (!netgame && (target->flags & MF_COUNTKILL) ) + { + // count all monster deaths, + // even those caused by other monsters + players[0].killcount++; + } + + if (target->player) + { + // count environment kills against you + if (!source) + target->player->frags[target->player-players]++; + + target->flags &= ~MF_SOLID; + target->player->playerstate = PST_DEAD; + P_DropWeapon (target->player); + + if (target->player == &players[consoleplayer] + && automapactive) + { + // don't die in auto map, + // switch view prior to dying + AM_Stop (); + } + + } + + if (target->health < -target->info->spawnhealth + && target->info->xdeathstate) + { + P_SetMobjState (target, target->info->xdeathstate); + } + else + P_SetMobjState (target, target->info->deathstate); + target->tics -= P_Random()&3; + + if (target->tics < 1) + target->tics = 1; + + // I_StartSound (&actor->r, actor->info->deathsound); + + // In Chex Quest, monsters don't drop items. + + if (gameversion == exe_chex) + { + return; + } + + // Drop stuff. + // This determines the kind of object spawned + // during the death frame of a thing. + switch (target->type) + { + case MT_WOLFSS: + case MT_POSSESSED: + item = MT_CLIP; + break; + + case MT_SHOTGUY: + item = MT_SHOTGUN; + break; + + case MT_CHAINGUY: + item = MT_CHAINGUN; + break; + + default: + return; + } + + mo = P_SpawnMobj (target->x,target->y,ONFLOORZ, item); + mo->flags |= MF_DROPPED; // special versions of items +} + + + + +// +// P_DamageMobj +// Damages both enemies and players +// "inflictor" is the thing that caused the damage +// creature or missile, can be NULL (slime, etc) +// "source" is the thing to target after taking damage +// creature or NULL +// Source and inflictor are the same for melee attacks. +// Source can be NULL for slime, barrel explosions +// and other environmental stuff. +// +void +P_DamageMobj +( mobj_t* target, + mobj_t* inflictor, + mobj_t* source, + int damage ) +{ + unsigned ang; + int saved; + player_t* player; + fixed_t thrust; + int temp; + + if ( !(target->flags & MF_SHOOTABLE) ) + return; // shouldn't happen... + + if (target->health <= 0) + return; + + if ( target->flags & MF_SKULLFLY ) + { + target->momx = target->momy = target->momz = 0; + } + + player = target->player; + if (player && gameskill == sk_baby) + damage >>= 1; // take half damage in trainer mode + + + // Some close combat weapons should not + // inflict thrust and push the victim out of reach, + // thus kick away unless using the chainsaw. + if (inflictor + && !(target->flags & MF_NOCLIP) + && (!source + || !source->player + || source->player->readyweapon != wp_chainsaw)) + { + ang = R_PointToAngle2 ( inflictor->x, + inflictor->y, + target->x, + target->y); + + thrust = damage*(FRACUNIT>>3)*100/target->info->mass; + + // make fall forwards sometimes + if ( damage < 40 + && damage > target->health + && target->z - inflictor->z > 64*FRACUNIT + && (P_Random ()&1) ) + { + ang += ANG180; + thrust *= 4; + } + + ang >>= ANGLETOFINESHIFT; + target->momx += FixedMul (thrust, finecosine[ang]); + target->momy += FixedMul (thrust, finesine[ang]); + } + + // player specific + if (player) + { + // end of game hell hack + if (target->subsector->sector->special == 11 + && damage >= target->health) + { + damage = target->health - 1; + } + + + // Below certain threshold, + // ignore damage in GOD mode, or with INVUL power. + if ( damage < 1000 + && ( (player->cheats&CF_GODMODE) + || player->powers[pw_invulnerability] ) ) + { + return; + } + + if (player->armortype) + { + if (player->armortype == 1) + saved = damage/3; + else + saved = damage/2; + + if (player->armorpoints <= saved) + { + // armor is used up + saved = player->armorpoints; + player->armortype = 0; + } + player->armorpoints -= saved; + damage -= saved; + } + player->health -= damage; // mirror mobj health here for Dave + if (player->health < 0) + player->health = 0; + + player->attacker = source; + player->damagecount += damage; // add damage after armor / invuln + + if (player->damagecount > 100) + player->damagecount = 100; // teleport stomp does 10k points... + + temp = damage < 100 ? damage : 100; + + if (player == &players[consoleplayer]) + I_Tactile (40,10,40+temp*2); + } + + // do the damage + target->health -= damage; + if (target->health <= 0) + { + P_KillMobj (source, target); + return; + } + + if ( (P_Random () < target->info->painchance) + && !(target->flags&MF_SKULLFLY) ) + { + target->flags |= MF_JUSTHIT; // fight back! + + P_SetMobjState (target, target->info->painstate); + } + + target->reactiontime = 0; // we're awake now... + + if ( (!target->threshold || target->type == MT_VILE) + && source && source != target + && source->type != MT_VILE) + { + // if not intent on another player, + // chase after this one + target->target = source; + target->threshold = BASETHRESHOLD; + if (target->state == &states[target->info->spawnstate] + && target->info->seestate != S_NULL) + P_SetMobjState (target, target->info->seestate); + } + +} + diff --git a/firmware_p4/components/Applications/doom/p_inter.h b/firmware_p4/components/Applications/doom/p_inter.h new file mode 100644 index 000000000..5764d5dab --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_inter.h @@ -0,0 +1,30 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// +// + + +#ifndef __P_INTER__ +#define __P_INTER__ + + + + +boolean P_GivePower(player_t*, int); + + + +#endif diff --git a/firmware_p4/components/Applications/doom/p_lights.c b/firmware_p4/components/Applications/doom/p_lights.c new file mode 100644 index 000000000..863338dcf --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_lights.c @@ -0,0 +1,350 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Handle Sector base lighting effects. +// Muzzle flash? +// + + + +#include "z_zone.h" +#include "m_random.h" + +#include "doomdef.h" +#include "p_local.h" + + +// State. +#include "r_state.h" + +// +// FIRELIGHT FLICKER +// + +// +// T_FireFlicker +// +void T_FireFlicker (fireflicker_t* flick) +{ + int amount; + + if (--flick->count) + return; + + amount = (P_Random()&3)*16; + + if (flick->sector->lightlevel - amount < flick->minlight) + flick->sector->lightlevel = flick->minlight; + else + flick->sector->lightlevel = flick->maxlight - amount; + + flick->count = 4; +} + + + +// +// P_SpawnFireFlicker +// +void P_SpawnFireFlicker (sector_t* sector) +{ + fireflicker_t* flick; + + // Note that we are resetting sector attributes. + // Nothing special about it during gameplay. + sector->special = 0; + + flick = Z_Malloc ( sizeof(*flick), PU_LEVSPEC, 0); + + P_AddThinker (&flick->thinker); + + flick->thinker.function.acp1 = (actionf_p1) T_FireFlicker; + flick->sector = sector; + flick->maxlight = sector->lightlevel; + flick->minlight = P_FindMinSurroundingLight(sector,sector->lightlevel)+16; + flick->count = 4; +} + + + +// +// BROKEN LIGHT FLASHING +// + + +// +// T_LightFlash +// Do flashing lights. +// +void T_LightFlash (lightflash_t* flash) +{ + if (--flash->count) + return; + + if (flash->sector->lightlevel == flash->maxlight) + { + flash-> sector->lightlevel = flash->minlight; + flash->count = (P_Random()&flash->mintime)+1; + } + else + { + flash-> sector->lightlevel = flash->maxlight; + flash->count = (P_Random()&flash->maxtime)+1; + } + +} + + + + +// +// P_SpawnLightFlash +// After the map has been loaded, scan each sector +// for specials that spawn thinkers +// +void P_SpawnLightFlash (sector_t* sector) +{ + lightflash_t* flash; + + // nothing special about it during gameplay + sector->special = 0; + + flash = Z_Malloc ( sizeof(*flash), PU_LEVSPEC, 0); + + P_AddThinker (&flash->thinker); + + flash->thinker.function.acp1 = (actionf_p1) T_LightFlash; + flash->sector = sector; + flash->maxlight = sector->lightlevel; + + flash->minlight = P_FindMinSurroundingLight(sector,sector->lightlevel); + flash->maxtime = 64; + flash->mintime = 7; + flash->count = (P_Random()&flash->maxtime)+1; +} + + + +// +// STROBE LIGHT FLASHING +// + + +// +// T_StrobeFlash +// +void T_StrobeFlash (strobe_t* flash) +{ + if (--flash->count) + return; + + if (flash->sector->lightlevel == flash->minlight) + { + flash-> sector->lightlevel = flash->maxlight; + flash->count = flash->brighttime; + } + else + { + flash-> sector->lightlevel = flash->minlight; + flash->count =flash->darktime; + } + +} + + + +// +// P_SpawnStrobeFlash +// After the map has been loaded, scan each sector +// for specials that spawn thinkers +// +void +P_SpawnStrobeFlash +( sector_t* sector, + int fastOrSlow, + int inSync ) +{ + strobe_t* flash; + + flash = Z_Malloc ( sizeof(*flash), PU_LEVSPEC, 0); + + P_AddThinker (&flash->thinker); + + flash->sector = sector; + flash->darktime = fastOrSlow; + flash->brighttime = STROBEBRIGHT; + flash->thinker.function.acp1 = (actionf_p1) T_StrobeFlash; + flash->maxlight = sector->lightlevel; + flash->minlight = P_FindMinSurroundingLight(sector, sector->lightlevel); + + if (flash->minlight == flash->maxlight) + flash->minlight = 0; + + // nothing special about it during gameplay + sector->special = 0; + + if (!inSync) + flash->count = (P_Random()&7)+1; + else + flash->count = 1; +} + + +// +// Start strobing lights (usually from a trigger) +// +void EV_StartLightStrobing(line_t* line) +{ + int secnum; + sector_t* sec; + + secnum = -1; + while ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0) + { + sec = §ors[secnum]; + if (sec->specialdata) + continue; + + P_SpawnStrobeFlash (sec,SLOWDARK, 0); + } +} + + + +// +// TURN LINE'S TAG LIGHTS OFF +// +void EV_TurnTagLightsOff(line_t* line) +{ + int i; + int j; + int min; + sector_t* sector; + sector_t* tsec; + line_t* templine; + + sector = sectors; + + for (j = 0;j < numsectors; j++, sector++) + { + if (sector->tag == line->tag) + { + min = sector->lightlevel; + for (i = 0;i < sector->linecount; i++) + { + templine = sector->lines[i]; + tsec = getNextSector(templine,sector); + if (!tsec) + continue; + if (tsec->lightlevel < min) + min = tsec->lightlevel; + } + sector->lightlevel = min; + } + } +} + + +// +// TURN LINE'S TAG LIGHTS ON +// +void +EV_LightTurnOn +( line_t* line, + int bright ) +{ + int i; + int j; + sector_t* sector; + sector_t* temp; + line_t* templine; + + sector = sectors; + + for (i=0;itag == line->tag) + { + // bright = 0 means to search + // for highest light level + // surrounding sector + if (!bright) + { + for (j = 0;j < sector->linecount; j++) + { + templine = sector->lines[j]; + temp = getNextSector(templine,sector); + + if (!temp) + continue; + + if (temp->lightlevel > bright) + bright = temp->lightlevel; + } + } + sector-> lightlevel = bright; + } + } +} + + +// +// Spawn glowing light +// + +void T_Glow(glow_t* g) +{ + switch(g->direction) + { + case -1: + // DOWN + g->sector->lightlevel -= GLOWSPEED; + if (g->sector->lightlevel <= g->minlight) + { + g->sector->lightlevel += GLOWSPEED; + g->direction = 1; + } + break; + + case 1: + // UP + g->sector->lightlevel += GLOWSPEED; + if (g->sector->lightlevel >= g->maxlight) + { + g->sector->lightlevel -= GLOWSPEED; + g->direction = -1; + } + break; + } +} + + +void P_SpawnGlowingLight(sector_t* sector) +{ + glow_t* g; + + g = Z_Malloc( sizeof(*g), PU_LEVSPEC, 0); + + P_AddThinker(&g->thinker); + + g->sector = sector; + g->minlight = P_FindMinSurroundingLight(sector,sector->lightlevel); + g->maxlight = sector->lightlevel; + g->thinker.function.acp1 = (actionf_p1) T_Glow; + g->direction = -1; + + sector->special = 0; +} + diff --git a/firmware_p4/components/Applications/doom/p_local.h b/firmware_p4/components/Applications/doom/p_local.h new file mode 100644 index 000000000..95fa40534 --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_local.h @@ -0,0 +1,297 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Play functions, animation, global header. +// + + +#ifndef __P_LOCAL__ +#define __P_LOCAL__ + +#ifndef __R_LOCAL__ +#include "r_local.h" +#endif + +#define FLOATSPEED (FRACUNIT*4) + + +#define MAXHEALTH 100 +#define VIEWHEIGHT (41*FRACUNIT) + +// mapblocks are used to check movement +// against lines and things +#define MAPBLOCKUNITS 128 +#define MAPBLOCKSIZE (MAPBLOCKUNITS*FRACUNIT) +#define MAPBLOCKSHIFT (FRACBITS+7) +#define MAPBMASK (MAPBLOCKSIZE-1) +#define MAPBTOFRAC (MAPBLOCKSHIFT-FRACBITS) + + +// player radius for movement checking +#define PLAYERRADIUS 16*FRACUNIT + +// MAXRADIUS is for precalculated sector block boxes +// the spider demon is larger, +// but we do not have any moving sectors nearby +#define MAXRADIUS 32*FRACUNIT + +#define GRAVITY FRACUNIT +#define MAXMOVE (30*FRACUNIT) + +#define USERANGE (64*FRACUNIT) +#define MELEERANGE (64*FRACUNIT) +#define MISSILERANGE (32*64*FRACUNIT) + +// follow a player exlusively for 3 seconds +#define BASETHRESHOLD 100 + + + +// +// P_TICK +// + +// both the head and tail of the thinker list +extern thinker_t thinkercap; + + +void P_InitThinkers (void); +void P_AddThinker (thinker_t* thinker); +void P_RemoveThinker (thinker_t* thinker); + + +// +// P_PSPR +// +void P_SetupPsprites (player_t* curplayer); +void P_MovePsprites (player_t* curplayer); +void P_DropWeapon (player_t* player); + + +// +// P_USER +// +void P_PlayerThink (player_t* player); + + +// +// P_MOBJ +// +#define ONFLOORZ INT_MIN +#define ONCEILINGZ INT_MAX + +// Time interval for item respawning. +#define ITEMQUESIZE 128 + +extern mapthing_t itemrespawnque[ITEMQUESIZE]; +extern int itemrespawntime[ITEMQUESIZE]; +extern int iquehead; +extern int iquetail; + + +void P_RespawnSpecials (void); + +mobj_t* +P_SpawnMobj +( fixed_t x, + fixed_t y, + fixed_t z, + mobjtype_t type ); + +void P_RemoveMobj (mobj_t* th); +mobj_t* P_SubstNullMobj (mobj_t* th); +boolean P_SetMobjState (mobj_t* mobj, statenum_t state); +void P_MobjThinker (mobj_t* mobj); + +void P_SpawnPuff (fixed_t x, fixed_t y, fixed_t z); +void P_SpawnBlood (fixed_t x, fixed_t y, fixed_t z, int damage); +mobj_t* P_SpawnMissile (mobj_t* source, mobj_t* dest, mobjtype_t type); +void P_SpawnPlayerMissile (mobj_t* source, mobjtype_t type); + + +// +// P_ENEMY +// +void P_NoiseAlert (mobj_t* target, mobj_t* emmiter); + + +// +// P_MAPUTL +// +typedef struct +{ + fixed_t x; + fixed_t y; + fixed_t dx; + fixed_t dy; + +} divline_t; + +typedef struct +{ + fixed_t frac; // along trace line + boolean isaline; + union { + mobj_t* thing; + line_t* line; + } d; +} intercept_t; + +// Extended MAXINTERCEPTS, to allow for intercepts overrun emulation. + +#define MAXINTERCEPTS_ORIGINAL 128 +#define MAXINTERCEPTS (MAXINTERCEPTS_ORIGINAL + 61) + +extern intercept_t intercepts[MAXINTERCEPTS]; +extern intercept_t* intercept_p; + +typedef boolean (*traverser_t) (intercept_t *in); + +fixed_t P_AproxDistance (fixed_t dx, fixed_t dy); +int P_PointOnLineSide (fixed_t x, fixed_t y, line_t* line); +int P_PointOnDivlineSide (fixed_t x, fixed_t y, divline_t* line); +void P_MakeDivline (line_t* li, divline_t* dl); +fixed_t P_InterceptVector (divline_t* v2, divline_t* v1); +int P_BoxOnLineSide (fixed_t* tmbox, line_t* ld); + +extern fixed_t opentop; +extern fixed_t openbottom; +extern fixed_t openrange; +extern fixed_t lowfloor; + +void P_LineOpening (line_t* linedef); + +boolean P_BlockLinesIterator (int x, int y, boolean(*func)(line_t*) ); +boolean P_BlockThingsIterator (int x, int y, boolean(*func)(mobj_t*) ); + +#define PT_ADDLINES 1 +#define PT_ADDTHINGS 2 +#define PT_EARLYOUT 4 + +extern divline_t trace; + +boolean +P_PathTraverse +( fixed_t x1, + fixed_t y1, + fixed_t x2, + fixed_t y2, + int flags, + boolean (*trav) (intercept_t *)); + +void P_UnsetThingPosition (mobj_t* thing); +void P_SetThingPosition (mobj_t* thing); + + +// +// P_MAP +// + +// If "floatok" true, move would be ok +// if within "tmfloorz - tmceilingz". +extern boolean floatok; +extern fixed_t tmfloorz; +extern fixed_t tmceilingz; + + +extern line_t* ceilingline; + +// fraggle: I have increased the size of this buffer. In the original Doom, +// overrunning past this limit caused other bits of memory to be overwritten, +// affecting demo playback. However, in doing so, the limit was still +// exceeded. So we have to support more than 8 specials. +// +// We keep the original limit, to detect what variables in memory were +// overwritten (see SpechitOverrun()) + +#define MAXSPECIALCROSS 20 +#define MAXSPECIALCROSS_ORIGINAL 8 + +extern line_t* spechit[MAXSPECIALCROSS]; +extern int numspechit; + +boolean P_CheckPosition (mobj_t *thing, fixed_t x, fixed_t y); +boolean P_TryMove (mobj_t* thing, fixed_t x, fixed_t y); +boolean P_TeleportMove (mobj_t* thing, fixed_t x, fixed_t y); +void P_SlideMove (mobj_t* mo); +boolean P_CheckSight (mobj_t* t1, mobj_t* t2); +void P_UseLines (player_t* player); + +boolean P_ChangeSector (sector_t* sector, boolean crunch); + +extern mobj_t* linetarget; // who got hit (or NULL) + +fixed_t +P_AimLineAttack +( mobj_t* t1, + angle_t angle, + fixed_t distance ); + +void +P_LineAttack +( mobj_t* t1, + angle_t angle, + fixed_t distance, + fixed_t slope, + int damage ); + +void +P_RadiusAttack +( mobj_t* spot, + mobj_t* source, + int damage ); + + + +// +// P_SETUP +// +extern byte* rejectmatrix; // for fast sight rejection +extern short* blockmaplump; // offsets in blockmap are from here +extern short* blockmap; +extern int bmapwidth; +extern int bmapheight; // in mapblocks +extern fixed_t bmaporgx; +extern fixed_t bmaporgy; // origin of block map +extern mobj_t** blocklinks; // for thing chains + + + +// +// P_INTER +// +extern int maxammo[NUMAMMO]; +extern int clipammo[NUMAMMO]; + +void +P_TouchSpecialThing +( mobj_t* special, + mobj_t* toucher ); + +void +P_DamageMobj +( mobj_t* target, + mobj_t* inflictor, + mobj_t* source, + int damage ); + + +// +// P_SPEC +// +#include "p_spec.h" + + +#endif // __P_LOCAL__ diff --git a/firmware_p4/components/Applications/doom/p_map.c b/firmware_p4/components/Applications/doom/p_map.c new file mode 100644 index 000000000..e371869a7 --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_map.c @@ -0,0 +1,1448 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard, Andrey Budko +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Movement, collision handling. +// Shooting and aiming. +// + +#include +#include + +#include "deh_misc.h" + +#include "m_bbox.h" +#include "m_random.h" +#include "i_system.h" + +#include "doomdef.h" +#include "m_argv.h" +#include "m_misc.h" +#include "p_local.h" + +#include "s_sound.h" + +// State. +#include "doomstat.h" +#include "r_state.h" +// Data. +#include "sounds.h" + +// Spechit overrun magic value. +// +// This is the value used by PrBoom-plus. I think the value below is +// actually better and works with more demos. However, I think +// it's better for the spechits emulation to be compatible with +// PrBoom-plus, at least so that the big spechits emulation list +// on Doomworld can also be used with Chocolate Doom. + +#define DEFAULT_SPECHIT_MAGIC 0x01C09C98 + +// This is from a post by myk on the Doomworld forums, +// outputted from entryway's spechit_magic generator for +// s205n546.lmp. The _exact_ value of this isn't too +// important; as long as it is in the right general +// range, it will usually work. Otherwise, we can use +// the generator (hacked doom2.exe) and provide it +// with -spechit. + +//#define DEFAULT_SPECHIT_MAGIC 0x84f968e8 + + +fixed_t tmbbox[4]; +mobj_t* tmthing; +int tmflags; +fixed_t tmx; +fixed_t tmy; + + +// If "floatok" true, move would be ok +// if within "tmfloorz - tmceilingz". +boolean floatok; + +fixed_t tmfloorz; +fixed_t tmceilingz; +fixed_t tmdropoffz; + +// keep track of the line that lowers the ceiling, +// so missiles don't explode against sky hack walls +line_t* ceilingline; + +// keep track of special lines as they are hit, +// but don't process them until the move is proven valid + +line_t* spechit[MAXSPECIALCROSS]; +int numspechit; + + + +// +// TELEPORT MOVE +// + +// +// PIT_StompThing +// +boolean PIT_StompThing (mobj_t* thing) +{ + fixed_t blockdist; + + if (!(thing->flags & MF_SHOOTABLE) ) + return true; + + blockdist = thing->radius + tmthing->radius; + + if ( abs(thing->x - tmx) >= blockdist + || abs(thing->y - tmy) >= blockdist ) + { + // didn't hit it + return true; + } + + // don't clip against self + if (thing == tmthing) + return true; + + // monsters don't stomp things except on boss level + if ( !tmthing->player && gamemap != 30) + return false; + + P_DamageMobj (thing, tmthing, tmthing, 10000); + + return true; +} + + +// +// P_TeleportMove +// +boolean +P_TeleportMove +( mobj_t* thing, + fixed_t x, + fixed_t y ) +{ + int xl; + int xh; + int yl; + int yh; + int bx; + int by; + + subsector_t* newsubsec; + + // kill anything occupying the position + tmthing = thing; + tmflags = thing->flags; + + tmx = x; + tmy = y; + + tmbbox[BOXTOP] = y + tmthing->radius; + tmbbox[BOXBOTTOM] = y - tmthing->radius; + tmbbox[BOXRIGHT] = x + tmthing->radius; + tmbbox[BOXLEFT] = x - tmthing->radius; + + newsubsec = R_PointInSubsector (x,y); + ceilingline = NULL; + + // The base floor/ceiling is from the subsector + // that contains the point. + // Any contacted lines the step closer together + // will adjust them. + tmfloorz = tmdropoffz = newsubsec->sector->floorheight; + tmceilingz = newsubsec->sector->ceilingheight; + + validcount++; + numspechit = 0; + + // stomp on any things contacted + xl = (tmbbox[BOXLEFT] - bmaporgx - MAXRADIUS)>>MAPBLOCKSHIFT; + xh = (tmbbox[BOXRIGHT] - bmaporgx + MAXRADIUS)>>MAPBLOCKSHIFT; + yl = (tmbbox[BOXBOTTOM] - bmaporgy - MAXRADIUS)>>MAPBLOCKSHIFT; + yh = (tmbbox[BOXTOP] - bmaporgy + MAXRADIUS)>>MAPBLOCKSHIFT; + + for (bx=xl ; bx<=xh ; bx++) + for (by=yl ; by<=yh ; by++) + if (!P_BlockThingsIterator(bx,by,PIT_StompThing)) + return false; + + // the move is ok, + // so link the thing into its new position + P_UnsetThingPosition (thing); + + thing->floorz = tmfloorz; + thing->ceilingz = tmceilingz; + thing->x = x; + thing->y = y; + + P_SetThingPosition (thing); + + return true; +} + + +// +// MOVEMENT ITERATOR FUNCTIONS +// + +static void SpechitOverrun(line_t *ld); + +// +// PIT_CheckLine +// Adjusts tmfloorz and tmceilingz as lines are contacted +// +boolean PIT_CheckLine (line_t* ld) +{ + if (tmbbox[BOXRIGHT] <= ld->bbox[BOXLEFT] + || tmbbox[BOXLEFT] >= ld->bbox[BOXRIGHT] + || tmbbox[BOXTOP] <= ld->bbox[BOXBOTTOM] + || tmbbox[BOXBOTTOM] >= ld->bbox[BOXTOP] ) + return true; + + if (P_BoxOnLineSide (tmbbox, ld) != -1) + return true; + + // A line has been hit + + // The moving thing's destination position will cross + // the given line. + // If this should not be allowed, return false. + // If the line is special, keep track of it + // to process later if the move is proven ok. + // NOTE: specials are NOT sorted by order, + // so two special lines that are only 8 pixels apart + // could be crossed in either order. + + if (!ld->backsector) + return false; // one sided line + + if (!(tmthing->flags & MF_MISSILE) ) + { + if ( ld->flags & ML_BLOCKING ) + return false; // explicitly blocking everything + + if ( !tmthing->player && ld->flags & ML_BLOCKMONSTERS ) + return false; // block monsters only + } + + // set openrange, opentop, openbottom + P_LineOpening (ld); + + // adjust floor / ceiling heights + if (opentop < tmceilingz) + { + tmceilingz = opentop; + ceilingline = ld; + } + + if (openbottom > tmfloorz) + tmfloorz = openbottom; + + if (lowfloor < tmdropoffz) + tmdropoffz = lowfloor; + + // if contacted a special line, add it to the list + if (ld->special) + { + spechit[numspechit] = ld; + numspechit++; + + // fraggle: spechits overrun emulation code from prboom-plus + if (numspechit > MAXSPECIALCROSS_ORIGINAL) + { + SpechitOverrun(ld); + } + } + + return true; +} + +// +// PIT_CheckThing +// +boolean PIT_CheckThing (mobj_t* thing) +{ + fixed_t blockdist; + boolean solid; + int damage; + + if (!(thing->flags & (MF_SOLID|MF_SPECIAL|MF_SHOOTABLE) )) + return true; + + blockdist = thing->radius + tmthing->radius; + + if ( abs(thing->x - tmx) >= blockdist + || abs(thing->y - tmy) >= blockdist ) + { + // didn't hit it + return true; + } + + // don't clip against self + if (thing == tmthing) + return true; + + // check for skulls slamming into things + if (tmthing->flags & MF_SKULLFLY) + { + damage = ((P_Random()%8)+1)*tmthing->info->damage; + + P_DamageMobj (thing, tmthing, tmthing, damage); + + tmthing->flags &= ~MF_SKULLFLY; + tmthing->momx = tmthing->momy = tmthing->momz = 0; + + P_SetMobjState (tmthing, tmthing->info->spawnstate); + + return false; // stop moving + } + + + // missiles can hit other things + if (tmthing->flags & MF_MISSILE) + { + // see if it went over / under + if (tmthing->z > thing->z + thing->height) + return true; // overhead + if (tmthing->z+tmthing->height < thing->z) + return true; // underneath + + if (tmthing->target + && (tmthing->target->type == thing->type || + (tmthing->target->type == MT_KNIGHT && thing->type == MT_BRUISER)|| + (tmthing->target->type == MT_BRUISER && thing->type == MT_KNIGHT) ) ) + { + // Don't hit same species as originator. + if (thing == tmthing->target) + return true; + + // sdh: Add deh_species_infighting here. We can override the + // "monsters of the same species cant hurt each other" behavior + // through dehacked patches + + if (thing->type != MT_PLAYER && !deh_species_infighting) + { + // Explode, but do no damage. + // Let players missile other players. + return false; + } + } + + if (! (thing->flags & MF_SHOOTABLE) ) + { + // didn't do any damage + return !(thing->flags & MF_SOLID); + } + + // damage / explode + damage = ((P_Random()%8)+1)*tmthing->info->damage; + P_DamageMobj (thing, tmthing, tmthing->target, damage); + + // don't traverse any more + return false; + } + + // check for special pickup + if (thing->flags & MF_SPECIAL) + { + solid = thing->flags&MF_SOLID; + if (tmflags&MF_PICKUP) + { + // can remove thing + P_TouchSpecialThing (thing, tmthing); + } + return !solid; + } + + return !(thing->flags & MF_SOLID); +} + + +// +// MOVEMENT CLIPPING +// + +// +// P_CheckPosition +// This is purely informative, nothing is modified +// (except things picked up). +// +// in: +// a mobj_t (can be valid or invalid) +// a position to be checked +// (doesn't need to be related to the mobj_t->x,y) +// +// during: +// special things are touched if MF_PICKUP +// early out on solid lines? +// +// out: +// newsubsec +// floorz +// ceilingz +// tmdropoffz +// the lowest point contacted +// (monsters won't move to a dropoff) +// speciallines[] +// numspeciallines +// +boolean +P_CheckPosition +( mobj_t* thing, + fixed_t x, + fixed_t y ) +{ + int xl; + int xh; + int yl; + int yh; + int bx; + int by; + subsector_t* newsubsec; + + tmthing = thing; + tmflags = thing->flags; + + tmx = x; + tmy = y; + + tmbbox[BOXTOP] = y + tmthing->radius; + tmbbox[BOXBOTTOM] = y - tmthing->radius; + tmbbox[BOXRIGHT] = x + tmthing->radius; + tmbbox[BOXLEFT] = x - tmthing->radius; + + newsubsec = R_PointInSubsector (x,y); + ceilingline = NULL; + + // The base floor / ceiling is from the subsector + // that contains the point. + // Any contacted lines the step closer together + // will adjust them. + tmfloorz = tmdropoffz = newsubsec->sector->floorheight; + tmceilingz = newsubsec->sector->ceilingheight; + + validcount++; + numspechit = 0; + + if ( tmflags & MF_NOCLIP ) + return true; + + // Check things first, possibly picking things up. + // The bounding box is extended by MAXRADIUS + // because mobj_ts are grouped into mapblocks + // based on their origin point, and can overlap + // into adjacent blocks by up to MAXRADIUS units. + xl = (tmbbox[BOXLEFT] - bmaporgx - MAXRADIUS)>>MAPBLOCKSHIFT; + xh = (tmbbox[BOXRIGHT] - bmaporgx + MAXRADIUS)>>MAPBLOCKSHIFT; + yl = (tmbbox[BOXBOTTOM] - bmaporgy - MAXRADIUS)>>MAPBLOCKSHIFT; + yh = (tmbbox[BOXTOP] - bmaporgy + MAXRADIUS)>>MAPBLOCKSHIFT; + + for (bx=xl ; bx<=xh ; bx++) + for (by=yl ; by<=yh ; by++) + if (!P_BlockThingsIterator(bx,by,PIT_CheckThing)) + return false; + + // check lines + xl = (tmbbox[BOXLEFT] - bmaporgx)>>MAPBLOCKSHIFT; + xh = (tmbbox[BOXRIGHT] - bmaporgx)>>MAPBLOCKSHIFT; + yl = (tmbbox[BOXBOTTOM] - bmaporgy)>>MAPBLOCKSHIFT; + yh = (tmbbox[BOXTOP] - bmaporgy)>>MAPBLOCKSHIFT; + + for (bx=xl ; bx<=xh ; bx++) + for (by=yl ; by<=yh ; by++) + if (!P_BlockLinesIterator (bx,by,PIT_CheckLine)) + return false; + + return true; +} + + +// +// P_TryMove +// Attempt to move to a new position, +// crossing special lines unless MF_TELEPORT is set. +// +boolean +P_TryMove +( mobj_t* thing, + fixed_t x, + fixed_t y ) +{ + fixed_t oldx; + fixed_t oldy; + int side; + int oldside; + line_t* ld; + + floatok = false; + if (!P_CheckPosition (thing, x, y)) + return false; // solid wall or thing + + if ( !(thing->flags & MF_NOCLIP) ) + { + if (tmceilingz - tmfloorz < thing->height) + return false; // doesn't fit + + floatok = true; + + if ( !(thing->flags&MF_TELEPORT) + &&tmceilingz - thing->z < thing->height) + return false; // mobj must lower itself to fit + + if ( !(thing->flags&MF_TELEPORT) + && tmfloorz - thing->z > 24*FRACUNIT ) + return false; // too big a step up + + if ( !(thing->flags&(MF_DROPOFF|MF_FLOAT)) + && tmfloorz - tmdropoffz > 24*FRACUNIT ) + return false; // don't stand over a dropoff + } + + // the move is ok, + // so link the thing into its new position + P_UnsetThingPosition (thing); + + oldx = thing->x; + oldy = thing->y; + thing->floorz = tmfloorz; + thing->ceilingz = tmceilingz; + thing->x = x; + thing->y = y; + + P_SetThingPosition (thing); + + // if any special lines were hit, do the effect + if (! (thing->flags&(MF_TELEPORT|MF_NOCLIP)) ) + { + while (numspechit--) + { + // see if the line was crossed + ld = spechit[numspechit]; + side = P_PointOnLineSide (thing->x, thing->y, ld); + oldside = P_PointOnLineSide (oldx, oldy, ld); + if (side != oldside) + { + if (ld->special) + P_CrossSpecialLine (ld-lines, oldside, thing); + } + } + } + + return true; +} + + +// +// P_ThingHeightClip +// Takes a valid thing and adjusts the thing->floorz, +// thing->ceilingz, and possibly thing->z. +// This is called for all nearby monsters +// whenever a sector changes height. +// If the thing doesn't fit, +// the z will be set to the lowest value +// and false will be returned. +// +boolean P_ThingHeightClip (mobj_t* thing) +{ + boolean onfloor; + + onfloor = (thing->z == thing->floorz); + + P_CheckPosition (thing, thing->x, thing->y); + // what about stranding a monster partially off an edge? + + thing->floorz = tmfloorz; + thing->ceilingz = tmceilingz; + + if (onfloor) + { + // walking monsters rise and fall with the floor + thing->z = thing->floorz; + } + else + { + // don't adjust a floating monster unless forced to + if (thing->z+thing->height > thing->ceilingz) + thing->z = thing->ceilingz - thing->height; + } + + if (thing->ceilingz - thing->floorz < thing->height) + return false; + + return true; +} + + + +// +// SLIDE MOVE +// Allows the player to slide along any angled walls. +// +fixed_t bestslidefrac; +fixed_t secondslidefrac; + +line_t* bestslideline; +line_t* secondslideline; + +mobj_t* slidemo; + +fixed_t tmxmove; +fixed_t tmymove; + + + +// +// P_HitSlideLine +// Adjusts the xmove / ymove +// so that the next move will slide along the wall. +// +void P_HitSlideLine (line_t* ld) +{ + int side; + + angle_t lineangle; + angle_t moveangle; + angle_t deltaangle; + + fixed_t movelen; + fixed_t newlen; + + + if (ld->slopetype == ST_HORIZONTAL) + { + tmymove = 0; + return; + } + + if (ld->slopetype == ST_VERTICAL) + { + tmxmove = 0; + return; + } + + side = P_PointOnLineSide (slidemo->x, slidemo->y, ld); + + lineangle = R_PointToAngle2 (0,0, ld->dx, ld->dy); + + if (side == 1) + lineangle += ANG180; + + moveangle = R_PointToAngle2 (0,0, tmxmove, tmymove); + deltaangle = moveangle-lineangle; + + if (deltaangle > ANG180) + deltaangle += ANG180; + // I_Error ("SlideLine: ang>ANG180"); + + lineangle >>= ANGLETOFINESHIFT; + deltaangle >>= ANGLETOFINESHIFT; + + movelen = P_AproxDistance (tmxmove, tmymove); + newlen = FixedMul (movelen, finecosine[deltaangle]); + + tmxmove = FixedMul (newlen, finecosine[lineangle]); + tmymove = FixedMul (newlen, finesine[lineangle]); +} + + +// +// PTR_SlideTraverse +// +boolean PTR_SlideTraverse (intercept_t* in) +{ + line_t* li; + + if (!in->isaline) + I_Error ("PTR_SlideTraverse: not a line?"); + + li = in->d.line; + + if ( ! (li->flags & ML_TWOSIDED) ) + { + if (P_PointOnLineSide (slidemo->x, slidemo->y, li)) + { + // don't hit the back side + return true; + } + goto isblocking; + } + + // set openrange, opentop, openbottom + P_LineOpening (li); + + if (openrange < slidemo->height) + goto isblocking; // doesn't fit + + if (opentop - slidemo->z < slidemo->height) + goto isblocking; // mobj is too high + + if (openbottom - slidemo->z > 24*FRACUNIT ) + goto isblocking; // too big a step up + + // this line doesn't block movement + return true; + + // the line does block movement, + // see if it is closer than best so far + isblocking: + if (in->frac < bestslidefrac) + { + secondslidefrac = bestslidefrac; + secondslideline = bestslideline; + bestslidefrac = in->frac; + bestslideline = li; + } + + return false; // stop +} + + + +// +// P_SlideMove +// The momx / momy move is bad, so try to slide +// along a wall. +// Find the first line hit, move flush to it, +// and slide along it +// +// This is a kludgy mess. +// +void P_SlideMove (mobj_t* mo) +{ + fixed_t leadx; + fixed_t leady; + fixed_t trailx; + fixed_t traily; + fixed_t newx; + fixed_t newy; + int hitcount; + + slidemo = mo; + hitcount = 0; + + retry: + if (++hitcount == 3) + goto stairstep; // don't loop forever + + + // trace along the three leading corners + if (mo->momx > 0) + { + leadx = mo->x + mo->radius; + trailx = mo->x - mo->radius; + } + else + { + leadx = mo->x - mo->radius; + trailx = mo->x + mo->radius; + } + + if (mo->momy > 0) + { + leady = mo->y + mo->radius; + traily = mo->y - mo->radius; + } + else + { + leady = mo->y - mo->radius; + traily = mo->y + mo->radius; + } + + bestslidefrac = FRACUNIT+1; + + P_PathTraverse ( leadx, leady, leadx+mo->momx, leady+mo->momy, + PT_ADDLINES, PTR_SlideTraverse ); + P_PathTraverse ( trailx, leady, trailx+mo->momx, leady+mo->momy, + PT_ADDLINES, PTR_SlideTraverse ); + P_PathTraverse ( leadx, traily, leadx+mo->momx, traily+mo->momy, + PT_ADDLINES, PTR_SlideTraverse ); + + // move up to the wall + if (bestslidefrac == FRACUNIT+1) + { + // the move most have hit the middle, so stairstep + stairstep: + if (!P_TryMove (mo, mo->x, mo->y + mo->momy)) + P_TryMove (mo, mo->x + mo->momx, mo->y); + return; + } + + // fudge a bit to make sure it doesn't hit + bestslidefrac -= 0x800; + if (bestslidefrac > 0) + { + newx = FixedMul (mo->momx, bestslidefrac); + newy = FixedMul (mo->momy, bestslidefrac); + + if (!P_TryMove (mo, mo->x+newx, mo->y+newy)) + goto stairstep; + } + + // Now continue along the wall. + // First calculate remainder. + bestslidefrac = FRACUNIT-(bestslidefrac+0x800); + + if (bestslidefrac > FRACUNIT) + bestslidefrac = FRACUNIT; + + if (bestslidefrac <= 0) + return; + + tmxmove = FixedMul (mo->momx, bestslidefrac); + tmymove = FixedMul (mo->momy, bestslidefrac); + + P_HitSlideLine (bestslideline); // clip the moves + + mo->momx = tmxmove; + mo->momy = tmymove; + + if (!P_TryMove (mo, mo->x+tmxmove, mo->y+tmymove)) + { + goto retry; + } +} + + +// +// P_LineAttack +// +mobj_t* linetarget; // who got hit (or NULL) +mobj_t* shootthing; + +// Height if not aiming up or down +// ???: use slope for monsters? +fixed_t shootz; + +int la_damage; +fixed_t attackrange; + +fixed_t aimslope; + +// slopes to top and bottom of target +extern fixed_t topslope; +extern fixed_t bottomslope; + + +// +// PTR_AimTraverse +// Sets linetaget and aimslope when a target is aimed at. +// +boolean +PTR_AimTraverse (intercept_t* in) +{ + line_t* li; + mobj_t* th; + fixed_t slope; + fixed_t thingtopslope; + fixed_t thingbottomslope; + fixed_t dist; + + if (in->isaline) + { + li = in->d.line; + + if ( !(li->flags & ML_TWOSIDED) ) + return false; // stop + + // Crosses a two sided line. + // A two sided line will restrict + // the possible target ranges. + P_LineOpening (li); + + if (openbottom >= opentop) + return false; // stop + + dist = FixedMul (attackrange, in->frac); + + if (li->backsector == NULL + || li->frontsector->floorheight != li->backsector->floorheight) + { + slope = FixedDiv (openbottom - shootz , dist); + if (slope > bottomslope) + bottomslope = slope; + } + + if (li->backsector == NULL + || li->frontsector->ceilingheight != li->backsector->ceilingheight) + { + slope = FixedDiv (opentop - shootz , dist); + if (slope < topslope) + topslope = slope; + } + + if (topslope <= bottomslope) + return false; // stop + + return true; // shot continues + } + + // shoot a thing + th = in->d.thing; + if (th == shootthing) + return true; // can't shoot self + + if (!(th->flags&MF_SHOOTABLE)) + return true; // corpse or something + + // check angles to see if the thing can be aimed at + dist = FixedMul (attackrange, in->frac); + thingtopslope = FixedDiv (th->z+th->height - shootz , dist); + + if (thingtopslope < bottomslope) + return true; // shot over the thing + + thingbottomslope = FixedDiv (th->z - shootz, dist); + + if (thingbottomslope > topslope) + return true; // shot under the thing + + // this thing can be hit! + if (thingtopslope > topslope) + thingtopslope = topslope; + + if (thingbottomslope < bottomslope) + thingbottomslope = bottomslope; + + aimslope = (thingtopslope+thingbottomslope)/2; + linetarget = th; + + return false; // don't go any farther +} + + +// +// PTR_ShootTraverse +// +boolean PTR_ShootTraverse (intercept_t* in) +{ + fixed_t x; + fixed_t y; + fixed_t z; + fixed_t frac; + + line_t* li; + + mobj_t* th; + + fixed_t slope; + fixed_t dist; + fixed_t thingtopslope; + fixed_t thingbottomslope; + + if (in->isaline) + { + li = in->d.line; + + if (li->special) + P_ShootSpecialLine (shootthing, li); + + if ( !(li->flags & ML_TWOSIDED) ) + goto hitline; + + // crosses a two sided line + P_LineOpening (li); + + dist = FixedMul (attackrange, in->frac); + + // e6y: emulation of missed back side on two-sided lines. + // backsector can be NULL when emulating missing back side. + + if (li->backsector == NULL) + { + slope = FixedDiv (openbottom - shootz , dist); + if (slope > aimslope) + goto hitline; + + slope = FixedDiv (opentop - shootz , dist); + if (slope < aimslope) + goto hitline; + } + else + { + if (li->frontsector->floorheight != li->backsector->floorheight) + { + slope = FixedDiv (openbottom - shootz , dist); + if (slope > aimslope) + goto hitline; + } + + if (li->frontsector->ceilingheight != li->backsector->ceilingheight) + { + slope = FixedDiv (opentop - shootz , dist); + if (slope < aimslope) + goto hitline; + } + } + + // shot continues + return true; + + + // hit line + hitline: + // position a bit closer + frac = in->frac - FixedDiv (4*FRACUNIT,attackrange); + x = trace.x + FixedMul (trace.dx, frac); + y = trace.y + FixedMul (trace.dy, frac); + z = shootz + FixedMul (aimslope, FixedMul(frac, attackrange)); + + if (li->frontsector->ceilingpic == skyflatnum) + { + // don't shoot the sky! + if (z > li->frontsector->ceilingheight) + return false; + + // it's a sky hack wall + if (li->backsector && li->backsector->ceilingpic == skyflatnum) + return false; + } + + // Spawn bullet puffs. + P_SpawnPuff (x,y,z); + + // don't go any farther + return false; + } + + // shoot a thing + th = in->d.thing; + if (th == shootthing) + return true; // can't shoot self + + if (!(th->flags&MF_SHOOTABLE)) + return true; // corpse or something + + // check angles to see if the thing can be aimed at + dist = FixedMul (attackrange, in->frac); + thingtopslope = FixedDiv (th->z+th->height - shootz , dist); + + if (thingtopslope < aimslope) + return true; // shot over the thing + + thingbottomslope = FixedDiv (th->z - shootz, dist); + + if (thingbottomslope > aimslope) + return true; // shot under the thing + + + // hit thing + // position a bit closer + frac = in->frac - FixedDiv (10*FRACUNIT,attackrange); + + x = trace.x + FixedMul (trace.dx, frac); + y = trace.y + FixedMul (trace.dy, frac); + z = shootz + FixedMul (aimslope, FixedMul(frac, attackrange)); + + // Spawn bullet puffs or blod spots, + // depending on target type. + if (in->d.thing->flags & MF_NOBLOOD) + P_SpawnPuff (x,y,z); + else + P_SpawnBlood (x,y,z, la_damage); + + if (la_damage) + P_DamageMobj (th, shootthing, shootthing, la_damage); + + // don't go any farther + return false; + +} + + +// +// P_AimLineAttack +// +fixed_t +P_AimLineAttack +( mobj_t* t1, + angle_t angle, + fixed_t distance ) +{ + fixed_t x2; + fixed_t y2; + + t1 = P_SubstNullMobj(t1); + + angle >>= ANGLETOFINESHIFT; + shootthing = t1; + + x2 = t1->x + (distance>>FRACBITS)*finecosine[angle]; + y2 = t1->y + (distance>>FRACBITS)*finesine[angle]; + shootz = t1->z + (t1->height>>1) + 8*FRACUNIT; + + // can't shoot outside view angles + topslope = 100*FRACUNIT/160; + bottomslope = -100*FRACUNIT/160; + + attackrange = distance; + linetarget = NULL; + + P_PathTraverse ( t1->x, t1->y, + x2, y2, + PT_ADDLINES|PT_ADDTHINGS, + PTR_AimTraverse ); + + if (linetarget) + return aimslope; + + return 0; +} + + +// +// P_LineAttack +// If damage == 0, it is just a test trace +// that will leave linetarget set. +// +void +P_LineAttack +( mobj_t* t1, + angle_t angle, + fixed_t distance, + fixed_t slope, + int damage ) +{ + fixed_t x2; + fixed_t y2; + + angle >>= ANGLETOFINESHIFT; + shootthing = t1; + la_damage = damage; + x2 = t1->x + (distance>>FRACBITS)*finecosine[angle]; + y2 = t1->y + (distance>>FRACBITS)*finesine[angle]; + shootz = t1->z + (t1->height>>1) + 8*FRACUNIT; + attackrange = distance; + aimslope = slope; + + P_PathTraverse ( t1->x, t1->y, + x2, y2, + PT_ADDLINES|PT_ADDTHINGS, + PTR_ShootTraverse ); +} + + + +// +// USE LINES +// +mobj_t* usething; + +boolean PTR_UseTraverse (intercept_t* in) +{ + int side; + + if (!in->d.line->special) + { + P_LineOpening (in->d.line); + if (openrange <= 0) + { + S_StartSound (usething, sfx_noway); + + // can't use through a wall + return false; + } + // not a special line, but keep checking + return true ; + } + + side = 0; + if (P_PointOnLineSide (usething->x, usething->y, in->d.line) == 1) + side = 1; + + // return false; // don't use back side + + P_UseSpecialLine (usething, in->d.line, side); + + // can't use for than one special line in a row + return false; +} + + +// +// P_UseLines +// Looks for special lines in front of the player to activate. +// +void P_UseLines (player_t* player) +{ + int angle; + fixed_t x1; + fixed_t y1; + fixed_t x2; + fixed_t y2; + + usething = player->mo; + + angle = player->mo->angle >> ANGLETOFINESHIFT; + + x1 = player->mo->x; + y1 = player->mo->y; + x2 = x1 + (USERANGE>>FRACBITS)*finecosine[angle]; + y2 = y1 + (USERANGE>>FRACBITS)*finesine[angle]; + + P_PathTraverse ( x1, y1, x2, y2, PT_ADDLINES, PTR_UseTraverse ); +} + + +// +// RADIUS ATTACK +// +mobj_t* bombsource; +mobj_t* bombspot; +int bombdamage; + + +// +// PIT_RadiusAttack +// "bombsource" is the creature +// that caused the explosion at "bombspot". +// +boolean PIT_RadiusAttack (mobj_t* thing) +{ + fixed_t dx; + fixed_t dy; + fixed_t dist; + + if (!(thing->flags & MF_SHOOTABLE) ) + return true; + + // Boss spider and cyborg + // take no damage from concussion. + if (thing->type == MT_CYBORG + || thing->type == MT_SPIDER) + return true; + + dx = abs(thing->x - bombspot->x); + dy = abs(thing->y - bombspot->y); + + dist = dx>dy ? dx : dy; + dist = (dist - thing->radius) >> FRACBITS; + + if (dist < 0) + dist = 0; + + if (dist >= bombdamage) + return true; // out of range + + if ( P_CheckSight (thing, bombspot) ) + { + // must be in direct path + P_DamageMobj (thing, bombspot, bombsource, bombdamage - dist); + } + + return true; +} + + +// +// P_RadiusAttack +// Source is the creature that caused the explosion at spot. +// +void +P_RadiusAttack +( mobj_t* spot, + mobj_t* source, + int damage ) +{ + int x; + int y; + + int xl; + int xh; + int yl; + int yh; + + fixed_t dist; + + dist = (damage+MAXRADIUS)<y + dist - bmaporgy)>>MAPBLOCKSHIFT; + yl = (spot->y - dist - bmaporgy)>>MAPBLOCKSHIFT; + xh = (spot->x + dist - bmaporgx)>>MAPBLOCKSHIFT; + xl = (spot->x - dist - bmaporgx)>>MAPBLOCKSHIFT; + bombspot = spot; + bombsource = source; + bombdamage = damage; + + for (y=yl ; y<=yh ; y++) + for (x=xl ; x<=xh ; x++) + P_BlockThingsIterator (x, y, PIT_RadiusAttack ); +} + + + +// +// SECTOR HEIGHT CHANGING +// After modifying a sectors floor or ceiling height, +// call this routine to adjust the positions +// of all things that touch the sector. +// +// If anything doesn't fit anymore, true will be returned. +// If crunch is true, they will take damage +// as they are being crushed. +// If Crunch is false, you should set the sector height back +// the way it was and call P_ChangeSector again +// to undo the changes. +// +boolean crushchange; +boolean nofit; + + +// +// PIT_ChangeSector +// +boolean PIT_ChangeSector (mobj_t* thing) +{ + mobj_t* mo; + + if (P_ThingHeightClip (thing)) + { + // keep checking + return true; + } + + + // crunch bodies to giblets + if (thing->health <= 0) + { + P_SetMobjState (thing, S_GIBS); + + thing->flags &= ~MF_SOLID; + thing->height = 0; + thing->radius = 0; + + // keep checking + return true; + } + + // crunch dropped items + if (thing->flags & MF_DROPPED) + { + P_RemoveMobj (thing); + + // keep checking + return true; + } + + if (! (thing->flags & MF_SHOOTABLE) ) + { + // assume it is bloody gibs or something + return true; + } + + nofit = true; + + if (crushchange && !(leveltime&3) ) + { + P_DamageMobj(thing,NULL,NULL,10); + + // spray blood in a random direction + mo = P_SpawnMobj (thing->x, + thing->y, + thing->z + thing->height/2, MT_BLOOD); + + mo->momx = (P_Random() - P_Random ())<<12; + mo->momy = (P_Random() - P_Random ())<<12; + } + + // keep checking (crush other things) + return true; +} + + + +// +// P_ChangeSector +// +boolean +P_ChangeSector +( sector_t* sector, + boolean crunch ) +{ + int x; + int y; + + nofit = false; + crushchange = crunch; + + // re-check heights for all things near the moving sector + for (x=sector->blockbox[BOXLEFT] ; x<= sector->blockbox[BOXRIGHT] ; x++) + for (y=sector->blockbox[BOXBOTTOM];y<= sector->blockbox[BOXTOP] ; y++) + P_BlockThingsIterator (x, y, PIT_ChangeSector); + + + return nofit; +} + +// Code to emulate the behavior of Vanilla Doom when encountering an overrun +// of the spechit array. This is by Andrey Budko (e6y) and comes from his +// PrBoom plus port. A big thanks to Andrey for this. + +static void SpechitOverrun(line_t *ld) +{ + static unsigned int baseaddr = 0; + unsigned int addr; + + if (baseaddr == 0) + { + int p; + + // This is the first time we have had an overrun. Work out + // what base address we are going to use. + // Allow a spechit value to be specified on the command line. + + //! + // @category compat + // @arg + // + // Use the specified magic value when emulating spechit overruns. + // + + p = M_CheckParmWithArgs("-spechit", 1); + + if (p > 0) + { + M_StrToInt(myargv[p+1], (int *) &baseaddr); + } + else + { + baseaddr = DEFAULT_SPECHIT_MAGIC; + } + } + + // Calculate address used in doom2.exe + + addr = baseaddr + (ld - lines) * 0x3E; + + switch(numspechit) + { + case 9: + case 10: + case 11: + case 12: + tmbbox[numspechit-9] = addr; + break; + case 13: + crushchange = addr; + break; + case 14: + nofit = addr; + break; + default: + fprintf(stderr, "SpechitOverrun: Warning: unable to emulate" + "an overrun where numspechit=%i\n", + numspechit); + break; + } +} + diff --git a/firmware_p4/components/Applications/doom/p_maputl.c b/firmware_p4/components/Applications/doom/p_maputl.c new file mode 100644 index 000000000..916f2b643 --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_maputl.c @@ -0,0 +1,1001 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// Copyright(C) 2005, 2006 Andrey Budko +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Movement/collision utility functions, +// as used by function in p_map.c. +// BLOCKMAP Iterator functions, +// and some PIT_* functions to use for iteration. +// + + + +#include + + +#include "m_bbox.h" + +#include "doomdef.h" +#include "doomstat.h" +#include "p_local.h" + + +// State. +#include "r_state.h" + +// +// P_AproxDistance +// Gives an estimation of distance (not exact) +// + +fixed_t +P_AproxDistance +( fixed_t dx, + fixed_t dy ) +{ + dx = abs(dx); + dy = abs(dy); + if (dx < dy) + return dx+dy-(dx>>1); + return dx+dy-(dy>>1); +} + + +// +// P_PointOnLineSide +// Returns 0 or 1 +// +int +P_PointOnLineSide +( fixed_t x, + fixed_t y, + line_t* line ) +{ + fixed_t dx; + fixed_t dy; + fixed_t left; + fixed_t right; + + if (!line->dx) + { + if (x <= line->v1->x) + return line->dy > 0; + + return line->dy < 0; + } + if (!line->dy) + { + if (y <= line->v1->y) + return line->dx < 0; + + return line->dx > 0; + } + + dx = (x - line->v1->x); + dy = (y - line->v1->y); + + left = FixedMul ( line->dy>>FRACBITS , dx ); + right = FixedMul ( dy , line->dx>>FRACBITS ); + + if (right < left) + return 0; // front side + return 1; // back side +} + + + +// +// P_BoxOnLineSide +// Considers the line to be infinite +// Returns side 0 or 1, -1 if box crosses the line. +// +int +P_BoxOnLineSide +( fixed_t* tmbox, + line_t* ld ) +{ + int p1 = 0; + int p2 = 0; + + switch (ld->slopetype) + { + case ST_HORIZONTAL: + p1 = tmbox[BOXTOP] > ld->v1->y; + p2 = tmbox[BOXBOTTOM] > ld->v1->y; + if (ld->dx < 0) + { + p1 ^= 1; + p2 ^= 1; + } + break; + + case ST_VERTICAL: + p1 = tmbox[BOXRIGHT] < ld->v1->x; + p2 = tmbox[BOXLEFT] < ld->v1->x; + if (ld->dy < 0) + { + p1 ^= 1; + p2 ^= 1; + } + break; + + case ST_POSITIVE: + p1 = P_PointOnLineSide (tmbox[BOXLEFT], tmbox[BOXTOP], ld); + p2 = P_PointOnLineSide (tmbox[BOXRIGHT], tmbox[BOXBOTTOM], ld); + break; + + case ST_NEGATIVE: + p1 = P_PointOnLineSide (tmbox[BOXRIGHT], tmbox[BOXTOP], ld); + p2 = P_PointOnLineSide (tmbox[BOXLEFT], tmbox[BOXBOTTOM], ld); + break; + } + + if (p1 == p2) + return p1; + return -1; +} + + +// +// P_PointOnDivlineSide +// Returns 0 or 1. +// +int +P_PointOnDivlineSide +( fixed_t x, + fixed_t y, + divline_t* line ) +{ + fixed_t dx; + fixed_t dy; + fixed_t left; + fixed_t right; + + if (!line->dx) + { + if (x <= line->x) + return line->dy > 0; + + return line->dy < 0; + } + if (!line->dy) + { + if (y <= line->y) + return line->dx < 0; + + return line->dx > 0; + } + + dx = (x - line->x); + dy = (y - line->y); + + // try to quickly decide by looking at sign bits + if ( (line->dy ^ line->dx ^ dx ^ dy)&0x80000000 ) + { + if ( (line->dy ^ dx) & 0x80000000 ) + return 1; // (left is negative) + return 0; + } + + left = FixedMul ( line->dy>>8, dx>>8 ); + right = FixedMul ( dy>>8 , line->dx>>8 ); + + if (right < left) + return 0; // front side + return 1; // back side +} + + + +// +// P_MakeDivline +// +void +P_MakeDivline +( line_t* li, + divline_t* dl ) +{ + dl->x = li->v1->x; + dl->y = li->v1->y; + dl->dx = li->dx; + dl->dy = li->dy; +} + + + +// +// P_InterceptVector +// Returns the fractional intercept point +// along the first divline. +// This is only called by the addthings +// and addlines traversers. +// +fixed_t +P_InterceptVector +( divline_t* v2, + divline_t* v1 ) +{ +#if 1 + fixed_t frac; + fixed_t num; + fixed_t den; + + den = FixedMul (v1->dy>>8,v2->dx) - FixedMul(v1->dx>>8,v2->dy); + + if (den == 0) + return 0; + // I_Error ("P_InterceptVector: parallel"); + + num = + FixedMul ( (v1->x - v2->x)>>8 ,v1->dy ) + +FixedMul ( (v2->y - v1->y)>>8, v1->dx ); + + frac = FixedDiv (num , den); + + return frac; +#else // UNUSED, float debug. + float frac; + float num; + float den; + float v1x; + float v1y; + float v1dx; + float v1dy; + float v2x; + float v2y; + float v2dx; + float v2dy; + + v1x = (float)v1->x/FRACUNIT; + v1y = (float)v1->y/FRACUNIT; + v1dx = (float)v1->dx/FRACUNIT; + v1dy = (float)v1->dy/FRACUNIT; + v2x = (float)v2->x/FRACUNIT; + v2y = (float)v2->y/FRACUNIT; + v2dx = (float)v2->dx/FRACUNIT; + v2dy = (float)v2->dy/FRACUNIT; + + den = v1dy*v2dx - v1dx*v2dy; + + if (den == 0) + return 0; // parallel + + num = (v1x - v2x)*v1dy + (v2y - v1y)*v1dx; + frac = num / den; + + return frac*FRACUNIT; +#endif +} + + +// +// P_LineOpening +// Sets opentop and openbottom to the window +// through a two sided line. +// OPTIMIZE: keep this precalculated +// +fixed_t opentop; +fixed_t openbottom; +fixed_t openrange; +fixed_t lowfloor; + + +void P_LineOpening (line_t* linedef) +{ + sector_t* front; + sector_t* back; + + if (linedef->sidenum[1] == -1) + { + // single sided line + openrange = 0; + return; + } + + front = linedef->frontsector; + back = linedef->backsector; + + if (front->ceilingheight < back->ceilingheight) + opentop = front->ceilingheight; + else + opentop = back->ceilingheight; + + if (front->floorheight > back->floorheight) + { + openbottom = front->floorheight; + lowfloor = back->floorheight; + } + else + { + openbottom = back->floorheight; + lowfloor = front->floorheight; + } + + openrange = opentop - openbottom; +} + + +// +// THING POSITION SETTING +// + + +// +// P_UnsetThingPosition +// Unlinks a thing from block map and sectors. +// On each position change, BLOCKMAP and other +// lookups maintaining lists ot things inside +// these structures need to be updated. +// +void P_UnsetThingPosition (mobj_t* thing) +{ + int blockx; + int blocky; + + if ( ! (thing->flags & MF_NOSECTOR) ) + { + // inert things don't need to be in blockmap? + // unlink from subsector + if (thing->snext) + thing->snext->sprev = thing->sprev; + + if (thing->sprev) + thing->sprev->snext = thing->snext; + else + thing->subsector->sector->thinglist = thing->snext; + } + + if ( ! (thing->flags & MF_NOBLOCKMAP) ) + { + // inert things don't need to be in blockmap + // unlink from block map + if (thing->bnext) + thing->bnext->bprev = thing->bprev; + + if (thing->bprev) + thing->bprev->bnext = thing->bnext; + else + { + blockx = (thing->x - bmaporgx)>>MAPBLOCKSHIFT; + blocky = (thing->y - bmaporgy)>>MAPBLOCKSHIFT; + + if (blockx>=0 && blockx < bmapwidth + && blocky>=0 && blocky bnext; + } + } + } +} + + +// +// P_SetThingPosition +// Links a thing into both a block and a subsector +// based on it's x y. +// Sets thing->subsector properly +// +void +P_SetThingPosition (mobj_t* thing) +{ + subsector_t* ss; + sector_t* sec; + int blockx; + int blocky; + mobj_t** link; + + + // link into subsector + ss = R_PointInSubsector (thing->x,thing->y); + thing->subsector = ss; + + if ( ! (thing->flags & MF_NOSECTOR) ) + { + // invisible things don't go into the sector links + sec = ss->sector; + + thing->sprev = NULL; + thing->snext = sec->thinglist; + + if (sec->thinglist) + sec->thinglist->sprev = thing; + + sec->thinglist = thing; + } + + + // link into blockmap + if ( ! (thing->flags & MF_NOBLOCKMAP) ) + { + // inert things don't need to be in blockmap + blockx = (thing->x - bmaporgx)>>MAPBLOCKSHIFT; + blocky = (thing->y - bmaporgy)>>MAPBLOCKSHIFT; + + if (blockx>=0 + && blockx < bmapwidth + && blocky>=0 + && blocky < bmapheight) + { + link = &blocklinks[blocky*bmapwidth+blockx]; + thing->bprev = NULL; + thing->bnext = *link; + if (*link) + (*link)->bprev = thing; + + *link = thing; + } + else + { + // thing is off the map + thing->bnext = thing->bprev = NULL; + } + } +} + + + +// +// BLOCK MAP ITERATORS +// For each line/thing in the given mapblock, +// call the passed PIT_* function. +// If the function returns false, +// exit with false without checking anything else. +// + + +// +// P_BlockLinesIterator +// The validcount flags are used to avoid checking lines +// that are marked in multiple mapblocks, +// so increment validcount before the first call +// to P_BlockLinesIterator, then make one or more calls +// to it. +// +boolean +P_BlockLinesIterator +( int x, + int y, + boolean(*func)(line_t*) ) +{ + int offset; + short* list; + line_t* ld; + + if (x<0 + || y<0 + || x>=bmapwidth + || y>=bmapheight) + { + return true; + } + + offset = y*bmapwidth+x; + + offset = *(blockmap+offset); + + for ( list = blockmaplump+offset ; *list != -1 ; list++) + { + ld = &lines[*list]; + + if (ld->validcount == validcount) + continue; // line has already been checked + + ld->validcount = validcount; + + if ( !func(ld) ) + return false; + } + return true; // everything was checked +} + + +// +// P_BlockThingsIterator +// +boolean +P_BlockThingsIterator +( int x, + int y, + boolean(*func)(mobj_t*) ) +{ + mobj_t* mobj; + + if ( x<0 + || y<0 + || x>=bmapwidth + || y>=bmapheight) + { + return true; + } + + + for (mobj = blocklinks[y*bmapwidth+x] ; + mobj ; + mobj = mobj->bnext) + { + if (!func( mobj ) ) + return false; + } + return true; +} + + + +// +// INTERCEPT ROUTINES +// +intercept_t intercepts[MAXINTERCEPTS]; +intercept_t* intercept_p; + +divline_t trace; +boolean earlyout; +int ptflags; + +static void InterceptsOverrun(int num_intercepts, intercept_t *intercept); + +// +// PIT_AddLineIntercepts. +// Looks for lines in the given block +// that intercept the given trace +// to add to the intercepts list. +// +// A line is crossed if its endpoints +// are on opposite sides of the trace. +// Returns true if earlyout and a solid line hit. +// +boolean +PIT_AddLineIntercepts (line_t* ld) +{ + int s1; + int s2; + fixed_t frac; + divline_t dl; + + // avoid precision problems with two routines + if ( trace.dx > FRACUNIT*16 + || trace.dy > FRACUNIT*16 + || trace.dx < -FRACUNIT*16 + || trace.dy < -FRACUNIT*16) + { + s1 = P_PointOnDivlineSide (ld->v1->x, ld->v1->y, &trace); + s2 = P_PointOnDivlineSide (ld->v2->x, ld->v2->y, &trace); + } + else + { + s1 = P_PointOnLineSide (trace.x, trace.y, ld); + s2 = P_PointOnLineSide (trace.x+trace.dx, trace.y+trace.dy, ld); + } + + if (s1 == s2) + return true; // line isn't crossed + + // hit the line + P_MakeDivline (ld, &dl); + frac = P_InterceptVector (&trace, &dl); + + if (frac < 0) + return true; // behind source + + // try to early out the check + if (earlyout + && frac < FRACUNIT + && !ld->backsector) + { + return false; // stop checking + } + + + intercept_p->frac = frac; + intercept_p->isaline = true; + intercept_p->d.line = ld; + InterceptsOverrun(intercept_p - intercepts, intercept_p); + intercept_p++; + + return true; // continue +} + + + +// +// PIT_AddThingIntercepts +// +boolean PIT_AddThingIntercepts (mobj_t* thing) +{ + fixed_t x1; + fixed_t y1; + fixed_t x2; + fixed_t y2; + + int s1; + int s2; + + boolean tracepositive; + + divline_t dl; + + fixed_t frac; + + tracepositive = (trace.dx ^ trace.dy)>0; + + // check a corner to corner crossection for hit + if (tracepositive) + { + x1 = thing->x - thing->radius; + y1 = thing->y + thing->radius; + + x2 = thing->x + thing->radius; + y2 = thing->y - thing->radius; + } + else + { + x1 = thing->x - thing->radius; + y1 = thing->y - thing->radius; + + x2 = thing->x + thing->radius; + y2 = thing->y + thing->radius; + } + + s1 = P_PointOnDivlineSide (x1, y1, &trace); + s2 = P_PointOnDivlineSide (x2, y2, &trace); + + if (s1 == s2) + return true; // line isn't crossed + + dl.x = x1; + dl.y = y1; + dl.dx = x2-x1; + dl.dy = y2-y1; + + frac = P_InterceptVector (&trace, &dl); + + if (frac < 0) + return true; // behind source + + intercept_p->frac = frac; + intercept_p->isaline = false; + intercept_p->d.thing = thing; + InterceptsOverrun(intercept_p - intercepts, intercept_p); + intercept_p++; + + return true; // keep going +} + + +// +// P_TraverseIntercepts +// Returns true if the traverser function returns true +// for all lines. +// +boolean +P_TraverseIntercepts +( traverser_t func, + fixed_t maxfrac ) +{ + int count; + fixed_t dist; + intercept_t* scan; + intercept_t* in; + + count = intercept_p - intercepts; + + in = 0; // shut up compiler warning + + while (count--) + { + dist = INT_MAX; + for (scan = intercepts ; scanfrac < dist) + { + dist = scan->frac; + in = scan; + } + } + + if (dist > maxfrac) + return true; // checked everything in range + +#if 0 // UNUSED + { + // don't check these yet, there may be others inserted + in = scan = intercepts; + for ( scan = intercepts ; scanfrac > maxfrac) + *in++ = *scan; + intercept_p = in; + return false; + } +#endif + + if ( !func (in) ) + return false; // don't bother going farther + + in->frac = INT_MAX; + } + + return true; // everything was traversed +} + +extern fixed_t bulletslope; + +// Intercepts Overrun emulation, from PrBoom-plus. +// Thanks to Andrey Budko (entryway) for researching this and his +// implementation of Intercepts Overrun emulation in PrBoom-plus +// which this is based on. + +typedef struct +{ + int len; + void *addr; + boolean int16_array; +} intercepts_overrun_t; + +// Intercepts memory table. This is where various variables are located +// in memory in Vanilla Doom. When the intercepts table overflows, we +// need to write to them. +// +// Almost all of the values to overwrite are 32-bit integers, except for +// playerstarts, which is effectively an array of 16-bit integers and +// must be treated differently. + +static intercepts_overrun_t intercepts_overrun[] = +{ + {4, NULL, false}, + {4, NULL, /* &earlyout, */ false}, + {4, NULL, /* &intercept_p, */ false}, + {4, &lowfloor, false}, + {4, &openbottom, false}, + {4, &opentop, false}, + {4, &openrange, false}, + {4, NULL, false}, + {120, NULL, /* &activeplats, */ false}, + {8, NULL, false}, + {4, &bulletslope, false}, + {4, NULL, /* &swingx, */ false}, + {4, NULL, /* &swingy, */ false}, + {4, NULL, false}, + {40, &playerstarts, true}, + {4, NULL, /* &blocklinks, */ false}, + {4, &bmapwidth, false}, + {4, NULL, /* &blockmap, */ false}, + {4, &bmaporgx, false}, + {4, &bmaporgy, false}, + {4, NULL, /* &blockmaplump, */ false}, + {4, &bmapheight, false}, + {0, NULL, false}, +}; + +// Overwrite a specific memory location with a value. + +static void InterceptsMemoryOverrun(int location, int value) +{ + int i, offset; + int index; + void *addr; + + i = 0; + offset = 0; + + // Search down the array until we find the right entry + + while (intercepts_overrun[i].len != 0) + { + if (offset + intercepts_overrun[i].len > location) + { + addr = intercepts_overrun[i].addr; + + // Write the value to the memory location. + // 16-bit and 32-bit values are written differently. + + if (addr != NULL) + { + if (intercepts_overrun[i].int16_array) + { + index = (location - offset) / 2; + ((short *) addr)[index] = value & 0xffff; + ((short *) addr)[index + 1] = (value >> 16) & 0xffff; + } + else + { + index = (location - offset) / 4; + ((int *) addr)[index] = value; + } + } + + break; + } + + offset += intercepts_overrun[i].len; + ++i; + } +} + +// Emulate overruns of the intercepts[] array. + +static void InterceptsOverrun(int num_intercepts, intercept_t *intercept) +{ + int location; + + if (num_intercepts <= MAXINTERCEPTS_ORIGINAL) + { + // No overrun + + return; + } + + location = (num_intercepts - MAXINTERCEPTS_ORIGINAL - 1) * 12; + + // Overwrite memory that is overwritten in Vanilla Doom, using + // the values from the intercept structure. + // + // Note: the ->d.{thing,line} member should really have its + // address translated into the correct address value for + // Vanilla Doom. + + InterceptsMemoryOverrun(location, intercept->frac); + InterceptsMemoryOverrun(location + 4, intercept->isaline); + InterceptsMemoryOverrun(location + 8, (int) intercept->d.thing); +} + + +// +// P_PathTraverse +// Traces a line from x1,y1 to x2,y2, +// calling the traverser function for each. +// Returns true if the traverser function returns true +// for all lines. +// +boolean +P_PathTraverse +( fixed_t x1, + fixed_t y1, + fixed_t x2, + fixed_t y2, + int flags, + boolean (*trav) (intercept_t *)) +{ + fixed_t xt1; + fixed_t yt1; + fixed_t xt2; + fixed_t yt2; + + fixed_t xstep; + fixed_t ystep; + + fixed_t partial; + + fixed_t xintercept; + fixed_t yintercept; + + int mapx; + int mapy; + + int mapxstep; + int mapystep; + + int count; + + earlyout = flags & PT_EARLYOUT; + + validcount++; + intercept_p = intercepts; + + if ( ((x1-bmaporgx)&(MAPBLOCKSIZE-1)) == 0) + x1 += FRACUNIT; // don't side exactly on a line + + if ( ((y1-bmaporgy)&(MAPBLOCKSIZE-1)) == 0) + y1 += FRACUNIT; // don't side exactly on a line + + trace.x = x1; + trace.y = y1; + trace.dx = x2 - x1; + trace.dy = y2 - y1; + + x1 -= bmaporgx; + y1 -= bmaporgy; + xt1 = x1>>MAPBLOCKSHIFT; + yt1 = y1>>MAPBLOCKSHIFT; + + x2 -= bmaporgx; + y2 -= bmaporgy; + xt2 = x2>>MAPBLOCKSHIFT; + yt2 = y2>>MAPBLOCKSHIFT; + + if (xt2 > xt1) + { + mapxstep = 1; + partial = FRACUNIT - ((x1>>MAPBTOFRAC)&(FRACUNIT-1)); + ystep = FixedDiv (y2-y1,abs(x2-x1)); + } + else if (xt2 < xt1) + { + mapxstep = -1; + partial = (x1>>MAPBTOFRAC)&(FRACUNIT-1); + ystep = FixedDiv (y2-y1,abs(x2-x1)); + } + else + { + mapxstep = 0; + partial = FRACUNIT; + ystep = 256*FRACUNIT; + } + + yintercept = (y1>>MAPBTOFRAC) + FixedMul (partial, ystep); + + + if (yt2 > yt1) + { + mapystep = 1; + partial = FRACUNIT - ((y1>>MAPBTOFRAC)&(FRACUNIT-1)); + xstep = FixedDiv (x2-x1,abs(y2-y1)); + } + else if (yt2 < yt1) + { + mapystep = -1; + partial = (y1>>MAPBTOFRAC)&(FRACUNIT-1); + xstep = FixedDiv (x2-x1,abs(y2-y1)); + } + else + { + mapystep = 0; + partial = FRACUNIT; + xstep = 256*FRACUNIT; + } + xintercept = (x1>>MAPBTOFRAC) + FixedMul (partial, xstep); + + // Step through map blocks. + // Count is present to prevent a round off error + // from skipping the break. + mapx = xt1; + mapy = yt1; + + for (count = 0 ; count < 64 ; count++) + { + if (flags & PT_ADDLINES) + { + if (!P_BlockLinesIterator (mapx, mapy,PIT_AddLineIntercepts)) + return false; // early out + } + + if (flags & PT_ADDTHINGS) + { + if (!P_BlockThingsIterator (mapx, mapy,PIT_AddThingIntercepts)) + return false; // early out + } + + if (mapx == xt2 + && mapy == yt2) + { + break; + } + + if ( (yintercept >> FRACBITS) == mapy) + { + yintercept += ystep; + mapx += mapxstep; + } + else if ( (xintercept >> FRACBITS) == mapx) + { + xintercept += xstep; + mapy += mapystep; + } + + } + // go through the sorted list + return P_TraverseIntercepts ( trav, FRACUNIT ); +} + + + diff --git a/firmware_p4/components/Applications/doom/p_mobj.c b/firmware_p4/components/Applications/doom/p_mobj.c new file mode 100644 index 000000000..a3b9c4322 --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_mobj.c @@ -0,0 +1,1049 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Moving object handling. Spawn functions. +// + +#include + +#include "i_system.h" +#include "z_zone.h" +#include "m_random.h" + +#include "doomdef.h" +#include "p_local.h" +#include "sounds.h" + +#include "st_stuff.h" +#include "hu_stuff.h" + +#include "s_sound.h" + +#include "doomstat.h" + + +void G_PlayerReborn (int player); +void P_SpawnMapThing (mapthing_t* mthing); + + +// +// P_SetMobjState +// Returns true if the mobj is still present. +// +int test; + +boolean +P_SetMobjState +( mobj_t* mobj, + statenum_t state ) +{ + state_t* st; + + do + { + if (state == S_NULL) + { + mobj->state = (state_t *) S_NULL; + P_RemoveMobj (mobj); + return false; + } + + st = &states[state]; + mobj->state = st; + mobj->tics = st->tics; + mobj->sprite = st->sprite; + mobj->frame = st->frame; + + // Modified handling. + // Call action functions when the state is set + if (st->action.acp1) + st->action.acp1(mobj); + + state = st->nextstate; + } while (!mobj->tics); + + return true; +} + + +// +// P_ExplodeMissile +// +void P_ExplodeMissile (mobj_t* mo) +{ + mo->momx = mo->momy = mo->momz = 0; + + P_SetMobjState (mo, mobjinfo[mo->type].deathstate); + + mo->tics -= P_Random()&3; + + if (mo->tics < 1) + mo->tics = 1; + + mo->flags &= ~MF_MISSILE; + + if (mo->info->deathsound) + S_StartSound (mo, mo->info->deathsound); +} + + +// +// P_XYMovement +// +#define STOPSPEED 0x1000 +#define FRICTION 0xe800 + +void P_XYMovement (mobj_t* mo) +{ + fixed_t ptryx; + fixed_t ptryy; + player_t* player; + fixed_t xmove; + fixed_t ymove; + + if (!mo->momx && !mo->momy) + { + if (mo->flags & MF_SKULLFLY) + { + // the skull slammed into something + mo->flags &= ~MF_SKULLFLY; + mo->momx = mo->momy = mo->momz = 0; + + P_SetMobjState (mo, mo->info->spawnstate); + } + return; + } + + player = mo->player; + + if (mo->momx > MAXMOVE) + mo->momx = MAXMOVE; + else if (mo->momx < -MAXMOVE) + mo->momx = -MAXMOVE; + + if (mo->momy > MAXMOVE) + mo->momy = MAXMOVE; + else if (mo->momy < -MAXMOVE) + mo->momy = -MAXMOVE; + + xmove = mo->momx; + ymove = mo->momy; + + do + { + if (xmove > MAXMOVE/2 || ymove > MAXMOVE/2) + { + ptryx = mo->x + xmove/2; + ptryy = mo->y + ymove/2; + xmove >>= 1; + ymove >>= 1; + } + else + { + ptryx = mo->x + xmove; + ptryy = mo->y + ymove; + xmove = ymove = 0; + } + + if (!P_TryMove (mo, ptryx, ptryy)) + { + // blocked move + if (mo->player) + { // try to slide along it + P_SlideMove (mo); + } + else if (mo->flags & MF_MISSILE) + { + // explode a missile + if (ceilingline && + ceilingline->backsector && + ceilingline->backsector->ceilingpic == skyflatnum) + { + // Hack to prevent missiles exploding + // against the sky. + // Does not handle sky floors. + P_RemoveMobj (mo); + return; + } + P_ExplodeMissile (mo); + } + else + mo->momx = mo->momy = 0; + } + } while (xmove || ymove); + + // slow down + if (player && player->cheats & CF_NOMOMENTUM) + { + // debug option for no sliding at all + mo->momx = mo->momy = 0; + return; + } + + if (mo->flags & (MF_MISSILE | MF_SKULLFLY) ) + return; // no friction for missiles ever + + if (mo->z > mo->floorz) + return; // no friction when airborne + + if (mo->flags & MF_CORPSE) + { + // do not stop sliding + // if halfway off a step with some momentum + if (mo->momx > FRACUNIT/4 + || mo->momx < -FRACUNIT/4 + || mo->momy > FRACUNIT/4 + || mo->momy < -FRACUNIT/4) + { + if (mo->floorz != mo->subsector->sector->floorheight) + return; + } + } + + if (mo->momx > -STOPSPEED + && mo->momx < STOPSPEED + && mo->momy > -STOPSPEED + && mo->momy < STOPSPEED + && (!player + || (player->cmd.forwardmove== 0 + && player->cmd.sidemove == 0 ) ) ) + { + // if in a walking frame, stop moving + if ( player&&(unsigned)((player->mo->state - states)- S_PLAY_RUN1) < 4) + P_SetMobjState (player->mo, S_PLAY); + + mo->momx = 0; + mo->momy = 0; + } + else + { + mo->momx = FixedMul (mo->momx, FRICTION); + mo->momy = FixedMul (mo->momy, FRICTION); + } +} + +// +// P_ZMovement +// +void P_ZMovement (mobj_t* mo) +{ + fixed_t dist; + fixed_t delta; + + // check for smooth step up + if (mo->player && mo->z < mo->floorz) + { + mo->player->viewheight -= mo->floorz-mo->z; + + mo->player->deltaviewheight + = (VIEWHEIGHT - mo->player->viewheight)>>3; + } + + // adjust height + mo->z += mo->momz; + + if ( mo->flags & MF_FLOAT + && mo->target) + { + // float down towards target if too close + if ( !(mo->flags & MF_SKULLFLY) + && !(mo->flags & MF_INFLOAT) ) + { + dist = P_AproxDistance (mo->x - mo->target->x, + mo->y - mo->target->y); + + delta =(mo->target->z + (mo->height>>1)) - mo->z; + + if (delta<0 && dist < -(delta*3) ) + mo->z -= FLOATSPEED; + else if (delta>0 && dist < (delta*3) ) + mo->z += FLOATSPEED; + } + + } + + // clip movement + if (mo->z <= mo->floorz) + { + // hit the floor + + // Note (id): + // somebody left this after the setting momz to 0, + // kinda useless there. + // + // cph - This was the a bug in the linuxdoom-1.10 source which + // caused it not to sync Doom 2 v1.9 demos. Someone + // added the above comment and moved up the following code. So + // demos would desync in close lost soul fights. + // Note that this only applies to original Doom 1 or Doom2 demos - not + // Final Doom and Ultimate Doom. So we test demo_compatibility *and* + // gamemission. (Note we assume that Doom1 is always Ult Doom, which + // seems to hold for most published demos.) + // + // fraggle - cph got the logic here slightly wrong. There are three + // versions of Doom 1.9: + // + // * The version used in registered doom 1.9 + doom2 - no bounce + // * The version used in ultimate doom - has bounce + // * The version used in final doom - has bounce + // + // So we need to check that this is either retail or commercial + // (but not doom2) + + int correct_lost_soul_bounce = gameversion >= exe_ultimate; + + if (correct_lost_soul_bounce && mo->flags & MF_SKULLFLY) + { + // the skull slammed into something + mo->momz = -mo->momz; + } + + if (mo->momz < 0) + { + if (mo->player + && mo->momz < -GRAVITY*8) + { + // Squat down. + // Decrease viewheight for a moment + // after hitting the ground (hard), + // and utter appropriate sound. + mo->player->deltaviewheight = mo->momz>>3; + S_StartSound (mo, sfx_oof); + } + mo->momz = 0; + } + mo->z = mo->floorz; + + + // cph 2001/05/26 - + // See lost soul bouncing comment above. We need this here for bug + // compatibility with original Doom2 v1.9 - if a soul is charging and + // hit by a raising floor this incorrectly reverses its Y momentum. + // + + if (!correct_lost_soul_bounce && mo->flags & MF_SKULLFLY) + mo->momz = -mo->momz; + + if ( (mo->flags & MF_MISSILE) + && !(mo->flags & MF_NOCLIP) ) + { + P_ExplodeMissile (mo); + return; + } + } + else if (! (mo->flags & MF_NOGRAVITY) ) + { + if (mo->momz == 0) + mo->momz = -GRAVITY*2; + else + mo->momz -= GRAVITY; + } + + if (mo->z + mo->height > mo->ceilingz) + { + // hit the ceiling + if (mo->momz > 0) + mo->momz = 0; + { + mo->z = mo->ceilingz - mo->height; + } + + if (mo->flags & MF_SKULLFLY) + { // the skull slammed into something + mo->momz = -mo->momz; + } + + if ( (mo->flags & MF_MISSILE) + && !(mo->flags & MF_NOCLIP) ) + { + P_ExplodeMissile (mo); + return; + } + } +} + + + +// +// P_NightmareRespawn +// +void +P_NightmareRespawn (mobj_t* mobj) +{ + fixed_t x; + fixed_t y; + fixed_t z; + subsector_t* ss; + mobj_t* mo; + mapthing_t* mthing; + + x = mobj->spawnpoint.x << FRACBITS; + y = mobj->spawnpoint.y << FRACBITS; + + // somthing is occupying it's position? + if (!P_CheckPosition (mobj, x, y) ) + return; // no respwan + + // spawn a teleport fog at old spot + // because of removal of the body? + mo = P_SpawnMobj (mobj->x, + mobj->y, + mobj->subsector->sector->floorheight , MT_TFOG); + // initiate teleport sound + S_StartSound (mo, sfx_telept); + + // spawn a teleport fog at the new spot + ss = R_PointInSubsector (x,y); + + mo = P_SpawnMobj (x, y, ss->sector->floorheight , MT_TFOG); + + S_StartSound (mo, sfx_telept); + + // spawn the new monster + mthing = &mobj->spawnpoint; + + // spawn it + if (mobj->info->flags & MF_SPAWNCEILING) + z = ONCEILINGZ; + else + z = ONFLOORZ; + + // inherit attributes from deceased one + mo = P_SpawnMobj (x,y,z, mobj->type); + mo->spawnpoint = mobj->spawnpoint; + mo->angle = ANG45 * (mthing->angle/45); + + if (mthing->options & MTF_AMBUSH) + mo->flags |= MF_AMBUSH; + + mo->reactiontime = 18; + + // remove the old monster, + P_RemoveMobj (mobj); +} + + +// +// P_MobjThinker +// +void P_MobjThinker (mobj_t* mobj) +{ + // momentum movement + if (mobj->momx + || mobj->momy + || (mobj->flags&MF_SKULLFLY) ) + { + P_XYMovement (mobj); + + // FIXME: decent NOP/NULL/Nil function pointer please. + if (mobj->thinker.function.acv == (actionf_v) (-1)) + return; // mobj was removed + } + if ( (mobj->z != mobj->floorz) + || mobj->momz ) + { + P_ZMovement (mobj); + + // FIXME: decent NOP/NULL/Nil function pointer please. + if (mobj->thinker.function.acv == (actionf_v) (-1)) + return; // mobj was removed + } + + + // cycle through states, + // calling action functions at transitions + if (mobj->tics != -1) + { + mobj->tics--; + + // you can cycle through multiple states in a tic + if (!mobj->tics) + if (!P_SetMobjState (mobj, mobj->state->nextstate) ) + return; // freed itself + } + else + { + // check for nightmare respawn + if (! (mobj->flags & MF_COUNTKILL) ) + return; + + if (!respawnmonsters) + return; + + mobj->movecount++; + + if (mobj->movecount < 12*TICRATE) + return; + + if ( leveltime&31 ) + return; + + if (P_Random () > 4) + return; + + P_NightmareRespawn (mobj); + } + +} + + +// +// P_SpawnMobj +// +mobj_t* +P_SpawnMobj +( fixed_t x, + fixed_t y, + fixed_t z, + mobjtype_t type ) +{ + mobj_t* mobj; + state_t* st; + mobjinfo_t* info; + + mobj = Z_Malloc (sizeof(*mobj), PU_LEVEL, NULL); + memset (mobj, 0, sizeof (*mobj)); + info = &mobjinfo[type]; + + mobj->type = type; + mobj->info = info; + mobj->x = x; + mobj->y = y; + mobj->radius = info->radius; + mobj->height = info->height; + mobj->flags = info->flags; + mobj->health = info->spawnhealth; + + if (gameskill != sk_nightmare) + mobj->reactiontime = info->reactiontime; + + mobj->lastlook = P_Random () % MAXPLAYERS; + // do not set the state with P_SetMobjState, + // because action routines can not be called yet + st = &states[info->spawnstate]; + + mobj->state = st; + mobj->tics = st->tics; + mobj->sprite = st->sprite; + mobj->frame = st->frame; + + // set subsector and/or block links + P_SetThingPosition (mobj); + + mobj->floorz = mobj->subsector->sector->floorheight; + mobj->ceilingz = mobj->subsector->sector->ceilingheight; + + if (z == ONFLOORZ) + mobj->z = mobj->floorz; + else if (z == ONCEILINGZ) + mobj->z = mobj->ceilingz - mobj->info->height; + else + mobj->z = z; + + mobj->thinker.function.acp1 = (actionf_p1)P_MobjThinker; + + P_AddThinker (&mobj->thinker); + + return mobj; +} + + +// +// P_RemoveMobj +// +mapthing_t itemrespawnque[ITEMQUESIZE]; +int itemrespawntime[ITEMQUESIZE]; +int iquehead; +int iquetail; + + +void P_RemoveMobj (mobj_t* mobj) +{ + if ((mobj->flags & MF_SPECIAL) + && !(mobj->flags & MF_DROPPED) + && (mobj->type != MT_INV) + && (mobj->type != MT_INS)) + { + itemrespawnque[iquehead] = mobj->spawnpoint; + itemrespawntime[iquehead] = leveltime; + iquehead = (iquehead+1)&(ITEMQUESIZE-1); + + // lose one off the end? + if (iquehead == iquetail) + iquetail = (iquetail+1)&(ITEMQUESIZE-1); + } + + // unlink from sector and block lists + P_UnsetThingPosition (mobj); + + // stop any playing sound + S_StopSound (mobj); + + // free block + P_RemoveThinker ((thinker_t*)mobj); +} + + + + +// +// P_RespawnSpecials +// +void P_RespawnSpecials (void) +{ + fixed_t x; + fixed_t y; + fixed_t z; + + subsector_t* ss; + mobj_t* mo; + mapthing_t* mthing; + + int i; + + // only respawn items in deathmatch + if (deathmatch != 2) + return; // + + // nothing left to respawn? + if (iquehead == iquetail) + return; + + // wait at least 30 seconds + if (leveltime - itemrespawntime[iquetail] < 30*TICRATE) + return; + + mthing = &itemrespawnque[iquetail]; + + x = mthing->x << FRACBITS; + y = mthing->y << FRACBITS; + + // spawn a teleport fog at the new spot + ss = R_PointInSubsector (x,y); + mo = P_SpawnMobj (x, y, ss->sector->floorheight , MT_IFOG); + S_StartSound (mo, sfx_itmbk); + + // find which type to spawn + for (i=0 ; i< NUMMOBJTYPES ; i++) + { + if (mthing->type == mobjinfo[i].doomednum) + break; + } + + // spawn it + if (mobjinfo[i].flags & MF_SPAWNCEILING) + z = ONCEILINGZ; + else + z = ONFLOORZ; + + mo = P_SpawnMobj (x,y,z, i); + mo->spawnpoint = *mthing; + mo->angle = ANG45 * (mthing->angle/45); + + // pull it from the que + iquetail = (iquetail+1)&(ITEMQUESIZE-1); +} + + + + +// +// P_SpawnPlayer +// Called when a player is spawned on the level. +// Most of the player structure stays unchanged +// between levels. +// +void P_SpawnPlayer (mapthing_t* mthing) +{ + player_t* p; + fixed_t x; + fixed_t y; + fixed_t z; + + mobj_t* mobj; + + int i; + + if (mthing->type == 0) + { + return; + } + + // not playing? + if (!playeringame[mthing->type-1]) + return; + + p = &players[mthing->type-1]; + + if (p->playerstate == PST_REBORN) + G_PlayerReborn (mthing->type-1); + + x = mthing->x << FRACBITS; + y = mthing->y << FRACBITS; + z = ONFLOORZ; + mobj = P_SpawnMobj (x,y,z, MT_PLAYER); + + // set color translations for player sprites + if (mthing->type > 1) + mobj->flags |= (mthing->type-1)<angle = ANG45 * (mthing->angle/45); + mobj->player = p; + mobj->health = p->health; + + p->mo = mobj; + p->playerstate = PST_LIVE; + p->refire = 0; + p->message = NULL; + p->damagecount = 0; + p->bonuscount = 0; + p->extralight = 0; + p->fixedcolormap = 0; + p->viewheight = VIEWHEIGHT; + + // setup gun psprite + P_SetupPsprites (p); + + // give all cards in death match mode + if (deathmatch) + for (i=0 ; icards[i] = true; + + if (mthing->type-1 == consoleplayer) + { + // wake up the status bar + ST_Start (); + // wake up the heads up text + HU_Start (); + } +} + + +// +// P_SpawnMapThing +// The fields of the mapthing should +// already be in host byte order. +// +void P_SpawnMapThing (mapthing_t* mthing) +{ + int i; + int bit; + mobj_t* mobj; + fixed_t x; + fixed_t y; + fixed_t z; + + // count deathmatch start positions + if (mthing->type == 11) + { + if (deathmatch_p < &deathmatchstarts[10]) + { + memcpy (deathmatch_p, mthing, sizeof(*mthing)); + deathmatch_p++; + } + return; + } + + if (mthing->type <= 0) + { + // Thing type 0 is actually "player -1 start". + // For some reason, Vanilla Doom accepts/ignores this. + + return; + } + + // check for players specially + if (mthing->type <= 4) + { + // save spots for respawning in network games + playerstarts[mthing->type-1] = *mthing; + if (!deathmatch) + P_SpawnPlayer (mthing); + + return; + } + + // check for apropriate skill level + if (!netgame && (mthing->options & 16) ) + return; + + if (gameskill == sk_baby) + bit = 1; + else if (gameskill == sk_nightmare) + bit = 4; + else + bit = 1<<(gameskill-1); + + if (!(mthing->options & bit) ) + return; + + // find which type to spawn + for (i=0 ; i< NUMMOBJTYPES ; i++) + if (mthing->type == mobjinfo[i].doomednum) + break; + + if (i==NUMMOBJTYPES) + I_Error ("P_SpawnMapThing: Unknown type %i at (%i, %i)", + mthing->type, + mthing->x, mthing->y); + + // don't spawn keycards and players in deathmatch + if (deathmatch && mobjinfo[i].flags & MF_NOTDMATCH) + return; + + // don't spawn any monsters if -nomonsters + if (nomonsters + && ( i == MT_SKULL + || (mobjinfo[i].flags & MF_COUNTKILL)) ) + { + return; + } + + // spawn it + x = mthing->x << FRACBITS; + y = mthing->y << FRACBITS; + + if (mobjinfo[i].flags & MF_SPAWNCEILING) + z = ONCEILINGZ; + else + z = ONFLOORZ; + + mobj = P_SpawnMobj (x,y,z, i); + mobj->spawnpoint = *mthing; + + if (mobj->tics > 0) + mobj->tics = 1 + (P_Random () % mobj->tics); + if (mobj->flags & MF_COUNTKILL) + totalkills++; + if (mobj->flags & MF_COUNTITEM) + totalitems++; + + mobj->angle = ANG45 * (mthing->angle/45); + if (mthing->options & MTF_AMBUSH) + mobj->flags |= MF_AMBUSH; +} + + + +// +// GAME SPAWN FUNCTIONS +// + + +// +// P_SpawnPuff +// +extern fixed_t attackrange; + +void +P_SpawnPuff +( fixed_t x, + fixed_t y, + fixed_t z ) +{ + mobj_t* th; + + z += ((P_Random()-P_Random())<<10); + + th = P_SpawnMobj (x,y,z, MT_PUFF); + th->momz = FRACUNIT; + th->tics -= P_Random()&3; + + if (th->tics < 1) + th->tics = 1; + + // don't make punches spark on the wall + if (attackrange == MELEERANGE) + P_SetMobjState (th, S_PUFF3); +} + + + +// +// P_SpawnBlood +// +void +P_SpawnBlood +( fixed_t x, + fixed_t y, + fixed_t z, + int damage ) +{ + mobj_t* th; + + z += ((P_Random()-P_Random())<<10); + th = P_SpawnMobj (x,y,z, MT_BLOOD); + th->momz = FRACUNIT*2; + th->tics -= P_Random()&3; + + if (th->tics < 1) + th->tics = 1; + + if (damage <= 12 && damage >= 9) + P_SetMobjState (th,S_BLOOD2); + else if (damage < 9) + P_SetMobjState (th,S_BLOOD3); +} + + + +// +// P_CheckMissileSpawn +// Moves the missile forward a bit +// and possibly explodes it right there. +// +void P_CheckMissileSpawn (mobj_t* th) +{ + th->tics -= P_Random()&3; + if (th->tics < 1) + th->tics = 1; + + // move a little forward so an angle can + // be computed if it immediately explodes + th->x += (th->momx>>1); + th->y += (th->momy>>1); + th->z += (th->momz>>1); + + if (!P_TryMove (th, th->x, th->y)) + P_ExplodeMissile (th); +} + +// Certain functions assume that a mobj_t pointer is non-NULL, +// causing a crash in some situations where it is NULL. Vanilla +// Doom did not crash because of the lack of proper memory +// protection. This function substitutes NULL pointers for +// pointers to a dummy mobj, to avoid a crash. + +mobj_t *P_SubstNullMobj(mobj_t *mobj) +{ + if (mobj == NULL) + { + static mobj_t dummy_mobj; + + dummy_mobj.x = 0; + dummy_mobj.y = 0; + dummy_mobj.z = 0; + dummy_mobj.flags = 0; + + mobj = &dummy_mobj; + } + + return mobj; +} + +// +// P_SpawnMissile +// +mobj_t* +P_SpawnMissile +( mobj_t* source, + mobj_t* dest, + mobjtype_t type ) +{ + mobj_t* th; + angle_t an; + int dist; + + th = P_SpawnMobj (source->x, + source->y, + source->z + 4*8*FRACUNIT, type); + + if (th->info->seesound) + S_StartSound (th, th->info->seesound); + + th->target = source; // where it came from + an = R_PointToAngle2 (source->x, source->y, dest->x, dest->y); + + // fuzzy player + if (dest->flags & MF_SHADOW) + an += (P_Random()-P_Random())<<20; + + th->angle = an; + an >>= ANGLETOFINESHIFT; + th->momx = FixedMul (th->info->speed, finecosine[an]); + th->momy = FixedMul (th->info->speed, finesine[an]); + + dist = P_AproxDistance (dest->x - source->x, dest->y - source->y); + dist = dist / th->info->speed; + + if (dist < 1) + dist = 1; + + th->momz = (dest->z - source->z) / dist; + P_CheckMissileSpawn (th); + + return th; +} + + +// +// P_SpawnPlayerMissile +// Tries to aim at a nearby monster +// +void +P_SpawnPlayerMissile +( mobj_t* source, + mobjtype_t type ) +{ + mobj_t* th; + angle_t an; + + fixed_t x; + fixed_t y; + fixed_t z; + fixed_t slope; + + // see which target is to be aimed at + an = source->angle; + slope = P_AimLineAttack (source, an, 16*64*FRACUNIT); + + if (!linetarget) + { + an += 1<<26; + slope = P_AimLineAttack (source, an, 16*64*FRACUNIT); + + if (!linetarget) + { + an -= 2<<26; + slope = P_AimLineAttack (source, an, 16*64*FRACUNIT); + } + + if (!linetarget) + { + an = source->angle; + slope = 0; + } + } + + x = source->x; + y = source->y; + z = source->z + 4*8*FRACUNIT; + + th = P_SpawnMobj (x,y,z, type); + + if (th->info->seesound) + S_StartSound (th, th->info->seesound); + + th->target = source; + th->angle = an; + th->momx = FixedMul( th->info->speed, + finecosine[an>>ANGLETOFINESHIFT]); + th->momy = FixedMul( th->info->speed, + finesine[an>>ANGLETOFINESHIFT]); + th->momz = FixedMul( th->info->speed, slope); + + P_CheckMissileSpawn (th); +} + diff --git a/firmware_p4/components/Applications/doom/p_mobj.h b/firmware_p4/components/Applications/doom/p_mobj.h new file mode 100644 index 000000000..90ed764b9 --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_mobj.h @@ -0,0 +1,284 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Map Objects, MObj, definition and handling. +// + + +#ifndef __P_MOBJ__ +#define __P_MOBJ__ + +// Basics. +#include "tables.h" +#include "m_fixed.h" + +// We need the thinker_t stuff. +#include "d_think.h" + +// We need the WAD data structure for Map things, +// from the THINGS lump. +#include "doomdata.h" + +// States are tied to finite states are +// tied to animation frames. +// Needs precompiled tables/data structures. +#include "info.h" + + + + + + +// +// NOTES: mobj_t +// +// mobj_ts are used to tell the refresh where to draw an image, +// tell the world simulation when objects are contacted, +// and tell the sound driver how to position a sound. +// +// The refresh uses the next and prev links to follow +// lists of things in sectors as they are being drawn. +// The sprite, frame, and angle elements determine which patch_t +// is used to draw the sprite if it is visible. +// The sprite and frame values are allmost allways set +// from state_t structures. +// The statescr.exe utility generates the states.h and states.c +// files that contain the sprite/frame numbers from the +// statescr.txt source file. +// The xyz origin point represents a point at the bottom middle +// of the sprite (between the feet of a biped). +// This is the default origin position for patch_ts grabbed +// with lumpy.exe. +// A walking creature will have its z equal to the floor +// it is standing on. +// +// The sound code uses the x,y, and subsector fields +// to do stereo positioning of any sound effited by the mobj_t. +// +// The play simulation uses the blocklinks, x,y,z, radius, height +// to determine when mobj_ts are touching each other, +// touching lines in the map, or hit by trace lines (gunshots, +// lines of sight, etc). +// The mobj_t->flags element has various bit flags +// used by the simulation. +// +// Every mobj_t is linked into a single sector +// based on its origin coordinates. +// The subsector_t is found with R_PointInSubsector(x,y), +// and the sector_t can be found with subsector->sector. +// The sector links are only used by the rendering code, +// the play simulation does not care about them at all. +// +// Any mobj_t that needs to be acted upon by something else +// in the play world (block movement, be shot, etc) will also +// need to be linked into the blockmap. +// If the thing has the MF_NOBLOCK flag set, it will not use +// the block links. It can still interact with other things, +// but only as the instigator (missiles will run into other +// things, but nothing can run into a missile). +// Each block in the grid is 128*128 units, and knows about +// every line_t that it contains a piece of, and every +// interactable mobj_t that has its origin contained. +// +// A valid mobj_t is a mobj_t that has the proper subsector_t +// filled in for its xy coordinates and is linked into the +// sector from which the subsector was made, or has the +// MF_NOSECTOR flag set (the subsector_t needs to be valid +// even if MF_NOSECTOR is set), and is linked into a blockmap +// block or has the MF_NOBLOCKMAP flag set. +// Links should only be modified by the P_[Un]SetThingPosition() +// functions. +// Do not change the MF_NO? flags while a thing is valid. +// +// Any questions? +// + +// +// Misc. mobj flags +// +typedef enum +{ + // Call P_SpecialThing when touched. + MF_SPECIAL = 1, + // Blocks. + MF_SOLID = 2, + // Can be hit. + MF_SHOOTABLE = 4, + // Don't use the sector links (invisible but touchable). + MF_NOSECTOR = 8, + // Don't use the blocklinks (inert but displayable) + MF_NOBLOCKMAP = 16, + + // Not to be activated by sound, deaf monster. + MF_AMBUSH = 32, + // Will try to attack right back. + MF_JUSTHIT = 64, + // Will take at least one step before attacking. + MF_JUSTATTACKED = 128, + // On level spawning (initial position), + // hang from ceiling instead of stand on floor. + MF_SPAWNCEILING = 256, + // Don't apply gravity (every tic), + // that is, object will float, keeping current height + // or changing it actively. + MF_NOGRAVITY = 512, + + // Movement flags. + // This allows jumps from high places. + MF_DROPOFF = 0x400, + // For players, will pick up items. + MF_PICKUP = 0x800, + // Player cheat. ??? + MF_NOCLIP = 0x1000, + // Player: keep info about sliding along walls. + MF_SLIDE = 0x2000, + // Allow moves to any height, no gravity. + // For active floaters, e.g. cacodemons, pain elementals. + MF_FLOAT = 0x4000, + // Don't cross lines + // ??? or look at heights on teleport. + MF_TELEPORT = 0x8000, + // Don't hit same species, explode on block. + // Player missiles as well as fireballs of various kinds. + MF_MISSILE = 0x10000, + // Dropped by a demon, not level spawned. + // E.g. ammo clips dropped by dying former humans. + MF_DROPPED = 0x20000, + // Use fuzzy draw (shadow demons or spectres), + // temporary player invisibility powerup. + MF_SHADOW = 0x40000, + // Flag: don't bleed when shot (use puff), + // barrels and shootable furniture shall not bleed. + MF_NOBLOOD = 0x80000, + // Don't stop moving halfway off a step, + // that is, have dead bodies slide down all the way. + MF_CORPSE = 0x100000, + // Floating to a height for a move, ??? + // don't auto float to target's height. + MF_INFLOAT = 0x200000, + + // On kill, count this enemy object + // towards intermission kill total. + // Happy gathering. + MF_COUNTKILL = 0x400000, + + // On picking up, count this item object + // towards intermission item total. + MF_COUNTITEM = 0x800000, + + // Special handling: skull in flight. + // Neither a cacodemon nor a missile. + MF_SKULLFLY = 0x1000000, + + // Don't spawn this object + // in death match mode (e.g. key cards). + MF_NOTDMATCH = 0x2000000, + + // Player sprites in multiplayer modes are modified + // using an internal color lookup table for re-indexing. + // If 0x4 0x8 or 0xc, + // use a translation table for player colormaps + MF_TRANSLATION = 0xc000000, + // Hmm ???. + MF_TRANSSHIFT = 26 + +} mobjflag_t; + + +// Map Object definition. +typedef struct mobj_s +{ + // List: thinker links. + thinker_t thinker; + + // Info for drawing: position. + fixed_t x; + fixed_t y; + fixed_t z; + + // More list: links in sector (if needed) + struct mobj_s* snext; + struct mobj_s* sprev; + + //More drawing info: to determine current sprite. + angle_t angle; // orientation + spritenum_t sprite; // used to find patch_t and flip value + int frame; // might be ORed with FF_FULLBRIGHT + + // Interaction info, by BLOCKMAP. + // Links in blocks (if needed). + struct mobj_s* bnext; + struct mobj_s* bprev; + + struct subsector_s* subsector; + + // The closest interval over all contacted Sectors. + fixed_t floorz; + fixed_t ceilingz; + + // For movement checking. + fixed_t radius; + fixed_t height; + + // Momentums, used to update position. + fixed_t momx; + fixed_t momy; + fixed_t momz; + + // If == validcount, already checked. + int validcount; + + mobjtype_t type; + mobjinfo_t* info; // &mobjinfo[mobj->type] + + int tics; // state tic counter + state_t* state; + int flags; + int health; + + // Movement direction, movement generation (zig-zagging). + int movedir; // 0-7 + int movecount; // when 0, select a new dir + + // Thing being chased/attacked (or NULL), + // also the originator for missiles. + struct mobj_s* target; + + // Reaction time: if non 0, don't attack yet. + // Used by player to freeze a bit after teleporting. + int reactiontime; + + // If >0, the target will be chased + // no matter what (even if shot) + int threshold; + + // Additional info record for player avatars only. + // Only valid if type == MT_PLAYER + struct player_s* player; + + // Player number last looked for. + int lastlook; + + // For nightmare respawn. + mapthing_t spawnpoint; + + // Thing being chased/attacked for tracers. + struct mobj_s* tracer; + +} mobj_t; + + + +#endif diff --git a/firmware_p4/components/Applications/doom/p_plats.c b/firmware_p4/components/Applications/doom/p_plats.c new file mode 100644 index 000000000..9e773d55c --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_plats.c @@ -0,0 +1,304 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Plats (i.e. elevator platforms) code, raising/lowering. +// + +#include + +#include "i_system.h" +#include "z_zone.h" +#include "m_random.h" + +#include "doomdef.h" +#include "p_local.h" + +#include "s_sound.h" + +// State. +#include "doomstat.h" +#include "r_state.h" + +// Data. +#include "sounds.h" + + +plat_t* activeplats[MAXPLATS]; + + + +// +// Move a plat up and down +// +void T_PlatRaise(plat_t* plat) +{ + result_e res; + + switch(plat->status) + { + case up: + res = T_MovePlane(plat->sector, + plat->speed, + plat->high, + plat->crush,0,1); + + if (plat->type == raiseAndChange + || plat->type == raiseToNearestAndChange) + { + if (!(leveltime&7)) + S_StartSound(&plat->sector->soundorg, sfx_stnmov); + } + + + if (res == crushed && (!plat->crush)) + { + plat->count = plat->wait; + plat->status = down; + S_StartSound(&plat->sector->soundorg, sfx_pstart); + } + else + { + if (res == pastdest) + { + plat->count = plat->wait; + plat->status = waiting; + S_StartSound(&plat->sector->soundorg, sfx_pstop); + + switch(plat->type) + { + case blazeDWUS: + case downWaitUpStay: + P_RemoveActivePlat(plat); + break; + + case raiseAndChange: + case raiseToNearestAndChange: + P_RemoveActivePlat(plat); + break; + + default: + break; + } + } + } + break; + + case down: + res = T_MovePlane(plat->sector,plat->speed,plat->low,false,0,-1); + + if (res == pastdest) + { + plat->count = plat->wait; + plat->status = waiting; + S_StartSound(&plat->sector->soundorg,sfx_pstop); + } + break; + + case waiting: + if (!--plat->count) + { + if (plat->sector->floorheight == plat->low) + plat->status = up; + else + plat->status = down; + S_StartSound(&plat->sector->soundorg,sfx_pstart); + } + case in_stasis: + break; + } +} + + +// +// Do Platforms +// "amount" is only used for SOME platforms. +// +int +EV_DoPlat +( line_t* line, + plattype_e type, + int amount ) +{ + plat_t* plat; + int secnum; + int rtn; + sector_t* sec; + + secnum = -1; + rtn = 0; + + + // Activate all plats that are in_stasis + switch(type) + { + case perpetualRaise: + P_ActivateInStasis(line->tag); + break; + + default: + break; + } + + while ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0) + { + sec = §ors[secnum]; + + if (sec->specialdata) + continue; + + // Find lowest & highest floors around sector + rtn = 1; + plat = Z_Malloc( sizeof(*plat), PU_LEVSPEC, 0); + P_AddThinker(&plat->thinker); + + plat->type = type; + plat->sector = sec; + plat->sector->specialdata = plat; + plat->thinker.function.acp1 = (actionf_p1) T_PlatRaise; + plat->crush = false; + plat->tag = line->tag; + + switch(type) + { + case raiseToNearestAndChange: + plat->speed = PLATSPEED/2; + sec->floorpic = sides[line->sidenum[0]].sector->floorpic; + plat->high = P_FindNextHighestFloor(sec,sec->floorheight); + plat->wait = 0; + plat->status = up; + // NO MORE DAMAGE, IF APPLICABLE + sec->special = 0; + + S_StartSound(&sec->soundorg,sfx_stnmov); + break; + + case raiseAndChange: + plat->speed = PLATSPEED/2; + sec->floorpic = sides[line->sidenum[0]].sector->floorpic; + plat->high = sec->floorheight + amount*FRACUNIT; + plat->wait = 0; + plat->status = up; + + S_StartSound(&sec->soundorg,sfx_stnmov); + break; + + case downWaitUpStay: + plat->speed = PLATSPEED * 4; + plat->low = P_FindLowestFloorSurrounding(sec); + + if (plat->low > sec->floorheight) + plat->low = sec->floorheight; + + plat->high = sec->floorheight; + plat->wait = TICRATE*PLATWAIT; + plat->status = down; + S_StartSound(&sec->soundorg,sfx_pstart); + break; + + case blazeDWUS: + plat->speed = PLATSPEED * 8; + plat->low = P_FindLowestFloorSurrounding(sec); + + if (plat->low > sec->floorheight) + plat->low = sec->floorheight; + + plat->high = sec->floorheight; + plat->wait = TICRATE*PLATWAIT; + plat->status = down; + S_StartSound(&sec->soundorg,sfx_pstart); + break; + + case perpetualRaise: + plat->speed = PLATSPEED; + plat->low = P_FindLowestFloorSurrounding(sec); + + if (plat->low > sec->floorheight) + plat->low = sec->floorheight; + + plat->high = P_FindHighestFloorSurrounding(sec); + + if (plat->high < sec->floorheight) + plat->high = sec->floorheight; + + plat->wait = TICRATE*PLATWAIT; + plat->status = P_Random()&1; + + S_StartSound(&sec->soundorg,sfx_pstart); + break; + } + P_AddActivePlat(plat); + } + return rtn; +} + + + +void P_ActivateInStasis(int tag) +{ + int i; + + for (i = 0;i < MAXPLATS;i++) + if (activeplats[i] + && (activeplats[i])->tag == tag + && (activeplats[i])->status == in_stasis) + { + (activeplats[i])->status = (activeplats[i])->oldstatus; + (activeplats[i])->thinker.function.acp1 + = (actionf_p1) T_PlatRaise; + } +} + +void EV_StopPlat(line_t* line) +{ + int j; + + for (j = 0;j < MAXPLATS;j++) + if (activeplats[j] + && ((activeplats[j])->status != in_stasis) + && ((activeplats[j])->tag == line->tag)) + { + (activeplats[j])->oldstatus = (activeplats[j])->status; + (activeplats[j])->status = in_stasis; + (activeplats[j])->thinker.function.acv = (actionf_v)NULL; + } +} + +void P_AddActivePlat(plat_t* plat) +{ + int i; + + for (i = 0;i < MAXPLATS;i++) + if (activeplats[i] == NULL) + { + activeplats[i] = plat; + return; + } + I_Error ("P_AddActivePlat: no more plats!"); +} + +void P_RemoveActivePlat(plat_t* plat) +{ + int i; + for (i = 0;i < MAXPLATS;i++) + if (plat == activeplats[i]) + { + (activeplats[i])->sector->specialdata = NULL; + P_RemoveThinker(&(activeplats[i])->thinker); + activeplats[i] = NULL; + + return; + } + I_Error ("P_RemoveActivePlat: can't find plat!"); +} diff --git a/firmware_p4/components/Applications/doom/p_pspr.c b/firmware_p4/components/Applications/doom/p_pspr.c new file mode 100644 index 000000000..e4774c702 --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_pspr.c @@ -0,0 +1,888 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Weapon sprite animation, weapon objects. +// Action functions for weapons. +// + + +#include "doomdef.h" +#include "d_event.h" + +#include "deh_misc.h" + +#include "m_random.h" +#include "p_local.h" +#include "s_sound.h" + +// State. +#include "doomstat.h" + +// Data. +#include "sounds.h" + +#include "p_pspr.h" + +#define LOWERSPEED FRACUNIT*6 +#define RAISESPEED FRACUNIT*6 + +#define WEAPONBOTTOM 128*FRACUNIT +#define WEAPONTOP 32*FRACUNIT + + + +// +// P_SetPsprite +// +void +P_SetPsprite +( player_t* player, + int position, + statenum_t stnum ) +{ + pspdef_t* psp; + state_t* state; + + psp = &player->psprites[position]; + + do + { + if (!stnum) + { + // object removed itself + psp->state = NULL; + break; + } + + state = &states[stnum]; + psp->state = state; + psp->tics = state->tics; // could be 0 + + if (state->misc1) + { + // coordinate set + psp->sx = state->misc1 << FRACBITS; + psp->sy = state->misc2 << FRACBITS; + } + + // Call action routine. + // Modified handling. + if (state->action.acp2) + { + state->action.acp2(player, psp); + if (!psp->state) + break; + } + + stnum = psp->state->nextstate; + + } while (!psp->tics); + // an initial state of 0 could cycle through +} + + + +// +// P_CalcSwing +// +fixed_t swingx; +fixed_t swingy; + +void P_CalcSwing (player_t* player) +{ + fixed_t swing; + int angle; + + // OPTIMIZE: tablify this. + // A LUT would allow for different modes, + // and add flexibility. + + swing = player->bob; + + angle = (FINEANGLES/70*leveltime)&FINEMASK; + swingx = FixedMul ( swing, finesine[angle]); + + angle = (FINEANGLES/70*leveltime+FINEANGLES/2)&FINEMASK; + swingy = -FixedMul ( swingx, finesine[angle]); +} + + + +// +// P_BringUpWeapon +// Starts bringing the pending weapon up +// from the bottom of the screen. +// Uses player +// +void P_BringUpWeapon (player_t* player) +{ + statenum_t newstate; + + if (player->pendingweapon == wp_nochange) + player->pendingweapon = player->readyweapon; + + if (player->pendingweapon == wp_chainsaw) + S_StartSound (player->mo, sfx_sawup); + + newstate = weaponinfo[player->pendingweapon].upstate; + + player->pendingweapon = wp_nochange; + player->psprites[ps_weapon].sy = WEAPONBOTTOM; + + P_SetPsprite (player, ps_weapon, newstate); +} + +// +// P_CheckAmmo +// Returns true if there is enough ammo to shoot. +// If not, selects the next weapon to use. +// +boolean P_CheckAmmo (player_t* player) +{ + ammotype_t ammo; + int count; + + ammo = weaponinfo[player->readyweapon].ammo; + + // Minimal amount for one shot varies. + if (player->readyweapon == wp_bfg) + count = deh_bfg_cells_per_shot; + else if (player->readyweapon == wp_supershotgun) + count = 2; // Double barrel. + else + count = 1; // Regular. + + // Some do not need ammunition anyway. + // Return if current ammunition sufficient. + if (ammo == am_noammo || player->ammo[ammo] >= count) + return true; + + // Out of ammo, pick a weapon to change to. + // Preferences are set here. + do + { + if (player->weaponowned[wp_plasma] + && player->ammo[am_cell] + && (gamemode != shareware) ) + { + player->pendingweapon = wp_plasma; + } + else if (player->weaponowned[wp_supershotgun] + && player->ammo[am_shell]>2 + && (gamemode == commercial) ) + { + player->pendingweapon = wp_supershotgun; + } + else if (player->weaponowned[wp_chaingun] + && player->ammo[am_clip]) + { + player->pendingweapon = wp_chaingun; + } + else if (player->weaponowned[wp_shotgun] + && player->ammo[am_shell]) + { + player->pendingweapon = wp_shotgun; + } + else if (player->ammo[am_clip]) + { + player->pendingweapon = wp_pistol; + } + else if (player->weaponowned[wp_chainsaw]) + { + player->pendingweapon = wp_chainsaw; + } + else if (player->weaponowned[wp_missile] + && player->ammo[am_misl]) + { + player->pendingweapon = wp_missile; + } + else if (player->weaponowned[wp_bfg] + && player->ammo[am_cell]>40 + && (gamemode != shareware) ) + { + player->pendingweapon = wp_bfg; + } + else + { + // If everything fails. + player->pendingweapon = wp_fist; + } + + } while (player->pendingweapon == wp_nochange); + + // Now set appropriate weapon overlay. + P_SetPsprite (player, + ps_weapon, + weaponinfo[player->readyweapon].downstate); + + return false; +} + + +// +// P_FireWeapon. +// +void P_FireWeapon (player_t* player) +{ + statenum_t newstate; + + if (!P_CheckAmmo (player)) + return; + + P_SetMobjState (player->mo, S_PLAY_ATK1); + newstate = weaponinfo[player->readyweapon].atkstate; + P_SetPsprite (player, ps_weapon, newstate); + P_NoiseAlert (player->mo, player->mo); +} + + + +// +// P_DropWeapon +// Player died, so put the weapon away. +// +void P_DropWeapon (player_t* player) +{ + P_SetPsprite (player, + ps_weapon, + weaponinfo[player->readyweapon].downstate); +} + + + +// +// A_WeaponReady +// The player can fire the weapon +// or change to another weapon at this time. +// Follows after getting weapon up, +// or after previous attack/fire sequence. +// +void +A_WeaponReady +( player_t* player, + pspdef_t* psp ) +{ + statenum_t newstate; + int angle; + + // get out of attack state + if (player->mo->state == &states[S_PLAY_ATK1] + || player->mo->state == &states[S_PLAY_ATK2] ) + { + P_SetMobjState (player->mo, S_PLAY); + } + + if (player->readyweapon == wp_chainsaw + && psp->state == &states[S_SAW]) + { + S_StartSound (player->mo, sfx_sawidl); + } + + // check for change + // if player is dead, put the weapon away + if (player->pendingweapon != wp_nochange || !player->health) + { + // change weapon + // (pending weapon should allready be validated) + newstate = weaponinfo[player->readyweapon].downstate; + P_SetPsprite (player, ps_weapon, newstate); + return; + } + + // check for fire + // the missile launcher and bfg do not auto fire + if (player->cmd.buttons & BT_ATTACK) + { + if ( !player->attackdown + || (player->readyweapon != wp_missile + && player->readyweapon != wp_bfg) ) + { + player->attackdown = true; + P_FireWeapon (player); + return; + } + } + else + player->attackdown = false; + + // bob the weapon based on movement speed + angle = (128*leveltime)&FINEMASK; + psp->sx = FRACUNIT + FixedMul (player->bob, finecosine[angle]); + angle &= FINEANGLES/2-1; + psp->sy = WEAPONTOP + FixedMul (player->bob, finesine[angle]); +} + + + +// +// A_ReFire +// The player can re-fire the weapon +// without lowering it entirely. +// +void A_ReFire +( player_t* player, + pspdef_t* psp ) +{ + + // check for fire + // (if a weaponchange is pending, let it go through instead) + if ( (player->cmd.buttons & BT_ATTACK) + && player->pendingweapon == wp_nochange + && player->health) + { + player->refire++; + P_FireWeapon (player); + } + else + { + player->refire = 0; + P_CheckAmmo (player); + } +} + + +void +A_CheckReload +( player_t* player, + pspdef_t* psp ) +{ + P_CheckAmmo (player); +#if 0 + if (player->ammo[am_shell]<2) + P_SetPsprite (player, ps_weapon, S_DSNR1); +#endif +} + + + +// +// A_Lower +// Lowers current weapon, +// and changes weapon at bottom. +// +void +A_Lower +( player_t* player, + pspdef_t* psp ) +{ + psp->sy += LOWERSPEED; + + // Is already down. + if (psp->sy < WEAPONBOTTOM ) + return; + + // Player is dead. + if (player->playerstate == PST_DEAD) + { + psp->sy = WEAPONBOTTOM; + + // don't bring weapon back up + return; + } + + // The old weapon has been lowered off the screen, + // so change the weapon and start raising it + if (!player->health) + { + // Player is dead, so keep the weapon off screen. + P_SetPsprite (player, ps_weapon, S_NULL); + return; + } + + player->readyweapon = player->pendingweapon; + + P_BringUpWeapon (player); +} + + +// +// A_Raise +// +void +A_Raise +( player_t* player, + pspdef_t* psp ) +{ + statenum_t newstate; + + psp->sy -= RAISESPEED; + + if (psp->sy > WEAPONTOP ) + return; + + psp->sy = WEAPONTOP; + + // The weapon has been raised all the way, + // so change to the ready state. + newstate = weaponinfo[player->readyweapon].readystate; + + P_SetPsprite (player, ps_weapon, newstate); +} + + + +// +// A_GunFlash +// +void +A_GunFlash +( player_t* player, + pspdef_t* psp ) +{ + P_SetMobjState (player->mo, S_PLAY_ATK2); + P_SetPsprite (player,ps_flash,weaponinfo[player->readyweapon].flashstate); +} + + + +// +// WEAPON ATTACKS +// + + +// +// A_Punch +// +void +A_Punch +( player_t* player, + pspdef_t* psp ) +{ + angle_t angle; + int damage; + int slope; + + damage = (P_Random ()%10+1)<<1; + + if (player->powers[pw_strength]) + damage *= 10; + + angle = player->mo->angle; + angle += (P_Random()-P_Random())<<18; + slope = P_AimLineAttack (player->mo, angle, MELEERANGE); + P_LineAttack (player->mo, angle, MELEERANGE, slope, damage); + + // turn to face target + if (linetarget) + { + S_StartSound (player->mo, sfx_punch); + player->mo->angle = R_PointToAngle2 (player->mo->x, + player->mo->y, + linetarget->x, + linetarget->y); + } +} + + +// +// A_Saw +// +void +A_Saw +( player_t* player, + pspdef_t* psp ) +{ + angle_t angle; + int damage; + int slope; + + damage = 2*(P_Random ()%10+1); + angle = player->mo->angle; + angle += (P_Random()-P_Random())<<18; + + // use meleerange + 1 se the puff doesn't skip the flash + slope = P_AimLineAttack (player->mo, angle, MELEERANGE+1); + P_LineAttack (player->mo, angle, MELEERANGE+1, slope, damage); + + if (!linetarget) + { + S_StartSound (player->mo, sfx_sawful); + return; + } + S_StartSound (player->mo, sfx_sawhit); + + // turn to face target + angle = R_PointToAngle2 (player->mo->x, player->mo->y, + linetarget->x, linetarget->y); + if (angle - player->mo->angle > ANG180) + { + if ((signed int) (angle - player->mo->angle) < -ANG90/20) + player->mo->angle = angle + ANG90/21; + else + player->mo->angle -= ANG90/20; + } + else + { + if (angle - player->mo->angle > ANG90/20) + player->mo->angle = angle - ANG90/21; + else + player->mo->angle += ANG90/20; + } + player->mo->flags |= MF_JUSTATTACKED; +} + +// Doom does not check the bounds of the ammo array. As a result, +// it is possible to use an ammo type > 4 that overflows into the +// maxammo array and affects that instead. Through dehacked, for +// example, it is possible to make a weapon that decreases the max +// number of ammo for another weapon. Emulate this. + +static void DecreaseAmmo(player_t *player, int ammonum, int amount) +{ + if (ammonum < NUMAMMO) + { + player->ammo[ammonum] -= amount; + } + else + { + player->maxammo[ammonum - NUMAMMO] -= amount; + } +} + + +// +// A_FireMissile +// +void +A_FireMissile +( player_t* player, + pspdef_t* psp ) +{ + DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, 1); + P_SpawnPlayerMissile (player->mo, MT_ROCKET); +} + + +// +// A_FireBFG +// +void +A_FireBFG +( player_t* player, + pspdef_t* psp ) +{ + DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, + deh_bfg_cells_per_shot); + P_SpawnPlayerMissile (player->mo, MT_BFG); +} + + + +// +// A_FirePlasma +// +void +A_FirePlasma +( player_t* player, + pspdef_t* psp ) +{ + DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, 1); + + P_SetPsprite (player, + ps_flash, + weaponinfo[player->readyweapon].flashstate+(P_Random ()&1) ); + + P_SpawnPlayerMissile (player->mo, MT_PLASMA); +} + + + +// +// P_BulletSlope +// Sets a slope so a near miss is at aproximately +// the height of the intended target +// +fixed_t bulletslope; + + +void P_BulletSlope (mobj_t* mo) +{ + angle_t an; + + // see which target is to be aimed at + an = mo->angle; + bulletslope = P_AimLineAttack (mo, an, 16*64*FRACUNIT); + + if (!linetarget) + { + an += 1<<26; + bulletslope = P_AimLineAttack (mo, an, 16*64*FRACUNIT); + if (!linetarget) + { + an -= 2<<26; + bulletslope = P_AimLineAttack (mo, an, 16*64*FRACUNIT); + } + } +} + + +// +// P_GunShot +// +void +P_GunShot +( mobj_t* mo, + boolean accurate ) +{ + angle_t angle; + int damage; + + damage = 5*(P_Random ()%3+1); + angle = mo->angle; + + if (!accurate) + angle += (P_Random()-P_Random())<<18; + + P_LineAttack (mo, angle, MISSILERANGE, bulletslope, damage); +} + + +// +// A_FirePistol +// +void +A_FirePistol +( player_t* player, + pspdef_t* psp ) +{ + S_StartSound (player->mo, sfx_pistol); + + P_SetMobjState (player->mo, S_PLAY_ATK2); + DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, 1); + + P_SetPsprite (player, + ps_flash, + weaponinfo[player->readyweapon].flashstate); + + P_BulletSlope (player->mo); + P_GunShot (player->mo, !player->refire); +} + + +// +// A_FireShotgun +// +void +A_FireShotgun +( player_t* player, + pspdef_t* psp ) +{ + int i; + + S_StartSound (player->mo, sfx_shotgn); + P_SetMobjState (player->mo, S_PLAY_ATK2); + + DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, 1); + + P_SetPsprite (player, + ps_flash, + weaponinfo[player->readyweapon].flashstate); + + P_BulletSlope (player->mo); + + for (i=0 ; i<7 ; i++) + P_GunShot (player->mo, false); +} + + + +// +// A_FireShotgun2 +// +void +A_FireShotgun2 +( player_t* player, + pspdef_t* psp ) +{ + int i; + angle_t angle; + int damage; + + + S_StartSound (player->mo, sfx_dshtgn); + P_SetMobjState (player->mo, S_PLAY_ATK2); + + DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, 2); + + P_SetPsprite (player, + ps_flash, + weaponinfo[player->readyweapon].flashstate); + + P_BulletSlope (player->mo); + + for (i=0 ; i<20 ; i++) + { + damage = 5*(P_Random ()%3+1); + angle = player->mo->angle; + angle += (P_Random()-P_Random())<<19; + P_LineAttack (player->mo, + angle, + MISSILERANGE, + bulletslope + ((P_Random()-P_Random())<<5), damage); + } +} + + +// +// A_FireCGun +// +void +A_FireCGun +( player_t* player, + pspdef_t* psp ) +{ + S_StartSound (player->mo, sfx_pistol); + + if (!player->ammo[weaponinfo[player->readyweapon].ammo]) + return; + + P_SetMobjState (player->mo, S_PLAY_ATK2); + DecreaseAmmo(player, weaponinfo[player->readyweapon].ammo, 1); + + P_SetPsprite (player, + ps_flash, + weaponinfo[player->readyweapon].flashstate + + psp->state + - &states[S_CHAIN1] ); + + P_BulletSlope (player->mo); + + P_GunShot (player->mo, !player->refire); +} + + + +// +// ? +// +void A_Light0 (player_t *player, pspdef_t *psp) +{ + player->extralight = 0; +} + +void A_Light1 (player_t *player, pspdef_t *psp) +{ + player->extralight = 1; +} + +void A_Light2 (player_t *player, pspdef_t *psp) +{ + player->extralight = 2; +} + + +// +// A_BFGSpray +// Spawn a BFG explosion on every monster in view +// +void A_BFGSpray (mobj_t* mo) +{ + int i; + int j; + int damage; + angle_t an; + + // offset angles from its attack angle + for (i=0 ; i<40 ; i++) + { + an = mo->angle - ANG90/2 + ANG90/40*i; + + // mo->target is the originator (player) + // of the missile + P_AimLineAttack (mo->target, an, 16*64*FRACUNIT); + + if (!linetarget) + continue; + + P_SpawnMobj (linetarget->x, + linetarget->y, + linetarget->z + (linetarget->height>>2), + MT_EXTRABFG); + + damage = 0; + for (j=0;j<15;j++) + damage += (P_Random()&7) + 1; + + P_DamageMobj (linetarget, mo->target,mo->target, damage); + } +} + + +// +// A_BFGsound +// +void +A_BFGsound +( player_t* player, + pspdef_t* psp ) +{ + S_StartSound (player->mo, sfx_bfg); +} + + + +// +// P_SetupPsprites +// Called at start of level for each player. +// +void P_SetupPsprites (player_t* player) +{ + int i; + + // remove all psprites + for (i=0 ; ipsprites[i].state = NULL; + + // spawn the gun + player->pendingweapon = player->readyweapon; + P_BringUpWeapon (player); +} + + + + +// +// P_MovePsprites +// Called every tic by player thinking routine. +// +void P_MovePsprites (player_t* player) +{ + int i; + pspdef_t* psp; + state_t* state; + + psp = &player->psprites[0]; + for (i=0 ; istate) ) + { + // drop tic count and possibly change state + + // a -1 tic count never changes + if (psp->tics != -1) + { + psp->tics--; + if (!psp->tics) + P_SetPsprite (player, i, psp->state->nextstate); + } + } + } + + player->psprites[ps_flash].sx = player->psprites[ps_weapon].sx; + player->psprites[ps_flash].sy = player->psprites[ps_weapon].sy; +} + + diff --git a/firmware_p4/components/Applications/doom/p_pspr.h b/firmware_p4/components/Applications/doom/p_pspr.h new file mode 100644 index 000000000..f98fe3533 --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_pspr.h @@ -0,0 +1,71 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Sprite animation. +// + + +#ifndef __P_PSPR__ +#define __P_PSPR__ + +// Basic data types. +// Needs fixed point, and BAM angles. +#include "m_fixed.h" +#include "tables.h" + + +// +// Needs to include the precompiled +// sprite animation tables. +// Header generated by multigen utility. +// This includes all the data for thing animation, +// i.e. the Thing Atrributes table +// and the Frame Sequence table. +#include "info.h" + + + +// +// Frame flags: +// handles maximum brightness (torches, muzzle flare, light sources) +// +#define FF_FULLBRIGHT 0x8000 // flag in thing->frame +#define FF_FRAMEMASK 0x7fff + + + +// +// Overlay psprites are scaled shapes +// drawn directly on the view screen, +// coordinates are given for a 320*200 view screen. +// +typedef enum +{ + ps_weapon, + ps_flash, + NUMPSPRITES + +} psprnum_t; + +typedef struct +{ + state_t* state; // a NULL state means not active + int tics; + fixed_t sx; + fixed_t sy; + +} pspdef_t; + +#endif diff --git a/firmware_p4/components/Applications/doom/p_saveg.c b/firmware_p4/components/Applications/doom/p_saveg.c new file mode 100644 index 000000000..5cb81967a --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_saveg.c @@ -0,0 +1,1891 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Archiving: SaveGame I/O. +// + + +#include +#include + +#include "dstrings.h" +#include "deh_main.h" +#include "i_system.h" +#include "z_zone.h" +#include "p_local.h" +#include "p_saveg.h" + +// State. +#include "doomstat.h" +#include "g_game.h" +#include "m_misc.h" +#include "r_state.h" + +#define SAVEGAME_EOF 0x1d +#define VERSIONSIZE 16 + +FILE *save_stream; +int savegamelength; +boolean savegame_error; + +// Get the filename of a temporary file to write the savegame to. After +// the file has been successfully saved, it will be renamed to the +// real file. + +char *P_TempSaveGameFile(void) +{ + static char *filename = NULL; + + if (filename == NULL) + { + filename = M_StringJoin(savegamedir, "temp.dsg", NULL); + } + + return filename; +} + +// Get the filename of the save game file to use for the specified slot. + +char *P_SaveGameFile(int slot) +{ + static char *filename = NULL; + static size_t filename_size = 0; + char basename[32]; + + if (filename == NULL) + { + filename_size = strlen(savegamedir) + 32; + filename = malloc(filename_size); + } + + DEH_snprintf(basename, 32, SAVEGAMENAME "%d.dsg", slot); + M_snprintf(filename, filename_size, "%s%s", savegamedir, basename); + + return filename; +} + +// Endian-safe integer read/write functions + +static byte saveg_read8(void) +{ + byte result; + + if (fread(&result, 1, 1, save_stream) < 1) + { + if (!savegame_error) + { + fprintf(stderr, "saveg_read8: Unexpected end of file while " + "reading save game\n"); + + savegame_error = true; + } + } + + return result; +} + +static void saveg_write8(byte value) +{ + if (fwrite(&value, 1, 1, save_stream) < 1) + { + if (!savegame_error) + { + fprintf(stderr, "saveg_write8: Error while writing save game\n"); + + savegame_error = true; + } + } +} + +static short saveg_read16(void) +{ + int result; + + result = saveg_read8(); + result |= saveg_read8() << 8; + + return result; +} + +static void saveg_write16(short value) +{ + saveg_write8(value & 0xff); + saveg_write8((value >> 8) & 0xff); +} + +static int saveg_read32(void) +{ + int result; + + result = saveg_read8(); + result |= saveg_read8() << 8; + result |= saveg_read8() << 16; + result |= saveg_read8() << 24; + + return result; +} + +static void saveg_write32(int value) +{ + saveg_write8(value & 0xff); + saveg_write8((value >> 8) & 0xff); + saveg_write8((value >> 16) & 0xff); + saveg_write8((value >> 24) & 0xff); +} + +// Pad to 4-byte boundaries + +static void saveg_read_pad(void) +{ + unsigned long pos; + int padding; + int i; + + pos = ftell(save_stream); + + padding = (4 - (pos & 3)) & 3; + + for (i=0; ix = saveg_read16(); + + // short y; + str->y = saveg_read16(); + + // short angle; + str->angle = saveg_read16(); + + // short type; + str->type = saveg_read16(); + + // short options; + str->options = saveg_read16(); +} + +static void saveg_write_mapthing_t(mapthing_t *str) +{ + // short x; + saveg_write16(str->x); + + // short y; + saveg_write16(str->y); + + // short angle; + saveg_write16(str->angle); + + // short type; + saveg_write16(str->type); + + // short options; + saveg_write16(str->options); +} + +// +// actionf_t +// + +static void saveg_read_actionf_t(actionf_t *str) +{ + // actionf_p1 acp1; + str->acp1 = saveg_readp(); +} + +static void saveg_write_actionf_t(actionf_t *str) +{ + // actionf_p1 acp1; + saveg_writep(str->acp1); +} + +// +// think_t +// +// This is just an actionf_t. +// + +#define saveg_read_think_t saveg_read_actionf_t +#define saveg_write_think_t saveg_write_actionf_t + +// +// thinker_t +// + +static void saveg_read_thinker_t(thinker_t *str) +{ + // struct thinker_s* prev; + str->prev = saveg_readp(); + + // struct thinker_s* next; + str->next = saveg_readp(); + + // think_t function; + saveg_read_think_t(&str->function); +} + +static void saveg_write_thinker_t(thinker_t *str) +{ + // struct thinker_s* prev; + saveg_writep(str->prev); + + // struct thinker_s* next; + saveg_writep(str->next); + + // think_t function; + saveg_write_think_t(&str->function); +} + +// +// mobj_t +// + +static void saveg_read_mobj_t(mobj_t *str) +{ + int pl; + + // thinker_t thinker; + saveg_read_thinker_t(&str->thinker); + + // fixed_t x; + str->x = saveg_read32(); + + // fixed_t y; + str->y = saveg_read32(); + + // fixed_t z; + str->z = saveg_read32(); + + // struct mobj_s* snext; + str->snext = saveg_readp(); + + // struct mobj_s* sprev; + str->sprev = saveg_readp(); + + // angle_t angle; + str->angle = saveg_read32(); + + // spritenum_t sprite; + str->sprite = saveg_read_enum(); + + // int frame; + str->frame = saveg_read32(); + + // struct mobj_s* bnext; + str->bnext = saveg_readp(); + + // struct mobj_s* bprev; + str->bprev = saveg_readp(); + + // struct subsector_s* subsector; + str->subsector = saveg_readp(); + + // fixed_t floorz; + str->floorz = saveg_read32(); + + // fixed_t ceilingz; + str->ceilingz = saveg_read32(); + + // fixed_t radius; + str->radius = saveg_read32(); + + // fixed_t height; + str->height = saveg_read32(); + + // fixed_t momx; + str->momx = saveg_read32(); + + // fixed_t momy; + str->momy = saveg_read32(); + + // fixed_t momz; + str->momz = saveg_read32(); + + // int validcount; + str->validcount = saveg_read32(); + + // mobjtype_t type; + str->type = saveg_read_enum(); + + // mobjinfo_t* info; + str->info = saveg_readp(); + + // int tics; + str->tics = saveg_read32(); + + // state_t* state; + str->state = &states[saveg_read32()]; + + // int flags; + str->flags = saveg_read32(); + + // int health; + str->health = saveg_read32(); + + // int movedir; + str->movedir = saveg_read32(); + + // int movecount; + str->movecount = saveg_read32(); + + // struct mobj_s* target; + str->target = saveg_readp(); + + // int reactiontime; + str->reactiontime = saveg_read32(); + + // int threshold; + str->threshold = saveg_read32(); + + // struct player_s* player; + pl = saveg_read32(); + + if (pl > 0) + { + str->player = &players[pl - 1]; + str->player->mo = str; + } + else + { + str->player = NULL; + } + + // int lastlook; + str->lastlook = saveg_read32(); + + // mapthing_t spawnpoint; + saveg_read_mapthing_t(&str->spawnpoint); + + // struct mobj_s* tracer; + str->tracer = saveg_readp(); +} + +static void saveg_write_mobj_t(mobj_t *str) +{ + // thinker_t thinker; + saveg_write_thinker_t(&str->thinker); + + // fixed_t x; + saveg_write32(str->x); + + // fixed_t y; + saveg_write32(str->y); + + // fixed_t z; + saveg_write32(str->z); + + // struct mobj_s* snext; + saveg_writep(str->snext); + + // struct mobj_s* sprev; + saveg_writep(str->sprev); + + // angle_t angle; + saveg_write32(str->angle); + + // spritenum_t sprite; + saveg_write_enum(str->sprite); + + // int frame; + saveg_write32(str->frame); + + // struct mobj_s* bnext; + saveg_writep(str->bnext); + + // struct mobj_s* bprev; + saveg_writep(str->bprev); + + // struct subsector_s* subsector; + saveg_writep(str->subsector); + + // fixed_t floorz; + saveg_write32(str->floorz); + + // fixed_t ceilingz; + saveg_write32(str->ceilingz); + + // fixed_t radius; + saveg_write32(str->radius); + + // fixed_t height; + saveg_write32(str->height); + + // fixed_t momx; + saveg_write32(str->momx); + + // fixed_t momy; + saveg_write32(str->momy); + + // fixed_t momz; + saveg_write32(str->momz); + + // int validcount; + saveg_write32(str->validcount); + + // mobjtype_t type; + saveg_write_enum(str->type); + + // mobjinfo_t* info; + saveg_writep(str->info); + + // int tics; + saveg_write32(str->tics); + + // state_t* state; + saveg_write32(str->state - states); + + // int flags; + saveg_write32(str->flags); + + // int health; + saveg_write32(str->health); + + // int movedir; + saveg_write32(str->movedir); + + // int movecount; + saveg_write32(str->movecount); + + // struct mobj_s* target; + saveg_writep(str->target); + + // int reactiontime; + saveg_write32(str->reactiontime); + + // int threshold; + saveg_write32(str->threshold); + + // struct player_s* player; + if (str->player) + { + saveg_write32(str->player - players + 1); + } + else + { + saveg_write32(0); + } + + // int lastlook; + saveg_write32(str->lastlook); + + // mapthing_t spawnpoint; + saveg_write_mapthing_t(&str->spawnpoint); + + // struct mobj_s* tracer; + saveg_writep(str->tracer); +} + + +// +// ticcmd_t +// + +static void saveg_read_ticcmd_t(ticcmd_t *str) +{ + + // signed char forwardmove; + str->forwardmove = saveg_read8(); + + // signed char sidemove; + str->sidemove = saveg_read8(); + + // short angleturn; + str->angleturn = saveg_read16(); + + // short consistancy; + str->consistancy = saveg_read16(); + + // byte chatchar; + str->chatchar = saveg_read8(); + + // byte buttons; + str->buttons = saveg_read8(); +} + +static void saveg_write_ticcmd_t(ticcmd_t *str) +{ + + // signed char forwardmove; + saveg_write8(str->forwardmove); + + // signed char sidemove; + saveg_write8(str->sidemove); + + // short angleturn; + saveg_write16(str->angleturn); + + // short consistancy; + saveg_write16(str->consistancy); + + // byte chatchar; + saveg_write8(str->chatchar); + + // byte buttons; + saveg_write8(str->buttons); +} + +// +// pspdef_t +// + +static void saveg_read_pspdef_t(pspdef_t *str) +{ + int state; + + // state_t* state; + state = saveg_read32(); + + if (state > 0) + { + str->state = &states[state]; + } + else + { + str->state = NULL; + } + + // int tics; + str->tics = saveg_read32(); + + // fixed_t sx; + str->sx = saveg_read32(); + + // fixed_t sy; + str->sy = saveg_read32(); +} + +static void saveg_write_pspdef_t(pspdef_t *str) +{ + // state_t* state; + if (str->state) + { + saveg_write32(str->state - states); + } + else + { + saveg_write32(0); + } + + // int tics; + saveg_write32(str->tics); + + // fixed_t sx; + saveg_write32(str->sx); + + // fixed_t sy; + saveg_write32(str->sy); +} + +// +// player_t +// + +static void saveg_read_player_t(player_t *str) +{ + int i; + + // mobj_t* mo; + str->mo = saveg_readp(); + + // playerstate_t playerstate; + str->playerstate = saveg_read_enum(); + + // ticcmd_t cmd; + saveg_read_ticcmd_t(&str->cmd); + + // fixed_t viewz; + str->viewz = saveg_read32(); + + // fixed_t viewheight; + str->viewheight = saveg_read32(); + + // fixed_t deltaviewheight; + str->deltaviewheight = saveg_read32(); + + // fixed_t bob; + str->bob = saveg_read32(); + + // int health; + str->health = saveg_read32(); + + // int armorpoints; + str->armorpoints = saveg_read32(); + + // int armortype; + str->armortype = saveg_read32(); + + // int powers[NUMPOWERS]; + for (i=0; ipowers[i] = saveg_read32(); + } + + // boolean cards[NUMCARDS]; + for (i=0; icards[i] = saveg_read32(); + } + + // boolean backpack; + str->backpack = saveg_read32(); + + // int frags[MAXPLAYERS]; + for (i=0; ifrags[i] = saveg_read32(); + } + + // weapontype_t readyweapon; + str->readyweapon = saveg_read_enum(); + + // weapontype_t pendingweapon; + str->pendingweapon = saveg_read_enum(); + + // boolean weaponowned[NUMWEAPONS]; + for (i=0; iweaponowned[i] = saveg_read32(); + } + + // int ammo[NUMAMMO]; + for (i=0; iammo[i] = saveg_read32(); + } + + // int maxammo[NUMAMMO]; + for (i=0; imaxammo[i] = saveg_read32(); + } + + // int attackdown; + str->attackdown = saveg_read32(); + + // int usedown; + str->usedown = saveg_read32(); + + // int cheats; + str->cheats = saveg_read32(); + + // int refire; + str->refire = saveg_read32(); + + // int killcount; + str->killcount = saveg_read32(); + + // int itemcount; + str->itemcount = saveg_read32(); + + // int secretcount; + str->secretcount = saveg_read32(); + + // char* message; + str->message = saveg_readp(); + + // int damagecount; + str->damagecount = saveg_read32(); + + // int bonuscount; + str->bonuscount = saveg_read32(); + + // mobj_t* attacker; + str->attacker = saveg_readp(); + + // int extralight; + str->extralight = saveg_read32(); + + // int fixedcolormap; + str->fixedcolormap = saveg_read32(); + + // int colormap; + str->colormap = saveg_read32(); + + // pspdef_t psprites[NUMPSPRITES]; + for (i=0; ipsprites[i]); + } + + // boolean didsecret; + str->didsecret = saveg_read32(); +} + +static void saveg_write_player_t(player_t *str) +{ + int i; + + // mobj_t* mo; + saveg_writep(str->mo); + + // playerstate_t playerstate; + saveg_write_enum(str->playerstate); + + // ticcmd_t cmd; + saveg_write_ticcmd_t(&str->cmd); + + // fixed_t viewz; + saveg_write32(str->viewz); + + // fixed_t viewheight; + saveg_write32(str->viewheight); + + // fixed_t deltaviewheight; + saveg_write32(str->deltaviewheight); + + // fixed_t bob; + saveg_write32(str->bob); + + // int health; + saveg_write32(str->health); + + // int armorpoints; + saveg_write32(str->armorpoints); + + // int armortype; + saveg_write32(str->armortype); + + // int powers[NUMPOWERS]; + for (i=0; ipowers[i]); + } + + // boolean cards[NUMCARDS]; + for (i=0; icards[i]); + } + + // boolean backpack; + saveg_write32(str->backpack); + + // int frags[MAXPLAYERS]; + for (i=0; ifrags[i]); + } + + // weapontype_t readyweapon; + saveg_write_enum(str->readyweapon); + + // weapontype_t pendingweapon; + saveg_write_enum(str->pendingweapon); + + // boolean weaponowned[NUMWEAPONS]; + for (i=0; iweaponowned[i]); + } + + // int ammo[NUMAMMO]; + for (i=0; iammo[i]); + } + + // int maxammo[NUMAMMO]; + for (i=0; imaxammo[i]); + } + + // int attackdown; + saveg_write32(str->attackdown); + + // int usedown; + saveg_write32(str->usedown); + + // int cheats; + saveg_write32(str->cheats); + + // int refire; + saveg_write32(str->refire); + + // int killcount; + saveg_write32(str->killcount); + + // int itemcount; + saveg_write32(str->itemcount); + + // int secretcount; + saveg_write32(str->secretcount); + + // char* message; + saveg_writep(str->message); + + // int damagecount; + saveg_write32(str->damagecount); + + // int bonuscount; + saveg_write32(str->bonuscount); + + // mobj_t* attacker; + saveg_writep(str->attacker); + + // int extralight; + saveg_write32(str->extralight); + + // int fixedcolormap; + saveg_write32(str->fixedcolormap); + + // int colormap; + saveg_write32(str->colormap); + + // pspdef_t psprites[NUMPSPRITES]; + for (i=0; ipsprites[i]); + } + + // boolean didsecret; + saveg_write32(str->didsecret); +} + + +// +// ceiling_t +// + +static void saveg_read_ceiling_t(ceiling_t *str) +{ + int sector; + + // thinker_t thinker; + saveg_read_thinker_t(&str->thinker); + + // ceiling_e type; + str->type = saveg_read_enum(); + + // sector_t* sector; + sector = saveg_read32(); + str->sector = §ors[sector]; + + // fixed_t bottomheight; + str->bottomheight = saveg_read32(); + + // fixed_t topheight; + str->topheight = saveg_read32(); + + // fixed_t speed; + str->speed = saveg_read32(); + + // boolean crush; + str->crush = saveg_read32(); + + // int direction; + str->direction = saveg_read32(); + + // int tag; + str->tag = saveg_read32(); + + // int olddirection; + str->olddirection = saveg_read32(); +} + +static void saveg_write_ceiling_t(ceiling_t *str) +{ + // thinker_t thinker; + saveg_write_thinker_t(&str->thinker); + + // ceiling_e type; + saveg_write_enum(str->type); + + // sector_t* sector; + saveg_write32(str->sector - sectors); + + // fixed_t bottomheight; + saveg_write32(str->bottomheight); + + // fixed_t topheight; + saveg_write32(str->topheight); + + // fixed_t speed; + saveg_write32(str->speed); + + // boolean crush; + saveg_write32(str->crush); + + // int direction; + saveg_write32(str->direction); + + // int tag; + saveg_write32(str->tag); + + // int olddirection; + saveg_write32(str->olddirection); +} + +// +// vldoor_t +// + +static void saveg_read_vldoor_t(vldoor_t *str) +{ + int sector; + + // thinker_t thinker; + saveg_read_thinker_t(&str->thinker); + + // vldoor_e type; + str->type = saveg_read_enum(); + + // sector_t* sector; + sector = saveg_read32(); + str->sector = §ors[sector]; + + // fixed_t topheight; + str->topheight = saveg_read32(); + + // fixed_t speed; + str->speed = saveg_read32(); + + // int direction; + str->direction = saveg_read32(); + + // int topwait; + str->topwait = saveg_read32(); + + // int topcountdown; + str->topcountdown = saveg_read32(); +} + +static void saveg_write_vldoor_t(vldoor_t *str) +{ + // thinker_t thinker; + saveg_write_thinker_t(&str->thinker); + + // vldoor_e type; + saveg_write_enum(str->type); + + // sector_t* sector; + saveg_write32(str->sector - sectors); + + // fixed_t topheight; + saveg_write32(str->topheight); + + // fixed_t speed; + saveg_write32(str->speed); + + // int direction; + saveg_write32(str->direction); + + // int topwait; + saveg_write32(str->topwait); + + // int topcountdown; + saveg_write32(str->topcountdown); +} + +// +// floormove_t +// + +static void saveg_read_floormove_t(floormove_t *str) +{ + int sector; + + // thinker_t thinker; + saveg_read_thinker_t(&str->thinker); + + // floor_e type; + str->type = saveg_read_enum(); + + // boolean crush; + str->crush = saveg_read32(); + + // sector_t* sector; + sector = saveg_read32(); + str->sector = §ors[sector]; + + // int direction; + str->direction = saveg_read32(); + + // int newspecial; + str->newspecial = saveg_read32(); + + // short texture; + str->texture = saveg_read16(); + + // fixed_t floordestheight; + str->floordestheight = saveg_read32(); + + // fixed_t speed; + str->speed = saveg_read32(); +} + +static void saveg_write_floormove_t(floormove_t *str) +{ + // thinker_t thinker; + saveg_write_thinker_t(&str->thinker); + + // floor_e type; + saveg_write_enum(str->type); + + // boolean crush; + saveg_write32(str->crush); + + // sector_t* sector; + saveg_write32(str->sector - sectors); + + // int direction; + saveg_write32(str->direction); + + // int newspecial; + saveg_write32(str->newspecial); + + // short texture; + saveg_write16(str->texture); + + // fixed_t floordestheight; + saveg_write32(str->floordestheight); + + // fixed_t speed; + saveg_write32(str->speed); +} + +// +// plat_t +// + +static void saveg_read_plat_t(plat_t *str) +{ + int sector; + + // thinker_t thinker; + saveg_read_thinker_t(&str->thinker); + + // sector_t* sector; + sector = saveg_read32(); + str->sector = §ors[sector]; + + // fixed_t speed; + str->speed = saveg_read32(); + + // fixed_t low; + str->low = saveg_read32(); + + // fixed_t high; + str->high = saveg_read32(); + + // int wait; + str->wait = saveg_read32(); + + // int count; + str->count = saveg_read32(); + + // plat_e status; + str->status = saveg_read_enum(); + + // plat_e oldstatus; + str->oldstatus = saveg_read_enum(); + + // boolean crush; + str->crush = saveg_read32(); + + // int tag; + str->tag = saveg_read32(); + + // plattype_e type; + str->type = saveg_read_enum(); +} + +static void saveg_write_plat_t(plat_t *str) +{ + // thinker_t thinker; + saveg_write_thinker_t(&str->thinker); + + // sector_t* sector; + saveg_write32(str->sector - sectors); + + // fixed_t speed; + saveg_write32(str->speed); + + // fixed_t low; + saveg_write32(str->low); + + // fixed_t high; + saveg_write32(str->high); + + // int wait; + saveg_write32(str->wait); + + // int count; + saveg_write32(str->count); + + // plat_e status; + saveg_write_enum(str->status); + + // plat_e oldstatus; + saveg_write_enum(str->oldstatus); + + // boolean crush; + saveg_write32(str->crush); + + // int tag; + saveg_write32(str->tag); + + // plattype_e type; + saveg_write_enum(str->type); +} + +// +// lightflash_t +// + +static void saveg_read_lightflash_t(lightflash_t *str) +{ + int sector; + + // thinker_t thinker; + saveg_read_thinker_t(&str->thinker); + + // sector_t* sector; + sector = saveg_read32(); + str->sector = §ors[sector]; + + // int count; + str->count = saveg_read32(); + + // int maxlight; + str->maxlight = saveg_read32(); + + // int minlight; + str->minlight = saveg_read32(); + + // int maxtime; + str->maxtime = saveg_read32(); + + // int mintime; + str->mintime = saveg_read32(); +} + +static void saveg_write_lightflash_t(lightflash_t *str) +{ + // thinker_t thinker; + saveg_write_thinker_t(&str->thinker); + + // sector_t* sector; + saveg_write32(str->sector - sectors); + + // int count; + saveg_write32(str->count); + + // int maxlight; + saveg_write32(str->maxlight); + + // int minlight; + saveg_write32(str->minlight); + + // int maxtime; + saveg_write32(str->maxtime); + + // int mintime; + saveg_write32(str->mintime); +} + +// +// strobe_t +// + +static void saveg_read_strobe_t(strobe_t *str) +{ + int sector; + + // thinker_t thinker; + saveg_read_thinker_t(&str->thinker); + + // sector_t* sector; + sector = saveg_read32(); + str->sector = §ors[sector]; + + // int count; + str->count = saveg_read32(); + + // int minlight; + str->minlight = saveg_read32(); + + // int maxlight; + str->maxlight = saveg_read32(); + + // int darktime; + str->darktime = saveg_read32(); + + // int brighttime; + str->brighttime = saveg_read32(); +} + +static void saveg_write_strobe_t(strobe_t *str) +{ + // thinker_t thinker; + saveg_write_thinker_t(&str->thinker); + + // sector_t* sector; + saveg_write32(str->sector - sectors); + + // int count; + saveg_write32(str->count); + + // int minlight; + saveg_write32(str->minlight); + + // int maxlight; + saveg_write32(str->maxlight); + + // int darktime; + saveg_write32(str->darktime); + + // int brighttime; + saveg_write32(str->brighttime); +} + +// +// glow_t +// + +static void saveg_read_glow_t(glow_t *str) +{ + int sector; + + // thinker_t thinker; + saveg_read_thinker_t(&str->thinker); + + // sector_t* sector; + sector = saveg_read32(); + str->sector = §ors[sector]; + + // int minlight; + str->minlight = saveg_read32(); + + // int maxlight; + str->maxlight = saveg_read32(); + + // int direction; + str->direction = saveg_read32(); +} + +static void saveg_write_glow_t(glow_t *str) +{ + // thinker_t thinker; + saveg_write_thinker_t(&str->thinker); + + // sector_t* sector; + saveg_write32(str->sector - sectors); + + // int minlight; + saveg_write32(str->minlight); + + // int maxlight; + saveg_write32(str->maxlight); + + // int direction; + saveg_write32(str->direction); +} + +// +// Write the header for a savegame +// + +void P_WriteSaveGameHeader(char *description) +{ + char name[VERSIONSIZE]; + int i; + + for (i=0; description[i] != '\0'; ++i) + saveg_write8(description[i]); + for (; i> 16) & 0xff); + saveg_write8((leveltime >> 8) & 0xff); + saveg_write8(leveltime & 0xff); +} + +// +// Read the header for a savegame +// + +boolean P_ReadSaveGameHeader(void) +{ + int i; + byte a, b, c; + char vcheck[VERSIONSIZE]; + char read_vcheck[VERSIONSIZE]; + + // skip the description field + + for (i=0; ifloorheight >> FRACBITS); + saveg_write16(sec->ceilingheight >> FRACBITS); + saveg_write16(sec->floorpic); + saveg_write16(sec->ceilingpic); + saveg_write16(sec->lightlevel); + saveg_write16(sec->special); // needed? + saveg_write16(sec->tag); // needed? + } + + + // do lines + for (i=0, li = lines ; iflags); + saveg_write16(li->special); + saveg_write16(li->tag); + for (j=0 ; j<2 ; j++) + { + if (li->sidenum[j] == -1) + continue; + + si = &sides[li->sidenum[j]]; + + saveg_write16(si->textureoffset >> FRACBITS); + saveg_write16(si->rowoffset >> FRACBITS); + saveg_write16(si->toptexture); + saveg_write16(si->bottomtexture); + saveg_write16(si->midtexture); + } + } +} + + + +// +// P_UnArchiveWorld +// +void P_UnArchiveWorld (void) +{ + int i; + int j; + sector_t* sec; + line_t* li; + side_t* si; + + // do sectors + for (i=0, sec = sectors ; ifloorheight = saveg_read16() << FRACBITS; + sec->ceilingheight = saveg_read16() << FRACBITS; + sec->floorpic = saveg_read16(); + sec->ceilingpic = saveg_read16(); + sec->lightlevel = saveg_read16(); + sec->special = saveg_read16(); // needed? + sec->tag = saveg_read16(); // needed? + sec->specialdata = 0; + sec->soundtarget = 0; + } + + // do lines + for (i=0, li = lines ; iflags = saveg_read16(); + li->special = saveg_read16(); + li->tag = saveg_read16(); + for (j=0 ; j<2 ; j++) + { + if (li->sidenum[j] == -1) + continue; + si = &sides[li->sidenum[j]]; + si->textureoffset = saveg_read16() << FRACBITS; + si->rowoffset = saveg_read16() << FRACBITS; + si->toptexture = saveg_read16(); + si->bottomtexture = saveg_read16(); + si->midtexture = saveg_read16(); + } + } +} + + + + + +// +// Thinkers +// +typedef enum +{ + tc_end, + tc_mobj + +} thinkerclass_t; + + +// +// P_ArchiveThinkers +// +void P_ArchiveThinkers (void) +{ + thinker_t* th; + + // save off the current thinkers + for (th = thinkercap.next ; th != &thinkercap ; th=th->next) + { + if (th->function.acp1 == (actionf_p1)P_MobjThinker) + { + saveg_write8(tc_mobj); + saveg_write_pad(); + saveg_write_mobj_t((mobj_t *) th); + + continue; + } + + // I_Error ("P_ArchiveThinkers: Unknown thinker function"); + } + + // add a terminating marker + saveg_write8(tc_end); +} + + + +// +// P_UnArchiveThinkers +// +void P_UnArchiveThinkers (void) +{ + byte tclass; + thinker_t* currentthinker; + thinker_t* next; + mobj_t* mobj; + + // remove all the current thinkers + currentthinker = thinkercap.next; + while (currentthinker != &thinkercap) + { + next = currentthinker->next; + + if (currentthinker->function.acp1 == (actionf_p1)P_MobjThinker) + P_RemoveMobj ((mobj_t *)currentthinker); + else + Z_Free (currentthinker); + + currentthinker = next; + } + P_InitThinkers (); + + // read in saved thinkers + while (1) + { + tclass = saveg_read8(); + switch (tclass) + { + case tc_end: + return; // end of list + + case tc_mobj: + saveg_read_pad(); + mobj = Z_Malloc (sizeof(*mobj), PU_LEVEL, NULL); + saveg_read_mobj_t(mobj); + + mobj->target = NULL; + mobj->tracer = NULL; + P_SetThingPosition (mobj); + mobj->info = &mobjinfo[mobj->type]; + mobj->floorz = mobj->subsector->sector->floorheight; + mobj->ceilingz = mobj->subsector->sector->ceilingheight; + mobj->thinker.function.acp1 = (actionf_p1)P_MobjThinker; + P_AddThinker (&mobj->thinker); + break; + + default: + I_Error ("Unknown tclass %i in savegame",tclass); + } + + } + +} + + +// +// P_ArchiveSpecials +// +enum +{ + tc_ceiling, + tc_door, + tc_floor, + tc_plat, + tc_flash, + tc_strobe, + tc_glow, + tc_endspecials + +} specials_e; + + + +// +// Things to handle: +// +// T_MoveCeiling, (ceiling_t: sector_t * swizzle), - active list +// T_VerticalDoor, (vldoor_t: sector_t * swizzle), +// T_MoveFloor, (floormove_t: sector_t * swizzle), +// T_LightFlash, (lightflash_t: sector_t * swizzle), +// T_StrobeFlash, (strobe_t: sector_t *), +// T_Glow, (glow_t: sector_t *), +// T_PlatRaise, (plat_t: sector_t *), - active list +// +void P_ArchiveSpecials (void) +{ + thinker_t* th; + int i; + + // save off the current thinkers + for (th = thinkercap.next ; th != &thinkercap ; th=th->next) + { + if (th->function.acv == (actionf_v)NULL) + { + for (i = 0; i < MAXCEILINGS;i++) + if (activeceilings[i] == (ceiling_t *)th) + break; + + if (ifunction.acp1 == (actionf_p1)T_MoveCeiling) + { + saveg_write8(tc_ceiling); + saveg_write_pad(); + saveg_write_ceiling_t((ceiling_t *) th); + continue; + } + + if (th->function.acp1 == (actionf_p1)T_VerticalDoor) + { + saveg_write8(tc_door); + saveg_write_pad(); + saveg_write_vldoor_t((vldoor_t *) th); + continue; + } + + if (th->function.acp1 == (actionf_p1)T_MoveFloor) + { + saveg_write8(tc_floor); + saveg_write_pad(); + saveg_write_floormove_t((floormove_t *) th); + continue; + } + + if (th->function.acp1 == (actionf_p1)T_PlatRaise) + { + saveg_write8(tc_plat); + saveg_write_pad(); + saveg_write_plat_t((plat_t *) th); + continue; + } + + if (th->function.acp1 == (actionf_p1)T_LightFlash) + { + saveg_write8(tc_flash); + saveg_write_pad(); + saveg_write_lightflash_t((lightflash_t *) th); + continue; + } + + if (th->function.acp1 == (actionf_p1)T_StrobeFlash) + { + saveg_write8(tc_strobe); + saveg_write_pad(); + saveg_write_strobe_t((strobe_t *) th); + continue; + } + + if (th->function.acp1 == (actionf_p1)T_Glow) + { + saveg_write8(tc_glow); + saveg_write_pad(); + saveg_write_glow_t((glow_t *) th); + continue; + } + } + + // add a terminating marker + saveg_write8(tc_endspecials); + +} + + +// +// P_UnArchiveSpecials +// +void P_UnArchiveSpecials (void) +{ + byte tclass; + ceiling_t* ceiling; + vldoor_t* door; + floormove_t* floor; + plat_t* plat; + lightflash_t* flash; + strobe_t* strobe; + glow_t* glow; + + + // read in saved thinkers + while (1) + { + tclass = saveg_read8(); + + switch (tclass) + { + case tc_endspecials: + return; // end of list + + case tc_ceiling: + saveg_read_pad(); + ceiling = Z_Malloc (sizeof(*ceiling), PU_LEVEL, NULL); + saveg_read_ceiling_t(ceiling); + ceiling->sector->specialdata = ceiling; + + if (ceiling->thinker.function.acp1) + ceiling->thinker.function.acp1 = (actionf_p1)T_MoveCeiling; + + P_AddThinker (&ceiling->thinker); + P_AddActiveCeiling(ceiling); + break; + + case tc_door: + saveg_read_pad(); + door = Z_Malloc (sizeof(*door), PU_LEVEL, NULL); + saveg_read_vldoor_t(door); + door->sector->specialdata = door; + door->thinker.function.acp1 = (actionf_p1)T_VerticalDoor; + P_AddThinker (&door->thinker); + break; + + case tc_floor: + saveg_read_pad(); + floor = Z_Malloc (sizeof(*floor), PU_LEVEL, NULL); + saveg_read_floormove_t(floor); + floor->sector->specialdata = floor; + floor->thinker.function.acp1 = (actionf_p1)T_MoveFloor; + P_AddThinker (&floor->thinker); + break; + + case tc_plat: + saveg_read_pad(); + plat = Z_Malloc (sizeof(*plat), PU_LEVEL, NULL); + saveg_read_plat_t(plat); + plat->sector->specialdata = plat; + + if (plat->thinker.function.acp1) + plat->thinker.function.acp1 = (actionf_p1)T_PlatRaise; + + P_AddThinker (&plat->thinker); + P_AddActivePlat(plat); + break; + + case tc_flash: + saveg_read_pad(); + flash = Z_Malloc (sizeof(*flash), PU_LEVEL, NULL); + saveg_read_lightflash_t(flash); + flash->thinker.function.acp1 = (actionf_p1)T_LightFlash; + P_AddThinker (&flash->thinker); + break; + + case tc_strobe: + saveg_read_pad(); + strobe = Z_Malloc (sizeof(*strobe), PU_LEVEL, NULL); + saveg_read_strobe_t(strobe); + strobe->thinker.function.acp1 = (actionf_p1)T_StrobeFlash; + P_AddThinker (&strobe->thinker); + break; + + case tc_glow: + saveg_read_pad(); + glow = Z_Malloc (sizeof(*glow), PU_LEVEL, NULL); + saveg_read_glow_t(glow); + glow->thinker.function.acp1 = (actionf_p1)T_Glow; + P_AddThinker (&glow->thinker); + break; + + default: + I_Error ("P_UnarchiveSpecials:Unknown tclass %i " + "in savegame",tclass); + } + + } + +} + diff --git a/firmware_p4/components/Applications/doom/p_saveg.h b/firmware_p4/components/Applications/doom/p_saveg.h new file mode 100644 index 000000000..2d7beba3c --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_saveg.h @@ -0,0 +1,62 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Savegame I/O, archiving, persistence. +// + + +#ifndef __P_SAVEG__ +#define __P_SAVEG__ + +#include + +// maximum size of a savegame description + +#define SAVESTRINGSIZE 24 + +// temporary filename to use while saving. + +char *P_TempSaveGameFile(void); + +// filename to use for a savegame slot + +char *P_SaveGameFile(int slot); + +// Savegame file header read/write functions + +boolean P_ReadSaveGameHeader(void); +void P_WriteSaveGameHeader(char *description); + +// Savegame end-of-file read/write functions + +boolean P_ReadSaveGameEOF(void); +void P_WriteSaveGameEOF(void); + +// Persistent storage/archiving. +// These are the load / save game routines. +void P_ArchivePlayers (void); +void P_UnArchivePlayers (void); +void P_ArchiveWorld (void); +void P_UnArchiveWorld (void); +void P_ArchiveThinkers (void); +void P_UnArchiveThinkers (void); +void P_ArchiveSpecials (void); +void P_UnArchiveSpecials (void); + +extern FILE *save_stream; +extern boolean savegame_error; + + +#endif diff --git a/firmware_p4/components/Applications/doom/p_setup.c b/firmware_p4/components/Applications/doom/p_setup.c new file mode 100644 index 000000000..00306e84c --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_setup.c @@ -0,0 +1,855 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Do all the WAD I/O, get map description, +// set up initial state and misc. LUTs. +// + + + +#include + +#include "z_zone.h" + +#include "deh_main.h" +#include "i_swap.h" +#include "m_argv.h" +#include "m_bbox.h" + +#include "g_game.h" + +#include "i_system.h" +#include "w_wad.h" + +#include "doomdef.h" +#include "p_local.h" + +#include "s_sound.h" + +#include "doomstat.h" + + +void P_SpawnMapThing (mapthing_t* mthing); + + +// +// MAP related Lookup tables. +// Store VERTEXES, LINEDEFS, SIDEDEFS, etc. +// +int numvertexes; +vertex_t* vertexes; + +int numsegs; +seg_t* segs; + +int numsectors; +sector_t* sectors; + +int numsubsectors; +subsector_t* subsectors; + +int numnodes; +node_t* nodes; + +int numlines; +line_t* lines; + +int numsides; +side_t* sides; + +static int totallines; + +// BLOCKMAP +// Created from axis aligned bounding box +// of the map, a rectangular array of +// blocks of size ... +// Used to speed up collision detection +// by spatial subdivision in 2D. +// +// Blockmap size. +int bmapwidth; +int bmapheight; // size in mapblocks +short* blockmap; // int for larger maps +// offsets in blockmap are from here +short* blockmaplump; +// origin of block map +fixed_t bmaporgx; +fixed_t bmaporgy; +// for thing chains +mobj_t** blocklinks; + + +// REJECT +// For fast sight rejection. +// Speeds up enemy AI by skipping detailed +// LineOf Sight calculation. +// Without special effect, this could be +// used as a PVS lookup as well. +// +byte* rejectmatrix; + + +// Maintain single and multi player starting spots. +#define MAX_DEATHMATCH_STARTS 10 + +mapthing_t deathmatchstarts[MAX_DEATHMATCH_STARTS]; +mapthing_t* deathmatch_p; +mapthing_t playerstarts[MAXPLAYERS]; + + + + + +// +// P_LoadVertexes +// +void P_LoadVertexes (int lump) +{ + byte* data; + int i; + mapvertex_t* ml; + vertex_t* li; + + // Determine number of lumps: + // total lump length / vertex record length. + numvertexes = W_LumpLength (lump) / sizeof(mapvertex_t); + + // Allocate zone memory for buffer. + vertexes = Z_Malloc (numvertexes*sizeof(vertex_t),PU_LEVEL,0); + + // Load data into cache. + data = W_CacheLumpNum (lump, PU_STATIC); + + ml = (mapvertex_t *)data; + li = vertexes; + + // Copy and convert vertex coordinates, + // internal representation as fixed. + for (i=0 ; ix = SHORT(ml->x)<y = SHORT(ml->y)<v1 = &vertexes[SHORT(ml->v1)]; + li->v2 = &vertexes[SHORT(ml->v2)]; + + li->angle = (SHORT(ml->angle))<<16; + li->offset = (SHORT(ml->offset))<<16; + linedef = SHORT(ml->linedef); + ldef = &lines[linedef]; + li->linedef = ldef; + side = SHORT(ml->side); + li->sidedef = &sides[ldef->sidenum[side]]; + li->frontsector = sides[ldef->sidenum[side]].sector; + + if (ldef-> flags & ML_TWOSIDED) + { + sidenum = ldef->sidenum[side ^ 1]; + + // If the sidenum is out of range, this may be a "glass hack" + // impassible window. Point at side #0 (this may not be + // the correct Vanilla behavior; however, it seems to work for + // OTTAWAU.WAD, which is the one place I've seen this trick + // used). + + if (sidenum < 0 || sidenum >= numsides) + { + li->backsector = GetSectorAtNullAddress(); + } + else + { + li->backsector = sides[sidenum].sector; + } + } + else + { + li->backsector = 0; + } + } + + W_ReleaseLumpNum(lump); +} + + +// +// P_LoadSubsectors +// +void P_LoadSubsectors (int lump) +{ + byte* data; + int i; + mapsubsector_t* ms; + subsector_t* ss; + + numsubsectors = W_LumpLength (lump) / sizeof(mapsubsector_t); + subsectors = Z_Malloc (numsubsectors*sizeof(subsector_t),PU_LEVEL,0); + data = W_CacheLumpNum (lump,PU_STATIC); + + ms = (mapsubsector_t *)data; + memset (subsectors,0, numsubsectors*sizeof(subsector_t)); + ss = subsectors; + + for (i=0 ; inumlines = SHORT(ms->numsegs); + ss->firstline = SHORT(ms->firstseg); + } + + W_ReleaseLumpNum(lump); +} + + + +// +// P_LoadSectors +// +void P_LoadSectors (int lump) +{ + byte* data; + int i; + mapsector_t* ms; + sector_t* ss; + + numsectors = W_LumpLength (lump) / sizeof(mapsector_t); + sectors = Z_Malloc (numsectors*sizeof(sector_t),PU_LEVEL,0); + memset (sectors, 0, numsectors*sizeof(sector_t)); + data = W_CacheLumpNum (lump,PU_STATIC); + + ms = (mapsector_t *)data; + ss = sectors; + for (i=0 ; ifloorheight = SHORT(ms->floorheight)<ceilingheight = SHORT(ms->ceilingheight)<floorpic = R_FlatNumForName(ms->floorpic); + ss->ceilingpic = R_FlatNumForName(ms->ceilingpic); + ss->lightlevel = SHORT(ms->lightlevel); + ss->special = SHORT(ms->special); + ss->tag = SHORT(ms->tag); + ss->thinglist = NULL; + } + + W_ReleaseLumpNum(lump); +} + + +// +// P_LoadNodes +// +void P_LoadNodes (int lump) +{ + byte* data; + int i; + int j; + int k; + mapnode_t* mn; + node_t* no; + + numnodes = W_LumpLength (lump) / sizeof(mapnode_t); + nodes = Z_Malloc (numnodes*sizeof(node_t),PU_LEVEL,0); + data = W_CacheLumpNum (lump,PU_STATIC); + + mn = (mapnode_t *)data; + no = nodes; + + for (i=0 ; ix = SHORT(mn->x)<y = SHORT(mn->y)<dx = SHORT(mn->dx)<dy = SHORT(mn->dy)<children[j] = SHORT(mn->children[j]); + for (k=0 ; k<4 ; k++) + no->bbox[j][k] = SHORT(mn->bbox[j][k])<type)) + { + case 68: // Arachnotron + case 64: // Archvile + case 88: // Boss Brain + case 89: // Boss Shooter + case 69: // Hell Knight + case 67: // Mancubus + case 71: // Pain Elemental + case 65: // Former Human Commando + case 66: // Revenant + case 84: // Wolf SS + spawn = false; + break; + } + } + if (spawn == false) + break; + + // Do spawn all other stuff. + spawnthing.x = SHORT(mt->x); + spawnthing.y = SHORT(mt->y); + spawnthing.angle = SHORT(mt->angle); + spawnthing.type = SHORT(mt->type); + spawnthing.options = SHORT(mt->options); + + P_SpawnMapThing(&spawnthing); + } + + W_ReleaseLumpNum(lump); +} + + +// +// P_LoadLineDefs +// Also counts secret lines for intermissions. +// +void P_LoadLineDefs (int lump) +{ + byte* data; + int i; + maplinedef_t* mld; + line_t* ld; + vertex_t* v1; + vertex_t* v2; + + numlines = W_LumpLength (lump) / sizeof(maplinedef_t); + lines = Z_Malloc (numlines*sizeof(line_t),PU_LEVEL,0); + memset (lines, 0, numlines*sizeof(line_t)); + data = W_CacheLumpNum (lump,PU_STATIC); + + mld = (maplinedef_t *)data; + ld = lines; + for (i=0 ; iflags = SHORT(mld->flags); + ld->special = SHORT(mld->special); + ld->tag = SHORT(mld->tag); + v1 = ld->v1 = &vertexes[SHORT(mld->v1)]; + v2 = ld->v2 = &vertexes[SHORT(mld->v2)]; + ld->dx = v2->x - v1->x; + ld->dy = v2->y - v1->y; + + if (!ld->dx) + ld->slopetype = ST_VERTICAL; + else if (!ld->dy) + ld->slopetype = ST_HORIZONTAL; + else + { + if (FixedDiv (ld->dy , ld->dx) > 0) + ld->slopetype = ST_POSITIVE; + else + ld->slopetype = ST_NEGATIVE; + } + + if (v1->x < v2->x) + { + ld->bbox[BOXLEFT] = v1->x; + ld->bbox[BOXRIGHT] = v2->x; + } + else + { + ld->bbox[BOXLEFT] = v2->x; + ld->bbox[BOXRIGHT] = v1->x; + } + + if (v1->y < v2->y) + { + ld->bbox[BOXBOTTOM] = v1->y; + ld->bbox[BOXTOP] = v2->y; + } + else + { + ld->bbox[BOXBOTTOM] = v2->y; + ld->bbox[BOXTOP] = v1->y; + } + + ld->sidenum[0] = SHORT(mld->sidenum[0]); + ld->sidenum[1] = SHORT(mld->sidenum[1]); + + if (ld->sidenum[0] != -1) + ld->frontsector = sides[ld->sidenum[0]].sector; + else + ld->frontsector = 0; + + if (ld->sidenum[1] != -1) + ld->backsector = sides[ld->sidenum[1]].sector; + else + ld->backsector = 0; + } + + W_ReleaseLumpNum(lump); +} + + +// +// P_LoadSideDefs +// +void P_LoadSideDefs (int lump) +{ + byte* data; + int i; + mapsidedef_t* msd; + side_t* sd; + + numsides = W_LumpLength (lump) / sizeof(mapsidedef_t); + sides = Z_Malloc (numsides*sizeof(side_t),PU_LEVEL,0); + memset (sides, 0, numsides*sizeof(side_t)); + data = W_CacheLumpNum (lump,PU_STATIC); + + msd = (mapsidedef_t *)data; + sd = sides; + for (i=0 ; itextureoffset = SHORT(msd->textureoffset)<rowoffset = SHORT(msd->rowoffset)<toptexture = R_TextureNumForName(msd->toptexture); + sd->bottomtexture = R_TextureNumForName(msd->bottomtexture); + sd->midtexture = R_TextureNumForName(msd->midtexture); + sd->sector = §ors[SHORT(msd->sector)]; + } + + W_ReleaseLumpNum(lump); +} + + +// +// P_LoadBlockMap +// +void P_LoadBlockMap (int lump) +{ + int i; + int count; + int lumplen; + + lumplen = W_LumpLength(lump); + count = lumplen / 2; + + blockmaplump = Z_Malloc(lumplen, PU_LEVEL, NULL); + W_ReadLump(lump, blockmaplump); + blockmap = blockmaplump + 4; + + // Swap all short integers to native byte ordering. + + for (i=0; ifirstline]; + ss->sector = seg->sidedef->sector; + } + + // count number of lines in each sector + li = lines; + totallines = 0; + for (i=0 ; ifrontsector->linecount++; + + if (li->backsector && li->backsector != li->frontsector) + { + li->backsector->linecount++; + totallines++; + } + } + + // build line tables for each sector + linebuffer = Z_Malloc (totallines*sizeof(line_t *), PU_LEVEL, 0); + + for (i=0; ifrontsector != NULL) + { + sector = li->frontsector; + + sector->lines[sector->linecount] = li; + ++sector->linecount; + } + + if (li->backsector != NULL && li->frontsector != li->backsector) + { + sector = li->backsector; + + sector->lines[sector->linecount] = li; + ++sector->linecount; + } + } + + // Generate bounding boxes for sectors + + sector = sectors; + for (i=0 ; ilinecount; j++) + { + li = sector->lines[j]; + + M_AddToBox (bbox, li->v1->x, li->v1->y); + M_AddToBox (bbox, li->v2->x, li->v2->y); + } + + // set the degenmobj_t to the middle of the bounding box + sector->soundorg.x = (bbox[BOXRIGHT]+bbox[BOXLEFT])/2; + sector->soundorg.y = (bbox[BOXTOP]+bbox[BOXBOTTOM])/2; + + // adjust bounding box to map blocks + block = (bbox[BOXTOP]-bmaporgy+MAXRADIUS)>>MAPBLOCKSHIFT; + block = block >= bmapheight ? bmapheight-1 : block; + sector->blockbox[BOXTOP]=block; + + block = (bbox[BOXBOTTOM]-bmaporgy-MAXRADIUS)>>MAPBLOCKSHIFT; + block = block < 0 ? 0 : block; + sector->blockbox[BOXBOTTOM]=block; + + block = (bbox[BOXRIGHT]-bmaporgx+MAXRADIUS)>>MAPBLOCKSHIFT; + block = block >= bmapwidth ? bmapwidth-1 : block; + sector->blockbox[BOXRIGHT]=block; + + block = (bbox[BOXLEFT]-bmaporgx-MAXRADIUS)>>MAPBLOCKSHIFT; + block = block < 0 ? 0 : block; + sector->blockbox[BOXLEFT]=block; + } + +} + +// Pad the REJECT lump with extra data when the lump is too small, +// to simulate a REJECT buffer overflow in Vanilla Doom. + +static void PadRejectArray(byte *array, unsigned int len) +{ + unsigned int i; + unsigned int byte_num; + byte *dest; + unsigned int padvalue; + + // Values to pad the REJECT array with: + + unsigned int rejectpad[4] = + { + ((totallines * 4 + 3) & ~3) + 24, // Size + 0, // Part of z_zone block header + 50, // PU_LEVEL + 0x1d4a11 // DOOM_CONST_ZONEID + }; + + // Copy values from rejectpad into the destination array. + + dest = array; + + for (i=0; i> (byte_num * 8)) & 0xff; + ++dest; + } + + // We only have a limited pad size. Print a warning if the + // REJECT lump is too small. + + if (len > sizeof(rejectpad)) + { + fprintf(stderr, "PadRejectArray: REJECT lump too short to pad! (%i > %i)\n", + len, (int) sizeof(rejectpad)); + + // Pad remaining space with 0 (or 0xff, if specified on command line). + + if (M_CheckParm("-reject_pad_with_ff")) + { + padvalue = 0xff; + } + else + { + padvalue = 0xf00; + } + + memset(array + sizeof(rejectpad), padvalue, len - sizeof(rejectpad)); + } +} + +static void P_LoadReject(int lumpnum) +{ + int minlength; + int lumplen; + + // Calculate the size that the REJECT lump *should* be. + + minlength = (numsectors * numsectors + 7) / 8; + + // If the lump meets the minimum length, it can be loaded directly. + // Otherwise, we need to allocate a buffer of the correct size + // and pad it with appropriate data. + + lumplen = W_LumpLength(lumpnum); + + if (lumplen >= minlength) + { + rejectmatrix = W_CacheLumpNum(lumpnum, PU_LEVEL); + } + else + { + rejectmatrix = Z_Malloc(minlength, PU_LEVEL, &rejectmatrix); + W_ReadLump(lumpnum, rejectmatrix); + + PadRejectArray(rejectmatrix + lumplen, minlength - lumplen); + } +} + +// +// P_SetupLevel +// +void +P_SetupLevel +( int episode, + int map, + int playermask, + skill_t skill) +{ + int i; + char lumpname[9]; + int lumpnum; + + totalkills = totalitems = totalsecret = wminfo.maxfrags = 0; + wminfo.partime = 180; + for (i=0 ; idx) + { + if (x==node->x) + return 2; + + if (x <= node->x) + return node->dy > 0; + + return node->dy < 0; + } + + if (!node->dy) + { + if (x==node->y) + return 2; + + if (y <= node->y) + return node->dx < 0; + + return node->dx > 0; + } + + dx = (x - node->x); + dy = (y - node->y); + + left = (node->dy>>FRACBITS) * (dx>>FRACBITS); + right = (dy>>FRACBITS) * (node->dx>>FRACBITS); + + if (right < left) + return 0; // front side + + if (left == right) + return 2; + return 1; // back side +} + + +// +// P_InterceptVector2 +// Returns the fractional intercept point +// along the first divline. +// This is only called by the addthings and addlines traversers. +// +fixed_t +P_InterceptVector2 +( divline_t* v2, + divline_t* v1 ) +{ + fixed_t frac; + fixed_t num; + fixed_t den; + + den = FixedMul (v1->dy>>8,v2->dx) - FixedMul(v1->dx>>8,v2->dy); + + if (den == 0) + return 0; + // I_Error ("P_InterceptVector: parallel"); + + num = FixedMul ( (v1->x - v2->x)>>8 ,v1->dy) + + FixedMul ( (v2->y - v1->y)>>8 , v1->dx); + frac = FixedDiv (num , den); + + return frac; +} + +// +// P_CrossSubsector +// Returns true +// if strace crosses the given subsector successfully. +// +boolean P_CrossSubsector (int num) +{ + seg_t* seg; + line_t* line; + int s1; + int s2; + int count; + subsector_t* sub; + sector_t* front; + sector_t* back; + fixed_t opentop; + fixed_t openbottom; + divline_t divl; + vertex_t* v1; + vertex_t* v2; + fixed_t frac; + fixed_t slope; + +#ifdef RANGECHECK + if (num>=numsubsectors) + I_Error ("P_CrossSubsector: ss %i with numss = %i", + num, + numsubsectors); +#endif + + sub = &subsectors[num]; + + // check lines + count = sub->numlines; + seg = &segs[sub->firstline]; + + for ( ; count ; seg++, count--) + { + line = seg->linedef; + + // allready checked other side? + if (line->validcount == validcount) + continue; + + line->validcount = validcount; + + v1 = line->v1; + v2 = line->v2; + s1 = P_DivlineSide (v1->x,v1->y, &strace); + s2 = P_DivlineSide (v2->x, v2->y, &strace); + + // line isn't crossed? + if (s1 == s2) + continue; + + divl.x = v1->x; + divl.y = v1->y; + divl.dx = v2->x - v1->x; + divl.dy = v2->y - v1->y; + s1 = P_DivlineSide (strace.x, strace.y, &divl); + s2 = P_DivlineSide (t2x, t2y, &divl); + + // line isn't crossed? + if (s1 == s2) + continue; + + // Backsector may be NULL if this is an "impassible + // glass" hack line. + + if (line->backsector == NULL) + { + return false; + } + + // stop because it is not two sided anyway + // might do this after updating validcount? + if ( !(line->flags & ML_TWOSIDED) ) + return false; + + // crosses a two sided line + front = seg->frontsector; + back = seg->backsector; + + // no wall to block sight with? + if (front->floorheight == back->floorheight + && front->ceilingheight == back->ceilingheight) + continue; + + // possible occluder + // because of ceiling height differences + if (front->ceilingheight < back->ceilingheight) + opentop = front->ceilingheight; + else + opentop = back->ceilingheight; + + // because of ceiling height differences + if (front->floorheight > back->floorheight) + openbottom = front->floorheight; + else + openbottom = back->floorheight; + + // quick test for totally closed doors + if (openbottom >= opentop) + return false; // stop + + frac = P_InterceptVector2 (&strace, &divl); + + if (front->floorheight != back->floorheight) + { + slope = FixedDiv (openbottom - sightzstart , frac); + if (slope > bottomslope) + bottomslope = slope; + } + + if (front->ceilingheight != back->ceilingheight) + { + slope = FixedDiv (opentop - sightzstart , frac); + if (slope < topslope) + topslope = slope; + } + + if (topslope <= bottomslope) + return false; // stop + } + // passed the subsector ok + return true; +} + + + +// +// P_CrossBSPNode +// Returns true +// if strace crosses the given node successfully. +// +boolean P_CrossBSPNode (int bspnum) +{ + node_t* bsp; + int side; + + if (bspnum & NF_SUBSECTOR) + { + if (bspnum == -1) + return P_CrossSubsector (0); + else + return P_CrossSubsector (bspnum&(~NF_SUBSECTOR)); + } + + bsp = &nodes[bspnum]; + + // decide which side the start point is on + side = P_DivlineSide (strace.x, strace.y, (divline_t *)bsp); + if (side == 2) + side = 0; // an "on" should cross both sides + + // cross the starting side + if (!P_CrossBSPNode (bsp->children[side]) ) + return false; + + // the partition plane is crossed here + if (side == P_DivlineSide (t2x, t2y,(divline_t *)bsp)) + { + // the line doesn't touch the other side + return true; + } + + // cross the ending side + return P_CrossBSPNode (bsp->children[side^1]); +} + + +// +// P_CheckSight +// Returns true +// if a straight line between t1 and t2 is unobstructed. +// Uses REJECT. +// +boolean +P_CheckSight +( mobj_t* t1, + mobj_t* t2 ) +{ + int s1; + int s2; + int pnum; + int bytenum; + int bitnum; + + // First check for trivial rejection. + + // Determine subsector entries in REJECT table. + s1 = (t1->subsector->sector - sectors); + s2 = (t2->subsector->sector - sectors); + pnum = s1*numsectors + s2; + bytenum = pnum>>3; + bitnum = 1 << (pnum&7); + + // Check in REJECT table. + if (rejectmatrix[bytenum]&bitnum) + { + sightcounts[0]++; + + // can't possibly be connected + return false; + } + + // An unobstructed LOS is possible. + // Now look from eyes of t1 to any part of t2. + sightcounts[1]++; + + validcount++; + + sightzstart = t1->z + t1->height - (t1->height>>2); + topslope = (t2->z+t2->height) - sightzstart; + bottomslope = (t2->z) - sightzstart; + + strace.x = t1->x; + strace.y = t1->y; + t2x = t2->x; + t2y = t2->y; + strace.dx = t2->x - t1->x; + strace.dy = t2->y - t1->y; + + // the head node is the last node output + return P_CrossBSPNode (numnodes-1); +} + + diff --git a/firmware_p4/components/Applications/doom/p_spec.c b/firmware_p4/components/Applications/doom/p_spec.c new file mode 100644 index 000000000..17446b5df --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_spec.c @@ -0,0 +1,1489 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Implements special effects: +// Texture animation, height or lighting changes +// according to adjacent sectors, respective +// utility functions, etc. +// Line Tag handling. Line and Sector triggers. +// + + +#include + +#include "doomdef.h" +#include "doomstat.h" + +#include "deh_main.h" +#include "i_system.h" +#include "z_zone.h" +#include "m_argv.h" +#include "m_misc.h" +#include "m_random.h" +#include "w_wad.h" + +#include "r_local.h" +#include "p_local.h" + +#include "g_game.h" + +#include "s_sound.h" + +// State. +#include "r_state.h" + +// Data. +#include "sounds.h" + + +// +// Animating textures and planes +// There is another anim_t used in wi_stuff, unrelated. +// +typedef struct +{ + boolean istexture; + int picnum; + int basepic; + int numpics; + int speed; + +} anim_t; + +// +// source animation definition +// +typedef struct +{ + int istexture; // if false, it is a flat + char endname[9]; + char startname[9]; + int speed; +} animdef_t; + + + +#define MAXANIMS 32 + +extern anim_t anims[MAXANIMS]; +extern anim_t* lastanim; + +// +// P_InitPicAnims +// + +// Floor/ceiling animation sequences, +// defined by first and last frame, +// i.e. the flat (64x64 tile) name to +// be used. +// The full animation sequence is given +// using all the flats between the start +// and end entry, in the order found in +// the WAD file. +// +animdef_t animdefs[] = +{ + {false, "NUKAGE3", "NUKAGE1", 8}, + {false, "FWATER4", "FWATER1", 8}, + {false, "SWATER4", "SWATER1", 8}, + {false, "LAVA4", "LAVA1", 8}, + {false, "BLOOD3", "BLOOD1", 8}, + + // DOOM II flat animations. + {false, "RROCK08", "RROCK05", 8}, + {false, "SLIME04", "SLIME01", 8}, + {false, "SLIME08", "SLIME05", 8}, + {false, "SLIME12", "SLIME09", 8}, + + {true, "BLODGR4", "BLODGR1", 8}, + {true, "SLADRIP3", "SLADRIP1", 8}, + + {true, "BLODRIP4", "BLODRIP1", 8}, + {true, "FIREWALL", "FIREWALA", 8}, + {true, "GSTFONT3", "GSTFONT1", 8}, + {true, "FIRELAVA", "FIRELAV3", 8}, + {true, "FIREMAG3", "FIREMAG1", 8}, + {true, "FIREBLU2", "FIREBLU1", 8}, + {true, "ROCKRED3", "ROCKRED1", 8}, + + {true, "BFALL4", "BFALL1", 8}, + {true, "SFALL4", "SFALL1", 8}, + {true, "WFALL4", "WFALL1", 8}, + {true, "DBRAIN4", "DBRAIN1", 8}, + + {-1, "", "", 0}, +}; + +anim_t anims[MAXANIMS]; +anim_t* lastanim; + + +// +// Animating line specials +// +#define MAXLINEANIMS 64 + +extern short numlinespecials; +extern line_t* linespeciallist[MAXLINEANIMS]; + + + +void P_InitPicAnims (void) +{ + int i; + + + // Init animation + lastanim = anims; + for (i=0 ; animdefs[i].istexture != -1 ; i++) + { + char *startname, *endname; + + startname = DEH_String(animdefs[i].startname); + endname = DEH_String(animdefs[i].endname); + + if (animdefs[i].istexture) + { + // different episode ? + if (R_CheckTextureNumForName(startname) == -1) + continue; + + lastanim->picnum = R_TextureNumForName(endname); + lastanim->basepic = R_TextureNumForName(startname); + } + else + { + if (W_CheckNumForName(startname) == -1) + continue; + + lastanim->picnum = R_FlatNumForName(endname); + lastanim->basepic = R_FlatNumForName(startname); + } + + lastanim->istexture = animdefs[i].istexture; + lastanim->numpics = lastanim->picnum - lastanim->basepic + 1; + + if (lastanim->numpics < 2) + I_Error ("P_InitPicAnims: bad cycle from %s to %s", + startname, endname); + + lastanim->speed = animdefs[i].speed; + lastanim++; + } + +} + + + +// +// UTILITIES +// + + + +// +// getSide() +// Will return a side_t* +// given the number of the current sector, +// the line number, and the side (0/1) that you want. +// +side_t* +getSide +( int currentSector, + int line, + int side ) +{ + return &sides[ (sectors[currentSector].lines[line])->sidenum[side] ]; +} + + +// +// getSector() +// Will return a sector_t* +// given the number of the current sector, +// the line number and the side (0/1) that you want. +// +sector_t* +getSector +( int currentSector, + int line, + int side ) +{ + return sides[ (sectors[currentSector].lines[line])->sidenum[side] ].sector; +} + + +// +// twoSided() +// Given the sector number and the line number, +// it will tell you whether the line is two-sided or not. +// +int +twoSided +( int sector, + int line ) +{ + return (sectors[sector].lines[line])->flags & ML_TWOSIDED; +} + + + + +// +// getNextSector() +// Return sector_t * of sector next to current. +// NULL if not two-sided line +// +sector_t* +getNextSector +( line_t* line, + sector_t* sec ) +{ + if (!(line->flags & ML_TWOSIDED)) + return NULL; + + if (line->frontsector == sec) + return line->backsector; + + return line->frontsector; +} + + + +// +// P_FindLowestFloorSurrounding() +// FIND LOWEST FLOOR HEIGHT IN SURROUNDING SECTORS +// +fixed_t P_FindLowestFloorSurrounding(sector_t* sec) +{ + int i; + line_t* check; + sector_t* other; + fixed_t floor = sec->floorheight; + + for (i=0 ;i < sec->linecount ; i++) + { + check = sec->lines[i]; + other = getNextSector(check,sec); + + if (!other) + continue; + + if (other->floorheight < floor) + floor = other->floorheight; + } + return floor; +} + + + +// +// P_FindHighestFloorSurrounding() +// FIND HIGHEST FLOOR HEIGHT IN SURROUNDING SECTORS +// +fixed_t P_FindHighestFloorSurrounding(sector_t *sec) +{ + int i; + line_t* check; + sector_t* other; + fixed_t floor = -500*FRACUNIT; + + for (i=0 ;i < sec->linecount ; i++) + { + check = sec->lines[i]; + other = getNextSector(check,sec); + + if (!other) + continue; + + if (other->floorheight > floor) + floor = other->floorheight; + } + return floor; +} + + + +// +// P_FindNextHighestFloor +// FIND NEXT HIGHEST FLOOR IN SURROUNDING SECTORS +// Note: this should be doable w/o a fixed array. + +// Thanks to entryway for the Vanilla overflow emulation. + +// 20 adjoining sectors max! +#define MAX_ADJOINING_SECTORS 20 + +fixed_t +P_FindNextHighestFloor +( sector_t* sec, + int currentheight ) +{ + int i; + int h; + int min; + line_t* check; + sector_t* other; + fixed_t height = currentheight; + fixed_t heightlist[MAX_ADJOINING_SECTORS + 2]; + + for (i=0, h=0; i < sec->linecount; i++) + { + check = sec->lines[i]; + other = getNextSector(check,sec); + + if (!other) + continue; + + if (other->floorheight > height) + { + // Emulation of memory (stack) overflow + if (h == MAX_ADJOINING_SECTORS + 1) + { + height = other->floorheight; + } + else if (h == MAX_ADJOINING_SECTORS + 2) + { + // Fatal overflow: game crashes at 22 textures + I_Error("Sector with more than 22 adjoining sectors. " + "Vanilla will crash here"); + } + + heightlist[h++] = other->floorheight; + } + } + + // Find lowest height in list + if (!h) + { + return currentheight; + } + + min = heightlist[0]; + + // Range checking? + for (i = 1; i < h; i++) + { + if (heightlist[i] < min) + { + min = heightlist[i]; + } + } + + return min; +} + +// +// FIND LOWEST CEILING IN THE SURROUNDING SECTORS +// +fixed_t +P_FindLowestCeilingSurrounding(sector_t* sec) +{ + int i; + line_t* check; + sector_t* other; + fixed_t height = INT_MAX; + + for (i=0 ;i < sec->linecount ; i++) + { + check = sec->lines[i]; + other = getNextSector(check,sec); + + if (!other) + continue; + + if (other->ceilingheight < height) + height = other->ceilingheight; + } + return height; +} + + +// +// FIND HIGHEST CEILING IN THE SURROUNDING SECTORS +// +fixed_t P_FindHighestCeilingSurrounding(sector_t* sec) +{ + int i; + line_t* check; + sector_t* other; + fixed_t height = 0; + + for (i=0 ;i < sec->linecount ; i++) + { + check = sec->lines[i]; + other = getNextSector(check,sec); + + if (!other) + continue; + + if (other->ceilingheight > height) + height = other->ceilingheight; + } + return height; +} + + + +// +// RETURN NEXT SECTOR # THAT LINE TAG REFERS TO +// +int +P_FindSectorFromLineTag +( line_t* line, + int start ) +{ + int i; + + for (i=start+1;itag) + return i; + + return -1; +} + + + + +// +// Find minimum light from an adjacent sector +// +int +P_FindMinSurroundingLight +( sector_t* sector, + int max ) +{ + int i; + int min; + line_t* line; + sector_t* check; + + min = max; + for (i=0 ; i < sector->linecount ; i++) + { + line = sector->lines[i]; + check = getNextSector(line,sector); + + if (!check) + continue; + + if (check->lightlevel < min) + min = check->lightlevel; + } + return min; +} + + + +// +// EVENTS +// Events are operations triggered by using, crossing, +// or shooting special lines, or by timed thinkers. +// + +// +// P_CrossSpecialLine - TRIGGER +// Called every time a thing origin is about +// to cross a line with a non 0 special. +// +void +P_CrossSpecialLine +( int linenum, + int side, + mobj_t* thing ) +{ + line_t* line; + int ok; + + line = &lines[linenum]; + + // Triggers that other things can activate + if (!thing->player) + { + // Things that should NOT trigger specials... + switch(thing->type) + { + case MT_ROCKET: + case MT_PLASMA: + case MT_BFG: + case MT_TROOPSHOT: + case MT_HEADSHOT: + case MT_BRUISERSHOT: + return; + break; + + default: break; + } + + ok = 0; + switch(line->special) + { + case 39: // TELEPORT TRIGGER + case 97: // TELEPORT RETRIGGER + case 125: // TELEPORT MONSTERONLY TRIGGER + case 126: // TELEPORT MONSTERONLY RETRIGGER + case 4: // RAISE DOOR + case 10: // PLAT DOWN-WAIT-UP-STAY TRIGGER + case 88: // PLAT DOWN-WAIT-UP-STAY RETRIGGER + ok = 1; + break; + } + if (!ok) + return; + } + + + // Note: could use some const's here. + switch (line->special) + { + // TRIGGERS. + // All from here to RETRIGGERS. + case 2: + // Open Door + EV_DoDoor(line,vld_open); + line->special = 0; + break; + + case 3: + // Close Door + EV_DoDoor(line,vld_close); + line->special = 0; + break; + + case 4: + // Raise Door + EV_DoDoor(line,vld_normal); + line->special = 0; + break; + + case 5: + // Raise Floor + EV_DoFloor(line,raiseFloor); + line->special = 0; + break; + + case 6: + // Fast Ceiling Crush & Raise + EV_DoCeiling(line,fastCrushAndRaise); + line->special = 0; + break; + + case 8: + // Build Stairs + EV_BuildStairs(line,build8); + line->special = 0; + break; + + case 10: + // PlatDownWaitUp + EV_DoPlat(line,downWaitUpStay,0); + line->special = 0; + break; + + case 12: + // Light Turn On - brightest near + EV_LightTurnOn(line,0); + line->special = 0; + break; + + case 13: + // Light Turn On 255 + EV_LightTurnOn(line,255); + line->special = 0; + break; + + case 16: + // Close Door 30 + EV_DoDoor(line,vld_close30ThenOpen); + line->special = 0; + break; + + case 17: + // Start Light Strobing + EV_StartLightStrobing(line); + line->special = 0; + break; + + case 19: + // Lower Floor + EV_DoFloor(line,lowerFloor); + line->special = 0; + break; + + case 22: + // Raise floor to nearest height and change texture + EV_DoPlat(line,raiseToNearestAndChange,0); + line->special = 0; + break; + + case 25: + // Ceiling Crush and Raise + EV_DoCeiling(line,crushAndRaise); + line->special = 0; + break; + + case 30: + // Raise floor to shortest texture height + // on either side of lines. + EV_DoFloor(line,raiseToTexture); + line->special = 0; + break; + + case 35: + // Lights Very Dark + EV_LightTurnOn(line,35); + line->special = 0; + break; + + case 36: + // Lower Floor (TURBO) + EV_DoFloor(line,turboLower); + line->special = 0; + break; + + case 37: + // LowerAndChange + EV_DoFloor(line,lowerAndChange); + line->special = 0; + break; + + case 38: + // Lower Floor To Lowest + EV_DoFloor( line, lowerFloorToLowest ); + line->special = 0; + break; + + case 39: + // TELEPORT! + EV_Teleport( line, side, thing ); + line->special = 0; + break; + + case 40: + // RaiseCeilingLowerFloor + EV_DoCeiling( line, raiseToHighest ); + EV_DoFloor( line, lowerFloorToLowest ); + line->special = 0; + break; + + case 44: + // Ceiling Crush + EV_DoCeiling( line, lowerAndCrush ); + line->special = 0; + break; + + case 52: + // EXIT! + G_ExitLevel (); + break; + + case 53: + // Perpetual Platform Raise + EV_DoPlat(line,perpetualRaise,0); + line->special = 0; + break; + + case 54: + // Platform Stop + EV_StopPlat(line); + line->special = 0; + break; + + case 56: + // Raise Floor Crush + EV_DoFloor(line,raiseFloorCrush); + line->special = 0; + break; + + case 57: + // Ceiling Crush Stop + EV_CeilingCrushStop(line); + line->special = 0; + break; + + case 58: + // Raise Floor 24 + EV_DoFloor(line,raiseFloor24); + line->special = 0; + break; + + case 59: + // Raise Floor 24 And Change + EV_DoFloor(line,raiseFloor24AndChange); + line->special = 0; + break; + + case 104: + // Turn lights off in sector(tag) + EV_TurnTagLightsOff(line); + line->special = 0; + break; + + case 108: + // Blazing Door Raise (faster than TURBO!) + EV_DoDoor (line,vld_blazeRaise); + line->special = 0; + break; + + case 109: + // Blazing Door Open (faster than TURBO!) + EV_DoDoor (line,vld_blazeOpen); + line->special = 0; + break; + + case 100: + // Build Stairs Turbo 16 + EV_BuildStairs(line,turbo16); + line->special = 0; + break; + + case 110: + // Blazing Door Close (faster than TURBO!) + EV_DoDoor (line,vld_blazeClose); + line->special = 0; + break; + + case 119: + // Raise floor to nearest surr. floor + EV_DoFloor(line,raiseFloorToNearest); + line->special = 0; + break; + + case 121: + // Blazing PlatDownWaitUpStay + EV_DoPlat(line,blazeDWUS,0); + line->special = 0; + break; + + case 124: + // Secret EXIT + G_SecretExitLevel (); + break; + + case 125: + // TELEPORT MonsterONLY + if (!thing->player) + { + EV_Teleport( line, side, thing ); + line->special = 0; + } + break; + + case 130: + // Raise Floor Turbo + EV_DoFloor(line,raiseFloorTurbo); + line->special = 0; + break; + + case 141: + // Silent Ceiling Crush & Raise + EV_DoCeiling(line,silentCrushAndRaise); + line->special = 0; + break; + + // RETRIGGERS. All from here till end. + case 72: + // Ceiling Crush + EV_DoCeiling( line, lowerAndCrush ); + break; + + case 73: + // Ceiling Crush and Raise + EV_DoCeiling(line,crushAndRaise); + break; + + case 74: + // Ceiling Crush Stop + EV_CeilingCrushStop(line); + break; + + case 75: + // Close Door + EV_DoDoor(line,vld_close); + break; + + case 76: + // Close Door 30 + EV_DoDoor(line,vld_close30ThenOpen); + break; + + case 77: + // Fast Ceiling Crush & Raise + EV_DoCeiling(line,fastCrushAndRaise); + break; + + case 79: + // Lights Very Dark + EV_LightTurnOn(line,35); + break; + + case 80: + // Light Turn On - brightest near + EV_LightTurnOn(line,0); + break; + + case 81: + // Light Turn On 255 + EV_LightTurnOn(line,255); + break; + + case 82: + // Lower Floor To Lowest + EV_DoFloor( line, lowerFloorToLowest ); + break; + + case 83: + // Lower Floor + EV_DoFloor(line,lowerFloor); + break; + + case 84: + // LowerAndChange + EV_DoFloor(line,lowerAndChange); + break; + + case 86: + // Open Door + EV_DoDoor(line,vld_open); + break; + + case 87: + // Perpetual Platform Raise + EV_DoPlat(line,perpetualRaise,0); + break; + + case 88: + // PlatDownWaitUp + EV_DoPlat(line,downWaitUpStay,0); + break; + + case 89: + // Platform Stop + EV_StopPlat(line); + break; + + case 90: + // Raise Door + EV_DoDoor(line,vld_normal); + break; + + case 91: + // Raise Floor + EV_DoFloor(line,raiseFloor); + break; + + case 92: + // Raise Floor 24 + EV_DoFloor(line,raiseFloor24); + break; + + case 93: + // Raise Floor 24 And Change + EV_DoFloor(line,raiseFloor24AndChange); + break; + + case 94: + // Raise Floor Crush + EV_DoFloor(line,raiseFloorCrush); + break; + + case 95: + // Raise floor to nearest height + // and change texture. + EV_DoPlat(line,raiseToNearestAndChange,0); + break; + + case 96: + // Raise floor to shortest texture height + // on either side of lines. + EV_DoFloor(line,raiseToTexture); + break; + + case 97: + // TELEPORT! + EV_Teleport( line, side, thing ); + break; + + case 98: + // Lower Floor (TURBO) + EV_DoFloor(line,turboLower); + break; + + case 105: + // Blazing Door Raise (faster than TURBO!) + EV_DoDoor (line,vld_blazeRaise); + break; + + case 106: + // Blazing Door Open (faster than TURBO!) + EV_DoDoor (line,vld_blazeOpen); + break; + + case 107: + // Blazing Door Close (faster than TURBO!) + EV_DoDoor (line,vld_blazeClose); + break; + + case 120: + // Blazing PlatDownWaitUpStay. + EV_DoPlat(line,blazeDWUS,0); + break; + + case 126: + // TELEPORT MonsterONLY. + if (!thing->player) + EV_Teleport( line, side, thing ); + break; + + case 128: + // Raise To Nearest Floor + EV_DoFloor(line,raiseFloorToNearest); + break; + + case 129: + // Raise Floor Turbo + EV_DoFloor(line,raiseFloorTurbo); + break; + } +} + + + +// +// P_ShootSpecialLine - IMPACT SPECIALS +// Called when a thing shoots a special line. +// +void +P_ShootSpecialLine +( mobj_t* thing, + line_t* line ) +{ + int ok; + + // Impacts that other things can activate. + if (!thing->player) + { + ok = 0; + switch(line->special) + { + case 46: + // OPEN DOOR IMPACT + ok = 1; + break; + } + if (!ok) + return; + } + + switch(line->special) + { + case 24: + // RAISE FLOOR + EV_DoFloor(line,raiseFloor); + P_ChangeSwitchTexture(line,0); + break; + + case 46: + // OPEN DOOR + EV_DoDoor(line,vld_open); + P_ChangeSwitchTexture(line,1); + break; + + case 47: + // RAISE FLOOR NEAR AND CHANGE + EV_DoPlat(line,raiseToNearestAndChange,0); + P_ChangeSwitchTexture(line,0); + break; + } +} + + + +// +// P_PlayerInSpecialSector +// Called every tic frame +// that the player origin is in a special sector +// +void P_PlayerInSpecialSector (player_t* player) +{ + sector_t* sector; + + sector = player->mo->subsector->sector; + + // Falling, not all the way down yet? + if (player->mo->z != sector->floorheight) + return; + + // Has hitten ground. + switch (sector->special) + { + case 5: + // HELLSLIME DAMAGE + if (!player->powers[pw_ironfeet]) + if (!(leveltime&0x1f)) + P_DamageMobj (player->mo, NULL, NULL, 10); + break; + + case 7: + // NUKAGE DAMAGE + if (!player->powers[pw_ironfeet]) + if (!(leveltime&0x1f)) + P_DamageMobj (player->mo, NULL, NULL, 5); + break; + + case 16: + // SUPER HELLSLIME DAMAGE + case 4: + // STROBE HURT + if (!player->powers[pw_ironfeet] + || (P_Random()<5) ) + { + if (!(leveltime&0x1f)) + P_DamageMobj (player->mo, NULL, NULL, 20); + } + break; + + case 9: + // SECRET SECTOR + player->secretcount++; + sector->special = 0; + break; + + case 11: + // EXIT SUPER DAMAGE! (for E1M8 finale) + player->cheats &= ~CF_GODMODE; + + if (!(leveltime&0x1f)) + P_DamageMobj (player->mo, NULL, NULL, 20); + + if (player->health <= 10) + G_ExitLevel(); + break; + + default: + I_Error ("P_PlayerInSpecialSector: " + "unknown special %i", + sector->special); + break; + }; +} + + + + +// +// P_UpdateSpecials +// Animate planes, scroll walls, etc. +// +boolean levelTimer; +int levelTimeCount; + +void P_UpdateSpecials (void) +{ + anim_t* anim; + int pic; + int i; + line_t* line; + + + // LEVEL TIMER + if (levelTimer == true) + { + levelTimeCount--; + if (!levelTimeCount) + G_ExitLevel(); + } + + // ANIMATE FLATS AND TEXTURES GLOBALLY + for (anim = anims ; anim < lastanim ; anim++) + { + for (i=anim->basepic ; ibasepic+anim->numpics ; i++) + { + pic = anim->basepic + ( (leveltime/anim->speed + i)%anim->numpics ); + if (anim->istexture) + texturetranslation[i] = pic; + else + flattranslation[i] = pic; + } + } + + + // ANIMATE LINE SPECIALS + for (i = 0; i < numlinespecials; i++) + { + line = linespeciallist[i]; + switch(line->special) + { + case 48: + // EFFECT FIRSTCOL SCROLL + + sides[line->sidenum[0]].textureoffset += FRACUNIT; + break; + } + } + + + // DO BUTTONS + for (i = 0; i < MAXBUTTONS; i++) + if (buttonlist[i].btimer) + { + buttonlist[i].btimer--; + if (!buttonlist[i].btimer) + { + switch(buttonlist[i].where) + { + case top: + sides[buttonlist[i].line->sidenum[0]].toptexture = + buttonlist[i].btexture; + break; + + case middle: + sides[buttonlist[i].line->sidenum[0]].midtexture = + buttonlist[i].btexture; + break; + + case bottom: + sides[buttonlist[i].line->sidenum[0]].bottomtexture = + buttonlist[i].btexture; + break; + } + S_StartSound(&buttonlist[i].soundorg,sfx_swtchn); + memset(&buttonlist[i],0,sizeof(button_t)); + } + } +} + + +// +// Donut overrun emulation +// +// Derived from the code from PrBoom+. Thanks go to Andrey Budko (entryway) +// as usual :-) +// + +#define DONUT_FLOORHEIGHT_DEFAULT 0x00000000 +#define DONUT_FLOORPIC_DEFAULT 0x16 + +static void DonutOverrun(fixed_t *s3_floorheight, short *s3_floorpic, + line_t *line, sector_t *pillar_sector) +{ + static int first = 1; + static int tmp_s3_floorheight; + static int tmp_s3_floorpic; + + extern int numflats; + + if (first) + { + int p; + + // This is the first time we have had an overrun. + first = 0; + + // Default values + tmp_s3_floorheight = DONUT_FLOORHEIGHT_DEFAULT; + tmp_s3_floorpic = DONUT_FLOORPIC_DEFAULT; + + //! + // @category compat + // @arg + // + // Use the specified magic values when emulating behavior caused + // by memory overruns from improperly constructed donuts. + // In Vanilla Doom this can differ depending on the operating + // system. The default (if this option is not specified) is to + // emulate the behavior when running under Windows 98. + + p = M_CheckParmWithArgs("-donut", 2); + + if (p > 0) + { + // Dump of needed memory: (fixed_t)0000:0000 and (short)0000:0008 + // + // C:\>debug + // -d 0:0 + // + // DOS 6.22: + // 0000:0000 (57 92 19 00) F4 06 70 00-(16 00) + // DOS 7.1: + // 0000:0000 (9E 0F C9 00) 65 04 70 00-(16 00) + // Win98: + // 0000:0000 (00 00 00 00) 65 04 70 00-(16 00) + // DOSBox under XP: + // 0000:0000 (00 00 00 F1) ?? ?? ?? 00-(07 00) + + M_StrToInt(myargv[p + 1], &tmp_s3_floorheight); + M_StrToInt(myargv[p + 2], &tmp_s3_floorpic); + + if (tmp_s3_floorpic >= numflats) + { + fprintf(stderr, + "DonutOverrun: The second parameter for \"-donut\" " + "switch should be greater than 0 and less than number " + "of flats (%d). Using default value (%d) instead. \n", + numflats, DONUT_FLOORPIC_DEFAULT); + tmp_s3_floorpic = DONUT_FLOORPIC_DEFAULT; + } + } + } + + /* + fprintf(stderr, + "Linedef: %d; Sector: %d; " + "New floor height: %d; New floor pic: %d\n", + line->iLineID, pillar_sector->iSectorID, + tmp_s3_floorheight >> 16, tmp_s3_floorpic); + */ + + *s3_floorheight = (fixed_t) tmp_s3_floorheight; + *s3_floorpic = (short) tmp_s3_floorpic; +} + + +// +// Special Stuff that can not be categorized +// +int EV_DoDonut(line_t* line) +{ + sector_t* s1; + sector_t* s2; + sector_t* s3; + int secnum; + int rtn; + int i; + floormove_t* floor; + fixed_t s3_floorheight; + short s3_floorpic; + + secnum = -1; + rtn = 0; + while ((secnum = P_FindSectorFromLineTag(line,secnum)) >= 0) + { + s1 = §ors[secnum]; + + // ALREADY MOVING? IF SO, KEEP GOING... + if (s1->specialdata) + continue; + + rtn = 1; + s2 = getNextSector(s1->lines[0],s1); + + // Vanilla Doom does not check if the linedef is one sided. The + // game does not crash, but reads invalid memory and causes the + // sector floor to move "down" to some unknown height. + // DOSbox prints a warning about an invalid memory access. + // + // I'm not sure exactly what invalid memory is being read. This + // isn't something that should be done, anyway. + // Just print a warning and return. + + if (s2 == NULL) + { + fprintf(stderr, + "EV_DoDonut: linedef had no second sidedef! " + "Unexpected behavior may occur in Vanilla Doom. \n"); + break; + } + + for (i = 0; i < s2->linecount; i++) + { + s3 = s2->lines[i]->backsector; + + if (s3 == s1) + continue; + + if (s3 == NULL) + { + // e6y + // s3 is NULL, so + // s3->floorheight is an int at 0000:0000 + // s3->floorpic is a short at 0000:0008 + // Trying to emulate + + fprintf(stderr, + "EV_DoDonut: WARNING: emulating buffer overrun due to " + "NULL back sector. " + "Unexpected behavior may occur in Vanilla Doom.\n"); + + DonutOverrun(&s3_floorheight, &s3_floorpic, line, s1); + } + else + { + s3_floorheight = s3->floorheight; + s3_floorpic = s3->floorpic; + } + + // Spawn rising slime + floor = Z_Malloc (sizeof(*floor), PU_LEVSPEC, 0); + P_AddThinker (&floor->thinker); + s2->specialdata = floor; + floor->thinker.function.acp1 = (actionf_p1) T_MoveFloor; + floor->type = donutRaise; + floor->crush = false; + floor->direction = 1; + floor->sector = s2; + floor->speed = FLOORSPEED / 2; + floor->texture = s3_floorpic; + floor->newspecial = 0; + floor->floordestheight = s3_floorheight; + + // Spawn lowering donut-hole + floor = Z_Malloc (sizeof(*floor), PU_LEVSPEC, 0); + P_AddThinker (&floor->thinker); + s1->specialdata = floor; + floor->thinker.function.acp1 = (actionf_p1) T_MoveFloor; + floor->type = lowerFloor; + floor->crush = false; + floor->direction = -1; + floor->sector = s1; + floor->speed = FLOORSPEED / 2; + floor->floordestheight = s3_floorheight; + break; + } + } + return rtn; +} + + + +// +// SPECIAL SPAWNING +// + +// +// P_SpawnSpecials +// After the map has been loaded, scan for specials +// that spawn thinkers +// +short numlinespecials; +line_t* linespeciallist[MAXLINEANIMS]; + + +// Parses command line parameters. +void P_SpawnSpecials (void) +{ + sector_t* sector; + int i; + + // See if -TIMER was specified. + + if (timelimit > 0 && deathmatch) + { + levelTimer = true; + levelTimeCount = timelimit * 60 * TICRATE; + } + else + { + levelTimer = false; + } + + // Init special SECTORs. + sector = sectors; + for (i=0 ; ispecial) + continue; + + switch (sector->special) + { + case 1: + // FLICKERING LIGHTS + P_SpawnLightFlash (sector); + break; + + case 2: + // STROBE FAST + P_SpawnStrobeFlash(sector,FASTDARK,0); + break; + + case 3: + // STROBE SLOW + P_SpawnStrobeFlash(sector,SLOWDARK,0); + break; + + case 4: + // STROBE FAST/DEATH SLIME + P_SpawnStrobeFlash(sector,FASTDARK,0); + sector->special = 4; + break; + + case 8: + // GLOWING LIGHT + P_SpawnGlowingLight(sector); + break; + case 9: + // SECRET SECTOR + totalsecret++; + break; + + case 10: + // DOOR CLOSE IN 30 SECONDS + P_SpawnDoorCloseIn30 (sector); + break; + + case 12: + // SYNC STROBE SLOW + P_SpawnStrobeFlash (sector, SLOWDARK, 1); + break; + + case 13: + // SYNC STROBE FAST + P_SpawnStrobeFlash (sector, FASTDARK, 1); + break; + + case 14: + // DOOR RAISE IN 5 MINUTES + P_SpawnDoorRaiseIn5Mins (sector, i); + break; + + case 17: + P_SpawnFireFlicker(sector); + break; + } + } + + + // Init line EFFECTs + numlinespecials = 0; + for (i = 0;i < numlines; i++) + { + switch(lines[i].special) + { + case 48: + if (numlinespecials >= MAXLINEANIMS) + { + I_Error("Too many scrolling wall linedefs! " + "(Vanilla limit is 64)"); + } + // EFFECT FIRSTCOL SCROLL+ + linespeciallist[numlinespecials] = &lines[i]; + numlinespecials++; + break; + } + } + + + // Init other misc stuff + for (i = 0;i < MAXCEILINGS;i++) + activeceilings[i] = NULL; + + for (i = 0;i < MAXPLATS;i++) + activeplats[i] = NULL; + + for (i = 0;i < MAXBUTTONS;i++) + memset(&buttonlist[i],0,sizeof(button_t)); + + // UNUSED: no horizonal sliders. + // P_InitSlidingDoorFrames(); +} diff --git a/firmware_p4/components/Applications/doom/p_spec.h b/firmware_p4/components/Applications/doom/p_spec.h new file mode 100644 index 000000000..a1343bfa3 --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_spec.h @@ -0,0 +1,637 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: none +// Implements special effects: +// Texture animation, height or lighting changes +// according to adjacent sectors, respective +// utility functions, etc. +// + + +#ifndef __P_SPEC__ +#define __P_SPEC__ + + +// +// End-level timer (-TIMER option) +// +extern boolean levelTimer; +extern int levelTimeCount; + + +// Define values for map objects +#define MO_TELEPORTMAN 14 + + +// at game start +void P_InitPicAnims (void); + +// at map load +void P_SpawnSpecials (void); + +// every tic +void P_UpdateSpecials (void); + +// when needed +boolean +P_UseSpecialLine +( mobj_t* thing, + line_t* line, + int side ); + +void +P_ShootSpecialLine +( mobj_t* thing, + line_t* line ); + +void +P_CrossSpecialLine +( int linenum, + int side, + mobj_t* thing ); + +void P_PlayerInSpecialSector (player_t* player); + +int +twoSided +( int sector, + int line ); + +sector_t* +getSector +( int currentSector, + int line, + int side ); + +side_t* +getSide +( int currentSector, + int line, + int side ); + +fixed_t P_FindLowestFloorSurrounding(sector_t* sec); +fixed_t P_FindHighestFloorSurrounding(sector_t* sec); + +fixed_t +P_FindNextHighestFloor +( sector_t* sec, + int currentheight ); + +fixed_t P_FindLowestCeilingSurrounding(sector_t* sec); +fixed_t P_FindHighestCeilingSurrounding(sector_t* sec); + +int +P_FindSectorFromLineTag +( line_t* line, + int start ); + +int +P_FindMinSurroundingLight +( sector_t* sector, + int max ); + +sector_t* +getNextSector +( line_t* line, + sector_t* sec ); + + +// +// SPECIAL +// +int EV_DoDonut(line_t* line); + + + +// +// P_LIGHTS +// +typedef struct +{ + thinker_t thinker; + sector_t* sector; + int count; + int maxlight; + int minlight; + +} fireflicker_t; + + + +typedef struct +{ + thinker_t thinker; + sector_t* sector; + int count; + int maxlight; + int minlight; + int maxtime; + int mintime; + +} lightflash_t; + + + +typedef struct +{ + thinker_t thinker; + sector_t* sector; + int count; + int minlight; + int maxlight; + int darktime; + int brighttime; + +} strobe_t; + + + + +typedef struct +{ + thinker_t thinker; + sector_t* sector; + int minlight; + int maxlight; + int direction; + +} glow_t; + + +#define GLOWSPEED 8 +#define STROBEBRIGHT 5 +#define FASTDARK 15 +#define SLOWDARK 35 + +void P_SpawnFireFlicker (sector_t* sector); +void T_LightFlash (lightflash_t* flash); +void P_SpawnLightFlash (sector_t* sector); +void T_StrobeFlash (strobe_t* flash); + +void +P_SpawnStrobeFlash +( sector_t* sector, + int fastOrSlow, + int inSync ); + +void EV_StartLightStrobing(line_t* line); +void EV_TurnTagLightsOff(line_t* line); + +void +EV_LightTurnOn +( line_t* line, + int bright ); + +void T_Glow(glow_t* g); +void P_SpawnGlowingLight(sector_t* sector); + + + + +// +// P_SWITCH +// +typedef struct +{ + char name1[9]; + char name2[9]; + short episode; + +} switchlist_t; + + +typedef enum +{ + top, + middle, + bottom + +} bwhere_e; + + +typedef struct +{ + line_t* line; + bwhere_e where; + int btexture; + int btimer; + degenmobj_t *soundorg; + +} button_t; + + + + + // max # of wall switches in a level +#define MAXSWITCHES 50 + + // 4 players, 4 buttons each at once, max. +#define MAXBUTTONS 16 + + // 1 second, in ticks. +#define BUTTONTIME 35 + +extern button_t buttonlist[MAXBUTTONS]; + +void +P_ChangeSwitchTexture +( line_t* line, + int useAgain ); + +void P_InitSwitchList(void); + + +// +// P_PLATS +// +typedef enum +{ + up, + down, + waiting, + in_stasis + +} plat_e; + + + +typedef enum +{ + perpetualRaise, + downWaitUpStay, + raiseAndChange, + raiseToNearestAndChange, + blazeDWUS + +} plattype_e; + + + +typedef struct +{ + thinker_t thinker; + sector_t* sector; + fixed_t speed; + fixed_t low; + fixed_t high; + int wait; + int count; + plat_e status; + plat_e oldstatus; + boolean crush; + int tag; + plattype_e type; + +} plat_t; + + + +#define PLATWAIT 3 +#define PLATSPEED FRACUNIT +#define MAXPLATS 30 + + +extern plat_t* activeplats[MAXPLATS]; + +void T_PlatRaise(plat_t* plat); + +int +EV_DoPlat +( line_t* line, + plattype_e type, + int amount ); + +void P_AddActivePlat(plat_t* plat); +void P_RemoveActivePlat(plat_t* plat); +void EV_StopPlat(line_t* line); +void P_ActivateInStasis(int tag); + + +// +// P_DOORS +// +typedef enum +{ + vld_normal, + vld_close30ThenOpen, + vld_close, + vld_open, + vld_raiseIn5Mins, + vld_blazeRaise, + vld_blazeOpen, + vld_blazeClose + +} vldoor_e; + + + +typedef struct +{ + thinker_t thinker; + vldoor_e type; + sector_t* sector; + fixed_t topheight; + fixed_t speed; + + // 1 = up, 0 = waiting at top, -1 = down + int direction; + + // tics to wait at the top + int topwait; + // (keep in case a door going down is reset) + // when it reaches 0, start going down + int topcountdown; + +} vldoor_t; + + + +#define VDOORSPEED FRACUNIT*2 +#define VDOORWAIT 150 + +void +EV_VerticalDoor +( line_t* line, + mobj_t* thing ); + +int +EV_DoDoor +( line_t* line, + vldoor_e type ); + +int +EV_DoLockedDoor +( line_t* line, + vldoor_e type, + mobj_t* thing ); + +void T_VerticalDoor (vldoor_t* door); +void P_SpawnDoorCloseIn30 (sector_t* sec); + +void +P_SpawnDoorRaiseIn5Mins +( sector_t* sec, + int secnum ); + + + +#if 0 // UNUSED +// +// Sliding doors... +// +typedef enum +{ + sd_opening, + sd_waiting, + sd_closing + +} sd_e; + + + +typedef enum +{ + sdt_openOnly, + sdt_closeOnly, + sdt_openAndClose + +} sdt_e; + + + + +typedef struct +{ + thinker_t thinker; + sdt_e type; + line_t* line; + int frame; + int whichDoorIndex; + int timer; + sector_t* frontsector; + sector_t* backsector; + sd_e status; + +} slidedoor_t; + + + +typedef struct +{ + char frontFrame1[9]; + char frontFrame2[9]; + char frontFrame3[9]; + char frontFrame4[9]; + char backFrame1[9]; + char backFrame2[9]; + char backFrame3[9]; + char backFrame4[9]; + +} slidename_t; + + + +typedef struct +{ + int frontFrames[4]; + int backFrames[4]; + +} slideframe_t; + + + +// how many frames of animation +#define SNUMFRAMES 4 + +#define SDOORWAIT 35*3 +#define SWAITTICS 4 + +// how many diff. types of anims +#define MAXSLIDEDOORS 5 + +void P_InitSlidingDoorFrames(void); + +void +EV_SlidingDoor +( line_t* line, + mobj_t* thing ); +#endif + + + +// +// P_CEILNG +// +typedef enum +{ + lowerToFloor, + raiseToHighest, + lowerAndCrush, + crushAndRaise, + fastCrushAndRaise, + silentCrushAndRaise + +} ceiling_e; + + + +typedef struct +{ + thinker_t thinker; + ceiling_e type; + sector_t* sector; + fixed_t bottomheight; + fixed_t topheight; + fixed_t speed; + boolean crush; + + // 1 = up, 0 = waiting, -1 = down + int direction; + + // ID + int tag; + int olddirection; + +} ceiling_t; + + + + + +#define CEILSPEED FRACUNIT +#define CEILWAIT 150 +#define MAXCEILINGS 30 + +extern ceiling_t* activeceilings[MAXCEILINGS]; + +int +EV_DoCeiling +( line_t* line, + ceiling_e type ); + +void T_MoveCeiling (ceiling_t* ceiling); +void P_AddActiveCeiling(ceiling_t* c); +void P_RemoveActiveCeiling(ceiling_t* c); +int EV_CeilingCrushStop(line_t* line); +void P_ActivateInStasisCeiling(line_t* line); + + +// +// P_FLOOR +// +typedef enum +{ + // lower floor to highest surrounding floor + lowerFloor, + + // lower floor to lowest surrounding floor + lowerFloorToLowest, + + // lower floor to highest surrounding floor VERY FAST + turboLower, + + // raise floor to lowest surrounding CEILING + raiseFloor, + + // raise floor to next highest surrounding floor + raiseFloorToNearest, + + // raise floor to shortest height texture around it + raiseToTexture, + + // lower floor to lowest surrounding floor + // and change floorpic + lowerAndChange, + + raiseFloor24, + raiseFloor24AndChange, + raiseFloorCrush, + + // raise to next highest floor, turbo-speed + raiseFloorTurbo, + donutRaise, + raiseFloor512 + +} floor_e; + + + + +typedef enum +{ + build8, // slowly build by 8 + turbo16 // quickly build by 16 + +} stair_e; + + + +typedef struct +{ + thinker_t thinker; + floor_e type; + boolean crush; + sector_t* sector; + int direction; + int newspecial; + short texture; + fixed_t floordestheight; + fixed_t speed; + +} floormove_t; + + + +#define FLOORSPEED FRACUNIT + +typedef enum +{ + ok, + crushed, + pastdest + +} result_e; + +result_e +T_MovePlane +( sector_t* sector, + fixed_t speed, + fixed_t dest, + boolean crush, + int floorOrCeiling, + int direction ); + +int +EV_BuildStairs +( line_t* line, + stair_e type ); + +int +EV_DoFloor +( line_t* line, + floor_e floortype ); + +void T_MoveFloor( floormove_t* floor); + +// +// P_TELEPT +// +int +EV_Teleport +( line_t* line, + int side, + mobj_t* thing ); + +#endif diff --git a/firmware_p4/components/Applications/doom/p_switch.c b/firmware_p4/components/Applications/doom/p_switch.c new file mode 100644 index 000000000..ed4feeca0 --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_switch.c @@ -0,0 +1,648 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// +// DESCRIPTION: +// Switches, buttons. Two-state animation. Exits. +// + +#include + +#include "i_system.h" +#include "deh_main.h" +#include "doomdef.h" +#include "p_local.h" + +#include "g_game.h" + +#include "s_sound.h" + +// Data. +#include "sounds.h" + +// State. +#include "doomstat.h" +#include "r_state.h" + + +// +// CHANGE THE TEXTURE OF A WALL SWITCH TO ITS OPPOSITE +// +switchlist_t alphSwitchList[] = +{ + // Doom shareware episode 1 switches + {"SW1BRCOM", "SW2BRCOM", 1}, + {"SW1BRN1", "SW2BRN1", 1}, + {"SW1BRN2", "SW2BRN2", 1}, + {"SW1BRNGN", "SW2BRNGN", 1}, + {"SW1BROWN", "SW2BROWN", 1}, + {"SW1COMM", "SW2COMM", 1}, + {"SW1COMP", "SW2COMP", 1}, + {"SW1DIRT", "SW2DIRT", 1}, + {"SW1EXIT", "SW2EXIT", 1}, + {"SW1GRAY", "SW2GRAY", 1}, + {"SW1GRAY1", "SW2GRAY1", 1}, + {"SW1METAL", "SW2METAL", 1}, + {"SW1PIPE", "SW2PIPE", 1}, + {"SW1SLAD", "SW2SLAD", 1}, + {"SW1STARG", "SW2STARG", 1}, + {"SW1STON1", "SW2STON1", 1}, + {"SW1STON2", "SW2STON2", 1}, + {"SW1STONE", "SW2STONE", 1}, + {"SW1STRTN", "SW2STRTN", 1}, + + // Doom registered episodes 2&3 switches + {"SW1BLUE", "SW2BLUE", 2}, + {"SW1CMT", "SW2CMT", 2}, + {"SW1GARG", "SW2GARG", 2}, + {"SW1GSTON", "SW2GSTON", 2}, + {"SW1HOT", "SW2HOT", 2}, + {"SW1LION", "SW2LION", 2}, + {"SW1SATYR", "SW2SATYR", 2}, + {"SW1SKIN", "SW2SKIN", 2}, + {"SW1VINE", "SW2VINE", 2}, + {"SW1WOOD", "SW2WOOD", 2}, + + // Doom II switches + {"SW1PANEL", "SW2PANEL", 3}, + {"SW1ROCK", "SW2ROCK", 3}, + {"SW1MET2", "SW2MET2", 3}, + {"SW1WDMET", "SW2WDMET", 3}, + {"SW1BRIK", "SW2BRIK", 3}, + {"SW1MOD1", "SW2MOD1", 3}, + {"SW1ZIM", "SW2ZIM", 3}, + {"SW1STON6", "SW2STON6", 3}, + {"SW1TEK", "SW2TEK", 3}, + {"SW1MARB", "SW2MARB", 3}, + {"SW1SKULL", "SW2SKULL", 3}, + + {"\0", "\0", 0} +}; + +int switchlist[MAXSWITCHES * 2]; +int numswitches; +button_t buttonlist[MAXBUTTONS]; + +// +// P_InitSwitchList +// Only called at game initialization. +// +void P_InitSwitchList(void) +{ + int i; + int index; + int episode; + + episode = 1; + + if (gamemode == registered || gamemode == retail) + episode = 2; + else + if ( gamemode == commercial ) + episode = 3; + + for (index = 0,i = 0;i < MAXSWITCHES;i++) + { + if (!alphSwitchList[i].episode) + { + numswitches = index/2; + switchlist[index] = -1; + break; + } + + if (alphSwitchList[i].episode <= episode) + { +#if 0 // UNUSED - debug? + int value; + + if (R_CheckTextureNumForName(alphSwitchList[i].name1) < 0) + { + I_Error("Can't find switch texture '%s'!", + alphSwitchList[i].name1); + continue; + } + + value = R_TextureNumForName(alphSwitchList[i].name1); +#endif + switchlist[index++] = R_TextureNumForName(DEH_String(alphSwitchList[i].name1)); + switchlist[index++] = R_TextureNumForName(DEH_String(alphSwitchList[i].name2)); + } + } +} + + +// +// Start a button counting down till it turns off. +// +void +P_StartButton +( line_t* line, + bwhere_e w, + int texture, + int time ) +{ + int i; + + // See if button is already pressed + for (i = 0;i < MAXBUTTONS;i++) + { + if (buttonlist[i].btimer + && buttonlist[i].line == line) + { + + return; + } + } + + + + for (i = 0;i < MAXBUTTONS;i++) + { + if (!buttonlist[i].btimer) + { + buttonlist[i].line = line; + buttonlist[i].where = w; + buttonlist[i].btexture = texture; + buttonlist[i].btimer = time; + buttonlist[i].soundorg = &line->frontsector->soundorg; + return; + } + } + + I_Error("P_StartButton: no button slots left!"); +} + + + + + +// +// Function that changes wall texture. +// Tell it if switch is ok to use again (1=yes, it's a button). +// +void +P_ChangeSwitchTexture +( line_t* line, + int useAgain ) +{ + int texTop; + int texMid; + int texBot; + int i; + int sound; + + if (!useAgain) + line->special = 0; + + texTop = sides[line->sidenum[0]].toptexture; + texMid = sides[line->sidenum[0]].midtexture; + texBot = sides[line->sidenum[0]].bottomtexture; + + sound = sfx_swtchn; + + // EXIT SWITCH? + if (line->special == 11) + sound = sfx_swtchx; + + for (i = 0;i < numswitches*2;i++) + { + if (switchlist[i] == texTop) + { + S_StartSound(buttonlist->soundorg,sound); + sides[line->sidenum[0]].toptexture = switchlist[i^1]; + + if (useAgain) + P_StartButton(line,top,switchlist[i],BUTTONTIME); + + return; + } + else + { + if (switchlist[i] == texMid) + { + S_StartSound(buttonlist->soundorg,sound); + sides[line->sidenum[0]].midtexture = switchlist[i^1]; + + if (useAgain) + P_StartButton(line, middle,switchlist[i],BUTTONTIME); + + return; + } + else + { + if (switchlist[i] == texBot) + { + S_StartSound(buttonlist->soundorg,sound); + sides[line->sidenum[0]].bottomtexture = switchlist[i^1]; + + if (useAgain) + P_StartButton(line, bottom,switchlist[i],BUTTONTIME); + + return; + } + } + } + } +} + + + + + + +// +// P_UseSpecialLine +// Called when a thing uses a special line. +// Only the front sides of lines are usable. +// +boolean +P_UseSpecialLine +( mobj_t* thing, + line_t* line, + int side ) +{ + + // Err... + // Use the back sides of VERY SPECIAL lines... + if (side) + { + switch(line->special) + { + case 124: + // Sliding door open&close + // UNUSED? + break; + + default: + return false; + break; + } + } + + + // Switches that other things can activate. + if (!thing->player) + { + // never open secret doors + if (line->flags & ML_SECRET) + return false; + + switch(line->special) + { + case 1: // MANUAL DOOR RAISE + case 32: // MANUAL BLUE + case 33: // MANUAL RED + case 34: // MANUAL YELLOW + break; + + default: + return false; + break; + } + } + + + // do something + switch (line->special) + { + // MANUALS + case 1: // Vertical Door + case 26: // Blue Door/Locked + case 27: // Yellow Door /Locked + case 28: // Red Door /Locked + + case 31: // Manual door open + case 32: // Blue locked door open + case 33: // Red locked door open + case 34: // Yellow locked door open + + case 117: // Blazing door raise + case 118: // Blazing door open + EV_VerticalDoor (line, thing); + break; + + //UNUSED - Door Slide Open&Close + // case 124: + // EV_SlidingDoor (line, thing); + // break; + + // SWITCHES + case 7: + // Build Stairs + if (EV_BuildStairs(line,build8)) + P_ChangeSwitchTexture(line,0); + break; + + case 9: + // Change Donut + if (EV_DoDonut(line)) + P_ChangeSwitchTexture(line,0); + break; + + case 11: + // Exit level + P_ChangeSwitchTexture(line,0); + G_ExitLevel (); + break; + + case 14: + // Raise Floor 32 and change texture + if (EV_DoPlat(line,raiseAndChange,32)) + P_ChangeSwitchTexture(line,0); + break; + + case 15: + // Raise Floor 24 and change texture + if (EV_DoPlat(line,raiseAndChange,24)) + P_ChangeSwitchTexture(line,0); + break; + + case 18: + // Raise Floor to next highest floor + if (EV_DoFloor(line, raiseFloorToNearest)) + P_ChangeSwitchTexture(line,0); + break; + + case 20: + // Raise Plat next highest floor and change texture + if (EV_DoPlat(line,raiseToNearestAndChange,0)) + P_ChangeSwitchTexture(line,0); + break; + + case 21: + // PlatDownWaitUpStay + if (EV_DoPlat(line,downWaitUpStay,0)) + P_ChangeSwitchTexture(line,0); + break; + + case 23: + // Lower Floor to Lowest + if (EV_DoFloor(line,lowerFloorToLowest)) + P_ChangeSwitchTexture(line,0); + break; + + case 29: + // Raise Door + if (EV_DoDoor(line,vld_normal)) + P_ChangeSwitchTexture(line,0); + break; + + case 41: + // Lower Ceiling to Floor + if (EV_DoCeiling(line,lowerToFloor)) + P_ChangeSwitchTexture(line,0); + break; + + case 71: + // Turbo Lower Floor + if (EV_DoFloor(line,turboLower)) + P_ChangeSwitchTexture(line,0); + break; + + case 49: + // Ceiling Crush And Raise + if (EV_DoCeiling(line,crushAndRaise)) + P_ChangeSwitchTexture(line,0); + break; + + case 50: + // Close Door + if (EV_DoDoor(line,vld_close)) + P_ChangeSwitchTexture(line,0); + break; + + case 51: + // Secret EXIT + P_ChangeSwitchTexture(line,0); + G_SecretExitLevel (); + break; + + case 55: + // Raise Floor Crush + if (EV_DoFloor(line,raiseFloorCrush)) + P_ChangeSwitchTexture(line,0); + break; + + case 101: + // Raise Floor + if (EV_DoFloor(line,raiseFloor)) + P_ChangeSwitchTexture(line,0); + break; + + case 102: + // Lower Floor to Surrounding floor height + if (EV_DoFloor(line,lowerFloor)) + P_ChangeSwitchTexture(line,0); + break; + + case 103: + // Open Door + if (EV_DoDoor(line,vld_open)) + P_ChangeSwitchTexture(line,0); + break; + + case 111: + // Blazing Door Raise (faster than TURBO!) + if (EV_DoDoor (line,vld_blazeRaise)) + P_ChangeSwitchTexture(line,0); + break; + + case 112: + // Blazing Door Open (faster than TURBO!) + if (EV_DoDoor (line,vld_blazeOpen)) + P_ChangeSwitchTexture(line,0); + break; + + case 113: + // Blazing Door Close (faster than TURBO!) + if (EV_DoDoor (line,vld_blazeClose)) + P_ChangeSwitchTexture(line,0); + break; + + case 122: + // Blazing PlatDownWaitUpStay + if (EV_DoPlat(line,blazeDWUS,0)) + P_ChangeSwitchTexture(line,0); + break; + + case 127: + // Build Stairs Turbo 16 + if (EV_BuildStairs(line,turbo16)) + P_ChangeSwitchTexture(line,0); + break; + + case 131: + // Raise Floor Turbo + if (EV_DoFloor(line,raiseFloorTurbo)) + P_ChangeSwitchTexture(line,0); + break; + + case 133: + // BlzOpenDoor BLUE + case 135: + // BlzOpenDoor RED + case 137: + // BlzOpenDoor YELLOW + if (EV_DoLockedDoor (line,vld_blazeOpen,thing)) + P_ChangeSwitchTexture(line,0); + break; + + case 140: + // Raise Floor 512 + if (EV_DoFloor(line,raiseFloor512)) + P_ChangeSwitchTexture(line,0); + break; + + // BUTTONS + case 42: + // Close Door + if (EV_DoDoor(line,vld_close)) + P_ChangeSwitchTexture(line,1); + break; + + case 43: + // Lower Ceiling to Floor + if (EV_DoCeiling(line,lowerToFloor)) + P_ChangeSwitchTexture(line,1); + break; + + case 45: + // Lower Floor to Surrounding floor height + if (EV_DoFloor(line,lowerFloor)) + P_ChangeSwitchTexture(line,1); + break; + + case 60: + // Lower Floor to Lowest + if (EV_DoFloor(line,lowerFloorToLowest)) + P_ChangeSwitchTexture(line,1); + break; + + case 61: + // Open Door + if (EV_DoDoor(line,vld_open)) + P_ChangeSwitchTexture(line,1); + break; + + case 62: + // PlatDownWaitUpStay + if (EV_DoPlat(line,downWaitUpStay,1)) + P_ChangeSwitchTexture(line,1); + break; + + case 63: + // Raise Door + if (EV_DoDoor(line,vld_normal)) + P_ChangeSwitchTexture(line,1); + break; + + case 64: + // Raise Floor to ceiling + if (EV_DoFloor(line,raiseFloor)) + P_ChangeSwitchTexture(line,1); + break; + + case 66: + // Raise Floor 24 and change texture + if (EV_DoPlat(line,raiseAndChange,24)) + P_ChangeSwitchTexture(line,1); + break; + + case 67: + // Raise Floor 32 and change texture + if (EV_DoPlat(line,raiseAndChange,32)) + P_ChangeSwitchTexture(line,1); + break; + + case 65: + // Raise Floor Crush + if (EV_DoFloor(line,raiseFloorCrush)) + P_ChangeSwitchTexture(line,1); + break; + + case 68: + // Raise Plat to next highest floor and change texture + if (EV_DoPlat(line,raiseToNearestAndChange,0)) + P_ChangeSwitchTexture(line,1); + break; + + case 69: + // Raise Floor to next highest floor + if (EV_DoFloor(line, raiseFloorToNearest)) + P_ChangeSwitchTexture(line,1); + break; + + case 70: + // Turbo Lower Floor + if (EV_DoFloor(line,turboLower)) + P_ChangeSwitchTexture(line,1); + break; + + case 114: + // Blazing Door Raise (faster than TURBO!) + if (EV_DoDoor (line,vld_blazeRaise)) + P_ChangeSwitchTexture(line,1); + break; + + case 115: + // Blazing Door Open (faster than TURBO!) + if (EV_DoDoor (line,vld_blazeOpen)) + P_ChangeSwitchTexture(line,1); + break; + + case 116: + // Blazing Door Close (faster than TURBO!) + if (EV_DoDoor (line,vld_blazeClose)) + P_ChangeSwitchTexture(line,1); + break; + + case 123: + // Blazing PlatDownWaitUpStay + if (EV_DoPlat(line,blazeDWUS,0)) + P_ChangeSwitchTexture(line,1); + break; + + case 132: + // Raise Floor Turbo + if (EV_DoFloor(line,raiseFloorTurbo)) + P_ChangeSwitchTexture(line,1); + break; + + case 99: + // BlzOpenDoor BLUE + case 134: + // BlzOpenDoor RED + case 136: + // BlzOpenDoor YELLOW + if (EV_DoLockedDoor (line,vld_blazeOpen,thing)) + P_ChangeSwitchTexture(line,1); + break; + + case 138: + // Light Turn On + EV_LightTurnOn(line,255); + P_ChangeSwitchTexture(line,1); + break; + + case 139: + // Light Turn Off + EV_LightTurnOn(line,35); + P_ChangeSwitchTexture(line,1); + break; + + } + + return true; +} + diff --git a/firmware_p4/components/Applications/doom/p_telept.c b/firmware_p4/components/Applications/doom/p_telept.c new file mode 100644 index 000000000..45cdfb016 --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_telept.c @@ -0,0 +1,133 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Teleportation. +// + + + + +#include "doomdef.h" +#include "doomstat.h" + +#include "s_sound.h" + +#include "p_local.h" + + +// Data. +#include "sounds.h" + +// State. +#include "r_state.h" + + + +// +// TELEPORTATION +// +int +EV_Teleport +( line_t* line, + int side, + mobj_t* thing ) +{ + int i; + int tag; + mobj_t* m; + mobj_t* fog; + unsigned an; + thinker_t* thinker; + sector_t* sector; + fixed_t oldx; + fixed_t oldy; + fixed_t oldz; + + // don't teleport missiles + if (thing->flags & MF_MISSILE) + return 0; + + // Don't teleport if hit back of line, + // so you can get out of teleporter. + if (side == 1) + return 0; + + + tag = line->tag; + for (i = 0; i < numsectors; i++) + { + if (sectors[ i ].tag == tag ) + { + thinker = thinkercap.next; + for (thinker = thinkercap.next; + thinker != &thinkercap; + thinker = thinker->next) + { + // not a mobj + if (thinker->function.acp1 != (actionf_p1)P_MobjThinker) + continue; + + m = (mobj_t *)thinker; + + // not a teleportman + if (m->type != MT_TELEPORTMAN ) + continue; + + sector = m->subsector->sector; + // wrong sector + if (sector-sectors != i ) + continue; + + oldx = thing->x; + oldy = thing->y; + oldz = thing->z; + + if (!P_TeleportMove (thing, m->x, m->y)) + return 0; + + // The first Final Doom executable does not set thing->z + // when teleporting. This quirk is unique to this + // particular version; the later version included in + // some versions of the Id Anthology fixed this. + + if (gameversion != exe_final) + thing->z = thing->floorz; + + if (thing->player) + thing->player->viewz = thing->z+thing->player->viewheight; + + // spawn teleport fog at source and destination + fog = P_SpawnMobj (oldx, oldy, oldz, MT_TFOG); + S_StartSound (fog, sfx_telept); + an = m->angle >> ANGLETOFINESHIFT; + fog = P_SpawnMobj (m->x+20*finecosine[an], m->y+20*finesine[an] + , thing->z, MT_TFOG); + + // emit sound, where? + S_StartSound (fog, sfx_telept); + + // don't move for a bit + if (thing->player) + thing->reactiontime = 18; + + thing->angle = m->angle; + thing->momx = thing->momy = thing->momz = 0; + return 1; + } + } + } + return 0; +} + diff --git a/firmware_p4/components/Applications/doom/p_tick.c b/firmware_p4/components/Applications/doom/p_tick.c new file mode 100644 index 000000000..228935001 --- /dev/null +++ b/firmware_p4/components/Applications/doom/p_tick.c @@ -0,0 +1,151 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Archiving: SaveGame I/O. +// Thinker, Ticker. +// + + +#include "z_zone.h" +#include "p_local.h" + +#include "doomstat.h" + + +int leveltime; + +// +// THINKERS +// All thinkers should be allocated by Z_Malloc +// so they can be operated on uniformly. +// The actual structures will vary in size, +// but the first element must be thinker_t. +// + + + +// Both the head and tail of the thinker list. +thinker_t thinkercap; + + +// +// P_InitThinkers +// +void P_InitThinkers (void) +{ + thinkercap.prev = thinkercap.next = &thinkercap; +} + + + + +// +// P_AddThinker +// Adds a new thinker at the end of the list. +// +void P_AddThinker (thinker_t* thinker) +{ + thinkercap.prev->next = thinker; + thinker->next = &thinkercap; + thinker->prev = thinkercap.prev; + thinkercap.prev = thinker; +} + + + +// +// P_RemoveThinker +// Deallocation is lazy -- it will not actually be freed +// until its thinking turn comes up. +// +void P_RemoveThinker (thinker_t* thinker) +{ + // FIXME: NOP. + thinker->function.acv = (actionf_v)(-1); +} + + + +// +// P_AllocateThinker +// Allocates memory and adds a new thinker at the end of the list. +// +void P_AllocateThinker (thinker_t* thinker) +{ +} + + + +// +// P_RunThinkers +// +void P_RunThinkers (void) +{ + thinker_t* currentthinker; + + currentthinker = thinkercap.next; + while (currentthinker != &thinkercap) + { + if ( currentthinker->function.acv == (actionf_v)(-1) ) + { + // time to remove it + currentthinker->next->prev = currentthinker->prev; + currentthinker->prev->next = currentthinker->next; + Z_Free (currentthinker); + } + else + { + if (currentthinker->function.acp1) + currentthinker->function.acp1 (currentthinker); + } + currentthinker = currentthinker->next; + } +} + + + +// +// P_Ticker +// + +void P_Ticker (void) +{ + int i; + + // run the tic + if (paused) + return; + + // pause if in menu and at least one tic has been run + if ( !netgame + && menuactive + && !demoplayback + && players[consoleplayer].viewz != 1) + { + return; + } + + + for (i=0 ; i>= ANGLETOFINESHIFT; + + player->mo->momx += FixedMul(move,finecosine[angle]); + player->mo->momy += FixedMul(move,finesine[angle]); +} + + + + +// +// P_CalcHeight +// Calculate the walking / running height adjustment +// +void P_CalcHeight (player_t* player) +{ + int angle; + fixed_t bob; + + // Regular movement bobbing + // (needs to be calculated for gun swing + // even if not on ground) + // OPTIMIZE: tablify angle + // Note: a LUT allows for effects + // like a ramp with low health. + player->bob = + FixedMul (player->mo->momx, player->mo->momx) + + FixedMul (player->mo->momy,player->mo->momy); + + player->bob >>= 2; + + if (player->bob>MAXBOB) + player->bob = MAXBOB; + + if ((player->cheats & CF_NOMOMENTUM) || !onground) + { + player->viewz = player->mo->z + VIEWHEIGHT; + + if (player->viewz > player->mo->ceilingz-4*FRACUNIT) + player->viewz = player->mo->ceilingz-4*FRACUNIT; + + player->viewz = player->mo->z + player->viewheight; + return; + } + + angle = (FINEANGLES/20*leveltime)&FINEMASK; + bob = FixedMul ( player->bob/2, finesine[angle]); + + + // move viewheight + if (player->playerstate == PST_LIVE) + { + player->viewheight += player->deltaviewheight; + + if (player->viewheight > VIEWHEIGHT) + { + player->viewheight = VIEWHEIGHT; + player->deltaviewheight = 0; + } + + if (player->viewheight < VIEWHEIGHT/2) + { + player->viewheight = VIEWHEIGHT/2; + if (player->deltaviewheight <= 0) + player->deltaviewheight = 1; + } + + if (player->deltaviewheight) + { + player->deltaviewheight += FRACUNIT/4; + if (!player->deltaviewheight) + player->deltaviewheight = 1; + } + } + player->viewz = player->mo->z + player->viewheight + bob; + + if (player->viewz > player->mo->ceilingz-4*FRACUNIT) + player->viewz = player->mo->ceilingz-4*FRACUNIT; +} + + + +// +// P_MovePlayer +// +void P_MovePlayer (player_t* player) +{ + ticcmd_t* cmd; + + cmd = &player->cmd; + + player->mo->angle += (cmd->angleturn<<16); + + // Do not let the player control movement + // if not onground. + onground = (player->mo->z <= player->mo->floorz); + + if (cmd->forwardmove && onground) + P_Thrust (player, player->mo->angle, cmd->forwardmove*2048); + + if (cmd->sidemove && onground) + P_Thrust (player, player->mo->angle-ANG90, cmd->sidemove*2048); + + if ( (cmd->forwardmove || cmd->sidemove) + && player->mo->state == &states[S_PLAY] ) + { + P_SetMobjState (player->mo, S_PLAY_RUN1); + } +} + + + +// +// P_DeathThink +// Fall on your face when dying. +// Decrease POV height to floor height. +// +#define ANG5 (ANG90/18) + +void P_DeathThink (player_t* player) +{ + angle_t angle; + angle_t delta; + + P_MovePsprites (player); + + // fall to the ground + if (player->viewheight > 6*FRACUNIT) + player->viewheight -= FRACUNIT; + + if (player->viewheight < 6*FRACUNIT) + player->viewheight = 6*FRACUNIT; + + player->deltaviewheight = 0; + onground = (player->mo->z <= player->mo->floorz); + P_CalcHeight (player); + + if (player->attacker && player->attacker != player->mo) + { + angle = R_PointToAngle2 (player->mo->x, + player->mo->y, + player->attacker->x, + player->attacker->y); + + delta = angle - player->mo->angle; + + if (delta < ANG5 || delta > (unsigned)-ANG5) + { + // Looking at killer, + // so fade damage flash down. + player->mo->angle = angle; + + if (player->damagecount) + player->damagecount--; + } + else if (delta < ANG180) + player->mo->angle += ANG5; + else + player->mo->angle -= ANG5; + } + else if (player->damagecount) + player->damagecount--; + + + if (player->cmd.buttons & BT_USE) + player->playerstate = PST_REBORN; +} + + + +// +// P_PlayerThink +// +void P_PlayerThink (player_t* player) +{ + ticcmd_t* cmd; + weapontype_t newweapon; + + // fixme: do this in the cheat code + if (player->cheats & CF_NOCLIP) + player->mo->flags |= MF_NOCLIP; + else + player->mo->flags &= ~MF_NOCLIP; + + // chain saw run forward + cmd = &player->cmd; + if (player->mo->flags & MF_JUSTATTACKED) + { + cmd->angleturn = 0; + cmd->forwardmove = 0xc800/512; + cmd->sidemove = 0; + player->mo->flags &= ~MF_JUSTATTACKED; + } + + + if (player->playerstate == PST_DEAD) + { + P_DeathThink (player); + return; + } + + // Move around. + // Reactiontime is used to prevent movement + // for a bit after a teleport. + if (player->mo->reactiontime) + player->mo->reactiontime--; + else + P_MovePlayer (player); + + P_CalcHeight (player); + + if (player->mo->subsector->sector->special) + P_PlayerInSpecialSector (player); + + // Check for weapon change. + + // A special event has no other buttons. + if (cmd->buttons & BT_SPECIAL) + cmd->buttons = 0; + + if (cmd->buttons & BT_CHANGE) + { + // The actual changing of the weapon is done + // when the weapon psprite can do it + // (read: not in the middle of an attack). + newweapon = (cmd->buttons&BT_WEAPONMASK)>>BT_WEAPONSHIFT; + + if (newweapon == wp_fist + && player->weaponowned[wp_chainsaw] + && !(player->readyweapon == wp_chainsaw + && player->powers[pw_strength])) + { + newweapon = wp_chainsaw; + } + + if ( (gamemode == commercial) + && newweapon == wp_shotgun + && player->weaponowned[wp_supershotgun] + && player->readyweapon != wp_supershotgun) + { + newweapon = wp_supershotgun; + } + + + if (player->weaponowned[newweapon] + && newweapon != player->readyweapon) + { + // Do not go to plasma or BFG in shareware, + // even if cheated. + if ((newweapon != wp_plasma + && newweapon != wp_bfg) + || (gamemode != shareware) ) + { + player->pendingweapon = newweapon; + } + } + } + + // check for use + if (cmd->buttons & BT_USE) + { + if (!player->usedown) + { + P_UseLines (player); + player->usedown = true; + } + } + else + player->usedown = false; + + // cycle psprites + P_MovePsprites (player); + + // Counters, time dependend power ups. + + // Strength counts up to diminish fade. + if (player->powers[pw_strength]) + player->powers[pw_strength]++; + + if (player->powers[pw_invulnerability]) + player->powers[pw_invulnerability]--; + + if (player->powers[pw_invisibility]) + if (! --player->powers[pw_invisibility] ) + player->mo->flags &= ~MF_SHADOW; + + if (player->powers[pw_infrared]) + player->powers[pw_infrared]--; + + if (player->powers[pw_ironfeet]) + player->powers[pw_ironfeet]--; + + if (player->damagecount) + player->damagecount--; + + if (player->bonuscount) + player->bonuscount--; + + + // Handling colormaps. + if (player->powers[pw_invulnerability]) + { + if (player->powers[pw_invulnerability] > 4*32 + || (player->powers[pw_invulnerability]&8) ) + player->fixedcolormap = INVERSECOLORMAP; + else + player->fixedcolormap = 0; + } + else if (player->powers[pw_infrared]) + { + if (player->powers[pw_infrared] > 4*32 + || (player->powers[pw_infrared]&8) ) + { + // almost full bright + player->fixedcolormap = 1; + } + else + player->fixedcolormap = 0; + } + else + player->fixedcolormap = 0; +} + + diff --git a/firmware_p4/components/Applications/doom/r_bsp.c b/firmware_p4/components/Applications/doom/r_bsp.c new file mode 100644 index 000000000..9a788122a --- /dev/null +++ b/firmware_p4/components/Applications/doom/r_bsp.c @@ -0,0 +1,573 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// BSP traversal, handling of LineSegs for rendering. +// + + + + +#include "doomdef.h" + +#include "m_bbox.h" + +#include "i_system.h" + +#include "r_main.h" +#include "r_plane.h" +#include "r_things.h" + +// State. +#include "doomstat.h" +#include "r_state.h" + +//#include "r_local.h" + + + +seg_t* curline; +side_t* sidedef; +line_t* linedef; +sector_t* frontsector; +sector_t* backsector; + +drawseg_t drawsegs[MAXDRAWSEGS]; +drawseg_t* ds_p; + + +void +R_StoreWallRange +( int start, + int stop ); + + + + +// +// R_ClearDrawSegs +// +void R_ClearDrawSegs (void) +{ + ds_p = drawsegs; +} + + + +// +// ClipWallSegment +// Clips the given range of columns +// and includes it in the new clip list. +// +typedef struct +{ + int first; + int last; + +} cliprange_t; + + +#define MAXSEGS 32 + +// newend is one past the last valid seg +cliprange_t* newend; +cliprange_t solidsegs[MAXSEGS]; + + + + +// +// R_ClipSolidWallSegment +// Does handle solid walls, +// e.g. single sided LineDefs (middle texture) +// that entirely block the view. +// +void +R_ClipSolidWallSegment +( int first, + int last ) +{ + cliprange_t* next; + cliprange_t* start; + + // Find the first range that touches the range + // (adjacent pixels are touching). + start = solidsegs; + while (start->last < first-1) + start++; + + if (first < start->first) + { + if (last < start->first-1) + { + // Post is entirely visible (above start), + // so insert a new clippost. + R_StoreWallRange (first, last); + next = newend; + newend++; + + while (next != start) + { + *next = *(next-1); + next--; + } + next->first = first; + next->last = last; + return; + } + + // There is a fragment above *start. + R_StoreWallRange (first, start->first - 1); + // Now adjust the clip size. + start->first = first; + } + + // Bottom contained in start? + if (last <= start->last) + return; + + next = start; + while (last >= (next+1)->first-1) + { + // There is a fragment between two posts. + R_StoreWallRange (next->last + 1, (next+1)->first - 1); + next++; + + if (last <= next->last) + { + // Bottom is contained in next. + // Adjust the clip size. + start->last = next->last; + goto crunch; + } + } + + // There is a fragment after *next. + R_StoreWallRange (next->last + 1, last); + // Adjust the clip size. + start->last = last; + + // Remove start+1 to next from the clip list, + // because start now covers their area. + crunch: + if (next == start) + { + // Post just extended past the bottom of one post. + return; + } + + + while (next++ != newend) + { + // Remove a post. + *++start = *next; + } + + newend = start+1; +} + + + +// +// R_ClipPassWallSegment +// Clips the given range of columns, +// but does not includes it in the clip list. +// Does handle windows, +// e.g. LineDefs with upper and lower texture. +// +void +R_ClipPassWallSegment +( int first, + int last ) +{ + cliprange_t* start; + + // Find the first range that touches the range + // (adjacent pixels are touching). + start = solidsegs; + while (start->last < first-1) + start++; + + if (first < start->first) + { + if (last < start->first-1) + { + // Post is entirely visible (above start). + R_StoreWallRange (first, last); + return; + } + + // There is a fragment above *start. + R_StoreWallRange (first, start->first - 1); + } + + // Bottom contained in start? + if (last <= start->last) + return; + + while (last >= (start+1)->first-1) + { + // There is a fragment between two posts. + R_StoreWallRange (start->last + 1, (start+1)->first - 1); + start++; + + if (last <= start->last) + return; + } + + // There is a fragment after *next. + R_StoreWallRange (start->last + 1, last); +} + + + +// +// R_ClearClipSegs +// +void R_ClearClipSegs (void) +{ + solidsegs[0].first = -0x7fffffff; + solidsegs[0].last = -1; + solidsegs[1].first = viewwidth; + solidsegs[1].last = 0x7fffffff; + newend = solidsegs+2; +} + +// +// R_AddLine +// Clips the given segment +// and adds any visible pieces to the line list. +// +void R_AddLine (seg_t* line) +{ + int x1; + int x2; + angle_t angle1; + angle_t angle2; + angle_t span; + angle_t tspan; + + curline = line; + + // OPTIMIZE: quickly reject orthogonal back sides. + angle1 = R_PointToAngle (line->v1->x, line->v1->y); + angle2 = R_PointToAngle (line->v2->x, line->v2->y); + + // Clip to view edges. + // OPTIMIZE: make constant out of 2*clipangle (FIELDOFVIEW). + span = angle1 - angle2; + + // Back side? I.e. backface culling? + if (span >= ANG180) + return; + + // Global angle needed by segcalc. + rw_angle1 = angle1; + angle1 -= viewangle; + angle2 -= viewangle; + + tspan = angle1 + clipangle; + if (tspan > 2*clipangle) + { + tspan -= 2*clipangle; + + // Totally off the left edge? + if (tspan >= span) + return; + + angle1 = clipangle; + } + tspan = clipangle - angle2; + if (tspan > 2*clipangle) + { + tspan -= 2*clipangle; + + // Totally off the left edge? + if (tspan >= span) + return; + angle2 = -clipangle; + } + + // The seg is in the view range, + // but not necessarily visible. + angle1 = (angle1+ANG90)>>ANGLETOFINESHIFT; + angle2 = (angle2+ANG90)>>ANGLETOFINESHIFT; + x1 = viewangletox[angle1]; + x2 = viewangletox[angle2]; + + // Does not cross a pixel? + if (x1 == x2) + return; + + backsector = line->backsector; + + // Single sided line? + if (!backsector) + goto clipsolid; + + // Closed door. + if (backsector->ceilingheight <= frontsector->floorheight + || backsector->floorheight >= frontsector->ceilingheight) + goto clipsolid; + + // Window. + if (backsector->ceilingheight != frontsector->ceilingheight + || backsector->floorheight != frontsector->floorheight) + goto clippass; + + // Reject empty lines used for triggers + // and special events. + // Identical floor and ceiling on both sides, + // identical light levels on both sides, + // and no middle texture. + if (backsector->ceilingpic == frontsector->ceilingpic + && backsector->floorpic == frontsector->floorpic + && backsector->lightlevel == frontsector->lightlevel + && curline->sidedef->midtexture == 0) + { + return; + } + + + clippass: + R_ClipPassWallSegment (x1, x2-1); + return; + + clipsolid: + R_ClipSolidWallSegment (x1, x2-1); +} + + +// +// R_CheckBBox +// Checks BSP node/subtree bounding box. +// Returns true +// if some part of the bbox might be visible. +// +int checkcoord[12][4] = +{ + {3,0,2,1}, + {3,0,2,0}, + {3,1,2,0}, + {0}, + {2,0,2,1}, + {0,0,0,0}, + {3,1,3,0}, + {0}, + {2,0,3,1}, + {2,1,3,1}, + {2,1,3,0} +}; + + +boolean R_CheckBBox (fixed_t* bspcoord) +{ + int boxx; + int boxy; + int boxpos; + + fixed_t x1; + fixed_t y1; + fixed_t x2; + fixed_t y2; + + angle_t angle1; + angle_t angle2; + angle_t span; + angle_t tspan; + + cliprange_t* start; + + int sx1; + int sx2; + + // Find the corners of the box + // that define the edges from current viewpoint. + if (viewx <= bspcoord[BOXLEFT]) + boxx = 0; + else if (viewx < bspcoord[BOXRIGHT]) + boxx = 1; + else + boxx = 2; + + if (viewy >= bspcoord[BOXTOP]) + boxy = 0; + else if (viewy > bspcoord[BOXBOTTOM]) + boxy = 1; + else + boxy = 2; + + boxpos = (boxy<<2)+boxx; + if (boxpos == 5) + return true; + + x1 = bspcoord[checkcoord[boxpos][0]]; + y1 = bspcoord[checkcoord[boxpos][1]]; + x2 = bspcoord[checkcoord[boxpos][2]]; + y2 = bspcoord[checkcoord[boxpos][3]]; + + // check clip list for an open space + angle1 = R_PointToAngle (x1, y1) - viewangle; + angle2 = R_PointToAngle (x2, y2) - viewangle; + + span = angle1 - angle2; + + // Sitting on a line? + if (span >= ANG180) + return true; + + tspan = angle1 + clipangle; + + if (tspan > 2*clipangle) + { + tspan -= 2*clipangle; + + // Totally off the left edge? + if (tspan >= span) + return false; + + angle1 = clipangle; + } + tspan = clipangle - angle2; + if (tspan > 2*clipangle) + { + tspan -= 2*clipangle; + + // Totally off the left edge? + if (tspan >= span) + return false; + + angle2 = -clipangle; + } + + + // Find the first clippost + // that touches the source post + // (adjacent pixels are touching). + angle1 = (angle1+ANG90)>>ANGLETOFINESHIFT; + angle2 = (angle2+ANG90)>>ANGLETOFINESHIFT; + sx1 = viewangletox[angle1]; + sx2 = viewangletox[angle2]; + + // Does not cross a pixel. + if (sx1 == sx2) + return false; + sx2--; + + start = solidsegs; + while (start->last < sx2) + start++; + + if (sx1 >= start->first + && sx2 <= start->last) + { + // The clippost contains the new span. + return false; + } + + return true; +} + + + +// +// R_Subsector +// Determine floor/ceiling planes. +// Add sprites of things in sector. +// Draw one or more line segments. +// +void R_Subsector (int num) +{ + int count; + seg_t* line; + subsector_t* sub; + +#ifdef RANGECHECK + if (num>=numsubsectors) + I_Error ("R_Subsector: ss %i with numss = %i", + num, + numsubsectors); +#endif + + sscount++; + sub = &subsectors[num]; + frontsector = sub->sector; + count = sub->numlines; + line = &segs[sub->firstline]; + + if (frontsector->floorheight < viewz) + { + floorplane = R_FindPlane (frontsector->floorheight, + frontsector->floorpic, + frontsector->lightlevel); + } + else + floorplane = NULL; + + if (frontsector->ceilingheight > viewz + || frontsector->ceilingpic == skyflatnum) + { + ceilingplane = R_FindPlane (frontsector->ceilingheight, + frontsector->ceilingpic, + frontsector->lightlevel); + } + else + ceilingplane = NULL; + + R_AddSprites (frontsector); + + while (count--) + { + R_AddLine (line); + line++; + } +} + + + + +// +// RenderBSPNode +// Renders all subsectors below a given node, +// traversing subtree recursively. +// Just call with BSP root. +void R_RenderBSPNode (int bspnum) +{ + node_t* bsp; + int side; + + // Found a subsector? + if (bspnum & NF_SUBSECTOR) + { + if (bspnum == -1) + R_Subsector (0); + else + R_Subsector (bspnum&(~NF_SUBSECTOR)); + return; + } + + bsp = &nodes[bspnum]; + + // Decide which side the view point is on. + side = R_PointOnSide (viewx, viewy, bsp); + + // Recursively divide front space. + R_RenderBSPNode (bsp->children[side]); + + // Possibly divide back space. + if (R_CheckBBox (bsp->bbox[side^1])) + R_RenderBSPNode (bsp->children[side^1]); +} + + diff --git a/firmware_p4/components/Applications/doom/r_bsp.h b/firmware_p4/components/Applications/doom/r_bsp.h new file mode 100644 index 000000000..1723e6861 --- /dev/null +++ b/firmware_p4/components/Applications/doom/r_bsp.h @@ -0,0 +1,61 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Refresh module, BSP traversal and handling. +// + + +#ifndef __R_BSP__ +#define __R_BSP__ + + + +extern seg_t* curline; +extern side_t* sidedef; +extern line_t* linedef; +extern sector_t* frontsector; +extern sector_t* backsector; + +extern int rw_x; +extern int rw_stopx; + +extern boolean segtextured; + +// false if the back side is the same plane +extern boolean markfloor; +extern boolean markceiling; + +extern boolean skymap; + +extern drawseg_t drawsegs[MAXDRAWSEGS]; +extern drawseg_t* ds_p; + +extern lighttable_t** hscalelight; +extern lighttable_t** vscalelight; +extern lighttable_t** dscalelight; + + +typedef void (*drawfunc_t) (int start, int stop); + + +// BSP? +void R_ClearClipSegs (void); +void R_ClearDrawSegs (void); + + +void R_RenderBSPNode (int bspnum); + + +#endif diff --git a/firmware_p4/components/Applications/doom/r_data.c b/firmware_p4/components/Applications/doom/r_data.c new file mode 100644 index 000000000..2d4b65bb5 --- /dev/null +++ b/firmware_p4/components/Applications/doom/r_data.c @@ -0,0 +1,912 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Preparation of data for rendering, +// generation of lookups, caching, retrieval by name. +// + +#include + +#include "deh_main.h" +#include "i_swap.h" +#include "i_system.h" +#include "z_zone.h" + + +#include "w_wad.h" + +#include "doomdef.h" +#include "m_misc.h" +#include "r_local.h" +#include "p_local.h" + +#include "doomstat.h" +#include "r_sky.h" + + +#include "r_data.h" + +// +// Graphics. +// DOOM graphics for walls and sprites +// is stored in vertical runs of opaque pixels (posts). +// A column is composed of zero or more posts, +// a patch or sprite is composed of zero or more columns. +// + + + +// +// Texture definition. +// Each texture is composed of one or more patches, +// with patches being lumps stored in the WAD. +// The lumps are referenced by number, and patched +// into the rectangular texture space using origin +// and possibly other attributes. +// +typedef struct +{ + short originx; + short originy; + short patch; + short stepdir; + short colormap; +} PACKEDATTR mappatch_t; + + +// +// Texture definition. +// A DOOM wall texture is a list of patches +// which are to be combined in a predefined order. +// +typedef struct +{ + char name[8]; + int masked; + short width; + short height; + int obsolete; + short patchcount; + mappatch_t patches[1]; +} PACKEDATTR maptexture_t; + + +// A single patch from a texture definition, +// basically a rectangular area within +// the texture rectangle. +typedef struct +{ + // Block origin (allways UL), + // which has allready accounted + // for the internal origin of the patch. + short originx; + short originy; + int patch; +} texpatch_t; + + +// A maptexturedef_t describes a rectangular texture, +// which is composed of one or more mappatch_t structures +// that arrange graphic patches. + +typedef struct texture_s texture_t; + +struct texture_s +{ + // Keep name for switch changing, etc. + char name[8]; + short width; + short height; + + // Index in textures list + + int index; + + // Next in hash table chain + + texture_t *next; + + // All the patches[patchcount] + // are drawn back to front into the cached texture. + short patchcount; + texpatch_t patches[1]; +}; + + + +int firstflat; +int lastflat; +int numflats; + +int firstpatch; +int lastpatch; +int numpatches; + +int firstspritelump; +int lastspritelump; +int numspritelumps; + +int numtextures; +texture_t** textures; +texture_t** textures_hashtable; + + +int* texturewidthmask; +// needed for texture pegging +fixed_t* textureheight; +int* texturecompositesize; +short** texturecolumnlump; +unsigned short** texturecolumnofs; +byte** texturecomposite; + +// for global animation +int* flattranslation; +int* texturetranslation; + +// needed for pre rendering +fixed_t* spritewidth; +fixed_t* spriteoffset; +fixed_t* spritetopoffset; + +lighttable_t *colormaps; + + +// +// MAPTEXTURE_T CACHING +// When a texture is first needed, +// it counts the number of composite columns +// required in the texture and allocates space +// for a column directory and any new columns. +// The directory will simply point inside other patches +// if there is only one patch in a given column, +// but any columns with multiple patches +// will have new column_ts generated. +// + + + +// +// R_DrawColumnInCache +// Clip and draw a column +// from a patch into a cached post. +// +void +R_DrawColumnInCache +( column_t* patch, + byte* cache, + int originy, + int cacheheight ) +{ + int count; + int position; + byte* source; + + while (patch->topdelta != 0xff) + { + source = (byte *)patch + 3; + count = patch->length; + position = originy + patch->topdelta; + + if (position < 0) + { + count += position; + position = 0; + } + + if (position + count > cacheheight) + count = cacheheight - position; + + if (count > 0) + memcpy (cache + position, source, count); + + patch = (column_t *)( (byte *)patch + patch->length + 4); + } +} + + + +// +// R_GenerateComposite +// Using the texture definition, +// the composite texture is created from the patches, +// and each column is cached. +// +void R_GenerateComposite (int texnum) +{ + byte* block; + texture_t* texture; + texpatch_t* patch; + patch_t* realpatch; + int x; + int x1; + int x2; + int i; + column_t* patchcol; + short* collump; + unsigned short* colofs; + + texture = textures[texnum]; + + block = Z_Malloc (texturecompositesize[texnum], + PU_STATIC, + &texturecomposite[texnum]); + + collump = texturecolumnlump[texnum]; + colofs = texturecolumnofs[texnum]; + + // Composite the columns together. + patch = texture->patches; + + for (i=0 , patch = texture->patches; + ipatchcount; + i++, patch++) + { + realpatch = W_CacheLumpNum (patch->patch, PU_CACHE); + x1 = patch->originx; + x2 = x1 + SHORT(realpatch->width); + + if (x1<0) + x = 0; + else + x = x1; + + if (x2 > texture->width) + x2 = texture->width; + + for ( ; x= 0) + continue; + + patchcol = (column_t *)((byte *)realpatch + + LONG(realpatch->columnofs[x-x1])); + R_DrawColumnInCache (patchcol, + block + colofs[x], + patch->originy, + texture->height); + } + + } + + // Now that the texture has been built in column cache, + // it is purgable from zone memory. + Z_ChangeTag (block, PU_CACHE); +} + + + +// +// R_GenerateLookup +// +void R_GenerateLookup (int texnum) +{ + texture_t* texture; + byte* patchcount; // patchcount[texture->width] + texpatch_t* patch; + patch_t* realpatch; + int x; + int x1; + int x2; + int i; + short* collump; + unsigned short* colofs; + + texture = textures[texnum]; + + // Composited texture not created yet. + texturecomposite[texnum] = 0; + + texturecompositesize[texnum] = 0; + collump = texturecolumnlump[texnum]; + colofs = texturecolumnofs[texnum]; + + // Now count the number of columns + // that are covered by more than one patch. + // Fill in the lump / offset, so columns + // with only a single patch are all done. + patchcount = (byte *) Z_Malloc(texture->width, PU_STATIC, &patchcount); + memset (patchcount, 0, texture->width); + patch = texture->patches; + + for (i=0 , patch = texture->patches; + ipatchcount; + i++, patch++) + { + realpatch = W_CacheLumpNum (patch->patch, PU_CACHE); + x1 = patch->originx; + x2 = x1 + SHORT(realpatch->width); + + if (x1 < 0) + x = 0; + else + x = x1; + + if (x2 > texture->width) + x2 = texture->width; + for ( ; xpatch; + colofs[x] = LONG(realpatch->columnofs[x-x1])+3; + } + } + + for (x=0 ; xwidth ; x++) + { + if (!patchcount[x]) + { + printf ("R_GenerateLookup: column without a patch (%s)\n", + texture->name); + return; + } + // I_Error ("R_GenerateLookup: column without a patch"); + + if (patchcount[x] > 1) + { + // Use the cached block. + collump[x] = -1; + colofs[x] = texturecompositesize[texnum]; + + if (texturecompositesize[texnum] > 0x10000-texture->height) + { + I_Error ("R_GenerateLookup: texture %i is >64k", + texnum); + } + + texturecompositesize[texnum] += texture->height; + } + } + + Z_Free(patchcount); +} + + + + +// +// R_GetColumn +// +byte* +R_GetColumn +( int tex, + int col ) +{ + int lump; + int ofs; + + col &= texturewidthmask[tex]; + lump = texturecolumnlump[tex][col]; + ofs = texturecolumnofs[tex][col]; + + if (lump > 0) + return (byte *)W_CacheLumpNum(lump,PU_CACHE)+ofs; + + if (!texturecomposite[tex]) + R_GenerateComposite (tex); + + return texturecomposite[tex] + ofs; +} + + +static void GenerateTextureHashTable(void) +{ + texture_t **rover; + int i; + int key; + + textures_hashtable + = Z_Malloc(sizeof(texture_t *) * numtextures, PU_STATIC, 0); + + memset(textures_hashtable, 0, sizeof(texture_t *) * numtextures); + + // Add all textures to hash table + + for (i=0; iindex = i; + + // Vanilla Doom does a linear search of the texures array + // and stops at the first entry it finds. If there are two + // entries with the same name, the first one in the array + // wins. The new entry must therefore be added at the end + // of the hash chain, so that earlier entries win. + + key = W_LumpNameHash(textures[i]->name) % numtextures; + + rover = &textures_hashtable[key]; + + while (*rover != NULL) + { + rover = &(*rover)->next; + } + + // Hook into hash table + + textures[i]->next = NULL; + *rover = textures[i]; + } +} + + +// +// R_InitTextures +// Initializes the texture list +// with the textures from the world map. +// +void R_InitTextures (void) +{ + maptexture_t* mtexture; + texture_t* texture; + mappatch_t* mpatch; + texpatch_t* patch; + + int i; + int j; + + int* maptex; + int* maptex2; + int* maptex1; + + char name[9]; + char* names; + char* name_p; + + int* patchlookup; + + int totalwidth; + int nummappatches; + int offset; + int maxoff; + int maxoff2; + int numtextures1; + int numtextures2; + + int* directory; + + int temp1; + int temp2; + int temp3; + + + // Load the patch names from pnames.lmp. + name[8] = 0; + names = W_CacheLumpName (DEH_String("PNAMES"), PU_STATIC); + nummappatches = LONG ( *((int *)names) ); + name_p = names + 4; + patchlookup = Z_Malloc(nummappatches*sizeof(*patchlookup), PU_STATIC, NULL); + + for (i = 0; i < nummappatches; i++) + { + M_StringCopy(name, name_p + i * 8, sizeof(name)); + patchlookup[i] = W_CheckNumForName(name); + } + W_ReleaseLumpName(DEH_String("PNAMES")); + + // Load the map texture definitions from textures.lmp. + // The data is contained in one or two lumps, + // TEXTURE1 for shareware, plus TEXTURE2 for commercial. + maptex = maptex1 = W_CacheLumpName (DEH_String("TEXTURE1"), PU_STATIC); + numtextures1 = LONG(*maptex); + maxoff = W_LumpLength (W_GetNumForName (DEH_String("TEXTURE1"))); + directory = maptex+1; + + if (W_CheckNumForName (DEH_String("TEXTURE2")) != -1) + { + maptex2 = W_CacheLumpName (DEH_String("TEXTURE2"), PU_STATIC); + numtextures2 = LONG(*maptex2); + maxoff2 = W_LumpLength (W_GetNumForName (DEH_String("TEXTURE2"))); + } + else + { + maptex2 = NULL; + numtextures2 = 0; + maxoff2 = 0; + } + numtextures = numtextures1 + numtextures2; + + textures = Z_Malloc (numtextures * sizeof(*textures), PU_STATIC, 0); + texturecolumnlump = Z_Malloc (numtextures * sizeof(*texturecolumnlump), PU_STATIC, 0); + texturecolumnofs = Z_Malloc (numtextures * sizeof(*texturecolumnofs), PU_STATIC, 0); + texturecomposite = Z_Malloc (numtextures * sizeof(*texturecomposite), PU_STATIC, 0); + texturecompositesize = Z_Malloc (numtextures * sizeof(*texturecompositesize), PU_STATIC, 0); + texturewidthmask = Z_Malloc (numtextures * sizeof(*texturewidthmask), PU_STATIC, 0); + textureheight = Z_Malloc (numtextures * sizeof(*textureheight), PU_STATIC, 0); + + totalwidth = 0; + + // Really complex printing shit... + temp1 = W_GetNumForName (DEH_String("S_START")); // P_??????? + temp2 = W_GetNumForName (DEH_String("S_END")) - 1; + temp3 = ((temp2-temp1+63)/64) + ((numtextures+63)/64); + + // If stdout is a real console, use the classic vanilla "filling + // up the box" effect, which uses backspace to "step back" inside + // the box. If stdout is a file, don't draw the box. + + if (I_ConsoleStdout()) + { + printf("["); + for (i = 0; i < temp3 + 9; i++) + printf(" "); + printf("]"); + for (i = 0; i < temp3 + 10; i++) + printf("\b"); + } + + for (i=0 ; i maxoff) + I_Error ("R_InitTextures: bad texture directory"); + + mtexture = (maptexture_t *) ( (byte *)maptex + offset); + + texture = textures[i] = + Z_Malloc (sizeof(texture_t) + + sizeof(texpatch_t)*(SHORT(mtexture->patchcount)-1), + PU_STATIC, 0); + + texture->width = SHORT(mtexture->width); + texture->height = SHORT(mtexture->height); + texture->patchcount = SHORT(mtexture->patchcount); + + memcpy (texture->name, mtexture->name, sizeof(texture->name)); + mpatch = &mtexture->patches[0]; + patch = &texture->patches[0]; + + for (j=0 ; jpatchcount ; j++, mpatch++, patch++) + { + patch->originx = SHORT(mpatch->originx); + patch->originy = SHORT(mpatch->originy); + patch->patch = patchlookup[SHORT(mpatch->patch)]; + if (patch->patch == -1) + { + I_Error ("R_InitTextures: Missing patch in texture %s", + texture->name); + } + } + texturecolumnlump[i] = Z_Malloc (texture->width*sizeof(**texturecolumnlump), PU_STATIC,0); + texturecolumnofs[i] = Z_Malloc (texture->width*sizeof(**texturecolumnofs), PU_STATIC,0); + + j = 1; + while (j*2 <= texture->width) + j<<=1; + + texturewidthmask[i] = j-1; + textureheight[i] = texture->height<width; + } + + Z_Free(patchlookup); + + W_ReleaseLumpName(DEH_String("TEXTURE1")); + if (maptex2) + W_ReleaseLumpName(DEH_String("TEXTURE2")); + + // Precalculate whatever possible. + + for (i=0 ; iwidth)<leftoffset)<topoffset)<name, name, 8) ) + return texture->index; + + texture = texture->next; + } + + return -1; +} + + + +// +// R_TextureNumForName +// Calls R_CheckTextureNumForName, +// aborts with error message. +// +int R_TextureNumForName (char* name) +{ + int i; + + i = R_CheckTextureNumForName (name); + + if (i==-1) + { + I_Error ("R_TextureNumForName: %s not found", + name); + } + return i; +} + + + + +// +// R_PrecacheLevel +// Preloads all relevant graphics for the level. +// +int flatmemory; +int texturememory; +int spritememory; + +void R_PrecacheLevel (void) +{ + char* flatpresent; + char* texturepresent; + char* spritepresent; + + int i; + int j; + int k; + int lump; + + texture_t* texture; + thinker_t* th; + spriteframe_t* sf; + + if (demoplayback) + return; + + // Precache flats. + flatpresent = Z_Malloc(numflats, PU_STATIC, NULL); + memset (flatpresent,0,numflats); + + for (i=0 ; ipatchcount ; j++) + { + lump = texture->patches[j].patch; + texturememory += lumpinfo[lump].size; + W_CacheLumpNum(lump , PU_CACHE); + } + } + + Z_Free(texturepresent); + + // Precache sprites. + spritepresent = Z_Malloc(numsprites, PU_STATIC, NULL); + memset (spritepresent,0, numsprites); + + for (th = thinkercap.next ; th != &thinkercap ; th=th->next) + { + if (th->function.acp1 == (actionf_p1)P_MobjThinker) + spritepresent[((mobj_t *)th)->sprite] = 1; + } + + spritememory = 0; + for (i=0 ; ilump[k]; + spritememory += lumpinfo[lump].size; + W_CacheLumpNum(lump , PU_CACHE); + } + } + } + + Z_Free(spritepresent); +} + + + + diff --git a/firmware_p4/components/Applications/doom/r_data.h b/firmware_p4/components/Applications/doom/r_data.h new file mode 100644 index 000000000..66425afad --- /dev/null +++ b/firmware_p4/components/Applications/doom/r_data.h @@ -0,0 +1,51 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Refresh module, data I/O, caching, retrieval of graphics +// by name. +// + + +#ifndef __R_DATA__ +#define __R_DATA__ + +#include "r_defs.h" +#include "r_state.h" + + +// Retrieve column data for span blitting. +byte* +R_GetColumn +( int tex, + int col ); + + +// I/O, setting up the stuff. +void R_InitData (void); +void R_PrecacheLevel (void); + + +// Retrieval. +// Floor/ceiling opaque texture tiles, +// lookup by name. For animation? +int R_FlatNumForName (char* name); + + +// Called by P_Ticker for switches and animations, +// returns the texture number for the texture name. +int R_TextureNumForName (char *name); +int R_CheckTextureNumForName (char *name); + +#endif diff --git a/firmware_p4/components/Applications/doom/r_defs.h b/firmware_p4/components/Applications/doom/r_defs.h new file mode 100644 index 000000000..a64ac8424 --- /dev/null +++ b/firmware_p4/components/Applications/doom/r_defs.h @@ -0,0 +1,448 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Refresh/rendering module, shared data struct definitions. +// + + +#ifndef __R_DEFS__ +#define __R_DEFS__ + + +// Screenwidth. +#include "doomdef.h" + +// Some more or less basic data types +// we depend on. +#include "m_fixed.h" + +// We rely on the thinker data struct +// to handle sound origins in sectors. +#include "d_think.h" +// SECTORS do store MObjs anyway. +#include "p_mobj.h" + +#include "i_video.h" + +#include "v_patch.h" + + + + +// Silhouette, needed for clipping Segs (mainly) +// and sprites representing things. +#define SIL_NONE 0 +#define SIL_BOTTOM 1 +#define SIL_TOP 2 +#define SIL_BOTH 3 + +#define MAXDRAWSEGS 256 + + + + + +// +// INTERNAL MAP TYPES +// used by play and refresh +// + +// +// Your plain vanilla vertex. +// Note: transformed values not buffered locally, +// like some DOOM-alikes ("wt", "WebView") did. +// +typedef struct +{ + fixed_t x; + fixed_t y; + +} vertex_t; + + +// Forward of LineDefs, for Sectors. +struct line_s; + +// Each sector has a degenmobj_t in its center +// for sound origin purposes. +// I suppose this does not handle sound from +// moving objects (doppler), because +// position is prolly just buffered, not +// updated. +typedef struct +{ + thinker_t thinker; // not used for anything + fixed_t x; + fixed_t y; + fixed_t z; + +} degenmobj_t; + +// +// The SECTORS record, at runtime. +// Stores things/mobjs. +// +typedef struct +{ + fixed_t floorheight; + fixed_t ceilingheight; + short floorpic; + short ceilingpic; + short lightlevel; + short special; + short tag; + + // 0 = untraversed, 1,2 = sndlines -1 + int soundtraversed; + + // thing that made a sound (or null) + mobj_t* soundtarget; + + // mapblock bounding box for height changes + int blockbox[4]; + + // origin for any sounds played by the sector + degenmobj_t soundorg; + + // if == validcount, already checked + int validcount; + + // list of mobjs in sector + mobj_t* thinglist; + + // thinker_t for reversable actions + void* specialdata; + + int linecount; + struct line_s** lines; // [linecount] size + +} sector_t; + + + + +// +// The SideDef. +// + +typedef struct +{ + // add this to the calculated texture column + fixed_t textureoffset; + + // add this to the calculated texture top + fixed_t rowoffset; + + // Texture indices. + // We do not maintain names here. + short toptexture; + short bottomtexture; + short midtexture; + + // Sector the SideDef is facing. + sector_t* sector; + +} side_t; + + + +// +// Move clipping aid for LineDefs. +// +typedef enum +{ + ST_HORIZONTAL, + ST_VERTICAL, + ST_POSITIVE, + ST_NEGATIVE + +} slopetype_t; + + + +typedef struct line_s +{ + // Vertices, from v1 to v2. + vertex_t* v1; + vertex_t* v2; + + // Precalculated v2 - v1 for side checking. + fixed_t dx; + fixed_t dy; + + // Animation related. + short flags; + short special; + short tag; + + // Visual appearance: SideDefs. + // sidenum[1] will be -1 if one sided + short sidenum[2]; + + // Neat. Another bounding box, for the extent + // of the LineDef. + fixed_t bbox[4]; + + // To aid move clipping. + slopetype_t slopetype; + + // Front and back sector. + // Note: redundant? Can be retrieved from SideDefs. + sector_t* frontsector; + sector_t* backsector; + + // if == validcount, already checked + int validcount; + + // thinker_t for reversable actions + void* specialdata; +} line_t; + + + + +// +// A SubSector. +// References a Sector. +// Basically, this is a list of LineSegs, +// indicating the visible walls that define +// (all or some) sides of a convex BSP leaf. +// +typedef struct subsector_s +{ + sector_t* sector; + short numlines; + short firstline; + +} subsector_t; + + + +// +// The LineSeg. +// +typedef struct +{ + vertex_t* v1; + vertex_t* v2; + + fixed_t offset; + + angle_t angle; + + side_t* sidedef; + line_t* linedef; + + // Sector references. + // Could be retrieved from linedef, too. + // backsector is NULL for one sided lines + sector_t* frontsector; + sector_t* backsector; + +} seg_t; + + + +// +// BSP node. +// +typedef struct +{ + // Partition line. + fixed_t x; + fixed_t y; + fixed_t dx; + fixed_t dy; + + // Bounding box for each child. + fixed_t bbox[2][4]; + + // If NF_SUBSECTOR its a subsector. + unsigned short children[2]; + +} node_t; + + + + +// PC direct to screen pointers +//B UNUSED - keep till detailshift in r_draw.c resolved +//extern byte* destview; +//extern byte* destscreen; + + + + + +// +// OTHER TYPES +// + +// This could be wider for >8 bit display. +// Indeed, true color support is posibble +// precalculating 24bpp lightmap/colormap LUT. +// from darkening PLAYPAL to all black. +// Could even us emore than 32 levels. +typedef byte lighttable_t; + + + + +// +// ? +// +typedef struct drawseg_s +{ + seg_t* curline; + int x1; + int x2; + + fixed_t scale1; + fixed_t scale2; + fixed_t scalestep; + + // 0=none, 1=bottom, 2=top, 3=both + int silhouette; + + // do not clip sprites above this + fixed_t bsilheight; + + // do not clip sprites below this + fixed_t tsilheight; + + // Pointers to lists for sprite clipping, + // all three adjusted so [x1] is first value. + short* sprtopclip; + short* sprbottomclip; + short* maskedtexturecol; + +} drawseg_t; + + + +// A vissprite_t is a thing +// that will be drawn during a refresh. +// I.e. a sprite object that is partly visible. +typedef struct vissprite_s +{ + // Doubly linked list. + struct vissprite_s* prev; + struct vissprite_s* next; + + int x1; + int x2; + + // for line side calculation + fixed_t gx; + fixed_t gy; + + // global bottom / top for silhouette clipping + fixed_t gz; + fixed_t gzt; + + // horizontal position of x1 + fixed_t startfrac; + + fixed_t scale; + + // negative if flipped + fixed_t xiscale; + + fixed_t texturemid; + int patch; + + // for color translation and shadow draw, + // maxbright frames as well + lighttable_t* colormap; + + int mobjflags; + +} vissprite_t; + + +// +// Sprites are patches with a special naming convention +// so they can be recognized by R_InitSprites. +// The base name is NNNNFx or NNNNFxFx, with +// x indicating the rotation, x = 0, 1-7. +// The sprite and frame specified by a thing_t +// is range checked at run time. +// A sprite is a patch_t that is assumed to represent +// a three dimensional object and may have multiple +// rotations pre drawn. +// Horizontal flipping is used to save space, +// thus NNNNF2F5 defines a mirrored patch. +// Some sprites will only have one picture used +// for all views: NNNNF0 +// +typedef struct +{ + // If false use 0 for any position. + // Note: as eight entries are available, + // we might as well insert the same name eight times. + boolean rotate; + + // Lump to use for view angles 0-7. + short lump[8]; + + // Flip bit (1 = flip) to use for view angles 0-7. + byte flip[8]; + +} spriteframe_t; + + + +// +// A sprite definition: +// a number of animation frames. +// +typedef struct +{ + int numframes; + spriteframe_t* spriteframes; + +} spritedef_t; + + + +// +// Now what is a visplane, anyway? +// +typedef struct +{ + fixed_t height; + int picnum; + int lightlevel; + int minx; + int maxx; + + // leave pads for [minx-1]/[maxx+1] + + byte pad1; + // Here lies the rub for all + // dynamic resize/change of resolution. + byte top[SCREENWIDTH]; + byte pad2; + byte pad3; + // See above. + byte bottom[SCREENWIDTH]; + byte pad4; + +} visplane_t; + + + + +#endif diff --git a/firmware_p4/components/Applications/doom/r_draw.c b/firmware_p4/components/Applications/doom/r_draw.c new file mode 100644 index 000000000..9271bcd55 --- /dev/null +++ b/firmware_p4/components/Applications/doom/r_draw.c @@ -0,0 +1,975 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// The actual span/column drawing functions. +// Here find the main potential for optimization, +// e.g. inline assembly, different algorithms. +// + + + + +#include "doomdef.h" +#include "deh_main.h" + +#include "i_system.h" +#include "z_zone.h" +#include "w_wad.h" + +#include "r_local.h" + +// Needs access to LFB (guess what). +#include "v_video.h" + +// State. +#include "doomstat.h" + + +// ? +#define MAXWIDTH 1120 +#define MAXHEIGHT 832 + +// status bar height at bottom of screen +#define SBARHEIGHT 32 + +// +// All drawing to the view buffer is accomplished in this file. +// The other refresh files only know about ccordinates, +// not the architecture of the frame buffer. +// Conveniently, the frame buffer is a linear one, +// and we need only the base address, +// and the total size == width*height*depth/8., +// + + +byte* viewimage; +int viewwidth; +int scaledviewwidth; +int viewheight; +int viewwindowx; +int viewwindowy; +byte* ylookup[MAXHEIGHT]; +int columnofs[MAXWIDTH]; + +// Color tables for different players, +// translate a limited part to another +// (color ramps used for suit colors). +// +byte translations[3][256]; + +// Backing buffer containing the bezel drawn around the screen and +// surrounding background. + +static byte *background_buffer = NULL; + + +// +// R_DrawColumn +// Source is the top of the column to scale. +// +lighttable_t* dc_colormap; +int dc_x; +int dc_yl; +int dc_yh; +fixed_t dc_iscale; +fixed_t dc_texturemid; + +// first pixel in a column (possibly virtual) +byte* dc_source; + +// just for profiling +int dccount; + +// +// A column is a vertical slice/span from a wall texture that, +// given the DOOM style restrictions on the view orientation, +// will always have constant z depth. +// Thus a special case loop for very fast rendering can +// be used. It has also been used with Wolfenstein 3D. +// +void R_DrawColumn (void) +{ + int count; + byte* dest; + fixed_t frac; + fixed_t fracstep; + + count = dc_yh - dc_yl; + + // Zero length, column does not exceed a pixel. + if (count < 0) + return; + +#ifdef RANGECHECK + if ((unsigned)dc_x >= SCREENWIDTH + || dc_yl < 0 + || dc_yh >= SCREENHEIGHT) + I_Error ("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x); +#endif + + // Framebuffer destination address. + // Use ylookup LUT to avoid multiply with ScreenWidth. + // Use columnofs LUT for subwindows? + dest = ylookup[dc_yl] + columnofs[dc_x]; + + // Determine scaling, + // which is the only mapping to be done. + fracstep = dc_iscale; + frac = dc_texturemid + (dc_yl-centery)*fracstep; + + // Inner loop that does the actual texture mapping, + // e.g. a DDA-lile scaling. + // This is as fast as it gets. + do + { + // Re-map color indices from wall texture column + // using a lighting/special effects LUT. + *dest = dc_colormap[dc_source[(frac>>FRACBITS)&127]]; + + dest += SCREENWIDTH; + frac += fracstep; + + } while (count--); +} + + + +// UNUSED. +// Loop unrolled. +#if 0 +void R_DrawColumn (void) +{ + int count; + byte* source; + byte* dest; + byte* colormap; + + unsigned frac; + unsigned fracstep; + unsigned fracstep2; + unsigned fracstep3; + unsigned fracstep4; + + count = dc_yh - dc_yl + 1; + + source = dc_source; + colormap = dc_colormap; + dest = ylookup[dc_yl] + columnofs[dc_x]; + + fracstep = dc_iscale<<9; + frac = (dc_texturemid + (dc_yl-centery)*dc_iscale)<<9; + + fracstep2 = fracstep+fracstep; + fracstep3 = fracstep2+fracstep; + fracstep4 = fracstep3+fracstep; + + while (count >= 8) + { + dest[0] = colormap[source[frac>>25]]; + dest[SCREENWIDTH] = colormap[source[(frac+fracstep)>>25]]; + dest[SCREENWIDTH*2] = colormap[source[(frac+fracstep2)>>25]]; + dest[SCREENWIDTH*3] = colormap[source[(frac+fracstep3)>>25]]; + + frac += fracstep4; + + dest[SCREENWIDTH*4] = colormap[source[frac>>25]]; + dest[SCREENWIDTH*5] = colormap[source[(frac+fracstep)>>25]]; + dest[SCREENWIDTH*6] = colormap[source[(frac+fracstep2)>>25]]; + dest[SCREENWIDTH*7] = colormap[source[(frac+fracstep3)>>25]]; + + frac += fracstep4; + dest += SCREENWIDTH*8; + count -= 8; + } + + while (count > 0) + { + *dest = colormap[source[frac>>25]]; + dest += SCREENWIDTH; + frac += fracstep; + count--; + } +} +#endif + + +void R_DrawColumnLow (void) +{ + int count; + byte* dest; + byte* dest2; + fixed_t frac; + fixed_t fracstep; + int x; + + count = dc_yh - dc_yl; + + // Zero length. + if (count < 0) + return; + +#ifdef RANGECHECK + if ((unsigned)dc_x >= SCREENWIDTH + || dc_yl < 0 + || dc_yh >= SCREENHEIGHT) + { + + I_Error ("R_DrawColumn: %i to %i at %i", dc_yl, dc_yh, dc_x); + } + // dccount++; +#endif + // Blocky mode, need to multiply by 2. + x = dc_x << 1; + + dest = ylookup[dc_yl] + columnofs[x]; + dest2 = ylookup[dc_yl] + columnofs[x+1]; + + fracstep = dc_iscale; + frac = dc_texturemid + (dc_yl-centery)*fracstep; + + do + { + // Hack. Does not work corretly. + *dest2 = *dest = dc_colormap[dc_source[(frac>>FRACBITS)&127]]; + dest += SCREENWIDTH; + dest2 += SCREENWIDTH; + frac += fracstep; + + } while (count--); +} + + +// +// Spectre/Invisibility. +// +#define FUZZTABLE 50 +#define FUZZOFF (SCREENWIDTH) + + +int fuzzoffset[FUZZTABLE] = +{ + FUZZOFF,-FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF, + FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF, + FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,-FUZZOFF,-FUZZOFF,-FUZZOFF, + FUZZOFF,-FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF, + FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,-FUZZOFF,FUZZOFF, + FUZZOFF,-FUZZOFF,-FUZZOFF,-FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF, + FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF,FUZZOFF,-FUZZOFF,FUZZOFF +}; + +int fuzzpos = 0; + + +// +// Framebuffer postprocessing. +// Creates a fuzzy image by copying pixels +// from adjacent ones to left and right. +// Used with an all black colormap, this +// could create the SHADOW effect, +// i.e. spectres and invisible players. +// +void R_DrawFuzzColumn (void) +{ + int count; + byte* dest; + fixed_t frac; + fixed_t fracstep; + + // Adjust borders. Low... + if (!dc_yl) + dc_yl = 1; + + // .. and high. + if (dc_yh == viewheight-1) + dc_yh = viewheight - 2; + + count = dc_yh - dc_yl; + + // Zero length. + if (count < 0) + return; + +#ifdef RANGECHECK + if ((unsigned)dc_x >= SCREENWIDTH + || dc_yl < 0 || dc_yh >= SCREENHEIGHT) + { + I_Error ("R_DrawFuzzColumn: %i to %i at %i", + dc_yl, dc_yh, dc_x); + } +#endif + + dest = ylookup[dc_yl] + columnofs[dc_x]; + + // Looks familiar. + fracstep = dc_iscale; + frac = dc_texturemid + (dc_yl-centery)*fracstep; + + // Looks like an attempt at dithering, + // using the colormap #6 (of 0-31, a bit + // brighter than average). + do + { + // Lookup framebuffer, and retrieve + // a pixel that is either one column + // left or right of the current one. + // Add index from colormap to index. + *dest = colormaps[6*256+dest[fuzzoffset[fuzzpos]]]; + + // Clamp table lookup index. + if (++fuzzpos == FUZZTABLE) + fuzzpos = 0; + + dest += SCREENWIDTH; + + frac += fracstep; + } while (count--); +} + +// low detail mode version + +void R_DrawFuzzColumnLow (void) +{ + int count; + byte* dest; + byte* dest2; + fixed_t frac; + fixed_t fracstep; + int x; + + // Adjust borders. Low... + if (!dc_yl) + dc_yl = 1; + + // .. and high. + if (dc_yh == viewheight-1) + dc_yh = viewheight - 2; + + count = dc_yh - dc_yl; + + // Zero length. + if (count < 0) + return; + + // low detail mode, need to multiply by 2 + + x = dc_x << 1; + +#ifdef RANGECHECK + if ((unsigned)x >= SCREENWIDTH + || dc_yl < 0 || dc_yh >= SCREENHEIGHT) + { + I_Error ("R_DrawFuzzColumn: %i to %i at %i", + dc_yl, dc_yh, dc_x); + } +#endif + + dest = ylookup[dc_yl] + columnofs[x]; + dest2 = ylookup[dc_yl] + columnofs[x+1]; + + // Looks familiar. + fracstep = dc_iscale; + frac = dc_texturemid + (dc_yl-centery)*fracstep; + + // Looks like an attempt at dithering, + // using the colormap #6 (of 0-31, a bit + // brighter than average). + do + { + // Lookup framebuffer, and retrieve + // a pixel that is either one column + // left or right of the current one. + // Add index from colormap to index. + *dest = colormaps[6*256+dest[fuzzoffset[fuzzpos]]]; + *dest2 = colormaps[6*256+dest2[fuzzoffset[fuzzpos]]]; + + // Clamp table lookup index. + if (++fuzzpos == FUZZTABLE) + fuzzpos = 0; + + dest += SCREENWIDTH; + dest2 += SCREENWIDTH; + + frac += fracstep; + } while (count--); +} + + + + + +// +// R_DrawTranslatedColumn +// Used to draw player sprites +// with the green colorramp mapped to others. +// Could be used with different translation +// tables, e.g. the lighter colored version +// of the BaronOfHell, the HellKnight, uses +// identical sprites, kinda brightened up. +// +byte* dc_translation; +byte* translationtables; + +void R_DrawTranslatedColumn (void) +{ + int count; + byte* dest; + fixed_t frac; + fixed_t fracstep; + + count = dc_yh - dc_yl; + if (count < 0) + return; + +#ifdef RANGECHECK + if ((unsigned)dc_x >= SCREENWIDTH + || dc_yl < 0 + || dc_yh >= SCREENHEIGHT) + { + I_Error ( "R_DrawColumn: %i to %i at %i", + dc_yl, dc_yh, dc_x); + } + +#endif + + + dest = ylookup[dc_yl] + columnofs[dc_x]; + + // Looks familiar. + fracstep = dc_iscale; + frac = dc_texturemid + (dc_yl-centery)*fracstep; + + // Here we do an additional index re-mapping. + do + { + // Translation tables are used + // to map certain colorramps to other ones, + // used with PLAY sprites. + // Thus the "green" ramp of the player 0 sprite + // is mapped to gray, red, black/indigo. + *dest = dc_colormap[dc_translation[dc_source[frac>>FRACBITS]]]; + dest += SCREENWIDTH; + + frac += fracstep; + } while (count--); +} + +void R_DrawTranslatedColumnLow (void) +{ + int count; + byte* dest; + byte* dest2; + fixed_t frac; + fixed_t fracstep; + int x; + + count = dc_yh - dc_yl; + if (count < 0) + return; + + // low detail, need to scale by 2 + x = dc_x << 1; + +#ifdef RANGECHECK + if ((unsigned)x >= SCREENWIDTH + || dc_yl < 0 + || dc_yh >= SCREENHEIGHT) + { + I_Error ( "R_DrawColumn: %i to %i at %i", + dc_yl, dc_yh, x); + } + +#endif + + + dest = ylookup[dc_yl] + columnofs[x]; + dest2 = ylookup[dc_yl] + columnofs[x+1]; + + // Looks familiar. + fracstep = dc_iscale; + frac = dc_texturemid + (dc_yl-centery)*fracstep; + + // Here we do an additional index re-mapping. + do + { + // Translation tables are used + // to map certain colorramps to other ones, + // used with PLAY sprites. + // Thus the "green" ramp of the player 0 sprite + // is mapped to gray, red, black/indigo. + *dest = dc_colormap[dc_translation[dc_source[frac>>FRACBITS]]]; + *dest2 = dc_colormap[dc_translation[dc_source[frac>>FRACBITS]]]; + dest += SCREENWIDTH; + dest2 += SCREENWIDTH; + + frac += fracstep; + } while (count--); +} + + + + +// +// R_InitTranslationTables +// Creates the translation tables to map +// the green color ramp to gray, brown, red. +// Assumes a given structure of the PLAYPAL. +// Could be read from a lump instead. +// +void R_InitTranslationTables (void) +{ + int i; + + translationtables = Z_Malloc (256*3, PU_STATIC, 0); + + // translate just the 16 green colors + for (i=0 ; i<256 ; i++) + { + if (i >= 0x70 && i<= 0x7f) + { + // map green ramp to gray, brown, red + translationtables[i] = 0x60 + (i&0xf); + translationtables [i+256] = 0x40 + (i&0xf); + translationtables [i+512] = 0x20 + (i&0xf); + } + else + { + // Keep all other colors as is. + translationtables[i] = translationtables[i+256] + = translationtables[i+512] = i; + } + } +} + + + + +// +// R_DrawSpan +// With DOOM style restrictions on view orientation, +// the floors and ceilings consist of horizontal slices +// or spans with constant z depth. +// However, rotation around the world z axis is possible, +// thus this mapping, while simpler and faster than +// perspective correct texture mapping, has to traverse +// the texture at an angle in all but a few cases. +// In consequence, flats are not stored by column (like walls), +// and the inner loop has to step in texture space u and v. +// +int ds_y; +int ds_x1; +int ds_x2; + +lighttable_t* ds_colormap; + +fixed_t ds_xfrac; +fixed_t ds_yfrac; +fixed_t ds_xstep; +fixed_t ds_ystep; + +// start of a 64*64 tile image +byte* ds_source; + +// just for profiling +int dscount; + + +// +// Draws the actual span. +void R_DrawSpan (void) +{ + unsigned int position, step; + byte *dest; + int count; + int spot; + unsigned int xtemp, ytemp; + +#ifdef RANGECHECK + if (ds_x2 < ds_x1 + || ds_x1<0 + || ds_x2>=SCREENWIDTH + || (unsigned)ds_y>SCREENHEIGHT) + { + I_Error( "R_DrawSpan: %i to %i at %i", + ds_x1,ds_x2,ds_y); + } +// dscount++; +#endif + + // Pack position and step variables into a single 32-bit integer, + // with x in the top 16 bits and y in the bottom 16 bits. For + // each 16-bit part, the top 6 bits are the integer part and the + // bottom 10 bits are the fractional part of the pixel position. + + position = ((ds_xfrac << 10) & 0xffff0000) + | ((ds_yfrac >> 6) & 0x0000ffff); + step = ((ds_xstep << 10) & 0xffff0000) + | ((ds_ystep >> 6) & 0x0000ffff); + + dest = ylookup[ds_y] + columnofs[ds_x1]; + + // We do not check for zero spans here? + count = ds_x2 - ds_x1; + + do + { + // Calculate current texture index in u,v. + ytemp = (position >> 4) & 0x0fc0; + xtemp = (position >> 26); + spot = xtemp | ytemp; + + // Lookup pixel from flat texture tile, + // re-index using light/colormap. + *dest++ = ds_colormap[ds_source[spot]]; + + position += step; + + } while (count--); +} + + + +// UNUSED. +// Loop unrolled by 4. +#if 0 +void R_DrawSpan (void) +{ + unsigned position, step; + + byte* source; + byte* colormap; + byte* dest; + + unsigned count; + usingned spot; + unsigned value; + unsigned temp; + unsigned xtemp; + unsigned ytemp; + + position = ((ds_xfrac<<10)&0xffff0000) | ((ds_yfrac>>6)&0xffff); + step = ((ds_xstep<<10)&0xffff0000) | ((ds_ystep>>6)&0xffff); + + source = ds_source; + colormap = ds_colormap; + dest = ylookup[ds_y] + columnofs[ds_x1]; + count = ds_x2 - ds_x1 + 1; + + while (count >= 4) + { + ytemp = position>>4; + ytemp = ytemp & 4032; + xtemp = position>>26; + spot = xtemp | ytemp; + position += step; + dest[0] = colormap[source[spot]]; + + ytemp = position>>4; + ytemp = ytemp & 4032; + xtemp = position>>26; + spot = xtemp | ytemp; + position += step; + dest[1] = colormap[source[spot]]; + + ytemp = position>>4; + ytemp = ytemp & 4032; + xtemp = position>>26; + spot = xtemp | ytemp; + position += step; + dest[2] = colormap[source[spot]]; + + ytemp = position>>4; + ytemp = ytemp & 4032; + xtemp = position>>26; + spot = xtemp | ytemp; + position += step; + dest[3] = colormap[source[spot]]; + + count -= 4; + dest += 4; + } + while (count > 0) + { + ytemp = position>>4; + ytemp = ytemp & 4032; + xtemp = position>>26; + spot = xtemp | ytemp; + position += step; + *dest++ = colormap[source[spot]]; + count--; + } +} +#endif + + +// +// Again.. +// +void R_DrawSpanLow (void) +{ + unsigned int position, step; + unsigned int xtemp, ytemp; + byte *dest; + int count; + int spot; + +#ifdef RANGECHECK + if (ds_x2 < ds_x1 + || ds_x1<0 + || ds_x2>=SCREENWIDTH + || (unsigned)ds_y>SCREENHEIGHT) + { + I_Error( "R_DrawSpan: %i to %i at %i", + ds_x1,ds_x2,ds_y); + } +// dscount++; +#endif + + position = ((ds_xfrac << 10) & 0xffff0000) + | ((ds_yfrac >> 6) & 0x0000ffff); + step = ((ds_xstep << 10) & 0xffff0000) + | ((ds_ystep >> 6) & 0x0000ffff); + + count = (ds_x2 - ds_x1); + + // Blocky mode, need to multiply by 2. + ds_x1 <<= 1; + ds_x2 <<= 1; + + dest = ylookup[ds_y] + columnofs[ds_x1]; + + do + { + // Calculate current texture index in u,v. + ytemp = (position >> 4) & 0x0fc0; + xtemp = (position >> 26); + spot = xtemp | ytemp; + + // Lowres/blocky mode does it twice, + // while scale is adjusted appropriately. + *dest++ = ds_colormap[ds_source[spot]]; + *dest++ = ds_colormap[ds_source[spot]]; + + position += step; + + } while (count--); +} + +// +// R_InitBuffer +// Creats lookup tables that avoid +// multiplies and other hazzles +// for getting the framebuffer address +// of a pixel to draw. +// +void +R_InitBuffer +( int width, + int height ) +{ + int i; + + // Handle resize, + // e.g. smaller view windows + // with border and/or status bar. + viewwindowx = (SCREENWIDTH-width) >> 1; + + // Column offset. For windows. + for (i=0 ; i> 1; + + // Preclaculate all row offsets. + for (i=0 ; i +#include + + +#include "doomdef.h" +#include "d_loop.h" + +#include "m_bbox.h" +#include "m_menu.h" + +#include "r_local.h" +#include "r_sky.h" + + + + + +// Fineangles in the SCREENWIDTH wide window. +#define FIELDOFVIEW 2048 + + + +int viewangleoffset; + +// increment every time a check is made +int validcount = 1; + + +lighttable_t* fixedcolormap; +extern lighttable_t** walllights; + +int centerx; +int centery; + +fixed_t centerxfrac; +fixed_t centeryfrac; +fixed_t projection; + +// just for profiling purposes +int framecount; + +int sscount; +int linecount; +int loopcount; + +fixed_t viewx; +fixed_t viewy; +fixed_t viewz; + +angle_t viewangle; + +fixed_t viewcos; +fixed_t viewsin; + +player_t* viewplayer; + +// 0 = high, 1 = low +int detailshift; + +// +// precalculated math tables +// +angle_t clipangle; + +// The viewangletox[viewangle + FINEANGLES/4] lookup +// maps the visible view angles to screen X coordinates, +// flattening the arc to a flat projection plane. +// There will be many angles mapped to the same X. +int viewangletox[FINEANGLES/2]; + +// The xtoviewangleangle[] table maps a screen pixel +// to the lowest viewangle that maps back to x ranges +// from clipangle to -clipangle. +angle_t xtoviewangle[SCREENWIDTH+1]; + +lighttable_t* scalelight[LIGHTLEVELS][MAXLIGHTSCALE]; +lighttable_t* scalelightfixed[MAXLIGHTSCALE]; +lighttable_t* zlight[LIGHTLEVELS][MAXLIGHTZ]; + +// bumped light from gun blasts +int extralight; + + + +void (*colfunc) (void); +void (*basecolfunc) (void); +void (*fuzzcolfunc) (void); +void (*transcolfunc) (void); +void (*spanfunc) (void); + + + +// +// R_AddPointToBox +// Expand a given bbox +// so that it encloses a given point. +// +void +R_AddPointToBox +( int x, + int y, + fixed_t* box ) +{ + if (x< box[BOXLEFT]) + box[BOXLEFT] = x; + if (x> box[BOXRIGHT]) + box[BOXRIGHT] = x; + if (y< box[BOXBOTTOM]) + box[BOXBOTTOM] = y; + if (y> box[BOXTOP]) + box[BOXTOP] = y; +} + + +// +// R_PointOnSide +// Traverse BSP (sub) tree, +// check point against partition plane. +// Returns side 0 (front) or 1 (back). +// +int +R_PointOnSide +( fixed_t x, + fixed_t y, + node_t* node ) +{ + fixed_t dx; + fixed_t dy; + fixed_t left; + fixed_t right; + + if (!node->dx) + { + if (x <= node->x) + return node->dy > 0; + + return node->dy < 0; + } + if (!node->dy) + { + if (y <= node->y) + return node->dx < 0; + + return node->dx > 0; + } + + dx = (x - node->x); + dy = (y - node->y); + + // Try to quickly decide by looking at sign bits. + if ( (node->dy ^ node->dx ^ dx ^ dy)&0x80000000 ) + { + if ( (node->dy ^ dx) & 0x80000000 ) + { + // (left is negative) + return 1; + } + return 0; + } + + left = FixedMul ( node->dy>>FRACBITS , dx ); + right = FixedMul ( dy , node->dx>>FRACBITS ); + + if (right < left) + { + // front side + return 0; + } + // back side + return 1; +} + + +int +R_PointOnSegSide +( fixed_t x, + fixed_t y, + seg_t* line ) +{ + fixed_t lx; + fixed_t ly; + fixed_t ldx; + fixed_t ldy; + fixed_t dx; + fixed_t dy; + fixed_t left; + fixed_t right; + + lx = line->v1->x; + ly = line->v1->y; + + ldx = line->v2->x - lx; + ldy = line->v2->y - ly; + + if (!ldx) + { + if (x <= lx) + return ldy > 0; + + return ldy < 0; + } + if (!ldy) + { + if (y <= ly) + return ldx < 0; + + return ldx > 0; + } + + dx = (x - lx); + dy = (y - ly); + + // Try to quickly decide by looking at sign bits. + if ( (ldy ^ ldx ^ dx ^ dy)&0x80000000 ) + { + if ( (ldy ^ dx) & 0x80000000 ) + { + // (left is negative) + return 1; + } + return 0; + } + + left = FixedMul ( ldy>>FRACBITS , dx ); + right = FixedMul ( dy , ldx>>FRACBITS ); + + if (right < left) + { + // front side + return 0; + } + // back side + return 1; +} + + +// +// R_PointToAngle +// To get a global angle from cartesian coordinates, +// the coordinates are flipped until they are in +// the first octant of the coordinate system, then +// the y (<=x) is scaled and divided by x to get a +// tangent (slope) value which is looked up in the +// tantoangle[] table. + +// + + + + +angle_t +R_PointToAngle +( fixed_t x, + fixed_t y ) +{ + x -= viewx; + y -= viewy; + + if ( (!x) && (!y) ) + return 0; + + if (x>= 0) + { + // x >=0 + if (y>= 0) + { + // y>= 0 + + if (x>y) + { + // octant 0 + return tantoangle[ SlopeDiv(y,x)]; + } + else + { + // octant 1 + return ANG90-1-tantoangle[ SlopeDiv(x,y)]; + } + } + else + { + // y<0 + y = -y; + + if (x>y) + { + // octant 8 + return -tantoangle[SlopeDiv(y,x)]; + } + else + { + // octant 7 + return ANG270+tantoangle[ SlopeDiv(x,y)]; + } + } + } + else + { + // x<0 + x = -x; + + if (y>= 0) + { + // y>= 0 + if (x>y) + { + // octant 3 + return ANG180-1-tantoangle[ SlopeDiv(y,x)]; + } + else + { + // octant 2 + return ANG90+ tantoangle[ SlopeDiv(x,y)]; + } + } + else + { + // y<0 + y = -y; + + if (x>y) + { + // octant 4 + return ANG180+tantoangle[ SlopeDiv(y,x)]; + } + else + { + // octant 5 + return ANG270-1-tantoangle[ SlopeDiv(x,y)]; + } + } + } + return 0; +} + + +angle_t +R_PointToAngle2 +( fixed_t x1, + fixed_t y1, + fixed_t x2, + fixed_t y2 ) +{ + viewx = x1; + viewy = y1; + + return R_PointToAngle (x2, y2); +} + + +fixed_t +R_PointToDist +( fixed_t x, + fixed_t y ) +{ + int angle; + fixed_t dx; + fixed_t dy; + fixed_t temp; + fixed_t dist; + fixed_t frac; + + dx = abs(x - viewx); + dy = abs(y - viewy); + + if (dy>dx) + { + temp = dx; + dx = dy; + dy = temp; + } + + // Fix crashes in udm1.wad + + if (dx != 0) + { + frac = FixedDiv(dy, dx); + } + else + { + frac = 0; + } + + angle = (tantoangle[frac>>DBITS]+ANG90) >> ANGLETOFINESHIFT; + + // use as cosine + dist = FixedDiv (dx, finesine[angle] ); + + return dist; +} + + + + +// +// R_InitPointToAngle +// +void R_InitPointToAngle (void) +{ + // UNUSED - now getting from tables.c +#if 0 + int i; + long t; + float f; +// +// slope (tangent) to angle lookup +// + for (i=0 ; i<=SLOPERANGE ; i++) + { + f = atan( (float)i/SLOPERANGE )/(3.141592657*2); + t = 0xffffffff*f; + tantoangle[i] = t; + } +#endif +} + + +// +// R_ScaleFromGlobalAngle +// Returns the texture mapping scale +// for the current line (horizontal span) +// at the given angle. +// rw_distance must be calculated first. +// +fixed_t R_ScaleFromGlobalAngle (angle_t visangle) +{ + fixed_t scale; + angle_t anglea; + angle_t angleb; + int sinea; + int sineb; + fixed_t num; + int den; + + // UNUSED +#if 0 +{ + fixed_t dist; + fixed_t z; + fixed_t sinv; + fixed_t cosv; + + sinv = finesine[(visangle-rw_normalangle)>>ANGLETOFINESHIFT]; + dist = FixedDiv (rw_distance, sinv); + cosv = finecosine[(viewangle-visangle)>>ANGLETOFINESHIFT]; + z = abs(FixedMul (dist, cosv)); + scale = FixedDiv(projection, z); + return scale; +} +#endif + + anglea = ANG90 + (visangle-viewangle); + angleb = ANG90 + (visangle-rw_normalangle); + + // both sines are allways positive + sinea = finesine[anglea>>ANGLETOFINESHIFT]; + sineb = finesine[angleb>>ANGLETOFINESHIFT]; + num = FixedMul(projection,sineb)< num>>16) + { + scale = FixedDiv (num, den); + + if (scale > 64*FRACUNIT) + scale = 64*FRACUNIT; + else if (scale < 256) + scale = 256; + } + else + scale = 64*FRACUNIT; + + return scale; +} + + + +// +// R_InitTables +// +void R_InitTables (void) +{ + // UNUSED: now getting from tables.c +#if 0 + int i; + float a; + float fv; + int t; + + // viewangle tangent table + for (i=0 ; i FRACUNIT*2) + t = -1; + else if (finetangent[i] < -FRACUNIT*2) + t = viewwidth+1; + else + { + t = FixedMul (finetangent[i], focallength); + t = (centerxfrac - t+FRACUNIT-1)>>FRACBITS; + + if (t < -1) + t = -1; + else if (t>viewwidth+1) + t = viewwidth+1; + } + viewangletox[i] = t; + } + + // Scan viewangletox[] to generate xtoviewangle[]: + // xtoviewangle will give the smallest view angle + // that maps to x. + for (x=0;x<=viewwidth;x++) + { + i = 0; + while (viewangletox[i]>x) + i++; + xtoviewangle[x] = (i<>= LIGHTSCALESHIFT; + level = startmap - scale/DISTMAP; + + if (level < 0) + level = 0; + + if (level >= NUMCOLORMAPS) + level = NUMCOLORMAPS-1; + + zlight[i][j] = colormaps + level*256; + } + } +} + + + +// +// R_SetViewSize +// Do not really change anything here, +// because it might be in the middle of a refresh. +// The change will take effect next refresh. +// +boolean setsizeneeded; +int setblocks; +int setdetail; + + +void +R_SetViewSize +( int blocks, + int detail ) +{ + setsizeneeded = true; + setblocks = blocks; + setdetail = detail; +} + + +// +// R_ExecuteSetViewSize +// +void R_ExecuteSetViewSize (void) +{ + fixed_t cosadj; + fixed_t dy; + int i; + int j; + int level; + int startmap; + + setsizeneeded = false; + + if (setblocks == 11) + { + scaledviewwidth = SCREENWIDTH; + viewheight = SCREENHEIGHT; + } + else + { + scaledviewwidth = setblocks*32; + viewheight = (setblocks*168/10)&~7; + } + + detailshift = setdetail; + viewwidth = scaledviewwidth>>detailshift; + + centery = viewheight/2; + centerx = viewwidth/2; + centerxfrac = centerx<>ANGLETOFINESHIFT]); + distscale[i] = FixedDiv (FRACUNIT,cosadj); + } + + // Calculate the light levels to use + // for each level / scale combination. + for (i=0 ; i< LIGHTLEVELS ; i++) + { + startmap = ((LIGHTLEVELS-1-i)*2)*NUMCOLORMAPS/LIGHTLEVELS; + for (j=0 ; j= NUMCOLORMAPS) + level = NUMCOLORMAPS-1; + + scalelight[i][j] = colormaps + level*256; + } + } +} + + + +// +// R_Init +// + + + +void R_Init (void) +{ + R_InitData (); + printf ("."); + R_InitPointToAngle (); + printf ("."); + R_InitTables (); + // viewwidth / viewheight / detailLevel are set by the defaults + printf ("."); + + R_SetViewSize (screenblocks, detailLevel); + R_InitPlanes (); + printf ("."); + R_InitLightTables (); + printf ("."); + R_InitSkyMap (); + R_InitTranslationTables (); + printf ("."); + + framecount = 0; +} + + +// +// R_PointInSubsector +// +subsector_t* +R_PointInSubsector +( fixed_t x, + fixed_t y ) +{ + node_t* node; + int side; + int nodenum; + + // single subsector is a special case + if (!numnodes) + return subsectors; + + nodenum = numnodes-1; + + while (! (nodenum & NF_SUBSECTOR) ) + { + node = &nodes[nodenum]; + side = R_PointOnSide (x, y, node); + nodenum = node->children[side]; + } + + return &subsectors[nodenum & ~NF_SUBSECTOR]; +} + + + +// +// R_SetupFrame +// +void R_SetupFrame (player_t* player) +{ + int i; + + viewplayer = player; + viewx = player->mo->x; + viewy = player->mo->y; + viewangle = player->mo->angle + viewangleoffset; + extralight = player->extralight; + + viewz = player->viewz; + + viewsin = finesine[viewangle>>ANGLETOFINESHIFT]; + viewcos = finecosine[viewangle>>ANGLETOFINESHIFT]; + + sscount = 0; + + if (player->fixedcolormap) + { + fixedcolormap = + colormaps + + player->fixedcolormap*256*sizeof(lighttable_t); + + walllights = scalelightfixed; + + for (i=0 ; i +#include + +#include "i_system.h" +#include "z_zone.h" +#include "w_wad.h" + +#include "doomdef.h" +#include "doomstat.h" + +#include "r_local.h" +#include "r_sky.h" + + + +planefunction_t floorfunc; +planefunction_t ceilingfunc; + +// +// opening +// + +// Here comes the obnoxious "visplane". +#define MAXVISPLANES 128 +visplane_t visplanes[MAXVISPLANES]; +visplane_t* lastvisplane; +visplane_t* floorplane; +visplane_t* ceilingplane; + +// ? +#define MAXOPENINGS SCREENWIDTH*64 +short openings[MAXOPENINGS]; +short* lastopening; + + +// +// Clip values are the solid pixel bounding the range. +// floorclip starts out SCREENHEIGHT +// ceilingclip starts out -1 +// +short floorclip[SCREENWIDTH]; +short ceilingclip[SCREENWIDTH]; + +// +// spanstart holds the start of a plane span +// initialized to 0 at start +// +int spanstart[SCREENHEIGHT]; +int spanstop[SCREENHEIGHT]; + +// +// texture mapping +// +lighttable_t** planezlight; +fixed_t planeheight; + +fixed_t yslope[SCREENHEIGHT]; +fixed_t distscale[SCREENWIDTH]; +fixed_t basexscale; +fixed_t baseyscale; + +fixed_t cachedheight[SCREENHEIGHT]; +fixed_t cacheddistance[SCREENHEIGHT]; +fixed_t cachedxstep[SCREENHEIGHT]; +fixed_t cachedystep[SCREENHEIGHT]; + + + +// +// R_InitPlanes +// Only at game startup. +// +void R_InitPlanes (void) +{ + // Doh! +} + + +// +// R_MapPlane +// +// Uses global vars: +// planeheight +// ds_source +// basexscale +// baseyscale +// viewx +// viewy +// +// BASIC PRIMITIVE +// +void +R_MapPlane +( int y, + int x1, + int x2 ) +{ + angle_t angle; + fixed_t distance; + fixed_t length; + unsigned index; + +#ifdef RANGECHECK + if (x2 < x1 + || x1 < 0 + || x2 >= viewwidth + || y > viewheight) + { + I_Error ("R_MapPlane: %i, %i at %i",x1,x2,y); + } +#endif + + if (planeheight != cachedheight[y]) + { + cachedheight[y] = planeheight; + distance = cacheddistance[y] = FixedMul (planeheight, yslope[y]); + ds_xstep = cachedxstep[y] = FixedMul (distance,basexscale); + ds_ystep = cachedystep[y] = FixedMul (distance,baseyscale); + } + else + { + distance = cacheddistance[y]; + ds_xstep = cachedxstep[y]; + ds_ystep = cachedystep[y]; + } + + length = FixedMul (distance,distscale[x1]); + angle = (viewangle + xtoviewangle[x1])>>ANGLETOFINESHIFT; + ds_xfrac = viewx + FixedMul(finecosine[angle], length); + ds_yfrac = -viewy - FixedMul(finesine[angle], length); + + if (fixedcolormap) + ds_colormap = fixedcolormap; + else + { + index = distance >> LIGHTZSHIFT; + + if (index >= MAXLIGHTZ ) + index = MAXLIGHTZ-1; + + ds_colormap = planezlight[index]; + } + + ds_y = y; + ds_x1 = x1; + ds_x2 = x2; + + // high or low detail + spanfunc (); +} + + +// +// R_ClearPlanes +// At begining of frame. +// +void R_ClearPlanes (void) +{ + int i; + angle_t angle; + + // opening / clipping determination + for (i=0 ; i>ANGLETOFINESHIFT; + + // scale will be unit scale at SCREENWIDTH/2 distance + basexscale = FixedDiv (finecosine[angle],centerxfrac); + baseyscale = -FixedDiv (finesine[angle],centerxfrac); +} + + + + +// +// R_FindPlane +// +visplane_t* +R_FindPlane +( fixed_t height, + int picnum, + int lightlevel ) +{ + visplane_t* check; + + if (picnum == skyflatnum) + { + height = 0; // all skys map together + lightlevel = 0; + } + + for (check=visplanes; checkheight + && picnum == check->picnum + && lightlevel == check->lightlevel) + { + break; + } + } + + + if (check < lastvisplane) + return check; + + if (lastvisplane - visplanes == MAXVISPLANES) + I_Error ("R_FindPlane: no more visplanes"); + + lastvisplane++; + + check->height = height; + check->picnum = picnum; + check->lightlevel = lightlevel; + check->minx = SCREENWIDTH; + check->maxx = -1; + + memset (check->top,0xff,sizeof(check->top)); + + return check; +} + + +// +// R_CheckPlane +// +visplane_t* +R_CheckPlane +( visplane_t* pl, + int start, + int stop ) +{ + int intrl; + int intrh; + int unionl; + int unionh; + int x; + + if (start < pl->minx) + { + intrl = pl->minx; + unionl = start; + } + else + { + unionl = pl->minx; + intrl = start; + } + + if (stop > pl->maxx) + { + intrh = pl->maxx; + unionh = stop; + } + else + { + unionh = pl->maxx; + intrh = stop; + } + + for (x=intrl ; x<= intrh ; x++) + if (pl->top[x] != 0xff) + break; + + if (x > intrh) + { + pl->minx = unionl; + pl->maxx = unionh; + + // use the same one + return pl; + } + + // make a new visplane + lastvisplane->height = pl->height; + lastvisplane->picnum = pl->picnum; + lastvisplane->lightlevel = pl->lightlevel; + + pl = lastvisplane++; + pl->minx = start; + pl->maxx = stop; + + memset (pl->top,0xff,sizeof(pl->top)); + + return pl; +} + + +// +// R_MakeSpans +// +void +R_MakeSpans +( int x, + int t1, + int b1, + int t2, + int b2 ) +{ + while (t1 < t2 && t1<=b1) + { + R_MapPlane (t1,spanstart[t1],x-1); + t1++; + } + while (b1 > b2 && b1>=t1) + { + R_MapPlane (b1,spanstart[b1],x-1); + b1--; + } + + while (t2 < t1 && t2<=b2) + { + spanstart[t2] = x; + t2++; + } + while (b2 > b1 && b2>=t2) + { + spanstart[b2] = x; + b2--; + } +} + + + +// +// R_DrawPlanes +// At the end of each frame. +// +void R_DrawPlanes (void) +{ + visplane_t* pl; + int light; + int x; + int stop; + int angle; + int lumpnum; + +#ifdef RANGECHECK + if (ds_p - drawsegs > MAXDRAWSEGS) + I_Error ("R_DrawPlanes: drawsegs overflow (%i)", + ds_p - drawsegs); + + if (lastvisplane - visplanes > MAXVISPLANES) + I_Error ("R_DrawPlanes: visplane overflow (%i)", + lastvisplane - visplanes); + + if (lastopening - openings > MAXOPENINGS) + I_Error ("R_DrawPlanes: opening overflow (%i)", + lastopening - openings); +#endif + + for (pl = visplanes ; pl < lastvisplane ; pl++) + { + if (pl->minx > pl->maxx) + continue; + + + // sky flat + if (pl->picnum == skyflatnum) + { + dc_iscale = pspriteiscale>>detailshift; + + // Sky is allways drawn full bright, + // i.e. colormaps[0] is used. + // Because of this hack, sky is not affected + // by INVUL inverse mapping. + dc_colormap = colormaps; + dc_texturemid = skytexturemid; + for (x=pl->minx ; x <= pl->maxx ; x++) + { + dc_yl = pl->top[x]; + dc_yh = pl->bottom[x]; + + if (dc_yl <= dc_yh) + { + angle = (viewangle + xtoviewangle[x])>>ANGLETOSKYSHIFT; + dc_x = x; + dc_source = R_GetColumn(skytexture, angle); + colfunc (); + } + } + continue; + } + + // regular flat + lumpnum = firstflat + flattranslation[pl->picnum]; + ds_source = W_CacheLumpNum(lumpnum, PU_STATIC); + + planeheight = abs(pl->height-viewz); + light = (pl->lightlevel >> LIGHTSEGSHIFT)+extralight; + + if (light >= LIGHTLEVELS) + light = LIGHTLEVELS-1; + + if (light < 0) + light = 0; + + planezlight = zlight[light]; + + pl->top[pl->maxx+1] = 0xff; + pl->top[pl->minx-1] = 0xff; + + stop = pl->maxx + 1; + + for (x=pl->minx ; x<= stop ; x++) + { + R_MakeSpans(x,pl->top[x-1], + pl->bottom[x-1], + pl->top[x], + pl->bottom[x]); + } + + W_ReleaseLumpNum(lumpnum); + } +} diff --git a/firmware_p4/components/Applications/doom/r_plane.h b/firmware_p4/components/Applications/doom/r_plane.h new file mode 100644 index 000000000..57b50e5bc --- /dev/null +++ b/firmware_p4/components/Applications/doom/r_plane.h @@ -0,0 +1,76 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Refresh, visplane stuff (floor, ceilings). +// + + +#ifndef __R_PLANE__ +#define __R_PLANE__ + + +#include "r_data.h" + + + +// Visplane related. +extern short* lastopening; + + +typedef void (*planefunction_t) (int top, int bottom); + +extern planefunction_t floorfunc; +extern planefunction_t ceilingfunc_t; + +extern short floorclip[SCREENWIDTH]; +extern short ceilingclip[SCREENWIDTH]; + +extern fixed_t yslope[SCREENHEIGHT]; +extern fixed_t distscale[SCREENWIDTH]; + +void R_InitPlanes (void); +void R_ClearPlanes (void); + +void +R_MapPlane +( int y, + int x1, + int x2 ); + +void +R_MakeSpans +( int x, + int t1, + int b1, + int t2, + int b2 ); + +void R_DrawPlanes (void); + +visplane_t* +R_FindPlane +( fixed_t height, + int picnum, + int lightlevel ); + +visplane_t* +R_CheckPlane +( visplane_t* pl, + int start, + int stop ); + + + +#endif diff --git a/firmware_p4/components/Applications/doom/r_segs.c b/firmware_p4/components/Applications/doom/r_segs.c new file mode 100644 index 000000000..9b4e413c8 --- /dev/null +++ b/firmware_p4/components/Applications/doom/r_segs.c @@ -0,0 +1,743 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// All the clipping: columns, horizontal spans, sky columns. +// + + + + + + +#include +#include + +#include "i_system.h" + +#include "doomdef.h" +#include "doomstat.h" + +#include "r_local.h" +#include "r_sky.h" + + +// OPTIMIZE: closed two sided lines as single sided + +// True if any of the segs textures might be visible. +boolean segtextured; + +// False if the back side is the same plane. +boolean markfloor; +boolean markceiling; + +boolean maskedtexture; +int toptexture; +int bottomtexture; +int midtexture; + + +angle_t rw_normalangle; +// angle to line origin +int rw_angle1; + +// +// regular wall +// +int rw_x; +int rw_stopx; +angle_t rw_centerangle; +fixed_t rw_offset; +fixed_t rw_distance; +fixed_t rw_scale; +fixed_t rw_scalestep; +fixed_t rw_midtexturemid; +fixed_t rw_toptexturemid; +fixed_t rw_bottomtexturemid; + +int worldtop; +int worldbottom; +int worldhigh; +int worldlow; + +fixed_t pixhigh; +fixed_t pixlow; +fixed_t pixhighstep; +fixed_t pixlowstep; + +fixed_t topfrac; +fixed_t topstep; + +fixed_t bottomfrac; +fixed_t bottomstep; + + +lighttable_t** walllights; + +short* maskedtexturecol; + + + +// +// R_RenderMaskedSegRange +// +void +R_RenderMaskedSegRange +( drawseg_t* ds, + int x1, + int x2 ) +{ + unsigned index; + column_t* col; + int lightnum; + int texnum; + + // Calculate light table. + // Use different light tables + // for horizontal / vertical / diagonal. Diagonal? + // OPTIMIZE: get rid of LIGHTSEGSHIFT globally + curline = ds->curline; + frontsector = curline->frontsector; + backsector = curline->backsector; + texnum = texturetranslation[curline->sidedef->midtexture]; + + lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT)+extralight; + + if (curline->v1->y == curline->v2->y) + lightnum--; + else if (curline->v1->x == curline->v2->x) + lightnum++; + + if (lightnum < 0) + walllights = scalelight[0]; + else if (lightnum >= LIGHTLEVELS) + walllights = scalelight[LIGHTLEVELS-1]; + else + walllights = scalelight[lightnum]; + + maskedtexturecol = ds->maskedtexturecol; + + rw_scalestep = ds->scalestep; + spryscale = ds->scale1 + (x1 - ds->x1)*rw_scalestep; + mfloorclip = ds->sprbottomclip; + mceilingclip = ds->sprtopclip; + + // find positioning + if (curline->linedef->flags & ML_DONTPEGBOTTOM) + { + dc_texturemid = frontsector->floorheight > backsector->floorheight + ? frontsector->floorheight : backsector->floorheight; + dc_texturemid = dc_texturemid + textureheight[texnum] - viewz; + } + else + { + dc_texturemid =frontsector->ceilingheightceilingheight + ? frontsector->ceilingheight : backsector->ceilingheight; + dc_texturemid = dc_texturemid - viewz; + } + dc_texturemid += curline->sidedef->rowoffset; + + if (fixedcolormap) + dc_colormap = fixedcolormap; + + // draw the columns + for (dc_x = x1 ; dc_x <= x2 ; dc_x++) + { + // calculate lighting + if (maskedtexturecol[dc_x] != SHRT_MAX) + { + if (!fixedcolormap) + { + index = spryscale>>LIGHTSCALESHIFT; + + if (index >= MAXLIGHTSCALE ) + index = MAXLIGHTSCALE-1; + + dc_colormap = walllights[index]; + } + + sprtopscreen = centeryfrac - FixedMul(dc_texturemid, spryscale); + dc_iscale = 0xffffffffu / (unsigned)spryscale; + + // draw the texture + col = (column_t *)( + (byte *)R_GetColumn(texnum,maskedtexturecol[dc_x]) -3); + + R_DrawMaskedColumn (col); + maskedtexturecol[dc_x] = SHRT_MAX; + } + spryscale += rw_scalestep; + } + +} + + + + +// +// R_RenderSegLoop +// Draws zero, one, or two textures (and possibly a masked +// texture) for walls. +// Can draw or mark the starting pixel of floor and ceiling +// textures. +// CALLED: CORE LOOPING ROUTINE. +// +#define HEIGHTBITS 12 +#define HEIGHTUNIT (1<>HEIGHTBITS; + + // no space above wall? + if (yl < ceilingclip[rw_x]+1) + yl = ceilingclip[rw_x]+1; + + if (markceiling) + { + top = ceilingclip[rw_x]+1; + bottom = yl-1; + + if (bottom >= floorclip[rw_x]) + bottom = floorclip[rw_x]-1; + + if (top <= bottom) + { + ceilingplane->top[rw_x] = top; + ceilingplane->bottom[rw_x] = bottom; + } + } + + yh = bottomfrac>>HEIGHTBITS; + + if (yh >= floorclip[rw_x]) + yh = floorclip[rw_x]-1; + + if (markfloor) + { + top = yh+1; + bottom = floorclip[rw_x]-1; + if (top <= ceilingclip[rw_x]) + top = ceilingclip[rw_x]+1; + if (top <= bottom) + { + floorplane->top[rw_x] = top; + floorplane->bottom[rw_x] = bottom; + } + } + + // texturecolumn and lighting are independent of wall tiers + if (segtextured) + { + // calculate texture offset + angle = (rw_centerangle + xtoviewangle[rw_x])>>ANGLETOFINESHIFT; + texturecolumn = rw_offset-FixedMul(finetangent[angle],rw_distance); + texturecolumn >>= FRACBITS; + // calculate lighting + index = rw_scale>>LIGHTSCALESHIFT; + + if (index >= MAXLIGHTSCALE ) + index = MAXLIGHTSCALE-1; + + dc_colormap = walllights[index]; + dc_x = rw_x; + dc_iscale = 0xffffffffu / (unsigned)rw_scale; + } + else + { + // purely to shut up the compiler + + texturecolumn = 0; + } + + // draw the wall tiers + if (midtexture) + { + // single sided line + dc_yl = yl; + dc_yh = yh; + dc_texturemid = rw_midtexturemid; + dc_source = R_GetColumn(midtexture,texturecolumn); + colfunc (); + ceilingclip[rw_x] = viewheight; + floorclip[rw_x] = -1; + } + else + { + // two sided line + if (toptexture) + { + // top wall + mid = pixhigh>>HEIGHTBITS; + pixhigh += pixhighstep; + + if (mid >= floorclip[rw_x]) + mid = floorclip[rw_x]-1; + + if (mid >= yl) + { + dc_yl = yl; + dc_yh = mid; + dc_texturemid = rw_toptexturemid; + dc_source = R_GetColumn(toptexture,texturecolumn); + colfunc (); + ceilingclip[rw_x] = mid; + } + else + ceilingclip[rw_x] = yl-1; + } + else + { + // no top wall + if (markceiling) + ceilingclip[rw_x] = yl-1; + } + + if (bottomtexture) + { + // bottom wall + mid = (pixlow+HEIGHTUNIT-1)>>HEIGHTBITS; + pixlow += pixlowstep; + + // no space above wall? + if (mid <= ceilingclip[rw_x]) + mid = ceilingclip[rw_x]+1; + + if (mid <= yh) + { + dc_yl = mid; + dc_yh = yh; + dc_texturemid = rw_bottomtexturemid; + dc_source = R_GetColumn(bottomtexture, + texturecolumn); + colfunc (); + floorclip[rw_x] = mid; + } + else + floorclip[rw_x] = yh+1; + } + else + { + // no bottom wall + if (markfloor) + floorclip[rw_x] = yh+1; + } + + if (maskedtexture) + { + // save texturecol + // for backdrawing of masked mid texture + maskedtexturecol[rw_x] = texturecolumn; + } + } + + rw_scale += rw_scalestep; + topfrac += topstep; + bottomfrac += bottomstep; + } +} + + + + +// +// R_StoreWallRange +// A wall segment will be drawn +// between start and stop pixels (inclusive). +// +void +R_StoreWallRange +( int start, + int stop ) +{ + fixed_t hyp; + fixed_t sineval; + angle_t distangle, offsetangle; + fixed_t vtop; + int lightnum; + + // don't overflow and crash + if (ds_p == &drawsegs[MAXDRAWSEGS]) + return; + +#ifdef RANGECHECK + if (start >=viewwidth || start > stop) + I_Error ("Bad R_RenderWallRange: %i to %i", start , stop); +#endif + + sidedef = curline->sidedef; + linedef = curline->linedef; + + // mark the segment as visible for auto map + linedef->flags |= ML_MAPPED; + + // calculate rw_distance for scale calculation + rw_normalangle = curline->angle + ANG90; + offsetangle = abs(rw_normalangle-rw_angle1); + + if (offsetangle > ANG90) + offsetangle = ANG90; + + distangle = ANG90 - offsetangle; + hyp = R_PointToDist (curline->v1->x, curline->v1->y); + sineval = finesine[distangle>>ANGLETOFINESHIFT]; + rw_distance = FixedMul (hyp, sineval); + + + ds_p->x1 = rw_x = start; + ds_p->x2 = stop; + ds_p->curline = curline; + rw_stopx = stop+1; + + // calculate scale at both ends and step + ds_p->scale1 = rw_scale = + R_ScaleFromGlobalAngle (viewangle + xtoviewangle[start]); + + if (stop > start ) + { + ds_p->scale2 = R_ScaleFromGlobalAngle (viewangle + xtoviewangle[stop]); + ds_p->scalestep = rw_scalestep = + (ds_p->scale2 - rw_scale) / (stop-start); + } + else + { + // UNUSED: try to fix the stretched line bug +#if 0 + if (rw_distance < FRACUNIT/2) + { + fixed_t trx,try; + fixed_t gxt,gyt; + + trx = curline->v1->x - viewx; + try = curline->v1->y - viewy; + + gxt = FixedMul(trx,viewcos); + gyt = -FixedMul(try,viewsin); + ds_p->scale1 = FixedDiv(projection, gxt-gyt)<scale2 = ds_p->scale1; + } + + // calculate texture boundaries + // and decide if floor / ceiling marks are needed + worldtop = frontsector->ceilingheight - viewz; + worldbottom = frontsector->floorheight - viewz; + + midtexture = toptexture = bottomtexture = maskedtexture = 0; + ds_p->maskedtexturecol = NULL; + + if (!backsector) + { + // single sided line + midtexture = texturetranslation[sidedef->midtexture]; + // a single sided line is terminal, so it must mark ends + markfloor = markceiling = true; + if (linedef->flags & ML_DONTPEGBOTTOM) + { + vtop = frontsector->floorheight + + textureheight[sidedef->midtexture]; + // bottom of texture at bottom + rw_midtexturemid = vtop - viewz; + } + else + { + // top of texture at top + rw_midtexturemid = worldtop; + } + rw_midtexturemid += sidedef->rowoffset; + + ds_p->silhouette = SIL_BOTH; + ds_p->sprtopclip = screenheightarray; + ds_p->sprbottomclip = negonearray; + ds_p->bsilheight = INT_MAX; + ds_p->tsilheight = INT_MIN; + } + else + { + // two sided line + ds_p->sprtopclip = ds_p->sprbottomclip = NULL; + ds_p->silhouette = 0; + + if (frontsector->floorheight > backsector->floorheight) + { + ds_p->silhouette = SIL_BOTTOM; + ds_p->bsilheight = frontsector->floorheight; + } + else if (backsector->floorheight > viewz) + { + ds_p->silhouette = SIL_BOTTOM; + ds_p->bsilheight = INT_MAX; + // ds_p->sprbottomclip = negonearray; + } + + if (frontsector->ceilingheight < backsector->ceilingheight) + { + ds_p->silhouette |= SIL_TOP; + ds_p->tsilheight = frontsector->ceilingheight; + } + else if (backsector->ceilingheight < viewz) + { + ds_p->silhouette |= SIL_TOP; + ds_p->tsilheight = INT_MIN; + // ds_p->sprtopclip = screenheightarray; + } + + if (backsector->ceilingheight <= frontsector->floorheight) + { + ds_p->sprbottomclip = negonearray; + ds_p->bsilheight = INT_MAX; + ds_p->silhouette |= SIL_BOTTOM; + } + + if (backsector->floorheight >= frontsector->ceilingheight) + { + ds_p->sprtopclip = screenheightarray; + ds_p->tsilheight = INT_MIN; + ds_p->silhouette |= SIL_TOP; + } + + worldhigh = backsector->ceilingheight - viewz; + worldlow = backsector->floorheight - viewz; + + // hack to allow height changes in outdoor areas + if (frontsector->ceilingpic == skyflatnum + && backsector->ceilingpic == skyflatnum) + { + worldtop = worldhigh; + } + + + if (worldlow != worldbottom + || backsector->floorpic != frontsector->floorpic + || backsector->lightlevel != frontsector->lightlevel) + { + markfloor = true; + } + else + { + // same plane on both sides + markfloor = false; + } + + + if (worldhigh != worldtop + || backsector->ceilingpic != frontsector->ceilingpic + || backsector->lightlevel != frontsector->lightlevel) + { + markceiling = true; + } + else + { + // same plane on both sides + markceiling = false; + } + + if (backsector->ceilingheight <= frontsector->floorheight + || backsector->floorheight >= frontsector->ceilingheight) + { + // closed door + markceiling = markfloor = true; + } + + + if (worldhigh < worldtop) + { + // top texture + toptexture = texturetranslation[sidedef->toptexture]; + if (linedef->flags & ML_DONTPEGTOP) + { + // top of texture at top + rw_toptexturemid = worldtop; + } + else + { + vtop = + backsector->ceilingheight + + textureheight[sidedef->toptexture]; + + // bottom of texture + rw_toptexturemid = vtop - viewz; + } + } + if (worldlow > worldbottom) + { + // bottom texture + bottomtexture = texturetranslation[sidedef->bottomtexture]; + + if (linedef->flags & ML_DONTPEGBOTTOM ) + { + // bottom of texture at bottom + // top of texture at top + rw_bottomtexturemid = worldtop; + } + else // top of texture at top + rw_bottomtexturemid = worldlow; + } + rw_toptexturemid += sidedef->rowoffset; + rw_bottomtexturemid += sidedef->rowoffset; + + // allocate space for masked texture tables + if (sidedef->midtexture) + { + // masked midtexture + maskedtexture = true; + ds_p->maskedtexturecol = maskedtexturecol = lastopening - rw_x; + lastopening += rw_stopx - rw_x; + } + } + + // calculate rw_offset (only needed for textured lines) + segtextured = midtexture | toptexture | bottomtexture | maskedtexture; + + if (segtextured) + { + offsetangle = rw_normalangle-rw_angle1; + + if (offsetangle > ANG180) + offsetangle = -offsetangle; + + if (offsetangle > ANG90) + offsetangle = ANG90; + + sineval = finesine[offsetangle >>ANGLETOFINESHIFT]; + rw_offset = FixedMul (hyp, sineval); + + if (rw_normalangle-rw_angle1 < ANG180) + rw_offset = -rw_offset; + + rw_offset += sidedef->textureoffset + curline->offset; + rw_centerangle = ANG90 + viewangle - rw_normalangle; + + // calculate light table + // use different light tables + // for horizontal / vertical / diagonal + // OPTIMIZE: get rid of LIGHTSEGSHIFT globally + if (!fixedcolormap) + { + lightnum = (frontsector->lightlevel >> LIGHTSEGSHIFT)+extralight; + + if (curline->v1->y == curline->v2->y) + lightnum--; + else if (curline->v1->x == curline->v2->x) + lightnum++; + + if (lightnum < 0) + walllights = scalelight[0]; + else if (lightnum >= LIGHTLEVELS) + walllights = scalelight[LIGHTLEVELS-1]; + else + walllights = scalelight[lightnum]; + } + } + + // if a floor / ceiling plane is on the wrong side + // of the view plane, it is definitely invisible + // and doesn't need to be marked. + + + if (frontsector->floorheight >= viewz) + { + // above view plane + markfloor = false; + } + + if (frontsector->ceilingheight <= viewz + && frontsector->ceilingpic != skyflatnum) + { + // below view plane + markceiling = false; + } + + + // calculate incremental stepping values for texture edges + worldtop >>= 4; + worldbottom >>= 4; + + topstep = -FixedMul (rw_scalestep, worldtop); + topfrac = (centeryfrac>>4) - FixedMul (worldtop, rw_scale); + + bottomstep = -FixedMul (rw_scalestep,worldbottom); + bottomfrac = (centeryfrac>>4) - FixedMul (worldbottom, rw_scale); + + if (backsector) + { + worldhigh >>= 4; + worldlow >>= 4; + + if (worldhigh < worldtop) + { + pixhigh = (centeryfrac>>4) - FixedMul (worldhigh, rw_scale); + pixhighstep = -FixedMul (rw_scalestep,worldhigh); + } + + if (worldlow > worldbottom) + { + pixlow = (centeryfrac>>4) - FixedMul (worldlow, rw_scale); + pixlowstep = -FixedMul (rw_scalestep,worldlow); + } + } + + // render it + if (markceiling) + ceilingplane = R_CheckPlane (ceilingplane, rw_x, rw_stopx-1); + + if (markfloor) + floorplane = R_CheckPlane (floorplane, rw_x, rw_stopx-1); + + R_RenderSegLoop (); + + + // save sprite clipping info + if ( ((ds_p->silhouette & SIL_TOP) || maskedtexture) + && !ds_p->sprtopclip) + { + memcpy (lastopening, ceilingclip+start, 2*(rw_stopx-start)); + ds_p->sprtopclip = lastopening - start; + lastopening += rw_stopx - start; + } + + if ( ((ds_p->silhouette & SIL_BOTTOM) || maskedtexture) + && !ds_p->sprbottomclip) + { + memcpy (lastopening, floorclip+start, 2*(rw_stopx-start)); + ds_p->sprbottomclip = lastopening - start; + lastopening += rw_stopx - start; + } + + if (maskedtexture && !(ds_p->silhouette&SIL_TOP)) + { + ds_p->silhouette |= SIL_TOP; + ds_p->tsilheight = INT_MIN; + } + if (maskedtexture && !(ds_p->silhouette&SIL_BOTTOM)) + { + ds_p->silhouette |= SIL_BOTTOM; + ds_p->bsilheight = INT_MAX; + } + ds_p++; +} + diff --git a/firmware_p4/components/Applications/doom/r_segs.h b/firmware_p4/components/Applications/doom/r_segs.h new file mode 100644 index 000000000..d4a4d8996 --- /dev/null +++ b/firmware_p4/components/Applications/doom/r_segs.h @@ -0,0 +1,33 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Refresh module, drawing LineSegs from BSP. +// + + +#ifndef __R_SEGS__ +#define __R_SEGS__ + + + + +void +R_RenderMaskedSegRange +( drawseg_t* ds, + int x1, + int x2 ); + + +#endif diff --git a/firmware_p4/components/Applications/doom/r_sky.c b/firmware_p4/components/Applications/doom/r_sky.c new file mode 100644 index 000000000..667c88d33 --- /dev/null +++ b/firmware_p4/components/Applications/doom/r_sky.c @@ -0,0 +1,52 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Sky rendering. The DOOM sky is a texture map like any +// wall, wrapping around. A 1024 columns equal 360 degrees. +// The default sky map is 256 columns and repeats 4 times +// on a 320 screen? +// +// + + + +// Needed for FRACUNIT. +#include "m_fixed.h" + +// Needed for Flat retrieval. +#include "r_data.h" + + +#include "r_sky.h" + +// +// sky mapping +// +int skyflatnum; +int skytexture; +int skytexturemid; + + + +// +// R_InitSkyMap +// Called whenever the view size changes. +// +void R_InitSkyMap (void) +{ + // skyflatnum = R_FlatNumForName ( SKYFLATNAME ); + skytexturemid = 100*FRACUNIT; +} + diff --git a/firmware_p4/components/Applications/doom/r_sky.h b/firmware_p4/components/Applications/doom/r_sky.h new file mode 100644 index 000000000..8ad6680aa --- /dev/null +++ b/firmware_p4/components/Applications/doom/r_sky.h @@ -0,0 +1,37 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Sky rendering. +// + + +#ifndef __R_SKY__ +#define __R_SKY__ + + + +// SKY, store the number for name. +#define SKYFLATNAME "F_SKY1" + +// The sky map is 256*128*4 maps. +#define ANGLETOSKYSHIFT 22 + +extern int skytexture; +extern int skytexturemid; + +// Called whenever the view size changes. +void R_InitSkyMap (void); + +#endif diff --git a/firmware_p4/components/Applications/doom/r_state.h b/firmware_p4/components/Applications/doom/r_state.h new file mode 100644 index 000000000..2a60e2fe8 --- /dev/null +++ b/firmware_p4/components/Applications/doom/r_state.h @@ -0,0 +1,127 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Refresh/render internal state variables (global). +// + + +#ifndef __R_STATE__ +#define __R_STATE__ + +// Need data structure definitions. +#include "d_player.h" +#include "r_data.h" + + + + + + +// +// Refresh internal data structures, +// for rendering. +// + +// needed for texture pegging +extern fixed_t* textureheight; + +// needed for pre rendering (fracs) +extern fixed_t* spritewidth; + +extern fixed_t* spriteoffset; +extern fixed_t* spritetopoffset; + +extern lighttable_t* colormaps; + +extern int viewwidth; +extern int scaledviewwidth; +extern int viewheight; + +extern int firstflat; + +// for global animation +extern int* flattranslation; +extern int* texturetranslation; + + +// Sprite.... +extern int firstspritelump; +extern int lastspritelump; +extern int numspritelumps; + + + +// +// Lookup tables for map data. +// +extern int numsprites; +extern spritedef_t* sprites; + +extern int numvertexes; +extern vertex_t* vertexes; + +extern int numsegs; +extern seg_t* segs; + +extern int numsectors; +extern sector_t* sectors; + +extern int numsubsectors; +extern subsector_t* subsectors; + +extern int numnodes; +extern node_t* nodes; + +extern int numlines; +extern line_t* lines; + +extern int numsides; +extern side_t* sides; + + +// +// POV data. +// +extern fixed_t viewx; +extern fixed_t viewy; +extern fixed_t viewz; + +extern angle_t viewangle; +extern player_t* viewplayer; + + +// ? +extern angle_t clipangle; + +extern int viewangletox[FINEANGLES/2]; +extern angle_t xtoviewangle[SCREENWIDTH+1]; +//extern fixed_t finetangent[FINEANGLES/2]; + +extern fixed_t rw_distance; +extern angle_t rw_normalangle; + + + +// angle to line origin +extern int rw_angle1; + +// Segs count? +extern int sscount; + +extern visplane_t* floorplane; +extern visplane_t* ceilingplane; + + +#endif diff --git a/firmware_p4/components/Applications/doom/r_things.c b/firmware_p4/components/Applications/doom/r_things.c new file mode 100644 index 000000000..74e7369b8 --- /dev/null +++ b/firmware_p4/components/Applications/doom/r_things.c @@ -0,0 +1,982 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Refresh of things, i.e. objects represented by sprites. +// + + + + +#include +#include + + +#include "deh_main.h" +#include "doomdef.h" + +#include "i_swap.h" +#include "i_system.h" +#include "z_zone.h" +#include "w_wad.h" + +#include "r_local.h" + +#include "doomstat.h" + + + +#define MINZ (FRACUNIT*4) +#define BASEYCENTER 100 + +//void R_DrawColumn (void); +//void R_DrawFuzzColumn (void); + + + +typedef struct +{ + int x1; + int x2; + + int column; + int topclip; + int bottomclip; + +} maskdraw_t; + + + +// +// Sprite rotation 0 is facing the viewer, +// rotation 1 is one angle turn CLOCKWISE around the axis. +// This is not the same as the angle, +// which increases counter clockwise (protractor). +// There was a lot of stuff grabbed wrong, so I changed it... +// +fixed_t pspritescale; +fixed_t pspriteiscale; + +lighttable_t** spritelights; + +// constant arrays +// used for psprite clipping and initializing clipping +short negonearray[SCREENWIDTH]; +short screenheightarray[SCREENWIDTH]; + + +// +// INITIALIZATION FUNCTIONS +// + +// variables used to look up +// and range check thing_t sprites patches +spritedef_t* sprites; +int numsprites; + +spriteframe_t sprtemp[29]; +int maxframe; +char* spritename; + + + + +// +// R_InstallSpriteLump +// Local function for R_InitSprites. +// +void +R_InstallSpriteLump +( int lump, + unsigned frame, + unsigned rotation, + boolean flipped ) +{ + int r; + + if (frame >= 29 || rotation > 8) + I_Error("R_InstallSpriteLump: " + "Bad frame characters in lump %i", lump); + + if ((int)frame > maxframe) + maxframe = frame; + + if (rotation == 0) + { + // the lump should be used for all rotations + if (sprtemp[frame].rotate == false) + I_Error ("R_InitSprites: Sprite %s frame %c has " + "multip rot=0 lump", spritename, 'A'+frame); + + if (sprtemp[frame].rotate == true) + I_Error ("R_InitSprites: Sprite %s frame %c has rotations " + "and a rot=0 lump", spritename, 'A'+frame); + + sprtemp[frame].rotate = false; + for (r=0 ; r<8 ; r++) + { + sprtemp[frame].lump[r] = lump - firstspritelump; + sprtemp[frame].flip[r] = (byte)flipped; + } + return; + } + + // the lump is only used for one rotation + if (sprtemp[frame].rotate == false) + I_Error ("R_InitSprites: Sprite %s frame %c has rotations " + "and a rot=0 lump", spritename, 'A'+frame); + + sprtemp[frame].rotate = true; + + // make 0 based + rotation--; + if (sprtemp[frame].lump[rotation] != -1) + I_Error ("R_InitSprites: Sprite %s : %c : %c " + "has two lumps mapped to it", + spritename, 'A'+frame, '1'+rotation); + + sprtemp[frame].lump[rotation] = lump - firstspritelump; + sprtemp[frame].flip[rotation] = (byte)flipped; +} + + + + +// +// R_InitSpriteDefs +// Pass a null terminated list of sprite names +// (4 chars exactly) to be used. +// Builds the sprite rotation matrixes to account +// for horizontally flipped sprites. +// Will report an error if the lumps are inconsistant. +// Only called at startup. +// +// Sprite lump names are 4 characters for the actor, +// a letter for the frame, and a number for the rotation. +// A sprite that is flippable will have an additional +// letter/number appended. +// The rotation character can be 0 to signify no rotations. +// +void R_InitSpriteDefs (char** namelist) +{ + char** check; + int i; + int l; + int frame; + int rotation; + int start; + int end; + int patched; + + // count the number of sprite names + check = namelist; + while (*check != NULL) + check++; + + numsprites = check-namelist; + + if (!numsprites) + return; + + sprites = Z_Malloc(numsprites *sizeof(*sprites), PU_STATIC, NULL); + + start = firstspritelump-1; + end = lastspritelump+1; + + // scan all the lump names for each of the names, + // noting the highest frame letter. + // Just compare 4 characters as ints + for (i=0 ; itopdelta != 0xff ; ) + { + // calculate unclipped screen coordinates + // for post + topscreen = sprtopscreen + spryscale*column->topdelta; + bottomscreen = topscreen + spryscale*column->length; + + dc_yl = (topscreen+FRACUNIT-1)>>FRACBITS; + dc_yh = (bottomscreen-1)>>FRACBITS; + + if (dc_yh >= mfloorclip[dc_x]) + dc_yh = mfloorclip[dc_x]-1; + if (dc_yl <= mceilingclip[dc_x]) + dc_yl = mceilingclip[dc_x]+1; + + if (dc_yl <= dc_yh) + { + dc_source = (byte *)column + 3; + dc_texturemid = basetexturemid - (column->topdelta<topdelta; + + // Drawn by either R_DrawColumn + // or (SHADOW) R_DrawFuzzColumn. + colfunc (); + } + column = (column_t *)( (byte *)column + column->length + 4); + } + + dc_texturemid = basetexturemid; +} + + + +// +// R_DrawVisSprite +// mfloorclip and mceilingclip should also be set. +// +void +R_DrawVisSprite +( vissprite_t* vis, + int x1, + int x2 ) +{ + column_t* column; + int texturecolumn; + fixed_t frac; + patch_t* patch; + + + patch = W_CacheLumpNum (vis->patch+firstspritelump, PU_CACHE); + + dc_colormap = vis->colormap; + + if (!dc_colormap) + { + // NULL colormap = shadow draw + colfunc = fuzzcolfunc; + } + else if (vis->mobjflags & MF_TRANSLATION) + { + colfunc = transcolfunc; + dc_translation = translationtables - 256 + + ( (vis->mobjflags & MF_TRANSLATION) >> (MF_TRANSSHIFT-8) ); + } + + dc_iscale = abs(vis->xiscale)>>detailshift; + dc_texturemid = vis->texturemid; + frac = vis->startfrac; + spryscale = vis->scale; + sprtopscreen = centeryfrac - FixedMul(dc_texturemid,spryscale); + + for (dc_x=vis->x1 ; dc_x<=vis->x2 ; dc_x++, frac += vis->xiscale) + { + texturecolumn = frac>>FRACBITS; +#ifdef RANGECHECK + if (texturecolumn < 0 || texturecolumn >= SHORT(patch->width)) + I_Error ("R_DrawSpriteRange: bad texturecolumn"); +#endif + column = (column_t *) ((byte *)patch + + LONG(patch->columnofs[texturecolumn])); + R_DrawMaskedColumn (column); + } + + colfunc = basecolfunc; +} + + + +// +// R_ProjectSprite +// Generates a vissprite for a thing +// if it might be visible. +// +void R_ProjectSprite (mobj_t* thing) +{ + fixed_t tr_x; + fixed_t tr_y; + + fixed_t gxt; + fixed_t gyt; + + fixed_t tx; + fixed_t tz; + + fixed_t xscale; + + int x1; + int x2; + + spritedef_t* sprdef; + spriteframe_t* sprframe; + int lump; + + unsigned rot; + boolean flip; + + int index; + + vissprite_t* vis; + + angle_t ang; + fixed_t iscale; + + // transform the origin point + tr_x = thing->x - viewx; + tr_y = thing->y - viewy; + + gxt = FixedMul(tr_x,viewcos); + gyt = -FixedMul(tr_y,viewsin); + + tz = gxt-gyt; + + // thing is behind view plane? + if (tz < MINZ) + return; + + xscale = FixedDiv(projection, tz); + + gxt = -FixedMul(tr_x,viewsin); + gyt = FixedMul(tr_y,viewcos); + tx = -(gyt+gxt); + + // too far off the side? + if (abs(tx)>(tz<<2)) + return; + + // decide which patch to use for sprite relative to player +#ifdef RANGECHECK + if ((unsigned int) thing->sprite >= (unsigned int) numsprites) + I_Error ("R_ProjectSprite: invalid sprite number %i ", + thing->sprite); +#endif + sprdef = &sprites[thing->sprite]; +#ifdef RANGECHECK + if ( (thing->frame&FF_FRAMEMASK) >= sprdef->numframes ) + I_Error ("R_ProjectSprite: invalid sprite frame %i : %i ", + thing->sprite, thing->frame); +#endif + sprframe = &sprdef->spriteframes[ thing->frame & FF_FRAMEMASK]; + + if (sprframe->rotate) + { + // choose a different rotation based on player view + ang = R_PointToAngle (thing->x, thing->y); + rot = (ang-thing->angle+(unsigned)(ANG45/2)*9)>>29; + lump = sprframe->lump[rot]; + flip = (boolean)sprframe->flip[rot]; + } + else + { + // use single rotation for all views + lump = sprframe->lump[0]; + flip = (boolean)sprframe->flip[0]; + } + + // calculate edges of the shape + tx -= spriteoffset[lump]; + x1 = (centerxfrac + FixedMul (tx,xscale) ) >>FRACBITS; + + // off the right side? + if (x1 > viewwidth) + return; + + tx += spritewidth[lump]; + x2 = ((centerxfrac + FixedMul (tx,xscale) ) >>FRACBITS) - 1; + + // off the left side + if (x2 < 0) + return; + + // store information in a vissprite + vis = R_NewVisSprite (); + vis->mobjflags = thing->flags; + vis->scale = xscale<gx = thing->x; + vis->gy = thing->y; + vis->gz = thing->z; + vis->gzt = thing->z + spritetopoffset[lump]; + vis->texturemid = vis->gzt - viewz; + vis->x1 = x1 < 0 ? 0 : x1; + vis->x2 = x2 >= viewwidth ? viewwidth-1 : x2; + iscale = FixedDiv (FRACUNIT, xscale); + + if (flip) + { + vis->startfrac = spritewidth[lump]-1; + vis->xiscale = -iscale; + } + else + { + vis->startfrac = 0; + vis->xiscale = iscale; + } + + if (vis->x1 > x1) + vis->startfrac += vis->xiscale*(vis->x1-x1); + vis->patch = lump; + + // get light level + if (thing->flags & MF_SHADOW) + { + // shadow draw + vis->colormap = NULL; + } + else if (fixedcolormap) + { + // fixed map + vis->colormap = fixedcolormap; + } + else if (thing->frame & FF_FULLBRIGHT) + { + // full bright + vis->colormap = colormaps; + } + + else + { + // diminished light + index = xscale>>(LIGHTSCALESHIFT-detailshift); + + if (index >= MAXLIGHTSCALE) + index = MAXLIGHTSCALE-1; + + vis->colormap = spritelights[index]; + } +} + + + + +// +// R_AddSprites +// During BSP traversal, this adds sprites by sector. +// +void R_AddSprites (sector_t* sec) +{ + mobj_t* thing; + int lightnum; + + // BSP is traversed by subsector. + // A sector might have been split into several + // subsectors during BSP building. + // Thus we check whether its already added. + if (sec->validcount == validcount) + return; + + // Well, now it will be done. + sec->validcount = validcount; + + lightnum = (sec->lightlevel >> LIGHTSEGSHIFT)+extralight; + + if (lightnum < 0) + spritelights = scalelight[0]; + else if (lightnum >= LIGHTLEVELS) + spritelights = scalelight[LIGHTLEVELS-1]; + else + spritelights = scalelight[lightnum]; + + // Handle all things in sector. + for (thing = sec->thinglist ; thing ; thing = thing->snext) + R_ProjectSprite (thing); +} + + +// +// R_DrawPSprite +// +void R_DrawPSprite (pspdef_t* psp) +{ + fixed_t tx; + int x1; + int x2; + spritedef_t* sprdef; + spriteframe_t* sprframe; + int lump; + boolean flip; + vissprite_t* vis; + vissprite_t avis; + + // decide which patch to use +#ifdef RANGECHECK + if ( (unsigned)psp->state->sprite >= (unsigned int) numsprites) + I_Error ("R_ProjectSprite: invalid sprite number %i ", + psp->state->sprite); +#endif + sprdef = &sprites[psp->state->sprite]; +#ifdef RANGECHECK + if ( (psp->state->frame & FF_FRAMEMASK) >= sprdef->numframes) + I_Error ("R_ProjectSprite: invalid sprite frame %i : %i ", + psp->state->sprite, psp->state->frame); +#endif + sprframe = &sprdef->spriteframes[ psp->state->frame & FF_FRAMEMASK ]; + + lump = sprframe->lump[0]; + flip = (boolean)sprframe->flip[0]; + + // calculate edges of the shape + tx = psp->sx-160*FRACUNIT; + + tx -= spriteoffset[lump]; + x1 = (centerxfrac + FixedMul (tx,pspritescale) ) >>FRACBITS; + + // off the right side + if (x1 > viewwidth) + return; + + tx += spritewidth[lump]; + x2 = ((centerxfrac + FixedMul (tx, pspritescale) ) >>FRACBITS) - 1; + + // off the left side + if (x2 < 0) + return; + + // store information in a vissprite + vis = &avis; + vis->mobjflags = 0; + vis->texturemid = (BASEYCENTER<sy-spritetopoffset[lump]); + vis->x1 = x1 < 0 ? 0 : x1; + vis->x2 = x2 >= viewwidth ? viewwidth-1 : x2; + vis->scale = pspritescale<xiscale = -pspriteiscale; + vis->startfrac = spritewidth[lump]-1; + } + else + { + vis->xiscale = pspriteiscale; + vis->startfrac = 0; + } + + if (vis->x1 > x1) + vis->startfrac += vis->xiscale*(vis->x1-x1); + + vis->patch = lump; + + if (viewplayer->powers[pw_invisibility] > 4*32 + || viewplayer->powers[pw_invisibility] & 8) + { + // shadow draw + vis->colormap = NULL; + } + else if (fixedcolormap) + { + // fixed color + vis->colormap = fixedcolormap; + } + else if (psp->state->frame & FF_FULLBRIGHT) + { + // full bright + vis->colormap = colormaps; + } + else + { + // local light + vis->colormap = spritelights[MAXLIGHTSCALE-1]; + } + + R_DrawVisSprite (vis, vis->x1, vis->x2); +} + + + +// +// R_DrawPlayerSprites +// +void R_DrawPlayerSprites (void) +{ + int i; + int lightnum; + pspdef_t* psp; + + // get light level + lightnum = + (viewplayer->mo->subsector->sector->lightlevel >> LIGHTSEGSHIFT) + +extralight; + + if (lightnum < 0) + spritelights = scalelight[0]; + else if (lightnum >= LIGHTLEVELS) + spritelights = scalelight[LIGHTLEVELS-1]; + else + spritelights = scalelight[lightnum]; + + // clip to screen bounds + mfloorclip = screenheightarray; + mceilingclip = negonearray; + + // add all active psprites + for (i=0, psp=viewplayer->psprites; + istate) + R_DrawPSprite (psp); + } +} + + + + +// +// R_SortVisSprites +// +vissprite_t vsprsortedhead; + + +void R_SortVisSprites (void) +{ + int i; + int count; + vissprite_t* ds; + vissprite_t* best; + vissprite_t unsorted; + fixed_t bestscale; + + count = vissprite_p - vissprites; + + unsorted.next = unsorted.prev = &unsorted; + + if (!count) + return; + + for (ds=vissprites ; dsnext = ds+1; + ds->prev = ds-1; + } + + vissprites[0].prev = &unsorted; + unsorted.next = &vissprites[0]; + (vissprite_p-1)->next = &unsorted; + unsorted.prev = vissprite_p-1; + + // pull the vissprites out by scale + + vsprsortedhead.next = vsprsortedhead.prev = &vsprsortedhead; + for (i=0 ; inext) + { + if (ds->scale < bestscale) + { + bestscale = ds->scale; + best = ds; + } + } + best->next->prev = best->prev; + best->prev->next = best->next; + best->next = &vsprsortedhead; + best->prev = vsprsortedhead.prev; + vsprsortedhead.prev->next = best; + vsprsortedhead.prev = best; + } +} + + + +// +// R_DrawSprite +// +static short clipbot[SCREENWIDTH]; +static short cliptop[SCREENWIDTH]; +void R_DrawSprite (vissprite_t* spr) +{ + drawseg_t* ds; + int x; + int r1; + int r2; + fixed_t scale; + fixed_t lowscale; + int silhouette; + + for (x = spr->x1 ; x<=spr->x2 ; x++) + clipbot[x] = cliptop[x] = -2; + + // Scan drawsegs from end to start for obscuring segs. + // The first drawseg that has a greater scale + // is the clip seg. + for (ds=ds_p-1 ; ds >= drawsegs ; ds--) + { + // determine if the drawseg obscures the sprite + if (ds->x1 > spr->x2 + || ds->x2 < spr->x1 + || (!ds->silhouette + && !ds->maskedtexturecol) ) + { + // does not cover sprite + continue; + } + + r1 = ds->x1 < spr->x1 ? spr->x1 : ds->x1; + r2 = ds->x2 > spr->x2 ? spr->x2 : ds->x2; + + if (ds->scale1 > ds->scale2) + { + lowscale = ds->scale2; + scale = ds->scale1; + } + else + { + lowscale = ds->scale1; + scale = ds->scale2; + } + + if (scale < spr->scale + || ( lowscale < spr->scale + && !R_PointOnSegSide (spr->gx, spr->gy, ds->curline) ) ) + { + // masked mid texture? + if (ds->maskedtexturecol) + R_RenderMaskedSegRange (ds, r1, r2); + // seg is behind sprite + continue; + } + + + // clip this piece of the sprite + silhouette = ds->silhouette; + + if (spr->gz >= ds->bsilheight) + silhouette &= ~SIL_BOTTOM; + + if (spr->gzt <= ds->tsilheight) + silhouette &= ~SIL_TOP; + + if (silhouette == 1) + { + // bottom sil + for (x=r1 ; x<=r2 ; x++) + if (clipbot[x] == -2) + clipbot[x] = ds->sprbottomclip[x]; + } + else if (silhouette == 2) + { + // top sil + for (x=r1 ; x<=r2 ; x++) + if (cliptop[x] == -2) + cliptop[x] = ds->sprtopclip[x]; + } + else if (silhouette == 3) + { + // both + for (x=r1 ; x<=r2 ; x++) + { + if (clipbot[x] == -2) + clipbot[x] = ds->sprbottomclip[x]; + if (cliptop[x] == -2) + cliptop[x] = ds->sprtopclip[x]; + } + } + + } + + // all clipping has been performed, so draw the sprite + + // check for unclipped columns + for (x = spr->x1 ; x<=spr->x2 ; x++) + { + if (clipbot[x] == -2) + clipbot[x] = viewheight; + + if (cliptop[x] == -2) + cliptop[x] = -1; + } + + mfloorclip = clipbot; + mceilingclip = cliptop; + R_DrawVisSprite (spr, spr->x1, spr->x2); +} + + + + +// +// R_DrawMasked +// +void R_DrawMasked (void) +{ + vissprite_t* spr; + drawseg_t* ds; + + R_SortVisSprites (); + + if (vissprite_p > vissprites) + { + // draw all vissprites back to front + for (spr = vsprsortedhead.next ; + spr != &vsprsortedhead ; + spr=spr->next) + { + + R_DrawSprite (spr); + } + } + + // render any remaining masked mid textures + for (ds=ds_p-1 ; ds >= drawsegs ; ds--) + if (ds->maskedtexturecol) + R_RenderMaskedSegRange (ds, ds->x1, ds->x2); + + // draw the psprites on top of everything + // but does not draw on side views + if (!viewangleoffset) + R_DrawPlayerSprites (); +} + + + diff --git a/firmware_p4/components/Applications/doom/r_things.h b/firmware_p4/components/Applications/doom/r_things.h new file mode 100644 index 000000000..256a5ebbe --- /dev/null +++ b/firmware_p4/components/Applications/doom/r_things.h @@ -0,0 +1,65 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Rendering of moving objects, sprites. +// + + +#ifndef __R_THINGS__ +#define __R_THINGS__ + + + +#define MAXVISSPRITES 128 + +extern vissprite_t vissprites[MAXVISSPRITES]; +extern vissprite_t* vissprite_p; +extern vissprite_t vsprsortedhead; + +// Constant arrays used for psprite clipping +// and initializing clipping. +extern short negonearray[SCREENWIDTH]; +extern short screenheightarray[SCREENWIDTH]; + +// vars for R_DrawMaskedColumn +extern short* mfloorclip; +extern short* mceilingclip; +extern fixed_t spryscale; +extern fixed_t sprtopscreen; + +extern fixed_t pspritescale; +extern fixed_t pspriteiscale; + + +void R_DrawMaskedColumn (column_t* column); + + +void R_SortVisSprites (void); + +void R_AddSprites (sector_t* sec); +void R_AddPSprites (void); +void R_DrawSprites (void); +void R_InitSprites (char** namelist); +void R_ClearSprites (void); +void R_DrawMasked (void); + +void +R_ClipVisSprite +( vissprite_t* vis, + int xl, + int xh ); + + +#endif diff --git a/firmware_p4/components/Applications/doom/s_sound.c b/firmware_p4/components/Applications/doom/s_sound.c new file mode 100644 index 000000000..f6d8be138 --- /dev/null +++ b/firmware_p4/components/Applications/doom/s_sound.c @@ -0,0 +1,670 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: none +// + +#include +#include + +#include "i_sound.h" +#include "i_system.h" + +#include "doomfeatures.h" +#include "deh_str.h" + +#include "doomstat.h" +#include "doomtype.h" + +#include "sounds.h" +#include "s_sound.h" + +#include "m_misc.h" +#include "m_random.h" +#include "m_argv.h" + +#include "p_local.h" +#include "w_wad.h" +#include "z_zone.h" + +// when to clip out sounds +// Does not fit the large outdoor areas. + +#define S_CLIPPING_DIST (1200 * FRACUNIT) + +// Distance tp origin when sounds should be maxed out. +// This should relate to movement clipping resolution +// (see BLOCKMAP handling). +// In the source code release: (160*FRACUNIT). Changed back to the +// Vanilla value of 200 (why was this changed?) + +#define S_CLOSE_DIST (200 * FRACUNIT) + +// The range over which sound attenuates + +#define S_ATTENUATOR ((S_CLIPPING_DIST - S_CLOSE_DIST) >> FRACBITS) + +// Stereo separation + +#define S_STEREO_SWING (96 * FRACUNIT) + +#define NORM_PITCH 128 +#define NORM_PRIORITY 64 +#define NORM_SEP 128 + +typedef struct +{ + // sound information (if null, channel avail.) + sfxinfo_t *sfxinfo; + + // origin of sound + mobj_t *origin; + + // handle of the sound being played + int handle; + +} channel_t; + +// The set of channels available + +static channel_t *channels; + +// Maximum volume of a sound effect. +// Internal default is max out of 0-15. + +int sfxVolume = 8; + +// Maximum volume of music. + +int musicVolume = 8; + +// Internal volume level, ranging from 0-127 + +static int snd_SfxVolume; + +// Whether songs are mus_paused + +static boolean mus_paused; + +// Music currently being played + +static musicinfo_t *mus_playing = NULL; + +// Number of channels to use + +int snd_channels = 8; + +// +// Initializes sound stuff, including volume +// Sets channels, SFX and music volume, +// allocates channel buffer, sets S_sfx lookup. +// + +void S_Init(int sfxVolume, int musicVolume) +{ + int i; + + I_PrecacheSounds(S_sfx, NUMSFX); + + S_SetSfxVolume(sfxVolume); + S_SetMusicVolume(musicVolume); + + // Allocating the internal channels for mixing + // (the maximum numer of sounds rendered + // simultaneously) within zone memory. + channels = Z_Malloc(snd_channels*sizeof(channel_t), PU_STATIC, 0); + + // Free all channels for use + for (i=0 ; isfxinfo) + { + // stop the sound playing + + if (I_SoundIsPlaying(c->handle)) + { + I_StopSound(c->handle); + } + + // check to see if other channels are playing the sound + + for (i=0; isfxinfo == channels[i].sfxinfo) + { + break; + } + } + + // degrade usefulness of sound data + + c->sfxinfo->usefulness--; + c->sfxinfo = NULL; + } +} + +// +// Per level startup code. +// Kills playing sounds at start of level, +// determines music if any, changes music. +// + +void S_Start(void) +{ + int cnum; + int mnum; + + // kill all playing sounds at start of level + // (trust me - a good idea) + for (cnum=0 ; cnumpriority >= sfxinfo->priority) + { + break; + } + } + + if (cnum == snd_channels) + { + // FUCK! No lower priority. Sorry, Charlie. + return -1; + } + else + { + // Otherwise, kick out lower priority. + S_StopChannel(cnum); + } + } + + c = &channels[cnum]; + + // channel is decided to be cnum. + c->sfxinfo = sfxinfo; + c->origin = origin; + + return cnum; +} + +// +// Changes volume and stereo-separation variables +// from the norm of a sound effect to be played. +// If the sound is not audible, returns a 0. +// Otherwise, modifies parameters and returns 1. +// + +static int S_AdjustSoundParams(mobj_t *listener, mobj_t *source, + int *vol, int *sep) +{ + fixed_t approx_dist; + fixed_t adx; + fixed_t ady; + angle_t angle; + + // calculate the distance to sound origin + // and clip it if necessary + adx = abs(listener->x - source->x); + ady = abs(listener->y - source->y); + + // From _GG1_ p.428. Appox. eucledian distance fast. + approx_dist = adx + ady - ((adx < ady ? adx : ady)>>1); + + if (gamemap != 8 && approx_dist > S_CLIPPING_DIST) + { + return 0; + } + + // angle of source to listener + angle = R_PointToAngle2(listener->x, + listener->y, + source->x, + source->y); + + if (angle > listener->angle) + { + angle = angle - listener->angle; + } + else + { + angle = angle + (0xffffffff - listener->angle); + } + + angle >>= ANGLETOFINESHIFT; + + // stereo separation + *sep = 128 - (FixedMul(S_STEREO_SWING, finesine[angle]) >> FRACBITS); + + // volume calculation + if (approx_dist < S_CLOSE_DIST) + { + *vol = snd_SfxVolume; + } + else if (gamemap == 8) + { + if (approx_dist > S_CLIPPING_DIST) + { + approx_dist = S_CLIPPING_DIST; + } + + *vol = 15+ ((snd_SfxVolume-15) + *((S_CLIPPING_DIST - approx_dist)>>FRACBITS)) + / S_ATTENUATOR; + } + else + { + // distance effect + *vol = (snd_SfxVolume + * ((S_CLIPPING_DIST - approx_dist)>>FRACBITS)) + / S_ATTENUATOR; + } + + return (*vol > 0); +} + +void S_StartSound(void *origin_p, int sfx_id) +{ + sfxinfo_t *sfx; + mobj_t *origin; + int rc; + int sep; + int cnum; + int volume; + + origin = (mobj_t *) origin_p; + volume = snd_SfxVolume; + + // check for bogus sound # + if (sfx_id < 1 || sfx_id > NUMSFX) + { + I_Error("Bad sfx #: %d", sfx_id); + } + + sfx = &S_sfx[sfx_id]; + + // Initialize sound parameters + if (sfx->link) + { + volume += sfx->volume; + + if (volume < 1) + { + return; + } + + if (volume > snd_SfxVolume) + { + volume = snd_SfxVolume; + } + } + + + // Check to see if it is audible, + // and if not, modify the params + if (origin && origin != players[consoleplayer].mo) + { + rc = S_AdjustSoundParams(players[consoleplayer].mo, + origin, + &volume, + &sep); + + if (origin->x == players[consoleplayer].mo->x + && origin->y == players[consoleplayer].mo->y) + { + sep = NORM_SEP; + } + + if (!rc) + { + return; + } + } + else + { + sep = NORM_SEP; + } + + // kill old sound + S_StopSound(origin); + + // try to find a channel + cnum = S_GetChannel(origin, sfx); + + if (cnum < 0) + { + return; + } + + // increase the usefulness + if (sfx->usefulness++ < 0) + { + sfx->usefulness = 1; + } + + if (sfx->lumpnum < 0) + { + sfx->lumpnum = I_GetSfxLumpNum(sfx); + } + + channels[cnum].handle = I_StartSound(sfx, cnum, volume, sep); +} + +// +// Stop and resume music, during game PAUSE. +// + +void S_PauseSound(void) +{ + if (mus_playing && !mus_paused) + { + I_PauseSong(); + mus_paused = true; + } +} + +void S_ResumeSound(void) +{ + if (mus_playing && mus_paused) + { + I_ResumeSong(); + mus_paused = false; + } +} + +// +// Updates music & sounds +// + +void S_UpdateSounds(mobj_t *listener) +{ + int audible; + int cnum; + int volume; + int sep; + sfxinfo_t* sfx; + channel_t* c; + + I_UpdateSound(); + + for (cnum=0; cnumsfxinfo; + + if (c->sfxinfo) + { + if (I_SoundIsPlaying(c->handle)) + { + // initialize parameters + volume = snd_SfxVolume; + sep = NORM_SEP; + + if (sfx->link) + { + volume += sfx->volume; + if (volume < 1) + { + S_StopChannel(cnum); + continue; + } + else if (volume > snd_SfxVolume) + { + volume = snd_SfxVolume; + } + } + + // check non-local sounds for distance clipping + // or modify their params + if (c->origin && listener != c->origin) + { + audible = S_AdjustSoundParams(listener, + c->origin, + &volume, + &sep); + + if (!audible) + { + S_StopChannel(cnum); + } + else + { + I_UpdateSoundParams(c->handle, volume, sep); + } + } + } + else + { + // if channel is allocated but sound has stopped, + // free it + S_StopChannel(cnum); + } + } + } +} + +void S_SetMusicVolume(int volume) +{ + if (volume < 0 || volume > 127) + { + I_Error("Attempt to set music volume at %d", + volume); + } + + I_SetMusicVolume(volume); +} + +void S_SetSfxVolume(int volume) +{ + if (volume < 0 || volume > 127) + { + I_Error("Attempt to set sfx volume at %d", volume); + } + + snd_SfxVolume = volume; +} + +// +// Starts some music with the music id found in sounds.h. +// + +void S_StartMusic(int m_id) +{ + S_ChangeMusic(m_id, false); +} + +void S_ChangeMusic(int musicnum, int looping) +{ + musicinfo_t *music = NULL; + char namebuf[9]; + void *handle; + + // The Doom IWAD file has two versions of the intro music: d_intro + // and d_introa. The latter is used for OPL playback. + + if (musicnum == mus_intro && (snd_musicdevice == SNDDEVICE_ADLIB + || snd_musicdevice == SNDDEVICE_SB)) + { + musicnum = mus_introa; + } + + if (musicnum <= mus_None || musicnum >= NUMMUSIC) + { + I_Error("Bad music number %d", musicnum); + } + else + { + music = &S_music[musicnum]; + } + + if (mus_playing == music) + { + return; + } + + // shutdown old music + S_StopMusic(); + + // get lumpnum if neccessary + if (!music->lumpnum) + { + M_snprintf(namebuf, sizeof(namebuf), "d_%s", DEH_String(music->name)); + music->lumpnum = W_GetNumForName(namebuf); + } + + music->data = W_CacheLumpNum(music->lumpnum, PU_STATIC); + + handle = I_RegisterSong(music->data, W_LumpLength(music->lumpnum)); + music->handle = handle; + I_PlaySong(handle, looping); + + mus_playing = music; +} + +boolean S_MusicPlaying(void) +{ + return I_MusicIsPlaying(); +} + +void S_StopMusic(void) +{ + if (mus_playing) + { + if (mus_paused) + { + I_ResumeSong(); + } + + I_StopSong(); + I_UnRegisterSong(mus_playing->handle); + W_ReleaseLumpNum(mus_playing->lumpnum); + mus_playing->data = NULL; + mus_playing = NULL; + } +} + diff --git a/firmware_p4/components/Applications/doom/s_sound.h b/firmware_p4/components/Applications/doom/s_sound.h new file mode 100644 index 000000000..bbd100a0c --- /dev/null +++ b/firmware_p4/components/Applications/doom/s_sound.h @@ -0,0 +1,89 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// The not so system specific sound interface. +// + + +#ifndef __S_SOUND__ +#define __S_SOUND__ + +#include "p_mobj.h" +#include "sounds.h" + +// +// Initializes sound stuff, including volume +// Sets channels, SFX and music volume, +// allocates channel buffer, sets S_sfx lookup. +// + +void S_Init(int sfxVolume, int musicVolume); + + +// Shut down sound + +void S_Shutdown(void); + + + +// +// Per level startup code. +// Kills playing sounds at start of level, +// determines music if any, changes music. +// + +void S_Start(void); + +// +// Start sound for thing at +// using from sounds.h +// + +void S_StartSound(void *origin, int sound_id); + +// Stop sound for thing at +void S_StopSound(mobj_t *origin); + + +// Start music using from sounds.h +void S_StartMusic(int music_id); + +// Start music using from sounds.h, +// and set whether looping +void S_ChangeMusic(int music_id, int looping); + +// query if music is playing +boolean S_MusicPlaying(void); + +// Stops the music fer sure. +void S_StopMusic(void); + +// Stop and resume music, during game PAUSE. +void S_PauseSound(void); +void S_ResumeSound(void); + + +// +// Updates music & sounds +// +void S_UpdateSounds(mobj_t *listener); + +void S_SetMusicVolume(int volume); +void S_SetSfxVolume(int volume); + +extern int snd_channels; + +#endif + diff --git a/firmware_p4/components/Applications/doom/sha1.c b/firmware_p4/components/Applications/doom/sha1.c new file mode 100644 index 000000000..06ab40ad8 --- /dev/null +++ b/firmware_p4/components/Applications/doom/sha1.c @@ -0,0 +1,319 @@ +/* sha1.c - SHA1 hash function + * Copyright (C) 1998, 1999, 2000, 2001 Free Software Foundation, Inc. + * + * Please see below for more legal information! + * + * This file is part of GnuPG. + * + * GnuPG is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * GnuPG is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, see . + */ + + +/* Test vectors: + * + * "abc" + * A999 3E36 4706 816A BA3E 2571 7850 C26C 9CD0 D89D + * + * "abcdbcdecdefdefgefghfghighijhijkijkljklmklmnlmnomnopnopq" + * 8498 3E44 1C3B D26E BAAE 4AA1 F951 29E5 E546 70F1 + */ + +#include +#include +#include +#include + +#include "i_swap.h" +#include "sha1.h" + +void SHA1_Init(sha1_context_t *hd) +{ + hd->h0 = 0x67452301; + hd->h1 = 0xefcdab89; + hd->h2 = 0x98badcfe; + hd->h3 = 0x10325476; + hd->h4 = 0xc3d2e1f0; + hd->nblocks = 0; + hd->count = 0; +} + + +/**************** + * Transform the message X which consists of 16 32-bit-words + */ +static void Transform(sha1_context_t *hd, byte *data) +{ + uint32_t a,b,c,d,e,tm; + uint32_t x[16]; + + /* get values from the chaining vars */ + a = hd->h0; + b = hd->h1; + c = hd->h2; + d = hd->h3; + e = hd->h4; + +#ifdef SYS_BIG_ENDIAN + memcpy(x, data, 64); +#else + { + int i; + byte *p2; + for(i=0, p2=(byte*)x; i < 16; i++, p2 += 4 ) + { + p2[3] = *data++; + p2[2] = *data++; + p2[1] = *data++; + p2[0] = *data++; + } + } +#endif + + +#define K1 0x5A827999L +#define K2 0x6ED9EBA1L +#define K3 0x8F1BBCDCL +#define K4 0xCA62C1D6L +#define F1(x,y,z) ( z ^ ( x & ( y ^ z ) ) ) +#define F2(x,y,z) ( x ^ y ^ z ) +#define F3(x,y,z) ( ( x & y ) | ( z & ( x | y ) ) ) +#define F4(x,y,z) ( x ^ y ^ z ) + +#define rol(x,n) ( ((x) << (n)) | ((x) >> (32-(n))) ) + +#define M(i) ( tm = x[i&0x0f] ^ x[(i-14)&0x0f] \ + ^ x[(i-8)&0x0f] ^ x[(i-3)&0x0f] \ + , (x[i&0x0f] = rol(tm,1)) ) + +#define R(a,b,c,d,e,f,k,m) do { e += rol( a, 5 ) \ + + f( b, c, d ) \ + + k \ + + m; \ + b = rol( b, 30 ); \ + } while(0) + R( a, b, c, d, e, F1, K1, x[ 0] ); + R( e, a, b, c, d, F1, K1, x[ 1] ); + R( d, e, a, b, c, F1, K1, x[ 2] ); + R( c, d, e, a, b, F1, K1, x[ 3] ); + R( b, c, d, e, a, F1, K1, x[ 4] ); + R( a, b, c, d, e, F1, K1, x[ 5] ); + R( e, a, b, c, d, F1, K1, x[ 6] ); + R( d, e, a, b, c, F1, K1, x[ 7] ); + R( c, d, e, a, b, F1, K1, x[ 8] ); + R( b, c, d, e, a, F1, K1, x[ 9] ); + R( a, b, c, d, e, F1, K1, x[10] ); + R( e, a, b, c, d, F1, K1, x[11] ); + R( d, e, a, b, c, F1, K1, x[12] ); + R( c, d, e, a, b, F1, K1, x[13] ); + R( b, c, d, e, a, F1, K1, x[14] ); + R( a, b, c, d, e, F1, K1, x[15] ); + R( e, a, b, c, d, F1, K1, M(16) ); + R( d, e, a, b, c, F1, K1, M(17) ); + R( c, d, e, a, b, F1, K1, M(18) ); + R( b, c, d, e, a, F1, K1, M(19) ); + R( a, b, c, d, e, F2, K2, M(20) ); + R( e, a, b, c, d, F2, K2, M(21) ); + R( d, e, a, b, c, F2, K2, M(22) ); + R( c, d, e, a, b, F2, K2, M(23) ); + R( b, c, d, e, a, F2, K2, M(24) ); + R( a, b, c, d, e, F2, K2, M(25) ); + R( e, a, b, c, d, F2, K2, M(26) ); + R( d, e, a, b, c, F2, K2, M(27) ); + R( c, d, e, a, b, F2, K2, M(28) ); + R( b, c, d, e, a, F2, K2, M(29) ); + R( a, b, c, d, e, F2, K2, M(30) ); + R( e, a, b, c, d, F2, K2, M(31) ); + R( d, e, a, b, c, F2, K2, M(32) ); + R( c, d, e, a, b, F2, K2, M(33) ); + R( b, c, d, e, a, F2, K2, M(34) ); + R( a, b, c, d, e, F2, K2, M(35) ); + R( e, a, b, c, d, F2, K2, M(36) ); + R( d, e, a, b, c, F2, K2, M(37) ); + R( c, d, e, a, b, F2, K2, M(38) ); + R( b, c, d, e, a, F2, K2, M(39) ); + R( a, b, c, d, e, F3, K3, M(40) ); + R( e, a, b, c, d, F3, K3, M(41) ); + R( d, e, a, b, c, F3, K3, M(42) ); + R( c, d, e, a, b, F3, K3, M(43) ); + R( b, c, d, e, a, F3, K3, M(44) ); + R( a, b, c, d, e, F3, K3, M(45) ); + R( e, a, b, c, d, F3, K3, M(46) ); + R( d, e, a, b, c, F3, K3, M(47) ); + R( c, d, e, a, b, F3, K3, M(48) ); + R( b, c, d, e, a, F3, K3, M(49) ); + R( a, b, c, d, e, F3, K3, M(50) ); + R( e, a, b, c, d, F3, K3, M(51) ); + R( d, e, a, b, c, F3, K3, M(52) ); + R( c, d, e, a, b, F3, K3, M(53) ); + R( b, c, d, e, a, F3, K3, M(54) ); + R( a, b, c, d, e, F3, K3, M(55) ); + R( e, a, b, c, d, F3, K3, M(56) ); + R( d, e, a, b, c, F3, K3, M(57) ); + R( c, d, e, a, b, F3, K3, M(58) ); + R( b, c, d, e, a, F3, K3, M(59) ); + R( a, b, c, d, e, F4, K4, M(60) ); + R( e, a, b, c, d, F4, K4, M(61) ); + R( d, e, a, b, c, F4, K4, M(62) ); + R( c, d, e, a, b, F4, K4, M(63) ); + R( b, c, d, e, a, F4, K4, M(64) ); + R( a, b, c, d, e, F4, K4, M(65) ); + R( e, a, b, c, d, F4, K4, M(66) ); + R( d, e, a, b, c, F4, K4, M(67) ); + R( c, d, e, a, b, F4, K4, M(68) ); + R( b, c, d, e, a, F4, K4, M(69) ); + R( a, b, c, d, e, F4, K4, M(70) ); + R( e, a, b, c, d, F4, K4, M(71) ); + R( d, e, a, b, c, F4, K4, M(72) ); + R( c, d, e, a, b, F4, K4, M(73) ); + R( b, c, d, e, a, F4, K4, M(74) ); + R( a, b, c, d, e, F4, K4, M(75) ); + R( e, a, b, c, d, F4, K4, M(76) ); + R( d, e, a, b, c, F4, K4, M(77) ); + R( c, d, e, a, b, F4, K4, M(78) ); + R( b, c, d, e, a, F4, K4, M(79) ); + + /* update chainig vars */ + hd->h0 += a; + hd->h1 += b; + hd->h2 += c; + hd->h3 += d; + hd->h4 += e; +} + + +/* Update the message digest with the contents + * of INBUF with length INLEN. + */ +void SHA1_Update(sha1_context_t *hd, byte *inbuf, size_t inlen) +{ + if (hd->count == 64) + { + /* flush the buffer */ + Transform(hd, hd->buf); + hd->count = 0; + hd->nblocks++; + } + if (!inbuf) + return; + if (hd->count) + { + for (; inlen && hd->count < 64; inlen--) + hd->buf[hd->count++] = *inbuf++; + SHA1_Update(hd, NULL, 0); + if (!inlen) + return; + } + + while (inlen >= 64) + { + Transform(hd, inbuf); + hd->count = 0; + hd->nblocks++; + inlen -= 64; + inbuf += 64; + } + for (; inlen && hd->count < 64; inlen--) + hd->buf[hd->count++] = *inbuf++; +} + + +/* The routine final terminates the computation and + * returns the digest. + * The handle is prepared for a new cycle, but adding bytes to the + * handle will the destroy the returned buffer. + * Returns: 20 bytes representing the digest. + */ + +void SHA1_Final(sha1_digest_t digest, sha1_context_t *hd) +{ + uint32_t t, msb, lsb; + byte *p; + + SHA1_Update(hd, NULL, 0); /* flush */; + + t = hd->nblocks; + /* multiply by 64 to make a byte count */ + lsb = t << 6; + msb = t >> 26; + /* add the count */ + t = lsb; + if ((lsb += hd->count) < t) + msb++; + /* multiply by 8 to make a bit count */ + t = lsb; + lsb <<= 3; + msb <<= 3; + msb |= t >> 29; + + if (hd->count < 56) + { + /* enough room */ + hd->buf[hd->count++] = 0x80; /* pad */ + while (hd->count < 56) + hd->buf[hd->count++] = 0; /* pad */ + } + else + { + /* need one extra block */ + hd->buf[hd->count++] = 0x80; /* pad character */ + while (hd->count < 64) + hd->buf[hd->count++] = 0; + SHA1_Update(hd, NULL, 0); /* flush */; + memset(hd->buf, 0, 56 ); /* fill next block with zeroes */ + } + /* append the 64 bit count */ + hd->buf[56] = msb >> 24; + hd->buf[57] = msb >> 16; + hd->buf[58] = msb >> 8; + hd->buf[59] = msb ; + hd->buf[60] = lsb >> 24; + hd->buf[61] = lsb >> 16; + hd->buf[62] = lsb >> 8; + hd->buf[63] = lsb ; + Transform(hd, hd->buf); + + p = hd->buf; +#ifdef SYS_BIG_ENDIAN +#define X(a) do { *(uint32_t*)p = hd->h##a ; p += 4; } while(0) +#else /* little endian */ +#define X(a) do { *p++ = hd->h##a >> 24; *p++ = hd->h##a >> 16; \ + *p++ = hd->h##a >> 8; *p++ = hd->h##a; } while(0) +#endif + X(0); + X(1); + X(2); + X(3); + X(4); +#undef X + + memcpy(digest, hd->buf, sizeof(sha1_digest_t)); +} + +void SHA1_UpdateInt32(sha1_context_t *context, unsigned int val) +{ + byte buf[4]; + + buf[0] = (val >> 24) & 0xff; + buf[1] = (val >> 16) & 0xff; + buf[2] = (val >> 8) & 0xff; + buf[3] = val & 0xff; + + SHA1_Update(context, buf, 4); +} + +void SHA1_UpdateString(sha1_context_t *context, char *str) +{ + SHA1_Update(context, (byte *) str, strlen(str) + 1); +} + diff --git a/firmware_p4/components/Applications/doom/sha1.h b/firmware_p4/components/Applications/doom/sha1.h new file mode 100644 index 000000000..249571be3 --- /dev/null +++ b/firmware_p4/components/Applications/doom/sha1.h @@ -0,0 +1,40 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// SHA-1 digest. +// + +#ifndef __SHA1_H__ +#define __SHA1_H__ + +#include "doomtype.h" + +typedef struct sha1_context_s sha1_context_t; +typedef byte sha1_digest_t[20]; + +struct sha1_context_s { + uint32_t h0,h1,h2,h3,h4; + uint32_t nblocks; + byte buf[64]; + int count; +}; + +void SHA1_Init(sha1_context_t *context); +void SHA1_Update(sha1_context_t *context, byte *buf, size_t len); +void SHA1_Final(sha1_digest_t digest, sha1_context_t *context); +void SHA1_UpdateInt32(sha1_context_t *context, unsigned int val); +void SHA1_UpdateString(sha1_context_t *context, char *str); + +#endif /* #ifndef __SHA1_H__ */ + diff --git a/firmware_p4/components/Applications/doom/sounds.c b/firmware_p4/components/Applications/doom/sounds.c new file mode 100644 index 000000000..e976bc844 --- /dev/null +++ b/firmware_p4/components/Applications/doom/sounds.c @@ -0,0 +1,229 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Created by a sound utility. +// Kept as a sample, DOOM2 sounds. +// + + +#include + + +#include "doomtype.h" +#include "sounds.h" + +// +// Information about all the music +// + +#define MUSIC(name) \ + { name, 0, NULL, NULL } + +musicinfo_t S_music[] = +{ + MUSIC(NULL), + MUSIC("e1m1"), + MUSIC("e1m2"), + MUSIC("e1m3"), + MUSIC("e1m4"), + MUSIC("e1m5"), + MUSIC("e1m6"), + MUSIC("e1m7"), + MUSIC("e1m8"), + MUSIC("e1m9"), + MUSIC("e2m1"), + MUSIC("e2m2"), + MUSIC("e2m3"), + MUSIC("e2m4"), + MUSIC("e2m5"), + MUSIC("e2m6"), + MUSIC("e2m7"), + MUSIC("e2m8"), + MUSIC("e2m9"), + MUSIC("e3m1"), + MUSIC("e3m2"), + MUSIC("e3m3"), + MUSIC("e3m4"), + MUSIC("e3m5"), + MUSIC("e3m6"), + MUSIC("e3m7"), + MUSIC("e3m8"), + MUSIC("e3m9"), + MUSIC("inter"), + MUSIC("intro"), + MUSIC("bunny"), + MUSIC("victor"), + MUSIC("introa"), + MUSIC("runnin"), + MUSIC("stalks"), + MUSIC("countd"), + MUSIC("betwee"), + MUSIC("doom"), + MUSIC("the_da"), + MUSIC("shawn"), + MUSIC("ddtblu"), + MUSIC("in_cit"), + MUSIC("dead"), + MUSIC("stlks2"), + MUSIC("theda2"), + MUSIC("doom2"), + MUSIC("ddtbl2"), + MUSIC("runni2"), + MUSIC("dead2"), + MUSIC("stlks3"), + MUSIC("romero"), + MUSIC("shawn2"), + MUSIC("messag"), + MUSIC("count2"), + MUSIC("ddtbl3"), + MUSIC("ampie"), + MUSIC("theda3"), + MUSIC("adrian"), + MUSIC("messg2"), + MUSIC("romer2"), + MUSIC("tense"), + MUSIC("shawn3"), + MUSIC("openin"), + MUSIC("evil"), + MUSIC("ultima"), + MUSIC("read_m"), + MUSIC("dm2ttl"), + MUSIC("dm2int") +}; + + +// +// Information about all the sfx +// + +#define SOUND(name, priority) \ + { NULL, name, priority, NULL, -1, -1, 0, 0, -1, NULL } +#define SOUND_LINK(name, priority, link_id, pitch, volume) \ + { NULL, name, priority, &S_sfx[link_id], pitch, volume, 0, 0, -1, NULL } + +sfxinfo_t S_sfx[] = +{ + // S_sfx[0] needs to be a dummy for odd reasons. + SOUND("none", 0), + SOUND("pistol", 64), + SOUND("shotgn", 64), + SOUND("sgcock", 64), + SOUND("dshtgn", 64), + SOUND("dbopn", 64), + SOUND("dbcls", 64), + SOUND("dbload", 64), + SOUND("plasma", 64), + SOUND("bfg", 64), + SOUND("sawup", 64), + SOUND("sawidl", 118), + SOUND("sawful", 64), + SOUND("sawhit", 64), + SOUND("rlaunc", 64), + SOUND("rxplod", 70), + SOUND("firsht", 70), + SOUND("firxpl", 70), + SOUND("pstart", 100), + SOUND("pstop", 100), + SOUND("doropn", 100), + SOUND("dorcls", 100), + SOUND("stnmov", 119), + SOUND("swtchn", 78), + SOUND("swtchx", 78), + SOUND("plpain", 96), + SOUND("dmpain", 96), + SOUND("popain", 96), + SOUND("vipain", 96), + SOUND("mnpain", 96), + SOUND("pepain", 96), + SOUND("slop", 78), + SOUND("itemup", 78), + SOUND("wpnup", 78), + SOUND("oof", 96), + SOUND("telept", 32), + SOUND("posit1", 98), + SOUND("posit2", 98), + SOUND("posit3", 98), + SOUND("bgsit1", 98), + SOUND("bgsit2", 98), + SOUND("sgtsit", 98), + SOUND("cacsit", 98), + SOUND("brssit", 94), + SOUND("cybsit", 92), + SOUND("spisit", 90), + SOUND("bspsit", 90), + SOUND("kntsit", 90), + SOUND("vilsit", 90), + SOUND("mansit", 90), + SOUND("pesit", 90), + SOUND("sklatk", 70), + SOUND("sgtatk", 70), + SOUND("skepch", 70), + SOUND("vilatk", 70), + SOUND("claw", 70), + SOUND("skeswg", 70), + SOUND("pldeth", 32), + SOUND("pdiehi", 32), + SOUND("podth1", 70), + SOUND("podth2", 70), + SOUND("podth3", 70), + SOUND("bgdth1", 70), + SOUND("bgdth2", 70), + SOUND("sgtdth", 70), + SOUND("cacdth", 70), + SOUND("skldth", 70), + SOUND("brsdth", 32), + SOUND("cybdth", 32), + SOUND("spidth", 32), + SOUND("bspdth", 32), + SOUND("vildth", 32), + SOUND("kntdth", 32), + SOUND("pedth", 32), + SOUND("skedth", 32), + SOUND("posact", 120), + SOUND("bgact", 120), + SOUND("dmact", 120), + SOUND("bspact", 100), + SOUND("bspwlk", 100), + SOUND("vilact", 100), + SOUND("noway", 78), + SOUND("barexp", 60), + SOUND("punch", 64), + SOUND("hoof", 70), + SOUND("metal", 70), + SOUND_LINK("chgun", 64, sfx_pistol, 150, 0), + SOUND("tink", 60), + SOUND("bdopn", 100), + SOUND("bdcls", 100), + SOUND("itmbk", 100), + SOUND("flame", 32), + SOUND("flamst", 32), + SOUND("getpow", 60), + SOUND("bospit", 70), + SOUND("boscub", 70), + SOUND("bossit", 70), + SOUND("bospn", 70), + SOUND("bosdth", 70), + SOUND("manatk", 70), + SOUND("mandth", 70), + SOUND("sssit", 70), + SOUND("ssdth", 70), + SOUND("keenpn", 70), + SOUND("keendt", 70), + SOUND("skeact", 70), + SOUND("skesit", 70), + SOUND("skeatk", 70), + SOUND("radio", 60), +}; + diff --git a/firmware_p4/components/Applications/doom/sounds.h b/firmware_p4/components/Applications/doom/sounds.h new file mode 100644 index 000000000..1e8afc405 --- /dev/null +++ b/firmware_p4/components/Applications/doom/sounds.h @@ -0,0 +1,227 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Created by the sound utility written by Dave Taylor. +// Kept as a sample, DOOM2 sounds. Frozen. +// + +#ifndef __SOUNDS__ +#define __SOUNDS__ + +#include "i_sound.h" + +// the complete set of sound effects +extern sfxinfo_t S_sfx[]; + +// the complete set of music +extern musicinfo_t S_music[]; + +// +// Identifiers for all music in game. +// + +typedef enum +{ + mus_None, + mus_e1m1, + mus_e1m2, + mus_e1m3, + mus_e1m4, + mus_e1m5, + mus_e1m6, + mus_e1m7, + mus_e1m8, + mus_e1m9, + mus_e2m1, + mus_e2m2, + mus_e2m3, + mus_e2m4, + mus_e2m5, + mus_e2m6, + mus_e2m7, + mus_e2m8, + mus_e2m9, + mus_e3m1, + mus_e3m2, + mus_e3m3, + mus_e3m4, + mus_e3m5, + mus_e3m6, + mus_e3m7, + mus_e3m8, + mus_e3m9, + mus_inter, + mus_intro, + mus_bunny, + mus_victor, + mus_introa, + mus_runnin, + mus_stalks, + mus_countd, + mus_betwee, + mus_doom, + mus_the_da, + mus_shawn, + mus_ddtblu, + mus_in_cit, + mus_dead, + mus_stlks2, + mus_theda2, + mus_doom2, + mus_ddtbl2, + mus_runni2, + mus_dead2, + mus_stlks3, + mus_romero, + mus_shawn2, + mus_messag, + mus_count2, + mus_ddtbl3, + mus_ampie, + mus_theda3, + mus_adrian, + mus_messg2, + mus_romer2, + mus_tense, + mus_shawn3, + mus_openin, + mus_evil, + mus_ultima, + mus_read_m, + mus_dm2ttl, + mus_dm2int, + NUMMUSIC +} musicenum_t; + + +// +// Identifiers for all sfx in game. +// + +typedef enum +{ + sfx_None, + sfx_pistol, + sfx_shotgn, + sfx_sgcock, + sfx_dshtgn, + sfx_dbopn, + sfx_dbcls, + sfx_dbload, + sfx_plasma, + sfx_bfg, + sfx_sawup, + sfx_sawidl, + sfx_sawful, + sfx_sawhit, + sfx_rlaunc, + sfx_rxplod, + sfx_firsht, + sfx_firxpl, + sfx_pstart, + sfx_pstop, + sfx_doropn, + sfx_dorcls, + sfx_stnmov, + sfx_swtchn, + sfx_swtchx, + sfx_plpain, + sfx_dmpain, + sfx_popain, + sfx_vipain, + sfx_mnpain, + sfx_pepain, + sfx_slop, + sfx_itemup, + sfx_wpnup, + sfx_oof, + sfx_telept, + sfx_posit1, + sfx_posit2, + sfx_posit3, + sfx_bgsit1, + sfx_bgsit2, + sfx_sgtsit, + sfx_cacsit, + sfx_brssit, + sfx_cybsit, + sfx_spisit, + sfx_bspsit, + sfx_kntsit, + sfx_vilsit, + sfx_mansit, + sfx_pesit, + sfx_sklatk, + sfx_sgtatk, + sfx_skepch, + sfx_vilatk, + sfx_claw, + sfx_skeswg, + sfx_pldeth, + sfx_pdiehi, + sfx_podth1, + sfx_podth2, + sfx_podth3, + sfx_bgdth1, + sfx_bgdth2, + sfx_sgtdth, + sfx_cacdth, + sfx_skldth, + sfx_brsdth, + sfx_cybdth, + sfx_spidth, + sfx_bspdth, + sfx_vildth, + sfx_kntdth, + sfx_pedth, + sfx_skedth, + sfx_posact, + sfx_bgact, + sfx_dmact, + sfx_bspact, + sfx_bspwlk, + sfx_vilact, + sfx_noway, + sfx_barexp, + sfx_punch, + sfx_hoof, + sfx_metal, + sfx_chgun, + sfx_tink, + sfx_bdopn, + sfx_bdcls, + sfx_itmbk, + sfx_flame, + sfx_flamst, + sfx_getpow, + sfx_bospit, + sfx_boscub, + sfx_bossit, + sfx_bospn, + sfx_bosdth, + sfx_manatk, + sfx_mandth, + sfx_sssit, + sfx_ssdth, + sfx_keenpn, + sfx_keendt, + sfx_skeact, + sfx_skesit, + sfx_skeatk, + sfx_radio, + NUMSFX +} sfxenum_t; + +#endif diff --git a/firmware_p4/components/Applications/doom/st_lib.c b/firmware_p4/components/Applications/doom/st_lib.c new file mode 100644 index 000000000..7ce978d44 --- /dev/null +++ b/firmware_p4/components/Applications/doom/st_lib.c @@ -0,0 +1,284 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// The status bar widget code. +// + + +#include +#include + +#include "deh_main.h" +#include "doomdef.h" + +#include "z_zone.h" +#include "v_video.h" + +#include "i_swap.h" +#include "i_system.h" + +#include "w_wad.h" + +#include "st_stuff.h" +#include "st_lib.h" +#include "r_local.h" + + +// in AM_map.c +extern boolean automapactive; + + + + +// +// Hack display negative frags. +// Loads and store the stminus lump. +// +patch_t* sttminus; + +void STlib_init(void) +{ + sttminus = (patch_t *) W_CacheLumpName(DEH_String("STTMINUS"), PU_STATIC); +} + + +// ? +void +STlib_initNum +( st_number_t* n, + int x, + int y, + patch_t** pl, + int* num, + boolean* on, + int width ) +{ + n->x = x; + n->y = y; + n->oldnum = 0; + n->width = width; + n->num = num; + n->on = on; + n->p = pl; +} + + +// +// A fairly efficient way to draw a number +// based on differences from the old number. +// Note: worth the trouble? +// +void +STlib_drawNum +( st_number_t* n, + boolean refresh ) +{ + + int numdigits = n->width; + int num = *n->num; + + int w = SHORT(n->p[0]->width); + int h = SHORT(n->p[0]->height); + int x = n->x; + + int neg; + + n->oldnum = *n->num; + + neg = num < 0; + + if (neg) + { + if (numdigits == 2 && num < -9) + num = -9; + else if (numdigits == 3 && num < -99) + num = -99; + + num = -num; + } + + // clear the area + x = n->x - numdigits*w; + + if (n->y - ST_Y < 0) + I_Error("drawNum: n->y - ST_Y < 0"); + + V_CopyRect(x, n->y - ST_Y, st_backing_screen, w*numdigits, h, x, n->y); + + // if non-number, do not draw it + if (num == 1994) + return; + + x = n->x; + + // in the special case of 0, you draw 0 + if (!num) + V_DrawPatch(x - w, n->y, n->p[ 0 ]); + + // draw the new number + while (num && numdigits--) + { + x -= w; + V_DrawPatch(x, n->y, n->p[ num % 10 ]); + num /= 10; + } + + // draw a minus sign if necessary + if (neg) + V_DrawPatch(x - 8, n->y, sttminus); +} + + +// +void +STlib_updateNum +( st_number_t* n, + boolean refresh ) +{ + if (*n->on) STlib_drawNum(n, refresh); +} + + +// +void +STlib_initPercent +( st_percent_t* p, + int x, + int y, + patch_t** pl, + int* num, + boolean* on, + patch_t* percent ) +{ + STlib_initNum(&p->n, x, y, pl, num, on, 3); + p->p = percent; +} + + + + +void +STlib_updatePercent +( st_percent_t* per, + int refresh ) +{ + if (refresh && *per->n.on) + V_DrawPatch(per->n.x, per->n.y, per->p); + + STlib_updateNum(&per->n, refresh); +} + + + +void +STlib_initMultIcon +( st_multicon_t* i, + int x, + int y, + patch_t** il, + int* inum, + boolean* on ) +{ + i->x = x; + i->y = y; + i->oldinum = -1; + i->inum = inum; + i->on = on; + i->p = il; +} + + + +void +STlib_updateMultIcon +( st_multicon_t* mi, + boolean refresh ) +{ + int w; + int h; + int x; + int y; + + if (*mi->on && (mi->oldinum != *mi->inum || refresh) && (*mi->inum != -1)) + { + if (mi->oldinum != -1) + { + x = mi->x - SHORT(mi->p[mi->oldinum]->leftoffset); + y = mi->y - SHORT(mi->p[mi->oldinum]->topoffset); + w = SHORT(mi->p[mi->oldinum]->width); + h = SHORT(mi->p[mi->oldinum]->height); + + if (y - ST_Y < 0) + I_Error("updateMultIcon: y - ST_Y < 0"); + + V_CopyRect(x, y-ST_Y, st_backing_screen, w, h, x, y); + } + V_DrawPatch(mi->x, mi->y, mi->p[*mi->inum]); + mi->oldinum = *mi->inum; + } +} + + + +void +STlib_initBinIcon +( st_binicon_t* b, + int x, + int y, + patch_t* i, + boolean* val, + boolean* on ) +{ + b->x = x; + b->y = y; + b->oldval = false; + b->val = val; + b->on = on; + b->p = i; +} + + + +void +STlib_updateBinIcon +( st_binicon_t* bi, + boolean refresh ) +{ + int x; + int y; + int w; + int h; + + if (*bi->on + && (bi->oldval != *bi->val || refresh)) + { + x = bi->x - SHORT(bi->p->leftoffset); + y = bi->y - SHORT(bi->p->topoffset); + w = SHORT(bi->p->width); + h = SHORT(bi->p->height); + + if (y - ST_Y < 0) + I_Error("updateBinIcon: y - ST_Y < 0"); + + if (*bi->val) + V_DrawPatch(bi->x, bi->y, bi->p); + else + V_CopyRect(x, y-ST_Y, st_backing_screen, w, h, x, y); + + bi->oldval = *bi->val; + } + +} + diff --git a/firmware_p4/components/Applications/doom/st_lib.h b/firmware_p4/components/Applications/doom/st_lib.h new file mode 100644 index 000000000..3a8f52125 --- /dev/null +++ b/firmware_p4/components/Applications/doom/st_lib.h @@ -0,0 +1,209 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// The status bar widget code. +// + +#ifndef __STLIB__ +#define __STLIB__ + + +// We are referring to patches. +#include "r_defs.h" + +// +// Typedefs of widgets +// + +// Number widget + +typedef struct +{ + // upper right-hand corner + // of the number (right-justified) + int x; + int y; + + // max # of digits in number + int width; + + // last number value + int oldnum; + + // pointer to current value + int* num; + + // pointer to boolean stating + // whether to update number + boolean* on; + + // list of patches for 0-9 + patch_t** p; + + // user data + int data; + +} st_number_t; + + + +// Percent widget ("child" of number widget, +// or, more precisely, contains a number widget.) +typedef struct +{ + // number information + st_number_t n; + + // percent sign graphic + patch_t* p; + +} st_percent_t; + + + +// Multiple Icon widget +typedef struct +{ + // center-justified location of icons + int x; + int y; + + // last icon number + int oldinum; + + // pointer to current icon + int* inum; + + // pointer to boolean stating + // whether to update icon + boolean* on; + + // list of icons + patch_t** p; + + // user data + int data; + +} st_multicon_t; + + + + +// Binary Icon widget + +typedef struct +{ + // center-justified location of icon + int x; + int y; + + // last icon value + boolean oldval; + + // pointer to current icon status + boolean* val; + + // pointer to boolean + // stating whether to update icon + boolean* on; + + + patch_t* p; // icon + int data; // user data + +} st_binicon_t; + + + +// +// Widget creation, access, and update routines +// + +// Initializes widget library. +// More precisely, initialize STMINUS, +// everything else is done somewhere else. +// +void STlib_init(void); + + + +// Number widget routines +void +STlib_initNum +( st_number_t* n, + int x, + int y, + patch_t** pl, + int* num, + boolean* on, + int width ); + +void +STlib_updateNum +( st_number_t* n, + boolean refresh ); + + +// Percent widget routines +void +STlib_initPercent +( st_percent_t* p, + int x, + int y, + patch_t** pl, + int* num, + boolean* on, + patch_t* percent ); + + +void +STlib_updatePercent +( st_percent_t* per, + int refresh ); + + +// Multiple Icon widget routines +void +STlib_initMultIcon +( st_multicon_t* mi, + int x, + int y, + patch_t** il, + int* inum, + boolean* on ); + + +void +STlib_updateMultIcon +( st_multicon_t* mi, + boolean refresh ); + +// Binary Icon widget routines + +void +STlib_initBinIcon +( st_binicon_t* b, + int x, + int y, + patch_t* i, + boolean* val, + boolean* on ); + +void +STlib_updateBinIcon +( st_binicon_t* bi, + boolean refresh ); + +#endif diff --git a/firmware_p4/components/Applications/doom/st_stuff.c b/firmware_p4/components/Applications/doom/st_stuff.c new file mode 100644 index 000000000..e25acccb1 --- /dev/null +++ b/firmware_p4/components/Applications/doom/st_stuff.c @@ -0,0 +1,1416 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Status bar code. +// Does the face/direction indicator animatin. +// Does palette indicators as well (red pain/berserk, bright pickup) +// + + + +#include + +#include "i_system.h" +#include "i_video.h" +#include "z_zone.h" +#include "m_misc.h" +#include "m_random.h" +#include "w_wad.h" + +#include "deh_main.h" +#include "deh_misc.h" +#include "doomdef.h" +#include "doomkeys.h" + +#include "g_game.h" + +#include "st_stuff.h" +#include "st_lib.h" +#include "r_local.h" + +#include "p_local.h" +#include "p_inter.h" + +#include "am_map.h" +#include "m_cheat.h" + +#include "s_sound.h" + +// Needs access to LFB. +#include "v_video.h" + +// State. +#include "doomstat.h" + +// Data. +#include "dstrings.h" +#include "sounds.h" + +// +// STATUS BAR DATA +// + + +// Palette indices. +// For damage/bonus red-/gold-shifts +#define STARTREDPALS 1 +#define STARTBONUSPALS 9 +#define NUMREDPALS 8 +#define NUMBONUSPALS 4 +// Radiation suit, green shift. +#define RADIATIONPAL 13 + +// N/256*100% probability +// that the normal face state will change +#define ST_FACEPROBABILITY 96 + +// For Responder +#define ST_TOGGLECHAT KEY_ENTER + +// Location of status bar +#define ST_X 0 +#define ST_X2 104 + +#define ST_FX 143 +#define ST_FY 169 + +// Should be set to patch width +// for tall numbers later on +#define ST_TALLNUMWIDTH (tallnum[0]->width) + +// Number of status faces. +#define ST_NUMPAINFACES 5 +#define ST_NUMSTRAIGHTFACES 3 +#define ST_NUMTURNFACES 2 +#define ST_NUMSPECIALFACES 3 + +#define ST_FACESTRIDE \ + (ST_NUMSTRAIGHTFACES+ST_NUMTURNFACES+ST_NUMSPECIALFACES) + +#define ST_NUMEXTRAFACES 2 + +#define ST_NUMFACES \ + (ST_FACESTRIDE*ST_NUMPAINFACES+ST_NUMEXTRAFACES) + +#define ST_TURNOFFSET (ST_NUMSTRAIGHTFACES) +#define ST_OUCHOFFSET (ST_TURNOFFSET + ST_NUMTURNFACES) +#define ST_EVILGRINOFFSET (ST_OUCHOFFSET + 1) +#define ST_RAMPAGEOFFSET (ST_EVILGRINOFFSET + 1) +#define ST_GODFACE (ST_NUMPAINFACES*ST_FACESTRIDE) +#define ST_DEADFACE (ST_GODFACE+1) + +#define ST_FACESX 143 +#define ST_FACESY 168 + +#define ST_EVILGRINCOUNT (2*TICRATE) +#define ST_STRAIGHTFACECOUNT (TICRATE/2) +#define ST_TURNCOUNT (1*TICRATE) +#define ST_OUCHCOUNT (1*TICRATE) +#define ST_RAMPAGEDELAY (2*TICRATE) + +#define ST_MUCHPAIN 20 + + +// Location and size of statistics, +// justified according to widget type. +// Problem is, within which space? STbar? Screen? +// Note: this could be read in by a lump. +// Problem is, is the stuff rendered +// into a buffer, +// or into the frame buffer? + +// AMMO number pos. +#define ST_AMMOWIDTH 3 +#define ST_AMMOX 44 +#define ST_AMMOY 171 + +// HEALTH number pos. +#define ST_HEALTHWIDTH 3 +#define ST_HEALTHX 90 +#define ST_HEALTHY 171 + +// Weapon pos. +#define ST_ARMSX 111 +#define ST_ARMSY 172 +#define ST_ARMSBGX 104 +#define ST_ARMSBGY 168 +#define ST_ARMSXSPACE 12 +#define ST_ARMSYSPACE 10 + +// Frags pos. +#define ST_FRAGSX 138 +#define ST_FRAGSY 171 +#define ST_FRAGSWIDTH 2 + +// ARMOR number pos. +#define ST_ARMORWIDTH 3 +#define ST_ARMORX 221 +#define ST_ARMORY 171 + +// Key icon positions. +#define ST_KEY0WIDTH 8 +#define ST_KEY0HEIGHT 5 +#define ST_KEY0X 239 +#define ST_KEY0Y 171 +#define ST_KEY1WIDTH ST_KEY0WIDTH +#define ST_KEY1X 239 +#define ST_KEY1Y 181 +#define ST_KEY2WIDTH ST_KEY0WIDTH +#define ST_KEY2X 239 +#define ST_KEY2Y 191 + +// Ammunition counter. +#define ST_AMMO0WIDTH 3 +#define ST_AMMO0HEIGHT 6 +#define ST_AMMO0X 288 +#define ST_AMMO0Y 173 +#define ST_AMMO1WIDTH ST_AMMO0WIDTH +#define ST_AMMO1X 288 +#define ST_AMMO1Y 179 +#define ST_AMMO2WIDTH ST_AMMO0WIDTH +#define ST_AMMO2X 288 +#define ST_AMMO2Y 191 +#define ST_AMMO3WIDTH ST_AMMO0WIDTH +#define ST_AMMO3X 288 +#define ST_AMMO3Y 185 + +// Indicate maximum ammunition. +// Only needed because backpack exists. +#define ST_MAXAMMO0WIDTH 3 +#define ST_MAXAMMO0HEIGHT 5 +#define ST_MAXAMMO0X 314 +#define ST_MAXAMMO0Y 173 +#define ST_MAXAMMO1WIDTH ST_MAXAMMO0WIDTH +#define ST_MAXAMMO1X 314 +#define ST_MAXAMMO1Y 179 +#define ST_MAXAMMO2WIDTH ST_MAXAMMO0WIDTH +#define ST_MAXAMMO2X 314 +#define ST_MAXAMMO2Y 191 +#define ST_MAXAMMO3WIDTH ST_MAXAMMO0WIDTH +#define ST_MAXAMMO3X 314 +#define ST_MAXAMMO3Y 185 + +// pistol +#define ST_WEAPON0X 110 +#define ST_WEAPON0Y 172 + +// shotgun +#define ST_WEAPON1X 122 +#define ST_WEAPON1Y 172 + +// chain gun +#define ST_WEAPON2X 134 +#define ST_WEAPON2Y 172 + +// missile launcher +#define ST_WEAPON3X 110 +#define ST_WEAPON3Y 181 + +// plasma gun +#define ST_WEAPON4X 122 +#define ST_WEAPON4Y 181 + + // bfg +#define ST_WEAPON5X 134 +#define ST_WEAPON5Y 181 + +// WPNS title +#define ST_WPNSX 109 +#define ST_WPNSY 191 + + // DETH title +#define ST_DETHX 109 +#define ST_DETHY 191 + +//Incoming messages window location +//UNUSED +// #define ST_MSGTEXTX (viewwindowx) +// #define ST_MSGTEXTY (viewwindowy+viewheight-18) +#define ST_MSGTEXTX 0 +#define ST_MSGTEXTY 0 +// Dimensions given in characters. +#define ST_MSGWIDTH 52 +// Or shall I say, in lines? +#define ST_MSGHEIGHT 1 + +#define ST_OUTTEXTX 0 +#define ST_OUTTEXTY 6 + +// Width, in characters again. +#define ST_OUTWIDTH 52 + // Height, in lines. +#define ST_OUTHEIGHT 1 + +#define ST_MAPTITLEX \ + (SCREENWIDTH - ST_MAPWIDTH * ST_CHATFONTWIDTH) + +#define ST_MAPTITLEY 0 +#define ST_MAPHEIGHT 1 + +// graphics are drawn to a backing screen and blitted to the real screen +byte *st_backing_screen; + +// main player in game +static player_t* plyr; + +// ST_Start() has just been called +static boolean st_firsttime; + +// lump number for PLAYPAL +static int lu_palette; + +// used for timing +static unsigned int st_clock; + +// used for making messages go away +static int st_msgcounter=0; + +// used when in chat +static st_chatstateenum_t st_chatstate; + +// whether in automap or first-person +static st_stateenum_t st_gamestate; + +// whether left-side main status bar is active +static boolean st_statusbaron; + +// whether status bar chat is active +static boolean st_chat; + +// value of st_chat before message popped up +static boolean st_oldchat; + +// whether chat window has the cursor on +static boolean st_cursoron; + +// !deathmatch +static boolean st_notdeathmatch; + +// !deathmatch && st_statusbaron +static boolean st_armson; + +// !deathmatch +static boolean st_fragson; + +// main bar left +static patch_t* sbar; + +// 0-9, tall numbers +static patch_t* tallnum[10]; + +// tall % sign +static patch_t* tallpercent; + +// 0-9, short, yellow (,different!) numbers +static patch_t* shortnum[10]; + +// 3 key-cards, 3 skulls +static patch_t* keys[NUMCARDS]; + +// face status patches +static patch_t* faces[ST_NUMFACES]; + +// face background +static patch_t* faceback; + + // main bar right +static patch_t* armsbg; + +// weapon ownership patches +static patch_t* arms[6][2]; + +// ready-weapon widget +static st_number_t w_ready; + + // in deathmatch only, summary of frags stats +static st_number_t w_frags; + +// health widget +static st_percent_t w_health; + +// arms background +static st_binicon_t w_armsbg; + + +// weapon ownership widgets +static st_multicon_t w_arms[6]; + +// face status widget +static st_multicon_t w_faces; + +// keycard widgets +static st_multicon_t w_keyboxes[3]; + +// armor widget +static st_percent_t w_armor; + +// ammo widgets +static st_number_t w_ammo[4]; + +// max ammo widgets +static st_number_t w_maxammo[4]; + + + + // number of frags so far in deathmatch +static int st_fragscount; + +// used to use appopriately pained face +static int st_oldhealth = -1; + +// used for evil grin +static boolean oldweaponsowned[NUMWEAPONS]; + + // count until face changes +static int st_facecount = 0; + +// current face index, used by w_faces +static int st_faceindex = 0; + +// holds key-type for each key box on bar +static int keyboxes[3]; + +// a random number per tick +static int st_randomnumber; + +cheatseq_t cheat_mus = CHEAT("idmus", 2); +cheatseq_t cheat_god = CHEAT("iddqd", 0); +cheatseq_t cheat_ammo = CHEAT("idkfa", 0); +cheatseq_t cheat_ammonokey = CHEAT("idfa", 0); +cheatseq_t cheat_noclip = CHEAT("idspispopd", 0); +cheatseq_t cheat_commercial_noclip = CHEAT("idclip", 0); + +cheatseq_t cheat_powerup[7] = +{ + CHEAT("idbeholdv", 0), + CHEAT("idbeholds", 0), + CHEAT("idbeholdi", 0), + CHEAT("idbeholdr", 0), + CHEAT("idbeholda", 0), + CHEAT("idbeholdl", 0), + CHEAT("idbehold", 0), +}; + +cheatseq_t cheat_choppers = CHEAT("idchoppers", 0); +cheatseq_t cheat_clev = CHEAT("idclev", 2); +cheatseq_t cheat_mypos = CHEAT("idmypos", 0); + + +// +// STATUS BAR CODE +// +void ST_Stop(void); + +void ST_refreshBackground(void) +{ + + if (st_statusbaron) + { + V_UseBuffer(st_backing_screen); + + V_DrawPatch(ST_X, 0, sbar); + + if (netgame) + V_DrawPatch(ST_FX, 0, faceback); + + V_RestoreBuffer(); + + V_CopyRect(ST_X, 0, st_backing_screen, ST_WIDTH, ST_HEIGHT, ST_X, ST_Y); + } + +} + + +// Respond to keyboard input events, +// intercept cheats. +boolean +ST_Responder (event_t* ev) +{ + int i; + + // Filter automap on/off. + if (ev->type == ev_keyup + && ((ev->data1 & 0xffff0000) == AM_MSGHEADER)) + { + switch(ev->data1) + { + case AM_MSGENTERED: + st_gamestate = AutomapState; + st_firsttime = true; + break; + + case AM_MSGEXITED: + // fprintf(stderr, "AM exited\n"); + st_gamestate = FirstPersonState; + break; + } + } + + // if a user keypress... + else if (ev->type == ev_keydown) + { + if (!netgame && gameskill != sk_nightmare) + { + // 'dqd' cheat for toggleable god mode + if (cht_CheckCheat(&cheat_god, ev->data2)) + { + plyr->cheats ^= CF_GODMODE; + if (plyr->cheats & CF_GODMODE) + { + if (plyr->mo) + plyr->mo->health = 100; + + plyr->health = deh_god_mode_health; + plyr->message = DEH_String(STSTR_DQDON); + } + else + plyr->message = DEH_String(STSTR_DQDOFF); + } + // 'fa' cheat for killer fucking arsenal + else if (cht_CheckCheat(&cheat_ammonokey, ev->data2)) + { + plyr->armorpoints = deh_idfa_armor; + plyr->armortype = deh_idfa_armor_class; + + for (i=0;iweaponowned[i] = true; + + for (i=0;iammo[i] = plyr->maxammo[i]; + + plyr->message = DEH_String(STSTR_FAADDED); + } + // 'kfa' cheat for key full ammo + else if (cht_CheckCheat(&cheat_ammo, ev->data2)) + { + plyr->armorpoints = deh_idkfa_armor; + plyr->armortype = deh_idkfa_armor_class; + + for (i=0;iweaponowned[i] = true; + + for (i=0;iammo[i] = plyr->maxammo[i]; + + for (i=0;icards[i] = true; + + plyr->message = DEH_String(STSTR_KFAADDED); + } + // 'mus' cheat for changing music + else if (cht_CheckCheat(&cheat_mus, ev->data2)) + { + + char buf[3]; + int musnum; + + plyr->message = DEH_String(STSTR_MUS); + cht_GetParam(&cheat_mus, buf); + + // Note: The original v1.9 had a bug that tried to play back + // the Doom II music regardless of gamemode. This was fixed + // in the Ultimate Doom executable so that it would work for + // the Doom 1 music as well. + + if (gamemode == commercial || gameversion < exe_ultimate) + { + musnum = mus_runnin + (buf[0]-'0')*10 + buf[1]-'0' - 1; + + if (((buf[0]-'0')*10 + buf[1]-'0') > 35) + plyr->message = DEH_String(STSTR_NOMUS); + else + S_ChangeMusic(musnum, 1); + } + else + { + musnum = mus_e1m1 + (buf[0]-'1')*9 + (buf[1]-'1'); + + if (((buf[0]-'1')*9 + buf[1]-'1') > 31) + plyr->message = DEH_String(STSTR_NOMUS); + else + S_ChangeMusic(musnum, 1); + } + } + else if ( (logical_gamemission == doom + && cht_CheckCheat(&cheat_noclip, ev->data2)) + || (logical_gamemission != doom + && cht_CheckCheat(&cheat_commercial_noclip,ev->data2))) + { + // Noclip cheat. + // For Doom 1, use the idspipsopd cheat; for all others, use + // idclip + + plyr->cheats ^= CF_NOCLIP; + + if (plyr->cheats & CF_NOCLIP) + plyr->message = DEH_String(STSTR_NCON); + else + plyr->message = DEH_String(STSTR_NCOFF); + } + // 'behold?' power-up cheats + for (i=0;i<6;i++) + { + if (cht_CheckCheat(&cheat_powerup[i], ev->data2)) + { + if (!plyr->powers[i]) + P_GivePower( plyr, i); + else if (i!=pw_strength) + plyr->powers[i] = 1; + else + plyr->powers[i] = 0; + + plyr->message = DEH_String(STSTR_BEHOLDX); + } + } + + // 'behold' power-up menu + if (cht_CheckCheat(&cheat_powerup[6], ev->data2)) + { + plyr->message = DEH_String(STSTR_BEHOLD); + } + // 'choppers' invulnerability & chainsaw + else if (cht_CheckCheat(&cheat_choppers, ev->data2)) + { + plyr->weaponowned[wp_chainsaw] = true; + plyr->powers[pw_invulnerability] = true; + plyr->message = DEH_String(STSTR_CHOPPERS); + } + // 'mypos' for player position + else if (cht_CheckCheat(&cheat_mypos, ev->data2)) + { + static char buf[ST_MSGWIDTH]; + M_snprintf(buf, sizeof(buf), "ang=0x%x;x,y=(0x%x,0x%x)", + players[consoleplayer].mo->angle, + players[consoleplayer].mo->x, + players[consoleplayer].mo->y); + plyr->message = buf; + } + } + + // 'clev' change-level cheat + if (!netgame && cht_CheckCheat(&cheat_clev, ev->data2)) + { + char buf[3]; + int epsd; + int map; + + cht_GetParam(&cheat_clev, buf); + + if (gamemode == commercial) + { + epsd = 1; + map = (buf[0] - '0')*10 + buf[1] - '0'; + } + else + { + epsd = buf[0] - '0'; + map = buf[1] - '0'; + } + + // Chex.exe always warps to episode 1. + + if (gameversion == exe_chex) + { + epsd = 1; + } + + // Catch invalid maps. + if (epsd < 1) + return false; + + if (map < 1) + return false; + + // Ohmygod - this is not going to work. + if ((gamemode == retail) + && ((epsd > 4) || (map > 9))) + return false; + + if ((gamemode == registered) + && ((epsd > 3) || (map > 9))) + return false; + + if ((gamemode == shareware) + && ((epsd > 1) || (map > 9))) + return false; + + // The source release has this check as map > 34. However, Vanilla + // Doom allows IDCLEV up to MAP40 even though it normally crashes. + if ((gamemode == commercial) + && (( epsd > 1) || (map > 40))) + return false; + + // So be it. + plyr->message = DEH_String(STSTR_CLEV); + G_DeferedInitNew(gameskill, epsd, map); + } + } + return false; +} + + + +int ST_calcPainOffset(void) +{ + int health; + static int lastcalc; + static int oldhealth = -1; + + health = plyr->health > 100 ? 100 : plyr->health; + + if (health != oldhealth) + { + lastcalc = ST_FACESTRIDE * (((100 - health) * ST_NUMPAINFACES) / 101); + oldhealth = health; + } + return lastcalc; +} + + +// +// This is a not-very-pretty routine which handles +// the face states and their timing. +// the precedence of expressions is: +// dead > evil grin > turned head > straight ahead +// +void ST_updateFaceWidget(void) +{ + int i; + angle_t badguyangle; + angle_t diffang; + static int lastattackdown = -1; + static int priority = 0; + boolean doevilgrin; + + if (priority < 10) + { + // dead + if (!plyr->health) + { + priority = 9; + st_faceindex = ST_DEADFACE; + st_facecount = 1; + } + } + + if (priority < 9) + { + if (plyr->bonuscount) + { + // picking up bonus + doevilgrin = false; + + for (i=0;iweaponowned[i]) + { + doevilgrin = true; + oldweaponsowned[i] = plyr->weaponowned[i]; + } + } + if (doevilgrin) + { + // evil grin if just picked up weapon + priority = 8; + st_facecount = ST_EVILGRINCOUNT; + st_faceindex = ST_calcPainOffset() + ST_EVILGRINOFFSET; + } + } + + } + + if (priority < 8) + { + if (plyr->damagecount + && plyr->attacker + && plyr->attacker != plyr->mo) + { + // being attacked + priority = 7; + + if (plyr->health - st_oldhealth > ST_MUCHPAIN) + { + st_facecount = ST_TURNCOUNT; + st_faceindex = ST_calcPainOffset() + ST_OUCHOFFSET; + } + else + { + badguyangle = R_PointToAngle2(plyr->mo->x, + plyr->mo->y, + plyr->attacker->x, + plyr->attacker->y); + + if (badguyangle > plyr->mo->angle) + { + // whether right or left + diffang = badguyangle - plyr->mo->angle; + i = diffang > ANG180; + } + else + { + // whether left or right + diffang = plyr->mo->angle - badguyangle; + i = diffang <= ANG180; + } // confusing, aint it? + + + st_facecount = ST_TURNCOUNT; + st_faceindex = ST_calcPainOffset(); + + if (diffang < ANG45) + { + // head-on + st_faceindex += ST_RAMPAGEOFFSET; + } + else if (i) + { + // turn face right + st_faceindex += ST_TURNOFFSET; + } + else + { + // turn face left + st_faceindex += ST_TURNOFFSET+1; + } + } + } + } + + if (priority < 7) + { + // getting hurt because of your own damn stupidity + if (plyr->damagecount) + { + if (plyr->health - st_oldhealth > ST_MUCHPAIN) + { + priority = 7; + st_facecount = ST_TURNCOUNT; + st_faceindex = ST_calcPainOffset() + ST_OUCHOFFSET; + } + else + { + priority = 6; + st_facecount = ST_TURNCOUNT; + st_faceindex = ST_calcPainOffset() + ST_RAMPAGEOFFSET; + } + + } + + } + + if (priority < 6) + { + // rapid firing + if (plyr->attackdown) + { + if (lastattackdown==-1) + lastattackdown = ST_RAMPAGEDELAY; + else if (!--lastattackdown) + { + priority = 5; + st_faceindex = ST_calcPainOffset() + ST_RAMPAGEOFFSET; + st_facecount = 1; + lastattackdown = 1; + } + } + else + lastattackdown = -1; + + } + + if (priority < 5) + { + // invulnerability + if ((plyr->cheats & CF_GODMODE) + || plyr->powers[pw_invulnerability]) + { + priority = 4; + + st_faceindex = ST_GODFACE; + st_facecount = 1; + + } + + } + + // look left or look right if the facecount has timed out + if (!st_facecount) + { + st_faceindex = ST_calcPainOffset() + (st_randomnumber % 3); + st_facecount = ST_STRAIGHTFACECOUNT; + priority = 0; + } + + st_facecount--; + +} + +void ST_updateWidgets(void) +{ + static int largeammo = 1994; // means "n/a" + int i; + + // must redirect the pointer if the ready weapon has changed. + // if (w_ready.data != plyr->readyweapon) + // { + if (weaponinfo[plyr->readyweapon].ammo == am_noammo) + w_ready.num = &largeammo; + else + w_ready.num = &plyr->ammo[weaponinfo[plyr->readyweapon].ammo]; + //{ + // static int tic=0; + // static int dir=-1; + // if (!(tic&15)) + // plyr->ammo[weaponinfo[plyr->readyweapon].ammo]+=dir; + // if (plyr->ammo[weaponinfo[plyr->readyweapon].ammo] == -100) + // dir = 1; + // tic++; + // } + w_ready.data = plyr->readyweapon; + + // if (*w_ready.on) + // STlib_updateNum(&w_ready, true); + // refresh weapon change + // } + + // update keycard multiple widgets + for (i=0;i<3;i++) + { + keyboxes[i] = plyr->cards[i] ? i : -1; + + if (plyr->cards[i+3]) + keyboxes[i] = i+3; + } + + // refresh everything if this is him coming back to life + ST_updateFaceWidget(); + + // used by the w_armsbg widget + st_notdeathmatch = !deathmatch; + + // used by w_arms[] widgets + st_armson = st_statusbaron && !deathmatch; + + // used by w_frags widget + st_fragson = deathmatch && st_statusbaron; + st_fragscount = 0; + + for (i=0 ; ifrags[i]; + else + st_fragscount -= plyr->frags[i]; + } + + // get rid of chat window if up because of message + if (!--st_msgcounter) + st_chat = st_oldchat; + +} + +void ST_Ticker (void) +{ + + st_clock++; + st_randomnumber = M_Random(); + ST_updateWidgets(); + st_oldhealth = plyr->health; + +} + +static int st_palette = 0; + +void ST_doPaletteStuff(void) +{ + + int palette; + byte* pal; + int cnt; + int bzc; + + cnt = plyr->damagecount; + + if (plyr->powers[pw_strength]) + { + // slowly fade the berzerk out + bzc = 12 - (plyr->powers[pw_strength]>>6); + + if (bzc > cnt) + cnt = bzc; + } + + if (cnt) + { + palette = (cnt+7)>>3; + + if (palette >= NUMREDPALS) + palette = NUMREDPALS-1; + + palette += STARTREDPALS; + } + + else if (plyr->bonuscount) + { + palette = (plyr->bonuscount+7)>>3; + + if (palette >= NUMBONUSPALS) + palette = NUMBONUSPALS-1; + + palette += STARTBONUSPALS; + } + + else if ( plyr->powers[pw_ironfeet] > 4*32 + || plyr->powers[pw_ironfeet]&8) + palette = RADIATIONPAL; + else + palette = 0; + + // In Chex Quest, the player never sees red. Instead, the + // radiation suit palette is used to tint the screen green, + // as though the player is being covered in goo by an + // attacking flemoid. + + if (gameversion == exe_chex + && palette >= STARTREDPALS && palette < STARTREDPALS + NUMREDPALS) + { + palette = RADIATIONPAL; + } + + if (palette != st_palette) + { + st_palette = palette; + pal = (byte *) W_CacheLumpNum (lu_palette, PU_CACHE)+palette*768; + I_SetPalette (pal); + } + +} + +void ST_drawWidgets(boolean refresh) +{ + int i; + + // used by w_arms[] widgets + st_armson = st_statusbaron && !deathmatch; + + // used by w_frags widget + st_fragson = deathmatch && st_statusbaron; + + STlib_updateNum(&w_ready, refresh); + + for (i=0;i<4;i++) + { + STlib_updateNum(&w_ammo[i], refresh); + STlib_updateNum(&w_maxammo[i], refresh); + } + + STlib_updatePercent(&w_health, refresh); + STlib_updatePercent(&w_armor, refresh); + + STlib_updateBinIcon(&w_armsbg, refresh); + + for (i=0;i<6;i++) + STlib_updateMultIcon(&w_arms[i], refresh); + + STlib_updateMultIcon(&w_faces, refresh); + + for (i=0;i<3;i++) + STlib_updateMultIcon(&w_keyboxes[i], refresh); + + STlib_updateNum(&w_frags, refresh); + +} + +void ST_doRefresh(void) +{ + + st_firsttime = false; + + // draw status bar background to off-screen buff + ST_refreshBackground(); + + // and refresh all widgets + ST_drawWidgets(true); + +} + +void ST_diffDraw(void) +{ + // update all widgets + ST_drawWidgets(false); +} + +void ST_Drawer (boolean fullscreen, boolean refresh) +{ + + st_statusbaron = (!fullscreen) || automapactive; + st_firsttime = st_firsttime || refresh; + + // Do red-/gold-shifts from damage/items + ST_doPaletteStuff(); + + // If just after ST_Start(), refresh all + if (st_firsttime) ST_doRefresh(); + // Otherwise, update as little as possible + else ST_diffDraw(); + +} + +typedef void (*load_callback_t)(char *lumpname, patch_t **variable); + +// Iterates through all graphics to be loaded or unloaded, along with +// the variable they use, invoking the specified callback function. + +static void ST_loadUnloadGraphics(load_callback_t callback) +{ + + int i; + int j; + int facenum; + + char namebuf[9]; + + // Load the numbers, tall and short + for (i=0;i<10;i++) + { + DEH_snprintf(namebuf, 9, "STTNUM%d", i); + callback(namebuf, &tallnum[i]); + + DEH_snprintf(namebuf, 9, "STYSNUM%d", i); + callback(namebuf, &shortnum[i]); + } + + // Load percent key. + //Note: why not load STMINUS here, too? + + callback(DEH_String("STTPRCNT"), &tallpercent); + + // key cards + for (i=0;iweaponowned[i]; + + for (i=0;i<3;i++) + keyboxes[i] = -1; + + STlib_init(); + +} + + + +void ST_createWidgets(void) +{ + + int i; + + // ready weapon ammo + STlib_initNum(&w_ready, + ST_AMMOX, + ST_AMMOY, + tallnum, + &plyr->ammo[weaponinfo[plyr->readyweapon].ammo], + &st_statusbaron, + ST_AMMOWIDTH ); + + // the last weapon type + w_ready.data = plyr->readyweapon; + + // health percentage + STlib_initPercent(&w_health, + ST_HEALTHX, + ST_HEALTHY, + tallnum, + &plyr->health, + &st_statusbaron, + tallpercent); + + // arms background + STlib_initBinIcon(&w_armsbg, + ST_ARMSBGX, + ST_ARMSBGY, + armsbg, + &st_notdeathmatch, + &st_statusbaron); + + // weapons owned + for(i=0;i<6;i++) + { + STlib_initMultIcon(&w_arms[i], + ST_ARMSX+(i%3)*ST_ARMSXSPACE, + ST_ARMSY+(i/3)*ST_ARMSYSPACE, + arms[i], (int *) &plyr->weaponowned[i+1], + &st_armson); + } + + // frags sum + STlib_initNum(&w_frags, + ST_FRAGSX, + ST_FRAGSY, + tallnum, + &st_fragscount, + &st_fragson, + ST_FRAGSWIDTH); + + // faces + STlib_initMultIcon(&w_faces, + ST_FACESX, + ST_FACESY, + faces, + &st_faceindex, + &st_statusbaron); + + // armor percentage - should be colored later + STlib_initPercent(&w_armor, + ST_ARMORX, + ST_ARMORY, + tallnum, + &plyr->armorpoints, + &st_statusbaron, tallpercent); + + // keyboxes 0-2 + STlib_initMultIcon(&w_keyboxes[0], + ST_KEY0X, + ST_KEY0Y, + keys, + &keyboxes[0], + &st_statusbaron); + + STlib_initMultIcon(&w_keyboxes[1], + ST_KEY1X, + ST_KEY1Y, + keys, + &keyboxes[1], + &st_statusbaron); + + STlib_initMultIcon(&w_keyboxes[2], + ST_KEY2X, + ST_KEY2Y, + keys, + &keyboxes[2], + &st_statusbaron); + + // ammo count (all four kinds) + STlib_initNum(&w_ammo[0], + ST_AMMO0X, + ST_AMMO0Y, + shortnum, + &plyr->ammo[0], + &st_statusbaron, + ST_AMMO0WIDTH); + + STlib_initNum(&w_ammo[1], + ST_AMMO1X, + ST_AMMO1Y, + shortnum, + &plyr->ammo[1], + &st_statusbaron, + ST_AMMO1WIDTH); + + STlib_initNum(&w_ammo[2], + ST_AMMO2X, + ST_AMMO2Y, + shortnum, + &plyr->ammo[2], + &st_statusbaron, + ST_AMMO2WIDTH); + + STlib_initNum(&w_ammo[3], + ST_AMMO3X, + ST_AMMO3Y, + shortnum, + &plyr->ammo[3], + &st_statusbaron, + ST_AMMO3WIDTH); + + // max ammo count (all four kinds) + STlib_initNum(&w_maxammo[0], + ST_MAXAMMO0X, + ST_MAXAMMO0Y, + shortnum, + &plyr->maxammo[0], + &st_statusbaron, + ST_MAXAMMO0WIDTH); + + STlib_initNum(&w_maxammo[1], + ST_MAXAMMO1X, + ST_MAXAMMO1Y, + shortnum, + &plyr->maxammo[1], + &st_statusbaron, + ST_MAXAMMO1WIDTH); + + STlib_initNum(&w_maxammo[2], + ST_MAXAMMO2X, + ST_MAXAMMO2Y, + shortnum, + &plyr->maxammo[2], + &st_statusbaron, + ST_MAXAMMO2WIDTH); + + STlib_initNum(&w_maxammo[3], + ST_MAXAMMO3X, + ST_MAXAMMO3Y, + shortnum, + &plyr->maxammo[3], + &st_statusbaron, + ST_MAXAMMO3WIDTH); + +} + +static boolean st_stopped = true; + + +void ST_Start (void) +{ + + if (!st_stopped) + ST_Stop(); + + ST_initData(); + ST_createWidgets(); + st_stopped = false; + +} + +void ST_Stop (void) +{ + if (st_stopped) + return; + + I_SetPalette (W_CacheLumpNum (lu_palette, PU_CACHE)); + + st_stopped = true; +} + +void ST_Init (void) +{ + ST_loadData(); + st_backing_screen = (byte *) Z_Malloc(ST_WIDTH * ST_HEIGHT, PU_STATIC, 0); +} + diff --git a/firmware_p4/components/Applications/doom/st_stuff.h b/firmware_p4/components/Applications/doom/st_stuff.h new file mode 100644 index 000000000..8ed53e41c --- /dev/null +++ b/firmware_p4/components/Applications/doom/st_stuff.h @@ -0,0 +1,89 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Status bar code. +// Does the face/direction indicator animatin. +// Does palette indicators as well (red pain/berserk, bright pickup) +// + +#ifndef __STSTUFF_H__ +#define __STSTUFF_H__ + +#include "doomtype.h" +#include "d_event.h" +#include "m_cheat.h" + +// Size of statusbar. +// Now sensitive for scaling. +#define ST_HEIGHT 32 +#define ST_WIDTH SCREENWIDTH +#define ST_Y (SCREENHEIGHT - ST_HEIGHT) + + +// +// STATUS BAR +// + +// Called by main loop. +boolean ST_Responder (event_t* ev); + +// Called by main loop. +void ST_Ticker (void); + +// Called by main loop. +void ST_Drawer (boolean fullscreen, boolean refresh); + +// Called when the console player is spawned on each level. +void ST_Start (void); + +// Called by startup code. +void ST_Init (void); + + + +// States for status bar code. +typedef enum +{ + AutomapState, + FirstPersonState + +} st_stateenum_t; + + +// States for the chat code. +typedef enum +{ + StartChatState, + WaitDestState, + GetChatState + +} st_chatstateenum_t; + + + +extern byte *st_backing_screen; +extern cheatseq_t cheat_mus; +extern cheatseq_t cheat_god; +extern cheatseq_t cheat_ammo; +extern cheatseq_t cheat_ammonokey; +extern cheatseq_t cheat_noclip; +extern cheatseq_t cheat_commercial_noclip; +extern cheatseq_t cheat_powerup[7]; +extern cheatseq_t cheat_choppers; +extern cheatseq_t cheat_clev; +extern cheatseq_t cheat_mypos; + + +#endif diff --git a/firmware_p4/components/Applications/doom/statdump.c b/firmware_p4/components/Applications/doom/statdump.c new file mode 100644 index 000000000..7afe3f366 --- /dev/null +++ b/firmware_p4/components/Applications/doom/statdump.c @@ -0,0 +1,392 @@ + /* + + Copyright(C) 2005-2014 Simon Howard + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + -- + + Functions for presenting the information captured from the statistics + buffer to a file. + + */ + +#include +#include +#include + +#include "d_player.h" +#include "d_mode.h" +#include "m_argv.h" + +#include "statdump.h" + +/* Par times for E1M1-E1M9. */ +static const int doom1_par_times[] = +{ + 30, 75, 120, 90, 165, 180, 180, 30, 165, +}; + +/* Par times for MAP01-MAP09. */ +static const int doom2_par_times[] = +{ + 30, 90, 120, 120, 90, 150, 120, 120, 270, +}; + +#if ORIGCODE + +/* Player colors. */ +static const char *player_colors[] = +{ + "Green", "Indigo", "Brown", "Red" +}; + +#endif + +// Array of end-of-level statistics that have been captured. + +#define MAX_CAPTURES 32 +static wbstartstruct_t captured_stats[MAX_CAPTURES]; +static int num_captured_stats = 0; + +#if ORIGCODE +static GameMission_t discovered_gamemission = none; +#endif + +#if ORIGCODE + +/* Try to work out whether this is a Doom 1 or Doom 2 game, by looking + * at the episode and map, and the par times. This is used to decide + * how to format the level name. Unfortunately, in some cases it is + * impossible to determine whether this is Doom 1 or Doom 2. */ + +static void DiscoverGamemode(wbstartstruct_t *stats, int num_stats) +{ + int partime; + int level; + int i; + + if (discovered_gamemission != none) + { + return; + } + + for (i=0; i 0) + { + discovered_gamemission = doom; + return; + } + + /* This is episode 1. If this is level 10 or higher, + it must be Doom 2. */ + + if (level >= 9) + { + discovered_gamemission = doom2; + return; + } + + /* Try to work out if this is Doom 1 or Doom 2 by looking + at the par time. */ + + partime = stats[i].partime; + + if (partime == doom1_par_times[level] * TICRATE + && partime != doom2_par_times[level] * TICRATE) + { + discovered_gamemission = doom; + return; + } + + if (partime != doom1_par_times[level] * TICRATE + && partime == doom2_par_times[level] * TICRATE) + { + discovered_gamemission = doom2; + return; + } + } +} + +#endif + +#if ORIGCODE + +/* Returns the number of players active in the given stats buffer. */ + +static int GetNumPlayers(wbstartstruct_t *stats) +{ + int i; + int num_players = 0; + + for (i=0; iplyr[i].in) + { + ++num_players; + } + } + + return num_players; +} + +#endif + +#if ORIGCODE + +static void PrintBanner(FILE *stream) +{ + fprintf(stream, "===========================================\n"); +} + +static void PrintPercentage(FILE *stream, int amount, int total) +{ + if (total == 0) + { + fprintf(stream, "0"); + } + else + { + fprintf(stream, "%i / %i", amount, total); + + // statdump.exe is a 16-bit program, so very occasionally an + // integer overflow can occur when doing this calculation with + // a large value. Therefore, cast to short to give the same + // output. + + fprintf(stream, " (%i%%)", (short) (amount * 100) / total); + } +} + +#endif + +#if ORIGCODE + +/* Display statistics for a single player. */ + +static void PrintPlayerStats(FILE *stream, wbstartstruct_t *stats, + int player_num) +{ + wbplayerstruct_t *player = &stats->plyr[player_num]; + + fprintf(stream, "Player %i (%s):\n", player_num + 1, + player_colors[player_num]); + + /* Kills percentage */ + + fprintf(stream, "\tKills: "); + PrintPercentage(stream, player->skills, stats->maxkills); + fprintf(stream, "\n"); + + /* Items percentage */ + + fprintf(stream, "\tItems: "); + PrintPercentage(stream, player->sitems, stats->maxitems); + fprintf(stream, "\n"); + + /* Secrets percentage */ + + fprintf(stream, "\tSecrets: "); + PrintPercentage(stream, player->ssecret, stats->maxsecret); + fprintf(stream, "\n"); +} + +#endif + +#if ORIGCODE + +/* Frags table for multiplayer games. */ + +static void PrintFragsTable(FILE *stream, wbstartstruct_t *stats) +{ + int x, y; + + fprintf(stream, "Frags:\n"); + + /* Print header */ + + fprintf(stream, "\t\t"); + + for (x=0; xplyr[x].in) + { + continue; + } + + fprintf(stream, "%s\t", player_colors[x]); + } + + fprintf(stream, "\n"); + + fprintf(stream, "\t\t-------------------------------- VICTIMS\n"); + + /* Print table */ + + for (y=0; yplyr[y].in) + { + continue; + } + + fprintf(stream, "\t%s\t|", player_colors[y]); + + for (x=0; xplyr[x].in) + { + continue; + } + + fprintf(stream, "%i\t", stats->plyr[y].frags[x]); + } + + fprintf(stream, "\n"); + } + + fprintf(stream, "\t\t|\n"); + fprintf(stream, "\t KILLERS\n"); +} + +#endif + +#if ORIGCODE + +/* Displays the level name: MAPxy or ExMy, depending on game mode. */ + +static void PrintLevelName(FILE *stream, int episode, int level) +{ + PrintBanner(stream); + + switch (discovered_gamemission) + { + + case doom: + fprintf(stream, "E%iM%i\n", episode + 1, level + 1); + break; + case doom2: + fprintf(stream, "MAP%02i\n", level + 1); + break; + default: + case none: + fprintf(stream, "E%iM%i / MAP%02i\n", + episode + 1, level + 1, level + 1); + break; + } + + PrintBanner(stream); +} + +#endif + +#if ORIGCODE + +/* Print details of a statistics buffer to the given file. */ + +static void PrintStats(FILE *stream, wbstartstruct_t *stats) +{ + int leveltime, partime; + int i; + + PrintLevelName(stream, stats->epsd, stats->last); + fprintf(stream, "\n"); + + leveltime = stats->plyr[0].stime / TICRATE; + partime = stats->partime / TICRATE; + fprintf(stream, "Time: %i:%02i", leveltime / 60, leveltime % 60); + fprintf(stream, " (par: %i:%02i)\n", partime / 60, partime % 60); + fprintf(stream, "\n"); + + for (i=0; iplyr[i].in) + { + PrintPlayerStats(stream, stats, i); + } + } + + if (GetNumPlayers(stats) >= 2) + { + PrintFragsTable(stream, stats); + } + + fprintf(stream, "\n"); +} + +#endif + +void StatCopy(wbstartstruct_t *stats) +{ + if (M_ParmExists("-statdump") && num_captured_stats < MAX_CAPTURES) + { + memcpy(&captured_stats[num_captured_stats], stats, + sizeof(wbstartstruct_t)); + ++num_captured_stats; + } +} + +void StatDump(void) +{ +#if ORIGCODE + FILE *dumpfile; + int i; + + //! + // @category compat + // @arg + // + // Dump statistics information to the specified file on the levels + // that were played. The output from this option matches the output + // from statdump.exe (see ctrlapi.zip in the /idgames archive). + // + + i = M_CheckParmWithArgs("-statdump", 1); + + if (i > 0) + { + printf("Statistics captured for %i level(s)\n", num_captured_stats); + + // We actually know what the real gamemission is, but this has + // to match the output from statdump.exe. + + DiscoverGamemode(captured_stats, num_captured_stats); + + // Allow "-" as output file, for stdout. + + if (strcmp(myargv[i + 1], "-") != 0) + { + dumpfile = fopen(myargv[i + 1], "w"); + } + else + { + dumpfile = NULL; + } + + for (i = 0; i < num_captured_stats; ++i) + { + PrintStats(dumpfile, &captured_stats[i]); + } + + if (dumpfile != NULL) + { + fclose(dumpfile); + } + } +#endif +} + diff --git a/firmware_p4/components/Applications/doom/statdump.h b/firmware_p4/components/Applications/doom/statdump.h new file mode 100644 index 000000000..48db2ad2d --- /dev/null +++ b/firmware_p4/components/Applications/doom/statdump.h @@ -0,0 +1,23 @@ + /* + + Copyright(C) 2005-2014 Simon Howard + + This program is free software; you can redistribute it and/or + modify it under the terms of the GNU General Public License + as published by the Free Software Foundation; either version 2 + of the License, or (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + */ + +#ifndef DOOM_STATDUMP_H +#define DOOM_STATDUMP_H + +void StatCopy(wbstartstruct_t *stats); +void StatDump(void); + +#endif /* #ifndef DOOM_STATDUMP_H */ diff --git a/firmware_p4/components/Applications/doom/tables.c b/firmware_p4/components/Applications/doom/tables.c new file mode 100644 index 000000000..c221e9a04 --- /dev/null +++ b/firmware_p4/components/Applications/doom/tables.c @@ -0,0 +1,2227 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Lookup tables. +// Do not try to look them up :-). +// In the order of appearance: +// +// int finetangent[4096] - Tangens LUT. +// Should work with BAM fairly well (12 of 16bit, +// effectively, by shifting). +// +// int finesine[10240] - Sine lookup. +// Guess what, serves as cosine, too. +// Remarkable thing is, how to use BAMs with this? +// +// int tantoangle[2049] - ArcTan LUT, +// maps tan(angle) to angle fast. Gotta search. +// +// + +#include "tables.h" + +// to get a global angle from cartesian coordinates, the coordinates are +// flipped until they are in the first octant of the coordinate system, then +// the y (<=x) is scaled and divided by x to get a tangent (slope) value +// which is looked up in the tantoangle[] table. The +1 size is to handle +// the case when x==y without additional checking. + +int SlopeDiv(unsigned int num, unsigned int den) +{ + unsigned ans; + + if (den < 512) + { + return SLOPERANGE; + } + else + { + ans = (num << 3) / (den >> 8); + + if (ans <= SLOPERANGE) + { + return ans; + } + else + { + return SLOPERANGE; + } + } +} + +const int finetangent[4096] = +{ + -170910304,-56965752,-34178904,-24413316,-18988036,-15535599,-13145455,-11392683, + -10052327,-8994149,-8137527,-7429880,-6835455,-6329090,-5892567,-5512368, + -5178251,-4882318,-4618375,-4381502,-4167737,-3973855,-3797206,-3635590, + -3487165,-3350381,-3223918,-3106651,-2997613,-2895966,-2800983,-2712030, + -2628549,-2550052,-2476104,-2406322,-2340362,-2277919,-2218719,-2162516, + -2109087,-2058233,-2009771,-1963536,-1919378,-1877161,-1836758,-1798063, + -1760956,-1725348,-1691149,-1658278,-1626658,-1596220,-1566898,-1538632, + -1511367,-1485049,-1459630,-1435065,-1411312,-1388330,-1366084,-1344537, + -1323658,-1303416,-1283783,-1264730,-1246234,-1228269,-1210813,-1193846, + -1177345,-1161294,-1145673,-1130465,-1115654,-1101225,-1087164,-1073455, + -1060087,-1047046,-1034322,-1021901,-1009774,-997931,-986361,-975054, + -964003,-953199,-942633,-932298,-922186,-912289,-902602,-893117, + -883829,-874730,-865817,-857081,-848520,-840127,-831898,-823827, + -815910,-808143,-800521,-793041,-785699,-778490,-771411,-764460, + -757631,-750922,-744331,-737853,-731486,-725227,-719074,-713023, + -707072,-701219,-695462,-689797,-684223,-678737,-673338,-668024, + -662792,-657640,-652568,-647572,-642651,-637803,-633028,-628323, + -623686,-619117,-614613,-610174,-605798,-601483,-597229,-593033, + -588896,-584815,-580789,-576818,-572901,-569035,-565221,-561456, + -557741,-554074,-550455,-546881,-543354,-539870,-536431,-533034, + -529680,-526366,-523094,-519861,-516667,-513512,-510394,-507313, + -504269,-501261,-498287,-495348,-492443,-489571,-486732,-483925, + -481150,-478406,-475692,-473009,-470355,-467730,-465133,-462565, + -460024,-457511,-455024,-452564,-450129,-447720,-445337,-442978, + -440643,-438332,-436045,-433781,-431540,-429321,-427125,-424951, + -422798,-420666,-418555,-416465,-414395,-412344,-410314,-408303, + -406311,-404338,-402384,-400448,-398530,-396630,-394747,-392882, + -391034,-389202,-387387,-385589,-383807,-382040,-380290,-378555, + -376835,-375130,-373440,-371765,-370105,-368459,-366826,-365208, + -363604,-362013,-360436,-358872,-357321,-355783,-354257,-352744, + -351244,-349756,-348280,-346816,-345364,-343924,-342495,-341078, + -339671,-338276,-336892,-335519,-334157,-332805,-331464,-330133, + -328812,-327502,-326201,-324910,-323629,-322358,-321097,-319844, + -318601,-317368,-316143,-314928,-313721,-312524,-311335,-310154, + -308983,-307819,-306664,-305517,-304379,-303248,-302126,-301011, + -299904,-298805,-297714,-296630,-295554,-294485,-293423,-292369, + -291322,-290282,-289249,-288223,-287204,-286192,-285186,-284188, + -283195,-282210,-281231,-280258,-279292,-278332,-277378,-276430, + -275489,-274553,-273624,-272700,-271782,-270871,-269965,-269064, + -268169,-267280,-266397,-265519,-264646,-263779,-262917,-262060, + -261209,-260363,-259522,-258686,-257855,-257029,-256208,-255392, + -254581,-253774,-252973,-252176,-251384,-250596,-249813,-249035, + -248261,-247492,-246727,-245966,-245210,-244458,-243711,-242967, + -242228,-241493,-240763,-240036,-239314,-238595,-237881,-237170, + -236463,-235761,-235062,-234367,-233676,-232988,-232304,-231624, + -230948,-230275,-229606,-228941,-228279,-227621,-226966,-226314, + -225666,-225022,-224381,-223743,-223108,-222477,-221849,-221225, + -220603,-219985,-219370,-218758,-218149,-217544,-216941,-216341, + -215745,-215151,-214561,-213973,-213389,-212807,-212228,-211652, + -211079,-210509,-209941,-209376,-208815,-208255,-207699,-207145, + -206594,-206045,-205500,-204956,-204416,-203878,-203342,-202809, + -202279,-201751,-201226,-200703,-200182,-199664,-199149,-198636, + -198125,-197616,-197110,-196606,-196105,-195606,-195109,-194614, + -194122,-193631,-193143,-192658,-192174,-191693,-191213,-190736, + -190261,-189789,-189318,-188849,-188382,-187918,-187455,-186995, + -186536,-186080,-185625,-185173,-184722,-184274,-183827,-183382, + -182939,-182498,-182059,-181622,-181186,-180753,-180321,-179891, + -179463,-179037,-178612,-178190,-177769,-177349,-176932,-176516, + -176102,-175690,-175279,-174870,-174463,-174057,-173653,-173251, + -172850,-172451,-172053,-171657,-171263,-170870,-170479,-170089, + -169701,-169315,-168930,-168546,-168164,-167784,-167405,-167027, + -166651,-166277,-165904,-165532,-165162,-164793,-164426,-164060, + -163695,-163332,-162970,-162610,-162251,-161893,-161537,-161182, + -160828,-160476,-160125,-159775,-159427,-159079,-158734,-158389, + -158046,-157704,-157363,-157024,-156686,-156349,-156013,-155678, + -155345,-155013,-154682,-154352,-154024,-153697,-153370,-153045, + -152722,-152399,-152077,-151757,-151438,-151120,-150803,-150487, + -150172,-149859,-149546,-149235,-148924,-148615,-148307,-148000, + -147693,-147388,-147084,-146782,-146480,-146179,-145879,-145580, + -145282,-144986,-144690,-144395,-144101,-143808,-143517,-143226, + -142936,-142647,-142359,-142072,-141786,-141501,-141217,-140934, + -140651,-140370,-140090,-139810,-139532,-139254,-138977,-138701, + -138426,-138152,-137879,-137607,-137335,-137065,-136795,-136526, + -136258,-135991,-135725,-135459,-135195,-134931,-134668,-134406, + -134145,-133884,-133625,-133366,-133108,-132851,-132594,-132339, + -132084,-131830,-131576,-131324,-131072,-130821,-130571,-130322, + -130073,-129825,-129578,-129332,-129086,-128841,-128597,-128353, + -128111,-127869,-127627,-127387,-127147,-126908,-126669,-126432, + -126195,-125959,-125723,-125488,-125254,-125020,-124787,-124555, + -124324,-124093,-123863,-123633,-123404,-123176,-122949,-122722, + -122496,-122270,-122045,-121821,-121597,-121374,-121152,-120930, + -120709,-120489,-120269,-120050,-119831,-119613,-119396,-119179, + -118963,-118747,-118532,-118318,-118104,-117891,-117678,-117466, + -117254,-117044,-116833,-116623,-116414,-116206,-115998,-115790, + -115583,-115377,-115171,-114966,-114761,-114557,-114354,-114151, + -113948,-113746,-113545,-113344,-113143,-112944,-112744,-112546, + -112347,-112150,-111952,-111756,-111560,-111364,-111169,-110974, + -110780,-110586,-110393,-110200,-110008,-109817,-109626,-109435, + -109245,-109055,-108866,-108677,-108489,-108301,-108114,-107927, + -107741,-107555,-107369,-107184,-107000,-106816,-106632,-106449, + -106266,-106084,-105902,-105721,-105540,-105360,-105180,-105000, + -104821,-104643,-104465,-104287,-104109,-103933,-103756,-103580, + -103404,-103229,-103054,-102880,-102706,-102533,-102360,-102187, + -102015,-101843,-101671,-101500,-101330,-101159,-100990,-100820, + -100651,-100482,-100314,-100146,-99979,-99812,-99645,-99479, + -99313,-99148,-98982,-98818,-98653,-98489,-98326,-98163, + -98000,-97837,-97675,-97513,-97352,-97191,-97030,-96870, + -96710,-96551,-96391,-96233,-96074,-95916,-95758,-95601, + -95444,-95287,-95131,-94975,-94819,-94664,-94509,-94354, + -94200,-94046,-93892,-93739,-93586,-93434,-93281,-93129, + -92978,-92826,-92675,-92525,-92375,-92225,-92075,-91926, + -91777,-91628,-91480,-91332,-91184,-91036,-90889,-90742, + -90596,-90450,-90304,-90158,-90013,-89868,-89724,-89579, + -89435,-89292,-89148,-89005,-88862,-88720,-88577,-88435, + -88294,-88152,-88011,-87871,-87730,-87590,-87450,-87310, + -87171,-87032,-86893,-86755,-86616,-86479,-86341,-86204, + -86066,-85930,-85793,-85657,-85521,-85385,-85250,-85114, + -84980,-84845,-84710,-84576,-84443,-84309,-84176,-84043, + -83910,-83777,-83645,-83513,-83381,-83250,-83118,-82987, + -82857,-82726,-82596,-82466,-82336,-82207,-82078,-81949, + -81820,-81691,-81563,-81435,-81307,-81180,-81053,-80925, + -80799,-80672,-80546,-80420,-80294,-80168,-80043,-79918, + -79793,-79668,-79544,-79420,-79296,-79172,-79048,-78925, + -78802,-78679,-78557,-78434,-78312,-78190,-78068,-77947, + -77826,-77705,-77584,-77463,-77343,-77223,-77103,-76983, + -76864,-76744,-76625,-76506,-76388,-76269,-76151,-76033, + -75915,-75797,-75680,-75563,-75446,-75329,-75213,-75096, + -74980,-74864,-74748,-74633,-74517,-74402,-74287,-74172, + -74058,-73944,-73829,-73715,-73602,-73488,-73375,-73262, + -73149,-73036,-72923,-72811,-72699,-72587,-72475,-72363, + -72252,-72140,-72029,-71918,-71808,-71697,-71587,-71477, + -71367,-71257,-71147,-71038,-70929,-70820,-70711,-70602, + -70494,-70385,-70277,-70169,-70061,-69954,-69846,-69739, + -69632,-69525,-69418,-69312,-69205,-69099,-68993,-68887, + -68781,-68676,-68570,-68465,-68360,-68255,-68151,-68046, + -67942,-67837,-67733,-67629,-67526,-67422,-67319,-67216, + -67113,-67010,-66907,-66804,-66702,-66600,-66498,-66396, + -66294,-66192,-66091,-65989,-65888,-65787,-65686,-65586, + -65485,-65385,-65285,-65185,-65085,-64985,-64885,-64786, + -64687,-64587,-64488,-64389,-64291,-64192,-64094,-63996, + -63897,-63799,-63702,-63604,-63506,-63409,-63312,-63215, + -63118,-63021,-62924,-62828,-62731,-62635,-62539,-62443, + -62347,-62251,-62156,-62060,-61965,-61870,-61775,-61680, + -61585,-61491,-61396,-61302,-61208,-61114,-61020,-60926, + -60833,-60739,-60646,-60552,-60459,-60366,-60273,-60181, + -60088,-59996,-59903,-59811,-59719,-59627,-59535,-59444, + -59352,-59261,-59169,-59078,-58987,-58896,-58805,-58715, + -58624,-58534,-58443,-58353,-58263,-58173,-58083,-57994, + -57904,-57815,-57725,-57636,-57547,-57458,-57369,-57281, + -57192,-57104,-57015,-56927,-56839,-56751,-56663,-56575, + -56487,-56400,-56312,-56225,-56138,-56051,-55964,-55877, + -55790,-55704,-55617,-55531,-55444,-55358,-55272,-55186, + -55100,-55015,-54929,-54843,-54758,-54673,-54587,-54502, + -54417,-54333,-54248,-54163,-54079,-53994,-53910,-53826, + -53741,-53657,-53574,-53490,-53406,-53322,-53239,-53156, + -53072,-52989,-52906,-52823,-52740,-52657,-52575,-52492, + -52410,-52327,-52245,-52163,-52081,-51999,-51917,-51835, + -51754,-51672,-51591,-51509,-51428,-51347,-51266,-51185, + -51104,-51023,-50942,-50862,-50781,-50701,-50621,-50540, + -50460,-50380,-50300,-50221,-50141,-50061,-49982,-49902, + -49823,-49744,-49664,-49585,-49506,-49427,-49349,-49270, + -49191,-49113,-49034,-48956,-48878,-48799,-48721,-48643, + -48565,-48488,-48410,-48332,-48255,-48177,-48100,-48022, + -47945,-47868,-47791,-47714,-47637,-47560,-47484,-47407, + -47331,-47254,-47178,-47102,-47025,-46949,-46873,-46797, + -46721,-46646,-46570,-46494,-46419,-46343,-46268,-46193, + -46118,-46042,-45967,-45892,-45818,-45743,-45668,-45593, + -45519,-45444,-45370,-45296,-45221,-45147,-45073,-44999, + -44925,-44851,-44778,-44704,-44630,-44557,-44483,-44410, + -44337,-44263,-44190,-44117,-44044,-43971,-43898,-43826, + -43753,-43680,-43608,-43535,-43463,-43390,-43318,-43246, + -43174,-43102,-43030,-42958,-42886,-42814,-42743,-42671, + -42600,-42528,-42457,-42385,-42314,-42243,-42172,-42101, + -42030,-41959,-41888,-41817,-41747,-41676,-41605,-41535, + -41465,-41394,-41324,-41254,-41184,-41113,-41043,-40973, + -40904,-40834,-40764,-40694,-40625,-40555,-40486,-40416, + -40347,-40278,-40208,-40139,-40070,-40001,-39932,-39863, + -39794,-39726,-39657,-39588,-39520,-39451,-39383,-39314, + -39246,-39178,-39110,-39042,-38973,-38905,-38837,-38770, + -38702,-38634,-38566,-38499,-38431,-38364,-38296,-38229, + -38161,-38094,-38027,-37960,-37893,-37826,-37759,-37692, + -37625,-37558,-37491,-37425,-37358,-37291,-37225,-37158, + -37092,-37026,-36959,-36893,-36827,-36761,-36695,-36629, + -36563,-36497,-36431,-36365,-36300,-36234,-36168,-36103, + -36037,-35972,-35907,-35841,-35776,-35711,-35646,-35580, + -35515,-35450,-35385,-35321,-35256,-35191,-35126,-35062, + -34997,-34932,-34868,-34803,-34739,-34675,-34610,-34546, + -34482,-34418,-34354,-34289,-34225,-34162,-34098,-34034, + -33970,-33906,-33843,-33779,-33715,-33652,-33588,-33525, + -33461,-33398,-33335,-33272,-33208,-33145,-33082,-33019, + -32956,-32893,-32830,-32767,-32705,-32642,-32579,-32516, + -32454,-32391,-32329,-32266,-32204,-32141,-32079,-32017, + -31955,-31892,-31830,-31768,-31706,-31644,-31582,-31520, + -31458,-31396,-31335,-31273,-31211,-31150,-31088,-31026, + -30965,-30904,-30842,-30781,-30719,-30658,-30597,-30536, + -30474,-30413,-30352,-30291,-30230,-30169,-30108,-30048, + -29987,-29926,-29865,-29805,-29744,-29683,-29623,-29562, + -29502,-29441,-29381,-29321,-29260,-29200,-29140,-29080, + -29020,-28959,-28899,-28839,-28779,-28719,-28660,-28600, + -28540,-28480,-28420,-28361,-28301,-28241,-28182,-28122, + -28063,-28003,-27944,-27884,-27825,-27766,-27707,-27647, + -27588,-27529,-27470,-27411,-27352,-27293,-27234,-27175, + -27116,-27057,-26998,-26940,-26881,-26822,-26763,-26705, + -26646,-26588,-26529,-26471,-26412,-26354,-26295,-26237, + -26179,-26120,-26062,-26004,-25946,-25888,-25830,-25772, + -25714,-25656,-25598,-25540,-25482,-25424,-25366,-25308, + -25251,-25193,-25135,-25078,-25020,-24962,-24905,-24847, + -24790,-24732,-24675,-24618,-24560,-24503,-24446,-24389, + -24331,-24274,-24217,-24160,-24103,-24046,-23989,-23932, + -23875,-23818,-23761,-23704,-23647,-23591,-23534,-23477, + -23420,-23364,-23307,-23250,-23194,-23137,-23081,-23024, + -22968,-22911,-22855,-22799,-22742,-22686,-22630,-22573, + -22517,-22461,-22405,-22349,-22293,-22237,-22181,-22125, + -22069,-22013,-21957,-21901,-21845,-21789,-21733,-21678, + -21622,-21566,-21510,-21455,-21399,-21343,-21288,-21232, + -21177,-21121,-21066,-21010,-20955,-20900,-20844,-20789, + -20734,-20678,-20623,-20568,-20513,-20457,-20402,-20347, + -20292,-20237,-20182,-20127,-20072,-20017,-19962,-19907, + -19852,-19797,-19742,-19688,-19633,-19578,-19523,-19469, + -19414,-19359,-19305,-19250,-19195,-19141,-19086,-19032, + -18977,-18923,-18868,-18814,-18760,-18705,-18651,-18597, + -18542,-18488,-18434,-18380,-18325,-18271,-18217,-18163, + -18109,-18055,-18001,-17946,-17892,-17838,-17784,-17731, + -17677,-17623,-17569,-17515,-17461,-17407,-17353,-17300, + -17246,-17192,-17138,-17085,-17031,-16977,-16924,-16870, + -16817,-16763,-16710,-16656,-16603,-16549,-16496,-16442, + -16389,-16335,-16282,-16229,-16175,-16122,-16069,-16015, + -15962,-15909,-15856,-15802,-15749,-15696,-15643,-15590, + -15537,-15484,-15431,-15378,-15325,-15272,-15219,-15166, + -15113,-15060,-15007,-14954,-14901,-14848,-14795,-14743, + -14690,-14637,-14584,-14531,-14479,-14426,-14373,-14321, + -14268,-14215,-14163,-14110,-14057,-14005,-13952,-13900, + -13847,-13795,-13742,-13690,-13637,-13585,-13533,-13480, + -13428,-13375,-13323,-13271,-13218,-13166,-13114,-13062, + -13009,-12957,-12905,-12853,-12800,-12748,-12696,-12644, + -12592,-12540,-12488,-12436,-12383,-12331,-12279,-12227, + -12175,-12123,-12071,-12019,-11967,-11916,-11864,-11812, + -11760,-11708,-11656,-11604,-11552,-11501,-11449,-11397, + -11345,-11293,-11242,-11190,-11138,-11086,-11035,-10983, + -10931,-10880,-10828,-10777,-10725,-10673,-10622,-10570, + -10519,-10467,-10415,-10364,-10312,-10261,-10209,-10158, + -10106,-10055,-10004,-9952,-9901,-9849,-9798,-9747, + -9695,-9644,-9592,-9541,-9490,-9438,-9387,-9336, + -9285,-9233,-9182,-9131,-9080,-9028,-8977,-8926, + -8875,-8824,-8772,-8721,-8670,-8619,-8568,-8517, + -8466,-8414,-8363,-8312,-8261,-8210,-8159,-8108, + -8057,-8006,-7955,-7904,-7853,-7802,-7751,-7700, + -7649,-7598,-7547,-7496,-7445,-7395,-7344,-7293, + -7242,-7191,-7140,-7089,-7038,-6988,-6937,-6886, + -6835,-6784,-6733,-6683,-6632,-6581,-6530,-6480, + -6429,-6378,-6327,-6277,-6226,-6175,-6124,-6074, + -6023,-5972,-5922,-5871,-5820,-5770,-5719,-5668, + -5618,-5567,-5517,-5466,-5415,-5365,-5314,-5264, + -5213,-5162,-5112,-5061,-5011,-4960,-4910,-4859, + -4808,-4758,-4707,-4657,-4606,-4556,-4505,-4455, + -4404,-4354,-4303,-4253,-4202,-4152,-4101,-4051, + -4001,-3950,-3900,-3849,-3799,-3748,-3698,-3648, + -3597,-3547,-3496,-3446,-3395,-3345,-3295,-3244, + -3194,-3144,-3093,-3043,-2992,-2942,-2892,-2841, + -2791,-2741,-2690,-2640,-2590,-2539,-2489,-2439, + -2388,-2338,-2288,-2237,-2187,-2137,-2086,-2036, + -1986,-1935,-1885,-1835,-1784,-1734,-1684,-1633, + -1583,-1533,-1483,-1432,-1382,-1332,-1281,-1231, + -1181,-1131,-1080,-1030,-980,-929,-879,-829, + -779,-728,-678,-628,-578,-527,-477,-427, + -376,-326,-276,-226,-175,-125,-75,-25, + 25,75,125,175,226,276,326,376, + 427,477,527,578,628,678,728,779, + 829,879,929,980,1030,1080,1131,1181, + 1231,1281,1332,1382,1432,1483,1533,1583, + 1633,1684,1734,1784,1835,1885,1935,1986, + 2036,2086,2137,2187,2237,2288,2338,2388, + 2439,2489,2539,2590,2640,2690,2741,2791, + 2841,2892,2942,2992,3043,3093,3144,3194, + 3244,3295,3345,3395,3446,3496,3547,3597, + 3648,3698,3748,3799,3849,3900,3950,4001, + 4051,4101,4152,4202,4253,4303,4354,4404, + 4455,4505,4556,4606,4657,4707,4758,4808, + 4859,4910,4960,5011,5061,5112,5162,5213, + 5264,5314,5365,5415,5466,5517,5567,5618, + 5668,5719,5770,5820,5871,5922,5972,6023, + 6074,6124,6175,6226,6277,6327,6378,6429, + 6480,6530,6581,6632,6683,6733,6784,6835, + 6886,6937,6988,7038,7089,7140,7191,7242, + 7293,7344,7395,7445,7496,7547,7598,7649, + 7700,7751,7802,7853,7904,7955,8006,8057, + 8108,8159,8210,8261,8312,8363,8414,8466, + 8517,8568,8619,8670,8721,8772,8824,8875, + 8926,8977,9028,9080,9131,9182,9233,9285, + 9336,9387,9438,9490,9541,9592,9644,9695, + 9747,9798,9849,9901,9952,10004,10055,10106, + 10158,10209,10261,10312,10364,10415,10467,10519, + 10570,10622,10673,10725,10777,10828,10880,10931, + 10983,11035,11086,11138,11190,11242,11293,11345, + 11397,11449,11501,11552,11604,11656,11708,11760, + 11812,11864,11916,11967,12019,12071,12123,12175, + 12227,12279,12331,12383,12436,12488,12540,12592, + 12644,12696,12748,12800,12853,12905,12957,13009, + 13062,13114,13166,13218,13271,13323,13375,13428, + 13480,13533,13585,13637,13690,13742,13795,13847, + 13900,13952,14005,14057,14110,14163,14215,14268, + 14321,14373,14426,14479,14531,14584,14637,14690, + 14743,14795,14848,14901,14954,15007,15060,15113, + 15166,15219,15272,15325,15378,15431,15484,15537, + 15590,15643,15696,15749,15802,15856,15909,15962, + 16015,16069,16122,16175,16229,16282,16335,16389, + 16442,16496,16549,16603,16656,16710,16763,16817, + 16870,16924,16977,17031,17085,17138,17192,17246, + 17300,17353,17407,17461,17515,17569,17623,17677, + 17731,17784,17838,17892,17946,18001,18055,18109, + 18163,18217,18271,18325,18380,18434,18488,18542, + 18597,18651,18705,18760,18814,18868,18923,18977, + 19032,19086,19141,19195,19250,19305,19359,19414, + 19469,19523,19578,19633,19688,19742,19797,19852, + 19907,19962,20017,20072,20127,20182,20237,20292, + 20347,20402,20457,20513,20568,20623,20678,20734, + 20789,20844,20900,20955,21010,21066,21121,21177, + 21232,21288,21343,21399,21455,21510,21566,21622, + 21678,21733,21789,21845,21901,21957,22013,22069, + 22125,22181,22237,22293,22349,22405,22461,22517, + 22573,22630,22686,22742,22799,22855,22911,22968, + 23024,23081,23137,23194,23250,23307,23364,23420, + 23477,23534,23591,23647,23704,23761,23818,23875, + 23932,23989,24046,24103,24160,24217,24274,24331, + 24389,24446,24503,24560,24618,24675,24732,24790, + 24847,24905,24962,25020,25078,25135,25193,25251, + 25308,25366,25424,25482,25540,25598,25656,25714, + 25772,25830,25888,25946,26004,26062,26120,26179, + 26237,26295,26354,26412,26471,26529,26588,26646, + 26705,26763,26822,26881,26940,26998,27057,27116, + 27175,27234,27293,27352,27411,27470,27529,27588, + 27647,27707,27766,27825,27884,27944,28003,28063, + 28122,28182,28241,28301,28361,28420,28480,28540, + 28600,28660,28719,28779,28839,28899,28959,29020, + 29080,29140,29200,29260,29321,29381,29441,29502, + 29562,29623,29683,29744,29805,29865,29926,29987, + 30048,30108,30169,30230,30291,30352,30413,30474, + 30536,30597,30658,30719,30781,30842,30904,30965, + 31026,31088,31150,31211,31273,31335,31396,31458, + 31520,31582,31644,31706,31768,31830,31892,31955, + 32017,32079,32141,32204,32266,32329,32391,32454, + 32516,32579,32642,32705,32767,32830,32893,32956, + 33019,33082,33145,33208,33272,33335,33398,33461, + 33525,33588,33652,33715,33779,33843,33906,33970, + 34034,34098,34162,34225,34289,34354,34418,34482, + 34546,34610,34675,34739,34803,34868,34932,34997, + 35062,35126,35191,35256,35321,35385,35450,35515, + 35580,35646,35711,35776,35841,35907,35972,36037, + 36103,36168,36234,36300,36365,36431,36497,36563, + 36629,36695,36761,36827,36893,36959,37026,37092, + 37158,37225,37291,37358,37425,37491,37558,37625, + 37692,37759,37826,37893,37960,38027,38094,38161, + 38229,38296,38364,38431,38499,38566,38634,38702, + 38770,38837,38905,38973,39042,39110,39178,39246, + 39314,39383,39451,39520,39588,39657,39726,39794, + 39863,39932,40001,40070,40139,40208,40278,40347, + 40416,40486,40555,40625,40694,40764,40834,40904, + 40973,41043,41113,41184,41254,41324,41394,41465, + 41535,41605,41676,41747,41817,41888,41959,42030, + 42101,42172,42243,42314,42385,42457,42528,42600, + 42671,42743,42814,42886,42958,43030,43102,43174, + 43246,43318,43390,43463,43535,43608,43680,43753, + 43826,43898,43971,44044,44117,44190,44263,44337, + 44410,44483,44557,44630,44704,44778,44851,44925, + 44999,45073,45147,45221,45296,45370,45444,45519, + 45593,45668,45743,45818,45892,45967,46042,46118, + 46193,46268,46343,46419,46494,46570,46646,46721, + 46797,46873,46949,47025,47102,47178,47254,47331, + 47407,47484,47560,47637,47714,47791,47868,47945, + 48022,48100,48177,48255,48332,48410,48488,48565, + 48643,48721,48799,48878,48956,49034,49113,49191, + 49270,49349,49427,49506,49585,49664,49744,49823, + 49902,49982,50061,50141,50221,50300,50380,50460, + 50540,50621,50701,50781,50862,50942,51023,51104, + 51185,51266,51347,51428,51509,51591,51672,51754, + 51835,51917,51999,52081,52163,52245,52327,52410, + 52492,52575,52657,52740,52823,52906,52989,53072, + 53156,53239,53322,53406,53490,53574,53657,53741, + 53826,53910,53994,54079,54163,54248,54333,54417, + 54502,54587,54673,54758,54843,54929,55015,55100, + 55186,55272,55358,55444,55531,55617,55704,55790, + 55877,55964,56051,56138,56225,56312,56400,56487, + 56575,56663,56751,56839,56927,57015,57104,57192, + 57281,57369,57458,57547,57636,57725,57815,57904, + 57994,58083,58173,58263,58353,58443,58534,58624, + 58715,58805,58896,58987,59078,59169,59261,59352, + 59444,59535,59627,59719,59811,59903,59996,60088, + 60181,60273,60366,60459,60552,60646,60739,60833, + 60926,61020,61114,61208,61302,61396,61491,61585, + 61680,61775,61870,61965,62060,62156,62251,62347, + 62443,62539,62635,62731,62828,62924,63021,63118, + 63215,63312,63409,63506,63604,63702,63799,63897, + 63996,64094,64192,64291,64389,64488,64587,64687, + 64786,64885,64985,65085,65185,65285,65385,65485, + 65586,65686,65787,65888,65989,66091,66192,66294, + 66396,66498,66600,66702,66804,66907,67010,67113, + 67216,67319,67422,67526,67629,67733,67837,67942, + 68046,68151,68255,68360,68465,68570,68676,68781, + 68887,68993,69099,69205,69312,69418,69525,69632, + 69739,69846,69954,70061,70169,70277,70385,70494, + 70602,70711,70820,70929,71038,71147,71257,71367, + 71477,71587,71697,71808,71918,72029,72140,72252, + 72363,72475,72587,72699,72811,72923,73036,73149, + 73262,73375,73488,73602,73715,73829,73944,74058, + 74172,74287,74402,74517,74633,74748,74864,74980, + 75096,75213,75329,75446,75563,75680,75797,75915, + 76033,76151,76269,76388,76506,76625,76744,76864, + 76983,77103,77223,77343,77463,77584,77705,77826, + 77947,78068,78190,78312,78434,78557,78679,78802, + 78925,79048,79172,79296,79420,79544,79668,79793, + 79918,80043,80168,80294,80420,80546,80672,80799, + 80925,81053,81180,81307,81435,81563,81691,81820, + 81949,82078,82207,82336,82466,82596,82726,82857, + 82987,83118,83250,83381,83513,83645,83777,83910, + 84043,84176,84309,84443,84576,84710,84845,84980, + 85114,85250,85385,85521,85657,85793,85930,86066, + 86204,86341,86479,86616,86755,86893,87032,87171, + 87310,87450,87590,87730,87871,88011,88152,88294, + 88435,88577,88720,88862,89005,89148,89292,89435, + 89579,89724,89868,90013,90158,90304,90450,90596, + 90742,90889,91036,91184,91332,91480,91628,91777, + 91926,92075,92225,92375,92525,92675,92826,92978, + 93129,93281,93434,93586,93739,93892,94046,94200, + 94354,94509,94664,94819,94975,95131,95287,95444, + 95601,95758,95916,96074,96233,96391,96551,96710, + 96870,97030,97191,97352,97513,97675,97837,98000, + 98163,98326,98489,98653,98818,98982,99148,99313, + 99479,99645,99812,99979,100146,100314,100482,100651, + 100820,100990,101159,101330,101500,101671,101843,102015, + 102187,102360,102533,102706,102880,103054,103229,103404, + 103580,103756,103933,104109,104287,104465,104643,104821, + 105000,105180,105360,105540,105721,105902,106084,106266, + 106449,106632,106816,107000,107184,107369,107555,107741, + 107927,108114,108301,108489,108677,108866,109055,109245, + 109435,109626,109817,110008,110200,110393,110586,110780, + 110974,111169,111364,111560,111756,111952,112150,112347, + 112546,112744,112944,113143,113344,113545,113746,113948, + 114151,114354,114557,114761,114966,115171,115377,115583, + 115790,115998,116206,116414,116623,116833,117044,117254, + 117466,117678,117891,118104,118318,118532,118747,118963, + 119179,119396,119613,119831,120050,120269,120489,120709, + 120930,121152,121374,121597,121821,122045,122270,122496, + 122722,122949,123176,123404,123633,123863,124093,124324, + 124555,124787,125020,125254,125488,125723,125959,126195, + 126432,126669,126908,127147,127387,127627,127869,128111, + 128353,128597,128841,129086,129332,129578,129825,130073, + 130322,130571,130821,131072,131324,131576,131830,132084, + 132339,132594,132851,133108,133366,133625,133884,134145, + 134406,134668,134931,135195,135459,135725,135991,136258, + 136526,136795,137065,137335,137607,137879,138152,138426, + 138701,138977,139254,139532,139810,140090,140370,140651, + 140934,141217,141501,141786,142072,142359,142647,142936, + 143226,143517,143808,144101,144395,144690,144986,145282, + 145580,145879,146179,146480,146782,147084,147388,147693, + 148000,148307,148615,148924,149235,149546,149859,150172, + 150487,150803,151120,151438,151757,152077,152399,152722, + 153045,153370,153697,154024,154352,154682,155013,155345, + 155678,156013,156349,156686,157024,157363,157704,158046, + 158389,158734,159079,159427,159775,160125,160476,160828, + 161182,161537,161893,162251,162610,162970,163332,163695, + 164060,164426,164793,165162,165532,165904,166277,166651, + 167027,167405,167784,168164,168546,168930,169315,169701, + 170089,170479,170870,171263,171657,172053,172451,172850, + 173251,173653,174057,174463,174870,175279,175690,176102, + 176516,176932,177349,177769,178190,178612,179037,179463, + 179891,180321,180753,181186,181622,182059,182498,182939, + 183382,183827,184274,184722,185173,185625,186080,186536, + 186995,187455,187918,188382,188849,189318,189789,190261, + 190736,191213,191693,192174,192658,193143,193631,194122, + 194614,195109,195606,196105,196606,197110,197616,198125, + 198636,199149,199664,200182,200703,201226,201751,202279, + 202809,203342,203878,204416,204956,205500,206045,206594, + 207145,207699,208255,208815,209376,209941,210509,211079, + 211652,212228,212807,213389,213973,214561,215151,215745, + 216341,216941,217544,218149,218758,219370,219985,220603, + 221225,221849,222477,223108,223743,224381,225022,225666, + 226314,226966,227621,228279,228941,229606,230275,230948, + 231624,232304,232988,233676,234367,235062,235761,236463, + 237170,237881,238595,239314,240036,240763,241493,242228, + 242967,243711,244458,245210,245966,246727,247492,248261, + 249035,249813,250596,251384,252176,252973,253774,254581, + 255392,256208,257029,257855,258686,259522,260363,261209, + 262060,262917,263779,264646,265519,266397,267280,268169, + 269064,269965,270871,271782,272700,273624,274553,275489, + 276430,277378,278332,279292,280258,281231,282210,283195, + 284188,285186,286192,287204,288223,289249,290282,291322, + 292369,293423,294485,295554,296630,297714,298805,299904, + 301011,302126,303248,304379,305517,306664,307819,308983, + 310154,311335,312524,313721,314928,316143,317368,318601, + 319844,321097,322358,323629,324910,326201,327502,328812, + 330133,331464,332805,334157,335519,336892,338276,339671, + 341078,342495,343924,345364,346816,348280,349756,351244, + 352744,354257,355783,357321,358872,360436,362013,363604, + 365208,366826,368459,370105,371765,373440,375130,376835, + 378555,380290,382040,383807,385589,387387,389202,391034, + 392882,394747,396630,398530,400448,402384,404338,406311, + 408303,410314,412344,414395,416465,418555,420666,422798, + 424951,427125,429321,431540,433781,436045,438332,440643, + 442978,445337,447720,450129,452564,455024,457511,460024, + 462565,465133,467730,470355,473009,475692,478406,481150, + 483925,486732,489571,492443,495348,498287,501261,504269, + 507313,510394,513512,516667,519861,523094,526366,529680, + 533034,536431,539870,543354,546881,550455,554074,557741, + 561456,565221,569035,572901,576818,580789,584815,588896, + 593033,597229,601483,605798,610174,614613,619117,623686, + 628323,633028,637803,642651,647572,652568,657640,662792, + 668024,673338,678737,684223,689797,695462,701219,707072, + 713023,719074,725227,731486,737853,744331,750922,757631, + 764460,771411,778490,785699,793041,800521,808143,815910, + 823827,831898,840127,848520,857081,865817,874730,883829, + 893117,902602,912289,922186,932298,942633,953199,964003, + 975054,986361,997931,1009774,1021901,1034322,1047046,1060087, + 1073455,1087164,1101225,1115654,1130465,1145673,1161294,1177345, + 1193846,1210813,1228269,1246234,1264730,1283783,1303416,1323658, + 1344537,1366084,1388330,1411312,1435065,1459630,1485049,1511367, + 1538632,1566898,1596220,1626658,1658278,1691149,1725348,1760956, + 1798063,1836758,1877161,1919378,1963536,2009771,2058233,2109087, + 2162516,2218719,2277919,2340362,2406322,2476104,2550052,2628549, + 2712030,2800983,2895966,2997613,3106651,3223918,3350381,3487165, + 3635590,3797206,3973855,4167737,4381502,4618375,4882318,5178251, + 5512368,5892567,6329090,6835455,7429880,8137527,8994149,10052327, + 11392683,13145455,15535599,18988036,24413316,34178904,56965752,170910304 +}; + + +const int finesine[10240] = +{ + 25,75,125,175,226,276,326,376, + 427,477,527,578,628,678,728,779, + 829,879,929,980,1030,1080,1130,1181, + 1231,1281,1331,1382,1432,1482,1532,1583, + 1633,1683,1733,1784,1834,1884,1934,1985, + 2035,2085,2135,2186,2236,2286,2336,2387, + 2437,2487,2537,2587,2638,2688,2738,2788, + 2839,2889,2939,2989,3039,3090,3140,3190, + 3240,3291,3341,3391,3441,3491,3541,3592, + 3642,3692,3742,3792,3843,3893,3943,3993, + 4043,4093,4144,4194,4244,4294,4344,4394, + 4445,4495,4545,4595,4645,4695,4745,4796, + 4846,4896,4946,4996,5046,5096,5146,5197, + 5247,5297,5347,5397,5447,5497,5547,5597, + 5647,5697,5748,5798,5848,5898,5948,5998, + 6048,6098,6148,6198,6248,6298,6348,6398, + 6448,6498,6548,6598,6648,6698,6748,6798, + 6848,6898,6948,6998,7048,7098,7148,7198, + 7248,7298,7348,7398,7448,7498,7548,7598, + 7648,7697,7747,7797,7847,7897,7947,7997, + 8047,8097,8147,8196,8246,8296,8346,8396, + 8446,8496,8545,8595,8645,8695,8745,8794, + 8844,8894,8944,8994,9043,9093,9143,9193, + 9243,9292,9342,9392,9442,9491,9541,9591, + 9640,9690,9740,9790,9839,9889,9939,9988, + 10038,10088,10137,10187,10237,10286,10336,10386, + 10435,10485,10534,10584,10634,10683,10733,10782, + 10832,10882,10931,10981,11030,11080,11129,11179, + 11228,11278,11327,11377,11426,11476,11525,11575, + 11624,11674,11723,11773,11822,11872,11921,11970, + 12020,12069,12119,12168,12218,12267,12316,12366, + 12415,12464,12514,12563,12612,12662,12711,12760, + 12810,12859,12908,12957,13007,13056,13105,13154, + 13204,13253,13302,13351,13401,13450,13499,13548, + 13597,13647,13696,13745,13794,13843,13892,13941, + 13990,14040,14089,14138,14187,14236,14285,14334, + 14383,14432,14481,14530,14579,14628,14677,14726, + 14775,14824,14873,14922,14971,15020,15069,15118, + 15167,15215,15264,15313,15362,15411,15460,15509, + 15557,15606,15655,15704,15753,15802,15850,15899, + 15948,15997,16045,16094,16143,16191,16240,16289, + 16338,16386,16435,16484,16532,16581,16629,16678, + 16727,16775,16824,16872,16921,16970,17018,17067, + 17115,17164,17212,17261,17309,17358,17406,17455, + 17503,17551,17600,17648,17697,17745,17793,17842, + 17890,17939,17987,18035,18084,18132,18180,18228, + 18277,18325,18373,18421,18470,18518,18566,18614, + 18663,18711,18759,18807,18855,18903,18951,19000, + 19048,19096,19144,19192,19240,19288,19336,19384, + 19432,19480,19528,19576,19624,19672,19720,19768, + 19816,19864,19912,19959,20007,20055,20103,20151, + 20199,20246,20294,20342,20390,20438,20485,20533, + 20581,20629,20676,20724,20772,20819,20867,20915, + 20962,21010,21057,21105,21153,21200,21248,21295, + 21343,21390,21438,21485,21533,21580,21628,21675, + 21723,21770,21817,21865,21912,21960,22007,22054, + 22102,22149,22196,22243,22291,22338,22385,22433, + 22480,22527,22574,22621,22668,22716,22763,22810, + 22857,22904,22951,22998,23045,23092,23139,23186, + 23233,23280,23327,23374,23421,23468,23515,23562, + 23609,23656,23703,23750,23796,23843,23890,23937, + 23984,24030,24077,24124,24171,24217,24264,24311, + 24357,24404,24451,24497,24544,24591,24637,24684, + 24730,24777,24823,24870,24916,24963,25009,25056, + 25102,25149,25195,25241,25288,25334,25381,25427, + 25473,25520,25566,25612,25658,25705,25751,25797, + 25843,25889,25936,25982,26028,26074,26120,26166, + 26212,26258,26304,26350,26396,26442,26488,26534, + 26580,26626,26672,26718,26764,26810,26856,26902, + 26947,26993,27039,27085,27131,27176,27222,27268, + 27313,27359,27405,27450,27496,27542,27587,27633, + 27678,27724,27770,27815,27861,27906,27952,27997, + 28042,28088,28133,28179,28224,28269,28315,28360, + 28405,28451,28496,28541,28586,28632,28677,28722, + 28767,28812,28858,28903,28948,28993,29038,29083, + 29128,29173,29218,29263,29308,29353,29398,29443, + 29488,29533,29577,29622,29667,29712,29757,29801, + 29846,29891,29936,29980,30025,30070,30114,30159, + 30204,30248,30293,30337,30382,30426,30471,30515, + 30560,30604,30649,30693,30738,30782,30826,30871, + 30915,30959,31004,31048,31092,31136,31181,31225, + 31269,31313,31357,31402,31446,31490,31534,31578, + 31622,31666,31710,31754,31798,31842,31886,31930, + 31974,32017,32061,32105,32149,32193,32236,32280, + 32324,32368,32411,32455,32499,32542,32586,32630, + 32673,32717,32760,32804,32847,32891,32934,32978, + 33021,33065,33108,33151,33195,33238,33281,33325, + 33368,33411,33454,33498,33541,33584,33627,33670, + 33713,33756,33799,33843,33886,33929,33972,34015, + 34057,34100,34143,34186,34229,34272,34315,34358, + 34400,34443,34486,34529,34571,34614,34657,34699, + 34742,34785,34827,34870,34912,34955,34997,35040, + 35082,35125,35167,35210,35252,35294,35337,35379, + 35421,35464,35506,35548,35590,35633,35675,35717, + 35759,35801,35843,35885,35927,35969,36011,36053, + 36095,36137,36179,36221,36263,36305,36347,36388, + 36430,36472,36514,36555,36597,36639,36681,36722, + 36764,36805,36847,36889,36930,36972,37013,37055, + 37096,37137,37179,37220,37262,37303,37344,37386, + 37427,37468,37509,37551,37592,37633,37674,37715, + 37756,37797,37838,37879,37920,37961,38002,38043, + 38084,38125,38166,38207,38248,38288,38329,38370, + 38411,38451,38492,38533,38573,38614,38655,38695, + 38736,38776,38817,38857,38898,38938,38979,39019, + 39059,39100,39140,39180,39221,39261,39301,39341, + 39382,39422,39462,39502,39542,39582,39622,39662, + 39702,39742,39782,39822,39862,39902,39942,39982, + 40021,40061,40101,40141,40180,40220,40260,40300, + 40339,40379,40418,40458,40497,40537,40576,40616, + 40655,40695,40734,40773,40813,40852,40891,40931, + 40970,41009,41048,41087,41127,41166,41205,41244, + 41283,41322,41361,41400,41439,41478,41517,41556, + 41595,41633,41672,41711,41750,41788,41827,41866, + 41904,41943,41982,42020,42059,42097,42136,42174, + 42213,42251,42290,42328,42366,42405,42443,42481, + 42520,42558,42596,42634,42672,42711,42749,42787, + 42825,42863,42901,42939,42977,43015,43053,43091, + 43128,43166,43204,43242,43280,43317,43355,43393, + 43430,43468,43506,43543,43581,43618,43656,43693, + 43731,43768,43806,43843,43880,43918,43955,43992, + 44029,44067,44104,44141,44178,44215,44252,44289, + 44326,44363,44400,44437,44474,44511,44548,44585, + 44622,44659,44695,44732,44769,44806,44842,44879, + 44915,44952,44989,45025,45062,45098,45135,45171, + 45207,45244,45280,45316,45353,45389,45425,45462, + 45498,45534,45570,45606,45642,45678,45714,45750, + 45786,45822,45858,45894,45930,45966,46002,46037, + 46073,46109,46145,46180,46216,46252,46287,46323, + 46358,46394,46429,46465,46500,46536,46571,46606, + 46642,46677,46712,46747,46783,46818,46853,46888, + 46923,46958,46993,47028,47063,47098,47133,47168, + 47203,47238,47273,47308,47342,47377,47412,47446, + 47481,47516,47550,47585,47619,47654,47688,47723, + 47757,47792,47826,47860,47895,47929,47963,47998, + 48032,48066,48100,48134,48168,48202,48237,48271, + 48305,48338,48372,48406,48440,48474,48508,48542, + 48575,48609,48643,48676,48710,48744,48777,48811, + 48844,48878,48911,48945,48978,49012,49045,49078, + 49112,49145,49178,49211,49244,49278,49311,49344, + 49377,49410,49443,49476,49509,49542,49575,49608, + 49640,49673,49706,49739,49771,49804,49837,49869, + 49902,49935,49967,50000,50032,50065,50097,50129, + 50162,50194,50226,50259,50291,50323,50355,50387, + 50420,50452,50484,50516,50548,50580,50612,50644, + 50675,50707,50739,50771,50803,50834,50866,50898, + 50929,50961,50993,51024,51056,51087,51119,51150, + 51182,51213,51244,51276,51307,51338,51369,51401, + 51432,51463,51494,51525,51556,51587,51618,51649, + 51680,51711,51742,51773,51803,51834,51865,51896, + 51926,51957,51988,52018,52049,52079,52110,52140, + 52171,52201,52231,52262,52292,52322,52353,52383, + 52413,52443,52473,52503,52534,52564,52594,52624, + 52653,52683,52713,52743,52773,52803,52832,52862, + 52892,52922,52951,52981,53010,53040,53069,53099, + 53128,53158,53187,53216,53246,53275,53304,53334, + 53363,53392,53421,53450,53479,53508,53537,53566, + 53595,53624,53653,53682,53711,53739,53768,53797, + 53826,53854,53883,53911,53940,53969,53997,54026, + 54054,54082,54111,54139,54167,54196,54224,54252, + 54280,54308,54337,54365,54393,54421,54449,54477, + 54505,54533,54560,54588,54616,54644,54672,54699, + 54727,54755,54782,54810,54837,54865,54892,54920, + 54947,54974,55002,55029,55056,55084,55111,55138, + 55165,55192,55219,55246,55274,55300,55327,55354, + 55381,55408,55435,55462,55489,55515,55542,55569, + 55595,55622,55648,55675,55701,55728,55754,55781, + 55807,55833,55860,55886,55912,55938,55965,55991, + 56017,56043,56069,56095,56121,56147,56173,56199, + 56225,56250,56276,56302,56328,56353,56379,56404, + 56430,56456,56481,56507,56532,56557,56583,56608, + 56633,56659,56684,56709,56734,56760,56785,56810, + 56835,56860,56885,56910,56935,56959,56984,57009, + 57034,57059,57083,57108,57133,57157,57182,57206, + 57231,57255,57280,57304,57329,57353,57377,57402, + 57426,57450,57474,57498,57522,57546,57570,57594, + 57618,57642,57666,57690,57714,57738,57762,57785, + 57809,57833,57856,57880,57903,57927,57950,57974, + 57997,58021,58044,58067,58091,58114,58137,58160, + 58183,58207,58230,58253,58276,58299,58322,58345, + 58367,58390,58413,58436,58459,58481,58504,58527, + 58549,58572,58594,58617,58639,58662,58684,58706, + 58729,58751,58773,58795,58818,58840,58862,58884, + 58906,58928,58950,58972,58994,59016,59038,59059, + 59081,59103,59125,59146,59168,59190,59211,59233, + 59254,59276,59297,59318,59340,59361,59382,59404, + 59425,59446,59467,59488,59509,59530,59551,59572, + 59593,59614,59635,59656,59677,59697,59718,59739, + 59759,59780,59801,59821,59842,59862,59883,59903, + 59923,59944,59964,59984,60004,60025,60045,60065, + 60085,60105,60125,60145,60165,60185,60205,60225, + 60244,60264,60284,60304,60323,60343,60363,60382, + 60402,60421,60441,60460,60479,60499,60518,60537, + 60556,60576,60595,60614,60633,60652,60671,60690, + 60709,60728,60747,60766,60785,60803,60822,60841, + 60859,60878,60897,60915,60934,60952,60971,60989, + 61007,61026,61044,61062,61081,61099,61117,61135, + 61153,61171,61189,61207,61225,61243,61261,61279, + 61297,61314,61332,61350,61367,61385,61403,61420, + 61438,61455,61473,61490,61507,61525,61542,61559, + 61577,61594,61611,61628,61645,61662,61679,61696, + 61713,61730,61747,61764,61780,61797,61814,61831, + 61847,61864,61880,61897,61913,61930,61946,61963, + 61979,61995,62012,62028,62044,62060,62076,62092, + 62108,62125,62141,62156,62172,62188,62204,62220, + 62236,62251,62267,62283,62298,62314,62329,62345, + 62360,62376,62391,62407,62422,62437,62453,62468, + 62483,62498,62513,62528,62543,62558,62573,62588, + 62603,62618,62633,62648,62662,62677,62692,62706, + 62721,62735,62750,62764,62779,62793,62808,62822, + 62836,62850,62865,62879,62893,62907,62921,62935, + 62949,62963,62977,62991,63005,63019,63032,63046, + 63060,63074,63087,63101,63114,63128,63141,63155, + 63168,63182,63195,63208,63221,63235,63248,63261, + 63274,63287,63300,63313,63326,63339,63352,63365, + 63378,63390,63403,63416,63429,63441,63454,63466, + 63479,63491,63504,63516,63528,63541,63553,63565, + 63578,63590,63602,63614,63626,63638,63650,63662, + 63674,63686,63698,63709,63721,63733,63745,63756, + 63768,63779,63791,63803,63814,63825,63837,63848, + 63859,63871,63882,63893,63904,63915,63927,63938, + 63949,63960,63971,63981,63992,64003,64014,64025, + 64035,64046,64057,64067,64078,64088,64099,64109, + 64120,64130,64140,64151,64161,64171,64181,64192, + 64202,64212,64222,64232,64242,64252,64261,64271, + 64281,64291,64301,64310,64320,64330,64339,64349, + 64358,64368,64377,64387,64396,64405,64414,64424, + 64433,64442,64451,64460,64469,64478,64487,64496, + 64505,64514,64523,64532,64540,64549,64558,64566, + 64575,64584,64592,64601,64609,64617,64626,64634, + 64642,64651,64659,64667,64675,64683,64691,64699, + 64707,64715,64723,64731,64739,64747,64754,64762, + 64770,64777,64785,64793,64800,64808,64815,64822, + 64830,64837,64844,64852,64859,64866,64873,64880, + 64887,64895,64902,64908,64915,64922,64929,64936, + 64943,64949,64956,64963,64969,64976,64982,64989, + 64995,65002,65008,65015,65021,65027,65033,65040, + 65046,65052,65058,65064,65070,65076,65082,65088, + 65094,65099,65105,65111,65117,65122,65128,65133, + 65139,65144,65150,65155,65161,65166,65171,65177, + 65182,65187,65192,65197,65202,65207,65212,65217, + 65222,65227,65232,65237,65242,65246,65251,65256, + 65260,65265,65270,65274,65279,65283,65287,65292, + 65296,65300,65305,65309,65313,65317,65321,65325, + 65329,65333,65337,65341,65345,65349,65352,65356, + 65360,65363,65367,65371,65374,65378,65381,65385, + 65388,65391,65395,65398,65401,65404,65408,65411, + 65414,65417,65420,65423,65426,65429,65431,65434, + 65437,65440,65442,65445,65448,65450,65453,65455, + 65458,65460,65463,65465,65467,65470,65472,65474, + 65476,65478,65480,65482,65484,65486,65488,65490, + 65492,65494,65496,65497,65499,65501,65502,65504, + 65505,65507,65508,65510,65511,65513,65514,65515, + 65516,65518,65519,65520,65521,65522,65523,65524, + 65525,65526,65527,65527,65528,65529,65530,65530, + 65531,65531,65532,65532,65533,65533,65534,65534, + 65534,65535,65535,65535,65535,65535,65535,65535, + 65535,65535,65535,65535,65535,65535,65535,65534, + 65534,65534,65533,65533,65532,65532,65531,65531, + 65530,65530,65529,65528,65527,65527,65526,65525, + 65524,65523,65522,65521,65520,65519,65518,65516, + 65515,65514,65513,65511,65510,65508,65507,65505, + 65504,65502,65501,65499,65497,65496,65494,65492, + 65490,65488,65486,65484,65482,65480,65478,65476, + 65474,65472,65470,65467,65465,65463,65460,65458, + 65455,65453,65450,65448,65445,65442,65440,65437, + 65434,65431,65429,65426,65423,65420,65417,65414, + 65411,65408,65404,65401,65398,65395,65391,65388, + 65385,65381,65378,65374,65371,65367,65363,65360, + 65356,65352,65349,65345,65341,65337,65333,65329, + 65325,65321,65317,65313,65309,65305,65300,65296, + 65292,65287,65283,65279,65274,65270,65265,65260, + 65256,65251,65246,65242,65237,65232,65227,65222, + 65217,65212,65207,65202,65197,65192,65187,65182, + 65177,65171,65166,65161,65155,65150,65144,65139, + 65133,65128,65122,65117,65111,65105,65099,65094, + 65088,65082,65076,65070,65064,65058,65052,65046, + 65040,65033,65027,65021,65015,65008,65002,64995, + 64989,64982,64976,64969,64963,64956,64949,64943, + 64936,64929,64922,64915,64908,64902,64895,64887, + 64880,64873,64866,64859,64852,64844,64837,64830, + 64822,64815,64808,64800,64793,64785,64777,64770, + 64762,64754,64747,64739,64731,64723,64715,64707, + 64699,64691,64683,64675,64667,64659,64651,64642, + 64634,64626,64617,64609,64600,64592,64584,64575, + 64566,64558,64549,64540,64532,64523,64514,64505, + 64496,64487,64478,64469,64460,64451,64442,64433, + 64424,64414,64405,64396,64387,64377,64368,64358, + 64349,64339,64330,64320,64310,64301,64291,64281, + 64271,64261,64252,64242,64232,64222,64212,64202, + 64192,64181,64171,64161,64151,64140,64130,64120, + 64109,64099,64088,64078,64067,64057,64046,64035, + 64025,64014,64003,63992,63981,63971,63960,63949, + 63938,63927,63915,63904,63893,63882,63871,63859, + 63848,63837,63825,63814,63803,63791,63779,63768, + 63756,63745,63733,63721,63709,63698,63686,63674, + 63662,63650,63638,63626,63614,63602,63590,63578, + 63565,63553,63541,63528,63516,63504,63491,63479, + 63466,63454,63441,63429,63416,63403,63390,63378, + 63365,63352,63339,63326,63313,63300,63287,63274, + 63261,63248,63235,63221,63208,63195,63182,63168, + 63155,63141,63128,63114,63101,63087,63074,63060, + 63046,63032,63019,63005,62991,62977,62963,62949, + 62935,62921,62907,62893,62879,62865,62850,62836, + 62822,62808,62793,62779,62764,62750,62735,62721, + 62706,62692,62677,62662,62648,62633,62618,62603, + 62588,62573,62558,62543,62528,62513,62498,62483, + 62468,62453,62437,62422,62407,62391,62376,62360, + 62345,62329,62314,62298,62283,62267,62251,62236, + 62220,62204,62188,62172,62156,62141,62125,62108, + 62092,62076,62060,62044,62028,62012,61995,61979, + 61963,61946,61930,61913,61897,61880,61864,61847, + 61831,61814,61797,61780,61764,61747,61730,61713, + 61696,61679,61662,61645,61628,61611,61594,61577, + 61559,61542,61525,61507,61490,61473,61455,61438, + 61420,61403,61385,61367,61350,61332,61314,61297, + 61279,61261,61243,61225,61207,61189,61171,61153, + 61135,61117,61099,61081,61062,61044,61026,61007, + 60989,60971,60952,60934,60915,60897,60878,60859, + 60841,60822,60803,60785,60766,60747,60728,60709, + 60690,60671,60652,60633,60614,60595,60576,60556, + 60537,60518,60499,60479,60460,60441,60421,60402, + 60382,60363,60343,60323,60304,60284,60264,60244, + 60225,60205,60185,60165,60145,60125,60105,60085, + 60065,60045,60025,60004,59984,59964,59944,59923, + 59903,59883,59862,59842,59821,59801,59780,59759, + 59739,59718,59697,59677,59656,59635,59614,59593, + 59572,59551,59530,59509,59488,59467,59446,59425, + 59404,59382,59361,59340,59318,59297,59276,59254, + 59233,59211,59190,59168,59146,59125,59103,59081, + 59059,59038,59016,58994,58972,58950,58928,58906, + 58884,58862,58840,58818,58795,58773,58751,58729, + 58706,58684,58662,58639,58617,58594,58572,58549, + 58527,58504,58481,58459,58436,58413,58390,58367, + 58345,58322,58299,58276,58253,58230,58207,58183, + 58160,58137,58114,58091,58067,58044,58021,57997, + 57974,57950,57927,57903,57880,57856,57833,57809, + 57785,57762,57738,57714,57690,57666,57642,57618, + 57594,57570,57546,57522,57498,57474,57450,57426, + 57402,57377,57353,57329,57304,57280,57255,57231, + 57206,57182,57157,57133,57108,57083,57059,57034, + 57009,56984,56959,56935,56910,56885,56860,56835, + 56810,56785,56760,56734,56709,56684,56659,56633, + 56608,56583,56557,56532,56507,56481,56456,56430, + 56404,56379,56353,56328,56302,56276,56250,56225, + 56199,56173,56147,56121,56095,56069,56043,56017, + 55991,55965,55938,55912,55886,55860,55833,55807, + 55781,55754,55728,55701,55675,55648,55622,55595, + 55569,55542,55515,55489,55462,55435,55408,55381, + 55354,55327,55300,55274,55246,55219,55192,55165, + 55138,55111,55084,55056,55029,55002,54974,54947, + 54920,54892,54865,54837,54810,54782,54755,54727, + 54699,54672,54644,54616,54588,54560,54533,54505, + 54477,54449,54421,54393,54365,54337,54308,54280, + 54252,54224,54196,54167,54139,54111,54082,54054, + 54026,53997,53969,53940,53911,53883,53854,53826, + 53797,53768,53739,53711,53682,53653,53624,53595, + 53566,53537,53508,53479,53450,53421,53392,53363, + 53334,53304,53275,53246,53216,53187,53158,53128, + 53099,53069,53040,53010,52981,52951,52922,52892, + 52862,52832,52803,52773,52743,52713,52683,52653, + 52624,52594,52564,52534,52503,52473,52443,52413, + 52383,52353,52322,52292,52262,52231,52201,52171, + 52140,52110,52079,52049,52018,51988,51957,51926, + 51896,51865,51834,51803,51773,51742,51711,51680, + 51649,51618,51587,51556,51525,51494,51463,51432, + 51401,51369,51338,51307,51276,51244,51213,51182, + 51150,51119,51087,51056,51024,50993,50961,50929, + 50898,50866,50834,50803,50771,50739,50707,50675, + 50644,50612,50580,50548,50516,50484,50452,50420, + 50387,50355,50323,50291,50259,50226,50194,50162, + 50129,50097,50065,50032,50000,49967,49935,49902, + 49869,49837,49804,49771,49739,49706,49673,49640, + 49608,49575,49542,49509,49476,49443,49410,49377, + 49344,49311,49278,49244,49211,49178,49145,49112, + 49078,49045,49012,48978,48945,48911,48878,48844, + 48811,48777,48744,48710,48676,48643,48609,48575, + 48542,48508,48474,48440,48406,48372,48338,48304, + 48271,48237,48202,48168,48134,48100,48066,48032, + 47998,47963,47929,47895,47860,47826,47792,47757, + 47723,47688,47654,47619,47585,47550,47516,47481, + 47446,47412,47377,47342,47308,47273,47238,47203, + 47168,47133,47098,47063,47028,46993,46958,46923, + 46888,46853,46818,46783,46747,46712,46677,46642, + 46606,46571,46536,46500,46465,46429,46394,46358, + 46323,46287,46252,46216,46180,46145,46109,46073, + 46037,46002,45966,45930,45894,45858,45822,45786, + 45750,45714,45678,45642,45606,45570,45534,45498, + 45462,45425,45389,45353,45316,45280,45244,45207, + 45171,45135,45098,45062,45025,44989,44952,44915, + 44879,44842,44806,44769,44732,44695,44659,44622, + 44585,44548,44511,44474,44437,44400,44363,44326, + 44289,44252,44215,44178,44141,44104,44067,44029, + 43992,43955,43918,43880,43843,43806,43768,43731, + 43693,43656,43618,43581,43543,43506,43468,43430, + 43393,43355,43317,43280,43242,43204,43166,43128, + 43091,43053,43015,42977,42939,42901,42863,42825, + 42787,42749,42711,42672,42634,42596,42558,42520, + 42481,42443,42405,42366,42328,42290,42251,42213, + 42174,42136,42097,42059,42020,41982,41943,41904, + 41866,41827,41788,41750,41711,41672,41633,41595, + 41556,41517,41478,41439,41400,41361,41322,41283, + 41244,41205,41166,41127,41088,41048,41009,40970, + 40931,40891,40852,40813,40773,40734,40695,40655, + 40616,40576,40537,40497,40458,40418,40379,40339, + 40300,40260,40220,40180,40141,40101,40061,40021, + 39982,39942,39902,39862,39822,39782,39742,39702, + 39662,39622,39582,39542,39502,39462,39422,39382, + 39341,39301,39261,39221,39180,39140,39100,39059, + 39019,38979,38938,38898,38857,38817,38776,38736, + 38695,38655,38614,38573,38533,38492,38451,38411, + 38370,38329,38288,38248,38207,38166,38125,38084, + 38043,38002,37961,37920,37879,37838,37797,37756, + 37715,37674,37633,37592,37551,37509,37468,37427, + 37386,37344,37303,37262,37220,37179,37137,37096, + 37055,37013,36972,36930,36889,36847,36805,36764, + 36722,36681,36639,36597,36556,36514,36472,36430, + 36388,36347,36305,36263,36221,36179,36137,36095, + 36053,36011,35969,35927,35885,35843,35801,35759, + 35717,35675,35633,35590,35548,35506,35464,35421, + 35379,35337,35294,35252,35210,35167,35125,35082, + 35040,34997,34955,34912,34870,34827,34785,34742, + 34699,34657,34614,34571,34529,34486,34443,34400, + 34358,34315,34272,34229,34186,34143,34100,34057, + 34015,33972,33929,33886,33843,33799,33756,33713, + 33670,33627,33584,33541,33498,33454,33411,33368, + 33325,33281,33238,33195,33151,33108,33065,33021, + 32978,32934,32891,32847,32804,32760,32717,32673, + 32630,32586,32542,32499,32455,32411,32368,32324, + 32280,32236,32193,32149,32105,32061,32017,31974, + 31930,31886,31842,31798,31754,31710,31666,31622, + 31578,31534,31490,31446,31402,31357,31313,31269, + 31225,31181,31136,31092,31048,31004,30959,30915, + 30871,30826,30782,30738,30693,30649,30604,30560, + 30515,30471,30426,30382,30337,30293,30248,30204, + 30159,30114,30070,30025,29980,29936,29891,29846, + 29801,29757,29712,29667,29622,29577,29533,29488, + 29443,29398,29353,29308,29263,29218,29173,29128, + 29083,29038,28993,28948,28903,28858,28812,28767, + 28722,28677,28632,28586,28541,28496,28451,28405, + 28360,28315,28269,28224,28179,28133,28088,28042, + 27997,27952,27906,27861,27815,27770,27724,27678, + 27633,27587,27542,27496,27450,27405,27359,27313, + 27268,27222,27176,27131,27085,27039,26993,26947, + 26902,26856,26810,26764,26718,26672,26626,26580, + 26534,26488,26442,26396,26350,26304,26258,26212, + 26166,26120,26074,26028,25982,25936,25889,25843, + 25797,25751,25705,25658,25612,25566,25520,25473, + 25427,25381,25334,25288,25241,25195,25149,25102, + 25056,25009,24963,24916,24870,24823,24777,24730, + 24684,24637,24591,24544,24497,24451,24404,24357, + 24311,24264,24217,24171,24124,24077,24030,23984, + 23937,23890,23843,23796,23750,23703,23656,23609, + 23562,23515,23468,23421,23374,23327,23280,23233, + 23186,23139,23092,23045,22998,22951,22904,22857, + 22810,22763,22716,22668,22621,22574,22527,22480, + 22433,22385,22338,22291,22243,22196,22149,22102, + 22054,22007,21960,21912,21865,21817,21770,21723, + 21675,21628,21580,21533,21485,21438,21390,21343, + 21295,21248,21200,21153,21105,21057,21010,20962, + 20915,20867,20819,20772,20724,20676,20629,20581, + 20533,20485,20438,20390,20342,20294,20246,20199, + 20151,20103,20055,20007,19959,19912,19864,19816, + 19768,19720,19672,19624,19576,19528,19480,19432, + 19384,19336,19288,19240,19192,19144,19096,19048, + 19000,18951,18903,18855,18807,18759,18711,18663, + 18614,18566,18518,18470,18421,18373,18325,18277, + 18228,18180,18132,18084,18035,17987,17939,17890, + 17842,17793,17745,17697,17648,17600,17551,17503, + 17455,17406,17358,17309,17261,17212,17164,17115, + 17067,17018,16970,16921,16872,16824,16775,16727, + 16678,16629,16581,16532,16484,16435,16386,16338, + 16289,16240,16191,16143,16094,16045,15997,15948, + 15899,15850,15802,15753,15704,15655,15606,15557, + 15509,15460,15411,15362,15313,15264,15215,15167, + 15118,15069,15020,14971,14922,14873,14824,14775, + 14726,14677,14628,14579,14530,14481,14432,14383, + 14334,14285,14236,14187,14138,14089,14040,13990, + 13941,13892,13843,13794,13745,13696,13646,13597, + 13548,13499,13450,13401,13351,13302,13253,13204, + 13154,13105,13056,13007,12957,12908,12859,12810, + 12760,12711,12662,12612,12563,12514,12464,12415, + 12366,12316,12267,12218,12168,12119,12069,12020, + 11970,11921,11872,11822,11773,11723,11674,11624, + 11575,11525,11476,11426,11377,11327,11278,11228, + 11179,11129,11080,11030,10981,10931,10882,10832, + 10782,10733,10683,10634,10584,10534,10485,10435, + 10386,10336,10286,10237,10187,10137,10088,10038, + 9988,9939,9889,9839,9790,9740,9690,9640, + 9591,9541,9491,9442,9392,9342,9292,9243, + 9193,9143,9093,9043,8994,8944,8894,8844, + 8794,8745,8695,8645,8595,8545,8496,8446, + 8396,8346,8296,8246,8196,8147,8097,8047, + 7997,7947,7897,7847,7797,7747,7697,7648, + 7598,7548,7498,7448,7398,7348,7298,7248, + 7198,7148,7098,7048,6998,6948,6898,6848, + 6798,6748,6698,6648,6598,6548,6498,6448, + 6398,6348,6298,6248,6198,6148,6098,6048, + 5998,5948,5898,5848,5798,5748,5697,5647, + 5597,5547,5497,5447,5397,5347,5297,5247, + 5197,5146,5096,5046,4996,4946,4896,4846, + 4796,4745,4695,4645,4595,4545,4495,4445, + 4394,4344,4294,4244,4194,4144,4093,4043, + 3993,3943,3893,3843,3792,3742,3692,3642, + 3592,3541,3491,3441,3391,3341,3291,3240, + 3190,3140,3090,3039,2989,2939,2889,2839, + 2788,2738,2688,2638,2587,2537,2487,2437, + 2387,2336,2286,2236,2186,2135,2085,2035, + 1985,1934,1884,1834,1784,1733,1683,1633, + 1583,1532,1482,1432,1382,1331,1281,1231, + 1181,1130,1080,1030,980,929,879,829, + 779,728,678,628,578,527,477,427, + 376,326,276,226,175,125,75,25, + -25,-75,-125,-175,-226,-276,-326,-376, + -427,-477,-527,-578,-628,-678,-728,-779, + -829,-879,-929,-980,-1030,-1080,-1130,-1181, + -1231,-1281,-1331,-1382,-1432,-1482,-1532,-1583, + -1633,-1683,-1733,-1784,-1834,-1884,-1934,-1985, + -2035,-2085,-2135,-2186,-2236,-2286,-2336,-2387, + -2437,-2487,-2537,-2588,-2638,-2688,-2738,-2788, + -2839,-2889,-2939,-2989,-3039,-3090,-3140,-3190, + -3240,-3291,-3341,-3391,-3441,-3491,-3541,-3592, + -3642,-3692,-3742,-3792,-3843,-3893,-3943,-3993, + -4043,-4093,-4144,-4194,-4244,-4294,-4344,-4394, + -4445,-4495,-4545,-4595,-4645,-4695,-4745,-4796, + -4846,-4896,-4946,-4996,-5046,-5096,-5146,-5197, + -5247,-5297,-5347,-5397,-5447,-5497,-5547,-5597, + -5647,-5697,-5748,-5798,-5848,-5898,-5948,-5998, + -6048,-6098,-6148,-6198,-6248,-6298,-6348,-6398, + -6448,-6498,-6548,-6598,-6648,-6698,-6748,-6798, + -6848,-6898,-6948,-6998,-7048,-7098,-7148,-7198, + -7248,-7298,-7348,-7398,-7448,-7498,-7548,-7598, + -7648,-7697,-7747,-7797,-7847,-7897,-7947,-7997, + -8047,-8097,-8147,-8196,-8246,-8296,-8346,-8396, + -8446,-8496,-8545,-8595,-8645,-8695,-8745,-8794, + -8844,-8894,-8944,-8994,-9043,-9093,-9143,-9193, + -9243,-9292,-9342,-9392,-9442,-9491,-9541,-9591, + -9640,-9690,-9740,-9790,-9839,-9889,-9939,-9988, + -10038,-10088,-10137,-10187,-10237,-10286,-10336,-10386, + -10435,-10485,-10534,-10584,-10634,-10683,-10733,-10782, + -10832,-10882,-10931,-10981,-11030,-11080,-11129,-11179, + -11228,-11278,-11327,-11377,-11426,-11476,-11525,-11575, + -11624,-11674,-11723,-11773,-11822,-11872,-11921,-11970, + -12020,-12069,-12119,-12168,-12218,-12267,-12316,-12366, + -12415,-12464,-12514,-12563,-12612,-12662,-12711,-12760, + -12810,-12859,-12908,-12957,-13007,-13056,-13105,-13154, + -13204,-13253,-13302,-13351,-13401,-13450,-13499,-13548, + -13597,-13647,-13696,-13745,-13794,-13843,-13892,-13941, + -13990,-14040,-14089,-14138,-14187,-14236,-14285,-14334, + -14383,-14432,-14481,-14530,-14579,-14628,-14677,-14726, + -14775,-14824,-14873,-14922,-14971,-15020,-15069,-15118, + -15167,-15215,-15264,-15313,-15362,-15411,-15460,-15509, + -15557,-15606,-15655,-15704,-15753,-15802,-15850,-15899, + -15948,-15997,-16045,-16094,-16143,-16191,-16240,-16289, + -16338,-16386,-16435,-16484,-16532,-16581,-16629,-16678, + -16727,-16775,-16824,-16872,-16921,-16970,-17018,-17067, + -17115,-17164,-17212,-17261,-17309,-17358,-17406,-17455, + -17503,-17551,-17600,-17648,-17697,-17745,-17793,-17842, + -17890,-17939,-17987,-18035,-18084,-18132,-18180,-18228, + -18277,-18325,-18373,-18421,-18470,-18518,-18566,-18614, + -18663,-18711,-18759,-18807,-18855,-18903,-18951,-19000, + -19048,-19096,-19144,-19192,-19240,-19288,-19336,-19384, + -19432,-19480,-19528,-19576,-19624,-19672,-19720,-19768, + -19816,-19864,-19912,-19959,-20007,-20055,-20103,-20151, + -20199,-20246,-20294,-20342,-20390,-20438,-20485,-20533, + -20581,-20629,-20676,-20724,-20772,-20819,-20867,-20915, + -20962,-21010,-21057,-21105,-21153,-21200,-21248,-21295, + -21343,-21390,-21438,-21485,-21533,-21580,-21628,-21675, + -21723,-21770,-21817,-21865,-21912,-21960,-22007,-22054, + -22102,-22149,-22196,-22243,-22291,-22338,-22385,-22433, + -22480,-22527,-22574,-22621,-22668,-22716,-22763,-22810, + -22857,-22904,-22951,-22998,-23045,-23092,-23139,-23186, + -23233,-23280,-23327,-23374,-23421,-23468,-23515,-23562, + -23609,-23656,-23703,-23750,-23796,-23843,-23890,-23937, + -23984,-24030,-24077,-24124,-24171,-24217,-24264,-24311, + -24357,-24404,-24451,-24497,-24544,-24591,-24637,-24684, + -24730,-24777,-24823,-24870,-24916,-24963,-25009,-25056, + -25102,-25149,-25195,-25241,-25288,-25334,-25381,-25427, + -25473,-25520,-25566,-25612,-25658,-25705,-25751,-25797, + -25843,-25889,-25936,-25982,-26028,-26074,-26120,-26166, + -26212,-26258,-26304,-26350,-26396,-26442,-26488,-26534, + -26580,-26626,-26672,-26718,-26764,-26810,-26856,-26902, + -26947,-26993,-27039,-27085,-27131,-27176,-27222,-27268, + -27313,-27359,-27405,-27450,-27496,-27542,-27587,-27633, + -27678,-27724,-27770,-27815,-27861,-27906,-27952,-27997, + -28042,-28088,-28133,-28179,-28224,-28269,-28315,-28360, + -28405,-28451,-28496,-28541,-28586,-28632,-28677,-28722, + -28767,-28812,-28858,-28903,-28948,-28993,-29038,-29083, + -29128,-29173,-29218,-29263,-29308,-29353,-29398,-29443, + -29488,-29533,-29577,-29622,-29667,-29712,-29757,-29801, + -29846,-29891,-29936,-29980,-30025,-30070,-30114,-30159, + -30204,-30248,-30293,-30337,-30382,-30426,-30471,-30515, + -30560,-30604,-30649,-30693,-30738,-30782,-30826,-30871, + -30915,-30959,-31004,-31048,-31092,-31136,-31181,-31225, + -31269,-31313,-31357,-31402,-31446,-31490,-31534,-31578, + -31622,-31666,-31710,-31754,-31798,-31842,-31886,-31930, + -31974,-32017,-32061,-32105,-32149,-32193,-32236,-32280, + -32324,-32368,-32411,-32455,-32499,-32542,-32586,-32630, + -32673,-32717,-32760,-32804,-32847,-32891,-32934,-32978, + -33021,-33065,-33108,-33151,-33195,-33238,-33281,-33325, + -33368,-33411,-33454,-33498,-33541,-33584,-33627,-33670, + -33713,-33756,-33799,-33843,-33886,-33929,-33972,-34015, + -34057,-34100,-34143,-34186,-34229,-34272,-34315,-34358, + -34400,-34443,-34486,-34529,-34571,-34614,-34657,-34699, + -34742,-34785,-34827,-34870,-34912,-34955,-34997,-35040, + -35082,-35125,-35167,-35210,-35252,-35294,-35337,-35379, + -35421,-35464,-35506,-35548,-35590,-35633,-35675,-35717, + -35759,-35801,-35843,-35885,-35927,-35969,-36011,-36053, + -36095,-36137,-36179,-36221,-36263,-36305,-36347,-36388, + -36430,-36472,-36514,-36555,-36597,-36639,-36681,-36722, + -36764,-36805,-36847,-36889,-36930,-36972,-37013,-37055, + -37096,-37137,-37179,-37220,-37262,-37303,-37344,-37386, + -37427,-37468,-37509,-37551,-37592,-37633,-37674,-37715, + -37756,-37797,-37838,-37879,-37920,-37961,-38002,-38043, + -38084,-38125,-38166,-38207,-38248,-38288,-38329,-38370, + -38411,-38451,-38492,-38533,-38573,-38614,-38655,-38695, + -38736,-38776,-38817,-38857,-38898,-38938,-38979,-39019, + -39059,-39100,-39140,-39180,-39221,-39261,-39301,-39341, + -39382,-39422,-39462,-39502,-39542,-39582,-39622,-39662, + -39702,-39742,-39782,-39822,-39862,-39902,-39942,-39982, + -40021,-40061,-40101,-40141,-40180,-40220,-40260,-40299, + -40339,-40379,-40418,-40458,-40497,-40537,-40576,-40616, + -40655,-40695,-40734,-40773,-40813,-40852,-40891,-40931, + -40970,-41009,-41048,-41087,-41127,-41166,-41205,-41244, + -41283,-41322,-41361,-41400,-41439,-41478,-41517,-41556, + -41595,-41633,-41672,-41711,-41750,-41788,-41827,-41866, + -41904,-41943,-41982,-42020,-42059,-42097,-42136,-42174, + -42213,-42251,-42290,-42328,-42366,-42405,-42443,-42481, + -42520,-42558,-42596,-42634,-42672,-42711,-42749,-42787, + -42825,-42863,-42901,-42939,-42977,-43015,-43053,-43091, + -43128,-43166,-43204,-43242,-43280,-43317,-43355,-43393, + -43430,-43468,-43506,-43543,-43581,-43618,-43656,-43693, + -43731,-43768,-43806,-43843,-43880,-43918,-43955,-43992, + -44029,-44067,-44104,-44141,-44178,-44215,-44252,-44289, + -44326,-44363,-44400,-44437,-44474,-44511,-44548,-44585, + -44622,-44659,-44695,-44732,-44769,-44806,-44842,-44879, + -44915,-44952,-44989,-45025,-45062,-45098,-45135,-45171, + -45207,-45244,-45280,-45316,-45353,-45389,-45425,-45462, + -45498,-45534,-45570,-45606,-45642,-45678,-45714,-45750, + -45786,-45822,-45858,-45894,-45930,-45966,-46002,-46037, + -46073,-46109,-46145,-46180,-46216,-46252,-46287,-46323, + -46358,-46394,-46429,-46465,-46500,-46536,-46571,-46606, + -46642,-46677,-46712,-46747,-46783,-46818,-46853,-46888, + -46923,-46958,-46993,-47028,-47063,-47098,-47133,-47168, + -47203,-47238,-47273,-47308,-47342,-47377,-47412,-47446, + -47481,-47516,-47550,-47585,-47619,-47654,-47688,-47723, + -47757,-47792,-47826,-47860,-47895,-47929,-47963,-47998, + -48032,-48066,-48100,-48134,-48168,-48202,-48236,-48271, + -48304,-48338,-48372,-48406,-48440,-48474,-48508,-48542, + -48575,-48609,-48643,-48676,-48710,-48744,-48777,-48811, + -48844,-48878,-48911,-48945,-48978,-49012,-49045,-49078, + -49112,-49145,-49178,-49211,-49244,-49278,-49311,-49344, + -49377,-49410,-49443,-49476,-49509,-49542,-49575,-49608, + -49640,-49673,-49706,-49739,-49771,-49804,-49837,-49869, + -49902,-49935,-49967,-50000,-50032,-50065,-50097,-50129, + -50162,-50194,-50226,-50259,-50291,-50323,-50355,-50387, + -50420,-50452,-50484,-50516,-50548,-50580,-50612,-50644, + -50675,-50707,-50739,-50771,-50803,-50834,-50866,-50898, + -50929,-50961,-50993,-51024,-51056,-51087,-51119,-51150, + -51182,-51213,-51244,-51276,-51307,-51338,-51369,-51401, + -51432,-51463,-51494,-51525,-51556,-51587,-51618,-51649, + -51680,-51711,-51742,-51773,-51803,-51834,-51865,-51896, + -51926,-51957,-51988,-52018,-52049,-52079,-52110,-52140, + -52171,-52201,-52231,-52262,-52292,-52322,-52353,-52383, + -52413,-52443,-52473,-52503,-52534,-52564,-52594,-52624, + -52653,-52683,-52713,-52743,-52773,-52803,-52832,-52862, + -52892,-52922,-52951,-52981,-53010,-53040,-53069,-53099, + -53128,-53158,-53187,-53216,-53246,-53275,-53304,-53334, + -53363,-53392,-53421,-53450,-53479,-53508,-53537,-53566, + -53595,-53624,-53653,-53682,-53711,-53739,-53768,-53797, + -53826,-53854,-53883,-53911,-53940,-53969,-53997,-54026, + -54054,-54082,-54111,-54139,-54167,-54196,-54224,-54252, + -54280,-54308,-54337,-54365,-54393,-54421,-54449,-54477, + -54505,-54533,-54560,-54588,-54616,-54644,-54672,-54699, + -54727,-54755,-54782,-54810,-54837,-54865,-54892,-54920, + -54947,-54974,-55002,-55029,-55056,-55084,-55111,-55138, + -55165,-55192,-55219,-55246,-55274,-55300,-55327,-55354, + -55381,-55408,-55435,-55462,-55489,-55515,-55542,-55569, + -55595,-55622,-55648,-55675,-55701,-55728,-55754,-55781, + -55807,-55833,-55860,-55886,-55912,-55938,-55965,-55991, + -56017,-56043,-56069,-56095,-56121,-56147,-56173,-56199, + -56225,-56250,-56276,-56302,-56328,-56353,-56379,-56404, + -56430,-56456,-56481,-56507,-56532,-56557,-56583,-56608, + -56633,-56659,-56684,-56709,-56734,-56760,-56785,-56810, + -56835,-56860,-56885,-56910,-56935,-56959,-56984,-57009, + -57034,-57059,-57083,-57108,-57133,-57157,-57182,-57206, + -57231,-57255,-57280,-57304,-57329,-57353,-57377,-57402, + -57426,-57450,-57474,-57498,-57522,-57546,-57570,-57594, + -57618,-57642,-57666,-57690,-57714,-57738,-57762,-57785, + -57809,-57833,-57856,-57880,-57903,-57927,-57950,-57974, + -57997,-58021,-58044,-58067,-58091,-58114,-58137,-58160, + -58183,-58207,-58230,-58253,-58276,-58299,-58322,-58345, + -58367,-58390,-58413,-58436,-58459,-58481,-58504,-58527, + -58549,-58572,-58594,-58617,-58639,-58662,-58684,-58706, + -58729,-58751,-58773,-58795,-58818,-58840,-58862,-58884, + -58906,-58928,-58950,-58972,-58994,-59016,-59038,-59059, + -59081,-59103,-59125,-59146,-59168,-59190,-59211,-59233, + -59254,-59276,-59297,-59318,-59340,-59361,-59382,-59404, + -59425,-59446,-59467,-59488,-59509,-59530,-59551,-59572, + -59593,-59614,-59635,-59656,-59677,-59697,-59718,-59739, + -59759,-59780,-59801,-59821,-59842,-59862,-59883,-59903, + -59923,-59944,-59964,-59984,-60004,-60025,-60045,-60065, + -60085,-60105,-60125,-60145,-60165,-60185,-60205,-60225, + -60244,-60264,-60284,-60304,-60323,-60343,-60363,-60382, + -60402,-60421,-60441,-60460,-60479,-60499,-60518,-60537, + -60556,-60576,-60595,-60614,-60633,-60652,-60671,-60690, + -60709,-60728,-60747,-60766,-60785,-60803,-60822,-60841, + -60859,-60878,-60897,-60915,-60934,-60952,-60971,-60989, + -61007,-61026,-61044,-61062,-61081,-61099,-61117,-61135, + -61153,-61171,-61189,-61207,-61225,-61243,-61261,-61279, + -61297,-61314,-61332,-61350,-61367,-61385,-61403,-61420, + -61438,-61455,-61473,-61490,-61507,-61525,-61542,-61559, + -61577,-61594,-61611,-61628,-61645,-61662,-61679,-61696, + -61713,-61730,-61747,-61764,-61780,-61797,-61814,-61831, + -61847,-61864,-61880,-61897,-61913,-61930,-61946,-61963, + -61979,-61995,-62012,-62028,-62044,-62060,-62076,-62092, + -62108,-62125,-62141,-62156,-62172,-62188,-62204,-62220, + -62236,-62251,-62267,-62283,-62298,-62314,-62329,-62345, + -62360,-62376,-62391,-62407,-62422,-62437,-62453,-62468, + -62483,-62498,-62513,-62528,-62543,-62558,-62573,-62588, + -62603,-62618,-62633,-62648,-62662,-62677,-62692,-62706, + -62721,-62735,-62750,-62764,-62779,-62793,-62808,-62822, + -62836,-62850,-62865,-62879,-62893,-62907,-62921,-62935, + -62949,-62963,-62977,-62991,-63005,-63019,-63032,-63046, + -63060,-63074,-63087,-63101,-63114,-63128,-63141,-63155, + -63168,-63182,-63195,-63208,-63221,-63235,-63248,-63261, + -63274,-63287,-63300,-63313,-63326,-63339,-63352,-63365, + -63378,-63390,-63403,-63416,-63429,-63441,-63454,-63466, + -63479,-63491,-63504,-63516,-63528,-63541,-63553,-63565, + -63578,-63590,-63602,-63614,-63626,-63638,-63650,-63662, + -63674,-63686,-63698,-63709,-63721,-63733,-63745,-63756, + -63768,-63779,-63791,-63803,-63814,-63825,-63837,-63848, + -63859,-63871,-63882,-63893,-63904,-63915,-63927,-63938, + -63949,-63960,-63971,-63981,-63992,-64003,-64014,-64025, + -64035,-64046,-64057,-64067,-64078,-64088,-64099,-64109, + -64120,-64130,-64140,-64151,-64161,-64171,-64181,-64192, + -64202,-64212,-64222,-64232,-64242,-64252,-64261,-64271, + -64281,-64291,-64301,-64310,-64320,-64330,-64339,-64349, + -64358,-64368,-64377,-64387,-64396,-64405,-64414,-64424, + -64433,-64442,-64451,-64460,-64469,-64478,-64487,-64496, + -64505,-64514,-64523,-64532,-64540,-64549,-64558,-64566, + -64575,-64584,-64592,-64601,-64609,-64617,-64626,-64634, + -64642,-64651,-64659,-64667,-64675,-64683,-64691,-64699, + -64707,-64715,-64723,-64731,-64739,-64747,-64754,-64762, + -64770,-64777,-64785,-64793,-64800,-64808,-64815,-64822, + -64830,-64837,-64844,-64852,-64859,-64866,-64873,-64880, + -64887,-64895,-64902,-64908,-64915,-64922,-64929,-64936, + -64943,-64949,-64956,-64963,-64969,-64976,-64982,-64989, + -64995,-65002,-65008,-65015,-65021,-65027,-65033,-65040, + -65046,-65052,-65058,-65064,-65070,-65076,-65082,-65088, + -65094,-65099,-65105,-65111,-65117,-65122,-65128,-65133, + -65139,-65144,-65150,-65155,-65161,-65166,-65171,-65177, + -65182,-65187,-65192,-65197,-65202,-65207,-65212,-65217, + -65222,-65227,-65232,-65237,-65242,-65246,-65251,-65256, + -65260,-65265,-65270,-65274,-65279,-65283,-65287,-65292, + -65296,-65300,-65305,-65309,-65313,-65317,-65321,-65325, + -65329,-65333,-65337,-65341,-65345,-65349,-65352,-65356, + -65360,-65363,-65367,-65371,-65374,-65378,-65381,-65385, + -65388,-65391,-65395,-65398,-65401,-65404,-65408,-65411, + -65414,-65417,-65420,-65423,-65426,-65429,-65431,-65434, + -65437,-65440,-65442,-65445,-65448,-65450,-65453,-65455, + -65458,-65460,-65463,-65465,-65467,-65470,-65472,-65474, + -65476,-65478,-65480,-65482,-65484,-65486,-65488,-65490, + -65492,-65494,-65496,-65497,-65499,-65501,-65502,-65504, + -65505,-65507,-65508,-65510,-65511,-65513,-65514,-65515, + -65516,-65518,-65519,-65520,-65521,-65522,-65523,-65524, + -65525,-65526,-65527,-65527,-65528,-65529,-65530,-65530, + -65531,-65531,-65532,-65532,-65533,-65533,-65534,-65534, + -65534,-65535,-65535,-65535,-65535,-65535,-65535,-65535, + -65535,-65535,-65535,-65535,-65535,-65535,-65535,-65534, + -65534,-65534,-65533,-65533,-65532,-65532,-65531,-65531, + -65530,-65530,-65529,-65528,-65527,-65527,-65526,-65525, + -65524,-65523,-65522,-65521,-65520,-65519,-65518,-65516, + -65515,-65514,-65513,-65511,-65510,-65508,-65507,-65505, + -65504,-65502,-65501,-65499,-65497,-65496,-65494,-65492, + -65490,-65488,-65486,-65484,-65482,-65480,-65478,-65476, + -65474,-65472,-65470,-65467,-65465,-65463,-65460,-65458, + -65455,-65453,-65450,-65448,-65445,-65442,-65440,-65437, + -65434,-65431,-65429,-65426,-65423,-65420,-65417,-65414, + -65411,-65408,-65404,-65401,-65398,-65395,-65391,-65388, + -65385,-65381,-65378,-65374,-65371,-65367,-65363,-65360, + -65356,-65352,-65349,-65345,-65341,-65337,-65333,-65329, + -65325,-65321,-65317,-65313,-65309,-65305,-65300,-65296, + -65292,-65287,-65283,-65279,-65274,-65270,-65265,-65260, + -65256,-65251,-65246,-65242,-65237,-65232,-65227,-65222, + -65217,-65212,-65207,-65202,-65197,-65192,-65187,-65182, + -65177,-65171,-65166,-65161,-65155,-65150,-65144,-65139, + -65133,-65128,-65122,-65117,-65111,-65105,-65099,-65094, + -65088,-65082,-65076,-65070,-65064,-65058,-65052,-65046, + -65040,-65033,-65027,-65021,-65015,-65008,-65002,-64995, + -64989,-64982,-64976,-64969,-64963,-64956,-64949,-64943, + -64936,-64929,-64922,-64915,-64908,-64902,-64895,-64887, + -64880,-64873,-64866,-64859,-64852,-64844,-64837,-64830, + -64822,-64815,-64808,-64800,-64793,-64785,-64777,-64770, + -64762,-64754,-64747,-64739,-64731,-64723,-64715,-64707, + -64699,-64691,-64683,-64675,-64667,-64659,-64651,-64642, + -64634,-64626,-64617,-64609,-64601,-64592,-64584,-64575, + -64566,-64558,-64549,-64540,-64532,-64523,-64514,-64505, + -64496,-64487,-64478,-64469,-64460,-64451,-64442,-64433, + -64424,-64414,-64405,-64396,-64387,-64377,-64368,-64358, + -64349,-64339,-64330,-64320,-64310,-64301,-64291,-64281, + -64271,-64261,-64252,-64242,-64232,-64222,-64212,-64202, + -64192,-64181,-64171,-64161,-64151,-64140,-64130,-64120, + -64109,-64099,-64088,-64078,-64067,-64057,-64046,-64035, + -64025,-64014,-64003,-63992,-63981,-63971,-63960,-63949, + -63938,-63927,-63915,-63904,-63893,-63882,-63871,-63859, + -63848,-63837,-63825,-63814,-63803,-63791,-63779,-63768, + -63756,-63745,-63733,-63721,-63709,-63698,-63686,-63674, + -63662,-63650,-63638,-63626,-63614,-63602,-63590,-63578, + -63565,-63553,-63541,-63528,-63516,-63504,-63491,-63479, + -63466,-63454,-63441,-63429,-63416,-63403,-63390,-63378, + -63365,-63352,-63339,-63326,-63313,-63300,-63287,-63274, + -63261,-63248,-63235,-63221,-63208,-63195,-63182,-63168, + -63155,-63141,-63128,-63114,-63101,-63087,-63074,-63060, + -63046,-63032,-63019,-63005,-62991,-62977,-62963,-62949, + -62935,-62921,-62907,-62893,-62879,-62865,-62850,-62836, + -62822,-62808,-62793,-62779,-62764,-62750,-62735,-62721, + -62706,-62692,-62677,-62662,-62648,-62633,-62618,-62603, + -62588,-62573,-62558,-62543,-62528,-62513,-62498,-62483, + -62468,-62453,-62437,-62422,-62407,-62391,-62376,-62360, + -62345,-62329,-62314,-62298,-62283,-62267,-62251,-62236, + -62220,-62204,-62188,-62172,-62156,-62141,-62125,-62108, + -62092,-62076,-62060,-62044,-62028,-62012,-61995,-61979, + -61963,-61946,-61930,-61913,-61897,-61880,-61864,-61847, + -61831,-61814,-61797,-61780,-61764,-61747,-61730,-61713, + -61696,-61679,-61662,-61645,-61628,-61611,-61594,-61577, + -61559,-61542,-61525,-61507,-61490,-61473,-61455,-61438, + -61420,-61403,-61385,-61367,-61350,-61332,-61314,-61297, + -61279,-61261,-61243,-61225,-61207,-61189,-61171,-61153, + -61135,-61117,-61099,-61081,-61062,-61044,-61026,-61007, + -60989,-60971,-60952,-60934,-60915,-60897,-60878,-60859, + -60841,-60822,-60803,-60785,-60766,-60747,-60728,-60709, + -60690,-60671,-60652,-60633,-60614,-60595,-60576,-60556, + -60537,-60518,-60499,-60479,-60460,-60441,-60421,-60402, + -60382,-60363,-60343,-60323,-60304,-60284,-60264,-60244, + -60225,-60205,-60185,-60165,-60145,-60125,-60105,-60085, + -60065,-60045,-60025,-60004,-59984,-59964,-59944,-59923, + -59903,-59883,-59862,-59842,-59821,-59801,-59780,-59759, + -59739,-59718,-59697,-59677,-59656,-59635,-59614,-59593, + -59572,-59551,-59530,-59509,-59488,-59467,-59446,-59425, + -59404,-59382,-59361,-59340,-59318,-59297,-59276,-59254, + -59233,-59211,-59189,-59168,-59146,-59125,-59103,-59081, + -59059,-59038,-59016,-58994,-58972,-58950,-58928,-58906, + -58884,-58862,-58840,-58818,-58795,-58773,-58751,-58729, + -58706,-58684,-58662,-58639,-58617,-58594,-58572,-58549, + -58527,-58504,-58481,-58459,-58436,-58413,-58390,-58367, + -58345,-58322,-58299,-58276,-58253,-58230,-58207,-58183, + -58160,-58137,-58114,-58091,-58067,-58044,-58021,-57997, + -57974,-57950,-57927,-57903,-57880,-57856,-57833,-57809, + -57785,-57762,-57738,-57714,-57690,-57666,-57642,-57618, + -57594,-57570,-57546,-57522,-57498,-57474,-57450,-57426, + -57402,-57377,-57353,-57329,-57304,-57280,-57255,-57231, + -57206,-57182,-57157,-57133,-57108,-57083,-57059,-57034, + -57009,-56984,-56959,-56935,-56910,-56885,-56860,-56835, + -56810,-56785,-56760,-56734,-56709,-56684,-56659,-56633, + -56608,-56583,-56557,-56532,-56507,-56481,-56456,-56430, + -56404,-56379,-56353,-56328,-56302,-56276,-56250,-56225, + -56199,-56173,-56147,-56121,-56095,-56069,-56043,-56017, + -55991,-55965,-55938,-55912,-55886,-55860,-55833,-55807, + -55781,-55754,-55728,-55701,-55675,-55648,-55622,-55595, + -55569,-55542,-55515,-55489,-55462,-55435,-55408,-55381, + -55354,-55327,-55300,-55274,-55246,-55219,-55192,-55165, + -55138,-55111,-55084,-55056,-55029,-55002,-54974,-54947, + -54920,-54892,-54865,-54837,-54810,-54782,-54755,-54727, + -54699,-54672,-54644,-54616,-54588,-54560,-54533,-54505, + -54477,-54449,-54421,-54393,-54365,-54337,-54308,-54280, + -54252,-54224,-54196,-54167,-54139,-54111,-54082,-54054, + -54026,-53997,-53969,-53940,-53911,-53883,-53854,-53826, + -53797,-53768,-53739,-53711,-53682,-53653,-53624,-53595, + -53566,-53537,-53508,-53479,-53450,-53421,-53392,-53363, + -53334,-53304,-53275,-53246,-53216,-53187,-53158,-53128, + -53099,-53069,-53040,-53010,-52981,-52951,-52922,-52892, + -52862,-52832,-52803,-52773,-52743,-52713,-52683,-52653, + -52624,-52594,-52564,-52534,-52503,-52473,-52443,-52413, + -52383,-52353,-52322,-52292,-52262,-52231,-52201,-52171, + -52140,-52110,-52079,-52049,-52018,-51988,-51957,-51926, + -51896,-51865,-51834,-51803,-51773,-51742,-51711,-51680, + -51649,-51618,-51587,-51556,-51525,-51494,-51463,-51432, + -51401,-51369,-51338,-51307,-51276,-51244,-51213,-51182, + -51150,-51119,-51087,-51056,-51024,-50993,-50961,-50929, + -50898,-50866,-50834,-50803,-50771,-50739,-50707,-50675, + -50644,-50612,-50580,-50548,-50516,-50484,-50452,-50420, + -50387,-50355,-50323,-50291,-50259,-50226,-50194,-50162, + -50129,-50097,-50065,-50032,-50000,-49967,-49935,-49902, + -49869,-49837,-49804,-49771,-49739,-49706,-49673,-49640, + -49608,-49575,-49542,-49509,-49476,-49443,-49410,-49377, + -49344,-49311,-49278,-49244,-49211,-49178,-49145,-49112, + -49078,-49045,-49012,-48978,-48945,-48911,-48878,-48844, + -48811,-48777,-48744,-48710,-48676,-48643,-48609,-48575, + -48542,-48508,-48474,-48440,-48406,-48372,-48338,-48305, + -48271,-48237,-48202,-48168,-48134,-48100,-48066,-48032, + -47998,-47963,-47929,-47895,-47860,-47826,-47792,-47757, + -47723,-47688,-47654,-47619,-47585,-47550,-47516,-47481, + -47446,-47412,-47377,-47342,-47307,-47273,-47238,-47203, + -47168,-47133,-47098,-47063,-47028,-46993,-46958,-46923, + -46888,-46853,-46818,-46783,-46747,-46712,-46677,-46642, + -46606,-46571,-46536,-46500,-46465,-46429,-46394,-46358, + -46323,-46287,-46251,-46216,-46180,-46145,-46109,-46073, + -46037,-46002,-45966,-45930,-45894,-45858,-45822,-45786, + -45750,-45714,-45678,-45642,-45606,-45570,-45534,-45498, + -45462,-45425,-45389,-45353,-45316,-45280,-45244,-45207, + -45171,-45135,-45098,-45062,-45025,-44989,-44952,-44915, + -44879,-44842,-44806,-44769,-44732,-44695,-44659,-44622, + -44585,-44548,-44511,-44474,-44437,-44400,-44363,-44326, + -44289,-44252,-44215,-44178,-44141,-44104,-44067,-44029, + -43992,-43955,-43918,-43880,-43843,-43806,-43768,-43731, + -43693,-43656,-43618,-43581,-43543,-43506,-43468,-43430, + -43393,-43355,-43317,-43280,-43242,-43204,-43166,-43128, + -43091,-43053,-43015,-42977,-42939,-42901,-42863,-42825, + -42787,-42749,-42711,-42672,-42634,-42596,-42558,-42520, + -42481,-42443,-42405,-42366,-42328,-42290,-42251,-42213, + -42174,-42136,-42097,-42059,-42020,-41982,-41943,-41904, + -41866,-41827,-41788,-41750,-41711,-41672,-41633,-41595, + -41556,-41517,-41478,-41439,-41400,-41361,-41322,-41283, + -41244,-41205,-41166,-41127,-41087,-41048,-41009,-40970, + -40931,-40891,-40852,-40813,-40773,-40734,-40695,-40655, + -40616,-40576,-40537,-40497,-40458,-40418,-40379,-40339, + -40299,-40260,-40220,-40180,-40141,-40101,-40061,-40021, + -39982,-39942,-39902,-39862,-39822,-39782,-39742,-39702, + -39662,-39622,-39582,-39542,-39502,-39462,-39422,-39382, + -39341,-39301,-39261,-39221,-39180,-39140,-39100,-39059, + -39019,-38979,-38938,-38898,-38857,-38817,-38776,-38736, + -38695,-38655,-38614,-38573,-38533,-38492,-38451,-38411, + -38370,-38329,-38288,-38248,-38207,-38166,-38125,-38084, + -38043,-38002,-37961,-37920,-37879,-37838,-37797,-37756, + -37715,-37674,-37633,-37592,-37550,-37509,-37468,-37427, + -37386,-37344,-37303,-37262,-37220,-37179,-37137,-37096, + -37055,-37013,-36972,-36930,-36889,-36847,-36805,-36764, + -36722,-36681,-36639,-36597,-36556,-36514,-36472,-36430, + -36388,-36347,-36305,-36263,-36221,-36179,-36137,-36095, + -36053,-36011,-35969,-35927,-35885,-35843,-35801,-35759, + -35717,-35675,-35633,-35590,-35548,-35506,-35464,-35421, + -35379,-35337,-35294,-35252,-35210,-35167,-35125,-35082, + -35040,-34997,-34955,-34912,-34870,-34827,-34785,-34742, + -34699,-34657,-34614,-34571,-34529,-34486,-34443,-34400, + -34358,-34315,-34272,-34229,-34186,-34143,-34100,-34057, + -34015,-33972,-33929,-33886,-33843,-33799,-33756,-33713, + -33670,-33627,-33584,-33541,-33498,-33454,-33411,-33368, + -33325,-33281,-33238,-33195,-33151,-33108,-33065,-33021, + -32978,-32934,-32891,-32847,-32804,-32760,-32717,-32673, + -32630,-32586,-32542,-32499,-32455,-32411,-32368,-32324, + -32280,-32236,-32193,-32149,-32105,-32061,-32017,-31974, + -31930,-31886,-31842,-31798,-31754,-31710,-31666,-31622, + -31578,-31534,-31490,-31446,-31402,-31357,-31313,-31269, + -31225,-31181,-31136,-31092,-31048,-31004,-30959,-30915, + -30871,-30826,-30782,-30738,-30693,-30649,-30604,-30560, + -30515,-30471,-30426,-30382,-30337,-30293,-30248,-30204, + -30159,-30114,-30070,-30025,-29980,-29936,-29891,-29846, + -29801,-29757,-29712,-29667,-29622,-29577,-29533,-29488, + -29443,-29398,-29353,-29308,-29263,-29218,-29173,-29128, + -29083,-29038,-28993,-28948,-28903,-28858,-28812,-28767, + -28722,-28677,-28632,-28586,-28541,-28496,-28451,-28405, + -28360,-28315,-28269,-28224,-28179,-28133,-28088,-28042, + -27997,-27952,-27906,-27861,-27815,-27770,-27724,-27678, + -27633,-27587,-27542,-27496,-27450,-27405,-27359,-27313, + -27268,-27222,-27176,-27131,-27085,-27039,-26993,-26947, + -26902,-26856,-26810,-26764,-26718,-26672,-26626,-26580, + -26534,-26488,-26442,-26396,-26350,-26304,-26258,-26212, + -26166,-26120,-26074,-26028,-25982,-25936,-25889,-25843, + -25797,-25751,-25705,-25658,-25612,-25566,-25520,-25473, + -25427,-25381,-25334,-25288,-25241,-25195,-25149,-25102, + -25056,-25009,-24963,-24916,-24870,-24823,-24777,-24730, + -24684,-24637,-24591,-24544,-24497,-24451,-24404,-24357, + -24311,-24264,-24217,-24171,-24124,-24077,-24030,-23984, + -23937,-23890,-23843,-23796,-23750,-23703,-23656,-23609, + -23562,-23515,-23468,-23421,-23374,-23327,-23280,-23233, + -23186,-23139,-23092,-23045,-22998,-22951,-22904,-22857, + -22810,-22763,-22716,-22668,-22621,-22574,-22527,-22480, + -22432,-22385,-22338,-22291,-22243,-22196,-22149,-22102, + -22054,-22007,-21960,-21912,-21865,-21817,-21770,-21723, + -21675,-21628,-21580,-21533,-21485,-21438,-21390,-21343, + -21295,-21248,-21200,-21153,-21105,-21057,-21010,-20962, + -20915,-20867,-20819,-20772,-20724,-20676,-20629,-20581, + -20533,-20485,-20438,-20390,-20342,-20294,-20246,-20199, + -20151,-20103,-20055,-20007,-19959,-19912,-19864,-19816, + -19768,-19720,-19672,-19624,-19576,-19528,-19480,-19432, + -19384,-19336,-19288,-19240,-19192,-19144,-19096,-19048, + -19000,-18951,-18903,-18855,-18807,-18759,-18711,-18663, + -18614,-18566,-18518,-18470,-18421,-18373,-18325,-18277, + -18228,-18180,-18132,-18084,-18035,-17987,-17939,-17890, + -17842,-17793,-17745,-17697,-17648,-17600,-17551,-17503, + -17455,-17406,-17358,-17309,-17261,-17212,-17164,-17115, + -17067,-17018,-16970,-16921,-16872,-16824,-16775,-16727, + -16678,-16629,-16581,-16532,-16484,-16435,-16386,-16338, + -16289,-16240,-16191,-16143,-16094,-16045,-15997,-15948, + -15899,-15850,-15802,-15753,-15704,-15655,-15606,-15557, + -15509,-15460,-15411,-15362,-15313,-15264,-15215,-15167, + -15118,-15069,-15020,-14971,-14922,-14873,-14824,-14775, + -14726,-14677,-14628,-14579,-14530,-14481,-14432,-14383, + -14334,-14285,-14236,-14187,-14138,-14089,-14040,-13990, + -13941,-13892,-13843,-13794,-13745,-13696,-13647,-13597, + -13548,-13499,-13450,-13401,-13351,-13302,-13253,-13204, + -13154,-13105,-13056,-13007,-12957,-12908,-12859,-12810, + -12760,-12711,-12662,-12612,-12563,-12514,-12464,-12415, + -12366,-12316,-12267,-12217,-12168,-12119,-12069,-12020, + -11970,-11921,-11872,-11822,-11773,-11723,-11674,-11624, + -11575,-11525,-11476,-11426,-11377,-11327,-11278,-11228, + -11179,-11129,-11080,-11030,-10981,-10931,-10882,-10832, + -10782,-10733,-10683,-10634,-10584,-10534,-10485,-10435, + -10386,-10336,-10286,-10237,-10187,-10137,-10088,-10038, + -9988,-9939,-9889,-9839,-9790,-9740,-9690,-9640, + -9591,-9541,-9491,-9442,-9392,-9342,-9292,-9243, + -9193,-9143,-9093,-9043,-8994,-8944,-8894,-8844, + -8794,-8745,-8695,-8645,-8595,-8545,-8496,-8446, + -8396,-8346,-8296,-8246,-8196,-8147,-8097,-8047, + -7997,-7947,-7897,-7847,-7797,-7747,-7697,-7648, + -7598,-7548,-7498,-7448,-7398,-7348,-7298,-7248, + -7198,-7148,-7098,-7048,-6998,-6948,-6898,-6848, + -6798,-6748,-6698,-6648,-6598,-6548,-6498,-6448, + -6398,-6348,-6298,-6248,-6198,-6148,-6098,-6048, + -5998,-5948,-5898,-5848,-5798,-5747,-5697,-5647, + -5597,-5547,-5497,-5447,-5397,-5347,-5297,-5247, + -5197,-5146,-5096,-5046,-4996,-4946,-4896,-4846, + -4796,-4745,-4695,-4645,-4595,-4545,-4495,-4445, + -4394,-4344,-4294,-4244,-4194,-4144,-4093,-4043, + -3993,-3943,-3893,-3843,-3792,-3742,-3692,-3642, + -3592,-3541,-3491,-3441,-3391,-3341,-3291,-3240, + -3190,-3140,-3090,-3039,-2989,-2939,-2889,-2839, + -2788,-2738,-2688,-2638,-2588,-2537,-2487,-2437, + -2387,-2336,-2286,-2236,-2186,-2135,-2085,-2035, + -1985,-1934,-1884,-1834,-1784,-1733,-1683,-1633, + -1583,-1532,-1482,-1432,-1382,-1331,-1281,-1231, + -1181,-1130,-1080,-1030,-980,-929,-879,-829, + -779,-728,-678,-628,-578,-527,-477,-427, + -376,-326,-276,-226,-175,-125,-75,-25, + 25,75,125,175,226,276,326,376, + 427,477,527,578,628,678,728,779, + 829,879,929,980,1030,1080,1130,1181, + 1231,1281,1331,1382,1432,1482,1532,1583, + 1633,1683,1733,1784,1834,1884,1934,1985, + 2035,2085,2135,2186,2236,2286,2336,2387, + 2437,2487,2537,2587,2638,2688,2738,2788, + 2839,2889,2939,2989,3039,3090,3140,3190, + 3240,3291,3341,3391,3441,3491,3542,3592, + 3642,3692,3742,3792,3843,3893,3943,3993, + 4043,4093,4144,4194,4244,4294,4344,4394, + 4445,4495,4545,4595,4645,4695,4745,4796, + 4846,4896,4946,4996,5046,5096,5146,5197, + 5247,5297,5347,5397,5447,5497,5547,5597, + 5647,5697,5747,5798,5848,5898,5948,5998, + 6048,6098,6148,6198,6248,6298,6348,6398, + 6448,6498,6548,6598,6648,6698,6748,6798, + 6848,6898,6948,6998,7048,7098,7148,7198, + 7248,7298,7348,7398,7448,7498,7548,7598, + 7648,7697,7747,7797,7847,7897,7947,7997, + 8047,8097,8147,8196,8246,8296,8346,8396, + 8446,8496,8545,8595,8645,8695,8745,8794, + 8844,8894,8944,8994,9043,9093,9143,9193, + 9243,9292,9342,9392,9442,9491,9541,9591, + 9640,9690,9740,9790,9839,9889,9939,9988, + 10038,10088,10137,10187,10237,10286,10336,10386, + 10435,10485,10534,10584,10634,10683,10733,10782, + 10832,10882,10931,10981,11030,11080,11129,11179, + 11228,11278,11327,11377,11426,11476,11525,11575, + 11624,11674,11723,11773,11822,11872,11921,11970, + 12020,12069,12119,12168,12218,12267,12316,12366, + 12415,12464,12514,12563,12612,12662,12711,12760, + 12810,12859,12908,12957,13007,13056,13105,13154, + 13204,13253,13302,13351,13401,13450,13499,13548, + 13597,13647,13696,13745,13794,13843,13892,13941, + 13990,14040,14089,14138,14187,14236,14285,14334, + 14383,14432,14481,14530,14579,14628,14677,14726, + 14775,14824,14873,14922,14971,15020,15069,15118, + 15167,15215,15264,15313,15362,15411,15460,15509, + 15557,15606,15655,15704,15753,15802,15850,15899, + 15948,15997,16045,16094,16143,16191,16240,16289, + 16338,16386,16435,16484,16532,16581,16629,16678, + 16727,16775,16824,16872,16921,16970,17018,17067, + 17115,17164,17212,17261,17309,17358,17406,17455, + 17503,17551,17600,17648,17697,17745,17793,17842, + 17890,17939,17987,18035,18084,18132,18180,18228, + 18277,18325,18373,18421,18470,18518,18566,18614, + 18663,18711,18759,18807,18855,18903,18951,19000, + 19048,19096,19144,19192,19240,19288,19336,19384, + 19432,19480,19528,19576,19624,19672,19720,19768, + 19816,19864,19912,19959,20007,20055,20103,20151, + 20199,20246,20294,20342,20390,20438,20485,20533, + 20581,20629,20676,20724,20772,20819,20867,20915, + 20962,21010,21057,21105,21153,21200,21248,21295, + 21343,21390,21438,21485,21533,21580,21628,21675, + 21723,21770,21817,21865,21912,21960,22007,22054, + 22102,22149,22196,22243,22291,22338,22385,22432, + 22480,22527,22574,22621,22668,22716,22763,22810, + 22857,22904,22951,22998,23045,23092,23139,23186, + 23233,23280,23327,23374,23421,23468,23515,23562, + 23609,23656,23703,23750,23796,23843,23890,23937, + 23984,24030,24077,24124,24171,24217,24264,24311, + 24357,24404,24451,24497,24544,24591,24637,24684, + 24730,24777,24823,24870,24916,24963,25009,25056, + 25102,25149,25195,25241,25288,25334,25381,25427, + 25473,25520,25566,25612,25658,25705,25751,25797, + 25843,25889,25936,25982,26028,26074,26120,26166, + 26212,26258,26304,26350,26396,26442,26488,26534, + 26580,26626,26672,26718,26764,26810,26856,26902, + 26947,26993,27039,27085,27131,27176,27222,27268, + 27313,27359,27405,27450,27496,27542,27587,27633, + 27678,27724,27770,27815,27861,27906,27952,27997, + 28042,28088,28133,28179,28224,28269,28315,28360, + 28405,28451,28496,28541,28586,28632,28677,28722, + 28767,28812,28858,28903,28948,28993,29038,29083, + 29128,29173,29218,29263,29308,29353,29398,29443, + 29488,29533,29577,29622,29667,29712,29757,29801, + 29846,29891,29936,29980,30025,30070,30114,30159, + 30204,30248,30293,30337,30382,30427,30471,30516, + 30560,30604,30649,30693,30738,30782,30826,30871, + 30915,30959,31004,31048,31092,31136,31181,31225, + 31269,31313,31357,31402,31446,31490,31534,31578, + 31622,31666,31710,31754,31798,31842,31886,31930, + 31974,32017,32061,32105,32149,32193,32236,32280, + 32324,32368,32411,32455,32499,32542,32586,32630, + 32673,32717,32760,32804,32847,32891,32934,32978, + 33021,33065,33108,33151,33195,33238,33281,33325, + 33368,33411,33454,33498,33541,33584,33627,33670, + 33713,33756,33799,33843,33886,33929,33972,34015, + 34057,34100,34143,34186,34229,34272,34315,34358, + 34400,34443,34486,34529,34571,34614,34657,34699, + 34742,34785,34827,34870,34912,34955,34997,35040, + 35082,35125,35167,35210,35252,35294,35337,35379, + 35421,35464,35506,35548,35590,35633,35675,35717, + 35759,35801,35843,35885,35927,35969,36011,36053, + 36095,36137,36179,36221,36263,36305,36347,36388, + 36430,36472,36514,36556,36597,36639,36681,36722, + 36764,36805,36847,36889,36930,36972,37013,37055, + 37096,37137,37179,37220,37262,37303,37344,37386, + 37427,37468,37509,37551,37592,37633,37674,37715, + 37756,37797,37838,37879,37920,37961,38002,38043, + 38084,38125,38166,38207,38248,38288,38329,38370, + 38411,38451,38492,38533,38573,38614,38655,38695, + 38736,38776,38817,38857,38898,38938,38979,39019, + 39059,39100,39140,39180,39221,39261,39301,39341, + 39382,39422,39462,39502,39542,39582,39622,39662, + 39702,39742,39782,39822,39862,39902,39942,39982, + 40021,40061,40101,40141,40180,40220,40260,40299, + 40339,40379,40418,40458,40497,40537,40576,40616, + 40655,40695,40734,40773,40813,40852,40891,40931, + 40970,41009,41048,41087,41127,41166,41205,41244, + 41283,41322,41361,41400,41439,41478,41517,41556, + 41595,41633,41672,41711,41750,41788,41827,41866, + 41904,41943,41982,42020,42059,42097,42136,42174, + 42213,42251,42290,42328,42366,42405,42443,42481, + 42520,42558,42596,42634,42672,42711,42749,42787, + 42825,42863,42901,42939,42977,43015,43053,43091, + 43128,43166,43204,43242,43280,43317,43355,43393, + 43430,43468,43506,43543,43581,43618,43656,43693, + 43731,43768,43806,43843,43880,43918,43955,43992, + 44029,44067,44104,44141,44178,44215,44252,44289, + 44326,44363,44400,44437,44474,44511,44548,44585, + 44622,44659,44695,44732,44769,44806,44842,44879, + 44915,44952,44989,45025,45062,45098,45135,45171, + 45207,45244,45280,45316,45353,45389,45425,45462, + 45498,45534,45570,45606,45642,45678,45714,45750, + 45786,45822,45858,45894,45930,45966,46002,46037, + 46073,46109,46145,46180,46216,46252,46287,46323, + 46358,46394,46429,46465,46500,46536,46571,46606, + 46642,46677,46712,46747,46783,46818,46853,46888, + 46923,46958,46993,47028,47063,47098,47133,47168, + 47203,47238,47273,47308,47342,47377,47412,47446, + 47481,47516,47550,47585,47619,47654,47688,47723, + 47757,47792,47826,47861,47895,47929,47963,47998, + 48032,48066,48100,48134,48168,48202,48237,48271, + 48305,48338,48372,48406,48440,48474,48508,48542, + 48575,48609,48643,48676,48710,48744,48777,48811, + 48844,48878,48911,48945,48978,49012,49045,49078, + 49112,49145,49178,49211,49244,49278,49311,49344, + 49377,49410,49443,49476,49509,49542,49575,49608, + 49640,49673,49706,49739,49771,49804,49837,49869, + 49902,49935,49967,50000,50032,50064,50097,50129, + 50162,50194,50226,50259,50291,50323,50355,50387, + 50420,50452,50484,50516,50548,50580,50612,50644, + 50675,50707,50739,50771,50803,50834,50866,50898, + 50929,50961,50993,51024,51056,51087,51119,51150, + 51182,51213,51244,51276,51307,51338,51369,51401, + 51432,51463,51494,51525,51556,51587,51618,51649, + 51680,51711,51742,51773,51803,51834,51865,51896, + 51926,51957,51988,52018,52049,52079,52110,52140, + 52171,52201,52231,52262,52292,52322,52353,52383, + 52413,52443,52473,52503,52534,52564,52594,52624, + 52653,52683,52713,52743,52773,52803,52832,52862, + 52892,52922,52951,52981,53010,53040,53069,53099, + 53128,53158,53187,53216,53246,53275,53304,53334, + 53363,53392,53421,53450,53479,53508,53537,53566, + 53595,53624,53653,53682,53711,53739,53768,53797, + 53826,53854,53883,53912,53940,53969,53997,54026, + 54054,54082,54111,54139,54167,54196,54224,54252, + 54280,54309,54337,54365,54393,54421,54449,54477, + 54505,54533,54560,54588,54616,54644,54672,54699, + 54727,54755,54782,54810,54837,54865,54892,54920, + 54947,54974,55002,55029,55056,55084,55111,55138, + 55165,55192,55219,55246,55274,55300,55327,55354, + 55381,55408,55435,55462,55489,55515,55542,55569, + 55595,55622,55648,55675,55701,55728,55754,55781, + 55807,55833,55860,55886,55912,55938,55965,55991, + 56017,56043,56069,56095,56121,56147,56173,56199, + 56225,56250,56276,56302,56328,56353,56379,56404, + 56430,56456,56481,56507,56532,56557,56583,56608, + 56633,56659,56684,56709,56734,56760,56785,56810, + 56835,56860,56885,56910,56935,56959,56984,57009, + 57034,57059,57083,57108,57133,57157,57182,57206, + 57231,57255,57280,57304,57329,57353,57377,57402, + 57426,57450,57474,57498,57522,57546,57570,57594, + 57618,57642,57666,57690,57714,57738,57762,57785, + 57809,57833,57856,57880,57903,57927,57950,57974, + 57997,58021,58044,58067,58091,58114,58137,58160, + 58183,58207,58230,58253,58276,58299,58322,58345, + 58367,58390,58413,58436,58459,58481,58504,58527, + 58549,58572,58594,58617,58639,58662,58684,58706, + 58729,58751,58773,58795,58818,58840,58862,58884, + 58906,58928,58950,58972,58994,59016,59038,59059, + 59081,59103,59125,59146,59168,59190,59211,59233, + 59254,59276,59297,59318,59340,59361,59382,59404, + 59425,59446,59467,59488,59509,59530,59551,59572, + 59593,59614,59635,59656,59677,59697,59718,59739, + 59759,59780,59801,59821,59842,59862,59883,59903, + 59923,59944,59964,59984,60004,60025,60045,60065, + 60085,60105,60125,60145,60165,60185,60205,60225, + 60244,60264,60284,60304,60323,60343,60363,60382, + 60402,60421,60441,60460,60479,60499,60518,60537, + 60556,60576,60595,60614,60633,60652,60671,60690, + 60709,60728,60747,60766,60785,60803,60822,60841, + 60859,60878,60897,60915,60934,60952,60971,60989, + 61007,61026,61044,61062,61081,61099,61117,61135, + 61153,61171,61189,61207,61225,61243,61261,61279, + 61297,61314,61332,61350,61367,61385,61403,61420, + 61438,61455,61473,61490,61507,61525,61542,61559, + 61577,61594,61611,61628,61645,61662,61679,61696, + 61713,61730,61747,61764,61780,61797,61814,61831, + 61847,61864,61880,61897,61913,61930,61946,61963, + 61979,61995,62012,62028,62044,62060,62076,62092, + 62108,62125,62141,62156,62172,62188,62204,62220, + 62236,62251,62267,62283,62298,62314,62329,62345, + 62360,62376,62391,62407,62422,62437,62453,62468, + 62483,62498,62513,62528,62543,62558,62573,62588, + 62603,62618,62633,62648,62662,62677,62692,62706, + 62721,62735,62750,62764,62779,62793,62808,62822, + 62836,62850,62865,62879,62893,62907,62921,62935, + 62949,62963,62977,62991,63005,63019,63032,63046, + 63060,63074,63087,63101,63114,63128,63141,63155, + 63168,63182,63195,63208,63221,63235,63248,63261, + 63274,63287,63300,63313,63326,63339,63352,63365, + 63378,63390,63403,63416,63429,63441,63454,63466, + 63479,63491,63504,63516,63528,63541,63553,63565, + 63578,63590,63602,63614,63626,63638,63650,63662, + 63674,63686,63698,63709,63721,63733,63745,63756, + 63768,63779,63791,63803,63814,63825,63837,63848, + 63859,63871,63882,63893,63904,63915,63927,63938, + 63949,63960,63971,63981,63992,64003,64014,64025, + 64035,64046,64057,64067,64078,64088,64099,64109, + 64120,64130,64140,64151,64161,64171,64181,64192, + 64202,64212,64222,64232,64242,64252,64261,64271, + 64281,64291,64301,64310,64320,64330,64339,64349, + 64358,64368,64377,64387,64396,64405,64414,64424, + 64433,64442,64451,64460,64469,64478,64487,64496, + 64505,64514,64523,64532,64540,64549,64558,64566, + 64575,64584,64592,64600,64609,64617,64626,64634, + 64642,64651,64659,64667,64675,64683,64691,64699, + 64707,64715,64723,64731,64739,64747,64754,64762, + 64770,64777,64785,64793,64800,64808,64815,64822, + 64830,64837,64844,64852,64859,64866,64873,64880, + 64887,64895,64902,64908,64915,64922,64929,64936, + 64943,64949,64956,64963,64969,64976,64982,64989, + 64995,65002,65008,65015,65021,65027,65033,65040, + 65046,65052,65058,65064,65070,65076,65082,65088, + 65094,65099,65105,65111,65117,65122,65128,65133, + 65139,65144,65150,65155,65161,65166,65171,65177, + 65182,65187,65192,65197,65202,65207,65212,65217, + 65222,65227,65232,65237,65242,65246,65251,65256, + 65260,65265,65270,65274,65279,65283,65287,65292, + 65296,65300,65305,65309,65313,65317,65321,65325, + 65329,65333,65337,65341,65345,65349,65352,65356, + 65360,65363,65367,65371,65374,65378,65381,65385, + 65388,65391,65395,65398,65401,65404,65408,65411, + 65414,65417,65420,65423,65426,65429,65431,65434, + 65437,65440,65442,65445,65448,65450,65453,65455, + 65458,65460,65463,65465,65467,65470,65472,65474, + 65476,65478,65480,65482,65484,65486,65488,65490, + 65492,65494,65496,65497,65499,65501,65502,65504, + 65505,65507,65508,65510,65511,65513,65514,65515, + 65516,65518,65519,65520,65521,65522,65523,65524, + 65525,65526,65527,65527,65528,65529,65530,65530, + 65531,65531,65532,65532,65533,65533,65534,65534, + 65534,65535,65535,65535,65535,65535,65535,65535 +}; + +const fixed_t *finecosine = &finesine[FINEANGLES/4]; + +const angle_t tantoangle[2049] = +{ + 0,333772,667544,1001315,1335086,1668857,2002626,2336395, + 2670163,3003929,3337694,3671457,4005219,4338979,4672736,5006492, + 5340245,5673995,6007743,6341488,6675230,7008968,7342704,7676435, + 8010164,8343888,8677609,9011325,9345037,9678744,10012447,10346145, + 10679838,11013526,11347209,11680887,12014558,12348225,12681885,13015539, + 13349187,13682829,14016464,14350092,14683714,15017328,15350936,15684536, + 16018129,16351714,16685291,17018860,17352422,17685974,18019518,18353054, + 18686582,19020100,19353610,19687110,20020600,20354080,20687552,21021014, + 21354466,21687906,22021338,22354758,22688168,23021568,23354956,23688332, + 24021698,24355052,24688396,25021726,25355046,25688352,26021648,26354930, + 26688200,27021456,27354702,27687932,28021150,28354356,28687548,29020724, + 29353888,29687038,30020174,30353296,30686404,31019496,31352574,31685636, + 32018684,32351718,32684734,33017736,33350722,33683692,34016648,34349584, + 34682508,35015412,35348300,35681172,36014028,36346868,36679688,37012492, + 37345276,37678044,38010792,38343524,38676240,39008936,39341612,39674272, + 40006912,40339532,40672132,41004716,41337276,41669820,42002344,42334848, + 42667332,42999796,43332236,43664660,43997060,44329444,44661800,44994140, + 45326456,45658752,45991028,46323280,46655512,46987720,47319908,47652072, + 47984212,48316332,48648428,48980500,49312548,49644576,49976580,50308556, + 50640512,50972444,51304352,51636236,51968096,52299928,52631740,52963524, + 53295284,53627020,53958728,54290412,54622068,54953704,55285308,55616888, + 55948444,56279972,56611472,56942948,57274396,57605816,57937212,58268576, + 58599916,58931228,59262512,59593768,59924992,60256192,60587364,60918508, + 61249620,61580704,61911760,62242788,62573788,62904756,63235692,63566604, + 63897480,64228332,64559148,64889940,65220696,65551424,65882120,66212788, + 66543420,66874024,67204600,67535136,67865648,68196120,68526568,68856984, + 69187360,69517712,69848024,70178304,70508560,70838776,71168960,71499112, + 71829224,72159312,72489360,72819376,73149360,73479304,73809216,74139096, + 74468936,74798744,75128520,75458264,75787968,76117632,76447264,76776864, + 77106424,77435952,77765440,78094888,78424304,78753688,79083032,79412336, + 79741608,80070840,80400032,80729192,81058312,81387392,81716432,82045440, + 82374408,82703336,83032224,83361080,83689896,84018664,84347400,84676096, + 85004760,85333376,85661952,85990488,86318984,86647448,86975864,87304240, + 87632576,87960872,88289128,88617344,88945520,89273648,89601736,89929792, + 90257792,90585760,90913688,91241568,91569408,91897200,92224960,92552672, + 92880336,93207968,93535552,93863088,94190584,94518040,94845448,95172816, + 95500136,95827416,96154648,96481832,96808976,97136080,97463136,97790144, + 98117112,98444032,98770904,99097736,99424520,99751256,100077944,100404592, + 100731192,101057744,101384248,101710712,102037128,102363488,102689808,103016080, + 103342312,103668488,103994616,104320696,104646736,104972720,105298656,105624552, + 105950392,106276184,106601928,106927624,107253272,107578872,107904416,108229920, + 108555368,108880768,109206120,109531416,109856664,110181872,110507016,110832120, + 111157168,111482168,111807112,112132008,112456856,112781648,113106392,113431080, + 113755720,114080312,114404848,114729328,115053760,115378136,115702464,116026744, + 116350960,116675128,116999248,117323312,117647320,117971272,118295176,118619024, + 118942816,119266560,119590248,119913880,120237456,120560984,120884456,121207864, + 121531224,121854528,122177784,122500976,122824112,123147200,123470224,123793200, + 124116120,124438976,124761784,125084528,125407224,125729856,126052432,126374960, + 126697424,127019832,127342184,127664472,127986712,128308888,128631008,128953072, + 129275080,129597024,129918912,130240744,130562520,130884232,131205888,131527480, + 131849016,132170496,132491912,132813272,133134576,133455816,133776992,134098120, + 134419184,134740176,135061120,135382000,135702816,136023584,136344272,136664912, + 136985488,137306016,137626464,137946864,138267184,138587456,138907664,139227808, + 139547904,139867920,140187888,140507776,140827616,141147392,141467104,141786752, + 142106336,142425856,142745312,143064720,143384048,143703312,144022512,144341664, + 144660736,144979744,145298704,145617584,145936400,146255168,146573856,146892480, + 147211040,147529536,147847968,148166336,148484640,148802880,149121056,149439152, + 149757200,150075168,150393072,150710912,151028688,151346400,151664048,151981616, + 152299136,152616576,152933952,153251264,153568496,153885680,154202784,154519824, + 154836784,155153696,155470528,155787296,156104000,156420624,156737200,157053696, + 157370112,157686480,158002768,158318976,158635136,158951216,159267232,159583168, + 159899040,160214848,160530592,160846256,161161840,161477376,161792832,162108208, + 162423520,162738768,163053952,163369040,163684080,163999040,164313936,164628752, + 164943504,165258176,165572784,165887312,166201776,166516160,166830480,167144736, + 167458912,167773008,168087040,168400992,168714880,169028688,169342432,169656096, + 169969696,170283216,170596672,170910032,171223344,171536576,171849728,172162800, + 172475808,172788736,173101600,173414384,173727104,174039728,174352288,174664784, + 174977200,175289536,175601792,175913984,176226096,176538144,176850096,177161984, + 177473792,177785536,178097200,178408784,178720288,179031728,179343088,179654368, + 179965568,180276704,180587744,180898720,181209616,181520448,181831184,182141856, + 182452448,182762960,183073408,183383760,183694048,184004240,184314368,184624416, + 184934400,185244288,185554096,185863840,186173504,186483072,186792576,187102000, + 187411344,187720608,188029808,188338912,188647936,188956896,189265760,189574560, + 189883264,190191904,190500448,190808928,191117312,191425632,191733872,192042016, + 192350096,192658096,192966000,193273840,193581584,193889264,194196848,194504352, + 194811792,195119136,195426400,195733584,196040688,196347712,196654656,196961520, + 197268304,197574992,197881616,198188144,198494592,198800960,199107248,199413456, + 199719584,200025616,200331584,200637456,200943248,201248960,201554576,201860128, + 202165584,202470960,202776256,203081456,203386592,203691632,203996592,204301472, + 204606256,204910976,205215600,205520144,205824592,206128960,206433248,206737456, + 207041584,207345616,207649568,207953424,208257216,208560912,208864512,209168048, + 209471488,209774832,210078112,210381296,210684384,210987408,211290336,211593184, + 211895936,212198608,212501184,212803680,213106096,213408432,213710672,214012816, + 214314880,214616864,214918768,215220576,215522288,215823920,216125472,216426928, + 216728304,217029584,217330784,217631904,217932928,218233856,218534704,218835472, + 219136144,219436720,219737216,220037632,220337952,220638192,220938336,221238384, + 221538352,221838240,222138032,222437728,222737344,223036880,223336304,223635664, + 223934912,224234096,224533168,224832160,225131072,225429872,225728608,226027232, + 226325776,226624240,226922608,227220880,227519056,227817152,228115168,228413088, + 228710912,229008640,229306288,229603840,229901312,230198688,230495968,230793152, + 231090256,231387280,231684192,231981024,232277760,232574416,232870960,233167440, + 233463808,233760096,234056288,234352384,234648384,234944304,235240128,235535872, + 235831504,236127056,236422512,236717888,237013152,237308336,237603424,237898416, + 238193328,238488144,238782864,239077488,239372016,239666464,239960816,240255072, + 240549232,240843312,241137280,241431168,241724960,242018656,242312256,242605776, + 242899200,243192512,243485744,243778896,244071936,244364880,244657744,244950496, + 245243168,245535744,245828224,246120608,246412912,246705104,246997216,247289216, + 247581136,247872960,248164688,248456320,248747856,249039296,249330640,249621904, + 249913056,250204128,250495088,250785968,251076736,251367424,251658016,251948512, + 252238912,252529200,252819408,253109520,253399536,253689456,253979280,254269008, + 254558640,254848176,255137632,255426976,255716224,256005376,256294432,256583392, + 256872256,257161024,257449696,257738272,258026752,258315136,258603424,258891600, + 259179696,259467696,259755600,260043392,260331104,260618704,260906224,261193632, + 261480960,261768176,262055296,262342320,262629248,262916080,263202816,263489456, + 263776000,264062432,264348784,264635024,264921168,265207216,265493168,265779024, + 266064784,266350448,266636000,266921472,267206832,267492096,267777264,268062336, + 268347312,268632192,268916960,269201632,269486208,269770688,270055072,270339360, + 270623552,270907616,271191616,271475488,271759296,272042976,272326560,272610048, + 272893440,273176736,273459936,273743040,274026048,274308928,274591744,274874432, + 275157024,275439520,275721920,276004224,276286432,276568512,276850528,277132416, + 277414240,277695936,277977536,278259040,278540448,278821728,279102944,279384032, + 279665056,279945952,280226752,280507456,280788064,281068544,281348960,281629248, + 281909472,282189568,282469568,282749440,283029248,283308960,283588544,283868032, + 284147424,284426720,284705920,284985024,285264000,285542912,285821696,286100384, + 286378976,286657440,286935840,287214112,287492320,287770400,288048384,288326240, + 288604032,288881696,289159264,289436768,289714112,289991392,290268576,290545632, + 290822592,291099456,291376224,291652896,291929440,292205888,292482272,292758528, + 293034656,293310720,293586656,293862496,294138240,294413888,294689440,294964864, + 295240192,295515424,295790560,296065600,296340512,296615360,296890080,297164704, + 297439200,297713632,297987936,298262144,298536256,298810240,299084160,299357952, + 299631648,299905248,300178720,300452128,300725408,300998592,301271680,301544640, + 301817536,302090304,302362976,302635520,302908000,303180352,303452608,303724768, + 303996800,304268768,304540608,304812320,305083968,305355520,305626944,305898272, + 306169472,306440608,306711616,306982528,307253344,307524064,307794656,308065152, + 308335552,308605856,308876032,309146112,309416096,309685984,309955744,310225408, + 310494976,310764448,311033824,311303072,311572224,311841280,312110208,312379040, + 312647776,312916416,313184960,313453376,313721696,313989920,314258016,314526016, + 314793920,315061728,315329408,315597024,315864512,316131872,316399168,316666336, + 316933408,317200384,317467232,317733984,318000640,318267200,318533632,318799968, + 319066208,319332352,319598368,319864288,320130112,320395808,320661408,320926912, + 321192320,321457632,321722816,321987904,322252864,322517760,322782528,323047200, + 323311744,323576192,323840544,324104800,324368928,324632992,324896928,325160736, + 325424448,325688096,325951584,326215008,326478304,326741504,327004608,327267584, + 327530464,327793248,328055904,328318496,328580960,328843296,329105568,329367712, + 329629760,329891680,330153536,330415264,330676864,330938400,331199808,331461120, + 331722304,331983392,332244384,332505280,332766048,333026752,333287296,333547776, + 333808128,334068384,334328544,334588576,334848512,335108352,335368064,335627712, + 335887200,336146624,336405920,336665120,336924224,337183200,337442112,337700864, + 337959552,338218112,338476576,338734944,338993184,339251328,339509376,339767296, + 340025120,340282848,340540480,340797984,341055392,341312704,341569888,341826976, + 342083968,342340832,342597600,342854272,343110848,343367296,343623648,343879904, + 344136032,344392064,344648000,344903808,345159520,345415136,345670656,345926048, + 346181344,346436512,346691616,346946592,347201440,347456224,347710880,347965440, + 348219872,348474208,348728448,348982592,349236608,349490528,349744320,349998048, + 350251648,350505152,350758528,351011808,351264992,351518048,351771040,352023872, + 352276640,352529280,352781824,353034272,353286592,353538816,353790944,354042944, + 354294880,354546656,354798368,355049952,355301440,355552800,355804096,356055264, + 356306304,356557280,356808128,357058848,357309504,357560032,357810464,358060768, + 358311008,358561088,358811104,359060992,359310784,359560480,359810048,360059520, + 360308896,360558144,360807296,361056352,361305312,361554144,361802880,362051488, + 362300032,362548448,362796736,363044960,363293056,363541024,363788928,364036704, + 364284384,364531936,364779392,365026752,365274016,365521152,365768192,366015136, + 366261952,366508672,366755296,367001792,367248192,367494496,367740704,367986784, + 368232768,368478656,368724416,368970080,369215648,369461088,369706432,369951680, + 370196800,370441824,370686752,370931584,371176288,371420896,371665408,371909792, + 372154080,372398272,372642336,372886304,373130176,373373952,373617600,373861152, + 374104608,374347936,374591168,374834304,375077312,375320224,375563040,375805760, + 376048352,376290848,376533248,376775520,377017696,377259776,377501728,377743584, + 377985344,378227008,378468544,378709984,378951328,379192544,379433664,379674688, + 379915584,380156416,380397088,380637696,380878176,381118560,381358848,381599040, + 381839104,382079072,382318912,382558656,382798304,383037856,383277280,383516640, + 383755840,383994976,384233984,384472896,384711712,384950400,385188992,385427488, + 385665888,385904160,386142336,386380384,386618368,386856224,387093984,387331616, + 387569152,387806592,388043936,388281152,388518272,388755296,388992224,389229024, + 389465728,389702336,389938816,390175200,390411488,390647680,390883744,391119712, + 391355584,391591328,391826976,392062528,392297984,392533312,392768544,393003680, + 393238720,393473632,393708448,393943168,394177760,394412256,394646656,394880960, + 395115136,395349216,395583200,395817088,396050848,396284512,396518080,396751520, + 396984864,397218112,397451264,397684288,397917248,398150080,398382784,398615424, + 398847936,399080320,399312640,399544832,399776928,400008928,400240832,400472608, + 400704288,400935872,401167328,401398720,401629984,401861120,402092192,402323136, + 402553984,402784736,403015360,403245888,403476320,403706656,403936896,404167008, + 404397024,404626944,404856736,405086432,405316032,405545536,405774912,406004224, + 406233408,406462464,406691456,406920320,407149088,407377760,407606336,407834784, + 408063136,408291392,408519520,408747584,408975520,409203360,409431072,409658720, + 409886240,410113664,410340992,410568192,410795296,411022304,411249216,411476032, + 411702720,411929312,412155808,412382176,412608480,412834656,413060736,413286720, + 413512576,413738336,413964000,414189568,414415040,414640384,414865632,415090784, + 415315840,415540800,415765632,415990368,416215008,416439552,416663968,416888288, + 417112512,417336640,417560672,417784576,418008384,418232096,418455712,418679200, + 418902624,419125920,419349120,419572192,419795200,420018080,420240864,420463552, + 420686144,420908608,421130976,421353280,421575424,421797504,422019488,422241344, + 422463104,422684768,422906336,423127776,423349120,423570400,423791520,424012576, + 424233536,424454368,424675104,424895744,425116288,425336736,425557056,425777280, + 425997408,426217440,426437376,426657184,426876928,427096544,427316064,427535488, + 427754784,427974016,428193120,428412128,428631040,428849856,429068544,429287168, + 429505664,429724064,429942368,430160576,430378656,430596672,430814560,431032352, + 431250048,431467616,431685120,431902496,432119808,432336992,432554080,432771040, + 432987936,433204736,433421408,433637984,433854464,434070848,434287104,434503296, + 434719360,434935360,435151232,435367008,435582656,435798240,436013696,436229088, + 436444352,436659520,436874592,437089568,437304416,437519200,437733856,437948416, + 438162880,438377248,438591520,438805696,439019744,439233728,439447584,439661344, + 439875008,440088576,440302048,440515392,440728672,440941824,441154880,441367872, + 441580736,441793472,442006144,442218720,442431168,442643552,442855808,443067968, + 443280032,443492000,443703872,443915648,444127296,444338880,444550336,444761696, + 444972992,445184160,445395232,445606176,445817056,446027840,446238496,446449088, + 446659552,446869920,447080192,447290400,447500448,447710432,447920320,448130112, + 448339776,448549376,448758848,448968224,449177536,449386720,449595808,449804800, + 450013664,450222464,450431168,450639776,450848256,451056640,451264960,451473152, + 451681248,451889248,452097152,452304960,452512672,452720288,452927808,453135232, + 453342528,453549760,453756864,453963904,454170816,454377632,454584384,454791008, + 454997536,455203968,455410304,455616544,455822688,456028704,456234656,456440512, + 456646240,456851904,457057472,457262912,457468256,457673536,457878688,458083744, + 458288736,458493600,458698368,458903040,459107616,459312096,459516480,459720768, + 459924960,460129056,460333056,460536960,460740736,460944448,461148064,461351584, + 461554976,461758304,461961536,462164640,462367680,462570592,462773440,462976160, + 463178816,463381344,463583776,463786144,463988384,464190560,464392608,464594560, + 464796448,464998208,465199872,465401472,465602944,465804320,466005600,466206816, + 466407904,466608896,466809824,467010624,467211328,467411936,467612480,467812896, + 468013216,468213440,468413600,468613632,468813568,469013440,469213184,469412832, + 469612416,469811872,470011232,470210528,470409696,470608800,470807776,471006688, + 471205472,471404192,471602784,471801312,471999712,472198048,472396288,472594400, + 472792448,472990400,473188256,473385984,473583648,473781216,473978688,474176064, + 474373344,474570528,474767616,474964608,475161504,475358336,475555040,475751648, + 475948192,476144608,476340928,476537184,476733312,476929376,477125344,477321184, + 477516960,477712640,477908224,478103712,478299104,478494400,478689600,478884704, + 479079744,479274656,479469504,479664224,479858880,480053408,480247872,480442240, + 480636512,480830656,481024736,481218752,481412640,481606432,481800128,481993760, + 482187264,482380704,482574016,482767264,482960416,483153472,483346432,483539296, + 483732064,483924768,484117344,484309856,484502240,484694560,484886784,485078912, + 485270944,485462880,485654720,485846464,486038144,486229696,486421184,486612576, + 486803840,486995040,487186176,487377184,487568096,487758912,487949664,488140320, + 488330880,488521312,488711712,488901984,489092160,489282240,489472256,489662176, + 489851968,490041696,490231328,490420896,490610336,490799712,490988960,491178144, + 491367232,491556224,491745120,491933920,492122656,492311264,492499808,492688256, + 492876608,493064864,493253056,493441120,493629120,493817024,494004832,494192544, + 494380160,494567712,494755136,494942496,495129760,495316928,495504000,495691008, + 495877888,496064704,496251424,496438048,496624608,496811040,496997408,497183680, + 497369856,497555936,497741920,497927840,498113632,498299360,498484992,498670560, + 498856000,499041376,499226656,499411840,499596928,499781920,499966848,500151680, + 500336416,500521056,500705600,500890080,501074464,501258752,501442944,501627040, + 501811072,501995008,502178848,502362592,502546240,502729824,502913312,503096704, + 503280000,503463232,503646368,503829408,504012352,504195200,504377984,504560672, + 504743264,504925760,505108192,505290496,505472736,505654912,505836960,506018944, + 506200832,506382624,506564320,506745952,506927488,507108928,507290272,507471552, + 507652736,507833824,508014816,508195744,508376576,508557312,508737952,508918528, + 509099008,509279392,509459680,509639904,509820032,510000064,510180000,510359872, + 510539648,510719328,510898944,511078432,511257856,511437216,511616448,511795616, + 511974688,512153664,512332576,512511392,512690112,512868768,513047296,513225792, + 513404160,513582432,513760640,513938784,514116800,514294752,514472608,514650368, + 514828064,515005664,515183168,515360608,515537952,515715200,515892352,516069440, + 516246432,516423328,516600160,516776896,516953536,517130112,517306592,517482976, + 517659264,517835488,518011616,518187680,518363648,518539520,518715296,518891008, + 519066624,519242144,519417600,519592960,519768256,519943424,520118528,520293568, + 520468480,520643328,520818112,520992800,521167392,521341888,521516320,521690656, + 521864896,522039072,522213152,522387168,522561056,522734912,522908640,523082304, + 523255872,523429376,523602784,523776096,523949312,524122464,524295552,524468512, + 524641440,524814240,524986976,525159616,525332192,525504640,525677056,525849344, + 526021568,526193728,526365792,526537760,526709632,526881440,527053152,527224800, + 527396352,527567840,527739200,527910528,528081728,528252864,528423936,528594880, + 528765760,528936576,529107296,529277920,529448480,529618944,529789344,529959648, + 530129856,530300000,530470048,530640000,530809888,530979712,531149440,531319072, + 531488608,531658080,531827488,531996800,532166016,532335168,532504224,532673184, + 532842080,533010912,533179616,533348288,533516832,533685312,533853728,534022048, + 534190272,534358432,534526496,534694496,534862400,535030240,535197984,535365632, + 535533216,535700704,535868128,536035456,536202720,536369888,536536992,536704000, + 536870912 +}; + +// Now where did these came from? +const byte gammatable[5][256] = +{ + { + 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16, + 17,18,19,20,21,22,23,24,25,26,27,28,29,30,31,32, + 33,34,35,36,37,38,39,40,41,42,43,44,45,46,47,48, + 49,50,51,52,53,54,55,56,57,58,59,60,61,62,63,64, + 65,66,67,68,69,70,71,72,73,74,75,76,77,78,79,80, + 81,82,83,84,85,86,87,88,89,90,91,92,93,94,95,96, + 97,98,99,100,101,102,103,104,105,106,107,108,109,110,111,112, + 113,114,115,116,117,118,119,120,121,122,123,124,125,126,127,128, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 144,145,146,147,148,149,150,151,152,153,154,155,156,157,158,159, + 160,161,162,163,164,165,166,167,168,169,170,171,172,173,174,175, + 176,177,178,179,180,181,182,183,184,185,186,187,188,189,190,191, + 192,193,194,195,196,197,198,199,200,201,202,203,204,205,206,207, + 208,209,210,211,212,213,214,215,216,217,218,219,220,221,222,223, + 224,225,226,227,228,229,230,231,232,233,234,235,236,237,238,239, + 240,241,242,243,244,245,246,247,248,249,250,251,252,253,254,255 + }, + + { + 2,4,5,7,8,10,11,12,14,15,16,18,19,20,21,23, + 24,25,26,27,29,30,31,32,33,34,36,37,38,39,40,41, + 42,44,45,46,47,48,49,50,51,52,54,55,56,57,58,59, + 60,61,62,63,64,65,66,67,69,70,71,72,73,74,75,76, + 77,78,79,80,81,82,83,84,85,86,87,88,89,90,91,92, + 93,94,95,96,97,98,99,100,101,102,103,104,105,106,107,108, + 109,110,111,112,113,114,115,116,117,118,119,120,121,122,123,124, + 125,126,127,128,129,129,130,131,132,133,134,135,136,137,138,139, + 140,141,142,143,144,145,146,147,148,148,149,150,151,152,153,154, + 155,156,157,158,159,160,161,162,163,163,164,165,166,167,168,169, + 170,171,172,173,174,175,175,176,177,178,179,180,181,182,183,184, + 185,186,186,187,188,189,190,191,192,193,194,195,196,196,197,198, + 199,200,201,202,203,204,205,205,206,207,208,209,210,211,212,213, + 214,214,215,216,217,218,219,220,221,222,222,223,224,225,226,227, + 228,229,230,230,231,232,233,234,235,236,237,237,238,239,240,241, + 242,243,244,245,245,246,247,248,249,250,251,252,252,253,254,255 + }, + + { + 4,7,9,11,13,15,17,19,21,22,24,26,27,29,30,32, + 33,35,36,38,39,40,42,43,45,46,47,48,50,51,52,54, + 55,56,57,59,60,61,62,63,65,66,67,68,69,70,72,73, + 74,75,76,77,78,79,80,82,83,84,85,86,87,88,89,90, + 91,92,93,94,95,96,97,98,100,101,102,103,104,105,106,107, + 108,109,110,111,112,113,114,114,115,116,117,118,119,120,121,122, + 123,124,125,126,127,128,129,130,131,132,133,133,134,135,136,137, + 138,139,140,141,142,143,144,144,145,146,147,148,149,150,151,152, + 153,153,154,155,156,157,158,159,160,160,161,162,163,164,165,166, + 166,167,168,169,170,171,172,172,173,174,175,176,177,178,178,179, + 180,181,182,183,183,184,185,186,187,188,188,189,190,191,192,193, + 193,194,195,196,197,197,198,199,200,201,201,202,203,204,205,206, + 206,207,208,209,210,210,211,212,213,213,214,215,216,217,217,218, + 219,220,221,221,222,223,224,224,225,226,227,228,228,229,230,231, + 231,232,233,234,235,235,236,237,238,238,239,240,241,241,242,243, + 244,244,245,246,247,247,248,249,250,251,251,252,253,254,254,255 + }, + + { + 8,12,16,19,22,24,27,29,31,34,36,38,40,41,43,45, + 47,49,50,52,53,55,57,58,60,61,63,64,65,67,68,70, + 71,72,74,75,76,77,79,80,81,82,84,85,86,87,88,90, + 91,92,93,94,95,96,98,99,100,101,102,103,104,105,106,107, + 108,109,110,111,112,113,114,115,116,117,118,119,120,121,122,123, + 124,125,126,127,128,129,130,131,132,133,134,135,135,136,137,138, + 139,140,141,142,143,143,144,145,146,147,148,149,150,150,151,152, + 153,154,155,155,156,157,158,159,160,160,161,162,163,164,165,165, + 166,167,168,169,169,170,171,172,173,173,174,175,176,176,177,178, + 179,180,180,181,182,183,183,184,185,186,186,187,188,189,189,190, + 191,192,192,193,194,195,195,196,197,197,198,199,200,200,201,202, + 202,203,204,205,205,206,207,207,208,209,210,210,211,212,212,213, + 214,214,215,216,216,217,218,219,219,220,221,221,222,223,223,224, + 225,225,226,227,227,228,229,229,230,231,231,232,233,233,234,235, + 235,236,237,237,238,238,239,240,240,241,242,242,243,244,244,245, + 246,246,247,247,248,249,249,250,251,251,252,253,253,254,254,255 + }, + + + { + 16,23,28,32,36,39,42,45,48,50,53,55,57,60,62,64, + 66,68,69,71,73,75,76,78,80,81,83,84,86,87,89,90, + 92,93,94,96,97,98,100,101,102,103,105,106,107,108,109,110, + 112,113,114,115,116,117,118,119,120,121,122,123,124,125,126,128, + 128,129,130,131,132,133,134,135,136,137,138,139,140,141,142,143, + 143,144,145,146,147,148,149,150,150,151,152,153,154,155,155,156, + 157,158,159,159,160,161,162,163,163,164,165,166,166,167,168,169, + 169,170,171,172,172,173,174,175,175,176,177,177,178,179,180,180, + 181,182,182,183,184,184,185,186,187,187,188,189,189,190,191,191, + 192,193,193,194,195,195,196,196,197,198,198,199,200,200,201,202, + 202,203,203,204,205,205,206,207,207,208,208,209,210,210,211,211, + 212,213,213,214,214,215,216,216,217,217,218,219,219,220,220,221, + 221,222,223,223,224,224,225,225,226,227,227,228,228,229,229,230, + 230,231,232,232,233,233,234,234,235,235,236,236,237,237,238,239, + 239,240,240,241,241,242,242,243,243,244,244,245,245,246,246,247, + 247,248,248,249,249,250,250,251,251,252,252,253,254,254,255,255 + } +}; + diff --git a/firmware_p4/components/Applications/doom/tables.h b/firmware_p4/components/Applications/doom/tables.h new file mode 100644 index 000000000..495fd5349 --- /dev/null +++ b/firmware_p4/components/Applications/doom/tables.h @@ -0,0 +1,96 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 1993-2008 Raven Software +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Lookup tables. +// Do not try to look them up :-). +// In the order of appearance: +// +// int finetangent[4096] - Tangens LUT. +// Should work with BAM fairly well (12 of 16bit, +// effectively, by shifting). +// +// int finesine[10240] - Sine lookup. +// Guess what, serves as cosine, too. +// Remarkable thing is, how to use BAMs with this? +// +// int tantoangle[2049] - ArcTan LUT, +// maps tan(angle) to angle fast. Gotta search. +// + + +#ifndef __TABLES__ +#define __TABLES__ + +#include "doomtype.h" + +#include "m_fixed.h" + +#define FINEANGLES 8192 +#define FINEMASK (FINEANGLES-1) + + +// 0x100000000 to 0x2000 +#define ANGLETOFINESHIFT 19 + +// Effective size is 10240. +extern const fixed_t finesine[5*FINEANGLES/4]; + +// Re-use data, is just PI/2 pahse shift. +extern const fixed_t *finecosine; + + +// Effective size is 4096. +extern const fixed_t finetangent[FINEANGLES/2]; + +// Gamma correction tables. +extern const byte gammatable[5][256]; + +// Binary Angle Measument, BAM. + +#define ANG45 0x20000000 +#define ANG90 0x40000000 +#define ANG180 0x80000000 +#define ANG270 0xc0000000 +#define ANG_MAX 0xffffffff + +#define ANG1 (ANG45 / 45) +#define ANG60 (ANG180 / 3) + +// Heretic code uses this definition as though it represents one +// degree, but it is not! This is actually ~1.40 degrees. + +#define ANG1_X 0x01000000 + +#define SLOPERANGE 2048 +#define SLOPEBITS 11 +#define DBITS (FRACBITS-SLOPEBITS) + +typedef unsigned angle_t; + + +// Effective size is 2049; +// The +1 size is to handle the case when x==y +// without additional checking. +extern const angle_t tantoangle[SLOPERANGE+1]; + + +// Utility function, +// called by R_PointToAngle. +int SlopeDiv(unsigned int num, unsigned int den); + + +#endif + diff --git a/firmware_p4/components/Applications/doom/v_patch.h b/firmware_p4/components/Applications/doom/v_patch.h new file mode 100644 index 000000000..687dca10e --- /dev/null +++ b/firmware_p4/components/Applications/doom/v_patch.h @@ -0,0 +1,50 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Refresh/rendering module, shared data struct definitions. +// + + +#ifndef V_PATCH_H +#define V_PATCH_H + +// Patches. +// A patch holds one or more columns. +// Patches are used for sprites and all masked pictures, +// and we compose textures from the TEXTURE1/2 lists +// of patches. + +typedef struct +{ + short width; // bounding box size + short height; + short leftoffset; // pixels to the left of origin + short topoffset; // pixels below the origin + int columnofs[8]; // only [width] used + // the [0] is &columnofs[width] +} PACKEDATTR patch_t; + +// posts are runs of non masked source pixels +typedef struct +{ + byte topdelta; // -1 is the last post in a column + byte length; // length data bytes follows +} PACKEDATTR post_t; + +// column_t is a list of 0 or more post_t, (byte)-1 terminated +typedef post_t column_t; + +#endif + diff --git a/firmware_p4/components/Applications/doom/v_video.c b/firmware_p4/components/Applications/doom/v_video.c new file mode 100644 index 000000000..6db28aa5f --- /dev/null +++ b/firmware_p4/components/Applications/doom/v_video.c @@ -0,0 +1,932 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 1993-2008 Raven Software +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Gamma correction LUT stuff. +// Functions to draw patches (by post) directly to screen. +// Functions to blit a block to the screen. +// + +#include +#include +#include + +#include "i_system.h" + +#include "doomtype.h" + +#include "deh_str.h" +#include "i_swap.h" +#include "i_video.h" +#include "m_bbox.h" +#include "m_misc.h" +#include "v_video.h" +#include "w_wad.h" +#include "z_zone.h" + +#include "config.h" +#ifdef HAVE_LIBPNG +#include +#endif + +// TODO: There are separate RANGECHECK defines for different games, but this +// is common code. Fix this. +#define RANGECHECK + +// Blending table used for fuzzpatch, etc. +// Only used in Heretic/Hexen + +byte *tinttable = NULL; + +// villsa [STRIFE] Blending table used for Strife +byte *xlatab = NULL; + +// The screen buffer that the v_video.c code draws to. + +static byte *dest_screen = NULL; + +int dirtybox[4]; + +// haleyjd 08/28/10: clipping callback function for patches. +// This is needed for Chocolate Strife, which clips patches to the screen. +static vpatchclipfunc_t patchclip_callback = NULL; + +// +// V_MarkRect +// +void V_MarkRect(int x, int y, int width, int height) +{ + // If we are temporarily using an alternate screen, do not + // affect the update box. + + if (dest_screen == I_VideoBuffer) + { + M_AddToBox (dirtybox, x, y); + M_AddToBox (dirtybox, x + width-1, y + height-1); + } +} + + +// +// V_CopyRect +// +void V_CopyRect(int srcx, int srcy, byte *source, + int width, int height, + int destx, int desty) +{ + byte *src; + byte *dest; + +#ifdef RANGECHECK + if (srcx < 0 + || srcx + width > SCREENWIDTH + || srcy < 0 + || srcy + height > SCREENHEIGHT + || destx < 0 + || destx + width > SCREENWIDTH + || desty < 0 + || desty + height > SCREENHEIGHT) + { + I_Error ("Bad V_CopyRect"); + } +#endif + + V_MarkRect(destx, desty, width, height); + + src = source + SCREENWIDTH * srcy + srcx; + dest = dest_screen + SCREENWIDTH * desty + destx; + + for ( ; height>0 ; height--) + { + memcpy(dest, src, width); + src += SCREENWIDTH; + dest += SCREENWIDTH; + } +} + +// +// V_SetPatchClipCallback +// +// haleyjd 08/28/10: Added for Strife support. +// By calling this function, you can setup runtime error checking for patch +// clipping. Strife never caused errors by drawing patches partway off-screen. +// Some versions of vanilla DOOM also behaved differently than the default +// implementation, so this could possibly be extended to those as well for +// accurate emulation. +// +void V_SetPatchClipCallback(vpatchclipfunc_t func) +{ + patchclip_callback = func; +} + +// +// V_DrawPatch +// Masks a column based masked pic to the screen. +// + +void V_DrawPatch(int x, int y, patch_t *patch) +{ + int count; + int col; + column_t *column; + byte *desttop; + byte *dest; + byte *source; + int w; + + y -= SHORT(patch->topoffset); + x -= SHORT(patch->leftoffset); + + // haleyjd 08/28/10: Strife needs silent error checking here. + if(patchclip_callback) + { + if(!patchclip_callback(patch, x, y)) + return; + } + +#ifdef RANGECHECK + if (x < 0 + || x + SHORT(patch->width) > SCREENWIDTH + || y < 0 + || y + SHORT(patch->height) > SCREENHEIGHT) + { + I_Error("Bad V_DrawPatch x=%i y=%i patch.width=%i patch.height=%i topoffset=%i leftoffset=%i", x, y, patch->width, patch->height, patch->topoffset, patch->leftoffset); + } +#endif + + V_MarkRect(x, y, SHORT(patch->width), SHORT(patch->height)); + + col = 0; + desttop = dest_screen + y * SCREENWIDTH + x; + + w = SHORT(patch->width); + + for ( ; colcolumnofs[col])); + + // step through the posts in a column + while (column->topdelta != 0xff) + { + source = (byte *)column + 3; + dest = desttop + column->topdelta*SCREENWIDTH; + count = column->length; + + while (count--) + { + *dest = *source++; + dest += SCREENWIDTH; + } + column = (column_t *)((byte *)column + column->length + 4); + } + } +} + +// +// V_DrawPatchFlipped +// Masks a column based masked pic to the screen. +// Flips horizontally, e.g. to mirror face. +// + +void V_DrawPatchFlipped(int x, int y, patch_t *patch) +{ + int count; + int col; + column_t *column; + byte *desttop; + byte *dest; + byte *source; + int w; + + y -= SHORT(patch->topoffset); + x -= SHORT(patch->leftoffset); + + // haleyjd 08/28/10: Strife needs silent error checking here. + if(patchclip_callback) + { + if(!patchclip_callback(patch, x, y)) + return; + } + +#ifdef RANGECHECK + if (x < 0 + || x + SHORT(patch->width) > SCREENWIDTH + || y < 0 + || y + SHORT(patch->height) > SCREENHEIGHT) + { + I_Error("Bad V_DrawPatchFlipped"); + } +#endif + + V_MarkRect (x, y, SHORT(patch->width), SHORT(patch->height)); + + col = 0; + desttop = dest_screen + y * SCREENWIDTH + x; + + w = SHORT(patch->width); + + for ( ; colcolumnofs[w-1-col])); + + // step through the posts in a column + while (column->topdelta != 0xff ) + { + source = (byte *)column + 3; + dest = desttop + column->topdelta*SCREENWIDTH; + count = column->length; + + while (count--) + { + *dest = *source++; + dest += SCREENWIDTH; + } + column = (column_t *)((byte *)column + column->length + 4); + } + } +} + + + +// +// V_DrawPatchDirect +// Draws directly to the screen on the pc. +// + +void V_DrawPatchDirect(int x, int y, patch_t *patch) +{ + V_DrawPatch(x, y, patch); +} + +// +// V_DrawTLPatch +// +// Masks a column based translucent masked pic to the screen. +// + +void V_DrawTLPatch(int x, int y, patch_t * patch) +{ + int count, col; + column_t *column; + byte *desttop, *dest, *source; + int w; + + y -= SHORT(patch->topoffset); + x -= SHORT(patch->leftoffset); + + if (x < 0 + || x + SHORT(patch->width) > SCREENWIDTH + || y < 0 + || y + SHORT(patch->height) > SCREENHEIGHT) + { + I_Error("Bad V_DrawTLPatch"); + } + + col = 0; + desttop = dest_screen + y * SCREENWIDTH + x; + + w = SHORT(patch->width); + for (; col < w; x++, col++, desttop++) + { + column = (column_t *) ((byte *) patch + LONG(patch->columnofs[col])); + + // step through the posts in a column + + while (column->topdelta != 0xff) + { + source = (byte *) column + 3; + dest = desttop + column->topdelta * SCREENWIDTH; + count = column->length; + + while (count--) + { + *dest = tinttable[((*dest) << 8) + *source++]; + dest += SCREENWIDTH; + } + column = (column_t *) ((byte *) column + column->length + 4); + } + } +} + +// +// V_DrawXlaPatch +// +// villsa [STRIFE] Masks a column based translucent masked pic to the screen. +// + +void V_DrawXlaPatch(int x, int y, patch_t * patch) +{ + int count, col; + column_t *column; + byte *desttop, *dest, *source; + int w; + + y -= SHORT(patch->topoffset); + x -= SHORT(patch->leftoffset); + + if(patchclip_callback) + { + if(!patchclip_callback(patch, x, y)) + return; + } + + col = 0; + desttop = dest_screen + y * SCREENWIDTH + x; + + w = SHORT(patch->width); + for(; col < w; x++, col++, desttop++) + { + column = (column_t *) ((byte *) patch + LONG(patch->columnofs[col])); + + // step through the posts in a column + + while(column->topdelta != 0xff) + { + source = (byte *) column + 3; + dest = desttop + column->topdelta * SCREENWIDTH; + count = column->length; + + while(count--) + { + *dest = xlatab[*dest + ((*source) << 8)]; + source++; + dest += SCREENWIDTH; + } + column = (column_t *) ((byte *) column + column->length + 4); + } + } +} + +// +// V_DrawAltTLPatch +// +// Masks a column based translucent masked pic to the screen. +// + +void V_DrawAltTLPatch(int x, int y, patch_t * patch) +{ + int count, col; + column_t *column; + byte *desttop, *dest, *source; + int w; + + y -= SHORT(patch->topoffset); + x -= SHORT(patch->leftoffset); + + if (x < 0 + || x + SHORT(patch->width) > SCREENWIDTH + || y < 0 + || y + SHORT(patch->height) > SCREENHEIGHT) + { + I_Error("Bad V_DrawAltTLPatch"); + } + + col = 0; + desttop = dest_screen + y * SCREENWIDTH + x; + + w = SHORT(patch->width); + for (; col < w; x++, col++, desttop++) + { + column = (column_t *) ((byte *) patch + LONG(patch->columnofs[col])); + + // step through the posts in a column + + while (column->topdelta != 0xff) + { + source = (byte *) column + 3; + dest = desttop + column->topdelta * SCREENWIDTH; + count = column->length; + + while (count--) + { + *dest = tinttable[((*dest) << 8) + *source++]; + dest += SCREENWIDTH; + } + column = (column_t *) ((byte *) column + column->length + 4); + } + } +} + +// +// V_DrawShadowedPatch +// +// Masks a column based masked pic to the screen. +// + +void V_DrawShadowedPatch(int x, int y, patch_t *patch) +{ + int count, col; + column_t *column; + byte *desttop, *dest, *source; + byte *desttop2, *dest2; + int w; + + y -= SHORT(patch->topoffset); + x -= SHORT(patch->leftoffset); + + if (x < 0 + || x + SHORT(patch->width) > SCREENWIDTH + || y < 0 + || y + SHORT(patch->height) > SCREENHEIGHT) + { + I_Error("Bad V_DrawShadowedPatch"); + } + + col = 0; + desttop = dest_screen + y * SCREENWIDTH + x; + desttop2 = dest_screen + (y + 2) * SCREENWIDTH + x + 2; + + w = SHORT(patch->width); + for (; col < w; x++, col++, desttop++, desttop2++) + { + column = (column_t *) ((byte *) patch + LONG(patch->columnofs[col])); + + // step through the posts in a column + + while (column->topdelta != 0xff) + { + source = (byte *) column + 3; + dest = desttop + column->topdelta * SCREENWIDTH; + dest2 = desttop2 + column->topdelta * SCREENWIDTH; + count = column->length; + + while (count--) + { + *dest2 = tinttable[((*dest2) << 8)]; + dest2 += SCREENWIDTH; + *dest = *source++; + dest += SCREENWIDTH; + + } + column = (column_t *) ((byte *) column + column->length + 4); + } + } +} + +// +// Load tint table from TINTTAB lump. +// + +void V_LoadTintTable(void) +{ + tinttable = W_CacheLumpName("TINTTAB", PU_STATIC); +} + +// +// V_LoadXlaTable +// +// villsa [STRIFE] Load xla table from XLATAB lump. +// + +void V_LoadXlaTable(void) +{ + xlatab = W_CacheLumpName("XLATAB", PU_STATIC); +} + +// +// V_DrawBlock +// Draw a linear block of pixels into the view buffer. +// + +void V_DrawBlock(int x, int y, int width, int height, byte *src) +{ + byte *dest; + +#ifdef RANGECHECK + if (x < 0 + || x + width >SCREENWIDTH + || y < 0 + || y + height > SCREENHEIGHT) + { + I_Error ("Bad V_DrawBlock"); + } +#endif + + V_MarkRect (x, y, width, height); + + dest = dest_screen + y * SCREENWIDTH + x; + + while (height--) + { + memcpy (dest, src, width); + src += width; + dest += SCREENWIDTH; + } +} + +void V_DrawFilledBox(int x, int y, int w, int h, int c) +{ + uint8_t *buf, *buf1; + int x1, y1; + + buf = I_VideoBuffer + SCREENWIDTH * y + x; + + for (y1 = 0; y1 < h; ++y1) + { + buf1 = buf; + + for (x1 = 0; x1 < w; ++x1) + { + *buf1++ = c; + } + + buf += SCREENWIDTH; + } +} + +void V_DrawHorizLine(int x, int y, int w, int c) +{ + uint8_t *buf; + int x1; + + buf = I_VideoBuffer + SCREENWIDTH * y + x; + + for (x1 = 0; x1 < w; ++x1) + { + *buf++ = c; + } +} + +void V_DrawVertLine(int x, int y, int h, int c) +{ + uint8_t *buf; + int y1; + + buf = I_VideoBuffer + SCREENWIDTH * y + x; + + for (y1 = 0; y1 < h; ++y1) + { + *buf = c; + buf += SCREENWIDTH; + } +} + +void V_DrawBox(int x, int y, int w, int h, int c) +{ + V_DrawHorizLine(x, y, w, c); + V_DrawHorizLine(x, y+h-1, w, c); + V_DrawVertLine(x, y, h, c); + V_DrawVertLine(x+w-1, y, h, c); +} + +// +// Draw a "raw" screen (lump containing raw data to blit directly +// to the screen) +// + +void V_DrawRawScreen(byte *raw) +{ + memcpy(dest_screen, raw, SCREENWIDTH * SCREENHEIGHT); +} + +// +// V_Init +// +void V_Init (void) +{ + // no-op! + // There used to be separate screens that could be drawn to; these are + // now handled in the upper layers. +} + +// Set the buffer that the code draws to. + +void V_UseBuffer(byte *buffer) +{ + dest_screen = buffer; +} + +// Restore screen buffer to the i_video screen buffer. + +void V_RestoreBuffer(void) +{ + dest_screen = I_VideoBuffer; +} + +// +// SCREEN SHOTS +// + +typedef struct +{ + char manufacturer; + char version; + char encoding; + char bits_per_pixel; + + unsigned short xmin; + unsigned short ymin; + unsigned short xmax; + unsigned short ymax; + + unsigned short hres; + unsigned short vres; + + unsigned char palette[48]; + + char reserved; + char color_planes; + unsigned short bytes_per_line; + unsigned short palette_type; + + char filler[58]; + unsigned char data; // unbounded +} PACKEDATTR pcx_t; + + +// +// WritePCXfile +// + +void WritePCXfile(char *filename, byte *data, + int width, int height, + byte *palette) +{ + int i; + int length; + pcx_t* pcx; + byte* pack; + + pcx = Z_Malloc (width*height*2+1000, PU_STATIC, NULL); + + pcx->manufacturer = 0x0a; // PCX id + pcx->version = 5; // 256 color + pcx->encoding = 1; // uncompressed + pcx->bits_per_pixel = 8; // 256 color + pcx->xmin = 0; + pcx->ymin = 0; + pcx->xmax = SHORT(width-1); + pcx->ymax = SHORT(height-1); + pcx->hres = SHORT(width); + pcx->vres = SHORT(height); + memset (pcx->palette,0,sizeof(pcx->palette)); + pcx->color_planes = 1; // chunky image + pcx->bytes_per_line = SHORT(width); + pcx->palette_type = SHORT(2); // not a grey scale + memset (pcx->filler,0,sizeof(pcx->filler)); + + // pack the image + pack = &pcx->data; + + for (i=0 ; i MOUSE_SPEED_BOX_WIDTH - 1) + { + linelen = MOUSE_SPEED_BOX_WIDTH - 1; + } + + V_DrawHorizLine(box_x + 1, box_y + 4, MOUSE_SPEED_BOX_WIDTH - 2, black); + + if (linelen < redline_x) + { + V_DrawHorizLine(box_x + 1, box_y + MOUSE_SPEED_BOX_HEIGHT / 2, + linelen, white); + } + else + { + V_DrawHorizLine(box_x + 1, box_y + MOUSE_SPEED_BOX_HEIGHT / 2, + redline_x, white); + V_DrawHorizLine(box_x + redline_x, box_y + MOUSE_SPEED_BOX_HEIGHT / 2, + linelen - redline_x, yellow); + } + + // Draw red line + + V_DrawVertLine(box_x + redline_x, box_y + 1, + MOUSE_SPEED_BOX_HEIGHT - 2, red); +} + diff --git a/firmware_p4/components/Applications/doom/v_video.h b/firmware_p4/components/Applications/doom/v_video.h new file mode 100644 index 000000000..a970c7193 --- /dev/null +++ b/firmware_p4/components/Applications/doom/v_video.h @@ -0,0 +1,108 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Gamma correction LUT. +// Functions to draw patches (by post) directly to screen. +// Functions to blit a block to the screen. +// + + +#ifndef __V_VIDEO__ +#define __V_VIDEO__ + +#include "doomtype.h" + +// Needed because we are refering to patches. +#include "v_patch.h" + +// +// VIDEO +// + +#define CENTERY (SCREENHEIGHT/2) + + +extern int dirtybox[4]; + +extern byte *tinttable; + +// haleyjd 08/28/10: implemented for Strife support +// haleyjd 08/28/10: Patch clipping callback, implemented to support Choco +// Strife. +typedef boolean (*vpatchclipfunc_t)(patch_t *, int, int); +void V_SetPatchClipCallback(vpatchclipfunc_t func); + + +// Allocates buffer screens, call before R_Init. +void V_Init (void); + +// Draw a block from the specified source screen to the screen. + +void V_CopyRect(int srcx, int srcy, byte *source, + int width, int height, + int destx, int desty); + +void V_DrawPatch(int x, int y, patch_t *patch); +void V_DrawPatchFlipped(int x, int y, patch_t *patch); +void V_DrawTLPatch(int x, int y, patch_t *patch); +void V_DrawAltTLPatch(int x, int y, patch_t * patch); +void V_DrawShadowedPatch(int x, int y, patch_t *patch); +void V_DrawXlaPatch(int x, int y, patch_t * patch); // villsa [STRIFE] +void V_DrawPatchDirect(int x, int y, patch_t *patch); + +// Draw a linear block of pixels into the view buffer. + +void V_DrawBlock(int x, int y, int width, int height, byte *src); + +void V_MarkRect(int x, int y, int width, int height); + +void V_DrawFilledBox(int x, int y, int w, int h, int c); +void V_DrawHorizLine(int x, int y, int w, int c); +void V_DrawVertLine(int x, int y, int h, int c); +void V_DrawBox(int x, int y, int w, int h, int c); + +// Draw a raw screen lump + +void V_DrawRawScreen(byte *raw); + +// Temporarily switch to using a different buffer to draw graphics, etc. + +void V_UseBuffer(byte *buffer); + +// Return to using the normal screen buffer to draw graphics. + +void V_RestoreBuffer(void); + +// Save a screenshot of the current screen to a file, named in the +// format described in the string passed to the function, eg. +// "DOOM%02i.pcx" + +void V_ScreenShot(char *format); + +// Load the lookup table for translucency calculations from the TINTTAB +// lump. + +void V_LoadTintTable(void); + +// villsa [STRIFE] +// Load the lookup table for translucency calculations from the XLATAB +// lump. + +void V_LoadXlaTable(void); + +void V_DrawMouseSpeedBox(int speed); + +#endif + diff --git a/firmware_p4/components/Applications/doom/w_checksum.c b/firmware_p4/components/Applications/doom/w_checksum.c new file mode 100644 index 000000000..5933fdf9a --- /dev/null +++ b/firmware_p4/components/Applications/doom/w_checksum.c @@ -0,0 +1,87 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Generate a checksum of the WAD directory. +// + +#include +#include +#include + +#include "m_misc.h" +#include "sha1.h" +#include "w_checksum.h" +#include "w_wad.h" + +static wad_file_t **open_wadfiles = NULL; +static int num_open_wadfiles = 0; + +static int GetFileNumber(wad_file_t *handle) +{ + int i; + int result; + + for (i=0; iname, sizeof(buf)); + SHA1_UpdateString(sha1_context, buf); + SHA1_UpdateInt32(sha1_context, GetFileNumber(lump->wad_file)); + SHA1_UpdateInt32(sha1_context, lump->position); + SHA1_UpdateInt32(sha1_context, lump->size); +} + +void W_Checksum(sha1_digest_t digest) +{ + sha1_context_t sha1_context; + unsigned int i; + + SHA1_Init(&sha1_context); + + num_open_wadfiles = 0; + + // Go through each entry in the WAD directory, adding information + // about each entry to the SHA1 hash. + + for (i=0; i + +#include "config.h" + +#include "doomtype.h" +#include "m_argv.h" + +#include "w_file.h" + +extern wad_file_class_t stdc_wad_file; + +/* +#ifdef _WIN32 +extern wad_file_class_t win32_wad_file; +#endif +*/ + +#ifdef HAVE_MMAP +extern wad_file_class_t posix_wad_file; +#endif + +static wad_file_class_t *wad_file_classes[] = +{ +/* +#ifdef _WIN32 + &win32_wad_file, +#endif +*/ +#ifdef HAVE_MMAP + &posix_wad_file, +#endif + &stdc_wad_file, +}; + +wad_file_t *W_OpenFile(char *path) +{ + wad_file_t *result; + int i; + + //! + // Use the OS's virtual memory subsystem to map WAD files + // directly into memory. + // + + if (!M_CheckParm("-mmap")) + { + return stdc_wad_file.OpenFile(path); + } + + // Try all classes in order until we find one that works + + result = NULL; + + for (i = 0; i < arrlen(wad_file_classes); ++i) + { + result = wad_file_classes[i]->OpenFile(path); + + if (result != NULL) + { + break; + } + } + + return result; +} + +void W_CloseFile(wad_file_t *wad) +{ + wad->file_class->CloseFile(wad); +} + +size_t W_Read(wad_file_t *wad, unsigned int offset, + void *buffer, size_t buffer_len) +{ + return wad->file_class->Read(wad, offset, buffer, buffer_len); +} + diff --git a/firmware_p4/components/Applications/doom/w_file.h b/firmware_p4/components/Applications/doom/w_file.h new file mode 100644 index 000000000..f57781436 --- /dev/null +++ b/firmware_p4/components/Applications/doom/w_file.h @@ -0,0 +1,78 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// WAD I/O functions. +// + + +#ifndef __W_FILE__ +#define __W_FILE__ + +#include +#include "doomtype.h" + +typedef struct _wad_file_s wad_file_t; + +typedef struct +{ + // Open a file for reading. + + wad_file_t *(*OpenFile)(char *path); + + // Close the specified file. + + void (*CloseFile)(wad_file_t *file); + + // Read data from the specified position in the file into the + // provided buffer. Returns the number of bytes read. + + size_t (*Read)(wad_file_t *file, unsigned int offset, + void *buffer, size_t buffer_len); + +} wad_file_class_t; + +struct _wad_file_s +{ + // Class of this file. + + wad_file_class_t *file_class; + + // If this is NULL, the file cannot be mapped into memory. If this + // is non-NULL, it is a pointer to the mapped file. + + byte *mapped; + + // Length of the file, in bytes. + + unsigned int length; +}; + +// Open the specified file. Returns a pointer to a new wad_file_t +// handle for the WAD file, or NULL if it could not be opened. + +wad_file_t *W_OpenFile(char *path); + +// Close the specified WAD file. + +void W_CloseFile(wad_file_t *wad); + +// Read data from the specified file into the provided buffer. The +// data is read from the specified offset from the start of the file. +// Returns the number of bytes read. + +size_t W_Read(wad_file_t *wad, unsigned int offset, + void *buffer, size_t buffer_len); + +#endif /* #ifndef __W_FILE__ */ diff --git a/firmware_p4/components/Applications/doom/w_file_stdc.c b/firmware_p4/components/Applications/doom/w_file_stdc.c new file mode 100644 index 000000000..829e96037 --- /dev/null +++ b/firmware_p4/components/Applications/doom/w_file_stdc.c @@ -0,0 +1,96 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// WAD I/O functions. +// + +#include + +#include "m_misc.h" +#include "w_file.h" +#include "z_zone.h" + +typedef struct +{ + wad_file_t wad; + FILE *fstream; +} stdc_wad_file_t; + +extern wad_file_class_t stdc_wad_file; + +static wad_file_t *W_StdC_OpenFile(char *path) +{ + stdc_wad_file_t *result; + FILE *fstream; + + fstream = fopen(path, "rb"); + + if (fstream == NULL) + { + return NULL; + } + + // Create a new stdc_wad_file_t to hold the file handle. + + result = Z_Malloc(sizeof(stdc_wad_file_t), PU_STATIC, 0); + result->wad.file_class = &stdc_wad_file; + result->wad.mapped = NULL; + result->wad.length = M_FileLength(fstream); + result->fstream = fstream; + + return &result->wad; +} + +static void W_StdC_CloseFile(wad_file_t *wad) +{ + stdc_wad_file_t *stdc_wad; + + stdc_wad = (stdc_wad_file_t *) wad; + + fclose(stdc_wad->fstream); + Z_Free(stdc_wad); +} + +// Read data from the specified position in the file into the +// provided buffer. Returns the number of bytes read. + +size_t W_StdC_Read(wad_file_t *wad, unsigned int offset, + void *buffer, size_t buffer_len) +{ + stdc_wad_file_t *stdc_wad; + size_t result; + + stdc_wad = (stdc_wad_file_t *) wad; + + // Jump to the specified position in the file. + + fseek(stdc_wad->fstream, offset, SEEK_SET); + + // Read into the buffer. + + result = fread(buffer, 1, buffer_len, stdc_wad->fstream); + + return result; +} + + +wad_file_class_t stdc_wad_file = +{ + W_StdC_OpenFile, + W_StdC_CloseFile, + W_StdC_Read, +}; + + diff --git a/firmware_p4/components/Applications/doom/w_main.c b/firmware_p4/components/Applications/doom/w_main.c new file mode 100644 index 000000000..115f08116 --- /dev/null +++ b/firmware_p4/components/Applications/doom/w_main.c @@ -0,0 +1,198 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Common code to parse command line, identifying WAD files to load. +// + +#include "doomfeatures.h" +#include "d_iwad.h" +#include "m_argv.h" +#include "w_main.h" +#include "w_merge.h" +#include "w_wad.h" +#include "z_zone.h" + +// Parse the command line, merging WAD files that are sppecified. +// Returns true if at least one file was added. + +boolean W_ParseCommandLine(void) +{ + boolean modifiedgame = false; + int p; + +#ifdef FEATURE_WAD_MERGE + + // Merged PWADs are loaded first, because they are supposed to be + // modified IWADs. + + //! + // @arg + // @category mod + // + // Simulates the behavior of deutex's -merge option, merging a PWAD + // into the main IWAD. Multiple files may be specified. + // + + p = M_CheckParmWithArgs("-merge", 1); + + if (p > 0) + { + for (p = p + 1; p + // @category mod + // + // Simulates the behavior of NWT's -merge option. Multiple files + // may be specified. + + p = M_CheckParmWithArgs("-nwtmerge", 1); + + if (p > 0) + { + for (p = p + 1; p + // @category mod + // + // Simulates the behavior of NWT's -af option, merging flats into + // the main IWAD directory. Multiple files may be specified. + // + + p = M_CheckParmWithArgs("-af", 1); + + if (p > 0) + { + for (p = p + 1; p + // @category mod + // + // Simulates the behavior of NWT's -as option, merging sprites + // into the main IWAD directory. Multiple files may be specified. + // + + p = M_CheckParmWithArgs("-as", 1); + + if (p > 0) + { + for (p = p + 1; p + // @category mod + // + // Equivalent to "-af -as ". + // + + p = M_CheckParmWithArgs("-aa", 1); + + if (p > 0) + { + for (p = p + 1; p + // @vanilla + // + // Load the specified PWAD files. + // + + p = M_CheckParmWithArgs ("-file", 1); + if (p) + { + // the parms after p are wadfile/lump names, + // until end of parms or another - preceded parm + modifiedgame = true; // homebrew levels + while (++p != myargc && myargv[p][0] != '-') + { + char *filename; + + filename = D_TryFindWADByName(myargv[p]); + + printf(" adding %s\n", filename); + W_AddFile(filename); + } + } + +// W_PrintDirectory(); + + return modifiedgame; +} + diff --git a/firmware_p4/components/Applications/doom/w_main.h b/firmware_p4/components/Applications/doom/w_main.h new file mode 100644 index 000000000..2e39efc36 --- /dev/null +++ b/firmware_p4/components/Applications/doom/w_main.h @@ -0,0 +1,24 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Common code to parse command line, identifying WAD files to load. +// + +#ifndef W_MAIN_H +#define W_MAIN_H + +boolean W_ParseCommandLine(void); + +#endif /* #ifndef W_MAIN_H */ + diff --git a/firmware_p4/components/Applications/doom/w_merge.h b/firmware_p4/components/Applications/doom/w_merge.h new file mode 100644 index 000000000..c8ecc69f4 --- /dev/null +++ b/firmware_p4/components/Applications/doom/w_merge.h @@ -0,0 +1,44 @@ +// +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Handles merging of PWADs, similar to deutex's -merge option +// +// Ideally this should work exactly the same as in deutex, but trying to +// read the deutex source code made my brain hurt. +// + +#ifndef W_MERGE_H +#define W_MERGE_H + +#define W_NWT_MERGE_SPRITES 0x1 +#define W_NWT_MERGE_FLATS 0x2 + +// Add a new WAD and merge it into the main directory + +void W_MergeFile(char *filename); + +// NWT-style merging + +void W_NWTMergeFile(char *filename, int flags); + +// Acts the same as NWT's "-merge" option. + +void W_NWTDashMerge(char *filename); + +// Debug function that prints the WAD directory. + +void W_PrintDirectory(void); + +#endif /* #ifndef W_MERGE_H */ + diff --git a/firmware_p4/components/Applications/doom/w_wad.c b/firmware_p4/components/Applications/doom/w_wad.c new file mode 100644 index 000000000..124804639 --- /dev/null +++ b/firmware_p4/components/Applications/doom/w_wad.c @@ -0,0 +1,612 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Handles WAD file header, directory, lump I/O. +// + + + + +#include +#include +#include +#include + +#include "doomtype.h" + +#include "config.h" +#include "d_iwad.h" +#include "i_swap.h" +#include "i_system.h" +#include "i_video.h" +#include "m_misc.h" +#include "z_zone.h" + +#include "w_wad.h" + +typedef struct +{ + // Should be "IWAD" or "PWAD". + char identification[4]; + int numlumps; + int infotableofs; +} PACKEDATTR wadinfo_t; + + +typedef struct +{ + int filepos; + int size; + char name[8]; +} PACKEDATTR filelump_t; + +// +// GLOBALS +// + +// Location of each lump on disk. + +lumpinfo_t *lumpinfo; +unsigned int numlumps = 0; + +// Hash table for fast lookups + +static lumpinfo_t **lumphash; + +// Hash function used for lump names. + +unsigned int W_LumpNameHash(const char *s) +{ + // This is the djb2 string hash function, modded to work on strings + // that have a maximum length of 8. + + unsigned int result = 5381; + unsigned int i; + + for (i=0; i < 8 && s[i] != '\0'; ++i) + { + result = ((result << 5) ^ result ) ^ toupper((int)s[i]); + } + + return result; +} + +// Increase the size of the lumpinfo[] array to the specified size. +static void ExtendLumpInfo(int newnumlumps) +{ + lumpinfo_t *newlumpinfo; + unsigned int i; + + newlumpinfo = calloc(newnumlumps, sizeof(lumpinfo_t)); + + if (newlumpinfo == NULL) + { + I_Error ("Couldn't realloc lumpinfo"); + } + + // Copy over lumpinfo_t structures from the old array. If any of + // these lumps have been cached, we need to update the user + // pointers to the new location. + for (i = 0; i < numlumps && i < newnumlumps; ++i) + { + memcpy(&newlumpinfo[i], &lumpinfo[i], sizeof(lumpinfo_t)); + + if (newlumpinfo[i].cache != NULL) + { + Z_ChangeUser(newlumpinfo[i].cache, &newlumpinfo[i].cache); + } + + // We shouldn't be generating a hash table until after all WADs have + // been loaded, but just in case... + if (lumpinfo[i].next != NULL) + { + int nextlumpnum = lumpinfo[i].next - lumpinfo; + newlumpinfo[i].next = &newlumpinfo[nextlumpnum]; + } + } + + // All done. + free(lumpinfo); + lumpinfo = newlumpinfo; + numlumps = newnumlumps; +} + +// +// LUMP BASED ROUTINES. +// + +// +// W_AddFile +// All files are optional, but at least one file must be +// found (PWAD, if all required lumps are present). +// Files with a .wad extension are wadlink files +// with multiple lumps. +// Other files are single lumps with the base filename +// for the lump name. + +wad_file_t *W_AddFile (char *filename) +{ + wadinfo_t header; + lumpinfo_t *lump_p; + unsigned int i; + wad_file_t *wad_file; + int length; + int startlump; + filelump_t *fileinfo; + filelump_t *filerover; + int newnumlumps; + + // open the file and add to directory + + wad_file = W_OpenFile(filename); + + if (wad_file == NULL) + { + printf (" couldn't open %s\n", filename); + return NULL; + } + + newnumlumps = numlumps; + + if (strcasecmp(filename+strlen(filename)-3 , "wad" ) ) + { + // single lump file + + // fraggle: Swap the filepos and size here. The WAD directory + // parsing code expects a little-endian directory, so will swap + // them back. Effectively we're constructing a "fake WAD directory" + // here, as it would appear on disk. + + fileinfo = Z_Malloc(sizeof(filelump_t), PU_STATIC, 0); + fileinfo->filepos = LONG(0); + fileinfo->size = LONG(wad_file->length); + + // Name the lump after the base of the filename (without the + // extension). + + M_ExtractFileBase (filename, fileinfo->name); + newnumlumps++; + } + else + { + // WAD file + W_Read(wad_file, 0, &header, sizeof(header)); + + if (strncmp(header.identification,"IWAD",4)) + { + // Homebrew levels? + if (strncmp(header.identification,"PWAD",4)) + { + I_Error ("Wad file %s doesn't have IWAD " + "or PWAD id\n", filename); + } + + // ???modifiedgame = true; + } + + header.numlumps = LONG(header.numlumps); + header.infotableofs = LONG(header.infotableofs); + length = header.numlumps*sizeof(filelump_t); + fileinfo = Z_Malloc(length, PU_STATIC, 0); + + W_Read(wad_file, header.infotableofs, fileinfo, length); + newnumlumps += header.numlumps; + } + + // Increase size of numlumps array to accomodate the new file. + startlump = numlumps; + ExtendLumpInfo(newnumlumps); + + lump_p = &lumpinfo[startlump]; + + filerover = fileinfo; + + for (i=startlump; iwad_file = wad_file; + lump_p->position = LONG(filerover->filepos); + lump_p->size = LONG(filerover->size); + lump_p->cache = NULL; + strncpy(lump_p->name, filerover->name, 8); + + ++lump_p; + ++filerover; + } + + Z_Free(fileinfo); + + if (lumphash != NULL) + { + Z_Free(lumphash); + lumphash = NULL; + } + + return wad_file; +} + + + +// +// W_NumLumps +// +int W_NumLumps (void) +{ + return numlumps; +} + + + +// +// W_CheckNumForName +// Returns -1 if name not found. +// + +int W_CheckNumForName (char* name) +{ + lumpinfo_t *lump_p; + int i; + + // Do we have a hash table yet? + + if (lumphash != NULL) + { + int hash; + + // We do! Excellent. + + hash = W_LumpNameHash(name) % numlumps; + + for (lump_p = lumphash[hash]; lump_p != NULL; lump_p = lump_p->next) + { + if (!strncasecmp(lump_p->name, name, 8)) + { + return lump_p - lumpinfo; + } + } + } + else + { + // We don't have a hash table generate yet. Linear search :-( + // + // scan backwards so patch lump files take precedence + + for (i=numlumps-1; i >= 0; --i) + { + if (!strncasecmp(lumpinfo[i].name, name, 8)) + { + return i; + } + } + } + + // TFB. Not found. + + return -1; +} + + + + +// +// W_GetNumForName +// Calls W_CheckNumForName, but bombs out if not found. +// +int W_GetNumForName (char* name) +{ + int i; + + i = W_CheckNumForName (name); + + if (i < 0) + { + I_Error ("W_GetNumForName: %s not found!", name); + } + + return i; +} + + +// +// W_LumpLength +// Returns the buffer size needed to load the given lump. +// +int W_LumpLength (unsigned int lump) +{ + if (lump >= numlumps) + { + I_Error ("W_LumpLength: %i >= numlumps", lump); + } + + return lumpinfo[lump].size; +} + + + +// +// W_ReadLump +// Loads the lump into the given buffer, +// which must be >= W_LumpLength(). +// +void W_ReadLump(unsigned int lump, void *dest) +{ + int c; + lumpinfo_t *l; + + if (lump >= numlumps) + { + I_Error ("W_ReadLump: %i >= numlumps", lump); + } + + l = lumpinfo+lump; + + I_BeginRead (); + + c = W_Read(l->wad_file, l->position, dest, l->size); + + if (c < l->size) + { + I_Error ("W_ReadLump: only read %i of %i on lump %i", + c, l->size, lump); + } + + I_EndRead (); +} + + + + +// +// W_CacheLumpNum +// +// Load a lump into memory and return a pointer to a buffer containing +// the lump data. +// +// 'tag' is the type of zone memory buffer to allocate for the lump +// (usually PU_STATIC or PU_CACHE). If the lump is loaded as +// PU_STATIC, it should be released back using W_ReleaseLumpNum +// when no longer needed (do not use Z_ChangeTag). +// + +void *W_CacheLumpNum(int lumpnum, int tag) +{ + byte *result; + lumpinfo_t *lump; + + if ((unsigned)lumpnum >= numlumps) + { + I_Error ("W_CacheLumpNum: %i >= numlumps", lumpnum); + } + + lump = &lumpinfo[lumpnum]; + + // Get the pointer to return. If the lump is in a memory-mapped + // file, we can just return a pointer to within the memory-mapped + // region. If the lump is in an ordinary file, we may already + // have it cached; otherwise, load it into memory. + + if (lump->wad_file->mapped != NULL) + { + // Memory mapped file, return from the mmapped region. + + result = lump->wad_file->mapped + lump->position; + } + else if (lump->cache != NULL) + { + // Already cached, so just switch the zone tag. + + result = lump->cache; + Z_ChangeTag(lump->cache, tag); + } + else + { + // Not yet loaded, so load it now + + lump->cache = Z_Malloc(W_LumpLength(lumpnum), tag, &lump->cache); + W_ReadLump (lumpnum, lump->cache); + result = lump->cache; + } + + return result; +} + + + +// +// W_CacheLumpName +// +void *W_CacheLumpName(char *name, int tag) +{ + return W_CacheLumpNum(W_GetNumForName(name), tag); +} + +// +// Release a lump back to the cache, so that it can be reused later +// without having to read from disk again, or alternatively, discarded +// if we run out of memory. +// +// Back in Vanilla Doom, this was just done using Z_ChangeTag +// directly, but now that we have WAD mmap, things are a bit more +// complicated ... +// + +void W_ReleaseLumpNum(int lumpnum) +{ + lumpinfo_t *lump; + + if ((unsigned)lumpnum >= numlumps) + { + I_Error ("W_ReleaseLumpNum: %i >= numlumps", lumpnum); + } + + lump = &lumpinfo[lumpnum]; + + if (lump->wad_file->mapped != NULL) + { + // Memory-mapped file, so nothing needs to be done here. + } + else + { + Z_ChangeTag(lump->cache, PU_CACHE); + } +} + +void W_ReleaseLumpName(char *name) +{ + W_ReleaseLumpNum(W_GetNumForName(name)); +} + +#if 0 + +// +// W_Profile +// +int info[2500][10]; +int profilecount; + +void W_Profile (void) +{ + int i; + memblock_t* block; + void* ptr; + char ch; + FILE* f; + int j; + char name[9]; + + + for (i=0 ; itag < PU_PURGELEVEL) + ch = 'S'; + else + ch = 'P'; + } + info[i][profilecount] = ch; + } + profilecount++; +#if ORIGCODE + f = fopen ("waddump.txt","w"); + name[8] = 0; + + for (i=0 ; i 0) + { + lumphash = Z_Malloc(sizeof(lumpinfo_t *) * numlumps, PU_STATIC, NULL); + memset(lumphash, 0, sizeof(lumpinfo_t *) * numlumps); + + for (i=0; i= 0) + { + I_Error("\nYou are trying to use a %s IWAD file with " + "the %s%s binary.\nThis isn't going to work.\n" + "You probably want to use the %s%s binary.", + D_SuggestGameName(unique_lumps[i].mission, + indetermined), + PROGRAM_PREFIX, + D_GameMissionString(mission), + PROGRAM_PREFIX, + D_GameMissionString(unique_lumps[i].mission)); + } + } + } +} + diff --git a/firmware_p4/components/Applications/doom/w_wad.h b/firmware_p4/components/Applications/doom/w_wad.h new file mode 100644 index 000000000..718957499 --- /dev/null +++ b/firmware_p4/components/Applications/doom/w_wad.h @@ -0,0 +1,78 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// WAD I/O functions. +// + + +#ifndef __W_WAD__ +#define __W_WAD__ + +#include + +#include "doomtype.h" +#include "d_mode.h" + +#include "w_file.h" + + +// +// TYPES +// + +// +// WADFILE I/O related stuff. +// + +typedef struct lumpinfo_s lumpinfo_t; + +struct lumpinfo_s +{ + char name[8]; + wad_file_t *wad_file; + int position; + int size; + void *cache; + + // Used for hash table lookups + + lumpinfo_t *next; +}; + + +extern lumpinfo_t *lumpinfo; +extern unsigned int numlumps; + +wad_file_t *W_AddFile (char *filename); + +int W_CheckNumForName (char* name); +int W_GetNumForName (char* name); + +int W_LumpLength (unsigned int lump); +void W_ReadLump (unsigned int lump, void *dest); + +void* W_CacheLumpNum (int lump, int tag); +void* W_CacheLumpName (char* name, int tag); + +void W_GenerateHashTable(void); + +extern unsigned int W_LumpNameHash(const char *s); + +void W_ReleaseLumpNum(int lump); +void W_ReleaseLumpName(char *name); + +void W_CheckCorrectIWAD(GameMission_t mission); + +#endif diff --git a/firmware_p4/components/Applications/doom/wi_stuff.c b/firmware_p4/components/Applications/doom/wi_stuff.c new file mode 100644 index 000000000..ddb9a66c1 --- /dev/null +++ b/firmware_p4/components/Applications/doom/wi_stuff.c @@ -0,0 +1,1829 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Intermission screens. +// + + +#include + +#include "z_zone.h" + +#include "m_misc.h" +#include "m_random.h" + +#include "deh_main.h" +#include "i_swap.h" +#include "i_system.h" + +#include "w_wad.h" + +#include "g_game.h" + +#include "r_local.h" +#include "s_sound.h" + +#include "doomstat.h" + +// Data. +#include "sounds.h" + +// Needs access to LFB. +#include "v_video.h" + +#include "wi_stuff.h" + +// +// Data needed to add patches to full screen intermission pics. +// Patches are statistics messages, and animations. +// Loads of by-pixel layout and placement, offsets etc. +// + + +// +// Different vetween registered DOOM (1994) and +// Ultimate DOOM - Final edition (retail, 1995?). +// This is supposedly ignored for commercial +// release (aka DOOM II), which had 34 maps +// in one episode. So there. +#define NUMEPISODES 4 +#define NUMMAPS 9 + + +// in tics +//U #define PAUSELEN (TICRATE*2) +//U #define SCORESTEP 100 +//U #define ANIMPERIOD 32 +// pixel distance from "(YOU)" to "PLAYER N" +//U #define STARDIST 10 +//U #define WK 1 + + +// GLOBAL LOCATIONS +#define WI_TITLEY 2 +#define WI_SPACINGY 33 + +// SINGPLE-PLAYER STUFF +#define SP_STATSX 50 +#define SP_STATSY 50 + +#define SP_TIMEX 16 +#define SP_TIMEY (SCREENHEIGHT-32) + + +// NET GAME STUFF +#define NG_STATSY 50 +#define NG_STATSX (32 + SHORT(star->width)/2 + 32*!dofrags) + +#define NG_SPACINGX 64 + + +// DEATHMATCH STUFF +#define DM_MATRIXX 42 +#define DM_MATRIXY 68 + +#define DM_SPACINGX 40 + +#define DM_TOTALSX 269 + +#define DM_KILLERSX 10 +#define DM_KILLERSY 100 +#define DM_VICTIMSX 5 +#define DM_VICTIMSY 50 + + + + +typedef enum +{ + ANIM_ALWAYS, + ANIM_RANDOM, + ANIM_LEVEL + +} animenum_t; + +typedef struct +{ + int x; + int y; + +} point_t; + + +// +// Animation. +// There is another anim_t used in p_spec. +// +typedef struct +{ + animenum_t type; + + // period in tics between animations + int period; + + // number of animation frames + int nanims; + + // location of animation + point_t loc; + + // ALWAYS: n/a, + // RANDOM: period deviation (<256), + // LEVEL: level + int data1; + + // ALWAYS: n/a, + // RANDOM: random base period, + // LEVEL: n/a + int data2; + + // actual graphics for frames of animations + patch_t* p[3]; + + // following must be initialized to zero before use! + + // next value of bcnt (used in conjunction with period) + int nexttic; + + // last drawn animation frame + int lastdrawn; + + // next frame number to animate + int ctr; + + // used by RANDOM and LEVEL when animating + int state; + +} anim_t; + + +static point_t lnodes[NUMEPISODES][NUMMAPS] = +{ + // Episode 0 World Map + { + { 185, 164 }, // location of level 0 (CJ) + { 148, 143 }, // location of level 1 (CJ) + { 69, 122 }, // location of level 2 (CJ) + { 209, 102 }, // location of level 3 (CJ) + { 116, 89 }, // location of level 4 (CJ) + { 166, 55 }, // location of level 5 (CJ) + { 71, 56 }, // location of level 6 (CJ) + { 135, 29 }, // location of level 7 (CJ) + { 71, 24 } // location of level 8 (CJ) + }, + + // Episode 1 World Map should go here + { + { 254, 25 }, // location of level 0 (CJ) + { 97, 50 }, // location of level 1 (CJ) + { 188, 64 }, // location of level 2 (CJ) + { 128, 78 }, // location of level 3 (CJ) + { 214, 92 }, // location of level 4 (CJ) + { 133, 130 }, // location of level 5 (CJ) + { 208, 136 }, // location of level 6 (CJ) + { 148, 140 }, // location of level 7 (CJ) + { 235, 158 } // location of level 8 (CJ) + }, + + // Episode 2 World Map should go here + { + { 156, 168 }, // location of level 0 (CJ) + { 48, 154 }, // location of level 1 (CJ) + { 174, 95 }, // location of level 2 (CJ) + { 265, 75 }, // location of level 3 (CJ) + { 130, 48 }, // location of level 4 (CJ) + { 279, 23 }, // location of level 5 (CJ) + { 198, 48 }, // location of level 6 (CJ) + { 140, 25 }, // location of level 7 (CJ) + { 281, 136 } // location of level 8 (CJ) + } + +}; + + +// +// Animation locations for episode 0 (1). +// Using patches saves a lot of space, +// as they replace 320x200 full screen frames. +// + +#define ANIM(type, period, nanims, x, y, nexttic) \ + { (type), (period), (nanims), { (x), (y) }, (nexttic), \ + 0, { NULL, NULL, NULL }, 0, 0, 0, 0 } + + +static anim_t epsd0animinfo[] = +{ + ANIM(ANIM_ALWAYS, TICRATE/3, 3, 224, 104, 0), + ANIM(ANIM_ALWAYS, TICRATE/3, 3, 184, 160, 0), + ANIM(ANIM_ALWAYS, TICRATE/3, 3, 112, 136, 0), + ANIM(ANIM_ALWAYS, TICRATE/3, 3, 72, 112, 0), + ANIM(ANIM_ALWAYS, TICRATE/3, 3, 88, 96, 0), + ANIM(ANIM_ALWAYS, TICRATE/3, 3, 64, 48, 0), + ANIM(ANIM_ALWAYS, TICRATE/3, 3, 192, 40, 0), + ANIM(ANIM_ALWAYS, TICRATE/3, 3, 136, 16, 0), + ANIM(ANIM_ALWAYS, TICRATE/3, 3, 80, 16, 0), + ANIM(ANIM_ALWAYS, TICRATE/3, 3, 64, 24, 0), +}; + +static anim_t epsd1animinfo[] = +{ + ANIM(ANIM_LEVEL, TICRATE/3, 1, 128, 136, 1), + ANIM(ANIM_LEVEL, TICRATE/3, 1, 128, 136, 2), + ANIM(ANIM_LEVEL, TICRATE/3, 1, 128, 136, 3), + ANIM(ANIM_LEVEL, TICRATE/3, 1, 128, 136, 4), + ANIM(ANIM_LEVEL, TICRATE/3, 1, 128, 136, 5), + ANIM(ANIM_LEVEL, TICRATE/3, 1, 128, 136, 6), + ANIM(ANIM_LEVEL, TICRATE/3, 1, 128, 136, 7), + ANIM(ANIM_LEVEL, TICRATE/3, 3, 192, 144, 8), + ANIM(ANIM_LEVEL, TICRATE/3, 1, 128, 136, 8), +}; + +static anim_t epsd2animinfo[] = +{ + ANIM(ANIM_ALWAYS, TICRATE/3, 3, 104, 168, 0), + ANIM(ANIM_ALWAYS, TICRATE/3, 3, 40, 136, 0), + ANIM(ANIM_ALWAYS, TICRATE/3, 3, 160, 96, 0), + ANIM(ANIM_ALWAYS, TICRATE/3, 3, 104, 80, 0), + ANIM(ANIM_ALWAYS, TICRATE/3, 3, 120, 32, 0), + ANIM(ANIM_ALWAYS, TICRATE/4, 3, 40, 0, 0), +}; + +static int NUMANIMS[NUMEPISODES] = +{ + arrlen(epsd0animinfo), + arrlen(epsd1animinfo), + arrlen(epsd2animinfo), +}; + +static anim_t *anims[NUMEPISODES] = +{ + epsd0animinfo, + epsd1animinfo, + epsd2animinfo +}; + + +// +// GENERAL DATA +// + +// +// Locally used stuff. +// + +// States for single-player +#define SP_KILLS 0 +#define SP_ITEMS 2 +#define SP_SECRET 4 +#define SP_FRAGS 6 +#define SP_TIME 8 +#define SP_PAR ST_TIME + +#define SP_PAUSE 1 + +// in seconds +#define SHOWNEXTLOCDELAY 4 +//#define SHOWLASTLOCDELAY SHOWNEXTLOCDELAY + + +// used to accelerate or skip a stage +static int acceleratestage; + +// wbs->pnum +static int me; + + // specifies current state +static stateenum_t state; + +// contains information passed into intermission +static wbstartstruct_t* wbs; + +static wbplayerstruct_t* plrs; // wbs->plyr[] + +// used for general timing +static int cnt; + +// used for timing of background animation +static int bcnt; + +// signals to refresh everything for one frame +static int firstrefresh; + +static int cnt_kills[MAXPLAYERS]; +static int cnt_items[MAXPLAYERS]; +static int cnt_secret[MAXPLAYERS]; +static int cnt_time; +static int cnt_par; +static int cnt_pause; + +// # of commercial levels +static int NUMCMAPS; + + +// +// GRAPHICS +// + +// You Are Here graphic +static patch_t* yah[3] = { NULL, NULL, NULL }; + +// splat +static patch_t* splat[2] = { NULL, NULL }; + +// %, : graphics +static patch_t* percent; +static patch_t* colon; + +// 0-9 graphic +static patch_t* num[10]; + +// minus sign +static patch_t* wiminus; + +// "Finished!" graphics +static patch_t* finished; + +// "Entering" graphic +static patch_t* entering; + +// "secret" +static patch_t* sp_secret; + + // "Kills", "Scrt", "Items", "Frags" +static patch_t* kills; +static patch_t* secret; +static patch_t* items; +static patch_t* frags; + +// Time sucks. +static patch_t* timepatch; +static patch_t* par; +static patch_t* sucks; + +// "killers", "victims" +static patch_t* killers; +static patch_t* victims; + +// "Total", your face, your dead face +static patch_t* total; +static patch_t* star; +static patch_t* bstar; + +// "red P[1..MAXPLAYERS]" +static patch_t* p[MAXPLAYERS]; + +// "gray P[1..MAXPLAYERS]" +static patch_t* bp[MAXPLAYERS]; + + // Name graphics of each level (centered) +static patch_t** lnames; + +// Buffer storing the backdrop +static patch_t *background; + +// +// CODE +// + +// slam background +void WI_slamBackground(void) +{ + V_DrawPatch(0, 0, background); +} + +// The ticker is used to detect keys +// because of timing issues in netgames. +boolean WI_Responder(event_t* ev) +{ + return false; +} + + +// Draws " Finished!" +void WI_drawLF(void) +{ + int y = WI_TITLEY; + + if (gamemode != commercial || wbs->last < NUMCMAPS) + { + // draw + V_DrawPatch((SCREENWIDTH - SHORT(lnames[wbs->last]->width))/2, + y, lnames[wbs->last]); + + // draw "Finished!" + y += (5*SHORT(lnames[wbs->last]->height))/4; + + V_DrawPatch((SCREENWIDTH - SHORT(finished->width)) / 2, y, finished); + } + else if (wbs->last == NUMCMAPS) + { + // MAP33 - nothing is displayed! + } + else if (wbs->last > NUMCMAPS) + { + // > MAP33. Doom bombs out here with a Bad V_DrawPatch error. + // I'm pretty sure that doom2.exe is just reading into random + // bits of memory at this point, but let's try to be accurate + // anyway. This deliberately triggers a V_DrawPatch error. + + patch_t tmp = { SCREENWIDTH, SCREENHEIGHT, 1, 1, + { 0, 0, 0, 0, 0, 0, 0, 0 } }; + + V_DrawPatch(0, y, &tmp); + } +} + + + +// Draws "Entering " +void WI_drawEL(void) +{ + int y = WI_TITLEY; + + // draw "Entering" + V_DrawPatch((SCREENWIDTH - SHORT(entering->width))/2, + y, + entering); + + // draw level + y += (5*SHORT(lnames[wbs->next]->height))/4; + + V_DrawPatch((SCREENWIDTH - SHORT(lnames[wbs->next]->width))/2, + y, + lnames[wbs->next]); + +} + +void +WI_drawOnLnode +( int n, + patch_t* c[] ) +{ + + int i; + int left; + int top; + int right; + int bottom; + boolean fits = false; + + i = 0; + do + { + left = lnodes[wbs->epsd][n].x - SHORT(c[i]->leftoffset); + top = lnodes[wbs->epsd][n].y - SHORT(c[i]->topoffset); + right = left + SHORT(c[i]->width); + bottom = top + SHORT(c[i]->height); + + if (left >= 0 + && right < SCREENWIDTH + && top >= 0 + && bottom < SCREENHEIGHT) + { + fits = true; + } + else + { + i++; + } + } while (!fits && i!=2 && c[i] != NULL); + + if (fits && i<2) + { + V_DrawPatch(lnodes[wbs->epsd][n].x, + lnodes[wbs->epsd][n].y, + c[i]); + } + else + { + // DEBUG + printf("Could not place patch on level %d", n+1); + } +} + + + +void WI_initAnimatedBack(void) +{ + int i; + anim_t* a; + + if (gamemode == commercial) + return; + + if (wbs->epsd > 2) + return; + + for (i=0;iepsd];i++) + { + a = &anims[wbs->epsd][i]; + + // init variables + a->ctr = -1; + + // specify the next time to draw it + if (a->type == ANIM_ALWAYS) + a->nexttic = bcnt + 1 + (M_Random()%a->period); + else if (a->type == ANIM_RANDOM) + a->nexttic = bcnt + 1 + a->data2+(M_Random()%a->data1); + else if (a->type == ANIM_LEVEL) + a->nexttic = bcnt + 1; + } + +} + +void WI_updateAnimatedBack(void) +{ + int i; + anim_t* a; + + if (gamemode == commercial) + return; + + if (wbs->epsd > 2) + return; + + for (i=0;iepsd];i++) + { + a = &anims[wbs->epsd][i]; + + if (bcnt == a->nexttic) + { + switch (a->type) + { + case ANIM_ALWAYS: + if (++a->ctr >= a->nanims) a->ctr = 0; + a->nexttic = bcnt + a->period; + break; + + case ANIM_RANDOM: + a->ctr++; + if (a->ctr == a->nanims) + { + a->ctr = -1; + a->nexttic = bcnt+a->data2+(M_Random()%a->data1); + } + else a->nexttic = bcnt + a->period; + break; + + case ANIM_LEVEL: + // gawd-awful hack for level anims + if (!(state == StatCount && i == 7) + && wbs->next == a->data1) + { + a->ctr++; + if (a->ctr == a->nanims) a->ctr--; + a->nexttic = bcnt + a->period; + } + break; + } + } + + } + +} + +void WI_drawAnimatedBack(void) +{ + int i; + anim_t* a; + + if (gamemode == commercial) + return; + + if (wbs->epsd > 2) + return; + + for (i=0 ; iepsd] ; i++) + { + a = &anims[wbs->epsd][i]; + + if (a->ctr >= 0) + V_DrawPatch(a->loc.x, a->loc.y, a->p[a->ctr]); + } + +} + +// +// Draws a number. +// If digits > 0, then use that many digits minimum, +// otherwise only use as many as necessary. +// Returns new x position. +// + +int +WI_drawNum +( int x, + int y, + int n, + int digits ) +{ + + int fontwidth = SHORT(num[0]->width); + int neg; + int temp; + + if (digits < 0) + { + if (!n) + { + // make variable-length zeros 1 digit long + digits = 1; + } + else + { + // figure out # of digits in # + digits = 0; + temp = n; + + while (temp) + { + temp /= 10; + digits++; + } + } + } + + neg = n < 0; + if (neg) + n = -n; + + // if non-number, do not draw it + if (n == 1994) + return 0; + + // draw the new number + while (digits--) + { + x -= fontwidth; + V_DrawPatch(x, y, num[ n % 10 ]); + n /= 10; + } + + // draw a minus sign if necessary + if (neg) + V_DrawPatch(x-=8, y, wiminus); + + return x; + +} + +void +WI_drawPercent +( int x, + int y, + int p ) +{ + if (p < 0) + return; + + V_DrawPatch(x, y, percent); + WI_drawNum(x, y, p, -1); +} + + + +// +// Display level completion time and par, +// or "sucks" message if overflow. +// +void +WI_drawTime +( int x, + int y, + int t ) +{ + + int div; + int n; + + if (t<0) + return; + + if (t <= 61*59) + { + div = 1; + + do + { + n = (t / div) % 60; + x = WI_drawNum(x, y, n, 2) - SHORT(colon->width); + div *= 60; + + // draw + if (div==60 || t / div) + V_DrawPatch(x, y, colon); + + } while (t / div); + } + else + { + // "sucks" + V_DrawPatch(x - SHORT(sucks->width), y, sucks); + } +} + + +void WI_End(void) +{ + void WI_unloadData(void); + WI_unloadData(); +} + +void WI_initNoState(void) +{ + state = NoState; + acceleratestage = 0; + cnt = 10; +} + +void WI_updateNoState(void) { + + WI_updateAnimatedBack(); + + if (!--cnt) + { + // Don't call WI_End yet. G_WorldDone doesnt immediately + // change gamestate, so WI_Drawer is still going to get + // run until that happens. If we do that after WI_End + // (which unloads all the graphics), we're in trouble. + //WI_End(); + G_WorldDone(); + } + +} + +static boolean snl_pointeron = false; + + +void WI_initShowNextLoc(void) +{ + state = ShowNextLoc; + acceleratestage = 0; + cnt = SHOWNEXTLOCDELAY * TICRATE; + + WI_initAnimatedBack(); +} + +void WI_updateShowNextLoc(void) +{ + WI_updateAnimatedBack(); + + if (!--cnt || acceleratestage) + WI_initNoState(); + else + snl_pointeron = (cnt & 31) < 20; +} + +void WI_drawShowNextLoc(void) +{ + + int i; + int last; + + WI_slamBackground(); + + // draw animated background + WI_drawAnimatedBack(); + + if ( gamemode != commercial) + { + if (wbs->epsd > 2) + { + WI_drawEL(); + return; + } + + last = (wbs->last == 8) ? wbs->next - 1 : wbs->last; + + // draw a splat on taken cities. + for (i=0 ; i<=last ; i++) + WI_drawOnLnode(i, splat); + + // splat the secret level? + if (wbs->didsecret) + WI_drawOnLnode(8, splat); + + // draw flashing ptr + if (snl_pointeron) + WI_drawOnLnode(wbs->next, yah); + } + + // draws which level you are entering.. + if ( (gamemode != commercial) + || wbs->next != 30) + WI_drawEL(); + +} + +void WI_drawNoState(void) +{ + snl_pointeron = true; + WI_drawShowNextLoc(); +} + +int WI_fragSum(int playernum) +{ + int i; + int frags = 0; + + for (i=0 ; i 99) + dm_frags[i][j] = 99; + + if (dm_frags[i][j] < -99) + dm_frags[i][j] = -99; + + stillticking = true; + } + } + dm_totals[i] = WI_fragSum(i); + + if (dm_totals[i] > 99) + dm_totals[i] = 99; + + if (dm_totals[i] < -99) + dm_totals[i] = -99; + } + + } + if (!stillticking) + { + S_StartSound(0, sfx_barexp); + dm_state++; + } + + } + else if (dm_state == 4) + { + if (acceleratestage) + { + S_StartSound(0, sfx_slop); + + if ( gamemode == commercial) + WI_initNoState(); + else + WI_initShowNextLoc(); + } + } + else if (dm_state & 1) + { + if (!--cnt_pause) + { + dm_state++; + cnt_pause = TICRATE; + } + } +} + + + +void WI_drawDeathmatchStats(void) +{ + + int i; + int j; + int x; + int y; + int w; + + WI_slamBackground(); + + // draw animated background + WI_drawAnimatedBack(); + WI_drawLF(); + + // draw stat titles (top line) + V_DrawPatch(DM_TOTALSX-SHORT(total->width)/2, + DM_MATRIXY-WI_SPACINGY+10, + total); + + V_DrawPatch(DM_KILLERSX, DM_KILLERSY, killers); + V_DrawPatch(DM_VICTIMSX, DM_VICTIMSY, victims); + + // draw P? + x = DM_MATRIXX + DM_SPACINGX; + y = DM_MATRIXY; + + for (i=0 ; iwidth)/2, + DM_MATRIXY - WI_SPACINGY, + p[i]); + + V_DrawPatch(DM_MATRIXX-SHORT(p[i]->width)/2, + y, + p[i]); + + if (i == me) + { + V_DrawPatch(x-SHORT(p[i]->width)/2, + DM_MATRIXY - WI_SPACINGY, + bstar); + + V_DrawPatch(DM_MATRIXX-SHORT(p[i]->width)/2, + y, + star); + } + } + else + { + // V_DrawPatch(x-SHORT(bp[i]->width)/2, + // DM_MATRIXY - WI_SPACINGY, bp[i]); + // V_DrawPatch(DM_MATRIXX-SHORT(bp[i]->width)/2, + // y, bp[i]); + } + x += DM_SPACINGX; + y += WI_SPACINGY; + } + + // draw stats + y = DM_MATRIXY+10; + w = SHORT(num[0]->width); + + for (i=0 ; imaxkills; + cnt_items[i] = (plrs[i].sitems * 100) / wbs->maxitems; + cnt_secret[i] = (plrs[i].ssecret * 100) / wbs->maxsecret; + + if (dofrags) + cnt_frags[i] = WI_fragSum(i); + } + S_StartSound(0, sfx_barexp); + ng_state = 10; + } + + if (ng_state == 2) + { + if (!(bcnt&3)) + S_StartSound(0, sfx_pistol); + + stillticking = false; + + for (i=0 ; i= (plrs[i].skills * 100) / wbs->maxkills) + cnt_kills[i] = (plrs[i].skills * 100) / wbs->maxkills; + else + stillticking = true; + } + + if (!stillticking) + { + S_StartSound(0, sfx_barexp); + ng_state++; + } + } + else if (ng_state == 4) + { + if (!(bcnt&3)) + S_StartSound(0, sfx_pistol); + + stillticking = false; + + for (i=0 ; i= (plrs[i].sitems * 100) / wbs->maxitems) + cnt_items[i] = (plrs[i].sitems * 100) / wbs->maxitems; + else + stillticking = true; + } + if (!stillticking) + { + S_StartSound(0, sfx_barexp); + ng_state++; + } + } + else if (ng_state == 6) + { + if (!(bcnt&3)) + S_StartSound(0, sfx_pistol); + + stillticking = false; + + for (i=0 ; i= (plrs[i].ssecret * 100) / wbs->maxsecret) + cnt_secret[i] = (plrs[i].ssecret * 100) / wbs->maxsecret; + else + stillticking = true; + } + + if (!stillticking) + { + S_StartSound(0, sfx_barexp); + ng_state += 1 + 2*!dofrags; + } + } + else if (ng_state == 8) + { + if (!(bcnt&3)) + S_StartSound(0, sfx_pistol); + + stillticking = false; + + for (i=0 ; i= (fsum = WI_fragSum(i))) + cnt_frags[i] = fsum; + else + stillticking = true; + } + + if (!stillticking) + { + S_StartSound(0, sfx_pldeth); + ng_state++; + } + } + else if (ng_state == 10) + { + if (acceleratestage) + { + S_StartSound(0, sfx_sgcock); + if ( gamemode == commercial ) + WI_initNoState(); + else + WI_initShowNextLoc(); + } + } + else if (ng_state & 1) + { + if (!--cnt_pause) + { + ng_state++; + cnt_pause = TICRATE; + } + } +} + + + +void WI_drawNetgameStats(void) +{ + int i; + int x; + int y; + int pwidth = SHORT(percent->width); + + WI_slamBackground(); + + // draw animated background + WI_drawAnimatedBack(); + + WI_drawLF(); + + // draw stat titles (top line) + V_DrawPatch(NG_STATSX+NG_SPACINGX-SHORT(kills->width), + NG_STATSY, kills); + + V_DrawPatch(NG_STATSX+2*NG_SPACINGX-SHORT(items->width), + NG_STATSY, items); + + V_DrawPatch(NG_STATSX+3*NG_SPACINGX-SHORT(secret->width), + NG_STATSY, secret); + + if (dofrags) + V_DrawPatch(NG_STATSX+4*NG_SPACINGX-SHORT(frags->width), + NG_STATSY, frags); + + // draw stats + y = NG_STATSY + SHORT(kills->height); + + for (i=0 ; iwidth), y, p[i]); + + if (i == me) + V_DrawPatch(x-SHORT(p[i]->width), y, star); + + x += NG_SPACINGX; + WI_drawPercent(x-pwidth, y+10, cnt_kills[i]); x += NG_SPACINGX; + WI_drawPercent(x-pwidth, y+10, cnt_items[i]); x += NG_SPACINGX; + WI_drawPercent(x-pwidth, y+10, cnt_secret[i]); x += NG_SPACINGX; + + if (dofrags) + WI_drawNum(x, y+10, cnt_frags[i], -1); + + y += WI_SPACINGY; + } + +} + +static int sp_state; + +void WI_initStats(void) +{ + state = StatCount; + acceleratestage = 0; + sp_state = 1; + cnt_kills[0] = cnt_items[0] = cnt_secret[0] = -1; + cnt_time = cnt_par = -1; + cnt_pause = TICRATE; + + WI_initAnimatedBack(); +} + +void WI_updateStats(void) +{ + + WI_updateAnimatedBack(); + + if (acceleratestage && sp_state != 10) + { + acceleratestage = 0; + cnt_kills[0] = (plrs[me].skills * 100) / wbs->maxkills; + cnt_items[0] = (plrs[me].sitems * 100) / wbs->maxitems; + cnt_secret[0] = (plrs[me].ssecret * 100) / wbs->maxsecret; + cnt_time = plrs[me].stime / TICRATE; + cnt_par = wbs->partime / TICRATE; + S_StartSound(0, sfx_barexp); + sp_state = 10; + } + + if (sp_state == 2) + { + cnt_kills[0] += 2; + + if (!(bcnt&3)) + S_StartSound(0, sfx_pistol); + + if (cnt_kills[0] >= (plrs[me].skills * 100) / wbs->maxkills) + { + cnt_kills[0] = (plrs[me].skills * 100) / wbs->maxkills; + S_StartSound(0, sfx_barexp); + sp_state++; + } + } + else if (sp_state == 4) + { + cnt_items[0] += 2; + + if (!(bcnt&3)) + S_StartSound(0, sfx_pistol); + + if (cnt_items[0] >= (plrs[me].sitems * 100) / wbs->maxitems) + { + cnt_items[0] = (plrs[me].sitems * 100) / wbs->maxitems; + S_StartSound(0, sfx_barexp); + sp_state++; + } + } + else if (sp_state == 6) + { + cnt_secret[0] += 2; + + if (!(bcnt&3)) + S_StartSound(0, sfx_pistol); + + if (cnt_secret[0] >= (plrs[me].ssecret * 100) / wbs->maxsecret) + { + cnt_secret[0] = (plrs[me].ssecret * 100) / wbs->maxsecret; + S_StartSound(0, sfx_barexp); + sp_state++; + } + } + + else if (sp_state == 8) + { + if (!(bcnt&3)) + S_StartSound(0, sfx_pistol); + + cnt_time += 3; + + if (cnt_time >= plrs[me].stime / TICRATE) + cnt_time = plrs[me].stime / TICRATE; + + cnt_par += 3; + + if (cnt_par >= wbs->partime / TICRATE) + { + cnt_par = wbs->partime / TICRATE; + + if (cnt_time >= plrs[me].stime / TICRATE) + { + S_StartSound(0, sfx_barexp); + sp_state++; + } + } + } + else if (sp_state == 10) + { + if (acceleratestage) + { + S_StartSound(0, sfx_sgcock); + + if (gamemode == commercial) + WI_initNoState(); + else + WI_initShowNextLoc(); + } + } + else if (sp_state & 1) + { + if (!--cnt_pause) + { + sp_state++; + cnt_pause = TICRATE; + } + } + +} + +void WI_drawStats(void) +{ + // line height + int lh; + + lh = (3*SHORT(num[0]->height))/2; + + WI_slamBackground(); + + // draw animated background + WI_drawAnimatedBack(); + + WI_drawLF(); + + V_DrawPatch(SP_STATSX, SP_STATSY, kills); + WI_drawPercent(SCREENWIDTH - SP_STATSX, SP_STATSY, cnt_kills[0]); + + V_DrawPatch(SP_STATSX, SP_STATSY+lh, items); + WI_drawPercent(SCREENWIDTH - SP_STATSX, SP_STATSY+lh, cnt_items[0]); + + V_DrawPatch(SP_STATSX, SP_STATSY+2*lh, sp_secret); + WI_drawPercent(SCREENWIDTH - SP_STATSX, SP_STATSY+2*lh, cnt_secret[0]); + + V_DrawPatch(SP_TIMEX, SP_TIMEY, timepatch); + WI_drawTime(SCREENWIDTH/2 - SP_TIMEX, SP_TIMEY, cnt_time); + + if (wbs->epsd < 3) + { + V_DrawPatch(SCREENWIDTH/2 + SP_TIMEX, SP_TIMEY, par); + WI_drawTime(SCREENWIDTH - SP_TIMEX, SP_TIMEY, cnt_par); + } + +} + +void WI_checkForAccelerate(void) +{ + int i; + player_t *player; + + // check for button presses to skip delays + for (i=0, player = players ; icmd.buttons & BT_ATTACK) + { + if (!player->attackdown) + acceleratestage = 1; + player->attackdown = true; + } + else + player->attackdown = false; + if (player->cmd.buttons & BT_USE) + { + if (!player->usedown) + acceleratestage = 1; + player->usedown = true; + } + else + player->usedown = false; + } + } +} + + + +// Updates stuff each tick +void WI_Ticker(void) +{ + // counter for general background animation + bcnt++; + + if (bcnt == 1) + { + // intermission music + if ( gamemode == commercial ) + S_ChangeMusic(mus_dm2int, true); + else + S_ChangeMusic(mus_inter, true); + } + + WI_checkForAccelerate(); + + switch (state) + { + case StatCount: + if (deathmatch) WI_updateDeathmatchStats(); + else if (netgame) WI_updateNetgameStats(); + else WI_updateStats(); + break; + + case ShowNextLoc: + WI_updateShowNextLoc(); + break; + + case NoState: + WI_updateNoState(); + break; + } + +} + +typedef void (*load_callback_t)(char *lumpname, patch_t **variable); + +// Common load/unload function. Iterates over all the graphics +// lumps to be loaded/unloaded into memory. + +static void WI_loadUnloadData(load_callback_t callback) +{ + int i, j; + char name[9]; + anim_t *a; + + if (gamemode == commercial) + { + for (i=0 ; iepsd, i); + callback(name, &lnames[i]); + } + + // you are here + callback(DEH_String("WIURH0"), &yah[0]); + + // you are here (alt.) + callback(DEH_String("WIURH1"), &yah[1]); + + // splat + callback(DEH_String("WISPLAT"), &splat[0]); + + if (wbs->epsd < 3) + { + for (j=0;jepsd];j++) + { + a = &anims[wbs->epsd][j]; + for (i=0;inanims;i++) + { + // MONDO HACK! + if (wbs->epsd != 1 || j != 8) + { + // animations + DEH_snprintf(name, 9, "WIA%d%.2d%.2d", wbs->epsd, j, i); + callback(name, &a->p[i]); + } + else + { + // HACK ALERT! + a->p[i] = anims[1][4].p[i]; + } + } + } + } + } + + // More hacks on minus sign. + callback(DEH_String("WIMINUS"), &wiminus); + + for (i=0;i<10;i++) + { + // numbers 0-9 + DEH_snprintf(name, 9, "WINUM%d", i); + callback(name, &num[i]); + } + + // percent sign + callback(DEH_String("WIPCNT"), &percent); + + // "finished" + callback(DEH_String("WIF"), &finished); + + // "entering" + callback(DEH_String("WIENTER"), &entering); + + // "kills" + callback(DEH_String("WIOSTK"), &kills); + + // "scrt" + callback(DEH_String("WIOSTS"), &secret); + + // "secret" + callback(DEH_String("WISCRT2"), &sp_secret); + + // french wad uses WIOBJ (?) + if (W_CheckNumForName(DEH_String("WIOBJ")) >= 0) + { + // "items" + if (netgame && !deathmatch) + callback(DEH_String("WIOBJ"), &items); + else + callback(DEH_String("WIOSTI"), &items); + } else { + callback(DEH_String("WIOSTI"), &items); + } + + // "frgs" + callback(DEH_String("WIFRGS"), &frags); + + // ":" + callback(DEH_String("WICOLON"), &colon); + + // "time" + callback(DEH_String("WITIME"), &timepatch); + + // "sucks" + callback(DEH_String("WISUCKS"), &sucks); + + // "par" + callback(DEH_String("WIPAR"), &par); + + // "killers" (vertical) + callback(DEH_String("WIKILRS"), &killers); + + // "victims" (horiz) + callback(DEH_String("WIVCTMS"), &victims); + + // "total" + callback(DEH_String("WIMSTT"), &total); + + for (i=0 ; iepsd == 3) + { + M_StringCopy(name, DEH_String("INTERPIC"), sizeof(name)); + } + else + { + DEH_snprintf(name, sizeof(name), "WIMAP%d", wbs->epsd); + } + + // Draw backdrop and save to a temporary buffer + + callback(name, &background); +} + +static void WI_loadCallback(char *name, patch_t **variable) +{ + *variable = W_CacheLumpName(name, PU_STATIC); +} + +void WI_loadData(void) +{ + if (gamemode == commercial) + { + NUMCMAPS = 32; + lnames = (patch_t **) Z_Malloc(sizeof(patch_t*) * NUMCMAPS, + PU_STATIC, NULL); + } + else + { + lnames = (patch_t **) Z_Malloc(sizeof(patch_t*) * NUMMAPS, + PU_STATIC, NULL); + } + + WI_loadUnloadData(WI_loadCallback); + + // These two graphics are special cased because we're sharing + // them with the status bar code + + // your face + star = W_CacheLumpName(DEH_String("STFST01"), PU_STATIC); + + // dead face + bstar = W_CacheLumpName(DEH_String("STFDEAD0"), PU_STATIC); +} + +static void WI_unloadCallback(char *name, patch_t **variable) +{ + W_ReleaseLumpName(name); + *variable = NULL; +} + +void WI_unloadData(void) +{ + WI_loadUnloadData(WI_unloadCallback); + + // We do not free these lumps as they are shared with the status + // bar code. + + // W_ReleaseLumpName("STFST01"); + // W_ReleaseLumpName("STFDEAD0"); +} + +void WI_Drawer (void) +{ + switch (state) + { + case StatCount: + if (deathmatch) + WI_drawDeathmatchStats(); + else if (netgame) + WI_drawNetgameStats(); + else + WI_drawStats(); + break; + + case ShowNextLoc: + WI_drawShowNextLoc(); + break; + + case NoState: + WI_drawNoState(); + break; + } +} + + +void WI_initVariables(wbstartstruct_t* wbstartstruct) +{ + + wbs = wbstartstruct; + +#ifdef RANGECHECKING + if (gamemode != commercial) + { + if ( gamemode == retail ) + RNGCHECK(wbs->epsd, 0, 3); + else + RNGCHECK(wbs->epsd, 0, 2); + } + else + { + RNGCHECK(wbs->last, 0, 8); + RNGCHECK(wbs->next, 0, 8); + } + RNGCHECK(wbs->pnum, 0, MAXPLAYERS); + RNGCHECK(wbs->pnum, 0, MAXPLAYERS); +#endif + + acceleratestage = 0; + cnt = bcnt = 0; + firstrefresh = 1; + me = wbs->pnum; + plrs = wbs->plyr; + + if (!wbs->maxkills) + wbs->maxkills = 1; + + if (!wbs->maxitems) + wbs->maxitems = 1; + + if (!wbs->maxsecret) + wbs->maxsecret = 1; + + if ( gamemode != retail ) + if (wbs->epsd > 2) + wbs->epsd -= 3; +} + +void WI_Start(wbstartstruct_t* wbstartstruct) +{ + WI_initVariables(wbstartstruct); + WI_loadData(); + + if (deathmatch) + WI_initDeathmatchStats(); + else if (netgame) + WI_initNetgameStats(); + else + WI_initStats(); +} diff --git a/firmware_p4/components/Applications/doom/wi_stuff.h b/firmware_p4/components/Applications/doom/wi_stuff.h new file mode 100644 index 000000000..296571f73 --- /dev/null +++ b/firmware_p4/components/Applications/doom/wi_stuff.h @@ -0,0 +1,48 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Intermission. +// + +#ifndef __WI_STUFF__ +#define __WI_STUFF__ + +//#include "v_video.h" + +#include "doomdef.h" + +// States for the intermission + +typedef enum +{ + NoState = -1, + StatCount, + ShowNextLoc, +} stateenum_t; + +// Called by main loop, animate the intermission. +void WI_Ticker (void); + +// Called by main loop, +// draws the intermission directly into the screen buffer. +void WI_Drawer (void); + +// Setup for an intermission screen. +void WI_Start(wbstartstruct_t* wbstartstruct); + +// Shut down the intermission screen +void WI_End(void); + +#endif diff --git a/firmware_p4/components/Applications/doom/z_zone.c b/firmware_p4/components/Applications/doom/z_zone.c new file mode 100644 index 000000000..16da22b90 --- /dev/null +++ b/firmware_p4/components/Applications/doom/z_zone.c @@ -0,0 +1,488 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Zone Memory Allocation. Neat. +// + + +#include "z_zone.h" +#include "i_system.h" +#include "doomtype.h" + + +// +// ZONE MEMORY ALLOCATION +// +// There is never any space between memblocks, +// and there will never be two contiguous free memblocks. +// The rover can be left pointing at a non-empty block. +// +// It is of no value to free a cachable block, +// because it will get overwritten automatically if needed. +// + +#define MEM_ALIGN sizeof(void *) +#define ZONEID 0x1d4a11 + +typedef struct memblock_s +{ + int size; // including the header and possibly tiny fragments + void** user; + int tag; // PU_FREE if this is free + int id; // should be ZONEID + struct memblock_s* next; + struct memblock_s* prev; +} memblock_t; + + +typedef struct +{ + // total bytes malloced, including header + int size; + + // start / end cap for linked list + memblock_t blocklist; + + memblock_t* rover; + +} memzone_t; + + + +memzone_t* mainzone; + + + +// +// Z_ClearZone +// +void Z_ClearZone (memzone_t* zone) +{ + memblock_t* block; + + // set the entire zone to one free block + zone->blocklist.next = + zone->blocklist.prev = + block = (memblock_t *)( (byte *)zone + sizeof(memzone_t) ); + + zone->blocklist.user = (void *)zone; + zone->blocklist.tag = PU_STATIC; + zone->rover = block; + + block->prev = block->next = &zone->blocklist; + + // a free block. + block->tag = PU_FREE; + + block->size = zone->size - sizeof(memzone_t); +} + + + +// +// Z_Init +// +void Z_Init (void) +{ + memblock_t* block; + int size; + + mainzone = (memzone_t *)I_ZoneBase (&size); + mainzone->size = size; + + // set the entire zone to one free block + mainzone->blocklist.next = + mainzone->blocklist.prev = + block = (memblock_t *)( (byte *)mainzone + sizeof(memzone_t) ); + + mainzone->blocklist.user = (void *)mainzone; + mainzone->blocklist.tag = PU_STATIC; + mainzone->rover = block; + + block->prev = block->next = &mainzone->blocklist; + + // free block + block->tag = PU_FREE; + + block->size = mainzone->size - sizeof(memzone_t); +} + + +// +// Z_Free +// +void Z_Free (void* ptr) +{ + memblock_t* block; + memblock_t* other; + + block = (memblock_t *) ( (byte *)ptr - sizeof(memblock_t)); + + if (block->id != ZONEID) + I_Error ("Z_Free: freed a pointer without ZONEID"); + + if (block->tag != PU_FREE && block->user != NULL) + { + // clear the user's mark + *block->user = 0; + } + + // mark as free + block->tag = PU_FREE; + block->user = NULL; + block->id = 0; + + other = block->prev; + + if (other->tag == PU_FREE) + { + // merge with previous free block + other->size += block->size; + other->next = block->next; + other->next->prev = other; + + if (block == mainzone->rover) + mainzone->rover = other; + + block = other; + } + + other = block->next; + if (other->tag == PU_FREE) + { + // merge the next free block onto the end + block->size += other->size; + block->next = other->next; + block->next->prev = block; + + if (other == mainzone->rover) + mainzone->rover = block; + } +} + + + +// +// Z_Malloc +// You can pass a NULL user if the tag is < PU_PURGELEVEL. +// +#define MINFRAGMENT 64 + + +void* +Z_Malloc +( int size, + int tag, + void* user ) +{ + int extra; + memblock_t* start; + memblock_t* rover; + memblock_t* newblock; + memblock_t* base; + void *result; + + size = (size + MEM_ALIGN - 1) & ~(MEM_ALIGN - 1); + + // scan through the block list, + // looking for the first free block + // of sufficient size, + // throwing out any purgable blocks along the way. + + // account for size of block header + size += sizeof(memblock_t); + + // if there is a free block behind the rover, + // back up over them + base = mainzone->rover; + + if (base->prev->tag == PU_FREE) + base = base->prev; + + rover = base; + start = base->prev; + + do + { + if (rover == start) + { + // scanned all the way around the list + I_Error ("Z_Malloc: failed on allocation of %i bytes", size); + } + + if (rover->tag != PU_FREE) + { + if (rover->tag < PU_PURGELEVEL) + { + // hit a block that can't be purged, + // so move base past it + base = rover = rover->next; + } + else + { + // free the rover block (adding the size to base) + + // the rover can be the base block + base = base->prev; + Z_Free ((byte *)rover+sizeof(memblock_t)); + base = base->next; + rover = base->next; + } + } + else + { + rover = rover->next; + } + + } while (base->tag != PU_FREE || base->size < size); + + + // found a block big enough + extra = base->size - size; + + if (extra > MINFRAGMENT) + { + // there will be a free fragment after the allocated block + newblock = (memblock_t *) ((byte *)base + size ); + newblock->size = extra; + + newblock->tag = PU_FREE; + newblock->user = NULL; + newblock->prev = base; + newblock->next = base->next; + newblock->next->prev = newblock; + + base->next = newblock; + base->size = size; + } + + if (user == NULL && tag >= PU_PURGELEVEL) + I_Error ("Z_Malloc: an owner is required for purgable blocks"); + + base->user = user; + base->tag = tag; + + result = (void *) ((byte *)base + sizeof(memblock_t)); + + if (base->user) + { + *base->user = result; + } + + // next allocation will start looking here + mainzone->rover = base->next; + + base->id = ZONEID; + + return result; +} + + + +// +// Z_FreeTags +// +void +Z_FreeTags +( int lowtag, + int hightag ) +{ + memblock_t* block; + memblock_t* next; + + for (block = mainzone->blocklist.next ; + block != &mainzone->blocklist ; + block = next) + { + // get link before freeing + next = block->next; + + // free block? + if (block->tag == PU_FREE) + continue; + + if (block->tag >= lowtag && block->tag <= hightag) + Z_Free ( (byte *)block+sizeof(memblock_t)); + } +} + + + +// +// Z_DumpHeap +// Note: TFileDumpHeap( stdout ) ? +// +void +Z_DumpHeap +( int lowtag, + int hightag ) +{ + memblock_t* block; + + printf ("zone size: %i location: %p\n", + mainzone->size,mainzone); + + printf ("tag range: %i to %i\n", + lowtag, hightag); + + for (block = mainzone->blocklist.next ; ; block = block->next) + { + if (block->tag >= lowtag && block->tag <= hightag) + printf ("block:%p size:%7i user:%p tag:%3i\n", + block, block->size, block->user, block->tag); + + if (block->next == &mainzone->blocklist) + { + // all blocks have been hit + break; + } + + if ( (byte *)block + block->size != (byte *)block->next) + printf ("ERROR: block size does not touch the next block\n"); + + if ( block->next->prev != block) + printf ("ERROR: next block doesn't have proper back link\n"); + + if (block->tag == PU_FREE && block->next->tag == PU_FREE) + printf ("ERROR: two consecutive free blocks\n"); + } +} + + +// +// Z_FileDumpHeap +// +void Z_FileDumpHeap (FILE* f) +{ + memblock_t* block; + + fprintf (f,"zone size: %i location: %p\n",mainzone->size,mainzone); + + for (block = mainzone->blocklist.next ; ; block = block->next) + { + fprintf (f,"block:%p size:%7i user:%p tag:%3i\n", + block, block->size, block->user, block->tag); + + if (block->next == &mainzone->blocklist) + { + // all blocks have been hit + break; + } + + if ( (byte *)block + block->size != (byte *)block->next) + fprintf (f,"ERROR: block size does not touch the next block\n"); + + if ( block->next->prev != block) + fprintf (f,"ERROR: next block doesn't have proper back link\n"); + + if (block->tag == PU_FREE && block->next->tag == PU_FREE) + fprintf (f,"ERROR: two consecutive free blocks\n"); + } +} + + + +// +// Z_CheckHeap +// +void Z_CheckHeap (void) +{ + memblock_t* block; + + for (block = mainzone->blocklist.next ; ; block = block->next) + { + if (block->next == &mainzone->blocklist) + { + // all blocks have been hit + break; + } + + if ( (byte *)block + block->size != (byte *)block->next) + I_Error ("Z_CheckHeap: block size does not touch the next block\n"); + + if ( block->next->prev != block) + I_Error ("Z_CheckHeap: next block doesn't have proper back link\n"); + + if (block->tag == PU_FREE && block->next->tag == PU_FREE) + I_Error ("Z_CheckHeap: two consecutive free blocks\n"); + } +} + + + + +// +// Z_ChangeTag +// +void Z_ChangeTag2(void *ptr, int tag, char *file, int line) +{ + memblock_t* block; + + block = (memblock_t *) ((byte *)ptr - sizeof(memblock_t)); + + if (block->id != ZONEID) + I_Error("%s:%i: Z_ChangeTag: block without a ZONEID!", + file, line); + + if (tag >= PU_PURGELEVEL && block->user == NULL) + I_Error("%s:%i: Z_ChangeTag: an owner is required " + "for purgable blocks", file, line); + + block->tag = tag; +} + +void Z_ChangeUser(void *ptr, void **user) +{ + memblock_t* block; + + block = (memblock_t *) ((byte *)ptr - sizeof(memblock_t)); + + if (block->id != ZONEID) + { + I_Error("Z_ChangeUser: Tried to change user for invalid block!"); + } + + block->user = user; + *user = ptr; +} + + + +// +// Z_FreeMemory +// +int Z_FreeMemory (void) +{ + memblock_t* block; + int free; + + free = 0; + + for (block = mainzone->blocklist.next ; + block != &mainzone->blocklist; + block = block->next) + { + if (block->tag == PU_FREE || block->tag >= PU_PURGELEVEL) + free += block->size; + } + + return free; +} + +unsigned int Z_ZoneSize(void) +{ + return mainzone->size; +} + diff --git a/firmware_p4/components/Applications/doom/z_zone.h b/firmware_p4/components/Applications/doom/z_zone.h new file mode 100644 index 000000000..526f30d30 --- /dev/null +++ b/firmware_p4/components/Applications/doom/z_zone.h @@ -0,0 +1,73 @@ +// +// Copyright(C) 1993-1996 Id Software, Inc. +// Copyright(C) 2005-2014 Simon Howard +// +// This program is free software; you can redistribute it and/or +// modify it under the terms of the GNU General Public License +// as published by the Free Software Foundation; either version 2 +// of the License, or (at your option) any later version. +// +// This program is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// DESCRIPTION: +// Zone Memory Allocation, perhaps NeXT ObjectiveC inspired. +// Remark: this was the only stuff that, according +// to John Carmack, might have been useful for +// Quake. +// + + + +#ifndef __Z_ZONE__ +#define __Z_ZONE__ + +#include + +// +// ZONE MEMORY +// PU - purge tags. + +enum +{ + PU_STATIC = 1, // static entire execution time + PU_SOUND, // static while playing + PU_MUSIC, // static while playing + PU_FREE, // a free block + PU_LEVEL, // static until level exited + PU_LEVSPEC, // a special thinker in a level + + // Tags >= PU_PURGELEVEL are purgable whenever needed. + + PU_PURGELEVEL, + PU_CACHE, + + // Total number of different tag types + + PU_NUM_TAGS +}; + + +void Z_Init (void); +void* Z_Malloc (int size, int tag, void *ptr); +void Z_Free (void *ptr); +void Z_FreeTags (int lowtag, int hightag); +void Z_DumpHeap (int lowtag, int hightag); +void Z_FileDumpHeap (FILE *f); +void Z_CheckHeap (void); +void Z_ChangeTag2 (void *ptr, int tag, char *file, int line); +void Z_ChangeUser(void *ptr, void **user); +int Z_FreeMemory (void); +unsigned int Z_ZoneSize(void); + +// +// This is used to get the local FILE:LINE info from CPP +// prior to really call the function in question. +// +#define Z_ChangeTag(p,t) \ + Z_ChangeTag2((p), (t), __FILE__, __LINE__) + + +#endif From d73669d8d46293403c5907422a40d7de8b9bba92 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Thu, 20 Aug 2026 16:48:28 -0300 Subject: [PATCH 098/103] feat(ui): add DOOM entry to the games menu --- .../components/Applications/CMakeLists.txt | 1 + .../Applications/ui/include/ui_manager.h | 1 + .../ui/screens/games/doom_real_ui.c | 39 +++++++++++++++++++ .../ui/screens/games/games_menu_ui.c | 2 +- .../ui/screens/games/include/doom_real_ui.h | 32 +++++++++++++++ .../components/Applications/ui/ui_manager.c | 3 ++ 6 files changed, 77 insertions(+), 1 deletion(-) create mode 100644 firmware_p4/components/Applications/ui/screens/games/doom_real_ui.c create mode 100644 firmware_p4/components/Applications/ui/screens/games/include/doom_real_ui.h diff --git a/firmware_p4/components/Applications/CMakeLists.txt b/firmware_p4/components/Applications/CMakeLists.txt index fe8fdafb1..e5a7d22c7 100644 --- a/firmware_p4/components/Applications/CMakeLists.txt +++ b/firmware_p4/components/Applications/CMakeLists.txt @@ -143,6 +143,7 @@ idf_component_register(SRCS Drivers Service gameboy + doom esp_common esp_wifi esp_tinyusb diff --git a/firmware_p4/components/Applications/ui/include/ui_manager.h b/firmware_p4/components/Applications/ui/include/ui_manager.h index c7459d33e..c45f88784 100644 --- a/firmware_p4/components/Applications/ui/include/ui_manager.h +++ b/firmware_p4/components/Applications/ui/include/ui_manager.h @@ -90,6 +90,7 @@ typedef enum { SCREEN_GAME_SNAKE, SCREEN_GAME_BREAKOUT, SCREEN_GAME_GB, + SCREEN_GAME_DOOM, SCREEN_GPIO, SCREEN_HAPTIC, SCREEN_SPEAKER, diff --git a/firmware_p4/components/Applications/ui/screens/games/doom_real_ui.c b/firmware_p4/components/Applications/ui/screens/games/doom_real_ui.c new file mode 100644 index 000000000..0b2755c93 --- /dev/null +++ b/firmware_p4/components/Applications/ui/screens/games/doom_real_ui.c @@ -0,0 +1,39 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#include "doom_real_ui.h" + +#include "ui_manager.h" // lvgl.h + ui_screen_load() +#include "ui_liveness.h" // ui_render_beat_kick() +#include "doom_highboy.h" // highboy_doom_start() (doom component) + +void ui_doom_real_open(void) { + lv_obj_t *scr = lv_obj_create(NULL); + lv_obj_set_style_bg_color(scr, lv_color_black(), 0); + lv_obj_set_style_bg_opa(scr, LV_OPA_COVER, 0); + lv_obj_remove_flag(scr, LV_OBJ_FLAG_SCROLLABLE); + + lv_obj_t *lbl = lv_label_create(scr); + lv_label_set_text(lbl, "DOOM\nloading /sdcard/doom/doom1.wad ..."); + lv_obj_set_style_text_color(lbl, lv_color_hex(0xC8C8C8), 0); + lv_obj_set_style_text_align(lbl, LV_TEXT_ALIGN_CENTER, 0); + lv_obj_center(lbl); + + ui_screen_load(scr); + + // The DOOM task waits ~150ms for this screen to settle, then enters direct + // draw mode and owns the panel. Quitting DOOM reboots, so no teardown here. + highboy_doom_start(ui_render_beat_kick); +} diff --git a/firmware_p4/components/Applications/ui/screens/games/games_menu_ui.c b/firmware_p4/components/Applications/ui/screens/games/games_menu_ui.c index dcf6a6e72..3d3b5d2ab 100644 --- a/firmware_p4/components/Applications/ui/screens/games/games_menu_ui.c +++ b/firmware_p4/components/Applications/ui/screens/games/games_menu_ui.c @@ -43,7 +43,7 @@ static const game_t GAMES[] = { {"Snake", "/assets/icons/game_snake.bin", 0x00E676, true, SCREEN_GAME_SNAKE}, {"Breakout", "/assets/icons/game_brk.bin", 0xFFB020, true, SCREEN_GAME_BREAKOUT}, {"Game Boy", "/assets/icons/game_gb.bin", 0x9BBC0F, true, SCREEN_GAME_GB}, - {"Coming Soon", "/assets/icons/timer.bin", 0x5E12A0, false, TARGET_STUB}, + {"DOOM", "/assets/icons/timer.bin", 0xC81E1E, false, SCREEN_GAME_DOOM}, }; #define GAME_COUNT ((int)(sizeof(GAMES) / sizeof(GAMES[0]))) diff --git a/firmware_p4/components/Applications/ui/screens/games/include/doom_real_ui.h b/firmware_p4/components/Applications/ui/screens/games/include/doom_real_ui.h new file mode 100644 index 000000000..8323b799b --- /dev/null +++ b/firmware_p4/components/Applications/ui/screens/games/include/doom_real_ui.h @@ -0,0 +1,32 @@ +// Copyright (c) 2025 HIGH CODE LLC +// +// TentacleOS is free software: you can redistribute it and/or modify +// it under the terms of the GNU General Public License as published by +// the Free Software Foundation, either version 3 of the License, or +// (at your option) any later version. +// +// TentacleOS is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. +// +// You should have received a copy of the GNU General Public License +// along with TentacleOS. If not, see . + +#ifndef DOOM_REAL_UI_H +#define DOOM_REAL_UI_H + +#ifdef __cplusplus +extern "C" { +#endif + +// Open official DOOM (doomgeneric): shows a black loading screen, then hands the +// ST7789 to the DOOM task (see components/doom). Quitting DOOM reboots the +// device (hold OK+BACK ~2s), so this open fn never returns control to the UI. +void ui_doom_real_open(void); + +#ifdef __cplusplus +} +#endif + +#endif // DOOM_REAL_UI_H diff --git a/firmware_p4/components/Applications/ui/ui_manager.c b/firmware_p4/components/Applications/ui/ui_manager.c index 194d1c3c7..c4e0e90c8 100644 --- a/firmware_p4/components/Applications/ui/ui_manager.c +++ b/firmware_p4/components/Applications/ui/ui_manager.c @@ -90,6 +90,7 @@ #include "snake_ui.h" #include "breakout_ui.h" #include "gb_ui.h" +#include "doom_real_ui.h" #include "octobit_status_ui.h" #include "dev_menu_ui.h" #include "subghz_menu_ui.h" @@ -475,6 +476,8 @@ static ui_open_fn_t screen_open_fn(screen_id_t s) { return ui_breakout_open; case SCREEN_GAME_GB: return ui_gb_open; + case SCREEN_GAME_DOOM: + return ui_doom_real_open; case SCREEN_OCTOBIT_STATUS: return ui_octobit_status_open; case SCREEN_DEV_MENU: From 489c83838b82545107ca92f628921f724c5540dd Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Thu, 20 Aug 2026 16:48:28 -0300 Subject: [PATCH 099/103] build(partition): grow OTA slots to 2.875MB and shrink assets to 2.06MB for DOOM --- firmware_p4/partitions.csv | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/firmware_p4/partitions.csv b/firmware_p4/partitions.csv index 9d8e8681e..273ba82a1 100644 --- a/firmware_p4/partitions.csv +++ b/firmware_p4/partitions.csv @@ -2,7 +2,7 @@ nvs, data, nvs, 0x9000, 24K, otadata, data, ota, 0xf000, 8K, phy_init, data, phy, 0x11000, 4K, -ota_0, app, ota_0, 0x20000, 0x270000, -ota_1, app, ota_1, 0x290000, 0x270000, -coredump, data, coredump, 0x500000, 64K, -assets, data, littlefs, 0x510000, 0x2E0000, +ota_0, app, ota_0, 0x20000, 0x2E0000, +ota_1, app, ota_1, 0x300000, 0x2E0000, +coredump, data, coredump, 0x5E0000, 64K, +assets, data, littlefs, 0x5F0000, 0x210000, From b9e4606d84d1479e0deb3e89eed1bc37d33ce4c9 Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Thu, 20 Aug 2026 16:48:28 -0300 Subject: [PATCH 100/103] fix(lvgl): complete LVGL flush in direct mode so the render task never hangs --- firmware_p4/components/Service/lvgl/lvgl_glue.c | 14 +++++++++----- 1 file changed, 9 insertions(+), 5 deletions(-) diff --git a/firmware_p4/components/Service/lvgl/lvgl_glue.c b/firmware_p4/components/Service/lvgl/lvgl_glue.c index 65bf62b65..96e4fe1b6 100644 --- a/firmware_p4/components/Service/lvgl/lvgl_glue.c +++ b/firmware_p4/components/Service/lvgl/lvgl_glue.c @@ -64,15 +64,19 @@ static bool trans_done_cb(esp_lcd_panel_io_handle_t io, (void)io; (void)ed; BaseType_t hp = pdFALSE; - if (s_direct_mode) { + // s_flush_took_bus marks an LVGL-driven flush (set in capture_flush_start_cb). + // Complete it even in direct mode, else lv_refr's wait_for_flushing() spins + // forever (disp->flushing never clears) and the SPI3 bus lock leaks. App direct + // draws (DOOM/Game Boy) never set this flag; they only pulse the wait semaphore. + if (s_flush_took_bus) { + lv_display_flush_ready((lv_display_t *)ctx); + s_flush_took_bus = false; + spi_bus_lock_give_from_isr(&hp); + } else if (s_direct_mode) { if (s_trans_done != NULL) xSemaphoreGiveFromISR(s_trans_done, &hp); } else { lv_display_flush_ready((lv_display_t *)ctx); - if (s_flush_took_bus) { - s_flush_took_bus = false; - spi_bus_lock_give_from_isr(&hp); - } } return hp == pdTRUE; } From 479c99a3a173fd1970ac1067208b95d9b8ace5de Mon Sep 17 00:00:00 2001 From: Emanuel Magalhaes Date: Thu, 20 Aug 2026 16:54:15 -0300 Subject: [PATCH 101/103] docs: replace repo banner --- README.md | 2 +- README.pt.md | 2 +- pics/Highboy_repo.png | Bin 3895566 -> 0 bytes pics/banner.png | Bin 0 -> 358539 bytes 4 files changed, 2 insertions(+), 2 deletions(-) delete mode 100644 pics/Highboy_repo.png create mode 100644 pics/banner.png diff --git a/README.md b/README.md index 6d18624cb..af0765420 100644 --- a/README.md +++ b/README.md @@ -1,5 +1,5 @@

- HighBoy Banner + HighBoy Banner

diff --git a/README.pt.md b/README.pt.md index 42ebee6be..f798feda7 100644 --- a/README.pt.md +++ b/README.pt.md @@ -1,5 +1,5 @@

- HighBoy Banner + HighBoy Banner

diff --git a/pics/Highboy_repo.png b/pics/Highboy_repo.png deleted file mode 100644 index da36c58bd17f417641c366988d54d3d799cb59ac..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3895566 zcmZ_0byOSL5;t1KwYXc+V!?wJC{Qd|aVrFhYjACGr?`7@cZcF0+^x7vpt!yCym#+8 z_kHJE3;tj+nb|XY?~&i0Nw6YF3LS+Q<=L}m=+YlQC_j5fll<%%iV70KvuDqXu@jBq z|3J3=s0n%YjFslk?{k-25vOO*D4$7x5dGwmdf4h(!aU@;dR4f8oCG{rUTM8L8uie5 zE0b-O6l-LjMLMYU=0&U#$+y{`05pLt^hMjlS5SSB&zwEw98yU?=<{4Kb~pB~IZ;Ep zkhiA6cmp94jBm`MIc}~Q+WP9*u9n?Lc{p|BM2d=voAO8HG9XQ(w|C!9(v#BD_w`k; zKFyviw%^8e!e+5viT?e=`f9%f{l9-U?B4J4&i&HnesWrNntHfn*vLNd#W@+Sv3EVV~ZBCuNayb6H8?Xve2a7u32O-#3;SM z6_xsrPHRCyiQ=+C62sVl{H{lN_YcFsUYijrpNRh~v=bW(5E$itIm{`bGQ;i&8HSY={3^lAqELgXIDjAl03UamRav4cH-UukCsGFoyjf5{+*` zz?vzQZc=Or|KVy4oDh6Jvv7s;_eu?rskg_J6|f;6hW9GGC&{rP5io7-B?aog#i;$e zn73m8RoCG4zcML*OhV%S@7|#Pi#}F%?RBI7SntPwvC6`_msQ5Me=x%PS7A2u0Exd9 zf8U+@yP0|$Zq^_Fu`ZlXaRlSvTc8ft)wD1_2uQu{FxPGt83gRRE@e5czikQ0{LfZ* z;z@OrYV9)`Mg#%LE^QWQ450uoi_kkqp>pco{~iZp?EiBw;nH+R-v#}Hlf=JrBD?sf zxH$2DCwllN5#IlW=<1(DaiagqDQ)wAh~EF-h*B^Wv|eE!u0J7b2RIjMh0Wd7G> zrN<|}{D(l%e-(Jn)kBK)-}~){8uZ5lROdXv-BdiSA*eYV&blx?pK;r7_8+{m{f)y?x z5Og7E0id`1+lToPcuzr7`2{$Kt_V1ex)PCISi)w-MXN$4MB&i_uf@;{b< z1pK>1`C;S}h+l`|S0M`;xDWONpLg#%XS;b^8YG^d{XW+iTp4`TpyEMBQ#)gk#HJu3 zHQ=!2MRJRveUq~p<}Pp<;TnUuWifmtYGbVD*y|Rvc+;H4Ln(wDF9gZp-5I_5lx~ZQ z8`9h}8&mw~aB6EwMrfblNrBgCfn!0N%4sDq4%u> zkCbZ1#Q9LI$`J~;-+hE}+9p;qHZ6${C?XHHtLxzplK`Iv0^zt)Y~uCS}JJ_o??TcssqZ#h~TJXA z6JzVlasbjI$?U*+_AJ;$E5{LTQgxzS-1@TRy;d6~E&k$a!`R4v)_I#B{hT#3+~3A@ z4R|~!-H2xEHQSGVlgVL2FbY*BMezY9dzF(XA&J%NbLv{dcID+|nK^1F_RM8vydFs6 z+%=THM}RjlEoeBSdK%1h!aK_;5l7IkbS4>eC*OO}8p|1L#6&}+1{?x3AKk%8xQ#R`<+>_41H|p&CE&MDJp)P(H)-?Bi zXnsh;X$bKF72IL>1)E>6N_`397^UE#Bwz*5-(c&9WBd~1WJ17_M%c%xJr+ssPqg*{ z#a~d+eh%v(Z1n!^ujcmspz(m4`nN)sR06A55%W&)_m*9kZ!$ktZtILeik>IcI2dqI zEL^FVKuuNn5k4|zw!{IL6h2&>TzZ4b(lfz@+GXe>a0=Lu|vab-s-kuM{<(z-y zLot3S1N;;LxEG?mj1=zQg~h2I+$0LWrFsLUO#CO@GFMmT4Jr$^`E*%Oc*d6U@afEI z1rm=L_PpQ`L!1u_VA2S8LTFBUi~FwAJ*03=F%n#^v(!#F1oKy$N~eVb>2GvW(?Mv< zE(H0se#IjNglVSSoE1MdKQkKjH8?t^iVMV>oRfo>J z{Syz*0UFlhF5Rv(9yKjdcqvg?O%Shlu+vT(@K~6>>Wj)K;br$K&7dsBx?Q!jY9+FK z%!Js{VSY@e`TVU8F-M$k)1rhBs{-v)UIsG+`Ym8%8h=@3bt1vG!tKc#{R=Ttkx|-6w~$bK|^#m5Y?*`)8a8CV%MjB z*?7IGl#&zI?b({dJ6a!52E#PrD-?pXq3gSfkv+BAI|D?iqMl$(Zxw@lZY_9bCz|?L zjRWDID$JSGudl}*sQ!Eq!hhik;;*ax6J~cL@F2g6koir1F{JHN5u7M=;+gcz8jcMe zDeDhq&*|Wvt=s>Rmjrcx8o=)fx~G=-mC;{zVndYO*>Vzb>U3E|cd8&A58XrD z%s>h>S7|i2M%}L#nq{*?3h@{1_EW~)w2{Zod;q2y!mSOxp_W00Y0^}!!MPL=k;kur-HWG~Z} zMp54SL@VrS=njg3URXzb+azvd-(5ie#1}Rq1+iXI7HnznT6x4cw})DKePtZlly>9A zMakvLv2YLDM$sdK9vAyXGpZ*#lZoLdd2Ydp}Y2B?ep?%u}}VvtF})z{34-B%<)~M!?(r9 zh8P2O@kkVXxRBjnXtR+NM~X7#g4^pnvLBh2)aW&IG)wpu_D@GAXlfSpX*p)XTMvv` zJmPum93u|yrt_Dv4{8(@rmMVL5HOu@S&FKfQzqFAp&?*+j%Sd9#J>|!Gt|Ps%#5db zXH+RUdJ2%av`cf`6~_Bq5&M|3H!|C-%Hv`9uw#}_*0em_&TACr5~bh$IbO>XTTzDA zpwE{AeR}+L@g;EGe-RhL%6<8L*2h-5;c+U+Btvs&?Kmt@;7)D_f{}->a=V8!29y6dDRYa3)Suf4h*6djh zTJjh_=^u9-6u(Y8xMgf}JYPNdbUQP{?R6aYR0hzqoY=m13DlLy7irQA4CRc=AxHed z{rofRj-^wI2Ia@z-28$`@I!Fv$ipOugZ;2ezeHuWo}2hRa=A9?@Jv7c{+5*J7Z~S# zf9ndXv>DU#%uMeHrNPG=Y2s68H6?73T@543kj@i?w z$gJlBZqYji-Y?j2ChptU%PEyaWsMCNyUr8Qc!v>jUXC}24!h=6Cr%F4y2kG8O{?=m za=S@I8(tVCefbnNud$fdFB$s<+L8(`fqBl3yWt)s%;{y6I6ZqUx|={vQQg+oak=ei zt=l}5mJ-QHE>B2+6FUP<(#YM@V4q=6BV$h^Ka~M|nW;|Gve0^sf~qEw-?|JlG$1Ll z?`5_ESuH*m=ly1$o1E{k6mgoXqkQ9<1yy-5dl@&8QNWwsu<$sG4BL%10atwP4{a z@jAk7LhExq{i06Y<70@pw4^AqDH-OHLuBHJ(v$X+e$2V!(b@`WS8IZC8VhN>6b zYPj=Ap($UmyHj%z2$*sewUlt9#ig)7Da=EOVKW*jmKC*j;YTAWa=jLEA>3@)%qVD9 z8fb`U-r_apP;l9NGIup zgJevQxM3#%oD=#-o}htXd9@;tumLo?Q;9cc?PpQW%UMWr)-=K$(@Twepuy zI$8~mZ7h01lO&P<3`*E@p|xaBTuV0+H0tk>*W+Jd6XSRS^ZA<7sAOs2gf<}@s4u$D zXV~PASi0G~1t(Gf;(Df5v@&YvUQQg{D5_*n;($wd_yEENj6Y`lRVgPwD*w#)JOlTB8yE>u3k;>tDsX~_%O3J-|y+k0IloB2LRiBKiG zpM3^dlvrMRZ^Qn+eMVx|6h$YUR6?yO_)`FI#$*`4P{TOCCAP&`;BRJcq~bGnd1DZeg`96Jr~6S5tP;nA# zaT?=l`S2vg{q3j{+3>dA8xoj(u#6vx`^U7{JBt{bqW#1pYW1aZv!}B{n>B%%Ui-LJ z@&io~1z8%`q793Z*SQn+ixHk0HB;Dc=>EV@CbbXhpN5e$bmc|!dyS*>NhYC zUN87N+f}K&2Xu1Cb4)bI@u4KH+0QfJLU2RSdc>Vv`(-^M(EP>j1bLhIC38^AI?2QX ziPhS*4z+yQ!L3VRPhqm74L@d1C(U~8;W(;lgdwCvKo2{0UsWVE7%H4h6hOo@@H}<} z$vR}!^bR4@7-9@P5B#CeHs8e(d4~ zDq@8?MCaVl(QJD*nYeSk!>q?pS+V@g z*(0Rg0L58{-p%?Ek_?&(x;dOn#sDk{bL(P7l>>@GQSEHZjek)46@}P}DHe~xLr9Hu zJy|@p846FEB$J0)q=t0Q_l8o|!|C&}x9iGSE>i|Cv}=^+PmvO}niB^}3iL^MaHF<| zrM3DWMDRLW>a&%D-+6Q`S~ZOjRs1yR_Q9}Wd zbCew4FY>jz4c4@qRPjS4gba*iNks4y6-Pw;|BIIWOH5*Bh@Pk<#hbe2Du1E9P3rX>Y6g zoX8y2B(VDCc`ks}ypNQvQB{j}DNv{i?c zNB!d$aJy5rMl2ur;vR|^zwZtL(2a|y(kn&+Jl{kW%NUYsb$wb9;}XOR{-mmhJEyE! zdi>skWc`6##%w2}ph6K<@#bwuK8zFHr^(`xhT*kxZ$7W6NcPK(1@num6B0R2KgqtTbfZLvm@*b zeS?q4sUtHE!cv2Id*418J$;UZnRZ(8CG|!lrjzkNro{jVi}T z-ef`c8rmU|^Ft@LCmkt*bFHJ0Sz#%qFv2bHiAF)3@iPsJ#F6~4DrE58h@!m7Nlepu zdJ{|*XHM&g?DThD+O|&?F?eBtJT$vU%zbX_uCUIk)=X{0UUjJ5;Ks#YP1F==UHqfj zdyeS=`fxS78XZlujl@Pb4|8z`uSN06Im(OvxV#ILlC$+7cb#HK1}bru8u#x-K1iGT zh{mh|7_JuRz41_xcexo^$PMox&yoE8j~ee^CAx2HQoaqI5&@Bw-Zz;q5*pXK$VUYM z3$aJ)-u!u5@aiUQ81#XDj+k}5+7&a|M&QtbyJZGf#1UfRp63Fw zu`Rs`9@3hQF(17@0*d8#`MNyR=%*T9^{o|(H(~mvD5IsLz53SoMvQ3kW}xy;bzmjy zN5d7#eVuG?SVzSuE2fL@j^+j#`2v}w4kB8>o1TW52W_XMs!*ycC;Zftb1x^sp1$Uj zrHdWNj7W7?1Y5#a+t)XT?T_5)clQv6>Bz3UuZ8o*#HMBa5VofhM+xLqo+jp5e24kL!T;Rt7D>hh6vUn9+M* zoW*IcAD2jJiSTNUJ*8MvGj=+&$OYvYom)!ff(9XCeop)EU8_a>+;E9v?Jyyu^6hu8 z8DyGA%Nhf#h`!$lvKahMkvt=%KJ^1HOnHsuwSDU`JZyR6Am+toVqVcl_e4&;?cy|8 zuZY6IeP*b>t=2%>Pi3|!dG`+XVH!~fzw2XZ6d?N(XNlv+Z!FbV6alkERh2R=Ev>Ai zv+qgs^y)MmLSo>w3f~tQ@8~bMC*lhv4t9C^1g1cLiVHZprQJx@omz3UkHYU8F0_Cu zEbzoh$J5p^8^w7U?2Q)!2zW{9;BDQW>UinW&wHjD*55c(UjYrkj3)&rZ3Oh@?Pn%y zIUZ(<6PU&*__(OtLRp3Z==KU@M_mF51oSyk8fCX!Oq(z##dg(KI>=4@b+7{mGdj!f z=hj{XkY5}3svIcfrwEv?-vIU3)a_q8IL?D(s*6AfL&EhgB1AOIr~K{XL-PWhZY`fN zaUAr1sf3a=lb@HgR#pqQQKr(g-9YrRuk>GcEzGN;LW!&{xP724eXF<4B~Cf`0i zxQ_S}r=$I?=W1`rrdvs9cqN?@iaA|5{-1lu+Gn}wz%U_HMA_7SrcpvVIQ!(=7W?czyg*y?vBGoki%U)8V@5g>bl-U?*mmW0 zXg#i-RFqf+Y)5c!#T%H}M2NI*2|Tzv*()F8{6e#82zes5Ax#~DaiUlgm`tWijx-jg ze?`nckVCbC!~F=Y2CwrQkALT%e5%qXmeBKzH0q6?oeb|I96YG>3-Ohh*Kc@ zJh=Ku1QnCPcf+_ctnYxGY;KdBVThg9{5b!SM19g|I`?*}nDUa#KmFRp!PBZ${W+PA zh;Y4%jDYy!i((X;9EH5^L2qIA8kW?8(+{X!3%A4;78bVU3gR7F;$|ja#TH-Gub1}} zy(y}B)2pD(sS)?q<0G}b55ty2=QcN?9yh7epE?(gM@?9%Ym7C1bReqvVIR1TPeIui zt&Wqk^!jsuiy&ub_RaD=HnYIex+Y4mstNI1l3C5hhWO92%xox3tmeI2o5)U6ID%;*ioM!N3nZW>9c`D-Wp za`CVz1mSK9O24qjrU!b#4ykL#M_GHiVMe7xb?!Fn)h(@V^Dl?hUBzt=P&eNX}o48BKw4Qk45NPom_0(mkD>%@(!5PaZx{RdSU+Dj^VOiUy#F?6}=i8>ikGxaMB> ze9WHe-DT^U-4nhjRKJ*a`|HWq^Xd0B^{x&z3J(LL-8eOZyd?j(fndt!5=a7inTjI& zmsbsp;!0y3Knzrl3xhJ>Y?`yP9cgT)T zKCkn{-ttzqBV+Z=eqS9R#%b6|UQTg^n}O4`EE!3X2JuismG>mya)_Wq+R3P!HUfok z=UufhY>X3Y)w9`oC{<2#g%*b(@ta7&;rE6+BfM{|mfXb)Z-}h5_g&@}cx2;s(dzrP zHZGzF2X?6;OYW~T#Yp^N4!1$I$5;r&gVU<{l6|@%oLlp|9arBPJsMrtW8h zzs&--@tu`=PhZ{}GsmOXU7y^<7|1{Sxeaj$F|`HqFM(4y6Ua-E=i z$rELDkLOnm;`vI$-hE;LKbK!v)%_wME4KtwtSA$h8FD5cT#VloY)}qW}KB{~+7yOuLYl_%g>7Rg>q_>aJA{esQYe`Wv)9 zV@2linf+AF6ZB8x0P9gZfTYE8btcXNV9vZ^@VebgQZyIs*3=uX6-9f?K!(5w=2`u; z;)6BD^x;qE40QajXC$cqrN7Dssv@KU#Lw`Xm@wfdFACW)&n2C{G1QamKrZp~{J9-V z?&#yX8;R~RLcuE{si_MUZjqw<-gcF^aI?15ZC*>|I^Bl%z7;ra2NP6*t%mg&BlK)$ ze1(O2J>X`|?&MF&N~(L-*=oU5WjKl=hPNg39_djp z^ut_9!nmV}yV;)OODw7UFW?iwslhm~D;S9GW|@6mEMUEZ?JY#lb0~JD-F`HSTN2z zf>?H}%D**;%)4hg7wJ)a2{Y-rMNG>X z-jrG5m=NjX5dYrOcE;g$BWI1tx8TEeNgccz-dZGHZFcj4CN1CHopvu>aY_mf)Hk}O z4eK&T*rD1cG%&;<&-V8xv9FJwjk*-9*h>$L4JX}gHA$=0huEhN_*OxL&w7S7B)HhQ&EnkVq4Sy?U*md}Ud6NqrkX_tF=4tFoEleQU{z2vQd4Q<8 z!?7(;q)Ql+@Ibo-tk*Zkh%z$loo}r$5@F1@fZhkcpk429|p^3%73D0{&`@hk2rMG(alKF2%&vFW*(tGl6dc26o$Xi3kZ8LiKIxD@;sUN zot9)wn7Z^U?-fyofJzQv@S5Sn*6nMGW#z4iPX;9=MU}R+f@t_zIG(ZJ#q-Z}asB%8 z25$j*k<3+b;TLg@Rm>!GHYD${(%CRd!wjNH`r z#wRYk%v%1+lHqS&L7CM-Ph{zRRGovGKp?Y%(pM)I@cUnhX07GDu#^qxASfU2}i#g2s z9H)&Rf-)hu%!8DHHm?~*!uAd`uU3~AOmT|FHSQ`Gvwvoh7p8gfq#R#aZm~Bo%2HY6 zbSU3e7UIx!PBCps0-9C-N{~(iT{%xEB*B~ldmOu!M3D!#6yU>thv1;%-s*kQJ zut+8{L9fNJVbSKJGwCEzpAIj8;(iYX>>;_gi-q5qIr$;Ry z8u+L!=mCPJ;&O<UI2N z0Tz9|n*96UpvK;`%;GVy3yb#1m**9I%6Lx6)7DSw!BU~+J6|3JG%kGSyiSEnk{p=M zvpmD=e<$>x`wW<-DFNtIh|`Q8tqYrOaA!n9>+ms9dYhdUx6ja8^De2_UNwfSCeLlKx6Lykq&3$)8?RuR7lw3ZEK77(OspJrjdVkjY^xtDI3Gl;m3<+ zb5pJpa_?BFDrYtiH454$mTQ)x%eLdWvSN$GW$S?e=OgWwj)Z>H9-|ge`WCM1x0$5s z_dQQ^7C#fR9Sg(9F@^%#2GZ_5!+yIR#q^*~Mhms941hw{RL{$k2%6<24>nz)3=}bY z!@)FC4ad(3%sACI-Der|7T>kkeX%)BhxH{AsBlrep#O+!fOh=Y!u`Z_HAt|WFOwr) zBYjF6`@(`h$z5^;&LFWV`m(B+fBcN4Y{qM_ZVwF5#K7DC$Q4XQaxb`xUgl? zKs%xGyM_r{%>F+SBtAXn-P_$C){{MF-%!%m1Q?PGlGK&`W0aPjyn>#>bZbZN4yD*h z*`;7#6Hc{wlql`eLJM_&h<-23$HGvSxVB~jGU&@BQ}b<>7t+&Uya*{%#$McPpMx1s z!M|2SdP_NC|sNyuxkwMU{ES1u!z#;3$|CgKSFWBv?A#&VZ}NTC&5Fg7 z^wVp71Ca{>il+@hfxDGy0rIuAyMxR6>&{yRTdQ+^1(8R+I%}Z;mzv%MmsZyOl5Rt} zftJ+D^Qs=NZGQ8UDzsMSD_8%~l84Bp#v8(V8=(Pkq~O4IFL$p5mQz!`ikZyzIpf_G z+WiEWU7vN=lp~$YlVCKW&BA!^+%nMndVyl=$Ty)$^=L5rx~%jm^T|-)@lp@a-a&Bo zly(qldHNfCVgPyICz&NTuxg1=Ceq9sm&tJqaI-+Y7_$4ZQ{X!LOtALixz|ap0!Pw{ zrqxe9UV*Da&$fOAK>H<%g2<&_9d9}0s5i$_jt8E&D!tXsV{Z)l?g|87r7>^6W{`2W#VHM&1{BUronn9d<=5F@V;b|AP#qyw%%-wX({l`T% z^<#_^s~0wrkvwNR6Swve`y`~}V;_c*+k!d*%v6jNS(?)&Z|@Mh;tS5OJf3WI5dbW= zSWUUC)Z5I*^zcVse%*Mb9+`>!*91fUOi7g|-j{iAD0FnfdllKYzUtobm!JD2e9GR$ z%DdWSQkRocLK{J)w*-7Jd+Su`D4Mr#A2SM;F^rod`hBeE6();35i5V_Nc&1@t6_(U zl=m$ckF@+GvO(qj#E1x;jEK^q^oFw-J=r#8pTj83#u7LZCUlt@6UyZfqL~x2SKdbB$Sqf5fwDFJ|q_ zG>3Xb=YIevxz*zlSi*g#Bm~luJ2;B59$$G}qR1aiqP}dhsgdVAkBJtXt}IWLxF< zfQ(#@hi`XO4mXpNE%TG7n#oi+D6eUuB`m1s;XWQL@aAa7_2lR{jT1;E8hdaGfej^Fo zO8DzTKq{kv;7~nG>5=e25K4~O(2?Uca8_}wtn+Sg;2qWZ(Ef9IH(>5^V(CiXhrYcg z1uAMO^(xTezOvBrHEri)Pk)Y98c2(u6~MtDYZUX@u7V+iJtVb(xlz8G?JCV}#q$d8 zFQw4^pY%5oD84|2SE2d_&{#$RkK}gQh!@+qnx4II-cI!r7!O12($Ipm5p`bGek-HYC2gB&L<=Ljv=|nhgHnk-w2&BcO63scrg*MNp~%qoS6>~250GQ4ZeooO;NAgq~&>Twywu@Y!* z4m(RnmWr(EF;(N6dwM#|fi1m%rzry`TCx7XjPL|XM^tpDCC3&3G{8O^>w!+kHnITB zLyR*fj;s4#{vtO3+DY+?7PZ|wCv=!FP&o)VG9pYI^3?IGUF!uc2G5%mw910rlZz#C zAr%|dzT2-C<8EIZLXYP_N;AldLkm$pE;Altgv>(oU+;<1OIn}M+B;KqnSnr@Rel2* zjkAx^jB2IAmC3@!LH*J>kk1T5pk5C5TTeH^d%&x;s%Uh|Xa=@VVQ26dOneZ-GBe8q z?`feP4TY)%GlRw$^X^K*O-#3{W^@s7%hJwTK7R`H5U{Fhs~cEw@l^r{YYD_bFwQ*l zaLgm5DF`hTyzX!Vq!=CIl{Uffy`1SKf%`>G{YB~_j)a_EeT5j9Rx{^JgF{ux=@95D zR4qhF*pMroov6IJt!~dRpP7F2OhQ}>DT;E^qx;bX-l0m`ZnA8yLG_|{s~j1dO^FNn z4nsUTu2-S9=>D6LTl58LUc;W;8my-5Lk5$K*RR#e9v>8-mxsL(D#MAaroZYMw$tw# zOWOVSI(tkPya@PzS~mZ5hbBl3BQJg!1JcVi$Vx)dS6&N)g(fCG}K~T1D zZ7jpt+scD2v8*_fDAUpb2gy8L>P6;F;{7Gi_qayqg*!=V2i6zXg4<<`rOVuSucDcU z?rr){v>|jUZ0j#Ovf>*h8Dl4m1~1T)paWGtfUATNxfW64r z*9mAq^|8Heu)Tji=r8kK@exY=fqWU3$m%TnAbn)~w#+oQ$k;z_Ldu*zH;kmeXtKQz zd54U^z}U)zOFceZgLnE;68$Y!o)iqnG}c}P&^k8B?HqeI|KnZvrIZ{CmOn~p2UC4^ zQI#FDu%!ox&nKnH=pA;SJEE6X3{Cj@6*fS+S;NA!d%WT@&k(dvH5Ee{=+@X?8`LfN zV$(K_3*Pr(Cjy@@nkrNZfTL@}iBb(iyavF}dT?;US7e0qviTZkOQcgCmH!l*&srw# zfN}{(L^qh~f>A{m(&|8^p-K?+i6flRvhW3cu{E&&J+x@7wI@P>HchvQZgwv-`o}2M z&F?+T7VeO%bE$?=oAaMuaS7L|-Xwsq#^BmhwAFB9sQQh!n~>ANDRAB;mE=J}Ykt2f zNZH30k7&XGQqbF+vqHgI{#_;i_`8e%vQ*D{USC|Dk#GheV>EFjPtHVzLpR$ISBCt! zUFB{iduT&=p!$W7DfRMZ0X=Z|E1jegRS+Jm$^vOhbVA(B;ue#QH@r*{<|>>wqB4Yhld5vM%Dvs#R@YrUU5`S0ngtNWU zaFX3mR<^1x+1O#Fu!2zF#a5NCd&yYrz|O-&X|uvsGS^1{$P|Ulfd7PxoQD54|KvE3 zWWWqn`WX>0@{9qoB~obRb2$1JqeITV(g70sIb&0q*j1+w+6r0b?cMb1Ogsdt!@vlv z=|C4py;tm_d^Tv&6fa#49!Ur-5?d-dRyr^&a=7VY&^glX7$uACq@&QQZ^8y1$$s@x z)}_;49k=(q%OR-z>EQHprk4jEc;>OGX~YENcMvTPq`sy2E-FkKQ8H*<8*?#xLauxOz`}7t7D46WY23Fjv;o5N)a}E4S>e zZ%iY%r`sEz)ioE7ZgcW6uy5%G*pEyEw%G+Aot78D`;^FMONouy83wxp&=_Dbnw}Q9 z|Hws{Eg_B&%-K-`sLM1NfB z^NzJ@Yo)(~VrJZ(mBSj@ycgO9yafDL;A5-n?Z5cj%P}YYP$kV|^qQ}@SKMwSypAC4 zyY)Q&Q9Sg)-ANeNm9Nb=PTDt89R__;m^^_XcJ$Y^k?*HY};PVgk5k2vbv4_|ad6XZ@gC*JyzhDe?pXt@TYz z3tqNVUm*zW3#SOq6sH|*$lG%prU%IdPC68*P<=5d?=4pC6onMQ=ilIE4FTjY>%s_E zN01V$;ZBhOHvs7D%C=h2mT@(IvLrVdqJHOezJku7#sdU=1fSuA}()H8x zd#}fLkD`|+Rcd-y^PV~wx#)GzUG84>5oJG&aydgo21#kDO@iD~OIo)Q?1?G}y*eI| z7H7+^&ImtI{dVwtKU7Z6W9Kokx@zYgoZvKX zX;COrVb;cP|BasOBOfb%7h6($my0$$x9Nbhnb%sS8$#tsYkn*Q6Bw7~GRqFygJ4Uu zN`f9nTh8gw_BaI{@94sL2uW;sqv{*n5dGCBKx7)~syPAHCg60W3p#dYo#%q%UYQ3{h*nE6^zaG2X;de+u6Ph%F$==(| z&@})2@{vDf^yxURk0tT6i`P4L0_2&txD~P8d}~y}AJghMlNVVg$n*1?=g+5N@6_56 z$1*E;UVg~}PvpWvu(eEt?V71aAv~8(1MTr(G*w)}?z&xl7Ws!?wxUZUi|tUN^J8Kw*MWS=;&gqosWm zBFL3A2{e$=JdT183_WL+w@(!DsLD9CD~Hi2s1hqSTHt%m-BrVfnU-*$qd~~=*{WSf zzFRTY9Wz<$>F4)L;kvHn;W``=ggg2k%pZPjWqUqpU`6n1%^qASIIJ&f6QQ^mU)o2$ zwSB?e+mo10sIC&sA7{iec@sPD(0e?DLSFVb6NGNPb8=*KFw|2HyGhHC*YRGwF7{#c zRrdbc*e~W@7(a@juyANPSjswHE>H)>t54V4_#6+IPpfXUNs5CE-n_CvpV8XhN^N}z zdq|L)+fk=b$ZF8`(0#&VR6lvazVkJ0-8iK5V6%Rv!HM3)9TGm^vP?hZq;h>$^0Vy` zs}z;XItf-sgf$)Sz+H?F+cWCypjwB|_Q@WVdtaFc11Wt#5|hZJ*-zd+Hnb+bKzG9J z25G6|c5Ok~fmjM2k->DYw29P*?!pZm$nzdn_A-cZv`ZTMyqpF!V{0dobB9GZvgefX zvB{+qOFV|KFYmn56n!$Iel6Ny9u^AFPJx%@4@k~7 zLLJLe>7RAv2qR}VIDQx3G8}aK>{(_!_`cL54WB!ihhmLr$Vx7bsp6(JPsZ2>3 zK0&mXhDIfbv9ysDtOri9$c(_7nYD7gB)C0(@V>FjdxV*ILW?5W4U==C=4Q->dJ`A$ zM~J&vR$|!fyjDB3^q}7LcT|2urDy2H0G)s2#B)U%&Wr@3ruT(F*r1t!_B+!1Uf;uo z9qzSEc_b`AzDgSZ)cJl8@c3jJ#{mP@65!k`)|)8AA*RLtT6ppffw!?Q!S!dc2B#Dz zci`oxpcfIL<8I&;+yC?e1RrSSz5zMD#8)!ziyBkeo2b?|N?gtEa=3hWI!{ zFWozD6`WC1lk;J#%^kDY!RCTk7&EC^M24UZP2PXbtznKXx3(85QaV%+=syuO2pW;kt0B zA_V@p#V3xEYaf=Tlx-*db$S0o01$FHzs<_2*YRxLA0P5l_cPJjwz*lO7;Z>pXY%j^^|g&BzJWL25q`fW6~%IU&$yL(3ojetjqpKs!cGq=RhHLG zVRn-amIg{MHv{Y*RtySe5==U?3?qt;?A_{}GYID?xPyRo%$^{kP&Jg|qfTC~5I9af ziYOy9#Tl~cRSY@v7-pbQ*^FU|1kJGxp*-3p2H5y#mfV!}&v56|;c|46iPn*xc^a6-K6HF3E~^{+3so0C^o(8Qu% zPzaS;QW3Z`Wnnu0%EWqGsm2tjJELX!Wl6{+Gxt~Edy6CcEz_g2zTsu(b7p7Y!6(P) zOgpbmR~-lFVh?Gq!%=ftznkX8nKAb}_=s`6BOaua2ipPkTzf0h?&RmPlap%-cb#JF z&lc6;8!N9keWj;Fq2uW~?>L3?CbtNiYVSmo>(k6j)SZ_jiP0}{X$Q9ti=AE4*dQaq zpbjL}Qm;HkQ!bjp6_e6>2)SPrDpA~I5>Mk{%STf&HU^K~D<#s5x{f?bq)wR9fcIW8 zR@7K-q_WJ->l9G2x4E~uXWmpdY3*Ekcxl%pk6uvlkDc@B$pS-psFHwlW+Pw9*}A+N z%jgc(Aa`qgCxNP9WYJz(y}*2^Ax7=PTMjs)(^W?XfB3|9K*-Dd>?_cKc9N?wlpbZE zbpPxLo7OfhKao?M7t}XeNKr1a#WlY{E>ix;O0kJ^&wA(UJ1xdXF`N{ALn0&Dfw@T0 z5q&OlzN2U~JSUM=G3=7M>TB2?dVgOyUr))Fn!RFckYmpenR_qy=X)^x=<>hlgjYy7Wi$O~96l_Ps&7VNpDLm#5^( zCVJHHdfaT)$pO&!fG29A_=V63X?_cKu8@DovGG-4|7D9=hWPX3+67)`SNFoim@|pT z*X^j-4rMQ9=q;<|9wJ?#tZYir)lf$U*B8d$N94nn9qe} z#vf87|I4iDlF4o%dyccA@V%8LtA!||-v2|?HwIVMJzvMRZQI7g6Wg}!iEZ1qZQIGj zww+9@_ddU>f4yJMw_CT)*}c2h?p|wc&o65%>v5Hr;mN1(K{D&=M&`6XmE4` zgS78Y^k3g!YmPdEC?s=c$^wd?tJ$d{fB-u_wyyIDIlb}8RAk;a|5+AvuhO=}ciwLn zcL=tfn3)c2Am`+?f4u$#H^3^$zcBy^IAa7H@1ZL9^Or}mI~Pkok@^wrDoVbVsL?cD zH>UKD>%Oi9vj)7-FqQDUivX!h8`JxBkH;zv_D5r1!hh*eg@h# zNT*;Zbvy$`v4&{tdWO5RL3uLN(1Y=|xzY+;51wf*D4-zejdWRA${0@0MkxU(8lX=; zoqu#00mBceEHs4>A6mM~pKz3GHN3)1@150^dRAC*J@gcrT|c(n*?S|!ziGOle1o73 zoIR$jj>oVAB_Gv#UK6WAsajDOeLtQeuBJZ8g@cP{YoQR&j%8u~EgGxq;b@e6t&thd ztsWcJ^|J2uDpzOfdw}ajFNYLNJ9#s}P`B&1&=)m3REXu!UZ3RqumngX3FdP9;%!U4 zhR2D|sTPw`wt#HyBT$?ZMIN>^ZnyC7{K|jMdw((F*tS(8*Y`oU+x+qcZmaOCq3O}T z=gntF#Xi0QITP+!Jy?EpP{AsYh!XyXqtu79TaERZ zg-%_DvzgT&ut z_veo)VT~gXO2&U?HF%@@gR+lbnp|(^SbtLLS>R%ds!m!*{aViA%&Wlj89Kb7nCr1haruD`EZ-Om= zHvvEbE%=;*>Jmz6JRK|>ScK2hXG>r#Gm*^Qp`;<$L(1TQ*-_T(R&Bg{Xbs??{fYjm zs`q7f#$8dIg5y0VxIGZ@PSCHlBLT>jFHNG;DFbK4P+%C8a{FLJmbac2QK1Vo)8G_9+;a2}bg)Xi{NJgMI#bW{!A3lYCOzT`JZOFXL_z^%pi6m~GAE9(27e z_Lo0<26Wcfc&8f8I*!s^UvKICZFF{0oJ#{NfCCQPwJIa3RjQ_vyNk}BfC8?(NnvZR zW-hNVep|xC72}G3aaOMVo1{^*f>BDU?*ix=iG5*Yf@&?<+`arNYqhw?fp*ETQ#l^U z&N%-W4fy6J-s;hl8)8SI6D&>Q1J%ngPcua;n4}!`3~65-I9&weT?~vcWF)~S)7^9z zR6<)A-qb#9GOWNK*f?72hEy%cUMyl|H7NH^5HJ>`8zyCQr$z_TOS#Pr?io9;Byf+R zsA_dZ5*%gN>Bj%}0u$WZ76_k6H8aF|^sjK0rwZ;qsq2n76861O$V3%T`8XeRXs(mR zu|`@^OKM|ccr{}txWro3`>|op%DfVC?TQf^Nwo$gJ_rOVo%$q?R2I6Kd|Z1ptxf-( zva73=!<Ox3wFuzdOx{1*e1gm6+G!|#%Y>s`^48Z z?GAxW+265h^iizX?nunu9(nq9Qd+0d!ci^|#*!T2wMM^ZFejgp7y%5P22)P?Vr&sm zod>HHyKGygc*-Pn+bh-!%KPMZmRsSAy_a+P-=C=j$Vg%%^Emp7RkEg?6@QOZs)R$c zKMcmeELH>b;1Lc*LvE_Ol=S*-5!}+*|9|lSW<>va0faOt3m=xDj7CEq9W7HT_A?2P zF*=R)erUKCZ}NG89L5DbZRbaIGEZEd&C=>iSI)7x$WA)8gZ26pFt15tKcSH`zto|+ z57rc!jQ0BUN4uvh$GZ_@NKXt*B&U|rOHcB^GgHP)p4VuVNg=Ur3Uq`&AqPtj0txmi z%N`T!NNqrTn~N+~*rTc(R4Hrerw(nJh7-DkIngqkFVu#dVd4@-J%_;jutA_j*;TZa zo7ubIEGqhpV>&A;z^a>ED0KbM43ysY5nT=2k5c8lCmu_l)1W(FOr$Pay1PRDFr5Mb zJF;_UHY&2qA5!Bidats`en(;10P#oYr`7Q*EN$6V7^P5NYzoJ5;M#kxRgY+QkB-NC z!Ewqz)w1f@GN>WhRO;-E@;N%mh9MNc?NMMx;6|_(hv?~3rWuxU%)yBb*uuFKt0S)M z{BQT<9b?8`p#>&*y9ctd4VW|tS_n^o8JmXg6YblumS6!N0-Hju9F~&$=gzS9)i=<= z4etJfwUtk7Os(C9&V4kL*XrxG(FdcA+CeJhTD#JMCnij@9O0{&lD1ME19n9XnE^v# zYUaZ-YwouDox*#H_ugwI1Jh z_=+k?X~4~Lr`#?Vi@Ka$?#xZ%y0v^*TuBrtgyeJ(%zj;0KK;`z5uMIjWmLw7O(U7< ztz-S}en%$&clSzv2fNc-2r1Q>IXmjj+ijBe1}ZINMCf~6Nzj+SN$OECvn90S zT)%w0X>Sm31*hVWeHe$yP(|!X{Vh#xz4)7qgFKP^!W{UjY`?h_ z5oe35OkS2M+*4B}4@i4@0J{@_vk?B-K`u4HzNOjKI~LRw0`Di1APAlTv&C(+L;*01 zpO%fZ=p?Imdf6M2{_!F${U=0koU0vPhuK(JHBXyaZ6?(omkasp@VO@QwZ4(M2gEm5U!IOc*4jrf)K<@+ zIglv`q%hr|GRBjCDgQjqgvQ0Nj-Uoj3*U-+5kozce3`a~5cbw!(z1?c*MOEpB?KGm zzw2PMvyAiq0q4}%W@IIZdbK_I2ofCLH^RTdLR*=zO5hW(WJXLkKhIZ?xjPkP%>ZSqL7vBY>f z#_vBpJx_P8c4^8i;yr2fI&!Iq4`Bj-@NO5dEQhb7*k&?k5Z3Z;m;?rc#u$tTo?2{C zEC&gByVX*DOj0fc_v=-sCz(S2O5|&wUWwh0F4-!5w@8a7d7pSVIK+i{**DE3ZOh#G zr7g=)13)f2i>kpAU^K{OT$r7#XYQ&9s=y4gt2HmBY=RA$Q;iqPu=+a}J-U&d4RJfU zf@q_>^LNmTa(QdXPl=ISYIP{OS_g~~aa_FIp?KeDoe)m3yNJZqul|InG(;DOY+cV zB(bP1Kb$+z0n1%5-T6|46`>T8Z_6j_D@a#LSt->yEe(Wfio1z_=ylng+D)wv>aF}; z-1lyD_iTAqV)qZ`ACB`Dnf-^qrt!O+nbC2!KP5kTJ)Ci^WF42hf_>xDT|FhOwRTU1 zcJ$lAM8AYlu;SyjI7q<;M{OXO_lA%?`V9<_m_~#A1B^q3An%yQZ6M(B4g-wEucG7W ziohkq#ZZK$tu0-vIG>cfdY*QsqtgXRNJvR;eQvkaUGa`qfo**E4h=&GP#CELN=#v{M7^_@k zyxA<2$e!XAvW{{0sq+#PZS5O+9RnoU4f%EoD`~szIdN*Nn``&)li+5z8qE1W8mF5c z>kgld_0d|qQu|YGQZ_pd_#YpRu!dmebED)hPaFl3dvbmK`tM08HFbHU5-`!k2+3!E zq9(^5qf@>y-YA_ar6lr0AaVGZkS&wjo4KOhr`1UZACdqwrLxSHC)niW^qFhdNvpsW z9AiBBm{L6T=o>E%B}RndmE^6epTNf+d55cU$<(l_XoxAeKO(#w$xeI+&X_6gSyTrYZ?Vc2y_qNnQRns0 z+<2z`;AR`ac0tj=SkaVWmtr>#`>PUcV&*$r?hPKNtLxf3j6SX8#`1J#HhYVV#Sj>MDvX6oXr;5HE=ts01skcRR*G&F>Njoob0%76)1`k zNcvmfuv}FAOJYx>#?V<-S+M^m_3NW}LnT`s(ZTJ`P)%-2%yFx}`LD67rD*P{35^K1 z0_7A;WZyaWZURCza)h|_6)Yu3N+i3d$~fVhaimC6Std7&ayTN3!nAfu_99osf7kI zrevAelVVTgGa*F~z3b?SRpO&EmLmbmeVzb&PI(XEHr2^6jN zyQWAk8`yM?*AkMpTn;$o2)Z(gXep^81u_UpCwaICjzC47K$s5s(xobEQ2PnW5=hmm zB-qVViTfh6NrFI#EiQ+JKa)>TgB#WZxbf4QhMHcs0sC^X@GC+CoZkte7$zmsRL&vL zyj??Gk4$}bGg>^sa9+jck%~~vpYmQ4j=OR1SqD3k6zA+W=UA6WETqGgghXbSF)4AL zSv^7wBIi6h5M|$l((oab&Wm?=-55gQPSOlkWRYkdii9bdRR-KF% zP^kcwFEEJS{*+0}VqF|;}>|V0s&@toG);GEg1M^_h zOl3YJLP~=<3~uK^Ej?#)uxq9+FuuF_I_wYF4s&w~s-R9f3D>Q4AK3Pyp#+dHo}v4Q zf03t3RMEw#Y2f1%Pr;r-Z3Lo9@yX*gGr{&p#2TOW#XqPZx!5X*k3SMfnOYdni(TVQ z;6^u4)V9>lqh_Bk1a8)$iRm$&#bCjwY7*2mHo64sG5<2nux+xgQqo)`NSJORUFmf6 zmjyc+7H}hydKnu&|C>GLZDoC3Y%se+G*<2XztqXAdkK^yO|fs*i!>9QNneeiWTScnTX51Q~Dcx)UhQdz_n61E?8Pc=^*j zR>Pz)k3$4{ehnz2Iw&=KpudU|_}8MN7Az@-(U#uCuj8x`))4uk3$(2YkjOplMX?ya z9&I1${7{ftQj#!z{&?p3GUxB&CYo|*l!ro#sr?#mO6J_xSzY<3Z^~WRoP{aV)G&|5 z(qJa3>2}@UBgHaR)-6$Yw#XRz?~e!!6Hv#^vdZgZBi*i|k; z60iUCOh+f6;J&{NtY!Skra)E*Fx{=s1`$&c)$H(LHSpLJ~SR2Z{&1V(&!jvg&8 z-DZjoDs%|rkLCrpCHpa9irslxDpg}urB>AEiuHyBV@DDl4exa38tC~XmxyBqSjvqP z9GiTD`pjloxfZ!5dRJ&-=*AohEJ9guxC*^)^0n(H%oiQe*~V*j%xL}DBWXRjy6a`v zGGQeI_^xcStD&#uuGcC@mccOc5FhNC*0lBb$(HA3w7R&YM|X>#S)ZOpxVl|r{wNIw zAsVPvbWMR>PcbOZL4_N!W+7;=jb4A1w6D#`)r>o4cud)NrY2nY)8dAPeqlr-i2{5s zGa7#$=qRTifX?<#L^0iZZ9zp!(v*tcrED;};>f+fbe(Cv@955lOBF=gcQF4?#3Wg;{KA=n$mJ zCCj<+emp*xy5)&{*D z%`$^+PxcCl3*S6Y{*ta9>ScGa+7c@M}E5c|#AV_`+?t~2ZaoR!w)XqFy(CXeKA zr@AN9*CHf!oB0hz#W!XTR4%(Yk!9Zhc0_trj@Q$~eo7)D^AmUEynQn{5FEPj$mxTV zRi)YA@BzG_JBf!PuhbvCH&8t*-#wzNdIcDT*cYb*!>Bz-2zN9f2ErO@f4pxw#27Hh zL5Sn%NCeyn&6r?%Z$yTqi{qZcfkPMzmtK_xvh z)n>|JX5O8geMQ?A_u8jEDeZe>RjGHaxXYaztZ`|k2xY(hLe7AIVn74*5I~5Edx!<_ zTr{&jFCF-iOnuHYPRA1T6R~wUsoTDE_rJsQzRPPbEX-Rshw5tH2CV3hq0iW>z)iVZ zW21|zFh0TqAR;FFfidq}9Ncx6ZR`l-Ru>j)IN{ULxzK>V=XaorExC~Kh#&=;KVe$f z0y6thl(If+aNG>!AWw#0^z`yv{AbA(^NQfO1JI|~g=d3pA>b;IWe&GiVDmpVrLvC) zGR`w2-KXpy!SeRRb7xPp?28TR<2iH@u)SYz@^zC!uUi+h<$wt5YKow~ow}X(mcXEs zqafT~NqE6HB48%}j|*@sD7+W!Zf(OJ2O@VnfS0#weWu}S!a{->vj8C$tI(lXobTve z%}k- zaBVy01XP0ozB@x~_3Y+}$gv#ZkVkSOmP=_HT7Pk(XAc_B(Xh&-}z z^)=`o&DvA&^~{G2Pm1jw?f%Bu*(+(n!+w`b?YE$gu?gj*D#2^=i-Kn;6+64$Md!gi zYn+mG-!1}COv&C>TY@S|QZdF|fI=$z3%>{Bk4f6QZU$5f1vke+oxQ%M+!}#>f))OV ze~fFg&0Ld1k0dOU!UfuTnwU!J6fJWcId)9${|d!{7v{o$M;~aH;7z9J3Y~n5po0$& zQu8;mmLQkUCWGyCWGChuVB`EW~XXS~mEF3w5Vj*K;wnT@noTsi-> z-IMd>KE{HEW7<-W`X{3-{nRmW_3q;#2~IWu+?B@eq$B&pIGQ`F+3|Ue|0r<55SZ6& zX7}^y$q7ng#OXN(?(Z;p@EMT~^=Y6fyl@`L@sM`O=f;tQ*n$?vOS=XRjQ2 zfmh_&Ji#%@)ZL-K4kOJ&dS(dt< zbBtS>Nf>&D}kajz{QfvJ6zInw=6U)bj@_JWW|23P&@h2iru$ zh$jcPdrF}ZIMW!J2*WeM;Y@hAuWeN_C@sic5iUJJR$_v9Y-7^>eo=kP!(NI#{Y=U{ z45IOJ_~IO}^`8`8{0tN!&P)LevkZq&`d?V2D%qyiK7%1O&e7tL@B~89K*lgF!hL$S zsf6$*CJ1Cr1$!|K@>E!f6IjgPuBd6#C$8u(jq@#%VeJQLN-ZK=*_Wx^rG1KqMSnc; ziSd$gF%|s*t{I!$cfC`rENwtr!9J=SHuN&Qlsl)3w!^930`N@eZY+AmUqXS5tOf3P(N+@P#`iDkb#^K|$dj9fy+1By)(6 z`OY0#pW^M$w;v$8A63$W<$c2)V{(u4BXRNmFmm`60md@zl!m)-dO6(gk?!ByeiBP` zJK`H;8+X%~eQ-++XOsI|VCbH4WAgly9Z_XS6BB%U`6Tlo1Mjp5pQH!UK%7@^$%uum zK_>1d{*R}O52(cE~81d0$p0??V<;iuvbu~*a_JyxSteJd9J01PwD z!ozf$_)!e%@+`YD7PV_~L?sZF)-aLES`dLBKwV7`>eH}UYvW$DrdeAiJ1cwK)u`A| z9ichjb$^+SC_^BEdGOiipZBlZH)eV6KIreq6m+OGhy6B|ljI}WZQRM7<@sys`};=o zbPEwV>?Ifz9qB2-&hX~HI+g>d$m)PDxKJrsE`2|+i>>!Ch;#$Z)u23T-|^B_1ly_@*niF*MNF`_)g5wnsd>LvHV=Z&@eJ1J0SYKu{mM1LyL2KC_)` zuAK$+vXM!^xs7DG^XSo!>2&a2vvn-1x+c%ut5K|mT}%C{ED6liN5lmC0T-tgLwohq z+bb{X@^qcR-qG=kPJ8oGrKRTdd&k&uKY&&IwtWBJj{DZb7J>X%B?0EjoRjZ0T+&4P z%sqsws!{a%*yFWLo+)@w;n)Lj$clS3z9qo`Eg^R9oBaFI^6=9+M%LzK^6@Y zyaQbFMz?yNS3{NW#mk9tJ+u zD0a!zRVnyxyS#KXnvCBLM!8$tILlkyygSua>?z|-xW9J%zX_?23SaV!oiz*w*?5J$ z(#Qri==|kNA|L}cc&&fDK}oj02MMYe7o#b)v-NqWMo+{lJG+bBkBEK`^9bLd`@HvU zww?N}Qe*T7)Q3R*l5=>z1b!9YB$IsH69;lD70S_g(OI9p=k*vn43$+6)}`=CZO6e8 z6aXPd3XM zsld}-Vn&i_>l|R4Yw?Sq3foX$=kzI9Q+ix)sZ|Ky(FSITdt#BXhWVpbIwWt9PndB} z2fZvdE=W9f6}jO=P#7lkZ6Axx!8^;<$QdU{dq<2-LQX{F+UNFMbI@KKFfr zSvKczM9|{YLvH(`;?bHdo276CxR@jw%d^+08(&&PR4@uY(;1bGQxT@u ztD+I6JE8>|mVkLa^0nVku3Xd(WDC`%nQx9lu$&x-f-HSEg}YBmPE@-keSKF?w^6hjmC|C_+K47#qGM6blzALC{iuH*5bmHo<(Q2lw{ig_cBL72aJ|Wpueflk zpmjBODhve0kLdpv%4@FMzUMXx^cv zzOqndf+m({=ojp`cSOF7N;{7q+?V%e?bu-;r5nEQuld@fE?I%!xR z_LE5R=~B+$hHj+SQ0L}%)mZ6po(6sy*}JuH&jHeYL3I#$L>?-yL+r0wq)0v>jR1Yy zrV6y9hZp1&46Q544#N)4@q``TJfz(KZrRv5BRxAdcPH36o_IGc zLYjdtSypBVX?-|J5B`++DYBr&_rDSNph4;=F$>>V&G)cDqU2!lSCg<4-{+Iq(i18( zU;2JC`s&Dcs8%;=@*;9^rcTNSq`}Y-`JAVZrzJJ_7*J?paa)#?8t{dnXnyb(x~$Y=HgFqRO|%jl0UTm>MPcZrVdwN_ ze2kf`l-kcdQ%*3t`CfXg2Y=ruR#~TNV>_OYgShYQCawiU%Ui@NqJ8&I%69e|ce<)% zK@6&&C4o>s?QtC(#$+p{W_t`6YrM+xunnNV&pJ!TVd20%cbp%G_75!gKxKGOZ9zGA z20X5|R=*z!F>&fat6~z9Q|=frn1<}s?+AH%nnIA4M)1;8<;oEib(Nb~vW!+Y4XjGK zEi+gvP#jMzY@1jGA;|A2ga5?6nG9qDL5Trr0I;wg01)el=M~T00_FH9;ykD@5ryVr z8{wQ%$N0XqRf%78aj?2WI! zPu!pDxl;n+d~+eJ-gF>w7&d%0WxQQtt}1|bDZF~gsQlrn#uOti{&U8Tcp9AfF~YyH z1-yG&n!@U@(i8Fk6XxX+%nx8D11Hg*6Nrp>-x_lN{HKWN zo41poqEafED%#1urVv;P0T=q9(21G_;}FmFn`v(20Xk?hyWcZou1(($6V^LsEX%_7 zQc7tq2=yO)XeWk~a#F>Wzgi9Vg&~{xsu~e;W*l7_e=cG^_u+&aYwmb;>5b`25}TlU zG6v{L^Q6dY=u_$H?L{5S;QKYh2RtHC!1`va1aL1};^#Lp z!sIIT%PCJWbQ`9RU!f07Ej9E;LW%|-ZVk{*Gjfna;HTb|7$7g^!}}qytcs8Ck>YtG zkz3%t`C%w3$bKWmQ4f2<)Q8B&6yW?+$BzZ!PGUQN<73=HaDRg!S(*O!*`y0qqN09| zIJBPJWEs~Vf&{2k4bdwpptaqwEKKenYqK6*C4QAChP zY7f=`Zc3MxCENX`tLH?8G`6-iz=k5Uum?F$FOJ7&L<4yJnW`XG1KypPXz%6p3Nt8Z zq)1^{qTz4E3!bkr?qEBHjZiAf2fGPDg;JY9q%+l0VHU$8}Hzl*=DtO)sORJ#kieeYKqHqzj1R^{fksir4^J$Cd_<))64~OdXiq;T-Q^!BhHA2{kTpxzMNT zq>k=D6fgN$L~4L8bp?b=V!>J2xLQt^muXCdkgcKN69h#kfqsKj$bZF~G4vKs5o>vT ziOzwx_XZOLzvRyx_xDX8FeO&g4v^%}Mab^J2%;cFX(-9d$n1`a#~#Hvm82di4BS7B zW80Tc?9pVtoj$?|a7RA1BffDjuGwq6{gu)k42H!tZWu&FU7tHsUpYNSzP=SpzMbw3 z)%2{%$}QeS0ZTo@9+&Sw7?P^0O7!irn5(nAWh;Q;J#I~PZN=q9|96V32M{s*8^*9}7N~s_We$=C4dFgWq3y z9>Ce--sQ|q$U<6gfBP01P(Q~Gud7y`zv2fJmQ!kc{;H*XTLYsvPsa^kkM?LP!Ch!L zu|&U?jRM6igSGS)9@5@SzajF5bIVgZsz#56akjza%W};LXNk!^M*PEJv5uB`q;%`O z_WNJg_P`5~V7kGN7e0rZI!e?NaVyybYO^??ogWQ#+NJt8;!eIK2{AYNRv^XiYG9{| z;0qnsSh4^o6YAU?B?NP=lS@rpjURn-oGN!3k~15o~WVl%@VqNFA! zXfi-zA*GOVed0|3;})^`X#M&a>!@QnC}RQ&sk-}vfbuDF%Un#o%%%8g`O}6CYT4L) zezb@1DoZ#aOokmwK{jKYQ|i>*uR%p zx`pSQJ)Z==aho0jq;gJ?ae&gh?A&GfXy`90pj&?UZ=a~Hz?pu&9gp=a4nymtIJ536 zOZ(D7H_0?=Q^_WVb1jn&LqU7DyT5${FmiQOEr=O7+Yq{eG^sVJZdKHjO;<6F?%>&E zFlIAn%+~VgIL^r<40wF<8sBp|9@VK9ln2HrSn$Qb$`&ptv4g;ZbD= zwuBu@ypza$B$}80Xn$+tw69r5kET2fvfT?TueH9YwDAwaGO&0}N!J`n$Tm`-lV(!@ z%`2RXCn?^k+7e$3E^isVw&;1ZI27<*?bLd0rh&?c5?^+6!26K^U25;vdxWU#DJo=9 z%Hwsr-8#@8It6-O`za%>oT2~s(G0-etTq45tU|2u^H~w04F;19{h2qt5%ePzPzROe zrI$AXh-XPwEpLh;_ydgE`$4f)%Y`qg6gC4Q8K-b%10wb^;u+av8as+Djs2O){>Dz| z?lAK^XCFT0m{8Hc{W!Zprf4-Orpq8?KF^9ZVQi+|uM{}Wxcq`_Zmz=qL%8-5uEw4k|m z>bNrl=>a=ApdU$qX&QCV&fbJ#J6LR_70Dxq1u>$Pef^R0@vJ^P%_Et3n|@ zy4~!7^CdAJ0)J!FO?#mN^!$mBpI@er&wG|DAC9JZyS`Ptoo<#ou~}z4umvZodY@35 zyL@vGAVc0!P^S#DkU)HQXFYuG*0zp@qu{w*k4)yX{JrT9csYRMcL!`4m*>9|3LQ_? z6b3TKZaIedX!s%i3MmebF^eXRdD|N+tf4W&SE7xqM*5@6Fo%=DijcUIF*(8M6^|q# zzxMh+vHx{J2)l!Rf}87gaLyw`F*M@hvgUHkn}Alrz9^ z84o8V4A74c3MXuq9%S2}X@M(UK#J4_+3XS#rSDs^mPs_rBe?AJpd15+xjzp1^Ty#( z_k@A$K`S`RoI8|H*Xmas=?jbNMYEHll7@4Ht zh`1&J&*M(u3in9f-Qki9(^B$M_eGu$qu@hc@6b-XP?5zkqQW?PlzgwwpNeW-^$mOoEuRS=HY0DW`F7tZ&lF^t`- zzA@geOz_)qsrY`Kx&8F4A}Bh%!T!TWxg2%Ap?1l& z1YG6G8tC>us)LKkL90Z6?Ba^&itgNg6o)Sm^+ywquVk_61mv>cv2ENZMr5E2OtJ

elTktC&D-~=ZOlKsd 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≧`8JV&YBL-4GazI?z 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 z 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

AQ@AJn;v&1}sse!WB$FMkCR`2ZVaBjo z(JkwHJ)&0>96E*iH-a^%#66gHW{D82*N!~~_m~;ge=LC`m$tsUjGNGi^%nPK;w$Sz z<0N4$W{e+->0ze5roHavifoG@!=hCg-H%_6xwT`*J^Ed}GnOY!%Fdf4vnoxp4MM)u zpYh3v{?;HRy5XTW4oF5_qm=xVlY=WpPiY$r@hblq~!mwZS=;$^O5KIY8ZhAV^lv!54 zjYeE+RZ`iXT1Lx5xuujb#(U7fHySs~tt+ykfmC#Fm%ZbY%d#$g=*NyCC#8h=n8fTQ zRh8Pu`10_rPUKyX4*&?+^!jv8&00eh_t8r{2e?&hNSBnE8+Tm~2i9P!84%KsL5?Ljhw7b_X((<~41~vp4p57gl0j-jd zsmiSD5Kob-HbG3(p24GF`Tgw%?cZ_A6&Z`dW{a9(n0;_2;q71M_djGNysX`DreQw% zdSIlnys^w!cmtbJwD0Y;7Hkj9S@d#cZRi2P{~Pb<7vh1a7RwMF5y8U*ad9?*@r7{( z0d?i?-nu~vmH;ac1GtF4@FDY%VDYLTd1{<$b{6;^NvO z$&t!g^QUx?gVsk9{=Yfv5_z{zHV-toPN!Kzp-lo_I`b9p6Bselk%fO}vE-nEu@2yM z9;i(DjtcvBUm0Af2!(dujdesf7>*WABXX@q5)GQaiPLLE+7(8e)eQ4d5;Z9Q%`rhc z+~{LXZmuIRm|%XFtuv46xwhdfGdQ%nSg@B*bbA!cNFk`AvOLVqvD1`|^__*K)LvO# zJB&Llx@{2{z|&`RbHs$xBfkA&{<}{f$CI(Kgk5JJ9p>AJ4C&qv$@nkcPlDde6Dg`; zjAxqaDR@9z-0$i-tyOkfpY>Mtqhd;Ew^!^B+ z$MNHEyTMu?PETmW^6!`CLmYNH_q?1FQgA>Nug)%a#*d?GqLrnrx^;Z>-P%J1tGYQ- zdAFrIBJ<3KX<0Z$mCj+Wl(%+}Ap^CItM9|gyQZ(dzbV)q$WzAyKF{JnT zgnc+EHToYWUG=O3S)gOtCC;^OePto=pZFx=wak*^%JF5jC%!rF(3|`4)-({H?YrHM zBy#iWV<}vSfO(w>ehp;IyDzo8W{Rh`9YbJim>w^fLAxFs2d%sMH7*|yAHX?aGC;D8z`x|lp-??!ojI3V4SaH}J>9@qO;TgK0l>O^whNVMyyz$O7bwB3gn-?*r zj4|&+sD5tUe|vxr5d?l0%@d+Fs)b-Jv4@FxA)xU+dvKjmzFHR-v| z>=%HH8S_*YIaS48I^LFtVD}UYpAGE%=`d29As^@Vi0VB!J=EjU-CZCLh<)%d zjEp3(*C!tQbv@x~k`UIhA%Xj&JZRkk)Lce3bqBHY>$0UTI;3j2w#LGK{|nnfFsHSc ziHpyDyOdRK-HW*9yN#sHX`KkclPi$3)o3!rvr6_yYBTC{bxlQ$pavJmqoGDRO8hIe z?+TlouQ$^uJ=qt7PW4NjNmb81pnBe!E z?%bA|wOz?c4-Q~B=vCRM;7#67`Nw_!%@&|=eyLfL>{OUnyda*qKbnW%t+j@b__CYJ zY!pDRc1jmvOWuue7J^;^-^aKZC*KH4NMC$gmW&{E7yuH(EglfvW<4^1oG~E50hYG@ z7+`~6RjQTqWW+~l@GIYXb8y_zYmF!CZ?H)j5&4O;P^S_>yLjtwmUtBf@wV!W6tdpG z^~ssxtRf!Lne2UHObyl=-;;>k^MLCXMo0h5 zy7QYyFIM}zGV8YZw1n44%T}r&(Gad8<8Ug^W+1k#_K@Wa0g??yqnv|x{JShs?libEa=bY7!Lvm()7Z@8uXcYQ*!P) zv$aVESezgr49ElnG-17eP zb#on4fY*RJYerNa{6b8Hc2xXNf3I3tkEJf~O6*2)9&l{KVxE17u( zd3j3HnimG1%`_A-ncG6CUdsukiiQY^+i=x|+%6ell>vfA=RVVU=Ym)|)#x92)+2Xxh{?tJTSNMPh5h{gz!vxV^Uuw;uhltVZ>YE) zx-jQZA1AMg!wQAyA$&WAZaq zxk9?;(!uk1Z3o%iyzk7(;v}XP7gzWtt@jn5_y_-$>t~3EF8`ym zgVW&OmEju1BO_8Mf+(bfUv@r7FH)8VD%$T}y;_zWVVUPEuU13o>KUJR@hXFU^D!5R_k$ z=G&X@SdXK{5>q|&Spp^>uv$Rc@!Qy*kX_*r1`~k!Cq6gkc$9F&yvjkYK?|Rp;@{8E z$7K#7K$ek3HOCU%2@H7->{Q$P&W#>0^`zyW9nhP)`A&Ra!kzg02H2B{7zk5ho{4f}Vtmf7B@HW;e zz=$jRjHKwiDAjscWw8Q&yJHJ3_OAN-eL|Kbf^i>z?0k1v$miVnmKanVpRpQn_Hl?! z<>Pj0;%yt=CpTI0N=&$>XVY!ap$@lj8QiaS`F%f=eh zKM++$n|}rh4?BI{`P0%1=Bn)gMRC( zX8ET1B(GWr>|&IN7)Vn^yG`Nw%KxcPg;#1n8FRx$&)08&>OS&es4s^QVA%0* za?xcPu2UmsycHVP->)Ie@rLV*N8jmx%lNQf;N49~#t&)q7dVhJ0fq>Yhk(PH z{_!TS5qCv*EmlmzG=aSizQ!=2Z()37E^_p(MXwf2B3-0pTE99eV8QU?Vrkv!X|i~o zIE-;N0s$PDV)05+seqpj4xQL?>|%JF3u$^}Exvk`c7iRWbz6vHtq}{EDp{#zcA2^K zce)8MFmiIBjR^gY<1UK+wLVk@E+&&4#zs_!wGEs(>vMeloDDzCD19Dq zA_($hi+_D$QHtLKJQZRtT;yyI4@1M8Ia$)Yp(iswWipX2_=~oZ0~_hYSLHt*-TMXP z0TfcOAgT9IBj0a@#Z7U$SMcV0aH`(kvgUp?ymaXJ5;Gi(s}944d&rlb4a2&Wsgkgq z^k{AaZ3kVO7T2-ck_YNhWk3bR>v4DlJhh0(lS`ezmc>V6vkFe7VVdDZs7H=)*Zhzi z@(01mOGtmYpLIj%J6X@3h?Loy+aFJvNV{ld8?LsX&k@t>+nNRzw0m8j!T~b^LI#^V zprs*3al^*z^o*Rfl3SYC(kAI;7rETZKb_QgmAR1EMr(G&A3QckquxgyV`;b41KY?W zH^_PR%39I!Fxm(hcb~14dW?QxNIVTT=oR;CY!qgu!B>pvR#r@dGU-H>mxU3%+q=oT zi38VL>25TT4vS)kA?Veci;dbHH-T@r1x;x4({`B-PHq__NS333UjFgv=6*AWP(!ly z-lIdjeOEIM?=H1%%q~MW{q}xaKI@Os>o?riZi?LEg~k1*C~>ctTS4KJp52D#Oc8+- zvUEE#JgPKpUT7oSI+xRD06VT<>54ZaRxZ5s(Eo?X=5L-ZQYHHDq~G6suSdafQ7Cj? zmXHl@>{_fo?G{dXyIDA`%pHY|l23m;CtwVH;r6YhManSD{{AVqf#}1tO9-5?ruW}| z?=31LLlR9{^85GCP|p%{aj-yd$e6tT?}ct|x<9Jd%ERq;J$XSF*hctbc(W2sU#AmW zoXX@Ix#JYxk-@fhI703NrVA$m0ajA zO02zOT2zWG?HD=d-*&4&HBbhrM#7=AneMkyyZUJYQMLL95?4uJUQy5iVe7R_pSA9a z&qCEdmW%^ZNA$IpPg!*!l^YB)D=>y{L=^Mo{J}K#ar{p-9>>J36l+U?9qV@JA| zR$9zeLHhkB!F&nRu%cKwN8w0gK^cWNlDRe{O8Ct#Suk@dB+AwizDF0#E9XIH{C=0# zg?->NYy8Z@S}XsNe`|8o%3MfcrJcQ!Skp9T3|8Hk&xQYLLp*UM5(pM=#Ye!97nnGu zo~lH_O-!j71Z0oEp`8S}Ak>2t%oMlk-gUFG=I%4wS(yUg5ZWZaBvemZa<|FPGITHJ zR7f__iD|7Yne?6Gth--MsSr}*hygVfvQ4*Uy9ll@$i%R--p(??Il_!y0~@wk&VSlz zX6D@m@5>%=>iG}X#K)Gy!@~jyi9H#AJ?ghYE!S@*gM55=eMnP6P?aO(7(?Rha#bS3 z4~o00t~ku0<>;XF;f|Pqo26Z=A(To|?^17{DkEcrf{DNLm{DK2eKIjU`_Dm1yf0q!K+7a806jCXOk z2h3|!dZ1bGBFve+`c}M$|V&{i#i|H zQ)LjG+^n5SQx0M+wI6OyYuMLOBSXz6OZntSUcZ&unx#2L`bV#4{&#B2&lQ*UF!=Zu z4ef4A_u+}T*hknYE=9KJ_Qegh+$Ju37d97yl^(qYM)>cPHlDI?_~nC^y=1UU(l0XP z1_W6K7c_$ebh)Zz0~CFXprYi_Nnp-<(ZrFj+)M6Z?_T$EhUdH{X?Yo_oV}Hp=yv9X zs)ug>FhfoHe+W~AEn58H5*0mcct_0ar~?!H`o%;O)T?)N=%U5TN02f++QmbA7UAGh zUBb@W3FB4+Y}B_m40ths1i@^Zy+W`|Wj3*2v<66A?!?T_uRB&jD6gsMIPO}n#Pe0K z30;gL-p@)!44rZ7m5T56cqqD7WM_JQR%813(QARzm#gcq zJ3t=!#)&QqsM2;i+l*@!?5h)Cu=PaSfR;yd5{H}42*X}z^W$&M|FEj%sAb07#x;Qf z(v6OaxyZhYUV=0;^9P5Yey-BRxDXjEa%GRj4G~Y}=I@E(GQ+*W+{h7x8=$A(mqo*r z9GQE;QOx49ZN($JVe8wyH$kf!O9|owAef4hXcEw(Sm+b-F_+~Ri&OYSf@Jso3!@uO zypy0?_qn5A;{!{H%mNeIx#$Zjx);9NDf}SVpT#sg#D-zc=%p8$8IKhY)7Oo!NK=WC zy?xLhCX&|s3oO@ddBitt;Q?TRnNcnl065c5)i+ngMj|YflR~o0+&c)&Ef(DihCrtn zmDn=IeDUloEd(L1mUT%M&^7RU*EZ_^{{#dn}_431JwSiip3@=H@$ zR~&?)EEyX+6vAaa441lfm4EZ$r;M20t14VLnoKtLWGVN`Ya$|pnE-18a4VMayj(2=kayMDvN~6W5 za3v`hM#g@nM*UWtqtEM+lW?J%BjR2J<$iMT+HTt|Kb3GiI`3Agih9>^EhD*CRop9+S=>*KW{Txy53OAbpBQ1S^%mRVfUngS zr&Z+?)0|NG8UG40&6VKk;OhF8&OGsn*JyN^u8D zXgR&pb56l4&*q{pe;OjO({3AD-NN)kfgOjcCx_f2-2}QiWr|*_YO?7K#NU$*O-K_<&Da3MYfnEF>`CPcNj~Kue!LC2GKogF6dc_pW(QS0$o1 z6D&tJ!xrVoSS1Q|cp0kdor9*^lMo%(HldjFy0SsvLEPKF5Vu0@YHz2N%^1Z93Eq*> z04E^eBfBp*oNC|_2}6lzl>v~>Y&cwys#Gm9qTa>aP4@im!z+Guv23Dmk}6NJwduaSn@%g452Ri#Hd0ps1KCo#*HawlwA^W ziOtLcG{kXw`%|7~av@%iZm|!W1uK1~?<3j%kzt%>b8gUloB`Rsj61XbfHgMYl(nhi z>$Bb`5*;iVY~U&{w&m z^QZ$_6c#ej_g?OvdL1eIc!y>Cq<8V3WgL$Q;;tVb2Q-?rbf~VzjdUG>hXc!|8M4Q< z#7)0s_jScS3+eo0Cz7dIsK02}m_sTK%Gh8Yh z!G)BHC~1gk<`+7-(?Ypn;Ne|QpjR1PFf%v9DnQ5a^{X!Qcu(1B{l4&L^^ica%W#18 zmsAVo_a}pfDD0Z_4BlvFfh+Om=OSJG;26&IwG~D=@rI8&MsrmY@ zZe{mrmkZ2~On+K^O1Z;io6t}bRI4TN;t4b7mDxyikfR5X((d0|A~HWEBn#no(kmrO zkQC1UP$H-ZBAz^)xHO-8x3D)P<2=HU@TeFCpAN8Ayk(@ig#0GqgKwB!@mHM4mw(oV zU1HFuQ`6r{zce%@;w|du-i)$A!Vedi@jRF*Ak(vH*&-W)r1&cLfZ_X87@7qzQySPu z2Y6R&<$vnUeci*&6X+8-n`3|C?(9(KC(Om%0%o#ZcNW1HEY3c<_&{U+39aVHR!~&m z4+CG}9P!|U1F*uUDpc8NcaSjR-)_EPP0lUh{+jwa)Kv}MgdFksCBY33@J7E$@||1` zMd#P=rkuT<}<^#&Ml0{Ng44sq?ZzY4|{w4*H-wXWCxX zlBj?q3aevfR$Wq~qZzHAcjm^j zNctQ1TYtN=n@Q{#(r^D2TyE@CH=a5(7@raRsT^@CYvPfvotf!>Pjb)$fYTEh$dyg8Jp zFSt|GR;i|6nFlrXlDq8VF$LKH7Vu%bZyYL`M5pFulPK)ozkS;4J+_1#)?CB&&oYrT(2W*zT}Y6Q;jHd%AbgercBj%lN%dQq9qDCg3RX_0(!&j@vib)+{6Z#X z6{6?0KaRf)X@WavRCa0=f3uGEbX2)Z=hIT!`Qjoo1r2yB=4Vj0h;E$`oC|tK3t#R{ zdq|4!fsLDW{N#WmO>%ee{_?^{?N<{LyUBOjJiKMlJvnZ)w&=|s+B-z7sS8oQy(!Y(H2 zz&`iU1p&1{t*i&Jpk}J*86CV?N$64g2#wrC%xBe+DK5IvGVT*pLY{Mu;r2-z?-K%GQR{#x+k%R;Zvrayw3hlXzH1lhca zXz$z1;?FEj zT5T1FW@NWsyk67e*u)!!>26e_^1O2NQv#rZ7I$p;IX3y}qcUG5F)7OC+N zCj?iQXMU@ky3>V_|5aqU`gm8QX~Wr;X^W9oxbl4AukyS}^4~~{e_`V<8w`hO%{aF^ z6&r=Nj+^)_0w5dNT?F&hDWxRLu3F2vVFKX%`wn={caNGW`|0)J)V{@iKIG}4EYGbt ztY@)fkY2&=5QZ;F?Wm!9bZ5`qDIonBQ3ruDNqv`WhW{zJE{jdr^YX4ssl@3#B?{>~ zPMeXXdnnd;N=l`n0+nvlfZq`F%TdYY>BFHfH4s_JKRBGW$hh7e^F}R?gYuNzGgvtr z5rF!d)XLUMZm$ST~>7S{z3YdvPx?N)%fK3^xBJq@{IjDyZ9G`yn9H>a)R->c>)He z7bZMge=4S4&pbR?}g0c^q^aG(YO~UQbw1QeCgZ9f@8Q_ z>RcPIoD6(0m+-XPsd5frD7@76M8k0$xmnVr03Ng_Rq##8uo^6TDg~00pYAw8`LiPm zJ>G3sYnWTU-(!hc!cOr;(IpWqDn%t3<=wl)xN?k(|JY``%IHFgB!}mf@qscuU{vnP zFOIn%xpO#sfXZ+|CkoK-+7;}9_v2$wI7pWyN~rw&%2OPaZK|ZCt}{LSt)L|RAwp?Z zp;q2Kds$l+-U*qXCB#H#nuOb$)LDkDtF^OmDf|IjgGrz#$1#uv<1HeM#-jEsT?3y; z!04y$ln$rW&^#mce#X@LRe!2XxT2;Jt^I1Y&siRzvrYfnEaFiHx|wm11&Md7tvO(s z8%gkK9y$PcR?NA_p4AVT2OH578a|90N&ooc5p>RQ*Bz^Sjm7t!4xal;pHY{L`SccR z7shp+Iy&}1EA2=~k(OJOt#6y;9^*uzO0BxFaPFz#^1NwgBVBm$>)5%0bO+g2@DzM~ zro1)TH3YIr+Gx*#Jj;1o=`1fOH0T}cv0Lu!mBIy<8j%uTzNjUV3pvgRneG>OdU5Lb z)w({AtXjFzq6C#0e#ifR=pvyi|GF8?q?_?&HBKlZKDUc(>n$SP)ljht)yv3%PgBd1*M zO!I+ZzTN*t*IPx!*#%v~5lFD$9^5s!G@9VSMi=ZX)y_>(?0RHM0eCY>DnwFjf`$( z{H8wf0rz}?Z#-f!H;hjmhKk{ z3@$p%zi4A@n6Ml+c6;UN=dkK3l(-vw#sZ$Gcp`I^_hn@r4c%t05PcXie+2xr^`!?y zCs)%`c^|)Iu^YJ=AEc2mJEA_Wp4u%{kzb}QYNHHo?5MO#U=-(llq%$}KXJs+cWeVr zy>4xXW2M?KqU!2+GT}Z(K$~7(%(6AQ45@_g$z;OLN!pah03@bO8O3tdN{|i%6aN9OHt&nG@pkiKvO?U za@Ijg%*v|tbF4gPi}W^-4WpJ8T~{_zy3aGn#*Du3GQ3s&|Gyd3rug6cEM&h9nl0bO z9Z+SM-PL;}yp+OFMP4@n>_v2q^WEdUV5?7wm6uR%UOQAtB_KpC=d`!ub}eKp$^x+9 zt&r#b`32rBE1b6MR5gk|h@4X^RCaU7D~3--Lvr#H=7VMOl48+!_M}!7o*Y&s3sCXp z9(X0N0rc2TAiNZ}#ig}y0Uy^2x5O@14g!KWQKM3fXR!Bmw%7stbNvNPO#au{*0W!~GKi z=E;MGXeoW=a>xXup$3=y+)i0qZ6!t_CMjXQW1D0Psi}wt*}!sonO;Hp9T-uKe^fbL zl<(t?w|0WLHmiCDjT?-Qkc|syge~qZzbYkR$9u(~=DlsA-CJ^iEVL`FZ@>Y{fscMi zwN(xD%LyFdrQc9^({qb=>+AWXg;xzs{@=3zrnwFf0ACn-jM!y;L2<&rf?|>(y+}F> zJ+rApUBJgh-W{)h!U2Xv?o-FWqaNzy{2tVzox4-Z)9Ml%+Z@BzcmrNGLqkX7n_}_N z(V|){Yk|{XN%Er_(5X;6-m-~J)9Hi9#^WmHV%$tZE2`KY&P)Snd#@*+_%$Wa) z?g8rdGes``k~o^I%1NN6Cz%KSm1(?=%A0dHTSz$FE1S-d!|FBnuAr0MRiKNb8?D83 z=wzss@}Ws#*P40IESB>QmL*B%j+T^a8mk_EW21xwEpO!9{fjg5o09v?>u{>cj}?J| zU56M&PC@v4|7pt9yJXBYQ$k8^?jZX=tiD6|Ljp6cG+5n*gC&`DuXN(oW#`#43e|7M z8~i^x&rg!@mn9-)EX)APBVrFcl0_fAj?-&wOmA-&x2rV zN~@)1jNS1oy>5o9_N(D?#?e6CmA=xFNTD1@>)}J(Uh4Aav;vJKVC6f!VnC@3dwk9jxtE7a5r5p@cX`( z*qzHtptIQVaFf>7@wqr62Z?6m_ok=7`)e71H;eA54bq}s=^W60jw0;OQyU)t$$ho( z&7UdKAIDU=K#_7gNU3l>&ai;8&;4>XOMooUlwMTaQIRE`2_kBt>T&f1a~7p%Z7sbN)eQa!A=_`$?MwL_yiXcH_V@jmXzR(bqF|WibAa&Qph0K<(G8Ta&y7k z$T~1biZV;Jh~y2==L#)sNlCdHv+-viFddw25AVoPpGQ9@^_B~wNcpM=>fMiJUK!&s zjc=5|1~oSx(Xy^o2JLGxg|#oP=vDhZ2}{27mobnXfD^vNtTCCGODZaX6PW2TamPLv zTE%87wB~5$#I}pMM-fuse8;&Q$KW;kgI^+;#wNzL9BBVFuMsf=x;rFliWo(;5QNuO z**_7#f7swLu8D1MbH@$wCe8cL{XjbX71WlE7ws>m=6o(#T;#i@9qCo#WHVL+`gs1? zLwStIXO(o!PWKbu<2!0N!=#FjXt}dM2S?k?7-GK(L~kv;Kgrp9y25)CS0i32X$jOW zwUD)5rgu#%wQ=?kRDSOGvHS@^`R|u8l<4S22H_oM5U}`btXFr$>j`%6hwU75fm~NW zr^)6-ldkmYYmP+UulpagotJBJ%`VSLHaN`yH0`9e~B+y^+f1IM8=ndYu)O7UM-=MyiHHJCm~Ip8^gzp$@G>$Or7kD0&8Fxd)_80< zQDl*ubgZOU$_E2CY>RqUtbwW?VcLMP>bwiMn!wT1 z>)&phYFb&3ty@7X?{j~7O>NEdIpG1_tbrX)adjG6wP0D5)^Bik_1}$@-_lG`@t-6E zzb)6B{Q6Cxmd3gq_$`1PNr%(H>n$2vp`=(KMIYH%qf8Q)_>@jl;@`Xy-_okis;Wvm z-}5h-SUVV4Nmxmlb(?Cp3!QCDubSuG6QiS%qmejCSS~N#Q^8JzB(vTwA4>wCWu;B(yAOPPOLA`QkO5UR&*WL0l)9e@Q^)~)2M~}61OH9BvxMw zXy%O-*43Xv)xd@l=qnst2#R4+{e*j*a%ughh|cJWc>4u?;{|sOtb@S9uG4o1zmT&? z>As{$;_|LpU>=y50#mV>Zy?CW;TNRQwsez|yk){Cnf((k z2}~xfRclDtW__Re+qkQR1bIZU(V4ENI>DCl$o@P(;>ed{FdJ(vPOWrNl#iHW7c#;- z;TBrNOUR31qwd~RAmNMHPmFgWb{FmCz?etgT+DW~^w#{d)@1Pg)!SjhW|57>SZXjE zLmODS(@mLK!h-pOwW=-i@R5wvx>w}S6tUB!3?MEU2IJAraZG!If9soI6~;;X#&P?~ z45jaHG!_sHHT!mDi9dI+X4$)!F<1EvO=390)f%g=z7!CMZk@A;H|4S&=`6~hbfDJ; zPciA=cj$aL@E=^E+=cMXLC`sCGL^n7R5GUK{nQLwWb&nt-tx4&-3(vr*Bi+F*aqMi zGHKB>b+`u`cgXu#-P?0)aux5Nmo88rpka%R0nJ&?w|vqMt}to)i?hhI4TZg&9F+SV zCsn60Z%g--D_|$BisoADwj&_oRgZ~Xk0|b0`q99#;d;=ZdTT{t3JAKqe|tLaH|{E* z{V$LUivsuNT#c@ zRSCWOZ_h7UT7(A-H+RsT@*^{FYWAPVUg=>Ixr>Iiz=+c>in>d4C|mtVOG~PgAXWv| zrX_CiP=o~s2$f>BX@8hW4+Fx;0Up8~CEz};WFPBH$(_I<^pTQr1Pya z2H-P%ud-nod&ubqax9s?uVWum_~o_V(|;L#s13>5uwee7RXLW&p!brl_jX}Rq6&G= z#x30k^nkQ>`{ildc?v#sIISca+%nD8vE<)D;dL;6cw5S!X8)27Gvp)7M)~%;!%QI4 zL9$!K(Ex!_dR5a8|1cc)h?*CxBg>h+cltd(+)m^TRQN71yKT!f;Fiea`=bJVo&|fR zf_}O-RWLAfSAc|!Wc?t<_>uL^AJTr?^W6iB2!Q?)cmg8g@y=LpCEpOy)R8BEnSEm@0_mh z?3}jmkk?e4DGXk#nsCrtya`s}lkd5T=pC;SJa5vO5awV$AT*Oz{UC5P*PWIu@L*E{ zwAs71Y(=%&$#(jY%;tC5wz9EdYvlOv@Oq=UOx8-8h)qSQ7#s3;1@XXDHsTdaIVuYsh)7(pobjpreyrl+?YTQ;CDF^b+gzJDY0@H2R;3lB#HSu8Wxmr=hIuUuiza zdUlC*O#l@yrPQW~$6P?ILf(1Qj7J$>@Xx$W4G?WLzHK?OW?0iml50Q>C%12(8_Agk zJWZyZ(GX%84s`EK{Zk&9opAZs`?NsHdbE!l15;^MgpcjR?rF+m*v7Yx^!<7$4kRYP z1NweJ{@~%VjcK9O{hW1V&1Ng?GV_@hB{zcd6Otux2Wf3av{_tFW40Qp#M(-5`g! zWetvb=}j!?pk`cSGMW@-Xs~P9b=plAD?&RtUS_FBpoK@g$D~}<;LFXT!+9k7veFxr zi>kFfnZ32WdcZ6+!b9iLUl(v3uw!@I8?q3=;4vd*`i7dK_T5RVkr@$QUXBhWp>LF( z!M7!KmVQc}__g(e5AugkkuQ8+Cb(L}Ir?Umlm+@g%O zN#BUYUw3$ST>ZecH_x07ba2SSqE>o;>@e&|_mCZ&9plh2wyg-QYSD{(D|c`^j9xg4 zoxB(&c2%KJK{M=%CXyUqC{!Yg+56Gwf7acPauRNyed6^Z}s2^Y?gPt^e^13hu>ml z-4v|DKBG>zkg^7kOu;oPfepB|RJSERFNfU2y*BRVK>AdTfmm;GysI|Lf4xzxm z6Tuv^)|wLG_;_?R@4j_(uDar%Vq@r^Pl6`AsVN&rN_Q0+d*?8Xcz15hJ#a^51@DM&rs3=v${@r#gq6ecWT zYG!E83cXiZ=D^y30;qP85i_%ykGdW!L+;=IN@k)`;_V<|RrfsiHJh>*7(b-H`Yi~2 zCxPY?2uxeBg`}=nDQQ$<(TC96-#-tpc{;hYcPW=tdWh6yHshxweVKKok}%~Mxi1@Ue&>$S~|s_40udz5PEM#AY??l7aW`x$0mRmbJ$Od`e+= zG;8>bXw5_EFayv;_&!$9I}c z@~hOI4Ov1iVkOK>n)h-4TKY=jtTlfOZB!;$>P9hG3g zGy9_|iXkFxX|y|W1Hhe0uDlYNb3^iUCKb;Bm(i-7=FIp&WlVoq^6TJ?kMJs?w@(%p zv3Tf;#m6~r5|YjFRgoqsD#o5r-v>49DT5b)u?MR>b;4GQ6zD*$G)8-33+y}29ONSu zQ$&voS@gTPEO7VRPfghSPNy|61Dw56p(aD=>kO!I8=7)U?=ZUD?(3dNO$=2=2zj#5 zB9aG(biq?gf!Z<=Q6ipRB0rd8|#bVJaAg+O!!SKwSd z0(fb@NjR6fPh#cu{TyXl1SaG--N*`e?1ddr0*HXnm&On507neKWl9}sOGWJ`<#z#CMP zDHR4{>j;yv06rIP`@yxN465ez>CO!46m$O-^kO&4g#dIS$3Q|n{@X_T)%OX6E#bd?!l>(`MvV{x&-}tZ0!wL z2qn15r1Jk3K5TxPSz%^Wm-&+tZaF!3@_@p>jUrhk7oyUFPq@<3W%OZmJ)r~`u zLhgvb!#bu#pI%JECvKc_=9|q|goP`n-8`~W$|=B?02x@)QooLCy#+Xnz#rLUp_;w) z_?p&>#5_u@pjk}0;310*gO5+UPjCar=pki`v-^Q#+^pf+pD}iN8{!^U!BM~#He+0gd9^-R<-2 zbgtIF*-pC#x@*-KU@HZDSmCbgQsz-+hLj|*5_fLngZ~`WZE@sBoBXUB5-)~K+pj-p z(yJPcZxhCIXN1CEsdc|$KfoM_+Or^940EVkN2fcp7)UWgpat8_Datom|DsDPl4Czm zg}FOYOqU^-2t_e8tH~hh4Hy;8IQ`i#tfUry$A7wdqu{!@p{-1V%y@+d@{=hbnJ}lr zj<>LJr)8#B4y`wr1jpRWA!YkugS~r%G^E_t=A+rPt6uKQAyTDM5z_M z3!}v5omEvZ+#$uztpAqDMs3h46E*i82g+CQ7yqr5Sk|7l9fo+Z2+{5pTTL@fdyRYz zIYdVmREXgH5eV>(NpvN_o5j*4`S#ly9X!Man^V}37qZJUkMJicExGi%m!owKG>tch z1pS2({J7fMuX~CU#kgc9_$V=6=pth$V`i`;DgF|sL!#F+K4#{LXZ)D&)U@0=7?bXK zci#Jy-&FO5+M_?Hr;i6Fgksu{8)h@2Eh?qw+%N2SVF#_ddKVD-@rLw;<&}tBr6}V{ z96Ehz{?w^+;OsFKFp&Q}BK@*^EL<{!-7?|m3}Yu3sA=HI$7eNgkU=HXik-((!~nI5 zYJI!Vi*G*;%&D)5A88f3h{Tc}0E{1CFy{H1zWe36P_LuOlE$1SZ;H3+@4mNjLU`)D zGW>jh9TJ;Sge&*e#?(sk)Yc@KV`ahMxx8+=JJqtmR)>Wr2CrI6WUA67V|bP@0$3_u z$e%BO*bAw^wZ?MeG2PObAggwAJk2q`l^bdz#;r>9p7ky;RlaylKu=sD(=;+(^ zJH4T3?OOikyn5K7#iV!cdt8Gb?)?(V*0I02>kVx1nTO06=i>(SA{x-m?NzF2srp*G zsti;%`RzCsRrr|yuA3YYLv?kG+>puHa)1*z%(eb3@wDMXjb;t=EZX%*=CX$3=DW*J z{3F42E-{NsKq16 zq3S8B6qc7N-{PMSCAlgkmLYX6G3EKgmny`}Lx&o_H)ycf>C`qhfEx(ygk5G2&O6Qs z^V>e!)D{gS7UO9wuw0jbp5B1K_)K#|T7>fFe6C%)Wg1yW1!bBU=+i;t(~}hbV~5NB zQ`47uzK-x_r`|x*ROyh}T2tImFpK}NC3LV|`n7qy+;+=T?t&bJLDJthT~0c4Y>iWp zjApLb>kOP2cEAAyCs8SB|Ih<`K_c3Ca`h%>kWQLTH1HI4`1?ag_MBgt^nqX}%u z4P&U`yFn8^iv^`1b|dkGzKA}mmDPqbN|o@yZ5am>>N%!^-0|7ySDMk{eL_0ie+M;a zf<7#N7uIFQ0PgT^rEK)t;&L(L2!8Z`uyUAIq&@fruku_RFJhzyu*+S7a?G6>(2__v zEW^$Fa>ViBJ7@+&tz3;)CFBr5_!Ez#epq*Yt#{a!$kHA1?fFH*f%f8!#Pp@hlV|Ra z0?uaI?vbXyuBiY|vaH1~+ABvZEvXJT+hvd_mLxPKIjlojE*H?ps4T4WxJy_Cxc@_A ztlgXvD9M`SvO}~@R{$a=*BG#OObS6LP4vQ{3uVS08bw5jbl7_o+U1f2#05OVRxwA) zj*-z%c|rmjB9&K-T_qpI8V zgz9Qzm16n%-(yeKfS=<$ZOf2Fg4J_u zJ>KnrQLku8%CVbcS`(nHSjP3M&bK@B2D$0@OWY+JKMw05f6STRX1gQXCoqUc51=a7 z(CbUog4k1?qNTtj%6C1c_04Y5jk6@r+vA%#aqK^1dVMS3)b>_^RA~0*QVF(Gn03H8 zQEBo9kL8C&U8lJ3oNq}|c?bndX7T2ZQ#vYa6gKpJ5;ju2Ir{em+Ly(Z)1D~pw11GF z&r^u7Zo(&Csh?SsU)0?nio^iOEJ8-U{r8OsZ0$UVXH~;>F3`t*_ zdwawphnsARJ=LAv&J;^4$Tgj1udoqMn^4DgALz%jl6h7d`FT}kab=MwMQ!yQk0CBk zA!G6>!bGwD>ptt?5NRUtL^)(HS&W&~fDf+egE|^=6dFf&K*8_w;;*eZBUj{(x1Oju zaYFRZK9yyl1;0kX-_36Li1q7YK8Ts<_wHKh?3~ggne-Su)!nqEG^poLBF?IiVW?-I zrw1xo_t4^b`WcXo=oPB@b6&#KN^m=_fSiG)D|Sc4QytCu#IkwH6@h8uk!{wc8gA;v z8Ep6rnJVq{RLLKY+e~ExkhE#@Jol`m-xtTHS7D3UHG8s(z4a*yJ@zEZwr zg22!Yl6qp@EdN!XpA<=f|I5Vxx5TXQUt;DmJG;>MxWKf4d{o=QgpG`jFFll!^&ahm z_@~-_yVhsiY6Jeet$Xk!f}j$$eSLZ3zyi>>hmue0&7*;NzTF5m@CH2GY+ zN1{ISS199F3$d>HEYirS*a9Mb0Y;4AcIQ*!gw0^Y?r<5?-el zYdQ-*vnm7ZBwiRU4T9|Y*ZUY$@Qb=PJ{NV7Ql|a#52^a4#CofJ{ze|Z>#g+-rpMne z><}3X^dTC|evfvAp{>KM0kaCsp0#I~U#Mtw4SM?$5*4soA3+TSo%gDS$k+*@RM6L8 zSZ+9do~pWDQ={HE^6U;_{nbJ2(kbaZ7>TdCQl&vrc^b{+$I49g=K|6&W7M#Zca&S# zwX{J{{2YeFnp9XxCv7igkKd(9Z0w|G$E1DlL&tjE!mG2^Y&`9mdTduUXXH-n$!K&e z>VUU!8WcjItf&1$oX>up`e$(P1S03`p5Kq&K9cX1g(`aL$F_SBzzDn4e^@;U4+$jA zweUy_mzfAM3I5LfTVTRE3efUO)r~)oP_4F7Mxc!PU=IAthpyIM(XYe#^ZFK2{ZTrO z*0gKR=W{ESA#q6R@JTe2&Z*qaSZBjYhr>i9z%C?(K8n9wePe9Srp9wl7Qk3#Z;yXz z-UREUmaC9RbAv1xq{Hu-;^@|`3-nutCj;rQ!f|B8b$kf{bh@+c)3`>$!<>8-Ij;hy zfZXw1g8C2V)bsf83WCH0@8f|w!rHh#fj#&RWH*cu*7^yAuHhCzESu~T%m9agqie@t z9_Nk8?I}y)k%C~q_zw#RFAyICXigL{hAd94rlr9itr z+TUU3{}Syit?P!TsxbpX;UKrwrvv^TBjx0y%p-gFiPhWadi|kXXu321j)nXzv(=PG z$gFBR5PAB7kxn64z>kk%sR)Of?ME73-POSQE{4jlFVk<~4UjnQdNKYj8*CrE*iwup zO(i)9*?1w20*Icxw3wN(&(FNMX&*-I8h%SIl#&B`SLc$dy{Od_6KoUAnd6kx7SqOY+*Q3_Q9rBum{|%X>ooc;Y9NAAO<&KTFt(m6uBQ{xJMwbq zdf<`KAb-eM6}8CN@83ybZKvsD>0kA~vMAXx{nAY|jF|sgbf5bQg$Zd35A<&wJuIEW z%3dC(uNu3FPiR#0%qIDXziX`TeF{a%sNd!_(dGUy;GgHY_5NL)elyM3JX83eb%%Uy zT?nfdbTg1!Xc9NY6fMmtzT;wlN0kg{UTI?(wj3Ej#IZZGqqsOyxBs;wT22}}s$Zwh zxp5UC295Oe?NQj1{G80h%$h0SYvY4k(ogIZYV4Hi#UZvoMTO5Cj9+&@)Pfd?rIqfy zG$g{zn+v~{l8D2@P0K4Ri8=q(AirC~PqKeNApg0`Bv%n3P9;C-58mlq3k`kty0ZO> z6?Dcju_bL-BQJ#=QCA?XyUr@#ul?s;w0V>kF~Kl4!BiiPM&O zt?XXBV}l#h_&ZKP(h(MN$CTldp5P8?FFn4-hwD%h8`%ow&x_zFQIhk&pKrW%)~nRy zf&z8=5F4#Xn&y^C9?QqW56_5;+E5TVMy92&k!2hQI{OC-=otp1`opj7=&4yqQh$J$ zPf4(qG%1qqZ)H{wxGS$LT&zqZGq?)*L{N950OHUnrJwVk(V>n)9(8h;w*^D2yiDX; z@dXX_0h`I85q>mDBWwxD&@$sidJJjdh0Hw9i?qEpSh08RKSLiifUg0{rTabr~m0=D!c?!lmtrgo4cS?PTP?S_h-+nQ~Zn$*ni;Qv2~`g-6T( z9oHmovn@+7@&lHAi+b87Kx8U^v^l5XAH*_AV7BwEJi3?QkJbn&A|Pc0E4xyVU*H=P zcJ+*F8oB0M^gm4e5>=8wWjyf2pD~LbGn16(Px}3vw(G7PKZc2As`%JzS#0V`Hon~Y zSYRbw*R)8wk@<_@`K+J;zPK|Hgr2QJ`)zp|8oqhEmJ;4ieJeeeS)!Wy_OJ5Z*aX-; zbcXd)pqEmgo98WcgDjP4S-C=Cctv7dMmO)NgnjAkpij?d_Cuq7za}pyeF(QusMU?~ z=$H4BQoBqB6CXDo7}vYZ&pKi)An5trli~4Q2IBfkl*ss1G$RD?9L=2YEFOr@6w;Qb zj!cM(^UL<-kMV`K&ROaD)74oOF37Wz6-890~1NwxF1qTNkOSuxRiPokr@y9 z(TMl9BQU0p%PNR|uULbs+kT9;T3-#wb{Z2h4oCJ)t1EGK+HD0Y=Hq4oW`jPa)%m{K zeXBu{p>?+O3ORkN)~vs9jeSJzpD``Fs`7V7R#B?+SCh+kVn#*u9h4IF0Ic@d_$Sr9jJPqS{GjXjOjUdJkPxCQ5?h5 zEzD=g{7RY{mHo@II~`*!a$6${(o3->apQX8=C)c@wBy5tTH)d)YsYtU@2sAEnDmA# zF48orIddBZThq$E*t1~S7&NOLie!BBYghoO<6H zEYz-Kj}8ZN-LTLjn(}^^v`7KM)Y0)G4RHkjHHONc3lQ99^R`3?$&QNf;d~2T$f2R~ z2V;iU{?nX!c}+A(wb}Qzk}k>D7Y8tn6kHuz`J;{=&q*BVjc70!azvTu<(bq3R1sUb zysyQS2285!sU|*k zaDrYctJ!B?PDheA&(#+HG)u>7Ln|=iJR}`tM2*hP$T&f+O1bd9jFD4Vw~OZx9(GFk zFS=_${r`bxrK(A1RwXvD$!K&w%GNnJ2@ZUo-!$*HJZ~MUk-7dDne*g@FN>=>14R~~ zJ?LlSqLS^u1VRbGlWlha``S}a5&?_PRGmWdG>Ed!FjriWv4pE&-#9oc`{Q!ht{Qgymat?YR0ycz(RCH^CR1iEXgL4ht6B~xp1FMW%d z#=Zn+e*dgW0VeJu4+Tmta-f|&N<7`@&-Z9ki|gLcrx#zh(N)fVO?;!qTw6%2`NF$~WED}_lc(fI4zD2;WiMN6 z9aZxN57`0S2zJx{FVn8SmV$Kkvl{}@$Abm=(W3p)S+Z&ad6FsPL=Tx1OL$^&Bsiy`nTE`+at}LFSh)i3zFVAJetI zss*;A*3LnyX)SBsPXUmkL zYL%(2bw!z#%I!sL5bY&MC)u)uTI6FUwaP&kLgYI})Xi01*z9yZjt@2`g zt<(6)ACggO*yu~!&GZ0Y@b)cPs2CBElFe`x)N6}We%~6Ff@3RPxZ3fcDiNDtDhrCUh_Syjt}ASstKV*Ae2s>A zS>Nh0$KhP!`WbbF_s!0>vtux*^~JqsQRKtrh27jGk)q2MZ-oesq}mV9aX4v{4m`8{{S@CB>wB0 zU=q}d4rF}THq>lU)T`)GylPqs4TOgZ?Ft%oM{IxEEk+%jB%+l)DU-IGLgc&?m=*3s zM8+^+biKZnW$pbDcP_UCD+d5qH56U%_&r^%9-DS+2HqQD-=Flln}a9`5rC z1$pYLhEZK81uViVK=5CY=nU__^zRQ~WtQC$PV|gobN$S9r?c3ajRiOmK7iuzZnV(Y zgHn8Rp<V?X$w$pG$ z5CBgiWInC(M=pI4p`8kqjvaey;Y{Nvzpj=6Dfy2xq^O&gP6n!NHPzcx57=%aphl^xJq^`4xAKphe^ zKi9D(I}q@$_F(y1*veJf9@ zo?|72kn++v91A9IZEe9F*@PCRF+*(Li+3RC`^%MsF?}(e;n`sjq-IUCLxRh zD06@DFk{(wi}I_)Gn^z0Mb08xQpx;Gyil1?G?eVhnS?~4qBk9RqiZ0)slveY{VDPh zfH{)=v>BDZJ+fiE59o=35+IJit?l5A580B}(DSb-*t$^rqM=T+@SY(^@|{Mb=4|(L z7=EOciy9%{hay_^nDPESiK*|L>K#9$zks^BzJkJ+A0Yj5x3YdY4BsGFX>H51R%#N0 z%mSUzny^2y#MtuK@+^`o=2J6Mv&pR{aSrJbgFP(WTGPHD>B@$6WOZ9C$W`QZxy8Ry zmXG^N4ZDVw$qDJTD3jzDx;?b{RzsZ(eCAYad*xW#?owA~givx7S z)!_LLo=z~s=?VwB9#FyifF^wWqJx`k?Qb1ZU5f-|w$arjnFh1hDGXydQ)j>Du~}G=Dzs#8P8U- zQmDS+&pu?JLcxjv5<5w;4KnhUv%#IgS{AEXOh0McLj@!x8~wvk)96P$7`n54bgxzG zNU+$ny$4xeXEy>`&hg$T={HxZprkC}K2~N5)2wpJE?7wn_RIKq53T zq$~i}E>FfSZe{DI?bRN2Fv3}_m*4y&M|STYwpK0lJ%2cP%UHy=&!I8{j>cC z<7~F(nBajd7Wl^*#t1fu@uuqrE)-MmF=0UiI@x`OfRv)?_Zu_zi=B&7!Tn6blu?Zu zV@@_az4EBUpw9t5xNu9x|5w4aCIjHu{0|fVa)HD28Hv!4UNlLd0P}lINER-i;t)0> z9k}gMZuigd@D}BckJ4*mV)PrX+AAVB2p~khhk8{tlJ=?$ehswpV*InxO^TnGhIG~J zMxs0>TiZvqLznP&`<**&iyKWhzpEYNhPT_M8YDUjf!>mFOXtJVVUqH_+;B*Kdlk#s zhgV2zb497;x8~<$1LqkLW7kx?T$iD)Zu6fqDklN7pjo*tGNqam=%=vej!DKASO!Bk;>O z+>R)ZHX5DTtpL?fYxYl%oC(>L?w8AJ^k^G_P+g;LMuZuI>eprLl)#Tp%%e}6*VShlXA<=4Nd;^~M>Pv88N&?G> z8Oh&xdH?5;ne(No^8Xrx|7)KBH|E6#O6A~?%=8CO_7`StzRoe&?vAfu=1vzg1`d2U zrI`_vf)bC$xN6MOpVB9eeg%YWbF!&74AgcGQ+nPR-V1iSz7{`@|8)(sy5|QSSc~N` zrFeFh1<{9`smhK$C?qaYDmAktr=iq#JFd0L|2x(LNmSd!^tIsTFz~dpijM&{GkLEN z*8mB(bUwX9(uzZ#wCo>K8MxEkXIXm_xbP+CQ|pT3AjB=HD}!neKpNZ{_GwT#e?4>A{9Z>gh;A0(-c`hTIo~ z@vAP&ibjqin_BA8`v(XIorBG*pvCUKet*1s<)^bLlFx5NYyU%gba!)$S(WqtV+-jv z|6>sK2o(Q^de{}B_?grHJJFi>$8NDRlIAjhc@SQ$c`{|?rLdDAHfiB@N3iYAC)Hwu zLd8glxyW0u)N6R9jI{J-q-#!rf20^Z86=z$N?bJdJrcNyL;7%9{Lp*ilFxEocaoCX?LUJA*$Un5 z(#DeWs7t9Nt!?UQgstTC_uhF^h97bNlrT|qaFEKJk`+hCIk5w>9u2C|SIWscMYrIb zofNMoXvD9-DEzIt%=*MAMx$HupzM(4^SxNSBu&l(xcetj-q1dKU0BbaaU6EFQN8Zl zHS}C9I;4}Q^xYCND{RvDt`gC>`%>_)(N!oRlTb+i8%=5b)EJxLc~BQ>Qh&@2t){K7 z)93E98dqJkDb{mbVixe%L$3_w%XgV5GxWb7FgT zAjU@6$?xFnU1w}W2pwD%x}BX(Q=qfa=D^dgPF2ygb7s zJcpl3_;!oSPicn_(!kWgXfgt2ajD}9^ahQ-sEk-$lF6LUX@dr%MHafl7cV`J7k?{Z zxYA=|vYWEcUa~RVPshRZ)K2^#S|eaE$H`KBlpWA&`7?K;^E301aK)!xIyZ_M&smu( zT)ynECu7G3=8d_0?KExkjIns?2iOb)toyPK_&>CF9zEET<{+npgr4Q}zdQXO4Gx3S zi;TnkOaEilSTnBB1ceeP7_9VZ{ngUNHU0)1{Zphr4lQaby0#lU(-~H-s5tVWgCzfP`D2^{VBB)w)uP|5c_X0 zAE3(6k*27jTGkT}6l4I)v$G2RZ8wxa*kf_J1mLp(QuGZD5RE+Y9f7dlf6`2F))-Tn z(kPz4Fbb;Xx%NlI;ArAP!j);FBp;++1Xt`JXS@5gEhJ1;4R?aG@gU#YKT3>Pk-VNj z&IMyetV_?@LdYrqFmPqdqK>ZY=xgQWQ>_Hj+eWQX2=CXl@4AbPR%P^;m)!k528Yp) zjx5Gz5R^#-_P+jjL=M00TG;t3INwV9MwN~6$HiWLuwLKbF3a)w`nsqqvFq%1((B{^ zWGaH?%uP5CdD9Girw&o#_r!1C@ZM|GfGqNd6J~?Vu1G_qSBUXzo!8!)Qy`4jBwUsm%&|64mqeB7q~mbYc-JrQ+5ax5JLkUB>9Ky()l+c!d#R5| z2?@vU(+oGy_g^HBkxfO8TFXBb47XxmNE(Lw#&zaI9!m!Rz6d*(O)5(ym9 z@p=JBIjH#QyUN!2td#!MpBHuOuAMd#4V;7W-mqxLY){$3OmmAGK6E0Q&)fWeV`2%7 z5D{Dl9T$__k_zn~U7&wBhSJp-i{Sch7&~oZb3l0NxVM+KKWUviG?}moN4vwNv*g&A z+{n)39NA@%JhSxD;u6bl#I|Ly<9f$*20gPnl@n(`a0C=lb|=ER&{;=w09RNPw@Km8 z28sHgtan#!;JZJ2-CK=3$IU3Ae>p>Q;(YqyQhht6oQ^qnn)}<%c-E-B?zVhs)N^nk zp?u1Jw!@cI9OhM$Ty^90NMiH%q=aSzd*8;w-L+W3U8?#2fqp2zWBe#(HWkTZI%av} zjp+1D(-9||^8PjJcI<}Wj!@o_>ws8MzP?^Yel7Bgty~Jzk3V)@MY|$4J@W5lqca6( zWs`rc-)j}V-9M1QfyCrKd3REH3s(c}cs#%E@4TiN$Du9BXE7ZNGM$eytcnIBwxMQ= z$J;^nYg5lxCa*&=N~Uu`=*a-~dJ-%;lb_R<*w03e@QV!9j=O`ttW|N?RQ7;~!#1C@ zz4iwqA~A(#m?ZtrM4x`Vt>?b#8^E{HX)Mpkwd%iZ6HO^K@G_}2V_zeG^qQ&Qrrp5ZoWH}3n&pd+&noe?1 zyA>9E1anCygkt`CYcsJh0BAKC3(K{brWO^^fNg1KU1xI4yIpS5pjF?G&~VJ!#X!72 z0fb?dMXbIyN@zfIs_W*-V%r4lG_2SHw*pPq4xgVi8U#*J)56vp%6gMIptH`be_O zE%6aKa-#y*(v5t0JNR%KMQ@cPxwwu89q!Io`Ktfz1vtj)ipGVnlTR+>E#`B`jEVR& z7iY2C@D@xM$~*bI+p%U$FxjSA2)N0AEl3bhih>p{KP5r*7qpX|p*Tw*PqXddct~)o zf5b2uk)9{GZp|;m4XOG<`)fP(U)||n%d%JzRe00jKXh_DCt&Hpk5hn8#0~#}EgE^ANGUZ<{sy?xrsH5jgNmSII&tH03-<*PrNFgGG;I!%z;$-CP==TI%z2zZDtVedZ(&KuN(p1s-u*{{+`Kj>H5 z{@AX5jZ4yi?Nx|ldGObwwMhPphPWacJ5q7@ck-R0?Qb?xHz3%|K-GxS7U(>i3zivvpjvj6HQrV7c`vwhy+2tZtPjZNG zDpjs@pR719*Xm>BMPG;di*#INWe&DT^Y4v4E#ZweuTMJ}2ex+8ac{JIT!&HN{tZR8 zq0J?n8tbMlS^;$v?=gemWkrX!-hu=nqVf=p{s|6_SsR>@<|$Li%#);Yy3H6DDB_@O zqG8Dmpe9hHhC|=jqKU#M5Fcd?Yo49Rl_^FL@U|L#yig((u4kd*JZUW=4CS&E%kU?d zM6Mn*-s_JU9~Ml9i40WerwPTZ4+x91{Xrf}TR5kuzz27NihQek&K~9HM0P+`CT80< zveLGCAv?%riIb)a?-BDQ-0An;bB7;s-ZYo_&l^mcJ;7#CiverAAv&(yL7(n*S^3om zn<-&-w^F5HVVO3LEKw!79n`W2s<<&tn&gd_qwL3_hM~f5Ov3*a@_BY-QU2@Tm1+N% z2I|=(|Eo(%+dgNU*FdPZ_MI(Y=-jpBttt5Bn_HA?y;m5Tbsh?^Ui~h2nrNUuM3gSrtWe?Y`B$5de}B=wJNaSe7(bK|0w-EvJ{j>B zYE(R5CZ|}`Jb^z_0=9n+GiQc0KxM?lx^-*s^0*5Q>ET=zeX1Jx;AX&BH^s;U8%5B~ zvZrLregG$ev6|ey0Kog|=Oi462!$M2WNtYCZJ1beQ)uf1vIQ)BsL#fT4T-BGo>jzE zQuSa!^^V&YHMI<*o~Z2DM2y~IrJVKG60xjA4&_YX@sUPPmgtoldtKJH$5W3rj(=p) zO0}<$5sIS@Yn#ImMwC=br-1y~zz`RWXWmOxL8Gc;)JyVuR%bjw0wY98|0Orqx8!#T zvMmS0L$%?hn7{W=TS|Jp_*90~aaM}dptGug_^ZSW2Uk+r@%iFfIq@tMoub7+4Hk0xc#lUqC2c*Ry{Vw%rV; z7NNK#sOxX$*T#cqVKYMt6LM3pu9Q)lpr?kuW~M`VnyM{I!-~b|;5_T^+r-Vy4IMOk zd}y&C#3U2HF)F_}^2r-MX4CK&C+boMB%{dWu_vP+mO}C<84mP~#`MgKR)HqTAWc%K z9t70QHZ<0e1ZUds0Yj&d8u=h4uQf?7kw;Ba&GN(ZWnM#vno{)taGwc@a#_C8>X zY#SlAiJK+nlR?*{&@+#)5|7`CL438QGLqq-_}tC>RwwA-2{x4>?zCtE1lUFX4{fYe z|NA%p2KWmLWdYTL6QQ7lre>D65Ca`sigwwUGM@BPJ>>Vp^qM-q`GD3BDge5R0;GZb9j z)gp})HCOYUM3>}{9F+oEn9xyb%buDqh>M+QhL)qZP>1rO9dpGz_Gw7RdhdnQXS&+R zU8Cl8&~GuJbqo#3(~#e&#B~_!QUw-uY2r!va|Rm@dc1J7*d+B(%J^G)v`}@?T#JgN zp7nhI9`vR|8mEo*6C8OA%4v`Bfg(YeOh1jUNok7l1j5881(Y)H43ixN5#@ZbtDX8X zd0c*3r__oN{FI5mcMQzW>)lDonQ?uz4hzG2=0|Ftczxsl&hT@ZmBl?-Jxi@I&zJ`A ztrbu$yL?!y4;xiU&#`zAf)b5jBzsD0a$7?{;GLz}vTV#MyAemU2z^Rl_B*fvvtuXA zCGGb@Yr~51{KQwIG-DDfjj~@K?oQoX3~- zfMmDG>{xv;^?VatLe@oJDlcq%uGlM{#oq-n%H^pY3KmkgooGbb^|TofOY_C<#d$1+> zo-IJqMS`c4CZhuOhmj)RdWn3SwxxFXIF9@bKYb}P2(WA)G|3uLY`Pawa|sGcgX|pK zDl`lxI@sFPq<3+HA3%a?vd{VZjq#fHwOx1uLZpvxGiOJLl5c}~AEJh2fD?^9=L~Bu z?%icx@{*^v9#0_|Z-EI^_<_WoGpI06d~Iy#tPz5}92sOa#T6su0Li6g52ZgpSRXXm zXY4~mu6jBiTW+^8ACdSqv|AT(H{CuN4#yx>j1R45Z%rL4LE=-}#}5Fz{I)dyIFapT z4-9>hL%UMnFRQs$x7rOfL9wb0g>Vpe)B92u=@15z zCDBJ^5qaVfmdIWHH-otQPMEDkhh6O$vh z<*f!u+$ej(xGA<rJ*!)m+ax<^6$d;VuUJ~*n9^$k@_ZTK{3jS+{Z;~>bi_#;RD7%(X_Bma zF|*AOhQFH(7Mp;E`DK5Ol?XCV7Remrv4syG>nz?ZPVvIiFg41^y>u^-a%DfH9xGW9 ziuVT2bS{auXw_*BEt?coZ}#5!)}Q_0X`YrRY6*ShSn(o{N)s%M&B&j!tKJ>W@&~_% zq(jK?2-_@wB88SuC}Ya#4mp+Jb2c1?&2{?v9)OjneH_^#)Do6kLk1!x2SS%jDMyr2 zW}cCVeTr-lt-73NC9X$^@;@4|z5DNAICho3a6 zXLwSnFjrr(`wf@!7rn!Gr!!fDn^>=e`^n~2(PMPlOD(%$+boX72OM+%_Z=u>6FVuA z$S%XooZV?OoAHW$#}2;w1p>4t1vvHJ$!=qw&==rs#B(%E7wuAYW?`+@0(PPsLUkg2 zs9U%6XpYq}`{#-SGaEAozHk^2GRwI;#B@hrm=ZWpA!>hpP52W|Gpo69jHlrX&EDY& z>JY+T)bc*(_@L^%O7uB{GV^oL5=5vnBoW zis<@y?;5yW(z7lO+H{WsfK(%}0U1}7420%&*-Uw=_|V~kgSdLDpHNH}J{hLt(F(OI z*`A#E`fu-B`!?@3K4^cWJ*KSIpYXe!yFd}H|Ne6MQjOTy?Y#HkDA#cHoGP=Uz?t`Hz&dwXH);npaF9^ZIL76gBjEuykEn!4<0ffOG@Fin|S$+1Fh^0oI$|RUu57 zuWdjY-Y(Ki&S|PG2|Tecvl2Y@*H&gWR|PC<$rYXgQ_DeHZ*QjHuE4=Hm4$%%stkLn z+n|Vcl3xN+ZDAZb$HLSk}N;N@%BV}bGvuaQ)>j+K@+Azu(KqE}LYHTEQm?TARLl-^EhC$Lv zYO|E#Nv7$J?j{l}<8z1p|zr z(Lkfph=1*Hb?@Z#y(5n;ny4aY=~tET2k5eZip*L^1@0lw5;+vjSL>xt9f_7F4)Anb zJ5;E@^YU|9cVzqHJZTb+c-g<%j`omIAttgFuNFJbb2_Iu1i$LQ{Py${=)rJXX-iZ> zE1LLmRG#UH!{?!+Ek5zJm^J~i(%IP0zC>;Sr$}X9wCOkIfnkLQdy~=!ytU7vmKKUH zl5uYb8=G*S9~X~BGQlh9kB0CXwy9=QX2FRJk9Ffog5eX!1+%!c<){**+oTJ|zp_kn z`)>X0j}3r2Y!UyrXOdROIx~A|>5*I&$+D4Tj2i2kLXG1j+9sg{cTeNYW%fi35q1xE zCWlb0c>L{yJz!Jn{FUIBOdrRVcP1!{@9lWijTIk@F@&OS zc*bKJ!wth38y$7-*7D>{%7x`}pZw&KeGvgTc}fWUeB?6HKe-5&x^&@)_Uw`iJAHmD z%704Yb)??#?7EsUVZZ1o+-SP-U##l7=LXwyJ-u&t9r&>8im!_w@$e}>4tg@Z9Fva*n;|hQ=uoA(9HGx6uQ`dcx3`yblW)rC zE5OHl$VH=}3IsAJM2WLtr!9$nZl+jr+dm_c$Hf$~OCOd&CdG>sF>VoUvci&vtr!PO z$wQh;#cGdAeyYr5)pU%qtAtRuo@>=N?%yPMqjH6lPL&ssOs&(($^1yH7*DtI#6E!( z*;5seA?I_U^?0llCniH0_^(ab^}Txn!^Gq>$g#|C zyLi6Ob)Vv;50wfv)d9n695nkS55hI*I+rof9gpWY@q)!&SPm;x^pC`vWTkbUYW!b6 zc_?4Tz}_zw(zP>aD1eQpEf=@wHl3lJQX62p6_QI_8cea0^Y zuED_kdk$ixCb7(PUh`h%ZP6>Lv`g@qbM|R_VD((1tz~il@pKW!r+|kIq2*NV#=V!C z>f`2X#+K`4+heE8)}QxrNGl@a(l4IyCb>LZmPUzG7aB_29=SkY|NOpb zbL4bslfAJ}rdCm^rP|hdvSx{5FU^Jm!+ggF3218%F~=gR;XsIDER`E zDOi2^VaqCPonI3MtEQRY1U>{l9rzzdUf(u+?uh`+c;=2&J5FOjV zCg)szD}&SdM>~mj`{IA%M~{ir$+NAxzkPKDs?A$MuWj&zSY2(5NjMN4L*c z-Em!96Gr{Or^6@UV*y)tJQ_j0kq<_B*6@jx5fPA0pAySHoj#MCzo0eYm1X!iC@y5f zbg!YYDd!)9@s%el3BqEv_)`S=%G5+S#m~jd@m^-N4!8|?d{fTZ`}yg;-^2WiZczC! zTyhE(>`;?fY^M0>{LM7A5;TA;>++bB6WdvGV!6Ie0z>~RbF=zR^69~7(c+MvOuBAJ%CSp-z=A_iEG zA_T5LyItE!GDZk}oi9T&yr^lGc6L`GvzwS{Oex>h423mKs<{5#C;Z3^JZqp)y+L}c zpQ1Q61AH}tH=Gk2?q*E4J~gASoUO}(0UlPiuG2d0qL^Jg8iOC`uwO!qwuBMFoV5P2 zXJq&+eSdBqlBB<3UNYxpH+97{m~;@0c1qud*dcN2qzPV&wcpORKOe~rA0_z>7ogHB zaIh__srSY-M2%={hV(Z!8yR>i^7(zA>UyZ}O~;yG`Xs>RIsB&0^z<3=rNT2s|2u1# zf)0~KL&!MTm+bn<)zO&b9gDXo`VvMQLqj2PW|;;2VgGrhJ)2)<*R308WGb;LT8skL z2eYG)+F!W)U)&NHvew!~f$|#nLv^ZXr#!TL>f?CG$8jY0_ zc!tE+`*^;(qv_d(OqQcx6(mia&_*W1Y3Jei>mza4Gy|Pc(lY1N z+sX6-QVc@HQh+ho@7_^Cont8&r+Y<>tyWz<`%|dF5(6bBVV7Cg`C$d$WZV!+IaTuY zlR1~}erD54D`E*T@-((zJ|T5jYgVWY443DwgxEfCuoqW3S6kcBHgC?AL#(-YuwU{- zeUq2K-VO_qXKeoQE^K*so>e;b2D>1?)`1eL4)sx&2+)UCQlMK+w z&)RwM+<(w``eqBml{fcQT!_?LN5bo#td%=v&}{Bz*X}YR0&e!^#B9_cMawmczg-P} zPVVKi^b#?AI?b(99yv*Pc;1l`GVoSz>YL>TVrrS?76)oI?U-71X0?5gDO6l$*(gCU zjlne6y@OS*eQz>voEC=X({;>Df4cRQ|Jd%nm|M7cB)D1gpp-4AiVp{e+w*V+4jzi8 zTyHBHAL%qqJlP=-LM_*Nlb|W5-4(60)V{i zE19C{tyP~@ecoaCr_km;7cCxKJ{whg-dT_e`<6nxtjszP< z%yAdX*vg#yN_E9!q8?d02f~NAOc4Z2JJEq(G9tU|f?oHr6VN{E)S0P_yX87buQidm z8>fQjzwRq-Fqbs&As$45frc0%{fuhhlU6-qjpwHHAnvqz&=TYVdHVdZugn|rZDq{K zkRI!@@ZrC(Lk;&FcS;+NygdzrPN|ztEC~n)O_wM4LAO8}&7U!O5)Z(xH=e?Hju9Zw z5zhg04Dhs-ivxF71UoPg7^Uqr8-+AWKpiXNv!{L**MoTnlXDGbx@LMr38om@Z_tp1dxCmYcr za5j9mKDWo{mx@~|fJho}ip8X`NIQ6;-d_Oxqf^MpvQHg7aA4QU`yFG8pP~ujJ=2Rl z@w?-%**$1l6|I?0$#^z9^Nh7_$3pe9;o);#fj?^oDuonvh)R+)40{px3EX#mf7QG9 zlwt~Rf`Y^Hmr%bk`4{6yv7ar!py^p$+{`TL3F&L1Y@XP%-ph#${#pUX&Tr!iavRLu zh;%)}JYP5Q_nqe(ZF=7VKE}7+ZrhjmL=Ommk@p@_AhLPV8^?VMT`0v<=c96Z6 zh_;bGo{4s?o5yH;G4PDMY7TfBp*BtWB8^c9gQ;R5{WRCm@{r3QE>hzVD0DIjG1RVi zds)ie+W+3=E&2R6l!4ixP$o;S0z!TO<8%+ZsO#ep%jyv2mTrs3;2G+tl|`07GSaC> zawMb&aAQK<=xZUf6#?FW!%^NpmX)jOjMvla!N=}@DPNHUDv3`}-F4`%h&z586Id%d zSgBjC8QNeaa~-6~H}E(gNR@fs{%H(9c5h+ajh7Bt+j4pBTUp_=O>eg$Ol?Yj?+$T$ zmgB8hyOMfM^z8O>N~F5Hkb4FG*+|4m^6Jh&c;bwfnKugh-(G+wJH*b%@=0r=9lub94i59Qq`@Y$wl7&>-x=@GY$UGBL zF^gFyk)NQOdqusmoH1%Wd3mVbntj$;dU|~cK<)>Q>IibF@9-2bAu~CE5@mPOzXW+| zp6NeXSMr~D8*xA@lqLy`3Z8pwbsK85;hW z1!3Wfi;u<@3m#+;9R*LF4>ecwAw#OM%{1DiuW{K$+?8&#c)6R>=D+{l3|~4bo4H^4 zn&FrKhw(QF?Dpm5_Cf-CcW+0Uv9s^&f zr7vDPeV&74#UQ)$byQt8s1#}rzOaFG*#MCfVAgOzz~6_+FFb^#XhZ+q-=kLNRKKX( z-h$Ylg8AHFOMF+r=Y`y3e*~b|dC(#l&-e>l9a@Sa0kb#Z2k>aVH{@-)spBGu|Lf|^aM)4Q0#%2S zO=xj^RC-x@yVE83Cin?#6t-GLiUh%eOfYFI<8&4Jmg~oz{ws?2-JF2mE}9uYeC;bI zOl#h80P#@y$~R#@A-A2KHNH+=l$R_$2vqLP6UfUW`5LsT>yeRwS7Uk^oZ1*Uyy5w$_GIzCB9yM5qsOk$Ukz$RiCRPiw1s6k=s+A6#Hf(Q_3BFAq>-_9g4&CA z$b;*o-hX$@kGqzKeqvPdnmB(Oy;O`f2PTwD$7)&?C1pNN4A^2+$BuAaE%-=ZydcoT zr&llCUas>#g>)@Ac*0Wyaql?qn(j)SxD}S56C4;!_@ymRPw}a0hKF>DQ=hMS2|&v|NEd&mNYGOIK?-#OpQAGh4P z&%=(cA~#`6bJ|q=BvSH@z~!JmOz1!yJU0uqVhd}D%bgIpReb{4%Ls1ip7SH8fZyx1 zv@z6ac=${3bSxi}7!6<4V!fy}4vZG2-Heg!HPEP!$}O!Qi|-zNSi`!wmUW>AO=8~+ zRUJWNp+;H|Z7PYN*wy@+wnVSc#jv`bn_hXbQ_#Y3n)K1@*sE>7fyMB+$2R&M@}MR~ zh}oiGjo6?t)36i4pSGIOl)QANNkgqsh{H_XKo1il+3Q1Mp%q~^HzE`Njlsg;d`@^F zWq%S?q_%b4euhaod)sfNv3q96@rOiBMf+S<=c#4|t{i#RZW*~t0cJ@2!iZU>X9pRC zn_Q2L!R<}Z;T%%e>b6H{PHm+K1q7nU5(ytvXqJ~&@!iQ0ftgR(9SNg`$~6Bs9slN_ z&MnkyX5lRtPM{){gn}sRAzYYQMD&@B|EWue&9MvNYLb)2OqqDYzzlMJXZMIsS{Z8t zAoV`@q?l0OA^vBy0`KMZHIBg~S`KRu2E3Q&9r;P)aiAQou>9^ zPC(;{SQWNv4_}jD*LEx$7wq8o<$5MIZ=uOhHvyS3kkBkj6LF|Y48lL32L$0457ztr zWt|1~29i8JJgch&ihh;dm`X;gFT%@!+akk1O7HAYC4>+eoXtg|x=iHqYC z5s+x>HBZ2!Ty^G}YppsD{BGEBb?{FgYHD%XV?135Qf=EAJftjJ2wH67yo6sCoBeQu z0PZ_p;x104dHy7hTkHBVkKn}xt|N9ao4nXtKpp)K(;(JdLXYx;A#$v~QE5#h>vXVD zz2U%&5wAY=&ury$lY5j6C?Wb2Vl|zbjJDsT0YEG1)T!Ck7w-Q#J32G+>IeTzk{FUP zJ)Z6foA>}M!aoGavzY{ZrhSltZ&mUi+@4yG_mG?v-dcYpx*_1cLXjom@J%I91m_DP zV;8{TNGR_;K_a^Xw^x0XKKQFnm%gc&Il(f<@eY$@f2|iD?)=F@KZM9uPBx>#^u6Wq z`6(UBhx#gA2Oh7WB)~Mx1sy(!Cfh)Wl%iSV3m=9JkC$IR{!F#-75>Z(Wp?45%QJbl z!9WE#YF_;xN*lHnn+fa+eMocRQE3QRQDl5N?#P`GQP3}touHsoMdgIGX6fZKkRmN; zSPW^_6GqzRVWSVfAdTjBvTU|11jzO;o-OZwlj9WDn6a11r^DY~A=jSt(s$>GX<}n- zkUp-`DZM8k(|AqZ>GX1>-I5BS;c1|Q?q?x{UL3UA(*EQfxQsra%T~cfH&Bn&ZP$Vm zM$)77zl&LAhpe+-!Qo665`M^KjtU?x<~8_jrW^q2md^%9PAMY5iV6@CYtAKtXk7lT zUvp+APN#XR=aUq0Y}>6Ei;9KrR!xmUUl;iB<(oVEd0L`C(F~ig_;ge!oEca#T?Q>H zxFly1KP)LpqgcqT(KO30BngCvnG&HGJE1xBb;*Ee9?e7CAK{rTY_GKBjkS!k&F#5% zU(>#_H>(^RO|vYHJUAlT$>E1OsqL&R2wZ&Snz-lF)7&xX_I5)3sE)8Q2yr8=?cnXKuM&-(uE0JIcZkdl~r>^ymlzRDeH=eX)s`$2$jlKF2XbENeg?Cn% z{S-g@ef(FVMDwTmU1=Jv;^oXt`@j|CvfcdOxxsY-$2#voUqZ{Kw7koLyWpn)b^cl>n1=1S;Jg z@@w_wYNvg{KnF2D2c%2BNE`Dtw)A^u@$~d{&enhkWFZHhd%?8wy4;{>r83CUrT_6?noK9 zKfP(3*ON@}3lbz3Ek7!<_OwC3A!lgd+&z^AOJNfFUrwB@%`#CyqVLWKtdtq0^JEA^ z+?`h+JA>8Kye@m<^Tg;1VY<=eoGN_slXdB z{wy8ZLZ6T;D8gb(Sp>pODRp~}U@ZGu#+*W5D2=HFt>c#o*<6EmQrez4X#~R&PKMd0 zNOJ5?F+Vv|(gxdb9%4)qb>dhZO5R>#=@2qn0CgWoCequNH{zOed9$~YkI`=NQ`12h zmW!;jv*u^fNvK6*>Gt9JNd^AF-`o|ZM7+cFZ+i3xKCgm5zYkTxyvPQ(FW4T+b9ML( zI^!(|GUT3`zo!xNh_br^Y}0>mH&JA;HfIh!W@$GqNnBa=(L8oJMt5B!f0ArHP<@DO zZoSbRg;G_Ef!QGu)h=Z&i|~;^Ka4ci7K*q9Pu(^>3we)!qKHBc?Ra^{WKRVpF%Wbm z=)kQcvtuvqMKGs5sjym8lW*X)Qj-Hls&nO zetxYkijZecGZEm#S>2~LlBI(icrnxx=+4a3O$Kwa-W~-@hp->p*|Fzo&BYf7KQQ5x zxZoj>LdJLSmp|I-CGq^}0r99=LpW%k>hInNb*G`>;~ehTPgBOckyy6a_icej@Uok( z{bi===kiQo_u88L%qYPNzdND`FQcm{x}w-z*Hbsc%vz*yKEy1-56P^93@g~#0e8B$ z_O`ARri^#i*?Rn7Ji)P*6J75e^*7Xyo2|FGy9SXkBBxh8Mb~C3iFMaPv`aN!X(%?PH-pCg#88%|-%p4g^&?XYSGDTO2E_)X4;GdBS z{Cw~5Ia*#%cHyshU|~5(ox}w$Pg7Sk&h7dRtV$#Pt-f*iu&WxfG<`a(ciuHm!@PWx zq3gol@82oxX-jIs5RG|;--fA500hqZP>(b-&qFBcKgM^S}xjBaw+}6ET}PO z$3ov1{+RM+hW!id-F7@H`2|x;8IuVoXxb>)7aEAZfnn;f9=k&Y zofAJ6=Ke+Msyw9&i8}GVi4EsfqvSnagNX7VWnEE=G5E7KddpeSx=NZjPp1#I1@;Wp zk@`!G=H5}u%GPc`TL~g>X(N{OHoa_xvH|wCrr42O6=!H}-sSqdV1CfSb-QGW6z`Abb*Nr{gf9^$1 z+Xg2olcNg|`{lKYYR0)Grlw+D&nuQbCjv)UK}I)D3HLG> z%?D@MF27T{h>W?=I+E1P(XN*Ws-Dj(?v5&66_7c;wqLSlUQma=*sJ+)#@@%!W#OIR z*Gq=>jLi~qg8rERNsH1k5cB>E<9H=n#TtWW)Bzqd)9@79&Qr%H0+A_~)xXgRo|;b^ zpI{V{8()`5h^22(#QGs35skvN=Nui5&%J3!y7S#L%q7N|lzxTE(o? z3$~9kIBFZnX$tkjSsP>v5ypjw(A#L(M zw}|hMwpBkx6@#aDmuG4Y0)p-pN|DH1)9Y((P7?UX2onqt*MY6arRh+wHzQn+lleeg zTL&8R@AuMq{t3r8dz^PCN&wNsh(JVDYuh8o1@AKuWMG$G1BufV3iuT2QIzru(Y+i} zx<*(<|0N@xLG#&brzB!(wM<=qb{yHG)sX!%tmy1LDwlmH=*^P4$?nNSR!Z+m2>_ zb|9-divtxKjD1o}o@3I@^97hO^h)_|Y3}KP^qmTR;%2>`s9y*9-9}hkw*7RU75;+8 zRBJIxN>i*#V|;#1$s}K`_#_KYcgbYFBIPu>jJ>gA=v7-Q`8j1jdJa=zGSEcNZK4rG ztQL-&nghHt_sB7yQ%+e4)05A({(;v8iLvCf3Q~RX>~F^gnmZ9$uNk(3A`k>CrV=^) zS<&HL%@WaLud8S>*GYe63PxLOj0{69{1l$jU9>Rl|E#deu`6L~8Vi7`I ztu*wYlL%$rsLVE)GuNEUB8d`fa#>k7ziE<6)Fd`>U*#&DQq*j+gfx z$d!8CxKD9(qxza7N5F)FLC!iyi^m!RpFv8*KV)~IE{{S&5QDv(GoPZb(tQ%uU<|E8 z%I(d78JeGsz8gkb)qz9Xi2%M;qa`rOcv$Kp6d`(q-|i;mmy&h;!SXGCAqJDmfVQkv zAi{i4#PYh-qEP}ggeH>)PI=K2t6!fjhxm5GHwu{!DP2cwj)BoS@xQ#IduG?HwC#OB z*Fd~GtLqZo^361mYkb%w;Mzsr>_!?I$Hy#Nz?~vM<>BWM5w{k!nWmi#jH^>l)OK%< zk+&sr+XF%CCfr|w!mz&uk!U?7yX~l~enfDiD3{`_LH4&_Cq3lS8CorDO{bx!E5d(O zY55Xnz&I1&>ePS1dLqp>V8F9}6gPu7NKmk9(XTt$$7FJd3gjTT_1-*?&ElsuvI1Yy zA>wO^#N!d?@7bNCyAfM!02N67F*_xcU9MxApx0TXtssARw@xY_Tic5Cr@Ab`B6H`h z3k#Ez&C?eA*W>C|qTV0br}nEldLOwIdgox~o4-M)BPT*VeyP`ljWcGTH_sZ?xxJHs zPdWa&e4UO1z(ZjXZV$b_T7H}4c7n^3<$$-Vol6s4VGthijFA`*r6)A}lZAT7t$k{X zOrrQ|3i>M~!ZJ-V^VT5N1nO;)mu>bGrS2X+>kx+r@rUu)|B>f(13&1782|SG|4Kgp z?~D6k31E?P1xv~CKMy)G12M{#J>`z}O|pum1bg!hV#BR=P%y;n;Jl6FfxearKty1> z%;IC{m2=mJTvHWy$;%IJgf?e%#N0?D&Z?E7tF*XEm!CL+3_83Nit^uMT1{`mJ#4FRqdJP9ObXhVJ+ z@}#uC<_kwoRE?q1zBN*U)jGhqxi9Ra?iyWu!X0OfGv1P&_MOA>SMfJXZkhu9ZS8#m zdqc|s$lELSgU&~Rq&*hdCLY{edn!b`ZsFOVJ^CZruen>urnc^_`I=Sca*du3o5d}A zTT`XbtlLo#?k6!h+ro~wv2<9hvKP4T)rW9Zl6n%N-Ts&Otx5&z)*m-`Z&$@Wu#;+z zB-88fbypPAn8wgMtkrEUe(f&)Tc6rp$pRluA1YrB7Si2=cG~{h_R#u`r!#!=*Dc(P`?G3MIvl3!H}5py=qctm0i%1i-}h+T zh3v^nxQ{4G63o)Mb+F*aylra(3^xuG1zuhJ&Zb5dt0NqEiukOt;|D$!>#tC;8G%gc zU)}D2=*j%IDWd=skLkHFoV>X9ySq@TWbF5Y_9pk>Iv@Aw^A#`tkH-)2jzbhPTAV)& z)r!s}R{~y_`r91dmsR3~n+HWM+s@6l{b6&|`cN}}EFvh%aRu`>`NEX(hReobXbU?; zYsJYZ{`MQ_#2uns&uAkFA3^Hje!P5Mt2evtv8i$3ZmxBXy~o3p^RMh!a~?sr6K9HS zD$4PHQm`|1AUj{p&YZ3r@M#EMCnoSYB`Wwiy_&#ZG!IC(^Nj1uqwxV==pDJ-d*7Q< z#{LTerm!p0FeVv52Sd=#G$#Gun$A8l5>jH9z=Z1q=aFC$BeQ`252*^5hrvw|tCPFu z^$V%Y;!n?wsbJ`VelE?r2$(_w%JbUif)6!tmcuja{wZwoSO=+rzN0FGgK!j{`%XpY zcB@^D!w>JY6V=CzMZ<3sJbg}P9^{v0@U#P%V&VO$+oKkyd<|>J6)6=<9wpEb7Qas_ zU;h|mHHaOyo(Sz`sO_PoyA~Wa2u3LBAx8Y|#t=!9-YtkzvX9tDeH^vylwdq>DDA)5 zK&U<&$eUM79KzTCXn9&HzTAB7nTu(DcaGsZ6s_WR(obYv(`Ua^1z%eJj0hkXr(NmG zAWsqi(%MlPhLsI<&J3khWcr`f{$$HuUdz3mcZ_N~A$fBmY@WJd$jN{o`#(}zyzE4| zK3M-DmBk_ZzySih7c0XJ*Wa5&X2Gq4vi8LUeMgM3!TJa)Tygj_B|}RrMoXQBe>JY# z9$CXgsLg`w0WF_g?wfAAMjyu)pXr_g+b5T%3%)b4!IG-n)8Hnz7UVGd53;LOeXEZC zZo&EenPoU{xCzj6WbKw>Cj$Q%K=Si%)P8@voA2gywTXDuC=GJUkaqXigM=vj#vs2OqMD9>zMLmV8_Quy7&1vra`NAvyKdwhY1R+wQ z^kx>RdBUEz!p0$~GU*l+)h$aui@se&_G0Bef_H@W%U zUKv@@CmH237iORJuKo;}Oy@ghp3qPPXy2#*D0CFquSrXu(TqkZ{Bvz@3S2BT^A3j3()(dN8Y{vz#Cbz;mSR3=2t%3!9{VQ+p+fFP=lI1f!8sk`C7X8C zK0*_Z@bR&j*?h6yh>e=YvRdk~RM*e%s9N4+mUn0?Q(0f-eK-Gm4DN89uLpRl zvB+b?^F@*$Zh`n_{r`t=o`yVaANx@y?jFT&+NU>*nL6PV`{woPZ`AV49XwZw{01+3 za9QjI2c#h22I>|fKiHkcvPmW}50PK4`#Nr9@9C~w^R>O6{M4I22Xn=FI4nFflGnRMr$y$bOnzo(@PUB!D_y@<0OeyOw@J7z703X_#*W*; z=}wzEiVVoKQeSKZk6Ms6UMXmP)IUCvEIvcAK9NT*I_EC}q|o5Q6T}RdCykNARluIk z8x;~Tj)MSl69>|OzT}HSYBm`qVd|i>!sQdP7w25@^T7yx;j&cbR^+Tzh4lG`XlFX) z7bKt*SzDY^ev6`j01}A6a&rS+RPQ+dQ_eAeRzIH_;*&Fsjc$>P=Q=-mhll@enk$}n zHXt^uPf&SdsQK#(4b^5@#L1)DW{1TYt>%yU=!_dG8;b=2F==XD&=2$~WN45$YYe>b zS09SYX!TJXZ|-Pf$eXFafP#_!WUESK0fFrX^0n2a&FIF7#N;FHNnJbNPgST4=-C?osdW3 zU468IPnpC8saX(5p&63)14k zI+l4FCL)MZEAA8HEIUrDr{S2;Pluf~qis2)=vcy$OOIdm2O32Z%Nn2U$R98)c^MGP zM(|NB7pn_Jy?pGt4*`5L2y~q-A<5e59YL&Du2GUIoy%KBgg0&;RfiUWXVrp`hy$HczfV^ zRc0+be9rlQdjagezGRfe^7|EM^mX$DKU^mGT&#%&GdN>aNo5DL#+`&IcG`1HeX8Lx zzbW$tU8?i8*Yn<&RX=NY>}4q$D$1TR7`0PL?#j0na1&z85fqg7t?M~&j#v2GWU5cS zvtDHCTzG3@O~F7$pY4?adRWGen0`DcpJPkQrPtLlW0S8f{9kmvWl)@9vn`54aQDI8 zgS!(fIKd^jJA}dA2@qTccXxMpcXxMpxO{t`eb2pB=lq&EB(A?V`%L)?z|i*#L3&pNKy4&l52W!~Ppfe6RX3;vH$B@4XU+ zOY<<`gZ!PmZIGaC)C_zZ#ub=SDbwMQvqwZwK<)o4JOqRE70hu-!l%N-jiuVJh#}A% z5kzZ8*_4glj6`9P6Cac~ZpSei&1LkM^9=6MpW20nBr}?tsBWQg>&t8(t$^f92slY; z-xGfq@CH-vON4JLf3$yBm_3H^o%Fn*wr_;2i#mdURh-NV>!acI{va-#^rebaqU?xV zqVDQ|FrroB2qtt9wF94K4&v=dZ_oD0MA_6t6gJ=S(~cp>?Wu)4KnG443j~G%9-pB=3`I>su<$aY%BE!7kY$lW9%;JqQWp`e+HPPi9_FkQT zW+Wp2VrHTsR&02*lu)p>ud#JtMY3$P1G_3Bgfq_M)Kz1XsNu*$`yQO|tP`J9r7rwc zat1hg|GA>KREG)RVk(F+zjuj&T`t^-aC-pwo(eXvMt45G$=nKt@ImVO9npJU>>+e{;RimR!X9f*gSF$SDy{x5>r3fyu)d>| zcN<(f`YJM3>_Jnytf&7=2@+6poFMNORAs!Yn|YG5`NEpZ|E8wZZ#Pi<2e_SZ?7-qC zsl_wXMJfCw9`EkSlWfjSBHy1pECoZ0wE7*|MH|u}yTxasWE1|-Q$xPw%%A&fcDIy6 zdrqm$>*?RzIACPP^5^w_4&aX!A{8G34~s1 z%G*ySkJ*DV61=XPJyUkCHYY8#`8RmXD*{vWJ*z!k^syBOmXL2;2`}COMGC8KFVs&|9$=i0eYf>j*1yMf)0doXYP2ZqtLdK0OojWPw~SCgDx~&0i?nmA749iT`0~8V3oB)?e&RYs52gVPTQyzbj9z z(}4u94ucQ)0mB^}MLev~ca-%0QHeX8>Fm2>6U5Wm0rloAhEo$bvt4Bk3hh{z^;9%m zQr(1IAG0h7JgDz5;QRY+&}zn4JpjQjn~h9iScyxW4&n-5_##E3Siplw{=;v>)oFj~ z8W@*QX8PtrC;+-jIDx@0Rv?8XS;9kBu(pa`_F-t+Tl5FlHSK5PaZ6PFhT*tw8_~A8 zeO&+|>~Q9fyXxK03IKN63V^;B8`>d7H9LKAJlFCe3q760V? zq(iWzj22AD;VH7czrJ4veCH|ir@OcM?WqB59pH1k@$GxZp~5E^C(UZpVT}#+AM1Tm zl(o$RpJ@fuo>aas?Q;H#VA-DSUaR4j(D-MFHxxo`ja|XslxlKK4mOkK4~x2)Td$hQ znX!C_bm?)Ec!!wNU#owvk+8M}{U8Qu$w?I%CW&m#q;0F#;CfC=9j&>v0Sr1t87Mc0 z+~tAqqJTpFylti`*$F}2{7jipeYL2hjt3@JF4upJA`&VZV6$yrZAb2KD}J2Sdv(tw z@TodrC?AokA*l%8Vgizr=G|3muOHejCqkY8n>RLZQ9@6vg{>$ub=n5@e0Qzh>yJ0D zAA6U1awJu7Wc)_s_-+8sG@YbQHoWR-^zH>jV zBc1r;-zQR`Owz&L%&3Zw{xT6HpWslZAJx%9n;-@VP~)1i(_fke^<6I@WG(d zUYz0lM?A^E)IFs7;NOfB;^x-*xT|jjc`T(g_XWRWZu&I4Bkv2wE~ef-ja*C_;GxX> zM17$O7|;4Re@B+l{K21RQ|SXDR6gkEe|@r~7gYF2w)06pXuFTOm^=PM-jwJQs`t9Z z$NEpm#G_7ZJHlFKBIWkrY`^V0N${no026%nV~(LCgXWgD-FErto7O*nU0N30^$xk4H&`?C>+fBn;xzW+ z(gP}H3;ttCL`!|y(H^10o3}GO?jys44|p6(#Pw#MIQ9C3=u5f6UWCvku{@4z;}FmP zphky@v@NBg5z%|QGRYm`Rr81KF?9prooVDy;VH;{nDh6wU>tpmAdVaY79NxefGuHJ z;poAmH^L99%5MwK-1ujFA83YXbnoBqDe5H?FC7ST+YjYG=ZE>^gV&Aa&URxF1#-d~ z7ny=C9h^bcaT#f8m0-|busz5iUnpUAy}Wu$s9~DOwy?aY3_+jx0l5;3XEa<$_dpFP zI=hb)B?Ef%+@WGb$6lr0;}^_Jg{6Bd{M2svf#`(goAw6wcShUR%rK+zzxE*nZGpR? zQLx5*6#~5fUN}6czWu5{r;-ELHi6T5;5F)YY*=Rf-2>T%YW4jVz)ck2*r{P_dn)RG^zxN{Fyk?0Lq(=V4fPoE3C}yM=qOuMk zfqXW~)*rwOZygRdnrauo?_nxkbO{3F+Zwbe90SLxRhx|>uu*?^5np9x&B- z=^5bclqU9-_NHJ4E`_5FqNG7pQH|PGijD7Lh1Floqs{ zjB(urujO5^zFw*IXG{iN6wi{fCq4ScTk*HGB})dg4)W=|`l7KO{Bzvg$c?3;Qjo`F zs=Oqe#4KZFmYlUyT^VGZIekB{7*1&3qdWB$Y#r77rb$_hf#!@8GC6vDyRnrYbsP9ZLN9w{{E9&w(i9(9cpRA87+RYd9?)6I&T{3_ zYiAJuBnOvy;28{Tx0QrN5YgeY3=nN-?#C&$pX8hA1NO$!{IIGIpm|lNXm)=~?`tV(@ei(T z#dG-Sj**8K5zCa*LPkN5f;&OwC#g(4krnN>pDT2|3or4uEdq}+h2iJf+GLL{!$(S} zqem!5u7h&P?-}sA4X_>h8|qHH(k5bV>a&5l z-+skOpaz8a4DA#iMbjVclKy>?8^6d;pxILcMb z3CMMTb?85+{Acd@>ksxSS;T*j%K~xooQ_7aXL5J!cNE8o9H8de7l)c2@-ufcv;(!F zU7(Pl8mzqr_1_PD0_>bN!}+j|2<|9SYEY!?uSo94FXHbV+KNGFo){s_BNeW77q}t2 zW!j{JfDMdY`)8=g(fboD2oUL$%V-plq-1Y+42jWfmZ1xrpp}aQ(KY6y;H-YmDU7Ag z=jHltw!*D?MZ)EAzTu;SWG6p8_7~^*FAX3mx4v!3xv8 zXs^!6KS9SA!)Qu=o3rKt3=&!*zb%h}`|Bce5E)u`E6g?0OdW7@3p5xu$P-f9qqW~4 zG`T=#(^z=tHE55{e)bI^d9hb^GC{>ZPm|UF&P&Y+AqsJ%+ATPPBP(;IqG)g5ac%Es z_DACIKI=Gc>cooE?g^T=)0ZN^apd68s#h>ZU%C8c*wx2BGnAKCI)VDgh@H}@*cR`j z02;nL%$T~9FC$FxuXOEQ2077qiV$A>oH&wG0K8}VfILsdB*=|EqdP)>2|7jjYhrX# zA?PR-Vi#B^bro9h5QR5R_FtM=n0g2o8+CQpm;32@NS8Fzsl*>qq3|6j90F)2!wtAZA{>!**et z3?B0Q^MJZ1JPt?Md~4=**YkM(rFg}c#S?Uo24X?tlIT8FJy5H}2t#e(Gs&eC|0;gYzS|t==}Rd9haK0n;A! zXd8#b-`FLJQn-cJPdRISGNcno{zaEX@SVuz2Th(pbg$yuhH-|ss+s`0qm0zMew(TZ z-}tW5(1)TSlJ0z<05rF;q&`zER44xH>vVUnYC}IO?_B&Q!QTjh#jRFS`}sboHLxsr z8i5>vxGS07sW~`sOZ+c_`6+Don{=PBeC?9fro- zU5brUh|j&uw@Z*MpPE;%Jm11eZeA^gGi9jgVm(MewapdeOf7W<^ckbe`%sO(MG^#h zo~k@GXy^}DcHhHKh@gx&?3Q{DsMqXA*3WytsZZXH@MXRlY8ts6=F6oJ-5QJ< zV>o_*6(9>R&!>B8-Wr!2eq1|v4)ZT?IAsc{O<47|44zwATWrdYtUnch7x$Pbe`T<2 zskMMy!l|~?W^`X!~Uu(OtvNdNL0jKk+4Hg!uP*c*MeSi*Am0ugJpV+JG znhg06zf&@ZHq_eg;d;xgZat9HJ3n>%2vq@vJ&$mw7OKP$!+Zm3? zd;iBYnI55{{7-FPo=Lp@{rO#n?SMBcsCWR%Y&N%8@iVsoQ5G!zf-soPRoyYLfpAyL z1_6#T%?zn+I2M40o;QEf0cILbjo*65hyr{4yOSUh`@Y)^iE^lLf%7Vn%H9_rOa#2Q zuVse$ zoZY=C^t^-3#GKb&9p9Fut@j(>*C^X{+UNM@pwErAH?*tJ4Qt^lqyFoqCzg$ZICI-! z4t#4a9NZ8x@aBaHoG^HyIIZ|<{}fHuW%5R$oe|lFB!5KsW*rS&FK7#_+|vkDG=E!ft!k0$#ArJxBY3IG zUG;yMa`hX>hx2zAnMuB14IXeKvhVq>EgubN4blDzC)9a{Hmss#FOFCfu2xT?#4-J3 zQJlp0O6|NM1XeU7r`j@F-S2zydZs%z&yTsSxw|?1ww}KQ5|3%;QkD z;)3{f97uGMJ62SNa9f?m-sE$kk(FP9KS|_$S31{JVDecJ}8?IK25I^k$;f=$Q@GlAcZE@uuSNhTv@K{43!O2OmAH2b&*CTQbH5a}{ic1QHw%mdFD9~Wc;9L+1dA9k3Py4?i9Ta{-qyPoh|A_N@EwmlWeffc-L6I0)oGa_2g-cizVg7< zWwp;v{I$aVT15kvfq#Qx(ifIR++nkH-DR%Eoa;#7Uu85HuET73szYP2KyVjwLQvYSFS-s27_T z?QaWtQ3%)}X~TSq{*18O5qkP+Z+1<4AAJUWCVgJtH#3Eaz;z-5*+_z==!{5VEi4tI zNZcGwhHV+06wD$f+NDqKn^2k6xGo+Y-2MKV$X0BG<0{`0Fyt?X1B#oiB!6sB(6NvN z+btXYs*pS82Mm;+D|^_qpGFe5&(Af?(Tk-y#+0uaR;Sg%mUaQ(cx%$|q(2akVf*I1w_ z!Dna33nVxS%L1)IpifN&fc!6~La6KNxNABqysOZ&Gl~apSB&`uq3=9B>fIdk;+SD? zgh)#c|NXDfhI_{_Pbbj84Q41T_ul3k^p`?0iTVXHFHZ|Dqk+*dy+dUcIJX;=9@)c5X9YR^=BhRDZgno8n1t|F~HdmUDi~d%Rbd z`ShppHV6LrU!w#`O2$zKb<-^>C7v!X8UySMD{Dh3wUf;bHNK8A|M8h%>;7-k43qr8 z4rKMDPB15I-sBxaZja__Z>^hdS7e1a5jauF-?9plV#v@YJ}b3(ZEbbF=|fn-t>H)_ zCXl;*#P7U6qoGMK`+n$6X&-Lv_FHBNLokrgj56_JF=F*&%%p`;_Nl^XHi_tI-oy{a z!8y_i=iI1?W)kUvu7wRZ(`X%`Ua`fHKUMe-j4wdF`IEjgSu?pS4nHL0kXLK%a`96! zXQf>Q9Tmq*8IJdfN^2a!v>H5D*OHb}Fk_;;UT}eFvxVCOj zBfbq|7xYd28b19N3l!a%g4*+IvcD(!D@Ft+X@A>`g!*(+`O3?=W;)9BV8BftB3HTz zs{{eC(vz`S%gPOzw^pzMH^BL=7|3e0)U=N53$ zSs%bQ7(o2VaQXR6?B@y*D)!pcN!C7-$&n>lrZpLk^w`4m5M;gUi&sY9Kr+lk&MiB- zM%i!K$>4mPlUY`wKal7~b)>XnX0iC+NYkTmoY38p`<-3rCr$yl_)iW$gYkbW>|f!p zq?IaSp<*4SXe&V}eu_>0#oQ~vZ`j(M%F8N~hKyPpk5Ho9L{7Qp6Yi7|k36yJ_CHpS z6DYOIvVf{%x0`|3f!4Al#(x0^0g{;kKVQmlN^kcRo(tV3iRqK@sPAd}L1#Dt;)K-H zC~jttRCcyP0Zq8J&husF>-Y|~a3UuZ9UnU2DL3AQ$sMXquAc((^70P}?h}nOo3A#P zp4x(#Bu-bC6BvT1ne_jecn!K_y?yUD`IbCqqw~Ro8+O-E7lEoc)waJNV@7 z%VR9W*4&3EO(z_vEbqsMSt%kw3b+}3nV%v@2#eX%F9cRklS)pc8Nfk%t61uQAuRJL z`Ta1ct7XLfsrh`h<`k0TMjT$X&B=&V2q{cWZq5)x4r9ohyhOo$*Y?Eee~aOQ++&)UWB zR-$sZVlB%TSOF@((-G+URw!u6)L4Nhji7wnH92G3>4y4+z;%|51DeHbUGne!*?$(8 zR+7cov_Yy3z3H^@2>j)J^XUz_?qdB*v(}K>Y^uxk^ZIhT^>c|hG(bfpKs0pwps(<| z$Jz5Svlo2RAOZC!x}?~y-fnOO+B%86xhRz3KC0P0;lNZTS1U@D(P*Ly`|@k9lIJFJO`pNWry5&bc=`C8#ih{lCJ4M@mB;A>1N0l1fPnYtPU@cSc|PGqb6s zE%dWo2myfIcLaPc!)&wIuV?n`c?bwyH4A$|^=_Nw)j#M;Kp6H74l_&mZf~Gg%#ZQ? z9e~@otaIR&@+woTf^4%IVe;h_7&{9b6l-0eDhBPLtd=V8FDLmtY`vjg@wHMC3lS4`Ic3@Wd>&{m z8JiGta@v@qvesLUbDbdC-xBNHu@UeN#Q-JY&WsEu!G(D3@h=t$W?D%q>6{+@@e83Y zZ1eckbzdh%*FUKv&11ziyLwO#qNy#^EKr~%HjEdH&#pZ2;rSUK33NqxfKSjk@O#f}_PVuw4%=ayi({N2me?~4YImKmDk7n$Dm1B(w&x)obYF4Aa+4$q5N_^bz`)r5lE6M$9nnE(|ed_z9ws?m86NK36{BT4|!qIi)3OIPvY%zJt0E zviM^fo85NJX1osK*VBm>-R>~kR8+kXZy~2Kq{2haS*N;aILjm$v#20ZeijiKnKxs| zcmwvi0NDOy?G%OF;qJ7Zq`K(GQ0E@vyFVJ>rv3F3>N!yqmP7F>tn#eMEJJ9oZ(AH4Tg;>J?!#2hY?*V8q*2@Xireu_cR_zM({uQ3`6<_HH$hAJfAV zr%rcgHat42xzs;-U($|fXKzT{RlPF%dH-vGfbs6^pLVaT&}cTXs_4GucMHF#O*DU=X!SrOcd=kd)#9#z9>8HR0RfYM+5jda6bZg6&_2>p875X zCuPl?ebm&YiQO~GjMZVl4E4+D{LeZCa!-~2hY@l|t{9a<9_&DtA9A)- z{G)8CN>#Z--Iw6|yVX;qWQHO2#FE;cQJEKV5@QjTZOV zQ~hEVj9}Q3dNQWWoX>i}^%|<;USmQqqoLE1G2rsb!fY;H5!m;RIco%+1SHa&f<_ndcT{$HjEN0KsErK$#x@aL7-OWwV zhXe|>x{O3l*zQzEyj<6Z&lzvs-SxIR`lG?`41oq}^69p&0R?SNvu-?u^K>ry(m^Kr z=@k%CsfVqW9Zt`CU>RODbSRv=>$@$P2WRdZ4+SB!4_%&W(IuUu#IC~ar3j3R{kDux zqaAZvm&6C2_oX>5O5p_&b)DsZ)D=ssbK=&-nC4dINEGlIpR(dEh#`0LzP6V$&vX9^ zAAK0*2O3xs7=`u^A>Yi?FdTr+@Hv$qP8CC}0{`p+_e%-zuR%83&IH|St+q)E(Pq}K zjMMjylKYR$jI9Q&oHkSabcZC-SKKW*oW~mI*{u9)^^k+CiT%QhCH9~uG84u zgq6n5oIorsXGrA=TR3C>l-8>*dvbuw&#@tEaQNIEKgCS1RxS%vKGY^Q8hc zmZ*DiEnf5I#*165`fO@0WNeT1d_C#_^-MQp`I}Z>eQJ$+?oc;}(T`*!ZrrO-S1luk z-`(dlw%{&EC5*b-M!%->AGg1E>P#;u62Dh^!wcBYd0?&A?51^oEf}utd}qBq<(vEA z5F$yqVe_1y=|1kj2)2uu0DW-P zvtx92-cXgCTOgtvvem_7nNH5Fbpe6ZIXrn~v7ykrTer4{^k$$pNIVemmcJ$ITn*zS(^n{`G^g)|kFr0yAXe0XyVFT{EgY#48_mE(v z^I`1ui}34=S40`VHgrYWV0jsXb&{Zp@L*#_UItmMDEqVERH>pM;xIt?HoO{2agm}2 z7?#GVXHijjU^g4GLsUL)R*wa&)_s7I|JR}|4sKm|#@wCt4@(wcVI4az;=s3oFuP0N z{b{ZC_kMr!0m+#{Q3&LDnf&1P1G;jyF%D~gsUtTB4UXjADnt#q(X^`MvPpIKYqsgpb|JP^nsCQ2Jnkk%JR z1ZEg{ro}Pj*r&zm^SD#p`X@Z2T(B0@=A5!EtPC3?+PDCEn8-TuP^Jt6wfawF9-Uk(}QA@?a@!=UqGsYz^vgWgPLG&Kq zACU1PjBm6H?EdK}*{zh5V`e@eeSW1d{kf(rA%h5K7lmIv&PX$plgUus_Y39{v*4M)up%D6Jp<5 zBsy;Oo}G2F%`{DzNBf`KzlDWWLTbG|o<$38&PM(}oZD%Cz^QmS`XOI&ZE2MypsF-5 zt278-n^1%4+#-tn@qW-K=v<5n2Q$|qn3lf#khVmHZb1xt_iw2-D1_A6hk?8Or276S zwcC7id!Zv4-uaLEQ5WM~tO?b#ygxvY$l8IHfJK>Wr6 z`Ijyo&YltTS~iQAJvJ3Yv$54~(MuwXRx`NyO-|i7lrgv|Z%%-CmoCY!mceX?2&gsf zYUXFCR8$HXv+kBa5L(Y~JVPc+J}cU~M5ZN7j+8XIcr(Zpv#XQXRAa;$}RnhuenAE~*Vw?qac` z-MBsDll4S_2^_yCQ&(48sGo1$dxSRA1FDa$F(yJhg?2rUur!aus8Y>y!l+gRi|NRM zM}T0VBu%{h(4mU5K`NJ&gT?nmPM-2RgU;F;ME&<}{9|FTfP`WVCgeryr>_q{ugL0J zAMs)9CoHV?dLJ>Mvy?#B;;=HX094kmi1ICCXz?0^?92AYCf=zx;PZM${ayn$n?@qz z(qO0{L^zH30FlQeNPVEgj!fl-u+(Sqm?Qq!=M|^HT~-<{m5g+=Tn|b0@>#}SbXdjl zpc7+r>Q>%j&;iG8R**P5;rVyGMemn{WD&!(Z>QPYh&)!sbZF0jL-{S2zjURrVf-;N z#8Ny)Mpv`*_5?BEIy*K}RkcElO(6n@HhwV(ETXPqQ$7|lNuBF|C8cQ)Zx@o+}yEe^$ zwG7{2ZX-rA86ZMZRC(^*+%YA>S-x&sCmxq%k>#CmeOIy@NrwdPIJ6+B=Pi;1jf{|T zW~sJsBA<6dF&zo&IPQ(k^YbfSKo6R<4PXA4^E<1B`q;}Zgmb9`TlIh^txG=~{x|un zQYafb?m(Ix={cv71W6GV{Esc+k)BW$ z8|^*w>AD&2<5(r7>RkYq#Zkg>29H<&a*=sOt}Rs-c-4Ur6wB>Wy?Z1=Lc*HIB^4>x z6co>s&u*S`obutrzd5R?*rWA5qn?q6&v5Gd@UZTE7;Q)>a%{dxxM893Q`Vm1sG*I5 zn|Z-|y|kM|GKs{J22e@T&d`_x8Q*eQT%>L1J9^n$dE>1@clllpq@9AX(=SELpNABt zJxRf@Jv9r6F}`9AGtoeyU0lcBaBtUmz{8SJba=YnAHhkWqJhNxq;^8ID3%NDnR*O7 zs1&1$v7s93Dgt4<42h`hk&HzZwEd3R)R2 z!}CFt$SPyUL{JVZJ2EP(^zIfqQ``RVAa>ty_{~KD7%gQh4ilUTBa4JR=i9`6O9@Qe zGkL@|Dq8M7zMt}t)k0?FYvPXAzT{nLQ)@2QYik%fZo=oktM@p<0{sWvUkHzro_~hK z+|54mS6uXdw-B!?5LE)b*mtaiq)2sv!Ww?Y{y`^W8B7i@$oT3a!-%w24yZo3H{XT0 zmrkfYnr)U&rB+s~36g~5jcho@-$Ctfen{F=byNF^i$I6&Mijt zby>?+Vlbtj1>c8RL-K75g`~}k=QW;@4v91;U6OAU^1 zZV<91^rJNgrm&Ze^jeOSff^`%gU0e%pxUc+n+|ue;F83oC%D81*Rt z?nJec%)fMiz5yJWqI9q*y``M{gcV~TV`hX;$d_YYJF^$*Dph3Ux^P+7 zJ*~ux{J!}HP>?1j6G;<(3#Wi{vrboC{91=IrDrBADc8$vHqH-29~ z=3!((XW!%cxomgH<+E=@*b=3#>yD2PZDF4pG#8E+uu6ud9Gbq(%Wemk-Gvv1uA zMrawd&>f|OjK5v^QG97u?Gd!taRC3>kMenVRuz%8@i2x6GBjtI!^P+2$(c@-aPh_1 z^d7*cvpF)B)+G?fqQ@%1O7u!hhh9E>{Wy8NKI}YUcFOh2c%DF3=s1P77mhE_4a z?osHxB(Bz;cdkurv1z(Fo1NkpnPozyGi0IJhIqp*v9hy8-{6LZkl1b&zU96^7m}z@q{gIGgy+q!>;ct2Hb*Kz; z_L~C>ysW8?h=s#MAdBa8FHTFQn#q~4DHb(KoZl{ob!U*tY-7}JRD zfIDvm42suzL-Ceoi_d?fF|0v2y&e~>q@)`+#4@Ou4u5eg^@vn5V36?MN^btR!DWI1 zj7&2bbNlM*;j3gEW#@g1cjDh1CU|(3?*~4gcEecR92i8t;P@L~jr}`kGsal}tVNy1 zTw~wQfp02a3_EYYh7I0E&RycB3@);5p6jX?mUVvB*`su`qh>?xERgr5*OmY^IFjS* zu>S4nY>lJFy)Q=iAZ_@ONYy^(Ni-s6 zLb<;4VO#vkQns+vwtHIJAR*iFZ!RJJTYN3FK!XQ!x-bv*)fX97N#gKx9B`xhJt0mI zhuxj+ILUdvwJyZJVh?Ad38feq*hc%u0{JQCqcw)PCwDMn%|eX-ZsL6~xudNP7&_W_ z_k=q7XSv!7-ef=DBbwve5-N`HaIe%2JGuzcGx_Zlp0Q5X9!rK!FRNhP9pxU8jE)aw z2+JNq-Ws`*H(bWx>t7d+>`Xd3EsG;(;(VmV_C*Ag+pyGv1+IaexvO8F4@uW8KIcg6 z^O4In-$-q{D6ADNFQ&ksJ48gFv$E_8atO@`=fcP6GCuc4$4mhsqj(QdGpbh_wY4zLfz_VcKP` zD-tUkH@H?l`jxGUr@$XGjtTcndiE_-efgeP0HNTKe7SnQtT*eA#ukLuNze9GaH+*~>YZnEZ@?kJv4h8I^$zZ|XT3 z)U%_JOBF?vsJ@B5-qmZ44ZiTidlRow)#5QK7ZI{CTjMZ@bELnF?^85AH3V(^?dX+I zuk|wgwa8L)p8Dlbq~Es$M8kZVeuZ@B%xr<6p#_x7;O^xY=G?^gU#VbL7Ir|aaqz#I zJZ++%=Vk51> zkg}4u2$&KXled>Ci@TN*gL6E!Cmd3k?p$FvZd|lTivr4CaTLJUi`#wX+^o`v=HBys z)*A+HFl^Fr5h8re~9fLMl($a9T}Z=P8fp-qXoPLtXjmbp46a z))y!A3XxpC0Qr9)sS}2<7%XNvZ2wF%j}?VP?HL#)oe8(xh2@dI#pGZzDl1>*Z(*tRwbkW zvVQAcngd4)@5hxqLHKZ&Wh38mO2ww;68N<UFsX&@z&cvoNQ zlYr_G8+=i}^FsE31Kvnn)9?8=+gty*mr{@ZW&c-=TIM`cCn}0g&?MSA4Liqw^r~}} zV;yKD+F{wKD0K~~t_k?5MD1$k%6WSj1T6T=hzduT+TO&Q?l6oT;g%G}-*yxQzSv z{sEYVRZIHXoN1t3cuSoJ9T?w=XX#U&)^8EF0S@QPSjn zXEmR-zS3g>MGSQgH9pRxZlv=5cQQClA=Fm9ZFcRayFlNtvaXnhNW zAHj|q+y4@tS(DNm50;ivgn0@Xeb_o`H)W|6C$9JH8f`AS3y5aw?>Ps&k2+m!ws4L~|Oak44AHb4aW_)a-4d&{roK3g`>DsI(hT|)AH|PQ$s*93H)frGqt8FF)leJ) z6@`$J7k(SVF0N!Xqf`W-S*B#82Y~R1GlrbGfA!(wLspbeuT-l_=pa!Ab~yrU>hu02 zo}}8p+bAfvcl6^HWuoe5lJAm}xd3B=Pp8z1{t%oI)(PxjyQ1msBPH7tVueNBNXpo$aw54Oc8rW?SQlhON3|Fbw2+%c z#)&$1$#f!e)XNGP-g zD7;;Spn{uq7aNMdk;(xv=q5l>i3jN1+Ryb%=sDCRs8f`$ZC$#8vgZ{}E*}gnq3=2k z-ZysGHpoYxE8RaEhTo6MP(GqZg1hO`512l}3ul?!CQK$RPOAS~$C*f4vBg`+7}gHR zQVco_{fxqfrg=_?FV)u@^*pRMs3fN#HQ~`}7 z3?F-&u#esOq$32+TTTvOnNLJMlg5~RC zdcy4N`y(DA&(X^Z3JI4MlA|zDK$4owZun6fSZCjuScT`q!fkR zVL7p{4KE#~-YSnW(_8CJ4qhMpX$?;tOT9n=yK4n@k|%>yQ8?1N<#L-{*?9xGK$ZehJsJ}ISyW5^ z{?J6VteRNFCwU)Iecl9I9uB~23%Z;-wLSb*xJ@;yylr6iC{%yp_02!AB;F`(Xj-}6 z{p^muMcI5scpJF=WX^25|NiGN_`M%MXF4~fO)eaP0={T5h^#QXr2!#lqPfBod?Zm= zS3@dJwGv@^RrkczJ)iUL5hJhn175Wd@5t7rEIEVkp$!(8QdS0+FKtjt7EdKeC!RJs zm@fB@#~`THddhKcU$dtE3wg0r>H$}_f~76$@wa)=vILKKvzqV^&vwF*vDFx)eB4V% zbuy{JZ>l6}{8RnhLVE0AUORHS!Z)xQ!$Ry9)W7Eq6|o}{71o~qAGY2qs;))Z7R7=E zcZcBa?iMt-I|PT|?(XjH?hXm=?w$}_CO%=}{^nZy+}rMXZU2n#@iA&tRhR0VM=jU| zJuc&S-WjI~aMS4myj+>^#x5qcu7*@g{dq&UUOuRB}e~s$h7-FdmwLhn3!esU$)l^k*7Ykmh`pWGi2W})Q?ZX4?YFE zh%Q)_D!J4E^shDws0 zfAO4S$V9jHM<$azJ}?AZ)1PZ?$GQ+w@o)d_aaeDFTN|!9L&Z>g-*-z(ONB~NJ4kD6 zP;uN^g51Efdmy_u`%MF`X!HChR?G8wui7n!-N^9Vnzx@>hRx{?ZTU}9=WLxA4_hh7 zRIJ}VBAT_#5;;@VPCHKr_%8|p-bi;Wx5U@NoT*&pXNfME?zwj(1vP<1$j_3a=JlVs z)L#i^x}N^#01;_~4SvUAUc0B{dY&D7>a>-{$O}DE-l(TQ+hQ1zY(?kufE9|9NuC5) zpodpJqh%B9$`tuqqi-xsYZ{v1%;kGu)ziLJVXfpbi~8$dW>kQGXUzv^79rCo(@rqT z^Iu5N2Yy2u<5>!M>wz{Vc1}F^E3#bQDm)=4c&_x-Hatd*cngYH%3xjRQukZx6lg1F z7X^RDNdk>5)Hs+5*>VqFn%{)-c$D<>HJUD~y7mun z=8~^zP1zsmop?B`N8LlFL_vtJUg0p&k#z(ctjz7E2)%FL5uoxOR2HO|Pn6?&^*|IL zPhb0!Ws_m28R03*$|7fdze|Een6)o#Y9!)anJ#AQRr{2Me+Igx^pu^}aV#3D2Dr$= z!|?^Yu`8Wi)%ONyu4gbuywDQS2GzolBX+JOuvw#TSz-wK@T(C=*S=EfYYpJ{>D#aG z17F`r_uxLp`o@YsseNjow~tz)u((61@06TL-r%vPke9ckw@~*TdU!|g-35^ryKIBu z2XOYa&=XR_9{*s9>%dI{OiUxKCL_x+&7;>l@|L9%i8})+^sm0kzf0<%bu2%N!`%wb z8u>+*cXpvj=6Hu~5^16_E zjzp??-eV*iB31nKV&9!1(j$kDm_C#~&$P+bNX%IM?`zYJiUghkmBDRJSUiV3h_`P9y5#17u>1LiO zI+oxO=_Std#)QrUY5NH6)HYIV1K9om^iPU415P{t(~&PJbZn*jNq)EZXmdUgWs69E zbG=Npd*`#HN#Mg2a?BRx8@tK-2!E6LGcGpr$S9<_I^nzDpVXwEvtq5kcLaw?1Im-# zI%1#m&U9hfH|y5a6T}h-tH^Ch?He^#EL|GcH<$r3u$&}IDBgs(dg00AhcF>fD4L<>p2MDHAEFODV|xbl%)#xMvV$jAoyW^V z!_JZaA9(=;65TciIU7SA2@bZtVXJzTl8DhCir2x(S`nusE!50b_vOG)$~s~N92ngh zn&>B{q1?U!VeVyng_41IsFP8;<$=6Tve{?kewTs)(Qo)-LMn!gWkkAfLB1>o?0H&L z05SjXd=leIHW|l+!`O#q9X8?5l!?lrERt8D*r)_oCf-NC2fJbgY#kY|gX(Q;Z1R>) znHZs#tv)SA6^MZ>rq=Sm7+~TQTF$U4e$B70Dr{d5L3Br&i5KTFt>}!djQHZ_eT>`k z-LY2_Poa)%%TF;Gdop1+)Vm8^6nb3NIZQ|!^4i2dmp|9t*rro+oeLSlrNZ@l|2bJ_ ze{(<6y|ueo+u$!87jTA^ar{vx^jCrb-9zV<=2q-M^ysqk(>jexv^s06$}BHSTKlmG zzCnwb^sW#tO4hiUY@@^-(8wKkuJ6ilxW^mM7u2b89q;CKn6{|-oP!EF-R6@9KuK)@ zMKD(>A9)35eFQ`T=PW4V_IBK`JZ;OhyB3}h#BAZ4BN-EnR z(Pn4N@1Aqw@A$rD8f*f=RX96G%k?FEHY)r$uIFUDHnE(A_N*Nvy$Y=2^6yd)J%3x8 zxqDe$Q6APXYpyEKy>mr29c+1%Na)S~Lp6FYTmL56U5@YD&D~6St|1IZ%d&cD{gJ^y z5>K6d?7s*z$(QfoLwN6GWG3iv{nPPB7mCpjKEnj(Ip=7s3_8Bv!mNvabM~9O;kz<`&$h(Qc%$3s zSUk?1J{H-<`|8#k43QK8IrOHD!k9ZKK)*^>2_%^wRm) z-q^k8rd)24rn?dk+~p3nT06FPjs|{-eE8F(J>7e~V(Aw~gI5w?8;5~DMnms8x}FnB z_A~Q4bFbc821i1P-#MnH0eLhu_@%ja@0&+G-l+~?Zi4n^+O{2xW@2aITHE!^IPHDS zcgYJkb(u1?)ca>){N^g>+#?d3y4UB^#}dtjI7`7@Jcff?NM-F+lDcJ69Do#1CjK&{ zkBRbZ0Lye`ksE9?VlEL3`NWRt8<bDPuC{c< zgwY^t!Lg=yXw$xckEP@iBm5U?j>OrEdX2LJj>fDgzyB=4MGd|Zd{Ed-^~(XIBf@>5 zyQq038Ua@&e098LA)+V&OLMGSb)q;NcFfWIy^tgMrcW-c5{vkDIkjL#B)VkSu~*p; zc`+|Kyd%EpL**fc00*#7#;`=VUK#Fae1K`!xX%=bFTut0_Yn5Qb-i={9G z-_LHEU{Jr*C@~@kv638jG(#-J{B=r(8%;u!Drd^XenQjqEUgc-l|lFjk&l-8p*Dr2 zPr)Hewu_b_E|^!5n2uGymkyhh78K!{A}i-?fQlX6Hcq@hdhZO0m>jX&%=n^157jRC zT30-3yyE#H$O+CX|8lV@k?%RB;qH#?3Tsgmj-tO``3><~MuH(~C#{hCA?h%}o`47M zaA>0q?PuL(PHh0B&P@dp7jZei_;0G=ZzY|YL1A7ULv3sL^U+^>O5L&lJVgjnpfE7E zrFi#r$LN{|NibB}jilVrc-_Z2>^ZBM0P;}h+J{jmDWF%7+;{I4rt-WCx;BBuMAtT6 zgn8}De;^f%J}`pu>}0Eg!HHHk@hwXffxbUcH6pp6DwnL!ezqI5|21w%y$3IY;0|>> zu=w38)MejLdz7b;+MBGj(F#}FhsAa$ike@*4xGE13w$Rf`r(Eda0VtH49&7S0JDOs zu^9#K_=+_VwG$oL+=8!%>g;p=iM&#l0zc@^Ha`>Z>aHo}WEg=a0;!fHoO@01bC#_+ z0w+#{4r4>C!oe0ad3N_}VCEeQ|IyRr+u=2T+yp+9o8}AUWJZc7ueBg?MGO*4?3Eq= zXXGEIbtF^;d`m>Fx`6$=;Ga?|Jk)&Vq|HBq0mVV^GO~@7unR}irn7b8eL+OWOOeQah_v)7do;2GONVr$Sh-4Gs zP9XSBQbhzy%_kil0R>c?)D03(csU(LS$lmII|k;;#rpPDmIn%3BBITzFjHW@UE`*Y z6@Umk#Psw7^nUQZA5=I%d?`^8nbrgtytd?@!5HOds3SIE z+t=ED5qk$dyi?e0ma${o_)_y&MWtz~M;^Na+hnKC*qOIjbk*>kRP-Sv$N+t3h z$|+#XLPn00{d~qBKGwEl7zt1g66L+)`W`O=NMcO6)vS>9G2Ryoo)mZZ18xEy9ZsyQ zGtI9)p-%HBW;{{$MOR<7b_dDj1ohOdQjiL$JUC7E{4Q0=6XZu0;`2gj$Ti_lWNO?G;N92)&!wfr*@-at$!4#ZbqFK4>n zW`zUK@v)QGhU*V)DRuxwbo3DaXf4iD{CsSw{E7*EL^?JY+ z25kNqfs;TuY`v2HcwD>s+f{Ht0enFcxo;5(KM~*-qOEV2LbTCrnW8fM#CW3ZJpMT~ zook_-lPJaXcD(JJI?X@w7^;f@KkBzn)Tq;0-Hn3hrL@vh(47dG91GBecJ_M-H+Ehr zZ-XJupuF5`1JvgbbtV2$Xh)=e0IyIu%kv@o=S4R#D~|d!+K)?N=OhN^*FZ88Jk6*F z<^cVQBsyC!=icD6(01aEs=#?6Az*{n3P}O4i8>~Pabq`T4*S}22T#_JokcNmXm^**@U2ilEF&Hhv^*xAtgRT ziVu3A4q)4Et48_>jH5*TS4~=o*Xb^P!#`ku99>ueRN^$1-0h7C!j^EZk@lnQ1d$IA zy>$QSKx~kOoG2a_*2R=gjD~0cOr8VcaPn&)oquA z>6c_qnV3*p^pHkjOd`2WH0GjC!RCrza~2J4kUcpZ#^#zj%Q`hibAL2=ID4-&f++%D zNePWCKG5RbfiIEoJ)i1Lb@;ITK%W`2J+FiQS;G3T#Z9?=gMEj3y|AmK&cgMVK5SGa z5V6$m@xvdK@pMW0XkTfIW}-!UV<^)qF`|qgq5)@vw$j+ROhRe89DyL0Z{REd9}NQ$ z&+i=@EO)Fkb59OMHej_39BSO;ouM--@xjDpL(3%~^Rd7l~k{alN690cr_O4@Usc>!+OV>nG^r;04Y?Y+i6; zqw>rj83wcnoA$4VgFo4}Ck8~{|`H>zHMPwy12Dzt%w!NvD)Vf?7GRh+lqA?m;8eP5y{Yb$bQiVr7!0(>M& zr9SwMtX;vSH%MO~RRzj*r;xyL#yh;PHtZ*KHXNq(U8DP-TYf-Fsa^GGgB(}eC_j`r z+$(=0a4g3v-LT88xhw(v(OUT*5-RfQLvJQuqG9}Un-|aixZ1Hbj7#PHr?(X^E$lfW zCb&Y%Xz&UCsc5?h(KIjC!ux;Q+K2Fu^@`Rzh^!g0FQ%@lITHj~bZ4iwnqz005CNc! z8|QrF9{b$8e^5{wKpGblBLjK3`4e}l$t2yW>#L`nPcL*m@_9QFg2*ffN+ZEOW~`Ze z@xJdqRT^aTp5hU`5dqDch7NGy*fWQ?1l-Mr_#Bo|6uBJCa6FV;=A8t=hUjK9xAb~D zYk?exhTiWoc{f|Z%LVjQEZkm%MXdzl6ZN#LDB$UTX5BlBE>% zywU+-u(cE;>%+7f2;CLB$ zYwV081nAuOYvhwh5t1$WpE#(uJzE+oAl6p}{dGy=y+JDRB=X16JKYMna9WnIs^}B8 zMlBlzT#yESp;(ChJN$+@!LxJ~UOj_D7hdDo%TpyfJ=Wkh3u}XA5l`lsX=HFCl4vlm z7%h4)o23*DG2BWp&vY-0i@MAHp`L5o{)A0D5x4NWGLrNs5;L;fLZVNU(iT+c`4w(I z|G*eP83Z>xr8iVOb*;^p-EgtuoE2vzAh~|ooj3X}!wDGRt`>?N4vA-f%%F|DzFXDa zMv|QOs1C3d6|XfwqZD+Dc2ei|oIol4!j6|3foG+xvlO7OI_TZPDaPiLXU}uD^)Qy7j z$r9T%OxHI56fE?STwZL9z?Md?{Ann0J)16W#Sk(KiLoc32M~{>+a6Nx!T3ER1n z^Nv}7CqX+qS_ftyuW&$#wJw3-GJeM+V3&DWdb*RZ&K2_Is3_H1k;6oo=4=D67d5oJ zpifgwr=pClMv!T(ij0Ub!%+le2=k{lqFp}0J4f+f4xSTT)KU)>qTslQx+31ZE3=zW z!PUt6AAH{9o$!8$6Mt&;=9uj60Hmd~Jhz&0*n5!dup-eCIY zn`UqA74~!Nl?YN{Zc#n|;J%vN{Is^tuW5fc#mS65=d81-=&n>crtKo52@cMdg{{BE z7Zdc`J#%6-x7R|kc_zTo?x9L(hF>tbF0SoEz2XCdio~lrxt(HGbTa8_&q|c2ADj?} zW`!gv6%X$E!Oq?~?2IB8r-0o9hPtjDDeDk^wB`Zkc&F zGt2jy;Rc&I$ZyE&>N@xoyT@JXmnLIdH=A4x|FiKiBKXh}2P2EZE}1gCLZJ#W_LDk> zuy$leq^QgwpGdH^0t<8T-hLg$=!T|s&e z9s1HwQYS7nX+~0jSh|xGLyJxnD((JTxaH(FGr{Ee#%xa}fn^{UNK1{7npcIfZB}>6 zScOsEpb#qU=v|>$6B3(b(s?w6EKen7i7>WC7|C>r z%l^Xgnjq`M3R5`Wn$aC2Bg41D{_2jd+9@t$*Lh=n0x_PVix4lpV3r(bv+ zwnv>a02`>Le+YKz<9?SpBMgBDuXAw52IJ>+*K^jPc^JZYoboK9O7Xks!cNzQM)Fov84*4aU4sYF8R^S{u>TO=>I`mvX6-> zFLZO|^G#^Hc_;X$iiHOM{4=V){fDl9gFB41*s#x={hMK%x*?NrBmCoctRn1TEyIW5 z4|m3s*tgayg*>QKmvoTy)2z;sch}0kSG%Rao5x1&h&a)eCS7^ zQ?UK&4|DgiKQ(AO&zKY7mt5$16@f4@a>dgMNs)hJ^`2^hlR z)#!I$XBLVkzwddIjhg6irV_}y@r^{^ozBkyKHA~Hj`eqR_*8MUnM$h*D)*xZ{XXYB zP2?8Ku&k=L-Ja{+;$lp~sOy4Kt)$-L-A;~3%eg^^X!0kD`t$XkK z3;lhOcY%QH9F{FA%`f-PW5OLzv`q5+>FR!}gPtngMzwn0g@`V<4*`a+)?1)*Kw?>O7n%I$ z`tPH$mLKDof7@7EI(*W~xfrhl*(opt4 zaGH##k+47OK10Z-e1nNix)Sw^2?`HkKgQT8e02E3n2FRG>u`^(tR4_ ze`)_2#fGMbr*PS4;Z* zPuzq5aXsM%qo6$S33ke_F)fA9yKZ=U(%w#hgO46xrwWSNrr>JlB^zM=1@^&;W5sJ_ z;Yo_$MofzdOA>20KYaVS{|*z@99p=uQoGpY)O8!VkfJ7<-GCI5(t+E#s?^qC-)ugY zTPIxLbY}b5hanAzJyb-V2>!uJGL1aZ%3y4(GzcQk9a5TegUp!qY3Che>QW|l5Q+CM}T`<=YN($!H#eLm6rnu{lm*iQl#QI{%Xj%6Yze=>nR>o zQB!F_3Jmh}nREF}BceWPF3JC>#2Nx~ah*%&s6nsL(w(o`Saquh*S*N1mr~lAJJUAZ z6L_GTj=EAdydQ4XOSCAaFa;rUxJO6qoWPXmY^Sw9XT+WHf3yHFfSBs;bSPemO0`;z z+Pi*SHq}V{(|oRR&rfbwJ|{KQUGWSz1~%4})%c3G!(NgJ_so*;N~Q>bDo~RgHIv`C z`AJUlE@iwcW7Z^#A2QBWr0~0>7rO$cUo_a?YriGXRO>YFfE2&B*(PnyuGOize(`jIz6$-29zebtX{GH6f-Zu$wQ(9>~>ra%Bw*8Uy! z#?dd!+8?Pnh&SU*ZYWCx$Nin~t}aB}eX7rGyrsswjEs`+l`OL3M zR((-&1Y24>J?KognQJ%&Q^LlvV}5$4w1&Sr%R$rZ9y*Kjt1TIa zuEg8d#?AYG$S+b++xScD3Q8(+os5Uvj|xGi zqsKF7Xc0X~CgXrhg;x$!BN-TX`+fu+5sKUQ8A1_Z^7@4OkY#exmJjAFw51+fNzl|q z5&=i<&g5$I_P1Gof#;30%RlXH>+WZU&k6pN5yyl5aL3pG+wtanay^s4@K2hTb(bli zdyL^5*o7fQXSBE6&(4_0D6ZD8+#P`p^fH$U8EGENO~+@;{Dzc#AY?+zCo>vmbYi@j zk((Ze5TAT2x10C+0n;4hyO8e7d0^hR{xZ7lBHBl5=KzDx?9ABSCEAj1_AA(HF}0Xp0lGWI*&e zy?J;>Hx`oXGzg;T&r?vqcHKgd%9c=-Z2xYa^)eZC<1NPFM=+WqeZA zDMU8zgyD!zL;uJ8FDSml`N!xqRmIhnkWNK&L(sv|aH7M2FyY%oPY0S+KA@fITMo?P zXH<f@(QE|9$4>IXmEzRWTl&JRDF4TRxbg!AW7-8g`goi#d zPRsoCSTUw>l`8zNL?-B2LGAG2lhZ1uXz6%-qRS4I0xGcxE{S_Dbv1sZu%b$>OUJvi zc^#&b&%2e>u>;1wid3Gw$ags4yT#=rJ|67-7)66)V(!cZDWHB21Q^L9{ECOtCDfx- z(*>rd3es0Te<}ZTk%wO&p@80?!F~cxAO*0 zpwFB+0TDu~%?bY7A1=iIhhP|I$L{U9&1&2=GLF!z*In`&r+r z&;5P!o}wZCnjx2nma;O>_`VVOa&3#oGO(^h)^DXdwb{2Xt55YI*kK*Vq{OWiu-e+u zmOfM>k?Zmn(;R&JI)Ul=$`A!7S`6@(XtqS?&mpqHygABu{-(1f3sJy0qeYj2-+Hk` z?!(_C(?*h0@$Jba)InR(=1ka&)ZChxb(h@#6kOY=hU$SKm*S7Mg#n>q43&*@0 z6P~$U>BFFjFWlHk;IZtaZydkxa59=}47J4Uh#xaRS&c>B3f0bPP2#i8Zm6R?v(rzb z8@jXH3|0i>Z@>S2dFtExNbq{uH=0rM9YQs!y;|NVI8++f;_$gJ6?{0N`3ZtXegUcC z(U2``7Z&f8ykej?Uj05w5nS`9gJXPx+L}f0xKbt{WEA-1nmkPcPnKuplt`w3twOt9 zs&lu66~s)y`1=kAYsmQ555oy*Z7)JOvLblrrT2?K8M=Nwf-nL zA)2OO`p>)H)!#ToE!|Bj>%o<*5psJ7dJ^AuZG~oJ|5m%>tl98L`?0iX5jZz6?Bx64 z+~2+e;<4G_f=EF&%g@Dm_O2<+-HrF0SPLLb`$cf|ZkAQ$_x$!1e_u~Qpx1XZ5ts>@ zol%>`3&5hISmR0ig?J=y$DngsnCsgjsHD|LZB$V;K#nrr%0BwD_nIt{dR@DV5@@AvztXHrSb+j}_iS zBiN00abhyQO`Evp>_R)b^vkyPXQ{VIO(DR`8CZFtas++^{i99jtOc*+P;>a^_OK}h z$LMAITPsSRqi!3fF*Cl$Q{en9{~oT~WHx}=y&4fRfa9f4IzN%~ournY`K-HT2rs`n zJbx`hU;>w9=(rqxfa!O`&&=pt=Eo+P_0wh~V8u}Q>lT;fFv|wHG>D7+hy)|KAz`_k zVDL1v7q-fOt3`^QE{*7nbc5Ci!qy$TSmX`>9t8zrfMN{8xm_DiJeqNyY$MSz0DVQITIJ3@=?kTj$UAlYh0uVnuxZCuiP$re zHN_WCf+%LCG;-hcaLI*vX7Vqk36xZ(G7K4v+-;t(iLOJSrbc!L>Y}vbu6#1BZ;iTy zKKy!Q6qWGwuu0jY(|oPOJh(hw_s{0jQ{Pw6u{k~O*!OJWysYS9|X6^kUFP)Ik;lPe_O^knz z94X(H{r++MyXRuvXuuTo0M$#JpPkJ9q&#O2ikWlk$C39Y=ROpsE~LJu4{>VFXp;o* z9(O~UN3p8PQeyY$W0O-{#n1A!fmU8qKNaEAv<_)#`rc(Zh9BlVoA|($a?}|{=5;IY zjp077;0}{dq*M%6^-iPX&kXA|FsLQPTbS`=kqbc?S|TLs163z_Jq%Q zSMzmkVk>*ciDh(at}1Vc^}^S@YetsZ*;F@^${sGDe!m4m)mEkn|1yN3g?ZM0aGLPw zi=}n(lYs>%53r`-e^u1dA~(ZJfDTu5_y|%N)SA0IQ8xy)-l)$W$xa358uRMa&GY2`TmHX^P%7v*?9r?;FMd1 zqtQF|gpGx%scor^qr=!Bo$xieU+m5@5WWhZce*hH0a+X5YqI+D3E$k>F1q zr}tv(9|H#hSQr3UHV2nErst*D(E*#~|9Ce4_sjpIoe2I{s|4H&an=lJt+idttRB0z z)34Z#i3IrIfgHgw?@~cc1K17b((kq{%J*xU{VUws*c5?v!+YCb(?$)m(%6(|S*fS}^$bSjQn<;|vnZorT&9yD zeKFq|fpRK;3DPY&5a?SnOUQN+WfD4z@K|n>H z&&mJqk03OW8_0*5Cj$%YE1wjslQd%U-)%D+5O{>$>c=&$Vm)7q+)3SeqGm=l=zCSA ze4KUCK@8&Y9*oQv{5EdAP^i>Lc5)+k6`b9rO-f;iVpz zLDZ}AR!--qD_bR63v)rz^w6;1Xy${X$XLD&$Fa| zC$zrG#vJp=mH+PdC0;v%_j-t2FtEyoRgdWiR)5^KyM7P3*)v+9r|7L%9DA8g{Hw;y z^Xr7MYJocTIZ%DQ{Kmy`f1Z0bMb>tvmi)JR>)0*4flA36OtV6^@A9|*5Ig^~ZzPcX zFX|O6kem)-6yvm;G8@xh&3DZ`=9k}H;_VwVFc1#Y8-KUP5ZLzE|}CUW=;V*Q^^N3 z%?{++*N7kmF!q^JeGyVA=$KOTW}}K-QLEYf&cn5n=|uTd9=gwk4M3+AH!a;JAdW(r z@Fpq3riXv6$(MJA-r=Az*Z*#ZBpLRM^937Dk}8_QCUxW@Bkr+-KaV|aweq9yeT#awqlJCzE!qX-l z#tXgEn}v9mxCd}TB9;BDOR)$`b!Y4 ziHS;|(yVUE8%kJ4KfS%mt!1c=R7Cd93du-^;Z1dzjLvKn>~R#l3dUprLARG2f_GF( z5~fW!y^nbgyB2qh&g)JmQ8Z6g0nbW5hfVRS=jXV!E6AtOAWJkL^(H>39W_zPr!Fea zztQ=Zb>MxMr_uiQ`|j6ag{YgMV(`L3!YwFCP#7ZnoJ9z*j?4%*{c~QL3XLTKP3os6 z0S(`JC5D(rrYthO`fuL2wo}p$qQ8GduDk@g{iM|3-95bg)4C!$d_5~G1K2kqViANE zpnpL@NP~7fAQ38l>oG!6hi9=b%!AS=210K45wN0UXpkpuR@a~~#M^(NP1a$E^K!$v z81vyBk>CT|{)F_{3M}8Dknu`yUt$y{oBHVpM@#!aNK20(m3{WB^<>@WTj<%QW(iz} zQ<-R)_#0k6mUg|<`oFs7#nQiBv%PylILP@@C&AaqnUI}l$utzOY{y{xba@zfQ5(Ux zK}=I)O*56+=8H;_is=PvT@e}>??6miFU{{<@NHbV_9n>(Tc9@HiBiXb`%{zdBh?kT z>i+yAQi|jE%)l}4Og$0$u~AJpK*Qn?_NL6zUq?)`O5ieDVa@rQ?V-T9dDS5 zCi|tNEiVdFSd9jdUMq*xde*ubD?%H7cpsR)=V_kFs?A`&GWr{ zpXt||7#-H>y`E*Z(ysYo%ez1J@1`G4le%#)5c1T*b*a8e5= z`@XEX;*;1!dF~c`P&x$E)J^x!kTc+&<^B=@*Wqe)^$U7}@vV3^L*+SA<|@ZIDh(%s zFOtgo6S{k{;2Py6%(tt2Avt@@NhiO0&(zw3m;sF9#Q1*s58hv>sQAa}v?Tlh)*=ku zL|=5KN0uD1$&gE{>1&m6kFzQI<9l27wA4 zeTO#%iX6&h(0D|2BlG74$@%@+B~RZ2;icp3RvSoqrCQggzy%0I0laVZ^l6>BeO&Uj z*@9(qE7kmMHN8G{1Vz#`yZmXHB?+`OkA>ri=jht=mLDv6*ysR`uAmdD%6tKP>_0@}R^ zApJ_fe^X?Rfh8auu6y?3qa3)uWhnv~3u9mmL3U$gVwN~`4iOR~t0p~76sS?cA$wgX zyKTC^cG>)>u(e+&J@X;dJ;+}()%~h(vUNf_P>oAKRuSLFH&?B82VbM%CvrEgy{E0= zaa-4bT9g#Z#y3xKd4=(CkivM!20it?haKeY>HAZzFxS3Z)#52@V|#jA=pDgT|4Va< z>(X;1tn(ip;$=~E474J>YBG6{Fhq+D82j`;u$5X_*Op<4Qnqtyj0~x{+#@0s$FwpWyqRTbF`bxA0J_>Qy0{mYxTQ*@;t05GmMc|CEYs^r zeq7z6qSQYGJ>pO1+msSHvGb4)8c81MyzVrsNYCogM0J0Er)hOjn^_VT(kai?1$qZM zb5H0e1gd!uou##q8rmzy+)5g-=mN7K4n5^JP;BdMSitcv-hH^8QENxMe4X4m>%IGb z>g$!sCzWiKW(;~a()(CC1Wq-}mn{6LQ|f8uGS}Tx-pcE;*X|C5iPd|!g|d=gjXw1q zI3pa|)M=cReGsin+357J;E#tmzv3@(#^IzK3s#wtK#rNsGBx4<;2<8^l3Masvqw&K zdH2T6@li_l+U3%NKK$|ZNI_T6!6lb6N$YPpa?4tZ8+hf`VrYSMA;|ld4Z*%dDQzu_ zwb?9#FDf9_iQzUHZ_1?jm4B%HQxNf5#UmaYO<&P6o0X`}B=#>ibX74p9JZmw!(}f0 z47d7d4XA=1Pd_v55UdX1iy7(?R!HWK+VmGQ1 zhX2!ZlHYw|BUz8xe zW-@uah@>7|dzV(-M&AlR&BqloO6S;Ld|=A~nn^}|>=$#h!k8|doXztt5?GV$Y`BWK z;Gi$9k0k+PyD$vOq(>N%mWU9TGzoh(u=i|qzvS~;`LpS*=1vI(fu%!lCluf-(uVDE z>>r}LB|F;Nq)RPhOj7P`B@{E3sS7yxqu8-mo=<^IA?r*!u>!~FGN{u0%@xGk_X^vS zO5N8TC)#9-=q16&!-^J>pzqN#2q*Mn3syZp{v7#m6jLLQ3Eo%IjW8-`#`5Lm++}(D zr&jV7-#coVhJKYNj1b5DT|~nuDjk$YF7~>d`$!@&A4rry22G%O9_zvTydynWo$gUe@_lWuLtN#?KrvwIjf&uZh9k_yb2WT&{V?k-#n&1`2()H z|CHbHpMTa-o;9CmI5?ht(bv@G3dG5*DX{Uej?}JT*dYfF(~?f0ZZm~J3uZED>C`~( zXk>Kh?$hCTxb2yLJKf~H&a1mb!d&l*-|UjxrZ%uD*m*eWueyUCd(FyZ{&CesE_5|_ zh_mCJUnt0H+P_cwhXdm(XmX|?sFe2B4fv(R4j;Q|?93_u4*f0G#Z`*9T@sC|oxFcY#Sg@G1B`K0_Y?Z+= z81)ZaDrTUvi-xB-tkfT`82&OglQ|l4J=LxJ{e)8X#6|)AFvCQXfj9nUL}$1n3B+k| zRo1Fc!6g^ML{lcY^hJU|b+}L&B^}v<%#&5}nMXClg-bUgumg3k^#R@Av3uN+Vo4~- zxmMGFU`^e)=n9h@y64g*M<%ihX_Nh-^suy=J8rnU6cIrg`otkaFL`22XV* zpPN5A3(YWeqf@Q({_q_ev5}0@Sbh|dvSyi;FRISH$~RE@nc1KtL{55}MVpxMcTYw4 z^%3+I|1&HqN%xGZ*6k*95PES)UgS-G@^|`&O!)LwIY!+mT8xnsu1}I_4zS(IqU@Ox zqQ%KhC{+nig%oV?pYI=Mm3qWKh_28&-{Rlqdd4qU1jYCK2J;{~zyGQkS5eX$O~Cr? z7nBGy3dM6{4Zbg&;H6Qbrc$pCj(lc{?u)*eI8AVq)NoXY>yW6@D%s84rrzwA?ldVD zo7R0k&~np%YE@s^bzMXRif}98FEd-GGL|L#vamakLyl2BCqklOW)QnW{CxOJd{8!a z`#0D_)LpFrSO+yUL?v>Q)_``R?Itg-eE)Lp%`NS%&lUPnq^?!`F!b$cAn%hXXZ8kw|_~+ zG0TH5LT>8=PyRKHd_coZ{*IrvBmGt@5|&q_p!Wl?l8|yS*^OVAdo$5}8ZykW(#4(R z%)RNRl0|cOXswLh*U&v1Kz!6pvS7u5WzmkxU|kSk0GGF1aC2jq3+(YB*}Kdnk*l?B zZ!$A2CC>7@=f{4WzWtziUdjFFes7%>)Kw}|Sg_-6J2{y}M=OuO{XbfOHS=ym8x;N} z&&_f$9mdpy_QCXCZy;p>eVAMD@%5zzTq9*;E0eAK$eBx4993^kBdR?+8OkTyGH73p zgW04Fl5)8#iwiJ^B{NBmYatIm?|t~W2lyD}ug({i25 zLD4SLqKLgP-S|ZjEmcHs(Ret6g^~Fhi-XGbH%KtQgWgy8j9*7%?kDa zq7nl-Qi}h?%kLx4tU#|2b+={vWrooRPx~CTaU;d?>)3f?0*+`@mTsUP64G$)&nj<6 z1=zF{M{K2<#vJdF(Rd4y;gzZ@ff{S88ct_lEE>8%oEuM(b{jK#)E2fY`8WFl!Rc}v z(;NY}T%SzkI=!B%)6+4jD4et)c7b!J0sy9|n@hshs zdpH%ycZ18SZ*~faU2GxJ4rew4k(oL8H~Oemn=dbyQlFqia*q|QHDVyE^%${90BUpp z{glt}!d=_-;rEizmR|1+NzWMz>Mckmn~_|XioFiBnAePPVga^9<$>?pXONEw%>0Ud~*DU|^Q=h#C+5VSc zGQOVF>x^XL?`qXG-U-u>U3uPFH@M~e5sU9p_S0uGe}&0o==fl29t?~R626%nr(BD4X4 z4vWCCJvSKGRQq5+Wg(8EKOA_9QJkW!9p;W8}hO1vEj((K+ zPgpAB({+<`S!WEGxyEg9GMa|Lc=5Ff8M098``IZj^Ek0JO3LlH79@bi1{{PO2$;l)y)aLcNM5WA;HaWM~r;#NPNd}dWsxJ z@oAP3A!nmO!q6j17KI%dlY%*J1!(zBSw0GgT<^zj%HVcVddO&$Ky)Ro>{Gq4^iCW8 zoT;oKK!}W;rCSgugFhS?q_L^aSD~n`)H`0aqP|O?FbzG(Z^IH7PD`?w!xGcJF6v?d z8GH7Zlt_S6>EHHW)3W|gt|&u!Cgau!d(J^K=49?JKQ>_`+ZM;{q>bUHTKWi zW9;=jYs#9-SL9ML>CjuNDA9R?|1&5FNK__s={Z9|s<+cO`Y^lz!_9ZyK7auGj#>sx9%cB3@ZLr7Oxr3J?D`Z%m zHqIe+yzXK_Ml;Wte=}A0dD964H1l)J*Xoe$^YtNy5Nx8@quw1URVVNQ zKQIw}GmtQHfc&BVm15?iaZK>g;FKKsxD}QFnHDbN5839HVc;uFquJ{E&;s$9jM6{F zBb`uS_?H=B-&f^r%cLgv9)c_=v#psri^F2B#@CtN>Q+4iF#?6NXYd%TjrQjVE3WR? z_8p~??6DcGi2*B~FL{%;?+xcd2w`|y{?D4r? zZrKy8Nx#36eJVS{Q+RNz%jR0vcFafK|21)upA17=lnu_t9AEq^b8BKiL1`OuV(R3) z&XQ|kUv(P4a16vat7yOjhYR#kssn7~wle=7y5Mi!$ouNsV|3r{`@NS3!fy=Px557v z51jjVJg^*9eTUN3U-7_y^Y3hO7Hefr7X~V}y_ND;*%qEtmdFPxn#NMxTt7Q+GJU2cUE8^?Mfx1yEJlbG zb?AMw$14IRK}JAdZX^)!06H{;t;vs7mCtjL6I8%3;M@m~ zI_>$AnV2y3Of=Zlx^gc>=7=085V66Rt+W#|Q5gbslf{sq3co)$it32d4>IhIlH+!i z(m;vFUVb6;5cw>d3`fo0ms>mw8#5aL+dxP`g4Er9hoLQ*ffPQAM0B+yrkR|D_Cos| zNCysceUgm9q+tNWAZtFAO1j3vmp2^a{0U>Qp^%yaE?Q|tBY(j@V-p^<7P+eNKL2Lk z_q;Z9)u<9cd~pG@yNuS;G4b`JssD$yhoA+vpLZspLEIfERJ@PhOvbIMOsZyn`v(l; z96Pymc_ld+V!J-6S>Wu{4lZ|;dBB3)zs*r+SiHqv_el0x%% zt+9P{-{R__tSXIK%k4TTA&p~EIgrlMTXKNsMX+kBQ(%39?$iAQK!qYr0uQn>2nM>3 zo^Av{16f%yNY$|fT&RsJi$1`GJ_sm5VQF$laUe z(y)fBD%F0KbHLF3qN@5jU*Zxl1{{%_|FV*}V-$jm5S8RZaMs-4oCHV-mdvs4OH2N+ z8wj8%FN~X-Xt|!z-ESS6`SwvhH`m+u`wglGtK#cH)xTiPU-;&n*ih)l7NjLxkB7O? z7%xClou(7X5{Bhgod%olsow^bi}9TmJj`}B1eMP}a1Tp?_NCT3!5UaT+(yobeDbYq!Zn#utcd$w#Xq0Z$i3Nec|`x;-t%|S6gi!U_w zomcgntvo*+i-g!pmTQtBrk*1qYLslJ;m6Af8?n7i%1%QPhn%2AU`jxbP#N*25w}U5y$e?XBG-II&y#Lr5@Z7|K|?wj{X=uE?-CC? z1;9@~Puy}1A(Ia1KIpDYe8kTCq`0w`10RwBcneFc#>5Jol}A_b&{xU4aS40mp>`J4 z$n%ZSkX;{5vb=LHm8!YO?8WiJ!AToCGCYa>Q^dj?WPA1GcU*N^nb`ES2JWbWyShoU zd1SS8MG9A=XoG45dc(Lg3GI~e4Tta5MoyQ6yK>D=Q8&=?;oVzSY5CePKFyZxK4If7 z`Iy{lv|ei`mwed6qbr?u|HOn=w8QY!wAWd!7Rw}x_C@fznuOYYG>|BX&{|`W2`7zW zFbtIBbI@Dg*p0~YWWd4)tz!0r4O z>-L}c|8aIH_&w{uaVVhOgCbD97k<1mYclm^;Iwd^0a7shF)N;rSCC@a7vsxy-jL4S zZSkEEEzP?Dh;Vy^O==pwV^M$2Uf;RN>WdW;q0d@o>`v~Ctqz;p?VW19thR+dtX#@H zDlYq=Z$#D-^nwzAU6a;3HB}O*?U#XP7iegu^Nf^|CXK(P6k|o*90bAARiEak_w$l4 z=vuQbzBZX4cOgmbRhMMiwm_wQtZEis$z&!D>Q}i0`Sjk*(=Xfq@4&vlgOkrm5Bbgw zi(@GKr0qX%{O?zXJlM-XE>z$Dc;{mmb{FpKpD=r)+KxX(`K)Knh27gW%25)ha@i5U zF&-8gA6525;8uSeCy?c(o=>q&FF%zxdXMH1vW~2MO?A!Q0E)=Hx(}k5Xe6rya{MgY ztyTgU9-In(@SVoVP*+$!mQ8FrKbHqOoCGqyE$MGl{aggVj4FnReY2%bKaf_Pj^9*d zgWxhjVtzjL{(Mbmx6-_i&)T0Zyn7c(uG2=2t2~GpteKzN?SD=@e>HT;ou>E~d=s2{ z{re=4S7R*x{?UMmeu{%WjTWe^;TYGtg+276$(anBKD}I)munci^V5ZkTeYwUl&xSn z*voD{H|^cOq*{jb1t`Wb{3`PL(=Cmu*S&lMwZ|XeqN=RCygUIP3BS$^>b{OiU2X9VPBQ1>dZZ zwVeKVgQyK5F*u(jb{{WX%-ab+jnorgXo6CT3`~Uqn~viG4<&9wlBn+gUQPQkD;@2R z>Xv5_xv4k$Wb@&l#JvzRCglS;2qK5b~Jth{-6dnV|4ssCjK%5<26{N<|( z`#6@V=#6lF0Qi9LHRF<0ci{K0dT^kAc;I^%6x8iNX#t7gIiV2WAL=Lcg~ zMH7&tU%|v{xl-Fo|H@X6Sj7@c@8JY{jE72}>`=0(BWU`)B~(5`hD+FoT&Yt! zQL|T;)tv3Kc7MB0XGsa=h&}61;{+^yEU}60e9J2jb&wI9Ki~V0+W!oS+)xH?I6oKQ zz=L^-TND^C`8R%}zk$i6yEYROnJwB6R8HOwNN%DI*&DtKqdWq376})fxpdcA86U-W zGXmoUdY~nJ&;Fo1Yn5ZqdXzm#`pogKl+*Y?|b7;^TI2r-}9{JZk5PiFt28h?vE zFE+uC^R<&@@|g$_zbUm$xirb`)1E*aBM19I<-Ri*5I+ikldZAULgGk^Lo-_LF}SMd z@+^7LdyjZ9*xBa0{yMSO=A*IRjzIT~ra}Jh&ny0Id7ce6Vqu*>ihE>McaF;{+~b>z zpsUv|eGz3qy*FCd)?c;c?l^KhYyoKlu#X^jYo`z72m45nRuzrYM7iW+a)^c7#MgnIfNZ9Osqu`853552_9zjhuL7Jp)uWP#T{eTfAl72(QXu#Mib+j;qUEp8b8fQ{cc!hyU@ zSQIvy7F8d1#WV>Kq;zK^Lc}0zBpyo=y?FoawWp!b}=?FWN z3VhJuRg@=^BoM5pIyUSCe}siV%wVtLFaU~C1 zB)Tk6VuZ-M?`*YQOxBGr>e@x7P{@5k3SZ0mXVfF}4l=jt;g7pOhGg#IJUt;C>sn4^M4alDxU9$gV7rBiR+>sQ0wS|o47g)#J|fkkS9s!vyL#{` zp=-=p+erDjlszzmx=ZsJNbPw@sHK6`d4lk3$`4O4)_6EwR>&Od|vIbkzD zhiRPrekmwiCGhh5`qQZ6Yr4oQTQl}KHJ@!knoHXA$S=H$&KxCh6~3+OICRE@gE&!5 zXh)+ilz9iA^jseD#9i(TZaxT&f>IpkwQ=T!NcgqJ=y#{eF9fY^`DnnrfgL9pi0F&T zFG=Ixz;*)Ndj<#xvaWq{3fd{Xvm@85sbvuxkj{YRm)2f**sq$C3NI*o_3`dwd(T#S zws~`zEBC9Ir<3$wA{PY82|<|Yg=5IqHf&)O6&BMx-eVW62vLV*_N{&ve3|A39e+d| zzwrBd3^;y0agVAmP*GgaTMF2m^1Tn(RC@ZsKUZ;9v)0-p5*=6maYtj?UtXViR%4e= zjBDxT;daR4b}T4UPsnBN^U+NUh)K~AmP=mgs}9xPVt<~J))^eJ;s9YiaI<;-4roe|G;+z^|0|&B z;Dw;x+HRq?7RpUn)V*LY4)~!5HLtjty0)bfnGbmq69~s8KZ1kv(a=OLr2IabkTFo1 z0V5w-dk&iRoxuDJie^xQ@i|x46eoE_h?Sr!<;H1JtP7VC+vctA*@s3eI=o9FEraDO z@-%1M&tGH{BLQ^@_BByYS)~syp4&{FQZQjGx&-frZDpO7FhMLnlPR?8WO~BF+snN# zEy3s?Ier26?X4od;QK;>so2f~<1cPSdEvj%Uyt*mQlJdAtA!Ip;G(N#fRjZ|LTXLm zev1~N4;d-QPOc;UD#P-qdU`+GP_*;#D(p-qg9ZW(NH|@nw;91g&EZVJjukOuYGSL3 z`-^z{EL%(&?ZNAi^2F%)?pMB&U24b=D#lX~DlT}Oe83|a#%=dJ|AI-@bHOU(8$FvE zOdD{qiFgfJvl=cdBMFY(Tpsq0kQ_4e5F000AYr7(x~hy?}K69tNAr^e6Ovu zf38);j2H5_qe*^9m7(-w=2Kt`2T<>z64|N>)3f&V8AEtiR}9_;rS_e--+@By_UP;9 zxb8=FPnKqB6^pUCOOBxZ{^$A*H?O3iN9$Lqz%3qs9!fqoHj@6KFk`{pz23~!<>Kg> zAQolJ2(0p$XT7puFLm}@PV^#uYQ&j=mF3yNIQMG{@8Fw+#gOa60s5)A1{4Q0A~8@?@w@OH={Y!gpF z$isEtPy4}+HP7ufKNVKrU|`0xuQnwOu1~Eo(#$=cmw&I0$o&$?JN5J~ik!ZMQxfO1 z#=LyB6k7P>abo!WvbZKy+p`FcMLnQvp`S=8MxU+pWkyf&e6X>n&&E;2)Y&b+{5ID= z=SSn3rLRf~AKYkgZHPtbv&?TCMO8+0!pR*=Emh?Yg`uuYZ`b{uU;FNQ{c8?xjTEH% z$?fgn%ketRHl6;jO{k*dn(A^e-waV*eJ`@%$-D8h9C2+ywl5P^DZV2lN)@R%LzIR* zWr7)9R9*Iq$d!yaM`q^8QH`{bQA>;KmFj0VB;_)1`n#I>{-oo^-FWgnX(9dB54E+*MbnMShGcx1|3Mi$LiJZiej z_WB?K7dKi>?&I~4tm1$4osmjbc|t4rk@8Lle)nFMj;^vYuTVUk=mK<-I)E{auxMhz zrLRPYQY?Fjb;68n9CVkNOu=F{W9)PAwoCtd-akV;L5&C_d3=l-J4%HhElt=Qj-~+A zei64W40Tq!mALvj?bBe0e{lSZY_8RkpFeA?uFt{JvwuL5DisqzD&*0YTpV=y#CTp^ z#k;B%27bALk|a>W^GEN`4{~^TQq6$%eWei@5@t&?;w%u@hfC}|^=Kjak~aw^jH&-=^QCva?}a2xe3yX#_aS80>?sIO z`ineTCNOF9je)KI9t&ZDmhG+S0I^00?QrJX3RqRefc4d_4Wo&sXtmmD$CbqgLXT55w%>Jo629V}&eV|6%kAQ}+b(>1k|b@bgNRvz-7mxteHYudps9j&&p$r?+8Kex z`T|36U(Y%y!5FUN2dTz;|7T(tT+OjxfP~167i-R)!F;tBG<(a6@-){`fu!D1N0-1YMV7f6m{?H|x;MibB}ECop29Qz1<) zSFtE9v5xx5fO6{%1eRpOrR-9ok<`JTU5|feuu&bP7)5;P73#wLK`h!s@92%8!xOl) z#F&^atWZ?kcY=1%&CSw6;l3O&IBE06Qc2neqwVeBl7iGY=$Wa>Uo>6;4b+b5t4THs z3D_Qv>hQZJK~Vdl=h?9K`~L9VDfOL2Qo99(t0G8wu2cA{pMhfU(iY!>e$|0zr_$wf z{%Vgm3>bC1K8nc6-LcZ+zwqWC)FC+9s6ND%mF|k4L@`h6UwY@&W3cPKK)Chdj((Uc zHJP}@`w2#g^dXHnGACCj~ykhNfh<60L3q;}+eaiF~T6AIx*>We?3%)eu zggW-*pDx7r!|W~2g9+8s!3sR94lr2<#XD6Yt_2Jb5MQ7Q`LEMcHGe%Fyg))$vfpQ2 z)y^%W$FR64x;ts^1jRE5ktz@#wpx$L%9Jh`s#B2%aSA6yn#=6Om_r*6J$IIv`|dg= zeoC@+jHyZ;C6=p~O%T>dHCei}s|Kr=A6a6R=cQOEV5M6icom98QIUoKr}d^e6Zca0 zyA{3cPosz55z2k8Xgsw4gF2yd^bG;rOiM+ic8GWQ!y2tb0Hc2S1UHdyHw%W0<+nYk z-tBXTg^DMZ)d-AoXv)=|W|)U&zlMnlA`?lJ!1{8gE|%Jub~JU)!V&EIw!pl1znjfs@#eKBR8qzN92 z+WjquT*785Lu43CEyL1Two9gR73y&gG!GBoUlru`j=ZayLwD0Yc_?nRw9K85KXw(D ztO5*CpvZ<+5UJJ|(A^+L_xxIpq%y-Z_G=j9w@Zn>y#<&YSAGuR$k{M5#>+XfNJDW% zSycD6j{v$29QhW?u~+S218_oCrJgaR`H$t_^5t2`v;i$lva?4ADNxqXMAXHkRG8#X z3bcR`pipPn>=!`O_fTV(W53nZ?%Lhxk|oOMOB*xI-kP42V(gib{AX7$Odp?$Rm1 zR;n4Z_@wQBf7NWxM4eR&p$I?Jm@5?+i#olT{WZV}e9~__-hu#!lswu{Pjm~zlQ5L z7EQL!usJUlVKrqgGg;UPLwpJpAF25n{V1be>9j;_>1-C#*x*d>3z6}w%=zV3L{!gX z0w!TZ)_SbJvPk}u^qr8!=lD3~5+>P94k?h(XqIJ-LWPviC}OE6Q_eA*glcIZw+^+` z_r_q6Tb@|)$*NAQOLz(Nn8$m0{Q;bPt!l!S;xR9$&Ayopm4H}3fsimuog&9bvlP@N zImQ(DyW0>LD89oiO}SxmK@6FX?Y>?q8o%ZC?Qxy3NsSprxeMo~-f=-ED!Asuu3!tA zOpEd@nU@Wh#p=~Nh~nb z`?Ie@K7UHmv>;_ciy;*0Z%}>GMY+&efSL404xL^Zg`@~#* zx!n33xG2lqngbCr%&V#G+6Ax)h(+^ zuon$7pQ)4Do#N?_9St3YxxGE73i}h$AejWO9fkphKxzMqM>Uy)P!~dsigLS}0eN%~ z@~Ru2`#SBBIo6hPwBWwg+(Jb9{Y86%FFAo7{68GAd&DASNyZ9s7W29U9N3(eu@NucD%tAkc{K7D6nX)v!p;Z$jz@I<6t3^KVWI(7C5z(j0_A?>6;)QC#*I->H|KLfsrG}v6i@>GfE%?T? z=@6LL=ziAE+xn!$4)9Zr-aPP4aw{!|HfyE2WIL$u)bRa`gt7S+XtTZ%vJfSG=;n`v z)~Vj2wYLqWp|MZ$KP#JQd|F3iLnSZU#P8Zzx9gs=L5puxo-)ar{ay(zSk zSYF8~3Xg**CNwGc@PpoXzwimYFDg^y6|27Q0goi~x~cE1;27w^h#5HPh&>Q*tVOk0F2dkGJh-zq;_+61oN`*YN{69<~b)se7drs7G^LUtSd zYHgw(BSvYWXbv$p2u^6ibT`iUN$}2TWB>P2@DDcdwz8{N%ykVK+E#l0%%72aw07qW zu?*^Z^z+gVrQ-0ckcgB8x#3;JlnM3*E$JXzPu+xV#q#NYht*XFEv18?`vFb*U8HXnfRQPm~W#W z&e-K=#Jx=CpJMuhWZQ-FZwu1MuK&n4+{;q?34%iL-JBWG3jyrb{Mujp7n^^1XmBv- zER*A#J-&L&{Nr25mC`}y_J&wWSDr+lQ7s{-xswp9+d!Mvt3k_Y**_dFWcabAG5gM1 z#rD9x;y34O+X{;QX5t5reM~#M?4LYSU-sxt^3@lv)sC!!HqPrzh`ZD79EV++@XZx! zh8*R(nzGB=?u3~)L;>9llc$BZ#+F9na4Ip(bvN{)1fcc;;k|RnD6qyEeHu03x1C3I zB>hCoM3pved{b&n&X>h79cxT ziDtX28lWq|42FtjlKf$(S0wU@K_iflhiS)QkvT)+`E5Qesz0rV8t1Qj(y>UbZ$M+S zyb5D+^t--8!mD!3x7wnF$e@Jv!QsJt0P{;I)CsEssg{_`jqm3hCP8y14yf>QH4j0- z&|;<7RiGV0&j))EJ%gHb4KvDq$t$AL2#WZ%i&f*-jrF%bq(%?3JZ?|l+moY83C*e_ zd7iGjX~Ggy%;McMZsoBk5THW+;#H^WsATeDFt#3kqVzpHiAbpKb*c!V!`KF#a~O$F z#g=>&vg#U7-i?Gx<_IAk@`)*fA7^@KM_1Pi=n!QYOBp5uJXIjXsgw1nsaxb1@rftt zs9%1cJmD)jhYuHcE-`)-e8WIoYdrM4m`h_ZOb>CHgo*bWB8zlToWjub)>V#JRh1tz z-yA=xbd&3e%_Od^Dt9XRG5Vdcmeq1-$weUZ90d3(J+FX5Qt|k7{UvG4qef!~YKmNj zVwg!baExO&^uUC;VDMRLcVHdH25{4_%grA&cDg@TI+j7xT_VCxz^%iEL`l1*M zncbU&_j3zmZ?aToA>fDZ9vSHflE;oxE*(~26VhGRM$0a|A&`RefRDAnrWc_$|t)FY5 zC`P`3UmcL0HhRg_HdAT2IbHh1f;b|5BvVm1+0xnziTB_hnRu;e{d$J9!mKJLP|^BK z^Hl$ou6X1(5T|&SE4`vuzXJtW@*2$fgg(yLG#rG0j#};IH17fl18+8VyoFVXBHWp~HO^(oKg5yHK=_&QI?LT3V@o zM&9Akv+PLuPwfLF%O(?Fl%hVnVa(weZl~TZX83H$M4-@4=y4*4;mdY%i#*?=2pSMA z%gTK1WrF1=BPA(9r$&fk*2Rs~+IzU`N2FeS>6F4I2i2pOZ_w&fBoygezmT? z3xV3pOX}a$$UTputF}hg3;r3_;#bbbiM*{jArMSeXrslNcY{$lX8FafncS}k_~H>vP{o~NcYa>uSGM&uo2j!Zc2q?yd*N7Lm_Mmx zK&AL$=Q_E{^SEzalrM9|yt}{be=xqRvA+rHML8b3v;x|HYd{dP;==ykL@EQtH46qF zpVO2eoLsC&YDYbRPxAR;v?M&0P!2ZdLztccnfs!q8sx~WR?hE-3XxRr#Y~p=ZGqmPcXY!iK5P2 zI?xUMJ+*k$EyT3$%A4%Y0i!1PEQeZ|uH7xj&u{UjZ5Jbp4w_aCOkmiJ7F@j6((qUK znz5_EcBq_rgDcr8-4=t3^M&$4A-I55W(DYQrKzQ1lRreAD=U7f!Wl)fv~DzpSs0F$ zk8olt-SocM*?M-G7haOeoJ5T@i;88t*mBOMQscY0F^K*fD%y$6^9~)E@vD z3AKmP3y!Op(C5#i)j>l2jFp4Ow!&xBdjylCpw(*gzG>Q57Z>E+Y>}4b zQcpaPJq5<)0WELe1nclnSGB~m4Dczf4%w_J+&kmbEI9RL_QaZ_m-9}hx=`I9L<*rMkiUYn;vw29 z@V2(VTF}?im4(9u9$GMel3JxNaCvj)p*E=1J;ezBskcA6^jLI7uic|dZ;kuk=(fxE zzsqwD5X$kY-zEs66h9pIzC}g4ir3xDr`i|LE!;AmI3aWbADr}ly}20>dsH|*GPMDx z*HT6KJ@8$+P(IyF)AMUjCf10+CFKnZUo{njBd@h6Seeiip?Gi4`F}`bWH!aF_7=1& z_N}DpVk;Xd&2reF#F)l6h^o)791@WvWY!6RXxc6`N*_U0dq-<|=W)rRa71FaeEW!rFjP6yt6sXs z?S7p`nGakPo)|a;R4ybbi76(~v`mTNEXH#TQr{RJd=)8TpiwZO5-Jf>F0dN~Ei5P^ zEWE?kQp1(!%^0CL9&-F3F?Ymjk|5ZOWZ5E_B@-OX!}5*Hta}OpBgxH#)7qSd{$cYxHD4maHkJCCrY*VP7jD19$;AP78f6w z-pzIpMVE>@J6P0q*CHUVDmE}V8eK$3e;$DGL?XcgcS;pf4>Aai$M#=E^n>1R&4bdt zJ0|KMxHgCA`;Sv&_86X1--ggHRmol1*0(8>?$=b_+?!JDTt~uB@J1fyCr2ibrbXpF%kNme$<0sSGhqYVvTW3h~awVeCi%!D;+T__(`SHm) zVCDB1VCF!BpLsPcE4J15IFI|VtMN3KcPhZSIs9X~W6y(a(n`(E&i@PF9RD0HHPBikGQYs--XbZ<$OzGO55&O!xZQB$U4_B5%$a2@;ru;yk z>!`K)oKmJVZY|YAmf|7`g9ZHGNDZ#Mnu4AzS1e8M(cwGpH zE-Hu$a(#G!OBuLFtwKmvzPb$w1}zr2rA8HQY?;Y6L{L*yOajd& zrL&5r0hVzsp|K6#241mrws3b*AM8ABo&GFC5zfJ*1;DVBY^kuWxc&q!R{E=d!p*uAy6&P2V)$`-3vx{UMVUJbU0X-~Qv7%7lH0 zUuGtt#yW`;StGtppl1;C95b55XJD!reygK%@$u`wJdl-hsSqOme|q6vp)Ud$qqdYQ}Ohz0B$Zx8DrkmqpBF!H|y_7DGHd(+Mb*|znM?amBCfduHYu#?-z*yl~*@hBT~IRnT?n4M2w+B(bb+RW=Egdt0*N$dN7rq-^H) zS+$N$+qnr)@AVm5dd>J%deODCdGv9zmwx$Y@gxK!h`hz!9%v=~J$&*HRK?n9g$xrz z`6y+GAmClEGm1+-iC^GSkD>P$aon#fZgVk6i`=>~HI6-nPTL?eQ~+74E- z&wZoMtX}8&V91<2Aj)fmBB0s^%PQQYxCf?WPw(C+QEt{OnaEMXpQeWItb!t%a%x3q z*$!_VvGb+~=Y3tyU|gp!Yty4-$s=>?&?v_Jd^gRy`2e#ySwsE?AJ=UtPid)!8L;=> zgydY5$d#$WDI{DpIZeIBJIo+Fu5Msy8~2+$xdabIln@8ayP48#tCVRj18d*ieq`Cg z`*NF))X`X)1YBYLGLJ$+5~J-p6$q8ZCzHn~#F;I!5;Ldib=sh}v4?GGviX%#X1vz}l~Bg& z)B8_49t{jaOIqbFI!B|Ij4gtnr+1%Z`uIw1l=ZzkfgFT<3(JcS-yA+qQXBn7K%(-O z6`B6|sE_8VL8*+n=X3UPT-Xrb=c!eOUHnJLFvTA<*>I<_o{MDx28lCgf{z0zhQ@dd zY3?Ag=7dsxDNWTHid6s+;t3TZX*Vq1fT}}z?YQn0x|=C{GNptQs=CGj80U$>iWN@| zG&9K*qHGTJ!~GhOnv3y^#i&l`VeQNnJWUI%{!-1+b?TP>@*Vu$>H)2EA_4E(7CJuV zxucGR4%=_|`H%K#)@`Q$MfMf_PhN)SSkzxa4g4~11m zFng1uQ9$E*9WNs8I}M?vv2MFT*gR^>H@}zNqO;;@Fw8Rg-tLIaTiAbYy^{MODV5S@4K4Dw&Uvy8mHeSev#N>y&3FsvH@@lWzl9d4y<;WO zCI1N4<&&|pN3d!Jhwkc=z59*V_Mp33kr5kV;3#HDA!A{N;(=G>pUbBAQryW3_x=}l zuw|k}>8Rpm0~SR8`usqU0o=QQ+F>dmCANyit~@j~WS}U);2Lxdk(V@o7lVBtHY|Ek z#01kNVkG@Tsfi1@i}M|{7P(uZ63~6U3t*WS8_p0fbaKjMlc^4!9^oE9!S0{5!4l6n zpYRTTw6QyOeH}2>M?sCH!NmIgx1x|j>?8$-)=^$Qbz#wT994Yr55!nYi*g!Eq=x3v z9ZwTEiV*sgg4i-OlvK>$zBEas9b581|Wumb?G-?fp>M5k+vz&CWlF%j4 zM03gStX<--sTi24219%0jF+-$5}ZZimO{*ft4C8{@J=X6sQIvn;)h5;bY%>2EV`;< z{G`P|D24Vm$yGRQca~(VpH`DXy%Vunop4k#rLck2gHAE4nttd<->X!BxJ_@6!X6l9 zzgmc!UkYO&QZ$DVYL@n~B3}Ln=i>YydwRo6iSMV=Vz~o?tiFlKw@nIZ_gxZ3cOl1t zr(HBqbMZ-yLi4KLKN6cav1bHwTjQ3}^XKU{DnaFseWzE0si(Yeac`{0fU=f}Oy_s& z1fu2dLd)5S>yI_N8>T0MGQqEhE!oykdk!7vv7qC!{UUpQqxMIGfXL3fAzy>Ee`yL3 znBfTi3)7;H%UMEDZOE4g(_{yR8V?~7>n82-yD|b~zcLFVIrAK0tFGv)*>}b(G>Z6u zwo%=gPyEB?DnEzyPaixC(CX|v&dO-!UXZD8_ISm6;xPMQUuTo>U1kmtSuW^@GM&^Pp+wSyby>f)5in^T1 zLT-O~tbN2UPf?ynEx~xl8oIuWJfGh-j@(k?L-|LL+*Me=S)ks7(m@$ck1SwOX4Q1% zMrO|}4^%mTNbL?qBT0bW!CZ;KKNd)d4Ks!9xOB^3IKRCp2g9LI%D{~kUW9^oV*Lc~ zzxmW@BdoHt90mZmPEw-tWq@P}uqhA^50TkrOE5evN)=wof(Z~&hu+yB0E)U`2zTjx zRAD13Ve_4|Xkr;7L;cJHi=Tp7>G%JiNjpx|}B3B0$rGVPeenUb2W8%1~NU)yUMWYpoE4 zdn&b8_96_Unx|_Q9@e&RPUturj}U5QD1LSB&u_2(d<=SRD&=tM+m`ojGNX-L4q_Ha z6$7I1xP2xWIfMTGuq6HQHJ?$k7n9DWZLbR-QgmaN)58l2a2CuM>TYAku-c_yk$^HU z=3UN6{ylFrU(h|5&y{pnoN_VA!B^0d{EvadmEx%8iIu6$#6%(yDPrc!MsRrD{(Jd_ z`y#I!L5clOM+XmU_(6%}ZxQ{lN%?}x$tYa0%CEK6EaZ%}(vjaoL~h7m8LELCXxSi~ zB8oD{)&qG4a;PQVu}=Ft6viVt#85j?DU>r=S_A%aPrn5zrB^(z3MuT^o?SJLje0j5 zofKlXSPI%dZ&nXv}UrIpu#(bLJK>)Fz_UXyx||l(;l({g|3{gFCz^c zdN<$djyN)aU~Hmc7KvEp1&%$#kGpM=#d9Q{niCbxQzYvuw6oBRQ{vyKh($JC8PL6x*!3r$%$OwC8JogQFYmL(PQorRLb-8eqfK?-M=g*Uc26KK7uqQFwa4RsG+LgR?{ zuL_Fm-5B-r`V}mEbyi(FiOlgQnYXv))mZXydz68~i+b}p+j%T*mG!3t$ABu!J@M3> zy=yoz5IO@B(+v4b%A+KXbTpN2t2>`zQi@ERrg7WZyh(bqO3pNIDk?*>b-Gow-q7`0(A&1kCF%3xQi;4L3DI2fM%<5hx=GC%gf#<9U$u+5S(y9@X~rWS4sc=kta{t4*MM!3j&dv$)M zN2Q!;&oLPIXt0cxQNW==#`{NJiWAJzo%?P0qFmb&)s1aCH;PG>O#7B??!8 zO2O%ZQJSoAH(2N1NO;0|`}9of7vZMtZL;X1#cvE~4(%t;vY^z$GNUu3d5$Bsi&bEs zH~uO$sCZ|T43Zp=f9Rg6ayjup1Suo2&^<+Km0Z)B{_Gi&Iqbt#x7Xk8IMZmcyht4$ zu5}Z02ykE393P-;FAz$z|6Mf+#m<|KNvNON56*LKnN2|u zAdvf({ns>%_BC&k3OJjaS$R7Mz&)Z4t#KE=1)75}$X z*W;^y6np8A&A?9mEo@bMq*sl`e+GbF8ccj z#VLGR7z#ob?cN_<)JvpO2q{268xM(u(QO|M(9e!B{aM(l**@@2dZjy^Hg}+cfBc|& zT{N{2Jel?J?KsC|q2sb()EC82eB~l+b!;SgnF%KSiXf;vs80n8PbeAz3@Henhmrs~ zWaxSbb#we#{?3DiX3-jIs`g<=jL&M(*YBY}Ifn(gI%I=YygzhLR%R4aq_os_z7h_| zh6GGb+}c5VyD`4!q3}}^gw|u3dpAUCp=d;BxXg^eG*2ce6ZsA8S>|xd+nIvomzn=L zrNEPdDuHFGh8PSIET!u9mW4#dpIoH(slIw{i)E-iYU%#YfM{gdwB6Q}Bg>ZI(mPH< z#)$L9#$fYUHrZPg%-LYcs|MkxA6b+LxSZvD#bezyUWl?#*70c1+yRFGM1#}a-Bz+{ zb(yS;$Ax=6Tv>?>8A9ApD6m}*6FC=%>X=}-IAQ}c{}&xc2FIDXx)>>(a87!m-}5AP z+^`TKy}jkqO&0Jc0|H6Igb*|-P-Y->V8ABPd%c9@OOr{^jo^^i7aeaMUZZcn|DYKQ zzDoTPGHNUdNfa8t#7{%3=uL?EGld?PTCE_Fu%c(ZH`4(&2?zESmY;$c88B- z);8SVL>Yfk({V=}L<ZMV$0_m9JpuubgnbZ(46(>o)xiNB(lO zu^l#BAGG&wwod$ie9Ql`wpEMqX;=JxPsqraWOl7%dBNJhgBC!(iMqe_atB%+VLr83 zMc~Np*Y9bh5FqX~tjfk}k}H&uwb==i)UzWfuv=1)DS$OhrQEhui`rPyiAC~A`U#fC zv|tus`Tc##7Xs|q3Xw?Fkrp!-1)}3XoC{d8Gz=K2e|*0RU)}FzV21myO-pe)bsZvsol!aungP znMXS)wT}{!xU%GgWauo926ECXWsACGSBv)0L$WeK^kAGWGH4c0zYY}tYudAyNg4Gx zO*JGwK#Ucqvg0Qx^e>Ed$$rXm3COHHR?6m5k^UBvNtOFjK9vOYxSDw)!=*BEi{&|> z#Nd5>N~tTt>tNC|(_isdXy>#!lvEgcDJInai?O#1iUaDFMR9iv?(QzZgS&fh7~I|6 z-63cQ?(XhRf;$8mg1g(De0uJy_v*Yq^N)cl)?T|;cdy>flCmyld$X_XpFh~PbuSD+ z83#^03U%fp1O!&RXG3Y47ip>y}C_G7~-bK$J!af)Hl&k5RcW+BV zS$BU%&t5XyU5c}Q#R4cL@yXC&2ogg%_xge;#Eql^>m?qsLkCF+1>~V1C>ZhdTFgV( zlI_6VFIh)K#(u+U2ltT*aO_$ke!)N;giDm1vpnxQ|KZ@F<)#5#og}$8@Hz8i?_{W? zZ|tnNFd))T^O_N|sqVg~P|CZj{ji=qQfdA<)ugSRl2eFc&EkpZF4^qme3Kim_DXh zQK{INGM*bjE)~jE&MEJ3yQkK2aWAs^ccAlxpMg0NMPr#SNRXKHWkU7r8$++XG{%YD z*u`PFKG@g+G%GDQC0a{y`m;rIK?+%I^{4R6FfN_{3Aw|Cg1HN}l1tCIq8u z@%Ifq3Ry$o1~3hOdEqc>EiS3AKBtV+SY9raIv&tXJ<-ESS@JQ(yBZL3ACy1$LZ)Xg zOC|Y!SwWdaU97ea-ZsqSf8LnCH%%h=yHw~3pX5FKfec@lw8f1|lb$-zlROkJRwc3_ zP=}P6-6Fy}6cbQ<-fHG&l>>kp8P35ac6^wZ3Z=jmg31Zpzd(>aR}GBt$QXmzC%s%! zBEF&!e%;&X@awD2Kz&;IxXJKh=o$Bck(d zkdl5*_p*}+&oP}a1_=Ei!~rfZFociTPp_#5JT+*bSGdft+DQ3rmkA=KIWz-VkN71j z6Lg=?d{ioFa&NHZ@8)|`KZm66=cBeyPWna~R)4@Z9uQ02yu98G=aV{(Oig4mrE|QW zqJCHrGhSRh`Q!%|{P|u-CfKZCK*G$g!YT0Q1lcv0L;XQ3qnf*rr1CI zlB&D5kW*~*&k|o*l0;l}(vF?Ri18i^Y}6H)2`*xH1Z6=#S_@5dKCyD#%OHu+#11C+ z3ccfPrRI~B4LW{lpYzV`@<~GdPJh}s`{@ZZAC+vj<;6Ggj~>6sG5F$`hY0l$4gCD) z$p9UZ18X_h1A!iW*n_WAKn-bmTkFOU=b74%!o5|HzuLh=BRPEiWd4Wl*u+iJ{^-Q7 z3P0~1<~1Qmlm+<(|0bBrD##0IZ!`mxRg#hL5z_#Cz4cTeU(<>Hoqvkg*OSW=vpEy4 zcQwOmmddli2{xUpvtI={cP>qL4sTtbeW>N}+}(Q(Sejw=f8BK~&K@)Q*XWM`U=MN( zKO{y$e@M&0sJ)$#j53O=kzxk6ilibgUY3RcxBm|_Ul{c$qt2iP3^owTtFx=vK7FhX zt6$S@;K3;i<`7xtod#boB@TKeG9httZ8WmS!FO3 zsY3b1wvH?zbkq(Zyfv&kqJ*9w z5!8SSs|*0WvTPerUvj6dMZTGOqa*ZTHzHz|FX#_+sm0J}pA^)l&q26(3-SmU z&bTJ(eG)eFB+eXkcuUwGzn)ejzAi9$m&R?w?oBnisWiD%8KIw8`f-0^6)hLv8PC`@ z>hf&fH7s`T6_quk;nhn}b&Px3H80lzFE zY3&E?{jXptt&sSjGm^)Ebco{o_xAYLHIk5lGU4Uhi2{l$nXXLCTv_-ZRXVeMUO|cM z(Fj}per58uGWcd0U(-rw#Ci2T)aIYZkaBWz81e3kZ6!*UOlb9{5irtK;gK7FX{d#t zLo_Niy119FJC6TpYP+JiNvrz72OrUf=B~dSH~|#TmnRcDd0r6ZOK@o2oSg$*T|Yo4 zHAhbi^zjRbAL3j9>C#b^)JH6$xa^Ic(!nVk7DFF54%r8q9}ywW@n8o?AI4{LIXI>Z@iDtST@+DsZcLp{x}eOydZ@h((p z^TP?QR76AxBS%CWo_;DL=n-u%&*hA4 zhoNA^3Uv_LhrAX0FyZDt9Sju(kN=a@aw7y5d=XtgeynZO5i*@-g7s7SD5^Gs2&F89 zm_%F|3LNAF`3Ldj=PPt2bk-Fk2s5ez_5IW&XjIQ!HDY#@ha{(&KJXFARQFb$X04&) zSQiEzI{FGYU0vg-f+}plG6s1sK0Pi{=D<#)~ZC9l2!m;gYdY%of-qHO!um69_ULXJeH+GU*2Rt{m zcbJ3}F|Fit9a?y(9@XOR*#wTK3U^+~614|HVw*mx6k*2e!jNw~p2=;Aa_XkB!n%|8s$f z2)mbhz3lZ|wd|t^l&PZzNy?1c>-7Zfg2y>C!eM zi*u{N6w18M9gA9ql>PWEV}<8?S{L=zobUtjf*VMgyvCVQv^elGE1d)Q9QXLzu67lI zft2nrKdM425whvaHLEtIWg7(ZE+YD4#=_(NJQ6&NSphrN3n@f4-n!R zl|Xu2klX;XA3Tq`SpA=a|K zr##a~XfQ^3nYT;oEvhzGE;rYMq9GP!0|aN+H7+`%HJ{aHE4+;tRkm$5RQ0_Xx{1qs z2^D|4aPefE1=5*Nynr#{UYU4d$3_U^t(cQ zj`VB>Jb>582T|g|9UOao$s^r%a%mAfP2dPFPm1_#UE{9pACtr1-ana=x(V{F`tI&{ zQw=Q>o`7sfFHTud>za2CY%Lkl0e{=^hveC3keuwFW1(0r)UNF}!M5nJxpZ=n>CFAJ z_ZRMk`_%Gk7yZeds?Ses{aU@Zs;%A6?XlCKcHa9Q6MtB*E5HI>b&>?_6RD-?(Na_^Oc%-7(2D5HqI4Nx8=+K!b+2fq=~O>i^p?$EF?03G zPfAiOrp-gBb5EPPr3G1Xmijl(6&3fzK_VX)?@dyt4>`$P0fqRAf}E>|2fSR8YXU<^ z2pJQNc!PuT32ApWDBN6+x4xmet>Px+G^9dT?6ZXieGewW4TOjvq#NBEV`W_NLAUQ| z2=o#msc2MO$|S4KiQ)^#=Jki43ckL)gPsgybA5jqa7`#$}nZLDVuld#NF-!$T%rzpR z3auf|pz7wd&|`8nZNDTtD)TL|<+HE!D+9zC_qNkHWJge8aMNAV8I>V8WCF=Z+Pu$~ zZ*az5$!9DMSczDu4=%B@o0pgY!bAh;lTNKnkH_pa>49mrja=Nhcfq0t8x$W$DGT7F zx)eCH2W%&HJDPVd9*ECqdKnu{|7csVjL# z`0|nbbl9irNfv|=8WWxc=Si&FX?~;+^1^<>mp13;_DY2W-&Q&H+F6dri_h|Pjr@L- z=ViqS3H6l6puup+MKCc|VmS*>EBeqjt$^a0MHUZ*5|v|?pCQqCwh3c~34s`IXPohF zuf<$COX2Kiwk~9N@SZ=~dcvFj-y49LnJD$<(VZyOg)Li)jIF*Lgnt~jTmD(SaewDo z&DRzA3{6|+I~Rnk*ClMfvwZyQ;LoB)XY}Dj^K5h)RF51xbXa4C)z4tsT-7CS5_>E0 zYd?J*!ArQ9yB!LCnu=p4{uKFCc@?UFbNXuT1||djh6FmDwhq?{xKdP z-)~8^tQY?K;8=hzhRKA@HQ#RqgnvMm4W+ftYD5`YstRj2cg%yYoYkw(Fm&9@+R2+& zga$C9sylb$X@wU07P<~4JcPRXbPQ*DNfjAtCGi@0@oSLfHJ5p=r)At z;;AZ1Xp%q)rITKWy*7EC6Z$f7BsdK{hvfvr3q}rAe??(c%Npkugr=~vV?3J+;=7>R zva#B8F@O}cU6J;s>DfCe)fXX1TkZuBu2wn?A4s63In!C%_#6^!M$^l0u-BB{heo7X z_{lvr1Mepk;SYwq5T|eqzIar`)}QhYb+cz(YEy|2B`Fgv{l*v$t7GtnqrGGGTVlAp z``j$oLiY#ME-;FB;1sB68sw9Jp|$Sfa}PmoE?$ezF~~EE13!paDqpk+tRgtLwPZwF z!BI-DO>|3QoJ$0^eq-o2eElPI^y`z|@0QB{He#;7jhOkK)Ke{cS(vN`s10hp>j{&T zD=ifPG4XU%%;~`1ml(eSvspJ?P$dPfe{ycFkoP zv*Re=wB{m(WKpWMlT$6;cBLjduF9aZrdqyGeMT!{P&WI{o1fN#z~ACHkfePV?!HeslcPNSZ_k&)FH+i4mmHCYB# z)ES;e0y5+bkw9Rx{U8l@28cW)*so;6Mg zrHC^j#%Da^|1F~)p9h`_p$zEU?$yLjFZlx~bie|(77UB<5iznrGkyt`6zZHTlXyMM z1qX$$9>+jObe}Y?z&UMB#e%9IqI#rU8~#cp^9zd%haY%N)>Wmiqk5c9ltxGe9EoBf-XY@VJ( z#HS*R*f`p>2I~j7Xyl6@89y6LeKyF!5W~9+by96x@!^pKeBH($cOqHiyPR0iV0b$M zWHX5_cYa&ohJS*84)ojV?;}p4!XmnZE9Pr4>qj!4L5}AGYTXd!IDYz#A}0tWLlyZX z9;$X;YEbFq6Li5cV*z9oyJO5hr#1+kGC5YpW9Xv7K8y>Hn#u!7yVySs?vJ_JP=!tzWK(apX_Xt1H3{&`Z>`BUy^NsfOU$mv`(e>&7 z%FQUDrZyt<*XP@n{AN76M_O1+P1p73H1*|1ldSZ(r*!@nX<568OnX>$vh?UA`Nda| zl;$J-{?89v`8#`UEFJC)jLHOj~ zZMF;HA8nR7t|+?z(jJ^9jBhlEnai_Cp(R^daUq@&(Qzn7ragV3rCX<7i;bqu3ZcA> z#GtAIM_B7d^Rc}JS4W}y-(G+}ad#dQ(>ru~;N=3<6boPcion26n}Z;`z!Z;@s($S( zA+K?grZIzp=YMPuWUXbdIm?UUW|oU004V!@aR#Fshe!7@wLOuK$*)h3R=j8Koebui zk%XJ?%$#{#IlNVDkG*x)UIo0JkpP^Y!O|cBDk2p0d@w->sVT15I7GvHY-bUkEc8`KbO7Q&4;h60ATE2C6CsTK9a{FoD@ky_<%U29T?pP-Md!?r|72d<%>T7bfRD9LJ31M?8oK zJnc*Y_Dj=Eex{BI`9XJ6J6)BU7Ox+RLcqqpk%j&s1FTA7^V$$C$aUSvgo{`%R7Ki* ziyYu4r=QT7d7>(`yj~XGoq!L9YJkwGb{;m?7?s#P6vftmIL6{hiXMI28?uXZk_Hgl zUi`M=7kp+-NzL8duJNW9dse)=4dNP?dR0L5%4#$TXr{9`a`;G`$wyJF!Mq+kU$j}@ zh%!_b{$!AW>8-``@3tiyH;x zF>lj{JSu^vKA5y=B^_9ZRDO207~m0DMd?n3)1I=YvBSJLB*hI{K8HLWTsCNwo+3u1 z4PY4B^qbEz=GX&u`Leq?gf7okk68h?jp8al1<1Mlf503pU{c_uIU-C^IQYIJ`chpS zy#2QEG`}aqG0s{^r4$WeRgPJjsI-^it_(yFg;6K}%#5x;8pb-Kj69WzIS@+R*nhu=mPTc;pxQhA?)#aO)1= z*5FsbX$vnGP4sc*pn zUwub;@(CL>AS1fM&X~A-D>f}oSURyyHTbrl(JHQF5_34UlsqwwN%k{&19BsNbCILE z_}apzTF>ZUWh^*fDUCH2iHXlJF_7_Z|M}V(d0~I;_HS{?b+z7Ad1h}N1cQfd4Z?X-3?1#sC^Ws>UI1EeudgV&Jzb5vCGYNCRlM9jdQJ|Ntm>!zgN8iwPd9kX zs|FF|CO4lqLC<{UQl{{q&%4^$dz}fy-F2wsx3n3|t~>n32Xc0tYHkfmMRkR7TP@+k zvF=4G-NZZ+D?Z5!aiF2$#6m&5Y>@8nUq(EAODzCUiuze=&vJ4pY6MP1TNP)gpffz} z{jo81!o7s*h=CCMweyt%28Z=gw8MKs#dK1PRXLdHQ|FNrnwY+8g@I=B>~hC?s@pnA zM6Bmr7qG4_9Xl2}I{g_&F{^RZr7Qmeemis|NC)t%?6*p^b99~54zuv^#p}WL=*KP3 z2bl0Ps!)G*22dLA9N2^qn^oDFoG{AwN6*puBDIeg*5mgQ&xWX5FY5s%B_jM3d9sfE zr6=G`G)zTAJqZlb1?LJXY3df!rRxjj(2!~&Ug{5+2~p)JsOr&%2F*ZezJ}y&z#=)$ zc4TAR0$M7RS6zb^^ko5dB}x&7K?&z?2SVP|mr9t(1{?Op8ELbhfvkrp7bYVH9E9Bb z=huyWkeo<4mpFzMBs*)K(dU|t7q~DT{5ukgZKERl zG>^OiVZu`i_NIn&bLUu3oWg@5W)6{|Dv!1PgCu*SLibiEhP*)3kAQ$gt+v5nF-aWr z@@A5Cu0PC|4&fJjn^*awgMRV5bf}L4G|nW8LzEm8PN{g>33DDX0OYEs%+(jV{6v;3 zx7JVl^(www-c7czL}LeR_8#L$iVSHVEes43$OaN|+aZ+v{yKoA>HE|7m{M0_x-w zYhGBmfH(ZalEu&4ns;Gw%O~keZXob)^;fF01i}5orA1LbizcsdQNDmbrNV1+I&L~? zt|3XP-!(6(6^gXq42)zH?tcc%=GcF*JvGum3 zRv9N%cc)#;Xe|kF_;Z*!Vt1mm!v&Rk%{y5X!oj~Q>yyz=zWQt0E(oA8LB>5<)fJ{@ zDnVCETK9Zgxm^ze7lZb8?1@yqt7f(^i##ssm!!BeH_~ZS1U@P_Oaep;0lM~x zF80I>@8u#t%0K9Ey>6ifz#N{FZ!JeJo?D z#n(1dwTPC4UueuPPJ8Ib=~wDJmg}?AC5&=+nb+aa%q0D)W~vhc!~FR`XoAV8|7Ih! zON+NP9t^T}s)xLKr1+Z9<7o}mkIBbjWB=VTWBua~^@FJq4&^K?ORU!5?bPI$bS&tO zn7z{Vtqk;n$vwzj0ZRr(^b^HpO!leR)%W9Q|MB6Nb|S!B@3u|Ar=d7|$+~#p5+B`3 zvQo5!ma2%c;Pd?%4>u}6iotu}PrS|IIFLNZ4x1A&eR#IwxqNDxkaU#Zs^%5`i~3Xi z-nW<<^~@!=Q_vE_|0r%*cTmE}byUbn8k(U?6{z;kM$Iv7JEi62V}+cuLG9lEji4Ds z5LQ1rwex|ZlOr{m)=o}W_l`C0+)N~sj_E%JSIYC}g{m><7v8h}ST{EAwVgc*esH9Z5u%U=6w0J9n$;n~u+S26bKIi?L>Ng)`sYgM+6khGm3r6W@uIIs*M<|yrRx5@Mm=(f!G?nX1DkokWCM;1je$K^r>6S+LG1e#Cfv1Z=(L;~r2 zMXBGd<|EQe&5mt?iL@v8?W%O86a#7Vf5%)AM+g`t;=y`j8Y|{9Zkv*_U+%s$ba}%1 z|GF_8&P6>R6eQ$l)2y{?I}Ip8;ene9xjxbgh+qEb59TrSi>dXT%?SL0OWx>|P*BdB z;8u0Z5~4yGEDLiUNsgeB69S1n0D4djz$HfcU|30RL=_vw0#GJ{!=p^`GCl3y_hRHy zi+RvtH=)LFk>seNrpy-?F_kxOjkNs!2F^JP3wcqXKxd$#K-EC$_gL1FLmfSAqBHFn z(Xcw}XYV*hhJFCf(>Bb1{WFfwf6}_-Q6P-07L|!(d6pDdf zqj(>t*~z{`C_Fx|-BmVe<%L&q&%%COsE-c&y-g~0uO0;XyQ5s>bTo0ONMgi^3!Nvv zPW2Egf?*OJ4MMwP7n`_-E=wJgBx_>JzZ8G;zI4#iI4j95r03W8edmajO^3v zn!r8(5$j8qhxSNl3a+!-^JhcK^r*By6$`Sg$*>aIaHl?4=;_aDWF{AZ-MpDN=^=b*F@At%Rfj9r`fzebg}Hu+$?jHoEv+o<(Z&}#b0b{R;2 zv>i^+rx_yQq3&qW_i`4-+q+%EGaxK$^vZAI3-~2yGM`z!eABj~81S;b20X5O9#<5$jgwb~E2;|c2WKg<5qV!~K=~?e-Cc{Df79{cKF}!bv?1*H%O%2&*w=fGw zp%GuChJvml$1_5!s2_7jhD%Z5gzx(DtvET$M%J~myJkpy46S})sUOze*fPgSZ57S*6oyW&6& zWVeL69tljev}5!)iwfxQ#T$8iz4t~K=*62EnsD{nDU<1+CR7KJeG%o&KrI82D_xnJB$bI+sLXU%B}C zO`zcotUoqtJTawaB{~dDuyh^+3bCw6B_vL)FMmK-#Feo@v)cU-ntY(jaGxED7+k(tdFe zb6JSbM_mvR)kA0byXvd0HW4t`&8!Bzj2-`n4srG~e=rKM6WTCn_IktopB1_s6$PrU z_-TC_jDOL8rmgT-cWWmnMb_=lUyJ;SHzBN#E43JG1ZS2t*6sc_-rPqme*t~-A52@hTlq`5=X=|0Puy>q9n`WQ zBm`6pGFt2BWJb6^@3E;)G((?j(+d>G!TLIXmM>A9dREAV^cPSeX`ESD!#JzIG||S_ zigsHjh;d)mdRR_=zr`9VKSBtv@QC1VG!s#B-`Y$rd9eJ~uYQ$+&SKfl~jP%dUKHRW42?d5C zZ{5}KAlGjnTbh;NtbdTB2tQWyi89?*y@3mUbQMeu}myGvE2;?6k1dy z3=l~?&fI)aBsq(+ZLENT=a&1S*K=ama%TKjFr+;@B1iB{1IT+Azv@n}<;FjqA}USw zfTXA{X65U9!uOkvbM^#R`l;0($@kT_X4tw!I{`Vm-Cn4rGmrbs?0Ws-?AayA+V!|z zhkXJ=+vMh_hY`t1i5K5K0{#kx3^N8h5~|0XDWy$saEUQFv}76nNfmy! zV9*AUBP%$J_3Jo3&fLhR%By63uk^M*J(;ktSXpVK}H@v?C!Vzou8XB8%cLM$#N{ zJy6#Fq`Zv*vySCUt5Lt6$fa#mmyzfCMn+Yb6-h0@q%FJ%@abW1Rhv(W!*x-};uj^& zWWmmeg!?vWtpf_`lAI$P?~!BHlVDzl);+E^Cse*~h89vsLr3MeN{1uG&~g5TS7lug zma29B4GV_A@HgZ>gd{+a952{H>sgjtMEe#_JspbS>tZmIZ~C&TQY$`Z144bh8&*Z7 z?giEl83?z)p@=$Rw6O|7fhQcVw4Y{Ku*}GY3>>T{{#!3~UiYOS@Nl50k zY;|eVHA@(e+6#tnCtozr6Ckr_-`i0vhRPkRLUpo|R2g*$VEOo}{!~nMWOrCh@1~@< zQTP)9ME`3|DrNb9>U00nl|j61PVc6M48DP|@=Vhk^|C%7K^w9v38yUOU2YwTn4^|n z-y+zqYLmh@_bdH(L23q^6CuHh?PiDhMvDZ{Pk$}?%c6nkjM%^GpS?clLo&M+j~3RO zu9De?lDqbc;*ZZFLsX&)s$V|ih$zV7l?Kb8)7gPp2P!hM26AfvJ{Q%eZ>=scAyEv| zFu0k(1E$MwU8$MEq&Gajw+NuZj9O)Vf-xGhAKO4YDSxtr?zc7|lIzhsQQx8hPc2~- zuHlJnMxPf61#s+^@%O^mCwCi+Ktd}7T>{gRm!0pf?0wY3^vXTN{VDv66>WHYtFp3$P`+UH#zTY zU6L)M*T1aojV*hEBW~KEd!PFKs^0@6L>;g8QyR)%QUzI<23_mKWTFQG!_&bfv0)bU z7YqowIHV4vaX9uud}x)prFZ2!TyU8!~<{ah^$t-KPZ%`5a?zU zo_=lTmc5_EA*~PVbzPT)qW;(Xu&&`hd+{WwXEkr$orB#;y#CiuZT^3Gf<}k#Jp2wF zgvCBS^S$uz23+X}?AZ1aTg@lD&0IV_khq-P4ovrSA`D!-)qDVx{9ofQ9;Xv-k#`>a zmIJi1d^@6|Xv|&oz_LJI+K=33ZiSvh;g=tJtxsj{or;w93+EUGIor2qAJ19by%)kC zY7C<_vU85h+?m3ks7lCQVyJ>;VULQi!W&|y z7?3q)i>rsJ63JpEiNu!YrlJf%pkd5KgchQuX%jJ=Tb}nM;yKRojmLw$%3^?H9pr2< zd@K|EkFrJBltA%FaODH9H+H~j+7*X%XhyE=NBn?ImsU@>172@-l4%j1*UM4JV$D7$ zkJNGIBVma)qB$~wS^~E>5t?a>UoHXesN^D={FczwKH^J zHe^f*RsFFgr4#43{rmEj1v>D9h$o7v_Gz|MXMnX|`0=H~h{(3#QrCr4WeHt}?S@yhML z?D6XE&NO?`-RfpKDD<|2>L-z?%q0}Cj&{(TO|#(M>nh;cR-$?@(d@eO01A- zuVTC^(dHeo)13%k!<_x`l@9kCALwOZPkE58!Z-hydiw?1a+s;E{7akNa6=!wepm7< z;sCnx$sLEbD3`9EaGy{cGu^FPT?go|e^%-7jx+4svfh-XIn&*d*i_8ctXAM(W@quF z+?eYSY8I+$ar*P?_FK!g8tOF1A>Mb;b6)RMh~z<3a`*e1vOgRRg6W9p_0f# z#HoX_V630Ft}nnu;XhBZR5ztyvCinMDwKCv7~%FV@(d{oqEI{<0cBaerEqAT9w#uSD72CRAZxhmXb7|M6?{-Pb=Iy@5+^u|l(N}mWh07&s$b_qI z6y*Ca-k|!E13d}_WVkQQYmxc_vm6Tr=n7%ki{zt75=7C|d|p`hhUPT`bjVe=SU*Ty zxCtuQ!G2{D(7dqg$*6hO&cNZ!)zweidNF8yR~xK#v{?%*UYc&PKo)em&s#l!AA=FA z`>g7B`fo$Aeoe(cgadtO<(cl`!=*o4-L`Y34zEDN5!Ba%ivV^M!I1; zA3D96QLF1>4*DnReNa1tZ27aqw6NAFrxSln?_N@dkLE$~1UW)P?JLArx1gs4TlHpF z{QjDB+NC?ss#D_b9Ijl>{@V*dc#=uj-R93Fip3eVwAUC@m<99gHsqNb7RNdon1GmB@Thj&*C|O|`bsz>X+R7ss&4Sng zFbF|~qhK&HtNysWn}!X-r&J|b_0B!a#*6N~Z+2(oWpKth^}Jn^s*pDabe8d!ln%=E z;3a638P&3%?If*WZi?7dnJxvY92NRL0zhGk#&b&3&Gl&@56L0WARt@I_iO5wLm zch%vlIiIGZMZ#Vw3xMH6f++tkB(t7Tp$q3Fh%Ub`vf z21?;~b5pUZFXvR-s_-n-_$7VW_!z3DW2ZSU`PB6;W7;`W?jo7!LHV<-1>X7DT`?r6 z9|W*_F@5mmr~2Le3cYQg8)wG|4??pyj1oN9FJW9ptksKeSMEiuTy3!9T&tK94*hDE z)bZw(pZ7a`1cCLdZq-Uob3aSlxJ!mfwhM$uRlNPB_Gbs zQ-r#mp68WDvN&G<6y%iul~Xs<{vyM->@g6`6v{5hnXFzeUzA$EwcrE|JU6@rDlg}S z+{?nXzSsY7KVtS;tZaQ=)&Ah{84LWk7XU|inc4JzY@MuMgXZg60@~3vI}WwQgDmu3 zXnrc^zTY!6YjcPMl@=1EVpeFc`dlPEFstiQ zK2Vv>nqa2fx-dR}=^0?muGOtkS5&&^71*GdN^3*?oKALGunfsc^{Xrq1p_Ocbw&v< zJbNm{*|F|$o_ha}G;$u=PeQ*q+%;-h;()uz)N4&u33h$B!l-`g)=z0raH&N~ud;ax5M&|Fl=BGXP~uc?vu|=2l}{8v9~0V&eirgCu_&^# zmif0mFe8r)<&ydwr?Qc3*oG9dax8+WOOn$+Ac+I?R_O-B@P6VnnJ%wR!1KM=j4r7a zF}YCF*I(yPatoVtw?TpmLb=G;R(?fnUZQ2VemjiaIMjSe>!<0c72 zil$`1?;%BOsJwY3#zf`nv7>2|6FSQ7M@E>>UcWa5GA1aV<)@9ONHuX)o}ojM^EsA= z-zYz;CN#!XU1*?ma8B1ByL~2sx1>W{8K@2IU|iyqwL(Pjvd<+aMB^CIzJ3SV`N3|N ze3je=v^p#4=JmjKCf$){S~R!*56dC-zebuy@1}H;$M2>6$&JUOC4EVE-|`GhOtiT3 zVQ4M7ZR?djZJ@Sv7=V0Q4E|pgl;bmhaop8{(gq^$;kT_T>*f&PZSHcHBV3wo$}Z>U zM;f~WT!m*XZgP6gJ^#91zK#5euKEW|%(uy?|GV$B9PsOEbL9Jxyj1qdKHS;>1D)0;CSE(>WPTY88Y{p2?aEaPzNCIdy@`!E|8}qXx z(<#2!ob6O|$nHj3t4yj>@TL(6@F)f4{leqcmKgom(&P_TU$0ov*b_n^DPs@&j}Qg* ziGsjGl$)Y# zo93@W3kSbtB`-DRnk`RRz7w=NW@e)|hL4%2qAAS>-|=i4HTF!(>|~1!u}dV}o+>l- z$&3a_;z3^RyU-Wd>hmeE0&$ofKTpY6M?waev}{uM(V&bnGTGf3en#Q zotO_HwV|=2C!%5cBp{IMiU^18mQI0loVhSXD;LmyK47eW4|d7e|DH(Ya*u}WWmn>+ z7h)(cHVLi=QmWDq1CuIskuh?$RbZV;ZTXcsfX$#3FMz4z?T zEfh-IAvAOjwOj80k^jANPKj+V_c3Ah{2~LOC$#j3(F;5}PR=7+%crb6bU;@-+3uF% zv_9FDDJ!)bp7E?h6Q7R6a9!#ydgUZ?<>s)%e#xgN@eAuIOjPojen0=9rkj zVNP;wjC%UhJ|_#>lq<+F5q_?(6T~GHLD=XQ@QD0U=8v*q-e#h>#9yj7$6=u;8({;) zVyg{;FbfO{`nX;HpbXgCeq-ozyTuQi4>{{p!z|k?yRTy|1Q@Hhz%Do;ds?pMp*`NUz}v4w|>*o?%qE z0loQJ^T-$P;hKEfZ2DqYM8sT|K!A+0O3}WIehds>Un9}FM=!v!D-k#ogMv#DUw@3H zB@UN-8==m@!1iIp(W%eYLQg&+kE#<&6@t=Ul{G8dxn<$-Qv4m7ZILSK*v&{Q>{!10 zdQC$Ml5Z)*Wg|j*s(@dQPpI5vk-52ilJ==0dBYi72>^yOPc*@1<$cyc)TZup@+*Q0 z3nf!6H3&VEtAH?}7gBp{_yFJ=>Tqy)Rf(30DQL1VzX7{0dYnu8bn#>1c%kCMedqx* zn`)_5+ci@tp$L-3riCQm<;=iZ%G7)m5Q>32VO#OTDyeF+Qsp*@EE5uKWsl}j7#)u{ zJtF5A(*9aNb(rEv8cEU(yrDIB|E)qyrNh;$Mf~o{#{2ElriIkj`P;>ud2UWKa~}57 zA1UF9QQ`Ni(lf~n3+aDJnAJiw5cc+A;qePb>E4Y#sDFAVTaqRlpl4#GXrDz5h^( zu>Dy3HrK=^7#eV7_sZib>f1<41HZ<03-s6kn6BpDwS}mILKritAq|(IM6l*-q z8*0eQVY5tAn3_SR9iSV*GbJ?a>HIS>po13la5;O$^@_N0;7076ff;|fE6+s|Uwz*( zl{$+#z6akTw!j|)X&0*pdcVVl$}GI7!&x8k=-Oa(_s6Vkqu>s|GvZK#L3=_^L?>5F z+H^}0-oqo3&oiOu121Xae%+b}^0z~(?zLwh2Z~?Ud+;&pre~uyqqw%mhdV?Hh8n?+MxAu2

h1~{W64`&XSQNBD4Z*+w$)p*jYKBed9h_D3SQ@PErccKRi|`w{QyPy6}fY@ zhHK{Onrt$};Y&fK0YYH;OomlcfLSy}HeiZ#7TrpM35z!4?@fN}F{*cS-%(JKq~Wj8 z1KVekEVXDytjLB#kV>O@+Qt#PreJyZ`L-UmP|0t0ZDByRfffU4oky$T%z~+{z*+xY zLv}Ly_N~T_-=iRkX8)1xG5L59w%N z1EXMbPfcLj(y3lNf_F(5b-UL|^ zpNl;^E82<}@0g20!?Na||HIl_2F1Y!*}}McaCe8`gy8PMA-MZM0t5^0?hbq(=v|aY4riB_&2=I zm+R`u+GX9MhAXF|zgFv*3pK++4n?|L#_~obJli$tK;Ax?7)6L`&v-Qq; zN9I2uiO5GN?$zNx_{;ybF@+4v|8w;~WxIYZ)^!lb&O+VLf#+7g9iRCT53osS?tihZ zjji&tX_GLiEnXgdMqYkD-4!jy0Z~#8oB?Ylp>9Ak4h-!yaw+02SIU}#Mi;g94=V-LC;j7=0+h2ob-%FVhnl>z(V$k}>T98F< zp76Q?$r!1q(LwZ$I4CaR+T7yu;QD?=Cf%PE-}HRm;WeiNc7q*i(^|zN)#z$3EQ~8p zGxc)5LjjPX@tKjE5!eg`@fL$djZTKYG+q=7#{H`SQfye_?RZ)G%>&SMDSNHm( zfo*ShT=ZtN;0jcsAaEpn+u1WXW$J#7EQfT|`}u3{aAFuKO`qYQ$7t4L>o~x|=pJNx z>6DuPeaO{AYsC{GnGTj4!!ySRhl7!W14kFC0DC$ifsQ8N-EZcXxI!EQqtB{QcMIo- zM36zEhSobl=kaW{ir-&YbC3bM0A=+7?&Ng=t|Wo7+xgYbi|mS2d$i=wFE*_gjcIC) zTFU`6v+MhHN7Yim|0I&EM`cB>68<3K>SS8}7}H8x7yY`v*LSLwwW<=X^2Zn(B1}!X zTTLxLS=D6USzNvbv>#iv^HpOo?wdglwc4~X%fF62)J6dQTa};Htv-HT@XM}pop4(# zi81ra;M}M=*ZKB8a_RrvV*Hz%Yr>40|52bmwl+OY&OCnpJD#L@CD?Jj5>l2jPp-M< zsXk6_=5gq-^jS+<$~jAQZW4QsbyOzLwxe{a`{W3@%uuIqGusPTl>Tw#QdxzMqv5r? zSY?j>dB3x{a_n5`7n%lAAa~kSM_JTB#eL!!`~1h#inLp5hR)fTJuDnnrd&Ba*Sd|0 zP=+8AMo#IJ59~}NWzS-jUX z=D*)%J+j7x+I8ak;DyVFYHmk=KfiJX%4~%{dE@uu$ZRFkP&1^sgZS#Z5Ir66eJSCs zJpJVCAN>V8hN)^j+pouP^lRoU@8d5m;` zwSD=RbxtEbj^rx&Pt9$dAm!qRIz84XUhED&uJz%6f@o}^km0KRo2T2ZImHtp#mj+g zZWD=NRlq+qkRjcF&_KrK=2~4~o!5`AD-5rLG%rh9fu}dKDh|6Fie41M^vxeWku-RE zzLm41@j=L;p=PhQnCgwzzXW7>73$gaUz*4#t-keaDt7<2=-qamX}j#|zdNztfK|GQ z-Tz(7c?kI%)Wx^9l%}iHpUMhT3iC!6 zFrO&rfP#Yqo6opzprpFmj_Z00)Su}Q458WPz2fMp!MBis#)4|m1({N^8CDeLg3AtS zS=5HjPE=7byk&n2HDhKcsWNJ8&9-JE<{*t}h&$uur?)|GFwQ(Y%@7)z&8N+z#vwaa zEm?%%0HQJJ;B+s7)5vJtX*)?ZyG+{nwJazuIHSilf_UKoh@n;Y{qg5mn);KV70eME z^0iN70jW&L)lx+WgBkv&{U9cyS@l7G%KkDbt(@<27p065N9y)wq)KXL-L`kX(Z1jy zULlP#BJ7SNXp2k8@H72n)js=fxXZ9y_nCQc^qu9e(x~xt^MSEK52!J&cUE;nDhCW7 zz~KViMtcOBCIqEAGI-fsg|FN^bajCFe(wtSN4eFo6Wy254{?CA6wXHB;tI{h7IKiO z$igP3d29yEH?hy)OsCE9_{G_9yqK%(u{*|V4wVe9Q#{L9Ead2VjSplOA!V*OXr$NDM*H=xmVl}$X7U@~O_NT|z#}T--C&x~laaU4?q3XduLjPh5i}tP zlxNrAXNlkOlUMrN#(TkwRFh@3k#2>d_(kN)Ms`26&oyrL15Vv}7h_>9VVVXr{-nyp zNy8z)_%V57p2r%4&|lQgMhJ-JGJZ(7R&t(6r7E9PrvWFwM4kPqW0`#-6LhwGT>e+c z=4p175a+#X+dc&*{8fT5lrC>}Q!mu$hHXGMzRp|f{@xU>@ZQP1Rw^2GF|;t7bt zZdP2N{o4E;B=k@Zx~Y$E09kGG_Y6t1=H&qX_9joQh2x^zyhEWDEBV*|?!-|HiCv)u z2(DR>%Vf*}xXDFdm(dc+_M0$>v=$#Ox7|l2SA4bOR<3Cta9xYaWRi(YQPtIKfQqzp zLuGOhZnXaj{Ok`uQtn@}er(f{%gZp5j91W9oV2Yo`z=4ECKJZPZZc6MNUXo2I#jyF zH;i@;`77I{oG7d!HBHpE*JeCiw45r!wW<6HDK&QXdu((L=5bnRxxf$gFe8Qvki*&?irb64hN(#_d4W-ozr_H32`irX+ zH$DcJL)DGnL%m&!n|N3zBGY~`GD(+~QWXyQ!By}*uBmEPV*+Dnu^dNYY+7Bub)FZt6S~8J3|Y8M8g>c z4(FRSopr)#la(wrH2yeK7R)c4*-YT@$UMicow2}Y{H-hBwW2?p4aIx&=*m|E_v4ze zzq3(z_vlRFTqCzRq}@bdo@-2Yt5^X3y5IP`%O*`HEhYhoal@8dX?Il(&W zBe*IZGliC9nyRpX;X?zqb9FC87et`Aq<_CAY-+_9adxKV+;kxcXp;{c;kv|A(K}2=!ZU^n{EC;x@!0x7%DH|%o;f|lU|XBY^>S1tXTj? zdPyT48~)5&0v!XX3zt{+yUw`i01}}gMen@ipr4IM2?=t9cOKxN^Uy4;FA{_SH1UXp z&J37dGIf+14XQIGuzg=qOfe0Ss-FW1K0C+J-H9V&>^{`(L-wT}8Zo~^A1wiu_;6~5 zBA0EfhSVCJl~FZKlI5Z!<>1uJfSmCP67o(9;Hw%y9(Rsfj+&f#c4(NeIYT+fX0pIzt$j7yF5~JFCQbGOd%S zqgi*uVLN|Od97KG1k%7zRrh|UTdt_j#dway>yC->uY?a9Cn_v>9fSRH*mRPTe0^wB z3i?>DjIM4k%x4UkWQJ8gW#6NTw#@FY)1US@s}VNd>M9s#i3^0*w5$1K=cOREY%Y3M zKLpLN29^?uv)fMB<>Cr8mq8aI$g$=l=lB{VFq#OTAl-yr2Z9bGRQ|ZO6ol9 zb9RZ4Ydz9ON)?2VDVtA(9w*(2e2>AH0Uo*2Q?N%on!9E@-%tEpjgVbGNB0H&j&QI! zT*_)ZO8}9hX0l}W9n{I8pzf$)>G8dAd0iv>!g1w)u4IFc#vrXHw#e&coTvkTn*rzF zqTSqHl?O~^v;L1bhrKZNUA%+9Z48HhF!w(`d+d3Bjel*7Hj2A*U-2#w9{D3HEB>n5 zu8qCc6QBRejQ+-dbJgE0s|@*~)A)wF35c7zmrva$BSoqbOMN0f2_)z-kT@d=-T#@X zXji3eYns`?elrWrk8vs;dViZyekqZV0=Xd%dw(}vE_8*^gZ`n=qiyZpI5DH7z#qnB&oTCIMB$e{90t;&m09uuXBw1nq0+EAGS$z2C zD$>@WYTZ}g*p^AQoSpOFbL(ito)?%DB)Xd_+SCY1-&9r8GuaYu(@4Y0yfVHRgd%g-V>_#V^8;2cfRo&!H~5-(ZL=u+=&Wq^{SW! z*$5fOq>WX8O%ys+0;~_y1T#9?#~*+o8rt9ao*B@l4FYL{qm*hAl)G%|(=(uavdCB( zMf_;i;rUXeRv~TD>~48xq$qI`39D%$vURCBx{@vE1;vza?4^aRBt^uoS(PJCpFiZ1 ze&t&9p;iq2~1}-T_@J?^9xn*bbcsM00fTb+)8JdHhScfJw!9Z6JEaAjHq2 zV}Qk*u9pqNGq!r>i?k{}Y5fox4}uK-NlXCZnk*srw<*PoOCkx4j$*_%^gkV@y|sMaf*grnoyK|t6P1YeVxJ3F>!La%~4KmDt;1M4Qo`J9+%^Oh*mwEJy7 z{!95QL%6DI^E>3GiD!ttYcphS*fb{2 zwmS%NRCAAbyU59KZ89r=ncSrPQKOr}m2)4fa*0Jje(~qQ-TCKEK zjb5UjKZR;m{n5@1Z7AyHEw|Ghvx%*J^vTz}s`Jis&02JB-HtZMsK3LU15b>yO*y0_ zgiHrOz=TAdkLG4TDn9J2B(`*I^Q?RbE*ZrpJjqQ!Du}RXv6Z_7isEWRj7k4D(J=Y^0!bhO-UKhIhgWN zIu>Xe91`t)wDK5N5*e!#2KCGf^MW-uO(ND*hqkSk0WA2dH%DBemP=vKs&==_5gBS0 zaalYkc<-IhnZ>!HRI=FYIyuFP7WAm<24ZKE( zwpzp%ef(i~$C3`D!&;(LyEb{Wa9i3JIoo%6Kt z;``yN*PVQ`C@fT><9Vg{6RkHN&&aO} z3yMTu_&#vKUMwYDMJg)dK=%;3Gqv-0JZ3rXFl7)L*Dxi^o`Ly)Y61R!KwbCv-aw`6 z>(p`Dy*>J9hPy)!>jmADAryE#4UYh0p@n059|+61fAB~^>`ovi5CvnaW5{FR>hx_H zm|1e(aJrc9Gaq?EC??6kAB)_{=UiD#=J~qVO*@rm*KYvzl>9cV z`>8oe`~`x(Ni&{`z$p{{>a%e+({=XDi%A(5PE#V+Xatax=a_`(vPs%=6IaWxDQ&Zk zO}d-Hj}rX2yUC~+;vXORC?N>at3Q}+O)por=R%DU7G6D(85{g=T-i+ItrUY;uzI10 z!ZBFyT$-J1Z8ikk*s4F6W7z$C{gHw)A>BEN4C>af@C7=7jl6cC?{HS!?v{anY5DDg zW<(3D=`80eX}|eBoDE%ZxDxD6^4L@RY?jc=pX+|YpOy+KJnRT#HnW@=*6~*Ygo?kB zY&KXDn47nlowWDp>^G9rn}|$ho>*hQU4tmqP;RfH$pv(J(Iyj*4x0YdMuS@OfpVGR z5j`#Qi}wtA6a$tSyuRvFK`Za!hdC9#CY8i%*7k8Dt+*-rfLbk|G^)KyBTYIO4U368 zf6(}_l+9)Q8ZuC24B;)Wx0$umIf&9rGzWN1eu8<@|6zVyX&o8hQg-|2;%S~|`2a4v z{uejgPfSDKG&rdyFuBYjK8e95Q4YQ8bYUo^R@PW5_AhDKwT%2b+^^RA3%=o4?#p}9 z!EiesqULsTG-j}B)P>=NV(LvlHzzB-S8xV-kega^=aPrzC(@&6iJP)mq?(puybMfG z!P<2ieJi1^u20v~+t$%42vK#0Rs!q7FW2nI)cv%U-N#*ryXcD`eN?%UZ zLov=DKQe{uN_K$1Hz+Qe&qRIFDrd`El^*rDZj|_iIdeGy>)0VjLT3JUIngQfE*#aP zT+m)MmMnYrDQk5_6C`R(EP5|pl#ETZ2MzJrir@igypvb*Z;J`pf8`KKjg%VrK<`+% z4@DI^vvSD66$!i8c&Z}35-R!{B)Zoua%=B>aj24)z|?+;fM*_G=@x@`r54s%!8+g# z6-oJ1jE**0h%M%)gcxV)jTCy*8rKr z6+~tkB@K8j>Y_|sS!v19aYl#K&wI8Ay7>G(;n+KX`2+f&*v!mFZhR9fRpf8<1rAjb z<+IliTf8yz5wpf#NjstX$Q)v~4Q(?w-#3FhG#u6@tr5ZyW8|L>VvFz<1Nc}ohF+^* z+K$b$_zfu&TXc{y71cNF>}VaPFNAsvCvvgl69;7%SHC2)@5fh`#wfy(mys8j4I!D6 zqopNSMfK3`YmKsy&?Y8cvGKxT%V8Bt38%EsiziYt1xT5VHWM$?C`d;~aApByKJ-+PxvLBq;-O{Ud(LQe3bxW=Ckd{s|yR=@BvB4K9b~--0OF}dx71_x? z$!Oi*NKDNstX)@y#h4dwpgQl=Y8fBkd-ZMsPGM}j zODB<2VKe7Pr@eAz+oFSFuvt)m^YcmBfJGT4>==vb_EQLI2GbOp1OT) zc3&*Jna{t{R6>I8m16p#wy!zSp{*a)ADf^xj8o$XMqL#u-flwrwoEFIzBn_zSW~IK zS>A>dOGeeAJBj-zuY^fvX%%Yq{p1_Z%^7{np(Tp5HY~%P)2jR9rHM zD~k}=)2yT6kPpwkl0 z&y%ce&s+QrQbi8hjE2laFUuN~&uHng)DO7St_veec442T z9<8ckMFPH5y$Lkm%UP50e#(4V_n8Y>U-H$=OUsExaQQLurRD@0tP_YrB)&Fuc-)ob zA*W)T7Zv1XsVe~IQNMX1DDUU?n@u95{%U_(NF7@%KbMd+N?p1>Po!*aw=yJ&ux17= zpRxE8#K|k*Q&QbJ@!3X#Qe%YAL999hzm%=7zca?|3ve2vTbS2G1G1Z82q;u*V)wzE z;R)8h7nKbS2ab6`-qpPX$;$f8K3ZwkHb%PN@vo9|*BQ8&Rm0JlZlyw)egc)=8+WDb{f9^o0ZJtD7ppZQP{ z?P4Km+9om0_D1}eLbF^!k}8Hj<6;+5!9uASsGC%{X|w8bihqdV{)mf3;DEu%I8eWd z1c}rKLP0c+F0!}@s#74s^~Hpj_Zg4nJl=&`D+7}Y9zHeewMJIN4Cn(LCpCUCl>N`fn&W#8Zn)`}VsX;f4_$c_EOmi^6WzNE4O z?Yp_4#>#lDz_quQtPa6fb1x9j67L2YW-x66{b@qFdh@>Q{A1cF*N5p}_3|p2j&SpB zktnU6`4;_rG{knr7-j@=$P)g^Xb0&E<;}GCvXQ4KyCZ%mMdx@AaKA0G*b0}Wmdj3d z>$pF0&wTn~xK6(+WyP6@AO7QO^V&k0Fym<3cLc^51&zEMWi(4_3f|H75b3dJB{x1c zrYO<2C8^WWoCFdU*g#g|Zu7wh))A~waRefZc<}{ka-Tob?G6%O>X7U~l=~XmZz0Dc z1Q^=JSm*8_5!8sN;UiQ)6!@3v0-O1e6AIv1{r|6Y$<<1R5lv`;1*Z@&J32jjlP9eO zkGz{o-^EeYL&nCjU(lR7Q(0OLzrxyzWPs-%4_iKAImBQQi2vb<4$a8=&)YHdsa(Q$ir=ojgy3rKrb@SVs+vd@ z6i~$nI;~Av0VE}ZdkrOze~`_js^kk1tTZAKB1Ymq@xGIQ4j{Y_?#fzzp|22Qbqzw)zI((b2YjNGxX|ouU9&6ch76>Z}9w% zB11|1qEg{IW&^DCQ4LPqd$i^kHS^bb3{%n5pDj6&6hJ>iLy2MYPVgvyCF{9GM2p>W z=ZDi?Ve9>owI##FPNXgC{hT<2zmx(;3+6M}X&6b5l3Nx>!G?A6Rjq47)lu`1Y-%{N z2;pi?Z`wALD@R z^WY`38cu+k>EnnOZFA9#913*=u+YvhLJEhLE*^)Q$(+nhIzD=lYQLtClNx=8#~Jux zFCZW)nPI{@wyLSJDBE+e!(syGl=VF4S1%(ofE!;*Q!MdY!{bXGO6zKRlB3aYVY0B1 z_1MXkQRX0#e*sSrnls1}(mmcj(>+0oZ*MHT1r+$t55Gg7ne+d`-bZ2r*Et58|0}$y z;IUoUbBjkx5_dA2&Ln7GQ+V&(0fcY z6q5)Yz@&l0i-&+P%{rnS(6&i>!~F3JynT2vx%F2K*bwBA785|TExUbRKDJ?LB=k%) z*{FC|O()bCVB-P9=w`t9gZ21&3V-({ zTgPF{7v0CP>%O6hH0u%yp-4}~5uc>A#0#}=RC8Wfw4DNn+O_N<; zuetYx8of=o8#k^O9~RDEi&sIdpsPgGYM_hjtMAK?tZr|8!}skM11>xnRbL*?7BAQ~ zZZc_BTiCBKe?QMYPi6Uj&-W3AS2P=MZm*YjFS+3P>5av% z%T?nEe&45Z9gFp=t0s#3#pmjcw`zd}ugCH4uQM8N<|+%>9nZV^zeiM_djxgey2&j? zUwXP9zl&U>iZ}^K>M*|TR-W(WcHFF=9z&4f9{~swoW8kx=;HQwj;-=r27UyrIk|Y1 zR-!qJ84Z>%?=U$FroP;^y@x%&bP@>~vh^S)oc*u>Wba1s#`nuq1h~{Uyqnn*MG#F$ zHI>kq|6o^_^X!hGZ{dq|fbTOQ@uEltJ@^^A3qY}UpzB8R0T31JmVAi}UiS9B8fKS^ zxFwn|0|V-ntS9eW&kP>VQpYupBM#?_If=#3-4Wt6;fSfT3^s*3va`J7Gb6@7ZfXdS4YP~qT!Z9 z?s7N)b4X5}oTeIvW80U9Q$H?k0)>sqa-4dCM@^4}_s(dPASKl3 zoeW&n1y)2qJO90AS1^l^(g0sFYYvve4xjzcWH$RHmIn-V6A@lK8k1gnWWr00XLL8u z9Ap~G3sRN(N!Q@f%A&KM#f>73MC7YF4HW|9k;$hc=h4W;wfP1!b)Sbmxlwp&!lc)52WF zL1}9@Q)hpIYBF^%)E3rn#)D8@hoZ(-4!&{ih)WPUL3qa1d)%c}INS6>w&0j?B3dl< zDb`Zftz2;$AEIpJWtfpljtOk6Lfy4d5&0?@2$#&5Ej&SHSW2 zv(}FEY$Es%@QAeyE}woWjSgryg*Y3!dGe6aOX(HEgu ze49;FX?`l;F17-7R%x1gBl<8HfB2yE=IG)By17YF+(BIJPK#M~nZ>+uSV*9Qb=f1J z&slkjWB4)^E!6Pv)1}G^va>R-Tg-8}a{ge|b<^Jc01C~45kMLj@a`tZOXnt8oy8cx zyvnS8#_)Yfdo%RpeOC{U;?eE(a_SD;nSK8@aJB0!-RBC~nO%PWjQcu0={pH@a#ul1 zufKm&5JTX)NcjV(?tWeD;PuWbMugyy(~P`+~QZ-2!=YRhREXFF;19XI~z4 zj3=#qe=*#cZO9LoQ+yu-mPg%pefCE9kGHn`_*sMvcQwgxg9t(!E_MSxk@20iw7y85 zdx3k>xrfE4t4+~ZlQ8Bc8is}Fa9ZUDLhuU;EM3`Zn7t|aUx?E96!507Mkuq`!wYTq zYi@-fa+}mSKVg`UUOrRkItv&nw&{uSAqC<`S9YdagXAjRY#aG_;He9y$VWS_6)v?q z&hYzOa~z-8FfrvEmW}rL;v+nX|{LAXUm4bcx1gjucF9?UM|&qf7rnGeWi*I*FU-Yi6T~^mO@~F8zgg;t zU<+IBXrR6&ceS;+Hr~!wO$n`Dp=Oh1ck4B{sW1(0q;%*axl7Tt^6LM#{D})hi23`F zFGun8b>aET3NKE7%*@LV_msY&t9(?(qsLP7XszL(BZ+cB*PKS5V=BRh&9u2Hm{Vp~ z*+A=*%L~eG2)(pV;bS_L1908U6;yt zIW0rXyR852v)O(lqbi+GmUB3;F$SLH z42X(uB`}563y0Z^{0)WPn=TK{ZegOxSnW+k-sVj|I%?vN$96_sO5LRGN`;nuIVis6 z$J|4itp5HqX*Ab4-cmY%a^<4}>My`ZU0U(KiqJwOk87{m4>W#?AxT`i z_J$+(5}F!7!DY}fPFm%q`1=>a1Q2uYQJeE+aF}MX$pARbf+CfhT6*vamUgL00Nkcg z*mxv8g!yLu!Pw^XN=p)Q24HA<0QVLQO;c$)B_N&zFNTyqMlb0U zA{3}hQ|cPfcIp>=CZehu5*P%7;xYrUS*g(c8d|O7t}hO@)@r6GVQVpaN(RN>c`zR5 zKTW{8&S?ah-{WhDV4w0tRiYy}C7Na9PR_%Ic){U*oCS~8b!aY7U&}lE;dm!%=9VPa zZVr9BIxS(6g&MBpk6bgBoW(O&NDID}0Hld>gKY%Mak7!rA4MXPxed4ihhXp36~LJm z>lVX$sL1cu8E)D0N)j6H)Z+lkbAp09LhmzVe&;l$0-E|_l1kNN*N<$K92{n0yb~Q;PQ8_gCKBeUN-#Iddj!g!O12+ifVuU^AT`l zC}g@wA)uH?`u_a;-F~>Ue(w%5{8 z$%UaS+x(@R=O+-4ty66;Bu@HGpuwFKe5Qv%F&@5~gev zknE=2CH7?W8h$r3#Q_do+bo|+tLghxu0M8(;$pjOh{7Ke2HB3LTea!QdDie0sX(iO zcYkv5wFxkAsPWpXg={n3b|F^qWD9g)4yK!8tC{$JAbZqPT-MIxBaE#KO?@KKnYraA zinqldE?~>$(wR>7@)XDtQXB|pBj44TRZ-)luAAl3xySk5haVj36Ttil%9NNm5ssF2 ziA6@IU~E1|Kz%I{rG@`eQS{MX=+^xeLx-YG0Y(OpNXUH(1#F9!@D*mIKdP>!wgvK3 z^R=qindN$w5m-0He1Dgys>X?uRXE2Xzq&T5IPA^;@Zi9nq|VCL1%obFh~x8dI-t$+ zdx4lwor5c?VZ_|$1<3(;@@?r3U{5#_+@QfOyk>MjWXZjc+dU&**2xHl>k5l*GPFpF z(vn=3fmPJ8kgSP>MfJp7RR}UNjl_6Pzw`6c3ujg~0{bNv|5zhC zg(n(@OQ~`GgB{Oo5$ViwAr28}$lR%vf(hncW-Fddm9EH>k>=0Z-$6lvRc&hkLnw49}gCz*&<>K4$WLsEt8lDo>p4%%t2#$Q?!QTR>cmn_9z#ElCf&=s;)ESEB84~icq4A9 zz(gpsUsLk(Y7tLf)}f}|3E zmn8)`30kiSsL!QNFr?%%OHyX%Rv>5@*J5|U)3-L=}`tA`?>nKGyzI(q1U0Utn7I>r-&3HRK6y}(`A&FLQs^*$H z4KW<}qFLT9!&);V=DR{++w1dD9*T>*%}k1C|2bjTqL@P=F%2DiO8yyjy(%$<;(?aw z6T@Huubbx)TSn$0P<1(}(xSx_=J%f>@z_0Gf>Z^)5eNL(r6|M%D}cs{$y&4Au#^^>7U9{4wbA44J)4fLR& zZNHD5{NpN$!bcJjSU*hu;Z#YW{;JsTQs<$n`%m}#7Xc?IFsY$mZf<29cvhlT_~9=5 zpAqWV-kj-fHu6<2e5C1oI0^e7FNQBL(c_i3!-- zaweSZ8Cr-tR)T;zS$V(&sy;q9Oh9OO~- zz~i)6b!>zTAmLHrlV|Nas>?qFwnfUtpLuGK$DkK7t4UL-U2caN{Sv-R%BYEHk{q2z zBHOU_sUPQdj0Sk&Ag%Nw2B}&SD(!}Nf6Ptnf;g3arRoYVzoaTY!M{-0@kd3^Sf)v6 z6_;UquLgp*Kc1aX@uM?7m1u}QWQvQh$#HZ_=QQ{~ zCca(8`&n9wWs=3I;TyR~BSnqQ%g^~CU81`IFccRK&*R@R&#qTe`8Zpp{t&Z+uZdGDxb>{bya`VXlu98u?pmS_pJ4|HgCJ6&1l z%Xb$*6J-}JaQC$LkNbY4VJGvEkgkaY_uxl>Yp|GgR z!-JRR!`k~tG~b=HH!>E{A1c_4`wb(WuxUPh&3*!3o?deiF{<`$zjq%gcAdG#T_t^K zZHhm)Mo)&lATqw#7U+8axr5@bE@fli`q=!TK^36#>SO&kxZmmoT$ft3P8Yv!o>A@_ zsgFTPnj%FwM9dNBHi~7=+DO@r&1zdsgv=fo9gHretMznS@f2UpD7+mN#~`Wy zbP)K@S0vhmmdGJ%A4B%Tu zf5Bo?)w=R>nki9IR>7<7JYRJ^I(so&K8y=RO`nYo~vwaY*5TUNrvvs_261+TnPZ;xiCAY5DSN=%s1=ijV_GI0 zvty8JAlkm3#viMr%kOC|bGYO=ZVWj7`u$lqzXuOqeQI!&OYJTqY)cp4q9wVv>e+KD z1WedbiAu{oSayaHSxNDmtGxhyrl8$^vfSou`<`eO7Lp8uGQCgy z8EWMfHfcY`w6*l!gq{*atI-;SO>e7DKSU;Hh;|jg{jcarBd(P0Eoqx60 zI?euqdrGtDgWjFpuk9B|e_Zz}BC1a@RuW?7b#*TIkMb{V;%DDrrE@n%5733-dPB;3 z_WL-Vi~-D`hiaI0Lrp55gvH9%EJt=Luq@PW05^v2bY&|+dW-tS5eAri%%}V~ zt(}wLq%bPC0ym$6Ap0~HR`E%lz7Md(GgA0=%`SaN&u+49NKR{dZ7Gl=Kcn}LB&C;@ zj5<$zvFBHau_S}u$!Q%UQ)4=mgTL7_4o z7af=6p@mciyA1@*Qdja#QWQ*UEro%wmUnC&FL|2p2`8_ytFEbXb`WY1PhffD2@^7W zh-GMV_T+!}4c(LF?DWyz%JFEjO{$FK;zq5zGBC8YRv3NUOW`wWV$S*1UqzfulgvPz z%sr@IphCzUb&5a1AGH7Ne6__iLJUEDw8_rcN_&#_9aQ!kBeuj@~-&$zU0i zJGvwN8Gy@6@?Az@)LP$|2lV?LQ<0ccRFbtxys9h8tTj|ld!@qYbZn~d(VsT(af7tvC_@bD-l z8ENeM=!_hr^*+3opyWJ-R2M#D-}S(spClc?JWC#F7Fus38^*(vlW92rB;z>I*ZXxo z(@G1duV~IIyA69Mp0Hq`bQ9_O669oVpCyx=Y+=6pIRUOQ1s-8!50Yo;&|V0_(fMg56U9d z#cAq<*FiK>#~xY0jXikwwx12tKRuX?`-3`yqYNyQgApHa<lCkkz zbpz0>kz=nV{RT5y+gtN>%*R~J^J13q?GaRaglTNNS{&QyZdfMy%=+QU>CcmT5Ol&% zxVOleW#;C2h)LcFO#>iY58%>3U)N9%?{x!HtcI zDN}%o`TpPje57sWp*|CNsF(2)p_`?HVxm%K4{@e0{QL(mN~5U}n~GMj8K7fh(eaiF zEfSdg;aIn!Tgd&)FRE^u(09xjnbu5A1ebcP;`;i7xTBdlDP3@%w*hplTMVZaaK z#yNnb-$DX`O6hZHaP1H|NsmAf(3U7Ye?bLA!niLq?CyJR?|Dt~meXE0oOW_deQdj0 z>umR{x8Kub?C_;SU?1Y7+WG1xa(bl$`;y~Tf}MPwHTgORtSylO=31w)$%1(ysrdIT zY&R6z`8<^IQ=9DlNHfIQ{N`c#_|Nd7_bS1K%En`Pw*6n$Mb)!~Oq) zHT@S~GKiddJRvl@sX~{tIGw2fw2-%Zl#hMYTCXCoIY0Sz zz_w|oCG`jQ)JPBy8q^Q}a7R}){cc(zo%k0eZf?)}pg|pIGUCNG1t#Yp%$iAdB9yQ1 zvkXk)vOc$ZjyHl%k-W49;cwgy-ue zpIyRDO^wtSQYkbID=95q-u|7~81jqWu0LhjvWY3-j$uCx#)8L7*k5+Vx>MAUGOE&w zz{;{R?gWU%dL2_Kw;T4YR%ObQr)A#HfQ#t$<61aQ@2Bjit$f|&}fwK21!?8QJ)vy zn}m~zUw&}t_#=Ro*gp=U!A@`_b4{e1jw`7VY9X#JMWr!hyB0jhFj5mX{(4J4FqcQKa=^FwxG#DX zGxTpm5xZaaLf@TzIYJfx;dG^`19Zzj1V1S}ZI=+*@RN+d^~R$398d)KOlpO=Hdj{B z{R;b&WAAxK`S|dA6zukKU*NeJ>45o?=5gC~YER{3URSPTgo!~Hy9=Fn?+_gu*$duV z+5-p&4Eog`Ti~+EuFmFlcFTN|tivO-NA7se71{Ui&+q(ZK{kO%A0h=EP%})h{?B9+S?g9ic5yOBhooD#X-_T9>J2!jv&d%hgn~uQzm$Uho zS+j??QH~<^&!NsQ*-vG)e)l=h1KT4u>&>e(ksaqhVS#)_c7x~hZh5(}$JXC3X*%~! z0{Ve_MlW0+naG|xWEPs-#h#Gs|76m2J5FBL_)WC<2Ownt3)qJre_QpxA_mt%VU`cl z7=KI3`C|-U#ovNLv=`()D`lWIUlLRklq_m@Pm*;bXB*vUY8ov{u1XPvdlz?+x`(x6 z^~&BGkDni5tr23ed(ZEll6v~pPw_`JOk@zZ=@0QbybCnu;snel=o2z2KIJ>!^ZI3FgK(Znj8IKY&RtY-wcsnwkGzsZrf=VelI9g{d*3WGjWc)s zNbs(%h3^Z<`XF?Ql^q`4fT4wu9vqFycCcxvWY`Xu%w_q_H`t|7i5pGUc4%)K4@`vS zd%|f6sX1|F5}ZJva*fVD`6bw~?d{PT2lv*FyiSf9lOR1qJ5z`Oq4HI6lo~O^7-_6Z zMt%Pkfvse0ZGX#0^$xttWPTOf16hF;Uagsr8vbw8D=`@v#YblXyr$ToK)4Jy$+WJ?TAzf+Z(}eb+>(RdF)fJ2h_@AW_7aV>fZ!`8YBC(krCpi6>`L z?~qoYepTGL6(~A0F9;5U?(1`Qwzs8m^H+n~R`|spn6IpRiv3Iq$Y(Bkf^>fdUY@qSqV8^s zPElk;ESrH;?&r(h=U@CNjx(tUvXdmIHrPi!!V-rp^Py8=n@h(S;il9pG>%Z(Tr_un z*%O=84K$v39BYugvS5aRttd^XbTtwagA5i6+@*|mPT7W57oej2)!Q($9qUgA?tG^6 z`u#&j#c$(dEE2QTY7e>l^WHb;i7o7Tj*jXiTh|q73n!MY31DUScNKIXpoo8;I=M!dzQ`Noik`mVuW#mj<2Y>Jb<}YXlX^@ewx?;@RU9?4_7T>^hjH2d(kOGWjV)v9;>0v8q-$$dT-u3FQGvNqYl{OwxyR48GY63?tZ^--S$S797?x>o|zngX>tXNg%z zAA_JutmV7h47)Y+Y^jG?A}wzY`cSdd_AS!$=tUQHmExOx%SH_Q@Fc?>Rb;*212~f zlGb69)EQDnU4&Q5)=eQPxP|7i2e?O8Jl>@Y-8_{VI_fKeE!<6Q8orlH_Kl4cSQ$wa zbbToU^r4%@;_5dK{O|VHivq`;NZZD>gee0RBfTdHa`-{!N=dpkdb6D=5E{A3u1f(L z@u1RgRWmi(YVr;%&AK#|Ns$aw>3ZIResnK64a2jC@K0}Eh}rh9G8-1p8uk{}K*l=S zQ%3q<(e?Lo9d&xO)iYD7_qBFC6rBugM9cZiy_v?k@$#yf-|yPGoZh&ubn+=R|AoAd zsgDh(BTy&XlK;|zz6Yx<2$4mPOm7_fjp~go&yqv&fcdnN?YXaC(S7#o1Ii204m#FeWi-{XG%A1smc z*`vXNWQv_0i4PB06Zz@usKy!pNvnNE>O4LSJIPQ*l$8=g9SNihhsqL}b|DYGI zTW8Aq#smDA=h^KHup0b~%5t?lC#8bG5zE|F$G`0Tp$@kz06XAVd>s7$e-;7}*KNoD z@3XK`3(pQ6hj2v8Bx$_@A;};{?%gonH#dapUaWC~=$ZRkxvD3kk+9swaL6Wida*Z{ zc2R$Dkdb^59R2vslJVm5H>LQa8g|o& zi|spt9mtsb!7sHI^=oEKIxxNbyxk=#;R9rek?|86t83y^0j;YDM&pE~(}lya_t>=h z&TjUYsKq!wx4_f5@20dxd`RIa2zJ9Itg17^-}GcbIZ%hDk{d0%Gji&nTT;Cr5d*kH zBYt2#A>85>C#giqv9JC9zJ6rM=TH#Ln7FcEyU{|ToD1bPgUFk^ERL&YggbYYz=SSc zV1KAOK2(pFg+2i=9-j&(DQwjEjRvZ;|^u{k{mhP!6hujRf5|3 z8kyoV`6wm!n@H&(O!A>u>Xg8`SA4`Y=Z2Z_kTMLd?DuyF8FkpGJB7pPLzrk3+{qPg z;7ILQ{I7=JP+36@zovYnxU4hZ&{K}@NGsISf67TTyJ#{i zPS4sJsjd5~xUY9kN+JDmtKqg!w&=SiP;>*ATWe^ zseMsD!4*l=)P!y_U1cZKZS;94Pk9&=%@cLib7$V{uEFh$D#w0#r-Pxi?i-RCU#Lvk z;dYZpb*jvQC+&^(&57W(_d4$LKnQY=tB`vaL~+qacV>@|url|`0Ul&Fa#7ca#O(RF zPrK=gEZUKxq4nur%9vrCKQ({`qd{RJh2gfLpT#;C{}fN#B8Lm|bC!Ld@hw4FI!Hd7 zt0Kfs9*=i<^Ye(8WVJH|!%T`fUF%OHGC|fy( zY%xVBD7g~2UTW^KK5S%;nIoJlqeA>X1_^R+RAtKP5~CGx9uto!0k>=sI`)ZA+M;{n%^y9v3p%h(o&_Q)MW~~hylev8L1N4h76VJI{DvGQ zjlF;B7la3k1Z5|a614FZS|2#-(HJ31G}dAyZ?Ojp*V($r=E6(s&NG-m$j40_hx{;) zcOMJFiJV`av4a!V4vEwW7s9j;H*--5d+UWu?b>@<{IXd>@w{e4IFfmRIcxp1xF?7g_= z@*RIb2NjY@_YZIgU^44a;Zcpe6T)vN)+M{k^()}ViHgC$ftvF>K+6cork#;>ngw$2 zX8Wp|EM^2srgLA}S6I{`m>A*}*R^JN>@Ht?h(atl!jD?zc++=y$>B~&^ePN=*P+*9 zEnnbflCNouYAZwFi$p+xWEBj9h?mK-46Scu`SvpiJ%*TCgo?$hk27{JpTCg!m=EV2 zLfB8p;rGxSP-0Ix2~vk(|DVoC=pAMe91rpmk-joD_QwmyPt$ezuF;hVcIw|%l&F#C zK8nv|(EBEUY$!OJEks8?-Xm++W?ZVNcMfU^CypP1-VbQ&wW;n@sqq{TcSG{ZhWs=| zm6?xsvk$xyB4A&)Go3EZ6lU?)-z-CWImw(X%`bB+5$N3)$4}zEN@M(1i!}I^-_YVw z$&w|3G3`w6RrkIprb7Gk>ddSF{m649tnvEM(Van3v zOTCGlkrKcFVUq^gjGKs&(-g>?n?^Hmv%5|+3b>s7J`7oKVEIU=fAZu!aj3aekJ_4M zPHaokp*@i?I?lg3Zq!^)W;uF0)AU1RB-c{+pGh>~A8`;)@<#^h8$CYVkMGOR`+5PT zS%0hW;vsIZYh2NBXNc>8Lj2=LM?iQ!RM^dzC#5=RsJFYbPuWm|a4}di{JneVOV0k( zZNTmGKko!`tA)|A590q#hb*e-fROhJaO}t|WV(Tdv^pOoDO5vb6OY^VHLqbXS(4t6 zb8$`5@4o#}pMozSp6=h`oDclR;Db!v;L4JVn~TQ0YuK?t_F z4L9h$QUrZ>hmxP5?1;NhLLwXc>_wTuQFA1rY^VoXOc-UFJ;`*HePvH*6bGJxYhro{ z+xG1p9<8C1|5XoJY{~@#0wWJ;5S%HK3_D?6l{`+8W`b!bisI)Of{T);#h6*z4%-MN zR@Y$P^5qhAsL3XrN)=GTCGU*2R%f*gpNqg#EuYk%@HJ_)sdM?b z|GqULTmR1&;QqUfD6KixQJ)8@^m~C3E}KXCCV58?aK45g6$`wTjX@Edq6<^;Gr{lh zn}E1tD6e`)`xl1N=O`n zyi%&9s)|l1N|hwWDXjly8gS!JVWFcSN1)b&o3*OIeaGL<}fr2f%s!)fj`qk3n+jZMsiT>fG$*Kp?kVj0|}COyXQIu)Zo?C`lH*KeKC@VB^SUIVXWEA z;6Z2$_3t3obeF8qrNfrlC^OR%^bZn!e)WIlKhuAS8-HyO)?e-S05Xg{bjq4FJJIY& z4keq8%J3-3+2AjGoBA6Ih%~kbO)1hKQ>g_*$#+dWx{VYpBX$fet6jw?{;KseUHDMj zVQ=~%*jKoIg;?x)q}ihfjcxwHeBX#9hT(dFW8KQ?$2hi$Pi3o^%=UjSHw!cdk;S?+ zi?s7GG|H|YO(UwoQj|vddQm9(3h{sSKAW~vH}JPzZ)L>YVz)CVd|g2Smu*w1pYCvOOEPZ-Fp}hMHXY7g^ZxKQdtIsx)D&1 zyl9pu37H?4yM;!8mK_pZw!f(5mCGG-(lp==VH9f{1pH)tt%Z__X)R$zJHvc(_I7^W zakKce%(ZJ}LlZM?zXR!pWbG}FxSLk6SMw@Ygf(a2O$*;2o{dHshL~Y;;Sin)dCtb4 ztf*n1r3lMx78R~%CwIYSmv-2cT2zr1M?@5=jZ=J17Z*qIZ4d=QtmV(ViI|_Uz7#~Q z;tmkWF0(OEsxQ#vjUxN6`yrEGk9N*=klcw+Ab}^KMlA)vo1^bv5pa^xW(xT2J1EFGBya`qT zRz5m$^=Zc_kj$$&AgP5uC$of;SWY%A)mmexG(HKNtdxQ%W6!?ViHG}yl_2j~UPeZ2Lzch~jtrG!zg$39Yct9tdARv44ON&6^Gqhdx zIeRT;FyjM#xA|D=m)q0{ac||6;NF#kIhJ9?*=@5rTHT?<9fS8J3zTAD`yOYc0tJkM z+vHhvNNr&!<`5!$-lL46`#7&-LD2$%z2v~1SG!{}S691U)B1GvV1c=m9e^wHvStd_ zx)|JfuwChzHB7V_O_b|?IpHHx5+jra2}WzD+B0STynq1LQwvQ4?I%~FY#d~vCro(#xY**!D;g*)zQi0JF` z)DkF`U=!0up>Bz=3YD=UR+KlH+o$u z|A3#U-0Yk8ZbE6|#wi=Leha(HKBK{y3Js&xqAuQZR+_+tlf22m&Mak6!imH-Xkuwp z0EN?9j$ye7FeVzPR={#3LVi1*n1jV=IFBq+eITF2<;Zykr&?l~)Ysp|P=}9$xiyuRp)>HJNThcQtIXb^vw9UA;>> zW`!o!2e5R{<; z55YQ|_Xj6YFv{D)^lZ19Qh+e0N8c=TRt7};ur)wcK7|5S3^M6W{l4YHLbxzZNS6wHtPqZBh6Ft96TSwCYvD$2co z11hxJkm+yKMAq=gU`E}QLy@H-kcr+lG1$$@u z9-p)u;V^#Z4Q}XH%h_j&;iEEIe8BU^1BMevG8kHigbYeir9ot5#R`ICOvX|!MH_Nz z4|8hu#(tTMNs`;f5ADmk1WQ9(iex#3v1`QxH15Cc{QP|>H_ax`k=EDSO}Kf!KtJWu zd_JqRC#H(k2^0HZ^R?mnSDWK;?Y#xsQ9GEu!(a}yhQ9Dv&{H5ifmid39Oo~M<55zY z+M~*-I1iKHtv^~M?zEDq`sXAYKR+&q!ZlmQM9Gn_4aMtm*z!!3DJn9OuAbF<%IdIY z;)#N(^yTBqUnD7IZQtrfk@Cx!#T%TE7f27`2^=EYzAHXS0=Xe+T22hQf8^4sj?FwZ zU$?{(xDYg6QdVWqBY+V{P;-;?B-6Cqz&9ft@$WEfMxV*A-r*b;zdG8`HPB-Rc`^n4 z+bHB1fKj$`#FSgAG3c%H@W$}afmp(Jg@}QpR{*p%uIA-;sO!N*YcZ)kDn!o<f3n$r;QVaUV;To0`uF?(CMwQ^6}T{0QKe>=PID@T>n?o`RMnr=4A7h zuwMBK2|*CpT3-8t+dyg^mXm<(bL*nG75j)G8CqhL9D~){@bENPx{G1I1mZO~O12#_ zzbwWzif;6?va~D&_|m0Tux*+k(ImCAL*&m7Xkp{fKny+P7g-QiXhNb-9f<~;XJ2g6v5 z>Y$AHm7ONtd(xJ;%=tpI0UBfEifzKYZF_GV_7LPg{I^~iq7wbWk0)xJmYR25)r!t8 zJXNwVEL6&fSC@;KdQ!NQJ@FSW8%!9S0 zUsHvJ>-TA+?&f)GB|4~>>0Tjx*L~%nNY5@{E?M8Yas?^aEpR1z5AX65GP|5@6>35n z$TM9N9ntd>Z&!6DClbBJYU|xR^+nv}*lKBgRa z>{XJatowqT?CAk^eJ7%ry44C6dufiQw%T0ZG$r2UmG=io_Se*mR~Pg}*x}SP8#@ci zpBNoo@;f8XV@0OieE;&FT3X}S88Zu)o$1o|gHDkG(MvP05A#I$zLK3FP)So0N<@(p z!d24co+|(3(+N@{4UA`amJ~U6ZP}^&pycv-kpC|3dkpj4T!L(9wQP9bovu<*sDT2=BTMuY^z0(5!OVzH5)kam{Y z*)$V8ZOn>ga|k;3BlXSFL4k6jX7C%lV2mqj4I)Z3w*A2qHFKrvo-L6!-AzlfAK<1Q zdsDoX#f1!M9OGp!P-B#f^G}ixF=oGl3{Vjup=P4#LH#MdO@j6&0vU-M4Y77~ft%o| zeD&wBL!4B)aK0n=h{WvsY<7IoDVd#YRfaoB3WdCVnj`{_ZEOQU9T-wXk4pzCGW>0D zVndoN8kgaL7`Cs2YcSM1JbTSd(qaI=V2Ld1Y|AU@NuG<9sl9|2UW=h_sE4Q7l_;=j zo!1VO5eDmuy0K5e)b&x{y;jStp0>HoT1`RsgvFDavuSYNqg`|lJH2wO_`Aa1g0^^M z$n>--){*JFzpdFLkrB5dLl*IY&?c-{*3aH6rG9NUGuQG?nqH761KN@1?K<--9g zkA&^QzQ~!z7cAd;I9Zm37c*W7cG7+`CEHbP@bam`Zmi2W^Af;7<+DggQoZ?D=;2Wn z%YA=3BS^++=6sHr?u|upTDLl<$ss1s^*;a9Jvd8tUw^NJdM{5i4?HHLAVz)0obrl; zb3by&vski$l=uoMu{mDrf|G%-{?7T1)S#P(dWBK}qJ*%rR*a4}HArk}8k?78)x=GS zTV`~do15cfcWnE1%f~bmr~u5lH=DO2$!q|fWz3JFIosN*qCsSdoyR~+*CX( z3pzWHCU2)uAJv1mu4;>+OfmO;S3!G$1wTu!shZt>njD0Q8ML!Rg81muZdlOrxFbCf zG5iSdYWGAt9qhHw16CJ<1ytDb;e2ib)=N7S}g(V^}2D z!yI}A>}khXI}D-tEnaz~08&tQ3kR1CmY~M6lvfIsjjfaUQko6^9yzX)Mwx!$M1Q**P6MTCvC;ue9O@KINmqr+lvVvyO$7$ZiXLrh3WVUI zOqxQpa`lDvGYlkhM%FUw1WE=;)KQJ44@sL;v_olBr)%mruJUMFospR3HprIT?rg>Q z}Uz1C^VF{A@G zygfefa2`q5fGN;xS;F|o^8++Om;$2%ANT6jmo#z7 z3imx3Fi|XvN3R$}hYp&;rN4RHFKBphPg!;nWXe#)FFF>+er?F-r@Kqz%d3zulzc*N zV%ekWZHtG9Gl^B?lSDqry`o>8r| z%SV^3LgCG?kFfA10#(!Di%73cg`T)#5F1+drNR-((Q8spz0=PYqKY5V*O?KeCSnT< zygT`ZOrR09k6;;NeT4iK@Q>aqtXLy&&DbuaxXVCBWW9=EsdNsFdYyhp{b>OI*7Y-~ zv?4)Rl;S&A7pue0p=OrgvU7jr>cm@ooC z6923kl9TWx8}KQC{t5YRYE2=9{>>izXW2cOfKQ^LYUEKRe&l9T1ap{D$YE+ae?|BG!`R zQixJiTS~VPb~-T$&?5kD^*J9P&^!FeQDizn8kfGP@o?^VZXL78!Bu}ip83Y#QyMYZmax7`q)KWV(UM(IW(4p4gS#{NjZBXO zyjm;MWH9zM@hbwp?HHt-3&hX@GrHz;V4;qCq_|+{+E)&ir5`?1-{p(~fqW3kp3u8NNV^4EWAyiR8R_5Ek2Iq$rh zG|HYXN$d!6b^3_qQ>;4aw0wnfm<|KUoITeHcRg4V2pn%~*vh#voI>AU>okgRwfbhj z)$DoQ`N&x)0e)PmGt*gqj&Rp_oIy>Z)NJye|}JLOMtBNs4!vff1B7wleFg3k5k zuui3phbz)@E*#I&|Jg0?i@LpLyV44Pv+O6g?@|gBv7=GZ|Iqh7GKsU-&ES>puFlul z2C(hrt;YdwR-u~XSrUB$o9v?a0Xa5i>` z@0A{EDSHs_xSu>$;4CItyetl)1i%n&GcdF{!LyZ1))3uVf45yT>QAXP<|6qB>#TE+)ke*R!Qd zWT*)X2>SH}VKUXfab)o&ne|iD10XvxpWymcO*8ZZ#=c}QC(Kbcq_toEY!Fn0s|=AH zZ7rgg3u9i8QAi_Y)7T#_DgR>D?%;g{jr1{1(UO<%;TIPQ(|{EFg;dG}o?w2h!X8<< zA&mGMGsd&P7q(XX87wk7jzVd{QWW1GE*7lm_k5M#ZO>`!4Ys1UE_0`c4n08qDZW=Nc5*;Rqq{RQ?2qdW6~~iT zf9iiw_N{@|i-J2W+rE1Xs!j$x|5TkM@vgTXsDj@=@yt7&YxzLf+_6;aX6Am&b?g6P z@Zf(s7^r;m|3|9veB~|B3Yd{A2g|&2|Lts=t4ogd(T6W zdY2}|&;+YHYVvx%^_L^t<*wakql@ZS)VY2(&p~4h%u<$?-6>Z`ti}kQZZwa3;xHA3=EvtoQKuQ&+IUWv|8-YL>D7=^GL2!W2D1hTY{9 ziw2%qi3uuOMqqO}gj0{J$Inhr$DS-&uaE1%TfFaMuFMf&;c$tJIi}$TA*Ac4$sXoBN4NdwG?coHlrc1#&?up%`^wVqp&GP(8S{TmD~9HoS-EJIGJ zFy}WCNzHz1Lj@vJ6IE(9PW`fC!|E(=_Y<_DWy7F;EkEw65iVBNG$mM0@job6c6695NQjJJ_CrB=h;uTT(%6_0uiSDD)S-b0qAH{2 z$yzFQlZe6flO}4m;UWOUA_9V{GXTtdOMt1$uN8D1dY$I*Ab?w zN+ENmzTn?@SLGO^R9sqNzP($9k^$5xT zIiOpA}YuTQ5fPR{Tomu zSDM^?cTIvz^__g0f+RLL-9al8N11PzTEvtkUa#>z)w^WxzHn~hJl9@u`sF7D*5wbQ z;fW}$OLbNgU@B-e*m?p1YWQIkfy$o8u&z0Oj0qZJm@zqAt+y)NR&2_LuDW+byhLEb zp$@8wvB*cEN_SYQdUZ>J7;nb{JnUgMx|kGSWU0DzJHtYhd?* zO)N_i+NjGMc=B8rfTJzR5o8s?I_VgrV|l$a=3sdDa?3Kz?DumO4eFZu4fExL39rl! z%G5^}sAe$;)f*0x<)id9gA!c9D6g6@Ucau5*CH9-Thtr|Z>ev)90Ta)vemaY9FNpzkfa8#}R?4_!JWZsqje|G*}`|F;Y-|caX^?(w8 zwYpx)Jg~+Qj|W+1d8~l~nYVSlo1pV9`m_H@du$E*{>l4cCe;1$a3TD)T2hFf>`P4^ z@C;=B8`Gz%$^v^`*3<7d7o9k*B3zwn0!ODl1J~Q0OQs?p;r2zRGG_OQ65mWNNkJE? zD3mr(mYt9S9_Ot_T#%{szb!U#gp2%uBDO0AM6aQVZ{g)N7KQ0HCz6OY4^2&+`;@$! zZ>W0Ne!iJKY+S(67%Quj)#W~I5l|SY!C37O5gt@b#iQ$_b#Bn!$HLI#PLnscv^`Bo zX*hsq^@gKnogH=d|RS zQF*hh*>`E{@QE(p|B>n2(p1lznQ$C$_*AW4QcYAn{#qO|?MDT|`WWlFB>sk92{JKFImY!CmZB?5C*wHb4+gexr&m^7IdVbd zw*B%ZR0>wfYz{RN3`k*f>v_ea@tPzCrjj2?YK0^mBFY!;f&AuMM(Kg=vU>J9^U`yQ z&%PP1@IFXY!R6j9SK7+dXqLb^koAKaY`?gQ@69)R+{}^EvMZ1JRwnJn@9E8)YE43v zCaLi$Vw}(iVQWFNK|;sp`sqf;-uL_a{kCbz(ALN~g_Pb@I7AO@N9&rO~+q z?7GDV)Nx944|?dqL;6$BQbA7kvB^VBtBNYRJA2t!6G#DSnP9qE zF$L^`_NhofR*vDMOsp@to&s^yUWHkK7@{*huDeE`2+;hawce z7VsrsoaRu^T557sdlJmuZKf;hj!1L-Vnxh%c~6fp?oH*N70q##5P|v)%+&e4_QT!^ zAJm`qo?!cvg7RljaDri$WfT%CvoYMYCu2QN7Ih|v@bMd7^t~7SC zu`u1D3iw=mvD<^>C*XWVyE#zN18?N=If0N+OHEoCED^LGYJK@17XTJ17n@3gbHkfT>U6$CBe;57XKG3Wn19uUj#b4fN!H z{Zph*PMs?ba#T!hxDR zk+Od0l_kQ*mWO+em4w`wpCF06x3of^{yn5mf%^RW?Z$UR?G681qpn|JY->$~Mjj&< zKu6g9)af*C-iDdaL<+He_(%`c_xFtl?A(A%WHsDZ>79r02Q6mB7U6?P(v0nii(k$!YNATS0M|NoH z+imX_WkBYDLm&pKJ>mfQgkIEV`-L?0L8XN;4frIZrtQiS$%R#u@cVe#>z$%13`5 zT`=q)K7};fC=bY41TgM;W!8>h&D;bpboCIdM2=kBnr*!ts9ZsRi%85heuHt9PveF| zOz|qkhn=uNvurG2C*y(0vhK;mCg8CcQcx4B3Ly#YTki!zZx2_g5gSsjZ(SXtK#<6C z@-z-<_x6rbH^)WxC}eMGJgfrT798QK%?ZzAj7wpWiIEYXR&wZgiLof8`mzV!7|L{b zehDO0U?d-lcp?depU2X~%H~xU&AKGZ6q6^Unp5DH`T>HOr$0@*glFC7V8EdML?J|d z*gk2Zg{d|N8YC}Dtq4)CbJ~)0HNucH$H9V|$t#s0)ft4$(yS__Esr#=MMhr4U=3o4 zh>P;-4;L5_wk%RMf4@FSM^H}E1R*gUd?`Lu2*_T+MjNl_IERV#lT$Dmf494?e9468vFb6w);+M z!yB5b=h#7Fd`6nW`8S~RHl0SJe_8|4JxdBOv8QGbx(7^fAoJ1;s=U#R(28EJKhOt6w+ZFxXI71d?8lvL(O5i9Ls|w#O&qua?oB=aFUnGL^4@M zs0nr`ZxPM`VApQp;%N*^U9L)>fwUN13y<0s)f6r^jXI@d1#!Zs92qx; z2UYP)bz*HWh&+ad7cMA7DfyI-VZH*QnZLfu1ZzK)N~WY^+bwn(y{-{dGI;*w5?wa< z?EZD;4qWK+iQkhbKD5Y|0G(2a?OjPH|F4wz)^Xy=aJ))HVOt)Uq0Uqk2X$T4Y&8!8 z$tv?#6!wx|dCVVYCB?PCKaeaKj#C}-zf$XcQda<@+4(B36QjFj_{&Wj_TV9X0m)-0 zoOqX1_oVt1qdG7b#rbl?mjR~QUXd2>2ctNRceyvL#)%Qh61;i{oe4KUA=H|u;*+9y z=IK!iuh=`JSWu#a%BM6`3B5B!z_5~Y{EOVgn2A>2#+(A9Qjv4pZPV({ z&0AF9&FUT`9^>fy4jA5BU`L^2(@7?ZKG4gd2mB^iP|Pk3o@62%5g!cuASsB-?Cn>0 z__EGki3RN%>Btj&mb9HgWjH=$T&XPRs%3<{N=1>%$B;Qgu2T|HzRPZSl&n4u^yodS z04J$Yoa9JD-c`MTD7070io^0Ks z{yv$J8vOD4n@OZ|>sE!}K}cD14O0R)1C7ORKPI~7m9xPS`@Q3|=1wU7;Xoj|H3B+b z)v-ve{j0q!;=!xmKdEP@xNg=T6NhQF0-FRRi363)?W0ugn8Vw}yEx6xYPu!25mbWE zY-nvkouha(@Vuy^7do%(K2y6%!iviiQjY7G0sj0Fqv3@_rV+4oln{A_50QsD^-F5; z5A_eCgf2@mb1RkF1_OaR_K981-R5AMpf~&Mde%)Rf=ZJ#+#*r9szdG-vKHHk*cezcWS{M5+RE!W9W{m& z+j_ti`qkADZZlSc62ij_Oso-Q?8aHv+NCD6ZaI0HY6pzV=om0`0m*Xl3>(S7vz1M! zczPejDd7*wk>5&*V?vIn_zl)5rVWR-lz!{Wbn~SZ}Kl@_!WnlB1*P1YM=MJ-)90 zQIK=I`W?IB!%!Le{x=K^fwEN?+{fi#F@JBb2PPiF*-{DcqM*RWR6)ne-}0YuGsgJ- zrK(sIFUcs{M~xyv2ivT~oR!vG;j|WyUytGmRb)cvJ}BO6ocBtpbCB*-U7+S#sP?rN zR*|Abqs!QnPs@ZQ&Rqh}?n7#Q5Y)eyEmDViC`v>24+DheeqQKRyTm-UO(Yc&Y^aT+ z&Pn_Za}C2h;eb`@Lzz9g13hmoe_oLX8kslM$~~+FBAM&ZW|Bz65yHC?lbwoykr4!Y zTuX@{p-fI=sM~{4&Lxk@aLbi#7yLZ8`389*s*iN@H7hbi*Abi2Kw2Q(Ydz47kCB}1 z#qEs_HRZ1I_*#>Xa(t41g_OPE*?QWqC69`xX`TkO0PpH1?~kR=j$_qg*~B)3gev>? z(%}w(@-AGAWG~Vf&(&`7A*tyUBU7v(JgZ5C+XhF3hBkSM&*>XIC8y*>R8tlJ%tqXZqoKb271N=|CW7oFaRI@$G--gFyWH(HLx zIVQ&qjV-`0TjL_-M=8m+BUn)eu`~5{&$~$dY8eVCeXfC2d2Bz z)9p<|Z@M^|6gH!mYu#3ud4Uo826*c@f!kET?VG>Fzs`C(>D<2MNB21)06mqQ@SS7; za1_~PkDJes_iS&DFKeF?TZogJqvjXn2#l2^37Qj z<}6*}SR$YcC*p!cXX`AD{@~1=Hm*^1Dg&|$7a=qCMu=Jl3~pQRi?Y(-KAWOD(nw5w}g8A3RShfCt4rC;9YcO(O=$p@Ec2H}6I9-ONtXD9%t z$Mhj~k{`(Qg0^*E31F5ygT)M@Dpv68bC~U8du4dyc)D<+K(~%LM6U>;O%F_-em62g3>tZUb_ zCWG>L-PCw=^WiV%O>2k_=Uc3}nWzc(F4pg)zt zC`oxfeXAOr*gSW3>Rtc6De-4J$AweipnL7#ZIk=q<;)0&1UTB5{M2@M2FSQTEAR~} zXyh9(x&e$%O%p#vHd}maX7jpERVTNLf#uSOD=_3+V|Yt_$!UZB={leP2L#;&pPsIU ziO>P_zv%y`0T8ktM?Y})E=9g#%_?0ASwUz?7jXGT?T)VoPq!kjvGpZdc?DAJj54Cw z$m|gBaxE7#Z-$>3+h=g^96aw}AVSL7aPf_*NmfoE0L6R6LRcq0b>ZzS3C=0A$5fgX ze$61uySt3rw!IuWKS_%c+f&vRb)$-L8UQt%42O%1$W@>c^H}5Up*GjZe4tX5Tcxukx*M(!jo*il;rokb?_@_S)!*u8NyCQ@CV5E{=6Ar# zFont|sJ~MFmRs4xO{_puI~4V%G7^c<%CEZeaT0WPM?D}091gyEX0N_j)>P{MW5GrM z**-^GC$eM7I8tsw#QxfO7Wkc^3OkQh;WB` z9R9azWc>&0(IJGi;o&y4h~VeUvKq-`A(;P7TXTuV#v8o!(Dn;snq{G@j`#|r2Vm6j z@6ZwVXnVkaZaW8pMemXsz`T`KNq$%#qwkZ9#P!E57v!8$UZHn=@?E2}Y`Cqpp!58YmDPZN8&~tQdwqjfHAiL(mR_ULluiwpghyE}sMN()768aR!)FSttK z>dKU78b7thHyD~Nn~z6mJK4OcMqY-{1p@+~kaV3Hb$t1HRDstMHFSbn5Cb`j4`Pt> zAgifyvno>@U5=pil$j()I-OWc+R&UiWCBe>ngV@FM@uFPX&p?dAVUh;Mibm0hVsIR zQ36TUuu+$8m9G=mmawpN4Q=fU(dc)UBPH!=tCpa;aMZUQA-agfw*>?A+$eE(x}{PI znpMTvo7^3-`ZuJu=r&@K6fMV&kE(rad5-k+%%X#@<(e$c)#BGAwUPc0TW=W^b^nF^ z5&|M64N}q#0@5kn-Q7ruG)N25%`kLGcc*kWBOOCY3@F_V=jVO@@8>*ct@DnxSS()5 zo*mcq+51bUqFZZT$h;Af&^X}2BWf3O$mc#tr)*9k8C&NCAu7}9yZ1k9q*thCy0S6f zP8?51X&-6zj{$5`_>|~wRGY@aoK)(f6%|NJgl}bh zo!?3PW6*da?u=hTg4i)*|EZ=xv8>s82`q_J%si(2FC@A0SD9a>0>euznX3S~mvS>7 z7EBhHutkCL3a;C#`J1hLh7lpQgQ+^Wen7%QSF0U!4pINZ*sC0#s9-Df3(-HsWK-rw z>Pe_@Wg1c5o96Y5I-3op^Vhu0&%MJ%Q;T4HgdrV-lK2t#%B}b0v-)Uaa*jKEec=wm zj5{U0otlo}4{R2!G28FtHv}DjXAiUel9j)u=M?BqzW6D|_DiXh{BnuVw|iH+oA}SL zdrU<$Pr5z@s7vPlu(!^fuVT}WH}eF!`W)HmT*()$E3|pr^`#BX>f&76?CHaqsE$2U zq6m)f@XOaBwWd~-20Rf@gB2g|JRAM#F|=|i$Z!&NHfySMQ&)bWf#85ULV|6=ciRuy zj<0P6!0!o|Mv(}8!6p+nH%E0}IO{l=$-32&6D0@4NKuGiBf7tVa=y$h?g_S31dXMmix4|XIBB&c|l@N5D$Xy%c-xZO9Q|s ztp)1x3Xy(tr6SCan{H#Wj$u~lOb~=UHAhoUHKI}VG9YfoGz)U_35982>uh|LEWC=yltKRn0eft`L>IAt2`J zpF1V^+kkSH^uZ>U-$wa-TbG?(5OiKQ5_GKrGj1=Yv_R3^~V9o==po=$K_G-&4q=a5fJlF6yI(WDdN{5 z&9|&Ca|#T9iH`;Idwth_SGqTO1u1LoMY773(s!Aox{5PM$WU0y)3cAV6$vBgX6W*H zN`?zChoU!rTXZ0O$FKlR!0iq2yzd_zo^bMCJ=l`W&a}mhY+6jAmWcgRFeq?s?tOI2 zVi-UNFPBJ5rpJ*Ew!D=UqK6>G-6}uHk)QF{WS$athBaSic#khss4$M;J>eq|qt-|{ zR1WwSU)rs1S*AM;I%9O?4P5RHdOAJ~oI7}_iYaB=Fmz`$$>JFhG?XM%&wgY+-Wphb z5sn8bir4CIPvqadzvaErYVQjez#$oS;JJq}D zWj`{dpqOUU=3LVE$o%Q6WcU|?bbVwwdvy6NtLwPD0?RaK7HHI5HWRtLq#k9Mo8~K` zyv|80p6r-1*t{BvS`ZC4ZoE7&ThRH0es4-u%K`wRce(>hB#8Xu5HEI(J^nQLFkR-6 zwZ`vfPMqHjt?oneeBcq+W*H$yb)vII~Yr=1Vm#&GH~i-Zf1Zy$-yy#0<%na;OAV(kAX z&+yafouMrhc3F1)>roG3?2J#jYpnx##CUWm!29SvvploB7VWyj75z*tc(gfvQY`XN zFX(odhlU&4um|y%-r^CUsn9_dDh{=ovxP^7H2osR-&CJt z--dGJc_s9rE>#_Gm1;T?LmD^J%t)zS+^o_w%=EKqo76AR6^jg|Qp)#hPZhnGDgt?` zWyJVqF3${w)kw>4@*T1Fro=K(dVA2XXH*mLP{O4XlLc{ntQ>D6NUfa%una%<5U06{ zY@i;y_S#4LMt?S^zWeA%7v+ILEg^@d-$H@Vo%kbfd7Lelxoa5ffHoe*&aDMQ;?f|4 zgMNNc2E9O6nV=M1jC;9OUQm}sfiwkSq!Z!VY%(K%gaeAb;ZUx;n33^#RRS%5+t4!p6S0<+O`-Y1PnxaZZJBRopLRKFRCd^d`BReMDUP_Wy2IKGxvz=JR$2#>CqQeHiac_)_ZBU zbe$-Gl|u%(Jzj&_Q*Eyjx!Pm0cQ1vP@x8D^SGQjON2|H%U7;;}>#|(GKeL6f7ns0- zTpOXiBGBxaHG6&&0T36l8!YvH!nW9o3t%k9A9dLzVi87{miD`A{obd9wrzLc|6T(! z?UzGdn2|Vt*c%{c-Zwx4at;#z>Wbz6UkeAI**b2n)sLYHdL5E3dxGR$uiW2%U$ON; zB}3tKnV`@Zg;^@={gQHX%d2MPQ@555N=p_z8a_av~xb+hL_^4lM}O=Ru#Z(!3_48s^wxi^kJo3&l5y zv(Ez>X%Fu&Wf$k3h(#iZvaJmw%b$k7;61MXaj2J{7{+!Kn;^pBx+aRhgGTlj9blf~ zC%VX@xqp(Y!I9*lwmmpal;a_+%}P4pFX;WkXEY7Uz^QfMsXQiqg}n|xt0<7YH^_Ap zUJ}H)^KF`ao`K)=`!BL}6DERtsz!5-B-!G<*OkzL_2xgz%PTKREU}3T0;RJv5%U#O6HJB%(2zoU!>;H$`?qS2f{(ui3p*C9FirmZxr$_zzMzygzSiBT|O0&Qk zOWozP5{q#lJRHRYMRvMB6i)jO+oTTa7nJD!?^RZ{)TAIhWaJQBQm=F2sjKk%s#W_x zz&V65*6C6`W>E_=P}EuAEZ6uw-&Y+E3s?vjS`+-#_^>V{+oOSjx@BKtrgpflsl#o2 zh=YAq!6xMF zC1|k2Al3Emo_C zZjFUK$Fp|r{t;`|U7b#^{|G~JB?7L5VUItqGYNc6e6WuTqXw@MKJfnpxJlmlVcq&H zjX|`;233WT&+!?+vmgGB)lpEimGNO2-*KIrKs25rR4T>%{wPH1?6}a#Uy^jlwZ*hL z;%K;P>_L89H(bXGj?{{-1$g1Z)y0TYr(>6j*$$Fnamxwq4tQEJ(G>YDovF>s&(c0e zso{N`Rce1!bcD&Yv-c#FhaFlhX@Gw5^o`RwLC!CXwQY@uS0V#8{99%n^Ya4YKGAr( z~p$oPobm91? zx1o=mr&YUwE`oi}z1@*vmKz04bws76F_5pwuM-e{(ulF#hxaR&?Xv_D>`5lP8n&GI z{wiI;BlAzN!x!`)Bhq=Y9Jx1Q9H|oHzc4%cANt3^4x+QIrfoHN#iN0+Jem64N*ArG z6@PZN5o9X8knmjohkR?3%jU-etL9M%En>VXtQd2t85{*JFQQcv!lhd^xK7rwQ%1Dh`2xnrrBho8VETKH&598x5f{tRX={1~GU~HWg+)q|x=}>QGnSSUk?<_X3!&Jh{L`~_ zsf|_**^ax;!xN6n*CzDGg)E(xkkhpuvU~YT!~cSjHpQZYFO}WLpK=utNrqNv6^tJ! z*a5?CA*u^KjotO)xEKvHfEduTZJN`{?LFHbuVHNbp=hVT0P}I-d#3Q<3atBPKg*{9TR$Kmn%77K*Ph`qZ=`AXtn2@^P66)WOViU=}Lb_LlHup zc%NuK`HrXDm61f5yMBIlyk{7OTDm>xP3d^4Wig{g5erg3HpzSt z0f#U?pNpzonUg$O1>Wh~H?+O&F_l^|@TiuM6v>KN?Y8UvjB>F1ssDiACObY>$x!sY z0GveQ0zJKMW&Yeouw4^sC4ONFD{t$B=?gPSSC=#_4I_(;;FxSTF=E~7$)yTWJ7pT5 zRhI->^>3p^df!(>M6saLpE?7OeMCP(q(u=|#vH+wS8m!NLG-@gTtzJVkP?xV&#B2z zUcZ)>M)b(jHIp7mr>}42{*684_-J*ur+o+O@b7~e(VdYVldd@XS^Wc30J95w80r4s zoCxsY!2xDn<CP0g8{R`yW*<1rc5BQ%!#gDzh%5SNTcHzhGJ)HDJ-7?9Gfr!(R6+?7bfPrtoBccn|_(dq#C=fRIK;769#>RW_x z3Tou((GP{*q;F8XP>S=yd95EA-}ktQS_vpSviwm#lumIVSTNZj$5md-Rwv z!C3Nf#(X&2(Lq<%$e@G^<yyXMOp6SsT$iVF1cPz-9l?06#YEGMxMaEHwwEOs+k zd_u5fEDThBJ50LWQB2#>+pN2W!4Xg-P3Z34M{-1F5;jkgjap!2e?9Qt9;eao0dnZx z##xzSHEocN?Y7S!17J!P!RoerPX_c;WSx?~Cb@ zuH?zICKJ4K16;JscRDebiS8}cXi3>YLy`qszYaJ$TA!FiAvCN)U+}TV3R`V*&AOj( z$XR+>uHG>6VS(jTUQDwvTKr2?2pyhk!jR?!4rq+j-h;eHj37#i5m%l^6u*ArO8?2RFU_T<^`Ql)lMO`cT2o}AhxB3a<{o}GKJb1{Tn8MZ96#kRF@9UQ ze)_MpTE$D4(5(H5nk2SZgPr-z6HWt0uE)4{oy0ScwJ^I>V6omAsmm(Qq(<+Ys#*M} zJYN7pbn8Ux#U>;ddXQv9&F1;3Jz8~A`7hLPe+UIIFs{LNWANJj{eOh^{n8zQ>+(6e zz=h5FeY1(p`0tHl`?1*8j}8?4{}x%B$Qr*W?!={&5De-F>>ccy((v$nX7dv1?GRLS zapG_sg`GT)U>A9+1h0MxWj$v$i;)m`kmAeM){+>7`Pp7He6xt+oxG*mgl;}k!q=pe zrxloAO(eq}RjXpd%6PM-)$-|VrSc{I=t>}FHryzJ>}_jlDXYqbxfDOULE&N-k@#X_ z=egjUqF>TGv}~YkW1WR|_E?Bmzbh!T%zG_Qm!foOgC@YOD?4{g%wCWtRRPB72Jg1W z5zuY~M*3L%35F{~SVDbEDYRi<(-WnjrZZ^quBM1!C-Dt+Y10+|PO3T4S80qB`j%mQo(Ix{DI2A}p2x<@1koJN|4O);0yKvDNm@ zG7)Ab842TM+5E&|n+4zqyKA4QrGAwo%SwS|a(|Z?ch6A5Jdp80K~J4$PbkK2rfV0a&EX4|w~PFw{1Gkq*U=9`!36|z5!Wldc>bxo$u^sFy{$y}!v zJ5m0HX}Na(6i$UbIEnxeLmGF^*1hfmvngR|z|hQ!VbYhQ*9^qO@}Z<3fY*$m(G`02 zzY_evnhaIv8REx*<%-Gjk!W5}axLQ@UbyhM3^Xu=+PK8Ok|`K8@9NIZBV-lA)kTca zIwaDaB!Dm_rTc55Jr={+uUuO_FrMX4bG zM$z-cP*^lDX5w}x+l9@OXE)P9navsG>!x{QnQ0OAm&ZANeSm;}EidnTa+FiAhuR$d z{L%F5kf%+(j`%h_e~EvV`LSii$@Mx!rHEJ z6dZ1hh<%$W%M>r1AJZRAN>$rQYabPee4(*V&wrIrvX$E;LKUBC>FAt_pe7yE!+Ai{ z*!Y>y2k+)44FTE84mk?}8P(iWiQrA#9SL|=jf%F0keGbQDFSSE!mwnbVwy#4!-hYlruILoAj=&M{Y^ z%au-vl_Cu~&<`O-%ZEJdU|QYP7W`MTcZ^5Av*QpxCw55iH#cp4%FQ&An4EczUgL6D zydFDmy|a-A0!;`uhPrb=43z=mli}lgjejuPzL;fzyB)MR>KbJC?;?K^%2>bu;>YzE zU@B$}APl>(A3)Jo$^hnX;3!e*kL4pGU|Aek!XlCPnP94rb$EFqo!gpz=_2lk2|_^f zq651G2@*BbQO)J3pbss+*B9=Szi>PGF2;~>+~4!^WBvHcFFT$?)&;dc57FP{H>AOW z!ZVtAwlF5jvvcSjE^`W-(5lrn)|6$-5LBXr$PCO@=ZZ9C+R``hXXW?@$BGNjR4}}YMV*y6b38w0c)$Uz2(AVuiVVE^Y&d}dlgu+0(J*x zKCSr+KllthtS#(k{C@sN$*#+(bgEYY3k8D(^W%0N-KY3hd+zlCgJr+%zPC&APE z+qSh+MUbN5W{u=FSKy(&?z0iAL}W^6dM^%inL~(vj)foI&cUGKCfP+$|DH*3FnujU zX_upsRyt*b8M@q*Ghkn7qCZQevOG39)m(|@Q=~e1+ASZU zYN8m+2p->9S(Xex5^u!DHAc zt;N%b;m094YFnGT)O#Ev%#E|x&3!7jcMs}g6bXek9a@w+(vdG`cLmFFZ^d)l-i4Yp zL$V@9%+|O}q8BUwKyj?d*>SmJy2`Sk=iF9c3>(h6&?1*jf*ZzjJa&`D%3`GcBI6F@ zCKdCznBTWGe)@_kN%%ItiICGvUlL|=4qcA^??De9$7j%oG0POeB>tee|6q{moxw9s zasGOC0~jzw(f}Ww-igAM56aGXt=T#|r247@*!swvHa(~Ons#6MSDY19SV%B@0}PqB zf9Zhpzt)#Z8^DDCT|d|LNc|U+>SLZ`dj)^YEM~Mx+heZ1fquv(RvW>Uj*i{81Numg~6uk{k!FUr`YHajh&k~f`%pIlts80})_awS^X;d+ zG?|Z70VrIZ*_jTrfWepvwf~u^T924z?q|5}l)%zpi|=JAvEOTxRdtWjaRo|R5*g-V zbsM#wjNcFKLP>AqlUWwoJl>Xp5=T)((e+%?EGB$4V0w>?&{iEGt^})}BX3bdM+ZPI zYBLUc`eX5p9xC;VFNDBJi7s0T1{9|Ue8%aD@^{pY(SjctJz=OGuiB}#|BPRh>RCdR zy_1eNeAGbKJ2u`LU6_qzDG`rq+0i$sYxCoQ&T|$y_3HzkUOc^0eNuYUcFwzW z?%w@^h;Y-~g5Fnn)V78BpLBoeO{*MX2#_KQ?ss z^kXmcXv41(_|>JKe+DM3eYB4GdpAZw$ka>F*o9$Gs2C|HBFUs0c|8nK**glqnvx;^ zHxc7-jL8{+?oML$2?y~`w1!AuF}*dG2cu9T`hu-Od5e|znO)RycO(JH=@Q=`oVQV_ zO8y@(F#AE+3ZbE2GhWW3*+7v_Jkn6-TJ7}A7Y`Y2BH&UZz_Vv8So_waH)}V zWbJ?hncVNvbtP`dYA!-!8!!}9E3e2gKU)=jE7jiD9G`St(OEBco6_w;NQA6S4Q>TJz$R^+4VH zv@%m4?!(f%9ZwG8^4Cm+@T7p;FGCMvMSIN1%OpAsu8m{wtc;(qya_^j9FG3HasxW;V6azP4n>pnULlS zos+Bw9@B}|Cj_UH7{jxcrE4~;=iAuG4qU+(rZu<_m6u`I1`I=oENj<(67^R~ifQ00 z5K$nPvBfq=@6SvTsNgDOz@ux;5OdV{Am8^>PTGwBY0LEC&X0tY#v|fo0np6A50Dfh%9ssBOkXf5mvRPf{ZL18O4E{Ona3b#84A>oG zK;1nZidwHmd46z?s;~JkHdEHgj_e`iUZZzjC+!~H!2EsO@FU{K4c zuP^hpg_8gQ<7IRq>mJ_XpjcEnD7#Q5kj<`Jwv5CvU6=~{mbyWNqI{m`J{B&c5`)>n z#`mLZyJ;s8t4_>4Z#-TpGY;^yhfSL03^DQ?S3c&>X0rZV5}g+bhiaxG(r2X^Q%55XHMUxzpgpGa5bB zK*Mh@+vW4}7kV0AH+VE&otCOKfn zCiPw$!)1hY`*V!V9JZ_8x7b&2HDHExtV?4$5sk@pE(o$^8q??_#YIiL@0A-;YgN?I z1*SJ0v@$HFwusVlX)qe9#FZR@b$7cJT4xh_&4ITpvN~v(KzLM48q~@> z>-YXuk|rO3YX=JRnbZ!s{5}&tF`gEXc9*)J4TZO^&O0cHuimf~Ix=egAJ)Z_CahDo zeU31zZMowWaC+w%>2A(L!Qbq;!sEWW$NvZT@$A8Fz3({baVRrj>OG{6|L%IO*-MeE zhxXaGHOh~(c-7_JvT8+n;j*bCJgT42Pnz_J%K0~Um;X3$w1FLgCzX20Wu)tx_(ENr zU%~%M|H$u<2iOR8=(rF86q&;zL!KhoZ#Jf%m6xnA<1?hCBE2)vJ0V?4SCcS~G4Pd0IkF_YGGs3K}{( zHPR+IeJdCA*QyYd;*6T4d~A)^*#!IX?~AD$uar7!#`37B?b&8zGS9hxYJCWxX=mkZ zWRivpbFWIp_LZH}*uXjFbv!1viQcH;D4v@B;}XH=kgkyAS!P}Qomi(SteGOSKur=M zS2dzl8BfcI)44>9wV2yhVg_>2P#?jUS*3f>=ApuMXo%wUXnzuQuWguuMIBRDen&^Y z-d|B(Y;F&2O0;XeZ*i9J#-X<?_?35SfxJEUL7#M1diUC3wrmen|#bTAfbC;aL4uI{$3dC7k>Vqr2MvmHHkny;na z8IS{Szf4iFPv8;b7k&TZhXetsXU8_^)RsCcStdjnV&*@x&e?sR_=TgQ&q8xT z%r2?L7GAvMfna*_fHf14czLbhu#je-GymodN#h7)Q%}kq{C+J9R`HS5wVX>07E#HQ z7Oy+w0WMVeWQ+(=+lI8mX|! z(u=9OLCLVVk=0Fcy;Pe!f7wEZE)ta&2>iBp4FAbLKrjeP?)-GD9lJz z!^xrK<1zxLu?wp0=T>_&BCX0g@U5R@W2eGb`W3&B(QcwqimnxlMpbP*0^o7F&SA6(zkC3Bszd;n)5F>W>F6NV4vb1uC% zXB*(*Hc7Uc#JP$r+{0!jD>RP?Qb+uS>W=XuBe-O#8EN0jgvDTqMc3$^LibF6N#T+j z(nz5uSj=)gVR&AGRf3>)!$*8hnQUyb;APIQg>#@vb|xQhW!%!sqH`A^+@3x9T!uu- zuCHb7Ea^fn35+gYzNV7VDQ^@SOVYYzkd5v(_)X#+13BZ#v6{ncuwOR|4h1a)1QvrwOujUKm4-RxUzQkXD+R*%E@C@!2SR2>VQSzRpBp(&uQC4Y?$D7 z2mVhCHVfhZdat`zet>z!f5rCuxf~ck>Ydj8+$a8xP@pIR09Cyh;9?mH!bl$ltswO$ zZT>ShyA!rk-kpJqYo5wJIUm@c>My770n)FT;$L3xuH(x(M1gl^9dP;oPul$NhZNN- zM4njSxy;?HHlAN4+h`^?y%;_$o(W!rgeXzQnXACn$i7R+`fw~@X}~6JpBFO<_hs2v zQpjBc7;JQ^p?d-+QtMO3XON`B&VWPqr`ZGG#IEkq^yd-bnzn(9-vN&~4{7$7LiXb+ z@S{sZp(Ks_fNnUHiI2jy-W9i#81Q`k$B24z|DNJ`Y2Et}sQP-+&xtveDJ%3=|3I$9 zfFu2P^S+}2z-s>PI~Rf;*DafNyr1W;*Ea*Uc5l!g0(>LlZo_DliTFO~Cg@TI#skNP zQ2oKrU%Q4Vb_s7yf`;2RsJGJ(X%<-MsA=0!(3PH&9Q=@L=4mtJrHNU?#BKMzt%RU4 zaoDYvLKYKlMYJ=$i+Fo=6*RQ$$O$I2)I7$wCK;tx>4f*br(Ov{#p6U?j?|fjl z#3^YaV0v-dQnc3Qy|y7#Eg;c8@>W6cU&uluEO(%UIr@B5I}A_CIN= z8<90TtkiwpP6S3@=Jm1WKTcclIp*7PziDZ!6kusnb-7+gc@A<~@-VP^n%rw8?j)sc zYFlc7lmbRDWufJe+}qi4_9m7AWP?|=iY#(s?}JKcO>EDQylv?kEdA6>u3s<`CLu|3 ziGXD5#<{FA%~S62UPo!24$rB3FweR1i?lS>u6`fzz@Mqqj+C=^RUy{&SBtwZI!IJ0 zR(^Nof~qz{ZByums*y zIAPGLyR!V6i9uOf0AKVl_RiGqi@>laWaOV6wTsY29Af4ahp)S>NP64So>t zr%&;fwH#vF9it^|A7I~|@g-dEy*|ZwcynaD3>dc^^;WHMXwBNNV>@nlIYH+e`9c0atPbpq)#RJjpyynE$AI?Z^&WJ-{``v~pr|V6E+QwR(&qPdVvL``zuXCuf*s$crwJ&uUw?+p9#EVK&6rM2)NMiAgMIt8iJDW zk@}_$P>K+fHY~CTRI5I~=j)cWxLG4su68Kb%aIot1}qp9HCD$_z^NHCz=6($e$ukz z;9HgDWkKHJ`a2U1aulC58SI2Be>`8v57#S8C(SpX7RhC9)}`yjMnF*Do78IXj{Ay= zj*Ne!kz!Vth;3E5`c%wwC=X4Z7}Ti%l`w_>Ouvru=Ma-Zs;v`;pTMhl={$_oKSul= z-^*DQDcJMXi+ozT_Xl4QmU4}=N9OxRX{}Hp2v;lGN-W@4@EQ({(~6k=FY+iqG6hD+ zbG`+nX?O=ovdy|$M{<3$lu;~7yPd3;B6M?&@qD5*RMUPmM-&DbB?ox>dSc|?5#C}B zr*=A+^p=auH`SFP&#KOsMF!Gr1-xirJkpH8CSf<1ax`zeNW7U;H}DE}WT^cbJ19=O z8$u;Q@=jK($M0xMjIwH0{@Loo(n&b4*CI#nOf#b6`CmFG6=IpEfQ(+m7OE z)0Zl6X|>r3od&)TX7~@Gv1hZ7u-#|IIIj$q^UBQAOQCHI!?S+#0VrJP6)iG|yBt`4 z?@+JX8~O%iv{xx3WMqeO8vs>j6EmoV42oZL-!UT=iS%(mIUiOmEuivn6l{e_QW?TIYbkT=^ zhf=b;s+32{a=$L2uI1|!vEDiha+RV?s({^7lOG9HfR_%yYR|iU6l)3#e!$}_2$%tn zkD~m2p^xTvRh>W$V-MI4$QH*OsyA_RMs^(P!N^?}y%2po5~7{#XroD70Xmg7C91Beq=5~ z$ED~?@a`qgIZqUlmvOq7wYno?gU;_KJ5CC<=ZnioX0PT!KQaalQ;c8bC(5K;t+x|0 zgiUeZil&SQSi>Q`1EyO&9fl8w=kOul(l7Mwz2w-xaqg zuA>po%o*$zVwz1Rm-+b>|Gbu_yf_}mYsr$0m+8!K)G(Hb+(cQsny-uYU@e;l^!LBw zk!_~V+9hSg2l9GyNnRs5z0e$9wyqq3?c|9iBC>*i(G6v!*vOo*@cq(o_!>#XASu{o zxIy|(H3BY?&dFK74g)`cv6fna(0y@)bJ)xJ&72|U;OwfU8cpe>;QUx<*-F$r%C`(# zZDY|-55_~6u|Vh`!x zqR-*E*Vcm)|A2o5mwIq<$#QFs z?ndixQxbKoP}e{8@n7q}22bmEp1(Y+0Dpe%du9SP8zjrb=7QaFit)3FUhOjEoafeFLKd9ocWF} zfUZ(lf!?QO4Sm>i;$XP0*L-g4A|qnD8Xz(gzD%obdtG~6qeg-;koetB-nu-6%KkKH zQ9@%3n$Hcxb}VKVoS;mc$XAu`a2$3Z;uYJ z2b!Uyl1y*IxlnvFIvly_)GsMsCiTddiU{xUlBl z{6E27M>Vlq4kUWLSYe+TqY>al%l$O?;Z@r8&aZf7qVqc`A~(yrgMl8(+{}Bn=U&mv zwm%RcqHa??;djDc2Hdhg(RBT~@ALt$rAT37>^wAfU1<11oSv%u6x(b#d1J90|HiKm z@1OF)FGz!xE^~whV*GpEd*xy*p&l8g4HCgaHzm z$Tlh=e(C8#F=6GYh7amW=byb8#buL6sz*D>23nKj6+N`j&{Cnxp<@zUY-z3|$ZPgz zK}@-7vbsGlrphM3GO@DDpsnb$ypLJc<(wDK0LWv)%#JdqY8Bi--4rmSulVTce&IO9 z>Qh9t*g$3g=0(b``j|38+Mc7FEpyOt^3?&$Le#1Gf}#L*$w6o_NHZNj<)ev#0@VJM^Q=1_y2FyX|A1U&4^C%A_|W{1a9ze4ZP(y( zR3$7rfik~MAGfeo$d71yn2__O>(hWTUAoo%fPmrN>B|g#oN4K?06J2ybL_Rl zRuy%;iht>6xcI+8Zw&u-I;GQXfsQo!VIJ~4&kO-~$hIH5xUT`9eY^9S5`^cJHqi%b zXMBx*ET)wPRBwa5VU?;ToscNa76Na62-MQY4yK&@aO`Z zHP!!XpL&AyT=l*Y$Yxn96WqGy14VggTLqSyX!3?Gn2mu+RwrWd={Y^@n#r@<-oOou z8@(sW<8$swzAQry8ELTQ(5YH6k78{q!(gJ?7|Yf`jY}gxcfO^NVBA0VqigFv$@#5U z&(HWAyB@VV^^LE1x4jcXCiw<09@4-OSt|JL{`P(v?IUzi{fA(#y>(YQnm|zJ7-vS&e`d+Prn>;aX znbAJo9xpk@7ru-<^AlR#rDj95gNj2Wy6AaYIQ^zZRT+|rW;=D*piBi3or|jM%j?Rq zn4dWl+_9oa?+eITNgxX3!dKXoKAAs&?~0Jo*(h_hkS!rVA*)+uJbGn36Hevaj@!^5 zQ(On{$18grPQ#C6iY`{SHtodiHY=@pUU6*DeGBIHB$GAU#9o`QK9~FIlFhS(!mw+b zOpoxHZ;#7d;gRHU!Mkh0VFmJV!CrBDz%xR3fBAc{Pi4zh9>i!c35EpJ{33pT?thq@ zNp@RnkOA0sb}mD%%Rgak*Y+p?m@Fk9aY3p(|6@M9HWu{N51!TVj3??EI5NzESi?UVU&JBCGv2n}>KG_p#ToA18WHr8FBC!Zj1u0jys(li{ z^ZV*Z6CAk6Lj5BD!LiUWut&c#PEpf@8g_gvP0s`sE}>0T`30kg zTL!j$MaRAu{h6*~{w_`PC<$G?o0*}cu?JzWpfLuVeouq1YC<1G5J#g9Q~$utIULmzutA@HG9UgN#;k7E=C z#EHv(at3jnKB&n>WXD5DA&!|uJv&BB7AQ4V{+LvVn_HKwrI(%CH*k5I7nS~U=p)S@2t^}#OM zN=IJGB+Dz8{(j5l8b;PQ!J(jq?|V>FDkShb&6bGI(wpeN8vOpSpkWeo)I{#9v+4IN z$amvBoOmJ^$u^$s*I*&46Ujt&86bg(Du(1+tt#*%2r-7u#IR9wqx1N`SUhluP{qDy zdwD(=1wn2azSKxt`Bgt%G{)zYnPn|7ze{u2g_kF9pc2-tSRT#8dAAo(Bu2LTSlbx0 zkt#Hmaq6Wm+GsJlV4z>&P=riMw2bZ;vTA?Lx2y63En3HVZ&S+OR;^JB?&~8eGM#Rg zIN{29^{>QrZGv>BeY&+!xI)2j6TesLg~~ zY~3__L)iZ^{LT(ZpCp;T5#QGa_Xiq#0xRAFx%qm79EAOn~1L%9q+y=DB` zTidwgwTvJNDG#n^AmS$a`@KL?#HmF_zEys@8DUDI_DTM7(#S%y3H7ZUCeKAZejXDp zYNWRd)^AvrpU5(<=vnv4SFM^>AJAC~Mnclw>9 z+x+!1q`54)M-U(Gb{rwuH*H2FRSV?ct_fXujaFdVnKe2|-|l_Z!w6UyV+Y4W=}lZ{KxR>?g6 z+Zm23p^AIz@WodFIWLZq+!BG~^nrdyQ7t>awR;2(r%FmDCyS(dP7+CqYRd zk{punkXrxYXcPD*%ms9f3=3zCji&G2GOc$ecw=;`Q-*4W19V$1_WCU!}Q zywRg+%(MpyllJ`vPc06?Lduv#kxBt9Y&gdJ)uE@mpv#{GWXq2{KDM4WZPNdW*4Hcw%y@-RL+@)Sh0h z59IucJEJ&J@}=n2J7fcW7`-;BGQlkDn2VH+DSV_Avx-y0ubU;7jrnp5r!+lC8QaEa zO8kn5u9RB$GaTl~Yw~3xUG>X+c*p+hG{0tBFo6XkpPErqLsb!p0fu^4L3H8ZU|1>v zjBJd-q7mM9L~|ax{4Ijxw&WNgLuH12QYfG2=OwQm>yaGvyQip@m-dn64TybJjz}PtY8hA90JjY`QcZ#&m z(ywOFP8`qljY1O#9xx$JnSXfleu19rv0|W|G;4pg)yrDw2X&sm%`CU|gOR%a3FH*^ z0wzInhsyzNcIds=wp+N>7g4VFx;p-g*cgGH|^n%5I99kK!z zk*A*~J7oT^o}T;P{mVjtXy848g}L6pW?s4%#rO|EN8TY`zb`5GE z8JtdcoN2bZTQsTeqrswXuCz1%c)gDT z1BiXof@XG`SD2zM$PnZ}f}x;&-l7$yUvVM;OR3m2YUBOgxyigshB7KhBmZ3#TWgKw zG39FjgdP_N_;QRMI?p5h8E6$okE}Fj_Bwp87SohNAUjyRaH97@y_qj=-F zA*AERuh>JOTQiX|${DaXD<@q$sdn6*kF?99Yz>%!1(}zcx|f0$Gb4&$%Jpp-`O8(# zaC|idC*uPZ_tuTSYg_A_$Ictf9d&+J3Hr$=u#v!kcV*byfsMkOrF}@bqq6XA7onf! z$wJX=V1ekM%Cma40BXgh!%fDD;c||dnwN9Lu%M9snCB7Oi}~hFsq|ck7`kma zr9Lj+Cm#ICosS|SZvqTDJU+@W4^bjlo(cJU75{HoAae_V7e_lL^P2SqQd+<=Bg}s@ zbTmxGRCc)x<3tM|ZQb2YS9kR9lSpR-fIi2fC7qSo7N_}=(C_Amg_ty?8rL24)eej^ zj^_b_nXAyhF$!peq~%+gZ-BJRRf7!c3HFDxd~2jsWAlBq&)aA}4H7r9hU?lk?J=Yn z>=;U{F(-`SAe5PLo^iD0L>b~^isAq`ONX417_Luh)@_Ih=XerG&$4H}?(X{%qg7-L z@H5i;zY(+x$@_-=c*Bv!EwMP2iE2M2MRq_*_lj8ZR&{$Mok{)$LvO1TH~fAHPd2b& zmtZY6hg&kH0S{7tNe{YS<-`fM8@-Dnh)X(gV3*=SNMD~T?H<>q$ZVuC8E8~Jyk1hq zl(Mkl^x8(P-MH{Vc?+xpQZI4zy=pPSRDqhy)Gerr2UmlWV!9XMsv9r8wB-QM zWg^;(i%7N18oXBa&rVY~&36l*WK3k5&mHri^37u^f1())86fJ=Bq0jWoukGKgLe(G zG@P}2b$IV}0L=+2wB}p~gxD3d@9m!PiW);n$So~7Ru<1tFMQU&xF_U~(05#4D1BVF z{BxM$Lw)3Eoc=M`%V)(w=a_mUQWl9&-*r8H`pJ_?E}V$tU>P?>ihr-E;Kk$+cvZNM zA;$MU;I#8i35?Ux>?d>s|KIh`Q$)c)?zNc+^~_~O?#W7MxC2R0?RG8=e-ste(71zbSu|;GS2%FH8$~sS0uoEfS+I zFSBsCpgQC5F*)Rdsn$S9(rk~%pXKtEj?+fEr$M4jyb|VhBoFo()^7Hgj?(fV@j0SC z{rQf~3INE)r+ct)0-49qV)w6&%le=e?~Ptua#kde;U}b2qkH z{er7hN=V~$SEH960`%3&oXjCagr>8*+`5Yi_i+jXdkpklK=D6)alO!4ZgzGY_=rrl zQ#+qmFGa3QpZ$OqZv;t_kouPJ&9ZE}511{jCXij`POGtg)MC?#ShmxJl|O1t6M!m{ zX-LCKFe?TsK?KDxgOI#Js$^<#ge)A=kvC0B9R(d0r3;Skb~GJ? z)1pGz1QJD~-M1ZDCd2JxmNnC+XfCQX`>s3MLjH)H`EG9Iotp?Xi%9?s$28ui-rR3# zwV7B+SzWQ9eJA1|XzhPId^3GlpO^Zo2Lr`_IlQKs=F@$Z8iEM@1yO(vo7JUXKyXCJ zv}OyB(jz|$9)c1d!Z*+vGQDfuxoID@j={~>nY4uXDYszJ9lXkAA_be_IN&;^U>`r= z3cuhB4>;#CufSJN*$CfcSy#LyP@`#5NW_ojhJ{@CANW8#Osn|AgOT_8Wbo)^3mh%X zpPxNvpz@}R0^xkcHLR=ob?iL)*ybKm> zu0}{C(IAeq(QOm&$oM};JS36571cVDl?(cxS6?9W$~^3lJ&E~0jQG1C$Edunn2eLhs0@jAVji28CsH<{8UZy;nOt$UzLEa$c9>RL|Pn6NuP8 zs&5byoD67TN##?q%86Z_X~oi%mNcvPbqz-B^Y_wH$T` zDb{|@#g0R**hm<33vNDwe(yLe)^KlyxFuabATLx}#29;_<;NiMJRtr%*97z{yPgdJnzY&5GtSoj(fkQt7*^6{Otvhnxi5(9PQ&r zWwmI}qN27Al%EWSm{5B$S8?C9xAN4<|FbQ$Ai*R2go-4$`g&lS*ybw-f_Fy)A6AFLLDW9}@s` zE6LR9{+YpWT4xL1bxRU0=UXllPhdgZ=uT=B%|}6Gzbz#*b3_uql*-CV6V+= z7hlWI_KnqCo(k@H5%4|Ci_FjJxrOnIw(N!h5K z1!+Auvm1d*zAdoVTmWEj-)_%|I&FdDltZvE-ek*PVb`#=#}W7C<)}-pbr>$zd??=a z$p zyTwl=H=NXAY+9@lEuP8Wlo7x9YXrB9(HBH5>f+1D?Y`l8wm?dweEGI03;gNvy^j$$ z)dE|xs0A2o$;q0or2o!@Fte6(-=ZwSPM~~~xx8l<^Ih_2DV*;-E13h+VjbW>c}l6; z3LvJ|za~q$H@B!=J!~k!SUO3Pw%SqiJ42zG8GN!Y#E%SjU0o;uWt%GhDVV(SN0PlR zMzVfS0+$=h3ECHJ2kW9?_=plds0sE7op}`$fzAq>^W*sIXO88}X0_qs^tEn0=bMGr zz(BD#%Nidigbq75_D)K4Rj@rD=%;tj>Jekv!t4_`4~|%1TJ&d>U}B#34_d03R*QS*T}>j_{%jIZgT;UxH>;cN+Qd?krY z24;N4@bHCs<9AkV2++F0TXAO5?fgGt3uFQ=b^oU|^IsmI)6mAf?_I&7Qr?sVt)k=G z-XrQSGFi5LRV3`DX}gIV(?yQY;D6+*Bm`LJ3>KYQ2|Pa*<|^g$fPVq-e`+N5q%hav zgn!}BR~^oQ;XL<;arsR8pMeDcf#d;2RbGtTt#Zyd`ea>lM%M6LV1}t8!LYtq=aQFV z_*lWH@Lmn=@GsM6wETy#Bq|;O!t*cb>ce%3^h+^Z#cWY$#j&W;MDvn6p0d0XA)IR( z#sF0Ajhj*JowIUA`txdUjGPX|5{S)An>og#@;M?L@45g(pdkp36>r6aSg~+V*ToUH2C8AhuTGMd#SRTG+Dcb(~bgR}!v9(MF>|Efj8ix)J-aKBD`okl6`wrVQYaJUpjq?v> zxjYPJHus~Ak16jlWzW_m)$pjKhxspxDcb-;Dc}6AguIPbXiO$L;QNFoioVSgi`s4~ zp{;lS4Rp-0^8lBP3-lzO#a;0N}%4OfWUsd|$+?n6GNi($XKU3)KW{K3b z&SAdwZm7U$jq;G;!7OWPkfTTMDNk7l&UKo19a8IM|aB1oG zD_m9MQgLD16sgI|6J7NkDOxqSHT9t&B*dSB;Lv`aCP6G#l&(1gfNtw_vrD-?z=PaB~~ZhE*tgFpm>`A|AWkyzl{D*-_Xc&Jha^vskZSIMg~$+ofWoY^th0 zw6{qXKtLD&PFJp9Cj?b#M|IvqfUSy6nH>a=vbgU$xpVugr+vx1LF7;hM$K!o(NdBF z{WjQn58lgKP|7Qu=Mk!x`He{q&$3&Rs)buF<%f15>a20~ptd2Tc6lHbC;qIQATdhk zJ6qW3P$NcI!`+*^7X;Ld-4n||vKF7R_)1Sa9F)>;=~cekbwte68V1TM>&J<3oXOvW zt79`(>E-D!hXdbj?kZKOuxEKy^`&X{OM?ar9}Ow4?}a&iW8wGwq|>{m zpli4c)+_zrw`w8O{&d`I_H?~-RTp=$v>TTuK<+Q&1wqF^5K)uBws>`Jd4k1OUkB=?_0Op8eXo?TNz?uB<3rYXtu7 zpQT~?6I|a!B+q-udnz5R-Il@z8QfMsG4Zthx8MT@u!I)SEr$U(*PGvD=GPvr|3}z0 zfMe^?;=~@ZMC07&6Zz06N$qs?*eRS==$+s;HFgk`6JviFdv(nx8$(KU_jpE3yuL<% zQb;ZjPewMPzV~gw#+Rr>0b5B);`M3J1esCd8vNvX!G#3Wf<#(r`9LEAB@z-(18BH8IMf> zUM?@jHQjG^Z+9y!ZeH%j#K5X(eZdw(?Q2Jf%DVk5i&yb^i5#ovLp}!_T_(`a>wO%7 zM(T`3HqlwWqoHUP%QX=ddq!8kP`(W3cLM6sFp_eq5jB3?y<$`^HC+iLS(+u16qv?z zJ$z0D&}^Ru)IO4nm|R^?koaJ#PN2%r38xF<4;W(2KH6L9S{L*=BwNTSeO6IGqb;Ts(6ni~mR}juhEkJk z4q$~j{gE?pTdxz_h$LB+ro#|6Z$OWvOm2-FgFz8j&Bj6{r<}~5LoWx4n)A9GD{(zN ztxZ@_9H0@m-?)~_$0U@{6%NX9RU1JZ`8)nbHz#8yBlR!)s;Y!KJ=dN$C|~H;^xHu; zPsq>y6f6In!}8894FPWYt(S}B*Jm&VB%Xt_K(Lh6k3qNMQ5gxhy;H*Y| zug)|CGImwD&_qeyXyuOzO-WV5>yCitF#C7n0)dFlLx7-ikKDH5htTyI-Q08xqXMIR zFOx1>Q>vIEu_(t>H=S8R3B57j7Cnv7`q@*1x%KwgF4GIXa@BrQh8*>ed_$8zFXdzVw=u_myk?$qt4U+?9#kCYVOHvb&rs?7{ z6alc!jl+>yH4n*-&W(7j1$Y}$siqX-FP1?L@W8p$V;>qi4J z6Ur|3#r#R=Ju@zZ;IAKzTPEEzsi&3@+#Pd8n8I73Q4nkZxeT?^F2hq zHY?`=eMDUnyO860VW+4F8BQ}DM^?r*T`i= z)df%W&)_E<75q@%nAH0RMIwhUSI=<&MOpb5_zXmvz>s6)PWZX$s{84k!l*D>{9@`Q3 zINn>6)5>}4h<)yL?{Y8VyCmI9D`6S4$sqg(Z8+o7FR8I{A;Z6vK#uIl+c(djoaQ+% zZ+%f&u7pWlHU&rfKh2r>gAVO{QaK+D-xnN>kEk0UvuPt&HVi7-pbdMLq;d;cbP8Jq zU-mk57FVNB>fuyM`Yms6v&zPi5PXPhr zV)t_sVX9h`5*M|#ZLO3l8ERWz(r*2+2yoxn)wt}55;Y@@PyH)vn6ZEo^iL``Y^^cC zw~5;5eH^rc-5A@SbEOn%MesIfm?kZfRg7$9LmDw<%bJtM%X9RJ<6TM>#bLMM+g% zQ`?eu#^k(U!(8rhkxKLVR9Hl4j}FbF&L@X){x_uXbi(DmE^s==H}Q?uFA#md-if=y zP)GhSIY@xCO=#lx#l~ZAT$_t|Z_nvvmeof4qjk$s%imY21aTXm$PDk_B=%EiBc17q z9@oV9mhLPz!R`9OfZ^p$+E@7hP>^1w1_Bo+Vz<6?oTub0gBzVECtDsup4}?ZV=wt) z;5Vau&%?oOGj~<-ZQW)NEZ_>~`=Pt{dYCHXo8p&IGvu<8 zTPK3V(oWB7MTXjmO+k`U9Y(s0V)}ygaVUG#%UdV-J)-e&xq-Iq`}MTU=?GS4DCyFb z>tqkKCDdQ$P0g95+ua$7h&^e5^ckZVJ+c9ko{c>&y9*MeeL^P>OkeZ3Jnc2*EEzPr ztYN8DN2Z=?;m6Y~-(812rZV4nG+={k1Bvc1(Hd{lwxTAm9h|GOw}mG*QRoff;8 z!gn#9ZC|nv=jl;ue1#YEXz{@-_N}KuBRSVn%)f#)&P}&lz75Ie16vybn%OSOH7n;xR$2}V zs3~;PU72GQ#N$v6dHY;*Q!Pu(fiJ2+-lC!h`BaLxT!* z&XDK7cLn4tue_kwJ-xlVmctq3NsD_1Q)P!Iwu^)#o>>tKM`xTj=zr0f(8jZd5{&Q% z6P$X%!7%>$2bfnMum0EUUSgwu)<93_JB5SsRGF^sLUDx~Ma?RQf7ta0Iix)W$W|P0 zjX(n3pNm{prZww0+J+vB;Xo$#v)SjULge?x<<|3s^n~Zv$t@wAz*(~bB7;yPt}OOB zMH4C6$c!S&!D8D{$W(0P!;a#Kj{-WOLFav3{Fk*(PERjQR0uRzM9` z8BgJcm~+%#sEzVReQ2r$vCr_j$Z$+cm$-XW23x0&Ulu!A5pBva!MRhr#bvTh(hi~5 z*08HPX%j^rc~mL#c+}H>#@UXuhcLH$+>P(xe3Y-k+m?pxPvvdS`%JFC*!Ea=B^Z^Z z^{fHD0QIQ)%lgQ64$!e^bc>Uc&gDxJQ>=9J0v zDJ~h5XX#}%%x^qaJ&hdr&zx!28$j-S{oxdj+hsFv|6|ESYnb~ic*G%VN&VePo%xha z-oem@v#^tKVvN|lue|Y4G}lylx$}2wFrEKQufW1@Vtg0E=honAvePZZ2P}rK{z;xy zV1O8wQelj#zD*B6OC%l4YBLDpL zI_e)wo8S;uOlp&SxB|0%R@;{#S%xlt5qa|<)DT&>V+|ij9tI&9N)<>`UHy^nme?^m2}1`%+iL z$6QJSu%xbkL^`oE7rm0c?T*BD*}&&(z9e|Q`EmH;?^Cy1-p!wEY=NnvKHZh`Roppx zj~^W^)-UKN6KdPUVPUN(82j`DC>RpzZ9Wj%-MFNapmL+8Z(|UOgHKaF5!4Z&Focz8 z8N|?Kd#ahB@#z#dTaq^!3RrF)BfqgPN8 z^FU)7v{@XmnT=4vW9l3f8JTk57(jv6^i;ze_=uvYF-9ApV3j^~X$U1;2+5q7&SOV~ zg=N6Dw1X&D+KmhYtt`Xk=VduGLnJ*5ekzTA-qsW<((|FA=wtfB^ujDit9}w?ceRyI zxz6K7ES0ZLeI!mkquNX0Ek9iEfMt)~WMWPWGiQ=6KT6JeG+Tb>-%0yJT(G~F?qD0=c#D2)L96H3>i{~#vog}LrvP%SO>&gF79d((zR z@%<&tEb=*dlTQ9cJpPyZjGESF-X;#vTWzyW!_%!|8#cvNrQhH-k$YpeGHeUyLYsuP8_~}!A#o{*=~Z%I0^d^ zg2c8rz$?#$rB-?0J%7pBdK<^7hAzEELpy6AJCW!j$dyUZats!q5g^A%%Tx!^HKjhB zWvAH0d8R&M9SUhv5|s|$rIpU3Ef+V{uS)|YIa5Rr)w7$mtKN>YbUXyvaSo#*KI2^Z z=Omaiice4Oo#KY7VdzCErZk`eJTa$2==S1nFi`sgZq|1B4nS8bPF+7a9g@;y#U+`{ z6&nYRunbOZXW^%zH5kzdLZ&dDN2kOGyagv;zkBP2Fvher!0Tx+-m@-A3s=@k{4$`a zr}A=T#@{bvb&-NudL1eeP7rs|00k4?$OGuZTFZan^j4hlT-_#7wM=PFVM12YsjW{=ZD5@z zvdEj>NBPi}rb=7mnSFV5aFT;9lS)5`Gm@}>qI>G<8Gf*s{18_gdb!XZBaSEFbbOAo zFJd*98YJ18ZnoRW6ZI4+nyd+M$5ID)tbWRLpCZ7|T;$e+rinyA7CJ!f8Kiawj(JaY zU}LeiYRq|RIf_{M3@U>f*`vJB9uW^}O!-cmfZWorgljvk<^IMGd~6teqoD))CEt&L zK&y0j$4AStVAug5u;8LK3D%~6v#tlznLgrpiPX|vZ;@%H4Cq!12^%)l9o-HN><3WH;YsXs)qR+zX1ppM ztzK0oc6642NMl*SfG*98St@(Pb#vSxX&6)ug4iL2_jk`)AHwdIi)FtuWGgw8ST)Uv z36#n;(M6Ei#T3YF7(70>{yZs4(M@2YKMboc`#LO5^?(l^L^@ztTvTXj4VhpBK``@K zP|4LbjL}l+*%o4&^nY7bSZI={rA}SU{GIBj#egyB3(>#Io8~DIqpb{^7!qU)R;Xab z;cE;b#898r-Rj+ot2!xk?qM1c^d{(w^~LD8HtjuP0?Ku$=Vv+HtMp=o-iqfZE<{nL|t8zt_x7@ykT<7{5b}3&u)>f0U zwlv9=S7-)jXd$YB^ou@agC;?xmE5NahQ(CrmeVv!eKkR;b)p11D#;CCfkL#U^*8V2 zd+}eVr}@^|U*T&3xdF&1v!|aNdUk{IRxrQO-V!%EhqEUX`Pn}?H|y5(Av<>xe|OaB zXFuuVAW{8m^^Q-Hir=w@%4!(cYLa&P3cvL7hT+W%d*zw&w$JkR>-RrW_TlXk{u;R`Cp^f`!s&eYr zjGy$WPw)BO%6;Y?!$;F;rnDEWN>T^9FXE}mm9Dj3kXitSlZZ4=_;7t$CX3oZdIFzV z3Bz24!%%D(tDrBYW`@|ft4UusRHMhD+F?tt1X&x%&7N?K)ZO)9V*SALNzwb;B~+5r!Q{1sYMhD?W862kpL zycq?eYJvx=v{A9DjP&kd(Z-s@klm;Tl$9zkV&Znnu1S%hkw={e7?Dw#Z*49E@M=tq zQWN~ll`^U=;@G87^eCJmINP%BvRX)&r4*V-JIav5qL8pzG;sWCh~D&3rNNp|dF=z# z-4mYL;Gbu(+-l*jh!Ab)*V6+$C)*d~mLi)f3# zbf-NP;+8Q{vS(CqL@3P5E>j19)Z=~q}Lf39y^^fP^b+#%a-gIj~Ef>oKK zB^oDRF`P*_UK4FA8c>`W;caF@|;~Bz@~N)Ntwp+X*Hj2i#FYGT>W$Rw92h-y)pBExn$O!%g>9?eo7F zNe1kE@!wv6{~LC)y8d6Y6N}Y)?z*+lSU3!dzCluBMq=*p4`X7QF@VzI zNIcYsW&O@nah##|U{8y>l^NVZ?C91RD-T8k3qh)!Nw_ z>*lIA0qR4VkiB6lREsJTzIAz)^}q2G6K!FV4KfJNI<7u<}<11n$~@Qe@gw zZ(sUV(P4j{1=(I+J7%jRWDMt*=#pXMo*M>?$apAy_QvDCR=LLaieb6BKbX%wfyVpk zq)b3q)hkx7<$;lfs-&b+xse6Bqg^}hrP07SPuvWu zY8JJNv7(TxTP|qa^?1LMZR=j#j5V+R%w8acG&&~NtUq1;+jAW=8-_E(n^wt2)+{@x z^&VDwY<(X6ijf6MA%Dl4*{dmtTxW(W;6PydKJ>s@|7yDb!?I2_*k9*KVj^5(WH zg`rSI9nB5CsL+zNj-MOiBZz@-(9ZKu|GSEq@MKcubzepJ&wP*f@!uI*f;RGPsP`Ay z4R*j!nWgnk<+bP@Fqvs3yLt8UhkoH0zLUNZNgNogaa+9>%>1hm)O%ib7kgg5`-cO) z0w%R-^N|0HL-@bdFcqJ;;!nVRYM&%SZ`B$}2P{53Y0_40>Tv*azBA>nZN%JQy4Yo6 zMBgZ1hTseb)1#9i(x;Ebdclj;i5P9qA9CbqF1jrp3R5^iSZiWZ(uhusxC1!(5}oX~ zmPnto24cH1^S;U&f!uKW*z*El8olh+&!ZXGjkFRvo7r54=QCw4>ZSSY6F5w6*C+1o zHj7Bn+RUt^tKE7!UKu9o9c-$1x&!=iP2IIP6e*n@K$0K^7GTvS@jc%jESw+SPH^rt z;F==^SGD=efo(Hpp$t9eaW>8k*N<7PdfO%KRuhorHld3-p~DpwDgNB5cvT!*6I^uV zq9vh_L?&l02HbKIp2|}Vgp+ws7FWfdSKTz#Rmf9%)ebQaW|IQ(9f*{7p|?!jTSK&$)$+}wDNQ@&ZQd(X)4!kV$N}8 zltv!cl{pv&Q8?{4Q)?snAC}{mvl7|;E|Z$u)pSJhilHYG`>wYulFaZF8d4=cCctr) zhOg5%Y!{a!1<_phs1=VoQ|8rs^Ch*M^H5?ekl69ltL>8~0_GRRae@d{an~Oi5@PEm zp$jc{2&lZ4lJB+4rZPK#8ilI7jZ%6*vN7l=jq@x2p7{E0mdh>IX#rpVM>k*QmkdTA zY}Nj(SG79mGusc@IKOVVVB0HpWLY>Rt_+km3vZfy>c!1U2p1?$^I(+Ed#GiU?%}(S z->;1ezl_3c$EI_oz}VWK3Y&-Hn0`KMVeEjt(>dpfP2iS{s|qZI`ynRU#3?!zswZ2W zh2$}3$RQk5)zseHoyNZ30aW*FXo1pj4%0Sw;%EaQL@qG4IAS3c(&Qs$8M@2Cl2$Gn zCTSkoJc&7!mwD8;w#;-D)Juc*q0IVkP`cm`f?*q4@{Y{c=X;R*$oV;aFtIX@S8QnX z#tKfGoV9Tr(s5OcL}*IF;DkdwTFX1`4j9Rfdnx%)1xN3_lj?Vpk&R9J#b?^dUB|I_ z%W_|(l)YN>O|uqO^}7Wm_b?!cBeuWpl}cSBz#+!J+J6?oVPZ7(`DR zp_ySazUKMgv|DbySuH+*y*-Tnryb<}j^OcHpvS(SwY`^P;*}wrE8?Yj?)Ey*{*@&B<{lu!ldp; zl@#-<72NOgGp<3lXfgPRN?`c)0hdA|R4j0p7{ zH+R;8d6IomJLf~So`4sw)rBH@9e%tNbwnhdS4#5=uZ`;d4yzJfS5tC8Y*5_H&Uw2qCd{5vt>YoU8OULE z_{En*V$-&rfxTQdCbWLb9=mXPaiU1@wuAZjDJfzdejD8@MdKWpVe<&HHF5OI8PW#j z(^xR}^ca zEh+#kKbxi>lO5!X3AT~6V;_=}g96>m8K{~eA{noLESKjZ6^E<2!M4akqRZJyr3HSo zpAh8-Xyp_@rZfkd=r%x)RyoB)w~QteTEJGK@E>Gz*eYfEN~+a5W!tx#_KBM|Bx|n4 znUM{?S9KSz?OyB)o-8xIbbnSr>FYzBxyFKq&Vt>X!*61|@?*HIA*8XH{(iy;2z%?xT69U}oStDhQObz68Q@ith1pzDhLhi$d? z%)M08{kci%2+H2_m_(mG-y!Y)++Q|H4Q~3~$~|Lv@Bh(r{=Zrp1@Ih)9$+`a?noW- zF4)BgZl=lnkq<4bPHbBLh|hFH2&4Jgxucsu^iES&9n*1CZZ}CaqD1!RVSB zmR7CZ(sXWoR6nMP9QP1Pef}G-K`E|9oSJpbp1Hojr1gGd;}O9EHPol*GTr!Fir(!$ z%wyamKL~rZC0;FEI>j9D^p>Qq%vG1Jn@h|I&rEE!HBwOfIEPtbE&|w|f^TjGSNXei zDjJSqxNon_UE3NX%j2_KgWA_pVlqlQhSMb@4Put>@HufqL)#J-FKv_45K65`g!0#~ zb&=4O#XN8wa^NYUsd*eP4_nVCeO{hX`y5uHjdm4rV)$IE!M&YXvY;`cY6x1ZF+Qku zo3Wg(@xri~A3$C5l4Nx=6g948i9jwnE4Io>up4VmHxeNkxkPadHJiw`JkTg z?<-<&zasS|n|B7<5x!IV?qDgB?a+L@E3eKOQEsdbzK-!;UVgkWILr8OkI`zoZj<`j z(Qd-r?rGJdD0GPw*~vy;FyOR@PA086PoZ1kBwM$X1dnf{THQ1A>%l2iX7J0iBTyx` zMM2MHI2n1k)l-M8ZoD7}QkPrEExMrU^>}P7rS**&h_LgIeRwB6&YMp^>aVd;{g1$70|O8ApSoxXcD+4o z-~jlOy-Bx`FLxiZ9ykCizAMf?a}wboXIKbH1$I8X?S;Z-u{3UbpSwC2E3nRn1SvM- z+128pd>dBY!A;uxx@;2Nv%tu!NRgfjnTzq=}>B9xE|mGjOUFTRhZi}*zTp@$AH?X86-+Hp#yneOcD zoq7b92(c=TagoSnCFR5|B-9IU$(jfpjELkS@gTIn!2tVZZowNGec#m-Jwmgy5ZCCc$HYP0NDiHYa@da%`Y24qI^R z_T%~or)jX9_p{(BcKP0aW2EVV?QCfz?hirWn9$-5cH7)ehDRu)`VGZWQoBrdJJSbx zCROmuQ83;kHHo-3t1(Inkt-L4>m>~0@lM{aCdX+ba+kbB#T=fMHn>_b?DXr)S0_oxk_P$R`Fz35nX z=74+VL-V)}PPhDnJQetstMIVr6{%kqw$|phR!`p%CP*WQip~E#qRuOTOZ{Dhes(xW zpXEJ54YzPk`V;E&9xLaPlRefKMp3MwT(iXFt18htVRAGeB8U1he)Fe%fKPm6?T+pY zA+-V=35F8wM3pmZV;(nltp;~teDaBpQ_ra7J5(2JcI~o<*OD-3;N$hy2k(7CJ4@>JbyA zV}}?GCo@Y=9|Bqq)>`mpXky;=A7CL~;wSD=&a)U(9j2N~Sp2q{QkZXsI^&{b@nh zc2|&6bi_K_e!YBZu{5r+CNDTxzNuEx(mwmQfE62k(+oDz^o>JEWeV3A(6)B{CYfa9T@DN%mr_K$`p`Q>Nr~8R(3KjDsF3-3uzU+Ot}y=Fy%n z^oddsR6BmTRV2;96634Zdd2*OKxN}~XSIe_EiOdA2K71c?d(vsFh?KSpi!ts@~@+r zVJRO6fQIDW+h2dCfH(ZVT)CeE6R@WrD0-*Ye#6HyVgM$_bp;q}ZG!15XJ1m+S>NWd z#t@SrosDp(y9k#CiZygJnz7bWu`O$sq+qD5IX~N5?6O&t0e#8UW;GWn=#s1bAg4gW z5)0*CjiOeTY6g+-2B?p2Yi=~=rb7@i<<7KVD3w)&hNd$YJPPZ6w9L-|HnolH zJ)c!Q718d0Z>D)<#CgUywv$E!#qA8?!dz(`7VwUksHWS$-sIj$rBYL7^t8I>IaBd` zce_;x$QcO)k&)cp5H#j3HBH|Z=C}Q6s#$q{GtdR^(d+)F#0)ZibCm@rSl$ZM|H4-N z$C^L-;ePD5>py2xX6XL$(0T$o`HyBVFbkP?{o_5{&x{7&0Yxj(V;Vw|U>Y&r#Xxr+ zY+i++;uZ#G%F;bD%Q04M(j|t#wdqpmTI8CKi4lL_FrDL`4eSpH9T-bmMS%aQO9zVe zAc)5A%9<2PZ)wp7gqV2LCve#YyU8t|y3HcN@=|cg4-1*K&chJmJj$9o>ZB;r3yx9H zIOVCs;sEv%$fw@S`-ym0e3tTqne6bS&Et6&M%ES|h#m3Zphn}|N8gw?(Ql2wa<-zO z-vG^Fij`9k0q?>XqzIg0;{zY12Dm-SXW=kzX*4Q8q8Ky0=WX zVrndemaXfQhNxspN({dEjMM@pqo`R8UxjNy39C!_ZI!*U6wbN|Rqh>dn z7Yby~@D&y5_xV*lH!&%(xm)%tZhfy>?i2p7n>6XQs<8|%-fv=Ltcfcq-Ni1I&+12t zJAD9b{@kYRRDoPboArqco9$2q?-=A4qs<+KuBi;~(UTqutZeWRJ$Q&9N06yEH(oh8 z^j>7h79)4q(EGGS{ry$-Dirm+R!L-x3b?|?Nvt`K#?LrEGBnpkFjs3pq3(a=aM^%k8cdJ{uOa7Ubl6dMm*++Z7*l=G8Q4 zrS~s0HkH2)VXtM@V?n!&`#jP*U(#oMDo8>my@n8=`&Qa*#773czjvfKWPM$FP=&tc zg{!g?XLa<>D>vvYmTaKvuf*Lj%240+7ifXd|MbKFyI;R%nEXCHdR%%vAY1-Da-%eI z*3;K&MhdPYryc){2mCKx=>L^9JHG4Opg9?ty6^VDez_5@nEdNut?sDq|CGw7M%=-d zr2JwAMyV@TU9e6v=wsODzu0hi1IKiJL)Go7IdfPMLmG+AS0UD(-3=$c41@)KT0yB z@wf+pO0zD~LGaBbFMjCAl!<_B1?M0;DH%N6qpuU5bw%oRt>XDJU`~Xgfv80K7f)*s z+nZxE2gCs!ee|<{@m)dsDPlhFU|&6NiPF_bpwg9BECit2d_`uNVGn7J!Bdhvtv+Il zuluWRs(M^=+@)?TS9uw(22`TrVv@q9rQBh1Tl)yI-~uuhC3`*uK2Bn6Eg!C>MN{@+ z?Sc?=uphasm1`x4h3i`VBLGH%$|r>%z`!wvHOOmN3MD`N*#3-R^E=HwEW_5AozppA z#ykG#)-N`ekwD*&DSX({(iHt&k`^G{$_g7Ak++t-w}wV=o7DL-=h;FS9w~>}fIz*^}wLs%kX+rX;3EQqnchuMKW}0rs!>2+;)<`S3mH zyPzFM6|_#*VftF|n_H$lPn}ZTlj2A-{9MuxyZ1;rm18LLAon4QWJX9JA$93tq^obD zD?&#u_L;j^zc-}xxa~34GM&*oXVB=}WqfVj1UtBf?sX*+&;GIbRmgrk-L$}&9dMPX0 zNp7nky0uWqpYE}UhY^NI>&vPbpTISEsH!z_<2>bd?;n2Ge=)wgE&U%_ekblTCPhm~ z9jAK2lOig0wKaITJB4`ANS4y+xtCA_h%~uZ@B9M?q9DHoB5Qjw**S(iQRC-cp&(;{ z?ch<)+YTF9}WtERcIhnnTveO{U zG1`!UfeYHQL*iJohW$V&&G!HYAKY2dEssdV=x2(JR(1 z#w1cFgJIFV;+DMg=7#`ZuVZ16*~jS=NXr$3*?m)I_It-zE=`K|B&e9i^z_L0@5=N& zB~eps+&6@9PdS1Bb{k~MwHmK_W3Va+K@fdn?6y;+xXH93`QqyS_78$F6ZhBeor|vV z>VM`i%APGmUkY!rSi7^4iw>HjSK0{_MYhCPhwKvR{os z3cY&fDnQ|_TbTCKW!+E6JaWB|JzPAhsHHO{;1KA#^z$jCTc(58m0es4{OwW%R}|O0 ze;XCsk#-&G!0wxWA@Xj|UOfyi;Lv&+)&tFSO|}H!+!9{-xc+Y{lGBI(8$xxG-y3lD z_VOEicG7B#!tfHJ_A&&vLRLW|LI8yd+!Y+48|MJ~HbH~lm=poQ8wQ-HjP3iu)DY;p znmut=oeb&G*l2E1P7YnBHBPB*l>dXcw~C6Z-PQ(!6D$xsxJ#i$aCd?Sch}$+C|rZP zJAnj3aCdhr0t6>G6mCUu>B`<;y8pksFZ%QuW1kzwx?qh}7jwMtoR7_E4r*?{8q=g( zL@n~GN!u)6o>I;zzE`NTB)K|gRqgJ^29jfZ5ERK?ycm?|)-0Ugu-gr6}X7X&Z_YR!?3!B398W`9{`q8iOIT40$T zXCWh_Ow30IP0$8Kv#V#g5zs30ZSk-65wpmW7o&WmSH4W~S=p%+*}ffv$gN24kfy>} zL?-D*Ia4!OszA`Z<==9s>mI-ug^7$eZ7h~ogCewQ1cMooKVll-05ui&Qg(Q>I6qXs zG3tKJ1JO9e{Rx9FT-k`ra~ln=sqNPpH&bU`2Ao5GR_bn7>>KMwhvpIu3gHqD7AFW6 z(mD71A4Qn||0${9_ZM1Ag*gV?t|Zoi2yWvKF|wTU?FAhF zJF<$yMu-zE_HVH*MWW4(S#^!SxiH04r5OcAT4Rk8M?$$-Fy50^1AhW&Mv>AhbN~)N zQ*2E~t<1h2sHOd;7n?gOjp3AwwyV+BBA6S^R72~pQHg8Vh)hUcS@o#_eV;n{=p0-> znNwDHv+2@0+RABi-1lXlcOhY7;&@=QO<6`z&T15Wlk+M=%5LX06v5?a&1N1_i5pw` znA^8f(#?=vrEJ8HP48Xa&vGfJWU6{Hky2!PuybH@z-`=R8%n)yb(a|e5@HwT{beWE zo0^!I7{m@~3K~axMFij|u2+<&lz&|+7WZ9g#W4wOY6~smuNDC7Wf>*)*JHH~8Y+uY zaym+F)KKOx0?Kf@uHo0NX{!p#G?QokwE6f|P-se{Yr5v?!bd}cczEy##+TMXFbCq? zrbD@QL#INl;m|IVrZ${$Ob#>&$F zGU_d`#<*Y^wWB>rwgZSleDs97idhV_dt7+v8{U89saytN*UkMNO750f%KKn99~eIK z-rr%AXNMs-7qjzp)RvbAJKx2n0=%kxSQ{1WI(VEU8{#_WS7hWVl};&a@NWgpRi#ztPek!4#8_xvpbxu+g6259()^Tyf}eGOVTj-^rf2-MLBoKlYXhbMMAH zw|u=Mix| zQEtlRgM&SM$oEWcq}f&|eb^68AYwPHA68CF7#VoSX?)uPtA6p$l+lsWOGRW{L#Ber zPq5{X7^85BnT!$=2I2LhA^|9rin7YOpMY5HW=e5`9}Q;~6?ll-tA{ z+(BYkVZv;kmaN?^d^bsCv2mCaT^Babkl1jcp!tc)HbwIHB~GcWhBYo43n?5DKokMwe5ZlcdeYnuLL%>c6#5+TlD$L<%LSXD00 zg~!bc7|J2im`nKPGEvrWzssv}R||yJwQ@a%J}!#cCVTaOmS=G&1sb*KlrzWn-TNZl zmbcIAT63Xsz{7*pC+ELB(8AEa{RaPU*Z8xS$YD-i;6w;Y{JX6vS>PD_iJEJlv{$vc+e zhKE;1F`8evdzgfPdJdovI`+e~wofm@6M3W&EK_vfY!7D%<2;}{qfnC;`dSGIChqSt z8xP3Y*S?0}lDO>ftTx*h`_j66fm+|>A_kNP#X^tepfkHxfq1z$R1WPE-g==;t{oE+ z%K}n1iFLL*<>j|H$t`!@3&I3_s3sS~3_0_|zP!zWO^ulnMeQE(Ce8^lL6ToUuCsZz zX$64BhBu5#t4Gki7D-C`9k(+jV!qPM+HH1&C+6PnI#@72&BGVi-uE}gm;#iwl!r)& zGU*p&R1FoWKPTk@#Q-0b4`r;H8mTNhcZ@VNPQCD-&|z!2Mc2{0AG3T$CBM)usA{`X zCc`%5whF~D*V2to8x@AdABlN?&$nyD8?%q?T*+K<(2a|wg2!1-!cUV4wC-5sg; zYUHpGDAH$Kqy4g_Y|M~6U3ygE z3RfdI<^yC2Ffj0(XUSG4(eHr0!~Cy6(Q6xU#xP#&qGNuC(>2%Yn4@uCb2m)#m$BjhW{~->Nzj(_yPi5>!t^68 ztuifOM{&bQgsa|+YyZ+bsw7j{D9G;XmgR-oWtu>eYTR$2fK(bXAV{_|P2*J0(k5Z| z+xiRC(l?mM3Bj|yZRSrP1w7_62H?~W9cyX?#EDKfMZPt3ugGOz9-SB-qGW>>_F6qY zg;?E2x_8NC0>s)U?0VrmP*-6fT1DeWY6Fk;5TA@UDnGD+RB@Cy#2{9Cy4;$f(F1ab ztpfSd!8@IX+AK%Atn#uI>XW8-<0-c0T=}KehB1*LgY_V%OoAQ^oJR8pN*n`Aw)X%Pr-tU1V@VH{#^t%0kQJZ9)$a%2*{<7LA>xxU!shluX5B!4laby*RE32k z(86nDF^OKF2~|u2My(|}wuEoD&;W}4%a@Cr8?P{EpaTTRh!^Je#BYVkC(C^9-p^__ zoj`NOJG9SCD;97BC-+-H7f0g)AUkQ#d>=5lLAyT+zsA*WsOz~Wm>el@8j_bvD{!1+ zJ5VqG%Z)Y7(#4nb!qjASY^ea2EJ5+B1rYy zOV%VYx9;8B&QdEWfnmzRFJCTOIG`3OZY@KZY+g78o&)Oq?3CvWfh|2|(eBw$oqUCDSWqk?LYS_x`?Nr&cMW^q*)zhUuor zpq)Zp0}otxA6L^MP;l3&KdiNAE0TVi5eV5GOEw%LgS8ePZkNRPQEH2VTwxivr`ClbmTuk4JQ5D`9 zHB#(xJPE9;G^&Dt@I?=sz$`JtdEk`w5bs+as4hm{dVg~!e~j#?!uk8AtiI@r-?j4 zOfRCBX8(@N21)SS^ceEbAl{nPG~JQ|w=!g%OlEl%2J|GYv?9dq7%Z}9qJUu77Ah61 zJ}z&g82=w=_!0_(Xpwa2^3c+0nB2VUQ!5sN5nd;LkGKuFDCY@v!S@_0upjq&cih`M z4Vg(@WL@01B&MzAyR1Qq({4#(RWWW@t;DA=5@yygrB04AQmito;Z7atU6exv{Fmu0 zc`5OOmT$rGGPPQPvnk0k^$0xWAYBt(*Fl+%+Z^6+z-QD__4A&WP})wvsqtV3{d=LU_MH~5hK16h4wBoYE4i|*@5wO*FN z%dL_K>v_YZHtY9)>gz46&_)iK!UHzE9|#jmG_kvO^$>Pe7UDq0d241*#D0ROV^9!e z%~RBx{qolo^|LLkf880W+`@w4R1Llk1vv4sY?tY*-S@=EALajP;uO==|g4TABG94hT2yMm?H)B))_wQ-?SIEZUHQ z$-5*U3;~mh@SL5`G2AkVwp=M{MutD8=99|B$#Td_`Z}ywlfFFR>l38HcM_%r0Y2(S z^0}%?Wkg|*tpJT&h7-gciw*G4{mn|wUKBP$t9z*bA%vwDjSSv?auUskv z^!h!YIa)SXBr7Lm59dxg1zYut~CJQh~QO+f5iWhC<`6H7BEHb-xTdGV3v_` z)6M`%4KJmOC^2SYQk-+o`Nqa^r9i8TkT$8e)(BqitRevj@YT|p75ljO1`QI~mIT0r z#5zY=15&(qi<2+zd3$>-eje75NDX(B{AMQ>i%pjunNC(emp$QOf%@IGn|{8I3UEW> z9PmqTrB1EM&Cv4vI+|7_qpz_TGfFxuFnf0!Y=pe}lVX!1ZEYg_j+N&wiO@hzC;Tu>ghBmBEAPrqL@)Y1Cv5-~Hc zkn-}9W$%W{AKr2VX>IrLfixO0h3EFs!~`?-^Ztqd*sA5SNYQlTzYnjspo;A?c7yn5 z>Wg}`&3Oa6f*g`%PFO+dkBb&LLHs}>rw{ihfAAwg*iBvmyUB$XJyt%WZ=z#of>+`M8 zF9XaB=+a2(YyglX^mTtPo`h-a_dKX(=V(C89&!9lZ2O24WxSF@ad)N$)f=P))j$C| z@6}Bz67W8;*C@2c3qTZtu4Bs|zUg6c<{~zj!thCz{>rQ~W=;-?xStH(@WxK`AhBPsn-hM-jN4o}-2apT;0(X^SX9}Pecjk2d;)6X(!6iw@FpqT$TO)|gN0OaCUpd< z8fYR;WT+H{H7+$~pz2OMjC#pxk2b!`ql~&*M zp!i$)=NX|bNu!IDXX$5J>kDjVR9V{3Z}#%uR~T@aA5dA z?#X<&pbQ8;bqkcm5s6&funrC{i9OvPu>kMD<+6FHbVeIbcl9O7Zr7ZfjIWQ26+@Dy z!J}@MCnKf8aHQ|xvCjAYubOoD&)4LA?x|gO4t;*@r8!&*POob4jGh8rTKl#+GF!{! zH4V!Tv;#&U>*$~^qG?Z5*Wj9&NrCJw<^wj#9nM=S#Y|O;&d=g19d^rqb@99tswQAW4r~r|&xi}}dw+@ZB za>eUNGRkqo5uBD$kx0-@a}-9UYoM#ORF(YAI16v_XIq-QLzA~yqb7E$o#FP z$TmQ3C!2}a>IW=`($bK|O7?Z(;^X^8UGnpgFP)OxI82`I(cFg{2zi(kGj*i^eI+74 zmSlmHIHde7Of(9ua7v5){dzCzAj4@Yg=uo*%G>NU8bx|#!Sb|j55yZ_Kl)04fV z)WeR|w+J3KGiH}i^BQkT@UZIP<=+xn8&H|9`LdOhpClSv9K^;hyPk}eT!(~b(b{{F z7(6$eT8r``Yc##%dm!`mB@V)9L1cRSHeGy;l{Zf3PU2z37okqHdONhZy4iHjuZtS? z7CVa4Gaq$NEUybJ1F=1s@_>0ASJ!yX))kd2z@DXtTPA&1A+R06Z;YI}O`l5!-K1N` z$M^nOqGJdmDBPZAG%Pa>yTqB?O3JDyz_joGYU|$Gy1sV3A*>tpy5E8S6#<9PwM@yd!~=A4uowWAn(P{0U^3DNy-bAJID4 zi!1^vfAUy_n3&^XmO~Qtwm89ZFs#9Ax`pMj#N}2E!7PVgeSbYaJZ|5=;V6lWuHJfX z^MM5A^M(IN)ZzGn5)s|=4y{j`X-oZN z&tD}>p(#a#=|hb7nZrYxVxnxfvT~LsnNcEAv!Wld;1W$r4`@o^u|;HeV){VRark70A9=|PM)gf1S{UOza=B7`UuDc^ zRMK7!jaX#P9~}9TucBx8(hI2X@DQ!mr2+gQPV)vp z4n||H4JagIbN~$b6T{K=A9&QS-;?1F~7;w$!yU9wYG=*&{4o@y3$H z6g0=JPK}DYNhN$ol_Q4f{CR5s>Iwf;={nJW`tH6zfE6gDjZz~pa<=IgR{BV_dEO2Pv%8?Te7wACy-$2N26ZSh$X9N&eG>Xpg_0g4?*T8p0) z`DYBE_gZrV?fB+L^sx8Ce&*N&P#N9iQ&*VUzmH-(&nwm?C4Kj?6~x0+9;M1)zRDSo zYsH|G(M!(%927Zy&~Ii+dA?e9NV7F&JzS6YS{E{KW2(f?v^31$ zzMu`4#=I+xNs&&~MX_jijD^(Fr?C*dtx>$*hjt5-yN;-vh&7OS_L%Y{YL5ACLgIZU zOpRvb;!DC~p*&_d2LzMqJ-QV+(W9`wrm6e0*g$lnr+@8z?(&tp`FQh}DO{UE>veMx zcyEy*AB_Fi7b!Snem`ppiX@3D%b$NIX^SxDB#>H>RV9c2t;4qA4dZ6=XX$NQ{C*f3 zBnDHVo5LpGri=iYHSqm~@9ORKuRmyzXZ>)1p7jr3Q0-x}Bw@b_t1$^9MC{{RRWQKg z1ja#%@z?DMeT9iSp($W;VnfUt8^0%gOazX|~PN8g^pB2g=0qGrPxLqVMuO1fmOYr|Z4Z8iB<@yHO&7BFGhYEvSuZTP)3P^2Y`13JAJI_7$Gj{=j*5uIW z_K|DOAMO-!}b4OR?v_2^~dDz=n$V*Adkcs-eBIqA|mwUjf-FkN;Q_n=>bELN&5 z?q`QQ65?Ywf|ur15qdOkak{StpSNf-#x=ai+f$R2Ww5nym%XH)kh`oVLRPT0x}4cE zhX>67EOs^A#MZhLhvY%+Dpy#lPr3iW6)y@^T$fjPE>=S zg4Z%2!axfA9@x?P83G4+INzwM-ldCgbAm!{LN5Cx2^d2NqU9C7e&~?tOzB;n-tl=* zd3X16!W3NxFt&c{SE@zl90jQVeneWwYck_p&G*m)Y zE(cA)Zf|3EY&&%n_}a!)(6%~iB7O_I?B;m&+TF0mx@>?>tnX5W#;BM;;K9GB zb!yQQVd9b}JFQ4Ivt6a@^)hLz7}cc2YIryru${4Z7Pz73i8<2D_2u(hJqQ!3?NpI~()KJ27$Nl)}sa`fg@SK|ld>gp~k)xci7+-WlyP zDTTx8_WT9PNCRCu!sqFmY}Ge8tb2nC)iNJC({ZxI!|YnDso=Sb{asALWAhvB5hk&& z6=EuNysr(RlN}?evi&e)sJ=AZjA01`LA^l5VRZ)6pu zOkXuUl90Yf_D7BL-gMl?pTnu_fkq@dv#os%sEl#W_$Gv|KP>4@eAEc}iR}5t_gJZO z{e$xI%e^TR&w)lWV4eaeGUCf~;a_ddvM!ZgOG=Z|#~8#k(s&xgI?4UiqDUQB6L_y7 zLKc0{f=9<;$Ho-I zw5BQO#ZY>)d{xvM9C}-TmGi!bqQ~+<9Z~=fc(ceb7t_)58q69O|J31hF4if1asR-Y zpQ1=;H+MPjhN&21vI;ov+)dLRVk!WG(fgEp?*7;)!kMC*)-$sNk6)-!J*h9yJA zkWAtnke!%@PZCj%*D;63XjYmhO`nZ?43(`BcCA7~maNN38)4||YJra}hB9cRQtUF^ zdOryuOx|QYvGgj`=V?m7iGPNtmYciSF$$uwBK|ar6Ii)IL#zY!xm??o6tQ?WG}OM% zxrXdr+}+^dL{Roif0;pw-%#GMKVlAGm+$&Eb4a+;yi)*Oi8t=LPPPUL*sa#B;{H;3((nyO{X~MX}*M~FMhs9hGqn7j~eqRY+Id~ zb>Ro2Q0EM0ol9Y5+6tBw4(Smp=_~CwzedT}MtdC5ffn(J5PW&W?e*Pp>zd32AQBxM z_3;Hq<_>yKeWodiRG!-=735zzX5ost;ya^lYzbm}fq;QXsWbIcoQ9`Za;Uar68>vM zK0->j{W*T-B#k84!ht`&Fqxj@|2oa-UTA|PDOhA ze#Wf^M}Y*|Rhk`4-*sZSk^fV40Jaz=;o1x6o82``v7xxic!(#?#pq{hjUx@TQM-E} z-NWH=A3L>d@h902t%J*h`Wu!&KErYH7$kkKBC0BRS>8KG(!+x@ZRy;^M4}$!Ey{Z| zgZg=zqe?c(Qk^$b>ANT<&t4|^)=c3KhgcycyS%gIn{-gVv5YP>`p)xqY+uDSZ>_pooz-|_(rYB#mt#<^FnqdzrT_DQY$%)zL9qiH zyHh>SPK10{b!v>S#X%yKKf|!zak;6STxmhWjt~^9P&%r~ABEQb5@8y=X=rT~vXw~n^kCeMk`1gabWSWv>%a(BQ!}^1 z+PSxJlsc8BF@}d{pY&GuhHw1K2h>cdM|84@x3ZW>31+l3CC@(EOCzmbyc_h1i645f z$f4%piRXF$8@RMBa;BwJJXGmawcyUUx?OxTPQ*Ljwk&v@!vns2y(ktlPnXy$?3fQ_ z)Gf+$_!PHK&L167W!rtLy{TdzcG1pJNdQSYFKc`Qncyr=#6%OCFL@y93RAS|>5hjA z-k?7y(1JpDF(qVWW!GkXHSXcnfWk>81HwkzRnYXCl7(UP6DXZO;WPi&*lFymq8qC| z)vYP&=02iuA$c>l`zMBS?yOVJBF~tX(d>R*3w;3d*yyImvgKG)rA#@rox@6|@_K32 zgO5bxP0?)K@=Q-CyEW77S zov-5(yNR@|ymb?$BNemaIYrc3`KS7B5&0j`=eN2dgern>xaa?jF(1e8{}kZl-ZG3Q zniPEQyyy4%d>Th^s{#|&v8%wq`Muzq(j7a59n#@ASPf6xveST@lYn_ah?$Q) zriDX~ zyY>c6-OmU-zS?GGcy&K}gn051DjSE!nwNKRDFkDC_Ne0hP$~ko0yC3{_K5ZL@d<1$JhrQQZNwLQ^rmhSbBeFQeIPd3_6ACd^vC=5>QK zgFSO_^Ux>wnbFyF&}D+Pk8U5m4oKUCSk@c+MrsipHItI%Ey%jzuD$qAZT;sf3(WPe z4%GD^l?n+^63m%9tP|Q`cJRsRyzJo>W4Z-Ubi4}=gGMkkb)JUBbhOJP2R)J-0sPI3 zg#r2T#mhVM&#MI_HE+q1M{h`v>fQ!3n3=YZ=M7ELsDy*yEG!O9+P}kn#D+r$zfwEl zQqHPHv%YbrR5C?l)-EYX*Xhrzh0CNnG2B{S+{MhSHEOnZqZ$w_OjoiC)fw4CxMzvK z8g%tvk+eps?HJj!peL?iz7_zeAab;LPLv_jNBA;daaH!x^k+sNB?|?;G(_5za>S1Q zbdwp>I*t}yBs2nd-565q?Y_M;(#_R5kv|-Ot5YihlX`FYNMPn6a=O7Ae||&%3eJ=pIKg+rA`x!SEqOEkux%X-*UHlS zi#IHC$d|#?(|(8xnTAuDDqCStaI8|$pr3}bH@jGr)s?#L^#evgV!F@<69tshm~LNJ zM>E#1loGq*mJu(l@Sv3Q;_dk<%QJ6Uc9U0S{0O66URY-FI=>~+Bz!UvNu(DrRnvWI zc)t>ZFCO3AY9W_t@8Zb4S}zp$F7gAU>agZlL-TL0p(;b+t>Z8Cxj>Rl79603))ixb z&a=J%*eithM&W^p9LjyP;vsyF$6O80?esD{$FU%nhGzI~hbP&^bWRAkKe#Ms{>7I( zHUIMx3+TjJAb(XhDucc#a7N+fA~6SPa{&z3EENRWmBanStKSH!)V7i{=huAC)8O#V zK91T;vLpkDym1Z;2!;P@Qlr1Vj_FjK+(&=AB3*@GK+V^keAVjOaJa-~?nGGi^~riP zed`PtYMdAI``02CTX=&-IbAZ;*k01efQv}`9XTZX;{A;`+1s~ato-GawdZ@NW*IVp zhLIJ{z8%Z=8wv5lPn0_Di;q}C!{XtN6OP!KnpUb7 zBff~JYG(H1#x>jq9mVu{AU+wyH&0Wqdbq(*Ut7*qO!fVjR=QFRFa4UfbabNwcA8eI zu}Ns$6Dqovy;o#{uEtoK%Olp;Xx5_Q>Z6=U$1Er!73 zWG;To^4m0oV+>cbs|6vf;2L$47oFfqsLLIXAptowCXQFu&oauJZ94|lqUKv!zFk?7pSrP6JE?;dao|NdT>S^R>{7SKAyU}*Duig-k z7hCNS_HU$J$qWPGv8p3>Tv!*hi6+L{KS~DfAWzl=@oZ1)FOk z9T%gsL9?AVrfU`tnX;@_eu%U!yQmb2qZ*q9FSfuOP6vE#eHQjRyIpuMG&)t5bA+b! zP!1Sp5MWZ8EqNN2;g3|V84D+ed__IDEA-F5w6PsBDnE=8_3f?Mbh*S6(e{8OsAGnN zNjmsrJasgBUlT1jkKoR+=(vEt8YIoMZtI;yk-=6@d`Lh$mnTb7DEj_0wQPI?S@4`ZIbNn;YNHfsa$0z*^$WA+_N^+jfuw-L+)+xjKl2LvO22`gD+mTQ0qB zzaMwpR79ABpuG1D^6N-9eh7b*GnhD1Su4WePUw3CD!=8hX7bO>vUocEa!lWPP(J>3 z%Qh$Sj9N!r58Ysz^-zk#ur_B{c@X3a7v|!~Yrnk&BI}!J7lsQy1UxYva)?J9TeRAm zQ{7;5!nk~HOw-yX)KE2n8*}gvi6H<%OSCbmLBd`XI4WvP1@F>=wHhmeTdBoUy{7K#EGe_j>ds<%2wq=Y{YgQKBPFS-T14mVksZ4kUfUlt5QVca3 zPHO-jaFWmj7LBJzCh~?=5?xYPf=HfT^EgLj;p+Y_K zAaVjsP_4{z*YNf>2Y`gBCw(T@ea)-?^@+<_c#z`gZ=?iWO4|WH!{FX1-sT_UTz=!- z^CRW^-c03ug$2R#a3LwDzEpO)?9>>yN#kOh;w`c$MrIXX2|QwvP0n*Y!Ebu+SV&l= zAKFK@bgtt#UoFP)TNv8Q?zC)|^B`A63vSg2APo*Av%uHd&+(xZV`#39vsRWIDH0YK zoxg<}wjVr<>^1luT;iL@e$MTmhHn=t%_lf&cy<4&BnOHd>6Q`{WNmN}8foyD)rQ~- z!D!9QX}0Y@hJ_qSN&=SW z3}aY4&8u$oCX4=sg?~O(^OJ0Y5|}xwYw&QophaJ+L4?HW4U zU8YT>NbbdzPUf#3*5bvW*V5r@!j}Ec>+!c{OIJ4DasrAB1nZV|NQsLy7gNnmF~-9M z>a~`dh``&f#zDAf?&~l5L;+Ag=Ii}!=x{b}(ew#;Ho4S$nkA9b(XAt3UG_HxB>cCh zTTj-tS9$>S0h(jDS~P<%Oo+!4SHRz2gBqemq|YEUvbJsBIY3NC7Ri2|t(ydr+I+dT zjWkIt=gx>ejXDzjBON~IKqlV19pr2D+kS<=tJrI9pUBDfvSVFL0KrVUIV$df9UP5E zY#DXx4ZiSOg%E-mFq+c4;zGEM`Egb*OO^+^&#mr5j7S1epqH~rIm$x>V zzXQGdW#Br(58x3RS}+u<5_aPD8sFgb&*K|QhA74GAUqJEf`zDY?-O?brQfPA0L5a>MGInr}Iw?u`sX^Ux*o`D?bx z$>MdYrF2{)dwDpl@9iA#75?HXF!AHme_jsc)BNX-0jJaBLipjU8E*Mfc3!T0Bjrxv5b<(~4RMNtrMsO?w zmB1w*%L|tj8kRnSNxLQO8iK0?CuZavKj59+2Qq7KNY(G1TUm}FjUgZrRpYJvQNZxp z{>mqF9Ipq-F}F#n?(yuCS*Km1`9S+HUtI`kio-{;rjaA}!_gJ>7dW_+OPx~s#Q_d= zNbf!P_u%ExE3Abor&_5!U(UT6X@%Dfv7lubT)?gPfR~7f_HOb<`gZIg_^Arx(q>6) z3D1r2Or`54{^q^E4^q>+*zzRSxf7c=$=0$>b$!czW8FMSI9xtb%cjdHcGA0=nx<(E0KBu%97da_0&;wtPQ3N^ z#|;tMRSZKnim9Q}*An<~%1rvBZm#_V&~b9!LoE+@!3g{y%^0(vS*xzwzr#7RHDYf5 zi_kyq>v`vt!d4|QSAzBG)d5OAVhl`QH+1ykC(!D>%4+5rk(B3=HJbsvhn}Gc{uT}^RRRnpr8r= zE-X*yg_RmPegO@Y{h)-Kv1r}qna4O578+B9ORKl$;95E5sp<=qv>SuLa&@$Ep1E5$ zjDAxjH+EnfVSB_$Ea=OVp`P*k=)vV~oN)LS%N z-*1*Qs=c&)w6!De$xwGcR9XB9Sh!M?M{ zZ`D+X7JL_4ZN+7!V1>YPn3qm(O^?+SbxW4{mAYW!g$r=E+g;lXZ+Oos2*#Jfypr#6 z9;}XZgKJF&GFL(zN2v1?Jw`rpBL$hS0G5>oKalUD1th|W@6}t6_|WofFC93{Faf19 zBDm@6enIi2U*S|{p%jmE?i!1ZP)D%Jq*Voc2onDqN~Er?kKwiDE5&&|k=OpaY1sh~ z+pdWv+#ZKJb{mT)*o0|dd#|UQ1ot&PPaH+yByrf_j1(p4_9$$Bgf$sQ%saL@%MiA9 zc>89~pvVRBZi2;g^4H&+m*%gWqMZGlgwdKk*Yh(+O&Pciw%U;w~GY$GsPgth3ue#G-1VQ_$K6qP4z*YaW3 ziG(RkAz@Wh1cTly>;7mZ=Kl!I7h!+?Jn`loR_2MrnC;0w*db<0-B9!73&x>K?!laS z-O$XZwT(KZ`Zh*X^w5dnj|qVJV9qb@E7mlV;%idPuMBD}-rw?U3QKHrL^_0jsZ^0; z(RGQ(&m0$1dBrH4sE+dO*agv=@%&a^J>^2zcDV0bkG?K3uEKZGuNRUQDURDWdoq=H z<{eC)*%M&P4SV1!*rqKrsm`D1G@LWKe^3twT(jVPoJ_Ine??4eopJ_Bq&hQ_Qo-YS zV@_H7SPyb_$i}^8Lc5NH<}Da~8J#tK_6}hlynkuuHds)`n(J!vJ<=}aJSvv#dw>vg zOzgnN9xrjTHgX8jq7|j<$h-l5YpWyF6)T@O9L#ZIOU^y`=tiLk(km9C)mTgajSoo6 zfl7o0Xu!aERq{Pa|JM6!@x19B{9ITI@TNh{Q)4VW=6j)}_EtH-Fy|sG*8Ya>QBdfh zE4^P~b$9-P4uo=*eF8@jA2EpW~^c{WK|8ny8Ee#-%V9Bwd*^ z6-Av+`w-|kqoh0f(xKIN(9Ek_RbTg(`54hOCO>AVFboxD@hByH~ci>1zuVYiBl z)>2B4{ETgK8z3aVHnz2qy>&NE0>0V8M2-biD7O91y(Q}s5yiYqQ`xwGD0XFp#&sSE zoAzX7*@_$?k61%l2)Q8$wWj z`r=u;vf3Nq%k_#_Qs)hm@V99xUFp30IxtC>emjy5+}sHi51Ql&$LajlhE)G0e(YBr zHkyd;sLAz#-(}RlOSE#4@i+h&g{txgHFT*Z%`u(?PEsy6D)j+Ng(LmwQR`x zRdL#lp3)v6M+vfxf@coulN z8`Q2)0 zp|%Ug2&~;j>W#u=zir!RKNt7!L3!}#oY2-e*NW64#zp|Vj2I+!?y{ahMHkp_9wL4& zeK73Igjs*JZ|O8dEOLR-RN=mLGn6X6ruTdf-P`162B~kRJ{E)e`MWtqWct%Q-{(WJ zB#R74S1hcHC-B96{MmfSIV&gUKg^RQ>@pNB8x?SoMGCbnXT_&-Elkdj2jgGwH%}&E z0#45J&s3_{MS25y`(5v&W~05CJuKMvZb*%HN)|M)0`kkS53@?HOwiTB?dPMkCbfaUq0a3uGMN3jL7YGf5?5%IBb&L_fp3JJ| zxazjg6r)A&D~(vc2*vl~MC&0cB&34k9*QZEV1jv3q!T>!@M;BuQs4)7tYUb-z`XSK z$u*SMWUp>G{a-mB7?WO<-ev(VWG1XC)|$|OVh8UR3(Ry~f{M|<>~3VC&k5}$5ze~Wxmxn?S?#(8YiGyG2`PkP<>qf!I zQPIP?!=-^))V%7Wy-0`NABct-w?On;%2_)SF*`S?9F{|oLORIyZZ|Ht(pE8Y zA@j{L6u4CWoaz}lA#Y^le`tbPK5To-xF^qg6))bBZ}4(Po6X?`?6?>WeW`vGoGy|_Kt1Z9E7bwN)_!5OH zMGLkz6AL_TLbqZY$KDjV62C=(Wm$`2{(~1T{wR(4$>!8Arvyu$9B_n@ldlqj!c~o9EjmBnyn`e7FZZ7 zG0hH$`&4>2cyPu|3UYhD&BXFBfxET^Fh0;G=ZjER_I&jE&Mi^9`JvS4k~`>ruCU)k zY1ed&RC-?*%GQ;JwL@%2UcHGlDJBy5ma>mV>Xd7^J6J=|rcZmb6@085n zDv6j$cUU{+c8OnI@Sk2-p3Gjk3d3wS`sJXY&2sI=bkO04?VJ(kA?&;o4v9JXl+!WQ9Acz?u%ONesE2qFPdJ z)o3mQV&2)5p+W1s-Biogfz|a<28INMaZ);Mx!j3LgZa?0w>mKkyz-ZFy2fS`vO*{R zFGqs+x`~}?H)GMt>gpzmB1pwj81nAxcLaqgkIvW6^hB)x%6E(i|B~Df3O$*|?vBR) z-+YicoF2b?|65MTb>GL(4m`cmo!{7Sm%kU4#s3fD-YP22HrpCS3oBfLySqEV-QC@T zYal@jcXto&?(VL^A;BeBa0zzm>#uvC-edPa#<@BBzp1M6j`wobde)kAuKCbEOC1_) z?K|{D2a{I@vH=$gD1YwIc=g4xUV>M+20jIA>68h42brJ+duiI$-+g>|MDQa@Ggycb z9? zDL1)sa8p@FQ2jODuCokYlbtuH-{}SACd|!Q0qnvc3}@i+M^N9MbBBY0gY@bbj#-w1 zPnyQ-XGIx`Q1m6d-L)sI7u5;w#8R12`OPWh&A74g$Ct$Sg9j8DtBfd5Y^GQvIpNqy zdh^KdeN|RixuJV8v|bpXl332h=f#yze#(qN#>Cg&!Oyn_*IQS$AcOqOr-~OK^r=}R z<(vUc(ifwH`LD&*N%^0E9223X(U+KXujdl{9Xn+H$$8(D(-?0+w({Ij2pi8BIZ%MB-n@qjq4ee<0%FSggfs>V(&S_I6*( zrIxj5hOZG6Ld*oP3;CYNmhXM8erNI%_RlunIU+-@x}h3rJYZB}zW_o05Uky+QSL=9 z$vDk#OILL1<=VtE4awC-LAZJ3j7Ksj)Z5?`{_HSAN0By~oij7DOd;AjI9_rjGPUGo zwf@Bw_k0E10IlbzEO}P(9x47b8^nkC3NeGUkACE?&nAWI^vo5)w2BymG$AU&KLXtI zv7MTUt`oKFhx_w@HlypJGzyabV~GL1wad`8?TW-%7Oqqv4hq0^v<~z{6hF-VjP`4M zeMz(G_|6>T2pp1S?Opa&$TFHO4p(I)&~-7VF4YaEUHz~M*{+A#Skz-06RbPGao6pt zrH$3?M#IU-l?{l^j(rPXHcZIX*wpKn(rktQ)}lpbhst+_B0TW=5)KY5WLAFCeAP8- zpgss3VwD1&%NP`kzwbUB0QJ8cc*cK|E^1YYqSr%Ss`<)?SZOV%5h0CzgHlmR>O>i$u(6k>Kg4uf_H1NPe$a8(Q zYmm3|8k`35uhUvFbBgJIKYsxF=oIDaS^%G-Bh3J0W$aJjr+&T+E|YB-2K5gIAy=0D zAfO;+J)#2UNC}zOWTK8Aa~`&5nA#glb(t0=H*a(yBX8gH3{s3* zMSr#D7|KcOz`t<}OO(-LpY=SBmM|Lxae&hnNT4PwXtm>Kz}K(Cp=&V6t26s)pObyQ zL#k>>8!Op2>?t}Wj`tb?g=M=TFfzEK;@r~8C+7yj+`3okEKcEliUpcWA;`~+YI?vQ zxeLM(AAdEN;8^~{HRD~%-+cBB;uh9Esgj!CSX@hz5>^WjGNh``G>Els8#2NT91j&f zS8syw2mOOZGI90uK|WdBk}dZ>n~|bEO2Xdr*_3R;{KQSn_$(c;*1%&fBd&piu0hnB z*eiNi$Mq}hq)(hrFr8JK%ZBcRKLRqvgHuijZcznkc|4PKz|G%(ygPL6{a47qKU`ju$ zflZf5qhKemAOCMLQ?vKK*5BS^vBWR_N<-%Q5i$Ta^-h_A_kA`EtpBq2*8G+G0_IGO z{`%!8xMC<21g2SY|5^wJf5*9iY14$iW_ZtrA2G+=u9mq2EQzc}a7U>bKUMUW4K63` zAE`6G`s8j&4d@do5;W=vlnJs|t+r`wjL5vAN*uyj*UY(;*nU!cQY}#|gI_7D;`L11 zjb^|zKVWllOdHTN_hGlny19TKfn#%^hnqNeHGF^v$-1^yjbaD1{Kdr_+dG@Bm1m($p$5y+F&_gFTG7o#& z;GbQtx@=5i4$E8V*1X8zs4m;s_k*N;c!&nTet5oDjM-n~f~9-JVrG(~utXWCvWaMh zsXvyZ;VET--zbsoIoyjilWAY$b)DmaUE_H8j*!`x7fzxj@62l+m{j@sMcTF-YJR%X zn@>@XzcmHp{q$nnyu_~;L%iG}%dYp>@+MF%|!ofDswncN1+ri@hZIem?xi z*1o>E$ALE{(1wtjBLvod&;tHG9j*kY!zhTp?Z-U9A^N+|SK;K-e8j6iO`-|2RpwZ{ zXY$g{OISFr9&ZxTW|Fqk?xFCEO)aX4$U&)|YW_iahb%WVI@bX)w7Myh>!j__vKHme z09bU%B~krI*0IbfSeZ~DpC&^SCrEuw#3ne@ zzN4$^g6_dq@*uo~?S(0JF4J1CH~#dG1X5jj60C4dZ>?A;dvB0`v6y%=vQQnuSBkw@ zpHd>MnxMfU+}wehl3v3UTcl>MR>yu~B!Z{baY| z^~S+md;a~{uCwl+)Vg}o{|##WF4X(F)c@j{z)m(r>eLl z4$@me8Zvt?&?jvsGz}K?Wgu2=>J(oF6~j3mS|~6AmX%bmyKDr05jH@{Dq~hPb$>Ak zk?*05)=&wXxL&Liwn8X}K8JZ6(HDbK8^Fv|xzuE;VyU`kKNbOLTAmRb%WVCHt)&1_ zc|s0j_LMD=s{ojffUAN{I&UjQm2ewfB*Z`*uiHp=1EO)SLR;glE0Y?-+Qrx-bJfQ~ z)f9BHcQR)jhQEBIeeW>pRio6hz2lB9J=SvO}@Yk2+R#6 zF19uiPqN#O6)rt{r}Y^9u>3a*nVtT>zx)V3{ zFyiZ<;zb2QuWm5jjJTPGb>S>|=S<7+;Zm!PE14Tj5sku&FUQdK$`1`lQ2vl^YRWAF zNT5Cm6c-GrO%Q2u$B866Na5ynL-3geRel>cWvUN8i|GOal1HsL06$E-W(mGzpq3Ed zW8-f~WMUovu(N6mMBK!<#OMGRszZoX2;b#mN_vp}uaX$P+~%}~ctJ2@Wa zqY?-=Pp|Ca;LxTAhF8hzNKK4cAUj4p|Do`vHFb-iqwjasM=WM+YS{MWAIyv9@-N+RB)k7@R3hGGum zmc-mLT3D0S6)u}U&W}B}za?I7MsyyneKHXiuzT@|&L^GK{l2GbiIeUNu$<(Q7P522 zO_FKOz`>o8a@kI>EDvpC*C*Vk#;oj$C>U)tjLUVit3Aw$&YioGd(x6|7u4^Xg&TxD zz0iIP?Ll?zAKdxsoxf%H;QUOGPx9F`KThc@a!+9#<(0`RR*{4H-@^FyuYXaNhF)}D zN#I2?%8OgEj(-FN{Qs76@E0du`MX)m$;K6l&mIDS%3k2Fq{RYO9cPkb7m)yQcInWGYLEL8v2hUv5Qf=YxYra{l3Gr5`2ro_v!Zr zRd8tPdWlGGbWUnc_pqvkMf%&1g66sNfWonEQ{wa%`3AOxX_^>{Kt%s~BGs0Mk2RiI z8v|TNCNXt}@Nv(SriWu-v&4DFGnw8+wGE|#n-)PafvCp39Q8++xHil386xj=^10E^ zGl3s_q@17*@&wujY80(m9v*BY)h32eqbuvWa|UvOk>;Bu4Iaw%6T3?3HIuLSzD-P2 zx%M>IZM)1~;<6S1es)wZ)L-0Hp>Xc*RpWv?`Y&8>@^2k4v+nEIQW$KsiN9v^sVF4q zfijTX#jhz)w`GiIOe&GgbY+QL_3<@RB`r!SzwodqsS*(>WrDC~sYGu82@MpwA?rDj z$qT$`qO%%U<48ER{TokkW9~jvEZ4P6evxpmN9`tqnQ>lY0)mHW-b%C3S_XA^pR2g9 z224!-)Fjg*UTcxo_Bz+ev}YJLlHmQK>;;I0uY&9N%(xZF{GGAixL|>fjShHuE6J1e zxkK2V&6ZnOuGDvK-_I_o9yC!n_>E(8AicAv`-3(hO2!fo4W!Zxt^sj#6YouC!^S(k zyYG9o4g1-Ge!mq8RA3$X;?Z#!(J{8RoeB&V_LGW*s<{8&Jj`?WCoR;)zykZ(-@DD@ ze`gIc@a7K3dqGc^tG$`9R3#Npr|=g3sEXAnmhJ{_uNk|pOeJ(c=zBe|4#*&orjbD{ zO(#fWGPmHf|1kuElgP_s*+v5Bk_}(bqPI3ox_zYf?Lmyc{0%b*5b=@fm^?GRbTttS=5?5yanNuGEVc%M# zZxryn$lJztAOPI)e|lHTrmWK&3>7vO6rx_$wc-QSu0Qt$x*+J<3OlUfK^o7Xnw@$c zVp>B*)Dgw)n`zq{96A$kj356F=2%zQF#+h;d5kQp_qhF>VTh^BZn#fZp0e7K4=a>h z#oA+L`!e|1xs2m;*FIg8>2T%|ypY(aK-aXmcUH>JQ4yMN0B2mpD(Q(=2wk_Q*bie% zf%H(ekchD6>UU9rJctxAT9H}FlRi-{jYR=oiR5~Xk`=#;%vGNf07Z5C#}!hh5tUW2 zu59~(t&hz7{9pz@=k571+}KiGl$hko0~{GZS-*3z8a{h}$R7|Tx!`$$%gc6nfp(z+ ztU0Q_6$DU5N5-MFf4U_6jFxk=oqTmrbgdA*-F(_-i|)y7NqD1PR=LfGP?=)#73Sfo z-O9SPn$mQxiSyI>h{DCmnpL)bg3z>*D)OmwY$XRc6~uazX5MAQ_h;&CVTY)$DQVNM z42QnSp+s2u88j_-%0KUU-8^w=`?MEBy%|fdHGEr}_{fR4$o#nwrty7Zr2a5bF?{x{ zE9>|SryM`(bOlPQJ}A(jBpVUWW&WDqB%3Y zZw|XJCSG0>u<;U>?tWI*)LfMNB^AV3byTubkW)}J$YUEzI>Srrg;u1~WOAt$$s~|V z>Jf0he5fh(M_)@$0~H&)AJ$5$C~bXN1ZUAeym76!fWv9-u4_B;nrZ&vXYP~Ka+LM( z(g`@OB3!vdt-w#(hzoEIAW~L)8YNAJUh3R_51*>{kq)3QH?{ycaHI+tNcYgXAVlxz|Ht~(ry zW-$Dfq(%W&1ub=^j^Y>7aOcsdqsup3T=%+glmL`6P0bI6xIaYoney$dO}-JL$aX~nz&k$fiQ2VaiC*NtU`?2GtbXY3E`TN z0^sYlXI(I6jGgq(p=4FXB058%nj(xk!$0iuqC9_(v_J5Xg6igVrQDW>IUu@)qO+LUL#+{h5kTA;?>CxRD{Z8RGZoprNt$bB%rbXfI!U}$jvWW z%)K1`u*&7>_Jy5fShc z<&trxG()3IMijKxGG8QAW-8bjgd4%|W?~=xwbn7i>q0L56|i)wZaIpqZPoozGuHoy z^-$TK2i9!Q9#-wr>=xOmono&YdO9YZG`5UlXR=&@ zLnIb=5Kq+&f>BLv04W>OMoZfeopu^)4-^cIgF`>Ih2EHyrY^m3oASGBH6Gv-YaCj@ zpzU3%j4nqTj34r*O=xWh8p$JrLJ!8Op}T)>E4Psa|3s;oOfdru8Cal+Y_6Dy>8Q`CuB z21E}Zz5)K!i*~y=>`VQP%gK4yd_sse$C)LIP5-)M$wlXX!)9fd;M9M|rp=Tthw_NL z=X+r9m*F)ymve`sl@b3Xmw(hrDN1T`+EN^$liPA~zdf8<^kfc7A#z%4&5V@1H9*~Y z`>8)xsp7{L6ML=>>#M9bkGDMSIrFw&yPz?`QtMOxy`c!gb3BbZU0YV6P=-dMJo?ez z3l6izEB;99EtklZ1s9=`d_qzvH}V+BVpiTj@w#JjQ6vIqYBj>J!0E&-3_X*06R6R% z&vRmvf$nv|ie61&>ngZ1DuL5#<@msj;{h`$%+=^S9T7O7FueL6dk#Lx*q|D#hN$2L zm;Ah+{F3A8W1v_WRosL-X&bt+su;;ya;PXHdro!Zom&doLhg!0AKLkm%Yy#0FMPp= zOMbjsf_x5InNw^CZ=crCC8p z#1_5|h_73Sy7N!8ZbNTaK(jp&L8#%54;-MpU$-_Px;G)XHzR1-!#4;WQXhUQDVI(6Fw&lUtiV= zYE0@XLOpxs9pCN>C842J6q}n$2)e?4==%e&2I<5Trp$fsANvXFuIx;3B9FwentM(% zH>TkSfvhr_spmo-ZW#cLl+pNiv`?Bc2Eis3T5=PTOWGU}LI`=AiVaDP;E479(>>m5 zRFr95u*Yhoutx0wOi6y#HTrT>PR)Xs@0i`QF{+dzTWN{92M-!&`%q`WB zJ6-}hoCMN->NA+WJ{&kFXIaH4SO^g~y2DGmx?}juAO*+H_T>EHuQ&jQrmMj=w9)$H zKpTrFoW~5;*lRQl?C1n+$^m}iv4vqo2%025?^7xKtJ2_pR!;C`=rVA7wG&tZ@`ns$ z(IYYW62g#*ZJ*%A)3nDNH-{KPFd8fyadksL4rp3~JL`lEnu*`_mcPq(d73s7A2QmR zIv=1B*hphUr;XTY1l|hT1gto@oey8%l)a&A%BcBaRVO|qo8lujIKlVxN1|xe4rOu5g*^f-F zGbwnqkUFrKerv>&Qx+o#kyS9o$YPD4s~W}G{3eW0NmHO!Ly|=o}#ZH8(;`u4Sw{EoaF0HITon2$Vl#zjnqF?1QSZ{>J185 zs!GbM_y!kgHz9)t%metK#B-Z+bo*#5@ZXfCGy!TA#WC`_8RJN@DV1RX>+LDCW&|Z{ z&{53X<{y4m5r^2?LsVsnld9xs2ADJBYxvR(V_Xc1x;txBQ7p7AWcm|E{iC0-3$@y? z-qj|#%jr2Jl>a@t(c5fJ`|r3u_y?|Ai6>*)eKxSYb`Q0&H_baPTG}UGzSb^UZ+tP% zU6}*}a5?wb&L+{nYbM|IE8i_g*$Bt3#b_mHB+Apj%>?CgzVl6;Dq}EiW#_^>VX9>4 zRK!|Ee6M+V>*V9!e%IYBJ#SkAW=^n5$X z{?UsR?|qpP(>5UG$dYEBH14kk1di^!aLNsi81?l2UMSn0-flAgea!jW^?SAM6D7($%a zM!yUajms<18F3*%n_84ljiw@Jkd>4m0GAW1BOj4uSwEDMvXYh+4K6^Y{{dtv#tK)R zaUp{nu*XOsqRK&2<3UMqD?^8Iwp-Ig3dx|sG#H4`u|{k+w%D~Nzt=R^cjzw79hUf3 zg-UhdjU%4srQN2B?ULG@4IjN%0bl>1QcVl5+!D_~>9Ce-4+%&Q(R7ljLEpo3FXyKs`nw^&wL%Vgg)3M~%M#F?O_Mb<&W zwT#CN!C4m74~qGO#Jw)0GoWfejOR5*Jb+FpDz8ghIWGpqpf~Gs#wHP2Wn;qO6?$t{ zlSx&;-o0IZiM96#-<@niOSrdxici?Td@64w9?yEPkvy)a5B!N_{K9%EDdtG|qWT<8 z{aW6v1%Eu@79T*BnhM%sY3igD3YK+E;ez**v!R_uBOd=UW{mjxffi-QR1iLDZ_Y+^ zL)HoJXMv9-fFi`xF}gDBqD9BDG#aTX#a%z70fhhm19y z=TMuSUUl4tq3;78w=CpY*J^dwlY{URzx3k{Mhx12msnne+~&=`Y&|-CezVznk^hA+ z%GW$*FJVRwa{V-4sFX*)yAtf>+iy$4n7()HlJ!Q>3&kD4 z#c5>sTFvZn|LJ9}ltv(+s6sJ%72GZKNxx6V;^ z(zsyq1^BPdySKRckEeL9?(>&`Y-&ai^}nowG~Pjc7`G8m zY9U0R5a)>;NR}?GYq(DugI$!1qmR9o19>OM@xEgduF{r7B>2Uq4Z&Z%x(*?AA%gHN zQqYrJxOEYYxI@_exPvgNR-yvLHYI3CAgj#LA45HmcHkE(2Z<<;LvLY3K-p+I+JUBG z_VTfSm1Fs@sD& zBq(~*={y~n!W`UIOV6jvTNy`9w)B*nII@L|58)eoN&hwM5hSFC=V$BPmVGaceB`1s zYS#Ps+UWG-05}zqpS^R8F3MLqQS~xKZDGXzjIZ!Z5tct1)xj|@P`>qr9KvLLW{&~& z4Lv~A{-5PK_v>IRCXH*8waSupasMrD&D0m)3c~jee|fvR^H9O(SoN;d*i$a32}p8Q zngv<%kWZ^5uu+mzg(>~k)T}|^LrYt!;8qvTkQM^5+z7;u36Z*uQ3pdoCL*d67b2|h zzKGFOT)|bIe(J8;p3)RR3d{2S3?(=Lep?w{)F2Q1is}Gzs>Rpmf8M z3mDo_r)h~ygkTn5-PcsRkPx6=)0MU8N_(Y3PW5K>k-o7Fpg-NJc5MVxf9(@OlvDh> zx(-)2_d)64u)h1Ib7OFz-N%i)23-q5_dRWy-h% zZ&im*2b>x9?}PPX2CCssnU8mHL@<$ds}4+vsT2e^l-cJ(x0Rha(wk^?JrM3_n1^&r zJ{uOx$V2S30>2~drEY7N3unoIVD!h!X#C*|{17MNjw;lF+?2;z&kERm3OILYZxcr! z8gRdH;P^?*mlt;p^O}{NsQ>Q1j2_RMhZ%Rr4(b>n-XBNkI0i!(g_;dKPz>O7VkWJE zD0qWWPzqvVAQsM&saZ9kKvq;XrXOZP1U@jv?!aTIF>bS_I+KtiE4>PSuJZ>2_wRz< zgyCR+J`%_m#o+X*fAy2*`+qFto1O0J{dXz9A{$Y6J2t?XhKjP++Wy`~EbkT1x?jK5 z7RbI`@dr(uAI#0> z*Yp28dH(lS1v$_)0DdaMJ+bUl=A>9*3>`#+Sd_f7yfZYFJS1uT`5ER4D4sN-4glTo ztQ$mAS~>|MawUL|BocDM6|5b;{3K#vX|2r!X>yF&T?Q%xKc-u5GK4!)m9sgI$b zOmOphoAmLP2Tcp5z8zesvC1OiF&=OSuv^Y{GYKx)#U?9Ey7or`D6h@ePrG`9@o|b{ z))pEDWO}p^SLhH<*ZS-R=dow#7Q#%ZfcQ{oRT=|Pl$=oyD(hOJ>)&^Iaa^eVcq^7A#3r10P@>zQ;;tjF|2(zOU!P4()u3Xotc zV<|N8F=ZesiDbr@El(Bm=Kz8*<_LyU&tHMo1z)%cVN0xAi{L6Yxz4qJi}0bDQ?0TH z>myB0x-nH%6-zL(`p|D$>(0{lZjDVJ+(hMr+*c5Z=(shMh@Z*@%e|K0(r+awm)cwReSYO6}h$TgUuJu;SNYg!_mdHGKevZ50mh!S5f8M@dYf z2pS^|0X`u1$I&Y`zc_Al91)Q2*~sTh-LfjGz4hW3maFl?Ku+5kb}-)m>b4UWnvXt1 zLOi45bcgHZf*Fm2zX%USD@+Vb&cpks)18xjYFP6L)uf~s@N?96wY`7vAm9)G4DbU} zFn?D??}nx_qX)Z>HJ@bd4+#P3e$u$dE2O`IN29cFGn)^dHN*UW^cMf?^|8t-VlYQ% zTSY4h!YL6+K`p6+lpNQWGa=CFYiZ=9?T5sowHxuE=RKEmNanOp{S@ZJVFuAec531b zwW;|~ZXjCbD2ZW{v(U^}?go~iI zk{w?9iD8pnZuvN0L%8(&_&p+hCBhJs6>i-S-J{QUDo|-#Bwj=-)1;+7Jxk2z=u!IK z(XJI{$UM*v3VXM*p9l`8t|e+kF!XP9SH*6%sxo}>mgG(>C{oHe@_e*fHLceAetTVQ zTH`R;r*QhMYWa(uhxYXOUk##MO= z+|<~*V1p6RJI?@FwRYsp$#ojv`<+xRgK2d%z%bf~!yDI`ptIFwlHkM^QmGZ<(JGEcoklu`7j zw7sR0si$ezKRFcil(eqyxIk9A6qDiq80!)$7XB)WC?}w!3ZuyU?37V3wab;ED5J1H zYVdrH?b=(S`h9e7@7`F6-4s=Ddj^#HB z>pYTV&%&sM&Jjh9S<&;alph%{7r$F`$xUuD`J=kss*a>hZ8VeSF-kUZ%M>3 zw+IYhf;IVZ)5)a|&*hn{i-?k2J=(+$xOmJM-)*7k%HtWx1j*t>y^+g^<3KQ=@eZn; zPhKnVXjZ{5i@zHt^35?S;%n*1+wraj3?q0g&apVvdaWD{s6VSl`0i`Utfp;}AcHz| zP_-cP)r%01ZK5f}f_y;;1$mVb?09`6Og9RGf0Vzh4T4jTO z<7<3^%r+)M`!^kvO4gwu2#CbeqFF6;b2$hDEbS;=p|b0F8rYj)~E{*IG*6q5&kvv zbpz5J4&@{D-Zy+??#^S#Mt@z!(VE2yV}I(uNri-E7(*Uw=er(#Z96P9Av>T*^42a&ckX} znC8M*K|(kd6wZke;2==5B`mqRFge2KqPMU#-~p*99f4FE#OOl-0gPH2x`D|=3fP5ceU;dC zW3N}DjX%Rvs`kIJ&PmqfY&Z! zAHgM4U@`|OnuGtBVx;(o0NZVw^8xSe?Zwuv4~*U}}3v^hq(CyKp-6@XVY z*z_Z2+yWY-m<^-pJPZei6aiRac!-Sg+xK0lFgGFBc zniW=BxbW&K@)#m2nYx))Pq}!~=>X_*ryEhaV=XNrYfQ)fukqv|{e!&P-Pqs@&R}b{ z1JAOa_ZNog81-y+)Z6-7x!7f{7!6{>oUsDrKd7G*GPDJ&pyJaJ&{C~wLRT}ISYpG0 zmfG4EaU%l&Mb!ux@7~TpaVcDQ2-F=8Rt>laTM3#0ki;94?f9+O(tPbo2nAbn3PDy{2?;;lYITE;v~)^()V z(^^AjJ=KsAVfLwckgwRw{1N5~ljJLeg!8;SP4op zN&0UI?cjL&Yj3FeuUD_B^RT*@h>lc1W1)uu`)qK z6uJer#z`cwKPCzyr8xA*5%+rf2+VqVAI!RL3gEMG$q7|>fC!`#oFmFmig?>jQZu6I zbsEN!>-2^4xi_Zs=pX-M0o`!%+!JMIF2aS?7@0o0Pbt+=jEZ+YxNQY}(g-Vg`AZ>p zjsuY#-7Am?wyOO!Ep&lOlyF{ldRIBxeIn@BFjTj2xMLJlNh!8XN!2jNBHWFM4CXyr zQzexxMiSWv)ToE>a6@#759bU&|DfVXLoZ#q7<_Zzx+;KMIT!^8dKz;Aogm~Vyw(6C` zB81;$qfugQ1Za8iys6=a2`Ur_JUhZ3eY#R@*m`)vVqyqoRv3BS1@BiMWpP!HIfkSM zegv>8ebJtz;ou2#C1t)Z6BL}aNF~d#mv4V=0HIc|d_kGer|=Q{)?J!zF-DY!N8E=! zB#wJ?4Fp}vBgc5&%P)XJML!_oGjRnm#|E-4%;3nI2|wDCqEc<~v`l{dNgFIPKX^P| zLVfagmq?zY*Yt5M7TS#)j-8bL2~=6|Hw${!mTL!Avs#I@e|N$v=lT*sY=4_(Ih8+D z9Q|n2=WqGt0FQ*>(74dy)c2orbggp1qPL1&7x;i@`m*>-UGnARC5CR&iS-$4n$Y8a z3S6jIG^GH|=6@euDrV(^ez6&3fW0w%ZytH*|4w<*LHvU;O3Zg<_G%dKBbAJ#LS-dg zMOuMXg`iy{rdC!jnzMn_6`tjC*NIV zLwz>Cl`r1Cc($c{<|Ri%JtD+PM}nqPq6xA33Fb6VG~c2F#p1>w^mZ)xv(CJ@RwkrI zJOC^u0(zV&2y$ibcLt;IhvKC)$clL+9bfr1JaY=TspoR^kP=|=IK@q%A72kgv@{r` zKH0(a&ap4cBb<|~zpfD%7jam5la6l>ZX~5XEUnx;b3e5U2h?mEvv7B zBKbl@$VUZ!7d|N?!bpJ6;d9R(!$j;ngy13=o{*n8A=`u8W=vkMz=&NPYo_SDaowFEGL!(GUoV?l0S)y?eAvn~Kl`e!xUbqjtAMXqWlQ)B4rv^1S?VdPBtGVtHQq1Nd z)ip;-RfQL0#1JeOC35~b1*<3h^ms$)daEKBO5rzdi+z){P&Y!<^7FhMaKR)7&pn84;4#JoJUl0T;5*woshE|YjsZ7>zVrdE>>2ebOZe0wZwsoD z=2@vT>^cK%n&#W#M87+DgJ4;X#QF_=c;%Y;g~c=yXMF(X#T$PVqd8 zVPFRZ!F*ebN&s|@vs!w91Yx2ZI?S>aSIz@F< zE0rP5!~MEPdK(BZty|HXod+o9Vo|x?9OwSYsc@ zr-^T8Ie&Ph+#NBWiu+W3NhiXw$)$@B{lf4v)j)RG$buu3A52OeK1+yAX23QZXTNlc zH^Z}uH_3FnieU;%2v;ZDPs8@a=8eS@WG-B%>&EK+$$2rJ^CQ8gQKQc_B2(LfE;l6d zHq}YDPMEI3ddzVN(j#;i{P$IqAdRZT8EWVl6zX~eeHX~&W*c*&9w$rJ%KpXQ;c;Vgu2q>h5uqpaM9zG6i(cJVWr?N}?*cn02e zRJjU7G3vYdU_%u{uV8e3cF*nOaO20YyJ{j>^G&z6neiK!-@A&F6Ui^AEI(Aotf@Ne zPYGOJ3$_f6z>dFv)A>FAXrTA1QevFOlrGsmUh!`Vu_Ue~dl4N2KiPCG|Irsx$T=A7!JlR0@z9%a6Vj@~8MFTg9ec4=!b{y}P^ZhO& zkQ2mVl_Grz3L!%@QVE88$qrft;#925A&C9TW$Z{)E;kTB9%IXhbwSR)V&CG}h5?u$ zxTbA*f0B;cah#YP~<@`!#*>$hw%p>wH&0{Bm}OWZdZonRl$QE(z-{8!8x{ggWF= zD#=KnVXX3ceVRb~)vf&rad3o{QKX80D9${imtmQn6#OG8D_X7IOma*9DbNRzfm0R@ zT0B|I(G?&r(^e8497$W>fW`||A2#xgyCK{gXK}UoOuC^qknL3jGb6h}@0`Sxvc#4! z&vIHC4_Eg&j1;rgtY&kl*{2Pg_$eq@>ws?25X4i}mbEqOJc@QXM;u_;HQg4HBuEth zol#Kes}Nssv1}dcsC?_zjDht``9iYCHU3t%At<;o0j^ZVX2-yTu1WLw8*~ge5XYo|H3EnK z*lIm2fD$6Qx;{C6Ss4?Dx1!k`bo-@~g!k8nRX_`pNxhx*ZTHVYDX{onOTy6VxE2w$%|ymuXE;i5F* zT_>06)>#H*?#HN3qrkK?X8#LemzzpwFf6N=TJCxTYt#IfUaN%WSLP_+y>dhk?p=?q zRbs4%XfY!0M!uhL{s*~|m{v(iv*P#XYA=K7E3oV-zVKhJl8+Rh{!PqL2PQ*Hm?#yw zP$5AeV678dZ6|huo4KS>z+&vgDwgR1l+}2Ql0~G!a?jkc)nv)dx+OKx27$Q4>~};@SgvP@;21(j5%$n3z9x{GAQ1 zeIJ5-&Jsxhwn!DVg1Z0#ZoQUVWodkbt5-TSk<%h5{PXIoJhpaQLnzGcr6WG&&sbCB z=sHD|>BIn%b%gPZLsnjfs!|FMi$2I|?PW;>GDwU$tbuqL5(ENxOIa_x>S?i{hu|F! z`nfcU@S+eC6ex!|CAM2xIM?>w*!!F0w0;QUSiaEPwt54Oa84>A+#%5p8J#Q){|U;T zP|?g+S*{=(VS0WRe zdp1icZ&=}K$>r$^5YRw#7Uwh{O9$u;s!|X~T)FUT)Tzimca>hhB-~pBphDkAL-48& zvmU(0J{Y>@--H*V8>i$jbTgPC;{j+Z$?HonP-rOVP}!QqSYk(h0{rPXvG{qdF2o~c zi+BUMxk>whj5wzAP%Gy4PH2-p`es0)|TM^`G*hn@3Oh@ z1*^GQFXCQ7m{^$iYDw*-xAXF##|yge@Sd3P*9+-r#fUGx-Fqk{HJI8NzR6$qiuo@U zGKM@s$4(HtrqQ415B>*mPcTVX>Q#N$`X!&2PqQ2>l<&H5joQH+0A=HLCaP9SC$4Ir zqs#uy=cFvEf`Yb-K`x0ez^=>AE(v1p=%GRv5sg>g(rdFQf%eDEyY(O|YVhWN*5HUmkyAXgTgtr(pf!uGhDoY7TKHr8y?E1|Zr?(^1$=VbZfO+{$eWWKGw}M+UA|hre zV+==OQj^`Koi9g@Q8jdGg)FuTryYTyzFfdEr^LY-b~1}bOAh0kU}&LFww$mH#PSDv zB-~R}yB{jYR#ri${CQL}LE`UJ$w`#(N!n&X=rU1Eejq()Z-`Z*aa_jHA|*#2Pt!4m zM#xTNB}VWes|(*0*e&hPM~1g^_Q2L76Ac66l1g5gfv~Umu(+kn%VKXG7jnp$P!K5@ ze$<^urz`W@vBY_#Ew=ca<5}Tlu&b?b^K_4`qS16Rn+3L?v^!g z+}+*X-Q6ufaF+l9g1fuBTW|;#+}+*X3GVI={dV?q_L+TV=A92*SM#Om{-xJ zT!zl9eZ02PHOQDgZ=!T3yYosi~0cEx9LwQ!}pBE z<0R5AvI+}r#dzrG^%v~d8`)Pw3Uz~qZ|C`Ldxs{uS{Yk7L5>DD;oWz+?T-+jJDVTc z>LtHri+_0D57Gmx`uTi&E-hXL6zqYHzoW~anmGa;rKJC*uh-aV0v%6xfb9%GYT#co zJhCJ7W~;CEo8qs7vYTmMtT20cq#Y`O;2S6!1ehj?O^YpSGvjzW|SYZ8{{rBADT~p!gz*R*rRLVIX}SANX?QSM6-b zDn+u)#}O!IwGi>9)w(V!=*3i)E-oltnJ6#XJ~=!+9+Zdps@!q+_9?D1{=elk$WA8&a$w?)tKl|cr0EpJs7nj+X zz=&~IuKS($H~T-fRalM;P{^yBY50DR0t)&v1CYVv-2Zm1{&5UG>+Q-s5MT7m9}s?9 ztbhGCsG>^nkG4rE-MOk(W!T}l6ve(f-low3SxXOea)2$)Q@YPadvH#}r@u)w^FmKc zOrgC-c_rE5r+Z^UugOv@3T_=+OWe=Q9tq~Mlt9$RsUcl|&|)=cI^1cL$yP{Z(cp#s zMSC)0XrS|!tycBJgBXqFgI$@RSOLcwLV0_Gz)8p$w~ z+!|!YN(|s+DWdR=g;OTscXZLl#B^rx81>lk@QO$UV?W}A`~8r7{QWT)!ZeC}#wp4= z;Y2Vgf_Bj6eoT?o1t42aPkLF~9>Mw!wNDrkrku#(jX=rFfurvP)k&fRxv$`%Xomj^ zlbeaZ$*}-K8oPpBC%@T(QC!9+M@UE#qP&ov?JG}yllEh8p=t<;PD6Q@j#+^rD-4!M z?2j4l(@@rs;o6ilCU34GO^1Ch*{1T|DHCCldeny1B#pXjEe)X}HBt_=SsB`qleMeM z8s#9#L-(MY-18G-p*X?qvyAsKX`#A^LEU7m#L7WF4{ETDWqV$|3gzv>7(A9&TL;7&gK(C!f16J5CS)9=VeR zf5o!B(bVp3rDl$`dZ?Ii_fa7*ro2_{qgZ;EAzUAt1~>`b^>8+7UU;0G_=P@8~3+8mt!Lt&z zuBQku$P8-~aOSmm9zj8dDc1DLCzk?sre^X#oNU3=R(jq0X{vVYY4ksMY(6y_ux#b3etOB}KjFaW%T>3*|I3<%83RQL-~|qSsZgq)bK9Rw0cjOjw%lG| z5BkDW`BMo49BE}o8hC-@TGcH3D$FIGOeC4vR5d7gaL$}#0W8Ho#p=Z89 zD(NJ5!FJxHLU*(G=2XhEaF_ZU|+%$3mPa-KxLS^a-s!jG$Ns~(7-`sM$j z-pOf(Re@fu4*S3i$^jr%Qx9&fm#y>>gflx~k-iT^Ra=!Ha5%lfGfD~{ohTHAO3qB2 zoDl>$YhNQn;O7?-OxseR&wCuAdpjbfh42#Zg45EPnk0@%;coUT0-`@2(H%i|ju0~< zol^CHt2`2IiPSLvO|VUPII{c!JzYKQG|3y!IJJRB z3;Vr3RR|cbsQP(lXXT$cN^69G#}VU9h9$WH^D+y&`{bh1<}%x;peO~J0c zccd{CdV$865H=<=Qm4Z8VKOzTV~fYInqrvV>EdK$$~od_0?^g@j~n7ViS4P+wfn@R z_DVm-=#L0Pw;2RAb7(r8JnRrJ>_RvUqWH^IuI9brY9V>(Oz~NS@P8r5Hk4QRxT~Nn z$ZPbdXea-Wxz=)Lau67qR}x!TVVVnT<%+8)EP@b_mZG+4zbLvyMl%3ubxeBQam37VkafmFGWd}W3r^b^Uy7A<}8!q zXa!yM>oDzvpSnnYs4Co3JPmKX(dv1yXq!26!j6wtZ~%D`sHMV72;GCUbDy=x-O1{n z#W!0V)^}bV5+?rp3{Dzu6fWUuv%5JoyNUrPyxgcg@BH0uHMl1Qu+}%v;z=kJ z4EilZk68TwQ@;ZyFUo({v-mz8T=0d=$jz5jl`pfsVE&RgzgUjN0@jj)BXrt!g<9{; z1G$7^s<+2qt)2zC5Ws^VB9ticm5U&?&qxv2t2%r9VHEYovA*6bku5=7uffEN-qCU@ zMz}-4$A4;6$d9F!x#DF)op@#Nq+)6w>z+1-wPc!ZB`Q!Y|BiPN!~yGB46$zFdd3|{ z6GcZ^Zs9`WPApj9 z7~z|8#ba6{xD#7SkL2iWg)I*(8v3Jz_p9qtFoXt>BE)SES-yV>6tF<{z}80g4-iH8 zBa&AZY#7pI;W#H|4=Xwe^INP25k9Fh!gbnV@l&aFe5k)Pc{xQVg4H_EJIk6m(~6dr zh>R%VV->AqCD-&1mG<2rDkb|$la76|5wQ^ZNQpI6?k=A=htBJ7;H9bd!SAhISiN|b%`3Y)7GgOg%di3z#wuvr z)E~OH+jK?^e2`!XwZl4~j}5DCDU)1zOZMDwP5d?J*ha`q!$bn`CgQHE%=FQJxfcp);6d$cwq--D8zVIX+y~{4K4+%o zs3#Qjuclt2jTt*%Kh2Ut1~H+NbkN94z6e55@BN4M5z#;wBdjK zKRYRbO$j9LXaBSO2ke&ES)^+LCg@u6V(EqT7UTg~4_a!Eh})*^@GwD4Xbl3}dDsjj zs?~Bb&Z9~u3~eA(@g$fj#2jcm{wPI98RXm~J9JF3R&Z4jVAZJVt+TCf5X{?fJjUcy zpAu}CAQ@~_&!D10IKew}?R4{^q}FKtb3Bz_(9rkShp&ke9?+{ZEBeTEB^>67Qzy=h zqi(FB6meN&y+sPSf-zxvR7!fR--QAt`bqtg^=v5D z8LBbT)}a`T2!Up{mtfNn*5;eGY|R`>DAYCVwks>< z*$yW<_tB1{U8^mcND27aC^gJtheP39PxnZoiXY@bXR;f&A!D>ajB`?#gjEorDmc4g zCNn^^>`B2qs)h~wT?-O6E%69VoR61CcF3m%5ldg;8@P@|KIF0~bATjvl+272Je0n( zkpRG!%d5{a6_6kO*Bj=PU|#z$7O=c4mnJ)#nY(b`a%1YPwSADI@G@uWx0-%+e%ylZ zFT6lM+V063q#Qv>hNmhj~2}T6s<1>P+W>PKV3ATM58RlRJ3;LHx)IttTPx%WE&7OzNlu zPHxz*Po+L)xYyk2>-inKT?bDJN4bnX zsvl)p^R0C*Yffj{LnyvgQ6f^X|lDW=Rmz|$_jfZ$MAh?2wpzHh-J&I(0(Q2neL+eXW3 zI`~ak(XBA*^n3kzfQLF6lSW;UKL5dfZ0(tzF3Bu73&mA*%WN|LI`eJavM!7H{$IPkNKpFk4M>*hHdEXPO15Le#OhgQO1CNGP@$u*eM7<7%RDJ{mTj#tC zqCH&%9jcawl`Z%NWZw|Mm}DjShARODCsjsBl-|f5)QH_q{ab27Ns@R@@1#R|9I6*p z<993k;Kz`fkPXT@XFKnGH>~kqOq2 z?_!vif40hhz>zv!V(v^<(y5}SAlD&p5UflzVikx|M1v*WlTxmmLaPojHYUjTzD4h# zTF9MxH#o*rKlzrcW`E6sd7V;%s7v0RNx(@Ucq!qM@F!sO^z;`9AK2Q6hW&LBg>E@? zDUhKB%A6${#CDtc>dg++s6&fN0Xtz|!72fq&!eY|`LyjcqL&bz0~CFi$L4Liv;nf# z5;jEiEY-uo#hkKXWQx6jBD*I>r&S>L&0a%PC{weTo!;WP#TfDgvJEu7w}0B@>e`o7 zOr)I9>iVMQ3cm-aybHTMce;Q66gq7O?=-v(~@qvl>dB4ov;JQwojz>xql*0D#L@^<&X+3*`$v zbzB(27^uIrowtxJ&pi=HPq*NGiBF}f=-#{q11zaZIIKLK_ zkN}b;06kqA4A=l{THksB+iy*wC9Y9BW6`?{fi>F)q2e5`#L(fYH6h7vE7f8|0zCvpdX~J}TuTvX@57rWv(s(frhp3d(XjS%~i4zR4!fJ)^ zhVd1tp@Ky(^pNvTyoNcWCzB0VA-e9*gF_4jlaU|Q;gLEvb6mUGf>qq@m;E_=ya17@>ox?lBR9(UDzze`y2{Wqk059}Z?QRIjBARmgK0CK)aPa4b9xdHloZM(LmN#96ss!GO)jiPk+1}c~ zj1+I$fbr()339^YLwk7-e5xVGmNM_;t1Ub(Nj;bp5<1*dN?e(wO?VlOIxV04stcJ!f!``uU0sqY2 zsII{l`QCjQ_4d+>-|q_PRaTLQ#<+i3XNw49qw~c}C(mW`8!r#sZrwuY+Pl$2x45kL z65oiuUdVN~RP6uEK8`v$0Ct=4ZYPutvyu;m@6AIGd~`L~&fK!Gptf=V7+r#ZlbqBv zv*WukVHSUzMYd(l%%i0Zjd_c5OAsWECY^(9lM|noljC9f)5rindHPA9i5Fn@|JsHc z3*=xG3JmBSTL{4u3Z0}h#zQt5=$M(z@?)V-nu?K1@ z5Tx5tyNH9(yGdOb#{)td%-GPn!5coSrXI2+veCL08I8TF7SR!1USC78zb}^;5>Npy zakdvu#mH;Rvnj@G($2OKJq;IYNOe#N=I?|Q=7Vhwg;Q^WF*mvC;o_hF5B$mAJCOSA@tSe(1>3I)Txa$7;j z0tyy&r+(Ek8AL!E9G#73uCl33xfWySv6s`;f2rm9gz67mv z4LN~*pmeIR6HLX| zT*hrEYg`X<1kwCB+;|WU1-xBvJxq<6ZhF4Yukb$LWC=QH+xtx~?6Dgu#+c85m`eb= zZKZ`>)}W27q5b@>GQnWWPgt&7P^r<}6mr78TnIitzMG?b+WD2=jm=AD`V!@~TrF#4 z^V`aP76&?PI7IbcX%6FNJHK?EoWv~#I3S_ce5 zInPQ)lCx+FVqx<^@W)4JK*QvtItvGgVMke*sq@nyo)7V?Ao;neW5P)ET3X26g0D3v zCOp{c+2ChWx|A&;QoHbyX1g<<@QJ!dr<0aDtXR9;{*;%b|COgf1EnLQLUJ6Vz%>7} zGVGZJ1@<%PRxesffZiDN2lb#8Ij?L_in*f?@{a?FrPPZI9>&QCmr!i2-V{-AHT@8) zoZxL#?Y-b0fexu>e!Y_5$5bQo3PI4ImhW)jm^gtw>RejIXGA)g5VI7! zKkunv5%%~P)zm|cN%3w067e;3uSzTLa?VDeu~<4OkMyvhg!|C|xZmu<_eS!V zx`xbuLUCi8RQ9ned4gnv&rPp1<17`uyNCW}b)#(gT2UejiM1=c;r?;0B8H>mn|vR- z+oX$OuGT6a6{)-5IU*adEF-p*wP{>QK^vij09J-#9_v<>M^1kxGopjzbxj>!QAO@z zF1$~OEUNkDFuxu8+34Hi9^Dg8ANrqhoHXBn=gKDwWnA}rj9B;{u}-l zPkOQ{5tE&^o1{$uqKiDriZWQ;PH*TnfV@7#jfXKE9)qTXFD-}fgF5b#c!Gz<}??Tv>NI+zmXIY2*1@R{JMz?|a9DpU-tri_=b2Z{vK4FN{|) z^Y35M*+S|Ab{G)@I(wD_c?4vYYwn*_PbN-p2n!$W8sCM(GGx@`c2@bTdj~TO1Duuw z!Kc@5*4-at-BJ$KbEH2032ufaS;;A_1o|DkfGy>RTW0A4Ga=)7dHR}a%`K;;4;rS; zcSpUBmxI54`#1eM8}*DvfJWNw`mFFQW;$Uy+}Bdib**a3w;p^;lU6)VIKt{lCw1yjif#=zMHoJ0r!6j)uUXt&@54ZAlQ(%;qNU=|j%2LvvUC%eoW^Ik{Klq=|^8wT?#p>`%e{RPu$}_tDR*^oR(+N9 zVQ(V%)n>xR9f@h}olU@X4?a)5ylHE$>rhI0st3sRQUjZ@rn`Xo({qahLx`vOoypMW2mEvNigc&h0` z9L2Lz{N+hWuXsEoUF8ht7=1qp^)v_6eRhUuL7Khc@HJb#BC5?qMHN)c{O1Aa8K!94 zm3>e8G0;`5-+I0jGTeS#Y6&L}JTUxn22O)n3`lN{6a!1SKv|wP^3`*L7IZVqq-rzq z`GdS^hdx0%e#eAD9nL4YPub88 zuxi+gaM1TiGknG>O)Yh%?${5G`!x#9u<%`?JSc4q?-D2f@{yU#QxPQf zlY-9V9MBnFajTsnFRIcpiJ!rI2{GD4BzxS}RT9*AgOL?B{fh+_4|*4JQpAI-mg6o# zEvZSFxu(87oIde;Usy#h%8#>1GwO=)W0EoLo=unX(37SmV`(0%?Vm8k+CzO6S(E+J zReU?0r9GJC-!CndIoY|XFnu#U%U3q2%iy*D_&;TKOo-*jU{M**LaE=c1y`;_XDiD9 z&pHM%@_D7szFwEylat*1}C z20oAbm_om}4`|HK+bT`O3Hm^%p)@GyBMSFD@@|zRu6(9-sz+nM>K0D;-g;LfVwARg zn(=@4+2GG~oo1~2_4|D`O8a2PrFXS3XY|V{cpuI*LON*_SE74qCTpA5dGW3nH_c<` zMsa;?7zr)L4@hLQg=MFwE1v~kVPOH&_RsC^{JUGl+%}ZIQ@eItu2%p9+;NBNVw`6P zeD3$ea6{m6f1b&*gdSQjpTn*&LGmh#9j0CZ$~tj;KEK1afM90hkgA!o;s>C!T74HZ zreBCWG+Sna?PesM zlnUmN^{So|2B$LG0kvLOra)Vdg|yaZ4+R?yyWYE>*@ki?pqz(YIBbt}pjlNn8q z3VXxz)P~ySZwMjLbNkw=7azk*ck`FdHmp^kGk>MXL`^zvcq&fdrTN>Nfo`POwj#!Q zym7n>$N!#2!U@VW&tYTlXFf zMKJE5A-z>Wg zyAcTyu$U_J{zuTRRJQPN7Sr4houB#$YWJ(O*Do3BFepgPKdsl29api`n!7H8y#_{C z3U!cIJZ>!4>+5!_5h3@aApQT0!3DB9Tp+-!R#ro~uReZE*HjC?e|_)oeA7JOJ|7tP zYucr^v+3Vm+{twdbnl+uE-njw^t505#lHKEUyB*7H=loaT6Ph75nOfe(F(Rb)Kmj` z8w#q^WZv@ui2|zYQ}$2R7T32M{Ojo_b`eHqJE`eiNT7C@A3faYnBJX7)(hHf<}W{E z9b=af1+vs#kmi$mYwWh9J}`bBPvvk&pgjk=)o4b7(!=xp&+A^ks6&V4&FUK^Fk`fX z0N^{-Y#RtJyjAFL;eH+bu9W42>8g+g4f4DIel;NWx_$ee+@}q!;{_rLYm*Eol$$nn zOb~C~=#Ee6%MhQJ5pe>A`WVpQ4gxyjK(Ss7=4+J+%*VsvZQg!ORtv$dfdE|hyQA#D z-~XTT!OBn-eb)szw(P3qpy6*zU5o0CyhIE{T^H2iWu7OpS}mz0Hf(Xe$RZlSKtN&_ znp`gnZdHhJZ7>p6twp;K>4lWCBqS1FRm%1~8Lb|%)Y3R93&D3l!k3NmEP2IbYuQI{cj^do%C9PAC4i&d=gi^BU^*YTWzPB3)agc66~4OH}> zzXU0#bi7sj;M5v}=~ja65iC74A0(s7^~8%>zQI+h^eNy7p#IQ-XpK)zRu_f27gNTc zV@4K*Gv>|5ILSnyhOshWZJ-ENM@bj^gmLu2)y56`wi#YdH5{i&LJtVe<60w38KgKH z#Qbu*jUPFILLz30k^|Zi1mm3OC2Ey$N3kDDN7AZ}f(+(tUzvvTO74>d!g<-S&EIf` zLQt`d|EdWi4{Mg_Cj&TbR3w5x*BGho#dAkES+U~&WFn6P<#CSdM&+)Ort+XmM=%<# zA$p`+^YbXy%IE&rq-m&owTwy+4wMYUQgBtIr)h{M3z$4D4nZ|#XMBAVb{bAemFERE zy#d*xLZ34xVwmLl#wcJgs}M}|&2pqp1U%G=>Q4LAlpa6Sk7yW?h@m66yG0S7bfH_L7S zFuq53dpo|>^Kxa38^A=q6|nL%+1r?5Di0c;zbgbRY;V1XiB7LSY+{c7o1#p#ArS3qc%A-=!C1R~;`iU*xpSSS0}W znYPV_y&3SC7?`r>_y9qsYll6gG19+2hgG7UBrf9e0PPK^$ca+Qhh^IVFL8|G8+Fl&hv*=_aut#%if zK1RPd9pi~YL~l#Qlgh!U4nis#m5VTYMu?cS2%@rO!_M^#BR7wVY2=3opf|v2Lxzih zZzx8)fV6FbEyRz*!CDUsOhgKbtR=4rCVV!eMXW&HVi^>o5foi`(PNHEbb*0Ndol)Z zC{(>-^rcw$fNo-==eNUZASjzqHlc9J6~2;UAO~JB=<&1ShZy^cbOv;g z_de!M9hu|j+;EhyoF#g|LU zmsrfLBIKG23&D**#R#RjI%6NwGyIiNI%!8~Qxg_2hn0!FQTgKy*}+${J*HR{pj((j zDg)Py06$HhNTXXhE9d+ep+u1SrNkV~9qEMpA>N^IkT7wiX{T7}R^Wg=rLlHZZ;#R` zh8R{PNtvwG5XmS_%-oeTqcS>e*gP0QjWt;A#gCK99s~IsD!i5iygW~6m;=l(OPnNu zWF+MAIRmoIaEY?!rmABc5ctHfy#J*hxSaEHGIrCt<~7)#FYaOy2TYoL zsDLi`xQM`}!*~^NC4Jv;j2LKpUVbBE`(^00kexnCNf~vN>e1Ui(So_O&=^&InqE?3 z_m(pE{#I1i^zm`^=}!4sKQ>+wA1WP;K19#_F8!e%QU1{#A_o-JN(nBPM>JSDlvS-+M{e5Is%tn|{E&VIu}#u@|n2kK`ZPF&e$ z;%?C9Nx$!sg1**o{59sUWLlZKxx~+m-gZ0Vf_tao=#^*!4tMkpo3F&f$co;WKt=6~ zoXD{IkR8Ij?eHhfNYyH?yQ$HKi-`9QW5eM+R7|j|+n${0ax(_#IBP6&2Rgo{twJax zZNGn@&SUR+!5gCLsI5=`<{H;5Nw^2*n(bI3iraO28iizkY;(JbobYqnZ#!7!Z>5!| z+?7=?{yvKs{Hh6Puh)ldkF*Sr^ep%$8<%_+CmrQj-6Ka>9)W|u_jDE)hNXSexMwbE3~xUqKvOA z29$q6(X{mQx0<%d*Ii+gxwL7iHpL{Y&^aA!luJGuxkzf^L*W)F_>(+Y?cP~;2|w`T zmwH9ow7Q);vf5I3_)ken1L~)e$F4!g(#voxVOY9)`Zv&3$_K18%s`Mw#wu!YPS1*G z01Q#3S|hyWCD zGB7f{hufA&e@zj{txZ`m7=xP<5iuxVdto>l8alGT*Skm@BC#re3KTJAilhuvs*F*m zO>?57Kl+V+erlDSOI5!wtAKYv%$t9&Hk~@zY<$wOs_uNeJk{B%$4YCBd{1YazmAaN z4|ny1QA++^xU0>EkDR-A&(Fc1JZ2+#`!S$XXWQ{;%)ppY5;kqTnkFEI#T9*sYUaEb zXwD{{$Y3n_N&7@P$#9CF7fLq-$^bHh(?{p76)TEhf?>sC=bA<#)M-IgxZ;o6h*Y@A zTWYj$e-=Dd&>s6Zf;*H@ICpYcctwku>~v74X>#Oh^LYSyuwTT_q|ef^)oIhVaL&i? zN=r~Jxb)a^VKNC07yFvo1}SGHHLd+w@BT)4@%HoA)*tqOve&O5fBaBZnUNvkg$2&Z zfgzot+p_;PVAgo0dHZ{}!+RXtD@QSLmV2R5ikqSb zO^MQjtWkkNMkky?w1&oB-3^EP!)PlsUe!Ty0`~Vuz|&sL_^12Wu-Tq)#9df*L>Fs0 zT$T1ss9Ja3<0vA%AADNu2M>lo7Pm8|tsVf>n$Sy|t6J-@YCcz9zy13lGt733poaKf zKvJ$kjBLs??QBWi^8;DD)~PQYa0Ws7_J{hoUsuS)(wXd@LBp%Y`#{@MhMziT@+vcP zCDDok7<+>Xj|53O)xt4?=eNss+)l|{O00cm0s+^&tQ?i@wZcL#d+4zft?$4)pcS9f ze55dhkzb!Sn-_QwYHUuNPQyMtLxELu=n3AaV+OgeL~rgGYic0LoL-oQlv@6Q#Lx}2 zS`(xu%(arH+v)-1L|-Gwl^RG6sg2P=Ae8%{%6p=tJ(I8qIwarY0?TBz5cLmYzTBlz z>Ls6C4ch4Fk*`Q_Xkc}d5yI??@5wxk_#y<6@Um@8WSJ=&;){sZ$;9e+$?0mg5D&Cd zClxz(m{Ux`QY zEXwcob0a!I6P<2ROJ(>>c~`=H8+TOCc^Op(_expSEu)DucZCkh>XXQzY;88JCHHDx z5t*vuxY4QRLZ0j?k^EEHSjRVsArAr~l( z*BRrkGuO)f1Wd#74wMEF#69%ao-WkB__+hsdsp`8LQ#+kVufTNxo~<*EYa)Y6+Mtz zRm?rVjp(6jq(+z&KOC16T^|z2>fXlaY-D;&(f6wK} zrwwBAcGjOeaI5Xu_k5$uVf;|A=-T^<9DA<|-Om7ySz12K6LzZAakc!~>FCo%TEN$B zT8<%@9i$CFQfEj6hvnUU;v^l3bRC4%SP(jxhtmwmyfsklL=l%YlA@&iGa z^ZrvUieg5NY@6+FWf_CQXvKH4%cQS(o^BhPO%@Do^u1Qs zggLxem;nd@xP=8xVa1m}gc>4j8j)0&DJls!a_}<3{JMM(d{eQIh?v1>sJ(K`p$}?T zzbQ*UZ6hVm*G?2X$z@+NzeUq{Lt!@9Fkkw}XR9KurwWz$u2h?o&_LVwWYq`1?t!MCRqYm7H&5DQCbMhF%46G=R?1~8Y z4v}D) z4HYvM#SnE+p%I9c|AcffW=TQh%Ik4YhgmAAw4By$qUouqK*N*$utrHoY)NQin+U9y z#b?3jHvnxNw0TUEfo;i0m6ZwY^u$9kAcVVuG_}R{BJSNC_w0?P zA`$nzz_lIJR>SEaCly#Q6!Q|Zs6`gDfLA6pHn(=+1rNPip&tN%vEt*&d&?lhcB$M{ z#jmZgA1uO6w8`aoH?jC-jE+EIvBp#AI5bg1xFK$JkjWCAHzrzP<9#|Zrlb?=7h=LQ zZYE+!OQM)h?bPdv=_cch8nMCBBzj(tg^49Xbf8eznfLu^y#p{?e)@CtpNnwFuM9gNg3aua zkEPc5n753`%ly+$++dvk$auogN}pe#8$aK`qI7tWoZIx7$li1Z_0aGZx54Z54)?vKm7$Zrn_5CotB{96}H1)+8$7v$WQ?n917_E-h z@J!+8Fl8JXm&hl`qw1==)RSpEtRx{%KhkS85Y}fwaQvm(uHBi8QnS&eV5bni@3q!E z$tcZYA-A@jOYhfnB`}A5KPdDW#;XsLwe(Iomz2y%oD;N%YCY;s37^Li_IglQU9&Xm?N?dKifvTRD^N6h`lV?LF}{<4fYuXx^US3_;O`Bj!r+iT3T`?n|S?;QP{()=o< zWK|>p(QM3_u#sirFDc+vIZ!N3k^+ywcWh?;E%-K~5_}Q+ps;$+COkjBPTl&F)}q9h zKzk&6pgfHw2R`z;m(%@!XfB~3tQ{ea>Is#j3j=`!NSGh84NNWe0jKrS6i!0Wg_ z@~;;UpntlWIZ=wxw?WN{JRU;hFb`+t+sy8WfFXLP?Axlh;!@54|6_&4>eVN@pL%$A z;pZ=3$fFLgt3e)ZFFcVaVu{Cb@!mdUGtr6o zu)_DqhTt(?@fczcXUPBPE5Q1et>^ln4q5m~7p=KuJYq<7iT`u@qia;S--O+;xeED> z{(5)uswa;-mDiRutItib_zHgs*&t_Ei6dhqeUFwHD8s8yvix_Cs=*H!m}ZG3i`I0{ zmp!4j<>%bZIyu`23mgMIE@;XMpy1FCYx7ZXOu0cODv zt^gy%10Ot5hW>MD#*~W0Ab&J#*Muc?(ojOIPzA@l9%fQXO^Q835;|V;J4VYhe9W!_ zE#8>v&e!h<=3nx2^d7@sReZ6hF2!H4N+}Qz>T2p`;we|<^nO#m%Hle|w+v2olj+h> zC!iG>uDIsRCbAo>tcs#M6;4Ri-A8Bpg>?8|$gW8Vw<;r;A&{=GQ%N93dE{gqvX^f4d#c#j>_aO`dJmls5aBQbMGE;3O`3 zNj{YeX^co_@MVhTyZM^z8eax|lp>r+rnicB!OUpSC)LX>-zYv?1|j?|-H~;Ykc^e& z>M+MC3`-Px3*^(T=CyW*st-E-qGbG$U=P+p9-09uR1E^YJ>yibQ!U&{!$mBbGuM_K zuj2yc4+y%M8A4E`&)iDszp^%Dn3<~cX%5f#aYG3Mj~_d0fDzdY0C{U|UtlLn5X)ES ztGlcu_yLu~n!k=r_I8kOv=bKQgE&UJTy6WOV>-FPa-ci9r?>Y7dVTK9eCoxX=~MNA z+~!7Ku%?x^n@o*kW+AFaB7+T^o~8B&NjBqA!bvs9zRT!wlqyN4>O&Au)3t@TAQP@v z?P68_%^>;J0QtNdcVl@q-HOm7`g1MkRo~h42Y<)+{^6T3r%w#w_8oNhkJjAY$6C$2 z-=S#aHoka0AJoFeKEhD`jX~?zS!TlP_8a}GfXK3*M*wG#F5ViK_81%p6W&YyLRQ7s zzbBX<%>=|S`&zrSaMxvQ0~X{{`L9Y7W}6k}OyYTohrnXCBrg(TKKdv!BvW-$lw*Or{C3?2=B$+|Dk$a_cpm1 z>xSPR7=SxYq*l1oX}>gg6dXljM-PmIC5w!MbPWcCRQxjl#x>O8II|fQQb>^go=|@l zc+?&d{;~gf^?gOA!X$&iN6v~*p%@z#F7`C90ooFC><40 zNP)dh_ImI(!=QnnYNRfA;HU*?(KC)6v&4@et%_^;i$dMHP^hNL)RFSnO(0-Td_5Fo zP+WTtJr-4l|1n#j1cKb9#ma23(*yBt_LV?~8oA>qs!}L}eT@KEEDM56RhvE&U9f(E ztZv5%3pMjW9T!^OAmvnYE7lO(NWahVN>X?bgQGZ6-nS?TP{6P0IXutW>Q@pPutq7# z(G_}k>Ka7c3KVU8F?`17nqrD<&e?d8SPGsnv-KWMWaAFEkwO=1(oNJ`43a#251JtF zkrQ+;J-8vm|Ki*ZMN95o>S|FQL!L2-6lxFD{L z26uN0?(S~E-5LS}g1cLSyEmEu!Civ81q%+rf=h6>dGj5)=g!QJ{?}Dq)wS1NYdyAU zC=DnH$oc}v_^QcoMLE?yKm=r;>Nb4a~ZygfFD}!Xw{(*RUKrpx+zFWH3bR(Tpk6xXH(05!*}op(qxE4Pk4+r7~L1IP$Riwj71dA)#v zW$(9tyotVi{D=KEyKQ*m&A|J+*t^5p+ve>Brta042U-q|uj2zCWzgfBGW*H#S6wNS zy?%X58WG-0o^$QqU9qj|-qFMG`9`^~T`_%^-?NwBNo>M1ztXdjcn8Rmi!+ihsJ0X8 zviRb@{GMI6P&2}2j$UwkW+2PGXX1@*pK5FKzLIHq-8QA1Le1p7nOqGW8*<`49eU!4 zwT839T#tLP-ZPG;c&Q0WBbAsQby0%S`H>6Y~aXMgk=HNlXYN;Z5X2@Fe+&5xv{SlbV zAOGJY^oL)M%T&JYrjytJoXfe(Z%{aUl_mrgB*73vfikbNS@4;`_81jufQ6~FcZdm! zdBc)qTIW+YD+D=v)PWF(KTY2TM{*Vm-V`=Wo$idJ@I&{T0^}0xE1H-~GX~7C2w#n$ zMZ~?44G^(}tO*F&LVTP#NfNUd2}&zoYA}VCVM|3{)r!F=MC5oq%6d$gyi>p?q=gn| zNu5C|G(}=N(?pz83V!TNf+L)v9QGQyKSsdnM?RCaF?Ch3lC6&d6dc&s{HUf8`XCsx zIo!^_AV)AsYNHJ`k#Bi93zPOG>_s?Bf*_|yfjD1^JFDSy0QPt!G;IHLw1023$XX~O zd(+pj%YA~DLdqTz4r&7BBCP(kuUwAu{yP=GWNk*L=TBfHb;8U4X_E^xCnM07MbeA} zxv=(FjJ+-AhimEdGfqqi9p$`yf*C~EKho?PsWq%4;CV|b#P zS~sndyt-8uwD+wb4vNPeCD{ubkr{X-4H65)!$H3A2){1%W+j{8r( zC%x9Czq>eU-N1oye4QT3=ZotJ^AG-Kq~reMX|Jy#fahjyNhsJQj;ReYFtH}fISDWp6tC?k4h0U`u{I%8zDmFlR~Qew(_nkF{y5dn zNy<=i830COpigVXv0#fMX;iu7kJBgVVL`Vp?sWAor|L{Ew}+Zg^Gi(yXZ10pNi;Ujm)1++LmfHdV=50`0-8T2hTE{ie+576s}t!*sl3#;l>?W#Z+=?MRoriXo+4 zvV*AIhbC}MoPz&xq5?tUaS?V$u}4llV`fp5FKq{>ef99t*tneC2O6Ho&m9*E*|d&h z(iES!MbDI(IRkzw&t%bAPsJpC=Mhi@S4c1S5mj1n_Mu;=Kh#x^C3nvYR(?6rkgxRe zF{W)EEDLy7=%ksn{gwEv#5il`i=9393{BZPm%(wvKccA@+$%r5Wd*HSJF^;p*Sl<5 z+1dK0I-VYjKuyabpA^338MiDCz^WRY++5nUcZLKC2+vvsnatBG7Kb8|zhfCf(g7fP zjR8H`F3~T-s++@!MO;}P9~KDCWbqAStEOD(16tWR3-}F)8uT`Dgl-)B&cmOf>i+yJ zns-x@75j@c$JdcddqgAUXaVOCvS%E*HlN1!t44;COR-a6rzikfIfb#F9Oe!1$Xvy( z+QhHC9(tl?-~?)kCx>2Q7(n5T1nOJE0uZ{GCNL6>M6`8!T??JHU5duW_K9Vb$x*ij z>^N=7l&{luVytk#A?e$TZ>OFM=sCOOyoL$_?>d^rRUMx|Yn(DRK;oN_x6TXH`D>Sa)MpP^-wO^{xKCwD3s(_}Gz#3;*A< zkkDj(>ab1pvw!oQh}7w+KX3^BU##=6!YA`(S}=Yv*Z%{gH=p`bCyK09g9!oP?@I*< ztH%3lf(L#N{ZqMGXx;>kUYBOILg=I6@8JcO!yyvo$so7%`)^rO zlzCNZ6Cy!#u;~rkd5xy=EW$Zb^$tRiZ+jy?$^Mh-3zw|2xW2HUou?tl{ z2$UAbhYU|*qWAPM2*>nD!7J)o5@LG=wa7$N<8I$jVWOmS7jl3ZcnNTS6y#|S!`X1d zM|AM(sYv+3M{ub-y$r!?$gikhX;TEjbS&(O`3#wxSaa_PaAt(V^b`zB_KIU8oXIU4@?g^mGB_J2;!2Tnxr}XAC%qh`F!g3|4XR22S#t6@l zCBW|$^D!2L!YFUj`pDJizi=C5V)0UpOgu_6j~~gCNtEv(t13Rtn#I>R+CNgkLOG7q z(cqmrEQLxiBL$u3?a9RA5 z^u`-GLKBpkq$r+GyPFdFBv|RED6yS0FBeY~dI=3KoaEUZ^{GoLnx4p&zcp^YC8_*IPZ0yEY>QS53#)?0MH(Hk;p)=-O7lCJhHoK zO*gopTN8u$F*$yh*_;o{bJ;^;LgfBwushuQ>A3PN$*)_&Q7m~)vCjk_mXxh!T*eud z7D9H)>&j|bAvvrUnaN;P0fB!py8c)hQ9HC;STv!xE~{Qt-&JQ{%OZR#$dzGTXI}b$ ze|yhAM-GMlSr&j?OAG{qs7Gc}jhx#*G)>N&PO9USefS zOqy)Mo=raH!YvLKD0+J~6zrn7wSG-^86@@}EkJz@K_eGnaaLr#A8^e4RBN8M z6sor;6ZxFmvDEHzarz)4rD`nHMn0yt&i^t*8tata$#Xxgd3SYaQbDluf7J>~om$m<~SFtS8Nu$$1}eu1=o zoeX_}1Sh@#JN6L8I z-xd~QZV*LLes6AL?snY$B5*#m`pe0rC{E8=4B8bY6Ox9mC=5&f)||x@&WYGd!*3SH z?O=C?t05K3c~Yxw&ZnxLn#!qjX$rvS=<-nZNxhBm$0;j%LC?uJIi%FTYG`}>D|4U1$k)hlWGeqv( zd#&usv6xA>VoYZLj1rs9=&}_8fGa~k*Get9Cbq#Y(-2CaViN3j=knd{nD|$nSHA^E zYqbM6|BM-gY#zfH@;=bvh8WGg15h>So#OWr`t9t0Kfmv5-mGacou1+cNGnhB@1#F_ zH0;M~x?pr!1C9GdELm?S*DO2YId`|$)tC|492Nmv1Qf_;4Cn$ZFRi!sPG!FY;C%{2 z0!YVe_xG}3cW|buOR5|vF1wFA2%imq4sO~*OK*^T=aslG#v)Rm7);#5+d5wy?}8oX z=hD8-n+Y%7JI(})`2G)eh1Y;{aaG79^vToasMX38GyoCxhW=w4)waWzRRTqPw!(IjmsUfRVO_c;k|72o{?T?Ajo58 zNcSMTNl42H>__y4wN|NTrp>=D_2?B>}D>8vd9 zp31hDHuCSBg{t~JvcT>@*_loFIe(*kHFuKv=J?HnK`WlpiE!|VN5{VOh#xzzK*6~D zJ(8iEsYN4cMh9a2m)=YCuXYr<}fS^-44ADi}&^q~4+?Aw~13*e3{kn?8@$O zV{UTh4iMJ8~)(%(tHP#PBEkiRpxkUM#mr7jk|4+ySsR4U=8RT!m+Z4M?{I16{f)$18sc7~NMt z{6ETHVR!ijEl0YYaS%HMfcIp>^(AfL&aiNGlY+e`^d&8efST~%>~jb1|Tn`=qieoG$_flyqt?lSC zHKcmKMtz5SmS1a6ry@R^u-L$sii^q?`RrzqJ<`!{G7+#vNUn|WzI$NHOCot%SjXzW5EmSjK4 z+)Fgl!FuVONGmzr`>UeT?@`-2@k)Mxf>EaK7k60d_A2M~qyB^oGUs9Iuid;_iOD-2G#9_p!l^@yJ9GNLkTs)E3ASxf0^%zkQD2 z9P|6H6t6xqWWb8Iq-3`<8q>WUd`dTa?YHtf*{$!}dJnttSvBL2ByBtfM5r|D6xz`( zo;MJNezEH3l}){{z%Dqc2P%%lw{l|8ie*Qw5l_~i7z(o>KW2*#uyX}PU>8~yP~y#rqfi4*k2BxO>x_ftwhTcbdjlL-g# z&F`jW_(yxhrx1uWE%!j1XF{;iUfl7?X0VPw=mkdkTy;M+CK>U2sh)t|QXNqS$ayPc zDkVJa^X(C9BtQl*@z9?yoOoy?IM9iD&I|sUV5B8=2fLwj(UXCA*BS z6LCG6PxuLhxPWl(=^@keOP(L#ZC9pTgn_?k4qOUu$C8Zg?sEPUZ9&T%7-m>2?^?e?y z+Ls4fx%aj?6(X@%fz}agv4cz6@1!z@4#oov{F)JhJ`+hk_^NYPr9qD;=I03?ZHo&C zJXj+v;_U@Af1`n_yvw1fBw7r!Y;;5J5#D>Q5esgmK>G^d7fQCB0koq=AV6*FK=y1- zQhp+nZ;#gnG+O(g;KDYnJv8Ik^U<~lzpo*E{2Z?AstW>A2AaBR_lx{SHXhl3jt|rk zGb%(PVC&bJDuBXsWBVEGl0@}gxFqLa2rvLAYzGN|p>jW&=c(@XLpx=^3C}j=U7u3juS+`p#$>V#d9C zNT|YKr4kQ!{0_{4+au0EGYRdF9G1^1M`PH_-(Vf?){5U$f$eJfX#df;_iHh2kvJbT zfo*{B8=@Ub81s>K{tEm(6!SdGXWAI55ZaMr)dF~TGx1MG_^F3QEJ!f;(H4_5N{AaF z#)|uc>Nvi1PuW43+|&ZR$bJ?z*zsQ-1X5DvVSWGy6b zB!~%GhL{Jx8`um`zSeAFH4S+e=D|fRiF0PDKt)||&QUyDGuCn&$p(A+5gh%P!Xr-W za}7;!T0tv}^`zh7y6AWKsqZ?x;JO`N2dw6&J{?$DiLL_Io# zQ|!T;`x9GIT12Ez1LA?D$4xcy6QNJdKnh~wCU}^F;Icb9e6AioD14X^fsVJq*!?r~ ztr!zCIFB0z<=veg$D?MNzK|4yKk77Hu0)eFpj9pY9={g%9eurR@jdq!((gEHt=E`? zPmPsALM|!!!WfBvNw#h$lPky7izzdBmL*&ez|7! zJ9`=^la0Pd(JkFnlrhM zzz$6AwuBWSht-Oz#4ttc-ykuR<&~$+m5IFK*AEnQS9vfgGD{5Uz0jUd;(oQ!wojrR zo@j~YXI3Rjf#rs!UV0`vn2#2>D0?h(5*LV;TXsm>a#fu9d^m{1L4WEkcFe8@?RpWH zTWS(CvJ7o+r7?=T3dmMgpU5FEx(q;IW+~2B6qqH%l~$^1aseDv(bpFg*KgpVx4gI#Mcx6&GG`5z|xysrTLD&A5RSr zb6ggij&3{k!k!Ps1@Kxmb^b?d1c;9IEAq3+zg>wiMDFMM&Tp!rw|mvjIXCo|rUO~s zLTrvXGQA%dZ~m+I9m0SY@}Hweat_o*O8?rs|J@wwdVtza|gZwBZ0}I+& zub2nQ82WK#ST{73*k68pCI%e<3JKI#WVc^!^DKQztPUwybp8l)y;h&fk!+>lW0HLU zwE`xco4&@cjKlO<`;(0?Wxy#XrQ(uLz}o-8Br#_zHpfc5=+8vho#VrwH!=pi%zSmk z1>7;?aLJiIZZ5J5SIX!nODQZGixYajuZ>_s{Tbj(#ltRlD85KZ^RQf$rTI8-a|1PQoO_b`l;g$C7;0WZ>8op zM2=NU(@Y{{DL%1AAR$Agm=G`AdM$0F;=Uf|8ReJATJjc?XS!{ShF;2o&3O}9Pkq4u z8b8j}lO;m}d-T~j2AL`}oD-W$Y$Me=d)dTlC57iEh9~8qFZ}(CzNq$-0WveKf26z( zMnQ=E6NdQHMkH6T?b|pm1xDurUh9CQ*!`lg=QP)pgljAG+^NL`7rn%*eb0;x)Dt;Y ztBU}I2ddajcTL$OmNM!3{2cOPc71We0L*Hy;_;b&QThe#W$~dj&D!|OZ(3yK@=5`i zd#Legot5GOM%#pvGpQ|9uG}LtD!g*7T;^WBpLCj-D&fJ-=6T89ri;>$EXn#b5d&s^>$lUD5C{@99Gf&X|*hb5JqKR^0Sn}@mLO`LvqI_cNj9EB}-%`25 zG5O{so5IH|j)`Au@r(N#K{rZHB(hONV++FG1|mnub%O5~!<5&xd^i_mClUbzO>SDv zNWLQAW|Hh^7(Er?e8ydE7<2lC)$Mx=R2Eoh$2&@!7bvA0C1OOYqBM*DBPM!QuSrHM zjJ5mGJs*V^5j$zI3QYY}(}sP+1jS?k zcM@*7{l6#SoN->n@sG3VDPm-4)%4+7MJm!?6pmdejPPU-GVNmUBi*0*G2cu1BEg75 z>mlRGO9p2!rz#ZukcW1#zOp)L_ku%wX-_{8nx0Sqe<3P_H6oxoMUqLzX^gzsFzn)>W_z#gR4s5AR-i%6Sh1Y;;P-FtJXN6 zM;5HpmHV8;6Zlt^{>-Uz;2c@?w09!;A@$L0_McxtJKx89MTJ>m7WQDe8ief-GkxP9@% zkiiS)YH84fGT3%Daw2j6^eybT8QMhO`<&40#gNpDppZx=S#=)TMXx`JtV{&mND&;L znIa0*W!Q(!tpTynY}DHQ*+ZJY$MNVx$S+Zmz@6$X;}uo&J&#`(>p!x|Mz0rQD&?ui zzr1eVi;#}F06XNQRPl#kmnbS{RquaQ(po@SlV|{go|me?eqrKK_QmUQ!Fo?5#*_1k zU;X~B3dUx8K{?BdLYYjIlCHdtok=+YFYZ=e;EzjZrln?5h9Pz1m8EXkr%w@2YO{HY zjn#xL(oreDxzQ)ZQVzR5-YrMCKE!L~H5tf0&)t1;KOIP`C69#`c_Q_!s6(jMyETDM zie{KXy_?huOdlbKnjn9XD0goQ;I22N7JTO`SRb#6()V(q{n!qvdraL2KNGbdzXY%X z^D-z4Jx>30jK4^2!1~wcvn(`KJhBy&8}jVkkYvJV0QQfy+68z5-v}VQ;BQcCzjQrAqG(^SDt z(;GsKI}nrYiplC@nqUb@)5${zJDzzL(7pPa{05Ln1rBK$QwaQ{Gd?o#puE=eSUP7GN|GF&aM)9KuQQcJK>@J`*}3F&(N07hm?-EV z#{9K*%>sDU0@BgTLddd#`L3i-cxkkINW#F;upmt^0;q-}a8H=Mf!WU-k@QH#cO2h0 zZiBSqldy&Zv9uVhxod=lS0UetCFHFkO$@XVoL>RYw(%r~0P{N_sWtg{k`CU) zDf7+ejhw{S*#h-G4KEY;`c0gO8Z3KfQ3Q?zVxV8kd%@?Qydsc33FOPOo> z)`t9eHaA`?w|l$sR8U@N52)rW)~|HAPTB%@iTOSE1$0)LYSVxB{LE9agMo_V3=(E8 z$N$~-sTl@}&K{BDA2K^a`<|)rQSAjcj)g{|{prN}Xi=$xnVz*qSq?|B`ft$-WUGoqOT}Dl32kV46?`B}gY|1~P{*ydfH{ zctV12)86RV@(Y21VX@$r=B-s2@QjhdZgWDBHI%U=lba%W+t&&caf3JBKSa@O=a=6n z_8biB#O^ZmaAI?(;NpSpmuNN-Ipw754IO>)Vtu*%!oj2EOHp}Ou-{c4l#-;<;!t?S zBZp>Cj%J4&lpnvL32i{yB%)8qUC7+NoU4dQV-P<~$?p{-C=g;3Sl;R&f2Z5z=S@MV z5uvw7xG@Gd0g6uuyE{ zPM2w&znjjuyAIbQ^O*bG*GB4Twdz;ur>h6C z-p~@U=y&J9dwb{k%rN2h*dHx3cCp_C-J{w8ejOAq;&R@x5{chZz^M9$0`?n_{VCJEtTVEW> zP}C}~1J2*w*@@M3-AUGP-J8XyN`-HYMp=BSXOUm)CZl@6>Jlp+uk{Vvf6c}Vr~cC;B2p6T zz}}wb_;-(b%gCZyQz4y6@^A$`OkvePSjad?i0FnC3nj`#6%B7qy`f2mZ3SD(pN_m! zlORCFA07Pp@g9$l?QIG!<}L^ij^qNQ%XV7ak2G4o^@$l9lcrJQyxeMu4Si1Ft*AfOdo-Lc1$B3L2CSI zZJU@QX^C$7^WsLZn=DnoWojnw9)5vm4s|3?@AyeWG&N{L(}JMN^KMQB8OBNz8ST7X}8 z!E_;dY`&Qdq}9%5ADb5-l_*M{W%T%JTJ!P-TCJSiZ<=z$Jmepldy=2ITOn`=i9+d~ zv>glc!&Ww=#4ml`hQ~>2F4b>M%f!5y!3_mT>J^E?V99zW5N)kzVh+#F{>)a#NjVXa z>t7*2tvBP5G8uU*3?`{B5Gfeeqfz5eJ0N6F=cP9>GEy@jwkZ}q*lwk4OnvYI(oD?M ziYL)WTl;8H?81wTi8I`zM4Kf^srrE=u=!0+P$59nNGkXB5wx`ABdFsCV97py-xmpm z-QjoHE=9cp_*YNv7hojg0r{m$q{qI}02)F-(Vcs@C&h=mRSP~urM2I&Wz>X3$~PNd z=sBe*Or4}pY|Tf?9?SkCA~X?>8ov~8!v#$4F-54pt_SCx{<<5>pZK=I%RhWDR89J@ z+<@x&r~cKVqiDkob>-nb1z-7+Ssf!gp1$@v`crqX3+Ku%EO7>x$x^}+22|X_4e*XC z;UbJF8dZ&=h0Jf&xx600<^WeZQrz(2)#nQ1%+h{6Je6<>oHcFah4PoGUb?rZUKYHW znQhT(EYWhkue^w@Et5Z zF4@XjDfXl-03(Ep<>$L+Oq-CYXtR%xKh24ZLLTehV|Op*AauMnY7{n&$o2Rnru9D^ z!#O_(20$B17^?&B*^Iu9%ie+xp6cRAuyPrDIAz4FCeWGCdUvu~FyDxqD@yYYqOCu_*F*b!3{ zFi+;_xF;@h4ssDr_9MIxwPX4Xyl z*`Ysb)DEVW`2^|jshAfN;!9~c(wZJ?B5wQ~^-?+%6)0d%(I4c#C-o4c7;OzT)suHc zk1BJ|flR@qe-=QUJ&0?PSn%|mp zCL5F6zzgLhtqH#9y?i<*CHEnPEq!(66S0@I4*jDC7hI}k@{^tQ$Pl-%c0NZGys|ko zk0qBkXV^!l>ZLpzLBQ?@sB`uJPl8bMQB{ZwO^4ZB-1rROuiPmBkj_7=WM(q%mQFaM z`L{-beNMnhuoUq*r{Dydj_}pj*w>l)96%BTZn1O{2=os4`4#c+X29|?nS1x;hH$6J zQPjt6_lVV7;IE;;^_uza>`D9C?&uk?Naz6wn}COlc_5QkUI~-eMBVF}`T{#?0KG#E z2yiE_%U@IfdcO%0^*w7oPgi>ap^vX+A0`(sZNU8zI^Vk+|LN2($v>waf28{&$VS%M z^B(m|_-1mEbGyBoAn=R(3Gh3B*O>5HY0-DlG;uVn4pVjWE(DF_rlz#ibQ>o4CotKkHoEvyF%V4yme$aQjAP$;F|t z)rrs%zkOZ=#hui8-EdE!=s#jy>tkKKr5%Bt6#f4op8MO7g8Wn95BTr`bejEfdeYYK zpkQkBMY)yGzBSHMI7B1DeQ{@4V(t72XTI>4K7M}X6A2PfT7dydl?!?V1zAzIgbjM6 zOR4FH_Y=xen}+NAjLl;3&4k$4J#aLjAYgl^?N??5qx?vfT1xQ`t1Jn_b9g(lf_`29 z72B*RCY+HtCby(FB1{^SdDQt$Y{SU_GYK8cHfO?z&=QB11T>>fVKI(PM`VQjcbjHS zSBz?UpB5CB!%q?*;UZZT#L#?t)VW)IuZb_9Uo)~&7vvK~*!SfyJKg4834%Xa1d?%X z&429kRPuOttOjGzUT)Dqd%$5Lg%?{PV26A^vyGToROdhll_wsalV8S8xJe~Cd!JYZ zvDJ{oYrdSAnFlQn-NTvHMA7>=rx6?$VM_kNRogb!un|!xboyAdG{Tc|>VTBAD%VcF z@6i{^$we!!c2SX7pGM@h)z|^1nbjDYO64%OyZJ*=@SS(w<|O4_jvjr*1cC|5*mMnJ zrMS)bF*1SKPdIVsX2WiokGEHJF)pC2>n*bl(UIh`W1bw2Bs@Shrk=osBGd7*=ZM3d zddm?hl2?fe^{%3q$zOo(jHRL*uVqCEa6quiw7L2Q=|V0`qN#lMJYwy2+wC;0gbcD$ z_9!*0$8>oLfjUV(`md-do*V@)kRoeBZD`FUD3Pz?$?! zk%jUH;K0?ltikzH)A8Ob4SINa|N%=LDqHXR8qzDQD$M1ajgKxuLb*y~~2gl=Z>a^s<{ zI>Qw0Xt?=i%sYz|WF#3oGg2f(X&lhRc!e>toHfj$^957k4?S1A6fJO=6qFKau+a=~ z;7auf#K@MSR9J?-7(~Fv=OvO!021f=BFq6-XHIHezz9KhMFX)L7(04tRZ*kwt>|;m zU)O_()2(l;us2%gE-DA8sTtY>X{%LYRleKw;0|KW6UTK@%N5Wp#(7$ z(1_e2POILs$L^r{grzvIiVmrIv0efTaXMSw zCmltf=-lcE37g`2{8vzH-lgbHedI=<6~+xqolk!%m)mq_AsLHdrm~b3ZdPtX_7#=g zJ7OC|E}cKZ2w$Xsmp-M-LLqxgeNIOU+;YV%44+ib*0e&PyYM(vxoMbugNzkj(FZ?7aktpbXGa=>lc-Y4jkl8QDG-=7BJzVm zB(vJCr`()_WZ?czWBhl+)Msd2t7MdK1pO``O99!Babx+v0TDW_oKW*m`ire;K)r!; zy2d-#R#a3Exe%5<#0RY4zD+9G3o_(`J14;2Ibel{q0IetY$)&>WtUCcTCFE>r{^L0 za#E@c3Ymw)L%@(9mC3!sN(_4clH3Ji)`dD^z=pU0>%H0>Mv1`!hDq9?+|}$VY}pGy zKWBF1BzfBg=ze>SNbQP+=9v+1-uEws6&8NB1{8oNce7g6L$9~vhUaRCfv9-_5BTTJ zYF*I2;6Jia22#eKfG#3ROAW+T2tK!_R7u+-G@Ff^S~liZk-y*9(!UfF?)pyoD%+Ok zjpt!#bI{olCN8j~?a-wtXyV(zSUnx4wmThqESNuN5cA$)1yv4`C-uR=hO2{UWc*tH z*FTsV8w`USV>lo-AqKnX`)Dt?0*>6$Il8@0z-!o{Q^q*gr+?%RI5_^>O@KEEp4(pa z4KDsopE2A*3Rc#;9(TSwXL4Sid3KWkwbSOF{wMm~h9fq-S?a+8f5k|)ynaqY60Lp8 zVvs^vKXs)_o2icP{3K0#=v5kaX7VxX^+*=E>q4Q3UFb3OaHqv(dQf!5%Z%dajChsw za$FNjrdaPhM4(QU^D)lxUe?;Yg|ADu3^F5lW54yGD_z*z+JTg&lwKi6jHawHw@dat z5};-fH?dT*))yHImB;@c>!<2dGP`nv>C0+6*T^I3lPW^&8+loJMYLG7_fO;vTI<@1&w-`slMVJ*avK@`t^-rsu$ijAy9bEM7)b_1@Ix)hr+S zp#Kd&P==4xYJ&-?MmYNm_iUx6vPM}|l|q~v--j)V`Kr+Y2bS&2hV?D%r;~HRwi>?Q z2DkfFeNJPueIFD~bxnC*Ve_0+1GvenL8DBq)F*;E`YX=IlKi>T2FICz<{_o8Yfkij z_tU^g$TFippyxF>-C3k6yrbBYz`T010^ErEi4C zBQW~B75R%UWvU52%*dIWeK%4A^=J?kz(AqXjLk5Lo52i9U$M0jS${7GVb;DFcN z_M_(T#+593V=V)11|^E)fhM!TBOXPu3w>!wdxgfD$qAO39h-R5PpHiARUQk`h)(ye zkbkyoXN?r_JvZvTLka&QQqMF_Nn~l5b0Q}uLamEeuMm;Hqj>qiT>qJa+L0nMcUpF+ ze!8&hvjD@ioDE)KuZkj0gT;xqFyiDHYzvMKwziB>>PCKnnV3iO!sJBTo98`bQ}wU$ za6)jq9pj9>X(&BMGWEp^qBz6$NQZ;o#a?Kso9y+)EivdFkDp}ybU649pm~?h5;5!Yv9XDko5^xMMcxus=YPIcb~$kj zOp_UtEGm!OhJ@3OOxX6*BjPh`=T#U}>=sq1a$XKx(fbIL!E(^+4}Teo?-tOld6GaqZo-=F-A z&*(OC#+Jj*kNCzH0=R_~4kSD}#GsF1f}&-soER>pPmukd?+~>t({v~M-Z7h`m+5ML zt@IboHs6{5ypTX~6-+v?iGlqGP(6vBNJo1sCe^?gf@ zjAb^3E-sVAy?qnwb}Lhw(K{+p(HH@$ydWvcR8U8P3uGHElJO$^6wt3ANkvswK~Bz& z%^|&MMT<^8!vux6DzNuCY?8y%y2G+1c$T`(|6xiA;hJ%FobrPK@^^W>igjUF0O zTvSG{${$aY7~0m>|A5{*+8_J8th;LjcDM-kcis*1?@!a9m>HX@o2&$D$GS-|1nH07 zJh_JoCNg_$q4hK|V-XQ=BcY%NH3s8D$YuiXm_1i* zlqWgr^qnk&;hxcIn78MYp<O>8V;Exy%*ztrP!51Zf_U@+DP{Pt2#Jfs-$P^4*0FSdU@(xH1&%%ukFaJxauQ#$~uw9W5`P(Z6j%6Jpg%)Zm$2?Th@f$Yk=7? z>exaPnWYmue=|#y>M1Mq?{op5M$?tux!`|A5gB*g%Cz2se!aZ>VqXs*OIczI1ju){ z-Q>6&liiqv0`;F&$aR?ELX3NGdofYn_z{f!%1XiG4E&^6QjFRlK{Ehi9)PKgJq}-64w+X>anjj_f=sK4l&1ot4O*x zJO=3=6S};l^hE^mfygC6gH(E-wprcxNGF*YR(6=U+F50xUvCZJo05Q=+6i2^_kU`sH^dI{Ho(IQzk ze3j~RO~FYVQsDb;4`tiOxW#yd>y13on}K|6Im<)@Aa^Q@FJcd^K@ic1L8pfNIHQ+etei|gl-mFBqu&% zU$!(y-nCWI9cm-A8q!K=EZcV~IiuY{d5r19HJ`wcvfr&m(m)i6 z!H~9L1HZrvu+g~zPliujCUNQQo6%AZ?;7!oLXXyQyx~GCqPaQ3%j?#L%`o6Zqhlhh zvYqvqlff7Y3}lqWE~ECPw|?1Obpy@(Wba~v3(o|ZGw_Ksu%b&y|EZ*_egHfO%E*8? zpB2})b*%PgbIDPV3zld9!k;^4oXX0X*ZP1M{QFn1vRvd3qK_M+8t`8Fe7>&;QZ+&G zkg0GxicO>JhUR3FLB?Et6F8!LQz=fdOk6>C`*GzQ-7a`)LYL5i373MQP)wA4_<_wZ zf4+i+W-V!MZ}5b9z?kn%h@kkBnBoi39~R!s z4Y6~C-#^8cA!uuCb!ejBG?KX!b_&$eRK;+{QE9~Q8#<#YMXYalQ zsdLny6wK($H3)b;Rn)rN7JV^=_5=r6%jGjG1);!Tl?Kme^hJOEql;~l_eKcAaup%% zD|?=C-`u6VN-DUp9R`5nc~sOvzCcvOaX&$o;=rD|ly(aCebKY4M(4c&)QLG%Q&+(_ zjr#+6w?n5e+wp1%wAOW(N3~VZ*I)mh1IT5#1KM2d#%U?pm#bF>{rDyhqcD@;>=T^r z-#Z;|tk&k&e5NBteWCV{JH03ce@?kMNRe8@4YyeAdV-who}lpc@9Q{c|H_Rzyz@Q# z&s_!U0U?4Lw5w3RdcE8ZOih!7kmHB|3R%MDEJ-CxWf5E_r=a1s|43Yv>W6pjYQ#;3 zFd_0hI}jl*p^gS~e07K>WP}hOI;)uJ`8yLAhGj)?}i@o`a?h z1_LYzBsleZaa>T@IBMwdap0!uQf7vmsOl^QP`&WjKZJ4U$yOnAbujP~_l;P;%ZKe- zr`W{1l6egwxB8ekeh#ZMMS>t3aujMCW`oglu~Ewk_>OvN_>f{i^Ha>VNJk#sImLCy zNSy^QdKD|Pj=Z8iji8h=E*R6e!BSI|0z0oI(tKV7k$ltOtQ zNI$Qv4*bBN-i%x*{v1*dcvnhJ!U=G*&%A76naxu>z$pvG2bum!S|rf0@>> z#L!mvazo*?^njQUvkdSt)V1;TN=DbSS;s&KBWcEdfjzR-X4O((FUq718<)@DU4kT; zyO(>WcProS~ zcU9)#y5!`;_C!(%^Uregi1l-RgH@G`t3XQuzG#qkavs69pFYDCYkTYPw2%+U!}l!T zFRU8cvmmZ0q$lit!(YGk@E`F<$Wt3&OVY=r z&mBLf!j2Am^g!n<M4x-z(`;cViuKx zK@lwgy=jj<317@Q(y3WN3a~+Q-!C1Uu!qP2RVzNyd`K~)7u{G$AB5iQ{=^J7Gf@km zVAjpHJffN^P)d2|i^6NsosZ_Uhlu*l>lT2;y|Dx^tFhgpl|Kra??&ENj}X@YzkVh* z>7QL&M88l|@$o+pEi&Dn%C3P>U8@-K1&PzVM!6A#dH#?;oL@ zdG@@PMkm#>c;;)H0BgAIfj!kBVM9KJM*gq|e*1TvaiTt`Mr`c93feP~bbCZNY=)!T zE}E-!b7)ppJtUi|8?NCO5)ydJDg@6Ke*IlI4{2h^8Of;l;E+{@ZIR^l_XmN1UMQI&)clpsYaNXfbt{|ktAJ7;P zKRsuxSVzN2(A%60$S!@&Q_;Kq-J?qdN7KzTwSPi(Fhgxxv$UP;dX6Aaw=qCcDT%|3 zi;$a>ck5dlYw;&dGPm0$_Gb)0IV4jKvyjO&EEyz{N%mv$(rk|&B;k`z@Cop8O`zoP zp$32Dk8^f{oBFpFK)nxb^}Dqk+=;SL6r?1@!Z0+PLm4%XPbpW%Y=|HdU!74~HEAir zigwxw$zlcUvnb_f(-Sx-JH|$aGd@jES};@21Ob$Wr8K);KCE11P!^bVU+gC4Yv_Zy zJG1Q%l0Xx3Eh1BKD+^E^3XG zPZt~Xq~XwO_NsS>_bw7o@_~h=N_H6EMTavD29<4!t%pU;8MAVepy%lm=(f>!E9`A; z%(5ENZ`8T~4SaEASU5hiA0LP0tnr{z&pMl za-MI|S`|=^z5i8`^!RUh7)24WVHBFu{$e-h+rcB^;urW^zP~7fR-hv&B6cvOcjBVR zia^=Jy#C)t*M*mcmz*N<3FAtXOYGk2>DOJr4jaJ2=>#w&_J+E&A@QscO^yDKw_>9 z$dHvYWRF=?|4mx_xRgB2aXFDV7>1ay?1pFFr2L`;O0KX-EW1QwoJ`NsN2palLGC#B zTrlpGlzb2Ix_T#(u3t8&o8Q2nEuc;jsF#PfCp*3vZmFtX0miR{f5P#Ic6=S#knBo= z_+}v)OOb~7;ri# z6)?@et5-ny!Z==FH`cCavOH<7Va#QKk{eT#Mp029b7#9C$-7( z#Rb@6P#E8tp?M~LD~z3EK0grt&GBt7%5Y;>AbznMJnt*X_S7w7aXVE`MN(ity9puv zsQ8{1lZ?6NF?18QBA;I#%KK9VGBH8S?_rej@9Phz;V=PCprhl(GJ+`Eb}>b(e5Nq& z3-k8`WmgeEQv3}f8TUyszoi$~=X!0WH^t0bQ^}biNCiP`pZ`$(&PGg3=-dcW`LJ$? zc?Q(X`#VkV#4w!pt{=6koT;)y>Z@i9(b?tfo-I_yR+m5KsdlD4r8!v}+KHrrbeD#A zUF2l|ui_31&%Nmeg`gC~M6~$Ofdj;~M1@!ezbYS)QIv@QpZ(&*lTd%Otz_ITC#>Y7 zA%xJw9$lbslo{L-qu(%RTpjfRj@~ z95Of@90Uqv;AVlhVEMN*+g6`IRhlB3B%rF+@((TgQlN$AUaM9)-K<(Vmm!{1+A%XXc^zGA|?bJU*#TW(~z7OT;vl{B4LKp z-o1~c{q84Yoo9?MU$mN^n_}P7!&h7A&v|aT=}m0MPOhT8I0;gOxV3LCcDPMjnPY() zA%F$_*aLiT90sk9{17)mXOlDWRj+#@&N-2z;#wIEk#i%?QIwKNs3wwVM^veEI><`zAae9~V&^>1(~|LN1X^FT4xsUX-xEW ziwP_v^p!8wR7paGp(v^YN{_Wz!*jGqOY5Z(f~(cqncga>lxT|XkpA(5DWBH_*a^nF19sT&S#cMSMcd#1K|^f#p2_hU2(KAkEKm0(>C5k29wSla(p@ zyc2bt7FvF^+J5fc56_hP>!?T;S)zG`?Eo8BR_>!({vY%rDob7Ed6E;FQ;gaKoA z$nB#G(Lh-NcBzVk(h2PwYO*@nY&67sOB6xQl~4Ovl|R1sH`L4{uXv?hIN4P!FH;Q8 zn|P^&^Rq)|w8p9Fvb@Q0Jfzjh*+nKg=kV9}Bo9l|i+EkKl_|~=ny8vp=KnYo2Cpb9 zFb8)_QdO$2O`N||%0DMvI=Ee}(Usj^3_%~#Qoi2&$>WE?DHaJ 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 dUQ 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%0AyU0MoCW8cPT?DRiXTQfqJN`o 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⪙>%jj2>;x&*E65nL23b2YVDNy7-@1JO)H9O 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

xGVdmBl^50MGdzkTWQ)={rA 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�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 z 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

?%+NcV^T)RDd?ud@Sk&rx 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

+maq{!9L?+QlsnClQE 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

atl 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

); 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

ua1)8b;v+g=g4#*}rDa+U;~&~ukyNh$p}|5QDu zQ$!=u4;CLFjCl6@)-OhZSu?U`lIepm|C>R#fEt%Lyu-ZiVB>D+x*g*bgMixVvg*$# z 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

Lr~!vCS{Q{Uukg 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

H)hC1cd6UEjCY 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 z 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

_ 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 i&50P%*S9NN*wnLg+n^1h;^wRB553 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

hi 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\v)Bl>z>EWx(`DiR&) zfC=8yqHa`Su$DE&Q{P15<#obO8oj_-@6uL_d8@uu2(}*ZMXkH@^LndzC&8$K z)4VkJI0aXPCckkwc%C_|e6yA(pU)k|7F}Jk<%yNa zdDz*-^aPr10Gpurd5^F0?G*`mic`hn!BIC=*vM40I&8W!L%l?utyK_UOZ(n|Wtb{W z2_*>dHv8m2>#776#v}FyliY{Y9j`f21wi2J z@AETGF@UpPsXfq#UncWwK6}H5y95|=e4q2|9UQJRptu2^FqOf(!D??!&07ru@0)H# z3vD?G3USe|%|hMqVY?}~Q|IZ*UeEtZ1NDj?Q$T57$wIwYCkF;A8*~^vk6!gD!ZdJQ)&j-i&teJ;T?ox#8HK5;!BNAv zC#8Y3FNTidL>ncQnBK>wF8$dx+WBJ+s8ce%Na|&c$rBZYe;DmD`ml~0z<=jI^^-82 z73H~9vh9}glFfP66VCZg73;?0(iJ?dMa!Uy#6>2yo_Yxq>B@3cd_}tz5A{oOOd(b! zCGGxSc1op)leMAuf&Dn7xcy$O)iKJ5q#FmSv6m09m_W7H$t%AB2G0$IC~nU_y3|G= ze3VV+lSsW=E~*-b3@BxF`lf6)PUVDfc9AxTH=odLIFftq?T$_aKrSC~^CJYAuqG*< zz|X&Q0+8}9b&q21mzwyW{W4cr$@vo6mS~eF2128#;{(+n2Qk#3^v*fvLW@}C9(D=Q)lEwHT2p`_t_^KPuwz?VQM51Cwc@6WUF`m{M62Pj)ehE6)CbY6uZsfE z+`{)v!99_cBUQZpzU?6wTmjPK9w;M3j*HITJVGq87ho4*0!8u1?%oaG73*);NEgLF z`-7;oc}Tk}&(FH@N+~XLl}2(=E175L({DpXw~E1PZ;|ebgSN!UUWAR)k2R?h$z{Tt zFO_%T^a_*!CeP#TKTxqF(fP#iqP{M5&WRgIf*F7;j66rwh=?JpjeK&qUN`|2YRXt` zl%v(n7u{F6z{&C!p&#(T(=Szs2EjI_C5@Omo49DTehatcgnVY;{po|4{5T3-Q>mP# zI3=GY;hXjkE`SCnx4%juuY+ZG!3U$-*Hsq_mY84_4=j($t_I~@X(?%s$x*?VI`6yC zT?7&mn9i8aTBZ%$2p)G2q>8V2c>_zu*13-&ls2#`EZrvFSKxGXIvGi^p(ud8&poYU zCZYVejv*I8m#vNEl69jCp=-KDvc*Zskft^Kf{kZZ-(41?5&Z(z>gI(>s@|~PX?=4!;qHpSWnvxJ|ko}El}GxAdspv{mqP5r57IDs|lO(6%mY<9TZ&N zK=#ny>99=?V5rbw3|lzfUgR?z)^^qNCiU8k86}&C$!BRDFWP}#$(vcWt~dkZlsHfH z*27}Lu8ybbYdgYUSoFO->m^e4jag(x7d)9u0qGOC@JBoWWKS|JLXGMCuD{3%W*n8p zybfqoMD;-&a!Wv%%$&VEuIw*o}E;;C7 zWS#0{Yh~~T;E}9`r`yeH*O=a7m^UxkG%E~sKc!CX@l4dry7jw#@{)%HaY9L@4_kGk zra55ei6HJsD>;VzCj9@A0$ zz0R^PvDrG1mAI^lSIt)6Nu_?09dC>myD z(%<42-ax&reN|@sa{eag#=R0wT_zdkJ@2M=?XHhS4}rCZxM8%2fxX!Z8ak+G@*qpE zyy9GDbeB2&bfW@^L1gdwGEHl2cOhe16O^u5+^Rz%!P!L(VJAlY(&~Ymo+**eXs-v2 zzUkF*qxqJPrjORDGfqk?CQwre@-FEADPThVhV&mm-qEAuQQ;21?};UIf!^rI+cpNg z#B;P?B+FuCD408)w?{LJ+_=_pH^zC?WmajxUCLyp)Z&w+SghONn&flzMuw`yw0xZ> z;aC0}@I;4p4n-}KlzIq<3I%>FHunw;?cJ&~B94i(eyU*uh2X^ye-6`roRc5Qb zw`O+-6)LJB5L#2JK?{<`rIJR-rzgFgj9B+h^+P< zJ8iaTdUXTGoMh?5yF!Cq7cKhe>pNvPA4Jnj*lhDTK_!&0J z8oQSLh+l7A23KIzDkr z-gWzMww>*VRPA8#o56MfGcWkwlV0W4N5Xr_mIb&#BYJyI{MWWR8xM9ZWrq|y36-n} zRKP1t?a)cXccfcND&iJE8#0kG4N?}K)F{v5uI_x;j>&$k>yn_U#@vc^g(ya1!^@|XW8Qd})%8avaMv#=-kAnJ z#$Xxv8zaxttFL9;*5$tsPgaA`A7_G`5T<)X19y(YX2(rYX$t`^jSYWMttF^_-)2hS zkWg|BZsx<7rS#uc2bB<1sJ~NkMTldo|9Yzt6mVFzU&k!N&&EnN!aE@c29Xr`4ML#O^OU$aRmo_cyk0pGSXM z3Nh5Oo$ttTfrl{L>L>JV=ijIDlgE#X*eIEH|8k$Pv%-E6p*nmmPDMm>DY~EKj*(dm zKpaa%ZsRXhp`IIyo{g=T(o-6zlNgM~F-AYQJiiAqK?)!89_~NH_XlNZS0^ZCMpPIE zrOwgr3EQ`e;qdncY+q=);!%5M_Lj5e1GAqj5#xi^07iklcIgovZ1wqprsoS5!=t}N zX+U|^rD&a`7DlrB0&*!jV{U9;vKpXo4?P^$TI%b2gTNSb?9rYLZ4F{?Y#?gwQnASy zcQHgRcEdGEI=4e^y%eQrKyJ8{w0mD$pg#@=GIE`yw%}3EjBuYHnAM}#BQ0ZK2c=gV z<<`Dp=+qwLkNg3B1_5@BfS(=2Fy7*({aUoW{0FZxCS>s^Kw-3_Pd|T0AJs?!*}1(r zHeN~{k6N@TuM)J@lWkgl%4y~m@V@AB|Et6uLa56lQ#dY*xda0sQ z_M`aTMTh|WXz{2ZYM1KF}_&p7e zp`SmaTn_Nj`ZTl^8|KI3OI9M6pc2QCG~6138s8eKESJ>9=QG3iOHTaJlTpLph+?nR zL23@1%IJ4Ay!qqBZ>~Ulbi3n@;08C7x|!mH!FewkLQxf3il_%g9Had|w8rI1E6zK0 zFWAe>%x6E>imU8VHvh#(_QO@Cse7opOw#YnwqZ7rFaL~n{L=*K)<*J*TjA5E^akBD^jeS^ReghhaX8a48l2uc%u>}a-wL$URknY@$S+r zU_EdiGuD6}J`%|3HW^YOb)*H2Kq;v8+lI%?eC1V7KGG{F(^ZdZNQ((8N6py0)u(Z%}cJL0N4+H!efa~^48n-8>j$luOp%Y8OSC{emRtoCesguf+U`DPA&2TrciAsKBu*H?DO=7 zshJ8zx>WEx&Mxk-j(l{_UcwroktWxNO%BOi1QJq-hZ+E}8u*%oeOi)PG76^(V-Q!@ z`CUMaDvM!@aBu5;o}9?ji5m-kjXj4<;on$5O|pqqVltssKZGXgTQ8$=bp4Qa@0^aN zNqVn`95u}Pqg_+mM}Nt0r406d!|CB)n6n1|S*3UO6ZFXJf?bBZQ&u|Di%%|dU}J9g zA)9LwA6$eoLnAC(1y=bJ>nZJ`9QNx5`=k-X77Nq;>N24Ks3Tb9VSwNI>r8c$4$G4d zj#KqJ0ZrYKUrUdyslHyQB6M++0fx_x&T7(m{x2!}D@ep>ql*A9wn75Li7SCKR`StHomaxkL9@ z{i5mI|Te~oD zwO%sV4@Nb1qUiO@LIL4nfR>}QE4lJEP7CmJj&tm>S~`VUZuTUO*^keIzL-EP21CmS zX`ZkKpA%zsYa^ZKy-WFXL+YKP6oG@YVmyjjfT2}8OZ$z4Kg)c|zLvY^3tKKY3i*`r z9%AeGf}-iWkF%WVFE8KI&J|CPm%|Ku+)m7rLEytR?AuSvk?lc;M2rz(FKl|PR^-&= zl;Mz7)nng-IUF+&2`BoNK6UK!Jad%(X%CMNo!xM&z%13YOlXd!y-8m2%-pAOJX$ZN zKcHC$+!l4TZiDGgU`1mw)?%%w9Oc_U54MuDw6(&PcYIXG6j=5f$}4Ah^C_EJRc9Eq z%il#EY?ou7?!LK)2|P2{BQ;WE<~zp1_}BLKX!DFkQyam5s9nRO&7l z2xY4g7>7O(s^!nwJ)$V>S{&0u_2{iAsr->mY@ zN*C6nv>WIF%2vFvnMK*Q?03h*eFkr;5tloAMFu;Z_G8o9+xK}(u9%a!#y$|92aapT zwQ?axnd8jF{Nj+c0+KY)H zy0^pW>`i;1=Sn(PeCU-;taJ3A;RsY~k74OqFR?LR-BlldUv(ug4L4KZ&VEIeyIGE&xy|IP{`e49K8AOb=QRLK*Qhjw3o+x8MG00$NUg8&s0GBWuu zWm|GViJ^Z0CFJWbT=@c8b?Vz7$7Dc)G(J&K?{>iY)n)Eim>)!eoDAst|AXutFdhvb z0F?Q-qBA5gjsDVhjE&SpUtXNUz3B(njlNa#_D++u7~_myDyDwk*H@4FRe4Hq z8^yKw-mkyDBkBk%T$otmGnvkhbkVPLulh*{{jl9n>DV%Nnukif@q{(`;niL_quDcv zRZda>kzPo1T`wnFmq%NR3BJOP{jTfAJNs$+xew-STG(=tJxh!#NgDGE6rV9@GvRz3 zw=MFdr3aSqkgD4Q-C``j4*RCeEl+4D$>5X-19!*(nHzr!M>gf%EnfyH`@~A^HhHxVy&Pb)FTpFj6YU z-b?6i(K3N?KMDK#2Kl`FtF*L%FjSu9akk`xjDkDw2Q0!Yj+dhm0y-tDE9u=Mt7|3v4UC0FT&&1-V|0E*98z2KvdYR_YP!-prP#=%d4J(>|vz z#Q}skzeBe4x-WKPuf-;M&PIsoL;wHDI{YX40-~y!#A@uyIqVFqP2{=jtzRsbSQ>!i zb-DIe;LMhcYnp32daxiPP;pU~|6M-Qad(Q0uPaER0chWp+204x*Aj%z@zrc~hqr=O zw;YI9+b)s4@UlxQ@0r_(7Yq8j?4=$6Zdv|(^p(q*1|-R?z>&_@b3N8(GH`12NzFmg z^J&OjgAC^7JYo$r97#}WMqIGCb$m7%P-|=!w>yLf#nz)+GW87d8~SF) zl2`JkUCQeRglQ%gxxT3ccd7)XkSlfEV!TWclVxWM@l&Sgq!enq@Z>M@M}M-t`3dC@ zki~uztqIkPo}JxTEmb$lEcD!SDH)((z4rjShcm4oAA0WBku=>GuG0)>@OsPs1%ejr1O$j9>tFzn;(l9 zv6rC!qmC4MKj1cJY#OwCI)d(NY_(#o6Zyk7DN*fz^6~}nn2Kp8k|AjpA&-xE$GM%nw*-qw5Ia4HNwoSUX2g1M4%r>m1YReN5d~LWQ4f zGA*G*6qSue@?nmhKYkE(A5?mDd$U7mj+1`&Cs+m(TQsEm7UN>8o-(se-5WKUp~+pV z%&bDltWHDBB{vRF;A>~JWIuC{L@a;y2tGb5)t(?jkBt`~avjI6m@4@0jt0r}v1QtP zAco_IDNgfgR@D!o)e|6ntVV2P-);3B0{@39C6_?i>oz0x0!7lsxJ6Xel_2aZaJP_c z7*sr%>ay9HOqQhQdSLc!s}djm+1vWrhVnc)<&lg=3{$>Q@MQ>i+zdCLSvvG;D(g=& zLATNjS%_8f2uZ&YQeyBjFx7Po-9KVuJQY24zw@ZBWxbdcUw&tC&{n8mmnnBI0vi?p zH!vT|77$r(rqbR@Bphu{o>7u*?Qg-Y@pw~emube7Zj3{7zfGvPDSjJTc9w*+x$ZJ< zskpy6mGJ_%^yIp^1^gEL4@?`Fj7+ve=+9R>Iho^-VefDOX$3kG>=+N2Z{iv6Y2>K_ zFi#^&ySuVyzjuoi3PciYLFDic7{cL9ly^=Ks~`5vB|hL&amOQ9c5AZ(iJ)&_s9Tjb z{WJ%wl{uoJQ@O5Fxh2X!MMN`|DfO+lej6{4#BNKAif5`N{faCcNe#97Er|Xb0sY@S zSn?RSy=}>HmF>jeb^L7=daj(@JvU-aTBA~+gw2c~1*?^fuluyMep2`ZrB(nPVogh1 zcP`nSaAL);CV2C2dO(7DOp08qS?*`473tNQ68}tcL7MhM`S&6qdaOq1yY3>YiBnUB z_+qqt<5sf?By-I4Ov^O0X7A-{@l=oxf6boCky5V9O3qk;S+fmUR6CkAQrp1AO!|Gl zYN6ggj`xAzK3`XiWbAg#LQftsY-@GlBl!LHmYtL{$gYX-(|LFK#A=2QUbS^a%RQ?0 z53**3gNY+}7)@Q9eP9v;Rc}pASX9(Aq8o)NxkNB8f_dnban0K&dcU&6A4|?r8l67c6e8Sg(Fbu`N&3BUmHi&Ta2YD;C-M$f z8uTaG^19D8vtQT9hCfD9-Qf;lrY5AA9bK*Lc@d76V4(J9BWD>gw}E2udSfmfg7gz+&h`_esDe z8Ul80oNCs9bUjavu?M$OoWuYUjdxHJbkkofY8)}5gamGp5Y-yth+f=8*6D|mBC*T3 z(+@e1&G&T4uQakpucY3o=f{B?w*~rBqqyy4RM+o!O=rScJ^eR0&ErhbN{&qmFZER* zhL)WSrbJq@7cR5RafCB+vRp<`**D>6+aJ-BNa7_Qi_C3Z#a_*u?3oq3BzVjxn9BWt zI+@!EL_6J}xdEm9kPT(2ZiQO-PKn!mx*I^h%eJfC(WHQF1 z_R(YYHR}(Bsu>oal)PydKJ!>FtA2T$;kvoxk~ME5+Xb*eHw!l#b84yzC3FW4q)Z@# z6HDm2E$RK|ErGO`yZafYTywQPoe+np2yd&ecnkz#-2ObgGqqeYTW zT@zvyb+GWy!kmFOhP2e39?P|LYliR#8!|>}wSF2gRRrLi#2v!^pKbLEsv*;kiRjmN6RcAWKTNR#yK zK4|_dCj931YD|lcOByYHOqE6{U5&ydu2AwZSXYvD-aAFs3iD11IvfwA8{37?8y=68 z#+8?DzJi|Ii=6N-m$abq3NYI!BjNgy@vY-UBlD@w&C=frH9Mw!B5O?S2!w8Xkcm}>pif4c)P1+w+6iaW(E$m5kp8R*kH;@;mf{y9Nw+>QFE$RSd)6u3 za}?J$J)Ju1!ciWt#UnVZ&NdZ}`l}lT1k73`=V#@QywtIScHJ@ zh1IWWqTOvNVsnKSHi@&~lf9z1R7;}X0FH@$#&c;l$3`Q&zd8oo6lfXZQd3Y?Zi%pN z9y-aUWDgASrU_`&x#&kVQsCnqlrY55-NQD^(sj}$jKxV@qA+0OV% zWwfO#GkwPjmi(?HU9UKOv?Z0!VVN}QL!i*q6`kIoO}3B*dldAGlx(8BSMs@+x*ozB zhkmb#Ar1fp@TkCwfT*vbwacU4ia!u~VaMS`hyCDO>1D zcOSWPmuSs8jZqrc$U)Ah88F}9pqTo)+M-iXQqnNwwEi{R?fG+u|GtuGidG2x+9QXqv+~D7HL*WRoc; z)dRFS6!%GUgviQTMMU%%-EMtcr$Y4)E&x`IuMpQ3p!X}D^5`D!;iS!ldN2=)cf0ZeA511QSSN#i z^`0gPpXHEEdFtVw7E37zXMz~i@(=0tm)SU4spX2;`r^|i9Fqt zyrWLew7s2(vpeuT+vjsa1!d-HETxc7o5YTp(CeUT<7&cLAt7BgyPZ6`*&9i~_>q_n zh;Aq0WUu$L>Vs7^YM-@wj}xbQ8|zzGCBqNr(J+3Z7wjGPDYo1J2@HvMu7Nm9lnNMT zhMz60T*{L528F^8Zb`ZggE8|v8|+4sSmrFor32G-e4A5B#Q>psS-~>AZ=BKvApg(d z9J{se=QhWNKUaF`p3L|2+KY(6Z_=9ZquQ zmSPJV(#n#^Bj2re%s;052N&s;VW`=k&DuqY?<%#%#RZ#&SgOXqwMCs!KinZ`eN1S@ zti8faE@wG)Ke*l+nVcVTl)PDSLujJlvLXZ+d~})p(@9eW;CPO^HF-}c9wcjSP$HgD zK=oe^vEDIMfR?;);8fQOKzxopM-l&b0pR&-+i7}4u4VPrZpEhGf3|ftUNhu$(b<0i z1!rrW$|a zDhUV`8^&ZV|Ge+K{^LM@tR^?UE+a?U?m7)!ynaPVq$5b&Xv}SnM0mr3X3USgYP&kG4x%(ceBZ?NBKD6cHZ15`A}l zB^TQ|f^8@I2{7MaLA?W%Ts?UlO;E?}Z*aV*yUCX;-fdqP*r8uxo91oMO8R*fXdXA4 zvHoIoVdci^>on)F1B@LjS8ZK4r#!$&&N&ycVFt}h$zLQh4>$qE3AlC#BNe_;D>X~3 zUL||win&B)PG}pblvzs zS5;#Zcu8&w?l_RSy`oEUyEz`86mRQKv{6}8_;SxRaLj(3!y@Mh0o3&mz`eeYb;|6f zM!&wt+fc*;1bzOTUh%)o*bdxZN9|Hgt)av_dHWsNVO}@&Sdsll(WH-krJDJP?fnfu zDC8uMKj{6C1gwvk1Y^E>0G-*mFx9(Q!K8S#`1NAhEOo;CkL;=zN5MuV#a_u&2eS^p zoB86Q-760bqHJy)lZ%Tug@Q-MncO3yz5iPBf9DrGhda0vjjy+K`rK6vmrF^QRFl_` zLRvQonljzT9ia++Jq^vo=oiZvGY<9Tst|6dnqun2gUAcGl=P?~m^+J20D0zg4lt!i zrjvDb;sqXi=>!?b!f+8hI^~)mvM^;G`8wR!#>l40Dhpq;`N3~}@`~0RjEQW^BVa`h z&9K{y=wHncWTKy`5$vH$hmbwW7bvX`-=9~ftLeUCxYvpEUD*+rJlNg~?Z-|HTFp3@ z{vcW!f#(c;Usjiel|W=luDx4PnWf%|BU=;p%~w`{6tmx%4QOH2tvSUE%h(~rM)iZn zxRMIjvQa0F&VisXhv095PM9bOwK8|sUZx{8g}z~%iI{YT00J!&*`w&7QTtpA*sjk7 z+~)ha(rnobXGrZcDH-_Si}0Z0j^{~p$V2C0E9~Z1D^}k~*7YyZ*^gyO=0n)k&V40! zxrzKwRK+jz+dbQd;qyMxQ12aLBO(LCF}H@gsk=UC9xv!dBRZWvrcD85G4WR^Lem-+ zO^8)DF#T-+m~W{S%wq?z4})GeQFU&9R5WfXjEiY_C1F5k6*Br7#i$wY>OCwbz&N;0 zy`dh2$uG+4HqN-nS@zmvz(gE3RVnfHQp0kGEeL+}3xwqcoe5ttE7K}B&E&9xT3m2j z+(|lidBtd75?bLn;dXq4xvvW=IUA2_jr=2r*mb^yfbbLkH}hV{#Yi zNSy5?SttvO!-X%bDl44v1TBG1?P<^w0%^qxeGsjU{Apd*bYdeD?vtnPBK<`13BNPC zY!1E;@!Omnk1JPzZyQmXT%{BB0wm?JN<5KD`4CX`R>oN{=tSqHk9T^Mqv;B&_D4es z*7bR5wX+wqa^&^{yYOF1z)<4teJX{VIdpnF7e}kN5kfVrx-R*04bcKv0jSdb6xm72U5vNsuCBs3v26_jSk**)TPnoB0 zW1;MUp0WKNJN&4J$;ciROb0Lz3)=ADLlrGDSMzL5+G?P+p1)lpefquZeCuN5;ZE2) zhV7+Nq1z*>4I7BZJkw7ZgY&&Ibrk0JsY#@+(f!e#6l|Dg;HKeU(q5&IQjjP&l5_x~ zJ~<_p2RvzMrOMxJ-sE=Sagu+2{BSN;$lQUl#-ZeV8sdd6md62xvy!~k)du4xB`_ZX zOl7tB>u)bLf@amsG?+$4b)i{RF<+_#GOMJ$i-3u4Iuldbgn~jBb#8aSv-L4@2yzwZ zniX|I!LPv$=N>Uc_95YI_^X(Tj)<_WDDnr{VZ^YrsqYp{RClR*_7=nPv|GO?()o(( z6t9ul-?8YRGAZaTs1FiEC4 zuP*rtlRN|eS~|Evwsj@wXPF#`7&Lb6koUgxFRE1d+kG-Jvp`scZ01?MY0iVCh-t3cb+uYU?T&fQ zdTdc-5m>%^nRg*~H7M+diCdr{rs=_M_qxub zP-X3i?T*&^^$$H4Z-uT5v{Go#>g`bGjwK|KdTic)*p5FT=V@M0*H8%W!6mBQRbWwr z=2*T?aN}(peXB$lv_osPW8a)CNn}aRH&5ocFg+h3QfDMl#Ypk~* zM?{jolt{l=^@MtiP1){A3QN^h8%NW$sC6Wd>8^)Zk)9N9g}RMs)JPT6#T8k-#fW?e$wm|-{B6$Jc7EUdEQiY8BaUBfe}s=m$@E$;vn2aUC~29Mm%LIr!Ta+c6r9`KVJm=r1#>99@FUXTgOY zR@x^xD4W^d1IdjlA6|Usmd*DtL(B?Jf}37!;$1(v^wcg=_0C#Q z6}RV?rn!mE#)lt$jNdC?++_6#)Sn)K%CJHz06P9Z4OeaTo39+jH4tu;1?QY^KU;Y{ z@?2SI15k=Fw|YQSb!C%%^-(o&yrqy+=JXc>G)iAO3lymxz>ivOCSMMt*67|tdYa|P|-iX#Q(nbvcIG-P9JnCAIZq{9E$W-*o2=JJP&%&bRaJs!u*%+ zYghYSWH5<;ojdjYu)%Gz5^tKk#CL`b5gHp$MFbzudEKie-_879^zjFdmfKXa7t`;i zcCa|IZ^2;i@7$nCgI1B)i!9oNO7xjhraxQPG>Hy9E4xT?6d6H$KH*p(NKF7`-d)nixHp3W-4^p3on8abX|V5R5KgdE0^eAqco@%azNA zZ57OZ!q{BWH3S72Ka3l=Rb?NnBeRvJ7dAKVM2PeXqxa36Yim`DTZ9lL34L=U#fQhn z1s)oP?e_()rTJf*7SGd;IGCrLTWNY*wPMRQ&}K{5;L7(*{C%^-hIW({`tDI5*DTwlZCrH-Wzw=k8aa{5~;xI(_PAxcpIjsH}ViMWW-jlP%=| z8lm3L`0940#3L0hycU7oteMQIG3H@8l(^84f$hF5g$hti4C8T>x5y!&12*?T?f{xXX-A7%}3o#$~Jzd9P=X5q{|vNre>DRlT-%DZvi z@vvUM&Q?)IwW0He^qJm%94@&dtP|oAX!{F)?R2VPQE+UOn~zVNJRuycI**Q)JQ z?J3px;6)f>TmoOjm0CVl;*367R)+@ZQ$Sh7fJ)?9_Vcn%e0kxlu1>xJkX!#G1nT8dgBYK*nzK9$= zC34nh%KKjWGoD3IS`#LTZAQa;#Ay~b{ogPItQdL`ZHF(97hrXCE#8pfu` zh+8_(m*J#Ti{teVINo?6sNPb(dnYO)!n-U+%>q`()(KvZW@}fW52VE4#ZOt|CDMui zfz|owjNbSC%bKis7Q^^&OD;W>=aA*K&l^-O_}w{0wBOjisFyKB;mm z5>R2d;{o%>ylSsM&0fpbt$zlSc@v38#9n%5Ja)T^MHJ3Smrr-hyW$3Ni`6bDJ#x)+SMOP*gwany?A-U-67KKizWlzwCZ=( z&6%~vm*;DxY)-qN3O_*{uf=6Pq3ao;11)Vrvg(9E)L)N0sIrqt$2yUL^e$RNZSa?n z3`38kQl9Ikydid&!KtDA{88H1W}(s$Zu8>Q)XBD##w2-v%lWggrk3KQXDPu!LT&Zo zF1`}1Hx>b+&%0UF6Hi?v(C#kkS0`fL+Dh9|&EncNCY5eC3#IxlrO`c3`w&c|aMu{q zd(}J~J+)#tDpG(StSOAg^vmWKc1Dz=j>nI% zSBjSYzB7&G%T%VE84QLSH*7S)j^w2 z#;F(P6#?Ff^9{8iUgAga-*EpoPBNnz9}yAn7S4c%5umZIbmxTuKI_I~e6PAjM%{Ai zvdXlgMrK@)1?UrjTChij;rI+7xO|JO7sloEmDSQKF+;=TiYBL*Yliz1u>So}|9_A7 z|LmvccA)xs=TU58@Y8sf(_LKR{yiblA$iJ14qzwXzGLgmN(zFQDgAx-O?pm#&hm9u z%64L;sd%Zbzk_Oxwf#M*$RyK-Bx{IPb#pcBmz(YVJ-d-^o8oclZkrPSf3R1v4~u_c zn}0KTeKpKj-$lM&7B@O*Slj$A{d?d$5EdnFnl>mAu-p86PGOZba;{=_{?#r;0)WqG z7T8}z-h2I6&xcR^V~yP|9S38fvQ9u(H{C~T8~l`%8p{c!$7I)}dyiL}g#9|luWLaFP3fIB?Q^rq6K8upBwDx=pe z2P2SK1>1^?wmQ>Nj0g{Q13c+g%qF=D9CI>xv&wxIXWs#5>m5a&QMwcN?4Nh@FBRVb za?5Nsz{*q4Idk>t*5itOsxV^yEj@Q|xrJ&A$4LWH3lf}k#fQD`SY>4xQr^wa0TFA~ zP;Ps!Tu}+E+j9~1;ahq{i^R?eL25m3JKN1Y){-St3*zQcUh7bNR`d{uRf&I2HHqsb z1+8CsOD&T+x!yb4iB|{^7KHmy|@=bWn?i9&ev$Rl`{>qJXp~}^qc+?tj zK--1xbTlBD*>GpE;lBz18x(k(sLg=+`u*}B7^rbFPYt5<68mnr`ZDDg1YTS;@YHD! z^RW~P${8+VX`FhHO@vrcaLjp=>=Q~YKZ`fc>x8!t_l(q3j6Aiq1`pYp$k@-+%rmRMP92Xq$YUn@0ne^z~Lt7 zR~akJ+i|Y(8%HN1_H){0UuF@q+xFA1yB`;TKCAoM#ar|UySnI78UF0V0sSe-Y^wz6 z7T*K?u1K>erns^>A$73RPr}HfNlI)yXU-+bv$&lBuc?*3#}0_!c62f7u{HM9X{;y} zEEi|1mg8O4Tl;9UeMhtZ?5J`U@qVMj@1{zkUE=E6;XY^>z-mvtaVHw;e@{@*Sd1b# z;GAu)CjES$ox~9$@HW^+S%t6@%tqL#Ez_vOisUly8gLqi{Z>t|L3Z7##h_c8`$7G? zjr_C`xv`(`_qtW`bzM*c@sOcsJMqO4QUgPPi=W{mw((9g?~} zQN{VBaWs_#GVlsUX=IBLf*gN8@?n9ymTKDpsTxeRfm{3Y-TnYN*JowhA2Y&*W+ZP) zH!AF@{SApJdc!R z$HU|E5QEpyPTj(nip&OnX1D9mQBHCBPQ!c%>6@$Sz-X=B8>x*xhWF z2}M?4qZKm5{I0#={IKtLfzG}Cv+5DQ3mVQk9>}&x9*w(8+z2D~*-*#gq<(73!Y3O$ zu)1m_w)EmT9D+1|=(Wi)xZnYRYXxBlw+`Pb%@1>qt-2J&T40}Ae*pztsoogXe+U3~ zz7S9LQ2l-(!#Cm__x?1kutEwLS5#bfL`+(BJhl8?L>x-gk3`5=TRK@YW%3&M`&42x zWfXQq0GT`GWz;9NC%dQ?O&H}b`-%2K9kOb>%fa&vR=x#3MLirhy<+m@5~FZFYQ?D9 zqDOKVTal6jNUX42qOL(i+17aiGG15T#HYO2EB5Gxf2NVo=LHjw%lL--_$4{uYmbZU zeml+quU&+HLp8n%x=#)9NxTd`N@8=mT@p5H8+4IlAf73B5lOd_SA8zmU1RaC*OiHO zQ^{mG`BfQ25k+?*5?kvV;<20{P;-6PU#^c{gzM4KDI^wD6Sr%rsaG8Br5^S>m0A#; zh9QawKiM4Jx)ntKIJ0n>mt%=Yvp3X^(cJ6A>QzCgi-Gvd(A&Eo4KvGTj*^>7hx=X~ z&N+W)#y3SoHu@Ps=WN8bxEyfX^=Wvc=*vWwl9att`B)XCmf7;d!%6*Cl|Btr?;b69 ze2}bv5qY%kg;P|{KCVOK(j$J|{K$#$-J=v%1#&$EOs7;eIb877rt!*~$&2zvciOo+ ze~DmiSvLmb^pWMV zGdr~Z)4ro!=Gb%+660*t@t%1+IMi`l(XJMY%Kgiz{-^XyVM&WadV&$@-xgiwt!TJ2 z1Y3u=Pj150^Yyp-FPB*NLjp>lr)+*cc`cS@oYm9$z4OBH%Be7j93OFHaw|Cm=;lD> z-|?OrQFxReV;Zd!1Dh!_){;P=0#D3+e04)`S=+}Atp_aq?35oy{HIv0NZAwuXVC|G&)@SrYwK|H@=Y;h zu*-4kd(U$^CP;;pvMNuAor&&OoWNYLxtIKMIUYZHYpwJN&CZXVc}FqoCIy3BdKj%C zn`JbmC=0#p;|qdQUa6KI@pnQUvp<*3?&x=(?}wb!9Y}W3KPprrj7^k_rLFTQ#kjoD z&VHZ&375OTRTjGIr>NS)$*=iARX)z31*ggP4Rd~4nEc+rzG?qePQGf^bCP$!y4EE! zTb*)QYs$Km-th!YF=}r4u;fUj3FVUtdLxEbo4dnYAw4tN)Z@0+n zB3QS7xVeDm8}Beaj}IqRXm&m^ZSrvNHXma(8s@P5;N$}n7<=tCy}tRw|D(-q$XcVv z9oFZF-!8w|!$-==#EDnP5&och$Ggj(pJ%D&)#;fIw)dv+E>38It;r_IE@4(&eCj)i zGoaFDmN7%8eV3IHa*UkxtR5Q7^KNL8Cpt!CXFSQ0)F>O1qRdbhN!|LfH|}=8qGKL*7DH?>>8~k12=Wu>zm)5wI)pnuFZ!sb z75RJ1@=E)!7_ts|M-3V+Qm^hes7qI&u)9SoBb7jZ=F?Uu>peR)nID^&CSWpdG@mZi zKLGhcZ@om@iOOai@oP!R>n_Z7O@b1P7>YA%`pnd#8)j+4re;a1FirtC_+8M(2Ub&Z$S@pf-Q-BN2wCS(Ak%RJkN>Qf|lv~$m z38HRKqu|u=PS#)C0^c{33PS|*C<8?wP)7GsnFtnQ*JA$H^!-os@c(-e<@*;cBjfdL z1~LPi(YFNJ3)yrwG4JVDFcbP|XeAVny?-6cn4^0f&E3WgKrWS_8oX2-bq8*n>0(U> z`0HG%5z)1Z__(KEzBl=I7qQEiz$+3RzUV^FVXqT0*7pyqF7}A=o*7AP#Z2ntdEe7M z|9qwUH)i?Y;|SY)hK!nJ&E;J8O4-zZh(8nx+mOWkZH}7r9q0JG_-7A{-XNuYHa1)? zJZIe<&(|?(^Ux{Obz+o+{7Ycc{W_*46^wLqg>AQUC%N8{%+t~a`Ry&VitWPY}0>x-6I>h~hTo`cbrD+$)=;w23yN#PP z_=dZ4j54GjO^jW|MTrPh`pA=>d`-Ku7LI+`k}n@0l_b5~PL0p4M99FMJJn}YG0h@x z7poz;ub&~>A96ZJXZua-My~>|ePSo-Mhv2*@qgNyj^bb)m*>>MATXaz5Jd(~+2!_n z6bfzkRFsub?VB#BRA?&fj_umel4DXQV~9$rz-Pz{g%kjZ;R!~fh-P0%>pDXVnLRYW>(mI)#QE6XUD9 zA6xrg)JK#y>_<2hsELq}-x~C(E1)tytTzh=lkYq6?mayU0yaZo+AJDB1aVynfmY`x z)Nj|Z+IC`nOE5rbwknR57ckK;Z+Q2{&5kropL0c`vIWz8yJuqVIYu1&#BXnJ3mYlt zjXr@?;BeweOzR8n6uLV#MuQ10=MLsCp|=%yQhZ*;ml zK5g)iPIvOH6GL`$)Pi%6WyH~)T=Kn}gA9S`KW2WaUMm>W=jNnvlvb~w#QXU`Al_p( z;C<5J7$5Al>rE$LF{-kfHL#g5uoQ7l0lu?!#VAo*n7w#xuqT|IWV@F?xXR!|%^!>6 zt9?}UQz;=s>>(0-Eh=xw`9Lu1U}2gVEya2DY=OhgY|stgC4G5fXj|p;f!D)2f#Ly% zz-CSD_z@yT5?HOzNb9Siq+Iv6859*eJgH8sgAtn}s-W_rt*oWRUi7sE7%zQ9F)HFb zJbs9s)gTa@*Ux1ju2(8q-u77P!l}@jCNPT$@@}OnU5n1+oDE%*Gk zMwp4N;HWTF$golID4LC`%yr^fqvE02w@_`#8LBb3D4q&5vtrLA#y7w0aW>0c6|s@h zJm8S39FImOot@x6_TIVpb8Tj~cEo?pWcxY+FJo6O-V}((!4B6c{Yv^Lo-V}B; zK5`OwNG)THTZxHx@rVT$cqBw;smS-9sLs=Y_4{T-6;@(iuP{f{qYj=3*}WQ)+cm+ zO)KrImcc>AsBG6u=n0p&-hj5;5}3qWM}^ z!lXEjf?~<_Pq6?)uP{T_=K4>hj!wM6u&(dwRr&Qh-%1x>ChvwFzi<3*;r4z@45g;N zzK!HA?yg+u^7UmS-ktYUTCWim_G6|SXXK~fqC}Eh)#Q#E@UHK5d2|xrDV-^t$<`zr zIu^uo$?@XIZG2ke)GfaKvQM*`bPvRN!fd!oB*_qSCG7VQbR3BS*~EwCCybU2%YxKh5{Z8yrzl0UX_{&=KdI)6oci? z_%vrlCYh4i()}HIQj-lK>|Jo{WKs24h_D=;0m7^ zAWvfiH`q?PE+?}>Qsm%#MHp35Q?5s1aqxlR4YPzL35_woMt0UkIlOB*g8=KtxtbH? zN{q6R$cQ5UnO(dm6g?(T^xAxVId(747`h_h?Nr($2Ko5Sho9lAVN<66;mX|r$Ij%N z^oIS^Q~*Ylw<$*9y&X9LMEc?o^vHS~C;AD%9_8(eRIa75FV%4PZ|vVq{``luZg+JC4b)*-b=^VjZ6`%-Z+-t zPjIJnNxtZR891qsj__{T=o>#xMBpbT)Q4B=LWe?xUikG1`&9iSz!a=8*88h&`R~pu zgi+lseQMs4B$KhYYS{W81^~eA-8AhaM2Pi#=pZ@cwXWlPlO@aCAQ^z(?kOm$Wl!&d z(M>ViMAs+h%G(`ELug0EzX4l2fNA0D>D%I~7prR@Y;eM{@bL@y1m8G&ask#t2R~!a z1D1Iv+t+V}#M!(=le}-II-d^#Igx1R9zP?7xbVH}2T-2^hS^vP#_y?Rof_D-6Dd%xtWSZ>Y z%wZV_wA_wmYLFk|u7bd!I{}od=v>o~A#{XYgnSPZqKt5y$w~Bk86Hpn;^s46u!n{5Qc|0n=h0x?y}dD>g}` zNmmw;9fRP6>mTU|plY!xSi}1(3eqGWxjeM)uveJosoOj0wTm6y^?EGltov9!UYeSd zzD+U8KS{v59}`|V=47AUYQ`Lr@r`;!eK7PnbTS%J0G37XV3);~kAB+%!HIK*NNuCc(;jjj+`I{&Qh48z^E|H;a0ryI<=z4-)eOK~m!M4=s$K^`8B@cLAIr5Uc+ordEABkZ8>7`v3?S_4SC) zhYIPv9bs%2zo>VcN%(T&mUBFQM^RH?fb>-vTkqQEtnp4i{{H4xVfi4wMwaJFP!lwdUWK}*#E07{cnl9=KBEG3z1v${5B&w zp17GU5cN0B&^miMrc|>fu|QM8YK{2A0Ci|JWz!{jUWBb#;Etag~KO*!^hA!SeDvS|^pLs*$@?cZKn4GK?(@tmFc;Cuu(Elja{s)4U z{~YCm>^MA_$4dBT6{@rCFDpsZaLvWZS{F=m4-?it?9_k4wX@^>I@*Bbbp18v(I4B0 z32wu04G|r|7&TZ1!slo%r@Wt?kVD5+*IU*0^Lqm)oE!ek+?tfcNmZhrvlh;3WH8kY zmhrO5>f6~4;>K-gHWaJ5$$#c`=RA!qOEYA4dzis_(TrZR2iQX8F#&(!MM zjZ(j0qHb?a>&_#uDhhIQMwcoVUgn3c$CnWLvG$@Bzkz>_W}`ziaa)yXx|w{`jsq26 zawen(C->Pj1bgAj4iI=}_4^tZphi=Kn$IwExOfoIOXVtdICkn zWcxbRLK_%Zz9-o{hf-LtT%WeIiJuQ(TC?%fno*C78Hgisdj*V>CQs)CYb_@lwl!{(Oo>R#-rW!OpfyN`Vr5h^L%FfKHf(8ms8!n-nyM0x`?*vEHX%% z3EQ}7O7c@RZTBOJLyGqL$pl6c#;EfNmeiRp>yNKn5++ zptz@ts9jepRI`S}^4K3-zu>fNI$ZK%r}c@(n-A`|8~ZuHXZp(sq3ARHXI!*NiPXvr z8ruf8BP46vi7{uyH7rji_{u&RMn6^Kt-c3+By;aHzshB|eURca;@@~%^vrXBd6SzF zV9pEk+`o_`Nc4X-pGpl`!8U;qx>t&`nz^C!AMH13Bm$zRt^IPgVx`Q%h=hzu%Tl>j zX>?0W8x`@gmnA`7RAhqMyQ`r?dP76Mn84j`!FAeAu6WH+C2MJ|!^UvNB_d(mINKru z+r7)p+UP0s-L&TM{H@E0#{w7P!7&1ESYPK-9Qyi`bqi3+%pcEr^IT2TIfqv|ygx<` zn5B%9Fz>g4b&EBBvnl56PPp}!?2e^QzOPnlpz8Kc@8Ryr5-eor0_IzjBXO0BA(S`? zkR^G5xdmwp34o)#{9=i3J=xC-7ik<)6QZ#w;zUIomhOLkZ&_PufD|VW`aumz4VG(F zPo4V&daYBiLN#zX@$6FVG(DGFQg@$`9O@+*C`#CoGDS9mcP;h^lxla=JYK@r$Ux;X zc=1rtJyTi`_5j0yP|6TLaQkVWia`zRb^1a=EjWyO<&i1c`{Qs+T83>{d8tZgF@Luw zN5u6w<$3mqBFAC7+=?%88fQ$#kFDXPvWPsd{UWfm(fq8ZkLY!5sYfLFSGj{Mb3k z#*hWbtmo)IwAi92+7ijDiHeZVoT=f+{K28TBDG*<8fR@0*?C>H(Cm3OS2HpOF&|M7 zK?rH$>6R`c3OiwYim|Q|H2dWNUoGnT#d`CG;#&Pz_=Pm);kMR-r7b4Y_pj&KcBw*- z4PRM0EBOgzCY7;bd@dE??EHS+d`cC{m&tgPDLlalLq3&Sw%x*i)sbSkOJzs^1klY0 z!h{~^Cb*2U%$e#;OHRAWG>b&0RzU_ZZd>`xKEVgl!5&AyJS`0_yVLdDnrhVgjF4*m ze#*6Vn;D`LuP3$UvEMjaQ9T{G& z0)L@r-QZl7t#a%tkUUO(agTTaJ=hA6*>!plOkAMwFoCPjmJpzwqE z!Z1ry`ScsxfOOM3O5#0RWrIO%b>0i6Gq&j*_SunOVkY&WDgHRVrqVoZuO{rXTq0&f zP+wjeV_~>U(oJUEhVup-0+<_8EuWc%A@VK#cYAq6GZF~H$U2MGASbkAh77M=Z7R?~Y%D}o~FT&B$ z;g-yznYnwF4G#;&V)Z19Y|v8!z%O5S1@PpgO_xHi!~}BEX#Lbn<7`hyJCu1PPo ziyZ}~mxz$mK&TKr64*q1NyO$^&PmG_PQCuVDfFS5l&sKWyp1v?G%H)0@@991ddo)w z!aG23ofZ;Vx^RLKe@tMYeCR5Fe-b*RySTZs4~MPROv)@r7T1-B^`9m{q+=+kTRQ2`a?e8wMryVvDs^`ytMuXKy~C z5r7AnpY%S0_ z536T?#?}Vl<<1OW2N$m}s?ip%}=HxrvM_e*q z-_?tc1wgAfx6GhbhYkNfE8ReX-t3ne>~gFN0>PgHBVRDp9Ar)}iOO$@xPQNh%EF?BqrkU{T-K zTZ?9ATea9+cZJE(g7}x{kRUgC>+MznV@vX7(5Bm0jCDV4ng6!Q|CcPa^3lJ|NkD*x zLZ$CNA<%oDu4C-ULZQ6(Irp*HceC01DzR`mm6sHeozAKgV;mNf8i3BLwq|Oa1FH|kc9D@f)=WjZu(}(!>a^tW}PnK61zu<5eWkbuz!v8HyR9C>n||u)uYZdSH4XkD#kR5c|1)(%d*RSOJ$YGLZ}#1MGDa-pxLrf>Ak)1N>2 zVC}8a2Kzh4+q9amLBhGCrowW%kE-Hml%DX^IOZw3eDMIfv08tEkz+T|ANa33u+*i~ zncMB-R(pRkkYgmE(R)7Jg+(8B<>&zGoFu*cpa8*a!CV3|Y1%?EHabcy6(XT{{6d$qgk0WOU}13X zgenUKirT7&)qT<@nmr;GHk%%qP224{WPJWgUpGDPksaZuht;bT-MX`5a2A)u4h?7e z@DoYHgPcJd_^3}Vnh41={+i?!BKx)7VnOarrRsOdM&fxfC9z%(pA=%>3hlG%L6(L@ z^t7t%+?}1K(QXUTU1~u>^M>|zW!i)}i;cjfC0v?Mic?LlDE9ojt(=q<@3d;YN-%h- zaQk5&pil-?xIG?OYA;RQ^moY?f4TCqyCEPq=gz~g6NdP7 z$k*Bs*xCS);`5Mupx6GV&(n;W_xT*v!8>+QtxgveJWBfE8dFP0%V-&_(4`6MN>N$| zxpdkOavT8{+?^U0n*ktqS)8CAJU2pJ=kS?&8~GsWpE<*#y<`1%R`-ex2HklzY>z9d z;fY1q-glS&ND)Bc3Hizkxet16v!p*1(a_}vpTFv)X(qk6vAOGO+b;c0a;4wUkcvO( z(V}Znjjj1>cG8GXO53jv6D5t?FlR(E5G3#j;<*7iXK(Fd7rz9jh3oN^qrF9G@|)8r zZq+u4@LX#3NNv*xOHZzs-XP2CfGq=WZ1|OLn@>J4X@GvY5oC)Jx82}}*=a>;~-_BBKDvgxfpRwc}4I<&?6DmZd2 zyWh*z5`${;EHgqv;XHw^o6leR8tVtjI%zZnABT}-Zk%s6f0L2LWn!|LqBF5m_tWLL z(8;Ts;sjzfT!Z2W?DlkM2WDHJ4A`-l0b(?Tx%@;);4|hYZDG-BLD>nmd)K=Ur+;6p zv$XbUvlfdE&cEHyKTZz^?1Cw^1V`XLi{hK=h_pM4{&K0hQ*q9XH|KGla0!8Hu@;HQ zFveosaU}xxN?|#)eQIrV&lW@3SHokSQ}G1>c1=5LtO$N99v`qGSY6BRnsTA6e|vCI zV7R7mJo&}4h%YsL8QHp^<-0phcxdSg@vguE;6*99FTkKwr<1t`hzLtEZc<{Ns)-ye z#GT`5-joA;7xmi|PVmBMgMbPasO9xa+VwpqJHu1e9?}lW{Jq|ckX$%kw~$cY_v4Eq z-w?@O)733U-c*+6PCaY^{x&SS)V&V1>z36C*d@`^gW^@1d>@uvrwIx08=8cMv!QpD zR}{t}#J1MI^SCpgp5}k}w+|mLwwBJtHSRX@c1i5RFa^az){hfI!_$VwgjJCXBJp3BFil76Ragqa-yulIV!O4ich!nX*uPK+(S5_mnAuvCZ|(J zHYNJlQR2P4plQiIo{qwlj!r&uvTa5w!6ZbX*kP!2^8VRvu9qFh;Y{3sAn{I>M|P*C ziql@e_F14C0VK8b-u=z%=5?yjYQM=uxb$H7wV2eSxxRLn(Z+9xxtl5;L!t~6EPXDw z%`!YNM;Qri7Rrdn(Q$6IE)*^JG?+kNvxG7~97i5q)aS5Uo{x-ovaUoezAKZOx3%;) zlE_%G-0n?+{JtK?M-X3L={N2Dc6>R@ji?Pr^YaFHA>i2?GotS{dHPJ3(nMiAL)sJktcq3&CQBW@*RY#Zp_>8ph@Vas z498s9703t#q*Wa3+wlfbRI8nW0e;N)aI7I1As;q!gF2OwtpGq27rWyR?`wdeDl}Q^V{%G z<)Mzv|7nkqx3io2*Vx1Hb6EKIKggur;n<{34eCJqf5!Sn8CV{6{1Z|A|7g1Y{-GAh zfOQ&ngbWa#!Wxba@&!77ir?Sy6-u~AS(JWjFe{|yKdP!7L36lK0l-a#1fG{{zv0Kg zUpyLxr#Y)1o1_-1b()0*&FP?W%QP+&k3h9gq~hk7e?O^~?+iaQ;qfW1HkME_3M8`` zf2~;_9vhK|Dvm}8d=$b+=~fL=vP*qlJsQ%>H!c>lf{Rq$8L?QCwqTnq=R9@ zlWJm@oq87IED}3^pQPf+YWm&mChC&~OFLui?bU5-0p~kv9M;*~MLd>YKWSJon9`B@ znE9TUY-f`!{*nAYQG=Ph?6zyHLteyG6NIOYTqlarSb8?!ecq6}Jl4gT$Vd1Uq;`1h zv5NVAdCC*wJQ$zh(j~OMsKQ@FdX{%h*k?v+(%Qg%z4&bt>yfG8wt^wirG$*!h`4;h z$W{cGR&0S8{)@5)Caso7RsLu^6`hCadHmCVb_NULHvjVJXK6JZyhL=Vy5D{(L0l~c z1#{9IFmoG*yx_8ci;pv^B^zNc=Vl*`PdV@ftE|>RdsfZAJuew10*H`ZR@OpK6UwIx zJumr!I!?WRz5MoA!FY8 zu+*i~sZ)_ZPF3G%`o73#vaR2(sjW=&H@sdUHa%VIz(@(I)o{nqgWsAdziwU$s1elj zwIx`FTCDVjw-ey9@)FO9TzrMj<*;czOt(@jX%%VD(o;^UGKgU`TnsoXmA$kR*&(~! z>WMoqsMkXk!Tfd90~g~iW`{U&qQAjZ59ETVt@E3OE`;fA5-svHtG1~TFy?)?U2A@^lP}N4v2TViX97v9 zdg2-y+3VcRhEc99nS><~GLdtm`WVlMz z{AU4u(_dhh-TZ!g?@)EQe7*RrpV@iWzcIkd4tRj0tH5=!A7cx4ix z!@Fezov!%G(X%gH5uVd4INX^>+A%~*d`i}F&V*W=;RIE`o{M<}q$4$lz=2T5<4F9E za(C^dEH#F3Q+`=^I80~l2?-jZbqMH~Y}_KB4}(CNt5~4Vc!IO*TVGsXzuSlJB2L6W ze|UW{Mh*o3Hv9s6^1Z3wlzP6N`(-u-3e^x?zyH#XF4zbq+z2TbRbs1(HyvZ-&gUDH z7!UJTFgdx3kF+Y3ST7B!5S!s=sO>P1%s!}?HmPRQ>-~#Punl zzRl7wZ_~M7KT(s2wS3Y4BbwP?fQCpdvx?1fF{(%0RJypmj9b&>HGMJ7CR5PKMK=3B z?M@bLP23`MV2D9J^VfObcx#e(!@KMEGQIcxs(5`)#6iXv%X+WxTx^WCvc-q94*;>9 z-V�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

v(1jC2T;jMDP#~>ga6+ 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%0DaApNvmGw_?=Zcto~e2j(^~; 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

w>?30=g$e@4FeHs)szdYf5AeRg^bwMW9aC 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 z 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%0DMI0Ugj%|$n5`1_T|5f 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Ê#IR6pX5eOeAT1P7M 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 aw6XMJ!M;*h1+OW^!0Gz2Oh)DO<0md$jI{dnxW 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 z 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≈xq1v8GBxGBjK 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

(B|6s21)k{elSpdX`V% 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

Xg@Ra22lLskMXm73}r@)_HXRd2JGC`nIO6=FHr zD;i@RyGbp}OBD-}KT;0^V?lbmQ-q5w&A7ny@4%?hFSWY7oXU&BzoK@1xcfzyC1#h^ z#9}wx!s;1-RKAi+VN5FoF?>EY@OgW+fT1@(mA-_GpEpFO&dtN31pS0L594z!usmc};}H!4TR80-S;Ob|p(k4!z? zY+30dt5wmaVsFS7*>)=0TT#q>ac-eIrtQnr98Plmj0bV|I9kx&z4n&xgU(arTdNKO zQ@vBS-{ujb&yU-0ol5%LI@tEKZr5)`ckOC6^2Bft-7PS1;KNW;98WXK2Yq1?Ima_T zDdhBl8dr@KVu4#sEk46ab9Co9cR<)BwmH_}a9ymEy_1gA4;1(&uGg!C0;(hH_iJ`? zpQaBCu$Br06zubE*2yQ*6gEaC@dv+uooJxmt}@}XKCgj_J9b=O?jRU$vFDPtIdi*q zph1Q=VGiUu6Z|$8(GWV2O<5=YtXuC<)O=GX>{`tU6%0;m(+3kJlaquFX3ZuU;4xB zkMGa5H`V}_P{X_r8yoBz#S;A-KO!;Sw?I{}UOZ12btvqZwE(&6ai926D_brv8H>%p zb>`{l-PEWkPUxTu&-xj3w74?K_+qD$*hY9|9Bs1d#FuN^tm~*!UdwR_SloIET(pA? zS@gIj-5*)xZLeMto6<)1piXd@{9E{Wc=z}JP}2SvDQO*TpitGH|JqfzJ_%mC)xhQ5 z8#9E1A8tJvFRRy(9#;Kh_&Pl2p;zaxxrgE9_}h(r@42G!F|+bR!7U#6YtM{+M89{X zep!?Kbr6h(o(?;Ztph8#Png*f)PVcpUBE`_O^v6Wd_2kDjMgTcx1Op|FY>v2fB_)S9&za&pwM8 zP26$6_V&)lTUJR3NRUl|>{yk?ig}QCgczPpUuvddwKe#zQsle6b)uVIpqvZ8;}ST? zt5$Q2I7IpaE#8p`x_&k9TtR3I`PR5mq4@pAE3!kQgO!cUIHAQY#z^qI@a#~oYZ1^QKFRs(j-mm+Z=|#amlDbjPL&y3SY$@qi5H??z^uIJKUe^|~I- zD8EP(=Tk-fm{!r`)O*t=O4R(Rs*r2sE5$A-p^8!lOt3tnIzdo&1Xk2R7YXDY4CvNO zwy=LPAPRLVRI_kLq{RfJA}{swd5{(>p50-$7;liShgPn_&$aT8p@->KV|Mr|{>D6H zefPvzC6^3cTpgS@gd6eW8~b|RpM5F2Wcd_NP$x*FA|hPU`zya{T}2mBe> z(j6l7rs_?W6Pk0AW`+<=#F|Rm%7EvmAc6$^ZItE^uchm$oH@N!U7Uj%r$wn?$9w~> zejOO?$9`7A#d;yO!zU@9_iB18ZLV3+8yjeIwb(AIu-;frJR41H8+2nCk9($6`y-Q< zo7Msg&wYKW%+1Xfvg7IQJM((Otg>X(LqB3TiFSqlYKjL*dv&zDAs{Cm=n0^aw(Nds zd;E(XD8r6-v~LGzZI1<2%p#6&2R%xY_sS2tb{m8sPYjeTOQzhSwXgAx;AA<)t&#F{ zy+S&>C5MuuXa0iJ%#(gyl+RFGIyr@WUBXhTW2`{0GD5;yi+|b1MdW>(ac<8e@5_{- zUTGFt?zQbxxTvziqV&5ra(JPH^*_SnNtSp-DA|xLKzcS{K>eFuUAtCCS|Z#yZ{C~N zhol9ZWc%0B*+E3p8hs<78B#TiB0DO`UdNk+UQa5RJ|_KSXW%I~NHw@!tJ=!1>a*M! z{)y6_t>;DRDvG}8dDRY82iD}NEp+UnB8MgutRHFK(?dyDndPF{a>uJ@ZU$i^3Y-AO zp%~+4?VkoNL%vPB;XmycAz3ajpiR_lzxI)H?fsrx4j0IF+)^|J8TR_NsV++^`zPNs z68x@leqZOso2129M-ND!7=6~QCENr8Y9xK==oJeV3AeV!_p3EwjvLUce$(>^Th{vX z=5B)5Z#k>48X@=i>*~8hR2MYMY5J5Gt&u~>rWH>T%*6>+=XQkgPHK^Is1m%xI@t?< zbuaFZCHGB3u$aU01r5ur_+$8wWlFr`hfRbNOG*EvzY4{lO*n84Sr zG`<_V+4WyNLP!p)Bsk&X53 zqQgs{ZufcHIv6Fm)p6MtN_|C2Gd^0FEk6=)t+sb?e|$i&wJda6mOjJpszmIgbx=xD zq2zVT>Xu0k!|EPrDMkmwC-ubf;6&f^zF0g8-FKth^H%x`ux}$*t8+vn*W23>UtwA} z5u?~^lr*yrDg>g1hRs=~21n45ujsOC_K))JfJcT0!mmY^>Iuyy$EC7eT4e=nFjkLz z0kq6Asu#{m#B#~SaY7Rj7tRQ#sSKVsoRA! zCtJ(L=IywLe!WyP73*&QHZ=P~3A9{vz=s?_R zktxqLT2C3hZSciPjQF1Xz3B&uIxJDHT{;ms78pz^#TIb1~J z^=evi&@84B)r3j90n(vetG|D6^-cuJ?lbZg-v{^R!;qKQdVS>mHe>slC5+X}GX5$A zI*R6cRy)Y5Zs-E#q=Q2mCzvhJ@jZB`&I~J8;ZKX5Z2W$zb~)(h_&of=3)gI2#pvn; z=DG3#ul0hIH$hSJufw_+(be+=mfQN3K1tHORNPA&*ij)o-(+$hj{CR)Gwl}LRbY_j zO$(B6s#^3Dfa#9~N3hEqkO>|9V-6>SudCOUN{?%tXkae^*)A z1a@vJm%S>lAgAf%i9t|$YiH{HzBp1x4+d(Izb#CTs+E;m)11{}A;ga^m9C+^k65pU zpVW5OX4`NxY#K!t!9y+(yr)xB`K5(G9HR)-wOgu)$zY3KwjumH-Zg^QTMe`%GIZs& z#?r`cFGHXt$QqbI_?U$#OhpI+tgnH6FLbTa2;B(dy(GYd49MH4FNQZO?;Fkv+QZKm z(CgJc;dW>fFqzIDkYa7A&n*`E?BKSlTub#Hxa&*@Vh{VKS^Lljx|ZUK+%mapY+`3k92I6sPW z6?sp}dUu-Ac2%<|hq`bdRCC7#mV%!fR0JURyooFBuaOMDV{7+=WkvW zwvAj~ec~Y#8dnNtIv`(2+ws9i(n=gI)>wMSjUB>8PAjN5*=<`t3<<}L!MqEOm1stw z0iN13$3>A;jaAjX*r+IgrlcLAw-*Tz1|oN%?yzB!Z{8O3t1@Fuv@aQ_iNW};U;B&< zL!JO{DzKcBzt@q+UVskB*z9SO&aEjdUfr2)$Hh#~F;o?0%n-S+%4RPYN9_8PKbVBx zZYh@TORJ5^3A~fEj!cTnJNB=7^gk7@Z^s*U9;R=(NRR(VjQ0OkjP`xyF13c;u6?Jd z{$Ceb?DazG(w9tt*x?0+n-Q-m!-_~8rY#wjjsvt;2;oBiFkAF{?`c{2k(D{pi{@s8 z4{J{M#r@EATKGbeap7iCofy0%WPc`1YdFG4M@M!e09ufzTwleU3Tt~u(bg(D#`0$F z*c!a^SvGA4#{}}pNty07yNa5#vEHm*%v6S~Qc5}*xh6)-l$}Yl9>*buP3$G)+na|R8C$HdCEaU`iX3j zw`*gXZoRN#%mx~#AErd zsi^kXT7IXnZSkv)uClMKzN6lZR7u;3@+ohC68R-6e_K}e5IKeGH+X3v0F~XWDH`KS zZ)mdXHyCiANzh#?VoOLAh8W*SEQ^o`03^iJr2_Wk8Ej3w;>8Zi{8sf+@-+H#4trv4Ve40%!yArC?aukjw-~&_&~KNny6Pb+t0lpu z$6^i9ngs>ejxpk}sMWC2@LG4TOhe68UGtg+NJ=owL{fN_k{C+*eqqBvsAr0lH=Pm{ZHiwS3FeG=FM z>^s_3W9a5=vDdeSQ9AX;lJQ51cGs6XxO%mu31z5SuiKd3?Q1+*l=7n8QB3kXDJiTz z%p^C!I~Po%E==bJAKkQ9e>Q9L$4`c8w1^bTboxQSMYUrS29rxp^v^A@jiaacEJAd* zAF%|+JlIO!>gHxWG9GEm9X0vtZIXsJ?jAAC#ewd@&6kXrC;29H=7nLX2FMy*0;*7< zzaExFCw603Fe82!zIfyoQC?P@kP#agEpztD^QxQ)$(bWP+IaFPv{VdEz<|R_m4UgO z5$nPYCS)b+(t0b)8YiOU{;jv&X=D*`(WLNh4Qbd37(}yXz!;jWHvl4}?J5BF_9=+F z9eDii)x8LSOK0G;puI1>7Q`{Hz`Bu#LJ2IqyvrHp^AXt;7ju8PPow{a(g$iS6vDb~ zyKHT}fM%4?BwO6LhXS?kyEd&g%5?AP2RYV)P-?s#Y(sadAC+A*dVh?Wgd-QJ>M35q zxl`IUJi_GsaKRPmLl;9T?^{Gv-%O7E=%%CNY=j1flo$)YTCh90Z#oxkx zgU&;inaAxGX{O9MV;gw0ljX-q5@jZ&_2k@^oeig<4uI$$aW_JDPl#n=pWv&G4H(~a zak`7o?EtP2iiP+D@a$k*1^7JjI`?h==Sf@bqoLL5B+cUhqR304^*AJ$Nv?kBqZ3~(L(hh z_V0>G%v z^J>z!DvyOph&-t?NQdGYwIHr_=dFE&TT*?CW#9#BYX_=wa>KXmK&KD`=}!tvWt1^r z*F#Hou3BFx`iBePD;1$`tktzU()J5Ex3DVutGL5$F|3PN3qL`bs>$`8Fv~8>g-aHTSD8*t=e3h7Al^WAI9pPd*6A3KZc%@s_)b{Js^iOt#xpu zR@nbS+)|}z+}q%8u*otcjfQ(T;kWe^a$}s+>fSqY$gF?h$WV@`w9Oik%h9T=opz z^*#6bYQDGz+f@VmqElnbo@5>eneaxF*;9~#v2mXSaOJKy`uMZp&)cUav8!q(8%4D> z@APPCQ_rL!5pIPV&7o)~(}d-AB`81T3h#l0AD_kPJ&vr<*dHlrY@TNpJ96$e*kpQ6 z1ZU@Mc%vIqPziDU-L?7vS3N)?VfIr%W0Er~ulj-Bs<8si|7fS5gM7tJXwh7$RV~@y z(y0^kJR`_rre0bNQy37>7ceU&ehdkMTFAx!fJj*~Inp}FwL&tvwQ1O|evhy&dFmWN zFn5{akn6$MpTVQOGK-gPe}200Fr@l^m*4bAeSR1dyApncrdhNh!JVa#G&V8XDTUAGvjJ z2&9rV2PGH!-9hI1T>v+e5*x|VkA+j=Z{pklTJczocy5m>p4^rC-t=0%jK2Hr&&o?( zq^`3i7KIN6q_C+=A-9onBHyTP8$|B84!`F*m+k4Ql~pMmB^H=Z&_Td|#cqvFhABHb zhR~5ntuxslcMgFTyxitLvHiegDRD=Wlk%|DM_YBi{TQue1iMPSWtsYgTL4t?KEcZG zLIc#aNh^B1?Kf_}VpV%)PM@dCc4yFmnoO%f(dCx`4LRkRl=Y=H>F?azL)+teE-NCf z=YJZhRNP=Tr^&%&Ci;d{o#H8dgZAo|KkTt~={4OEze4OhUXXVT2=UlTGFDa`;l(?K zXx*)VV5@_s#~FGZ`zy2)r*w#|o@vfwu6O0~aEy^mw{CU--Z5OzQWL_~n`hD2`Z8*H zy4)Fw{LDfn&jyDv$zW{j9#Nlj^ZP{Y*APbV&G~=!l7ID~GPwSe`}}ViaR9l`-URJK zUvM(A04i`5Me(S{h^SL`Xs z=qdR$Hiz!`nr6QKm}@Jz8`h@;ZE3DStQPwd@v^HrTo0X1w9}VuzopjiWZJ<9bq0vV zPhlNrO=^19;=h&7poj0;r}Yjhm7S5G={$o-pD(hzan zuSBah_R3oHYVe$X=AAxE0>ke#_)21mfV=Xeg5k~QLttJ3{cym-BR}ant%y6_ z+hdRydN(S8uJ5YGV?7uk&1EOBEdR^|62VI!pkCE<;vo!XyeQ^s!Uj=Z=2>#)h6rC> zau4BuW77FO+|0zoL;&2-k)X$I&Ad=i^cXTW5VN+CSOpjqCh+Lb=@ebQ(KnIcpz^ZN z&S@=vMzkgwpMf=*4dCss@;Sb7OHIebkEnCQlmn)@l=?=oG=3-ZHCF-L|60O?>SN6p z>sQEWz+>vtd4A)O=K3ki$k>@JA7;U&52hB@&@^V*H4pN86{m-B8@mbyLa&g3p? zO#0{1++@H`Lg=0Q1=xFVO#@7@QVx|%;pq6NKC^<_E|~js=n6|<*I_Pvl9r5Mon6DJz6n~ng zrjQp{%QZfcii8u5SJ8!a;*kYjmn^x@1GXI7xo__Rn|DHSyrclb4RS%Mv(<-LfB#LL zwepWl>=%m|D>e_`s~!>q7%dGbdmOxmofXGNzyBgmpF8s?#H@z65*&}ffQHZ3d>I(~ zjXYz^j>Cq&#Q5&bc{A?zSkvA!A5BL1J}hV?iwvmK=$AnwvOoaNQQi2nqwkk!MxRD4 zfeH#Y)cRSPpKa>e=kF(qAi39qp;05YUK&C{(rUW{F@(4$xy%87v~9$4&_^N9Y4J$}UTsRW#L zHP;dq)bY7?dL(E^P;asCdS3+PNP^{>tG#`TkKX}E(DP9+O<-9B8nh{CSLvy0^^w6v z$Oz+1LX0LPuAN`I2>VTKCb=wA$VyO2`Z72=7Fu2VBu_& zd62*x>6}81tEKP8Y4#=IDn>NkXtdS1Oj+YYG^6(7QTIRyzm5h;V zMte2}xNQG3_O%vOg`AbuYPdln-adI#snV1Pgy7Je6IQdA7~xaLh<=L31-q=v_dsI# zPB}+RbFO0h!qdKoF+eZtf0@sL4r-p<81SU$eC67vj z!K2M3hf&p(Y1}c*oF>(~eKN4_ZDA8FA`;NwgTC|>piqvth-Qt1{v_}6A72z8bN0nn z*s4M=vhL+rcXf|c@tWt)yvP~9-JN*5>(F#$rJuBxo>s^0U+T&d<;dBC8_}Dp6|NcM zIC0IGf;S3OYQ*c8J&a8ESpz}3uRYk`QW*SXbDB+?MZn)0=eFXot*+fnrjg6|ReP1! z_`Eva;&R6sw`JugRAQD6@R=%FmmlyxgCrkTeKsl;omHeU5d%wY*fYK`W;KCQ3Rsp? z5)-yjC}Q;}Oc;F9lz*+=g#~$AmXW{Hjm7s0#id*3mKdlJm)D@gI3|X8tMZd0D6!#J zgsD%}w*bgdTE_-AlT+xl>uc}L{tUk4=hl;wwM_@hPh?fzi*)$P3jy?m4yE8b9Z^d0n*LgKD_ahhkYt1#oPX}_tY2S^(FtDdE(l9ZQ>m?#!^XTXpYZzS zwO@DsfZ>%YZ*gap1o^x8E_#Z;DN_DklpX8L3nlODHPD0GP{LiAHjk>&*hQb)!Xld6lW%l|Oq7(QEZ%syVA@AP(k zP2Vq!KmWO5N>QupxrRWNgbOdUYq;`G`(6@MvSm<1*7+1%c42#1Odo5lJW?ytO5HoE zO=N%sS~d`~Spu68Bach5U2mw1#{?_Xe4x8`NI(^^7UeX={<6xx1|R>13h8PdVw>Jn zxwr6X;KL7piHLyP8=||A=V?(XrJB|0aZ{hHuQo^5506qKi_^z6LBk2Jq81LZqIRQp zxzDXKJ9Tv~alh;+b>d^D3pFJym?GdC8h^V5|9`(NvM20I%Wiks3=}vRn$oxdnK(++ z_|-3sakg(lzs!NpkWTSo4-z_0F-}oT9s=bIa%H+Nki z_|6l>?M2x)qL;J$Tp$lJb&+xJshfqp9few&)m^uV9x zx9+clE$7h3`R`@nmYyih=>K_J={4D8G{u9#yAh8uD!tNdh{ldsKjv*AhtopDnQe|NQjW zbzoGd2bi2X1ANp9>^p#fuHSw};w|Ls@Mo!OP61nP3!$77N^XPh9uX%2^}a;gdzh%2 zG565`K>p_iu+aTC=U6t<1;8Up##iR}<_??PC&luB5A{h`Kn^3CxGaH>C+cgu?xq{l zV{d_pT8sDRTvaR1mj`?bqxWxw0(+@ejy7N#>1(lV-I&qtdN=5(gs78_t$EJ=+1&us z$Xj^@5TQRWK$%ijNQ$|Kwb>}3p#JqE{!gDm!tsi}{Ttf+k5A#lAlq}bx1wK-ot3?H z@-p~V-=98(5WuH!|JnlUSl~UY#I8SAx&IFWDE>x!H<@l%L;-e7f8G0mgUtC;|D#(r zvndYv*V6_}BTrWLHO86$b=Qx4iQd`0Qn6DsdQ3LmKQZOcW8*?kBbs%9nwYXd$hQpl zLD_Gb=*IfIOf>>KeePANt(N&A;qorxmqzCXQAoe}xYMhJbx?4Km_(O*3v^Q73craY zfJ9Yo{?OTIzpE*Aga3unhi563*_E;vzOb6Ar@w{AcpDl81r)J;OBmk_{2|0wAFb>c zFIvkpy$J^@IP1z^9%fn7wr>(JH>nfNwjsMQ?;3T#>iA2s=PoCE?#2wqIoe-XbEp=5 za&_D3N-o)h18VmLv2e3DEi43Ej86N+6-xRsA2uae_#5FI_I2(j;km2hy{VjSU9awI zM`j^o#5B|9WL;~vW%Y`3g=BN8h3fSBO}rj0<=;_H zjcmMH9ioUuv-%uNt7K2Ie<2ckl^pXP^Db=X^RK6^nA|)wnfH7nCZWdMDbqU7&7Rz!1eS$c9!`7`+o4pd&x)7LN_e(t$sz(E#pIQ zRy?)*FX8v}UfzyLtj$gk3QUk?8p7U@dkf<#4%sSL)6g>S z3a7by?&lp`w095hi79p)AO4iMGcJVdZh$duzhT}e>^=&JNpQ(3)8|aGT<6PfsF^>N zuww83qokUS6fYLU`NtMOy#fhy$v*F~uvXvCYrhy!b7bt?5$3D#pHhcfs459AN!)!k zD@@;xrS%bmMtO1I`(Pc&hadv3+oGWe=OaODEh!DA~Qv{ z%pB=d%&CcDY`#lsk`Pu6%)1dpe7mGk3-bj! zI@y-<+}ir4qFN1)^{)%|D(eaUO}n1f%Jog5*!11mk_zng%MD|uS?;8B-!2<<-M=%z zT;kX>W{4u1R^R=>v5@iHKQ!X2|15o-^H)@3hfNzU$;HQ;?}g-%y`x^|Rv&O+B*#Pf zGk*H~R0&z`7A1|K0o53HMnR2~jxxiBK21Cmzit19@WkxQ?$$cr7D3$UM^pp<=9fC> zk{~jTg9VUG92b`leWz`a?PW)$S7)x3ys&~2u-2PlF;S|%OHA<|(p#JdkK3zI^-mXj zidr%K&Kee^qP9##%u?M64c}Im0Xq#nIb(!Cl+URddp1UAe!8c?WPPnd)x{n;7Q&n= zW(|2RZR%B;A%}XAl~LQF1;Gwcx;m^ogW^c+V>V@Lm&Q*yI;n|nXO{+4lZk6SEn%Vp zI7L>wFzx*&iRdY)-k@qrH8p@<=uI95X(&}RB#KRJtBD!4Y~jzq()K_C)UNFwOw-U< z!dDl{w!=zEQFc5LpR6&CdHX5kc=@Z=gc?&jhnXR(E9{!X1E1S#iYcZYMrpG$9;*He ztgZHyFy|s>VxbvSW{faI0d-y2JZtgzEk>c`;Rrn zm%fql?oS{tN8yp1rSAX}lFTD>F$;EZJx#!b#L~vW>d!aZ0$^OH1erN(Ml?0P@`cvl zT&MI7z;3;7A+SH=iZxC}Un>B(bmwBksp9Sc@|=_ermHH-_7P3`yg{pqR+V7f~Cp2Pk+UJM*~xc=AzBe@@%fF%pNgLzVGqeHpP z25ork+)OFb?|cWY>;o^(Sg7G$@Sm30N>7*S3(*mTZuMU7Vqop>TJI24UR=12i%he< zSJh2rFYMK_ga29!y>0gYdJKoX0kjZj1zc2L0-toueFB))76Nd1M9Izb$Hnwo)o_JC z4K{Bc1t1vHdI5MNcT0;q>5MNaEU5y*ydRh9_d$DPKoZYPKzj0sy#@k`gAz5qopHz~ zK-i{qu!9iuSA16%*03KDN;>HPS2ZS-&+J|%U{tNUe;+bmj^qto0X)Q&D|V#p?hxzW zsy(}qEL#YKg!^aT_Yg0@4x-Ne`S~rf`qg_S8l@z>{(F=L+|Q}MjjI2NQ9pbA6Gr@L zRILOURqtO~U>$*Hj%U3rTC?1bOn~~hE{d=p7xumW`_{WZfd?Gj4}bt!;>;JwKRv`z z=Pc4MQdk5%AeOxXtQ`or@SPHW1&>dibrBI~Eq6_qpQRh!OZw};M4>|Jy95sQBrVcq zk`3BF7YUx6Qa^VN(l~@lxM)Y0OLI5}4&yIc^(CwZm}52BFQ+eHsLQL3N0se7r?+>X z>_4%}ts`+DVDmeO^I`6AG2TQGs=n%5>3e)m!Z>(;{a#1Bj8E?D z7y?kq=EIh7av^I|uD?oMXlObT7QFq4K%a<*6N59spP8#n=oO1y#GQ~X1Z%K@8w>3Fg_fjx09}^cUESQ%k^44p72>!zkc$)>JUFV8P8$B z)Pp9K>M3=B;f`bB)4XpJI32GA-I=$$UW<*u{(#?^&X-<|cq}|OLFj>d)+3XCNx?Sp(D*e83v) zpk3P~ut}#x&I>pQ>7vqErj8&3TFb)G`qi|*#KW#hK>{^}umEn+&-`5ScMNsG)C zNx4$_v`~T3mf&;bg>j-<(IoHaNE4B3+B48Nxfm?187XYdOP_caCPo=i+x39)&bj-V zo0){y&TC$O2~y(v5ECIbr0&_Fr#~d{rT6aKt?RWt{e&h_s>0msL-h(+dXep&twBWrfre!3kpDBA}d zb&kDGR$Mr(jkp4nb_IQK%fV@{_W3%#UWFdU0bOO5A^taj4a(}%h%&z6{I+Y|@8q0z zv7Fxf-DSuGNi)#_R)a6~JJP$XmpN!J(M#ts1lSz^oYNX&(YOGjjyC9y`afKNb?UAO z(6C*2kv2Vphwbvf^Lh4pp!$qx&|nuI588Z)xg0RD8cigoubOnSR9OPR38WZD;CD$s zr7#3?Pul|)W-%4>mWvS${Hf==({=7M4=$2I+WA6mpLfw(38l}pRVjhZgXc|@YbtH1 zJ2me~l*gdY3-Txwtuj=$kD8{!KA{n3&~@2&59$L)aJeT_g*%@Y#gRXD>7zf+uL5I{ z%tdvhJgHp=66DeI)yi;Cy3+3z2Oi7JoX|=(9VZvAHl6M+^}G9g9B-OUN9Ppa3As1j ze9-(I&veqh)6n95V@e|QTS5G5PAwg&A4R>jtrgE7v%c)FB`B=E$rl)0WBQ1gUe~T$ zLU@9+lFjiN{&`j8$=Y0@n_W&_&efXPkaP$|aw{pU340Z)r}M2XD@}n@5IUJh+T<0Y zZ9KtDlF`HUgqET5B@pw#DBwwnS;pB8=36>WxHM~n>wnjGbo6OP8AY+uM z%HiJb9F57~qoBiCgK=}rcN_oVI8*qDtOrFr& zk96q1JOHpiyAG_~D&3Q(^e-f3i@vzc(ze*vuVIh!pdS1?8Bf_TmN2s~F=*fUS$>wQ zvpyekcg%6|1%{~A6nQ^nC~A5B-tX}dZakdID@yE02dQI@2i9k=x$cD(;oh$#EII)X zl@u$(aiPl%>1{J{IS+kS`44*B!^Me1=HPp%GCem``5R!qOv}&6#s@0dqvY7Ag32t? zs}ZV4=Y=DzUF!Rez=_)+B7{3JZ?u=G0!?s^O$wPFi6~i2p!VkI4oIn zdV+#U$anixW-6Hb<@C`Qp5)ExVB3cr4<&9PdI7=r+56L?Gz_+_CG5=}Ldb|xJq*HU z_%6juJ1U#YxV2lYvPkq9)yYt^zs~ zdx8Nr1aC*u3mv_0XP1?7EpNE1=3;i!YZS~VDI!8r)z`9Pj8z}a%p14E-M_w`Id)sH>avBK>8DQ&rtqF9X^k}ik zK;2GeDBnLk^WFIQ{s=Qt+fjyLgLjUy>hcyG1i@&eT3~ z>d?7fTYOrU12o~C`i#M%zA}f{y}*?m4oXb!uiF;eOUGwIQd=CTq9MAdSNL35oWYvq z6XN)|@0RBCnloXb3KxjmEvm#s#1Je^*Uw{J7NsYjC&ITucmGd3k<`=%9zA%O-aVopH0G^y3Gk0|kTF5Xe z-s5;ZFjylT>0K=pzRWvQ%`zswrD?u}e?IT(3FGd>Kuc{JVJg8s7 z9=CUb=xyIKb#0T7%XhyfOD+4d?0;WhXt}J0+{7OwW039koJuwY< zyf)VJhC3KLRG?yQvQWz>OB#{|UZ!u*H;foq00$E`nl{)snt)e{2>-`@t4-S{aK-6r z9sR!4N#BjJ0_vW@UW|%8AB=##8npIlVA*6rc2R629r%UQtTE6Y2YQH|Srg(6)eQAi zT61BzIWZOC=m@THgQdCxX^Tk3r`2Q284&^>q#nl4))g=D@lYnP~7Ajy@5AD?id`C zraf(A&0wDY5%jDb^y!J->g4P4_coy+3S7+%U$t4(Lvttl13ET8wS_I)KapNN>BQ>M z$S1j9_uj73OsC4|TYAC-sYT0jU3O6eB|BAd)0P_Ro7KyV+ib5t&A>2e9kJ&Y+PLqZ ztJ`e>-ICIf-F3@%IZjbE==^n4U^8#$u4`W+Fm%AfFlX#@V!@1&Lqo(cL_W}AU?`qD zhpy4`XJUS;f(fCN+Qqz0Bx#t=bob--*QKH-Aw=6b-l$H^M8FS9NKqA+q=}K3gl!JpijF8 z3i$RDVw9W_M{RR>|M#qd8QTYh4DGxEmV`H;_T{F%E!b+6XNm>XzW&LcgRO>$5mk2y zDo;{EQaB9!;0iufr==UpQ0KO$9seps>-J~;S-Rd91fX<3TYuUMXz5GtgXmX{?A^el z`;IezRRGcy$GD3#!p{M<>;2+(#=heWJQ5Z6cbVTCs2uF~Jpe6zc{Z?n!)Lsqw@}%& z{mk>nKU(^K7t=+pZndBKtJuGIk+0yxh6-?alONeRf2j{=S}K)(X0(*IrMz96;6d{(xWa9_Xxx?PJ@Lh1?TYs}cd@%B%brX2t z#2D=}NH>_3613XKZY2wUQSmMOslja@KWt!fw_5_y>Yh+vo0kfjKaVF5Q+IVSn=jvc8B$wTv_o4y}?(_K>{ppff3&?@m0-98(z zB68UrAMGn6InF?pbc+dFM^UqEuJUx*<%)=vEw21%9s<0IH~roZ$clO?5&a?`?s|VR zMk^>+=`!ZSJgR+p?0;)gG2RyKW`&9G;l~U-Ng zkH>2=6e+OA&NCN1+*8C=3Fld;)(P(Rr>zaUusGhu2BuW*&6!^trJv|0>lu)6Z;aAA zl;US4>AET?y|9#!vprLoGSgQs))Ng6G@*RTE%jocPiz&ZwlX&c)kK9}Y6Z!yOF790 zEAsQm#y0b7T(G>DydArFOI z!n~A9vd#lYJZbI$xO}5s6CZ6H5UizV1uzJsk4=~<)mdSvOJqI^Iq*+chiC2vjw0t< z{||fb71i|CwtGJ=mtABbO}c;xioimo6Jnt#iiicID@8g;Cxj3iij;&RARra;w$6o>9ytP3pYe<|i?u=RdUxr^CYBB6b#6`ISi+MXNy zdPv|01fuRiD9^?xn%WT?6lFjEsx_HG1?QCnUlXhE+CuPIH+3ysyFs+H>M-+6+OnZU z#BA2Z?m~=wBwz-a*{_bIpBLK}Y90I_21_*G>7q#1cC9B?+{D1=Iy5?#cbb5{^mmG9 z&IqfD2%C3}lZO@)o>Vvrs^R#wvrWo_Rful1QE&K`HN6)AJxU_9mha7S zXnd6CCBvipH`t}W{s1i6e4^FmcsF|QJbK{b7BaR>54BYlXu(pHusm-k_kB;z#qNR1 zj5bKZBq979v~*_}D^E<2iY0F=e0w2iive91YC}q;qB@Y!CZNj_?PIDECmZG2VFR_^ zNsd<%48WdX$1KTDEA}c)d#C20Gw^;l0|pYLN|ml2;>P^Wb6JwYg|O=SnCdLmT4Z(c z&Y)+|P1f`ZaEKDkz54%^xovom@BiG0f9s8SeCI|iR{!^nh>1A;gL%@NX*d0^%7h%6 zf{W^<(J5QQgI0UOJN&ehQNp0n)ay+rF8OA6GsFQxVhoklt)rQey;-;cRj& z{I<=0!xXKMH1#RJKNyL`B~VcR%3jt>5`R*Un`djV-Y_uOt6Me@D6+Q3-(L0wnNNq; z4l)L|trkY&b`Eu>vYExi!PSJzI8Knz*qO>Wn2wt;&{dwE$u_a_L&cxbO-q6hn+~Jb z7yA^#&dyMn_XuX|b`p9%UoQtnV2qaY3**3+84~E*oNC>aBsfHobxQ&eH(Zy~A{J5u zi?3>qh;zTOcD~knFx^a|v%~UJnJ1U3AV`9`!$6u&J?8504=0>~F37MO>VN7ncC9vf2@ z6nI~cg&k62gJX7kBcu1NsB2Jbrywv3{uS9yScYr54rk2?&JtEh&WI@mRwY_PJt{P;tI;3t-(N z9&u^v{xq+Qx&_~n*;VG#{9oyw3)k(Ai-LAwXIacJ1tL>?{>94Sl}ZesQl9XmHq3TI zLp1fw-3PPQoTq<43X)?k#7`>lhc;VGZUdWy&({nxpPGxl_VqXwd;e~Ke+22|84OK zZO10xZ`|t-&+y?alJ+Hk*dK8#){m@_%L!<-hdhd1=g*k#FZ9Lz*%R9pNN+f5FS!05 zHvN)Qn}#Jpdz)sq@FnKMj;7?a@k`T!Yn$co)A8*clFDtIprXVO{sa!PYNh1~od7{f z9eE#t9WUUoqKGU=(e?f&4jG(VwgGWC0%2AVmsC5}NrL8$9-8k}vAwH%- zb^EAf21caYDc*5Jf{>=emxqs{bH%?;ATMtjt=w1Kat6#(6-`dntarr(x`K~Gkau~_ z>&tY_+AaTTb3?X=>jl19nQH31;OcVRIb_Gai_3Fg83maOQXdiDgg1xB^?F?dHm*=b zU+}XR6iX0z6|-H-jJ4>h4;y$I(-rl~gGQY`8IEhT!-Uc(7tY{#QTVTk4yXAGi0>Yw z+|jyoL#+$`#Uvrr1lzQ2&7-O=1V@(9x@q{%2ezsnv=vUD%1@21p6OXkMbCzqfKpWpRfgng7dgv-8Q4kYr|cHx+9IxCf?3k*uZcg&`G* zZ$ir6_c=G{K*{I%+KQKK8~9$xE)ebaYGZZ7-${$tL-`B%d$wZR!Tg@G#_YGVtx3Ms zVa|a^PBY?F%`la~LjguFWyfZ^9+e+Z_>vKQKkVRl1>#enbg2(~`Hw|EM*3nW=9NwBxg`rl-FR!^OMh@U5Opj5dSO$uu6Lf<)h>h36(cO) z^@hdM8#fKUkM}kYRvv@5)H36(1q_rJUI}rGD!awi{Bk9Hn6n#H7mXeQ&Z`X0k`xo0?mbjp>LI-OX&f}7wjtYW~It2nSmI13SC&e*TY4k6>h9-oaH z*H$c;Sl0-aC0z-XFS_~-YZvGaPWaUi5P`r)Nhl9huhXKdl0y?b93BC`gfUj_n0qsb zrCK?KtA?-R(0|5BlT)M%BZP%`!c~l^I}$xN^#xDIjU*aGQBFGhl{z4VuZ5mCwH_Y!(Oa4h`fOWRrI^TB@O`IGX zWssH^WA?6=L<=<$iR3+@gFEZy^r~k9pfAnOoPCoa8-W|Q3DC>yc zi;z>kQUx|{9WEG0ekRs!x4#6TPx&dUkgQw`Z)kcJ&fCzn2@Qzq$^0O=)I85peWX9y!_Q1BzS<3FzTgRrvB+X7gaQ)ZIHPe zbn-+VZoqhH;sv6Hj}JF%QxI7qb7~XaqXAm8BuvlqpqnXiP=H+_eg+UwoFZE)-3$-X zuFhZS)tzjIvqzf%fEgY5=810MknD=(cunvn%T?su_sSs7hnUf4?H+@z^kbHO4vn{8 zEm{`+h(@o+$G^wExbG|q30P6pt-u#SG7+kB=XqJtLsfpP-yX{qX&1lz*?gxs=*9;% zW%f&2aapLlj^y`5B-lv=&tn18Z8BU6BYf^+VZWoVrZqfbr)#KgBzj=s*( z*!VNKan^M?PMKb51Sj2&6@0&wecR&662Kwvx9ryo3*qF+XP8EV=~hPdtEVA%T>v-u zSXeO`Z>^ZTK4Ep{(%aoWuCE5Bj5`>vQ^GqyDt_v=YxumT+Vr>P$zal@rY~&uF~tx> z%`ELnATZ?hGQgVjCyKEp9edKsrT;G6Nlhic7?^)0M z&G+G|7Wm}QTLV%c-ur!BYi)GH8nYxduB={?RPT@)pKq5$^dbq8`6%+^z(^TnuGbOR zowG+HuGc=Rf4lu`O=ThkP)JFEW-;bY7KVJ%iHa%`T%JKz$PjjX5DnCxEM+X|nAf`? zy$Z@h5hNujJML&jkjRexg!PB{u1Z2~DefV-31a-W%%K;ZW8adoShz1nFAB zdOD0(JYU3u$x8Ekh>$(Mi4r?Vhvmxa)xi>oFJl5c6$i zyF37CPFoS%;R!JENKfnU9mv|SYYtFz zx#~}{-=`Iqt^~?rc3+4p%tfQDR?S+TR*TseJdf?XqvB4F@&weTW4zE#NiL=;^ro~9 z=~e{_Vbf$u9I_Ktgkp(chV3?nE-L!Xu>wdwkAl2 zPOxyFb7Sa^#1*_izaA5(m*9vaKoo}-sF)vhh`hzh0#vBzbr7a1^e&SOzA+2gReQmD zzrf1M**rP8eDD&ZX1QeA{#<~B zrESvwR%)7O1>03#$ISQGfw51trE;r{=vnd&Mut13&SVZjW4fhI zzS&LD(%nun6BX9Hc)%zh|6{w0oreRP4xVJbr|jt)KwKu}dE7dmz1RUMc^XJdSzI$t zCjGv^rZ5)8kCR5D8ez(doMK2nGdbSAuNshRFJ9o(bx5d~1|_zhH$R25unK8RP{%?s zYj)&CrVt=#I?WsfA(q-8T5v(CP;IAIbF;{fCCWD@T>9-01o8{J21cbnDKDj1hCnw_^dBFE@h1-9)i#0oO^SCd`8ap7}~Weot-3^Sqg^q(xM* zpQ3@joq=%V=!n*0yX%b+8%l*VDt4CZ1@_@KJ)gU25Tl{dEC#&MRlzW)1BNTXz8Q5vVW}%pO6(H# za5tnJv2lTXFp~Pya~`}D2=Y5Ld?NV5@|B3h!1Eq`w`W`%G;CL75AURNxZkhAq<&BF za#M;ev=^RUzJ+>HXHc)88S7hM7g@M+YYx?!BCQv~%z|%cE_iOzxyQ5M@+O>RqcPMQ zv?AZQ&?{+F5=xX1b*{+_%-_=$CdUAVM5Gc_?;vOnx!FVIff=kjz^H*bU|eC9{H z{F05d(*O+>TFmFcQm`EI@xtjCQoS=EYeT)!dR}<)%q$k(=em;;`ezSYmEv(P^(5m1 zLyf7NmzRKYS2#iV)oiw_CYE(j3CTW<$Yb@s&q@Gjwu~6eMKx+*0ukR0Qa3YWQ)IGy zFTUl)p7iPr81w{m&s%X_DN4cBs(5V#3nIZR&7asH1RTDapV>a|w4N-uR5Kja*ZhW^ zRJgAXNTd|6EM$WNcMGo#Q)XfE1W1}1J0RGGkD97PdC35(4gEvn-OgCsYkkOwuVFW7 z$bd0+$mS3`Rs0SwVv*t_yOb7q4{PUGHxc2Ps!P_P&i9xSr3S5CF$ zxzzm?vp&)_KKVf@JLzYjlfM?vWw*a3k1vl{SOu}gS+HhCu^n!U4i2(C8$%o=>AFSq z#-^Ub*9I#W|J8puj%}I&#WzM{mA+voE*YX7)~YB7cE?ag?JoxZMIGuwlg4dAw^NP| z=x9qIFos1Rgb0V)VybJUZVf5OK|<%K43o|0x1AM)jX1oO9=P^9FW>xwI=65LaYdz= zvLz&*y4ic%D`}O=O=#gYr1S82jd=>N0;r~64X4mm5qF=xT84r; z(qSMPW@{+f`vl<2;( zp&7KjqMT)zKC;Fyn72YLn>vEeg4`S169n(o($W>j9@k+*~EjgZP(M+h4B!93#1pAdi(XDcsYTCbQ$$M||lbUh$TC zrBfWpmSMjg`HRx~FXYVMcgL@dBQ~UoU*7SiJ(eICQoD$scAWikk14eOvYz+2jJE$5 zM3}wPp+dg>%k@^?fAYhJ|Kb<>zb@JNrq9RH<^C5ox5L0)NbZrg-=PNndXzlFm-9O$ z9%=tyOxu}?fq8{Fi5;(?{{L;{-*KCV9C>%jllI>jgQxz#t>*bB_72>a%NpJHzhOp` zea{BI{)NBoFpyOrl2k~+f1v~an`g8{*MGtqKmE({@P7k$9AU8P4(^b?^Xy-i&jwQ^ z{uf_xp;n~>m~?u(oBde^f;B7rZ*}fJGTr~b#W}ry-pk+nUP6oUxhu_=|E*BRQEpEy z@F<=AF8;`Y)ZhZVkJ4nn5ix>QB4`w`>N1KY&liR?D0WEm&RbXVSqk9~22RTe4nr`v4Z^At;lC-nPdtRdThO_1+0Uofj*j&%~ zB@76To%(~ar~j*SuKF?VV}kg)`iGY@g=ts9pBR1j8rGK8mr*IG71Wo^-3q;5m2Vrb zSl|ZZk6g_QU2Y+0HA=y?@KdT7xhy5{;ES#t-{E9 zJiiFizCANBx1d^i!S}TGhSRDqU}-3e^VTZ@uJiIqi`QZA9bUr}%2Nz9r;9Z6X{mU}O8=ODnR_X&CuMcW?y0D@P zSM)LChfR&MlivE!kdD^x&;XG%qoHR^7^>dzUf!Eq=a$*ra?djjCN*H0aoBxX?&Bt? zrl^uyA*P(A?Gigc?8V?Ra@O?psz-$efH+AZD872YUBdERFp5N0Ww^-9<_D zIP**>aIcxU_@J;^Tb>{RIAWhR1w8adKf!m{h1T+m^BK7**d15KHk+Ivq1gJqZybZ} zz7HPVG+L zy$Hucv-htRLKD`z9f%5VqFNQa_5@rc>bxj+aHzm(+xL=&C zrdP_MJ+_glaTzH^Y#oQoly<5X@!}It>>*&XG_whUP>CVCOqUo&{vB*~%2I{KI zJ*`UkhAqCXBt_w)tF@CX1PCCpyp-ZY*h!Ax5^HJ|dyqi-mCd37&?E4$WYd%&leX7)RFBBu*VKHu@1rdzAF;HwR(d1AuvK*E z1|!k~uc4s&LCFF=yh=$ePOA`iqI9y!m@bxi@a=+b$ySEh z9~4`wJ%g5$-mJq}W+M^tKOu+WiIhuOkQ#hy>4^HOxP#T$#g(Z&o5wzY%<0GThtxq` z??2wz%;HM|6yV`v!^JS5pW!&eNS)t&cJQc%Vk*8Rv+Oj=K4cZ)j-%qlx@W}Vlh;v} zml*G?A*8S4PuS0xrDA0s!hNAff18R3ioJacekOi5`q5m9qhAM8 zzc-1b>)Tj(p>>3xw#kfs9AKbusI(?-;j8IJAleF}A#4sAl3yWSf>jsXQO*AX8pCA` z6*R{kNe*kgo>|^pSGUCueg}*I|C%ztqmUs5dK)pNQ zGaMv4^(kh!7aE~=kn1cmXBXK^7NKT9?$@z@YzlSF%c?LL@Qgfo%;adlZ$;ZeWh29F z95s&q*d!X%SEzG)_dVXxj;~@eKyZUxqmSFliatPQMxIC!#mCc$pzXK@#Y#t{(M;M77WjP6uTzYvEkKc8MSP* zUcL5#j0}ANpIJbbr%|ShnrZlwh;%ji?1x({Bm5keEZ3hf^=Wb!6PPT5lwGwi&|QD8 z65U0Q9xCXA#ZQV?iHG`DiJvewH^m1=WBxVpbF0^nR4cq1_|08JwU%~`CGWdnnW``B zWr%kwv5s`4P5UG9{Ee86-M#=UGXQ)h66r(XKQ+ncT$O2J$A}eT8;VC5xV{Ifvu;$` z{y`mulz14Br3l*?$D%*w^JC2`55lan#NMyz760bTJ7r*AJC9q3*Ym;y17q}Y| z@PHTAEsgly3CXON%U>9RI>(lY4BW1KHKi5{t&za; z<+sbB4YCrGn*HSrQL`uW5FFpBYk%lZSZIwkw>TId{N=vl2v^VNXA69TZ8#Z18Au6` z0^H^@@<76Cau9>MQ@FSufT8WH_Orli_;Y%e15>Nb5E!D!3Y}^Yz)J$L(jw>78wfjp zw%^V9?20?>36KqpwY<_cFyS}tLhSJ^l%xC^B_4l8GZ0U&s8wtPUakD0)CX(v-*yx6 zSbv-8OZxK|SZZXiIlC$~%)zkrlyK!(z=H~si=l;#VY&#?;L-5jGw9gT4LA7SR);TV zJW_kx!>7{Q*fjeZP-JJ**>$No((w?S6Gmt-!O8W4<)TwRxLaB3_s%^Z%yFFj9VB0$ zOoggWB{|gmnw``1S<~xn&R%WACA(j{C=xy?ZTx=e*rHd`w2J}3^6V%r+r>Szoki`C zclu#er_>;;-#wR|rj)abI(^4{$Z!2^$``kRYYonYHofV=BjKnyROLbAV!MTyY_YtJ zUv0W1qC8JT#2i3=849dzRH>Z&%m#kxY?t6@zz+K>3XheaRW}-dq@yx5j zQwzb}xFYS| zk@#u2rpQ}S%ryAw#VrQ2EmJIWK%pu-40ALBEyfWK4}2XjbhAC=2|nn8xZ;mgI2iW! zUfU-uJbG4qdiq!^Ub$fLbYssSmj18kK5k#Vsl_>{n%kP_2pc#4l(JY0qY>pJbunQE zFgkzOy+~j|KjZbRW~pSYA(1opTt$BH&*2(-GdeD~K>P-+w@z`|C#q%`@f|W4o)rC+ z4Fwt&*9Q_gAR=GC&`iA7!w>F0=;;!Gj81F^k`XL_NNC;BY~Cs#F-5hvBKU)J@ylD@blUcb|Sa;bFj8}aIfCxL+}0S2p4IN+S3 zyhvC!uhg!7wr4a-(!|U|ezYb>y;y%gF4~)$6F6I4XLZ3` zxrNh+i-tycoml@p4|Hf6CL1&va(i6*p*cAZQIw1uT-Y|BAs60)c8qc2kfsp3olzLy zchb}#@A*Q^=*98}HFi5QRIYD3395`jf5b-#4Ox~Y8Ykg8 zvUpOs2bSFo1xt;6t;9q>o$ zL)2`Cde-`IL{yNr=fFYLbk^0Y900OLX3YlSkkeXxUcaORE+JiiaMTkO@SXk`JWjH5 z&SVg6EXkY8l3bt4vF@=q{wXo=z5Qg$PIe#IuQ1@+|0^e>i zisFLZmmMS1*HP0Rb-fW!JMBv9jUg#GbZMeqYI=BBP?Je-1&e4OvwR2Q6 zt}YhS{%?iH#%B43mW(v-auf0ZA$a@Lq0#aELB?;K$)jeIRaXtkl{CBH5!cC0DgC#c zG~o?B+tJ$(O?OoNI)6t<-Ea)9UJkMorR~TQ=Us+g*U&?=*}w2U zAX9qsql`!PY6A8`>Dw3i3OvA#`tuMKt)^jrO^q;n>Q6Dlx}_hUgR`ZTE~Mb^cE|8G ze!G1yF0xyuFbVFT^g=3(GY>aPPIHD(KPK;*vOD%X)S+do6>*0XoL+rvUOLnFQNPGa zDtWNWAo&F5UotjlliD@ zRnh$A%6UPyD49L_4NV4)Q^xtObAtx^0KGpK^UTUZeyhB~D<1b%4ptT!BL=(u3{(%! zYki(!{&+vPYB0^919UEU+nrh|n}NRQqJ!B`f9(5jFTmH{?+X!bpWm5$<-^h_;T}%n zOT;k(X3y+w*tuCo;sjP;tj5*5-@<<#8Bu@YN!7WM#4A^sLxtaNy&P3X*xfL5d1UUR zHmj-G_~tZ_bfVqJ!z$CF#c3fnC(xy3Ki2FB7WZy{3EkXa?Z^BtDHr!$){?r9Yq?NTHOo3H>g*{-k7zlb;Ngq`VfyJv?#WM zypKRo!i{V)tF`>HaSrQjEV=K@Vr1d$75hEPnh@ag<=w8IH#eVgXOiahr&F#Q(67FX zMU1PT4!Ab+qn)asOv%2gGZPczppJ<-X`sX9byPPpQnxDw&4}EF&@fl!+9&<}cfS4T z?12X17Zp>texFpW39gkU)_2R2eUF%;sx51C6;qegO$sH6jma%*(X~mJk5k?@9%Ek9 z8h6+%drLKZSN42xqs8|g)-iii^LxbW}y-=LKTKMGQ6B`K}CEJ-dzjelJD-=~-jIu1^<{q`?s2;#n zUi{WxOs|f$9t>SKRSiY)AdQ1EH$_|BKWA90Qt98ej9;UqJ5w6B#rD$P-goCQYM=+( z#d{Uvf+=mYr(bEJ?Q*Ft{r3G&3mr|u6dXg#*PF^@Fc`JdFKm0Vdgv>H>SNaCK+&+o z?dd0}%Guvzu!d~99?^`O<^x%uPI#ZYF3!tZAK`)cmvu-u$OCZM7h^6i6u1-hAG#>V zOHOEg3hmH~Qztr;F-mPcelvKpb;zsWhi@;69qqggD28Cm)wf8?=0EeT|5H=^_hLBo z;y-aze`6d~IOHMPTn)1|o}Tq@ci><~m4Ju&6Z(R5W=1{WkOQYo#Io_(Y}fNW4XRnT z!g0(2DMQbdu)9-sqrVRr=CEiJDW7s|`&*P{1G)rxNmxU#Lt(0R+O>wt;ytyqhY&|S z{?&!7vj-qr1dfHG`sdNM0}X>#B1d=5>xa20u~=h7}4Qi7`Y(i8!vXuQG9e81}T6hF}({`9x*a(gX$V6Bh% zoykWx*FE$7wa?cNj~nWDyar{yu%})!?lZ)*%Rb%=u{Gl|ZJH&u$WV*BZJE;jm7y!A zHryVq&F&AmyEgaO%ix;NRGlZzhY3Cjvj zQEdw5*k0%$ssfo{K&a-RTE(Ac;)Yh0QHbk%)%+3H+mclOapC1ntb-St^kjkt_HL4Xa1m3D|7cFk5hPt_Gv1LD#*zkwE6U@?(#5J$_ zfd%6G)iauowsIMy3xi|o0bcUAN~?lJKB&!Aw*Iz!D$aM?D0ZrfvktUwti|lYv577v2I^-!P~o?VE(-e0q-a3EUEZmyELL`PvJl4nRHp zO8Lo(J6(0~E5b;#@9jL^16A(YXt-MvWqYcV7}hzwe@Tk=h3jeRnG>%buoKyd-VaNk zlKn}uKWI5V zDgf`uqIa+wF=AoO4fMNfGaq2=OcvkJ&8tTod90c~$P>T@?NBodeb`39D`vbFeC^yJ z2F3?Kc0)yyxc*^`-C8V0QpSLtff#ZA4U**mq9O zD^o5~Uh;Vri`Y(nD7SZYD9?iq-9ez^{_*hVcb{8i>;hISlF^fe9q+1>4VmEyvx)fQbU7Q3y;K2jBdgzii`ZK7Roz|aCc%H_H6 zZQCm;9*7Tv{G5dA9VLhzoVN@;xSbqgo%$2tpsc=4cXD{A50YkuXU9QbVcMkwxQ!4a z_szDPc2PzL=s!*2|1KSDT9g0DZvOkSo1wG3AIo=BV!^v2{&R07AR30o^q0TV%-Fre znS^31=gtArs9A$=Ae}vDjr*-$wY-4xfSCVt+hNW565jb@lT{?*g{kwZ?u&jOi1XA$ zx$g1e!ZTWpA(xYh2UKoPzQgwh_ES}bVaSUO51y?7xtt23w!y=ba39B?GH*I+uYt8g zF_%eSa<58Fj&@UKx9oRY?<5iMe1sVVSFWdTt3Wg3SZ2=H?~1Rt3)_jeO02`Zjt!v3 zc=Ar?41ci)PFlMUn+_Ry-g8=amdL2e=0yK$t=~c(d(sXYZBNJwPuc0>G=D&Di{Jvx zu)C(cT;>s~ZB}X4>@6()I6zq#)itlL2#R;VrV+vdS(>WmErZ-cARR%C!|Uvj$oB4e*Pbd|G0jM*g8+W5lYNONL4EUad|qe%U7 zW;AfSUAoMQZzi|#uxl;C<&%1vUR}ENq=@CGA;3OTCN9fNAImmP4Xa`_94G+fmX$u6 zkS-j_g1?S!s_rA~|Dbf0rET<_q<=Zb3leN&Q0NOF!G2zTR-ZBV8JQNaWc@bY>GzL} z8^l)FZVxHPhdyc>akueE2+uqzCP4zO?;(KD)N8I}gfzY|cp9*`;sQ zLRs-jeqm}?hQt6tta}hwOMtOG8|Ews8aZFBW3qi$F1$?s5bF-TKr3>J%&DlR=@nLF)jpf!GCPK3K zSjndF?7Y%+d%Q)0yax|E<&kpQ3bSmCS}FR`{Fn-bmgRpGA8a`kCiHYCEi^tTO3dMe znh=5Qw}3I=I&Z zxzYL|uD#5L>kUv9>@V((YjT}?y|)GXg9R~?UgkFUgwEI2>n8ogcY~H{ivr4no}MV_l(+dp3_}R0FS6R^znw^MZ_ih zz*zjD-dqiX<4zmDWS2~H3l?y!1&4i3qG)zLkYV-umK-WfaNMz;Y@e27Hfp6J=L8u{ zA4-teJ!fnsG=1+|nUDSo1X?45z2#B%vsQ15WEI5Xq@OHh*d4!UVr7u(P#kct|4`fp z+YIhSQ#s(}&oxTil3E$5=`@adN?mVy{xtBCsY5qkyn-E-Himb(DXKbfWwL6fe{*db zrFP@G6~D-S*3QfHw1V)2V=y2S7^kztO#<(`8)j5@86?sgaWUJ*){J7S7ciG` zn8)}uemFKa2PdsUT*Lwc>8SRx4fHhX8w2d#&^Tmc5z5apd`!Cje06^jLsrmUkmqY) zT*aR>%+!a$-8S4D3>oG%=e6UngIQQ=UuC-cvj#p$QE~1_70NeIAyf+hM(fuIr#jR} z?K;zb#xaZ$1U_ImuXLeejlHYasOeortSb<>t+1aw6rSkWfNg55U6_5bRc}o_qm3XQ zUW`Hphc=L2pW8e0nZT3#SZ^KEG-Qg;Xo{C%2WnQk;14K*y$4iDEXH9Vy;@-|tS8a> zYwa+>%{5fn9a8Wt)(M8NoSjZ23LfmL48c{&Nyh2#J8h9)?L13Tm637AZp8PD!SHtC@*2k6{i-0W&Mneq@(|48JV zd~I3PG1A1xdyGJUe4Ee)#qe}ma}@I4K;^9U;75XZiIOo=pVQzwa(gNwB=%(3YX`<8 zDktq}u2*7Hwn+GRXvLXepIhw#ne7|071Zarf%m69LK}w4AgkJ|88MuxT;$8;z4_(5 zdJr}xv(&@>QI#67dC9a7!KTu}Mm?`PciMEDpC}}|4UUM^K$vDBTex*sh2)JildjB+ zK;nJ`M2t!+vmSlJ9M0H6d5#V~0BhcU1_0kqQHjB&eU{Vut}}O~M5IAK$*PsvE+x4K zuwk^^eKJ+RDIm9^MXmxrM%cHXe`}*N6FFdz79Y!WU%fa%n|O-=W1vK_ZfKR ztb3wf=_kwAa&#Q|=y0e&)I?GEF48ot2X&N)B)a=HVt3@gaJ(6GdODBck!;spXpM6gFrUXpM$ z)9QM&>?^avLx1cF4)lgu487e5G!z}zaxAs95UVk6Xj<0$+3ZU-sF9hF@}4?|Yh#el zy8qJScr5$zYA(Kt{KFJ~C@ z&}LQX?DK9hH}xwpzN8XU1=ttct^w2PozN>K{JiV0HEHb#I_U;HXXf8TMh2aEWzrRM z0ReTKY5m;c|0!z6lL}iu5TOI~r|jfQ=3fkAzk8K7`icOb2HleCGpm;m!SxRD{}t)$ ztzfeR*V|PrxoD4^IM&l%?EEjM`ay-X(2~&L-2Mv+xmYiHa-20n+)AH!axl`g@V*<# z@VJSv+jRMX!>IVLyf-47dV0O53#Yyvc7X;^>X^Uysbhdk8;@rihUPaXQfCUPm2Q}& zyZ!*fP|r)v^Mf2ZD^UOz--bw-$jYcV8zh2qyef>mK2ml*ssh!JGC3Ks7`nZ9ovM1I z130Ars3ZI5hC$&z316^~)YW+Dh_J<-9{eMr|2!LM@yV%3fNkkNHAkoICeUwEQhkH( z;_M{y#iD^R-IO7|S%+p#XM675fudODuyfIZ)Bt@2>Wz?3k{C3w^gH`J#=s-URpLOz94(POtvXdh?%Rv!}T=?L!A2I=u6e zX{&No^N>r0Z@r8OjMbdppeG-!X4Sz_EYLPcobvRt6Ds*dV((8ux%LpFpZpn8eKjDO zukNPPkOw8-SxoFTZ~VY}_p`czmT?P;7+-y(Pvmghp&L<1mF1r&b4@V{_{ln%7E6Dp zrfw4=;`?}Xd+~sud|$JQ-GzBWiMGuG4Lrvk5a(54pApJhwY!K-NpX%FD#apFJ<2q=;r9-c60~(=Om2~4Y@T|B{zFd364`Wj+fRXv=*vB13 zKQQgK%5^OceM$Hy>mseD?^2)Ev8d4Rf%p@+_`*wu`#|fK@$0ppNw2zIxfWfXX!bHo zK>eWj1Sr*Gzsgtj6~^>lyxnLJ`zI&P?>09*)xs40GDh^E$eFk4aa3n9f-(CbBc+cZXR_r+Z(tn(& z|HlIUPYm_nT$CVoiW0`F{}g~57xCv7yebms`rOZAhcz+Z_o);kxetOLj=gamdmpc< zRUEb|%D;>1(G3_Ucg2bXzy#%!6~RF+E@^j4l!ky51ctV)-Z~N!Lbm3KiHSij0g<7L zxHfrgF=?oohcvPdv{^L1Sv^63yU?9!Y#O ze02S0((U{{-mT?tO@33493I~C@n0dU&jywF(s#<`x!0d@flPT0T` zRyB{SU5GZ~6nod?-w0_dTXZWajE}H?WgU6T!nSqSxrj=a$8nSZ)nP9y9kb@o9~yRz zJ{&bX$(F)3)}@E21|wF+$l;MAPVleHO&OPZxLC^ObZ_>kvsH*GB8ABdenWoy=4BAQXE#&C#YVTxy3Q}%B@ACP(( z<4wUqCxGM=4$Vz|=dY^{_LyoV^fp1}-nk(n8 zf3tmSSSJ3m9MioVy<0D%bYrVIErRB)R~TfTf+6`@xaxslvH~Jgkb%V+-cfgk#_I-x z0^ZL(-k`o`yXOCzI5_ApXQsE0b1f;b5MFsmg1V~Rtjm5-;!EJm*2(*hhZUJG)L*@x zfyHcPtf=V!+Y8`hYutP1jSf(p>tpYA`FaBr&#aa>N7k^DP$O`*-p7CErLxxZ^Ix2y z)+8{E)40q)+?~SsV$C80y!DBb9-xP|w@m`Ku>Bb!+99+)Jb^1o`y>?&oYyKY9FokP z+GlzD_Mt#NW7z!&=p!JUrd|q{MXhX(nySOTkaf_%bARvGL^Yr_lO@+hL(Oip;=ylzjsBa<^Hvf^elPf_ZvscW+TZb8$a9QLur#2Q{bmksoA}1BpW!g=k621T=$HN<_TD?H>9p(j9(5c? zu?#9ONOM31siQ~}0v3vbfKr7BsFVO9WaxyD;MhQ_bOj;OQJRz_v=AFb5JC?mkSHxc z2oVAaNl18ub3f;K<~;9v&U(&!?(@&N*CK0?m0#Ai^SiF(+IwGne?N80ofJz7{>H;r zxy^;Hsg6u)8JJWEkb_5P%MC8d1O z0{KKcGlLE3lHvAtMR+WsB<|e7csgYY@uFR4 zC!V%C;oq{Ne8;_U)NCbc2l&MKKJ!tll>?JKBb~ki7oXqx@;248Ah9pkiS%Q@9*?%3 z0JW0+@_hfAwl%w_(OmtLAjP~ZG4+`8lM4t`NNmR1REMrT&N9Dv6xzwTg<8-?c$kQ= zZlflr6bp$0xCVFfogP0zB*tU0)*J&}Q<#UcYh`fqL9>o8j&NTl2dSXC#ujWGMOW}<+b_>XYmin+Qk4ff- zwpGnFd%RZ5z#dh;e8r$#r{(GF$9J#dkK84D%C^yNF1ZKFw7Z*jVdJ?A#ElnkIX5=l z!~sF4fIGy|H+@Bw()`B2mHa~Hl2P&$daeS&`HhR^f09snd?oK?xi_ps;)nQt*-5Vh z%+3wKtHfXH@>i*LpMIT&tsA&l_`1c;bL2NY<{U=pB4R=*huX=;TaWUq<@_*bpkl!> z8JrUDhOw7Lja2LIVl7XB7nw^lVE;%mFQMp|$0WUYG8L6xP=g!5IyI)T9)e*Rwyn-r zs8Qk(8vNvIuFaGd1?PU?ucx@Uv&NYKv8o7;1JXIdByx^WSJkeBd!;BB}(Yt#a00ZQ@9g1&0~}G-y{3E|NUrZ*|k2Zt~CXGy9s~ zA>Hn5i$MYn58M2QGn9Y(_tL-Qf&TZ(1Br_Q%<0qr!F~B(`#0vwe_>*HTjOxJ4>0S5 zRhJT{Nr8!by_m94=qHo&Jn(J654*LG7N5CncI?29CrrK8Y9E{Yuygb0&*m3@l#zZ^ zJMixI589<=W%$?4iz6*eO1<_kib@{<(Pm4C`Vby$@)q4?vOdD=VQg$mY>UOrtLZxk zhS_$bacaoAbXZ>Yr)>b%b)ys!=tFI|E!xA1tbgGNC}UT~)N*fQ+dsHuEx7Vktzi+T zR3}iC!Hp?_e_CUtlt$BH6<5Q-wTI&$hU@TRYMH<2Ezw`ZfaV*W=mW(Eq_S*UTxu zjQiVfY>7M6{1|fUgo%jtacNt_-1EYizDUFT()JJ`s;S@6WS3UXSzbhl;Hlfq#&FiY zZF~OHIQ&(}15k!ihRFU$BPSu#zm&Xe6CqUZ55`AtQ?OE553aPaXHOXaeE;}==`T*< zS7#BKRs@ObEYExL7bH$Mo_0gj_U(Ln8%G9S>g^Ybuq(Gja`GJen;vj+5hc!Q<`%-- zjpiLJ!hWeAB@~HxWc$!sRN|oS!Ru4fvpf4j9_fyx&XvV*rmhMy%dF-#dr8)JW`i_j$ zr)?zJ_RP)y`it&C5e9X8L4AHb8lTJLY$^Pk3Piza`Op8dH* zWdEJ8t7LuC)8#eWeA))ZZ9Z+x%;xdJ8ic{4eHVZE@xS!9^5Cm#%-ACl1m{<@w)kHV z9P{nP0-07d6EXY3l5nE#dr=p@+PwA}avvS6wN1f!@nu2BACAk!^ zXZfzAjvbbwh5Pbo1hixQA9%R$ZTJP-{F|Wq?R((RW*TX3u)XFldWWaJ5Xt+CK5x)7 z{=&~C;E8Q&pXge>IR^`s_8F^(1|!?^7B8)5R{fn1H%t`q@f>nzrDuN;nL9#s-=_F3 zskX5dx6y6evpv=EL({_=+`pSP`1+`A(b4TUj+;gI>jX?Iaz)&}?eD3W+^+W>B3Q7* z_7KnQpO|hF;w0kBZtPq9-tM2bo09ANRAkT4e?JZ>8!99EoCTpG`ztm5WMWlzuWv() zGn{6=OZ>l3_{c`@<~qFoYcfo)tCP1(UH3iPUG|`ak++G7i`z66R*N3VadEBP1gyM^ zlZ%<@iBAYH(0kIjhpi6X%0xy5=1t7upkL21J~0tRp4@8sl{75UZ)==~POX?>kQKUO znr=j@U8MvPnB+07g5|*xdHSk)BiVETU zPjvx=T=|4kW~Ro0&1!5{MnjMt4a~+Z-SR4F@qvfn^Z*M^YVGgAc}f>g>zqeb7((1C z7M*9qaudyDv9+I!JlM5Oz!1B%-p5gb=v@$PAT&J58?CYr?J-1qfpJgIuJ~!HA?S|~ z2x>;8ud#}YetKwil0qV20ye2Lm?4)LunssKFYlPIYqFWNIXYT1{tfXZlY|f7TGZ9j zNh+Q8+6)&lFvgXOXqnx2&oRT&z9>(E!x^=W?qXvo(PZ52$;O2BS_v@CNR}L}>N>yu z$4Ikd?)PRiwg`;9M)K{)8#rjmDy($x$P80JQF+g9>!|)bt=PRy}Nc`mi;U;}- zU$=t%0J{l%HngKPaUK~M`0y1cN`6-6=D{!qq4)f#4_-2l_%e@jb~U`?HAlHhA$cf= zyh2JvxyGuM2luz&Q-<_WmkdsiLY8?8Fn;RTArq+f6>P6N$RG=ud?G%$8H89Aw?eI} zDgTj6oF_1h4>7Y{qH}w}^)gIHi?t{iAfHHxQ|#Htcu#K}moEf`;C+n#*>7o4~-ERu1XZ=X>bg9}m3-Uck z-xABg_cx&P&}RTOtmxP4Z&&C8c_TMb;l09YX|9<4@v&lR%P6+UgR+8k5k5uMp!t=u8EVAW7z?7Bh#YqGda28K=2aBVP1$ApDSzTo3p zy4ZnUnM_VtwdFyG*K^J(2vsP@wZ&qn>A9P9ARd2qGZVwMsUdxRO+l<1pDr6^V_71s zP8YKa+QSTp7^E^eR8pxVu@EO!*Xwey6tcUM6l9}XN}S;EK>FFH@INMD=q$Ql6wpGN zw`Bb5!Vt-YbsEw4dwhBQSOD|2kHPQ8coP|p;AS4RC`?fy7R3Q9HJNf=*Y2ZvCuJq= z9m^(!L=|f{NWQ>&imlR4CFaY>YCVlXQLAn*KFg2kobUqlC@3(FAlM79#u~LrsLVYX z2O>6eFC{;mlrL!7q^^Qi38tnqwzFG7oA|&LPMbjVi`k{nv!yBeEt;XN z-q{j7KNN3>%c`AJZ`rRC?f&H4y{S(MJtjedzxyJMlGP%KnT^hy$u|s-+*p@pANm>c z-Fwijw%f+76UTB31R``z<9*}H%(6G4ZRD)z^s=jom)P9bv%S;0sEC}n(mV-&kG7f; zi0sRc+TA-WgE&67JY;VA+<+*3+h*5DZTo!3^uD_svsMp58AaP;IQU3?+7_9)o**6D zgi5~N+_4Q@-@ewaFnYN8w-`;Nf&m0es6=B{Awudmt zyyDf8wEg5Co=G9eG!BA`d8geiZYi?={bCv>DDE%!u+9M7*)(= z@qJO$W0#Xl8q|3K4Kvf$9hJYTG)JOvE(6OiG)H;Jx(?MunIRm zzFbkdG%wcan>thNLc5Cg#={h2h?B?gfTX%r{Nq_i`iWdcRQc1~t&DKebYW(B``~*0 z{8WJ>wt4d_CpWLEt}CIH?2A-WR1|HE2?~s97AfXOxiD znJ!4z`orI9%dusY#l_`}xJE^NI$BVV$sQhZT+nRgfO47|H=E}F zj8C5)d=01?Jp_~KwOR~M%AX9L?TJr0w1^n!A7v{-MGLtoI@JBL)VJQ%8>aDx+{5u3 ze*E!$5_pkWOXm^wH~ib$7`BW(4Ow*8v%aiHZxkeAU-%sx$CgZ+Xq1{poi$-ZTaWfu z-*`tP)iA8w=4+D}f=ebv)FY9HFi?m^!OrQndHAC_`5h9!Gdk&IB&LS>V)-AhuwOB| z03cr`CxmlTHZ}{)Ud4zv>{e$|ez6vVQi0K?2f~Q+6SK8n+)54)HA=esJxaDLr{2VnzWcAGTy}C^`G~ zyk_6p!)a62^DfWvR7fbDSYyjv%q<)R%UawU9qcJ0#9;(ZOp89ZNDsuRFI`I*MGgha)@wm=9)%d3o{RcA!YzOuyB{}#LI3a-p1U8MP zGyUohd@R}$fni%;exmZ`qbwc^Zl-tzn;_JjAwxYA`2aw>OZ8(mv&g{w`9-SF`ZMf! zXrQ}B57{YZR8wPq=}S``cjK8!5=HMQBuc)n84p=~4IX4y3Ch^YxF12f<((T7S2-52 z$LpCqWGJNan5vhN;J z%U+Z;NZEr9C)*bvNpX2dOoIezR_Mo75`dYr;Npcd9;5jy`4=uY88$!d(_%Nvi;Gq6b%zStu^uFH`7q!qa3^jvGCh14>0iwVUC-y*Rfcv_gz3d|GO4$0<2 zIC)x&f;?o(ia@s%r}SyHh_L|F(N5klljrr`Pm=OZ)-a!|q-e|};om=x>$32}r;XkX z>@gLzND~s`x)6)xoQ@#jIOo!HQ5Fq;@Ys@Y&3La_k<3{3F%^4rZY4o1t-1aJ*MUwX z-#Y7QE+o@CsdT?qXrq4kN;j_R%dJj$+2CE~;J(bD%J(1& zyWY+ZHsKq~+xdRN5~*p)ivkJ=U=mfQp!8mA|erTd4flfzQ~o5?&J8ii>ldgm>v2 zr!2-Ky{u}>deE4j%NVNga=~z#QQ^%l{o@y?omlj+;a!FlaGBU4lAP*?D)()f1pGZn zT%kX%*t{bpJd@=)+-K^5cr4g;Nv55p(%z6%adcaWO^5B{8zVWUTP-4?@=sUR;Nm{t zUp*OIZCq5%I%^;Tw@ZEx;6aZ_*-WsX%pR4M#Nc~&6F6xi@h=o=G*-${_&pZy=-p0B z+~6MmDm|+r8e@0nxLL4>+%8H%blh1kQ_83g+SX#*zE-q77Kj+(;-Xk^JC))yakT02 zHVgHySQ(N9%DB93t_NIt8{b{AK}y)hlzvaZ$n2UqEDE9jn`u`o?EWptmRh+;e3O(g zv#rLqy`zTi|5;|66286B``Da3{GEoXl5hT3d|e(c83}d2xNXmW8popz@+~p=;h@O= zH_gQm*~0HZrptBL)bI56VB|03M0O->;?Z9Tl8v(kM|!Joy@<+SbuvD6;x5dpq9(c; zvIAI;SeAbEL8;ezo@hOZ)kn9d*%NK0;9v)mD)?Ay`A$T0WK>B6)uQMLjB-gcA>tp2^>ZhXnucm7o*IsFb`7Lk_qOV#-|6t)+C!IQc z1Z*#+@?Hga@%^QejbYo|Ns3o$Ho|0KXImyOwhEGonRar~Lp_FB&*d&>C)KPy8fN5d zo|gf*sbH}d5Ny@Mjo0~b!{Po%6->8WkMz6DKIa7Q6dW zd)L|i5rvw^jPnU0I;-{hT1U$)%pBnPj6~mq8pLA}q2gbW`&H=`Ft_2cO7pe+yEE`k zh;GU}%y;(%pmEwnz?c@$YLx}Nx)%D!iEp-HJH{oa#jgiBA3Y?F?fR*H@KIJ0K_o$( zB9_RBCXeCnBPsGh*S_gKDku;&uS+FWYbiqg;PUSRuf3H4RPZ-un}q2m;*7Ekh*|vdWvYiHuDEr)n4l0G#Kt5mZe%Kw z<14N4JLNN@Y-Kv3LOIiZqmW6`tR%|yq61fN-k!L4E+>Do=;Vfn2S+IcGE1B8=UFT$2HXS8&Nn)EZCpg2R8*{JU1q+g%wcECqLsABf@N@Z1e#ea zSRARCw&oX5su|A@2c-lEFeV>@ngsz7AJ(}Q#f;>pNfUB7P-Xd;xHJRzJ3m_RtcVNjC0GSfn|h zr^qqv@u&gB?{()GoOXbPCkro=KK_O$d4*DU;Ak80B;znyBYYai(32{;qYt0 z(I~z2&u*-<&#&^ou2=^2If2?_0?E-yTH|xy4EDt<>+a)#RWtnY6xGnyYmcQeh&G+DkAE%~QArdBAj%N12Y0CQTy$Fk<&8<-6JCB1ZjuIbm3Oy= z)bug!*OxCE6FXW*8vOS9R+9~Ay%c=#Mje-s+nSymT@To5XR}T*_75VNFMYZzGN?sO zJr%8i1oC;Q+5rHRg+{b4dwzo;fl2ph2;nya&@X?_J-3~^HG8P#TS~2LktlQim!RnP z_ziNaBu)hMuCCR)%&&io3EGW#OtJk}qW`Z0h5vb?zp*X+8r^&2;eRdB|MUHy|NOtw zt?=^E`sLqh0siSO29ao7x*j|g@K>VwV~xb9GJg__a`C_a9Gi7QWA<}hfCeqDP}BmrZLqecsVF!mQoWg@ApH!32X3Bn`=jX+p3hpEO=XVgS!iEWNtDr^gaK zeu3W9@Ds_kYJQG#p_w`BAArnbm6w&KQ!+?~8=CFpD}F$XB}sO25a^Ip8$ttED6)sd$YDjJy+5F5=w4lK`37W9BVE zOWNtRSC}SfGY$TcqtqN@IO<_xsk@;o$PUm?88CEcriG&`jt$s%zs9=5Ym^ms^{~+N znuSR$ra0f3I-`{8UN$Ge{j+j(xUs`-X=?ou_MK6IH+&qAZoS&VAbg*A};;en6*iF=TMS>&) zdD?Xij27H#=#TnSF$X)+Scd(5BtGgrYs!2bPO1)g0SBt8oZ`QT+7XiI_2jNA!7Md# zQkil|5j`xyMm$MOlt@s6EEjkNDU{t1{?4{7BxO$-PHAHV@5y~>E z8iZznimnx4ZwG*!?2TDw6np+*nW1Ct<|VW-&_iEa@EANliZ&O4?X~J?(lcK9to}m^ zq_)AOzYeTtg<}p0@ryw|TgOxkZ;sSkP(}!Ps|S#kG^>=BSC}R9FO4RB?fo`yY}5T& zO-Ih}=DAmmbSR*XpvCjEEwTzd>+pu%c`u@JD9)tDB2E^=&-SFQh3z6&-^nGh{^iQA zraRihGrlHje{BPy1YagDlYbz2N?&hiawXui)C%?HqGsSY8_5CP`am2tV6e$5jgR5v z)WA|(aUrgD^|LxLB%h1Vn~0ieu>gCvnziEMq=nz7w9ot&%Q8yEWCVU}nI!2l%fOWK zZ1%S=yPS$$ckm7+3+w44Y!6tVd)S$y19EjHV)GGt)|{Na$Qq2`KB2091I+jtZVY%( zI^?<(Ey3Q@cW*J4X$b3M%J%18HVvDLtwPDselKdR>!lHzbz>O_ZqaA65AZ!QxYvSt z@sY;@K^xkd?>Cd~(}vXXq)THK4o;d31MtuEpgDX{7?6DZrw7pujYyuHg^3eBVe~Kt zIfgmqhh1Yu?+qFtTWj%a^VW+5*LJgU(&c-EGEAN0w$NJ4e!Q5$W(DNn(B>3mMBdQzK47$MBW?ZqGCNX(^# z=B`BuQBQR_%3dQ&0sJXynbcD=7MxQ2tU15x_Um7{eB63rRFz>$+t^~|QaRF&=)M%r zFh@@g?XxUeT??nU7m+H|UqhVs5A@wmh%B5!hUdk7IHQg;?_I=5fEnCNx<+a_Z2>1Q zn3+;0kS7!sO|nf=x0JSOM5j&8^etsYMdqvwOv^)*1;egxA3@n5)tSYK+!ihqx<>i5 zGyWh2tN6}O?SZ=DYTW>EMzhDM^_#@ey4KT-*~y=BZt>)5PR{m(xvsU8XCu-}v%}6t z_s;c?(!`Q^iqC#7|J5@MNuW!=ksDu`^}vZbggCmlAkZ6vhDyH9*v*RB(Rd6-w}sGS z6lLp79x;^W{?V&M0)}B+GloLq&PC`M_a*ml`b~bh2_!rHKHd7IJmo{Pj+%ecV|MNV z#OHSL9iJ{TA7qt88r*)lF_QoF*(eZ0fDIlADnwSWJq0o3Jpu|bMC-z1mjSSC{t)<> zWs3)hj@>tSc5qr<>q6GB*Tc}br9Bc8W@ZHz-&QS*6zKuB=&YxjWslZ`zseRlW!@nd&iz){n>QFv|N%UK`K*f}fv_XeqR2e}uh1gR2e@Cf(a zl*&0Zv)T`q*0jtn)L2MnTg=VdF%8-X&8*KjYZR&=ZJHsIm5Xxbyd)^%P+E(rYoc`$rby*$M)3pEg( z6%Kz~e+DeomCm`fX!L>g=6xnl#PKdueJ67(oz@N-9$de~&7z6X)_KX7Q7;*ZD#VNV zp}U*L^f~7F;wvWZ%5|4Bw#06>7^9AVj+P`1MFj#XQVw1H#X}^>(Bic$)mr27(&!wN z0u}35X}WQ&tLSiq8|p<`eVx0_o+{wH8-hX8ausO#Y35WX%n1H2TWb;7AzaN zE?o!;%6M=bZicK)S|A26J$bNN#)3QKU<@|!&pt(72$x;QANC5SBKJpG+~xB(3t~V8 zfL=vPa=%+LlE|GGTH7;eAM6-P&)Z_YMR@3fhG2J~R!Po$`QS>R*Q3lsR)$Tw^mjM% zC(GA)vaL%pj?M9LZX}v!--^KZw+ur5;Jm zxios;EkbXuEi)`Sl~WhkuF`%~*VN1sQEQu5$u=9TD|}#u!UfhNNn&?}4nif-{8}PC z+R~`hDD>1a`k8Cd3T~$A*ZJJ4t`be%(w;Pli_lAAFV2CP(ibeD8 zzha!OqlYm~RJSNY7fWspbhSj4_UN#UzSvF1O})-vV`;|6Yu)x2JBB4#KW>W);g^cN zB!Uu7pkK3VCbO^pm^kuc+{LJ)M70V51A3hAdF$Zi5z7XNGSBF4fqTFPdDf!~e{CyQ zw34wBn$b$k88b>COLFs)usv|s))iqv-0-FL5{8+C+~#?NlA&m^^ za#ULC&#HzsmTo?5703HY(XG;a0%}H3n%^SJGR0AowIjJL4wW@Ta04HuLCd>mvER3K)mM-+g)&b zuaxjPYEEaQYWebT-VCeb-VfNF7Fe%s6jAM z{wIlFh&c=~6D7m?pyr_at!SFd<(dc|cyl{2k79`U8Unr=PC;fFi^+O)5ZJjyId}2y zS+s26YpuQuJx5SS{JwMzaM-JFC_gX|M~{$H!1mf3JExr#Rs6@GS2tll^PBhczbdY+ zlW)!`78OqRO3tOWR~PoPavD~BX>mODFi&x1N&Vn+=UKA7{AySt;dsY<`holp@R1+A z?CY^5bc4b&&NGUmK#0Z|_h~oS9&_<$=Ju5HxNRJN{x#GQ{~mpX0Z?)40KICgW-r%$ zCWMrzLTGy>pF|wb_a!(z9lCSeeGywc=hp0wgYa0Y>@Td=x)d=N5~W2NjOG%2&C08i z-ofD zOeyqjkFWZIFiaidHMfMMAwPok z=7Dp`6&nDTB4UkOjR*6{xsJ|@p*CF?>YQ91BZO|AZqe3bHzWG_5&61b*cOk zt(x)pGXIM=t+oupqDVUPVLr7odApX7muhi4yft{j()OJhYFQw>M$B>i$ruY$Q{i=? z(5BYz)tPk&GF1<#&iCC=L&ex5olQ+GYqAlKRf*Ze!?7_ZP12#WTB4hW&)&Lrb*3!| zR^b#I{UxO7*xxICJ%0LEvC}`J*y)xB{KaU`wC3M@m%rco|JRp3;w}Gm9`Vm;JZNlV z*NFU^A2t78?Ds!Eo`~Dk*sT!$Rl(E1oN>)`1TiF%i=8@ec5?tZ&*PBYTJwXTttij!;=pPxe z&11JyPe3sQ1uRPMYF&UWR8cX_Yy8L<=~S9mrY)bg3Z{L|RU1S$);7ozEiZ zW#@x$5SGcT8a*LWQEQb9B%>gLv`W6KYC9)wwyLlS)IV`dk*VGH%kp~u|lVN3Euo8Y}f zT1t4zqtQIJMCK}a&C#zXA^N6=-ZC{4w3^wPy}Ie{S7FU&@SK5L-q~B$Uf78g@>94_ zr6xBeMu~|%Q*my*^)-3~H?$PP2ym-8cR6=}-s=YZ;NSKHuGz9BJFaug9_51L0N_@& zhKlp0raguJXbF&B<6TtUtOvd^BrHL742F%XzR4z zii$YOU%cWacUnwc3OXNQy6{i8FPPX%anKcqxj8)r1Kg+4P!N+hG9nE zx8M=jZ&?M9`lfpv8Q&DY=bD9#OSBV`nRUG&c(wZ4;-)q;7MJZ`MPa$NrFGw{`=kRm z9IAJ<_KS)X@vC`G=b*d#SkaO?@5c-mxUSU;AsHujl6cn!T^YO!LR}vR>Px{scQbBc zczyQ$-jM*I=)jw5+hs8yat{Dnlvvj#5p?4VkZp5Ht(z7~$JU*D|6=>X_%iJ%T*S6 zif9^S5mQeaptNvXO=-my3q*3`B-+;z7f`tga<3e~&^}P+u1^eO26??~`=8Qk>o;`9 zS-y7i(u?czM(li{TBj>+G~@5K|wAny_qbv(M4RF2cc0_CC9|nzDoI!N+|3@61rK?yk9S() zIcmn#V`NWJV?*njK|DqwH-%$hNq8Qr(YqKHux5}~E~x;mG}?UKy4qO>+tsiK^w1x!>X4_9DZUQA>e z{`Mov>bOhtnte=RE>69Ux(mO2E|AP~x5i)kR1sxppP5r#B z?xnH3B4(v)E9YB;pD)p$sr0fY6S=;NqL&!F(Osc38D(=Lx#SMaG^nIO4?#41Po@xh zK6M~sq{i}H@YKkai8&kP^U#&?1AW>7!qJesVfGp#KJtPESSFC(;N%1^Z1npxuq9M% z&dh|fa(Hqs@$Bs#fDV=)z$IaQ?W55zrO}K<{&5L&BP<8{X1XUvtT7|D{p3++6fG7|Xs2z(I z0o+tgEl(8KwCy&cdQbWaOE(=%P2Gn&vv$ppOiss?uTNUt07J7P#Q)~Y{HrwZ|6gff zmD;i7f2#%f|11+E67z9-VS!g|>Ys-9^tNOQeFYcS54cznX$Mm5U32xfOtQ>G zL@)A<(c<}3bqm9O_=Aa061^brjEOO%Bj6CA<~$zj#9U|eL;~IW&B8ryotJLwEZe27 zmZzLFTgFx3f2Q=AhX8NlX#&N?=l84~4SP=6813w4b<_<+kIg?)OyvY6#m}LCfN2|M zV=dff=B0MiE<6cmYyZPizDwsmLpg>ETDyx!jKhnS!$_4kuKFONf<;iQ(+K8NR=B8xN=J-?Ub>?XqGx6*&8BF zEic3jdq<8&<>WW$)o$Lw>!&!T@YZe5gjqpea29QiS@kTKe9kS#lZt5IpR(7ly@l0q zs%P7N;({OM6oJPhV)TU{|k9lAba`qRG6s2=m*iCywC=E7!T7CS|< zV%{J+pgv#TOfN$rG6ADue5f+iJu@(^e!$qI{mo_>KvI3xkKeS!LUUvj)PZ;%1a_e5 zNdO1SF#6Loc-MLFnPuhp!6Gc38t_dt6Kr|F$%AM|DhdSkRI2Y=L3pu!|zvo ztdQ9(k09d`RI-vO&U!lCv@Jnm9JGZPomfkgqWX9Sqfm*8mr&EU#ZWMx4CQgo4r^*} zhakUBw(wRtvc9YpIVT*_$72sm!%qPuxd*L4nWr3MMg!?oY9=jR{%)1+|MP;L9UFc8fiwT6hk~J1tJk$zOTWRBj*V6?}&eL||--vfTU`@bT|e^Mkl4zK_E z-_9=nUf}sZiub2#9{j8R;-AsPKqLw)sJU9ogbRPwyZmUL<>=JJM5(2TbgW7lA(A@; zgKYJdquLeXyytmJO`{Ddz!5@2ib`Vzk_sglU(IsXLn$PrhrI}Q^ve5>sY4WGt*5|~jkLEOAnH!9RKJ1=MS zE(D0d_y`nxD2uSn4Aa5hZ?0^oW%CBa{Y~lj_1W^iDLQ#~Op1XaoT1?I(@JC(n>zH1 zC^vxU6lynx-7HRSj#*~-1kyvk(BfjwRivasJ{sBFmU&k5s!U(VPGkU9e>c`Op5BvR z#HiX!evlG7zEX^eN`}xqIPv|jZF)nm+7+W%L|FC?|7l6@YXVgAVURhnOB0h zk?d6H1)TQNtqHtwcdg{ud79XGdx+qv8zJngr(eQdCC#TE!~BEX@iT82y}uKnb*@96 zs>oPR1gA-jZI4(w^6fyo)-c%U@X8m@eXB0d@CI{iZOkKaiGb(YCPv-#lodUhlFr0n zY118CGg%r4xzB3vz_ZzXDnGe4B|%;$-n>QMIY)=(%|23ki8En=MnRg@s97Fsv%iRS zu5?X*aa@@~@LFK;YoSP4t<*qT({<{!2$a2}N*k*8UOS%|r1@YDfi(UxG-3_*mSaQc z-bK~=LP%+N%%1;@1z@BnbxC}dq4Bxy{LQHI^#LC#_AfDn$%-7*lIxqY)#%JJi|Lce z>V%K215IS|H0#Xa$;-gSxb)6CbNJn2!kip#6Xo%#sAaXuILIWoB$0Tc+JiuwZ#AHm z-gqlH%RKM1GSR1NG7BJZLRu9KdV}|QsTH;5<7xF7AcEL<^s3XhYfH$`vXSM3fJ1v% zIgt^cLs#^FGVTM+$+Mo{sIo}-H6?V=z6VaWUdpRf0H1!z*(<#!yJFI#*%L2GB;ako zWhihxm*}WWGFzJ_h*%FiWs_}=C~I5Ro90<7MiB~Vm)H*?qxbXWJ@Y+Ip>0~R9~+Vy z;mb?kUUZ_%UOWffMFx=7g}j^hApTj8z5pE#)o=$_18g30{WP>~OAIOpcH(MYX{6kJ zA6L;?H!8n#_ID?x>Ca|lZyR2^J5f{(~f;bsFWk0rHhE9}y4^n~sk=DABvPH84M3hCMhlPN>WQ2ie0Cp&fiI(;H-pS-ZCIIW^^i zL)4-B0bFicd=>O8JgU_PKrM{E;1Oq^0;`v6qIQvS8&oSu4|4{Bgm&EZNIP$(f|Mbr zECGU>!-_pmKgrP6&;p4LuS_^~$yy&PfYbY>R-s;vaH;Nr2`UTTqf+EFPyjlrH%pY#m} zF7RaOW7E$Yl?MAV5)6JT4D0K2)Zb^E4N6%)z!SzD5p~rC?Ob6l^hSKCAHTf7H^BX| zfAuYVO4KB`<*VR}n!n|a+6pE7|K$~_Ho4Y$e2@Zz{p_dOjgoYpW`ajI$E{0u)Nc;P(TKw&xr-O0g4Ek$l6 z>qndC_|~vP7xyD;rZxp=n%VkS>AN9*Fyp4z;wmuXmtRfr36HraL%~6kp*J6-9t`ChiAbPi%7m5E`hNpO{kvFjwqn!-1mY!wfUd! z3zTLU+br7KZq3dSk?Cgc7-&rgQdL=4y@S>7G^<187(K9NpXZ;>%}iWuAS> zP?S!SRw)`q==(FDsM~vo~S9d*xzyWE6v_RUMnzm&rh|VpV z1w_yBfZsk@2RW=Kk3P>_mf}Q*>-!siz$UvoogC^;aktnxO>{$zU%@a_BH6q_%yL*6 zsOv)D&JO<*^DiV-Y7~?dgVV`@ z)A)2@zDQ4OdX4(YBx}pb)D-C~e6!Z4ceQCvRGbr-+);r+HKCCtl8J^%y6pl;bVEHR zwmKn8%1uy~gGqCj%vHN+CY&q&vOH|b`^54Q+uG^`DYWAQwI1A6~jw8c}Z6uu*WHvgfY8u3O&s~v~M8I#WW7B zMbFg0qkNSUS1qZ~kCWwPeS~8S-KfbE1)gGkkTY07jSBM;-3(Lr9?jqUe_H#}sHEDy zUz_iy+uKU5EGezDobJ+`fhIK@G&84gD9tHFGe=aQY|xxYEu0ccGfgE^6jVf-oKsSB z0948e2M`qj0g=P~zUw_}J?lIl&ikITKkT*Fwb%Z(umANQenT(yK{$z}x8%U!0a**u zDUn!{G7az5Hd)4&jY0)1jJ*Lo!UpZb-76ReE^1SL8Xl%*cZtdoOO^pm*KH&j za@Ve^S3|4;&6$E(4xLVA#UA>(G(5CJAc}wb)J6)zN<;w@MUgUklw;Hjt(*M=lrINY zE4WtnfZOb#Zxd;>npE6Z9x6`59EGo1KM@B>FEwm!Fh+*-9th}YV`(7MtW93${LOWF z-xVp;Mj=4QB>ub|ejq~a_wdaT>KzZpG?73e-a!RYEO=#7<>1==^6sy<#T=rt6hvJX+qB5|kW? zG3K!*Y1%HWmXhJ)4?_p^uX$Fm&VxP*`M8}dSO5x`Y=RkFbo(wiza)&PGV%-4iUdj! zZq9v-ubqB`Emaij2v+=I(P7EiGpzG)S>u(K zD(y@3cWB(C%l+(7IUb7n9C_#;{sZ%ca7iNnt;wt5{mgkUY4_x@(1TvnWXLH?S6N8l zAgQNElIO%Xz;a0;X!t6VF(H%B-z$v^;0Db1X0vOh!cMt#`}&Y>Hn7s`p!jixiimJ$ zfHwD?($^>U+=)`r&i)w}_9UYZ)l3RUGibvbH;BZSU@BQQRb|2_u>~MIlRvFN!y8yw z%-p7-ZA-Vezrqz9TsWAZzF1#1!04!U?4=m~2;SuD#~VIBY&ZNdaf zl#G8#gd0HP+8V443stykAE6pCvPZfH!hRhs8GKyJ7V#Pb==*+D`IL8^rsK{`I@cK+ zTt_j3ZW0|jL+0vM3iZCG3{(-{rKS66IIZzPRhEpxXGwzLx$leGD_v~w35I2}Lq;rP z>6MqdTPo`9{vpj!&GLR&0(#Hh&Fi@Ix~7!|b)Y|2(VjCV$EuR47)#wFH^iHS2i;uDu7vss#j zVOlpXUtz(dWgqWMnag?bKxfEvU^fot92_H07S%Gpwhda+Wmr^h0gy!D{o=VYFKUHD z7S|3o=h#FAa=hPhZM4>14fopsH|V@vWYHUDFR6!{peO1K1SuG>#e5Ry4Sr&XC<-GK zgPGe_o(4xWwzh+rG1P#)}{^K%Lml*Z%Fq-n+LiVMv;%@QiJh) zL%^EpC2;lNV!R=##-|nL9u?O^SG~z7iVvD+LW2&@z5h-H8Ar#|fT5nE0Ag2-ad%|w zvo5ZKycjf2cA`$0N5z8&()TmklJKy~D*OG|W0=JeY76t-WJZZF{Pu~QJ~#E=@E>!# zMVmY4rrFF=%MM@qfi?{ZEW@35Yg1aH*_5WbD5xuv6Xz07^R&&>g@B%C641Rqr=uI- z%ik@)n)XIx%RRK#7Tsnjef~puTxez&Bj-ybY7B>^J<^n%)!EA>ExLVN^k~w%&RjP_ zkO-_oNOlXOebw`mC?Q98V74I9*Qg_aokIgkE;7TL=tFMqwT-U(2Mppa6*u2EAuw1g ztr6<2W{6tAH+T~o8R6V>>e9$XprScsLOPPpkB8q;FuRCY&fot(&k+A5)4cGhQ?X0o zKbF4vKA#ZXz2$eUxni1q0;Yp_mVE5yw%Wh?XJct&zJw%Y{R@IRBNr<0ghKX`#&M>g zHYus%zG?;vLUFM%3O=Bjo0@po$@Ya`IuMJp4;nvq{Nfa!3fgQpc;55w8%TN ze!Ty~2rpIAeYDq^C|9V?xGIY8bgDE_Iu4r0IG^ri6v^&%ZYQAASdYo)N2fgd^WqO* z4hFl5$AN}ASCTJji&-!8h}(6F5GGXNUcmu;-K@>DTjawQT9X>>@3D`e{d&fQFyzxt ztnw}>?`?F*-c;BW}S*%6Z- z0=rWg^QVCefNJ9o10*>=SUsKW)P}fs0j7cw9%2@|kV;R&+xe|)HpAhZv>wbSL@~%q z5DHBdI{JLq1-J<`w~Z61iI`|792EJ>^6qy|QFsDN(o=Tr%D}1+vB6)8wxMn?_p#LU z^$H;qG-EL(Qzq&*ckScYHmwU7Bq1d;gHSNOj|&#O;25Tlz`Ypn;4Uefx+u%>Kzelh z!l|bq)@##3VGn+B*v3m&F_`#=)1N7`@39(m1fZ*Nck)5gr$|r6Uh~awR=ZetL8C(z zrD;}{LsdR%9Gh;VQyqup*hD>G@kw&MCAR8|!~Ek2X5$~01`lC=Fj^Aeg)cuAFbM)h z)r5}6hqa98cF%~^Y1C9CWkV!_#2>Pv8h6%!bEtl zY2r7;uE{jub9aEqh@o?wP9~>QiA}8ds67&+W;eT&$(Nmv(SE2y9`gOi0}Rd6#;%mn znt8^_ej^`0Rge5%siIDdhub!wF*|By-nQjDrzmzhP0cP^-yY= ztTo{E6GUAEr|d4WP}Z%_^{uoZyZy-=RXv2k=}p*q=52{b7K+Z@hpQMu?uOqfN-+=p ztYMC&bpB!6+eD>9KNrq>a~XKX2c7c4+|>Op2&*Bao$$&f4GBD<$)$9z&*2^F@kSzC`18QOOP61YW3NPR&Sw;L&AlN>3V~i{o1J!>I3*iB^x*S^g zZH1Cx<>swN6fGe|GcKnsM7~4Z`uIj{y&#uDY+fr2#W$ueYL}dsyIGILzfvEO@JEZd ziIxG)W!9-Y`?x5E_mvM}iz1-?|DW>rn_}YsV6ORJ$<=?qf)8I<`lpWmC*m$PYl0bJ z>!89dJ_FEX((q)Tb@7!Pg6wAHsjt;UoW;u;e8aq6WH5c&SE)UjaPU2N65bNYs!Xe; zf^!^vn<>N7QrFD*{;uq3^+-t8qbZHhAkV0^**?OhFe%g?*LVzdEX#@yvC<5cDXTX& zzMUK4apT?=c{hG`3@;WTItR$M)dqF01S4Lb*L#mGgTUbPv7|NO0JR z>%zF~?7UpdXewrT6-7s23>e-nu9!JEdvH{ISe?Cg{y^aJfm*T?#sAmg+SKRsMzSZp zDUCYdthUQyS4<@l$E@yyY1Zm-<8Hq+Nqp7J^p#JnaQ@sP`0W4#C&*eE(IpL@)t z{y2d4wx`pByOn96*6!rlXs7OGp8yrlRQCuPz83L^1JIbc3@F|8?o7Hg3hZ_Ne*dXp zp7ET}xI`MAvPer)9*<ioOfpZP&*k2hC8({zQhp?=mQF@~v za644_BHjZwfVM|)PEQ!j+KpA4JvrCpr>C}&IZNKttzX0cRrh4opVNPTU3~Qd!fFGn zBMC3IZCyZMC3WwCzU%92sc^ArqBn{8NL%rW-8RCO>Yy;qi0(&%0@n7{LtI(p8d?~x zyad%m4pLd;1|52TyJ!eDa(g73UpP*)w7uL4j@{|}OU()#ij}0Tx^YpbJ#aP*eU1Cf znKx}_9kvp)zc5|28e~1G1l>eTDaI!_P~0qQ;*=+AK`L+BN};u)hZ!tu-fMJONgm)3 zGL;i%E$SI19#~m@pGM)z8$^BH!F()kaGOy|L_(wQuHeJ!)B;Ek=NT%wR!$eZY3fN8=>VENHLdAj z8INi-j1-26d&ogpoDXCsZW*CC`3h0_JJ*J`l*$Uz4Y}D%8f-Ptu?p1*K;f*T1EOR* zMr>dA|8A@T3_5b9i)DfYl(sV#L~J;|FU<^IW51g7cECT}oKlE@)-`k0l*k%)9E)Dj zsfE-upAhyR;6y;;{1P`)D0H(e*g2p_35YI@cDvi1vAy6lGE*Y38+Tbk%rWOZLX#_7 zS{VhZuN+sDsrF|-U1lB8>#S^m>6nOm2vc6#AId6%WDJntU2r+rCUt3o=C)C^6DV#% zL6@^Vu(bQ__tpYlp>;F3%Y<|3O`e?x_ zJ};U8&aw<=_O$j3?0Ut~*ffGghw<0%YpPjHaCrJOE@*0wLAtQ2uj;Fe{!rjSAJar?|fR-W>cPy1wcBLU<8-kJTe5 z;LPL)WTN*B=C_AS6YZpN)8Fezsd~mCv`3vuX*h$3AozyN%O>yL5ySxwQqX2>X!le z4!EXt1#*wx;ToQpe0{cXxj%$C|74;%{<*!p=@K$X(jP53E)u2b2S>jl+bp4*WRGkLy#(}5od>Qatzcb6dO7AN3X>~#t2Qo!zM=cswaoZskEW44Pv3ST4yUZuO&XCT z^aT=IkD;-@YjOd&pf^P!Q@BfSzd+j4E&bY zEfv*W{K@lK)kw%jSfo$IMv3U2*;NX5)%9)k1c^QB zkjEmo)HFI5`%FaN8|HExF7I7T-1gSTeti2^4bNq5=-_Cz67YqhxHNe%VQJ5i!F{rQ z9lQL`fJ%NuJ+1y`Jm9ZW6!{w8afMm*ee-0UGU08+Oj?v%(c^8e8LxgaZez<2Grk55 zhOb!KaYtQfWXDDnsGf(MHK z9=*E&wT$S&?hQt82TP8QvUW(>dRj}cr}{hQd8g#$RB*oCLi!@2$abCY#z2iCj824e zAeD^s&l)_WQ|3Bss1t;>|6OW92$e=W!Hvhacld-!<6jKmr(;H~SKK5Af+|uRtb50e z`?L7Q7=5}!k`~V82yzeJp{0aXx>_-UADx!~ajXF2@gg(zM=*7kEuHr|9Gb9Z$1{}} zjrpUqoB+SEWA0~p%z>X#XzKfuGMq0u{}#6l{(BhF+XRB1CL2Ypy_Yz>uUVyFcUtY5 z+gagq;^zGU# z@KRjfmKWe@&q>C}u-dPK!85Q*AHA{>sqqO<>y*N@ZlfYKqt4H5faSQb3Q5aLK#|K2 z4Bxz}+(yE@+xKBBHb3IUBI%>Zhcn)??|jjmG?mPlmD*0yF=kLfjj z!MKJVSloY%=OQO+{L{YcCe3r-AP!UZC}mVm;NojXu(ALMqiiX)9%x+gNjMvxN;W$K z`iQHM1&4z3F*>IKL5nlZUm0c{u;A^2ZYepv+mW;NFOi197H(GX)KIu#ciG#ZK#A() zf_9;gEcrEl88jL|;#UvkxjIpeRXABRM4w2dcWd=+d(wy%Zj75>o{uEsWF{ zlHvXqS4Ct?U2dBjEWku10Bb}SN(1Fc=$Q2Td)XV*MhGfctGj7@3)qBa{GOkrJEK&; zib!>2iN+bZcKWZ~9Sy=DY94%gn#1b#e}rI(qD{pxmCEg}l>PDO78kYC3Bc&rwc`~v zp;f1XjhO+n(x9s3wi2LS4REEJ!YZfOX9*h55AcO0 z4Z24MY`xgfZ--A<4Nh@Ve8j!gD~{+LEn_(F> z>QuQH4R5P><7WB%G5LuPJSdHD?gja$4Z1kxC!Z&-euz#Wh?=ISG#RgGKXW`O>)myK zfWPvFGLimH!07ZAw5qnlvjEdt6X#c-ev^^bdAAn zkF&}mAyR}Wx9^16%dv*gf$X%7{DMI*D9E(^YFa^@rPl>SlhFSOOp=)kKOA}^<|i7y zT%+3RB}rxPP}Sy37wl}L_w0kd8s;AIgtN~doq`9(&D?Cck0-UazHXZMkl626*^Xel zUgl>BTay@T^~~0b8+@=&qfN%v0fo5mxxhL1D~wlo|Bgr9wZOYpW@x4sZ&z78gms_8fLDq2RXseS+WZdd%sBmNH4yf-X4-VpJa zwS#EcC-|y;P|FqToKc_GWIFgf@2Kx~of=;(00m=1x3%)9 zX=e$ORhw;M&xzU!+3N#+=Ql8b&8dmBgP%3)bs>)2wsdPcIWJ?{-CHp2o&B9U+Z!VDMSpCJZ=Hp~Cv3vU4ff3=sARkD4$lG(fx*rU-jw0FM3@VXIt~^_FGLc%q3>)sT1gqKqXiO^? z>+80|S;b4?OnOr`_elFcE+ous*@X)ioa-->nQ$z!p{K2vbxgSG;CwuqAeS{LfllRD ztI7VnzJ24{tufaZS}%vTc~{af|^v^KY4?j zS)TfHxE=&iX3|eQCp3J7xzs!wPX76nbBD#BE+O zij`zHK`|$Xv`|7p9l-qP(6mKS`l$oKvL@`igjF`4*EQ})m9f|}EJ>}uHsKHjv|*rc zNGmO7i311mOj<^18LdTirHuf6|vq zxmZ)~$)rt>{#dV={phdHx9k59emeTMYgF{R^1mi?#~Y^Dhl^L8|ufLcyH`J7$qZRD?H;!cN%{zN=!7H z{~E`Lw>(3y|8yf|>p5X6V4Z?XV{7fk;^Bn^$kummk~JK^TpMT2Jn%Tt%Y|PK^#}< zzRpiE+Gi~*W4?uNy(`|(MC$BGAgUu3JzOu-yMBI)`{mg3d&8V%)j|vhetGWe@=0q$ zB2&^EKnF;A=IpQd*zYSkGwrrA08*HAU90kVW^Z}T(-{RHkEGsw8vYPWoHtPm8t(I+ zvGfAugc)$0NW;O)-YtV$i2e-<71lO$ppQ9=URS-6cXXyhfo!&~MY>e6?$?|6^((IH zHygM<8+jIm4g}&GzOTL7er)EEk+GyN0X)?(IygOvGK-Uje*9FH3kRyLRCE2W2AP?7 zDg2H94)q`qsS{jbf7L|22Z}erBu1Z%_jjkj)IgtbzI(I>HvgG!LEm9901xzIqF8%h zyyVvVSdb#jEwg&(e&!CZxp>Bw$a}}<=OB{=J)zB1pijL&M{I75*dD40v4;VTbM(sd zI}dWss4+`XO_Q(=?bbTvcg*b^mAPMNJ^B%~I$`Rcx_+{b<*_TXrdTFLOpH%Ui_n8m ze2_mtR@6s^OZu}6Q!T`5j=l&~Frq|u0xwwsItlr6u^`oFJO9>)#6zQ{!N8UtGPlziCt9 zYNfksY-k#Vx|e&lf9inG9-$H8dM>jwq8U>=W`;ESPz4&rR$xrmaQ4I5EXhT8d-oGl zj*XF#25*7JO*Ypg;tAiF%M1rYk=bV!wwUk#o@PGViI3a|RQDVRx;>!&2n#cmy*7Y$ zVuC7V7TB`{VRJQfGso;{mp`c50@ghhc&B73a^DQ2v_3z2kMAP7j4sVJIZ5cEH5r*( zti*N)ePJ^$xn~OkcZN0|>G>cr7kjZ&l{o%bi*D8>rmNRs{L69R&vfK~R=H}_)fgt@ zF14+&nohkv_{)u)Q~Oyr5imJ=q9rseUR@OZXnfGPHf&s)Qv6+zh3GCr6G?=wcJWrg zy{|e7zqD4b&jt!r2c>hFl#y{giKfCYWxzr*ML|9aAG|K`uCS8`nx(@mDSQ&Hh)ScYqK{WvH=X#}{IC*W=ZpfX%lEIF+sbENw={A4x4^>?EXkxKpz|Eb3eJ~A4sGPvw* zM6f+gRE0O? zWrRCZznkHKub6ZDEV5{%hr`6q*i)IerXIoShY(++TaK02+UDw~&I92$KLA%TnYGb> zT9`OADJ_jR% zcra95EQy?=s#}gN9M_Ne=141{b{_q=!R_A#y#He@$>1SU;ic}o$iOWZI~C-Yt(Dz{ J59e+r{4XSzn!5l1 diff --git a/pics/banner.png b/pics/banner.png new file mode 100644 index 0000000000000000000000000000000000000000..5e1451e9b7e4083ba921db8860e38c4b71b48d5a GIT binary patch literal 358539 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 z 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𝔢g%~Ni9)XlH^^xunxCa*5J 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

+WlyC$YEu85iQ#~_ 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 z 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�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

p`ycy?#znD9or+p`PSyKJ-ZQA!O(LZMn7R~q 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