Welcome to GameHourz.com!
FAQFAQ      ProfileProfile    Private MessagesPrivate Messages   Log inLog in

Building your first Roguelike

 
   Game Forums (Home) -> Roguelike -> Development RSS
Next:  WPC NO-POP kit installed  
Author Message
Will Shattuck

External


Since: Aug 09, 2005
Posts: 28



(Msg. 1) Posted: Fri Mar 17, 2006 3:43 pm
Post subject: Building your first Roguelike
Archived from groups: rec>games>roguelike>development (more info?)

Hi all. I've played RLs for a while now and am learning Java for
fun/work so I thought that one way I could extend my learning was by
building a roguelike. However, I have no idea where to start. I am a
very beginning programmer. I know a little bit about programming in
general and am learning the specifics through Java.

So, are there any "HOWTOs" on building a roguelike? They can be
language specific or not. I'm just looking for the concepts that need
to be implemented in the code.

Thanks all Smile

Will

 >> Stay informed about: Building your first Roguelike 
Back to top
Login to vote
Will Shattuck

External


Since: Aug 09, 2005
Posts: 28



(Msg. 2) Posted: Sat Mar 18, 2006 8:15 am
Post subject: Re: Building your first Roguelike [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

Radomir 'The Sheep' Dopieralski wrote:
> At Sat, 18 Mar 2006 14:31:52 +0000 (UTC),
> Crypt wrote:
>
> > On 2006-03-18 00:43:46, "Will Shattuck" <willshattuck.DeleteThis@gmail.com> wrote:
> > You could start by creating World class containing an ArrayList grid[][]=new
> > ArrayList[100][100]
>
> I think this is a very bad advice...
>

I thought it was rather large. He then posted a follow up saying
20x20.

Also, I don't want to use images, but ASCII characters like regular
roguelikes. I'm sure it will probably be similar. I'm still learning
the basics of Java so I don't quite know all that was shown here Smile

Thanks Smile

Will

 >> Stay informed about: Building your first Roguelike 
Back to top
Login to vote
Radomir 'The Sheep' Dopie

External


Since: Aug 11, 2005
Posts: 280



(Msg. 3) Posted: Sat Mar 18, 2006 11:55 am
Post subject: Re: Building your first Roguelike [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

At Sat, 18 Mar 2006 14:31:52 +0000 (UTC),
Crypt wrote:

> On 2006-03-18 00:43:46, "Will Shattuck" <willshattuck RemoveThis @gmail.com> wrote:
> You could start by creating World class containing an ArrayList grid[][]=new
> ArrayList[100][100]

I think this is a very bad advice...

--
Radomir `The Sheep' Dopieralski
 >> Stay informed about: Building your first Roguelike 
Back to top
Login to vote
Radomir 'The Sheep' Dopie

External


Since: Aug 11, 2005
Posts: 280



(Msg. 4) Posted: Sat Mar 18, 2006 2:55 pm
Post subject: Re: Building your first Roguelike [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

At 18 Mar 2006 10:24:37 -0800,
Slash wrote:

> Radomir 'The Sheep' Dopieralski wrote:
>> At Sat, 18 Mar 2006 14:31:52 +0000 (UTC),
>> Crypt wrote:

>> > On 2006-03-18 00:43:46, "Will Shattuck" <willshattuck.TakeThisOut@gmail.com> wrote:
>> > You could start by creating World class containing an ArrayList grid[][]=new
>> > ArrayList[100][100]

>> I think this is a very bad advice...

<snip>

> Perhaps for this, his very first roguelike, it will be good experience
> to try to make something, get to certain advancement level and then
> just crash the project because of the obvious issues that will arise
> for being a design-less project... then he will be able to take all he
> learned and apply it into a project with real hopes to be something
> stable and interesting.

Perhaps. Over-planning may do no good.
But the advice stays bad...

--
Radomir `The Sheep' Dopieralski
 >> Stay informed about: Building your first Roguelike 
Back to top
Login to vote
Crypt

External


Since: Feb 15, 2006
Posts: 176



(Msg. 5) Posted: Sat Mar 18, 2006 4:55 pm
Post subject: Re: Building your first Roguelike [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

On 2006-03-18 19:35:16, Radomir 'The Sheep' Dopieralski <thesheep@ sheep.prv.pl>
wrote:

> At 18 Mar 2006 10:24:37 -0800,
> Slash wrote:
>
> > Radomir 'The Sheep' Dopieralski wrote:
> >> At Sat, 18 Mar 2006 14:31:52 +0000 (UTC),
> >> Crypt wrote:
>
> >> > On 2006-03-18 00:43:46, "Will Shattuck" wrote:
> >> > You could start by creating World class containing an ArrayList grid[][]=new
> >> > ArrayList[100][100]
>
> >> I think this is a very bad advice...
>
>
>
> > Perhaps for this, his very first roguelike, it will be good experience
> > to try to make something, get to certain advancement level and then
> > just crash the project because of the obvious issues that will arise
> > for being a design-less project... then he will be able to take all he
> > learned and apply it into a project with real hopes to be something
> > stable and interesting.
>
> Perhaps. Over-planning may do no good.
> But the advice stays bad...
>
> --
> Radomir `The Sheep' Dopieralski
>
>

Why ?

Because you think i spoke about coding before planning ?
I didn't tell him to code at first. I just spoke about code.

1. we don't know what is his programming skill.

2. in case he doesn't know how to build a map, make a character moving on it,
etc, some basic coding helps are useful and can help him to test some ideas,
select ones, reject others.

Of course he should plan before coding...:
- Model (what it should look like, what would be possible, etc) (no code)
- General code architecture. (uml)
- RPG resolution system. (no code)
 >> Stay informed about: Building your first Roguelike 
Back to top
Login to vote
Crypt

External


Since: Feb 15, 2006
Posts: 176



(Msg. 6) Posted: Sat Mar 18, 2006 4:55 pm
Post subject: Re: Building your first Roguelike [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

On 2006-03-18 21:37:50, Crypt <cryptmaster DeleteThis @free.fr> wrote:

> On 2006-03-18 19:35:16, Radomir 'The Sheep' Dopieralski
> wrote:
>
> > At 18 Mar 2006 10:24:37 -0800,
> > Slash wrote:
> >
> > > Radomir 'The Sheep' Dopieralski wrote:
> > >> At Sat, 18 Mar 2006 14:31:52 +0000 (UTC),
> > >> Crypt wrote:
> >
> > >> > On 2006-03-18 00:43:46, "Will Shattuck" wrote:
> > >> > You could start by creating World class containing an ArrayList grid[][]=new
> > >> > ArrayList[100][100]
> >
> > >> I think this is a very bad advice...
> >
> >
> >
> > > Perhaps for this, his very first roguelike, it will be good experience
> > > to try to make something, get to certain advancement level and then
> > > just crash the project because of the obvious issues that will arise
> > > for being a design-less project... then he will be able to take all he
> > > learned and apply it into a project with real hopes to be something
> > > stable and interesting.
> >
> > Perhaps. Over-planning may do no good.
> > But the advice stays bad...
> >
> > --
> > Radomir `The Sheep' Dopieralski
> >
> >
>
> Why ?
>
> Because you think i spoke about coding before planning ?
> I didn't tell him to code at first. I just spoke about code.
>
> 1. we don't know what is his programming skill.
>
> 2. in case he doesn't know how to build a map, make a character moving on it,
> etc, some basic coding helps are useful and can help him to test some ideas,
> select ones, reject others.
>
> Of course he should plan before coding...:
> - Model (what it should look like, what would be possible, etc) (no code)
> - General code architecture. (uml)
> - RPG resolution system. (no code)
>
>
>


and i think it's a good think to test code, discover why some structures work
bad and somes work better, rather than over planning without even knowing why
some code ideas works better than others.

I think creating roguelike must be fun.
While being a developper i never found very fun to make endless umls.

Experience is fun, UMLs are not (and this is not a professional situation)
 >> Stay informed about: Building your first Roguelike 
Back to top
Login to vote
Crypt

External


Since: Feb 15, 2006
Posts: 176



(Msg. 7) Posted: Sat Mar 18, 2006 4:55 pm
Post subject: Re: Building your first Roguelike [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

On 2006-03-18 00:43:46, "Will Shattuck" <willshattuck DeleteThis @gmail.com> wrote:

> Hi all. I've played RLs for a while now and am learning Java for
> fun/work so I thought that one way I could extend my learning was by
> building a roguelike. However, I have no idea where to start. I am a
> very beginning programmer. I know a little bit about programming in
> general and am learning the specifics through Java.
>
> So, are there any "HOWTOs" on building a roguelike? They can be
> language specific or not. I'm just looking for the concepts that need
> to be implemented in the code.
>
> Thanks all Smile
>
> Will
>
>
>


Two very general tips:

- Visual and Conceptual are two totally different things which must not be
confused. NEVER.

- Rogue like ares mainly engines rather than limited adventure games. So it's
useless to think about quests and stories at the beginning.
 >> Stay informed about: Building your first Roguelike 
Back to top
Login to vote
Radomir 'The Sheep' Dopie

External


Since: Aug 11, 2005
Posts: 280



(Msg. 8) Posted: Sat Mar 18, 2006 6:55 pm
Post subject: Re: Building your first Roguelike [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

At Sat, 18 Mar 2006 20:37:50 +0000 (UTC),
Crypt wrote:

> On 2006-03-18 19:35:16, Radomir 'The Sheep' Dopieralski
> <thesheep@ sheep.prv.pl> wrote:
>> At 18 Mar 2006 10:24:37 -0800, Slash wrote:
>> > Radomir 'The Sheep' Dopieralski wrote:
>> >> At Sat, 18 Mar 2006 14:31:52 +0000 (UTC), Crypt wrote:
>> >> > On 2006-03-18 00:43:46, "Will Shattuck" wrote:

>> >> > You could start by creating World class
>> >> > containing an ArrayList grid[][]=new
>> >> > ArrayList[100][100]

>> >> I think this is a very bad advice...

>> > Perhaps for this, his very first roguelike, it will be good experience
>> > to try to make something, get to certain advancement level and then
>> > just crash the project because of the obvious issues that will arise
>> > for being a design-less project... then he will be able to take all he
>> > learned and apply it into a project with real hopes to be something
>> > stable and interesting.

>> Perhaps. Over-planning may do no good.
>> But the advice stays bad...

> Why ?

I'm sorry, I should have made myself clear right away.
I'll try to explain why I think such an advice is bad.

First of all, I think it's bad code. Java uses objects and object
references. This advice suggest basically to create 10 000 lists
of references. Even an empty list will take up some memory. You
end up with lots of your memory wasted for such a simple thing as
map. Not only that -- as you work on your game, you usually make
it more complicated, adding attributes to various objects. Every
change to the map objects results in a change in memory usage
multiplied by 10 000. You no longer can afford sloppiness -- every
non-optimal choice will grow 10 000 times and bite you back.
Making it 20x20 instead of 100x100 only changes the magnitude, but
doesn't solve the problem.

This, in my opinion, bad code is actually pretty common, and is
usually corrected or worked around eventually at later stages of
development. That's why I don't think it's a grave mistake in your
own code. You will sort it out somehow eventually, or do a rewrite
or anything -- that's what the testing, profiling, correcting,
refactoring, etc., are for. You are learning while coding, and that
does you good. This kind of code can stay unchanged even in the
release versions of roguelikes -- when it's not critical, the game
is small, the computer it runs on has lots of ram, the way you
access the map plays good with the page swapping mechanism of your
operating system, etc. It can occassionally bite when you try
to extend something or to run the game on a worse machine, or to
port it to a different operating system -- but that's rare.

Still, I don't think it's a good advice to follow. It's not
something horrible, but it's not pretty either.
Anyways, I beginning to regret I posted that comment, because
now it feels like I'm just ranting about insignificant details.
Sorry about that.

> Because you think i spoke about coding before planning ?

No, not at all. It's good to code before you start planning --
so that you have something to base your plans on. Just don't
get attached to the code you wrote before planning Wink

> I didn't tell him to code at first. I just spoke about code.
> 1. we don't know what is his programming skill.
> 2. in case he doesn't know how to build a map, make a character moving on it,
> etc, some basic coding helps are useful and can help him to test some ideas,
> select ones, reject others.

It's always good to give some helping tips, even if they are obvious.
Even if you do know how the Breshenham algorithm works, it's easier
to implement it when you look at some code, for example.
The bad things happen when the sample snippets actually suggest you
suboptimal approach. When there's a flaw in certain implementation,
it should be mentioned, so that you don't get in trouble with copy+paste.

> Of course he should plan before coding...:
> - Model (what it should look like, what would be possible, etc) (no code)
> - General code architecture. (uml)
> - RPG resolution system. (no code)

That's one possible approach. There are many of them. The cycle
stays basically the same: plan, code, test, plan, code, test,...
With smaller or larger steps, with existing or new code. With
small projects, it's better to test often. With large ones, it's
sometimes beneficial to plan large parts. There is no golden
rule, but you should know different methodologies and apply them
as needed.

I'm really sorry about the remark and the uneasyness it caused.
Most of what I wrote here is either my personal opinion or well
known and general fact. No real content. I'm sorry.

--
Radomir `The Sheep' Dopieralski
 >> Stay informed about: Building your first Roguelike 
Back to top
Login to vote
Will Shattuck

External


Since: Aug 09, 2005
Posts: 28



(Msg. 9) Posted: Sat Mar 18, 2006 9:40 pm
Post subject: Re: Building your first Roguelike [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

@Radomir:
All advice is good to me right now Smile I basically know nothing right
now. The comment and then your explanation was very good. I know some
things to look out for.

@Everyone:
1. My skill is almost nil. I have done some C# coding on a MUD engine
project, but that was using C# as a scripting language. I know the
basics of OOP, but haven't coded anything other than "Hello World" and
some number guessing games.

2. I don't know how to make anything move or create a map or anything
Smile I'm ... well ... a blank slate Smile

Please no one feel bad. My question wasn't meant to inflame, but to
get information.

Take care,
Will
 >> Stay informed about: Building your first Roguelike 
Back to top
Login to vote
Crypt

External


Since: Feb 15, 2006
Posts: 176



(Msg. 10) Posted: Sat Mar 18, 2006 9:55 pm
Post subject: Re: Building your first Roguelike [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

> First of all, I think it's bad code. Java uses objects and object
> references. This advice suggest basically to create 10 000 lists
> of references. Even an empty list will take up some memory. You
> end up with lots of your memory wasted for such a simple thing as
> map. Not only that -- as you work on your game, you usually make
> it more complicated, adding attributes to various objects. Every
> change to the map objects results in a change in memory usage
> multiplied by 10 000. You no longer can afford sloppiness -- every
> non-optimal choice will grow 10 000 times and bite you back.


What would you suggest ? (i'm really interested in optimisation)
 >> Stay informed about: Building your first Roguelike 
Back to top
Login to vote
the ru

External


Since: Dec 26, 2005
Posts: 10



(Msg. 11) Posted: Sun Mar 19, 2006 12:05 am
Post subject: Re: Building your first Roguelike [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

Will Shattuck wrote:
> Also, I don't want to use images, but ASCII characters like regular
> roguelikes. I'm sure it will probably be similar. I'm still learning
> the basics of Java so I don't quite know all that was shown here Smile

Just wanted to point out that Java doesn't have any standard way of
accessing the terminal in a sophisticated enough manner that is needed
by roguelikes. There are some projects that are supposed to add support
for it, but in my experience they aren't yet mature enough, and will
probably just lead to portability problems (although if you're just
aiming it at Windows users, this shouldn't matter much). Using tiles
(or bitmapped letters?) sounds like the best way to go ATM.

-the ru
 >> Stay informed about: Building your first Roguelike 
Back to top
Login to vote
Daniel Fischer

External


Since: Mar 19, 2006
Posts: 5



(Msg. 12) Posted: Mon Apr 03, 2006 1:55 pm
Post subject: Re: Building your first Roguelike [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

Crypt!

<delurk />

> You could start by creating World class containing an ArrayList
> grid[][]=new ArrayList[100][100]

A slightly better approach would be:

1. create interface MapObject for map objects that includes support for
linking multiple objects together (getNext(), setNext() and stuff) - this
saves memory over using additional list containers and will be useful
later when you're implementing inventories

2. create interfaces FloorTile, Item, Monster that extend MapObject

3. MapObject[][] map = new MapObject[100][100] - this array will take
slightly more than 40k of memory with all entries being null initially

4. implement floor tiles and other types of MapObjects that don't maintain
state as singletons. Note that some floor tiles apparently change state
but really don't - e.g. trap doors might get _replaced_ by a hole, closed
doors might get _replaced_ by an open door, etc. This way, setting the
first square to a floor tile will use memory for the first instance of
that tile but any additional square set to the same tile won't. So if your
game has 200 different background tiles, you'll use memory for 200 tiles
throughout the whole game instead of creating 100x100 per level.

In the unlikely event that you should need a floor tile that maintains
state, you can individually implement it so that it doesn't always return
the same instance and still save memory on all other floor tiles, but I
wouldn't recommend it. For example, a floor tile that needs to maintain
state with three valid states is easily replaced by three separate
implementations.

You will likely not be able to do step 4 with monsters and items as both
probably have properties that are different between instances (hit points,
inventory, etc.); however, that's just the price for maintaining state and
you'll have to live with it. Monsters will very likely be garbage
collected soon after meeting the player, anyway. Many items will be
destroyed when they're used, e.g. potions, scrolls,... make sure to have
some way of getting rid of unused items on the dungeon floor, like e.g.
decay -especially for corpses if your monsters leave any-, or regular
clean-up of items that haven't been touched by the player...

As for the inventory, interfaces that represent objects that can contain
other objects should just have an additional pointer to the first
inventory item. This applies to both Monster (they carry stuff) and Item
(bags may contain other Items - or even Monsters). Add a
getFirstInventory() method to MapObject and implement it as an empty
method in floor tiles - they don't need an inventory. Implement it as an
accessor method of a reference in classes that represent objects that can
contain other objects. Use the next pointer included in MapObject to link
multiple Items together.

As an example, for doing damage, add a doDamage() method to MapObject.
(Those of you that don't like extending classes please skip this
paragraph.) Make it take the type and intensity of damage as parameters,
e.g. a simple implementation might be doDamage(int coldDamage, int
fireDamage, [...]) or doDamage(int type, int intensity) and a less trivial
one might take a complex type representing multiple types of damage. The
simple one should suffice for a 'my first roguelike', there's not much
that requires more sophisticated design. Implement doDamage() as an empty
method in base classes for floor tiles and items -this will use no extra
memory except once per class loaded- and make it reduce a hp counter in a
monster base class -this will use additional memory for a hp counter in
monsters- and so on. Implement a potion class that reacts to cold and fire
damage by exploding or shattering. Now you can e.g. implement a wand class
that just calls doDamage() in every object in the direction the wand was
used, monsters will lose life energy and potions will shatter with no
additional work.


Any suggestions? Is there any existing quick-start design guide for
roguelikes? The above works the same in almost all languages, including
non-object oriented, should you choose to use an object-oriented design in
C or the like.


Daniel
 >> Stay informed about: Building your first Roguelike 
Back to top
Login to vote
Daniel Fischer

External


Since: Mar 19, 2006
Posts: 5



(Msg. 13) Posted: Mon Apr 03, 2006 1:55 pm
Post subject: Re: Building your first Roguelike [Login to view extended thread Info.]
Archived from groups: per prev. post (more info?)

Crypt!

<delurk />

> You could start by creating World class containing an ArrayList
> grid[][]=new ArrayList[100][100]

A slightly better approach would be:

1. create interface MapObject for map objects that includes support for
linking multiple objects together (getNext(), setNext() and stuff) - this
saves memory over using additional list containers and will be useful
later when you're implementing inventories

2. create interfaces FloorTile, Item, Monster that extend MapObject

3. MapObject[][] map = new MapObject[100][100] - this array will take
slightly more than 40k of memory with all entries being null initially.
(supersede next sentence only) Use another array of the same type and size
for objects and monsters in the level.

4. implement floor tiles and other types of MapObjects that don't maintain
state as singletons. Note that some floor tiles apparently change state
but really don't - e.g. trap doors might get _replaced_ by a hole, closed
doors might get _replaced_ by an open door, etc. This way, setting the
first square to a floor tile will use memory for the first instance of
that tile but any additional square set to the same tile won't. So if your
game has 200 different background tiles, you'll use memory for 200 tiles
throughout the whole game instead of creating 100x100 per level.

In the unlikely event that you should need a floor tile that maintains
state, you can individually implement it so that it doesn't always return
the same instance and still save memory on all other floor tiles, but I
wouldn't recommend it. For example, a floor tile that needs to maintain
state with three valid states is easily replaced by three separate
implementations.

You will likely not be able to do step 4 with monsters and items as both
probably have properties that are different between instances (hit points,
inventory, etc.); however, that's just the price for maintaining state and
you'll have to live with it. Monsters will very likely be garbage
collected soon after meeting the player, anyway. Many items will be
destroyed when they're used, e.g. potions, scrolls,... make sure to have
some way of getting rid of unused items on the dungeon floor, like e.g.
decay -especially for corpses if your monsters leave any-, or regular
clean-up of items that haven't been touched by the player...

As for the inventory, interfaces that represent objects that can contain
other objects should just have an additional pointer to the first
inventory item. This applies to both Monster (they carry stuff) and Item
(bags may contain other Items - or even Monsters). Add a
getFirstInventory() method to MapObject and implement it as an empty
method in floor tiles - they don't need an inventory. Implement it as an
accessor method of a reference in classes that represent objects that can
contain other objects. Use the next pointer included in MapObject to link
multiple Items together.

As an example, for doing damage, add a doDamage() method to MapObject.
(Those of you that don't like extending classes please skip this
paragraph.) Make it take the type and intensity of damage as parameters,
e.g. a simple implementation might be doDamage(int coldDamage, int
fireDamage, [...]) or doDamage(int type, int intensity) and a less trivial
one might take a complex type representing multiple types of damage. The
simple one should suffice for a 'my first roguelike', there's not much
that requires more sophisticated design. Implement doDamage() as an empty
method in base classes for floor tiles and items -this will use no extra
memory except once per class loaded- and make it reduce a hp counter in a
monster base class -this will use additional memory for a hp counter in
monsters- and so on. Implement a potion class that reacts to cold and fire
damage by exploding or shattering. Now you can e.g. implement a wand class
that just calls doDamage() in every object in the direction the wand was
used, monsters will lose life energy and potions will shatter with no
additional work.


Any suggestions? Is there any existing quick-start design guide for
roguelikes? The above works the same in almost all languages, including
non-object oriented, should you choose to use an object-oriented design in
C or the like.


Daniel
 >> Stay informed about: Building your first Roguelike 
Back to top
Login to vote
Display posts from previous:   
Related Topics:
Seven Day Roguelike: The Curse (completed) - I've pretty much finished this project, began on Feb. 23, 2006. I guess that makes it a 4-5 day Roguelike ;-) It's called "The Curse" for a reason that will become most fully apparent after reading the "victory" message at the end. ...

7DRL: Invader - Well, I've talked myself into attempting a game for the 7DRL challenge. :-) Invader will be a sci-fi RL where the player is the planet's only hope of stopping a dread alien invasion ship. The character's base of operations will be their docked ship. ....

7DRL: TBA! :P - I'm going to throw my hat into the 7drl arena by taking on a project I've wanted to do for ages. I think it will get me past the mental block of actually getting started. My concept is based around the remains of a post apocalyptic world with gang..

7DRL : Commander - It is 13.40 in my time zone (GMT +100). Time to start my 7DRL project: Commander. I will do it in Free Pascal. Plans are quite big so there is real danger of failure. Good luck to all participants of 7DRL contest. -- Michal ''Ancient'' Bielinski

7DRL : Valley of Ge-Hinnom - Info : @ goes chase to Moloch, java, using my library, so if I fail at least I can post an updated library. T.
   Game Forums (Home) -> Roguelike -> Development All times are: Ekaterinburg, Islamabad, Karachi, Tashkent (change)
Page 1 of 1

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



[ Contact us | Terms of Service/Privacy Policy ]