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

110 lines
2.2 KiB
ActionScript

import regions.regions;
import oddity_navigation;
import oddities;
tidy class OddityScript {
StrategicIconNode@ icon;
bool gate = false;
double timer = -1.0;
uint visualType = uint(-1);
uint visualColor = 0xffffffff;
Object@ link;
bool isGate() {
return gate;
}
vec3d getGateDest() {
if(link !is null)
return link.position;
return vec3d();
}
Object@ getLink() {
return link;
}
double getTimer() {
return timer;
}
vec3d get_strategicIconPosition(Oddity& obj) {
if(icon is null)
return obj.position;
return icon.position;
}
void _read(Oddity& obj, Message& msg) {
uint prevVisual = visualType;
bool prevGate = gate;
msg >> gate;
msg >> timer;
msg >> visualType;
msg >> visualColor;
msg >> link;
if(prevVisual == uint(-1) && visualType != uint(-1)) {
if(link !is null)
obj.rotation = quaterniond_fromVecToVec(vec3d_front(), (link.position - obj.position).normalized(), vec3d_up());
makeVisuals(obj, visualType, color=visualColor);
}
if(gate != prevGate) {
if(gate)
addOddityGate(obj);
else
removeOddityGate(obj);
}
}
double tick(Oddity& obj, double time) {
//Handle region changes
Region@ prevRegion = obj.region;
if(updateRegion(obj)) {
Region@ newRegion = obj.region;
if(icon !is null) {
if(prevRegion !is null)
prevRegion.removeStrategicIcon(-1, icon);
if(newRegion !is null)
newRegion.addStrategicIcon(-1, obj, icon);
}
@prevRegion = newRegion;
}
//Handle timer
if(timer > 0.0)
timer = max(timer - time, 0.0);
return 0.25;
}
void syncInitial(Oddity& obj, Message& msg) {
_read(obj, msg);
}
void syncDelta(Oddity& obj, Message& msg, double tDiff) {
if(msg.readBit())
_read(obj, msg);
}
void syncDetailed(Oddity& obj, Message& msg, double tDiff) {
_read(obj, msg);
}
void makeVisuals(Oddity& obj, uint type, bool fromCreation = true, uint color = 0xffffffff) {
visualType = type;
@icon = makeOddityVisuals(obj, type, fromCreation, color=color);
}
void destroy(Oddity& obj) {
if(obj.region !is null)
obj.region.removeStrategicIcon(-1, icon);
if(icon !is null)
icon.markForDeletion();
leaveRegion(obj);
if(gate)
removeOddityGate(obj);
removeAmbientSource(obj.id);
}
};