home *** CD-ROM | disk | FTP | other *** search
/ FreeWare Collection 2 / FreeSoftwareCollection2pd199x-jp.img / tvjack / tv2.c < prev    next >
Text File  |  1990-06-14  |  13KB  |  430 lines

  1. /* 魔女っ子愛ちゃんのTV・Jack!*/
  2.  
  3.  #include <EGB.h>    /* グラフィック */
  4.  #include <mos.h>    /* マウス */
  5.  #include <stdlib.h>
  6.  #include <stdio.h>
  7.  #include <snd.h>
  8.  #include <spr.h>
  9.  typedef unsigned int usint;
  10.  
  11.  char *sbuf;          /* スプライトのバッファ */
  12.  char *sbuft;          /* スプライトのバッファ */
  13.  char *sbufa;          /* スプライトのバッファ */
  14.  char *sbufb;          /* スプライトのバッファ */
  15.  char *Gbuf16;        /* TIF データ16色のバッファ*/
  16.  char *Gbuf32;        /* TIF データ32K色のバッファ*/
  17.  char *mp;
  18.  
  19.  char work[15360];            /* グラフィック作業域   */
  20.  char mwork[4096];            /* マウス作業域         */
  21.  char para[64];
  22.  char swork[16384];           /* サウンド作業域       */
  23.  
  24.  int  tifx,tify;
  25.  int  c,off;
  26.  int  cx,cy,cb;
  27.  int  swtv;
  28.  
  29. void freadb()
  30.  {
  31.       
  32.    FILE *fp;
  33.    Gbuf16 = malloc(154112);
  34.    Gbuf32 = malloc(154112);
  35.    sbuft = malloc(3074);
  36.    sbufa = malloc(1024);
  37.    sbufb = malloc(1024);
  38.  
  39.    fp = fopen("ITEM0.SPR","rb" );
  40.    fread(sbuft,1,3074,fp);
  41.    fclose(fp);
  42.   
  43.    fp = fopen("ITEMA.SPR","rb" );
  44.    fread(sbufa,1,1024,fp);
  45.    fclose(fp);
  46.   
  47.    fp = fopen("ITEMB.SPR","rb" );
  48.    fread(sbufb,1,1024,fp);
  49.    fclose(fp);
  50.   
  51.    fp = fopen("HAIKEI.TIF","rb" );
  52.    fread(Gbuf16,1,154112,fp);
  53.    fclose(fp);
  54.  
  55.    fp = fopen("TV.TIF","rb" );
  56.    fread(Gbuf32,1,154112,fp);
  57.    fclose(fp);
  58.  }
  59.  
  60. void freads(fnames,snames)
  61. char *fnames;
  62. char *snames;
  63.  {
  64.    FILE *fps;
  65.    fps = fopen(fnames,"rb" );
  66.    fread(sbuf,1,6144,fps);
  67.    fclose(fps);
  68.  
  69.    fps = fopen(snames,"rb");
  70.    fread(mp,1,3000,fps);
  71.    fclose(fps);
  72.    *(int *)(mp + 20) = 0;
  73.  }
  74.  
  75. void m_init(n)
  76.     int n;
  77.     {
  78.     MOS_start(mwork,4096);
  79.     MOS_disp(n);
  80.         MOS_resolution(0,3);                /* マウス仮想画面の設定       */
  81.     }
  82.  
  83. void mouse(x,y)
  84.     int x,y;
  85.     {
  86.     MOS_setpos(x,y);
  87.     }
  88.  
  89. int mposx()
  90.     {
  91.     int bot,x,y;
  92.     MOS_rdpos(&bot,&x,&y);
  93.     return(x);
  94.     }
  95.  
  96. int mposy()
  97.     {
  98.     int bot,x,y;
  99.     MOS_rdpos(&bot,&x,&y);
  100.     return(y);
  101.     }
  102.  
  103. int mposb()
  104.     {
  105.     int bot,x,y;
  106.     MOS_rdpos(&bot,&x,&y);
  107.     return(bot);
  108.     }
  109.  
  110. /*アイテムの選択の判断 */
  111. int iselect()
  112.  {
  113.   int mm,mx,my;
  114.   MOS_rdpos(&mm,&mx,&my);
  115.   if (mm==1 && 45  <=mx && mx<=124 &&  317<=my && my<= 384) return(1);
  116.   else  if (mm==1 && 153 <=mx && mx<=233 &&  317<=my && my<= 384) return(2);
  117.   else  if (mm==1 && 268 <=mx && mx<=345 &&  317<=my && my<= 384) return(3);
  118.   else  if (mm==1 && 390 <=mx && mx<=466 &&  317<=my && my<= 384) return(4);
  119.   else  if (mm==1 && 507 <=mx && mx<=586 &&  317<=my && my<= 384) return(5);
  120.   else  if (mm==1 &&  45 <=mx && mx<=124 &&  400<=my && my<= 467) return(6);
  121.   else  if (mm==1 && 153 <=mx && mx<=233 &&  400<=my && my<= 467) return(7);
  122.   else  if (mm==1 && 268 <=mx && mx<=345 &&  400<=my && my<= 467) return(8);
  123.   else  if (mm==1 && 390 <=mx && mx<=466 &&  400<=my && my<= 467) return(9);
  124.   else  if (mm==1 && 507 <=mx && mx<=586 &&  400<=my && my<= 467) return(10);
  125.   else  if (mm==1 && 5   <=mx && mx<=33  &&  380<=my && my<= 400) return(11);
  126.   else  return(0);
  127.   }
  128.  
  129. /* TIFF or TV 選択判断 */
  130. int tselect()
  131.  {
  132.   int mm,mx,my;
  133.   MOS_rdpos(&mm,&mx,&my);
  134.   if (mm==1 && 30  <=mx && mx<=50 &&  270<=my && my<= 290) return(1);
  135.   else  if (mm==1 && 305 <=mx && mx<=325 &&  270<=my && my<= 290) return(2);
  136.   else  return(0);
  137.   }
  138.  
  139. /* TIFF データ出力 */
  140. void put( x1, y1, x2, y2, p)
  141.  int x1, y1, x2, y2;
  142.  usint    p;
  143.  {
  144.     DWORD(para+0) = p;
  145.     WORD(para+4)  = 0x14;
  146.     WORD(para+6)  = x1;
  147.     WORD(para+8)  = y1;
  148.     WORD(para+10) = x2;
  149.     WORD(para+12) = y2;
  150.     EGB_putBlock( work,0,para );
  151. }
  152.  
  153. /* TIFF 画面出力 */
  154. void tv32(x1,y1,xy)
  155.   int x1,y1,xy;
  156.   {
  157.    EGB_writeMode(work,0);
  158.    EGB_color(work,1,0);                /* 背景色 : Black    */
  159.    EGB_color(work,0,15);            /* 前景色 : L_White    */
  160.    EGB_color(work,3,0);             /* 透過色 : BLACK    */
  161.    EGB_clearScreen(work);
  162.    EGB_displayStart(work,1,0,0);    /* 仮想画面位置    */
  163.    EGB_displayStart(work,0,x1,y1);    /* 表示開始位置    */
  164.    EGB_displayStart(work,2,xy,xy);    /* 画面の拡大         */
  165.    EGB_displayStart(work,3,319,239);/* 画面の大きさ     */
  166.      tifx = *(Gbuf32+31);tifx <<= 8;tifx |= *(Gbuf32+30);   /* X Size */
  167.      tify = *(Gbuf32+43);tify <<= 8;tify |= *(Gbuf32+42);   /* Y Size */
  168.      off = *(Gbuf32+0x67);off <<= 8; off |= *(Gbuf32+0x66); /* OFF Size    */
  169.      for (c=0;c<tify;c++)
  170.        {
  171.            put(0,c,tifx-1,c,(usint)Gbuf32+off);
  172.         off += (tifx * 2);
  173.        }
  174.  }
  175.  
  176. /* テレビ画面出力 */
  177. void tv33(x1,y1,xy)
  178.   int x1,y1,xy;
  179.   {
  180.    EGB_clearScreen(work);
  181.    EGB_writeMode(work,0);
  182.    EGB_color(work,1,0x8000);     /* 透過色 : BLACK    */
  183.    EGB_color(work,0,0x800f);     /* 透過色 : BLACK    */
  184.    EGB_color(work,3,0x8000);     /* 透過色 : BLACK    */
  185.    EGB_displayStart(work,1,0,0);    /* 仮想画面位置    */
  186.    EGB_displayStart(work,0,x1,y1);    /* 表示開始位置    */
  187.    EGB_displayStart(work,2,xy,xy);    /* 画面の拡大         */
  188.    EGB_displayStart(work,3,319,239);/* 画面の大きさ     */
  189.    EGB_superImpose(work,0x81);
  190.    EGB_clearScreen(work);
  191.   }
  192.   
  193. /* 初期画面出力 */
  194. void firstg()
  195.  {
  196.         tifx = *(Gbuf16+31);tifx <<= 8;tifx |= *(Gbuf16+30); /* X Size    */
  197.         tify = *(Gbuf16+43);tify <<= 8;tify |= *(Gbuf16+42); /* Y Size    */
  198.         off = *(Gbuf16+0x67);off <<= 8; off |= *(Gbuf16+0x66); /* OFF Size*/
  199.         if (tifx%2) tifx++;
  200.            for (c=0;c<tify;c++)
  201.              {
  202.             put(0,c,tifx-1,c,(usint)Gbuf16+off);
  203.             off += (tifx / 2);
  204.          }
  205.   }
  206.  
  207. /* グラフィックの初期化 */
  208. void g_init(p1,p2)
  209.     int p1,p2;    
  210.     {
  211.     EGB_init(work,15360);
  212.     EGB_resolution(work,0,p1);
  213.     EGB_resolution(work,1,p2);
  214.     }
  215.  
  216. /* 1/4画面出力 */
  217. void tvon()
  218. {
  219. EGB_color(work,0,0x8000);
  220. EGB_color(work,1,0x8000);
  221. EGB_color(work,2,0x8000);
  222. EGB_paintMode(work,0x22);
  223. WORD(para+0)=30;
  224. WORD(para+2)=100;
  225. WORD(para+4)=325;
  226. WORD(para+6)=254;
  227. EGB_rectangle(work,para);
  228. }
  229.  
  230. /* TV OR TIFF 判断処理メイン */
  231. void itemslct()
  232. {
  233.  int it1;
  234.  g_init(3,10);                         /* 初期化              */
  235.  EGB_displayPage(work,0,1);            /* 表示ページの指定    */
  236.  EGB_writePage(work,0);                /* Write to Page 0     */
  237.  firstg();                             /* 初期画面出力        */
  238.  if(swtv == 1)
  239.    {
  240.     tvon();
  241.     EGB_writePage(work,1);
  242.     tv32(20,17,1);
  243.    } 
  244.  if(swtv == 2)
  245.    {
  246.     tvon();
  247.     EGB_writePage(work,1);
  248.     tv33(20,17,1);
  249.    } 
  250.  m_init(1);                            /* マウスの初期化      */
  251.  if(swtv == 0)
  252.    {
  253.      do {
  254.        it1 = tselect();
  255.        if(it1 == 1)
  256.        {
  257.         tvon();
  258.         EGB_writePage(work,1);         /* Write to Page 1     */
  259.         swtv = 1;
  260.         tv32(20,17,1);                 /* テレビ画面出力1/4   */
  261.        }
  262.        if(it1 == 2)
  263.        {
  264.         tvon();
  265.         EGB_writePage(work,1);         /* Write to Page 1     */
  266.         swtv = 2;
  267.         tv33(20,17,1);                 /* テレビ画面出力1/4   */
  268.        }
  269.     }while(it1 == 0);
  270.  }
  271.  EGB_displayPage(work,0,3);
  272. }
  273.  
  274. /* 効果音 */
  275. void sdplay()
  276. {
  277.   SND_pcm_play(64,64,127,mp);         /* 再生               */
  278.   while(0 != SND_pcm_status(64));     /* 再生状態のチェック */
  279. }
  280.  
  281. /* 効果音出力とスプライトON/OFF */
  282. void sdplays()
  283. {
  284.   sdplay();
  285.   SPR_display(1,320);
  286.   SPR_display(2,320);
  287. }
  288.  
  289. /* テレビ画面で遊ぶ処理 */
  290. void tvplay(target)
  291. int target;
  292. {
  293.  MOS_end();                            /*マウス動作終了の設定*/
  294.  g_init(11,8);                         /* 初期化              */
  295.  EGB_displayPage(work,1,3);            /* 表示ページの指定    */
  296.  EGB_writePage(work,0);                /* Write to Page 0    */
  297.  if (swtv == 1) tv32(0,0,2);
  298.  if (swtv == 2) tv33(0,0,2);
  299.  m_init(0);
  300.  EGB_writePage(work,1);                /* Write to Page 0    */
  301.  EGB_clearScreen(work);
  302.  EGB_colorIGRB(work,3,0x00000000);     /* 透過色 : BLACK    */
  303.            WORD(para+0) = 0;
  304.          WORD(para+2) = 0;
  305.          WORD(para+4) = 255;
  306.          WORD(para+6) = 239;
  307.         EGB_viewport(work,para);
  308.     EGB_displayStart(work,0,32,0);
  309.     EGB_displayStart(work,1,0,0);
  310.     EGB_displayStart(work,2,2,2);
  311.     EGB_displayStart(work,3,255,239);
  312.  
  313.     SPR_init();
  314.     SPR_define(1,820,3,2,sbuft);
  315.     if (target == 1 || target == 3 || target == 5) 
  316.            {
  317.             SPR_define(1,844,1,1,sbufa+512);
  318.             SPR_define(1,848,1,1,sbufa);
  319.                 SPR_setAttribute(844,1,1,0x034c,0x0d00);
  320.                 SPR_setAttribute(848,1,1,0x0350,0x0d00);
  321.             }
  322.     if (target == 2  || target == 4 || target == 9)
  323.            {
  324.             SPR_define(1,844,1,1,sbufb+512);
  325.             SPR_define(1,848,1,1,sbufb);
  326.                 SPR_setAttribute(844,1,1,0x034c,0x0d00);
  327.                 SPR_setAttribute(848,1,1,0x0350,0x0d00);
  328.             }
  329.     SPR_define(1,868,3,2,sbuf);
  330.     SPR_define(1,892,3,2,sbuf+3072);
  331.         SPR_setAttribute(868,3,2,0x0364,0x0d00);
  332.         SPR_setAttribute(820,3,2,0x0334,0x0d00);
  333.         SPR_setAttribute(892,3,2,0x037c,0x0d00);
  334.     SPR_display(1,320);
  335.     do{    
  336.             cx=mposx();cy=mposy();    
  337.             SPR_display(2,320);
  338.         if(target==0 || target==3 || target==4 || target==5 || target==9)
  339.             SPR_setPosition(0x00,868,3,2,cx/2,cy/2);
  340.         if(target == 1 || target == 2) 
  341.            {
  342.              SPR_setPosition(0x00,820,3,2,cx/2,cy/2);
  343.                  SPR_setPosition(0x00,868,3,2,215,cy/2);
  344.                }  
  345.           cb=mposb();
  346.         if(cb == 1)
  347.          {
  348.              if(target != 0)sdplay();
  349.              if(target == 0 || target == 3 || target == 4 || target == 5)
  350.              SPR_setPosition(0x00,892,3,2,cx/2+30,cy/2-30); 
  351.          if(target == 3 || target == 4)
  352.              SPR_setPosition(0x00,844,1,1,cx/2+24,cy/2-4); 
  353.          if(target == 9)
  354.              {
  355.              SPR_setPosition(0x00,892,3,2,cx/2+6,cy/2-30); 
  356.              SPR_setPosition(0x00,844,1,1,cx/2,cy/2-4); 
  357.              }
  358.          if(target == 5)
  359.              {
  360.              SPR_setPosition(0x00,844,1,1,cx/2+24,cy/2-4);
  361.                  sdplays(); 
  362.              SPR_setPosition(0x00,844,1,1,cx/2+44,cy/2-4);
  363.                  sdplays(); 
  364.              SPR_setPosition(0x00,844,1,1,cx/2+4,cy/2-4);
  365.                  sdplays(); 
  366.              SPR_setPosition(0x00,844,1,1,cx/2+24,cy/2+16);
  367.                  sdplays(); 
  368.              SPR_setPosition(0x00,844,1,1,cx/2+24,cy/2-24);
  369.                  sdplays(); 
  370.              SPR_setPosition(0x00,844,1,1,cx/2+44,cy/2-24);
  371.                  sdplays(); 
  372.              SPR_setPosition(0x00,844,1,1,cx/2+44,cy/2+16);
  373.                  sdplays(); 
  374.              SPR_setPosition(0x00,844,1,1,cx/2+4,cy/2+16);
  375.                  sdplays(); 
  376.              SPR_setPosition(0x00,844,1,1,cx/2+4,cy/2-24);
  377.                  sdplays(); 
  378.             }
  379.          if(target == 1 || target == 2) 
  380.             {
  381.                 SPR_setPosition(0x00,848,1,1,214,cy/2+8);
  382.             SPR_setPosition(0x00,892,3,2,220,cy/2-20); 
  383.             for(c=0;c<51-cx/8;c++)
  384.             {
  385.              SPR_setMotion(848,1,1,-4,0); 
  386.                  SPR_display(1,320);
  387.                  SPR_display(2,320);
  388.             }
  389.             SPR_setPosition(0x00,844,1,1,cx/2+16,cy/2+8); 
  390.             }
  391.          }
  392.         SPR_display(1,320);
  393.        }while(cb != 3);
  394.         SPR_display(0,320);
  395.       MOS_end();                                 /*マウス動作終了の設定*/
  396.    itemslct();
  397.   }
  398.  
  399. /* メイン処理 */
  400. void main()
  401.  {
  402.  int swg;
  403.  freadb();
  404.    SND_init(swork);
  405.    SND_pcm_mode_set(8);                /* 音声モードチャンネルの設定 */            SND_volume_change(64,127);          /* チャンネル音量設定         */
  406.    SND_elevol_all_mute(0);             /* オールミュート             */
  407.    SND_elevol_mute(1);                 /* 電子ボリュームミュート設定 */
  408.    SND_elevol_all_mute(1);             /* オールミュート             */
  409.  swtv = 0;
  410.  itemslct();
  411.  sbuf = malloc(6144);
  412.  mp  = malloc(3000);
  413.    do {
  414.        swg = iselect();
  415.        if(swg == 1) {freads("item1.spr","KOKA1.SND");tvplay(1);}
  416.        else if(swg == 2) {freads("item2.spr","KOKA1.SND");tvplay(2);}
  417.        else if(swg == 3) {freads("item3.spr","KOKA1.SND");tvplay(3);}
  418.        else if(swg == 4) {freads("item4.spr","KOKA1.SND");tvplay(4);}
  419.        else if(swg == 5) {freads("item5.spr","KOKA1.SND");tvplay(5);}
  420.        else if(swg == 6) {freads("item6.spr","KOKA1.SND");tvplay(0);}
  421.        else if(swg == 7) {freads("item7.spr","KOKA1.SND");tvplay(0);}
  422.        else if(swg == 8) {freads("item8.spr","KOKA1.SND");tvplay(4);}
  423.        else if(swg == 9) {freads("item9.spr","KOKA1.SND");tvplay(9);}
  424.        else if(swg == 10) {freads("item10.spr","KOKA1.SND");tvplay(4);}
  425.       }while(swg != 11);
  426.  free(mp); 
  427.  SND_end();
  428.  MOS_end();                            /*マウス動作終了の設定*/
  429. }
  430.