fase 1: jail i game a c++ idiomàtic (raii, info::ctx, cheats arreglats)
This commit is contained in:
@@ -17,113 +17,131 @@
|
||||
#include <pwd.h>
|
||||
#endif
|
||||
|
||||
#define DEFAULT_FILENAME "data.jf2"
|
||||
#define DEFAULT_FOLDER "data/"
|
||||
#define CONFIG_FILENAME "config.txt"
|
||||
namespace {
|
||||
|
||||
struct file_t {
|
||||
constexpr const char* DEFAULT_FILENAME = "data.jf2";
|
||||
constexpr const char* DEFAULT_FOLDER = "data/";
|
||||
|
||||
struct file_entry {
|
||||
std::string path;
|
||||
uint32_t size;
|
||||
uint32_t offset;
|
||||
};
|
||||
|
||||
std::vector<file_t> toc;
|
||||
|
||||
/* El std::map me fa coses rares, vaig a usar un good old std::vector amb una estructura key,value propia i au, que sempre funciona */
|
||||
struct keyvalue_t {
|
||||
std::string key, value;
|
||||
struct keyvalue {
|
||||
std::string key;
|
||||
std::string value;
|
||||
};
|
||||
|
||||
char* resource_filename = NULL;
|
||||
char* resource_folder = NULL;
|
||||
std::vector<file_entry> toc;
|
||||
std::vector<keyvalue> config;
|
||||
|
||||
std::string resource_filename;
|
||||
std::string resource_folder;
|
||||
std::string config_folder;
|
||||
int file_source = SOURCE_FILE;
|
||||
char scratch[255];
|
||||
static std::string config_folder;
|
||||
std::vector<keyvalue_t> config;
|
||||
|
||||
void file_setresourcefilename(const char* str) {
|
||||
if (resource_filename != NULL) free(resource_filename);
|
||||
resource_filename = (char*)malloc(strlen(str) + 1);
|
||||
strcpy(resource_filename, str);
|
||||
}
|
||||
|
||||
void file_setresourcefolder(const char* str) {
|
||||
if (resource_folder != NULL) free(resource_folder);
|
||||
resource_folder = (char*)malloc(strlen(str) + 1);
|
||||
strcpy(resource_folder, str);
|
||||
}
|
||||
|
||||
void file_setsource(const int src) {
|
||||
file_source = src % 2; // mod 2 so it always is a valid value, 0 (file) or 1 (folder)
|
||||
if (src == SOURCE_FOLDER && resource_folder == NULL) file_setresourcefolder(DEFAULT_FOLDER);
|
||||
}
|
||||
|
||||
bool file_getdictionary() {
|
||||
if (resource_filename == NULL) file_setresourcefilename(DEFAULT_FILENAME);
|
||||
bool dictionary_loaded() {
|
||||
if (resource_filename.empty()) resource_filename = DEFAULT_FILENAME;
|
||||
|
||||
std::ifstream fi(resource_filename, std::ios::binary);
|
||||
if (!fi.is_open()) return false;
|
||||
|
||||
char header[4];
|
||||
fi.read(header, 4);
|
||||
uint32_t num_files, toc_offset;
|
||||
fi.read((char*)&num_files, 4);
|
||||
fi.read((char*)&toc_offset, 4);
|
||||
fi.read(reinterpret_cast<char*>(&num_files), 4);
|
||||
fi.read(reinterpret_cast<char*>(&toc_offset), 4);
|
||||
fi.seekg(toc_offset);
|
||||
|
||||
for (uint32_t i = 0; i < num_files; ++i) {
|
||||
uint32_t file_offset, file_size;
|
||||
fi.read((char*)&file_offset, 4);
|
||||
fi.read((char*)&file_size, 4);
|
||||
fi.read(reinterpret_cast<char*>(&file_offset), 4);
|
||||
fi.read(reinterpret_cast<char*>(&file_size), 4);
|
||||
uint8_t path_size;
|
||||
fi.read((char*)&path_size, 1);
|
||||
fi.read(reinterpret_cast<char*>(&path_size), 1);
|
||||
char file_name[256];
|
||||
fi.read(file_name, path_size);
|
||||
file_name[path_size] = 0;
|
||||
std::string filename = file_name;
|
||||
toc.push_back({filename, file_size, file_offset});
|
||||
toc.push_back({std::string(file_name), file_size, file_offset});
|
||||
}
|
||||
fi.close();
|
||||
return true;
|
||||
}
|
||||
|
||||
char* file_getfilenamewithfolder(const char* filename) {
|
||||
strcpy(scratch, resource_folder);
|
||||
strcat(scratch, filename);
|
||||
return scratch;
|
||||
std::string filename_with_folder(const char* filename) {
|
||||
return resource_folder + filename;
|
||||
}
|
||||
|
||||
void load_config_values() {
|
||||
config.clear();
|
||||
const std::string config_file = config_folder + "/config.txt";
|
||||
std::ifstream fi(config_file);
|
||||
if (!fi.is_open()) return;
|
||||
|
||||
std::string line;
|
||||
while (std::getline(fi, line)) {
|
||||
const auto eq = line.find('=');
|
||||
if (eq == std::string::npos) continue;
|
||||
config.push_back({line.substr(0, eq), line.substr(eq + 1)});
|
||||
}
|
||||
}
|
||||
|
||||
void save_config_values() {
|
||||
const std::string config_file = config_folder + "/config.txt";
|
||||
std::ofstream fo(config_file);
|
||||
if (!fo.is_open()) return;
|
||||
for (const auto& pair : config) {
|
||||
fo << pair.key << '=' << pair.value << '\n';
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
void file_setresourcefilename(const char* str) {
|
||||
resource_filename = str;
|
||||
}
|
||||
|
||||
void file_setresourcefolder(const char* str) {
|
||||
resource_folder = str;
|
||||
}
|
||||
|
||||
void file_setsource(const int src) {
|
||||
file_source = src % 2;
|
||||
if (src == SOURCE_FOLDER && resource_folder.empty()) file_setresourcefolder(DEFAULT_FOLDER);
|
||||
}
|
||||
|
||||
FILE* file_getfilepointer(const char* resourcename, int& filesize, const bool binary) {
|
||||
if (file_source == SOURCE_FILE and toc.size() == 0) {
|
||||
if (not file_getdictionary()) file_setsource(SOURCE_FOLDER);
|
||||
if (file_source == SOURCE_FILE && toc.empty()) {
|
||||
if (!dictionary_loaded()) file_setsource(SOURCE_FOLDER);
|
||||
}
|
||||
|
||||
FILE* f;
|
||||
FILE* f = nullptr;
|
||||
|
||||
if (file_source == SOURCE_FILE) {
|
||||
bool found = false;
|
||||
uint32_t count = 0;
|
||||
while (!found && count < toc.size()) {
|
||||
found = (std::string(resourcename) == toc[count].path);
|
||||
if (!found) count++;
|
||||
const std::string name(resourcename);
|
||||
size_t count = 0;
|
||||
for (; count < toc.size(); ++count) {
|
||||
if (toc[count].path == name) break;
|
||||
}
|
||||
|
||||
if (!found) {
|
||||
if (count == toc.size()) {
|
||||
perror("El recurs no s'ha trobat en l'arxiu de recursos");
|
||||
exit(1);
|
||||
}
|
||||
|
||||
filesize = toc[count].size;
|
||||
filesize = static_cast<int>(toc[count].size);
|
||||
|
||||
f = fopen(resource_filename, binary ? "rb" : "r");
|
||||
if (not f) {
|
||||
f = fopen(resource_filename.c_str(), binary ? "rb" : "r");
|
||||
if (!f) {
|
||||
perror("No s'ha pogut obrir l'arxiu de recursos");
|
||||
exit(1);
|
||||
}
|
||||
fseek(f, toc[count].offset, SEEK_SET);
|
||||
} else {
|
||||
f = fopen(file_getfilenamewithfolder(resourcename), binary ? "rb" : "r");
|
||||
const std::string full = filename_with_folder(resourcename);
|
||||
f = fopen(full.c_str(), binary ? "rb" : "r");
|
||||
if (!f) return nullptr;
|
||||
fseek(f, 0, SEEK_END);
|
||||
filesize = ftell(f);
|
||||
filesize = static_cast<int>(ftell(f));
|
||||
fseek(f, 0, SEEK_SET);
|
||||
}
|
||||
return f;
|
||||
@@ -131,15 +149,16 @@ FILE* file_getfilepointer(const char* resourcename, int& filesize, const bool bi
|
||||
|
||||
char* file_getfilebuffer(const char* resourcename, int& filesize, const bool zero_terminate) {
|
||||
FILE* f = file_getfilepointer(resourcename, filesize, true);
|
||||
char* buffer = (char*)malloc(zero_terminate ? filesize : filesize + 1);
|
||||
if (!f) return nullptr;
|
||||
char* buffer = static_cast<char*>(malloc(zero_terminate ? filesize + 1 : filesize));
|
||||
fread(buffer, filesize, 1, f);
|
||||
if (zero_terminate) buffer[filesize] = 0;
|
||||
fclose(f);
|
||||
return buffer;
|
||||
}
|
||||
|
||||
// Crea la carpeta del sistema donde guardar datos.
|
||||
// Acepta rutas con subdirectorios (ej: "jailgames/aee") y crea toda la jerarquía.
|
||||
// Crea la carpeta del sistema on guardar les dades.
|
||||
// Accepta rutes amb subdirectoris (ex: "jailgames/aee") i crea tota la jerarquia.
|
||||
void file_setconfigfolder(const char* foldername) {
|
||||
#ifdef _WIN32
|
||||
config_folder = std::string(getenv("APPDATA")) + "/" + foldername;
|
||||
@@ -157,62 +176,32 @@ void file_setconfigfolder(const char* foldername) {
|
||||
}
|
||||
|
||||
const char* file_getconfigfolder() {
|
||||
static std::string folder;
|
||||
thread_local std::string folder;
|
||||
folder = config_folder + "/";
|
||||
return folder.c_str();
|
||||
}
|
||||
|
||||
void file_loadconfigvalues() {
|
||||
config.clear();
|
||||
std::string config_file = config_folder + "/config.txt";
|
||||
FILE* f = fopen(config_file.c_str(), "r");
|
||||
if (!f) return;
|
||||
|
||||
char line[1024];
|
||||
while (fgets(line, sizeof(line), f)) {
|
||||
char* value = strchr(line, '=');
|
||||
if (value) {
|
||||
*value = '\0';
|
||||
value++;
|
||||
value[strlen(value) - 1] = '\0';
|
||||
config.push_back({line, value});
|
||||
}
|
||||
}
|
||||
fclose(f);
|
||||
}
|
||||
|
||||
void file_saveconfigvalues() {
|
||||
std::string config_file = config_folder + "/config.txt";
|
||||
FILE* f = fopen(config_file.c_str(), "w");
|
||||
if (f) {
|
||||
for (auto pair : config) {
|
||||
fprintf(f, "%s=%s\n", pair.key.c_str(), pair.value.c_str());
|
||||
}
|
||||
fclose(f);
|
||||
}
|
||||
}
|
||||
|
||||
const char* file_getconfigvalue(const char* key) {
|
||||
if (config.empty()) file_loadconfigvalues();
|
||||
for (auto pair : config) {
|
||||
if (pair.key == std::string(key)) {
|
||||
strcpy(scratch, pair.value.c_str());
|
||||
return scratch;
|
||||
if (config.empty()) load_config_values();
|
||||
for (const auto& pair : config) {
|
||||
if (pair.key == key) {
|
||||
thread_local std::string value_cache;
|
||||
value_cache = pair.value;
|
||||
return value_cache.c_str();
|
||||
}
|
||||
}
|
||||
return NULL;
|
||||
return nullptr;
|
||||
}
|
||||
|
||||
void file_setconfigvalue(const char* key, const char* value) {
|
||||
if (config.empty()) file_loadconfigvalues();
|
||||
if (config.empty()) load_config_values();
|
||||
for (auto& pair : config) {
|
||||
if (pair.key == std::string(key)) {
|
||||
if (pair.key == key) {
|
||||
pair.value = value;
|
||||
file_saveconfigvalues();
|
||||
save_config_values();
|
||||
return;
|
||||
}
|
||||
}
|
||||
config.push_back({key, value});
|
||||
file_saveconfigvalues();
|
||||
return;
|
||||
config.push_back({std::string(key), std::string(value)});
|
||||
save_config_values();
|
||||
}
|
||||
|
||||
@@ -1,42 +1,54 @@
|
||||
#include "core/jail/jgame.hpp"
|
||||
|
||||
bool eixir = false;
|
||||
Uint32 updateTicks = 0;
|
||||
Uint32 updateTime = 0;
|
||||
Uint32 cycle_counter = 0;
|
||||
|
||||
void JG_Init() {
|
||||
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
|
||||
// SDL_WM_SetCaption( title, NULL );
|
||||
updateTime = SDL_GetTicks();
|
||||
}
|
||||
|
||||
void JG_Finalize() {
|
||||
SDL_Quit();
|
||||
}
|
||||
|
||||
void JG_QuitSignal() {
|
||||
eixir = true;
|
||||
}
|
||||
|
||||
bool JG_Quitting() {
|
||||
return eixir;
|
||||
}
|
||||
|
||||
void JG_SetUpdateTicks(Uint32 milliseconds) {
|
||||
updateTicks = milliseconds;
|
||||
}
|
||||
|
||||
bool JG_ShouldUpdate() {
|
||||
if (SDL_GetTicks() - updateTime > updateTicks) {
|
||||
updateTime = SDL_GetTicks();
|
||||
cycle_counter++;
|
||||
return true;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
Uint32 JG_GetCycleCounter() {
|
||||
return cycle_counter;
|
||||
}
|
||||
#include "core/jail/jgame.hpp"
|
||||
|
||||
namespace {
|
||||
|
||||
bool quitting = false;
|
||||
Uint32 update_ticks = 0;
|
||||
Uint32 update_time = 0;
|
||||
Uint32 cycle_counter = 0;
|
||||
Uint32 last_delta_time = 0;
|
||||
|
||||
} // namespace
|
||||
|
||||
void JG_Init() {
|
||||
SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO);
|
||||
update_time = SDL_GetTicks();
|
||||
last_delta_time = update_time;
|
||||
}
|
||||
|
||||
void JG_Finalize() {
|
||||
SDL_Quit();
|
||||
}
|
||||
|
||||
void JG_QuitSignal() {
|
||||
quitting = true;
|
||||
}
|
||||
|
||||
bool JG_Quitting() {
|
||||
return quitting;
|
||||
}
|
||||
|
||||
void JG_SetUpdateTicks(Uint32 milliseconds) {
|
||||
update_ticks = milliseconds;
|
||||
}
|
||||
|
||||
bool JG_ShouldUpdate() {
|
||||
const Uint32 now = SDL_GetTicks();
|
||||
if (now - update_time > update_ticks) {
|
||||
update_time = now;
|
||||
cycle_counter++;
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
Uint32 JG_GetCycleCounter() {
|
||||
return cycle_counter;
|
||||
}
|
||||
|
||||
Uint32 JG_GetDeltaMs() {
|
||||
const Uint32 now = SDL_GetTicks();
|
||||
const Uint32 delta = now - last_delta_time;
|
||||
last_delta_time = now;
|
||||
return delta;
|
||||
}
|
||||
|
||||
@@ -14,3 +14,7 @@ void JG_SetUpdateTicks(Uint32 milliseconds);
|
||||
bool JG_ShouldUpdate();
|
||||
|
||||
Uint32 JG_GetCycleCounter();
|
||||
|
||||
// Temps transcorregut (en ms) des de l'última crida a JG_GetDeltaMs.
|
||||
// Helper per a la migració progressiva a time-based (Fase 4+).
|
||||
Uint32 JG_GetDeltaMs();
|
||||
|
||||
@@ -1,39 +1,63 @@
|
||||
#include "core/jail/jinput.hpp"
|
||||
|
||||
#include <string>
|
||||
#include <cstring>
|
||||
|
||||
#include "core/system/director.hpp"
|
||||
|
||||
namespace {
|
||||
|
||||
// keystates és actualitzat per SDL internament. Des del joc només fem lectures.
|
||||
const bool* keystates = nullptr;
|
||||
Uint8 cheat[5];
|
||||
bool key_pressed = false;
|
||||
int waitTime = 0;
|
||||
|
||||
void JI_DisableKeyboard(Uint32 time) {
|
||||
waitTime = time;
|
||||
// Buffer dels últims 5 caràcters tecle. Emmagatzemem caràcters ASCII
|
||||
// lowercase (traduïts des de SDL_Scancode) per a poder comparar directament
|
||||
// amb les cadenes dels cheats ("reviu", "alone", "obert").
|
||||
Uint8 cheat[5] = {0, 0, 0, 0, 0};
|
||||
|
||||
bool key_pressed = false;
|
||||
|
||||
// Temps restant en mil·lisegons durant el qual JI_KeyPressed/JI_AnyKey
|
||||
// retornen false. Utilitzat per a evitar que pulsacions fortuïtes
|
||||
// saltin cinemàtiques al començament.
|
||||
float wait_ms = 0.0f;
|
||||
|
||||
// Per a calcular el delta entre crides a JI_Update sense que els callers
|
||||
// hagen de passar-lo explícitament. Es reinicia a la primera crida.
|
||||
Uint64 last_update_tick = 0;
|
||||
|
||||
bool input_blocked = false;
|
||||
|
||||
Uint8 virtual_keystates[JI_VSRC_COUNT][SDL_SCANCODE_COUNT] = {{0}};
|
||||
|
||||
Uint8 scancode_to_ascii(Uint8 scancode) {
|
||||
if (scancode >= SDL_SCANCODE_A && scancode <= SDL_SCANCODE_Z) {
|
||||
return static_cast<Uint8>('a' + (scancode - SDL_SCANCODE_A));
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
static bool input_blocked = false;
|
||||
} // namespace
|
||||
|
||||
void JI_DisableKeyboard(Uint32 time) {
|
||||
wait_ms = static_cast<float>(time);
|
||||
}
|
||||
|
||||
void JI_SetInputBlocked(bool blocked) {
|
||||
input_blocked = blocked;
|
||||
}
|
||||
|
||||
static Uint8 virtual_keystates[JI_VSRC_COUNT][SDL_SCANCODE_COUNT] = {{0}};
|
||||
|
||||
void JI_SetVirtualKey(int scancode, int source, bool pressed) {
|
||||
if (scancode < 0 || scancode >= SDL_SCANCODE_COUNT) return;
|
||||
if (source < 0 || source >= JI_VSRC_COUNT) return;
|
||||
virtual_keystates[source][scancode] = pressed ? 1 : 0;
|
||||
}
|
||||
|
||||
void JI_moveCheats(Uint8 new_key) {
|
||||
void JI_moveCheats(Uint8 scancode) {
|
||||
cheat[0] = cheat[1];
|
||||
cheat[1] = cheat[2];
|
||||
cheat[2] = cheat[3];
|
||||
cheat[3] = cheat[4];
|
||||
cheat[4] = new_key;
|
||||
cheat[4] = scancode_to_ascii(scancode);
|
||||
}
|
||||
|
||||
void JI_Update() {
|
||||
@@ -43,14 +67,22 @@ void JI_Update() {
|
||||
keystates = SDL_GetKeyboardState(NULL);
|
||||
}
|
||||
|
||||
if (waitTime > 0) waitTime--;
|
||||
const Uint64 now = SDL_GetTicks();
|
||||
if (last_update_tick == 0) last_update_tick = now;
|
||||
const float delta_ms = static_cast<float>(now - last_update_tick);
|
||||
last_update_tick = now;
|
||||
|
||||
if (wait_ms > 0.0f) {
|
||||
wait_ms -= delta_ms;
|
||||
if (wait_ms < 0.0f) wait_ms = 0.0f;
|
||||
}
|
||||
|
||||
// Consumim el flag de "alguna tecla no-GUI polsada" del director
|
||||
key_pressed = Director::get()->consumeKeyPressed();
|
||||
}
|
||||
|
||||
bool JI_KeyPressed(int key) {
|
||||
if (waitTime > 0 || keystates == nullptr) return false;
|
||||
if (wait_ms > 0.0f || keystates == nullptr) return false;
|
||||
// Input bloquejat (p.ex. menú flotant obert)
|
||||
if (input_blocked) return false;
|
||||
// ESC bloquejada pel Director (primera pulsació mostra notificació)
|
||||
@@ -64,13 +96,17 @@ bool JI_KeyPressed(int key) {
|
||||
}
|
||||
|
||||
bool JI_CheatActivated(const char* cheat_code) {
|
||||
bool found = true;
|
||||
for (size_t i = 0; i < strlen(cheat_code); i++) {
|
||||
if (cheat[i] != cheat_code[i]) found = false;
|
||||
const size_t len = std::strlen(cheat_code);
|
||||
if (len > sizeof(cheat)) return false;
|
||||
// Compara contra els últims `len` caràcters del buffer. El buffer té
|
||||
// mida fixa 5 i acumula sempre el darrer tecle a la posició 4.
|
||||
const size_t offset = sizeof(cheat) - len;
|
||||
for (size_t i = 0; i < len; i++) {
|
||||
if (cheat[offset + i] != static_cast<Uint8>(cheat_code[i])) return false;
|
||||
}
|
||||
return found;
|
||||
return true;
|
||||
}
|
||||
|
||||
bool JI_AnyKey() {
|
||||
return waitTime > 0 ? false : key_pressed;
|
||||
return wait_ms > 0.0f ? false : key_pressed;
|
||||
}
|
||||
|
||||
@@ -72,10 +72,10 @@ void Director::run() {
|
||||
Mouse::updateCursorVisibility();
|
||||
|
||||
// Dispara els crèdits cinematogràfics la primera vegada que el joc
|
||||
// arriba al menú del títol (info::num_piramide == 0). Lectura no
|
||||
// arriba al menú del títol (info::ctx.num_piramide == 0). Lectura no
|
||||
// atòmica d'un int global: race benigna, tard d'1 frame en el pitjor cas.
|
||||
static bool credits_triggered = false;
|
||||
if (!credits_triggered && info::num_piramide == 0) {
|
||||
if (!credits_triggered && info::ctx.num_piramide == 0) {
|
||||
if (Options::game.show_title_credits) {
|
||||
Overlay::startCredits();
|
||||
}
|
||||
@@ -279,18 +279,18 @@ auto Director::consumeKeyPressed() -> bool {
|
||||
}
|
||||
|
||||
void Director::gameThreadFunc() {
|
||||
info::num_habitacio = Options::game.habitacio_inicial;
|
||||
info::num_piramide = Options::game.piramide_inicial;
|
||||
info::diners = 0;
|
||||
info::diamants = 0;
|
||||
info::vida = Options::game.vides;
|
||||
info::momies = 0;
|
||||
info::nou_personatge = false;
|
||||
info::pepe_activat = false;
|
||||
info::ctx.num_habitacio = Options::game.habitacio_inicial;
|
||||
info::ctx.num_piramide = Options::game.piramide_inicial;
|
||||
info::ctx.diners = 0;
|
||||
info::ctx.diamants = 0;
|
||||
info::ctx.vida = Options::game.vides;
|
||||
info::ctx.momies = 0;
|
||||
info::ctx.nou_personatge = false;
|
||||
info::ctx.pepe_activat = false;
|
||||
|
||||
FILE* ini = fopen("trick.ini", "rb");
|
||||
if (ini != nullptr) {
|
||||
info::nou_personatge = true;
|
||||
info::ctx.nou_personatge = true;
|
||||
fclose(ini);
|
||||
}
|
||||
|
||||
|
||||
@@ -1,66 +1,52 @@
|
||||
#include "game/bola.hpp"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/jail/jgame.hpp"
|
||||
|
||||
Bola::Bola(JD8_Surface gfx, Prota* sam)
|
||||
: Sprite(gfx) {
|
||||
this->sam = sam;
|
||||
|
||||
this->entitat = (Entitat*)malloc(sizeof(Entitat));
|
||||
// Frames
|
||||
this->entitat->num_frames = 2;
|
||||
this->entitat->frames = (Frame*)malloc(this->entitat->num_frames * sizeof(Frame));
|
||||
this->entitat->frames[0].w = 15;
|
||||
this->entitat->frames[0].h = 15;
|
||||
this->entitat->frames[0].x = 30;
|
||||
this->entitat->frames[0].y = 155;
|
||||
this->entitat->frames[1].w = 15;
|
||||
this->entitat->frames[1].h = 15;
|
||||
this->entitat->frames[1].x = 45;
|
||||
this->entitat->frames[1].y = 155;
|
||||
|
||||
// Animacions
|
||||
this->entitat->num_animacions = 1;
|
||||
this->entitat->animacions = (Animacio*)malloc(this->entitat->num_animacions * sizeof(Animacio));
|
||||
this->entitat->animacions[0].num_frames = 2;
|
||||
this->entitat->animacions[0].frames = (Uint8*)malloc(2);
|
||||
this->entitat->animacions[0].frames[0] = 0;
|
||||
this->entitat->animacions[0].frames[1] = 1;
|
||||
|
||||
this->cur_frame = 0;
|
||||
this->o = 0;
|
||||
this->cycles_per_frame = 4;
|
||||
this->x = 20;
|
||||
this->y = 100;
|
||||
this->contador = 0;
|
||||
}
|
||||
|
||||
void Bola::draw() {
|
||||
if (this->contador == 0) Sprite::draw();
|
||||
}
|
||||
|
||||
void Bola::update() {
|
||||
if (this->contador == 0) {
|
||||
// Augmentem la x
|
||||
this->x++;
|
||||
if (this->x == 280) this->contador = 200;
|
||||
|
||||
// Augmentem el frame
|
||||
if (JG_GetCycleCounter() % this->cycles_per_frame == 0) {
|
||||
this->cur_frame++;
|
||||
if (this->cur_frame == this->entitat->animacions[this->o].num_frames) this->cur_frame = 0;
|
||||
}
|
||||
|
||||
// Comprovem si ha tocat a Sam
|
||||
if (this->x > (this->sam->x - 7) && this->x < (this->sam->x + 7) && this->y > (this->sam->y - 7) && this->y < (this->sam->y + 7)) {
|
||||
this->contador = 200;
|
||||
info::vida--;
|
||||
if (info::vida == 0) this->sam->o = 5;
|
||||
}
|
||||
} else {
|
||||
this->contador--;
|
||||
if (this->contador == 0) this->x = 20;
|
||||
}
|
||||
}
|
||||
#include "game/bola.hpp"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/jail/jgame.hpp"
|
||||
|
||||
Bola::Bola(JD8_Surface gfx, Prota* sam)
|
||||
: Sprite(gfx) {
|
||||
this->sam = sam;
|
||||
|
||||
entitat.frames.reserve(2);
|
||||
entitat.frames.push_back({30, 155, 15, 15});
|
||||
entitat.frames.push_back({45, 155, 15, 15});
|
||||
|
||||
entitat.animacions.resize(1);
|
||||
entitat.animacions[0].frames = {0, 1};
|
||||
|
||||
this->cur_frame = 0;
|
||||
this->o = 0;
|
||||
this->cycles_per_frame = 4;
|
||||
this->x = 20;
|
||||
this->y = 100;
|
||||
this->contador = 0;
|
||||
}
|
||||
|
||||
void Bola::draw() {
|
||||
if (this->contador == 0) Sprite::draw();
|
||||
}
|
||||
|
||||
void Bola::update() {
|
||||
if (this->contador == 0) {
|
||||
// Augmentem la x
|
||||
this->x++;
|
||||
if (this->x == 280) this->contador = 200;
|
||||
|
||||
// Augmentem el frame
|
||||
if (JG_GetCycleCounter() % this->cycles_per_frame == 0) {
|
||||
this->cur_frame++;
|
||||
if (this->cur_frame == entitat.animacions[this->o].frames.size()) this->cur_frame = 0;
|
||||
}
|
||||
|
||||
// Comprovem si ha tocat a Sam
|
||||
if (this->x > (this->sam->x - 7) && this->x < (this->sam->x + 7) && this->y > (this->sam->y - 7) && this->y < (this->sam->y + 7)) {
|
||||
this->contador = 200;
|
||||
info::ctx.vida--;
|
||||
if (info::ctx.vida == 0) this->sam->o = 5;
|
||||
}
|
||||
} else {
|
||||
this->contador--;
|
||||
if (this->contador == 0) this->x = 20;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,61 +1,48 @@
|
||||
#include "game/engendro.hpp"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/jail/jgame.hpp"
|
||||
|
||||
Engendro::Engendro(JD8_Surface gfx, Uint16 x, Uint16 y)
|
||||
: Sprite(gfx) {
|
||||
this->entitat = (Entitat*)malloc(sizeof(Entitat));
|
||||
// Frames
|
||||
this->entitat->num_frames = 4;
|
||||
this->entitat->frames = (Frame*)malloc(this->entitat->num_frames * sizeof(Frame));
|
||||
|
||||
Uint8 frame = 0;
|
||||
for (int y = 50; y <= 65; y += 15) {
|
||||
for (int x = 225; x <= 240; x += 15) {
|
||||
this->entitat->frames[frame].w = 15;
|
||||
this->entitat->frames[frame].h = 15;
|
||||
this->entitat->frames[frame].x = x;
|
||||
this->entitat->frames[frame].y = y;
|
||||
frame++;
|
||||
}
|
||||
}
|
||||
|
||||
// Animacions
|
||||
this->entitat->num_animacions = 1;
|
||||
this->entitat->animacions = (Animacio*)malloc(this->entitat->num_animacions * sizeof(Animacio));
|
||||
this->entitat->animacions[0].num_frames = 6;
|
||||
this->entitat->animacions[0].frames = (Uint8*)malloc(6);
|
||||
this->entitat->animacions[0].frames[0] = 0;
|
||||
this->entitat->animacions[0].frames[1] = 1;
|
||||
this->entitat->animacions[0].frames[2] = 2;
|
||||
this->entitat->animacions[0].frames[3] = 3;
|
||||
this->entitat->animacions[0].frames[4] = 2;
|
||||
this->entitat->animacions[0].frames[5] = 1;
|
||||
|
||||
this->cur_frame = 0;
|
||||
this->vida = 18;
|
||||
this->x = x;
|
||||
this->y = y;
|
||||
this->o = 0;
|
||||
this->cycles_per_frame = 30;
|
||||
}
|
||||
|
||||
void Engendro::draw() {
|
||||
Sprite::draw();
|
||||
}
|
||||
|
||||
bool Engendro::update() {
|
||||
bool mort = false;
|
||||
|
||||
if (JG_GetCycleCounter() % this->cycles_per_frame == 0) {
|
||||
this->cur_frame++;
|
||||
if (this->cur_frame == this->entitat->animacions[this->o].num_frames) this->cur_frame = 0;
|
||||
this->vida--;
|
||||
}
|
||||
|
||||
if (vida == 0) mort = true;
|
||||
|
||||
return mort;
|
||||
}
|
||||
#include "game/engendro.hpp"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/jail/jgame.hpp"
|
||||
|
||||
Engendro::Engendro(JD8_Surface gfx, Uint16 x, Uint16 y)
|
||||
: Sprite(gfx) {
|
||||
entitat.frames.reserve(4);
|
||||
for (int py = 50; py <= 65; py += 15) {
|
||||
for (int px = 225; px <= 240; px += 15) {
|
||||
Frame f;
|
||||
f.w = 15;
|
||||
f.h = 15;
|
||||
f.x = px;
|
||||
f.y = py;
|
||||
entitat.frames.push_back(f);
|
||||
}
|
||||
}
|
||||
|
||||
entitat.animacions.resize(1);
|
||||
entitat.animacions[0].frames = {0, 1, 2, 3, 2, 1};
|
||||
|
||||
this->cur_frame = 0;
|
||||
this->vida = 18;
|
||||
this->x = x;
|
||||
this->y = y;
|
||||
this->o = 0;
|
||||
this->cycles_per_frame = 30;
|
||||
}
|
||||
|
||||
void Engendro::draw() {
|
||||
Sprite::draw();
|
||||
}
|
||||
|
||||
bool Engendro::update() {
|
||||
bool mort = false;
|
||||
|
||||
if (JG_GetCycleCounter() % this->cycles_per_frame == 0) {
|
||||
this->cur_frame++;
|
||||
if (this->cur_frame == entitat.animacions[this->o].frames.size()) this->cur_frame = 0;
|
||||
this->vida--;
|
||||
}
|
||||
|
||||
if (vida == 0) mort = true;
|
||||
|
||||
return mort;
|
||||
}
|
||||
|
||||
@@ -1,13 +1,4 @@
|
||||
#include "game/info.hpp"
|
||||
|
||||
namespace info {
|
||||
int num_piramide;
|
||||
int num_habitacio;
|
||||
int diners;
|
||||
int diamants;
|
||||
int vida;
|
||||
int momies;
|
||||
int engendros;
|
||||
bool nou_personatge;
|
||||
bool pepe_activat;
|
||||
}; // namespace info
|
||||
// La instància `info::ctx` està definida com a `inline` al header;
|
||||
// aquest fitxer es manté per a si cal afegir lògica addicional més endavant.
|
||||
|
||||
@@ -1,13 +1,24 @@
|
||||
#pragma once
|
||||
|
||||
namespace info {
|
||||
extern int num_piramide;
|
||||
extern int num_habitacio;
|
||||
extern int diners;
|
||||
extern int diamants;
|
||||
extern int vida;
|
||||
extern int momies;
|
||||
extern int engendros;
|
||||
extern bool nou_personatge;
|
||||
extern bool pepe_activat;
|
||||
}; // namespace info
|
||||
#pragma once
|
||||
|
||||
namespace info {
|
||||
|
||||
struct GameContext {
|
||||
int num_piramide = 0;
|
||||
int num_habitacio = 0;
|
||||
int diners = 0;
|
||||
int diamants = 0;
|
||||
int vida = 0;
|
||||
int momies = 0;
|
||||
int engendros = 0;
|
||||
bool nou_personatge = false;
|
||||
bool pepe_activat = false;
|
||||
|
||||
void reset() { *this = GameContext{}; }
|
||||
};
|
||||
|
||||
// Instància única de l'estat del joc. Reemplaça les variables soltes del
|
||||
// namespace `info::` per una struct encapsulada. A Fase 5 (single-threaded)
|
||||
// es podrà passar per referència als mòduls en lloc d'accedir via singleton.
|
||||
inline GameContext ctx;
|
||||
|
||||
} // namespace info
|
||||
|
||||
@@ -26,7 +26,7 @@ Mapa::~Mapa(void) {
|
||||
}
|
||||
|
||||
void Mapa::draw() {
|
||||
if (info::num_piramide != 4) {
|
||||
if (info::ctx.num_piramide != 4) {
|
||||
switch (sam->o) {
|
||||
case 0: // Down
|
||||
JD8_BlitCKToSurface(sam->x, sam->y, this->gfx, 15, 125 + sam->frame_pejades, 15, 1, this->fondo, 255);
|
||||
@@ -88,7 +88,7 @@ bool Mapa::novaMomia() {
|
||||
void Mapa::preparaFondoEstatic() {
|
||||
// Prepara el fondo est<73>tic de l'habitaci<63>
|
||||
this->fondo = JD8_NewSurface();
|
||||
if (info::num_piramide == 6) {
|
||||
if (info::ctx.num_piramide == 6) {
|
||||
JD8_BlitToSurface(9, 2, this->gfx, 227, 185, 92, 7, this->fondo); // Text "SECRETA"
|
||||
} else {
|
||||
JD8_BlitToSurface(9, 2, this->gfx, 60, 185, 39, 7, this->fondo); // Text "NIVELL"
|
||||
@@ -96,12 +96,12 @@ void Mapa::preparaFondoEstatic() {
|
||||
}
|
||||
JD8_BlitToSurface(130, 2, this->gfx, 225, 192, 19, 8, this->fondo); // Montonet de monedes + signe '='
|
||||
JD8_BlitToSurface(220, 2, this->gfx, 160, 185, 48, 7, this->fondo); // Text "ENERGIA"
|
||||
if (info::diners >= 200) JD8_BlitToSurface(175, 3, this->gfx, 60, 193, 7, 6, this->fondo);
|
||||
if (info::ctx.diners >= 200) JD8_BlitToSurface(175, 3, this->gfx, 60, 193, 7, 6, this->fondo);
|
||||
|
||||
// Pinta taulells
|
||||
for (int y = 0; y < 11; y++) {
|
||||
for (int x = 0; x < 19; x++) {
|
||||
switch (info::num_piramide) {
|
||||
switch (info::ctx.num_piramide) {
|
||||
case 1:
|
||||
JD8_BlitToSurface(20 + (x * 15), 30 + (y * 15), this->gfx, 0, 80, 15, 15, this->fondo);
|
||||
break;
|
||||
@@ -145,7 +145,7 @@ void Mapa::preparaFondoEstatic() {
|
||||
// Pinta la porta
|
||||
JD8_BlitCKToSurface(150, 18, this->gfx, 0, 143, 15, 12, this->fondo, 255);
|
||||
|
||||
if (info::num_piramide == 2) {
|
||||
if (info::ctx.num_piramide == 2) {
|
||||
JD8_BlitToSurface(5, 100, this->gfx, 30, 140, 15, 15, this->fondo);
|
||||
}
|
||||
}
|
||||
@@ -157,9 +157,9 @@ void swap(Uint8& a, Uint8& b) {
|
||||
}
|
||||
|
||||
void Mapa::preparaTombes() {
|
||||
const Uint8 contingut = info::num_piramide == 6 ? CONTE_DIAMANT : CONTE_RES;
|
||||
int cx = info::num_piramide == 6 ? 270 : 0;
|
||||
int cy = info::num_piramide == 6 ? 50 : 0;
|
||||
const Uint8 contingut = info::ctx.num_piramide == 6 ? CONTE_DIAMANT : CONTE_RES;
|
||||
int cx = info::ctx.num_piramide == 6 ? 270 : 0;
|
||||
int cy = info::ctx.num_piramide == 6 ? 50 : 0;
|
||||
|
||||
for (int i = 0; i < 16; i++) {
|
||||
this->tombes[i].contingut = contingut;
|
||||
@@ -171,7 +171,7 @@ void Mapa::preparaTombes() {
|
||||
this->tombes[i].x = cx;
|
||||
this->tombes[i].y = cy;
|
||||
}
|
||||
if (info::num_piramide == 6) return;
|
||||
if (info::ctx.num_piramide == 6) return;
|
||||
this->tombes[0].contingut = CONTE_FARAO;
|
||||
this->tombes[1].contingut = CONTE_CLAU;
|
||||
this->tombes[2].contingut = CONTE_PERGAMI;
|
||||
@@ -241,7 +241,7 @@ void Mapa::comprovaCaixa(Uint8 num) {
|
||||
break;
|
||||
case CONTE_TRESOR:
|
||||
this->tombes[num].x = 100;
|
||||
info::diners++;
|
||||
info::ctx.diners++;
|
||||
break;
|
||||
case CONTE_FARAO:
|
||||
this->tombes[num].x = 150;
|
||||
@@ -261,9 +261,9 @@ void Mapa::comprovaCaixa(Uint8 num) {
|
||||
break;
|
||||
case CONTE_DIAMANT:
|
||||
this->tombes[num].y = 70;
|
||||
info::diamants++;
|
||||
info::diners += VALOR_DIAMANT;
|
||||
if (info::diamants == 16) this->farao = this->clau = true;
|
||||
info::ctx.diamants++;
|
||||
info::ctx.diners += VALOR_DIAMANT;
|
||||
if (info::ctx.diamants == 16) this->farao = this->clau = true;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
@@ -9,19 +9,19 @@ Marcador::~Marcador(void) {
|
||||
}
|
||||
|
||||
void Marcador::draw() {
|
||||
if (info::num_piramide < 6) {
|
||||
this->pintaNumero(55, 2, info::num_piramide);
|
||||
this->pintaNumero(80, 2, info::num_habitacio);
|
||||
if (info::ctx.num_piramide < 6) {
|
||||
this->pintaNumero(55, 2, info::ctx.num_piramide);
|
||||
this->pintaNumero(80, 2, info::ctx.num_habitacio);
|
||||
}
|
||||
|
||||
this->pintaNumero(149, 2, info::diners / 100);
|
||||
this->pintaNumero(156, 2, (info::diners % 100) / 10);
|
||||
this->pintaNumero(163, 2, info::diners % 10);
|
||||
this->pintaNumero(149, 2, info::ctx.diners / 100);
|
||||
this->pintaNumero(156, 2, (info::ctx.diners % 100) / 10);
|
||||
this->pintaNumero(163, 2, info::ctx.diners % 10);
|
||||
|
||||
if (this->sam->pergami) JD8_BlitCK(190, 1, this->gfx, 209, 185, 15, 14, 255);
|
||||
|
||||
JD8_BlitCK(271, 1, this->gfx, 0, 20, 15, info::vida * 3, 255);
|
||||
if (info::vida < 5) JD8_BlitCK(271, 1 + (info::vida * 3), this->gfx, 75, 20, 15, 15 - (info::vida * 3), 255);
|
||||
JD8_BlitCK(271, 1, this->gfx, 0, 20, 15, info::ctx.vida * 3, 255);
|
||||
if (info::ctx.vida < 5) JD8_BlitCK(271, 1 + (info::ctx.vida * 3), this->gfx, 75, 20, 15, 15 - (info::ctx.vida * 3), 255);
|
||||
}
|
||||
|
||||
void Marcador::pintaNumero(Uint16 x, Uint16 y, Uint8 num) {
|
||||
|
||||
@@ -7,13 +7,13 @@
|
||||
#include "core/jail/jinput.hpp"
|
||||
|
||||
ModuleGame::ModuleGame() {
|
||||
this->gfx = JD8_LoadSurface(info::pepe_activat ? "frames2.gif" : "frames.gif");
|
||||
this->gfx = JD8_LoadSurface(info::ctx.pepe_activat ? "frames2.gif" : "frames.gif");
|
||||
JG_SetUpdateTicks(10);
|
||||
|
||||
this->sam = new Prota(this->gfx);
|
||||
this->mapa = new Mapa(this->gfx, this->sam);
|
||||
this->marcador = new Marcador(this->gfx, this->sam);
|
||||
if (info::num_piramide == 2) {
|
||||
if (info::ctx.num_piramide == 2) {
|
||||
this->bola = new Bola(this->gfx, this->sam);
|
||||
} else {
|
||||
this->bola = NULL;
|
||||
@@ -42,7 +42,7 @@ ModuleGame::~ModuleGame(void) {
|
||||
int ModuleGame::Go() {
|
||||
this->Draw();
|
||||
|
||||
const char* music = info::num_piramide == 3 ? "00000008.ogg" : (info::num_piramide == 2 ? "00000007.ogg" : (info::num_piramide == 6 ? "00000002.ogg" : "00000006.ogg"));
|
||||
const char* music = info::ctx.num_piramide == 3 ? "00000008.ogg" : (info::ctx.num_piramide == 2 ? "00000007.ogg" : (info::ctx.num_piramide == 6 ? "00000002.ogg" : "00000006.ogg"));
|
||||
const char* current_music = JA_GetMusicFilename();
|
||||
if ((JA_GetMusicState() != JA_MUSIC_PLAYING) || !(strcmp(music, current_music) == 0)) {
|
||||
int size;
|
||||
@@ -50,7 +50,7 @@ int ModuleGame::Go() {
|
||||
JA_PlayMusic(JA_LoadMusic((Uint8*)buffer, size, music));
|
||||
}
|
||||
|
||||
JD8_FadeToPal(JD8_LoadPalette(info::pepe_activat ? "frames2.gif" : "frames.gif"));
|
||||
JD8_FadeToPal(JD8_LoadPalette(info::ctx.pepe_activat ? "frames2.gif" : "frames.gif"));
|
||||
|
||||
while (this->final == 0 && !JG_Quitting()) {
|
||||
this->Draw();
|
||||
@@ -60,20 +60,20 @@ int ModuleGame::Go() {
|
||||
// JS_FadeOutMusic();
|
||||
|
||||
if (this->final == 1) {
|
||||
info::num_habitacio++;
|
||||
if (info::num_habitacio == 6) {
|
||||
info::num_habitacio = 1;
|
||||
info::num_piramide++;
|
||||
info::ctx.num_habitacio++;
|
||||
if (info::ctx.num_habitacio == 6) {
|
||||
info::ctx.num_habitacio = 1;
|
||||
info::ctx.num_piramide++;
|
||||
}
|
||||
if (info::num_piramide == 6 && info::num_habitacio == 2) info::num_piramide++;
|
||||
if (info::ctx.num_piramide == 6 && info::ctx.num_habitacio == 2) info::ctx.num_piramide++;
|
||||
} else if (this->final == 2) {
|
||||
info::num_piramide = 100;
|
||||
info::ctx.num_piramide = 100;
|
||||
}
|
||||
|
||||
if (JG_Quitting()) {
|
||||
return -1;
|
||||
} else {
|
||||
if (info::num_habitacio == 1 || info::num_piramide == 100 || info::num_piramide == 7) {
|
||||
if (info::ctx.num_habitacio == 1 || info::ctx.num_piramide == 100 || info::ctx.num_piramide == 7) {
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
@@ -100,27 +100,27 @@ void ModuleGame::Update() {
|
||||
Momia* seguent = this->momies->next;
|
||||
delete this->momies;
|
||||
this->momies = seguent;
|
||||
info::momies--;
|
||||
info::ctx.momies--;
|
||||
}
|
||||
if (this->bola != NULL) this->bola->update();
|
||||
this->mapa->update();
|
||||
if (this->mapa->novaMomia()) {
|
||||
if (this->momies != NULL) {
|
||||
this->momies->insertar(new Momia(this->gfx, true, 0, 0, this->sam));
|
||||
info::momies++;
|
||||
info::ctx.momies++;
|
||||
} else {
|
||||
this->momies = new Momia(this->gfx, true, 0, 0, this->sam);
|
||||
info::momies++;
|
||||
info::ctx.momies++;
|
||||
}
|
||||
}
|
||||
|
||||
if (JI_CheatActivated("reviu")) info::vida = 5;
|
||||
if (JI_CheatActivated("reviu")) info::ctx.vida = 5;
|
||||
if (JI_CheatActivated("alone")) {
|
||||
if (this->momies != NULL) {
|
||||
this->momies->clear();
|
||||
delete this->momies;
|
||||
this->momies = NULL;
|
||||
info::momies = 0;
|
||||
info::ctx.momies = 0;
|
||||
}
|
||||
}
|
||||
if (JI_CheatActivated("obert")) {
|
||||
@@ -140,17 +140,17 @@ void ModuleGame::Update() {
|
||||
}
|
||||
|
||||
void ModuleGame::iniciarMomies() {
|
||||
if (info::num_habitacio == 1) {
|
||||
info::momies = 1;
|
||||
if (info::ctx.num_habitacio == 1) {
|
||||
info::ctx.momies = 1;
|
||||
} else {
|
||||
info::momies++;
|
||||
info::ctx.momies++;
|
||||
}
|
||||
if (info::num_piramide == 6) info::momies = 8;
|
||||
if (info::ctx.num_piramide == 6) info::ctx.momies = 8;
|
||||
|
||||
int x = 20;
|
||||
int y = 170;
|
||||
bool dimonis = info::num_piramide == 6;
|
||||
for (int i = 0; i < info::momies; i++) {
|
||||
bool dimonis = info::ctx.num_piramide == 6;
|
||||
for (int i = 0; i < info::ctx.momies; i++) {
|
||||
if (this->momies == NULL) {
|
||||
this->momies = new Momia(this->gfx, dimonis, x, y, this->sam);
|
||||
} else {
|
||||
|
||||
@@ -18,9 +18,9 @@ ModuleSequence::~ModuleSequence(void) {
|
||||
}
|
||||
|
||||
int ModuleSequence::Go() {
|
||||
if (info::num_piramide == 6 && info::diners < 200) info::num_piramide = 7;
|
||||
if (info::ctx.num_piramide == 6 && info::ctx.diners < 200) info::ctx.num_piramide = 7;
|
||||
|
||||
switch (info::num_piramide) {
|
||||
switch (info::ctx.num_piramide) {
|
||||
case 255: // Intro
|
||||
doIntro();
|
||||
break;
|
||||
@@ -53,22 +53,22 @@ int ModuleSequence::Go() {
|
||||
if (JG_Quitting()) {
|
||||
return -1;
|
||||
} else {
|
||||
if (info::num_piramide == 255) {
|
||||
info::num_piramide = 0;
|
||||
if (info::ctx.num_piramide == 255) {
|
||||
info::ctx.num_piramide = 0;
|
||||
return 1;
|
||||
} else if (info::num_piramide == 0) {
|
||||
info::num_piramide = 1;
|
||||
// info::num_piramide = 6;
|
||||
// info::diners = 200;
|
||||
} else if (info::ctx.num_piramide == 0) {
|
||||
info::ctx.num_piramide = 1;
|
||||
// info::ctx.num_piramide = 6;
|
||||
// info::ctx.diners = 200;
|
||||
return 1;
|
||||
} else if (info::num_piramide == 7) {
|
||||
info::num_piramide = 8;
|
||||
} else if (info::ctx.num_piramide == 7) {
|
||||
info::ctx.num_piramide = 8;
|
||||
return 1;
|
||||
} else if (info::num_piramide == 8) {
|
||||
info::num_piramide = 255;
|
||||
} else if (info::ctx.num_piramide == 8) {
|
||||
info::ctx.num_piramide = 255;
|
||||
return 1;
|
||||
} else if (info::num_piramide == 100) {
|
||||
info::num_piramide = 0;
|
||||
} else if (info::ctx.num_piramide == 100) {
|
||||
info::ctx.num_piramide = 0;
|
||||
return 1;
|
||||
} else {
|
||||
return 0;
|
||||
@@ -969,7 +969,7 @@ void ModuleSequence::doMenu() {
|
||||
JD8_BlitCK(303, 193, gfx, 305, 143, 15, 5, 255); // versio
|
||||
|
||||
if (contador % 100 > 30) JD8_BlitCK(98, 130, gfx, 161, 92, 127, 9, 255); // pulsa tecla...
|
||||
if ((contador % 100 > 30) && info::nou_personatge) JD8_BlitCK(68, 141, gfx, 128, 105, 189, 9, 255); // 'p' per a personatge nou...
|
||||
if ((contador % 100 > 30) && info::ctx.nou_personatge) JD8_BlitCK(68, 141, gfx, 128, 105, 189, 9, 255); // 'p' per a personatge nou...
|
||||
|
||||
JD8_Flip();
|
||||
|
||||
@@ -990,7 +990,7 @@ void ModuleSequence::doMenu() {
|
||||
JI_Update();
|
||||
}
|
||||
}
|
||||
info::pepe_activat = JI_KeyPressed(SDL_SCANCODE_P);
|
||||
info::ctx.pepe_activat = JI_KeyPressed(SDL_SCANCODE_P);
|
||||
JI_DisableKeyboard(60);
|
||||
JD8_FreeSurface(fondo);
|
||||
JD8_FreeSurface(gfx);
|
||||
@@ -1001,9 +1001,9 @@ void ModuleSequence::doSlides() {
|
||||
JG_SetUpdateTicks(20);
|
||||
|
||||
const char* arxiu;
|
||||
if (info::num_piramide == 7) {
|
||||
if (info::ctx.num_piramide == 7) {
|
||||
play_music("00000005.ogg", 1);
|
||||
if (info::diners < 200) {
|
||||
if (info::ctx.diners < 200) {
|
||||
arxiu = "intro2.gif";
|
||||
} else {
|
||||
arxiu = "intro3.gif";
|
||||
@@ -1066,7 +1066,7 @@ void ModuleSequence::doSlides() {
|
||||
step++;
|
||||
break;
|
||||
case 8:
|
||||
if (info::num_piramide != 7) JA_FadeOutMusic(250);
|
||||
if (info::ctx.num_piramide != 7) JA_FadeOutMusic(250);
|
||||
exit = true;
|
||||
break;
|
||||
}
|
||||
@@ -1090,7 +1090,7 @@ void ModuleSequence::doBanner() {
|
||||
JD8_Blit(81, 24, gfx, 81, 155, 168, 21);
|
||||
JD8_Blit(39, 150, gfx, 39, 175, 248, 20);
|
||||
|
||||
switch (info::num_piramide) {
|
||||
switch (info::ctx.num_piramide) {
|
||||
case 2:
|
||||
JD8_Blit(82, 60, gfx, 0, 0, 160, 75);
|
||||
break;
|
||||
@@ -1245,7 +1245,7 @@ void ModuleSequence::doCredits() {
|
||||
JD8_BlitCK(100, 20, vaddr2, 85, 0, 120, 140, 0);
|
||||
}
|
||||
|
||||
if (info::diamants == 16) {
|
||||
if (info::ctx.diamants == 16) {
|
||||
// scroll_final_joc(vaddr3, vaddr, contador_final);
|
||||
JD8_BlitCKScroll(50, vaddr3, ((contador >> 3) % 320) + 1, 0, 50, 255);
|
||||
JD8_BlitCKScroll(50, vaddr3, ((contador >> 2) % 320) + 1, 50, 50, 255);
|
||||
@@ -1269,7 +1269,7 @@ void ModuleSequence::doCredits() {
|
||||
FILE* ini = fopen("trick.ini", "wb");
|
||||
fwrite("1", 1, 1, ini);
|
||||
fclose(ini);
|
||||
info::nou_personatge = true;
|
||||
info::ctx.nou_personatge = true;
|
||||
|
||||
JD8_FreeSurface(vaddr3);
|
||||
JD8_FreeSurface(vaddr2);
|
||||
@@ -1280,7 +1280,7 @@ void ModuleSequence::doMort() {
|
||||
|
||||
JI_DisableKeyboard(60);
|
||||
|
||||
info::vida = 5;
|
||||
info::ctx.vida = 5;
|
||||
this->contador = 1000;
|
||||
|
||||
JD8_Surface gfx = JD8_LoadSurface("gameover.gif");
|
||||
|
||||
@@ -1,183 +1,179 @@
|
||||
#include "game/momia.hpp"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/jail/jgame.hpp"
|
||||
|
||||
Momia::Momia(JD8_Surface gfx, bool dimoni, Uint16 x, Uint16 y, Prota* sam)
|
||||
: Sprite(gfx) {
|
||||
this->dimoni = dimoni;
|
||||
this->sam = sam;
|
||||
|
||||
this->entitat = (Entitat*)malloc(sizeof(Entitat));
|
||||
// Frames
|
||||
this->entitat->num_frames = 20;
|
||||
this->entitat->frames = (Frame*)malloc(this->entitat->num_frames * sizeof(Frame));
|
||||
Uint16 frame = 0;
|
||||
for (int y = 0; y < 4; y++) {
|
||||
for (int x = 0; x < 5; x++) {
|
||||
this->entitat->frames[frame].w = 15;
|
||||
this->entitat->frames[frame].h = 15;
|
||||
if (info::num_piramide == 4) this->entitat->frames[frame].h -= 5;
|
||||
this->entitat->frames[frame].x = (x * 15) + 75;
|
||||
if (this->dimoni) this->entitat->frames[frame].x += 75;
|
||||
this->entitat->frames[frame].y = 20 + (y * 15);
|
||||
frame++;
|
||||
}
|
||||
}
|
||||
// Animacions
|
||||
this->entitat->num_animacions = 4;
|
||||
this->entitat->animacions = (Animacio*)malloc(this->entitat->num_animacions * sizeof(Animacio));
|
||||
for (int i = 0; i < 4; i++) {
|
||||
this->entitat->animacions[i].num_frames = 8;
|
||||
this->entitat->animacions[i].frames = (Uint8*)malloc(8);
|
||||
this->entitat->animacions[i].frames[0] = 0 + (i * 5);
|
||||
this->entitat->animacions[i].frames[1] = 1 + (i * 5);
|
||||
this->entitat->animacions[i].frames[2] = 2 + (i * 5);
|
||||
this->entitat->animacions[i].frames[3] = 1 + (i * 5);
|
||||
this->entitat->animacions[i].frames[4] = 0 + (i * 5);
|
||||
this->entitat->animacions[i].frames[5] = 3 + (i * 5);
|
||||
this->entitat->animacions[i].frames[6] = 4 + (i * 5);
|
||||
this->entitat->animacions[i].frames[7] = 3 + (i * 5);
|
||||
}
|
||||
|
||||
this->cur_frame = 0;
|
||||
this->o = rand() % 4;
|
||||
this->cycles_per_frame = 4;
|
||||
this->next = NULL;
|
||||
|
||||
if (this->dimoni) {
|
||||
if (x == 0) {
|
||||
this->x = 150;
|
||||
} else {
|
||||
this->x = x;
|
||||
}
|
||||
if (y == 0) {
|
||||
if (this->sam->y > 100) {
|
||||
this->y = 30;
|
||||
} else {
|
||||
this->y = 170;
|
||||
}
|
||||
} else {
|
||||
this->y = y;
|
||||
}
|
||||
this->engendro = new Engendro(gfx, this->x, this->y);
|
||||
} else {
|
||||
this->engendro = NULL;
|
||||
this->x = x;
|
||||
this->y = y;
|
||||
}
|
||||
}
|
||||
|
||||
void Momia::clear() {
|
||||
if (this->next != NULL) this->next->clear();
|
||||
if (this->engendro != NULL) delete this->engendro;
|
||||
delete this->next;
|
||||
}
|
||||
|
||||
void Momia::draw() {
|
||||
if (this->engendro != NULL) {
|
||||
this->engendro->draw();
|
||||
} else {
|
||||
Sprite::draw();
|
||||
|
||||
if (info::num_piramide == 4) {
|
||||
if ((JG_GetCycleCounter() % 40) < 20) {
|
||||
JD8_BlitCK(this->x, this->y, this->gfx, 220, 80, 15, 15, 255);
|
||||
} else {
|
||||
JD8_BlitCK(this->x, this->y, this->gfx, 235, 80, 15, 15, 255);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this->next != NULL) this->next->draw();
|
||||
}
|
||||
|
||||
bool Momia::update() {
|
||||
bool morta = false;
|
||||
|
||||
if (this->engendro != NULL) {
|
||||
if (this->engendro->update()) {
|
||||
delete this->engendro;
|
||||
this->engendro = NULL;
|
||||
}
|
||||
} else {
|
||||
if (this->sam->o < 4 && (this->dimoni || info::num_piramide == 5 || JG_GetCycleCounter() % 2 == 0)) {
|
||||
if ((this->x - 20) % 65 == 0 && (this->y - 30) % 35 == 0) {
|
||||
if (this->dimoni) {
|
||||
if (rand() % 2 == 0) {
|
||||
if (this->x > this->sam->x) {
|
||||
this->o = 3;
|
||||
} else if (this->x < this->sam->x) {
|
||||
this->o = 2;
|
||||
} else if (this->y < this->sam->y) {
|
||||
this->o = 0;
|
||||
} else if (this->y > this->sam->y) {
|
||||
this->o = 1;
|
||||
}
|
||||
} else {
|
||||
if (this->y < this->sam->y) {
|
||||
this->o = 0;
|
||||
} else if (this->y > this->sam->y) {
|
||||
this->o = 1;
|
||||
} else if (this->x > this->sam->x) {
|
||||
this->o = 3;
|
||||
} else if (this->x < this->sam->x) {
|
||||
this->o = 2;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
this->o = rand() % 4;
|
||||
}
|
||||
}
|
||||
|
||||
switch (this->o) {
|
||||
case 0:
|
||||
if (y < 170) this->y++;
|
||||
break;
|
||||
case 1:
|
||||
if (y > 30) this->y--;
|
||||
break;
|
||||
case 2:
|
||||
if (x < 280) this->x++;
|
||||
break;
|
||||
case 3:
|
||||
if (x > 20) this->x--;
|
||||
break;
|
||||
}
|
||||
|
||||
if (JG_GetCycleCounter() % this->cycles_per_frame == 0) {
|
||||
this->cur_frame++;
|
||||
if (this->cur_frame == this->entitat->animacions[this->o].num_frames) this->cur_frame = 0;
|
||||
}
|
||||
|
||||
if (this->x > (this->sam->x - 7) && this->x < (this->sam->x + 7) && this->y > (this->sam->y - 7) && this->y < (this->sam->y + 7)) {
|
||||
morta = true;
|
||||
if (this->sam->pergami) {
|
||||
this->sam->pergami = false;
|
||||
} else {
|
||||
info::vida--;
|
||||
if (info::vida == 0) this->sam->o = 5;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (this->next != NULL) {
|
||||
if (this->next->update()) {
|
||||
Momia* seguent = this->next->next;
|
||||
delete this->next;
|
||||
this->next = seguent;
|
||||
info::momies--;
|
||||
}
|
||||
}
|
||||
|
||||
return morta;
|
||||
}
|
||||
|
||||
void Momia::insertar(Momia* momia) {
|
||||
if (this->next != NULL) {
|
||||
this->next->insertar(momia);
|
||||
} else {
|
||||
this->next = momia;
|
||||
}
|
||||
}
|
||||
#include "game/momia.hpp"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/jail/jgame.hpp"
|
||||
|
||||
Momia::Momia(JD8_Surface gfx, bool dimoni, Uint16 x, Uint16 y, Prota* sam)
|
||||
: Sprite(gfx) {
|
||||
this->dimoni = dimoni;
|
||||
this->sam = sam;
|
||||
|
||||
entitat.frames.reserve(20);
|
||||
for (int y = 0; y < 4; y++) {
|
||||
for (int x = 0; x < 5; x++) {
|
||||
Frame f;
|
||||
f.w = 15;
|
||||
f.h = 15;
|
||||
if (info::ctx.num_piramide == 4) f.h -= 5;
|
||||
f.x = (x * 15) + 75;
|
||||
if (this->dimoni) f.x += 75;
|
||||
f.y = 20 + (y * 15);
|
||||
entitat.frames.push_back(f);
|
||||
}
|
||||
}
|
||||
|
||||
entitat.animacions.resize(4);
|
||||
for (int i = 0; i < 4; i++) {
|
||||
entitat.animacions[i].frames = {
|
||||
static_cast<Uint8>(0 + i * 5),
|
||||
static_cast<Uint8>(1 + i * 5),
|
||||
static_cast<Uint8>(2 + i * 5),
|
||||
static_cast<Uint8>(1 + i * 5),
|
||||
static_cast<Uint8>(0 + i * 5),
|
||||
static_cast<Uint8>(3 + i * 5),
|
||||
static_cast<Uint8>(4 + i * 5),
|
||||
static_cast<Uint8>(3 + i * 5),
|
||||
};
|
||||
}
|
||||
|
||||
this->cur_frame = 0;
|
||||
this->o = rand() % 4;
|
||||
this->cycles_per_frame = 4;
|
||||
this->next = NULL;
|
||||
|
||||
if (this->dimoni) {
|
||||
if (x == 0) {
|
||||
this->x = 150;
|
||||
} else {
|
||||
this->x = x;
|
||||
}
|
||||
if (y == 0) {
|
||||
if (this->sam->y > 100) {
|
||||
this->y = 30;
|
||||
} else {
|
||||
this->y = 170;
|
||||
}
|
||||
} else {
|
||||
this->y = y;
|
||||
}
|
||||
this->engendro = new Engendro(gfx, this->x, this->y);
|
||||
} else {
|
||||
this->engendro = NULL;
|
||||
this->x = x;
|
||||
this->y = y;
|
||||
}
|
||||
}
|
||||
|
||||
void Momia::clear() {
|
||||
if (this->next != NULL) this->next->clear();
|
||||
if (this->engendro != NULL) delete this->engendro;
|
||||
delete this->next;
|
||||
}
|
||||
|
||||
void Momia::draw() {
|
||||
if (this->engendro != NULL) {
|
||||
this->engendro->draw();
|
||||
} else {
|
||||
Sprite::draw();
|
||||
|
||||
if (info::ctx.num_piramide == 4) {
|
||||
if ((JG_GetCycleCounter() % 40) < 20) {
|
||||
JD8_BlitCK(this->x, this->y, this->gfx, 220, 80, 15, 15, 255);
|
||||
} else {
|
||||
JD8_BlitCK(this->x, this->y, this->gfx, 235, 80, 15, 15, 255);
|
||||
}
|
||||
}
|
||||
}
|
||||
if (this->next != NULL) this->next->draw();
|
||||
}
|
||||
|
||||
bool Momia::update() {
|
||||
bool morta = false;
|
||||
|
||||
if (this->engendro != NULL) {
|
||||
if (this->engendro->update()) {
|
||||
delete this->engendro;
|
||||
this->engendro = NULL;
|
||||
}
|
||||
} else {
|
||||
if (this->sam->o < 4 && (this->dimoni || info::ctx.num_piramide == 5 || JG_GetCycleCounter() % 2 == 0)) {
|
||||
if ((this->x - 20) % 65 == 0 && (this->y - 30) % 35 == 0) {
|
||||
if (this->dimoni) {
|
||||
if (rand() % 2 == 0) {
|
||||
if (this->x > this->sam->x) {
|
||||
this->o = 3;
|
||||
} else if (this->x < this->sam->x) {
|
||||
this->o = 2;
|
||||
} else if (this->y < this->sam->y) {
|
||||
this->o = 0;
|
||||
} else if (this->y > this->sam->y) {
|
||||
this->o = 1;
|
||||
}
|
||||
} else {
|
||||
if (this->y < this->sam->y) {
|
||||
this->o = 0;
|
||||
} else if (this->y > this->sam->y) {
|
||||
this->o = 1;
|
||||
} else if (this->x > this->sam->x) {
|
||||
this->o = 3;
|
||||
} else if (this->x < this->sam->x) {
|
||||
this->o = 2;
|
||||
}
|
||||
}
|
||||
} else {
|
||||
this->o = rand() % 4;
|
||||
}
|
||||
}
|
||||
|
||||
switch (this->o) {
|
||||
case 0:
|
||||
if (y < 170) this->y++;
|
||||
break;
|
||||
case 1:
|
||||
if (y > 30) this->y--;
|
||||
break;
|
||||
case 2:
|
||||
if (x < 280) this->x++;
|
||||
break;
|
||||
case 3:
|
||||
if (x > 20) this->x--;
|
||||
break;
|
||||
}
|
||||
|
||||
if (JG_GetCycleCounter() % this->cycles_per_frame == 0) {
|
||||
this->cur_frame++;
|
||||
if (this->cur_frame == entitat.animacions[this->o].frames.size()) this->cur_frame = 0;
|
||||
}
|
||||
|
||||
if (this->x > (this->sam->x - 7) && this->x < (this->sam->x + 7) && this->y > (this->sam->y - 7) && this->y < (this->sam->y + 7)) {
|
||||
morta = true;
|
||||
if (this->sam->pergami) {
|
||||
this->sam->pergami = false;
|
||||
} else {
|
||||
info::ctx.vida--;
|
||||
if (info::ctx.vida == 0) this->sam->o = 5;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (this->next != NULL) {
|
||||
if (this->next->update()) {
|
||||
Momia* seguent = this->next->next;
|
||||
delete this->next;
|
||||
this->next = seguent;
|
||||
info::ctx.momies--;
|
||||
}
|
||||
}
|
||||
|
||||
return morta;
|
||||
}
|
||||
|
||||
void Momia::insertar(Momia* momia) {
|
||||
if (this->next != NULL) {
|
||||
this->next->insertar(momia);
|
||||
} else {
|
||||
this->next = momia;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,152 +1,151 @@
|
||||
#include "game/prota.hpp"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/jail/jgame.hpp"
|
||||
#include "core/jail/jinput.hpp"
|
||||
|
||||
Prota::Prota(JD8_Surface gfx)
|
||||
: Sprite(gfx) {
|
||||
this->entitat = (Entitat*)malloc(sizeof(Entitat));
|
||||
this->entitat->num_frames = 82;
|
||||
this->entitat->frames = (Frame*)malloc(this->entitat->num_frames * sizeof(Frame));
|
||||
Uint16 frame = 0;
|
||||
for (int y = 0; y < 4; y++) {
|
||||
for (int x = 0; x < 5; x++) {
|
||||
this->entitat->frames[frame].w = 15;
|
||||
this->entitat->frames[frame].h = 15;
|
||||
if (info::num_piramide == 4) this->entitat->frames[frame].h -= 5;
|
||||
this->entitat->frames[frame].x = x * 15;
|
||||
this->entitat->frames[frame].y = 20 + (y * 15);
|
||||
frame++;
|
||||
}
|
||||
}
|
||||
for (int y = 95; y < 185; y += 30) {
|
||||
for (int x = 60; x < 315; x += 15) {
|
||||
if (x != 300 || y != 155) {
|
||||
this->entitat->frames[frame].w = 15;
|
||||
this->entitat->frames[frame].h = 30;
|
||||
if (info::num_piramide == 4) this->entitat->frames[frame].h -= 5;
|
||||
this->entitat->frames[frame].x = x;
|
||||
this->entitat->frames[frame].y = y;
|
||||
frame++;
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int y = 20; y < 50; y += 15) {
|
||||
for (int x = 225; x < 315; x += 15) {
|
||||
this->entitat->frames[frame].w = 15;
|
||||
this->entitat->frames[frame].h = 15;
|
||||
if (info::num_piramide == 4) this->entitat->frames[frame].h -= 5;
|
||||
this->entitat->frames[frame].x = x;
|
||||
this->entitat->frames[frame].y = y;
|
||||
frame++;
|
||||
}
|
||||
}
|
||||
|
||||
this->entitat->num_animacions = 6;
|
||||
this->entitat->animacions = (Animacio*)malloc(this->entitat->num_animacions * sizeof(Animacio));
|
||||
for (int i = 0; i < 4; i++) {
|
||||
this->entitat->animacions[i].num_frames = 8;
|
||||
this->entitat->animacions[i].frames = (Uint8*)malloc(8);
|
||||
this->entitat->animacions[i].frames[0] = 0 + (i * 5);
|
||||
this->entitat->animacions[i].frames[1] = 1 + (i * 5);
|
||||
this->entitat->animacions[i].frames[2] = 2 + (i * 5);
|
||||
this->entitat->animacions[i].frames[3] = 1 + (i * 5);
|
||||
this->entitat->animacions[i].frames[4] = 0 + (i * 5);
|
||||
this->entitat->animacions[i].frames[5] = 3 + (i * 5);
|
||||
this->entitat->animacions[i].frames[6] = 4 + (i * 5);
|
||||
this->entitat->animacions[i].frames[7] = 3 + (i * 5);
|
||||
}
|
||||
this->entitat->animacions[4].num_frames = 50;
|
||||
this->entitat->animacions[4].frames = (Uint8*)malloc(50);
|
||||
for (int i = 0; i < 50; i++) this->entitat->animacions[4].frames[i] = i + 20;
|
||||
|
||||
this->entitat->animacions[5].num_frames = 48;
|
||||
this->entitat->animacions[5].frames = (Uint8*)malloc(48);
|
||||
for (int i = 0; i < 12; i++) this->entitat->animacions[5].frames[i] = i + 70;
|
||||
for (int i = 12; i < 48; i++) this->entitat->animacions[5].frames[i] = 81;
|
||||
|
||||
this->cur_frame = 0;
|
||||
this->x = 150;
|
||||
this->y = 30;
|
||||
this->o = 0;
|
||||
this->cycles_per_frame = 4;
|
||||
this->pergami = false;
|
||||
this->frame_pejades = 0;
|
||||
}
|
||||
|
||||
void Prota::draw() {
|
||||
Sprite::draw();
|
||||
|
||||
if (info::num_piramide == 4 && this->o != 4) {
|
||||
if ((JG_GetCycleCounter() % 40) < 20) {
|
||||
JD8_BlitCK(this->x, this->y, this->gfx, 220, 80, 15, 15, 255);
|
||||
} else {
|
||||
JD8_BlitCK(this->x, this->y, this->gfx, 235, 80, 15, 15, 255);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Uint8 Prota::update() {
|
||||
Uint8 eixir = 0;
|
||||
|
||||
if (this->o < 4) {
|
||||
Uint8 dir = 4;
|
||||
if (JI_KeyPressed(SDL_SCANCODE_DOWN)) {
|
||||
if ((this->x - 20) % 65 == 0) this->o = 0;
|
||||
dir = this->o;
|
||||
}
|
||||
if (JI_KeyPressed(SDL_SCANCODE_UP)) {
|
||||
if ((this->x - 20) % 65 == 0) this->o = 1;
|
||||
dir = this->o;
|
||||
}
|
||||
if (JI_KeyPressed(SDL_SCANCODE_RIGHT)) {
|
||||
if ((this->y - 30) % 35 == 0) this->o = 2;
|
||||
dir = this->o;
|
||||
}
|
||||
if (JI_KeyPressed(SDL_SCANCODE_LEFT)) {
|
||||
if ((this->y - 30) % 35 == 0) this->o = 3;
|
||||
dir = this->o;
|
||||
}
|
||||
|
||||
switch (dir) {
|
||||
case 0:
|
||||
if (this->y < 170) this->y++;
|
||||
break;
|
||||
case 1:
|
||||
if (this->y > 30) this->y--;
|
||||
break;
|
||||
case 2:
|
||||
if (this->x < 280) this->x++;
|
||||
break;
|
||||
case 3:
|
||||
if (this->x > 20) this->x--;
|
||||
break;
|
||||
}
|
||||
|
||||
if (dir == 4) {
|
||||
this->cur_frame = 0;
|
||||
} else {
|
||||
this->frame_pejades++;
|
||||
if (this->frame_pejades == 15) this->frame_pejades = 0;
|
||||
if (JG_GetCycleCounter() % this->cycles_per_frame == 0) {
|
||||
this->cur_frame++;
|
||||
if (this->cur_frame == this->entitat->animacions[this->o].num_frames) this->cur_frame = 0;
|
||||
}
|
||||
}
|
||||
eixir = false;
|
||||
} else {
|
||||
if (JG_GetCycleCounter() % this->cycles_per_frame == 0) {
|
||||
this->cur_frame++;
|
||||
if (this->cur_frame == this->entitat->animacions[this->o].num_frames) {
|
||||
if (this->o == 4) {
|
||||
eixir = 1;
|
||||
} else {
|
||||
eixir = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return eixir;
|
||||
}
|
||||
#include "game/prota.hpp"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
#include "core/jail/jgame.hpp"
|
||||
#include "core/jail/jinput.hpp"
|
||||
|
||||
Prota::Prota(JD8_Surface gfx)
|
||||
: Sprite(gfx) {
|
||||
entitat.frames.reserve(82);
|
||||
|
||||
for (int y = 0; y < 4; y++) {
|
||||
for (int x = 0; x < 5; x++) {
|
||||
Frame f;
|
||||
f.w = 15;
|
||||
f.h = 15;
|
||||
if (info::ctx.num_piramide == 4) f.h -= 5;
|
||||
f.x = x * 15;
|
||||
f.y = 20 + (y * 15);
|
||||
entitat.frames.push_back(f);
|
||||
}
|
||||
}
|
||||
for (int y = 95; y < 185; y += 30) {
|
||||
for (int x = 60; x < 315; x += 15) {
|
||||
if (x != 300 || y != 155) {
|
||||
Frame f;
|
||||
f.w = 15;
|
||||
f.h = 30;
|
||||
if (info::ctx.num_piramide == 4) f.h -= 5;
|
||||
f.x = x;
|
||||
f.y = y;
|
||||
entitat.frames.push_back(f);
|
||||
}
|
||||
}
|
||||
}
|
||||
for (int y = 20; y < 50; y += 15) {
|
||||
for (int x = 225; x < 315; x += 15) {
|
||||
Frame f;
|
||||
f.w = 15;
|
||||
f.h = 15;
|
||||
if (info::ctx.num_piramide == 4) f.h -= 5;
|
||||
f.x = x;
|
||||
f.y = y;
|
||||
entitat.frames.push_back(f);
|
||||
}
|
||||
}
|
||||
|
||||
entitat.animacions.resize(6);
|
||||
for (int i = 0; i < 4; i++) {
|
||||
entitat.animacions[i].frames = {
|
||||
static_cast<Uint8>(0 + i * 5),
|
||||
static_cast<Uint8>(1 + i * 5),
|
||||
static_cast<Uint8>(2 + i * 5),
|
||||
static_cast<Uint8>(1 + i * 5),
|
||||
static_cast<Uint8>(0 + i * 5),
|
||||
static_cast<Uint8>(3 + i * 5),
|
||||
static_cast<Uint8>(4 + i * 5),
|
||||
static_cast<Uint8>(3 + i * 5),
|
||||
};
|
||||
}
|
||||
|
||||
entitat.animacions[4].frames.resize(50);
|
||||
for (int i = 0; i < 50; i++) entitat.animacions[4].frames[i] = i + 20;
|
||||
|
||||
entitat.animacions[5].frames.resize(48);
|
||||
for (int i = 0; i < 12; i++) entitat.animacions[5].frames[i] = i + 70;
|
||||
for (int i = 12; i < 48; i++) entitat.animacions[5].frames[i] = 81;
|
||||
|
||||
cur_frame = 0;
|
||||
x = 150;
|
||||
y = 30;
|
||||
o = 0;
|
||||
cycles_per_frame = 4;
|
||||
pergami = false;
|
||||
frame_pejades = 0;
|
||||
}
|
||||
|
||||
void Prota::draw() {
|
||||
Sprite::draw();
|
||||
|
||||
if (info::ctx.num_piramide == 4 && this->o != 4) {
|
||||
if ((JG_GetCycleCounter() % 40) < 20) {
|
||||
JD8_BlitCK(this->x, this->y, this->gfx, 220, 80, 15, 15, 255);
|
||||
} else {
|
||||
JD8_BlitCK(this->x, this->y, this->gfx, 235, 80, 15, 15, 255);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
Uint8 Prota::update() {
|
||||
Uint8 eixir = 0;
|
||||
|
||||
if (this->o < 4) {
|
||||
Uint8 dir = 4;
|
||||
if (JI_KeyPressed(SDL_SCANCODE_DOWN)) {
|
||||
if ((this->x - 20) % 65 == 0) this->o = 0;
|
||||
dir = this->o;
|
||||
}
|
||||
if (JI_KeyPressed(SDL_SCANCODE_UP)) {
|
||||
if ((this->x - 20) % 65 == 0) this->o = 1;
|
||||
dir = this->o;
|
||||
}
|
||||
if (JI_KeyPressed(SDL_SCANCODE_RIGHT)) {
|
||||
if ((this->y - 30) % 35 == 0) this->o = 2;
|
||||
dir = this->o;
|
||||
}
|
||||
if (JI_KeyPressed(SDL_SCANCODE_LEFT)) {
|
||||
if ((this->y - 30) % 35 == 0) this->o = 3;
|
||||
dir = this->o;
|
||||
}
|
||||
|
||||
switch (dir) {
|
||||
case 0:
|
||||
if (this->y < 170) this->y++;
|
||||
break;
|
||||
case 1:
|
||||
if (this->y > 30) this->y--;
|
||||
break;
|
||||
case 2:
|
||||
if (this->x < 280) this->x++;
|
||||
break;
|
||||
case 3:
|
||||
if (this->x > 20) this->x--;
|
||||
break;
|
||||
}
|
||||
|
||||
if (dir == 4) {
|
||||
this->cur_frame = 0;
|
||||
} else {
|
||||
this->frame_pejades++;
|
||||
if (this->frame_pejades == 15) this->frame_pejades = 0;
|
||||
if (JG_GetCycleCounter() % this->cycles_per_frame == 0) {
|
||||
this->cur_frame++;
|
||||
if (this->cur_frame == entitat.animacions[this->o].frames.size()) this->cur_frame = 0;
|
||||
}
|
||||
}
|
||||
eixir = false;
|
||||
} else {
|
||||
if (JG_GetCycleCounter() % this->cycles_per_frame == 0) {
|
||||
this->cur_frame++;
|
||||
if (this->cur_frame == entitat.animacions[this->o].frames.size()) {
|
||||
if (this->o == 4) {
|
||||
eixir = 1;
|
||||
} else {
|
||||
eixir = 2;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return eixir;
|
||||
}
|
||||
|
||||
@@ -1,26 +1,9 @@
|
||||
#include "game/sprite.hpp"
|
||||
|
||||
#include <stdlib.h>
|
||||
|
||||
Sprite::Sprite(JD8_Surface gfx) {
|
||||
this->gfx = gfx;
|
||||
this->entitat = NULL;
|
||||
}
|
||||
|
||||
Sprite::~Sprite(void) {
|
||||
if (this->entitat != NULL) {
|
||||
if (this->entitat->num_frames > 0) free(this->entitat->frames);
|
||||
|
||||
if (this->entitat->num_animacions > 0) {
|
||||
for (int i = 0; i < this->entitat->num_animacions; i++) {
|
||||
if (this->entitat->animacions[i].num_frames > 0) free(this->entitat->animacions[i].frames);
|
||||
}
|
||||
}
|
||||
|
||||
free(this->entitat);
|
||||
}
|
||||
}
|
||||
|
||||
void Sprite::draw() {
|
||||
JD8_BlitCK(this->x, this->y, this->gfx, this->entitat->frames[this->entitat->animacions[this->o].frames[this->cur_frame]].x, this->entitat->frames[this->entitat->animacions[this->o].frames[this->cur_frame]].y, this->entitat->frames[this->entitat->animacions[this->o].frames[this->cur_frame]].w, this->entitat->frames[this->entitat->animacions[this->o].frames[this->cur_frame]].h, 255);
|
||||
}
|
||||
#include "game/sprite.hpp"
|
||||
|
||||
Sprite::Sprite(JD8_Surface gfx)
|
||||
: gfx(gfx) {}
|
||||
|
||||
void Sprite::draw() {
|
||||
const Frame& f = entitat.frames[entitat.animacions[o].frames[cur_frame]];
|
||||
JD8_BlitCK(x, y, gfx, f.x, f.y, f.w, f.h, 255);
|
||||
}
|
||||
|
||||
@@ -1,40 +1,39 @@
|
||||
#pragma once
|
||||
|
||||
#include "core/jail/jdraw8.hpp"
|
||||
|
||||
struct Frame {
|
||||
Uint16 x;
|
||||
Uint16 y;
|
||||
Uint16 w;
|
||||
Uint16 h;
|
||||
};
|
||||
|
||||
struct Animacio {
|
||||
Uint8 num_frames;
|
||||
Uint8* frames;
|
||||
};
|
||||
|
||||
struct Entitat {
|
||||
Uint8 num_frames;
|
||||
Frame* frames;
|
||||
Uint8 num_animacions;
|
||||
Animacio* animacions;
|
||||
};
|
||||
|
||||
class Sprite {
|
||||
public:
|
||||
Sprite(JD8_Surface gfx);
|
||||
~Sprite(void);
|
||||
|
||||
void draw();
|
||||
|
||||
Entitat* entitat;
|
||||
Uint8 cur_frame;
|
||||
Uint16 x;
|
||||
Uint16 y;
|
||||
Uint16 o;
|
||||
|
||||
protected:
|
||||
JD8_Surface gfx;
|
||||
Uint8 cycles_per_frame;
|
||||
};
|
||||
#pragma once
|
||||
|
||||
#include <vector>
|
||||
|
||||
#include "core/jail/jdraw8.hpp"
|
||||
|
||||
struct Frame {
|
||||
Uint16 x;
|
||||
Uint16 y;
|
||||
Uint16 w;
|
||||
Uint16 h;
|
||||
};
|
||||
|
||||
struct Animacio {
|
||||
std::vector<Uint8> frames; // índexs dins d'Entitat::frames
|
||||
};
|
||||
|
||||
struct Entitat {
|
||||
std::vector<Frame> frames;
|
||||
std::vector<Animacio> animacions;
|
||||
};
|
||||
|
||||
class Sprite {
|
||||
public:
|
||||
Sprite(JD8_Surface gfx);
|
||||
virtual ~Sprite() = default;
|
||||
|
||||
void draw();
|
||||
|
||||
Entitat entitat;
|
||||
Uint8 cur_frame = 0;
|
||||
Uint16 x = 0;
|
||||
Uint16 y = 0;
|
||||
Uint16 o = 0;
|
||||
|
||||
protected:
|
||||
JD8_Surface gfx;
|
||||
Uint8 cycles_per_frame = 1;
|
||||
};
|
||||
|
||||
Reference in New Issue
Block a user