home *** CD-ROM | disk | FTP | other *** search
/ MacUser Mac Bin 40 / MACUSER-MACBIN40A-1997-03.ISO.7z / MACUSER-MACBIN40A-1997-03.ISO / 特集⁄オンラインソフト / ゲーム&アミューズメント / アミューズメント / お説教フォルダ / Source / Osekkyou.c < prev    next >
C/C++ Source or Header  |  1991-12-14  |  7KB  |  252 lines

  1. /*--------------------------------------------------------------------------
  2.     名前    Osekkyou.c
  3.     機能    マック用低レベルソフトシリーズ
  4.     作成    1991.12.14.-1991.12.14. K.Nakagawa
  5.     変更
  6. --------------------------------------------------------------------------*/
  7.  
  8. /*--------------------------------------------------------------------------
  9.     インクルードファイル
  10. --------------------------------------------------------------------------*/
  11.  
  12. /*--------------------------------------------------------------------------
  13.     定数の定義
  14. --------------------------------------------------------------------------*/
  15.  
  16. #define    WAIT_A_WHILE_TIME        180        /* 看板の表示時間 */
  17.  
  18. #define    OPENNING_TITLE_DLOG_ID    1001    /* 看板のDLOGリソースID番号 */
  19. #define    FIRST_OSEKKYOU_ALRT_ID    1002    /* お説教ALRTリソースID番号 */
  20. #define    LAST_OSEKKYOU_ALRT_ID    1003    /* 上と同じだが最後に出すやつ */
  21.  
  22. #define    CONTINUE_ITEM_NO        1        /* "続ける"か"終了" */
  23. #define    CANCEL_ITEM_NO            2        /* "中止" */
  24.  
  25. #define    MIN_STR_OSEK_ID            1001    /* STR#の最小値 */
  26. #define    MAX_STR_OSEK_ID            1002    /* STR#の最大値 */
  27. #define    CUR_STR_OSEK_ID            1003    /* STR#の現在値 */
  28.  
  29. /*--------------------------------------------------------------------------
  30.     型の定義
  31. --------------------------------------------------------------------------*/
  32.  
  33. typedef struct {
  34.     int    id;                /* お説教のSTR#リソース番号 */
  35.     int    count;            /* 上記リソースの最大インデックス番号 */
  36. } OsekkyouIDandCount;
  37.  
  38. /*--------------------------------------------------------------------------
  39.     広域変数
  40. --------------------------------------------------------------------------*/
  41.  
  42. /*--------------------------------------------------------------------------
  43.     プロトタイプ宣言
  44. --------------------------------------------------------------------------*/
  45.  
  46. void main(void);
  47. void OpeningTitle(Boolean);
  48. void WaitAWhile(void);
  49. OsekkyouIDandCount GetTodayInformation(void);
  50. void OsekkyouMain(int,int,Boolean);
  51. static pascal void ResumeIt(void);
  52.  
  53. /*--------------------------------------------------------------------------
  54.     defineを使ったプログラムの定義
  55. --------------------------------------------------------------------------*/
  56.  
  57. /*--------------------------------------------------------------------------
  58.     外部に公開するプログラム
  59. --------------------------------------------------------------------------*/
  60.  
  61. void main(void)
  62. {
  63.     /* 変数宣言 */
  64.     OsekkyouIDandCount    aToday;    /* 本日、たれる、お説教のID番号など */
  65.     int                    aInt;
  66.  
  67.     /* 手続き */
  68.  
  69.     /* 初期化部分 */
  70.     /* ここはマックのマネージャ類に初期化を要求する部分であり */
  71.     /* いわば定番の処理とも言えます */
  72.     MaxApplZone();
  73.     InitGraf(&thePort);
  74.     InitFonts();
  75.     InitWindows();
  76.     TEInit();
  77.     InitMenus();
  78.     InitDialogs(ResumeIt);
  79.     FlushEvents(everyEvent,0);
  80.     InitCursor();
  81.  
  82.     /* ここで”低レベルソフトシリーズ お説教”というダイアログを出す */
  83.     OpeningTitle(TRUE);
  84.     
  85.     /* ほんでもって、しばらく待っている */
  86.     WaitAWhile();
  87.     
  88.     /* ここでダイアログを消す */
  89.     OpeningTitle(FALSE);
  90.  
  91.     /* お説教をたれていく */
  92.     aToday = GetTodayInformation();
  93.     for(aInt = 1; aInt < aToday.count; aInt++)
  94.     {
  95.         OsekkyouMain(aToday.id,aInt,FALSE);
  96.     }
  97.  
  98.     /* 本日は、これまで */
  99.     OsekkyouMain(aToday.id,aInt,TRUE);
  100. }
  101.  
  102. /*
  103.     看板の表示(pOpenFlag == TRUEなら)か消滅(pOpenFlag == FALSEなら)
  104. */
  105. void OpeningTitle(Boolean pOpenFlag)
  106. {
  107.     /* 変数宣言 */
  108.     static DialogPtr    aDialogPtr;        /* ダイアログへのポインター */
  109.  
  110.     /* 手続き */
  111.     if(pOpenFlag)
  112.     {
  113.         aDialogPtr = GetNewDialog(                /* ダイアログのオープン */
  114.                         OPENNING_TITLE_DLOG_ID,    /* DLOG ID番号 */
  115.                         (Ptr)0,                    /* ヒープから確保 */
  116.                         (WindowPtr)-1);            /* 前面に表示する */
  117.         if(aDialogPtr)
  118.             DrawDialog(aDialogPtr);            /* ダイアログの中身を表示 */
  119.     }else{
  120.         if(aDialogPtr)
  121.             DisposDialog(aDialogPtr);        /* ダイアログを閉じる */
  122.     }
  123. }
  124.  
  125. /*
  126.     しばらく待っている
  127. */
  128. void WaitAWhile(void)
  129. {
  130.     /* 変数宣言 */
  131.     long    aDummy;
  132.  
  133.     /* 手続き */
  134.     Delay(WAIT_A_WHILE_TIME,&aDummy);
  135. }
  136.  
  137. /*
  138.     今日の”お説教”の題材を決める
  139.     戻り値のうち、idはSTR#リソースのID番号であり
  140.                   countはそのSTR#リソースに含まれている文字列の数
  141.     エラーのときはid=0,count=0にして返す
  142. */
  143. OsekkyouIDandCount GetTodayInformation(void)
  144. {
  145.     /* 変数宣言 */
  146.     OsekkyouIDandCount    aResult;
  147.     Handle                aHandle;
  148.     int                    aMinID,aMaxID,aCurID,aCount,aNextCurID;
  149.  
  150.     /* 手続き */
  151.  
  152.     /* エラー時の戻り値をあらかじめセットしておく */
  153.     aResult.id = 0;
  154.     aResult.count = 0;
  155.  
  156.     /* STR#リソースの最小値と最大値を得る */
  157.     /* これらの情報はOSEKリソースの中にある */
  158.     aHandle = GetResource('OSEK',MIN_STR_OSEK_ID);
  159.     if((Handle)0 == aHandle)
  160.         return aResult;
  161.     aMinID = **((int **)aHandle);
  162.     ReleaseResource(aHandle);
  163.  
  164.     aHandle = GetResource('OSEK',MAX_STR_OSEK_ID);
  165.     if((Handle)0 == aHandle)
  166.         return aResult;
  167.     aMaxID = **((int **)aHandle);
  168.     ReleaseResource(aHandle);
  169.  
  170.     /* 本日の”お説教”に使うSTR#リソースのID番号をえる */
  171.     aHandle = GetResource('OSEK',CUR_STR_OSEK_ID);
  172.     if((Handle)0 == aHandle)
  173.         return aResult;
  174.     aCurID = **((int **)aHandle);
  175.  
  176.     /* 次回の”お説教”に使うSTR#リソースのID番号を決める */
  177.     aNextCurID = aCurID + 1;
  178.     if(aNextCurID > aMaxID)
  179.         aNextCurID = aMinID;
  180.     
  181.     /* 次回の”お説教”のためにOSEKリソースを更新する */
  182.     **((int **)aHandle) = aNextCurID;
  183.     ChangedResource(aHandle);
  184.     WriteResource(aHandle);
  185.     ReleaseResource(aHandle);
  186.  
  187.     /* 決定したID番号のSTR#リソースの持っている文字列の個数を得る */
  188.     aHandle = GetResource('STR#',aCurID);
  189.     if((Handle)0 == aHandle)
  190.         return aResult;
  191.     aCount = **((int **)aHandle);
  192.     ReleaseResource(aHandle);
  193.  
  194.     aResult.id = aCurID;
  195.     aResult.count = aCount;
  196.     return aResult;
  197. }
  198.  
  199. /*
  200.     お説教のダイアログを出していく
  201.     pSTRidはSTR#リソースのID番号
  202.     pIndexはSTR#リソースのインデックス番号
  203.     pIsEndはTRUEなら最終のダイアログを出す
  204. */
  205. void OsekkyouMain(int pSTRid,int pIndex,Boolean pIsEnd)
  206. {
  207.     /* 変数宣言 */
  208.     static Boolean    aEndFlag = FALSE;    /* 終了フラグ */
  209.     Str255            aStr255;
  210.     int                aItem;
  211.  
  212.     /* 手続き */
  213.  
  214.     /* すでに終了フラグが立っているなら戻る */
  215.     if(aEndFlag)
  216.         return;
  217.  
  218.     /* パラメータ異常なら戻る */
  219.     if(pSTRid <= 0 || pIndex <= 0)
  220.         return;
  221.  
  222.     /* STR#リソースを得る */
  223.     GetIndString(aStr255,pSTRid,pIndex);
  224.  
  225.     /* 文字列をセットする */
  226.     ParamText(aStr255,"¥p","¥p","¥p");
  227.  
  228.     /* アラートを出す */
  229.     aItem = Alert(pIsEnd ? LAST_OSEKKYOU_ALRT_ID : FIRST_OSEKKYOU_ALRT_ID,
  230.                   (ProcPtr)0);
  231.  
  232.     /* 中止であるなら終了フラグを立てる */
  233.     if(CANCEL_ITEM_NO == aItem)
  234.         aEndFlag = TRUE;
  235. }
  236.  
  237. /*--------------------------------------------------------------------------
  238.     外部に公開しないプログラム
  239. --------------------------------------------------------------------------*/
  240.  
  241. /*
  242.     爆弾でたぞー!
  243. */
  244. static pascal void ResumeIt(void)
  245. {
  246.     ExitToShell();
  247. }
  248.  
  249. /*--------------------------------------------------------------------------
  250.     このファイルはここまで
  251. --------------------------------------------------------------------------*/
  252.