// This may look like C code, but it is really -*- C++ -*-
// RTSS --- Railway Total System Simulator
// (c) TAKAGI Ryo (at Prof. SONE's Laboratory, the Univ. of Tokyo.)
// stnobj_s.hh --- class station_obj_stationstop_variation
// $Id: stnobj_s.hh,v 2.4 1994/12/27 11:49:38 rt Exp $

#include "globvar.hh"
#include "readdata.hh"
// #include "table.hh"
#include "enumerat.hh"
#include "matrix.hh"
#include "stnobj.hh"


#ifndef ___STNOBJ_S_HH
#define ___STNOBJ_S_HH		// こうしておくと2度インクルードしても大丈夫！

// 駅到着・出発間隔保証を主目的とする駅オブジェクトクラス
// 駅停車時分の fluctuation を行わせる拡張機能つき
class station_obj_stationstop_variation
: public station_obj {

  private:

    // readfile 用変数
    bool sw_rf_disturbance;	// disturbance コマンドを理解
    bool sw_disturbance_done;	// disturbance 終了
    bool sw_delay_comm_yet;	// delay_comm 未終了
    bool sw_disturb_control;	// 列車群制御を行う指示
    double tsim_distcomm;	// 通信を行う時刻

  protected:

    double d_init;	// 列車を遅らせる時間 disturbance コマンドでセット
    bool sw_disturb;	// この駅で列車を遅らせる
    control_disturbance_type cd_type;	// この駅で列車を遅らせる
    int control_station_object_number;	// この駅で列車に制御をかける
    double control_station_object_value;	// 制御量 [秒]
    double control_station_object_time;
			// 制御をかける瞬間（事故列車到着後 [秒]）
    const station_obj_stationstop_variation* control_stnobj_p;
			// 制御をかける対象となる station_obj へのポインタ
    double tarr_delay_add;	// tarr_delay で加える分
    double tdept_delay_add;	// tdept_delay で加える分
    int tdept_delay_add_imove;	// 上を加えるべき番線

  protected:

    // 拡張クラスのための readfile ユーティリティ
    void readfile_additional_readfile(FILE*, commandvalue);
    void readfile_additional_bool_set();
    bool readfile_additional_bool_eval();

    // 停車時分フラクチュエーションのための機構
    void stationstop_variation_func( from_station&, int );
    void stationstop_variation_func_delay( from_station&, int );
    void stationstop_variation_func_delay_core( from_station&, int );
    void stationstop_variation_delay_comm();

    void membercopy(const station_obj_stationstop_variation&);
				// メンバコピー

  public:

    station_obj_stationstop_variation();	// constructor
    station_obj_stationstop_variation
    (const station_obj_stationstop_variation&);	// constructor: X(X&)
    station_obj_stationstop_variation&
    operator=(const station_obj_stationstop_variation&);	// 代入演算子

    void set_stnobj_ssvar_p(const station_obj_stationstop_variation* x)
        {control_stnobj_p = x;}	// 制御対象をポインタでセット

    int control_target_stnobj() {return control_station_object_number;}
    double control_amount() {return control_station_object_value;}
    double control_time() {return control_station_object_time;}
    control_disturbance_type control_type() {return cd_type;}

    double tdept_delay(const train*) const;	// tdept_deley を返す
    double tarr_delay(const train*) const;	// tarr_deley を返す
    void this_train_will_depart(const train*) const;	// 列車出発告知
};

#endif /* ! ___STNOBJ_S_HH */
