?login_element?

Subversion Repositories NedoOS

Rev

Rev 958 | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #include "sprites.h"
  2. #define XWRAP 192
  3.  
  4. #ifndef FALSE
  5. #define FALSE   0
  6. #endif
  7. #ifndef TRUE
  8. #define TRUE    1
  9. #endif
  10. #ifndef NULL
  11. #define NULL    0
  12. #endif
  13.  
  14. /* sprite types */
  15.  
  16. #define sp_MASK_SPRITE  0x00
  17.  
  18. /* Colour Attributes */
  19.  
  20. #define TRANSPARENT             0x80
  21.  
  22. /* Clear Rectangle Flags */
  23.  
  24. #define sp_CR_TILES             0x01
  25.  
  26. /* Print String Struct Flags */
  27.  
  28. #define sp_PSS_INVALIDATE       0x01
  29.  
  30. /* SP's Sprite Struct */
  31.  
  32. struct sp_SS {
  33.    u8 active;
  34.    i16 ptr;
  35.    i16 x;
  36.    i16 y;
  37.    u16 tile;
  38. };
  39.  
  40. /* Small Rectangles with 8-bit coordinates (used by SP where units are characters) */
  41.  
  42. struct sp_Rect {
  43.    u8 row_coord;     /* coordinate of top left corner */
  44.    u8 col_coord;
  45.    u8 height;        /* size */
  46.    u8 width;
  47. };
  48.  
  49. u8 sp_tile_buf[32*24];
  50. u8 sp_attr_buf[32*24];
  51.  
  52. #define SPRITES_MAX     20
  53.  
  54. struct sp_SS spriteList[SPRITES_MAX];
  55.  
  56. u16 spriteBuf[SPRITES_MAX*4];
  57.  
  58.  
  59. void sp_Init(void)
  60. {
  61.         i16 i;
  62.        
  63.         for(i=0;i<32*24;i++)
  64.         {
  65.                 sp_tile_buf[i]=0;
  66.                 sp_attr_buf[i]=0;
  67.         }
  68.        
  69.         for(i=0;i<SPRITES_MAX;i++) spriteList[i].active=FALSE;
  70.         for(i=0;i<sizeof(spriteBuf);i++) spriteBuf[i]=0;
  71.  
  72.         set_sprite(0/*i*/,0,0,SPRITE_END);
  73.         //sprites_start(); //яЁш ЁрчЁх°╕ээ√ї ёяЁрщЄрї ртЄюьрЄшўхёъш т√яюыэ хЄё  ъюяшЁютрэшх т√тюфшьющ уЁрЇшъш т фтр ¤ъЁрэр
  74. }
  75.  
  76. void sp_AttrSet(i16 x,i16 y,u8 a)
  77. {
  78.         if(y<24) sp_attr_buf[(y<<5)+x]=a;
  79. }
  80.  
  81. u8 sp_AttrGet(i16 x,i16 y)
  82. {
  83.         return (y<24?sp_attr_buf[(y<<5)+x]:0);
  84. }
  85.  
  86. void sp_TileSet(i16 col,i16 row,u16 tile)
  87. {
  88.     draw_tile(col+4,row,tile);
  89. }
  90.  
  91. /* background tiles */
  92.  
  93. void sp_PrintAtInv(u8 row, u8 col, u8 colour, u8 udg)
  94. {
  95.     i16 ptr;
  96.    
  97.     ptr=(row<<5)+col;
  98.     sp_attr_buf[ptr]=colour;
  99.     sp_tile_buf[ptr]=udg;
  100.     //sp_TileSet(col,row,udg);
  101.         draw_tile(col+4,row,udg);
  102. }
  103.  
  104. void sp_GetTiles(struct sp_Rect *r, u8 *dest)
  105. {
  106.         u16 i,j,ptr;
  107.        
  108.         ptr=(r->row_coord<<5)+r->col_coord;
  109.        
  110.         for(i=0;i<r->height;i++)
  111.         {
  112.                 for(j=0;j<r->width;j++)
  113.                 {
  114.                         *dest++=sp_tile_buf[ptr++];
  115.                 }
  116.                 ptr+=(32-r->width);
  117.         }
  118. }
  119.  
  120. void sp_PutTiles(struct sp_Rect *r, u8 *src)
  121. {
  122.         u16 i,j,ptr;
  123.        
  124.         ptr=(r->row_coord<<5)+r->col_coord;
  125.        
  126.         for(i=0;i<r->height;i++)
  127.         {
  128.                 for(j=0;j<r->width;j++)
  129.                 {
  130.                         sp_tile_buf[ptr]=*src++;
  131.                         sp_TileSet(r->col_coord+j,r->row_coord+i,sp_tile_buf[ptr++]);
  132.                 }
  133.                 ptr+=(32-r->width);
  134.         }
  135. }
  136.  
  137. /* sprites */
  138.  
  139. struct sp_SS *sp_CreateSpr(u8 type, u8 rows, u16 graphic, u8 plane, u8 extra)
  140. {
  141.         u16 i;
  142.        
  143.         for(i=0;i<SPRITES_MAX;i++)
  144.         {
  145.                 if(!spriteList[i].active)
  146.                 {
  147.                     spriteList[i].active=TRUE;
  148.                     spriteList[i].ptr=i;
  149.                     spriteList[i].x=0;
  150.                     spriteList[i].y=0;
  151.                     spriteList[i].tile=graphic;
  152.                     return &spriteList[i];
  153.         }
  154.     }
  155.    
  156.     return NULL;
  157. }
  158.  
  159. void sp_MoveSprAbs(struct sp_SS *sprite, struct sp_Rect *clip, u16 animate, u8 row, u8 col, u8 hpix, u8 vpix)
  160. {
  161.         if(sprite)
  162.         {
  163.                 //if(animate<33+16) animate+=PALETTE_NUM(1);
  164.                 if(row<24)
  165.                 {
  166.                         sprite->x=(col<<3)+hpix/*+(col?128:0)*/;
  167.                         sprite->y=(row<<3)+vpix/*+(col?128+16:0)*/;
  168.                 }
  169.                 sprite->tile=animate;
  170.         }
  171. }
  172.  
  173. void sp_DeleteSpr(struct sp_SS *sprite)
  174. {
  175.         if(sprite)
  176.         {
  177.                 sprite->active=FALSE;
  178.         }
  179. }
  180.  
  181. /* updater */
  182.  
  183. void sp_UpdateNow(void)
  184. {
  185.         u16 i,cnt;
  186.         u8 x,y;
  187.         u16 tile;
  188.         //u16 link;
  189.         //u16 *buf;
  190.        
  191.         cnt=0;
  192. /*     
  193.         link=1;
  194.         buf=spriteBuf;
  195.         for(i=0;i<SPRITES_MAX;i++) if(spriteList[i].active) cnt++;
  196.        
  197.         if(!cnt)
  198.         {
  199.                 *buf++=0;
  200.                 *buf++=0;
  201.                 *buf++=0;
  202.                 *buf++=0;
  203.         }
  204. */     
  205.         for(i=0;i<SPRITES_MAX;i++)
  206.         {
  207.         if(!spriteList[i].active) continue;
  208.         /*cnt--;
  209.         if(cnt==0) link=0;
  210.         *buf++=spriteList[i].y;
  211.         *buf++=0x0500|link;
  212.         *buf++=spriteList[i].tile;
  213.         *buf++=spriteList[i].x;
  214.         link++;*/
  215.                 x = spriteList[i].x>>1;
  216.                 if(x)
  217.                 {
  218.                         y = spriteList[i].y;
  219.                         tile = spriteList[i].tile;
  220.                         set_sprite(cnt,16+x,y,tile);
  221.                         cnt++;
  222.                         if(x<32)
  223.                         {
  224.                                 //set_sprite(cnt,(16+(XWRAP/2))+x,y,tile);
  225.                                 //cnt++;
  226.                                 set_sprite(cnt,32-8,y,blacksquare);
  227.                                 cnt++;
  228.                                 //set_sprite(cnt,32+(XWRAP/2),y,blacksquare);
  229.                                 //cnt++;
  230.                         }
  231.                         else if(x>(16+(XWRAP/2)-8))
  232.                         {
  233.                                 //set_sprite(cnt,(16-(XWRAP/2))+x,y,tile);
  234.                                 //cnt++;
  235.                                 //set_sprite(cnt,32-8,y,blacksquare);
  236.                                 //cnt++;
  237.                                 set_sprite(cnt,(u8)(32+(XWRAP/2)),y,blacksquare);
  238.                                 cnt++;
  239.                         }
  240.                 }
  241.         }
  242.         set_sprite(cnt,0,0,SPRITE_END);
  243.  
  244.         swap_screen();
  245.         vsync();
  246.         //update_palette();
  247.         //vram_copy(SPRITES_ADR,spriteBuf,sizeof(spriteBuf));
  248. }
  249.  
  250. void sp_ClearRect(struct sp_Rect *area, u8 colour, u8 udg, u8 flags)
  251. {
  252.         u16 i,j;
  253.        
  254.         for(i=0;i<24;i++)
  255.         {
  256.                 for(j=0;j<32;j++)
  257.                 {
  258.                         sp_PrintAtInv(i,j,0,0);
  259.                 }
  260.         }
  261. }
  262.  
  263. /* additional stuff */
  264.  
  265. void sp_HideAllSpr(void)
  266. {
  267.         u16 i;
  268.        
  269.         for(i=0;i<SPRITES_MAX;i++)
  270.         {
  271.                 if(spriteList[i].active)
  272.                 {
  273.                         spriteList[i].x=0;
  274.                         spriteList[i].y=0;
  275.                 }
  276.                 //spriteList[i].active=FALSE;
  277.         }
  278.         sp_UpdateNow();
  279. }
  280.  
  281. void sp_DelAllSpr(void)
  282. {
  283.         u16 i;
  284.        
  285.         for(i=0;i<SPRITES_MAX;i++)
  286.         {
  287.                 spriteList[i].active=FALSE;
  288.         }
  289.         //sp_UpdateNow();
  290. }
  291.