// // help.c // // Copyright 2007, 2008 Lancer-X/ASCEAI // // This file is part of Meritous. // // Meritous is free software: you can redistribute it and/or modify // it under the terms of the GNU General Public License as published by // the Free Software Foundation, either version 3 of the License, or // (at your option) any later version. // // Meritous is distributed in the hope that it will be useful, // but WITHOUT ANY WARRANTY; without even the implied warranty of // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the // GNU General Public License for more details. // // You should have received a copy of the GNU General Public License // along with Meritous. If not, see . // #include #include #include #include #include #include #include "levelblit.h" struct help_line { char *t; }; struct help_section { int lines; char *identifier; struct help_line *l[256]; }; struct help_file { int sections; struct help_section *s[256]; }; struct help_file *hlp = NULL; int my_line; int my_sec; int my_cursor; int my_link; void InitHelp() { FILE *fp; struct help_section *current_sec = NULL; struct help_line *current_line = NULL; char linebuf[80]; hlp = malloc(sizeof(struct help_file)); hlp->sections = 0; fp = fopen("dat/d/helpfile.txt", "r"); while (!feof(fp)) { fgets(linebuf, 79, fp); if (linebuf[strlen(linebuf)-1] == '\n') linebuf[strlen(linebuf)-1] = 0; if (linebuf[0] == '\'') { // comment continue; } if (linebuf[0] == ':') { // section hlp->s[hlp->sections] = malloc(sizeof(struct help_section)); current_sec = hlp->s[hlp->sections]; hlp->sections++; current_sec->identifier = malloc(strlen(linebuf)); current_sec->lines = 0; strcpy(current_sec->identifier, linebuf+1); continue; } // different line if (current_sec != NULL) { current_sec->l[current_sec->lines] = malloc(sizeof(struct help_line)); current_line = current_sec->l[current_sec->lines]; current_sec->lines++; current_line->t = malloc(strlen(linebuf)+1); strcpy(current_line->t, linebuf); } } fclose(fp); } void DisplayHelp() { static int tick = 0; int i; struct help_section *current_sec = NULL; char *ltext; char c_ident[20]; int line_num; int follow_link = 0; char linkfollow[20] = ""; DrawRect(23, 23, 594, 434, 0); DrawRect(24, 24, 592, 432, 200); DrawRect(25, 25, 590, 430, 255); DrawRect(26, 26, 588, 428, 200); DrawRect(27, 27, 586, 426, 100); DrawRect(30, 30, 580, 420, 20); DrawRect(35, 35, 570, 410, 60); // 70x40 display current_sec = hlp->s[my_sec]; my_line = my_cursor - 19; if (my_line < 0) my_line = 0; if (my_line >= (current_sec->lines)) my_line = current_sec->lines - 1; for (i = 0; i < 2; i++) { draw_text(23+i, 40+(my_cursor - my_line)*10, "->", 255); draw_text(599+i, 40+(my_cursor - my_line)*10, "<-", 255); } for (i = 0; i < 40; i++) { line_num = my_line + i; if (line_num >= 0) { if (line_num < current_sec->lines) { ltext = current_sec->l[line_num]->t; switch (ltext[0]) { case '!': draw_text(40 + (560-strlen(ltext+1)*8)/2, 40+i*10, ltext+1, 255); break; case '?': strncpy(c_ident, ltext+1, strchr(ltext+1, '?')-ltext-1); c_ident[strchr(ltext+1, '?')-ltext-1] = 0; draw_text(40, 40+i*10, strchr(ltext+1, '?')+1, my_cursor == line_num ? 200+(tick%16)*3 : 150); if ((my_link == 1)&&(my_cursor == line_num)) { follow_link = 1; strcpy(linkfollow, c_ident); } break; default: draw_text(40, 40+i*10, ltext, 200); break; } } } } tick++; SDL_UpdateRect(screen, 0, 0, 0, 0); if (follow_link) { for (i = 0; i < hlp->sections; i++) { if (strcmp(linkfollow, hlp->s[i]->identifier) == 0) { my_sec = i; my_cursor = 0; break; } } my_link = 0; } } int MoveCursor() { SDL_Event ev; static int key_delay = 0; static int key_up = 0, key_down = 0; if (key_delay > 0) key_delay--; my_link = 0; while (SDL_PollEvent(&ev)) { if (ev.type == SDL_KEYDOWN) { if (ev.key.keysym.sym == SDLK_DOWN) { key_down = 1; key_delay = 10; if (my_cursor < hlp->s[my_sec]->lines-1) my_cursor++; } if (ev.key.keysym.sym == SDLK_UP) { key_up = 1; key_delay = 10; if (my_cursor > 0) my_cursor--; } if (ev.key.keysym.sym == SDLK_ESCAPE) { return 0; } if (ev.key.keysym.sym == SDLK_h) { return 0; } if ((ev.key.keysym.sym == SDLK_SPACE) || (ev.key.keysym.sym == SDLK_RETURN)) my_link = 1; } if (ev.type == SDL_KEYUP) { if (ev.key.keysym.sym == SDLK_DOWN) { key_down = 0; } if (ev.key.keysym.sym == SDLK_UP) { key_up = 0; } } if (ev.type == SDL_QUIT) { return 0; } } if (key_delay == 0) { if (key_up == 1) { if (my_cursor > 0) my_cursor--; } if (key_down == 1) { if (my_cursor < hlp->s[my_sec]->lines-1) my_cursor++; } } return 1; } void ShowHelp() { int in_help = 1; if (hlp == NULL) { InitHelp(); } my_line = 0; my_sec = 0; my_cursor = 0; my_link = 0; while (in_help) { DisplayHelp(); in_help = MoveCursor(); SDL_Delay(30); } }