KDOC 29: Simutransのコードを読む

DONE プロジェクトのステータス

プロジェクトは完了である。

概要

Simutransはオープンソースの鉄道会社シミュレーションゲームである。コードを読む。

Tasks

DONE 建設したときに何が起こっているか

  • simtool.ccにツール類の定義がある。建物破壊、地形改変、町の建設、スケジュール指定など
    • クリックしたときの動作がすべて関数workとして定義されているよう
  • tool_build_way_tが線路系建設クラスか
    • 構成メソッド…
      • get_desc
      • get_icon
      • get_tooltip
        • クリックしたときに出るやつ
      • get_defaultparam
      • is_selected
      • init
      • get_watype
        • get-desc()でdescを取り出し、descからget_wtyp()でwaytypeを取り出す
      • start_at
      • is_valid_pos
      • calc_route
        • 線路建設時のルート検索。線路建設時は始点と終点を指定する
        • shift押すとできるだけ直線するところを確認した
      • do_work
      • mark_tiles
    • waytype_tが交通手段を示す
    • 年月によってdescriptionが変わる
    • playerをとる関数が多いのは、プレイヤーが複数いるからか
    • grund_t *gr=welt->lookup(new_start); でクリック開始時の地面オブジェクトを取得する
      • new_startは3次元座標オブジェクト(coord3d)

Memo

/**
 * Class for tools needing two clicks (e.g. building ways).
 * Dragging is also possible.
 */
class two_click_tool_t : public tool_t {
/**
 * Search a free place for a monument building
 * Im Gegensatz zum building_placefinder_t werden Strassen auf den Raendern
 * toleriert.
 */
class monument_placefinder_t : public placefinder_t {
  • get_tile_list でそのタイルの一覧を取っているようだ
  • レベルを取得する方法
    • uint16 level = gb->get_tile()->get_desc()->get_level()+1;
    • 建物がタイル、情報、高さを持っている
  • 市庁舎かを確認する方法 add_gb->get_tile()->get_desc()->is_townhall()
  • 座標のほかに、町の家リストがある
// this function removes houses from the city house list
void stadt_t::remove_gebaeude_from_stadt(gebaeude_t* gb)
{
	buildings.remove(gb);
	gb->set_stadt(NULL);
	recalc_city_size();
}
  • 重み付けしたベクタ。要素をソートするのに役立つ
    • weighted_vector_tpl
    • 各要素が重みを保持している
stadt_t::factory_entry_t* stadt_t::factory_set_t::get_random_entry()
{
	if(  total_remaining>0  ) {
		sint32 weight = simrand(total_remaining);
		for(factory_entry_t & entry : entries) {
			if(  entry.remaining>0  ) {
				if(  weight<entry.remaining  ) {
					return &entry;
				}
				weight -= entry.remaining;
			}
		}
	}
	return NULL;
}
  • entriesはイベントキューみたいな感じなのかな。各建物に対する操作を保持して、処理する
/* delete things from a tile
 * citycars and pedestrian first and then go up to queue to more important objects
 */
bool tool_remover_t::tool_remover_intern(player_t *player, koord3d pos, sint8 type, const char *&msg)
  • 三次元座標はいい感じに抽象化されている
/**
 * 3D Coordinates
 */
class koord3d

関連