RepairBots OXP

Discussion and information relevant to creating special missions, new ships, skins etc.

Moderators: another_commander, winston

User avatar
CheeseRedux
Intergalactic Spam Assassin
Intergalactic Spam Assassin
Posts: 827
Joined: Fri Oct 02, 2009 6:50 pm

Re: RepairBots OXP

Post by CheeseRedux »

Diziet Sma wrote:I've had it do this trying to "repair" a ship's cat..
Same.
Led me to remove the cats from my game. I'm not wasting time and 'bots on a non-essential item, and to me not worth the hassle to fix locally.
"Actually this is a common misconception... I do *not* in fact have a lot of time on my hands at all! I just have a very very very very bad sense of priorities."
--Dean C Engelhardt

vsfc
Dangerous
Dangerous
Posts: 103
Joined: Wed Jul 10, 2013 12:39 am

Re: RepairBots OXP

Post by vsfc »

Well, my thinking on this one is, once equipment gets broken one of the recharges is used. It does take a time to fix equipment and you may dock before it gets fixed. When you leave a station another recharge is used and this happens every time you leave station with broken equipment even though it is already used recharge before. Should we have some life time timeout before the next one is used or well what is the nature of these bots? (They die / run away when airlock is opened on the station? :lol: )

You are right Dizzi, I do bite a bullet occasionally.

User avatar
CheeseRedux
Intergalactic Spam Assassin
Intergalactic Spam Assassin
Posts: 827
Joined: Fri Oct 02, 2009 6:50 pm

Re: RepairBots OXP

Post by CheeseRedux »

But why are you repeatedly launching and docking? Apart from experiments or other special circumstances, I launch for one of two reasons: To go to a different system, or a different station in-system. Both of these usually mean plenty of time for the 'bots to do their thing. On the occasions they are working on something when I arrive at my destination, my standard response is to loiter until they are done.

A timeout might seem like a good idea when you are in the station aegis, but you do not want the 'bots on a coffee break in the middle of a battle with essential equipment down.
A possible solution could be a half-off switch; Tell the system to finish what it is working on, but not start any new repairs. Would ideally have to be switchable both in flight and when docked.
I am not sure how much demand there would be for such a thing though, and at any rate nothing is likely to happen until the OXP finds a new maintainer.
"Actually this is a common misconception... I do *not* in fact have a lot of time on my hands at all! I just have a very very very very bad sense of priorities."
--Dean C Engelhardt

User avatar
Lone_Wolf
---- E L I T E ----
---- E L I T E ----
Posts: 546
Joined: Wed Aug 08, 2007 10:59 pm
Location: Netherlands

Re: RepairBots OXP

Post by Lone_Wolf »

A repair charge is subtracted everytime a repair starts.

Upon docking, repairbots is stopped. any ongoing repair is cancelled then, so that charge is gone.

If there's still equipment damaged after launch, a new repair is started > needs a repaircharge.

Best solution is to wait with docking until everything is repaired, or pay for the repair when docked.
OS : Arch Linux 64-bit - rolling release

OXPs : My user page

Retired, reachable at lone_wolf@klaas-de-kat.nl

User avatar
Lone_Wolf
---- E L I T E ----
---- E L I T E ----
Posts: 546
Joined: Wed Aug 08, 2007 10:59 pm
Location: Netherlands

Re: RepairBots OXP

Post by Lone_Wolf »

I've always found repair bots are slow in fixing repairs and looked into speeding it up.

repairtime = base + Math.ceil(Math.random() * rnd_fac);
repair bots itself : base =60, rnd_fac =120 . repairtime is between 60 and 180 seconds
other equipment : base = 120, rnd_fac = 180 > repairtime between 120 and 300 seconds

I'm currently thinking about having 4 types of recharges for next version :
basic : same as now

Standard : speed * 2 , price * 3
times : 30 - 90 & 60 - 150

Advanced : speed * 3 , price * 6
times : 20 - 60 & 40 - 100

Military grade : speed * 6, price * 10
times : 10 - 30 & 20 - 50

Comment on this idea please.
OS : Arch Linux 64-bit - rolling release

OXPs : My user page

Retired, reachable at lone_wolf@klaas-de-kat.nl

User avatar
Day
---- E L I T E ----
---- E L I T E ----
Posts: 530
Joined: Tue Mar 03, 2015 11:35 am
Location: Paris

Re: RepairBots OXP

Post by Day »

I'm still in the stage where money is scarce: fully equipped ship, and between 20.000 and 100.000 credits.
Bought a slow freighter, I'm constantly followed and hit by ne'er-do-wells.

I love the auto-repair bots and this proposition would make the period where I struggle for money longer. I'm all for it :-)

User avatar
Lone_Wolf
---- E L I T E ----
---- E L I T E ----
Posts: 546
Joined: Wed Aug 08, 2007 10:59 pm
Location: Netherlands

Re: RepairBots OXP

Post by Lone_Wolf »

After looking thoroughly into RB code I decided a redesign of RB is needed to get rid of the timers .
The new design is almost completely event-driven and will allow the different rechargetypes mentioned earlier .
For now it will continue to use the "RB controller first,random selected device otherwise" policy but does allow other selection mechanisms like FIFO, LIFO and priority-based .

The code below should give an idea how i want to implement things.

Code: Select all

"use strict";
this.name = "Repair Bots";
this.author = "Thargoid,Lone_Wolf";
this.copyright = "Creative Commons Attribution - Non-Commercial - Share Alike 3.0 license with clauses - see readme.txt.";
this.description = "main repairbots script";
this.version = "3.0.0";

this._rb_repair_list = [];
// list of items to be repaired

this._rb_chances = [];
// 2-dimensional arry, repair chance for all known equipment items 

this._rb_speedup = 1;
// higher setting will make repairs go faster

this._rb_bot_status  = 0;
// 0 : bots offline
// 1 : busy repairing
// 2 : repair success
// 3 : repair failed

this._rb_item_under_repair = { eq:"none", reptime:0, chance:0 }


this.startUpComplete = function()
	{ 
	 if ( !missionVariables.repairCounter ) { missionVariables.repairCounter = 0; }
	 this._rb_bot_status = ( missionVariables === 0 ) ? 0 : 1;
	 this._rb_initialise_repair_chances;
	 this._rb_check_systems;
	};

        
this._rb_repair_control = function()
  {
    /* 
      called when : 
      ship exits hyperspace
      ship launches from dock
      repair timer has finished one repair attempt
      equipmentDamaged
      equipmentRepaired 
    */
    // bots don't work while docked or in hyperspace , should never happen
    if ( player.ship.status !== "STATUS_IN_FLIGHT" ) { return;};
    // offline bots can't do repairs
    if ( this._rb_bot_status === 0 ) { return; };
    // are we already repairing something ?
    if ( this._rb_bot_status === 1 ) { return; };
    // is there something to repair ?
    if ( this._rb_repair_list.length === 0 ) { return; };
    // do we have repair charges available  ?
    if ( missionVariables.repairCounter === 0 ) 
      { this._rb_bot_status = 0;
        player.consoleMessage("Repair System offline - out of nanobots", 6 );
        return;
      };
    if ( this._rb_repair_item_timer )
      {
        this._rb_repair_item_timer.stop(); 
        delete this._rb_repair_item_timer;
      };
    this._rb_bot_status = 1;
    missionVariables.repairCounter -= 1;
    this._rb_item_under_repair.eq = this._rb_select_item();
    this._rb_item_under_repair.reptime = this._rb_calc_reptime(this._rb_item_under_repair.eq);
    this._rb_item_under_repair.chance = this._rb_calc_chance(this._rb_item_under_repair.eq);
    this._rb_repair_item_timer = new Timer(this, this._rb_repair_item, this._rb_item_under_repair.reptime, -1);
  };

this._rb_repair_item = function()
  {
    var eq = this._rb-item_under_repair.eq
    if ( Math.random() < this._rb_item_under_repair.chance )
      {
        // repair succesfull
        // remove item from list
        this._rb_repair_list.splice(this._rb_repair_list.indexOf( eq ), 1)
        this._rb_bot_status = 2;
        player.consoleMessage( EquipmentInfo.infoForKey(eq).name + " online and operational.", 5 );
        this._rb_fix_item( eq );

      }
    else
      {
        // repair failed
        this._rb_bot_status = 3;
        player.consoleMessage( EquipmentInfo.infoForKey(eq).name + " repair attempt failed - work continuing.", 5 );
      };

    this._rb_repair_control;
  };

this._rb_fix_item = function(eq)
  {
    player.ship.setEquipmentStatus(eq,"EQUIPMENT_OK"); // actually fix the thing!
    // deal with specific OXP equipment which need rebooting after fixing, or have other issues.
    switch ( eq )
      {
        case "EQ_FRAME_FUEL_COLLECTOR":
          worldScripts["Fuel Collector"].shipLaunchedFromStation(); // restart the timers in it's world script
          break;
        case "EQ_FRAME_BOUNTY_SCANNER":                 
          worldScripts["Bounty Scanner"].shipLaunchedFromStation(); // restart the timers in it's world script
          break;
        case "EQ_EEU":
          worldScripts["Emergency Energy Unit"].shipLaunchedFromStation(); // restart the timers in it's world script
          break;
        case "EQ_ROCKHERMIT_SCANNER"
          worldScripts["rockHermit_Locator"].shipLaunchedFromStation() // use the inbuild scripting of the OXP to restart it.
          break;
        default:
          break;
      };
  };

  
this._rb_initialise_repair_chances = function()
  {
    var eq_info = equipmentInfo.allEquipment;
    for ( list_counter =0; list_counter<eq_info.length; list_counter++ )
      {
        var chance = -1;
        if ( eq_info[list_counter].damageProbability === 0 )
          { 
            // invulnerable equipment will never need repairs
            chance = 0;
          }
        else
          {
            var rb_chance = eq_info[list_counter].scriptInfo.thargoidRepairBotChance;
            if ( rb_chance !== undefined && !isNaN(rb_chance) ) 
              { 
                chance = ( rb_chance < 0 ) ? 0 : rb_chance;
              }
            else
              {
                // no usable thargoidRepairBotChance set
                chance = this._rb_calc_chance( eq_info[list_counter].effectiveTechLevel );
              };
          };
        this._rb_chances.[eq_info[list_counter].equipmentKey] = chance;
      };
    
  };


this._rb_calc_chance = function(tech_level)
  {
    if ( tech_level < 9 ) { return 1; };
    if ( tech_level > 8 && tech_level < 17 ) { return 1 - ( (tech_level - 8)/10 ); };
    if ( tech_level < 99 ) { return 0.2; };
    return 0.1;
  };
  
this._rb_checkSystems = function()  
  {
    // called when game is loaded
    this._rb_repair_list = [];
    var equipment = player.ship.equipment;
    for ( listCounter = 0; listCounter<equipment.length; listCounter++ )
      {
        
        // if it's broke and fixable, add it to the list.
        var eq = equipment[listCounter].equipmentKey;
        if ( this._rb_is_fixable(eq) )
          {
            this._rb_repair_list.push( { eq, this._rb_chances[eq] } );
          }; 
      };
  };

this._rb_is_fixable = function(eq)
  {
    // returns true if eq is broken & fixable, otherwise false
    var fixable = false;
    if ( player.ship.equipmentStatus(eq) === "EQUIPMENT_DAMAGED" && this._rb_chances[eq] > 0 )
      { fixable = true;};
    return fixable;
  };


this._rb_select_item = function()
  {
    // returns key for equipment to be repaired
    var eq="";
    var base = 0;
    var rnd_fac = 0;
    if ( this._rb_repair_list.indexOf("EQ_REPAIRBOTS_CONTROLLER") !== -1 )
     {
       // RB controller damaged,fix first
       eq = "EQ_REPAIRBOTS_CONTROLLER";
       base = 60; rnd_fac = 120;
     }
    else
      {
        // RB controller is fine, select a random item
        // in future versions choice made based on FIFO,LIFO or priority may be also possible here
        index = Math.floor( Math.random() * this._rb_repair_list.length );
        eq = this._rb__rb_repair_list[index];
        base = 120; rnd_fac = 180;
      };
    this._rb_item_under_repair.eq = eq
    this._rb_item_under_repair.reptime = this._rb_calc_reptime( base, rnd_fac );
    this._rb_item_under_repair.chance = this._rb_calc_chance( eq );
    return eq;
  };
  


this._rb_calc_reptime = function(base,rnd_fac)
  {
    // returns repairtime in seconds
    var reptime = base + Math.ceil(Math.random() * rnd_fac);
    reptime = Math.ceil( reptime / this._rb_speedUp );
    return reptime;
  };
OS : Arch Linux 64-bit - rolling release

OXPs : My user page

Retired, reachable at lone_wolf@klaas-de-kat.nl

Post Reply