Java-Gaming.org Hi !
Featured games (83)
games approved by the League of Dukes
Games in Showcase (593)
Games in Android Showcase (168)
games submitted by our members
Games in WIP (647)
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 3 ... 11
1  Game Development / Newbie & Debugging Questions / Re: How do you stop this behavior in JFileChooser? on: 2015-06-24 05:58:43
Okay, I figured it out. I got myself a clue to fix this, thanks to this post here.

First, you need to have a method capable of returning a JList full of all Components in JFileChooser:

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
@SuppressWarnings("unchecked")
private JList<Class<?>> findFileList(Component comp){
   if (comp instanceof JList){
      return (JList<Class<?>>) comp;
   }
   if (comp instanceof Container){
      for (Component c : ((Container) comp).getComponents()){
         JList<Class<?>> list = findFileList(c);
         if (list != null){
            return list;
         }
      }
   }
   return null;
}


Next, you can then remove all MouseListeners, including MouseListeners associated with double-clicks. Unfortunately, this will also remove the ability to double-click on files you actually want to open. I added back in a custom MouseListener that you can use to handle those scenarios.

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  
final JFileChooser opener = new JFileChooser();
JList<Class<?>> list = findFileList(opener);
LOOP_TEMP1: for (MouseListener l : list.getMouseListeners()){
   if (l.getClass().getName().indexOf("FilePane") >= 0){
      list.removeMouseListener(l);
      list.addMouseListener(new MouseListener(){
         @Override
         public void mouseClicked(MouseEvent e) {
            if (e.getClickCount() == 1){
               File file = opener.getSelectedFile();
               if (file != null){
                  MetalFileChooserUI ui = (MetalFileChooserUI) opener.getUI();
                  ui.setFileName(file.getName());
               }
            }
            else if (e.getClickCount() == 2){
               File file = opener.getSelectedFile();
               if (file != null){
                  if (file.isDirectory()){
                     opener.setCurrentDirectory(file);
                  }
                  else if (file.isFile()){
                     opener.setSelectedFile(file);
                  }
                  BasicFileChooserUI ui = (BasicFileChooserUI) opener.getUI();
                  ui.setFileName(file.getName());  
               }
            }
         }
         @Override
         public void mouseEntered(MouseEvent e) {
         }
         @Override
         public void mouseExited(MouseEvent e) {
         }
         @Override
         public void mousePressed(MouseEvent e) {
         }
         @Override
         public void mouseReleased(MouseEvent e) {
         }
      });
      break LOOP_TEMP1;
   }
}


That fixes the issue. Now, the user has to press the "Open" or "Save" button, depending on what dialog was shown by JFileChooser, and it's all good to go.
2  Game Development / Newbie & Debugging Questions / How do you stop this behavior in JFileChooser? on: 2015-06-24 02:49:48
I got to try this new GIF video player. Never saw this before when I returned 4 days ago.

Click to Play


When I double-click on a file or a folder, the text field pointed out by the red rectangle will be filled in with the full absolute path to that file/directory. I would like to remove that behavior.

This is my attempt:

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
JFileChooser opener = new JFileChooser();
opener.setFileSelectionMode(JFileChooser.FILES_AND_DIRECTORIES);
opener.setCurrentDirectory(FileControl.lastSavedDirectory);
opener.setFileFilter(new FileNameExtensionFilter("PNG files", "png"));
opener.addPropertyChangeListener(new PropertyChangeListener(){
   public void propertyChange(PropertyChangeEvent event){
      if (JFileChooser.SELECTED_FILE_CHANGED_PROPERTY.equals(event.getPropertyName())){
         JFileChooser chooser = (JFileChooser) event.getSource();
         File selectedFile = chooser.getSelectedFile();
         MetalFileChooserUI chooserUI = (MetalFileChooserUI) chooser.getUI();
         if (selectedFile != null && chooserUI instanceof BasicFileChooserUI){
            chooserUI.setFileName(selectedFile.getName());
         }
      }
   }
});
opener.setVisible(true);


It works when I click on a file or directory folder 1 mouse button click at a time, but when I double-click it, the issue remains unsolved. Can anyone help me fix this?
3  Game Development / Newbie & Debugging Questions / Re: Issue with reading a file that was generated when JAR is run for second time on: 2015-06-24 01:25:36
Yes! I totally forgot FileInputStream.

Thank you! I used a Boolean flag to separate script loading. Results:

1  
2  
3  
4  
5  
6  
if (isModdedScript){
            reader = new BufferedReader(new InputStreamReader(new FileInputStream(new File(filename))));
         }
         else {
            reader = new BufferedReader(new InputStreamReader(Script.class.getClassLoader().getResourceAsStream(filename)));
         }
4  Discussions / Miscellaneous Topics / Re: What I did today on: 2015-06-24 01:08:20
Man, I suck so bad today.
5  Game Development / Newbie & Debugging Questions / Issue with reading a file that was generated when JAR is run for second time on: 2015-06-23 05:41:35


The "mod" folder, shown above, is generated at run-time during the second time I execute the JAR. That means, this "mod" folder does not exist in the CLASSPATH of the JAR file.

The "mod" file structure is like this:



I've been trying to get the "aas.script" be fed into the BufferedReader, like so:

1  
BufferedReader reader = new BufferedReader(new InputStreamReader(Script.class.getClassLoader().getResourceAsStream(filename)));


The BufferedReader code works normally, as shown here:



Is there some other way that I am unaware of that lets me read a file generated outside of the JAR file (particularly when the JAR is in the /bin/ folder of my project root folder)?

Thanks in advance.
6  Discussions / Miscellaneous Topics / Re: What I did today on: 2015-06-20 23:26:31
What I did during my 1 year absent, was one of many projects:

I made a Twitch plays Pokemon bot.
7  Discussions / General Discussions / Re: Need to get TAB key bind to Word Completion and have it insert TAB character. on: 2015-06-19 17:16:11
I am at a loss of words right now.
Let me sit here, and ponder about life.

We.. were you just looking for the auto-complete key? xD

Yes, regrettably.
8  Discussions / General Discussions / Re: Need to get TAB key bind to Word Completion and have it insert TAB character. on: 2015-06-19 16:46:01
I don't think I'm understanding you correctly, but tab is for... well tabbing code over, and the spacebar is the default way of auto-completing words.

I am at a loss of words right now.

Let me sit here, and ponder about life.
9  Discussions / General Discussions / Re: Need to get TAB key bind to Word Completion and have it insert TAB character. on: 2015-06-19 15:47:39
I am still fumbling around with the Keys in the Preferences. TAB key is inserting TAB characters as normal.

Currently, I need to unbind TAB key from Word Completion, in order for TAB key to work normally. (Inserting TAB characters.) But, Word Completion is something I always use. I habitually type TAB to get it to complete a word, and I don't know any other keys that could work with Word Completion without affecting its original behavior.

10  Discussions / General Discussions / Need to get TAB key bind to Word Completion and have it insert TAB character. on: 2015-06-19 15:14:09
Before on my old computer using an older Eclipse IDE, I was able to use TAB key to alternate between Word Completion and insert TAB character. It was pretty much the same as Visual Studio, and I love it. Now, I lost that older version, downloaded the latest IDE, and was dumbfounded by the lack of TAB characters and multiple Windows alert sounds. It used to be TAB for Word Completion after Content Assist pops up, and then TAB for TAB characters while editing text, with no Content Assist popping up.

Seriously, this is unproductive for me. It's like a sushi chef has lost its taste of sashimi, an artist who lost its sense of art, and an athlete who felt a muscle is feeling wrongly.

Where can I find alternatives? Plugins, other Java IDE with TAB characters and TAB key bound to Word Completion, anything. I am so used to Visual Studio's TAB Word Completion + TAB character, if I separate from it, I'd be dying in my own arms.

I'm breaking down guys. Please help me. I beg anyone!  Cry  Cry Cry
11  Discussions / Miscellaneous Topics / Re: What I did today on: 2015-06-19 00:34:08
I have updated my Pokémon Walking to v20.

I have lost my memory on this project, so I need to put 135% effort on my part to learn what does what. It's hell, I tell ya.

Glad to see you back!

Yep! Just one problem. I have no idea Eclipse disabled the TAB key for indentation. I can no longer insert TAB characters. There seems to be a conflict with Word Completion and plain inserting tabs.

OMG, I guess I've lost touch.

I better change my Java experiences back to less than 1 week.
12  Discussions / Miscellaneous Topics / Re: What I did today on: 2015-06-18 22:50:39
I have updated my Pokémon Walking to v20.

I have lost my memory on this project, so I need to put 135% effort on my part to learn what does what. It's hell, I tell ya.
13  Games Center / WIP games, tools & toy projects / Pokémon Walking, update v20 - Script Editor on: 2015-06-18 22:19:02


Script Editor is finally implemented. Note that it's not finished, so it's still on the back burner.

Unfortunately for this project, since it's been almost 1 year since I last touched this, I forgot entirely what has changed between v19 (Thread link here) and this latest version. The only thing worth mentioning are these:

  • New Script Editor!
  • New Level Editor layout changes
  • Developer suffered amnesia!

So there you have it! Cheesy



Note that the project is still on SUPER-LOW priority right now for me. I am really putting a lot of my focus on my Master's degree, but when I'm procrastinating, I will get back to continuing this project.

If anyone is willing to help/contribute to this project, please post a comment below, and I will get back to you.

Github:

https://github.com/tommai78101/PokemonWalking



Downloads:

Walking v20: http://www.thehelper.net/attachments/walking_v20-zip.18776/

Editor v6: http://www.thehelper.net/attachments/editor_v6-zip.18777/
14  Discussions / Miscellaneous Topics / Abusing the use of letter salutations. on: 2014-08-08 21:38:44
I have been using "To whom it may concern," so frequently to the same recipient, I feel like I'm abusing it.

You know that in business and formal letters and emails, letter salutations are very important when addressing someone you are inquiring to. Upon checking for more info about this, I see there are plenty of other salutations I can use, like "Dear" or "Dear Sir or Madam", or even a simple "Hi".

But for my problems I'd like to inquiry, I want anyone to help solve my issues. In that case, should I continue to use the "To whom it may concern" salutation?
15  Discussions / Miscellaneous Topics / Bought myself a new smartphone! on: 2014-07-10 15:49:33
HTC One (M8).

Ah, the 2.3 GHz quad-core CPU laptop-as-a-phone in the palm of my hand.
16  Discussions / Miscellaneous Topics / Re: What I did today on: 2014-07-09 16:42:43
I am currently in the process of applying for insurances. I feel like wanting to take a break completely after going through mundane applications and traveling.

On a good note, I have placed a project up in the Showcase section. I call it the "Marble Run". The game itself is completely finished, and it's not 100% polished.

To be honest, I loved the concept, but I hate developing it. It contains many nightmares and bad memories of someone else I don't even want to go over. I'm moving on from it, never to return to it to finish polishing it. It's more like my ex, but it's even more darker than that. So, yeah.



EDIT: I just realized I posted in the wrong subforum.  Cranky
17  Games Center / Android Showcase / [Mostly Completed / Shelved Indefinitely] [Android] Marble Run on: 2014-07-09 16:37:30


Title: Marble Run
Latest Stable Build: Alpha 0.6c (Final)
Minimum Requirements: Android 2.1 and up. Requires accelerometer.



Download:
http://www.thehelper.net/attachments/marble_run0-6c-apk.18066/



Description:

This is an Android game, created for my Computer Science project. It uses the accelerometer sensor inside Android smartphones and devices to interact and play. The accelerometer controls a red ball. Tilting and turning your device will make the ball to move around.



How to play:

To play, hold your device parallel to a table or a floor. Slowly tilt the device towards the direction where you wanted to go to, until you see the ball starts moving. Collect coins on your way to earn points for your score. Try to get the ball to the hole to advance to the next stage.



More information (Known Issues, etc.) here:

https://github.com/tommai78101/Marble-Run



This work is Apache Licensed.
18  Discussions / General Discussions / Re: Untrusted - A Javascript Codable Game on: 2014-07-06 08:30:07
There goes my productivity for this weekend.
19  Game Development / Newbie & Debugging Questions / Re: Keyboard Controlled Menu (Speed is too fast) on: 2014-07-04 15:29:49
You need to detect if a single key input has been pressed, tapped, and check its last key input state. That's 3 things you need to check for.

For example, if I need to detect an "UP" key press, I would do this:

1  
2  
3  
4  
5  
6  
7  
8  
9  
10  
11  
12  
13  
14  
15  
16  
17  
18  
19  
20  
21  
//Mock game loop.
while (true){
     //...60 FPS

     //Somewhere in the beginning, all key inputs have its states cleared.
     UP.setKeyState(false);
     UP.setLastKeyState(UP.getKeyState());

     // --------------------------------------

     //User pressed the UP key...
     UP.setKeyState(true);

     // --------------------------------------

    //Detecting up key....
    if (UP.isPressed() && !UP.getLastKeyState()){
          UP.setLastKeyState(true);
          //Do something here...
    }
}


My own implementation:

InputHandler:
https://github.com/tommai78101/PokemonWalking/blob/master/src/main/InputHandler.java

Keys:
https://github.com/tommai78101/PokemonWalking/blob/master/src/main/Keys.java
20  Game Development / Newbie & Debugging Questions / Re: Tile Placing on: 2014-07-04 15:07:09
1  
2  
3  
//Some code...
ArrayList<Skyscraper> skyscraperList = new ArrayList<Skyscraper>();
//Some code...


1  
2  
3  
temp = new Skyscraper();
temp.placeSkyscraper(cursor.getX(), cursor.getY());
skyscraperList.add(temp);
 

Huh
21  Game Development / Newbie & Debugging Questions / Re: [Swing] Unable to update JList element's name on the fly while editing its name on: 2014-07-04 13:13:13
Fixed my issue with this Stack Overflow solution:
http://stackoverflow.com/questions/9865119/java-updating-jlist-after-changing-an-object

I feel like questions like these need to be rephrased again and again until it clicks.  Stare

22  Game Development / Newbie & Debugging Questions / [Swing] Unable to update JList element's name on the fly while editing its name on: 2014-07-04 12:46:59
The problem right now is the element's name is updated when I finished typing the new name in the text field and then clicking somewhere in the JList.

Current Problem (GIF):

Click to Play


I'm trying to update the element's name in the JList while I'm typing the new name in the text field when the element is being selected. That means, I'm updating the element's name in real-time.

Solution (GIF):

Click to Play


How do I achieve this? Thanks in advance.



Here's an SSCCE code I used for the creation of the GIFs, given below:

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  
66  
67  
68  
69  
70  
71  
72  
73  
74  
75  
76  
77  
78  
79  
80  
81  
82  
83  
84  
85  
86  
87  
88  
89  
90  
91  
92  
93  
94  
95  
96  
97  
98  
99  
100  
101  
102  
103  
104  
105  
106  
107  
108  
109  
110  
111  
112  
113  
114  
115  
116  
117  
118  
119  
120  
121  
122  
123  
124  
125  
126  
127  
128  
129  
130  
131  
132  
133  
134  
135  
136  
137  
138  
import java.awt.BorderLayout;
import java.awt.Component;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.DefaultListCellRenderer;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.event.DocumentEvent;
import javax.swing.event.DocumentListener;

public class Test extends JFrame implements DocumentListener, ActionListener {
   
   public static class Something {
      public String name;
   }
   
   public static class CellNameRenderer extends DefaultListCellRenderer {
      private static final long serialVersionUID = 1L;
     
      @Override
      public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected, boolean cellHasFocus) {
         JLabel label = (JLabel) super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus);
         Something something = (Something) value;
         label.setText(something.name);
         return label;
      }
   }
   
   private static final long serialVersionUID = 1L;
   JList<Something> list;
   JTextField textField;
   JButton addButton;
   boolean isSelected;
   
   public Test() {
      final Dimension listSize = new Dimension(200, 300);
      final Dimension textFieldSize = new Dimension(80, 10);
     
      list = new JList<Something>(new DefaultListModel<Something>());
      list.setMinimumSize(listSize);
      list.setPreferredSize(listSize);
      list.setCellRenderer(new CellNameRenderer());
     
      textField = new JTextField();
      textField.setMinimumSize(textFieldSize);
      textField.setPreferredSize(textFieldSize);
      textField.getDocument().addDocumentListener(this);
     
      addButton = new JButton("Add");
      addButton.addActionListener(this);
     
      JPanel panel = new JPanel();
      panel.setLayout(new BorderLayout());
     
      panel.add(list, BorderLayout.WEST);
      panel.add(textField, BorderLayout.EAST);
      panel.add(addButton, BorderLayout.CENTER);
     
      this.add(panel);
      this.pack();
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      this.setVisible(true);
   }
   
   public static void main(String[] args) {
      new Test();
   }
   
   @Override
   public void changedUpdate(DocumentEvent event) {
     
      /*
       * PROBLEM: COULD NOT GET THE ELEMENT TO CHANGE NAME ON THE FLY WITHOUT CLICKING.
       */

     
      if (!list.isSelectionEmpty()) {
         Something something = list.getSelectedValue();
         something.name = textField.getText();
         
         DefaultListModel<Something> model = (DefaultListModel<Something>) list.getModel();
         model.get(list.getSelectedIndex()).name = textField.getText();
         
         list.revalidate();
      }
   }
   
   @Override
   public void insertUpdate(DocumentEvent event) {
     
      /*
       * PROBLEM: COULD NOT GET THE ELEMENT TO CHANGE NAME ON THE FLY WITHOUT CLICKING.
       */

     
      if (!list.isSelectionEmpty()) {
         Something something = list.getSelectedValue();
         something.name = textField.getText();
         
         DefaultListModel<Something> model = (DefaultListModel<Something>) list.getModel();
         model.get(list.getSelectedIndex()).name = textField.getText();
         
         list.revalidate();
         
      }
   }
   
   @Override
   public void removeUpdate(DocumentEvent event) {
     
      /*
       * PROBLEM: COULD NOT GET THE ELEMENT TO CHANGE NAME ON THE FLY WITHOUT CLICKING.
       */

     
      if (!list.isSelectionEmpty()) {
         Something something = list.getSelectedValue();
         something.name = textField.getText();
         
         DefaultListModel<Something> model = (DefaultListModel<Something>) list.getModel();
         model.get(list.getSelectedIndex()).name = textField.getText();
         
         list.revalidate();
      }
   }
   
   @Override
   public void actionPerformed(ActionEvent event) {
      DefaultListModel<Something> model = (DefaultListModel<Something>) list.getModel();
      Something something = new Something();
      something.name = textField.getText();
      model.addElement(something);
   }
}


23  Discussions / Miscellaneous Topics / Re: What I did today on: 2014-07-04 11:03:26
Today I have set an appointment to see a dentist in order to take out an irritating wisdom tooth affecting my right jaw hinge area.

Currently, the swelling around the jaw hinge is causing mucus buildup near my esophagus, my nasal passage, and the right ear canal (creating earwax buildup and slight deafness).

If for some reason, I'm no longer updating my Pokémon Walking project in 1 month (as in, no activities in 1 month in the "testing" branch on Github), it means I may be dead. I probably need a volunteer in the future to notify Github that I'm dead and the project should be marked as "no longer active" or something.

This news article is what's scaring me, Man dies of toothache.
http://abcnews.go.com/Health/insurance-24-year-dies-toothache/story?id=14438171

Most of me being scared of this, Complications after extraction of tooth, such as Bleeding to death.
http://doctorspiller.com/Extractions/Extractions_4.htm

I don't have a death wish list, but I just wanted to see my Pokémon Walking be completed when I die.
24  Discussions / General Discussions / Re: Have you ever debug your programs/games on an emulator? on: 2014-06-25 01:22:07
This is a main caveat.
25  Discussions / General Discussions / Re: Have you ever debug your programs/games on an emulator? on: 2014-06-24 02:17:29
This might be a reasonable test if you don't have access to another machine, but you could also solicit testers with suitable hardware who want to try out the game.

This is the main problem when you're limited to certain devices (No Macbooks nearby, no iPhones). I don't like to solicit testers, since the action done is like commanding something to do something in a grateful, appreciative way.
26  Discussions / Miscellaneous Topics / Re: What I did today on: 2014-06-23 06:44:53
You're always there.

I just happened to jump into the top 16 in one day. How about that?  Pointing Cheesy
27  Discussions / Miscellaneous Topics / Re: What I did today on: 2014-06-23 02:16:51
I've made it on the JGO top 16's.

Take that trollwarrior1!!




28  Game Development / Newbie & Debugging Questions / Re: [Swing] How do I: Multiple JFrames approach to utilize multiple content editors? on: 2014-06-23 02:07:33
This is the reason why I don't want to use JDialogs over JFrames.

JDialogs can block UI event dispatch threads, which the World Editor in Exhibit A doesn't do. If using JFrames, users can simply switch to any editors can continue to work simultaneously. Also, because JDialogs do not have minimize/maximize buttons, they aren't really intuitive to clients.
29  Game Development / Newbie & Debugging Questions / Re: [Swing] How do I: Multiple JFrames approach to utilize multiple content editors? on: 2014-06-22 15:20:32
I don't know. I haven't thought too far ahead about this.

Currently, I just had "parent closes all, child closes itself" paradigm made, so I'm going to work on this and see.
30  Game Development / Newbie & Debugging Questions / Re: [Swing] How do I: Multiple JFrames approach to utilize multiple content editors? on: 2014-06-22 15:10:44
Just make sure to hold a pointer to the new JFrames.

Wouldn't that make the new JFrames not garbage collectable? From my current testing results, I never had any members holding references to the new child JFrames.

Unless, you mean that these multiple JFrames should be in a
parent <--> parent
relationship? Interchangeable JFrames seems very close to what Blizzard had done with their World Editors. Hm...
Pages: [1] 2 3 ... 11
 
deepthought (37 views)
2015-06-30 15:39:44

deepthought (41 views)
2015-06-30 15:39:09

deepthought (52 views)
2015-06-30 15:36:52

Za\'Anzabar (23 views)
2015-06-29 05:44:54

TritonDreyja (40 views)
2015-06-24 17:10:40

CopyableCougar4 (36 views)
2015-06-23 00:34:45

BurntPizza (42 views)
2015-06-21 20:36:46

cookiecompiler (85 views)
2015-06-11 15:42:53

cookiecompiler (48 views)
2015-06-11 15:41:14

NegativeZero (76 views)
2015-06-11 09:49:18
How Do I Expand My Game?
by bashfrog
2015-06-14 11:34:43

List of Learning Resources
by PocketCrafter7
2015-05-31 05:37:30

Intersection Methods
by Roquen
2015-05-29 08:19:33

List of Learning Resources
by SilverTiger
2015-05-05 10:20:32

How to: JGO Wiki
by Mac70
2015-02-17 20:56:16

2D Dynamic Lighting
by ThePixelPony
2015-01-01 20:25:42

How do I start Java Game Development?
by gouessej
2014-12-27 19:41:21

Resources for WIP games
by kpars
2014-12-18 10:26:14
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!