Page 117 of 118

Re: Scripters cove

Posted: Mon Aug 19, 2024 12:06 am
by phkb
Wildeblood wrote: Mon Aug 05, 2024 7:24 pm
I'm still having fun with screen backgrounds, and my next question is, can I switch off the rotating planet model on the F7 screen?
Not easily. I experimented with forcing the system to be a nova system (just temporarily), which would then allow you to manipulate the "system_data_nova" screen backgrounds id, but that was a bust. The nova settings for a system are readonly except for "system.sun.goNova" and "system.sun.cancelNova". But the "system_data_nova" background only applies if the sun has *gone* nova, at which point you can't "cancelNova" to change it back.

So my recommendation is that you'd need to replace the F7 screen with a custom mission screen, triggered whenever the player tries to visit the F7 screen.

Re: Scripters cove

Posted: Mon Aug 19, 2024 7:58 am
by Wildeblood
phkb wrote: Mon Aug 19, 2024 12:06 am
Wildeblood wrote: Mon Aug 05, 2024 7:24 pm
I'm still having fun with screen backgrounds, and my next question is, can I switch off the rotating planet model on the F7 screen?
Not easily. I experimented with forcing the system to be a nova system (just temporarily), which would then allow you to manipulate the "system_data_nova" screen backgrounds id, but that was a bust. The nova settings for a system are read-only...
Methinks, you do like to do things the hard way. If there's no "official" way to switch off the planet model, I would have tried experimenting with the planet's texture, attempting to make it transparent, or the planet's radius, trying to make it imperceptibly small, before I thought to mess about with the nova settings. Have you ever tried those approaches?

Re: Scripters cove

Posted: Wed Sep 04, 2024 5:23 am
by Wildeblood
Can anyone offer any advice, how to proceed, here? This is my first attempt at a _checkForDamage function, which loops through player.ship.equipment until it finds something damaged, then returns true. Or, returns false if it gets all the way through.

Code: Select all

    this._checkForDamage = function () {
        "use strict";
        var self = player.ship;
        for (var i = 0; i < self.equipment.length; i++) {
            if (self.equipment[i].isVisible &&
                self.equipmentStatus(self.equipment[i]) === "EQUIPMENT_DAMAGED") {
                this._repairsNeeded = true;
                return true;
            }
        }
        this._repairsNeeded = false;
        return false;
    }
When it came time to make use of the function, I was somewhat disappointed at the result, and left myself this note:-

The flag, _repairsNeeded, is surprisingly frustrating.
It encourages me to check the F3 screen, where I learn
the repairs I need are not available on this low-tech
station. What's actually needed is a _repairsAvailable
flag.

So, that is the question, how does one find what equipment repairs are available at the current station, and compare them to what is needed?

Re: Scripters cove

Posted: Wed Sep 04, 2024 5:46 am
by Cholmondely
Wildeblood wrote: Wed Sep 04, 2024 5:23 am
Can anyone offer any advice, how to proceed, here? This is my first attempt at a _checkForDamage function, which loops through player.ship.equipment until it finds something damaged, then returns true. Or, returns false if it gets all the way through.

Code: Select all

    this._checkForDamage = function () {
        "use strict";
        var self = player.ship;
        for (var i = 0; i < self.equipment.length; i++) {
            if (self.equipment[i].isVisible &&
                self.equipmentStatus(self.equipment[i]) === "EQUIPMENT_DAMAGED") {
                this._repairsNeeded = true;
                return true;
            }
        }
        this._repairsNeeded = false;
        return false;
    }
When it came time to make use of the function, I was somewhat disappointed at the result, and left myself this note:-

The flag, _repairsNeeded, is surprisingly frustrating.
It encourages me to check the F3 screen, where I learn
the repairs I need are not available on this low-tech
station. What's actually needed is a _repairsAvailable
flag.

So, that is the question, how does one find what equipment repairs are available at the current station, and compare them to what is needed?
Are there not OXPs which do this? And will have relevant code built in?

Here's a screen shot from Damage Report MFD:

Image

And the script should be on Hiran's database!

Re: Scripters cove

Posted: Wed Sep 04, 2024 5:48 am
by Wildeblood
I'll have a look. Ta.

LOL @ Nick's version history:

2.2.1
- Fixed missing ";" in Javascript file.

Re: Scripters cove

Posted: Mon Oct 14, 2024 4:57 pm
by Redspear
Is there a recommended way to get the script from oxp A to run before the script from oxp B?

As author of both oxps (in this case) I should have considerable options but I do wish for the two scripts to remain seperate.

BTW 'startup' and 'startup complete' are not likely options as both scripts currently operate 'on the fly'.

Re: Scripters cove

Posted: Mon Oct 14, 2024 5:24 pm
by hiran
Redspear wrote: Mon Oct 14, 2024 4:57 pm
Is there a recommended way to get the script from oxp A to run before the script from oxp B?
Interesting question indeed:
If multiple OXPs react on the same event (e.g. attackedByShip) are the OXPs' shipscripts invoked in parallel via multiple threads? Or invoked sequentially on the same thread?

If there is a sequence, is it guarantees to always be the same? And if it is the same, how can an OXP author influence it?

Re: Scripters cove

Posted: Mon Oct 14, 2024 10:07 pm
by Wildeblood
hiran wrote: Mon Oct 14, 2024 5:24 pm
If multiple OXPs react on the same event (e.g. attackedByShip) are the OXPs' shipscripts invoked in parallel via multiple threads? Or invoked sequentially on the same thread?

If there is a sequence, is it guarantees to always be the same? And if it is the same, how can an OXP author influence it?
Sequentially, the sequence being OS dependent, so not reliable, I believe.

Re: Scripters cove

Posted: Mon Oct 14, 2024 10:13 pm
by hiran
Wildeblood wrote: Mon Oct 14, 2024 10:07 pm
hiran wrote: Mon Oct 14, 2024 5:24 pm
If multiple OXPs react on the same event (e.g. attackedByShip) are the OXPs' shipscripts invoked in parallel via multiple threads? Or invoked sequentially on the same thread?

If there is a sequence, is it guarantees to always be the same? And if it is the same, how can an OXP author influence it?
Sequentially, the sequence being OS dependent, so not reliable, I believe.
I do not know why Redspear asked but believe there is a good reason for it.
If we find the location where OXP references are kept in Oolite, maybe we can sort it and thus know the execution order. And we would know how to tweak it....

Re: Scripters cove

Posted: Mon Oct 14, 2024 10:15 pm
by Wildeblood
Redspear wrote: Mon Oct 14, 2024 4:57 pm
Is there a recommended way to get the script from oxp A to run before the script from oxp B?

As author of both oxps (in this case) I should have considerable options but I do wish for the two scripts to remain seperate.

BTW 'startup' and 'startup complete' are not likely options as both scripts currently operate 'on the fly'.
You just call the pertinent function in script A from script B, before script B does anything else relevant. This seems basic, so what are you not saying? You mention start-up, so are you talking about some kind of configuration process that only runs once, or about an event listener that will be repeatedly called?

Re: Scripters cove

Posted: Mon Oct 14, 2024 10:20 pm
by Wildeblood
hiran wrote: Mon Oct 14, 2024 10:13 pm
If we find the location where OXP references are kept in Oolite, maybe we can sort it and thus know the execution order. And we would know how to tweak it....
A-C or phkb can confirm or correct this, but my understanding from days of yore is that scripts are run in the order they are first loaded into the cache, and that depends on the OS; on some it's alphabetically and on some it's by datestamp, etc.

Re: Scripters cove

Posted: Mon Oct 14, 2024 11:12 pm
by phkb
Redspear wrote: Mon Oct 14, 2024 4:57 pm
Is there a recommended way to get the script from oxp A to run before the script from oxp B?
This is probably the easiest method I know (and by easiest I mean the fewest number of moving parts):

Code: Select all

"use strict";
this.name = "MyScriptA";

this.$function1 = function() {
    log(this.name, "This will always run first");
}

// this function would only be used if MyScriptB is present AND there are places in MyScriptA where $function1 is called.
// the assumption is, the same triggers apply to both MyScriptA and MyScriptB
// by creating an empty function, we can ensure the trigger only fires once, and be initated from MyScriptB
this.$function1_Inactive = function() {}

Code: Select all

"use strict";
this.name = "MyScriptB";

this._runFunction1 = false; // flag to indicate whether we need to run $function1

this.startUp = function() {
    // check if MyScriptA is present
    if (worldScripts.MyScriptA) {
        log(this.name, "Monkey-patching MyScriptA to ensure correct order of events");
        var ws = worldScripts.MyScriptA;
        // monkey-patch MyScriptA, moving $function1 to a new location and resetting the original function name
        ws.$function1_Hold = ws.$function1;
        ws.$function1 = ws.$function1_Inactive;
    
        // turn on flag so we know to call MyScriptA (saves having to go to the worldScripts object unless required)        
        this._runFunction1 = true;
    }
}

this.$function2 = function() {
    if (this._runFunction1) {
        // run the function in MyScriptA
        worldScripts.MyScriptA.$function1_Hold();
    }
    log(this.name, "This will always run second");
}
Hopefully that makes sense. Let me know if something requires additional explanation.

Yes, it's using the monkey-patch method, but given both scripts are in the author's control, the impact should be minimal.
Wildeblood wrote: Mon Oct 14, 2024 10:20 pm
scripts are run in the order they are first loaded into the cache, and that depends on the OS; on some it's alphabetically and on some it's by datestamp, etc.
Probably. Best rule of thumb is: If you need things run in a particular order, do it yourself.

Re: Scripters cove

Posted: Tue Oct 15, 2024 6:53 am
by hiran
Wildeblood wrote: Mon Oct 14, 2024 10:20 pm
hiran wrote: Mon Oct 14, 2024 10:13 pm
If we find the location where OXP references are kept in Oolite, maybe we can sort it and thus know the execution order. And we would know how to tweak it....
A-C or phkb can confirm or correct this, but my understanding from days of yore is that scripts are run in the order they are first loaded into the cache, and that depends on the OS; on some it's alphabetically and on some it's by datestamp, etc.
So there is a sequence, and seems to be stable (across running Oolite - even across all Oolites installed on the same OS).
Now imagine after loading all those scripts they get sorted once and thus the execution order is predictable for us. Not too big a change.

Re: Scripters cove

Posted: Fri Oct 25, 2024 1:35 pm
by Redspear
Wildeblood wrote: Mon Oct 14, 2024 10:15 pm
You mention start-up, so are you talking about some kind of configuration process that only runs once, or about an event listener that will be repeatedly called?
The latter.

phkb wrote: Mon Oct 14, 2024 11:12 pm
Hopefully that makes sense. Let me know if something requires additional explanation.
Thanks, I'll give that a try.

hiran wrote: Tue Oct 15, 2024 6:53 am
So there is a sequence, and seems to be stable (across running Oolite - even across all Oolites installed on the same OS).
Now imagine after loading all those scripts they get sorted once and thus the execution order is predictable for us. Not too big a change.
I thought it was alphabetical myself but that doesn't seem to always be the case.

Re: Scripters cove

Posted: Fri Oct 25, 2024 8:39 pm
by hiran
hiran wrote: Tue Oct 15, 2024 6:53 am
Wildeblood wrote: Mon Oct 14, 2024 10:20 pm
A-C or phkb can confirm or correct this, but my understanding from days of yore is that scripts are run in the order they are first loaded into the cache, and that depends on the OS; on some it's alphabetically and on some it's by datestamp, etc.
So there is a sequence, and seems to be stable (across running Oolite - even across all Oolites installed on the same OS).
Now imagine after loading all those scripts they get sorted once and thus the execution order is predictable for us. Not too big a change.
Trying to find something I looked through the code, and somehow this caught my attention:
https://github.com/OoliteProject/oolite ... ity.h#L380

Is it that this NSDictionary collects all the world scripts? Could it be that a dictionary internally ends up to be a hashmap and therefore the sequence is not predictable? Could we change this to some container that preserves a sequence? As soon as it does, sorting can be applied...

I'd love to have a comment of someone with ObjectiveC experience or at least a working development environment to debug and verify the behaviour.

Edit: I can answer part of my questions: An NSDictionary does not guarantee any order. See this page: https://stackoverflow.com/questions/268 ... er-changes
Which means so far we have been lucky that the list looked sorted.