Index: client/gui-win32/graphics.c
===================================================================
--- client/gui-win32/graphics.c	(revision 12438)
+++ client/gui-win32/graphics.c	(working copy)
@@ -56,8 +56,6 @@
 
 extern HINSTANCE freecivhinst;
 
-HCURSOR cursors[CURSOR_LAST * NUM_CURSOR_FRAMES];
-
 struct sprite *intro_gfx_sprite = NULL;
 struct sprite *radar_gfx_sprite = NULL;
 
@@ -86,87 +84,6 @@
   radar_gfx_sprite = load_gfxfile(tileset_mini_intro_filename(tileset));
 }
 
-/**************************************************************************
-  Load the cursors (mouse substitute sprites), including a goto cursor,
-  an airdrop cursor, a nuke cursor, and a patrol cursor.
-**************************************************************************/
-void
-load_cursors(void)
-{
-  enum cursor_type cursor;
-  ICONINFO ii;
-  int frame, i;
-
-  /* For some reason win32 lets you enter a cursor size, which
-   * only works as long as it's this size. */
-  int width = GetSystemMetrics(SM_CXCURSOR);
-  int height = GetSystemMetrics(SM_CYCURSOR);
-
-  BITMAP *xor_bmp, *and_bmp;
-
-  xor_bmp = bmp_new(width, height);
-  and_bmp = bmp_new(width, height);
-
-  ii.fIcon = FALSE;
-
-  for (cursor = 0; cursor < CURSOR_LAST; cursor++) {
-    int hot_x, hot_y;
-    int x, y;
-    int minwidth, minheight;
-
-    for (frame = 0; frame < NUM_CURSOR_FRAMES; frame++) {
-
-    struct sprite *sprite = get_cursor_sprite(tileset, cursor, 
-		                              &hot_x, &hot_y, frame);
-
-    ii.xHotspot = MIN(hot_x, width);
-    ii.yHotspot = MIN(hot_y, height);
-
-    memset(xor_bmp->bmBits, 0,   width * height * 4);
-    memset(and_bmp->bmBits, 255, width * height * 4);
-
-    minwidth  = MIN(width,  sprite->img->bmWidth);
-    minheight = MIN(height, sprite->img->bmHeight);
-
-    for (y = 0; y < minheight; y++) {
-      BYTE *src = (BYTE *)sprite->img->bmBits + sprite->img->bmWidthBytes * y;
-      BYTE *xor_dst = (BYTE *)xor_bmp->bmBits + xor_bmp->bmWidthBytes * y;
-      BYTE *and_dst = (BYTE *)and_bmp->bmBits + and_bmp->bmWidthBytes * y;
-      for (x = 0; x < minwidth; x++) {
-	if (src[3] > 128) {
-	  *xor_dst++ = src[0];
-	  *xor_dst++ = src[1];
-	  *xor_dst++ = src[2];
-	  *xor_dst++ = 255;
-	  *and_dst++ = 0;
-	  *and_dst++ = 0;
-	  *and_dst++ = 0;
-	  *and_dst++ = 0;
-	} else {
-	  and_dst += 4;
-	  xor_dst += 4;
-	}
-	src += 4;
-      }
-    }
-
-    ii.hbmMask = BITMAP2HBITMAP(and_bmp);
-    ii.hbmColor = BITMAP2HBITMAP(xor_bmp);
-
-    i = cursor * NUM_CURSOR_FRAMES + frame;
-
-    cursors[i] = CreateIconIndirect(&ii);
-
-    DeleteObject(ii.hbmMask);
-    DeleteObject(ii.hbmColor);
-
-    }
-  }
-
-  bmp_free(xor_bmp);
-  bmp_free(and_bmp);
-}
-
 /****************************************************************************
   Frees the introductory sprites.
 ****************************************************************************/
Index: client/gui-win32/gui_main.c
===================================================================
--- client/gui-win32/gui_main.c	(revision 12438)
+++ client/gui-win32/gui_main.c	(working copy)
@@ -56,6 +56,8 @@
 #include <stdio.h>
 
 #include "gui_main.h"
+#include "gui_mouse.h"
+/*anim_cursor()*/
 
 const char *client_string = "gui-win32";
 
@@ -711,8 +713,6 @@
   return TRUE;
 }
 
-extern void anim_cursor(float time);
-
 /**************************************************************************
 
 **************************************************************************/
Index: client/gui-win32/gui_mouse.c
===================================================================
--- client/gui-win32/gui_mouse.c	(revision 0)
+++ client/gui-win32/gui_mouse.c	(revision 0)
@@ -0,0 +1,144 @@
+#ifdef HAVE_CONFIG_H
+#include "config.h"
+#endif
+
+#include <string.h>
+/*memset()*/
+#include "windows.h"
+
+#include "shared.h"
+/*MIN*/
+
+#include "tilespec.h"
+/*enum cursor_type
+ * NUM_CURSOR_FRAMES
+ * get_cursor_sprite() */
+
+#include "graphics.h"
+/*bmp_new()
+ load_cursors() declaration (via graphics_g.h)*/
+#include "gui_mouse.h"
+/*anim_cursor() declaration*/
+#include "mapview.h"
+/*update_mouse_cursor() declaration (via mapview_g.h)*/
+#include "sprite.h"
+/*struct sprite*/
+
+/*The cursors are initialized by load_cursors*/
+static HCURSOR anim_cursors[CURSOR_LAST][NUM_CURSOR_FRAMES];
+static HCURSOR default_cursor;
+
+/*This must be updated every time the cursor type is changed*/
+static enum cursor_type current_cursor_type ;
+
+/**************************************************************************
+  Load the cursors (mouse substitute sprites), including a goto cursor,
+  an airdrop cursor, a nuke cursor, and a patrol cursor.
+  In most of the other clients, this is done in graphics.c
+  However, putting it here keeps the cursors array scoped to this file.
+**************************************************************************/
+void load_cursors(void)
+{
+  ICONINFO ii;
+  unsigned int cursor, frame;
+
+  /* For some reason win32 lets you enter a cursor size, which
+   * only works as long as it's this size. */
+  int width = GetSystemMetrics(SM_CXCURSOR);
+  int height = GetSystemMetrics(SM_CYCURSOR);
+
+  BITMAP *xor_bmp, *and_bmp;
+
+  xor_bmp = bmp_new(width, height);
+  and_bmp = bmp_new(width, height);
+
+  ii.fIcon = FALSE;
+
+  /*first the default cursor*/
+  default_cursor = LoadCursor( NULL , IDC_ARROW );
+
+  /*now the rest*/
+  for (cursor = 0; cursor < CURSOR_LAST; cursor++) {
+    int hot_x, hot_y;
+    int x, y;
+    int minwidth, minheight;
+
+    for (frame = 0; frame < NUM_CURSOR_FRAMES; frame++) {
+
+    struct sprite *sprite = get_cursor_sprite(tileset, cursor, 
+		                              &hot_x, &hot_y, frame);
+
+    ii.xHotspot = MIN(hot_x, width);
+    ii.yHotspot = MIN(hot_y, height);
+
+    memset(xor_bmp->bmBits, 0,   width * height * 4);
+    memset(and_bmp->bmBits, 255, width * height * 4);
+
+    minwidth  = MIN(width,  sprite->img->bmWidth);
+    minheight = MIN(height, sprite->img->bmHeight);
+
+    for (y = 0; y < minheight; y++) {
+      BYTE *src = (BYTE *)sprite->img->bmBits + sprite->img->bmWidthBytes * y;
+      BYTE *xor_dst = (BYTE *)xor_bmp->bmBits + xor_bmp->bmWidthBytes * y;
+      BYTE *and_dst = (BYTE *)and_bmp->bmBits + and_bmp->bmWidthBytes * y;
+      for (x = 0; x < minwidth; x++) {
+	if (src[3] > 128) {
+	  *xor_dst++ = src[0];
+	  *xor_dst++ = src[1];
+	  *xor_dst++ = src[2];
+	  *xor_dst++ = 255;
+	  *and_dst++ = 0;
+	  *and_dst++ = 0;
+	  *and_dst++ = 0;
+	  *and_dst++ = 0;
+	} else {
+	  and_dst += 4;
+	  xor_dst += 4;
+	}
+	src += 4;
+      }
+    }
+
+    ii.hbmMask = BITMAP2HBITMAP(and_bmp);
+    ii.hbmColor = BITMAP2HBITMAP(xor_bmp);
+
+    anim_cursors[cursor][frame] = CreateIconIndirect(&ii);
+
+    DeleteObject(ii.hbmMask);
+    DeleteObject(ii.hbmColor);
+
+    }
+  }
+
+  bmp_free(xor_bmp);
+  bmp_free(and_bmp);
+}
+
+/**************************************************************************
+  This function is used to animate the mouse cursor.
+  It is not part of the generic GUI template
+**************************************************************************/
+void anim_cursor(float time)
+{
+  if (current_cursor_type != CURSOR_DEFAULT) {
+    /*animate except default cursor*/
+    unsigned int frame = (unsigned int)(time * 15.0f) % NUM_CURSOR_FRAMES; 
+    SetCursor( anim_cursors[ current_cursor_type ][ frame ] );
+  }
+
+}
+
+/**************************************************************************
+ * In most of the other clients, the function is in mapview.c.
+ * Putting it here keeps the cursors array local to this file.
+ * ***********************************************************************/
+void update_mouse_cursor(enum cursor_type new_cursor_type)
+{
+  if ( new_cursor_type == CURSOR_DEFAULT ) {
+	  SetCursor(default_cursor);
+  } else {
+	  SetCursor(anim_cursors[new_cursor_type][0]);
+  }
+
+  current_cursor_type = new_cursor_type;
+}
Index: client/gui-win32/gui_mouse.h
===================================================================
--- client/gui-win32/gui_mouse.h	(revision 0)
+++ client/gui-win32/gui_mouse.h	(revision 0)
@@ -0,0 +1,7 @@
+#ifndef FC__GUI_MOUSE_H
+#define FC__GUI_MOUSE_H
+
+void anim_cursor( float );
+
+#endif /*ifdef FC__GUI_MOUSE_H*/
+
Index: client/gui-win32/happiness.c
===================================================================
--- client/gui-win32/happiness.c	(revision 12438)
+++ client/gui-win32/happiness.c	(working copy)
@@ -177,7 +177,7 @@
   struct player *pplayer = pcity->owner;
   int cities = city_list_size(pplayer->cities);
   int content = get_player_bonus(pcity->owner, EFT_CITY_UNHAPPY_SIZE);
-  int basis = get_player_bonus(game.player_ptr, EFT_EMPIRE_SIZE_MOD);
+  int basis = get_player_bonus(game.player_ptr, EFT_EMPIRE_SIZE_BASE);
   int step = get_player_bonus(game.player_ptr, EFT_EMPIRE_SIZE_STEP);
   int excess = cities - basis;
   int penalty = 0;
@@ -240,7 +240,6 @@
   char buf[512], *bptr = buf;
   int nleft = sizeof(buf);
   struct city *pcity = pdialog->pcity;
-  struct government *g = get_gov_pcity(pcity);
   int mlmax = get_city_bonus(pcity, EFT_MARTIAL_LAW_MAX);
   int uhcfac = get_player_bonus(city_owner(pcity), EFT_UNHAPPY_FACTOR);
 
Index: client/gui-win32/helpdlg.c
===================================================================
--- client/gui-win32/helpdlg.c	(revision 12438)
+++ client/gui-win32/helpdlg.c	(working copy)
@@ -655,7 +655,7 @@
   
   /* Give tile a background color, based on the type of unit
    * FIXME: make a new set of colors for this.               */
-  switch (utype->move_type) {
+  switch ( get_unit_move_type(utype) ) {
   case LAND_MOVING: bg_color = COLOR_OVERVIEW_LAND;       break;
   case SEA_MOVING:  bg_color = COLOR_OVERVIEW_OCEAN;      break;
   case HELI_MOVING: bg_color = COLOR_OVERVIEW_MY_UNIT;    break;
Index: client/gui-win32/Makefile.am
===================================================================
--- client/gui-win32/Makefile.am	(revision 12438)
+++ client/gui-win32/Makefile.am	(working copy)
@@ -33,6 +33,8 @@
 	graphics.h	\
 	gui_main.c	\
 	gui_main.h	\
+	gui_mouse.c	\
+	gui_mouse.h	\
 	gui_stuff.h	\
 	gui_stuff.c	\
 	happiness.c	\
Index: client/gui-win32/mapctrl.c
===================================================================
--- client/gui-win32/mapctrl.c	(revision 12438)
+++ client/gui-win32/mapctrl.c	(working copy)
@@ -52,8 +52,6 @@
 #include "mapctrl.h"
 #include "gui_main.h"
 
-extern HCURSOR cursors[];
-
 HWND popit_popup=NULL;
 static bool popit_is_orders;
 /*************************************************************************
@@ -230,17 +228,17 @@
       SetCursor (LoadCursor(NULL, IDC_ARROW));
       break;
     case HOVER_PATROL:
-      SetCursor (cursors[CURSOR_PATROL]);
+      update_mouse_cursor(CURSOR_PATROL);
       break;
     case HOVER_GOTO:
     case HOVER_CONNECT:
-      SetCursor (cursors[CURSOR_GOTO]);
+      update_mouse_cursor(CURSOR_GOTO);
       break;
     case HOVER_NUKE:
-      SetCursor (cursors[CURSOR_NUKE]);
+      update_mouse_cursor(CURSOR_NUKE);
       break;
     case HOVER_PARADROP:
-      SetCursor (cursors[CURSOR_PARADROP]);
+      update_mouse_cursor(CURSOR_PARADROP);
       break;
     }
     break;
Index: client/gui-win32/mapview.c
===================================================================
--- client/gui-win32/mapview.c	(revision 12438)
+++ client/gui-win32/mapview.c	(working copy)
@@ -53,14 +53,10 @@
 #include "sprite.h"
 #include "text.h"
 
-extern HCURSOR cursors[];
-
 static struct sprite *indicator_sprite[3];
 
 static HBITMAP intro_gfx;
 
-static int cursor_type = -1;
-
 extern void do_mainwin_layout();
 
 extern int seconds_to_turndone;   
@@ -69,21 +65,7 @@
 static void draw_rates(HDC hdc);
 
 /**************************************************************************
-  This function is used to animate the mouse cursor. 
-**************************************************************************/
-void anim_cursor(float time)
-{
-  int cursor_frame = (int)(time * 15.0f) % NUM_CURSOR_FRAMES;
 
-  if (cursor_type == CURSOR_DEFAULT) {
-    SetCursor (LoadCursor(NULL, IDC_ARROW));
-  } else {
-    SetCursor(cursors[cursor_type * NUM_CURSOR_FRAMES + cursor_frame]);
-  }
-}
-
-/**************************************************************************
-
 **************************************************************************/
 void map_expose(int x, int y, int width, int height)
 {
@@ -199,51 +181,6 @@
   SetWindowText(unit_info_frame, get_unit_info_label_text1(punitlist));
   SetWindowText(unit_info_label, get_unit_info_label_text2(punitlist));
 
-  switch (hover_state) {
-    case HOVER_NONE:
-      if (action_state == CURSOR_ACTION_SELECT) {
-        cursor_type = CURSOR_SELECT;
-      } else if (action_state == CURSOR_ACTION_PARATROOPER) {
-        cursor_type = CURSOR_PARADROP;
-      } else if (action_state == CURSOR_ACTION_NUKE) {
-        cursor_type = CURSOR_NUKE;
-      } else {
-        cursor_type = CURSOR_DEFAULT;
-      }
-      break;
-    case HOVER_PATROL:
-      if (action_state == CURSOR_ACTION_INVALID) {
-        cursor_type = CURSOR_INVALID;
-      } else {
-        cursor_type = CURSOR_PATROL;
-      }
-      break;
-    case HOVER_GOTO:
-      if (action_state == CURSOR_ACTION_GOTO) {
-        cursor_type = CURSOR_GOTO;
-      } else if (action_state == CURSOR_ACTION_DEFAULT) {
-        cursor_type = CURSOR_DEFAULT;
-      } else if (action_state == CURSOR_ACTION_ATTACK) {
-        cursor_type = CURSOR_ATTACK;
-      } else {
-        cursor_type = CURSOR_INVALID;
-      }
-      break;
-    case HOVER_CONNECT:
-      if (action_state == CURSOR_ACTION_INVALID) {
-        cursor_type = CURSOR_INVALID;
-      } else {
-        cursor_type = CURSOR_GOTO;
-      }
-      break;
-    case HOVER_NUKE:
-      cursor_type = CURSOR_NUKE;
-      break;
-    case HOVER_PARADROP:
-      cursor_type = CURSOR_PARADROP;
-      break;
-  }
-
   do_mainwin_layout();
 }
 
Index: client/gui-win32/wldlg.c
===================================================================
--- client/gui-win32/wldlg.c	(revision 12438)
+++ client/gui-win32/wldlg.c	(working copy)
@@ -41,6 +41,8 @@
 #include "wldlg.h"
 #include "citydlg.h"
 
+#include "civclient.h"
+/* global struct civclient client */
 
 typedef int wid;
 
@@ -124,11 +126,11 @@
 
   /* Fill in the global worklists now?                      */
   /* perhaps judicious use of goto would be good here? -mck */
-  if (wl_first && game.player_ptr->worklists[0].is_valid && pcity) {
+  if (wl_first && client.worklists[0].is_valid && pcity) {
     int i;
 
     for (i = 0; i < MAX_NUM_WORKLISTS; i++) {
-      if (game.player_ptr->worklists[i].is_valid) {
+      if (client.worklists[i].is_valid) {
 	dest_wids[wids_used] = wid_encode(FALSE, TRUE, i);
 	wids_used++;
       }
@@ -147,11 +149,11 @@
   }
 
   /* we didn't fill in the global worklists above */
-  if (!wl_first && game.player_ptr->worklists[0].is_valid && pcity) {
+  if (!wl_first && client.worklists[0].is_valid && pcity) {
     int i;
 
     for (i = 0; i < MAX_NUM_WORKLISTS; i++) {
-      if (game.player_ptr->worklists[i].is_valid) {
+      if (client.worklists[i].is_valid) {
         dest_wids[wids_used] = wid_encode(FALSE, TRUE, i);
         wids_used++;
       }
@@ -235,10 +237,10 @@
   int i, n;
 
   for (i = 0, n = 0; i < MAX_NUM_WORKLISTS; i++) {
-    if (preport->pplr->worklists[i].is_valid) {
-      strcpy(preport->worklist_names[n], preport->pplr->worklists[i].name);
+    if (client.worklists[i].is_valid) {
+      strcpy(preport->worklist_names[n], client.worklists[i].name);
       preport->worklist_names_ptrs[n] = preport->worklist_names[n];
-      preport->worklist_ptr[n] = &preport->pplr->worklists[i];
+      preport->worklist_ptr[n] = client.worklists + i;
 
       n++;
     }
@@ -268,18 +270,17 @@
 
   /* Look for the last free worklist */
   for (i = 0; i < MAX_NUM_WORKLISTS; i++)
-    if (!preport->pplr->worklists[i].is_valid)
+    if (!client.worklists[i].is_valid)
       break;
 
   for (j = sel; j < i - 1; j++) {
-    copy_worklist(&preport->pplr->worklists[j],
-                  &preport->pplr->worklists[j + 1]);
+    copy_worklist(client.worklists + j , client.worklists + j + 1);
   }
 
   /* The last worklist in the set is no longer valid -- it's been slid up
    * one slot. */
-  preport->pplr->worklists[i-1].is_valid = FALSE;
-  strcpy(preport->pplr->worklists[i-1].name, "\0");
+  client.worklists[i-1].is_valid = FALSE;
+  strcpy(client.worklists[i-1].name, "\0");
 
   global_list_update(preport);
 }
@@ -292,9 +293,9 @@
   struct worklist_report *preport = (struct worklist_report *) data;
 
   if (preport) {
-    strncpy(preport->pplr->worklists[preport->wl_idx].name,
+    strncpy(client.worklists[preport->wl_idx].name,
             input_dialog_get_input(w), MAX_LEN_NAME);
-    preport->pplr->worklists[preport->wl_idx].name[MAX_LEN_NAME - 1] = '\0';
+    client.worklists[preport->wl_idx].name[MAX_LEN_NAME - 1] = '\0';
 
     global_list_update(preport);
   }
@@ -312,7 +313,7 @@
   /* Find the next free worklist for this player */
 
   for (j = 0; j < MAX_NUM_WORKLISTS; j++)
-    if (!preport->pplr->worklists[j].is_valid)
+    if (!client.worklists[j].is_valid)
       break;
 
   /* No more worklist slots free.  (!!!Maybe we should tell the user?) */
@@ -320,9 +321,9 @@
     return;
 
   /* Validate this slot. */
-  init_worklist(&preport->pplr->worklists[j]);
-  preport->pplr->worklists[j].is_valid = TRUE;
-  strcpy(preport->pplr->worklists[j].name, _("empty worklist"));
+  init_worklist(client.worklists + j);
+  client.worklists[j].is_valid = TRUE;
+  strcpy(client.worklists[j].name, _("empty worklist"));
 
   global_list_update(preport);
 }
@@ -361,7 +362,7 @@
 	input_dialog_create(hwnd,
 			    _("Rename Worklist"),
 			    _("What should the new name be?"),
-			    preport->pplr->worklists[preport->wl_idx].name,
+			    client.worklists[preport->wl_idx].name,
 			    (void *) global_rename_sub_callback,
 			    (void *) preport,
 			    (void *) global_rename_sub_callback,
@@ -487,7 +488,7 @@
 {
   struct worklist_report *preport = (struct worklist_report *) data;
   
-  copy_worklist(&preport->pplr->worklists[preport->wl_idx], pwl);
+  copy_worklist(client.worklists + preport->wl_idx , pwl);
 }
 
 /****************************************************************
@@ -631,8 +632,7 @@
   
   /* target is a global worklist id */
   if (wid_is_worklist(wid)) {
-    struct player *pplr = city_owner(peditor->pcity);
-    struct worklist *pwl = &pplr->worklists[wid_id(wid)];
+    struct worklist *pwl = client.worklists + wid_id(wid) ;
 
     copy_worklist_to_editor(pwl, peditor, where);
     where += worklist_length(pwl);
@@ -1053,7 +1053,6 @@
 static void targets_list_update(struct worklist_editor *peditor)
 {
   int i = 0, wids_used = 0;
-  struct player *pplr = game.player_ptr;
   int advanced_tech;
   char *row[COLUMNS];
   char buf[COLUMNS][BUFFER_SIZE];
@@ -1083,8 +1082,7 @@
     }
 
     if (wid_is_worklist(wid)) {
-      my_snprintf(buf[0], BUFFER_SIZE, "%s",
-		  pplr->worklists[wid_id(wid)].name);
+      my_snprintf(buf[0], BUFFER_SIZE, "%s", client.worklists[wid_id(wid)].name);
       my_snprintf(buf[1], BUFFER_SIZE, _("Worklist"));
       my_snprintf(buf[2], BUFFER_SIZE, "---");
       my_snprintf(buf[3], BUFFER_SIZE, "---");
