Quantum - Free RTS

wow, windows 7. That was fast. It jsut came out.

This is off topic but, is it cool?

Ok I’ll come out of the corner. I hope official drivers come out soon so I can test :slight_smile:

[quote]wow, windows 7. That was fast. It jsut came out.

This is off topic but, is it cool?
[/quote]
I suggest looking on wiki that explains all about it.
But yes I’m running the public beta (x64), its the only OS I’m running. I have a copy of vista ultimate, which I said I would install it if I had any troubles. Well guess what, no trouble.

I’m using this laptop for full development at work, it has intel 965 which runs good for games. It can play COD 4 ok.
And any of my lan games, they just run fine as.

So far no problems at all that includes drivers. Very stable. RC comes out in April.
It runs faster and smoother then XP and Vista. I had XP before I installed windows 7 and that caused more problems then this 8) and of course like the new features they have added.

I can’t wait till its released.

just put version 1.29 on the server. this is a major performance update. i was able to post the performance by a factor of 3 on my machine. i can play at a steady 60fps on my geforce 6600 with ~7000 creatures.

i resolved the last few leaks in quantum and threw out the 1.30 update. i now consider it officially done as i start on a new project. quantum was a preliminary test of some of the technologies involved and wheter a massive rts is feasable in java. from the graphics one wouldn’t think that there’s a lot going on beneath the hood but quantum actually is a full featured rts and simulating many thousands of those creatures takes quite some effort. i also finally made it open source (lgpl). you can find the source code at

http://code.google.com/p/quantum-game/

i might throw out some updates from time to time in case any bugs turn up. thanks for all the feedback and maybe the sourcecode is helpful to some of you.

Cool game, but maybe I just suck at it. I can’t ever, ever beat the computer. It always starts out gaining ahead of me, and whenever I try to strategically attack he re-routes his “creatures” faster than I can, and is expanding the whole time. Is there some particular trick to doing it? I’ve played games of these types before and usually managed pretty well, but this one is giving me difficulties.

Also, sometimes it’s confusing because I’ll send like 14 ships to a planet, only to discover I can’t build a tree because I only have 7 or 8 guys. Is it supposed to work like this (losing guys upon entering a planet?) or am I sending ships that haven’t left yet, so they go somewhere else?

Sorry if I just sound frustrated, I just like to be able to win things, and this utterly defeats me. I can kill 1 computer if I go vs 3, but then discover that the computer 3 has completely taken over computer 4, and expanded while he was at it, and then I can’t possibly micromanage fast enough to make up for it. Or maybe I don’t understand the system well enough. The tree thing is cool, but kind of confusing.

I’m interested in the technique you used to synchronize so many entities across the network. If possible, can you give a simple explanation of your method? Thanks in advance.

(Also I’m still unable to play :’()

once you send some creatures to another planet you lose control over them until they reach their target. why 14 creatures would become 7 when they arrive at another planet is beyond me. if that happens a lot to you can you 1) make a save game and post it here so i can reproduce it and 2) check wheter you really send the amount you thought you send. beneath the send “arrow” the amount of creatures you will send when releasing the mouse button is shown. i never encountered that problem. it would be a pretty severe bug that would cause desynchs. thanks for posting.

the bot can be frustrating. i’ll do another release some time next week were you can specify the strength of the bot. optionally you can alter the beanshell script yourself to make the bot less aggressive. you can find it in $home/quantum/dat/scripts. a lot of people have problems with the bot so you are not alone :slight_smile:

concerning your problems: i’m really sorry i can’t help. the tipps i gave you last time are all i can think of. my research lead me to the conclusion that you must have old gluegen and/or jogl jar somewhere in your class path. you might try the latest version but i don’t think that will help a lot.

concerning the networking code: it’s two simple principles. first all clients are really just simulators simulating the same deterministic world. for that to work you have to make sure that the same code paths are executed on all clients, that lists and all other collection types in your simulation are traversed in the same order and that random numbers on all clients are the same (use the same seed on all clients and make sure the same amount of random numbers is generated on all clients ). the other “trick” is to not transfer unit data like position or velocity but rather only transmit commands given by each user. this means that it’s really just a very fast paced turn based game. on each client you buffer the commands the user gave during the last say 20 turns. every 20th turn the buffered commands are send to the server which accumulates the buffers from all clients. when the server received all buffers from all clients from the last 20 turns it sends them back to all the clients which execute them, e.g. my telling the simulation to move 10 creatures from planet a to b. as long as the simulation has not received this buffer it can not continue and will pause (remeber all cleints have to simulate the same thing ). as this introduces noticeable lag we do a simple trick. instead of buffering, sending and waiting for the buffer to return from the server we execute the buffer we send 20 turns ago which should be send back from the server already. the real trick is to figre out how many turns to buffer which depends on the highest ping in the network of clients and the server. check out the code of quantum for more detail. there’s also a good introductionary article called 10.000 archers by a guy who was involved in the age of empires games on gamasutra.

That sounds pretty cool. But say commands are lagged, and a client missed one. How can the client undo the commands since the new command? Do you save a copy of the old game world and then re-apply all commands?

Excellent, thanks for the explanation. I’ve been researching lock-step sync. for a game I’m working on. It’s good to see concrete examples of its implementation exist.

a client simply can’t miss a command. this is due to using tcp instead of udp as well as to the lock step simulation. as long as a client hasn’t received the apropriate buffer for the current simulation step the simulation is paused. the client also won’t send out anything during that period effectively making the other clients wait as well. to hide that pauses which happen due to high pings and/or a slow machine the number of turns that get buffered is adjusted so that the time those turns take in total sum up to the highest ping in the system. as the server know all the pings it can dynamically adjust that time window and tell the clients about it. the system thus automatically adjusts to the correct timings over the first few seconds in a game making for a smooth user experience.

WOW, I didnt realize that the multiplayer was so complex. That must have taken you forever to code.

i started from scratch in january actually. i invested ca. 150 hours of my sparetime since then to get to quantum’s current state. this directly translates in some ugly passages in the code :slight_smile:

150 hours :o.

how can you let go and move on to a new project. I have trouble letting go of projects that take maybe 10 (including research :)).

waht are you working on now?

That’s a great method, thanks for explaining it.

This software seems very well written with out looking at the code directly. I only played the single player variant. I was able to win consistently on the smallest “Mini” map as long as the number of bots were roughly equal or less than half of all planets available. The key in winning was not to build at all since each bot seems to grow a “tree” immediately and then rush to expand. I could easily take advantage by just sending all creatures to a single bot’s beginning point and then defend my original and new points for about 10 seconds. Other than that, I had fun getting whooped so badly! ;D

Hey mario,

I tried the webstart version and also the zip version 1.31 which I ran from the command line. Unfortunately it crashed apparently while trying to initialise the openGL window.

log.txt was

[FileManager] path to quantum is ‘’, returning file ‘./’
[FileManager] path to quantum is ‘’, returning file ‘config.dat’
[SoundManager] buffers size: 16384
[Texture] created texture 512x512

Attached is the more detailed JVM dump. Looks like an access violation. Maybe it’s assuming a higher level of openGL?

I am running Windows XP, SP2
The JRE was Sun’s, 1.6.0_05
GFX card is ATI FireGL V3300

I might try it from another machine tonight.

cheers,

josh

I got quantum working on my other machine.

This game is brilliant! I absolutely love the gameplay. Minimalist RTS is my favourite genre. It is really quite hard to beat the computer, but after about 10 goes I was able to do so on the simple maps. Like most RTSs the key is to rush any weak positions (trees with no guards) as soon as you spot them. I am surprised you want to move away from this project, I think it has a lot of potential.

I think slowing the game down a bit for beginners would help, plus perhaps showing resource levels a bit more clearly.

josh

I got an error with the jnlp:

[quote][FileManager] path to quantum is ‘C:\Documents and Settings-DzzD-/quantum/’, returning file ‘C:\Documents and Settings-DzzD-/quantum/./’
[FileManager] path to quantum is ‘C:\Documents and Settings-DzzD-/quantum/’, returning file ‘C:\Documents and Settings-DzzD-/quantum/config.dat’
java.lang.UnsatisfiedLinkError: no jogl in java.library.path
at java.lang.ClassLoader.loadLibrary(Unknown Source)
at java.lang.Runtime.loadLibrary0(Unknown Source)
at java.lang.System.loadLibrary(Unknown Source)
at com.sun.opengl.impl.NativeLibLoader.loadLibraryInternal(NativeLibLoader.java:189)
at com.sun.opengl.impl.NativeLibLoader.access$000(NativeLibLoader.java:49)
at com.sun.opengl.impl.NativeLibLoader$DefaultAction.loadLibrary(NativeLibLoader.java:80)
at com.sun.opengl.impl.NativeLibLoader.loadLibrary(NativeLibLoader.java:103)
at com.sun.opengl.impl.NativeLibLoader.access$200(NativeLibLoader.java:49)
at com.sun.opengl.impl.NativeLibLoader$1.run(NativeLibLoader.java:111)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.opengl.impl.NativeLibLoader.loadCore(NativeLibLoader.java:109)
at com.sun.opengl.impl.windows.WindowsGLDrawableFactory.(WindowsGLDrawableFactory.java:60)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Unknown Source)
at javax.media.opengl.GLDrawableFactory.getFactory(GLDrawableFactory.java:106)
at javax.media.opengl.GLCanvas.chooseGraphicsConfiguration(GLCanvas.java:520)
at javax.media.opengl.GLCanvas.(GLCanvas.java:131)
at javax.media.opengl.GLCanvas.(GLCanvas.java:90)
at quantum.Quantum.(Quantum.java:68)
at quantum.Quantum.main(Quantum.java:128)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.sun.javaws.Launcher.executeApplication(Unknown Source)
at com.sun.javaws.Launcher.executeMainClass(Unknown Source)
at com.sun.javaws.Launcher.doLaunchApp(Unknown Source)
at com.sun.javaws.Launcher.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)

Java Web Start Error:

null

[/quote]
seems there is a jogl native missing

Hi marzec,

Quantum is relay a great realization!
I like Games which are easy to learn but require a lot of strategy.
Cool graphics… retro gaming still lives!

The first time I tested Quantum the triangle for moving ships wasn’t painted. So I was confused how to play. But since the last update the gui works fine. I didn’t knew Dyson but I knew Galcon which is very similar and also a very nice game. The funny thing is, that I also wanted to code a Java version of this game. But it ended only in little Swing benchmark.

Too bad that my graphic card doesn’t supports the shaders.

[Renderer] disabling shader support: glsl: error in fragment shader, Fragment shader failed to compile with the following errors:
ERROR: 0:4: 'const' :  non-matching types for const initializer

My System:
Vista x32 Notebook
ATI Readeon HD 2600
Java JRE 1.6 Up. 13
Catalyst Driver v9.3

When I try to switch on the bloom effect the game crashes with this error:

D:\Downloads\quantum-1.32-pack\quantum>java -jar quantum.jar
[FileManager] path to quantum is '', returning file './'
[FileManager] path to quantum is '', returning file 'config.dat'
[SoundManager] buffers size: 16384
[Texture] created texture 512x512
[Renderer] disabling shader support: glsl: error in fragment shader, Fragment shader failed to compile with the following errors:
ERROR: 0:4: 'const' :  non-matching types for const initializer
ERROR: 1 compilation errors.  No code generated.

....
[Texture] created texture 512x512
[Texture] created texture 32x32
[Renderer] created offscreen fbo
Exception in thread "Thread-5" javax.media.opengl.GLException: java.lang.NullPointerException
        at javax.media.opengl.Threading.invokeOnOpenGLThread(Threading.java:271)
        at javax.media.opengl.GLCanvas.maybeDoSingleThreadedWorkaround(GLCanvas.java:410)
        at javax.media.opengl.GLCanvas.display(GLCanvas.java:244)
        at com.sun.opengl.util.Animator.display(Animator.java:144)
        at com.sun.opengl.util.Animator$MainLoop.run(Animator.java:181)
        at java.lang.Thread.run(Unknown Source)
Caused by: java.lang.NullPointerException
        at quantum.gfx.Renderer.render(Renderer.java:338)
        at quantum.game.GameLoop.render(GameLoop.java:159)
        at quantum.forms.LocalGame.display(LocalGame.java:305)
        at quantum.Quantum.display(Quantum.java:265)
        at com.sun.opengl.impl.GLDrawableHelper.display(GLDrawableHelper.java:78)
        at javax.media.opengl.GLCanvas$DisplayAction.run(GLCanvas.java:435)
        at com.sun.opengl.impl.GLDrawableHelper.invokeGL(GLDrawableHelper.java:194)
        at javax.media.opengl.GLCanvas$DisplayOnEventDispatchThreadAction.run(GLCanvas.java:452)
        at java.awt.event.InvocationEvent.dispatch(Unknown Source)
        at java.awt.EventQueue.dispatchEvent(Unknown Source)
        at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
        at java.awt.EventDispatchThread.run(Unknown Source)

Maybe it would be better to deactivate the button if no shaders are supported.

Greets,
Tobse

It’s much easier to contest with the AI if I turn off the “glow effect.” The map size that I can perform better at multiplies by about 4 to 5 in size. I think it has something to do with the relation of how often the game accepts mouse input while animation slows down. The AI and “creatures” perform at the same speed regardless, and even a slight reduction puts me at a disadvantage! ;D

Still, it seems like a well written software that needs further tweaks. 8)