Lua - Damage Points and List of Sides

Post new mods and scenarios here.

Moderator: MOD_Command

Post Reply
Rory Noonan
Posts: 2418
Joined: Thu Dec 18, 2014 1:53 am
Location: Brooklyn, NY

Lua - Damage Points and List of Sides

Post by Rory Noonan »

I'm looking at a script that checks each unit on a particular side for damage and then resets its damage status.

Below is the code that I think would be 'ideal', however the damage table in the unit wrapper is 'read only' so the changes made in the code below aren't actually saved. I have tried using the SetUnitDamage function but that appears to only influence component damage, fire and flood--not damage points.

Also, I was wondering if there's a way to return all the sides that are in a scenario? Something like: ScenEdit_ListSides() --returns a table of sides with name and guid

Code: Select all

p_side = ScenEdit_PlayerSide()
 side = VP_GetSide({name=p_side})
 for i = 1,#side.units do
 	unit = ScenEdit_GetUnit({guid=side.units[i].guid})
 	damage = unit.damage
 	damage_start = tonumber(damage.startdp)
 	damage_current = tonumber(damage.dp)
 		if damage_current < damage_start then
 			ScenEdit_SetUnit({guid=unit.guid,damage={dp=damage_start}})
 		end
 end

Any suggestions?
Image
Fer_Cabo
Posts: 111
Joined: Thu Sep 17, 2015 2:39 pm

RE: Lua - Damage Points and List of Sides

Post by Fer_Cabo »

Hi Apache,

A few months back i was looking at the possibility to use as condition for an event-trigger the TOTAL AMOUNT OF DPs of one side going over a certain % of that side's DPs.

For instance, GRANT USE OF NUCLEAR WEAPONS for DPRK Side when that side's DPs go over 75% of total DPs of its start-scenario-units.

I understand, i could use the first (most of it really) part of your above script:

p_side = ScenEdit_PlayerSide()
side = VP_GetSide({name=p_side})
for i = 1,#side.units do
unit = ScenEdit_GetUnit({guid=side.units.guid})
damage = unit.damage
damage_start = tonumber(damage.startdp)
damage_current = tonumber(damage.dp)

But... still i cannot find the way to ADD-UP the DPs for all units of a given Side. Your script sorts of "checks" every unit's DPs.

Any idea how i could achieve my goal?

Thanks and sorry to take profit of your consultation to try to achieve a useful answer to my old one ;-)

Best regards!!

Fernando
Rory Noonan
Posts: 2418
Joined: Thu Dec 18, 2014 1:53 am
Location: Brooklyn, NY

RE: Lua - Damage Points and List of Sides

Post by Rory Noonan »

Code: Select all

p_side = ScenEdit_PlayerSide()
 side = VP_GetSide({name=p_side})
 side_damage = 0
 side_dps = 0
 for i = 1,#side.units do
 	unit = ScenEdit_GetUnit({guid=side.units[i].guid})
 	damage = unit.damage
 	damage_start = tonumber(damage.startdp)
 side_dps = side_dps + damage_start
 	damage_current = tonumber(damage.dp)
 side_damage = side_damage + (damage_start - damage_current)
 
 end
 print (p_side..' has sustained a total of '..side_damage..' damage points, out of a total of '..side_dps..' beginning damage points')

That should do it. If you want more utility you could store side_dps early on as a key value, because one of the limitations of the above code is that it doesn't count 'dead' units that don't exist anymore.
Image
User avatar
fortyporkpies
Posts: 20
Joined: Wed Apr 08, 2009 7:09 pm
Location: Washington DC

RE: Lua - Damage Points and List of Sides

Post by fortyporkpies »

ORIGINAL: apache85


Also, I was wondering if there's a way to return all the sides that are in a scenario? Something like: ScenEdit_ListSides() --returns a table of sides with name and guid

Code: Select all

p_side = ScenEdit_PlayerSide()
 side = VP_GetSide({name=p_side})
 for i = 1,#side.units do
 	unit = ScenEdit_GetUnit({guid=side.units[i].guid})
 	damage = unit.damage
 	damage_start = tonumber(damage.startdp)
 	damage_current = tonumber(damage.dp)
 		if damage_current < damage_start then
 			ScenEdit_SetUnit({guid=unit.guid,damage={dp=damage_start}})
 		end
 end

Any suggestions?
Hi Apache-
As a crude workaround, could you briefly switch the player's side awareness to omniscient , grab all the contacts from that side, parse all those contacts with a for..do loop, get each contact's side and side guid info, add this info to a table - checking for duplicates, then switch the side back to normal awareness? This is suboptimal because a)every side would have to have at least one unit when the routine is run; b) the map would have to be zoomed somewhere that wouldn't reveal "spoilers" for the player-side;
Is something like that feasible?
User avatar
fortyporkpies
Posts: 20
Joined: Wed Apr 08, 2009 7:09 pm
Location: Washington DC

RE: Lua - Damage Points and List of Sides

Post by fortyporkpies »

Something like

Code: Select all

 local Pside= ScenEdit_PlayerSide()
 ScenEdit_SetSideOptions('{side=PSide,awareness='OMNI'}') 
 side = VP_GetSide({name=Pside})
 local cp = side.contacts --List Of contacts
 for i = 1,#side.contacts do
     local guid = cp[i].objectid -- a specific contact
     local contact = VP_GetContact({guid=guid}) -- details of contact as distinct to unit details
 
 --INSERT CODE HERE Interrogate contact with getUnit, derive side info and guid, place that info into a table that excludes duplicate entries
 end
 
 --INSERT CODE Change Playerside back to normal awareness
 


Fer_Cabo
Posts: 111
Joined: Thu Sep 17, 2015 2:39 pm

RE: Lua - Damage Points and List of Sides

Post by Fer_Cabo »

Hi apache,

You say "one of the limitations of the above code is that it doesn't count 'dead' units that don't exist anymore", but i guess i'm missing something...since the final printout is "print (p_side..' has sustained a total of '..side_damage..' damage points, out of a total of '..side_dps..' beginning damage points')"

On top of that, ain't "damage_start = tonumber(damage.startdp) " the real "START= Time 0" total DP for the checked side? When you say that "Dead Units" do not count, you mean they don't count for the DP INFLICTED or that they no longer count for the TOTAL START DP of that side?

Thanks!

Fernando.
Post Reply

Return to “Mods and Scenarios”