allegro idle state help

idle state help pls

  • (2 Pages)
  • +
  • 1
  • 2

20 Replies - 998 Views - Last Post: 09 April 2009 - 12:54 PM Rate Topic: -----

#1 Fonz01  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 19
  • Joined: 06-March 09

allegro idle state help

Post icon  Posted 06 April 2009 - 03:11 PM

hi

can someone pls help me with allegro, i have all the keys setup as below

wondering how i would go about creating an idle state, which would work by probably reading the last key hit, namely key left or key right and when user stops pressing the key the character is facing that way etc

pls lend a hand ive pulled all my hair :(





 int newxpos, newypos;

			 
			 if (key[KEY_RSHIFT]&&(key[KEY_RIGHT])) {
				newxpos = xpos + 20;
				newypos = ypos - 20;
				if (newypos > backgroundheight)
					newypos = backgroundheight;

				if (newxpos>backgroundwidth)					// If the new x-coordinate exceeds the width of the world then set
					newxpos = backgroundwidth;

				playerSprite->setSpriteState(JUMP_RIGHT);

			
		 } else if (key[KEY_RSHIFT]&&(key[KEY_LEFT])) {
				newxpos = xpos - 20;
				newypos = ypos - 20;
				if (newypos > backgroundheight)
					newypos = backgroundheight;
				if (newxpos>backgroundwidth)					// If the new x-coordinate exceeds the width of the world then set
					newxpos = backgroundwidth;

				playerSprite->setSpriteState(JUMP_LEFT);
							
				
		 }	else if (key[KEY_RCONTROL]&&(key[KEY_LEFT])) {
				newxpos = xpos - 5;
				newypos = ypos;

				playerSprite->setSpriteState(CROUCH_CRAWL_LEFT);



any help appreciated
fonz

Is This A Good Question/Topic? 0
  • +

Replies To: allegro idle state help

#2 stayscrisp  Icon User is offline

  • フカユ
  • member icon

Reputation: 928
  • View blog
  • Posts: 3,997
  • Joined: 14-February 08

Re: allegro idle state help

Posted 07 April 2009 - 12:27 AM

Hi

Well you need to check when a key has been released or when no keys are being pressed,

if(!key[any used keys]))
{
   
}



but you also want to check whether you are facing left or right which can be achieved by using a bool when you face a direction. You can either just make something like

 
bool faceRight;
bool faceLeft;

if(key[RIGHT]))
{
	faceRight = true;
	faceLeft = false;
}
else if(key[LEFT]))
{
   faceLeft = true;
   faceRight = false;
}



then in your check for keys released

if(!key[any keys used]))
{
   if(faceRight)
   {
		// set face right pic
   }
   else if(faceLeft)
   {
	   // set face left pic
   }
}



Thats the idea, just keep trying. I would also recommend using a switch statement instead of if and else if for what you are doing :)
Was This Post Helpful? 1
  • +
  • -

#3 Fonz01  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 19
  • Joined: 06-March 09

Re: allegro idle state help

Posted 07 April 2009 - 07:05 AM

View Poststayscrisp, on 6 Apr, 2009 - 11:27 PM, said:

Hi

Well you need to check when a key has been released or when no keys are being pressed,

if(!key[any used keys]))
{
   
}



but you also want to check whether you are facing left or right which can be achieved by using a bool when you face a direction. You can either just make something like

 
bool faceRight;
bool faceLeft;

if(key[RIGHT]))
{
	faceRight = true;
	faceLeft = false;
}
else if(key[LEFT]))
{
   faceLeft = true;
   faceRight = false;
}



then in your check for keys released

if(!key[any keys used]))
{
   if(faceRight)
   {
		// set face right pic
   }
   else if(faceLeft)
   {
	   // set face left pic
   }
}



Thats the idea, just keep trying. I would also recommend using a switch statement instead of if and else if for what you are doing :)



thanks for the help you have pointed me in the right direction which is good

working on it at the moment,

when you say any keys used do you mean type like this?

int newxpos, newypos;

			
				if (key[KEY_RIGHT]) {								

				newxpos = xpos + 5;								
				if (newxpos>backgroundwidth)					
					newxpos = backgroundwidth;					
				newypos = ypos;									 
																 
				playerSprite->setSpriteState(WALK_EAST);
				
				if (!key[KEY_RIGHT]) {
				playerSprite->setSpriteState(STILL_RIGHT);



do i need to use readkey or anything like that?

thanks a lot for all the help

fonz

This post has been edited by Fonz01: 07 April 2009 - 07:14 AM

Was This Post Helpful? 0
  • +
  • -

#4 stayscrisp  Icon User is offline

  • フカユ
  • member icon

Reputation: 928
  • View blog
  • Posts: 3,997
  • Joined: 14-February 08

Re: allegro idle state help

Posted 07 April 2009 - 07:31 AM

Yeah i guess something like that would work but it is going to get quite messy

something like

if(!key[RIGHT] && !key[LEFT] && !key[other keys]))
{
   //do idle
}



might be better, but that as well just seems a little messy.

This tutorial may be of some help to you as it has a lot cleaner way of processing keyboard events.

Good Luck :^:
Was This Post Helpful? 0
  • +
  • -

#5 Fonz01  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 19
  • Joined: 06-March 09

Re: allegro idle state help

Posted 07 April 2009 - 07:54 AM

 int newxpos, newypos;
			bool faceright;
			bool faceleft;

			
			
				if (key[KEY_RIGHT]) {								
			
				newxpos = xpos + 5;								
				if (newxpos>backgroundwidth)					
					newxpos = backgroundwidth;					
				newypos = ypos;									 
																 
				playerSprite->setSpriteState(WALK_EAST);
				
				if (!key[KEY_RIGHT]) 
				(faceright = true); {
				(faceleft = false);
				playerSprite->setSpriteState(STILL_RIGHT);
				
				}

				} else if (key[KEY_LEFT]) {								
			
				newxpos = xpos - 5;								
				if (newxpos>backgroundwidth)					
					newxpos = backgroundwidth;					
				newypos = ypos;									 
																 
				playerSprite->setSpriteState(WALK_WEST);
				
				if (!key[KEY_LEFT]) 
				(faceleft = true); {
				(faceright = false);		
				playerSprite->setSpriteState(STILL_LEFT);

				}
				
			} else {				

				newxpos = xpos;
				newypos = ypos;
				
			}



hmm nearly have it, except the state on start is running, pressing left or right moves the player left or right in a still state lol

any ideas?

ill check that page out

thanks for the help

fonz

This post has been edited by Fonz01: 07 April 2009 - 07:56 AM

Was This Post Helpful? 0
  • +
  • -

#6 stayscrisp  Icon User is offline

  • フカユ
  • member icon

Reputation: 928
  • View blog
  • Posts: 3,997
  • Joined: 14-February 08

Re: allegro idle state help

Posted 07 April 2009 - 08:11 AM

Hmm there's some seriously confusing parts there, to the compiler at least hehe

ok try to keep things contained as these if and else statements can become messy

if(key[KEY_RIGHT] && xpos < backgroundWidth))
{
   newxpos = xpos + 5;
   faceRight = true;
   faceLeft = false;
   playerSprite->setSpriteState(WALK_EAST);
}
else if(key[KEY_LEFT] && xpos > backgroundWidth))
{
   newxpos = xpos - 5;
   faceLeft = true;
   faceRight = false;
   playerSprite->setSpriteState(WALK_WEST);
}

if(!key[KEY_RIGHT] && !key[KEY_LEFT])
{
	 newxpos = xpos;
	 if(faceRight)
	 {
		  playerSprite->setSpriteState(STILL_RIGHT);
	 }
	 else
	 {
		  playerSprite->setSpriteState(STILL_LEFT);
	  }
}



You need to try and make sure you know what statement you are saying if and else to or it will not work as expected.

:^:
Was This Post Helpful? 0
  • +
  • -

#7 Fonz01  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 19
  • Joined: 06-March 09

Re: allegro idle state help

Posted 07 April 2009 - 09:33 AM

hmm there shouldnt be anything wrong with wot you posted but im getting errors.

and for the life of me i dont know what they are usually its a missing } or a missing ;

im stumped :(

thanks for the help
fonz
Was This Post Helpful? 0
  • +
  • -

#8 stayscrisp  Icon User is offline

  • フカユ
  • member icon

Reputation: 928
  • View blog
  • Posts: 3,997
  • Joined: 14-February 08

Re: allegro idle state help

Posted 07 April 2009 - 09:39 AM

What are the errors?
Was This Post Helpful? 0
  • +
  • -

#9 Fonz01  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 19
  • Joined: 06-March 09

Re: allegro idle state help

Posted 07 April 2009 - 09:43 AM

ah sorted em

problem is c++ crashes with error

the instruction at 0x004117e5 referenced memory at 0x618db554, the memory could not be written

damn had high hopes there

thanks
fonz

weird if i debug i get

Loaded symbols for 'C:\Documents and Settings\Fonz\My Documents\nearly\nearly\Final3\Debug\Animation.exe'
Loaded 'C:\WINDOWS\system32\ntdll.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\kernel32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\alld42.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\user32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\gdi32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\ole32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\advapi32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\rpcrt4.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\secur32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msvcrt.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\dinput.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\winmm.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\ddraw.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\dciman32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\dsound.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\version.dll', no matching symbolic information found.
Loaded symbols for 'C:\WINDOWS\system32\MSVCRTD.DLL'
Loaded 'C:\WINDOWS\system32\imm32.dll', no matching symbolic information found.
Loaded 'C:\Program Files\Kaspersky Lab\Kaspersky Internet Security 2009\kloehk.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\uxtheme.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msctf.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msctfime.ime', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\CTAGENT.DLL', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\hid.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\setupapi.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\mslbui.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\oleaut32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\wintrust.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\crypt32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msasn1.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\imagehlp.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\wdmaud.drv', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msacm32.drv', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\msacm32.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\midimap.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\ksuser.dll', no matching symbolic information found.
Loaded 'C:\WINDOWS\system32\apphelp.dll', no matching symbolic information found.
The thread 0xBC8 has exited with code 0 (0x0).
The thread 0x32C has exited with code -1073741819 (0xC0000005).
The thread 0x640 has exited with code -1073741819 (0xC0000005).
The thread 0x894 has exited with code -1073741819 (0xC0000005).
The thread 0xDA4 has exited with code -1073741819 (0xC0000005).
The thread 0xC34 has exited with code -1073741819 (0xC0000005).
The thread 0xC78 has exited with code -1073741819 (0xC0000005).
The thread 0x46C has exited with code -1073741819 (0xC0000005).

This post has been edited by Fonz01: 07 April 2009 - 09:52 AM

Was This Post Helpful? 0
  • +
  • -

#10 Fonz01  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 19
  • Joined: 06-March 09

Re: allegro idle state help

Posted 07 April 2009 - 10:00 AM

hmm think i may need to link allegro?
Was This Post Helpful? 0
  • +
  • -

#11 Fonz01  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 19
  • Joined: 06-March 09

Re: allegro idle state help

Posted 07 April 2009 - 10:49 AM

no all seems ok

wonder what it is, i normally experience this if an error occurs

ill look into it

in the meantime

thanks for all your help

u r a star

fonz
Was This Post Helpful? 0
  • +
  • -

#12 stayscrisp  Icon User is offline

  • フカユ
  • member icon

Reputation: 928
  • View blog
  • Posts: 3,997
  • Joined: 14-February 08

Re: allegro idle state help

Posted 07 April 2009 - 10:58 AM

How are you creating your playerSprite object, could you post a bit more?
Was This Post Helpful? 0
  • +
  • -

#13 Fonz01  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 19
  • Joined: 06-March 09

Re: allegro idle state help

Posted 07 April 2009 - 11:19 AM

#include <fstream>
#include "PlayerSprite.h"

using namespace std;

CPlayerSprite::CPlayerSprite() {

	CSprite::CSprite();

	m_parameternumber = 0;
	m_parameter = NULL;
	m_avatarInfo = NULL;

}

CPlayerSprite::~CPlayerSprite() {

	CSprite::~CSprite();

	m_parameternumber = 0;

	if (m_parameter!=NULL)
		delete m_parameter;
	m_parameter = NULL;

	if (m_avatarInfo!=NULL)
		delete m_avatarInfo;
	m_avatarInfo = NULL;

}

bool CPlayerSprite::initialise(const char filename[]) {

	if (m_binitialised) {
		allegro_message("Sprite object can not be initialised twice");
		return false;
	}


	ifstream infile;

	infile.open(filename);
	if (!infile.is_open()) {
		allegro_message("Unable to open initialisation file");
		return false;
	}

	char buf[1024];

	infile.getline(buf,1024,'\n');
	if (strcmp(buf,"Sprite Data File")) {
		allegro_message("The supplied file is not a sprite data file");
		infile.close();
		return false;
	}

	bool keep_reading = true;
	while (keep_reading) {
		infile.getline(buf,1024,'\n');
		if ((buf[0]!='#')&&(buf[0]!=NULL))
			keep_reading = false;
	}

	if (infile.eof()) {
		allegro_message("The file contains no number of states");
		infile.close();
		return false;
	}

	m_numberofState = atoi(buf);
	if (m_numberofState<=0) {
		allegro_message("The file contains negative number of states");
		infile.close();
		return false;
	}

	m_spriteImage = new BITMAP**[m_numberofState];
	if (m_spriteImage==NULL) {

		allegro_message("The program failed to allocate memory to hold sprite images (level 1)");
		infile.close();
		return false;

	}

	m_totalAnimationframes = new int[m_numberofState];
	if (m_totalAnimationframes==NULL) {
		allegro_message("The program failed to allocate memory to hold total animation frames");
		delete m_spriteImage;
		m_spriteImage = NULL;
		infile.close();
		return false;
	}

	m_spriteWidths = new int[m_numberofState];
	if (m_spriteWidths==NULL) {
		allegro_message("The program failed to allocate memory to hold total animation frames");

		delete m_spriteImage;
		m_spriteImage = NULL;

		delete m_totalAnimationframes;
		m_totalAnimationframes = NULL;

		infile.close();
		return false;
	}

	m_spriteHeights = new int[m_numberofState];
	if (m_spriteHeights==NULL) {
		allegro_message("The program failed to allocate memory to hold total animation frames");

		delete m_spriteImage;
		m_spriteImage = NULL;
		
		delete m_totalAnimationframes;
		m_totalAnimationframes = NULL;

		delete m_spriteWidths;
		m_spriteWidths = NULL;

		infile.close();
		return false;
	}

	for (int i=0;i<m_numberofState;i++) {
		keep_reading = true;
		while (keep_reading) {
			infile.getline(buf,1024,'\n');
			if ((buf[0]!='#')&&(buf[0]!=NULL))
				keep_reading = false;
		}

		if (infile.eof()) {
			allegro_message("Unexpected end of files encountered");
				
			delete m_totalAnimationframes;
			m_totalAnimationframes = NULL;

			delete m_spriteWidths;
			m_spriteWidths = NULL;

			int imax=i;

			for (int j=0;j<imax;j++) {
				delete m_spriteImage[j];
				m_spriteImage[j] = NULL;
			}

			delete m_spriteImage;
			m_spriteImage = NULL;
			
			infile.close();
			return false;
		}

		BITMAP *temp = load_bitmap(buf,0);
		if (temp==NULL) {
			allegro_message("Unable to load a sprite image");
				
			delete m_totalAnimationframes;
			m_totalAnimationframes = NULL;

			delete m_spriteWidths;
			m_spriteWidths = NULL;

			int imax=i;

			for (int j=0;j<imax;j++) {
				delete m_spriteImage[j];
				m_spriteImage[j] = NULL;
			}

			delete m_spriteImage;
			m_spriteImage = NULL;

			infile.close();
			return false;
		}

		infile.getline(buf,1024,' ');
		m_spriteWidths[i] = atoi(buf);

		infile.getline(buf,1024,' ');
		m_spriteHeights[i] = atoi(buf);

		infile.getline(buf,1024,'\n');
		m_totalAnimationframes[i] = atoi(buf);

		m_spriteImage[i] = new BITMAP*[m_totalAnimationframes[i]];

		if (m_spriteImage[i] == NULL) {
			allegro_message("The program failed to allocate memory to hold total animation frames");
		
			delete m_totalAnimationframes;
			m_totalAnimationframes = NULL;

			delete m_spriteWidths;
			m_spriteWidths = NULL;

			int imax=i+1;

			for (int j=0;j<imax;j++) {
				delete m_spriteImage[j];
				m_spriteImage[j] = NULL;
			}

			delete m_spriteImage;
			m_spriteImage = NULL;

			destroy_bitmap(temp);

			infile.close();
			return false;
		}

		for (int j=0; j<m_totalAnimationframes[i]; j++) {

			m_spriteImage[i][j] = create_bitmap(m_spriteWidths[i], m_spriteHeights[i]);
			blit(temp, m_spriteImage[i][j], j*m_spriteWidths[i], 0, 0, 0, m_spriteWidths[i], m_spriteHeights[i]);

		}

		destroy_bitmap(temp);
	}

	keep_reading = true;
	while (keep_reading) {
		infile.getline(buf,1024,'\n');
		if ((buf[0]!='#')&&(buf[0]!=NULL))
			keep_reading = false;
	}

	m_currentAnimationframe = 0;

	m_currentState = 0;

	m_xpos = 0;
	m_ypos = 0;

	m_binitialised = true;

	if (infile.eof()) {
		infile.close();
		return true;
	}

	m_parameternumber = atoi(buf);

	if (m_parameternumber<0)
		m_parameternumber = 0;

	keep_reading = true;
	while (keep_reading) {
		infile.getline(buf,1024,'\n');
		if ((buf[0]!='#')&&(buf[0]!=NULL))
			keep_reading = false;
	}

	if (infile.eof()) {
		infile.close();
		return true;
	}

	char avatarfile[256];
	strcpy(avatarfile, buf);
 
	infile.getline(buf,1024,' ');
	int playerAvatar_x = atoi(buf);

	infile.getline(buf,1024,' ');
	int playerAvatar_y = atoi(buf);

	infile.getline(buf,1024,' ');
	int playerAvatar_w = atoi(buf);

	infile.getline(buf,1024,' ');
	int playerAvatar_h = atoi(buf);

	infile.getline(buf,1024,'\n');
	int bar_w = atoi(buf);

	m_avatarInfo = new CAvatarInfo();
	if (!m_avatarInfo->initialise(avatarfile, playerAvatar_x, playerAvatar_y, playerAvatar_w, playerAvatar_h, bar_w)) {
		delete m_avatarInfo;
		m_avatarInfo = NULL;
		infile.close();
	}

	int pnum = m_avatarInfo->getTotalNumberofParameter();

	if (pnum>m_parameternumber)
		m_parameternumber = pnum;

	if (m_parameternumber > 0) {
		m_parameter = new double[m_parameternumber];
		for (int i=0;i<pnum;i++) {
			double td;
			m_avatarInfo->getParameterValue(i,&td);
			m_parameter[i]=td;
		}

		for (i=pnum;i<m_parameternumber;i++)
			m_parameter[i]=0;
	}


	infile.close();
	return true;

}

void CPlayerSprite::drawSprite(BITMAP* buffer,CBackground *bkground) {

	CSprite::drawSprite(buffer, bkground);

}


void CPlayerSprite::drawAvatar(BITMAP *buffer) {

	if (!m_binitialised)
		return;
	

	if (m_avatarInfo!=NULL) {
		m_avatarInfo->drawAvatarinfo(buffer);
	}

}

bool CPlayerSprite::setParameterValue(int parameterindex, double value) {

	if (!m_binitialised) {

		allegro_message("The Player Object has not already been initialised");
		return false;

	}

	if ((parameterindex<0)||(parameterindex>=m_parameternumber)) {

		allegro_message("The supplied parameter number exceeds range");
		return false;

	}

	m_parameter[parameterindex] = value;

	if (m_avatarInfo!=NULL) {
		int pnum =	m_avatarInfo->getTotalNumberofParameter();
		if (parameterindex<pnum)
			m_avatarInfo->setParameterValue(parameterindex,value);
	}

	return true;

}

bool CPlayerSprite::getParameterValue(int parameterindex, double* value) {

	if (!m_binitialised) {

		allegro_message("The Player Object has not already been initialised");
		return false;

	}

	if ((parameterindex<0)||(parameterindex>=m_parameternumber)) {

		allegro_message("The supplied parameter number exceeds range");
		return false;

	}

	*value = m_parameter[parameterindex];

	return true;

}


this wot u mean??

can i somehow upload the file for u?

thanks
fonz
Was This Post Helpful? 0
  • +
  • -

#14 stayscrisp  Icon User is offline

  • フカユ
  • member icon

Reputation: 928
  • View blog
  • Posts: 3,997
  • Joined: 14-February 08

Re: allegro idle state help

Posted 07 April 2009 - 12:19 PM

I was thinking more like your main function where you initialise everything.

You can attach files to post's i think.

This post has been edited by stayscrisp: 07 April 2009 - 12:19 PM

Was This Post Helpful? 0
  • +
  • -

#15 Fonz01  Icon User is offline

  • New D.I.C Head

Reputation: 0
  • View blog
  • Posts: 19
  • Joined: 06-March 09

Re: allegro idle state help

Posted 07 April 2009 - 12:33 PM

ok attached i think anyway

maybe itll work on yours maybe its my vb6 bein a pain

what the situation is

lecturer has given us a written file called final to modify and make our own game, everything supposedly is there,

we only had 6 lessons before we were given it, and as for never doing c++ before its a little alien, bought a book called game programming all in one which features allegro however the coding is too different from the lecturers and i really dont want to kill anything off, suppose itll come in handy when i write my own.

ive worked with visual basic which some of the principles are the same.

anyway hope you can help

fonz

This post has been edited by Fonz01: 07 April 2009 - 12:42 PM

Was This Post Helpful? 0
  • +
  • -

  • (2 Pages)
  • +
  • 1
  • 2