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 ) ); }
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++; }
void CPythonMiniMap::CreateTarget(int iID, const char * c_szName, DWORD dwVID) { AddWayPoint(TYPE_TARGET, iID, 0.0f, 0.0f, c_szName, dwVID); }
/* ウェイポイントを構築。 * @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++; } } }
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; }