Open source Star Ruler 2 source code!

This commit is contained in:
Lucas de Vries
2018-07-17 14:15:37 +02:00
commit cc307720ff
4342 changed files with 2365070 additions and 0 deletions
+168
View File
@@ -0,0 +1,168 @@
import notifications;
from notifications import NotificationStore;
import influence;
import buildings;
from influence_global import getInfluenceVoteByID, getTreatyDesc;
tidy class Notifications : Component_Notifications, Savable, NotificationStore {
Mutex mtx;
array<Notification@> list;
void save(SaveFile& file) {
uint cnt = list.length;
file << cnt;
for(uint i = 0; i < cnt; ++i)
list[i].save(file);
}
void load(SaveFile& file) {
uint cnt = 0;
file >> cnt;
list.length = cnt;
for(uint i = 0; i < cnt; ++i)
@list[i] = loadNotification(file);
}
uint get_notificationCount() const {
return list.length;
}
void getNotifications(uint limit, int beforeId = -1, bool reverse = true) {
Lock lock(mtx);
if(reverse) {
if(beforeId == -1 || beforeId > int(list.length))
beforeId = list.length;
if(beforeId == 0)
return;
for(int i = beforeId - 1; i >= 0; --i) {
Notification@ n = list[i];
yieldNotification(n);
if(--limit == 0)
break;
}
}
else {
int cnt = list.length;
if(beforeId == -1 || beforeId > cnt)
beforeId = 0;
if(beforeId >= cnt)
return;
for(int i = beforeId; i < cnt; ++i) {
Notification@ n = list[i];
yieldNotification(n);
if(--limit == 0)
break;
}
}
}
void addNotification(Empire& emp, Notification@ n) {
Lock lock(mtx);
list.insertLast(n);
}
void notifyVote(Empire& emp, int voteId, int eventId) {
VoteNotification n;
InfluenceVote@ vote = getInfluenceVoteByID(voteId);
n.vote = InfluenceVoteStub(vote);
n.event = vote.events[eventId];
addNotification(emp, n);
}
void notifyGeneric(Empire& emp, string title, string desc, string icon = "", Empire@ fromEmp = null, Object@ forObject = null) {
GenericNotification n;
@n.fromEmp = fromEmp;
@n.obj = forObject;
n.title = title;
n.desc = desc;
n.iconDesc = icon;
addNotification(emp, n);
}
void notifyWarStatus(Empire& emp, Empire@ withEmpire, uint type) {
WarStatusNotification n;
n.statusType = type;
@n.withEmpire = withEmpire;
addNotification(emp, n);
}
void notifyWarEvent(Empire& emp, Object@ obj, uint type) {
WarEventNotification n;
n.eventType = type;
@n.obj = obj;
addNotification(emp, n);
}
void notifyRename(Empire& emp, Object@ obj, string fromName, string toName) {
RenameNotification n;
@n.obj = obj;
@n.fromEmpire = obj.owner;
n.fromName = fromName;
n.toName = toName;
addNotification(emp, n);
}
void notifyAnomaly(Empire& emp, Object@ obj) {
AnomalyNotification n;
@n.obj = obj;
addNotification(emp, n);
}
void notifyFlagship(Empire& emp, Object@ obj) {
FlagshipBuiltNotification n;
@n.obj = obj;
addNotification(emp, n);
}
void notifyStructure(Empire& emp, Object@ obj, uint type) {
StructureBuiltNotification n;
@n.obj = obj;
@n.bldg = getBuildingType(type);
addNotification(emp, n);
}
void notifyEmpireMet(Empire& emp, Object@ obj, Empire@ metEmp, bool gainsBonus = false) {
EmpireMetNotification n;
@n.region = obj;
@n.metEmpire = metEmp;
n.gainsBonus = gainsBonus;
addNotification(emp, n);
}
void notifyTreaty(Empire& emp, uint treatyId, uint eventType, Empire@ empOne = null, Empire@ empTwo = null) {
auto@ treaty = getTreatyDesc(treatyId);
if(treaty is null)
return;
TreatyEventNotification n;
n.treaty = treaty;
n.eventType = eventType;
@n.empOne = empOne;
@n.empTwo = empTwo;
addNotification(emp, n);
}
uint prevSynced = 0;
void writeNotifications(Message& msg, bool delta) {
Lock lock(mtx);
uint start, cnt;
if(delta) {
start = prevSynced;
cnt = list.length - prevSynced;
}
else {
start = 0;
cnt = list.length;
}
msg << cnt;
for(uint i = 0; i < cnt; ++i)
msg << list[start + i];
if(delta)
prevSynced = list.length;
}
};