/*------------------------------------------------------------------------- * クライアントからの受信チェック * ---------------------------------------------------------------------------*/ private void do_receive_client() { // キャプチャ情報を受信したか調べる gvo_analized_data data = get_received_capture_data(); if (data == null) { if (m_capture_timer.GetSectionTimeMilliseconds() >= FROM_CLIENT_RECEIVE_TIME_OUT) { // 受信タイムアウト // 海上に居ないと判断する m_is_in_the_sea = false; // 到達予想をリセット reset_expect(); } return; } // 前回からの経過時間を得る int sectiontime = m_capture_timer.GetSectionTimeMilliseconds(); // 間隔測定リセット m_capture_timer.StartSection(); // 情報更新 update_myship_data(sectiontime, data); }
/*------------------------------------------------------------------------- * クライアントからの受信チェック * ---------------------------------------------------------------------------*/ private void do_receive_client() { // 캡처정보を受信したか조사 gvo_analized_data data = get_received_capture_data(); if (data == null) { if (m_capture_timer.GetSectionTimeMilliseconds() >= FROM_CLIENT_RECEIVE_TIME_OUT) { // 受信タイムアウト // 해상に居ないと判断する m_is_in_the_sea = false; // 도달예상を리셋 reset_expect(); } return; } // 前회からの경과시간を得る int sectiontime = m_capture_timer.GetSectionTimeMilliseconds(); // 간격測定리셋 m_capture_timer.StartSection(); // 정보업데이트 update_myship_data(sectiontime, data); }
/*------------------------------------------------------------------------- * * ---------------------------------------------------------------------------*/ private void init() { // コマンド受信ハンドラ base.ReceivedCommand += new ReceivedCommandEventHandler(received_command_handler); // 受信データ m_received_data = new gvo_analized_data(); m_sea_info = new List <gvo_map_cs_chat_base.sea_area_type>(); }
/*------------------------------------------------------------------------- * 受信情報を得る * キャプチャ関係の情報 * 海域変動はこのメソッド内で更新してしまう * ---------------------------------------------------------------------------*/ private gvo_analized_data get_received_capture_data() { gvo_tcp_client client = m_server_service.GetClient(); if (client == null) { return(null); } // 海域変動 gvo_map_cs_chat_base.sea_area_type[] sea_info = client.sea_info; // コピーを得る if (sea_info != null) { foreach (gvo_map_cs_chat_base.sea_area_type i in sea_info) { switch (i.type) { case gvo_map_cs_chat_base.sea_type.safty: m_db.SeaArea.SetType(i.name, sea_area.sea_area_once.sea_type.safty); break; case gvo_map_cs_chat_base.sea_type.lawless: m_db.SeaArea.SetType(i.name, sea_area.sea_area_once.sea_type.lawless); break; default: m_db.SeaArea.SetType(i.name, sea_area.sea_area_once.sea_type.normal); break; } } } gvo_analized_data data = client.capture_data; // コピーを得る // キャプチャ情報を受信していれば情報を返す if (data.capture_days_success || data.capture_success) { return(data); } // 情報を受信していない return(null); }
/*------------------------------------------------------------------------- * 自分の船の情報更新 * クライアントから受信した情報か自ら得た情報かは考慮されない * ---------------------------------------------------------------------------*/ private void update_myship_data(int sectiontime, gvo_analized_data data) { // if (data == null) { return; } // 航路記録なしならなにもしない if (!m_lib.setting.save_searoutes) { // 位置と角度は初期化する m_pos = new Point(-1, -1); m_is_in_the_sea = false; // 到達予想をリセット reset_expect(); return; } // 経過時間だけ追加 m_db.SpeedCalculator.AddIntervalOnly(sectiontime); // 造船開始と終了 // 同時にフラグが立った場合は終了を優先する if (data.is_start_build_ship) { m_db.BuildShipCounter.StartBuildShip(data.build_ship_name); } if (data.is_finish_build_ship) { m_db.BuildShipCounter.FinishBuildShip(); } // 日付キャプチャ成功なら利息からの日数を更新する if (data.capture_days_success) { // 利息からの日数を更新する m_db.InterestDays.Update(data.days, data.interest); // 造船日数を更新する m_db.BuildShipCounter.Update(data.days); } else { if (m_expect_delay_timer.GetSectionTimeMilliseconds() > OUT_OF_SEA_TIME_OUT) { // 海上ではない m_is_in_the_sea = false; // 到達予想をリセット reset_expect(); } // 日付キャプチャ失敗ならそれ以外の解析を行わない return; } // キャプチャが成功したかチェック if (!data.capture_success) { // 日付のみキャプチャ成功 m_is_draw_expect_pos = true; // 到達予想位置を描画する必要あり // ディレイタイマリセット m_expect_delay_timer.StartSection(); return; } // 自分の船の位置 m_pos = new Point(data.pos_x, data.pos_y); m_angle = data.angle; m_is_in_the_sea = true; // 海上 m_capture_sucess = true; // キャプチャ成功 // 測量位置を追加する // 位置によっては追加されない m_db.SeaRoute.AddPoint(m_pos, data.days, gvo_chat.ToIndex(data.accident)); // 速度算出 // 更新間隔はすでに設定済み m_db.SpeedCalculator.Add(m_pos, 0); // キャプチャ時は描画をスキップしない m_lib.device.SetMustDrawFlag(); // 到達位置予想用角度の更新 m_expect_vector = transform.ToVector2(gvo_capture.AngleToVector(m_angle)); // タイマリセット m_expect_pos_timer.StartSection(); m_expect_delay_timer.StartSection(); m_is_draw_expect_pos = false; // 解析できてるので予想位置を描画する必要がない }
/*------------------------------------------------------------------------- * 본인の배の정보업데이트 * クライアントから受信した정보か自ら得た정보かは考慮されない * ---------------------------------------------------------------------------*/ private void update_myship_data(int sectiontime, gvo_analized_data data) { // if (data == null) { return; } // 항로기록없음ならなにもしない if (!m_lib.setting.save_searoutes) { // 위치と각도は初期化する m_pos = new Point(-1, -1); m_is_in_the_sea = false; // 도달예상を리셋 reset_expect(); return; } // 경과시간だけ추가 m_db.SpeedCalculator.AddIntervalOnly(sectiontime); // 조선개시と종료 // 同時に플래그が立った場合は종료を優先する if (data.is_start_build_ship) { m_db.BuildShipCounter.StartBuildShip(data.build_ship_name); } if (data.is_finish_build_ship) { m_db.BuildShipCounter.FinishBuildShip(); } // 일付캡처成功なら이자からの일수を업데이트する if (data.capture_days_success) { // 이자からの일수を업데이트する m_db.InterestDays.Update(data.days, data.interest); // 조선일수を업데이트する m_db.BuildShipCounter.Update(data.days); } else { if (m_expect_delay_timer.GetSectionTimeMilliseconds() > OUT_OF_SEA_TIME_OUT) { // 해상ではない m_is_in_the_sea = false; // 도달예상を리셋 reset_expect(); } // 일付캡처실패ならそれ以외の분석を行わない return; } // 캡처が成功したかチェック if (!data.capture_success) { // 일付のみ캡처成功 m_is_draw_expect_pos = true; // 도달예상위치を그리기する必要あり // ディレイタイマ리셋 m_expect_delay_timer.StartSection(); return; } // 본인の배の위치 m_pos = new Point(data.pos_x, data.pos_y); m_angle = data.angle; m_is_in_the_sea = true; // 해상 m_capture_sucess = true; // 캡처成功 // 측량위치を추가する // 위치によっては추가されない m_db.SeaRoute.AddPoint(m_pos, data.days, gvo_chat.ToIndex(data.accident)); // 속도算出 // 업데이트간격はすでに설정済み m_db.SpeedCalculator.Add(m_pos, 0); // 캡처時は그리기を스킵しない m_lib.device.SetMustDrawFlag(); // 도달위치예상용각도の업데이트 m_expect_vector = transform.ToVector2(gvo_capture.AngleToVector(m_angle)); // タイマ리셋 m_expect_pos_timer.StartSection(); m_expect_delay_timer.StartSection(); m_is_draw_expect_pos = false; // 분석できてるので예상위치を그리기する必要がない }