void
select_module (int module, int mbutton)
{
    if (module_tflag[module] == 0 && mbutton != LC_MOUSE_RIGHTBUTTON) {
	ok_dial_box ("not_enough_tech.mes", BAD, 0L);
	return;
    }
    if (mbutton == LC_MOUSE_RIGHTBUTTON 
	|| module_help_flag[module] == 0)
    {
	activate_help (module_help[module]);
	if (mbutton != LC_MOUSE_RIGHTBUTTON)
	    module_help_flag[module] = 1;
	if (mbutton == LC_MOUSE_RIGHTBUTTON)
	    return;
    }

    unhighlight_module_button (old_selected_module);
    highlight_module_button (module);
    old_selected_module = module;

    set_selected_module (module_type[module]);

    /* GCS: Moved below for code reuse w/ setting residences. */
#if defined (commentout)
    selected_module_type = module_type[module];
    selected_module_group = get_group_of_type(selected_module_type);
    if (selected_module_type == CST_RESIDENCE_LL) {
	choose_residence ();
    }

#ifdef LC_X11  /* XXX: WCK: shouldn't be any platform specific code here */
    if (selected_module_group == GROUP_BARE) 
	XDefineCursor (display.dpy, display.win, pirate_cursor);
    else
	XDefineCursor (display.dpy, display.win, None);
#endif

    draw_selected_module_cost();

    if (selected_module_type == CST_GREEN) {
	draw_main_window_box (red (8));
    } else {
	draw_main_window_box (green (8));
	monument_bul_flag = 0;
	river_bul_flag = 0;
	shanty_bul_flag = 0;
    }
#endif
}
Beispiel #2
0
void load_city_2(char *cname)
{
    int i, x, y, p;
    int dumbint = 0;
    int num_pbars, pbar_data_size;
    int pbar_tmp;
    int dummy;
    gzFile gzfile;
    char s[512];

    clear_game();

    gzfile = gzopen(cname, "rb");
    if (gzfile == NULL) {
        printf(_("Can't open <%s> (gzipped)"), cname);
        do_error("Can't open it!");
    }

    sscanf(gzgets(gzfile, s, 256), "%d", &ldsv_version);
    if (ldsv_version < WATERWELL_V2) {
        gzclose(gzfile);
        load_city_old( cname );
        /* Fix desert frontier for old saved games and scenarios */
        desert_frontier(0, 0, WORLD_SIDE_LEN, WORLD_SIDE_LEN);
        return;
    }

    fprintf(stderr, " ldsv_version = %i \n", ldsv_version);
    use_waterwell = true;

    init_pbars();
    num_pbars = NUM_PBARS;
    pbar_data_size = PBAR_DATA_SIZE;

    init_inventory();
    print_time_for_year();

    // Easier debugging from saved game: #Line = 100 x + y + 1  (first line = ldsv_version)
    for (x = 0; x < WORLD_SIDE_LEN; x++) {
        for (y = 0; y < WORLD_SIDE_LEN; y++) {
            gzgets(gzfile, s, 512);
            //         TY  po fl cr  or  i1 i2 i3 i4 i5 i6 i7 PL al ec ws gp wa wp ww wn g1 g2 g3 g4 DA TK AN d4 d5 d6 d7 d8 d9
            sscanf(s, "%hi %d %i %hu %hu %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d %d"
                    , &MP_TYPE(x, y)
                    , &MP_INFO(x, y).population
                    , &MP_INFO(x, y).flags
                    , &MP_INFO(x, y).coal_reserve
                    , &MP_INFO(x, y).ore_reserve
                    , &MP_INFO(x, y).int_1
                    , &MP_INFO(x, y).int_2
                    , &MP_INFO(x, y).int_3
                    , &MP_INFO(x, y).int_4
                    , &MP_INFO(x, y).int_5
                    , &MP_INFO(x, y).int_6
                    , &MP_INFO(x, y).int_7
                    , &MP_POL(x, y)
                    , &ground[x][y].altitude
                    , &ground[x][y].ecotable
                    , &ground[x][y].wastes
                    , &ground[x][y].pollution
                    , &ground[x][y].water_alt
                    , &ground[x][y].water_pol
                    , &ground[x][y].water_wast
                    , &ground[x][y].water_next
                    , &ground[x][y].int1
                    , &ground[x][y].int2
                    , &ground[x][y].int3
                    , &ground[x][y].int4
                    , &MP_DATE(x,y)   // d1 = date of built
                    , &MP_TECH(x,y)   // d2 = tech at build time
                    , &MP_ANIM(x,y)   // d3 = animation_time (see reset_animation_time mess :)
                    , &dumbint        // d4  could be         image index for smooth animation, cf windmill anim_tile
                    , &dumbint        // d5                   percentage of activity to choose family of pic
                    , &dumbint        // d6
                    , &dumbint        // d7
                    , &dumbint        // d8
                    , &dumbint        // d9
                    );
            if (get_group_of_type(MP_TYPE(x, y)) == GROUP_MARKET)
                inventory(x, y);
        }
    }
    set_map_groups();

    sscanf(gzgets(gzfile, s, 256), "%d", &main_screen_originx);
    sscanf(gzgets(gzfile, s, 256), "%d", &main_screen_originy);

    sscanf(gzgets(gzfile, s, 256), "%d", &total_time);

    for (x = 0; x < MAX_NUMOF_SUBSTATIONS; x++) {
        sscanf(gzgets(gzfile, s, 256), "%d", &substationx[x]);
        sscanf(gzgets(gzfile, s, 256), "%d", &substationy[x]);
    }
    sscanf(gzgets(gzfile, s, 256), "%d", &numof_substations);

    for (x = 0; x < MAX_NUMOF_MARKETS; x++) {
        sscanf(gzgets(gzfile, s, 256), "%d", &marketx[x]);
        sscanf(gzgets(gzfile, s, 256), "%d", &markety[x]);
    }
    sscanf(gzgets(gzfile, s, 256), "%d", &numof_markets);
    sscanf(gzgets(gzfile, s, 256), "%d", &people_pool);
    sscanf(gzgets(gzfile, s, 256), "%o", &total_money);
    sscanf(gzgets(gzfile, s, 256), "%d", &income_tax_rate);
    sscanf(gzgets(gzfile, s, 256), "%d", &coal_tax_rate);
    sscanf(gzgets(gzfile, s, 256), "%d", &dole_rate);
    sscanf(gzgets(gzfile, s, 256), "%d", &transport_cost_rate);
    sscanf(gzgets(gzfile, s, 256), "%d", &goods_tax_rate);
    sscanf(gzgets(gzfile, s, 256), "%d", &export_tax);
    sscanf(gzgets(gzfile, s, 256), "%d", &export_tax_rate);
    sscanf(gzgets(gzfile, s, 256), "%d", &import_cost);
    sscanf(gzgets(gzfile, s, 256), "%d", &import_cost_rate);
    sscanf(gzgets(gzfile, s, 256), "%d", &tech_level);
    sscanf(gzgets(gzfile, s, 256), "%d", &tpopulation);
    sscanf(gzgets(gzfile, s, 256), "%d", &tstarving_population);
    sscanf(gzgets(gzfile, s, 256), "%d", &tunemployed_population);
    sscanf(gzgets(gzfile, s, 256), "%d", &x);   /* waste_goods obsolete */
    sscanf(gzgets(gzfile, s, 256), "%d", &power_made);
    sscanf(gzgets(gzfile, s, 256), "%d", &power_used);
    sscanf(gzgets(gzfile, s, 256), "%d", &coal_made);
    sscanf(gzgets(gzfile, s, 256), "%d", &coal_used);
    sscanf(gzgets(gzfile, s, 256), "%d", &goods_made);
    sscanf(gzgets(gzfile, s, 256), "%d", &goods_used);
    sscanf(gzgets(gzfile, s, 256), "%d", &ore_made);
    sscanf(gzgets(gzfile, s, 256), "%d", &ore_used);
    sscanf(gzgets(gzfile, s, 256), "%d", &dummy);       /* &diff_old_population */

    /* Update variables calculated from those above */
    housed_population = tpopulation / ((total_time % NUMOF_DAYS_IN_MONTH) + 1);

    /* Get size of monthgraph array */
    sscanf(gzgets(gzfile, s, 256), "%d", &i);
    for (x = 0; x < i; x++) {
        /* If more entries in file than will fit on screen, 
           then we need to skip past them. */
        if (x >= monthgraph_size) {
            sscanf(gzgets(gzfile, s, 256), "%d", &dummy);       /* &monthgraph_pop[x] */
            sscanf(gzgets(gzfile, s, 256), "%d", &dummy);       /* &monthgraph_starve[x] */
            sscanf(gzgets(gzfile, s, 256), "%d", &dummy);       /* &monthgraph_nojobs[x] */
            sscanf(gzgets(gzfile, s, 256), "%d", &dummy);       /* &monthgraph_ppool[x] */
        } else {
            sscanf(gzgets(gzfile, s, 256), "%d", &monthgraph_pop[x]);
            sscanf(gzgets(gzfile, s, 256), "%d", &monthgraph_starve[x]);
            sscanf(gzgets(gzfile, s, 256), "%d", &monthgraph_nojobs[x]);
            sscanf(gzgets(gzfile, s, 256), "%d", &monthgraph_ppool[x]);
        }
    }
    /* If screen bigger than number of entries in file, pad with zeroes */
    while (x < monthgraph_size) {
        monthgraph_pop[x] = 0;
        monthgraph_starve[x] = 0;
        monthgraph_nojobs[x] = 0;
        monthgraph_ppool[x] = 0;
        x++;
    }
    sscanf(gzgets(gzfile, s, 256), "%d", &rockets_launched);
    sscanf(gzgets(gzfile, s, 256), "%d", &rockets_launched_success);
    sscanf(gzgets(gzfile, s, 256), "%d", &coal_survey_done);

    for (x = 0; x < pbar_data_size; x++) {
        for (p = 0; p < num_pbars; p++) {
            sscanf(gzgets(gzfile, s, 256), "%d", &(pbar_tmp));
            update_pbar(p, pbar_tmp, 1);
        }
    }

    for (p = 0; p < num_pbars; p++)
        pbars[p].data_size = pbar_data_size;

    for (p = 0; p < num_pbars; p++) {
        sscanf(gzgets(gzfile, s, 256), "%d", &(pbars[p].oldtot));
        sscanf(gzgets(gzfile, s, 256), "%d", &(pbars[p].diff));
    }

    sscanf(gzgets(gzfile, s, 256), "%d", &cheat_flag);
    sscanf(gzgets(gzfile, s, 256), "%d", &total_pollution_deaths);
    sscanf(gzgets(gzfile, s, 256), "%f", &pollution_deaths_history);
    sscanf(gzgets(gzfile, s, 256), "%d", &total_starve_deaths);
    sscanf(gzgets(gzfile, s, 256), "%f", &starve_deaths_history);
    sscanf(gzgets(gzfile, s, 256), "%d", &total_unemployed_years);
    sscanf(gzgets(gzfile, s, 256), "%f", &unemployed_history);
    sscanf(gzgets(gzfile, s, 256), "%d", &max_pop_ever);
    sscanf(gzgets(gzfile, s, 256), "%d", &total_evacuated);
    sscanf(gzgets(gzfile, s, 256), "%d", &total_births);

    for (x = 0; x < NUMOF_MODULES; x++)
        sscanf(gzgets(gzfile, s, 256), "%d", &(module_help_flag[x]));

    sscanf(gzgets(gzfile, s, 256), "%128s", given_scene);
    if (strncmp(given_scene, "dummy", 5) == 0 || strlen(given_scene) < 3)
        given_scene[0] = 0;
    sscanf(gzgets(gzfile, s, 256), "%128s", s);
    if (strncmp(given_scene, "dummy", 5) != 0)
        sscanf(s, "%d", &highest_tech_level);
    else
        highest_tech_level = 0;

    gzgets(gzfile, s, 200);   
    if (sscanf
        (s, "sust %d %d %d %d %d %d %d %d %d %d", &sust_dig_ore_coal_count, &sust_port_count, &sust_old_money_count,
         &sust_old_population_count, &sust_old_tech_count, &sust_fire_count, &sust_old_money, &sust_old_population,
         &sust_old_tech, &sustain_flag) == 10) {
        sust_dig_ore_coal_tip_flag = sust_port_flag = 1;
    } else
        sustain_flag = sust_dig_ore_coal_count = sust_port_count
            = sust_old_money_count = sust_old_population_count
            = sust_old_tech_count = sust_fire_count = sust_old_money = sust_old_population = sust_old_tech = 0;

    gzgets(gzfile, s, 80);
    sscanf(s, "arid %d %d", &global_aridity, &global_mountainity);

    gzclose(gzfile);

    /* FIXME: AL1 this is initialisation stuff, should go elsewhere */

    // Engine stuff
    if (tech_level > MODERN_WINDMILL_TECH)
        modern_windmill_flag = 1;

    numof_shanties = count_groups(GROUP_SHANTY);
    numof_communes = count_groups(GROUP_COMMUNE);

    /* set up the university intake. */
    x = count_groups(GROUP_UNIVERSITY);
    if (x > 0) {
        university_intake_rate = (count_groups(GROUP_SCHOOL) * 20) / x;
        if (university_intake_rate > 100)
            university_intake_rate = 100;
    } else
        university_intake_rate = 50;

    print_total_money();

    //reset_animation_times
    //get alt_min, alt_max
    alt_min = 2000000000;
    alt_max = -alt_min;
    for ( y = 0; y < WORLD_SIDE_LEN; y++){
        for ( x = 0; x < WORLD_SIDE_LEN; x++) {
            MP_ANIM(x,y) = 0;
            if (MP_GROUP(x, y) == GROUP_FIRE){
                MP_INFO(x, y).int_3 = 0;
            }
            if (alt_min > ALT(x,y)){
                 alt_min = ALT(x,y);
            }
            if (alt_max < ALT(x,y)){
                 alt_max = ALT(x,y);
            }
        }
    }
    alt_step = (alt_max - alt_min) /10;

    map_power_grid(true);       /* WCK:  Is this safe to do here?
                                 * AL1: No, in NG_1.1
                                 * In case of error message with ok_dial_box
                                 *    the dialog cannot appear because the screen
                                 *    is not set up => crash.
                                 * FIXME: move all initialisation elsewhere, in 
                                 *    engine.cpp or simulate.cpp.
                                 */
    // UI stuff
    if (main_screen_originx > WORLD_SIDE_LEN - getMainWindowWidth() / 16 - 1)
        main_screen_originx = WORLD_SIDE_LEN - getMainWindowWidth() / 16 - 1;

    if (main_screen_originy > WORLD_SIDE_LEN - getMainWindowHeight() / 16 - 1)
        main_screen_originy = WORLD_SIDE_LEN - getMainWindowHeight() / 16 - 1;

    unhighlight_module_button(selected_module);
    selected_module = sbut[7];  /* 7 is track.  Watch out though! */
    highlight_module_button(selected_module);
    set_selected_module(CST_TRACK_LR);
    connect_transport(1, 1, WORLD_SIDE_LEN - 2, WORLD_SIDE_LEN - 2);
    /* Fix desert frontier for old saved games and scenarios */
    desert_frontier(0, 0, WORLD_SIDE_LEN, WORLD_SIDE_LEN);

}
void
load_city (char *cname)
{
    unsigned long q;
    int i, x, y, z, n, p;
    int num_pbars, pbar_data_size;
    int pbar_tmp;
    int dummy;
    gzFile gzfile;
    char s[256];
    gzfile = gzopen( cname, "rb" ); 
    if ( gzfile == NULL) {
	    printf (_("Can't open <%s> (gzipped)"), cname);
	    do_error ("Can't open it!");
    }
    /* Add version to shared global variables for playing/saving games without waterwell */
    sscanf( gzgets( gzfile, s, 256 ), "%d", &ldsv_version);
    if (ldsv_version < MIN_LOAD_VERSION) {
	    ok_dial_box ("too-old.mes", BAD, 0L);
	    gzclose( gzfile );
	return;
    }

    fprintf(stderr," ldsv_version = %i \n", ldsv_version);
    if (ldsv_version < MIN_WATERWELL_VERSION) {
	/* ok_dial_box ("no-waterwell.mes", GOOD, 0L);*/
	use_waterwell=false;
    } else {
    	use_waterwell=true; 
	/* needed until it is written in the saved file
	 * in case of load after having played an old game
	 */
    }

    init_pbars();
    num_pbars = NUM_PBARS;
    pbar_data_size = PBAR_DATA_SIZE;

    init_inventory();
    
    print_time_for_year();
    q = (unsigned long) sizeof (Map_Point_Info);
    prog_box (_("Loading scene"), 0);

    for (x = 0; x < WORLD_SIDE_LEN; x++) {
	for (y = 0; y < WORLD_SIDE_LEN; y++) {
	    for (z = 0; z < sizeof(int); z++) {
		sscanf( gzgets( gzfile, s, 256 ), "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).population) + z) = n;
	    }
	    for (z = 0; z < sizeof(int); z++) {
		sscanf( gzgets( gzfile, s, 256 ), "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).flags) + z) = n;
	    }
	    for (z = 0; z < sizeof(unsigned short); z++) {
		sscanf( gzgets( gzfile, s, 256 ), "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).coal_reserve) + z) = n;
	    }
	    for (z = 0; z < sizeof(unsigned short); z++) {
		sscanf( gzgets( gzfile, s, 256 ), "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).ore_reserve) + z) = n;
	    }
	    for (z = 0; z < sizeof(int); z++) {
		sscanf( gzgets( gzfile, s, 256 ), "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).int_1) + z) = n;
	    }
	    for (z = 0; z < sizeof(int); z++) {
		sscanf( gzgets( gzfile, s, 256 ), "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).int_2) + z) = n;
	    }
	    for (z = 0; z < sizeof(int); z++) {
		sscanf( gzgets( gzfile, s, 256 ), "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).int_3) + z) = n;
	    }
	    for (z = 0; z < sizeof(int); z++) {
		sscanf( gzgets( gzfile, s, 256 ), "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).int_4) + z) = n;
	    }
	    for (z = 0; z < sizeof(int); z++) {
		sscanf( gzgets( gzfile, s, 256 ), "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).int_5) + z) = n;
	    }
	    for (z = 0; z < sizeof(int); z++) {
		sscanf( gzgets( gzfile, s, 256 ), "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).int_6) + z) = n;
	    }
	    for (z = 0; z < sizeof(int); z++) {
		sscanf( gzgets( gzfile, s, 256 ), "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).int_7) + z) = n;
	    }
	    sscanf( gzgets( gzfile, s, 256 ), "%d", &n);
	    MP_POL(x,y) = (unsigned short) n;
	    sscanf( gzgets( gzfile, s, 256 ), "%d", &n);
	    MP_TYPE(x,y) = (short) n;

	    if (get_group_of_type(MP_TYPE(x,y)) == GROUP_MARKET)
		inventory(x,y);
	}
	if (((93 * x) / WORLD_SIDE_LEN) % 3 == 0)
	    prog_box ("", (93 * x) / WORLD_SIDE_LEN);
    }
    check_endian ();
    set_map_groups ();

    sscanf( gzgets( gzfile, s, 256 ), "%d", &main_screen_originx);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &main_screen_originy);
    if (main_screen_originx > WORLD_SIDE_LEN - getMainWindowWidth() / 16 - 1)
	main_screen_originx = WORLD_SIDE_LEN - getMainWindowWidth() / 16 - 1;

    if (main_screen_originy > WORLD_SIDE_LEN - getMainWindowHeight() / 16 - 1)
	main_screen_originy = WORLD_SIDE_LEN - getMainWindowHeight() / 16 - 1;

    sscanf( gzgets( gzfile, s, 256 ), "%d", &total_time);
    if (ldsv_version <= MM_MS_C_VER)
	i = OLD_MAX_NUMOF_SUBSTATIONS;
    else
	i = MAX_NUMOF_SUBSTATIONS;
    for (x = 0; x < i; x++)
    {
	sscanf( gzgets( gzfile, s, 256 ), "%d", &substationx[x]);
	sscanf( gzgets( gzfile, s, 256 ), "%d", &substationy[x]);
    }
    prog_box ("", 92);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &numof_substations);
    if (ldsv_version <= MM_MS_C_VER)
	i = OLD_MAX_NUMOF_MARKETS;
    else
	i = MAX_NUMOF_MARKETS;
    for (x = 0; x < i; x++)
    {
	sscanf( gzgets( gzfile, s, 256 ), "%d", &marketx[x]);
	sscanf( gzgets( gzfile, s, 256 ), "%d", &markety[x]);
    }
    prog_box ("", 94);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &numof_markets);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &people_pool);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &total_money);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &income_tax_rate);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &coal_tax_rate);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &dole_rate);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &transport_cost_rate);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &goods_tax_rate);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &export_tax);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &export_tax_rate);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &import_cost);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &import_cost_rate);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &tech_level);
    if (tech_level > MODERN_WINDMILL_TECH)
	modern_windmill_flag = 1;
    sscanf( gzgets( gzfile, s, 256 ), "%d", &tpopulation);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &tstarving_population);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &tunemployed_population);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &x);  /* waste_goods obsolete */
    sscanf( gzgets( gzfile, s, 256 ), "%d", &power_made);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &power_used);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &coal_made);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &coal_used);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &goods_made);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &goods_used);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &ore_made);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &ore_used);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &dummy); /* &diff_old_population */

    /* Update variables calculated from those above */
    housed_population = tpopulation / NUMOF_DAYS_IN_MONTH;

    prog_box ("", 96);
    /* Get size of monthgraph array */
    if (ldsv_version <= MG_C_VER) {
	i = 120;
    } else {
	sscanf( gzgets( gzfile, s, 256 ), "%d", &i);
    }
    for (x = 0; x < i; x++) {
	/* If more entries in file than will fit on screen, 
	   then we need to skip past them. */
	if (x >= monthgraph_size) {
	    sscanf( gzgets( gzfile, s, 256 ), "%d", &dummy); /* &monthgraph_pop[x] */
	    sscanf( gzgets( gzfile, s, 256 ), "%d", &dummy); /* &monthgraph_starve[x] */
	    sscanf( gzgets( gzfile, s, 256 ), "%d", &dummy); /* &monthgraph_nojobs[x] */
	    sscanf( gzgets( gzfile, s, 256 ), "%d", &dummy); /* &monthgraph_ppool[x] */
	} else {
	    sscanf( gzgets( gzfile, s, 256 ), "%d", &monthgraph_pop[x]);
	    sscanf( gzgets( gzfile, s, 256 ), "%d", &monthgraph_starve[x]);
	    sscanf( gzgets( gzfile, s, 256 ), "%d", &monthgraph_nojobs[x]);
	    sscanf( gzgets( gzfile, s, 256 ), "%d", &monthgraph_ppool[x]);
	}
	/* If our save file is old, skip past obsolete diffgraph entries */
	if (ldsv_version <= MG_C_VER) {
	    sscanf( gzgets( gzfile, s, 256 ), "%d", &dummy); /* &diffgraph_power[x] */
	    sscanf( gzgets( gzfile, s, 256 ), "%d", &dummy); /* &diffgraph_coal[x] */
	    sscanf( gzgets( gzfile, s, 256 ), "%d", &dummy); /* &diffgraph_goods[x] */
	    sscanf( gzgets( gzfile, s, 256 ), "%d", &dummy); /* &diffgraph_ore[x] */
	    sscanf( gzgets( gzfile, s, 256 ), "%d", &dummy); /* &diffgraph_population[x] */
	}
    }
    /* If screen bigger than number of entries in file, pad with zeroes */
    while (x < monthgraph_size) {
	monthgraph_pop[x] = 0;
	monthgraph_starve[x] = 0;
	monthgraph_nojobs[x] = 0;
	monthgraph_ppool[x] = 0;
	x++;
    }
    prog_box ("", 98);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &rockets_launched);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &rockets_launched_success);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &coal_survey_done);
    
    for (x = 0; x < pbar_data_size; x++) {
	for (p = 0; p < num_pbars; p++) {
	    sscanf( gzgets( gzfile, s, 256 ), "%d", &(pbar_tmp));
	    update_pbar(p,pbar_tmp,1);
/*	    sscanf( gzgets( gzfile, s, 256 ), "%d", &(pbars[p].data[x])); */
	}
    }

    for (p = 0; p < num_pbars; p++)
	pbars[p].data_size = pbar_data_size;

    prog_box ("", 99);

    for (p = 0; p < num_pbars; p++) {
	sscanf( gzgets( gzfile, s, 256 ), "%d", &(pbars[p].oldtot));
	sscanf( gzgets( gzfile, s, 256 ), "%d", &(pbars[p].diff));
    }


    sscanf( gzgets( gzfile, s, 256 ), "%d", &cheat_flag);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &total_pollution_deaths);
    sscanf( gzgets( gzfile, s, 256 ), "%f", &pollution_deaths_history);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &total_starve_deaths);
    sscanf( gzgets( gzfile, s, 256 ), "%f", &starve_deaths_history);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &total_unemployed_years);
    sscanf( gzgets( gzfile, s, 256 ), "%f", &unemployed_history);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &max_pop_ever);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &total_evacuated);
    sscanf( gzgets( gzfile, s, 256 ), "%d", &total_births);
    for (x = 0; x < NUMOF_MODULES; x++)
	sscanf( gzgets( gzfile, s, 256 ), "%d", &(module_help_flag[x]));
    sscanf( gzgets( gzfile, s, 256 ), "%d", &x);	/* just dummy reads */
    sscanf( gzgets( gzfile, s, 256 ), "%d", &x);	/* for backwards compatibility. */

    /* 10 dummy strings, for missed out things, have been put in save. */
    /* Input from this point uses them. */
    /* XXX: WCK: Huh? Missed out things? */

    sscanf( gzgets( gzfile, s, 256 ), "%128s", given_scene);
    if (strncmp (given_scene, "dummy", 5) == 0 || strlen (given_scene) < 3)
	given_scene[0] = 0;
    sscanf( gzgets( gzfile, s, 256 ), "%128s", s);
    if (strncmp (given_scene, "dummy", 5) != 0)
	sscanf (s, "%d", &highest_tech_level);
    else
	highest_tech_level = 0;
    gzgets( gzfile, s, 80 );		/* this is the CR */

    if (sscanf (s, "sust %d %d %d %d %d %d %d %d %d %d"
		,&sust_dig_ore_coal_count, &sust_port_count
		,&sust_old_money_count, &sust_old_population_count
		,&sust_old_tech_count, &sust_fire_count
		,&sust_old_money, &sust_old_population, &sust_old_tech
		,&sustain_flag) == 10)
    {
	sust_dig_ore_coal_tip_flag = sust_port_flag = 1;
	/* GCS FIX: Check after loading file if screen is drawn OK */
	/* draw_sustainable_window (); */
    }
    else
	sustain_flag = sust_dig_ore_coal_count = sust_port_count
		= sust_old_money_count = sust_old_population_count
		= sust_old_tech_count = sust_fire_count
		= sust_old_money = sust_old_population = sust_old_tech = 0;
    if (use_waterwell == true) {
    }
    gzclose( gzfile );

    numof_shanties = count_groups (GROUP_SHANTY);
    numof_communes = count_groups (GROUP_COMMUNE);
    prog_box ("", 100);

    /* set up the university intake. */
    x = count_groups (GROUP_UNIVERSITY);
    if (x > 0) {
	university_intake_rate
		= (count_groups (GROUP_SCHOOL) * 20) / x;
	if (university_intake_rate > 100)
	    university_intake_rate = 100;
    }
    else
	university_intake_rate = 50;

    /*Al1 : What is this ? This does nothing, the value are saved in MP_INFO.int_ 
     * for (x = 0; x < WORLD_SIDE_LEN; x++)
     *   for (y = 0; y < WORLD_SIDE_LEN; y++)
     *     update_tech_dep (x, y);
     */

    unhighlight_module_button (selected_module);
    selected_module = sbut[7];	/* 7 is track.  Watch out though! */
    highlight_module_button (selected_module);
    set_selected_module (CST_TRACK_LR);

    print_total_money ();
    reset_animation_times ();
    /* update tech dep for compatibility with old games */
    for (x = 0; x < WORLD_SIDE_LEN; x++)
	for (y = 0; y < WORLD_SIDE_LEN; y++) {
            switch (MP_GROUP(x,y)) {
            case (GROUP_WINDMILL): 	 
                MP_INFO(x,y).int_1 = (int)(WINDMILL_POWER 	 
                        + (((double) MP_INFO(x,y).int_2 * WINDMILL_POWER)
                                / MAX_TECH_LEVEL));
                break;
            case (GROUP_COAL_POWER): 	 
                MP_INFO(x,y).int_1 = (int)(POWERS_COAL_OUTPUT 	 
                        + (((double) MP_INFO(x,y).int_4 * POWERS_COAL_OUTPUT) 
                                / MAX_TECH_LEVEL)); 	 
                break; 	 
            case (GROUP_SOLAR_POWER): 	 
                MP_INFO(x,y).int_1 = (int)(POWERS_SOLAR_OUTPUT 	 
                        + (((double) MP_INFO(x,y).int_2 * POWERS_SOLAR_OUTPUT) 	 
                                / MAX_TECH_LEVEL)); 	 
                break; 	 
            }
    }
 
    map_power_grid(true); /* WCK:  Is this safe to do here?
                           * AL1: No, in NG_1.1
                           * In case of error message with ok_dial_box
                           *    the dialog cannot appear because the screen
                           *    is not set up => crash.
                           * FIXME: move all initialisation elsewhere, in 
                           *    engine.cpp or simulate.cpp.
                           */
                                
}
void
load_city (char *cname)
{
    unsigned long q;
    int i, x, y, z, n, p, ver;
    int num_pbars, pbar_data_size;
    int pbar_tmp;
    int dummy;
    FILE *ofile;
    char s[256];
    if ((ofile = fopen_read_gzipped (cname)) == NULL) {
	printf (_("Can't open <%s> (gzipped)"), cname);
	do_error ("Can't open it!");
    }
    fscanf (ofile, "%d", &ver);
    if (ver < MIN_LOAD_VERSION) {
	ok_dial_box ("too-old.mes", BAD, 0L);
	fclose_read_gzipped (ofile);
	return;
    }

    init_pbars();
    num_pbars = NUM_PBARS;
    pbar_data_size = PBAR_DATA_SIZE;

    init_inventory();
    
    print_time_for_year();
    q = (unsigned long) sizeof (Map_Point_Info);
    prog_box (_("Loading scene"), 0);

    for (x = 0; x < WORLD_SIDE_LEN; x++) {
	for (y = 0; y < WORLD_SIDE_LEN; y++) {
	    for (z = 0; z < sizeof(int); z++) {
		fscanf (ofile, "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).population) + z) = n;
	    }
	    for (z = 0; z < sizeof(int); z++) {
		fscanf (ofile, "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).flags) + z) = n;
	    }
	    for (z = 0; z < sizeof(unsigned short); z++) {
		fscanf (ofile, "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).coal_reserve) + z) = n;
	    }
	    for (z = 0; z < sizeof(unsigned short); z++) {
		fscanf (ofile, "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).ore_reserve) + z) = n;
	    }
	    for (z = 0; z < sizeof(int); z++) {
		fscanf (ofile, "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).int_1) + z) = n;
	    }
	    for (z = 0; z < sizeof(int); z++) {
		fscanf (ofile, "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).int_2) + z) = n;
	    }
	    for (z = 0; z < sizeof(int); z++) {
		fscanf (ofile, "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).int_3) + z) = n;
	    }
	    for (z = 0; z < sizeof(int); z++) {
		fscanf (ofile, "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).int_4) + z) = n;
	    }
	    for (z = 0; z < sizeof(int); z++) {
		fscanf (ofile, "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).int_5) + z) = n;
	    }
	    for (z = 0; z < sizeof(int); z++) {
		fscanf (ofile, "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).int_6) + z) = n;
	    }
	    for (z = 0; z < sizeof(int); z++) {
		fscanf (ofile, "%d", &n);
		*(((unsigned char *) &MP_INFO(x,y).int_7) + z) = n;
	    }
	    fscanf (ofile, "%d", &n);
	    MP_POL(x,y) = (unsigned short) n;
	    fscanf (ofile, "%d", &n);
	    MP_TYPE(x,y) = (short) n;

	    if (get_group_of_type(MP_TYPE(x,y)) == GROUP_MARKET)
		inventory(x,y);
	}
	if (((93 * x) / WORLD_SIDE_LEN) % 3 == 0)
	    prog_box ("", (93 * x) / WORLD_SIDE_LEN);
    }
    check_endian ();
    set_map_groups ();

    fscanf (ofile, "%d", &main_screen_originx);
    fscanf (ofile, "%d", &main_screen_originy);
    if (main_screen_originx > WORLD_SIDE_LEN - scr.main_win.w / 16 - 1)
	main_screen_originx = WORLD_SIDE_LEN - scr.main_win.w / 16 - 1;

    if (main_screen_originy > WORLD_SIDE_LEN - scr.main_win.h / 16 - 1)
	main_screen_originy = WORLD_SIDE_LEN - scr.main_win.h / 16 - 1;

    fscanf (ofile, "%d", &total_time);
    if (ver <= MM_MS_C_VER)
	i = OLD_MAX_NUMOF_SUBSTATIONS;
    else
	i = MAX_NUMOF_SUBSTATIONS;
    for (x = 0; x < i; x++)
    {
	fscanf (ofile, "%d", &substationx[x]);
	fscanf (ofile, "%d", &substationy[x]);
    }
    prog_box ("", 92);
    fscanf (ofile, "%d", &numof_substations);
    if (ver <= MM_MS_C_VER)
	i = OLD_MAX_NUMOF_MARKETS;
    else
	i = MAX_NUMOF_MARKETS;
    for (x = 0; x < i; x++)
    {
	fscanf (ofile, "%d", &marketx[x]);
	fscanf (ofile, "%d", &markety[x]);
    }
    prog_box ("", 94);
    fscanf (ofile, "%d", &numof_markets);
    fscanf (ofile, "%d", &people_pool);
    fscanf (ofile, "%d", &total_money);
    fscanf (ofile, "%d", &income_tax_rate);
    fscanf (ofile, "%d", &coal_tax_rate);
    fscanf (ofile, "%d", &dole_rate);
    fscanf (ofile, "%d", &transport_cost_rate);
    fscanf (ofile, "%d", &goods_tax_rate);
    fscanf (ofile, "%d", &export_tax);
    fscanf (ofile, "%d", &export_tax_rate);
    fscanf (ofile, "%d", &import_cost);
    fscanf (ofile, "%d", &import_cost_rate);
    fscanf (ofile, "%d", &tech_level);
    if (tech_level > MODERN_WINDMILL_TECH)
	modern_windmill_flag = 1;
    fscanf (ofile, "%d", &tpopulation);
    fscanf (ofile, "%d", &tstarving_population);
    fscanf (ofile, "%d", &tunemployed_population);
    fscanf (ofile, "%d", &x);  /* waste_goods obsolete */
    fscanf (ofile, "%d", &power_made);
    fscanf (ofile, "%d", &power_used);
    fscanf (ofile, "%d", &coal_made);
    fscanf (ofile, "%d", &coal_used);
    fscanf (ofile, "%d", &goods_made);
    fscanf (ofile, "%d", &goods_used);
    fscanf (ofile, "%d", &ore_made);
    fscanf (ofile, "%d", &ore_used);
    fscanf (ofile, "%d", &dummy); /* &diff_old_population */

    /* Update variables calculated from those above */
    housed_population = tpopulation / NUMOF_DAYS_IN_MONTH;

    prog_box ("", 96);
    /* Get size of monthgraph array */
    if (ver <= MG_C_VER) {
	i = 120;
    } else {
	fscanf (ofile, "%d", &i);
    }
    for (x = 0; x < i; x++) {
	/* If more entries in file than will fit on screen, 
	   then we need to skip past them. */
	if (x >= monthgraph_size) {
	    fscanf (ofile, "%d", &dummy); /* &monthgraph_pop[x] */
	    fscanf (ofile, "%d", &dummy); /* &monthgraph_starve[x] */
	    fscanf (ofile, "%d", &dummy); /* &monthgraph_nojobs[x] */
	    fscanf (ofile, "%d", &dummy); /* &monthgraph_ppool[x] */
	} else {
	    fscanf (ofile, "%d", &monthgraph_pop[x]);
	    fscanf (ofile, "%d", &monthgraph_starve[x]);
	    fscanf (ofile, "%d", &monthgraph_nojobs[x]);
	    fscanf (ofile, "%d", &monthgraph_ppool[x]);
	}
	/* If our save file is old, skip past obsolete diffgraph entries */
	if (ver <= MG_C_VER) {
	    fscanf (ofile, "%d", &dummy); /* &diffgraph_power[x] */
	    fscanf (ofile, "%d", &dummy); /* &diffgraph_coal[x] */
	    fscanf (ofile, "%d", &dummy); /* &diffgraph_goods[x] */
	    fscanf (ofile, "%d", &dummy); /* &diffgraph_ore[x] */
	    fscanf (ofile, "%d", &dummy); /* &diffgraph_population[x] */
	}
    }
    /* If screen bigger than number of entries in file, pad with zeroes */
    while (x < monthgraph_size) {
	monthgraph_pop[x] = 0;
	monthgraph_starve[x] = 0;
	monthgraph_nojobs[x] = 0;
	monthgraph_ppool[x] = 0;
	x++;
    }
    prog_box ("", 98);
    fscanf (ofile, "%d", &rockets_launched);
    fscanf (ofile, "%d", &rockets_launched_success);
    fscanf (ofile, "%d", &coal_survey_done);
    
    for (x = 0; x < pbar_data_size; x++) {
	for (p = 0; p < num_pbars; p++) {
	    fscanf (ofile, "%d", &(pbar_tmp));
	    update_pbar(p,pbar_tmp,1);
/*	    fscanf (ofile, "%d", &(pbars[p].data[x])); */
	}
    }

    for (p = 0; p < num_pbars; p++)
	pbars[p].data_size = pbar_data_size;

    prog_box ("", 99);

    for (p = 0; p < num_pbars; p++) {
	fscanf (ofile, "%d", &(pbars[p].oldtot));
	fscanf (ofile, "%d", &(pbars[p].diff));
    }


    fscanf (ofile, "%d", &cheat_flag);
    fscanf (ofile, "%d", &total_pollution_deaths);
    fscanf (ofile, "%f", &pollution_deaths_history);
    fscanf (ofile, "%d", &total_starve_deaths);
    fscanf (ofile, "%f", &starve_deaths_history);
    fscanf (ofile, "%d", &total_unemployed_years);
    fscanf (ofile, "%f", &unemployed_history);
    fscanf (ofile, "%d", &max_pop_ever);
    fscanf (ofile, "%d", &total_evacuated);
    fscanf (ofile, "%d", &total_births);
    for (x = 0; x < NUMOF_MODULES; x++)
	fscanf (ofile, "%d", &(module_help_flag[x]));
    fscanf (ofile, "%d", &x);	/* just dummy reads */
    fscanf (ofile, "%d", &x);	/* for backwards compatibility. */

    /* 10 dummy strings, for missed out things, have been put in save. */
    /* Input from this point uses them. */
    /* XXX: WCK: Huh? Missed out things? */

    fscanf (ofile, "%128s", given_scene);
    if (strncmp (given_scene, "dummy", 5) == 0 || strlen (given_scene) < 3)
	given_scene[0] = 0;
    fscanf (ofile, "%128s", s);
    if (strncmp (given_scene, "dummy", 5) != 0)
	sscanf (s, "%d", &highest_tech_level);
    else
	highest_tech_level = 0;
    fgets (s, 80, ofile);		/* this is the CR */

    fgets (s, 80, ofile);
    if (sscanf (s, "sust %d %d %d %d %d %d %d %d %d %d"
		,&sust_dig_ore_coal_count, &sust_port_count
		,&sust_old_money_count, &sust_old_population_count
		,&sust_old_tech_count, &sust_fire_count
		,&sust_old_money, &sust_old_population, &sust_old_tech
		,&sustain_flag) == 10)
    {
	sust_dig_ore_coal_tip_flag = sust_port_flag = 1;
	/* GCS FIX: Check after loading file if screen is drawn OK */
	/* draw_sustainable_window (); */
    }
    else
	sustain_flag = sust_dig_ore_coal_count = sust_port_count
		= sust_old_money_count = sust_old_population_count
		= sust_old_tech_count = sust_fire_count
		= sust_old_money = sust_old_population = sust_old_tech = 0;
    fclose_read_gzipped (ofile);

    numof_shanties = count_groups (GROUP_SHANTY);
    numof_communes = count_groups (GROUP_COMMUNE);
    prog_box ("", 100);

    /* set up the university intake. */
    x = count_groups (GROUP_UNIVERSITY);
    if (x > 0) {
	university_intake_rate
		= (count_groups (GROUP_SCHOOL) * 20) / x;
	if (university_intake_rate > 100)
	    university_intake_rate = 100;
    }
    else
	university_intake_rate = 50;
    for (x = 0; x < WORLD_SIDE_LEN; x++)
    {
	for (y = 0; y < WORLD_SIDE_LEN; y++)
	{
	    update_tech_dep (x, y);
	}
    }

    unhighlight_module_button (selected_module);
    selected_module = sbut[7];	/* 7 is track.  Watch out though! */
    highlight_module_button (selected_module);
    set_selected_module (CST_TRACK_LR);

    print_total_money ();
    reset_animation_times ();
    map_power_grid (); /* WCK:  Is this safe to do here? */
}
void
init_modules (void)
{
    int i;

    /* Get max number of rows for space allotted */
    module_rows = (mbw->h / (SELECT_BUTTON_INTERVAL));
    module_cols = (mbw->w / (SELECT_BUTTON_INTERVAL));

    /* Tell the mouse where we are */
    mhandle = mouse_register(&scr.module_buttons,&module_buttons_handler);

#ifdef DEBUG_MODULES
    printf("debug_modules:\t\tr=%d\tc=%d\n",module_rows, module_cols);
#endif

    /* sbut converts a group into a column major index of the button array. */
    sbut[0] = 16;		/* buldoze */
    sbut[1] = 13;		/* powerline */
    sbut[2] = 15;		/* solar power */
    sbut[3] = 14;		/* substation */
    sbut[4] = 0;		/* residence */
    sbut[5] = 1;		/* farm */
    sbut[6] = 2;		/* market */
    sbut[7] = 19;		/* track */
    sbut[8] = 10;		/* coalmine */
    sbut[9] = 28;		/* rail */
    sbut[10] = 29;		/* coal power */
    sbut[11] = 25;		/* road */
    sbut[12] = 27;		/* light industry */
    sbut[13] = 11;		/* university */
    sbut[14] = 3;		/* commune */
    sbut[15] = 4;		/* oremine */
    sbut[16] = 5;		/* tip */
    sbut[17] = 9;		/* export */
    sbut[18] = 12;		/* heavy industry */
    sbut[19] = 6;		/* parkland */
    sbut[20] = 30;		/* recycle */
    sbut[21] = 20;		/* water */
    sbut[22] = 26;		/* health */
    sbut[23] = 31;		/* rocket */
    sbut[24] = 24;		/* windmill */
    sbut[25] = 17;		/* monument */
    sbut[26] = 21;		/* school */
    sbut[27] = 22;		/* blacksmith */
    sbut[28] = 8;		/* mill */
    sbut[29] = 18;		/* pottery */
    sbut[30] = 23;		/* fire station */
    sbut[31] = 7;		/* cricket  */


    /* load graphics and initialize help */

    module_graphic[sbut[0]] = load_graphic ("buldoze-button.csi");
    module_type[sbut[0]] = CST_GREEN;
    strcpy (module_help[sbut[0]], "bulldoze.hlp");

    module_graphic[sbut[1]] = load_graphic ("powerline-button.csi");
    module_type[sbut[1]] = CST_POWERL_H_L;
    strcpy (module_help[sbut[1]], "powerline.hlp");

    module_graphic[sbut[2]] = load_graphic ("powerssolar-button.csi");
    module_type[sbut[2]] = CST_POWERS_SOLAR;
    strcpy (module_help[sbut[2]], "powerssolar.hlp");

    module_graphic[sbut[3]] = load_graphic ("substation-button.csi");
    module_type[sbut[3]] = CST_SUBSTATION_R;
    strcpy (module_help[sbut[3]], "substation.hlp");

    module_graphic[sbut[4]] = load_graphic ("residence-button.csi");
    module_type[sbut[4]] = CST_RESIDENCE_LL;
    strcpy (module_help[sbut[4]], "residential.hlp");

    module_graphic[sbut[5]] = load_graphic ("organic-farm-button.csi");
    module_type[sbut[5]] = CST_FARM_O0;
    strcpy (module_help[sbut[5]], "farm.hlp");

    module_graphic[sbut[6]] = load_graphic ("market-button.csi");
    module_type[sbut[6]] = CST_MARKET_EMPTY;
    strcpy (module_help[sbut[6]], "market.hlp");

    module_help_flag[sbut[7]] = 1;        /* No help for track */
    module_graphic[sbut[7]] = load_graphic ("track-button.csi");
    module_type[sbut[7]] = CST_TRACK_LR;
    strcpy (module_help[sbut[7]], "track.hlp");

    module_graphic[sbut[8]] = load_graphic ("coalmine-button.csi");
    module_type[sbut[8]] = CST_COALMINE_EMPTY;
    strcpy (module_help[sbut[8]], "coalmine.hlp");

    module_graphic[sbut[9]] = load_graphic ("rail-button.csi");
    module_type[sbut[9]] = CST_RAIL_LR;
    strcpy (module_help[sbut[9]], "rail.hlp");

    module_graphic[sbut[10]] = load_graphic ("powerscoal-button.csi");
    module_type[sbut[10]] = CST_POWERS_COAL_EMPTY;
    strcpy (module_help[sbut[10]], "powerscoal.hlp");

    module_graphic[sbut[11]] = load_graphic ("road-button.csi");
    module_type[sbut[11]] = CST_ROAD_LR;
    strcpy (module_help[sbut[11]], "road.hlp");

    module_graphic[sbut[12]] = load_graphic ("industryl-button.csi");
    module_type[sbut[12]] = CST_INDUSTRY_L_C;
    strcpy (module_help[sbut[12]], "industryl.hlp");

    module_graphic[sbut[13]] = load_graphic ("university-button.csi");
    module_type[sbut[13]] = CST_UNIVERSITY;
    strcpy (module_help[sbut[13]], "university.hlp");

    module_graphic[sbut[14]] = load_graphic ("commune-button.csi");
    module_type[sbut[14]] = CST_COMMUNE_1;
    strcpy (module_help[sbut[14]], "commune.hlp");

    module_graphic[sbut[15]] = load_graphic ("oremine-button.csi");
    module_type[sbut[15]] = CST_OREMINE_1;
    strcpy (module_help[sbut[15]], "oremine.hlp");

    module_graphic[sbut[16]] = load_graphic ("tip-button.csi");
    module_type[sbut[16]] = CST_TIP_0;
    strcpy (module_help[sbut[16]], "tip.hlp");

    module_graphic[sbut[17]] = load_graphic ("port-button.csi");
    module_type[sbut[17]] = CST_EX_PORT;
    strcpy (module_help[sbut[17]], "port.hlp");

    module_graphic[sbut[18]] = load_graphic ("industryh-button.csi");
    module_type[sbut[18]] = CST_INDUSTRY_H_C;
    strcpy (module_help[sbut[18]], "industryh.hlp");

    module_graphic[sbut[19]] = load_graphic ("parkland-button.csi");
    module_type[sbut[19]] = CST_PARKLAND_PLANE;
    strcpy (module_help[sbut[19]], "park.hlp");

    module_graphic[sbut[20]] = load_graphic ("recycle-button.csi");
    module_type[sbut[20]] = CST_RECYCLE;
    strcpy (module_help[sbut[20]], "recycle.hlp");

    module_graphic[sbut[21]] = load_graphic ("water-button.csi");
    module_type[sbut[21]] = CST_WATER;
    strcpy (module_help[sbut[21]], "river.hlp");

    module_graphic[sbut[22]] = load_graphic ("health-button.csi");
    module_type[sbut[22]] = CST_HEALTH;
    strcpy (module_help[sbut[22]], "health.hlp");

    module_graphic[sbut[23]] = load_graphic ("rocket-button.csi");
    module_type[sbut[23]] = CST_ROCKET_1;
    strcpy (module_help[sbut[23]], "rocket.hlp");

    module_graphic[sbut[24]] = load_graphic ("windmill-button.csi");
    module_type[sbut[24]] = CST_WINDMILL_1_R;
    strcpy (module_help[sbut[24]], "windmill.hlp");

    module_graphic[sbut[25]] = load_graphic ("monument-button.csi");
    module_type[sbut[25]] = CST_MONUMENT_0;
    strcpy (module_help[sbut[25]], "monument.hlp");

    module_graphic[sbut[26]] = load_graphic ("school-button.csi");
    module_type[sbut[26]] = CST_SCHOOL;
    strcpy (module_help[sbut[26]], "school.hlp");

    module_graphic[sbut[27]] = load_graphic ("blacksmith-button.csi");
    module_type[sbut[27]] = CST_BLACKSMITH_0;
    strcpy (module_help[sbut[27]], "blacksmith.hlp");

    module_graphic[sbut[28]] = load_graphic ("mill-button.csi");
    module_type[sbut[28]] = CST_MILL_0;
    strcpy (module_help[sbut[28]], "mill.hlp");

    module_graphic[sbut[29]] = load_graphic ("pottery-button.csi");
    module_type[sbut[29]] = CST_POTTERY_0;
    strcpy (module_help[sbut[29]], "pottery.hlp");

    module_graphic[sbut[30]] = load_graphic ("firestation-button.csi");
    module_type[sbut[30]] = CST_FIRESTATION_1;
    strcpy (module_help[sbut[30]], "firestation.hlp");

    module_graphic[sbut[31]] = load_graphic ("cricket-button.csi");
    module_type[sbut[31]] = CST_CRICKET_1;
    strcpy (module_help[sbut[31]], "cricket.hlp");



    /* disable all the buttons */
    for (i = 0; i < NUMOF_MODULES; i++) {
	module_tflag[i] = 0;
    }

    /* select track (which will be enabled later) */
#if defined (commentout)
    selected_module_type = CST_TRACK_LR;
    selected_module_cost = GROUP_TRACK_COST;
    selected_module_group = get_group_of_type(selected_module_type);
#endif
    old_selected_module = sbut[7];
    /* GCS: Move to later in initialization because I don't want to draw_main_window_box() yet */
#if defined (commentout)
    set_selected_module (CST_TRACK_LR);
#endif
}
void
draw_help_page (char *helppage)
{
    Rect* mw = &scr.main_win;
    char *helppage_full, *helppage_short;
    int i, y;
    FILE *inf;
    char help_line[MAX_HELP_LINE];

    /* In ask-dir page if user presses "yes" create directory in main loop */
#if defined (commentout)
    if ((strcmp (helppage, "opening.hlp") == 0)
	    && (strcmp (help_button_history[help_history_count - 1],
	    "ask-dir.hlp") == 0)) {
	make_dir_ok_flag = 1;
    }
#endif

    /* Return pages have arguments.  It is always true that "-2" means "Out" 
       and "-1" means "Back".  Semantics for other arguments depend upon
       the name of the source page (e.g. load game or choose residence). 
       Most of the times (except "Back"), this will exit the help system. */
    if (strncmp (helppage, "return", 6) == 0) {
	sscanf (&(helppage[6]), "%d", &help_return_val);

	/* If "Back" was clicked */
	if (help_return_val == -1 && help_history_count > 1) {
	    strcpy (helppage, help_button_history[help_history_count - 2]);
	    help_history_count -= 2;
	    goto continue_with_help;
	}

	/* XXX: WCK: residential selection is really ugly */
	if (help_history_count > 0 &&
	    strcmp (help_button_history[help_history_count - 1],
		    "res.tmp") == 0)
	{
	    switch (help_return_val) {
	    case (-2):
	    case (-1):
	    case (0):
#if defined (commentout)
	    case (1):
		selected_module_type = CST_RESIDENCE_LL;
		selected_module_cost = get_group_cost (GROUP_RESIDENCE_LL);
		break;
	    case (2):
		selected_module_type = CST_RESIDENCE_ML;
		selected_module_cost = get_group_cost (GROUP_RESIDENCE_ML);
		break;
	    case (3):
		selected_module_type = CST_RESIDENCE_HL;
		selected_module_cost = get_group_cost (GROUP_RESIDENCE_HL);
		break;
	    case (4):
		selected_module_type = CST_RESIDENCE_LH;
		selected_module_cost = get_group_cost (GROUP_RESIDENCE_LH);
		break;
	    case (5):
		selected_module_type = CST_RESIDENCE_MH;
		selected_module_cost = get_group_cost (GROUP_RESIDENCE_MH);
		break;
	    case (6):
		selected_module_type = CST_RESIDENCE_HH;
		selected_module_cost = get_group_cost (GROUP_RESIDENCE_HH);
		break;
#endif
	    case (1):
		set_selected_module (CST_RESIDENCE_LL);
		break;
	    case (2):
		set_selected_module (CST_RESIDENCE_ML);
		break;
	    case (3):
		set_selected_module (CST_RESIDENCE_HL);
		break;
	    case (4):
		set_selected_module (CST_RESIDENCE_LH);
		break;
	    case (5):
		set_selected_module (CST_RESIDENCE_MH);
		break;
	    case (6):
		set_selected_module (CST_RESIDENCE_HH);
		break;
	    }
	}
	else if (help_history_count > 0 &&
		 strcmp (help_button_history[help_history_count - 1],
			 "menu.hlp") == 0)
	{
	    switch (help_return_val) {
	    case 1:
		save_flag = 1;
		break;
	    case 2:
		prefs_flag = 1;
		break;
	    case 3:
		quit_flag = 1;
		break;
	    }
	}
	else if (help_history_count > 0 && 
		 strcmp (help_button_history[help_history_count - 1],
			 "opening.hlp") == 0)
	{
	    switch (help_return_val)
	    {
	    case (-2):
	    case (-1):
	    case (0):
		/* Random villiage */
		new_city (&main_screen_originx, &main_screen_originy, 1);
		adjust_main_origin (main_screen_originx,main_screen_originy,0);
		break;
	    case (1):
		/* Bare board */
		new_city (&main_screen_originx, &main_screen_originy, 0);
		adjust_main_origin (main_screen_originx,main_screen_originy,0);
		break;
	    case (2):
		/* Network start */
		network_flag = 1;
		break;
	    }
	}
	else if (help_history_count > 0 && 
		 strcmp (help_button_history[help_history_count - 1],
			 "newgame.hlp") == 0)
	{
	    switch (help_return_val)
	    {
	    case (0):
		/* Random villiage */
		new_city (&main_screen_originx, &main_screen_originy, 1);
		adjust_main_origin (main_screen_originx,main_screen_originy,0);
		break;
	    case (1):
		/* Bare board */
		new_city (&main_screen_originx, &main_screen_originy, 0);
		adjust_main_origin (main_screen_originx,main_screen_originy,0);
		break;
	    case (2):
		/* Network start */
		network_flag = 1;
		break;
	    }
	}
	else if (help_history_count > 0 &&
		 strcmp (help_button_history[help_history_count - 1],
			 "openload.hlp") == 0)
	{
	    switch (help_return_val)
	    {
	    case (-2):
	    case (-1):
	    case (0):
		new_city (&main_screen_originx, &main_screen_originy, 1);
		adjust_main_origin (main_screen_originx,main_screen_originy,0);
		break;
	    case (1):
		redraw_mouse ();
		load_opening_city ("good_times.scn");
		adjust_main_origin (main_screen_originx,main_screen_originy,0);
		hide_mouse ();
		break;
	    case (2):
		load_opening_city ("bad_times.scn");
		adjust_main_origin (main_screen_originx,main_screen_originy,0);
		break;
	    case (9):
		load_flag = 1;
		break;
	    }
	}
	else if (help_history_count > 0 &&
		 strcmp (help_button_history[help_history_count - 1],
			 "loadgame.hlp") == 0)
	{
	    switch (help_return_val)
	    {
	    case (1):
		redraw_mouse ();
		load_opening_city ("good_times.scn");
		adjust_main_origin (main_screen_originx,main_screen_originy,0);
		hide_mouse ();
		break;
	    case (2):
		load_opening_city ("bad_times.scn");
		adjust_main_origin (main_screen_originx,main_screen_originy,0);
		break;
	    case (9):
		load_flag = 1;
		break;
	    }
	}
#if defined (commentout)
	else if (help_history_count > 0 &&
		 strcmp (help_button_history[help_history_count - 1],
			 "ask-dir.hlp") == 0)
	{
	    if (help_return_val == 1) {
		/* Clicking "no" means no directory is created */
		do_error (_("Sorry, lincity cannot run without this directory.  Exiting."));
	    } else if (help_return_val == -2) {
		/* Clicking "out" means we want to create directory,
		   and then go to opening screen. */
		/* Warning: Note that "opening.hlp" is the same length
		   as "ask-dir.hlp". */
		make_dir_ok_flag = 1;
	        strcpy (helppage, "opening.hlp");
		goto continue_with_help;
	    }
	}
#endif

	block_help_exit = 0;
	help_flag = 0;

	/* GCS Remove overlay  */
	if (main_screen_flag == MAIN_SCREEN_EQUALS_MINI) {
	    main_screen_flag = MAIN_SCREEN_NORMAL_FLAG;
	}
	
	/* Fix origin */
#ifdef USE_EXPANDED_FONT
	Fgl_setwritemode (WRITEMODE_OVERWRITE | FONT_EXPANDED);
#else
	Fgl_setfontcolors (TEXT_BG_COLOUR, TEXT_FG_COLOUR);
#endif
	refresh_main_screen ();
	return;
    }

 continue_with_help:
    /* This buffer is just a copy of helppage.  Sometimes helppage is an 
       entry within help_button_s[], which gets overwritten when the page 
       is parsed. */
    if ((helppage_short = (char*) malloc (strlen(helppage) + 1)) == 0) {
	malloc_failure ();
    }
    strcpy (helppage_short, helppage);

    /* Right click on mini-screen */
    if (strncmp (helppage, "mini-screen.hlp", 15) == 0) {
	draw_big_mini_screen ();
    } else if (strncmp (helppage, "mini-in-main.hlp", 17) == 0) {
	/* do nothing */
    } else {
	/* This buffer is for the full path of the help file.
	   The file might be either in the help directory (most cases),
	   or in the temp directory (dynamically created pages). */
	if ((helppage_full = (char *) malloc (lc_save_dir_len 
					      + strlen (help_path) 
					      + strlen(helppage) + 2)) == 0) {
	    malloc_failure ();
	}

	/* Open the file */
	sprintf (helppage_full, "%s%s", help_path, helppage);
	if ((inf = fopen (helppage_full, "r")) == 0) {
	    sprintf (helppage_full, "%s%c%s", lc_save_dir, 
		     PATH_SLASH, helppage);
	    if ((inf = fopen (helppage_full, "r")) == 0) {
		sprintf (helppage_full, "%s%s", help_path, HELPERRORPAGE);
		if ((inf = fopen (helppage_full, "r")) == 0)
		    do_error ("Help error");
	    }
	}

	/* Parse and render help file */
	numof_help_buttons = 0;
	Fgl_fillbox (mw->x, mw->y, mw->w, mw->h, HELPBACKGROUNDCOLOUR);
	while (feof (inf) == 0) {
	    if (fgets (help_line, MAX_HELP_LINE, inf) == 0)
		break;
	    undosify_string (help_line);  /* GCS testing... */
	    parse_helpline (help_line);
	}
	fclose (inf);

	/* For ask-dir, we add path info */
	if (strncmp (helppage_short, "ask-dir.hlp", 11) == 0) {
	    parse_helpline ("tcolour 0 255");
	    y = 100;
	    for (i = 0; i < askdir_lines; i++) {
		sprintf (help_line, "text -1 %d %s", y, askdir_path[i]);
		parse_helpline (help_line);
		y += 14;
	    }
	}
	free (helppage_full);
    }

    /* At this point, most of the page has been rendered.  Now we have 
       to draw in the "BACK" and "OUT" buttons.  */
    if (help_history_count > 0) {
	parse_helpline ("tcolour 122 153");
	/* TRANSLATOR: Only translate "BACK" */
	parse_helpline (_("tbutton 4 387 return-1 BACK"));
    }
    parse_helpline ("tcolour 188 153");
    /* TRANSLATOR: Only translate "OUT" */
    parse_helpline (_("tbutton 370 387 return-2 OUT"));
    parse_helpline ("tcolour -1 -1");

    /* Add help page to history.  If history is going to overflow, 
       throw out oldest page.  */
    strcpy (help_button_history[help_history_count], helppage_short);
    help_history_count++;
    if (help_history_count >= MAX_HELP_HISTORY) {
	for (i = 0; i < (MAX_HELP_HISTORY - 1); i++)
	    strcpy (help_button_history[i], help_button_history[i + 1]);
	help_history_count--;
    }

    free (helppage_short);
}