Fractal Softworks Forum

Please login or register.

Login with username, password and session length
Advanced search  

News:

Starsector 0.9.1a is out! (05/10/19); Blog post: Personal Contacts (08/13/20)

Show Posts

This section allows you to view all posts made by this member. Note that you can only see posts made in areas you currently have access to.

Messages - Histidine

Pages: [1] 2 3 ... 183
1
EDIT: Solved by removing the Java Flight Recorder args from the batch file.

Code
java -XX:+UnlockCommercialFeatures -XX:+FlightRecorder MyApp

2
Code
145863 [Thread-6] ERROR com.fs.starfarer.combat.CombatMain  - java.lang.IllegalArgumentException: Comparison method violates its general contract!
java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(Unknown Source)
at java.util.TimSort.mergeAt(Unknown Source)
at java.util.TimSort.mergeCollapse(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.TimSort.sort(Unknown Source)
at java.util.Arrays.sort(Unknown Source)
at java.util.Collections.sort(Unknown Source)
at com.fs.starfarer.campaign.ui.intel.SortablePlanetList.recreateList(Unknown Source)
at com.fs.starfarer.campaign.ui.intel.SortablePlanetList.actionPerformed(Unknown Source)
at com.fs.starfarer.campaign.ui.intel.SortablePlanetList.<init>(Unknown Source)
at com.fs.starfarer.campaign.ui.intel.B.for.if(Unknown Source)
at com.fs.starfarer.campaign.ui.intel.B.sizeChanged(Unknown Source)
at com.fs.starfarer.ui.for.setSize(Unknown Source)
at com.fs.starfarer.campaign.comms.return.this.void(Unknown Source)
at com.fs.starfarer.campaign.comms.return.sizeChanged(Unknown Source)
at com.fs.starfarer.ui.for.setSize(Unknown Source)
at com.fs.starfarer.ui.o00OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.setSize(Unknown Source)
at com.fs.starfarer.ui.newui.O0oO$7.actionPerformed(Unknown Source)
at com.fs.starfarer.ui.newnew.buttonPressed(Unknown Source)
at com.fs.starfarer.ui.I.?00000(Unknown Source)
at com.fs.starfarer.ui.I.processInput(Unknown Source)
at com.fs.starfarer.ui.newnew.processInputImpl(Unknown Source)
at com.fs.starfarer.ui.o00OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.processInput(Unknown Source)
at com.fs.starfarer.ui.v.dispatchEventsToChildren(Unknown Source)
at com.fs.starfarer.ui.v.processInputImpl(Unknown Source)
at com.fs.starfarer.ui.o00OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.processInput(Unknown Source)
at com.fs.starfarer.ui.v.dispatchEventsToChildren(Unknown Source)
at com.fs.starfarer.ui.v.processInputImpl(Unknown Source)
at com.fs.starfarer.ui.N.processInputImpl(Unknown Source)
at com.fs.starfarer.ui.newui.O0oO.processInputImpl(Unknown Source)
at com.fs.starfarer.ui.o00OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.processInput(Unknown Source)
at com.fs.starfarer.ui.v.dispatchEventsToChildren(Unknown Source)
at com.fs.starfarer.ui.v.processInputImpl(Unknown Source)
at com.fs.starfarer.ui.o00OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOO.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$1.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
I narrowed this down to a bunch of marines I had stored on a station-only market.
- Opening intel screen when not in same system as that market: crash
- Opening intel screen when in same system as that market: no crash
- Opening faction doctrine/custom production screen doesn't cause the crash
- Taking out the marines fixes the issue (EDIT: Nope, still happens)
- Storing crew instead causes the crash to happen again, but apparently other commodities (tried supplies, fuel, heavy machinery, domestic/luxury goods, heavy armaments, AI cores) don't

3
Hmm? If you full-retreat, you wouldn't get ship recovery, regardless, right - am I missing something?
I mean that after the full retreat, I planned to do another engagement round with the ships which had retreated in said round due to PPT or damage (and got a Field Repairs 2 patch-up in the process), as I would have in a normal battle. But instead the battle ended immediately and took my recovery options with it.

Quote
(As far as market battles, there's no pursue option, yeah. It's pretty much just how it works; the focus is on the station, not whatever defenders which presumably get away with it for cover etc etc...)
Thing is, if you did the exact same battle* except by interacting with one of the nearby fleets instead of the market, it does act normally in that you do get to pursue etc.

*Well, we could say it's conceptually not the same battle; it can be implied that by clicking on the fleet instead of the station, the player makes that entity the focus as you say

4
This also happens if you full retreat from a battle joined by interacting with a market.

(Market interaction battles are kind of a mess in general, among other things you don't have a pursue option after winning)

5
- I did a full retreat in an engagement round
- Afterwards, the enemy decided to disengage, I could not pursue because of losses
- I was not given the option to recover my disabled/destroyed ships, lost all of them

6
They're not necessarily meant to reduce the absolute amount of salvage as such (although they will if the player isn't nearby); just prevent the player from getting salvage you didn't personally kill, unless you want to fight for it. There's also a limit to how many spawn based on number of ongoing raids and salvagables (derelict ships and debris fields) in the system, with no fleets spawning if the numbers of each are too low.

That said, I didn't look into what happens when the player is hostile to independents, and vultures fighting people on their own is undesirable. Also the fact that vulture fleet sizes are largely RNG-based may not be desirable?
I'll try some things in dev. Maybe a "when finding things to salvage, don't include things near a hostile fleet" rule would be good, among others.

7
Suggestions / Re: Better retreat for "too large" fleets
« on: September 14, 2020, 07:14:44 AM »
I've found that if your fleet is large enough to not be able to disengage immediately in the first place, killing 100 DP of enemies is actually fairly manageable a lot of the time (two capitals' worth of big ships plus assorted fodder will get you there). You should be building a fleet that can win fights at the 2:3 DP ratio anyhow.
The big risk comes from getting overconfident and taking losses, or just losing ships in general (since you won't be able to recover them afterwards).

The real pain comes afterwards, when your retreating fleet gets harried and you eat huge CR recovery costs (I think I've seen over 1k supplies required in one case)


I wouldn't mind replacing the fight-retreat-harry chain of events with a more sophisticated rearguard action scenario.

Random idea: A normal combat scenario, but you can only choose ships to deploy during the first 5 seconds, and enemy AI is extra-aggressive (they want to break your rearguard and continue with the pursuit). You have to hold out for X seconds until the non-deployed ships get away; having more/slower ships involved in the retreat increases the time required. If you succeed, the rearguard ships get a regular escape scenario.

Maximally simple idea: You can always disengage, but if you choose not to play the actual escape scenario, or it's unavailable due to fleet size, the action gets autoresolved in the same way as when you're pursuing a fleeing enemy.

8
Suggestions / Re: Carrier Mechanics Discussion
« on: September 11, 2020, 07:03:53 PM »
Carrier combat is boring in part because fighters are much less responsive than guns/missiles. Guns fire the moment you click on the target or almost immediately after, whereas fighters can take a few seconds just to line up for their run.

Half-baked idea I had for RTS-like ship controls to give the player more control when piloting a carrier:
  • Since fighters are pseudo-weapons, they should have their own weapon groups.
  • It should be possible to select multiple fighter weapon groups (and normal weapon groups, really, but that's off topic right now) at once.
  • When the currently selected weapon group(s) include fighters, clicking on an enemy ship orders the selected fighters to engage that target. Click on friendly ship to escort it. Click on empty space to fighter sweep in that direction, with each wing engaging targets at its discretion. Click on self or press Z to recall.
    • This allows a single carrier to engage or cover multiple targets at once, and while also targeting a different thing for its own weapons.
  • Zero-flux boost is lost if any wings have an order that isn't recall/protect self.

There's also a limitation in commanding carriers/fighters (not that it was any better with the old carrier model) in that ships can't have multiple/queued commands at once. e.g. you can't tell a carrier "fighter strike this target, while moving to this flanking position". You also can't issue a "fighter cover" order on a friendly ship or a point in space.

9
Mods / Re: [0.9.1a] ApproLight v0.8.5-RC4 (2020-9-3)
« on: September 11, 2020, 06:32:48 PM »
Translation stuff
I did a quick editing pass on strings.json to make the hullmod effect text in combat less bloated + fix some incorrect or unclear information in the Dynasty Seeker intel.
Spoiler
Code: json
    # floater text
    "deu_systemReady": "D.S. Buffer ready",
    "deu_systemActive": "D.S. Buffer activated",
    # HUD side text
    "deu_statsRestore": "Cooldown: %s seconds",
    "deu_statsActive": "Flux dissipation increased for %s seconds",
    "deu_statsReady": "Buffer ready",

    "cvs_systemRestore": "Ready in %s seconds",
    "atd_systemIdle": "Flux above %s; resonance engine disabled",
    "atd_systemCharging": "Charging for %s seconds",
    "atd_systemActive": "Speed boost active, %s seconds left",
    "atd_systemCoolDown": "Cooldown: %s seconds",

    # check the highlights on this one, were the month numbers in the original version highlighted? I forget
    # anyway I made it give the month names instead of numbers, should also do the same for idle_desc I think
    "seekerIntel_init_desc": "After you got some prime parts, you get a encrypted message inviting you and other captains who has prime parts from all factions to a meeting held by a smuggler called 'Dynasty Seeker'. You could exchange other kinds of prime parts, AI cores and blueprints with your prime parts. The whole process is classified but, in a sense, illegal. The meeting would be held in a random market in the sector every January, April, July and November, and last for one month.",

    "seekerIntel_idle_desc": "Seeker has disappeared, but will return in month %s.",
[close]

I was going to do the same for the hullmods, but wasn't sure what some of the effects are.
Is the ApproLight source code available anywhere? Would help me check the hullmod desc translations.

Bug report
I think the "accept new bounty from Originem" code checks if you already have an existing bounty, but doesn't check if the bounty was already completed (isEnding()/isEnded()). So an already-finished bounty kept in intel screen because of 'important' marker will prevent taking new bounties.

10
Bug Reports & Support (modded) / [0.9.1a] Message spam in Windows console
« on: September 11, 2020, 07:50:44 AM »
While playing a battle with a low framerate (I think this was the "game slows down after a few battles" thing) I noticed the batch file's debug log was spamming a NullPointerException and ArrayIndexOutOfBoundsException:



The errors do not appear in starsector.log. Also, they were generated while the game was paused.
Setting sound + music volume to zero and turning off UI (F11 + tilde) did not suppress them. They did stop appearing after the battle.

What might cause this?

11
Did you use some console commands to give yourself a planet/station in hyperspace? Those will crash the game when it tries to send an expedition/raid/etc. to the hyperspace market.

If not, post the error message from the end of the log file immediately after a crash.

12
Set Omicron's relationship with player to 100 (at start or after completing the quest) so the shards join player in battle properly.

EDIT: Wrong Raccoon mod, sorry

13
Modding / Save modlist extractor
« on: September 07, 2020, 09:09:18 PM »
I made a tool to convert a save's descriptor.xml to an enabled_mods.json file. It prints warnings to console if any of the mods are not found in the current install, too.

How to use (Windows): run the .exe, browse to descriptor.xml, browse to where you want to save the file (by default this is the /mods folder corresponding to the /saves folder from the previous step), done.

Download

Source (too lazy to GitHub a one-off project)
Spoiler
Code: java
package org.histidine.modlistextractor;

import java.awt.FileDialog;
import java.awt.Frame;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Writer;
import java.nio.file.FileSystems;
import java.nio.file.Files;
import java.nio.file.Path;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.parsers.ParserConfigurationException;
import org.w3c.dom.Document;
import org.w3c.dom.Element;
import org.w3c.dom.Node;
import org.w3c.dom.NodeList;
import org.xml.sax.SAXException;

public class main {

public static void main(String[] args) {
FileDialog loadDialog = new FileDialog((Frame)null, "Select save descriptor.xml");
loadDialog.setMode(FileDialog.LOAD);
/* dialog.setFilenameFilter(new XMLFileFilter()); */
loadDialog.setFile("descriptor.xml");
loadDialog.setVisible(true);

if (loadDialog.getFile() == null) {
System.out.println("No file selected");
System.exit(0);
return;
}

Path path = Paths.get(loadDialog.getDirectory(), loadDialog.getFile());
System.out.println("Loading file " + path);
List<ModEntry> mods;

try {
mods = getModList(path.toString());
} catch (Exception ex) {
throw new RuntimeException(ex);
}

String str = createEnabledModsJsonAsString(mods);
/*System.out.println(str);*/

FileDialog saveDialog = new FileDialog((Frame)null, "Select enabled_mods.json");
saveDialog.setMode(FileDialog.SAVE);
String modPath = Paths.get(loadDialog.getDirectory(), "..", "..", "mods").toString();
saveDialog.setDirectory(modPath);
saveDialog.setFile("enabled_mods.json");
saveDialog.setVisible(true);

if (saveDialog.getFile() == null) {
System.exit(0);
return;
}

path = Paths.get(saveDialog.getDirectory(), saveDialog.getFile());
File json = path.toFile();

try (Writer output = new BufferedWriter(new FileWriter(json))) {
output.write(str);
output.close();
} catch (Exception ex) {
throw new RuntimeException(ex);
}

System.out.println("Done, press Enter to exit");
try {
System.in.read();
} catch (IOException ex) {}

System.exit(0);
}

/**
* Gets the mod list from a Starsector save's descriptor.xml.
* @param path
* @return
* @throws SAXException
* @throws ParserConfigurationException
* @throws IOException
*/
public static List<ModEntry> getModList(String path) throws SAXException, ParserConfigurationException, IOException
{
Map<Integer, ModEntry> allMods = new HashMap<>();
List<ModEntry> modlist = new ArrayList<>();

File xml = new File(path);

DocumentBuilderFactory dbFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder dBuilder = dbFactory.newDocumentBuilder();
Document doc = dBuilder.parse(xml);
doc.getDocumentElement().normalize();

/* Load mod data from all mods ever enabled */
Node everMods = doc.getElementsByTagName("allModsEverEnabled").item(0);
NodeList nlEverMods = everMods.getChildNodes();
for (int i=0; i<nlEverMods.getLength(); i++) {
Node node = nlEverMods.item(i);
String nodeName = node.getNodeName();
if (!nodeName.equals("com.fs.starfarer.campaign.ModAndPluginData_-EnabledModData"))
continue;
Element el = (Element)node;

int xmlId = Integer.parseInt(((Element)getElement(el, "spec")).getAttribute("z"));
String id = getElement(el, "id").getTextContent();
String name = getElement(el, "name").getTextContent();
String version = getElement(el, "version").getTextContent();

/* Store only the mod's folder name, not the full path */
/* This is because someone else's saves may come from a Starsector copy installed to a different directory */
String modPath = getElement(el, "path").getTextContent();
String folderName = FileSystems.getDefault().getPath(modPath).getFileName().toString();

ModEntry entry = new ModEntry(id, name, version, folderName);
allMods.put(xmlId, entry);
}

/* Process mods last saved with */
/* Go up three levels: save folder -> saves/ -> starsector root */
Path modFolderPath = FileSystems.getDefault().getPath(path, "..", "..", "..", "mods").normalize();
Node lastMods = doc.getElementsByTagName("enabledMods").item(0);
NodeList nlLastMods = lastMods.getChildNodes();
for (int i=0; i<nlEverMods.getLength(); i++) {
Node node = nlLastMods.item(i);
if (node == null) {
continue;
}
String nodeName = node.getNodeName();
if (!nodeName.equals("com.fs.starfarer.campaign.ModAndPluginData_-EnabledModData"))
continue;
Element el = (Element)node;

int xmlId = Integer.parseInt(((Element)getElement(el, "spec")).getAttribute("ref"));
ModEntry entry = allMods.get(xmlId);

Path modPath = FileSystems.getDefault().getPath(modFolderPath.toString(), entry.folderName);
/*System.out.println(modPath.toString() + ", " + entry.folderName);*/
if (!Files.exists(modPath)) {
System.err.println("Warning, mod not found: " + entry.name + " " +
entry.version + " (" + modPath.toString() + ")");
}

/*System.out.println(entry);*/
modlist.add(entry);
}
Collections.sort(modlist);
return modlist;
}

/**
* Creates a string ready to write to {@code enabled_mods.json}.
* @param mods
* @return
*/
public static String createEnabledModsJsonAsString(List<ModEntry> mods) {
StringBuilder sb = new StringBuilder();
sb.append("{\"enabledMods\": [\r\n");
for (ModEntry mod : mods) {
sb.append("  \"").append(mod.id).append("\",\r\n");
}
sb.append("]}");

return sb.toString();
}

public static Node getElement(Element el, String id) {
return el.getElementsByTagName(id).item(0);
}

public static class ModEntry implements Comparable<ModEntry> {
public String id;
public String name;
public String version;
public String folderName;

public ModEntry(String id, String name, String version, String folderName) {
this.id = id;
this.name = name;
this.version = version;
this.folderName = folderName;
}

@Override
public String toString() {
String str = String.format("%s v%s (id %s, path %s)", name, version, id, folderName);
return str;
}

@Override
public int compareTo(ModEntry other) {
return this.name.compareTo(other.name);
}
}
}
[close]

14
Very small but the "Back" option on the "Other Options" on new game creation isn't mapped to ESC anymore.

EDIT: Also a debug message gets printed even without devmode when a vulture fleet spawns kinda like the special task forces in devmode.
Oops; fixed both issues for next version.

now i gave question, is there any "issue" with the raid launched by player faction, (privateer base from IR), because game say i outmatch or i'm superior (even something i go help) yet it fail.
Is the strength message from right before the raid is resolved, or some time before?
A raid result going against the stated message at the time of autoresolve the is something that shouldn't happen AFAIK. But the system defenses (and thus the displayed message) can change if things happen at the target area; one potentially significant cause of this is special task groups moving in and out of the system (potentially in response to the raid itself).

15
Mods / Re: [0.9.1a] Combat Chatter v1.10 (update 2020-09-06)
« on: September 06, 2020, 12:28:52 AM »
Incrementing the version number a bit more this time (honestly it should have happened with v1.9.3 as well)

Combat Chatter v1.10
Download

Changelog
v1.10
* Add option for enemy chatter
* Add characters: acecombat_count, blood_caleb, drunk_gopnik, gentleman2, knight_of_ludd
    * Thanks to Avanitia for a bunch of these
* darklord character no longer available for steady officers
* Add font size setting for floater text to settings.json
* Improve assignment of default characters for officer-less ships
* PrintChatterChars command: Add battle arg (prints characters for all ships in current battle), fix handling in simulations and menu battles
* Fix Version Checker support (moved version file to GitHub)
* Fix some cases where box chatter printed invalid characters due to smart quotes
* Update faction tags file a bit
* Remove some debug messages

Pages: [1] 2 3 ... 183