/************************************************************************** ... **************************************************************************/ struct happiness_dlg *create_happiness_box(struct city *pcity, struct fcwin_box *hbox, HWND win) { int i; HDC hdc; struct happiness_dlg *dlg; struct fcwin_box *vbox; vbox=fcwin_vbox_new(win,FALSE); fcwin_box_add_groupbox(hbox,_("Happiness"),vbox,0, TRUE,TRUE,0); dlg=fc_malloc(sizeof(struct happiness_dlg)); dlg->win=win; dlg->pcity=pcity; for(i=0;i<NUM_HAPPINESS_MODIFIERS;i++) { fcwin_box_add_generic(vbox,bmp_row_minsize,bmp_row_setsize,NULL, &(dlg->mod_bmp_pos[i]),FALSE,FALSE,0); dlg->mod_label[i]=fcwin_box_add_static(vbox," ",0,SS_LEFT, FALSE,FALSE,5); } hdc=GetDC(win); for(i=0;i<NUM_HAPPINESS_MODIFIERS;i++) { dlg->mod_bmp[i]= CreateCompatibleBitmap(hdc, HAPPINESS_PIX_WIDTH*tileset_small_sprite_width(tileset), tileset_small_sprite_height(tileset)); } ReleaseDC(win,hdc); return dlg; }
/************************************************************************** ... **************************************************************************/ static void refresh_happiness_bitmap(HBITMAP bmp, struct city *pcity, enum citizen_feeling index) { enum citizen_category citizens[MAX_CITY_SIZE]; RECT rc; int i; int num_citizens = get_city_citizen_types(pcity, index, citizens); int pix_width = HAPPINESS_PIX_WIDTH * tileset_small_sprite_width(tileset); int offset = MIN(tileset_small_sprite_width(tileset), pix_width / num_citizens); /* int true_pix_width = (num_citizens - 1) * offset + tileset_small_sprite_width(tileset); */ HDC hdc = CreateCompatibleDC(NULL); HBITMAP old=SelectObject(hdc,bmp); rc.left=0; rc.top=0; rc.right=pix_width; rc.bottom=tileset_small_sprite_height(tileset); FillRect(hdc,&rc,(HBRUSH)GetClassLong(root_window,GCL_HBRBACKGROUND)); for (i = 0; i < num_citizens; i++) { draw_sprite(get_citizen_sprite(tileset, citizens[i], i, pcity), hdc, i * offset, 0); } SelectObject(hdc,old); DeleteDC(hdc); }
void repaint_happiness_box(struct happiness_dlg *dlg, HDC hdc) { int i; HDC hdcsrc; HBITMAP old; hdcsrc=CreateCompatibleDC(hdc); for(i=0;i<NUM_HAPPINESS_MODIFIERS;i++) { old=SelectObject(hdcsrc,dlg->mod_bmp[i]); BitBlt(hdc,dlg->mod_bmp_pos[i].x,dlg->mod_bmp_pos[i].y, HAPPINESS_PIX_WIDTH*tileset_small_sprite_width(tileset), tileset_small_sprite_height(tileset),hdcsrc,0,0,SRCCOPY); SelectObject(hdcsrc,old); } DeleteDC(hdcsrc); }
/************************************************************************** FIXME: For now only two food, one shield and two masks can be drawn per unit, the proper way to do this is probably something like what Civ II does. (One food/shield/mask drawn N times, possibly one top of itself. -- SKi **************************************************************************/ void put_unit_pixmap_city_overlays(struct unit *punit, Pixmap pm, int *upkeep_cost, int happy_cost) { struct canvas store = {pm}; /* wipe the slate clean */ XSetForeground(display, fill_bg_gc, get_color(tileset, COLOR_MAPVIEW_CITYTEXT)->color.pixel); XFillRectangle(display, pm, fill_bg_gc, 0, tileset_tile_width(tileset), tileset_tile_height(tileset), tileset_tile_height(tileset) + tileset_small_sprite_height(tileset)); put_unit_city_overlays(punit, &store, 0, tileset_tile_height(tileset), upkeep_cost, happy_cost); }
/************************************************************************** ... **************************************************************************/ void setup_widgets(void) { long i; int econ_label_count=10, econ_label_space=1; main_form = XtVaCreateManagedWidget("mainform", formWidgetClass, toplevel, NULL); menu_form = XtVaCreateManagedWidget("menuform", formWidgetClass, main_form, NULL); setup_menus(menu_form); /* main_vpane= XtVaCreateManagedWidget("mainvpane", panedWidgetClass, main_form, NULL); below_menu_form = XtVaCreateManagedWidget("belowmenuform", formWidgetClass, main_vpane, NULL); */ below_menu_form = XtVaCreateManagedWidget("belowmenuform", formWidgetClass, main_form, NULL); left_column_form = XtVaCreateManagedWidget("leftcolumnform", formWidgetClass, below_menu_form, NULL); map_form = XtVaCreateManagedWidget("mapform", formWidgetClass, below_menu_form, NULL); bottom_form = XtVaCreateManagedWidget("bottomform", formWidgetClass, /*main_vpane,*/ main_form, NULL); overview_canvas = XtVaCreateManagedWidget("overviewcanvas", xfwfcanvasWidgetClass, left_column_form, "exposeProc", (XtArgVal)overview_canvas_expose, "exposeProcData", (XtArgVal)NULL, NULL); info_command = XtVaCreateManagedWidget("infocommand", commandWidgetClass, left_column_form, XtNfromVert, (XtArgVal)overview_canvas, NULL); /* Don't put the citizens in here yet because not loaded yet */ for(i=0;i<econ_label_count;i++) { econ_label[i] = XtVaCreateManagedWidget("econlabels", commandWidgetClass, left_column_form, XtNwidth, tileset_small_sprite_width(tileset), XtNheight, tileset_small_sprite_height(tileset), i?XtNfromHoriz:NULL, i?econ_label[i-1]:NULL, XtNhorizDistance, econ_label_space, NULL); } bulb_label = XtVaCreateManagedWidget("bulblabel", labelWidgetClass, left_column_form, NULL); sun_label = XtVaCreateManagedWidget("sunlabel", labelWidgetClass, left_column_form, NULL); flake_label = XtVaCreateManagedWidget("flakelabel", labelWidgetClass, left_column_form, NULL); government_label = XtVaCreateManagedWidget("governmentlabel", labelWidgetClass, left_column_form, NULL); timeout_label = XtVaCreateManagedWidget("timeoutlabel", labelWidgetClass, left_column_form, NULL); turn_done_button = I_LW(XtVaCreateManagedWidget("turndonebutton", commandWidgetClass, left_column_form, XtNwidth, econ_label_count* (tileset_small_sprite_width(tileset)+econ_label_space), NULL)); unit_info_label = XtVaCreateManagedWidget("unitinfolabel", labelWidgetClass, left_column_form, NULL); unit_pix_canvas = XtVaCreateManagedWidget("unitpixcanvas", pixcommWidgetClass, left_column_form, XtNwidth, tileset_full_tile_width(tileset), XtNheight, tileset_full_tile_height(tileset), NULL); for(i=0; i<num_units_below; i++) { char unit_below_name[32]; my_snprintf(unit_below_name, sizeof(unit_below_name), "unitbelowcanvas%ld", i); unit_below_canvas[i] = XtVaCreateManagedWidget(unit_below_name, pixcommWidgetClass, left_column_form, XtNwidth, tileset_full_tile_width(tileset), XtNheight, tileset_full_tile_height(tileset), NULL); XtAddCallback(unit_below_canvas[i], XtNcallback, unit_icon_callback, (XtPointer)i); } more_arrow_label = XtVaCreateManagedWidget("morearrowlabel", labelWidgetClass, left_column_form, XtNfromHoriz, (XtArgVal)unit_below_canvas[num_units_below-1], NULL); map_vertical_scrollbar = XtVaCreateManagedWidget("mapvertiscrbar", scrollbarWidgetClass, map_form, NULL); map_canvas = XtVaCreateManagedWidget("mapcanvas", xfwfcanvasWidgetClass, map_form, "exposeProc", (XtArgVal)map_canvas_expose, "exposeProcData", (XtArgVal)NULL, NULL); map_horizontal_scrollbar = XtVaCreateManagedWidget("maphorizscrbar", scrollbarWidgetClass, map_form, NULL); outputwindow_text= I_SW(XtVaCreateManagedWidget("outputwindowtext", asciiTextWidgetClass, bottom_form, NULL)); inputline_text= XtVaCreateManagedWidget("inputlinetext", asciiTextWidgetClass, bottom_form, NULL); }
/************************************************************************** ... **************************************************************************/ static void bmp_row_minsize(POINT *minsize, void *data) { minsize->x=HAPPINESS_PIX_WIDTH*tileset_small_sprite_width(tileset); minsize->y=tileset_small_sprite_height(tileset); }