Java-Gaming.org Hi !
Featured games (87)
games approved by the League of Dukes
Games in Showcase (649)
Games in Android Showcase (181)
games submitted by our members
Games in WIP (699)
games currently in development
News: Read the Java Gaming Resources, or peek at the official Java tutorials
 
   Home   Help   Search   Login   Register   
  Show Posts
Pages: [1] 2
1  Games Center / WIP games, tools & toy projects / Re: Shard Master Classic - WIP on: 2015-12-21 18:20:01
Wow. Don't you think that as time goes on and the game become larger, a need for faster graphic processing/rendering will be needed?
2  Games Center / WIP games, tools & toy projects / Re: Shard Master Classic - WIP on: 2015-12-21 03:55:50
Wow I love it! Really reminds me of Runescape! Awesome work. How long have you been working on this project and are you using an engine under your engine (like LWJGL)?

LWJGL is not an engine.

Library*, sorry.

Thank you so much! I've been working on this for maybe two months now. No I am using purely my own engine and the standard JRE, no external libraries used, which also means that this is not hardware accelerated so all the graphics are processed on the CPU haha.

Wait, so are you not using OpenGL? Shocked
3  Games Center / WIP games, tools & toy projects / Re: Shard Master Classic - WIP on: 2015-12-21 00:00:52
Wow I love it! Really reminds me of Runescape! Awesome work. How long have you been working on this project and are you using an engine under your engine (like LWJGL)?
4  Games Center / WIP games, tools & toy projects / Re: (Another) Terraria-Clone on: 2015-12-20 22:23:10
Just released a video showcasing the current features in the game and what I plan on working on next!

Video Link: https://www.youtube.com/watch?v=-z4o8CwJR8EMmB9b5njVbA

Let me know what you think!
5  Discussions / Business and Project Management Discussions / Re: Looking for a team to develop games with. (1 wip game) on: 2015-12-20 22:11:50
I personally don't want to join because I am busy with other projects, but I think you should really provide more information on your game. All you said is it's "this" and "I plan on adding some more awesome features"... well what features, do you have a plan for the game laid out? Who is managing this team? If you're managing it, how do you plan on splitting up the work? Etc, etc. I typically don't join teams unless the project manager has a well designed, laid-out plan. Just some suggestions.
6  Games Center / WIP games, tools & toy projects / Re: (Another) Terraria-Clone on: 2015-12-17 15:07:15
Hey everyone, it's been a long time since I last posted an update to this game and that's because college kind of took over most of my time. Now that I am on winter break, I have began continuing development of the game. Over the past 24 hours I managed to implement procedural generation of caves, ores, and trees. The cave generation values need to be played with a tad, but as of right now, it works great. You can see a picture of the updates below. Let me know what you guys think!

7  Games Center / WIP games, tools & toy projects / Re: Questica -- A procedurally generated rpg adventure! on: 2015-10-06 21:32:32
The art is fricken beautiful. Great job!
8  Games Center / WIP games, tools & toy projects / Re: (Another) Terraria-Clone on: 2015-10-05 22:14:57
So I added the inventory and item system to the game! I also added drops when breaking blocks. Here is an image of what it looks like currently. The next thing to do is to add the ability to place blocks based on what is selected in the inventory. Let me know what you guys think!

9  Games Center / WIP games, tools & toy projects / Re: (Another) Terraria-Clone on: 2015-09-30 04:22:59
So today I made some updates to the UI system and how I believe it will work. I got rid of the ugly arrow buttons that move around the player and switched them with "joysticks" where dragging the left joystick horizontally will move you left and right and dragging upwards will make the player jump. I also added a joystick to the right side that is used to break blocks and in the future, attack monsters and other actions. It works by dragging the joystick in the desired direction that you intend on breaking the block. It will also highlight the block that you are attempting to break so you know what you're aiming at. You can see it in the picture below. The arrow on the right side switches between placing torches and destroying blocks by clicking the screen. This is completely for debugging purposes and will be removed. Let me know what you guys think!

10  Games Center / WIP games, tools & toy projects / Re: (Another) Terraria-Clone on: 2015-09-28 23:49:29
My recursive method was actually quite efficient like you said (it acted just like yours, spreading out from a source), but as the number of light sources grew, the amount of method calls grew a lot as well. Method calls are much slower than iterating.

Recursion is great when the language has tail-recursion optimization. However, Java does not.

Regardless of our lighting methods, both recursion and raycasting work quickly. I also mainly chose raycasting after recursion because I disliked my diamond-shaped lights that recursion had, not because recursion was slow.

Yeah I do hate the diamond shape. I may possibly look into that line algorithm later and do some benchmark tests to see what lighting method's more effective. Now that I've got the system working efficiently though I'm going to stick with it.  Smiley
11  Games Center / WIP games, tools & toy projects / Re: (Another) Terraria-Clone on: 2015-09-28 23:38:11
-snip-

Haha I guess that depends on your definition of huge. My world currently has 1,620,000 tiles in it which I would personally say is pretty huge. Why would work size depend on whether to use the raycasting method or not?

I think I must've made an error. World size doesn't matter, but it's how many tiles on-screen at once that matters for updating. My raycasting technique is more-so a Bresenham line algorithm except counting down a light value for brightness. It works a lot faster (and prettier) than the recursive way because it's not constantly calling functions. My bad! Tongue

Oh okay I can understand that more, but in my recursive fill algorithm the amount of tiles on the screen doesn't matter. This leads me to believe that your algorithm, potentially, iterates through all of the tiles on the screen. I would assume that you raycast around the source of the light but I'm not familiar with the Bresenham line algorithm so I'll have to look into it.  

I also don't think that you can say that because a method is recursive, it is therefore slower than a non-recursive method. The fact that it calls a method over and over doesn't slow down the algorithm unless you're comparing it to another algorithm where there are less statements being called on. This really comes down to comparing two algorithms runtime with, say, Big O notation.

For example, say we are trying to sort an array of 1000 elements and we have the option to use the iterative bubble sort method or the recursive merge sort method. You can calculate the Big O runtime for each and see that the merge sort performs extremely faster than bubble sort. You can also do benchmark tests to get the same results. The fact that a method is recursive doesn't slow down the speed and in some cases can make an algorithm more readable.
12  Games Center / WIP games, tools & toy projects / Re: (Another) Terraria-Clone on: 2015-09-28 22:40:14
Well my game http://www.java-gaming.org/topics/iconified/35090/view.html has a max map size of 68,719,476,704 X 68,719,476,704 xD total map size on disk 17GB xD

Well I can't say I have tried maxing it out so Ill do that later tonight and let you know. I'm also targeting this for mobile which is a huge difference when you compare CPU and how much memory each can handle
13  Games Center / WIP games, tools & toy projects / Re: (Another) Terraria-Clone on: 2015-09-28 22:12:38
My philosophy right now is to ignore the cosmetics of the game and focus strictly on the fundamentals and background services of it. I'll worry about the cosmetics when the game is fundamentally sound.

Yup, sounds just like the opposite of how I normally do things Roll Eyes

Recursion can either be pretty efficient or not so much depending on your method of execution. If you're doing repeated method calls for recursion, it works but it's not the fastest. A faster way would be to iterate through a queue, but seeing as your game doesn't have as huge of a world as I did it's not a big deal right now.

Haha I guess that depends on your definition of huge. My world currently has 1,620,000 tiles in it which I would personally say is pretty huge. Why would work size depend on whether to use the raycasting method or not?
14  Games Center / WIP games, tools & toy projects / Re: (Another) Terraria-Clone on: 2015-09-28 20:58:34
My mistake! Fixed the pictures. I am not using a raycasting algorithm, I figured a grid-based recursive fill algorithm would work efficiently (which it does). The system doesn't currently support different colored lights but it's definitely something I'd like to add in the future and something I already know how I'd do.

My philosophy right now is to ignore the cosmetics of the game and focus strictly on the fundamentals and background services of it. I'll worry about the cosmetics when the game is fundamentally sound.
15  Games Center / WIP games, tools & toy projects / Re: (Another) Terraria-Clone on: 2015-09-28 20:06:06
Just finished the algorithm that removes the lighting generated by a light source. The important thing with my lighting system is that, unlike most other light systems, my system doesn't have light sources generate a dynamic light value each frame. We can assume that light sources only change when they are modified (broken, placed, or moved) so there is no need for a light source to generate light values every frame. My system generates a dynamic light value once after the light source is placed. It removes the generated light once the light source is removed (broken). It cuts down on resource-usage and makes the game run a lot faster. It also works very well with multiple lights placed next to eachother. Here are images of the lighting system in action, starting from one light source, adding more, breaking some surround blocks, and then removing them. Let me know what you guys think!







16  Games Center / Featured Games / Re: RFLEX *Available on Steam* on: 2015-09-28 13:50:43
If you want to get more publicity make a port to Android! This would take off
17  Games Center / WIP games, tools & toy projects / (Another) Terraria-Clone on: 2015-09-25 15:48:39
Yes, here is yet another Terraria-clone (currently unnamed until I come up with a specific direction) that I am developing using LibGDX. Unlike most other clones, my main focus for the game is to optimize it as much as possible to allow it to be played smoothly on mobile (Android) devices. Because of this my sole focus is to design complex algorithms to keep the amount of resources and memory being used as low as possible. For example, the two big things that I am currently focusing on optimizing are the world management system and the lighting system. Right now I have the world management system pretty much done. I am able to have a world with 1,620,000 tiles managed efficiently and ran on an Android device at a stable 30 fps. I also developed my own physics system which efficiently handles collisions for all entities in the world. The basis of the lighting system is done but I need to work on the removal of light when it is surrounded by other lights.

Current Features
  • World Management System
  • Procedural World Generation
  • Physics System
  • Lighting System
  • Saving and Loading Worlds
  • Block Breaking System
  • Item and Inventory System
  • Crafting System

Current Focus
  • Working on the procedural generation of the world.

Stream
I live stream development of the game whenever I am working on it. You can watch my streams here. Be sure to sign up and follow me to get notified when I am streaming. I stream everyday for a few hours a day!

Video Feature Showcase - December 19th, 2015
https://www.youtube.com/watch?v=-z4o8CwJR8E

Update #3 - December 17th, 2015
I managed to implement procedural generation of caves, ores, and trees. The cave generation values need to be played with a tad, but as of right now it works great. You can see a picture of the updates below. Let me know what you guys think!



Update #2 - October 5th, 2015
So I added the inventory and item system to the game! I also added drops when breaking blocks. Here is an image of what it looks like currently. The next thing to do is to add the ability to place blocks based on what is selected in the inventory. Let me know what you guys think!




Update #1 - September 30th, 2015
Here are some images of the game. The first image is a picture of the lighting system as of a day ago. The second image is a picture of the lighting system as of two days ago.





As I further the lighting system I will be posting more pictures and videos. Let me know any suggestions and comments you have!
18  Game Development / Game Mechanics / Re: Efficient Terraria-Like 2D Lighting on: 2015-09-24 14:46:41
I'm using a two pass process, with a light-mask rendered over the whole scene in a second pass. It works fine. You can see the results over there:

http://www.java-gaming.org/topics/the-hunt-for-the-lost-rainbow-jewels/36637/msg/348681/view.html#msg348681


That looks awesome! I think the main reason I don't want to do that type of lighting though is because I want the blocks to occlude light (to diminish light when it passes them). This algorithm I modified let's me do it very efficiently, especially when a block is removed in the light and the light needs to be recalculated.

Edit: Here is a new update from the lighting I've been working on. I also added in basic walls to go behind the blocks.



I'm now working on removing lights which is being a pain with the calculations when more than one light source is next to eachother. I also have to fix the way that the sun generates light down onto the ground because my algorithm now doesn't work how it should when a block is modified.
19  Game Development / Game Mechanics / Re: Efficient Terraria-Like 2D Lighting on: 2015-09-24 12:17:41
Looks great! How did you do the lightning effect? With masking?

I actually just used basic coloring tinting! So in a way this may be see as a mask but this allowed me to create the light effect with only one draw pass and save a LOT of performance. I'm using LibGDX as the backend so, if you're familiar with it, I just set the spritebatch's color to a shade of black dependent on the amount of light coming in.
20  Games Center / WIP games, tools & toy projects / Re: TritonForge || 2D RPG Sandbox (DOWNLOAD V2 NOW-AutoUpdater!) on: 2015-09-24 05:22:57

Do you mean all at once? Like straight across the top?

Yeah how do you determine what is the top layer? Do you have a skype I could message you over? I'm making a game similar to terraria and it'd be great to ask you how you handled a few things with the lighting. I have the basis down just need to brainstorm some more ideas to questions I have

Drey.Warde is my skype, but this has a pretty simple explanation anyway. lighting doesn't go top down, it goes in all directions at once. now if in your version it goes top down nothing changes really.

each block has a variable known as "castslight".

on block property updates, the engine will see if the block is a type that should cast light (I.E Air, torch).

If the value is false, then the light tile corresponding to that block remains completely dark.

If the block does cast light however, the flood fill algorithm starts from that block, and the goes for the whole screen.

Right I understand that, that is how any light source would work. I mean on the top of the world, when the "sun shines down on the world" it lights up the ground to a certain extent. I am curious how you handle this. I currently have a system in to light individual columns of tiles in the world but the difficulty is updating the light if, for example, another tile is set above the original highest tile.
21  Games Center / WIP games, tools & toy projects / Re: TritonForge || 2D RPG Sandbox (DOWNLOAD V2 NOW-AutoUpdater!) on: 2015-09-24 01:18:19

Do you mean all at once? Like straight across the top?

Yeah how do you determine what is the top layer? Do you have a skype I could message you over? I'm making a game similar to terraria and it'd be great to ask you how you handled a few things with the lighting. I have the basis down just need to brainstorm some more ideas to questions I have
22  Games Center / WIP games, tools & toy projects / Re: TritonForge || 2D RPG Sandbox (DOWNLOAD V2 NOW-AutoUpdater!) on: 2015-09-24 00:31:47
How exactly do you handle the lighting on the tophone of your world? I am using a modification of that lighting algorithm you posted but I can't think of an efficient way to light the entire top of the world. Any tips?
23  Game Development / Game Mechanics / Re: Efficient Terraria-Like 2D Lighting on: 2015-09-23 23:56:23
Excited to say that I've implemented the basis of the lighting system! It is tile based like I said and it also "crawls" along areas when blocks aren't in their way. I used a portion of the algorithm provided here and modified it to fit my system.

Here is an image of the lighting so far:


I have to add in the handling of breaking/placing blocks and updating the light efficiently.
24  Game Development / Newbie & Debugging Questions / Re: LibGDX Saving Chunks To Files? on: 2015-09-23 22:08:07
If you want compression you could also have the save file be a zip archive and each chunk (or group of chunks) as a ZipEntry.

True. It really just depends on how expensive you want the saving method to be and then how compressed you want the data to be.
25  Game Development / Newbie & Debugging Questions / Re: LibGDX Saving Chunks To Files? on: 2015-09-23 21:44:32
Its funny you posted this question because I implemented this into my game yesterday in about an hour. I used a different method called RLE (Run Length Encoding) to compress the amount of data being saved to the file. What I did was each chunk of the world has its own save file with the name of the file being "chunk<x>_<y>". It goes through each row of the chunk's tiles and uses the RLE compression method.

The way that the RLE compression works is it takes a common pattern and compresses it for you. There are many ways to implement and interpret the compression method but I'll explain to you my implementation. So say that you have 10 blocks with the ID 5 in a straight line in a row. Instead of formatting those 10 blocks as "5 5 5 5 5 5 5 5 5 5", where each number is the ID of the block, it instead formats as "5-10" where the first number is the ID and the second number is the amount of blocks in a row. So if you have a line that is "5 5 5 3 3 4 1 1 1 1 1 1" it would instead be saved as "5-3 3-2 4-1 1-6". This works very well for chunks that are large.

So my implementation goes through and does that for each row and then each line in the saved file is a corresponding row in the chunk. Here is my code:

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  
        public static void saveChunk(String worldFileName, Chunk chunk) {

                //.... I load the file and some other stuff up here. That's also why there is a try/catch

      try {
         String totalToken = Chunk.CHUNK_SIZE + " " + Chunk.CHUNK_SIZE + "\n"; //First line is the width and the height of the chunk  
         
         for (int y = 0; y < Chunk.CHUNK_SIZE; y++) { //Go through each row
            BlockType lastType = null;
            int sameCount = 0;
            for (int x = 0; x < Chunk.CHUNK_SIZE; x++) { //Go through each column
               BlockType type = chunk.getBlock(x, y); //Get the block type
               
               if (type == null) //In case it is null which it is in newly generated chunks
                  type = BlockType.AIR;
               
               if (lastType == null) //if it is the first instance because only the first run will be null
                  lastType = type;
               
               if (type == lastType) { //We're still counting the same blocktype
                  sameCount++;
               } else if (x != 0){ //We found a new blocktype. Save in format <id>-<count>
                  totalToken += lastType.getId() + "-" + sameCount + " "; //Add it to the row
                  sameCount = 1; //Restart the count
                  lastType = type; //Set the last type to our new type
               }
            }
            if (sameCount != 0) { //If there are values not saved and still counting at the end of the row before going to the next...
               totalToken += lastType.getId() + "-" + sameCount + "\n"; //Add it to the row
            } else {
               totalToken += "\n"; //Add the new line and continue to the next row
            }
         }
         handle.writeString(totalToken, false); //Write to file and dont append
      } catch (IOException e) {
         e.printStackTrace();
      }
   }


When loading it it is just the opposite

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  
public static Chunk loadChunk(FileHandle handle, int x, int y) {
      if (handle.exists()) {
         Chunk chunk = new Chunk(x, y); //Create a new chunk
         
         String[] rows = handle.readString().split("\n"); //Get all rows
         
         String[] dimensions = rows[0].split(" "); //Get the dimensions from the first line
         int width = Integer.parseInt(dimensions[0]); //get the width
         int height = Integer.parseInt(dimensions[1]); //get the height
         
         for (int i = 0; i < height; i++) { //Go through each row
            String[] rowData = rows[i + 1].split(" "); //Get each column information. + 1 so that we skip the dimension row
            int xOffset = 0; //The offset from the last data count. Keeps track of what column (x) to set the block to
            for (int j = 0; j < rowData.length; j++) { //Go through each column entry
               String[] data = rowData[j].split("-"); //Split the id and count
               int id = Integer.parseInt(data[0]); //Get the ID
               int count = Integer.parseInt(data[1]); //Get the count
               for (int k = 0; k < count; k++) {
                  chunk.setBlock(BlockType.values()[id], xOffset + k, i); //Set the block
               }
               xOffset += count; //Add the column count
            }
         }
         chunk.setGenerated(true);
         return chunk;
      }
      return null; //Chunk file doesn't exist
   }


Hopefully this helps out!
26  Game Development / Game Mechanics / Re: Efficient Terraria-Like 2D Lighting on: 2015-09-23 20:47:19
I'd try to do it with masking I guess. I have never done any lightning effects but I came across this site and favorited it for future use. Hopefully it helps you with your problem.

http://www.alcove-games.com/opengl-es-2-tutorials/lightmap-shader-fire-effect-glsl/

Yes I've used this in one of my published games, Undetected. Im not sure that I want the circular lighting anymore now though.
27  Game Development / Game Mechanics / Re: Efficient Terraria-Like 2D Lighting on: 2015-09-23 20:46:31
You could use an image mask: a transparent/colored circle that fades to black. Then just position that circle where you want a light to be. Google image search "game development lighting mask" for a bunch of results.

Or if you're using libGDX, just use Box2DLights.

Also, why would you need to light every tile in the game? You just have to light the ones you're drawing, which should only be the ones on the screen.

I never said that I was lighting every tile in the game at all times. Obviously I wouldn't do that. I said that every tile needs to be able to be lit. I think that I came up with a different idea for the tile-based lighting which I'm going to test out now. I don't think the circle lighting will look good in the game.
28  Game Development / Game Mechanics / Efficient Terraria-Like 2D Lighting on: 2015-09-23 00:52:39
I am working on a terraria-clone and I am aiming for it to be able to be run on most Android devices. I am able to generate a world, jump around, etc but I am not looking to add in some efficient lighting. In the past I have tried doing a tile-based lighting system but the project quickly came to an end after that because it dropped performance hugely. In that demo I was drawing a transparent black square over each tile and setting the alpha value dependent on surrounding lights. I envision that this will not be efficient on mobile so I don't even know if I want to go down that road. I don't need the shadows or anything like that (as of right now), I just need the lighting portion implemented. I have also looked at the other suggestions on the page here but am not sure which is the best option.

If tile-based lighting is the way to go I'd have to think of the best way to go about it. I don't think that it would be a problem to just have it work with a torch giving off light and only updating light values when a light source is added/removed, but when entities are incorporated I also have to think about how will I efficiently update an entities light value based off of surround light values. I have optimized the hell out of the game so far, with a world of 1,620,000 tiles being contained within it and getting a stable, smooth 30 fps even on mobile. I haven't attempted creating larger worlds than that but I don't see why, at this rate, it wouldn't be able to become any larger. I am trying to keep it as optimized as possible throughout development of the entire game so coming up with an efficient, optimized lighting system is essential.

Any suggestions are greatly appreciated. Thanks.
29  Games Center / WIP games, tools & toy projects / Re: TritonForge || 2D RPG Sandbox (DOWNLOAD V2 NOW-AutoUpdater!) on: 2015-09-13 17:39:14
Im curious, how does your lighting system work exactly?
30  Game Development / Networking & Multiplayer / Re: NitroNet - New, High-Level Networking Library on: 2015-09-13 15:48:50
The myths in this thread are trivial to debunk.
1  
2  
3  
4  
5  
6  
Socket s = new Socket(...);
OutputStream os = s.getOutputStream();
os.write(new byte[414 * 1024]);
os.flush();
os.close();
s.close();

No exception is thrown, all data is sent, there is no need to split your data into tcp-packets by yourself, the TCP layer does that for you.


As for checksums: this is (hopefully!) not about information integrity, but about data integrity. Even with TLS your (generated?) private key is on the client's machine, so it's all hackable. What actually happens IRL however, is that the IP-packet checksum is merely checking the packet header, not the payload. Adding a checksum to the payload is ensuring that the data that the client sent (however malicious) is verifiable by the server as what the client intended to send. CRC32 is enough for this, as we're checking for TCP payload-corruption, not an attack of any sort.

Data integrity, information integrity (signatures) and information secrecy (encryption) are entirely different topics. That SSL/TLS incorporates them all does not imply SSL/TLS is the right tool if one merely needs integrity. If you need information integrity, as to prevent a man-in-the-middle from altering your data, there is no need to add encryption to the mix. You can cryptographically sign raw data just fine and send it over the wire. There is just this pesky problem of which public keys you deem trustworthy to verify the signatures. In the end it's about trusting a session, not a party and especially not a packet.

Anyway, the amount of misinformation on which this library was built, does not bode well for its potential users.

Yes it is completely about data integrity and I am indeed using CRC32. It has no function in preventing attacks. I currently don't have SSL implemented but I am going to try to work on an implementation for it.
Pages: [1] 2
 
KaiHH (83 views)
2016-01-31 23:15:29

sci4me (110 views)
2016-01-23 21:47:05

sci4me (97 views)
2016-01-23 21:46:58

KaiHH (130 views)
2016-01-19 13:26:42

theagentd (216 views)
2016-01-05 17:10:00

ClaasJG (231 views)
2016-01-03 16:58:36

chrisdalke (220 views)
2015-12-28 06:31:21

Guerra2442 (240 views)
2015-12-25 03:42:55

Guerra2442 (244 views)
2015-12-25 03:27:21

theagentd (287 views)
2015-12-21 14:43:24
List of Learning Resources
by SilverTiger
2016-02-05 09:39:47

List of Learning Resources
by SilverTiger
2016-02-05 09:38:38

List of Learning Resources
by SilverTiger
2016-02-05 09:35:50

Rendering resources
by Roquen
2015-11-13 14:37:59

Rendering resources
by Roquen
2015-11-13 14:36:58

Math: Resources
by Roquen
2015-10-22 07:46:10

Networking Resources
by Roquen
2015-10-16 07:12:30

Rendering resources
by Roquen
2015-10-15 07:40:48
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!