Update of /cvsroot/netrek/client/netrekxp/src
In directory sc8-pr-cvs16:/tmp/cvs-serv8621/src
Modified Files:
data.c defaults.c local.c map.c mswindow.c
Log Message:
This patch adds the ability to resize local/map windows on the fly, and
fixes some of the problems that came up while doing this.
Added code to WM_EXITSIZEMOVE case in main windows proc, that
handles changing TWINSIDE/GWINSIDE, reinitializing things that need
it (such as SDB and star array), and changing critical window sizes that
need to be redone (team select windows, quit window - both based on
TWINSIDE).
Netrekrc option mainResizeable now allows local/map to be resized too,
giving these windows a WS_THICKFRAME border.
Variable redrawall and struct stars are now globally defined.
New defines to limit # of star sectors and # of stars in a sector.
Fixed a bunch of places where view was statically defined, as TWINSIDE
can now change during gameplay.
Fixed a few places where rounding errors were occuring due to
parentheses.
Moved initialization of mainResizeable and mainTitleBar into defaults.c
as defaults are now called before windows initialization.
Fixed a few mistakes in the free resources routine for SDB.
Index: mswindow.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/mswindow.c,v
retrieving revision 1.58
retrieving revision 1.59
diff -u -d -r1.58 -r1.59
--- mswindow.c 8 Apr 2007 22:36:41 -0000 1.58
+++ mswindow.c 9 Apr 2007 02:52:31 -0000 1.59
@@ -640,11 +640,13 @@
SelectObject (localSDB->mem_dc, localSDB->old_bmp);
DeleteObject (localSDB->mem_bmp);
ReleaseDC (((Window *)localSDB->window)->hwnd, localSDB->win_dc);
+ DeleteDC (localSDB->mem_dc);
free (localSDB);
SelectObject (mapSDB->mem_dc, mapSDB->old_bmp);
DeleteObject (mapSDB->mem_bmp);
- DeleteDC (mapSDB->win_dc);
+ ReleaseDC (((Window *)mapSDB->window)->hwnd, mapSDB->win_dc);
+ DeleteDC (mapSDB->mem_dc);
free (mapSDB);
//WinKey Kill Library Stop
@@ -1137,8 +1139,6 @@
sprintf (title_buff, "Netrek @ %s", serverName);
}
// WS_THICKFRAME adds resizing frame to window without adding titlebar
- mainResizeable = booleanDefault ("mainResizeable", mainResizeable);
- mainTitleBar = booleanDefault ("mainTitleBar", mainTitleBar);
SpecialStyle |= WS_MINIMIZEBOX | WS_MAXIMIZEBOX | WS_SYSMENU;
if (mainResizeable)
SpecialStyle |= WS_THICKFRAME;
@@ -1166,6 +1166,12 @@
WS_OVERLAPPED | WS_CAPTION | WS_SYSMENU | WS_MINIMIZEBOX;
parentwin = &myroot;
}
+ else if (strncmp (name, "local", 5) == 0 || strncmp (name, "map", 3) == 0)
+ {
+ s = name;
+ if (mainResizeable)
+ SpecialStyle = WS_THICKFRAME;
+ }
else
s = name;
@@ -1960,6 +1966,57 @@
//Disable possibility to move internal windows
GET_STRUCT_PTR;
+ // Adjust TWINSIDE and GWINSIDE
+ // Reinitialize whatever is necessary (so many things are created based on
+ // a fixed TWINSIDE)
+ // Redo critical windows
+ // Clear window
+ if (windowMove && (Window *) w != NULL && win->hwnd == ((Window *) w)->hwnd)
+ {
+ TWINSIDE = MAX(win->ClipRect.bottom, win->ClipRect.right);
+
+ // Have to reinitialize SDB
+ SelectObject (localSDB->mem_dc, localSDB->old_bmp);
+ DeleteObject (localSDB->mem_bmp);
+ ReleaseDC (((Window *)localSDB->window)->hwnd, localSDB->win_dc);
+ DeleteDC (localSDB->mem_dc);
+ free (localSDB);
+ localSDB = W_InitSDB (w);
+ // and stars
+ free (stars);
+ initStars();
+
+ // All windows based on TWINSIDE are out of position now, but the team
+ // select/quit windows are now the wrong size too, so we need to redo them
+ for (i = 0; i < 4; i++)
+ {
+ W_UnmapWindow (teamWin[i]);
+ teamWin[i] = W_MakeWindow (teamshort[1 << i], i * (TWINSIDE / 5), TWINSIDE - (TWINSIDE / 5),
+ (TWINSIDE / 5), (TWINSIDE / 5), w, 1, foreColor);
+ }
+ W_UnmapWindow (qwin);
+ qwin = W_MakeWindow ("quit", 4 * (TWINSIDE / 5), TWINSIDE - (TWINSIDE / 5), (TWINSIDE / 5),
+ (TWINSIDE / 5), w, 1, foreColor);
+
+ W_FastClear = 1;
+ if (viewBox)
+ redrawall = 1;
+ }
+ else if (windowMove && (Window *) mapw != NULL && win->hwnd == ((Window *) mapw)->hwnd)
+ {
+ GWINSIDE = MAX(win->ClipRect.bottom, win->ClipRect.right);
+
+ // Have to reinitialize SDB
+ SelectObject (mapSDB->mem_dc, mapSDB->old_bmp);
+ DeleteObject (mapSDB->mem_bmp);
+ ReleaseDC (((Window *)mapSDB->window)->hwnd, mapSDB->win_dc);
+ DeleteDC (mapSDB->mem_dc);
+ free (mapSDB);
+ mapSDB = W_InitSDB (mapw);
+
+ redrawall = 1;
+ }
+
/* this has to be the same as for WM_ENTERSIZEMOVE */
if (windowMove ||
(win->hwnd == ((Window *) baseWin)->hwnd) ||
Index: local.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/local.c,v
retrieving revision 1.89
retrieving revision 1.90
diff -u -d -r1.89 -r1.90
--- local.c 7 Apr 2007 11:35:27 -0000 1.89
+++ local.c 9 Apr 2007 02:52:31 -0000 1.90
@@ -58,12 +58,6 @@
static int cloak_phases = 0;
#endif
-/* Background Stars Definitions */
-struct _star {
- int s_x, s_y;
- int s_color;
-};
-
static void redrawStarSector(int sectorx, int sectory);
#define scaleLocal(pt) ((pt)/scaleFactor + (TWINSIDE/2))
@@ -73,8 +67,6 @@
/* Max range at which other's torps can be seen, used in scaling sound volume */
#define SOUND_MAXRANGE (int)(sqrt)(INFORANGE * INFORANGE/2)
-static struct _star stars[10][10][16];
-
/* Function Defininitions */
#ifdef SOUND
@@ -130,11 +122,22 @@
initStars()
{
register int i, j, k;
+ int imax, jmax, kmax;
+
+ imax = 5 * STARSIDE / TWINSIDE + 1;
+ if (imax > MAXSECTORS)
+ imax = MAXSECTORS;
+ jmax = 5 * STARSIDE / TWINSIDE + 1;
+ if (jmax > MAXSECTORS)
+ jmax = MAXSECTORS;
+ kmax = 16 * TWINSIDE / STARSIDE * TWINSIDE / STARSIDE;
+ if (kmax > MAXSTARS)
+ kmax = MAXSTARS;
/* Star density: 16 stars per 20000 x 20000 galactic region */
- for (i = 0; i < (5 * STARSIDE / TWINSIDE + 1); i++) {
- for (j = 0; j < (5 * STARSIDE / TWINSIDE + 1); j++) {
- for (k = 0; k < (16 * (TWINSIDE / STARSIDE) * (TWINSIDE / STARSIDE)); k++) {
+ for (i = 0; i < imax; i++) {
+ for (j = 0; j < jmax; j++) {
+ for (k = 0; k < kmax; k++) {
stars[i][j][k].s_x = RANDOM() % 20000 * TWINSIDE / STARSIDE;
stars[i][j][k].s_y = RANDOM() % 20000 * TWINSIDE / STARSIDE;
stars[i][j][k].s_color = randcolor();
@@ -147,8 +150,8 @@
void
DrawStars()
{
- const int fullview = TWINSIDE * SCALE;
- const int view = TWINSIDE * SCALE / 2;
+ int fullview = TWINSIDE * SCALE;
+ int view = TWINSIDE * SCALE / 2;
/*
note: cpp symbols in expressions (TWINSIDE*SCALE) will be precalculated
by any C optimizer
@@ -239,8 +242,8 @@
static void
redrawStarSector (int sectorx, int sectory)
{
- const int fullview = TWINSIDE * SCALE;
- const int view = TWINSIDE * SCALE / 2;
+ int fullview = TWINSIDE * SCALE;
+ int view = TWINSIDE * SCALE / 2;
register int i, dx, dy, dxx, dyy;
register int xbase = sectorx * fullview;
register int ybase = sectory * fullview;
@@ -300,7 +303,7 @@
}
dxx = (int) (Cos[mydir] * streaklength / 10);
dyy = (int) (Sin[mydir] * streaklength / 10);
- for (i = 0, s = star_sector; i < (16 * (TWINSIDE / STARSIDE) * (TWINSIDE / STARSIDE)); i++, s++)
+ for (i = 0, s = star_sector; i < (16 * TWINSIDE / STARSIDE * TWINSIDE / STARSIDE); i++, s++)
{
if (s->s_x + xbase > GWIDTH || s->s_y + ybase > GWIDTH)
continue;
@@ -323,7 +326,7 @@
return;
}
}
- for (i = 0, s = star_sector; i < (16 * (TWINSIDE / STARSIDE) * (TWINSIDE / STARSIDE)); i++, s++)
+ for (i = 0, s = star_sector; i < (16 * TWINSIDE / STARSIDE * TWINSIDE / STARSIDE); i++, s++)
{
if (s->s_x + xbase > GWIDTH || s->s_y + ybase > GWIDTH)
continue;
@@ -523,7 +526,7 @@
{
register int dx, dy;
register struct planet *l;
- const int view = scaleFactor * TWINSIDE / 2 + BMP_PLANET_WIDTH * SCALE / 2;
+ int view = scaleFactor * TWINSIDE / 2 + BMP_PLANET_WIDTH * SCALE / 2;
for (l = planets + MAXPLANETS - 1; l >= planets; --l)
{
@@ -704,7 +707,7 @@
int buflen = 1;
static int ph_col = 0;
static int scaled_ph_col = 0;
- const int view = scaleFactor * TWINSIDE / 2 + BMP_SHIELD_WIDTH * SCALE / 2;
+ int view = scaleFactor * TWINSIDE / 2 + BMP_SHIELD_WIDTH * SCALE / 2;
int dx, dy, px, py, wx, wy, tx, ty, lx, ly;
int new_dx, new_dy;
int startx, starty, endx, endy;
@@ -1919,7 +1922,7 @@
int torpCount;
int torpTeam;
int frame;
- const int view = scaleFactor * TWINSIDE / 2;
+ int view = scaleFactor * TWINSIDE / 2;
for (t = torps, j = players; j != players + MAXPLAYER; t += MAXTORP, ++j)
{
@@ -2157,7 +2160,7 @@
{
register struct plasmatorp *pt;
register int dx, dy;
- const int view = scaleFactor * TWINSIDE / 2;
+ int view = scaleFactor * TWINSIDE / 2;
int ptorpTeam;
int frame;
@@ -2381,11 +2384,11 @@
{
register struct player *j;
register int dx, dy;
- const int view = scaleFactor * TWINSIDE / 2;
+ int view = scaleFactor * TWINSIDE / 2;
#ifdef HOCKEY_LINES
register struct s_line *sl;
- const int HALF_WINSIDE = TWINSIDE / 2;
+ int HALF_WINSIDE = TWINSIDE / 2;
int ex, ey, sx, sy;
#endif
@@ -2459,10 +2462,10 @@
if ( infoRange && TWINSIDE > (INFORANGE * SCALE / scaleFactor)
&& !(me->p_x < 0 || me->p_x > GWIDTH))
{
- const int LEFT = (TWINSIDE / 2) - (INFORANGE / 2) * SCALE / scaleFactor;
- const int RIGHT = (TWINSIDE / 2) + (INFORANGE / 2) * SCALE / scaleFactor;
- const int TOP = (TWINSIDE / 2) - (INFORANGE / 2) * SCALE / scaleFactor;
- const int BOTTOM = (TWINSIDE / 2) + (INFORANGE / 2) * SCALE / scaleFactor;
+ int LEFT = (TWINSIDE / 2) - (INFORANGE / 2) * SCALE / scaleFactor;
+ int RIGHT = (TWINSIDE / 2) + (INFORANGE / 2) * SCALE / scaleFactor;
+ int TOP = (TWINSIDE / 2) - (INFORANGE / 2) * SCALE / scaleFactor;
+ int BOTTOM = (TWINSIDE / 2) + (INFORANGE / 2) * SCALE / scaleFactor;
long dist;
Index: defaults.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/defaults.c,v
retrieving revision 1.71
retrieving revision 1.72
diff -u -d -r1.71 -r1.72
--- defaults.c 7 Apr 2007 05:43:26 -0000 1.71
+++ defaults.c 9 Apr 2007 02:52:31 -0000 1.72
@@ -258,7 +258,7 @@
},
{"mainResizeable", &mainResizeable, RC_BOOL,
{
- "Make main window resizeable",
+ "Make main window + local/map windows resizeable",
NULL
}
},
@@ -1673,6 +1673,8 @@
timerType = T_SHIP;
doubleBuffering = booleanDefault ("doubleBuffering", doubleBuffering);
+ mainResizeable = booleanDefault ("mainResizeable", mainResizeable);
+ mainTitleBar = booleanDefault ("mainTitleBar", mainTitleBar);
allowWheelActions = booleanDefault ("allowWheelActions", allowWheelActions);
richText = booleanDefault ("richText", richText);
newQuit = booleanDefault ("newQuit", newQuit);
Index: data.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/data.c,v
retrieving revision 1.80
retrieving revision 1.81
diff -u -d -r1.80 -r1.81
--- data.c 7 Apr 2007 05:17:38 -0000 1.80
+++ data.c 9 Apr 2007 02:52:31 -0000 1.81
@@ -31,6 +31,7 @@
struct message *messages;
struct mctl *mctl;
struct memory universe;
+struct _star stars[MAXSECTORS][MAXSECTORS][MAXSTARS];
int TWINSIDE = 500; /* Size of tactical window */
int GWINSIDE = 500; /* Size of galactic window */
@@ -97,6 +98,7 @@
time_t rdelay = 0; /* time stamp for refitting */
time_t tdelay = 0; /* time stamp for T mode extension */
int showPlanetNames = 1;
+int redrawall = 1;
int autoQuit = 60;
int showStats = 0;
int showHints = 1;
Index: map.c
===================================================================
RCS file: /cvsroot/netrek/client/netrekxp/src/map.c,v
retrieving revision 1.46
retrieving revision 1.47
diff -u -d -r1.46 -r1.47
--- map.c 8 Apr 2007 22:36:41 -0000 1.46
+++ map.c 9 Apr 2007 02:52:31 -0000 1.47
@@ -69,13 +69,10 @@
/*
* Global Variables:
*
- * redrawall -- Erase and redraw the galactic? Must be true
- * on first map() call.
* redrawPlayer[] -- Flag for each player on whether their position
* on the galactic is not out of date.
*/
-int redrawall = 1;
unsigned char redrawPlayer[MAXPLAYER];