Skip to content

danielholmes/bga-workbench

Repository files navigation

BoardGameArena Workbench

Build Latest Stable Version

A set of tools to work with BoardGameArena projects.

Installation

Via composer:

composer require --dev dholmes/bga-workbench

Via Docker:

docker build -t bgawb .
alias bgawb="docker run --rm -v $PWD:/data -w /data bgawb"

(this last line should be set in your ~/.bashrc to keep the alias working in a new terminal)

To set up your project to work with BGA Workbench you need to have a bgaproject.yml file in the root. To generate one see the bgawb init command.

Initialise BGA Project

Once you've installed bgawb you can run the below command to interactively create a bgaproject.yml file in your current directory.

bgawb init

Deploying to BGA Studio

bgawb build --deploy

Continuous Deployment to Studio

Watches development files and deploys them as they change.

bgawb build --deploy --watch

Compiling composer projects

The Board Game Arena production framework/environment doesn't natively support a Composer project setup. By having useComposer: true set in your bgaproject.yml file, the [bgawb build](Deploying to BGA Studio) command will merge all non-dev composer dependencies inline into your .game.php file before deploying.

Testing Utilities

Some testing utilities are provided to help test various parts of a standard BGA project game.

The Validate Command

Will run some basic checks on your project setup. e.g. whether you have the required files to function on the BGA platform (.game.php, .action.php, etc), whether your states.inc.php file is valid, etc.

bgawb validate

PHPUnit TestHelp trait

Including this trait and implementing the createGameTableInstanceBuilder method will set up and tear down a game table instance for each test that is run. Note that this makes use of the setUp and tearDown PHPUnit hooks

<?php

namespace Game\Tests;

use PHPUnit\Framework\TestCase;
use BGAWorkbench\Test\TestHelp;
use Doctrine\DBAL\Connection;
use BGAWorkbench\Utils;

class ChooseAttackTest extends TestCase
{
    use TestHelp;
    
    protected function createGameTableInstanceBuilder() : TableInstanceBuilder
    {
        return $this->gameTableInstanceBuilder()
            ->setPlayersWithIds([66, 77])
            ->overridePlayersPostSetup([
                66 => ['player_color' => 'ff0000'],
                77 => ['player_color' => '00ff00']
            ]);
    }
    
    public function testAction()
    {
        $action = $this->table
            ->setupNewGame()
            ->withDbConnection(function (Connection $db) {
                $db->exec('INSERT battlefield_card (player_id, type, x, y) VALUES (' .
                    join('), (', [
                        [77, '"infantry"', 0, -1],  
                        [66, '"infantry"', 0, 1],  
                        [66, '"artillery"', 6, 1],  
                    ])
                . ')');
            })
            ->createActionInstanceForCurrentPlayer(66)
            ->stubActivePlayerId(66)
            ->stubArgs(['x' => 5, 'y' => 5]);

        $action->chooseAttack();
        
        // TODO: Run some asserts on the db
    }
    
    public function testStateFunc()
    {
        $game = $this->table
            ->setupNewGame()
            ->createGameInstanceWithNoBoundedPlayer()
            ->stubActivePlayerId(66);
        
        $game->stNextPlayer();
    }
    
    public function testGetAllDatas()
    {
        $game = $this->table
            ->setupNewGame()
            ->withDbConnection(function (Connection $db) {
                $db->exec('DELETE FROM deck_card');
                $db->exec('DELETE FROM playable_card');
                $db->exec('INSERT INTO battlefield_card (player_id, type, x, y) VALUES (66, "tank", 0, 2)');
                $db->executeUpdate('UPDATE player SET player_score_aux = 1 WHERE player_id = 66');
            })
            ->createGameInstanceForCurrentPlayer(66);

        $datas = Utils::callProtectedMethod($game, 'getAllDatas');
        
        // TODO: Some asserts on $datas
    }
}

Projects Using BGA Workbench

Development

i.e. if you want to make some changes to the BGA Workbench project. This is not required for using the library in your own project.

Requirements

Setting up Developer Machine

vagrant up

Running Tests

vagrant ssh
composer test

Publishing a New Version

  1. Add a release/tag on github with the version number.
  2. Go to the packagist url and click "Update": https://packagist.org/packages/dholmes/bga-workbench. This should be done automatically though if just left.