Page 1 of 2
AI Speed commands
Posted: Wed Oct 21, 2009 7:07 am
by Thargoid
Small request, aside from the current setSpeedTo: and setSpeedFactorTo: , would it be possible to have commands to just increase and decrease speed by a given amount (either absolute, factor percentage or perhaps both by seperate command)?
I'm thinking here to semi-realistically allow controlled acceleration and deceleration of ships and such by using such a command in conjunction with the update event (and without having to go through a lot of steps with specifically set speeds or speed factors).
At the moment a lot of ships seem to come to a halt as if they've hit a brick wall and then zoom off in a fashion that would have their pilots laminated onto the back wall of the cockpit, depending on their shipdata settings. Having controllable acceleration/deceleration might allow a simple-ish work-around for that?
Re: AI Speed commands
Posted: Wed Oct 21, 2009 7:20 am
by Eric Walch
Thargoid wrote:At the moment a lot of ships seem to come to a halt as if they've hit a brick wall and then zoom off in a fashion that would have their pilots laminated onto the back wall of the cockpit, depending on their shipdata settings. Having controllable acceleration/deceleration might allow a simple-ish work-around for that?
To my knowledge that is already build in since the early oolite days, but a lot of ship designers want super fast ships that stop like they hit a brick wall.
Look at a ship like the Behemoth. That was designed by Aegidean. He knew how to make things realistic and gives heavy ships like a Behemoth a realistic decelerate value.
Posted: Wed Oct 21, 2009 7:27 am
by Zieman
It's the Thrust value in shipdata.plist - with lower values more time is needed to reach the set speed.
Posted: Wed Oct 21, 2009 7:40 am
by Thargoid
The example I want it for is a de-activated missile (minesweeper operation). Once de-activated, I want it to slow down gradually as if suddenly unpowered but from its original speed (ie natural slow deceleration, rather than a forced stop). But currently without a lot of messing around and multiple AI states it's not actually possible to do, which surprised me.
Basically I'm looking to increase/decrease speed by a given value or percentage of maxSpeed, not to a given value or percentage (if you see the distinction).
Zieman wrote:It's the Thrust value in shipdata.plist - with lower values more time is needed to reach the set speed.
Yes I know that, but it's an all or nothing setting, and can't be changed iirc for a given situation (so won't be any use at all in the above scenario).
I'm just trying to be a little more realistic here and have a ship that doesn't have binary accelerator and brake pedals (plus it would be nice for ships to slow down rather than dead-stop before performing tumble etc when looking for targets and such, as some AIs at the moment make ship behaviour in this situation look very odd).
Posted: Wed Oct 21, 2009 9:23 am
by Eric Walch
Thargoid wrote:(plus it would be nice for ships to slow down rather than dead-stop before performing tumble etc when looking for targets and such, as some AIs at the moment make ship behaviour in this situation look very odd).
There is no command in Oolite that can set a ship at "dead-stop", even not the performTumble or performStop. No command can set speed directly, only desired-speed can be defined. And everything slows down to desired speed using the thrust value.
What you are looking for is more a different thrust for acceleration and deceleration. Or even thrust as a read/write value?
Posted: Wed Oct 21, 2009 9:26 am
by Thargoid
performStop or setSpeedFactorTo: 0.0 combined with the thrust values of most ships (and missiles in this case) will effectively cause a dead-stop. It's only the bigger ships like the Behemoth where the thrust setting is low that a gradual stop can be achieved.
But you are correct though in approximating what I want to a variable thrust, but it would be more convenient to have commands to increaseSpeedBy / increaseSpeedFactorBy plus the decrease mirrors rather than having to mess around with thrust level and then to set the speed (factor) to a fixed value.
Posted: Wed Oct 21, 2009 9:46 am
by Eric Walch
Thargoid wrote:performStop or setSpeedFactorTo: 0.0 combined with the thrust values of most ships (and missiles in this case) will effectively cause a dead-stop.
It is not a dead stop. When you look in shipdata for a missile it has a maxSpeed of 750 and a thrust value of 250. Thrust is the speed change per second. So even a missile should take 3 seconds to come to a full stop. Anything fasted would be a bug.
Posted: Wed Oct 21, 2009 10:03 am
by Thargoid
Let me double-check tonight again with a test missile.
But I recall seeing something similar with the hired guns ships. They have max speed of 1000 and thrust of 100 (for the viper-interceptor model) and I can recall seeing them in the past dead-stop, tumble and then shoot off in a different direction. Maybe something I'm doing wrong there in the AI/js, but it's an oddity.
Posted: Wed Oct 21, 2009 10:46 am
by Eric Walch
Thargoid wrote:Basically I'm looking to increase/decrease speed by a given value or percentage of maxSpeed, not to a given value or percentage (if you see the distinction).
For me this sound very counter productive because this is exactly that the code already is doing constantly. I think something like "setThrustFactorTo:" would be better. Only accepting values between 0 and 1. And effectively setting the used trust to this percentage of the thrust defined in shipdata. This way the AI does dot need to constantly change speeds and oolites own speed regulation can do its job.
For a slow halt you than can use: ("setThrustFactorTo: 0.01", performStop)
EDIT: or would the name "setEnginePowerTo:" be better? Also within the range 0 to 1 (0 to 100%)
Posted: Wed Oct 21, 2009 11:24 am
by Thargoid
That would work yes. I was originally thinking of something like ("decreaseSpeedFactorBy: 0.1") as an update or repeatedly called event, thus reducing speed by 10% of max every time. If it was capped at 0 speed (with message "MIN_SPEED" or somesuch) and maxSpeed (with message "MAX_SPEED" or similar) then that too would work.
And I wouldn't think it would be too difficult to code, as all your doing is adding or subtracting maxSpeed * the argument to the current speed set point.
Posted: Wed Oct 21, 2009 11:55 am
by phonebook
wouldn't a dead stop in space hurtle you towards the nearest planet, moon or star?
Posted: Wed Oct 21, 2009 12:34 pm
by Commander McLane
There are differing views on the question whether there is gravitation in Oolite.
I think I observed it once.
The experts say it isn't in the code. Go figure...
Posted: Wed Oct 21, 2009 4:35 pm
by Thargoid
Anyway, back to the original question. I've tested a missile that when launched gets minesweepered by the following code snippets:
Code: Select all
function localMines(entity) {
var isWeapon = entity.isWeapon,
isActive = entity.AI !== "TCAT_deactivatedAI.plist",
mines = [
"EQ_QC_MINE", "EQ_RMB_CASCADE_MISSILE", "EQ_RMB_LAW_MISSILE", "EQ_RMB_OVERRIDE_MISSILE",
"energy-bomb", "EQ_NUKE2_MISSILE", "EQ_HARPOON_NUKE2_MISSILE", "EQ_PHOTON_MISSILE", "RANDOM_HITS_MINE"],
isLocalMine = mines.some(function (mine, i, array) {return entity.hasRole(mine);});
return isWeapon && isActive && isLocalMine;
}
this.mineScan = function()
{
this.mineArray = system.filteredEntities(this, localMines, this.ship, 25600);
if(this.mineArray.length > 0)
{
player.consoleMessage("Quirium suppression field detected", 6);
this.mineArray.forEach(function (mine) {mine.setAI("TCAT_deactivatedAI.plist"); mine.displayName = "Disarmed " + mine.displayName;})
}
}
where the AI is:
Code: Select all
{
GLOBAL =
{
ENTER = (switchLightsOff, throwSparks, "setSpeedFactorTo: 0.0");
UPDATE = ("setStateTo: WAITFORIT");
};
"WAITFORIT" =
{
ENTER = ("randomPauseAI: 20.0 60.0");
UPDATE = (becomeExplosion);
};
}
When tried on a photon torpedo from RMB via OSE (max speed 3000, thrust 360) it carries on its merry way at a speed of a little under 3000, circles the target station and then smacks into it but doesn't trigger the cascade explosion. So in the correct sense it is disarmed, but either the deactivation AI isn't working (although when checked with the console it is in the right AI, in state "WAITFORIT") or there's some hang-over from its original AI into the new one?
Editted to add - and if I replace the setSpeedFactor in the AI with performStop, the missiles travel a grand total of about 130m (js position to ship position, with me in a SuperCobra) before coming to a complete stop (ie they dead-stop on launch). They're in the AI correctly, as they sit for a minute or two and then explode as they should.
So one way or t'other, something here's bust methinks.
Posted: Wed Oct 21, 2009 4:52 pm
by Eric Walch
Thargoid wrote: or there's some hang-over from its original AI into the new one?
It is still flying in performIntercept. You must give it a new behaviour. e.g. performIdle.
And on the variable thrust: it now works for me in my compile. Using "setEnginePowerTo: 0.01" and than doing a "performStop" will make it takes ages before the missile comes to a complete stop. (Should be 100 times longer but I did not check the distance).
Posted: Wed Oct 21, 2009 4:59 pm
by Thargoid
performStop makes it dead-stop though, certainly not in the 8 or so seconds it should via the simple thrust/speed calculation. I'll try adding a performIdle or performTumble with the setSpeedFactor and see what we get.
I've PM'd you a link to the WIP if you want to try it yourself.
Editted to add - if I do "performIdle" in addition to the setSpeedFactorTo in the code above, it works same as performStop - ie the missiles just deadstop immediately on launch when their AI's get swapped, no slowdown at thrust rates...