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.

Topics - Sinosauropteryx

Pages: [1]
1
Bug Reports & Support / Forum bug: Spoiler tags no longer expanding
« on: January 09, 2020, 12:05:11 PM »
For some reason, I can't click to expand spoiler tags, as of yesterday. I can't think of anything I did or that happened. So far I have tried:
- Relogging
- Clearing cookies
- Using a different browser
- Rebooting my machine
to no avail.

Anyone seen this before or have any suggestions?

Preemptive apologies if this shouldn't be here.

2
Modding / The black magic behind "modules on modules"
« on: October 29, 2019, 10:31:00 AM »
Hi, who's interested in how this guy works?

Maybe you want to make your own? Keep reading!

There's several layers to the whole thing, but I'm mostly going to focus on the primary part, how to make articulated chains of modules that can move and bend however you want them to. It might even be simpler than you expected. To start, you'll need a few things:

1. .ship file for your ship.
The only unusual thing about this is you will want a station slot for every one of your modules, and it helps to label them in a coherent way (for later). For my 8-segment snake, I made 7 station slots called "SEGMENT 1" through "SEGMENT 7." Only the location of the first slot matters, the rest can be posed in a way that looks good on the refit screen. (Their locations will be moved dynamically during battle.)
Picture Example
[close]


2. .ship files for your modules.
Mine uses a single .ship file as all the segments are the same, but they don't have to be.
What IS important is, each .ship file must have the ship's center of gravity located at the point the module attaches to the previous one, which is probably heavily offset towards the front. The module will rotate around this point.
The other important thing is each ship must have a station slot called SEGMENT. This will be the point at which the next segment is attached.
Picture Examples
[close]


3. .variant files for your ship and module, as well as ship_data.csv entries. These are done like you would a normal module ship - just make sure all segments are attached to the station slots of your mothership.


4. A container class, which I called SinuousSegment, that contains a ShipAPI, the previous SinuousSegment, and the next SinuousSegment. I also put in a method that assigns a list of child modules to an array of SinuousSegments, based on the name of the station slot they're occupying.
KT_SinuousSegment
Code
package data.scripts.util;

import com.fs.starfarer.api.combat.ShipAPI;
import java.util.List;

public class KT_SinuousSegment {
    public ShipAPI ship = null;
    public KT_SinuousSegment nextSegment = null;
    public KT_SinuousSegment previousSegment = null;

    public static void setup(KT_SinuousSegment[] segments, List<ShipAPI> ships, String[] args){

        for (int f = 0; f < segments.length; f++){
            // Iterates through SinuousSegment array and connects them in order
            segments[f] = new KT_SinuousSegment();
            if (f > 0){
                segments[f].previousSegment = segments[f-1];
                segments[f-1].nextSegment = segments[f];
            }

            // Assigns each module to a segment based on its station slot name
            for (ShipAPI s : ships) {
                s.ensureClonedStationSlotSpec();

                if (s.getStationSlot() != null && s.getStationSlot().getId().equals(args[f])) {
                    segments[f].ship = s;

                    // First module only: Assigns mothership as its previousSegment
                    if (f == 0){
                        segments[f].previousSegment = new KT_SinuousSegment();
                        segments[f].previousSegment.ship = s.getParentStation();
                        segments[f].previousSegment.nextSegment = segments[f];
                    }
                }
            }
        }
    }

    public KT_SinuousSegment(){
    }

    public KT_SinuousSegment(ShipAPI newShip) {
        ship = newShip;
        previousSegment = new KT_SinuousSegment();
        previousSegment.ship = ship.getParentStation();
        previousSegment.nextSegment = this;
    }

    public KT_SinuousSegment(ShipAPI newShip, KT_SinuousSegment newPrevious){
        ship = newShip;
        previousSegment = newPrevious;
        previousSegment.nextSegment = this;
    }

}
[close]
(Note, there's a problem with displaying code tags inside spoiler tags, so click the clipboard icon on the right and paste it into a notepad.)


5. A hullmod, which I called Sinuous Body. The bulk of the work is done here.
KT_SinuousBody
Code
package data.hullmods;

import com.fs.starfarer.api.Global;
import com.fs.starfarer.api.combat.*;
import com.fs.starfarer.api.combat.ShipAPI.HullSize;
import com.fs.starfarer.api.combat.ShipwideAIFlags.AIFlags;
import data.scripts.util.KT_SinuousSegment;
import java.util.List;
import com.fs.starfarer.api.combat.ShipEngineControllerAPI.ShipEngineAPI;

public class KT_SinuousBody extends BaseHullMod {

    public static final int NUMBER_OF_SEGMENTS = 7;
    public static final float RANGE = 150f; // Flexibility constant. Range of movement of each segment.
    public static final float REALIGNMENT_CONSTANT = 8f; // Elasticity constant. How quickly the body unfurls after being curled up.

    private KT_SinuousSegment[] seg = new KT_SinuousSegment[NUMBER_OF_SEGMENTS];
    private String[] args = new String[NUMBER_OF_SEGMENTS];


    public String getDescriptionParam(int index, HullSize hullSize) {
return null;
}


    public void applyEffectsBeforeShipCreation(HullSize hullSize, MutableShipStatsAPI stats, String id) {
    }

    @Override
    public void applyEffectsAfterShipCreation(ShipAPI ship, String id) {


    }


    @Override
    public boolean isApplicableToShip(ShipAPI ship) {
        return true;
    }

    @Override
    public void advanceInCombat(ShipAPI ship, float amount) {

        super.advanceInCombat(ship, amount);

        // Initiates the SinuousSegment array.
        args[0] = "SEGMENT1";
        args[1] = "SEGMENT2";
        args[2] = "SEGMENT3";
        args[3] = "SEGMENT4";
        args[4] = "SEGMENT5";
        args[5] = "SEGMENT6";
        args[6] = "SEGMENT7";

        List<ShipAPI> children = ship.getChildModulesCopy();

        advanceParent(ship,children);
        for (ShipAPI s : children){
            advanceChild(s, ship);
        }

        KT_SinuousSegment.setup(seg, children, args);

        // Iterates through each SinuousSegment
        for (int f = 0; f < NUMBER_OF_SEGMENTS; f++) {
            if (seg[f] != null && seg[f].ship != null && seg[f].ship.isAlive()) {
                try {

                    // First segment is "vanilla" / attached to mothership. Rest are pseudo-attached to previous segment's SEGMENT slot
                    if (f != 0)
                        seg[f].ship.getLocation().set(seg[f].previousSegment.ship.getHullSpec().getWeaponSlotAPI("SEGMENT").computePosition(seg[f].previousSegment.ship));


                    // Each module hangs stationary in real space, instead of turning with the mothership, unless it's at max turning range
                    float angle = normalizeAngle(seg[f].ship.getFacing() - seg[f].ship.getParentStation().getFacing());

                    // angle of module is offset by angle of previous module, normalized to between 180 and -180
                    float angleOffset = getAngleOffset(seg[f]);
                    if (angleOffset > 180f)
                        angleOffset -= 360f;

                    // angle of range check is offset by angle of previous segment in relation to mothership
                    float localMod = normalizeAngle(seg[f].previousSegment.ship.getFacing() - seg[f].ship.getParentStation().getFacing());

                    // range limit handler. If the tail is outside the max range, it won't swing any farther.
                    if (angleOffset < RANGE * -0.5)
                        angle = normalizeAngle(RANGE * -0.5f + localMod);
                    if (angleOffset > RANGE * 0.5)
                        angle = normalizeAngle(RANGE * 0.5f + localMod);

                    // Tail returns to straight position, moving faster the more bent it is - spring approximation
                    angle -= (angleOffset / RANGE * 0.5f) * REALIGNMENT_CONSTANT;

                    seg[f].ship.getStationSlot().setAngle(normalizeAngle(angle));
                } catch (Exception e) {
                    // This covers the gap between when a segment and its dependents die
                }

            } else {
                // When a segment dies, remove all dependent segments
                for (int g = f; g < NUMBER_OF_SEGMENTS; g++){
                    if (seg[g] != null && seg[g].ship != null && seg[g].ship.isAlive()) {
                        try {
                            seg[g].ship.setHitpoints(1f);
                            seg[g].ship.applyCriticalMalfunction(seg[g].ship.getAllWeapons().get(0));
                            seg[g].ship.applyCriticalMalfunction(seg[g].ship.getEngineController().getShipEngines().get(0)); // The ONLY way I've found to kill a module
                        } catch (Exception e){
                        }
                        //seg[g].ship.getFleetMember().getStatus().setDetached(0,true);
                        //seg[g].ship.getFleetMember().getStatus().applyDamage(100000);
                        //Global.getCombatEngine().removeEntity(seg[g].ship);
                    }
//                    seg[g] = null;
                }
            }
        }

    }

    private float normalizeAngle (float f){
    if (f < 0f)
            return f + 360f;
    if (f > 360f)
        return f - 360f;
    return f;
    }

    private float getAngleOffset (KT_SinuousSegment seg){
        try {
            return normalizeAngle(seg.ship.getFacing() - seg.previousSegment.ship.getFacing());
        } catch (Exception e) {
            return 0f;
        }
    }

    //////////
    // This section of code was taken largely from the Ship and Weapon Pack mod.
    // I did not create it. Credit goes to DarkRevenant.
    //////////
    private static void advanceChild(ShipAPI child, ShipAPI parent) {
        ShipEngineControllerAPI ec = parent.getEngineController();
        if (ec != null) {
            if (parent.isAlive()) {
                if (ec.isAccelerating()) {
                    child.giveCommand(ShipCommand.ACCELERATE, null, 0);
                }
                if (ec.isAcceleratingBackwards()) {
                    child.giveCommand(ShipCommand.ACCELERATE_BACKWARDS, null, 0);
                }
                if (ec.isDecelerating()) {
                    child.giveCommand(ShipCommand.DECELERATE, null, 0);
                }
                if (ec.isStrafingLeft()) {
                    child.giveCommand(ShipCommand.STRAFE_LEFT, null, 0);
                }
                if (ec.isStrafingRight()) {
                    child.giveCommand(ShipCommand.STRAFE_RIGHT, null, 0);
                }
                if (ec.isTurningLeft()) {
                    child.giveCommand(ShipCommand.TURN_LEFT, null, 0);
                }
                if (ec.isTurningRight()) {
                    child.giveCommand(ShipCommand.TURN_RIGHT, null, 0);
                }
            }

            ShipEngineControllerAPI cec = child.getEngineController();
            if (cec != null) {
                if ((ec.isFlamingOut() || ec.isFlamedOut()) && !cec.isFlamingOut() && !cec.isFlamedOut()) {
                    child.getEngineController().forceFlameout(true);
                }
            }
        }
        /* Mirror parent's fighter commands */
        if (child.hasLaunchBays()) {
            if (parent.getAllWings().size() == 0 && (Global.getCombatEngine().getPlayerShip() != parent || !Global.getCombatEngine().isUIAutopilotOn()))
                parent.setPullBackFighters(false); // otherwise module fighters will only defend if AI parent has no bays
            if (child.isPullBackFighters() ^ parent.isPullBackFighters()) {
                child.giveCommand(ShipCommand.PULL_BACK_FIGHTERS, null, 0);
            }
            if (child.getAIFlags() != null) {
                if (((Global.getCombatEngine().getPlayerShip() == parent) || (parent.getAIFlags() == null))
                        && (parent.getShipTarget() != null)) {
                    child.getAIFlags().setFlag(AIFlags.CARRIER_FIGHTER_TARGET, 1f, parent.getShipTarget());
                } else if ((parent.getAIFlags() != null)
                        && parent.getAIFlags().hasFlag(AIFlags.CARRIER_FIGHTER_TARGET)
                        && (parent.getAIFlags().getCustom(AIFlags.CARRIER_FIGHTER_TARGET) != null)) {
                    child.getAIFlags().setFlag(AIFlags.CARRIER_FIGHTER_TARGET, 1f, parent.getAIFlags().getCustom(AIFlags.CARRIER_FIGHTER_TARGET));
                } else if (parent.getShipTarget() != null){
                    child.getAIFlags().setFlag(AIFlags.CARRIER_FIGHTER_TARGET, 1f, parent.getShipTarget());
                }
            }
        }
    }
    private static void advanceParent(ShipAPI parent, List<ShipAPI> children) {
        ShipEngineControllerAPI ec = parent.getEngineController();
        if (ec != null) {
            float originalMass = 2500;
            int originalEngines = 18;

            float thrustPerEngine = originalMass / originalEngines;

            /* Don't count parent's engines for this stuff - game already affects stats */
            float workingEngines = ec.getShipEngines().size();
            for (ShipAPI child : children) {
                if ((child.getParentStation() == parent) && (child.getStationSlot() != null) && child.isAlive()) {
                    ShipEngineControllerAPI cec = child.getEngineController();
                    if (cec != null) {
                        float contribution = 0f;
                        for (ShipEngineAPI ce : cec.getShipEngines()) {
                            if (ce.isActive() && !ce.isDisabled() && !ce.isPermanentlyDisabled() && !ce.isSystemActivated()) {
                                contribution += ce.getContribution();
                            }
                        }
                        workingEngines += cec.getShipEngines().size() * contribution;
                    }
                }
            }

            float thrust = workingEngines * thrustPerEngine;
            float enginePerformance = thrust / Math.max(1f, parent.getMassWithModules());
            parent.getMutableStats().getAcceleration().modifyMult("KT_sinuousbody", enginePerformance);
            parent.getMutableStats().getDeceleration().modifyMult("KT_sinuousbody", enginePerformance);
            parent.getMutableStats().getTurnAcceleration().modifyMult("KT_sinuousbody", enginePerformance);
            parent.getMutableStats().getMaxTurnRate().modifyMult("KT_sinuousbody", enginePerformance);
            parent.getMutableStats().getMaxSpeed().modifyMult("KT_sinuousbody", enginePerformance);
            parent.getMutableStats().getZeroFluxSpeedBoost().modifyMult("KT_sinuousbody", enginePerformance);
        }
    }

}
[close]
(Line 17, line 47) First, an array of SinuousSegments and an array of Strings are created. The Strings are assigned to the names of the station slots on the mothership. (SEGMENT1, etc.)
(Line 62) Next, SinuousSegment.setup is called, passing the SinuousSegment array, ship.getChildModules(), and the String array. This leaves you with a SinuousSegment array that iterates through the segments in order, and each segment can refer to its previous or next segment.
(Line 65) Then the main for loop is called. First comes a check - is the segment alive?
(Line 67) Then a try block - this is a little inelegant, but because there is only one way to kill a module with commands, and it takes several frames to make happen, there will be a several-frame gap that will throw exceptions every time a segment with dependents dies. The try-catch just gets us through those frames.
(Line 70) Then there's the real meat, starting with the key line to making this all work:
Code
if (f != 0)
    seg[f].ship.getLocation().set(seg[f].previousSegment.ship.getHullSpec().getWeaponSlotAPI("SEGMENT").computePosition(seg[f].previousSegment.ship));
Each segment's location (other than the first segment's) is updated to be where the previous segment's SEGMENT slot is. This is the whole illusion: the module has a virtual station slot on the back of another module, and is moved there every frame.
Most other stuff within the loop after that is what determines the way the segments move. For my Quetzalcoatl, modules are set to hang unmoving as the head turns, then adjust back to "neutral" with a simulated spring action, as well as each having a limited range of movement. But it can move in any number of ways, the possibilities are endless. Just remember you're using the module's station slot's rotation to change its angle:
Code
seg[f].ship.getStationSlot.setAngle()
(Line 99) After that, the "else" to the "if alive" check. This part handles killing all the dependent segments of a segment that's died.
Everything south of that is boilerplate-type module stuff, most of which was taken from DarkRevenant's glorious Ship & Weapon Pack. Really can't thank him enough for innovating in this area (and many others).

And that's pretty much it. Once you're able to get your segments lined up the way you like, getting them to move right is just trial and error. I'm looking forward to seeing some cool stuff, happy coding!

3
Mods / [0.9.1a] Kingdom of Terra (v0.10.1) - Hotfix
« on: October 06, 2019, 02:15:50 PM »

In the belly of their hollow planet, the Kingdom of Terra plans its uprising! Prepare your trembling Sector for the marvels of science gone awry, and the horrors of nature unleashed!
Lore
The planet Neoterra exists co-spacially within an anomaly that opens a vast, immeasurable pocket of habitable space inside the planet's core, without affecting its gravity or other external properties. The nature of the anomaly causes "real" time to pass more slowly as one ventures deeper into the planet, which has resulted in a human population far older than the hundred-ought cycles that have passed since the planet's discovery. Conditions within the planet are exemplary for sustaining all kinds of life, and the overlapping gradients of timeflow, gravity, heat, moisture, and atmospheric composition allow for unmatched biodiversity - including immense gigafauna unseen on any conventional planet.

Neoterra is home to countless savages who, for centuries, have eked out a hand-to-mouth existence in the planet's harsh underground ecosystem. From that crucible of constant tribal warfare emerged the Kingdom of Terra, Neoterra's foremost political body, ruled by self-styled God-King Tyrannus Rex I and his court of technocrats. Having rediscovered space travel only recently (and accidentally), the Kingdom's agents wasted no time in collecting artifacts and technologies from Persean space. The secrets of these marvels are jealously guarded from the rest of the planet's inhabitants, whose colossal ignorance serves as the Kingdom's fulcrum of control over them. With deception and science creating an illusion of true godhood, the Kingdom corrals the millions-strong population into a fearsome - or, at the very least, numerous - fighting force.

Now, perhaps sipping his own communion wine, Tyrannus Rex I has set his sights on the rest of the Persean Sector, launching his Great Emergence with ambitions of conquest. And while his military doctrine may be questionable, the might of his industry - which, due to Neoterra's anomalous time passage, allows hundreds of hours of production each "outside" day - is perhaps a match for the great multi-system powers of the Sector.
[close]

Kingdom ships run the gamut from cobbled-together clunkers to impossible feats of engineering. Common themes include: close-range and melee specialization, articulated multi-module hulls, angled engines and mobility systems conferring unconventional movement, prodigious use of built-in weapons, above-average fuel capacity, and a tendency to invest in armor and hull over shields.
Ships

Slingshot-class bomber wing
A stone-age fighter at a rock-bottom price.


Goon-class heavy fighter wing
An imposing pair of barrels.


Shaman / Chieftain-class rocket bomber wings
Pyrotechnic crews.


Anchor-class heavy distraction drone
It weighs a lot.


Snaggletooth-class frigate / Fossil Fueler-class tanker
A caveman-piloted dinosaur skull (and its capacious retrofit).


Smasher-class frigate
A self-throwing brick. (Also available in pirate.)


Queen-class drone carrier
A little frigate with a big family.


Trilobite-class combat freighter / Ammonite-class carrier freighter
A multipurpose machine that masters miscellaneous missions while mounting multiple medium missiles (and its capacious carrier counterpart).


Rhino-class destroyer / Mammoth-class heavy cruiser
These fossils dig you up. (Rhino also available in jihad.)


Rascal-class frigate / Monster-class destroyer
Well-armed ships that don't pull punches.


Urchin-class frigate / Basilisk-class cruiser
Powerful posteriors producing profusions of pointy pain.


Draco-class destroyer / Wyvern-class cruiser
High-tech status symbols for the discerning aristocrat.


Pulverizer-class battleship
Wrecking ball in the front, atom bomb in the back.


Hatchling-class frigate / Quetzalcoatl-class battlecruiser
Electromagnetic coils.
[close]

Kingdom R&D labs are staffed with all the scientists rejected from other factions for their high-risk psych profiles.
Weapons

Grinder
Indiscriminate spark sprayer.


Boomstick / Blunderbuss
A familiar-sounding weapon, and its ornery grandfather.


Rockchucker
Let he who is without sin cast the first stone.


Heckbore Cannon
It just works.


Bee Shooter
Pump 'em full of bees.


Bully Beam / Big Bully Beam
Pushy PD options.


Lava Belcher / Lava Spewer
Volcanic panic.


Grappling Beam
Animal magnetism.


CHAD Lance
Ouch!


Telekinesis Ray
Rearrange the cosmos.


Carcharos SRM
Autoloading shield-nibblers.


Pyre rocket launcher / Pyre rocket pod
Dumbfire, or the dumbest fire?


Flushpipe-class torpedo / Plunger Flushpipe launcher
Teleports behind you.


Triceratorp
Very heavy damage.


Thresher-class torpedo
Pretty much what it looks like.

And if you really like overkill...

Winnower-class meme torpedo
Achieved by breeding a Reaper with a Titan.
(This one is marked as "SYSTEM" in weapon_data.csv by default. Remove that flag to play with it - but it still won't be set to spawn in the campaign, for humanity's sake.)
[close]
[close]
Videos & gifs

Much appreciated:
- Bug & balance testing.
- Sprite criticism.
- Suggestions of any kind.

Thanks to:
- Thule, xenoargh, Snrasha, DrakonST, axlemc131, Makina, HELMUT, Medikohl, J0hn Shm0, and Zen for their Spiral Arms contributions!
- DarkRevenant, for inspirational (and in parts copied) code in SWP and Interstellar Imperium!
- cycerin et al., for the same as above but from Blackrock!
- Vayra, Tartiflette, King Alfonzo, and kazi for their great walkthroughs!
- Alex, Sundog, Soren, LazyWizard, Histidine, and anyone else who was helpful in the misc modding thread and discord!
- Interestio for use of his portraits, straight from the Intertesting Portraits Pack (highly recommended)!
- HeartofDiscord, Hasp, and Inabikari for valuable balance feedback!
- Everyone who reported bugs (too many to name)!

Changelog
Aug 27, 2020: v0.10.1 HOTFIX, save compatible.
- Bugfix: Vanilla known weapon blueprints were being wiped from pirate/indie factions. This is no longer the case.
- Version file should be a little more accurate.
- Ammonite codex description added.

July 24, 2020: v0.10 released.
- New ships: Draco-class destroyer, Wyvern-class cruiser, Ammonite-class carrier freighter.
- New fighters: Shaman & Chieftain rocket bombers, Anchor really heavy fighter.
- New weapons: Pyre rocket launcher/pod, lava belcher/spewer, heckbore cannon.
- New hull mod: Overdriven Fighters.
- New high value bounty.
- Queen: Overhaul of hive bomb. Now reloads ammo over time, producing larger clouds of Wasps if left to charge longer. Damage lowered to compensate.
- Blast Dampeners hullmod now affects modules.
- "Bee-making" weapons will no longer cause chatter with Combat Chatter.
- Many melee ships are now made at least Aggressive by default. This doesn't override the personality of an onboard officer.
- Snake ships: Fixed a bug that caused AI to get stuck in a loop when facing to the right, plus other minor tweaks. Movement should be a little smoother now.
- Bully, big bully, CHAD: New sprites.
- Minor aesthetic, balance, and AI tweaks all over.
- Noteworthy balance changes:
-- Rhino/Mammoth drill: 6000 DPS -> 4800
-- Basilisk, Urchin: Middle tail sections made beefier.
-- Bully beam: 500 range -> 400
-- Big bully beam: 600 range -> 800
-- Snake ship rear-facing turret arcs: 240 -> 300
- Campaign-level changes:
-- Planet Neoterra has been added to normal trade routes.
-- The faction has been made more aggressive, generally less agreeable towards other factions, and likely to start wars.
-- Caveman portraits made available for players.
-- Vayra's Sector integration - KoT now stages raids and builds bases.

Older Updates
Feb 13, 2020: v0.9.5 released.
- New hullmods: Integral Density, Blast Dampeners.
- Quetzalcoatl: Nerfs.
-- Hull, armor, and shield of head segment all reduced by ~15%.
-- EMP emitter: Cooldown increased (9s -> 12s), also affects Hatchling.
-- Overdriven escape: Major speed/maneuverability cut (-40%), also affects Hatchling.
- Smasher: Divebomb nerfed (10x mass -> 7x, 80% damage resist -> 65%). Psst, use the new hull mods to bring it (mostly) back up to spec!
- Trilobyte: Buffed. Receives bonus speed in combat when not equipped with logistics hullmods.
- Flushpipe: Buffed (500en/2000emp -> 750en/2500emp)
- Pulverizer: AI improvements. Should blast off into empty space less often.
- Pulverizer system: Charge-up time increased (3s -> 4s)
- CHAD Lance: Beam will now overload hit modules, as well as the mothership.
- Commissioned Crews hullmod has been changed.

Feb 3, 2020: v0.9 released.
- New ship: Pulverizer-class battleship.
- A load of weapon nerfs:
-- Blunderbuss: Damage lowered (3200 -> 2400)
-- Flushpipe: Damage lowered (1500en/5000emp -> 500en/2000emp)
-- Flushpipe rack: OP cost raised (4 -> 5)
-- Triceratorp: Damage of submunitions lowered (1500 -> 1000)
-- Rockchucker: Fixed bug that made AI too leery of it, no stat changes
- And a buff:
-- Slingshot bomber: OP cost lowered (4 -> 0)

Jan 22, 2020: v0.8 released.
- New ships, all frigates: Rascal, Urchin, Hatchling, and Fossil Fueler.
- New weapons: Flushpipe-class torpedo (small & medium), Triceratorp-class torpedo (small & medium), Blunderbuss (medium ballistic)
- Carcharos SRM buffed: OP lowered (6 -> 3)
- Boomstick nerfed: Flux raised (200 -> 300)
- Rockchucker nerfed: Flux raised (50 -> 120)
- Quetzalcoatl buffed: Changed final tail segment's medium turret (hybrid -> universal)
- Basilisk, Monster, Quetzalcoatl: Subtle AI improvements, and fixed a bug causing AI to fail in sim opponents.
- Snaggletooth: Sprite touchup.
- Kingdom of Terra faction starts out a little less hostile to player and most factions.
- Garghool (system) has an additional jump point closer to the main planet.
- Loads of small tweaks and improvements, both aesthetic and mechanical. I couldn't possibly list them all because I forget most of them.
NOTE: I'm pretty sure this won't break saves, but it's a lot of stuff so who knows! Tread carefully.

Jan 16, 20202: v0.7.3 HOTFIX released.
- Quetzalcoatl no longer becomes a frigate permanently after losing its body. (Any existing frigate Quetz may still remain that way for the rest of its life)
- Grappling beams should no longer appear on pirate stations or ships.

Jan 14, 20202: v0.7.2 HOTFIX released.
- Fixed issue with Basilisk tail out-of-bounds exception (hopefully for good this time)
- Fixed misleading DPS readout of Grinder.

Jan 12, 2020: v0.7.1 HOTFIX released.
- Fixed crash caused by Ouroboros lacking some engines.
- Goon heavy fighter is now correctly labeled in the codex.

Jan 10, 2020: v0.7 released.
- Quetzalcoatl changes:
- - New system.
- - Substantial buffs to head segment's shield, armor, hull (at least double the survivability).
- - Body segment survivability is now concentrated more in the front segments (and received an overall small buff).
- - Body segment shield arc increased (30 -> 45).
- - Auxiliary Thrusters are now built-in, with concurrent drop in OP (150 -> 130).
- - When the body is destroyed, the head becomes a speedy little super-frigate.
- - AI improvements, movement is more slithery than ever before.
- - Changes apply to unique dreadnought version as well.
- New fighter wing: Goon-class heavy fighter.
- New skin: Rhino (LP).
- Carcharos missile: Buffed (75 -> 100 dmg). Also affects Snaggletooth version.
- Snaggletooth: Cargo capacity increased (50 -> 75).
- Queen: Shield arc increased (180 -> 360), flux pool increased (1200 -> 1800)
- Weapon distribution changes: Pirates and independents will now have limited access to more common Kingdom weapons and LPCs.
NOTE: Shouldn't break saves, BUT if you have an existing Quetzalcoatl, it might look and play a little funny.

Jan 6, 2020: v0.6 released.
Ships & Combat
- New ship: Mammoth-class heavy cruiser.
- New fighter wing: Slingshot-class bomber.
- New skin: Smasher (P).
- Returning ship: Trilobyte, with visual overhaul and some mechanical tweaks.
- Smasher: Ship system buffed (3 charges, flux cost: 1000 -> 500, distance/recovery time halved)
- Smasher, Monster: AI improvements. Will use systems to engage in melee range much more often.
- Across-the-board ship price adjustments (generally cheaper)
Faction & Campaign
- New faction flag.
- New faction portraits.
- New faction ship and person names.
- New dialogue and descriptions for some faction interactions.
- Faction markets now have access to fuel.
- The Kingdom has emerged from the shadows and is no longer hidden! (translation: I gave up trying to get the hidden market to work)
I don't think this one will break saves, though not all changes will appear if you update an existing save.

Dec 23, 2019: v0.5 released.
- Quetzalcoatl changes: Complete sprite revamp, including smaller size more in line with other capitals. Somewhat improved AI on slither movement and ship system. Ship system has been toned down significantly (3.5s duration, from 7).
- Vayra's Sector unique bounty added: Ouroboros-class dreadnought. (iiiittt's biiiiggg)
- Commissioned Crews hullmod added: Terran Density.
- Trilobyte, Bat, Verne, and Invader have been removed from fleets and markets for crimes against aesthetics. Graphical and mechanical overhauls may come in the future, in similar style to the Quetzal. (If you liked any of these ships, let me know, and I will prioritize it higher.)
Say goodbye to these ugly sprites
[close]
This one may break saves - assume it does!

Dec 5, 2019: v0.4.1 hotfix released.
- Fixed bug where Basilisk and Smasher systems wouldn't work if the ship had D-mods.
- Fixed issue with improper .csv case that caused problems on Linux.

Nov 30, 2019: v0.4 released.
- New ship: Monster-class destroyer.
- New weapon: CHAD Lance.
- Sprite touchups for Bully & Big Bully.
- Minor aesthetic changes, mostly to codex and statblocks.

Nov 12, 2019: v0.3 released.
- New weapons: Boomstick, Telekinesis Ray.
- Campaign music added.
- Version Checker integration added.
- Some small balance tweaks, notably: Verne reduced to 26 DP (was 30).
- Small aesthetic changes to faction fleet composition, codex entries, etc.
- Under-the-hood changes to improve physics and stop memory leaks.

Nov 6, 2019, 7pm EST: !HOTFIX! ay chihuahua!
- Fixed issue with Basilisk during very laggy battles, where its system would not operate.
- Slightly buffed Basilisk tail weapon to be immune to EMP/flameouts. (EMP will still disable engines, preventing system use, but weapon being disabled was visually confusing.)

Nov 6, 2019: v0.22 released.
- New ship: Basilisk-class cruiser.
- Fixed a bug where Wasp-spawning weapons would add to deployed total.

Nov 3, 2019: v0.211 released.
- BUGFIX: Issue within Nexerelin file caused crashes. (Thanks to Serpens for catching it)

Nov 3, 2019: v0.21 released.
- New ships: Smasher-class frigate, Queen-class drone carrier.
- Two new missions featuring the new ships.
- Fixed bugs and cleaned up code in Rhino drill among others.
This shouldn't break saves, let me know if it does and I'll try to post a fix.

Oct 31, 2019: v0.2 released.
- New faction: Kingdom of Terra.
(Note, the faction and its system still use a lot of placeholder and vanilla assets. Expect everything about it to improve in the future. But it works!)
- New capital ship: Invader-class battleship.
- New weapons: Carcharos SRM, Grinder.
- Buff - Improved Snaggletooth's built-in Carcharos and system, it can now fire twice as many missiles per minute.
- Nerf - Changed Verne's flux stats (capacity up, dissipation down) and turrets (2 medium -> 2 small).
- Nerf - Reduced Rhino's drill's damage reduction (90% -> 80%).
- Fixed an issue with Quetzalcoatl's bounds.
- Minor changes to ship burn levels, variants, codex stuff.
- With the new faction, availability of most hulls and weapons has been cut from other factions.
I'm unsure if this update will break saves - so treat it like it will!

Oct 26, 2019: v0.14 released.
- New ship: Quetzalcoatl-class battlecruiser.
- Hullmod icons added.

Oct 17, 2019: v0.13 released.
- New ship: Trilobyte-class combat freighter.
- New weapons: Bully Beam, Big Bully Beam, Rockchucker.
- Grappling Beam: Physics adjustment. Should work more consistently across different ship weights. (Approximately a sidegrade.)
- Rhino's Drill: Lowered rate of fire, increased damage per shot, mostly for performance during laggy battles.  (Approx sidegrade. Lower overall DPS but higher vs armor.)
- Bee Shooter: Increased DPS, decreased OP cost. (Buff)

Oct 8, 2019: v0.12 released.
- Bat-class phase destroyer added.
- Grappling Beam added.
- Adjustment to Verne's built-in hullmod and speed. (Overall buff)

Oct 7, 2019: Fixed bloated .jar file.
[close]

4
Modding / [0.9.1a] Toad Superheavy Bomber
« on: September 23, 2019, 02:26:01 PM »
https://www.youtube.com/watch?v=honXA_zHDZE

This is my first modding attempt. The idea was to make a fighter that deployed fighters. Conceptually, I like where it ended up. It's probably broken in half, but I don't think I have the experience to balance it properly. Please, let me know what needs fixing.

I've never done spriting/kitbash work before, so any critique or tips in that direction are most welcome too.

Should be set to spawn as a rare hi-tech (twice as rare as Trident). I haven't tested it in the campaign at all, so buyer beware.

Images
[close]

[attachment deleted by admin]

5
General Discussion / Changing flagships in combat
« on: September 19, 2019, 07:39:19 AM »
When I hop into an officer-driven ship during combat, does the ship retain the officer's combat skills or use my own?

6
Suggestions / Promote Officers from Rank & File
« on: September 17, 2019, 12:51:49 PM »
While flying around looking for another aggressive officer, I started wondering why there was no one with the chops among my 20,000 crew. Isn't that the logical place to look for officer material?

My suggestion: Every so often (X number of game ticks/battles/events), some individuals from the crew are added to a list for potential promotion to level 1 Lieutenant, the number of which scales based on crew number. Personality would be randomized, so that a decently sized endgame fleet (10k crew or so?) should be able to procure 10 officers of the correct personalities over the course of months/years, without having to station hunt.

7
Suggestions / More things to do with small ships/fleets
« on: August 23, 2019, 08:52:29 AM »
My favourite part of the game is the beginning. You're small and scrappy, your fleet of two frigates feels cozy and intimate. Battles never felt like so much was at stake, and like the player had so much influence, as those first few sparring matches with hounds and mudskippers. Wins were never so satisfying as beating four ships with two, or trading blows against shields until 0% combat readiness causes one to glitch out and succumb. Sure, there is spectacle in the big capital clashes, but the excitement is lessened knowing the outcome beforehand.

What I would love to see is more reasons to own and play with a small fleet of frigates, or more access to that kind of gameplay in later parts of the game. I'm talking something along the lines of:

- Contests, like tournaments sanctioned by the major powers, or maybe pirate captains who lay down bets to challenge you to 2-on-2 frigate "street" duels. A structured environment in which to play with frigate builds for real stakes.
- Missions, like the ones already in the game's main menu, but in the campaign that can be tied to progress. Maybe you get hired freelance to command someone else's fleet for a decisive battle or ambush. Succeed, receive pay, perhaps scaling with your grade. Reputation reward too.
- Some kind of exploration object or hazard that requires, or greatly prefers, small ships to interact with. Imagine some small [redacted] outpost, just 1 or 2 ships like you usually see, but they have a magnetic field that only lets in 10 DP worth of ships to battle them. (And they're guarding hella treasure.) So you are rewarded for carrying small ships, even with your endgame fleet, to participate in events like that.

Any one of those would bring the excitement of starting a new game, while letting the player keep, and further invest in his save file.

8
Suggestions / List of QOL / "would be nice" changes
« on: August 21, 2019, 02:45:09 PM »
Stop me if you've heard these ones.

- Free pan camera during battle. I would pay for this. I would put an extra ship in my fleet like a tug just to do this, or spend skill points on it.
- Ability to see opposing fleet while choosing ships for deployment.
- Ability to pin/highlight/label points of interest on the map.
- A way to quickly move dozens of weapons between cargo and storage/market.
- A way to mark for sale weapons in excess of X owned. For example, after owning 200 vulcans, all additional vulcans are sold/scrapped automatically, or designated to be sold at the next market.
- A way to consolidate weapons easily into one location, or at least complete inventory listings of remote colonies.
- A way to auto-sort your fleet. The order the buy listings use is just fine.
- Recovered ships returning to the same spot in the fleet instead of the bottom, reassigning officers automatically.
- When your flagship dies, move your character to an unoccupied ship instead of ejecting an officer.
- Ability to repair at a dock from the refit screen.
- Ability to reorder ships from the refit screen.
- Access to the codex from the refit screen.
- Access to the ship purchase screen from both the refit and market screens. In general this screen is important and should be easier to find, I want to be browsing every colony's ships but often forget because the listings are tucked away in an inconvenient place. Just a button in the market that says "BUY SHIPS" and saves me 2 clicks would be so nice.
- A way to "test drive" and "test outfit" ships before purchase.
- Ability to click and drag to rearrange the order of fighter wings in bays. I keep thinking I can do this for some reason.
- When fitting weapons, ability to sort weapons by type rather than listing inventory -> market -> black market. If I'm fitting a large mount, I want to see all the large weapons listed first, then everything else.
- On missions screen, ability to remove/hide exploration points of interest from your feed, and to generally "de-clutter" the feed.
- Ability to tag missions so that a clickable pop-up describing it is visible on the overworld screen, like the popups from your news feed, but it doesn't vanish.
- Ability to see crew level and skeleton crew required on overworld screen. The resource bars on the fleet screen are easy to read, I would love to see that whole block of info displayed on the overworld UI. But I guess that would be an overhaul.
- In combat, when selecting targets with R, the first check should be for ships, and fighters only targeted when there is no ship underneath it. Currently, a ship swarming with fighters is very hard to target.

9
General Discussion / Some Stuffalo About Buffalo
« on: August 21, 2019, 06:18:05 AM »
Buffalo buffalo Buffalo buffalo buffalo buffalo Buffalo buffalo.
- common English phrase

Of all the ships in the sector, my favourite has to be the unassuming Buffalo Mk.II. Nothing quite captures the romance of being a scrappy space scavenger like sending a herd of flying dumpsters into battle, bristling with piecemeal weaponry, secure in their consummate disposability. I'm not joking when I say I've gotten more use out of the Buffalo, by number of combat deployments, than any other ship.

Why, though? What does the Buffalo have to offer? It punches well below its weight in nearly every metric, but in two, it shines. First, ubiquity: if you can't find one, you're not looking. And second, its ratio of OP to deployment cost (OPDC) is through the roof.


Data taken from ship_data.csv and recreated here.

For a 4-point pittance, you get to field (at least) 70 OP worth of payload, on a body teeming with weapon mounts and just big enough for a converted hangar. Among combat ships, nothing really comes close. The Valkyrie transport has an OPDC that's nominally better (18.33 to Buffalo's 17.5) but lacks meaningful weapon mounts and, more importantly, is a rare find. Other high-OPDC ships are generally frigates whose utility drops off heavily after the early game. Not so with the Buffalo - its cost is so convenient, I carry a couple with my endgame fleet to fill the gaps between capital ships. More on that later.

Part of the Buffalo's utility is its interaction with the D-mod system. It cares less about D-mods than perhaps any other ship, and with Safety Procedures and Field Repairs maxed out (something I was going to do anyway), the D-mods cross over into upside territory. A 7-D-mod Buffalo hull with both skills maxed costs just 1 supply a month and 1 supply to recover from battle (or 8 supplies if it dies), even with Increased Maintenance. In a similar vein, scavenged Buffalo can usually be jury-rigged and deployed in the field with whatever spare weapons and fighter LPCs you have kicking around your inventory. (It's a good platform for those single-shot Atropos and Sabot.) I've found that other derelicts often have enough gaps in their weapons coverage that, when combined with crippling D-mods, it just isn't worth the supply to deploy them in battle before at least a tune-up in port.

The question remains, what DOES the Buffalo do? The short answer is it fields a fighter and a pilum. For a more in-depth look, this is what I default to:
1x Broadsword/Spark (Thunder in the early game)
1x Pilum
1x Salamander
1-2x any guided missile
1x LR PD, Tactical laser or similar
2x LMG/vulcan
Converted hangar, reinforced bulkheads, makeshift shield generator, hardened subsystems/blast doors

There are other builds (like more missile-focused ones) but bang-for-buck this one can't be beat. The shield generator is the only part I'd consider unorthodox, but having even a garbage-tier shield on an otherwise defenseless ship increases its survivability immensely. (I think the AI controls it more carefully.) Blast doors get a nod over hardened subsystems in the early game, when battles end faster and crews are smaller. You could run both mods (or more expensive fighters) and cut weapons, too. The PD gets less useful as your fleet gets bigger.

On that subject, the Buffalo doesn't drop off in usefulness as the game progresses the way most frigates and other small destroyers do. If anything, it becomes less vulnerable, as it can hide in the shadow of your cruisers/capitals and use a follow order to stay reined in. Its value as a carrier does dip a little, but being able to sneak in an extra fighter squad or two with deployment points that would otherwise go to waste is still worth a couple slots in my fleet. (The pilums also get more valuable lategame.) Conversely, in the early-mid game (pre-cruiser) the Buffalo is at its most vulnerable, but also its most valuable as a fighter platform. This is time when I really spam them and will carry around 7 or more at a time.

The two biggest problems with the Buffalo are as follows. First, the AI tends to pilot the thing as though it were a real destroyer, even when kitted for backline carrier duty. This can be mitigated by giving your Buffalo escort orders on your bigger ships as mentioned above - or, early game, giving your Buffalo an escort of its own. The other problem is crew, which is the resource used least efficiently by the Buffalo (it can't even carry its own full crew complement by itself). If you're not prepared to eat some crew losses you may end up understaffed after a few Buffalo deaths. However, if you're running any number of other dedicated carriers, you should be prepared for that already, and have the extra crew capacity to be able to do it.

In conclusion, the Buffalo Mk.II exemplifies Starsector as a whole. It rewards improvisation during long, skin-of-your-teeth expeditions, then stands up to rigorous optimization and stat crunching back at base. It's the perfect meeting of rugged space-junkyard aesthetic and ruthless min-max economy. It is a dutiful if unglamorous role-player, a staple grain of the post-Domain diet, like the salvage spacer himself.

"Buffalo buffalo buffalolololololololo."
- Will Smith, cowboy

10
Modding / Free Camera Mod
« on: August 20, 2019, 09:17:26 PM »
Hi, I'm looking for a mod (or an editable setting) that will let me pan the camera freely during battle, without being locked to a ship or waypoint, and to zoom in on enemy vessels without the camera being tugged away. Can anyone point me in the right direction?

Pages: [1]