You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

70 lines
1.3 KiB

/**
* @file tmsg.cpp
*
* Implementation of functionality transmitting chat messages.
*/
#include "tmsg.h"
#include "diablo.h"
namespace devilution {
namespace {
TMsg *sgpTimedMsgHead;
} // namespace
size_t tmsg_get(byte *pbMsg)
{
TMsg *head;
if (sgpTimedMsgHead == nullptr)
return 0;
if ((int)(sgpTimedMsgHead->hdr.dwTime - SDL_GetTicks()) >= 0)
return 0;
head = sgpTimedMsgHead;
sgpTimedMsgHead = head->hdr.pNext;
size_t len = head->hdr.bLen;
// BUGFIX: ignores dwMaxLen
memcpy(pbMsg, head->body, len);
std::free(head);
return len;
}
void tmsg_add(byte *pbMsg, uint8_t bLen)
{
TMsg **tail;
TMsg *msg = static_cast<TMsg *>(std::malloc(bLen + sizeof(*msg)));
if (msg == nullptr)
app_fatal("Failed to allocate memory");
msg->hdr.pNext = nullptr;
msg->hdr.dwTime = SDL_GetTicks() + gnTickDelay * 10;
msg->hdr.bLen = bLen;
memcpy(msg->body, pbMsg, bLen);
for (tail = &sgpTimedMsgHead; *tail != nullptr; tail = &(*tail)->hdr.pNext) {
;
}
*tail = msg;
}
void tmsg_start()
{
6 years ago
assert(!sgpTimedMsgHead);
}
void tmsg_cleanup()
{
TMsg *next;
while (sgpTimedMsgHead != nullptr) {
next = sgpTimedMsgHead->hdr.pNext;
std::free(sgpTimedMsgHead);
sgpTimedMsgHead = next;
}
}
} // namespace devilution