1758 :(GLfloat)
x :(GLfloat)
y :(GLfloat)z :(GLfloat) alpha :(BOOL)compact
1759{
1760 PlayerEntity* player =
PLAYER;
1761
1762 if (!player)
1763 return;
1764
1765 OOSystemDescriptionManager *systemManager = [UNIVERSE systemManager];
1766
1771 NSPoint info_system_coordinates = [[UNIVERSE systemManager] getCoordinatesForSystem: [player
infoSystemID] inGalaxy: [player
galaxyNumber]];
1774 GLfloat r = 1.0, g = 1.0, b = 1.0;
1775 BOOL noNova;
1776 NSPoint cu;
1777 NSUInteger systemParameter;
1778
1779 double fuel = 35.0 * [player
dialFuel];
1780
1781 double hcenter = size_in_pixels.width/2.0;
1785 double hoffset = hcenter - chart_centre_coordinates.
x*hscale;
1786 double voffset = size_in_pixels.height - vcenter - chart_centre_coordinates.
y*vscale;
1787
1788 if (compact)
1789 {
1790 hscale = size_in_pixels.width / 256.0;
1791 vscale = -1.0 * size_in_pixels.height / 512.0;
1792 hoffset = 0.0f;
1793 voffset = size_in_pixels.height - pixel_title_size.height - 5;
1795 chart_centre_coordinates.x = 128.0;
1796 chart_centre_coordinates.y = 128.0;
1798 }
1799
1800 int i;
1801 double d, distance = 0.0, time = 0.0;
1802 int jumps = 0;
1803 NSPoint star;
1805 NSRect clipRect;
1806
1808 BOOL routeExists = NO;
1809
1810 NSInteger concealment[256];
1811 for (i=0;i<256;i++) {
1812 NSDictionary *systemInfo = [systemManager getPropertiesForSystem:i inGalaxy:galaxy_id];
1813 concealment[i] = [systemInfo oo_intForKey:@"concealment" defaultValue:OO_SYSTEMCONCEALMENT_NONE];
1814 }
1815
1816 BOOL *systemsFound = [UNIVERSE systemsFound];
1817 NSSize viewSize = [[UNIVERSE gameView] backingViewSize];
1818 double aspect_ratio = viewSize.width / viewSize.height;
1819
1820
1821 GLfloat govcol[] = { 0.5, 0.0, 0.7,
1822 0.7, 0.5, 0.3,
1823 0.0, 1.0, 0.3,
1824 1.0, 0.8, 0.1,
1825 1.0, 0.0, 0.0,
1826 0.1, 0.5, 1.0,
1827 0.7, 0.7, 0.7,
1828 0.7, 1.0, 1.0};
1829
1830 if (aspect_ratio > 4.0/3.0)
1831 {
1832 pixelRatio = viewSize.height / 480.0;
1833 }
1834 else
1835 {
1836 pixelRatio = viewSize.width / 640.0;
1837 }
1838
1840
1841 clipRect = NSMakeRect((viewSize.width - size_in_pixels.width*pixelRatio)/2.0,
1842 (viewSize.height + size_in_pixels.height*pixelRatio)/2.0 - (pixel_title_size.height + 15 + (textRow-2)*
MAIN_GUI_ROW_HEIGHT) * pixelRatio,
1843 size_in_pixels.width * pixelRatio,
1845
1847 double dx, dy;
1848
1849
1851
1852
1853 cu = NSMakePoint((float)(hscale*galaxy_coordinates.x+hoffset),(float)(vscale*galaxy_coordinates.y+voffset));
1854
1855
1856 OOGL(glEnable(GL_SCISSOR_TEST));
1857 OOGL(glScissor(clipRect.origin.x, clipRect.origin.y, clipRect.size.width, clipRect.size.height));
1858
1859
1860
1861
1863 static struct saved_system
1864 {
1866 int tec, eco, gov;
1867 NSString* p_name;
1868 BOOL nova;
1869 } nearby_systems[ 256 ];
1870 static int num_nearby_systems = 0;
1871
1873 {
1874
1876 for (i = 0; i < num_nearby_systems; i++)
1877 [nearby_systems[ i ].p_name release];
1878
1879 num_nearby_systems = 0;
1880 for (i = 0; i < 256; i++)
1881 {
1882
1883 NSDictionary* sys_info = [UNIVERSE generateSystemData:i];
1884 if (
EXPECT_NOT([sys_info oo_boolForKey:
@"sun_gone_nova"]))
1885 {
1886 nearby_systems[ num_nearby_systems ].gov = -1;
1887 }
1888 else
1889 {
1890 nearby_systems[ num_nearby_systems ].tec = [sys_info oo_intForKey:KEY_TECHLEVEL];
1891 nearby_systems[ num_nearby_systems ].eco = [sys_info oo_intForKey:KEY_ECONOMY];
1892 nearby_systems[ num_nearby_systems ].gov = [sys_info oo_intForKey:KEY_GOVERNMENT];
1893 }
1894 nearby_systems[ num_nearby_systems ].sysid = i;
1895 nearby_systems[ num_nearby_systems ].p_name = [[sys_info oo_stringForKey:KEY_NAME] retain];
1896 nearby_systems[ num_nearby_systems ].nova = [[UNIVERSE generateSystemData:i] oo_boolForKey:@"sun_gone_nova"];
1897 num_nearby_systems++;
1898 }
1900 }
1901
1905 static NSDictionary *routeInfo =
nil;
1906
1907
1911 {
1913 }
1917 {
1919 }
1920
1921 if (advancedNavArrayMode !=
OPTIMIZED_BY_NONE && [player hasEquipmentItemProviding:
@"EQ_ADVANCED_NAVIGATIONAL_ARRAY"])
1922 {
1924 OOSystemID destNumber = [PLAYER targetSystemID];
1925 if (routeInfo ==
nil || planetNumber != savedPlanetNumber || destNumber != savedDestNumber || advancedNavArrayMode != savedArrayMode)
1926 {
1927 [routeInfo release];
1928 routeInfo = [[UNIVERSE routeFromSystem:planetNumber toSystem:destNumber optimizedBy:advancedNavArrayMode] retain];
1929 savedPlanetNumber = planetNumber;
1930 savedDestNumber = destNumber;
1931 savedArrayMode = advancedNavArrayMode;
1932 }
1933 target = destNumber;
1934
1935
1936
1937
1938
1939 if (routeInfo) routeExists = YES;
1940
1941 [self drawAdvancedNavArrayAtX:x+hoffset y:y+voffset z:z alpha:alpha usingRoute: (planetNumber != destNumber ? (id)routeInfo : nil) optimizedBy:advancedNavArrayMode zoom: zoom];
1942
1943 if (routeExists)
1944 {
1945 distance = [routeInfo oo_doubleForKey:@"distance"];
1946 time = [routeInfo oo_doubleForKey:@"time"];
1947 jumps = [routeInfo oo_intForKey:@"jumps"];
1948
1949 if (distance == 0.0 && planetNumber != destNumber)
1950 {
1951
1952 distance = 0.1;
1953 time = 0.01;
1954 }
1955 }
1956 }
1957 else
1958 {
1959 [self drawAdvancedNavArrayAtX:x+hoffset y:y+voffset z:z alpha:alpha usingRoute:nil optimizedBy:OPTIMIZED_BY_NONE zoom: zoom];
1960 }
1961 if (!routeExists)
1962 {
1963 NSPoint targetCoordinates = [systemManager getCoordinatesForSystem:target inGalaxy:galaxy_id];
1964
1966 if (distance == 0.0)
1967 {
1968 if (target != [
PLAYER systemID])
1969 {
1970
1971
1972 distance = 0.1;
1973 }
1974 }
1975 if ([player hasHyperspaceMotor] && distance <= [player fuel]/10.0)
1976 {
1977 time = distance * distance;
1978 }
1979 else
1980 {
1981 time = 0.0;
1982 }
1983 }
1984
1985 if ([player hasHyperspaceMotor])
1986 {
1987
1989 [
self setGLColorFromSetting:kGuiChartRangeColor defaultValue:[
OOColor greenColor] alpha:alpha];
1990
1991 GLDrawOval(
x + cu.x,
y + cu.y, z, NSMakeSize((
float)(fuel*hscale), 2*(
float)(fuel*vscale)), 5);
1992 }
1993
1994
1995
1996
1997 [
self setGLColorFromSetting:kGuiChartCrosshairColor defaultValue:[
OOColor greenColor] alpha:alpha];
1998
1999 [self drawCrossHairsWithSize:12/zoom+2 x:x + cu.x y:y + cu.y z:z];
2000
2001
2002
2003
2004 [
self setGLColorFromSetting:kGuiChartCursorColor defaultValue:[
OOColor redColor] alpha:alpha];
2005 cu = NSMakePoint((float)(hscale*cursor_coordinates.x+hoffset),(float)(vscale*cursor_coordinates.y+voffset));
2006 [self drawCrossHairsWithSize:7/zoom+2 x:x + cu.x y:y + cu.y z:z];
2007
2008
2009
2011 OOGL(glColor4f(1.0f, 1.0f, 0.75f, alpha));
2012
2013 for (i = 0; i < num_nearby_systems; i++)
2014 {
2015 NSPoint sys_coordinates = [systemManager getCoordinatesForSystem:i inGalaxy:galaxy_id];
2016
2017 dx = fabs(chart_centre_coordinates.x - sys_coordinates.x);
2018 dy = fabs(chart_centre_coordinates.y - sys_coordinates.y);
2019
2021 continue;
2022
2023
2025
2026 continue;
2027 }
2028
2029 NSDictionary *systemInfo = [systemManager getPropertiesForSystem:i inGalaxy:galaxy_id];
2030 float blob_factor = [guiUserSettings oo_floatForKey:kGuiChartCircleScale defaultValue:0.0017];
2031 float blob_size = (1.0f + blob_factor * [systemInfo oo_floatForKey:@"radius"])/zoom;
2032 if (blob_size < 0.5) blob_size = 0.5;
2033
2034 star.x = (float)(sys_coordinates.x * hscale + hoffset);
2035 star.y = (float)(sys_coordinates.y * vscale + voffset);
2036
2037 noNova = !nearby_systems[i].nova;
2038 NSAssert1(chart_mode <= OOLRC_MODE_TECHLEVEL, @"Long range chart mode %i out of range", (int)chart_mode);
2039
2040 NSArray *markers = [markedDestinations objectForKey:[NSNumber numberWithInt:i]];
2042 {
2043 GLfloat base_size = 0.5f * blob_size + 2.5f;
2044 [self drawSystemMarkers:markers atX:x+star.x andY:y+star.y andZ:z withAlpha:alpha andScale:base_size];
2045 }
2046
2048
2049 r = g = b = 0.7;
2050 OOGL(glColor4f(r, g, b, alpha));
2051 } else {
2052 switch (chart_mode)
2053 {
2054 case OOLRC_MODE_ECONOMY:
2056 {
2057 systemParameter = nearby_systems[i].eco;
2058 GLfloat ce1 = 1.0f - 0.125f * systemParameter;
2059 [self setGLColorFromSetting:[NSString stringWithFormat:kGuiChartEconomyUColor, (unsigned long)systemParameter]
2061 alpha:1.0];
2062 }
2063 else
2064 {
2065 r = g = b = 0.3;
2066 OOGL(glColor4f(r, g, b, alpha));
2067 }
2068 break;
2069 case OOLRC_MODE_GOVERNMENT:
2071 {
2072 systemParameter = nearby_systems[i].gov;
2073 [self setGLColorFromSetting:[NSString stringWithFormat:kGuiChartGovernmentUColor, (unsigned long)systemParameter]
2075 alpha:1.0];
2076 }
2077 else
2078 {
2079 r = g = b = 0.3;
2080 OOGL(glColor4f(r, g, b, alpha));
2081 }
2082 break;
2083 case OOLRC_MODE_TECHLEVEL:
2085 {
2086 systemParameter = nearby_systems[i].tec;
2087 r = 0.6;
2088 g = b = 0.20 + (0.05 * (GLfloat)systemParameter);
2089 }
2090 else
2091 {
2092 r = g = b = 0.3;
2093 }
2094 OOGL(glColor4f(r, g, b, alpha));
2095 break;
2096 case OOLRC_MODE_UNKNOWN:
2097 case OOLRC_MODE_SUNCOLOR:
2099 {
2100 r = g = b = 1.0;
2101 OOColor *sunColor = [
OOColor colorWithDescription:[[UNIVERSE systemManager] getProperty:@"sun_color" forSystem:i inGalaxy:galaxy_id]];
2102 if (sunColor !=
nil) {
2104 alpha = 1.0;
2105 }
2106 }
2107 else
2108 {
2109 r = 1.0;
2110 g = 0.2;
2111 b = 0.0;
2112 }
2113 OOGL(glColor4f(r, g, b, alpha));
2114 break;
2115 }
2116 }
2117
2119 }
2120
2121
2122
2123 GLfloat systemNameScale = [guiUserSettings oo_floatForKey:kGuiChartLabelScale defaultValue:1.0];
2124
2126 [
self setGLColorFromSetting:kGuiChartMatchBoxColor defaultValue:[
OOColor greenColor] alpha:alpha];
2127
2128 int n_matches = 0, foundIndex = -1;
2129
2130 for (i = 0; i < 256; i++) if (systemsFound[i])
2131 {
2132 if(foundSystem == n_matches) foundIndex = i;
2133 n_matches++;
2134 }
2135
2136 if (n_matches == 0)
2137 {
2138 foundSystem = 0;
2139 }
2141 {
2142
2143 }
2144 else
2145 {
2146 for (i = 0; i < 256; i++)
2147 {
2149 {
2150 continue;
2151 }
2152
2153 BOOL mark = systemsFound[i];
2154 float marker_size = 8.0/zoom;
2155 NSPoint sys_coordinates = [systemManager getCoordinatesForSystem:i inGalaxy:galaxy_id];
2156
2157 dx = fabs(chart_centre_coordinates.x - sys_coordinates.x);
2158 dy = fabs(chart_centre_coordinates.y - sys_coordinates.y);
2159
2161 {
2162 star.x = (float)(sys_coordinates.x * hscale + hoffset);
2163 star.y = (float)(sys_coordinates.y * vscale + voffset);
2165 glVertex3f(
x + star.x - marker_size,
y + star.y - marker_size, z);
2166 glVertex3f(
x + star.x + marker_size,
y + star.y - marker_size, z);
2167 glVertex3f(
x + star.x + marker_size,
y + star.y + marker_size, z);
2168 glVertex3f(
x + star.x - marker_size,
y + star.y + marker_size, z);
2170 if (i == foundIndex || n_matches == 1)
2171 {
2172 if (n_matches == 1) foundSystem = 0;
2174 {
2175 [
self setGLColorFromSetting:kGuiChartMatchLabelColor defaultValue:[
OOColor cyanColor] alpha:alpha];
2176 OODrawString([
UNIVERSE systemNameIndex:i] ,
x + star.x + 2.0,
y + star.y - 10.0f, z, NSMakeSize(10*systemNameScale,10*systemNameScale));
2177 [
self setGLColorFromSetting:kGuiChartMatchBoxColor defaultValue:[
OOColor greenColor] alpha:alpha];
2178 }
2179 }
2181 {
2182 OODrawString([
UNIVERSE systemNameIndex:i] ,
x + star.x + 2.0,
y + star.y - 10.0f, z, NSMakeSize(10*systemNameScale,10*systemNameScale));
2183 }
2184 }
2185 }
2186 }
2187
2188
2189
2190
2191
2192 int targetIdx = -1;
2193 struct saved_system *sys;
2194 NSSize chSize = NSMakeSize(pixel_row_height*systemNameScale/zoom,pixel_row_height*systemNameScale/zoom);
2195
2197 for (i = 0; i < num_nearby_systems; i++)
2198 {
2200 {
2201 continue;
2202 }
2203
2204 sys = nearby_systems + i;
2205 NSPoint sys_coordinates = [systemManager getCoordinatesForSystem:sys->sysid inGalaxy:galaxy_id];
2206
2207 dx = fabs(chart_centre_coordinates.x - sys_coordinates.x);
2208 dy = fabs(chart_centre_coordinates.y - sys_coordinates.y);
2209
2211 continue;
2212 star.x = (float)(sys_coordinates.x * hscale + hoffset);
2213 star.y = (float)(sys_coordinates.y * vscale + voffset);
2214 if (sys->sysid == target)
2215 {
2216 targetIdx = i;
2217 }
2218
2219
2220
2222 {
2223 if (![player showInfoFlag])
2224 {
2225
2227 if (d <= jumpRange)
2228 {
2229 [
self setGLColorFromSetting:kGuiChartLabelReachableColor defaultValue:[
OOColor yellowColor] alpha:alpha];
2230 }
2231 else
2232 {
2233 [
self setGLColorFromSetting:kGuiChartLabelColor defaultValue:[
OOColor yellowColor] alpha:alpha];
2234
2235 }
2236
2237 OODrawString(sys->p_name,
x + star.x + 2.0,
y + star.y, z, chSize);
2238 }
2239 else if (
EXPECT(sys->gov >= 0))
2240 {
2242 {
2243 [
self setGLColorFromSetting:kGuiChartLabelColor defaultValue:[
OOColor yellowColor] alpha:alpha];
2245 }
2246 else
2247 {
2248 OODrawPlanetInfo(sys->gov, sys->eco, sys->tec,
x + star.x + 2.0,
y + star.y + 2.0, z, chSize);
2249 }
2250 }
2251 }
2252 }
2253
2254
2255
2257 {
2259 {
2260 sys = nearby_systems + targetIdx;
2261 NSPoint sys_coordinates = [systemManager getCoordinatesForSystem:sys->sysid inGalaxy:galaxy_id];
2262
2263 star.x = (float)(sys_coordinates.x * hscale + hoffset);
2264 star.y = (float)(sys_coordinates.y * vscale + voffset);
2265
2266 if (![player showInfoFlag])
2267 {
2269 if (d <= jumpRange)
2270 {
2271 [
self setGLColorFromSetting:kGuiChartLabelReachableColor defaultValue:[
OOColor yellowColor] alpha:alpha];
2272 }
2273 else
2274 {
2275 [
self setGLColorFromSetting:kGuiChartLabelColor defaultValue:[
OOColor yellowColor] alpha:alpha];
2276
2277 }
2278
2280 }
2281 else if (sys->gov >= 0)
2282 {
2284 {
2285 [
self setGLColorFromSetting:kGuiChartLabelColor defaultValue:[
OOColor yellowColor] alpha:alpha];
2287 }
2288 else
2289 {
2291 }
2292 }
2293 }
2294 }
2295
2297 tab_stops[0] = 0;
2298 tab_stops[1] = 96;
2299 tab_stops[2] = 288;
2300 [self overrideTabs:tab_stops from:kGuiChartTraveltimeTabs length:3];
2301 [self setTabStops:tab_stops];
2302 NSString *targetName = [[UNIVERSE getSystemName:target] retain];
2303
2304
2305 NSString *travelDistLine = @"";
2306 if (distance > 0)
2307 {
2308 travelDistLine =
OOExpandKey(
@"long-range-chart-distance", distance);
2309 }
2310 NSString *travelTimeLine = @"";
2311 if (time > 0)
2312 {
2313 travelTimeLine =
OOExpandKey(
@"long-range-chart-est-travel-time", time);
2314 }
2315
2317 {
2318 [self setArray:[NSArray arrayWithObjects:targetName, travelDistLine,travelTimeLine,nil] forRow:textRow];
2319 }
2320 else
2321 {
2322 [self setArray:[NSArray arrayWithObjects:@"", travelDistLine,travelTimeLine,nil] forRow:textRow];
2323 }
2324 if ([
PLAYER guiScreen] == GUI_SCREEN_SHORT_RANGE_CHART)
2325 {
2326 if (jumps > 0)
2327 {
2328 [self setArray:[NSArray arrayWithObjects: @"", OOExpandKey(@"short-range-chart-jumps", jumps), nil] forRow: textRow + 1];
2329 }
2330 else
2331 {
2332 [self setArray:[NSArray array] forRow: textRow + 1];
2333 }
2334 }
2335 [targetName release];
2336
2337
2339 [
self setGLColorFromSetting: kGuiChartInfoMarkerColor defaultValue:[
OOColor blueColor] alpha:alpha];
2340 cu = NSMakePoint((float)(hscale*info_system_coordinates.x+hoffset),(float)(vscale*info_system_coordinates.y+voffset));
2341 GLDrawOval(
x + cu.x,
y + cu.y, z, NSMakeSize(6.0f/zoom+2.0f, 6.0f/zoom+2.0f), 5);
2342
2343
2344 OOGL(glDisable(GL_SCISSOR_TEST));
2345
2346
2349 glVertex3f(
x + 0, (
float)(
y + size_in_pixels.height - (textRow-1)*
MAIN_GUI_ROW_HEIGHT - pixel_title_size.height), z);
2350 glVertex3f(
x + size_in_pixels.width, (GLfloat)(
y + size_in_pixels.height - (textRow-1)*
MAIN_GUI_ROW_HEIGHT - pixel_title_size.height), z);
2351 glVertex3f(
x + size_in_pixels.width, (GLfloat)(
y + size_in_pixels.height - (textRow-1)*
MAIN_GUI_ROW_HEIGHT - pixel_title_size.height - 2), z);
2352 glVertex3f(
x + 0, (GLfloat)(
y + size_in_pixels.height - (textRow-1)*
MAIN_GUI_ROW_HEIGHT - pixel_title_size.height - 2), z);
2354}
@ GUI_BACKGROUND_SPECIAL_CUSTOM_ANA_QUICKEST
@ GUI_BACKGROUND_SPECIAL_SHORT_ANA_SHORTEST
@ GUI_BACKGROUND_SPECIAL_LONG
@ GUI_BACKGROUND_SPECIAL_LONG_ANA_SHORTEST
@ GUI_BACKGROUND_SPECIAL_SHORT_ANA_QUICKEST
@ GUI_BACKGROUND_SPECIAL_LONG_ANA_QUICKEST
@ GUI_BACKGROUND_SPECIAL_CUSTOM_ANA_SHORTEST
OOGUITabStop OOGUITabSettings[GUI_MAX_COLUMNS]
#define MAIN_GUI_ROW_HEIGHT
static BOOL _refreshStarChart
void OODrawHilightedString(NSString *text, GLfloat x, GLfloat y, GLfloat z, NSSize siz)
void OODrawHilightedPlanetInfo(int gov, int eco, int tec, GLfloat x, GLfloat y, GLfloat z, NSSize siz)
void OODrawPlanetInfo(int gov, int eco, int tec, GLfloat x, GLfloat y, GLfloat z, NSSize siz)
void GLDrawFilledOval(GLfloat x, GLfloat y, GLfloat z, NSSize siz, GLfloat step)
void GLScaledLineWidth(GLfloat width)
void GLDrawOval(GLfloat x, GLfloat y, GLfloat z, NSSize siz, GLfloat step)
#define OOExpandKey(key,...)
@ OO_SYSTEMCONCEALMENT_NODATA
#define CHART_SCREEN_VERTICAL_CENTRE
#define CHART_SCREEN_VERTICAL_CENTRE_COMPACT
@ GUI_ROW_CHART_SYSTEM_COMPACT
#define CHART_CLIP_BORDER
OOColor * colorWithRed:green:blue:alpha:(float red,[green] float green,[blue] float blue,[alpha] float alpha)
OOLongRangeChartMode longRangeChartMode
OOGalaxyID galaxyNumber()
NSPoint galaxy_coordinates
NSPoint cursor_coordinates
OOSystemID infoSystemID()
NSPoint adjusted_chart_centre()
NSDictionary * markedDestinations()