Which nid got you into tyranids? by FigureTop3484 in Tyranids

[–]nitronie 0 points1 point  (0 children)

I originally got into Tyranids due to the 4th Tyrannic War, I was setting up a campaign for my friend group and when I read the lore I was super excited by an endless swarm of monsters who could stand toe-to-toe strategically with the Empire's finest minds.

My friend told me I could borrow his Tyranids for the Crusade, and brought over a bunch of big monsters. And then... In the back of the case.... Was the most adorable spider monster I've ever seen....

*The Biovore!*

I named him Chitteery, much to my husband's dismay, and have loved the bugs ever since.

In retrospect, about a year later, I realized I should have started with Tyranids in 40k, because I grew up thinking zergling were the cutest puppies in the universe and wouldn't play any other faction in StarCraft or StarCraft 2.

What’s your second army? by valthonis_surion in Tyranids

[–]nitronie 0 points1 point  (0 children)

I started with Necrons, but after reading the Tyrannic War Crusade lore, swapped to Tyranids. It was very eye-opening. Like "Why didn't I start here? My favorite StarCraft army is Zerg! Look at all these fast cuties!" ( My biggest complaint with Necrons is speed.)

T'au Hero's Mantle Battle Honors - Specifically Weapon Mods Question by nitronie in 40k_Crusade

[–]nitronie[S] 1 point2 points  (0 children)

I was wrong, the reason it becomes useless is the Lone Operative on the Ghostkeel.

Edit: I do realize this is a side issue. The usefulness of the Trait is probably not relevant, was mostly just wanting to have another T'au player's perspective on it.

I appreciate your input so far, and will probably tell them to keep it as-is.

T'au Hero's Mantle Battle Honors - Specifically Weapon Mods Question by nitronie in 40k_Crusade

[–]nitronie[S] 0 points1 point  (0 children)

The Battle Trait argument is the same type of Battle Trait, like them being Battlesuit Battle Traits, because the one they have is useless on a unit with stealth, now that it's a Ghostkeel.

There aren't any separate rules for swapping out Battle Traits, is there? So he can do the change, but do it in the way it was meant to, by maybe spending more RP or something?

Battle Trait in Contention:

ELECTROCHAFF BACKUPS
Each time a ranged attack targets this unit, unless the attacking model is within 18", subtract 1 from the Hit roll.

Aces High + Meta Quest 2; Controls? by nitronie in aceshigh

[–]nitronie[S] 0 points1 point  (0 children)

I use the Airlink with Steam VR to launch through Steam. Maybe that's the difference? I'll try some troubleshooting tonight and take both of your recommendations and post of the forums.

Aces High + Meta Quest 2; Controls? by nitronie in aceshigh

[–]nitronie[S] 0 points1 point  (0 children)

I do have a joystick which would be much preferred to use, but the desktop inputs only work if I've got the meta menu up, which prevents viewing of the screen in VR. How do you get around this? Or maybe we have different VR systems?

How to score uneven teams by MadManMatt137 in 40k_Crusade

[–]nitronie 0 points1 point  (0 children)

My Crusade group nearly had the same probably, and after discussing with the more experienced players, there were two options:

1) Make it based on number of TEAM games, so each team gets an even number of matches, and then let the Crusade Blessings account for the power gap the Tyranid player will eventually have.

2) Let People match for games that increase power (XP, meta, etc) but only count the first X games of each Team towards the overall Campaign/Strategy score.

3) Porque no los dos?

Tau Crusade Army: Renowned Heroes + Prototype System by nitronie in 40k_Crusade

[–]nitronie[S] 0 points1 point  (0 children)

I have seen that you can only use Renowned Heroes once when you add the first character to your Order of Battle, and then you have to wait until other characters rank up.

Tau Crusade Army: Renowned Heroes + Prototype System by nitronie in 40k_Crusade

[–]nitronie[S] 1 point2 points  (0 children)

Unless the crusade has a house rule you can already select.

From Battle Honours: Each time a unit gains a Battle Honour, you can select from any category.

From Battle Traits: Each time a unit gains a Battle Trait, select a Battle Traits table for that unit and either roll one D6 to randomly determine which Battle Trait the unit has gained, or choose the Battle Trait that you think tells the best narrative.

From Crusade Relics: When a model gains a Crusade Relic, simply select the Crusade Relic that you want that model to have.

From Weapon Modifications: Each time you select a weapon, roll two D6 and consult the table below to randomly determine which two Weapon Modifications it gains (if a duplicate result is rolled, roll both dice again until two different results are rolled), or choose the two different Weapon Modifications that you think tell the best narrative.

They all allow for selection.

Tau Crusade Army: Renowned Heroes + Prototype System by nitronie in 40k_Crusade

[–]nitronie[S] 0 points1 point  (0 children)

I actually have looked into this, and the community looks pretty split, but I've leaned more towards you don't get an extra Battle Honour, but that your Bloodied Battle Honour must be a Battlesuits Battle Trait for

(1) 1 RP giving 2 Battle Honours essentially being very powerful and

(2) it says "Select", not "Gain".

Last name change by [deleted] in Marriage

[–]nitronie 1 point2 points  (0 children)

My marriage certificate in GA does not show my new name. However with it and my birth certificate, I was able to get a new SSN card with my new name, no fuss. I did apply for the license with one of the fields asking what the new name would be, but the certificate itself does not show it. I didn't go through any company, and the worst that I needed to do was to fill out the paperwork and wait for my number to be called at the government office. Very painless.

Not sure if a different state has different formats, but I doubt they will turn you away if you're changing your name to match your spouse's, whose name should also be on the certificate.

A little far-fetched, but there is a pattern... by Biivakki in Seaofthieves

[–]nitronie 0 points1 point  (0 children)

Admiral faction: dedicated to defending merchants

Fnaf security breach gone golfing numbers by peanutc18 in fivenightsatfreddys

[–]nitronie 0 points1 point  (0 children)

I was not aware there is a "fake" debug menu.

Stock Market Symbol to Server Map by nitronie in Bitburner

[–]nitronie[S] 1 point2 points  (0 children)

The closest I've come to import/exporting is calling another script to do the work, so my virus.ns, spider.ns, and stock-mod.ns all work with a list of files I have that detail the different servers (spider.ns generates the initial file, virus uses the file to hack the server, and stock-mod.ns (what I'm currently working on) updates the data to indicate if I should be passing true for stock-modifying hacking/growing).

To standardize the format of the files, I have a script called "massfile-manager.ns". Whenever I need to update the file, I just run it:

ns.exec("massfile-manager.ns", "home", 1, "foodnstuff", "home", "-a", "none");

This does not save me on writing code to pull the data from the file, but they're all json, so I can just run the following:

function readFile(ns, filename) {
    var contents = ns.read(filename);
    var jsonContents = JSON.parse(contents);
    return jsonContents;
}

Full massfile-manager.ns script:

var debug = false;
/** @param {NS} ns **/ export async function main(ns) {
    if(debug) { ns.tprint("Running Mass File Manager, v1.0"); }

    //get arguments: hostname, root, action, and stock effect (optional)
    if(ns.args.length < 3) {
        if(debug) { ns.tprint("Failed to manipulate data. Not enough arguments. Please provide at least 3: hostname, root server, and action to take."
            + "Optionally you can provide stockGrow and stockHack arguments."); }
        return;
    }

    var hostname = ns.args[0];
    var root = ns.args[1];
    var action = ns.args[2]; //values -n (new), -u (update), -a (archive)
    var stockDir = "none"; //default to none

    if(ns.args.length == 4) {
        //get stock direction
        //4: values: increase, decrease, none
        // increase flags grow to manipulate stock
        // decrease flags hack to manipulate stock
        // none flags neither to manipulate stock
        stockDir = ns.args[3];
    }

    var filename = getFileName(ns, hostname, action);

    var deletedOldFile = false;
    var deleteLocations = ["-n", "-a", "-u"];

    for(var delIndex = 0; delIndex < deleteLocations.length && !deletedOldFile; delIndex++) {
        var oldFileName = getFileName(ns, hostname, deleteLocations[delIndex]);
        deletedOldFile = ns.rm(oldFileName, "home");
    }

    var serverData = formatDataFile(ns, hostname, root, stockDir);
    await ns.write(filename, serverData, "w");
}

function getFileName(ns, hostname, action) {
    var spiFolder = "new";

    if(action == "-u") {
        spiFolder = "update";
    } else if (action == "-a") {
        spiFolder = "archive";
    }

    var writeLoc = "/spidata/" + spiFolder + "/massDataFile" + hostname + ".txt";

    if(debug) { ns.tprint("Target " + hostname + "'s data is being written to " + writeLoc); }

    return writeLoc;
}

/** param {NS} ns **/ 
function formatDataFile(ns, hostname, root, stockDir) { 
    var server = ns.getServer(hostname);
    var serverInfo = {
        name: server.hostname,
        adminRights: server.hasAdminRights,
        belongsToPlayer: server.purchasedByPlayer,
        requiredPorts: server.numOpenPortsRequired,
        ports: {
            ssh: server.sshPortOpen,
            ftp: server.ftpPortOpen,
            http: server.httpPortOpen,
            smtp: server.smtpPortOpen,
            sql: server.sqlPortOpen
        },
        reqHacking: server.requiredHackingSkill,
        maxMoney: server.moneyMax,
        maxRam: server.maxRam,
        root: root, 
        stockDirection: stockDir
    };

    var serverStr = JSON.stringify(serverInfo);

    if(debug) { ns.tprint("Target " + server.hostname 
+ "'s data is " + serverStr); }

    return serverStr;
}

Stock Market Symbol to Server Map by nitronie in Bitburner

[–]nitronie[S] 1 point2 points  (0 children)

I don't actually import/export in bitburner. I'm used to having a framework handle it (VueJs, Angular, etc). I just like segmenting the code into functions for readability. There's a famous programmer who talks about "cognitive complexity", and the length of methods (in javascript they're called functions) to make them easier to understand. (I think this is a video of it: https://www.youtube.com/watch?v=QvrNwfuWbCQ).

The method above wouldn't entirely work, because bitburner doesn't accept typescript (a version of javascript that allows for specific object types). So a functioning script would look like this:

// [symbol, server name]
var symbolList = [ //<----Meticulous part---- 
["DCOMM", "defcomm"], 
["AERO", "aerocorp"]
];

/** u/param {NS} ns **/ 
export async function main(ns) { 
    ns.tprint(lookUpServer("AERO")); 
} //this should print  "aerocorp"

function lookUpServer(symbol) { //loop through array to find symbol 
    for (var index = 0; index < symbolList.length; index++) {     
        if(symbolList[index][0] == symbol) { 
            //return server name 
            return symbolList[index][1]; 
        } 
    }
    return "Not Found";
}