fase 1: jail i game a c++ idiomàtic (raii, info::ctx, cheats arreglats)

This commit is contained in:
2026-04-15 18:03:46 +02:00
parent 2c833d086e
commit 7f85b50c63
18 changed files with 834 additions and 804 deletions

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

@@ -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.

View File

@@ -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

View File

@@ -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;
}

View File

@@ -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) {

View File

@@ -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 {

View File

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

View File

@@ -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;
}
}

View File

@@ -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;
}

View File

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

View File

@@ -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;
};