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