mirror of
https://github.com/libretro/scummvm.git
synced 2025-02-23 20:51:14 +00:00
623 lines
16 KiB
C++
623 lines
16 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 3 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, see <http://www.gnu.org/licenses/>.
|
|
*
|
|
*
|
|
* Based on the original sources
|
|
* Faery Tale II -- The Halls of the Dead
|
|
* (c) 1993-1996 The Wyrmkeep Entertainment Co.
|
|
*/
|
|
|
|
#ifndef SAGA2_INTRFACE_H
|
|
#define SAGA2_INTRFACE_H
|
|
|
|
#include "saga2/button.h"
|
|
#include "saga2/modal.h"
|
|
#include "saga2/player.h"
|
|
|
|
namespace Saga2 {
|
|
|
|
/* ===================================================================== *
|
|
Prototypes
|
|
* ===================================================================== */
|
|
|
|
// notes: the load/unload resource functions are to be fazed out in lieu of
|
|
// the newer image cache object which will handle duplicate images without
|
|
// all the unwieldly calls
|
|
|
|
// the appfunc helper functions will eventually be merged into an object
|
|
// that will handle all of the trasitive portion of the UI.
|
|
|
|
void SetupUserControls();
|
|
void CleanupButtonImages();
|
|
void CleanupUserControls();
|
|
void SetupContainerViews(ContainerWindow *viewWindow);
|
|
void **loadButtonRes(hResContext *con, int16 resID, int16 numRes);
|
|
void **loadButtonRes(hResContext *con, int16 resID, int16 numRes, char a, char b, char c);
|
|
void **loadImageRes(hResContext *con, int16 resID, int16 numRes, char a, char b, char c);
|
|
void unloadImageRes(void **images, int16 numRes);
|
|
bool isIndivMode();
|
|
|
|
// temp >>>
|
|
uint16 getPlayerActorWeightRatio(PlayerActor *player, uint16 &maxRatio, bool bReturnMaxRatio);
|
|
uint16 getPlayerActorBulkRatio(PlayerActor *player, uint16 &maxRatio, bool bReturnMaxRatio);
|
|
template< class T > inline T GetRatio(T curUnits, T maxUnits, T ratio);
|
|
uint16 getBulkRatio(GameObject *obj, uint16 &maxRatio, bool bReturnMaxRatio);
|
|
uint16 getWeightRatio(GameObject *obj, uint16 &maxRatio, bool bReturnMaxRatio);
|
|
void GetTotalMassBulk(GameObject *obj, uint16 &totalMass, uint16 &totalBulk);
|
|
|
|
// appfunc helpers
|
|
void setIndivBtns(uint16 broNum);
|
|
void setTrioBtns();
|
|
void setCenterBtns(uint16 whichBrother);
|
|
void setControlPanelsToIndividualMode(uint16 whichBrother);
|
|
void setControlPanelsToTrioMode();
|
|
void setCenterBrother(uint16 whichBrother);
|
|
void toggleBrotherBanding(uint16 whichBrother);
|
|
uint16 translatePanID(uint16 ID);
|
|
void updateBrotherPortrait(uint16 brotherID, int16 pType);
|
|
void updateBrotherAggressionButton(uint16 brotherID, bool aggressive);
|
|
void updateBrotherBandingButton(uint16 brotherID, bool banded);
|
|
void updateBrotherRadioButtons(uint16 brotherID);
|
|
void updateReadyContainers();
|
|
void updateBrotherArmor(uint16 brotherID);
|
|
|
|
void updateAllUserControls();
|
|
void updateBrotherControls(PlayerActorID brotherID);
|
|
void enableUserControls();
|
|
void disableUserControls();
|
|
|
|
bool isBrotherDead(PlayerActorID brotherID);
|
|
|
|
// update functions
|
|
void updateIndicators();
|
|
|
|
void initUIState();
|
|
void saveUIState(Common::OutSaveFile *outS);
|
|
void loadUIState(Common::InSaveFile *in);
|
|
void cleanupUIState();
|
|
|
|
// Varargs function to write to the status line.
|
|
void StatusMsg(const char *msg, ...); // frametime def
|
|
|
|
|
|
const uint32 faceGroupID = MKTAG('F', 'A', 'C', 'E');
|
|
const uint32 mentGroupID = MKTAG('C', 'O', 'N', 'T');
|
|
|
|
|
|
/* ===================================================================== *
|
|
Consts
|
|
* ===================================================================== */
|
|
|
|
|
|
/* ===================================================================== *
|
|
Exports
|
|
* ===================================================================== */
|
|
extern uint16 indivBrother;
|
|
|
|
/* ===================================================================== *
|
|
Class forword Declarations
|
|
* ===================================================================== */
|
|
|
|
class CPlaqText;
|
|
class CTextWindow;
|
|
class gTextBox;
|
|
class CPortrait;
|
|
|
|
/* ===================================================================== *
|
|
User controls
|
|
* ===================================================================== */
|
|
|
|
// control button state structure
|
|
struct BtnCtrlState {
|
|
bool aggress;
|
|
bool jump;
|
|
bool center;
|
|
bool banding;
|
|
int16 star;
|
|
};
|
|
|
|
// name resource structure
|
|
struct ResName {
|
|
char a;
|
|
char b;
|
|
char c;
|
|
char d;
|
|
};
|
|
|
|
enum uiBrotherName {
|
|
kUiJulian = 0,
|
|
kUiPhillip,
|
|
kUiKevin,
|
|
kUiIndiv
|
|
};
|
|
|
|
// compressed button resource indexes
|
|
const int16 kAggressResNum = 0;
|
|
const int16 kJumpResNum = 6;
|
|
const int16 kCenterResNum = 4;
|
|
const int16 kBandingResNum = 2;
|
|
const int16 kMenConBtnResNum = 18;
|
|
const int16 kMassBulkResNum = 0;
|
|
const int16 kPieIndResNum = 0;
|
|
const int16 kJulBtnResNum = 22;
|
|
const int16 kPhiBtnResNum = 24;
|
|
const int16 kKevBtnResNum = 26;
|
|
const int16 kOptBtnResNum = 20;
|
|
|
|
|
|
|
|
// standard number of images for push-buttons
|
|
const int16 kNumBtnImages = 2;
|
|
|
|
// standard number of images for portraits
|
|
const uint16 kNumPortImages = 8;
|
|
|
|
// number for pie indicators
|
|
const uint16 kNumPieIndImages = 16;
|
|
|
|
// object pointers
|
|
extern CPortrait *Portrait;
|
|
|
|
/* ===================================================================== *
|
|
Text Gadgets
|
|
* ===================================================================== */
|
|
|
|
// plaq text writing class
|
|
class CPlaqText : public gControl {
|
|
protected:
|
|
|
|
enum {
|
|
kBufSize = 128
|
|
};
|
|
|
|
|
|
char _lineBuf[kBufSize]; // text to render on button
|
|
textPallete _textFacePal; // contains info about coloring for multi-depth text rendering
|
|
Rect16 _textRect; // rect for the text
|
|
int16 _textPosition;
|
|
gFont *_buttonFont; // pointer to font for this button
|
|
gFont *_oldFont;
|
|
|
|
public:
|
|
|
|
CPlaqText(gPanelList &, const Rect16 &, const char *, gFont *,
|
|
int16, textPallete &, int16, AppFunc *cmd = NULL);
|
|
|
|
void enable(bool);
|
|
void invalidate(Rect16 *unused = nullptr);
|
|
|
|
void draw();
|
|
virtual void drawClipped(gPort &,
|
|
const Point16 &,
|
|
const Rect16 &);
|
|
|
|
};
|
|
|
|
|
|
/* ===================================================================== *
|
|
CStatusLine: Status text object, child of CPlaqText
|
|
* ===================================================================== */
|
|
|
|
|
|
// takes a string and displays it in the status for
|
|
// a length of time, and then disappears
|
|
class CStatusLine : public CPlaqText {
|
|
private:
|
|
|
|
Alarm _waitAlarm,
|
|
_minWaitAlarm;
|
|
|
|
struct {
|
|
char *text;
|
|
uint32 frameTime;
|
|
} _lineQueue[12];
|
|
|
|
uint8 _queueHead,
|
|
_queueTail;
|
|
bool _lineDisplayed;
|
|
|
|
static uint8 bump(uint8 i) {
|
|
return (i + 1) % 12;
|
|
}
|
|
|
|
public:
|
|
CStatusLine(gPanelList &, const Rect16 &, const char *, gFont *,
|
|
int16, textPallete, int32, int16, AppFunc *cmd = NULL);
|
|
~CStatusLine();
|
|
|
|
void setLine(char *, uint32 frameTime);
|
|
void experationCheck();
|
|
|
|
void clear();
|
|
};
|
|
|
|
|
|
/* ===================================================================== *
|
|
Portrait control class
|
|
* ===================================================================== */
|
|
|
|
enum PortraitType {
|
|
kPortraitNormal,
|
|
kPortraitAngry,
|
|
kPortraitConfused,
|
|
kPortraitOuch,
|
|
kPortraitSick,
|
|
kPortraitWounded,
|
|
kPortraitAsleep,
|
|
kPortraitDead
|
|
};
|
|
|
|
class CPortrait {
|
|
private:
|
|
PortraitType _currentState[kNumViews + 1];
|
|
uint16 _numButtons;
|
|
uint16 _numViews;
|
|
GfxMultCompButton **_buttons;
|
|
GfxMultCompButton *_indivButton;
|
|
|
|
void setPortrait(uint16);
|
|
|
|
public:
|
|
// button array, number of buttons per view, num views
|
|
CPortrait(GfxMultCompButton *[], GfxMultCompButton *, const uint16, uint16);
|
|
|
|
void ORset(uint16, PortraitType type);
|
|
void set(uint16 brotherID, PortraitType type);
|
|
PortraitType getCurrentState(uint16 brotherID) {
|
|
return _currentState[brotherID];
|
|
}
|
|
void getStateString(char buf[], int8 size, uint16 brotherID);
|
|
};
|
|
|
|
|
|
/* ===================================================================== *
|
|
CInterface: Class that handles indicators for the interface
|
|
* ===================================================================== */
|
|
|
|
class CMassWeightIndicator {
|
|
private:
|
|
GameObject *_containerObject;
|
|
|
|
public:
|
|
static bool _bRedraw;
|
|
|
|
private:
|
|
enum {
|
|
// background image coords
|
|
kBackImageXSize = 88,
|
|
kBackImageYSize = 43,
|
|
|
|
// pie image coords
|
|
kMassPieXOffset = 8,
|
|
kMassPieYOffset = 9,
|
|
kBulkPieXOffset = 53,
|
|
kBulkPieYOffset = 9,
|
|
kPieXSize = 28,
|
|
kPieYSize = 26
|
|
};
|
|
|
|
// xy positions of this indicator
|
|
Point16 _backImagePos;
|
|
Point16 _massPiePos;
|
|
Point16 _bulkPiePos;
|
|
|
|
// memory for update
|
|
uint16 _currentMass;
|
|
uint16 _currentBulk;
|
|
|
|
// resource context pointer
|
|
hResContext *_containerRes;
|
|
|
|
// indicator images
|
|
void *_massBulkImag;
|
|
|
|
// array of pointers to images
|
|
void **_pieIndImag;
|
|
|
|
// image control buttons
|
|
GfxCompImage *_pieMass;
|
|
GfxCompImage *_pieBulk;
|
|
|
|
|
|
public:
|
|
void invalidate(Rect16 *unused = nullptr) {
|
|
_pieMass->invalidate();
|
|
_pieBulk->invalidate();
|
|
}
|
|
|
|
CMassWeightIndicator(gPanelList *, const Point16 &, uint16 type = 1, bool death = false);
|
|
~CMassWeightIndicator();
|
|
|
|
uint16 getMassPieDiv() {
|
|
return _pieMass->getMax();
|
|
}
|
|
uint16 getBulkPieDiv() {
|
|
return _pieBulk->getMax();
|
|
}
|
|
|
|
void setMassPie(uint16 val) {
|
|
_pieMass->setCurrent(val);
|
|
}
|
|
void setBulkPie(uint16 val) {
|
|
_pieBulk->setCurrent(val);
|
|
}
|
|
void recalculate();
|
|
static void update();
|
|
};
|
|
|
|
|
|
class CManaIndicator : public GfxCompImage {
|
|
public:
|
|
|
|
// sizes of the mana star images
|
|
enum startSize {
|
|
kStar1XSize = 10,
|
|
kStar1YSize = 9,
|
|
kStar2XSize = 16,
|
|
kStar2YSize = 15,
|
|
kStar3XSize = 20,
|
|
kStar3YSize = 19,
|
|
kStar4XSize = 28,
|
|
kStar4YSize = 27,
|
|
kStar5XSize = 32,
|
|
kStar5YSize = 31,
|
|
kStar6XSize = 36,
|
|
kStar6YSize = 35,
|
|
kStar7XSize = 46,
|
|
kStar7YSize = 45
|
|
};
|
|
|
|
// sizes of the rings
|
|
enum ringSize {
|
|
kRing1XSize = 8,
|
|
kRing1YSize = 7,
|
|
kRing2XSize = 12,
|
|
kRing2YSize = 11,
|
|
kRing3XSize = 16,
|
|
kRing3YSize = 15,
|
|
kRing4XSize = 22,
|
|
kRing4YSize = 21,
|
|
kRing5XSize = 26,
|
|
kRing5YSize = 25,
|
|
kRing6XSize = 32,
|
|
kRing6YSize = 31,
|
|
kRing7XSize = 40,
|
|
kRing7YSize = 39
|
|
};
|
|
|
|
// area of control
|
|
enum area {
|
|
kAreaX = 475,
|
|
kAreaY = 315,
|
|
kAreaXSize = 152,
|
|
kAreaYSize = 135
|
|
};
|
|
|
|
// coordinates
|
|
enum {
|
|
kCenterX = kAreaX + kAreaXSize / 2,
|
|
kCenterY = kAreaY + kAreaYSize / 2,
|
|
kWellXSize = 108,
|
|
kWellYSize = 123,
|
|
kWellX = (kAreaXSize / 2 - kWellXSize / 2) + 1,
|
|
kWellY = kAreaYSize / 2 - kWellYSize / 2
|
|
};
|
|
|
|
// manas end points
|
|
|
|
enum manaEndCoordsBase { // based on quadrants
|
|
kManaXOffset = 9,
|
|
kManaYOffset = -10,
|
|
|
|
kManaUpperLeftX = 16 + kManaXOffset,
|
|
kManaUpperLeftY = 45 + kManaYOffset,
|
|
kManaUpperMidX = 70 + kManaXOffset,
|
|
kManaUpperMidY = 13 + kManaYOffset,
|
|
kManaUpperRightX = 122 + kManaXOffset,
|
|
kManaUpperRightY = 45 + kManaYOffset,
|
|
kManaLowerLeftX = 16 + kManaXOffset,
|
|
kManaLowerLeftY = 106 + kManaYOffset,
|
|
kManaLowerMidX = 70 + kManaXOffset,
|
|
kManaLowerMidY = 135 + kManaYOffset,
|
|
kManaLowerRightX = 122 + kManaXOffset,
|
|
kManaLowerRightY = 106 + kManaYOffset
|
|
};
|
|
|
|
enum manaEndCoords {
|
|
kManaRedEndX = kManaUpperLeftX, //a // these are just dup tags
|
|
kManaRedEndY = kManaUpperLeftY, //b
|
|
kManaOrangeEndX = kManaUpperMidX, //c
|
|
kManaOrangeEndY = kManaUpperMidY,
|
|
kManaYellowEndX = kManaUpperRightX, //d
|
|
kManaYellowEndY = kManaUpperRightY, //b
|
|
kManaGreenEndX = kManaLowerLeftX, //a
|
|
kManaGreenEndY = kManaLowerLeftY, //e
|
|
kManaBlueEndX = kManaLowerMidX, //c
|
|
kManaBlueEndY = kManaLowerMidY,
|
|
kManaVioletEndX = kManaLowerRightX, //d
|
|
kManaVioletEndY = kManaLowerRightY, //e
|
|
kManaNumXYCoords = 12,
|
|
kManaNumManaTypes = kManaNumXYCoords / 2
|
|
};
|
|
|
|
// mana star display offset from well center
|
|
enum startOffset {
|
|
kManaStartOffset = 12
|
|
};
|
|
|
|
// mana information
|
|
enum manainfo {
|
|
kManaMaxLevel = 200,
|
|
kManaNumManaRegions = kManaNumManaTypes
|
|
};
|
|
|
|
// resource data
|
|
enum resourceInfo {
|
|
kResNumStars = 7,
|
|
kResNumRings = 7,
|
|
kResStarResNum = 0,
|
|
kResRingResNum = 0,
|
|
kResNumManaColors = 13
|
|
};
|
|
|
|
// this describes a star
|
|
// ... via image number and position on screen
|
|
struct manaLineInfo {
|
|
Point16 starPos;
|
|
Point16 ringPos;
|
|
uint8 starImageIndex;
|
|
uint8 ringImageIndex;
|
|
};
|
|
|
|
private:
|
|
|
|
// resource handle
|
|
hResContext *_resContext;
|
|
|
|
// array of image pointers
|
|
void **_starImages;
|
|
void **_ringImages;
|
|
|
|
// background image pointer
|
|
void *_backImage;
|
|
void *_wellImage;
|
|
|
|
// image maps
|
|
gPixelMap _savedMap;
|
|
|
|
// array of manaLine infos for blitting
|
|
manaLineInfo _manaLines[kManaNumManaTypes];
|
|
|
|
// array of ring and star end positions
|
|
// this is initialized via constructor
|
|
Point16 _starRingEndPos[kManaNumManaTypes];
|
|
|
|
Point16 _starSizes[kResNumStars];
|
|
Point16 _ringSizes[kResNumRings];
|
|
|
|
// these are checks against redundent updates
|
|
int32 _currentMana[kManaNumManaTypes], _currentBaseMana[kManaNumManaTypes];
|
|
protected:
|
|
|
|
// these do line and position calculations
|
|
int16 bresLine(Point16 from, Point16 to);
|
|
Point16 bresLine(Point16 from, Point16 to, int16 steps);
|
|
|
|
// this gets the star/ring positions and image indexes
|
|
void getManaLineInfo(uint16 index, int16 manaAmount, int16 baseManaAmount, manaLineInfo *info);
|
|
|
|
public:
|
|
CManaIndicator(gPanelList &list);
|
|
~CManaIndicator();
|
|
|
|
// this updates the star and ring position info
|
|
bool update(PlayerActor *player);
|
|
|
|
// checks to see if the mana indicator needs to draw
|
|
bool needUpdate(PlayerActor *player);
|
|
|
|
// this method provides a rect for any of the six mana regions of the control
|
|
// region numbers:
|
|
// -------
|
|
// |0 1 2|
|
|
// |3 4 5|
|
|
// -------
|
|
Rect16 getManaRegionRect(int8 region);
|
|
int getNumManaRegions() {
|
|
return kManaNumManaRegions;
|
|
}
|
|
|
|
// drawing routines
|
|
void draw();
|
|
virtual void drawClipped(gPort &, const Point16 &, const Rect16 &);
|
|
};
|
|
|
|
/* ===================================================================== *
|
|
CHealthIndicator: Health star indicator
|
|
* ===================================================================== */
|
|
|
|
class CHealthIndicator {
|
|
private:
|
|
|
|
static const char *_hintText;
|
|
|
|
enum {
|
|
kHealthStarFrameResNum = 14,
|
|
kHealthStarFrameNum = 1,
|
|
kHealthStarStart = 0,
|
|
kHealthStarNum = 23,
|
|
kHealthStarInitial = 0,
|
|
kHealthStarLevels = 24,
|
|
kHealthNumControls = kNumViews
|
|
};
|
|
|
|
enum {
|
|
kHealthStarXPos = 572,
|
|
kHealthStarYPos = 21,
|
|
kHealthStarXSize = 32,
|
|
kHealthStarYSize = 32,
|
|
kHealthStarYOffset = 150,
|
|
kHealthFrameXPos = 571,
|
|
kHealthFrameYPos = 20,
|
|
kHealthFrameXSize = 32,
|
|
kHealthFrameYSize = 32
|
|
};
|
|
|
|
// resource handle
|
|
hResContext *_healthRes;
|
|
|
|
// buttons
|
|
GfxCompImage *_starBtns[kHealthNumControls];
|
|
GfxCompImage *_indivStarBtn;
|
|
|
|
// array of pointer to the star imagery
|
|
void **_starImag;
|
|
|
|
// health star frame imagery
|
|
void *_starFrameImag;
|
|
|
|
void updateStar(GfxCompImage *starCtl, int32 bro, int32 baseVitality, int32 curVitality);
|
|
|
|
public:
|
|
uint16 _starIDs[3];
|
|
int16 _imageIndexMemory[4];
|
|
|
|
public:
|
|
|
|
CHealthIndicator(AppFunc *cmd);
|
|
~CHealthIndicator();
|
|
|
|
|
|
void update();
|
|
};
|
|
|
|
|
|
/* ===================================================================== *
|
|
Global classes
|
|
* ===================================================================== */
|
|
|
|
extern CStatusLine *StatusLine;
|
|
extern CMassWeightIndicator *MassWeightIndicator;
|
|
extern CHealthIndicator *HealthIndicator;
|
|
extern CManaIndicator *ManaIndicator;
|
|
|
|
} // end of namespace Saga2
|
|
|
|
#endif
|