Yes, it's actually fairly simple, you just need to write a .faction file, and include the faction in an otherwise-blank factions.csv file, like this:
Faction files are pretty complicated-looking, but most of it's pretty easy to follow:
Spoiler
{
The internal id of the Faction. Used all over the place; it's pretty handy to use this id in the names of ids of weapons, ships, variants, etc., etc., too, to avoid name collisions in the game.
id:"my_nifty_faction",
Colors and circle type used on the Faction's display in the Campaign View
"color":[135,206,255,255],
"secondaryUIColor":[135,255,0,255],
"secondarySegments":6,
Names used throughout the game dialogs.
"displayName":"My Nifty Faction",
"displayNameWithArticle":"the Nifty Faction",
"displayNameLong":"My Nifty Faction",
"displayNameLongWithArticle":"The Nifty Faction",
Relative paths to graphical logos for the Faction.
"logo":"graphics/factions/explorer_society.png",
"crest":"graphics/factions/crest_explorer_society.png",
Naming conventions for randomly-generated ships.
"shipNamePrefix":"EXP",
"shipNameSources":{
"SPACE":2,
},
This actually doesn't matter; the real description string is in strings.csv.
"description":"The My Nifty Faction is a remnant of Domain explorer crews who were trapped a long way from the Gates after the Collapse.",
Personal names for Captains, randomly generated from these lists.
"names":{
"modern":1,
"world":1,
"future":1,
"myth":1,
},
What Hull Mods the Faction may have for sale.
"hullMods":[
"shields_shieldremoved",
"shields_formshield",
"advancedoptics",
"turretgyros",
"augmentedengines",
"auxiliarythrusters",
"fluxcoil",
"fluxdistributor",
"hardened_subsystems",
"insulatedengine",
"pointdefenseai",
"targetingunit",
"fluxbreakers",
"expanded_deck_crew",
"recovery_shuttles",
"operations_center",
"nav_relay",
"ecm",
],
Any goods that are illegal to sell in the open market of this Faction. Must use the good's id, not it's name. I think this is optional.
"illegalCommodities":[
],
Optional! Music to be played during encounter / battles with the Faction.
"music":{
"theme":"music_nifty_faction_encounter_neutral",
"market_neutral":"music_nifty_faction_market_neutral",
"market_hostile":"music_nifty_faction_market_hostile",
"market_friendly":"music_nifty_faction_market_friendly",
"encounter_neutral":"music_nifty_faction_encounter_neutral",
"encounter_hostile":"music_nifty_faction_encounter_hostile",
"encounter_friendly":"music_nifty_faction_encounter_friendly",
},
I'm not entirely sure what this does yet.
"internalComms":"tritachyon_internal",
Faction portraits, picked at random, just like names.
"portraits":{
"standard_male":[
"graphics/portraits/portrait_corporate01.png",
"graphics/portraits/portrait_corporate03.png",
"graphics/portraits/portrait_corporate05.png",
"graphics/portraits/portrait_corporate06.png",
"graphics/portraits/portrait13.png",
"graphics/portraits/portrait25.png",
"graphics/portraits/portrait30.png",
"graphics/portraits/portrait35.png",
],
"standard_female":[
"graphics/portraits/portrait_corporate02.png",
"graphics/portraits/portrait_corporate04.png",
"graphics/portraits/portrait_mercenary02.png",
"graphics/portraits/portrait16.png",
"graphics/portraits/portrait_corporate04.png",
"graphics/portraits/portrait_corporate07.png",
"graphics/portraits/portrait34.png",
],
},
Optional! Special titles for members of the Faction with specific roles.
"ranks":{
"ranks":{
"spaceCommander":{"name":"Explorer Count"},
},
"posts":{
"patrolCommander":{"name":"Explorer Baron"},
"fleetCommander":{"name":"Explorer Knight"},
"baseCommander":{"name":"Explorer"},
},
},
Optional! Some very specific rules about the Faction's ability to interact with the player and other Factions.
"custom":{
"offersCommissions":true,
"engagesInHostilities":true,
"buysAICores":true,
"AICoreValueMult":3,
"AICoreRepMult":3,
"buysSurveyData":true,
},
This is very important; essentially, it's a list of the different fleets that can be generated by the game, built up by referencing the Variants listed here for various Roles.
"shipRoles":{
"fastAttack":{
"nifty_faction_cutlass_default":10,
"fallback":{"combatSmall":1},
},
"escortSmall":{
"nifty_faction_cutlass_default":10,
"fallback":{"combatSmall":1},
},
"escortMedium":{
"nifty_faction_cutlass_default":10,
"nifty_faction_explorer_default":10,
"nifty_faction_crab_default":10,
"nifty_faction_aegean_default":7,
"fallback":{"combatMedium":1},
},
"combatSmall":{
"nifty_faction_cutlass_default":10,
"fallback":{"escortSmall":1},
},
"combatMedium":{
"nifty_faction_cutlass_default":10,
"nifty_faction_explorer_default":10,
"nifty_faction_crab_default":10,
"nifty_faction_aegean_default":7,
"fallback":{"combatSmall":2},
},
"combatLarge":{
"nifty_faction_vespucci_default":10,
"nifty_faction_kraken_default":5,
"fallback":{"combatMedium":2},
},
"combatCapital":{
"nifty_faction_vespucci_default":5,
"nifty_faction_kraken_default":10,
"fallback":{"combatLarge":2},
},
# hybrid ships with good combat and cargo capacity
"combatFreighterSmall":{
"nifty_faction_hudson_default":10,
"fallback":{"freighterSmall":1},
},
"combatFreighterMedium":{
"nifty_faction_hudson_default":10,
"nifty_faction_explorer_default":10,
"fallback":{"combatFreighterSmall":2},
},
"combatFreighterLarge":{
"nifty_faction_hudson_default":10,
"nifty_faction_explorer_default":10,
"fallback":{"combatFreighterMedium":2},
},
"civilianRandom":{
"nifty_faction_hudson_default":10,
"fallback":{"freighterSmall":1},
},
# carriers
"carrierSmall":{
"nifty_faction_hudson_default":10,
"nifty_faction_vespucci_default":5,
"fallback":{"carrierMedium":0.5},
},
"carrierMedium":{
"nifty_faction_vespucci_default":10,
"fallback":{"carrierSmall":2},
},
"carrierLarge":{
"nifty_faction_vespucci_default":10,
"fallback":{"carrierMedium":2},
},
# freighters and such
"freighterSmall":{
"nifty_faction_hudson_default":10,
"fallback":{"freighterMedium":0.5},
},
"freighterMedium":{
"nifty_faction_hudson_default":10,
"fallback":{"freighterSmall":2},
},
"freighterLarge":{
"nifty_faction_hudson_default":10,
"fallback":{"freighterMedium":2},
},
"tankerSmall":{
"nifty_faction_hudson_default":10,
"fallback":{"tankerMedium":0.5},
},
"tankerMedium":{
"nifty_faction_hudson_default":10,
"fallback":{"tankerSmall":2},
},
"tankerLarge":{
"nifty_faction_hudson_default":10,
"fallback":{"tankerMedium":2},
},
"personnelSmall":{
"nifty_faction_hudson_default":10,
"fallback":{"personnelMedium":0.5},
},
"personnelMedium":{
"nifty_faction_hudson_default":10,
"fallback":{"personnelSmall":2},
},
"personnelLarge":{
"nifty_faction_hudson_default":10,
"fallback":{"personnelMedium":2},
},
# utility ships
"tug":{
"nifty_faction_hudson_default":10,
"fallback":{"utility":1},
},
"crig":{
"nifty_faction_hudson_default":10,
"fallback":{"utility":1},
},
"utility":{
"nifty_faction_hudson_default":10,
},
},
Optional! This can tilt Captain "personality" types towards various kinds. Defaults to Steady.
"traits":{
"captain":{
"timid":1,
"cautious":14,
"steady":7,
"aggressive":3,
"reckless":1,
},
},
I'm not sure if this is optional or not, but essentially it goes with shipRoles, above, to determine the composition of randomly-generated fleets.
"doctrine":{
# ship distribution
"small":8,
"fast":10,
"medium":10,
"large":5,
"capital":1,
# as fraction of combat ships of same size
"escortSmallFraction":1,
"escortMediumFraction":1,
# freighters are balanced
"combatFreighterProbability":0.5,
# tend toward smaller
"minPointsForCombatCapital":25,
"minPointsForLargeCarrier":20,
# increased preference for carriers
"smallCarrierProbability":0.4,
"mediumCarrierProbability":0.4,
"largeCarrierProbability":0.4,
# officers ; My Nifty Faction is somewhat elite
"officersPerPoint":0.45,
"officerLevelPerPoint":0.4,
"officerLevelBase":7,
"officerLevelVariance":0.35,
"commanderSkillsPerLevel":0.2,
"commanderSkillChance":0.5,
"commanderSkillLevelPerLevel":0.3,
"commanderSkills":{
"officer_management":2,
"coordinated_maneuvers":7,
"fighter_doctrine":10,
"electronic_warfare":10,
},
},
},
Once you have these two things done, you're done with the core part of building a Faction. The rest of it's building actual content (ships and variants and weapons, populating strings, etc.). To see the Faction spawn in the game, I'd really recommend using
, which is some code I wrote to make that part extremely simple, and then considering whether to make your Faction compatible with DynaSector (although, IIRC, DynaSector requires that the maintainer approves your mod for inclusion for whatever silly reasons).