Alien Strains

Lord Shadow

General
Joined
Oct 14, 2005
Messages
2,005
Location
Buenos Aires


Status: Released
Version 3 (Beta) Hotfix B


Steam Workshop | Direct Link (old v1)


Alien Strains is a modification for Sid Meier's Civilization: Beyond Earth which enhances the alien natives by adding up to three alternative strains to each base species, essentially more than tripling the variety of the new world's fauna. The variants are meant to be roughly equivalent (for the most part) in power to their parent, but each sports unique advantages and disadvantages which encourage the player to think tactically when it comes to engaging them in the most sensible circumstances. For instance, the Raptor Myrmidon is a ferocious defender but falters on the offensive, whereas the Locust Drone is faster, can pillage improvements and regain health from it but is weaker when it comes to withstanding combat.

Here's the stats for all the strains, enclosed in spoiler tags in case you'd want to encounter and figure out these new aliens like the first human explorers would! The Civilopedia articles hint at the differences between the variants in-game, in any case. But nevertheless, even though the strains are intended to be more or less in balance with the base species, the mod will probably make the game somewhat harder as the alternatives require some thought to face properly.

Spoiler :
WOLF BEETLE (Move 2, Strength 8)
  • Wolf Mantis
    +20% Strength (10)
    -33% vs. Ranged
  • Wolf Chameleon
    +80% Attack and Defense while in Miasma (11)
    -20% Strength (6)
  • Wolf Spider (new!)
    +12% per adjacent alien
    -12% without adjacent aliens (7)
RAPTOR BUG (Move 3, Strength 14)
  • Raptor Alpha
    +40% Strength without adjacent aliens
    -15% Strength (12)
  • Raptor Myrmidon
    +25% when Defending
    -25% when Attacking
  • Raptor Charger (new!)
    +50% when Attacking
    +Heavy charge
    -30% Strength (10)
DRONE (Move 3, Hover, Strength 10)
  • Hunter Drone
    +1 Vision
    +Ignores zones of control
    +50% when Attacking
    -20% Strength (8)
  • Locust Drone
    +1 Move (4)
    +Pillages Improvements
    +Heals when pillaging
    -20% Strength (8)
  • Carrion Drone (new!)
    +25% vs. Wounded
    -25% vs. Ranged
MANTICORE (Move 1, Strength 4, Ranged Strength 10)
  • Basilisk
    +33% Ranged Strength (13)
    +30% chance to scatter on ranged attack
    -50% Strength (2)
  • Chimera
    +1 Move (2)
    +No terrain cost
    =Explodes on death (20 HP damage)
    -20% Ranged Strength (8)
  • Salamander (new!)
    +1 Range (3)
    -25% Strength (3)
SIEGE WORM (Move 1, Strength 48)
  • Ravager Worm
    +1 Move (2)
    +No terrain cost
    -20% Strength (38)
  • Maker Worm
    +25% Strength (60)
    +Heals 15 HP to adjacent aliens
    -30% vs. Air
SEA DRAGON (Move 4, Strength 14)
  • Sea Serpent
    +2 Move (6)
    -Deep water only
  • Sea Lurker
    +2 Extra attacks
    -25% when Defending
  • Sea Horror (new!)
    +25% vs. Sea
    -25% vs. Land
    -25% vs. Air
KRAKEN (Move 2, Strength 52)
  • Thanatos
    +Heals 25 HP with kills
    -25% vs. Ranged
  • Leviathan
    +33% Strength (70)
    +Heals 15 HP to adjacent aliens
    -30% vs. Air
    -1 Vision

Kudos to Nutty for providing critical coding support and Vicevirtuoso for his Modular Script Loading utility!

Compatible languages: English, Spanish

Coming soon:
  • Third alternative strains for the colossal aliens.
  • Something nasty.
NOTE: As of Version 2, due to having phased out promotions entirely, there should be no more UI glitches. Have fun!
.
 

Attachments

  • alien_strains_shot1.jpg
    alien_strains_shot1.jpg
    364.1 KB · Views: 1,851
  • alien_strains_shot3.jpg
    alien_strains_shot3.jpg
    309.9 KB · Views: 1,370
  • 2014-11-17_00008.jpg
    2014-11-17_00008.jpg
    439.3 KB · Views: 939
  • 2014-11-17_00010.jpg
    2014-11-17_00010.jpg
    414.4 KB · Views: 892
Last edited:
The new promotions glitch is one which requires Firaxis patching, so unfortunately there is no way around it (for now).

Regardless, this mod is fantastic and something which I was hoping to do myself at some point, but you've done a much better job! The only issue I can see with it is the significance of colour changes. It's more intuitive if the new strains which are a similar colour (eg. the blue ones) share common bonuses.

Would you consider implementing Nutty's Tyranid models?

EDIT: While I'm at it, since you've probably tested: Do perks have the same UI issues as promotions?
 
The new promotions glitch is one which requires Firaxis patching, so unfortunately there is no way around it (for now).

Regardless, this mod is fantastic and something which I was hoping to do myself at some point, but you've done a much better job! The only issue I can see with it is the significance of colour changes. It's more intuitive if the new strains which are a similar colour (eg. the blue ones) share common bonuses.

Would you consider implementing Nutty's Tyranid models?
Thank you kindly!

As for the colours, I've tried to make the species fairly unique, without repeating quirks if at all possible. Colour-coding them would imply making them similar to each other more often than not. But in general, at least, the redder strains tend to be more aggressive and/or offense oriented. The bluer ones, for the most part, are more defensive.

Regarding the Tyranids, I don't know. They're a bit too iconic if you have some familiarity with Warhammer 40K.

And the problem with perks is that, while they present a nice number of new functions, they lack some promotion ones (i.e. Rough/OpenAttack/Defense), and at the very least would require me to rethink a few strains. If only they'd merge the functions of perks and promotions so that both systems can use the same features... I've poked Will and Dave about it on Twitter: with any luck they'll read my message and feel compelled to work on it.
 
Sheesh can't get it out of my head... sure the Siege Worm and the Kraken are great units, one each for being land and sea, but what the game is lacking is a equally intimidating air unit which would be hard to taken down like it's land and sea counterparts. What gets my mind arolling is a incectoid looking Dragon unit.

besides that little quip I like what this mod will offer once it's complete and released.
 
Sheesh can't get it out of my head... sure the Siege Worm and the Kraken are great units, one each for being land and sea, but what the game is lacking is a equally intimidating air unit which would be hard to taken down like it's land and sea counterparts. What gets my mind arolling is a incectoid looking Dragon unit.

besides that little quip I like what this mod will offer once it's complete and released.
A huge, hovering (like a Drone) beast would be interesting, maybe. Adding entirely new alien species is not within this mod's scope at the moment, but in the future, and provided a suitable 3D model is found, perhaps something could be worked out. God knows I've had ideas to repurpose the Rocktopus to serve the aliens in various capacities.
 
I had a very similar concept in mind for Alien diversification. However, my thought process was to start at the root and have three (or more, but three was the initial goal) different possible alien genotypes. Effectively creating three different sets of species; the bug-like race that's currently in the game, an energy based set of aliens, and a plant-animal hybrid set of aliens.

The energy based aliens would nest on Firaxite, have no corporeal bodies, get promotions increasing their movement speed and defending them from ranged attacks, and replace the Kracken and Worm with an amphibious Leviathan unit capable of spawning underlings. The plantimal set would gather around FloatStone and get massive healing bonuses from miasma and some powerful ranged support units thrown into the mix.

Some options on the game setup screen allowing you to go random single race, any chosen single race or possibly even a mix of all three (preferably spawned in a way to avoid too much mixing) were considered. Additionally, I hadn't fully fleshed out ideas on every unit type nor how they could synergize with one another. Biomass spawning might need some work without nests concentrating on and spawning it. Plus, this would obviously require quite a bit of new unit artwork.

Just thought I'd throw some ideas out there since this mod is at least heading in a similar direction. Either way, it's nice to see someone is working to break the predictability of the current implementation of alien species. Keep up the good work. :salute:
 
And the problem with perks is that, while they present a nice number of new functions, they lack some promotion ones (i.e. Rough/OpenAttack/Defense), and at the very least would require me to rethink a few strains. If only they'd merge the functions of perks and promotions so that both systems can use the same features... I've poked Will and Dave about it on Twitter: with any luck they'll read my message and feel compelled to work on it.
But they don't affect the UI the same way promotions do? Weird.
 
But they don't affect the UI the same way promotions do? Weird.
I haven't tinkered with perks much, so I don't know if there would be any unwelcome side effects. But the fact is they lack some promotion functions I'm using for the strains. I could test if promotion functions work when added to a perk when the table doesn't explicitly contemplate them: it's a bit of a long shot, but who knows. Even if it worked, though, I'd also have to figure out how to have the game give free perks to specific units from the beginning.

Either way, it's nice to see someone is working to break the predictability of the current implementation of alien species. Keep up the good work. :salute:
Thanks for the support! :)
 
Love the idea. You've got my support. Might even be able to model some things if you figured out how to add them.
 
Love the idea. You've got my support. Might even be able to model some things if you figured out how to add them.
Thanks! I'll keep you in mind for the future. ;)
 
Small suggestion, make an alteration to the Worm quest to include the other two worm types ;)

Edit: further play seems to indicate that because of the addition of two worms the Kill Worm quest seems to be broken now. Haven't had it pop up when the normal siege worm showed up.
 
Small suggestion, make an alteration to the Worm quest to include the other two worm types ;)

Edit: further play seems to indicate that because of the addition of two worms the Kill Worm quest seems to be broken now. Haven't had it pop up when the normal siege worm showed up.
Admittedly I didn't test it, but I thought I had adapted the Kill Siege Worm quest to include the alternative strains.

Code:
-------------------------------------------------------
-- Quest: Kill Siege Worm - Alien Strains version
-------------------------------------------------------
local QuestScript = hmake CvQuestScript{};

----------------------------------------------------
-- Constants
---------------------------------------------------- 
[b]local WORM_UNIT_TYPE =
{
	{ GameInfo.Units["UNIT_ALIEN_SIEGE_WORM_BASE"].ID },
	{ GameInfo.Units["UNIT_ALIEN_SIEGE_WORM_RAVAGER"].ID },
	{ GameInfo.Units["UNIT_ALIEN_SIEGE_WORM_MAKER"].ID },
};[/b]
local ENERGY_REWARD = 40;
local SCIENCE_REWARD = 80;

----------------------------------------------------
-- Game Event Listeners
---------------------------------------------------- 
function QuestScript.OnPlayerDiscoveredUnitType(playerType, unitType)
	if (not HasPlayerDoneQuestType(playerType, QuestScript.Info.ID) and unitType == WORM_UNIT_TYPE) then
		StartQuest(playerType, QuestScript.Type);
	end
end
GameEvents.PlayerDiscoveredUnitType.Add(QuestScript.OnPlayerDiscoveredUnitType);

function QuestScript.OnUnitSetXY(playerID, unitID, plotX, plotY, unitType)
	
	if(unitType == WORM_UNIT_TYPE) then

		for playerType = 0, GameDefines.MAX_MAJOR_CIVS - 1, 1 do
			local candidatePlayer = Players[playerType];
			if (not HasPlayerDoneQuestType(playerType, QuestScript.Info.ID) and 
				candidatePlayer:IsAlive()) then

				local team = candidatePlayer:GetTeam();
				local plot = Map.GetPlot(plotX, plotY);
				if (plot ~= nil) then
					if(plot:IsVisible(team)) then
						StartQuest(playerType, QuestScript.Type);
					end
				end
			end
		end
	end
end
GameEvents.UnitSetXY.Add(QuestScript.OnUnitSetXY);


----------------------------------------------------
-- Callbacks
----------------------------------------------------

local function AddRewards(quest : table, isLoad : boolean)

	local rewards = {};

	if (isLoad) then
		if (quest.PersistentData.Rewards ~= nil and quest.PersistentData.Rewards.Yield2Name ~= nil) then
			rewards.Yield2Name = quest.PersistentData.Rewards.Yield2Name;
		end
	end

	if (rewards.Yield2Name == nil) then
		rewards.Yield2Name = QuestRewards.ChooseReward("Culture", "Energy", "CultureEnergy" );
	end

	QuestRewards.AddReward( rewards, "Yield1", "Science" );
	QuestRewards.AddReward( rewards, "Yield2", rewards.Yield2Name );

	MergeTable(rewards, quest.PersistentData.Rewards);
	quest.PersistentData.Rewards = rewards;
	rewards = {}
end

function QuestScript.OnStart(quest)

	-- find quest reward categories
	AddRewards(quest, false);

	quest:SetPrologue("TXT_KEY_QUEST_KILL_SEIGE_WORM_PROLOGUE");
	local objective = AddObjective(quest, "QUEST_OBJECTIVE_KILL_UNIT_TYPE", WORM_UNIT_TYPE, 1);
	objective:SetEpilogue("TXT_KEY_QUEST_KILL_SEIGE_WORM_EPILOGUE");
end

function QuestScript.OnLoad(quest)
	AddRewards(quest, true);
end

function QuestScript.OnObjectiveComplete(quest, objective)
	local player = Players[quest:GetOwner()];

	-- Give rewards
	local dividedReward = QuestRewards.DefaultQuestReward / 2;

	local player = Players[quest:GetOwner()];
	local rewards = quest.PersistentData.Rewards;
				
	rewards.Yield1:GiveReward(player, dividedReward);
	rewards.Yield2:GiveReward(player, dividedReward);

	-- Set reward strings
	local yield1RewardStrings = rewards.Yield1:GetRewardStrings(player, dividedReward);
	local yield2RewardStrings = rewards.Yield2:GetRewardStrings(player, dividedReward);

	quest:SetReward(unpack(yield1RewardStrings), unpack(yield2RewardStrings));

	-- Succeed
	quest:Succeed();
end

return QuestScript;
Should it be the following instead?
Code:
local WORM_UNIT_TYPE = { "UNIT_ALIEN_SIEGE_WORM_BASE", "UNIT_ALIEN_SIEGE_WORM_RAVAGER", "UNIT_ALIEN_SIEGE_WORM_MAKER" };
or...
Code:
local WORM_UNIT_TYPE = { GameInfo.Units["UNIT_ALIEN_SIEGE_WORM_BASE", "UNIT_ALIEN_SIEGE_WORM_RAVAGER", "UNIT_ALIEN_SIEGE_WORM_MAKER"].ID };
and how about...
Code:
local WORM_UNIT_TYPE = GameInfo.Units["UNIT_ALIEN_SIEGE_WORM_BASE"].ID or GameInfo.Units["UNIT_ALIEN_SIEGE_WORM_RAVAGER"].ID or GameInfo.Units["UNIT_ALIEN_SIEGE_WORM_MAKER"].ID;
My Lua knowledge is quite rudimentary.
 
None of the above.

You're going to need some "or's" in that "if unitType ==" statement. I personally would get rid of the WORM_UNIT_TYPE variable all together like so:
Code:
[COLOR="Blue"]if[/COLOR] (unitType == GameInfoTypes["UNIT_ALIEN_SIEGE_WORM_BASE"].ID [COLOR="Blue"]or[/COLOR] unitType == GameInfoTypes["UNIT_ALIEN_SIEGE_WORM_RAVAGER"].ID [COLOR="Blue"]or[/COLOR] unitType == GameInfoTypes["UNIT_ALIEN_SIEGE_WORM_MAKER"].ID) [COLOR="Blue"]then[/COLOR]

Also note, I've used the GameInfoTypes table as it's actually faster to access it (at least in Lua 5.1 and LuaJIT; can't imagine it would be any different in the new Havok Script) then to go into a subtable of GameInfo (ex.: GameInfo.Units). GameInfoTypes is a master table that should have all available objects of each branch of GameInfo.blah (Units, Buildings, Terrain, Features, etc.).

You could still setup a table for WORM_UNIT_TYPE (like you've done, only get rid of the brackets around each entry) and then access that during your if statement. That would look like this:
Code:
local WORM_UNIT_TYPE =
{
	GameInfoTypes["UNIT_ALIEN_SIEGE_WORM_BASE"].ID,
	GameInfoTypes["UNIT_ALIEN_SIEGE_WORM_RAVAGER"].ID,
	GameInfoTypes["UNIT_ALIEN_SIEGE_WORM_MAKER"].ID,
}

...

[COLOR="Blue"]if[/COLOR] (unitType == WORM_UNIT_TYPE[1] [COLOR="Blue"]or[/COLOR] unitType == WORM_UNIT_TYPE[2] [COLOR="Blue"]or[/COLOR] unitType == WORM_UNIT_TYPE[3]) [COLOR="Blue"]then[/COLOR]

The numbers in brackets there are "indexes". These default to numbers, starting at one and counting up, when you create a new table in Lua and don't specify what each index should be.

Edit: A third option... There's seriously no need to do this for a table with only three entries, but it doesn't hurt for me to show this anyways...

Spoiler :
Code:
local WORM_UNIT_TYPE =
{
	GameInfoTypes["UNIT_ALIEN_SIEGE_WORM_BASE"].ID,
	GameInfoTypes["UNIT_ALIEN_SIEGE_WORM_RAVAGER"].ID,
	GameInfoTypes["UNIT_ALIEN_SIEGE_WORM_MAKER"].ID,
}

...

local isWorm = false

for n = 1, #WORM_UNIT_TYPE, 1 do
	if unitType == WORM_UNIT_TYPE[n] then
		isWorm = true
		break
	end
end

if isWorm then

#var returns the length of an object (in this case, it returns how many entries are in the table).
The "for" statement will iterate on "n" until n == #WORM_UNIT_TYPE, incrementing by 1 each iteration.
Note that I went on to access specific indexes in the table using "n" as the index.
 
what the game is lacking is a equally intimidating air unit which would be hard to taken down like it's land and sea counterparts. What gets my mind arolling is a incectoid looking Dragon unit.

The Civopedia text mentions "Sky whales" in the entry about the rocktopus. Alien 'whales' that swallow floatstones in order to float around. Might be a cooler idea than dragons...
 
Top Bottom