{
    // OOP-Setup
    var reflection = {};
    
    (function(){
	var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
	
	// The base Class implementation (does nothing)
	this.Class = function(){ };
	
	// Create a new Class that inherits from this class
	Class.extend = function(prop, ref_name) {
	    if(ref_name)
		reflection[ref_name] = Class;
	    
	    var _super = this.prototype;

	    // Instantiate a base class (but only create the instance,
	    // don't run the init constructor)
	    initializing = true;
	    var prototype = new this();
	    initializing = false;
	    
	    // Copy the properties over onto the new prototype
	    for (var name in prop) {
		// Check if we're overwriting an existing function
		prototype[name] = typeof prop[name] == "function" && 
		    typeof _super[name] == "function" && fnTest.test(prop[name]) ?
		    (function(name, fn) {
			return function() {
			    var tmp = this._super;

			    // Add a new ._super() method that is the same method
			    // but on the super-class
			    this._super = _super[name];

			    // The method only need to be bound temporarily, so we
			    // remove it when we're done executing
			    var ret = fn.apply(this, arguments);        
			    this._super = tmp;

			    return ret;
			};
		    })(name, prop[name]) :
		prop[name];
	    }
	    
	    // The dummy class constructor
	    function Class() {
		// All construction is actually done in the init method
		if ( !initializing && this.init )
		    this.init.apply(this, arguments);
	    }
	    
	    // Populate our constructed prototype object
	    Class.prototype = prototype;
	    
	    // Enforce the constructor to be what we expect
	    Class.prototype.constructor = Class;

	    // And make this class extendable
	    Class.extend = arguments.callee;
	    
	    return Class;
	};
    })();

    var Creature = Class.extend({
	init: function(info,attributes,properties,drawinfo,battle){
	    /* info: pname, cname,class, level, experience, race, size
	     * attributes: body, agility, spirit
	     * properties: strength, hardness, movement, skill, mind, aura
	     * drawinfo: x,y,w,h,col
	     */
	    console.log("Creature called!");
	    this.info = {"pname":  info["pname"]+"", "experience": info["experience"]*1, "race":info["race"]+"",
			 "size":info["size"]*1};
	    console.log("Creature Ready!");
	    this.attributes = {"body": attributes["body"]*1, "agility": attributes["agility"]*1,
			       "spirit": attributes["spirit"]*1};
	    console.log("Problem?");
	    this.properties = {"strength": properties["strength"]*1 , "hardness": properties["hardness"]*1,
			       "movement": properties["movement"]*1, "skill": properties["skill"]*1,
			       "mind": properties["mind"]*1, "aura": properties["aura"]*1};
	    this.graphelement = Crafty.e("Creature").creature(this.info["pname"],drawinfo["x"],drawinfo["y"],
							      drawinfo["w"],drawinfo["h"],drawinfo["col"]);
	    
	    this.battle = {};
	    if(battle) {
		this.battle={"life": battle["life"]*1, "defense": battle["defense"]*1,"ini":battle["ini"]*1,
			     "walk": battle["walk"]*1, "melee": battle["melee"]*1, "shoot": battle["shoot"]*1,
			     "chant": battle["chant"]*1, "shoot_chant": battle["shoot_chant"]*1};
	    }
	    else {
		this.battle["life"] = this.attributes.body + this.properties.strength + 10;;
		this.battle["defense"] = this.attributes.body + this.properties.hardness;
		this.battle["ini"] = this.attributes.agility + this.properties.movement;
		this.battle["walk"] = (this.attributes.agility / 2) +1;
		this.battle["melee"] = this.attributes.body + this.properties.strength;
		this.battle["shoot"] = this.attributes.agility + this.properties.mind;
		this.battle["chant"] = this.attributes.spirit + this.properties.aura;
		this.battle["shoot_chant"] = this.attributes.spirit + this.properties.skill;
	    };
	    this.life = this.battle["life"]*1;
	},
	attack: function(enem) {
	    //console.log("attack");
	    console.log(this.info.cname+" greift "+enem.info.cname+" an!");
	    console.log("Ergebnis: " + this.battle.melee + ( this.battle.melee > enem.battle.defense ? " > " : " < ") + enem.battle.defense);
	}
    });

    var Player = Creature.extend({
	init: function(info,attributes,properties,drawinfo,battle){ // x,y,w,h,col) {
	    /* info: pname, cname,class, level, experience, race, size
	     * attributes: body, agility, spirit
	     * properties: strength, hardness, movement, skill, mind, aura
	     * drawinfo: x,y,w,h,col
	     */
	    this._super(info,attributes,properties,drawinfo,battle);
	    this.info["cname"]= info["cname"]+"";
	    this.info["class"]= info["class"]+"";
	    this.info["level"]= info["level"]*1;
	    
	    // Set default battle-propoerties.
	    this.extern = {"armor":0,"chant":0,"weapon":0};
	    console.log(this.battle.defense);
	    this.battle.defense += this.extern.armor;
	    this.battle.melee += this.extern.weapon;
	    this.battle.shoot += this.extern.weapon;
	    this.battle.chant = this.battle.chant + this.extern.chant - this.extern.armor;
	    this.battle.shoot_chant = this.battle.chant + this.extern.chant - this.extern.armor;
	},
	printoutput: function() {
	    $('#output').empty();
	    $('#output').html(this.info.cname+"<br>"+this.info.pname);
	}
    });
	
    var Beast = Creature.extend({
	init: function(info,attributes,properties,drawinfo,battle){ // x,y,w,h,col) {
	    /* info: pname, experience, race, size
	     * attributes: body, agility, spirit
	     * properties: strength, hardness, movement, skill, mind, aura
	     * drawinfo: x,y,w,h,col
	     * battle: life, defense,ini,walk,melee,shoot,chant,shoot_chant
	     */
	    
	    this._super(info,attributes,properties,drawinfo,battle);
	    this.info.cname=this.info.pname;
	},
	printoutput: function() {
	    $('#output').empty();
	    $('#output').html(this.info.race+"<br>"+this.info.pname);
	}
    });
}