Initial commit
This commit is contained in:
@@ -0,0 +1,60 @@
|
||||
#include "Alarm.h"
|
||||
|
||||
namespace NGame {
|
||||
|
||||
void TAlarm::Set(TId id, std::uint32_t millis) {
|
||||
auto& data = Alarms_[id];
|
||||
data.Target = millis;
|
||||
data.Current = 0;
|
||||
}
|
||||
|
||||
void TAlarm::Unset(TId id) {
|
||||
auto& data = Alarms_[id];
|
||||
data.Target = 0;
|
||||
data.Current = 0;
|
||||
}
|
||||
|
||||
void TAlarm::Update(std::uint32_t delta) {
|
||||
for (auto it = Alarms_.begin(); it != Alarms_.end(); ++it) {
|
||||
auto& alarm = it->second;
|
||||
if (alarm.Target) {
|
||||
alarm.Current += delta;
|
||||
}
|
||||
|
||||
if (alarm.Current >= alarm.Target) {
|
||||
DueAlarms_.push(it->first);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
bool TAlarm::Next(TId& id) {
|
||||
bool repeat;
|
||||
|
||||
do {
|
||||
repeat = false;
|
||||
|
||||
if (DueAlarms_.empty())
|
||||
return false;
|
||||
|
||||
id = DueAlarms_.front();
|
||||
DueAlarms_.pop();
|
||||
|
||||
auto& alarm = Alarms_[id];
|
||||
if (alarm.Target) {
|
||||
if (alarm.Current >= alarm.Target) {
|
||||
alarm.Current -= alarm.Target;
|
||||
}
|
||||
|
||||
if (alarm.Current >= alarm.Target) {
|
||||
DueAlarms_.push(id);
|
||||
}
|
||||
} else {
|
||||
alarm.Current = 0;
|
||||
repeat = true;
|
||||
}
|
||||
} while (repeat);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
} // namespace NGame
|
||||
Reference in New Issue
Block a user