287 lines
5.6 KiB
C++
287 lines
5.6 KiB
C++
#include <ctype.h>
|
|
#include <stdio.h>
|
|
#include <string.h>
|
|
#include "proboard.hpp"
|
|
|
|
LanguageFile pb_curlang;
|
|
LanguageString *pb_lang;
|
|
int pb_num_lang = 0;
|
|
|
|
static void
|
|
KillLanguage()
|
|
{
|
|
if(pb_lang)
|
|
{
|
|
delete [] pb_lang;
|
|
}
|
|
|
|
pb_lang = NULL;
|
|
pb_num_lang = 0;
|
|
}
|
|
|
|
bool
|
|
ReadLanguage( char *langname )
|
|
{
|
|
if(langname == NULL)
|
|
{
|
|
KillLanguage();
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
FileName fn(syspath , langname , ".PBL");
|
|
File f;
|
|
|
|
if(!f.open(fn , fmode_read , 4096))
|
|
{
|
|
LOG("ERROR: Unable to read language file %s",(char *)fn);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
if(f.read(&pb_curlang , sizeof(LanguageFile)) != sizeof(LanguageFile))
|
|
{
|
|
LOG("Error reading language file <%s>" , (char *)fn);
|
|
|
|
return FALSE;
|
|
}
|
|
|
|
if(strlen(pb_curlang.menuPath) < 3)
|
|
pb_curlang.menuPath[0] = '\0';
|
|
|
|
if(strlen(pb_curlang.txtPath) < 3)
|
|
pb_curlang.txtPath[0] = '\0';
|
|
|
|
if(strlen(pb_curlang.questPath) < 3)
|
|
pb_curlang.questPath[0] = '\0';
|
|
|
|
if(pb_curlang.menuPath[0])
|
|
append_backspace(pb_curlang.menuPath);
|
|
|
|
if(pb_curlang.txtPath[0])
|
|
append_backspace(pb_curlang.txtPath);
|
|
|
|
if(pb_curlang.questPath[0])
|
|
append_backspace(pb_curlang.questPath);
|
|
|
|
KillLanguage();
|
|
|
|
f >> pb_num_lang;
|
|
|
|
pb_lang = new LanguageString[pb_num_lang];
|
|
|
|
for(int i=0;i<pb_num_lang;i++)
|
|
{
|
|
if(!pb_lang[i].read(f)) break;
|
|
|
|
String str;
|
|
|
|
if(!(pb_lang[i].flags & LANG_NOCOLOR))
|
|
str << char(26) << char(pb_lang[i].color);
|
|
|
|
char *s = pb_lang[i].s;
|
|
|
|
bool high = FALSE;
|
|
|
|
bool akrol_found = FALSE;
|
|
bool pex_found = FALSE;
|
|
bool ans_found = FALSE;
|
|
bool last_was_ansi=FALSE;
|
|
|
|
String ans_pex_name;
|
|
|
|
for(;*s;s++)
|
|
{
|
|
last_was_ansi = FALSE;
|
|
|
|
if(akrol_found)
|
|
{
|
|
if(*s != 'p' && *s != 'a')
|
|
{
|
|
str << '@' << *s;
|
|
}
|
|
else
|
|
{
|
|
if(*s == 'p')
|
|
pex_found = TRUE;
|
|
else
|
|
ans_found = TRUE;
|
|
|
|
ans_pex_name = "";
|
|
}
|
|
|
|
akrol_found = FALSE;
|
|
|
|
continue;
|
|
}
|
|
|
|
if(pex_found || ans_found)
|
|
{
|
|
if(*s == '@')
|
|
{
|
|
str << (pex_found ? char(24):char(25)) << char(ans_pex_name.len()) << ans_pex_name;
|
|
|
|
pex_found = ans_found = FALSE;
|
|
|
|
last_was_ansi = TRUE;
|
|
}
|
|
else
|
|
{
|
|
ans_pex_name << *s;
|
|
}
|
|
|
|
continue;
|
|
}
|
|
|
|
if(*s == '^')
|
|
{
|
|
high = !high;
|
|
|
|
if(high)
|
|
str << char(26) << char(pb_lang[i].highlight);
|
|
else
|
|
str << char(26) << char(pb_lang[i].color);
|
|
}
|
|
else
|
|
{
|
|
if(*s == '\\')
|
|
{
|
|
char c = *(++s);
|
|
|
|
if(c == '\\' || c == '^')
|
|
{
|
|
str << c;
|
|
|
|
continue;
|
|
}
|
|
else
|
|
{
|
|
byte col = 0;
|
|
|
|
if(isxdigit(c))
|
|
{
|
|
for( int i = 0; i < 2 ; i++ , s++)
|
|
{
|
|
c = *s;
|
|
|
|
if(isdigit(c))
|
|
col = col * 16 + c - '0';
|
|
else
|
|
col = col * 16 + toupper(c) - 'A' + 10;
|
|
}
|
|
|
|
str << char(26) << char(col);
|
|
|
|
s--;
|
|
|
|
continue;
|
|
}
|
|
|
|
if(c == 'H' || c == 'L')
|
|
{
|
|
switch(*(++s))
|
|
{
|
|
case 'B': col = 1;
|
|
break;
|
|
case 'G': col = 2;
|
|
break;
|
|
case 'C': col = 3;
|
|
break;
|
|
case 'R': col = 4;
|
|
break;
|
|
case 'P': col = 5;
|
|
break;
|
|
case 'Y': col = 6;
|
|
break;
|
|
case 'W': col = 7;
|
|
break;
|
|
}
|
|
|
|
if(c == 'H') col |= 8;
|
|
}
|
|
|
|
str << char(26) << char(col);
|
|
|
|
continue;
|
|
}
|
|
}
|
|
|
|
if(*s == '@')
|
|
{
|
|
akrol_found = TRUE;
|
|
continue;
|
|
}
|
|
|
|
str << (*s);
|
|
}
|
|
}
|
|
|
|
#ifdef DEBUG
|
|
if(str.find("\x11")>0)
|
|
LOG("s = '%s'",(char *)str);
|
|
#endif
|
|
|
|
if(pb_lang[i].flags & LANG_PROMPT)
|
|
{
|
|
if(!last_was_ansi)
|
|
str << ' ';
|
|
|
|
str << char(26) << char(pb_lang[i].promptcolor);
|
|
}
|
|
|
|
delete [] pb_lang[i].s;
|
|
|
|
pb_lang[i].len = str.len();
|
|
pb_lang[i].s = new char[ pb_lang[i].len + 1 ];
|
|
|
|
strcpy(pb_lang[i].s , str);
|
|
}
|
|
|
|
f.close();
|
|
|
|
S_PRESS_ENTER_TO_CONTINUE = _S_PRESS_ENTER_TO_CONTINUE;
|
|
S_PRESS_ENTER_TO_CONTINUE << '\t';
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
char
|
|
wait_language_hotkeys(char *hk, bool enter)
|
|
{
|
|
String hotkeys;
|
|
|
|
hotkeys = hk;
|
|
if(enter)
|
|
hotkeys << '\r';
|
|
|
|
char k = io.wait(hotkeys);
|
|
|
|
k = hotkeys.find(String(char(k)));
|
|
|
|
if(hotkeys[k] == '\r')
|
|
return '\r';
|
|
else
|
|
return k;
|
|
}
|
|
|
|
int
|
|
language_string_length( char *str )
|
|
{
|
|
int l = 0;
|
|
|
|
for( ; *str ; str++)
|
|
{
|
|
char c = *str;
|
|
|
|
if(c == char(26))
|
|
{
|
|
str++;
|
|
continue;
|
|
}
|
|
|
|
l++;
|
|
}
|
|
|
|
return l;
|
|
}
|