Join us at the Oolite Anniversary Party -- London, 7th July 2024, 1pm
More details in this thread.

Just when I thought I was out...

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

Moderators: another_commander, winston

User avatar
Roberto
---- E L I T E ----
---- E L I T E ----
Posts: 318
Joined: Sun Jun 11, 2006 1:16 pm
Location: London, UK

Post by Roberto »

If it's reading it only once per system, presumably I don't need to reset at the end, right? Here's what I'm about to test (I'm still unsure as to whether there should be some more <dict>s in there):

Code: Select all

			<string>checkForShips: taranis_frigate</string>
				<dict>
					<key>conditions</key>
					<array>
					<string>shipsFound_number lessthan 1</string>
					</array>
					<key>do</key>
					<array>
					<string>set: taranis_frigate_d100 [d100_number]</string>
						<key>conditions</key>
						<array>
						<string>taranis_frigate_d100 equal 1</string>
						</array>
						<key>do</key>
						<array>
						<string>addShipsAtPrecisely: taranis_frigate 1 pwm 145000 -29000 60500</string>
						</array>
						<key>conditions</key>
						<array>
						<string>taranis_frigate_d100 equal 2</string>
						</array>
						<key>do</key>
						<array>
						<string>addShipsAtPrecisely: taranis_frigate 1 pwm 250024.81 25.77 -102991.52</string>
						</array>
						<key>conditions</key>
						<array>
						<string>taranis_frigate_d100 equal 3</string>
						</array>
						<key>do</key>
						<array>
						<string>addShipsAtPrecisely: taranis_frigate 1 pwm 178372.66 -9495.88 142342.08</string>
						</array>
						<key>conditions</key>
						<array>
						<string>taranis_frigate_d100 equal 4</string>
						</array>
						<key>do</key>
						<array>
						<string>addShipsAtPrecisely: taranis_frigate 1 pwm 41048.76 33024.20 -3352.26</string>
						</array>
						<key>conditions</key>
						<array>
						<string>taranis_frigate_d100 equal 5</string>
						</array>
						<key>do</key>
						<array>
						<string>addShipsAtPrecisely: taranis_frigate 1 pwm 178919.30 -39904.60 73889.03</string>
						</array>
					</array>
				</dict>
User avatar
JensAyton
Grand Admiral Emeritus
Grand Admiral Emeritus
Posts: 6657
Joined: Sat Apr 02, 2005 2:43 pm
Location: Sweden
Contact:

Post by JensAyton »

<key> only makes sense inside a <dict>, and each condition/do/else needs to be in a dictionary. This really is easier using the OpenStep syntax instead of XML; this:

Code: Select all

<dict>
    <key>conditions</key>
    <array>
        <string>your-conditions-here</string>
    </array>
    <key>do</key>
    <array>
        <string>your-actions-here</string>
    </array>
</dict>
becomes

Code: Select all

{
    conditions = ( "your-conditions-here" );
    do = ( "your-actions-here" );
}
See http://wiki.alioth.net/index.php/Property_list for more information on the two syntaxes.
User avatar
Roberto
---- E L I T E ----
---- E L I T E ----
Posts: 318
Joined: Sun Jun 11, 2006 1:16 pm
Location: London, UK

Post by Roberto »

Thanks Ahruman.
User avatar
Roberto
---- E L I T E ----
---- E L I T E ----
Posts: 318
Joined: Sun Jun 11, 2006 1:16 pm
Location: London, UK

Post by Roberto »

I've left it as XML (though I've used OpenStep elsewhere), because I just want to get this done now. And it's still not working... :(

Code: Select all

			<string>checkForShips: taranis_frigate</string>
				<dict>
					<key>conditions</key>
					<array>
					<string>shipsFound_number lessthan 1</string>
					</array>
					<key>do</key>
					<array>
					<string>set: taranis_frigate_d100 [d100_number]</string>
						<dict>
						<key>conditions</key>
						<array>
						<string>taranis_frigate_d100 equal 1</string>
						</array>
						<key>do</key>
						<array>
						<string>addShipsAtPrecisely: taranis_frigate 1 pwm 145000 -29000 60500</string>
						</array>
						</dict>
						<dict>
						<key>conditions</key>
						<array>
						<string>taranis_frigate_d100 equal 2</string>
						</array>
						<key>do</key>
						<array>
						<string>addShipsAtPrecisely: taranis_frigate 1 pwm 250024.81 25.77 -102991.52</string>
						</array>
						</dict>
						<dict>
						<key>conditions</key>
						<array>
						<string>taranis_frigate_d100 equal 3</string>
						</array>
						<key>do</key>
						<array>
						<string>addShipsAtPrecisely: taranis_frigate 1 pwm 178372.66 -9495.88 142342.08</string>
						</array>
						</dict>
						<dict>
						<key>conditions</key>
						<array>
						<string>taranis_frigate_d100 equal 4</string>
						</array>
						<key>do</key>
						<array>
						<string>addShipsAtPrecisely: taranis_frigate 1 pwm 41048.76 33024.20 -3352.26</string>
						</array>
						</dict>
						<dict>
						<key>conditions</key>
						<array>
						<string>taranis_frigate_d100 equal 5</string>
						</array>
						<key>do</key>
						<array>
						<string>addShipsAtPrecisely: taranis_frigate 1 pwm 178919.30 -39904.60 73889.03</string>
						</array>
						</dict>
					</array>
				</dict>
(To test it, I added 45 more possibilities to up the odds to 50%, but I've been in and out of the system God knows how many times, and nothing.)
User avatar
LittleBear
---- E L I T E ----
---- E L I T E ----
Posts: 2867
Joined: Tue Apr 04, 2006 7:02 pm
Location: On a survey mission for GalCop. Ship: Cobra Corvette: Hidden Dragon Rated: Deadly.

Post by LittleBear »

This might be an easier way to do it (might work better on the dice). In descriptions .plist set an array with the different co-ordinates as variables. Eg somthing like:-

Code: Select all

	<key>mission_my_mission_start_position_number</key>
	<array>
	<string>145000 -29000 60500</string>
	<string>250024.81 25.77 -102991.52</string>

...  etc etc for all your different co-ords

	</array>

Then in script you only need one command of:-

Code: Select all

addShipsAtPrecisely: taranis_frigate 1 pwm [mission_my_mission_start_position_number]
Cos Oolite randomly picks one of your co-ordinate numbers in the strings from the list set as [mission_my_mission_start_position_number], that should work to give you the random effect you want. I used this wheeze in RandomHits to get a random number of rocks near the Space Bars and create a random starting position for the victims.
[/code]
OXPS : The Assassins Guild, Asteroid Storm, The Bank of the Black Monks, Random Hits, The Galactic Almanac, Renegade Pirates can be downloaded from the Elite Wiki here.
User avatar
Roberto
---- E L I T E ----
---- E L I T E ----
Posts: 318
Joined: Sun Jun 11, 2006 1:16 pm
Location: London, UK

Post by Roberto »

Thanks LB - I'll give that a try.

*EDIT* Well, it works... except that it always seems to select the first set of coordinates. Like, five or six times in a row.
User avatar
Kaks
Quite Grand Sub-Admiral
Quite Grand Sub-Admiral
Posts: 3009
Joined: Mon Jan 21, 2008 11:41 pm
Location: The Big Smoke

Post by Kaks »

If you haven't done it yet, try resetting the d100 variable! If you don't you'll be getting the same 'random' result over and over...
Hey, free OXPs: farsun v1.05 & tty v0.5! :0)
User avatar
Roberto
---- E L I T E ----
---- E L I T E ----
Posts: 318
Joined: Sun Jun 11, 2006 1:16 pm
Location: London, UK

Post by Roberto »

*Sobs quietly*

But shouldn't it do a new roll every time I enter the system? In any case, descriptions.plist is failing to generate randomness.

OK, I've put (most of) planetinfo into OpenStep format now...

Code: Select all

{
	conditions = ("galaxy_number equal 0", "planet_number equal 141");
	do = (
		"checkForShips: taranis",
				{
				conditions = ("shipsFound_number lessthan 1");
				do = ("addShipsAtPrecisely: taranis 1 pwm 147000 -30000 60000");
				},
		"checkForShips: taranis_frigate",
				{
				conditions = ("shipsFound_number lessthan 1");
				do = (
				"set: taranis_frigate_d100 [d100_number]",
					{
					conditions = ("taranis_frigate_d100 equal 1");
					do = ("addShipsAtPrecisely: taranis_frigate 1 pwm 145000 -29000 60500");
					},
					{
					conditions = ("taranis_frigate_d100 equal 2");
					do = ("addShipsAtPrecisely: taranis_frigate 1 pwm 250024.81 25.77 -102991.52");
					},
					{
					conditions = ("taranis_frigate_d100 equal 3");
					do = ("addShipsAtPrecisely: taranis_frigate 1 pwm 178372.66 -9495.88 142342.08");
					},
					{
					conditions = ("taranis_frigate_d100 equal 4");
					do = ("addShipsAtPrecisely: taranis_frigate 1 pwm 41048.76 33024.20 -3352.26");
					},
					{
					conditions = ("taranis_frigate_d100 equal 5");
					do = ("addShipsAtPrecisely: taranis_frigate 1 pwm 178919.30 -39904.60 73889.03");
					},
				);
				},
		"checkForShips: taranis_billboard",
				{
				conditions = ("shipsFound_number lessthan 1");
				do = ("addShipsAtPrecisely: taranis_billboard 1 pwm 134090.75 -21957.00 55025.19");
				},
		<key>station</key>
		<string>taranis_sysstation</string>
		<key>description</key>
		<string>This planet is a dull place. The headquarters of shipbuilder Taranis Corp is in high orbit above it.</string>
	</dict>
</dict>
</plist>
How do I convert the two bits at the end, and do I still need to reset taranis_frigate_d100 at the end? (If so, I'm confused as to why - won't Oolite just roll a new number the next time it reads the plist, i.e. when you re-enter the system?)
User avatar
Kaks
Quite Grand Sub-Admiral
Quite Grand Sub-Admiral
Posts: 3009
Joined: Mon Jan 21, 2008 11:41 pm
Location: The Big Smoke

Post by Kaks »

Ok, I'm really confused too.

However, if planetinfo.plist is exactly like this:

Code: Select all

{
	"0 141" = {
		"description" = "This planet is a dull place. The headquarters of shipbuilder Taranis Corp is in high orbit above it.";
		"station" = "taranis_sysstation";
		"script_actions"=(
			"checkForShips: taranis",
			{
				conditions = ("shipsFound_number lessthan 1");
				do = ("addShipsAtPrecisely: taranis 1 pwm 147000 -30000 60000");
			},
			"checkForShips: taranis_frigate",
			{
				conditions = ("shipsFound_number lessthan 1");
				do = (
					"set: mission_taranis_frigate_d100 [d100_number]",
					{
						conditions = ("mission_taranis_frigate_d100 equal 1");
						do = ("addShipsAtPrecisely: taranis_frigate 1 pwm 145000 -29000 60500");
					},
					{
						conditions = ("mission_taranis_frigate_d100 equal 2");
						do = ("addShipsAtPrecisely: taranis_frigate 1 pwm 250024.81 25.77 -102991.52");
					},
					{
						conditions = ("mission_taranis_frigate_d100 equal 3");
						do = ("addShipsAtPrecisely: taranis_frigate 1 pwm 178372.66 -9495.88 142342.08");
					},
					{
						conditions = ("mission_taranis_frigate_d100 equal 4");
						do = ("addShipsAtPrecisely: taranis_frigate 1 pwm 41048.76 33024.20 -3352.26");
					},
					{
						conditions = ("mission_taranis_frigate_d100 equal 5");
						do = ("addShipsAtPrecisely: taranis_frigate 1 pwm 178919.30 -39904.60 73889.03");
					},
					"reset: mission_taranis_frigate_d100"
				);
			},
			"checkForShips: taranis_billboard",
			{
				conditions = ("shipsFound_number lessthan 1");
				do = ("addShipsAtPrecisely: taranis_billboard 1 pwm 134090.75 -21957.00 55025.19");
			},
		);
	},
}
your problems should be over - hoping that I haven't made a typo anywhere...
Hey, free OXPs: farsun v1.05 & tty v0.5! :0)
User avatar
Eric Walch
Slightly Grand Rear Admiral
Slightly Grand Rear Admiral
Posts: 5536
Joined: Sat Jun 16, 2007 3:48 pm
Location: Netherlands

Post by Eric Walch »

Roberto wrote:
*EDIT* Well, it works... except that it always seems to select the first set of coordinates. Like, five or six times in a row.
also my experience with "random" selections from a description.plist. For a certain system, the majority of the selections are always the same. In an other system it might be an other. I noticed this in 1.65/1.69 but it might be also under 1.70.

Just a question why you only select with a chance of 1%. This means you have to enter that specific system 100 times to see it once. It looks a little to rare to me.
User avatar
Commander McLane
---- E L I T E ----
---- E L I T E ----
Posts: 9520
Joined: Thu Dec 14, 2006 9:08 am
Location: a Hacker Outpost in a moderately remote area
Contact:

Post by Commander McLane »

I think the problem is that "random" in Oolite isn't really random; it's, well, pseudo-random, determined by the seed.

I think we can imagine it like a long list of numbers that are somehow randomly evenly distributed between 0 and 99. If a script calls for a random number, the engine just takes the next number from the list.

So, Roberto, if you load a save-game for testing purposes, the list will always be the same, and of course the position the engine has reached on the list will always be the same. Therefore also the next number in the list will always be the same.

In reality and with many OXPs installed this is not so big an issue, because scripts are executed in a random order. So if you reload a savegame, any of the scripts may get the "next number from the list", and your script will then get the second-to-next or third-to-next, which for the player looks more randomly. But in any situation where only one script could require a "next number from the list", it will always get the same number, if started from the same position on the list.
User avatar
Eric Walch
Slightly Grand Rear Admiral
Slightly Grand Rear Admiral
Posts: 5536
Joined: Sat Jun 16, 2007 3:48 pm
Location: Netherlands

Post by Eric Walch »

I think the problem is that "random" in Oolite isn't really random; it's, well, pseudo-random, determined by the seed.
Just for testing purposes I made once a description.plist with content: one, two, three etc. Then in flight I issued a commsMessage with this description on every update. 4 out of 5 time it used the same text. When I jumped into an other system, an other number was the dominant message. When coming back in a system I was before, the same message as before was dominant. Distributed over all systems it is random but within a system some selections are preferred.
User avatar
JensAyton
Grand Admiral Emeritus
Grand Admiral Emeritus
Posts: 6657
Joined: Sat Apr 02, 2005 2:43 pm
Location: Sweden
Contact:

Post by JensAyton »

The problem here is that Oolite uses two different “random” number generators, and both are used both for things that should be “really” random and for things that should be predictable. Maybe we should add a third one for “really really random” things…
User avatar
Kaks
Quite Grand Sub-Admiral
Quite Grand Sub-Admiral
Posts: 3009
Joined: Mon Jan 21, 2008 11:41 pm
Location: The Big Smoke

Post by Kaks »

...or bite the bullet and use javascript for random numbers...
And everything else! :)

- What? Biased? Me? :D
Hey, free OXPs: farsun v1.05 & tty v0.5! :0)
User avatar
Roberto
---- E L I T E ----
---- E L I T E ----
Posts: 318
Joined: Sun Jun 11, 2006 1:16 pm
Location: London, UK

Post by Roberto »

Kaks, I've now got this, but Terminal doesn't like it:

Code: Select all

{
	"0 141" = {
		"description" = "This planet is a dull place. The headquarters of shipbuilder Taranis Corp is in high orbit above it.";
		"station" = "taranis_sysstation";
		"script_actions" = (
			"checkForShips: taranis",
				{
				conditions = ("shipsFound_number lessthan 1");
				do = ("addShipsAtPrecisely: taranis 1 pwm 147000 -30000 60000");
				},
			"checkForShips: taranis_frigate",
				{
				conditions = ("shipsFound_number lessthan 1");
				do = (
				"set: taranis_frigate_d100 [d100_number]",
					{
					conditions = ("taranis_frigate_d100 equal 1");
					do = ("addShipsAtPrecisely: taranis_frigate 1 pwm 145000 -29000 60500");
					},
					{
					conditions = ("taranis_frigate_d100 equal 2");
					do = ("addShipsAtPrecisely: taranis_frigate 1 pwm 250024.81 25.77 -102991.52");
					},
					{
					conditions = ("taranis_frigate_d100 equal 3");
					do = ("addShipsAtPrecisely: taranis_frigate 1 pwm 178372.66 -9495.88 142342.08");
					},
					{
					conditions = ("taranis_frigate_d100 equal 4");
					do = ("addShipsAtPrecisely: taranis_frigate 1 pwm 41048.76 33024.20 -3352.26");
					},
					{
					conditions = ("taranis_frigate_d100 equal 5");
					do = ("addShipsAtPrecisely: taranis_frigate 1 pwm 178919.30 -39904.60 73889.03");
					},
				"reset: taranis_frigate_d100"
				);
				},
			"checkForShips: taranis_billboard",
				{
				conditions = ("shipsFound_number lessthan 1");
				do = ("addShipsAtPrecisely: taranis_billboard 1 pwm 134090.75 -21957.00 55025.19");
				},
		);
	},
}
Apparently this is what's wrong...

XML parser error:
Unexpected character { at line 1
Old-style plist parser error:
Missing ';' on line 45

...and I don't see what I'm supposed to do. Make it open { ( { somehow? :(
Post Reply