Really noob question

I’m new to programming and I’m gone through the tutorials for using git, Intellij and creating custom classes. I was able to build and include the tutorial MyChatter class successfully, but it is kind of painful to change a line of code, having to rebuilt it, bring it into the zip file and loading the module just to test a subtle change. Is there a way to set a working environment in which my change can be tested from within Intellij or in which I can directly build inside the module?

Sure,

Just create a Run/Debug configuration and run Vassal in the debugger directly in IntelliJ. This following screen sets up a Config that runs the Editor over a module

image

I have seen those screenshots on the introduction to Intellij, but couldn’t make much sense of it. If we consider the MyChatter class, for instance, do I keep it open in a separate project to make changes and just run the vassal project with these debug configuration in a separate project? Can I change the class inside the module directly? I see a reference to the module in the picture, but nothing pointing to the project containing the class. How do we make the changes to the class reflect immediately in the module, without having to build and place the class inside the zip file?

I’m sorry if those are really very basic questions, but I’m kind of learning to use an IDE’s functionalities while trying to learn how to develop a module.

Yes, that is the best way,

I see a reference to the module in the picture, but nothing pointing to the project containing the class. How do we make the changes to the class reflect immediately in the module, without having to build and place the class inside the zip file?

When you run or debug within Intellij, any sources within Intellij will be used in preference to classes in the buildfile. Once you have modified the buildfile to reference your new class, you never actually have to load the compiled classed into the buildfile again until you are ready to test with real Vassal.

I am presuming you have used the vassal-module-template from the vassalengine repository? If so, you don’t need to have downloaded and built the Vassal source (unless you are interested). The pom.xml in vassal-module-template will download the specified version of Vassal as a dependency (Make sure the Vassal versionyou want to use has been updated).

Sorry, I probably wasn’t very clear. Run Vassal from within the project that has your custom code (the one based on the vassal-build-template). The code in the currently open project (and it’s maven dependencies) will over-ride any code in the module.

Great. Thank you very much Brent.

Brent, sorry to bother you again, but I have tried to open the vassal project in intellij and filled the debug options as follows:

Couldn’t get the same layout as you have above, in which you place an --edit parameter. I pointed it to my TestMod.vmod file in which I have placed my custom class. I think I got something wrong here.

Running it, I get an internal error with the following log. I have made the text bold where I think the error might be.

2023-06-29 16:26:25,123 [3720-main] INFO VASSAL.launch.StartUp - Starting
2023-06-29 16:26:25,153 [3720-main] INFO VASSAL.launch.StartUp - OS Windows 10 10.0 amd64
2023-06-29 16:26:25,153 [3720-main] INFO VASSAL.launch.StartUp - Java version 17.0.2
2023-06-29 16:26:25,153 [3720-main] INFO VASSAL.launch.StartUp - Java home C:\Program Files\Amazon Corretto\jdk17.0.2_8
2023-06-29 16:26:25,153 [3720-main] INFO VASSAL.launch.StartUp - VASSAL version 3.7.0-SNAPSHOT
2023-06-29 16:26:25,154 [3720-main] INFO VASSAL.launch.Launcher - Player
2023-06-29 16:26:25,280 [3720-main] ERROR VASSAL.tools.ErrorDialog -
java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.NullPointerException: Cannot invoke “java.io.File.getPath()” because “this.lr.module” is null
at VASSAL.launch.Launcher.(Launcher.java:164)
at VASSAL.launch.Player.(Player.java:62)
at VASSAL.launch.Player.main(Player.java:57)
Caused by: java.util.concurrent.ExecutionException: java.lang.NullPointerException: Cannot invoke “java.io.File.getPath()” because “this.lr.module” is null
at VASSAL.tools.concurrent.SimpleFuture.get(SimpleFuture.java:92)
at VASSAL.launch.Launcher.(Launcher.java:108)
… 2 common frames omitted
Caused by: java.lang.NullPointerException: Cannot invoke “java.io.File.getPath()” because “this.lr.module” is null
at VASSAL.launch.Player.createDataArchive(Player.java:115)
at VASSAL.launch.Player.launch(Player.java:87)
at VASSAL.launch.Launcher$1.run(Launcher.java:96)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:771)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:741)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
2023-06-29 16:44:18,928 [3468-main] INFO VASSAL.launch.StartUp - Starting
2023-06-29 16:44:18,954 [3468-main] INFO VASSAL.launch.StartUp - OS Windows 10 10.0 amd64
2023-06-29 16:44:18,954 [3468-main] INFO VASSAL.launch.StartUp - Java version 17.0.2
2023-06-29 16:44:18,954 [3468-main] INFO VASSAL.launch.StartUp - Java home C:\Program Files\Amazon Corretto\jdk17.0.2_8
2023-06-29 16:44:18,954 [3468-main] INFO VASSAL.launch.StartUp - VASSAL version 3.7.0-SNAPSHOT
2023-06-29 16:44:18,954 [3468-main] INFO VASSAL.launch.Launcher - Player
2023-06-29 16:44:19,059 [3468-main] ERROR VASSAL.tools.ErrorDialog -
java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.NullPointerException: Cannot invoke “java.io.File.getPath()” because “this.lr.module” is null
at VASSAL.launch.Launcher.(Launcher.java:164)
at VASSAL.launch.Player.(Player.java:62)
at VASSAL.launch.Player.main(Player.java:57)
Caused by: java.util.concurrent.ExecutionException: java.lang.NullPointerException: Cannot invoke “java.io.File.getPath()” because “this.lr.module” is null
at VASSAL.tools.concurrent.SimpleFuture.get(SimpleFuture.java:92)
at VASSAL.launch.Launcher.(Launcher.java:108)
… 2 common frames omitted
Caused by: java.lang.NullPointerException: Cannot invoke “java.io.File.getPath()” because “this.lr.module” is null
at VASSAL.launch.Player.createDataArchive(Player.java:115)
at VASSAL.launch.Player.launch(Player.java:87)
at VASSAL.launch.Launcher$1.run(Launcher.java:96)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:771)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:741)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
2023-06-29 16:45:12,448 [3180-main] INFO VASSAL.launch.StartUp - Starting
2023-06-29 16:45:12,469 [3180-main] INFO VASSAL.launch.StartUp - OS Windows 10 10.0 amd64
2023-06-29 16:45:12,469 [3180-main] INFO VASSAL.launch.StartUp - Java version 17.0.2
2023-06-29 16:45:12,469 [3180-main] INFO VASSAL.launch.StartUp - Java home C:\Program Files\Amazon Corretto\jdk17.0.2_8
2023-06-29 16:45:12,469 [3180-main] INFO VASSAL.launch.StartUp - VASSAL version 3.7.0-SNAPSHOT
2023-06-29 16:45:12,469 [3180-main] INFO VASSAL.launch.Launcher - Player
2023-06-29 16:45:12,577 [3180-main] ERROR VASSAL.tools.ErrorDialog -
java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.NullPointerException: Cannot invoke “java.io.File.getPath()” because “this.lr.module” is null
at VASSAL.launch.Launcher.(Launcher.java:164)
at VASSAL.launch.Player.(Player.java:62)
at VASSAL.launch.Player.main(Player.java:57)
Caused by: java.util.concurrent.ExecutionException: java.lang.NullPointerException: Cannot invoke “java.io.File.getPath()” because “this.lr.module” is null
at VASSAL.tools.concurrent.SimpleFuture.get(SimpleFuture.java:92)
at VASSAL.launch.Launcher.(Launcher.java:108)
… 2 common frames omitted
Caused by: java.lang.NullPointerException: Cannot invoke “java.io.File.getPath()” because “this.lr.module” is null
at VASSAL.launch.Player.createDataArchive(Player.java:115)
at VASSAL.launch.Player.launch(Player.java:87)
at VASSAL.launch.Launcher$1.run(Launcher.java:96)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:771)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:741)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
2023-06-29 16:51:32,485 [6864-main] INFO VASSAL.launch.StartUp - Starting
2023-06-29 16:51:32,509 [6864-main] INFO VASSAL.launch.StartUp - OS Windows 10 10.0 amd64
2023-06-29 16:51:32,509 [6864-main] INFO VASSAL.launch.StartUp - Java version 17.0.2
2023-06-29 16:51:32,509 [6864-main] INFO VASSAL.launch.StartUp - Java home C:\Program Files\Amazon Corretto\jdk17.0.2_8
2023-06-29 16:51:32,510 [6864-main] INFO VASSAL.launch.StartUp - VASSAL version 3.7.0-SNAPSHOT
2023-06-29 16:51:32,510 [6864-main] INFO VASSAL.launch.Launcher - Player
2023-06-29 16:51:32,623 [6864-main] ERROR VASSAL.tools.ErrorDialog -
java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.NullPointerException: Cannot invoke “java.io.File.getPath()” because “this.lr.module” is null
at VASSAL.launch.Launcher.(Launcher.java:164)
at VASSAL.launch.Player.(Player.java:62)
at VASSAL.launch.Player.main(Player.java:57)
Caused by: java.util.concurrent.ExecutionException: java.lang.NullPointerException: Cannot invoke “java.io.File.getPath()” because “this.lr.module” is null
at VASSAL.tools.concurrent.SimpleFuture.get(SimpleFuture.java:92)
at VASSAL.launch.Launcher.(Launcher.java:108)
… 2 common frames omitted
Caused by: java.lang.NullPointerException: Cannot invoke “java.io.File.getPath()” because “this.lr.module” is null
at VASSAL.launch.Player.createDataArchive(Player.java:115)
at VASSAL.launch.Player.launch(Player.java:87)
at VASSAL.launch.Launcher$1.run(Launcher.java:96)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:318)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:771)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:741)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)
2023-06-29 17:02:35,182 [6672-main] INFO VASSAL.launch.StartUp - Starting
2023-06-29 17:02:35,212 [6672-main] INFO VASSAL.launch.StartUp - OS Windows 10 10.0 amd64
2023-06-29 17:02:35,212 [6672-main] INFO VASSAL.launch.StartUp - Java version 17.0.2
2023-06-29 17:02:35,212 [6672-main] INFO VASSAL.launch.StartUp - Java home C:\Program Files\Amazon Corretto\jdk17.0.2_8
2023-06-29 17:02:35,212 [6672-main] INFO VASSAL.launch.StartUp - VASSAL version 3.7.0-SNAPSHOT
2023-06-29 17:02:35,212 [6672-main] INFO VASSAL.launch.Launcher - Player
2023-06-29 17:02:35,344 [6672-main] ERROR VASSAL.tools.ErrorDialog -
java.lang.RuntimeException: java.util.concurrent.ExecutionException: java.lang.NullPointerException: Cannot invoke “java.io.File.getPath()” because “this.lr.module” is null
at VASSAL.launch.Launcher.(Launcher.java:164)
at VASSAL.launch.Player.(Player.java:62)
at VASSAL.launch.Player.main(Player.java:57)
Caused by: java.util.concurrent.ExecutionException: java.lang.NullPointerException: Cannot invoke “java.io.File.getPath()” because “this.lr.module” is null
at VASSAL.tools.concurrent.SimpleFuture.get(SimpleFuture.java:92)
at VASSAL.launch.Launcher.(Launcher.java:108)
… 2 common frames omitted
Caused by: java.lang.NullPointerException: Cannot invoke “java.io.File.getPath()” because “this.lr.module” is null
at VASSAL.launch.Player.createDataArchive(Player.java:115)
at VASSAL.launch.Player.launch(Player.java:87)
at VASSAL.launch.Launcher$1.run(Launcher.java:96)
at java.desktop/java.awt.event.InvocationEvent.dispatch$$$capture(InvocationEvent.java:318)
at java.desktop/java.awt.event.InvocationEvent.dispatch(InvocationEvent.java)
at java.desktop/java.awt.EventQueue.dispatchEventImpl(EventQueue.java:771)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:722)
at java.desktop/java.awt.EventQueue$4.run(EventQueue.java:716)
at java.base/java.security.AccessController.doPrivileged(AccessController.java:399)
at java.base/java.security.ProtectionDomain$JavaSecurityAccessImpl.doIntersectionPrivilege(ProtectionDomain.java:86)
at java.desktop/java.awt.EventQueue.dispatchEvent(EventQueue.java:741)
at java.desktop/java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:203)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:124)
at java.desktop/java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:113)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:109)
at java.desktop/java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
at java.desktop/java.awt.EventDispatchThread.run(EventDispatchThread.java:90)

You need to add your program arguments in the filed with the ‘Program arguments’ hint immediately below the field that contains the class that contains your main VASSAL.launch.Player.

If you just want to run the Player (as you are), then you just need to add the full pathname to your module in double quotes as the Program Argument. For me this would be something like

“D:\Data\Vassal\Modules\Test\FC26.vmod”

Just type/paste it into that field.

You only need the --edit if you want to run the editor, in which case, your main class will be VASSAL.launch.Editor.

I disagree.
This really isn’t a realy noob question. :confused:

Noob developer question :smiley:

Thanks for the kindness Yves and thanks for the support Brent. I didn’t have the time to test it yet, but I’ll let you know when I do.

Hello MNetto and Brent,

I am really interested in learning more about developing custom code and wondered if you had suggestions for readings or advice on getting stuck in. I have been reading about Java and Git, but still feel I am a world away from adding a class to VASSAL. Alternatively, if a video tutorial existed showing the step by step process of creating the custom class through Intellij, it would be really helpful. Any advice would be appreciated.

Brent,

I’ve tested it and it worked. My just have a doubt: I created the Debug profile inside the class project, since, as you said, the maven dependencies are all configured. Supposing I didn’t have them configured this way, I just wouldn’t know how to point to the VASSAL.launch.Player, since it wouldn’t show up in the dialog. How can I reference something in another project?

keefersa, as you can see, I’m not really the best person to give you tips. I know some coding from creating simple classes in Java, C# and Python, but I never tried working in larger projects using git, dependencies, debug tools etc. All my projects were relatively simple and self-contained, so I’m crawling with the help of Brent here. The material I used, before asking here, was that available in the Vassal site.

So, pretty niche, no-one has done a video tutorial. The wiki describes how to set up Intellij here: Getting started with IntelliJ - Vassal

There’s a (very) brief intro to setting up a custom class in a new repository here: Custom Classes Intro - Vassal

We used to have a lot more extensive example of custom coding, but it seems to have disappeared, possibly because it is out of date? Try this : Programming Tutorial - Vassal. It has some good info on the basic concepts.

There some more information here: Programming - Vassal

You would need to set that other project up as a dependency in Maven, and have run a maven install in that other project to have installed it into your local maven repository.

Ok, thanks a lot. I’ll learn how to deal with maven now.

Ok, thanks a lot. I’ll learn how to deal with maven now.

If what you want is to override some isolated feature of VASSAL, you do not really need to set up a full mirror of the VASSAL source code, nor do you need to tinker with Maven, IntelliJ, and so on.

As an example: I have a class ObliqueHexGridNumbering which numbers a hex grid in the old Avalon Hill style (first coordinate is oblique, second coordinate is vertical) used in for example Afrika Korps, D-Day, and Blitzkrieg.

You can find the code for the class at GitLab (ObliqueHexGridNumbering.java).

The class ObliqueHexGridNumbering derives from VASSAL.build.module.map.boardPicker.board.mapgrid.HexGridNumbering and uses that for most stuff.

package ak;

import java.awt.Point;
import org.apache.commons.lang3.ArrayUtils;
import VASSAL.build.module.map.boardPicker.board.mapgrid.HexGridNumbering;
import VASSAL.build.Buildable;

public class ObliqueHexGridNumbering extends HexGridNumbering {
...
}

The main purpose of the class is to change the numbering, which is done by the method getRow, which in turn uses the service method slantRow.

public class ObliqueHexGridNumbering extends HexGridNumbering {
    public boolean direction = true;
    ...
    @Override
    public int getRow(Point p) {
        return slantRow(super.getRow(p),super.getColumn(p));
    }
    public int slantRow(int row, int column) {
    return direction ?
        (int)Math.floor(column/2) + row :
        row - (int)Math.floor(column/2)+1;
    }
}

The member direction says which way the coordinate is slanted (true:right or false:left).

Apart from these methods, the class also need to add some attributes to the base class HexGridNumbering so that we can edit the slant direction in the VASSAL GUI Editor.

public class ObliqueHexGridNumbering extends HexGridNumbering {
   ...
   public static final String DIRECTION = "direction"; //NON-NLS

    @Override
    public String[] getAttributeDescriptions() {
        return ArrayUtils.add(super.getAttributeDescriptions(),"Slanted right");
    }
    @Override
    public String[] getAttributeNames() {
        return ArrayUtils.add(super.getAttributeNames(), DIRECTION);
    }
    @Override
    public Class<?>[] getAttributeTypes() {
        return ArrayUtils.add(super.getAttributeTypes(), Boolean.class);
    }
    @Override
     public void setAttribute(String key, Object value) {
         if (DIRECTION.equals(key)) {
             if (value instanceof String) {
                 value = Boolean.valueOf((String) value);
             }
             direction = (Boolean) value;
        }
        else {
            super.setAttribute(key, value);
        }
    }
    @Override
    public String getAttributeValueString(String key)
    {
        if (DIRECTION.equals(key)) {
            return String.valueOf(direction);
        }
        else {
            return super.getAttributeValueString(key);
          }
    }
    ...
}

These methods merely augment the base class same methods to handle the new attribute direction.

All this code then resides in a single file ObliqueHexGridNumbering.java.

Now, let’s assume you have VASSAL installed in

/opt/sw/vassal/3.6.14

To build the user code, all we need to do is to invoke the Java compiler on it and make sure the compiler can find the VASSAL library JAR (Java ARchive).

$ javac -cp /opt/sw/vassal/3.6.14/lib/Vengine.jar ObliqueHexGridNumbering.java

This will produce the file ObliqueHexGridNumbering.class which must be imported into the module (make sure the import sub-directory matches the package declaration on top). You can now create an ObliqueHexGridNumbering element on your HexGrid element.

Above, I assumed a sensible OS (a.k.a., GNU/Linux). For other OSs the compilation procedure may differ a bit. For example, if you have Windoze and VASSAL in stalled in

C:\Program Files\VASSAL\3.6.14 

and Java installed in

C:\Program Files\JDK

and your code in

C:\Users\me\Documents\VASSAL\CustomCode

you should open a terminal (Command prompt or PowerShell), and do something like

> cd C:\Users\me\Documents\VASSAL\CustomCode
> C:\Program Files\JDK\bin\javac -cp "C:\Program Files\JDK\lib\Vengine.jar" ObliqueHexGridNumbering.java

to build ObliqueHexGridNumbering.class. Note that ObliqueHexGridNumbering.class is platform independent and can be used on any OS.

That’s really all there is to it. All you need is

  • VASSAL binary distribution, which you already have
  • Java Development Kit (JDK) for your OS
    • You can find JDK 20 from Oracle here for Windoze, MacOSX
    • Do sudo apt install openjdk-default on GNU/Linux (Debian derivatives)
  • A text editor (Emacs, Vi, Notepad, …)

There’s no need to worry about the InelliJ Integrated Development Environment (IDE), Maven software project management tool, Git distributed version control system, and so on. What you do need to worry about is Java and writing code that does what you want :slight_smile:

Yours,
Christian

1 Like

Thank you very much Christian for going through the hassle of doing such a detailed description.

Hey MNetto,

I had similar questions but could not get my debugger working. I have developed a custom class and see it working because the console prints are showing up. I have 2 instances of JetBrains - one with the Vassal Player the Other with my new Class called MyAlarm. In the Player Jetbrains I Have

The JetBrains with MyAlarm does not get activated. So I can not Debug it.

I was wondering if you could give a quick recap of how you got it to work. Are you just running in 1 JetBrains and starting the Player from there? If so how do you point to that Player.

bruynca,

I have only one instance of IntelliJ running. I used the vassal-module-template project and built my class inside the my_custom_component folder, where the MyChatter example class example is placed. I call the VASSAL.launch.Player from there.