Page 2 of 2

Posted: 19 Apr 2007, 07:57
by yuritch
Lua bindings, you say? Like this?

Code: Select all

Index: rts/Lua/LuaUnitDefs.cpp
===================================================================
--- rts/Lua/LuaUnitDefs.cpp	(revision 3639)
+++ rts/Lua/LuaUnitDefs.cpp	(working copy)
@@ -722,6 +722,11 @@
 	ADD_FLOAT("buildSpeed", ud.buildSpeed);
 	ADD_FLOAT("buildDistance", ud.buildDistance);
 
+	ADD_FLOAT("repairMult", ud.repairMult);
+	ADD_FLOAT("reclaimMult", ud.reclaimMult);
+	ADD_FLOAT("resurrectMult", ud.resurrectMult);
+	ADD_FLOAT("captureMult", ud.captureMult);
+
 	ADD_BOOL("canSubmerge", ud.canSubmerge);
 	ADD_BOOL("canFly",      ud.canfly);
 	ADD_BOOL("canMove",     ud.canmove);
Index: rts/Sim/Units/UnitDef.h
===================================================================
--- rts/Sim/Units/UnitDef.h	(revision 3639)
+++ rts/Sim/Units/UnitDef.h	(working copy)
@@ -94,6 +94,11 @@
 	float buildSpeed;
 	float buildDistance;
 	float mass;
+
+	float reclaimMult;
+	float repairMult;
+	float captureMult;
+	float resurrectMult;
 	
 	float minCollisionSpeed;
 	float slideTolerance;
Index: rts/Sim/Units/UnitDefHandler.cpp
===================================================================
--- rts/Sim/Units/UnitDefHandler.cpp	(revision 3639)
+++ rts/Sim/Units/UnitDefHandler.cpp	(working copy)
@@ -338,6 +338,10 @@
 	ud.buildSpeed=atof(tdfparser.SGetValueDef("0", "UNITINFO\\WorkerTime").c_str());
 	ud.buildDistance=atof(tdfparser.SGetValueDef("64", "UNITINFO\\Builddistance").c_str());
 	ud.buildDistance=std::max(128.f,ud.buildDistance);
+	ud.repairMult=atof(tdfparser.SGetValueDef("1", "UNITINFO\\RepairMult").c_str());
+	ud.reclaimMult=atof(tdfparser.SGetValueDef("1", "UNITINFO\\ReclaimMult").c_str());
+	ud.captureMult=atof(tdfparser.SGetValueDef("1", "UNITINFO\\CaptureMult").c_str());
+	ud.resurrectMult=atof(tdfparser.SGetValueDef("1", "UNITINFO\\ResurrectMult").c_str());
 	ud.armoredMultiple=atof(tdfparser.SGetValueDef("1", "UNITINFO\\DamageModifier").c_str());
 	ud.armorType=damageArrayHandler->GetTypeFromName(ud.name);
 //	logOutput.Print("unit %s has armor %i",ud.name.c_str(),ud.armorType);
Index: rts/Sim/Units/UnitTypes/Builder.cpp
===================================================================
--- rts/Sim/Units/UnitTypes/Builder.cpp	(revision 3639)
+++ rts/Sim/Units/UnitTypes/Builder.cpp	(working copy)
@@ -31,6 +31,10 @@
 CR_REG_METADATA(CBuilder, (
 				CR_MEMBER(buildSpeed),
 				CR_MEMBER(buildDistance),
+				CR_MEMBER(repairMult),
+				CR_MEMBER(reclaimMult),
+				CR_MEMBER(resurrectMult),
+				CR_MEMBER(captureMult),
 				CR_MEMBER(curResurrect),
 				CR_MEMBER(lastResurrected),
 				CR_MEMBER(curBuild),
@@ -54,6 +58,10 @@
 CBuilder::CBuilder()
 :	buildSpeed(100),
 	buildDistance(16),
+	repairMult(0),
+	reclaimMult(0),
+	resurrectMult(0),
+	captureMult(0),
 	curBuild(0),
 	curReclaim(0),
 	terraforming(false),
@@ -82,6 +90,10 @@
 {
 	buildSpeed=def->buildSpeed/32.0f;
 	buildDistance=def->buildDistance;
+	repairMult=def->repairMult;
+	reclaimMult=def->reclaimMult;
+	resurrectMult=def->resurrectMult;
+	captureMult=def->captureMult;
 
 	CUnit::UnitInit (def, team, position);
 }
@@ -178,11 +190,24 @@
 		if(inBuildStance){
 			isCloaked=false;
 			curCloakTimeout=gs->frameNum+cloakTimeout;
-			if(curBuild->AddBuildPower(buildSpeed,this)){
-				CreateNanoParticle(curBuild->midPos,curBuild->radius*0.5f,false);
+			//Check to see if we are building a new thing or repairing an existing thing
+			if(curBuild->buildProgress<1){
+				//building new thing
+				if(curBuild->AddBuildPower(buildSpeed,this)){
+					CreateNanoParticle(curBuild->midPos,curBuild->radius*0.5f,false);
+				} else {
+					if(!curBuild->beingBuilt && curBuild->health>=curBuild->maxHealth){
+						StopBuild();
+					}
+				}
 			} else {
-				if(!curBuild->beingBuilt && curBuild->health>=curBuild->maxHealth){
-					StopBuild();
+				//repairing something
+				if(curBuild->AddBuildPower(buildSpeed*repairMult,this)){
+					CreateNanoParticle(curBuild->midPos,curBuild->radius*0.5f,false);
+				} else {
+					if(!curBuild->beingBuilt && curBuild->health>=curBuild->maxHealth){
+						StopBuild();
+					}
 				}
 			}
 		} else {
@@ -191,7 +216,7 @@
 	} else if(curReclaim && curReclaim->pos.distance2D(pos)<buildDistance+curReclaim->radius && inBuildStance){
 		isCloaked=false;
 		curCloakTimeout=gs->frameNum+cloakTimeout;
-		if(curReclaim->AddBuildPower(-buildSpeed,this)){
+		if(curReclaim->AddBuildPower(-buildSpeed*reclaimMult,this)){
 			CreateNanoParticle(curReclaim->midPos,curReclaim->radius*0.7f,true);
 		}
 	} else if(curResurrect && curResurrect->pos.distance2D(pos)<buildDistance+curResurrect->radius && inBuildStance){
@@ -201,13 +226,13 @@
 			{
 				// This corpse has been reclaimed a little, need to restore the resources
 				// before we can let the player resurrect it.
-				curResurrect->AddBuildPower(buildSpeed,this);
+				curResurrect->AddBuildPower(buildSpeed*repairMult,this);
 			}
 			else
 			{
 				// Corpse has been restored, begin resurrection
-				if(UseEnergy(ud->energyCost*buildSpeed/ud->buildTime*0.5f)){
-					curResurrect->resurrectProgress+=buildSpeed/ud->buildTime;
+				if(UseEnergy(ud->energyCost*buildSpeed*resurrectMult/ud->buildTime*0.5f)){
+					curResurrect->resurrectProgress+=buildSpeed*resurrectMult/ud->buildTime;
 					CreateNanoParticle(curResurrect->midPos,curResurrect->radius*0.7f,gs->randInt()&1);
 				}
 				if(curResurrect->resurrectProgress>1){		//resurrect finished
@@ -227,7 +252,7 @@
 		}
 	} else if(curCapture && curCapture->pos.distance2D(pos)<buildDistance+curCapture->radius && inBuildStance){
 		if(curCapture->team!=team){
-			curCapture->captureProgress+=1.0f/(150+curCapture->buildTime/buildSpeed*(curCapture->health+curCapture->maxHealth)/curCapture->maxHealth*0.4f);
+			curCapture->captureProgress+=1.0f/(150+curCapture->buildTime/(buildSpeed*captureMult)*(curCapture->health+curCapture->maxHealth)/curCapture->maxHealth*0.4f);
 			CreateNanoParticle(curCapture->midPos,curCapture->radius*0.7f,false);
 			if(curCapture->captureProgress > 1.0f){
 				if (!curCapture->ChangeTeam(team, CUnit::ChangeCaptured)) {
Index: rts/Sim/Units/UnitTypes/Builder.h
===================================================================
--- rts/Sim/Units/UnitTypes/Builder.h	(revision 3639)
+++ rts/Sim/Units/UnitTypes/Builder.h	(working copy)
@@ -36,6 +36,11 @@
 	float buildSpeed;
 	float buildDistance;
 
+	float repairMult;
+	float reclaimMult;
+	float resurrectMult;
+	float captureMult;
+
 	CFeature* curResurrect;
 	int lastResurrected;
 	CUnit* curBuild;
This should add the 4 new variables to Lua UnitDefs.

Posted: 19 Apr 2007, 09:05
by imbaczek
Guess so :)

Posted: 21 Apr 2007, 05:17
by trepan
Committed yuritch's patch (with some updates, r3650).

Yuritch ... no need to spam your patch here if you're
going to paste it on Mantis (devs won't generally use
patches pasted here anyways, whitespace ;))

Posted: 21 Apr 2007, 06:33
by trepan
Update:

Code: Select all

Last modification: Rev 3653 - trepan - 2007-04-21 06:20:41 +0200 (Sat, 21 Apr 2007)
Log message:
  * Replaced the following multipliers with absolute values:
    - repairMult    -> repairSpeed
    - reclaimMult   -> reclaimSpeed
    - resurrectMult -> resurrectSpeed
    - captureMult   -> captureSpeed
  * Added the 'terraformSpeed' FBI tag

Posted: 21 Apr 2007, 08:37
by KDR_11k
WHEEEEEEEEEEEE!