/** ** Update messages ** ** @todo FIXME: make scroll speed configurable. */ void UpdateMessages(void) { if (!MessagesCount) { return; } // Scroll/remove old message line if (MessagesFrameTimeout < FrameCounter) { ++MessagesScrollY; if (MessagesScrollY == GameFont->Height() + 1) { MessagesFrameTimeout = FrameCounter + MESSAGES_TIMEOUT - MessagesScrollY; MessagesScrollY = 0; ShiftMessages(); } } }
/** ** Update messages */ void MessagesDisplay::UpdateMessages() { if (!MessagesCount) { return; } // Scroll/remove old message line unsigned long ticks = GetTicks(); if (MessagesFrameTimeout < ticks) { ++MessagesScrollY; if (MessagesScrollY == UI.MessageFont->Height() + 1) { MessagesFrameTimeout = ticks + UI.MessageScrollSpeed * 1000; MessagesScrollY = 0; ShiftMessages(); } } }
/** ** Adds message to the stack ** ** @param msg Message to add. */ static void AddMessage(const char *msg) { char *ptr; char *message; char *next; if (!MessagesCount) { MessagesFrameTimeout = FrameCounter + MESSAGES_TIMEOUT; } if (MessagesCount == MESSAGES_MAX) { // Out of space to store messages, can't scroll smoothly ShiftMessages(); MessagesFrameTimeout = FrameCounter + MESSAGES_TIMEOUT; MessagesScrollY = 0; } message = Messages[MessagesCount]; // Split long message into lines if (strlen(msg) >= sizeof(Messages[0])) { strncpy(message, msg, sizeof(Messages[0]) - 1); ptr = message + sizeof(Messages[0]) - 1; *ptr-- = '\0'; next = ptr + 1; while (ptr >= message) { if (*ptr == ' ') { *ptr = '\0'; next = ptr + 1; break; } --ptr; } if (ptr < message) { ptr = next - 1; } } else { strcpy_s(message, sizeof(Messages[MessagesCount]), msg); next = ptr = message + strlen(message); } while (GameFont->Width(message) + 8 >= UI.MapArea.EndX - UI.MapArea.X) { while (1) { --ptr; if (*ptr == ' ') { *ptr = '\0'; next = ptr + 1; break; } else if (ptr == message) { break; } } // No space found, wrap in the middle of a word if (ptr == message) { ptr = next - 1; while (GameFont->Width(message) + 8 >= UI.MapArea.EndX - UI.MapArea.X) { *--ptr = '\0'; } next = ptr + 1; break; } } ++MessagesCount; if (strlen(msg) != (size_t)(ptr - message)) { AddMessage(msg + (next - message)); } }