532 lines
12 KiB
C
532 lines
12 KiB
C
#include <stdio.h>
|
|
|
|
#include "SDL/SDL.h"
|
|
#include "SDL/SDL_image.h"
|
|
#include "SDL/SDL_ttf.h"
|
|
#include "SDL/SDL_mixer.h"
|
|
|
|
#include "enum.h"
|
|
#include "Engine.h"
|
|
#include "Player.h"
|
|
#include "Room.h"
|
|
#include "HyperKaos.h"
|
|
#include "Synergy.h"
|
|
|
|
typedef struct timer Timer;
|
|
typedef struct textBox TextBox;
|
|
typedef struct scene Scene;
|
|
#include "extern.h"
|
|
|
|
Room* newRoom(char* filename, int a)
|
|
{
|
|
Room* self = (Room*)malloc(sizeof(Room));
|
|
|
|
self->obstacle = malloc(4*sizeof(SDL_Rect));
|
|
self->numberOfObstacles = 0;
|
|
self->maxNumberOfObstacles = 4;
|
|
|
|
self->fgObject = malloc(4*sizeof(FGImage));
|
|
self->numberOfObj = 0;
|
|
self->maxNumberOfObj = 4;
|
|
self->objSpeed = a;
|
|
self->objIterator = 0;
|
|
|
|
self->warps = malloc(4*sizeof(WarpZone));
|
|
self->numberOfWarps = 0;
|
|
self->maxNumberOfWarps = 4;
|
|
|
|
self->eventTriggers = malloc(4*sizeof(HyperKaos*));
|
|
self->numberOfTriggers = 0;
|
|
self->maxNumberOfTriggers =4;
|
|
|
|
self->people = malloc(4*sizeof(Player*));
|
|
self->numberOfPeople = 0;
|
|
self->maxNumberOfPeople = 4;
|
|
|
|
self->sigils = malloc(4*sizeof(Synergy*));
|
|
self->numberOfSigils = 0;
|
|
self->maxNumberOfSigils = 4;
|
|
|
|
SDL_Rect zeroRect;
|
|
zeroRect.x=0;
|
|
zeroRect.y=0;
|
|
zeroRect.w=320;
|
|
zeroRect.h=180;
|
|
self->spriteSheet = loadImage(filename);
|
|
self->bgImage = loadImage("assets/img/backgrounds/loading.gif");
|
|
SDL_BlitSurface(self->spriteSheet, &zeroRect, self->bgImage, &zeroRect);
|
|
self->frameNo = 0;
|
|
|
|
return self;
|
|
}
|
|
|
|
void deleteRoom(Room* target)
|
|
{
|
|
int i;
|
|
free(target->obstacle);
|
|
target->obstacle = NULL;
|
|
|
|
for (i = 0; i < target->numberOfObj; i++)
|
|
{
|
|
SDL_FreeSurface(target->fgObject[i].spriteSheet);
|
|
target->fgObject[i].spriteSheet = NULL;
|
|
}
|
|
free(target->fgObject);
|
|
target->fgObject = NULL;
|
|
|
|
free(target->warps);
|
|
target->warps = NULL;
|
|
|
|
for (i = 0; i < target->numberOfTriggers; i++)
|
|
{
|
|
deleteHyperKaos(target->eventTriggers[i]);
|
|
}
|
|
free(target->eventTriggers);
|
|
target->eventTriggers = NULL;
|
|
|
|
for (i = 0; i < target->numberOfPeople; i++)
|
|
{
|
|
killPlayer(target->people[i]);
|
|
}
|
|
free(target->people);
|
|
|
|
|
|
SDL_FreeSurface(target->spriteSheet);
|
|
SDL_FreeSurface(target->bgImage);
|
|
target->spriteSheet = NULL;
|
|
target->bgImage = NULL;
|
|
|
|
free(target);
|
|
}
|
|
|
|
//
|
|
// room bg graphics
|
|
//
|
|
|
|
void changeRSprite(Room* self, SDL_Rect* clip)
|
|
{
|
|
SDL_Rect zeroOffset;
|
|
zeroOffset.x = 0;
|
|
zeroOffset.y = 0;
|
|
SDL_BlitSurface(self->spriteSheet, clip, self->bgImage, &zeroOffset);
|
|
}
|
|
|
|
void animate(Room* self)
|
|
{
|
|
SDL_Rect animClip;
|
|
animClip.w = 320;
|
|
animClip.h = 180;
|
|
animClip.x = 0;
|
|
|
|
if (self->frameNo == 0)
|
|
{
|
|
animClip.y = 180;
|
|
changeRSprite(self, &animClip);
|
|
}
|
|
if (self->frameNo == 10)
|
|
{
|
|
animClip.y = 360;
|
|
changeRSprite(self, &animClip);
|
|
}
|
|
if (self->frameNo == 20)
|
|
{
|
|
animClip.y = 540;
|
|
changeRSprite(self, &animClip);
|
|
}
|
|
if (self->frameNo == 30)
|
|
{
|
|
animClip.y = 360;
|
|
changeRSprite(self, &animClip);
|
|
}
|
|
if (self->frameNo == 40)
|
|
{
|
|
animClip.y = 180;
|
|
changeRSprite(self, &animClip);
|
|
}
|
|
if (self->frameNo == 50)
|
|
{
|
|
animClip.y = 0;
|
|
changeRSprite(self, &animClip);
|
|
}
|
|
self->frameNo++;
|
|
if (self->frameNo == 60) self->frameNo = 0;
|
|
}
|
|
|
|
//
|
|
// collision detection
|
|
//
|
|
|
|
int checkCollision(Room* self, Player* player, SDL_Rect* box)
|
|
{
|
|
int i;
|
|
|
|
for (i = 1; i <= self->numberOfObstacles; i++)
|
|
{
|
|
if (playerIsInRect(player, box))
|
|
// if ( (playerX >= box->x && playerX <= box->x + box->w)
|
|
// && (playerY >= box->y && playerY <= box->y + box->h) )
|
|
{
|
|
return 1;
|
|
}
|
|
box++;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int checkWCollision(Room* self, SDL_Rect* player, WarpZone* warpBoxes, int* whichWarp)
|
|
{
|
|
int i;
|
|
int playerX = player->x + (player->w)/2;
|
|
int playerY = player->y + (player->h)/2;
|
|
|
|
for (i = 1; i <= self->numberOfWarps; i++)
|
|
{
|
|
if ( (playerX >= (warpBoxes->location).x && playerX <= (warpBoxes->location).x + (warpBoxes->location).w)
|
|
&& (playerY >= (warpBoxes->location).y && playerY <= (warpBoxes->location).y + (warpBoxes->location).h))
|
|
{
|
|
*whichWarp = i-1;
|
|
return 1;
|
|
}
|
|
warpBoxes++;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
int checkKCollision(Room* self, SDL_Rect* player, HyperKaos** triggers, int* whichTrigger, int* kType)
|
|
{
|
|
int i;
|
|
int playerX = player->x + (player->w)/2;
|
|
int playerY = player->y + (player->h)/2;
|
|
|
|
for (i = 1; i <= self->numberOfTriggers; i++)
|
|
{
|
|
|
|
if ( (playerX > ((*triggers)->domain).x && playerX < ((*triggers)->domain).x + ((*triggers)->domain).w)
|
|
&& (playerY > ((*triggers)->domain).y && playerY < ((*triggers)->domain).y + ((*triggers)->domain).h) )
|
|
{
|
|
if ((*triggers)->eventType == 0)
|
|
{
|
|
*whichTrigger = i-1;
|
|
*kType = 0;
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
*whichTrigger = i-1;
|
|
*kType = 1;
|
|
return 1;
|
|
}
|
|
}
|
|
triggers++;
|
|
}
|
|
return 0;
|
|
}
|
|
|
|
//
|
|
// obstacles
|
|
//
|
|
|
|
void addObstacle(Room* self, int x, int y, int w, int h)
|
|
{
|
|
int i;
|
|
if (self->numberOfObstacles+1 > self->maxNumberOfObstacles)
|
|
{
|
|
self->maxNumberOfObstacles *= 2;
|
|
SDL_Rect* temp = malloc(self->maxNumberOfObstacles*sizeof(SDL_Rect));
|
|
for (i = 0; i < self->numberOfObstacles; i++)
|
|
temp[i] = self->obstacle[i];
|
|
free(self->obstacle);
|
|
self->obstacle = temp;
|
|
temp = NULL;
|
|
}
|
|
|
|
self->obstacle[self->numberOfObstacles].x = x;
|
|
self->obstacle[self->numberOfObstacles].y = y;
|
|
self->obstacle[self->numberOfObstacles].w = w;
|
|
self->obstacle[self->numberOfObstacles].h = h;
|
|
|
|
self->numberOfObstacles++;
|
|
}
|
|
|
|
void deleteObstacle(Room* self, int i)
|
|
{
|
|
int j;
|
|
SDL_Rect* temp = malloc(self->maxNumberOfObstacles*sizeof(SDL_Rect));
|
|
for (j = 0; j < i; j++)
|
|
temp[j] = self->obstacle[j];
|
|
for (j = i + 1; j < self->numberOfObstacles; j++)
|
|
temp[j-1] = self->obstacle[j];
|
|
free(self->obstacle);
|
|
self->obstacle = temp;
|
|
temp = NULL;
|
|
self->numberOfObstacles--;
|
|
}
|
|
|
|
//
|
|
// fg objects
|
|
//
|
|
|
|
void addFgObj(Room* self, int x, int y, int w, int h, char* filename, int f, int dual, int alpha)
|
|
{
|
|
int i;
|
|
if (self->numberOfObj+1 > self->maxNumberOfObj)
|
|
{
|
|
self->maxNumberOfObj *= 2;
|
|
FGImage* temp = malloc(self->maxNumberOfObj*sizeof(FGImage));;
|
|
for (i = 0; i < self->numberOfObj; i++)
|
|
temp[i] = self->fgObject[i];
|
|
free(self->fgObject);
|
|
self->fgObject = temp;
|
|
temp = NULL;
|
|
}
|
|
|
|
self->fgObject[self->numberOfObj].location.x = x;
|
|
self->fgObject[self->numberOfObj].location.y = y;
|
|
self->fgObject[self->numberOfObj].location.w = w;
|
|
self->fgObject[self->numberOfObj].location.h = h;
|
|
|
|
self->fgObject[self->numberOfObj].frames = f;
|
|
self->fgObject[self->numberOfObj].frameNow = 0;
|
|
self->fgObject[self->numberOfObj].dualLayer = dual;
|
|
|
|
self->fgObject[self->numberOfObj].spriteSheet = loadImage(filename);
|
|
if (alpha != 255)
|
|
SDL_SetAlpha(self->fgObject[self->numberOfObj].spriteSheet, SDL_SRCALPHA|SDL_RLEACCEL, alpha);
|
|
self->numberOfObj++;
|
|
|
|
}
|
|
|
|
void deleteFgObj(Room* self, int i)
|
|
{
|
|
int j;
|
|
FGImage* temp = malloc(self->maxNumberOfObj*sizeof(FGImage));
|
|
for (j = 0; j < i; j++)
|
|
temp[j] = self->fgObject[j];
|
|
for (j = i + 1; j < self->numberOfObj; j++)
|
|
temp[j-1] = self->fgObject[j];
|
|
SDL_FreeSurface(self->fgObject[i].spriteSheet);
|
|
free(self->fgObject);
|
|
self->fgObject = temp;
|
|
temp = NULL;
|
|
self->numberOfObj--;
|
|
}
|
|
|
|
void drawFgObjects1(Room* self)
|
|
{
|
|
int i;
|
|
SDL_Rect clip;
|
|
clip.y = 0;
|
|
|
|
if (self->numberOfObj != 0)
|
|
{
|
|
self->objIterator++;
|
|
|
|
for (i = 0; i < self->numberOfObj; i++)
|
|
{
|
|
clip.w = self->fgObject[i].location.w;
|
|
clip.x = self->fgObject[i].frameNow*clip.w;
|
|
clip.h = self->fgObject[i].location.h;
|
|
applySurface(self->fgObject[i].location.x, self->fgObject[i].location.y, self->fgObject[i].spriteSheet, screen, &clip );
|
|
if (self->objIterator == self->objSpeed)
|
|
self->fgObject[i].frameNow++;
|
|
if (self->fgObject[i].frameNow == self->fgObject[i].frames)
|
|
self->fgObject[i].frameNow = 0;
|
|
}
|
|
if (self->objIterator == self->objSpeed)
|
|
self->objIterator = 0;
|
|
}
|
|
}
|
|
|
|
void drawFgObjects2(Room* self)
|
|
{
|
|
int i;
|
|
SDL_Rect clip;
|
|
clip.y = 0;
|
|
|
|
if (self->numberOfObj != 0)
|
|
{
|
|
self->objIterator++;
|
|
|
|
for (i = 0; i < self->numberOfObj; i++)
|
|
{
|
|
if (self->fgObject[i].dualLayer)
|
|
{
|
|
clip.w = self->fgObject[i].location.w;
|
|
clip.x = self->fgObject[i].frameNow*clip.w;
|
|
clip.h = self->fgObject[i].location.h;
|
|
clip.y = clip.h;
|
|
applySurface(self->fgObject[i].location.x, self->fgObject[i].location.y, self->fgObject[i].spriteSheet, screen, &clip );
|
|
if (self->objIterator == self->objSpeed)
|
|
self->fgObject[i].frameNow++;
|
|
if (self->fgObject[i].frameNow == self->fgObject[i].frames)
|
|
self->fgObject[i].frameNow = 0;
|
|
}
|
|
}
|
|
if (self->objIterator == self->objSpeed)
|
|
self->objIterator = 0;
|
|
}
|
|
}
|
|
|
|
//
|
|
// warps
|
|
//
|
|
|
|
void addWarp(Room* self, int x, int y, int w, int h, enum dataChunks toChunk, int goesTo, int goesX, int goesY)
|
|
{
|
|
int i;
|
|
if (self->numberOfWarps+1 > self->maxNumberOfWarps)
|
|
{
|
|
self->maxNumberOfWarps *= 2;
|
|
WarpZone* temp = malloc(self->maxNumberOfWarps*sizeof(WarpZone));
|
|
for (i = 0; i < self->numberOfWarps; i++)
|
|
temp[i] = self->warps[i];
|
|
free(self->warps);
|
|
self->warps = temp;
|
|
temp = NULL;
|
|
}
|
|
|
|
self->warps[self->numberOfWarps].x = goesX;
|
|
self->warps[self->numberOfWarps].y = goesY;
|
|
|
|
self->warps[self->numberOfWarps].location.x = x;
|
|
self->warps[self->numberOfWarps].location.y = y;
|
|
self->warps[self->numberOfWarps].location.w = w;
|
|
self->warps[self->numberOfWarps].location.h = h;
|
|
|
|
self->warps[self->numberOfWarps].chunk = toChunk;
|
|
self->warps[self->numberOfWarps++].destination = goesTo;
|
|
|
|
}
|
|
|
|
void deleteWarp(Room* self, int i)
|
|
{
|
|
int j;
|
|
WarpZone* temp = malloc(self->maxNumberOfWarps*sizeof(WarpZone));
|
|
for (j = 0; j < i; j++)
|
|
temp[j] = self->warps[j];
|
|
for (j = i + 1; j < self->numberOfWarps; j++)
|
|
temp[j-1] = self->warps[j];
|
|
free(self->warps);
|
|
self->warps = temp;
|
|
temp = NULL;
|
|
self->numberOfWarps--;
|
|
}
|
|
|
|
//
|
|
// event triggers
|
|
//
|
|
|
|
void addTrigger(Room* self, HyperKaos* newTrigger)
|
|
{
|
|
int i;
|
|
if (self->numberOfTriggers+1 > self->maxNumberOfTriggers)
|
|
{
|
|
self->maxNumberOfTriggers *= 2;
|
|
HyperKaos** temp = malloc(self->maxNumberOfTriggers*sizeof(HyperKaos*));
|
|
for (i = 0; i < self->numberOfTriggers; i++)
|
|
temp[i] = self->eventTriggers[i];
|
|
free(self->eventTriggers);
|
|
self->eventTriggers = temp;
|
|
temp = NULL;
|
|
}
|
|
|
|
self->eventTriggers[self->numberOfTriggers++] = newTrigger;
|
|
}
|
|
|
|
void deleteTrigger(Room* self, int i)
|
|
{
|
|
int j;
|
|
HyperKaos** temp = malloc(self->maxNumberOfTriggers*sizeof(HyperKaos*));
|
|
for (j = 0; j < i; j++)
|
|
temp[j] = self->eventTriggers[j];
|
|
for (j = i + 1; j < self->numberOfTriggers; j++)
|
|
temp[j-1] = self->eventTriggers[j];
|
|
deleteHyperKaos(self->eventTriggers[i]);
|
|
free(self->eventTriggers);
|
|
self->eventTriggers = temp;
|
|
temp = NULL;
|
|
self->numberOfTriggers--;
|
|
}
|
|
|
|
void addSigil(Room* self, Synergy* newSigil)
|
|
{
|
|
int i;
|
|
if (self->numberOfSigils+1 > self->maxNumberOfSigils)
|
|
{
|
|
self->maxNumberOfSigils *= 2;
|
|
Synergy** temp = malloc(self->maxNumberOfSigils*sizeof(Synergy*));
|
|
for (i = 0; i < self->numberOfSigils; i++)
|
|
temp[i] = self->sigils[i];
|
|
free(self->sigils);
|
|
self->sigils = temp;
|
|
temp = NULL;
|
|
}
|
|
|
|
self->sigils[self->numberOfSigils++] = newSigil;
|
|
}
|
|
|
|
void deleteSigil(Room* self, int i)
|
|
{
|
|
int j;
|
|
Synergy** temp = malloc(self->maxNumberOfSigils*sizeof(Synergy*));
|
|
for (j = 0; j < i; j++)
|
|
temp[j] = self->sigils[j];
|
|
for (j = i + 1; j < self->numberOfSigils; j++)
|
|
temp[j-1] = self->sigils[j];
|
|
deleteSynergy(self->sigils[i]);
|
|
free(self->sigils);
|
|
self->sigils = temp;
|
|
temp = NULL;
|
|
self->numberOfSigils--;
|
|
}
|
|
|
|
void addPerson(Room* self, Player* newPlayer)
|
|
{
|
|
int i;
|
|
if (self->numberOfPeople+1 > self->maxNumberOfPeople)
|
|
{
|
|
self->maxNumberOfPeople *= 2;
|
|
Player** temp = malloc(self->maxNumberOfPeople*sizeof(Player*));
|
|
for (i = 0; i < self->numberOfPeople; i++)
|
|
temp[i] = self->people[i];
|
|
free(self->people);
|
|
self->people = temp;
|
|
temp = NULL;
|
|
}
|
|
|
|
self->people[self->numberOfPeople++] = newPlayer;
|
|
}
|
|
|
|
void deletePerson(Room* self, int i)
|
|
{
|
|
int j;
|
|
Player** temp = malloc(self->maxNumberOfPeople*sizeof(Player*));
|
|
for (j = 0; j < i; j++)
|
|
temp[j] = self->people[j];
|
|
for (j = i + 1; j < self->numberOfPeople; j++)
|
|
temp[j-1] = self->people[j];
|
|
killPlayer(self->people[i]);
|
|
free(self->people);
|
|
self->people = temp;
|
|
temp = NULL;
|
|
self->numberOfPeople--;
|
|
}
|
|
|
|
void drawPeople(Room* self)
|
|
{
|
|
int i;
|
|
for (i = 0; i < self->numberOfPeople; i++)
|
|
{
|
|
drawPlayer(self->people[i]);
|
|
}
|
|
}
|
|
|
|
//
|
|
// warp
|
|
//
|
|
|
|
void warpto(Room* destination)
|
|
{
|
|
rightHere = destination;
|
|
}
|
|
|