Вот тебе исправление проблемы методом «очень грязного хака». Два места, в которых я что-то менял, помечены коментом /* prool fool */
Это новый вариант функции для файла ib/sys/obj/user.c
Но у меня описание комнаты на всю ширину экрана вывелось только после того, как я в prooltin дал команду #config charset utf-8
То есть и клиент должен понимать UTF-8
void wrap_message(string str, varargs int chat_flag) {
string msg, *words, *lines;
int width, i, j, sz;
if (!str || str == "") {
return;
}
width = -1;
/* Get the width from the player */
if (player) {
catch(width = player->query_width());
}
rlimits(MAX_DEPTH; MAX_TICKS) {
/* Split the string into lines */
lines = explode(str, "\n");
/* Parse each line */
for (j = 0; j < sizeof(lines); j++) {
str = lines[j];
msg = str;
if (0/*strlen(ansid->strip_colors(str)) > width*/) { /* prool fool */
int adding;
string word_todo;
sz = 0;
words = explode(str, " ");
msg = "";
for (i = 0; i < sizeof(words); i++) {
word_todo = nil;
if (strlen(words[i]) > 4 && (strstr(words[i], "%^") != -1)) {
word_todo = ansid->strip_colors(words[i]);
}
/* word_todo is the word stripped from ansi codes */
if (!word_todo) {
word_todo = words[i];
}
Если не прокатит, то попробуй вместо strlen, использовать функцию strwidth().
Либо ты можешь вообще убрать этот автоматический перенос слов
UPD. Возможно, у string есть функция length() или len() можно ее попробовать
Это реализация функции strlen, которая правильно считает длину строки с символами UTF-8. Как говорит молодежь «я просто оставлю это здесь». А то потеряю это
Это новый вариант функции для файла ib/sys/obj/user.c
Но у меня описание комнаты на всю ширину экрана вывелось только после того, как я в prooltin дал команду #config charset utf-8
То есть и клиент должен понимать UTF-8
void wrap_message(string str, varargs int chat_flag) {
string msg, *words, *lines;
int width, i, j, sz;
if (!str || str == "") {
return;
}
width = -1;
/* Get the width from the player */
if (player) {
catch(width = player->query_width());
}
rlimits(MAX_DEPTH; MAX_TICKS) {
/* Split the string into lines */
lines = explode(str, "\n");
/* Parse each line */
for (j = 0; j < sizeof(lines); j++) {
str = lines[j];
msg = str;
if (0/*strlen(ansid->strip_colors(str)) > width*/) { /* prool fool */
int adding;
string word_todo;
sz = 0;
words = explode(str, " ");
msg = "";
for (i = 0; i < sizeof(words); i++) {
word_todo = nil;
if (strlen(words[i]) > 4 && (strstr(words[i], "%^") != -1)) {
word_todo = ansid->strip_colors(words[i]);
}
/* word_todo is the word stripped from ansi codes */
if (!word_todo) {
word_todo = words[i];
}
if (0/*sz + strlen(word_todo) + adding > width*/) {/* prool fool */
msg += "\n";
if (chat_flag) {
msg += " ";
}
/* add length of word without ansi codes */
sz = strlen(word_todo) + 2;
/* add word with ansi codes */
msg += words[i];
} else {
if (adding) {
msg += " " + words[i];
} else {
msg += words[i];
}
sz += strlen(word_todo) + adding;
}
/* determine how many spaces will be added next run */
if (sz == 0) {
adding = 0;
} else {
adding = 1;
}
}
}
if (query_player()->query_ansi()) {
msg = ansid->parse_colors(msg);
} else {
msg = ansid->strip_colors(msg);
}
send_message(msg + "\n");
}
}
}
Либо ты можешь вообще убрать этот автоматический перенос слов
UPD. Возможно, у string есть функция length() или len() можно ее попробовать
и в функции wrap_message измени все strlen на utf8_strlen
Тебе нужно здесь изменить strlen и немного сам алгоритм работы