* svp.plname is filled either by an option (-u Player or -uPlayer) or * explicitly (by being the wizard) or by askname. * It may still contain a suffix denoting the role, etc. * Always called after init_nhwindows() and before * init_sound_disp_gamewindows(). */
| 648 | * init_sound_disp_gamewindows(). |
| 649 | */ |
| 650 | void |
| 651 | tty_askname(void) |
| 652 | { |
| 653 | static const char who_are_you[] = "Who are you? "; |
| 654 | int c, ct, tryct = 0; |
| 655 | |
| 656 | #ifdef SELECTSAVED |
| 657 | if (iflags.wc2_selectsaved && !iflags.renameinprogress) |
| 658 | switch (restore_menu(BASE_WINDOW)) { |
| 659 | case -1: |
| 660 | bail("Until next time then..."); /* quit */ |
| 661 | /*NOTREACHED*/ |
| 662 | break; |
| 663 | case 0: |
| 664 | break; /* no game chosen; start new game */ |
| 665 | case 1: |
| 666 | return; /* svp.plname[] has been set */ |
| 667 | } |
| 668 | #endif /* SELECTSAVED */ |
| 669 | |
| 670 | tty_putstr(BASE_WINDOW, 0, ""); |
| 671 | do { |
| 672 | if (++tryct > 1) { |
| 673 | if (tryct > 10) |
| 674 | bail("Giving up after 10 tries.\n"); |
| 675 | tty_curs(BASE_WINDOW, 1, wins[BASE_WINDOW]->cury - 1); |
| 676 | tty_putstr(BASE_WINDOW, 0, "Enter a name for your character..."); |
| 677 | /* erase previous prompt (in case of ESC after partial response) */ |
| 678 | tty_curs(BASE_WINDOW, 1, wins[BASE_WINDOW]->cury), cl_end(); |
| 679 | } |
| 680 | tty_putstr(BASE_WINDOW, 0, who_are_you); |
| 681 | tty_curs(BASE_WINDOW, (int) (sizeof who_are_you), |
| 682 | wins[BASE_WINDOW]->cury - 1); |
| 683 | ct = 0; |
| 684 | while ((c = tty_nhgetch()) != '\n') { |
| 685 | if (c == EOF) |
| 686 | c = '\033'; |
| 687 | if (c == '\r') |
| 688 | break; |
| 689 | if (c == '\033') { |
| 690 | ct = 0; |
| 691 | break; |
| 692 | } /* continue outer loop */ |
| 693 | #if defined(WIN32CON) |
| 694 | if (c == '\003') |
| 695 | bail("^C abort.\n"); |
| 696 | #endif |
| 697 | /* some people get confused when their erase char is not ^H */ |
| 698 | if (c == '\b' || c == '\177') { |
| 699 | if (ct) { |
| 700 | ct--; |
| 701 | #ifdef WIN32CON |
| 702 | ttyDisplay->curx--; |
| 703 | #endif |
| 704 | #if defined(MICRO) || defined(WIN32CON) |
| 705 | #if defined(WIN32CON) || defined(MSDOS) |
| 706 | backsp(); /* \b is visible on NT */ |
| 707 | (void) putchar(' '); |
nothing calls this directly
no test coverage detected