From a9c7f04230a2ed4412ea309d01c53e05a0c633fc Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Oliver=20R=C3=BCmpelein?= <oli_r@fg4f.de>
Date: Wed, 24 Sep 2014 21:49:13 +0200
Subject: [PATCH] First attack draft, working. Fixed bug in Player-Creation

---
 src/jsds.js        | 232 +++++++++++++++++++++++++++++----------------
 src/jsds_crafty.js |   2 -
 2 files changed, 151 insertions(+), 83 deletions(-)

diff --git a/src/jsds.js b/src/jsds.js
index 0985479..195cc25 100644
--- a/src/jsds.js
+++ b/src/jsds.js
@@ -1,87 +1,157 @@
 {
-    function Creature(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
-	 */
-	this.info = {"pname":  info["pname"]+"", "experience": info["experience"]*1, "race":info["race"]+"",
-		     "size":info["size"]*1};
-	this.attributes = {"body": attributes["body"]*1, "agility": attributes["agility"]*1,
-			   "spirit": attributes["spirit"]*1};
-	this.properties = {"strength": properties["strength"]*1 , "hardness": info["hardness"]*1,
-			   "movement": info["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"]);
+    // OOP-Setup
+    var reflection = {};
+    
+    (function(){
+	var initializing = false, fnTest = /xyz/.test(function(){xyz;}) ? /\b_super\b/ : /.*/;
 	
-	this.battle = {};
-	if(battle) {
-	    this.battle={"life": battle["life"], "defense": battle["defense"],"ini":battle["ini"],
-			 "walk": battle["walk"], "melee": battle["melee"], "shoot": battle["shoot"],
-			 "chant": battle["chant"], "shoot_chant": battle["shoot_chant"]};
-	}
-	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;
+	// 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;
 	};
-	this.life = this.battle["life"]*1;
-    };
-    
-    Creature.prototype.attack = function(enem) {
-	console.log("attack");
-	//console.log(this.cname+" greift "+enem.cname+" an!");
-	//console.log("Ergebnis: " + this.melee + ( this.melee > enem.defense? " > " : " < ") + enem.defense);
-    };
-    
+    })();
 
-    function Player(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
-	 */
+    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);
+	}
+    });
 	
-	Creature.apply(this, arguments);
-	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};
-	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;
-    };
-    Player.prototype = new Creature();
-    
-    Player.prototype.printoutput = function() {
-	$('#output').empty();
-	$('#output').html(this.info.cname+"<br>"+this.info.pname);
-    };
-
-    function Beast(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
-	 */
-	
-	Creature.apply(this,arguments);
-	this.info.cname=this.info.pname;
-    };   
-
-    Beast.prototype.printoutput = function() {
-	$('#output').empty();
-	$('#output').html(this.info.race+"<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);
+	}
+    });
 }
diff --git a/src/jsds_crafty.js b/src/jsds_crafty.js
index 98bc924..fad6d0c 100644
--- a/src/jsds_crafty.js
+++ b/src/jsds_crafty.js
@@ -78,8 +78,6 @@
 			this.enableControl();
 		    };
 		    if(e.mouseButton === Crafty.mouseButtons.RIGHT) {
-			console.log(player[this.id]);
-			console.log(cur_sel);
 			cur_sel.attack(player[this.id]);
 		    };
 		});