Google
Web alhem.net

Robot.cpp

Go to the documentation of this file.
00001 //#include <stdio.h>
00002 
00003 #include <Base64.h>
00004 #include "Robot.h"
00005 
00006 
00007 Robot::Robot(Map& m,const std::string& xmlfile) : MapObject(m)
00008 ,m_config(xmlfile)
00009 ,m_code(NULL)
00010 ,m_life(*this)
00011 ,m_radar(*this)
00012 ,m_turret(*this)
00013 ,m_gun(*this)
00014 ,m_shields(*this)
00015 ,m_power_level(0)
00016 ,m_max_power_level(10000)
00017 ,m_charge_rate(1000)
00018 ,m_current_heading(0)
00019 ,m_set_heading(m_current_heading)
00020 ,m_turn_rate(12)
00021 {
00022         m_code = new CodeTool(m_config);
00023         m_code -> SetRobot( this );
00024 }
00025 
00026 
00027 Robot::~Robot()
00028 {
00029         delete m_code;
00030 }
00031 
00032 
00033 void Robot::Tick(long usec)
00034 {
00035         // Robot: charge
00036         {
00037                 double x = (usec * m_charge_rate) / 1000000;
00038                 m_power_level += x;
00039                 if (m_power_level > m_max_power_level)
00040                         m_power_level = m_max_power_level;
00041         }
00042         // Robot: turn
00043         {
00044                 double diff_cw = m_set_heading - m_current_heading;
00045                 if (diff_cw < 0)
00046                         diff_cw += 360;
00047                 if (diff_cw >= 0.1 && diff_cw <= 180)
00048                 {
00049                         // cw turn
00050                         double angl = (usec * m_turn_rate) / 1000000; // 12 degrees/sec
00051                         angl = (angl < diff_cw) ? angl : diff_cw;
00052                         double powr = (angl * 550) / m_turn_rate; // 550 power units / 12 degrees
00053                         // ...
00054                         if (UsePower(powr))
00055                         {
00056                                 m_current_heading += angl;
00057                                 if (m_current_heading >= 360)
00058                                         m_current_heading -= 360;
00059                                 double diff = m_current_heading - m_set_heading;
00060                                 if (diff < 0)
00061                                         diff *= -1;
00062                                 if (diff < 0.1)
00063                                 {
00064                                         Call( "OnTurnComplete" );
00065                                 }
00066                         }
00067                 }
00068                 else
00069                 if (diff_cw >= 0.1)
00070                 {
00071                         // ccw turn
00072                         double diff_ccw = m_current_heading - m_set_heading;
00073                         if (diff_ccw < 0)
00074                                 diff_ccw += 360;
00075                         double angl = (usec * m_turn_rate) / 1000000; // 12 degrees/sec
00076                         angl = (angl < diff_ccw) ? angl : diff_ccw;
00077                         double powr = (angl * 550) / m_turn_rate; // 550 power units / 12 degrees
00078                         // ...
00079                         if (UsePower(powr))
00080                         {
00081                                 m_current_heading -= angl;
00082                                 if (m_current_heading < 0)
00083                                         m_current_heading += 360;
00084                                 double diff = m_current_heading - m_set_heading;
00085                                 if (diff < 0)
00086                                         diff *= -1;
00087                                 if (diff < 0.1)
00088                                 {
00089                                         Call( "OnTurnComplete" );
00090                                 }
00091                         }
00092                 }
00093         }
00094 
00095         // Robot parts Tick
00096         m_shields.Tick( usec );
00097         m_radar.Tick( usec );
00098         m_turret.Tick( usec );
00099         m_gun.Tick( usec );
00100         m_life.Tick( usec );
00101 }
00102 
00103 
00104 void Robot::AddObject(MapObject *p)
00105 {
00106         m_inventory.push_back(p);
00107 }
00108 
00109 
00110 bool Robot::UsePower(double units)
00111 {
00112         if (m_power_level < units)
00113         {
00114                 Call( "OnOutOfPower" );
00115                 return false;
00116         }
00117         m_power_level -= units;
00118         return true;
00119 }
00120 
00121 
00122 void Robot::Call(const std::string& method)
00123 {
00124         m_code -> Call( method );
00125 }
00126 
00127 
00128 long Robot::get_property(int prop)
00129 {
00130         switch (prop)
00131         {
00132         case 1: // ok
00133                 return m_life.Ok();
00134         case 2: // damage
00135                 return m_life.GetDamage();
00136         case 3: // repair_rate
00137                 return m_life.GetRepairRate();
00138         case 4: // inventory
00139                 break;
00140         case 5: // power 0 .. 100 %
00141                 return (int)((100 * m_power_level) / m_max_power_level);
00142         case 6: // charging
00143                 return (m_power_level < m_max_power_level) ? true : false;
00144         }
00145         return 0;
00146 }
00147 
00148 
00149 void Robot::set_property(int prop,long value)
00150 {
00151         switch (prop)
00152         {
00153         case 1: // ok
00154                 break;
00155         case 2: // damage
00156                 break;
00157         case 3: // repair_rate
00158                 m_life.SetRepairRate(value);
00159                 break;
00160         }
00161 }
00162 
00163 
00164 long Robot::call_method(int method,stack_v&)
00165 {
00166 }
00167 
00168 
00169 long Robot::get_property(const std::string& prop)
00170 {
00171 }
00172 
00173 

Generated for Robot World by doxygen 1.3.6

Page, code, and content Copyright (C) 2004 by Anders Hedström