text: #include "gameobj.h"
  #include "scriptmgr.h"
  #include "gamemgr.h"
  
  using namespace std;
  
  CGameObj::CGameObj(char dispChar, int x, int y)
  {
  	// The first reference is already counted when the object is created
  	refCount         = 1;
  
  	isDead           = false;
  	displayCharacter = dispChar;
  	this->x          = x;
  	this->y          = y;
  	controller       = 0;
  
  	weakRefFlag      = 0;
  }
  
  CGameObj::~CGameObj()
  {
  	if( weakRefFlag )
  	{
  		// Tell the ones that hold weak references that the object is destroyed
  		weakRefFlag->Set(true);
  		weakRefFlag->Release();
  	}
  
  	if( controller )
  		controller->Release();
  }
  
  asILockableSharedBool *CGameObj::GetWeakRefFlag()
  {
  	if( !weakRefFlag )
  		weakRefFlag = asCreateLockableSharedBool();
  
  	return weakRefFlag;
  }
  
  int CGameObj::AddRef()
  {
  	return ++refCount;
  }
  
  int CGameObj::Release()
  {
  	if( --refCount == 0 )
  	{
  		delete this;
  		return 0;
  	}
  	return refCount;
  }
  
  void CGameObj::DestroyAndRelease()
  {
  	// Since there might be other object's still referencing this one, we
  	// cannot just delete it. Here we will release all other references that
  	// this object holds, so it doesn't end up holding circular references.
  	if( controller )
  	{
  		controller->Release();
  		controller = 0;
  	}
  
  	Release();
  }
  
  void CGameObj::OnThink()
  {
  	return;
  	// Call the script controller's OnThink method
  	if( controller )
  		scriptMgr->CallOnThink(controller);
  }
  
  bool CGameObj::Move(int dx, int dy)
  {
  	// Check if it is actually possible to move to the desired position
  	int x2 = x + dx;
  	if( x2 < 0 || x2 > 9 ) return false;
  
  	int y2 = y + dy;
  	if( y2 < 0 || y2 > 9 ) return false;
  
  	// Check with the game manager if another object isn't occupying this spot
  	CGameObj *obj = gameMgr->GetGameObjAt(x2, y2);
  	if( obj ) return false;
  
  	// Now we can make the move
  	x = x2;
  	y = y2;
  
  	return true;
  }
  
  void CGameObj::Send(CScriptHandle msg, CGameObj *other)
  {
  	if( other && other->controller )
  		scriptMgr->CallOnMessage(other->controller, msg, this);
  }
  
  void CGameObj::Kill()
  {
  	// Just flag the object as dead. The game manager will 
  	// do the actual destroying at the end of the frame
  	isDead = true;
  }
  
  int CGameObj::GetX() const
  {
  	return x;
  }
  
  int CGameObj::GetY() const
  {
  	return y;
  }
  