Commit ba72b792 authored by EXL's avatar EXL
Browse files

Fix resolution to 480x272, fix Keys,

Add qmake "*.pro" file
parents
# Compiled Object files
*.slo
*.lo
*.o
*.obj
# Compiled Dynamic libraries
*.so
*.dylib
*.dll
# Compiled Static libraries
*.lai
*.la
*.a
*.lib
# Executables
*.exe
\ No newline at end of file
This diff is collapsed.
This diff is collapsed.
#include "nx.h"
#include "common/llist.h"
#include "ObjManager.h"
#include "ObjManager.fdh"
static Object ZERO_OBJECT;
static Player ZERO_PLAYER;
Object *firstobject = NULL, *lastobject = NULL;
Object *lowestobject = NULL, *highestobject = NULL;
/*
void c------------------------------() {}
*/
Object *CreateObject(int x, int y, int type, int xinertia, int yinertia,
int dir, Object *linkedobject, uint32_t createflags)
{
Object *o;
// create the structure
if (type != OBJ_PLAYER)
{
o = new Object;
*o = ZERO_OBJECT; // safely clears all members
}
else
{
Player *p = new Player;
*p = ZERO_PLAYER;
o = (Object *)p;
}
// initialize
o->SetType(type);
o->flags = objprop[type].defaultflags;
o->DamageText = new FloatText(SPR_REDNUMBERS);
o->x = x - (sprites[o->sprite].spawn_point.x << CSF);
o->y = y - (sprites[o->sprite].spawn_point.y << CSF);
o->dir = dir;
o->xinertia = xinertia;
o->yinertia = yinertia;
o->linkedobject = linkedobject;
// add into list
LL_ADD_END(o, prev, next, firstobject, lastobject);
LL_ADD_END(o, lower, higher, lowestobject, highestobject);
// set it's initial blocked states, but do not update blockedstates on objects starting
// with nullsprite-- the reason is for objects whose sprite is set after being spawned
if (o->sprite != SPR_NULL)
o->UpdateBlockStates(ALLDIRMASK);
if (!(createflags & CF_NO_SPAWN_EVENT))
o->OnSpawn();
return o;
}
Object *CreateObject(int x, int y, int type)
{
return CreateObject(x, y, type, 0, 0, RIGHT, NULL, CF_DEFAULT);
}
/*
void c------------------------------() {}
*/
// update the blocked states of all objects
void Objects::UpdateBlockStates(void)
{
Object *o = firstobject;
while(o)
{
o->lastblockl = o->blockl;
o->lastblockr = o->blockr;
o->lastblocku = o->blocku;
o->lastblockd = o->blockd;
o->UpdateBlockStates(ALLDIRMASK);
o = o->next;
}
}
// returns true if the bounding boxes of the two given objects are touching
bool hitdetect(Object *o1, Object *o2)
{
SIFSprite *s1, *s2;
int32_t rect1x1, rect1y1, rect1x2, rect1y2;
int32_t rect2x1, rect2y1, rect2x2, rect2y2;
// get the sprites used by the two objects
s1 = o1->Sprite();
s2 = o2->Sprite();
// get the bounding rectangle of the first object
rect1x1 = o1->x + (s1->bbox.x1 << CSF);
rect1x2 = o1->x + (s1->bbox.x2 << CSF);
rect1y1 = o1->y + (s1->bbox.y1 << CSF);
rect1y2 = o1->y + (s1->bbox.y2 << CSF);
// get the bounding rectangle of the second object
rect2x1 = o2->x + (s2->bbox.x1 << CSF);
rect2x2 = o2->x + (s2->bbox.x2 << CSF);
rect2y1 = o2->y + (s2->bbox.y1 << CSF);
rect2y2 = o2->y + (s2->bbox.y2 << CSF);
// find out if the rectangles overlap
if ((rect1x1 < rect2x1) && (rect1x2 < rect2x1)) return false;
if ((rect1x1 > rect2x2) && (rect1x2 > rect2x2)) return false;
if ((rect1y1 < rect2y1) && (rect1y2 < rect2y1)) return false;
if ((rect1y1 > rect2y2) && (rect1y2 > rect2y2)) return false;
return true;
}
// returns true if the solidity boxes of the two given objects are touching
bool solidhitdetect(Object *o1, Object *o2)
{
SIFSprite *s1, *s2;
int32_t rect1x1, rect1y1, rect1x2, rect1y2;
int32_t rect2x1, rect2y1, rect2x2, rect2y2;
// get the sprites used by the two objects
s1 = o1->Sprite();
s2 = o2->Sprite();
// get the bounding rectangle of the first object
rect1x1 = o1->x + (s1->solidbox.x1 << CSF);
rect1x2 = o1->x + (s1->solidbox.x2 << CSF);
rect1y1 = o1->y + (s1->solidbox.y1 << CSF);
rect1y2 = o1->y + (s1->solidbox.y2 << CSF);
// get the bounding rectangle of the second object
rect2x1 = o2->x + (s2->solidbox.x1 << CSF);
rect2x2 = o2->x + (s2->solidbox.x2 << CSF);
rect2y1 = o2->y + (s2->solidbox.y1 << CSF);
rect2y2 = o2->y + (s2->solidbox.y2 << CSF);
// find out if the rectangles overlap
if ((rect1x1 < rect2x1) && (rect1x2 < rect2x1)) return false;
if ((rect1x1 > rect2x2) && (rect1x2 > rect2x2)) return false;
if ((rect1y1 < rect2y1) && (rect1y2 < rect2y1)) return false;
if ((rect1y1 > rect2y2) && (rect1y2 > rect2y2)) return false;
return true;
}
/*
void c------------------------------() {}
*/
// runs all entity AI routines
void Objects::RunAI(void)
{
Object *o;
// because we handle objects in order of their creation and have a separate list
// for display order, we can't ever run AI twice in a frame because of z-order
// rearrangement, and 2) objects created by other objects are added to the end of
// the list and given a chance to run their AI routine before being displayed.
FOREACH_OBJECT(o)
{
if (!o->deleted)
o->RunAI();
}
}
// the most important thing it does is apply x/y inertia to the objects.
void Objects::PhysicsSim(void)
{
Object *o;
int xinertia, yinertia;
FOREACH_OBJECT(o)
{
if (o != player && !o->deleted) // player is moved in PDoPhysics
{
if (!(o->flags & FLAG_IGNORE_SOLID) && \
!(o->nxflags & NXFLAG_NO_RESET_YINERTIA))
{
if (o->blockd && o->yinertia > 0) o->yinertia = 0;
if (o->blocku && o->yinertia < 0) o->yinertia = 0;
}
// apply inertia to X,Y position
xinertia = o->xinertia;
yinertia = o->yinertia;
if (o->shaketime)
{
if (o->nxflags & NXFLAG_SLOW_X_WHEN_HURT) xinertia >>= 1;
if (o->nxflags & NXFLAG_SLOW_Y_WHEN_HURT) yinertia >>= 1;
}
o->apply_xinertia(xinertia);
o->apply_yinertia(yinertia);
// flag_solid_brick objects push player as they move
if (o->flags & FLAG_SOLID_BRICK)
{
o->PushPlayerOutOfWay(xinertia, yinertia);
}
else if (o->damage > 0)
{
// have enemies hurt you when you touch them
// (solid-brick objects do this in PHandleSolidBrickObjects)
if (hitdetect(o, player))
o->DealContactDamage();
}
}
}
}
/*
void c------------------------------() {}
*/
// returns how many objects exist of the given type
int Objects::CountType(int objtype)
{
int count = 0;
Object *o;
FOREACH_OBJECT(o)
{
if (o->type == objtype)
count++;
}
return count;
}
// returns the first object of type objtype or NULL
Object *Objects::FindByType(int objtype)
{
Object *o;
FOREACH_OBJECT(o)
{
if (o->type == objtype)
return o;
}
return NULL;
}
/*
void c------------------------------() {}
*/
// free objects deleted earlier via ObjDel
void Objects::CullDeleted(void)
{
Object *o, *next;
o = firstobject;
while(o)
{
next = o->next;
if (o->deleted)
{
o->Destroy();
}
o = next;
}
}
// deletes all objects. if delete_player is true, also deletes the player.
// used by load_pxe to reset the game in preperation for loading a new maplayer->
void Objects::DestroyAll(bool delete_player)
{
Object *o, *next;
o = firstobject;
while(o)
{
next = o->next;
if (o != player)
{
o->Destroy();
}
o = next;
}
// must do this last to avoid crashes as player ptr gets invalidated
if (delete_player)
{
player->Destroy();
}
memset(ID2Lookup, 0, sizeof(ID2Lookup));
}
//hash:3b98a341
//automatically generated by Makegen
/* located in ObjManager.cpp */
//------------------[referenced from ObjManager.cpp]-----------------//
Object *CreateObject(int x, int y, int type);
bool hitdetect(Object *o1, Object *o2);
bool solidhitdetect(Object *o1, Object *o2);
#ifndef _OBJMANAGER_H
#define _OBJMANAGER_H
namespace Objects
{
void UpdateBlockStates(void);
int CountType(int objtype);
void RunAI(void);
void PhysicsSim(void);
int IsRearTopAttack(Object *o);
void CullDeleted(void);
void DestroyAll(bool delete_player);
Object *FindByType(int type);
};
// synonyms
#define CountObjectsOfType Objects::CountType
#define FOREACH_OBJECT(O) for(O=firstobject; O; O=O->next)
// max expected objects to exist at once (for buffer allocation)
#define MAX_OBJECTS 1024
enum CreateObjectFlags
{
CF_NO_SPAWN_EVENT = 0x01, // inhibit calling OnSpawn
CF_DEFAULT = 0x00
};
Object *CreateObject(int x, int y, int type);
Object *CreateObject(int x, int y, int type, int xinertia, int yinertia, \
int dir=0, Object *linkedobject=NULL, uint32_t createflags=CF_DEFAULT);
// ObjProp definitions
struct ObjProp
{
// NXEngine-specific
int sprite;
int shaketime; // how long it shakes for when hit
uint32_t defaultnxflags;
// from npc.tbl
int initial_hp;
int xponkill;
int damage;
int hurt_sound, death_sound;
int death_smoke_amt;
uint32_t defaultflags;
// AI routines
struct
{
// executed every tick
void (*ontick)(Object *o);
// executed after physics sim has been done
void (*aftermove)(Object *o);
// if present, then when damage to the object causes it's hp to <= 0,
// this is executed instead of destroying the object or following the
// normal boom/spawn powerups routine.
void (*ondeath)(Object *o);
// executed when the object is first created or it's type is changed.
// intended for static objects which only require a small amount of
// initilization. This is NOT guaranteed to be only called exactly once
// for a given object.
void (*onspawn)(Object *o);
} ai_routines;
};
extern ObjProp objprop[OBJ_LAST];
extern Object *firstobject, *lastobject;
extern Object *lowestobject, *highestobject;
#endif
/*
The powerup display for textboxes.
E.g. when you get a life capsule or new weapon and
it shows you a picture of it.
*/
#include "../nx.h"
#include "ItemImage.h"
#include "ItemImage.fdh"
#define ITEMBOX_W 76
#define ITEMBOX_H 32
#define ITEMBOX_X 128
#define ITEMBOX_Y 120
/*
void c------------------------------() {}
*/
void TB_ItemImage::ResetState()
{
fVisible = false;
}
void TB_ItemImage::SetVisible(bool enable)
{
fVisible = enable;
}
void TB_ItemImage::SetSprite(int sprite, int frame)
{
fSprite = sprite;
fFrame = frame;
fYOffset = 1;
}
/*
void c------------------------------() {}
*/
void TB_ItemImage::Draw(void)
{
if (!fVisible)
return;
// animate moving item downwards into box
int desty = (ITEMBOX_H / 2) - (sprites[fSprite].h / 2);
if (++fYOffset > desty) fYOffset = desty;
// draw the box frame
TextBox::DrawFrame(ITEMBOX_X, ITEMBOX_Y, ITEMBOX_W, ITEMBOX_H);
// draw the item
int x = ITEMBOX_X + ((ITEMBOX_W / 2) - (sprites[fSprite].w / 2));
if (sprites[fSprite].w == 14) x--; // hack for ArmsIcons
draw_sprite(x, ITEMBOX_Y + fYOffset, fSprite, fFrame);
}
//hash:00000000
//automatically generated by Makegen
#ifndef _ITEMIMAGE_H
#define _ITEMIMAGE_H
class TB_ItemImage
{
public:
void ResetState();
void Draw();
void SetVisible(bool enable);
void SetSprite(int sprite, int frame);
private:
bool fVisible;
int fSprite, fFrame;
int fYOffset;
};
#endif
/*
The save select box (for multiple save files).
*/
#include "../nx.h"
#include "../profile.h"
#include "../inventory.h"
#include "../replay.h"
#include "TextBox.h" // for textbox coordinates; MSG_W etc
#include "SaveSelect.h"
#include "SaveSelect.fdh"
// moved here as static data so that the compiler will shut up about a circular dependency
// that happens if you try to include profile.h from SaveSelect.h.
static Profile fProfiles[MAX_SAVE_SLOTS];
static bool fHaveProfile[MAX_SAVE_SLOTS];
int fPicXOffset;
TB_SaveSelect::TB_SaveSelect()
{
}
/*
void c------------------------------() {}
*/
void TB_SaveSelect::ResetState()
{
fVisible = false;
}
void TB_SaveSelect::SetVisible(bool enable, bool saving)
{
fVisible = enable;
if (!enable) return;
game.showmapnametime = 0;
fCoords.w = 244;
fCoords.h = 152;
#ifdef _RZX50
fCoords.x = (SCREEN_WIDTH / 2) - (fCoords.w / 2);
#else
fCoords.x = 38;
fCoords.y = 8;
#endif
fNumFiles = MAX_SAVE_SLOTS;
fSaving = saving;
fCurSel = settings->last_save_slot;
fPicXOffset = -24;
// load all profiles
memset(fHaveProfile, 0, sizeof(fHaveProfile));
for(int i=0;i<fNumFiles;i++)
{
if (!profile_load(GetProfileName(i), &fProfiles[i]))
fHaveProfile[i] = true;
}
textbox.ClearText();
}
bool TB_SaveSelect::IsVisible()
{
return fVisible;
}
/*
void c------------------------------() {}
*/
void TB_SaveSelect::Run_Input()
{
int start;
if (justpushed(DOWNKEY))
{
start = fCurSel;
for(;;)
{
fCurSel++;
if (fCurSel >= fNumFiles) fCurSel = 0;
if (fSaving) break;
if (fHaveProfile[fCurSel]) break;
if (fCurSel == start) break;
}
sound(SND_MENU_MOVE);
fPicXOffset = -24;
}
if (justpushed(UPKEY))
{
start = fCurSel;
for(;;)
{
fCurSel--;
if (fCurSel < 0) fCurSel = fNumFiles - 1;
if (fSaving) break;
if (fHaveProfile[fCurSel]) break;
if (fCurSel == start) break;
}
sound(SND_MENU_MOVE);
fPicXOffset = -24;
}
if (buttonjustpushed())
{
// when shown in a replay, the box is shown and everything just like what was done
// originally, but we won't actually overwrite any save files.
if (!Replay::IsPlaying())
{
if (fSaving)