… | |
… | |
511 | /* |
511 | /* |
512 | * Actual commands. |
512 | * Actual commands. |
513 | * Those should be in small separate files (c_object.c, c_wiz.c, cmove.c,...) |
513 | * Those should be in small separate files (c_object.c, c_wiz.c, cmove.c,...) |
514 | */ |
514 | */ |
515 | |
515 | |
516 | |
|
|
517 | static void |
|
|
518 | help_topics (object *op, int what) |
|
|
519 | { |
|
|
520 | DIR *dirp; |
|
|
521 | struct dirent *de; |
|
|
522 | char filename[MAX_BUF], line[80]; |
|
|
523 | int namelen, linelen = 0; |
|
|
524 | |
|
|
525 | switch (what) |
|
|
526 | { |
|
|
527 | case 1: |
|
|
528 | sprintf (filename, "%s/wizhelp", settings.datadir); |
|
|
529 | new_draw_info (NDI_UNIQUE, 0, op, " Wiz commands:"); |
|
|
530 | break; |
|
|
531 | case 3: |
|
|
532 | sprintf (filename, "%s/mischelp", settings.datadir); |
|
|
533 | new_draw_info (NDI_UNIQUE, 0, op, " Misc help:"); |
|
|
534 | break; |
|
|
535 | default: |
|
|
536 | sprintf (filename, "%s/help", settings.datadir); |
|
|
537 | new_draw_info (NDI_UNIQUE, 0, op, " Commands:"); |
|
|
538 | break; |
|
|
539 | } |
|
|
540 | |
|
|
541 | if (!(dirp = opendir (filename))) |
|
|
542 | return; |
|
|
543 | |
|
|
544 | line[0] = '\0'; |
|
|
545 | while ((de = readdir (dirp))) |
|
|
546 | { |
|
|
547 | namelen = strlen (de->d_name); |
|
|
548 | if (namelen <= 2 && *de->d_name == '.' && (namelen == 1 || de->d_name[1] == '.')) |
|
|
549 | continue; |
|
|
550 | linelen += namelen + 1; |
|
|
551 | if (linelen > 42) |
|
|
552 | { |
|
|
553 | new_draw_info (NDI_UNIQUE, 0, op, line); |
|
|
554 | sprintf (line, " %s", de->d_name); |
|
|
555 | linelen = namelen + 1; |
|
|
556 | continue; |
|
|
557 | } |
|
|
558 | strcat (line, " "); |
|
|
559 | strcat (line, de->d_name); |
|
|
560 | } |
|
|
561 | new_draw_info (NDI_UNIQUE, 0, op, line); |
|
|
562 | closedir (dirp); |
|
|
563 | } |
|
|
564 | |
|
|
565 | static void |
|
|
566 | show_commands (object *op, int what) |
|
|
567 | { |
|
|
568 | char line[80]; |
|
|
569 | int i, size, namelen, linelen = 0; |
|
|
570 | CommArray_s *ap; |
|
|
571 | extern CommArray_s Commands[], WizCommands[]; |
|
|
572 | extern const int CommandsSize, WizCommandsSize; |
|
|
573 | |
|
|
574 | switch (what) |
|
|
575 | { |
|
|
576 | case 1: |
|
|
577 | ap = WizCommands; |
|
|
578 | size = WizCommandsSize; |
|
|
579 | new_draw_info (NDI_UNIQUE, 0, op, " Wiz commands:"); |
|
|
580 | break; |
|
|
581 | case 2: |
|
|
582 | ap = CommunicationCommands; |
|
|
583 | size = CommunicationCommandSize; |
|
|
584 | new_draw_info (NDI_UNIQUE, 0, op, " Communication commands:"); |
|
|
585 | break; |
|
|
586 | default: |
|
|
587 | ap = Commands; |
|
|
588 | size = CommandsSize; |
|
|
589 | new_draw_info (NDI_UNIQUE, 0, op, " Commands:"); |
|
|
590 | break; |
|
|
591 | } |
|
|
592 | |
|
|
593 | line[0] = '\0'; |
|
|
594 | for (i = 0; i < size; i++) |
|
|
595 | { |
|
|
596 | namelen = strlen (ap[i].name); |
|
|
597 | linelen += namelen + 1; |
|
|
598 | if (linelen > 42) |
|
|
599 | { |
|
|
600 | new_draw_info (NDI_UNIQUE, 0, op, line); |
|
|
601 | sprintf (line, " %s", ap[i].name); |
|
|
602 | linelen = namelen + 1; |
|
|
603 | continue; |
|
|
604 | } |
|
|
605 | strcat (line, " "); |
|
|
606 | strcat (line, ap[i].name); |
|
|
607 | } |
|
|
608 | new_draw_info (NDI_UNIQUE, 0, op, line); |
|
|
609 | } |
|
|
610 | |
|
|
611 | |
|
|
612 | int |
|
|
613 | command_help (object *op, char *params) |
|
|
614 | { |
|
|
615 | struct stat st; |
|
|
616 | FILE *fp; |
|
|
617 | char filename[MAX_BUF], line[MAX_BUF]; |
|
|
618 | int len; |
|
|
619 | |
|
|
620 | if (op != NULL) |
|
|
621 | clear_win_info (op); |
|
|
622 | |
|
|
623 | /* |
|
|
624 | * Main help page? |
|
|
625 | */ |
|
|
626 | if (!params) |
|
|
627 | { |
|
|
628 | sprintf (filename, "%s/def_help", settings.datadir); |
|
|
629 | if ((fp = fopen (filename, "r")) == NULL) |
|
|
630 | { |
|
|
631 | LOG (llevError, "Cannot open help file %s: %s\n", filename, strerror (errno)); |
|
|
632 | return 0; |
|
|
633 | } |
|
|
634 | while (fgets (line, MAX_BUF, fp)) |
|
|
635 | { |
|
|
636 | line[MAX_BUF - 1] = '\0'; |
|
|
637 | len = strlen (line) - 1; |
|
|
638 | if (line[len] == '\n') |
|
|
639 | line[len] = '\0'; |
|
|
640 | new_draw_info (NDI_UNIQUE, 0, op, line); |
|
|
641 | } |
|
|
642 | fclose (fp); |
|
|
643 | return 0; |
|
|
644 | } |
|
|
645 | |
|
|
646 | /* |
|
|
647 | * Topics list |
|
|
648 | */ |
|
|
649 | if (!strcmp (params, "topics")) |
|
|
650 | { |
|
|
651 | help_topics (op, 3); |
|
|
652 | help_topics (op, 0); |
|
|
653 | if (QUERY_FLAG (op, FLAG_WIZ)) |
|
|
654 | help_topics (op, 1); |
|
|
655 | return 0; |
|
|
656 | } |
|
|
657 | |
|
|
658 | /* |
|
|
659 | * Commands list |
|
|
660 | */ |
|
|
661 | if (!strcmp (params, "commands")) |
|
|
662 | { |
|
|
663 | show_commands (op, 0); |
|
|
664 | show_commands (op, 2); /* show comm commands */ |
|
|
665 | if (QUERY_FLAG (op, FLAG_WIZ)) |
|
|
666 | show_commands (op, 1); |
|
|
667 | return 0; |
|
|
668 | } |
|
|
669 | |
|
|
670 | /* |
|
|
671 | * User wants info about command |
|
|
672 | */ |
|
|
673 | if (strchr (params, '.') || strchr (params, ' ') || strchr (params, '/')) |
|
|
674 | { |
|
|
675 | sprintf (line, "Illegal characters in '%s'", params); |
|
|
676 | new_draw_info (NDI_UNIQUE, 0, op, line); |
|
|
677 | return 0; |
|
|
678 | } |
|
|
679 | |
|
|
680 | sprintf (filename, "%s/mischelp/%s", settings.datadir, params); |
|
|
681 | if (stat (filename, &st) || !S_ISREG (st.st_mode)) |
|
|
682 | { |
|
|
683 | if (op) |
|
|
684 | { |
|
|
685 | sprintf (filename, "%s/help/%s", settings.datadir, params); |
|
|
686 | if (stat (filename, &st) || !S_ISREG (st.st_mode)) |
|
|
687 | { |
|
|
688 | if (QUERY_FLAG (op, FLAG_WIZ)) |
|
|
689 | { |
|
|
690 | sprintf (filename, "%s/wizhelp/%s", settings.datadir, params); |
|
|
691 | if (stat (filename, &st) || !S_ISREG (st.st_mode)) |
|
|
692 | goto nohelp; |
|
|
693 | } |
|
|
694 | else |
|
|
695 | goto nohelp; |
|
|
696 | } |
|
|
697 | } |
|
|
698 | } |
|
|
699 | |
|
|
700 | /* |
|
|
701 | * Found that. Just cat it to screen. |
|
|
702 | */ |
|
|
703 | if ((fp = fopen (filename, "r")) == NULL) |
|
|
704 | { |
|
|
705 | LOG (llevError, "Cannot open help file %s: %s\n", filename, strerror (errno)); |
|
|
706 | return 0; |
|
|
707 | } |
|
|
708 | sprintf (line, "Help about '%s'", params); |
|
|
709 | new_draw_info (NDI_UNIQUE, 0, op, line); |
|
|
710 | while (fgets (line, MAX_BUF, fp)) |
|
|
711 | { |
|
|
712 | line[MAX_BUF - 1] = '\0'; |
|
|
713 | len = strlen (line) - 1; |
|
|
714 | if (line[len] == '\n') |
|
|
715 | line[len] = '\0'; |
|
|
716 | new_draw_info (NDI_UNIQUE, 0, op, line); |
|
|
717 | } |
|
|
718 | fclose (fp); |
|
|
719 | return 0; |
|
|
720 | |
|
|
721 | /* |
|
|
722 | * No_help -escape |
|
|
723 | */ |
|
|
724 | nohelp: |
|
|
725 | sprintf (line, "No help available on '%s'", params); |
|
|
726 | new_draw_info (NDI_UNIQUE, 0, op, line); |
|
|
727 | return 0; |
|
|
728 | } |
|
|
729 | |
|
|
730 | |
|
|
731 | int |
516 | int |
732 | onoff_value (const char *line) |
517 | onoff_value (const char *line) |
733 | { |
518 | { |
734 | int i; |
519 | int i; |
735 | |
520 | |
… | |
… | |
822 | for (obl = first_friendly_object; obl != NULL; obl = next) |
607 | for (obl = first_friendly_object; obl != NULL; obl = next) |
823 | { |
608 | { |
824 | object *ob = obl->ob; |
609 | object *ob = obl->ob; |
825 | |
610 | |
826 | next = obl->next; |
611 | next = obl->next; |
|
|
612 | |
827 | if (ob->owner == op) |
613 | if (ob->owner == op) |
828 | if (++counter == target || (target == 0 && !strcasecmp (ob->name, params))) |
614 | if (++counter == target || (target == 0 && !strcasecmp (ob->name, params))) |
829 | { |
615 | { |
830 | ob->destroy (); |
616 | ob->destroy (); |
831 | removecount++; |
617 | removecount++; |
832 | } |
618 | } |
833 | } |
619 | } |
|
|
620 | |
834 | if (removecount != 0) |
621 | if (removecount != 0) |
835 | new_draw_info_format (NDI_UNIQUE, 0, op, "killed %d pets.\n", removecount); |
622 | new_draw_info_format (NDI_UNIQUE, 0, op, "killed %d pets.\n", removecount); |
836 | else |
623 | else |
837 | new_draw_info (NDI_UNIQUE, 0, op, "Couldn't find any suitable pets to kill.\n"); |
624 | new_draw_info (NDI_UNIQUE, 0, op, "Couldn't find any suitable pets to kill.\n"); |
838 | } |
625 | } |
|
|
626 | |
839 | return 0; |
627 | return 0; |
840 | } |
628 | } |