What is it doing?The gyro flies the ship out to an (x,y) point on the orbit (XYLock)
At the same time, it tries to find the correct altitude (ZLock)
Once this is complete, it tries to maintain a clockwise orbit (from above) by adjusting the pointing direction with Yaw and the distance from the planet with MoveRight
Disclaimer: It's version 1.0!This isn't pretty, but it works (most of the time)
Multipliers are set low to keep the gyro from spazzing (most of the time)
@name Blox_Orbiting_e2_v1.0
# Created by KevinMinion
@inputs Gyro:wirelink EGP:wirelink
@outputs
@persist Closest:entity ClosestPos:vector ClosestRad
@persist X1 Y1 Z1
@persist XYLock ZLock StartOrbit
@trigger
# Weld this E2 to the gyropod
# The EGP input is not required
if (first() | dupefinished()) {
EGP:egpClear()
GyroPod = entity():isWeldedTo()
Gyro = GyroPod:wirelink()
findByClass("logic_case*")
findSortByDistance( entity():pos() )
Closest = find()
ClosestPos = floor( Closest:pos() )
ClosestRad = getPlanetRadius(Closest)
hint("Orbiting: " + getPlanetName(Closest),10)
K=1
EGP:egpText(K,"[X0: " + ClosestPos:x() + "]", vec2(220,300) )
K++
EGP:egpText(K,"[Y0: " + ClosestPos:y() + "]", vec2(220,320) )
K++
EGP:egpText(K,"[Z0: " + ClosestPos:z() + "]", vec2(220,340) )
K++
EGP:egpText(K,"[R0: " + ClosestRad + "]", vec2(220,360) )
K++
X1 = ClosestPos:x() + ClosestRad
EGP:egpText(K,"[X1: " + X1 + "]", vec2(220,400) )
K++
Y1 = ClosestPos:y() + ClosestRad
EGP:egpText(K,"[Y1: " + Y1 + "]", vec2(220,420) )
K++
Z1 = ClosestPos:z() + (ClosestRad * 0.75)
EGP:egpText(K,"[Z1: " + Z1 + "]", vec2(220,440) )
Gyro["MPH Limit",number] = 5
XYLock = 0
ZLock = 0
StartOrbit = 0
}
K=20
K++
EGP:egpText(K,"[EX: " + floor(entity():pos():x()) + "]", vec2(220,500) )
K++
EGP:egpText(K,"[EY: " + floor(entity():pos():y()) + "]", vec2(220,520) )
K++
EGP:egpText(K,"[EZ: " + floor(entity():pos():z()) + "]", vec2(220,540) )
K++
ED = floor(vec2(X1,Y1):distance2(vec2(entity():pos():x(), entity():pos():y())))
EGP:egpText(K,"[ED: " + ED + "]", vec2(220,560) )
if ( (ED > 5000) & (!XYLock) ) {
Gyro["AimVec",vector] = vec(X1,Y1,Z1)
Gyro["AimMode",number] = 1
Gyro["Forward",number] = 1
K++
EGP:egpText(K,"XY: Locking", vec2(220,600) )
EGP:egpColor(K,vec(255,0,0))
XYLock = 0
} else {
Gyro["AimMode",number] = 0
Gyro["Forward",number] = 0
K++
EGP:egpText(K,"XY: Locked", vec2(220,600) )
EGP:egpColor(K,vec(0,255,0))
XYLock = 1
}
if (entity():pos():z() < (Z1 - 50)) {
Gyro["MoveUp",number] = 1
Gyro["MoveDown",number] = 0
Gyro["Level",number] = 1
K++
EGP:egpText(K,"Z: Locking", vec2(220,620) )
EGP:egpColor(K,vec(255,0,0))
ZLock = 0
} elseif (entity():pos():z() > (Z1 + 50)) {
Gyro["MoveDown",number] = 1
Gyro["MoveUp",number] = 0
Gyro["Level",number] = 1
K++
EGP:egpText(K,"Z: Locking", vec2(220,620) )
EGP:egpColor(K,vec(255,0,0))
ZLock = 0
} else {
Gyro["MoveUp",number] = 0
Gyro["MoveDown",number] = 0
Gyro["Level",number] = 0
K++
EGP:egpText(K,"Z: Locked", vec2(220,620) )
EGP:egpColor(K,vec(0,255,0))
ZLock = 1
}
if (XYLock & ZLock) {
StartOrbit = 1
Gyro["Level",number] = 1
}
Bearing = entity():bearing(vec(ClosestPos:x(),ClosestPos:y(),entity():pos():z()))
Distance = entity():pos():distance(vec(ClosestPos:x(),ClosestPos:y(),entity():pos():z()))
K++
EGP:egpText(K,"Bearing to planet center: " + floor(Bearing), vec2(220,660) )
K++
EGP:egpText(K,"Distance to planet center: " + floor(Distance), vec2(220,680) )
if (StartOrbit) {
interval(100)
Gyro["Forward",number] = 1
Gyro["YawMult",number] = 0.2
if (Bearing >= 0) {
if (Bearing < 90) {
Gyro["YawLeft",number] = 0
Gyro["YawRight",number] = 1
} else {
Gyro["YawLeft",number] = 1
Gyro["YawRight",number] = 0
}
if (Distance > (ClosestRad + 500)) {
Gyro["MoveLeft", number] = 0
Gyro["MoveRight", number] = 1
} elseif (Distance < (ClosestRad - 500)) {
Gyro["MoveLeft", number] = 1
Gyro["MoveRight", number] = 0
} else {
Gyro["MoveLeft", number] = 0
Gyro["MoveRight", number] = 0
}
} else {
if (Bearing > -90) {
Gyro["YawLeft",number] = 0
Gyro["YawRight",number] = 1
} else {
Gyro["YawLeft",number] = 1
Gyro["YawRight",number] = 0
}
}
} else {
interval(2000)
}