#ifndef SYSTEM_MISC_H
#define SYSTEM_MISC_H TRUE

/*
**  $VER: misc.h V0.8B
**
**  (C) Copyright 1996-1997 DreamWorld Productions.
**      All Rights Reserved.
**
*/

#ifndef DPKERNEL_H
#include <games/dpkernel.h>
#endif

/****************************************************************************
** Object Referencing structure.
*/

#define REFVERSION     1
#define TAGS_REFERENCE ((ID_SPCTAGS<<16)|ID_REFERENCE)

struct Reference {
  struct Head Head;   /* [00] Standard header */
  APTR   Next;        /* [12] Next reference */
  APTR   Prev;        /* [16] Previous reference */
  WORD   ObjectID;    /* [20] ID of the object */
  WORD   Pad;         /* [22] Reserved */
  APTR   ObjectName;  /* [24] Name of the object */
  APTR   ModName;     /* [28] Name of the module containing the object */
  __asm LONG  (*CheckFile)(register __a0 struct File *, register __a1 APTR Buffer);
  WORD   ModNumber;   /* [36] Module ID number */

  /* Private fields below */

  struct Segment *Segment;
  struct Module  *Module;
};

#define REFA_ObjectID   (TWORD|20)
#define REFA_ObjectName (TAPTR|24)
#define REFA_ModName    (TAPTR|28)
#define REFA_CheckFile  (TAPTR|32)
#define REDA_ModNumber  (TWORD|36)

/****************************************************************************
** Universal Structure, used in the CopyStructure() routine.
*/

struct Universe {
  struct Head Head;
  APTR   Palette;
  WORD   Planes;
  WORD   ScrWidth;
  WORD   ScrHeight;
  WORD   PicWidth;
  WORD   PicByteWidth;
  WORD   PicHeight;
  APTR   Task;
  LONG   PlaneSize;
  LONG   AmtColours;
  WORD   ScrMode;
  WORD   ScrType;
  APTR   Source;
  APTR   ScreenLink;
  APTR   Rasterlist;
  WORD   ScrXOffset;
  WORD   ScrYOffset;
  WORD   PicYOffset;
  WORD   PicXOffset;
  WORD   Channel;
  WORD   Priority;
  LONG   Length;
  WORD   Octave;
  WORD   Volume;
};

/****************************************************************************
** The SysObject structure.  Private.
*/

#define SOVERSION      1
#define TAGS_SYSOBJECT ((ID_SPCTAGS<<16)|ID_SYSOBJECT)

struct SysObject {
  struct Head Head;
  struct SysObject *Prev;  /* Previous object in list */
  struct SysObject *Next;  /* Next object in list */
  WORD   ObjectID;         /* Unique ID of the object, eg ID_PICTURE */
  WORD   ClassID;          /* Class reference ID */
  BYTE   *Name;            /* Full name of the object */
  __asm void (*CopyToUnv)(register __a0 struct Universe *, register __a1 struct Head *);
  __asm void (*CopyFromUnv)(register __a0 struct Universe *, register __a1 struct Head *);
  __asm WORD (*CheckFile)(register __a0 struct File *, register __a1 APTR Buffer);
  __asm struct Head * (*Load)(register __a0 struct File *);
  __asm LONG (*Display)(register __a0 APTR Object);
  __asm struct Head * (*Get)(void);
  __asm void (*Free)(register  __a0 APTR Object);
  __asm LONG (*Init)(register  __a0 APTR Object,   register __a1 APTR Container);
  __asm LONG (*Read)(register  __a0 struct File *, register __a1 APTR Buffer, register __d0 Length);
  __asm LONG (*Write)(register __a0 struct File *, register __a1 APTR Buffer, register __d0 Length);
  __asm LONG (*Open)(register  __a0 struct File *, register __d0 LONG Flags);
  __asm void (*Hide)(register  __a0 APTR Object);
  __asm void (*Close)(register __a0 struct File *);
  __asm LONG (*Save)(register  __a0 APTR Object,   register __a1 struct File *DFile);
  __asm LONG (*Query)(register __a0 APTR Object);
  __asm LONG (*Activate)(register __a0 APTR Object);
  __asm LONG (*Deactivate)(register __a0 APTR Object);
  __asm LONG (*Draw)(register __a0 APTR Object);
  __asm LONG (*Clear)(register __a0 APTR Object);
};

#define SOA_Prev        (12|TAPTR)
#define SOA_Next        (16|TAPTR)
#define SOA_ObjectID    (20|TWORD)
#define SOA_ClassID     ((14+8)|TWORD)
#define SOA_Name        ((16+8)|TAPTR)
#define SOA_CopyToUnv   ((20+8)|TAPTR)
#define SOA_CopyFromUnv ((24+8)|TAPTR)
#define SOA_CheckFile   ((26+10)|TAPTR)
#define SOA_Load        ((30+10)|TAPTR)
#define SOA_Display     ((34+10)|TAPTR)
#define SOA_Get         ((38+10)|TAPTR)
#define SOA_Free        ((42+10)|TAPTR)
#define SOA_Init        ((46+10)|TAPTR)
#define SOA_Read        ((50+10)|TAPTR)
#define SOA_Write       ((54+10)|TAPTR)
#define SOA_Open        ((58+10)|TAPTR)
#define SOA_Hide        ((62+10)|TAPTR)
#define SOA_Close       ((66+10)|TAPTR)
#define SOA_Save        ((70+10)|TAPTR)
#define SOA_Query       ((74+10)|TAPTR)
#define SOA_Activate    ((78+10)|TAPTR)
#define SOA_Deactivate  ((82+10)|TAPTR)
#define SOA_Draw        ((86+10)|TAPTR)
#define SOA_Clear       ((90+10)|TAPTR)

#endif
