aboutsummaryrefslogtreecommitdiff
path: root/engines/tony/loc.h
diff options
context:
space:
mode:
Diffstat (limited to 'engines/tony/loc.h')
-rw-r--r--engines/tony/loc.h488
1 files changed, 483 insertions, 5 deletions
diff --git a/engines/tony/loc.h b/engines/tony/loc.h
index e09a7389d9..1cae9edb1e 100644
--- a/engines/tony/loc.h
+++ b/engines/tony/loc.h
@@ -32,10 +32,10 @@
* *$. '$$$$$$$$$ 4$P 4 *
* J *$ "$$$$$$$" $P r Author: Giovanni Bajo........ *
* z$ '$$$P*4c.*$$$*.z@*R$$$ $. *
- * z$" "" #$F^ "" '$c Desc: Classi di gestione *
- * z$$beu .ue=" $ "=e.. .zed$$c dei dati di una loca- *
- * "#$e z$*" . `. ^*Nc e$"" zione................ *
- * "$$". .r" ^4. .^$$" ..................... *
+ * z$" "" #$F^ "" '$c *
+ * z$$beu .ue=" $ "=e.. .zed$$c *
+ * "#$e z$*" . `. ^*Nc e$"" *
+ * "$$". .r" ^4. .^$$" *
* ^.@*"6L=\ebu^+C$"*b." *
* "**$. "c 4$$$ J" J$P*" OS: [ ] DOS [X] WIN95 [ ] PORT *
* ^"--.^ 9$" .--"" COMP: [ ] WATCOM [X] VISUAL C++ *
@@ -49,10 +49,269 @@
#define TONY_LOC_H
#include "common/scummsys.h"
-#include "utils.h"
+#include "common/system.h"
+#include "tony/mpal/stubs.h"
+#include "tony/sound.h"
+#include "tony/utils.h"
namespace Tony {
+/****************************************************************************\
+* Various defines
+\****************************************************************************/
+
+/**
+ * Valid colour modes
+ */
+typedef enum {
+ CM_256,
+ CM_65K
+} RMColorMode;
+
+
+/****************************************************************************\
+* Class declarations
+\****************************************************************************/
+
+/**
+ * Generic palette
+ */
+class RMPalette {
+public:
+ byte m_data[1024];
+
+public:
+ friend RMDataStream &operator>>(RMDataStream &ds, RMPalette &pal);
+};
+
+
+/**
+ * Sound effect of an object
+ */
+class RMSfx {
+public:
+ RMString m_name;
+ FPSFX *m_fx;
+ bool m_bPlayingLoop;
+
+public:
+ RMSfx();
+ virtual ~RMSfx();
+
+ friend RMDataStream& operator>>(RMDataStream &ds, RMSfx &sfx);
+
+ void Play(bool bLoop = false);
+ void SetVolume(int vol);
+ void Pause(bool bPause);
+ void Stop(void);
+
+ void ReadFromStream(RMDataStream& ds, bool bLOX = false);
+};
+
+
+/**
+ * Object pattern
+ */
+class RMPattern {
+public:
+ // Type of slot
+ enum RMSlotType {
+ DUMMY1 = 0,
+ DUMMY2,
+ SPRITE,
+ SOUND,
+ COMMAND,
+ SPECIAL
+ };
+
+ // Class slot
+ class RMSlot {
+ private:
+ RMPoint m_pos; // Child co-ordinates
+
+ public:
+ RMSlotType m_type;
+ int m_data;
+ byte m_flag;
+
+ public:
+ friend RMDataStream& operator>>(RMDataStream& ds, RMSlot& slot);
+
+ RMPoint Pos() { return m_pos; }
+
+ void ReadFromStream(RMDataStream& ds, bool bLOX = false);
+ };
+
+public:
+ RMString m_name;
+
+private:
+ int m_speed;
+ RMPoint m_pos; // Coordinate babbo
+ RMPoint m_curPos; // Coordinate babbo+figlio
+ int m_bLoop;
+ int m_nSlots;
+ int m_nCurSlot;
+ int m_nCurSprite;
+
+ RMSlot *m_slots;
+
+ uint32 m_nStartTime;
+
+public:
+ RMPattern();
+ virtual ~RMPattern();
+
+ friend RMDataStream& operator>>(RMDataStream& ds, RMPattern& pat);
+
+ // A warning that the pattern now and the current
+ int Init(RMSfx* sfx, bool bPlayP0=false, byte* bFlag=NULL);
+
+ // Update the pattern, checking to see if it's time to change slot and executing
+ // any associated commands
+ int Update(HANDLE hEndPattern, byte& bFlag, RMSfx* sfx);
+
+ // Stop a sound effect
+ void StopSfx(RMSfx *sfx);
+
+ // Reads the position of the pattern
+ RMPoint Pos() { return m_curPos; }
+
+ void ReadFromStream(RMDataStream& ds, bool bLOX = false);
+
+private:
+ void UpdateCoord(void);
+};
+
+
+/**
+ * Sprite (frame) animation of an item
+ */
+class RMSprite : public RMGfxTask {
+public:
+ RMString m_name;
+ RMRect m_rcBox;
+
+protected:
+ RMGfxSourceBuffer* m_buf;
+
+public:
+ RMSprite();
+ virtual ~RMSprite();
+
+ void Init(RMGfxSourceBuffer* buf);
+ friend RMDataStream& operator>>(RMDataStream& ds, RMSprite& sprite);
+ void Draw(RMGfxTargetBuffer& bigBuf, RMGfxPrimitive* prim);
+ void SetPalette(byte *lpBuf);
+ void GetSizeFromStream(RMDataStream& ds, int* dimx, int* dimy);
+ void LOXGetSizeFromStream(RMDataStream& ds, int* dimx, int* dimy);
+
+ void ReadFromStream(RMDataStream& ds, bool bLOX = false);
+};
+
+
+/**
+ * Data on an item
+ */
+class RMItem : public RMGfxTask {
+public:
+ RMString m_name;
+
+protected:
+ int m_z;
+ RMPoint m_pos; // Coordinate nonno
+ RMColorMode m_cm;
+ RMPoint m_curScroll;
+
+ byte m_FX;
+ byte m_FXparm;
+
+ virtual int GetCurPattern() { return m_nCurPattern; }
+
+private:
+ int m_nCurPattern;
+ int m_mpalCode;
+ RMPoint m_hot;
+ RMRect m_rcBox;
+ int m_nSprites,m_nSfx,m_nPatterns;
+ byte m_bPal;
+ RMPalette m_pal;
+
+ RMSprite *m_sprites;
+ RMSfx *m_sfx;
+ RMPattern *m_patterns;
+
+ byte m_bCurFlag;
+ int m_nCurSprite;
+ bool m_bIsActive;
+ HANDLE m_hEndPattern;
+ bool m_bInitCurPattern;
+
+public:
+ RMPoint CalculatePos(void);
+
+public:
+ RMItem();
+ virtual ~RMItem();
+
+ friend RMDataStream& operator>>(RMDataStream &ds, RMItem &item);
+
+ // Processa l'oggetto per fare andare avanti eventuale animazioni. Ritorna TRUE se dovrà
+ // essere ridisegnato il prossimo frame
+ bool DoFrame(RMGfxTargetBuffer *bigBuf, bool bAddToList = true);
+
+ // Setta la posizione corrente di scrolling
+ void SetScrollPosition(RMPoint scroll);
+
+ // Overloading della funzione per la rimozione da ot list
+ virtual bool RemoveThis();
+
+ // Overloading del draw
+ virtual void Draw(RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim);
+
+ // Overloading della priorità: è la Z
+ virtual int Priority() { return m_z; }
+
+ // Numero di pattern
+ int NumPattern() { return m_nPatterns; }
+
+ // Setta un nuovo pattern di animazione, cambiando bruscamente da quello corrente
+ virtual void SetPattern(int nPattern, bool bPlayP0 = false);
+
+ // Setta un nuovo status.
+ void SetStatus(int nStatus);
+
+ bool IsIn(RMPoint pt, int* size=NULL);
+ RMPoint Hotspot() { return m_hot; }
+ bool GetName(RMString& name);
+ int MpalCode() { return m_mpalCode; }
+
+ // Scarica l'item
+ void Unload(void);
+
+ // Aspetta la fine del pattern in play
+ void WaitForEndPattern(HANDLE hCustomSkip = INVALID_HANDLE_VALUE);
+
+ // Setta un nuovo hotspot per l'oggetto
+ void ChangeHotspot(RMPoint pt);
+
+ void SetInitCurPattern(bool status) { m_bInitCurPattern=status; }
+
+ void PlaySfx(int nSfx);
+
+void ReadFromStream(RMDataStream& ds, bool bLOX=false);
+
+ void PauseSound(bool bPause);
+
+protected:
+ // Crea una primitiva che ha come task l'item stesso
+ virtual RMGfxPrimitive *NewItemPrimitive();
+
+ // Alloca la memoria per gli sprites
+ virtual RMGfxSourceBuffer* NewItemSpriteBuffer(int dimx, int dimy, bool bPreRLE);
+};
+
+
#define MAXBOXES 50 // Non si puo' cambiare, comanda cosi' il boxed
#define MAXHOTSPOT 20 // Idem
@@ -122,6 +381,225 @@ public:
void LoadState(byte *buf);
};
+class RMCharacter : protected RMItem {
+public:
+ enum PATTERNS {
+ PAT_STANDUP = 1,
+ PAT_STANDDOWN,
+ PAT_STANDLEFT,
+ PAT_STANDRIGHT,
+ PAT_WALKUP,
+ PAT_WALKDOWN,
+ PAT_WALKLEFT,
+ PAT_WALKRIGHT
+ };
+
+private:
+ enum STATUS {
+ STAND,
+ WALK
+ };
+
+ signed short walkcount;
+ int dx, dy, olddx, olddy;
+ float fx, fy, slope;
+ RMPoint linestart, lineend, pathend;
+ signed char walkspeed, walkstatus;
+ char minpath;
+ short nextbox;
+ short path[MAXBOXES];
+ short pathlenght, pathcount;
+ int curbox;
+
+ STATUS status;
+ int curSpeed;
+ bool bEndOfPath;
+ HANDLE hEndOfPath;
+ OSystem::MutexRef csMove;
+ int curLocation;
+ bool bRemoveFromOT;
+ bool bMovingWithoutMinpath;
+ RMGameBoxes *theBoxes;
+
+ RMPoint m_fixedScroll;
+
+private:
+ int InWhichBox(RMPoint pt);
+
+ short FindPath(short source, short destination);
+ RMPoint Searching(char UP, char DOWN, char RIGHT, char LEFT, RMPoint punto);
+ RMPoint NearestPoint(RMPoint punto);
+
+ void GoTo(RMPoint destcoord, bool bReversed=false);
+ short ScanLine(RMPoint punto);
+ RMPoint InvScanLine(RMPoint punto);
+ RMPoint NearestHotSpot(int sourcebox, int destbox);
+
+ void NewBoxEntered(int nBox);
+
+protected:
+ bool bMoving;
+ bool bDrawNow;
+ bool bNeedToStop;
+// virtual RMGfxPrimitive* NewItemPrimitive();
+
+public:
+ RMCharacter();
+ virtual ~RMCharacter();
+
+ void LinkToBoxes(RMGameBoxes* theBoxes);
+
+ virtual bool RemoveThis(void);
+
+ // Aggiorna la posizione del personaggio
+ void DoFrame(RMGfxTargetBuffer* bigBuf, int loc);
+
+ // Overloading del Draw
+ void Draw(RMGfxTargetBuffer& bigBuf, RMGfxPrimitive* prim);
+
+ // TRUE se si è appena fermato
+ bool EndOfPath() { return bEndOfPath; }
+
+ // Cambia il pattern del personaggio per fermarlo
+ virtual void Stop(void);
+
+ // Controlla se il personaggio si sta muovendo
+ bool IsMoving() { return bMoving; }
+
+ // Muove il personaggio a una certa posizione
+ bool Move(RMPoint pt);
+
+ // Posiziona il personaggio a una certa posizione SENZA farlo muovere
+ void SetPosition(RMPoint pt, int newloc=-1);
+
+ // Aspetta la fine del movimento
+ void WaitForEndMovement(void) { if (bMoving) WaitForSingleObject(hEndOfPath, INFINITE); }
+
+ void SetFixedScroll(RMPoint fix) { m_fixedScroll = fix; }
+ void SetSpeed(int speed) { curSpeed=speed; }
+};
+
+
+class RMWipe : public RMGfxTask {
+private:
+ bool m_bFading;
+ bool m_bEndFade;
+ bool m_bUnregister;
+ HANDLE m_hUnregistered;
+ int m_nFadeStep;
+ HANDLE m_hEndOfFade;
+ bool m_bMustRegister;
+
+ RMItem m_wip0r;
+
+public:
+ RMWipe();
+ virtual ~RMWipe();
+
+ void DoFrame(RMGfxTargetBuffer& bigBuf);
+ void Draw(RMGfxTargetBuffer& bigBuf, RMGfxPrimitive* prim);
+
+ void InitFade(int type);
+ void CloseFade(void);
+ void WaitForFadeEnd(void);
+
+ virtual void Unregister(void);
+ virtual bool RemoveThis(void);
+ virtual int Priority(void);
+};
+
+
+/**
+ * Location
+ */
+class RMLocation : public RMGfxTaskSetPrior {
+public:
+ RMString m_name; // Nome
+
+ private:
+ RMColorMode m_cmode; // Color mode
+ RMGfxSourceBuffer* m_buf; // Immagine della locazione
+
+ int m_nItems; // Numero oggetti
+RMItem* m_items; // Oggetti
+
+ RMPoint m_curScroll; // Posizione corrente di scroll
+ RMPoint m_fixedScroll;
+
+public:
+ // @@@@@@@@@@@@@@@@@@@@@@@
+ RMPoint TEMPTonyStart;
+ RMPoint TEMPGetTonyStart() { return TEMPTonyStart; }
+
+ int TEMPNumLoc;
+ int TEMPGetNumLoc() { return TEMPNumLoc; }
+
+public:
+ RMLocation();
+ virtual ~RMLocation();
+
+ // Caricamento da disco
+ bool Load(char *lpszFileName);
+ bool Load(HANDLE hFile);
+ bool Load(byte *buf);
+ bool Load(RMDataStream &ds);
+ bool LoadLOX(RMDataStream &ds);
+
+ // Scaricamento
+ void Unload(void);
+
+ // Overloading del Draw
+ void Draw(RMGfxTargetBuffer &bigBuf, RMGfxPrimitive *prim);
+
+ // Prepara un frame disegnando la locazione e tutti i suoi item
+ void DoFrame(RMGfxTargetBuffer *bigBuf);
+
+ // Si fa dare il numero dell'item
+ RMItem* WhichItemIsIn(RMPoint pt);
+
+ // Si fa dare un elemento dal suo codice MPAL
+ RMItem* GetItemFromCode(uint32 dwCode);
+
+ // Setta la posizione corrente di scrolling
+ void SetScrollPosition(RMPoint &scroll);
+
+ // Setta un offset aggiuntivo di scrolling da aggiungere sempre
+ void SetFixedScroll(RMPoint &scroll);
+
+ // Aggiorna le coordinate di scrolling in modo da visualizzare sempre il punto fornito
+ void UpdateScrolling(RMPoint ptShowThis);
+
+ // Legge la posizione di scrolling corrente
+ RMPoint ScrollPosition() { return m_curScroll; }
+
+ // Pausa sonoro
+ void PauseSound(bool bPause);
+};
+
+
+/**
+ * MPAL message, composed of more ASCIIZ
+ */
+class RMMessage {
+private:
+ char *lpMessage;
+ char *lpPeriods[256];
+ int nPeriods;
+
+private:
+ void ParseMessage(void);
+
+public:
+ RMMessage(uint32 dwId);
+ virtual ~RMMessage();
+
+ bool IsValid() { return lpMessage != NULL; }
+ int NumPeriods() { return nPeriods; }
+ char *Period(int num) { return lpPeriods[num]; }
+ char *operator[](int num) { return lpPeriods[num]; }
+};
+
+
} // End of namespace Tony
#endif /* TONY_H */