00001
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
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
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
00050 double angl = (usec * m_turn_rate) / 1000000;
00051 angl = (angl < diff_cw) ? angl : diff_cw;
00052 double powr = (angl * 550) / m_turn_rate;
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
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;
00076 angl = (angl < diff_ccw) ? angl : diff_ccw;
00077 double powr = (angl * 550) / m_turn_rate;
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
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:
00133 return m_life.Ok();
00134 case 2:
00135 return m_life.GetDamage();
00136 case 3:
00137 return m_life.GetRepairRate();
00138 case 4:
00139 break;
00140 case 5:
00141 return (int)((100 * m_power_level) / m_max_power_level);
00142 case 6:
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:
00154 break;
00155 case 2:
00156 break;
00157 case 3:
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