Skip to content

Instantly share code, notes, and snippets.

@ujihisa
Last active April 30, 2026 22:12
Show Gist options
  • Select an option

  • Save ujihisa/7af6c9e4803cc6bb0bd5250093780153 to your computer and use it in GitHub Desktop.

Select an option

Save ujihisa/7af6c9e4803cc6bb0bd5250093780153 to your computer and use it in GitHub Desktop.
KSP auto-strut strategy for structural failure on linkage

KSP auto-strut 戦略: structural failure on linkage 対策

このメモは、KSP で Structural failure on linkage between ... が出るときに、auto-strut をどう使い分けるかを整理したもの。

ここでは、実装から確認できる事実と、それに基づく運用上の推奨を分けて扱う。PartJointConfigurableJointOnJointBreakauto-strut の target 選択は実装上の事実。どの part にどの mode を設定するかは、その事実から導く実用上の方針であり、craft の形状や flight profile によって調整が必要になる。

KSP の実装上、通常の parent-child 接続、auto-strutEAS-4 Strut Connector は、最終的には PartJoint / Unity ConfigurableJoint constraint として扱われる。structural failure on linkage は、その joint が物理負荷で壊れ、PartJoint.OnJointBreak から Part.OnPartJointBreak に流れた結果として出る。

つまり auto-strut は「元の接続の breakForce を単純に増やす機能」ではない。追加の joint を作って load path を変える機能である。複数の joint があれば physics solver 上で荷重は分散され得るが、それぞれの joint は個別に壊れる。

重要なのは、auto-strut の mode は「その mode を設定した part から、どの anchor part へ仮想 joint を張るか」を決めるという点。したがって、mode だけでなく「どの part にその mode を設定するか」が結果を大きく変える。

まず読むべき症状

structural failure on linkage が出たら、まず「壊れた part をさらに固める」ではなく、「どこに荷重が流れて壊れたか」を見る。

確認すること:

  • 壊れた linkage が stack 接続か、radial 接続か、payload 周辺か、docking / robotics 周辺か。
  • 破断が ascent 中の aerodynamic load、engine thrust、physics warp、staging、docking 後の再構成のどれで起きているか。
  • auto-strut を追加したあと破断箇所が別の part に移ったか。
  • 多数の auto-strut が同じ root part または heaviest part に集中していないか。

auto-strut 後に破断箇所が移動した場合、それは改善ではなく force concentration の移動であることがある。その場合は、さらに強くするより先に、mode と設定する part を分散する。

基本方針

迷ったら、揺れている part または揺れている小さな assembly の根元側 part に grandparent を設定する。

grandparent は、設定した part から parent の parent へ向かう局所補強に近い。load path が短く、rootheaviest より force concentration を作りにくい。spacecraft、station、docking する craft、robotics、staging を含む craft、flight 中に形が変わる craft では、まず grandparent を使う。

grandparent

grandparent は、設定した part から grandparent 側へ auto-strut を張る mode。実装上は parent chain を使う局所的な target 選択で、条件によって parent 側への fallback や pivot 回避が入る。

structural failure on linkage 対策としては、最も安全な first choice。理由は、遠い rootheaviest part に荷重を飛ばさず、破断しそうな接続の近くで load path を短く閉じやすいから。

設定する part:

  • stack の途中で wobble している tankadapterengine mount
  • payload adapterdecouplerfairing base など、上下の接続を局所的に固めたい part。
  • docking port そのものではなく、その手前の structural part。
  • robotics の可動部そのものではなく、可動部を支える固定側の structural part。
  • station modulelander leg 周辺、science payload 周辺など、遠い root / heaviest へ力を飛ばしたくない part。

向いている状況:

  • どの anchor に荷重を集めるべきか明確でない。
  • staging、docking、robotics、payload separation がある。
  • local wobble を消したいだけで、craft 全体を剛体化したくない。
  • heaviestroot を使ったあと、別の場所に structural failure が移動した。

避ける状況:

  • radial booster 全体のように、local 補強だけでは central core への揺れを抑えきれない場合。
  • 非常に長い assembly の先端を、遠い central core へ直接引き戻したい場合。

注意点:

  • grandparent は予測しやすいが、長い外付け構造や大型 booster には足りないことがある。
  • 弱い part に設定しても、その part 自体の breakingForce / breakingTorque の限界は消えない。

heaviest

heaviest は、設定した part から craft 内の heaviest part 側へ auto-strut を張る mode。重い central core に対して、軽い outer parts や radial assembly を固定したいときに使う。

structural failure on linkage 対策としては、大型 launch vehicle の radial wobble に効きやすい。一方で、多数の part が同じ heaviest part に荷重を流すため、新しい破断点を作ることがある。

設定する part:

  • radial booster の上側 tank、engine mount、booster 全体の揺れを代表する part。
  • external tank、side-mounted engine pod、wing root など、central core から外へ張り出した assembly の根元側 part。
  • fairing 内 payload が launch 中に揺れる場合、その payload stack の下部または payload を支える structural part。
  • long rocket の upper stage や payload が横揺れする場合、揺れている stack 側の part。

向いている状況:

  • heavy central core が明確な launch vehicle。
  • radial booster や external tank が central core に対して揺れる。
  • fairing payload が ascent 中に wobble する。
  • outer assembly を mass center 側へ引き留めたい。

避ける状況:

  • docking で craft 構成が変わる vessel。
  • robotics や可動部を含む assembly。
  • heaviest part の target が staging、docking、vessel 再構成、mass distribution の変化で変わると困る craft。
  • 多数の part が同じ heavy part へ集中し、そこが新しい破断点になっている場合。

注意点:

  • heaviest は「重い part 自体に設定する」mode ではない。重い part に固定したい外側・先端側・揺れる側の part に設定する。
  • heaviest は booster や外周構造には有効だが、station や docked vessel では load path が読みにくくなる。
  • staging 後に target が変わり、別の load path ができることがある。

root

root は、設定した part から root partauto-strut を張る mode。root part が強い central structure に置かれている craft でだけ使う。

structural failure on linkage 対策としては、設計時点で root part を main tank や structural spine に置いている craft なら有効。ただし root part が小さな probe coredocking portdecoupler なら、そこへ荷重を集めるので逆効果になりやすい。

設定する part:

  • central core を基準に固定したい upper stage、payload adapter、engine cluster 周辺の part。
  • root part が main tank や strong structural spine にある craft で、そこへ明示的に荷重を戻したい outer parts。
  • heaviest の target 変化を避けたい part。

向いている状況:

  • root part が central tank、strong command section、main structural spine などにある。
  • craft 全体を root 基準で固める設計になっている。
  • heaviest part の target が flight 中に変わる方が危険。

避ける状況:

  • root part が小さな probe coredocking portdecoupler、off-axis part の場合。
  • root 周辺の linkage が細い、または breakingForce / breakingTorque が弱い場合。
  • station や docked vessel のように、root の意味が運用中に分かりにくくなる craft。

注意点:

  • root は「root にした part を補強する」mode ではない。root へ荷重を流したい part に設定する。
  • root が弱いと、root 周辺が force concentration の中心になる。
  • root が structural center から離れていると、wobble を減らすより twist を増やすことがある。

よくある失敗

  • 全部の part を heaviest にする。heavy part 周辺へ力が集中し、新しい structural failure を作りやすい。
  • 全部の part を root にする。root が弱い場合、root 周辺が破断点になる。
  • docking portrobotics の可動部に global な auto-strut を張る。意図しない拘束で load path が読みにくくなる。
  • structural failure が出た part だけを固め続ける。破断点が移動するだけで、根本の load path が改善しないことがある。
  • physics warp 中の破断を、通常 flight の構造問題と同じに扱う。physics warp は structural stability に影響するため、まず warp なしで再現するか確認する。

実用ルール

  • まず、実際に揺れている part またはその assembly の根元側 part に grandparent を設定する。
  • radial booster、external tank、outer engine pod など、central core に対して外側全体が揺れる場合は、その外側 assembly の主要 part に heaviest を設定する。
  • root part が強い central structure にある craft だけ、root へ荷重を戻したい part に root を設定する。
  • すべての part を heaviest または root にするのは避ける。
  • auto-strut 後に structural failure の場所が移動した場合、force concentration が移った可能性が高い。さらに固める前に、mode と設定する part を分散する。
  • docking、robotics、flight 中に再構成する craft では、grandparent を基本にし、global な heaviest / root は必要な part だけに限定する。

短くまとめると:

grandparent = structural failure 対策の default。揺れている local assembly の part に使う
heaviest    = heavy central core に固定したい outer/radial part に使う
root        = root が強い central structure の craft で、root へ荷重を戻したい part に使う

fairing の中間 node で巨大 payload を支えている場合

fairing 内の中間 node や payload support 用の node に巨大な payload を接続している場合、structural failure on linkage はその node 周辺に荷重が集中して起きやすい。この接続も特別扱いではなく、最終的には通常の PartJoint として破断判定される。auto-strut はその node の breakForce / breakTorque を直接増やすものではなく、payload から周辺構造への load path を追加するものとして使う。

見るべき症状:

  • fairing 内の payload が ascent 中に横揺れし、payload adapter や中間 node 周辺で linkage failure が出る。
  • payload 自体は重く、接続点は一箇所または細い adapter に集中している。
  • heaviestroot を広く設定したあと、payload adapter、fairing base、upper stage 側へ破断箇所が移動する。

推奨する設定:

  • まず payload を支えている adapter、fairing base、中間 node に近い structural part に grandparent を設定する。
  • payload stack の下部や、payload を受けている structural part に grandparent を設定し、局所的に揺れを止める。
  • central core が明確な launch vehicle で、payload 全体を core 側へ引き戻したい場合だけ、payload stack の下部または payload support 側の part に限定して heaviest を試す。
  • root は、root part が強い central structure にある場合だけ使う。root が小さな probe core、docking port、decoupler、payload 側の軽い part なら使わない。

避けること:

  • payload 内の多数の part すべてを heaviest にする。heavy part や adapter 周辺へ force concentration を作りやすい。
  • payload と fairing / adapter の両側を無差別に root へ結ぶ。root 周辺または中間 node 周辺が新しい破断点になり得る。
  • docking port や可動 payload に global な auto-strut を張る。分離後や docking 後の load path が読みにくくなる。

それでも壊れる場合は、auto-strut 設定だけで解決しようとせず、接続点を増やす、payload を短くする、太い adapter に変える、EAS-4 Strut Connector で荷重を分散する、ascent 中の max Q や steering を抑える、といった構造・飛行プロファイル側の対策を優先する。

KSP world firsts / ProgressTracking

KSP 1.x の world firsts は ProgressTracking / ExplorationContract / ProgressTrackingParameter で扱われる。ここでは天体別ではなく、内部 ProgressType ごとの条件と報酬計算を整理する。

出典

  • KSP_Data/Managed/Assembly-CSharp.dll
    • FinePrint.Utilities.ProgressType: progress type enum。
    • FinePrint.Utilities.ProgressUtilities.ScoreProgressType: progress type ごとの報酬係数。
    • FinePrint.Utilities.ProgressUtilities.OutlierWorldFirstContract: outlier 判定。
    • FinePrint.Utilities.ProgressUtilities.WorldFirstStandardReward: 報酬計算。
    • FinePrint.Utilities.ProgressUtilities.WorldFirstIntervalReward: record 系の分割報酬計算。
  • GameData/Squad/Contracts/Contracts.cfg:562-584
    • Progression の生設定値。
  • GameData/Squad/Localization/dictionary.cfg:1581-1645
    • world-first contract の表示タイトルと説明文。
  • GameData/Squad/Localization/dictionary.cfg:1784-1792
    • world-first 完了メッセージの一部。
  • saves/2026-04/quicksave.sfs:98-106
    • 現在の save の career gain multiplier。
  • saves/2026-04/quicksave.sfsSCENARIO { name = ProgressTracking }
    • 実際に保存される node 名の照合。

生の設定値

GameData/Squad/Contracts/Contracts.cfgProgression:

OutlierMilestoneMultiplier = 1.5
PassiveBaseRatio = 0.2
PassiveBodyRatio = 0.3
RecordSplit = 5
Funds.BaseReward = 80000
Science.BaseReward = 8
Reputation.BaseReward = 16

現在の saves/2026-04/quicksave.sfs では:

FundsGainMultiplier = 0.9
RepGainMultiplier = 0.9
ScienceGainMultiplier = 0.9

報酬計算式

WorldFirstStandardReward(contract, rewardKind, progressType, body) の形で読むと、基礎式は次の通り。

baseFunds = 80000
baseScience = 8
baseReputation = 16

score = ScoreProgressType(progressType, body)
outlier = OutlierWorldFirstContract(progressType, body) ? 1.5 : 1.0

contractBaseReward(kind) = round(base(kind) * (1 - PassiveBaseRatio) * score * outlier)
passiveBaseReward(kind)  = round(base(kind) * PassiveBaseRatio * score * outlier)

契約として提示された場合は、このあと prestige に応じた contract completion factor が掛かる。

contractReward(kind) = contractBaseReward(kind)
                     * GetContract<kind>CompletionFactor(ProgressTypePrestige(progressType, null))

passive progress reward の funds だけは、天体の destination weight で少し増減する。

passiveFundsReward = passiveBaseReward(funds)
                   * (1 + (GetContractDestinationWeight(body) - 1) * PassiveBodyRatio)

record 系は WorldFirstIntervalReward で標準報酬を RecordSplit 区間へ分割する。RecordSplit = 5 なので、速度・高度・距離・深度 record は段階達成ごとに区間分だけ支払われる。

注意: 下表の報酬は GetContract...CompletionFactor と save の gain multiplier を掛ける前の「world-first 内部の基礎額」。実際の Mission Control 契約では複数 parameter が束ねられ、prestige と難易度倍率で values = ... に保存される。

ProgressType 別一覧

報酬列は funds / science / reputationhome は Kerbin など home body 扱い、non-home はそれ以外の天体扱い。

ProgressType save/表示名 条件 score home/non-home outlier contract base home contract base non-home passive base home passive base non-home
ALTITUDERECORD Altitude record 高度記録 2.0 / 2.0 128000 / 13 / 26 128000 / 13 / 26 32000 / 3 / 6 32000 / 3 / 6
BASECONSTRUCTION BaseConstruction Start building an outpost on 0.3 / 0.8 yes 28800 / 3 / 6 76800 / 8 / 15 7200 / 1 / 1 19200 / 2 / 4
CREWTRANSFER CelestialBodyTransfer / CREWTRANSFER Transfer any crew between vessels near 0.3 / 0.8 19200 / 2 / 4 51200 / 5 / 10 4800 / 0 / 1 12800 / 1 / 3
CREWRECOVERY FirstCrewToSurvive / CREWRECOVERY Recover first crew from a mission 0.1 / 0.1 6400 / 1 / 1 6400 / 1 / 1 1600 / 0 / 0 1600 / 0 / 0
DEPTHRECORD Depth record 海中深度記録 2.0 / 2.0 128000 / 13 / 26 128000 / 13 / 26 32000 / 3 / 6 32000 / 3 / 6
DISTANCERECORD Distance record 地上距離記録 2.0 / 2.0 128000 / 13 / 26 128000 / 13 / 26 32000 / 3 / 6 32000 / 3 / 6
DOCKING Docking Dock two vessels on or around 0.3 / 0.8 19200 / 2 / 4 51200 / 5 / 10 4800 / 0 / 1 12800 / 1 / 3
ESCAPE Escape Escape the influence of 1.1 / 0.6 70400 / 7 / 14 38400 / 4 / 8 17600 / 2 / 4 9600 / 1 / 2
FIRSTLAUNCH FirstLaunch / FIRSTLAUNCH Launch our first vessel 0.1 / 0.1 6400 / 1 / 1 6400 / 1 / 1 1600 / 0 / 0 1600 / 0 / 0
FLAGPLANT FlagPlant / FLAGPLANT Plant a flag on 0.2 / 0.6 12800 / 1 / 3 38400 / 4 / 8 3200 / 0 / 1 9600 / 1 / 2
FLIGHT Flight Enter the atmosphere / atmospheric flight 0.5 / 1.2 32000 / 3 / 6 76800 / 8 / 15 8000 / 1 / 2 19200 / 2 / 4
FLYBY Flyby / FLYBY Fly by 0.8 / 1.0 51200 / 5 / 10 64000 / 6 / 13 12800 / 1 / 3 16000 / 2 / 3
FLYBYRETURN ReturnFromFlyBy / FLYBYRETURN Return home from a flyby of 0.8 / 1.0 51200 / 5 / 10 64000 / 6 / 13 12800 / 1 / 3 16000 / 2 / 3
LANDING Landing Land on 0.1 / 1.5 6400 / 1 / 1 96000 / 10 / 19 1600 / 0 / 0 24000 / 2 / 5
LANDINGRETURN ReturnFromSurface / LANDINGRETURN Return home from the surface of 0.1 / 1.5 yes 9600 / 1 / 2 144000 / 14 / 29 2400 / 0 / 0 36000 / 4 / 7
ORBIT Orbit / ORBIT Orbit 1.0 / 0.8 64000 / 6 / 13 51200 / 5 / 10 16000 / 2 / 3 12800 / 1 / 3
ORBITRETURN ReturnFromOrbit / ORBITRETURN Return home from orbit of 1.0 / 0.8 64000 / 6 / 13 51200 / 5 / 10 16000 / 2 / 3 12800 / 1 / 3
POINTOFINTEREST PointOfInterest Discover a point of interest 0.3 / 0.8 19200 / 2 / 4 51200 / 5 / 10 4800 / 0 / 1 12800 / 1 / 3
REACHSPACE ReachedSpace / REACHSPACE Escape the atmosphere / reach space 0.8 / 0.8 51200 / 5 / 10 51200 / 5 / 10 12800 / 1 / 3 12800 / 1 / 3
RENDEZVOUS Rendezvous Rendezvous two vessels in orbit of 1.0 / 0.8 64000 / 6 / 13 51200 / 5 / 10 16000 / 2 / 3 12800 / 1 / 3
SCIENCE Science Gather scientific data from 0.2 / 0.6 12800 / 1 / 3 38400 / 4 / 8 3200 / 0 / 1 9600 / 1 / 2
SPACEWALK Spacewalk Go on an orbital spacewalk near 0.6 / 0.6 38400 / 4 / 8 38400 / 4 / 8 9600 / 1 / 2 9600 / 1 / 2
SPEEDRECORD Speed record 速度記録 2.0 / 2.0 128000 / 13 / 26 128000 / 13 / 26 32000 / 3 / 6 32000 / 3 / 6
SPLASHDOWN Splashdown Splash down into the oceans of 0.3 / 1.5 19200 / 2 / 4 96000 / 10 / 19 4800 / 0 / 1 24000 / 2 / 5
STATIONCONSTRUCTION StationConstruction Start building a station in orbit of 0.8 / 0.8 yes 76800 / 8 / 15 76800 / 8 / 15 19200 / 2 / 4 19200 / 2 / 4
STUNT Stunt Stunt progress node 0.3 / 0.8 19200 / 2 / 4 51200 / 5 / 10 4800 / 0 / 1 12800 / 1 / 3
SUBORBIT Suborbit / SUBORBIT Suborbital spaceflight on 0.8 / 1.0 51200 / 5 / 10 64000 / 6 / 13 12800 / 1 / 3 16000 / 2 / 3
SURFACEEVA SurfaceEVA Walk on the surface of 0.2 / 0.6 12800 / 1 / 3 38400 / 4 / 8 3200 / 0 / 1 9600 / 1 / 2

outlier 判定

OutlierWorldFirstContract が true になるもの:

  • BASECONSTRUCTION
  • STATIONCONSTRUCTION
  • LANDINGRETURN かつ対象天体に atmosphere がある場合

これらは OutlierMilestoneMultiplier = 1.5 が掛かる。

補足

CREWTRANSFER は save 上では CelestialBodyTransfer として残ることがある。表示文言は Transfer any crew between vessels near <body> で、条件文は Transfer any crew into any vessel from another mission in orbit of <body>...

LANDINGRETURN は表示上 ReturnFromSurfaceFLYBYRETURNReturnFromFlyByORBITRETURNReturnFromOrbit に対応する。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment