/[LeafOK_CVS]/lbbs/utils/game/chicken.c
ViewVC logotype

Contents of /lbbs/utils/game/chicken.c

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.40 - (show annotations)
Sun Jan 18 09:14:57 2026 UTC (8 weeks, 2 days ago) by sysadm
Branch: MAIN
CVS Tags: HEAD
Changes since 1.39: +2 -2 lines
Content type: text/x-csrc
Error occurred while calculating annotation data.
Fix bug in pressany()

1 /* 电子鸡 小码力..几a几b游戏.□ */
2
3 /* Writed by Birdman From 140.116.102.125 创意哇哈哈*/
4
5 #ifdef HAVE_CONFIG_H
6 #include "config.h"
7 #endif
8
9 #include "bbs.h"
10 #include "bwf.h"
11 #include "chicken.h"
12 #include "common.h"
13 #include "io.h"
14 #include "log.h"
15 #include "login.h"
16 #include "money.h"
17 #include "screen.h"
18 #include <stdio.h>
19 #include <stdlib.h>
20 #include <string.h>
21 #include <time.h>
22 #include <unistd.h>
23 #include <sys/param.h>
24
25 enum _chicken_constant_t
26 {
27 CHICKEN_NAME_LEN = 40,
28 };
29
30 static const char DATA_FILE[] = "var/chicken";
31 static const char LOG_FILE[] = "var/chicken/log";
32
33 static const char *cstate[10] =
34 {"我在吃饭", "偷吃零食", "拉便便", "笨蛋..输给鸡?", "哈..赢小鸡也没多光荣", "没食物啦..", "疲劳全消!"};
35
36 char fname[FILE_PATH_LEN];
37 time_t birth;
38 int weight, satis, day, month, age, angery, sick, oo, happy, clean, tiredstrong, play;
39 int winn, losee, last, chictime, agetmp, food, zfood;
40 char chicken_name[CHICKEN_NAME_LEN + 1];
41 FILE *cfp;
42 int gold, x[9] = {0}, ran, q_mon, p_mon;
43 unsigned long int bank;
44 char buf[1], buf1[6];
45
46 static int load_chicken(void);
47 static int save_chicken(void);
48 static int create_a_egg(void);
49 static int death(void);
50 static int guess(void);
51 static int lose(void);
52 static int pressany(int i);
53 static int sell(void);
54 static int show_chicken(void);
55 static int situ(void);
56 static int select_menu(void);
57 static int tie(void);
58 static int win_c(void);
59
60 int chicken_main()
61 {
62 if (money_refresh() < 0)
63 {
64 return -1;
65 }
66
67 setuserfile(fname, sizeof(fname), DATA_FILE);
68
69 if (load_chicken() < 0)
70 {
71 return -2;
72 }
73
74 if (user_online_update("CHICKEN") < 0)
75 {
76 log_error("user_online_update(CHICKEN) error");
77 }
78
79 show_chicken();
80 select_menu();
81 save_chicken();
82
83 return 0;
84 }
85
86 static int load_chicken()
87 {
88 FILE *fp;
89 time_t now;
90 struct tm ptime;
91 int ret;
92
93 agetmp = 1;
94 // modify_user_mode(CHICK);
95 time(&now);
96 localtime_r(&now, &ptime);
97
98 if ((fp = fopen(fname, "r+")) == NULL)
99 {
100 if (create_a_egg() < 0)
101 {
102 return -1;
103 }
104 last = 1;
105 fp = fopen(fname, "r");
106 }
107 else
108 {
109 last = 0;
110 }
111 ret = fscanf(fp, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %s ",
112 &weight, &day, &month, &satis, &age, &oo, &happy, &clean, &tiredstrong, &play, &winn, &losee, &food, &zfood, chicken_name);
113 if (ret != 15)
114 {
115 log_error("Error in chicken data");
116 }
117 fclose(fp);
118
119 age = (ptime.tm_mon + 1 + 12 - month) % 12 * 31 +
120 (ptime.tm_mday - day);
121
122 return 0;
123 }
124
125 int save_chicken()
126 {
127 FILE *fp;
128
129 fp = fopen(fname, "r+");
130 fprintf(fp, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %s ",
131 weight, day, month, satis, age, oo, happy, clean, tiredstrong, play, winn, losee, food, zfood, chicken_name);
132 fclose(fp);
133
134 return 0;
135 }
136
137 static int create_a_egg()
138 {
139 FILE *fp;
140 struct tm ptime;
141 time_t now;
142 time(&now);
143 localtime_r(&now, &ptime);
144 char name_tmp[CHICKEN_NAME_LEN + 1];
145 int ret;
146
147 snprintf(name_tmp, sizeof(name_tmp), "宝宝");
148
149 clrtobot(2);
150
151 for (chicken_name[0] = '\0'; !SYS_server_exit && chicken_name[0] == '\0';)
152 {
153 if (get_data(2, 1, "帮小鸡取个好名字: ", name_tmp, sizeof(name_tmp), CHICKEN_NAME_LEN / 2) > 0)
154 {
155 if ((ret = check_badwords(name_tmp, '*')) < 0)
156 {
157 log_error("check_badwords(name) error");
158 }
159 else if (ret > 0)
160 {
161 continue;
162 }
163 strncpy(chicken_name, name_tmp, sizeof(chicken_name) - 1);
164 chicken_name[sizeof(chicken_name) - 1] = '\0';
165 }
166 }
167
168 if ((fp = fopen(fname, "w")) == NULL)
169 {
170 log_error("Error!!cannot open file '%s'!", fname);
171 return -2;
172 }
173 fprintf(fp, "%d %d %d %d %d %d %d %d %d %d %d %d %d %d %s ",
174 ptime.tm_hour * 2, ptime.tm_mday, ptime.tm_mon + 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 5, chicken_name);
175 fclose(fp);
176
177 if ((fp = fopen(LOG_FILE, "a")) == NULL)
178 {
179 log_error("Error!!cannot open file '%s'!", LOG_FILE);
180 return -2;
181 }
182 fprintf(fp, "%s 在 [%d/%d %d:%02d] 养了一只叫 %s 的小鸡\r\n",
183 BBS_username, ptime.tm_mon + 1, ptime.tm_mday,
184 ptime.tm_hour, ptime.tm_min, chicken_name);
185 fclose(fp);
186
187 return 0;
188 }
189
190 static int show_chicken()
191 {
192 if (chictime >= 200)
193 {
194 weight -= 5;
195 clean += 3;
196 if (tiredstrong > 2)
197 {
198 tiredstrong -= 2;
199 }
200 }
201 if (weight < 0)
202 {
203 death();
204 }
205
206 clrtobot(1);
207 prints(
208 "Name:%s"
209 " Age :%d岁"
210 " 重量:%d"
211 " 食物:%d"
212 " 零食:%d"
213 " 疲劳:%d"
214 " 便便:%d\r\n"
215 " 生日:%d月%d日"
216 " 糖糖:%8d"
217 " 快乐度:%d"
218 " 满意度:%d",
219 // " 大补丸:%d\r\n",
220 chicken_name, age, weight, food, zfood, tiredstrong, clean, month, day, money_balance(), happy, satis); //,oo);
221
222 moveto(3, 0);
223 if (age <= 16)
224 {
225 switch (age)
226 {
227 case 0:
228 case 1:
229 prints(" ●●●●\r\n"
230 "● ●● ●\r\n"
231 "●●●●●●\r\n"
232 "●● ●●\r\n"
233 "●●●●●●\r\n"
234 " ●●●● ");
235
236 break;
237 case 2:
238 case 3:
239 prints(" ●●●●●●\r\n"
240 " ● ●\r\n"
241 "● ● ● ●\r\n"
242 "● ●\r\n"
243 "● ●● ●\r\n"
244 "● ●\r\n"
245 "● ●\r\n"
246 " ● ●\r\n"
247 " ●●●●●● ");
248
249 break;
250 case 4:
251 case 5:
252
253 prints(" ●●●●●●\r\n"
254 " ● ●\r\n"
255 " ● ● ● ●\r\n"
256 " ● ●\r\n"
257 " ● ●● ●\r\n"
258 "●●● ●● ●●\r\n"
259 " ● ●\r\n"
260 " ● ●\r\n"
261 " ● ●●●● ●\r\n"
262 " ● ● ●\r\n"
263 " ● ");
264 break;
265 case 6:
266 case 7:
267 prints(" ● ●●●●●●\r\n"
268 "● ●● ● ●\r\n"
269 "● ● ●\r\n"
270 " ●●● ●\r\n"
271 "● ●\r\n"
272 "● ●● ●\r\n"
273 " ● ● ●\r\n"
274 " ● ●\r\n"
275 " ● ●\r\n"
276 " ●●●●●● ");
277 break;
278
279 case 8:
280 case 9:
281 case 10:
282 prints(" ●● ●●\r\n"
283 " ●●●● ●●●●\r\n"
284 " ●●●●●●●●●●●\r\n"
285 " ● ●\r\n"
286 " ● ● ● ●\r\n"
287 "● ●\r\n"
288 "● ●●● ●\r\n"
289 " ● ●\r\n"
290 "● ● ● ●\r\n"
291 " ●● ●●●\r\n"
292 " ● ●\r\n"
293 " ● ●\r\n"
294 " ● ●●● ●\r\n"
295 " ● ● ●\r\n"
296 " ● ");
297
298 break;
299
300 case 11:
301 case 12:
302 prints(" ●●●●●●\r\n"
303 " ● ● ●●\r\n"
304 " ● ● ● ●●\r\n"
305 " ●● ●●●\r\n"
306 "● ● ●●\r\n"
307 "●●●●●●●● ●●\r\n"
308 " ● ●●\r\n"
309 " ● ● ● ●\r\n"
310 " ● ● ● ●\r\n"
311 " ● ● ●\r\n"
312 " ● ●\r\n"
313 " ● ●●● ●\r\n"
314 " ● ● ● ●\r\n"
315 " ● ● ");
316
317 break;
318 case 13:
319 case 14:
320 prints(" ●●●●\r\n"
321 " ●●●●●●●●\r\n"
322 " ●●●●●●●●●●\r\n"
323 " ●●●●●●●●●●●●\r\n"
324 " ● ●●●●●●●●●\r\n"
325 "●● ● ●●\r\n"
326 "●●●● ●\r\n"
327 " ● ●\r\n"
328 " ●● ●●\r\n"
329 " ● ●●●●●● ●\r\n"
330 " ● ●\r\n"
331 " ● ●\r\n"
332 " ● ●\r\n"
333 " ●●● ●●● ");
334 break;
335 case 15:
336 case 16:
337 prints(" ● ●●●●●●\r\n"
338 "● ●● ● ●\r\n"
339 "● ● ●\r\n"
340 " ●●● ●\r\n"
341 "● ●\r\n"
342 "● ●● ●\r\n"
343 " ● ● ●\r\n"
344 " ● ● ● ●\r\n"
345 " ● ● ●\r\n"
346 " ● ●\r\n"
347 " ● ●\r\n"
348 " ● ●● ●●●\r\n"
349 " ● ●● ●\r\n"
350 " ● ● ");
351
352 break;
353 }
354 }
355 else
356 {
357 prints(" ●●●●●●●\r\n"
358 " ● ●●●\r\n"
359 " ● ● ● ●●●\r\n"
360 " ●●●●●●● ●●\r\n"
361 " ● ● ●\r\n"
362 " ●●●●●●● ● 我是大怪鸟\r\n"
363 " ● ● ●\r\n"
364 " ●●●●●● ●\r\n"
365 " ● ●\r\n"
366 " ● ●\r\n"
367 " ● ●\r\n"
368 "●● ● ●\r\n"
369 "● ●●●●●● ●●\r\n"
370 " ● ●\r\n"
371 "●●● 我是大怪鸟 ●●● ");
372 }
373 if (clean > 10)
374 {
375 moveto(10, 30);
376 prints("便便好多..臭臭...");
377 if (clean > 15)
378 death();
379 press_any_key();
380 }
381
382 moveto(17, 0);
383 prints("[1]-吃饭 [2]-吃零食 [3]-清理鸡舍 [4]-跟小鸡猜拳 [5]-目前战绩");
384 prints("\r\n[6]-买鸡饲料$20 [7]-买零食$30 [8]-吃大补丸 [9]-卖鸡喔 ");
385 return 0;
386 }
387
388 static int select_menu()
389 {
390 int loop = 1;
391 char inbuf[2];
392 struct tm ptime;
393 time_t now;
394 time(&now);
395 localtime_r(&now, &ptime);
396 char name_tmp[CHICKEN_NAME_LEN + 1];
397 int ret;
398
399 while (!SYS_server_exit && loop)
400 {
401 moveto(23, 0);
402 prints(" 使用帮助  c 改名字 k 杀鸡 t 消除非疲劳($50) q 退出 ");
403 inbuf[0] = '\0';
404 if (get_data(22, 1, "要做些什么呢?: ", inbuf, sizeof(inbuf), 1) < 0)
405 {
406 return 0; // input timeout
407 }
408
409 BBS_last_access_tm = time(NULL);
410
411 // Refresh current action
412 if (user_online_update(NULL) < 0)
413 {
414 log_error("user_online_update(NULL) error");
415 }
416
417 if (tiredstrong > 20)
418 {
419 clearscr();
420 moveto(15, 30);
421 prints("呜~~~小鸡会累坏的...要先去休息一下..");
422 prints("\r\n\r\n休 养 中");
423 }
424 switch (inbuf[0])
425 {
426 case '1':
427 if (food <= 0)
428 {
429 pressany(5);
430 break;
431 }
432 clrtobot(10);
433 moveto(10, 0);
434 prints(" □□□□□□\r\n"
435 " ∵∴ □ □\r\n"
436 " □ □ □□□□ □ \r\n"
437 " □ □ □ □ □□□□□□□ \r\n"
438 " Coke □ _□□□□□□□□□_ □□□□□□□□ \r\n"
439 " □ □ %%%%%%%%% □—∩∩—□ \r\n"
440 " □ □ □□□□□□□□□ │Mcdonald│      \r\n"
441 " □ □ ※※※※※※※※※  □————□ \r\n"
442 " □□□□□□ □□□□□□□□□ □□□□□□□□ ");
443
444 pressany(0);
445 iflush();
446 food--;
447 tiredstrong++;
448 satis++;
449 if (age < 5)
450 {
451 weight = weight + (5 - age);
452 }
453 else
454 {
455 weight++;
456 }
457 if (weight > 100)
458 {
459 moveto(9, 30);
460 prints("太重了啦..肥鸡~~你想撑死鸡啊?....哇咧○●××");
461 press_any_key();
462 }
463 if (weight > 150)
464 {
465 moveto(9, 30);
466 prints("鸡撑晕了~~");
467 press_any_key();
468 }
469 if (weight > 200)
470 {
471 death();
472 }
473 break;
474 case '2':
475 if (zfood <= 0)
476 {
477 pressany(5);
478 break;
479 }
480 clrtobot(10);
481 moveto(10, 0);
482 prints(" □\r\n"
483 " □□○\r\n"
484 " ■■\r\n"
485 " □□\r\n"
486 " □□\r\n"
487 "  □ \r\n"
488 "  □□ 水果酒冰淇淋苏打 嗯!好喝! ");
489 pressany(1);
490 zfood--;
491 tiredstrong++;
492 happy++;
493 weight += 2;
494 if (weight > 100)
495 {
496 moveto(9, 30);
497 prints("太重了啦..肥鸡~~");
498 press_any_key();
499 }
500 if (weight > 200)
501 {
502 death();
503 }
504 break;
505 case '3':
506 clrtobot(10);
507 moveto(10, 0);
508 prints(" □□□□□\r\n"
509 " 『□□□□\r\n"
510 " □□□□\r\n"
511 " □□□□□□□□◎□□□□\r\n"
512 " □□□□□□□□□□□□□\r\n"
513 " □□□□□□□□□ □\r\n"
514 " □□□□□□□□\r\n"
515 " □□□□□□\r\n"
516 "  □□□□□□\r\n"
517 " 耶耶耶...便便拉光光... ");
518
519 pressany(2);
520 tiredstrong += 5;
521 clean = 0;
522 break;
523 case '4':
524 guess();
525 satis += (ptime.tm_sec % 2);
526 tiredstrong++;
527 break;
528 case '5':
529 situ();
530 break;
531 case '6':
532 clrtobot(20);
533 moveto(20, 0);
534 if (money_withdraw(20) <= 0)
535 {
536 prints("糖果不足!!");
537 press_any_key();
538 break;
539 }
540 food += 5;
541 prints("\r\n食物有  %d 份", food);
542 prints(" 剩下  %d 糖", money_balance());
543 press_any_key();
544 break;
545 case '7':
546 clrtobot(20);
547 moveto(20, 0);
548 if (money_withdraw(30) <= 0)
549 {
550 prints("糖果不足!!");
551 press_any_key();
552 break;
553 }
554 zfood += 5;
555 prints("\r\n零食有  %d 份", zfood);
556 prints(" 剩下  %d 糖", money_balance());
557 press_any_key();
558 break;
559 case '8':
560 if (oo > 0)
561 {
562 clrtobot(10);
563 moveto(10, 0);
564 prints("\r\n"
565 " □□□□\r\n"
566 " □□□□\r\n"
567 " □□□□\r\n"
568 " 偷吃禁药大补丸.....");
569 tiredstrong = 0;
570 happy += 3;
571 oo--;
572 pressany(6);
573 break;
574 }
575 clrtobot(20);
576 moveto(20, 4);
577 prints("没大补丸啦!!");
578 press_any_key();
579 break;
580 case '9':
581 if (age < 5)
582 {
583 clrtobot(20);
584 moveto(20, 4);
585 prints("太小了...不得贩售未成年小鸡.....");
586 press_any_key();
587 break;
588 }
589 sell();
590 break;
591 case 'k':
592 death();
593 break;
594 case 't':
595 if (money_withdraw(50) <= 0)
596 {
597 clrtobot(20);
598 moveto(20, 4);
599 prints("糖果不足!!");
600 press_any_key();
601 break;
602 }
603 else
604 {
605 tiredstrong = 0;
606 }
607 break;
608 case 'c':
609 strncpy(name_tmp, chicken_name, sizeof(name_tmp) - 1);
610 name_tmp[sizeof(name_tmp) - 1] = '\0';
611
612 clrline(22, 22);
613
614 if (get_data(22, 1, "帮小鸡取个好名字: ", name_tmp, sizeof(name_tmp), CHICKEN_NAME_LEN / 2) > 0)
615 {
616 if ((ret = check_badwords(name_tmp, '*')) < 0)
617 {
618 log_error("check_badwords(name) error");
619 }
620 else if (ret == 0)
621 {
622 strncpy(chicken_name, name_tmp, sizeof(chicken_name) - 1);
623 chicken_name[sizeof(chicken_name) - 1] = '\0';
624 }
625 }
626 break;
627 case 'q':
628 loop = 0;
629 break;
630 }
631
632 if (loop)
633 {
634 show_chicken();
635 }
636 }
637 return 0;
638 }
639
640 int death()
641 {
642 FILE *fp;
643 struct tm ptime;
644 time_t now;
645
646 time(&now);
647 localtime_r(&now, &ptime);
648 clearscr();
649 clrtobot(5);
650 if ((fp = fopen(LOG_FILE, "a")) == NULL)
651 {
652 log_error("Error!!cannot open file '%s'!", LOG_FILE);
653 return -1;
654 }
655 fprintf(fp, "%s 在 [%d/%d %d:%02d] 的小鸡 %s 挂了~~ \r\n",
656 BBS_username, ptime.tm_mon + 1, ptime.tm_mday,
657 ptime.tm_hour, ptime.tm_min, chicken_name);
658 fclose(fp);
659 prints("呜...小鸡挂了....");
660 prints("\r\n笨史了...赶出系统...");
661 press_any_key();
662
663 unlink(fname);
664 load_chicken();
665
666 return 0;
667 }
668
669 int pressany(int i)
670 {
671 int ch;
672 moveto(23, 0);
673 prints(" %s ", cstate[i]);
674 iflush();
675 ch = press_any_key_no_prompt(60);
676 moveto(23, 0);
677 clrtoeol();
678 iflush();
679 return ch;
680 }
681
682 int guess()
683 {
684 int ch, com;
685
686 moveto(23, 0);
687 prints("[1]-剪刀 [2]-石头 [3]-布: ");
688 clrtoeol();
689 iflush();
690
691 ch = press_any_key_no_prompt(60);
692 if ((ch != '1') && (ch != '2') && (ch != '3'))
693 {
694 return -1; // error input
695 }
696
697 srand((unsigned int)time(NULL));
698 com = rand() % 3;
699
700 moveto(21, 35);
701 switch (com)
702 {
703 case 0:
704 prints("小鸡:剪刀");
705 break;
706 case 1:
707 prints("小鸡:石头");
708 break;
709 case 2:
710 prints("小鸡:布");
711 break;
712 }
713 clrtoeol();
714
715 moveto(19, 0);
716
717 switch (ch)
718 {
719 case '1':
720 prints("笨鸡---看我捡来的刀---");
721 if (com == 0)
722 tie();
723 else if (com == 1)
724 lose();
725 else if (com == 2)
726 win_c();
727 break;
728 case '2':
729 prints("呆鸡---砸你一块石头!!---");
730 if (com == 0)
731 win_c();
732 else if (com == 1)
733 tie();
734 else if (com == 2)
735 lose();
736 break;
737 case '3':
738 prints("蠢鸡---送你一堆破布!---");
739 if (com == 0)
740 lose();
741 else if (com == 1)
742 win_c();
743 else if (com == 2)
744 tie();
745 break;
746 }
747 clrtoeol();
748
749 press_any_key();
750 return 0;
751 }
752
753 int win_c()
754 {
755 winn++;
756 clrtobot(20);
757 moveto(20, 0);
758 prints("判定:小鸡输了.... >_<~~~~~\r\n"
759 "\r\n"
760 " ");
761 return 0;
762 }
763 int tie()
764 {
765 clrtobot(20);
766 moveto(20, 0);
767 prints("判定:平手 -_-\r\n"
768 "\r\n"
769 " ");
770 return 0;
771 }
772 int lose()
773 {
774 losee++;
775 happy += 2;
776 clrtobot(20);
777 moveto(20, 0);
778 prints("小鸡赢罗 ∩∩\r\n"
779 " □ ");
780 return 0;
781 }
782
783 int situ()
784 {
785 clrtobot(16);
786 moveto(16, 0);
787 prints(" ");
788 moveto(17, 0);
789 prints("你: %d胜 %d负 ", winn, losee);
790 moveto(18, 0);
791 prints("鸡: %d胜 %d负 ", losee, winn);
792
793 if (winn >= losee)
794 pressany(4);
795 else
796 pressany(3);
797
798 return 0;
799 }
800
801 int sell()
802 {
803 int sel = 0;
804 char ans[2];
805 struct tm ptime;
806 FILE *fp;
807 time_t now;
808
809 time(&now);
810 localtime_r(&now, &ptime);
811
812 ans[0] = '\0';
813
814 sel += (happy * 10);
815 sel += (satis * 7);
816 sel += ((ptime.tm_sec % 9) * 10);
817 sel += weight;
818 sel += age * 10;
819
820 clrtobot(20);
821 moveto(20, 0);
822 prints("小鸡值$$ %d 糖糖", sel);
823 if (get_data(19, 1, "真的要卖掉小鸡?[y/N]", ans, sizeof(ans), 1) < 0)
824 {
825 return -1; // input timeout
826 }
827 if (ans[0] != 'y')
828 {
829 return -1;
830 }
831
832 if (money_deposit(sel) <= 0)
833 {
834 log_error("Cannot deposit money %d", sel);
835 moveto(21, 0);
836 prints("无法存钱,放弃交易!");
837 return -2;
838 }
839
840 if ((fp = fopen(LOG_FILE, "a")) == NULL)
841 {
842 log_error("Error!!cannot open file '%s'!", LOG_FILE);
843 return -2;
844 }
845 fprintf(fp, "%s 在 [%d/%d %d:%02d] 把小鸡 %s 以 %d 糖果卖了\r\n",
846 BBS_username, ptime.tm_mon + 1, ptime.tm_mday,
847 ptime.tm_hour, ptime.tm_min, chicken_name, sel);
848 fclose(fp);
849 clearscr();
850
851 unlink(fname);
852 load_chicken();
853
854 return 0;
855 }

webmaster@leafok.com
ViewVC Help
Powered by ViewVC 1.3.0-beta1