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.
64 lines
1.0 KiB
64 lines
1.0 KiB
/** |
|
* @file tmsg.cpp |
|
* |
|
* Implementation of functionality transmitting chat messages. |
|
*/ |
|
#include <list> |
|
|
|
#include "tmsg.h" |
|
#include "diablo.h" |
|
|
|
namespace devilution { |
|
|
|
namespace { |
|
|
|
struct TMsg { |
|
uint32_t time; |
|
std::unique_ptr<byte[]> body; |
|
uint8_t len; |
|
|
|
TMsg(uint32_t time, byte *data, uint8_t len) |
|
: time(time) |
|
, body(new byte[len]) |
|
, len(len) |
|
{ |
|
memcpy(body.get(), data, len); |
|
} |
|
}; |
|
|
|
std::list<TMsg> TimedMsgList; |
|
|
|
} // namespace |
|
|
|
uint8_t tmsg_get(std::unique_ptr<byte[]> *msg) |
|
{ |
|
if (TimedMsgList.empty()) |
|
return 0; |
|
|
|
TMsg &head = TimedMsgList.front(); |
|
if ((int)(head.time - SDL_GetTicks()) >= 0) |
|
return 0; |
|
|
|
uint8_t len = head.len; |
|
*msg = std::move(head.body); |
|
TimedMsgList.pop_front(); |
|
return len; |
|
} |
|
|
|
void tmsg_add(byte *msg, uint8_t len) |
|
{ |
|
uint32_t time = SDL_GetTicks() + gnTickDelay * 10; |
|
TimedMsgList.emplace_back(time, msg, len); |
|
} |
|
|
|
void tmsg_start() |
|
{ |
|
assert(TimedMsgList.empty()); |
|
} |
|
|
|
void tmsg_cleanup() |
|
{ |
|
TimedMsgList.clear(); |
|
} |
|
|
|
} // namespace devilution
|
|
|