Create account / Log in

Invoking Vengine.jar from another program

Discussion area for the development team.

Moderators: uckelman, Tim M

Invoking Vengine.jar from another program

Postby pacman-ghost » December 19th, 2018, 4:12 pm


If you're not already aware, I've written a program to create HTML labels for VASL scenarios, that's lets you create things like this:

Discussion at Game Squad is here.

I've recently added a feature that takes the scenario details the user entered into my program, and invokes Vengine.jar to automatically create labels in a .vsav file (or update them if they're already there).

A couple of things came up during the development of this...

(*) While calling GameModule.getGameModule().getGameState().decodeSavedGame() loads a .vsav file sufficiently for me to look at what's in it (by traversing the Command tree), to be able to make changes to it, I need to execute the Command returned. However, this causes the UI to sometimes come up. I never see it in the Fedora VM I use for development, but it always comes up on Windows, so I imagine there's a race condition between the UI starting up and my making changes to the game state and saving it out. The UI actually crashes, presumably because I haven't initialized something, but as long as I manage to successfully make my changes and save them, I consider things to have worked.

So... is there any way to load a saved game, in such a way that I can make changes to it, without the UI coming up?

(*) To save a game, I would like to call GameState.saveGame(), but it calls getRestoreCommand(), which does nothing unless the saveGame action has been enabled :-( There doesn't seem to be any way for me to get access to this object, due to Java access protections, so I had to reimplement the whole of getRestoreCommand(), and every other function it calls, with this check disabled.

Is there any chance you could add a getter for GameState.saveGame, so that I can just enable it, and then a call to GameState.saveGame() would Just Work (tm)...?

(*) While things seem to work, I'm a little concerned that the .vsav file I'm writing out is borked in some way because I haven't done things properly. It would be very mch appreciated if someone could comment on my approach...

(-) Instantiate a ModuleManagerMenuManager (it seems to be needed to load VASL).

(-) Load the VASL module:
Code: Select all
DataArchive dataArchive = new DataArchive( vmodFilename ) ;
BasicModule basicModule = new BasicModule( dataArchive ) ;
GameModule.init( basicModule ) ;

(-) Configure where the boards are:
Code: Select all
Prefs prefs = GameModule.getGameModule().getPrefs() ;
String BOARD_DIR = "boardURL" ;
prefs.setValue( BOARD_DIR, new File(boardsDir) ) ;

(-) Load the scenario:
Code: Select all
Command cmd = GameModule.getGameModule().getGameState().decodeSavedGame(
     new File( scenarioFilename )
) ;
cmd.execute() ;

(-) Look for existing labels by checking the Command and its children (via getSubCommands()), that meet the following requirements:
- must be an instance of AddPiece
- whose target is an instance of DynamicProperty
It's state field is split into its component fields, using "\\+\t" as a separator, and we take fields #3 and #4 as the label fields.

(-) To add new labels, I iterate over all the PieceSlot's using:
Code: Select all
GameModule.getGameModule().getAllDescendantComponentsOf( PieceSlot.class )
and look for one with GPID 6295.

I create a GamePiece, by calling PieceSlot.getPiece(), then expand the piece:
Code: Select all
gamePiece = PieceCloner.getInstance().clonePiece( gamePiece ) ;
I get the GamePiece's state by calling getState(), replace the default values with the content I want to appear in the label, and then insert it into the GamePiece by calling setState().

(-) To update an existing label, I do something similar to the above, but using the label's existing GamePiece object.

(-) To delete a label, I create a RemovePiece object, using the label's existing GamePiece object, and execute it.

Is this approach valid? Is it going to cause problems for peoples' scenarios down the road...?
Posts: 2
Joined: December 12th, 2018, 11:40 am

Return to Developers

Who is online

Users browsing this forum: No registered users and 3 guests