From ec31997ba078f4b2db106ee69a8fa4bb315eb20a Mon Sep 17 00:00:00 2001 From: Arceveti <73617174+Arceveti@users.noreply.github.com> Date: Mon, 27 Sep 2021 21:39:45 -0700 Subject: [PATCH] Improved puppyprint font --- src/game/mario_actions_moving.c | 19 +- src/game/puppyprint.c | 722 +++++++++++---------------- textures/segment2/custom_text.i4.png | Bin 1870 -> 16346 bytes 3 files changed, 302 insertions(+), 439 deletions(-) diff --git a/src/game/mario_actions_moving.c b/src/game/mario_actions_moving.c index c3cbeb4a..db316f5d 100644 --- a/src/game/mario_actions_moving.c +++ b/src/game/mario_actions_moving.c @@ -434,23 +434,19 @@ s32 update_decelerating_speed(struct MarioState *m) { } void update_walking_speed(struct MarioState *m) { - f32 maxTargetSpeed; + f32 maxTargetSpeed = ((m->floor != NULL && m->floor->type == SURFACE_SLOW) ? 24.0f : 32.0f); - if (m->floor != NULL && m->floor->type == SURFACE_SLOW) { - maxTargetSpeed = 24.0f; - } else { - maxTargetSpeed = 32.0f; - } - - f32 targetSpeed = m->intendedMag < maxTargetSpeed ? m->intendedMag : maxTargetSpeed; + f32 targetSpeed = ((m->intendedMag < maxTargetSpeed) ? m->intendedMag : maxTargetSpeed); if (m->quicksandDepth > 10.0f) { targetSpeed *= 6.25 / m->quicksandDepth; } if (m->forwardVel <= 0.0f) { + // Slow down if moving backwards m->forwardVel += 1.1f; } else if (m->forwardVel <= targetSpeed) { + // If accelerating m->forwardVel += 1.1f - m->forwardVel / 43.0f; } else if (m->floor->normal.y >= 0.95f) { m->forwardVel -= 1.0f; @@ -476,14 +472,15 @@ void update_walking_speed(struct MarioState *m) { } m->faceAngle[1] = approach_angle(m->faceAngle[1], m->intendedYaw, turnRange); #elif GROUND_TURN_MODE == 2 // similar to mode 1, but a bit further from vanilla, and allows instant turnaround if Mario is moving slower than a certain threshold. - if ((m->forwardVel < 0.0f) && (m->heldObj == NULL) && !(m->action & ACT_FLAG_SHORT_HITBOX)) { + Bool32 doFullTurn = (m->heldObj == NULL) && !(m->action & ACT_FLAG_SHORT_HITBOX); + if ((m->forwardVel < 0.0f) && doFullTurn) { // Flip Mario if he is moving backwards m->faceAngle[1] += 0x8000; m->forwardVel *= -1.0f; } - if (analog_stick_held_back(m) && (m->heldObj == NULL) && !(m->action & ACT_FLAG_SHORT_HITBOX)) { + if (analog_stick_held_back(m) && doFullTurn) { // Turn around instantly - set_mario_action(m, ACT_TURNING_AROUND, 0); + // set_mario_action(m, ACT_TURNING_AROUND, 0); if (m->forwardVel < 10.0f) { m->faceAngle[1] = m->intendedYaw; } diff --git a/src/game/puppyprint.c b/src/game/puppyprint.c index 7ab328c6..5c3d454b 100644 --- a/src/game/puppyprint.c +++ b/src/game/puppyprint.c @@ -46,20 +46,20 @@ a modern game engine's developer's console. #include "hud.h" #include "debug_box.h" -u8 currEnv[4]; +ColorRGBA currEnv; u8 fDebug = 0; #if PUPPYPRINT_DEBUG s8 benchViewer = 0; u8 benchOption = 0; s8 logViewer = 0; -//Profiler values +// Profiler values s8 perfIteration = 0; s16 benchmarkLoop = 0; s32 benchmarkTimer = 0; s32 benchmarkProgramTimer = 0; s8 benchmarkType = 0; -//General +// General OSTime cpuTime = 0; OSTime rspTime = 0; OSTime rdpTime = 0; @@ -68,7 +68,7 @@ OSTime loadTime = 0; OSTime gLastOSTime = 0; OSTime rspDelta = 0; s32 benchMark[NUM_BENCH_ITERATIONS+2]; -//CPU +// CPU OSTime collisionTime[NUM_PERF_ITERATIONS+1]; OSTime behaviourTime[NUM_PERF_ITERATIONS+1]; OSTime scriptTime[NUM_PERF_ITERATIONS+1]; @@ -80,19 +80,19 @@ OSTime faultTime[NUM_PERF_ITERATIONS+1]; OSTime taskTime[NUM_PERF_ITERATIONS+1]; OSTime profilerTime[NUM_PERF_ITERATIONS+1]; OSTime profilerTime2[NUM_PERF_ITERATIONS+1]; -//RSP +// RSP OSTime audioTime[NUM_PERF_ITERATIONS+1]; OSTime rspGenTime[NUM_PERF_ITERATIONS+1]; -//RDP +// RDP OSTime bufferTime[NUM_PERF_ITERATIONS+1]; OSTime tmemTime[NUM_PERF_ITERATIONS+1]; OSTime busTime[NUM_PERF_ITERATIONS+1]; -//RAM +// RAM s8 ramViewer = 0; s32 ramsizeSegment[33] = {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}; s32 audioPool[12]; s32 mempool; -//Collision +// Collision u8 collisionViewer = 0; s32 numSurfaces = 0; @@ -116,22 +116,21 @@ s32 ramP[5][2] = { {(u32)&_goddardSegmentStart, (u32)&_goddardSegmentEnd}, }; -void puppyprint_calculate_ram_usage(void) -{ +void puppyprint_calculate_ram_usage(void) { s32 temp[2]; s32 i = 0; - for (i = 0; i < 5; i++) - { - if (!ramP[i][0] || !ramP[i][1]) + for (i = 0; i < 5; i++) { + if (!ramP[i][0] || !ramP[i][1]) { continue; + } temp[0] = ramP[i][0]; temp[1] = ramP[i][1]; ramsizeSegment[i] = temp[1] - temp[0]; } - //These are a bit hacky, but what can ye do eh? - //gEffectsMemoryPool is 0x4000, gObjectsMemoryPool is 0x800. Epic C limitations mean I can't just sizeof their values :) + // These are a bit hacky, but what can ye do eh? + // gEffectsMemoryPool is 0x4000, gObjectsMemoryPool is 0x800. Epic C limitations mean I can't just sizeof their values :) ramsizeSegment[5] = 0x4000 + 0x800 + 0x4000 + 0x800; ramsizeSegment[6] = (SURFACE_NODE_POOL_SIZE * sizeof(struct SurfaceNode)) + (SURFACE_POOL_SIZE * sizeof(struct Surface)); ramsizeSegment[7] = gAudioHeapSize + gAudioInitPoolSize; @@ -145,17 +144,17 @@ void puppyprint_profiler_finished(void) { benchMark[NUM_BENCH_ITERATIONS+1] = 0; benchmarkTimer = 300; benchViewer = 0; - for (i = 0; i < NUM_BENCH_ITERATIONS-2; i++) - { + for (i = 0; i < NUM_BENCH_ITERATIONS - 2; i++) { benchMark[NUM_BENCH_ITERATIONS] += benchMark[i]; - if (benchMark[i] > benchMark[NUM_BENCH_ITERATIONS+1]) - benchMark[NUM_BENCH_ITERATIONS+1] = benchMark[i]; + if (benchMark[i] > benchMark[NUM_BENCH_ITERATIONS + 1]) { + benchMark[NUM_BENCH_ITERATIONS + 1] = benchMark[i]; + } } benchMark[NUM_BENCH_ITERATIONS] /= NUM_BENCH_ITERATIONS; benchmarkProgramTimer = OS_CYCLES_TO_USEC(osGetTime() - benchmarkProgramTimer); } -//RGB colour lookup table for colouring all the funny ram prints. +// RGB colour lookup table for colouring all the funny ram prints. u8 colourChart[33][3] = { { 255, 0, 0 }, { 0, 0, 255 }, @@ -189,38 +188,38 @@ u8 colourChart[33][3] = { { 176, 196, 222 }, { 255, 255, 255 }}; -//Change this to alter the width of the bar at the bottom. +// Change this to alter the width of the bar at the bottom. #define BAR_LENGTH 200 -void print_ram_bar(void) -{ +void print_ram_bar(void) { s32 i = 0; f32 perfPercentage; s32 graphPos = 0; - s32 prevGraph = 160-(BAR_LENGTH/2); + s32 prevGraph = 160 - (BAR_LENGTH / 2); s32 ramsize = osGetMemSize(); prepare_blank_box(); - for (i = 0; i < 32; i++) - { - if (ramsizeSegment[i] == 0) + for (i = 0; i < 32; i++) { + if (ramsizeSegment[i] == 0) { continue; + } perfPercentage = (f32)ramsizeSegment[i]/ramsize; - graphPos = prevGraph + CLAMP((BAR_LENGTH*perfPercentage), 1, 160+(BAR_LENGTH/2)); + graphPos = prevGraph + CLAMP((BAR_LENGTH * perfPercentage), 1, 160 + (BAR_LENGTH / 2)); render_blank_box(prevGraph, 210, graphPos, 218, colourChart[i][0], colourChart[i][1], colourChart[i][2], 255); prevGraph = graphPos; } perfPercentage = (f32)ramsizeSegment[32]/ramsize; - graphPos = prevGraph + CLAMP((BAR_LENGTH*perfPercentage), 1, 160+(BAR_LENGTH/2)); + graphPos = prevGraph + CLAMP((BAR_LENGTH * perfPercentage), 1, 160 + (BAR_LENGTH / 2)); render_blank_box(prevGraph, 210, graphPos, 218, 255, 255, 255, 255); prevGraph = graphPos; - render_blank_box(prevGraph, 210, 160+(BAR_LENGTH/2), 218, 0, 0, 0, 255); + render_blank_box(prevGraph, 210, 160+(BAR_LENGTH / 2), 218, 0, 0, 0, 255); finish_blank_box(); } -//Another epic lookup table, for text this time. + +// Another epic lookup table, for text this time. const char ramNames[9][32] = { "Buffers", "Main", @@ -233,10 +232,9 @@ const char ramNames[9][32] = { "Audio Pools", }; -s8 nameTable = sizeof(ramNames)/32; +s8 nameTable = sizeof(ramNames) / 32; -void print_ram_overview(void) -{ +void print_ram_overview(void) { s32 i = 0; char textBytes[32]; s32 x = 80; @@ -246,22 +244,18 @@ void print_ram_overview(void) render_blank_box(0, 0, 320, 240, 0, 0, 0, 192); finish_blank_box(); - for (i = 0; i < 33; i++) - { - if (drawn == 16) - { + for (i = 0; i < 33; i++) { + if (drawn == 16) { x = 240; y = 16; } - if (ramsizeSegment[i] == 0) + if (ramsizeSegment[i] == 0) { continue; - if (i < 9) - { - sprintf(textBytes, "%s: %X", ramNames[i], ramsizeSegment[i]); } - else - { - sprintf(textBytes, "Segment %02X: %X",i-nameTable+2, ramsizeSegment[i]); + if (i < 9) { + sprintf(textBytes, "%s: %X", ramNames[i], ramsizeSegment[i]); + } else { + sprintf(textBytes, "Segment %02X: %X", i - nameTable + 2, ramsizeSegment[i]); } print_set_envcolour(colourChart[i][0], colourChart[i][1], colourChart[i][2], 255); print_small_text(x, y, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL); @@ -270,28 +264,25 @@ void print_ram_overview(void) } } -void benchmark_custom(void) -{ - if (benchmarkLoop == 0 || benchOption != 2) +void benchmark_custom(void) { + if (benchmarkLoop == 0 || benchOption != 2) { return; + } OSTime lastTime; - while (TRUE) - { + while (TRUE) { lastTime = osGetTime(); - //Insert your function here! + // Insert your function here! - if (benchmarkLoop > 0 && benchOption == 2) - { + if (benchmarkLoop > 0 && benchOption == 2) { benchmarkLoop--; benchMark[benchmarkLoop] = osGetTime() - lastTime; - if (benchmarkLoop == 0) - { + if (benchmarkLoop == 0) { puppyprint_profiler_finished(); break; } - } - else + } else { break; + } } } @@ -301,8 +292,7 @@ const char benchNames[][32] = { "Custom", }; -void print_which_benchmark(void) -{ +void print_which_benchmark(void) { char textBytes[40]; prepare_blank_box(); @@ -318,121 +308,111 @@ static char *write_to_buf(char *buffer, const char *data, size_t size) { return (char *) memcpy(buffer, data, size) + size; } -void append_puppyprint_log(const char *str, ...) -{ +void append_puppyprint_log(const char *str, ...) { s32 i; char textBytes[255]; memset(textBytes, 0, sizeof(textBytes)); va_list arguments; va_start(arguments, str); - if ((_Printf(write_to_buf, textBytes, str, arguments)) <= 0) - { + if ((_Printf(write_to_buf, textBytes, str, arguments)) <= 0) { va_end(arguments); return; } #ifdef UNF osSyncPrintf(textBytes); #endif - for (i = 0; i < LOG_BUFFER_SIZE-1; i++) - { - memcpy(consoleLogTable[i], consoleLogTable[i+1], 255); + for (i = 0; i < LOG_BUFFER_SIZE-1; i++) { + memcpy(consoleLogTable[i], consoleLogTable[i + 1], 255); } - memcpy(consoleLogTable[LOG_BUFFER_SIZE-1], textBytes, 255); + memcpy(consoleLogTable[LOG_BUFFER_SIZE - 1], textBytes, 255); va_end(arguments); } -#define LINE_HEIGHT 8 + ((LOG_BUFFER_SIZE-1)*12) -void print_console_log(void) -{ +#define LINE_HEIGHT 8 + ((LOG_BUFFER_SIZE - 1) * 12) +void print_console_log(void) { s32 i; prepare_blank_box(); render_blank_box(0, 0, SCREEN_WIDTH, SCREEN_HEIGHT, 0, 0, 0, 96); finish_blank_box(); - for (i = 0; i < LOG_BUFFER_SIZE; i++) - { - if (consoleLogTable[i] == NULL) + for (i = 0; i < LOG_BUFFER_SIZE; i++) { + if (consoleLogTable[i] == NULL) { continue; - print_small_text(16, (LINE_HEIGHT)-(i*12), consoleLogTable[i], PRINT_TEXT_ALIGN_LEFT, PRINT_ALL); + } + print_small_text(16, (LINE_HEIGHT) - (i * 12), consoleLogTable[i], PRINT_TEXT_ALIGN_LEFT, PRINT_ALL); } } #undef LINE_HEIGHT extern void print_fps(s32 x, s32 y); -void puppyprint_render_profiler(void) -{ +void puppyprint_render_profiler(void) { s32 perfPercentage[5]; s32 graphPos; s32 prevGraph; #ifdef PUPPYPRINT_DEBUG_CYCLES - OSTime cpuCount = (cpuTime+audioTime[NUM_PERF_ITERATIONS]+dmaAudioTime[NUM_PERF_ITERATIONS]+faultTime[NUM_PERF_ITERATIONS] - +taskTime[NUM_PERF_ITERATIONS]-profilerTime[NUM_PERF_ITERATIONS]-profilerTime2[NUM_PERF_ITERATIONS]); + OSTime cpuCount = (cpuTime + audioTime[NUM_PERF_ITERATIONS] + dmaAudioTime[NUM_PERF_ITERATIONS] + faultTime[NUM_PERF_ITERATIONS] + + taskTime[NUM_PERF_ITERATIONS] - profilerTime[NUM_PERF_ITERATIONS] - profilerTime2[NUM_PERF_ITERATIONS]); #else - OSTime cpuCount = OS_CYCLES_TO_USEC(cpuTime+audioTime[NUM_PERF_ITERATIONS]+dmaAudioTime[NUM_PERF_ITERATIONS]+faultTime[NUM_PERF_ITERATIONS] - +taskTime[NUM_PERF_ITERATIONS]-profilerTime[NUM_PERF_ITERATIONS]-profilerTime2[NUM_PERF_ITERATIONS]); + OSTime cpuCount = OS_CYCLES_TO_USEC(cpuTime+audioTime[NUM_PERF_ITERATIONS] + dmaAudioTime[NUM_PERF_ITERATIONS] + faultTime[NUM_PERF_ITERATIONS] + + taskTime[NUM_PERF_ITERATIONS] - profilerTime[NUM_PERF_ITERATIONS] - profilerTime2[NUM_PERF_ITERATIONS]); #endif OSTime first = osGetTime(); char textBytes[80]; - if (!fDebug) - { + if (!fDebug) { profiler_update(profilerTime, first); return; } - sprintf(textBytes, "RAM: %06X /%06X (%d_)", main_pool_available(), mempool, (s32)(((f32)main_pool_available()/(f32)mempool)*100)); + sprintf(textBytes, "RAM: %06X /%06X (%d_)", main_pool_available(), mempool, (s32)(((f32)main_pool_available() / (f32)mempool) * 100)); print_small_text(160, 224, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL); - if (!ramViewer && !benchViewer && !logViewer) - { + if (!ramViewer && !benchViewer && !logViewer) { print_fps(16,40); #ifdef PUPPYPRINT_DEBUG_CYCLES sprintf(textBytes, "CPU: %dc (%d_)#RSP: %dc (%d_)#RDP: %dc (%d_)", (s32)cpuCount, (s32)(cpuCount/333), (s32)(rspTime), (s32)(rspTime)/333, (s32)(rdpTime), (s32)(rdpTime)/333); #else - sprintf(textBytes, "CPU: %dus (%d_)#RSP: %dus (%d_)#RDP: %dus (%d_)", (s32)cpuCount, (s32)(cpuCount/333), (s32)OS_CYCLES_TO_USEC(rspTime), (s32)OS_CYCLES_TO_USEC(rspTime)/333, (s32)OS_CYCLES_TO_USEC(rdpTime), (s32)OS_CYCLES_TO_USEC(rdpTime)/333); + sprintf(textBytes, "CPU: %dus (%d_)#RSP: %dus (%d_)#RDP: %dus (%d_)", (s32)cpuCount, (s32)(cpuCount / 333), (s32)OS_CYCLES_TO_USEC(rspTime), (s32)OS_CYCLES_TO_USEC(rspTime) / 333, (s32)OS_CYCLES_TO_USEC(rdpTime), (s32)OS_CYCLES_TO_USEC(rdpTime) / 333); #endif print_small_text(16, 52, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL); sprintf(textBytes, "OBJ: %d/%d", gObjectCounter, OBJECT_POOL_CAPACITY); print_small_text(16, 124, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL); - //Very little point printing useless info if Mayro doesn't even exist. - if (gMarioState->marioObj) - { + // Very little point printing useless info if Mayro doesn't even exist. + if (gMarioState->marioObj) { sprintf(textBytes, "Mario Pos#X: %d#Y: %d#Z: %d#D: %X", (s32)(gMarioState->pos[0]), (s32)(gMarioState->pos[1]), (s32)(gMarioState->pos[2]), (u16)(gMarioState->faceAngle[1])); print_small_text(16, 140, textBytes, PRINT_TEXT_ALIGN_LEFT, PRINT_ALL); } - //Same for the camera, especially so because this will crash otherwise. - if (gCamera) - { + // Same for the camera, especially so because this will crash otherwise. + if (gCamera) { sprintf(textBytes, "Camera Pos#X: %d#Y: %d#Z: %d#D: %X", (s32)(gCamera->pos[0]), (s32)(gCamera->pos[1]), (s32)(gCamera->pos[2]), (u16)(gCamera->yaw)); print_small_text(304, 140, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL); } - if (benchmarkTimer > 0) - { + if (benchmarkTimer > 0) { benchmarkTimer--; prepare_blank_box(); #ifdef PUPPYPRINT_DEBUG_CYCLES - //sprintf(textBytes, "Benchmark: %dus#High: %dc", (s32)(benchMark[NUM_BENCH_ITERATIONS]), (s32)(benchMark[NUM_BENCH_ITERATIONS+1])); - sprintf(textBytes, "Done in %0.000f seconds#Benchmark: %dc#High: %dc", (f32)(benchmarkProgramTimer)*0.000001f, (s32)(benchMark[NUM_BENCH_ITERATIONS]), (s32)(benchMark[NUM_BENCH_ITERATIONS+1])); + // sprintf(textBytes, "Benchmark: %dus#High: %dc", (s32)(benchMark[NUM_BENCH_ITERATIONS]), (s32)(benchMark[NUM_BENCH_ITERATIONS + 1])); + sprintf(textBytes, "Done in %0.000f seconds#Benchmark: %dc#High: %dc", (f32)(benchmarkProgramTimer) * 0.000001f, (s32)(benchMark[NUM_BENCH_ITERATIONS]), (s32)(benchMark[NUM_BENCH_ITERATIONS + 1])); #else - //sprintf(textBytes, "Benchmark: %dus#High: %dus", (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS]), (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS+1])); - sprintf(textBytes, "Done in %0.000f seconds#Benchmark: %dus#High: %dus", (f32)(benchmarkProgramTimer)*0.000001f, (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS]), (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS+1])); + // sprintf(textBytes, "Benchmark: %dus#High: %dus", (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS]), (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS+1])); + sprintf(textBytes, "Done in %0.000f seconds#Benchmark: %dus#High: %dus", (f32)(benchmarkProgramTimer) * 0.000001f, (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS]), (s32)OS_CYCLES_TO_USEC(benchMark[NUM_BENCH_ITERATIONS + 1])); #endif - render_blank_box(160-(get_text_width(textBytes)/2)-4, 158, 160+(get_text_width(textBytes)/2)+4, 196, 0, 0, 0, 255); + render_blank_box(160 - (get_text_width(textBytes) / 2) - 4, 158, 160 + (get_text_width(textBytes) / 2) + 4, 196, 0, 0, 0, 255); print_set_envcolour(255, 255, 255, 255); print_small_text(160, 160, textBytes, PRINT_TEXT_ALIGN_CENTRE, PRINT_ALL); finish_blank_box(); } #define ADDTIMES MAX((collisionTime[NUM_PERF_ITERATIONS] + graphTime[NUM_PERF_ITERATIONS] + behaviourTime[NUM_PERF_ITERATIONS] + audioTime[NUM_PERF_ITERATIONS] + dmaTime[NUM_PERF_ITERATIONS])/80, 1) - perfPercentage[0] = MAX((collisionTime[NUM_PERF_ITERATIONS]/ADDTIMES), 1); - perfPercentage[1] = MAX((graphTime[NUM_PERF_ITERATIONS]/ADDTIMES), 1); - perfPercentage[2] = MAX((behaviourTime[NUM_PERF_ITERATIONS]/ADDTIMES), 1); - perfPercentage[3] = MAX((audioTime[NUM_PERF_ITERATIONS]/ADDTIMES), 1); - perfPercentage[4] = MAX((dmaTime[NUM_PERF_ITERATIONS]/ADDTIMES), 1); + perfPercentage[0] = MAX((collisionTime[NUM_PERF_ITERATIONS] / ADDTIMES), 1); + perfPercentage[1] = MAX(( graphTime[NUM_PERF_ITERATIONS] / ADDTIMES), 1); + perfPercentage[2] = MAX((behaviourTime[NUM_PERF_ITERATIONS] / ADDTIMES), 1); + perfPercentage[3] = MAX(( audioTime[NUM_PERF_ITERATIONS] / ADDTIMES), 1); + perfPercentage[4] = MAX(( dmaTime[NUM_PERF_ITERATIONS] / ADDTIMES), 1); #undef ADDTIMES #ifdef PUPPYPRINT_DEBUG_CYCLES @@ -459,7 +439,7 @@ void puppyprint_render_profiler(void) print_small_text(304, 88, textBytes, PRINT_TEXT_ALIGN_RIGHT, PRINT_ALL); #endif - //Render CPU breakdown bar. + // Render CPU breakdown bar. prepare_blank_box(); graphPos = 224 + perfPercentage[0]; render_blank_box(224, 104, graphPos, 112, 255, 0, 0, 255); @@ -475,47 +455,38 @@ void puppyprint_render_profiler(void) prevGraph = graphPos; graphPos += perfPercentage[4]; render_blank_box(prevGraph, 104, 304, 112, 255, 0, 255, 255); - } - else - if (ramViewer) + } else if (ramViewer) { print_ram_overview(); - else - if (logViewer) + } else if (logViewer) { print_console_log(); - else - if (benchViewer) + } else if (benchViewer) { print_which_benchmark(); - + } print_ram_bar(); profiler_update(profilerTime, first); } -void profiler_update(OSTime *time, OSTime time2) -{ +void profiler_update(OSTime *time, OSTime time2) { time[perfIteration] = osGetTime() - time2; } -void get_average_perf_time(OSTime *time) -{ - //This takes all but the last index of the timer array, and creates an average value, which is written to the last index. +void get_average_perf_time(OSTime *time) { + // This takes all but the last index of the timer array, and creates an average value, which is written to the last index. s32 i = 0; s32 total = 0; - for (i = 0; i < NUM_PERF_ITERATIONS-1; i++) - { + for (i = 0; i < NUM_PERF_ITERATIONS - 1; i++) { total += time[i]; } - time[NUM_PERF_ITERATIONS] = total/NUM_PERF_ITERATIONS; + time[NUM_PERF_ITERATIONS] = total / NUM_PERF_ITERATIONS; } -void puppyprint_profiler_process(void) -{ +void puppyprint_profiler_process(void) { bufferTime[perfIteration] = (IO_READ(DPC_BUFBUSY_REG)); tmemTime[perfIteration] = (IO_READ(DPC_TMEM_REG)); busTime[perfIteration] = (IO_READ(DPC_PIPEBUSY_REG)); OSTime newTime = osGetTime(); - if (gGlobalTimer % 15 == 0) - { + if ((gGlobalTimer % 15) == 0) { get_average_perf_time(scriptTime); get_average_perf_time(behaviourTime); get_average_perf_time(collisionTime); @@ -545,74 +516,56 @@ void puppyprint_profiler_process(void) } gLastOSTime = newTime; - if (gGlobalTimer > 5) + if (gGlobalTimer > 5) { IO_WRITE(DPC_STATUS_REG, DPC_CLR_CLOCK_CTR | DPC_CLR_CMD_CTR | DPC_CLR_PIPE_CTR | DPC_CLR_TMEM_CTR); - - if (fDebug) - { - if (gPlayer1Controller->buttonPressed & D_JPAD) - { + } + if (fDebug) { + if (gPlayer1Controller->buttonPressed & D_JPAD) { benchViewer ^= 1; ramViewer = 0; logViewer = 0; - } - else - if (gPlayer1Controller->buttonPressed & U_JPAD) - { + } else if (gPlayer1Controller->buttonPressed & U_JPAD) { ramViewer ^= 1; benchViewer = 0; logViewer = 0; - } - else - if (gPlayer1Controller->buttonPressed & L_JPAD) - { + } else if (gPlayer1Controller->buttonPressed & L_JPAD) { logViewer ^= 1; ramViewer = 0; benchViewer = 0; } - #ifdef VISUAL_DEBUG - else - if (!benchViewer && !ramViewer && !logViewer) - { +#ifdef VISUAL_DEBUG + else if (!benchViewer && !ramViewer && !logViewer) { debug_box_input(); } - #endif - if (benchViewer) - { - if (gPlayer1Controller->buttonPressed & R_JPAD) - benchOption++; - if (gPlayer1Controller->buttonPressed & L_JPAD) - benchOption--; - if (benchOption == 255) - benchOption = 2; - if (benchOption > 2) - benchOption = 0; - if (gPlayer1Controller->buttonPressed & L_TRIG) - { +#endif + if (benchViewer) { + if (gPlayer1Controller->buttonPressed & R_JPAD) benchOption++; + if (gPlayer1Controller->buttonPressed & L_JPAD) benchOption--; + if (benchOption == 255) benchOption = 2; + if (benchOption > 2) benchOption = 0; + if (gPlayer1Controller->buttonPressed & L_TRIG) { benchmarkLoop = NUM_BENCH_ITERATIONS; benchmarkProgramTimer = osGetTime(); } } benchmark_custom(); } - if (gPlayer1Controller->buttonDown & U_JPAD && gPlayer1Controller->buttonPressed & L_TRIG) - { + if (gPlayer1Controller->buttonDown & U_JPAD && gPlayer1Controller->buttonPressed & L_TRIG) { ramViewer = 0; benchViewer = 0; fDebug ^= 1; } - if (perfIteration++ == NUM_PERF_ITERATIONS-1) + if (perfIteration++ == NUM_PERF_ITERATIONS - 1) { perfIteration = 0; + } profiler_update(profilerTime2, newTime); } #endif -void print_set_envcolour(s32 r, s32 g, s32 b, s32 a) -{ - if (r != currEnv[0] || g != currEnv[1] || b != currEnv[2] || a != currEnv[3]) - { +void print_set_envcolour(s32 r, s32 g, s32 b, s32 a) { + if (r != currEnv[0] || g != currEnv[1] || b != currEnv[2] || a != currEnv[3]) { gDPSetEnvColor(gDisplayListHead++, (u8)r, (u8)g, (u8)b, (u8)a); currEnv[0] = r; currEnv[1] = g; @@ -623,38 +576,29 @@ void print_set_envcolour(s32 r, s32 g, s32 b, s32 a) #define BLANK 0, 0, 0, ENVIRONMENT, 0, 0, 0, ENVIRONMENT -void prepare_blank_box(void) -{ +void prepare_blank_box(void) { gDPSetCombineMode(gDisplayListHead++, BLANK, BLANK); } -void finish_blank_box(void) -{ +void finish_blank_box(void) { print_set_envcolour(255, 255, 255, 255); gSPDisplayList(gDisplayListHead++,dl_hud_img_end); } -//This does some epic shenanigans to figure out the optimal way to draw this. -//If the width is a multiple of 4, then use fillmode (fastest) -//Otherwise, if there's transparency, it uses that rendermode, which is slower than using opaque rendermodes. -void render_blank_box(s16 x1, s16 y1, s16 x2, s16 y2, u8 r, u8 g, u8 b, u8 a) -{ +// This does some epic shenanigans to figure out the optimal way to draw this. +// If the width is a multiple of 4, then use fillmode (fastest) +// Otherwise, if there's transparency, it uses that rendermode, which is slower than using opaque rendermodes. +void render_blank_box(s16 x1, s16 y1, s16 x2, s16 y2, u8 r, u8 g, u8 b, u8 a) { s32 cycleadd = 0; - if (ABS(x1 - x2) % 4 == 0 && a == 255) - { + if (ABS(x1 - x2) % 4 == 0 && a == 255) { gDPSetCycleType(gDisplayListHead++, G_CYC_FILL); gDPSetRenderMode(gDisplayListHead++, G_RM_NOOP, G_RM_NOOP); cycleadd = 1; - } - else - { + } else { gDPSetCycleType(gDisplayListHead++, G_CYC_1CYCLE); - if (a == 255) - { + if (a == 255) { gDPSetRenderMode(gDisplayListHead++, G_RM_OPA_SURF, G_RM_OPA_SURF2); - } - else - { + } else { gDPSetRenderMode(gDisplayListHead++, G_RM_XLU_SURF, G_RM_XLU_SURF2); } cycleadd = 0; @@ -667,220 +611,174 @@ void render_blank_box(s16 x1, s16 y1, s16 x2, s16 y2, u8 r, u8 g, u8 b, u8 a) u8 textLen[] = { - /*0*/ 6, /*1*/ 5, /*2*/ 7, /*3*/ 7, /*4*/ 7, /*5*/ 7, /*6*/ 8, /*7*/ 7, /*8*/ 7, /*9*/ 6, /*-*/ 8, /*+*/ 8, /*(*/ 5, /*)*/ 5, /*!*/ 4, /*?*/ 6, - /*A*/ 7, /*B*/ 7, /*C*/ 7, /*D*/ 7, /*E*/ 6, /*F*/ 5, /*G*/ 8, /*H*/ 6, /*I*/ 6, /*J*/ 5, /*K*/ 7, /*L*/ 6, /*M*/ 7, /*N*/ 7, /*O*/ 7, /*P*/ 6, - /*Q*/ 8, /*R*/ 6, /*S*/ 7, /*T*/ 7, /*U*/ 7, /*V*/ 7, /*W*/ 8, /*X*/ 7, /*Y*/ 7, /*Z*/ 7, /*"*/ 5, /*'*/ 2, /*:*/ 3, /*;*/ 3, /*.*/ 3, /*,*/ 3, - /*a*/ 7, /*b*/ 7, /*c*/ 6, /*d*/ 7, /*e*/ 7, /*f*/ 7, /*g*/ 7, /*h*/ 7, /*i*/ 3, /*j*/ 5, /*k*/ 8, /*l*/ 4, /*m*/ 7, /*n*/ 7, /*o*/ 7, /*p*/ 7, - /*q*/ 7, /*r*/ 6, /*s*/ 6, /*t*/ 6, /*u*/ 6, /*v*/ 7, /*w*/ 8, /*x*/ 6, /*y*/ 8, /*z*/ 7, /*~*/ 8, /*..*/ 7, /*^*/ 8, /*/*/ 8, /*%*/ 8, /*&*/ 8, + /*0*/ 7, /*1*/ 7, /*2*/ 7, /*3*/ 7, /*4*/ 7, /*5*/ 7, /*6*/ 7, /*7*/ 7, /*8*/ 7, /*9*/ 7, /*-*/ 7, /*+*/ 7, /*(*/ 4, /*)*/ 4, /*!*/ 5, /*?*/ 6, + /*A*/ 7, /*B*/ 7, /*C*/ 7, /*D*/ 7, /*E*/ 7, /*F*/ 7, /*G*/ 7, /*H*/ 7, /*I*/ 7, /*J*/ 7, /*K*/ 7, /*L*/ 7, /*M*/ 7, /*N*/ 7, /*O*/ 7, /*P*/ 7, + /*Q*/ 7, /*R*/ 7, /*S*/ 7, /*T*/ 7, /*U*/ 7, /*V*/ 7, /*W*/ 7, /*X*/ 7, /*Y*/ 7, /*Z*/ 7, /*"*/ 5, /*'*/ 2, /*:*/ 3, /*;*/ 3, /*.*/ 3, /*,*/ 3, + /*a*/ 6, /*b*/ 6, /*c*/ 6, /*d*/ 6, /*e*/ 6, /*f*/ 6, /*g*/ 6, /*h*/ 6, /*i*/ 2, /*j*/ 6, /*k*/ 6, /*l*/ 3, /*m*/ 6, /*n*/ 6, /*o*/ 6, /*p*/ 6, + /*q*/ 6, /*r*/ 6, /*s*/ 6, /*t*/ 6, /*u*/ 6, /*v*/ 6, /*w*/ 6, /*x*/ 6, /*y*/ 6, /*z*/ 6, /*~*/ 7, /*ยจ*/ 6, /*^*/ 7, /*/*/ 6, /*%*/ 6, /*&*/ 7, }; #include "level_update.h" -void get_char_from_byte(u8 letter, s32 *textX, s32 *textY, s32 *spaceX, s32 *offsetY) -{ +void get_char_from_byte(u8 letter, s32 *textX, s32 *textY, s32 *spaceX, s32 *offsetY) { *offsetY = 0; - //Line 1 - if (letter >= '0' && letter <= '9') - { + if (letter >= '0' && letter <= '9') { // Line 1 *textX = (letter - '0') * 4; *textY = 0; *spaceX = textLen[letter - '0']; - } - else - //Line 2 - if (letter >= 'A' && letter <= 'P') - { + } else if (letter >= 'A' && letter <= 'P') { // Line 2 *textX = ((letter - 'A') * 4); *textY = 6; - *spaceX = textLen[letter - 'A'+16]; - } - else - //Line 3 - if (letter >= 'Q' && letter <= 'Z') - { + *spaceX = textLen[letter - 'A' + 16]; + } else if (letter >= 'Q' && letter <= 'Z') { // Line 3 *textX = ((letter - 'Q') * 4); *textY = 12; - *spaceX = textLen[letter - 'Q'+32]; - } - else - //Line 4 - if (letter >= 'a' && letter <= 'p') - { + *spaceX = textLen[letter - 'Q' + 32]; + } else if (letter >= 'a' && letter <= 'p') { // Line 4 *textX = ((letter - 'a') * 4); *textY = 18; - *spaceX = textLen[letter - 'a'+48]; - } - else - //Line 5 - if (letter >= 'q' && letter <= 'z') - { + *spaceX = textLen[letter - 'a' + 48]; + } else if (letter >= 'q' && letter <= 'z') { // Line 5 *textX = ((letter - 'q') * 4); *textY = 24; - *spaceX = textLen[letter - 'q'+64]; - } - else - {//Space, the final frontier. + *spaceX = textLen[letter - 'q' + 64]; + } else { // Space, the final frontier. *textX = 128; - *textY = 0; + *textY = 12; *spaceX = 2; } - switch (letter) - { - case '-': *textX = 40; *textY = 0; *spaceX = textLen[10]; break; //Hyphen - case '+': *textX = 44; *textY = 0; *spaceX = textLen[11]; break; //Plus - case '(': *textX = 48; *textY = 0; *spaceX = textLen[12]; break; //Open Bracket - case ')': *textX = 52; *textY = 0; *spaceX = textLen[13]; break; //Close Bracket - case '!': *textX = 56; *textY = 0; *spaceX = textLen[14]; break; //Exclamation mark - case '?': *textX = 60; *textY = 0; *spaceX = textLen[15]; break; //Question mark + switch (letter) { + case '-': *textX = 40; *textY = 0; *spaceX = textLen[10]; break; // Hyphen + case '+': *textX = 44; *textY = 0; *spaceX = textLen[11]; break; // Plus + case '(': *textX = 48; *textY = 0; *spaceX = textLen[12]; break; // Open Bracket + case ')': *textX = 52; *textY = 0; *spaceX = textLen[13]; break; // Close Bracket + case '!': *textX = 56; *textY = 0; *spaceX = textLen[14]; break; // Exclamation mark + case '?': *textX = 60; *textY = 0; *spaceX = textLen[15]; break; // Question mark - case '"': *textX = 40; *textY = 12; *spaceX = textLen[42]; break; //Speech mark - case 0x27: *textX = 44; *textY = 12; *spaceX = textLen[43]; break; //Apostrophe. - case ':': *textX = 48; *textY = 12; *spaceX = textLen[44]; break; //Colon - case ';': *textX = 52; *textY = 12; *spaceX = textLen[45]; break; //Semicolon - case '.': *textX = 56; *textY = 12; *spaceX = textLen[46]; break; //Full stop - case ',': *textX = 60; *textY = 12; *spaceX = textLen[47]; break; //Comma + case '"': *textX = 40; *textY = 12; *spaceX = textLen[42]; break; // Speech mark + case'\'': *textX = 44; *textY = 12; *spaceX = textLen[43]; break; // Apostrophe. + case ':': *textX = 48; *textY = 12; *spaceX = textLen[44]; break; // Colon + case ';': *textX = 52; *textY = 12; *spaceX = textLen[45]; break; // Semicolon + case '.': *textX = 56; *textY = 12; *spaceX = textLen[46]; break; // Full stop + case ',': *textX = 60; *textY = 12; *spaceX = textLen[47]; break; // Comma - case '~': *textX = 40; *textY = 24; *spaceX = textLen[74]; break; //Tilde - case '@': *textX = 44; *textY = 24; *spaceX = textLen[75]; break; //Umlaut - case '^': *textX = 48; *textY = 24; *spaceX = textLen[76]; break; //Caret - case '/': *textX = 52; *textY = 24; *spaceX = textLen[77]; break; //Slash - case '_': *textX = 56; *textY = 24; *spaceX = textLen[78]; break; //Percent - case '&': *textX = 60; *textY = 24; *spaceX = textLen[79]; break; //Ampersand + case '~': *textX = 40; *textY = 24; *spaceX = textLen[74]; break; // Tilde + case '@': *textX = 44; *textY = 24; *spaceX = textLen[75]; break; // Umlaut + case '^': *textX = 48; *textY = 24; *spaceX = textLen[76]; break; // Caret + case '/': *textX = 52; *textY = 24; *spaceX = textLen[77]; break; // Slash + case '_': *textX = 56; *textY = 24; *spaceX = textLen[78]; break; // Percent + case '&': *textX = 60; *textY = 24; *spaceX = textLen[79]; break; // Ampersand - //This is for the letters that sit differently on the line. It just moves them down a bit. + // This is for the letters that sit differently on the line. It just moves them down a bit. case 'g': *offsetY = 1; break; case 'q': *offsetY = 1; break; - case 'p': *offsetY = 3; break; - case 'y': *offsetY = 1; break; + // case 'p': *offsetY = 1; break; + // case 'y': *offsetY = 1; break; } } s8 shakeToggle = 0; s8 waveToggle = 0; -s32 text_iterate_command(const char *str, s32 i, s32 runCMD) -{ +s32 text_iterate_command(const char *str, s32 i, s32 runCMD) { s32 len = 0; - while (str[i+len] != '>' && i+len < (signed)strlen(str)) - len++; + while (str[i+len] != '>' && i+len < (signed)strlen(str)) len++; len++; - if (runCMD) - { - if (strncmp(str+i, "", 5) == 0) //Simple text colour effect. goes up to 99 for each, so 99000000 is red. - { + if (runCMD) { + if (strncmp(str+i, "", 5) == 0) { // Simple text colour effect. goes up to 99 for each, so 99000000 is red. s32 r, g, b, a; - //Each value is taken from the strong. The first is multiplied by 10, because it's a larger significant value, then it adds the next digit onto it. - r = (str[i+5] - '0')*10; - r += str[i+6] - '0'; - g = (str[i+7] - '0')*10; - g += str[i+8] - '0'; - b = (str[i+9] - '0')*10; - b += str[i+10] - '0'; - a = (str[i+11] - '0')*10; - a += str[i+12] - '0'; - //Multiply each value afterwards by 2.575f to make 255. - print_set_envcolour(r*2.575f, g*2.575f, b*2.575f, a*2.575f); - } - else - if (strncmp(str+i, "", 6) == 0) //Same as above, except it fades between two colours. The third set of numbers is the speed it fades. - { + // Each value is taken from the strong. The first is multiplied by 10, because it's a larger significant value, then it adds the next digit onto it. + r = ((str[i + 5] - '0') * 10); + r += str[i + 6] - '0'; + g = ((str[i + 7] - '0') * 10); + g += str[i + 8] - '0'; + b = ((str[i + 9] - '0') * 10); + b += str[i + 10] - '0'; + a = ((str[i + 11] - '0') * 10); + a += str[i + 12] - '0'; + // Multiply each value afterwards by 2.575f to make 255. + print_set_envcolour(r * 2.575f, g * 2.575f, b * 2.575f, a * 2.575f); + } else if (strncmp(str+i, "", 6) == 0) { // Same as above, except it fades between two colours. The third set of numbers is the speed it fades. s32 r, g, b, a, r2, g2, b2, a2, spd, r3, g3, b3, a3, r4, g4, b4, a4; - r = (str[i+6] - '0')*10; - r += str[i+7] - '0'; - g = (str[i+8] - '0')*10; - g += str[i+9] - '0'; - b = (str[i+10] - '0')*10; - b += str[i+11] - '0'; - a = (str[i+12] - '0')*10; - a += str[i+13] - '0'; - r2 = (str[i+15] - '0')*10; - r2 += str[i+16] - '0'; - g2 = (str[i+17] - '0')*10; - g2 += str[i+18] - '0'; - b2 = (str[i+19] - '0')*10; - b2 += str[i+20] - '0'; - a2 = (str[i+21] - '0')*10; - a2 += str[i+22] - '0'; - spd = (str[i+24] - '0')*10; - spd += str[i+25] - '0'; + r = ((str[i + 6] - '0') * 10); + r += str[i + 7] - '0'; + g = ((str[i + 8] - '0') * 10); + g += str[i + 9] - '0'; + b = ((str[i + 10] - '0') * 10); + b += str[i + 11] - '0'; + a = ((str[i + 12] - '0') * 10); + a += str[i + 13] - '0'; + r2 = ((str[i + 15] - '0') * 10); + r2 += str[i + 16] - '0'; + g2 = ((str[i + 17] - '0') * 10); + g2 += str[i + 18] - '0'; + b2 = ((str[i + 19] - '0') * 10); + b2 += str[i + 20] - '0'; + a2 = ((str[i + 21] - '0') * 10); + a2 += str[i + 22] - '0'; + spd = ((str[i + 24] - '0') * 10); + spd += str[i + 25] - '0'; - //Find the median. - r3 = (r + r2)*1.2875f; - g3 = (g + g2)*1.2875f; - b3 = (b + b2)*1.2875f; - a3 = (a + a2)*1.2875f; - //Find the difference. - r4 = (r - r2)*1.2875f; - g4 = (g - g2)*1.2875f; - b4 = (b - b2)*1.2875f; - a4 = (a - a2)*1.2875f; - //Now start from the median, and wave from end to end with the difference, to create the fading effect. - print_set_envcolour(r3 + ((sins(gGlobalTimer*spd*50)) * r4), g3 + ((sins(gGlobalTimer*spd*50)) * g4), b3 + ((sins(gGlobalTimer*spd*50)) * b4), a3 + ((sins(gGlobalTimer*spd*50)) * a4)); + // Find the median. + r3 = (r + r2) * 1.2875f; + g3 = (g + g2) * 1.2875f; + b3 = (b + b2) * 1.2875f; + a3 = (a + a2) * 1.2875f; + // Find the difference. + r4 = (r - r2) * 1.2875f; + g4 = (g - g2) * 1.2875f; + b4 = (b - b2) * 1.2875f; + a4 = (a - a2) * 1.2875f; + // Now start from the median, and wave from end to end with the difference, to create the fading effect. + print_set_envcolour(r3 + ((sins(gGlobalTimer * spd * 50)) * r4), g3 + ((sins(gGlobalTimer * spd * 50)) * g4), b3 + ((sins(gGlobalTimer * spd * 50)) * b4), a3 + ((sins(gGlobalTimer * spd * 50)) * a4)); } else - if (strncmp(str+i, "", 8) == 0) //Toggles the happy colours :o) Do it again to disable it. - { - s32 r, g, b; - r = (coss(gGlobalTimer*600)+1)*127; - g = (coss((gGlobalTimer*600)+21845)+1)*127; - b = (coss((gGlobalTimer*600)-21845)+1)*127; + if (strncmp(str+i, "", 8) == 0) { // Toggles the happy colours :o) Do it again to disable it. + s32 r = (coss(gGlobalTimer * 600) + 1) * 127; + s32 g = (coss((gGlobalTimer * 600) + 21845) + 1) * 127; + s32 b = (coss((gGlobalTimer * 600) - 21845) + 1) * 127; print_set_envcolour(r, g, b, 255); + } else if (strncmp(str + i, "", 7) == 0) { // Toggles text that shakes on the spot. Do it again to disable it. + shakeToggle ^= 1; + } else if (strncmp(str + i, "", 6) == 0) { // Toggles text that waves around. Do it again to disable it. + waveToggle ^= 1; } - else - if (strncmp(str+i, "", 7) == 0) //Toggles text that shakes on the spot. Do it again to disable it. - { - shakeToggle^=1; - } - else - if (strncmp(str+i, "", 6) == 0) //Toggles text that waves around. Do it again to disable it. - { - waveToggle^=1; - } - } - return len; } -s32 get_text_width(const char *str) -{ +s32 get_text_width(const char *str) { s32 i= 0; s32 textPos = 0; s32 wideX = 0; s32 textX, textY, offsetY, spaceX; - for (i = 0; i < (signed)strlen(str); i++) - { - if (str[i] == '#') - { - i++; - textPos = 0; - } - if (str[i] == '<') - { - i+= text_iterate_command(str, i, FALSE); - } - get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY); - textPos+=spaceX+1; - wideX = MAX(textPos, wideX); + for (i = 0; i < (signed)strlen(str); i++) { + if (str[i] == '#') { + i++; + textPos = 0; + } + if (str[i] == '<') { + i += text_iterate_command(str, i, FALSE); + } + get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY); + textPos += spaceX + 1; + wideX = MAX(textPos, wideX); } return wideX; } -s32 get_text_height(const char *str) -{ +s32 get_text_height(const char *str) { s32 i= 0; s32 textPos = 0; - for (i = 0; i < (signed)strlen(str); i++) - { - if (str[i] == '#') - { - i++; - textPos+=12; - } + for (i = 0; i < (signed)strlen(str); i++) { + if (str[i] == '#') { + i++; + textPos += 12; + } } return textPos; } @@ -910,97 +808,73 @@ void print_small_text(s32 x, s32 y, const char *str, s32 align, s32 amount) gDPSetTexturePersp(gDisplayListHead++, G_TP_NONE); gDPSetCombineMode(gDisplayListHead++, G_CC_FADEA, G_CC_FADEA); gDPSetTextureFilter(gDisplayListHead++, G_TF_POINT); - if (align == PRINT_TEXT_ALIGN_CENTRE) - { - for (i = 0; i < (signed)strlen(str); i++) - { - if (str[i] == '#') - { - i++; - textPos[0] = 0; - lines++; + if (align == PRINT_TEXT_ALIGN_CENTRE) { + for (i = 0; i < (signed)strlen(str); i++) { + if (str[i] == '#') { + i++; + textPos[0] = 0; + lines++; + } + if (str[i] == '<') { + i += text_iterate_command(str, i, FALSE); + } + get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY); + textPos[0] += spaceX + 1; + wideX[lines] = MAX(textPos[0], wideX[lines]); } - if (str[i] == '<') - { - i+= text_iterate_command(str, i, FALSE); - } - get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY); - textPos[0]+=spaceX+1; - wideX[lines] = MAX(textPos[0], wideX[lines]); - } - textPos[0] = -(wideX[0]/2); - } - else - if (align == PRINT_TEXT_ALIGN_RIGHT) - { - for (i = 0; i < (signed)strlen(str); i++) - { - if (str[i] == '#') - { - i++; - textPos[0] = 0; - lines++; - } - else - { - textPos[0]+=spaceX+1; - } - if (str[i] == '<') - { - i+= text_iterate_command(str, i, FALSE); - } - get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY); + textPos[0] = -(wideX[0] / 2); + } else if (align == PRINT_TEXT_ALIGN_RIGHT) { + for (i = 0; i < (signed)strlen(str); i++) { + if (str[i] == '#') { + i++; + textPos[0] = 0; + lines++; + } else { + textPos[0]+=spaceX+1; + } + if (str[i] == '<') { + i += text_iterate_command(str, i, FALSE); + } + get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY); - wideX[lines] = MAX(textPos[0], wideX[lines]); + wideX[lines] = MAX(textPos[0], wideX[lines]); } textPos[0] = -wideX[0]; } lines = 0; gDPLoadTextureBlock_4b(gDisplayListHead++, segmented_to_virtual(small_font), G_IM_FMT_I, 128, 60, G_TX_NOMIRROR | G_TX_CLAMP, G_TX_NOMIRROR | G_TX_CLAMP, 0, 0, 0, 0, 0); - for (i = 0; i < tx; i++) - { - if (str[i] == '#') - { + for (i = 0; i < tx; i++) { + if (str[i] == '#') { i++; lines++; - if (align == PRINT_TEXT_ALIGN_RIGHT) + if (align == PRINT_TEXT_ALIGN_RIGHT) { textPos[0] = -(wideX[lines]); - else + } else { textPos[0] = -(wideX[lines]/2); + } textPos[1] += 12; } - if (str[i] == '<') - { - i+= text_iterate_command(str, i, TRUE); + if (str[i] == '<') { + i += text_iterate_command(str, i, TRUE); } - if (shakeToggle) - { - shakePos[0] = -1+(random_u16() % 2); - shakePos[1] = -1+(random_u16() % 2); - } - else - { + if (shakeToggle) { + shakePos[0] = -1 + (random_u16() % 2); + shakePos[1] = -1 + (random_u16() % 2); + } else { shakePos[0] = 0; shakePos[1] = 0; } - if (waveToggle) - { - wavePos = (sins((gGlobalTimer*3000)+(i*10000)))*2; - } - else - { + if (waveToggle) { + wavePos = (sins((gGlobalTimer * 3000) + (i * 10000))) * 2; + } else { wavePos = 0; } get_char_from_byte(str[i], &textX, &textY, &spaceX, &offsetY); - if (xlu != prevxlu) - { + if (xlu != prevxlu) { prevxlu = xlu; - if (xlu > 250) - { + if (xlu > 250) { gDPSetRenderMode(gDisplayListHead++, G_RM_TEX_EDGE, G_RM_TEX_EDGE2); - } - else - { + } else { gDPSetRenderMode(gDisplayListHead++, G_RM_XLU_SURF, G_RM_XLU_SURF); } } @@ -1010,23 +884,19 @@ void print_small_text(s32 x, s32 y, const char *str, s32 align, s32 amount) gSPDisplayList(gDisplayListHead++, dl_rgba16_text_end); } -void render_multi_image(Texture *image, s32 x, s32 y, s32 width, s32 height, UNUSED s32 scaleX, UNUSED s32 scaleY, s32 mode) -{ +void render_multi_image(Texture *image, s32 x, s32 y, s32 width, s32 height, UNUSED s32 scaleX, UNUSED s32 scaleY, s32 mode) { s32 posW, posH, imW, imH, peakH, maskW, maskH, cycles, num, i, modeSC, mOne; i = 0; num = 256; maskW = 1; maskH = 1; - if (mode == G_CYC_COPY) - { + if (mode == G_CYC_COPY) { gDPSetCycleType(gDisplayListHead++, mode); gDPSetRenderMode(gDisplayListHead++, G_RM_NOOP, G_RM_NOOP2); modeSC = 4; mOne = 1; - } - else - { + } else { gDPSetCycleType(gDisplayListHead++, mode); gDPSetRenderMode(gDisplayListHead++, G_RM_XLU_SURF, G_RM_XLU_SURF2); modeSC = 1; @@ -1034,9 +904,8 @@ void render_multi_image(Texture *image, s32 x, s32 y, s32 width, s32 height, UNU } - //Find how best to seperate the horizontal. Keep going until it finds a whole value. - while (1) - { + // Find how best to seperate the horizontal. Keep going until it finds a whole value. + while (TRUE) { f32 val = (f32)width/(f32)num; if ((s32)val == val && (s32) val >= 1) @@ -1051,28 +920,25 @@ void render_multi_image(Texture *image, s32 x, s32 y, s32 width, s32 height, UNU return; } } - //Find the tile height - imH = 64/(imW/32); //This gets the vertical amount. + // Find the tile height + imH = 64 / (imW / 32); // This gets the vertical amount. num = 2; - //Find the width mask - while (1) - { + // Find the width mask + while (TRUE) { if ((s32) num == imW) break; - num*=2; + num *= 2; maskW++; - if (maskW == 9) - { + if (maskW == 9) { print_text(32,32,"WIDTH MASK FAILURE"); return; } } num = 2; //Find the height mask - while (1) - { + while (TRUE) { if ((s32) num == imH) break; diff --git a/textures/segment2/custom_text.i4.png b/textures/segment2/custom_text.i4.png index 0227ef1b415075ff334f6ca6624efde5b96313fa..bb9be8eef3f6b7d694cf6f9b55598737ecf6bd0c 100644 GIT binary patch literal 16346 zcmeAS@N?(olHy`uVBq!ia0y~yU}#`qV6fp}V_;xdXSV4m1A~@tRY*ihP-3}4K~a8M zW=^U?No7H*LTW{38UsVct+jKrqhu|Gm;BEby)Wcdo@u$u?);mCY4-UmxOxl|3jB9V ze|R`&Rgjjkk z{OR!@zu%8Dud~@-u;SI;LMe^_O ze7Y82Q@ZaC|AVjdP4|6te!BYe&AHQm-28ng{PpKzL!M6)=f?eCX>;+~;x_*KUv972 z^Y2UEwojkGJo}r&`hCyQ{l-OAfB!vvee78I{txTFm*>BiIrVw+@4sK)-rYC<#oVu7 z@88?}#yHLGqSK)(FD0*>7C7&}XMHjE-CYuLy0J6=D@{M~-2bWn!PV^R4AvKx{^N;W zo4jiqZ`rN1?Xk~)Z)kSs$&)-DWBHuz@=|f`;_$l(YHRs_C2v1{=2eQ^TzQ|}&qKfe z()o60TioF}yG7sG=;oJB>yEVh^w|E{a`_w43lrAn%zV%JVCS648!LIv&e`|LEbYj< z<10Q&{CIl)cfHB_d6GSwHaRUxx=|Ou$o)4r=bxDw=cSeJzn9ojX(xWb<&M=SgKNgj zXJ&o9*yM9_XO3>0j!(eji*xzc88e%?nOAy<@9{t5Te!vZoAHCoTl{a ziE**>9m7aPmp|(5P5fJ5BzG7tn~~gUy6s7@hvCvGlN~mu&Tl?xxO`6WNz?6*yfrp1 zndGgxb<3+&>?X;+rq_eAb9<}J*4_D0@|bsR>GfKE+gbCf-Yva;kL{iDp$_F(;TW+sv)s?6`bx_nTd}U$3#f{OkC9`7^U> z)6UMFc}e>7>op&<&goCz&@_34W%8jpoYN%F&tj6fm3eMml5@c<%dSmjNUvHdlQffbEr~UJ{iz8=yIX^ygL$=lE z)zi*>g5S1&DoFfwtlWRuyNzot8V{QKe7du@_~Ok&Y&~H-)l;@*v&>r;di<1~!I|FN z;HNvMJ=NcMHhb;fG~auPGc0}Abvmq?XmX?C(G++8#Ke?O;knjF_GUls410F}YD2=N z^S8zI?6cyot+AE4COJ`MTbAEmYjO8=w^c7}EY98kY*)?9&EH!*)h50XH;z9vtM10l zvY8HVdun?k%kz4U7R?N5)A!@Q;vH%G$?e`*jZ4oqSM%Bi_seZKdZL?MdiG4yy61aN zeyP2^kGXvA!Tvp)?`uvg?(fU*DOBZu^JLR3HGYFvr}@^!MEBMBw|O4;vH1Jlw>rwk zhb`CLa89jyoKYGsz5Vr%>2u|7FK@DbU;Qa9{gY1r-8D1M#FZwLW)l;w8(^r{J{SkTQN>t*f6+9Q;Hw2&R*!OO=(A>H2nX?mGx?Cr}pZ2kIyVbs+ zzcUtxH~*abT3hRARnz)D&WfMMdt{ql+K6++g&p~~_}b2V?PsEsi?qVl+}`0CkaWyQ z$n7|nD8qbRL&5VlK6}QbTZ^Y?uXZF_#6k0ds>IqLtv+~W_eSot@t@rE=ZF!5b54vkDr=4XfJXw}j@BcJ( zr+P_BS9r(9A88+w7Vy3Qn);jdQqN1Ki zKgq^!^9(PA-D@mA>h7JmCGgEG%Lk7;6;4&2o!2QbAtQgsok!o8yVAmnHfsnzuyU~W z*b|kalK$h#-`>{`(pH9WUwZtf^eldvSMdI)GWq8sdRCY8rcBj&@mZ$DvY)eNhS!cy52Ok#f@NpEYCImhb33QS zWX1#0XN?#7?R!xj#&*VKw?lx)e7&N!EgaV#CUzRylyROqeDbBrYPVyvTWmN_uM=1m zD`mD(%QpTZ#uki;=N~eyFkZ~@#8T&!3*+>~CF~i!$JT0pZ*!X5R`zOl$$>nx z*7zN#!WwqYI}@@`?oZQ~f>vAc6o&VQ_ubiQ;KZgn=X3o*%g=l-{z*PRW4+)v@AGA6 zPi;{-#k6>?_m2&__LUb|Pk2u|TX8WrTVTyJ#+|lqWy(M9d_2COll|ZJBW3LTUl=!K zx1L(E)l(yS{R7{CC93OgoPBVKb;)LfNgJR1ZeIA0>m! zv#aH?;RQptsai7=c=Gv~%J;UlbiyPsWsFL5n`<8Yn3!JlaXueu%_ za&eo$7S#AA>A+csHF}E}%~dCz{9@y!xMP9VlBWrVPafu_PWjE4V0xG_cGH~Jj9B3| z??uL|yMD9kdGBk|vVVBN#VV-Hr?WHigQ4)M)#7?72eH`ZK5wz%r`7yH#l}}!JG*TZz?$Lt}vf$kz^vxpey-$Lb_oCyS0p; z5%ab;o0|_DNjYGy^1*EL>&t5MBk!#hXlYci_6};2VfomyZF{AMVkVo;u@r`T-=;I& zef+gEVddnU`!id;`{sQ;VIUc#bRnrgn&-rX@|Cs|`)1ZJcy}u0I*Z=RPQQkTj(o*j zo=t7Gb2Q5TNU(7xyv-2Hw4C_mNO5|$u-r-=Ia|de0^-69p{*Y$e>1<)CG8iHs4#mC z_loW%X+8}t8MRB?4lypY{Tvp*mx##C<=L`?T~in)GE0dYNfd5Nh?c&N{ib2)=ABs=XfN#W-poI z`$9#6z4P25#T^R57M(Yz%ueyxv1-Sk6rbibd^Z^vN?cL%6{tF9d|o^_r81x?Bx0hW zs>9rwIV*YANgjA~(qeg6?+#f@K6MqNa}NBPrUm&+mDcbyMv8B#KUlHm%)vDdQx&dS zS54YCIrLZphxVg$Hn(=Hxgoaj;`YRCg)e#eZ(dSdF)5a7qQduMvpH6`%oi#Y-G6)r z>tmN0CM!IS6)@^645G^SF(QiX>0Ya_s)tey5{m0?S^v zjHMUvEPUg(E=Jpo;Z;IppG6~w!;c>adiPx9uGHNmcKm228;_~a#gG>_OE}j~X*ZSg zDRmV->i)QQE5qX?r7w3DeqN!#`=0goy2bkfVw$Hk>dh3>Q8W2yP%N0#75C&9gR;B8 zWa$IKo7<%JEx5im-a{~^%|d^Mm|CQX)}6H$z3hL^wZ+Td+&Y(+ zRhp|3Ji<%F4>ay}Y5Z>$!kK=&^Wclckq0+Ax*ST{t30JSm*I_I<_2CLeig^A@ZeKZ z)(EM)rD+x}=-p!?*|SSH^nr>C%Zn{D&YIV~GM>|ivF^IMlJR)IX<;U{ZwBlc(QUIe-0n7WhZkoP4w@-R~;`sAz zhu}uWW4zK+7Mv`57q-JtBC`KSLWxbL($VzD^-5<}mmA%Cs+V9mRk<XYjsTE)pfc za3REw^Ez|n<)igsKU1=GnGQNXdZ!?GCqQoWUD{h5hB!;W!2x)9Gk`DdL;t*p8qD1960F$Ev{l1ogTLs#lid!Y z-;Z>Dm{zsaQtQ!;55&{c1`R5fgAe{=FAr9ICwKmnbFL@EX!kw zp;z>#2`0r8OuBxU?CHPJ@H=|S`mUb3a}z>tG6$YqJbMan{-hMHR13`?Z*pB$KmIji zVu~K`lAoP^mzc7um#{9eJs17Gs*~F&H+U)kO`V5pSMdkQ2{6=E?>c&PQkY|m!>7-8 z);ZfRyCC7%wPVI-J+|5Q%NE{QxiKTkC_7#?USUpX&7{dCm66)kLWeD#ex zS8Eg;4Vq^9b=^CE6H`0)lI4@67MQEP`te&KsOozb_Xl5pWBVj`)7k&+->isx#%nDk zyxGQfv+yIHCZT_>w^@AbA1EIvI4s}huKD=eRj!lUyrjz{F3ww^uj<0TX63z^yBHj= zdX+S{G}%sxZq0t7oW@Zvr26^Pl)Ob>&YPUHv3WUF%{SGAXKL2vRm>Y)<&vj~Z3x-P z*%X+>zOZBQ!4DH$f?ta)`>^nId5uFQqt0O^3$w%VF7MX%1_W1SY?57ET5!9opj5@8 zMO;%)!D;nIjVCK_8F?f(eiiq3b~(OBeu>tH0!yh2=Wq8fRutt=-SeR&p<-s^3+KBp ztn}ucdFg)c!IpnMODdFRz0WQYwqhw zzh#5PJ0?%M@<41}N>S5PPP@{DQ$D^ebbcGQ*h7u6XOYv}IIUjcgJ0R54&Cv3lsc*Y z*d&QJ3LQTms+`!h_1BFL<*Bwu>n}9L?bbc^;XB)ojaw={u3RUOZn;mG^BKF=L+^W;|6|a3(^Pj3PH}XwN*}rGO{rIRQuB=eu?0xzE)Hk=wh&?{tdE(Nh z8H<~@eXVGe`(rlOOW{Vd^vBHARtlA=dP3s$(;6OxX3fgaKD*z;_w&SSN31>j5~RvK z|LT~96q-!6ylnAqO;YB~a!IQzr}Za?tWnwQ<+T1Y_f&anwJO=`9 z+%;$IF|&NLMaOGAy_W3%rluL0F=f&v!Si&= zq&r7fE^ga8kLU2ETY_011@0@i&z#Iv?~uurqO3@9{rpvBAepXTPfZuGz zG6th9fggnfjwo-PQ@*D%&U_1Fnl;nP-_}dTKl88n#lGU*gKe6}=gieq>W(cJw2{3b zbu|5q#|jw%>8ST@=M(v57WwCOrd7+o8p5}3Pwi~H56{1W4Wj(I^pXd zadG4A{U3ea?|I|-@_p=^V0PoWeGCWnWp0G7cYN8RtDU{{zNH=CQLn#~-(>%jjK1%< zy7FjPjJ)yQt-EsmU3a!lwHmpf3`C2t~_^;oxc3;5Y8LVleOa3zBc|n zQ=jL@VxyTmU#ECo{cgl%QO>h>OG9VoL;Do@B^MuXUu;qz!fbjX?&w~ZPU)?y zx2X6QonYnAzb3O@xgyTwaNTT`3< zdh(jHlh?Z6f4;2Z&E`|HXGd@N`D@Lmt_uee=7q*R(ObV`iEG@Ugx^^QnB?namejs+ zRa20OTUGXKYtDE1)nIB{*7na|-S^+xU1#?5R9)~qqx;(5%J%38xpF|5NtHdOLxVVzQ+sdx4UE>Z)kjS z>d2?x531O>!nu~PYp}fBzuIBj*}J#4zV$x&bNjBB_thMZ{$5^|YNs8yvf}@`8rHQ( zb_z_+RnwhyZF!`=f{40*iSNYpr={U@qoUVdHoB>DaFXlkJWo#leUFX*)TXCw`nBb1 zk_KPkRMS-}m-rbydzsgv@;dfoosl7PxPOyXRg{xnjLJs#J^uQEl?SRHvNGkHhOd~r zERN}YW_`@M?v!2HKQiuk?_W4ev_$f&^tb7|X7Fy+(`a3?|LyOP3k55eTTd)s?dW~C z^X!S*ci&t>=C~DA{o1z6F)k^8Uh6;gZz1b~o-DPg{Ci|x*y9Dqerr4C7V{p6judw+&CQEv%ZBlMZdaR++n8DgJ%j|_q3h# z>-@d$8Ywfm%9kFpUCp(FOO&BY{Yty$uN7G{t{JOZ_AE-PJ+U%eY{U1gujo$* z{=TPP=)C;3dS9FQ5%up=*Q{Fqbtl6@9p#t#?`D0FdD;A!&qb)Rm3{3UUe0p+LLi`ap}>iSDM~kFMDcaC+m5V=9_Wfu=~+z8C)Wm;-en;KKSJRkaVN@I=kzFd~AHaGkRYQD+u|w?owB# z-_CbSw-w!7I9GRdYxS0S?B`ZYSBssbpndxBvO8zLYsdP{t;z^Bt((zwDR+_}^P&Dl zk$(Cm76JLoJLM1Y_4-9$>~8Ehv&iX*XzeP41;Ue^HKXHtmML#($b7RXZHAZG+t&u} z`zCYx&u()1`NOaMhas!ar|LfAo7&70tHvZoC&$nmIzx%!aw$Za{-+O;-Bpt8pV4t$+MV`J!&c5jk@}Ddf zYXX9gn8+W?7JDPc$1{I*+Wos%ELL~1x+tEEa*>tSE0-@1eH^qR>YQ%W|8=h%TBWwn zXlPc>nVIUW@qCNX&f3!Yn-kVpwVVs>m~zwkg49H3@zk&Dgi|;3%`e;HvT)T&DV0C> zQoinH&@w!-nTKh|Ri(Oa!AcL^t*h^UUw`Us&4q^_9-B!|6rY^b{PIBIH2#I_3a1x0 zEV;|?_+ddz=#ln|IxQJ7e{M3KSg8`1Ij!2`*=j@1Mf-PmWdHN_KGOBF)a*?B^2gGf z8I!CgZ2TaSIDyzc&=R}&?zl>CEzTs_c6s9kclQs9#&D54tZVywtpBpec zdbhNEy18)T66T~Q>z?>b(y8)a(Z2oDy-UmNS6{is-@Gu(P_CfmdFani9qBV?N$^=b ziCo4uy~uT!Lr{J7!b!BuR+g5_@+j;?<9ba}^xk4L4L71xFNH=R7M`%cKeIoIcX z*tviE3e;3{<`unsIAM>X@v6g$YmdA>tGIr`+;1gYk{)|<$m`CXy?^~&;Y%%xZ!LX& zad-I65XtOcPD$>|1y2f;{V}_)nr5EmazF8?Qfh6s#3F0G74yq43uy)fcZ+9yo?>S0 ztGn&3R*UhEKCc*;%7|O0=VBM|ScKYHvtK=DlbDlrKjKxMv25Ig364(^qkpXZ zW12H@t*VWPF{4h(n_Y+Zo@kh@`#AZ}y2SU#7TSxkzi%*~@3v>l`91sQ#+*^V`E>h} zrl+C*8xS@!EQ9TOAxxqOKXnsI8c!~QZhJK0Yy-A_8Q3>T#&dI-2Kwz4sZ zzG%8w@$e4E3B9Wy_{=fQE6odeyWX3Lb^cbL^vx2bRhj=Z?yji5tH?96W1TVIvQwp5 z{To%-U+>==mlbE}+_ikYP3hOE+qZ48TCOYo+ZwIP)x1`*^&E&Ba-p zGp31GvTx-O2w&gy;ab+@*kF~5zr1HJS+{&I2Vctq=I_6EoLd!nUhG`{EUViy*I#+n zsI2?oWaw6F&ToGA!lkc2C&RfqP>l~SP^D(!x?IM}0rCh6*t80oIDbLhir7Do-+;)Vo=yOumUcX6SYpjfB zZ9i>sUs`wKDcj!C-%Dk;WQ)GpwOg_EaJhBHlShX4y8nOQ6}0(B@gc5nv-+MNjuPh- zI%yHMc~<1s!v`N6(byi{*w|%n;9RqZhe>Vg(v(OQ=j_!jPS@NL?^H@@m~A`9P{Xg~ zmRx@0R@71+88_>V4AHCwzjjIAsPXuf==>pm5{C-kDJg-N!eicNC&qEVQdsz48E4F` zNY5SHgBLH|YAEIs?98`<`CzwKs)3kKIMzMzt;m7MrE(#o7+2zk_YUA5l zJtL-_h2!L^Z)W-{c3qowcA}q=DhPi#XSA_=a-$H+Npl%uF^dLQ!T4GyL`pheau|f!nk#-fj8gwT#vvzMXsi2 zRMsp>W_4M$^Zvr4Z^KlUM^Dxa6>lo>47t5?+pnw174Lh`i8lp2e<1U#=>HC5yF-Qai&yaVWt-=F8}=ruefe-`v$5giwlJOJPxNjjZr}2EO3s4Mk!j9zlzSPk zZ8n_B+2Q#~N_~@8Qkan)?ev%!Z#`OnRdw}e*;`ZRFWz`)VvyG6Ilglb zEncyA+Kb%_o@MJEirc&DZ`8lJ(#EVSDnI#Ye&EezI~JLEub^o4ADHSqE~ z{Ut8FQRBTvM!rPSof9FYoz0hdJeNy}a5~KGUS#T?E72NtCaW*uK;h3>Thk*&r!&W_ z-T$Shkp2AC(j_Nd^g{1F-EIB0r!O-}VM5;Hw=X?IUa$IcAYSR!*RXfj$MJ2v3O+}+Sbe8BPikymC`KM3dJ`+c{1Sd$U&qBikU*i#0J zCeik-Sr?w&uep2Y<5J7Be^Qbce4Ae9R(4iBXZyXknXj+Zzj{6CP*8aw=OoWi>D85T zTZ^BD^_Iz(|9CIzpZb4J>4JG@i(amoz1w%A(|*;ukig(nzbkX@^mLq!Vmf8D@bC&f zldW#$ubhtZ>PGnXudyy&IOl;J$MS_o_Y{45p5OFdkNcyP{<2^(qqz%Ym+PshDBW6^ zF7dhOzE+`=^K5UcyN6V4wacuYt51{(?enVGd~WB7kNI&6`+ncnKeN2A@YcTf%f*k( z5!v*ZkH?Yg|B?x{U0h+$)ud!)j;EhDd-|pMY4>+mKo2=<|qtyYGZix z>1CwlwLs(27e^MY+3c{T!26WkqTgD3=Lt@&=(Cw6S#Wf6>AxPOnCyc^rB@TTx@E1_ z;+eZ}Ys)RSb*nEG%y)Wlt6np2)^^h=b>EC898T+wI%d=U?Syq{O%t>CM@P|&^MwIV z6qc`jVKrYn_MS*m2zQdF?^=t}5X-ikdl>?+%82|7&@#IGF01GA#->+gCmombWCl;@ z({plS(6kD3$X*hiy~(R`M`sBe$AJ{~t?QWiMDMsgtmypvD(A?_$y^Jfl)r3E%=tby z>1<|r!<YbmO;o95<~N}eH9niRuawW7 z^gO*JG3#W_y{hvaFO8#nKWHkwzvVgU+TN$)MwN?r7cLS_S@d?!%%>u`udKIkSUNq! zShHR<_xTcz7Yyb5W{Ta|KUMwR9O3OJ%y)>lWfqlI3%pPKtM))Acue?&a%S?lY!F{tWl_ zbg{elxNbJj=j}ItR2liPw|~33ZMXMf@r3iMmaW+o>uR$4<=Z#MIBFkX)-Am6s@3-T zn3D(tpYC)v_qP8TwkPLIp32AE^v-XseMykwY+m#D-ukV(gy5iWWHs!;0 zOXhc1EY4iH8Ss6YO76ZnzN;;xvIFYEZ5axe#o9f!{E@z_-}}U~D--HNoZk5y;+RyX zQY>3p=E*4`TfBHuicPCou9f=S=Zt(&O|H+GuB}W>cWl&hGp`K1d|=Fh)O>yd_%tN!>i${Sc2YzX0*xGZgcML>9JldXbN#?At+i`yKt_i4=9&ojfOY@6ci zmf5Fn9E_38IJ#uJ!0Btpjs)_C_gZmql!V4~a=x6iHgslAM)jF@Az^HdE1c3V1-Qzc zXDf0Mee^(NzHi1Yrwi-mdGsxh*EC$L(60OW)%G9z&o_DH8q9uPR=O*3Dd(S;3onYL z92R+>w*n0$b~p4#zsxtplTf7+`y)I!qr*k!jnn znylF8tk7}Y7PWZpW8W!Lx2Fd*cTbExJ^5V0ZtkBmA7>W2t^c{wtm$&zoE`sTZ6DMz z`OFKGj(&gnbx5?^k{3s$QcfRqca*AlU1l74mEC8fa;GDAf<*j$yTq{7Vr>dMURj!} z=F9sAPtdQpwO7HEX_Cl#6RQPYrmUupwtpjjgwOFj+qfX6d-;Te0#}!Zcy`~K?XXCB zmuQ~kSBsef%w>;Ox0L(2Tvt;6wmR|F4SB1^S&^r?1GxVb-6>&8l@D=Vd8@#^W?Rys zyKY6-bBSeN%2-j`(S0|nRZqcsLApq{t2Jw=@uf$V^P`MXFI~+t znptbZ~rP<^3j`l;jiDlS0(LLw_MIz{_I)Vce#1Of-1G5Q_3gzUr~Ma zSMPG{>j;m_+GgceO=S8KG9$F zu2<39H_c!CR;4?>d;PJ0(~@s@W@bJGVe13Xh=_BLDwanAceVbN&@aUfS!k%6~jAGK9R|Fe0f^ITxnZM}7`d9(z+zZBEj9=qenhP|e9Q|FX6=mjTQ9b)jkEm*&y zuCU+ssP|i&sb&Yv1)aa!mN2cT&B~3ket6O-;^B;)3l>)d3&memR*MPRY8KeP@Urps z+g_iiFV*_I?UGJ1+uHEEZ%ve&C?Q#hDcHJ(X$mN0}+BoK?hY+IKGKChfo_P(lN#rYLBH$FZs zTFLrpPRvG^9arW@>x77ZzE)`M^DMBwfNfgkwsrq&HolnY@vo}R=vAYo{@$AFQS1Ho zy zd$^;(AI8Gs;-Hd=Lhrq~bd&acsE~htx47cHox_UhGqcKim{+AquB`Am^DOMh0qtFa zZT!v>Q)jGHzr-zBaqYToY0zEQ%4y~I=U-j@#Fy=d%cIC;(qbR2K7LuYwD_Jn-^NKx z1m+9(OO`l3a$k2^Z-1elmClDV6DE3|6>RS~nk0QX_l#GYmyN4TU`X$$)-|WOp6i~= z+Iec$_b2*1&$d1_xt`f7cw9-y!>Of5%PgR+RpYIcrdm*m+~*JcR{vCXrWEBiOiY#& zT`@t%{)haZd21tQ%qf`MWVqn-(QWo^jR*8Dtho8@`^H>zKZgIt1xvU7nQCS5*|Tcx zQrEtQeYp=F?OJ-W`oL2@gAYr*+n#vTML8{G*fam4`O}7f(F@YA&W-*ovz*_dEp2NF zvy2Rrvg@h1&lTn2zwi8en|ba%`~0~@J7>)N9l^lBE0GxzQ4-ZxN)4{^3rViZ zPPR-@vbW>1sj#ZZEyztRNmQuF&B-gas<2f8n`@Ot;j4hQnKSxuqjGOvkG!?gBnqkl4h%vQBqQ1rLSLJUanVete0Puu5V~* zX{m2uq;F)TTa=QfTU?n}l31aeSF8*&0%C?sYH@N=W(tB0+w{vfnBtKRGkS z3d}ULG&4_0G&9mQH8Zf(H8Ds_(zP^AOVLeBN;Nh!H8V_1PD(>E$}_LHBrz{J6=YOJ zZh>BAW{Q<%Qi@SZs=1kNie+k=u8D!Mk*=k&iLtI>l7*3ZqJ_CdT8bf(5&lJ)>6v+n zImoU88I_WmVwISdlwxdToT_VTX=0*lVw7T_Yhh}UtecXWY-ya5YG9dWkpea?gxw*c%L z1r2CmYNDzy&qxJ@l!1|c{sAZ=>&TK2K@ltjn z&#U{EeUBS0rEFzeuI;<#_n&Y1)O(7x>dx|S>s=13vM!peuNl7nI*Y?B>6ALD`8WRg zEIpUB$i4rH^7{#DuGRb9kKdpC);?-UUDd7Ax>M3vCw%t`Te`4U<~U>YabmaSJiNAPp+kQX-HFSru_A#lLDXal9uKuy$pPg)U>)5AJyiDO)OzoP1h$sF~j&>Cunp z*M5cVb?cvYu}o*z8sUyL?>oM^A9E4iqNpZNIBQMmjVyW2NH?D?#|3`flYHy0#u<5k zV%7TiE$jOKC*R(-d+WY*S#_0j-%OS&`PH-aO^lqkDN*52xMs+o2#*J)0S=jybRVAh z;o!|6CbEYmVQTJfU9mrJFDWIS>X`iG;`uV8^lkGyPwNWHSH`FPd0zRihbcgWzw_?J z-dTbwx?JZn616Yc9b(>6d$Rkv-#n3Tm2cC3)K4}``t?7is_(Hua{bzSi=Th}Qte^; zt4`bQS>b*b?`GCk z_g00^vMpgPO&8zZxcK%$;1V6B2(c*hB-yk#3TZzk3o>MWUYRNxlF24`ta@X?6wecJ z>{fDIl9yw+LKX=8OK)xXygt>JLw?87wG)4JFr;p*%3rU1$xghf>*HCO|K(m0ZnNe| zvbmL=u5+FdDH!JV>-f*@6ArYptlKoH5Qy=X>1!?54I#ZVa3_Z90`2Lw+ z&CjzaWh;8U_uY`%q$~W+GU;XwW9Q6pzPCzGAI3P8FkRg9-zRRLYy8BZ)@}BOPdfYV zDAQB$-kWA@Vb~eA3S-Px_S)TIz@S^f^=G7bDT>R!H zX!yQ1qkhfhqoQx)rPx=LRV;d&x|p}0EjPHBVfC$g*Po`l8;uKES9GrRnz?%pL&h^+ z({#DL&po5Rgq@3fCT1k}eDU#?b^p=*X<4R+`2IBxtG~b4%e`R2_wQDm z)eiZZj}_mYNcG;VGqprIo+>mMJ8VsS>wsm^XyCYmwPOpUjsFy1RrQIcHjHjeD9;V z)&h_JTeM%!O53)zS1j)R#l@!&z1X;6qV$$M=}YQgxQQ6;%lN-URcL2%z-GJr=BdGF zs^2F6dD4HZf4c|w`8)T&i+g41CrsVtaj+}H?VF0$x1hZ9Ndf<>ub+Hg&2lZ0@!uKe z!Y^`6=c3;)F@Br;|4k;l^F2=c>xW!;Gd9h!kh6+*N=Ve0;wQv*@3?&8gA=|pGu-&s zKd!70)cJGuycGYIlWw+!S_XkvjJrL|_`T(i{#v>t#@l>#!?cO%+}ZsO*GqUr ev za&s`z<+-XBf2!){Nom&EsTY20%5`PP9shWl z-NAonhR5_$1Lm1)CgvueKfj>%+lQ+Bm8*Ab-tM$v?dc_|Qn`QY3z!7;_s)OukY~a5 z6{$ukCdJ;<1z%6!s>2^$ylKrhK{or#7r(sPvqp0r$D=rhYlq#hE3EC4*Ile$Zo<2z z?6;0Ocjo<5?iEYFEv}vTjq6v$(fiyBET2qV;=X$E)aOiV&b!aw`}@~K!*fCmB`+my zZwnmi+irgB)Ow3&H$NA4Cmny^Gc~^Sf5NkxKg>6ueJnO9zun2ez`)??>gTe~DWM4f Dz~{af delta 1856 zcmcare~xd0ay`4Kr;B4q#hka%oOw?ScuxP1zdHYm=I$3sp#>5_lOD%hKGtwS&93C) zq&HhmZ_=rk+r?g6SNCsme?R}ve+v6f+qd1Aa5Mb=b>sc+kA7N&ecjlUw^oneOsv09 z_entUD%1X=f79x=^ln2A5be_DEY*KwJr1@D}ltz4H*_^^+;UgnPLse&D0XObm% zpI1JzXVv$+hN27s_owPRFPyQW?7@mld3$c(&0D_n`^-s^B{v@xsOB#_EXJ^bf7RKE zj0}B{~-!?a-cy^gr6&;GvNd7;q)=J}J_Z=ZPg-lZXuA><#Y!@fP~?Kx{1ty+7cR^L)oW(Y{E5)rv8Vj}g= znqh_~qu|_CKehjdEN|drn3A;d+6u?{nY+G;{t4jA(Oy{K-2eenC1QO$hdP z(WN_vVdBy56;6G;#jb)Urhd7{@Is{WYB8%u&3lIMlLng(ihaG<#=A(V<@VJZcdARD z6eh=X6o1;(;}sScZ@NA2`82-Du-Elnv+Y?JzH1Al9Y4_ax2XQG-IvENix}mq7(VQ4 zQ4C)?+k?@)#;uN_fO*xcsqbDs3S#KFry72rvB2jWyYf}vsm5~RE7qMjS#iXsyyt20 z_AGlghMWa&Bo03JE9K*TUdr>3p&`+9^&Vs92j=!JD0L{cw%C2`-^6qL3>L>%tPhY?)=)mr;83fY z{Jfx}pQ-1fbJFrp(=yg@ge0$CeX6g}dO^YN>A|5U)6HaFOx0O&Ua?8KW3I%cx&NZlZm0P_qd5QZQdF>b-pX_^EWGXy{DXg{|+GMb9Hvs20ve4O7aaJI$KX)i zt@PKHVS?qni@mSkYyRKOw7??m`@fHhob`%EKD+k+3JlHs7H%FY`Yw-4lA*8tktH+3 z@%=>tr#szm`P6NhxM}Sp|My}$CHT(qtXbE-xw`S<^DOn1O74~t#~*w?q3X}tFq7k; zc*I6ORr}wonH?^fhi`Hc;5K-rU|P?@FtuswpT7GV3{&RCGJM$1&E}xC|CM{>BGqr- z>Mz`^XFZU?7s6DydQO=-!-k3H*%&^jGHmFLKURG2gYE8PwwE6STGcdHh z&3kf7m?4zq#EO+*kO0-T9CpEmlKi<7WG^F z9kpy+oLMV+Zb|0(JX>(?PoLt{z`Hhe(-|8|!~gCOW3HDmpEyfCS(d@-6TAP>-HF?8 zEhu09M&xsV=X7p^w|}&%Y`!!z7O)>Wws7aF#-@