mkworks

シムトラ関係のエントリーまとめ群

補完資料: 貨物運賃を計算したい(120.4〜?)

このエントリーは以下の環境にて実証を行いました、他の環境では数値が変化する可能性が有りますのでご容赦ください。
仮に参考にして不都合が生じてもこのエントリーを書いた人間は責任を一切負いません、そしてC言語はポインタで投げ捨てた初心者なので必要な箇所しか読んでいません。

  • 本体:120.4 nightly Revision 8646 with OTRP
  • pak: pak.nippon

ソースコードを読み解く時はVSCodeを使うと簡単に読み解けるので導入を強くおすすめします、なおシムトラのソースコードVSCode導入は一切サポートしません。

貨物運賃はどうやって出すの?

\frac{value \times ( 1000 + ( bonus - 100) \times speed\_bonus}{300000}

上の式はSimutransのソースファイルの一つであるgoods_stats_t.ccというファイルの以下の行から導くことが出来ます。
このソースは一覧表の中にある貨物一覧において貨物1つごとの種類や運賃等を算出や描画処理を行うファイルとなります。

f:id:mashita_07_15:20181230141342p:plain
貨物一覧表

const sint32 grundwert128 = (sint32)wtyp->get_value() * welt->get_settings().get_bonus_basefactor();
// bonus price will be always at least this
const sint32 grundwert_bonus = (sint32)wtyp->get_value()*(1000l+(bonus-100l)*wtyp->get_speed_bonus());
const sint32 price = (grundwert128>grundwert_bonus ? grundwert128 : grundwert_bonus);
money_to_string( money_buf, price/300000.0 );

このソースの断片からではpriceという変数を出すためにはgrandwert_bonusという値の計算が必要になります、その値の計算には何やら面倒な式が出てきていますね。
valueとspeed_bonusは先日のエントリーで貨物のdatについて書いた時に説明しているので割愛します、

bonusはどこから来るの

ここで先程開いたgoods_stats_t.ccの少し上を見ると何やら怪しい関数が出てきますね

void goods_stats_t::update_goodslist( uint16 *g, int b, int l )
{
	goodslist = g;
	bonus = b;
	listed_goods = l;
	set_size( scr_size(BUTTON4_X + D_BUTTON_WIDTH + 2, listed_goods * (LINESPACE+1) ) );
}

貨物のリストを更新する関数ですが2つ目の引数であるbは内部でbonusに代入されていますね、ここでbonusはupdate_goodslistで値が設定されることはわかってもその値はどこから来るのかはわかりません。
では、その値をどこから引っ張るのかと言うとファイルを変えてgoods_frame_t.ccの中に答えの糸口があります。

//関係ないので省略 

/**
 * This variable defines the current speed for bonus calculation
 * @author prissi
 */
sint16 goods_frame_t::relative_speed_change=100;

//関係ない処理のため省略

void goods_frame_t::sort_list()
{
	// 種別単位の速度ボーナス設定処理のため省略

	goods_stats.update_goodslist( good_list, relative_speed_change, n );
}

先程出てきたupdate_goodslistという関数がここで登場していますね、その値にはrelative_speed_changeという変数が登場しますがどういう値を入れればいいかこの関数を見ただけではわかりませんね。
ですが最初の方に必要になる数字が代入されています、コメントを読むにボーナス計算に必要なスピードが設定します。
ここで100という値がrelative_speed_changeに入ることがわかり、それがbonusという変数の値として代入されることがわかりました。
bonusに入る値がわかったので実際にゲーム内における運賃を計算していきましょう、以下の条件を計算式に割り当てます。

  • value: 180
  • speed_bonus: 40

実際に計算した結果が以下のとおりです
\begin{align}price &= \frac{180 \times ( 1000 + ( 100 - 100) \times 40)}{300000}\\ &= \frac{180 \times ( 1000 + 0 \times 40)}{300000}\\  &= \frac{180 \times ( 1000 + 0)}{300000}\\ &= \frac{180 \times ( 1000 )}{300000}\\ &= \frac{180000}{300000}\\ &= 0.6\\\end{align}

この数値は画像中にある小口荷物という貨物に対してdatにて定義した数値をそのまま流用して計算しました

obj=good
name=Delivery_Box(Small)
metric=box
catg=1
value=180
weight_per_unit=1
speed_bonus=40

最後に

来年もよしなに(雑)