PDA

View Full Version : OnActorDead - Damage DS


pupo162
07-17-2012, 02:54 PM
SO ehre i am back to scripting after giving up to focus on studying.

im tryign to create a scrip who counts for point when a palne gets killed (for now).

to start:

public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
{
base.OnActorDead(missionNumber, shortName, actor, damages);

AiAircraft aircraft = actor as AiAircraft;

//for (int i = 0; i < aircraft.Places(); i++)
//{
// if (aircraft.Player(i) != null)
// {
// // TODO: Account for more than one player in an aircraft
// player = aircraft.Player(i);
// break;
// }
//}

int value = 0;


foreach (DamagerScore ds in damages)
{

if (actor is AiPerson) break; // At moment Pilotkills are not counted ;)

if (actor is AiGroundActor) break; // At moment Groundkills are not counted ;)

if (actor is AiAircraft)
{
switch (aircraft.Army())
{
case 1:
if (rafa.TryGetValue((aircraft as AiAircraft).InternalTypeName(), out value))
{
bluescore = bluescore + rafv[(aircraft as AiAircraft).InternalTypeName()];
//GamePlay.gpHUDLogCenter(new Player[] { player }, "You DIED!, {0} : LOST!", new object[] { SplitName((aircraft as AiAircraft).InternalTypeName()) });
GamePlay.gpHUDLogCenter("ola");
}

break;

case 2:
if (lwa.TryGetValue((aircraft as AiAircraft).InternalTypeName(), out value))
{
redscore = redscore + lwv[(aircraft as AiAircraft).InternalTypeName()];
//GamePlay.gpHUDLogCenter(new Player[] { player }, "You DIED!, {0} : LOST!", new object[] { SplitName((aircraft as AiAircraft).InternalTypeName()) });
GamePlay.gpHUDLogCenter("ola");
}
break; ;
}

}
}
}


I really dony understand, how Damagerscore list works, so where i am requesting your aid.

for now, my problems are: AI is not counted as destoyed, if i crash my plane is ok, but if an AI shoots me down it dobles the score ( im guessing its becosue im not specifin initiator or reciever of the damage. I based myself on the code From "Mid-july1940_v10" mission, who looks like:

public override void OnActorDead(int missionNumber, string shortName, AiActor actor, List<DamagerScore> damages)
{
base.OnActorDead(missionNumber, shortName, actor, damages);

//////////////////Penalty

if (actor is AiPerson)
{
if ((actor as AiPerson).Player() != null) // Player is Human
{
GamePlay.gpLogServer(null, "{0} - KIA", new object[] { (actor as AiPerson).Player() });
PilotsInGame.AddDeathToPlayer((actor as AiPerson).Player());
}
}

//////////////////Namen Anzeigen beim zerstören von Bodeneineihten

if ((actor as AiGroundActor) != null && damages[0].initiator.Player != null)
GamePlay.gpLogServer(null, "{0} was destroyed by {1}", new object[] { (actor as AiCart).InternalTypeName().Substring(4), (damages[0].initiator.Player.Name()) });

///////////////////////////Punkte für zerstörte Einheiten
foreach (DamagerScore ds in damages)
{
int Addpoints = 0;
int value;
bool willReportDead = false;
string TargetName = "";

if (ds.initiator != null)
{
if (ds.initiator.Actor != null)
{
if (actor is AiPerson) break; // At moment Pilotkills are not counted ;)

if (actor is AiAircraft)
{

if (PointsforAirTargets.TryGetValue((actor as AiAircraft).Type().ToString(), out value)) // Erstetzt wegen Stukaproblem
Addpoints = PointsforAirTargets[(actor as AiAircraft).Type().ToString()];

TargetName = SplitName((actor as AiAircraft).InternalTypeName());

value = 0;

if (actor.Army() == ArmyRed)
{
BlueAirKills++;

if (RAFAvailableAirplanes.TryGetValue((actor as AiAircraft).InternalTypeName(), out value))
{
RAFAvailableAirplanes[(actor as AiAircraft).InternalTypeName()] = value - 1;
TargetName += " (" + RAFAvailableAirplanes[(actor as AiAircraft).InternalTypeName()].ToString() + " available)"; // Shows Counter for Planetype
}
}

else if (actor.Army() == ArmyBlue)
{
RedAirKills++;
if (LWAvailableAirplanes.TryGetValue((actor as AiAircraft).InternalTypeName(), out value))
{
LWAvailableAirplanes[(actor as AiAircraft).InternalTypeName()] = value - 1;
TargetName += " (" + LWAvailableAirplanes[(actor as AiAircraft).InternalTypeName()].ToString() + " available)"; // Shows Counter for Planetype
}

}
}

if (actor is AiGroundActor)
{
if (PointsforGroundTargets.TryGetValue((actor as AiGroundActor).Type(), out value))
Addpoints = PointsforGroundTargets[(actor as AiGroundActor).Type()];

TargetName = SplitName((actor as AiGroundActor).InternalTypeName());
}



willReportDead = true;

if (ds.initiator.Actor.Army() == ArmyBlue)
{
BlueGrdKills++;
ScoreBlue += Addpoints;
if (Addpoints <=0)
{ScoreBlue += 3;}
GamePlay.gpLogServer(null, "Britisch {0} destroyed - Team scores now: RAF {1}- LW {2}", new object[] { TargetName, ScoreRed, ScoreBlue });
break;
}
else if (ds.initiator.Actor.Army() == ArmyRed)
{
RedGrdKills++;
ScoreRed += Addpoints;
if (Addpoints <=0)
{ScoreRed += 3;}
GamePlay.gpLogServer(null, "German {0} destroyed - Team scores now: RAF {1}- LW {2}", new object[] { TargetName, ScoreRed, ScoreBlue });
break;

}
}
}
}

this code, had a problem when directly copy paste, it wouldnt count Friendly kills nor, if i crashed myself.

so ... help? please? :grin:

salmo
10-11-2012, 01:50 AM
Bump here. Can anyone explain damages score please?

Code removed by author

FG28_Kodiak
10-11-2012, 04:33 AM
Add all Values in the damagerlist together, then you have the 100%. Then divide
part damagerscore / 100% Value = Percent

salmo
10-11-2012, 04:57 AM
Add all Values in the damagerlist together, then you have the 100%. Then divide
part damagerscore / 100% Value = Percent

Thanks Kodiak. I must be doing something wrong then. I have the following code which return values like "DamagerScore Total: 47.7" or "DamagerScore Total: 76.39999" or "DamagerScore Total: 53.3".Ideas?

Code removed by author

FG28_Kodiak
10-11-2012, 05:24 AM
No nothing wrong, after this you have the 100% Value.

Example
4 damagersscores (12, 1, 16, 5)
12 + 1 + 16 + 5 = 34

to get the percentual part of a single damager
12/34 = 0,353 (35,3%)
1/34 = 0,029 (2,9%)
16/34 = 0,471 (47,1%)
5/34 = 0,147 (14,7%)
controll:
0,353 + 0,029 + 0,471 + 0,147 = 1

So Damager 1 has made 35,3% of the damage, Damager 3 has done the most with 47,1%.

salmo
10-11-2012, 05:34 AM
Agh! Got it now :) So does the raw sum total damages give any indication of relative "strength" between actors then. ie.

Actor 1 dies .... total damages = 10
Actor 2 dies .... total dmaages = 100

Actor1 is 1/10 as strong as actor 2?

FG28_Kodiak
10-11-2012, 05:50 AM
no it's depend on the damager hits

from Battle Script / strategy.dll AddScoreToInitiator(AiActor actor, AiDamageInitiator initiator, double score):


public int AddScoreToInitiator(AiActor actor, AiDamageInitiator initiator, double score)
{
DamagerScore item = new DamagerScore(initiator, score, base.Time.current());
int index = this.damList.victim.IndexOf(actor);
if (index >= 0)
{
List<DamagerScore> list = this.damList.damagers[index];
int num2 = list.IndexOf(item);
if (num2 >= 0)
{
DamagerScore local1 = list[num2];
local1.score += score;
list[num2].time = base.Time.current();
return index;
}
list.Insert(0, item);
return index;
}
this.damList.victim.Insert(0, actor);
List<DamagerScore> list2 = new List<DamagerScore> {
item
};
this.damList.damagers.Insert(0, list2);
return 0;
}




public override void OnActorDamaged(int missionNumber, string shortName, AiActor actor, AiDamageInitiator initiator, NamedDamageTypes damageType)
{
switch (damageType)
{
case NamedDamageTypes.ChunkSmallDamage:
case NamedDamageTypes.PartSmallDamage:
case NamedDamageTypes.WeaponSmallDamage:
case NamedDamageTypes.EngineSmallDamage:
case NamedDamageTypes.LifeKeeperPartSmallDamage:
this.AddScoreToInitiator(actor, initiator, 0.1);
break;

case NamedDamageTypes.ChunkLargeDamage:
case NamedDamageTypes.PartLargeDamage:
case NamedDamageTypes.WeaponLargeDamage:
case NamedDamageTypes.EngineLargeDamage:
case NamedDamageTypes.LifeKeeperPartLargeDamage:
this.AddScoreToInitiator(actor, initiator, 0.2);
break;
}
foreach (AMission mission in base.missions)
{
if (mission.IsMissionListener(missionNumber))
{
mission.OnActorDamaged(missionNumber, shortName, actor, initiator, damageType);
}
}
}


public override void OnActorDead(int missionNumber, string shortName, AiActor actor, AiDamageInitiator initiator)
{
if ((base.GamePlay.gpPlayer().Place() == actor) && base.GamePlay.gpIsServerSingle())
{
base.GamePlay.gpHUDLogCenter("Press Esc to end mission.");
}
if (actor is AiPerson)
{
initiator = null;
}
int index = -1;
if (initiator != null)
{
index = this.AddScoreToInitiator(actor, initiator, 0.5);
}
else
{
index = this.damList.victim.IndexOf(actor);
}
List<DamagerScore> damages = null;
if (index >= 0)
{
damages = this.damList.damagers[index];
}
else
{
damages = new List<DamagerScore>();
}
foreach (AMission mission in base.missions)
{
if (mission.IsMissionListener(missionNumber))
{
mission.OnActorDead(missionNumber, shortName, actor, damages);
}
}
this.LogServer_ActorDead(missionNumber, shortName, actor, initiator);
}

public override void OnAircraftDamaged(int missionNumber, string shortName, AiAircraft aircraft, AiDamageInitiator initiator, NamedDamageTypes damageType)
{
base.OnAircraftDamaged(missionNumber, shortName, aircraft, initiator, damageType);
this.AddScoreToInitiator(aircraft, initiator, 0.1);
}


public override void OnAircraftLimbDamaged(int missionNumber, string shortName, AiAircraft aircraft, AiLimbDamage limbDamage)
{
base.OnAircraftLimbDamaged(missionNumber, shortName, aircraft, limbDamage);
this.AddScoreToInitiator(aircraft, limbDamage.Initiator, 0.2);
}


public override void OnPersonHealth(AiPerson person, AiDamageInitiator initiator, float deltaHealth)
{
this.AddScoreToInitiator(person, initiator, ((double) deltaHealth) / 255.0);
base.OnPersonHealth(person, initiator, deltaHealth);
}

salmo
10-11-2012, 06:08 AM
OK. Thanks, Got the points allocation to work now. Much appreciated.