diff options
Diffstat (limited to 'engines/tony/loc.h')
-rw-r--r-- | engines/tony/loc.h | 488 |
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 */ |