git-svn-id: https://clonekeenplus.svn.sourceforge.net/svnroot/clonekeenplus/cgenius/trunk@87 4df4b0f3-56ce-47cb-b001-ed939b7d65a6
172 lines
4.4 KiB
C++
172 lines
4.4 KiB
C++
/*
|
|
* CEGASprit.cpp
|
|
*
|
|
* Created on: 11.07.2009
|
|
* Author: gerstrong
|
|
*
|
|
* Yes, it should be CEGASprite, bute since the file name
|
|
* is called EGASPRIT.CK? it is left that way,
|
|
* to make the understanding clearer
|
|
*/
|
|
|
|
#include "CEGASprit.h"
|
|
#include "CPlanes.h"
|
|
#include "../keen.h"
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
|
|
////////////////////////
|
|
// section of defines //
|
|
////////////////////////
|
|
|
|
#define CSF 5
|
|
|
|
extern stSprite *sprites;
|
|
|
|
CEGASprit::CEGASprit(int planesize,
|
|
long spritestartloc,
|
|
int numsprites,
|
|
long spriteloc)
|
|
{
|
|
m_planesize = planesize;
|
|
m_spritestartloc = spritestartloc;
|
|
m_numsprites = numsprites;
|
|
m_spriteloc = spriteloc;
|
|
Sprite = NULL;
|
|
sprites = NULL;
|
|
}
|
|
|
|
CEGASprit::~CEGASprit() {
|
|
if(Sprite) delete [] Sprite, Sprite = NULL;
|
|
if(sprites) delete [] sprites, sprites = NULL;
|
|
}
|
|
|
|
|
|
bool CEGASprit::loadHead(char *data)
|
|
{
|
|
data += m_spritestartloc;
|
|
|
|
Sprite = new st_sprite[m_numsprites];
|
|
|
|
for(int i=0 ; i<m_numsprites ; i++ )
|
|
{
|
|
memcpy(&(Sprite[i].width),data+128*i,2);
|
|
memcpy(&(Sprite[i].height),data+128*i+2,2);
|
|
memcpy(&(Sprite[i].location_offset),data+128*i+4,2);
|
|
memcpy(&(Sprite[i].location),data+128*i+6,2);
|
|
memcpy(&(Sprite[i].hitbox_l),data+128*i+8,2);
|
|
memcpy(&(Sprite[i].hitbox_u),data+128*i+10,2);
|
|
memcpy(&(Sprite[i].hitbox_r),data+128*i+12,2);
|
|
memcpy(&(Sprite[i].hitbox_b),data+128*i+14,2);
|
|
memcpy(Sprite[i].name,data+128*i+16,12);
|
|
memcpy(&(Sprite[i].hv_offset),data+128*i+28,4);
|
|
|
|
Sprite[i].width *= 8; // Another case where the width is divided by 8
|
|
Sprite[i].hitbox_l >>= 8;
|
|
Sprite[i].hitbox_u >>= 8;
|
|
Sprite[i].hitbox_r >>= 8;
|
|
Sprite[i].hitbox_b >>= 8;
|
|
}
|
|
|
|
return true;
|
|
}
|
|
|
|
bool CEGASprit::loadData(const std::string& filename, bool compresseddata)
|
|
{
|
|
char *RawData;
|
|
|
|
FILE* latchfile = fopen(filename.c_str(),"rb");
|
|
|
|
if(!latchfile)
|
|
return false;
|
|
|
|
RawData = new char[m_planesize * 5];
|
|
// get the data out of the file into the memory, decompressing it if necessary.
|
|
if (compresseddata)
|
|
{
|
|
if (lz_decompress(latchfile, (unsigned char*) RawData))
|
|
return 1;
|
|
}
|
|
else
|
|
{
|
|
for(int i=0 ; i<(m_planesize*5) ; i++)
|
|
RawData[i] = fgetc(latchfile);
|
|
}
|
|
|
|
fclose(latchfile);
|
|
|
|
// TODO: Try to blit the Font map here!
|
|
// these are the offsets of the different video planes as
|
|
// relative to each other--that is if a pixel in plane1
|
|
// is at N, the byte for that same pixel in plane3 will be
|
|
// at (N + plane3).
|
|
unsigned long plane1, plane2, plane3, plane4, plane5;
|
|
|
|
plane1 = 0;
|
|
plane2 = (m_planesize * 1);
|
|
plane3 = (m_planesize * 2);
|
|
plane4 = (m_planesize * 3);
|
|
plane5 = (m_planesize * 4);
|
|
|
|
CPlanes *Planes = new CPlanes(plane1 + m_spriteloc,
|
|
plane2 + m_spriteloc,
|
|
plane3 + m_spriteloc,
|
|
plane4 + m_spriteloc,
|
|
plane5 + m_spriteloc);
|
|
|
|
// TODO: Create surfaces which can be blitted directly to the blit surface or maybe screen.
|
|
// load the image data
|
|
sprites = new stSprite[301];
|
|
char c;
|
|
for(int p=0 ; p<4 ; p++)
|
|
{
|
|
for(int s=0 ; s<m_numsprites ; s++)
|
|
{
|
|
sprites[s].xsize = Sprite[s].width;
|
|
sprites[s].ysize = Sprite[s].height;
|
|
sprites[s].bboxX1 = (Sprite[s].hitbox_l << CSF);
|
|
sprites[s].bboxY1 = (Sprite[s].hitbox_u << CSF);
|
|
sprites[s].bboxX2 = (Sprite[s].hitbox_r << CSF);
|
|
sprites[s].bboxY2 = (Sprite[s].hitbox_b << CSF);
|
|
|
|
for(int y=0 ; y<sprites[s].ysize ; y++)
|
|
{
|
|
for(int x=0 ; x<sprites[s].xsize ; x++)
|
|
{
|
|
if (p==0)
|
|
{
|
|
c = 0;
|
|
}
|
|
else
|
|
{
|
|
c = sprites[s].imgdata[y][x];
|
|
}
|
|
c |= (Planes->getbit(RawData, p) << p);
|
|
if (p==3 && c==0) c = 16;
|
|
sprites[s].imgdata[y][x] = c;
|
|
}
|
|
}
|
|
}
|
|
}
|
|
|
|
// now load the 5th plane, which contains the sprite masks.
|
|
// note that we invert the mask because our graphics functions
|
|
// use white on black masks whereas keen uses black on white.
|
|
for(int s=0 ; s<m_numsprites ; s++)
|
|
{
|
|
for(int y=0 ; y<sprites[s].ysize ; y++)
|
|
{
|
|
for(int x=0 ; x<sprites[s].xsize ; x++)
|
|
{
|
|
sprites[s].maskdata[y][x] = (1 - Planes->getbit(RawData, 4));
|
|
}
|
|
}
|
|
}
|
|
|
|
delete Planes;
|
|
|
|
if(RawData){ delete[] RawData; RawData = NULL;}
|
|
|
|
return true;
|
|
}
|