Page 1 of 1

Save In Flight OXP v1.0.0

Posted: Mon Sep 12, 2022 7:20 pm
by dybal
Save in Flight OXP v1.0.0 is available here and on the Expansion Manager.

This OXP allows tha player to save the game wihtout the need to dock to a deterministic station.

That's done through a new primeable equipment, Save In Flight, available at TL 1 systems for 0.1 credits.

To save, the player must move away from other ships until the scanner is empty (no ships, asteroids, cargo pods, derelicts, wreckage, sparks, etc.), stop the player ship (speed must be 0), then prime and activate the Save In Flight equipment.

The player ship will be moved to the Station at End of the Universe, where the player can save the game, load another savegame, exit the game.

When the player launches from the Station at End of the Universe, the player ship is moved to the last position the Save In Flight equipment was activated.

This OXP was created based on cim's suggestions here

Re: Save In Flight OXP v1.0.0

Posted: Mon Sep 12, 2022 9:44 pm
by Massively Locked
Great job! For any new Oolite commanders reading this- put this OXZ on your short list to install right off the bat- before the pretty graphics or big-laser-pew-pew-guns. I've been making some tweaks to help preserve the illusion of being in space & not in-station. One of them is restoring the occupied cargo space of g/kg-based goods on launch (been doing lots of mining lately). Anyway- thanks for making this!

Re: Save In Flight OXP v1.0.0

Posted: Mon Sep 12, 2022 11:59 pm
by dybal
Massively Locked wrote: Mon Sep 12, 2022 9:44 pm
Great job! For any new Oolite commanders reading this- put this OXZ on your short list to install right off the bat- before the pretty graphics or big-laser-pew-pew-guns. I've been making some tweaks to help preserve the illusion of being in space & not in-station. One of them is restoring the occupied cargo space of g/kg-based goods on launch (been doing lots of mining lately). Anyway- thanks for making this!
Oops! Forgot about that!

If you PM me you modifications to deal with that I will gladly include them in the OXP.

Re: Save In Flight OXP v1.0.0

Posted: Tue Sep 13, 2022 8:27 am
by Cholmondely
This does not want to load on the AppleMac:

Latest Log:

Code: Select all

Opening log for Oolite development version 1.91.0-220208 (x86-64 test release) under Mac OS X Version 10.15.3 (Build 19D2064) at 2022-09-13 08:16:25 +0000.
Machine type: MacBookAir9,1, 8192 MiB memory, 2 (4 logical) x x86 (family 0x38435547) @ 1100 MHz.
Build options: OpenAL, new planets, JavaScript console support, Debug plug-in support, OXP verifier, localization tools, debug GraphViz support, JavaScript profiling.

Note that the contents of the log file can be adjusted by editing logcontrol.plist.

10:16:26.087 [dataCache.rebuild] -[OOCacheManager(Private) loadCache] (OOCacheManager.m:353): Data cache version (1.90) does not match Oolite version (1.91), rebuilding cache.
10:16:26.138 [plist.parse.failed] OOPropertyListFromData (OOPListParsing.m:72): Failed to parse /Users/accountname/Library/Application Support/Oolite/Managed AddOns/SaveInFlight-1.0.0.oxz/manifest.plist as a property list.
Unexpected character { at line 1
10:16:26.138 [oxp.noManifest] +[ResourceManager checkPotentialPath::] (ResourceManager.m:611): OXZ /Users/accountname/Library/Application Support/Oolite/Managed AddOns/SaveInFlight-1.0.0.oxz has no manifest.plist
10:16:28.294 [joystick.error.init] -[OOMacJoystickManager init] (OOMacJoystickManager.m:80): Cannot open HID manager; joystick support will not function.
10:16:28.295 [rendering.opengl.version] -[OOOpenGLExtensionManager reset] (OOOpenGLExtensionManager.m:221): OpenGL renderer version: 2.1.0 ("2.1 INTEL-14.4.26"). Vendor: "Intel Inc.". Renderer: "Intel(R) Iris(TM) Plus Graphics OpenGL Engine (1x6x8 (fused) LP".
10:16:28.295 [rendering.opengl.extensions] -[OOOpenGLExtensionManager reset] (OOOpenGLExtensionManager.m:222): OpenGL extensions (128):
GL_EXT_texture_compression_dxt1, GL_EXT_rescale_normal, GL_EXT_transform_feedback, GL_EXT_blend_func_separate, GL_EXT_framebuffer_sRGB, GL_ATI_texture_env_combine3, GL_ARB_draw_elements_base_vertex, GL_EXT_debug_label, GL_EXT_geometry_shader4, GL_EXT_secondary_color, GL_EXT_separate_specular_color, GL_EXT_shadow_funcs, GL_NV_texgen_reflection, GL_NV_blend_square, GL_ARB_texture_compression_rgtc, GL_EXT_stencil_wrap, GL_ARB_texture_env_crossbar, GL_EXT_framebuffer_blit, GL_ATI_separate_stencil, GL_APPLE_vertex_point_size, GL_EXT_texture_rectangle, GL_APPLE_specular_vector, GL_EXT_packed_depth_stencil, GL_EXT_blend_color, GL_ARB_fragment_program_shadow, GL_EXT_texture_env_add, GL_EXT_provoking_vertex, GL_EXT_texture_array, GL_ARB_texture_env_combine, GL_ARB_point_sprite, GL_ARB_multisample, GL_EXT_framebuffer_object, GL_ARB_framebuffer_sRGB, GL_EXT_texture_lod_bias, GL_APPLE_pixel_buffer, GL_ARB_vertex_program, GL_EXT_bgra, GL_APPLE_fence, GL_APPLE_ycbcr_422, GL_EXT_timer_query, GL_EXT_vertex_array_bgra, GL_ARB_depth_clamp, GL_IBM_rasterpos_clip, GL_ARB_pixel_buffer_object, GL_SGIS_generate_mipmap, GL_EXT_framebuffer_multisample_blit_scaled, GL_ARB_shader_texture_lod, GL_ARB_texture_float, GL_ARB_texture_rectangle, GL_ARB_vertex_shader, GL_NV_texture_barrier, GL_ARB_provoking_vertex, GL_ARB_texture_env_add, GL_APPLE_object_purgeable, GL_ARB_texture_env_dot3, GL_APPLE_rgb_422, GL_NV_depth_clamp, GL_ARB_texture_mirrored_repeat, GL_ARB_texture_cube_map, GL_APPLE_element_array, GL_ATI_texture_float, GL_ARB_window_pos, GL_ARB_sync, GL_ARB_vertex_buffer_object, GL_APPLE_texture_range, GL_NV_conditional_render, GL_EXT_stencil_two_side, GL_ARB_texture_compression, GL_ARB_instanced_arrays, GL_EXT_blend_minmax, GL_ARB_texture_border_clamp, GL_EXT_draw_buffers2, GL_ARB_shading_language_100, GL_EXT_blend_equation_separate, GL_ARB_vertex_blend, GL_EXT_blend_subtract, GL_EXT_packed_float, GL_APPLE_aux_depth_stencil, GL_APPLE_row_bytes, GL_NV_light_max_exponent, GL_EXT_abgr, GL_EXT_texture_filter_anisotropic, GL_ARB_vertex_array_bgra, GL_ARB_draw_buffers, GL_ARB_transpose_matrix, GL_ARB_color_buffer_float, GL_EXT_gpu_program_parameters, GL_APPLE_client_storage, GL_ARB_texture_non_power_of_two, GL_ARB_multitexture, GL_EXT_gpu_shader4, GL_APPLE_flush_render, GL_ARB_framebuffer_object, GL_APPLE_vertex_program_evaluators, GL_APPLE_transform_hint, GL_EXT_texture_compression_s3tc, GL_APPLE_flush_buffer_range, GL_EXT_texture_integer, GL_SGIS_texture_edge_clamp, GL_NV_fog_distance, GL_ARB_occlusion_query, GL_ARB_fragment_shader, GL_ARB_texture_rg, GL_ARB_fragment_program, GL_ARB_seamless_cube_map, GL_ARB_shader_objects, GL_EXT_draw_range_elements, GL_APPLE_vertex_array_object, GL_ARB_depth_texture, GL_EXT_texture_sRGB, GL_ARB_half_float_vertex, GL_APPLE_vertex_array_range, GL_ARB_shadow, GL_EXT_multi_draw_arrays, GL_ARB_half_float_pixel, GL_APPLE_packed_pixels, GL_ARB_point_parameters, GL_EXT_debug_marker, GL_EXT_texture_sRGB_decode, GL_EXT_clip_volume_hint, GL_SGIS_texture_lod, GL_EXT_fog_coord, GL_EXT_texture_shared_exponent, GL_ATI_texture_mirror_once, GL_APPLE_float_pixels, GL_EXT_framebuffer_multisample, GL_ARB_depth_buffer_float, GL_ARB_draw_instanced
10:16:28.311 [rendering.opengl.shader.support] -[OOOpenGLExtensionManager reset] (OOOpenGLExtensionManager.m:256): Shaders are supported.
10:16:28.451 [dataCache.rebuild] -[OOCacheManager(Private) loadCache] (OOCacheManager.m:353): Data cache version (1.90) does not match Oolite version (1.91), rebuilding cache.
10:16:28.460 [plist.parse.failed] OOPropertyListFromData (OOPListParsing.m:72): Failed to parse /Users/accountname/Library/Application Support/Oolite/Managed AddOns/SaveInFlight-1.0.0.oxz/manifest.plist as a property list.
Unexpected character { at line 1
10:16:28.460 [oxp.noManifest] +[ResourceManager checkPotentialPath::] (ResourceManager.m:611): OXZ /Users/accountname/Library/Application Support/Oolite/Managed AddOns/SaveInFlight-1.0.0.oxz has no manifest.plist
10:16:28.461 [searchPaths.dumpAll] +[ResourceManager logPaths] (ResourceManager.m:2240): Resource paths: 
    /var/folders/6s/ysb64pns7r3472gl73j4zsnc0000gn/T/AppTranslocation/FEF3D830-6DC6-44E0-A600-654C730AFC1E/d/Oolite 1.91.app/Contents/Resources
    ~/Library/Application Support/Oolite/Managed AddOns
    ~/Library/Application Support/Oolite/AddOns
10:16:28.480 [shipData.load.begin] +[OOShipRegistry(Singleton) allocWithZone:] (OOShipRegistry.m:1698): Loading ship data.
10:16:29.195 [startup.complete] -[GameController applicationDidFinishLaunching:] (GameController.m:269): ========== Loading complete in 1.23 seconds. ==========
This seems to be the relevant bit:
10:16:28.460 [plist.parse.failed] OOPropertyListFromData (OOPListParsing.m:72): Failed to parse ... Oolite/Managed AddOns/SaveInFlight-1.0.0.oxz/manifest.plist as a property list.
Unexpected character { at line 1
10:16:28.460 [oxp.noManifest] +[ResourceManager checkPotentialPath::] (ResourceManager.m:611): OXZ ... Oolite/Managed AddOns/SaveInFlight-1.0.0.oxz has no manifest.plist

Unexpected character { at line 1 is the standard utterly uninformative AppleMac message indicating an error somewhere in syntax

When I run plutil inside the AppleMac Terminal programme (and drop the manifest.plist onto it) I get this:
... % plutil ... Dybal.SaveInFlight/manifest.plist
2022-09-13 10:22:46.797 plutil[97789:939029] CFPropertyListCreateFromXMLData(): Old-style plist parser: missing semicolon in dictionary on line 16. Parsing will be abandoned. Break on _CFPropertyListMissingSemicolon to debug.
... Dybal.SaveInFlight/manifest.plist: Unexpected character { at line 1

This manifest.plist seems to work:

Code: Select all

{
    identifier = "oolite.oxp.dybal.SaveInFlight";
    required_oolite_version = "1.81";
    title = "Save In Flight";
    version = "1.0.0";
    author = "Dybal";
    category = "Miscellaneous";
    description = "Allows the player to save the game while in flight (must be stopped with nothing in scanner range)";
    license = "CC-BY-NC-SA 4.0";
    optional_oxps = (
        {
            identifier = "oolite.oxp.Svengali.BGS";
            description = "BackgroundSet - effects, ambient sounds and images.";
        }
    );
}

Re: Save In Flight OXP v1.0.0

Posted: Tue Oct 25, 2022 9:39 pm
by phkb
Milo wrote: Mon Oct 24, 2022 11:50 pm
Unintended consequence of this OXP: a taxi contract offer for 190135cr to take a passenger from the main station to the station at the end of the universe.
Well, the cost of living has gone up recently...
:wink:

Re: Save In Flight OXP v1.0.0

Posted: Wed Oct 26, 2022 1:45 am
by montana05
phkb wrote: Tue Oct 25, 2022 9:39 pm
Milo wrote: Mon Oct 24, 2022 11:50 pm
Unintended consequence of this OXP: a taxi contract offer for 190135cr to take a passenger from the main station to the station at the end of the universe.
Well, the cost of living has gone up recently...
:wink:
Still pretty cheap considering that the journey to the end of the universe could take a while. :lol:

BTW do you have any opinion regarding this topic: viewtopic.php?f=3&p=287132#p287132

Re: Save In Flight OXP v1.0.0

Posted: Thu Oct 27, 2022 12:18 am
by dybal
Milo wrote: Mon Oct 24, 2022 11:50 pm
Unintended consequence of this OXP: a taxi contract offer for 190135cr to take a passenger from the main station to the station at the end of the universe.
Since I never had a passenger berth installed, I never even saw a taxi contract... I looked at the Taxi Galactica OXP code and its contract creation only refers to the system, presumably the main station, so any contract to deliver a passenger to an specific in-system station must come from somewhere else...

Do you know who created that contract? Perhaps the code responsible looks for script_info to restrict a station from its possible destinations...

Re: Save In Flight OXP v1.0.0

Posted: Thu Oct 27, 2022 12:40 am
by Milo
Probably https://wiki.alioth.net/index.php/In-System_Taxi

Code: Select all

//fare, based on distance
this.$fare = function(distance) {
	return Math.floor(5 + 0.000005 * distance); //5 cr + 0.5 cr/100 km
}

//find suitable stations
this.$listOfStations = function() {
    function $isAllowed(entity) {
		if (entity.scanClass == "CLASS_STATION") {
			//excludes that have scanClass CLASS_STATION
			if (entity.hasRole("gates_jumpGate")) return false;
			if (entity.hasRole("fuelStation_satellite")) return false;
			if (entity.hasRole("fuelStation_station")) return false;
			if (entity.hasRole("jaguar_company_base")) return false;
			return true;
		}
		if (entity.isStation) {
			//includes that have isStation but not scanClass CLASS_STATION
			if (entity.hasRole("liners_liner")) return true;
			if (entity.hasRole("casinoship")) return true;
			if (entity.hasRole("random_hits_any_spacebar")) return true;
		}
		if (entity.isPlanet && entity.displayName != null) {
			//planetfall && planetary compass
			if (!entity.isSun && !entity.hasOwnProperty("solarGasGiant") && !entity.hasOwnProperty("isGasGiant") && !entity.hasOwnProperty("PFNoLand") && !entity.hasOwnProperty("PFNoLandQuiet") && player.ship.equipmentStatus("EQ_PLANETFALL") == "EQUIPMENT_OK") return true;
		}
		return false;
    }
    return system.filteredEntities(this, $isAllowed);
}

//create new in-flight offers
this.$taxiOffer = function() {
	if (system.isInterstellarSpace) return;//sanity check;
	var listOfStations = this.$listOfStations();
	var probability = 0.05 * listOfStations.length; //0.05 * number of stations => 0.10 for 2 stations ... 1 for 20 stations
	if (Math.random() < probability && listOfStations.length > 1) {
		var to = listOfStations.splice(Math.floor(Math.random() * listOfStations.length), 1)[0];
		var from = to;
		var found = false;
		while (listOfStations.length > 0 && !found) {//select suitable pickup point
			from = listOfStations.splice(Math.floor(Math.random() * listOfStations.length), 1)[0];
			if (player.ship.position.distanceTo(from) < this.$maxDistance)
				found = true;
		}
		if (!found) return;//no suitable pickup points
		if (to.isPlanet && from.isPlanet)
			var distance = from.position.distanceTo(to) - to.radius - from.radius;
		else if (to.isPlanet)
			var distance = from.position.distanceTo(to) - to.radius;
		else if (from.isPlanet)
			var distance = from.position.distanceTo(to) - from.radius;
		else
			var distance = from.position.distanceTo(to);
		var baseTime =  0.0002 * distance + 1200; //20 secs per 100 km + 20 mins for reach, launch and incidents.
		var time = clock.seconds + baseTime;
		var fee = this.$fare(distance);
		var name = global.randomName() +" "+ global.randomName();
		this.$commsMessage("Name: "+name+"\nFrom: "+from.displayName + "\nTo: " + to.displayName + "\nTime: "+  Math.floor((time - clock.seconds)/60) +" minutes\nBase fare: " + formatCredits(fee, true, true) + "\nAccept contract in 60 seconds");
		this.$removeOfferTimer();
		this.$offerTimer = new Timer(this, function(){this.$currentOffer = [0];}, 60);//offer ends in 60 secs
		//time contract, so it can be removed if deadline is met before picking the passenger up.
		this.$removeContractTimer();
		this.$contractTimer = new Timer(this, this.$endContract, time - clock.seconds);
		this.$currentOffer = [1, from, to, time, fee, name, system.ID, baseTime];
	}
}

Re: Save In Flight OXP v1.0.0

Posted: Sat Mar 02, 2024 3:39 pm
by MrFlibble
Is it possible to make this work in witch space?

It would be nice to be able to interrupt a long Thargoid scrap mission other than just pausing it.

Re: Save In Flight OXP v1.0.0

Posted: Sat Mar 02, 2024 9:12 pm
by phkb
MrFlibble wrote: Sat Mar 02, 2024 3:39 pm
Is it possible to make this work in witch space?

It would be nice to be able to interrupt a long Thargoid scrap mission other than just pausing it.
Probably not easily, I would think. I don’t think it’s possible to start a game in interstellar space.

Re: Save In Flight OXP v1.0.0

Posted: Tue Mar 05, 2024 10:46 am
by Cholmondely
phkb wrote: Sat Mar 02, 2024 9:12 pm
I don’t think it’s possible to start a game in interstellar space.
Would this be a useful tweak for the vanilla game code? I just tried saving at the Tionisla Reporter station and discovered - as you said - that I couldn't.

For my game at the moment it makes little difference. But it would enhance possibilities for future missions - and Mr Flibble has shown that others have a need.


Edited to add: Ditto at Avernus!

Re: Save In Flight OXP v1.0.0

Posted: Thu Mar 14, 2024 10:13 am
by phkb
Not sure I’d categorise this as a “tweak”. Even without looking at the code, my feeling is it would be a right pita to get working right, lots of places you would potentially have to adjust to cope with there not being a “system” when you start the game, to say nothing about the impact on OXPs. It’s not out of the question, just that I think there are much bigger fish to fry before talking this one!