Fractal Softworks Forum

Please login or register.

Login with username, password and session length

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.

Topics - Histidine

Pages: 1 [2] 3 4 ... 12
16
Bug Reports & Support (modded) / [0.95.1a-RC6] SlipstreamManager hang?
« on: December 29, 2021, 07:58:33 AM »
A number of people (two that I know of) on Discord have been reporting hangs in the middle of play. Both posted VisualVM thread dumps, which contained the following:

"Thread-3" #18 prio=5 os_prio=0 tid=0x0000021a8f187800 nid=0x33bc runnable [0x00000086589fe000]
   java.lang.Thread.State: RUNNABLE
        at com.fs.starfarer.api.util.CollisionGridUtil.addObject(CollisionGridUtil.java:81)
        at com.fs.starfarer.api.impl.campaign.velfield.SlipstreamManager.updateGrid(SlipstreamManager.java:837)
        at com.fs.starfarer.api.impl.campaign.velfield.SlipstreamManager.checkIntersection sAndFadeSections(SlipstreamManager.java:628)
        at com.fs.starfarer.api.impl.campaign.velfield.SlipstreamManager.addStream(SlipstreamManager.java:607)
        at com.fs.starfarer.api.impl.campaign.velfield.SlipstreamManager.advance(SlipstreamManager.java:513)
        at com.fs.starfarer.campaign.CampaignEngine.advance(Unknown Source)
        at com.fs.starfarer.campaign.CampaignState.advance(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)

My eyeballing of the code involved has failed to notice any way this could even happen, and I need to go to bed, so I'll just leave this here for now.

17
Modding / [0.95.1a] Skip Story v1.0
« on: December 17, 2021, 06:08:27 PM »
Skip Story v1.0
Download

What's this do?
The Academy quest chain is great, but after you've played it already, sometimes you just want to get to gating around the Sector. This mod lets you do that.

Full list of effects:
  • Enables gate travel at start of game
  • Puts all the Academy characters in the Academy, with some relevant flags set
  • Sets a certain flag needed for a certain quest in 0.95.1a
  • Unlocks Rayan Arroyo, Callisto Ibrahim and Horus Yaribay as potential contacts
  • Adds a fleet log intel item pointing to "the secret location"

This is the same as the "skip story" option already available in Nexerelin, separated out into its own mod. You do not need or want to use this mod with Nexerelin 0.10.3i or earlier; the effects of using both story skips at once is undefined. I may decide to remove the option from later Nexerelin versions.

18
Bug Reports & Support (modded) / [0.95.1a-RC5] Marine bar event XP bug
« on: December 16, 2021, 06:15:20 AM »
Someone on Discord reported that the marine bar event isn't giving elite marines like it's supposed to. When I encountered the event myself, I spaced all my existing (100% XP) marines and did the event. The resulting marines were at zero XP. (Similarly, keeping one of the original elite marines then doing the bar event resulted in the marine stack having only 1/N XP)

19
Bug Reports & Support (modded) / [0.95.1a-RC5] Bar NPEs
« on: December 15, 2021, 05:31:54 AM »
A starfarer walks into a bar, gets this error in dialog:
Code
979413 [Thread-3] WARN  com.fs.starfarer.campaign.rules.A  - Problem with command of class com.fs.starfarer.api.impl.campaign.rulecmd.missions.BarCMD: null
java.lang.NullPointerException
at com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers.pickLocationWithinArc(HubMissionWithTriggers.java:3012)
at com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionWithTriggers$PickLocationAtInSystemJumpPointAction.doAction(HubMissionWithTriggers.java:1487)
at com.fs.starfarer.api.impl.campaign.missions.hub.BaseHubMission.runStageTriggersReturnFleets(BaseHubMission.java:1181)
at com.fs.starfarer.api.impl.campaign.missions.cb.BaseCustomBountyCreator.createFleet(BaseCustomBountyCreator.java:235)
at com.fs.starfarer.api.impl.campaign.missions.cb.CBDerelict.createBounty(CBDerelict.java:89)
at com.fs.starfarer.api.impl.campaign.missions.cb.BaseCustomBounty.create(BaseCustomBounty.java:240)
at com.fs.starfarer.api.impl.campaign.missions.cb.MilitaryCustomBounty.create(MilitaryCustomBounty.java:37)
at com.fs.starfarer.api.impl.campaign.missions.hub.BaseHubMission.createAndAbortIfFailed(BaseHubMission.java:707)
at com.fs.starfarer.api.impl.campaign.missions.hub.HubMissionBarEventWrapper.addPromptAndOption(HubMissionBarEventWrapper.java:92)
at com.fs.starfarer.api.impl.campaign.rulecmd.missions.BarCMD.showOptions(BarCMD.java:279)
at com.fs.starfarer.api.impl.campaign.rulecmd.missions.BarCMD.execute(BarCMD.java:154)
at com.fs.starfarer.campaign.rules.A.execute(Unknown Source)
at com.fs.starfarer.campaign.rules.ooOO.runScript(Unknown Source)
at com.fs.starfarer.api.impl.campaign.rulecmd.FireBest.applyRule(FireBest.java:106)
at com.fs.starfarer.api.impl.campaign.rulecmd.FireBest.execute(FireBest.java:51)
at com.fs.starfarer.api.impl.campaign.rulecmd.FireBest.fire(FireBest.java:57)
at com.fs.starfarer.api.impl.campaign.RuleBasedInteractionDialogPluginImpl.fireBest(RuleBasedInteractionDialogPluginImpl.java:177)
at com.fs.starfarer.api.impl.campaign.RuleBasedInteractionDialogPluginImpl.optionSelected(RuleBasedInteractionDialogPluginImpl.java:210)
at com.fs.starfarer.ui.newui.W$1.o00000(Unknown Source)
at com.fs.starfarer.ui.newui.new.actionPerformed(Unknown Source)
at com.fs.starfarer.ui.OoO0.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.O0Oo.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.super(Unknown Source)
at com.fs.starfarer.StarfarerLauncher$1.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
The "leave bar" dialog option is missing, but one of the bar events managed to generate its dialog option (specifically, the custom bounty from MagicLib). The starfarer clicks that option, but there are no bounties he wants to do, so he backs out of the dialog. This time it CTD's:

Code
1102553 [Thread-3] ERROR com.fs.starfarer.combat.CombatMain  - java.lang.NullPointerException
java.lang.NullPointerException
at com.fs.starfarer.api.impl.campaign.intel.bar.BarEventDialogPlugin.endEvent(BarEventDialogPlugin.java:65)
at com.fs.starfarer.api.impl.campaign.intel.bar.BarEventDialogPlugin.optionSelected(BarEventDialogPlugin.java:55)
at com.fs.starfarer.ui.newui.W$1.o00000(Unknown Source)
at com.fs.starfarer.ui.newui.new.actionPerformed(Unknown Source)
at com.fs.starfarer.ui.OoO0.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.O0Oo.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.super(Unknown Source)
at com.fs.starfarer.StarfarerLauncher$1.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

20
During the new game load process, every non-GUI element except the background (e.g. nebulas, planets and ships) flickers quite violently, as seen in this video:

[warning: see above description]
https://www.youtube.com/watch?v=3ta55QrE-lY

It could well be a health hazard, so would be good to get it fixed.

21
General Discussion / SOE quest thoughts [0.95.1a spoilers]
« on: December 11, 2021, 06:53:39 AM »
(If you don't know what the title refers to, that's good! Don't open the spoilers unless you want to be, well, spoiled.)

Spoiler
First, I should note that I didn't get the mission in a 'normal' playthrough; rather I started a new game with a modified version of Nexerelin's 'skip story' option, and a modified rules.csv row with the RollProbability call removed.

Okay, general impression: Wow, you're a pair of madlads, Alex and David! A minigame needing completely novel systems like this is definitely not something I expected to ever see.
The rest of the mission was fun, too. Nice to see more lore; interesting glimpse into the Eventide aristocracy and its origins, and House Rao. I liked the dialog choices (also I am inordinately amused by the 'DatingSim' option IDs).

Difficulty: Of the first four times I tried it, I only won the third time. Probably fine, it should be hard for a captain with zero fencing experience, and it's not like you lose anything by losing. Classic Prince of Persia controls (a game I've never played) felt a bit "stiff" at first.

Issues and things I thought could be better:
  • It's not save-compatible, right? Since the required persons are only generated on a new game.
  • The requirements to unlock the mission may be too strict. I'm not even sure RollProbability works as one might expect; I used the rule command in a Nexerelin mod mission for a while and it never seemed to show up.
    Also it requires Hegemony commission as if anyone would hold such a thing. (Unless every major faction is getting its own mission? Would be kind of cool.)
  • Caspian Sang is probably exactly as insufferable as he was meant to be. But in hindsight I kinda feel the narrative text criticizing him could be, hmm, more subtle. More show-don't-tell.
  • The tutorial description isn't fully clear on ripostes; I didn't know "a skilled fighter" meant it requires the story point option to work, until I looked at the code. It makes sense in hindsight and I'm not sure how else I'd word it, but maybe highlight that bit in the story point color?
    Also it's hard for me to tell in the first place whether I'm riposting or just doing a normal attack. It seems like ripostes have poor range, or is that just the opponent doing a "middle block"?

Random idea that just popped into my head: Neriene Rao contact when ;D
(maybe as a reward for winning and/or just getting along reasonably well with her)

Overall verdict: Thumbs up, positive review, would party and study the blade again.
[close]

22
Lore, Fan Media & Fiction / Fallen Dust [oneshot]
« on: November 26, 2021, 01:12:26 AM »
Hello! It's been forever since I've written fanfic for Starsector (and, uh, I don't plan to return for a while), but once in a while an idea strikes.

Fallen Dust
Read as .odt

Spoiler
  The bombardment had stopped six hours ago, but to Bianca, running up the road with rifle in hand, it seemed as if the acrid smoke still lingered in the air.

  Gravel crunched under her work boots till she stopped to catch her breath, leaning against the old elm in the village square. It was held in the village that the great tree's lineage traced back, unmodified by sinful technology, to old Mother Earth herself. True or not, the solidity was reassuring right now.

  She let her gun rest on the ground and looked out at the darkness of Tartessus's starlit night. The fields once lush with oats and lettuce and clover, the vineyards from which such rich wine came, were gone now. Their crops had been trampled under to build a rough network of trenches, with concealed weapon emplacements and enfilading fields of fire down the pass. Or simply blotted away by shells from orbit.

  The same shells that had obliterated the supply convoy passing through their humble community. The burned skeletons of the wheeled trucks were now strewn in a line past the fields, put to work in their death as improvised tank traps. Papa's old tractor was there, too; the cantankerous beast had been dragooned to help to dig the trenches until it succumbed in a wheezing puff of burned vegetable oil, then cannibalized for parts.

  Tartessus had no moon. That faint light in the sky above was the fleet of the great enemy from the Foxworlds.

  She'd heard the name many times, even before that terrifying sight had come to her home planet. Felicia Fuchs, or as the priest had called her, the Bride of Belial, the adventurer-captain turned warlord who'd ravaged the worlds of Mother Church. It was said that her mercenaries razed churches and monasteries with the screaming inhabitants locked inside, plucked babies from the arms of the faithful to cut up for organs – she shuddered at the thought, sinking to her knees, clutching her rifle like a talisman.

  (The claims were baseless propaganda, in truth; if anything, the Foxworlds were remarkably tolerant of the Luddic faith. But it was true that many of the Church's planets had been conquered in the course of a war whose reasons were scarcely remembered now.)

  Oh, Ludd. Though we be unworthy, forgive us our sins, and guard us now from the Adversary. Guide us in this hour, for we are weak, and afraid...

  Slowly, breathing heavily, she rose to her feet and straightened the kerchief on her head. She'd rested enough; Papa would be missing her soon.

 

  The command post was in the basement of what had once been the local cold storage facility, which was mostly still standing. More than could be said for some of the homes around here. She'd nearly tripped over an adolescent boy propped up against a crate; the prompt bawling of the infant cradled in his arms had made Bianca want to curl up and disappear into the floor.

  "I'm sorry!" was all she could spare, picking herself up and bolting off.

  The guard outside the door let her in with no comment other than a raised eyebrow. She stepped through diffidently, her excuses for being tardy already prepared. Bending the letter of her father's instructions was something she could get away with, but not when he was also the senior NCO of the company.

  Then she looked across the room, and realized she didn't have to worry after all.

  Staff Sergeant Esteban Féng's voice was a bass rumble, that of the green-mantled Knight of Ludd he was arguing with a sharp mezzo-soprano. On the desk between them lay a flickering gas lamp, a battered low-spec computer, a messy spread of data chips... and the quantum communicator the Knight had brought on her arrival, as intricate and capable as anything a Tri-Tachyon executive might have kept in his office.

  The first time she'd laid eyes on it, Bianca had been disturbed by the thought that the holy order could so casually use such ungodly creations. Foolish, really. Was it not a far greater contradiction that Ludd had preached peace, and yet these most devoted servants of his were trained to kill? Enemies of the Church to be sure, heretics and demon-consorters, yet were his teachings not of kindness to even the meanest of all?

  Right now, however, she scarcely needed or noticed the communicator. The words were quite audible from across the room, stilling the buzz of conversation from the other militiamen filling out the chamber.

  "...barely hanging together," her father was saying. "If we can just hold out for relief —"

  "There is no relief coming, man!" the woman snapped. "The Bride has already torn away Hesperus and Asher from the Church. Gilead must see to her own defense. Fuchs's fleet has shattered every force the Knights have mustered against her. So long as she possesses that vessel of Moloch – and in truth, even without it – we cannot challenge her in space." She exhaled slowly. "And if we remain where we are, we perish slowly but surely, as she rains infernium down on all we hold dear."

  Bianca watched as Papa stood perfectly still. Only the slight clenching of his fists and the shifting color of that vein running down the side of his solid neck hinted to the temper he was forcibly subduing.  Restraint did not come easily to the Féngs, but Esteban's decades as an NCO and a father had compelled him to learn. Not always in time – there were moments when Bianca still flinched at the sight – but always eventually.

  "What would you have us do instead?" he said, at length.

  "The Knights have been broken and scattered. But their sacrifices have not been in vain." The woman swept a hand over the map. "The planetary militia, combined, greatly outnumbers the invader's forces. If we can lure her soldiers-for-hire into a field of our choosing, then unleash our full strength upon them, we might yet drive them offworld. Back to the bosom of their foul mistress."

  "It'll be bloody." That was a statement of fact, not an objection. Which is why you're speaking with me rather than one of the company officers, of which we have exactly one remaining, went unspoken. "And Fuchs will be back."

  "I know." A long sigh. "I know. But it's all we can do for now. The future we can only entrust to Ludd."

  Esteban stood still in body; the slumping of his soul was something perceived only by the one girl in this room who knew him well. Silence fell over the room for a few breaths, neither the principals nor their audience speaking, until it was broken by the raucous buzzing of a priority message signal from the communicator.

  A heartbeat later, it seemed as if everyone in the room was bending towards – or over – the infernal device. The knight and the sergeant absorbed the audiovisual message intently, neither showing any visible reaction even as the others gasped, muttered and swore.

  "It's starting, then," Esteban said firmly at last. "Sound the alarm. Everyone to your posts."

 

  The world was now even darker than before, for almost all the village's lights had been promptly switched off. Peeking out above the half-collapsed wall of the small dwelling, Bianca scanned the underworldly black depths down the gentle slope, anxiously trying to pick up any hint of the war machines her head knew were still at least ten minutes away. "You'll hear them before you see them," her father had said. "Feel them, too."

  Somehow that thought was not comforting at all.

  She turned to look back at the village, and startled at the sight of the Knight standing a little behind her, staring intently. "Dame Gisella!" It took her a moment to remember the protocol that had been so painstakingly driven into her as a child; then she dropped to one knee, hoping her bowed head and the darkness would conceal her flush.

  "At ease, young lady," the figure said gently. "Don't mind me. Just indulging in an old woman's foolish reminiscence, is all."

  She stepped forward, the heavy feet of her battle armor smudging the rammed earth floor. This close, even in the darkness, the girl could make out some details of her visitor. Tall, imposing, but with a warm hazel gaze that met her amber eyes easily. The features surrounding those eyes, though aristocratic, were as sun-bronzed as Bianca's own. The CP carbine slung over her shoulder was a sleek thing of polymer and semiconductors. Quite unlike the rifle she'd left leaning against the wall, a heavy wooden construct based largely on principles that were old before humanity had left old Earth, built for power and ruggedness above all else.

  "Has your father told you why we're here?" Gisella cocked her head at the field before them. "Waiting out here – up here – for the enemy to come."

  "We're guarding the pass leading to Emmer's east flank," Bianca recited, rising awkwardly to her feet.

  "That's right. The main blow will fall on the town itself, but if they get past us here, they'll be able to encircle the garrison. That's why we're going to do our best to stop them here." The knight reached out to pat the girl on the head, the iridium alloy gauntlet as soft as an angel's caress. "Thirty thousand people are counting on us back there. So be strong, all right?"

  Her nod was eager, almost too puppy-like. "Yes, my lady!"

  "Good girl."

  The knight turned away to exchange a few words with the fireteam's lance corporal, and Bianca returned her gaze to the darkness. Watching. Waiting.

  The waiting was always the hardest part. That, too, was a lesson from Papa.

  The minutes ticked away. Someone coughed at one point, but otherwise the silence was complete. It took an effort of will to refrain from unseemly fidgeting.

  She'd just started to hope that they wouldn't come, that they'd decided to stay home after all…

  The lance corporal crouching next to her hissed. "They're here."

  He's right, she realized after a while. The forward thermal sensors, the few the Knights could spare, had been the first to pick up the approaching force, and their warnings had been duly propagated to the officers and NCOs. But now she could personally feel the distant rumbling of the approaching foe. The footfalls of the enemy's mechs, each bringing its half-share of a thirty-ton mass down to sully the gentle earth. And – she cocked an ear – the low-pitched whirr of the hovertanks accompanying them.

  Two and a half platoons of light and medium armor, the briefing had said. She kept her head down, gripping her firearm, resisting the urge to stand up and start finding a target. Dame Gisella and Papa's instructions had been bloodcurdlingly explicit: no-one was to fire until the critical moment.

  Waiting. Waiting. The noises grew louder, more terrifying with each heartbeat...

  BOOOOOOMM

  The anti-armor guns had been concealed behind thermal screens in a covered foxhole and in Old Inés' barn, emplaced while the invaders' orbit put them on the other side of Tartessus. There they'd waited for days, powered down and aimed entirely using passive electro-optics and muscle power. Only when the hated foe had entered the killing zone were the electrothermal-chemical rounds ignited, twin swords of an avenging angel driving towards their targets, unstoppable by active protection. Not this close, not this fast.

  Two of the targets went up in orange blossoms that lit up the night, one hovertank turret leaping ablaze against the darkness, one cored mech spilling backwards to shake the earth. Shoulder-fired and tripod-mounted missile launchers sent their payloads streaking outwards from the village as well, a couple claiming their own blows for faith and justice, though none so spectacularly as the big guns had.

  But the Bride's troops were hardened professionals, and they had not come without anticipating such a scenario. Their reply was swift, and equally merciless.

  Multiple pulsed lasers and railgun shells lashed out in an almost synchronized display. The AT guns shattered as their deeds were repaid in kind, the buildings that had housed them set ablaze. More muzzle flashes flashed from the shapes in the darkness, indirect fire this time. Close support mortar. Airburst type. The explosions of the submunitions raining on the gun emplacements drowned out the screams of the crews they scythed down.

  Bianca jerked her rifle up, not even stopping to think whether a pile of adobe rubble could possibly stop such terrifying firepower. In the low-light telescopic sight, the bipedal shadow before her loomed large, an unnatural beast of dark green metal.

  She squeezed the trigger.

  At point-blank range, the half-inch round struck with the better part of seven thousand joules. Applied to the right place, it could stop even a charging Tartessan pseudobull dead in its tracks – literally. Just as she'd done two days before her fifteenth birthday.

  Tonight it missed the mech's knee joint, ricocheting off its thigh and streaking into the night.

  Even through her shoulder pads, the recoil was a bone-jarring hammerblow, and what the report did to her ears was unspeakable. But the discomfort was a distant, meaningless thing, as her hand worked the bolt with practiced efficiency.

  Again she sighted her target, again she fired. The beast seemed to stagger momentarily this time, or perhaps it was just her imagination.

  The man at the window next to her position hefted an unguided rocket launcher. The soft launch sent the finned tube flying out almost gracefully, before it went screaming afire down the slope, at one of the other advancing mechs. Bianca's eyes followed the orange flare hurtle into the night all the way to three meters short of its target, where a burst of APS flechettes sliced it out of the air.

  She'd chambered the third round and started to track her target again, only for it to vanish behind a puff of thick white smoke, rapidly blooming into a thick cloud. An attempt to keep guided weapons from getting a lock, but it'd work just as well against the Mark I eyeball.

  The other vehicles up and down the line had deployed smoke, too. A breeze sent the billowing phosphorus pentoxide over the foremost line of trenches; it probably wasn't an intended effect, but her mind shied at the thought of what that smoke must be doing to the unprotected troops inside. Tracers still flashed back and forth through the obscurant, from the militia's heavy MG emplacements and the invaders' own automatic weapons, and more explosions roared in the distance, mortar and cannon fire flaying any position with the misfortune that their foes' computer-slaves had already observed and recorded their position.

  Her rifle was still up, pointing at where she imagined the enemy would emerge again, when motion caught her eye. A pale gray streak – no, two, then three of them. Emerging from above the smoke, zooming towards their position.

  She had one of the shapes sighted before she was conscious of doing so, and her finger was drawing back even as her mind belatedly identified it as a small UAV. The mechanical bat was no mech, or even a pseudobull; its synthetic shell parted before her bullet, and it exploded in the electric blossom of a failing capacitor.

  The other drones had closed thirty meters in the time it took her to cycle the bolt and reaim. Too close for the scope now... but now all she had to do was point and shoot, and she could do that with her eyes closed.

  She did just that... and the little craft zipped aside, not even twitching at the supersonic crack passing by two inches from it.

  Under different circumstances, she might have reflected on the grotesque crime of Tri-Tachyon and others of their ilk, in giving the power of thought to machines of killing, and then throwing them at their enemies, master and servant equally unconcerned with the prospect of the servant's death. Or she might have considered the implications of why the local C-UAS emitter wasn't swatting the drones like it was supposed to.

  Right now, though, nothing existed in time nor space except herself, the drone and her rifle. Too long, too heavy... she couldn't bring it to bear precisely on such a small jinking target, and she only had one shot left.

  The others were firing too, heavy hunting pieces like her own. Someone got lucky, shattering a lift fan, and the malevolent device spun out of control, hitting the farm soil in a tumble before exploding.

  Her eyes darted about for the third UAV, but the sky was clear. Had someone else shot it down? Or had it merely dashed out of her field of fire, out of sight? The smoke was clearing, now, and –

  "Down!"

  The warning was half a second – a lifetime – too late. The burst of tribarrel fire shredded the man at the window, then cut across the building, a demon in the form of fifty high-velocity darts per second clawing apart the wall. Then an osmium slug from one of their railguns punched through the barrier, taking another rifleman's head and upper neck with it as he'd crouched behind what he thought had been safety. The shell tore open a wound of equal size in the far wall on its way out, but the fiery trail it left behind briefly illuminated the dark room like a sunrise in the open fields.

  Bianca's scream was inaudible in her own ringing ears. She collapsed to the ground, clutching her rifle, until the fireteam's lance corporal came over and jerked her by the upper arm. He was yelling, shaking her like a rag doll, and then he let go to scoop up one of the rocket launchers lying on the floor.

  Her hands were trembling too much. Surely they couldn't push her off the floor in this state, much less hold a gun.

  But they did, and she found herself on her knees, shaking. It took a few deep breaths before she dared peek out above the rubble.

  Ludd have mercy, they're right on top of us!

  The silhouette in the darkness – somehow, she knew, it was the same mech she'd been firing at earlier – seemed to loom over the building. Someone, something brought her hands with the rifle up. Pointed it straight at the left optics, just like the diagram she'd memorized in training.

  Pulled the trigger.

  Vitriplast shattered, electronic receptors went dark. A beast of flesh and bone would have howled in agony, wheeling about to try and find who had half-blinded it; the mech simply spun its upper body, tracing a path with its autocannon that bisected every house in a broad cone before it.

  Another rocket went out the window to strike the mech's left thigh. Composites buckled and broke away under the shock, actuators crushed, and the beast stumbled, sagging on its mangled limb. Even Bianca couldn't help but wince in reflexive pain.

  "Yes!" the lance corporal exulted, even as he cast aside the now-empty launcher to join its fellow in the corner of the room, bending down to pick up a third tube.

  Only now did Bianca realize that her gun had clicked empty several times. She dropped back to her knees, one hand fumbling with the empty box magazine, then scrabbling at her vest to find its replacement. The roar of the third launch barely even registered.

  She'd just started to seat the new mag when the ground heaved violently, and it slipped from her fingers. Perhaps a mortar shell had landed too close to their position, or another piece of enemy armor had run into an IED.

  The lance corporal grabbed her again, hauling her to her feet. He was breathing heavily, sweat running down his forehead, yet the motion was smooth as a flowing stream. "Time to fall back, señorita!" he shouted, still holding the spent launcher.

  They turned towards the rear of the building, just in time to see the drone enter through the hole in the wall, the third one that had disappeared earlier.

  It darted at them, and Bianca started to bring up her gun. Her unloaded, all too heavy gun.

  She froze, first in realization of her imminent death, then at the sight of her Uncle João casting aside his own empty weapon. He roared and leaped forward, seizing the demonic creation in two muscular arms.

  Unlike the humans before it, the UAV carried no gun, no missiles. Its sole weapon was a 200-gram nitro-eight explosive charge.

  The blast sent João's lean but muscular form flying at Bianca, the backplate of the unpowered ballistic vest striking her hard in the chest, knocking her to the ground. The rest of the world fell on top of her a few heartbeats later.

 

  Vision returned, slowly. Sensation took a while longer.

  She didn't know how long she'd been lying there before she regained enough feeling in her arms to push the weight off her. One dead, mangled NCO, and a pile of wood and mudbrick debris from when building had collapsed. Most of it hadn't landed on her, thank Ludd.

  Her hands were red and wet when she drew them away from what had once been her father's best farmhand. The corner of her mind that was somehow still capable of forming thoughts wondered why she hadn't screamed then, or when she'd first discovered a corpse atop her.

  She didn't have the energy to stand or even sit. Outside, the whirr of a hovertank's fans was punctuated by stattaco tribarrel bursts, the pinging of HMG bullets on a metal-sheathed hull, and the haunting noise of an energy pulse.

  There was no longer a hole in the wall; the wall itself had ceased to exist. She rolled over and crawled over the rubble, coughing on the swirling dust, barely conscious of the thin trail of blood she was leaving, or the fan noise growing more distant.

  The outside was no longer dark, not entirely. The light of the burning homes showed her more than she wanted to.

  Several bodies in bloodied uniforms were scattered on the road nearby, weapons lying beside their former masters. One had been crushed beyond recognition, perhaps by a misplaced giant's foot. Not that the others were looking much better. The carcass of a tank was blocking half the path, a gaping tear in its skirt.

  She raised her head, looking towards the center of the village, where the battle had passed her by. Fire greeted her gaze. Fire and death.

  The cold storage was ablaze, crumbling inwards before her eyes. Sporadic gunfire still flashed from the windows, but each instance was violently silenced within moments of its appearance. The hulls of the methodically advancing war machines shimmered with the light of the burning old elm...

  Somewhere in that building, she knew her father – if he still lived – would be fighting to the last, along with the remnants of his company. Surrender had never been in his nature.

  Almost every other structure in the village had already been reduced to smoldering heaps, giving her a clear view of the massacre of the remainder. Even the – she watched helplessly as the church's stone walls shattered with the energy transfer of the repeated laser pulses. For a century it'd stood under sun and wind and rain; now the destructive energies that humanity could bring to bear on itself reduced it to dust and rubble in a few breaths.

  Bianca understood in a way their reasons, even as her soul railed against the wickedness of the Foxworlders, and of all warriors in the galaxy. The village having willingly shot at them, deadly fire coming from almost every building they'd encountered so far, the invaders were now assuming every bit of cover hid an armed militiaman until proven otherwise. Everything with a standing wall would be flattened, even if only as a precaution.

  You monsters, she thought behind hot tears. You didn't have to. There was no-one in there except children, the ill and the elderly. Some of whom could fit in the relative safety of the basement, but most certainly not all. Not even close to all…

  She slumped face-down into the gravel, breathing slowly. In the distance, over the town of Emmer, yellow-white streaks of orbital fire split the night sky.
[close]

Author's note
Spoiler
Meant to release this as a promotional story to go with the 'SpaceLand Battle' update to Nexerelin, but ended up not doing so till now (I'd planned to release it with 0.10.3d but forgot... which is fine given its bugginess anyway).

The story was inspired by an incident in my playtest of the update, where I failed in an invasion of Tartessus. This is how the story ended:

[close]

23
Suggestions / Let player set personality of AI core officers
« on: November 05, 2021, 07:12:35 PM »
"Reprogram" their personalities (the same way we can reconfigure their skills). Or explain it as the AI just doing as the captain tells them to.

Currently AI officers are always Fearless (a renamed Reckless). This works fine for enemies, it generates the desired behavior (everyone swarms the player mercilessly). In a player fleet with mostly Steady and Aggressive officers however, the main effect is that AI ship will just sit in overwhelming enemy fire till it dies. Very annoying.
The only way to solve this that isn't "make the whole fleet reckless anyway" (which creates obvious complications of its own) is to use an AI ship that's stronger than any combination of enemy ships, i.e. alpha core Radiant.

This thread was originally going to be a modded bug report involving a mod's automated ships, but I ran a sim test and vanilla Remnant ships do it too, as seen below (note how the Fulgent is still largely trying to strafe around and otherwise hold the enemy Aurora in range, while at near-max flux, as shown by the ship direction indicator mod)


24
Posted on Discord:
747420 [Thread-3] ERROR com.fs.starfarer.combat.CombatMain  - java.lang.NullPointerException
java.lang.NullPointerException
    at com.fs.starfarer.api.impl.campaign.intel.contacts.ContactIntel.<init>(ContactIntel.java:90)
    at com.fs.starfarer.api.impl.campaign.intel.contacts.ContactIntel.addPotentialCont act(ContactIntel.java:855)
    at com.fs.starfarer.api.impl.campaign.intel.contacts.ContactIntel.addPotentialCont act(ContactIntel.java:827)
    at com.fs.starfarer.api.impl.campaign.missions.hub.BaseHubMission.endSuccess(BaseHubMission.java:1267)
    at com.fs.starfarer.api.impl.campaign.missions.hub.BaseHubMission.setCurrentStage(BaseHubMission.java:1196)
    at com.fs.starfarer.api.impl.campaign.missions.hub.BaseHubMission.checkStageChange sAndTriggers(BaseHubMission.java:1094)
    at com.fs.starfarer.api.impl.campaign.missions.hub.BaseHubMission.advanceImpl(BaseHubMission.java:791)
    at com.fs.starfarer.api.impl.campaign.intel.BaseIntelPlugin.advance(BaseIntelPlugin.java:78)
    at com.fs.starfarer.campaign.CampaignEngine.advance(Unknown Source)
    at com.fs.starfarer.campaign.CampaignState.advance(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)

Apparent sequence of events: Player took a bounty mission from a Diktat official, Volturn decivilized (presumably causing contact to no longer have a market), player completed bounty, game tried to create a contact with no market, the constructor NPE'd trying to get the market's faction.

(While looking into this I noticed that addPotentialContact assumes the market can be null sometimes)

25
General Discussion / NPC shipbuilding ramble
« on: September 17, 2021, 09:43:45 PM »
Random thoughts on the supply of ships in Starsector, in terms of gameplay, lore and the intersection between the two.

tl;dr: If you kill a lot of ships from a faction they should have a penalty to their fleet sizes elsewhere, and those ships should have more D-mods.

This post is an old draft originally meant as a not-really-a-suggestion for the game.
But I discovered some time ago that mods can change the fleet factory, so to some extent it's possible to mod it in. The main downside is that for best use, a lot of the fleet spawning classes themselves (e.g. military base industry) would need to be changed as well. Also I can't currently change the route manager.

Faction supply of ships
Spoiler
There's been complaints in the past (in the context of Nexerelin) about factions producing large fleets out of 'thin air' so to speak, without any connection to the underlying economy. I've taken some action to remedy this on my end by implementing a 'ship points' system, where markets producing supplies/fuel/heavy armaments/ship parts generates points that are consumed to spawn things like invasion fleets. But this isn't used for most fleet types, e.g. the vanilla ones.

My idea is to generalise the system for (almost) everything:
  • Every day, increment each faction's 'fleet spawning points' based on a faction's access to ship parts, supplies and fuel, with imports counting for less and local production counting for a lot more.
  • When a fleet spawns, or a fleet-spawning route is created, it draws down the spawn point pool based on the fleet FP.
  • When a fleet despawns at location, or a route ends without being wiped out or having failed its mission, it returns its surviving FP to the pool.
  • If a fleet wants to spawn but the faction doesn't have enough spawn points left for the desired fleet size, the particular code asking for the fleet can generate a smaller fleet, skip spawning completely, or overdraw from the pool.
    The spawning code might also choose to take less than it could (e.g. patrols could enter a "conserve points" mode when the pool is low).
  • Some fleet spawns could just straight up ignore the pool mechanic if they need to, like person bounty fleets.
The significance of this if that if a faction is taking a lot of losses in one location, it shows up in other places, as someone thinking about it might expect.
For example, killing a lot of patrols in Corvus will affect the number of patrols in Aztlan as well, and also the ability of the Hegemony to send expeditions against the player (and it'll work the other way around too; losing or even sending one of those oversized punitive expedition fleets should leave a dent in the sender's patrols).
[close]

D-modded ships in the Sector
Spoiler
The 'D-mod ships are the norm' thing the story (used to?) want to have can't readily be explained by inability to manufacture pristine components, now that every faction except pirates and Pathers have at least an orbital works and degraded nanoforge. Combined with 10 stability and doctrine bonuses, this gets Diktat up to 90% quality ("average 1 D-mod per hull"), and even Church gets 65% ("average 2 D-mods"). Hegemony's quality is 95% (no D-mods on average), and Tri-Tachyon is 115%.

So if the issue doesn't come from garbage being rolled off the assembly line, where is it coming from?

The answer came to me when reading this article: insufficient production/maintenance capacity for navies to consist entirely of pristine ships. During peaceful periods you could just scrap or sell anything that's too wrecked to be worth repairing (e.g. the Afflictor (D)'s description), but not in wartime (which damages or destroys the said pristine ships, while also greatly increasing total ship demand).

You know how after a battle, we players are offered a whole bunch of D-modded ships to salvage (but rarely take any of them)? That's where all the clunkers in circulation are coming from. Someone else takes the junk ships we leave behind and presses them back into service because they're needed and better than nothing.

The specific gameplay proposal:
  • When an NPC fleet loses a ship, the faction's "D-mod score" is increased. Same if a raid sent by the faction fails or such. The score decays over time.
  • When generating a new NPC fleet, the D-mod score is compared to the faction's ship production capacity (in my previous suggestion this would be the fleet spawn point pool; else you could take a snapshot of current production). Do some math with the two numbers to generate a penalty to the fleet's ship quality.
[close]

I think both these ideas point towards the concept of greater integration between campaign layer mechanics. Like having a faction-wide economy that the player can damage, rather than a bunch of colonies with the same banner + some disembodied game mechanics. Not sure if this counts as more 4X-ish than the game's current intent, but it's fun to think about nonetheless.

26
Bug Reports & Support (modded) / [0.95a-RC15] Odd save load failure
« on: June 10, 2021, 11:41:31 PM »
UPDATE: See solution in this post


Recently, at least three people on the Discord have experienced an unusual error with a save failing to load.

Sample error:
Spoiler

51291 [Thread-3] INFO  com.fs.starfarer.loading.LoadingUtils  - Loading CSV data from [DIRECTORY: C:\Users\Yonik\Desktop\Starsector 0.95a\starsector-core\..\mods\Nexerelin]
51311 [Thread-3] INFO  com.fs.starfarer.campaign.save.CampaignGameManager  - Error loading
51311 [Thread-3] ERROR com.fs.starfarer.campaign.save.CampaignGameManager  - Failed calling method
---- Debugging information ----
message             : Failed calling method
cause-exception     : java.lang.NullPointerException
cause-message       : null
method              : com.fs.starfarer.campaign.fleet.FleetMember.readResolve()
class               : com.fs.starfarer.campaign.fleet.FleetMember
required-type       : com.fs.starfarer.campaign.fleet.FleetMember
converter-type      : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
line number         : 425180
class[1]            : java.util.HashMap
converter-type[1]   : com.thoughtworks.xstream.converters.collections.MapConverter
class[2]            : com.fs.starfarer.campaign.ModAndPluginData
class[3]            : com.fs.starfarer.campaign.CampaignEngine
converter-type[2]   : com.fs.starfarer.campaign.save.I
version             : not available
-------------------------------
com.thoughtworks.xstream.converters.ConversionException: Failed calling method
---- Debugging information ----
message             : Failed calling method
cause-exception     : java.lang.NullPointerException
cause-message       : null
method              : com.fs.starfarer.campaign.fleet.FleetMember.readResolve()
class               : com.fs.starfarer.campaign.fleet.FleetMember
required-type       : com.fs.starfarer.campaign.fleet.FleetMember
converter-type      : com.thoughtworks.xstream.converters.reflection.ReflectionConverter
line number         : 425180
class[1]            : java.util.HashMap
converter-type[1]   : com.thoughtworks.xstream.converters.collections.MapConverter
class[2]            : com.fs.starfarer.campaign.ModAndPluginData
class[3]            : com.fs.starfarer.campaign.CampaignEngine
converter-type[2]   : com.fs.starfarer.campaign.save.I
version             : not available
-------------------------------
   at com.thoughtworks.xstream.core.util.SerializationMembers.callReadResolve(SerializationMembers.java:82)
   at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unma rshal(AbstractReflectionConverter.java:282)
   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.converters.collections.AbstractCollectionConverter.rea dItem(AbstractCollectionConverter.java:73)
   at com.thoughtworks.xstream.converters.collections.MapConverter.putCurrentEntryInt oMap(MapConverter.java:110)
   at com.thoughtworks.xstream.converters.collections.MapConverter.populateMap(MapConverter.java:98)
   at com.thoughtworks.xstream.converters.collections.MapConverter.populateMap(MapConverter.java:92)
   at com.thoughtworks.xstream.converters.collections.MapConverter.unmarshal(MapConverter.java:87)
   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.converters.collections.AbstractCollectionConverter.rea dItem(AbstractCollectionConverter.java:73)
   at com.thoughtworks.xstream.converters.collections.MapConverter.putCurrentEntryInt oMap(MapConverter.java:110)
   at com.thoughtworks.xstream.converters.collections.MapConverter.populateMap(MapConverter.java:98)
   at com.thoughtworks.xstream.converters.collections.MapConverter.populateMap(MapConverter.java:92)
   at com.thoughtworks.xstream.converters.collections.MapConverter.unmarshal(MapConverter.java:87)
   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.converters.collections.AbstractCollectionConverter.rea dItem(AbstractCollectionConverter.java:73)
   at com.thoughtworks.xstream.converters.collections.MapConverter.putCurrentEntryInt oMap(MapConverter.java:110)
   at com.thoughtworks.xstream.converters.collections.MapConverter.populateMap(MapConverter.java:98)
   at com.thoughtworks.xstream.converters.collections.MapConverter.populateMap(MapConverter.java:92)
   at com.thoughtworks.xstream.converters.collections.MapConverter.unmarshal(MapConverter.java:87)
   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.unma rshallField(AbstractReflectionConverter.java:503)
   at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUn marshal(AbstractReflectionConverter.java:429)
   at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unma rshal(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.unma rshallField(AbstractReflectionConverter.java:503)
   at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.doUn marshal(AbstractReflectionConverter.java:429)
   at com.thoughtworks.xstream.converters.reflection.AbstractReflectionConverter.unma rshal(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.campaign.save.CampaignGameManager.o00000(Unknown Source)
   at com.fs.starfarer.title.TitleScreenState.menuItemSelected(Unknown Source)
   at com.fs.starfarer.title.Object.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.Stringsuper.super(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)
Caused by: java.lang.NullPointerException
   at com.fs.starfarer.api.impl.campaign.econ.impl.BaseIndustry.getSupply(BaseIndustry.java:734)
   at com.fs.starfarer.api.impl.campaign.econ.impl.BaseIndustry.supply(BaseIndustry.java:316)
   at com.fs.starfarer.api.impl.campaign.econ.ResourceDepositsCondition.apply(ResourceDepositsCondition.java:193)
   at com.fs.starfarer.campaign.econ.Market.reapplyConditions(Unknown Source)
   at com.fs.starfarer.campaign.CharacterStats.refreshAllOutpostsEffectsForPlayerOutp osts(Unknown Source)
   at com.fs.starfarer.campaign.CharacterStats.refreshCharacterStatsEffects(Unknown Source)
   at com.fs.starfarer.api.impl.hullmods.PhaseField.onFleetSync(PhaseField.java:63)
   at com.fs.starfarer.campaign.fleet.FleetData.syncIfNeeded(Unknown Source)
   at com.fs.starfarer.campaign.fleet.FleetData.getCommander(Unknown Source)
   at com.fs.starfarer.campaign.fleet.FleetMember.updateStats(Unknown Source)
   at com.fs.starfarer.campaign.fleet.FleetMember.readResolve(Unknown Source)
   at sun.reflect.GeneratedMethodAccessor25.invoke(Unknown Source)
   at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
   at java.lang.reflect.Method.invoke(Unknown Source)
   at com.thoughtworks.xstream.core.util.SerializationMembers.callReadResolve(SerializationMembers.java:78)
   ... 63 more

[close]

The stack trace goes through some strange places, to say the least:
Code
Caused by: java.lang.NullPointerException
at com.fs.starfarer.api.impl.campaign.econ.impl.BaseIndustry.getSupply(BaseIndustry.java:734)
at com.fs.starfarer.api.impl.campaign.econ.impl.BaseIndustry.supply(BaseIndustry.java:316)
at com.fs.starfarer.api.impl.campaign.econ.ResourceDepositsCondition.apply(ResourceDepositsCondition.java:193)
at com.fs.starfarer.campaign.econ.Market.reapplyConditions(Unknown Source)
at com.fs.starfarer.campaign.CharacterStats.refreshAllOutpostsEffectsForPlayerOutposts(Unknown Source)
at com.fs.starfarer.campaign.CharacterStats.refreshCharacterStatsEffects(Unknown Source)
at com.fs.starfarer.api.impl.hullmods.PhaseField.onFleetSync(PhaseField.java:63)
at com.fs.starfarer.campaign.fleet.FleetData.syncIfNeeded(Unknown Source)
at com.fs.starfarer.campaign.fleet.FleetData.getCommander(Unknown Source)
at com.fs.starfarer.campaign.fleet.FleetMember.updateStats(Unknown Source)
at com.fs.starfarer.campaign.fleet.FleetMember.readResolve(Unknown Source)
Is stuff being loaded out of order (so it tries to sync the player fleet before the industries get their supply fields regenerated)?
Is there a user-side way to fix this?

27
If you steal one econUnit of commodities during a raid, the local availability of that commodity goes down by one.
However, if you steal 0.99 econUnits each in five consecutive raids, there appears to be no effect on local availability.

This has potential implications for optimal 'harvesting' of markets (or conversely for people who are specifically trying to reduce availability of the commodity, although in such a case they're probably better off doing an industry disruption.)

28
Suggestions / Way to make ally fleet deploy reserves
« on: June 04, 2021, 05:49:52 AM »
Related to a recent Discord discussion:

In a big battle with a friendly fleet, after some time, the player side may have some spare DP (from ships lost/retreated, or now from capturing objectives) that ought to be spent on reinforcements (as the battle is still ongoing and we need the extra power). Often in such cases, the ally fleet has some strong ships in reserve that I wish they would deploy, but they don't. Like they're expecting me to deploy my ships. (I think they do this even if the player does not in fact have any combat ships left)

It might be good if there was a button on the command GUI to specifically tell the ally "I'm not deploying anything right now, you spend the DP as you see fit". Downside: Somewhat exploitable in that player has a clear incentive to let the ally do all the things that risk a ship loss.
If we wanted to give the player more control than is strictly believable, could even let player pick specific ally ships to deploy instead of whatever random junk the admiral AI pretends is appropriate for the situation. (Maybe only for player.faction ships?)

29
HubMissionWithTriggers.beginWithinHyperspaceRangeTrigger (e.g. when trying to generate a complication) will attempt to get the center of a nonexistent star system. AFAIK the resulting NPE causes the interaction dialog to freeze (no exit option is generated and none of the previously generated dialog options do anything, have to kill it with console).

Example log screenshot

30
- Download and enable Nexerelin (and LazyLib and MagicLib)
- Start a new game with the tutorial start (main NGC menu -> Proceed -> Custom start)
- Pick the ensign start, or custom start with player level 1 (important)
- New game finishes loading, then crashes to desktop
- ...but the new game save loads fine and player can continue?
- Also this doesn't happen if the player sets a starting level >1?

137301 [Thread-3] ERROR com.fs.starfarer.combat.CombatMain  - java.lang.NullPointerException
java.lang.NullPointerException
   at com.fs.starfarer.campaign.CampaignState.getZoomFactor(Unknown Source)
   at com.fs.starfarer.campaign.fleet.CampaignFleetMemberView.renderWeapons(Unknown Source)
   at com.fs.starfarer.ui.oOOO.OoOO.o00000(Unknown Source)
   at com.fs.starfarer.ui.oOOO.OoOO.?00000(Unknown Source)
   at com.fs.starfarer.campaign.ui.String.super(Unknown Source)
   at com.fs.starfarer.ui.newnew.renderImpl(Unknown Source)
   at com.fs.starfarer.ui.o00O.render(Unknown Source)
   at com.fs.starfarer.ui.e$Oo.renderImpl(Unknown Source)
   at com.fs.starfarer.ui.o00O.render(Unknown Source)
   at com.fs.starfarer.ui.v.renderImpl(Unknown Source)
   at com.fs.starfarer.ui.e.renderImpl(Unknown Source)
   at com.fs.starfarer.ui.o00O.render(Unknown Source)
   at com.fs.starfarer.ui.v.renderImpl(Unknown Source)
   at com.fs.starfarer.ui.o00O.render(Unknown Source)
   at com.fs.starfarer.ui.v.renderImpl(Unknown Source)

Additional request: Currently, after the first tutorial battle, if player is already past level 2 then CampaignTutorialScript adds negative XP (lines 237-240). Could it be made to not add the calculated XP amount if it's negative?

Pages: 1 [2] 3 4 ... 12