mirror of
https://github.com/ondra-novak/gates_of_skeldal.git
synced 2025-07-04 21:50:38 -04:00
91 lines
2.4 KiB
C++
91 lines
2.4 KiB
C++
#include <iostream>
|
|
#include <filesystem>
|
|
#include <regex>
|
|
#include <string>
|
|
#include <optional>
|
|
#include <memman.h>
|
|
|
|
int findMaxDumpNumber(const std::string &directoryPath) {
|
|
namespace fs = std::filesystem;
|
|
std::regex pattern(R"(dump(\d{4})\.bmp)");
|
|
int maxNumber = -1;
|
|
|
|
for (const auto &entry : fs::directory_iterator(directoryPath)) {
|
|
if (entry.is_regular_file()) {
|
|
std::smatch match;
|
|
std::string fileName = entry.path().filename().string();
|
|
|
|
if (std::regex_match(fileName, match, pattern)) {
|
|
int number = std::stoi(match[1]); // Extrahujeme číslo NNNN
|
|
if (number > maxNumber) {
|
|
maxNumber = number; // Aktualizujeme maximální číslo
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
return maxNumber;
|
|
}
|
|
|
|
extern "C" {
|
|
void save_dump(const uint16_t *screen_addr,
|
|
unsigned int width,
|
|
unsigned int height,
|
|
unsigned int linelen);
|
|
}
|
|
|
|
void save_dump(const uint16_t *screen_addr,
|
|
unsigned int width,
|
|
unsigned int height,
|
|
unsigned int linelen) {
|
|
static int dump_counter = -1;
|
|
FILE *f;
|
|
int i, r, g, b, x, y;
|
|
const uint16_t *a;
|
|
char c[20];
|
|
|
|
if (dump_counter == -1) {
|
|
dump_counter = findMaxDumpNumber(".");
|
|
SEND_LOG("(DUMP) Dump counter sets to %d", dump_counter, 0);
|
|
}
|
|
sprintf(c, "dump%04d.bmp", ++dump_counter);
|
|
SEND_LOG("(DUMP) Saving screen shot named '%s'", c, 0);
|
|
f = fopen(c, "wb");
|
|
fputc('B', f);
|
|
fputc('M', f);
|
|
i = width * height * 3 + 0x36;
|
|
fwrite(&i, 1, 4, f);
|
|
i = 0;
|
|
fwrite(&i, 1, 4, f);
|
|
i = 0x36;
|
|
fwrite(&i, 1, 4, f);
|
|
i = 0x28;
|
|
fwrite(&i, 1, 4, f);
|
|
i = width;
|
|
fwrite(&i, 1, 4, f);
|
|
i = height;
|
|
fwrite(&i, 1, 4, f);
|
|
i = 1;
|
|
fwrite(&i, 1, 2, f);
|
|
i = 24;
|
|
fwrite(&i, 1, 2, f);
|
|
i = 0;
|
|
fwrite(&i, 1, 4, f);
|
|
i = width * height * 3;
|
|
fwrite(&i, 1, 4, f);
|
|
for (i = 4, r = 0; i > 0; i--)
|
|
fwrite(&r, 1, 4, f);
|
|
for (y = height; y > 0; y--) {
|
|
const uint16_t *scr = screen_addr;
|
|
a = scr + (y - 1) * linelen;
|
|
for (x = 0; (unsigned int)x < width; x++) {
|
|
i = a[x];
|
|
b = (i & 0x1f) << 3;
|
|
g = (i & 0x7ff) >> 3;
|
|
r = i >> 8;
|
|
i = ((r * 256) + g) * 256 + b;
|
|
fwrite(&i, 1, 3, f);
|
|
}
|
|
}
|
|
fclose(f);
|
|
}
|