回精華區
作者SnowWolf.bbs@xeon.tfcis.org (靜夜) 看板: plan
標題[文件] 大富翁
時間動力核心 (Fri, 08 Aug 2003 22:24:43 +0800 (CST)) Updated: 2004/01/10
: rich.c

/************************************************/
/*          大富翁_v1.00_870619                 */
/*                                              */
/*          Author: dsyan                       */
/*      Create: 87/04/29                        */
/*      Update: xx/xx/xx                        */
/************************************************/

/* 本程式僅供學術測試及私人研究用途,嚴禁移作他用!! */
/* 若有任何問題歡迎討論.. u8511088@cc.nctu.edu.tw   */
/* 如果你把它改得很棒的話, 要記得 mail 我一下呦! :) */


#include "bbs.h"


struct RICH_STRUCT
{
  char lfx, lfy, nowuser, start, maxmax;
  char station[10], wapow[10], posi[10];
  char land[40], name[10][15], sym[10][3];
  char sls[6][3], msg[12][80], map[40][20], readmsg[10][12];
  char chance[15][60], fate[15][60], landst[6][5];
  int mapidx[40], chanceidx[15], fateidx[15], fee[40][9], current;
  long money[10];
};

static char inp[50], inpc, card, prec, delay, msgc, msgcc, editmode;
static char mymsg[6][80];
static struct RICH_STRUCT *ri;


/*-------------------------------------------------------*/
/* 螢幕控制                                              */
/*-------------------------------------------------------*/


static void
clrfromto(x, y)
  int x, y;
{
  int i;

  i = x;
  while (i <= y)
  {
    move(i, 0);
    clrtoeol();
    i++;
  }
}


static int          /* 1: 檔案在  0: 檔案不在 */
show_file(fpath, ln, lines) /* 從第 ln 列開始印檔案 lines 行 */
  char *fpath;
  int ln, lines;
{
  FILE *fp;
  char buf[ANSILINELEN];
  int i;

  if ((fp = fopen(fpath, "r")))
  {
    clrfromto(ln, ln + lines);
    move(ln, 0);
    i = lines;
    while (fgets(buf, ANSILINELEN, fp) && i--)
      outs(buf);
    fclose(fp);
    return 1;
  }
  return 0;
}


static void
showcursor()
{
  char i, j, c[3];

  for (i = 0; i < 40; i++)
  {
    c[0] = 32;
    c[1] = 32;
    c[2] = 0;
    for (j = 0; j < ri->maxmax; j++)
    {
      if (ri->posi[j] == i)
    strcpy(c, ri->sym[j]);
    }
    if (!i)
    {
      move(20, 64);
      outs(c);
    }
    if (i > 0 && i < 10)
    {
      move(19, 67 - i * 6);
      outs(c);
    }
    if (i == 10)
    {
      move(20, 10);
      outs(c);
    }
    if (i > 10 && i < 20)
    {
      move(41 - i * 2, 12);
      outs(c);
    }
    if (i == 20)
    {
      move(2, 10);
      outs(c);
    }
    if (i > 20 && i < 30)
    {
      move(3, i * 6 - 113);
      outs(c);
    }
    if (i == 30)
    {
      move(2, 64);
      outs(c);
    }
    if (i > 30)
    {
      move(2 * i - 59, 62);
      outs(c);
    }
  }
}


static void
showhouse()
{
  int i, x;
  for (x = 0; x < 40; x++)
  {
    i = ri->mapidx[x];
    if (i < 0 || i > ri->maxmax - 1)
      continue;
    if (x > 0 && x < 10)
    {
      move(20, 66 - x * 6);
      prints("%s%s", ri->sym[i], ri->sls[ri->land[x]]);
    }
    if (x > 10 && x < 20)
    {
      move(41 - x * 2, 0);
      outs(ri->sls[ri->land[x]]);
      move(41 - x * 2, 10);
      outs(ri->sym[i]);
    }
    if (x > 20 && x < 30)
    {
      move(2, x * 6 - 114);
      prints("%s%s", ri->sym[i], ri->sls[ri->land[x]]);
    }
    if (x > 30)
    {
      move(2 * x - 59, 74);
      outs(ri->sls[ri->land[x]]);
      move(2 * x - 59, 64);
      outs(ri->sym[i]);
    }
  }
}


static void
my_turn()
{
  if (prec == ri->current && editmode)
  {
    move(7 + ri->lfx, 13 + ri->lfy);
    prints("%s[%s]請按空白鍵擲骰子..", ri->sym[prec], ri->name[prec]);
    move(18, 16 + inpc);
  }
}


static void
showmsg()
{
  char i, j, buf[80];

  for (i = 0; i < 12; i++)
  {
    if (!ri->readmsg[prec][i])
      continue;
    strcpy(mymsg[msgc], ri->msg[i]);
    msgc = (msgc + 1) % 6;
    ri->readmsg[prec][i] = 0;
  }
  if (msgc != msgcc)
  {
    showcursor();
    showhouse();
    refresh();
    strcpy(buf, "                                                   ");
    for (i = 0; i < 6; i++)
    {
      move(12 + i, 14);
      j = 48 - strlen(mymsg[(msgc + i) % 6]);
      buf[j] = 0;
      prints("%s%s", mymsg[(msgc + i) % 6], buf);
      buf[j] = 32;
    }
    msgcc = msgc;
  }
  alarm(1);
  my_turn();
  refresh();
}


static void
sendmsg2(mytxt)
  char *mytxt;
{
  FILE *fp;
  char i, j, k;

  fp = fopen("etc/rich", "a+");
  fprintf(fp, "%s\n", mytxt);
  fclose(fp);

  for (i = 0; i < ri->maxmax; i++)
  {
    k = -1;
    while (k)
    {
      for (j = 0; j < 12; j++)
      {
    if (ri->readmsg[i][j])
      continue;
    ri->readmsg[i][j] = 1;
    strcpy(ri->msg[j], mytxt);
    k = 0;
    break;
      }
    }
  }
}


static void
goprison()
{
  char richbuf[100];

  move(9 + ri->lfx, 13 + ri->lfy);
  outs("哈哈哈! 你被關了!!!");
  sprintf(richbuf, "%s%s坐牢了...", ri->sym[prec], ri->name[prec]);
  sendmsg2(richbuf);
  if (card)
  {
    vmsg(NULL);
    move(9 + ri->lfx, 13 + ri->lfy);
    outs("什麼?!有免獄卡..那算了...");
    sendmsg2("什麼?!有免獄卡..那算了...");
    card--;
  }
  else
  {
    ri->posi[prec] = 10;
    delay = 3;
  }
}


static void
de(mo)
  long mo;
{
  ri->money[prec] -= mo;
}


static void
reload()
{
  clear();
  show_file("etc/game/display", 0, 24);
  showcursor();
  showhouse();
}


static void
editmsg()
{
  char i, mybuf[100];

  refresh();
  move(11, 18);
  outs("↓訊息");

  while (-1)
  {
    i = vkey();
    switch (i)
    {
    case Ctrl('Q'):
      if (!prec)
      {
    sendmsg2("桌長已落跑了..請按tab鍵跟著落跑吧!!");
    ri->current = 1000;
    ri->start = 0;
    ri->maxmax = 0;
    return;
      }
      break;

    case Ctrl('L'):
      reload();
      break;

    case KEY_TAB:
      refresh();
      move(11, 18);
      outs("↑命令");
      return;
      break;

    case KEY_BKSP:
      move(18, 16 + inpc);
      outs(" ");
      inpc--;
      if (inpc < 0)
    inpc = 0;
      move(18, 16 + inpc);
      break;

    case KEY_ENTER:
      if (inpc)
      {
    inp[inpc] = 0;
    if (!strcmp(inp, "/help"))
    {
      sendmsg2("桌長打 /bye 可跳出遊戲..");
      sendmsg2("按 Tab 鍵可切換訊息及命令模式..");
      sendmsg2("要跳出必須整組跳..");
    }
    else if (!prec && !strcmp(inp, "/bye"))
    {
      sendmsg2("桌長已落跑了..");
      sendmsg2("請按tab鍵跟著落跑吧!!");
      ri->current = 1000;
      ri->start = 0;
      ri->maxmax = 0;
      return;
    }
    else
    {
      sprintf(mybuf, "%s%s> %s", ri->sym[prec], ri->name[prec], inp);
      sendmsg2(mybuf);
    }
      }
      inpc = 0;
      move(18, 16);
      outs("                                        ");
      move(18, 16);
      break;

    default:
      inp[inpc] = i;
      move(18, 16 + inpc);
      outc(i);
      inpc++;
      move(18, 16 + inpc);
      if (inpc > 34)
    inpc = 34;
      break;
    }
  }
}


static void
log_rich(log)
  char *log;
{
  FILE *fp;

  if (fp = fopen("etc/game/rich.log", "a+"))
  {
    fprintf(fp, "%s %s\n", Now(), log);
    fclose(fp);
  }
}


int
main_rich()
{
  time_t now, startime;
  char richbuf[200], card;
  int i, j, k = -1, dice;
  delay = card = msgc = 0;
  FILE *fp;

  more("etc/game/rich.welcome", NULL);  /* 歡迎畫面 */

  vs_bar("網路大富翁");
  ri = shm_new(6665, sizeof(*ri));

  srandom(time(NULL) + cuser.userno);

  if (!ri->nowuser)
  {
    ri->nowuser = 22;
    vget(1, 0, "幾個人要玩?? (2~10)", richbuf, 3, LCECHO);
    i = atoi(richbuf);
    ri->nowuser = 0;
    if (i < 2 || i > 10)
      return;
    ri->maxmax = i;
  }

  move(19, 0);
  if (ri->start)
  {
    prints("已經有一組共 %d 個人在玩了!..\n請等一下再進來..", ri->maxmax);
    vmsg(NULL);
    return 0;
  }

  if (!ri->maxmax && ri->nowuser)
  {
    outs("上一桌正在結束中!..\n請等一下再進來..");
    vmsg(NULL);
    return 0;
  }

  if (ri->nowuser == 22)
  {
    outs("設定玩家人數中..請稍後再試...");
    vmsg(NULL);
    return 0;
  }

  if (!ri->nowuser)
  {
    strcpy(ri->landst[0], "空地");
    strcpy(ri->landst[1], "平房");
    strcpy(ri->landst[2], "二樓");
    strcpy(ri->landst[3], "三樓");
    strcpy(ri->landst[4], "四樓");
    strcpy(ri->landst[5], "旅館");

    strcpy(ri->sym[0], "1");
    strcpy(ri->sym[1], "2");
    strcpy(ri->sym[2], "3");
    strcpy(ri->sym[3], "4");
    strcpy(ri->sym[4], "5");
    strcpy(ri->sym[5], "6");
    strcpy(ri->sym[6], "7");
    strcpy(ri->sym[7], "8");
    strcpy(ri->sym[8], "9");
    strcpy(ri->sym[9], "0");

    strcpy(ri->sls[0], "○");
    strcpy(ri->sls[1], "Ⅰ");
    strcpy(ri->sls[2], "Ⅱ");
    strcpy(ri->sls[3], "Ⅲ");
    strcpy(ri->sls[4], "Ⅳ");
    strcpy(ri->sls[5], "★");

    ri->lfx = ri->lfy = 1;
  }

  k = -1;
  for (prec = 0; prec < ri->maxmax; prec++)
  {
    move(prec + 3, 10);
    prints("%s [%s]         ", ri->sym[prec], ri->name[prec]);
    if (!ri->name[prec][0] && k < 0)
      k = prec;
  }
  prec = k;
  ri->name[prec][0] = 1;
  ri->nowuser++;

  move(19, 0);
  outs("請輸入你的大名..");
  vget(prec + 3, 12, " ", richbuf, 11, LCECHO);
  if (!richbuf[0])
  {
    ri->name[prec][0] = 0;
    ri->nowuser--;
    return;
  }
  strcpy(ri->name[prec], richbuf);

  if (!prec)
  {
    for (i = 0; i < 40; i++)
      ri->land[i] = 0;

    /* 地圖檔 */
    fp = fopen("etc/game/map", "r");
    for (i = 0; i < 40; i++)
      fscanf(fp, "%s %d", ri->map[i], &ri->mapidx[i]);
    fclose(fp);

    /* 命運 */
    fp = fopen("etc/game/fate", "r");
    for (i = 0; i < 15; i++)
      fscanf(fp, "%s %d", ri->fate[i], &ri->fateidx[i]);
    fclose(fp);

    /* 機會 */
    fp = fopen("etc/game/chance", "r");
    for (i = 0; i < 15; i++)
      fscanf(fp, "%s %d", ri->chance[i], &ri->chanceidx[i]);
    fclose(fp);

    /* 費用 */
    fp = fopen("etc/game/fee", "r");
    for (i = 0; i < 40; i++)
    {
      fscanf(fp, "%d %d %d %d %d %d %d %d %d\n", &ri->fee[i][0], &ri->fee[i][1],
    &ri->fee[i][2], &ri->fee[i][3], &ri->fee[i][4], &ri->fee[i][5], &ri->fee[i][6],
    &ri->fee[i][7], &ri->fee[i][8]);
    }
    fclose(fp);

    ri->current = 0;        /* 清順序 */
    for (i = 0; i < 6; i++)
      ri->msg[i][0] = 0;
  }

  ri->money[prec] = 20000;  /* 存錢 */
  ri->station[prec] = 0;    /* 存車站 */
  ri->wapow[prec] = 0;      /* 查電力水力 */
  ri->posi[prec] = 0;       /* 存位置 */
  for (i = 0; i < 6; i++)
    mymsg[i][0] = 0;
  for (i = 0; i < 12; i++)
    ri->readmsg[prec][i] = 0;

  if (!prec)
  {
    sprintf(richbuf, "\033[32;1m%s\033[m 開了可容納 %d 人的\033[31;1m大富翁遊戲\033[m!..", cuser.userid, ri->maxmax);
    log_rich(richbuf);
    fp = fopen("etc/rich", "a+");
    fprintf(fp, "%s %s (%s)\n", str_author1, "楓城站", "高雄應用科技大學");
    fprintf(fp, "標題: %s\n時間: %s\n\n\n", "大富翁遊戲記錄", Btime(&now));
    fclose(fp);
  }
  sprintf(richbuf, "\033[32;1m%s\033[m 加入了! 代號是 \033[33;1m%s\033[m ..", cuser.userid, ri->name[prec]);
  log_rich(richbuf);

  move(19, 0);
  outs("等待其他的使用者加入...   ");
  strcpy(richbuf, "|/-\\");

  while (-1)            /* 查人數 */
  {
    k = -1;
    for (i = 0; i < ri->maxmax; i++)
    {
      move(i + 3, 10);
      j = ri->name[i][0];
      if (j)
    prints("%s [%s]         ", ri->sym[i], (j == 1) ? "登錄中" : ri->name[i]);
      else
    prints("%s [空白]         ", ri->sym[i]);

      if (!ri->name[i][0] || ri->name[i][0] == 1)
    k = i;
    }
    if (k < 0)
      break;
    move(19, 24);
    prints("%c", richbuf[now % 4]);
    refresh();
    now = time(0);
    while (time(0) - now < 1);
  };

  ri->start = 1;
  show_file("etc/game/display", 0, 24);
  move(11, 34);
  prints("%s%s", ri->sym[prec], ri->name[prec]);

  /* 進入訊息 */
  sprintf(richbuf, "%s%s (%s) 進來了", ri->sym[prec], ri->name[prec], cuser.userid);
  sendmsg2(richbuf);

  if (!prec)
  {
    sendmsg2("簡易說明:");
    sprintf(richbuf, "結束法..%s 在訊息欄按 Ctrl-Q", ri->name[prec]);
    sendmsg2(richbuf);
    sendmsg2("Tab 切換視窗,空白鍵擲骰子");
    sendmsg2("在訊息欄打 /help 會有求助畫面出現...");
    sendmsg2("Have fun!.. :)");
  }
  signal(SIGALRM, showmsg);
  alarm(1);

  editmode = 1;
  my_turn();
  startime = time(0);

  /* 開始繞圈圈了 */
  while (-1)
  {
    i = ri->posi[prec];
    j = ri->mapidx[i];
    move(3 + ri->lfx, 13 + ri->lfy);
    prints("現在位置: [%d] %s (%s)       ",
      i, ri->map[i], ri->landst[ri->land[i]]);
    move(4 + ri->lfx, 13 + ri->lfy);
    if (j < 0 || j > ri->maxmax)
      outs("目前屬於: ★" BBSNAME "☆");
    else
      prints("目前屬於: %s[%s]      ", ri->sym[j], ri->name[j]);
    move(5 + ri->lfx, 13 + ri->lfy);
    prints("大富翁幣: %d  免獄卡: %d     ", ri->money[prec], card);
    while (ri->current != prec)
    {
      editmode = 1;
      editmsg();
      editmode = 0;
      if (ri->current == prec)
    break;
      if (ri->current == 1000)
    goto gameover;
    }

    sprintf(richbuf, " ");
    sendmsg2(richbuf);
    sprintf(richbuf, "輪到%s%s了..", ri->sym[prec], ri->name[prec]);
    sendmsg2(richbuf);

    if (delay)
    {
      move(7 + ri->lfx, 13 + ri->lfy);
      outs("嗚嗚嗚..坐牢中...          ");
      move(8 + ri->lfx, 13 + ri->lfy);
      prints("還要 %d 次才輪到你喔!!", delay);
      sprintf(richbuf, "%s%s..嗚嗚嗚..還要%d次才出獄..:~",
    ri->sym[prec], ri->name[prec], delay);
      sendmsg2(richbuf);
      delay--;
      goto prison;
    }
    my_turn();
    while ((i = igetch()) != 32)
      if (ri->current == 1000)
    goto gameover;
    dice = random() % 11 + 2;

    move(7 + ri->lfx, 13 + ri->lfy);
    prints("擲出點數.. %d 點                 ", dice);

    sprintf(richbuf, "%s%s..擲出%d點..", ri->sym[prec], ri->name[prec], dice);
    sendmsg2(richbuf);

    ri->posi[prec] += dice;
    move(8 + ri->lfx, 13 + ri->lfy);

    if (ri->posi[prec] > 39)    /* 繞了一圈?? */
    {
      outs("經過\"由此去\"..得獎金 2000 元!!");
      sprintf(richbuf, "%s%s經過\"由此去\"..得2000", ri->sym[prec], ri->name[prec]);
      sendmsg2(richbuf);
      de(-2000);
      ri->posi[prec] -= 40;
      vmsg(NULL);
      move(8 + ri->lfx, 13 + ri->lfy);
      outs("                                                ");
      move(8 + ri->lfx, 13 + ri->lfy);
    }
    prints("[%d]%s", ri->posi[i], ri->map[ri->posi[prec]]);
    sprintf(richbuf, "%s%s走到[%d]%s", ri->sym[prec],
      ri->name[prec], ri->posi[prec], ri->map[ri->posi[prec]]);
    sendmsg2(richbuf);
    move(9 + ri->lfx, 13 + ri->lfy);

checkplace:
    if (ri->mapidx[ri->posi[prec]] < 0) /* 特殊地點?? */
    {
      switch (ri->mapidx[ri->posi[prec]])
      {
      case -2:          /* 免費停車場 */
    outs("免費的呦..休息一下吧... :)");
    break;

      case -3:          /* 命運 */
    dice = random() % 15;
    prints("[命運]%s", ri->fate[dice]);
    sprintf(richbuf, "%s%s..[命運]%s", ri->sym[prec],
      ri->name[prec], ri->fate[dice]);
    sendmsg2(richbuf);
    if (dice > 4)       /* 單純跟錢有關?? */
      de(-ri->fateidx[dice]);
    else
    {
      switch (dice)
      {
      case 0:       /* 拘票 */
        goprison();
        break;

      case 1:       /* 修理自己所有房屋-2 */
        vmsg(NULL);
        move(9 + ri->lfx, 13 + ri->lfy);
        j = k = 0;
        for (i = 0; i < 40; i++)
        {
          if (ri->mapidx[i] == prec)
          {
        if (ri->land[i] > 0 && ri->land[i] < 5)
          j++;
        else if (ri->land[i] == 5)
          k++;
          }
        }
        prints("房屋 %d 幢..旅館 %d 幢..合計 %d      ", j, k, j * 250 + k * 1000);
        sprintf(richbuf, "%s%s..房屋%d..旅館%d..合計%d",
          ri->sym[prec], ri->name[prec], j, k, j * 250 + k * 1000);
        sendmsg2(richbuf);
        de(j * 250 + k * 1000);
        break;

      case 2:       /* 你的生日 */
        de(-(ri->maxmax - 1) * 100);
        for (k = 0; k < ri->maxmax; k++)
          if (k != prec)
        ri->money[k] -= 100;
        break;

      case 3:       /* 出獄許可證 */
        card++;
        break;

      case 4:       /* 賣黃牛票 */
        vmsg(NULL);
        move(9 + ri->lfx, 13 + ri->lfy);
        outs("取機會一張?? (Y/n) ");
        j = igetch();
        if (j == 'Y' || j == 'y')
        {
          move(10, 47);
          outs("Yes");
          i = -22222;
          ri->mapidx[ri->posi[prec]] = -5;
          goto checkplace;
        }
        /* 先把index改成機會,用i=-22222做記號,到時再改回來 */
        {
          move(10, 47);
          outs("No");
          de(1000);
          break;
        }
      }
    }           /* 單純跟錢有關?? */
    break;

      case -4:          /* 所得稅 */
    de(2000);
    break;

      case -5:          /* 機會 */
    if (i == -22222)
      ri->mapidx[ri->posi[prec]] = -3;
    dice = random() % 15;
    move(9 + ri->lfx, 13 + ri->lfy);
    prints("[機會]%s ", ri->chance[dice]);
    sprintf(richbuf, "%s%s..[機會]%s", ri->sym[prec],
      ri->name[prec], ri->chance[dice]);
    sendmsg2(richbuf);
    if (dice > 6)       /* 單純跟錢有關?? */
      de(-ri->chanceidx[dice]);
    else
    {
      switch (dice)
      {
      case 0:       /* 拘票 */
        goprison();
        break;

      case 1:       /* 修理自己所有房屋 */
        vmsg(NULL);
        move(9 + ri->lfx, 13 + ri->lfy);
        k = j = 0;
        for (i = 0; i < 40; i++)
          if (ri->mapidx[i] == prec)
          {
        if (ri->land[i] > 0 && ri->land[i] < 5)
          i++;
        else if (ri->land[i] == 5)
          k++;
          }
        prints("房屋 %d 幢..旅館 %d 幢..合計 %d      ", j, k, j * 250 + k * 1000);
        sprintf(richbuf, "%s%s..房屋%d..旅館%d..合計%d",
          ri->sym[prec], ri->name[prec], j, k, j * 250 + k * 1000);
        sendmsg2(richbuf);
        de(j * 250 + k * 1000);
        break;

      case 2:       /* 付戶稅 */
        vmsg(NULL);
        move(9 + ri->lfx, 13 + ri->lfy);
        k = j = 0;
        for (i = 0; i < 40; i++)
          if (ri->mapidx[i] == prec)
          {
        if (ri->land[i] > 0 && ri->land[i] < 5)
          j++;
        else if (ri->land[i] == 5)
          k++;
          }
        prints("房屋 %d 幢..旅館 %d 幢..合計 %d      ", j, k, j * 400 + k * 1150);
        sprintf(richbuf, "%s%s..房屋%d..旅館%d..合計%d",
          ri->sym[prec], ri->name[prec], j, k, j * 400 + k * 1150);
        sendmsg2(richbuf);
        de(j * 400 + k * 1150);
        break;

      case 3:       /* 出獄許可證 */
        card++;
        break;

      case 4:       /* 前進到博愛路 */
        if (ri->posi[prec] > 14)
          de(-2000);
        ri->posi[prec] = 14;
        break;

      case 5:       /* 前進到民族路 */
        if (ri->posi[prec] > 26)
          de(-2000);
        ri->posi[prec] = 26;
        break;

      case 6:       /* 臺中車站 */
        if (ri->posi[prec] > 15)
          de(-2000);
        ri->posi[prec] = 15;
        break;
      }
    }
    break;

      case -6:          /* 坐牢/路過 */
    outs("呼..不可以做壞事呦... :)");
    break;

      case -7:          /* 進牢 */
    goprison();
    break;

      case -8:          /* 財產稅 */
    de(1000);
    break;

      case -9:          /* 各大車站 */
    if (ri->money[prec] >= 2000)
    {
      prints("%8s價值 2000 元,買?? (Y/n)", ri->map[ri->posi[prec]]);
      j = igetch();
      if (j != 'N' && j != 'n') /* 買 */
      {
        move(10, 47);
        outs("Yes");
        sprintf(richbuf, "%s%s..買下%8s", ri->sym[prec],
          ri->name[prec], ri->map[ri->posi[prec]]);
        sendmsg2(richbuf);
        de(2000);
        ri->mapidx[ri->posi[prec]] = prec;
        ri->station[prec]++;
      }
      else              /* 不買 */
      {
        move(10, 47);
        outs("No");
      }
    }
    else                /* 買不起 */
    {
      outs("很抱歉,你的現金不夠...");
    }
    break;

      case -10:
    if (ri->money[prec] >= 1500)
    {
      prints("%8s價值 1500 元,買?? (Y/n)", ri->map[ri->posi[prec]]);
      j = igetch();
      if (j != 'N' && j != 'n') /* 買 */
      {
        move(10, 47);
        outs("Yes");
        sprintf(richbuf, "%s%s..買下%8s", ri->sym[prec],
          ri->name[prec], ri->map[ri->posi[prec]]);
        sendmsg2(richbuf);
        de(1500);
        ri->mapidx[ri->posi[prec]] = prec;
        ri->wapow[prec]++;
      }
      else              /* 不買 */
      {
        move(10, 47);
        outs("No");
      }
    }
    else                /* 買不起 */
    {
      outs("很抱歉,你的現金不夠...");
    }
    break;
      }
    }

    /* 非特殊地點 */
    else
    {
      i = ri->posi[prec];
      if (ri->mapidx[ri->posi[prec]] < 100) /* 已被買走?? */
      {
    if (ri->mapidx[ri->posi[prec]] == prec) /* 自己的地 */
    {
      if (i == 5 || i == 12 || i == 15 || i == 25 || i == 28 || i == 35)    /* 車站、水廠、電廠 ..
                                         * 不能蓋房子的地 */
        outs("你自己的土地..休息一下吧... :)");
      else if (ri->land[i] == 5)    /* 旅館 */
        outs("已經是[旅館]了!!");
      else if (ri->fee[i][6] <= ri->money[prec])
      {
        prints("蓋\[%s]要 %d 元..要?? (Y/n)",
          ri->landst[ri->land[i] + 1], ri->fee[i][6]);
        j = igetch();
        if (j != 'n' && j != 'N')
        {
          move(10, 47);
          outs("Yes");
          ri->land[i]++;
          sprintf(richbuf, "%s%s..蓋\%s", ri->sym[prec], ri->name[prec],
        ri->landst[ri->land[i]]);
          sendmsg2(richbuf);
          de(ri->fee[i][6]);
        }
        else
        {
          move(10, 47);
          outs("No");
        }
      }
      else
        outs("你沒有足夠的錢喔!!");
    }
    else                /* 別人的地 */
    {
      if (i == 5 || i == 15 || i == 25 || i == 35)
        k = ri->station[prec] * 500;    /* 車站 */
      else if (i == 12 || i == 28)
        k = dice * ((ri->wapow[prec] == 1) ? 10 : 100); /* 自水、電力 */
      else
        k = ri->fee[i][ri->land[i]];
      prints("這是%s[%s]的[%s]..過路費 %d", ri->sym[ri->mapidx[i]],
        ri->name[ri->mapidx[i]], ri->landst[ri->mapidx[i]], k);
      sprintf(richbuf, "%s%s走到%s[%s]的地..過路費%d", ri->sym[prec],
        ri->name[prec], ri->sym[ri->mapidx[i]], ri->name[ri->mapidx[i]], k);
      sendmsg2(richbuf);
      de(k);
      ri->money[ri->mapidx[i]] += k;
    }
      }
      else      /* 未被買走 */
      {
    if (ri->mapidx[i] <= ri->money[prec])   /* 買得� */
    {
      prints("這塊空地價值 %d 元,買?? (Y/n)", ri->mapidx[i]);
      j = igetch();
      if (j != 'N' && j != 'n') /* 買 */
      {
        move(10, 47);
        outs("Yes");
        sprintf(richbuf, "%s%s..買下%s", ri->sym[prec], ri->name[prec], ri->map[i]);
        sendmsg2(richbuf);
        de(ri->mapidx[i]);
        ri->mapidx[i] = prec;
      }
      else              /* 不買 */
      {
        move(10, 47);
        outs("No");
      }
    }
    else                /* 買不起 */
    {
      outs("很抱歉,你的現金不夠...");
    }
      }
    }
prison:
    if (ri->current == 1000)
      goto gameover;
    ri->current = (prec + 1) % ri->maxmax;
    vmsg(NULL);
    for (i = 3; i < 10; i++)
    {
      move(i + ri->lfx, 13 + ri->lfy);
      outs("                                                ");
    }
  }
gameover:
  if (ri->current == 1000)
  {
    alarm(0);
    sprintf(richbuf, "\033[32;1m%s\033[m 落跑了! ..", cuser.userid, ri->name[prec]);
    log_rich(richbuf);

    clear();
    more("etc/rich", NULL);
    if (vans("移至備忘錄(Y/N)?[N] ") == 'y')
    {
      mail_self("etc/rich", cuser.userid, "[備 忘 錄] 大富翁遊戲記錄", MAIL_READ);
    }
    if (ri->nowuser == 1)   /* 最後一個跑掉的人 */
    {
      sprintf(richbuf, "\033[35;1m大富翁遊戲順利結束\033[m!..");
      log_rich(richbuf);
      system("rm etc/rich");
    }
    ri->name[prec][0] = 0;
    ri->nowuser--;
    return 1;
  }
}


--
=[:摃�◣�:Origin ]|[     O�processor.tfcis.org    ]|[�搟說:]=
=[:摃�╱�:Author ]|[     218-172-173-190.hinet-ip.hinet  ]|[�:]=
精華選讀←離開[主題上]主題下(k)上篇(j)下篇S/a搜尋 G串列 TAB精華 ↑↓捲 Pg/Space翻