Code Monkey home page Code Monkey logo

stelnet's People

Contributors

jaghaimo avatar mnukka avatar

Stargazers

 avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar  avatar

Watchers

 avatar  avatar

stelnet's Issues

Add Fleet management

Board for selecting your fleet. Ability to split your fleet into two and pick the one you want to fly. Ability to issue simple orders to other fleets.

[1.0.1] CTD on opening commodities board

Just updated stelnet, loaded my prev. save and tried to access commodities board.

Game crashed with "Fatal: null".

Here's stacktrace from starsector.log:

26425 [Thread-4] ERROR com.fs.starfarer.combat.CombatMain  - java.lang.NullPointerException
java.lang.NullPointerException
	at stelnet.commodity.market.price.SupplyPrice.<init>(SupplyPrice.java:14)
	at stelnet.commodity.market.BuyMarketFactory.<init>(BuyMarketFactory.java:21)
	at stelnet.commodity.market.MarketRepository.<init>(MarketRepository.java:15)
	at stelnet.commodity.view.TableViewFactory.createTableContent(TableViewFactory.java:41)
	at stelnet.commodity.view.TableViewFactory.createContainer(TableViewFactory.java:27)
	at stelnet.commodity.CommodityBoard.getRenderables(CommodityBoard.java:68)
	at stelnet.ui.RenderableIntel.createLargeDescription(RenderableIntel.java:49)
	at com.fs.starfarer.campaign.comms.v2.EventsPanel.Ò00000(Unknown Source)
	at com.fs.starfarer.campaign.comms.v2.EventsPanel.actionPerformed(Unknown Source)
	at com.fs.starfarer.ui.newnew.buttonPressed(Unknown Source)
	at com.fs.starfarer.ui.oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.Ò00000(Unknown Source)
	at com.fs.starfarer.ui.oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.processInput(Unknown Source)
	at com.fs.starfarer.ui.newnew.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Q.processInput(Unknown Source)
	at com.fs.starfarer.ui.Oo0o$Oo.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Q.processInput(Unknown Source)
	at com.fs.starfarer.ui.oO00.dispatchEventsToChildren(Unknown Source)
	at com.fs.starfarer.ui.oO00.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Oo0o.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Q.processInput(Unknown Source)
	at com.fs.starfarer.ui.oO00.dispatchEventsToChildren(Unknown Source)
	at com.fs.starfarer.ui.oO00.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Q.processInput(Unknown Source)
	at com.fs.starfarer.ui.oO00.dispatchEventsToChildren(Unknown Source)
	at com.fs.starfarer.ui.oO00.processInputImpl(Unknown Source)
	at com.fs.starfarer.campaign.comms.v2.EventsPanel.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Q.processInput(Unknown Source)
	at com.fs.starfarer.ui.oO00.dispatchEventsToChildren(Unknown Source)
	at com.fs.starfarer.ui.oO00.processInputImpl(Unknown Source)
	at com.fs.starfarer.campaign.comms.OOoO.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Q.processInput(Unknown Source)
	at com.fs.starfarer.ui.oO00.dispatchEventsToChildren(Unknown Source)
	at com.fs.starfarer.ui.oO00.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.newui.class.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Q.processInput(Unknown Source)
	at com.fs.starfarer.ui.oO00.dispatchEventsToChildren(Unknown Source)
	at com.fs.starfarer.ui.oO00.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Oo0O.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.newui.o0oO.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Q.processInput(Unknown Source)
	at com.fs.starfarer.ui.oO00.dispatchEventsToChildren(Unknown Source)
	at com.fs.starfarer.ui.oO00.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Q.processInput(Unknown Source)
	at com.fs.starfarer.campaign.CampaignState.processInput(Unknown Source)
	at com.fs.starfarer.BaseGameState.traverse(Unknown Source)
	at com.fs.state.AppDriver.begin(Unknown Source)
	at com.fs.starfarer.combat.CombatMain.main(Unknown Source)
	at com.fs.starfarer.StarfarerLauncher.o00000(Unknown Source)
	at com.fs.starfarer.StarfarerLauncher$1.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Full starsector.log

Add Navigation board

A new navigation board that allows to add manage and use a quick access list of locations.

Tab 1: Manage locations (add, remove, reorder?), take course, add to trip.

Tab 2: Current trip management, autopilot on/off. On autopilot will go to the first location, then switch to the next one until it arrives at the end. If location is a market, will dock before continuing.

Tab 3: Trip management: load, delete, save trip data.

Add Automation section

Automation tab has board, and history of actions intels (last 30 days).

Board:

  • Define cargo and ships to be bought or sold automatically.
  • Create a buy order from Market search (cargo and ships) with a quantity of 1. The player can increase the number to buy as needed. Once docked at the market, order will try to be fulfilled. Reduces the number to buy by number of bought.
  • Make an option to enable black market purchases when transponder is on. Off by default.

Examples:

  • Buy up to 1000 supplies. When you dock at the market it will automatically buy 1000 - min(available on you, available on the market) supplies.
  • Search for 0 d-mod Tempest frigates. Click "create a buy order". When docked at the market that has such Tempest, buy it.

Codex based cargo and ship search

Currently, a list of selectable ships or cargo stacks is generated based on their availability in the market (e.g. if they are available anywhere).

Change list generation to take codex entries (sans restricted tag), thus being able to issue intel for cargo and ships potentially, but currently not, available on the markets.

Promote Profit tab to Trade board

New board - Trade. Customizable filters in Configure tab, current results in Results tab, and System tab for quick view tab / current system overview.

Tables in Results and System tabs to be configurable (select fields to display, and select fields, multiple, to sort by).

  • System - all profitable routes within the system you are in; kinda quick-peek into what you can do (and earn) in the current system; disabled if in hyperspace
  • Sector - all profitable routes within the whole sector; top X most profitable
  • Routes - like Sector but you specify source planet (nearest by default), and target planet; shows what you asked (so net difference)
  • Stock - current profit tab but better, aka configurable (see below)
  • Config - filters and settings for Stock tab

Contact list feature requests

Hello,

My StelNet contacts list gets filled up pretty quickly with junk entries so I was wondering if any of the following features could be added:

  • Have the contact list sorted into Priority, Developed, and Potential (possibly with different header lines for each)
    • OR at least have the contact entries marked if they're a priority contact or only a potential contact, this could go in the individual contacts name header between their name/importance and the show/call buttons.
    • OR at least a filter for 'potential' vs 'developed' contacts
  • Merge existing vanilla functions into the StelNet 'Contact List' page
    • Develop Contact
    • Delete Contact
    • Prioritise contact
    • Suspend contact

The justification for merging these is mostly one for simplicity and having everything all in one place. I understand that I can just select a contact and press 'Show' to be taken to that contact's intel entry and have these commands available but when using many filters in Intel there's a lot of manual back and forth as well as cleanup to do when it could all be in the one place.

Thanks either way, and thanks for the mod.

com.thoughtworks.xstream.converters.ConversionException:

This pops up when I try to load a save with the new version of stelnet. The previous version was 1.2

505416 [Thread-3] INFO  com.fs.starfarer.campaign.save.CampaignGameManager  - Error loading
505417 [Thread-3] ERROR com.fs.starfarer.campaign.save.CampaignGameManager  - 
---- Debugging information ----
cause-exception     : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message       : stelnet.commodity.CommodityBoard
class               : java.util.ArrayList
required-type       : java.util.ArrayList
converter-type      : com.thoughtworks.xstream.converters.collections.CollectionConverter
line number         : 507881
class[1]            : com.fs.util.container.repo.ObjectRepository
converter-type[1]   : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
class[2]            : com.fs.starfarer.campaign.comms.v2.IntelManager
class[3]            : com.fs.starfarer.campaign.CampaignEngine
converter-type[2]   : com.fs.starfarer.campaign.save.I
version             : not available
-------------------------------
com.thoughtworks.xstream.converters.ConversionException: 

Convert to true utility mod

  • Use delegate wrappers to persist only id of the delegated object while maintaining the objects' interface.
  • Use beforeGameSave to persist mod state via new repository and unload the mod.
  • Use afterGameSave to load mod state and load the mod.

Rumours

Balance market searches around partial, yet accurate intel. By default, all intel will be provided in the form of accurate rumours, indicating a sighting of X in a star system (not at a specific market like now) with no information regarding quantity or quality (if looking for ships).

IF the player has one of:

  1. a storage on market, or
  2. a contact in the system, or
  3. [Nexerelin] an agent in the system, the rumour will be upgraded to full intel.

or is the owner of the market, or is commissioned to a market owner.

Modify market viewer to take either market or star system. If star system is passed, combine all markets and submarkets together. Only allow picking market if legacy behaviour is enabled, or any of the 3 above-mentioned conditions are met.

Additionally, when star system is passed, do:

  • For cargo: set quantity to 1 to indicate a sighting of at least 1 item.
  • For ships: information becomes generic, e.g. 1 wolf, and 2 wolf-d becomes just 1 wolf to indicate a wolf hull being sighted.
  • If there are any markets in that star system that would grant you FULL intel, do not include that market in combined lists.

Adds an option to enable legacy behaviour (always full intel).

Final UI cleanup

  • Rename Renderable abstract class as AbstractRenderable.
  • Add Renderable interface and use it in MarketQueryBoard.
  • Drop RenderableView interface from previous iteration and use Renderable in its place.
  • Add AbstractRenderableIntel and make BaseBoard extend it - class will offload callbacks and rendering, since both are managed in ui package anyway.
  • Replace usage of AbstractRenderable with either Renderable interface or concrete class that is used.

Add Logistic board

Add intel board for managing your storage transfers. Add intel based on transfers that happened in current month. Stellar Logistics returns.

Rule based board, with an overview of what will be transferred to where.

Form rules, e.g. all ships, just capitals, only weapons, only commodities, or just all for each location (or system or faction) where the player has storage. End of month (or on tick) all matching rules will fire, the player will be notified of what and where was transferred, and billed accordingly.

Externalize strings

Externalize all strings as json/csv file, so that translations don't need to fork and edit code.

View board

Tabs:

  • "Select Market": System map with market selection (see Nex's market selection widget for inspiration), no other tabs present until selected, tab changes name to "" when something is selected. Reset button at bottom right.
  • Open Market: show cargo and ships from open market (and show additional tabs for each submarket present).

Could be part of Market tag.

Remote transactions to storage

What if you could remotely make a transaction while at comms range at any market you have a storage at?

Should be easy to implement, just open arbitrary market (one call), and on transaction complete (listener) remove all of what you bought from player fleet and add all of it to storage submarket of said market. Only issue is restricting to just buy/sell (making comms, bar, and all other options inaccessible) and having empy cargo player section to avoid selling remotely.

Fails to load old save on latest version

When I load an old save I get an error:

530393 [Thread-3] INFO  com.fs.starfarer.campaign.save.CampaignGameManager  - Error loading
530393 [Thread-3] ERROR com.fs.starfarer.campaign.save.CampaignGameManager  - 
---- Debugging information ----
cause-exception     : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message       : stelnet.BaseBoard
class               : stelnet.board.viewer.ViewerBoard
required-type       : stelnet.board.viewer.ViewerBoard
converter-type      : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
line number         : 971195
class[1]            : java.util.ArrayList
converter-type[1]   : com.thoughtworks.xstream.converters.collections.CollectionConverter
class[2]            : com.fs.util.container.repo.ObjectRepository
class[3]            : com.fs.starfarer.campaign.comms.v2.IntelManager
class[4]            : com.fs.starfarer.campaign.CampaignEngine
converter-type[2]   : com.fs.starfarer.campaign.save.oooO
version             : not available
-------------------------------
com.thoughtworks.xstream.converters.ConversionException: 
---- Debugging information ----
cause-exception     : com.thoughtworks.xstream.mapper.CannotResolveClassException
cause-message       : stelnet.BaseBoard
class               : stelnet.board.viewer.ViewerBoard
required-type       : stelnet.board.viewer.ViewerBoard
converter-type      : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
line number         : 971195
class[1]            : java.util.ArrayList
converter-type[1]   : com.thoughtworks.xstream.converters.collections.CollectionConverter
class[2]            : com.fs.util.container.repo.ObjectRepository
class[3]            : com.fs.starfarer.campaign.comms.v2.IntelManager
class[4]            : com.fs.starfarer.campaign.CampaignEngine
converter-type[2]   : com.fs.starfarer.campaign.save.oooO
version             : not available
-------------------------------
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:79)
	at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:70)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50)
	at com.thoughtworks.xstream.converters.collections.AbstractCollectionConverter.readItem(AbstractCollectionConverter.java:73)
	at com.thoughtworks.xstream.converters.collections.CollectionConverter.addCurrentElementToCollection(CollectionConverter.java:98)
	at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:91)
	at com.thoughtworks.xstream.converters.collections.CollectionConverter.populateCollection(CollectionConverter.java:85)
	at com.thoughtworks.xstream.converters.collections.CollectionConverter.unmarshal(CollectionConverter.java:80)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
	at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:70)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:503)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:429)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:281)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
	at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:70)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:503)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:429)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:281)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
	at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:70)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshallField(AbstractReflectionConverter.java:503)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:429)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:281)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
	at com.thoughtworks.xstream.core.AbstractReferenceUnmarshaller.convert(AbstractReferenceUnmarshaller.java:70)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:66)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convertAnother(TreeUnmarshaller.java:50)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.start(TreeUnmarshaller.java:134)
	at com.thoughtworks.xstream.core.AbstractTreeMarshallingStrategy.unmarshal(AbstractTreeMarshallingStrategy.java:32)
	at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1486)
	at com.thoughtworks.xstream.XStream.unmarshal(XStream.java:1466)
	at com.thoughtworks.xstream.XStream.fromXML(XStream.java:1346)
	at com.fs.starfarer.campaign.save.CampaignGameManager.o00000(Unknown Source)
	at com.fs.starfarer.title.TitleScreenState.dialogDismissed(Unknown Source)
	at com.fs.starfarer.ui.N.dismiss(Unknown Source)
	at com.fs.starfarer.ui.impl.K.dismiss(Unknown Source)
	at com.fs.starfarer.campaign.save.LoadGameDialog.actionPerformed(Unknown Source)
	at com.fs.starfarer.ui.OoO0.buttonPressed(Unknown Source)
	at com.fs.starfarer.ui.oooO.Ò00000(Unknown Source)
	at com.fs.starfarer.ui.oooO.processInput(Unknown Source)
	at com.fs.starfarer.ui.V.o00000(Unknown Source)
	at com.fs.starfarer.BaseGameState.traverse(Unknown Source)
	at com.fs.state.AppDriver.begin(Unknown Source)
	at com.fs.starfarer.combat.CombatMain.main(Unknown Source)
	at com.fs.starfarer.StarfarerLauncher.o00000(Unknown Source)
	at com.fs.starfarer.StarfarerLauncher$1.run(Unknown Source)
	at java.lang.Thread.run(Thread.java:748)
Caused by: com.thoughtworks.xstream.mapper.CannotResolveClassException: stelnet.BaseBoard
	at com.thoughtworks.xstream.mapper.DefaultMapper.realClass(DefaultMapper.java:81)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
	at com.thoughtworks.xstream.mapper.DynamicProxyMapper.realClass(DynamicProxyMapper.java:55)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
	at com.thoughtworks.xstream.mapper.PackageAliasingMapper.realClass(PackageAliasingMapper.java:88)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
	at com.thoughtworks.xstream.mapper.ClassAliasingMapper.realClass(ClassAliasingMapper.java:79)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
	at com.thoughtworks.xstream.mapper.ArrayMapper.realClass(ArrayMapper.java:74)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
	at com.thoughtworks.xstream.mapper.SecurityMapper.realClass(SecurityMapper.java:71)
	at com.thoughtworks.xstream.mapper.MapperWrapper.realClass(MapperWrapper.java:125)
	at com.thoughtworks.xstream.mapper.CachingMapper.realClass(CachingMapper.java:47)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.readDeclaringClass(AbstractReflectionConverter.java:570)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUnmarshal(AbstractReflectionConverter.java:337)
	at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unmarshal(AbstractReflectionConverter.java:281)
	at com.thoughtworks.xstream.core.TreeUnmarshaller.convert(TreeUnmarshaller.java:72)
	... 50 more

Improve settings handling

Currently, mod settings live in settings.json, move them to a separate file (ideally ini file) in the mod directory.

Allow for file not to exist or settings not to be present (aka built-in defaults).

Add rich tables to the UI

Using custom panels, build a rich table UI component. Allows for embedding images, column sorting, and perhaps being clickable (or button column).

Input fields

Proof of concept

package stelnet.board;

import com.fs.starfarer.api.campaign.CustomUIPanelPlugin;
import com.fs.starfarer.api.campaign.comm.IntelInfoPlugin;
import com.fs.starfarer.api.impl.campaign.intel.BaseIntelPlugin;
import com.fs.starfarer.api.input.InputEventAPI;
import com.fs.starfarer.api.ui.CustomPanelAPI;
import com.fs.starfarer.api.ui.IntelUIAPI;
import com.fs.starfarer.api.ui.PositionAPI;
import com.fs.starfarer.api.ui.TooltipMakerAPI;
import java.util.List;

public class InputTest extends BaseIntelPlugin {

    public static String input = "";
    public static IntelUIAPI intelUi;

    @Override
    public void buttonPressConfirmed(Object buttonId, IntelUIAPI ui) {
        input = "";
        intelUi = ui;
        ui.updateUIForItem(this);
    }

    @Override
    public void createLargeDescription(CustomPanelAPI panel, float width, float height) {
        final IntelInfoPlugin intel = this;
        CustomPanelAPI newPanel = panel.createCustomPanel(
            width,
            height,
            new CustomUIPanelPlugin() {
                @Override
                public void positionChanged(PositionAPI position) {}

                @Override
                public void renderBelow(float alphaMult) {}

                @Override
                public void render(float alphaMult) {}

                @Override
                public void advance(float amount) {}

                @Override
                public void processInput(List<InputEventAPI> events) {
                    for (InputEventAPI event : events) {
                        if (!event.isKeyDownEvent()) {
                            continue;
                        }
                        InputTest.input += Character.toString(event.getEventChar());
                        event.consume();
                        InputTest.intelUi.updateUIForItem(intel);
                    }
                }
            }
        );
        panel.addComponent(newPanel);
        TooltipMakerAPI tooltip = panel.createUIElement(width, height, false);
        tooltip.addPara("Click on the field to reset content.", 10);
        tooltip.addButton(input, "FAKE_INPUT", width, 20, 0);
        panel.addUIElement(tooltip);
    }

    @Override
    public boolean hasLargeDescription() {
        return true;
    }

    @Override
    public boolean hasSmallDescription() {
        return false;
    }
}

Fix SharedData

You could take this class as a good exercise of getting rid of the inheritance and using composition instead. Try looking at some of the design patterns here. Possibly decorator pattern.

https://refactoring.guru/design-patterns/catalog

Also consider renaming this class and all other classes that inherit it. "SharedData" would imply repository or entity/dto. However actually it is a table that has columns and a header. Perhaps DataTableDialog or DataTable would be better.

Originally posted by @mnukka in #24 (comment)

Add button to remove tracked Commodities

Add a button that removes all tracked Commodity intel. Also add one that does the same but just for selected Commodity.

Finally, add shortcut to per-intel Delete button.

Add TabView to UI

A common framework for building tabs and their viewports.

Methods:

  • addTab(String, Renderable)
  • setActive(String)

And all inherited from Renderable.

Improve random sector abandoned stations handling

I don't keep a list anywhere, might have to check all entities in the sector once they can be identified by their memory key at least (set by Misc.setAbandonedStationMarket)

    public static void setAbandonedStationMarket(String marketId, SectorEntityToken station) {
        station.getMemoryWithoutUpdate().set("$abandonedStation", true);

Sightings

Include rumours of ship sightings based on system fleets. Never upgradeable to full intel.

Add task to start the game

Could this be made more generic, e.g. full path to the game folder (sans \\mods\\stelnet) with mods defined somewhere else, and modname taken from the mod_info.json via slurper?

Originally posted by @jaghaimo in #27 (comment)

Remote call improvements

Next Stelnet version will treat remote call while docked at the same location as normal vanilla call. As for truly remote call I will set a flag for the duration of the call, but you can also just check distance.

Also, try to find a bug with Sebastyen nuking your fleet (delivery mission).

Crash on load

im using an aur package and it probably ones to save in an restricted location

possible fixes:
make it to only give an error message or add redundant save location like the mod directory

error code
97929 [Thread-4] ERROR com.fs.starfarer.combat.CombatMain - java.io.FileNotFoundException: stelnet.log (Keine Berechtigung)

Add Conversion section

A conditional board that only shows up when mod that offers ship conversion is enabled.

Board per mod: Offers a quick overview of ships from a given mod that can be created from other ships (and list of source ships for conversion).
One board for source ships: Offers a quick overview of ships that can be converted to other ships (and list of target ships that can be created from source ship).

All boards have intel buttons that enable a relevant small intel with details on all ships in a row (sources and targets alike).

Add DynamicGroup to UI

UI container for dynamically adjusting height based on content. Specify desired (max) width and all elements will render left-to-right, top-to-bottom.

Fix board overflow

Boards built with new UI-framework are prone to UI overflow.

  • Commodity: commodity buttons
  • Storage: cargo and ship filters (unlikely)
  • Market: query table

Fix those instances.

Result Management tab for Queries

Add a 3rd tab. A panel dedicated to managing results, thus:

  1. Query List tab - list of all queries, controls queries, refresh, enable, disable, delete all + individual control; current but remove side column.
  2. Add a New Query tab - current, but remove dmods from Ship queries.
  3. Result Management tab - new one, put all filtering, grouping, sorting of results there.

Encountered a crash with array-out-of-bounds when trying to open the market selection UI

Linux
Pop!_OS 20.04

Also posted on the forum

ERROR com.fs.starfarer.combat.CombatMain  - java.lang.ArrayIndexOutOfBoundsException: -1
java.lang.ArrayIndexOutOfBoundsException: -1
	at java.util.ArrayList.elementData(Unknown Source)
	at java.util.ArrayList.remove(Unknown Source)
	at stelnet.storage.view.StorageTabViewFactory.addStorageData(StorageTabViewFactory.java:101)
	at stelnet.storage.view.StorageTabViewFactory.getTabPane(StorageTabViewFactory.java:73)
	at stelnet.storage.view.StorageTabViewFactory.createContainer(StorageTabViewFactory.java:45)
	at stelnet.market.MarketViewBoard.getRenderables(MarketViewBoard.java:64)
	at stelnet.ui.RenderableIntel.createLargeDescription(RenderableIntel.java:51)
	at com.fs.starfarer.campaign.comms.v2.EventsPanel.Ò00000(Unknown Source)
	at com.fs.starfarer.campaign.comms.v2.EventsPanel.actionPerformed(Unknown Source)
	at com.fs.starfarer.ui.newnew.buttonPressed(Unknown Source)
	at com.fs.starfarer.ui.oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.Ò00000(Unknown Source)
	at com.fs.starfarer.ui.oooOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.processInput(Unknown Source)
	at com.fs.starfarer.ui.newnew.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Q.processInput(Unknown Source)
	at com.fs.starfarer.ui.Oo0o$Oo.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Q.processInput(Unknown Source)
	at com.fs.starfarer.ui.oO00.dispatchEventsToChildren(Unknown Source)
	at com.fs.starfarer.ui.oO00.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Oo0o.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Q.processInput(Unknown Source)
	at com.fs.starfarer.ui.oO00.dispatchEventsToChildren(Unknown Source)
	at com.fs.starfarer.ui.oO00.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Q.processInput(Unknown Source)
	at com.fs.starfarer.ui.oO00.dispatchEventsToChildren(Unknown Source)
	at com.fs.starfarer.ui.oO00.processInputImpl(Unknown Source)
	at com.fs.starfarer.campaign.comms.v2.EventsPanel.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Q.processInput(Unknown Source)
	at com.fs.starfarer.ui.oO00.dispatchEventsToChildren(Unknown Source)
	at com.fs.starfarer.ui.oO00.processInputImpl(Unknown Source)
	at com.fs.starfarer.campaign.comms.OOoO.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Q.processInput(Unknown Source)
	at com.fs.starfarer.ui.oO00.dispatchEventsToChildren(Unknown Source)
	at com.fs.starfarer.ui.oO00.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.newui.class.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Q.processInput(Unknown Source)
	at com.fs.starfarer.ui.oO00.dispatchEventsToChildren(Unknown Source)
	at com.fs.starfarer.ui.oO00.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Oo0O.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.newui.o0oO.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Q.processInput(Unknown Source)
	at com.fs.starfarer.ui.oO00.dispatchEventsToChildren(Unknown Source)
	at com.fs.starfarer.ui.oO00.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Oo0O.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.newui.Stringsuper.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Q.processInput(Unknown Source)
	at com.fs.starfarer.ui.oO00.dispatchEventsToChildren(Unknown Source)
	at com.fs.starfarer.ui.oO00.processInputImpl(Unknown Source)
	at com.fs.starfarer.ui.Q.processInput(Unknown Source)
	at com.fs.starfarer.campaign.CampaignState.processInput(Unknown Source)
	at com.fs.starfarer.BaseGameState.traverse(Unknown Source)
	at com.fs.state.AppDriver.begin(Unknown Source)
	at com.fs.starfarer.combat.CombatMain.main(Unknown Source)
	at com.fs.starfarer.StarfarerLauncher.o00000(Unknown Source)
	at com.fs.starfarer.StarfarerLauncher$1.run(Unknown Source)
	at java.lang.Thread.run(Unknown Source)

Recommend Projects

  • React photo React

    A declarative, efficient, and flexible JavaScript library for building user interfaces.

  • Vue.js photo Vue.js

    🖖 Vue.js is a progressive, incrementally-adoptable JavaScript framework for building UI on the web.

  • Typescript photo Typescript

    TypeScript is a superset of JavaScript that compiles to clean JavaScript output.

  • TensorFlow photo TensorFlow

    An Open Source Machine Learning Framework for Everyone

  • Django photo Django

    The Web framework for perfectionists with deadlines.

  • D3 photo D3

    Bring data to life with SVG, Canvas and HTML. 📊📈🎉

Recommend Topics

  • javascript

    JavaScript (JS) is a lightweight interpreted programming language with first-class functions.

  • web

    Some thing interesting about web. New door for the world.

  • server

    A server is a program made to process requests and deliver data to clients.

  • Machine learning

    Machine learning is a way of modeling and interpreting data that allows a piece of software to respond intelligently.

  • Game

    Some thing interesting about game, make everyone happy.

Recommend Org

  • Facebook photo Facebook

    We are working to build community through open source technology. NB: members must have two-factor auth.

  • Microsoft photo Microsoft

    Open source projects and samples from Microsoft.

  • Google photo Google

    Google ❤️ Open Source for everyone.

  • D3 photo D3

    Data-Driven Documents codes.