[Island Forge] Single-dev MMORPG * Now Free-to-Play!

Allow me to try and clear up this confusion: The residency rule in the ToS is for my protection. Take this example (with a grain of salt, as I am not a lawyer):

Suppose you reside in the hypothetical land of Hyperbole. You go ahead an register anyway, clicking that you abide by the ToS, and play the game. Time passes. Later you discover some element of the game that breaks a law of Hyperbole, such as the Law Against Animated Depiction of Fantasy Combat (LAADFC). You want to sue me for breaking the law and causing damage to your psyche for exposing you to ADFC (an illegal act in Hyperbole). The ToS protect me from such suits, because I do not claim to abide by any such laws (that is, the laws to which you are subjected by your residency in Hyperbole).

I have no intent to break any laws of any nation, but I simply cannot guarantee it. Without the ToS, I would be exposed to all the laws of all the lands, which is an unfortunate reality of the business of gaming. I know a lot of folks are here just toying around (which is a great feature of the community, which I’ve much enjoyed), but some of us are actually having a go at running a business. Legal restrictions are a necessary evil.

That said, I appreciate community input on the subject. I’ve actually spent a lot of time/effort/money to make my ToS friendly to potential players. I certainly don’t desire to turn folks away.

Here’s what I will do: I will consult with the lawyer who drafted these terms, in order to assess the risk of changing this clause. No promises, but if I judge it to be acceptable, I will amend the ToS to stipulate, more clearly, something along the lines of: Any residency is acceptable, but only the laws of the USA are enforceable.

In the interim, I hope that even if (most respected) Riven takes offense, other members of this community will understand my situation.

Why don’t you just drop the TOS for now and when the game goes live you put something like “Please abide to the TOS”, preventing the login if the player does not.

I think a TOS right now is just scaring the potential test players, which in this stage I believe are highly valuable.

It’s all about beta testing - including the ToS. I’m actually glad (and rather surprised) folks have taken the time to notice and respond. The feedback is welcome, even when not entirely positive. Since this community (at least some representation of it) has brought this up as a potential issue, I’m doing my best to take active measures toward improving it. Thanks for your feedback.

Island Forge is now listed on mmorpg.com’s massive Game List.

I’m excited to have lots of new signups (and you can now Subscribe During Beta for a special offer). If you haven’t seen the YouTube video, please have a look. Island Forge is all about player-created content, and there are several new player-created islands to explore (see the online Atlas).

Thanks JGO community!

Holy mother of god, that video is extremely impressive! :o

This is one of the few rare games where you’ve successfully somehow integrated Swing into your game. However, I think you should change the look and feel to something more…appealing, maybe like Nimbus or something better off the internet.

Thanks a lot ra4king. That’s the first video I’ve ever put together, so I’m glad you like how it came out. The video primarily features the island builder (built into the client). In the primary game GUI, you don’t see much of the look & feel because most of the controls are custom. I had an issue with Java totally rendering incorrectly on different platforms, so I settled for Metal L&F because it seems to be consistent. Do you have good luck with Nimbus being consistent?

Since we’re all technical folks here, the entire GUI (including the main game screen) is all Swing. The static elements of the landscape are rendered to a backing buffer. Animation is driven in a separate thread, which uses the nanosecond timer to dynamically adapt to a target framerate. Even though animation is driven on this separate thread, rendering of dynamic elements is properly handed over to Swing to paint the view. Buttons and dialog boxes are Swing (have a look at more screenshots).

I’m sure for many here this is Rendering 101 stuff, but I wanted to learn all the fundamentals, and think I’ve pushed Swing pretty far. There are even some neat effects, such as walking behind obstacles (trees, buildings, mountains, walls, etc) shows a ghost view of your character behind. Still, Swing gives me some performance issues (mainly with drawImage calls … any insight there? I recently switched to using createCompatibleImage for my internal buffers, to no avail).

If ever I have the opportunity, I would like to try Slick2D instead of raw Swing/Java2D. Thanks for your interest! I love to discuss this stuff with folks here.

Metal and Nimbus are both consistent … -ly fugly. There are a number of PLAFs out there that are far less eye-gouging, such as JGoodies, Synthetica and Insubstantial. If it’s just the backend SDK stuff, it doesn’t matter much, but then again it’s hardly any code at all to offer the ability to switch PLAFs at runtime.

It’s only 2 lines of code to switch PLAFs:


UIManager.setLookAndFeel(LookAndFeel);
SwingUtilities.updateComponentTreeUI(Component); //best to give the topmost component, like the JFrame.

Yes it’s very easy to implement. I’ll have a look at the various PLAFs you mentioned. One issue I ran into was that background painting was inconsistent between PC/Mac/Linux… but that was when I was allowing each platform to use its own default L&F. So, it is possible to have broken/inconsistent L&F implementations. Mac, in particular, did terrible things.

Ease of implementation is not always the most important issue, though. Overall impact is the main concern. To offer selectable L&F means ensuring that everything behaves correctly for each, which is a lot of work. One of those by-developer-and-for-developers features of Java. I’d highly recommend that for any project, make a design decision which L&F to use and stick with it. Giving users a choice is not really something users care about.

Thanks for your input.

I just avoid Swing like the plague ;D

From my experience with Island Forge - that is a wise decision. I’ve managed to wrangle it to do my bidding, but it seems to fight you at every turn. Do you recommend the traditional architecture of rendering everything in a “main loop” (with double buffering and such, to be sure, but don’t even invoke any Swing beyond the JFrame & component pane)? I think that might have made my life a lot easier.

Yes! Using Canvas + BufferStrategy, 1 thread for game loop is best. Making your own simple GUI in Java2D is really easy, especially buttons and sliders. Dropdowns would be a bit difficult.

I find Swing to be tolerable for creating interface controls, but integrating the primary world rendering to be Swing-friendly has proven to be difficult. After years of tweaking, I think I have a pretty solid Swing-based 2D rendering engine, but I’m definitely going to follow your advice in the future.

In other news, I recently sent out a newsletter and mentioned java-gaming.org - Thanks for being a great community for Java game development!

By the way, the latest beta includes a new global roster, so you can see everyone who’s in the world and direct chat with anyone. I’ll see if it works just as soon as someone logs in…

As a followup to your above advice, I’ve done some experimenting with unhinging my engine from the Swing thread. I can render the world in a driver thread (painting directly to a JComponent or handling my own double buffering), but it doesn’t play nice with the various popup menus and other Swing-driven components I use.

In fact, the Swing-friendly approach I’m using behaves much smoother in general. The basic technique is to separate all the state from the rendering (good practice anyway), drive the state on a time-clocked non-Swing loop thread, then have the driver thread tell the JComponent to paintImmediately (on the Swing thread). All repaint regions are accumulated during each drive cycle to avoid excess repainting. (This direction was inspired by this article on Swing Animation.)

The timing and repaint (clipping) behavior can be customized with different strategies. I’ve implemented fixed-clock-rate vs. target-frame-rate timer. In different cases I use a group-everything-into-one-rectangle dirty region accumulator vs. a proximity accumulator that combines dirty areas only if they’re near/touching.

The trickiest part is that Swing can call for a repaint effectively anytime it wants. So, all the painting routines must be able to paint on demand without stalling (or deadlocking) on the driver thread.

Do libraries such as Slick2D (others?) provide this sort of custom driver/repaint behavior, or is the general approach rendering the entire screen to a buffer/graphics on each cycle? Advice or pointers to other rendering techniques most welcome.

Nope in Slick2D (and LWJGL in general) you simply repaint the entire screen.

Ugh, why do I do everything the hard way? In any case, thanks for your input, ra4king. You’re all over this site, and offer a lot of helpful direction.

Are you? I’m not that sure about LWJGL. You really have to call Display’s update(), but that update() does not call glClear(). But I think your talking about double-buffering right?

Sure if you don’t call glClear you will draw over what was previously in the buffer.

But I’m saying that LWJGL does not do like Swing and only repaint parts of the screen. The entire buffer is flipped, so you have to redraw everything.

I’ve just released a significant new feature:

Island Forge: Now with Coinage!

Towns now have a new Market shop, where you can sell items for GP (Coinage). GP is used to heal, level-up, craft, and train. See more details in the link above.

My primary goal for this change is to provide a somewhat more traditional RPG experience, while still maintaining the unique aspects of the game. Many of the gameplay features are now much more intuitive. In fact, character level is even more interesting, now that you must maintain your health (HP), lest you die in combat and lose levels.

I’m excited about this new direction, and would very much appreciate any feedback from the JGO community. Thanks for your advice and input!

Today I am extremely excited to announce that Island Forge is no longer in Beta!

I’ve been to plenty of forums, but I’d like to say that JGO always feels like my home-away-from-home. While end-users couldn’t/shouldn’t care less what language a game is developed in, folks here understand why Java matters.

Thanks for bearing with me while I learn the ropes, make mistakes, and continue to persevere. I’m excited for the future of Island Forge, and I look forward to everyone’s continued advice.