Zeid's Epic Art Thread

Forum for the creative side of the game development process: art, music, storyline, gameplay, concepts, etc. Any sort of relevant discussion is welcome here.

Moderator: PC Supremacists

User avatar
zeid
Chaos Rift Junior
Chaos Rift Junior
Posts: 201
Joined: Fri Apr 24, 2009 11:58 pm

Re: Zeid's Epic iPhone Game Post: Update Pending

Post by zeid »

Behold my ability to triple post without any sense of guilt or shame. Bwahaha i am truly a monster!

Here are a couple of teaser screenshots.
Image Image

I'm planning on doing a youtube video, what sort of things would people like to see? Obviously some gameplay segments. What else?

Also if people are wondering why I'm not talking about the project much lately, it's because I have been working on it and other uni/work things a lot. After this month is through however I should be up to Beta testing the game on iBetaTest.com. Then it's just a matter of polish and making lots of levels and perhaps some challenge modes. I may hook this bad boy up to my site so to record the highscores of players.

I may improve the art with regard to a few things later on as I'm not completely happy with the way everything looks. We will see, I might be too lazy.

Does anyone have any suggestions on how to get some attention for this game? From talking with other iPhone developers it seems poor marketing is where most games fall short and therefore don't get the attention they need/deserve.
Axolotl Pop!
Image
Or, try it for free.

For many more free games online visit www.sam-zeid.com
pritam
Chaos Rift Demigod
Chaos Rift Demigod
Posts: 991
Joined: Thu Nov 13, 2008 3:16 pm
Current Project: Elysian Shadows
Favorite Gaming Platforms: Amiga, PSOne, NDS
Programming Language of Choice: C++
Location: Sweden

Re: Zeid's Epic iPhone Game Post: Update Pending

Post by pritam »

zeid wrote:I'm planning on doing a youtube video, what sort of things would people like to see? Obviously some gameplay segments. What else?
How about showing us your dev studio, like recording the screen where you compile your project and perhaps also recording of your computer setup, I think that would be interesting to see.
User avatar
Bakkon
Chaos Rift Junior
Chaos Rift Junior
Posts: 384
Joined: Wed May 20, 2009 2:38 pm
Programming Language of Choice: C++
Location: Indiana

Re: Zeid's Epic iPhone Game Post: Update Pending

Post by Bakkon »

I was wondering why I had never seen this thread before, but then realized it was once your artwork dump. You have some amazing sprite skills.

Are you using the iPhone SDK or something like Unity?
User avatar
zeid
Chaos Rift Junior
Chaos Rift Junior
Posts: 201
Joined: Fri Apr 24, 2009 11:58 pm

Re: Zeid's Epic iPhone Game Post: Update Pending

Post by zeid »

It uses the iPhone SDK. The game is almost entirely written in C++ code using openGL ES for rendering. There are 2 or so classes that are written in Objective-C that I have wrapped around. The engine is all from scratch, including; rendering, physics, image loading, animation, entity management, state management, etc. The core of the game is all but done. All that is left is some more polish, improving the menu systems adding some more level and perhaps some more power-ups. As soon as I get some time spare (Probably in a week or 2) I will begin beta testing publicly (I have technically been testing since it started by harassing my friends and family to play).
Axolotl Pop!
Image
Or, try it for free.

For many more free games online visit www.sam-zeid.com
User avatar
ibly31
Chaos Rift Junior
Chaos Rift Junior
Posts: 312
Joined: Thu Feb 19, 2009 8:47 pm
Current Project: Like... seven different ones
Favorite Gaming Platforms: Xbox 360, Gamecube
Programming Language of Choice: C++, ObjC
Location: New Jersey.

Re: Zeid's Epic iPhone Game Post: Update Pending

Post by ibly31 »

I always wondered how you beta test for iPhone games... because the only way I could think of would be to give the entire project, and let the person change the com.samzeid.imadethisup to com.ibly31.imadethisuptoo and compile it...

Also, would you ever post this code up? Or even portions of it? Because I would give up an arm to get a glimpse of the rendering code you use! It would help me learn how to use OGL on the iPhone a lot easier
Image
Twitter
Website/Tumblr
My Projects

The best thing about UDP jokes is that I don’t care if you get them or not.
User avatar
zeid
Chaos Rift Junior
Chaos Rift Junior
Posts: 201
Joined: Fri Apr 24, 2009 11:58 pm

Re: Zeid's Epic iPhone Game Post: Update Pending

Post by zeid »

Well in all honesty the code has gotten to the stage where it's about as pretty as dog vomit. I will release the source (or parts of it) regardless, though I'm sure I will feel great shame having everyone look at it :P and I doubt most of it will be of much use for learning given how untidy it is.

I will not go out of my way too clean up the code as most of the ugly stuff is abstracted away from and I can't afford to sink time into it.

Seeing as you are interested here is the C++ section of my rendering code:

Code: Select all

/*
 *  Renderer.h
 *  core
 *
 *  Created by Samuel Zeid on 16/02/10.
 *  Copyright 2010 *. All rights reserved.
 *
 */

#ifndef _RENDERER_H
#define _RENDERER_H

#import <QuartzCore/QuartzCore.h>

#include <OpenGLES/EAGL.h>
#include <OpenGLES/ES1/gl.h>
#include <OpenGLES/ES1/glext.h>

#include "Singleton.h"

#include "TextureManager.h"
#include "AnimationManager.h"
#include "StateManager.h"
#include "SpriteManager.h"
#include "Entity.h"

#include <map.h>
#include <list.h>

class Renderer : public Singleton<Renderer>
{
	friend class Singleton<Renderer>;
public:
	void initialise(EAGLContext* context, GLuint renderBuffer, GLuint frameBuffer)
	{
		textureManager=TextureManager::instance();
		stateManager=StateManager::instance();
		animationManager=AnimationManager::instance();
		spriteManager=SpriteManager::instance();
		m_context=context;
		m_renderBuffer=renderBuffer;
		m_frameBuffer=frameBuffer;
		
		glEnable(GL_TEXTURE_2D);
		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE);
		glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE);
		glBlendFunc(GL_ONE, GL_ONE_MINUS_SRC_ALPHA);
		glEnable(GL_BLEND);
		glDisable(GL_LIGHTING);
		glDisable(GL_DEPTH_TEST);
		
		vertices[0]=-0.5f;
		vertices[1]=0.5f;
		
		vertices[2]=0.5f;
		vertices[3]=0.5f;
		
		vertices[4]=-0.5f;
		vertices[5]=-0.5f;
		
		vertices[6]=0.5f;
		vertices[7]=-0.5f;
		
		texCoords[0]=0.0f;
		texCoords[1]=0.0f;
		
		texCoords[2]=1.0f;
		texCoords[3]=0.0f;
		
		texCoords[4]=0.0f;
		texCoords[5]=1.0f;
		
		texCoords[6]=1.0f;
		texCoords[7]=1.0f;

		[EAGLContext setCurrentContext:m_context];
		glBindBuffer(GL_FRAMEBUFFER_OES, m_frameBuffer);
		glViewport(0,0,320,480);
		
		glMatrixMode(GL_PROJECTION);
		glLoadIdentity();
		glOrthof(0.0f, 320.0f, 0.0f, 480.0f, 0.0f, 1.0f);
		glMatrixMode(GL_MODELVIEW);
		
		glClearColor(0.5f, 0.55f, 0.65f, 1.0f);
		
		glEnableClientState(GL_VERTEX_ARRAY);
		glEnableClientState(GL_TEXTURE_COORD_ARRAY);
		
		//Make them pixels nice and crisp...
		//glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
		//glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);

	}
	
	void render()
	{
		glClear(GL_COLOR_BUFFER_BIT);
		glColor4f(0.0f,0.0f,0.0f,1.0f);
	
		renderCycle();
		glBindRenderbufferOES(GL_RENDERBUFFER_OES, m_renderBuffer);
		[m_context presentRenderbuffer:GL_RENDERBUFFER_OES];
	}
	
private:
	Renderer(){}
	~Renderer()
	{
		textureManager->release();
		NSLog(@"Cleanup");
	}
	void renderCycle()
	{
		glVertexPointer(2, GL_FLOAT, 0, vertices);
		glTexCoordPointer(2, GL_FLOAT, 0, texCoords);

		State* drawState;
		GLuint previousTexture;
		
		for(int i=0;i<stateManager->size();i++)
		{
			drawState=stateManager->states[i]->state;
			
			if(drawState->visible)
			{
				glPushMatrix();
				glTranslatef(drawState->camera.x, drawState->camera.y, 0);
				list<Entity*>* layer=drawState->entityManager->getLayer(0);
				int layerCount=drawState->entityManager->layerCount()+1;
				for(int i=0; i<layerCount;i++)
				{
					for(list<Entity*>::iterator iter=layer->begin();iter!=layer->end();++iter)
					{
						Entity* e=*iter;
						if(e->y>(-drawState->camera.y)-(e->sizeY/2)&&e->y<(-drawState->camera.y)+480+(e->sizeY/2))
						{
							e->onScreen=true;
							Animation *a=animationManager->getAnimation(e->currentAnimation);
							
							if(!e->textureDetail())
							{
								glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
								glTexParameterf(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
							}
							else
							{
								glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_NEAREST);
								glTexParameteri(GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_NEAREST);
							}
							
							if(a->spriteSheet!=previousTexture)
								textureManager->bindTexture(previousTexture=a->spriteSheet);
						
							float cellDiff=(a->getDiff(e->currentSubframe))*spriteManager->getCellDiff(a->spriteSheet);
						
							texCoords[4]=texCoords[0]=cellDiff;
							texCoords[6]=texCoords[2]=cellDiff+spriteManager->getCellDiff(a->spriteSheet);
							
							glPushMatrix();
							glColor4f(drawState->screenRed*e->red, drawState->screenGreen*e->green, drawState->screenBlue*e->blue, 1.0f);
							glTranslatef(e->x, e->y, 0);
							glScalef(e->sizeX, e->sizeY, 0);
							glRotatef(e->rotation, 0, 0, 1);
						
							glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);
						
							glPopMatrix();
						}
						else
						{
							e->onScreen=false;
						}

					}
					layer=drawState->entityManager->getLayer(i);//stateManager->getLayer(i);
				}
				glPopMatrix();
			}
		}
	}
	
	EAGLContext *m_context;
	GLuint m_renderBuffer, m_frameBuffer;
	float vertices[8],texCoords[8];
	list<Entity*>* layer;
	TextureManager *textureManager;
	StateManager *stateManager;
	AnimationManager *animationManager;
	SpriteManager* spriteManager;
};

#endif
I never bothered implementing VBO's for it (which is recommended) and there are a number of other things I would change if I were to spend more time on it:
* Obviously clean up the code a bit.
* Use dynamic VBO's and adjust their data using my own matrix class rather then the inbuilt openGL functions for translation, rotation and scaling.
* Use the batch rendering classes I had originally intended to use (dividing the objects to be drawn into groups based on their texture).
Instead of that I ended up using a cheap trick to improve rendering which took 3 minutes to implement. Whenever a texture is bound I store it's id value then whenever an object is to be drawn I check if it has the same texture value, if it does I don't bind the texture, otherwise I do. This mightn't seem like much of a boost, but because I sort objects based on the layer they are in when drawing (they get drawn from back to front on top of one another) most objects of the same type are in the same layer, and hence all are drawn one after another.
Axolotl Pop!
Image
Or, try it for free.

For many more free games online visit www.sam-zeid.com
User avatar
avansc
Respected Programmer
Respected Programmer
Posts: 1708
Joined: Sun Nov 02, 2008 6:29 pm

Re: Zeid's Epic iPhone Game Post: Update Pending

Post by avansc »

Gotta say man, looks uber polished, nice work. hope it sells like chocolate dipped bacon. (if you were planning on putting it on the istore)
Some person, "I have a black belt in karate"
Dad, "Yea well I have a fan belt in street fighting"
User avatar
eatcomics
ES Beta Backer
ES Beta Backer
Posts: 2528
Joined: Sat Mar 08, 2008 7:52 pm
Location: Illinois

Re: Zeid's Epic iPhone Game Post: Update Pending

Post by eatcomics »

um... avan where can I get some of this chocolate dipped bacon? that sounds sooooo good right now...
Image
User avatar
Falco Girgis
Elysian Shadows Team
Elysian Shadows Team
Posts: 10294
Joined: Thu May 20, 2004 2:04 pm
Current Project: Elysian Shadows
Favorite Gaming Platforms: Dreamcast, SNES, NES
Programming Language of Choice: C/++
Location: Studio Vorbis, AL
Contact:

Re: Zeids Epic Art Post

Post by Falco Girgis »

GroundUpEngine wrote:
zeid wrote:Some nice suggestions so far, thanks.

I decided I liked the grub character so here's some elysian shadow "fan-art" I suppose:
Image
the left is the original the right is my redux of the little guy.
Holy crap niceeee, Kendall would be proud ;)
Oh, man. I don't know how the hell I missed this. I quit following the thread for a few days. XD

I'll have to show Kendall. Very nice!
User avatar
zeid
Chaos Rift Junior
Chaos Rift Junior
Posts: 201
Joined: Fri Apr 24, 2009 11:58 pm

Re: Zeid's Epic iPhone Game Post: Update Pending

Post by zeid »

I don't know how the hell I missed this. I quit following the thread for a few days. XD
Well now you know the error of your ways and it won't happen again. Just set this thread to your homepage :P
Gotta say man, looks uber polished, nice work. hope it sells like chocolate dipped bacon. (if you were planning on putting it on the istore)
Thanks I was going for a nice clean and finished experience rather then load and load of features so I'm glad it shows, I do intend to put it up for sale, and we can only hope it sells that well. I got similar feedback this night, which was very affirming as it was from people actually getting to see it in action/playing it rather then just screenshots. (more on that bellow).

My university had a games industry open day this afternoon. We were encouraged to show off our work to people around the area. Unfortunately Perth/WA hasn't any games development industry aside from independent developers (perth actually does have a really good indie scene). So I showed a bunch of my projects I have made including this iPhone game, some people approached me from Immersive Technologies which is a mining simulation company. One of which gave me his e-mail address and suggested I contact him if I'm interested in working for them at the end of this year, after I'm done with my course. Simulation technology mightn't be exactly what I was hoping to get into, but I would think that it would be a good way to go about getting my foot in the door (it will probably pay better then a game's job as well). Also it doesn't require me to relocate from the city I'm living, which could be very difficult having just been a flat broke student. The only real issue for me to consider is whether I should/or how I could go about doing honors if I am going to end up working for them.

Needless to say it was great getting some feedback from some industry people that was so positive.

EDIT:
On another note the people at Immersive, as with the majority of other companies in graphics software use DirectX for all their rendering. So for my side project this semester I will be creating some cross platform stuff hopefully that uses DirectX on windows and openGL on mac. I may also include Linux if I can be bothered installing/partitioning my mac book for it.
Axolotl Pop!
Image
Or, try it for free.

For many more free games online visit www.sam-zeid.com
User avatar
MrDeathNote
ES Beta Backer
ES Beta Backer
Posts: 594
Joined: Sun Oct 11, 2009 9:57 am
Current Project: cocos2d-x project
Favorite Gaming Platforms: SNES, Sega Megadrive, XBox 360
Programming Language of Choice: C/++
Location: Belfast, Ireland
Contact:

Re: Zeid's Epic iPhone Game Post: Update Pending

Post by MrDeathNote »

zeid wrote:Behold my ability to triple post without any sense of guilt or shame. Bwahaha i am truly a monster!

Here are a couple of teaser screenshots.
Image Image

I'm planning on doing a youtube video, what sort of things would people like to see? Obviously some gameplay segments. What else?

Also if people are wondering why I'm not talking about the project much lately, it's because I have been working on it and other uni/work things a lot. After this month is through however I should be up to Beta testing the game on iBetaTest.com. Then it's just a matter of polish and making lots of levels and perhaps some challenge modes. I may hook this bad boy up to my site so to record the highscores of players.

I may improve the art with regard to a few things later on as I'm not completely happy with the way everything looks. We will see, I might be too lazy.

Does anyone have any suggestions on how to get some attention for this game? From talking with other iPhone developers it seems poor marketing is where most games fall short and therefore don't get the attention they need/deserve.
That looks amazing, seriously, i'm gonna buy it!!
http://www.youtube.com/user/MrDeathNote1988

Image
Image

"C makes it easy to shoot yourself in the foot. C++ makes it
harder, but when you do, it blows away your whole leg." - Bjarne Stroustrup
User avatar
avansc
Respected Programmer
Respected Programmer
Posts: 1708
Joined: Sun Nov 02, 2008 6:29 pm

Re: Zeid's Epic iPhone Game Post: Update Pending

Post by avansc »

zeid wrote:
I don't know how the hell I missed this. I quit following the thread for a few days. XD
Well now you know the error of your ways and it won't happen again. Just set this thread to your homepage :P
Gotta say man, looks uber polished, nice work. hope it sells like chocolate dipped bacon. (if you were planning on putting it on the istore)
Thanks I was going for a nice clean and finished experience rather then load and load of features so I'm glad it shows, I do intend to put it up for sale, and we can only hope it sells that well. I got similar feedback this night, which was very affirming as it was from people actually getting to see it in action/playing it rather then just screenshots. (more on that bellow).

My university had a games industry open day this afternoon. We were encouraged to show off our work to people around the area. Unfortunately Perth/WA hasn't any games development industry aside from independent developers (perth actually does have a really good indie scene). So I showed a bunch of my projects I have made including this iPhone game, some people approached me from Immersive Technologies which is a mining simulation company. One of which gave me his e-mail address and suggested I contact him if I'm interested in working for them at the end of this year, after I'm done with my course. Simulation technology mightn't be exactly what I was hoping to get into, but I would think that it would be a good way to go about getting my foot in the door (it will probably pay better then a game's job as well). Also it doesn't require me to relocate from the city I'm living, which could be very difficult having just been a flat broke student. The only real issue for me to consider is whether I should/or how I could go about doing honors if I am going to end up working for them.

Needless to say it was great getting some feedback from some industry people that was so positive.

EDIT:
On another note the people at Immersive, as with the majority of other companies in graphics software use DirectX for all their rendering. So for my side project this semester I will be creating some cross platform stuff hopefully that uses DirectX on windows and openGL on mac. I may also include Linux if I can be bothered installing/partitioning my mac book for it.

excelent, i have a buddy that works for 4DT, they do mining/medical and that sorta simulations too. he says he loves it.

err edit: i mean 5DT, http://www.5dt.com/ they are based in south africa, but i think they have offices in US.
Some person, "I have a black belt in karate"
Dad, "Yea well I have a fan belt in street fighting"
User avatar
zeid
Chaos Rift Junior
Chaos Rift Junior
Posts: 201
Joined: Fri Apr 24, 2009 11:58 pm

Re: Zeid's Epic iPhone Game Post: Update Pending

Post by zeid »

That looks amazing, seriously, i'm gonna buy it!!
You are awesome then :D

So I was digging around my portfolio/scattered about projects. Trying to put something a little more presentable together and I stumbled accross some things I thought people might like to get a hold of. Namely, the LockedIn models I made ages ago. I remember someone commenting if one of the models was available for use. I did send them to someone who was going to put them into an open source model bundle but don't know if they ever did. As such you can get a hold of the complete model files with textures from here.
Image
Axolotl Pop!
Image
Or, try it for free.

For many more free games online visit www.sam-zeid.com
User avatar
zeid
Chaos Rift Junior
Chaos Rift Junior
Posts: 201
Joined: Fri Apr 24, 2009 11:58 pm

Re: Zeid's Epic iPhone Game Post: Update Pending

Post by zeid »

So a long time ago I put together a space game. It was a one-on-one, two player, overhead shooter. You could choose from a number of different space ships each with two unique abilities and a standard attack. The game was actually pretty good if I do say so myself. I had lots of fun playing it with my brothers and every now and then I get the feeling I should remake it. Each space ship encouraged different strategies due to the unique abilities and the gameplay was surprisingly deep and well balanced. Recently I have been procrastinating a lot having just finished uni for the semester, so to try and get myself motivated again I decided to do some art and redesign some of the ships from said game.

[Remake]
Image
-Spider-
A favourite amongst wealthy slavers, ship-choppers and pirates, the aptly named Spider design has proven as resilient as it is notorious. Originally created during the first faction war this craft's individual components are considered cheap and dated, however its crude nature is why this ship is so commonplace. The craft is able to overload it's engines in such a way that it creates what has been dubbed a 'disruption web'; This web is used to disable nearby vessels allowing ample time for criminals to board or flee from them. Furthermore the inconspicous nature of the individual parts makes the creation of such ships both legal and cost effective. Though outlawed since the unification wars it is not uncommon for Spider fighter's to still use nightstar-mines or similar weaponary. Such devices are often coupled with the Spider fighter's already formidable trapping skills to create insidious ambushes.

[Remake]
Image
-Sword-
Using what was originally mining technology, the Sword fighter is able to generate a propulsion field that makes it all but invulnerable. Furthermore the energy is easily channeled allowing for faster speeds whilst the ship is fully engrossed and protected by said energy. The only draw back is that the energy produced can only be dispelled for short bursts or it will become exponentially volatile and destroy the very craft it protects. Due to the swift nature of the spaceship it has become common practice for a less dangerous burst of the propulsion energy to be output to cleave enemies in two upon ramming them, with little, to no ill effects on the Sword fighter itself. Whilst this lesser energy can't prevent against many oncoming attacks it has proven to serve as a most powerful form of offense and an excellent tool for traversing asteroid fields.

[Remake]
Image
-Foilwing-
The moon of Romulus IV gave rise to the first signs of intelligent life other then our own. Discovered upon it was a long since abandoned and non-functional alien artifact. Though no sign of the race of whom constructed it has ever been seen since, the technology itself has been painfully and extensively analyzed. It proved to be a form of interstellar engine intriguingly different from those of our own. The engines functionality has since been replocated and retrofitted to a number of different craft however it requires the occlusion of many materials that would otherwise be standard on most spaceships. The advantage of this engine is the removal of limitations on short range travel; Whilst most interstellar drives only allow for long distance travel, this engine allows for what to the lamen appears as teleportation. What actually takes place is the literal movement of the spacecraft through other matter in a near instantaneous manner. Due to the somewhat strict nature the engine has over transportable matter, unique weaponary has been devised to use alongside such space-fairing vehicles.

[Remake]
Image
-Scourge-
During the faction wars all manner of weaponary was explored to offer any edge possible. The most malevolent of which manifested itself in the bio-frigates. Small warships that incubated living bio-weapons to be released upon enemy populations, although not uncommon these ships were attrocities to behold and supposedly "uncondoned" by all sides. Such vessels crews would on occasion go mad from the numerous antitoxins and venoms they where constantly being exposed to. When the second faction war ended the majority of those aboard bio-frigates were convicted of war crimes; because of this numerous crafts and their flight staff went missing, dissapearing into the void of space. However in time the shocking result of such actions would reveal itself, some of the ships returned encrusted in living weaponary, now manned by psychotics or spitefilled war veterans, horrifying ghost ships using arcane and corrupt weaponry. The ships have since become known as Scourge class.

[NEW]
Image
-Serpens-
The Serpens class war cruiser was first intruduced during the unification war. It has since become the staple policing ship of the unitarians. Boasting an insurmountable amount of fire power, the broadside of a Serpens class ship is all but unapproachable. It also serves as a carrier to smaller ship allowing it to serve as a living station for unitarian forces as well as a war platform. Finally it is capable of forming a gravity well to reduce the movement of passing vessels, a technology which has been invaluable for it's new roles of inspecting and detaining potential criminal vessels.
Axolotl Pop!
Image
Or, try it for free.

For many more free games online visit www.sam-zeid.com
User avatar
eatcomics
ES Beta Backer
ES Beta Backer
Posts: 2528
Joined: Sat Mar 08, 2008 7:52 pm
Location: Illinois

Re: Zeid's Epic iPhone Game Post: Update Pending

Post by eatcomics »

Dude those are all awesome, but I think the foilwing is my favorite :D
Image
Post Reply