Java-Gaming.org Hi !
Featured games (83)
games approved by the League of Dukes
Games in Showcase (539)
Games in Android Showcase (132)
games submitted by our members
Games in WIP (603)
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 3
  ignore  |  Print  
  Mini Quests  (Read 13859 times)
0 Members and 1 Guest are viewing this topic.
Offline dishmoth
« Posted 2011-11-29 16:38:47 »

You may recognize Mini Quests as an escapee from 2010's Tiny Game contest.

The game has grown quite a bit since then.  Update (1 Dec 2014): It now has a grand total of four dungeons.

I've also ported it to Android and Ouya.

The restrictions from the contest still hold: the game uses a resolution of 40-by-30 pixels, and 16 colours (from the 64-colour EGA palette).



Play Mini Quests (Browser, Download, etc.)

Play Mini Quests (Android)

Controls (keyboard):  Use Q,K,S,P to walk around the dungeons, and Space to fire your crossbow.  (Some alternative key layouts are given on the webpage.)

If you get stuck in a dungeon you can press ESC to quit it (and try the other dungeon if you haven't already Wink ).

Game progress should be saved automatically.

Thanks for playing, you tiny heroes!
Simon

Feedback:  I find it hard to judge if the game's puzzles are too difficult or too easy (or too boring, too repetitive, too obscure, etc.) so any feedback you can give would really help me to tweak the game.  If you get stuck in a dungeon, tell me where.  Or if you complete a dungeon, let us all know so we can applaud your skill.

For the Applet, I've tried a bit of an experiment to hopefully make it easier for people to give me feedback.  If you've got the Java Console open (you should be able to open it from the "Advanced" part of the Java Control Panel) then the game will display a cryptic string, such as

    "Tk2IZ37PfGDWlRJdrEPkzhVr3Xbu9Yh4FsnBLhtJR9zNXx5SdwBZj9HipDNlvFTq1LZ17Sf8EEl"

when you complete a quest, or when you quit a quest by pressing ESC.  This string is a munged-up record of roughly where you spent your time during the game, and where you were when you died.  If you post your strings below (or message or mail them to me) then I'll hopefully be able to build up a picture of where the difficult bits in the game are.

So if you get stuck, don't rage-quit.  Open the Java Console, press the ESC key to abort the quest, and send me the magic string.  That way you'll be showing me exactly how frustrated the game has made you.


4 Feb 2012: Links added to Android version
13 May 2013: Removed 'Feedback' section of original post.  Added link to Dungeon #3 Beta.
14 July 2013: New version released.
30 Aug 2013: Now on Ouya.
1 Dec 2014: New version released with four (four! so many!) dungeons.

Offline fruitmaze

Senior Devvie


Medals: 3
Projects: 2



« Reply #1 - Posted 2011-11-29 21:40:19 »

Nice to see that you have continues to develop the game! The new map and that you can pick dungeon is making it more exciting and it is fun to explore more of the "mini land". I found the new map more difficult, and Im already stuck at the 3rd room, 2nd dungeon, where there is a hole in the middle. I will give it another try later on though. Btw I'm actually working on "Cyber Amazon 2" now Smiley
Offline dishmoth
« Reply #2 - Posted 2011-11-29 23:17:09 »

I found the new map more difficult
And I was worried that the new bits were too easy. Roll Eyes  As I said, I have real trouble judging the difficulty level.

Quote
Btw I'm actually working on "Cyber Amazon 2" now Smiley
Excellent news! Cheesy  Will it have the same resolution?

Simon

Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline ShannonSmith
« Reply #3 - Posted 2011-11-30 01:07:20 »

Looks awesome!
It's a shame there wasn't much interest in the TinyGame competition this year. Perhaps rather than a yearly competition we should just have a constraint based showcase forum (one for each TinyGame, 4k, lwjgl16k, vector based etc).
Offline ReBirth
« Reply #4 - Posted 2011-11-30 11:52:50 »

Hi how to pass a door, like at lonely tower in your pic row 3 col 3?

Offline Damocles
« Reply #5 - Posted 2011-11-30 14:36:30 »

I like the game, can you make an alternative control using QWAS (for each diagonal direction?)
Its still a bit confusing to steer.
(or 7845 on the numpad, or any other 2x2 grid keys)

Offline princec

« JGO Spiffy Duke »


Medals: 434
Projects: 3
Exp: 16 years


Eh? Who? What? ... Me?


« Reply #6 - Posted 2011-11-30 15:44:28 »

Actually you know... a mouse click & tile highlight under the cursor would be a great addition. Possibly with a small highlighted path where it's going to take you if you click somewhere. I found the keyboard controls just too annoying to use despite the premise of the game being really interesting.

Also how do I get through that first door? Smiley

Cas Smiley

Offline Damocles
« Reply #7 - Posted 2011-11-30 16:31:17 »

(if you mean the old version...)

shooting at that thing..
from the low part of the bridge.

Its true, the first door is one of the hardest things to understand.
The first time i tried the game it frustrated me not passing that room.
Maybe you make tha bridge-architecture more visible.

Offline dishmoth
« Reply #8 - Posted 2011-11-30 18:19:27 »

Thanks for the feedback, folks!

Hi how to pass a door, like at lonely tower in your pic row 3 col 3?

Doors that look like that are locked.  You either need to find a switch that unlocks them, or find another way through.

Hint: For that door, try searching the area for somewhere that looks like a good hiding place.  Particularly good for hiding trolls.  (Drag over with the mouse to make the [ spoiler ] text visible.)

Simon

Offline dishmoth
« Reply #9 - Posted 2011-11-30 18:26:46 »

Actually you know... a mouse click & tile highlight under the cursor would be a great addition. Possibly with a small highlighted path where it's going to take you if you click somewhere. I found the keyboard controls just too annoying to use despite the premise of the game being really interesting.

Nice thought, but I don't think it would be practical to retro-fit mouse controls.  There are too many times when you can't see the tile you'd want to walk to, and turning to shoot things would become very awkward.

Quote
Also how do I get through that first door? Smiley

For the grassy area, see my post above.  For the lava area, see Damocles's post.

If nothing else, at least the game is upfront about its difficultly level. Wink

Simon

Games published by our own members! Check 'em out!
Legends of Yore - The Casual Retro Roguelike
Offline ShannonSmith
« Reply #10 - Posted 2011-11-30 18:29:22 »

I rage-quitted (forgot about the admin console thing). I kept dying trying to open the second door in the room with the dragon (3 switches one).

I love the game BTW, the puzzles are all really inventive, especially given the 40x30 pixel limit.
Offline dishmoth
« Reply #11 - Posted 2011-11-30 18:31:33 »

It's a shame there wasn't much interest in the TinyGame competition this year.

I still think a page with dozens of 40x30 games tiled over it would be magnificent.  Ah, well.
Simon

Offline dishmoth
« Reply #12 - Posted 2011-11-30 19:43:35 »

I like the game, can you make an alternative control using QWAS (for each diagonal direction?)
Its still a bit confusing to steer.
(or 7845 on the numpad, or any other 2x2 grid keys)

You can now move using T,Y,G,H, or I,O,K,L.
Are those keys okay?
Simon

Offline dishmoth
« Reply #13 - Posted 2011-11-30 19:51:40 »

I kept dying trying to open the second door in the room with the dragon (3 switches one).

You've earned a medal for your impressive adventuring skills. Cool

In that room, would it be less frustrating if the door stayed open once you've stepped on the green switch, instead of locking again if you die (assuming that that's the bit that was causing you trouble)?

Simon

Offline fruitmaze

Senior Devvie


Medals: 3
Projects: 2



« Reply #14 - Posted 2011-11-30 21:12:06 »

Quote
Quote
Btw I'm actually working on "Cyber Amazon 2" now Smiley
Excellent news! Cheesy  Will it have the same resolution?

Simon

Nope it will have as much as 120 x 90 in resolution! Cheesy

I'm now stuck at the first room, 2nd dungeon. I find it very difficult to get pass the 3 shooting guys! As the first room it seems too difficult. Or is there some tactics I can use to get pass them? Right now it is more like I go by random and hope for the best.
Offline dishmoth
« Reply #15 - Posted 2011-11-30 22:57:59 »

I'm now stuck at the first room, 2nd dungeon. I find it very difficult to get pass the 3 shooting guys! As the first room it seems too difficult. Or is there some tactics I can use to get pass them? Right now it is more like I go by random and hope for the best.

The red things only shoot if you're standing directly in front of them.  So as long as you're not standing in line with one, you're perfectly safe.

If it's not obvious that that's how they behave, then I'll have to do something to make it clearer in the game.

Simon

Offline fruitmaze

Senior Devvie


Medals: 3
Projects: 2



« Reply #16 - Posted 2011-12-01 10:46:22 »

Aha now I understand! I thought the shot at me whenever they spotted me, not only vertical and horizontal.
Offline dishmoth
« Reply #17 - Posted 2011-12-02 18:52:13 »

New version
I've added a short tutorial level at the start.  Hopefully that will give people a leg-up onto the game's difficulty curve.

Quote from: fruitmaze
I'm now stuck at the first room, 2nd dungeon. I find it very difficult to get pass the 3 shooting guys! As the first room it seems too difficult. Or is there some tactics I can use to get pass them? Right now it is more like I go by random and hope for the best.
I've added a bit more visual feedback to that room to try to make it clearer how those red things behave.

Quote from: ShannonSmith
I kept dying trying to open the second door in the room with the dragon (3 switches one).
Those switches now stay switched, so that bit should hopefully cause less frustration.

Thanks for all the feedback so far.  Keep it coming! Grin
Simon

Offline Damocles
« Reply #18 - Posted 2011-12-09 14:45:45 »

I think the first puzzles must be of the sort:
"Uh, that was hard, cool meself that i solved that"
without beeing actually complicated, but rather staigtforward.
(Player can estimate the solution by some visible clues)

Some early rewards to get the player motivated for the harder puzzles.

The hardest can be "at the end", since the motivation is to fnish the game then.


Also its good to have the "introduce a new play-mechanic in a simple puzzle,
then repeat it some levels later with a harder setup" rythm.

Its nice to apply a previously learned solution in another setup, makes you feel "wise"

Offline dishmoth
« Reply #19 - Posted 2011-12-09 15:17:28 »

New version
I've expanded the tutorial level at the start to try and make the game more accessible.

If nothing else, at least there's now part of the game no one can get stuck on. Wink

Quote from: Damocles
I think the first puzzles must be of the sort:
"Uh, that was hard, cool meself that i solved that"
without beeing actually complicated, but rather staigtforward.
(Player can estimate the solution by some visible clues)

Some early rewards to get the player motivated for the harder puzzles.

The hardest can be "at the end", since the motivation is to fnish the game then.


Also its good to have the "introduce a new play-mechanic in a simple puzzle,
then repeat it some levels later with a harder setup" rythm.

Its nice to apply a previously learned solution in another setup, makes you feel "wise"

Thanks for the comments.  Everything you say makes sense.  The annoying thing is, I would've said that the quests already follow those rules pretty closely.  I guess I'm just not good at telling the difference between easy puzzles and hard puzzles.

Simon

Offline Nate

« JGO Bitwise Duke »


Medals: 158
Projects: 4
Exp: 14 years


Esoteric Software


« Reply #20 - Posted 2011-12-09 15:27:18 »

Very cool! Have you thought about posting your progress strings via HTTP? I think you'll get a lot more data.

Offline dishmoth
« Reply #21 - Posted 2011-12-09 17:07:40 »

Very cool! Have you thought about posting your progress strings via HTTP? I think you'll get a lot more data.

Thanks!  I did toy with the idea of logging all the player's key presses (together with the initial random seed) and sending that data back so I could watch a perfect replay of the game.  But that sort of thing feels a bit too much like cyberstalking.  I went with a string encoding some crude stats because it seems simple and transparent.(*)

But you're right - I would definitely have got a lot more data.  I've not exactly been overwhelmed by strings so far.

Simon

(*) And because I've not dabbled in that kind of web programming before.

Offline Nate

« JGO Bitwise Duke »


Medals: 158
Projects: 4
Exp: 14 years


Esoteric Software


« Reply #22 - Posted 2011-12-09 17:21:30 »

I've done it a few times. It's a bit sneaky, but it's harmless so I doubt it matters. Users who might care should have a firewall! :p

I just did this for collecting errors, so I have some code handy. Here's some code for posting data:

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  
import java.io.BufferedInputStream;
import java.io.BufferedWriter;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;import java.io.StringWriter;
import java.lang.Thread.UncaughtExceptionHandler;
import java.net.HttpURLConnection;
import java.net.URL;
import java.net.URLEncoder;

public class Errors {
   static public void install () {
      Thread.setDefaultUncaughtExceptionHandler(new UncaughtExceptionHandler() {
         public void uncaughtException (Thread thread, Throwable ex) {
            submit("Uncaught", ex);
         }
      });
   }

   static public void submit (String message) {
      submit(message, null);
   }

   static public void submit (String message, Throwable ex) {
      try {
         System.out.println("Error: " + message);
         if (ex != null) ex.printStackTrace();

         URL url = new URL("http://example.com/something");
         HttpURLConnection conn = (HttpURLConnection)url.openConnection();
         conn.setDoInput(true);
         conn.setDoOutput(true);
         conn.setUseCaches(false);
         conn.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
         conn.setRequestMethod("POST");
         conn.connect();

         BufferedWriter writer = new BufferedWriter(new OutputStreamWriter(conn.getOutputStream()), 1024);
         writer.write("m=");
         writer.write(URLEncoder.encode(message, "UTF-8"));
         if (ex != null) {
            StringWriter buffer = new StringWriter(1024);
            ex.printStackTrace(new PrintWriter(buffer));
            String stacktrace = buffer.toString();

            writer.write("&e=");
            writer.write(URLEncoder.encode(stacktrace, "UTF-8"));
         }
         writer.close();

         BufferedInputStream input = new BufferedInputStream(conn.getInputStream(), 256);
         byte[] buffer = new byte[256];
         while (input.read(buffer) != -1)
            ;
         input.close();

         conn.disconnect();
      } catch (Throwable ex2) {
         System.out.println("Unable to submit exception!");
         ex2.printStackTrace();
      }
   }
}


Now you just need somewhere to post it. If you already have PHP/mysql somewhere that is pretty easy. If you want to use Java you can use a servlet container like Tomcat. Here's a servlet that stuffs the posted data into a mysql table:

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  
import java.io.IOException;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.SQLException;

import javax.naming.Context;
import javax.naming.InitialContext;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.sql.DataSource;

public class ErrorServlet extends HttpServlet {
   protected void doPost (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
      Connection connection = getConnection();
      try {
         String message = request.getParameter("m");
         if (message == null) message = "";
         String exception = request.getParameter("e");
         if (exception == null) exception = "";
         PreparedStatement statement = connection.prepareStatement("INSERT INTO errors SET date=NOW(), message=?, exception=?;");
         statement.setString(1, message.trim());
         statement.setString(2, exception.trim());
         statement.executeUpdate();
         statement.close();
      } catch (Exception ex) {
         throw new RuntimeException("Error writing database entry.", ex);
      } finally {
         try {
            connection.close();
         } catch (SQLException ignored) {
         }
      }
   }

   private Connection getConnection () {
      try {
         Context envContext = (Context)new InitialContext().lookup("java:comp/env");
         DataSource dataSource = (DataSource)envContext.lookup("jdbc/arcanetactics");
         return dataSource.getConnection();
      } catch (Exception ex) {
         throw new RuntimeException("Error opening database connection.", ex);
      }
   }
}


You'll need servlet-api.jar so you can compile that. Then you'll Tomcat and mysql, then setup your servlet like this:
http://www.mulesoft.com/tomcat-mysql
Basically you will have:
META-INF/context.xml (describes db connection)
WEB-INF/web.xml (describes servlet and references db connection)
WEB-INF/classes/com/example/YourServlet.class
Throw that in a subdirectory of your tomcat webapps dir, start tomcat, and you're good. Indeed, it is a bit of a PITA to setup. Smiley

That article describes the db setup in your web.xml, but leaves out how to define the servlet mapping. Your web.xml should look like this:
1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
<web-app>
   <servlet>
      <servlet-name>somename</servlet-name>
      <servlet-class>com.example.YourServletClass</servlet-class>
   </servlet>

   <servlet-mapping>
      <servlet-name>somename</servlet-name>
      <url-pattern>/somepath</url-pattern>
   </servlet-mapping>

   <resource-ref>
      <res-ref-name>jdbc/YourResourceNameFromContextXml</res-ref-name>
      <res-type>javax.sql.DataSource</res-type>
      <res-auth>Container</res-auth>
   </resource-ref>
</web-app>

Then you would hit your servlet using... http://yourdomain:8080/somepath
You could use something like dyndns.com to have your stuff posted to your home machine (just forward the port on your router).
Note the servlet code I pasted above uses HTTP POST and won't respond to GET. You can change doPost to doGet for easier hitting of your serlvet.

Offline dishmoth
« Reply #23 - Posted 2011-12-09 17:49:43 »

Thanks!  One of these days I'll accept that the internet's here to stay, and I'll give all that a try.  I've mentally bookmarked the post.
Simon

Offline Marbink100

Senior Newbie





« Reply #24 - Posted 2011-12-11 16:55:35 »

This game is really nice!

Check out ZOVE Games!!!
It's a site by me and some friends!
Offline bobjob

JGO Knight


Medals: 10
Projects: 4


David Aaron Muhar


« Reply #25 - Posted 2011-12-13 19:05:48 »

My opinion might be tainted by my new found excitement with android. Have you considered porting it?
It seems like a simple enough game to release on android, and would be really awesome to see on a portable device.

My Projects
Games, Webcam chat, Video screencast, PDF tools.

Javagaming.org with chat room
Offline dishmoth
« Reply #26 - Posted 2011-12-13 19:56:43 »

My opinion might be tainted by my new found excitement with android. Have you considered porting it?
It seems like a simple enough game to release on android, and would be really awesome to see on a portable device.

Grin
A couple of chapters more of BadLogic's book and I'll make a start.
I don't know how well it will work with on-screen buttons but it'll be fun to try.

Offline bobjob

JGO Knight


Medals: 10
Projects: 4


David Aaron Muhar


« Reply #27 - Posted 2011-12-14 03:43:03 »

It seems all that is needed is arrows and a select button.

So I think you could use the dpad without problems, and remove dependency on the touch screen by default. As for touch screen devices have no extra buttons on screen, if people touch around in the corner areas, the character moves in that direction, or touches the center he shoots/selects.

Most of the work would just be to setup a view to display a bitmap with the current pixels values.

My Projects
Games, Webcam chat, Video screencast, PDF tools.

Javagaming.org with chat room
Offline Nate

« JGO Bitwise Duke »


Medals: 158
Projects: 4
Exp: 14 years


Esoteric Software


« Reply #28 - Posted 2011-12-16 01:26:40 »

My opinion might be tainted by my new found excitement with android. Have you considered porting it?
It seems like a simple enough game to release on android, and would be really awesome to see on a portable device.

Grin
A couple of chapters more of BadLogic's book and I'll make a start.
I don't know how well it will work with on-screen buttons but it'll be fun to try.

I want to see your game on Android! You will have a much larger audience I think. Your game is really cool, it deserves it! Here's the libgdx code to draw a bitmap full screen:

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  
import com.badlogic.gdx.ApplicationAdapter;
import com.badlogic.gdx.Gdx;
import com.badlogic.gdx.InputAdapter;
import com.badlogic.gdx.backends.lwjgl.LwjglApplication;
import com.badlogic.gdx.graphics.Color;
import com.badlogic.gdx.graphics.GL10;
import com.badlogic.gdx.graphics.Pixmap;
import com.badlogic.gdx.graphics.Pixmap.Blending;
import com.badlogic.gdx.graphics.Pixmap.Format;
import com.badlogic.gdx.graphics.Texture;
import com.badlogic.gdx.graphics.g2d.SpriteBatch;
import com.badlogic.gdx.math.MathUtils;

public class MiniQuests extends ApplicationAdapter {
   private SpriteBatch batch;
   private Pixmap pixmap;
   private Texture texture;
   private Color color = new Color(1, 1, 1, 1);

   public void create () {
      Pixmap.setBlending(Blending.None);

      batch = new SpriteBatch();
      pixmap = new Pixmap(40, 30, Format.RGB565);
      texture = new Texture(MathUtils.nextPowerOfTwo(pixmap.getWidth()), MathUtils.nextPowerOfTwo(pixmap.getHeight()),
         Format.RGB565);

      Gdx.input.setInputProcessor(new InputAdapter() {
         public boolean touchDown (int x, int y, int pointer, int button) {
            // Do something!
            return true;
         }
      });
   }

   public void render () {
      for (int x = 0; x < pixmap.getWidth(); x++) {
         for (int y = 0; y < pixmap.getHeight(); y++) {
            color.r = MathUtils.random(0, 1);
            color.g = MathUtils.random(0, 1);
            color.b = MathUtils.random(0, 1);
            pixmap.setColor(color);
            pixmap.drawPixel(x, y);
         }
      }
      texture.draw(pixmap, 0, 0);

      Gdx.gl.glClear(GL10.GL_COLOR_BUFFER_BIT);

      batch.disableBlending();
      batch.begin();
      batch.draw(texture, 0, 0, Gdx.graphics.getWidth(), Gdx.graphics.getHeight(), 0, 0, pixmap.getWidth(), pixmap.getHeight(),
         false, false);
      batch.end();
   }

   public static void main (String[] args) throws Exception {
      new LwjglApplication(new MiniQuests(), "", 800, 480, false);
   }
}


To run on Android, remove the main method and use:

1  
2  
3  
4  
5  
6  
public class MiniQuestsAndroid extends AndroidApplication {
   public void onCreate (Bundle savedInstanceState) {
      super.onCreate(savedInstanceState);
      initialize(new MiniQuests(), false);
   }
}


To setup your dev environment for libgdx:
http://code.google.com/p/libgdx/wiki/ProjectSetup

Note running the above code shows random pixels at 60fps and may give you a seizure, so don't do more than glance at it (seriously). It is usually not advised to upload to a texture every frame, as this is slow, but since your texture is tiny and that is pretty much all your game is doing, you'll be fine. You only need to draw the pixmap to the texture after you change the pixmap. I stuck in the bit of code you need to handle input. Just stick in your game and go! Cheesy

Offline dishmoth
« Reply #29 - Posted 2011-12-16 10:29:04 »

Here's the libgdx code to draw a bitmap full screen:

Thanks!  I'm hoping I'll have the chance to install assorted dev kits later today.  "Hello World" here we come!

Something I've been meaning to ask:  Is there a good argument either way for using libgdx rather than dealing with Android directly for this project?  As you say, there's not much more to it than drawing a bitmap and reading inputs.  I'll almost certainly use libgdx for any future Android stuff, but I'm wondering whether it's overkill in this case.

Any opinions?

(Actually, whichever approach let's me lock to 30 frames-per-sec most easily probably wins. Wink )

Simon

Pages: [1] 2 3
  ignore  |  Print  
 
 

 
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!