void Map::Update()
	{
		GameObjectPtr focusedObject = GameObject::GetFocusedObject();
		if (focusedObject) {	//TODO: Dynamic timing or something. 20ticks are somehow random...
			int mx, my;
			int dx=0, dy=0;
			focusedObject->GetMapPosition(mx, my);
			if (mx - dox < ox+walkarea.x) {
				Move(mx - dox - (ox+walkarea.x), 0, 20);
			}
			else if (mx - dox + walkarea.x > width+ox) {
				Move(mx - dox + walkarea.x - (width + ox), 0, 20);
			}
			if (my - doy < oy + walkarea.y) {
				Move(0, my - doy - (oy + walkarea.y), 20);
			}
			else if (my - doy + walkarea.y > width + oy) {
				Move(0, my - doy + walkarea.y - (width + oy), 20);
			}
		}

		//trigger foo
		if (focusedObject) {
			int mx, my;
			focusedObject->GetMapPosition(mx, my);
			for (auto t : triggers) {
				if (mx >= t.x&&mx <= t.x + t.w&&my >= t.y && my <= t.y + t.h) {
					ScriptEngine::RawEval(std::string("On") + t.name + "()"); //Run the callback for this trigger
				}
			}
		}

		if (ticksLeftMapMovement > 0) {
			float dx = (float)dox*(float)(movementLength-ticksLeftMapMovement) / (float)movementLength;
			float dy = (float)doy*(float)(movementLength - ticksLeftMapMovement) / (float)movementLength;
			mapMovementOffset = glm::vec4(tilesize[2] *dx, tilesize[3] * dy, 0.0f, 0.0f);
			glm::vec2 res = Env::GetResolution();
			res.x = 1.0f / res.x;
			res.y = 1.0f / res.y;
			mapMovementOffset.x = floorf(mapMovementOffset.x / res.x)*res.x;
			mapMovementOffset.y = floorf(mapMovementOffset.y / res.y)*res.y;
			//clamp offset to pixels
			ticksLeftMapMovement--;
		}
		else if (ticksLeftMapMovement==0) {
			ticksLeftMapMovement--;
			mapMovementOffset = glm::vec4(0.0f);
			ox += dox;
			oy += doy;
			dox = 0;
			doy = 0;
			movementLength = 0;
		}

		for (auto c : children) {
			GameObjectPtr cPtr = std::dynamic_pointer_cast<GameObject>(c);
			if (cPtr) {
				cPtr->UpdatePositionFromMap();
			}
		}
		BaseClass::Update();
	}