summaryrefslogtreecommitdiffstats
path: root/mbbsd/chicken.c
diff options
context:
space:
mode:
Diffstat (limited to 'mbbsd/chicken.c')
-rw-r--r--mbbsd/chicken.c989
1 files changed, 989 insertions, 0 deletions
diff --git a/mbbsd/chicken.c b/mbbsd/chicken.c
new file mode 100644
index 00000000..f789925f
--- /dev/null
+++ b/mbbsd/chicken.c
@@ -0,0 +1,989 @@
+/* $Id: chicken.c,v 1.1 2002/03/07 15:13:48 in2 Exp $ */
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+#include <time.h>
+#include <unistd.h>
+#include <sys/types.h>
+#include <sys/socket.h>
+#include "config.h"
+#include "pttstruct.h"
+#include "common.h"
+#include "modes.h"
+#include "proto.h"
+
+#define NUM_KINDS 13 /* ���h�ֺذʪ� */
+
+static const char *cage[17] = {
+ "�ϥ�", "�g��", "���~", "�֦~", "�C�K", "�C�~",
+ "�C�~", "���O", "���~", "���~", "���~", "���~",
+ "���~", "�Ѧ~", "�Ѧ~", "������", "�j��"};
+static const char *chicken_type[NUM_KINDS] = {
+ "�p��", "���֤k", "�i�h", "�j��",
+ "���s", "���N", "��", "�����p�s",
+ "����", "�c�]", "�Ԫ�", "����",
+ "���^�E"};
+static const char *chicken_food[NUM_KINDS] = {
+ "���}��", "��i�p��", "���ƫK��", "������",
+ "����", "�p��", "�߻氮", "�p���氮",
+ "�_��", "�F��", "����", "�K��",
+ "���L"};
+static const int egg_price[NUM_KINDS] = {
+ 5, 25, 30, 40,
+ 80, 50, 15, 35,
+ 17, 100, 85, 200,
+ 200};
+static const int food_price[NUM_KINDS] = {
+ 4, 6, 8, 10,
+ 12, 12, 5, 6,
+ 5, 20, 15, 23,
+ 23};
+static const char *attack_type[NUM_KINDS] = {
+ "��", "�@��", "�l", "�r",
+ "����", "��", "��", "��",
+ "�r","�U�N","�t��","�ҥ�",
+ "�C��"};
+
+static const char *damage_degree[] = {
+ "�A�l����", "���o����", "�p�O��", "���L��",
+ "���I�k��", "�ϤO��", "�ˤH��", "������",
+ "�ϥ��O��", "�c������", "�M�I��", "�ƨg��",
+ "�r�P��", "�g���ɫB����", "��Ѱʦa��",
+ "�P�R��", NULL};
+
+enum {
+ OO, FOOD, WEIGHT, CLEAN, RUN, ATTACK, BOOK, HAPPY, SATIS,
+ TEMPERAMENT, TIREDSTRONG, SICK, HP_MAX, MM_MAX
+};
+
+extern userec_t cuser;
+
+static chicken_t *mychicken = &cuser.mychicken;
+static int age;
+
+static const int time_change[NUM_KINDS][14] =
+/* �ɫ~ ���� �魫 ���b �ӱ� �����O ���� �ּ� ���N ��� �h�� �f�� ���� ���k*/
+{
+/*��*/
+ { 1, 1, 30, 3, 8, 3, 3, 40, 9, 1, 7, 3, 30, 1},
+/*���֤k*/
+ { 1, 1, 110, 1, 4, 7, 41, 20, 9, 25, 25, 7, 110, 15},
+/*�i�h*/
+ { 1, 1, 200, 5, 4, 10, 33, 20, 15, 10, 27, 1, 200, 9},
+/*�j��*/
+ { 1, 1, 10, 5, 8, 1, 1, 5, 3, 1, 4, 1, 10, 30},
+/*���s*/
+ { 1, 1,1000, 9, 1, 13, 4, 12, 3, 1, 200, 1, 1000, 3},
+/*���N*/
+ { 1, 1, 90, 7, 10, 7, 4, 12, 3, 30, 20, 5, 90, 20},
+/*��*/
+ { 1, 1, 30, 5, 5, 6, 4, 8, 3, 15, 7, 4, 30, 21},
+/*�����p�s*/
+ { 1, 1, 100, 9, 7, 7, 20, 50, 10, 8, 24, 4, 100, 9},
+/*��*/
+ { 1, 1, 45, 8, 7, 9, 3, 40, 20, 3, 9, 5, 45, 1},
+/* �c�] */
+ { 1, 1, 45, 10, 11, 11, 5, 21, 11, 1, 9, 5, 45, 25},
+/* �Ԫ� */
+ { 1, 1, 45, 2, 12, 10, 25, 1, 1, 10, 9, 5, 45, 26},
+/* ���� */
+ { 1, 1, 150, 4, 8, 13, 95, 25, 7, 10, 25, 5, 175, 85},
+/* ���^�E */
+ { 1, 1, 147, 2, 10, 10, 85, 20, 4, 25, 25, 5, 145, 95}
+};
+
+extern userec_t xuser;
+extern int usernum;
+
+int reload_chicken() {
+ passwd_query(usernum, &xuser);
+ memcpy(mychicken, &xuser.mychicken, sizeof(chicken_t));
+ if(!mychicken->name[0])
+ return 0;
+ else return 1;
+}
+
+#define CHICKENLOG "etc/chicken"
+
+static int new_chicken() {
+ char buf[150];
+ int price;
+ time_t now;
+
+ clear();
+ move(2,0);
+ outs("�w���[�{ \033[33m��\033[37;44m Ptt�d������ \033[33;40m��\033[m.. "
+ "�ثe�J���G\n"
+ "(a)�p�� $5 (b)���֤k $25 (c)�i�h $30 (d)�j�� $40 "
+ "(e)���s $80\n"
+ "(f)���N $50 (g)�� $15 (h)�����p�s$35 (i)���� $17 "
+ "(j)�c�] $100\n"
+ "(k)�Ԫ� $85 (l)���� $200 (m)���^�E $200\n"
+ "[0]�ۤv $0\n");
+ getdata_str(6, 0, "�п�ܧA�n�i���ʪ��G", buf, 3, LCECHO, "0");
+
+ buf[0] -= 'a';
+ if(buf[0]<0 || buf[0]>NUM_KINDS-1)
+ return 0;
+
+ mychicken->type = buf[0];
+
+ reload_money();
+ price = egg_price[(int)mychicken->type];
+ if(cuser.money < price) {
+ prints("\n �������R�J�J,�J�J�n %d ��", price);
+ refresh();
+ return 0;
+ }
+ vice(price,"�d���J");
+ while(strlen(mychicken->name)<3)
+ getdata(8, 0, "���e���Ӧn�W�r�G", mychicken->name, 18, DOECHO);
+
+ now = time(NULL);
+ sprintf(buf,"\033[31m%s \033[m�i�F�@���s\033[33m %s \033[m�� "
+ "\033[32m%s\033[m �� %s",cuser.userid,
+ mychicken->name,chicken_type[(int)mychicken->type],ctime(&now));
+ log_file(CHICKENLOG,buf);
+ mychicken->lastvisit = mychicken->birthday = mychicken->cbirth = now;
+ mychicken->food = 0;
+ mychicken->weight = time_change[(int)mychicken->type][WEIGHT]/3;
+ mychicken->clean = 0;
+ mychicken->run = time_change[(int)mychicken->type][RUN];
+ mychicken->attack = time_change[(int)mychicken->type][ATTACK];
+ mychicken->book = time_change[(int)mychicken->type][BOOK];
+ mychicken->happy = time_change[(int)mychicken->type][HAPPY];
+ mychicken->satis = time_change[(int)mychicken->type][SATIS];
+ mychicken->temperament = time_change[(int)mychicken->type][TEMPERAMENT];
+ mychicken->tiredstrong = 0;
+ mychicken->sick = 0;
+ mychicken->hp = time_change[(int)mychicken->type][WEIGHT];
+ mychicken->hp_max = time_change[(int)mychicken->type][WEIGHT];
+ mychicken->mm = 0;
+ mychicken->mm_max = 0;
+ return 1;
+}
+
+int show_file(char *filename, int y, int lines, int mode) {
+ FILE *fp;
+ char buf[256];
+
+ if(y >= 0)
+ move(y,0);
+ clrtoline(lines + y);
+ if((fp=fopen(filename,"r"))) {
+ while(fgets(buf,256,fp) && lines--)
+ outs(Ptt_prints(buf,mode));
+ fclose(fp);
+ } else
+ return 0;
+ return 1;
+}
+
+static void show_chicken_stat(chicken_t *thechicken) {
+ struct tm *ptime;
+
+ ptime = localtime(&thechicken->birthday);
+ prints(" Name :\033[33m%s\033[m (\033[32m%s\033[m)%*s�ͤ� "
+ ":\033[31m%02d\033[m�~\033[31m%2d\033[m��\033[31m%2d\033[m�� "
+ "(\033[32m%s %d��\033[m)\n"
+ " ��:\033[33m%5d/%-5d\033[m �k:\033[33m%5d/%-5d\033[m �����O:"
+ "\033[33m%-7d\033[m �ӱ� :\033[33m%-7d\033[m ���� :\033[33m%-7d"
+ "\033[m \n"
+ " �ּ� :\033[33m%-7d\033[m ���N :\033[33m%-7d\033[m �h�� :"
+ "\033[33m%-7d\033[m ��� :\033[33m%-7d \033[m�魫 :"
+ "\033[33m%-5.2f\033[m \n"
+ " �f�� :\033[33m%-7d\033[m ���b :\033[33m%-7d\033[m ���� :"
+ "\033[33m%-7d\033[m �j�ɤY:\033[33m%-7d\033[m �ī~ :\033[33m%-7d"
+ "\033[m \n",
+ thechicken->name, chicken_type[(int)thechicken->type],
+ 15 - strlen(thechicken->name), "",
+ ptime->tm_year % 100, ptime->tm_mon + 1, ptime->tm_mday,
+ cage[age > 16 ? 16 : age], age, thechicken->hp, thechicken->hp_max,
+ thechicken->mm, thechicken->mm_max,
+ thechicken->attack, thechicken->run, thechicken->book,
+ thechicken->happy, thechicken->satis, thechicken->tiredstrong,
+ thechicken->temperament,
+ ((float)(thechicken->hp_max+(thechicken->weight/50))) / 100,
+ thechicken->sick, thechicken->clean, thechicken->food,
+ thechicken->oo, thechicken->medicine);
+}
+
+#define CHICKEN_PIC "etc/chickens"
+extern char *BBSName;
+
+void show_chicken_data(chicken_t *thechicken, chicken_t *pkchicken) {
+ char buf[1024];
+ age = ((time(NULL) - thechicken->cbirth)/ (60*60*24));
+ if(age < 0) {
+ thechicken->birthday = thechicken->cbirth = time(NULL)-10*(60*60*24);
+ age = 10;
+ }
+ /*Ptt:debug*/
+ thechicken->type %= NUM_KINDS;
+ clear();
+ showtitle(pkchicken ? "��tt������" : "��tt�i����", BBSName);
+ move(1,0);
+
+ show_chicken_stat(thechicken);
+
+ sprintf(buf, CHICKEN_PIC "/%c%d", thechicken->type + 'a',
+ age > 16 ? 16 : age);
+ show_file(buf, 5, 14, NO_RELOAD);
+
+ move(18,0);
+
+ if(thechicken->sick)
+ outs("�ͯf�F...");
+ if(thechicken->sick > thechicken->hp / 5)
+ outs("\033[5;31m���...�f��!!\033[m");
+
+ if(thechicken->clean > 150)
+ outs("\033[31m�S��Sż��..\033[m");
+ else if(thechicken->clean > 80)
+ outs("���Iż..");
+ else if(thechicken->clean < 20)
+ outs("\033[32m�ܰ��b..\033[m");
+
+ if(thechicken->weight > thechicken->hp_max*4)
+ outs("\033[31m�ֹ����F!.\033[m");
+ else if(thechicken->weight > thechicken->hp_max*3)
+ outs("\033[32m���ʹ�..\033[m");
+ else if(thechicken->weight < (thechicken->hp_max / 4))
+ outs("\033[31m�־j���F!..\033[m");
+ else if(thechicken->weight < (thechicken->hp_max / 2))
+ outs("�j�F..");
+
+ if(thechicken->tiredstrong > thechicken->hp * 1.7)
+ outs("\033[31m�ֱo���g�F...\033[m");
+ else if(thechicken->tiredstrong > thechicken->hp)
+ outs("�֤F..");
+ else if(thechicken->tiredstrong < thechicken->hp / 4)
+ outs("\033[32m��O����...\033[m");
+
+ if(thechicken->hp < thechicken->hp_max / 4)
+ outs("\033[31m��O�κ�..�a�a�@��..\033[m");
+ if(thechicken->happy > 500)
+ outs("\033[32m�ܧּ�..\033[m");
+ else if(thechicken->happy < 100)
+ outs("���ּ�..");
+ if(thechicken->satis > 500)
+ outs("\033[32m�ܺ���..\033[m");
+ else if(thechicken->satis < 50)
+ outs("������..");
+
+ if(pkchicken) {
+ outs("\n");
+ show_chicken_stat(pkchicken);
+ outs("[���N��] ������� [q] ���] [o] �Y�j�ɤY");
+ }
+}
+
+static void ch_eat() {
+ if(mychicken->food) {
+ mychicken->weight += time_change[(int)mychicken->type][WEIGHT] +
+ mychicken->hp_max/5 ;
+ mychicken->tiredstrong +=
+ time_change[(int)mychicken->type][TIREDSTRONG] / 2;
+ mychicken->hp_max++;
+ mychicken->happy += 5;
+ mychicken->satis += 7;
+ mychicken->food--;
+ move(10, 10);
+
+ show_file(CHICKEN_PIC "/eat", 5, 14, NO_RELOAD);
+ pressanykey();
+ }
+}
+
+static void ch_clean() {
+ mychicken->clean = 0;
+ mychicken->tiredstrong +=
+ time_change[(int)mychicken->type][TIREDSTRONG] / 3;
+ show_file(CHICKEN_PIC "/clean", 5, 14, NO_RELOAD);
+ pressanykey();
+}
+
+static void ch_guess() {
+ char *guess[3] = {"�ŤM", "���Y", "��"}, me, ch, win;
+
+ mychicken->happy += time_change[(int)mychicken->type][HAPPY]*1.5;
+ mychicken->satis += time_change[(int)mychicken->type][SATIS];
+ mychicken->tiredstrong += time_change[(int)mychicken->type][TIREDSTRONG];
+ mychicken->attack += time_change[(int)mychicken->type][ATTACK]/4;
+ move(20,0);
+ clrtobot();
+ outs("�A�n�X[\033[32m1\033[m]\033[33m�ŤM\033[m(\033[32m2\033[m)"
+ "\033[33m���Y\033[m(\033[32m3\033[m)\033[33m��\033[m:\n");
+ me = igetch();
+ me -= '1';
+ if(me > 2 || me < 0)
+ me = 0;
+ win = (int)(3.0 * rand()/(RAND_MAX + 1.0)) - 1;
+ ch = (me + win + 3)%3;
+ prints("%s:%s ! %s:%s !.....%s",
+ cuser.userid, guess[(int)me], mychicken->name, guess[(int)ch],
+ win==0 ? "����" : win < 0 ? "�C..Ĺ�F :D!!" : "��..�ڿ�F :~");
+ pressanykey();
+}
+
+static void ch_book() {
+ mychicken->book += time_change[(int)mychicken->type][BOOK];
+ mychicken->tiredstrong += time_change[(int)mychicken->type][TIREDSTRONG];
+ show_file(CHICKEN_PIC "/read", 5, 14, NO_RELOAD);
+ pressanykey();
+}
+
+static void ch_kiss() {
+ mychicken->happy += time_change[(int)mychicken->type][HAPPY];
+ mychicken->satis += time_change[(int)mychicken->type][SATIS];
+ mychicken->tiredstrong +=
+ time_change[(int)mychicken->type][TIREDSTRONG] / 2;
+ show_file(CHICKEN_PIC "/kiss", 5, 14, NO_RELOAD);
+ pressanykey();
+}
+
+static void ch_hit() {
+ mychicken->attack += time_change[(int)mychicken->type][ATTACK];
+ mychicken->run += time_change[(int)mychicken->type][RUN];
+ mychicken->mm_max += time_change[(int)mychicken->type][MM_MAX]/15;
+ mychicken->weight -= mychicken->hp_max / 15 ;
+ mychicken->hp -= (int)((float)time_change[(int)mychicken->type][HP_MAX] *
+ rand()/(RAND_MAX+1.0)) / 2 + 1;
+
+ if(mychicken->book > 2)
+ mychicken->book -= 2;
+ if(mychicken->happy > 2)
+ mychicken->happy -= 2;
+ if(mychicken->satis > 2)
+ mychicken->satis -= 2;
+ mychicken->tiredstrong += time_change[(int)mychicken->type][TIREDSTRONG];
+ show_file(CHICKEN_PIC "/hit", 5, 14, NO_RELOAD);
+ pressanykey();
+}
+
+extern int b_lines; /* Screen bottom line number: t_lines-1 */
+
+void ch_buyitem(int money, char *picture, int *item) {
+ int num = 0;
+ char buf[5];
+
+ getdata_str(b_lines - 1, 0, "�n�R�h�֥��O:", buf, 4, DOECHO, "1");
+ num = atoi(buf);
+ if(num < 1)
+ return;
+ reload_money();
+ if(cuser.money > money*num) {
+ *item += num;
+ vice(money*num,"�ʶR�d��,��L����");
+ show_file(picture, 5, 14, NO_RELOAD);
+ } else {
+ move(b_lines-1,0);
+ clrtoeol();
+ outs("�{������ !!!");
+ }
+ pressanykey();
+}
+
+static void ch_eatoo() {
+ if(mychicken->oo > 0) {
+ mychicken->oo--;
+ mychicken->tiredstrong = 0;
+ if(mychicken->happy > 5)
+ mychicken->happy -= 5;
+ show_file(CHICKEN_PIC "/oo", 5, 14, NO_RELOAD);
+ pressanykey();
+ }
+}
+
+static void ch_eatmedicine() {
+ if(mychicken->medicine > 0) {
+ mychicken->medicine--;
+ mychicken->sick = 0;
+ if(mychicken->hp_max > 10)
+ mychicken->hp_max -= 3;
+ mychicken->hp = mychicken->hp_max;
+ if(mychicken->happy>10)
+ mychicken->happy -= 10;
+ show_file(CHICKEN_PIC "/medicine", 5, 14, NO_RELOAD);
+ pressanykey();
+ }
+}
+
+static void ch_kill() {
+ char buf[150],ans[4];
+
+ sprintf(buf, "��i�o%s�n�Q�@ 100 ��, �O�_�n��i?(y/N)",
+ chicken_type[(int)mychicken->type]);
+ getdata_str(23, 0, buf, ans, 3, DOECHO, "N");
+ if(ans[0] == 'y') {
+ time_t now = time(NULL);
+
+ vice(100,"��i�d���O");
+ more(CHICKEN_PIC "/deadth",YEA);
+ sprintf(buf, "\033[31m%s \033[m�� \033[33m%s\033[m\033[32m %s "
+ "\033[m�_�F �� %s", cuser.userid,
+ mychicken->name, chicken_type[(int)mychicken->type], ctime(&now));
+ log_file(CHICKENLOG, buf);
+ mychicken->name[0]=0;
+ }
+}
+
+static int ch_sell() {
+/*
+ int money = (mychicken->weight - time_change[(int)mychicken->type][WEIGHT])
+ *(food_price[(int)mychicken->type])/4 +
+ (
+ + ((mychicken->clean / time_change[(int)mychicken->type][CLEAN])
+ + (mychicken->run / time_change[(int)mychicken->type][RUN])
+ + (mychicken->attack / time_change[(int)mychicken->type][ATTACK])
+ + (mychicken->book / time_change[(int)mychicken->type][BOOK])
+ + (mychicken->happy / time_change[(int)mychicken->type][HAPPY])
+ + (mychicken->satis / time_change[(int)mychicken->type][SATIS])
+ + (mychicken->temperament / time_change[(int)mychicken->type][TEMPERAMENT])
+ - (mychicken->tiredstrong / time_change[(int)mychicken->type][TIREDSTRONG])
+ - (mychicken->sick / time_change[(int)mychicken->type][SICK])
+ + (mychicken->hp / time_change[(int)mychicken->type][HP_MAX])
+ + (mychicken->mm / time_change[(int)mychicken->type][MM_MAX])
+ + 7 - abs(age - 7)) * 3
+ ;
+*/
+ int money = (age * food_price[(int)mychicken->type] * 3
+ + (mychicken->hp_max * 10 + mychicken->weight) /
+ time_change[(int)mychicken->type][HP_MAX]) * 3 / 2 -
+ mychicken->sick;
+ char buf[150],ans[4];
+ time_t now = time(NULL);
+
+ if(money < 0)
+ money =0 ;
+ else if(money > MAX_CHICKEN_MONEY)
+ money = MAX_CHICKEN_MONEY; //�������
+ if(mychicken->type == 1 || mychicken->type == 7) {
+ outs("\n\033[31m ��..�˷R��..�c��H�f�O�|�Ǫk����..\033[m");
+ pressanykey();
+ return 0;
+ }
+ if(age < 5) {
+ outs("\n �٥����~�����");
+ pressanykey();
+ return 0;
+ }
+ if(age > 30) {
+ outs("\n\033[31m �o..�ӦѨS�H�n�F\033[m");
+ pressanykey();
+ return 0;
+ }
+
+ sprintf(buf, "�o��%d��%s�i�H�� %d ��, �O�_�n��?(y/N)", age,
+ chicken_type[(int)mychicken->type], money);
+ getdata_str(23, 0, buf, ans, 3, DOECHO, "N");
+ if(ans[0]=='y') {
+ sprintf(buf, "\033[31m%s\033[m �� \033[33m%s\033[m "
+ "\033[32m%s\033[m �� \033[36m%d\033[m ��F �� %s",
+ cuser.userid, mychicken->name,
+ chicken_type[(int)mychicken->type],money,ctime(&now));
+ log_file(CHICKENLOG, buf);
+ mychicken->lastvisit = mychicken->name[0]=0;
+ passwd_update(usernum, &cuser);
+ more(CHICKEN_PIC "/sell",YEA);
+ demoney(money);
+ return 1;
+ }
+ return 0;
+}
+
+static void geting_old(int *hp, int *weight, int diff, int age) {
+ float ex = 0.9;
+
+ if(age > 70)
+ ex = 0.1;
+ else if(age > 30)
+ ex = 0.5;
+ else if(age > 20)
+ ex = 0.7;
+
+ diff /= 60*6;
+ while(diff--) {
+ *hp *= ex;
+ *weight *= ex;
+ }
+}
+
+/* �̮ɶ��ܰʪ���� */
+void time_diff(chicken_t *thechicken) {
+ int diff;
+ int theage = ((time(NULL) - thechicken->cbirth)/ (60 * 60 * 24));
+
+ thechicken->type %= NUM_KINDS ;
+ diff = (time(NULL)-thechicken->lastvisit)/60;
+
+ if((diff) < 1)
+ return;
+
+ if(theage > 13 ) /* �Ѧ� */
+ geting_old(&thechicken->hp_max, &thechicken->weight, diff, age);
+
+ thechicken->lastvisit = time(NULL);
+ thechicken->weight -= thechicken->hp_max * diff / 540; /* �魫 */
+ if(thechicken->weight < 1) {
+ thechicken->sick -= thechicken->weight / 10; /* �j�o�f��W�� */
+ thechicken->weight =1;
+ }
+
+ /* �M��� */
+ thechicken->clean += diff * time_change[(int)thechicken->type][CLEAN] / 30;
+
+ /* �ּ֫� */
+ thechicken->happy -= diff / 60;
+ if(thechicken->happy < 0)
+ thechicken->happy=0;
+ thechicken->attack -=
+ time_change[(int)thechicken->type][ATTACK] * diff / (60 * 32);
+ if(thechicken->attack < 0)
+ thechicken->attack = 0;
+ /* �����O */
+ thechicken->run -= time_change[(int)thechicken->type][RUN] * diff / (60 * 32);
+ /* �ӱ� */
+ if(thechicken->run < 0)
+ thechicken->run = 0;
+ thechicken->book -= time_change[(int)thechicken->type][BOOK]*diff/ (60*32);
+ /* ���� */
+ if(thechicken->book < 0)
+ thechicken->book = 0;
+ /* ��� */
+ thechicken->temperament++;
+
+ thechicken->satis -= diff / 60 / 3 * time_change[(int)thechicken->type][SATIS];
+ /* ���N�� */
+ if(thechicken->satis < 0)
+ thechicken->satis = 0;
+
+ /* ż�f�� */
+ if(mychicken->clean > 1000)
+ mychicken->sick += (mychicken->clean - 400) / 10;
+
+ if(thechicken->weight > 1)
+ thechicken->sick -= diff / 60;
+ /* �f����@ */
+ if(thechicken->sick < 0)
+ thechicken->sick = 0;
+ thechicken->tiredstrong -= diff *
+ time_change[(int)thechicken->type][TIREDSTRONG] / 4;
+ /* �h�� */
+ if(thechicken->tiredstrong < 0)
+ thechicken->tiredstrong = 0;
+ /* hp_max */
+ if(thechicken->hp >= thechicken->hp_max/2)
+ thechicken->hp_max +=
+ time_change[(int)thechicken->type][HP_MAX]*diff/ (60*12);
+ /* hp���@ */
+ if(!thechicken->sick)
+ thechicken->hp +=
+ time_change[(int)thechicken->type][HP_MAX]*diff/ (60*6);
+ if(thechicken->hp>thechicken->hp_max)
+ thechicken->hp = thechicken->hp_max;
+ /* mm_max */
+ if(thechicken->mm >= thechicken->mm_max/2)
+ thechicken->mm_max +=
+ time_change[(int)thechicken->type][MM_MAX]*diff/ (60*8);
+ /* mm���@ */
+ if(!thechicken->sick)
+ thechicken->mm += diff;
+ if(thechicken->mm>thechicken->mm_max)
+ thechicken->mm = thechicken->mm_max;
+}
+
+static void check_sick() {
+ /* ż�f�� */
+ if(mychicken->tiredstrong > mychicken->hp * 0.3 && mychicken->clean > 150)
+ mychicken->sick += (mychicken->clean - 150) / 10;
+ /* �֯f�� */
+ if(mychicken->tiredstrong > mychicken->hp*1.3)
+ mychicken->sick += time_change[(int)mychicken->type][SICK];
+ /* �f��ӭ��ٰ��ƴ�hp */
+ if(mychicken->sick > mychicken->hp / 5) {
+ mychicken->hp -= (mychicken->sick - mychicken->hp / 5)/4;
+ if(mychicken->hp < 0 )
+ mychicken->hp = 0;
+ }
+}
+
+static int deadtype(chicken_t *thechicken) {
+ int i;
+ char buf[150];
+ time_t now = time(NULL);
+
+ if(thechicken->hp <= 0) /* hp�κ� */
+ i = 1;
+ else if(thechicken->tiredstrong > thechicken->hp * 3 ) /* �޳ҹL�� */
+ i = 2;
+ else if(thechicken->weight > thechicken->hp_max*5) /* �έD�L�� */
+ i = 3;
+ else if(thechicken->weight == 1 &&
+ thechicken->sick > thechicken->hp_max / 4)
+ i = 4; /* �j���F */
+ else if(thechicken->satis <= 0) /* �ܤ����N */
+ i = 5;
+ else
+ return 0;
+
+ if(thechicken == mychicken) {
+ sprintf(buf,"\033[31m%s\033[m �үk�R��\033[33m %s\033[32m %s "
+ "\033[m���F �� %s",
+ cuser.userid, thechicken->name,
+ chicken_type[(int)thechicken->type],
+ ctime(&now));
+ log_file(CHICKENLOG, buf);
+ mychicken->name[0] = 0;
+ passwd_update(usernum, &cuser);
+ }
+ return i;
+}
+
+int showdeadth(int type) {
+ switch(type) {
+ case 1:
+ more(CHICKEN_PIC "/nohp",YEA);
+ break;
+ case 2:
+ more(CHICKEN_PIC "/tootired",YEA);
+ break;
+ case 3:
+ more(CHICKEN_PIC "/toofat",YEA);
+ break;
+ case 4:
+ more(CHICKEN_PIC "/nofood",YEA);
+ break;
+ case 5:
+ more(CHICKEN_PIC "/nosatis", YEA);
+ break;
+ default:
+ return 0;
+ }
+ more(CHICKEN_PIC "/deadth",YEA);
+ return type;
+}
+
+int isdeadth(chicken_t *thechicken) {
+ int i;
+
+ if(!(i = deadtype(thechicken)))
+ return 0;
+ return showdeadth(i);
+}
+
+static void ch_changename() {
+ char buf[150], newname[20] = "";
+ time_t now = time(NULL);
+
+ getdata_str(b_lines - 1, 0, "��..��Ӧn�W�r�a:", newname, 18, DOECHO,
+ mychicken->name);
+
+ if(strlen(newname) >= 3 && strcmp(newname,mychicken->name)) {
+ sprintf(buf, "\033[31m%s\033[m ��k�R��\033[33m %s\033[32m %s "
+ "\033[m��W��\033[33m %s\033[m �� %s",
+ cuser.userid, mychicken->name,
+ chicken_type[(int)mychicken->type],
+ newname, ctime(&now));
+ strcpy(mychicken->name, newname);
+ log_file(CHICKENLOG,buf);
+ }
+}
+
+static int select_menu() {
+ char ch;
+
+ reload_money();
+ move(19,0);
+ prints("\033[44;37m �� :\033[33m %-10d "
+ " \033[m\n"
+ "\033[33m(\033[37m1\033[33m)�M�z (\033[37m2\033[33m)�Y�� "
+ "(\033[37m3\033[33m)�q�� (\033[37m4\033[33m)��� "
+ "(\033[37m5\033[33m)�˥L (\033[37m6\033[33m)���L "
+ "(\033[37m7\033[33m)�R%s$%d (\033[37m8\033[33m)�Y�ɤY\n"
+ "(\033[37m9\033[33m)�Y�f�� (\033[37mo\033[33m)�R�j�ɤY$100 "
+ "(\033[37mm\033[33m)�R��$10 (\033[37mk\033[33m)��i "
+ "(\033[37ms\033[33m)�汼 (\033[37mn\033[33m)��W "
+ "(\033[37mq\033[33m)���}:\033[m",
+ cuser.money,
+ /*chicken_food[(int)mychicken->type],
+ chicken_type[(int)mychicken->type],
+ chicken_type[(int)mychicken->type],*/
+ chicken_food[(int)mychicken->type],
+ food_price[(int)mychicken->type]);
+ do {
+ switch(ch = igetch()) {
+ case '1':
+ ch_clean();
+ check_sick();
+ break;
+ case '2':
+ ch_eat();
+ check_sick();
+ break;
+ case '3':
+ ch_guess();
+ check_sick();
+ break;
+ case '4':
+ ch_book();
+ check_sick();
+ break;
+ case '5':
+ ch_kiss();
+ break;
+ case '6':
+ ch_hit();
+ check_sick();
+ break;
+ case '7':
+ ch_buyitem(food_price[(int)mychicken->type], CHICKEN_PIC "/food",
+ &mychicken->food);
+ break;
+ case '8':
+ ch_eatoo();
+ break;
+ case '9':
+ ch_eatmedicine();
+ break;
+ case 'O':
+ case 'o':
+ ch_buyitem(100, CHICKEN_PIC "/buyoo", &mychicken->oo);
+ break;
+ case 'M':
+ case 'm':
+ ch_buyitem(10, CHICKEN_PIC "/buymedicine", &mychicken->medicine);
+ break;
+ case 'N':
+ case 'n':
+ ch_changename();
+ break;
+ case 'K':
+ case 'k':
+ ch_kill();
+ return 0;
+ case 'S':
+ case 's':
+ if(!ch_sell()) break;
+ case 'Q':
+ case 'q':
+ return 0;
+ }
+ } while(ch < ' ' || ch>'z');
+ return 1;
+}
+
+static int recover_chicken(chicken_t *thechicken) {
+ char buf[200];
+ int price = egg_price[(int)thechicken->type],
+ money = price + (rand() % price);
+
+ if(time(NULL) - thechicken->lastvisit > (60 * 60 * 24 * 7))
+ return 0;
+ outmsg("\033[33;44m���F�ɦu��\033[37;45m �O�`�� �ڬO�����A�� \033[m");
+ bell();
+ igetch();
+ outmsg("\033[33;44m���F�ɦu��\033[37;45m �A�L�k���ڤ��y �]���ڬO�t�F, "
+ "�̪�ʿ��Q�ȥ~�� \033[m");
+ bell();
+ igetch();
+ sprintf(buf, "\033[33;44m���F�ɦu��\033[37;45m "
+ "�A���@�ӭ訫���[��%s�n�۴��^�Ӷ�? �u�n%d���� \033[m",
+ chicken_type[(int)thechicken->type], price*2);
+ outmsg(buf);
+ bell();
+ getdata_str(21, 0, " ��ܡG(N:�|�H��/y:��������)", buf, 3, LCECHO, "N");
+ if(buf[0] == 'y' || buf[0] == 'Y') {
+ reload_money();
+ if(cuser.money < price*2) {
+ outmsg("\033[33;44m���F�ɦu��\033[37;45m ���� ���S�a�� "
+ "�S�����p�� �֥h�w���a \033[m");
+ bell();
+ igetch();
+ return 0;
+ }
+ strcpy(thechicken->name, "[�ߦ^�Ӫ�]");
+ thechicken->hp = thechicken->hp_max;
+ thechicken->sick = 0;
+ thechicken->satis = 2;
+ vice(money,"�F�ɦu��");
+ sprintf(buf, "\033[33;44m���F�ɦu��\033[37;45m OK�F �O�o���L�I�F�� "
+ "���M�i�ॢ�� ���b�ڤ]����Ptt ���A%d�N�n \033[m", money);
+ outmsg(buf);
+ bell();
+ igetch();
+ return 1;
+ }
+ outmsg("\033[33;44m���F�ɦu��\033[37;45m ���M���ڧ|�H! �o�~�Y�R�u���ȿ� "
+ "���D�ڦA�ӧ�A �A�A�]�S���|�F \033[m");
+ bell();
+ igetch();
+ thechicken->lastvisit = 0;
+ passwd_update(usernum, &cuser);
+ return 0;
+}
+
+#define lockreturn0(unmode, state) if(lockutmpmode(unmode, state)) return 0
+
+int chicken_main() {
+ lockreturn0(CHICKEN, LOCK_MULTI);
+
+ reload_chicken();
+ age = ((time(NULL) - mychicken->cbirth)/ (60*60*24));
+ if(!mychicken->name[0] && !recover_chicken(mychicken) && !new_chicken()) {
+ unlockutmpmode();
+ return 0;
+ }
+
+ do {
+ time_diff(mychicken);
+ if(isdeadth(mychicken))
+ break;
+ show_chicken_data(mychicken, NULL);
+ } while(select_menu());
+ reload_money();
+ passwd_update(usernum, &cuser);
+ unlockutmpmode();
+ return 0;
+}
+
+extern userinfo_t *currutmp;
+extern struct utmpfile_t *utmpshm;
+
+int chickenpk(int fd) {
+ char mateid[IDLEN + 1], data[200], buf[200];
+ int ch = 0;
+
+ userinfo_t *uin = &utmpshm->uinfo[currutmp->destuip];
+ userec_t ouser;
+ chicken_t *ochicken = &ouser.mychicken;
+ int r, attmax, i, datac, duid = currutmp->destuid, catched=0, count=0;
+
+ lockreturn0(CHICKEN, LOCK_MULTI);
+
+ strcpy(mateid, currutmp->mateid); /*���⪺id��local buffer�O��*/
+
+ getuser(mateid) ;
+ memcpy(&ouser, &xuser, sizeof(userec_t));
+ reload_chicken();
+ if(!ochicken->name[0] || !mychicken->name[0]) {
+ outmsg("���@��S���d��"); /* Ptt:����page�ɧ��d���汼 */
+ bell();
+ refresh();
+ add_io(0, 0);
+ close(fd);
+ unlockutmpmode();
+ sleep(1);
+ return 0;
+ }
+
+ show_chicken_data(ochicken, mychicken);
+ add_io(fd, 3); /* ��fd�[��igetch�ʵ� */
+ while(1) {
+ r = rand();
+ ch = igetkey();
+ getuser(mateid) ;
+ memcpy(&ouser, &xuser, sizeof(userec_t));
+ reload_chicken();
+ show_chicken_data(ochicken, mychicken);
+ time_diff(mychicken);
+
+ i = mychicken->attack* mychicken->hp / mychicken->hp_max;
+ for(attmax=2; (i = i*9/10); attmax++);
+
+ if(ch == I_OTHERDATA) {
+ count =0;
+ datac = recv(fd, data, sizeof(data), 0);
+ if(datac <= 1)
+ break;
+ move(17,0);
+ outs(data+1);
+ switch(data[0]) {
+ case 'c':
+ catched=1;
+ move(16,0);
+ outs("�n��L����?(y/N)");
+ break;
+ case 'd':
+ move(16,0);
+ outs("��~�ˤU�F!!");
+ break;
+ }
+ if(data[0] == 'd' || data[0]=='q' || data[0]=='l')
+ break;
+ continue;
+ } else if(currutmp->turn) {
+ count = 0;
+ currutmp->turn = 0;
+ uin->turn = 1;
+ mychicken->tiredstrong ++;
+ switch(ch) {
+ case 'y':
+ if(catched == 1) {
+ sprintf(data, "l�� %s ���]�F\n",
+ ochicken->name);
+ }
+ break;
+ case 'n':
+ catched =0;
+ default:
+ case 'k':
+ r = r % (attmax + 2);
+ if(r) {
+ sprintf(data, "M%s %s%s %s �ˤF %d �I\n", mychicken->name,
+ damage_degree[r/3>15 ? 15:r/3],
+ attack_type[(int)mychicken->type],
+ ochicken->name, r);
+ ochicken->hp-=r;
+ } else
+ sprintf(data, "M%s ı�o��n�X���L��\n", mychicken->name);
+ break;
+ case 'o':
+ if(mychicken->oo > 0) {
+ mychicken->oo--;
+ mychicken->hp += 300;
+ if(mychicken->hp > mychicken->hp_max)
+ mychicken->hp = mychicken->hp_max;
+ mychicken->tiredstrong = 0;
+ sprintf(data, "M%s �Y�F���j�ɤY�ɥR��O\n",
+ mychicken->name);
+ } else
+ sprintf(data, "M%s �Q�Y�j�ɤY, �i�O�S���j�ɤY�i�Y\n",
+ mychicken->name);
+ break;
+ case 'q':
+ if(r % (mychicken->run+1) > r % (ochicken->run+1))
+ sprintf(data, "q%s ���]�F\n",
+ mychicken->name);
+ else
+ sprintf(data, "c%s �Q���], ���Q %s ���F\n",
+ mychicken->name, ochicken->name);
+ break;
+ }
+ if(deadtype(ochicken)) {
+ strtok(data,"\n");
+ strcpy(buf, data);
+ sprintf(data, "d%s , %s �Q %s �����F\n",
+ buf + 1, ochicken->name, mychicken->name);
+ }
+ move(17,0);
+ outs(data+1);
+ i = strlen(data) +1;
+ passwd_update(duid, &ouser);
+ passwd_update(usernum, &cuser);
+ send(fd, data, i, 0);
+ if(data[0]=='q' || data[0]=='d')
+ break;
+ } else {
+ move(17, 0);
+ if(count++ > 30)
+ break;
+ }
+ }
+ add_io(0, 0); /* ��igetch���@�^ */
+ pressanykey();
+ close(fd);
+ if(!showdeadth(deadtype(mychicken)));
+ unlockutmpmode();
+ return 0;
+}