Jump to content

[WIP] tech tree rearrangement


rhoark

Recommended Posts

The stock tech tree has some well-known problems that I won't re-enumerate in detail, but it mostly has to do with essential modules being too late in the tree. I've rearranged the tree so docking, ladders, wheels, lights, fuel cells, etc. all appear much earlier. There shouldn't be any type of technology used in Apollo that's not available by the 90-point tier. High powered rockets and sturdy capsules, however, are not in the start node. To fill the interim, I've included a few parts from Rubber Ducky's Bargain Rocket Parts in the first tiers, as well as a few low-end contracts to highlight these parts.

In terms of philosophy, I've tried as much as possible to make each node stand for a conceptual development, such as rendezvous or semiconductors, as opposed to being part-oriented (docking ports,probe cores) or just super-vague (Specialized Construction,Advanced Flight Control). This is not a probe-first tree. If you want more unmanned options in the early game, I suggest using this along with USI Sounding Rockets and dtobi's Smart Parts.

I've also made a few adjustments to make career mode more palatable in general:

1. Basic action groups are always available. (Some of us like pure IVA.)

2. Doubled the part count limit for level 1 VAB/SPH from 30 to 60. (You'll need this for potato battery rovers.)

3. Halved kerbal hiring cost. (It's their dream job!)

All stock nodes still exist and are close to their original position and cost, so other mods shouldn't be broken. Configuration is included to map Community Tech Tree node names to this tree.

Download: https://www.dropbox.com/s/0efwvntf7lngxsx/WhereYouComeIn-1.01.zip

The download includes material under the following terms:

Bargain Rocket Parts by Rubber Ducky licensed Attribution-ShareAlike 4.0 International (CC BY-SA 4.0)

Module Manager licensed CC ShareAlike

Contract Configurator under the MIT License (portions under GPL)

Coherent Contracts by Peter Collings ("peadar1987") and William Cornwell ("Xacktar") (non-standard license described in the download)

Community Tech Tree by Chris Adderley licensed Attribution-NonCommercial 4.0 International (CC BY-NC 4.0)

All other portions not otherwise under license are made available as Attribution-NonCommercial-ShareAlike 4.0 International (CC BY-NC-SA 4.0)

Edited by rhoark
Link to comment
Share on other sites

TBH I don't think there's demand for another one of those. Why don't you just join the discussion in Sherkaner's thread linked in my signature?

there is always room for more mods and there is more than one way to do an entertaining tree (for example compressing to fewer activity focused nodes rather than spreading to a part per node)

Link to comment
Share on other sites

Giving this some more thought, I'm not satisfied with the early experience still. I made sure it was playable in that the nodes don't cost too much for the available science, but that was just sweeping the problem under the rug. I want the tree to promote a period of suborbital missions, but there's not enough there to make that fun. I was thinking initially of recommending USI Sounding Rockets to go with this (a recommendation that still stands), but looking at the USI catalog I was reminded of Bargain Rockets. A few select parts from that in the start node (rebalanced so they're not as unreasonably effective parts), plus some suborbital contract ideas I have, and this will start to come together.

Link to comment
Share on other sites

Whoah, someone's actually doing what i'm searching for?

Nice. Wasn't really keen on starting my own mod just to make the career mode somewhat playable.

I'd prefer a tech tree that does not require any additional mods though (everything needed to play should be available in one pack, i think).

Perhaps you should just focus on making the tree to make more sense, and reduce the importance of historical-like progression? Not sure a "period of sub-orbital" flight really works in KSP, not as there's a limited amount of things to do on Kerbin.

BTW, my own ideas included having a Probe core in the starting tech but deliberately no batteries or solar panels. This way, you could use a probe core to test out crazy things without endangering your kerbals but it'd also limit them quite heavily as you need a liquid-fuel rocket to provide them with constant power.

However, I think merely fixing the tech tree doesn't really solve the problems of KSP career, it is fundamentally a hodgepodge of elements and the moment, elements whose interaction is rather limited, i think. And there are issues like "What do with science once you have researched everything?", and the fact each career is largely identical as it is (on paper, IMO, anyway, not sure what others think).

Link to comment
Share on other sites

Everything core to the experience will be in a single download. Bargain Rockets is licensed Creative Commons, so no problem there. I'm not going to use the whole pack - just a selection of parts that fill specific holes in the progression. I've finished rebalancing them to more realistic levels. The original pack made them nearly as effective as regular rocket parts - now they're as terrible as you'd expect given how they look. (I've been researching such things as the adhesive force of duct tape and the potential energy of a potato battery.) That lets me fulfill the mission statement of providing a type of part very early, without stealing the thunder of later nodes.

I don't want to force a lot of suborbital missions, but I want to make it a viable and appealing path. Grinding experiments near KSC is not fun, which is why I'm making some contracts as well. I've planned a set of 12 one-time missions (4 each with a pilot, scientist, or engineer theme) to diversify missions in the neighborhood of KSC. That's what I'm working on now.

I'd like to enable earlier unmanned missions, but not with full real-time control like regular probe cores. I'm considering one or both of two options: a limited probe core that ignores pitch/yaw/roll controls; or bundling dtobi's Smart Parts (auto-staging on timer or altitude triggers).

Link to comment
Share on other sites

Source for altering career limits. Data members in GameVariables aren't initialized automatically, so they need to be set explicitly or things go awry. They probably come from the difficulty GUI, but I don't know how to get at that directly. Making calls to the replaced instance instead of the superclass lets multiple mods apply changes simultaneously.

[KSPAddon(KSPAddon.Startup.SpaceCentre, true)]
public class DoStuffAtLoad : MonoBehaviour {

static GameVariables customGame;
static GameVariables stockGame;

public DoStuffAtLoad() {

}

void Awake() {
if (customGame == null) {
stockGame = GameVariables.Instance;
customGame = new interceptCareerLimits(GameVariables.Instance);
}
GameVariables.Instance = customGame;
}
}

public class interceptCareerLimits : GameVariables {
static GameVariables _master;

public interceptCareerLimits(GameVariables master) : base() {
_master = master;
this.partRecoveryValueFactor = _master.partRecoveryValueFactor;
this.reputationAddition = _master.reputationAddition;
this.reputationKerbalDeath = _master.reputationKerbalDeath;
this.reputationKerbalRecovery = _master.reputationKerbalRecovery;
this.reputationSubtraction = _master.reputationSubtraction;
this.contractDestinationWeight = _master.contractDestinationWeight;
this.contractFundsAdvanceFactor = _master.contractFundsAdvanceFactor;
this.contractFundsCompletionFactor = _master.contractFundsCompletionFactor;
this.contractFundsFailureFactor = _master.contractFundsFailureFactor;
this.contractPrestigeExceptional = _master.contractPrestigeExceptional;
this.contractPrestigeSignificant = _master.contractPrestigeSignificant;
this.contractPrestigeTrivial = _master.contractPrestigeTrivial;
this.contractReputationCompletionFactor = _master.contractReputationCompletionFactor;
this.contractReputationFailureFactor = _master.contractReputationFailureFactor;
this.contractScienceCompletionFactor = _master.contractScienceCompletionFactor;
this.mentalityDeadlineExceptional = _master.mentalityDeadlineExceptional;
this.mentalityDeadlineSignificant = _master.mentalityDeadlineSignificant;
this.mentalityDeadlineTrivial = _master.mentalityDeadlineTrivial;
this.mentalityExpiryExceptional = _master.mentalityExpiryExceptional;
this.mentalityExpirySignificant = _master.mentalityExpirySignificant;
this.mentalityExpiryTrivial = _master.mentalityExpiryTrivial;
this.mentalityFundsExceptional = _master.mentalityFundsExceptional;
this.mentalityFundsSignificant = _master.mentalityFundsSignificant;
this.mentalityFundsTrivial = _master.mentalityFundsTrivial;
this.mentalityReputationExceptional = _master.mentalityReputationExceptional;
this.mentalityReputationSignificant = _master.mentalityReputationSignificant;
this.mentalityReputationTrivial = _master.mentalityReputationTrivial;
this.mentalityScienceExceptional = _master.mentalityScienceExceptional;
this.mentalityScienceSignificant = _master.mentalityScienceSignificant;
this.mentalityScienceTrivial = _master.mentalityScienceTrivial;
}

public override int GetPartCountLimit(float editorNormLevel) {
if (editorNormLevel == 0) { return 60; }
return _master.GetPartCountLimit(editorNormLevel);
}

public override bool UnlockedActionGroupsStock(float editorNormLevel) {
_master.GetPartCountLimit(editorNormLevel);
return true;
}

public override bool UnlockedActionGroupsCustom(float editorNormLevel) {
_master.UnlockedActionGroupsCustom(editorNormLevel);
return editorNormLevel > 0.0;
}

public override float GetRecruitHireCost(int currentActive) {
var stock = _master.GetRecruitHireCost(currentActive);
return stock / 2.0f;
}

public override bool EVAIsPossible(bool evaUnlocked, Vessel v)
{
return _master.EVAIsPossible(evaUnlocked, v);
}

public override int GetActiveContractsLimit(float mCtrlNormLevel)
{
return _master.GetActiveContractsLimit(mCtrlNormLevel);
}

public override int GetActiveCrewLimit(float astroComplexNormLevel)
{
return _master.GetActiveCrewLimit(astroComplexNormLevel);
}

public override int GetActiveStrategyLimit(float adminNormLevel)
{
return _master.GetActiveStrategyLimit(adminNormLevel);
}

public override float GetContractDestinationWeight(CelestialBody body)
{
return _master.GetContractDestinationWeight(body);
}

public override float GetContractFundsAdvanceFactor(Contracts.Contract.ContractPrestige prestige)
{
return _master.GetContractFundsAdvanceFactor(prestige);
}

public override float GetContractFundsCompletionFactor(Contracts.Contract.ContractPrestige prestige)
{
return _master.GetContractFundsCompletionFactor(prestige);
}

public override float GetContractFundsFailureFactor(Contracts.Contract.ContractPrestige prestige)
{
return _master.GetContractFundsFailureFactor(prestige);
}

public override float GetContractLevelLimit(float mCtrlNormLevel)
{
return _master.GetContractLevelLimit(mCtrlNormLevel);
}

public override float GetContractPrestigeFactor(Contracts.Contract.ContractPrestige prestige)
{
return _master.GetContractPrestigeFactor(prestige);
}

public override float GetContractReputationCompletionFactor(Contracts.Contract.ContractPrestige prestige)
{
return _master.GetContractReputationCompletionFactor(prestige);
}

public override float GetContractReputationFailureFactor(Contracts.Contract.ContractPrestige prestige)
{
return _master.GetContractReputationFailureFactor(prestige);
}

public override float GetContractScienceCompletionFactor(Contracts.Contract.ContractPrestige prestige)
{
return _master.GetContractScienceCompletionFactor(prestige);
}

public override float GetCraftMassLimit(float editorNormLevel)
{
return _master.GetCraftMassLimit(editorNormLevel);
}

public override Vector3 GetCraftSizeLimit(float editorNormLevel)
{
return _master.GetCraftSizeLimit(editorNormLevel);
}

public override float GetCrewLevelLimit(float astroComplexNormLevel)
{
return _master.GetCrewLevelLimit(astroComplexNormLevel);
}

public override float GetDataToScienceRatio(float RnDnormLevel)
{
return _master.GetDataToScienceRatio(RnDnormLevel);
}

public override string GetEVALockedReason(Vessel v, ProtoCrewMember crew)
{
return _master.GetEVALockedReason(v, crew);
}

public override float GetExperimentLevel(float RnDnormLevel)
{
return _master.GetExperimentLevel(RnDnormLevel);
}

public override int GetHashCode()
{
return _master.GetHashCode();
}

public override float GetMentalityDeadlineFactor(float mentalityFactor, Contracts.Contract.ContractPrestige prestige)
{
return _master.GetMentalityDeadlineFactor(mentalityFactor, prestige);
}

public override float GetMentalityExpiryFactor(float mentalityFactor, Contracts.Contract.ContractPrestige prestige)
{
return _master.GetMentalityExpiryFactor(mentalityFactor, prestige);
}

public override float GetMentalityFundsFactor(float mentalityFactor, Contracts.Contract.ContractPrestige prestige)
{
return _master.GetMentalityFundsFactor(mentalityFactor, prestige);
}

public override float GetMentalityReputationFactor(float mentalityFactor, Contracts.Contract.ContractPrestige prestige)
{
return _master.GetMentalityReputationFactor(mentalityFactor, prestige);
}

public override float GetMentalityScienceFactor(float mentalityFactor, Contracts.Contract.ContractPrestige prestige)
{
return _master.GetMentalityScienceFactor(mentalityFactor, prestige);
}

public override OrbitDisplayMode GetOrbitDisplayMode(float tsNormLevel)
{
return _master.GetOrbitDisplayMode(tsNormLevel);
}

public override int GetPatchesAheadLimit(float tsNormLevel)
{
return _master.GetPatchesAheadLimit(tsNormLevel);
}

public override float GetRecoveredPartValue(float pValue)
{
return _master.GetRecoveredPartValue(pValue);
}

public override float GetRecoveredResourceValue(float rscValue)
{
return _master.GetRecoveredResourceValue(rscValue);
}

public override float GetScienceCostLimit(float RnDnormLevel)
{
return _master.GetScienceCostLimit(RnDnormLevel);
}

public override float GetStrategyCommitRange(float adminNormLevel)
{
return _master.GetStrategyCommitRange(adminNormLevel);
}

public override float GetStrategyLevelLimit(float adminNormLevel)
{
return _master.GetStrategyLevelLimit(adminNormLevel);
}

public override int GetTrackedObjectLimit(float tsNormLevel)
{
return _master.GetTrackedObjectLimit(tsNormLevel);
}

public override UntrackedObjectClass MinTrackedObjectSize(float tsNormLevel)
{
return _master.MinTrackedObjectSize(tsNormLevel);
}

public override float ScoreFlightEnvelope(float altitude, float altEnvelope, float speed, float speedEnvelope)
{
return _master.ScoreFlightEnvelope(altitude, altEnvelope, speed, speedEnvelope);
}

public override float ScoreSituation(Vessel.Situations sit, CelestialBody where)
{
return _master.ScoreSituation(sit, where);
}

public override string ToString()
{
return _master.ToString();
}

public override bool UnlockedEVA(float astroComplexNormLevel)
{
return _master.UnlockedEVA(astroComplexNormLevel);
}

public override bool UnlockedEVAClamber(float astroComplexNormLevel)
{
return _master.UnlockedEVAClamber(astroComplexNormLevel);
}

public override bool UnlockedEVAFlags(float astroComplexNormLevel)
{
return _master.UnlockedEVAFlags(astroComplexNormLevel);
}

public override bool UnlockedFlightPlanning(float mCtrlNormLevel)
{
return _master.UnlockedFlightPlanning(mCtrlNormLevel);
}

public override bool UnlockedFuelTransfer(float editorNormLevel)
{
return _master.UnlockedFuelTransfer(editorNormLevel);
}

public override bool UnlockedSpaceObjectDiscovery(float tsNormLevel)
{
return _master.UnlockedSpaceObjectDiscovery(tsNormLevel);
}
}

Edited by rhoark
Fixed
Link to comment
Share on other sites

This thread is quite old. Please consider starting a new thread rather than reviving this one.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.
Note: Your post will require moderator approval before it will be visible.

Guest
Reply to this topic...

×   Pasted as rich text.   Paste as plain text instead

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...