05-20-2016, 08:51 AM
I decided to play around with classes and the result is here. It's very basic program but may be a good start for someone who wants to extend it. Too bad there's no inheritance in CBot. :)
Program that uses this class looks like that:
Load this class on the very first Grabber you've created and before any program that uses it.
Not recommended for Winged Grabbers. Optimal for Legged Grabbers and Free Game mode.
To suppress the messages just change bool verbose = true; to false.
Program that uses this class looks like that:
Load this class on the very first Grabber you've created and before any program that uses it.
Not recommended for Winged Grabbers. Optimal for Legged Grabbers and Free Game mode.
To suppress the messages just change bool verbose = true; to false.
PHP Code:
// Resources
extern void object::classResources() {
// !! do not edit this program, create a new one instead !!
// !! load this class only on one grabber, use everywhere !!
// usage:
// Resources res(this, Titanium);
// Resources res(this, PowerCell);
// Resources res(this, NuclearCell);
}
public class Resources {
int resource, product, unit;
int pause = 15;
private object self = null;
bool verbose = true;
void Resources(object o, int p) {
self = o;
product = p;
configure();
init();
produce();
}
void configure() {
switch(product) {
case Titanium:
resource = TitaniumOre;
unit = Converter;
break;
case PowerCell:
resource = Titanium;
unit = PowerPlant;
pause = 12;
break;
case NuclearCell:
resource = UraniumOre;
unit = NuclearPlant;
pause = 35;
break;
}
}
void init() {
selfRecharge();
selfRepair();
goto(space(self.position));
errmode(0);
drop();
errmode(1);
}
void produce() {
while(true) {
pursue(resource);
grab();
process();
goto(space(self.position));
drop();
selfRecharge();
}
}
void selfRecharge() {
// if power cell half empty, do recharge
if(self.energyCell.energyLevel < 0.5) {
if(!pursue(PowerStation))
return;
while(self.energyCell.energyLevel < 1)
wait(1);
}
}
void selfRepair() {
// if shiled level below 0.5, do recharge
if(self.shieldLevel < 0.5) {
if(!pursue(RepairCenter))
return;
while(self.shieldLevel < 1)
wait(1);
}
}
void process() {
object item;
pursue(unit);
errmode(0);
if(drop() != 0) {
report("cannot drop, something in place, trying to remove");
goto(space(self.position));
drop();
pursue(unit);
grab();
return;
}
errmode(1);
move(-2.5);
wait(pause);
move(2.5);
grab();
}
bool pursue(int cat) {
// go to target
object target = radar(cat);
if(target != null) {
report(target.category + " available, moving");
errmode(0);
if(goto(target.position) != 0) {
goto(space(target.position));
report("place occupied, waiting");
while(goto(target.position) != 0)
wait(10);
}
errmode(1);
report(target.category + " reached");
return true;
} else {
report(target.category + " not available");
return false;
}
}
void report(string msg) {
if(verbose)
message(self.category + ": " + msg);
}
}