diff --git a/Engine.c b/Engine.c index 90b6219..4521729 100644 --- a/Engine.c +++ b/Engine.c @@ -18,6 +18,7 @@ #include "Kaos.h" #include "HyperKaos.h" #include "Scene.h" +#include "Synergy.h" #include "extern.h" @@ -109,6 +110,7 @@ void interact() break; case B_BUTTON: spellbutton = 1; + break; case PAUSE_BUTTON: pausemenu(); break; @@ -156,11 +158,17 @@ void interact() case SDL_QUIT: quit = 1; playing = 0; break; } } - walkAnim(hero); } void kListen(int* whichKaos) { + if (spellbutton) + { + spellFlag = 0; + run(spellBook[0]); + synergize(); + spellFlag = -1; + } if (*whichKaos >= 0) { run(rightHere->eventTriggers[*whichKaos]); @@ -222,10 +230,32 @@ int init(int argc, char* args[]) sfxData = malloc(24*sizeof(Mix_Chunk*)); kaosData = malloc(124*sizeof(Kaos*)); theatre = malloc(8*sizeof(Scene*)); + + writeSpellBook(); + printf("Init complete\n"); return 1; } +void writeSpellBook() +{ + HyperKaos* testSpell = newHyperKaos(1,0,0,0,0,0); + Kaos* stopPlayer = newManip(hero, 0,0); + Kaos* beam = newSpell_Beam(); + addKaos(testSpell, stopPlayer); + addKaos(testSpell, beam); + + spellBook = malloc(4*sizeof(HyperKaos**)); + spellBook[0] = testSpell; +} + +void burnSpellBook() +{ + cleanHyperKaos(spellBook[0]); + deleteHyperKaos(spellBook[0]); + free(spellBook); +} + void toggleFullscreen() { if (!fullscreen) @@ -254,7 +284,6 @@ void cleanup() { if(fullscreen) SDL_ShowCursor(1); - printf("Freeing map data\n"); unloadData(thisChunk); @@ -272,6 +301,8 @@ void cleanup() free(theatre); + burnSpellBook(); + SDL_FreeSurface(textBoxBG); SDL_FreeSurface(nextArrow); SDL_FreeSurface(saveMenu); diff --git a/Engine.h b/Engine.h index 4776879..273b823 100644 --- a/Engine.h +++ b/Engine.h @@ -24,6 +24,8 @@ void kListen(int* whichKaos); int init(int argc, char* args[]); +void writeSpellBook(); + void toggleFullscreen(); void timeDilation(); diff --git a/HyperKaos.c b/HyperKaos.c index 4312e4e..c238849 100644 --- a/HyperKaos.c +++ b/HyperKaos.c @@ -35,9 +35,25 @@ void deleteHyperKaos(HyperKaos* self) free(self); } -// -// chains of events -// +void cleanHyperKaos(HyperKaos* self) +{ + Kaos* here = self->head; + Kaos* next; + savestate *= self->kaosID; + if (self->head == NULL) return; + + else + { + next = here->next; + while (here != NULL) + { + here->destroy(here); + here = next; + if (here != NULL) + next = here->next; + } + } +} void addKaos(HyperKaos* self, Kaos* target) { diff --git a/HyperKaos.h b/HyperKaos.h index 56b51cc..af3c3ec 100644 --- a/HyperKaos.h +++ b/HyperKaos.h @@ -10,6 +10,7 @@ typedef struct hyperKaos HyperKaos* newHyperKaos(int id, int type, int x, int y, int w, int h); void deleteHyperKaos(HyperKaos* target); +void cleanHyperKaos(HyperKaos* self); void run(HyperKaos* self); void addKaos(HyperKaos* self, Kaos* target); diff --git a/Kaos.c b/Kaos.c index dfa6d87..fef8173 100644 --- a/Kaos.c +++ b/Kaos.c @@ -358,7 +358,7 @@ void runErase(Kaos* self) { case 'w': deleteWarp(rightHere, kSelf->index); - break; + break; case 't': deleteTrigger(rightHere, kSelf->index); break; @@ -368,6 +368,9 @@ void runErase(Kaos* self) case 'f': deleteFgObj(rightHere, kSelf->index); break; + case 's': + deleteSigil(rightHere, kSelf->index); + break; default:break; } } @@ -417,4 +420,102 @@ void deleteWait(Kaos* target) { free(target->kType); free(target); +} + +Kaos* newSpell_Beam() +{ + Kaos* core = rawKaos(); + Spell_Beam* self = malloc(sizeof(Spell_Beam)); + + self->core = core; + core->kType = self; + + self->aura = loadImage("assets/img/fx/spellBeam.png"); + SDL_SetAlpha(self->aura, SDL_SRCALPHA|SDL_RLEACCEL, 124); + core->run = &runSpell_Beam; + core->destroy = &deleteSpell_Beam; + + return core; +} + +void runSpell_Beam(Kaos* self) +{ + int i; + char facing; + SDL_Rect offset, clip; + Spell_Beam* kSelf = self->kType; + if (playerFaces(hero, 's')) + { + facing = 's'; + offset.x = hero->boundBox.x - hero->boundBox.w/2; + offset.y = hero->boundBox.y + hero->boundBox.h; + clip.x = 0; + clip.y = 128; + clip.w = 32; + clip.h = 180; + } + else if (playerFaces(hero, 'w')) + { + facing = 'w'; + offset.x = hero->boundBox.x - SCREEN_WIDTH; + offset.y = hero->boundBox.y - hero->boundBox.h/2; + clip.x = 15; + clip.y = 0; + clip.w = 320; + clip.h = 32; + } + else if (playerFaces(hero, 'e')) + { + facing = 'e'; + offset.x = hero->boundBox.x + hero->boundBox.w; + offset.y = hero->boundBox.y - hero->boundBox.h/2; + clip.x = 0; + clip.y = 0; + clip.w = 320; + clip.h = 32; + } + else + { + facing = 'n'; + offset.x = hero->boundBox.x - hero->boundBox.w/2; + offset.y = hero->boundBox.y - SCREEN_HEIGHT; + clip.x = 128; + clip.y = 128; + clip.w = 32; + clip.h = 180; + } + + for (i = 0; i < 16; i++) + { + timeStart(fps); + renderBackground(); + renderForeground(); + switch (facing) + { + case 'n': + clip.x = 128 + (i%4)*32; + applySurface(offset.x, offset.y, kSelf->aura, screen, &clip); + break; + case 's': + clip.x = (i%4)*32; + applySurface(offset.x, offset.y, kSelf->aura, screen, &clip); + break; + case 'w': + case 'e': + clip.y = (i%4)*32; + applySurface(offset.x, offset.y, kSelf->aura, screen, &clip); + break; + } + SDL_Flip(screen); + timeDilation(); + } +} + +void deleteSpell_Beam(Kaos* target) +{ + Spell_Beam* kSelf = target->kType; + + SDL_FreeSurface(kSelf->aura); + free(kSelf); + free(target); } \ No newline at end of file diff --git a/Kaos.h b/Kaos.h index c499458..46f920c 100644 --- a/Kaos.h +++ b/Kaos.h @@ -75,6 +75,12 @@ typedef struct kaos_Wait int frames; } Wait; +typedef struct kaos_Spell_Beam +{ + Kaos* core; + SDL_Surface* aura; +} Spell_Beam; + Kaos* rawKaos(); Kaos* newConversation(int i); @@ -112,3 +118,7 @@ void deleteErase(Kaos* target); Kaos* newWait(char t, int i); void runWait(Kaos* self); void deleteWait(Kaos* target); + +Kaos* newSpell_Beam(); +void runSpell_Beam(Kaos* self); +void deleteSpell_Beam(Kaos* target); \ No newline at end of file diff --git a/Player.c b/Player.c index e97a2ff..d7cfe96 100644 --- a/Player.c +++ b/Player.c @@ -174,6 +174,7 @@ void movePlayer(Player* self, Room* hereNow) void drawPlayer(Player* self) { applySurface(self->point.x - 8, self->point.y - 8, self->sprite, screen, NULL); + walkAnim(self); } diff --git a/Room.c b/Room.c index f4df268..1f476f0 100644 --- a/Room.c +++ b/Room.c @@ -304,7 +304,7 @@ void deleteFgObj(Room* self, int i) temp[j] = self->fgObject[j]; for (j = i + 1; j < self->numberOfObj; j++) temp[j-1] = self->fgObject[j]; - free(self->fgObject[i].spriteSheet); + SDL_FreeSurface(self->fgObject[i].spriteSheet); free(self->fgObject); self->fgObject = temp; temp = NULL; diff --git a/Synergy.c b/Synergy.c index 1ae9729..71ce4f6 100644 --- a/Synergy.c +++ b/Synergy.c @@ -19,13 +19,13 @@ typedef struct timer Timer; typedef struct textBox TextBox; #include "extern.h" -Synergy* newSynergy(int s, char d, SDL_Rect z, HyperKaos* t) +Synergy* newSynergy(int s, char d, int x, int y, int w, int h, HyperKaos* t) { Synergy* self = malloc(sizeof(Synergy)); self->spell = s; self->dir = d; - self->zone = z; + self->zone = (SDL_Rect){x, y, w, h}; self->trigger = t; return self; @@ -36,16 +36,16 @@ void deleteSynergy(Synergy* target) free(target); } -void Synergize() +void synergize() { int i; - Synergy* sigil = rightHere->sigils[0]; + Synergy* sigil; for (i = 0; i < rightHere->numberOfSigils; i++) { + sigil = rightHere->sigils[i]; if (sigil->spell == spellFlag && playerFaces(hero, sigil->dir) && playerIsInRect(hero, &(sigil->zone))) run(sigil->trigger); - sigil++; } } \ No newline at end of file diff --git a/Synergy.h b/Synergy.h index ee9d4c3..b61c061 100644 --- a/Synergy.h +++ b/Synergy.h @@ -6,7 +6,7 @@ typedef struct synergy HyperKaos* trigger; } Synergy; -Synergy* newSynergy(int s, char d, SDL_Rect z, HyperKaos* t); +Synergy* newSynergy(int s, char d, int x, int y, int w, int h, HyperKaos* t); void deleteSynergy(Synergy* target); -void Synergize(); \ No newline at end of file +void synergize(); \ No newline at end of file diff --git a/WorldData.c b/WorldData.c index a7f4711..b84a747 100644 --- a/WorldData.c +++ b/WorldData.c @@ -4,7 +4,9 @@ #include "SDL/SDL_ttf.h" #include "SDL/SDL_mixer.h" +#include "config.h" #include "enum.h" + #include "Engine.h" #include "Player.h" #include "Room.h" @@ -12,6 +14,7 @@ #include "HyperKaos.h" #include "TextBox.h" #include "Scene.h" +#include "Synergy.h" typedef struct timer Timer; #include "extern.h" @@ -78,6 +81,9 @@ void bufferData(enum dataChunks chunk) kaosData[5] = newConversation(2); kaosData[6] = newConversation(3); kaosData[7] = newConversation(4); + kaosData[12] = newErase('f', 1); + kaosData[13] = newErase('o', 1); + kaosData[14] = newErase('s', 0); HyperKaos* choiceBranchA = newHyperKaos(1,0, 0, 0, 0, 0); addKaos(choiceBranchA, kaosData[7]); @@ -91,14 +97,26 @@ void bufferData(enum dataChunks chunk) addTrigger(mapBuffer[3], choiceBranchB); choiceBranchB = NULL; + HyperKaos* destroyChp2 = newHyperKaos(1,0,0,0,0,0); + + addKaos(destroyChp2, kaosData[12]); + addKaos(destroyChp2, kaosData[13]); + addKaos(destroyChp2, kaosData[14]); + + Synergy* testSigil = newSynergy(0,'e', 0, 74, 256, 48, destroyChp2); + addSigil(mapBuffer[0], testSigil); + + destroyChp2 = NULL; + testSigil = NULL; + kaosData[8] = newChoice("Let her know?", "Sure thing", "Nope", mapBuffer[3]->eventTriggers[0], mapBuffer[3]->eventTriggers[1]); if(notCompleted(3)) { HyperKaos* testTextBox = newHyperKaos(3, 0, 0, 0, 320, 180); + addKaos(testTextBox, kaosData[4]); addKaos(testTextBox, kaosData[0]); addKaos(testTextBox, kaosData[1]); - addKaos(testTextBox, kaosData[4]); addKaos(testTextBox, kaosData[8]); addTrigger(mapBuffer[3], testTextBox); @@ -135,15 +153,7 @@ void bufferData(enum dataChunks chunk) addTrigger(mapBuffer[1], randomDudeConvo); randomDudeConvo = NULL; - HyperKaos* chipDesc1 = newHyperKaos(1,1, 64, 64, 22, 55); - addKaos(chipDesc1, kaosData[5]); - addKaos(chipDesc1, kaosData[2]); - addTrigger(mapBuffer[0], chipDesc1); - chipDesc1 = NULL; - HyperKaos* chipDesc2 = newHyperKaos(1,1, 320 - 64 - 22, 64, 22, 55); - addKaos(chipDesc2, kaosData[5]); - addTrigger(mapBuffer[0], chipDesc2); - chipDesc2 = NULL; + break; case LEVEL2: @@ -186,7 +196,7 @@ void unloadData(enum dataChunks chunk) switch(chunk) { case LEVEL1: - dataPurge(4,5,12,1,0); + dataPurge(4,5,15,1,0); break; case LEVEL2: dataPurge(2,0,0,0,0); @@ -204,7 +214,7 @@ void pushBufferData() mapBuffer = (Room**)malloc(64*sizeof(Room*)); if (hasMusic) Mix_PlayMusic(bgmData[0], -1); - printf("Mapbuffer clean\n"); + printf("Map buffer clean\n"); } void pager() diff --git a/config.h b/config.h index 9501030..53503fb 100644 --- a/config.h +++ b/config.h @@ -10,3 +10,8 @@ #define R_BUTTON SDLK_p #define FS_BUTTON SDLK_f #define PAUSE_BUTTON SDLK_q + +#define SCREEN_WIDTH 320 +#define SCREEN_HEIGHT 180 + +#define SOUND_ON