Skip to content

Instantly share code, notes, and snippets.

@oupo
Created September 17, 2010 12:46
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 2 You must be signed in to fork a gist
  • Save oupo/584174 to your computer and use it in GitHub Desktop.
Save oupo/584174 to your computer and use it in GitHub Desktop.

テクニック値の計算

間違っている可能性が多分にあります

計算に使われる定数

近くの選手の値への倍率5
ダブルのときの補正20
トリプルのときの補正40
属性有利による補正10
属性一致による補正10
キーパーに向かってドリブルされてきた場合の補正60
GPの境目125
GPの境目210
こんしん!に必要なGP10

スキルに設定されている威力

スキル威力
キーパープラス110
スピードプラス110
シュートプラス110
ディフェンスプラス110
オフェンスプラス110
おいろけUP!90
イケメンUP!90
ちょうわざ!120
ぞくせいきょうか150
クリティカル!150
ラッキー!105
やくびょうがみ105
スピードフォース105
シュートフォース105
ディフェンスフォース105
オフェンスフォース105
ネバーギブアップ105
イケイケ!105
みんなイケイケ!105
こんしん!120

unitcalc

名前は勝手につけたもの

limitmagnificationrandom_widthburning_phaseshoot_powerpower
オフェンス側010402000
ディフェンス側020302000
オフェンス側(必殺技)0502015075
ディフェンス側(必殺技)0502015075
シュート0202020100
ループシュート0202020100
ボレーシュート・ヘディング0202020100
シュート(必殺技)05020151075
キーパー(表示用)030202000
キーパー030202000
キーパー(必殺技)0502015075
競り合い108020000
競り合い208020000
競り合いでキープするか06040000
シュートブロック0502015075
シュートブロック(シュート技)0502015075
kickbodyguardcontrolspeedgutsstaminaflags
オフェンス側040050505
ディフェンス側004050505
オフェンス側(必殺技)035050555
ディフェンス側(必殺技)003550555
シュート400050506
ループシュート1000350506
ボレーシュート・ヘディング3000015506
シュート(必殺技)400000556
キーパー(表示用)004000556
キーパー004000556
キーパー(必殺技)054000506
競り合い100300010104
競り合い203000010104
競り合いでキープするか01515200004
シュートブロック0035001050
シュートブロック(シュート技)3500100050

テクニック値計算ルーチン

if (キーマンがGK)
	unitcalc.power += (ボディ > 120 ? 13 : ボディ / 10)
if (キーマンがDF)
	unitcalc.body += (ガード > 120 ? 13 : ガード / 10)
if (キーマンがMF)
	unitcalc.control += (コントロール > 120 ? 13 : コントロール / 10)
if (キーマンがFW)
	unitcalc.kick += (キック > 120 ? 13 : キック / 10)

r = 0
r += (技の威力 + 技の成長度による威力アップ) * unitcalc.power
if (必殺タクティクスのテクニック計算のとき) {
	r += 必殺タクティクスの威力 * unitcalc.power
}
r += ステータスから基本となる値計算(unit, unitcalc)
r = r * 41 / 4096
r = r * (unitcalc.magnification + 100) / 100

if (ランダム計算をする場合) {
	; 0以上unitcalc.random_width未満の乱数
	r += r * rand(unitcalc.random_width) / 100
} else {
	r += r * (unitcalc.random_width / 2) / 100
}

if (バーニングフェーズ) {
	r += r * unitcalc.burning_phase / 100
}

; 必殺技じゃないシュートはゲージで選択した強さ
; 必殺技シュートの場合は基本1で、シュートチェインは0?
r += r * (unitcalc.shoot_power * シュートの4段階の強さ(0~3)) / 100

r += r * ダブルやトリプルによる補正を計算(unitcalc) / 100

r += r * 属性の相性による補正を計算(unit, opponent_unit) / 100

if (技の属性 == 選手の属性) {
	r += r * 属性一致による補正 / 100
}
if (必殺タクティクスのテクニック計算じゃない) {
	r = r * スキルによる補正を計算(unit, opponent_unit, unitcalc) / 100
}
if (バーニングフェーズじゃない) {
	if (残りGP < GPの境目1) r = r * 90 / 100
	if (残りGP < GPの境目2) r = r * 90 / 100
}

if (unitcalc.limit > 0) {
	return min(r, unitcalc.limit)
} else {
	return max(r, unitcalc.limit)
}

キーマン

参照されるのは選手データに設定されているポジション

キーマンのステータスではないことに注意

  • キーマンがGK: テクニック値を計算する選手のボディ値が高いほど、必殺技の威力があがる
  • キーマンがDF: テクニック値を計算する選手のガード値が高いほど、ボディの値がテクニック値によく反映される
  • キーマンがMF: テクニック値を計算する選手のコントロール値が高いほど、コントロールの値がテクニック値によく反映される
  • キーマンがFW: テクニック値を計算する選手のキック値が高いほど、キックの値がテクニック値によく反映される

ステータスから基本となる値計算

return キック * unitcalc.kick +
       ボディ * unitcalc.body +
       ガード * unitcalc.guard +
       コントロール * unitcalc.control +
       スピード * unitcalc.speed +
       ガッツ * unitcalc.guts +
       スタミナ * unitcalc.stamina

ダブルやトリプルによる補正を計算

r = 0
n = 0

for (unit2 in 近くにいる選手) {
	r += ステータスから基本となる値計算(unit2, unitcalc) * 近くの選手の値への倍率 / 100
	if (属性(unit) == 属性(unit2) && ! むぞくせいフラグ(unit2)) {
		n ++
	}
}
if (n == 1) { ; ダブル
	r += r * ダブルのときの補正 / 100
} else if (n == 2) { ; トリプル
	r += r * トリプルのときの補正 / 100
}
r = r * 10 / 100

if (キーパーだったら(unit) && ほかいろいろな条件) {
	r += キーパーに向かってドリブルされてきた場合の補正
}

return r

技の成長度による威力アップ

12345
G普0381216
G速0261014
G遅04101418
真普0310
真速028
真遅0512
V普0310
V速028
V遅0512

属性の相性による補正を計算

if (むぞくせいフラグ(unit) || むぞくせいフラグ(opponent_unit))
	return 0

if (属性が勝っている(属性(unit), 属性(opponent_unit))) {
	if (ぞくせいきょうかフラグ(unit)) {
		return ぞくせいきょうかの威力 ; 150
	} else {
		return 属性有利の倍率 ; 10
	}
}
return 0

スキルによる補正を計算

r = 100
if (おいろけUP!フラグ(opponent_unit) && 性別(unit) == 男) {
	r = r * おいろけUP!の威力 / 100
}
if (イケメンUP!フラグ(opponent_unit) && 性別(unit) == 女) {
	r = r * イケメンUP!の威力 / 100
}
if (キーパープラスフラグ(unit) && キーパー時) {
	r = r * キーパープラスの威力 / 100
}
if (シュートプラスフラグ(unit) && シュート時) {
	r = r * シュートプラスの威力 / 100
}
if (ディフェンスプラスフラグ(unit) && ディフェンス時) {
	r = r * ディフェンスプラスの威力 / 100
}
if (オフェンスプラスフラグ(unit) && オフェンス時) {
	r = r * オフェンスプラスの威力 / 100
}
if (ちょうわざ!フラグ(unit)) {
	r = r * ちょうわざ!の威力 / 100
}
if (ランダム計算をする場合) { ; コマンド選択の表示用テクニック計算ではfalse
	if (クリティカル!フラグ(unit) && rand(100) <= 10) {
		r = r * クリティカル!の威力 / 100
	}
	if (ラッキー!フラグ(unit)) {
		r = r * (rand(ラッキー!の威力 - 100) + 100) / 100
	}
	if (やくびょうがみフラグ(unit)) {
		if (rand(100) <= 10) {
			r = r * クリティカル!の威力 / 100
		} else {
			r = r * (100 - rand(やくびょうがみの威力 - 100)) / 100
			r = max(r, 1)
		}
	}
}
if (シュートフォースフラグ(unit) && シュート時) {
	r = r * シュートフォースの威力 / 100
}
if (ディフェンスフォースフラグ(unit) && ディフェンス時) {
	r = r * ディフェンスフォースの威力 / 100
}
if (オフェンスフォースフラグ(unit) && オフェンス時) {
	r = r * オフェンスフォースの威力 / 100
}
得点 = チームの得点取得(unit)
相手の得点 = チームの得点取得(opponent_unit)

if (ネバーギブアップフラグ(unit)) {
	if (得点 < 相手の得点) {
		r = r * ネバーギブアップの威力 / 100
	}
}
if (イケイケ!フラグ(unit)) {
	if (得点 - 相手の得点 > 0) {
		for (i = 0; i < 得点 - 相手の得点; i ++) {
			r = r * イケイケ!の威力 / 100
		}
	} else {
		for (i = 0; i < 相手の得点 - 得点; i ++) {
			r = r * 100 / イケイケ!の威力
		}
	}
}
if (みんなイケイケ!フラグ(unit)) {
	if (得点 - 相手の得点 > 0) {
		for (i = 0; i < 得点 - 相手の得点; i ++) {
			r = r * みんなイケイケ!の威力 / 100
		}
	} else {
		for (i = 0; i < 相手の得点 - 得点; i ++) {
			r = r * 100 / みんなイケイケ!の威力
		}
	}
}
if (こんしん!フラグ(unit) && 技が必殺技 && 残りGP >= こんしん!に必要なGP) {
	r = r * こんしん!の威力 / 100
}
return r

オフェンス・ディフェンスのコマンドバトルの勝敗

  • トータルテクニックの下限: 1
  • トータルテクニックの上限: 1200

勝つ確率は ((自分のトータルテクニックの3乗)+(相手のトータルテクニックの3乗)) 分の (自分のトータルテクニックの3乗)

シュート・キーパーの勝敗

  • シュートの補正はまず距離をもとに格納される
  • シュートチェインの場合、一番威力の高い技が最後にチェインした選手でテクニック値が計算される
    • たとえばとらまるのタイガードライブにそめおかのドラゴンクラッシュでチェインした場合、そめおかのタイガードライブで計算される
    • 技の成長度による威力アップはそめおかがタイガードライブを覚えていたらそっち、覚えていなければ0
  • シュートの距離はチェインすると更新される
  • シュートチェインの補正 = 10
  • (シュートチェインが3つ以上のときは試せておらず)

シュートの値:

シュートの値 = シュートトータルテクニック * シュートの補正 / 100
if (シュートチェインが2つ) {
	シュートの値 += シュートの値 * シュートチェインの補正 / 100
	シュートの値 += シュートの値 * シュートチェインの補正 / 100
} else if (シュートチェインが1つ) {
	シュートの値 += シュートの値 * シュートチェインの補正 / 100
}
  • キーパートータルテクニックがシュートの値以上だったらキーパーの勝ち

試合(not ミニバトル)時の距離の補正

距離の補正のグラフ

距離の図

ただしCPU側のシュートの場合は距離を割る値が約0.8倍になるようです?詳細不明

シュートブロック

  • シュートブロックの選手を相手としてシュートのテクニック値を計算
  • (シュートのテクニック値 * シュートの補正 / 100)をシュートの値とする
  • シュートを打った選手を相手としてシュートブロックのテクニック値を計算しブロックの値とする
  • シュートブロックの必殺技がシュート技のとき:
    • シュートの値がブロックの値以上のときブロックミス
    • それ以外のときはブロック成功
  • シュートブロックの必殺技がブロック技のとき:
    • (シュートの値 * 75 / 100) がブロックの値以上のとき、ブロックミス
    • (シュートの値 * 125 / 100) がブロックの値以下のとき、ブロック成功
    • それ以外のときはパワーダウン。ブロックの値によらずシュートの補正の値から一定で50を引く

必殺タクティクスの勝敗

名前威力使われるunitcalc
ルート・オブ・スカイ20オフェンス側(必殺技)
ボックスロックディフェンス40ディフェンス側(必殺技)
デュアルタイフーン28オフェンス側(必殺技)
アブソリュートナイツ25ディフェンス側(必殺技)
パーフェクトゾーンプレス35ディフェンス側(必殺技)
むてきのヤリ40オフェンス側(必殺技)
アンデスのありじごく45ディフェンス側(必殺技)
ゴーストロック20オフェンス側(必殺技)
えんげつのじん35オフェンス側(必殺技)
ローリングサンダー24オフェンス側(必殺技)
エンペラーロード28オフェンス側(必殺技)
カテナチオカウンター36ディフェンス側(必殺技)
アマゾンリバーウェーブ38オフェンス側(必殺技)
サークルプレードライブ33ディフェンス側(必殺技)
セイントフラッシュ18オフェンス側(必殺技)
ブラックサンダー18オフェンス側(必殺技)
スロータイム18オフェンス側(必殺技)
クイックタイム18オフェンス側(必殺技)
ダンシングボールエスケープ35オフェンス側(必殺技)
バナナシュート60シュート(必殺技)
ザ・チューブ67シュート(必殺技)
  • 11人全員のテクニック値の合計を計算し高い方が勝ち
  • テクニック計算には技やopponent_unitはnullが渡される。簡略のためテクニック計算ルーチンではそれらがnullの場合を書いていないが、技の威力、属性一致、属性の相性はなしになる

補足

  • プラス系の効果範囲はスキルを持っている一人じゃなくてよくわからない効果範囲になっているよう。未調査
  • 競り合いはパスしたのが味方だったら競り合い1で敵だったら競り合い2の模様
  • 属性一致による補正は自分や相手にむぞくせいがついていてもかかる
  • 選手にむぞくせいがついていてもダブル・トリプルの補正はかかる(表示上はかかっていない)
    • 近くにいる選手の方にむぞくせいがついている場合はその選手はダブル・トリプルのカウントにはいらない (表示通り)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment