scummvm/engines/griffon/griffon.h
2019-11-13 22:07:08 +01:00

542 lines
12 KiB
C++

/* ScummVM - Graphic Adventure Engine
*
* ScummVM is the legal property of its developers, whose names
* are too numerous to list here. Please refer to the COPYRIGHT
* file distributed with this source distribution.
*
* 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.
*
* Originally written by Syn9 in FreeBASIC with SDL
* http://syn9.thehideoutgames.com/index_backup.php
*
* Ported to plain C for GCW-Zero handheld by Dmitry Smagin
* http://github.com/dmitrysmagin/griffon_legend
*
*
* Programming/Graphics: Daniel "Syn9" Kennedy
* Music/Sound effects: David Turner
*
* Beta testing and gameplay design help:
* Deleter, Cha0s, Aether Fox, and Kiz
*
*/
#ifndef GRIFFON_GRIFFON_H
#define GRIFFON_GRIFFON_H
#include "common/scummsys.h"
#include "common/events.h"
#include "common/random.h"
#include "engines/engine.h"
#include "audio/mixer.h"
#include "graphics/transparent_surface.h"
namespace Griffon {
class Console;
#define kSoundHandles 16
#define kMaxNPC 32
#define kMaxFloat 32
#define kMaxSpell 32
// spells
enum {
kSpellIce = 0,
kSpellSteel,
kSpellWood,
kSpellRock,
kSpellFire
};
// inventory items
enum {
kInvFlask = 0,
kInvDoubleFlask,
kInvShock,
kInvNormalKey,
kInvMasterKey
};
enum {
kSndBite = 0,
kSndCrystal,
kSndDoor,
kSndEnemyHit,
kSndIce,
kSndLever,
kSndLightning,
kSndMetalHit,
kSndPowerUp,
kSndRocks,
kSndSwordHit,
kSndThrow,
kSndChest,
kSndFire,
kSndBeep
};
// in game scripts
enum {
kScriptFlask = 0, // get flask
kScriptMasterKey = 2, // find master key
kScriptFindCrystal = 3, // find crystal
kScriptFindShield = 4, // find shield - obj 8
kScriptFindSword = 5, // find sword - obj 9
kScriptKeyChest = 6, // regular key chest
kScriptBlueFlask = 7, // blue flask
kScriptGardenMasterKey = 8, // garden's master key
kScriptLightningBomb = 9, // lightning bomb
kScriptBlueFlaskChest = 10, // blue flask chest
kScriptLightningChest = 11, // lightning chest
kScriptArmourChest = 12, // armour chest
kScriptCitadelMasterKey = 13, // citadel master key
kScriptEndOfGame = 14, // end of game
kScriptGetSword3 = 15, // get sword3
kScriptShield3 = 16, // shield3
kScriptArmour3 = 17, // armour3
kScriptKeyChest1 = 20, // key chest 1
kScriptLever = 60 // lever
};
// monsters
enum {
kMonsterBabyDragon = 1, // baby dragon
kMonsterOneWing = 2, // one wing
kMonsterBoss1 = 3, // boss 1
kMonsterBlackKnight = 4, // black knight
kMonsterFireHydra = 5, // fire hydra
kMonsterRedDragon = 6, // red dragon
kMonsterPriest = 7, // priest
kMonsterYellowDragon = 8, // yellow fire dragon
kMonsterTwoWing = 9, // two wing
kMonsterDragon2 = 10, // dragon2
kMonsterFinalBoss = 11, // final boss
kMonsterBatKitty = 12 // bat kitty
};
#define kEpsilon 0.001
struct Player {
float px;
float py;
float opx;
float opy;
int walkDir;
float walkFrame;
float walkSpeed;
float attackFrame;
float attackSpeed;
int hp;
int maxHp;
float hpflash;
int hpflashb;
int level;
int maxLevel;
int sword;
int shield;
int armour;
bool foundSpell[5];
float spellCharge[5];
int inventory[5];
float attackStrength;
float spellStrength;
int spellDamage;
int swordDamage;
int exp;
int nextLevel;
int pause;
float itemselshade;
int ysort;
};
struct BodySection {
float x;
float y;
int parentID;
int isbase;
int sprite;
int bonelength; // the 'bone' that connects the body sections
};
struct NPC {
float x;
float y;
int spriteset;
int x1; // patrol area
int y1;
int x2;
int y2;
int attitude;
int hp;
int maxhp;
int item1;
int item2;
int item3;
int script;
float frame;
float frame2; // end boss specific
int cframe;
bool onMap; // is this npc set to be genned in the mapfile
int ticks;
int pause;
int shake;
int movementmode;
int walkdir;
float walkspd;
int movingdir;
bool moving;
bool attacking;
float attackframe;
int cattackframe;
float attackspd;
int attackdelay;
int attacknext;
int attackattempt;
int spellDamage;
int attackDamage;
// one wing and firehydra specific
BodySection bodysection[31];
float swayAngle;
float swaySpeed;
float headTargetX[4];
float headTargetY[4];
int castPause;
// firehydra specific
int attacknext2[4];
bool attacking2[4];
int attackframe2[4];
// dragon2 specific
float floating;
};
struct Spell {
int spellnum;
float homex;
float homey;
float enemyx;
float enemyy;
float frame;
int damagewho; // 0 = npc, 1 = player
// for earthslide
float rocky[9]; // CHECKME: Looks unused
int rockimg[9];
int rockdeflect[9];
float strength;
// fire
int legalive[5];
// spell 6 specific
float fireballs[7][4]; // x,y,targetx, targety
int nfballs;
int ballon[7];
int npc;
};
struct AnimSet {
int x; // xyloc on spriteimageset
int y;
int xofs; // the actual place to paste the sprite in reference to the bodypart loc on screen
int yofs;
int w; // w/h of the sprite in the imageset
int h;
};
struct DataChunk {
byte *data;
int size;
};
struct FloatTextStruct {
float framesLeft;
float x;
float y;
int col;
char *text;
};
struct FloatIconStruct {
float framesLeft;
float x;
float y;
int ico;
};
struct AttackOffsetStruct {
float x;
float y;
bool completed;
};
struct CONFIG {
bool music;
int musicVol;
bool effects;
int effectsVol;
};
class GriffonEngine : public Engine {
public:
GriffonEngine(OSystem *syst);
~GriffonEngine();
virtual Common::Error run();
virtual void syncSoundSettings();
private:
Common::RandomSource *_rnd;
bool _shouldQuit;
Console *_console;
private:
// combat.cpp
void attack();
void castSpell(int spellnum, float homex, float homey, float enemyx, float enemyy, int damagewho);
void checkHit();
void damageNPC(int npcnum, int damage, int spell);
void damagePlayer(int damage);
// cutscenes.cpp
void showLogos();
void intro();
void endOfGame();
void theEnd();
// dialogs.cpp
void title(int mode);
void configMenu();
void saveLoadNew();
// draw.cpp
void drawAnims(int Layer);
void drawHud();
void drawNPCs(int mode);
void drawOver(int modx, int mody);
void drawPlayer();
void drawView();
void swash();
// engine.cpp
float RND();
void mainLoop();
void updateEngine();
void newGame();
// gfx.cpp
void addFloatIcon(int ico, float xloc, float yloc);
void addFloatText(const char *stri, float xloc, float yloc, int col);
void eventText(const char *stri);
void drawLine(Graphics::TransparentSurface *buffer, int x1, int y1, int x2, int y2, int col);
void drawString(Graphics::TransparentSurface *buffer, const char *stri, int xloc, int yloc, int col);
void drawProgress(int w, int wm);
// input.cpp
void checkInputs();
void handleWalking();
void checkTrigger();
void processTrigger(int trignum);
// logic.cpp
void updateAnims();
void updateY();
void updateNPCs();
void updateSpells();
void updateSpellsUnder();
// resources.cpp
void initialize();
Graphics::TransparentSurface *loadImage(const char *name, bool colorkey = false);
void loadMap(int mapnum);
void loadAnims();
void loadFont();
void loadItemImgs();
void loadTiles();
void loadTriggers();
void loadObjectDB();
// saveload.cpp
Common::String makeSaveGameName(int slot);
int loadState(int slotnum);
int loadPlayer(int slotnum);
int saveState(int slotnum);
// sound.cpp
void setChannelVolume(int channel, int volume);
int getSoundHandle();
int playSound(DataChunk *chunk, bool looped = false);
void pauseSoundChannel(int channel);
void haltSoundChannel(int channel);
void resumeSoundChannel(int channel);
bool isSoundChannelPlaying(int channel);
void setupAudio();
void updateMusic();
private:
Graphics::TransparentSurface *_video, *_videoBuffer, *_videoBuffer2, *_videoBuffer3;
// system
Graphics::TransparentSurface *_titleImg, *_titleImg2, *_inventoryImg;
Graphics::TransparentSurface *_logosImg, *_theEndImg;
Common::Event _event;
Graphics::TransparentSurface *_mapBg, *_clipBg, *_clipBg2;
unsigned int _clipSurround[4][4];
float _animSpeed; // CHECKME: it seems to always be 0.5
int _rampData[40][24];
int _curMap;
Graphics::TransparentSurface *_fontChr[224][5]; // 256 - 32
Graphics::TransparentSurface *_itemImg[21], *_windowImg;
Graphics::TransparentSurface *_spellImg;
bool _itemSelOn;
int _curItem, _itemTicks;
float _itemyloc;
bool _selEnemyOn;
int _curEnemy;
bool _forcePause;
bool _roomLock; // set to disable any room jumps while in the room
int _scriptFlag[100][10], _saveSlot; // script, flag
// timer related - move to local later
int _ticks, _ticksPassed, _nextTicks;
float _fp, _fps, _fpsr; // CHECKME: _fp and _fps seems to be integers
int _secsingame, _secStart;
Graphics::TransparentSurface *mapImg[4];
Common::Rect rcSrc, rcDest;
// -----------special case
bool _dontDrawOver; // used in map24 so that the candles don't draw over the boss, default set to 0
// saveload info
Graphics::TransparentSurface *_saveLoadImg;
// post info
float _postInfo[21][3];
int _postInfoNbr;
// cloud info
Graphics::TransparentSurface *_cloudImg;
float _cloudAngle;
int _cloudsOn;
// spell info
Spell _spellInfo[kMaxSpell];
// player info
Player _player;
Player _playera;
bool _movingUp, _movingDown, _movingLeft, _movingRight;
bool _attacking;
int _asecstart;
// tile info
Graphics::TransparentSurface *_tiles[4];
int _tileinfo[3][40][24][3]; // maplayer, x, y, tiledata (tile, tilelayer)
// animation info
Graphics::TransparentSurface *_anims[100];
// id number 0&1 = players
Graphics::TransparentSurface *_animsAttack[100];
// attack anims
AttackOffsetStruct _playerAttackOfs[4][16];
FloatTextStruct _floatText[kMaxFloat];
FloatIconStruct _floatIcon[kMaxFloat];
// special for animset2
AnimSet _animSet2[7], _animSet9[7];
// object info
float _objectFrame[256][2];
int _lastObj;
// frame!, curframe
int _objectInfo[33][6];
// nframes,xtiles,ytiles,speed,type,script, update?
int _objectTile[33][9][3][3][2];
// [objnum] [frame] [x] [y] [tile/layer]
int _objectMap[21][15];
int _objectMapFull[1000][21][15];
// [mapnum] x, y set to 1 to make this objmap spot stay at -1
// trigger info
int _triggers[10000][9];
// [map#][index], [var]
// map#,x,y
int _triggerLoc[320][240], _triggerNbr;
// npc info
NPC _npcInfo[kMaxNPC];
int _lastNpc;
// music info
DataChunk *_musicGardens1, *_musicGardens2, *_musicGardens3, *_musicGardens4, *_musicBoss, *_musicMenu, *_musicEndOfGame;
int _musicChannel, _menuChannel;
bool _playingBoss, _playingGardens;
DataChunk *_sfx[15];
Audio::SoundHandle _handles[kSoundHandles];
Audio::Mixer *_mixer;
// set to 1 for normal key, set to 2 for master, set to 0 if unlocked
int _roomLocks[201], _lockType;
int _roomToUnlock;
bool _canUseKey;
bool _saidLocked;
bool _saidJammed;
// ysort
int _ysort[2401], _lasty, _firsty;
bool _pmenu;
CONFIG config;
void saveConfig();
};
}
#endif // GRIFFON_GRIFFON_H