How to become a Vassal developper

Joel,
I think I have the same problem as Zov66 regarding the building of VASL project. I think it is because the entire VASL folder in the ASL trunk is now located under the src folder. My guess is that originally this ASLBoard class is supposed to be coming from the VASL.build.module.map package but now because of the way the VASL folder is structured, it cannot be located any more. As an experiment, I refactored all the VASL.build.* packages from their current src.VASL.build.* package names to VASL.build.* package names. Then when I built the ASL project, I had no problem. With the current setup, I got something like 200+ errors.

Lance

Lance,
That’s because of the way you have your project profile set up in Eclipse. You need to set you source folder in the Configure Build Path as VASL/src, not VASL.
Brent.

Thus spake lancel:

Joel,
I think I have the same problem as Zov66 regarding the building of VASL
project. I think it is because the entire VASL folder in the ASL trunk
is now located under the src folder. My guess is that originally this
ASLBoard class is supposed to be coming from the VASL.build.module.map
package but now because of the way the VASL folder is structured, it
cannot be located any more. As an experiment, I refactored all the
VASL.build.* packages from their current src.VASL.build.* package names
to VASL.build.* package names. Then when I built the ASL project, I had
no problem. With the current setup, I got something like 200+ errors.

“src” isn’t part of the package name. The src dir is supposed to be
your build root.


J.

Thanks. I think this is the part that Wiki was not updated since I followed its steps one by one. That was why I thought initially the VASL folder was not under src. After I changed the Java Build Path’s source, I have no more errors. I also modified the default output folder.

Lance

Thus spake clperez:

Hi.

My name is Carlos. I am java and c++ developer. Iwould like to
contribute to the vassal project. I have been vassal user for some
months and i want to take the next step. My source forge name is
clperez. I offer you my help.

Do you use any coding standard?

See you.

Hi, Carlos. My appologies for taking so long to respond. We’d like
to have your help.

The situation presently is that we’re working on finishing 3.2 for
release, after which we’ll be switching over to C++ for VASSAL 4.
What we need help with at present is fixing bugs in the trunk. There
are quite a few open bug reports at present, many of which haven’t been
investigated:

vassalengine.org/tracker/bug … New%20Bugs

Anything which is marked as NEW has likely not been looked at yet. Here
you can see which bugs have been reported most:

vassalengine.org/tracker/dup … openonly=1

We’re happy to fix any bug, but especially these, as they seem to affect
the most users (though, note that some of these are VASL bugs, not VASSAL
bugs).

A second task we have is working on the design for VASSAL 4. Once I’m
done with my work for 3.2 (very close now), I’ll be writing up some more
of my design ideas so that more detailed work can start. If you’re an
experienced developer, we’d like to have your input on this, as well.

As for coding standard:

2-space indent, no tabs. Put opening block braces on same line as ‘while’
or ‘if’. Make variables final when possible. Write tests if you can.

That’s mostly it. (Once we switch to V4 development, I’m intending that
“write tests if you can” will become “write tests, period”.)


J.

On 2011-09-05, at 9:07 AM, Joel Uckelman uckelman@nomic.net wrote:

The situation presently is that we’re working on finishing 3.2 for
release, after which we’ll be switching over to C++ for VASSAL 4.

Oops, missed that memo. That’s what I get for reading my messages in reverse chronological order.

Was there a decision on the GUI framework?

  • M.

Thus spake Michael Kiefte:

The situation presently is that we’re working on finishing 3.2 for
release, after which we’ll be switching over to C++ for VASSAL 4.

Oops, missed that memo. That’s what I get for reading my messages in reverse
chronological order.

I thought we had reached consensus on using C++.

Was there a decision on the GUI framework?

No, not yet.


J.

I thought we had reached consensus on using C++.

You’re assuming I have a good memory.

Was there a decision on the GUI framework?

No, not yet.

I don’t think wxWidgets really has any competition any more. I’m still deeply suspicious of Qt with what’s been going on at Nokia.

Just my opinion though.

  • M.

Erm, I posted the following to uckelman (Joel) via Sourceforge, but didn’t get a reply. Hope I don’t break any rules by posting here. So, here’s the message to Joel again…

Hi, can I be added as a developer for VassalEngine?

First contribution I’d like to make: RecursionLimiter. I would like to move the recursionDepth variable into the Loopable interface. This is in preparation for Loopable(s) running in separate threads (animations).

We can then truly limit recursion depth. Eg, FunctionA calls FunctionB calls FunctionC calls FunctionA, the loop of which RecursionLimiter will limit to 50, possibly preventing cyclic loops. Currently, RecursionLimiter erroneously limits call stack depth (FunctionA calls FunctionB calls FunctionC and bam, if RECURSION_LIMIT is say 2).

We can talk about a true cyclic dependency catcher later on, if you’re interested in that.

If this needs to be in the forum or tracker, let me know and I’ll put this there.

Hope I’m welcome on board! Can’t wait to start my branch.

Thus spake viewofheaven:

Erm, I posted the following to uckelman (Joel) via Sourceforge, but
didn’t get a reply. Hope I don’t break any rules by posting here. So,
here’s the message to Joel again…

I’m in the midst of moving house right now, which is why I didn’t
reply sooner (though this is still within 48 hours, I should note).

Hi, can I be added as a developer for VassalEngine?

You’re added. Welcome aboard.

First contribution I’d like to make: RecursionLimiter. I would like to
move the recursionDepth variable into the Loopable interface. This is in
preparation for Loopable(s) running in separate threads (animations).

We can then truly limit recursion depth. Eg, FunctionA calls FunctionB
calls FunctionC calls FunctionA, the loop of which RecursionLimiter will
limit to 50, possibly preventing cyclic loops. Currently,
RecursionLimiter erroneously limits call stack depth (FunctionA calls
FunctionB calls FunctionC and bam, if RECURSION_LIMIT is say 2).

We can talk about a true cyclic dependency catcher later on, if you’re
interested in that.

If this needs to be in the forum or tracker, let me know and I’ll put
this there.

Brent, RecursionLimiter was your creation. What do you think?


J.

No problem. No commercial contract between us for you to respond within any timeframe. But I must say I was fired up about Vassal! :slight_smile:

I’ll help you comb the forums. We’ll respond as a team!

I don’t understand how this will help. The entire point of the Recusion Limiter is to catch cyclic loops as well as self-recursion. Controlling Stack depth is a common technique that provides a reasonable compromise.

This sounds a bad way to try and run animations anyway. The speed of the animation would be non-deterministic. What sort of animations are you thinking of? Any sort of operations running in a separate thread that change the game state are going to cause serious problems. If you just want a simple animation, try an animated GIF.

B.

Thus spake Brent Easton:

I don’t understand how this will help. The entire point of the Recusion
Limiter is to catch cyclic loops as well as self-recursion. Controlling
Stack depth is a common technique that provides a reasonable compromise.

Nor do I. Jon, could you try to explain further your proposal for
changing RecursionLimiter?

This sounds a bad way to try and run animations anyway. The speed of the
animation would be non-deterministic.

I concur. The only sound way to handle animation is with a timer.

What sort of animations are you
thinking of? Any sort of operations running in a separate thread that
change the game state are going to cause serious problems. If you just
want a simple animation, try an animated GIF.

Animated GIFs haven’t worked for quite a long time now, and never during
the 3.1 series. The problem is that they’re not BufferedImages, which
makes a mess of caching.


J.

If RecursionLimiter is to “limit recursion”, it will do just that, and nothing more. Say FunctionA calls itself, that would involve a recursion depth. Say FunctionA calls FunctionB, that would be call depth alone, not recursion. (Call depth or recursion depth all employ a “call stack” to keep track of scope. Hence my mention of call stack depth. I understand that using a counter like RecursionLimiter does is a cheap and efficient compromise between true cyclic loop catcher and fast cyclic loop preventer).

In short, recursion depth involves call depth (since FunctionA is calling FunctionA itself). But call depth, in general, does not necessarily equate to recursion depth. That is, recursion depth is a special form of call depth.

RecursionLimiter currently limits call depth, not just recursion depth.

My proposal for animation requires that TriggerAction be runnable in a separate thread. The meat of the proposal was written here, though there are some minor errors in that proposal.

If each TriggerAction can run in a separate thread, and can also loop at a timed interval (proposal termed this as “Repetition Interval”), that would mean this: Each TriggerAction effectively represents a single animation loop.

Now, why would that implicate RecursionLimiter? If there are more than 50 animation loops (via 50 TriggerAction(s)), RecursionLimiter will balk. Even without my proposal for “TriggerAction as Animation Thread”, RecursionLimiter still should be corrected to do what its name implies.

With timed intervals, animation speed will be deterministic.

Anything from animating a movement (thus possibly removing the need for movement trail), to animating a counter endlessly to show status (eg, rotating clockwise means something, and counter-clockwise means something else).

Hence, this part of my proposal:

Add a new checkbox to TriggerAction: “Non-blocking”.
When user ticks this checkbox:

[]Advise end-users:
[list]
[
]Race conditions might occur[/]
[
]Proper thread programming is required[/]
[
]Please limit execution time of thread (for performance considerations)[/]
[/
:m][/list:u]

If it helps, we can rename RecursionLimiter to CallDepthLimiter :slight_smile:

There is no way this will ever happen. It will cause a nightmare of problems since Trigger Actions can trigger any actions at all.

If you really feel the need for Animation, then write a new Trait that does Animation specifically. It would know about the image sequence and the timings and can start a thread to display them using a proper Animator timer. That would be a much better solution.

Hmm. But why would we want a call depth limiter? The point of having call depth at all is to allow us to structure our programs. That is, organize our code into functions (and functions into classes, into packages, and so on).

A very layered code will mean several well-insulated abstractions, comprising of several distinct functions calling one another. The point of “abstractions” in software is to allow us to “plug in any technology below any abstraction”. Anyway, a quick search for database abstraction should explain my point here much better and more quickly.

I know that programming a Vassal game module isn’t programming Java. But the ability to build “layers” for better code organization is still needed nonetheless. Some game modules are so big, they’re even harder for me to wrap my head around than Vassal Engine is!

Very true. The only reason I didn’t propose a new trait was because I didn’t want to “add more mess” to the Trait engine. Users are already familiar with TriggerAction. And TriggerAction’s design and motivation exactly fits this “non-blocking” implementation.

But I totally agree with you about making an Animation trait! As long as this new trait doesn’t have too much overlap with TriggerAction, then we won’t be adding too much new code (and new bugs). And now that you mention it, there really aren’t much duplication of code between Animation and TriggerAction!

The Animation trait can also have very tight code that controls how animation threads run exactly. Also, it will be better suited to specialize in handling images, organizing image sequences.

But, back to the “nightmare of problems”, wouldn’t all those problems not exist if users simply not tick the “Non-Blocking” option for TriggerAction? Only advanced users need to tick that option.

A non-blocking TriggerAction will still be good for programming a real-time kinda game, such as some “Global Infection Count” rising every minute.

Thus spake Brent Easton:

If you really feel the need for Animation, then write a new Trait that
does Animation specifically. It would know about the image sequence and
the timings and can start a thread to display them using a proper
Animator timer. That would be a much better solution.

A good way to do this would be to use the org.jdesktop.animation
package, which we already use. However, I’m less and less enthused
about the idea of entirely new Java code being planned at this point.


J.

Agreed. Let’s round up v3.2 for now. Just let me know which bugs/features absolutely need attention for v3.2, because I don’t know which are most in demand.

Jon,

Have a look at

Bug 4113 - Action Buttons on counters do not respect Rotation

That will be a good one to get sorted for 3.2. Should be easy to backport to 3.1 as well. Drop me a line if you need any pointers.

Cheers,
Brent.

“uckelman” wrote:

A good way to do this would be to use the org.jdesktop.animation
package, which we already use. However, I’m less and less enthused
about the idea of entirely new Java code being planned at this point.

Agreed. Let’s round up v3.2 for now. Just let me know which
bugs/features absolutely need attention for v3.2, because I don’t know
which are most in demand.

Thus spake viewofheaven:

“uckelman” wrote:

A good way to do this would be to use the org.jdesktop.animation
package, which we already use. However, I’m less and less enthused
about the idea of entirely new Java code being planned at this point.

Agreed. Let’s round up v3.2 for now. Just let me know which
bugs/features absolutely need attention for v3.2, because I don’t know
which are most in demand.

Something which would help a lot (aside from sorting Bug 4091, and
one other website issue which I can point you to after that) is pursuing
bugs marked as new. Lots of them are probably duplicates or due to user
error, but someone needs to have a look to determine that.


J.