Safariminer 527b73afb5 rebase
2025-09-19 14:33:07 -04:00

141 lines
4.0 KiB
C++

#include "Engine.h"
#include <raylib.h>
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <stdarg.h>
#include <stddef.h>
#include <stdexcept>
#include <vector>
#include <memory>
#include <string>
#include <array>
#include "Chai.h"
std::string Logs;
int LogsSize;
std::string exec(const char* cmd) {
std::array<char, 128> buffer;
std::string result;
std::unique_ptr<FILE, decltype(&_pclose)> pipe(_popen(cmd, "r"), _pclose);
if (!pipe) {
throw std::runtime_error("popen() failed!");
}
while (fgets(buffer.data(), buffer.size(), pipe.get()) != nullptr) {
result += buffer.data();
}
return result;
}
VITAL_FUNC MassShoot::Engine::Puts(std::string text) {
Logs += text;
LogsSize++;
for (int i = 0; i < text.size(); i++) {
if (text.at(i) == '\n')
LogsSize++;
}
Logs += "\n";
}
VITAL_FUNC MassShoot::Engine::Log(int msgType, const char* text, va_list args)
{
char timeStr[64] = { 0 };
time_t now = time(NULL);
struct tm* tm_info = localtime(&now);
strftime(timeStr, sizeof(timeStr), "%Y-%m-%d %H:%M:%S", tm_info);
printf("[%s] ", timeStr);
std::string newLogLine;
newLogLine += TextFormat("[%s] ", timeStr);
switch (msgType)
{
case LOG_INFO:
printf("Info : ");
newLogLine += "Info : ";
break;
case LOG_ERROR:
printf("ERROR : ");
newLogLine += "ERROR : ";
break;
case LOG_WARNING:
printf("Warn : ");
newLogLine += "Warn : ";
break;
case LOG_DEBUG:
printf("DEBUG : ");
newLogLine += "DEBUG : ";
break;
default:
break;
}
vprintf(text, args);
char buffer[256];
vsnprintf(buffer, 256, text, args);
newLogLine += buffer;
// system(TextFormat("echo %s\"%s\" > log.txt", exec("type log.txt").c_str(), newLogLine.c_str()));
newLogLine += "\n";
Logs += newLogLine;
for(int i = 0; i < newLogLine.size(); i++){
if(newLogLine.at(i) == '\n')
LogsSize++;
}
printf("\n");
}
Font consoleFont;
VITAL_FUNC MassShoot::Engine::InitEngine(int width, int height, int fps, std::string title)
{
SetTraceLogCallback(Log);
SetConfigFlags(FLAG_WINDOW_RESIZABLE);
SetConfigFlags(FLAG_MSAA_4X_HINT);
InitWindow(width, height, title.c_str());
SetTargetFPS(fps);
consoleFont = LoadFontEx("massshoot/sys/CozetteVector.otf", 100, 0, 360);
InitAudioDevice();
}
bool consoleRender;
int consoleYOffset = 0;
std::string command;
int backspaceFrames = 0;
VITAL_FUNC MassShoot::Engine::Console()
{
if (IsKeyPressed(KEY_BACKSLASH)) consoleRender = !consoleRender;
if (consoleRender) {
DrawRectangle(0, 0, GetScreenWidth(), 500 + consoleYOffset, {100,100,100,100});
DrawTextEx(consoleFont, Logs.c_str(), { 3, (float)500 - (30 * LogsSize) + consoleYOffset+3 }, 20, 0, BLACK);
DrawTextEx(consoleFont, Logs.c_str(), { 0, (float)500 - (30 * LogsSize) + consoleYOffset }, 20, 0, WHITE);
DrawRectangle(0, 500 + consoleYOffset, GetScreenWidth(), 30, BLACK);
DrawRectangleLines(0, 500 + consoleYOffset, GetScreenWidth(), 30, WHITE);
DrawTextEx(consoleFont, command.c_str(), { 0, (float)500 + consoleYOffset }, 20, 0, WHITE);
consoleYOffset += GetMouseWheelMove() * 10;
if (IsKeyPressed(KEY_HOME)) consoleYOffset = 0;
int key = GetCharPressed();
if ((key >= 32) && (key <= 125))
{
command += (char)key;
}
if (IsKeyDown(KEY_BACKSPACE) && command.size() != 0) {
if(backspaceFrames == 0 || backspaceFrames > 30)
command.pop_back();
backspaceFrames++;
}
else {
backspaceFrames = 0;
}
if (IsKeyPressed(KEY_ENTER)) {
MassShoot::Engine::Puts("> " + command);
MassShoot::Scripting::ChaiEval(command);
command = "";
}
}
}