Official Fulqrum Publishing forum

Official Fulqrum Publishing forum (http://forum.fulqrumpublishing.com/index.php)
-   FMB, Mission & Campaign builder Discussions (http://forum.fulqrumpublishing.com/forumdisplay.php?f=203)
-   -   OnActorDead - Damage DS (http://forum.fulqrumpublishing.com/showthread.php?t=33306)

pupo162 07-17-2012 02:54 PM

OnActorDead - Damage DS
 
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:

Quote:

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:

Quote:

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

Quote:

Originally Posted by FG28_Kodiak (Post 468392)
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):
Code:


        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.


All times are GMT. The time now is 10:00 AM.

Powered by vBulletin® Version 3.8.4
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
Copyright © 2007 Fulqrum Publishing. All rights reserved.