Sorry your browser is not supported!

You are using an outdated browser that does not support modern web technologies, in order to use this site please update to a new browser.

Browsers supported include Chrome, FireFox, Safari, Opera, Internet Explorer 10+ or Microsoft Edge.

Newcomers DBPro Corner / Scrolling Methods

Author
Message
Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 27th Mar 2011 23:56 Edited at: 28th Mar 2011 00:10
Well here is the second more revised part. I decided to change a few values such as mapping the array from 0 to 21 instead of 1 to 22 and things like that as i was getting weird results so i dont really understand why its doing that so far if i do it from 1 to 22. This way it pastes some of random tiles on the top left corner and starts the map at 32*32 instead of 0,0 which is where i would like it, at least for now until perhaps i put a GUI in.

This all works as intended but i still have some things to cover.


1) I want to be able to stop the scrolling from position 0,0 and the end of the map. For now i can get the map as far off screen as i wish and i want to keep it all together. I wouldnt mind increasing my viewpoint as well but i think i can do that by altering the:
-------------
For lpy = 0 to 9
For lpx = 0 to 9
-------------
Bit.

2) How could i now place a character down and get him to move around. I will settle for centred on the screen for now but ideally want him to move a push box around as i mentioned before. Also i am hoping i can revise the playerhandle() to incorporate WASD and 8 directions instead of just the arrowkeys and 4 directions.

Any tips on where to start?

Edit: My god Rich, that script is marvellous. There is 0 work to do, just straight in no messing. Love it! You could even load that up as part of the program (i think, though i wouldnt know how to make it ignore the first line even though its got the ` in it, unless that doesnt matter, i just remember reading things in from a file is finicky). I didnt do so well in creating files and reading from them but when i get down to it i will try using this for an example. It would negate the need to write a big bloody set of data statements at the top of your code, very nice.
Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 28th Mar 2011 06:59 Edited at: 28th Mar 2011 07:08
There's no need to have the data statements at the top of your program, you can put them anywhere. I usually put them out of the way at the bottom, although I've been playing around with putting them in an include file.

Also, you might want to revisit storing them in a file. A separate program to save them after mappy generates them could be as simple as



and then your above posted code could be cut down to



Or, as you mentioned, you could even just write some code to directly read in the text file created by that mappy script.

As far as your playerhandle() routine, what keys do you want the player to use? Numpad? Arrowkeys in combinations? QWEASDZXC? When you have that decided, this chart can help you with the scancode or keystate functions...



Attachments

Login to view attachments
Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 28th Mar 2011 09:41 Edited at: 28th Mar 2011 09:46
Here is one possible way to scroll the map...



This solution uses a bitmap that stores the whole map, and simply grabs an image around wherever the player is located, then pastes the image onto the main screen bitmap.

One disadvantage to this method is speed - the bigger the viewport, the slower the GET and PASTE. In fact this is so slow that I had to increase the player movement to 4 pixels instead of 1, and it still might run slow on older computers.

But check it out. If you can't follow all the code, let me know what part needs further explanation.

Also, I only coded up, down, left, and right. I'm too sleepy to do the other directions, but I can add them in tomorrow.

Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 28th Mar 2011 09:47
This is gold Rich. Thats what i wanted to do. Thats for the tips no the Data statement too, i didnt realise i could put it anywhere, but i like your idea of reading it from the text file anyway. So when i revisit writing and reading from a file i will be sure to include that in.

As far as the playerhandle i mentioned under part 2 of my above post that i would like to use WASD. I already have a playerhandle() set up like this for moving my character around when i was trying out ways of making a character walk around the screen in 8 directions animating the walking as he went. It was a sucess in the end and i think i can port part of it over as i have all the keystates set up and animation frames and such (though ill have to reduce the size of my character cause hes way too huge for that 32*32 map ).

What i was wondering was though, is i can make the player move, i can now scroll a map (to a degree), but i am not sure my playerhandle() that i wrote will port properly as i cant think how to link it to the map. The character now needs to be still (or with a pushbox prefereably, see above) and the playerhandle i have for my character allows him to go everywhere. I know what will happen is i replace the playerhandle() i have with the one i have here scrolling the map. The arrow keys will end up moving the map which will only be seen in a 10*10 radius, and the character is going to end up being able to walk all over the place with the WASD keys. Sorry that this explenation is long winded but i cant think how else to put it.

Thanks for the scancode chart. I usually use Grogs for quick reference or if im doing a lot i use a program i wrote myself to get the scancode for the keypress (its about 3 lines long but works a charm ) but its nice to have it here aswell.
Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 28th Mar 2011 10:49 Edited at: 28th Mar 2011 10:51
Hey, I just noticed that you had the sync rate set to 40. When I changed it zero, performance sped up and one pixel movement works pretty good.

If you are using WASD, then the other four directions are picked up by checking for combinations? The code I posted can easily be changed to use the WASD keys. I can do that and post it again, in the morning.

I'm not certain what you mean by "pushbox" - is that like when the player gets near the edge of the map, then the player moves instead of the map, as in pizzaman's code? If so, you'll see that my code above does exactly that. If "pushbox" means something else, please explain.


You can also find a keystate helper in the Tools menu of the editor.

Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 28th Mar 2011 10:58
In fact, here's my above code with WASD controls. Again I'm too tired to do the NE, SE, SW, and NW directions, later, later...



Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 28th Mar 2011 11:51 Edited at: 28th Mar 2011 13:41
Oh, man, this is really cool...



I haven't put the boundary checks in, but the day/night thing is really cool, neh?




EDIT: Using a 3d plane opens up some interesting options. No need to worry about how big that ogre is, he just scales to the size of the plane. And why worry about pushing to the edge of the map? You could just put a big border of forests, mountains, whatever. And maps can be really big too! I was able to create a map of 256 x 256 tiles - that's an image 8,192 by 8,192 pixels - before DBPro choked. Hmm... if I used a set of four or more single planes instead of the matrix terrain, it's possible the map could be even bigger!

Someone's probably done this already, but my head's spinning with the possibilities!

Attachments

Login to view attachments
Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 28th Mar 2011 14:24
Damn Rich thats some awesome stuff, cant wait to get home and have a play.
As for the playerhandle(), i have already written an 8 directional WASD control system for my char so no worries there, Check out my other thread on "Stopping the sprite anim", which is all resolved, my final peice works quite nicely. I just want to pop it in the scrolling map code, as so far i just have a sprite walking in 8 directions (all animated) but all over a blue screen , its not pretty.
I will explain what i mean by a pushbox later in a diagram when i get a bit of time (in work at the mo typing fast as im not supposed to be on this)
What i mean by a pushbox is at the moment one way i can think of having the character on screen is permanantly in the centre and the map scrolls round him. Now this may or may not work well but i was thinking like a little invisible box around the player that when he walks into the border of it, it scrolls the map. If the player changes direction he moves from the border of that box to the border of the other side. Just giving the indication that he is not quite in the centre. Only a small box.

I cant wait to see more!!!1
Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 28th Mar 2011 16:11
Yah, I'm very excited about it!

If you want to go with the 3D planes, your WASD code would have to be modified to move the camera instead of the player graphic, but that would be trivial.

Really, using the planes makes so much of it so much easier!

I'm going to try it with individual planes for each terrain square, and see how much it slows down with a BIG map.

Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 28th Mar 2011 16:34 Edited at: 28th Mar 2011 16:41
Excellent. Youve got me all excited about it now aswell. I hate the fact im in work. I want to go home and do stuff, i feel a bout of sickness from that pie i just ate
Nah just kidding. Ill have a look at it when i get home.

Rich if you dont mind me asking what is your computer specs, it would be interesting to see what we can get up to without it slowing down beyond playability, just to see what can be achieved.

Have you read my other thread yet? The one where i animated the ogre? I was thinking of using that or one of the other characters from that guys tilesets as they are beautifully done. I only hope that some day soon ill be able to do the same (i am also currently learning blender). And maybe upping the tile set to 64*64 and seeing if i can do more photo' style tiles, though i am also learning photoshop busybusybusybusy!!!!!

Also guess what came through the post today (though i have to nip to the depo to pick it up). DBPro Hands on Volume 2

Edit: A small pic for the push box.

Attachments

Login to view attachments
Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 28th Mar 2011 18:45
Somarl, I have an Alienware Area 51, purchased before the company got bought out by Dell, so it's about 3 years old. I don't remember the exact specs, but it's got a good video card, and runs pretty fast.

I've read your thread about the ogre, actually I downloaded the ogre and stripped out the pink to make it a .png, which got rid of the pepto-bismal looking halo.

I see what you mean about the push-box, looks like a cool idea.

Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 28th Mar 2011 20:27 Edited at: 28th Mar 2011 20:29
Lol yeah, that orge sprite is really rough but the original is awesome. The reason that version is choppy is because of a few things. The original is a brown background of a colour i might want to use to i wanted to change it to that gastly pink (which i now know why everyone does, its a colour rarely used )
Now i am all for png's, in fact its my preffered type as what you see really is what you get. But i had to have a bmp as when i was doing another test, someone really helped me out with, we found that eXtends was the best way (with the addons that i have) for doing pixel perfect sprite collision. Only problem with eXtends version is it currently only works with bmp's so pngs are out of the question for now, though i hear people might be working on a fix. Now when i tried to do a pink background it all went a bit wrong as i am still a bit of a photoshop noobie and cant really use the magic wand tool and fill bucket properly enough to get rid of the pink outline as it bleeds somewhat with the way i do it.

However i posted this problem up on the 2D forum and a kind chap has shown me a nice way to do it without painting pixel for pixel around the character, so just for now, i am going to use that ogre and others that come from the same site in the same format, as they are beautifully done.

As for the push box i am not sure how to make it work, nor do i know if it is a good idea and if it would work nicely or just make the game feel a little off, but i certainly would like to try it, if not just for the sake of learning how to do something else

I have a little time now i am back from work and im going to look at some of that code you posted and jump right in.

Edit: My comp specs arent too great but they are not too shabby. Its an older machine i built about 3 years ago now.
Core 2 Duo 3ghz
ATI 4850 Graphics
4GB Corsair Mem.
All sitting on a Asus P5Q Deluxe. So it would be interesting to see how far i can push it in terms of what can be displayed.
My soundcard is probably the best thing on the system though, godlike, plus the speaker system that goes with it is damn good too, so i cant wait to start messing round with 3D sound
Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 28th Mar 2011 22:26
Had a long look at some of the code and its great. The first one you posted is nice to understand because you have gone very verbose on not just the commenting but also the variable names. I do understand what everything is doing, its just a shame i cant think of that by myself just yet. I hope things like that will come to me easier soon. Nearly every line i find myself saying, ok what is that for....right ok.....yep i get that......oh yeah why didnt i think of that. Rinse repeat for every line Im just not at that stage yet.

Now the second lot of coding you did with the matrix and light was a really really nice little example, like you said, lots of possibilities, but it was a little difficult to follow as i havent done much with the camera just yet or with matrix's (matricies?).

Certain commands i didnt get straight away or am not sure why they are in the place they are in but again ill say it, its a nice example. You could not only control day and night cycles but have the light follow the player instead of the centre of the camera (same effect i know but not if the push box is implimented) and if the character has a torch you get some ambient light, if he has a certain spell perhaps, you can also have some light, or carrying some item that gives off an ambient light. If not then if would get very dark (but not completely black) around the player making it difficult to navigate round anything that isnt a town or well lit village. Meaning you have to provision for supplies before a journey into the wilderness, or just camp out till the sun comes up.

Something else i looked at was all the matrix commands are based around X and Z, i have to guess that this is because a matrix is normally flat so x is across, z is back and forth, and y is up and down, but if your looking at it from above, x becomes across on the screen, y is toward and away, and Z becomes your Y axis technically. Although the matrix would possibly (i presume) lead to more control if you were adding a little height here and there so the player gets a little closer to you as he goes up a hill and further away when he goes down one using the Y axis, if you werent so fussed about any height would a box (or some rectangle object) textured with the map image as its drawn be a more efficient way in terms of speed or is my theory a little out.
Tbh i really dont know enough about 3D or Matrix's just yet to speculate but it would be nice to have the option to change the Y values to create hills but i havent a clue how you would go about doing that using mappy or what the tiles would have to look like to get that effect.

First things first i am going to not only add the second set of 4 directions in the playerhandle() but ill also create a much bigger map while i am at it. Though it wont be all that pretty, the tiles are a little limited at least i can get a rough idea of what i big map can do.

I think once i get my head round the matrix/3D way of doing it ill try to do something with collision, but for that wont i need a UDT for the array to define whether the player can go over a tile or not?
I know little about UDTs and possibly even less about using the properly in an array but i would love to learn.
Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 28th Mar 2011 22:47
Somarl, yeah, lots of great possibilities.

I've moved on from the matrix terrain, now I'm using IanM's matrix plugin to create a large plane with many smaller segments. Then I'm going to try it with one small plane for each tile, and compare how the different techniques work.

Mapping the player and all the NPCs and monsters onto planes seems like an interesting choice as well.

I didn't do as much commenting on that last piece of code, I was excited about the new (to me) way to do tiles, and was trying a lot of different things.

Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 28th Mar 2011 23:14
Lol, dont go too fast i cant keep up

I have just added a bigger map and updated the player scrolling to the above code. How do i go about setting up collision on this? Is the matrix even worth bothering with yet or shall i wait to see what goodies you come up with using Ians awesome matrix utils. Because i have that plugin aswell and would love to learn how to use more of them in the setting that i am using them in.

Keep going on this its becoming an amazing excerise for me as i am now taking lots in again as opposed to being stuck on just one thing for weeks. 3 weeks it took me to learn to scroll a map around (i felt like giving up), yet now i am getting used to different ways of scrolling a character around with the map, its great stuff.

Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 29th Mar 2011 00:09
Wow, that's a big ol' map!

I'm thinking that moving the camera is better than moving the map, here's why... If you have a bunch of mobile objects, like NPC's or monsters, etc., then you don't have to scroll them along with the map. They might have their own movement of course.

As far as collision, pizzaman's code looks good, and I think it could be adapted pretty well.

Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 29th Mar 2011 00:21 Edited at: 29th Mar 2011 00:35
Yeah thats what i was hoping, that pizzamans code could be adapted.

Just for the sake of it, and to help me learn, how would monsters/npcs etc be added to a tiled scrolling map the old fashioned way. I cant figure out how it would know where you are putting them if they are not immediately on the map, how it draws them when they are on the map and how it moves them for things like pathing?

I was thinking perhaps (inspired by other threads i have read) creating 3 other variables,
WorldX ` The X position on the map as a whole
WorldY ` Same as above but Y pos
Displayed ` It its within the viewpoint, so some calculation to say whether it is in the right co-ordinates for the map to be seen and if so tag displayed as 1, this then means all npcs and mobs etc have a tag of 0 at first till they are set to 1 because it works out if they should be displayed, if so then draw them.

Is this along the right lines? Would UDT's come into this? Should they be part of the map array?
Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 29th Mar 2011 01:54
Quote: "how would monsters/npcs etc be added to a tiled scrolling map the old fashioned way"


That's another one of those problems that has lots of solutions.

One way would be for each monster to have an x and y location as part of their "monster data" array, along with stuff like hit points, attack strength, etc. Each "turn" you can loop through the monsters, and if their x and y locations is within the bounds of the viewing area, paste them on the map.

Another way might be to have a separate "layer" array for monsters.

Another way is to have the "map data" array store the index of whatever monster is standing on it.

Since your mobs and npcs won't be limited to a grid location, storing their actual x,y might work better. So, maybe if a monster is within 60 units of the player, it could make a ranged attack. If within 30 units, it could make a melee attack.

Each turn, you could check each monster. If it's not attacking or being attacked, it might wander a bit, or patrol a guard path, or just stand still.

And that is where AI coding comes in, even if it's as simple as "If the player is close enough to hit, then attack him."

Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 29th Mar 2011 02:16
That should get me started then. I will take a look at it tomorrow and see if i can just very simply knock up a quick demo out of it.
I just spent a very very long time making a seemless grass texture (photo realistic) by copying individual blades of grass over the seams and at first i thought it looked ok but my god it is the most terrible auful tile i have ever seen. Its really damn hard to do this drawing thing. I really wish i could draw as i want to avoid a heavy cartoony sort of feel to anything i make (a slight amount is acceptable, it will be fantasy of course). I really thought i was being clever making that texture but looking at it tiled its abysmal. Back to the drawing board i think.

Rich, do you not think i could benefit from knowing how to use UDT's yet? I have a feeling they will come in handy but my knowledge is limited as to the exact useage of them as the book i have doesnt really cover them that much and certainly not at all in the context that i imagine i may use them. Would it just be for storing the character stats and mob & npc stats and so on. After all arent they exactly the same as any other variable its just a neater way of doing it. So rather than:

PlayerX = 100
PlayerY = 150
PlayerHealth = 100

and so on it just turns out like this (after the UDT has been defined)

Player.X = 100
Player.y = 150
Player.Health = 100

Which in a way seems neater and it holds everything all in one bit but other than that whats the usage?
Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 29th Mar 2011 05:43
One advantage is using them in an array, such as



You can see how useful that can be!

Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 29th Mar 2011 23:00 Edited at: 30th Mar 2011 00:32
This is it so far. Having difficulty with the following

1) Getting the right position for the player. i could line it up by eye but there has to be a better way. It doesnt seem right to me the way its working it out.

2) Stopping him from going off the map and stopping the map from scrolling when it reaches the ends so it doesnt go off the viewport. Also then starts moving the character to the end of the viewport until he returns back to the centre if he goes the other way.

3) Not sure why the grey gradient box (which is still there) and the text saying toggle day night with space, is not showing up.

4) Really cant think how to add collision to this. Tried some stuff, failed badly. Really need some tips. I know there are a thousand ways to do this (as there is with everything but im not an explorer of methods, i have no methods. So if there are thousands of way then show me:
a) The easiest.
b) The best to suit the situation. Or one of a dozen ways that will perfectly suit the situation and leave room for more if needed.
c) The Hardest so that i can learn from it.


Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 30th Mar 2011 12:13
After playing around with several alternatives, my advice is to use one 3D plane for each tile, and move the camera instead of moving the terrain.

Also, instead of moving the player away from the center when you get to the edge of the map, I would suggest just putting another larger plane on each edge, and fill it with mountains, or water, or whatever will be blocking the player from going in that direction.

Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 30th Mar 2011 13:03
Right, so instead of pasting images onto a bmp like some of the very first examples. You would suggest making a plane 32*32 and texturing it with the appropriate tile, then making another one offset from that and doing it again until you have enough "tiled planes" to make up the viewport.

Then set up a camera looking down on it?

I am not 100% sure how to start with this. And also i am still stuck on collision blocking. So although i would end up doing it the way you suggested above anyway regards to the mountains or rivers etc blocking it, i cant do any type of collision anyway just yet (my tile experiment did not work, the screen just froze) on things like rocks and trees etc.

Also i am not sure whats wrong with my code above either. (See numbered points) as it still doesnt work 100% as intended. The gray box not being there or text showing up for example. Cheers for looking at it though.
Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 30th Mar 2011 13:40
Quote: "Right, so instead of pasting images onto a bmp like some of the very first examples. You would suggest making a plane 32*32 and texturing it with the appropriate tile, then making another one offset from that and doing it again until you have enough "tiled planes" to make up the viewport.

Then set up a camera looking down on it?"


Yes, exactly. Here's what I have so far...



I haven't set up the "world" boundaries yet, no collision, but it will give you an idea of what I mean.

Also, you will need to add back in your code for animating the player (ogre) sprite. I haven't looked at that yet.

Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 30th Mar 2011 20:52 Edited at: 30th Mar 2011 20:53
Here's a version with 8 direction scrolling, no movement past the map edge, and three movement speeds.

Still working on checking for terrain that blocks movement, and putting in the animated sprite.



Really ought to put in map datafile storage, so we don't have all those long data statements.

Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 30th Mar 2011 21:19
Updated to include ogre sprite and animation for frames. Works quite well. I have commented on some of the code ive not understood very well though.



Also, if you hold down a movement key when loading it stops the tiles from appearing. I would like to know what this is. As i am still very new as to how things display exactly, so when something doesnt display properly i dont immediately know what has gone wrong to fix it.
Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 30th Mar 2011 22:35 Edited at: 30th Mar 2011 23:54
Cool! I'm going to fold your code into my version, and try and answer some of the questions you have.

As I put in a new feature, I will sometimes take out blocks of code, just to simplify troubleshooting the new code. Often this will lead me to modify the old code when I put it back in, either because I've changed a methodology, or because the new code breaks the old code.

I'll try and comment why I'm making these changes, but let me know if I'm doing something that's not clear!

EDIT - And I'll need that ogrewalk02.bmp file, can you attach it to your last post? Thankee!

Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 30th Mar 2011 22:51 Edited at: 30th Mar 2011 23:11
Thats great.
As for the ogrewalk, because of all the pinkness around it i am currently remaking it by taking each of the frames again in brown and pasting them into a "sprite sheet" but this time i will just hand paint the outlines to get a better look. The old one was a bad job by me and parts of the shield were invisible and everything and i wanted to do it so i could use it later on down the line as a mob. The actual player character will hopefully be a 3d model made by me in the same style as reiners otehr characters. But i have a way to go learning 3d modelling just yet before i can pull that off.

So ill get cracking now and re-edit this post with the attachment when im done.

Edit: On second thoughts, its damn near impossible. In fact because im so far zoomed in i cant tell what peice is which rendering this a near impossible task, not to mention time consuming so ill give you the redone brown version and you can set the colour key to the brown instead. I think this will work. If not then it will have to do for demo purposes and i will go on the lookout for other animated sprites to use. Oh and please note, the new ogrewalk sprite is 64 * 64, i resized it as the original was a little bigger.

Could just strip it out to a png fairly easily but it wont work with some eXtends collision, which is what i originally wanted because Hodgey showed me an excellent little demo that was spot on but only works for bmps, hence why i wanted them instead of pngs. I think he was working on a way to make it work with pngs or something but im unsure if he managed to find a solution.

Attachments

Login to view attachments
Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 30th Mar 2011 23:15 Edited at: 30th Mar 2011 23:18
Quote: "Dont 100% understand this as yet"


This is designed to put extra terrain all around the map, so that when the player walks to the edge of the map, there is not just black space. I put water texture there, it makes the map look like an island. But you could put impassable mountains, desert, whatever. It's just a visual thing. Instead of using more tiny tiles, I just made 4 big ones.



That SET IMAGE COLORKEY works fine where it was, but you must load the graphic, as well as assigning it to a sprite animation.

I can turn the ogre sprite sheet into a png, and we can skip all the pink stuff completely. But... if the ogre is bigger than 32x32, we'll have to make a few adjustments. No problem though.

EDIT: Oh, okay, a .bmp is fine.

Attachments

Login to view attachments
Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 30th Mar 2011 23:38 Edited at: 30th Mar 2011 23:51
LOL, he's just so cute! Here is a version using png...



The png image is attached.

NOTE: This thread now has three pages (at least for me) - DO NOT FREAK OUT! heh heh

Attachments

Login to view attachments
Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 30th Mar 2011 23:50
And here's the cleaned up .bmp file.

Attachments

Login to view attachments
Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 31st Mar 2011 00:55
Holy crap, 3 pages
Just wait till my next thread, its guaranteed to be over 9000, because it will probably be some GUI questions and all the many ways to do it but for now, scrolling is where its at

Rich you need to tell me how you cleaned up that image so quickly, thats marvellous. I would have had to hand paint it. What program were you using and what settings if you dont mind me asking.

I have been trawling round that latest code snippet you pasted and a lot of it makes sense surprisingly. I just know i wouldnt be able to do it myself from scratch right now if i tried. But if i keep using it and keep reading it i am hoping most of it will stick. After all the whole concept of scrolling maps and using tiles in an array if still fairly fresh to me

I understand why you created the huge planes at the side which could in turn be filled with "impassable terrain". Its a nice concept but how about this one. To have a very large map (with some rather large sea sections) that you can literally go round the world with. Not planet sized of course, but a smaller version of a fake sphere (not using any sphere objects) but what i mean is when you get to the end of the top left part of the map for example you technically appear on the bottom right. This would allow someone to create a very big map, or a series of very big maps to make an island, then surrounded by sea (which you can build a boat to get across) would take you to the other side once you got all the way round. Not on a gargantuan scale but a sort of small perpetual little world. With this in mind there would be that much impassable terrain (well there would but not at the edges of the whole world, just at some sections where maps would meet to form the rest of the world). Instead the joined maps would form an island with a few water planes around them and they would scroll round till they met up. Making it purposeful for the character to want a boat of some kind as going from one side of the island would be quicker and less dangerous (as he doesnt have to go all the way through dangerous territory etc)

Also as for blocking tiles while i am not sure quite how that would be done yet, i dont want all tiles to block. Some i would like to slow down but i think i have an idea of how to do that. When collision with a tile is worked out and blocking is done on things like trees, rocks and buildings, which i presume is done by checking what tile the character will be standing on next or something. I think as long as you know what tile your stood on all it would be is a case of increasing or decreasing the speed of the camera. Would this be right? Also other things could be added then, such as changing the character to a swimming animation and going slower when crossing water. Massive damage if your going on lava tiles etc.
Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 31st Mar 2011 01:37 Edited at: 31st Mar 2011 01:38
Somarl, I used Photoshop to get rid of the brown background. I set the magic wand to contiguous, and not anti-aliased, and a tolerance around 18, I think. There were a few leftover pixels of other colors, but the were easy to spot. It didn't take very long at all.

I've attached a png of a guy with a sword, same kind of animations, you can just load him instead of the ogre.

I like where you're going with all this. What you've described reminds me of the "zones" in some games. You hit a certain spot on the map and you are moved to another area.

Anyway, try out the guy with the sword.




Attachments

Login to view attachments
Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 31st Mar 2011 09:54
Rich this is just too cool.
And damn me for not using photoshop properly , i had it set to not anti alias like you but i unticked contiguous and didnt play around with the tolerance enough, i think that was my problem and why i couldnt do it as well as youself.
That little hero character is fantastic, im going to pop him into the current code as soon as i get back from work.

Quote: "I like where you're going with all this."

Yeah, i have more ideas than i know what to do with them, but its no good asking people to do them all for you (asking for help i think is fine), i realised this a long time ago. Being an ideas man just isnt good enough so ive taken up not only coding but some of the other discaplines aswell such as sound and music, 3d modelling, 2d drawing and various other programs i am trying to learn in the hope of putting everything together one time in the future and being able to actually realise my ideas. Its going to be a long and tough road - Well 2 months in and its already a tough road . but i hope it will be worth it in the end.

Quote: "What you've described reminds me of the "zones" in some games. You hit a certain spot on the map and you are moved to another area."

Yes, pretty much. I just want to break the maps up into certain areas, dependent on the part of the world that i have created (i wrote a small fantasy book once for a backstory on a character in a guild in Mortal Online that i was in a while back that linked all the other guild players stories together in regards to how everyone met and formed the guild before the games release which was the start of everything. So i have a lot of areas and a character story that i always wanted to see turned into a game. Thought i might start off small and pop out a fun little 2d rpg out of it.
In regards to the ends of the world, they will just be water (surrounding the island) that sort of wraps round to the other edge on the opposite side, so basically you could walk to the North West corner of the map, come to water, get in a ship, sail across for a minute or so and find yourself seamlessly at the South East corner, then walk all the way diagonally up and west again to find yourself at the North West of the map and do it all again. Like what would happen if youdid the same on earth so to speak.
Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 31st Mar 2011 21:00 Edited at: 31st Mar 2011 21:06
Just having a little trouble understanding how this works


That is incrementing nDirection by the value (step) on each loop?
So pressing up (W) would make nDirection 1 on the first loop, 2 on the second 3 on the third?
Pressing S for down would keep incrementing by 8 each time. What is this doing exactly. I thought the way to do it would be just to check for the keypress and set a direction out of the 8 for it. This would also allow an accidental 3 or 4 key keypress and still go in the first selected direction.

Edit: I forget that the nDirection = 0 at the top is resetting the value on every loop. Am i right in thinking this is just a different way of writing
if keystate(17) then nDirection = 1
Also how come we dont need the other directions? NE, NW etc
Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 31st Mar 2011 21:23
Also i messed around with the above code and some more, in order to try and be clever, i didnt work
I didnt want the character completely pausing when 3 keys were pressed so i thought i would do it this way:

This was in order that for the sake of it being smoother so when 3 keys were pressed it either ignored it and carried on in the same direction or changed new direction according but 2 things dont work. Any movement involving the 'A' key always comes out on top, and also the second thing is for some reason although all the north codes work, the south ones dont, except south.
Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 31st Mar 2011 22:16


How this works is...

Every loop it starts nDirection at zero, and then adds in the values for the keys being pressed. Notice that the values are incremented by powers of 2. So, four keys and two keystates. Four to the second power is 16. There are 16 different combinations of keystates, but we don't check for three or four keys pressed together. It's binary arithmetic, with each of the keys representing one binary digit of a four-bit value.

For more info, see this.

Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 31st Mar 2011 22:51
Yeah i read that link and thats a bit over my head just now. I got lost when after the 17th word when it said four-bit aggregation. I am also very poor mathmatically which i am trying to improve on as i will need it for the kind of physics and AI i would like in later games so i cannot avoid it, but i still get stuck with understanding things like what numbers are to the power of etc. For example i see the number E mentioned a lot as it is used like Pi but i understand pi and its uses, i just dont understand what things E relates to, i know its 2.7182 but things like that just go right over my head so as soon as someone says to the power of thats it im gone.

I see that it is obviously a much shorter way to do what was trying to be done, but is it necessarily quicker? and also why doesnt the south portion of the code i posted work at all. I thought theroetically although it is not a neater way of doing it, if north east and north west work, why doesnt south east and south west work. I must have missed something out to make the south bit work.
Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 1st Apr 2011 00:03 Edited at: 1st Apr 2011 00:06
Ok and a few more questions just for now.
I just want a bit more breakdown on the maths behind a few things, or what they are doing.

1) I know there are four of these, and what they do and what happens when they arent there but


2) After player around i get most of this code but am just wondering about some of the bracket positions.

And does point camera just align it up or is the camera set up to be facing a different way and that command centers it. I am not sure about what this does.

3) This appears by looking at the code to centre the light based on the camera position and presuming the character is also centred by the camera but the light is ever so slightly off and not quite in the centre of the camera.


4) Not 100% sure what all the numbers do on this too

I know that 16 is half of 32 which is the size of a tile or the sprite so its something to do with that. 32 - 48 i presume is something to do with getting the number 16 from something, but 56 i am thouroughly unsure of.

5) Any tips on how to set up an auto day/night cycle like i described above that doesnt affect the loop. I know the new code has a wait statement in but even with that removed the game does pause while doing it. I would like to set up some sort of timer for when day and night happen, and how long it transitions into and out of each.

6) Something i have to point out as well, i am getting some lines and very small gaps in the tiles, some more obvious than others. What is happening here.

All other lines i am pretty much happy with in my general understanding of them. I just wish i could have thought of that myself but as ive said countless times before im not at the stage when i can use anything usefully yet. In time though, in time.
Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 1st Apr 2011 02:11 Edited at: 1st Apr 2011 02:14
1. The maths are simply to get the big edge pieces in the right place. I could have put actual numbers in there, but then if you changed the map size, they wouldn't be in the right place.

Since the edge pieces are one big plane, the texture must be scaled to make a repeating texture of 32 x 32 units per square. You may wish to investigate how this works, as it is a very useful technique when texturing objects. Try commenting out the lines with SCALE OBJECT TEXTURE, and see what happens.

2. The bracket positions don't really have a reason, I just put them in some of the lines as I changed the equations, and forgot to take them out where they weren't needed. They helped me to see at a glance what kind of value I was creating. They don't hurt anything, but feel free to remove any that don't belong.

3. Yes, the sprite is not quite under the camera. When you get the actual version of the player, you will need to adjust where the player and light are positioned to make them look good together.

4. The calculations are designed to keep the camera from going past the edge of the map, but not to bounce the player back any steps when he hits the edge of the map. For instance, if the player was moving 5 pixels per cycle, then just bouncing him back from the edge would mean he might never be able to get any closer than 5 pixels from the edge.

5. You will have to set up some kind of day/night system and have the game track elapsed time. How fast do you want a day to pass by while the player walks around? Should the daytime last longer than the night?

6. I am also seeing the grid lines, especially around the trees. I have no idea where they are coming from, or when they started showing up. I guess we could try reverting to earlier versions and see if they are still there.

Onward!

Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 1st Apr 2011 09:50
Excellent Rich. I am looking forward to trying to make the day night system. (Day will be longer than night by a fair bit for gameplay rather than realism).
I am going to look up tutorials on using timers to trigger events beacuse i am sure i have seen one somewhere. Then ill see what i can come up with.

Do you know why the southward movement of my code does not work? I wont use it if its useless and cant be made to work but i thought i might learn something if i understood what ive done wrong.
Rich Dersheimer
AGK Developer
15
Years of Service
User Offline
Joined: 1st Jul 2009
Location: Inside the box
Posted: 1st Apr 2011 18:46 Edited at: 1st Apr 2011 18:47


I believe the down-and-left and down-and-right are not working because the very last thing you check for is the down key. So, the code works in top down order - when 31 and 32 are found, nDirection is set to 6. But then 31 is found again and nDirection is set to 8. So, either put all the single key checks first, or use the method I put in with only 4 checks.

Onward!

Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 1st Apr 2011 20:33
Oh no thats so obvious my brain hurts, i cant believe i missed that. Thanks Rich. Im currently checking out a tutorial by Mr Foreman that i am hoping will help me with the day night situation. Hopefully get it done tonight.
Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 2nd Apr 2011 23:24 Edited at: 3rd Apr 2011 00:25
I think i am missing something in regards to the latest code ive re written. I have written it out myself in order to learn it better and have obviously just ommited certain bits for now like the lighting and making the large textured planes on either side but i dont think i understand subroutines enough because their behavour doesnt make sense to me.

I have apparently added in all i need to make the camera move but it does not so i obviously havent added everything i need or at least as i think, its not in the right order.
I want the subroutine "setup" to be at the top but this does not work, it also doesnt work when its at the bottom, but as far as i can tell it shouldnt really do anything unless i ask it to.

It seems counter productive but if i call the sub then put the sub under it, wont it go to the sub, then after return is called, return to just below where it was called (otherwise it would loop forever returning to the line that called it). If this is the case it would be called and then ignore itself as the subroutine is the next line, then move on to the do loop.
If this is not the case it does explain a few things, like if a subroutine always runs through the code at least once, and then any other time it is called. To avoid it running through itself without your permission you would just do all calls to it either before or in the game loop and then put all the subs after the loop. Is this right?

I mean it still doesnt make a difference anyway at the moment as it still doesnt work even with the few tests i have done (like nDirection is working and the case statement as the character animations and direction is working as expected but the screen doesnt scroll even though the move camera up (or whatever direction) is in there). I have a feeling its to do with my calculation of speed * duration, when i print this it comes up with 1.29915e+006 at first and then 0 which is no good, and your version comes up with a number between 0.75 and 0.9. I cant think where i have gone wrong as yet, but the calculation is right, it must just be in the wrong place.
Edit: This is not quite right. I have used the code
Do
Duration#=(timer()-time_last_frame)*.001
PlayerHandle()
time_last_frame=timer()
Set Cursor 0,530
Print " " <------- This is more than just "" one space its actually a few but its not turning out when i copy paste it into here
Set Cursor 0,530
Print speed# * duration#
sync
Loop
In the loop to determine the speed * duration calculator but its just not doing what it should be, also is there any reason why if you increase it to more than 530 (the screen is 800, 600 so should be plenty to go) it starts behaving very strange. What is this?


Also couldnt use anything from DCForemans day night tutorial, or at least i dont think i can as it doesnt seem to fit what i want to do. So i think i am going to make some sort of timer program to make a day night cycle, but i still wouldnt have a clue how to transition without stopping the game like the current light system does (when you press space for a split second everything pauses, if this transition goes slowly throughout 3-5 minutes of game time it would be disasterous as i want the player to move around and interact while the sun is going down and up).

I will let you know if i find a solution to this problem but i didnt post anything last night as i was just far too busy trying to make the camera work and it still doesnt so other than directly copy pasting everything you have done which i really didnt want to do, i dont know what i can do.

Edit 2: Ok this is unusual so i could do with knowing if this is right or not. I was getting a 0 return on duration meaning that calculation must have been wrong but it was right. What the problem was in the end was duration was declared not only globally but as a float. Now i have heard that if you define something as a float you do NOT need to put # at the end. Not doing this though (as its neater without) cost me the calculation. All my duration declarations were just called duration instead of duration#, i didnt think that would be a problem but obviously it is.

I would also like to know more about the timer() - time_last frame equation and why duration is a result of that, rather than just using a set camera speed. It interests me why we would use a slightly unstable number (as it flits slightly depending on how much time has gone by inbetween game loop cycles), over a solid set number.

I know there are about 6 different questions in this post alone but i just really want to know whats going on to further my understanding and really dont want to make 6 different posts for each question, sorry about this.
I understand there
Ashingda 27
16
Years of Service
User Offline
Joined: 15th Feb 2008
Location:
Posted: 3rd Apr 2011 09:29
@Somarl
Sorry I haven't been online for a while.

Quote: "1) ScrollMapY# and X are just declared from nowhere. What value are they, how are they done this way. I know you dont have to declare every variable but is this right (i mean of course it is because the example works but how is the question)"


In the example X is only used for visual aid. Instead of writing "paste image Img,lpx*32,lpy*32" I assign lpx*32 into X. Sometimes your calculations may be very long such as "(lpx*32)/(SpriteScrollX+(SpacingX+3)-(PosX*32-4))" and you can keep it neat by passing it off to a shorter variable.



Quote: "
2) CheckX = lpx+int(ScrollMapX#)
CheckY = lpy+int(ScrollMapY#)
I am not too comfortable with either. Why have the ScrollMapY# increased or decreased by a decimal then convert that into an integer. You cant move an x or y value less than 1 anyway because you cant have 0.1 of a pixel. Why bother declaring it as a float anyway, then just to convert it back to an integer with int(Scrollmapx#)
Also i cant follow this because i dont know what value ScrollMapY & x are meant to be. Is it 0? So the first iteration would be as follows:
CheckX = 0 + 0 - becuase lpx is 0 and scrollmap would be 0?
"


CheckX and CheckY are for checking the Map() array. The lpx/lpy loop would cause this routine to check 9x9 of the 29x29 Map() array but it will only check 0~9 for x and 0~9 for y coordinates. So the ScrollMapX#/ScrollMapY# are to offset the starting point of the 9x9 check. This gives the effect of scrolling the map!

As for using int(ScrollMapX#) it's just to give you clear idea that an integer was intended. "CheckX = lpx+int(ScrollMapX#)" would have also given the exact same result as CheckX is an integer and would convert it's assigned value to one as well. Now the reason why I decided to show int() was because if you used it directly in the array such as Map(lpx+ScrollMapX#,lpx+ScrollMapX#) it is an illegal action. Arrays only read integers so if you want to use a value from a float directly you must convert to integer.

Quote: "3) This also trips me up. I know the code but not what it is doing.

if CheckX > -1 and CheckX < MaxMapX and CheckY > -1 and CheckY < MaxMapY

Is this to stop something going off screen? I am not 100% sure what this does and without the values i cant work it out."


When checking an array such as Map(x,y), if you check out of bounce the program will crash! This is to make sure that before we check Map(x,y) our two coordinates Map(CheckX,CheckY) are inside the declared dimension.

Quote: "This is what i have come up with so far, and it partially works but i cant get the equivelant Ashingda 27 examples checkX to stop the map from going way out of bounds and pasting where it shouldnt be pasting. Please check it out and tell me whats happening so i can fix it."

It's not that you are pasting where you shouldn't, you just aren't erasing the areas with no tiles. In your main loop add a CLS "clear screen" right after the SYNC.


Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 3rd Apr 2011 10:36
Thank you so much for the input Ashingda. I know i can be terribly annoying with the long paragraphs and bundles of questions but its only so i can fully understand each concept and not just take anything for granted. So i really appreciate your help and input as posts like that are furthering my understanding.

I did get the 'putting the cls in' though, just about worked that one out

This little learning project has come quite a way so far Ashingda, you should take a look at it let us know what you think, as i would always love another brain helping me figure out whats going on
Ashingda 27
16
Years of Service
User Offline
Joined: 15th Feb 2008
Location:
Posted: 3rd Apr 2011 10:58
I see a lot of improvements you're doing ok picking it up as you go. I thought you may be interested in a smooth scrolling map so I fixed you up one, it's from one of your own codes and uses your tileset.


I tried to add as much remarks as I can, if you have any question make sure you ask it.

Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 3rd Apr 2011 22:42 Edited at: 3rd Apr 2011 23:14
Thats a nice example, showing me what is happening off the screen that you would normally see. This is helping me visualise what is happening in the background which is necessary for the player to see what he sees.
Thanks.

If you have read some of the other posts (some of the more recent ones) you will see i was using mappy to build maps with and this will allow me to create a fairly big map easily (unfortunatley using that tileset and not one of my own but i cant draw for beans at the moment but i am trying to learn.) Now that i can create and display fairly big maps (and animate a character to walk around in them) i think i would like to learn how to add an enemy or npc to interact with. I was thinking about creating world co-ordinates and doing something with that to locate the position of an npc or hostile but i cant think how to move them along a path but not display them until they need displaying, for example like if there path would have them come into the player view somehow how does it know that it might be there or not. So if the player is travelling down for example and an enemy path is south of him but to the right and its path is left to right, you might not display him because he is not in view but he would be if you updated his path but surely you cant update all the co-ordinates of every enemy in the world all in the same game loop as this would take too much resources, better to only display and work out positions of things close by isnt it?

I will also say that i am just about out of ideas on how to do collision on the terrain. I tried checking everything to find out the tile the character is on, including working out the x and z position of the camera then trying to determine what tile it is at.



Media enclosed.

Attachments

Login to view attachments
Ashingda 27
16
Years of Service
User Offline
Joined: 15th Feb 2008
Location:
Posted: 4th Apr 2011 00:11
If you want to get terrain collision working it's best to improve your understanding of arrays. Just about all your data will be stored in arrays to have the game working the way you want.

Quote: "So if the player is travelling down for example and an enemy path is south of him but to the right and its path is left to right, you might not display him because he is not in view but he would be if you updated his path but surely you cant update all the co-ordinates of every enemy in the world all in the same game loop as this would take too much resources, better to only display and work out positions of things close by isnt it?"

Handling the npc data takes very little resource depending how well you code it, you can control 200+ npc and have them do their own little actions and without noticing much slowdown. what really slows things down is when you draw them out to the screen but there are also other ways to improve that.

Quote: "I will also say that i am just about out of ideas on how to do collision on the terrain. I tried checking everything to find out the tile the character is on, including working out the x and z position of the camera then trying to determine what tile it is at."

Depending on where you have the character at you have to offset the checking x and y.

Somarl
13
Years of Service
User Offline
Joined: 11th Feb 2011
Location: UK
Posted: 4th Apr 2011 00:25 Edited at: 4th Apr 2011 00:27
Well so far i know that the tile data is stored in Map(x,y) so by that i could find out tile numbers and do a rough collision by saying if the map hes standing on is not 4 then dont move. I dont really want to do it this way but i couldnt if i wanted to anyway, as map(x,y) is always 54 as its the last tile read in. So i cant find out what tile the character is standing on using the array.

I also cant place the NPC (or enemy) down as creating and pasting him as i did the bloke at certain co-ordinates (that would be at first 'off screen') are not making him show up, so i am doing something wrong in displaying other characters. Even if i got it working the way i am currently doing it, it is very sloppy and certainly not an efficient way of doing it. I would be keeping track and updating the movement on every single sprite in the game all at once, and positioning every single one of them individually, also using thousands of sprite numbers if thousands of enemies/npcs were scattered throughout the game.

I think i am going to give up on the 3d camera approach, using planes, as i cant get rid of the horrible lines in between each tile, and while i dont think it should be showing them at all (after all if you place something at 32, then place something next to it there should not be a line, full stop.) the point is it is showing them whereas scrolling using more traditional methods means the lines are gone. Plus i cant see how it would be more efficient to draw a huge plane from hundreds of planes textured with the right tile number then plonk it down, as opposed to only drawing one tile extra to the left right top or bottom of the viewpoint and then displaying everything actually inside the viewpoint. This must slow the game down when it gets much bigger surely?

Login to post a reply

Server time is: 2024-09-29 04:29:34
Your offset time is: 2024-09-29 04:29:34