Files
starruler-linux/scripts/shadow/game_start.as
T
2018-07-17 14:15:37 +02:00

133 lines
2.7 KiB
ActionScript

import settings.map_lib;
import maps;
import regions.regions;
SystemDesc[] systems;
Map@[] galaxies;
void getSystems() {
uint cnt = systems.length;
for(uint i = 0; i < cnt; ++i)
yield(systems[i]);
}
uint get_systemCount() {
return systems.length;
}
SystemDesc@ getSystem(uint index) {
if(index >= systems.length)
return null;
return systems[index];
}
SystemDesc@ getSystem(Region@ region) {
if(region.SystemId == -1 || region.SystemId >= int(systems.length))
return null;
return systems[region.SystemId];
}
SystemDesc@ getSystem(const string& name) {
//TODO: Use dictionary
uint cnt = systemCount;
for(uint i = 0; i < cnt; ++i) {
if(getSystem(i).name == name)
return getSystem(i);
}
return null;
}
void syncInitial(Message& msg) {
//Read systems
uint cnt = 0;
msg >> cnt;
systems.length = cnt;
for(uint i = 0; i < cnt; ++i)
systems[i].read(msg);
//Set player empire
if(playerEmpire is null) {
CURRENT_PLAYER.linkEmpire(spectatorEmpire);
@playerEmpire = spectatorEmpire;
}
//Read maps
msg >> cnt;
galaxies.length = cnt;
for(uint i = 0; i < cnt; ++i) {
string ident;
msg >> ident;
@galaxies[i] = getMap(ident).create();
}
//Generate gas nodes & sprites
msg >> cnt;
for(uint i = 0; i < cnt; ++i) {
GalaxyGas@ gas = GalaxyGas();
gas.position = msg.readSmallVec3();
gas.scale = msg.read_float();
if(msg.readBit()) {
vec3d origin = msg.readSmallVec3();
double radius = msg.read_float();
Node@ parent = createCullingNode(origin, radius);
gas.reparent(parent);
}
gas.rebuildTransform();
vec3d pos;
float size = 0;
uint col = 0;
uint spriteCount = msg.readSmall();
for(uint s = 0; s < spriteCount; ++s) {
pos = msg.readSmallVec3();
size = msg.read_float();
msg >> col;
bool structured = msg.readBit();
gas.addSprite(pos, size, col, structured);
}
}
}
void recvPeriodic(Message& msg) {
SystemUpdate upd;
uint cnt = 0;
msg >> cnt;
upd.systems.length = cnt;
for(uint i = 0; i < cnt; ++i)
upd.systems[i].read(msg);
isolate_run(upd);
}
class SystemUpdate : IsolateHook {
SystemDesc[] systems;
void call() {
uint oldCnt = ::systems.length;
::systems.length = systems.length;
for(uint i = 0, cnt = systems.length; i < cnt; ++i)
::systems[i] = systems[i];
for(uint i = oldCnt, cnt = systems.length; i < cnt; ++i)
addRegion(::systems[i].object);
calcGalaxyExtents();
regenerateRegionGroups();
refreshClientSystems();
}
}
void init() {
for(uint i = 0, cnt = galaxies.length; i < cnt; ++i)
galaxies[i].initDefs();
for(uint i = 0, cnt = galaxies.length; i < cnt; ++i)
galaxies[i].init();
}
void tick(double time) {
for(uint i = 0, cnt = galaxies.length; i < cnt; ++i)
galaxies[i].tick(time);
}