Added radar energy and scan delay configuration

Added configuration for energy cost and scan delay as polynomial factors
Added LUA methods getEnergyRequired(radius) and getScanDelay(radius)
Updaded default LUA scripts accordingly
Updated default energy cost from radius ^2 to radius ^3
This commit is contained in:
LemADEC 2016-01-19 19:57:58 +01:00
parent 9fe205ba08
commit 8d143c50d9
7 changed files with 122 additions and 32 deletions

View file

@ -76,6 +76,22 @@ public class TileEntityRadar extends TileEntityAbstractEnergy {
super.writeToNBT(tag); super.writeToNBT(tag);
} }
private int calculateEnergyRequired(final int parRadius) {
return (int)Math.round(Math.max(WarpDriveConfig.RADAR_SCAN_MIN_ENERGY_COST,
WarpDriveConfig.RADAR_SCAN_ENERGY_COST_FACTORS[0]
+ WarpDriveConfig.RADAR_SCAN_ENERGY_COST_FACTORS[1] * parRadius
+ WarpDriveConfig.RADAR_SCAN_ENERGY_COST_FACTORS[2] * parRadius * parRadius
+ WarpDriveConfig.RADAR_SCAN_ENERGY_COST_FACTORS[3] * parRadius * parRadius * parRadius));
}
private int calculateScanDuration(final int parRadius) {
return (int)Math.round(20 * Math.max(WarpDriveConfig.RADAR_SCAN_MIN_DELAY_SECONDS,
WarpDriveConfig.RADAR_SCAN_DELAY_FACTORS_SECONDS[0]
+ WarpDriveConfig.RADAR_SCAN_DELAY_FACTORS_SECONDS[1] * parRadius
+ WarpDriveConfig.RADAR_SCAN_DELAY_FACTORS_SECONDS[2] * parRadius * parRadius
+ WarpDriveConfig.RADAR_SCAN_DELAY_FACTORS_SECONDS[3] * parRadius * parRadius * parRadius));
}
// OpenComputer callback methods // OpenComputer callback methods
@Callback @Callback
@Optional.Method(modid = "OpenComputers") @Optional.Method(modid = "OpenComputers")
@ -83,6 +99,18 @@ public class TileEntityRadar extends TileEntityAbstractEnergy {
return radius(argumentsOCtoCC(arguments)); return radius(argumentsOCtoCC(arguments));
} }
@Callback
@Optional.Method(modid = "OpenComputers")
public Object[] getEnergyRequired(Context context, Arguments arguments) {
return getEnergyRequired(argumentsOCtoCC(arguments));
}
@Callback
@Optional.Method(modid = "OpenComputers")
public Object[] getScanDuration(Context context, Arguments arguments) {
return getScanDuration(argumentsOCtoCC(arguments));
}
@Callback @Callback
@Optional.Method(modid = "OpenComputers") @Optional.Method(modid = "OpenComputers")
public Object[] start(Context context, Arguments arguments) { public Object[] start(Context context, Arguments arguments) {
@ -117,6 +145,28 @@ public class TileEntityRadar extends TileEntityAbstractEnergy {
return new Integer[] { radius }; return new Integer[] { radius };
} }
private Object[] getEnergyRequired(Object[] arguments) {
try {
if (arguments.length == 1) {
return new Object[] { calculateEnergyRequired(toInt(arguments[0])) };
}
} catch (Exception exception) {
return new Integer[] { -1 };
}
return new Integer[] { -1 };
}
private Object[] getScanDuration(Object[] arguments) {
try {
if (arguments.length == 1) {
return new Object[] { 0.050D * calculateScanDuration(toInt(arguments[0])) };
}
} catch (Exception exception) {
return new Integer[] { -1 };
}
return new Integer[] { -1 };
}
private Object[] start(Object[] arguments) { private Object[] start(Object[] arguments) {
// always clear results // always clear results
results = null; results = null;
@ -126,17 +176,19 @@ public class TileEntityRadar extends TileEntityAbstractEnergy {
radius = 0; radius = 0;
return new Object[] { false, "Invalid radius" }; return new Object[] { false, "Invalid radius" };
} }
if (!consumeEnergy(Math.max(radius, 100) * Math.max(radius, 100), false)) { int energyRequired = calculateEnergyRequired(radius);
if (!consumeEnergy(energyRequired, false)) {
return new Object[] { false, "Insufficient energy" }; return new Object[] { false, "Insufficient energy" };
} }
// Begin searching // Begin searching
scanningRadius = radius; scanningRadius = radius;
scanningDuration_ticks = (20 * ((scanningRadius / 1000) + 1)); scanningDuration_ticks = calculateScanDuration(radius);
scanning_ticks = 0; scanning_ticks = 0;
if (getBlockMetadata() != 2) { if (getBlockMetadata() != 2) {
worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 2, 1 + 2); worldObj.setBlockMetadataWithNotify(xCoord, yCoord, zCoord, 2, 1 + 2);
} }
WarpDrive.logger.info("!!! Starting scan over radius " + scanningRadius + " for " + energyRequired + " EU, results expected in " + scanningDuration_ticks + " ticks");
return new Object[] { true }; return new Object[] { true };
} }
@ -184,6 +236,12 @@ public class TileEntityRadar extends TileEntityAbstractEnergy {
if (methodName.equals("radius")) { if (methodName.equals("radius")) {
return radius(arguments); return radius(arguments);
} else if (methodName.equals("getEnergyRequired")) {
return getEnergyRequired(arguments);
} else if (methodName.equals("getScanDuration")) {
return getScanDuration(arguments);
} else if (methodName.equals("start")) { } else if (methodName.equals("start")) {
return start(arguments); return start(arguments);

View file

@ -722,9 +722,9 @@ public class TileEntityShipController extends TileEntityAbstractInterfaced {
private Object[] getEnergyRequired(Object[] arguments) { private Object[] getEnergyRequired(Object[] arguments) {
try { try {
if (arguments.length == 1 && core != null) { if (arguments.length == 1 && core != null) {
return new Object[] { (int) (core.calculateRequiredEnergy(getMode(), core.shipMass, toInt(arguments[0]))) }; return new Object[] { core.calculateRequiredEnergy(getMode(), core.shipMass, toInt(arguments[0])) };
} }
} catch (Exception e) { } catch (Exception exception) {
return new Integer[] { -1 }; return new Integer[] { -1 };
} }
return new Integer[] { -1 }; return new Integer[] { -1 };

View file

@ -6,6 +6,7 @@ import java.io.FileOutputStream;
import java.io.FilenameFilter; import java.io.FilenameFilter;
import java.io.InputStream; import java.io.InputStream;
import java.lang.reflect.Method; import java.lang.reflect.Method;
import java.util.Arrays;
import javax.xml.parsers.DocumentBuilder; import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory; import javax.xml.parsers.DocumentBuilderFactory;
@ -143,6 +144,10 @@ public class WarpDriveConfig {
// Radar // Radar
public static int RADAR_MAX_ENERGY_STORED = 100000000; // 100kk eU public static int RADAR_MAX_ENERGY_STORED = 100000000; // 100kk eU
public static int RADAR_SCAN_MIN_ENERGY_COST = 10000;
public static double[] RADAR_SCAN_ENERGY_COST_FACTORS = { 0.0, 0.0, 0.0, 0.0001 };
public static int RADAR_SCAN_MIN_DELAY_SECONDS = 1;
public static double[] RADAR_SCAN_DELAY_FACTORS_SECONDS = { 1.0, 0.001, 0.0, 0.0 };
public static int RADAR_MAX_ISOLATION_RANGE = 2; public static int RADAR_MAX_ISOLATION_RANGE = 2;
public static int RADAR_MIN_ISOLATION_BLOCKS = 5; public static int RADAR_MIN_ISOLATION_BLOCKS = 5;
public static int RADAR_MAX_ISOLATION_BLOCKS = 60; public static int RADAR_MAX_ISOLATION_BLOCKS = 60;
@ -151,8 +156,7 @@ public class WarpDriveConfig {
// Ship Scanner // Ship Scanner
public static int SS_MAX_ENERGY_STORED = 500000000; public static int SS_MAX_ENERGY_STORED = 500000000;
public static int SS_ENERGY_PER_BLOCK_SCAN = 100; // eU per block of ship volume public static int SS_ENERGY_PER_BLOCK_SCAN = 100; // eU per block of ship volume (including air)
// (including air)
public static int SS_ENERGY_PER_BLOCK_DEPLOY = 5000; public static int SS_ENERGY_PER_BLOCK_DEPLOY = 5000;
public static int SS_MAX_DEPLOY_RADIUS_BLOCKS = 50; public static int SS_MAX_DEPLOY_RADIUS_BLOCKS = 50;
@ -459,7 +463,27 @@ public class WarpDriveConfig {
// Radar // Radar
RADAR_MAX_ENERGY_STORED = clamp(0, Integer.MAX_VALUE, RADAR_MAX_ENERGY_STORED = clamp(0, Integer.MAX_VALUE,
config.get("radar", "max_energy_stored", RADAR_MAX_ENERGY_STORED).getInt()); config.get("radar", "max_energy_stored", RADAR_MAX_ENERGY_STORED, "maximum energy stored").getInt());
RADAR_SCAN_MIN_ENERGY_COST = clamp(0, Integer.MAX_VALUE,
config.get("radar", "min_energy_cost", RADAR_SCAN_MIN_ENERGY_COST, "minimum energy cost per scan (0+), independantly of radius").getInt());
RADAR_SCAN_ENERGY_COST_FACTORS =
config.get("radar", "factors_energy_cost", RADAR_SCAN_ENERGY_COST_FACTORS, "energy cost factors {a, b, c, d}. You need to provide exactly 4 values.\n"
+ "The equation used is a + b * radius + c * radius^2 + d * radius^3").getDoubleList();
if (RADAR_SCAN_ENERGY_COST_FACTORS.length != 4) {
RADAR_SCAN_ENERGY_COST_FACTORS = new double[4];
Arrays.fill(RADAR_SCAN_ENERGY_COST_FACTORS, 1.0);
}
RADAR_SCAN_MIN_DELAY_SECONDS = clamp(1, Integer.MAX_VALUE,
config.get("radar", "scan_min_delay_seconds", RADAR_SCAN_MIN_DELAY_SECONDS, "minimum scan delay per scan (1+), (measured in seconds)").getInt());
RADAR_SCAN_DELAY_FACTORS_SECONDS =
config.get("radar", "scan_delay_factors_seconds", RADAR_SCAN_DELAY_FACTORS_SECONDS, "scan delay factors {a, b, c, d}. You need to provide exactly 4 values.\n"
+ "The equation used is a + b * radius + c * radius^2 + d * radius^3, (measured in seconds)").getDoubleList();
if (RADAR_SCAN_DELAY_FACTORS_SECONDS.length != 4) {
RADAR_SCAN_DELAY_FACTORS_SECONDS = new double[4];
Arrays.fill(RADAR_SCAN_DELAY_FACTORS_SECONDS, 1.0);
}
RADAR_MAX_ISOLATION_RANGE = clamp(2, 8, RADAR_MAX_ISOLATION_RANGE = clamp(2, 8,
config.get("radar", "max_isolation_range", RADAR_MAX_ISOLATION_RANGE, "radius around core where isolation blocks count (2 to 8), higher is lagger").getInt()); config.get("radar", "max_isolation_range", RADAR_MAX_ISOLATION_RANGE, "radius around core where isolation blocks count (2 to 8), higher is lagger").getInt());

View file

@ -38,24 +38,26 @@ if radius < 1 or radius > 9999 then
end end
energy, energyMax = radar.energy() energy, energyMax = radar.energy()
energyRequired = radar.getEnergyRequired(radius)
scanDuration = radar.getScanDuration(radius)
if energy < radius * radius then if energy < radius * radius then
error("Low energy level... (" .. energy .. "/" .. radius * radius .. ")") error("Low energy level... (" .. energy .. "/" .. energyRequired .. ")")
return return
end end
radar.radius(radius) radar.radius(radius)
radar.start() radar.start()
sleep(0.5) sleep(0.5)
print("Scanning...") print("Scanning... (" .. scanDuration .. " s)")
os.sleep(scanDuration)
local seconds = 0 local delay = 0
local count = nil local count = nil
repeat repeat
count = radar.getResultsCount() count = radar.getResultsCount()
sleep(1) sleep(0.1)
seconds = seconds + 1 delay = delay + 1
until (count ~= nil and count ~= -1) or seconds > 10 until (count ~= nil and count ~= -1) or delay > 10
print("took " .. seconds .. " seconds")
if count ~= nil and count > 0 then if count ~= nil and count > 0 then
for i=0, count-1 do for i=0, count-1 do

View file

@ -66,7 +66,8 @@ end
function scanAndDraw() function scanAndDraw()
local energy, energyMax = radar.energy() local energy, energyMax = radar.energy()
if (energy < radius*radius) then local energyRequired = radar.getEnergyRequired(radius)
if (energy < energyRequired) then
hh = math.floor(h / 2) hh = math.floor(h / 2)
hw = math.floor(w / 2) hw = math.floor(w / 2)
@ -80,7 +81,8 @@ function scanAndDraw()
end end
radar.radius(radius) radar.radius(radius)
radar.start() radar.start()
sleep(2) local scanDuration = radar.getScanDuration(radius)
sleep(scanDuration)
redraw() redraw()
@ -102,7 +104,7 @@ function redraw()
paintutils.drawLine(1, 1, w, 1, colors.black) paintutils.drawLine(1, 1, w, 1, colors.black)
textOut((w / 2) - 8, 1, "= Q-Radar v0.1 =", colors.white, colors.black) textOut((w / 2) - 8, 1, "= Q-Radar v0.2 =", colors.white, colors.black)
textOut(w - 3, 1, "[X]", colors.white, colors.red) textOut(w - 3, 1, "[X]", colors.white, colors.red)

View file

@ -20,24 +20,26 @@ if radius < 1 or radius > 9999 then
end end
energy, energyMax = radar.energy() energy, energyMax = radar.energy()
if energy < radius * radius then energyRequired = radar.getEnergyRequired(radius)
print("Low energy level... (" .. energy .. "/" .. radius * radius .. ")") scanDuration = radar.getScanDuration(radius)
if energy < energyRequired then
print("Low energy level... (" .. energy .. "/" .. energyRequired .. ")")
return return
end end
radar.radius(radius) radar.radius(radius)
radar.start() radar.start()
os.sleep(0.5) os.sleep(0.5)
print("Scanning...") print("Scanning... (" .. scanDuration .. " s)")
os.sleep(scanDuration)
local seconds = 0 local delay = 0
local count = nil local count = nil
repeat repeat
count = radar.getResultsCount() count = radar.getResultsCount()
os.sleep(1) os.sleep(0.1)
seconds = seconds + 1 delay = delay + 1
until (count ~= nil and count ~= -1) or seconds > 10 until (count ~= nil and count ~= -1) or delay > 10
print("took " .. seconds .. " seconds")
if count ~= nil and count > 0 then if count ~= nil and count > 0 then
for i=0, count-1 do for i=0, count-1 do

View file

@ -67,7 +67,8 @@ end
function scanAndDraw() function scanAndDraw()
local energy, energyMax = radar.energy() local energy, energyMax = radar.energy()
if (energy < radius * radius) then local energyRequired = radar.getEnergyRequired(radius)
if (energy < energyRequired) then
hh = math.floor(h / 2) hh = math.floor(h / 2)
hw = math.floor(w / 2) hw = math.floor(w / 2)
@ -79,7 +80,8 @@ function scanAndDraw()
end end
radar.radius(radius) radar.radius(radius)
radar.start() radar.start()
os.sleep(2) local scanDuration = radar.getScanDuration(radius)
os.sleep(scanDuration)
redraw() redraw()
@ -104,7 +106,7 @@ function redraw()
drawBox(1, h, w, 1, 0x000000) drawBox(1, h, w, 1, 0x000000)
drawBox(w, 1, w, h, 0x000000) drawBox(w, 1, w, h, 0x000000)
textOut((w / 2) - 8, 1, "= Q-Radar v0.1 =", 0xFFFFFF, 0x000000) textOut((w / 2) - 8, 1, "= Q-Radar v0.2 =", 0xFFFFFF, 0x000000)
textOut(w - 3, 1, "[X]", 0xFFFFFF, 0xFF0000) textOut(w - 3, 1, "[X]", 0xFFFFFF, 0xFF0000)