Пример #1
0
TradeRouteData::TradeRouteData
(
	const TradeRoute    route,
	const Unit          source,
	const Unit          dest,
	const PLAYER_INDEX  owner,
	const ROUTE_TYPE    sourceType,
	const sint32        sourceResource,
	PLAYER_INDEX        paying_for,
	sint32              gold_in_return
)
:
	GameObj                         (route.m_id),
    CityRadiusCallback              (),
	m_transportCost                 (0.0),
	m_owner                         (owner),
	m_payingFor                     (paying_for),
	m_piratingArmy                  (),
	m_sourceRouteType               (sourceType),
	m_sourceResource                (sourceResource),
	m_crossesWater                  (false),
	m_isActive                      (false),
	m_color                         (g_colorSet->GetColor(COLOR_YELLOW)),
	m_outline                       (g_colorSet->GetColor(COLOR_BLACK)),
	m_selectedIndex                 (0),
	m_valid                         (false),
	m_gold_in_return                (gold_in_return),
	m_path_selection_state          (k_TRADEROUTE_NO_PATH),
	m_sourceCity                    (source),
	m_destinationCity               (dest),
	m_recip                         (),
	m_path                          (),
	m_wayPoints                     (),
	m_selectedPath                  (),
	m_selectedWayPoints             (),
	m_setPath                       (),
	m_setWayPoints                  (),
	m_astarPath                     (new Path()),
	m_dontAdjustPointsWhenKilled    (false)
{
    std::fill(m_passesThrough, m_passesThrough + k_MAX_PLAYERS, FALSE);
	MapPoint sPos   (m_sourceCity.RetPos());
    MapPoint dPos   (m_destinationCity.RetPos());

	AddWayPoint(sPos);
	AddWayPoint(dPos);

	DPRINTF(k_DBG_GAMESTATE,
			("Creating route from city @ (%d,%d) to city @ (%d,%d)\n",
			 sPos.x, sPos.y, dPos.x, dPos.y));

	m_valid = GeneratePath();

	DPRINTF(k_DBG_GAMESTATE, ("Created Trade Route from %s to %s, cost=%d, valid=%i\n",
	                          m_sourceCity->GetCityData()->GetName(),
	                          m_destinationCity->GetCityData()->GetName(),
	                          m_transportCost
	                         )
	       );
}
Пример #2
0
void CPythonMiniMap::AddSignalPoint(float fX, float fY)
{
	static unsigned int g_id = 255;

	TSignalPoint sp;
	sp.id = g_id;
	sp.v2Pos.x = fX;
	sp.v2Pos.y = fY;

	m_SignalPointVector.push_back(sp);

	AddWayPoint(TYPE_WAYPOINT, g_id, fX, fY, "");

	g_id++;
}
Пример #3
0
void CPythonMiniMap::CreateTarget(int iID, const char * c_szName, DWORD dwVID)
{
	AddWayPoint(TYPE_TARGET, iID, 0.0f, 0.0f, c_szName, dwVID);
}
Пример #4
0
/* ウェイポイントを構築。
 * @param *way	初期化&メモリ確保済みのウェイポイントデータ構造体。
*/
extern void MazeBuildWayPoints( struct WayPointData *way)
{
	int orgy			= way->orgy;
	int orgx			= way->orgx;
	int height			= way->height;
	int width			= way->width;
	int interval		= way->interval;
	int pointsElems		= way->elems;
	WayPoint *points	= way->points;

	// 初期化
	int pc= 0;
	for (int y= orgy; y< height; y+= interval)
	{
		for (int x= orgx; x< width; x+= interval)
		{
			if (pc >= pointsElems)// エラー
				return;
			InitWayPoint( &points[pc], y, x);
			pc++;
		}
	}

	// ウェイポイントリストの作成
	WayPoint	*curpoint;
	Position	environs[4];
	bool		flags[4];

	way->route.deadendElems = 0;// 袋小路の総数を初期化

	for (int i= 0; i< pointsElems; ++i)
	{
		curpoint = &points[i];

		// 現在のポイントの、周辺座標を作成
		// NORTH
		environs[0].y = curpoint->pos.y - interval;
		environs[0].x = curpoint->pos.x;
		// SOUTH
		environs[1].y = curpoint->pos.y + interval;
		environs[1].x = curpoint->pos.x;
		// EAST
		environs[2].y = curpoint->pos.y;
		environs[2].x = curpoint->pos.x + interval;
		// WEST
		environs[3].y = curpoint->pos.y;
		environs[3].x = curpoint->pos.x - interval;

		// 現在のポイントから、作成した周辺座標とのあいだの
		// マップ上に、衝突物がないかを走査
		for (int dir= 0; dir< 4; ++dir)
		{
			Position fluct = {0, 0};// 変動の方向
			
			flags[dir] = true;

			// 変動の方向を決定
			switch (dir)
			{
				case 0:/* NORTH */ fluct.y = -1; fluct.x =  0; break;
				case 1:/* SOUTH */ fluct.y =  1; fluct.x =  0; break;
				case 2:/* EAST  */ fluct.y =  0; fluct.x =  1; break;
				case 3:/* WEST  */ fluct.y =  0; fluct.x = -1; break;
			}
			// マップ上の衝突物を走査
			for (int j= 0; j< interval; ++j)
			{
				int y = curpoint->pos.y + (j * fluct.y);
				int x = curpoint->pos.x + (j * fluct.x);

				if ((unsigned int)y >= NUM_MAP_HEIGHT ||
					(unsigned int)x >= NUM_MAP_WIDTH)
				{
					flags[dir] = false;// 有効範囲外
					break;
				}
				int value = MapGetFieldValue(y, x);
				if ( MapIsCollisionFieldValue( value ))
				{
					flags[dir] = false;// 衝突物有り。フラグをバッキバキ。
					break;
				}
			}
		}

		// 現在のポイントと、有効な周辺座標とをリンクする
		for (int j= 0; j< pointsElems; ++j)
		{
			if (curpoint == &points[j])
				continue;// 自身ならスルー

			for (int dir= 0; dir< 4; ++dir)
			{
				if (flags[dir])// その方向の周辺座標が有効で
				{
					// ポイントリスト内のポイントの座標と一致するなら
					if ( points[j].pos.y == environs[dir].y &&
						 points[j].pos.x == environs[dir].x )
					{
						// リンクする
						AddWayPoint( curpoint, &points[j] );
						break;
					}
				}
			}
		}
		if (curpoint->linksum == 1)
		{
			way->route.deadendElems++;
		}
	}
}
Пример #5
0
bool
EWDevice::DeclareInner(const struct Declaration *decl,
                       OperationEnvironment &env)
{
  char sTmp[72];

  ewDecelTpIndex = 0;

  if (!TryConnect())
    return false;

  WriteWithChecksum(port, "#SPI"); // send SetPilotInfo
  env.Sleep(50);

  char sPilot[13], sGliderType[9], sGliderID[9];
  convert_string(sPilot, sizeof(sPilot), decl->PilotName);
  convert_string(sGliderType, sizeof(sGliderType), decl->AircraftType);
  convert_string(sGliderID, sizeof(sGliderID), decl->AircraftReg);

  // build string (field 4-5 are GPS info, no idea what to write)
  sprintf(sTmp, "%-12s%-8s%-8s%-12s%-12s%-6s\r",
          sPilot,
          sGliderType,
          sGliderID,
          "", // GPS Model
          "", // GPS Serial No.
          "" // Flight Date,
                                                  // format unknown,
                                                  // left blank (GPS
                                                  // has a RTC)
  );
  port->Write(sTmp);

  if (!port->ExpectString("OK\r"))
    return false;

  /*
  sprintf(sTmp, "#SUI%02d", 0);           // send pilot name
  WriteWithChecksum(port, sTmp);
  env.Sleep(50);
  port->Write(PilotsName);
  port->Write('\r');

  if (!port->ExpectString("OK\r"))
    return false;

  sprintf(sTmp, "#SUI%02d", 1);           // send type of aircraft
  WriteWithChecksum(port, sTmp);
  env.Sleep(50);
  port->Write(Class);
  port->Write('\r');

  if (!port->ExpectString("OK\r"))
    nDeclErrorCode = 1;

  sprintf(sTmp, "#SUI%02d", 2);           // send aircraft ID
  WriteWithChecksum(port, sTmp);
  env.Sleep(50);
  port->Write(ID);
  port->Write('\r');

  if (!port->ExpectString("OK\r"))
    return false;
  */

  for (int i=0; i<6; i++){                        // clear all 6 TP's
    sprintf(sTmp, "#CTP%02d", i);
    WriteWithChecksum(port, sTmp);
    if (!port->ExpectString("OK\r"))
      return false;
  }
  for (unsigned j = 0; j < decl->size(); ++j)
    if (!AddWayPoint(decl->get_waypoint(j)))
      return false;

  return true;
}