// Nazwa: Recharge // Krotki opis: Bardzo rozbudowany program do dostarczenia energii // Dlugi opis: Bardzo rozbudowany program do dostarczania energii. Od zwyczajnego SwitchCell (z wykrywaniem najbardziej naladowanej baterii na mapie) po produkcje ogniw nuklearnych. // Autor: krzys_h // Wersja: 1.0 // Data ostatniej zmiany: 2012-02-11 15:00 void object::TryGrab(int order) { int result = grab(order); if(this.load == null) result = -1; if(result != 0) { message("Podniesienie przedmiotu nie powiodlo sie. Ponawianie proby...", DisplayWarning); do { result = grab(order); if(this.load == null) result = -1; } while(result != 0); } } void object::TryDrop(int order) { int result = drop(order); if(this.load != null) result = -1; if(result != 0) { message("Upuszczenie przedmiotu nie powiodlo sie. Ponawianie proby...", DisplayWarning); do { result = drop(order); if(this.load != null) result = -1; } while(result != 0); } } void object::TryGoto(point position) { int result = goto(position); if(result != 0) { message("Dotarcie nie powiodlo sie. Ponawianie proby...", DisplayWarning); do { result = goto(position); } while(result != 0); } } void object::TryGoto(object item) { int result = goto(item.position); if(result != 0) { message("Dotarcie do " + item.category + " nie powiodlo sie. Ponawianie proby...", DisplayWarning); do { result = goto(item.position); } while(result != 0); } } void object::TryMove(int dist) { int result = move(dist); if(result != 0) { message("Przemieszczenie nie powiodlo sie. Ponawianie proby...", DisplayWarning); do { result = move(dist); } while(result != 0); } } extern void object::Recharge() { errmode(0); point start = this.position; if(this.energyCell.category == PowerCell) { if(radar(PowerStation) != null) { object item = radar(PowerStation); TryGoto(item); while(this.energyCell.energyLevel < 1) wait(0.01); TryGoto(start); return; } if(radar(PowerCaptor) != null) { object item = radar(PowerCaptor); TryGoto(item); while(this.energyCell.energyLevel < 1) wait(0.01); TryGoto(start); return; } } if(!(this.category == WheeledGrabber || this.category == TrackedGrabber || this.category == WingedGrabber || this.category == LeggedGrabber || this.category == Subber)) { message("Nie ma mozliwosci naladowania.", DisplayError); return; } if(this.category != Subber) { object battery = Bateria(); if(battery != null && battery.energyLevel > this.energyCell.energyLevel && ((battery.category == PowerCell && battery.energyLevel > 0.3) || (battery.category == NuclearCell && battery.energyLevel > 0.05))) { TryGoto(battery); TryGrab(InFront); TryDrop(Behind); TryGrab(EnergyCell); TryDrop(InFront); TryGrab(Behind); TryDrop(EnergyCell); TryGoto(start); return; } if(radar(NuclearPlant) != null) { object plant = radar(NuclearPlant); if(plant.energyCell != null) { if(plant.energyCell.category == NuclearCell) { TryGoto(plant); TryGrab(InFront); TryDrop(Behind); TryGrab(EnergyCell); TryDrop(InFront); TryGrab(Behind); TryDrop(EnergyCell); TryGrab(InFront); TryGoto(space()); TryDrop(InFront); TryGoto(start); return; } else if(plant.energyCell.category == UraniumOre) { TryGoto(plant); TryMove(-3); while(plant.energyCell.category != NuclearCell) wait(0.01); TryMove(3); TryGrab(InFront); TryDrop(Behind); TryGrab(EnergyCell); TryDrop(InFront); TryGrab(Behind); TryDrop(EnergyCell); TryGrab(InFront); TryGoto(space()); TryDrop(InFront); TryGoto(start); return; } else { if(radar(UraniumOre) != null) { TryGoto(plant); TryGrab(InFront); TryGoto(space()); TryDrop(InFront); } } } if(radar(UraniumOre) != null) { object item = radar(UraniumOre); TryGoto(item); TryGrab(InFront); TryGoto(plant); TryDrop(InFront); TryMove(-3); while(plant.energyCell.category != NuclearCell) wait(0.01); TryMove(3); TryGrab(InFront); TryDrop(Behind); TryGrab(EnergyCell); TryDrop(InFront); TryGrab(Behind); TryDrop(EnergyCell); TryGrab(InFront); TryGoto(space()); TryDrop(InFront); TryGoto(start); return; } } if(radar(PowerPlant) != null) { object plant = radar(PowerPlant); if(plant.energyCell != null) { if(plant.energyCell.category == PowerCell) { TryGoto(plant); TryGrab(InFront); TryDrop(Behind); TryGrab(EnergyCell); TryDrop(InFront); TryGrab(Behind); TryDrop(EnergyCell); TryGrab(InFront); TryGoto(space()); TryDrop(InFront); TryGoto(start); return; } else if(plant.energyCell.category == Titanium) { TryGoto(plant); while(plant.energyCell.category != PowerCell) wait(0.01); TryGrab(InFront); TryDrop(Behind); TryGrab(EnergyCell); TryDrop(InFront); TryGrab(Behind); TryDrop(EnergyCell); TryGrab(InFront); TryGoto(space()); TryDrop(InFront); TryGoto(start); return; } else { if(radar(Titanium) != null) { TryGoto(plant); TryGrab(InFront); TryGoto(space()); TryDrop(InFront); } } } if(radar(Titanium) != null) { object item = radar(Titanium); TryGoto(item); TryGrab(InFront); TryGoto(plant); TryDrop(InFront); while(plant.energyCell.category != PowerCell) wait(0.01); TryGrab(InFront); TryDrop(Behind); TryGrab(EnergyCell); TryDrop(InFront); TryGrab(Behind); TryDrop(EnergyCell); TryGrab(InFront); TryGoto(space()); TryDrop(InFront); TryGoto(start); return; } } } message("Nie ma mozliwosci naladowania.", DisplayError); } object object::Bateria() { object maxEnergyCell = null; object zajeteBaterie[]; float maxEnergy = -1; int j=0; for(int i=0;i<500;i++) { object item = retobject(i); if(item != null) { if(item.energyCell != null) { zajeteBaterie[j] = item.energyCell; j++; } if(item.load != null) { if(item.load.category == PowerCell || item.load.category == NuclearCell) { zajeteBaterie[j] = item.load; j++; } } } } for(int i=0;i<500;i++) { object item = retobject(i); if(item != null) { bool zajete = false; for(int j=0;jmaxEnergy) { maxEnergy = item.energyLevel*100; maxEnergyCell = item; } if(item.category == PowerCell && item.energyLevel>maxEnergy) { maxEnergy = item.energyLevel; maxEnergyCell = item; } } } return maxEnergyCell; }