2025-07-18 00:22 CEST

View Issue Details Jump to Notes ]
IDProjectCategoryView StatusLast Update
0000527Spring engineGeneralpublic2007-04-21 05:11
Reporteryuritch 
Assigned Totrepan 
PrioritynormalSeverityfeatureReproducibilityN/A
StatusresolvedResolutionfixed 
Product Version 
Target VersionFixed in Version 
Summary0000527: [patch] Workertime multipliers for repair, reclaim, resurrect and capture
DescriptionHere is a patch that adds the following fbi tags:
RepairMult
ReclaimMult
ResurrectMult
CaptureMult
They modify unit's buildspeed when executing corresponding actions. All of those default to 1 so that existing units are not affected. Values lower than 1 decrease unit's effectiveness at a given task, values higher than 1 increase it.
TagsNo tags attached.
Checked infolog.txt for Errors
Attached Files
  • patch file icon builderMultipliers.patch (5,899 bytes) 2007-04-18 11:10 -
    Index: rts/Sim/Units/UnitDef.h
    ===================================================================
    --- rts/Sim/Units/UnitDef.h	(revision 3637)
    +++ 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 3637)
    +++ 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 3637)
    +++ 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 3637)
    +++ 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;
    
    patch file icon builderMultipliers.patch (5,899 bytes) 2007-04-18 11:10 +
  • patch file icon builderMultipliers2.patch (6,503 bytes) 2007-04-19 07:53 -
    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;
    
    patch file icon builderMultipliers2.patch (6,503 bytes) 2007-04-19 07:53 +

-Relationships
+Relationships

-Notes

~0000892

yuritch (reporter)

Changed the patch to include new variables into Lua bindings.

~0000893

trepan (reporter)

Applied an updated version to SVN (r3650).

+Notes

-Issue History
Date Modified Username Field Change
2007-04-18 11:10 yuritch New Issue
2007-04-18 11:10 yuritch File Added: builderMultipliers.patch
2007-04-19 07:53 yuritch File Added: builderMultipliers2.patch
2007-04-19 07:54 yuritch Note Added: 0000892
2007-04-21 05:11 trepan Note Added: 0000893
2007-04-21 05:11 trepan Assigned To => trepan
2007-04-21 05:11 trepan Status new => resolved
2007-04-21 05:11 trepan Resolution open => fixed
+Issue History