import std.stdio: writeln;

class Data { 
	float x, y, width, height;
	int damage;

	// final functions cannot be overriden by a sublcass
	final float getRegenerationRate() {
		return damage*0.8f;
	}
}

class Enemy: Data {
	Data data;
	static int num;

	this() {
		writeln(num++);
	}

	~this() {
		writeln(--num);
	}

	static bool isColliding(/*Data data1, Data data2*/) {
		// collision logic
		return true;
	}

	//override float getRegenerationRate() {} // error!
}

void main() {
	Enemy e1 = new Enemy();
	Enemy e2 = new Enemy();
	Enemy e3 = new Enemy();
	
	// static members can be accessed directly by the class name without creating an instance of that class
	writeln("Number of enemies: ", Enemy.num, ".");
	writeln("Enemies colliding: ", Enemy.isColliding(/* any data of the same type*/));
}