Java-Gaming.org    
Featured games (79)
games approved by the League of Dukes
Games in Showcase (477)
Games in Android Showcase (109)
games submitted by our members
Games in WIP (536)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
    Home     Help   Search   Login   Register   
Pages: [1] 2
  ignore  |  Print  
  Greenspace, a park or landscape design toy  (Read 7971 times)
0 Members and 1 Guest are viewing this topic.
Offline Varkas
« Posted 2012-10-12 15:59:00 »

Since a while I've been thinking about developing a sort of game or toy around the idea of building a garden, park or more general, design a landscape.


While I have some programming and also graphics design skills, my game design skills are bad. Therefore it is unlikely that this really will become a game, but a sort of map making toy I surely can make.

Technically a landscape is made of several elements in this project:

- a backdrop image, which defines the "canvas" for the design
- a map structure which allows to position items onto the backdrop

At the moment, the backdrops are fixed at 800x600, but it shouldn't be too hard to levitate this limit.

The current incarnation of the project can be found here:

http://sourceforge.net/projects/freemapper/files/Greenspace/

I hope I can include some more "gamey" features later in the project, but at the moment I am working just on the sandbox mode, and to include more graphics. I want to include three backdrops, "grassy plains", "desert landscape" and "another planet in space" with mathching plants and decorations if I can. So far I have a bit of the "grassy plains" scenario, the rest is just in my head.

I call it "alpha" because even if it works somewhat stable, many elements are supposed to change, particularly the way maps and the graphics are stored. I can't even promise good compatibility of map data between versions currently, but it should stabilize at some point.

It's pure Java/Swing, no external libraries needed, so there is some hope that it will run on many systems. But experience shows that it usually doesnt. I'll try though to have it run on as many systems as possible.

if (error) throw new Brick(); // Blog (german): http://gedankenweber.wordpress.com
Offline JESTERRRRRR

Senior Member


Medals: 7
Exp: 1 year



« Reply #1 - Posted 2012-10-13 14:30:13 »

Did you make, or where did you get those sprites? They look really nice. Perhaps this would make an awesome iso map maker if you could save it in some easy to read form?
Offline Varkas
« Reply #2 - Posted 2012-10-14 12:57:02 »

The maps are saved as a sort of XML, so it should be fairly easy to read them again. I wanted to get rid of the restrictions of a tiled/gridded map structure in this project though, and see if performance will be good enough with a "object list + depth sorting" display approach.

But it's an offspring of a map editor, indeed.

Some of the bitmaps I made myself, some I have borrowed from Simutrans:

http://simutrans.svn.sourceforge.net/viewvc/simutrans/


if (error) throw new Brick(); // Blog (german): http://gedankenweber.wordpress.com
Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline Varkas
« Reply #3 - Posted 2013-01-12 13:30:16 »

A really far-flung idea was to have procedurally created plants (-> http://en.wikipedia.org/wiki/L_Systems ) and let players exchange/trade their plant "construction plans". Unfortunately my plant generator which rendered the graphics was too bad, and they didn't look good enough.

Having some basic raytracing features together now, my code can produce a bit better quality of graphics. Maybe good enough to actually be used. At the moment I have only spheres and cylinders as basic objects though, but with better shapes it should be possible to make rather interesting plants.

This was a first test:



The code can render this in a few steps of growing (it's a recursive structure), and it should be able to add snow, too, for the winter version.

The plant recipe looks like this right now:

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
    private void tree2(Turtle3D t, double dist, int n)
    {
        if(dist > 20.0)
        {
            t.setLineWidth(dist/35);
            t.setColor(trunk);
            t.forward(dist/3);
            t.up(6);
            t.setColor(leaf);
            t.fillOval(4, 4);
            t.up(2);
            t.fillOval(3, 3);
            t.stopPaint();
            t.up(-16);
            t.startPaint();
            t.fillOval(2, 2);
            t.up(2);
            t.fillOval(4, 4);
            t.setColor(trunk);
            t.up(6);

            t.setColor(trunk);
            t.forward(dist/3);
            t.up(6);
            t.setColor(leaf);
            t.fillOval(4, 4);
            t.up(2);
            t.fillOval(2, 2);
            t.stopPaint();
            t.up(-16);
            t.startPaint();
            t.fillOval(2, 2);
            t.up(2);
            t.fillOval(4, 4);
            t.setColor(trunk);
            t.up(6);

            t.forward(dist/3);

            Turtle3D t1 = new Turtle3D(t);
            t1.roll(0);
            t1.turn(30);
            tree2(t1, dist*0.8, ++n);

            Turtle3D t2 = new Turtle3D(t);
            t2.roll(120);
            t2.turn(31);
            tree2(t2, dist*0.8, ++n);

            Turtle3D t3 = new Turtle3D(t);
            t3.roll(240);
            t3.turn(32);
            tree2(t3, dist*0.8, ++n);
        }
        else
        {
            t.setLineWidth(1);
            t.setColor(trunk);
            t.forward(dist/2);
            t.fillOval(2, 2);
            t.forward(-1);
            t.setColor(flower);
            t.fillOval(5, 5);
        }
    }


I need to make this accessible to non-programmers too, since I assume the typical audience for a gradening simulation will include many people who are not used to such abstract methods of designing plants.

Well, at least, progress Smiley

if (error) throw new Brick(); // Blog (german): http://gedankenweber.wordpress.com
Offline Best Username Ever

Junior Member





« Reply #4 - Posted 2013-01-12 18:35:23 »

It looks good from this angle. I am not sure whether I would prefer 3D or 2D.
Offline Varkas
« Reply #5 - Posted 2013-01-12 22:40:03 »

At the moment it's all open, 2D or 3D. And if the raytracing approach really works, different players can render their own views from the "recipes" to their liking.

I need a better plant example, but I wanted to show some states of growth. Recursions 1 to 3, and a forth level with fruits.



The raytracer still has gotten bugs, and bugs are the bane of each garden  persecutioncomplex

if (error) throw new Brick(); // Blog (german): http://gedankenweber.wordpress.com
Offline Varkas
« Reply #6 - Posted 2013-01-13 18:34:04 »

A few bugs less in the tracer, the bush refined and a second plant "recipe":



if (error) throw new Brick(); // Blog (german): http://gedankenweber.wordpress.com
Offline Varkas
« Reply #7 - Posted 2013-01-14 00:00:27 »

The leaves were quite tricky, there just isn't a simple geometric shape that resembles a leave. I decided to use texture patches, and it worked quite well:


I think I can call this part good enough now, and focus on a better input method for the plant recipes next. I assume I need some sort of interpreter for a syntax like this:

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
22  
23  
24  
25  
26  
27  
28  
29  
30  
31  
32  
33  
34  
35  
36  
37  
38  
39  
40  
41  
42  
43  
44  
45  
46  
47  
48  
49  
50  
51  
52  
53  
54  
55  
56  
57  
58  
59  
60  
61  
62  
63  
64  
65  
    private void tree2(Turtle3D t, double dist, int n)
    {
        if(n < 0)
        {
            return;
        }
       
        if(dist > 20.0)
        {
            t.setColor(trunk);

            t.roll(25);
            t.setLineWidth(dist/35);
            t.forward(dist/2);
           
            t.up(6);
            leaf(t, 7, 15);
            t.roll(180);
            t.up(12);
            leaf(t, 8, 18);
            t.up(-6);

            t.setColor(trunk);            
            t.forward(dist/4);
            t.roll(90);

            t.up(6);
            leaf(t, 7, 17);
            t.roll(180);
            t.up(12);
            leaf(t, 8, 19);
            t.up(-6);
           
            t.forward(dist/4);

            n--;
           
            Turtle3D t1 = new Turtle3D(t);
            t1.roll(0);
            t1.turn(33);
            tree2(t1, dist*0.8, n);

            Turtle3D t2 = new Turtle3D(t);
            t2.roll(119);
            t2.turn(35);
            tree2(t2, dist*0.8, n);

            Turtle3D t3 = new Turtle3D(t);
            t3.roll(242);
            t3.turn(37);
            tree2(t3, dist*0.8, n);
        }
        else
        {
            t.turn(0 + Math.random()*2);
            t.setLineWidth(1);
            t.setColor(trunk);
            t.forward(dist*0.4);
            t.setColor(leaf);
            t.sphere(2.2);
            t.forward(-1);
            t.setColor(flower);
            t.sphere(5.5);
        }
    }


This produces the plant shown above. Turtle graphics were once well known when Logo as a programming language for children and beginners was invented, but how is that nowadays? Could you think of something simpler than the listing above?

if (error) throw new Brick(); // Blog (german): http://gedankenweber.wordpress.com
Offline Best Username Ever

Junior Member





« Reply #8 - Posted 2013-01-14 00:54:09 »

The leaves were quite tricky, there just isn't a simple geometric shape that resembles a leave. I decided to use texture patches, and it worked quite well.

Is an ellipse simple? What is a texture patch?
Offline Varkas
« Reply #9 - Posted 2013-01-14 11:09:23 »

An ellipse is good, but it didn't have the pointy tip that many sorts of leaves have.

A texture patch is a rectangle, which is transparent in all places which are not covered by non-transparent texture pixels. It's inifinitely thin, but good for leaves as it seems. I assume I can use if for petals and such too. It seems to be as a quite versatile element.
 

if (error) throw new Brick(); // Blog (german): http://gedankenweber.wordpress.com
Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Online Roquen
« Reply #10 - Posted 2013-01-14 13:30:10 »

L-system.
Offline Varkas
« Reply #11 - Posted 2013-01-14 14:42:05 »

You mean, use a grammer-like syntax? The plants are loosely based on the l-system idea already, the script just defines a stem build, and how to add more stems. But it can do more, since it's a stack machine.

I'm looking for something that a non-programmer who is sufficiently interested in the topic can learn in 10 to 30 minutes to the point when they have some sort of success experience. I can't imagine many people will be willing to spend more time than 30 minutes before giving up in frustration.

if (error) throw new Brick(); // Blog (german): http://gedankenweber.wordpress.com
Offline Varkas
« Reply #12 - Posted 2013-01-15 12:15:20 »

The scripting labguage is complete enough now to run one of the example plants shown above. I've started to work on a small plant designer application:



The scripting language needs a loop construct and more math function calls, but it's working surprisingly well already.

if (error) throw new Brick(); // Blog (german): http://gedankenweber.wordpress.com
Offline OttoMeier

Senior Member


Medals: 4
Projects: 1



« Reply #13 - Posted 2013-01-15 19:11:22 »

you know xtext?
http://www.eclipse.org/Xtext/7languagesDoc.html#tortoise
Offline Varkas
« Reply #14 - Posted 2013-01-15 23:43:00 »

Ack. No, I had no idea that such a thing already exists ...
I must admit I've largely been ignoring Eclipse and everything around it.

if (error) throw new Brick(); // Blog (german): http://gedankenweber.wordpress.com
Offline Varkas
« Reply #15 - Posted 2013-01-16 15:05:03 »

The scripting language supports a few math functions now and it's possible to define subroutines. Both of the example plants can now be created from scripts.



I've uploaded a demo version, to gather some early feedback (190k):

http://www.java-gaming.org/user-generated-content/members/132627/gdsi-plant-designer-r2.jar

You need to unzip this jar file - it will create a folder named "gdsi-plant-designer-r2". In this folder you will find two text files, which are the scripts for the plants and another "gdsi-plant-designer-r2.jar" file, which is an executable jar file. On windows you can run it with a double click from the explorer.

The lexer is somewhat limited at the moment and requires whitespace between all tokens. I.e. "5+2*PI" will not work, but "5 + 2 * PI" will. PI is a predefined variable which you can use.

You need to assign a value to a variable before you can use the variable, otherwise you get an error when acessing the variables value.

Most likely there are a zillion of more bugs. Maybe it's even too early to have this tested, but if you are interested and have some time, please try it and let me know what you think about it.

A brief function reference:

Turtle control functions

double getScale()
void setScale(double scale)
void startPainting()
void stopPainting()
void forward(double distance)
void up(double distance)
void move(V3 direction, double distance)
void turn(double angle)
void roll(double angle)
void setColor(int argb)
void setColor(double red, double green, double blue)
void setLineWidth(double width)
void placeSphere(double size)
void placeLeaf(double length, double width)

Turtle state functions

The turtle has a memory. You can make it remember the current position and state by calling "push()". To make the turtle return to the last pushed spot, call "rewind". "pop()" rewinds the turtle and also forgets about the pushed state.

void push()
void rewind()
void pop()

Math functions

double random()
double sin(double rad)
double cos(double rad)
double sqrt(double r)

Preset variables

PI

Flow Control

if <condition>
{
    ...
}

while <condition>
{
    ...
}

Operators

+ - * /

if (error) throw new Brick(); // Blog (german): http://gedankenweber.wordpress.com
Offline krasse
« Reply #16 - Posted 2013-01-16 21:55:39 »

This book about plants/flowers and L-systems is really great:
http://algorithmicbotany.org/papers/#abop

I read that before I implemented my own L-system(s)

Offline Varkas
« Reply #17 - Posted 2013-01-17 15:12:41 »

Wow. I didn't expect such a quality work to be freely available. Thanks for the link, krasse!

Some progress:

- Expressions without spaces like 2+2*PI parse correctly now
- Subexpressions like 2 * (PI - 2) get correct precedence now

Made a new script for a group of grasses:



if (error) throw new Brick(); // Blog (german): http://gedankenweber.wordpress.com
Online Roquen
« Reply #18 - Posted 2013-01-17 15:20:39 »

This book about plants/flowers and L-systems is really great:
http://algorithmicbotany.org/papers/#abop

I read that before I implemented my own L-system(s)
I don't think I've bought a CS book in the last 15 years.
Online Riven
« League of Dukes »

JGO Overlord


Medals: 752
Projects: 4
Exp: 16 years


Hand over your head.


« Reply #19 - Posted 2013-01-17 15:47:25 »

It seems like you're converging to Java-like syntax.

Maybe you can use Janino as a runtime compiler.

If you really want your own syntax, it's probably easier to use a few regex patterns (or plain string operations) to convert your own language to java, compile it with janino, and have immediate results with nearly zero effort.

Hi, appreciate more people! Σ ♥ = ¾
Learn how to award medals... and work your way up the social rankings
Offline Varkas
« Reply #20 - Posted 2013-01-17 16:02:57 »

The "Assignment operator likes and dislikes" thread made me believe that it's a good idea to use Java/C syntax elements instead of the Pascal ones. On the other hand there is currently an amount of Basic mixed in, since that seemed easier to parse.

Janino looks really interesting. For programmers it sure will be the easiest to just write a class that contains all the code to create a plant.

I feel very uncertain at this point. I want to include non-programmer users too, but the current scripting language is already to complex for that - I'm not sure if people who don't have a scientfic background can imagine the results of a series of roll/turn/pitch commands for the turtle. I don't want my own syntax just to have a new syntax, but I wanted to have a higher level syntax which makes plant design easier. I must admit, I failed at this so far.

Findings so far:

- It was good to refresh my parser design knowledge. I had forgottten too much of it.
- The script interpreter is a bug-nest and time consuming to debug. It's a one-time effort though.
- The script language is too complex for the desired goal.
- Performance isn't an issue for the scripts, parsing time to tracing time has a relation of about 1:1000
- Updating the existing scripts after language changes becomes a pain.
- Language changes will become additionally difficult once other people made scripts and want compatibility/upgrade paths for their scripts.
- The raytracer has some elusive bugs which do not show in the plants, but annoy me because I can't track them down.

On the plus side, it's the first time that I have a higher level tool to describe and render plant structures. So I think it was worth all the effort. And it seems to have potential.

if (error) throw new Brick(); // Blog (german): http://gedankenweber.wordpress.com
Offline OttoMeier

Senior Member


Medals: 4
Projects: 1



« Reply #21 - Posted 2013-01-17 19:37:16 »

I am not sure if you if you really locked at xtext.
Basically it given you an eclipse plugin with code completion, Syntax highligting and so far.
That alone is far more beginner friendly.
And you get an abstract ecore meta model which you can transform with the elipse M2M tools like xtend. That can help for upgrading.

No offensive but for me creating a dsl without a tool (xtext) is like parsing xml with string methods.

btw. you should use javafx for your gui its far better than swing. Maybe the canvas node for you renderer.
Offline krasse
« Reply #22 - Posted 2013-01-17 20:58:15 »

It seems like you're converging to Java-like syntax.

Maybe you can use Janino as a runtime compiler.

This is exactly how I did with my L-system(s) Smiley. It works very well.

Offline Varkas
« Reply #23 - Posted 2013-01-17 23:32:40 »

I am not sure if you if you really locked at xtext.
Basically it given you an eclipse plugin with code completion, Syntax highligting and so far.
That alone is far more beginner friendly.

But it will require the people to set up Eclipse? I don't know if this is beginner friendly. I haven't really looked at it, you are right. I was mostly done with my parser and interperter at the time of the suggestion. At least I didn't expect big enhancements coming or being needed.

Maybe I made a bad decision. But I estimated the time that it takes me to

- get Eclipse
- set up Eclipse
- find out how to install the plugin and install it
- learn the grammer syntax
- write a grammer for my langauge
- create the parser and interpreter
- integrate that with my project

as bigger than the time to write the interpreter right away. The only thing that needs parsing are arithmetic expressions anyway. As you guessed, everything else is just just string comparison.

I've been using lex and yacc (flex and bison) in the past, while I was still C coding, so I have an idea what it means to use a compiler compiler. But it didn't seem worth it this time. I know it's not professional. But it was quick and easy enough. And I don't think I'll need to create many languages soon, so learning the tools would not have given me knowledge of lasting value - till I have to do it again, the tools are likely out of fashion.

I dunno. I make mistakes too. Maybe this was one. At the moment I'm still somewhat convinced that my decisions were right.

With Swing it's similar. I have about 10 years experience using Swing, while Javafx is all new to me. I believe that Swing will be good enough for this tool. I have an IDE to create Swing UIs very quickly and I know it well. Learning + using a new toolkit and new tools for a simple editor application and a few buttons? I'm not sure if this will really give better results. Maybe if Javafx has a text pane with syntax highlighting, that is the only bigger task that I see. But I believe that subclassing the text area UI and implementing my own text highlighting will be quick. I haven't done that yet though, and sometimes Swing components are super-tricky, so there could be bad surprises.




if (error) throw new Brick(); // Blog (german): http://gedankenweber.wordpress.com
Offline Varkas
« Reply #24 - Posted 2013-01-18 11:43:57 »

To escape the discussion if it makes sense to use a Java compiler and compile the scritps to bytecode or something like that. I decided for a BASIC like syntax. This particularly means that if and while statements got endif and wend now, instead of {} blocks.

A feature which is missing in the current scripting langauge and which I want to add till the next release is parameter passing to the subroutines.

The raytracer delivers a bit better graphical quality now:






Download

http://www.java-gaming.org/user-generated-content/members/132627/gdsi-plantdesigner-r4.jar

You need to unzip this jar file - it will create a folder named "gdsi-plant-designer-r4". In this folder you will find two text files, which are the scripts for the plants and the "plant-designer-r4.jar" file, which is an executable jar file. On windows you can run it with a double click from the explorer.

A very brief syntax reference for the scripting language is included in the package (see readme.txt).

if (error) throw new Brick(); // Blog (german): http://gedankenweber.wordpress.com
Offline Varkas
« Reply #25 - Posted 2013-01-18 17:40:37 »

The next steps will be to integrate the plant designer into the greenspace simulation. I've done the steps manually for the demo plants and took a snapshot of a simple greenspace scene with them.


(right-click -> view image for full size)

Since the plants will be converted to a series of bitmaps when imported to the greenspace simulator, the question of the size of those bitmaps arises.

The park area shown there is 800x600 pixels if it worked as intended. With the shown detail level of plants this appears like a small place, but I like the detail level of the plants.


if (error) throw new Brick(); // Blog (german): http://gedankenweber.wordpress.com
Offline Varkas
« Reply #26 - Posted 2013-01-19 18:27:55 »

The map editor can assign individual sizes to plants now. Plants will grow during the year anyways, but now each can have their own individual size variation.



The integration of the plant designer with the map editor needs some more work, though. And many of the existing bitmaps have a low resolution, compared to the plants made by the designer, so I assume I'll have to do most of them again in a higher resolution.

if (error) throw new Brick(); // Blog (german): http://gedankenweber.wordpress.com
Offline Best Username Ever

Junior Member





« Reply #27 - Posted 2013-01-19 19:01:08 »

Looks good. You could allow parameters to your plant building system to animate them changing over seasons. (Leaves can bud, grow, change colors, then fall off. You could have seasonal flowers that regrow the next year as wild hybrids.)

Are you going to use something like that program in the final version or write something else? (Don't forget that you can use non-realtime rendering.) If you use Java2D I bet you can still fake 3D rendering by treating the images as billboards and only rotating around the vertical axis. Shadows and paths would be different because they would need to be projected on to the ground.
Offline doos

Senior Member


Medals: 2
Projects: 2


Here be random


« Reply #28 - Posted 2013-01-19 20:57:13 »

The plant designer link didnt appear for me (404).. Does it have obj (or other) export?
Offline Varkas
« Reply #29 - Posted 2013-01-19 23:30:19 »

The following link worked for me, if it keeps giving you a 404, you'll have to wait till the next full release of the project, with the designer included.

http://www.java-gaming.org/user-generated-content/members/132627/gdsi-plantdesigner-r4.jar

The plant designer doesn't build a mesh internally, but compiles the plant into a series of mathematic formulas which the raytracer can use as input. I'm afraid I can't offer a mesh export. The current version can export bitmaps of the rendered images, but the demo was just for the show (aka no export included).

Looks good.

Thanks Smiley

[quote author=Best Username Ever link=topic=27520.msg259033#msg259033 You could allow parameters to your plant building system to animate them changing over seasons. (Leaves can bud, grow, change colors, then fall off. You could have seasonal flowers that regrow the next year as wild hybrids.)
[/quote]

I hope that some day the system will be powerful enough to actually do that Smiley Thanks for the ideas!

Are you going to use something like that program in the final version or write something else? [...] If you use Java2D I bet you can still fake 3D rendering by treating the images as billboards and only rotating around the vertical axis.

The plant designer will be included for sure, but I assume there also should be the option to include bitmap based plants and other map elements. Maybe I'll bundle a simple graphical editor with the project.

I'm fairly undecided to use OpenGL or Java2D so far, and have tried to keep the code open enough that I can decide this some day later. At the moment the display is just bitmaps and Java2D.

if (error) throw new Brick(); // Blog (german): http://gedankenweber.wordpress.com
Pages: [1] 2
  ignore  |  Print  
 
 
You cannot reply to this message, because it is very, very old.

 

Add your game by posting it in the WIP section,
or publish it in Showcase.

The first screenshot will be displayed as a thumbnail.

CogWheelz (18 views)
2014-07-30 21:08:39

Riven (23 views)
2014-07-29 18:09:19

Riven (15 views)
2014-07-29 18:08:52

Dwinin (12 views)
2014-07-29 10:59:34

E.R. Fleming (33 views)
2014-07-29 03:07:13

E.R. Fleming (12 views)
2014-07-29 03:06:25

pw (43 views)
2014-07-24 01:59:36

Riven (43 views)
2014-07-23 21:16:32

Riven (30 views)
2014-07-23 21:07:15

Riven (31 views)
2014-07-23 20:56:16
List of Learning Resources
by SilverTiger
2014-07-31 18:29:50

List of Learning Resources
by SilverTiger
2014-07-31 18:26:06

List of Learning Resources
by SilverTiger
2014-07-31 13:54:12

HotSpot Options
by dleskov
2014-07-08 03:59:08

Java and Game Development Tutorials
by SwordsMiner
2014-06-14 00:58:24

Java and Game Development Tutorials
by SwordsMiner
2014-06-14 00:47:22

How do I start Java Game Development?
by ra4king
2014-05-17 11:13:37

HotSpot Options
by Roquen
2014-05-15 09:59:54
java-gaming.org is not responsible for the content posted by its members, including references to external websites, and other references that may or may not have a relation with our primarily gaming and game production oriented community. inquiries and complaints can be sent via email to the info‑account of the company managing the website of java‑gaming.org
Powered by MySQL Powered by PHP Powered by SMF 1.1.18 | SMF © 2013, Simple Machines | Managed by Enhanced Four Valid XHTML 1.0! Valid CSS!