Advertisement
snake5

SBX AI code

Feb 11th, 2013
248
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 6.45 KB | None | 0 0
  1.  
  2. #include "CppProto.h"
  3.  
  4. #include "SBMain.h"
  5. #include "ObjMachine.h"
  6. #include "ObjBotNet.h"
  7.  
  8.  
  9. #define DCOM_WALLRAY    1
  10. #define DCOM_EMSCANNER  2
  11.  
  12.  
  13. struct SGDroneCom
  14. {
  15.     UINT32 ID;
  16.     FLOAT Health;
  17.     mVec2 Off;
  18.     FLOAT Size;
  19.     FLOAT Sens;//-itivity
  20. };
  21. typedef TArray< SGDroneCom > DroneComVec;
  22.  
  23. /*
  24.     Component damage:
  25.     = Sens / MAX( EPSILON, len( World(Off) - DmgPoint ) - Size ) * len( Velocity ) * MC
  26.     - MC: magic constant (0.01?)
  27. */
  28.  
  29.  
  30. SGDroneCom DCP_WallRay = { DCOM_WALLRAY, 10.0f, mVec2( 0, 12.0f ), 2.0f, 4.0f };
  31. SGDroneCom DCP_EMScanner = { DCOM_EMSCANNER, 4.0f, mVec2( 0, 0 ), 5.0f, 10.0f };
  32.  
  33.  
  34. struct SGDroneSB : SGMachine
  35. {
  36.     SGDroneSB( PVarVec& data, SGMap* map ) : SGMachine( data, map ), SpawnPos( data[ 1 ].Vec2() )
  37.     {
  38.         Radius = 12;
  39.         ShowLaser = FALSE;
  40.         Mtl.LoadMaterial( "Materials/Chars/Drone.mtx" );
  41.         CurAng = PrevAng = gAtan2( data[ 2 ].Vec2().y, data[ 2 ].Vec2().x );
  42.  
  43.         Init();
  44.  
  45.         Map->AddLight( &Light );
  46.     //  Light.Color = mFColor( 0.7f, 0.1f, 0.05f );
  47.         Components.PushBack( DCP_WallRay );
  48.         Components.PushBack( DCP_EMScanner );
  49.     }
  50.     ~SGDroneSB()
  51.     {
  52.         Map->RemoveLight( &Light );
  53.     }
  54.  
  55.     void Tick( FLOAT delta )
  56.     {
  57.         GTickDebugInfo += TString().Printf( 32, "\nDRONE [%p]\n", this );
  58.         SGMachine::Tick( delta );
  59.  
  60.         if( !Dead )
  61.         {
  62.             // Hardware
  63.             UpdateComponents();
  64.             // Software
  65.             UpdateFirmware( delta );
  66.         }
  67.     }
  68.  
  69.     /*
  70.         Component system
  71.     */
  72.     UBOOL HasComponent( INT32 id )
  73.     {
  74.         for( UINT32 i = 0; i < Components.Size(); ++i )
  75.         {
  76.             if( Components[ i ].ID == id )
  77.                 return Components[ i ].Health > 0.0f;
  78.         }
  79.         return FALSE;
  80.     }
  81.  
  82.     FLOAT DC_WallRayOutput; // distance to wall
  83.     FLOAT DC_EMSTimeout;    // source-to-confirmation timeout (resets on disappearance of source)
  84.     mVec3 DC_EMSSources[5]; // source information on first 5 visible items
  85.     mVec2 DC_EMSConfPos;    // confirmed position of enemy
  86.     FLOAT DC_EMSConfEnergy; // confirmed energy of enemy (0 if none confirmed)
  87.     void UpdateComponents()
  88.     {
  89.         // create a connection
  90.         SGBotNet* botnet = GetBotNet( Map );
  91.  
  92.         for( UINT32 i = 0; i < Components.Size(); ++i )
  93.         {
  94.             if( Components[ i ].Health <= 0.0f )
  95.                 continue;
  96.  
  97.             switch( Components[ i ].ID )
  98.             {
  99.             case DCOM_WALLRAY:
  100.                 DC_WallRayOutput = Map->RaycastPhysics2( CurPos, CurPos + mVec2( gCos( CurAng ), gSin( CurAng ) ) * 50, MC_RAYCAST );
  101.                 GTickDebugInfo += TString().Printf( 256, "WALLRAY: %f\n", DC_WallRayOutput );
  102.                 break;
  103.             case DCOM_EMSCANNER:
  104.                 {
  105.                     UINT32 count = 0, which = 0;
  106.                     count = botnet->GetEMFSources( DC_EMSSources, 5, CurPos, mVec2( gCos( CurAng ), gSin( CurAng ) ), 0.5f, 0.1f );
  107.                     if( !count )
  108.                         DC_EMSConfEnergy = 0;
  109.                     else
  110.                     {
  111.                         which = botnet->CheckEMFSources( DC_EMSSources, count, CurPos );
  112.                         if( which == count )
  113.                             DC_EMSConfEnergy = 0;
  114.                         else
  115.                         {
  116.                             DC_EMSConfPos = mVec2( DC_EMSSources[ which ] );
  117.                             DC_EMSConfEnergy = DC_EMSSources[ which ].z;
  118.                         }
  119.                     }
  120.                     GTickDebugInfo += TString().Printf( 256, "EMSCANNER: %d sources, #%d hostile\n", count, which == count ? -1 : which + 1 );
  121.                 }
  122.                 break;
  123.             }
  124.         }
  125.     }
  126.     /*
  127.         End of Component system
  128.     */
  129.  
  130.     PVar FWData;
  131.     void UpdateFirmware( FLOAT delta );
  132.  
  133.     DroneComVec Components;
  134.     mVec2 SpawnPos;
  135. };
  136.  
  137.  
  138. ENT_BEGIN( SGDroneSB )
  139. PVAR_INHERIT( SGEntity )
  140. PVAR_VEC2_I( "Position", mVec2( 0.0f ) )
  141. PVAR_VEC2_I( "Direction", mVec2( 1, 0 ) )
  142. ENT_END( "NPC_Drone", SGDroneSB );
  143.  
  144.  
  145.  
  146. #define DACT_PATROL 1
  147. #define DACT_VERIFY 2
  148. #define DACT_ATTACK 3
  149.  
  150. void SGDroneSB::UpdateFirmware( FLOAT delta )
  151. {
  152.     // PROTOTYPE CODE
  153.  
  154.     // initialize
  155.     if( !FWData.Get( "ready" ).GetInt() )
  156.     {
  157.         FWData.Get( "action" ).SetInt( DACT_PATROL );
  158.         FWData.Get( "movedir" ).SetVec2( mVec2( 1, 0 ) );
  159.         FWData.Get( "turndir" ).SetInt( 1 );
  160.         FWData.Get( "turntimeout" ).SetReal( 5 + M_RandF() * 5 );
  161.         FWData.Get( "verifytimeout" ).SetReal( 0 );
  162.         FWData.Get( "attacktime" ).SetReal( 0 );
  163.  
  164.         FWData.Get( "ready" ).SetInt( 1 );
  165.     }
  166.  
  167.     INT32 action = FWData.Get( "action" ).GetInt();
  168.     mVec2 movedir = FWData.Get( "movedir" ).GetVec2();
  169.     INT32 turndir = FWData.Get( "turndir" ).GetInt();
  170.     FLOAT turntimeout = FWData.Get( "turntimeout" ).GetReal();
  171.     FLOAT verifytimeout = FWData.Get( "verifytimeout" ).GetReal();
  172.     FLOAT attacktime = FWData.Get( "attacktime" ).GetReal();
  173.     mVec2 target = FWData.Get( "target" ).GetVec2();
  174.     movedir.Normalize();
  175.  
  176.     turntimeout -= delta;
  177.     if( turntimeout <= 0 )
  178.     {
  179.         turndir = !turndir;
  180.         turntimeout = M_RandF() * 13 + 8;
  181.     }
  182.  
  183.     switch( action )
  184.     {
  185.     case DACT_PATROL:
  186.         Light.Color = mFColor( 0.9f, 0.8f, 0.7f );
  187.         if( DC_WallRayOutput < 2 )
  188.         {
  189.             IMoveX = 0;
  190.             IMoveY = 0;
  191.             movedir = movedir.Rotated( delta * ( turndir * 2 - 1 ) * 3 );
  192.         }
  193.         else
  194.         {
  195.             FLOAT spd = 0.2f;
  196.             IMoveX = movedir.x * spd;
  197.             IMoveY = movedir.y * spd;
  198.         }
  199.         if( DC_EMSConfEnergy > 0 )
  200.         {
  201.             // target found!
  202.             target = DC_EMSConfPos;
  203.             movedir = ( target - CurPos ).Normalized();
  204.             verifytimeout = 0.83f;
  205.             action = DACT_VERIFY;
  206.         }
  207.         RotateTo( movedir );
  208.         break;
  209.  
  210.     case DACT_VERIFY:
  211.         IMoveX = 0;
  212.         IMoveY = 0;
  213.         verifytimeout -= delta;
  214.         if( verifytimeout <= 0 )
  215.         {
  216.             if( DC_EMSConfEnergy > 0 )
  217.             {
  218.                 // target confirmed!
  219.                 target = DC_EMSConfPos;
  220.                 action = DACT_ATTACK;
  221.                 attacktime = 0;
  222.             }
  223.             else
  224.                 action = DACT_PATROL;
  225.         }
  226.         RotateTo( movedir, 0.1f, 1 );
  227.         break;
  228.  
  229.     case DACT_ATTACK:
  230.         Light.Color = mFColor( 0.7f, 0.1f, 0.05f );
  231.         if( DC_EMSConfEnergy > 0 && ( CurPos - target ).Length() < 300 && gMod( attacktime, 1.2f ) < 0.6f )
  232.         {
  233.             target = DC_EMSConfPos;
  234.             movedir = target - CurPos;
  235.             FireTurret();
  236.         }
  237.         else if( ( CurPos - target ).Length() > 64 )
  238.         {
  239.             FLOAT spd = 0.4f;
  240.             IMoveX = target.x > CurPos.x ? spd : -spd;
  241.             IMoveY = target.y > CurPos.y ? spd : -spd;
  242.             movedir = target - CurPos;
  243.             verifytimeout = 4 + M_RandF();
  244.         }
  245.         else
  246.         {
  247.             IMoveX = 0;
  248.             IMoveY = 0;
  249.             movedir = movedir.Rotated( delta * 2 );
  250.             verifytimeout -= delta;
  251.             if( verifytimeout <= 0 )
  252.             {
  253.                 // target lost!
  254.                 action = DACT_PATROL;
  255.             }
  256.         }
  257.         RotateTo( movedir );
  258.         attacktime += delta;
  259.         break;
  260.     }
  261.  
  262.     ShowLaser = action != DACT_PATROL;
  263.  
  264.     FWData.Get( "action" ).SetInt( action );
  265.     FWData.Get( "movedir" ).SetVec2( movedir );
  266.     FWData.Get( "turndir" ).SetInt( turndir );
  267.     FWData.Get( "turntimeout" ).SetReal( turntimeout );
  268.     FWData.Get( "verifytimeout" ).SetReal( verifytimeout );
  269.     FWData.Get( "attacktime" ).SetReal( attacktime );
  270.     FWData.Get( "target" ).SetVec2( target );
  271. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement