The Battle for Wesnoth 1.21.0-dev
 
Loading...
Searching...
No Matches
testing.cpp
Go to the documentation of this file.
1/*
2 Copyright (C) 2009 - 2025
3 by Yurii Chernyi <terraninfo@terraninfo.net>
4 Part of the Battle for Wesnoth Project https://www.wesnoth.org/
5
6 This program is free software; you can redistribute it and/or modify
7 it under the terms of the GNU General Public License as published by
8 the Free Software Foundation; either version 2 of the License, or
9 (at your option) any later version.
10 This program is distributed in the hope that it will be useful,
11 but WITHOUT ANY WARRANTY.
12
13 See the COPYING file for more details.
14*/
15
16/**
17 * Gather statistics important for AI testing and output them
18 * @file
19 */
20#include "ai/manager.hpp"
21#include "ai/testing.hpp"
22#include "log.hpp"
23#include "game_board.hpp"
24#include "replay.hpp"
25#include "resources.hpp"
26#include "team.hpp"
27#include "tod_manager.hpp"
28#include "game_version.hpp"
29
30static lg::log_domain log_ai_testing("ai/testing");
31#define DBG_AI_TESTING LOG_STREAM(debug, log_ai_testing)
32#define LOG_AI_TESTING LOG_STREAM(info, log_ai_testing)
33#define ERR_AI_TESTING LOG_STREAM(err, log_ai_testing)
34
35void ai_testing::log_turn_start(unsigned int side)
36{
37 log_turn("TURN_START",side);
38}
39
40void ai_testing::log_turn_end(unsigned int side)
41{
42 log_turn("TURN_END",side);
43}
44
45void ai_testing::log_turn(const char* msg, unsigned int side)
46{
47 assert(side>=1);
48 team& current_team = resources::gameboard->get_team(side);
49
50 int _turn_number = resources::tod_manager->turn();
51 int _units = resources::gameboard->side_units(side);
52 int _units_cost = resources::gameboard->side_units_cost(side);
53 int _gold = current_team.gold();
54 int _villages = current_team.villages().size();
55 int _income = current_team.total_income();
56
57 DBG_AI_TESTING << msg << side << ": " << _turn_number;
58 DBG_AI_TESTING << msg << "_UNITS " << side << ": " << _units;
59 DBG_AI_TESTING << msg << "_UNITS_COST " << side << ": " << _units_cost;
60 DBG_AI_TESTING << msg << "_GOLD " << side << ": " << _gold;
61 DBG_AI_TESTING << msg << "_VILLAGES " << side << ": " << _villages;
62 DBG_AI_TESTING << msg << "_INCOME " << side << ": " << _income;
63
64 config c;
65 c["side"] = static_cast<int>(side);
66 c["turn"] = _turn_number;
67 c["event"] = msg;
68 c["units"] = _units;
69 c["units_cost"] = _units_cost;
70 c["gold"] = _gold;
71 c["villages"] = _villages;
72 resources::recorder->add_log_data("ai_log","turn_info",c);
73}
74
76{
77 LOG_AI_TESTING << "DRAW:";
78 resources::recorder->add_log_data("ai_log","result","draw");
79}
80
81void ai_testing::log_victory(const std::set<unsigned int>& winners)
82{
83 resources::recorder->add_log_data("ai_log","result","victory");
84 for(std::set<unsigned int>::const_iterator w = winners.begin(); w != winners.end(); ++w) {
85 LOG_AI_TESTING << "WINNER: "<< *w;
86 resources::recorder->add_log_data("ai_log","winner",std::to_string(*w));
87 }
88}
89
91{
92 for(const team& tm : resources::gameboard->teams()) {
93 int side = tm.side();
94 LOG_AI_TESTING << "AI_IDENTIFIER " << side << ": " << ai::manager::get_singleton().get_active_ai_identifier_for_side(side);
95 resources::recorder->add_log_data("ai_log", "ai_id" + std::to_string(side), ai::manager::get_singleton().get_active_ai_identifier_for_side(side));
96 }
97 LOG_AI_TESTING << "VERSION: " << game_config::revision;
99}
100
102{
103 LOG_AI_TESTING << "GAME_END_TURN: "<< resources::tod_manager->turn();
104 resources::recorder->add_log_data("ai_log","end_turn",
105 std::to_string(resources::tod_manager->turn()));
106 for(const team& tm : resources::gameboard->teams()) {
107 int side = tm.side();
108 resources::recorder->add_log_data("ai_log","end_gold"+std::to_string(side),std::to_string(tm.gold()));
109 resources::recorder->add_log_data("ai_log","end_units"+std::to_string(side),std::to_string(resources::gameboard->side_units(side)));
110 }
111}
Managing the AIs lifecycle - headers TODO: Refactor history handling and internal commands.
static manager & get_singleton()
Definition manager.hpp:140
std::string get_active_ai_identifier_for_side(side_number side)
Gets AI algorithm identifier for active AI of the given side.
Definition manager.cpp:542
static void log_turn_end(unsigned int side)
Definition testing.cpp:40
static void log_victory(const std::set< unsigned int > &teams)
Definition testing.cpp:81
static void log_game_end()
Definition testing.cpp:101
static void log_turn(const char *msg, unsigned int side)
Definition testing.cpp:45
static void log_draw()
Definition testing.cpp:75
static void log_game_start()
Definition testing.cpp:90
static void log_turn_start(unsigned int side)
Definition testing.cpp:35
A config object defines a single node in a WML file, with access to child nodes.
Definition config.hpp:157
int side_units(int side_num) const
Returns the number of units of the side side_num.
int side_units_cost(int side_num) const
Returns the total cost of units of side side_num.
virtual const std::vector< team > & teams() const override
team & get_team(int i)
void add_log_data(const std::string &key, const std::string &var)
Definition replay.cpp:298
This class stores all the data for a single 'side' (in game nomenclature).
Definition team.hpp:74
int gold() const
Definition team.hpp:183
const std::set< map_location > & villages() const
Definition team.hpp:178
int total_income() const
Definition team.hpp:201
int turn() const
Interfaces for manipulating version numbers of engine, add-ons, etc.
Standard logging facilities (interface).
const std::string revision
::tod_manager * tod_manager
Definition resources.cpp:29
game_board * gameboard
Definition resources.cpp:20
replay * recorder
Definition resources.cpp:28
int w
Definition pathfind.cpp:188
Replay control code.
#define DBG_AI_TESTING
Definition testing.cpp:31
#define LOG_AI_TESTING
Definition testing.cpp:32
static lg::log_domain log_ai_testing("ai/testing")
Gather statistics important for AI testing and output them.
#define c