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.

AppGameKit Classic Chat / Dvader's Tutorials

Author
Message
DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 13th Jul 2013 15:22 Edited at: 29th Dec 2013 20:19
Hi, I thought I'd create a thread for all my tutorials in one place, as suggested by The Zog.

One thing I would ask, is to please not use an ad blocker. It is practically a swear word in the youtube community. We don't make a whole lot from adverts, but it costs you nothing, just a little time. Go make a cup of tea, or grab a beer while it runs! Obviously I would probably earn a lot more if I just concentrated on making paid apps, but I do like to help people out, and enjoy making these tutorials. Still, it is nice to get a little something for the time spent making a video!

Speed tips for AGK.


Isometric Depth in AGK.


Parallax Scrolling in AGK.


Parallax Scrolling in AppGameKit 2 (Combing methods for more useful stuff!)


Sprite Collision in AGK.


How I made my Deathchase 3D intro for Youtube.


An Example level Editor.


Part 2 of the Level Editor example. How to add images.


Tile Scrolling Example


Understanding Variables, arrays and types.


Orbit and Offset example.


Simple Arcade Shooter Example. This is a long one, be warned!


Simple Arcade Shooter Example Part 2. Adding an animated menu.


Particles - How to use them.


FPS Control Example - Looking around with the mouse, walking and strafing.


FPS Tutorial 2. Create a random city for you to walk around.


FPS Tutorial 3. Adding simple collision to the buildings.


I will add to the list as I make new ones.

haliop
User Banned
Posted: 14th Jul 2013 02:08
leo877
16
Years of Service
User Offline
Joined: 6th Mar 2008
Location: san antonio, tx
Posted: 14th Jul 2013 09:28
@dvader

can you put a headline on what each video is; to get a better understanding what each video is.
DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 14th Jul 2013 15:59
Thank you Haliop, I'm glad they were helpful!
Leo877, all done! I thought the video titles would be more obvious on the links, but it should be all clear now.

haliop
User Banned
Posted: 14th Jul 2013 15:59
hi do you know anything about copying files created inside an app to a new folder?

DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 14th Jul 2013 16:25
If it is a file made from within your app, you should be able to use
SetRawWritePath( "c:/new" ) for an example. Then save your files, they should be automatically placed in the new folder inside a sub media folder "c:\new\media\filename". This is only good for windows as far as I know. Hope that helps. I will be adding an editor example next so that will involve file saving and such.

haliop
User Banned
Posted: 14th Jul 2013 16:32
yeah i cant use that since its not cross platform...

DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 14th Jul 2013 16:51
I don't think there is a way to change on mobile devices as yet, or if ever. Quite possibly against Apples rules at a guess.

Ancient Lady
Valued Member
20
Years of Service
User Offline
Joined: 17th Mar 2004
Location: Anchorage, Alaska, USA
Posted: 14th Jul 2013 17:46
Quote: "Quite possibly against Apples rules at a guess."

Absolutely. They require all apps to be sand boxed. You can only write in locations allocated to the app. This is for both iOS and Mac.

This also applies to Android as well.

Cheers,
Ancient Lady
AGK Community Tester and AppGameKit Master
The Zoq2
14
Years of Service
User Offline
Joined: 4th Nov 2009
Location: Linköping, Sweden
Posted: 14th Jul 2013 17:50 Edited at: 14th Jul 2013 18:07
Im pretty sure that dosn't apply to android. I have a lot of apps that write to the internal storage which the user can access.

Judging by this, there are 4 places to store files and external/internal storage is 2 of them. It probably needs special permissions though but im not sure how many people actually look at that.

Edit: forgot to add the link http://developer.android.com/guide/topics/data/data-storage.html
Ancient Lady
Valued Member
20
Years of Service
User Offline
Joined: 17th Mar 2004
Location: Anchorage, Alaska, USA
Posted: 14th Jul 2013 22:13
You appear to be right, based on the linked article.

But none of the options listed allow you to access paths for other apps.

And they do appear to be sand boxing to one degree or another.

Quote: "
Using the Internal Storage
You can save files directly on the device's internal storage. By default, files saved to the internal storage are private to your application and other applications cannot access them (nor can the user). When the user uninstalls your application, these files are removed."


All the commands for dealing with 'Internal Storage' talk exclusively about the area created for each app only. (Sand boxed.)

And the details shown for 'External Storage' examples also indicate that it is restricted to the app's path and not others.

They do allow access to some common shared areas (but you cannot use any other paths outside of your own app):
Music/ - Media scanner classifies all media found here as user music.
Podcasts/ - Media scanner classifies all media found here as a podcast.
Ringtones/ - Media scanner classifies all media found here as a ringtone.
Alarms/ - Media scanner classifies all media found here as an alarm sound.
Notifications/ - Media scanner classifies all media found here as a notification sound.
Pictures/ - All photos (excluding those taken with the camera).
Movies/ - All movies (excluding those taken with the camcorder).
Download/ - Miscellaneous downloads.

Both Android and iOS/Mac appear to allow SQLite access. But that isn't files. Although, it can be an interesting way to store stuff. But you need to work in Tier 2 to be able to interface with it (at this point).

Cheers,
Ancient Lady
AGK Community Tester and AppGameKit Master
Battoad
AGK Developer
17
Years of Service
User Offline
Joined: 12th Feb 2007
Location: A Dark Place
Posted: 15th Jul 2013 14:17
Re :
Quote: "Deathchase 3D intro"


Many thanks for sharing this one, it brings back a lot of memories from my old specy. If you can do this with 3D as it is now, I can't wait for the new AGKv2 enhancements.

keep up your excellent tutorials.

MrValentine
AGK Backer
13
Years of Service
User Offline
Joined: 5th Dec 2010
Playing: FFVII
Posted: 15th Jul 2013 15:47
Very Nice Work!



DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 17th Jul 2013 15:32
Thanks, Juney and MrValentine! I will do my best to keep doing more tutorials when I can. I do game vids as well, and although, not that popular as yet, I keep plugging away. I'm not happy with the editor video yet, so will need to rethink it a little.

DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 19th Jul 2013 20:13
New level editor video now up!

DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 22nd Jul 2013 22:21
I thought it might be useful, to include the code for my editor video.
Leo877, I will see what I can do about making a tiled parallax scrolling example. Thanks for your comments!
Anyone who has subscribed, commented or liked my tutorials so far are all awesome and I thank you all!



leo877
16
Years of Service
User Offline
Joined: 6th Mar 2008
Location: san antonio, tx
Posted: 23rd Jul 2013 05:42
@Dvader

Thanks for posting the level editor code. I had a hard time watching and trying to code then rewind and pause to finish coding. I just asking about using parallax scrolling with a title level editor. Because after watching your video of classic games for 80's and other systems, I was wonder how mario nes is done with limited memory back then compare to now memory. thats why i was wondering if title scrolling was done or parallax scrolling.

time to tweak the editor a little.
DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 23rd Jul 2013 18:42 Edited at: 26th Jul 2013 02:12
Yeah, all the old games used gridded tiles, not much choice really. Once you have one layer of tiles working adding in more would be easy enough, although you may be better using a UV scroll for backdrop layers. Eventually, lots of grids will slow things a little. I imagine many older games would have used a grid for the main front layer, and then cheated a little for backdrop layers, or at least some if there were more than two.
It has been way to hot and muggy for me to get any coding done since I posted the last tutorial. So it may be a week or so before I get another up.

DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 26th Jul 2013 02:31
New Editor tutorial is now up! Although I can't seem to link it directly at the moment for some reason. All I see is a white box. Hopefully, I can update it later and it will work ok!

leo877
16
Years of Service
User Offline
Joined: 6th Mar 2008
Location: san antonio, tx
Posted: 26th Jul 2013 05:15
Dvader
Thie upgrade is cool, cant for my weekend day from work to play around with this code.
DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 26th Jul 2013 05:44 Edited at: 26th Jul 2013 05:45
Thanks Leo, I hope I have covered everything, I feel sure I have missed something in the telling..
I'll try to answer any questions as ever. If I have missed something let me know! I am not infallible, far from it! I've never had any tutoring as such, in the traditional sense at least! I have had a few pointers over the years, from these forums, and in person. Pincho for instance was a great help many years ago, in the Amiga days. He frequents the DB forums in the main, but is a helpful chap, and very talented! His real name is a little like an Ents name, very long, I also wouldn't want to say it without his permission! If you see this, thanks Pincho!

leo877
16
Years of Service
User Offline
Joined: 6th Mar 2008
Location: san antonio, tx
Posted: 26th Jul 2013 06:47
Dvader
It justs gives me ideas to tweak to my liking. In your video you metion one screen scroll type which is what kind have in mind. You mention you got to strech the array map longer. I also want to follow and code the parallax scrolling.Adding images par4 is helpful, not a fan of gimp tried to lost to used it. I brought the pr omotion v5 from tgc and its okay but color limited. Still like it.
DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 27th Jul 2013 18:51 Edited at: 27th Jul 2013 18:53
@ leo877, great, that's what I hope people will take from the videos, ideas to advance their own code! Did I use the Gimp? I would be surprised if I did as I find it a little awkward myself. I tend to use PSP in the main. Theres also a free version of photoshop available off the official website, which could be of use. It's an older version, but still fully capable!

I have added a tile scrolling example to the list! Hopefully, that will give people an idea of what I meant in my previous editor example, regarding arrays.

leo877
16
Years of Service
User Offline
Joined: 6th Mar 2008
Location: san antonio, tx
Posted: 29th Jul 2013 07:37
@Dvader
i watch the editor 2 video again, it my fault. you didn't use GIMP but another program. sorry for that.

i got some question and suggestion for your video in the furture.

1? are gosub or function better to use.. are there pros/con to each other.

2? A i notice that your tile scroller has editor. would it possible to strip it out the scroll and used the map.dat from the other editor you post. B it okay just use the tile scroller for scrolling.

heres a suggestion at the end of your video can you pause on section of the codes for those who typing the code from the video.


thanks dvader for this videos and help. i need to watch the collision one for my section o f code for my game.. i gonna use this level editor and scroller for my game but haven't got to that part of coding the game part.
DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 29th Jul 2013 16:02 Edited at: 29th Jul 2013 16:04
Hi Leo877,
There's not much difference between them, I'm just a bit stuck in my ways, lol. The main difference is how they handle variables and such. With a function, if you want to access a variable or array from your main code, you have to remember to make them global, so the function can see them. With a gosub that is not necessary. However, you can get a function to return values and then use those, rather than directly altering your variable or array in the function. You also don't have to worry about returns, which if you don't have a care, can cause problems. They are fine if you make sure you use them properly though. Always get your code to return back through any gosubs you have used. For instance don't use a gosub and then a goto from within the code you sent it to (gotos to be honest are universally disliked these days, even I don't use them if at all possible).
Both are portable. Functions being easier to copy from one project to another in general. Because any variables in them will not interfere with any other code (unless you used globals of course).
It's really a personal preference for me, you could easily convert my gosubs to functions if you wanted. I'll perhaps look at something to do with functions (sigh, lol), to show people how to use them. They are useful, I just never much use them myself.

Although the editors will be similar in many ways they probably won't be compatible, at least how they are coded at present. No reason you can't get them to work together though. You would have to get the editor to allow for more than one screen of course.
I'll find the oce out and post it up when I can, it would be easier to use for scrolling. My Editor really was for one screen games, not scrolling stuff. The scrolling code I did had an editor also, although I'm not sure how complete it is as I lost most in a hard drive crash.

Ancient Lady
Valued Member
20
Years of Service
User Offline
Joined: 17th Mar 2004
Location: Anchorage, Alaska, USA
Posted: 29th Jul 2013 17:03
leo877, two of the advantages of functions are that they encapsulate a set of code and allow passing parameters.

One of the disadvantages of gosubs (in my opinion) is that it is to easy to get the calling stack messed up. Especially if you do gosub calls while in a sub. In some languages, subroutines are similar to functions in that they are encapsulated and can take calling paramaters, but don't return a value. That is not the case in AppGameKit Basic.

But, as with all programming, it comes down to programmer comfort and preference.

Having said that, the current version of AppGameKit has a problem passing UDTs as parameters for more than one level. This issue discusses it. And it is still an issue.

Cheers,
Ancient Lady
AGK Community Tester and AppGameKit Master
DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 29th Jul 2013 20:05
More eloquently put than me Ancient Lady! I find keeping the stack nice and neat using gosubs to be fairly automatic, as I have used them for so long. However, it is nice to be able to grab an old function and place it in your code, without having to worry what variables/arrays you will need, as with you can with a gosub.

DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 30th Jul 2013 18:18
New video uploaded!

DMJ
12
Years of Service
User Offline
Joined: 6th Sep 2011
Location: Australia
Posted: 3rd Aug 2013 21:02
Thank you for your posts DVader, I followed your tile editor 2 video and my code still doesn't display a tile image.


Thank you.

Attachments

Login to view attachments
leo877
16
Years of Service
User Offline
Joined: 6th Mar 2008
Location: san antonio, tx
Posted: 4th Aug 2013 03:34 Edited at: 4th Aug 2013 04:14
@DMJ

I no expert on coding... but need to make sure each frame of sprite is the same like 32 x 32, 16 x 16..

edit 1

you sprite sheet looks like one big one. and each image don't look the same size...for example the bed frame is smaller then the house frame. this just somethings that i have learn and still learning.

setspriteanimation(cursor,32,32,8)
the 32 is the size of your sprite single frame..8 is how many frames all together


hope this help and some one more experiences get it right for you
DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 4th Aug 2013 15:20
DMJ, your code looks right, but as Leo877 says, you haven't altered the animation data. You should still get something displayed, just nothing like right!

Try changing your setspriteanimation lines to 32,32,256. That will split your image up properly. You will have to place your beds, roofs and such in parts, but it will work.

You could always play about with the code, if you wanted the beds automatic from placing the first tile of course. Just a matter of noting the rest of the beds tiles and then placing them down automatically underneath if you put down the top one. The first bed for instance would be tile 1,2 and 3 ( I think off the top of my head, otherwise,1,17 and 33).

Hopefully that will help, if not more info would be needed on exactly what it is doing.

leo877
16
Years of Service
User Offline
Joined: 6th Mar 2008
Location: san antonio, tx
Posted: 4th Aug 2013 18:45
@dvader

i just tried DMJ code, and when i press minus or plus or mouse i get a message saying ...pic attach.


to me it looks like his frames not the same size in the sprite sheet because i change 256 and still get errors.

Attachments

Login to view attachments
DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 4th Aug 2013 21:21
Try this. I've tweaked it to work with 256 frames, using a variable to make it easier to alter. Tried it with the image and it works fine.


leo877
16
Years of Service
User Offline
Joined: 6th Mar 2008
Location: san antonio, tx
Posted: 5th Aug 2013 05:08
@dvader

the code you re post work... so you add this line maxframes=256

and change the 8 to maxframes


so the command setspriteanimation(cursor,32,32,maxframes) is the command making 32,32 frames no matter how big the sprite sheet is.
Bly B3k
10
Years of Service
User Offline
Joined: 7th Jul 2013
Location: Nowhere And Everywhere
Posted: 5th Aug 2013 07:29
Hey there DVader:

I watched your video Part 2 of the Level Editor
and used it to create a map.dat file, but I don't
know how to load the map.dat file into my AppGameKit program.

how do I load this map.dat file into my AppGameKit program and
do I copy the tileset2.png file used in making the map.dat
file into my AppGameKit media folder?
DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 5th Aug 2013 15:11
@ leo877. The command setspriteanimation(cursor,32,32,maxframes) will make sprite frames of 32x32 in size, with 256 frames. That's 16x16 32x32 sized sprites to be exact.
The bit of code that cycles through the images needs to match how many sprites you have, as that is how you choose your images in the editor.

@ Bly B3k. The code is all in there. In the code there is a label called load. Just use that in your AppGameKit project. Don't forget to dim the map array for it. Also remember to copy your map data into your media folder.

DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 8th Aug 2013 21:20
Simple Arcade Shooter Example added!

DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 11th Aug 2013 16:06
Here is the project folder for the simple shooter game example. It should make it easier for you to follow along without worrying about typing all the code out.

Attachments

Login to view attachments
leo877
16
Years of Service
User Offline
Joined: 6th Mar 2008
Location: san antonio, tx
Posted: 12th Aug 2013 02:28 Edited at: 12th Aug 2013 02:32
@Dvader

thanks posting your code and project for a simple shooter. It would help me to look and compare your code to my code to see were i going wrong.

On another note about
Quote: "The command setspriteanimation(cursor,32,32,maxframes) will make sprite frames of 32x32 in size, with 256 frames. That's 16x16 32x32 sized sprites to be exact."


Are you saying that no matter what size my whole sprite sheet is, for example 512 * 512. The command will divide the sprite sheets in the size you code The command setspriteanimation(cursor,32,32,maxframes) 16,16, or 32,32, or 64,64. you just need to know how many frames are in there. Know matter what size of your sprite images don't have to be all the same size like the sprite sheet DMJ post.

I thought all this time the images all had to be the same size 32,32. I hope you understand what I am trying to say.

Keep posting those code videos, and those retro game video like road rash, and kung fu master bring back funny memories for me.
DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 12th Aug 2013 17:31 Edited at: 12th Aug 2013 17:44
Sort of. As long as you divide a sheet up equally you can have any size you want. So a 128x128 image can be one frame, 2 frames, 4 frames etc. AppGameKit will count from left to right grabbing the size you specify until it gets to the max frames you have set, or reaches the right edge. If it has more frames left to include, it will move down and back to the left and continue.

The 256x256 image above has for instance a 64 frame maximum using 32x32 size frames. Of course if you want more you would need to make the frames smaller (16x16) or double the image size to retain the current frame size. You don't have to use all the frames in the image for an animation either. You could for instance just grab the first 7 frames on this image with. setspriteanimation(image,32,32,7)
32,32 being the frame size. 7 being the number of frames. It's fairly simple once you get the idea.

Attachments

Login to view attachments
leo877
16
Years of Service
User Offline
Joined: 6th Mar 2008
Location: san antonio, tx
Posted: 13th Aug 2013 06:03
@Dvader

So all this time I thought the command ment that your sprite images had to be a certain size l didn't know it was use like this. Or maybe I got this command confuse with other commands similar to this code.
DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 13th Aug 2013 13:17
No, you can use whatever size you specify. You only have to make sure that it will fit into the spritesheet. I've added a little to the last game example already, so I can perhaps explain it a little more in the next video.

DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 14th Aug 2013 14:45
Part 2 of the shooter example now up! This is mostly about adding a menu and getting it more complete. I also mention some android stuff. This should be playable on an android or other mobile devices after.

It won't be perfect, as I haven't changed all the position code for it, the score, lives etc will be over to the left on some (most) devices. The main player may even be positioned wrong on tablets. Still the code is in there for how to do it. So it would be easy enough to go through these small issues and fix them to work on any machine with percentage based positioning.

leo877
16
Years of Service
User Offline
Joined: 6th Mar 2008
Location: san antonio, tx
Posted: 16th Aug 2013 06:34
@dvader

i know you haven't upload the particle video to your list here but i just got done coding it. I have two question to ask..


Q1. when you add your own image, can you use more the one image for example a exploding car, having different shapes and color as the derbie.

Q2. how do i make the particle right behind my sprite , in your code the particle is left of my sprite.
The Zoq2
14
Years of Service
User Offline
Joined: 4th Nov 2009
Location: Linköping, Sweden
Posted: 16th Aug 2013 12:08
Quote: "Q1. when you add your own image, can you use more the one image for example a exploding car, having different shapes and color as the derbie."


That won't be possible since AppGameKit uses the same image for every particle to increase performance.

Quote: "how do i make the particle right behind my sprite , in your code the particle is left of my sprite."


My guess is that you are using getSpriteX and Y. That gets the left corner of the sprite. Instead you want to be using getSpriteXByoffset which gets the offset point of the sprite (default center)

Say ONE stupid thing and it ends up as a forum signature forever. - Neuro Fuzzy
JimHawkins
14
Years of Service
User Offline
Joined: 26th Jul 2009
Location: Hull - UK
Posted: 16th Aug 2013 12:59
I haven't tried, but is there a limit to number of particle emitters? You might be able to several with different images. Maybe!!

-- Jim DO IT FASTER, EASIER AND BETTER WITH AppGameKit FOR PASCAL
DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 16th Aug 2013 14:18 Edited at: 16th Aug 2013 14:23
Well, if you have watched the video, you will have seen the setparticlesmax command. So I suppose you could have several particles made with a max of what is needed, say 4 for wheels, 1 for engine and so on, each with it's own image, and play them all at once, but I'm not too sure how it would look. I see Jim Hawkins has already mentioned the idea.

With the wand I wanted the effect to be on the left top, as that is about right for the image I made. When positioning sprites you can use the setspritepositionbyoffset option, as the Zog mentions. That will default to the center of your sprite, unless you have altered it with the setoffset commands.

I have added the Particles Video into the list now.

DennisW
15
Years of Service
User Offline
Joined: 15th Jun 2008
Location: Ohio
Posted: 21st Aug 2013 17:52
@ DVader These tutorials come in very handy. You know the old saying a little knowledge is dangers. These tutorials help round it off. At the age where a senior moment kicks in. Thanks for your work on these. I have it pined to my task bar.

Ham and Eggs Breakfast
The Chicken was involved the Pig was Committed
AGK Community Tester
Marl
12
Years of Service
User Offline
Joined: 19th Nov 2011
Location: Bradford, UK
Posted: 25th Aug 2013 22:35 Edited at: 25th Aug 2013 22:37
Quote: "Of course if you want more you would need to make the frames smaller (16x16) or double the image size to retain the current frame size. You don't have to use all the frames in the image for an animation either. You could for instance just grab the first 7 frames on this image with. setspriteanimation(image,32,32,7)
32,32 being the frame size. 7 being the number of frames. It's fairly simple once you get the idea."

I think it's also worth mentioning that you can combine animation sets of different sizes on the same sheet. Providing you use different animation sizes for the sprites and the sizes are all factors of the image size (image size divides by them in whole numbers), they can all share the same image.

You can even use the same image for the font.

I often start a project with a template such as this (note the frame numbers to help position the tiles of various sizes);

Attachments

Login to view attachments
DVader
20
Years of Service
User Offline
Joined: 28th Jan 2004
Location:
Posted: 28th Aug 2013 20:49
@ DennisW, thanks, I've messed around programming for many years, I try to do things as simply as possible. I'm glad you find these videos useful!
@ Marl, yes it's useful to use one sheet with different sprite sizes and anims, I actually did this in my Simple Shooter example. It's fairly easy to do and has various applications.

I'm struggling with ideas for another video at present, as I've covered a fair bit. I'm sure inspiration will strike at some point soon!

Login to post a reply

Server time is: 2024-04-20 11:22:55
Your offset time is: 2024-04-20 11:22:55