247 lines
7.3 KiB
C++
247 lines
7.3 KiB
C++
/*
|
|
* Copyright (C) 2002,2003,2004,2005 Daniel Heck
|
|
*
|
|
* This program is free software; you can redistribute it and/or
|
|
* modify it under the terms of the GNU General Public License
|
|
* as published by the Free Software Foundation; either version 2
|
|
* of the License, or (at your option) any later version.
|
|
*
|
|
* This program is distributed in the hope that it will be useful,
|
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
* GNU General Public License for more details.
|
|
*
|
|
* You should have received a copy of the GNU General Public License along
|
|
* with this program; if not, write to the Free Software Foundation, Inc.,
|
|
* 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
|
|
*
|
|
*/
|
|
#ifndef DISPLAY_HH_INCLUDED
|
|
#define DISPLAY_HH_INCLUDED
|
|
|
|
#include "enigma.hh"
|
|
#include "ecl.hh"
|
|
|
|
//----------------------------------------
|
|
// Definition of models
|
|
//----------------------------------------
|
|
namespace display
|
|
{
|
|
class DisplayLayer;
|
|
class ModelLayer;
|
|
|
|
/*! Animations can invoke a callback of this type on completion.
|
|
Note that you may not delete or replace models other than the
|
|
one that induced the callback from inside the callback--use a
|
|
timer or a flag to do this. */
|
|
class ModelCallback {
|
|
public:
|
|
virtual ~ModelCallback() {}
|
|
virtual void animcb() = 0;
|
|
};
|
|
|
|
class Animation {
|
|
public:
|
|
virtual ~Animation() {}
|
|
virtual void set_callback (ModelCallback *) {}
|
|
virtual void reverse() {}
|
|
virtual void restart() {}
|
|
|
|
virtual bool is_garbage() const { return false; }
|
|
virtual void tick(double /*dtime*/) {}
|
|
virtual bool has_changed(ecl::Rect &/*changed_region*/) { return false; }
|
|
};
|
|
|
|
class Model : public Animation {
|
|
public:
|
|
|
|
virtual void draw(ecl::GC &/*gc*/, int /*x*/, int /*y*/) {}
|
|
virtual void draw_shadow(ecl::GC &/*gc*/, int /*x*/, int /*y*/) {}
|
|
|
|
virtual Model *get_shadow() const { return 0; }
|
|
|
|
virtual void expose (ModelLayer * /*ml*/, int videox, int videoy) {}
|
|
virtual void remove (ModelLayer * /*ml*/) {}
|
|
|
|
virtual Model *clone() = 0;
|
|
virtual void get_extension (ecl::Rect &r);
|
|
};
|
|
|
|
/* -------------------- Functions -------------------- */
|
|
|
|
void InitModels();
|
|
void ShutdownModels();
|
|
|
|
Model * MakeModel (const std::string &name);
|
|
|
|
|
|
int DefineImage (const char *name, const char *fname,
|
|
int xoff, int yoff, int padding);
|
|
int DefineSubImage (const char *name, const char *fname,
|
|
int xoff, int yoff, ecl::Rect r);
|
|
void DefineRandModel (const char *name, int n, char **names);
|
|
void DefineShadedModel (const char *name, const char *model, const char *shade);
|
|
void DefineOverlayImage (const char *name, int n, char **images);
|
|
void DefineComposite (const char *name, const char *bgname, const char *fgname);
|
|
void DefineAnim (const char *name, bool loop_p);
|
|
void AddFrame (const char *name, const char *model, double time);
|
|
void DefineAlias (const char *name, const char *othername);
|
|
}
|
|
|
|
//----------------------------------------
|
|
// Models on the grid
|
|
//----------------------------------------
|
|
namespace display
|
|
{
|
|
using enigma::GridPos;
|
|
using enigma::GridLayer;
|
|
using enigma::GridLoc;
|
|
|
|
Model* SetModel (const GridLoc & l, const std::string &modelname);
|
|
Model* SetModel (const GridLoc & l, Model *m);
|
|
void KillModel (const GridLoc & l);
|
|
Model* GetModel (const GridLoc & l);
|
|
Model* YieldModel (const GridLoc & l);
|
|
}
|
|
|
|
/* -------------------- Scrolling -------------------- */
|
|
namespace display
|
|
{
|
|
enum FollowMode {
|
|
FOLLOW_NONE = 0, // Don't follow any sprite
|
|
FOLLOW_SCROLLING = 1, // Scroll the screen
|
|
FOLLOW_SCREEN = 2, // Flip the screen region
|
|
FOLLOW_SCREENSCROLLING = 3, // Scroll to the next screen
|
|
FOLLOW_SMOOTH = 4, // Follow pixel by pixel
|
|
};
|
|
|
|
|
|
void SetFollowMode (FollowMode m);
|
|
void SetScrollBoundary (double boundary);
|
|
|
|
void SetReferencePoint (const ecl::V2 &point);
|
|
void GetReferencePointCoordinates(int *x, int *y);
|
|
void FocusReferencePoint();
|
|
}
|
|
|
|
/* -------------------- Sprites -------------------- */
|
|
namespace display
|
|
{
|
|
enum SpriteLayer {
|
|
SPRITE_ACTOR, SPRITE_EFFECT, SPRITE_DEBRIS
|
|
};
|
|
|
|
typedef unsigned int SpriteId;
|
|
|
|
class DL_Sprites;
|
|
|
|
class SpriteHandle {
|
|
DL_Sprites *layer;
|
|
unsigned id;
|
|
public:
|
|
SpriteHandle (DL_Sprites *l, unsigned spriteid);
|
|
SpriteHandle();
|
|
|
|
void kill();
|
|
void move (const ecl::V2 &newpos) const;
|
|
void replace_model (Model *m) const;
|
|
Model *get_model () const;
|
|
void set_callback (ModelCallback *cb) const;
|
|
void hide() const;
|
|
void show() const;
|
|
};
|
|
|
|
/*! Add a new effect sprite. Sprites of this type are
|
|
automatically deleted once the animation has finished. */
|
|
SpriteHandle AddEffect (const ecl::V2 &pos, const char *modelname);
|
|
|
|
/*! Create a new sprite. If modelname==0, the sprite is
|
|
considered invisible. Sprites of this type are _never_
|
|
automatically deleted. */
|
|
SpriteHandle AddSprite (const ecl::V2 &pos, const char *modelname=0);
|
|
|
|
}
|
|
|
|
/* -------------------- Rubber bands -------------------- */
|
|
namespace display
|
|
{
|
|
class DL_Lines;
|
|
|
|
class RubberHandle {
|
|
public:
|
|
RubberHandle (DL_Lines *layer=0, unsigned id=0);
|
|
operator unsigned() { return id; }
|
|
|
|
void update_first (const ecl::V2 &p1);
|
|
void update_second (const ecl::V2 &p2);
|
|
void kill();
|
|
|
|
DL_Lines *line_layer;
|
|
unsigned id;
|
|
};
|
|
|
|
RubberHandle AddRubber (const ecl::V2 &p1, const ecl::V2 &p2);
|
|
}
|
|
|
|
|
|
/* -------------------- Status bar -------------------- */
|
|
namespace display
|
|
{
|
|
using enigma_player::Inventory;
|
|
|
|
class StatusBar {
|
|
public:
|
|
virtual ~StatusBar() {}
|
|
virtual void set_inventory (const std::vector<std::string> &modelnames) = 0;
|
|
|
|
virtual void show_text (const std::string &str,
|
|
bool scrolling,
|
|
double duration = -1) = 0;
|
|
virtual void hide_text() = 0;
|
|
|
|
virtual void show_move_counter (bool active) = 0;
|
|
virtual void show_odometer (bool active) = 0;
|
|
|
|
virtual void set_time (double time) = 0;
|
|
virtual void set_speed (double speed) = 0;
|
|
virtual void set_travelled_distance (double distance) = 0;
|
|
virtual void set_counter (int nummoves) = 0;
|
|
};
|
|
|
|
StatusBar *GetStatusBar();
|
|
|
|
#define STATUSBAR display::GetStatusBar()
|
|
|
|
|
|
/* -------------------- Interface to display engine -------------------- */
|
|
|
|
enum DisplayFlags
|
|
{
|
|
SHOW_FLOOR = 0x01,
|
|
SHOW_STONES = 0x02,
|
|
SHOW_ITEMS = 0x04,
|
|
SHOW_SHADES = 0x08,
|
|
SHOW_SPRITES = 0x10,
|
|
SHOW_TIME = 0x20,
|
|
SHOW_INVENTORY = 0x40,
|
|
SHOW_ALL = 0x7f
|
|
};
|
|
|
|
void ToggleFlag(DisplayFlags flag);
|
|
|
|
|
|
void Init();
|
|
void Shutdown();
|
|
|
|
void NewWorld (int w, int h);
|
|
void ResizeGameArea (int w, int h);
|
|
const ecl::Rect& GetGameArea ();
|
|
|
|
void DrawAll (ecl::GC &gc);
|
|
void RedrawAll (ecl::Screen *sfc);
|
|
void Redraw (ecl::Screen *sfc);
|
|
void Tick (double dtime);
|
|
}
|
|
|
|
#endif
|