Blinking and Repositioning SAMs Demo

All discussions & material related to Command's Lua interface

Moderators: RoryAndersonCDT, michaelm75au, angster, MOD_Command

Post Reply
User avatar
SeaQueen
Posts: 1436
Joined: Sat Apr 14, 2007 4:20 am
Location: Washington D.C.

Blinking and Repositioning SAMs Demo

Post by SeaQueen »

SAMs blink their radars and reposition according to a set schedule set at the scenario start.
Attachments
ShootAnd..Version.zip
(15.07 KiB) Downloaded 36 times
User avatar
SeaQueen
Posts: 1436
Joined: Sat Apr 14, 2007 4:20 am
Location: Washington D.C.

RE: Blinking and Repositioning SAMs Demo

Post by SeaQueen »

There's two important portions to the code. The first set of lua code is executed at scenario load:

Code: Select all

 -- randomize the sam site states
 
 samSites = { 'gwkw9v-0hls0ku7054ja', 'gwkw9v-0hls0ku7054ku', 'gwkw9v-0hls0ku7054nq', 'gwkw9v-0hls0ku7054mc'}  
 samSiteState = {}
 
 emitTime = 8 -- minutes
 tearDownTime = 2 -- minutes
 repositionTime = 2 -- minutes
 setUpTime = 2 -- minutes
 standByTime = 2 -- minutes
 
 timeToCompleteEvolution = emitTime + tearDownTime + repositionTime + setUpTime + standByTime
 
 timeToCeaseEmission = emitTime
 timeToCompleteTearDown = timeToCeaseEmission + tearDownTime
 timeToCompleteRelocation = timeToCompleteTearDown + repositionTime
 timeToCompleteSetUp = timeToCompleteRelocation + setUpTime
 timeToStandBy = timeToCompleteSetUp + standByTime
 
 -- weapons control states
 wcsFree = 0
 wcsTight = 1
 wcsHold = 2
 

Code: Select all

 
 for i, s in ipairs(samSites) do
 
     u = ScenEdit_GetUnit( { guid=s } )
     time = math.random(0, timeToCompleteEvolution )
     if time < timeToCeaseEmission then 
         samSiteState[s] = { state="emitting", minutesInState = time }
         ScenEdit_SetEMCON('Unit', s, 'Radar=Active')
         ScenEdit_SetDoctrine({side = 'IRN', unitname=u.name }, { weapon_control_status_air = wcsTight  })
     elseif ( (time >= timeToCeaseEmission) and ( time < timeToCompleteTearDown )) then
         samSiteState[s] = { state="tearingDown", minutesInState = (time - timeToCeaseEmission) }
         ScenEdit_SetDoctrine({side = 'IRN', unitname=u.name }, { weapon_control_status_air = wcsHold  })
         ScenEdit_SetEMCON('Unit', s, 'Radar=Passive')
     elseif ( ( time >= timeToCompleteTearDown ) and (time < timeToCompleteRelocation )) then
         samSiteState[s] = { state="repositioning", minutesInState = (time - timeToCompleteTearDown) }
         ScenEdit_SetDoctrine({side = 'IRN', unitname=u.name }, { weapon_control_status_air = wcsHold  })
         ScenEdit_SetEMCON('Unit', s, 'Radar=Passive')
     elseif ( (time >= timeToCompleteRelocation ) and ( time < timeToCompleteSetUp )) then
         samSiteState[s] = { state="settingUp", minutesInState = (time - timeToCompleteRelocation) }
         ScenEdit_SetDoctrine({side = 'IRN', unitname=u.name }, { weapon_control_status_air = wcsHold  })
         ScenEdit_SetEMCON('Unit', s, 'Radar=Passive')
     else
         samSiteState[s] = { state="standingBy", minutesInState = (time - timeToCompleteSetUp ) }
         ScenEdit_SetDoctrine({side = 'IRN', unitname=u.name }, { weapon_control_status_air = wcsHold  })
         ScenEdit_SetEMCON('Unit', s, 'Radar=Passive')
     end
 end
 
 

The second portion is executed by an action controlled by an "Every Minute" trigger.

Code: Select all

 function randomWaypoint(currentPosition, distance)
 
     math.randomseed( os.time() ) -- hopefully removes correlations
 
 
     local lat0 = currentPosition.latitude
     local lon0 = currentPosition.longitude
     local r = math.random(0, 359)
     local degreesPerNauticalMile = 1/60    
 
     local latDisplacementNauticalMiles = distance * math.cos( math.rad(r) )
     local lonDisplacementNauticalMiles = distance * math.sin( math.rad(r) )
 
     local latDisplacementDegrees = latDisplacementNauticalMiles * degreesPerNauticalMile  -- only strictly correct at the equator
     local lonDisplacementDegrees = lonDisplacementNauticalMiles * degreesPerNauticalMile
      
     local lat = lat0 + latDisplacementDegrees
     local lon = lon0 + lonDisplacementDegrees
 
     local randomWaypoint = {TypeOf = 'ManualPlottedCourseWaypoint', longitude = lon, latitude = lat}
     
     return randomWaypoint
 end
 

Code: Select all

 for i, s in ipairs(samSites) do
 
        u = ScenEdit_GetUnit( { guid = s} )
 
        if samSiteState[s] ~= nil then   
          -- increment samsite time in state by one minute
          samSiteState[s].minutesInState = samSiteState[s].minutesInState + 1     
 
          if samSiteState[s].state == 'emitting' then
              ScenEdit_SetEMCON('Unit', s, 'Radar=Active')
              ScenEdit_SetDoctrine({side = 'IRN', unitname=u.name }, { weapon_control_status_air = wcsTight  })
              ScenEdit_SetUnit({side='IRN', guid=s, course={}, speed = 0, holdposition=true  })
              if samSiteState[s].minutesInState >= emitTime then
                 samSiteState[s].state = 'tearingDown'
                 samSiteState[s].minutesInState = 0
                 break
              end
          elseif samSiteState[s].state == 'tearingDown' then
              ScenEdit_SetEMCON('Unit', s, 'Radar=Passive')
              ScenEdit_SetDoctrine({side = 'IRN', unitname=u.name }, { weapon_control_status_air = wcsHold  })
              ScenEdit_SetUnit({side='IRN', guid=s, course={}, speed = 0, holdposition=true  })
              if samSiteState[s].minutesInState >= tearDownTime then
                 samSiteState[s].state = 'repositioning'
                 samSiteState[s].minutesInState = 0
                 break
              end
 

Code: Select all

          elseif samSiteState[s].state == 'repositioning' then
               ScenEdit_SetEMCON('Unit', s, 'Radar=Passive')
               ScenEdit_SetDoctrine({side = 'IRN', unitname=u.name }, { weapon_control_status_air = wcsHold  })              
               repositionSpeed = 35 -- knots
               ScenEdit_SetUnit({side='IRN', guid=s, course={randomWaypoint({latitude=u.latitude, longitude=u.longitude}, (repositionSpeed *repositionTime / 60)  )}, speed = repositionSpeed, holdposition=false  })
               if samSiteState[s].minutesInState >= repositionTime then
                 samSiteState[s].state = 'settingUp' 
                 samSiteState[s].minutesInState = 0        
                 break
              end
          elseif samSiteState[s].state == 'settingUp' then
            ScenEdit_SetEMCON('Unit', s, 'Radar=Passive')
            ScenEdit_SetDoctrine({side = 'IRN', unitname=u.name }, { weapon_control_status_air = wcsHold })   
            ScenEdit_SetUnit({side='IRN', guid=s, course={}, speed = 0, holdposition=true  })
            if samSiteState[s].minutesInState >= repositionTime then
                 samSiteState[s].state = 'standingBy' 
                 samSiteState[s].minutesInState = 0
                 break
             end
 

Code: Select all

          elseif samSiteState[s].state == 'standingBy' then
             ScenEdit_SetEMCON('Unit', s, 'Radar=Passive')
             ScenEdit_SetDoctrine({side = 'IRN', unitname=u.name }, { weapon_control_status_air = wcsHold  })        
             ScenEdit_SetUnit({side='IRN', guid=s, course={}, speed = 0, holdposition=true  })
              if samSiteState[s].minutesInState >= timeToCompleteEvolution then
                 samSiteState[s].state = 'emitting'
                 samSiteState[s].minutesInState = 0
                 break
              end
         end
     end
 end
 

Post Reply

Return to “Lua Legion”