GPWiki.org
GPWiki.org
It is currently Tue May 21, 2013 3:05 am

All times are UTC




Post new topic Reply to topic  [ 8 posts ] 
Author Message
PostPosted: Mon Oct 04, 2010 3:41 pm 
Prolific Poster

Joined: Tue Jul 22, 2008 7:26 pm
Posts: 22
Hi there!

This was originaly posted in the anouncements forum, but it only had about 34 views and no replies...I'm also posting this here because I wasn't exactly sure where this should reall go sense this is a program announcement, but this is geared towards VB6 Users, so if a moderator could delete this post or the last post in the announcements, I would appreciate it, because I'm just not sure where to put this.

I'm still working on the examples... :)


I am so excited to show off, well, sort of, my first release of a Visual Basic 6.0 Type Library for XInput to be used with Microsoft's (or Mad Catz') XBox 360 Controller, written in the free Visual C++ 2008 Express Edition!

It's a little crude, and rough around the edges, but it at least has its basic functionality at it's core, and yes, the source code is provided in a WinRAR archive along with the GPadLib.dll!

I do not have a working VB6 example quite yet, because with these "little" projects for games that I start get out of hand and I turn a mole hill into a mountain! But from what I've been messing around with, the commands really do work.

All you have to do to use GPadLib.dll is to paste it into your VB98 directory after copying the GPadLib.dll file from wherever you extracted the .rar file to, go to GPad Lib\Release\GPadLib.dll.

Then it's as simple as the following,

1.) Start VB6 and create a Standard Project.
2.) On the Menu Bar at the top, click Projects>References.
3.) On the right hand side of the dialog, click browse.
4.) Locate the dll file in your VB98 directory, or wherever you put it, and double click it.
5.) If all is well, it was for me, it should be automatically imported to the list of VB6 Type Libraries, and enabled for the project...if it's not enabled then just click on the box to the left of GPad XInput Type Library for VB6, and close out the window.

To use it in your code, there's no need to use it as an object for you variables, because the way I coded it, I'm a noob in C++, so all you have to do is call the functions according to the documentation in the root folder of GPad Lib as if it was native to VB6.

Some files in the GPad Lib folders are for Visual C++ 6, because I started it in Visual C++ 6, forgetting that DirectX9 is only supported in the Visual Studio .NET editions, so I spent hours debugging it in MFC++ 6.0 and then eventually came to my senses and ported it to MFC++ 2008 Express Edition, Rebuild it, and it worked!

I'm sorry for not putting any comments in the C++ code, I was in a hurry to get this working, not that it was important. I just needed to add a little more to my self pride! It's been a little low lately with being $12,000.00 in dept to my parents for my $10,700.00 Car Note and $2,300.00 dept for the last 2 car insurance payments.

Anyway, inside the text document in the root folder is a list and a set of explanations of the commands and their usage in VB6.

If I could have a little help, or if someone could point me in the right direction at least of how I can get this to work like the DirectX8 Type Library, I would much appreciate it, and will update this post with each new release of the dll and eventually, hopefully, a VB6 example for testing XInput in GPad Lib and a small working example Game written in VB6...WITH COMMENTS!!!

So that those who do not want or feel like downloading the code, or just don't want to download right now and just want to see the C++ Code right away, here it is...

GPadLib.cpp:

Code:
#include <windows.h>
#include <XInput.h>

#define MAX_CONTROLLERS 4

struct GPAD_INFO
{

   bool IsConnected;
   XINPUT_STATE CurState;
   XINPUT_VIBRATION CurVibration;

};

GPAD_INFO GPad[MAX_CONTROLLERS];

bool __stdcall GPad_Poll(int player)
{
   DWORD dwResult = XInputGetState(player, &GPad[player].CurState);

   GPad[player].IsConnected = (dwResult == ERROR_SUCCESS);

   return GPad[player].IsConnected;
}

bool __stdcall GPad_ButtonA(int player)
{
   if (GPad[player].CurState.Gamepad.wButtons & XINPUT_GAMEPAD_A)
   {
      return true;
   }

   return false;
}

bool __stdcall GPad_ButtonB(int player)
{
   if (GPad[player].CurState.Gamepad.wButtons & XINPUT_GAMEPAD_B)
   {
      return true;
   }

   return false;
}

bool __stdcall GPad_ButtonX(int player)
{
   if (GPad[player].CurState.Gamepad.wButtons & XINPUT_GAMEPAD_X)
   {
      return true;
   }

   return false;
}

bool __stdcall GPad_ButtonY(int player)
{
   if (GPad[player].CurState.Gamepad.wButtons & XINPUT_GAMEPAD_Y)
   {
      return true;
   }

   return false;
}

bool __stdcall GPad_ButtonBack(int player)
{
   if (GPad[player].CurState.Gamepad.wButtons & XINPUT_GAMEPAD_BACK)
   {
      return true;
   }

   return false;
}

bool __stdcall GPad_ButtonStart(int player)
{
   if (GPad[player].CurState.Gamepad.wButtons & XINPUT_GAMEPAD_START)
   {
      return true;
   }

   return false;
}

bool __stdcall GPad_ButtonLBumper(int player)
{
   if (GPad[player].CurState.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_SHOULDER)
   {
      return true;
   }

   return false;
}

bool __stdcall GPad_ButtonRBumper(int player)
{
   if (GPad[player].CurState.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_SHOULDER)
   {
      return true;
   }

   return false;
}

bool __stdcall GPad_ButtonLThumb(int player)
{
   if (GPad[player].CurState.Gamepad.wButtons & XINPUT_GAMEPAD_LEFT_THUMB)
   {
      return true;
   }

   return false;
}

bool __stdcall GPad_ButtonRThumb(int player)
{
   if (GPad[player].CurState.Gamepad.wButtons & XINPUT_GAMEPAD_RIGHT_THUMB)
   {
      return true;
   }

   return false;
}

bool __stdcall GPad_ButtonDPadUp(int player)
{
   if (GPad[player].CurState.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_UP)
   {
      return true;
   }

   return false;
}

bool __stdcall GPad_ButtonDPadDown(int player)
{
   if (GPad[player].CurState.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_DOWN)
   {
      return true;
   }

   return false;
}

bool __stdcall GPad_ButtonDPadLeft(int player)
{
   if (GPad[player].CurState.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_LEFT)
   {
      return true;
   }

   return false;
}

bool __stdcall GPad_ButtonDPadRight(int player)
{
   if (GPad[player].CurState.Gamepad.wButtons & XINPUT_GAMEPAD_DPAD_RIGHT)
   {
      return true;
   }

   return false;
}

int __stdcall GPad_ButtonLeftTrigger(int player)
{
   return GPad[player].CurState.Gamepad.bLeftTrigger;
}

int __stdcall GPad_ButtonRightTrigger(int player)
{
   return GPad[player].CurState.Gamepad.bRightTrigger;
}

short __stdcall GPad_LStickX(int player)
{
   return GPad[player].CurState.Gamepad.sThumbLX;
}

short __stdcall GPad_LStickY(int player)
{
   return GPad[player].CurState.Gamepad.sThumbLY;
}

short __stdcall GPad_RStickX(int player)
{
   return GPad[player].CurState.Gamepad.sThumbRX;
}

short __stdcall GPad_RStickY(int player)
{
   return GPad[player].CurState.Gamepad.sThumbRY;
}

void __stdcall GPad_Rumble(int player, int left_speed, int right_speed)
{
   GPad[player].CurVibration.wLeftMotorSpeed = left_speed;
   GPad[player].CurVibration.wRightMotorSpeed = right_speed;

   XInputSetState(player, &GPad[player].CurVibration);
}


GPadLib.def:

Code:
LIBRARY GPadLib
DESCRIPTION "GPad XInput Library for Visual Basic 6.0."
EXPORTS
   GPad_ButtonA
   GPad_ButtonB
   GPad_ButtonX
   GPad_ButtonY
   GPad_ButtonBack
   GPad_ButtonStart
   GPad_ButtonLBumper
   GPad_ButtonRBumper
   GPad_ButtonDPadUp
   GPad_ButtonDPadDown
   GPad_ButtonDPadLeft
   GPad_ButtonDPadRight
   GPad_ButtonLThumb
   GPad_ButtonRThumb
   GPad_ButtonLeftTrigger
   GPad_ButtonRightTrigger
   GPad_LStickX
   GPad_LStickY
   GPad_RStickX
   GPad_RStickY
   GPad_Poll
   GPad_Rumble


GPadLib.odl:

Code:
[
   uuid(183580CF-DFC4-4537-BAF4-00FBC97B6642),
   helpstring("GPad XInput Library for VB 6.0."),
   lcid(0x0409),
   version(1.0)
]
library GPadLib
{
   [
      helpstring("GPad XInput for VB 6.0 functions exported by GPadLib.dll"),
      version(1.0),
      dllname("GPadLib.dll")
   ]
   module GPadLibFunctions
   {
      [
         helpstring("Returns the A Button State."),
         entry("GPad_ButtonA")
      ]
      bool __stdcall GPad_ButtonA([in] int player);

      [
         helpstring("Returns the B Button State."),
         entry("GPad_ButtonB")
      ]
      bool __stdcall GPad_ButtonB([in] int player);

      [
         helpstring("Returns the X Button State."),
         entry("GPad_ButtonX")
      ]
      bool __stdcall GPad_ButtonX([in] int player);

      [
         helpstring("Returns the Y Button State."),
         entry("GPad_ButtonY")
      ]
      bool __stdcall GPad_ButtonY([in] int player);

      [
         helpstring("Returns the Back Button State."),
         entry("GPad_ButtonBack")
      ]
      bool __stdcall GPad_ButtonBack([in] int player);

      [
         helpstring("Returns the Start Button State."),
         entry("GPad_ButtonStart")
      ]
      bool __stdcall GPad_ButtonStart([in] int player);

      [
         helpstring("Returns the Left Shoulder Button State."),
         entry("GPad_ButtonLBumper")
      ]
      bool __stdcall GPad_ButtonLBumper([in] int player);

      [
         helpstring("Returns the Right Shoulder Button State."),
         entry("GPad_ButtonRBumper")
      ]
      bool __stdcall GPad_ButtonRBumper([in] int player);

      [
         helpstring("Returns the Left Thumb Button State."),
         entry("GPad_ButtonLThumb")
      ]
      bool __stdcall GPad_ButtonLThumb([in] int player);

      [
         helpstring("Returns the Right Thumb Button State."),
         entry("GPad_ButtonRThumb")
      ]
      bool __stdcall GPad_ButtonRThumb([in] int player);

      [
         helpstring("Returns the DPad Up Button State."),
         entry("GPad_ButtonDPadUp")
      ]
      bool __stdcall GPad_ButtonDPadUp([in] int player);

      [
         helpstring("Returns the DPad Down Button State."),
         entry("GPad_ButtonDPadDown")
      ]
      bool __stdcall GPad_ButtonDPadDown([in] int player);

      [
         helpstring("Returns the DPad Left Button State."),
         entry("GPad_ButtonDPadLeft")
      ]
      bool __stdcall GPad_ButtonDPadLeft([in] int player);

      [
         helpstring("Returns the DPad Right Button State."),
         entry("GPad_ButtonDPadRight")
      ]
      bool __stdcall GPad_ButtonDPadRight([in] int player);

      [
         helpstring("Gets the state of the current controller and returns 1 for SUCCESS and 0 for FAIL."),
         entry("GPad_Poll")
      ]
      bool __stdcall GPad_Poll([in] int player);

      [
         helpstring("Returns the Left Trigger Value."),
         entry("GPad_ButtonLeftTrigger")
      ]
      int __stdcall GPad_ButtonLeftTrigger([in] int player);

      [
         helpstring("Returns the Right Trigger Value."),
         entry("GPad_ButtonRightTrigger")
      ]
      int __stdcall GPad_ButtonRightTrigger([in] int player);

      [
         helpstring("Returns the Left Stick X Value."),
         entry("GPad_LStickX")
      ]
      short __stdcall GPad_LStickX([in] int player);

      [
         helpstring("Returns the Left Stick Y Value."),
         entry("GPad_LStickY")
      ]
      short __stdcall GPad_LStickY([in] int player);

      [
         helpstring("Returns the Right Stick X Value."),
         entry("GPad_RStickX")
      ]
      short __stdcall GPad_RStickX([in] int player);

      [
         helpstring("Returns the Right Stick Y Value."),
         entry("GPad_RStickY")
      ]
      short __stdcall GPad_RStickY([in] int player);

      [
         helpstring("Sets the left and right rumble speeds."),
         entry("GPad_Rumble")
      ]
      short __stdcall GPad_Rumble([in] int player, [in] int left_speed, [in] int right_speed);
   }
};


GPadLib.rc:

Code:
1 typelib GPadLib.tlb


Again, any help would be greatly appreciated...

...and here are the commands that will also be in the VB6 GPad Lib Command List.txt in the root folder of the
archive:

Code:
GPad Lib Commands and Explanations:

GPad_ButtonA

syntax:  GPad_ButtonA(player as long) as long

   Breaking it down:
      player as long; player 0 to 3.
      returns; 1 if pressed, 0 if not

GPad_ButtonB*
GPad_ButtonX*
GPad_BUttonY*
GPad_BUttonLBumper*
GPad_ButtonRBumper*
GPad_ButtonLThumb*
GPad_ButtonRThumb*
GPad_ButtonBack*
GPad_ButtonStart*
GPad_ButtonDPadUp*
GPad_ButtonDPadDown*
GPad_ButtonDPadLeft*
GPad_ButtonDPadRight*

* = Similar usage as the previous command.

GPad_ButtonLeftTrigger

syntax:  GPad_ButtonLeftTrigger(player as long) as long

   Breaking it down:
      player as long; player 0 to 3
      returns; 0 if not being held to 255 if held all the way

Gpad_ButtonRightTrigger*

* = Similar usage as the previous command.

GPad_LStickX

syntax:  Gpad_LStickX(player as long) as integer

   Breaking it down:
      player as long; player 0 to 3
      returns; 0 if stationary, -32768 to 32767 if not

GPad_LStickY*
GPad_RStickX*
GPad_RStickY*

* = Similar usage as the previous command.

GPad_Poll

Syntax: Gpad_Poll(player as long) as long

   Breaking it down:
      player as long; player 0 to 3
      returns; 0 if fail, 1 if success

   Note:  Call this at the begining of you main game loop to check for device loss and
      input from that controller.

GPad_Rumble

Syntax: GPad_Rumble(player as long, left_speed as long, right_speed as long) as integer

   Breaking it down:
      player as long; player 0 to 3
      left_speed as long; range 0 to 65535, 0 = 0%, 65535 = 100%
      right_speed as long; range 0 to 65535, 0 = 0%, 65535 = 100%
      returns; none


and here is the link to the file:

http://www.filefactory.com/file/b3b2g3e/n/GPad_Lib.rar

Enjoy!

Edit: I thought some more about where I had just posted this...
Should this technically be in the Anouncements forum? I wasn't sure because it wasn't just VB6 in that forum, but this is geared mostly towards those who enjoy learning with/using VB6 and who want access to XInput, so maybe I should post this in the announcements forum as well???

Somebody let me know, and yes I've read this Forum's Posting Policies, I'm just not sure sense this could be in either one...at least to me it could be either one.

Thanks.


Top
 Profile  
 
 Post subject:
PostPosted: Mon Oct 04, 2010 4:33 pm 
Corpse Bride
User avatar

Joined: Tue Jul 01, 2008 11:44 pm
Posts: 2216
Location: England
I saw your previous post but I didn't reply to it, sorry.

Well done for developing the code, and I'm sure this will be useful to anyone who googles for "XInput for VB6", but I don't expect you'll get many responses here. This whole forum doesn't get much activity nowadays.

VB6 is itself much less popular than it was, say 5 years ago, what with the growth of .net, c#, xna, enticing many of those interested in game programming, while those interested in online & cross-platform games tend to steer themselves towards java and flash.

I do use VB6 myself, both because for the most part I find it a comfortable language, and perhaps because I'm a little rebellious when it comes to going with the flow. The truth is simply that I haven't yet needed XInput because I don't have any 360 controllers.

_________________
I ain't pushing no moon buttons.


Top
 Profile  
 
 Post subject:
PostPosted: Mon Oct 04, 2010 5:42 pm 
Level 22 Norse Warrior-Librarian
User avatar

Joined: Mon Sep 04, 2006 5:25 pm
Posts: 517
Location: U.S.
Nice work :)

As Jasmine said, most people don't use VB6 nowadays, but it's still cool that you wrote it.

_________________
Worlds at War (Current Project) - http://www.awkward-games.com
Ganadu'r, The Eternal Sage (Other Current Project) - http://rpg.naget.com
Programming tutorials and web-design services: http://www.wyrmmage.com


Top
 Profile  
 
 Post subject:
PostPosted: Tue Oct 05, 2010 12:01 am 
Prolific Poster

Joined: Tue Jul 22, 2008 7:26 pm
Posts: 22
Thanks for the feedback, both of you...

Initially, I was doing this for myself and a friend of mine, because, eventually, I would like to create a split-screen free-for-all and/or coop-game for he and I to play on his laptop hooked up to my dad's 55 in. T.V. via an H.D.M.I. cable.

I know this is more "for consoles", but a PC can be a console if hooked up to a TV with controller support, and as a matter of fact just a few minutes ago, I was playing X-Men Legends II: Rise of Apocalypse with my brother on my Desktop PC with two controllers...of course the left and right triggers on my Mad Catz 360 Controller had to be assigned to Energy and Health Potions, because the game doesn't support X-Input...

My goal is to bring PC Gaming back as much as possible, knowing it will probably NEVER be like an actual console, because it's cheaper that way.

Then again, if you keep your PC in tip-top condition physically AND software wise, like me and my 7 year old, somewhat upgraded custom built PC, even those will play MOST of the latest and greatest games...

My system is:
P4 3.0 GHz Hyper Threaded Processor
Windows XP Pro x86
ATI Radeon X1650 512 MB VRAM, Latest DirectX9 and THE latest DirectX SDK (June 2010); (when I do split screen, I will probably use both DVI ports for Dual Monitor Support, this way I won't have to move it to the Den T.V. every time I want to play split-screen.
2 GB Dual Channel System Ram (Runs as if it were 4 GB!)
Creative Sound Blaster Audigy 2 ZS EAX 4.0 Advanced HD (with 5.1 Dolby Surround Sound Logitech speakers.)

and those are my hard-points...with all this "old junk", I can run Crysis, Crysis Warhead, AND Crysis Wars, Graphics, Sound, and Physics as high as I can go with out a PPU, including 1650X1080X32 at 60 Hz and 6x Anti-Aliasing, including VSync, and I STILL pull 60 Frames Per Second, which is more than enough for me! I can play Gears of War with ALL DirectX 9 Graphics, (don't have Direct X 10 or 11!!!), Unreal Tournament III with latest Patch and Titan Pack with everything up, no problem, even with the max amount of players playing at once in multiplayer...Mass Effect, Borderlands!!!(OMG, the graphics are all the way up on this one too!), Elder Scrolls IV: Oblivion AND Shivering Isles both play with all the sliders and settings maxed out, Street Fighter IV (of course that's not saying much.) Assassin's Creed plays well, as well as Devil May Cry 4, Prince of Persia 2008, Bioshock, Need for Speed Undercover! Must the list of all 80 something games I own go on???!!!

Seriously, the computer I have now is playing all this, and even with the new video card from the ATI 9800 Pro 128 MB to the ATI Radeon X1650 512 MB, which is probably what did it...this computer I would rate at 3 to 5 years old now, as apposed to the 7 year old components I had before, it's getting on average between the games just listed when I turn VSync off is roughly 75 Frames per second at a 1280X1024X32 Resolution and roughly 50 to 60 fps at 1650X1080X32 with out VSync! So if people are having problems, either it's about compatibility, their computer is 10 years old or older, OR they DON'T take care of the software on their PC, for example, I Defragment my hard drive once a week, give or take some, and I keep a good 35% to 50% free space on my hard drive, and I stay away from unknown sites until I'm told from someone trust worthy, or I do enough research to figure out if it's legit.

Anyway, there goes another rant....

Point is, I made it for those who would be interested. Not to say that VB6 is a must have, just that who ever happens to be used to it, like me, can now use it. It's a great way to learn the "way of the retros" as I like to call it.

I tell you what though, it was living HE Double Hockey Sticks to use Microsoft Visual C++ 2008 Express to make this...I'm still teaching my self how to make games, and I hardly ever ask for help, I have a hard time trying to Google, yet I keep trying, so after years of reading the text book "VB Game Programming for Teens" and looking at it's source code, it's just not enough, and I can't afford any more books, games, software, etc...I'm $12,000.00 in dept with my parents, 99.99% of which is for the P.T. Cruiser they bought for me after I started college in 2008. I only make $7.25 / hr. at Blockbuster Video, and yes we went Bankrupt! And yes, in my opinion, they are going to tanking in a matter of about 2 to 3 years or LESS! I just applied at Walmart and I'm going for the interview tonight at 10:45 P.M.

I just need help! Not looking for someone to come up with a brand spanking new tutorial, but rather to point me in the right direction to a tutorial, forum, blog, etc...showing me how to make an EXTREMELY simple asteroids game or Missile Command game, but that will teach me in this way:

1. Getting Started with my Own Game Engine (Program Skeleton)
2. How to make this Game Engine Reusable in other programs.
3. Tips and Warnings on what is a good Idea for specific tasks.
4. How to use VB6 to test, debug, fix, and rebuild the new code as a routine (automatically fix and come up with a backup file(s) and keep the current file up to date.

Just general things like that to get me started and then...

1. How to make a Design Document (Not really looking for an exact answer here, just need a general idea, tips and tricks if you will.)
2. Setting up the engine made previously, and if I wanted to make this like an RTS later, to be incorporated into the idea of the game, as well as leaving room for little to no modification of the game engine itself.
3. A general Overview of the process of using the game engine to run the game....
4. How to create and maintain/use my own level/mission editor for this game.
5. And finally, when it's done, how do I package this up and make an installer for it to be used on other computers...and what to do about making documentation for end-users and MOD makers alike.

I hope that's enough info to help you help me...I've been a DarkBasic Professional user sense 2004 when I was 14 years old...I'm now 20 and about to be 21, and all I have to show for it is this and a DBPro Breakout Game that I called Atomic Brix (Barely finished, no high score table, and slightly buggy!) I want.......I NEED to advance to the next stage!!!


Thanks,

MickeyIII


Top
 Profile  
 
 Post subject:
PostPosted: Sun Oct 24, 2010 1:28 am 
Level 22 Norse Warrior-Librarian
User avatar

Joined: Mon Sep 04, 2006 5:25 pm
Posts: 517
Location: U.S.
So, I'm not going to lie; when I saw your reply, a couple of weeks ago, I immediately did a mental tl;dr. Now that I have a bit of spare time, I went back and read your reply. I can't say I have much in the way of answer for you, but if you would like some help, I would recommend that you start a new topic with your above post, minus the rant, and maybe with a few less personal details. It's not that we don't like knowing about a person's life, but when one skims a wall of text and one sees that it's not stuff one is terribly interested in, one tends to not read the wall of text, nor does one reply to said wall of text ;)

_________________
Worlds at War (Current Project) - http://www.awkward-games.com
Ganadu'r, The Eternal Sage (Other Current Project) - http://rpg.naget.com
Programming tutorials and web-design services: http://www.wyrmmage.com


Top
 Profile  
 
 Post subject:
PostPosted: Tue Oct 26, 2010 10:58 pm 
Prolific Poster

Joined: Tue Jul 22, 2008 7:26 pm
Posts: 22
Sorry about that, I get carried away.

I some how, from exploring the VB6 Class Wizard, figured out some basics of classes anyway...I'm currently in the works of creating a DirectX8 Engine for now so that I can easily use and learn from the usefulness of reusable code.

I am also incorporating my GPad 360 for VB dll in it. It will probably be a while before I get a working example.

Again, sorry for the above rant,

MickeyIII


Top
 Profile  
 
 Post subject:
PostPosted: Wed Oct 27, 2010 12:38 pm 
Mumbo Jumbo
User avatar

Joined: Fri Aug 20, 2004 1:15 pm
Posts: 804
Location: Michigan, USA
good job on the dll. the only advice i can give about making a game is to read lots of tutorials, and experiment a lot. :spin

_________________
The path to hell is paved with clever code.


Top
 Profile  
 
 Post subject:
PostPosted: Wed Oct 27, 2010 1:52 pm 
Prolific Poster

Joined: Tue Jul 22, 2008 7:26 pm
Posts: 22
Yeah, that's what I've been doing...

Thanks for all of the complements and advice.


Top
 Profile  
 
Display posts from previous:  Sort by  
Post new topic Reply to topic  [ 8 posts ] 

All times are UTC


Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum

Search for:
Jump to:  
cron
Powered by phpBB® Forum Software © phpBB Group