public void Reset(string hearthstone_path) { game_state_ = new State.Game(); this.stable_decider_ = new StableDecider(100); // 100 ms this.log_reader = new LogReader(hearthstone_path, game_state_, logger_); this.log_reader.StartWaitingMainActionEvent += StartWaitingMainAction; this.log_reader.BlockStart += (sender, e) => { game_state_.NotifyBlockStarted(e.entity_id, e.block_type); if (this.BlockStart != null) { this.BlockStart(this, new BlockStartEventArgs(e, game_state_)); } }; this.log_reader.BlockEnd += (sender, e) => { game_state_.NotifyBlockEnded(e.entity_id, e.block_type, logger_); if (e.block_type == "PLAY") { AnalyzePlayHandCardAction(e.entity_id); } if (this.BlockEnd != null) { this.BlockEnd(this, new BlockEndEventArgs(e, game_state_)); } }; this.log_reader.CreateGameEvent += (sender, e) => { // if game is auto-restarted, we don't want to reset the game info // because this loses the player/opponent's entity id game_state_.SoftReset(); CreateGameEvent(sender, e); }; this.log_reader.log_changed = () => { stable_decider_.Changed(); }; this.log_reader.EntityTagChanged += (sender, e) => { game_state_.NotifyEntityTagChanged(e.current.Id, e.prev, logger_); }; game_state_.EndTurnEvent += (sender, e) => { if (this.EndTurnEvent != null) { this.EndTurnEvent(this, new EndTurnEventArgs(e, game_state_)); } }; }