回精華區
作者Dinsam.bbs@ccudream.twbbs.org (前世.. o.O) 看板: plan
標題[功能]小型動態看板2(改使用camera)
時間中正築夢園 (Tue, 02 Sep 2003 15:20:50 +0800) Updated: 2005/05/17
在功能列表右邊的空白 可以有小動態看板

目前已知問題:

   1.必須開啟進入子選單重撥 movie 才能解決殘影問題
     (不知道有沒有人可以改成和原本的movie同步,這樣就更好囉)
   2.可使用ASCII或彩色,但使用時請注意長度(特別是使用雙色字)不能超過80
   3.如果定行數為七行,就全部都要用七行,不能多也不能少,不然會有怪畫面


: global.h

#define FN_ETC_FEAST    "etc/feast"     /* 節日 */
+ #define FN_GEM_ADVER  "gem/@/@-ad"    /*小動態看板 */

: BBS 站內 (A)nnounce 精華公佈欄

  Ctrl+P => (D)資料 加入 @-ad 這檔案連結
  這樣以後要修改比較容易

: @-ad範例檔 (以七行為範例)

# 井號開頭的的是註解
╔════════════╗
║     小廣告看板         ║
║                        ║
║                        ║
║                        ║
║                        ║
╚════════════╝
╔════════════╗
║     小廣告看板         ║
║                        ║
║                        ║
║                        ║
║                        ║
╚════════════╝
╔════════════╗
║     小廣告看板         ║
║                        ║
║                        ║
║                        ║
║                        ║
╚════════════╝

: config.h

#undef  CURSOR_BAR

  CURSOR_BAR 得 undef 才不會出錯

: config.h

/* camera.c 動態看板 */

#define MOVIE_MAX       180             /* 動畫張數 */
#define MOVIE_SIZE      (108 * 1024)    /* 動畫 cache size */
+ #define AD_LINE       7               /* 小型動態看板有七行 */

: struct.h

typedef struct
{
  int shot[MOVIE_MAX];  /* Thor.980805: 合理範圍為 0..MOVIE_MAX - 1 */
  char film[MOVIE_SIZE];
  char today[16];
+ int adnum;                    /* 有幾篇完整廣告 */
+ char ad[AD_LINE * 20][128];   /* 最多 20 篇完整廣告  */
} FCACHE;


: camera.c:main()

+ do_ad(fshm);

  exit(0);
}


: camera.c:do_ad() 加入 main() 前面


/* ----------------------------------------------------- */
/* 載入小型動態看板                                      */
/* ----------------------------------------------------- */


static void
do_ad(fshm)
  FCACHE *fshm;
{
  int num;
  char msg[STRLEN], *str;
  FILE *fp;

  if (fp = fopen(FN_GEM_ADVER, "r"))
  {
    for (num = 0; num < AD_LINE * 20;)  /* 最多 20 篇完整廣告 */
    {
      if (!fgets(msg, STRLEN, fp))
        break;
      if (*msg == '#' || *msg == '\n')
        continue;
      if (str = strchr(msg, '\n'))
        *str = '\0';
      strcpy(fshm->ad[num], msg);
      num++;
    }

    fclose(fp);

    num /= AD_LINE;
    if (num > 0)
    {
      fshm->adnum = num;
      return;
    }
  }

  fshm->adnum = 1;
  strcpy(fshm->ad[0], "錯誤!小型動態看板有問題");
}


: menu.c movie()

  if ((bbsmode <= M_XMENU) && (cuser.ufo & UFO_MOVIE))
+ {
+   int i, x;
+
+   i = (time(0) % fshm->adnum) * AD_LINE - 1;         /* 亂數選一個廣告 */
+   for (x = MENU_XPOS; x <= MENU_XPOS + AD_LINE; x++)
+   {
+     move(x, 42);              /* 放在選單的右邊 */
+     outs(fshm->ad[i++]);
+   }
    film_out(FILM_MOVIE, MENU_XNOTE);
+ }

: menu.c menu()

      mode = 0;
      do
      {
        move(MENU_XPOS + mode, MENU_YPOS + 2);
        if (mode <= max)
        {
          mptr = table[mode];
          str = mptr->desc;
          prints("(\033[1;36m%c\033[m)", *str++);
          outs(str);
        }
-       clrtoeol();
+       refresh();
      } while (++mode <= mmx);

...............
...............

      if (cmd <= M_XMENU)       /* 子目錄的 mode 要 <= M_XMENU */
      {
        menu->level = PERM_MENU + mptr->desc[0];
        menu = (MENU *) mptr->func;

-       mode = MENU_LOAD | MENU_DRAW;
+       mode = MENU_LOAD | MENU_DRAW | MENU_FILM;

...............

............

    case 'e':
      if (depth > 0)
      {
        menu->level = PERM_MENU + table[cc]->desc[0];
        menu = (MENU *) menu->func;

-       mode = MENU_LOAD | MENU_DRAW;
+       mode = MENU_LOAD | MENU_DRAW | MENU_FILM;

: visio.c igetch()

-         if (bbsmode < M_XMENU)        /* 在 menu 裡面要換 movie */
-         {
-           movie();
-           refresh();
-         }

--

改完編譯完之後記得reboot


--
     ˙    ˙ ◢▇◣ ◢▇◣ ▇  ▇ █▇◣ █▇◣ █▇◣ ◢▇◣ █▇▉   
  ˙          █     █     █  █ █  ▉ █  ▉ █▆   █▆▉ ▉▉▉ 
     ˙     ◥█◤ ◥█◤ ◥█◤ ██◤ █◥▆ █▆◤ █  ▉ ▉▉▉˙  
  CDBBS  中正築夢園BBS站 歡迎蒞臨參觀 cd.twbbs.org  (140.123.20.230)    
 http://cd.twbbs.org   Author: Dinsam      ★ From: 218.171.110.242    
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻