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