[Tool] Wargame Automatation Script

DarkRyder
Corporal
Posts: 47
Joined: Fri 21 Nov 2014 17:20
Contact:

Re: [Tool] Wargame Automatation Script

Postby DarkRyder » Tue 7 Jun 2016 15:58

I have maneged to get somne free time to write the script.
Script finished, just needs a bit of testing, i will do this over a weekend
Now i'm working on my RCON so i can change script conf. file over RCON client.

After i test everything i will post script source here.


if anyone needs this is deck parser class in c#
it returns string array with nation, theme, date and side.
If you get null from any value in array deck string is false.
It will return error if deck is less then 3 char long, but i will handle that at input

Code: Select all

namespace RedDragonRCON
{
    class DeckParse
    {
        public static string[] ParseDeck(string deck)
        {
            string nation = null;
            string theme = null;
            string date = null;
            string side = null;

            char char1 = deck[0];
            char char2 = deck[1];
            char char3 = deck[2];

            switch (char3)
            {
                case 'A':
                    date = "1980";
                    break;
                case 'Q':
                    date = "1985";
                    break;
                default:
                    date = "1990";
                    break;
            }

            switch (char1)
            {
                case 't':
                    nation = "RED";
                    side = "REDFOR";
                    theme = ParseTheme(char2);
                    break;
                case 'j':
                    nation = "USSR";
                    side = "REDFOR";
                    theme = ParseTheme(char2);
                    break;
                case 'h':
                    nation = "DDR";
                    side = "REDFOR";
                    theme = ParseTheme(char2);
                    break;
                case 'l':
                    nation = "POL";
                    side = "REDFOR";
                    theme = ParseTheme(char2);
                    break;
                case 'n':
                    nation = "CZE";
                    side = "REDFOR";
                    theme = ParseTheme(char2);
                    break;
                case 'p':
                    nation = "PRC";
                    side = "REDFOR";
                    theme = ParseTheme(char2);
                    break;
                case 'r':
                    nation = "NK";
                    side = "REDFOR";
                    theme = ParseTheme(char2);
                    break;
                case 'B':
                    nation = "USA";
                    side = "BLUEFOR";
                    theme = ParseTheme(char2);
                    break;
                case 'D':
                    nation = "UK";
                    side = "BLUEFOR";
                    theme = ParseTheme(char2);
                    break;
                case 'F':
                    nation = "FR";
                    side = "BLUEFOR";
                    theme = ParseTheme(char2);
                    break;
                case 'H':
                    nation = "GER";
                    side = "BLUEFOR";
                    theme = ParseTheme(char2);
                    break;
                case 'J':
                    nation = "CAD";
                    side = "BLUEFOR";
                    theme = ParseTheme(char2);
                    break;
                case 'L':
                    nation = "DEN";
                    side = "BLUEFOR";
                    theme = ParseTheme(char2);
                    break;
                case 'N':
                    nation = "SWE";
                    side = "BLUEFOR";
                    theme = ParseTheme(char2);
                    break;
                case 'P':
                    nation = "NOR";
                    side = "BLUEFOR";
                    theme = ParseTheme(char2);
                    break;
                case 'R':
                    nation = "ANZAC";
                    side = "BLUEFOR";
                    theme = ParseTheme(char2);
                    break;
                case 'T':
                    nation = "JAP";
                    side = "BLUEFOR";
                    theme = ParseTheme(char2);
                    break;
                case 'V':
                    nation = "KOR";
                    side = "BLUEFOR";
                    theme = ParseTheme(char2);
                    break;
                case 's':
                    side = "REDFOR";

                    switch (char2)
                    {
                        case 'v':
                            nation = "EB";
                            theme = "All";
                            break;
                        case 'o':
                            nation = "EB";
                            theme = "Motorized";
                            break;
                        case 'p':
                            nation = "EB";
                            theme = "Armored";
                            break;
                        case 'q':
                            nation = "EB";
                            theme = "Support";
                            break;
                        case 'r':
                            nation = "EB";
                            theme = "Marines";
                            break;
                        case 's':
                            nation = "EB";
                            theme = "Machanized";
                            break;
                        case 't':
                            nation = "EB";
                            theme = "Airborne";
                            break;

                        case 'n':
                            nation = "RD";
                            theme = "All";
                            break;
                        case 'g':
                            nation = "RD";
                            theme = "Motorized";
                            break;
                        case 'h':
                            nation = "RD";
                            theme = "Armored";
                            break;
                        case 'i':
                            nation = "RD";
                            theme = "Support";
                            break;
                        case 'j':
                            nation = "RD";
                            theme = "Marines";
                            break;
                        case 'k':
                            nation = "RD";
                            theme = "Machanized";
                            break;
                        case 'l':
                            nation = "RD";
                            theme = "Airborne";
                            break;

                        case '/':
                            nation = "SK";
                            theme = "All";
                            break;
                        case '4':
                            nation = "SK";
                            theme = "Motorized";
                            break;
                        case '5':
                            nation = "SK";
                            theme = "Armored";
                            break;
                        case '6':
                            nation = "SK";
                            theme = "Support";
                            break;
                        case '7':
                            nation = "SK";
                            theme = "Marines";
                            break;
                        case '8':
                            nation = "SK";
                            theme = "Machanized";
                            break;
                        case '9':
                            nation = "SK";
                            theme = "Airborne";
                            break;
                    }
                    break;

                case 'X':
                    side = "BLUEFOR";

                    switch (char2)
                    {
                        case 'P':
                            nation = "BLUE";
                            theme = "All";
                            break;
                        case 'O':
                            nation = "BLUE";
                            theme = "Navy";
                            break;
                        case 'H':
                            nation = "NORAD";
                            theme = "All";
                            break;
                        case 'A':
                            nation = "NORAD";
                            theme = "Motorized";
                            break;
                        case 'B':
                            nation = "NORAD";
                            theme = "Armored";
                            break;
                        case 'C':
                            nation = "NORAD";
                            theme = "Support";
                            break;
                        case 'D':
                            nation = "NORAD";
                            theme = "Marines";
                            break;
                        case 'E':
                            nation = "NORAD";
                            theme = "Machanized";
                            break;
                        case 'F':
                            nation = "NORAD";
                            theme = "Airborne";
                            break;

                        case 'X':
                            nation = "NDL";
                            theme = "All";
                            break;
                        case 'Q':
                            nation = "NDL";
                            theme = "Motorized";
                            break;
                        case 'R':
                            nation = "NDL";
                            theme = "Armored";
                            break;
                        case 'S':
                            nation = "NDL";
                            theme = "Support";
                            break;
                        case 'U':
                            nation = "NDL";
                            theme = "Machanized";
                            break;
                    }
                    break;
                case 'Z':
                    side = "BLUEFOR";

                    switch (char2)
                    {
                        case 'P':
                            nation = "NDLGER";
                            theme = "All";
                            break;
                        case 'I':
                            nation = "NDLGER";
                            theme = "Motorized";
                            break;
                        case 'J':
                            nation = "NDLGER";
                            theme = "Armored";
                            break;
                        case 'K':
                            nation = "NDLGER";
                            theme = "Support";
                            break;
                        case 'M':
                            nation = "NDLGER";
                            theme = "Machanized";
                            break;
                    }
                    break;

                case 'W':
                    side = "BLUEFOR";

                    switch (char2)
                    {
                        case 'H':
                            nation = "EURO";
                            theme = "All";
                            break;
                        case 'A':
                            nation = "EURO";
                            theme = "Motorized";
                            break;
                        case 'B':
                            nation = "EURO";
                            theme = "Armored";
                            break;
                        case 'C':
                            nation = "EURO";
                            theme = "Support";
                            break;
                        case 'D':
                            nation = "EURO";
                            theme = "Marines";
                            break;
                        case 'E':
                            nation = "EURO";
                            theme = "Machanized";
                            break;
                        case 'F':
                            nation = "EURO";
                            theme = "Airborne";
                            break;

                        case 'P':
                            nation = "SCAN";
                            theme = "All";
                            break;
                        case 'I':
                            nation = "SCAN";
                            theme = "Motorized";
                            break;
                        case 'J':
                            nation = "SCAN";
                            theme = "Armored";
                            break;
                        case 'K':
                            nation = "SCAN";
                            theme = "Support";
                            break;
                        case 'L':
                            nation = "SCAN";
                            theme = "Marines";
                            break;
                        case 'M':
                            nation = "SCAN";
                            theme = "Machanized";
                            break;
                        case 'N':
                            nation = "SCAN";
                            theme = "Airborne";
                            break;

                        case 'X':
                            nation = "COM";
                            theme = "All";
                            break;
                        case 'Q':
                            nation = "COM";
                            theme = "Motorized";
                            break;
                        case 'R':
                            nation = "COM";
                            theme = "Armored";
                            break;
                        case 'S':
                            nation = "COM";
                            theme = "Support";
                            break;
                        case 'T':
                            nation = "COM";
                            theme = "Marines";
                            break;
                        case 'U':
                            nation = "COM";
                            theme = "Machanized";
                            break;
                        case 'V':
                            nation = "COM";
                            theme = "Airborne";
                            break;

                        case 'f':
                            nation = "BD";
                            theme = "All";
                            break;
                        case 'Y':
                            nation = "BD";
                            theme = "Motorized";
                            break;
                        case 'Z':
                            nation = "BD";
                            theme = "Armored";
                            break;
                        case 'a':
                            nation = "BD";
                            theme = "Support";
                            break;
                        case 'b':
                            nation = "BD";
                            theme = "Marines";
                            break;
                        case 'c':
                            nation = "BD";
                            theme = "Machanized";
                            break;
                        case 'd':
                            nation = "BD";
                            theme = "Airborne";
                            break;

                        case '3':
                            nation = "LANDJUT";
                            theme = "All";
                            break;
                        case 'w':
                            nation = "LANDJUT";
                            theme = "Motorized";
                            break;
                        case 'x':
                            nation = "LANDJUT";
                            theme = "Armored";
                            break;
                        case 'y':
                            nation = "LANDJUT";
                            theme = "Support";
                            break;
                        case '0':
                            nation = "LANDJUT";
                            theme = "Machanized";
                            break;
                        case '1':
                            nation = "LANDJUT";
                            theme = "Airborne";
                            break;
                    }

                    break;

            }


            string[] result = { nation, theme, date, side };
            return result;
        }

        private static string ParseTheme(char char2)
        {
            string theme = "";

            switch (char2)
            {
                case 'O':
                    theme = "Navy";
                    break;
                case 'P':
                    theme = "All";
                    break;
                case 'I':
                    theme = "Motorized";
                    break;
                case 'J':
                    theme = "Armored";
                    break;
                case 'K':
                    theme = "Support";
                    break;
                case 'L':
                    theme = "Marines";
                    break;
                case 'M':
                    theme = "Machanized";
                    break;
                case 'N':
                    theme = "Airborne";
                    break;
            }


            return theme;
        }
    }
}

al_102
Specialist
Posts: 19
Joined: Wed 23 Mar 2016 13:49
Contact:

Re: [Tool] Wargame Automatation Script

Postby al_102 » Wed 8 Jun 2016 00:22

Hi DarkRyder
Looks like Eugens changed some deck codes - i think after DLC - so for example Norad Sup now ZC not XC. I faced it while writing script. We just have checked all decks - so if u need i can share.

DarkRyder
Corporal
Posts: 47
Joined: Fri 21 Nov 2014 17:20
Contact:

Re: [Tool] Wargame Automatation Script

Postby DarkRyder » Wed 8 Jun 2016 21:35

Yes, if you could post it it would be cool.

Could we get to some agreement about rcon commands for changing scripts configs?

al_102
Specialist
Posts: 19
Joined: Wed 23 Mar 2016 13:49
Contact:

Re: [Tool] Wargame Automatation Script

Postby al_102 » Wed 8 Jun 2016 23:12

Here is decks.
https://docs.google.com/spreadsheets/d/ ... sp=sharing

Could we get to some agreement about rcon commands for changing scripts configs?

What do u mean?

DarkRyder
Corporal
Posts: 47
Joined: Fri 21 Nov 2014 17:20
Contact:

Re: [Tool] Wargame Automatation Script

Postby DarkRyder » Thu 9 Jun 2016 09:57

Thx

My guess is that you are writing script for wargame server?

It will run server side and it will control min/max level, decks, map rotation and so on.
But to change script settings you need to edit cfg file or something like that.
My idea is to change script settings using RCON tool.

al_102
Specialist
Posts: 19
Joined: Wed 23 Mar 2016 13:49
Contact:

Re: [Tool] Wargame Automatation Script

Postby al_102 » Thu 9 Jun 2016 13:18

My idea is to change script settings using RCON tool.

Too advanced for me. I change scripts directly at server or at simple php page. Rcon way is cool - if u make it i will use :)
And one tip about serverlog - when player connects and placed by default in Blue team there wont be string "variable PlayerAlliance set to 0" in serverlog.txt so u should set it manually for this player. I had some problems when faced it :D

DarkRyder
Corporal
Posts: 47
Joined: Fri 21 Nov 2014 17:20
Contact:

Re: [Tool] Wargame Automatation Script

Postby DarkRyder » Thu 9 Jun 2016 14:19

setsvar change.maps['Destruction_5x3_Marine_1_small_Terrestre', 'Destruction_2x3_Tohoku', 'Destruction_2x2_port_Wonsan_Terrestre', 'Destruction_4x4_ThreeMileIsland', 'Destruction_5x3_Asgard_10v10']

Try to send this custom command via RCON tool and see what happens in serverlog.txt, you will see it's there so you just parse it in your script and settings changed.... simple

server will accept it because it has setsvar in front of text, but it will not act on it.

al_102
Specialist
Posts: 19
Joined: Wed 23 Mar 2016 13:49
Contact:

Re: [Tool] Wargame Automatation Script

Postby al_102 » Thu 9 Jun 2016 16:36

Cool - i didnt think to do it this way.
Btw do u use topicstarters sciprt or u wrote ur own? Can script define if game in progress or in lobby now and if game in progress - separate players - who is in game now and who just joined "busy" server? I need it for some purposes and mb u have solution

DarkRyder
Corporal
Posts: 47
Joined: Fri 21 Nov 2014 17:20
Contact:

Re: [Tool] Wargame Automatation Script

Postby DarkRyder » Thu 9 Jun 2016 20:03

Yes i'm using topic script, you have it here:

Code: Select all

# ----------------------------------------------------------------------------------------------------------------------
# --------------------------------------- INTERNAL IMPLEMENTATION DETAILS ----------------------------------------------
# ----------------------------------------------------------------------------------------------------------------------

    # -------------------------------------------
    # Service event handlers
    # -------------------------------------------

    def _on_player_connect(self, match_obj):

        playerid = match_obj.group(1)
        # Creating player data structure if not present
        if not (playerid in self.players):
            self.players[playerid] = Player(playerid)

        if not self.infoRun:
            self.on_player_connect(playerid)

    # ----------------------------------------------
    def _on_player_deck_set(self, match_obj):

        playerid = match_obj.group(1)
        playerdeck = match_obj.group(2)

        self.players[playerid].set_deck(playerdeck)

        if not self.infoRun:
            self.on_player_deck_set(playerid, playerdeck)

    # ----------------------------------------------
    def _on_player_level_set(self, match_obj):

        playerid = match_obj.group(1)
        playerlevel = match_obj.group(2)

        self.players[playerid].set_level(int(playerlevel))

        if not self.infoRun:
            self.on_player_level_set(playerid, int(playerlevel))

    # ----------------------------------------------
    def _on_player_elo_set(self, match_obj):

        playerid = match_obj.group(1)
        playerelo = match_obj.group(2)

        self.players[playerid].set_elo(float(playerelo))

        if not self.infoRun:
            self.on_player_elo_set(playerid, playerelo)

    # ----------------------------------------------
    def _on_player_disconnect(self, match_obj):

        playerid = match_obj.group(1)

        if not self.infoRun:
            self.on_player_disconnect(playerid)

        del self.players[playerid]

    # ----------------------------------------------
    def _on_player_side_change(self, match_obj):

        playerid = match_obj.group(1)
        playerside = match_obj.group(2)
        self.players[playerid].set_side(Side.Redfor if playerside == '1' else Side.Bluefor)

        if not self.infoRun:
            self.on_player_side_change(playerid, playerside)

    # ----------------------------------------------
    def _on_player_name_change(self, match_obj):

        playerid = match_obj.group(1)
        playername = match_obj.group(2)
        self.players[playerid].set_name(playername)

        if not self.infoRun:
            self.on_player_name_change(playerid, playername)

    # ----------------------------------------------
    def _on_switch_to_game(self, match_obj):
        self.gameState = GameState.Game

        if not self.infoRun:
            self.on_switch_to_game()

    # ----------------------------------------------
    def _on_switch_to_debriefing(self, match_obj):
        self.gameState = GameState.Debriefing

        if not self.infoRun:
            self.on_switch_to_debriefing()

    # ----------------------------------------------
    def _on_switch_to_lobby(self, match_obj):
        self.gameState = GameState.Lobby
       
        if not self.infoRun:
            self.on_switch_to_lobby()
           
# ----------------------------------------------
    def _on_switch_to_countdown(self, match_obj):
        self.gameState = GameState.Countdown

        if not self.infoRun:
            self.on_switch_to_countdown()


    # ---------------------------------------------
    # Event handlers registration
    # ---------------------------------------------

    def register_events(self):
        self.register_event('Client added in session \(EugNetId : ([0-9]+)', self._on_player_connect)
        self.register_event('Client ([0-9]+) variable PlayerDeckContent set to "(.*)"', self._on_player_deck_set)
        self.register_event('Client ([0-9]+) variable PlayerLevel set to "(.*)"', self._on_player_level_set)
        self.register_event('Client ([0-9]+) variable PlayerElo set to "(.*)"', self._on_player_elo_set)
        self.register_event('Client ([0-9]+) variable PlayerAlliance set to "([0-9])"', self._on_player_side_change)
        self.register_event('Client ([0-9]+) variable PlayerName set to "(.*)"', self._on_player_name_change)
        self.register_event('Disconnecting client ([0-9]+)', self._on_player_disconnect)
        self.register_event('Entering in loading phase state', self._on_switch_to_game)
        self.register_event('Entering in debriephing phase state', self._on_switch_to_debriefing)
        self.register_event('Entering in matchmaking state', self._on_switch_to_lobby)
        self.register_event('Launch game', self._on_switch_to_countdown)
        self.register_event('Canceling launch game', self._on_switch_to_lobby)


And this is the same logic i'm using to parse RCON commands to change script config.

For the other question you could.. yes...
Script should read setsvar WarmupCountdown ?

And put it in global variables (i use global variables), and then trigger timer for ? secunds when you get self.register_event('Launch game', self._on_switch_to_countdown)
If there is no Canceling launch game in this time you could switch to "game running" state
after that you have debriefing state and matchmaking state where players are in lobby waiting for a new game.
So if players join during "game running" state and "debriefing" state you could flag them with simple if statement
I use
self.register_event('Launch game', self._on_switch_to_countdown) for randomising teams
and
self.register_event('Entering in debriephing phase state', self._on_switch_to_debriefing) for map rotation change

EDIT: When you think about it a bit more, there is no way that somebody joins at "switch to countdown" state, so you could just mark it as running game, without the need for stupid timer. People can just leave during this state, ad if they leave before game starts server will return to lobby state, or after game ends to debriefing

al_102
Specialist
Posts: 19
Joined: Wed 23 Mar 2016 13:49
Contact:

Re: [Tool] Wargame Automatation Script

Postby al_102 » Fri 10 Jun 2016 00:54

Thx - i think i got it but need to digest. I wrote my own scripts cuz this too dificult for me - im not pro programmer. One thing - if i understood ur EDIT right - player can join during countdown if server set to start game with 19 players - like Eugenes servers, but i dont think its big problem.
And once i faced that if server crashs during the game there will no "debrieph phase" in serverlog but it happens seldom i hope

One more question - did u try change deck names by rcon? Did it work? Im almost sure i succeded once - but now it doesnt work( It can be useful for short messaging players (or is it possible to write message to the chat from server?) - for example - we started server with only France vs UK - so it will be good to tell players that they can change to their decks instead of using default deck. We have this info in the server's name but not everybody read it :D and if the name of deck will be !!CHANGE!! much more players will notice. Ofc players name can be used (running ticker :D ) but its a bit tough.

Who is online

Users browsing this forum: No registered users and 1 guest